
LiuJiaming
帖子
-
openFoam动网格求助,displacementLaplacian适用性问题! -
openFoam动网格求助,displacementLaplacian适用性问题!@Joker
您好,请问您使用的OF是什么版本呢?我在用displacementLaplacian后,使用moveDynamicMesh预览网格运动的时候,系统报错,似乎没有displacementLaplacian这个求解器。请问是我的字典设置有误吗?Create time Create mesh for time = 0 Selecting dynamicFvMesh dynamicMotionSolverFvMesh Selecting motion solver: displacementLaplacian --> FOAM FATAL IO ERROR: (openfoam-2012) Unknown solver type displacementLaplacian Valid solver types : 7(coded displacementInterpolation displacementLayeredMotion multiSolidBodyMotionSolver sixDoFRigidBodyMotion solidBody velocityDisplacement) file: /OpenFOAM-v2012/myProject/tutorials/floatingPorousPimpleFoam/Condition1_Uin=1.2/constant/dynamicMeshDict at line 18 to 26. From static Foam::autoPtr<Foam::motionSolver> Foam::motionSolver::New(const Foam::polyMesh&, const Foam::IOdictionary&) in file motionSolvers/motionSolver/motionSolver.C at line 137. FOAM exiting
-
mesh_.C()[celli]编译报错@coolhhh 厉害,测试代码copy了。不过,这里直接操作就又可以了
-
mesh_.C()[celli]编译报错@coolhhh
感谢解答,我之所以直接操作mesh.C(),是因为我在源码中搜到了这种用法,OF2012 -
为什么我在用致动线模型算的时候得到的涡量图和文献中不一样@卡洛 卡老师,能分享一下边界条件的修改思路吗
-
mesh_.C()[celli]编译报错mesh_.C()
mesh_.C().primitiveField()
mesh_.C().internalField()
mesh_.C().boundaryField()
这四个返回值之间的区别是什么呢? -
mesh_.C()[celli]编译报错各位前辈大家好,
我在使用
const vector cellCentre = mesh_.C()[celli]
收集网格中心坐标时,编译器出现报错:In file included from cfdTools/general/porosityModel/floatingDarcyForchheimer/floatingDarcyForchheimer.H:216, from cfdTools/general/porosityModel/floatingDarcyForchheimer/floatingDarcyForchheimer.C:30: cfdTools/general/porosityModel/floatingDarcyForchheimer/floatingDarcyForchheimerTemplates.C: In member function ‘void Foam::porosityModels::floatingDarcyForchheimer::applyInCalcForce(Foam::scalarField&, Foam::vectorField&, const scalarField&, const RhoFieldType&, const scalarField&, const vectorField&, Foam::vectorField&) const’: cfdTools/general/porosityModel/floatingDarcyForchheimer/floatingDarcyForchheimerTemplates.C:119:48: error: no match for ‘operator[]’ (operand types are ‘const volVectorField’ {aka ‘const Foam::GeometricField<Foam::Vector<double>, Foam::fvPatchField, Foam::volMesh>’} and ‘const label’ {aka ‘const int’}) 119 | const vector cellCentre = mesh_.C()[celli]; |
貌似
mesh_.C()
返回的数据类型不支持使用[]符号,可是为什么在其他代码中就可以这样使用mesh_.C()[celli]
呢?后期,我通过使用
const vector cellCentre = mesh_.C().primitiveField()[celli]
通过编译。不过尚不清楚其与mesh_.C()
返回的结果是否存在差异。烦请各位老师解答~
-
计算作用于cellZone上的压力和剪切力已经想到合适的解决方案啦! 封楼
-
计算作用于cellZone上的压力和剪切力@李东岳 李老师,这也正是我遇到的问题
。
退一步我做一个简化,在图示的myForces.H的结构最外层cell上套一层patch边界,可不可以仅用patch计算cellZone最外层网格的力和力矩[1],而不阻碍水体穿越被patch包裹的cellZone区域?
这个想法可行吗,如果可行的话老师方便指点一下,如何实现水体不穿越patch的功能?
[1] 只计算外层网格表面的受力是因为网衣通常不会太厚,有文献采用2m厚的多孔介质模型,网格尺寸0.5m来模拟。
在OF2206中,
对于patch,有addToPatchFields函数:void Foam::functionObjects::forces::addToPatchFields ( const label patchi, const vectorField& Md, const vectorField& fP, const vectorField& fV ) { sumPatchForcesP_ += sum(fP); sumPatchForcesV_ += sum(fV); force().boundaryFieldRef()[patchi] += fP + fV; const vectorField mP(Md^fP); const vectorField mV(Md^fV); sumPatchMomentsP_ += sum(mP); sumPatchMomentsV_ += sum(mV); moment().boundaryFieldRef()[patchi] += mP + mV; }
对于多孔介质的cellZone,有addToInternalField函数:
void Foam::functionObjects::forces::addToInternalField ( const labelList& cellIDs, const vectorField& Md, const vectorField& f ) { auto& force = this->force(); auto& moment = this->moment(); forAll(cellIDs, i) { const label celli = cellIDs[i]; sumInternalForces_ += f[i]; force[celli] += f[i]; const vector m(Md[i]^f[i]); sumInternalMoments_ += m; moment[celli] = m; } }
-
计算作用于cellZone上的压力和剪切力@李东岳 老师,我想要模拟浮式多孔介质模型在流体中的运动,因此需要获得物体的力(矩),这里的剪切力其实对应一楼【代码片段1】的54行和56行。
-
计算作用于cellZone上的压力和剪切力 -
计算作用于cellZone上的压力和剪切力总体而言,就是要计算cellZone所有网格上的法向力和切向力,而不是仅仅计算作用在固壁边界上的力。
这里通过图示表达目的:
-
计算作用于cellZone上的压力和剪切力此处附上改写的代码,烦请各位老师指出错误所在,不胜感激:
if (porosity_) { const volVectorField& U = lookupObject<volVectorField>(UName_); const volScalarField& p = lookupObject<volScalarField>(pName_); // Add code. const volScalarField rho(this->rho()); const volScalarField mu(this->mu()); const HashTable<const porosityModel*> models = obr_.lookupClass<porosityModel>(); if (models.empty()) { WarningInFunction << "Porosity effects requested, but no porosity models found " << "in the database" << endl; } forAllConstIters(models, iter) { // Non-const access required if mesh is changing porosityModel& pm = const_cast<porosityModel&>(*iter()); vectorField fPTot(pm.porousForce(U, rho, mu)); // Modified code. const labelList& cellZoneIDs = pm.cellZoneIDs(); for (const label zonei : cellZoneIDs) { const cellZone& cZone = mesh_.cellZones()[zonei]; // Get cells in zonei. const vectorField d(mesh_.C(), cZone); const vectorField fP(fPTot, cZone); const vectorField Md(d - coordSys_.origin()); const labelList& cellsID = cZone; // Add code: Get cellsID(index) list in zonei. vectorField fN(cZone.size(), Zero); vectorField fT(cZone.size(), Zero); scalar pRef = pRef_/rho(p); // Add code: Scale pRef by density for incompressible simulations tmp<volSymmTensorField> tdevRhoReff = devRhoReff(); const volSymmTensorField& devRhoReff1 = tdevRhoReff(); Info << "cellZoneIDs zonei = " << zonei << "\n"<< endl; Info << "cells in zonei: cZone.size() = " << cZone.size() << "\n"<< endl; Info << "fN.size() = " << fN.size() << "\n"<< endl; Info << "fT.size() = " << fT.size() << "\n"<< endl; Info << "fP.size() = " << fP.size() << "\n"<< endl; forAll (cellsID, celli) { label cellID = cellsID[celli]; const labelList& cellFaces = mesh_.cells()[cellID]; forAll (cellFaces, facei) { label faceID = cellFaces[facei]; // fN. vector cellFacesFN = rho(p) * mesh_.Sf()[faceID] * (p[cellID] - pRef); fN [celli] += cellFacesFN; // fT. vector cellsFacesfT = mesh_.Sf()[faceID] & devRhoReff1[faceID]; fT [celli] += cellFacesFT; Info << "No." << celli << "cell's ID(index) is " << cellID << "\n" << endl; Info << "fN = " << fN[celli] << "\n" << endl; Info << "fT = " << fT[celli] << "\n" << endl; Info << "fP = " << fP[celli] << "\n" << endl; } } addToFields(cZone, Md, fN, fT, fP); applyBins(Md, fN, fT, fP, d); } } }
-
计算作用于cellZone上的压力和剪切力各位老师和前辈们好,
我想要通过划定cellZone区域来计算作用于该区域网格上的压力和剪切力,预期功能类似于forces.H中的void Foam::functionObjects::forces::calcForcesMoments()函数,然而,该函数是基于边界patch计算的【代码片段1】,我想要基于cellZone实现。而计算多孔介质部分的力【代码片段2】正是基于cellZone实现的,因此,
-
i) 我想将基于patch的计算边界力的方法移植于多孔介质模块中,这样可行吗?
-
ii) 评论区我放出改写的代码,烦请各位老师指出需要改进的地方
(如果有老师能够直接给出示例就更好了
)
以下摘取了forces.H中void Foam::functionObjects::forces::calcForcesMoments()部分源码:
【代码片段1】if (directForceDensity_) { const auto& fD = lookupObject<volVectorField>(fDName_); const auto& Sfb = mesh_.Sf().boundaryField(); for (const label patchi : patchSet_) { const vectorField& d = mesh_.C().boundaryField()[patchi]; const vectorField Md(d - origin); const scalarField sA(mag(Sfb[patchi])); // Pressure force = surfaceUnitNormal*(surfaceNormal & forceDensity) const vectorField fP ( Sfb[patchi]/sA *( Sfb[patchi] & fD.boundaryField()[patchi] ) ); // Viscous force (total force minus pressure fP) const vectorField fV(sA*fD.boundaryField()[patchi] - fP); addToPatchFields(patchi, Md, fP, fV); } } else { const auto& p = lookupObject<volScalarField>(pName_); const auto& Sfb = mesh_.Sf().boundaryField(); tmp<volSymmTensorField> tdevRhoReff = devRhoReff(); const auto& devRhoReffb = tdevRhoReff().boundaryField(); // Scale pRef by density for incompressible simulations const scalar rhoRef = rho(p); const scalar pRef = pRef_/rhoRef; for (const label patchi : patchSet_) { const vectorField& d = mesh_.C().boundaryField()[patchi]; const vectorField Md(d - origin); const vectorField fP ( rhoRef*Sfb[patchi]*(p.boundaryField()[patchi] - pRef) ); const vectorField fV(Sfb[patchi] & devRhoReffb[patchi]); addToPatchFields(patchi, Md, fP, fV); } }
【代码片段2】
if (porosity_) { const auto& U = lookupObject<volVectorField>(UName_); const volScalarField rho(this->rho()); const volScalarField mu(this->mu()); const auto models = obr_.lookupClass<porosityModel>(); if (models.empty()) { WarningInFunction << "Porosity effects requested, " << "but no porosity models found in the database" << endl; } forAllConstIters(models, iter) { // Non-const access required if mesh is changing auto& pm = const_cast<porosityModel&>(*iter()); const vectorField fPTot(pm.force(U, rho, mu)); const labelList& cellZoneIDs = pm.cellZoneIDs(); for (const label zonei : cellZoneIDs) { const cellZone& cZone = mesh_.cellZones()[zonei]; const vectorField d(mesh_.C(), cZone); const vectorField fP(fPTot, cZone); const vectorField Md(d - origin); addToInternalField(cZone, Md, fP); } } }
祝好~
-
-
OF中如何获取网格编号(索引)?RT,请教大佬们,网上基本都是获取与当前网格相邻信息的代码,请问有没有类似mesh.cells()的方法获取网格的编号(索引)?
-
OpenFOAM2012中的interfoam是如何调用六自由度sixDoFRigidBodyMotion求解器的?@HITSC30 感谢回答,两篇文章写得很详细!
-
OpenFOAM2012中的interfoam是如何调用六自由度sixDoFRigidBodyMotion求解器的?各位前辈大家好,
最近我在编译自己改进的求解器,其中涉及到修改interfoam求解器,但是不知道interfoam是如何调用sixDoFRigidBodyMotion处理漂浮式结构运动的。我猜测六自由度运动求解代码会被包含在动网格文件中,不过还是没有找到具体被包含在哪里,所以烦请各位答疑~
(下面附上interFoam.C源码头文件截图)
感谢~
-
OpenFOAM的原生多孔介质模型是否可以在变形网格中的静态网格区域实现功能?@李东岳 计算域网格是?老师可以给一条链接吗,我学习一下!
-
OpenFOAM的原生多孔介质模型是否可以在变形网格中的静态网格区域实现功能?@李东岳 李老师,如果没有办法避免创建patch,那我用多孔介质模型把它包起来,这个思路可行吗?我这边尝试模拟一个二维圆柱在水中自由落体的算例,但貌似算了一下就报错了,从报错信息上看不出哪里有问题,我把报错log和算例关键设置也一并放在下边~
图1
图2
log文件
log.mpirun -
OpenFOAM的原生多孔介质模型是否可以在变形网格中的静态网格区域实现功能?@李东岳 李老师,那不可以按照多孔介质模型本身的计算方法计算吗?就像这张图,D赋值很大,效果等同于固壁边界。我的提问不够专业,还请老师耐心解答~