计算流体和OpenFoam

cfdren 2021-09-04 原文

从硕士的计算数学到现在的流体的应用数学,算来也有五年的时间了.一直希望能寻找一个半专业的软件可以做计算流体的学习和研究.

所谓半专业,是说一方面我们可以很傻瓜的如ansys,fluent那样,使用他们的模型直接进行数值模拟,另一方面我们又可以很轻易的修改模型.构建自己的模型.编写自己的算法.

所以第一次接触OpenFoam时,就被她完全的吸引了.如此的贴和我的要求.更有魅力的是,她是一个开源软件,展现给我们的不仅仅是cfd,更是一种编写模拟软件的教程.

甚至我们自己可以试着学习怎么去开发这样的大型数值计算软件.

下面的例子来源于苏军伟博士的新浪博客,及我们园区的浪子禾月.

例:OpenFOAM>>solver>>basic>>laplacianFoam

//createFields.H

/************************************************/

  1. //-屏幕提示。Info 等价于 C++中std::cout,Info间接调用cout
  2. Info<< "Reading field T\n" << endl;
  3. //这是一个类的初始化.volScalarField 类T对象的初始化.
  4. //-声明一个标量场,网格中心存储变量。该场是通过读入文件(IOobject and MUST_READ)进行设置,并根据controlDict中的设置进行自动write,由write.H中的runTime.write()来执行write();。
  5. volScalarField T
  6. (
  7. IOobject
  8. (
  9. "T",  //对应case根目录下的目录T,是数据存储的方式
  10. runTime.timeName(),// T目录下的时间名称, 初始的是0目录,
  11. mesh,   
  12. IOobject::MUST_READ,
  13. IOobject::AUTO_WRITE
  14. ),
  15. mesh
  16. );
  17. //- 提示读入参数控制文件
  18. Info<< "Reading transportProperties\n" << endl;
  19. //- 参数控制文件声明过文件形式读入
  20. IOdictionary transportProperties
  21. (
  22. IOobject
  23. (
  24. "transportProperties", //文件名字
  25. runTime.constant(), //文件位置,case文件夹中constant子文件夹
  26. mesh,
  27. IOobject::MUST_READ,//通过read一个文件,初始化
  28. IOobject::NO_WRITE //并不根据时间对文件进行写
  29. )
  30. );
  31. //-提出读入扩散律
  32. Info<< "Reading diffusivity DT\n" << endl;
  33. //-通过查询参数控制文件,初始化带有单位的标量,lookup中的“DT”为关键字
  34. dimensionedScalar DT
  35. (
  36. transportProperties.lookup("DT")
  37. );

//laplacianFoam.C (OpenFoam2.4.0)

  1. 1 #include "fvCFD.H"//-cfd头文件,包括大多数cfd计算需要的头文件,在src » finiteVolume » cfdTools » general » include
  1. 2 #include "simpleControl.H"
    3
    4 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
    5
    6 int main(int argc, char *argv[])
    7 {
    8 #include "setRootCase.H"
    9
    10 #include "createTime.H"
    11 #include "createMesh.H"
    12 #include "createFields.H"
    13
    14 simpleControl simple(mesh);
    15
    16 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
    17
    18 Info<< "\nCalculating temperature distribution\n" << endl;
    19
    20 while (simple.loop())
    21 {
    22 Info<< "Time = " << runTime.timeName() << nl << endl;
    23
    24 while (simple.correctNonOrthogonal())
    25 {
    26 solve
    27 (
    28 fvm::ddt(T) - fvm::laplacian(DT, T)
    29 );
    30 }
    31
    32 #include "write.H"
    33
    34 Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
    35 << " ClockTime = " << runTime.elapsedClockTime() << " s"
    36 << nl << endl;
    37 }
    38
    39 Info<< "End\n" << endl;
    40
    41 return 0;
    42 }

 





  1. 1 #include "fvCFD.H" //-cfd头文件,包括大多数cfd计算需要的头文件,在src » finiteVolume » cfdTools » general » include
  2. 2
  3. 3
  4. 4 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
  5. 5 //主程序入口
  6. 6 int main(int argc, char *argv[])
  7. 7 {
  8. 8 //设置rootcase,根据输入参数argc 和 argv对
  9. 9 # include "setRootCase.H"
  10. 10
  11. 11 //-创建时间,下面的runTime控制
  12. 12 # include "createTime.H"
  13. 13
  14. 14 //创建网格,根据constant文件中polyMesh文件夹中的网格数据,创建网格对象mesh,位于src » OpenFOAM » include
  15. 15 # include "createMesh.H"
  16. 16
  17. 17 //创建场对象,在前面已经说明
  18. 18 # include "createFields.H"
  19. 19
  20. 20 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
  21. 21 //提示计算温度分布
  22. 22 Info<< "\nCalculating temperature distribution\n" << endl;
  23. 23 //计算主控制流程
  24. 24 for (runTime++; !runTime.end(); runTime++)
  25. 25 {
  26. 26 //提示当前计算时间
  27. 27 Info<< "Time = " << runTime.timeName() << nl << endl;
  28. 28 //读入simple算法参数,位于
  29. 29
  30. 30 src » finiteVolume » cfdTools » general » include
  31. 31
  32. 32 # include "readSIMPLEControls.H"
  33. 33 //对于网格非正交循环修正。
  34. 34 for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
  35. 35 {
  36. 36 //求解拉普拉斯方程,这里的solve是Foam空间的全局函数,内参数为fvMatrix,fvm表示隐式离散,返回有限容积稀疏矩阵类fvMatrix对象,具体对象中内容,以后说明
  37. 37 solve
  38. 38 (
  39. 39 fvm::ddt(T) - fvm::laplacian(DT, T)
  40. 40 );
  41. 41 }
  42. 42 //对求解变量进行写
  43. 43 # include "write.H"
  44. 44 //提示执行时间及CPU耗时
  45. 45 Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
  46. 46 << " ClockTime = " << runTime.elapsedClockTime() << " s"
  47. 47 << nl << endl;
  48. 48 }
  49. 49 //提示程序结束
  50. 50 Info<< "End\n" << endl;
  51. 51
  52. 52 return(0);
  53. 53 }

//write.H

  1. 1 if (runTime.outputTime())
  2. 2 {
  3. 3 volVectorField gradT = fvc::grad(T); //计算温度梯度,向量场
  4. 4
  5. 5 //声明3个变量,分别以gradT的三个方向的分量进行初始化。
  6. 6
  7. 7 volScalarField gradTx
  8. 8 (
  9. 9 IOobject
  10. 10 (
  11. 11 "gradTx", //变量名字
  12. 12 runTime.timeName(), //位置
  13. 13 mesh, //mesh,主要用于对象注册,根据runTime进行写
  14. 14 IOobject::NO_READ, //
  15. 15 IOobject::AUTO_WRITE //自动写
  16. 16 ),
  17. 17 gradT.component(vector::X) //用场初始话,vector::X 枚举变量,可直接写0 //gradT.component(0)
  18. 18 );
  19. 19
  20. 20 volScalarField gradTy
  21. 21 (
  22. 22 IOobject
  23. 23 (
  24. 24 "gradTy",
  25. 25 runTime.timeName(),
  26. 26 mesh,
  27. 27 IOobject::NO_READ,
  28. 28 IOobject::AUTO_WRITE
  29. 29 ),
  30. 30 gradT.component(vector::Y)
  31. 31 );
  32. 32
  33. 33 volScalarField gradTz
  34. 34 (
  35. 35 IOobject
  36. 36 (
  37. 37 "gradTz",
  38. 38 runTime.timeName(),
  39. 39 mesh,
  40. 40 IOobject::NO_READ,
  41. 41 IOobject::AUTO_WRITE
  42. 42 ),
  43. 43 gradT.component(vector::Z)
  44. 44 );
  45. 45
  46. 46 //对场进行写
  47. 47 runTime.write();
  48. 48 }

我们重点分析C文件

//laplacianFoam.C (OpenFoam2.4.0)

  1. 1 #include "fvCFD.H"//-cfd头文件,包括大多数cfd计算需要的头文件,在src » finiteVolume » cfdTools » general » include
  1. 2 #include "simpleControl.H"
    3
    4 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
    5
    6 int main(int argc, char *argv[])
    7 {
    8 #include "setRootCase.H"
    9
    10 #include "createTime.H"
    11 #include "createMesh.H"
    12 #include "createFields.H"
    13
    14 simpleControl simple(mesh);
    15
    16 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
    17
    18 Info<< "\nCalculating temperature distribution\n" << endl;
    19
    20 while (simple.loop())
    21 {
    22 Info<< "Time = " << runTime.timeName() << nl << endl;
    23
    24 while (simple.correctNonOrthogonal())
    25 {
    26 solve
    27 (
    28 fvm::ddt(T) - fvm::laplacian(DT, T)
    29 );
    30 }
    31
    32 #include "write.H"
    33
    34 Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
    35 << " ClockTime = " << runTime.elapsedClockTime() << " s"
    36 << nl << endl;
    37 }
    38
    39 Info<< "End\n" << endl;
    40
    41 return 0;
    42 }

 10-12行我们建立了场的网格,即我们将向量附着在了几何空间上,形成了一个场.也就是说,目前我们有了数学上所描述的温度场T.此时,T还没有任何东西,是0标量场.

发表于
2015-11-23 09:51 
zDEX 
阅读(576
评论(0
编辑 
收藏 
举报

 

版权声明:本文为cfdren原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/cfdren/p/4987501.html

计算流体和OpenFoam的更多相关文章

随机推荐

  1. JSP页面怎样导入优酷视频

    我在做的一个项目里面,应客户要求。要导入视频。然后我再考虑,视频是直接放在本地数据库的话,那么肯定会出现数据视 […]...

  2. HBase源码分析之WAL – 张冲andy

    HBase源码分析之WAL WAL(Write-Ahead Logging)是数据库系统中保障原子性和持久性的 […]...

  3. 《机器人操作系统(ROS)浅析》肖军浩译

    PDF下载地址: 链接:https://pan.baidu.com/s/1l_FAbn_g04q-Z0lKSx […]...

  4. 页面表格中长英文字符串不能自动换行的问题 – 七七2020

    页面表格中长英文字符串不能自动换行的问题 有时候一个单元格中是一个长英文单词,或者英文名称加单位过长,单元格不 […]...

  5. 深入理解对象的数据属性与访问器属性

    创建对象的方式有两种:第一种,通过new操作符后面跟Object构造函数,第二种,对象字面量方式。如下 var […]...

  6. 京东万象数据接口,钱没花完,接口404,客服是白痴,无法维权

    由于业务需求,买了一个银行卡信息查询的接口。就是考虑到免费的接口容易挂,聚合等平台感觉小了,爬麻烦,于是找到了 […]...

  7. 【STM32-V6】STM32F429BIT6开发板开源, 丰富软件资源, 强劲硬件配置, 配套600多实例,21套手册持续更新中2022-02-20

    淘宝购买地址:淘宝购买链接 从2016年1月份发布至今,软件资料更新过101次。当前标准库最新版本V2.5,H […]...

  8. Spring,SpringMvc配置常见的坑,注解的使用注意事项,applicationContext.xml和spring.mvc.xml配置注意事项,spring中的事务失效,事务不回滚原因

    Spring,SpringMvc配置常见的坑,注解的使用注意事项,applicationContext.xml […]...