以一个简单案例描述PhengLEI的使用流程。
本案例模型及参数均为PHengLEI自带,且参数设置过程为《风雷软件应用与开发指南》中所描述。PHengLEI拥有比较齐全的文档描述,其包含一个344页的说明文档,涵盖了求解器应用中的参数设置说明以及代码开发指南。
1 准备工程
-
将PHengLEI项目路径下的examples文件夹中的 bin及grid
文件夹以及编译完成的PHengLEI可执行文件拷贝到工程文件夹
为方便后面程序调用,将PHengLEIv3d0.exe改名为PHengLEI.exe。
-
清空grid文件夹中的内容,将网格文件拷贝到grid文件夹中。
PHengLEI支持cgns格式的网格文件,也支持Fluent的cas文件(ASCII格式保存)。另外也支持一些小众网格文件格式(如Plot3D的grd、FieldView的uns等),不过很多主流网格生成软件支持cgns格式。个人觉得如果能支持Fluent的msh格式(包括新版本的h5)格式会更好一些,这样就省的去转换了。
此时文件夹组织形式如下图所示。
其中bin
文件夹中放置计算参数配置文件,grid
文件夹中放置网格相关文件。进行计算后还会产生一个名为result
的文件夹,其中放置结果数据文件。可执行文件PHengLEI.exe
放在这些文件夹的外部。
2 前处理
30P30N结构网格如图4-2所示,计算域为x方向20倍弦长、y方向20倍弦长。网格单元总数为133568,壁面第一层网格约为1.0E-05m。
2.1 网格转换
在进行计算之前,PHengLEI需要对网格进行转换,将网格类型转换成fts格式的文件。同时还需要对网格进行分区。
这里比较困惑的地方在于,为啥非要将其他网格类型转换成fts格式的文件,不能直接将网格数据读入内存中么?
”
PHengLEI的所有配置文件都放置在bin
文件夹中。其中key.hypara
文件是主控文件,需要先修改此文件内容。
默认的key.hypara
文件内容如下所示。
string title = "PHengLEI Main Parameter Control File";
// IMPORTANT NOTICE: DON NOT MODIFY THE FOWLLOWING LINE.
string defaultParaFile = "./bin/cfd_para.hypara";
// ndim: Dimensional of the grid, 2 or 3.
// nparafile: the number of parameter files.
// nsimutask: simulation task type.
// 0 -- CFD Solver of NS or Turbulation.
// 1 -- Grid generation: for special typical cases, such as cylinder, flat plate, etc.
// Grid conversion: from other format to PHengLEI format (.fts).
// Grid reconstruction: such as grid adaptation.
// Grid merging: merge two blocks into one block.
// Grid repairing: repair the original grid in order to remove the negative volume cells.
// 2 -- Wall distance computation for turb-solver.
// 3 -- Grid partition.
int ndim = 2;
int nparafile = 1;
//int nsimutask = 0;
//string parafilename = "./bin/cfd_para_subsonic.hypara";
//string parafilename = "./bin/cfd_para_transonic.hypara";
//string parafilename = "./bin/cfd_para_supersonic.hypara";
//string parafilename = "./bin/cfd_para_hypersonic.hypara";
//string parafilename = "./bin/cfd_para_incompressible.hypara";
int nsimutask = 1;
string parafilename = "./bin/grid_para.hypara";
//int nsimutask = 2;
//string parafilename = "./bin/cfd_para.hypara";
//int nsimutask = 3;
//string parafilename = "./bin/partition.hypara";
//int nsimutask = 1;
//string parafilename = "./bin/grid_deform_para.hypara";
//int nsimutask = 1;
//string parafilename = "./bin/grid_refine_para.hypara";
//int nsimutask = 14;
//string parafilename = "./bin/integrative_solver.hypara";
//int nsimutask = 99;
//string parafilename = "./bin/post_processing.hypara";
// ---------------- Advanced Parameters, DO NOT care it ----------------
int numberOfGridProcessor = 0;
// ATP read
//@string parafilename1 = ""
//@string parafilename2 = "";
根据注释内容来修改文件内容。
key.hypara
文件修改完毕后如下所示。
// key.hypara文件
// 标题,可以随便改
string title = "PHengLEI Main Parameter Control File";
// 指定默认参数文件,一般保持不变
string defaultParaFile = "./bin/cfd_para.hypara";
// 指定网格维度,二维或三维
int ndim = 2;
// 指定参数文件的数量
int nparafile = 1;
// 指定仿真任务类型,值为1表示网格操作
int nsimutask = 1;
// 指定参数文件路径
string parafilename = "./bin/grid_para.hypara";
// 高级参数,保持默认不变
int numberOfGridProcessor = 0;
在key.hypara
文件中使用了参数文件grid_para.hypara
,因此可以修改此文件的参数。
// grid_para.hypara文件
// 网格文件类型,值为1表示为结构网格
int gridtype = 1;
// 轴旋转次数,0表示无旋转
int nAxisRotateTimes = 0;
// 轴旋转次序,1、2、3分别表示x、y、z轴
int axisRotateOrder[] = [1, 2, 3];
// 轴旋转角度
double axisRotateAngles[] = [0.0, 0.0, 0.0];
// 原始网格类型,值为2表示使用的是cgns网格
int from_gtype = 2;
// 源网格路径
string from_gfile = "./grid/30p30n.cgns";
// 目标网格路径
string out_gfile = "./grid/30p30n.fts";
文件准备完毕后,可以使用下面的命令转换网格。
mpiexec -n 4 ./PHengLEI.exe
如图所示。
软件会自动将cgns文件转换为fts文件。如下图所示。
2.2 边界信息
可以在bin
文件夹中打开文件boundary_condition.hypara
查看边界信息。如下图所示。此处可以根据计算需要对其进行修改。
本案例网格是在Pointwise中生成的,在网格输出之前已经对边界类型进行了指定,因此可以保持此文件不变。
2.3 网格分区
若想要采用并行计算,需要对网格进行分区。
-
修改 key.hypara
文件
修改文件内容:
string title = "PHengLEI Main Parameter Control File";
string defaultParaFile = "./bin/cfd_para.hypara";
int ndim = 2;
int nparafile = 1;
// 指定任务类型,值为3表示网格分区
int nsimutask = 3;
// 指定网格分区配置文件路径
string parafilename = "./bin/partition.hypara";
这里key.hypara文件被多次修改,相当的不友好。个人建议不同的任务采用不同的配置文件可能更利于工程项目保存。比如想要给别人移交工程算力,这个key文件还得做好几次备份,别人使用的时候还得改名。
”
-
修改 partition.hypara
文件
// 网格类型,值为1表示是结构网格
int pgridtype = 1;
// 处理器数量,建议1个CPU处理5~10万结构网格,3~7万非结构网格
int maxproc = 4;
// 原始网格文件路径
string original_grid_file = "./grid/30p30n.fts";
// 目标网格文件路径
string partition_grid_file = "./grid/30p30n_str__4.fts";
// 多重网格级数,一般用于结构网格
int numberOfMultigrid = 2;
文件修改完毕邠刚保存后,可以运行命令:
mpiexec -n 1 ./PHengLEI.exe
此时grid
文件夹如下图所示。
分区后的网格文件名除了添加的分区标识( __4 )之外,会自动加上当前的进程号,因为此处的结构网格分区是串行,单进程,所以文件会自动加 _0 ;因为程序中自动加上当前进程号( _0 ),所以在参数设置的过程中不需要考虑进程的问题,只需要根据网格文件的名称和路径以及分区数设置参数即可。
3 求解设置
指定求解计算参数。
-
修改 key.hypara
文件
修改文件内容为:
string title = "PHengLEI Main Parameter Control File";
string defaultParaFile = "./bin/cfd_para.hypara";
// 网格维度,这里为2D
int ndim = 2;
// 配置文件数量,这里只有1个
int nparafile = 1;
// 指定任务类型,值为0表示为仿真计算
int nsimutask = 0;
// 配置文件路径,这里采用亚音速配置文件
string parafilename = "./bin/cfd_para_subsonic.hypara";
-
修改 cfd_para_subsonic.hypara
文件
这个配置文件较长。
// 基本参数设置
// 指定最大仿真步数
int maxSimuStep = 20000;
// 指定结果文件flow.dat的存储间隔
int intervalStepFlow = 1000;
// 指定文件tecflow.dat的存储间隔
int intervalStepPlot = 1000;
// 指定文件aircoef.dat的存储间隔
int intervalStepForce = 100;
// 指定文件res.dat的存储间隔
int intervalStepRes = 10;
// 来流参数设置
// 指定马赫数
double refMachNumber = 0.2;
// 指定攻角
double attackd = 19.0;
// 指定侧滑角
double angleSlide = 0.0;
// 指定流动参数类型,0表示无量纲条件
int inflowParaType = 0;
// 基于单位长度的雷诺数
double refReNumber = 9e6;
double refDimensionalTemperature = 288;
// 网格相关参数设置
// 缩放因子
double gridScaleFactor = 1.0;
// 参考长度
double forceReferenceLength = 1.0;
double forceReferenceLengthSpanWise = 1.0;
// 参考面积
double forceReferenceArea = 1.0;
double TorqueRefX = 0.0;
double TorqueRefY = 0.0;
double TorqueRefZ = 0.0;
// 湍流模型
// 指定粘性模型,3表示使用1方程湍流模型
int viscousType = 3;
// 模型名称,采用leq-sa模型
string viscousName = "1eq-sa";
// 空间离散设置
int roeEntropyFixMethod = 3;
double roeEntropyScale = 1.0;
string str_limiter_name = "minmod";
// 时间离散设置
// 指定为0表示计算稳态
int iunsteady = 0;
// 指定最大库朗数
double CFLEnd = 10.0;
// 指定网格路径
string gridfile = "./grid/30p30n__4.fts";
// 可视化输出设置
int plotFieldType = 0;
int nVisualVariables = 8;
int visualVariables[] = [0, 1, 2, 3, 4, 5, 6, 15];
// 其他限制参数设置
int reconmeth = 1;
int limitVariables = 0;
int limitVector = 0;
-
修改解算器文件 boundary_condition.hypara
修改内容为:
int nBoundaryConditions = 4;
string bcName = "Wall-1";
{
string bodyName = "body";
int bcType = 2;
int dumpHingeMoment = 0;
double forceReferenceArea = 1;
double forceReferenceLength = 1;
double forceReferenceLengthSpanWise = 1;
double TorqueRefX = 0;
double TorqueRefY = 0;
double TorqueRefZ = 0;
double wallTemperature = -1.0;
}
string bcName = "Wall-2";
{
string bodyName = "body";
int bcType = 2;
int dumpHingeMoment = 0;
double forceReferenceArea = 1;
double forceReferenceLength = 1;
double forceReferenceLengthSpanWise = 1;
double TorqueRefX = 0;
double TorqueRefY = 0;
double TorqueRefZ = 0;
double wallTemperature = -1.0;
}
string bcName = "Wall-3";
{
string bodyName = "body";
int bcType = 2;
int dumpHingeMoment = 0;
double forceReferenceArea = 1;
double forceReferenceLength = 1;
double forceReferenceLengthSpanWise = 1;
double TorqueRefX = 0;
double TorqueRefY = 0;
double TorqueRefZ = 0;
double wallTemperature = -1.0;
}
string bcName = "Farfield";
{
int bcType = 4;
}
所有文件都准备完毕后,可以使用命令mpiexec -n 4 ./PHengLEI.exe
进行计算。
这里算个一千多步就停下来,计算速度着实不太高,不过收敛性看着还不错。
计算完毕后,结果文件存储在results
文件夹下。
4 后处理
可以使用Tecplot打开tecflow.plt文件进行后处理,也可以利用文本编辑器打开dat文件查看数据。
-
密度
-
压力
-
马赫数
5 总结
个人觉得PHengLEI的设置不算特别复杂,模版文件中都给了非常详细的注释。不过设置过程有点儿别扭,尤其是那个key文件被修改了3次。个人建议可以把任务类型独立出三个变量来,这样就可以把所有参数写在同一个文件里面了。
而且从模版文件来看,目前开源的PHengLEI还是偏向于做空气动力学,其他的物理模型、材料模型都找不到地方设置,想要将其用于复杂的民用工业场景,还有很长的路要走。
(完)
本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册