Skip to content

OpenFOAM

OpenFOAM交流区

5.3k 主题 31.6k 帖子
  • 12 帖子
    12k 浏览
    J

    您好,我也在学习用OpenFOAM实现源造波。
    请问质量源造波是只能通过在interFoam的pEqu.H中的压力方程的等号右边加入源项吗?
    我了解到为了方便源项有fvOptions,就是在case里增加一个fvOptions文件,在这个文件里说明源项等相关设置,请问楼主在方面是否有尝试?
    我目前在做源项造jonswap不规则波,但是在引入的源项方面有些不确定,原理是Lin和Liu的1999年的文献中的这一段:
    5c5d8285-847a-4bed-bfed-54cb967a6b2f-image.png
    所以想了解楼主加入源项的源项是怎么表达的?加入源项后是通过在求解器里wmake编译就可以在case里使用源造波功能了吗?
    希望能得到老师和各位前辈们的指导,感激~

  • 一种各向同性湍流生成方法

    3
    3 帖子
    2k 浏览
    Z

    漂亮~:xinxin:

  • 3 帖子
    3k 浏览
    L

    谢谢东岳,我这就联系他们。

  • 21 帖子
    16k 浏览
    strive_DUTS

    @veen 嗯嗯!我试试

  • OpenFOAM求解器植入自己的代码后并行计算问题

    4
    4 帖子
    4k 浏览
    bestucanB

    OpenFOAM 并行和通常意义上的并行有点区别。一般并行的部分都是写在代码里的。OpenFOAM 的并行部分不在代码里,严格说,都不是并行的。并行的任务分配是通过 decomposePar 完成。并行计算是通过 runParallel 完成的。所谓并行就是一下开几个求解器进程,同时算不同的区域,几个求解器的计算区域的交接处信息交换也是 runParallel 完成的。

    这样求解器中的变量就不能“特殊”,要“通识”。不能直接“全场”信息,要用“我计算的所有网格”信息。

    你的第一个帖子说要用每个时间步计算的到的数据,这个数据的调用直接写进求解器。那么在各个区域上计算的进程有的快,有的慢。全场的信息(或者说某个时间步计算的到的结果)对于单个进算进程来说是未知的。对于单个进程:我只计算左上角的区域,然后下一步计算需要引用全区域变量。

    runParallel 应该是没有这样的调度的。进程有快慢,所以偶尔会互相等待。等待也是等待交界面的信息。而这个全场信息是等不来的,得合并各个进程的计算结果才有。

    所以有些求解器它就是不能并行,施主又何必强求:chigua:

  • 重新看icoFoam

    7
    7 帖子
    6k 浏览
    winsway_zeroW

    @李东岳 我下面仔细推导了一下:
    首先 rAU(1.0/UEqn.A());,这个公式的计算得到的结果是:

    对角系数 这是A()函数: template<class Type> Foam::tmp<Foam::volScalarField> Foam::fvMatrix<Type>::A() const { tmp<volScalarField> tAphi ( volScalarField::New ( "A("+psi_.name()+')', psi_.mesh(), dimensions_/psi_.dimensions()/dimVol, extrapolatedCalculatedFvPatchScalarField::typeName ) ); tAphi.ref().primitiveFieldRef() = D()/psi_.mesh().V(); tAphi.ref().correctBoundaryConditions(); return tAphi; } 这是D()对角系数的平均化处理 template<class Type> Foam::tmp<Foam::scalarField> Foam::fvMatrix<Type>::D() const { tmp<scalarField> tdiag(new scalarField(diag())); addCmptAvBoundaryDiag(tdiag.ref()); return tdiag; } 边界对对角系数的影响: template<class Type> void Foam::fvMatrix<Type>::addCmptAvBoundaryDiag(scalarField& diag) const { forAll(internalCoeffs_, patchi) { addToInternalField ( lduAddr().patchAddr(patchi), cmptAv(internalCoeffs_[patchi]), diag ); } }

    从上面的代码可以得到:
    $$
    A_p=\frac{\bar{D}}{\Delta V}
    $$
    其中:
    $$
    \bar{D}=average(a_p')+diag
    $$
    式子中average(Ap')表示的是边界对主对角线系数的影响的平均;diag表示的是内部面离散的主对角线系数。

    周围系数作为源项: H() template<class Type> Foam::tmp<Foam::GeometricField<Type, Foam::fvPatchField, Foam::volMesh>> Foam::fvMatrix<Type>::H() const { tmp<GeometricField<Type, fvPatchField, volMesh>> tHphi ( GeometricField<Type, fvPatchField, volMesh>::New ( "H("+psi_.name()+')', psi_.mesh(), dimensions_/dimVol, extrapolatedCalculatedFvPatchScalarField::typeName ) ); GeometricField<Type, fvPatchField, volMesh>& Hphi = tHphi.ref(); // Loop over field components for (direction cmpt=0; cmpt<Type::nComponents; cmpt++) { scalarField psiCmpt(psi_.primitiveField().component(cmpt)); scalarField boundaryDiagCmpt(psi_.size(), 0.0); addBoundaryDiag(boundaryDiagCmpt, cmpt); boundaryDiagCmpt.negate(); addCmptAvBoundaryDiag(boundaryDiagCmpt); Hphi.primitiveFieldRef().replace(cmpt, boundaryDiagCmpt*psiCmpt); } Hphi.primitiveFieldRef() += lduMatrix::H(psi_.primitiveField()) + source_; addBoundarySource(Hphi.primitiveFieldRef()); Hphi.primitiveFieldRef() /= psi_.mesh().V(); Hphi.correctBoundaryConditions(); typename Type::labelType validComponents ( psi_.mesh().template validComponents<Type>() ); for (direction cmpt=0; cmpt<Type::nComponents; cmpt++) { if (validComponents[cmpt] == -1) { Hphi.replace ( cmpt, dimensionedScalar(Hphi.dimensions(), 0) ); } } return tHphi; } template<class Type> void Foam::fvMatrix<Type>::addBoundaryDiag ( scalarField& diag, const direction solveCmpt ) const { forAll(internalCoeffs_, patchi) { addToInternalField ( lduAddr().patchAddr(patchi), internalCoeffs_[patchi].component(solveCmpt), diag ); } }

    这里面的求解过程包含了:
    $$
    H=\frac{\left [-\sum a_{\mathbf{N}}\mathbf{U_N} + (\mathbf{b}+\mathbf{b'})+(average(a_p')-a_p')\mathbf{U_C}\right]}{\Delta V}
    $$

    最后:

    $$
    HbyA= \frac{H}{A}=\frac{\Delta V}{average(a_p')+diag}\frac{\left [-\sum a_{\mathbf{N}}\mathbf{U_N} + (\mathbf{b}+\mathbf{b'})+(average(a_p')-a_p')\mathbf{U_C}\right]}{\Delta V}
    $$
    $$
    HbyA= \frac{H}{A}=\frac{\left [-\sum a_{\mathbf{N}}\mathbf{U_N} + (\mathbf{b}+\mathbf{b'})+(average(a_p')-a_p')\mathbf{U_C}\right]}{average(a_p')+diag}
    $$

  • icoFoam求解器解析中问题。

    9
    9 帖子
    11k 浏览
    winsway_zeroW

    @李东岳 李老师,您好。volScalarField rAU(1.0/UEqn.A());这个重理论上分析应该是矢量才对,但是细节上的操作确实做成了体标量场。

    template<class Type> Foam::tmp<Foam::volScalarField> Foam::fvMatrix<Type>::A() const { tmp<volScalarField> tAphi ( volScalarField::New ( "A("+psi_.name()+')', psi_.mesh(), dimensions_/psi_.dimensions()/dimVol, extrapolatedCalculatedFvPatchScalarField::typeName ) ); tAphi.ref().primitiveFieldRef() = D()/psi_.mesh().V(); tAphi.ref().correctBoundaryConditions(); return tAphi; }

    $ A=\frac{A_p}{\Delta V}$
    在计算系数Diag的过程中,将边界对主对角线的系数进行了平均更新:

    template<class Type> Foam::tmp<Foam::scalarField> Foam::fvMatrix<Type>::D() const { tmp<scalarField> tdiag(new scalarField(diag())); //这里进行了平均处理并修正了主对角线系数。 addCmptAvBoundaryDiag(tdiag.ref()); return tdiag; }

    为什么这样操作呢?这样会使得系数矩阵不一样了!

  • pairCollision中,A和B分别指网格还是粒子?

    5
    5 帖子
    4k 浏览
    zheZ

    @bestucan 抱歉回复的晚了,已经很感谢您的解答了,帮我捋清了很多了。我按着您的这个思路走了一遍,大概明白了我之前给出的的确是A和B都是网格名称。而同时,在分别中也代表着其中包含的粒子a和b,也就是您说的也可以理解为A 和B 也是粒子。

    我的理解是A 和B 是有相关的两个cells,而最后的

    evaluatePair(*pA_ptr, *pB_ptr);

    是建立两个网格之间(包括网格里所有粒子)的一种配对机制,不知道对不对?

    // Loop over the other Parcels in cell A (aO) forAll(cellOccupancy[realCelli], aO) { pB_ptr = cellOccupancy[realCelli][aO]; // Do not double-evaluate, compare pointers, arbitrary // order if (pB_ptr > pA_ptr) { evaluatePair(*pA_ptr, *pB_ptr); } }

    在之后的loop里,对于相同cell里的粒子相对配对,也就是说把一个粒子单拎出来a,然后其它的所有粒子相当于a0(而这个其实与之前B网格的指示相同而以)。这样理解不知道对不对?

    最后一点儿避免两次被征用,所以有了一个对比。

    知道您肯定也花时间翻了一遍了,实在是感谢!

    如果有其他朋友一起讨论,感激不尽。

  • 3 帖子
    3k 浏览
    V

    @OF初学者周 这个是最后sample操作时候的报错,求解器的报错在 log.multiphaseEulerFoam里边。
    我修改了求解器为multiphaseEulerFoam, phase properties type basicMultiphaseSystem, 提示需要定义alpha.water, 添加后还需要定义fvSchemes,可能是我添加有误,操作完成后还出现如下报错:
    我也来蹲🙈一个大佬:papa:

    Courant Number mean: 0.0001514815028686309 max: 0.01324964389123762 deltaT = 0.002398081534772182 Time = 0.00239808 PIMPLE: Iteration 1 #0 Foam::error::printStack(Foam::Ostream&) at ??:? #1 Foam::sigFpe::sigHandler(int) at ??:? #2 ? in "/lib/x86_64-linux-gnu/libc.so.6" #3 Foam::MULES::limitSum(Foam::UPtrList<Foam::Field<double> const> const&, Foam::UPtrList<Foam::Field<double> >&, Foam::HashSet<int, Foam::Hash<int> > const&) at ??:? #4 void Foam::MULES::limitSum<Foam::PtrList<Foam::GeometricField<double, Foam::fvsPatchField, Foam::surfaceMesh> > >(Foam::PtrList<Foam::GeometricField<double, Foam::fvsPatchField, Foam::surfaceMesh> > const&, Foam::PtrList<Foam::GeometricField<double, Foam::fvsPatchField, Foam::surfaceMesh> >&, Foam::HashSet<int, Foam::Hash<int> > const&) at ??:? #5 Foam::phaseSystem::solve(Foam::PtrList<Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh> > const&, Foam::PtrList<Foam::GeometricField<double, Foam::fvsPatchField, Foam::surfaceMesh> > const&) at ??:? #6 ? in "/home/veen/Disk/OpenFOAM/OpenFOAM-8/platforms/linux64GccDPInt32Opt/bin/multiphaseEulerFoam" #7 __libc_start_main in "/lib/x86_64-linux-gnu/libc.so.6" #8 ? in "/home/veen/Disk/OpenFOAM/OpenFOAM-8/platforms/linux64GccDPInt32Opt/bin/multiphaseEulerFoam" Floating point exception (core dumped)
  • 3 帖子
    2k 浏览
    strive_DUTS

    @李东岳 谢谢李老师!这是调用函数模板的一种形式吧。此问题已解决!但关于autoCreatek函数的实现功能还是不太明白:mihu:

  • 3 帖子
    3k 浏览
    J

    @cccrrryyy 嗯呢,已经明白了~

  • 1 帖子
    815 浏览

    一般的openFOAM算例文件,时间步文件下就是场数据,而且场数据和网格点一般多,然而mutiRegions问题时间步文件下是region名称,而且场数据和region保持一致,这样导入的话,tecplot绘图会出现如下怪异场!微信图片_20201230134855.png

  • 如何在paraView中画出这样的图

    3
    3 帖子
    2k 浏览

    感谢感谢,成功了

  • WSL2安装OpenFOAM

    10
    10 帖子
    9k 浏览
    bestucanB

    wsl是win模拟linux的api,就像wine一样。wsl2就是个虚拟机,不过经过微软优化,没其他虚拟机那么嗝应人。

    如果是升级失败,系统里应该有还原点,还原一下更新前的系统状态就好,不会擦除其他个人数据。

  • 13 帖子
    9k 浏览
    李东岳

    @队长别开枪 大佬大佬 感谢分享!!

  • 后处理新定义一个物理量问题

    3
    3 帖子
    3k 浏览
    孟豪龙

    谢谢老师的回复,老师提供了一个可供一试的办法。这里给出一个使用 Python programmable filter 后处理的办法,粘贴在这,供参考。使用时需要VTK格式
    29a52e6c-72e1-4861-b38c-6733d4ea7b35-image.png

  • 添加湍流模型遇到问题(重发)

    7
    7 帖子
    8k 浏览
    R

    李老师您好,请问这个问题解决了吗?我也遇到类似的问题,就是只改湍流模型的名字,在编译的时候也出现了一些error

  • fsiFoam中的固体求解器

    7
    7 帖子
    6k 浏览

    @Stan同学 别邮箱请教了,发布在论坛估计能更快得到解答,祝好

  • rhoSimpleFoam求解器算例

    3
    3 帖子
    4k 浏览
    李东岳

    非常感谢!我更新了下方程33:xiexie:

    方程22是严谨的情况下的方程,但是22并不能用,因为$A^{n+2}$未知,所以还是要把方程22参考方程14那样线性化一下。就是方程23

  • 5 帖子
    5k 浏览
    C

    @yhdthu 谢谢!