如何在第二个DO循环中调用第一个DO循环的results(k(i))?当前结果异常
解决你的Fortran循环K值复用问题
首先,你的核心问题出在第一个DO循环没有正确存储每个i对应的K值,导致第二个循环调用K(i)时拿到的是无效数据。咱们拆解来看:
问题1:K变量未声明为数组,且赋值错误
你当前的代码里,第一个循环写的是:
K = (pc(I)/p)*EXP(5.37*(1+w(I))*(1-(tc(I)/t))) write(*,99001)K(i)
这里的K是一个标量(单个值),每次循环都会被新的计算结果覆盖,而且K(i)的写法本身就不合法(标量没有下标)。这就导致第一个循环结束后,K只保留了最后一次循环的结果,前面5个组分的K值完全丢失了,第二个循环自然拿不到正确的K(i)。
修复步骤
- 声明K为数组:在代码开头(变量声明区)添加数组声明,比如假设你的
pc、tc、w都是长度为6的实数数组,那么:REAL, DIMENSION(6) :: K, pc, tc, w, Z ! 把相关数组都明确声明 REAL :: p, t, VOLD, FV, FPV INTEGER :: i - 正确存储每个i的K值:修改第一个循环的赋值语句,把计算结果存入数组的对应下标位置:
do i=1,6 K(i) = (pc(I)/p)*EXP(5.37*(1+w(I))*(1-(tc(I)/t))) ! 用K(i)存储第i个组分的K值 write(*,99001)K(i) end do - 检查其他变量的初始化:第二个循环里用到的
VOLD和Z(i),要确保它们已经被正确初始化(比如VOLD初始设为0.5或者其他合理的初始值,Z数组要有预先定义的组分摩尔分数),否则即使K值正确,计算FV和FPV也会得到错误结果。
修正后的完整代码示例
PROGRAM FLASH_CALC IMPLICIT NONE ! 一定要加这个,避免隐式声明导致的错误 REAL, DIMENSION(6) :: K, pc, tc, w, Z REAL :: p, t, VOLD, FV, FPV INTEGER :: i WRITE(*,*) "Enter PRESSURE,TEMPERATURE" READ *,p,t ! 这里需要给pc、tc、w、Z、VOLD赋值,示例如下: ! pc = [10.0, 20.0, 30.0, 40.0, 50.0, 60.0] ! 临界压力值(根据实际组分调整) ! tc = [300.0, 400.0, 500.0, 600.0, 700.0, 800.0] ! 临界温度值 ! w = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6] ! 偏心因子 ! Z = [0.1667, 0.1667, 0.1667, 0.1667, 0.1667, 0.1667] ! 组分摩尔分数 ! VOLD = 0.5 ! 初始汽相分率 WRITE(*,*) "Approximate K values for each component using Wilson's correlation are;" do i=1,6 K(i) = (pc(I)/p)*EXP(5.37*(1+w(I))*(1-(tc(I)/t))) write(*,99001)K(i) end do !.......vapor fraction.............. WRITE(*,*) "Calculated FV and FPV for each component;" do i=1,6 FV=(Z(I)*(K(i)-1))/((VOLD*(K(i)-1))+1) FPV=-(Z(I)*((K(i)-1)**2))/((1+(VOLD*(K(i)-1)))**2) ! 修正了原代码的括号错误 write(*,99001)fv,fpv end do 99001 FORMAT (9F15.6) END PROGRAM FLASH_CALC
额外注意点
- 一定要加
IMPLICIT NONE!Fortran的隐式声明规则(以I-N开头的变量默认是整数)很容易导致隐藏错误,显式声明所有变量能避免大部分问题。 - 原代码的
FPV计算里,分母的括号有问题:1+(VOLD*(K(i)-1))需要整体平方,原代码的写法会导致运算优先级错误,我在修正代码里已经调整了括号位置。
内容的提问来源于stack exchange,提问作者priest
相关产品推荐
相关产品推荐

