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>
180 return *massEscapePtr_;
184 template<
class CloudType>
189 const fvMesh&
mesh = this->owner().mesh();
210 return *massStickPtr_;
214 template<
class CloudType>
222 const label patchi = patchData_.applyToPatch(
pp.index());
232 ? injIdToIndex_.lookup(
p.typeId(), 0)
237 this->wordToInteractionType
239 patchData_[patchi].interactionTypeName()
250 keepParticle =
false;
254 const scalar dm =
p.mass()*
p.nParticle();
256 nEscape_[patchi][idx]++;
257 massEscape_[patchi][idx] += dm;
261 const label pI =
pp.index();
262 const label fI =
pp.whichFace(
p.face());
263 massEscape().boundaryFieldRef()[pI][fI] += dm;
273 const scalar dm =
p.mass()*
p.nParticle();
275 nStick_[patchi][idx]++;
276 massStick_[patchi][idx] += dm;
280 const label pI =
pp.index();
281 const label fI =
pp.whichFace(
p.face());
282 massStick().boundaryFieldRef()[pI][fI] += dm;
294 this->owner().patchData(
p,
pp, nw, Up);
299 if (
mag(Up) > 0 &&
mag(
U) < this->Urmax())
302 <<
"Particle U the same as patch " 303 <<
" The particle has been removed" <<
nl <<
endl;
305 keepParticle =
false;
316 U -= (1.0 + patchData_[patchi].e())*Un*nw;
319 U -= patchData_[patchi].mu()*Ut;
329 <<
"Unknown interaction type " 330 << patchData_[patchi].interactionTypeName()
331 <<
"(" << it <<
") for patch " 332 << patchData_[patchi].patchName()
333 <<
". Valid selections are:" << this->interactionTypeNames_
345 template<
class CloudType>
356 forAll(patchData_, patchi)
358 label lsd = nEscape_[patchi].size();
359 npe0[patchi].setSize(lsd,
Zero);
360 mpe0[patchi].setSize(lsd,
Zero);
361 nps0[patchi].setSize(lsd,
Zero);
362 mps0[patchi].setSize(lsd,
Zero);
366 this->getModelProperty(
"nEscape", npe0);
367 this->getModelProperty(
"massEscape", mpe0);
368 this->getModelProperty(
"nStick", nps0);
369 this->getModelProperty(
"massStick", mps0);
376 npe[i] = npe[i] + npe0[i];
383 mpe[i] = mpe[i] + mpe0[i];
390 nps[i] = nps[i] + nps0[i];
397 mps[i] = mps[i] + mps0[i];
400 if (injIdToIndex_.size())
404 labelList indexToInjector(injIdToIndex_.size());
407 indexToInjector[iter.val()] = iter.key();
410 forAll(patchData_, patchi)
412 forAll(mpe[patchi], indexi)
414 const word& patchName = patchData_[patchi].patchName();
416 Log_<<
" Parcel fate: patch " << patchName
417 <<
" (number, mass)" <<
nl 418 <<
" - escape (injector " << indexToInjector[indexi]
419 <<
" ) = " << npe[patchi][indexi]
420 <<
", " << mpe[patchi][indexi] <<
nl 421 <<
" - stick (injector " << indexToInjector[indexi]
422 <<
" ) = " << nps[patchi][indexi]
423 <<
", " << mps[patchi][indexi] <<
nl;
429 forAll(patchData_, patchi)
431 const word& patchName = patchData_[patchi].patchName();
433 Log_<<
" Parcel fate: patch " << patchName
434 <<
" (number, mass)" <<
nl 436 << npe[patchi][0] <<
", " << mpe[patchi][0] <<
nl 438 << nps[patchi][0] <<
", " << mps[patchi][0] <<
nl;
444 forAll(npe[patchi], injectori)
447 <<
tab << npe[patchi][injectori]
448 <<
tab << mpe[patchi][injectori]
449 <<
tab << nps[patchi][injectori]
450 <<
tab << mps[patchi][injectori];
454 this->file() <<
endl;
456 if (this->writeTime())
458 this->setModelProperty(
"nEscape", npe);
459 this->setModelProperty(
"massEscape", mpe);
460 this->setModelProperty(
"nStick", nps);
461 this->setModelProperty(
"massStick", mps);
volScalarField & massEscape()
Return access to the massEscape field.
static void listCombineGather(UList< T > &values, const CombineOp &cop, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm)
Combines List elements.
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.
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.
virtual const objectRegistry & thisDb() const
Return the object registry - resolve conflict polyMesh/lduMesh.
#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.
static word scopedName(const std::string &scope, const word &name)
Create scope:name or scope_name string.
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)
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...
Request registration (bool: true)
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)