PressureGradientForce.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) 2020 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 "PressureGradientForce.H"
30 #include "fvcDdt.H"
31 #include "fvcGrad.H"
32 
33 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
34 
35 template<class CloudType>
37 (
38  CloudType& owner,
39  const fvMesh& mesh,
40  const dictionary& dict,
41  const word& forceType
42 )
43 :
44  ParticleForce<CloudType>(owner, mesh, dict, forceType, true),
45  UName_(this->coeffs().template getOrDefault<word>("U", "U")),
46  DUcDtInterpPtr_(nullptr)
47 {}
48 
49 
50 template<class CloudType>
52 (
53  const PressureGradientForce& pgf
54 )
55 :
57  UName_(pgf.UName_),
58  DUcDtInterpPtr_(nullptr)
59 {}
60 
61 
62 // * * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * //
63 
64 template<class CloudType>
66 {}
67 
68 
69 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
70 
71 template<class CloudType>
73 {
74  static word resultName("DUcDt");
75 
76  volVectorField* resultPtr =
77  this->mesh().template getObjectPtr<volVectorField>(resultName);
78 
79  if (store)
80  {
81  if (!resultPtr)
82  {
83  const volVectorField& Uc = this->mesh().template
84  lookupObject<volVectorField>(UName_);
85 
86  resultPtr = new volVectorField
87  (
88  resultName,
89  fvc::ddt(Uc) + (Uc & fvc::grad(Uc))
90  );
91 
92  resultPtr->store();
93  }
94  const volVectorField& DUcDt = *resultPtr;
95 
96  DUcDtInterpPtr_.reset
97  (
99  (
100  this->owner().solution().interpolationSchemes(),
101  DUcDt
102  ).ptr()
103  );
104  }
105  else
106  {
107  DUcDtInterpPtr_.clear();
108 
109  if (resultPtr)
110  {
111  resultPtr->checkOut();
112  }
113  }
114 }
115 
116 
117 template<class CloudType>
119 (
120  const typename CloudType::parcelType& p,
121  const typename CloudType::parcelType::trackingData& td,
122  const scalar dt,
123  const scalar mass,
124  const scalar Re,
125  const scalar muc
126 ) const
127 {
128  forceSuSp value(Zero);
129 
130  vector DUcDt =
131  DUcDtInterp().interpolate(p.coordinates(), p.currentTetIndices());
132 
133  value.Su() = mass*td.rhoc()/p.rho()*DUcDt;
135  return value;
136 }
137 
138 
139 template<class CloudType>
141 (
142  const typename CloudType::parcelType&,
143  const typename CloudType::parcelType::trackingData& td,
144  const scalar
145 ) const
146 {
147  return 0.0;
148 }
149 
150 
151 // ************************************************************************* //
dictionary dict
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.
A list of keyword definitions, which are a keyword followed by a number of values (eg...
Definition: dictionary.H:129
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.
Abstract base class for particle forces.
Definition: ParticleForce.H:54
tmp< GeometricField< Type, faPatchField, areaMesh > > ddt(const dimensioned< Type > dt, const faMesh &mesh)
Definition: facDdt.C:40
GeometricField< vector, fvPatchField, volMesh > volVectorField
Definition: volFieldsFwd.H:82
Helper container for force Su and Sp terms.
Definition: forceSuSp.H:60
Calculate the first temporal derivative.
dynamicFvMesh & mesh
Calculates particle pressure gradient force.
virtual void cacheFields(const bool store)
Cache fields.
Calculate the gradient of the given field.
void clear()
Clear the list, i.e. set size to zero.
Definition: ListI.H:137
A class for handling words, derived from Foam::string.
Definition: word.H:63
virtual ~PressureGradientForce()
Destructor.
Vector< scalar > vector
Definition: vector.H:57
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
virtual scalar massAdd(const typename CloudType::parcelType &p, const typename CloudType::parcelType::trackingData &td, const scalar mass) const
Return the added mass.
Mesh data needed to do the Finite Volume discretisation.
Definition: fvMesh.H:78
volScalarField & p
Templated base class for dsmc cloud.
Definition: DSMCCloud.H:67
PressureGradientForce(CloudType &owner, const fvMesh &mesh, const dictionary &dict, const word &forceType=typeName)
Construct from mesh.
tmp< GeometricField< typename outerProduct< vector, Type >::type, faPatchField, areaMesh >> grad(const GeometricField< Type, faePatchField, edgeMesh > &ssf)
Definition: facGrad.C:51
static constexpr const zero Zero
Global zero (0)
Definition: zero.H:127