ReactingLookupTableInjection.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | www.openfoam.com
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8  Copyright (C) 2011-2016 OpenFOAM Foundation
9  Copyright (C) 2019-2020 OpenCFD Ltd.
10 -------------------------------------------------------------------------------
11 License
12  This file is part of OpenFOAM.
13 
14  OpenFOAM is free software: you can redistribute it and/or modify it
15  under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
18 
19  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22  for more details.
23 
24  You should have received a copy of the GNU General Public License
25  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26 
27 \*---------------------------------------------------------------------------*/
28 
30 
31 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
32 
33 template<class CloudType>
35 (
36  const dictionary& dict,
37  CloudType& owner,
38  const word& modelName
39 )
40 :
41  InjectionModel<CloudType>(dict, owner, modelName, typeName),
42  inputFileName_(this->coeffDict().lookup("inputFile")),
43  duration_(this->coeffDict().getScalar("duration")),
44  parcelsPerSecond_(this->coeffDict().getScalar("parcelsPerSecond")),
45  randomise_(this->coeffDict().getBool("randomise")),
46  injectors_
47  (
48  IOobject
49  (
50  inputFileName_,
51  owner.db().time().constant(),
52  owner.db(),
53  IOobject::MUST_READ,
54  IOobject::NO_WRITE
55  )
56  ),
57  injectorCells_(injectors_.size()),
58  injectorTetFaces_(injectors_.size()),
59  injectorTetPts_(injectors_.size())
60 {
61  updateMesh();
62 
63  duration_ = owner.db().time().userTimeToTime(duration_);
64 
65  // Determine volume of particles to inject
66  this->volumeTotal_ = 0.0;
67  forAll(injectors_, i)
68  {
69  this->volumeTotal_ += injectors_[i].mDot()/injectors_[i].rho();
70  }
71  this->volumeTotal_ *= duration_;
72 }
73 
74 
75 template<class CloudType>
77 (
78  const ReactingLookupTableInjection<CloudType>& im
79 )
80 :
81  InjectionModel<CloudType>(im),
82  inputFileName_(im.inputFileName_),
83  duration_(im.duration_),
84  parcelsPerSecond_(im.parcelsPerSecond_),
85  randomise_(im.randomise_),
86  injectors_(im.injectors_),
87  injectorCells_(im.injectorCells_),
88  injectorTetFaces_(im.injectorTetFaces_),
89  injectorTetPts_(im.injectorTetPts_)
90 {}
91 
92 
93 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
94 
95 template<class CloudType>
97 {
98  // Set/cache the injector cells
99  bitSet reject(injectors_.size());
100 
101  // Set/cache the injector cells
102  forAll(injectors_, i)
103  {
104  if
105  (
106  !this->findCellAtPosition
107  (
108  injectorCells_[i],
109  injectorTetFaces_[i],
110  injectorTetPts_[i],
111  injectors_[i].x(),
112  !this->ignoreOutOfBounds_
113 
114  )
115  )
116  {
117  reject.set(i);
118  }
119  }
120 
121  const label nRejected = reject.count();
122 
123  if (nRejected)
124  {
125  reject.flip();
126  inplaceSubset(reject, injectorCells_);
127  inplaceSubset(reject, injectorTetFaces_);
128  inplaceSubset(reject, injectorTetPts_);
129  inplaceSubset(reject, injectors_);
130 
131  Info<< " " << nRejected
132  << " positions rejected, out of bounds" << endl;
133  }
134 }
135 
136 
137 template<class CloudType>
139 {
140  return this->SOI_ + duration_;
141 }
142 
143 
144 template<class CloudType>
146 (
147  const scalar time0,
148  const scalar time1
149 )
150 {
151  if ((time0 >= 0.0) && (time0 < duration_))
152  {
153  return floor(injectorCells_.size()*(time1 - time0)*parcelsPerSecond_);
154  }
156  return 0;
157 }
158 
159 
160 template<class CloudType>
162 (
163  const scalar time0,
164  const scalar time1
165 )
166 {
167  scalar volume = 0.0;
168  if ((time0 >= 0.0) && (time0 < duration_))
169  {
170  forAll(injectors_, i)
171  {
172  volume += injectors_[i].mDot()/injectors_[i].rho()*(time1 - time0);
173  }
174  }
176  return volume;
177 }
178 
179 
180 template<class CloudType>
182 (
183  const label parcelI,
184  const label nParcels,
185  const scalar time,
186  vector& position,
187  label& cellOwner,
188  label& tetFacei,
189  label& tetPti
190 )
191 {
192  label injectorI = 0;
193  if (randomise_)
194  {
195  Random& rnd = this->owner().rndGen();
196  injectorI = rnd.position<label>(0, injectorCells_.size() - 1);
197  }
198  else
199  {
200  injectorI = parcelI*injectorCells_.size()/nParcels;
201  }
202 
203  position = injectors_[injectorI].x();
204  cellOwner = injectorCells_[injectorI];
205  tetFacei = injectorTetFaces_[injectorI];
206  tetPti = injectorTetPts_[injectorI];
207 }
208 
209 
210 template<class CloudType>
212 (
213  const label parcelI,
214  const label nParcels,
215  const scalar,
216  typename CloudType::parcelType& parcel
217 )
218 {
219  label injectorI = parcelI*injectorCells_.size()/nParcels;
220 
221  // set particle velocity
222  parcel.U() = injectors_[injectorI].U();
223 
224  // set particle diameter
225  parcel.d() = injectors_[injectorI].d();
226 
227  // set particle density
228  parcel.rho() = injectors_[injectorI].rho();
229 
230  // set particle temperature
231  parcel.T() = injectors_[injectorI].T();
232 
233  // set particle specific heat capacity
234  parcel.Cp() = injectors_[injectorI].Cp();
236  // set particle component mass fractions
237  parcel.Y() = injectors_[injectorI].Y();
238 }
239 
240 
241 template<class CloudType>
243 {
244  return true;
245 }
246 
247 
248 template<class CloudType>
250 {
251  return true;
252 }
253 
254 
255 // ************************************************************************* //
scalar timeEnd() const
Return the end-of-injection time.
dictionary dict
DSMCCloud< dsmcParcel > CloudType
A list of keyword definitions, which are a keyword followed by a number of values (eg...
Definition: dictionary.H:129
Templated injection model class.
virtual bool validInjection(const label parcelI)
Return flag to identify whether or not injection of parcelI is permitted.
virtual void setPositionAndCell(const label parcelI, const label nParcels, const scalar time, vector &position, label &cellOwner, label &tetFacei, label &tetPti)
Set the injection position and owner cell, tetFace and tetPt.
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:531
Lookup type of boundary radiation properties.
Definition: lookup.H:57
void inplaceSubset(const BoolListType &select, ListType &input, const bool invert=false)
Inplace extract elements of the input list when select is true.
const CloudType & owner() const
Return const access to the owner cloud.
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:421
virtual scalar userTimeToTime(const scalar theta) const
Convert the user-time (e.g. CA deg) to real-time (s).
Definition: TimeState.C:42
A class for handling words, derived from Foam::string.
Definition: word.H:63
const Time & time() const noexcept
Return time registry.
const objectRegistry & db() const noexcept
Return the local objectRegistry.
Definition: IOobject.C:450
ReactingLookupTableInjection(const dictionary &dict, CloudType &owner, const word &modelName)
Construct from dictionary.
virtual bool fullyDescribed() const
Flag to identify whether model fully describes the parcel.
Random number generator.
Definition: Random.H:55
virtual void setProperties(const label parcelI, const label nParcels, const scalar time, typename CloudType::parcelType &parcel)
Set the parcel properties.
ParcelType parcelType
Type of parcel the cloud was instantiated for.
Definition: DSMCCloud.H:290
const wordList volume
Standard volume field types (scalar, vector, tensor, etc)
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
A bitSet stores bits (elements with only two states) in packed internal format and supports a variety...
Definition: bitSet.H:59
virtual scalar volumeToInject(const scalar time0, const scalar time1)
Volume of parcels to introduce relative to SOI.
messageStream Info
Information stream (stdout output on master, null elsewhere)
scalar volumeTotal_
Total volume of particles introduced by this injector [m^3] Note: scaled to ensure massTotal is achie...
virtual void updateMesh()
Set injector locations when mesh is updated.
Defines the attributes of an object for which implicit objectRegistry management is supported...
Definition: IOobject.H:172
Templated base class for dsmc cloud.
Definition: DSMCCloud.H:67
Type position(const Type &start, const Type &end)
Return a sample on the interval [start,end].
virtual label parcelsToInject(const scalar time0, const scalar time1)
Number of parcels to introduce relative to SOI.