包含多列的单个输出文件

时间:2012-03-28 04:23:26

标签: fortran90

我试图在fortran中对此problem进行编码。输出文件包含两列结果。我很难修改我的代码(下面)以获得包含nt列和nx行的gnuplot-ready输出文件。有谁能够帮我?谢谢!

PROGRAM odlc
IMPLICIT NONE
INTEGER::i,it,nx,nt,k,ierr
DOUBLE PRECISION::dx,dt,c
DOUBLE PRECISION,DIMENSION(2000)::u,un
ierr=0
nx=20
nt=50
dt=0.01
c=1.0
dx=2./(nx-1.)
!initial condition
DO i = 1,nx
    IF(i*dx>=0.5 .and. i*dx<=1) THEN
    u(i) = 2    
    ELSE
    u(i)=1
    ENDIF   
ENDDO
!Finite Difference
OPEN(UNIT=200,FILE='tab2.txt',STATUS='REPLACE',ACTION='WRITE',IOSTAT=ierr)
  DO it=1,nt
    DO k=1,nx
    un(k)=u(k)
    ENDDO 
        DO i=2,nx-1
        u(i)=un(i)-c*dt/dx*(un(i)-un(i-1))
        ENDDO
            DO i=1,nx
            WRITE(200,'(I7,F10.2)')i,u(i)
            ENDDO
ENDDO
CLOSE(UNIT=200)
END

1 个答案:

答案 0 :(得分:1)

我不是100%确定它正是你想要的,但是你走了:

声明

CHARACTER(len=32)::fmt

并像这样初始化

WRITE(fmt,*)'(',nx,'F10.2)'

这只是创建一个格式字符串,它写入一行nx实数。

然后替换

DO i=1,nx
WRITE(200,'(I7,F10.2)')i,u(i)
ENDDO

通过

    WRITE(200,fmt) (/ (u(i), i=1,nx) /)

现在,在tab2.txt文件中,您将获得nt行和nx列。


更新后,这里是(略微缩短的)代码,可以执行您想要的操作:

PROGRAM odlc
  IMPLICIT NONE
  INTEGER::i,it
  INTEGER,PARAMETER::nx=20,nt=50
  DOUBLE PRECISION,PARAMETER::dx=2./(nx-1.),dt=0.01,c=1.0
  DOUBLE PRECISION,DIMENSION(nt,nx)::u
  CHARACTER(len=32)::fmt
  WRITE(fmt,*)'(I3,',nt,'F5.2)'
  !initial condition                                                                                                                                                                                                                                                     
  DO i = 1,nx
     IF(i*dx>=0.5 .and. i*dx<=1) THEN
        u(1,i) = 2
     ELSE
        u(1,i)=1
     ENDIF
  ENDDO
  !Finite Difference                                                                                                                                                                                                                                                     
  DO it=2,nt
     DO i=2,nx-1
        u(it,i)=u(it-1,i)-c*dt/dx*(u(it-1,i)-u(it-1,i-1))
     ENDDO
  ENDDO
  !Write to file                                                                                                                                                                                                                                                         
  OPEN(UNIT=200,FILE='tab2.txt',STATUS='REPLACE',ACTION='WRITE')
  DO i=1,nx
     WRITE(200,fmt)REAL(i*(2./(nx-1.))),u(:,i)
  ENDDO
  CLOSE(UNIT=200)
END PROGRAM odlc