Как записать данные одномерного массива в следующий столбец в файле, используя Fortran 90? - PullRequest
0 голосов
/ 09 декабря 2018

По сути, у меня есть много одномерных массивов, которые мне нужно записать в один и тот же файл, но мне нужно, чтобы каждый массив находился в отдельном столбце, один за другим в указанном порядке.Я бы использовал цикл do, но некоторые массивы могут иметь больше значений, чем другие.Есть ли формат, который я могу использовать в операторе записи, который будет начинаться со следующего столбца вместо продолжения после предыдущего?

1 Ответ

0 голосов
/ 12 декабря 2018

По сути, вам нужен оператор 'write', который выяснит, находится ли записываемое значение за верхним пределом массива или нет, а затем запишет пробел, если верхний предел пересечен.Формат не может справиться с такими расследованиями.Я сомневаюсь, есть ли команда быстрого доступа к тому, что вам требуется.Один из способов сделать это - преобразовать массив в массив символов, и там, где вы выходите за рамки своего числового массива, просто оставьте его пустым.Ниже приведена реализация этой идеи.

module sub

contains

subroutine tovalue(num_array,dim,value_array)

implicit none
real*8,intent(in)::num_array(:)
integer,intent(in)::dim

character,intent(inout)::value_array*(*)(:,:)

integer::i,n

n = size(value_array,2)

do i=1,n
    if (i<size(num_array)) then
        write(value_array(dim,i),"(F6.1)") num_array(i)
    else
        write(value_array(dim,i),"(6X)")
    end if
end do

end subroutine

end module

Эту подпрограмму можно использовать следующим образом:

program test
use sub
implicit none
real*8::A(10),B(12),C(15)
integer::i,n

character,allocatable::values*6(:,:)

A = (/2,1,4,1,2,4,5,7,4,9/)
B = (/5,7,4,1,5,5,4,9,6,2,1,5/)
C = (/2,4,7,5,9,6,3,2,1,4,5,8,7,4,5/)

n = MAX(size(A),size(B),size(C))
allocate(values(3,n))

call tovalue(A,1,values)
call tovalue(B,2,values)
call tovalue(C,3,values)

print"(3A6)", values(:,1:n)

end program
...