NonSphereDragForce.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) 2021 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 Class
28  Foam::NonSphereDragForce
29 
30 Group
31  grpLagrangianIntermediateForceSubModels
32 
33 Description
34  Particle-drag model wherein drag forces (per unit carrier-fluid
35  velocity) are dynamically computed based on empirical expressions using
36  a four-parameter general drag correlation for non-spherical particles.
37 
38  \f[
39  \mathrm{F}_\mathrm{D} =
40  \frac{3}{4}
41  \frac{\mu_c\,\mathrm{C}_\mathrm{D}\,\mathrm{Re}_p}{\rho_p \, d_p^2}
42  \f]
43  with
44 
45  \f[
46  \mathrm{C}_\mathrm{D} =
47  \frac{24}{\mathrm{Re}_p} \left( 1 + A \, \mathrm{Re}_p^B \right)
48  + \frac{C \, \mathrm{Re}_p}{D + \mathrm{Re}_p}
49  \f]
50  where
51 
52  \f[
53  A = \exp(2.3288 - 6.4581\phi + 2.4486 \phi^2)
54  \f]
55 
56  \f[
57  B = 0.0964 + 0.5565\phi
58  \f]
59 
60  \f[
61  C = \exp(4.9050 - 13.8944\phi + 18.4222\phi^2 - 10.2599 \phi^3)
62  \f]
63 
64  \f[
65  D = \exp(1.4681 + 12.2584\phi - 20.7322\phi^2 + 15.8855\phi^3)
66  \f]
67 
68  \f[
69  \phi = \frac{A_p}{A_a}
70  \f]
71 
72  \f[
73  \mathrm{Re}_p =
74  \frac{\rho_c \, | \mathbf{u}_\mathrm{rel} | \, d_p}{\mu_c}
75  \f]
76 
77  where
78  \vartable
79  \mathrm{F}_\mathrm{D} | Drag force per carrier-fluid velocity [kg/s]
80  \mathrm{C}_\mathrm{D} | Particle drag coefficient
81  \mathrm{Re}_p | Particle Reynolds number
82  \rho_p | Particle mass density
83  \mu_c | Dynamic viscosity of carrier at the cell occupying particle
84  d_p | Particle diameter
85  \rho_c | Density of carrier at the cell occupying particle
86  \mathbf{u}_\mathrm{rel} | Relative velocity between particle and carrier
87  A_p | Surface area of sphere with the same volume as the particle
88  A_a | Actual surface area of the particle
89  \phi | Ratio of surface areas
90  \endvartable
91 
92  Constraints:
93  - Applicable to particles with a spatially homogeneous distribution.
94  - \f$ 1 \geq \phi > 0 \f$
95 
96  References:
97  \verbatim
98  Standard model (tag:HL), (Eq. 4,10-11):
99  Haider, A., & Levenspiel, O. (1989).
100  Drag coefficient and terminal velocity of
101  spherical and nonspherical particles.
102  Powder technology, 58(1), 63-70.
103  DOI:10.1016/0032-5910(89)80008-7
104  \endverbatim
105 
106 Usage
107  Minimal example by using \c constant/<CloudProperties>:
108  \verbatim
109  subModels
110  {
111  particleForces
112  {
113  nonSphereDrag
114  {
115  phi <phi>;
116  }
117  }
118  }
119  \endverbatim
120 
121  where the entries mean:
122  \table
123  Property | Description | Type | Reqd | Deflt
124  type | Type name: nonSphereDrag | word | yes | -
125  phi | Ratio of surface area of sphere having same <!--
126  --> volume as particle to actual surface area of <!--
127  --> particle | scalar | yes | -
128  \endtable
129 
130 Note
131  - The drag coefficient model in (HL:Eq. 11) is good to within
132  2 to 4 \% of RMS values from the corresponding experiment.
133  - (HL:Eq. 12) also give a simplified model with greater error
134  compared to results from the experiment, but since \c phi is
135  presumed constant, Eq. 12 offers little benefit.
136  - \f$\mathrm{F}_\mathrm{D}\f$ is weighted with the particle mass
137  at the stage of a function return, so that it can later be normalised
138  with the effective mass, if necessary (e.g. when using virtual-mass forces).
139 
140 SourceFiles
141  NonSphereDragForce.C
142 
143 \*---------------------------------------------------------------------------*/
144 
145 #ifndef NonSphereDragForce_H
146 #define NonSphereDragForce_H
147 
148 #include "ParticleForce.H"
149 
150 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
151 
152 namespace Foam
153 {
154 /*---------------------------------------------------------------------------*\
155  Class NonSphereDragForce Declaration
156 \*---------------------------------------------------------------------------*/
157 
158 template<class CloudType>
159 class NonSphereDragForce
160 :
161  public ParticleForce<CloudType>
162 {
163 protected:
164 
165  // Protected Data
166 
167  //- Ratio of surface of sphere having same volume as particle to
168  //- actual surface area of particle (0 < phi <= 1)
169  scalar phi_;
170 
171 
172  // Model coefficients
173 
174  scalar a_;
175 
176  scalar b_;
177 
178  scalar c_;
179 
180  scalar d_;
181 
182 
183  // Private Member Functions
184 
185  //- Drag coefficient multiplied by Reynolds number
186  scalar CdRe(const scalar Re) const;
187 
188 
189 public:
190 
191  //- Runtime type information
192  TypeName("nonSphereDrag");
193 
194 
195  // Constructors
196 
197  //- Construct from mesh
199  (
200  CloudType& owner,
201  const fvMesh& mesh,
202  const dictionary& dict
203  );
204 
205  //- Construct copy
206  NonSphereDragForce(const NonSphereDragForce<CloudType>& df);
207 
208  //- Construct and return a clone
209  virtual autoPtr<ParticleForce<CloudType>> clone() const
210  {
211  return autoPtr<ParticleForce<CloudType>>
212  (
213  new NonSphereDragForce<CloudType>(*this)
214  );
215  }
216 
217  //- No copy assignment
218  void operator=(const NonSphereDragForce<CloudType>&) = delete;
219 
221  //- Destructor
222  virtual ~NonSphereDragForce() = default;
223 
224 
225  // Member Functions
226 
227  // Evaluation
228 
229  //- Calculate the non-coupled force
230  virtual forceSuSp calcCoupled
231  (
232  const typename CloudType::parcelType& p,
233  const typename CloudType::parcelType::trackingData& td,
234  const scalar dt,
235  const scalar mass,
236  const scalar Re,
237  const scalar muc
238  ) const;
239 };
240 
242 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
244 } // End namespace Foam
245 
246 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
247 
248 #ifdef NoRepository
249  #include "NonSphereDragForce.C"
250 #endif
251 
252 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
253 
254 #endif
255 
256 // ************************************************************************* //
dictionary dict
DSMCCloud< dsmcParcel > CloudType
virtual ~NonSphereDragForce()=default
Destructor.
scalar phi_
Ratio of surface of sphere having same volume as particle to actual surface area of particle (0 < phi...
virtual autoPtr< ParticleForce< CloudType > > clone() const
Construct and return a clone.
Helper container for force Su and Sp terms.
Definition: forceSuSp.H:60
const fvMesh & mesh() const noexcept
Return the mesh database.
TypeName("nonSphereDrag")
Runtime type information.
ParcelType parcelType
Type of parcel the cloud was instantiated for.
Definition: DSMCCloud.H:290
scalarField Re(const UList< complex > &cmplx)
Extract real component.
Definition: complexField.C:207
const CloudType & owner() const noexcept
Return const access to the cloud owner.
void operator=(const NonSphereDragForce< CloudType > &)=delete
No copy assignment.
scalar CdRe(const scalar Re) const
Drag coefficient multiplied by Reynolds number.
virtual forceSuSp calcCoupled(const typename CloudType::parcelType &p, const typename CloudType::parcelType::trackingData &td, const scalar dt, const scalar mass, const scalar Re, const scalar muc) const
Calculate the non-coupled force.
volScalarField & p
NonSphereDragForce(CloudType &owner, const fvMesh &mesh, const dictionary &dict)
Construct from mesh.
Namespace for OpenFOAM.