请选择 进入手机版 | 继续访问电脑版
  采纳网友的建议,这次讨论OpenFOAM中非均匀初始场设置问题。 对于openfoam非均匀场初始化现成程序有两个: 1)OpenFOAM自带功能setFields 2)社区中的funkySetFields. 下面介绍一下两者的使用。
  1 setFields的使用
  使用setFields只需要将system文件夹中建立setFieldsDict,然后在其中设置相应的参数,设置完后,在case根目录下利用控制台输入setFields就可以了。 下面介绍一下interFoam算例中的setFieldsDict.该字典位置在
  OpenFOAM-1.6/tutorials/multiphase/interFoam/laminar/damBreak/system/setFieldsDict,文件中的内容为
  FoamFile //文件头
  {
  version 2.0;
  format ascii;
  class dictionary;
  location "system";
  object setFieldsDict;
  }
  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
  defaultFieldValues //用来设定场的默认值
  (
  volScalarFieldValue alpha1 0 // 设置场alpha1的默认值
  );
  regions //设置alpha1不为0 的区域
  (
  boxToCell // 方形区域内的cell
  {
  box (0 0 -1) (0.1461 0.292 1); //方形区域的边界,两点xyz最小点和xyz最大点
  fieldValues //用来指定定值
  (
  volScalarFieldValue alpha1 1 //用来alpha1场在上面box区域内的值的大小
  );
  }
  );
  setFields对于规则区域定值使用比较方便,但是很难实现比较复杂内部场的设置,比如满足某种关系式的内部场设置。
  2 funkySetFields的使用
  用来设定比较复杂的内部场。 可以指定满足一定条件的关系式的初始场。
  2.1 软件的获取
  funkySetFields在官方或者dev版本里面都没有该功能,可以通过下面命令获取。运行下面的命令需要你的电脑安装svn。
  svn checkout https://openfoam-extend.svn.sour ... ing/FunkySetFields/
  2.2 软件的安装 该软件安装比较简单,直接进入该文件夹,并运行Allwmake ./Allwmake 2.3 使用2.3.1 常用关键字
  field //用来指定要修改的场
  expression_r //用来指定表达式
  condition //用来指定上述表达式应当满足的条件
  keepPatches //用来说明是否保持原来边界条件,最好加上,不加的话,funkySetField会给所有边界为0梯度
  create //用来说明是否是新建场
  valuePatches //用来指定那些定值边界由临近内部节点值给定
  dimension //用来指定新建立场的单位
  time //用来指定funkySetField所指定的时间点
  应当指出,上述关键字可以直接在控制台上输,也可以写在名字为funkySetFieldsDict(类似于setFieldsDict)中。
  2.3.2 使用方法
  方法1 直接在控制台输入
  直接进入你要初始话的case中,输入类似于下面的命令。 如上面的setField也可以通过下面的funkySetFields命令来实现
  funkySetFields -time 0 -keepPatches -field alpha1 -expression_r "1" -condition "pos().x <= 0.1461 && pos().y <= 0.292"注意比较长的式子用单引号或者双引号隔开。 上述关键字没有次序要求。
  方法2 使用funkySetFieldsDict字典
  方法和上面setFields差不多,在system文件夹中建立funkySetFieldsDict字典文件,对于上面表达式可以通过下面字典文件实现。
  expression_rs //设置复杂内部边界入口 ( alpha // 设置alpha1,名字任意{ field alpha1; //操作的场expression_r "1"; //表达式condition "pos().x <= 0.1461 && pos().y <= 0.292" ;//执行上述表达式的条件keepPatches true; //是否保持以前边界} pressure1 //设置压力,名字任意{ field p; //指定操作场expression_r "10.*(0.1-pos().y)"; //执行表达式子,无条件 } pressure2 { field p; 指定表达式expression_r "p+U&U"; //表达式子 condition "pos().x > (max(pos().x)-min(pos().x))/2"; //条件} );从上面可以看出,使用funkySetFieldsDict可以实现更为复杂内部场,且可以同时对多个场进行操作2.3.3 表达式中的常用支持也许你已经注意到,上面例子中condition和expression_r使用了表达式,funkySetFields中你可以使用下列常用的操作符或者函数
  1) C++基本操作符
  +,-,*,/,%, <,>,<=,>=,!=,==, &&,||,? :
  2)OpenFOAM定义的向量操作符
  &,^
  3)圆周率常量
  pi
  4)标量函数
  pow,log,exp,sqr,sqrt,sin,cos,tan
  5)OpenFOAM中的一些函数
  mag:求模
  grad :求标量梯度
  curl :求向量旋度
  snGrad:表面法向剃度
  div :向量场散度
  laplaction :求一个场的laplacian项目
  min,max :标量场的最值
  pos :网格中心位置矢量
  fpos :面中心位置矢量
  face :表面法向量场
  area:表面面积场
  vol :网格单元体积场
  deltaT :时间步长
  time :当前时间
  setFields和funkySetField可以实现比较复杂的内部场初始化,而对于复杂的边界场,你要自定义边界条件了。
  要不要试一下?

回复

使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Powered by Discuz! X3.4  © 2001-2013 Comsenz Inc.