编写代码过程中用到的,或者搜集的一些代码片段。
字典读取变量
在求解器中由于计算需要,要求通过字典文件输入某个值:首先创建字典,然后从这个字典读取数据。
创建一个字典或者使用已有字典:
- 创建字典:
IOdictionary transportProperties//字典的变量名 |
- 使用已有字典:
const dictionary& subModelDict = parcels.subModelProperties();//这里要先获取已有的字典 |
然后从这个字典读取数据:
- 读取 OF 定义的类型,如
dimensionedScalar
等,直接使用lookup
函数:
word fuel(thermo.lookup("fuel")); |
dimensionedScalar DT |
scalarList Z_param_(flameManDict.lookup("Z_param")); |
- 但是读取标量例外,需要这样用:
scalar Sct = readScalar(transportProperties.lookup("Sct")); |
另一个函数 lookupOrdefault
如何使用?
如下:
B_(dict.lookupOrDefault("B", 5.5))
deltaByR1Min_(coeffDict_.lookupOrDefault<scalar>("deltaByR1Min", 0.0))
active_(lookupOrDefault<Switch>("active", true))
Cg_(lookupOrDefault<scalar>("Cg", 2.0))
发现一个奇怪的地方:
case文件如下,可以看到D_NaCl需要两个word作为输入。
nu [0 2 -1 0 0 0 0] 1e-05; |
dimensionedScalar D_NaCl |
dimensionedScalar的三个私有数据,分别对应上述输出的三个量。
template<class Type> |
那么lookup得到了这三个量,然后调用构造函数?
dimensioned(const word&, const dimensionSet&, const Type); |
那么 nu 呢?为什么只有 dimension 和 value?
声明
dimensionedScalar nu0_; |
定义
nu0_("nu", dimViscosity, viscosityProperties_), |
读取数据
bool Foam::viscosityModels::Newtonian::read |
那么这里的问题就变成了 nu0_
和 D_NaCl
的区别了,再看一下他们 lookup
的具体函数:
viscosityProperties_.lookup("nu") >> nu0_; |
nu_
输出是这样的:
turbulence.nu=====dimensions [0 2 -1 0 0 0 0]; |
所以说,体标量场没有name,只有dimension和值?值分为内部场值和边界值。
对某个量全场求和
使用 functionObject
functions |
强行通过某个 const
接口修改变量:
volScalarField& mu_ = const_cast<volScalarField&>(this->thermo().mu()()); |
这样就可以修改热物理库中的 mu_
了。
场的加减乘除操作符,同时包括内部场和边界场的操作。
哪些类有 lookupOrDefault
这个方法?已知的有:
dimensioned<Type> |
用法举例:
active_(lookupOrDefault<Switch>("active", true))
这是在初始化列表中使用,当前类继承自IOdictionary
。Cg_(lookupOrDefault<scalar>("Cg", 2.0))
这是在初始化列表中使用,当前类继承自IOdictionary
。const int nNonOrthCorr(dictionary.lookupOrDefault<int>("nNonOrthogonalCorrectors", 0));
scalar maxDeltaT(Dict_.lookupOrDefault<scalar>("maxDeltaT", great));
B_(Dict_.lookupOrDefault("B", 5.5))
这里为什么不需要提供模板? B_ 是个 scalardeltaByR1Min_(Dict_.lookupOrDefault<scalar>("deltaByR1Min", 0.0))
dimensionedScalar Tmax;
Tmax(Dict_.subDict("subName").lookup("Tmax")),
这里需要字典里边给定它的值和量纲,格式如下:
Tmax Tmax [0 0 0 1 0 0 0] 2800.0;RASModel
的构造函数里边的这个IOdictionary
是什么用法?这里的RASModel
是继承自IOdictionary
的,所以在构造函数的初始化列表里边,需要先初始化基类的成员,然后正是因为继承关系,所以可以直接使用IOdictionary
里边的lookup
等函数!RASModel::RASModel(...)
:
turbulenceModel(rho, U, phi, thermophysicalModel, turbulenceModelName),
IOdictionary
(
IOobject
(
"RASProperties",
U.time().constant(),
U.db(),
IOobject::MUST_READ_IF_MODIFIED,
IOobject::NO_WRITE
)
),
turbulence_(lookup("turbulence")),
printCoeffs_(lookupOrDefault<Switch>("printCoeffs", false)),
coeffDict_(subOrEmptyDict(type + "Coeffs")),
{}
字典的三种使用方法:
- 创建字典文件
CCMProperties
(
IOobject
(
"CCMProperties",
this->mesh().time().constant(),
this->mesh(),
IOobject::MUST_READ,
IOobject::NO_WRITE,
false
)
), - 创建某个文件中的字典中的子字典,无须创建,再使用一个
subDict
,如:dimensionedScalar Prandtl;
Prandtl(CCMProperties.subDict("CCM").lookup("Prandtl")),
路径
db().time().rootPath()
当前算例的上级目录。db().path()
当前运行目录,相当于在运行时执行 pwd
出现的结果。串行时为当前目录,并行时为每一个 processor*,不同的核对应各自的 processor*。db().time().globalCaseName()
当前算例的文件夹的名字。db().time().timeName()
是当前时间的字符串。
如果是 collated 模式,则没有 processor* 文件夹,只有 processors+核数这个文件夹,想要输出一个文件到这里,可以这么做:
std::ostringstream nProcs; |
上边的outputFile和outputFile2输出相同。
未解之谜
输运方程中的源项,我只需要内部场,边界场应该怎么处理呢?内部场给了矩阵的 source()
,边界场应该没有参与计算。