fenglili 发表于 2014-4-11 08:56:20

晒晒自己写的一个动态模拟软件!大家相互交流,呵呵

本帖最后由 fenglili 于 2024-1-26 12:14 编辑

昨晚,偶然看到论坛新增的“OTS化工仿真模拟”板块。很想把自己这几年的一些经验心得写出来和大家交流。大学的时候开始接触模拟软件,Aspen plus、ProII、Hysys都接触过,但只是停留在表层。09年大学毕业后参加工作进了一个化工厂,接触到OTS。当时在装置开车前有过几次OTS操作培训,之后再没机会操作了。之后一直很想用Hysys把所在装置做一个动态模拟。通过上网找资料、钻研Hysys的帮助文档学习动态模拟的知识,终于搭建了一个甲醇精馏的流程。通过对用Hysys进行模拟开车停车,对自己工艺的理解和操作水平的提高大有帮助。找到了那会儿做的模拟流程,截了几张图,呵呵。

      在工厂那会儿最大的理想就是有机会从事OTS行业。呵呵。




    用Hysys搭建好流程后,就一直想自己写一个操作界面,因为在Hysys的建模界面上操作实在太不方便了。之后就用C#写了一个操作界面。将Hysys作为后台计算,将数据与操作界面相互传递。      
    大学的时候虽然学的是化工,但酷爱计算机编程,几乎所有的业余时间都用来学习编程了。对C#不敢说精通,但是能想出的功能自己都能做出来。再次给大家推荐一本计算机编程的书《NET 2.0面向对象编程揭秘》(金旭亮)这是上学的时候我看过的最好的书之一(国内)。
       2011年,偶然的机会有幸从事OTS行业。之后就开始全身心的研究动态模拟技术。学习过其他仿真平台,有国内的国外的。每一个平台也有自己的优点,但我始终认为Hysys是动态模拟最优秀的平台。为了验证自己对于动态模拟的理解和研究一些技术难点,萌生了自己写一个动态模拟软件的想法。经过这几年的尝试和改进,稍具雏形。主要是想整理和总结几个技术难点和大家交流分享一下。 下图我写的动态模拟软件的几张截图。
      
    动态模拟软件采用的方法大都是“动态序贯模块法”。就是流量和压力联立求解、质量衡算、能量衡算序贯求解。
其中一个核心就是流量压力求解器(Pressure Flow Solver),P-F Solver 说白了就是解大量的非线性方程组。一个工艺流程中需要求解的方程组一般都在好几千。所以求解之前需要进行预处理,即不相关子系统的识别。通过不相关子系统识别可以将方程分组联立求解,会大大降低方程组的维数。但是分隔后的方程组有时依旧很庞大。特别是在有精馏塔的时候,如果塔板算法考虑到Vapour Holdup ,那么每块板的压力和气相流量必须联立求解,有些模拟平台为了简化处理,塔板算法忽略了Vapour Holdup,这样虽然简化了计算,但降低了动态响应的真实性。所以P-F Solver的核心就是寻找到一种快速稳定的非线性方程组求解策略。
    另一个难点就是闪蒸算法。流量压力求解完成后就是对每个单元设备进行质量衡算、能量衡算、闪蒸计算。动态模拟软件在每一圈执行的时候要对所有设备进行闪蒸,同时由于动态模拟软件是用来模拟开车停车,经常有可能在极端条件操作。所以要求闪蒸算法非常稳定、高效。有几种类型的闪蒸计算:PT-Flash、PH-Flash、PS-Flash等。动态模拟中用的最多的是PH-Flash,其次是PT-Flash。PS-Flash在压缩机和透平机中使用。教科书中所写的闪蒸计算方法,几乎没办法在动态模拟软件中使用。目前使用较多的闪蒸计算方法是双层法,但是对于相变点附近单纯的双层法常常会失败,所以必须结合其他方法使用。关于闪蒸计算公开的论文有好多,有兴趣的可以找找资料,或者我们相互交流交流。化工流程非常复杂庞大,有了高效、稳定的闪蒸算法,也必须有一定的求解策略。下图是Hysys中的求解策略:流量压力每个积分时间算一次,能量衡算两个积分时间算一次、组分和严格闪蒸10个积分时间算一次。这样既保证了速度,又保障了精度,非常巧妙。

    还有一些文献中提出采用双层法的思想,用简化的模型进行计算,一定时间后用严格模型进行校正。我一直打算尝试一下这种方法,效果应该会不错的。
    以上两点是我认为动态模拟最核心的地方,希望和大家相互交流。
    最后给大家推荐一本《化工系统工程-理论与实践》(王健红)。这是13年我同学给我推荐的一本书,我一直爱不释手,一有空了就是拿出来看看,每次读完都会有新的体会。我看书习惯先看序言或者跋,因为从其中可以轻而易举的辨别出书的好坏。好的书一般都是作者多年的心得所成,而非那些东拼西凑的垃圾。所以好书的序言或者结尾都会有作者写书的经历和感想。下面摘出这本书跋中的一段:
   “从上大学高年级迄今,我与化工系统工程已经打交道近三十年了。为了这门学问或技艺的真谛,我得到了许多,也失去了许多。我仍然要为它继续付出,也希望更多的年轻学子有志从事这一领域的工作并真正掌握其原理。因此,我必须写一本关于化工系统工程的书。我写这本书,不是为了获奖,不是为了提职,也不是为了营利。正因如此,我只愿意写出自己有深刻体会的内容,结果使得这本书写了十年。……”

phychemlxd 发表于 2014-4-11 08:56:20

fenglili 发表于 2014-4-15 23:41
你好phychemlxd,谢谢您这么详细的回复。
(1)“迭代到接近相变边界时,调用PT flash验证”我的做法和您 ...

对于PH flash,我提到的双层法,对于窄沸点问题确实是存在问题的,一般的解决办法就是做个简单的内插,大多数情况下可以过去,但是极端情况可能就会出问题(这也是HYSYS在好些等焓计算的bug所在);你实现的双层法更精确,但是正如你所提的那样,判断收敛区域也是一个技术活(0.02可不是一个小值),同时据我的理解,你实现的这种双层法的效率也很大程度上依赖于所研究的体系。
PT Flash这个东西主要还是时间的积累,碰到的问题越多,代码会变得越来越可靠。就跟你说的一样,从书本来的算法,估计只能保证80%可行(当然不同人的方法,这可数字可上可下);剩下的大多都是在fixing bug的过程中积累的,所以跟你接触的体系,热力学方法都有或多或少的关系。
从严格意义上来说,PT Flash是分成两部分的-- phase split和stability test。我们前面提到的基本都还是在phase split计算上。一般来说,我前面的回复里面是气液两相phase split计算,在这个部分计算结束后,需要做一步stability test,如果系统是不稳定的,就要重新加上新的一相(如果前面收敛的是VLE,那么此时就会再加上一个液相),然后再重新计算phase split。对于一般的模拟器来说,找到稳定的三相就可以停止了。(油藏模拟器一般只支持两相,流程模拟器是三相,当然这里没有考虑固体)
欢迎探讨,如果能把问题在技术细节上描述得你前面这样细致的话,说不定能帮上忙。

fenglili 发表于 2014-4-11 08:56:20

本帖最后由 fenglili 于 2014-12-19 21:22 编辑

phychemlxd 发表于 2014-4-14 16:20
你提到的这篇文献我曾经读过,不过没有做过实践;记得他们提到确实需要用PT Flash来确认收敛在哪个区域。 ...
你好phychemlxd,谢谢您这么详细的回复。
(1)“迭代到接近相变边界时,调用PT flash验证”我的做法和您理解的一样,是通过汽化分率来判断。'Inside-out' flash内层迭代采用简化的焓值模型,外层迭代用严格模型对简化模型的参数更新。气化分率由内层迭代算出,外层迭代先判断如果v<0.02 则把v设置为0 计算T,调用PT flash 计算V,看是否在液相区,反之如果v>0.98则把v设置为1,计算T,然后调用PT Flash 计算V,看是否在气相区。
(2)您说的内层迭代采用PT Flash ,外层迭代更新T,我之前也用过。不过好像存在一个问题,就是对于纯组分或者沸程很窄的物系,比如纯水(我画了一个简图,有点简陋),

在沸点时T没变化但是焓和气化分率变化很大,收敛会有问题的。不知您遇到过吗。使用之前论文中的“inside-out" flash 可以避免这个问题。呵呵
(3)PT Flash 我的实现过程和您说的类似,negative flash 就是计算的气化分率可以<0 或者>1. 只是更新K 的时候我是直接更新 k=knew。现在在外地出差,等回去之后好好试一下您说的 更新K的方法。再次谢谢您的回复。闪蒸计算这块还有好多问题不是很清楚,一时半会描述不太清楚,回去后还要好好向您请教啊。呵呵。

zwg2006 发表于 2014-4-11 08:56:20

感谢楼主的肺腑之言!我刚接错HYSYS,但刚毕业不久,一上手就要求要做动态模拟,我是摸不着头脑呀!请问楼主有没有什么好的资料分享一下,要适合初学者的资料,楼主也说了,选择一本好书对学习的重要性,尽管论坛里也有很多资料,但动态的较少,有的话也不是很全或很权威!谢谢!

phychemlxd 发表于 2014-4-11 08:56:20

fenglili 发表于 2014-4-13 22:07
非常感谢phychemlxd的回复。我非常同意您的看法,确实如您所说PT Flash是关键中的关键。以 PH Flash 为例 ...

你提到的这篇文献我曾经读过,不过没有做过实践;记得他们提到确实需要用PT Flash来确认收敛在哪个区域。根据你的描述,我不是很清楚你是怎么操作的“迭代到接近相变边界时,调用PT flash验证”。你是说在迭代过程中关注相分率,然后来判断?这的确也是一种方法。其实说到双层法PH Flash,还有一种是,在内层用PT Flash,外层就是改变温度T来匹配(match)焓,这个就没有调用PTFlash验证一说,但是具体哪种更高效,我不确定。可能AspenPlus用的是你说的那种双层法;但是HYSYS可能用的是我说的双层法。
至于PTFlash,所谓的序贯法就是直接迭代,基本跟你实现的negative flash是一样的。牛顿法的话,就是在这个直接迭代法收敛比较慢的情况下调用的。然后我前面提到的判定稳定性就是你说的TPD测试,所以你已经实现了。这里有个疑问,negative flash往往作为一种中间步骤策略,但是最终显示结果的时候,一般都不会显示。我不会贴图,简单描述一下相分裂的计算过程。
(1)一般情况下,如果没有初始值,采用Wilson方程或者是假设气相是理想气体得到初始的分配系数(K factors/values)
(2)根据给定的K factors计算相分率 (你所提到的negative应该主要是指这里相分数可以为负值)
(3)根据计算得到相分率和K factors计算相组成
(4)调用热力学方程计算逸度系数(绝大多数情况下,我们会同时计算得到逸度)
(5)判断收敛条件(比如说逸度相等)
(6)更新K factors (一般我们都用对数Ln(K),可以lnK new = lnK old + delta lnf;或者是直接lnK new = lnphi(L)- lnphi (V),就是逸度系数,如果内层是收敛的,这两者相同,但是对于没有收敛,或是一些特殊例子,在稳定性上会有差别)
(7)就是循环(2)到(6)

这样的步骤在绝大多数情况下,收敛是没有问题的;对很多非理想较大的体系,这个步骤不是特别高效,所以有人提出要加速或者是采用二阶法(即牛顿法,当然还有别的命名法)。

我不确定你所说的收敛效果不好指的什么意思?作为调试或者保证收敛方向正确,你可以计算每一步骤的Gibbs自由能,然后看看是否以致在降低。

不能说指点,共同探讨。。。

fenglili 发表于 2014-4-11 08:56:20

本帖最后由 fenglili 于 2014-4-13 22:12 编辑

phychemlxd 发表于 2014-4-13 21:01
非常感谢fenglili能贡献这样的例子。本人对系统工程没有研究,但是对闪蒸算法还是有一些研究的。你说的双层 ...
非常感谢phychemlxd的回复。我非常同意您的看法,确实如您所说PT Flash是关键中的关键。以 PH Flash 为例,我采用的是"Efficient flash calculations for chemical process design-extension of the Boston-Britt ’Inside-out' flash algorithm to extreme conditions and new flash types"这篇论文中的方法。主体还是双层法,但是迭代到接近相变界时,调用PT Flash 验证。所以PT Flash的稳定性和效率非常关键,PT Flash我也是通过试验感觉双层法效果并不好,最后采用的是negative flash结合TPDF稳定性测试。您所说的“序贯迭代法求解,然后用牛顿法求解”我不是太明白。有机会要向您好好请教一下,或者可有相关的文献推荐?再次感谢您的回复与指点。

phychemlxd 发表于 2014-4-11 08:56:20

非常感谢fenglili能贡献这样的例子。本人对系统工程没有研究,但是对闪蒸算法还是有一些研究的。你说的双层算法,其实在HYSYS里面应该也是采用的。至于你说的靠近相变界就会失败,这个如果PTFlash收敛正确,就是外层计算的收敛条件问题,一般情况下,外层采用割线法,都能找到解。对于PH Flash来说,双层法应该是比较保险的(除开特殊的窄沸点问题以外)。所以说PT Flash是关键中的关键。而对于PTFlash来说,双层法不是最优的。据我的理解,比较优化的算法基于以下这样的逻辑,首先用序贯迭代法求解,然后用牛顿法求解。这样的算法,可以有效地平衡效率和可靠性。其实在PTFlash中,相分裂计算不是最难的,判断收敛的结果是不是处于稳定态是更难的部分(这也就是你说的靠近相变界会失败的很大部分的原因)——可以说几乎没有完美的算法可以应用于动态模拟。再次感谢你的贡献,真切地感受到你的天分与努力。

pl283600780 发表于 2014-4-11 08:56:20

楼主是我的榜样啊

lchy 发表于 2014-4-11 08:56:20

向系统工程致敬,向过程系统工程致敬
当初想考研就想去过程系统工程方向,不过后来取消了考研的念头或者说推迟考研
有机会再考研或者工程硕士
{:1106_381:}楼主真人才,向楼主致敬{:1106_382:}

科尔沁 发表于 2014-4-11 08:56:20

楼主真牛,这都行。

不懂风的雨 发表于 2014-4-11 08:56:20

楼主真是人才啊,将实际生产与理论软件结合到了一起,更重要是兴趣所在,我的专业方向就是两者结合,但我多编程不敢兴趣,对化工还蛮喜欢的,纠结啊,求楼主qq

花林似霰 发表于 2014-4-11 08:56:20

我也习惯先看序言

zhuangjz2014 发表于 2014-4-11 08:56:20

感谢楼主为化工事业做得贡献,敬礼了!

musashino 发表于 2014-4-11 08:56:20

向楼主致敬{:1106_362:}{:1106_362:}

baoziof286 发表于 2014-4-11 08:56:20

没有好好学习编程,一直感觉很失策。{:1106_361:}

yiling001 发表于 2014-4-11 08:56:20

不错,楼主很牛啊

xlqdd 发表于 2014-4-11 08:56:20

支持一下啊,楼主很不错呀~

hetianbiao 发表于 2014-4-11 08:56:20

太牛了,楼主,向你学习!!!!!!!

守得云开~rainy 发表于 2014-4-11 08:56:20

太强了,崇拜啊

ji123 发表于 2014-4-11 08:56:20

楼主强大啊

ji123 于 2014-04-12 08:43:40 补充以下内容:
楼主强大啊

liran 发表于 2014-4-11 08:56:20

看看什么东东。楼主也太强大了吧

zxc_000 发表于 2014-4-11 08:56:20

特别赏识,基础功底与实际结合并非一时间就能达到

天山 发表于 2014-4-11 08:56:20

动态模拟还没有做过呢?感谢啊!

dpz1225 发表于 2014-4-11 08:56:20

期待楼主的书

abehugo 发表于 2014-4-11 08:56:20

感谢楼主分享心得,支持,接着就去找楼主推荐的书

edwardlau 发表于 2014-4-11 08:56:20

楼主很有才啊
页: [1] 2 3
查看完整版本: 晒晒自己写的一个动态模拟软件!大家相互交流,呵呵