пишете във формат на масив във fortran

Опитвам се да напиша изходен файл.dat с матричен формат nxn.

Пиша кода, но изходът е колона със стойност f.

Сега проблемът е: как мога да променя изходния формат на файла за запис?

от: 1 2 4 5 ...

to: 1,2,3,4 // 5,6,8,.. //

program eccen
    implicit none
    integer, parameter:: grid=800
    integer::i,j,k,n,m
    real*8,allocatable::f(:,:)
    real*8::xx(grid),yy(grid),mval,Mxval
    real*8,allocatable::x(:),y(:)

    open(10,file='3d_disk.txt')
    n=0
        DO
                READ(10,*,END=100)
                n=n+1
        END DO

 100     continue
        rewind(10)

    allocate(x(n),y(n))

    do i=1, n
        read(10,*) x(i),y(i)
    end do


    mval=-20.
    Mxval=20.
    do i=1, grid
        xx(i) = mval + ((Mxval - mval)*(i-1))/(grid-1)
        yy(i) = mval + ((Mxval - mval)*(i-1))/(grid-1)
    end do

    open(20,file='3d_map.dat')

    allocate(f(n,n))
    f=0
    do i=1,grid
        do j=1,grid
            m=0.
            do k=1, n
                if (x(k) > xx(i) .and. x(k) < xx(i+1) .and. &
                 & y(k) > yy(j) .and. y(k) < yy(j+1)) then  
                    m=m+1 ! CONTA IL NUMERO DI PARTICELLE
                end if
            end do
            f(i,j)=float(m+1)

Предполагам, че модификацията трябва да е тук от това:

                write(20,*) f(i,j)
            end do
            write(20,*)
     print *,i
        end do    
end program eccen

to:

    do i=1,grid
      do j=1,grid
        write(20,*) f(i,j)
      end do
    end do

end do
            write(20,*)
     print *,i
        end do

 end program eccen

person Panichi Pattumeros PapaCastoro    schedule 20.05.2013    source източник


Отговори (1)


Това твърдение

write(20,*) f(i,j)

ще запише стойността на f(i,j), след което ще премине към следващия ред, така че файлът, който получавате, е точно това, което кодът ви определя. Ако искате файлът да съдържа n реда всеки с n стойности, опитайте

write(20,*) f(i,:)

което би трябвало да направи добър удар при записването на целия ред i от масива на един ред в изходния файл. Разбира се, това прави вашия цикъл над j излишен, така че можете да го премахнете.

person High Performance Mark    schedule 20.05.2013
comment
Ще трябва да използвате изричен формат (вместо насочен към списък), за да избегнете вмъкването на произволни прекъсвания на редове от процесора (започване на нови записи), където сметне за добре, докато изпълнява конкретен оператор за запис. - person IanH; 21.05.2013