计算作用于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); } } }
-
@李东岳 李老师,这也正是我遇到的问题
。
退一步我做一个简化,在图示的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; } }