Fortran Coder

查看: 8776|回复: 4
打印 上一主题 下一主题

[数值问题] fortran运行结果不合理,求大佬们的帮忙

[复制链接]

1

帖子

1

主题

0

精华

新人

F 币
12 元
贡献
5 点
跳转到指定楼层
楼主
发表于 2020-1-21 09:40:56 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
01program enthalpy
02    implicit none
03!This program aim to calculate the enthalpy of h2s hydrate dissociation in the presence of water
04 
05 
06    double precision P,T,xh2s,n
07    double precision dPdT,H1,V,Hdiss,Hsolve
08 
09    print*,"please imput temperature (K)"
10    read*,T
11    print*,"please imput pressure (MPa)"
12    read*,P
13    print*,"please imput hydation number"
14    read*,n
15    print*,"please imput mole fraction of h2s in liquid"
16    read*,xh2s
17 
18    call dissenthalpy(Hdiss,T,dPdT,V)
19    call solveenthalpy(Hsolve,xh2s,n)
20 
21    H1=Hdiss+Hsolve
22 
23    print*,"H1=",H1
24    pause
25!    return
26    end
27 
28    subroutine Derivative(dPDT,T)
29    double precision dPdT,T,e(4)
30    data e/-436.1,4.6,-0.018,0.0000196/
31    dPdT=e(1)+e(2)*T+e(3)*T**2+e(4)*T**3    !MPa/K
32    print*,"dPdT=",dPdT
33    return
34    end
35 
36    subroutine Totalmolarvolume(V,Vliquid,Vgas,Vhydrate)    
37    double precision V,Vliquid,Vgas,Vhydrate,xh2s,n,parameter1,parameter2,density2,l(4)                 !density1,molecularweight2,V4,molecularweight,h(6)
38    !data h/44.202,2544.564,-35.957,0.191,-4.488E-4,3.965E-7/
39    data l/21.90583,-0.21947,7.33695E-4,-8.18347E-7/
40    !calculating the molar volume change of solution
41    parameter1=0.0000045
42    parameter2=0.000018
43    Vliquid=xh2s*parameter1+parameter2   !m3/mol
44 
45    !calculating the molar volume change of hydrate
46   ! density1=1050  !kg/m3   !this value is guess
47   ! molecularweight2=0.1461 !kg/mol
48    Vhydrate=1.391E-4    !m3/mol, Vhydrate=molecularweight/density1
49 
50    !calculating the molar volume change of vapor
51    !density2=h(1)+h(2)*T+h(3)*T**2+h(4)*T**3+h(5)*T**4+h(6)*T**5   !kg/m3
52    !molecularweight=0.034 !kg/mol
53   ! Vgas=molecularweight/density2   !m3/mol
54     Vgas=l(1)+l(2)*T+l(3)*T**2+l(4)*T**3
55 
56    !calculating the total molar volume
57    V=(1-(n*xh2s)/(1-xh2s))*Vgas+n*Vliquid-Vhydrate   !m3/mol
58 
59    print*,"Vliquid=",Vliquid
60    print*,"Vhydrate=",Vhydrate
61    print*,"Vgas=",Vgas
62    print*,"V=",V
63    return
64    end
65 
66    subroutine dissenthalpy(Hdiss,T,dPdT,V)
67    double precision Hdiss,T,dPdT,V,Vliquid,Vgas,Vhydrate
68    call Derivative(dPDT,T)
69    call Totalmolarvolume(V,Vliquid,Vgas,Vhydrate)
70    Hdiss=1000000.0*dPdT*T*V
71    print*,"Hdiss=",Hdiss
72    return
73    end
74 
75    subroutine solveenthalpy(Hsolve,xh2s,n)
76    double precision Hsolve,xh2s,n
77    Hsolve=17960.0*n*xh2s/(1-xh2s)   !J/mol
78    print*,"Hsolve=",Hsolve
79    return
80    end

按照上面的运行结果,我输入T=274.15 K, P=0.118 MPa,n=6.2, xh2s=0.004的情况下,输出结果为:
dPdT=  -124.007293931873
Vliquid= -4.165183558045402E+056
Vhydrate=  1.390999968862161E-004
Vgas=  1.013072811542869E+018
V=  3.855278546349224E+118
Hdiss= -1.310663612078491E+129
Hsolve=   447.196787148594
H1= -1.310663612078491E+129

上述高亮部分结果不对,为什么会出现10的129次方呢,可我又不知道为什么,本人小白一枚,求各位大佬支招


分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
5#
发表于 2020-1-25 02:14:40 | 只看该作者
fcode 发表于 2020-1-24 09:04
Implicit None 如果写在module里,那么module里contains的过程都有效。

但是楼主玩的都是外部子程序,需 ...

原来如此,谢谢~

2038

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1676 元
贡献
715 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2020-1-24 09:04:34 | 只看该作者
liudy02 发表于 2020-1-24 01:56
实际上,只要主程序和每个module里的开头写上就可以了吧
我实际测试的结果是,只要这样写了,之后的所有 ...

Implicit None 如果写在module里,那么module里contains的过程都有效。

但是楼主玩的都是外部子程序,需要每个程序单元都写

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
板凳
发表于 2020-1-24 01:56:56 | 只看该作者
fcode 发表于 2020-1-22 21:16
Totalmolarvolume 函数里 xh2s,T,n 这三个变量,没有定义,也没有赋值。就直接使用,当然会出错。

建议 ...

实际上,只要主程序和每个module里的开头写上就可以了吧
我实际测试的结果是,只要这样写了,之后的所有子程序和函数里都不能有未声明的变量了

2038

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1676 元
贡献
715 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2020-1-22 21:16:59 | 只看该作者
Totalmolarvolume 函数里 xh2s,T,n 这三个变量,没有定义,也没有赋值。就直接使用,当然会出错。

建议:
1. 要写 implicit none,每个程序单元都要写。
2. 学习 debug 单步调试。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-5-2 02:23

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

快速回复 返回顶部 返回列表