有!Mac原生的OpenFOAM: 下载&安装&使用指南
ChimneyFoam
帖子
-
有人在mac上装of么? -
MacOS原生OpenFOAM AppOpenFOAM是一款开源的CFD软件,功能很强大,而且可扩展性非常强。这里的可扩展性指的是在OpenFOAM的基础上可以自己开发各种求解器解决一些特定的问题。然而,OpenFOAM也存在开源软件的普遍问题:学习曲线较陡。尤其是软件安装,这第一步就会劝退一大批人。不论是OpenFOAM官网还是一些网上的教程,针对MacOS系统下的安装全都是基于Docker或者其他的虚拟机。其逻辑都是通过虚拟机虚拟出Linux系统,然后在虚拟的Linux系统里面使用OF。这种方式存在很多问题,最大的问题就是运行效率低,自己开发求解器的时候不容易调试。所以,最好的解决方案就是在MacOS系统下从OF源码编译出原生的程序,但是几乎所有平台都没有给出这种解决方案!即使找到了某种方式进行编译,也是非常麻烦,需要解决很多第三方依赖库和编译器的问题,非常浪费时间还不一定能搞定!基于此,本人花了一些时间将OpenFOAM的主流的版本编译为原生的app,解决了以上所有的这些繁琐的问题,非常容易使用。尤其对于一些初学者或者编程不太熟悉的用户,以前可能从来无法实现或者需要很长时间才能实现的问题,现在可以在一分钟之内解决问题。本文主要介绍如何下载和使用OpenFOAM
app。下面是详细介绍文本,同时也配有亲手操作的演示视频: 见B站。1. 下载
下载很简单(如图1所示),查看可用版本并通过 解锁
按钮进行相应的下载操作(如下截图所示)。如果网站上没有列出您的目标版本,可以发送请求到进行私人定制。
图1: 访问下载页面,轻轻点击[解锁]按钮即可通过说明步骤获取2. 安装
如果第一步完成,则相应的软件下载链接通过邮件发送给您。比如OpenFOAM-9的Apple
Silicon芯片版本(下面的过程全部以此版本为例进行讲解),下载得到的app文件为
OpenFOAM-9-darwin-arm64.dmg
镜像文件。双击打开即可得到如下图所示的内容,与常规的MacOS的app安装一样,只需要简单地将OpenFOAM-9
拖入左边的Applications
目录即可完成安装。
图2:OpenFOAM-9-darwin-arm64.dmg
镜像文件中的内容拖入完成之后,即可在LaunchPad中发现OpenFOAM-9 app,如下图所示:
图3:OpenFOAM-9-darwin-arm64.dmg
app安装完成后即可出现在launchpad中app的文件列表
安装完成之后的app位于路径
/Applications/OpenFOAM-9.app/Contents
中,其中的文件列表如下图所示。其中MacOS
目录中存放初始化脚本;
Resources/bin
中存放所有的可执行文件;Resources/lib
中存放所有的动态库文件;Resources/etc
中存放所有的环境配置文件;
Resources/OpenFOAM-9.sparsebundle
为存放源代码的Case
sensitive镜像文件(用于存放OpenFOAM源代码的,因为OF的源代码的文件名是区分大小写的,然而MacOS的默认文件系统是不区分文件名大小写的,所以通过创建一个区分大小写的disk
image是比较明智的选择)。
图4:OpenFOAM-9
app的路径和文件列表3. 加载OpenFOAM环境
完成以上步骤之后就跟其他所有系统或者平台下使用OpenFOAM没有区别了,只需要加载环境变量就行。
首次安装后的环境加载
首次安装后加载环境很容易,只需要打开lunchpad并用鼠标点击
OpenFOAM-9
app ( 图3 ) 即可。
然后会弹出一个小对话框(如下图所示),提示本需要用户进行安全确认。
图5: OpenFOAM-8-x86_64
app首次打开的安全验证提示对于所有不是App
Store里面下载的软件,都会有此提示。只需要在系统的Security &
Privacy里面点击允许即可。- Step 1
图6:在系统的安全&隐私管理里面允许运行OpenFOAM app- Step 2
图7:在系统的安全&隐私管理里面允许运行OpenFOAM app细心的同学可能发现,上面的几个截图里面的app名字是OpenFOAM-8-x86_64,这是因为我写这篇博文的时候用的是M1芯片的MacBook,而举例使用的OpenFOAM-9-arm64
app就是本机器下编译的,所以不会出现安全验证的提示。为了给大家展示这个安全验证的提示信息,所以上面的截图运行的x86_64架构的app是另一个Inter芯片的MacBook上编译的。一般情况下,除了开发者自己的电脑,其他人安装app并第一次打开的时候都会出现以上的安全验证提示。安全验证允许之后,会弹出一个终端窗口(如图8所示),在这个终端窗口里已经自动加载了OpenFOAM环境,可以运行OF自带的求解器,所有的相关的环境变量都有效。总之一句话,在这个终端窗口里可以做所有OpenFOAM的工作。
图8: 运行OpenFOAM app所弹出的终端窗口自动加载OpenFOAM环境
通过上面的方式(直接点击OpenFOAM
app,在弹出的终端里面进行工作)可以工作,但是如果关闭这个窗口或者在其他的终端窗口里面是没有加载OF环境的,也就意味着无法运行OF的程序。我个人喜欢的一种方式就是在系统环境profile文件里面加入一段代码(如下所示),让其自动加载OpenFOAM环境:
随便打开一个终端都可以使用OpenFOAM 。# =========== OpenFOAM initialization start =========== FOAM_DISK_IMAGE=/Applications/OpenFOAM-9.app/Contents/Resources/OpenFOAM-9.sparsebundle FOAM_MOUNT_POINT=/Volumes/OpenFOAM-9 FOAM_VERSION=9 if [ ! -f ${FOAM_MOUNT_POINT}/etc/bashrc ]; then hdiutil attach -quiet -mountpoint ${FOAM_MOUNT_POINT} ${FOAM_DISK_IMAGE} && . ${FOAM_MOUNT_POINT}/etc/bashrc else source ${FOAM_MOUNT_POINT}/etc/bashrc fi # =========== OpenFOAM initialization end ===========
只需要复制以上代码并粘贴到
~/.bash_profile
文件中并保存即可。这样以后随便打开一个终端都能使用OpenFOAM了,就不用再在Launchpad里面点击OpenFOAM
app了。至此,在Mac系统安装原生OpenFOAM软件及加载环境的步骤就全部完成了,非常容易,一分钟之内就可以完成!
从此开始,在Mac系统下使用OpenFOAM与Linux系统下完全相同。 -
并行计算结果与串行结果差异很大的问题检查了一下damBreak算例的并行,这个
procBoundary1to0
和procBoundary0to1
的value确实是不相等的,应该不是这个的问题。而且damBreak的并行和串行结果基本一致,说明肯定是我的solver或者边界条件的问题,可是我查了好久的资料都没有找到问题关键在哪。 -
并行计算结果与串行结果差异很大的问题@东岳
这是不是就是问题的所在,这个
procBoundary1to0
和procBoundary0to1
的value是不是应该相等才对? -
并行计算结果与串行结果差异很大的问题@东岳 我猜也是边界条件的问题,这个processor边界需要自己在求解器里面处理吗?我没有处理过这个,我看OF自带的求解器里面好像也没有做处理,比如
buoyantPimpleFoam
。东岳老师您可以稍微给我点这方面的例子或者资料吗?多谢多谢! -
并行计算结果与串行结果差异很大的问题问题
之前用OpenFOAM分块并行计算,并没有注意结果是否有问题。但是最近用并行计算三维模拟的时候出现了很大的问题,这才回头看看二维的情况。发现二维的串行与并行结果差异也是巨大。模拟结果中这个上升的plume结构都不一样了,如果probe某个节点再对比二者的演化值,肯定也是没法接受。下面两个图是并行和串行在1000 year的结果。
串行计算已经与别人的程序做过benchmark对比了,是完全没有问题的。这个并行与串行的差异问题希望有大佬分享一下经验,多谢!
- 串行结果
- 并行结果
算例说明
算例使用的求解器是自己写的见docker HydrothermalFoam。
串行和并行的所有设置都是一样的,下面贴上并行参数设置字典
FoamFile { version 2.0; format ascii; class dictionary; location "system"; object decomposeParDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // numberOfSubdomains 4; method scotch; simpleCoeffs { n (2 2 1); delta 0.001; } hierarchicalCoeffs { n (1 1 1); delta 0.001; order xyz; } manualCoeffs { dataFile ""; } distributed no; roots ( ); // ************************************************************************* //
边界条件
其中压力中的
noFlux
边界条件是自己定义的,其实与fixedFluxPressure
边界条件(U==0)的情况是一样的。FoamFile { version 2.0; format ascii; class volScalarField; object T; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // dimensions [0 0 0 1 0 0 0]; internalField uniform 278.15; //278.15 K = 5 C boundaryField { top { type inletOutlet; phi phi; inletValue uniform 278.15; } bottom { type fixedValue; value uniform 773.15; //placeholder } sidewalls { type zeroGradient; } } // ************************************************************************* //
FoamFile { version 2.0; format ascii; class volScalarField; object p; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // dimensions [1 -1 -2 0 0 0 0]; internalField uniform 250e5; boundaryField { top { type fixedValue; value uniform 250e5; } bottom { type noFlux; } sidewalls { type noFlux; } }
-
首个OpenFOAM的VS Code插件公开发布@张RP @Hungryandfool @沐风 喜欢就帮我来个five star😀,让它在vscode marketplace上活跃起来
-
首个OpenFOAM的VS Code插件公开发布-
这是个开源项目,有想法的或者有需要补充的,欢迎加入一起完善它,gitlab仓库地址:https://gitlab.com/vscode_extension/vscode-openfoam
-
如果发现什么bug或者有什么意见可以反馈到项目的issue tracker,尽量详细一些。issue tracker地址:https://gitlab.com/vscode_extension/vscode-openfoam/-/issues
-
-
fvm::ddt(rho, T)与rho*fvm::ddt(T)的区别@东岳 太感谢了!您这次来了一个非常透彻的分析,我的疑问已全部被解决。
-
传热计算中物性参数分段线性插值问题@书生kao 你这应该是有状态方程的吧?最简单的办法就是在solver里面直接写一个循环,求解完p T直接搞一个循环,根据状态方程或者你们的实验数据表更新更新每个element的热力学性质值。这种方法就是不通用,只适用于当前solver当前的科学问题,更通用的办法是自己写一个thermophysical lib。这两种方法我都有经验,经过了大半年的摸索,终于打通了😄 我猜你的问题跟我的很像,我是做hydrothermal模拟的,流体是纯水或者海水,而你的是石油和二氧化碳。从变成角度来看,框架是没有区别的
-
OpenFOAM算例文件代码高亮插件的悬停提示功能@东岳 对的,我也正在琢磨在cfd-online和stackoverflow上推一下的,此插件支持双语版本,根据用户的vscode界面语言选择使用中文还是英文显示
-
OpenFOAM算例文件代码高亮插件的悬停提示功能回复: 首个OpenFOAM的VS Code插件公开发布
@沐风 悬停提示,类似下图这样的效果 -
首个OpenFOAM的VS Code插件公开发布@沐风 我看了你说的这个帖子,好像跟我这个插件不是一回事儿呀。如果我没理解错,你推荐的这个帖子是进行OpenFOAM编程(写Solver的C++编程)的吧?这个VScode现成的插件已经非常强大了,我一直在用,代码高亮、跳转、自动补全非常棒的呀。我搞的这个插件是OpenFOAM进行case setup的时候,高亮显示OpenFOAM的字典文件什么的😂,有了语法高亮在进行算例设置的时候看着会舒服很多,还有后面我会添加命令的悬停提示功能,应该很有帮助。
-
首个OpenFOAM的VS Code插件公开发布@沐风 是的,目前这个VScode的代码高亮插件才刚开始,还很初步,只添加了我自己常用的一些命令的高亮。这是个开源项目,如果大家感兴趣或者觉得有用,可以参与一起完善。毕竟我个人的时间非常有限,目前只能倾向于我自己的使用。你推荐的帖子很有用,我会参考并想办法引进到vscode的插件中。
-
首个OpenFOAM的VS Code插件公开发布虽然目前市面上也有不少的开源的或商业的OpenFOAM的GUI软件,但是对于一个OpenFOAM深度用户而言,直接用文本编辑器进行操作是最方便最高效的。
而 VS Code 又是一款非常非常优秀的代码编辑器,那么对其进行语法高亮、智能提示以及代码片段功能就非常有用了,不仅颜值高而且平时码字的时候也会更高效。但是目前还没有发现 VS Code 上的相应插件可供使用。 作者就只能自己动手开发一枚了: vscode-OpenFOAM ,希望能对CFD中文社区做一点点小贡献😎VS code插件商店中的展示
安装
与其他的vscode扩展插件安装方法一样,直接在vscode的扩展管理中搜索
openfoam
直接进行安装即可。使用
因为OpenFOAM的各种字典文件和输入数据文件都没有扩展名,而vscode的语法高亮是通过代码文件的扩展名来判断语言的,所以我们需要在vscode的设置中配置
OpenFOAM
语言的探测规则,即通过files.associations
属性配置来完成,配置方法很简单。VScode的老用户可以忽略此步骤了。Code
->Preferences
->Settings
在用户Settings.json文件中添加红框所示的内容,可以直接从下面的代码中复制
"files.associations": { "*Dict": "OpenFOAM", "*Properties": "OpenFOAM", "fvSchemes": "OpenFOAM", "fvSolution": "OpenFOAM", "**/constant/g": "OpenFOAM", "**/0/*": "OpenFOAM" }
如此设置之后就可以看到你的OpenFOAM字典文件已经有了语法高亮,如下图所示:
1. Fields input data
2. thermophysicalProperties
3. blockMeshDict
4. fvSolution
后续工作
目前已经将大部分的关键词和变量(作者常用的)等进行了语法高亮显示,但是还有一些其他的有待添加。如果有需要的同学可以将自己的需求告诉我,我可以添加进去。各位大佬有什么建议,也可以告诉我哈
鼠标悬停提示
正在开发中....
代码自动补全
正在开发中...
-
fvm::ddt(rho, T)与rho*fvm::ddt(T)的区别假设我又一个这样的方程:
$$\frac{\partial( \rho T)}{\partial t} = -\nabla \cdot (\vec{U}\rho T)$$其中$\rho$表示流体(比如水)的密度,根据状态方程及p,T计算出来。请问在离散的时候下面这两种写法的结果有什么区别?
-
fvm::ddt(rho, T) == -fvm::div(phi,T);
-
rho*fvm::ddt(T) == -fvm::div(phi,T);
-
-
OpenFOAM中随时间变化的属性设置背景:孔隙流求解器中有一个volScalarField permeability类型的量表示孔隙介质的渗透率,一般都是在0文件夹下给定permeability的边界条件和初始条件(渗透率并不需要求解,所以边界条件其实没有什么用,就是个占位符)。如果我想让这个permeability随时间变化(比如k=k0+t*10^-20),怎么实现?
随时间变化的边界条件好设置,就是不知道如何设置随时间变化的场值?哪位大神有这个经验,求赐教,不胜感激!
-
请教:buoyantBoussinesqPimpleFoam边界条件设置@东岳 帖子好像沉掉了,再次求助李老师。主要就是顶部边界条件不知道怎么设置,顶部是定压,也就是P是恒定的,但是流体可以自由出入。而方程中求解的是prgh,所以不知道prgh如何设置边界条件了,可能还需要与出口的速度边界条件保持一致性
-
请教:buoyantBoussinesqPimpleFoam边界条件设置@random_ran 原来的求解器的
alphaEff
好像是根据湍流模型计算出来的,具体细节还没搞懂。我在原来求解器算例的求解过程中输出了这个量,发现是0.001,是个常数。从量纲来看应该与热传导系数/密度/比热
相同,我就在修改后的求解器中暂用DT/cp_f/rho0_f
代替了。而
==
后面的应该是与源项有关的东西,我这里没有其他热源,所以就去掉了,不知道是不是会有别的影响。(我在原来求解器和BenardCells算例基础上测试了,去掉这一项对结果没有什么影响)看结果好像是不能够有效地从底边界传热,不知道是不是边界条件设置的问题,还是其他什么原因
-
请教:buoyantBoussinesqPimpleFoam边界条件设置@random_ran 是的,温度跟想象的不一样。
我试了底边界温度如果太低的话短时间内几乎不会有plume splitting,所以试了一下更高的温度。
我这里的温度单位都是摄氏度。这个我是从原来的求解器基础上改的,用自带的算例BenardCells一步一步测试,求解器简化后对这个算例的结果并没有什么影响,所以我猜求解器修改应该没错。