Loading...
Searching...
No Matches
displacementMethodelasticityMotionSolver.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) 2007-2023 PCOpt/NTUA
9 Copyright (C) 2013-2023 FOSS GP
10 Copyright (C) 2019-2020 OpenCFD Ltd.
11-------------------------------------------------------------------------------
12License
13 This file is part of OpenFOAM.
14
15 OpenFOAM is free software: you can redistribute it and/or modify it
16 under the terms of the GNU General Public License as published by
17 the Free Software Foundation, either version 3 of the License, or
18 (at your option) any later version.
19
20 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
21 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
22 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
23 for more details.
24
25 You should have received a copy of the GNU General Public License
26 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
27
28\*---------------------------------------------------------------------------*/
29
33
34// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
36namespace Foam
37{
38
39// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
40
43(
44 displacementMethod,
45 displacementMethodelasticityMotionSolver,
47);
48
49// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
50
51displacementMethodelasticityMotionSolver::
52displacementMethodelasticityMotionSolver
53(
54 fvMesh& mesh,
55 const labelList& patchIDs
56)
57:
58 displacementMethod(mesh, patchIDs),
61 /*
62 // Getting a reference from the database is dangerous since multiple
63 // fields with the same name might be registered
64 pointMotionU_
65 (
66 const_cast<pointVectorField&>
67 (
68 mesh_.lookupObject<pointVectorField>("pointMotionU")
69 )
70 ),
71 cellMotionU_
72 (
73 const_cast<volVectorField&>
74 (
75 mesh_.lookupObject<volVectorField>("cellMotionU")
76 )
77 )
78 */
80 (
81 IOdictionary::readContents
82 (
84 (
85 "dynamicMeshDict",
86 mesh.time().constant(),
87 mesh,
88 IOobject::MUST_READ
89 )
90 ).subDict("elasticityMotionSolverCoeffs").getOrDefault<bool>
91 (
92 "resetFields",
93 true
94 )
95 )
96{}
97
98
99// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
102{
103 return false;
104}
105
106
108(
109 const pointVectorField& pointMovement
110)
111{
112 if (resetFields_)
113 {
117 }
118
119 maxDisplacement_ = SMALL;
120
121 // Update the boundary conditions of the pointField in order to make sure
122 // that the boundary will move according to the initial BCs without the
123 // interference of the volPointInterpolation in the elasticityMotionSolver
124 for (const label patchI : patchIDs_)
125 {
126 // Set boundary field. Needed for the motionSolver class
128 pointMovement.boundaryField()[patchI].patchInternalField()();
129
130 // Set boundary field values as seen from the internalField!
131 // Needed for determining the max displacement
132 pointMotionU_.boundaryFieldRef()[patchI].setInInternalField
133 (
135 pointMovement.boundaryField()[patchI].patchInternalField()()
136 );
137
138 // Find max value
140 max
141 (
143 gMax
144 (
145 mag
146 (
148 patchInternalField()
149 )
150 )
151 );
152 }
153
154 // Update the volField boundary conditions,
155 // used for the elasticity PDEs solution
156 const pointField& points = mesh_.points();
157 for (label patchI : patchIDs_)
158 {
159 const polyPatch& patch = mesh_.boundaryMesh()[patchI];
160 fvPatchVectorField& bField = cellMotionU_.boundaryFieldRef()[patchI];
161 forAll(patch, fI)
163 bField[fI] = patch[fI].average(points, pointMovement);
164 }
165 }
166}
167
168
170(
171 const volVectorField& cellMovement
172)
173{
174 auto& cellMotionUbf = cellMotionU_.boundaryFieldRef();
175
176 // Set boundary mesh movement and calculate
177 // max current boundary displacement
178 for (const label patchI : patchIDs_)
179 {
180 cellMotionUbf[patchI] == cellMovement.boundaryField()[patchI];
181
182 // Find max value
184 max
185 (
187 gMax(mag(cellMotionUbf[patchI]))
188 );
189 }
190}
191
192
194(
195 const vectorField& controlField
196)
197{
199}
200
201
203(
204 const scalarField& controlField
205)
206{
208}
209
210
211// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
212
213} // End namespace Foam
214
215// ************************************************************************* //
Macros for easy insertion into run-time selection tables.
#define addToRunTimeSelectionTable(baseType, thisType, argNames)
Add to construction table with typeName as the key.
labelList patchIDs
Internal::FieldType & primitiveFieldRef(const bool updateAccessTime=true)
Return a reference to the internal field values.
Boundary & boundaryFieldRef(const bool updateAccessTime=true)
Return a reference to the boundary field.
void correctBoundaryConditions()
Correct boundary field.
const Boundary & boundaryField() const noexcept
Return const-reference to the boundary field.
IOdictionary is derived from dictionary and IOobject to give the dictionary automatic IO functionalit...
Defines the attributes of an object for which implicit objectRegistry management is supported,...
Definition IOobject.H:191
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition dictionary.H:133
Abstract base class for displacement methods, which are a set or wrapper classes allowing to change t...
autoPtr< motionSolver > motionPtr_
labelList patchIDs_
IDs of the patches to be moved.
Wrapper class for the elasticityMotionSolver motion solver.
virtual bool preferPointField() const
Whether the motion solver prefers a point of a vol field as input.
void setMotionField(const pointVectorField &pointMovement)
Set motion filed related to model based on given motion.
void setControlField(const vectorField &controlField)
Set control field as a vectorField. For methods working with parameters (RBF etc).
Mesh deformation based on the linear elasticity equations. The boundary displacement is set as a boun...
Mesh data needed to do the Finite Volume discretisation.
Definition fvMesh.H:85
A patch is a list of labels that address the faces in the global face list.
Definition polyPatch.H:73
#define defineTypeNameAndDebug(Type, DebugSwitch)
Define the typeName and debug information.
Definition className.H:142
dynamicFvMesh & mesh
#define NotImplemented
Issue a FatalErrorIn for a function not currently implemented.
Definition error.H:688
const pointField & points
Different types of constants.
const std::string patch
OpenFOAM patch number as a std::string.
Namespace for OpenFOAM.
Type & refCast(U &obj)
A dynamic_cast (for references) to Type reference.
Definition typeInfo.H:172
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
Definition hashSets.C:40
GeometricField< vector, fvPatchField, volMesh > volVectorField
List< label > labelList
A List of labels.
Definition List.H:62
GeometricField< vector, pointPatchField, pointMesh > pointVectorField
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
Field< vector > vectorField
Specialisation of Field<T> for vector.
static constexpr const zero Zero
Global zero (0).
Definition zero.H:127
vectorField pointField
pointField is a vectorField.
Type gMax(const FieldField< Field, Type > &f)
fvPatchField< vector > fvPatchVectorField
#define forAll(list, i)
Loop across all elements in list.
Definition stdFoam.H:299