33 template<
class CloudType>
40 const word& patchName = patchData_[patchi].patchName();
42 forAll(nEscape_[patchi], injectori)
45 this->writeTabbed(
os, patchName +
"_nEscape_" + suffix);
46 this->writeTabbed(
os, patchName +
"_massEscape_" + suffix);
47 this->writeTabbed(
os, patchName +
"_nStick_" + suffix);
48 this->writeTabbed(
os, patchName +
"_massStick_" + suffix);
54 template<
class CloudType>
57 const dictionary&
dict,
62 patchData_(cloud.
mesh(), this->coeffDict()),
63 nEscape_(patchData_.size()),
64 massEscape_(nEscape_.size()),
65 nStick_(nEscape_.size()),
66 massStick_(nEscape_.size()),
67 writeFields_(this->coeffDict().getOrDefault(
"writeFields", false)),
69 massEscapePtr_(nullptr),
70 massStickPtr_(nullptr)
72 const bool outputByInjectorId
77 Info<<
" Interaction fields will be written to " 87 Info<<
" Interaction fields will not be written" <<
endl;
92 if (outputByInjectorId)
94 for (
const auto& inj : cloud.injectors())
96 injIdToIndex_.
insert(inj.injectorID(), nInjectors++);
107 forAll(patchData_, patchi)
109 const word& interactionTypeName =
110 patchData_[patchi].interactionTypeName();
116 const word& patchName = patchData_[patchi].patchName();
118 <<
"Unknown patch interaction type " 119 << interactionTypeName <<
" for patch " << patchName
120 <<
". Valid selections are:" 125 nEscape_[patchi].setSize(nInjectors,
Zero);
127 nStick_[patchi].setSize(nInjectors,
Zero);
133 template<
class CloudType>
136 const LocalInteraction<CloudType>& pim
140 patchData_(pim.patchData_),
141 nEscape_(pim.nEscape_),
142 massEscape_(pim.massEscape_),
143 nStick_(pim.nStick_),
144 massStick_(pim.massStick_),
145 writeFields_(pim.writeFields_),
146 injIdToIndex_(pim.injIdToIndex_),
147 massEscapePtr_(nullptr),
148 massStickPtr_(nullptr)
154 template<
class CloudType>
167 this->owner().
name() +
":massEscape",
179 return *massEscapePtr_;
183 template<
class CloudType>
188 const fvMesh&
mesh = this->owner().mesh();
196 this->owner().
name() +
":massStick",
208 return *massStickPtr_;
212 template<
class CloudType>
220 const label patchi = patchData_.applyToPatch(
pp.index());
230 ? injIdToIndex_.lookup(
p.typeId(), 0)
235 this->wordToInteractionType
237 patchData_[patchi].interactionTypeName()
248 keepParticle =
false;
252 const scalar dm =
p.mass()*
p.nParticle();
254 nEscape_[patchi][idx]++;
255 massEscape_[patchi][idx] += dm;
259 const label pI =
pp.index();
260 const label fI =
pp.whichFace(
p.face());
261 massEscape().boundaryFieldRef()[pI][fI] += dm;
271 const scalar dm =
p.mass()*
p.nParticle();
273 nStick_[patchi][idx]++;
274 massStick_[patchi][idx] += dm;
278 const label pI =
pp.index();
279 const label fI =
pp.whichFace(
p.face());
280 massStick().boundaryFieldRef()[pI][fI] += dm;
292 this->owner().patchData(
p,
pp, nw, Up);
297 if (
mag(Up) > 0 &&
mag(
U) < this->Urmax())
300 <<
"Particle U the same as patch " 301 <<
" The particle has been removed" <<
nl <<
endl;
303 keepParticle =
false;
314 U -= (1.0 + patchData_[patchi].e())*Un*nw;
317 U -= patchData_[patchi].mu()*Ut;
327 <<
"Unknown interaction type " 328 << patchData_[patchi].interactionTypeName()
329 <<
"(" << it <<
") for patch " 330 << patchData_[patchi].patchName()
331 <<
". Valid selections are:" << this->interactionTypeNames_
343 template<
class CloudType>
354 forAll(patchData_, patchi)
356 label lsd = nEscape_[patchi].size();
357 npe0[patchi].setSize(lsd,
Zero);
358 mpe0[patchi].setSize(lsd,
Zero);
359 nps0[patchi].setSize(lsd,
Zero);
360 mps0[patchi].setSize(lsd,
Zero);
364 this->getModelProperty(
"nEscape", npe0);
365 this->getModelProperty(
"massEscape", mpe0);
366 this->getModelProperty(
"nStick", nps0);
367 this->getModelProperty(
"massStick", mps0);
374 npe[i] = npe[i] + npe0[i];
381 mpe[i] = mpe[i] + mpe0[i];
388 nps[i] = nps[i] + nps0[i];
395 mps[i] = mps[i] + mps0[i];
398 if (injIdToIndex_.size())
402 labelList indexToInjector(injIdToIndex_.size());
405 indexToInjector[iter.val()] = iter.key();
408 forAll(patchData_, patchi)
410 forAll(mpe[patchi], indexi)
412 const word& patchName = patchData_[patchi].patchName();
414 Log_<<
" Parcel fate: patch " << patchName
415 <<
" (number, mass)" <<
nl 416 <<
" - escape (injector " << indexToInjector[indexi]
417 <<
" ) = " << npe[patchi][indexi]
418 <<
", " << mpe[patchi][indexi] <<
nl 419 <<
" - stick (injector " << indexToInjector[indexi]
420 <<
" ) = " << nps[patchi][indexi]
421 <<
", " << mps[patchi][indexi] <<
nl;
427 forAll(patchData_, patchi)
429 const word& patchName = patchData_[patchi].patchName();
431 Log_<<
" Parcel fate: patch " << patchName
432 <<
" (number, mass)" <<
nl 434 << npe[patchi][0] <<
", " << mpe[patchi][0] <<
nl 436 << nps[patchi][0] <<
", " << mps[patchi][0] <<
nl;
442 forAll(npe[patchi], injectori)
445 <<
tab << npe[patchi][injectori]
446 <<
tab << mpe[patchi][injectori]
447 <<
tab << nps[patchi][injectori]
448 <<
tab << mps[patchi][injectori];
452 this->file() <<
endl;
454 if (this->writeTime())
456 this->setModelProperty(
"nEscape", npe);
457 this->setModelProperty(
"massEscape", mpe);
458 this->setModelProperty(
"nStick", nps);
459 this->setModelProperty(
"massStick", mps);
volScalarField & massEscape()
Return access to the massEscape field.
DSMCCloud< dsmcParcel > CloudType
errorManipArg< error, int > exit(error &err, const int errNo=1)
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
const word & name() const noexcept
Return the object name.
static wordList interactionTypeNames_
constexpr char nl
The newline '\n' character (0x0a)
Ostream & endl(Ostream &os)
Add newline and flush stream.
constexpr char tab
The tab '\t' character(0x09)
const Time & time() const
Return the top-level database.
List< labelList > labelListList
List of labelList.
virtual void info()
Write patch interaction info.
Templated patch interaction model class.
const CloudType & owner() const
Return const access to the owner cloud.
#define forAll(list, i)
Loop across all elements in list.
GeometricField< scalar, fvPatchField, volMesh > volScalarField
bool insert(const Key &key, const T &obj)
Copy insert a new entry, not overwriting existing entries.
virtual void info()
Write patch interaction info.
void setSize(const label n)
Alias for resize()
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for expressions::valueTypeCode::INVALID.
#define Log_
Report write to Foam::Info if the class log switch is true.
List< scalarList > scalarListList
List of scalarList.
A class for handling words, derived from Foam::string.
Reading is optional [identical to LAZY_READ].
LocalInteraction(const dictionary &dict, CloudType &owner)
Construct from dictionary.
const dictionary & coeffDict() const
Return const access to the coefficients dictionary.
errorManip< error > abort(error &err)
void reset(const label nPoints, const label nInternalFaces, const label nFaces, const label nCells)
Reset this primitiveMesh given the primitive array sizes.
ParcelType parcelType
Type of parcel the cloud was instantiated for.
An Ostream is an abstract base class for all output systems (streams, files, token lists...
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
static word timeName(const scalar t, const int precision=precision_)
Return a time name for the given scalar time value formatted with the given precision.
OBJstream os(runTime.globalPath()/outputName)
volScalarField & massStick()
Return access to the massStick field.
#define WarningInFunction
Report a warning using Foam::Warning.
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
Mesh data needed to do the Finite Volume discretisation.
Automatically write from objectRegistry::writeObject()
virtual void writeFileHeader(Ostream &os)
Output file header information.
messageStream Info
Information stream (stdout output on master, null elsewhere)
static void listCombineGather(const List< commsStruct > &comms, List< T > &values, const CombineOp &cop, const int tag, const label comm)
T getOrDefault(const word &keyword, const T &deflt, enum keyType::option matchOpt=keyType::REGEX) const
Find and return a T, or return the given default value. FatalIOError if it is found and the number of...
const dimensionSet dimMass(1, 0, 0, 0, 0, 0, 0)
List< label > labelList
A List of labels.
A patch is a list of labels that address the faces in the global face list.
Defines the attributes of an object for which implicit objectRegistry management is supported...
static interactionType wordToInteractionType(const word &itWord)
Convert word to interaction result.
virtual bool correct(typename CloudType::parcelType &p, const polyPatch &pp, bool &keepParticle)
Apply velocity correction.
uindirectPrimitivePatch pp(UIndirectList< face >(mesh.faces(), faceLabels), mesh.points())
forAllConstIters(mixture.phases(), phase)
static constexpr const zero Zero
Global zero (0)