displacementComponentLaplacianFvMotionSolver.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-2016 OpenFOAM Foundation
9  Copyright (C) 2016-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 
30 #include "motionInterpolation.H"
31 #include "motionDiffusivity.H"
32 #include "fvmLaplacian.H"
34 #include "mapPolyMesh.H"
35 #include "fvOptions.H"
36 
37 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
38 
39 namespace Foam
40 {
41  defineTypeNameAndDebug(displacementComponentLaplacianFvMotionSolver, 0);
42 
44  (
45  motionSolver,
46  displacementComponentLaplacianFvMotionSolver,
47  dictionary
48  );
49 }
50 
51 
52 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
53 
54 Foam::displacementComponentLaplacianFvMotionSolver::
55 displacementComponentLaplacianFvMotionSolver
56 (
57  const polyMesh& mesh,
58  const IOdictionary& dict
59 )
60 :
63  cellDisplacement_
64  (
65  IOobject
66  (
67  "cellDisplacement" + cmptName_,
68  mesh.time().timeName(),
69  mesh,
70  IOobject::READ_IF_PRESENT,
71  IOobject::AUTO_WRITE
72  ),
73  fvMesh_,
74  dimensionedScalar(pointDisplacement_.dimensions(), Zero),
75  cellMotionBoundaryTypes<scalar>(pointDisplacement_.boundaryField())
76  ),
77  pointLocation_(nullptr),
78  interpolationPtr_
79  (
80  coeffDict().found("interpolation")
81  ? motionInterpolation::New(fvMesh_, coeffDict().lookup("interpolation"))
82  : motionInterpolation::New(fvMesh_)
83  ),
84  diffusivityPtr_
85  (
86  motionDiffusivity::New(fvMesh_, coeffDict().lookup("diffusivity"))
87  ),
88  frozenPointsZone_
89  (
90  coeffDict().found("frozenPointsZone")
91  ? fvMesh_.pointZones().findZoneID
92  (
93  coeffDict().get<word>("frozenPointsZone")
94  )
95  : -1
96  )
97 {
98  if (coeffDict().getOrDefault("applyPointLocation", true))
99  {
100  pointLocation_.reset
101  (
102  new pointVectorField
103  (
104  IOobject
105  (
106  "pointLocation",
107  fvMesh_.time().timeName(),
108  fvMesh_,
111  ),
113  )
114  );
115 
116  //if (debug)
117  {
118  Info<< "displacementComponentLaplacianFvMotionSolver :"
119  << " Read pointVectorField "
120  << pointLocation_().name()
121  << " to be used for boundary conditions on points."
122  << nl
123  << "Boundary conditions:"
124  << pointLocation_().boundaryField().types() << endl;
125  }
126  }
127 }
128 
129 
130 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
131 
134 {}
135 
136 
137 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
138 
141 {
142  interpolationPtr_->interpolate
143  (
144  cellDisplacement_,
145  pointDisplacement_
146  );
147 
148  // Evaluate the bcs so they are consistent with the internal field
149  // Might fight the multi-patch behaviour inside volPointInterpolate
150  if
151  (
152  pointDisplacement_.boundaryField().size()
153  != cellDisplacement_.boundaryField().size()
154  )
155  {
156  pointDisplacement_.correctBoundaryConditions();
157  }
158 
159 
160  if (pointLocation_)
161  {
162  if (debug)
163  {
164  Info<< "displacementComponentLaplacianFvMotionSolver : applying "
165  << " boundary conditions on " << pointLocation_().name()
166  << " to new point location."
167  << endl;
168  }
169 
170  // Apply pointLocation_ b.c. to mesh points.
171 
172  pointLocation_().primitiveFieldRef() = fvMesh_.points();
173 
174  pointLocation_().primitiveFieldRef().replace
175  (
176  cmpt_,
177  points0_ + pointDisplacement_.primitiveField()
178  );
179 
180  pointLocation_().correctBoundaryConditions();
181 
182  // Implement frozen points
183  if (frozenPointsZone_ != -1)
184  {
185  const pointZone& pz = fvMesh_.pointZones()[frozenPointsZone_];
186 
187  forAll(pz, i)
188  {
189  label pointi = pz[i];
190 
191  pointLocation_()[pointi][cmpt_] = points0_[pointi];
192  }
193  }
194 
195  twoDCorrectPoints(pointLocation_().primitiveFieldRef());
196 
197  return tmp<pointField>(pointLocation_().primitiveField());
198  }
199  else
200  {
201  auto tcurPoints = tmp<pointField>::New(fvMesh_.points());
202  auto& curPoints = tcurPoints.ref();
203 
204  curPoints.replace
205  (
206  cmpt_,
207  points0_ + pointDisplacement_.primitiveField()
208  );
209 
210  // Implement frozen points
211  if (frozenPointsZone_ != -1)
212  {
213  const pointZone& pz = fvMesh_.pointZones()[frozenPointsZone_];
214 
215  forAll(pz, i)
216  {
217  label pointi = pz[i];
218 
219  curPoints[pointi][cmpt_] = points0_[pointi];
220  }
221  }
222 
223  twoDCorrectPoints(curPoints);
224 
225  return tcurPoints;
226  }
227 }
228 
229 
231 {
232  // The points have moved so before interpolation update
233  // the motionSolver accordingly
234  movePoints(fvMesh_.points());
235 
236  diffusivityPtr_->correct();
237  pointDisplacement_.boundaryFieldRef().updateCoeffs();
238 
239  fv::options& fvOptions(fv::options::New(fvMesh_));
240 
241  // We explicitly do NOT want to interpolate the motion inbetween
242  // different regions so bypass all the matrix manipulation.
244  (
246  (
247  dimensionedScalar("viscosity", dimViscosity, 1.0)
248  *diffusivityPtr_->operator()(),
249  cellDisplacement_,
250  "laplacian(diffusivity,cellDisplacement)"
251  )
252  ==
253  fvOptions(cellDisplacement_)
254  );
255 
258  fvOptions.correct(cellDisplacement_);
259 }
260 
261 
263 (
264  const mapPolyMesh& mpm
265 )
266 {
268 
269  // Update diffusivity. Note two stage to make sure old one is de-registered
270  // before creating/registering new one.
271  diffusivityPtr_.reset(nullptr);
272  diffusivityPtr_ = motionDiffusivity::New
273  (
274  fvMesh_,
275  coeffDict().lookup("diffusivity")
276  );
277 }
278 
279 
280 // ************************************************************************* //
List< ReturnType > get(const UPtrList< T > &list, const AccessOp &aop)
List of values generated by applying the access operation to each list item.
void correct(GeometricField< Type, PatchField, GeoMesh > &field)
Apply correction to field.
dictionary dict
fvMatrix< scalar > fvScalarMatrix
Definition: fvMatricesFwd.H:37
type
Types of root.
Definition: Roots.H:52
virtual void updateMesh(const mapPolyMesh &)
Update local data for topology changes.
static FOAM_NO_DANGLING_REFERENCE const pointMesh & New(const polyMesh &mesh, Args &&... args)
Get existing or create MeshObject registered with typeName.
constexpr char nl
The newline &#39;\n&#39; character (0x0a)
Definition: Ostream.H:50
const dimensionSet dimViscosity
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:529
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.
Calculate the matrix for the laplacian of the field.
const fvMesh & fvMesh_
The fvMesh to be moved.
const dictionary & coeffDict() const
Const access to the coefficients dictionary.
Definition: motionSolver.H:173
const Time & time() const
Return the top-level database.
Definition: fvMesh.H:360
Lookup type of boundary radiation properties.
Definition: lookup.H:57
SolverPerformance< Type > solveSegregatedOrCoupled(const dictionary &)
Solve segregated or coupled returning the solution statistics.
Definition: fvMatrixSolve.C:55
Class containing mesh-to-mesh mapping information after a change in polyMesh topology.
Definition: mapPolyMesh.H:158
conserve primitiveFieldRef()+
Macros for easy insertion into run-time selection tables.
fv::options & fvOptions
IOdictionary is derived from dictionary and IOobject to give the dictionary automatic IO functionalit...
Definition: IOdictionary.H:50
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:286
Base class for fvMesh based motionSolvers.
word timeName
Definition: getTimeIndex.H:3
dynamicFvMesh & mesh
A class for handling words, derived from Foam::string.
Definition: word.H:63
static tmp< T > New(Args &&... args)
Construct tmp with forwarding arguments.
Definition: tmp.H:206
void constrain(fvMatrix< Type > &eqn)
Apply constraints to equation.
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
Abstract base class for cell-centre mesh motion diffusivity.
int debug
Static debugging option.
Base class for interpolation of cell displacement fields, generated by fvMotionSolvers, to the points. This base class implements the default method which applies volPointInterpolation only.
defineTypeNameAndDebug(combustionModel, 0)
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
tmp< fvMatrix< Type > > laplacian(const GeometricField< Type, fvPatchField, volMesh > &vf, const word &name)
Definition: fvmLaplacian.C:41
Automatically write from objectRegistry::writeObject()
messageStream Info
Information stream (stdout output on master, null elsewhere)
Mesh consisting of general polyhedral cells.
Definition: polyMesh.H:75
fvScalarMatrix TEqn(fvm::ddt(T)+fvm::div(phi, T) - fvm::laplacian(alphaEff, T)==radiation->ST(rhoCpRef, T)+fvOptions(T))
T getOrDefault(const word &keyword, const T &deflt, enum keyType::option matchOpt=keyType::REGEX) const
Find and return a T, or return the given default value. FatalIOError if it is found and the number of...
A class for managing temporary objects.
Definition: HashPtrTable.H:50
static autoPtr< motionDiffusivity > New(const fvMesh &mesh, Istream &mdData)
Select null constructed.
Virtual base class for displacement motion solver.
static options & New(const fvMesh &mesh)
Construct fvOptions and register to database if not present.
Definition: fvOptions.C:96
virtual tmp< pointField > curPoints() const
Return point location obtained from the current motion field.
Defines the attributes of an object for which implicit objectRegistry management is supported...
Definition: IOobject.H:180
bool found
Namespace for OpenFOAM.
addToRunTimeSelectionTable(functionObject, pointHistory, dictionary)
static constexpr const zero Zero
Global zero (0)
Definition: zero.H:127