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-2020 OpenCFD Ltd.
10-------------------------------------------------------------------------------
11License
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
51namespace Foam
52{
53namespace regionModels
54{
55namespace surfaceFilmModels
56{
57
58// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
59
61
63
64// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
65
66wordList 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])
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 }
144
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
160 forAll(YPrimary_, i)
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 (
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
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 (
325 (
326 "Cp",
327 time().timeName(),
328 regionMesh(),
329 IOobject::NO_READ,
330 IOobject::AUTO_WRITE
331 ),
332 regionMesh(),
334 zeroGradientFvPatchScalarField::typeName
335 ),
336 kappa_
337 (
339 (
340 "kappa",
341 time().timeName(),
342 regionMesh(),
343 IOobject::NO_READ,
344 IOobject::AUTO_WRITE
345 ),
346 regionMesh(),
348 zeroGradientFvPatchScalarField::typeName
349 ),
350
351 T_
352 (
354 (
355 "Tf",
356 time().timeName(),
357 regionMesh(),
358 IOobject::MUST_READ,
359 IOobject::AUTO_WRITE
360 ),
361 regionMesh()
362 ),
363 Ts_
364 (
366 (
367 "Tsf",
368 time().timeName(),
369 regionMesh(),
370 IOobject::NO_READ,
371 IOobject::NO_WRITE
372 ),
373 T_,
374 zeroGradientFvPatchScalarField::typeName
375 ),
376 Tw_
377 (
379 (
380 "Twf",
381 time().timeName(),
382 regionMesh(),
383 IOobject::NO_READ,
384 IOobject::NO_WRITE
385 ),
386 T_,
387 zeroGradientFvPatchScalarField::typeName
388 ),
389 hs_
390 (
392 (
393 "hf",
394 time().timeName(),
395 regionMesh(),
396 IOobject::NO_READ,
397 IOobject::NO_WRITE
398 ),
399 regionMesh(),
401 hsBoundaryTypes()
402 ),
403
404 primaryEnergyTrans_
405 (
407 (
408 "primaryEnergyTrans",
409 time().timeName(),
410 regionMesh(),
411 IOobject::NO_READ,
412 IOobject::NO_WRITE
413 ),
414 regionMesh(),
416 zeroGradientFvPatchScalarField::typeName
417 ),
418
419 deltaWet_(coeffs_.get<scalar>("deltaWet")),
420 hydrophilic_(coeffs_.get<bool>("hydrophilic")),
421 hydrophilicDryScale_(0.0),
422 hydrophilicWetScale_(0.0),
423
424 hsSp_
425 (
427 (
428 "hsSp",
429 time().timeName(),
430 regionMesh(),
431 IOobject::NO_READ,
432 IOobject::NO_WRITE
433 ),
434 regionMesh(),
436 this->mappedPushedFieldPatchTypes<scalar>()
437 ),
438
439 hsSpPrimary_
440 (
442 (
443 hsSp_.name(), // Must have same name as hSp_ to enable mapping
444 time().timeName(),
445 primaryMesh(),
446 IOobject::NO_READ,
447 IOobject::NO_WRITE
448 ),
449 primaryMesh(),
450 dimensionedScalar(hsSp_.dimensions(), Zero)
451 ),
452
453 TPrimary_
454 (
456 (
457 "T", // Same name as T on primary region to enable mapping
458 time().timeName(),
459 regionMesh(),
460 IOobject::NO_READ,
461 IOobject::NO_WRITE
462 ),
463 regionMesh(),
465 this->mappedFieldAndInternalPatchTypes<scalar>()
466 ),
467
468 YPrimary_(),
469
470 viscosity_(filmViscosityModel::New(*this, coeffs(), mu_)),
471 htcs_
472 (
473 heatTransferModel::New(*this, coeffs().subDict("upperSurfaceModels"))
474 ),
475 htcw_
476 (
477 heatTransferModel::New(*this, coeffs().subDict("lowerSurfaceModels"))
478 ),
479 phaseChange_(phaseChangeModel::New(*this, coeffs())),
480 radiation_(filmRadiationModel::New(*this, coeffs())),
481 Tmin_(-VGREAT),
482 Tmax_(VGREAT)
483{
484 if (coeffs().readIfPresent("Tmin", Tmin_))
485 {
486 Info<< " limiting minimum temperature to " << Tmin_ << endl;
487 }
488
489 if (coeffs().readIfPresent("Tmax", Tmax_))
490 {
491 Info<< " limiting maximum temperature to " << Tmax_ << endl;
492 }
493
495 {
496 YPrimary_.setSize(thermo_.carrier().species().size());
497
499 {
500 YPrimary_.set
501 (
502 i,
504 (
506 (
507 thermo_.carrier().species()[i],
508 time().timeName(),
509 regionMesh(),
512 ),
513 regionMesh(),
516 )
517 );
518 }
519 }
520
521 if (hydrophilic_)
522 {
523 coeffs_.readEntry("hydrophilicDryScale", hydrophilicDryScale_);
524 coeffs_.readEntry("hydrophilicWetScale", hydrophilicWetScale_);
525 }
526
527 if (readFields)
528 {
530
531 correctAlpha();
532
534
535 // Update derived fields
536 hs_ == hs(T_);
537
539
541 (
543 (
544 "phi",
545 time().timeName(),
546 regionMesh(),
549 false
550 ),
552 );
553
554 phi_ == phi0;
555
556 // Evaluate viscosity from user-model
557 viscosity_->correct(pPrimary_, T_);
558 }
559}
560
561
562// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
563
565{}
566
567
568// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
569
571(
572 const label patchi,
573 const label facei,
574 const scalar massSource,
575 const vector& momentumSource,
576 const scalar pressureSource,
577 const scalar energySource
578)
579{
581 (
582 patchi,
583 facei,
584 massSource,
585 momentumSource,
586 pressureSource,
587 energySource
588 );
589
591 << " energy = " << energySource << nl << nl;
592
593 hsSpPrimary_.boundaryFieldRef()[patchi][facei] -= energySource;
594}
595
596
598{
600
603}
604
605
607{
609
610 // Solve continuity for deltaRho_
612
613 // Update sub-models to provide updated source contributions
615
616 // Solve continuity for deltaRho_
618
619 for (int oCorr=1; oCorr<=nOuterCorr_; oCorr++)
620 {
621 // Explicit pressure source contribution
622 tmp<volScalarField> tpu(this->pu());
623
624 // Implicit pressure source coefficient
625 tmp<volScalarField> tpp(this->pp());
626
627 // Solve for momentum for U_
629 fvVectorMatrix& UEqn = tUEqn.ref();
630
631 // Solve energy for hs_ - also updates thermo
632 solveEnergy();
633
634 // Film thickness correction loop
635 for (int corr=1; corr<=nCorr_; corr++)
636 {
637 // Solve thickness for delta_
638 solveThickness(tpu(), tpp(), UEqn);
639 }
640 }
641
642 // Update deltaRho_ with new delta_
644
645 // Update temperature using latest hs_
646 T_ == T(hs_);
647}
648
649
651{
652 return Cp_;
653}
654
655
657{
658 return kappa_;
659}
660
661
663{
664 return T_;
665}
666
667
669{
670 return Ts_;
671}
672
673
675{
676 return Tw_;
677}
678
679
681{
682 return hs_;
683}
684
685
687{
689
690 const scalarField& Tinternal = T_;
691
692 Info<< indent << "min/mean/max(T) = "
693 << gMin(Tinternal) << ", "
694 << gAverage(Tinternal) << ", "
695 << gMax(Tinternal) << nl;
696
697 phaseChange_->info(Info);
698}
699
700
702{
704 (
706 (
708 (
709 typeName + ":Srho",
710 time().timeName(),
711 primaryMesh(),
714 false
715 ),
716 primaryMesh(),
718 )
719 );
720
721 scalarField& Srho = tSrho.ref();
722 const scalarField& V = primaryMesh().V();
723 const scalar dt = time_.deltaTValue();
724
726 {
727 const label filmPatchi = intCoupledPatchIDs()[i];
728
729 scalarField patchMass =
730 primaryMassTrans_.boundaryField()[filmPatchi];
731
732 toPrimary(filmPatchi, patchMass);
733
734 const label primaryPatchi = primaryPatchIDs()[i];
735 const labelUList& cells =
736 primaryMesh().boundaryMesh()[primaryPatchi].faceCells();
737
738 forAll(patchMass, j)
739 {
740 Srho[cells[j]] += patchMass[j]/(V[cells[j]]*dt);
741 }
742 }
743
744 return tSrho;
745}
746
747
749(
750 const label i
751) const
752{
753 const label vapId = thermo_.carrierId(filmThermo_->name());
754
756 (
758 (
760 (
761 typeName + ":Srho(" + Foam::name(i) + ")",
762 time_.timeName(),
763 primaryMesh(),
766 false
767 ),
768 primaryMesh(),
770 )
771 );
772
773 if (vapId == i)
774 {
775 scalarField& Srho = tSrho.ref();
776 const scalarField& V = primaryMesh().V();
777 const scalar dt = time().deltaTValue();
778
780 {
781 const label filmPatchi = intCoupledPatchIDs_[i];
782
783 scalarField patchMass =
784 primaryMassTrans_.boundaryField()[filmPatchi];
785
786 toPrimary(filmPatchi, patchMass);
787
788 const label primaryPatchi = primaryPatchIDs()[i];
789 const labelUList& cells =
790 primaryMesh().boundaryMesh()[primaryPatchi].faceCells();
791
792 forAll(patchMass, j)
793 {
794 Srho[cells[j]] += patchMass[j]/(V[cells[j]]*dt);
795 }
796 }
797 }
798
799 return tSrho;
800}
801
802
804{
806 (
808 (
810 (
811 typeName + ":Sh",
812 time().timeName(),
813 primaryMesh(),
816 false
817 ),
818 primaryMesh(),
820 )
821 );
822
823 scalarField& Sh = tSh.ref();
824 const scalarField& V = primaryMesh().V();
825 const scalar dt = time_.deltaTValue();
826
828 {
829 const label filmPatchi = intCoupledPatchIDs_[i];
830
831 scalarField patchEnergy =
833
834 toPrimary(filmPatchi, patchEnergy);
835
836 const label primaryPatchi = primaryPatchIDs()[i];
837 const labelUList& cells =
838 primaryMesh().boundaryMesh()[primaryPatchi].faceCells();
839
840 forAll(patchEnergy, j)
841 {
842 Sh[cells[j]] += patchEnergy[j]/(V[cells[j]]*dt);
843 }
844 }
845
846 return tSh;
847}
848
849
850// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
851
852} // End namespace Foam
853} // End namespace regionModels
854} // End namespace surfaceFilmModels
855
856// ************************************************************************* //
Macros for easy insertion into run-time selection tables.
#define addToRunTimeSelectionTable(baseType, thisType, argNames)
Add to construction table with typeName as the key.
const uniformDimensionedVectorField & g
const dimensionSet & dimensions() const
Return dimensions.
wordList types() const
Return a list of the patch types.
Boundary & boundaryFieldRef(const bool updateAccessTime=true)
Return a reference to the boundary field.
const Boundary & boundaryField() const
Return const-reference to the boundary field.
void correctBoundaryConditions()
Correct boundary field.
Defines the attributes of an object for which implicit objectRegistry management is supported,...
Definition: IOobject.H:170
Thermo package for (S)olids (L)iquids and (G)ases Takes reference to thermo package,...
Definition: SLGThermo.H:67
label carrierId(const word &cmptName, bool allowNotFound=false) const
Index of carrier component.
Definition: SLGThermo.C:151
const basicSpecieMixture & carrier() const
Return reference to the gaseous components.
Definition: SLGThermo.C:111
bool hasMultiComponentCarrier() const
Thermo database has multi-component carrier flag.
Definition: SLGThermo.C:226
scalar deltaTValue() const noexcept
Return time step value.
Definition: TimeStateI.H:43
static word timeName(const scalar t, const int precision=precision_)
Definition: Time.C:780
A List with indirect addressing. Like IndirectList but does not store addressing.
Definition: IndirectList.H:79
void size(const label n)
Older name for setAddressableSize.
Definition: UList.H:114
const speciesTable & species() const
Return the table of species.
bool readIfPresent(const word &keyword, T &val, enum keyType::option matchOpt=keyType::REGEX) const
bool readEntry(const word &keyword, T &val, enum keyType::option matchOpt=keyType::REGEX, bool mandatory=true) const
This boundary condition supplies a fixed value constraint, and is the base class for a number of othe...
A special matrix type and solver, designed for finite volume solutions of scalar equations....
Definition: fvMatrix.H:121
Mesh data needed to do the Finite Volume discretisation.
Definition: fvMesh.H:91
const DimensionedField< scalar, volMesh > & V() const
Return cell volumes.
Abstract base class with a fat-interface to all derived classes covering all possible ways in which t...
Definition: fvPatchField.H:82
tmp< FieldField< Field, scalar > > q() const
Return q boundary fields.
This boundary condition provides a self-contained version of the mapped condition....
UPtrList< const labelUList > faceCells() const
Return a list of faceCells for each patch.
const polyBoundaryMesh & boundaryMesh() const
Return boundary mesh.
Definition: polyMesh.H:456
A patch is a list of labels that address the faces in the global face list.
Definition: polyPatch.H:75
virtual void correct(scalarField &availableMass, volScalarField &massToInject, volScalarField &diameterToInject)
Correct.
const Time & time_
Reference to the time database.
Definition: regionModel.H:90
const Time & time() const
Return the reference to the time database.
Definition: regionModelI.H:40
const dictionary & coeffs() const
Return the model coefficients dictionary.
Definition: regionModelI.H:92
const fvMesh & primaryMesh() const
Return the reference to the primary mesh database.
Definition: regionModelI.H:34
dictionary coeffs_
Model coefficients dictionary.
Definition: regionModel.H:102
const fvMesh & regionMesh() const
Return the region mesh database.
Definition: regionModelI.H:64
const labelList & primaryPatchIDs() const
Return the list of patch IDs on the primary region coupled.
Definition: regionModelI.H:168
void toPrimary(const label regionPatchi, List< Type > &regionField) const
Convert a local region field to the primary region.
labelList intCoupledPatchIDs_
List of patch IDs internally coupled with the primary region.
Definition: regionModel.H:114
const labelList & intCoupledPatchIDs() const
Return the list of patch IDs internally coupled with the.
Definition: regionModelI.H:175
virtual const volScalarField & magSf() const
Return the face area magnitudes / [m2].
Base class for surface film viscosity models.
Base class for film heat transfer models.
Kinematic form of single-cell layer surface film model.
virtual void solveThickness(const volScalarField &pu, const volScalarField &pp, fvVectorMatrix &UEqn)
Solve coupled velocity-thickness equations.
virtual void transferPrimaryRegionThermoFields()
Transfer thermo fields from the primary region to the film region.
virtual void solveContinuity()
Solve continuity equation.
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 deltaRho_
Film thickness*density (helper field) [kg/m2].
volScalarField cloudDiameterTrans_
Parcel diameters originating from film to cloud.
transferModelList transfer_
Transfer with the continuous phase.
virtual void resetPrimaryRegionSourceTerms()
Reset source term fields.
surfaceScalarField phi_
Mass flux (includes film thickness) [kg.m/s].
virtual tmp< fvVectorMatrix > solveMomentum(const volScalarField &pu, const volScalarField &pp)
Solve for film velocity.
virtual tmp< volScalarField > pp()
Implicit pressure source coefficient.
virtual void transferPrimaryRegionSourceFields()
Transfer source fields from the primary region to the film region.
volScalarField primaryMassTrans_
Film mass available for transfer to the primary region.
volScalarField cloudMassTrans_
Film mass available for transfer to cloud.
autoPtr< filmThermoModel > filmThermo_
Film thermo model.
scalarField availableMass_
Available mass for transfer via sub-models.
virtual bool read()
Read control parameters from dictionary.
virtual tmp< volScalarField > pu()
Explicit pressure source contribution.
autoPtr< filmTurbulenceModel > turbulence_
Turbulence model.
volScalarField alpha_
Film coverage indicator, 1 = covered, 0 = uncovered [].
Base class for surface film phase change models.
Thermodynamic form of single-cell layer surface film model.
virtual void transferPrimaryRegionThermoFields()
Transfer thermo fields from the primary region to the film region.
volScalarField kappa_
Thermal conductivity [W/m/K].
autoPtr< heatTransferModel > htcw_
Heat transfer coefficient between wall and film [W/m2/K].
virtual const volScalarField & hs() const
Return the film sensible enthalpy [J/kg].
virtual tmp< fvScalarMatrix > q(volScalarField &hs) const
Return the wall/surface heat transfer term for the enthalpy equation.
virtual void updateSurfaceTemperatures()
Correct the film surface and wall temperatures.
autoPtr< filmRadiationModel > radiation_
Radiation.
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.
virtual const volScalarField & kappa() const
Return the film thermal conductivity [W/m/K].
virtual const volScalarField & T() const
Return the film mean temperature [K].
virtual const volScalarField & Ts() const
Return the film surface temperature [K].
volScalarField Cp_
Specific heat capacity [J/kg/K].
scalar hydrophilicWetScale_
Length scale applied to deltaWet_ to determine when a dry.
virtual const volScalarField & Tw() const
Return the film wall temperature [K].
virtual const volScalarField & Cp() const
Return the film specific heat capacity [J/kg/K].
virtual void resetPrimaryRegionSourceTerms()
Reset source term fields.
scalar deltaWet_
Threshold film thickness beyond which the film is considered 'wet'.
virtual void correctAlpha()
Correct film coverage field.
PtrList< volScalarField > YPrimary_
List of specie mass fractions [0-1].
volScalarField primaryEnergyTrans_
Film energy transfer.
scalar Tmax_
Maximum temperature limit (optional)
scalar Tmin_
Minimum temperature limit (optional)
scalar hydrophilicDryScale_
Length scale applied to deltaWet_ to determine when a wet.
virtual void correctThermoFields()
Correct the thermo fields.
virtual void updateSubmodels()
Update the film sub-models.
virtual void transferPrimaryRegionSourceFields()
Transfer source fields from the primary region to the film region.
const SLGThermo & thermo_
Reference to the SLGThermo.
autoPtr< phaseChangeModel > phaseChange_
Phase change.
virtual tmp< volScalarField::Internal > Srho() const
Return total mass source - Eulerian phase only.
autoPtr< filmViscosityModel > viscosity_
Viscosity model.
autoPtr< heatTransferModel > htcs_
Heat transfer coefficient between film surface and primary.
virtual bool read()
Read control parameters from dictionary.
virtual void correctHsForMappedT()
Correct sensible enthalpy for mapped temperature fields.
virtual tmp< volScalarField::Internal > Sh() const
Return enthalpy source - Eulerian phase only.
virtual void evolveRegion()
Evolve the film equations.
volScalarField Ts_
Temperature - surface [K].
virtual void correct(scalarField &availableMass, volScalarField &massToTransfer)
Correct kinematic transfers.
A class for managing temporary objects.
Definition: tmp.H:65
T & ref() const
Definition: tmpI.H:227
A class for handling words, derived from Foam::string.
Definition: word.H:68
#define defineTypeNameAndDebug(Type, DebugSwitch)
Define the typeName and debug information.
Definition: className.H:121
tmp< fvVectorMatrix > tUEqn(fvm::ddt(rho, U)+fvm::div(phi, U)+MRF.DDt(rho, U)+turbulence->divDevRhoReff(U)==fvOptions(rho, U))
fvVectorMatrix & UEqn
Definition: UEqn.H:13
bool
Definition: EEqn.H:20
dynamicFvMesh & mesh
Calculate the first temporal derivative.
Calculate the divergence of the given field.
Calculate the face-flux of the given field.
Calculate the laplacian of the given field.
const cellShapeList & cells
word timeName
Definition: getTimeIndex.H:3
#define DebugInfo
Report an information message using Foam::Info.
#define DebugInFunction
Report an information message using Foam::Info.
tmp< surfaceScalarField > flux(const volVectorField &vvf)
Return the face-flux field obtained from the given volVectorField.
Definition: fvcFlux.C:34
tmp< fvMatrix< Type > > div(const surfaceScalarField &flux, const GeometricField< Type, fvPatchField, volMesh > &vf, const word &name)
Definition: fvmDiv.C:48
tmp< fvMatrix< Type > > ddt(const GeometricField< Type, fvPatchField, volMesh > &vf)
Definition: fvmDdt.C:48
zeroField Sp(const Foam::zero, const GeometricField< Type, fvPatchField, volMesh > &)
A no-op source.
Namespace for OpenFOAM.
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
const dimensionSet dimless
Dimensionless.
dimensionedScalar pos0(const dimensionedScalar &ds)
dimensionedSymmTensor sqr(const dimensionedVector &dv)
const dimensionSet dimEnergy
const dimensionSet dimLength(0, 1, 0, 0, 0, 0, 0)
Definition: dimensionSets.H:52
const dimensionSet dimTime(0, 0, 1, 0, 0, 0, 0)
Definition: dimensionSets.H:53
const TargetType * isA(const Type &t)
Check if dynamic_cast to TargetType is possible.
Definition: typeInfo.H:197
const dimensionSet dimArea(sqr(dimLength))
Definition: dimensionSets.H:59
messageStream Info
Information stream (stdout output on master, null elsewhere)
void readFields(const typename GeoFieldType::Mesh &mesh, const IOobjectList &objects, const wordHashSet &selectedFields, LIFOStack< regIOobject * > &storedObjects)
Read the selected GeometricFields of the templated type.
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:372
Ostream & indent(Ostream &os)
Indent stream.
Definition: Ostream.H:342
const dimensionSet dimTemperature(0, 0, 0, 1, 0, 0, 0)
Definition: dimensionSets.H:54
Type gAverage(const FieldField< Field, Type > &f)
static constexpr const zero Zero
Global zero (0)
Definition: zero.H:131
tmp< DimensionedField< TypeR, GeoMesh > > New(const tmp< DimensionedField< TypeR, GeoMesh > > &tdf1, const word &name, const dimensionSet &dimensions)
Global function forwards to reuseTmpDimensionedField::New.
Type gMin(const FieldField< Field, Type > &f)
const dimensionSet dimVolume(pow3(dimLength))
Definition: dimensionSets.H:60
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for INVALID.
Definition: exprTraits.C:59
Type gMax(const FieldField< Field, Type > &f)
const dimensionSet dimMass(1, 0, 0, 0, 0, 0, 0)
Definition: dimensionSets.H:51
constexpr char nl
The newline '\n' character (0x0a)
Definition: Ostream.H:53
CEqn solve()
volScalarField & e
Definition: createFields.H:11
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:333