我试图在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
答案 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