51 mixedFvPatchScalarField(
p, iF),
58 valueFraction() = 1.0;
71 mixedFvPatchScalarField(ptf,
p, iF, mapper),
73 qRadExt_(ptf.qRadExt_),
74 qRadExtDir_(ptf.qRadExtDir_)
86 mixedFvPatchScalarField(
p, iF),
87 TName_(
dict.getOrDefault<
word>(
"T",
"T")),
88 qRadExt_(
dict.getOrDefault<scalar>(
"qRadExt", 0)),
91 if (this->readMixedEntries(
dict))
100 valueFraction() = 1.0;
113 mixedFvPatchScalarField(ptf),
115 qRadExt_(ptf.qRadExt_),
116 qRadExtDir_(ptf.qRadExtDir_)
127 mixedFvPatchScalarField(ptf, iF),
129 qRadExt_(ptf.qRadExt_),
130 qRadExtDir_(ptf.qRadExtDir_)
148 const auto& Tp = patch().lookupPatchField<
volScalarField>(TName_);
150 const fvDOM& dom = db().lookupObject<
fvDOM>(
"radiationProperties");
156 const label patchi = patch().index();
158 if (dom.nLambda() != 1)
161 <<
" a grey boundary condition is used with a non-grey "
181 boundaryRadiation.
emissivity(patch().index(), 0,
nullptr, &Tp)
188 boundaryRadiation.
transmissivity(patch().index(), 0,
nullptr, &Tp)
191 const scalarField& transmissivity = ttransmissivity();
196 const vector& myRayId = dom.IRay(rayId).d();
201 for (label rayi=0; rayi < dom.nRay(); rayi++)
203 const vector& d = dom.IRay(rayi).d();
205 if ((-
n[facei] & d) < 0.0)
209 dom.IRay(rayi).ILambda(lambdaId).boundaryField()[patchi];
211 const vector& rayDave = dom.IRay(rayi).dAve();
212 Ir[facei] += IFace[facei]*(
n[facei] & rayDave);
217 if (dom.useSolarLoad())
222 dom.primaryFluxName_ +
"_0"
228 =
patch().cfindPatchField<volScalarField>
230 dom.relfectedFluxName_ +
"_0"
240 if (dom.useExternalBeam())
242 const vector sunDir = dom.solarCalc().direction();
243 const scalar directSolarRad = dom.solarCalc().directSolarRad();
247 scalar maxSunRay = -GREAT;
250 for (label rayI=0; rayI < dom.nRay(); rayI++)
252 const vector& iD = dom.IRay(rayI).d();
253 scalar dir = sunDir & iD;
261 if (rayId == SunRayId)
266 Iexternal[faceI] = directSolarRad/
mag(dom.IRay(rayId).dAve());
275 if (
mag(qRadExtDir_) > 0)
278 scalar maxRay = -GREAT;
281 for (label rayI = 0; rayI < dom.nRay(); ++rayI)
283 const vector& iD = dom.IRay(rayI).d();
284 const scalar dir = qRadExtDir_ & iD;
293 if (rayId == rayqoId)
297 Isource[faceI] += qRadExt_/
mag(dom.IRay(rayId).dAve());
306 scalar maxRay = -GREAT;
309 for (label rayI = 0; rayI < dom.nRay(); ++rayI)
311 const vector& iD = dom.IRay(rayI).d();
312 const scalar dir = -
n[faceI] & iD;
321 if (rayId == rayqoId)
323 Isource[faceI] += qRadExt_/
mag(dom.IRay(rayId).dAve());
331 if ((-
n[faceI] & myRayId) > 0.0)
334 refGrad()[faceI] = 0.0;
335 valueFraction()[faceI] = 1.0;
338 + Iexternal[faceI]*transmissivity[faceI]
340 Ir[faceI]*(scalar(1) - emissivity[faceI])
346 qem[faceI] = refValue()[faceI]*nAve[faceI];
351 valueFraction()[faceI] = 0.0;
352 refGrad()[faceI] = 0.0;
353 refValue()[faceI] = 0.0;
356 qin[faceI] = Iw[faceI]*nAve[faceI];
362 mixedFvPatchScalarField::updateCoeffs();
372 os.writeEntryIfDifferent<
word>(
"T",
"T", TName_);
373 os.writeEntryIfDifferent<scalar>(
"qRadExt",
Zero, qRadExt_);
374 os.writeEntryIfDifferent<
vector>(
"qRadExtDir",
Zero, qRadExtDir_);
Macros for easy insertion into run-time selection tables.
Field with dimensions and associated with geometry type GeoMesh which is used to size the field and a...
Boundary & boundaryFieldRef(const bool updateAccessTime=true)
Return a reference to the boundary field.
@ MUST_READ
Reading required.
static FOAM_NO_DANGLING_REFERENCE const boundaryRadiationProperties & New(const fvMesh &mesh, Args &&... args)
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
static int & msgType() noexcept
Message tag of standard messages.
static int incrMsgType(int val=1) noexcept
Increment the message tag for standard messages.
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
const Type & value() const noexcept
Return const reference to value.
A FieldMapper for finite-volume patch fields.
virtual void operator=(const UList< scalar > &)
A finiteVolume patch using a polyPatch and a fvBoundaryMesh.
virtual void write(Ostream &) const
Write.
Boundary radiation properties holder.
tmp< scalarField > transmissivity(const label patchI, const label bandI=0, const vectorField *incomingDirection=nullptr, const scalarField *T=nullptr) const
Access boundary transmissivity on patch.
tmp< scalarField > emissivity(const label patchI, const label bandI=0, const vectorField *incomingDirection=nullptr, const scalarField *T=nullptr) const
Access boundary emissivity on patch.
Finite Volume Discrete Ordinates Method. Solves the RTE equation for n directions in a participating ...
void setRayIdLambdaId(const word &name, label &rayId, label &lambdaId) const
Set the rayId and lambdaId from by decomposing an intensity.
This boundary condition provides a grey-diffuse condition for radiation intensity,...
virtual void write(Ostream &) const
Write.
virtual void updateCoeffs()
Update the coefficients associated with the patch field.
greyDiffusiveRadiationMixedFvPatchScalarField(const fvPatch &, const DimensionedField< scalar, volMesh > &)
Construct from patch and internal field.
Radiation intensity for a ray in a given direction.
const vector & dAve() const
Return the average vector inside the solid angle.
const volScalarField & qr() const
Return const access to the boundary heat flux.
volScalarField & qin()
Return non-const access to the boundary incident heat flux.
volScalarField & qem()
Return non-const access to the boundary emitted heat flux.
A class for managing temporary objects.
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
A class for handling words, derived from Foam::string.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
OBJstream os(runTime.globalPath()/outputName)
#define makePatchTypeField(PatchTypeField, typePatchTypeField)
Define a concrete fvPatchField type and add to run-time tables Example, (fvPatchScalarField,...
constexpr scalar pi(M_PI)
const dimensionedScalar sigma
Stefan-Boltzmann constant: default SI units: [W/m2/K4].
Different types of constants.
const std::string patch
OpenFOAM patch number as a std::string.
Namespace for radiation modelling.
GeometricField< scalar, fvPatchField, volMesh > volScalarField
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
dimensionedScalar pow4(const dimensionedScalar &ds)
Field< vector > vectorField
Specialisation of Field<T> for vector.
static constexpr const zero Zero
Global zero (0).
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
errorManipArg< error, int > exit(error &err, const int errNo=1)
fvPatchField< scalar > fvPatchScalarField
constexpr char nl
The newline '\n' character (0x0a).
#define forAll(list, i)
Loop across all elements in list.
Unit conversion functions.