sHM后如何在临近边界的区域设置高粘度
-
@东岳 老师,这个方法似乎有一些不妥,我修改了simpleFoam求解器调用的Newtonian粘度模型(暂且新命名为“twonuNewtonian”),添加了代码
nu_.patchInternalField() = scalar(1000);
但是wmake libso时报错如下
error: ‘Foam::volScalarField’ has no member named ‘patchInternalField’
请问老师应该如何修改 初次接触编程,网上看了一些关于patchInternalField的内容,仍然一知半解,它的本质指的是什么,不知道能不能这样对其赋值。
twonuNewtonian.C 部分代码如下:
bool Foam::viscosityModels::twonuNewtonian::read ( const dictionary& viscosityProperties ) { viscosityModel::read(viscosityProperties); viscosityProperties_.lookup("nu") >> nu0_; nu_ = nu0_; nu_.patchInternalField() = scalar(1000); //此处一行是所添加的 return true; }
-
@东岳 非常感谢老师深入讲解!这个方法似乎还有一些问题,我添加了您修改的代码如下所示,成功编译。
bool Foam::viscosityModels::twonuNewtonian::read ( const dictionary& viscosityProperties ) { viscosityModel::read(viscosityProperties); viscosityProperties_.lookup("nu") >> nu0_; nu_ = nu0_; const fvPatchList& patches = nu_.mesh().boundary(); forAll(patches, patchi) { scalarField one(1000.0, nu_.mesh().boundary()[patchi].size()); nu_.boundaryFieldRef()[patchi].patchInternalField() = one; } return true; }
不过在计算后,发现与更改粘度模型前的计算结果对比发现没有区别 ,是不是边界条件覆盖了它的作用?
- 从代码上来看,是对边界临近的一层网格赋予一个粘度值,能否控制对距离边界的N层内网格赋一个粘度,这样边界条件就不会对它影响?
- 从代码上来看,是对所有边界临近的一层网格赋予一个粘度值,可是只想对某一特定的边界赋值,我在这个网页 openfoam寻找与某一边界相邻的一层网格 得知可以通过以下方法定位到边界的ID,如何加到上述代码里来实现呢?
label patchID = mesh.boundaryMesh().findPatchID("cylinder");
老师您曾在这个帖子回复过我用坐标划分区域设置不同粘度,不过经过sHM后剖分的网格,流动通道很多而且壁面都是不规则的,难以通过用坐标来划分,所以想通过边界附近的网格入手去设置。
问题有点多,恳请老师指点迷津,麻烦老师了 -
@东岳 老师您好,我尝试了您给出的这行代码
scalarField one(1.0, nu_.mesh().boundary()[patchi].size()); nu_.boundaryFieldRef()[patchi].patchInternalField() = one;
成功编译,但是运行时报错
Attempted assignment to a const reference to an object of type N4Foam5FieldIdEE From function void Foam::tmp<T>::operator=(const Foam::tmp<T>&) [with T = Foam::Field<double>]
是不是不能这样赋值给patchInternalField()?应该怎么修改呢?
-
@东岳 老师,应该放在什么位置呢,我放在了crateFields.H 里面新定义的量下面
Info<< "Reading field nuk\n" << endl; volScalarField nuk ( IOobject ( "nuk", runTime.timeName(), mesh, IOobject::MUST_READ, IOobject::NO_WRITE ), mesh ); const fvPatchList& patches = nuk.mesh().boundary(); forAll(patches, patchi) { scalarField one(3.0, nuk.mesh().boundary()[patchi].size()); nuk.boundaryFieldRef()[patchi].patchInternalField() = one; }
还是这种问题,这是为什么呢?
-
dimensionedScalar nu ( "nu", dimViscosity, transportProperties ); wordList patchTypes(mesh.boundaryMesh().size(),"fixedValue"); volScalarField nu0 ( IOobject ( "nu0", runTime.timeName(), mesh, IOobject::NO_READ, IOobject::AUTO_WRITE ), mesh, nu, patchTypes ); const scalar nuWanted(1000.0); labelUList neiCells(nu0.boundaryFieldRef()[0].patch().faceCells()); forAll(neiCells, cellI) { nu0.primitiveFieldRef()[neiCells[cellI]]=nuWanted; }