mengweilm425
帖子
-
关于OpenFOAM snappyHexMesh 画网格的问题 -
关于OpenFOAM snappyHexMesh 画网格的问题各位同仁,最近我们在用snappy画网格的时候遇到一个问题,跟大家请教一下。我们想在平板网格上加几个圆形的压力测点,如下图所示。这是用犀牛建的几何模型。
我们想在用snappy生成网格,并且把黄色圆孔设为独立的边界条件,方便压力的测量。但是生成的网格如下图所示,圆形边界的边缘不能被准确的描述出来,而是呈台阶状。
试了好多种方法,包括边界处加密和调整snappy的参数等等,都不好用,还请大家帮忙看看有没有什么好的办法。多谢! -
关于并行计算的问题https://openfoamwiki.net/index.php/Installation/Linux/OpenFOAM-dev/Ubuntu 可以参考第九条 (Save an alias in the personal .bashrc file, simply by running the following command)
-
of-v1706中的IsoAdvector@mohui 不是大神,不是大神,互相交流:laughing: 。
- FTM没了解过,这个isoAdevtor里面,我的理解是,比如二维的正交网格,每个网格节点都有四个网格相连,这个网格节点的值是由周围四个网格中心的值差值而来。
- 是以alphaV为条件,找到对应的等值面。这个构建等值面的过程是根据每个网格节点处的alpha值,比如二维问题,我们就有四个alpha值,这样可以构首先建四个等值面。这四个等值面对应着四个alphaV,判断一下哪两个alphaV中间包含着我们的目标alphaV,然后就在这个范围内构建一个等值面以下的体积关于等值面的值的函数V=func(isovalue),这样就可以找到目标等值面。这里面都是纯几何操作。
-
of-v1706中的IsoAdvector@mohui 这个isoAdvector我大概看过,每个有自由液面的网格(0<alpha<1)的等值面不一定一样。根据每个网格中心的alpha值先插值得到网格节点的alpha值,再利用节点的值构建等值面,使等值面以下的水的几何体积等于该网格中alpha*V的值。得到等值面的信息,包括面心位置,法相和速度,可以得到在dt时间内,等值面以下网格面浸水面积随时间的变化,再由已知的phi值计算dt时间内水的通量。也就是在计算这个通量的时候,考虑了等值面的运动。为了确保这个算法的守恒还用了bounding,大概就是如果某个网格接收水以后,其alpha值大于1,多余的部分不是直接砍掉,而是转移的别的网格。
-
对于Open FOAM 模拟波浪的一些思考@wwzhao @金石为开
我这两天看了这篇文章,里面写的interfoam的理论部分还比较详细。Evaluating the performance of the two-phase flow solver interFoam
http://iopscience.iop.org/article/10.1088/1749-4699/5/1/014016/meta
-
关于 phi 和 fvVectorMatrix 的两个问题@vivian @cfd-china 看来我来晚了:happy:
-
关于negSumDiag()的一个问题 -
关于negSumDiag()的一个问题为了进一步测试,建立一个3X3的网格,并创建一个fvMatrix。
fvVectorMatrix UEqn_lap ( fvm::laplacian(nu, U) );
网格编号如下:
|6|7|8| |3|4|5| |0|1|2|
输出 upper 和lower 的address,没有问题
Info<< "UEqn_lap upper add before sum " << UEqn_lap.lduAddr().upperAddr() << nl << endl; Info<< "UEqn_lap lower add before sum " << UEqn_lap.lduAddr().lowerAddr() << nl << endl; UEqn_lap upper add before sum 12 ( 1 3 2 4 5 4 6 5 7 8 7 8 ) UEqn_lap lower add before sum 12 ( 0 0 1 1 2 3 3 4 4 5 6 7 )
下面把upper lower 和diag重新赋值 并输出
UEqn_lap.upper() = 100; UEqn_lap.diag() = 0; UEqn_lap.lower() = 1; Info<< "UEqn_lap diag after change " << UEqn_lap.diag() << nl << endl; Info<< "UEqn_lap upper after change " << UEqn_lap.upper() << nl << endl; Info<< "UEqn_lap lower after change " << UEqn_lap.lower() << nl << endl;
输出为:
UEqn_lap diag after change 9{0} UEqn_lap upper after change 12{100} UEqn_lap lower after change 12{1}
调用
UEqn_lap.negSumDiag(); Info<< "UEqn_lap diag after negSumDiag " << UEqn_lap.diag() << nl << endl;
输出结果为:
UEqn_lap diag after negSumDiag 9(-2 -102 -101 -102 -202 -201 -101 -201 -200)
我特意把upper里面的数值设的很大,从输出的结果看,diag 是把lower里面的数加和了,也就是把列中的数加和了。
这个结果让我有点儿弄不明白。
-
关于negSumDiag()的一个问题在看关于negSumDiag()的代码的时候遇到一个问题。diag上面的项是由该“行”上面的的off-diag的项相加后取负值得到。为什么下面的代码感觉像是把该“列”的数相加了呢?
template<class Type, class DType, class LUType> void Foam::LduMatrix<Type, DType, LUType>::negSumDiag() { const Field<LUType>& Lower = const_cast<const LduMatrix&>(*this).lower(); const Field<LUType>& Upper = const_cast<const LduMatrix&>(*this).upper(); Field<DType>& Diag = diag(); const unallocLabelList& l = lduAddr().lowerAddr(); const unallocLabelList& u = lduAddr().upperAddr(); for (label face=0; face<l.size(); face++) { Diag[l[face]] -= Lower[face]; Diag[u[face]] -= Upper[face]; } }
以这个网格为例
lowerAdd 为 (0 1 2 1 2 3 4 3 )
upperAdd 为 (2 2 3 6 4 5 6 5 )矩阵的形式为
那么Diag[0] 应该是由 Upper[1]得到。这个和上面的代码不符。如果矩阵是对称的,这个计算没有问题。而如果是 非对称的,是不是就有问题了?
谢谢大家!
-
关于 phi 和 fvVectorMatrix 的两个问题@wwzhao 谢谢您的回复,这就明朗多了。我再好好看看这部分代码。:happy:
-
关于 phi 和 fvVectorMatrix 的两个问题非常感谢大家的回复!我现在的阶段还看不好代码,但是我又对fvMatrix做了一些测试。
还是如下的fvMatrix
fvVectorMatrix UEqn_diffusion ( fvm::laplacian(nu, U) );
我发现在解这个方程的时候
\begin{equation}
[A][x]=[b]
\end{equation}矩阵[A] 实际上是 UEqn.D() + UEqn.upper() + UEqn.lower(), 而没有使用UEqn.diag()。UEqn.D()在UEqn.diag()的基础上加上了边界条件对当前网格的影响。上面方程中的[b],也不是UEqn.source(),而是和边界条件中已知的速度相关的值。我直接求解得到的结果和openfoam算出来的结果是一样的。由于没有真正的去看代码,不知道Openfoam里面有没有相关的function可以直接输出上述$[A][x]=[b]$方程组中的[A]和[b],还请各位大神指点。
再次感谢大家的帮助!
-
关于 phi 和 fvVectorMatrix 的两个问题补充一下上面的帖子
solve(UEqn_diffusion); Info<< " U solution " << U << nl << endl;
结果如下:
smoothSolver: Solving for Ux, Initial residual = 0.921181, Final residual = 9.32208e-06, No Iterations 11 smoothSolver: Solving for Uy, Initial residual = 0.999778, Final residual = 8.66271e-06, No Iterations 8 U solution dimensions [0 1 -1 0 0 0 0]; internalField nonuniform List<vector> 16 ( (0.0189067 -1.2469e-08 0) (0.0430646 -3.74215e-08 0) (0.0430639 -4.90001e-08 0) (0.0189057 -2.83642e-08 0) (0.0703756 -3.73926e-08 0) (0.153354 -1.08185e-07 0) (0.153353 -1.33266e-07 0) (0.070374 -6.9139e-08 0) (0.179619 -4.88555e-08 0) (0.34663 -1.32978e-07 0) (0.34663 -1.48122e-07 0) (0.179618 -6.64227e-08 0) (0.481091 -2.81724e-08 0) (0.706929 -6.88449e-08 0) (0.706929 -6.63391e-08 0) (0.481091 -2.54916e-08 0) ) ; boundaryField { movingWall { type fixedValue; value uniform (1 0 0); } fixedWalls { type noSlip; } frontAndBack { type empty; } }
但这次与前面的 UEqn_time_term 和 UEqn_advection_term 不同, 没能找到其结果和UEqn.A() 与UEqn.H() 的关系。感觉openfoam求解了这个方程,从UEqn_diffusion的系数和source()项为零来看,求解结果应该是零,但是显然是我想错了。如果是$u_{P}$为未知,$u_{W}$等相邻的cell的速度用的是上一个时间步的值,那么线性方程组只存在对角线的值,不需要迭代,直接就能出结果。在这个问题上没有想明白,还希望您能指点一下这个方程是怎么求解的。
-
关于 phi 和 fvVectorMatrix 的两个问题@cfd-china 谢谢您!我是刚开始学Openfoam,希望能多多向前辈们请教!
-
关于 phi 和 fvVectorMatrix 的两个问题东岳老师,我在研究完icoFoam中的 ‘fvm::ddt(U)’ 和 ‘fvm::div(phi, U)’ 之后又进而研究了‘fvm::laplacian(nu, U)’,有如下几个问题没有弄明白。
为了看的清楚,附上网格编号的图。
我分别定义了不同的 fvVectorMatrix
fvVectorMatrix UEqn_time_term ( fvm::ddt(U) ); fvVectorMatrix UEqn_advection_term ( fvm::div(phi, U) ); fvVectorMatrix UEqn_diffusion ( fvm::laplacian(nu, U) );
对他们进行输出之后发现 UEqn_time_term 和 UEqn_advection_term 的diag() 和A() 每个元素都是相差一个cell 的体积
UEqn.A() = UEqn.diag()/mesh.V()
但是UEqn_diffusion的diag() 和A()只有在非边界的单元才满足上述关系。如下
UEqn_diffusion.diag 16 ( -0.0002 -0.0003 -0.0003 -0.0002 -0.0003 -0.0004 \\这个满足上面的关系 -0.0004 \\这个满足上面的关系 -0.0003 -0.0003 -0.0004 \\这个满足上面的关系 -0.0004 \\这个满足上面的关系 -0.0003 -0.0002 -0.0003 -0.0003 -0.0002 ) UEqn_diffusion.A dimensions [0 0 -1 0 0 0 0]; internalField nonuniform List<scalar> 16 ( -96 -80 -80 -96 -80 -64 -64 -80 -80 -64 -64 -80 -96 -80 -80 -96 ) ; boundaryField { movingWall { type extrapolatedCalculated; value nonuniform List<scalar> 4(-96 -80 -80 -96); } fixedWalls { type extrapolatedCalculated; value nonuniform List<scalar> 12 ( -96 -80 -80 -96 -96 -80 -80 -96 -96 -80 -80 -96 ) ; } frontAndBack { type empty; } }
我的第一个问题是 在UEqn_diffusion中.A()是怎么计算的?
我在输出UEqn_diffusion的时候也发现它与其他的输出结果不同,在网上搜了半天也没有得到答案。
Info<< " UEqn_diffusion " << UEqn_diffusion << nl << endl;
输出结果如下:
UEqn_diffusion false true true 16 \\这个应该是diag() ( -0.0002 -0.0003 -0.0003 -0.0002 -0.0003 -0.0004 -0.0004 -0.0003 -0.0003 -0.0004 -0.0004 -0.0003 -0.0002 -0.0003 -0.0003 -0.0002 ) 24 \\这个应该是upper ( 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 ) [0 4 -2 0 0 0 0] 16{(0 0 0)} \\我猜这个是source,这里面没有源项,4by4的网格,应该都是零。如果不对,请您指正。 3 \\从这个开始往下我不知道是什么了,其他的matrix这些项都是零,请问这些值都代表了什么? ( 4((-0.0002 -0.0002 -0.0002) (-0.0002 -0.0002 -0.0002) (-0.0002 -0.0002 -0.0002) (-0.0002 -0.0002 -0.0002)) 12 ( (-0.0002 -0.0002 -0.0002) (-0.0002 -0.0002 -0.0002) (-0.0002 -0.0002 -0.0002) (-0.0002 -0.0002 -0.0002) (-0.0002 -0.0002 -0.0002) (-0.0002 -0.0002 -0.0002) (-0.0002 -0.0002 -0.0002) (-0.0002 -0.0002 -0.0002) (-0.0002 -0.0002 -0.0002) (-0.0002 -0.0002 -0.0002) (-0.0002 -0.0002 -0.0002) (-0.0002 -0.0002 -0.0002) ) 0() ) 3 ( 4((-0.0002 -0 -0) (-0.0002 -0 -0) (-0.0002 -0 -0) (-0.0002 -0 -0)) 12{(-0 -0 -0)} 0() )
第二个问题 写在了代码的注释里,主要是不明白这个输出的结果里面除了diag(), upper() 和source()之外的那些项是什么?
我在推倒UEqn_diffusion 的系数矩阵的时候发现,由边界条件得到边界上的速度值,那么最上面的滑动边界上的cell (编号为P)
\begin{equation}
S_{e}\nu_{e}\frac{u_{E}-u_{P}}{\Delta x} + S_{w}\nu_{w}\frac{u_{W}-u_{P}}{\Delta x} + S_{n}\nu_{n}\frac{u_{N}-u_{P}}{\Delta y} + S_{s}\nu_{s}\frac{u_{S}-u_{P}}{\Delta y}
\end{equation}里面的$u_{N}$可以根据边界条件差值
\begin{equation}
u_{N} = 2 u_{n} - u_{P}
\end{equation}其中$u_{n}$为上面滑动边界已知的速度。
但是这个边界条件并没有在系数矩阵的diag()中体现出来,这也带来了我的第三个问题,这个边界条件在 UEqn_diffusion 是怎么体现出来的?是否与第二个问题有关?
第四个问题就是也是又第三个问题引出来的,我试着求解了一下UEqn_diffusion,并输出了一下U的结果
solve(UEqn_diffusion); Info<< " U solution " << U << nl << endl;
但这次与前面的 UEqn_time_term 和 UEqn_advection_term 不同, 没能找到其结果和UEqn.A() 与UEqn.H() 的关系。
我的问题有点儿多,我也会继续查找相关的信息,期待您的解答!
非常感谢!
-
关于 phi 和 fvVectorMatrix 的两个问题东岳老师,非常感谢您的回复!
对于第一问题,我又进行了尝试,下面是我的理解,如果有不对的地方,还请您指正。
边界上的phi可以由边界条件得到,在cavity这个算例中,边界上没有法向的速度,因而phi全部为‘0’。而在internal face上的phi,可以由已知的速度场进行差值得到face上的速度,再乘以该face的面积和法向,就得到了phi。对于第二个问题,我又输出了U的值。
Info<< " U " << U << nl << endl;
得到
U dimensions [0 1 -1 0 0 0 0]; internalField nonuniform List<vector> 16 ( (-0.00109257 0.00108567 0) (-0.00260853 0.000420926 0) (-0.00260827 -0.000416558 0) (-0.0010966 -0.00108186 0) (-0.00181643 0.00400068 0) (-0.00421015 0.00141225 0) (-0.00421276 -0.00140849 0) (-0.00182014 -0.00400052 0) (-0.0033937 0.00937929 0) (-0.00774594 0.0025887 0) (-0.00774527 -0.00258687 0) (-0.00339316 -0.00937899 0) (0.0210076 0.00646146 0) (0.0145416 0.00159495 0) (0.0145415 -0.00159377 0) (0.0210087 -0.00646063 0) ) ; boundaryField { movingWall { type fixedValue; value uniform (1 0 0); } fixedWalls { type noSlip; } frontAndBack { type empty; } }
发现 UEqn_time_term.source() 里面的值对应为速度的值除以时间步长再乘以对应cell的体积。(时间步长为0.001,体积为0.01乘以0.025乘以0.025)
-
关于 phi 和 fvVectorMatrix 的两个问题刚开始学习openfoam,遇到两个问题, 前来请教。
我在cavity的算例里面建立了4*4的网格,如下
vertices ( (0 0 0) (1 0 0) (1 1 0) (0 1 0) (0 0 0.1) (1 0 0.1) (1 1 0.1) (0 1 0.1) ); blocks ( hex (0 1 2 3 4 5 6 7) (4 4 1) simpleGrading (1 1 1) );
然后输出了flux phi的值
Info<< " phi " << phi << nl <<endl; Info<< " phi size " << phi.size() << nl <<endl;
得到如下结果:
phi dimensions [0 3 -1 0 0 0 0]; internalField nonuniform List<scalar> 24 ( -2.28233e-06 2.28233e-06 -3.2402e-06 9.57866e-07 -2.28434e-06 -9.55866e-07 -2.28433e-06 -3.94416e-06 6.22649e-06 -5.34147e-06 2.35517e-06 -3.95016e-06 -2.34716e-06 -6.2345e-06 -6.72257e-06 1.29491e-05 -7.99247e-06 3.62507e-06 -6.71657e-06 -3.62306e-06 -1.29511e-05 1.29491e-05 1.65741e-05 1.29511e-05 ) ; boundaryField { movingWall { type calculated; value uniform 0; } fixedWalls { type calculated; value uniform 0; } frontAndBack { type empty; value nonuniform 0(); } } phi size 24
我的第一个问题是, 为什么phi只在internal face上面赋值了, 边界上的face不用计算吗?在 fvm::div(phi, U) 也用到了phi值, 边界上的flux是怎么考虑的?
第二个问题是, 我声明了一个新的fvVectorMatrix
fvVectorMatrix UEqn_time_term ( fvm::ddt(U) );
查看源项的值
Info<< " UEqn_time_term.s " << UEqn_time_term.source() << nl << endl;
输出结果:
UEqn_time_term.s 16 ( (-5.83396e-06 5.74984e-06 0) (-1.42259e-05 2.43986e-06 0) (-1.42171e-05 -2.34961e-06 0) (-5.92331e-06 -5.6699e-06 0) (-1.00527e-05 2.19123e-05 0) (-2.40783e-05 8.37173e-06 0) (-2.41399e-05 -8.28764e-06 0) (-1.01346e-05 -2.19111e-05 0) (-1.39378e-05 4.90818e-05 0) (-3.80295e-05 1.57254e-05 0) (-3.80131e-05 -1.56865e-05 0) (-1.39231e-05 -4.90753e-05 0) (9.96865e-05 3.28844e-05 0) (7.57897e-05 9.67425e-06 0) (7.57862e-05 -9.65121e-06 0) (9.97123e-05 -3.2868e-05 0) )
这个fvmatrix的源项不是应该为零吗?为什么会有值呢?
非常感谢!!
-
关于icoFoam的一个小问题非常感谢您的解答,我再好好推一推,有问题再跟您交流!
-
关于icoFoam的一个小问题我在看‘icoFoam解析’这篇文章,在推导方程的时候有一个小问题, 为什么公式 (14) 中的压力没有在体积和时间上积分啊? 前面的一些推导对瞬态项,对流项,扩散项都进行了体积分和时间积分,但在公式(14)中压力梯度直接用了。
谢谢!