PrinceBlanch.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration | Website: https://openfoam.org
5  \\ / A nd | Copyright (C) 2018-2025 OpenFOAM Foundation
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9  This file is part of OpenFOAM.
10 
11  OpenFOAM is free software: you can redistribute it and/or modify it
12  under the terms of the GNU General Public License as published by
13  the Free Software Foundation, either version 3 of the License, or
14  (at your option) any later version.
15 
16  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19  for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
23 
24 \*---------------------------------------------------------------------------*/
25 
26 #include "PrinceBlanch.H"
27 #include "fvcGrad.H"
31 
32 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
33 
34 namespace Foam
35 {
36 namespace populationBalance
37 {
38 namespace coalescenceModels
39 {
42  (
46  );
47 }
48 }
49 }
50 
51 
52 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
53 
55 (
56  const populationBalanceModel& popBal,
57  const dictionary& dict
58 )
59 :
60  coalescenceModel(popBal, dict),
61  C1_("C1", dimless, dict, 0.356),
62  h0_("h0", dimLength, dict, 1e-4),
63  hf_("hf", dimLength, dict, 1e-8),
64  turbulence_(dict.lookup("turbulence")),
65  buoyancy_(dict.lookup("buoyancy")),
66  laminarShear_(dict.lookup("laminarShear"))
67 {
68  if (laminarShear_)
69  {
70  shearStrainRate_.set
71  (
73  (
74  IOobject
75  (
76  "shearStrainRate",
77  popBal_.time().name(),
78  popBal_.mesh()
79  ),
80  popBal_.mesh(),
82  (
83  "shearStrainRate",
85  Zero
86  )
87  )
88  );
89  }
90 }
91 
92 
93 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
94 
96 {
97  if (laminarShear_)
98  {
99  shearStrainRate_() =
100  sqrt(2.0)*mag(symm(fvc::grad(popBal_.continuousPhase().U())));
101  }
102 }
103 
104 
107 (
108  const label i,
109  const label j
110 ) const
111 {
113 
114  const dimensionedScalar& dSphi = popBal_.dSph(i);
115  const dimensionedScalar& dSphj = popBal_.dSph(j);
116 
117  const volScalarField::Internal& rhoc = popBal_.continuousPhase().rho();
118 
119  tmp<volScalarField> tsigma(popBal_.sigmaWithContinuousPhase(i));
120  const volScalarField::Internal& sigma = tsigma();
121 
122  tmp<volScalarField> tepsilonc(popBal_.continuousTurbulence().epsilon());
123  const volScalarField::Internal& epsilonc = tepsilonc();
124 
125  const uniformDimensionedVectorField& g =
126  popBal_.mesh().lookupObject<uniformDimensionedVectorField>("g");
127 
128  const dimensionedScalar rij(1/(1/dSphi + 1/dSphj));
129 
130  const volScalarField::Internal collisionEfficiency
131  (
132  exp
133  (
134  - sqrt(pow3(rij)*rhoc/(16*sigma))
135  *log(h0_/hf_)
136  *cbrt(epsilonc)
137  /pow(rij, 2.0/3.0)
138  )
139  );
140 
141  tmp<volScalarField::Internal> tcoalescenceRate =
143  (
144  "coalescenceRate",
145  popBal_.mesh(),
147  );
148  volScalarField::Internal& coalescenceRate = tcoalescenceRate.ref();
149 
150  if (turbulence_)
151  {
152  coalescenceRate +=
153  (
154  C1_
155  *pi
156  *sqr(dSphi + dSphj)
157  *cbrt(epsilonc)
158  *sqrt(pow(dSphi, 2.0/3.0) + pow(dSphj, 2.0/3.0))
159  )
160  *collisionEfficiency;
161  }
162 
163  if (buoyancy_)
164  {
165  const dimensionedScalar Sij(pi/4*sqr(dSphi + dSphj));
166 
167  coalescenceRate +=
168  Sij
169  *mag
170  (
171  sqrt(2.14*sigma/(rhoc*dSphi) + 0.505*mag(g)*dSphi)
172  - sqrt(2.14*sigma/(rhoc*dSphj) + 0.505*mag(g)*dSphj)
173  )
174  *collisionEfficiency;
175  }
176 
177  if (laminarShear_)
178  {
179  coalescenceRate +=
180  pow3(dSphi + dSphj)/6
181  *shearStrainRate_()*collisionEfficiency;
182  }
183 
184  return tcoalescenceRate;
185 }
186 
187 
188 // ************************************************************************* //
Macros for easy insertion into run-time selection tables.
Field with dimensions and associated with geometry type GeoMesh which is used to size the field and a...
static tmp< DimensionedField< Type, GeoMesh, PrimitiveField > > New(const word &name, const GeoMesh &mesh, const dimensionSet &, const PrimitiveField< Type > &)
Return a temporary field constructed from name, mesh,.
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
Definition: IOobject.H:99
const Time & time() const
Return time.
Definition: IOobject.C:315
A list of keywords followed by any number of values (e.g. words and numbers) or sub-dictionaries.
Definition: dictionary.H:162
const word & name() const
Return const reference to name.
Model for tracking the evolution of a dispersed phase size distribution due to coalescence (synonymou...
const fvMesh & mesh() const
Return reference to the mesh.
Base class for coalescence models.
const populationBalanceModel & popBal_
Reference to the populationBalanceModel.
Model of Prince and Blanch (1990). The coalescence rate is calculated by.
Definition: PrinceBlanch.H:262
virtual void precompute()
Pre-compute diameter independent expressions.
Definition: PrinceBlanch.C:95
virtual tmp< volScalarField::Internal > rate(const label i, const label j) const
Return the coalescence rate between two groups.
Definition: PrinceBlanch.C:107
PrinceBlanch(const populationBalanceModel &popBal, const dictionary &dict)
Definition: PrinceBlanch.C:55
A class for managing temporary objects.
Definition: tmp.H:55
T & ref() const
Return non-const reference or generate a fatal error.
Definition: tmpI.H:197
Calculate the gradient of the given field.
const dimensionedScalar e
Elementary charge.
const dimensionedScalar sigma
Stefan-Boltzmann constant: default SI units: [W/m^2/K^4].
const dimensionSet dimless
tmp< VolField< typename outerProduct< vector, Type >::type > > grad(const SurfaceField< Type > &ssf)
Definition: fvcGrad.C:46
defineTypeNameAndDebug(AdachiStuartFokkink, 0)
addToRunTimeSelectionTable(coalescenceModel, AdachiStuartFokkink, dictionary)
const unitSet & lookup(const word &unitName)
Lookup and return the named unit from the table.
Definition: units.C:346
Namespace for OpenFOAM.
static const zero Zero
Definition: zero.H:97
dimensionedScalar exp(const dimensionedScalar &ds)
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Definition: label.H:59
const dimensionSet & dimLength
Definition: dimensions.C:141
const dimensionSet & dimVolume
Definition: dimensions.C:150
dimensionedScalar log(const dimensionedScalar &ds)
tmp< DimensionedField< typename outerProduct< Type, Type >::type, GeoMesh, Field >> sqr(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
const dimensionSet & dimVelocity
Definition: dimensions.C:154
const dimensionSet & dimTime
Definition: dimensions.C:142
void symm(pointPatchField< tensor > &, const pointPatchField< tensor > &)
void pow3(LagrangianPatchField< scalar > &f, const LagrangianPatchField< scalar > &f1)
void cbrt(LagrangianPatchField< scalar > &f, const LagrangianPatchField< scalar > &f1)
tmp< DimensionedField< typename powProduct< Type, r >::type, GeoMesh, Field > > pow(const DimensionedField< Type, GeoMesh, PrimitiveField > &df, typename powProduct< Type, r >::type)
tmp< DimensionedField< scalar, GeoMesh, Field > > mag(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
void sqrt(LagrangianPatchField< scalar > &f, const LagrangianPatchField< scalar > &f1)
dictionary dict
Typedefs for UniformDimensionedField.