【交流】这个二维N-S方程边值问题在其他软件里是怎么解的?
mathematica吧
全部回复
仅看楼主
吧务
level 15
xzcyr 楼主
标题又写不下了……其实原本我拟的标题是
【交(gǎo)流(shì)】这个经典(大概)的纳维斯托克斯方程的边值问题(二维稳态不可压缩流)在其他软件里是怎么解的?
大家都知道,NDSolve自版本10开始加入了有限元方法("FiniteElement"),终于可以求解
1. 不含时的偏微分方程定解问题(或者说得更“数学”一点:不管在哪个方向上都不是
适定的初值问题的偏微分方程定解问题)
2. 不规则区域上的的偏微分方程定解问题
了,尽管目前NDSolve的有限元方法展现出了一些吸引人的特性(比如简洁易懂的语法),但是,它还很年轻,
截止版本11.2,它还不能求解非线性问题。比如这一帖
mathematica.stackexchange.com/a/96579/1871
里面提及的问题。如大家所见,user21 使用了一些较低级的有限元函数来求解这个问题,老实说,我一个用了几年Mathematica的人,看了他的代码都觉得脑仁疼……显然,在当前,如果需要在不规则区域上求解非线性的偏微分方程,Mathematica恐怕不是一个很好的选择。
那什么才称得上是“很好的选择”呢?
开这个帖就是想让各位来秀一下。(我知道吧里存在复数个其他有限元软件的用户。)
事先声明下规则:所有讨论围绕上面所举的例子进行,谢绝空谈,违者……可能删。(毕竟这是个涉及软件对比的帖子,我得最大限度地压制住出现无谓争端的可能性。)
为了方便大家阅读,这里重述一下上面帖子中出现的问题。首先是方程组:
参数:
\[Mu] = 10^-3;
\[Rho] = 1;
区域(就直接上代码了,应该都能看懂吧……):
l = 2.2;
h = 0.41;
\[CapitalOmega] =
RegionDifference[Rectangle[{0, 0}, {l, h}],
ImplicitRegion[(x - 1/5)^2 + (y - 1/5)^2 < (1/20)^2, {x, y}]];
RegionPlot[\[CapitalOmega], AspectRatio -> Automatic]
边界条件
\[CapitalGamma] = {
DirichletCondition[p[x, y] == 0., x == l],
DirichletCondition[{u[x, y] == 4*0.3*y*(h - y)/h^2, v[x, y] == 0},
x == 0],
DirichletCondition[{u[x, y] == 0., v[x, y] == 0.},
y == 0 || y == h || (x - 1/5)^2 + (y - 1/5)^2 <= (1/20)^2]};
……其实就是左边界速度分布为4*0.3*y*(h - y)/h^2,压力的右边界为0。
好了,大家来展示下自己所用的软件是怎么解这个问题的吧。
2018年01月06日 14点01分 1
吧务
level 15
xzcyr 楼主
照例由我开个头。Python的FEniCS程序包文档里包含了一个非常相似的问题(只有右边界略有区别——其实仔细想想,或许是user21对这个测试问题做了修改?)的解法:
fenicsproject.org/pub/tutorial/html/._ftut1009.html#ftut1:NS
……至少在我看来,没简单到哪去。
2018年01月06日 14点01分 2
大部分的问题描述也可以在这个网站找到:[url]http://www.featflow.de/en/benchmarks/cfdbenchmarking/flow/dfg_benchmark2_re100.html [/url] 注意压力的右边界略有区别。
2018年01月06日 14点01分
level 1
这个问题其实涉及到计算流体力学(CFD)领域,工业界通常采用研究得较为成熟的限差分法以及限体积法。因为用普通有限元方法求解一般NS方程存在精度相对低、内存开销大、计算时间长的缺点。
当然,在学术界也有不少论文提出了新方法,如边界元法、无网格方法、谱方法、间断伽辽金法(有限元法的一种),等等。但它们理论还不太成熟,有很多问题没有解决,难以推广应用。
CFD商业软件多如牛毛,比较大众且有名的一款商业软件叫Fluent(已被有限元ANSYS软件公司收购),其他如CFX(同样被ANSYS收购)、Star-CD(似乎多用于汽车领域)、Phoenics、COMSOL……也有小众群体使用。
如果将“软件”含义扩展到非商业的程序包,那就更多了。
因为很多CFD学者(比如国外大牛、国内一些实验室的课题组)自己会去编写相应的程序,不少甚至加入了网格划分功能(当然为了方便,大多数是用别的开源网格划分程序),并在相应组织或个人主页上公开了源代码。对于一些小型代码工程,他们的代码只专们研究某一类特定问题,故对该类问题精度较高但程序通用性较小。
这里要说的是大型的、功能涵盖比较广阔的代码包(类似Fluent这种通用型软件)。比如最有名的一款开源CFD代码包——OpenFOAM,其功能非常全面(可求解各种各样的流动问题),使用的是C++面向对象架构,社区丰富文档详实,用户众多,团体维护更新。
https://openfoam.org/
有人曾用一个叶轮机算例来对比OpenFOAM和Fluent的计算速度与结果精度区别,做出动画曲线放到YouTube上(链接不记得了)。结果显示,当时使用的OpenFOAM计算时间更长,但计算结果更为保守(Fluent结果比较粗放)。毕竟前者使用的是类对象的编写方式,架构层次分明且阅读方便,但是程序执行过程中多了太多打包-解包过程,计算速度较慢也是可以理解的。
另外一个比较有名的大型代码包Chombo,专门求解偏微分方程的程序包。
https://commons.lbl.gov/display/chombo/Chombo+-+Software+for+Adaptive+Solutions+of+Partial+Differential+Equations
2018年01月10日 08点01分 3
这里有个MATLAB工具箱使用有限元法求解CFD问题http://www.featool.com/matlab-cfd-toolbox/
2018年01月10日 09点01分
level 1
上面提到的也仅仅是CFD通用计算软件,对于一些特殊问题它们只能解决最简单的情况(甚至没有这个功能),比如研究等离子体流动问题——这类问题又叫比普通流体问题的求解更加困难,因为需要解耦合了Maxwell方程组的NS方程组(称为MHD NS方程组)。
相对于普通NS方程组,MHD NS方程组引入了刚性源项以及磁场无散度约束(椭圆型方程)。熟悉数值方法的都明白,刚性源项意味着特征值相差较大(这里物理含义是磁流体的特征波速跟普通流体的特征波速相差较大);椭圆型方程意味着特征波速无穷大,这使得求解格式中时间步长必须非常非常小,从而计算时间会增加到无法忍受的地步。
这种问题通常有专门的代码包,如Athena, BOUT++, Alsvid, Saturne等等,,它们采用特殊格式以及一些近似来避免上述困难。
2018年01月10日 09点01分 4
level 10
楼上说得很好,在学界,求解N-S方程的是有限体积法和差分法。无网格法(例如:SPH)可以克服求解大变形问题所引起的网格畸变(但有限元仍然可以用拉格朗日-欧拉**服网格畸变),SPH的求解的困难还是在于计算量、流固耦合。为此,也有学者进行自适应粒子重构,引入GPU并行计算机制,来满足效率和精度的要求,总的来说,SPH仍然还有很长路要走。求解N-S方程的软件很多,通用知名的是Fluent。另外,知名的达索公司也有自己的求解CFD的模块(适合不可压缩流体),求解过程采用了有限元和有限体积相结合的方法,详见:http://blog.sina.com.cn/s/blog_71a2f5470102vpld.html。ABAQUS的CFD模块的优点是方便多场耦合计算和不同模块之间的数据交换。
2018年01月10日 11点01分 5
吧务
level 15
xzcyr 楼主
@失落的记忆sea @奥斯马登
……道理我都懂,但是两位能不能具体拿个软件来秀一把操作呢?
2018年02月03日 11点02分 6
level 1
如果是使用这些软件解决其能解决的问题范围,只需要写一些初始条件和边界条件的读入文本(比如Chombo、OpenFoam等);要么是做成了界面形式直接点击按钮(比如Fluent、Phoenics等)。
当然,对于开源代码,可以自己修改算法(需要深入的CFD知识),或是修改一些特定的模块,以适应自己的问题。比如,通常软件内置了大部分常用的边界条件,但一些特殊的边界条件需要自己定义。
所以这些过程不涉及MMA那样的各种trick式的编程过程,没有可展示的东西。比如这里有个圆柱绕流的OpenFoam算例,可以看到具体步骤流程和结果:
http://www.cnblogs.com/TigerZhang/p/5627141.html
带有界面的就更容易了,点点按钮导入网格文件(大部分网格是在专门的网格划分软件中设计的,也有的本身提供网格划分功能),然后设定初始条件和边界条件,最后计算。剩下就是漫长的等待了。
比如前面说的FEATool这个简单的带有界面的工具计算圆柱绕流问题:
1. 画网格
2. 设定初始参数(比如粘性、密度、压力等)
3. 指定边界条件
4. 计算(这个软件内置了后处理,故能直接看到结果)
6. 嫌结果不够精确,可进一步加密(网格后再次求解)
7. 加密网格后的流场图
上面这个软件相比起Fluent较为简陋,但这些软件的使用,得到结果的好坏(或者说跟真实解)的差距,很大程度上取决于网格的质量的好坏(网格质量指的是网格变化的均匀性,是否有狭长单元、网格边/面的法向量夹角是否接近直角等),并且并非网格数越多越精确;还跟一些物理参数和数值参数设定是否合理有关——这些都是需要经验的和物理直觉的,这与编程关系相差更远了。
总的来说,这些软件本身只是将CFD学术界中最成熟最优秀的算法,通过代码形式写好了,给人用的。
2018年02月03日 13点02分 7
这个FEATool的界面给我的感觉还挺有吸引力的……特别是把方程列出来了这点。
2018年08月04日 15点08分
@xzcyr 是的,可以很方便来进行一些有趣的研究,比如设计不同翼形,探索升力与形状的关系;或者设计不同的城市规划结构,探索气流流动情况等。
2018年08月06日 08点08分
1