各位老师和前辈们好,
我想要通过划定cellZone区域来计算作用于该区域网格上的压力和剪切力,预期功能类似于forces.H中的void Foam::functionObjects::forces::calcForcesMoments()函数,然而,该函数是基于边界patch计算的【代码片段1】,我想要基于cellZone实现。而计算多孔介质部分的力【代码片段2】正是基于cellZone实现的,因此,
(如果有老师能够直接给出示例就更好了
)
以下摘取了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);
}
}
}
祝好~