Fortran Coder

标题: 写了一个程序,结果输出的数组是一个值,求赐教啊 [打印本页]

作者: renlu617    时间: 2015-8-20 15:02
标题: 写了一个程序,结果输出的数组是一个值,求赐教啊
[Fortran] 纯文本查看 复制代码
program solard
     implicit none
     REAL TMAX, TMIN, E, TTHIRTY
     INTEGER I, YEAR, DOY ,a
     INTEGER ,parameter:: ndays=730
     REAL  B,delta,sita,R,womiga0,womiga1,womiga2,womiga3
     REAL  tuo0,alfa,C,b0,PAI,FAI,PZ,P0,Tfmax,q1
     real b1,b2,I0,D
     real, allocatable::Q0(:)
     real, allocatable::Qh(:)
     real, allocatable::TTMAX(:)
!      NDAYS=730
       tuo0=0.87
       alfa=-0.000061
       C=1.5
       b0=0.031
       b1=0.201
       b2=0.185
       I0=1367.0
       D=86400
       PAI=3.14159
       FAI=38.33/(180*PAI)
       PZ=90810
       P0=101325
    DO I=1,NDAYS
     OPEN (UNIT = 9, FILE = '\B90V3\DAT\SOLARDFILE.DAT')
      rewind(9)
     READ (9, *) YEAR, DOY, TMAX, TMIN, E, TTHIRTY
     enddo
    Allocate( Q0( ndays ) )
    Allocate( Qh( ndays ) )
    Allocate( TTMAX( ndays ) )
    DO I=1,NDAYS
    !TTHIRTY 30日平均温差
      delta=23.45*PAI/(180*sin(2*PAI*(284+i)/365))
      sita=2*PAI*i/365
      R=1.000109+0.033494*cos(sita)+0.001472*sin(sita)
      R=R+0.000768*cos(2*sita)+0.000079*sin(2*sita)
      womiga0=ABS(acos(-tan(delta)*tan(fai)))
      q1=womiga0*sin(fai)*sin(delta)+cos(fai)*cos(delta)*sin(womiga0)
      q0=q1*I0*D/(PAI*R*R)
      womiga3=0
        DO A=1,100
            womiga1=-womiga0+womiga0/100+womiga0*a/50
                womiga2=sin(fai)*sin(delta)+cos(fai)*cos(delta)*cos(womiga1)
                womiga3=womiga3+(womiga2*tuo0**(PZ/(P0*womiga2)))*womiga0/50
        ENDDO
        Ttmax=womiga3/(q0*2*PAI*R*R/I0/D)+alfa*e*1000;
       B=b0+b1*exp(-b2* TTHIRTY);
       Tfmax=1.0-0.9*exp(-B*(Tmax-Tmin)**(C));
       Qh=q0*Ttmax*Tfmax/1000000;
    ENDDO
     open(2,file='QH.dat')
       do I=1,ndays-1
            write(2,'(i4,2x,f15.1,f6.1,f15.1)') I,Q0(I),TTMAX(I),QH(I)
       enddo
    CLOSE(2)
    END


作者: renlu617    时间: 2015-8-20 15:02
就是数组都是一个值似乎计算了一遍
作者: vvt    时间: 2015-8-20 16:04
本帖最后由 vvt 于 2015-8-20 16:07 编辑

[Fortran] 纯文本查看 复制代码
    DO I=1,NDAYS
     OPEN (UNIT = 9, FILE = '\B90V3\DAT\SOLARDFILE.DAT')
      rewind(9)
     READ (9, *) YEAR, DOY, TMAX, TMIN, E, TTHIRTY
     enddo

这样没有意义。你读了 NDAYS 次第一行。所以每次结果都一样。

正确的做法是:
[Fortran] 纯文本查看 复制代码

OPEN (UNIT = 9, FILE = '\B90V3\DAT\SOLARDFILE.DAT')
DO I=1,NDAYS  
    !TTHIRTY 30日平均温差
     READ (9, *) YEAR, DOY, TMAX, TMIN, E, TTHIRTY
    ! 计算
END DO
Close( 9 )

作者: renlu617    时间: 2015-8-20 16:29
vvt 发表于 2015-8-20 16:04
    DO I=1,NDAYS
     OPEN (UNIT = 9, FILE = '\B90V3\DAT\SOLARDFILE.DAT')
...

[Fortran] 纯文本查看 复制代码
program solard
     implicit none
     REAL TMAX, TMIN, E, TTHIRTY
     INTEGER I, YEAR, DOY ,a
     INTEGER ,parameter:: ndays=730
     REAL  B,delta,sita,R,womiga0,womiga1,womiga2,womiga3
     REAL  tuo0,alfa,C,b0,PAI,FAI,PZ,P0,Tfmax,q1
     real b1,b2,I0,D
     real, allocatable::Q0(:)
     real, allocatable::Qh(:)
     real, allocatable::TTMAX(:)
!      NDAYS=730
       tuo0=0.87
       alfa=-0.000061
       C=1.5
       b0=0.031
       b1=0.201
       b2=0.185
       I0=1367.0
       D=86400
       PAI=3.14159
       FAI=38.33/(180*PAI)
       PZ=90810
       P0=101325
    !38.33是样地纬度
     OPEN (UNIT = 9, FILE = '\B90V3\DAT\SOLARDFILE.DAT')
     DO I=1,NDAYS
      rewind(9)
     READ (9, *) YEAR, DOY, TMAX, TMIN, E, TTHIRTY
     enddo
     close(9)
    Allocate( Q0( ndays ) )
    Allocate( Qh( ndays ) )
    Allocate( TTMAX( ndays ) )
    DO I=1,NDAYS
    !TTHIRTY 30日平均温差
      delta=23.45*PAI/(180*sin(2*PAI*(284+i)/365))
      sita=2*PAI*i/365
      R=1.000109+0.033494*cos(sita)+0.001472*sin(sita)
      R=R+0.000768*cos(2*sita)+0.000079*sin(2*sita)
      womiga0=ABS(acos(-tan(delta)*tan(fai)))
      q1=womiga0*sin(fai)*sin(delta)+cos(fai)*cos(delta)*sin(womiga0)
      q0=q1*I0*D/(PAI*R*R)
      womiga3=0
        DO A=1,100
            womiga1=-womiga0+womiga0/100+womiga0*a/50
                womiga2=sin(fai)*sin(delta)+cos(fai)*cos(delta)*cos(womiga1)
                womiga3=womiga3+(womiga2*tuo0**(PZ/(P0*womiga2)))*womiga0/50
        ENDDO
        Ttmax=womiga3/(q0*2*PAI*R*R/I0/D)+alfa*e*1000;
       B=b0+b1*exp(-b2* TTHIRTY);
       Tfmax=1.0-0.9*exp(-B*(Tmax-Tmin)**(C));
       Qh=q0*Ttmax*Tfmax/1000000;
    ENDDO
     open(2,file='QH.dat')
       do I=1,ndays-1
            write(2,'(i4,2x,f15.1,f6.1,f15.1)') I,Q0(I),TTMAX(I),QH(I)
       enddo
    CLOSE(2)
    END

按您说的改了,可是结果还是一样的
作者: vvt    时间: 2015-8-20 16:39
本帖最后由 vvt 于 2015-8-20 16:43 编辑

你改得不对

[Fortran] 纯文本查看 复制代码

program solard
     implicit none
     REAL TMAX, TMIN, E, TTHIRTY
     INTEGER I, YEAR, DOY ,a
     INTEGER ,parameter:: ndays=730
     REAL  B,delta,sita,R,womiga0,womiga1,womiga2,womiga3
     REAL  tuo0,alfa,C,b0,PAI,FAI,PZ,P0,Tfmax,q1
     real b1,b2,I0,D
     real, allocatable::Q0(:)
     real, allocatable::Qh(:)
     real, allocatable::TTMAX(:)
!      NDAYS=730
       tuo0=0.87
       alfa=-0.000061
       C=1.5
       b0=0.031
       b1=0.201
       b2=0.185
       I0=1367.0
       D=86400
       PAI=3.14159
       FAI=38.33/(180*PAI)
       PZ=90810
       P0=101325
    !!!DO I=1,NDAYS
     OPEN (UNIT = 9, FILE = '\B90V3\DAT\SOLARDFILE.DAT')
    !!  rewind(9)
    !! READ (9, *) YEAR, DOY, TMAX, TMIN, E, TTHIRTY
    !! enddo
    Allocate( Q0( ndays ) )
    Allocate( Qh( ndays ) )
    Allocate( TTMAX( ndays ) )
    DO I=1,NDAYS
    !TTHIRTY 30日平均温差
      READ (9, *) YEAR, DOY, TMAX, TMIN, E, TTHIRTY !////// 加到这里
      delta=23.45*PAI/(180*sin(2*PAI*(284+i)/365))
      sita=2*PAI*i/365
      R=1.000109+0.033494*cos(sita)+0.001472*sin(sita)
      R=R+0.000768*cos(2*sita)+0.000079*sin(2*sita)
      womiga0=ABS(acos(-tan(delta)*tan(fai)))
      q1=womiga0*sin(fai)*sin(delta)+cos(fai)*cos(delta)*sin(womiga0)
      q0(i)=q1*I0*D/(PAI*R*R)
      womiga3=0
        DO A=1,100
            womiga1=-womiga0+womiga0/100+womiga0*a/50
         womiga2=sin(fai)*sin(delta)+cos(fai)*cos(delta)*cos(womiga1)
         womiga3=womiga3+(womiga2*tuo0**(PZ/(P0*womiga2)))*womiga0/50
        ENDDO
        Ttmax(i)=womiga3/(q0(i)*2*PAI*R*R/I0/D)+alfa*e*1000;
       B=b0+b1*exp(-b2* TTHIRTY);
       Tfmax=1.0-0.9*exp(-B*(Tmax-Tmin)**(C));
       Qh(i)=q0(i)*Ttmax(i)*Tfmax/1000000;
    ENDDO
     open(2,file='QH.dat')
       do I=1,ndays-1
     write(2,'(i4,2x,f15.1,f6.1,f15.1)') I,Q0(I),TTMAX(I),QH(I)
       enddo
    CLOSE(2)
    END


作者: renlu617    时间: 2015-8-21 09:46
读不到那个位置是什么原因

微信截图_20150821095334.png (49.17 KB, 下载次数: 1)

微信截图_20150821095334.png

作者: renlu617    时间: 2015-8-21 10:15
vvt 发表于 2015-8-20 16:39
你改得不对

[mw_shl_code=fortran,true]

?可是你这样写读不出来啊
作者: wx_G5fH8Rhq    时间: 2015-8-21 10:16
开头自己声明
integer::ierror
character(len=80)::msg
自己改
read(9,*) 改成 read(9,*,iostat=ierror,iomsg=msg)  
后面加一行
if (ierror/=0) write(*,*) msg
报什么错误自己调
作者: fcode    时间: 2015-8-21 10:42
请给出数据文件(上传附件)
作者: renlu617    时间: 2015-8-21 10:47
数据文件

SOLARDFILE.dat

22.45 KB, 下载次数: 2


作者: vvt    时间: 2015-8-21 19:49
在我这里,并没有出现你截图中的 end-of-file 错误。而是浮点数错误。
究其原因,在于
womiga0 = abs(acos(-tan(delta)*tan(fai)))
此处的 tan(delta)*tan(fai) 无法保证在 [ -1 , 1 ] 区间内。当 delta 大于 -1.5049 时,tan(delta)*tan(fai) 的结果为 1.0288
至此,无法计算 acos
你可以在此句前面加上 write(*,*) delta,tan(delta),tan(delta)*tan(fai) 以便观察。

最后,对于这种运行时错误,建议你学会自行debug,可参考此文:http://debug.w.fcode.cn





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