Как правильно читать действительные и комплексные числа в Фортране? - PullRequest
1 голос
/ 12 ноября 2019

Предположим, у меня есть файл данных (fort.100), включающий в себя такие данные, как

2.34,          4.5
(23.1,0.3),    4.5
(3.1,0.3),    (3.2,1.0)
2.4,          (32.2,12.0)

как считать эти смешанные действительные и комплексные значения в комплексные переменные? Другими словами, следующий простой способ не работает в gfortran.

program readmixnum
implicit none
integer::i
complex::cdat(4,2)
do i=1, 4
read(100,*) cdat(i,1:2)
write(*,*) cdat(i,1:2)
end do
end program

На самом деле, мы можем назначить вещественное значение для комплексной переменной, но почему чтение реальных значений не может. Мне интересно, должно быть очень простое решение для этого.

1 Ответ

1 голос
/ 24 ноября 2019

Пожалуйста, попробуйте это как простое решение для вашей проблемы:

program readmixnum
implicit none
integer::i,st
character*256::line
real::rdat(4,2)
complex::cdat(4,2)
do i=1, 4
  read(100,'(A)',iostat=st) line
  read(line,*,iostat=st) rdat(i,:)
  cdat(i,:) = rdat(i,:)
  if (st /= 0) then
    read(line,*,iostat=st) rdat(i,1), cdat(i,2)
    cdat(i,1) = rdat(i,1)
    if (st /= 0) then
      read(line,*,iostat=st) cdat(i,1), rdat(i,2)
      cdat(i,2) = rdat(i,2)
      if (st /= 0) then
        read(line,*,iostat=st) cdat(i,:)
      endif
    endif
  endif
  write(*,*) cdat(i,1:2)
end do
end program

Требуется одна реальная матрица rdat с таким же рангом, что и у вашей сложной cdat. Одна строка входного файла fort.100 сохраняется в переменной line. Это предотвращает оператор backspace во время проверок числового формата.

Проверки числового формата выполняются с параметром iostat. Если это значение равно 0, то считывание прошло успешно и правильный формат числа. Задача состоит в том, чтобы опробовать все возможные комбинации.

Вывод:

 (  2.33999991    ,  0.00000000    ) (  4.50000000    ,  0.00000000    )
 (  23.1000004    , 0.300000012    ) (  4.50000000    ,  0.00000000    )
 (  3.09999990    , 0.300000012    ) (  3.20000005    ,  1.00000000    )
 (  2.40000010    ,  0.00000000    ) (  32.2000008    ,  12.0000000    )

для компиляции с gfortran версия 6.3.0 на компьютере с Linux.

Надеюсь, это поможет.

...