42 #define PhiDimensionErrorInFunction(phi) \ 43 FatalErrorInFunction \ 44 << "Incompatible dimensions for " << phi.name() << ": " \ 45 << phi.dimensions() << nl \ 46 << "Dimensions should be " << dimMass/dimTime << " or " \ 47 << dimVolume/dimTime << exit(FatalError) 53 namespace functionObjects
78 wordList PhiPatchFieldTypes(mesh_.boundaryMesh().size());
81 PhiPatchFieldTypes[
patchi] =
82 p.boundaryField()[
patchi].fixesValue()
94 mesh_.time().timeName(),
105 mesh_.setFluxRequired(PhiPtr_->name());
113 Foam::functionObjects::phaseScalarTransport::alphaPhi()
123 << alphaPhiName_ <<
" was not found, so generating it" <<
endl;
131 tmp<surfaceScalarField> tAlphaPhi
145 const word laplacianScheme =
"laplacian(" + pName_ +
")";
151 auto writeDDt = [&](
const label i)
164 Info<<
type() <<
": Writing " << DDtAlpha.name() <<
endl;
167 if (debug && mesh_.time().writeTime())
173 nonOrthogonalSolutionControl& control =
174 mesh_.lookupObjectRef<nonOrthogonalSolutionControl>
176 solutionControl::typeName
182 while (control.correctNonOrthogonal())
191 PhiEqn.solve(pName_);
193 if (control.finalNonOrthogonalIter())
195 alphaPhi += PhiEqn.flux();
204 while (control.correctNonOrthogonal())
213 PhiEqn.solve(pName_);
215 if (control.finalNonOrthogonalIter())
217 alphaPhi += PhiEqn.flux();
227 if (debug && mesh_.time().writeTime())
237 Foam::functionObjects::phaseScalarTransport::D
252 const word& nameNoPhase = momentumTransportModel::typeName;
277 return alphaD_*turbulence.nu() + alphaDt_*turbulence.nut();
281 return alphaD_*turbulence.mu() + alphaDt_*turbulence.mut();
286 return tmp<volScalarField>(
nullptr);
301 fieldName_(dict.
lookup(
"field")),
304 residualAlpha_(rootSmall),
310 mesh_.time().timeName(),
323 <<
"Field \"" << fieldName_ <<
"\" does not have a phase extension " 324 <<
"in its name. If it is associated with \"phaseA\" then it " 325 <<
"should be named \"" << fieldName_ <<
".phaseA\"." 373 writeAlphaField_ = dict.
lookupOrDefault<
bool>(
"writeAlphaField",
true);
394 const word divScheme =
395 "div(" + alphaPhi.
name() +
"," + schemesField_ +
")";
396 const word laplacianScheme =
397 "laplacian(" + D.
name() +
"," + schemesField_ +
")";
400 const scalar relaxCoeff =
401 mesh_.relaxEquation(schemesField_)
402 ? mesh_.equationRelaxationFactor(schemesField_)
414 for (
int i=0; i<=nCorr_; i++)
427 fvModels.source(alpha, s_)
432 fieldEqn.
relax(relaxCoeff);
434 fieldEqn.solve(schemesField_);
443 for (
int i=0; i<=nCorr_; i++)
456 fvModels.source(alpha, rho, s_)
461 fieldEqn.
relax(relaxCoeff);
463 fieldEqn.solve(schemesField_);
473 if (writeAlphaField_)
475 if (!alphaSPtr_.valid())
484 +
word(toupper(fieldName_[0]))
485 + fieldName_(1, fieldName_.size() - 1),
486 mesh_.time().timeName(),
497 alphaSPtr_() = alpha*s_;
501 if (alphaSPtr_.valid())
503 alphaSPtr_().
clear();
fvMatrix< scalar > fvScalarMatrix
#define forAll(list, i)
Loop across all elements in list.
virtual Ostream & write(const char)=0
Write character.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
const word & name() const
Return name.
errorManipArg< error, int > exit(error &err, const int errNo=1)
A list of keyword definitions, which are a keyword followed by any number of values (e...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
static const char *const typeName
tmp< GeometricField< Type, fvPatchField, volMesh > > div(const GeometricField< Type, fvsPatchField, surfaceMesh > &ssf)
volScalarField alpha(IOobject("alpha", runTime.timeName(), mesh, IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE), lambda *max(Ua &U, zeroSensitivity))
addToRunTimeSelectionTable(functionObject, Qdot, dictionary)
static tmp< GeometricField< scalar, fvPatchField, volMesh > > New(const word &name, const Internal &, const PtrList< fvPatchField< scalar >> &)
Return a temporary field constructed from name,.
Ostream & endl(Ostream &os)
Add newline and flush stream.
Calculate the matrix for the laplacian of the field.
word member() const
Return member (name without the extension)
word group() const
Return group (extension part of name)
virtual bool read(const dictionary &)
Read the settings from the given dictionary.
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
Macros for easy insertion into run-time selection tables.
const dimensionSet dimLength
tmp< GeometricField< Type, fvPatchField, volMesh > > ddt(const dimensioned< Type > dt, const fvMesh &mesh)
GeometricField< scalar, fvPatchField, volMesh > volScalarField
Calculate the first temporal derivative.
CompressibleMomentumTransportModel< dynamicTransportModel > momentumTransportModel
const dimensionSet dimTime
const dimensionSet & dimensions() const
Return dimensions.
virtual bool read(const dictionary &)
Read optional controls.
bool read(const char *, int32_t &)
virtual bool write()
Do nothing. The field is registered and written automatically.
Foam::fvConstraints & fvConstraints
void clear()
Clear the list, i.e. set size to zero.
A class for handling words, derived from string.
static word groupName(Name name, const word &group)
#define PhiDimensionErrorInFunction(phi)
tmp< fvMatrix< Type > > ddt(const GeometricField< Type, fvPatchField, volMesh > &vf)
Calculate the matrix for the first temporal derivative.
bool readIfPresent(const word &, T &, bool recursive=false, bool patternMatch=true) const
Find an entry if present, and assign to T.
static const word null
An empty word.
surfaceScalarField alphaPhi(phi.name()+alpha1.name(), fvc::flux(phi, alpha1, alphaScheme))
A special matrix type and solver, designed for finite volume solutions of scalar equations. Face addressing is used to make all matrix assembly and solution loops vectorise.
virtual ~phaseScalarTransport()
Destructor.
Calculate the divergence of the given field.
Info<< "Reading field U\"<< endl;volVectorField U(IOobject("U", runTime.timeName(), mesh, IOobject::MUST_READ, IOobject::AUTO_WRITE), mesh);volScalarField rho(IOobject("rho", runTime.timeName(), mesh, IOobject::NO_READ, IOobject::AUTO_WRITE), thermo.rho());volVectorField rhoU(IOobject("rhoU", runTime.timeName(), mesh, IOobject::NO_READ, IOobject::NO_WRITE), rho *U);volScalarField rhoE(IOobject("rhoE", runTime.timeName(), mesh, IOobject::NO_READ, IOobject::NO_WRITE), rho *(e+0.5 *magSqr(U)));surfaceScalarField pos(IOobject("pos", runTime.timeName(), mesh), mesh, dimensionedScalar(dimless, 1.0));surfaceScalarField neg(IOobject("neg", runTime.timeName(), mesh), mesh, dimensionedScalar(dimless, -1.0));surfaceScalarField phi("phi", fvc::flux(rhoU));Info<< "Creating turbulence model\"<< endl;autoPtr< compressible::momentumTransportModel > turbulence(compressible::momentumTransportModel::New(rho, U, phi, thermo))
tmp< fvMatrix< Type > > div(const surfaceScalarField &flux, const GeometricField< Type, fvPatchField, volMesh > &vf, const word &name)
static autoPtr< dictionary > New(Istream &)
Construct top-level dictionary on freestore from Istream.
void relax(const scalar alpha)
Relax matrix (for steady-state solution).
const dimensionSet dimMass
word name(const complex &)
Return a string representation of a complex.
defineTypeNameAndDebug(Qdot, 0)
static tmp< GeometricField< Type, fvsPatchField, surfaceMesh > > interpolate(const GeometricField< Type, fvPatchField, volMesh > &tvf, const surfaceScalarField &faceFlux, Istream &schemeData)
Interpolate field onto faces using scheme given by Istream.
bool constrain(fvMatrix< Type > &eqn) const
Apply constraints to an equation.
Foam::fvModels & fvModels
Calculate the matrix for the divergence of the given field and flux.
List< word > wordList
A List of words.
T lookupOrDefault(const word &, const T &, bool recursive=false, bool patternMatch=true) const
Find and return a T,.
Finite volume constraints.
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
tmp< fvMatrix< Type > > laplacian(const GeometricField< Type, fvPatchField, volMesh > &vf, const word &name)
fileType type(const fileName &, const bool checkVariants=true, const bool followLink=true)
Return the file type: directory or file.
const dimensionSet dimVolume
Specialisation of Foam::functionObject for an Foam::fvMesh, providing a reference to the Foam::fvMesh...
A class for managing temporary objects.
GeometricField< scalar, fvsPatchField, surfaceMesh > surfaceScalarField
virtual bool execute()
Solve for the evolution of the field.
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
phaseScalarTransport(const word &name, const Time &runTime, const dictionary &dict)
Construct from Time and dictionary.
ITstream & lookup(const word &, bool recursive=false, bool patternMatch=true) const
Find and return an entry data stream.