Aspen中使用Fortran条件语句示例

昨天在看一份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 运算符 | 参考手册