thermoSingleLayer.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-2017 OpenFOAM Foundation
9  Copyright (C) 2017-2023 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 
29 #include "thermoSingleLayer.H"
30 #include "fvcDdt.H"
31 #include "fvcDiv.H"
32 #include "fvcLaplacian.H"
33 #include "fvcFlux.H"
34 #include "fvm.H"
36 #include "mixedFvPatchFields.H"
38 #include "mapDistribute.H"
39 #include "constants.H"
41 
42 // Sub-models
43 #include "filmThermoModel.H"
44 #include "filmViscosityModel.H"
45 #include "heatTransferModel.H"
46 #include "phaseChangeModel.H"
47 #include "filmRadiationModel.H"
48 
49 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
50 
51 namespace Foam
52 {
53 namespace regionModels
54 {
55 namespace surfaceFilmModels
56 {
57 
58 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
59 
60 defineTypeNameAndDebug(thermoSingleLayer, 0);
61 
62 addToRunTimeSelectionTable(surfaceFilmRegionModel, thermoSingleLayer, mesh);
63 
64 // * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
65 
66 wordList thermoSingleLayer::hsBoundaryTypes()
67 {
68  wordList bTypes(T_.boundaryField().types());
69  forAll(bTypes, patchi)
70  {
71  if
72  (
73  T_.boundaryField()[patchi].fixesValue()
74  || isA<mixedFvPatchScalarField>(T_.boundaryField()[patchi])
75  || isA<mappedFieldFvPatchField<scalar>>(T_.boundaryField()[patchi])
76  )
77  {
79  }
80  }
81 
82  return bTypes;
83 }
84 
85 
86 // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
87 
89 {
90  // No additional properties to read
92 }
93 
94 
96 {
98 
100 
102 }
103 
104 
106 {
107  rho_ == filmThermo_->rho();
108  sigma_ == filmThermo_->sigma();
109  Cp_ == filmThermo_->Cp();
110  kappa_ == filmThermo_->kappa();
111 }
112 
113 
115 {
117 
119 
120  forAll(hsBf, patchi)
121  {
122  const fvPatchField<scalar>& Tp = T_.boundaryField()[patchi];
124  {
125  hsBf[patchi] == hs(Tp, patchi);
126  }
127  }
128 }
129 
130 
132 {
134 
135  // Push boundary film temperature into wall temperature internal field
136  for (label i=0; i<intCoupledPatchIDs_.size(); i++)
137  {
138  label patchi = intCoupledPatchIDs_[i];
139  const polyPatch& pp = regionMesh().boundaryMesh()[patchi];
140  UIndirectList<scalar>(Tw_, pp.faceCells()) =
141  T_.boundaryField()[patchi];
142  }
145  // Update film surface temperature
146  Ts_ = T_;
148 }
149 
150 
152 {
154 
156 
157  // Update primary region fields on local region via direct mapped (coupled)
158  // boundary conditions
161  {
162  YPrimary_[i].correctBoundaryConditions();
163  }
164 }
165 
166 
168 {
170 
172 
173  volScalarField::Boundary& hsSpPrimaryBf =
175 
176  // Convert accumulated source terms into per unit area per unit time
177  const scalar deltaT = time_.deltaTValue();
178  forAll(hsSpPrimaryBf, patchi)
179  {
180  scalarField rpriMagSfdeltaT
181  (
182  (1.0/deltaT)/primaryMesh().magSf().boundaryField()[patchi]
183  );
184 
185  hsSpPrimaryBf[patchi] *= rpriMagSfdeltaT;
186  }
187 
188  // Retrieve the source fields from the primary region via direct mapped
189  // (coupled) boundary conditions
190  // - fields require transfer of values for both patch AND to push the
191  // values into the first layer of internal cells
193 }
194 
195 
197 {
198  if (hydrophilic_)
199  {
200  const scalar hydrophilicDry = hydrophilicDryScale_*deltaWet_;
201  const scalar hydrophilicWet = hydrophilicWetScale_*deltaWet_;
202 
203  forAll(alpha_, i)
204  {
205  if ((alpha_[i] < 0.5) && (delta_[i] > hydrophilicWet))
206  {
207  alpha_[i] = 1.0;
208  }
209  else if ((alpha_[i] > 0.5) && (delta_[i] < hydrophilicDry))
210  {
211  alpha_[i] = 0.0;
212  }
213  }
214 
216  }
217  else
218  {
219  alpha_ ==
221  }
222 }
223 
224 
226 {
228 
229  // Update heat transfer coefficient sub-models
230  htcs_->correct();
231  htcw_->correct();
232 
233  // Update radiation
234  radiation_->correct();
235 
236  // Update injection model - mass returned is mass available for injection
238 
239  phaseChange_->correct
240  (
241  time_.deltaTValue(),
245  );
246 
247  const volScalarField rMagSfDt((1/time().deltaT())/magSf());
248 
249  // Vapour recoil pressure
250  pSp_ -= sqr(rMagSfDt*primaryMassTrans_)/(2*rhoPrimary_);
251 
252  // Update transfer model - mass returned is mass available for transfer
254 
255  // Update source fields
258 
259  turbulence_->correct();
260 }
261 
262 
264 {
265  return
266  (
267  // Heat-transfer to the primary region
268  - fvm::Sp(htcs_->h()/Cp_, hs)
269  + htcs_->h()*(hs/Cp_ + alpha_*(TPrimary_ - T_))
270 
271  // Heat-transfer to the wall
272  - fvm::Sp(htcw_->h()/Cp_, hs)
273  + htcw_->h()*(hs/Cp_ + alpha_*(Tw_- T_))
274  );
275 }
276 
277 
279 {
281 
282  dimensionedScalar residualDeltaRho
283  (
284  "residualDeltaRho",
286  1e-10
287  );
288 
289  solve
290  (
292  + fvm::div(phi_, hs_)
293  ==
294  - hsSp_
295  + q(hs_)
296  + radiation_->Shs()
297  );
298 
300 
301  // Evaluate viscosity from user-model
302  viscosity_->correct(pPrimary_, T_);
303 
304  // Update film wall and surface temperatures
306 }
307 
308 
309 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
310 
311 thermoSingleLayer::thermoSingleLayer
312 (
313  const word& modelType,
314  const fvMesh& mesh,
315  const dimensionedVector& g,
316  const word& regionType,
317  const bool readFields
318 )
319 :
320  kinematicSingleLayer(modelType, mesh, g, regionType, false),
321  thermo_(mesh.lookupObject<SLGThermo>("SLGThermo")),
322  Cp_
323  (
324  IOobject
325  (
326  "Cp",
327  regionMesh().time().timeName(),
328  regionMesh().thisDb(),
329  IOobject::NO_READ,
330  IOobject::AUTO_WRITE,
331  IOobject::REGISTER
332  ),
333  regionMesh(),
336  ),
337  kappa_
338  (
339  IOobject
340  (
341  "kappa",
342  regionMesh().time().timeName(),
343  regionMesh().thisDb(),
344  IOobject::NO_READ,
345  IOobject::AUTO_WRITE,
346  IOobject::REGISTER
347  ),
348  regionMesh(),
351  ),
352 
353  T_
354  (
355  IOobject
356  (
357  "Tf",
358  regionMesh().time().timeName(),
359  regionMesh().thisDb(),
360  IOobject::MUST_READ,
361  IOobject::AUTO_WRITE,
362  IOobject::REGISTER
363  ),
364  regionMesh()
365  ),
366  Ts_
367  (
368  IOobject
369  (
370  "Tsf",
371  regionMesh().time().timeName(),
372  regionMesh().thisDb(),
373  IOobject::NO_READ,
374  IOobject::NO_WRITE
375  ),
376  T_,
378  ),
379  Tw_
380  (
381  IOobject
382  (
383  "Twf",
384  regionMesh().time().timeName(),
385  regionMesh().thisDb(),
386  IOobject::NO_READ,
387  IOobject::NO_WRITE
388  ),
389  T_,
391  ),
392  hs_
393  (
394  IOobject
395  (
396  "hf",
397  regionMesh().time().timeName(),
398  regionMesh().thisDb(),
399  IOobject::NO_READ,
400  IOobject::NO_WRITE
401  ),
402  regionMesh(),
404  hsBoundaryTypes()
405  ),
406 
407  primaryEnergyTrans_
408  (
409  IOobject
410  (
411  "primaryEnergyTrans",
412  regionMesh().time().timeName(),
413  regionMesh().thisDb(),
414  IOobject::NO_READ,
415  IOobject::NO_WRITE
416  ),
417  regionMesh(),
420  ),
421 
422  deltaWet_(coeffs_.get<scalar>("deltaWet")),
423  hydrophilic_(coeffs_.get<bool>("hydrophilic")),
424  hydrophilicDryScale_(0.0),
425  hydrophilicWetScale_(0.0),
426 
427  hsSp_
428  (
429  IOobject
430  (
431  "hsSp",
432  regionMesh().time().timeName(),
433  regionMesh().thisDb(),
434  IOobject::NO_READ,
435  IOobject::NO_WRITE
436  ),
437  regionMesh(),
439  this->mappedPushedFieldPatchTypes<scalar>()
440  ),
441 
442  hsSpPrimary_
443  (
444  IOobject
445  (
446  hsSp_.name(), // Must have same name as hSp_ to enable mapping
447  primaryMesh().time().timeName(),
448  primaryMesh().thisDb(),
449  IOobject::NO_READ,
450  IOobject::NO_WRITE
451  ),
452  primaryMesh(),
453  dimensionedScalar(hsSp_.dimensions(), Zero)
454  ),
455 
456  TPrimary_
457  (
458  IOobject
459  (
460  "T", // Same name as T on primary region to enable mapping
461  regionMesh().time().timeName(),
462  regionMesh().thisDb(),
463  IOobject::NO_READ,
464  IOobject::NO_WRITE
465  ),
466  regionMesh(),
468  this->mappedFieldAndInternalPatchTypes<scalar>()
469  ),
470 
471  YPrimary_(),
472 
473  viscosity_(filmViscosityModel::New(*this, coeffs(), mu_)),
474  htcs_
475  (
476  heatTransferModel::New(*this, coeffs().subDict("upperSurfaceModels"))
477  ),
478  htcw_
479  (
480  heatTransferModel::New(*this, coeffs().subDict("lowerSurfaceModels"))
481  ),
482  phaseChange_(phaseChangeModel::New(*this, coeffs())),
483  radiation_(filmRadiationModel::New(*this, coeffs())),
484  withTbounds_(limitType::CLAMP_NONE),
485  Tbounds_(0, 5000)
486 {
487  unsigned userLimits(limitType::CLAMP_NONE);
488 
489  if (coeffs().readIfPresent("Tmin", Tbounds_.min()))
490  {
491  userLimits |= limitType::CLAMP_MIN;
492  Info<< " limiting minimum temperature to " << Tbounds_.min() << nl;
493  }
494 
495  if (coeffs().readIfPresent("Tmax", Tbounds_.max()))
496  {
497  userLimits |= limitType::CLAMP_MAX;
498  Info<< " limiting maximum temperature to " << Tbounds_.max() << nl;
499  }
500  withTbounds_ = limitType(userLimits);
501 
503  {
504  YPrimary_.setSize(thermo_.carrier().species().size());
505 
506  forAll(thermo_.carrier().species(), i)
507  {
508  YPrimary_.set
509  (
510  i,
511  new volScalarField
512  (
513  IOobject
514  (
515  thermo_.carrier().species()[i],
516  regionMesh().time().timeName(),
517  regionMesh().thisDb(),
520  ),
521  regionMesh(),
524  )
525  );
526  }
527  }
528 
529  if (hydrophilic_)
530  {
531  coeffs_.readEntry("hydrophilicDryScale", hydrophilicDryScale_);
532  coeffs_.readEntry("hydrophilicWetScale", hydrophilicWetScale_);
533  }
534 
535  if (readFields)
536  {
538 
539  correctAlpha();
540 
542 
543  // Update derived fields
544  hs_ == hs(T_);
545 
546  deltaRho_ == delta_*rho_;
547 
549  (
550  IOobject
551  (
552  "phi",
553  regionMesh().time().timeName(),
554  regionMesh().thisDb(),
558  ),
560  );
561 
562  phi_ == phi0;
563 
564  // Evaluate viscosity from user-model
565  viscosity_->correct(pPrimary_, T_);
566  }
567 }
568 
569 
570 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
571 
573 {}
574 
575 
576 // * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
577 
579 (
580  const label patchi,
581  const label facei,
582  const scalar massSource,
583  const vector& momentumSource,
584  const scalar pressureSource,
585  const scalar energySource
586 )
587 {
589  (
590  patchi,
591  facei,
592  massSource,
593  momentumSource,
594  pressureSource,
595  energySource
596  );
597 
599  << " energy = " << energySource << nl << nl;
600 
601  hsSpPrimary_.boundaryFieldRef()[patchi][facei] -= energySource;
602 }
603 
604 
606 {
608 
611 }
612 
613 
615 {
617 
618  // Solve continuity for deltaRho_
619  solveContinuity();
620 
621  // Update sub-models to provide updated source contributions
622  updateSubmodels();
623 
624  // Solve continuity for deltaRho_
625  solveContinuity();
626 
627  for (int oCorr=1; oCorr<=nOuterCorr_; oCorr++)
628  {
629  // Explicit pressure source contribution
630  tmp<volScalarField> tpu(this->pu());
631 
632  // Implicit pressure source coefficient
633  tmp<volScalarField> tpp(this->pp());
634 
635  // Solve for momentum for U_
636  tmp<fvVectorMatrix> tUEqn = solveMomentum(tpu(), tpp());
637  fvVectorMatrix& UEqn = tUEqn.ref();
638 
639  // Solve energy for hs_ - also updates thermo
640  solveEnergy();
641 
642  // Film thickness correction loop
643  for (int corr=1; corr<=nCorr_; corr++)
644  {
645  // Solve thickness for delta_
646  solveThickness(tpu(), tpp(), UEqn);
647  }
648  }
649 
650  // Update deltaRho_ with new delta_
652 
653  // Update temperature using latest hs_
654  T_ == T(hs_);
655 }
656 
659 {
660  return Cp_;
661 }
662 
665 {
666  return kappa_;
667 }
668 
671 {
672  return T_;
673 }
674 
677 {
678  return Ts_;
679 }
680 
683 {
684  return Tw_;
685 }
686 
689 {
690  return hs_;
691 }
692 
693 
695 {
697 
698  const scalarField& Tinternal = T_;
699 
700  Info<< indent << "min/mean/max(T) = "
701  << gMin(Tinternal) << ", "
702  << gAverage(Tinternal) << ", "
703  << gMax(Tinternal) << nl;
704 
705  phaseChange_->info(Info);
706 }
707 
708 
710 {
711  auto tSrho = volScalarField::Internal::New
712  (
713  IOobject::scopedName(typeName, "Srho"),
715  primaryMesh(),
717  );
718  scalarField& Srho = tSrho.ref();
719 
720  const scalarField& V = primaryMesh().V();
721  const scalar dt = time_.deltaTValue();
722 
724  {
725  const label filmPatchi = intCoupledPatchIDs()[i];
726  const label primaryPatchi = primaryPatchIDs()[i];
727 
728  scalarField patchMass =
729  primaryMassTrans_.boundaryField()[filmPatchi];
730 
731  toPrimary(filmPatchi, patchMass);
732 
733  const labelUList& cells =
734  primaryMesh().boundaryMesh()[primaryPatchi].faceCells();
735 
736  forAll(patchMass, j)
737  {
738  Srho[cells[j]] += patchMass[j]/(V[cells[j]]*dt);
739  }
740  }
741 
742  return tSrho;
743 }
744 
745 
747 (
748  const label i
749 ) const
750 {
751  const label vapId = thermo_.carrierId(filmThermo_->name());
752 
753  auto tSrho = volScalarField::Internal::New
754  (
755  IOobject::scopedName(typeName, "Srho(" + Foam::name(i) + ")"),
757  primaryMesh(),
759  );
760  scalarField& Srho = tSrho.ref();
761 
762  if (vapId == i)
763  {
764  const scalarField& V = primaryMesh().V();
765  const scalar dt = time().deltaTValue();
766 
768  {
769  const label filmPatchi = intCoupledPatchIDs_[i];
770  const label primaryPatchi = primaryPatchIDs()[i];
771 
772  scalarField patchMass =
773  primaryMassTrans_.boundaryField()[filmPatchi];
774 
775  toPrimary(filmPatchi, patchMass);
776 
777  const labelUList& cells =
778  primaryMesh().boundaryMesh()[primaryPatchi].faceCells();
779 
780  forAll(patchMass, j)
781  {
782  Srho[cells[j]] += patchMass[j]/(V[cells[j]]*dt);
783  }
784  }
785  }
786 
787  return tSrho;
788 }
789 
790 
792 {
794  (
795  IOobject::scopedName(typeName, "Sh"),
797  primaryMesh(),
799  );
800  scalarField& Sh = tSh.ref();
801 
802  const scalarField& V = primaryMesh().V();
803  const scalar dt = time_.deltaTValue();
804 
806  {
807  const label filmPatchi = intCoupledPatchIDs_[i];
808  const label primaryPatchi = primaryPatchIDs()[i];
809 
810  scalarField patchEnergy =
811  primaryEnergyTrans_.boundaryField()[filmPatchi];
812 
813  toPrimary(filmPatchi, patchEnergy);
814 
815  const labelUList& cells =
816  primaryMesh().boundaryMesh()[primaryPatchi].faceCells();
817 
818  forAll(patchEnergy, j)
819  {
820  Sh[cells[j]] += patchEnergy[j]/(V[cells[j]]*dt);
821  }
822  }
823 
824  return tSh;
825 }
826 
827 
828 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
829 
830 } // End namespace Foam
831 } // End namespace regionModels
832 } // End namespace surfaceFilmModels
833 
834 // ************************************************************************* //
volScalarField Ts_
Temperature - surface [K].
virtual bool read()
Read control parameters from dictionary.
List< ReturnType > get(const UPtrList< T > &list, const AccessOp &aop)
List of values generated by applying the access operation to each list item.
autoPtr< filmThermoModel > filmThermo_
Film thermo model.
autoPtr< heatTransferModel > htcw_
Heat transfer coefficient between wall and film [W/m2/K].
virtual void correctAlpha()
Correct film coverage field.
autoPtr< phaseChangeModel > phaseChange_
Phase change.
void size(const label n)
Older name for setAddressableSize.
Definition: UList.H:116
virtual const volScalarField & Cp() const
Return the film specific heat capacity [J/kg/K].
autoPtr< filmTurbulenceModel > turbulence_
Turbulence model.
virtual void resetPrimaryRegionSourceTerms()
Reset source term fields.
const word zeroGradientType
A zeroGradient patch field type.
virtual void correct(scalarField &availableMass, volScalarField &massToInject, volScalarField &diameterToInject)
Correct.
Ostream & indent(Ostream &os)
Indent stream.
Definition: Ostream.H:493
scalar deltaTValue() const noexcept
Return time step value.
Definition: TimeStateI.H:49
volScalarField primaryMassTrans_
Film mass available for transfer to the primary region.
Kinematic form of single-cell layer surface film model.
virtual void transferPrimaryRegionSourceFields()
Transfer source fields from the primary region to the film region.
Type gMin(const FieldField< Field, Type > &f)
tmp< surfaceScalarField > flux(const volVectorField &vvf)
Return the face-flux field obtained from the given volVectorField.
dimensionedSymmTensor sqr(const dimensionedVector &dv)
constexpr char nl
The newline &#39;\n&#39; character (0x0a)
Definition: Ostream.H:50
wordList types() const
Return a list of the patch types.
virtual void transferPrimaryRegionThermoFields()
Transfer thermo fields from the primary region to the film region.
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:531
virtual const volScalarField & kappa() const
Return the film thermal conductivity [W/m/K].
tmp< DimensionedField< TypeR, GeoMesh > > New(const tmp< DimensionedField< TypeR, GeoMesh >> &tf1, const word &name, const dimensionSet &dimensions, const bool initCopy=false)
Global function forwards to reuseTmpDimensionedField::New.
const speciesTable & species() const
Return the table of species.
const dimensionedScalar phi0
Magnetic flux quantum: default SI units: [Wb].
tmp< fvVectorMatrix > tUEqn(fvm::ddt(rho, U)+fvm::div(phi, U)+MRF.DDt(rho, U)+turbulence->divDevRhoReff(U)==fvOptions(rho, U))
virtual void transferPrimaryRegionThermoFields()
Transfer thermo fields from the primary region to the film region.
Template invariant parts for fvPatchField.
Definition: fvPatchField.H:77
bool hasMultiComponentCarrier() const
Thermo database has multi-component carrier flag.
Definition: SLGThermo.C:219
scalarField availableMass_
Available mass for transfer via sub-models.
volScalarField cloudDiameterTrans_
Parcel diameters originating from film to cloud.
const labelList & primaryPatchIDs() const noexcept
List of patch IDs on the primary region coupled to this region.
Definition: regionModelI.H:90
autoPtr< heatTransferModel > htcs_
Heat transfer coefficient between film surface and primary.
Ignore writing from objectRegistry::writeObject()
const dimensionSet dimless
Dimensionless.
const Time & time() const
Return the top-level database.
Definition: fvMesh.H:360
const DimensionedField< scalar, volMesh > & V() const
Return cell volumes.
virtual void updateSurfaceTemperatures()
Correct the film surface and wall temperatures.
virtual tmp< volScalarField::Internal > Srho() const
Return total mass source - Eulerian phase only.
addToRunTimeSelectionTable(surfaceFilmRegionModel, kinematicSingleLayer, mesh)
Macros for easy insertion into run-time selection tables.
virtual void solveContinuity()
Solve continuity equation.
virtual tmp< volScalarField > pp()
Implicit pressure source coefficient.
volScalarField deltaRho_
Film thickness*density (helper field) [kg/m2].
virtual const objectRegistry & thisDb() const
Return the object registry - resolve conflict polyMesh/lduMesh.
Definition: fvMesh.H:376
Base class for surface film phase change models.
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:421
const labelList & intCoupledPatchIDs() const noexcept
List of patch IDs internally coupled with the primary region.
Definition: regionModelI.H:97
virtual void transferPrimaryRegionSourceFields()
Transfer source fields from the primary region to the film region.
Calculate the first temporal derivative.
bool readEntry(const word &keyword, T &val, enum keyType::option matchOpt=keyType::REGEX, IOobjectOption::readOption readOpt=IOobjectOption::MUST_READ) const
Find entry and assign to T val. FatalIOError if it is found and the number of tokens is incorrect...
static const char *const typeName
Typename for Field.
Definition: Field.H:86
virtual tmp< fvScalarMatrix > q(volScalarField &hs) const
Return the wall/surface heat transfer term for the enthalpy equation.
virtual void correct(scalarField &availableMass, volScalarField &massToTransfer)
Correct kinematic transfers.
word timeName
Definition: getTimeIndex.H:3
const dimensionSet dimVolume(pow3(dimLength))
Definition: dimensionSets.H:58
void toPrimary(const label regionPatchi, List< Type > &regionField) const
Convert a local region field to the primary region.
static word scopedName(const std::string &scope, const word &name)
Create scope:name or scope_name string.
Definition: IOobjectI.H:40
const T & min() const noexcept
The min value (first)
Definition: MinMaxI.H:107
virtual void updateSubmodels()
Update the film sub-models.
UPtrList< const labelUList > faceCells() const
Return a list of faceCells for each patch.
const dimensionedScalar e
Elementary charge.
Definition: createFields.H:11
dynamicFvMesh & mesh
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for expressions::valueTypeCode::INVALID.
Definition: exprTraits.C:127
Base class for surface film viscosity models.
const cellShapeList & cells
virtual tmp< fvVectorMatrix > solveMomentum(const volScalarField &pu, const volScalarField &pp)
Solve for film velocity.
void readFields(const typename GeoFieldType::Mesh &mesh, const IOobjectList &objects, const NameMatchPredicate &selectedFields, DynamicList< regIOobject *> &storedObjects)
Read the selected GeometricFields of the templated type and store on the objectRegistry.
scalar hydrophilicDryScale_
Length scale applied to deltaWet_ to determine when a wet.
const polyBoundaryMesh & boundaryMesh() const noexcept
Return boundary mesh.
Definition: polyMesh.H:609
A class for handling words, derived from Foam::string.
Definition: word.H:63
Calculate the face-flux of the given field.
const dimensionSet dimTemperature(0, 0, 0, 1, 0, 0, 0)
Definition: dimensionSets.H:52
#define DebugInFunction
Report an information message using Foam::Info.
Calculate the laplacian of the given field.
tmp< fvMatrix< Type > > ddt(const GeometricField< Type, fvPatchField, volMesh > &vf)
Definition: fvmDdt.C:41
const dictionary & coeffs() const noexcept
Return the model coefficients dictionary.
Definition: regionModel.H:274
volScalarField kappa_
Thermal conductivity [W/m/K].
Reading is optional [identical to LAZY_READ].
const fvMesh & regionMesh() const
Return the region mesh database.
Definition: regionModelI.H:26
A special matrix type and solver, designed for finite volume solutions of scalar equations. Face addressing is used to make all matrix assembly and solution loops vectorise.
Definition: fvPatchField.H:64
Thermo package for (S)olids (L)iquids and (G)ases Takes reference to thermo package, and provides:
Definition: SLGThermo.H:60
scalar hydrophilicWetScale_
Length scale applied to deltaWet_ to determine when a dry.
virtual const volScalarField & Ts() const
Return the film surface temperature [K].
zeroField Sp(const Foam::zero, const GeometricField< Type, fvPatchField, volMesh > &)
A no-op source.
SolverPerformance< Type > solve(faMatrix< Type > &, const dictionary &solverControls)
Solve returning the solution statistics given convergence tolerance.
virtual tmp< volScalarField > pu()
Explicit pressure source contribution.
#define DebugInfo
Report an information message using Foam::Info.
const SLGThermo & thermo_
Reference to the SLGThermo.
Calculate the divergence of the given field.
const uniformDimensionedVectorField & g
dimensionedScalar pos0(const dimensionedScalar &ds)
virtual void evolveRegion()
Evolve the film equations.
virtual void addSources(const label patchi, const label facei, const scalar massSource, const vector &momentumSource, const scalar pressureSource, const scalar energySource)
External hook to add sources to the film.
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.
Definition: Time.C:714
tmp< fvMatrix< Type > > div(const surfaceScalarField &flux, const GeometricField< Type, fvPatchField, volMesh > &vf, const word &name)
Definition: fvmDiv.C:41
bool readIfPresent(const word &keyword, T &val, enum keyType::option matchOpt=keyType::REGEX) const
Find an entry if present, and assign to T val. FatalIOError if it is found and the number of tokens i...
Type gMax(const FieldField< Field, Type > &f)
virtual void resetPrimaryRegionSourceTerms()
Reset source term fields.
volScalarField primaryEnergyTrans_
Film energy transfer.
virtual void correctThermoFields()
Correct the thermo fields.
autoPtr< filmRadiationModel > radiation_
Radiation.
const dimensionSet dimEnergy
transferModelList transfer_
Transfer with the continuous phase.
dictionary coeffs_
Model coefficients dictionary.
Definition: regionModel.H:117
const basicSpecieMixture & carrier() const
Return reference to the gaseous components.
Definition: SLGThermo.C:104
virtual bool read()
Read control parameters from dictionary.
List< word > wordList
List of word.
Definition: fileName.H:59
label carrierId(const word &cmptName, bool allowNotFound=false) const
Index of carrier component.
Definition: SLGThermo.C:144
virtual const volScalarField & magSf() const
Return the face area magnitudes / [m2].
scalar deltaWet_
Threshold film thickness beyond which the film is considered &#39;wet&#39;.
const dimensionSet dimLength(0, 1, 0, 0, 0, 0, 0)
Definition: dimensionSets.H:50
volScalarField Cp_
Specific heat capacity [J/kg/K].
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
Type gAverage(const FieldField< Field, Type > &f)
const Time & time_
Reference to the time database.
Definition: regionModel.H:97
surfaceScalarField phi_
Mass flux (includes film thickness) [kg.m/s].
fvVectorMatrix & UEqn
Definition: UEqn.H:13
Mesh data needed to do the Finite Volume discretisation.
Definition: fvMesh.H:78
volScalarField alpha_
Film coverage indicator, 1 = covered, 0 = uncovered [].
A List with indirect addressing. Like IndirectList but does not store addressing. ...
Definition: faMatrix.H:52
virtual void preEvolveRegion()
Pre-evolve film hook.
static tmp< DimensionedField< Type, GeoMesh > > New(const word &name, IOobjectOption::registerOption regOpt, const Mesh &mesh, const dimensionSet &dims, const Field< Type > &iField)
Return tmp field (NO_READ, NO_WRITE) from name, mesh, dimensions, copy of internal field...
Nothing to be read.
PtrList< volScalarField > YPrimary_
List of specie mass fractions [0-1].
const dimensionSet dimTime(0, 0, 1, 0, 0, 0, 0)
Definition: dimensionSets.H:51
const T & max() const noexcept
The max value (second)
Definition: MinMaxI.H:121
Boundary & boundaryFieldRef(const bool updateAccessTime=true)
Return a reference to the boundary field.
void correctBoundaryConditions()
Correct boundary field.
virtual const volScalarField & hs() const
Return the film sensible enthalpy [J/kg].
messageStream Info
Information stream (stdout output on master, null elsewhere)
autoPtr< filmViscosityModel > viscosity_
Viscosity model.
virtual void addSources(const label patchi, const label facei, const scalar massSource, const vector &momentumSource, const scalar pressureSource, const scalar energySource=0)
External hook to add sources to the film.
volScalarField cloudMassTrans_
Film mass available for transfer to cloud.
const Type * isA(const U &obj)
Attempt dynamic_cast to Type.
Definition: typeInfo.H:87
This boundary condition provides a self-contained version of the mapped condition. It does not use information on the patch; instead it holds the data locally.
const dimensionSet dimMass(1, 0, 0, 0, 0, 0, 0)
Definition: dimensionSets.H:49
const fvMesh & primaryMesh() const noexcept
Return the reference to the primary mesh database.
Definition: regionModel.H:239
labelList intCoupledPatchIDs_
List of patch IDs internally coupled with the primary region.
Definition: regionModel.H:135
A class for managing temporary objects.
Definition: HashPtrTable.H:50
GeometricField< scalar, fvsPatchField, surfaceMesh > surfaceScalarField
A patch is a list of labels that address the faces in the global face list.
Definition: polyPatch.H:69
Defines the attributes of an object for which implicit objectRegistry management is supported...
Definition: IOobject.H:180
scalarMinMax Tbounds_
Temperature limits (optional)
defineTypeNameAndDebug(kinematicSingleLayer, 0)
virtual void correctHsForMappedT()
Correct sensible enthalpy for mapped temperature fields.
virtual void solveThickness(const volScalarField &pu, const volScalarField &pp, fvVectorMatrix &UEqn)
Solve coupled velocity-thickness equations.
volScalarField hs_
Sensible enthalpy [J/kg].
const Boundary & boundaryField() const noexcept
Return const-reference to the boundary field.
Do not request registration (bool: false)
virtual tmp< volScalarField::Internal > Sh() const
Return enthalpy source - Eulerian phase only.
const Time & time() const noexcept
Return the reference to the time database.
Definition: regionModel.H:244
const dimensionSet dimArea(sqr(dimLength))
Definition: dimensionSets.H:57
Namespace for OpenFOAM.
const dimensionSet & dimensions() const noexcept
Return dimensions.
Base class for film heat transfer models.
virtual const volScalarField & T() const
Return the film mean temperature [K].
static constexpr const zero Zero
Global zero (0)
Definition: zero.H:127
virtual const volScalarField & Tw() const
Return the film wall temperature [K].