Loading...
Searching...
No Matches
tractionDisplacementFvPatchVectorField.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-------------------------------------------------------------------------------
10License
11 This file is part of OpenFOAM.
12
13 OpenFOAM is free software: you can redistribute it and/or modify it
14 under the terms of the GNU General Public License as published by
15 the Free Software Foundation, either version 3 of the License, or
16 (at your option) any later version.
17
18 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
19 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25
26\*---------------------------------------------------------------------------*/
27
30#include "volFields.H"
31
32// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
33
34namespace Foam
35{
36
37// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
38
41(
42 const fvPatch& p,
44)
45:
46 fixedGradientFvPatchVectorField(p, iF),
47 traction_(p.size(), Zero),
48 pressure_(p.size(), Zero)
49{
50 extrapolateInternal();
51 gradient() = Zero;
52}
53
54
55tractionDisplacementFvPatchVectorField::
56tractionDisplacementFvPatchVectorField
57(
58 const tractionDisplacementFvPatchVectorField& tdpvf,
59 const fvPatch& p,
60 const DimensionedField<vector, volMesh>& iF,
61 const fvPatchFieldMapper& mapper
62)
63:
64 fixedGradientFvPatchVectorField(tdpvf, p, iF, mapper),
65 traction_(tdpvf.traction_, mapper),
66 pressure_(tdpvf.pressure_, mapper)
67{}
68
69
70tractionDisplacementFvPatchVectorField::
71tractionDisplacementFvPatchVectorField
72(
73 const fvPatch& p,
74 const DimensionedField<vector, volMesh>& iF,
75 const dictionary& dict
76)
77:
78 fixedGradientFvPatchVectorField(p, iF),
79 traction_("traction", dict, p.size()),
80 pressure_("pressure", dict, p.size())
81{
82 extrapolateInternal();
83 gradient() = Zero;
84}
85
86
87tractionDisplacementFvPatchVectorField::
88tractionDisplacementFvPatchVectorField
89(
90 const tractionDisplacementFvPatchVectorField& tdpvf
91)
92:
93 fixedGradientFvPatchVectorField(tdpvf),
94 traction_(tdpvf.traction_),
95 pressure_(tdpvf.pressure_)
96{}
97
98
99tractionDisplacementFvPatchVectorField::
100tractionDisplacementFvPatchVectorField
101(
102 const tractionDisplacementFvPatchVectorField& tdpvf,
103 const DimensionedField<vector, volMesh>& iF
104)
105:
106 fixedGradientFvPatchVectorField(tdpvf, iF),
107 traction_(tdpvf.traction_),
108 pressure_(tdpvf.pressure_)
109{}
110
111
112// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
113
114void tractionDisplacementFvPatchVectorField::autoMap
115(
116 const fvPatchFieldMapper& m
117)
118{
119 fixedGradientFvPatchVectorField::autoMap(m);
120 traction_.autoMap(m);
121 pressure_.autoMap(m);
122}
123
124
125void tractionDisplacementFvPatchVectorField::rmap
126(
127 const fvPatchVectorField& ptf,
128 const labelList& addr
129)
130{
131 fixedGradientFvPatchVectorField::rmap(ptf, addr);
132
133 const tractionDisplacementFvPatchVectorField& dmptf =
134 refCast<const tractionDisplacementFvPatchVectorField>(ptf);
135
136 traction_.rmap(dmptf.traction_, addr);
137 pressure_.rmap(dmptf.pressure_, addr);
138}
139
140
141void tractionDisplacementFvPatchVectorField::updateCoeffs()
142{
143 if (updated())
144 {
145 return;
146 }
147
148 const dictionary& mechanicalProperties =
149 db().lookupObject<IOdictionary>("mechanicalProperties");
150
151 const dictionary& thermalProperties =
152 db().lookupObject<IOdictionary>("thermalProperties");
153
154
155 const auto& rho = patch().lookupPatchField<volScalarField>("rho");
156 const auto& rhoE = patch().lookupPatchField<volScalarField>("E");
157 const auto& nu = patch().lookupPatchField<volScalarField>("nu");
158
160 scalarField mu(E/(2.0*(1.0 + nu)));
161 scalarField lambda(nu*E/((1.0 + nu)*(1.0 - 2.0*nu)));
162 scalarField threeK(E/(1.0 - 2.0*nu));
163
164 if (mechanicalProperties.get<bool>("planeStress"))
165 {
166 lambda = nu*E/((1.0 + nu)*(1.0 - nu));
167 threeK = E/(1.0 - nu);
168 }
169
170 scalarField twoMuLambda(2*mu + lambda);
171
172 vectorField n(patch().nf());
173
174 const auto& sigmaD = patch().lookupPatchField<volSymmTensorField>("sigmaD");
175
176 gradient() =
177 (
178 (traction_ - pressure_*n)/rho
179 + twoMuLambda*fvPatchField<vector>::snGrad() - (n & sigmaD)
180 )/twoMuLambda;
181
182 if (thermalProperties.get<bool>("thermalStress"))
183 {
184 const auto& threeKalpha =
185 patch().lookupPatchField<volScalarField>("threeKalpha");
186
187 const auto& T = patch().lookupPatchField<volScalarField>("T");
188
189 gradient() += n*threeKalpha*T/twoMuLambda;
190 }
191
192 fixedGradientFvPatchVectorField::updateCoeffs();
193}
194
195
196void tractionDisplacementFvPatchVectorField::write(Ostream& os) const
197{
198 fvPatchField<vector>::write(os);
199 traction_.writeEntry("traction", os);
200 pressure_.writeEntry("pressure", os);
201 fvPatchField<vector>::writeValueEntry(os);
202}
203
204
205// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
206
208(
209 fvPatchVectorField,
210 tractionDisplacementFvPatchVectorField
211);
212
213// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
214
215} // End namespace Foam
216
217// ************************************************************************* //
label n
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...
A finiteVolume patch using a polyPatch and a fvBoundaryMesh.
Definition fvPatch.H:71
tractionDisplacementFvPatchVectorField(const fvPatch &, const DimensionedField< vector, volMesh > &)
Construct from patch and internal field.
volScalarField & p
const volScalarField & T
OBJstream os(runTime.globalPath()/outputName)
#define makePatchTypeField(PatchTypeField, typePatchTypeField)
Define a concrete fvPatchField type and add to run-time tables Example, (fvPatchScalarField,...
const std::string patch
OpenFOAM patch number as a std::string.
Namespace for OpenFOAM.
GeometricField< scalar, fvPatchField, volMesh > volScalarField
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
Field< vector > vectorField
Specialisation of Field<T> for vector.
GeometricField< symmTensor, fvPatchField, volMesh > volSymmTensorField
static constexpr const zero Zero
Global zero (0).
Definition zero.H:127
volScalarField & rhoE
volScalarField & nu
dictionary dict
dimensionedScalar lambda("lambda", dimTime/sqr(dimLength), laminarTransport)