昨天在看一份Aspen文件的时候,碰到了这么一个问题,报错如下:
在一个循环中,有一个计算器模块B7-1,有三个变量:
- 变量A:循环流股S1中O2的摩尔流量
- 变量B:循环流股S2中的O2摩尔流量
- 变量C:新鲜进料中的O2摩尔流量
三股混合之后的初始O2摩尔流量为160kmol/h,所以Fortran语句如下:
C = 160 - A - B
调试了很久,发现该计算器虽然最后 可以计算出正确的值,但是在历史记录中发现还是有报错,报错主要是变量A流股出现负值,按照计算器的Fortran语句来看,应该是流股S1或者流股S2出现了 临时数值 大于O2总量160kmol/h的情况,
但是这个循环中的设备比较复杂,重新调整塔器难度太大,容易引发出更多的错误,就突然想到,既然计算器模块最后可以收敛,那么也就是说中途迭代过程中的这几次报错不影响整体循环的收敛,那么只需要写一个条件语句让变量A不为负值不就好了,
我简直是个天才()
那么问题来了,如何确定哪个变量超过160了呢?想到可以给该计算器模块B7-1打一个断点来看看详细日志,转到控制面板,找到B7-1,右键选择停止点:
然后重置运算模拟,当B7-1模块出现警告时停止计算,在控制面板右键模块B7-1,然后选择查看详细的日志报告:
果不其然,发现了问题所在:
是变量A超过了,变量B一直在0.05~5之间徘徊,所以Fortran语句如下:
if ( A .gt. 155 ) then
A = 140
end if
C = 160 - A - B
这里改成160了,也行的。
这样就可以保证A+B不会大于160,那么C也就不会出现负值了,直接解决了循环报错的问题。
顺便贴一下Fortran运算符:
假设变量 A 为 10,变量 B 为 20,则:
运算符 | 等同于 | 描述 | 实例 |
---|---|---|---|
== |
.eq. |
检查两个操作数的值是否相等,如果相等,则条件变为 true | (A == B) 为 true |
!= |
.ne. |
检查两个操作数的值是否相等,如果值不相等,则条件变为 true | (A != B) 为 true |
> |
.gt. |
检查左操作数值是否大于右操作数值,如果是,则条件变为 true | (A > B) 不为 true |
< |
.lt. |
检查左操作数值是否小于右操作数值,如果是,则条件变为 true | (A < B) 为 true |
>= |
.ge. |
检查左操作数值是否大于或等于右操作数值,如果是,则条件变为 true | (A >= B) 不为 true |
<= |
.le. |
检查左操作数值是否小于或等于右操作数值,如果是,则条件变为 true | (A <= B) 为 true |
还有其他类型的运算符和语句,可以参考:Fortran 运算符 | 参考手册 。