33 template<
class CloudType>
37 { interactionType::STICK,
"stick" },
38 { interactionType::ESCAPE,
"escape" },
39 { interactionType::REBOUND,
"rebound" },
45 template<
class CloudType>
49 const label localZonei
52 if (!faceZoneBBs_[localZonei].contains(
p.position()))
58 if ((
p.d() > dMax_) || (
p.d() < dMin_))
67 template<
class CloudType>
70 const fvMesh&
mesh = this->owner().mesh();
76 const label nZones = faceZoneIDs_.size();
81 this->getModelProperty(
"nEscape", npe0);
82 this->getModelProperty(
"nStick", nps0);
83 this->getModelProperty(
"nRebound", npr0);
91 npe[i] = npe[i] + npe0[i];
92 nps[i] = nps[i] + nps0[i];
93 npr[i] = npr[i] + npr0[i];
100 const label zonei = faceZoneIDs_[i];
101 Log_<<
" Zone : " << fzm[zonei].name() <<
nl 102 <<
" Escape : " << npe[i] <<
nl 103 <<
" Stick : " << nps[i] <<
nl 104 <<
" Rebound : " << npr[i] <<
nl;
106 if (this->writeToFile())
108 auto&
os = filePtrs_[i];
110 writeCurrentTime(
os);
113 os <<
tab << scalar(npe[i])
114 <<
tab << scalar(nps[i])
115 <<
tab << scalar(npr[i])
122 this->setModelProperty(
"nEscape", npe);
123 this->setModelProperty(
"nStick", nps);
124 this->setModelProperty(
"nRebound", npr);
126 nEscapeParticles_ =
Zero;
127 nStickParticles_ =
Zero;
128 nReboundParticles_ =
Zero;
134 template<
class CloudType>
139 const word& modelName
143 functionObjects::writeFile
152 faceZoneInteraction_(),
156 nReboundParticles_(),
157 dMin_(this->coeffDict().getOrDefault(
"dMin", -GREAT)),
158 dMax_(this->coeffDict().getOrDefault(
"dMax", GREAT))
165 filePtrs_.setSize(nameAndInteraction.
size());
167 faceZoneBBs_.setSize(nameAndInteraction.
size());
168 faceZoneInteraction_.
setSize(nameAndInteraction.
size());
176 for (
const auto& zoneInfo : nameAndInteraction)
178 const word& zoneName = zoneInfo.first();
187 Info<<
" " << zoneName <<
" faces: " << nFaces <<
nl;
190 faceZoneInteraction_[nZone] =
194 auto& bb = faceZoneBBs_[nZone];
195 for (
const label facei : fz)
197 for (
const label fpi : faces[facei])
222 filePtrs_[nZone] <<
nl;
229 <<
"Unable to find faceZone " << zoneName
230 <<
" - removing" <<
endl;
235 filePtrs_.setSize(nZone);
236 faceZoneBBs_.setSize(nZone);
237 faceZoneInteraction_.
setSize(nZone);
244 template<
class CloudType>
251 functionObjects::writeFile(pfi),
252 faceZoneIDs_(pfi.faceZoneIDs_),
253 faceZoneBBs_(pfi.faceZoneBBs_),
255 nEscapeParticles_(pfi.nEscapeParticles_),
256 nStickParticles_(pfi.nStickParticles_),
257 nReboundParticles_(pfi.nReboundParticles_),
265 template<
class CloudType>
269 const typename parcelType::trackingData&
td 272 bool keepParticle =
true;
278 if (!processParticle(
p, i))
283 const label zonei = faceZoneIDs_[i];
285 const label localFacei = fzm[zonei].find(
p.face());
287 if (localFacei != -1)
289 const label facei = fzm[zonei][localFacei];
291 switch (faceZoneInteraction_[i])
293 case interactionType::ESCAPE:
295 keepParticle =
false;
296 ++nEscapeParticles_[i];
299 case interactionType::STICK:
301 auto& pRef =
const_cast<parcelType&
>(
p);
304 ++nStickParticles_[i];
307 case interactionType::REBOUND:
309 const face&
f = this->owner().
mesh().
faces()[facei];
310 const auto n =
f.unitNormal(this->owner().
mesh().
points());
312 auto& pRef =
const_cast<parcelType&
>(
p);
313 pRef.U() -= 2*
n*(pRef.U() &
n);
314 ++nReboundParticles_[i];
320 <<
"Unhandled enumeration " 321 << interactionTypeNames_[faceZoneInteraction_[i]]
Face zone-based particle interactions.
void size(const label n)
Older name for setAddressableSize.
ZoneMesh< faceZone, polyMesh > faceZoneMesh
A ZoneMesh with the type faceZone.
const labelIOList & zoneIDs
void transfer(List< T > &list)
Transfer the contents of the argument List into this list and annul the argument list.
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
A list of keyword definitions, which are a keyword followed by a number of values (eg...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
wallPoints::trackData td(isBlockedFace, regionToBlockSize)
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)
Lookup type of boundary radiation properties.
T returnReduce(const T &value, const BinaryOp &bop, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm)
Perform reduction on a copy, using specified binary operation.
bool processParticle(const parcelType &p, const label localZonei)
Return true if this particle will be assessed.
const CloudType & owner() const
Return const access to the owner cloud.
virtual const pointField & points() const
Return raw points.
#define forAll(list, i)
Loop across all elements in list.
fileName::Type type(const fileName &name, const bool followLink=true)
Return the file type: DIRECTORY or FILE, normally following symbolic links.
virtual void writeCommented(Ostream &os, const string &str) const
Write a commented string to stream.
void setSize(const label n)
Alias for resize()
#define Log_
Report write to Foam::Info if the class log switch is true.
label findZoneID(const word &zoneName) const
Find zone index by name, return -1 if not found.
A class for handling words, derived from Foam::string.
virtual bool postFace(const parcelType &p, const typename parcelType::trackingData &td)
Post-face hook.
virtual bool writeToFile() const
Flag to allow writing to file.
virtual const faceList & faces() const
Return raw faces.
const dictionary & coeffDict() const
Return const access to the coefficients dictionary.
errorManip< error > abort(error &err)
void writeHeaderValue(Ostream &os, const string &property, const Type &value) const
Write a (commented) header property and value pair.
OBJstream os(runTime.globalPath()/outputName)
const faceZoneMesh & faceZones() const noexcept
Return face zone mesh.
virtual autoPtr< OFstream > newFileAtStartTime(const word &name) const
Return autoPtr to a new file using the simulation start time.
const fvMesh & mesh() const
Return reference to the mesh.
void write()
Write post-processing info.
#define WarningInFunction
Report a warning using Foam::Warning.
Enum is a wrapper around a list of names/values that represent particular enumeration (or int) values...
FaceInteraction(const dictionary &dict, CloudType &owner, const word &modelName)
Construct from dictionary.
return returnReduce(nRefine-oldNRefine, sumOp< label >())
messageStream Info
Information stream (stdout output on master, null elsewhere)
A subset of mesh faces organised as a primitive patch.
List< label > labelList
A List of labels.
Templated base class for dsmc cloud.
Templated cloud function object base class.
void reduce(T &value, const BinaryOp &bop, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm)
Reduce inplace (cf. MPI Allreduce) using linear/tree communication schedule.
static const Enum< interactionType > interactionTypeNames_
Names for the interaction types.
static constexpr const zero Zero
Global zero (0)
virtual void writeTabbed(Ostream &os, const string &str) const
Write a tabbed string to stream.