ThermoCloudI.H
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-2017 OpenFOAM Foundation
9  Copyright (C) 2019-2022 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 using namespace Foam::constant;
32 
33 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
34 
35 template<class CloudType>
36 inline const Foam::ThermoCloud<CloudType>&
38 {
39  return *cloudCopyPtr_;
40 }
41 
42 
43 template<class CloudType>
44 inline const typename CloudType::particleType::constantProperties&
46 {
47  return constProps_;
48 }
49 
50 
51 template<class CloudType>
52 inline typename CloudType::particleType::constantProperties&
54 {
55  return constProps_;
56 }
57 
58 
59 template<class CloudType>
61 {
62  return thermo_;
63 }
64 
65 
66 template<class CloudType>
68 {
69  return T_;
70 }
71 
72 
73 template<class CloudType>
75 {
76  return p_;
77 }
78 
79 
80 template<class CloudType>
83 {
84  return *heatTransferModel_;
85 }
86 
87 
88 template<class CloudType>
89 inline const Foam::integrationScheme&
91 {
92  return *TIntegrator_;
93 }
94 
95 
96 template<class CloudType>
98 {
99  return radiation_;
100 }
101 
102 
103 template<class CloudType>
106 {
107  if (!radiation_)
108  {
110  << "Radiation field requested, but radiation model not active"
111  << abort(FatalError);
112  }
114  return *radAreaP_;
115 }
116 
117 
118 template<class CloudType>
121 {
122  if (!radiation_)
123  {
125  << "Radiation field requested, but radiation model not active"
126  << abort(FatalError);
127  }
129  return *radAreaP_;
130 }
131 
132 
133 template<class CloudType>
136 {
137  if (!radiation_)
138  {
140  << "Radiation field requested, but radiation model not active"
141  << abort(FatalError);
142  }
144  return *radT4_;
145 }
146 
147 
148 template<class CloudType>
151 {
152  if (!radiation_)
153  {
155  << "Radiation field requested, but radiation model not active"
156  << abort(FatalError);
157  }
159  return *radT4_;
160 }
161 
162 
163 template<class CloudType>
166 {
167  if (!radiation_)
168  {
170  << "Radiation field requested, but radiation model not active"
171  << abort(FatalError);
172  }
174  return *radAreaPT4_;
175 }
176 
177 
178 template<class CloudType>
181 {
182  if (!radiation_)
183  {
185  << "Radiation field requested, but radiation model not active"
186  << abort(FatalError);
187  }
189  return *radAreaPT4_;
190 }
191 
192 
193 template<class CloudType>
195 (
196  const parcelType& p,
197  const typename parcelType::trackingData& td
198 )
199 {
200  CloudType::transferToCarrier(p, td);
202  hsTrans()[p.cell()] += p.nParticle()*p.mass()*p.hs();
203 }
204 
205 
206 template<class CloudType>
209 {
210  return *hsTrans_;
211 }
212 
213 
214 template<class CloudType>
217 {
218  return *hsTrans_;
219 }
220 
221 
222 template<class CloudType>
225 {
226  return *hsCoeff_;
227 }
228 
229 
230 template<class CloudType>
233 {
234  return *hsCoeff_;
235 }
236 
237 
238 template<class CloudType>
241 {
242  DebugInfo
243  << "hsTrans min/max = " << min(hsTrans()).value() << ", "
244  << max(hsTrans()).value() << nl
245  << "hsCoeff min/max = " << min(hsCoeff()).value() << ", "
246  << max(hsCoeff()).value() << endl;
247 
248  if (this->solution().coupled())
249  {
250  if (this->solution().semiImplicit("h"))
251  {
252  const volScalarField Cp(thermo_.thermo().Cp());
254  Vdt(this->mesh().V()*this->db().time().deltaT());
255 
256  return
257  hsTrans()/Vdt
258  - fvm::SuSp(hsCoeff()/(Cp*Vdt), hs)
259  + hsCoeff()/(Cp*Vdt)*hs;
260  }
261  else
262  {
263  tmp<fvScalarMatrix> tfvm(new fvScalarMatrix(hs, dimEnergy/dimTime));
264  fvScalarMatrix& fvm = tfvm.ref();
265 
266  fvm.source() = -hsTrans()/(this->db().time().deltaT());
267 
268  return tfvm;
269  }
270  }
271 
273 }
274 
275 
276 template<class CloudType>
278 {
279  tmp<volScalarField> tEp
280  (
281  new volScalarField
282  (
283  IOobject
284  (
285  this->name() + ":radiation:Ep",
286  this->db().time().timeName(),
287  this->db(),
291  ),
292  this->mesh(),
294  )
295  );
296 
297  if (radiation_)
298  {
299  scalarField& Ep = tEp.ref().primitiveFieldRef();
300  const scalar dt = this->db().time().deltaTValue();
301  const scalarField& V = this->mesh().V();
302  const scalar epsilon = constProps_.epsilon0();
303  const scalarField& sumAreaPT4 = radAreaPT4_->field();
304 
305  Ep = sumAreaPT4*epsilon*physicoChemical::sigma.value()/V/dt;
306  }
307 
308  return tEp;
309 }
310 
311 
312 template<class CloudType>
314 {
315  tmp<volScalarField> tap
316  (
317  new volScalarField
318  (
319  IOobject
320  (
321  this->name() + ":radiation:ap",
322  this->db().time().timeName(),
323  this->db(),
327  ),
328  this->mesh(),
330  )
331  );
332 
333  if (radiation_)
334  {
335  scalarField& ap = tap.ref().primitiveFieldRef();
336  const scalar dt = this->db().time().deltaTValue();
337  const scalarField& V = this->mesh().V();
338  const scalar epsilon = constProps_.epsilon0();
339  const scalarField& sumAreaP = radAreaP_->field();
340 
341  ap = sumAreaP*epsilon/V/dt;
342  }
344  return tap;
345 }
346 
347 
348 template<class CloudType>
351 {
352  tmp<volScalarField> tsigmap
353  (
354  new volScalarField
355  (
356  IOobject
357  (
358  this->name() + ":radiation:sigmap",
359  this->db().time().timeName(),
360  this->db(),
364  ),
365  this->mesh(),
367  )
368  );
369 
370  if (radiation_)
371  {
372  scalarField& sigmap = tsigmap.ref().primitiveFieldRef();
373  const scalar dt = this->db().time().deltaTValue();
374  const scalarField& V = this->mesh().V();
375  const scalar epsilon = constProps_.epsilon0();
376  const scalar f = constProps_.f0();
377  const scalarField& sumAreaP = radAreaP_->field();
378 
379  sigmap = sumAreaP*(1.0 - f)*(1.0 - epsilon)/V/dt;
380  }
381 
382  return tsigmap;
383 }
384 
385 
386 template<class CloudType>
387 inline Foam::scalar Foam::ThermoCloud<CloudType>::Tmax() const
388 {
389  scalar val = -GREAT;
390  bool nonEmpty = false;
391 
392  for (const parcelType& p : *this)
393  {
394  val = max(val, p.T());
395  nonEmpty = true;
396  }
397 
398  if (returnReduceOr(nonEmpty))
399  {
400  return returnReduce(val, maxOp<scalar>());
401  }
402 
403  return 0;
404 }
405 
406 
407 template<class CloudType>
408 inline Foam::scalar Foam::ThermoCloud<CloudType>::Tmin() const
409 {
410  scalar val = GREAT;
411  bool nonEmpty = false;
412 
413  for (const parcelType& p : *this)
414  {
415  val = min(val, p.T());
416  nonEmpty = true;
417  }
418 
419  if (returnReduceOr(nonEmpty))
420  {
421  return returnReduce(val, minOp<scalar>());
422  }
423 
424  return 0;
425 }
426 
427 
428 // ************************************************************************* //
Different types of constants.
const Type & value() const noexcept
Return const reference to value.
fvMatrix< scalar > fvScalarMatrix
Definition: fvMatricesFwd.H:37
Templated class to calculate the fluid-particle heat transfer coefficients based on a specified Nusse...
Definition: ThermoCloud.H:55
volScalarField::Internal & hsTrans()
Sensible enthalpy transfer [J/kg].
Definition: ThermoCloudI.H:201
const ThermoCloud & cloudCopy() const
Return a reference to the cloud copy.
Definition: ThermoCloudI.H:30
error FatalError
Error stream (stdout output on all processes), with additional &#39;FOAM FATAL ERROR&#39; header text and sta...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:598
tmp< volScalarField > sigmap() const
Return tmp equivalent particulate scattering factor.
Definition: ThermoCloudI.H:343
T & ref() const
Return non-const reference to the contents of a non-null managed pointer.
Definition: tmpI.H:235
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
Definition: hashSets.C:40
constexpr char nl
The newline &#39;\n&#39; character (0x0a)
Definition: Ostream.H:50
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:531
const volScalarField & p() const
Return const access to the carrier pressure field.
Definition: ThermoCloudI.H:67
const dimensionedScalar sigma
Stefan-Boltzmann constant: default SI units: [W/m2/K4].
volScalarField::Internal & radAreaPT4()
Radiation sum of parcel projected area*temperature^4 [m2K4].
Definition: ThermoCloudI.H:158
Ignore writing from objectRegistry::writeObject()
const dimensionSet dimless
Dimensionless.
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.
void transferToCarrier(const parcelType &p, const typename parcelType::trackingData &td)
Transfer the effect of parcel to the carrier phase.
Definition: ThermoCloudI.H:188
Templated base class for thermodynamic cloud.
Definition: ThermoCloud.H:62
const HeatTransferModel< ThermoCloud< CloudType > > & heatTransfer() const
Return reference to heat transfer model.
Definition: ThermoCloudI.H:75
GeometricField< scalar, fvPatchField, volMesh > volScalarField
Definition: volFieldsFwd.H:81
volScalarField::Internal & radAreaP()
Radiation sum of parcel projected areas [m2].
Definition: ThermoCloudI.H:98
word timeName
Definition: getTimeIndex.H:3
volScalarField::Internal & radT4()
Radiation sum of parcel temperature^4 [K4].
Definition: ThermoCloudI.H:128
tmp< volScalarField > ap() const
Return tmp equivalent particulate absorption.
Definition: ThermoCloudI.H:306
dynamicFvMesh & mesh
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for expressions::valueTypeCode::INVALID.
Definition: exprTraits.C:127
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
const parcelType::constantProperties & constProps() const
Return the constant properties.
Definition: ThermoCloudI.H:38
static tmp< T > New(Args &&... args)
Construct tmp with forwarding arguments.
Definition: tmp.H:206
zeroField SuSp(const Foam::zero, const GeometricField< Type, fvPatchField, volMesh > &)
A no-op source.
Thermo package for (S)olids (L)iquids and (G)ases Takes reference to thermo package, and provides:
Definition: SLGThermo.H:60
bool radiation() const
Radiation flag.
Definition: ThermoCloudI.H:90
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
Definition: hashSets.C:26
errorManip< error > abort(error &err)
Definition: errorManip.H:139
#define DebugInfo
Report an information message using Foam::Info.
const integrationScheme & TIntegrator() const
Return reference to velocity integration.
Definition: ThermoCloudI.H:83
const volScalarField & Cp
Definition: EEqn.H:7
labelList f(nPoints)
const SLGThermo & thermo() const
Return const access to thermo package.
Definition: ThermoCloudI.H:53
const volScalarField & T() const
Return const access to the carrier temperature field.
Definition: ThermoCloudI.H:60
const dimensionSet dimEnergy
Base for a set of schemes which integrate simple ODEs which arise from semi-implcit rate expressions...
tmp< fvScalarMatrix > Sh(volScalarField &hs) const
Return sensible enthalpy source term [J/kg/m3/s].
Definition: ThermoCloudI.H:233
dimensionedScalar pow3(const dimensionedScalar &ds)
scalar Tmax() const
Maximum temperature.
Definition: ThermoCloudI.H:380
tmp< volScalarField > Ep() const
Return tmp equivalent particulate emission.
Definition: ThermoCloudI.H:270
const dimensionSet dimLength(0, 1, 0, 0, 0, 0, 0)
Definition: dimensionSets.H:50
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
scalar epsilon
Field with dimensions and associated with geometry type GeoMesh which is used to size the field and a...
Definition: areaFieldsFwd.H:42
Nothing to be read.
const dimensionSet dimTime(0, 0, 1, 0, 0, 0, 0)
Definition: dimensionSets.H:51
Selector class for relaxation factors, solver type and solution.
Definition: solution.H:92
const dimensionSet dimMass(1, 0, 0, 0, 0, 0, 0)
Definition: dimensionSets.H:49
volScalarField & p
A class for managing temporary objects.
Definition: HashPtrTable.H:50
bool coupled
bool returnReduceOr(const bool value, const label comm=UPstream::worldComm)
Perform logical (or) MPI Allreduce on a copy. Uses UPstream::reduceOr.
volScalarField::Internal & hsCoeff()
Return coefficient for carrier phase hs equation.
Definition: ThermoCloudI.H:217
Defines the attributes of an object for which implicit objectRegistry management is supported...
Definition: IOobject.H:172
scalar Tmin() const
Minimum temperature.
Definition: ThermoCloudI.H:401
Do not request registration (bool: false)
static constexpr const zero Zero
Global zero (0)
Definition: zero.H:127