Bugfix: added ramping to MRF zones

This commit is contained in:
Hrvoje Jasak 2017-01-11 11:57:48 +00:00
parent bd5604c100
commit 3d2d26334a
9 changed files with 104 additions and 73 deletions

View file

@ -3,6 +3,9 @@ rho = thermo.rho();
volScalarField rUA = 1.0/UEqn().A();
U = rUA*UEqn().H();
// Update boundary velocity for consistency with the flux
mrfZones.correctBoundaryVelocity(U);
if (pimple.nCorrPISO() <= 1)
{
UEqn.clear();

View file

@ -12,6 +12,9 @@
{
U = rUA*UEqn.H();
// Update boundary velocity for consistency with the flux
mrfZones.correctBoundaryVelocity(U);
// Calculate phi for boundary conditions
phi = rhof*fvc::interpolate(U) & mesh.Sf();

View file

@ -12,6 +12,9 @@
{
U = rUA*UEqn.H();
// Update boundary velocity for consistency with the flux
mrfZones.correctBoundaryVelocity(U);
// Calculate phi for boundary conditions
phi = rhof*fvc::interpolate(U) & mesh.Sf();

View file

@ -9,6 +9,10 @@
1/HUEqn().A()
);
// Update boundary velocity for consistency with the flux
// This is needed for a ramped MRF
mrfZones.correctBoundaryVelocity(U);
// Store velocity under-relaxation point before using U for
// the flux precursor
U.storePrevIter();

View file

@ -4,6 +4,9 @@
U = rUA*UEqn.H();
// Update boundary velocity for consistency with the flux
mrfZones.correctBoundaryVelocity(U);
surfaceScalarField phiU
(
"phiU",

View file

@ -32,6 +32,8 @@ License
#include "faceSet.H"
#include "geometricOneField.H"
using namespace Foam::mathematicalConstant;
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
defineTypeNameAndDebug(Foam::MRFZone, 0);
@ -68,7 +70,6 @@ void Foam::MRFZone::setMRFFaces()
}
}
label nZoneFaces = 0;
for (label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++)
@ -83,7 +84,7 @@ void Foam::MRFZone::setMRFFaces()
labelHashSet excludedPatches(excludedPatchLabels_);
Info<< "Excluded patches: " << excludedPatchLabels_ << endl;
forAll (patches, patchI)
{
const polyPatch& pp = patches[patchI];
@ -142,9 +143,9 @@ void Foam::MRFZone::setMRFFaces()
{
const polyPatch& pp = patches[patchi];
forAll (pp, patchFacei)
forAll (pp, patchFaceI)
{
label faceI = pp.start()+patchFacei;
label faceI = pp.start() + patchFaceI;
if (faceType[faceI] == 1)
{
@ -159,29 +160,29 @@ void Foam::MRFZone::setMRFFaces()
includedFaces_.setSize(patches.size());
excludedFaces_.setSize(patches.size());
forAll (nIncludedFaces, patchi)
forAll (nIncludedFaces, patchI)
{
includedFaces_[patchi].setSize(nIncludedFaces[patchi]);
excludedFaces_[patchi].setSize(nExcludedFaces[patchi]);
includedFaces_[patchI].setSize(nIncludedFaces[patchI]);
excludedFaces_[patchI].setSize(nExcludedFaces[patchI]);
}
nIncludedFaces = 0;
nExcludedFaces = 0;
forAll (patches, patchi)
forAll (patches, patchI)
{
const polyPatch& pp = patches[patchi];
const polyPatch& pp = patches[patchI];
forAll (pp, patchFacei)
forAll (pp, patchFaceI)
{
label faceI = pp.start()+patchFacei;
label faceI = pp.start() + patchFaceI;
if (faceType[faceI] == 1)
{
includedFaces_[patchi][nIncludedFaces[patchi]++] = patchFacei;
includedFaces_[patchI][nIncludedFaces[patchI]++] = patchFaceI;
}
else if (faceType[faceI] == 2)
{
excludedFaces_[patchi][nExcludedFaces[patchi]++] = patchFacei;
excludedFaces_[patchI][nExcludedFaces[patchI]++] = patchFaceI;
}
}
}
@ -201,12 +202,13 @@ void Foam::MRFZone::setMRFFaces()
internalFaces.write();
faceSet MRFFaces(mesh_, "includedFaces", 100);
forAll (includedFaces_, patchi)
forAll (includedFaces_, patchI)
{
forAll (includedFaces_[patchi], i)
forAll (includedFaces_[patchI], i)
{
label patchFacei = includedFaces_[patchi][i];
MRFFaces.insert(patches[patchi].start()+patchFacei);
label patchFaceI = includedFaces_[patchI][i];
MRFFaces.insert(patches[patchI].start() + patchFaceI);
}
}
Pout<< "Writing " << MRFFaces.size()
@ -215,12 +217,12 @@ void Foam::MRFZone::setMRFFaces()
MRFFaces.write();
faceSet excludedFaces(mesh_, "excludedFaces", 100);
forAll (excludedFaces_, patchi)
forAll (excludedFaces_, patchI)
{
forAll (excludedFaces_[patchi], i)
forAll (excludedFaces_[patchI], i)
{
label patchFacei = excludedFaces_[patchi][i];
excludedFaces.insert(patches[patchi].start() + patchFacei);
label patchFaceI = excludedFaces_[patchI][i];
excludedFaces.insert(patches[patchI].start() + patchFaceI);
}
}
Pout<< "Writing " << excludedFaces.size()
@ -240,11 +242,15 @@ Foam::vector Foam::MRFZone::Omega() const
else
{
// Ramping
Info<< "MRF Ramp: " << Foam::min(mesh_.time().value()/rampTime_, 1)
<< endl;
const scalar t = mesh_.time().value();
const scalar ramp = sin(2*pi/(4*rampTime_)*Foam::min(rampTime_, t));
return Foam::min(mesh_.time().value()/rampTime_, 1)*
omega_.value()*axis_.value();
Info<< "MRF Ramp: " << ramp << endl;
return ramp*omega_.value()*axis_.value();
// return Foam::min(mesh_.time().value()/rampTime_, 1.0)*
// omega_.value()*axis_.value();
}
}
@ -304,7 +310,6 @@ Foam::MRFZone::MRFZone(const fvMesh& mesh, Istream& is)
}
}
bool cellZoneFound = (cellZoneID_ != -1);
reduce(cellZoneFound, orOp<bool>());
@ -317,6 +322,11 @@ Foam::MRFZone::MRFZone(const fvMesh& mesh, Istream& is)
<< exit(FatalError);
}
Info<< "Creating MRF for cell zone " << name_ << ". rpm = "
<< 30*omega_.value()/mathematicalConstant::pi
<< endl;
setMRFFaces();
}
@ -384,24 +394,24 @@ void Foam::MRFZone::relativeVelocity(volVectorField& U) const
U[celli] -= (rotVel ^ (C[celli] - origin));
}
// Included patches
// Included faces
forAll (includedFaces_, patchi)
{
forAll (includedFaces_[patchi], i)
{
label patchFacei = includedFaces_[patchi][i];
U.boundaryField()[patchi][patchFacei] = vector::zero;
label patchFaceI = includedFaces_[patchi][i];
U.boundaryField()[patchi][patchFaceI] = vector::zero;
}
}
// Excluded patches
// Excluded faces
forAll (excludedFaces_, patchi)
{
forAll (excludedFaces_[patchi], i)
{
label patchFacei = excludedFaces_[patchi][i];
U.boundaryField()[patchi][patchFacei] -=
(rotVel ^ (C.boundaryField()[patchi][patchFacei] - origin));
label patchFaceI = excludedFaces_[patchi][i];
U.boundaryField()[patchi][patchFaceI] -=
(rotVel ^ (C.boundaryField()[patchi][patchFaceI] - origin));
}
}
}
@ -422,25 +432,25 @@ void Foam::MRFZone::absoluteVelocity(volVectorField& U) const
U[celli] += (rotVel ^ (C[celli] - origin));
}
// Included patches
// Included faces
forAll (includedFaces_, patchi)
{
forAll (includedFaces_[patchi], i)
{
label patchFacei = includedFaces_[patchi][i];
U.boundaryField()[patchi][patchFacei] =
(rotVel ^ (C.boundaryField()[patchi][patchFacei] - origin));
label patchFaceI = includedFaces_[patchi][i];
U.boundaryField()[patchi][patchFaceI] =
(rotVel ^ (C.boundaryField()[patchi][patchFaceI] - origin));
}
}
// Excluded patches
// Excluded faces
forAll (excludedFaces_, patchi)
{
forAll (excludedFaces_[patchi], i)
{
label patchFacei = excludedFaces_[patchi][i];
U.boundaryField()[patchi][patchFacei] +=
(rotVel ^ (C.boundaryField()[patchi][patchFacei] - origin));
label patchFaceI = excludedFaces_[patchi][i];
U.boundaryField()[patchi][patchFaceI] +=
(rotVel ^ (C.boundaryField()[patchi][patchFaceI] - origin));
}
}
}
@ -499,10 +509,10 @@ void Foam::MRFZone::meshPhi
{
forAll (includedFaces_[patchi], i)
{
label patchFacei = includedFaces_[patchi][i];
label patchFaceI = includedFaces_[patchi][i];
phi.boundaryField()[patchi][patchFacei] =
(rotVel ^ (Cf.boundaryField()[patchi][patchFacei] - origin));
phi.boundaryField()[patchi][patchFaceI] =
(rotVel ^ (Cf.boundaryField()[patchi][patchFaceI] - origin));
}
}
@ -511,10 +521,10 @@ void Foam::MRFZone::meshPhi
{
forAll (excludedFaces_[patchi], i)
{
label patchFacei = excludedFaces_[patchi][i];
label patchFaceI = excludedFaces_[patchi][i];
phi.boundaryField()[patchi][patchFacei] =
(rotVel ^ (Cf.boundaryField()[patchi][patchFacei] - origin));
phi.boundaryField()[patchi][patchFaceI] =
(rotVel ^ (Cf.boundaryField()[patchi][patchFaceI] - origin));
}
}
}
@ -523,7 +533,7 @@ void Foam::MRFZone::correctBoundaryVelocity(volVectorField& U) const
{
const vector& origin = origin_.value();
const vector rotVel = Omega();
Info<< "rotVel: " << rotVel << endl;
// Included patches
forAll (includedFaces_, patchi)
{
@ -533,9 +543,9 @@ void Foam::MRFZone::correctBoundaryVelocity(volVectorField& U) const
forAll (includedFaces_[patchi], i)
{
label patchFacei = includedFaces_[patchi][i];
label patchFaceI = includedFaces_[patchi][i];
pfld[patchFacei] = (rotVel ^ (patchC[patchFacei] - origin));
pfld[patchFaceI] = (rotVel ^ (patchC[patchFaceI] - origin));
}
U.boundaryField()[patchi] == pfld;

View file

@ -44,7 +44,6 @@ Description
S = - (\mu \, d + \frac{\rho |U|}{2} \, f) U
@f]
Since negative Darcy/Forchheimer parameters are invalid, they can be used
to specify a multiplier (of the max component).
@ -106,15 +105,15 @@ class porousZone
//- Coordinate system used for the zone (Cartesian)
coordinateSystem coordSys_;
//- porosity of the zone (0 < porosity <= 1)
//- Porosity of the zone (0 < porosity <= 1)
// Placeholder for treatment of temporal terms.
// Currently unused.
scalar porosity_;
//- powerLaw coefficient C0
//- Power Law coefficient C0
scalar C0_;
//- powerLaw coefficient C1
//- Power Law coefficient C1
scalar C1_;
//- Darcy coefficient
@ -126,7 +125,7 @@ class porousZone
// Private Member Functions
//- adjust negative resistance values to be multiplier of max value
//- Adjust negative resistance values to be multiplier of max value
static void adjustNegativeResistance(dimensionedVector& resist);
//- Power-law resistance
@ -247,7 +246,13 @@ public:
return cellZoneID_;
}
//- dictionary values used for the porousZone
//- Return cellZone
const cellZone& zone() const
{
return mesh_.cellZones()[cellZoneID_];
}
//- Dictionary values used for the porousZone
const dictionary& dict() const
{
return dict_;

View file

@ -92,7 +92,7 @@ class porousZones
void operator=(const porousZones&);
//- modify time derivative elements
//- Modify time derivative elements
template<class Type>
void modifyDdt(fvMatrix<Type>&) const;