- 网格质量如何?如果网格太差(checkMesh有严重报错,最大非正交大于85,skewness 超过20,等),建议回炉重造。
- k 和 epsilon 的对流项离散格式用 linearUpwind,grad(k) 和 grad(epsilon) 用 cellimited,如果还不行,直接上 upwind试试。也可以先用upwind算一段时间再换成 linearUpwind。
- 边界条件的设置取决于你使用的湍流模型,对于高雷诺数模型,入口 k 和 epsilon 给固定值,根据湍流度来估算;壁面上 k 用 kqrWallFunction,epsilon 用 epsilonWallFunction,nut 用 nutUSpaldingWallFunction。高雷诺数k-epsilon湍流模型还要注意壁面 y+,一般认为需要 y+>30,如果y+太小,结果反而不好,也可能会引起计算不稳定。
xpqiu 发布的最佳帖子
-
RE: bounding k,bounding epsilon,均超限,连续性方程不收敛
-
RE: 怎么理解OpenFoam中的runTimeSelection机制?
@金石为开 本质上是 hashTable 的使用。在基类里调用宏函数 declareRunTimeSelectionTable 创建了一个 hashTable,其 key 的类型为 “word”,value 类型为函数指针,这个函数指针指向一个返回派生类临时对象的智能指针(autoPtr)。
在派生类里,每次调用 addToRunTimeSelectionTable 的时候,相当于往 hashTable 里添加一组元素。
在求解器里,创建的是基类的智能指针,这个指针指向基类中定义的 New 函数的返回值。New 的作用是选择具体的派生类,这里涉及到C++的一个特性,即基类指针可以指向派生类。New 函数根据你在算例里提供的模型的名字(typeName),去 hashTable 里匹配,然后将匹配到的派生类的对象返回。这样,就实现了模型的选择。
-
RE: openfoam set fields
@子仲无未 用CAD画一个多面体,坐标要跟你的网格适配,保证这个多面体刚刚好包围了你想要的网格。然后将该多边形导出成 STL 格式,然后用 topoSet 将改多边形所包围的网格提取到一个 cellSet,topoSetDict大致是这样写:
{ name c0; type cellSet; action delete; source surfaceToCell; sourceInfo { file "constant/triSurface/block.stl"; outsidePoints (( 1.012 0.01 0.902)); //includeCut false; includeCut true; includeInside true; includeOutside false; nearDistance 0.0; curvature 0; } }
最后,在 setFieldsDict里,这样写:
defaultFieldValues ( volScalarFieldValue alpha 0 ); regions ( cellToCell { set c0 ; fieldValues ( volScalarFieldValue alpha 0.60 ) ; } );
用这种方法,可以做到对任意形状的网格区块设置初始场。
-
RE: 如何输出场最大温度值这个文件
functions { cellSource1 { type cellSource; functionObjectLibs ("libfieldFunctionObjects.so"); enabled yes; outputControl outputTime; log yes; valueOutput yes; source all; operation max; fields ( T ); } }
这个加到 controlDict 里就能输出最大值了。
其实还有一种办法,既然你说在终端的输出信息中包括了最大和最小温度,那么如果你保存了终端输出信息,你还可以用 linux 的工具来从那些众多的信息中将你想要的最大和最小信息提取出来,
比如,假设你的文件名为 logcat log | grep "max(" | sed 's/^\ *//g' | cut -d ' ' -f 5
感兴趣的话可以试试这个命令,可能不能完全适合你的情况,你需要做些修改。
-
RE: Ubuntu集群跨节点并行问题
PS:一直不清楚为什么在.bashrc里的那4句注释掉就可以,之前从来没有对这4句太在意,而是直接添加OF的环境变量就好了。。。
这里解释了为什么:http://www.evernote.com/l/AYvYUlXKzfxBIZ5sJbyk-cREUR1SGcAPIto/
-
RE: OpenFOAM的一个bug
@wwzhao 在OpenFOAM-2.1的时候,程序里写的就是“CrankNicholson” ,所以controlDict里也应该写“CrankNicholson”,虽然这个拼写确实是不正确的。但是从OpenFOAM-2.3开始,这个名字改成了正确的拼写:“CrankNicolson”,相差一个字母。所以这就导致了2.1和2.3的算例会在这里不兼容。
-
RE: 关于边界条件
常用出入口边界条件:
https://cpp.openfoam.org/v4/a11022.html壁函数:
https://cpp.openfoam.org/v4/a11020.html每一个边界条件都附有简短的说明以及使用示例。
-
RE: OpenFOAM中kOmegaSST和yPlusRAS
@qjh888 在 OpenFOAM中kOmegaSST和yPlusRAS 中说:
yPlus要在30~200之间才可以使用wallFunction,
这个说的是标准壁函数,OpenFOAM中的omegaWallfunction是混合的,所以理论上对omega的边界处理是可以适用于较大范围的yPlus的。但是其他的湍流变量并没有这种混合,此外,yPlus太大,边界处网格必然变粗,精度也会相应下降。所以,yPlus取多少还是要根据实际情况来决定
还有一个问题,为什么计算yPlusRAS一定要使用nutWallFunction?
那是因为yPlus的计算是依赖于你所使用的湍流模型以及nut的边界条件处理的,所以,yPlusRAS需要调用nutWallFunction类中的一个函数来计算 yPlus
-
RE: 有关twophaseeulerfoam中的问题
@lixh 在热物理属性那个文件里设置(thermoPhysicsProperties.air)。是否需要设置密度和年度,取决于你的热物理模型的选择,如果equationOfState设置的是 perfaceGas,那么,流体将遵循理想气体状态方程,这时不需要设置密度,因为密度是根据压力算出来的。如果设为rhoConst,这时需要指定流体的密度。粘度的设置取决于 transport 的设置,如果设置为 const,即粘度为常数,则需要指定粘度的值,如果选择其他粘度模型,则会有不同的设置,具体可以参考UserGuide的 thermoPhysics 这一章。
xpqiu 发布的最新帖子
-
RE: mpirun并行显示运算中,但是实际log文件无输出
@洱聿 集群如果使用作业调度软件来提交作业的话,应该生成日志文件(类似 xxx.out and/or xxx.err),里面可能有什么报错信息。
-
RE: 关于并行中的reduce函数
@Tens 在 关于并行中的reduce函数 中说:
List<scalar> np(20,0.0); for (label i=0;i<20;i++) { np[i] += xxxx; //每个时间步累加 reduce(np[i], sumOp<scalar>()); }
这段代码如果以比如 6 核运行,那么如果先不看 reduce 这句,则是这6个核各自都会创建一个长度为 20 的list,然后执行这个循环,最终得到的结果是每个核各自有一份自己的 np 值,如果xxxx是常数,则每个核的np值都一样,如果xxxx是一个不同核数取值不一样的数,则每个核中最终得到的 np 值不一样。
reduce(np[i], sumOp<scalar>()) 的作用是将每个核的 np[i] 全都累加起来(因为这里的第二个参数是sumOp,表示加和),然后将累加之后得到的值再分发给所有核,最终每个核中的 np 的值都一样。
所以加上reduce之后导致的结果就是,最终得到的每个核中的 np的值都一样,但是 np 的值显然会受核数影响。
举例说,假设 xxxx 是常数,等于10 ,则 单核运行时,np 的每个分量都是10,如果6核运行,则最终得到np 的每个分量都是 60。因为reduce之前,每个核的 np 都是10,reduce 的时候,将每个核的值累加起来,得到60。以此类推,核数越多,得到的 np 值越大。
-
RE: 双流体方法颗粒堆积模拟
可能是J-J 摩擦应力模型的问题。
上面图里面第一个是不考虑摩擦应力的结果,下面两个是考虑摩擦应力的结果。摩擦应力模型用的是 Laux,对应参考文献是:
A. Nikolopoulos, N. Nikolopoulos, N. Varveris, S. Karellas, P. Grammelis, and E.
Kakaras, Investigation of proper modeling of very dense granular flows in the
recirculation system of CFBs. Particuology, 2012, 10(6):699-709 -
RE: 算例topoSet、refineMesh后,无法decomposePar
@hy1112006
哦,你的 refineMeshDict 里面需要一个 cellSet 来定义需要refine 的网格。这个 cellSet 也只是用来起这个作用吧。
所以,你需要在 refineMesh 之前,先 topoSet 把 cellSet 生成出来,然后 refineMesh
但是,在 decomposePar 的时候要排除对 cellSet 进行 decompose,因为我上一条回复说的原因。可以给 decomposePar 加一个选项,-noSets,这样在 decomposePar 的时候就不读取 cellSet 了,也就不会再触发你主楼遇到的错误了。 -
RE: 算例topoSet、refineMesh后,无法decomposePar
@hy1112006
先 refineMesh,后 topoSet 试试。
topoSet 生成的 cellZone 或者 cellSet 等,保存的网格ID是你refineMesh 之前的, refineMesh 之后,网格数量都变了,所以保存在 cellZone 或者 cellSet 里面的编号跟refine之后的网格都不匹配了。 -
RE: 集群上OF不能跨节点并行
https://www.open-mpi.org/faq/?category=openfabrics#ofa-device-error
这个链接里面的 53 应该是对应你的情况。 -
RE: RANS模型假设了整个域的湍流,那么它如何预测层流场和过渡场呢?
@xiaoyang-luan
RNG k-epsilon 预测不了转捩。
转捩相关的湍流模型,参考:https://turbmodels.larc.nasa.gov/
“Turbulence+Transition Models ” 部分