前言:很多人说OpenFOAM很难,要啃上很多的理论书籍,什么流体力学、计算流体力学、矩阵理论、线性代数、数值计算、C++程序设计神马的,看看光这一堆书就能吓倒绝大多数的人。其实我们并不一定要从这些基础的东西入手,我觉得要学习使用一个工具,首先使它运转起来才是最靠谱的。通过大量实例练习,做多了自然就能有所感悟。

前面讲到了利用icoFoam求解器计算弯曲管道中流体混合问题。现在来自己动手做一个简单的案例,还是利用icoFoam求解器。icoFoam求解器计算的是瞬态不可压层流流动问题,是OpenFOAM中最简单的求解器之一。

关于此求解器内部实现原理,我们以后再慢慢剖析,一开始就讲一大堆的公式推导会吓坏小朋友的。闲话少说,我们来开始我们的案例。

案例描述

一个非常简单的管道流动问题。我们不强调问题多复杂,只关注OpenFOAM解决问题的思路。

流体流经一个直径0.01m,长度0.5m的管道,计算其内部流场。流体介质为水,密度1000kg/m3,动力粘度0.001 pa.s,入口流速0.1 m。

雷诺数:

\[Re= \frac{\rho u D}{\mu} = \frac{1000 \times 0.1 \times 0.01}{0.001} =1000
\]

几何及网格如图所示。在ICEM CFD中创建几何并划分网格,各边界命名如图所示。生成并输出网格pipe.msh。

OpenFOAM准备

本案例采用icoFoam求解器进行求解。因此先从tutorials文件夹中拷贝一个icoFoam模板,我们这里还是使用前面的elbow文件夹。

在此之前,先创建一个工作文件夹。我用命令在run路径下创建文件夹pipe。

  1. mkdir $FOAM_RUN/pipe

之后利用命令copy一个elbow文件夹到pipe下面。

  1. cp -r $FOAM_TUTORIALS/incompressible/icoFoam/elbow/ $FOAM_RUN/pipe

这样的话,pipe文件夹下就有了elbow文件夹。如果有洁癖的话,可以把elbow文件夹命名为pipe,或者把elbow文件夹下的文件copy到pipe文件夹下,然后删除掉elbow。这里懒得折腾,直接进入到elbow路径下,并把前面生成的pipe.msh文件拷贝到elbow文件夹下。

网格转换

进入到elbow目录下,利用命令:

  1. fluentMeshToFoam pipe.msh

此命令将网格pipe.msh转化为OpenFOAM能够识别的网格文件。

elbow目录如下所示:

  1. ├── 0
  2. ├── p
  3. └── U
  4. ├── Allclean
  5. ├── Allrun
  6. ├── constant
  7. ├── polyMesh
  8. ├── boundary
  9. ├── cellZones
  10. ├── faces
  11. ├── faceZones
  12. ├── neighbour
  13. ├── owner
  14. ├── points
  15. └── pointZones
  16. └── transportProperties
  17. ├── elbow.msh
  18. ├── pipe.msh
  19. └── system
  20. ├── controlDict
  21. ├── foamDataToFluentDict
  22. ├── fvSchemes
  23. └── fvSolution
  24. 4 directories, 19 files

此时可以查看polyMesh文件夹下的boundary文件。文件内容为:

  1. FoamFile
  2. {
  3. version 2.0;
  4. format ascii;
  5. class polyBoundaryMesh;
  6. location "constant/polyMesh";
  7. object boundary;
  8. }
  9. // * * * * * * * * * * * * * * //
  10. 3
  11. (
  12. INLET
  13. {
  14. type patch;
  15. nFaces 288;
  16. startFace 210864;
  17. }
  18. OUTLET
  19. {
  20. type patch;
  21. nFaces 288;
  22. startFace 211152;
  23. }
  24. WALL
  25. {
  26. type wall;
  27. inGroups 1(wall);
  28. nFaces 7968;
  29. startFace 211440;
  30. }
  31. )

检查文件边界名称分别为:INLET、OUTLET以及WALL。这些是我们在ICEM CFD中定义的Part名称。此文件不需要修改。

设置p文件与U文件

0文件夹中包含有p文件和U文件。

先利用命令打开p文件,删除一些没用的边界,修改其内容为:

  1. FoamFile
  2. {
  3. version 2.0;
  4. format ascii;
  5. class volScalarField;
  6. object p;
  7. }
  8. // * * * * * * * * * * * * //
  9. dimensions [0 2 -2 0 0 0 0];
  10. internalField uniform 0;
  11. boundaryField
  12. {
  13. INLET
  14. {
  15. type zeroGradient;
  16. }
  17. OUTLET
  18. {
  19. type fixedValue;
  20. value uniform 0;
  21. }
  22. WALL
  23. {
  24. type zeroGradient;
  25. }
  26. }

再打开U文件,修改其内容为:

  1. FoamFile
  2. {
  3. version 2.0;
  4. format ascii;
  5. class volVectorField;
  6. object U;
  7. }
  8. // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
  9. dimensions [0 1 -1 0 0 0 0];
  10. internalField uniform (0 0 0);
  11. boundaryField
  12. {
  13. INLET
  14. {
  15. type fixedValue;
  16. value uniform (0.1 0 0);
  17. }
  18. OUTLET
  19. {
  20. type zeroGradient;
  21. }
  22. WALL
  23. {
  24. type noSlip;
  25. }
  26. }

这里修改INLET边界的速度为x方向0.1 m/s。

修改transportProperties文件

此文件中设置一些常数项,本案例只需要设置运动粘度即可。

  1. FoamFile
  2. {
  3. version 2.0;
  4. format ascii;
  5. class dictionary;
  6. location "constant";
  7. object transportProperties;
  8. }
  9. // * * * * * * * * * * * * * * * * * * * * * * * //
  10. nu [0 2 -1 0 0 0 0] 1e-6;

注意这里设置的是运动粘度,其量纲单位是m2/s。

设置controlDict文件

打开controlDict文件

  1. FoamFile
  2. {
  3. version 2.0;
  4. format ascii;
  5. class dictionary;
  6. location "system";
  7. object controlDict;
  8. }
  9. // * * * * * * * * * * * * * * * * //
  10. application icoFoam;
  11. startFrom latestTime;
  12. startTime 0;
  13. stopAt endTime;
  14. endTime 20;
  15. deltaT 0.05;
  16. writeControl timeStep;
  17. writeInterval 20;
  18. purgeWrite 0;
  19. writeFormat ascii;
  20. writePrecision 6;
  21. writeCompression off;
  22. timeFormat general;
  23. timePrecision 6;
  24. runTimeModifiable true;
  25. functions
  26. {
  27. #includeFunc residuals
  28. }

计算

回到elbow目录下,运行命令:

  1. icoFoam

也可以用并行计算:

  1. mpiexec -n 6 icoFoam

利用6个cpu进行计算。

此时可以利用命令监测残差:

  1. foamMonitor -l postProcessing/residuals/0/residuals.dat

注意:此方法是建立在已安装gnuplot的基础之上,否则是看不到残差的。我的机器上blueCFD使用此命令出错,但是在虚拟机中用OpenFOAM没有任何问题,我不清楚是gnuplot没安装好还是其他什么原因。看不到残差曲线的,将就着看输出的数据好了。

后处理

输入命令:

  1. paraFoam

软件自动启动ParaView,可观察剖面上速度分布云图,如图所示。


更多关于CFD内容,可微信扫描下方二维码关注微信公众号。

【OpenFOAM案例】02 自己动手的更多相关文章

  1. web综合案例02

    web综合案例02 web综合案例02 web综合案例02 ... ... 内容待添加

  2. 【OpenFOAM案例】01 elbow

    本案例演示利用OpenFOAM的icoFoam求解器计算弯曲管道中的混合流动问题. 1 拷贝tutorials文件 启动终端,且拷贝tutorials文件夹中的文件.利用命令: cp -r $FOAM ...

  3. 【一起学OpenFoam】02 软件准备

    "工欲善其事必先利其器",在利用OpenFoam解决我们的工程问题之前,首先要做的事情是搭建一个OpenFoam运行环境.很遗憾的是,OpenFoam的原生开发系统是Linux,因 ...

  4. SaltStack 部署案例 02

    远程执行 salt '*' state.sls apache '*':代表所有主机 state.sls :是一个模块 apache : 状态 ,表示需要部署的内容,后缀.sls YAML:三板斧 1. ...

  5. 【OpenFOAM案例】03 Docker安装OpenFOAM

    "工欲善其事必先利其器",软件装不上,讲再多的使用技巧也是白搭.近期不少留言说OpenFOAM不容易安装,今天来谈谈如何在Linux下利用Docker安装OpenFOAM. Lin ...

  6. Java基础知识强化之IO流笔记41:字符流缓冲流之复制文本文件案例02(使用 [ newLine() / readLine() ] )(重要)

    1. 使用字符流缓冲流的特殊功能 [ newLine() / readLine() ] 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中  数据源: a.txt -- 读取数据 ...

  7. 【Spark深入学习 -12】Spark程序设计与企业级应用案例02

    ----本节内容------- 1.遗留问题答疑 1.1 典型问题解答 1.2 知识点回顾 2.Spark编程基础 2.1 Spark开发四部曲 2.2 RDD典型实例 2.3 非RDD典型实例 3. ...

  8. Java课程课后作业02之动手动脑

    一.编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数 数学算法原理: 可以使用的方法:Math中的random类以及random类,区别:Math中的random类只能用于生成随机数 ...

  9. MySQL案例02:ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES

    MySQL在授权用户时出现报错信息,具体信息如下: 一.错误信息 执行命令: GRANT SELECT,INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SH ...

随机推荐

  1. 动画库NineOldAndroids

    动画库NineOldAndroids   NineOldAndroids组件是一个向下兼容的动画库,主要是使低于API 11的系统也能够使用View的属性动画.该动画库支持旋转.移动.透明渐变.缩放等 ...

  2. 南阳325----zb的生日

    //重量太大,用01背包容易超时 //数据只有20组.可以用dfs搜索最优解 #include<stdio.h> ]; int maxs,n,s; void dfs(int,int); i ...

  3. npm、webpack、vue-cli 快速上手版

    Node.js   npm 什么是Node.js  以及npm 简单的来说 Node.js 就是运行在服务端的JavaScript,基于Chrome V8 引擎的. npm 是Node.js 的包管理 ...

  4. Django之auth组件

    Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...

  5. 在UnrealEngine中用Custom节点实现高斯模糊

    3x3高斯模糊 //input sW 分辨率宽 //input sH 分辨率高 //input NotUse 为了开启SceneTextureLookup函数而连接的节点,但是不参与逻辑 //inpu ...

  6. MySQL firstmatch strategy

    在探讨subquery如 x IN (SELECT XX FROM TABLE)这样的形式的MATCH策略时,不是很清楚实现过程.在网上搜了一下, 地址:http://stackoverflow.co ...

  7. 11.6 正睿停课训练 Day17

    目录 2018.11.6 正睿停课训练 Day17 A chinese(思路 计数) B physics(单调队列/剪枝 DP) C chemistry(期望 DP) 考试代码 A B C 2018. ...

  8. python基础一 ------可迭代类型的连接

    对可迭代迭代进行连接,返回一个可迭代对象 两种方式: 并行连接 zip() 串行连接 itertools.chain from itertools import chain #并行连接 print(& ...

  9. [PA2014]Muzeum

    [PA2014]Muzeum 题目大意: 有\(n\)件展品和\(m\)个警卫,每件展品有一个坐标\((x_i,y_i)\)和价值\(v_i\),每个警卫的坐标为\((x_i,y_i)\).每个警卫面 ...

  10. setdest 和cbrgen工具的使用,出现的错误

    在路径 ~/ns-2.34/indep-utils/cmu-scen-gen/setdest下运行 ./setdest -n 250 -p 0.0 -M 10.0 -t 10 -x 1500 -y 1 ...