Читать разделы массива в списке имен - PullRequest
3 голосов
/ 08 января 2020

Рассмотрим список имен, содержащий двумерные массивы. Например, следующая программа читает из файла "input.dat".

program test
  use :: iso_fortran_env

  implicit none

  integer :: ierr, unit, i
  real(kind=kind(0.0d0)), allocatable :: p(:, :)

  namelist /VAR_p/ p

  allocate(p(2,2))
  open(newunit=unit, file='input.dat', status='old', iostat=ierr)
  read(unit, nml=VAR_p, iostat=ierr)
  close(unit)

  do i = 1, size(p, 1)
     write(output_unit, '(F4.2," ",F4.2)') p(i,1), p(i,2)
  end do
end program test

Можно указать массив p в "input.dat" как

! input.dat
&VAR_p
p(1,1) = 1.2
p(1,2) = 3.2
p(2,1) = 1.0
p(2,2) = 0.0
/

. программа работает нормально. Тем не менее, я бы предпочел предоставлять массив p построчно. Что-то вроде

! input.dat
&VAR_p
p(1,:) = (1.2, 3.2)
p(2,:) = (1.30, 0.0)
/

Есть ли синтаксис для достижения этого?

1 Ответ

3 голосов
/ 08 января 2020

Действительно, существует синтаксис для указания секции массива в записи списка имен. Это близко к запрошенной форме, но не совсем.

В записи списка имен элемент (1.30, 0.0) указывает комплексное значение, а не конструктор массива (что означает, что обобщение на (1.3, 0.0, 1.2) не является допустимым значением ). Вместо этого вы просто хотите указать список значений: 1.3, 0.0:

&VAR_p
p(1,:) = 1.2, 3.2
p(2,:) = 1.30, 0.0
/

Существуют некоторые ограничения примечания:

  • указатель на левой стороне может быть массивом раздел, но он не может быть векторным индексом;
  • количество значений в правой части может быть не больше, чем количество элементов массива в левой части.

Во втором случае, если в правой части меньше значений, чем в левой части, значит, правая часть заполнена нулевыми значениями.

...