cellMotion边界条件源码阅读求助
-
大家好,变形网格求解cellDisplacement时,需要用到cellMotion边界条件。我在看其updateCoeffs()函数时(见下),不理解这句:
this->operator[](i) = pp[i].average(points, pointMotion);
average函数咋有两个输入参数了呢?const fvPatch& p = this->patch(); const polyPatch& pp = p.patch(); const fvMesh& mesh = this->internalField().mesh(); const pointField& points = mesh.points(); word pfName = this->internalField().name(); pfName.replace("cell", "point"); const GeometricField<Type, pointPatchField, pointMesh>& pointMotion = this->db().objectRegistry::template lookupObject<GeometricField<Type, pointPatchField, pointMesh>> (pfName); forAll(p, i) { this->operator[](i) = pp[i].average(points, pointMotion); }
-
-
找pp[i].average的定义
pp是p的patch的引用,p是this的patch的引用。
所以pp是this的patch的patch。
所以pp的子函数average要从this里找。this就是当前这个类:cellMotionFvPatchField
这个类的定义在:
src/fvMotionSolver/fvPatchFields/derived/cellMotion/cellMotionFvPatchField.H
由类定义可知,该类继承自 fixedValueFvPatchField.H (
src/finiteVolume/fields/fvPatchFields/basic/fixedValue/fixedValueFvPatchField.H
)fixedValueFvPatchField 又继承自 fvPatchField (
src/finiteVolume/fields/fvPatchFields/fvPatchField/fvPatchField.H
)
这里352行,有patch函数,返回值是patch_src/finiteVolume/fields/fvPatchFields/fvPatchField/fvPatchField.C
中显示patch_的初始变量是fvPatch类型的(this的patch)src/finiteVolume/fvMesh/fvPatches/fvPatch/fvPatch.H
这里142行,有patch函数,返回值是polyPatch_,它的声明在69行,是polyPatch类型(this的patch的patch)polyPatch里没有average函数,接着往基类上找(
src/OpenFOAM/meshes/polyMesh/polyPatches/polyPatch/polyPatch.H
)继承自两个类:patchIdentifier, primitivePatch
第一个查无所获,第二个:
src/OpenFOAM/meshes/primitiveMesh/primitivePatch/primitivePatch.H
里面有四个头文件,一个个找过去,
第一个:
src/OpenFOAM/meshes/primitiveMesh/PrimitivePatch/PrimitivePatch.H(^处两个字母,大小写和上面不一样) ^ ^
没有average函数
第二个:
src/OpenFOAM/meshes/meshShapes/face/face.H
好了,找到函数原型:148行
//- Calculate average value at centroid of face template<class Type> Type average(const pointField&, const Field<Type>&) const;
代码行数都是OpenFOAM 10版本的
网页搜着慢,可以自己编译个本地的,搜着快,一句命令就可以生成。
can@M320-TC:/home/can/.local/share/OpenFOAM/OpenFOAM-10/doc/Doxygen> ll (git)-[master]- total 140K drwxr-xr-x 2 can can 4.0K Jan 6 2023 Macros/ -rwxr-xr-x 1 can can 2.0K Jan 6 2023 Allwmake* -rw-r--r-- 1 can can 496 Jan 6 2023 CFDFoundation55x55.png -rw-r--r-- 1 can can 948 Jan 6 2023 customdoxygen.css -rw-r--r-- 1 can can 103K Jan 6 2023 Doxyfile -rw-r--r-- 1 can can 716 Jan 6 2023 footer.html -rw-r--r-- 1 can can 2.1K Jan 6 2023 header.html -rw-r--r-- 1 can can 7.5K Jan 6 2023 README.html -rw-r--r-- 1 can can 1.7K Jan 6 2023 README.org can@M320-TC:/home/can/.local/share/OpenFOAM/OpenFOAM-10/doc/Doxygen> ./Allwmake (git)-[master]-
也可以手动找。加载了OpenFOAM环境后,
src
命令直接跳到源代码目录,然后:直接找到类的定义:
find . -name calssWhatIWant.H
直接找函数:
grep -r "functionWhatIWant(" .
加半拉括号是为了减少搜索到的结果。搭配正则表达式用,搜的效率更高。
-
@bestucan 谢谢老师的手把手指导!原来是可以沿着基类往上找的,之前一看到继承了好几个基类就感觉太麻烦找不出来了。
使用grep在src中搜还可以搜到用法,也很不错,但是函数定义换行了就不好搜了。比如这个要是用
grep -rP "::average\n\(" .
啥也找不到。编译本地doxygen也学到了,openfoam2406版本的方法整理一下
sudo apt-get install doxygen graphviz cd /usr/share/doc/openfoam2406-common/doc/Doxygen/ gzip -dk Doxyfile.gz #解压doxygen配置文件 ./Allwmake firefox html/index.html
本地查看foam下的函数不会卡了,不过网页中没有的函数原型本地也没有