Fortran Coder

标题: 在循环语句中分别计算上千次,需要将数据输出到文本文... [打印本页]

作者: 周先生    时间: 2019-11-9 13:48
标题: 在循环语句中分别计算上千次,需要将数据输出到文本文...
请问大神们,怎样把计算数据直接输出到文本或指定文件。

作者: li913    时间: 2019-11-9 15:43
看书,文件操作部分。
[Fortran] 纯文本查看 复制代码
program test
open(10,file='out.txt')
do i=1,n
write(10,*) i
end do
close(10)
end program

作者: 周先生    时间: 2019-11-9 17:02
li913 发表于 2019-11-9 15:43
看书,文件操作部分。
program test
open(10,file='out.txt')

前辈你好,如果将你所回答的输出为文件的代码正确加入具体程序在怎么加,下面是我具体程序;如能帮助,大恩大德,没齿难忘。
[Fortran] 纯文本查看 复制代码
IMPLICIT NONE 
        REAL*8 N1,N2,MU1,MU2,EPS1,EPS2
        REAL*8 ETA1,ETA2,C11,C12,C21,C22
        REAL*8 LAM,D,PI,C,OME
      REAL*8 K1,K2
        REAL*8 R,T,A
        COMPLEX*16 i,B11,B12,B21,B22,T11,T12,T21,T22
        PARAMETER(PI=3.14159D0)
        PARAMETER(C=3.99792D8)
        N1=1.00D0
      N2=1.50D0
      MU1=1.00D0
      MU2=1.00D0
        i=(0,1)
        EPS1=(N1)**2
        EPS2=(N2)**2
        ETA1=DSQRT(EPS1/MU1)*N1
        ETA2=DSQRT(EPS2/MU2)*N2
        C11=(ETA1+ETA2)/(2*ETA1)
        C12=(ETA1-ETA2)/(2*ETA1)
        C21=(ETA1-ETA2)/(2*ETA1)
      C22=(ETA1+ETA2)/(2*ETA1)
      LAM=3.00D-7
        DO LAM = 3.00D-7,12.00D-7,0.01D-7
                D=2.00D-7
          OME=2*PI*C/LAM
                K1=(OME*N1)/C
                K2=(OME*N2)/C
                B11=CDEXP(i*K1*D)*DEXP(-K2*D)
                B12=(0,0)
                B21=(0,0)
                B22=CDEXP(-i*K1*D)*DEXP(K2*D)
                T11=C11*B11+C12*B21
                T12=C11*B12+C12*B22
                T21=C21*B11+C22*B21
                T22=C21*B12+C22*B22
                R=(CDABS(-T12/T22))**2
                T=(CDABS(T11-(T12*T21)/T22))**2
                A=1-R-T
        WRITE(*,100)R,T,A
100        FORMAT(1X,F8.3,2X,F8.3,2X,F8.3)
      END DO
        WRITE(*,*)'FINISH'
        END

作者: 周先生    时间: 2019-11-9 17:03
li913 发表于 2019-11-9 15:43
看书,文件操作部分。
[mw_shl_code=fortran,true]program test
open(10,file='out.txt')

我是FORTRAN77,书上的我看了试不成功。

作者: fcode    时间: 2019-11-10 10:35
注意 !/////======= 注释的行
[Fortran] 纯文本查看 复制代码
IMPLICIT NONE 
        REAL*8 N1,N2,MU1,MU2,EPS1,EPS2
        REAL*8 ETA1,ETA2,C11,C12,C21,C22
        REAL*8 LAM,D,PI,C,OME
      REAL*8 K1,K2
        REAL*8 R,T,A
        COMPLEX*16 i,B11,B12,B21,B22,T11,T12,T21,T22
        PARAMETER(PI=3.14159D0)
        PARAMETER(C=3.99792D8)
        N1=1.00D0
      N2=1.50D0
      MU1=1.00D0
      MU2=1.00D0
        i=(0,1)
        EPS1=(N1)**2
        EPS2=(N2)**2
        ETA1=DSQRT(EPS1/MU1)*N1
        ETA2=DSQRT(EPS2/MU2)*N2
        C11=(ETA1+ETA2)/(2*ETA1)
        C12=(ETA1-ETA2)/(2*ETA1)
        C21=(ETA1-ETA2)/(2*ETA1)
      C22=(ETA1+ETA2)/(2*ETA1)
      LAM=3.00D-7
      open(12,file='out.txt')!/////=======
        DO LAM = 3.00D-7,12.00D-7,0.01D-7
                D=2.00D-7
          OME=2*PI*C/LAM
                K1=(OME*N1)/C
                K2=(OME*N2)/C
                B11=CDEXP(i*K1*D)*DEXP(-K2*D)
                B12=(0,0)
                B21=(0,0)
                B22=CDEXP(-i*K1*D)*DEXP(K2*D)
                T11=C11*B11+C12*B21
                T12=C11*B12+C12*B22
                T21=C21*B11+C22*B21
                T22=C21*B12+C22*B22
                R=(CDABS(-T12/T22))**2
                T=(CDABS(T11-(T12*T21)/T22))**2
                A=1-R-T
        WRITE(12,100)R,T,A !/////=======
100        FORMAT(1X,F8.3,2X,F8.3,2X,F8.3)
      END DO
      close(12) !/////=======
        WRITE(*,*)'FINISH'
        END

作者: 周先生    时间: 2019-11-10 12:54
fcode 发表于 2019-11-10 10:35
注意 !/////======= 注释的行
[mw_shl_code=fortran,true]IMPLICIT NONE
        REAL*8 N1,N2,MU1,MU2,EP ...

感谢前辈。我改试了,加了一行在屏幕输出,发现屏幕输出结果与输出文本中的数据不一致(一共输出三列数据,第一列R一样,到第二三列的T,A不一样)这是什么原因,怎么修改?

作者: fcode    时间: 2019-11-10 13:06
给出你修改后的代码
作者: 周先生    时间: 2019-11-10 15:40
fcode 发表于 2019-11-10 13:06
给出你修改后的代码

就加了一行屏幕输出,屏幕输出和文本居然不一样
[Fortran] 纯文本查看 复制代码
IMPLICIT NONE 
        REAL*8 N1,N2,MU1,MU2,EPS1,EPS2
        REAL*8 ETA1,ETA2,C11,C12,C21,C22
        REAL*8 LAM,D,PI,C,OME
      REAL*8 K1,K2
        REAL*8 R,T,A
        COMPLEX*16 i,B11,B12,B21,B22,T11,T12,T21,T22
        PARAMETER(PI=3.14159D0)
        PARAMETER(C=3.99792D8)
        N1=1.00D0
      N2=1.50D0
      MU1=1.00D0
      MU2=1.00D0
        i=(0,1)
        EPS1=(N1)**2
        EPS2=(N2)**2
        ETA1=DSQRT(EPS1/MU1)*N1
        ETA2=DSQRT(EPS2/MU2)*N2
        C11=(ETA1+ETA2)/(2*ETA1)
        C12=(ETA1-ETA2)/(2*ETA1)
        C21=(ETA1-ETA2)/(2*ETA1)
      C22=(ETA1+ETA2)/(2*ETA1)
      LAM=3.00D-7
      OPEN(12,FILE='out.txt')
        DO LAM = 3.00D-7,12.00D-7,0.01D-7
                D=2.00D-7
          OME=2*PI*C/LAM
                K1=(OME*N1)/C
                K2=(OME*N2)/C
                B11=CDEXP(i*K1*D)*DEXP(-K2*D)
                B12=(0,0)
                B21=(0,0)
                B22=CDEXP(-i*K1*D)*DEXP(K2*D)
                T11=C11*B11+C12*B21
                T12=C11*B12+C12*B22
                T21=C21*B11+C22*B21
                T22=C21*B12+C22*B22
                R=(CDABS(-T12/T22))**2
                T=(CDABS(T11-(T12*T21)/T22))**2
                A=1-R-T
        WRITE(*,100)R,T,A
        WRITE(12,100)R,T,A
100        FORMAT(1X,F8.3,2X,F8.3,2X,F8.3)
      END DO
      CLOSE(12)
        WRITE(*,*)'FINISH'
        END

作者: fcode    时间: 2019-11-10 17:15
我试了一下,是一样的。
如果你的不一样,可否告知你的屏幕输出和文件输出分别是什么?
(以最后十行为例)

在我这里,最后十行内容为:
    0.148     0.081     0.771
    0.148     0.081     0.771
    0.148     0.081     0.771
    0.148     0.081     0.771
    0.148     0.082     0.771
    0.148     0.082     0.770
    0.148     0.082     0.770
    0.148     0.082     0.770
    0.148     0.082     0.770
    0.148     0.083     0.769


作者: 周先生    时间: 2019-11-10 17:56
fcode 发表于 2019-11-10 17:15
我试了一下,是一样的。
如果你的不一样,可否告知你的屏幕输出和文件输出分别是什么?
(以最后十行为例) ...

后面部分的确是相同的,但是开始部分不一样
屏幕上是
0.148   0.029  0.823
文本是
0.148   0.000  0.852
作者: 周先生    时间: 2019-11-10 18:43
fcode 发表于 2019-11-10 17:15
我试了一下,是一样的。
如果你的不一样,可否告知你的屏幕输出和文件输出分别是什么?
(以最后十行为例) ...

我在输出中加了一列用来标记行数,发现本应输出300到1200的900行数据,但是屏幕上输出的结果只有900到1200的300给数据,文本中的确是从300到1200的900行数据,但仍然不知道什么原因导致的
作者: fcode    时间: 2019-11-11 22:08
windows的屏幕输出有缓存大小,满了之后,前面的就看不到了。
所以大量的输出,要用文件,而不能用(windows上的)屏幕输出。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2