OOFEM 3.0
Loading...
Searching...
No Matches
hexa21stokes.C
Go to the documentation of this file.
1/*
2 *
3 * ##### ##### ###### ###### ### ###
4 * ## ## ## ## ## ## ## ### ##
5 * ## ## ## ## #### #### ## # ##
6 * ## ## ## ## ## ## ## ##
7 * ## ## ## ## ## ## ## ##
8 * ##### ##### ## ###### ## ##
9 *
10 *
11 * OOFEM : Object Oriented Finite Element Code
12 *
13 * Copyright (C) 1993 - 2025 Borek Patzak
14 *
15 *
16 *
17 * Czech Technical University, Faculty of Civil Engineering,
18 * Department of Structural Mechanics, 166 29 Prague, Czech Republic
19 *
20 * This library is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU Lesser General Public
22 * License as published by the Free Software Foundation; either
23 * version 2.1 of the License, or (at your option) any later version.
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28 * Lesser General Public License for more details.
29 *
30 * You should have received a copy of the GNU Lesser General Public
31 * License along with this library; if not, write to the Free Software
32 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
33 */
34
35#include "hexa21stokes.h"
36#include "node.h"
37#include "dof.h"
38#include "domain.h"
40#include "gausspoint.h"
41#include "bcgeomtype.h"
43#include "load.h"
44#include "bodyload.h"
45#include "boundaryload.h"
46#include "mathfem.h"
48#include "fei3dhexalin.h"
49#include "fei3dhexatriquad.h"
50#include "fluidcrosssection.h"
51#include "assemblercallback.h"
52#include "classfactory.h"
53
54namespace oofem {
56
57// Set up interpolation coordinates
58FEI3dHexaLin Hexa21Stokes :: interpolation_lin;
59FEI3dHexaTriQuad Hexa21Stokes :: interpolation_quad;
60// Set up ordering vectors (for assembling)
61IntArray Hexa21Stokes :: momentum_ordering = {
62 1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17, 18, 19, 21, 22, 23, 25, 26, 27, 29, 30, 31, 33, 34, 35,
63 37, 38, 39, 41, 42, 43, 45, 46, 47, 49, 50, 51, 53, 54, 55, 57, 58, 59, 61, 62, 63, 65, 66, 67, 69, 70, 71,
64 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89, 90, 91, 93, 94, 95, 97, 98, 99, 101, 102, 103, 105, 106, 107};
65IntArray Hexa21Stokes :: conservation_ordering = {4, 8, 12, 16, 20, 24, 28, 32};
66IntArray Hexa21Stokes :: surf_ordering [ 6 ] = {
67 { 5, 6, 7, 1, 2, 3, 13, 14, 15, 9, 10, 11, 33, 34, 35, 42, 43, 44, 39, 40, 41, 36, 37, 38, 69, 70, 71},
68 {17, 18, 19, 21, 22, 23, 25, 26, 27, 29, 30, 31, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 72, 73, 74},
69 { 1, 2, 3, 17, 18, 19, 21, 22, 23, 5, 6, 7, 57, 58, 59, 45, 46, 47, 60, 61, 62, 33, 34, 35, 75, 76, 77},
70 { 5, 6, 7, 9, 10, 11, 25, 26, 27, 21, 22, 23, 36, 37, 38, 63, 64, 65, 48, 49, 50, 60, 61, 62, 78, 79, 80},
71 { 9, 10, 11, 13, 14, 15, 29, 30, 31, 25, 26, 27, 39, 40, 41, 66, 67, 68, 51, 52, 53, 63, 64, 65, 81, 82, 83},
72 {13, 14, 15, 1, 2, 3, 17, 18, 19, 29, 30, 31, 42, 43, 44, 57, 58, 59, 54, 55, 56, 66, 67, 68, 84, 85, 86}
73};
74
75Hexa21Stokes :: Hexa21Stokes(int n, Domain *aDomain) : FMElement(n, aDomain), SpatialLocalizerInterface(this)
76{
77 this->numberOfDofMans = 27;
78 this->numberOfGaussPoints = 27;
79}
80
81void Hexa21Stokes :: computeGaussPoints()
82{
83 if ( integrationRulesArray.size() == 0 ) {
84 integrationRulesArray.resize(1);
85 integrationRulesArray [ 0 ] = std::make_unique<GaussIntegrationRule>(1, this, 1, 3);
86 this->giveCrossSection()->setupIntegrationPoints(* integrationRulesArray [ 0 ], numberOfGaussPoints, this);
87 }
88}
89
90int Hexa21Stokes :: computeNumberOfDofs()
91{
92 return 89;
93}
94
95void Hexa21Stokes :: giveDofManDofIDMask(int inode, IntArray &answer) const
96{
97 if ( inode <= 8 ) {
98 answer = {V_u, V_v, V_w, P_f};
99 } else {
100 answer = {V_u, V_v, V_w};
101 }
102}
103
104void Hexa21Stokes :: giveCharacteristicVector(FloatArray &answer, CharType mtrx, ValueModeType mode,
105 TimeStep *tStep)
106{
107 // Compute characteristic vector for this element. I.e the load vector(s)
108 if ( mtrx == ExternalForcesVector ) {
109 this->computeExternalForcesVector(answer, tStep);
110 } else if ( mtrx == InternalForcesVector ) {
111 this->computeInternalForcesVector(answer, tStep);
112 } else {
113 OOFEM_ERROR("Unknown Type of characteristic mtrx.");
114 }
115}
116
117void Hexa21Stokes :: giveCharacteristicMatrix(FloatMatrix &answer,
118 CharType mtrx, TimeStep *tStep)
119{
120 // Compute characteristic matrix for this element. The only option is the stiffness matrix...
121 if ( mtrx == TangentStiffnessMatrix ) {
122 this->computeStiffnessMatrix(answer, TangentStiffness, tStep);
123 } else {
124 OOFEM_ERROR("Unknown Type of characteristic mtrx.");
125 }
126}
127
128void Hexa21Stokes :: computeInternalForcesVector(FloatArray &answer, TimeStep *tStep)
129{
130 FluidDynamicMaterial *mat = static_cast< FluidCrossSection * >( this->giveCrossSection() )->giveFluidMaterial();
131 FloatArray a_pressure, a_velocity, devStress, epsp, Nh, dN_V(81);
132 FloatMatrix dN, B(6, 81);
133 double r_vol, pressure;
134 this->computeVectorOfVelocities(VM_Total, tStep, a_velocity);
135 this->computeVectorOfPressures(VM_Total, tStep, a_pressure);
136 FloatArray momentum, conservation;
137
138 B.zero();
139 for ( auto &gp: *integrationRulesArray [ 0 ] ) {
140 const FloatArray &lcoords = gp->giveNaturalCoordinates();
141
142 double detJ = fabs( this->interpolation_quad.evaldNdx( dN, lcoords, FEIElementGeometryWrapper(this) ) );
143 this->interpolation_lin.evalN( Nh, lcoords, FEIElementGeometryWrapper(this) );
144 double dV = detJ * gp->giveWeight();
145
146 for ( int j = 0, k = 0; j < dN.giveNumberOfRows(); j++, k += 3 ) {
147 dN_V(k + 0) = B(0, k + 0) = B(5, k + 1) = B(4, k + 2) = dN(j, 0);
148 dN_V(k + 1) = B(1, k + 1) = B(5, k + 0) = B(3, k + 2) = dN(j, 1);
149 dN_V(k + 2) = B(2, k + 2) = B(4, k + 0) = B(3, k + 1) = dN(j, 2);
150 }
151
152 epsp.beProductOf(B, a_velocity);
153 pressure = Nh.dotProduct(a_pressure);
154 auto val = mat->computeDeviatoricStress3D(epsp, pressure, gp, tStep);
155 devStress = val.first;
156 r_vol = val.second;
157
158 momentum.plusProduct(B, devStress, dV);
159 momentum.add(-pressure * dV, dN_V);
160 conservation.add(r_vol * dV, Nh);
161 }
162
163 answer.resize(89);
164 answer.zero();
165 answer.assemble(momentum, this->momentum_ordering);
166 answer.assemble(conservation, this->conservation_ordering);
167}
168
169void Hexa21Stokes :: computeExternalForcesVector(FloatArray &answer, TimeStep *tStep)
170{
171 FloatArray vec;
172
173 int nLoads = this->boundaryLoadArray.giveSize() / 2;
174 answer.clear();
175
176 for ( int i = 1; i <= nLoads; i++ ) { // For each Neumann boundary condition
177 int load_number = this->boundaryLoadArray.at(2 * i - 1);
178 int load_id = this->boundaryLoadArray.at(2 * i);
179 Load *load = this->domain->giveLoad(load_number);
180
181 if ( load->giveBCGeoType() == SurfaceLoadBGT ) {
182 this->computeBoundarySurfaceLoadVector(vec, static_cast< BoundaryLoad * >(load), load_id, ExternalForcesVector, VM_Total, tStep);
183 answer.add(vec);
184 }
185 }
186
187 nLoads = this->giveBodyLoadArray()->giveSize();
188 for ( int i = 1; i <= nLoads; i++ ) {
189 BodyLoad *load;
190 if ((load = dynamic_cast<BodyLoad*>(domain->giveLoad( bodyLoadArray.at(i))))) {
191 if ( load->giveBCGeoType() == BodyLoadBGT && load->giveBCValType() == ForceLoadBVT ) {
192 this->computeLoadVector(vec, load, ExternalForcesVector, VM_Total, tStep);
193 answer.add(vec);
194 }
195 }
196 }
197}
198
199void Hexa21Stokes :: computeLoadVector(FloatArray &answer, BodyLoad *load, CharType type, ValueModeType mode, TimeStep *tStep)
200{
201 if ( type != ExternalForcesVector ) {
202 answer.clear();
203 return;
204 }
205
206 FloatArray N, gVector, temparray(81);
207
208 load->computeComponentArrayAt(gVector, tStep, VM_Total);
209 temparray.zero();
210 if ( gVector.giveSize() ) {
211 for ( auto &gp: *integrationRulesArray [ 0 ] ) {
212 const FloatArray &lcoords = gp->giveNaturalCoordinates();
213
214 double rho = static_cast< FluidCrossSection * >( this->giveCrossSection() )->giveDensity(gp);
215 double detJ = fabs( this->interpolation_quad.giveTransformationJacobian( lcoords, FEIElementGeometryWrapper(this) ) );
216 double dA = detJ * gp->giveWeight();
217
218 this->interpolation_quad.evalN( N, lcoords, FEIElementGeometryWrapper(this) );
219 for ( int j = 0; j < N.giveSize(); j++ ) {
220 temparray(3 * j + 0) += N(j) * rho * gVector(0) * dA;
221 temparray(3 * j + 1) += N(j) * rho * gVector(1) * dA;
222 temparray(3 * j + 2) += N(j) * rho * gVector(2) * dA;
223 }
224 }
225 }
226
227 answer.resize(89);
228 answer.zero();
229 answer.assemble(temparray, this->momentum_ordering);
230}
231
232 void Hexa21Stokes :: computeBoundarySurfaceLoadVector(FloatArray &answer, BoundaryLoad *load, int iSurf, CharType type, ValueModeType mode, TimeStep *tStep, bool global)
233{
234 if ( type != ExternalForcesVector ) {
235 answer.clear();
236 return;
237 }
238
239 if ( load->giveType() == TransmissionBC ) { // Neumann boundary conditions (traction)
240
241 int numberOfSurfaceIPs = ( int ) ceil( ( load->giveApproxOrder() + 1. ) / 2. ) * 2;
242
243 GaussIntegrationRule iRule(1, this, 1, 1);
244 FloatArray N, t, f(27);
245
246 f.zero();
247 iRule.SetUpPointsOnTriangle(numberOfSurfaceIPs, _Unknown);
248
249 for ( auto &gp: iRule ) {
250 const FloatArray &lcoords = gp->giveNaturalCoordinates();
251
252 this->interpolation_quad.surfaceEvalN( N, iSurf, lcoords, FEIElementGeometryWrapper(this) );
253 double dA = gp->giveWeight() * this->interpolation_quad.surfaceGiveTransformationJacobian( iSurf, lcoords, FEIElementGeometryWrapper(this) );
254
255 if ( load->giveFormulationType() == Load :: FT_Entity ) { // load in xi-eta system
256 load->computeValueAt(t, tStep, lcoords, VM_Total);
257 } else { // Edge load in x-y system
258 FloatArray gcoords;
259 this->interpolation_quad.surfaceLocal2global( gcoords, iSurf, lcoords, FEIElementGeometryWrapper(this) );
260 load->computeValueAt(t, tStep, gcoords, VM_Total);
261 }
262
263 // Reshape the vector
264 for ( int j = 0; j < N.giveSize(); j++ ) {
265 f(3 * j + 0) += N(j) * t(0) * dA;
266 f(3 * j + 1) += N(j) * t(1) * dA;
267 f(3 * j + 2) += N(j) * t(2) * dA;
268 }
269 }
270
271 answer.resize(89);
272 answer.zero();
273 answer.assemble(f, this->surf_ordering [ iSurf - 1 ]);
274 } else {
275 OOFEM_ERROR("Strange boundary condition type");
276 }
277}
278
279void Hexa21Stokes :: computeStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, TimeStep *tStep)
280{
281 FluidDynamicMaterial *mat = static_cast< FluidCrossSection * >( this->giveCrossSection() )->giveFluidMaterial();
283 FloatMatrixF<81,8> G, Dp;
286
287 for ( auto &gp: *integrationRulesArray [ 0 ] ) {
288 const auto &lcoords = gp->giveNaturalCoordinates();
289
290 auto Nlin = this->interpolation_lin.evalN( lcoords );
291 auto detj_dn = this->interpolation_quad.evaldNdx( lcoords, FEIElementGeometryWrapper(this) );
292 auto dN = detj_dn.second;
293 auto detJ = detj_dn.first;
294 auto dA = std::abs(detJ) * gp->giveWeight();
295
296 auto dN_V = flatten(dN);
297 auto B = Bmatrix_3d(dN);
298
299 // Computing the internal forces should have been done first.
300 // dsigma_dev/deps_dev dsigma_dev/dp deps_vol/deps_dev deps_vol/dp
301 //auto [Ed, Ep, Cd, Cp] = mat->computeTangents2D(mode, gp, tStep);
302 auto tangents = mat->computeTangents3D(mode, gp, tStep);
303
304 K.plusProductSymmUpper(B, dot(tangents.dsdd, B), dA);
305 G.plusDyadUnsym(dN_V, Nlin, -dA);
306 Dp.plusDyadUnsym(Tdot(B, tangents.dsdp), Nlin, dA);
307 DvT.plusDyadUnsym(Nlin, Tdot(B, tangents.dedd), dA);
308 C.plusDyadSymmUpper(Nlin, tangents.dedp * dA);
309 }
310
311 K.symmetrized();
312 C.symmetrized();
313 auto GTDvT = transpose(G) + DvT;
314 auto GDp = G + Dp;
315
316 answer.resize(89, 89);
317 answer.zero();
318 answer.assemble(K, this->momentum_ordering);
319 answer.assemble(GDp, this->momentum_ordering, this->conservation_ordering);
320 answer.assemble(GTDvT, this->conservation_ordering, this->momentum_ordering);
321 answer.assemble(C, this->conservation_ordering);
322}
323
324FEInterpolation *Hexa21Stokes :: giveInterpolation() const
325{
326 return & interpolation_quad;
327}
328
329FEInterpolation *Hexa21Stokes :: giveInterpolation(DofIDItem id) const
330{
331 if ( id == P_f ) {
332 return & interpolation_lin;
333 } else {
334 return & interpolation_quad;
335 }
336}
337
338void Hexa21Stokes :: updateYourself(TimeStep *tStep)
339{
340 Element :: updateYourself(tStep);
341}
342
343// Some extension Interfaces to follow:
344
345Interface *Hexa21Stokes :: giveInterface(InterfaceType it)
346{
347 switch ( it ) {
349 return static_cast< NodalAveragingRecoveryModelInterface * >(this);
350
352 return static_cast< SpatialLocalizerInterface * >(this);
353
354 default:
355 return FMElement :: giveInterface(it);
356 }
357}
358
359
360void Hexa21Stokes :: computeField(ValueModeType mode, TimeStep *tStep, const FloatArray &lcoords, FloatArray &answer)
361{
362 FloatArray n, n_lin, pressures, velocities;
363 this->interpolation_quad.evalN( n, lcoords, FEIElementGeometryWrapper(this) );
364 this->interpolation_lin.evalN( n_lin, lcoords, FEIElementGeometryWrapper(this) );
365 this->computeVectorOf({P_f}, mode, tStep, pressures);
366 this->computeVectorOf({V_u, V_v, V_w}, mode, tStep, velocities);
367
368 answer.resize(4);
369 answer.zero();
370 for ( int i = 1; i <= n.giveSize(); i++ ) {
371 answer(0) += n.at(i) * velocities.at(i*3-2);
372 answer(1) += n.at(i) * velocities.at(i*3-1);
373 answer(2) += n.at(i) * velocities.at(i*3);
374 }
375
376 for ( int i = 1; i <= n_lin.giveSize(); i++ ) {
377 answer(3) += n_lin.at(i) * pressures.at(i);
378 }
379}
380
381
382void Hexa21Stokes :: NodalAveragingRecoveryMI_computeNodalValue(FloatArray &answer, int node, InternalStateType type, TimeStep *tStep)
383{
384 answer.resize(1);
385 if ( type == IST_Pressure ) {
386 answer.resize(1);
387 if ( node <= 8 ) { // Corner nodes
388 answer.at(1) = this->giveNode(node)->giveDofWithID(P_f)->giveUnknown(VM_Total, tStep);
389 } else if ( node <= 20 ) { // Edge nodes
390 // Edges are numbered consistently with edge nodes, so node number - 8 = edge number
391 const auto &eNodes = this->interpolation_quad.computeLocalEdgeMapping(node - 8);
392 answer.at(1) = 0.5 * (
393 this->giveNode( eNodes.at(1) )->giveDofWithID(P_f)->giveUnknown(VM_Total, tStep) +
394 this->giveNode( eNodes.at(2) )->giveDofWithID(P_f)->giveUnknown(VM_Total, tStep) );
395 } else if ( node <= 26 ) { // Face nodes
396 // Faces are numbered consistently with edge nodes, so node number - 12 = face number
397 const auto &fNodes = this->interpolation_quad.computeLocalSurfaceMapping(node - 20);
398 answer.at(1) = 0.25 * (
399 this->giveNode( fNodes.at(1) )->giveDofWithID(P_f)->giveUnknown(VM_Total, tStep) +
400 this->giveNode( fNodes.at(2) )->giveDofWithID(P_f)->giveUnknown(VM_Total, tStep) +
401 this->giveNode( fNodes.at(3) )->giveDofWithID(P_f)->giveUnknown(VM_Total, tStep) +
402 this->giveNode( fNodes.at(4) )->giveDofWithID(P_f)->giveUnknown(VM_Total, tStep) );
403 } else { // Middle node
404 answer.at(1) = 0.125 * (
405 this->giveNode(1)->giveDofWithID(P_f)->giveUnknown(VM_Total, tStep) +
406 this->giveNode(2)->giveDofWithID(P_f)->giveUnknown(VM_Total, tStep) +
407 this->giveNode(3)->giveDofWithID(P_f)->giveUnknown(VM_Total, tStep) +
408 this->giveNode(4)->giveDofWithID(P_f)->giveUnknown(VM_Total, tStep) +
409 this->giveNode(5)->giveDofWithID(P_f)->giveUnknown(VM_Total, tStep) +
410 this->giveNode(6)->giveDofWithID(P_f)->giveUnknown(VM_Total, tStep) +
411 this->giveNode(7)->giveDofWithID(P_f)->giveUnknown(VM_Total, tStep) +
412 this->giveNode(8)->giveDofWithID(P_f)->giveUnknown(VM_Total, tStep) );
413 }
414 } else {
415 answer.clear();
416 }
417}
418} // end namespace oofem
#define N(a, b)
#define REGISTER_Element(class)
bcGeomType giveBCGeoType() const override
Definition bodyload.h:63
bcType giveType() const override
void computeValueAt(FloatArray &answer, TimeStep *tStep, const FloatArray &coords, ValueModeType mode) override
int giveApproxOrder() override=0
Node * giveNode(int i) const
Definition element.h:629
IntArray boundaryLoadArray
Definition element.h:147
IntArray * giveBodyLoadArray()
Returns array containing load numbers of loads acting on element.
Definition element.C:411
int numberOfDofMans
Number of dofmanagers.
Definition element.h:136
void computeVectorOf(ValueModeType u, TimeStep *tStep, FloatArray &answer)
Definition element.C:103
std::vector< std ::unique_ptr< IntegrationRule > > integrationRulesArray
Definition element.h:157
int numberOfGaussPoints
Definition element.h:175
CrossSection * giveCrossSection()
Definition element.C:534
IntArray bodyLoadArray
Definition element.h:147
Domain * domain
Link to domain object, useful for communicating with other FEM components.
Definition femcmpnn.h:79
void computeVectorOfPressures(ValueModeType mode, TimeStep *tStep, FloatArray &pressures)
Definition fmelement.C:51
void computeVectorOfVelocities(ValueModeType mode, TimeStep *tStep, FloatArray &velocities)
Definition fmelement.C:44
FMElement(int n, Domain *aDomain)
Definition fmelement.C:38
void assemble(const FloatArray &fe, const IntArray &loc)
Definition floatarray.C:616
void resize(Index s)
Definition floatarray.C:94
double & at(Index i)
Definition floatarray.h:202
void plusProduct(const FloatMatrix &b, const FloatArray &s, double dV)
Definition floatarray.C:288
double dotProduct(const FloatArray &x) const
Definition floatarray.C:524
Index giveSize() const
Returns the size of receiver.
Definition floatarray.h:261
void zero()
Zeroes all coefficients of receiver.
Definition floatarray.C:683
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Definition floatarray.C:689
void add(const FloatArray &src)
Definition floatarray.C:218
void resize(Index rows, Index cols)
Definition floatmatrix.C:79
void zero()
Zeroes all coefficient of receiver.
int giveNumberOfRows() const
Returns number of rows of receiver.
void assemble(const FloatMatrix &src, const IntArray &loc)
virtual Tangents< 6 > computeTangents3D(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const
virtual std::pair< FloatArrayF< 6 >, double > computeDeviatoricStress3D(const FloatArrayF< 6 > &eps, double pressure, GaussPoint *gp, TimeStep *tStep) const
int SetUpPointsOnTriangle(int nPoints, MaterialMode mode) override
virtual bcGeomType giveBCGeoType() const
static IntArray surf_ordering[6]
Ordering of dofs on surfaces. Used to assemble edge loads (only momentum balance).
void computeBoundarySurfaceLoadVector(FloatArray &answer, BoundaryLoad *load, int boundary, CharType type, ValueModeType mode, TimeStep *tStep, bool global=true) override
void computeInternalForcesVector(FloatArray &answer, TimeStep *tStep)
void computeExternalForcesVector(FloatArray &answer, TimeStep *tStep)
void computeLoadVector(FloatArray &answer, BodyLoad *load, CharType type, ValueModeType mode, TimeStep *tStep) override
static FEI3dHexaTriQuad interpolation_quad
Interpolation for geometry and velocity.
void computeStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, TimeStep *tStep)
static IntArray conservation_ordering
Ordering of conservation dofs in element. Used to assemble the element stiffness.
static FEI3dHexaLin interpolation_lin
Interpolation for pressure.
static IntArray momentum_ordering
Ordering of momentum balance dofs in element. Used to assemble the element stiffness.
virtual void computeComponentArrayAt(FloatArray &answer, TimeStep *tStep, ValueModeType mode)
Definition load.C:84
virtual FormulationType giveFormulationType()
Definition load.h:170
SpatialLocalizerInterface(Element *element)
#define OOFEM_ERROR(...)
Definition error.h:79
FloatMatrixF< M, N > transpose(const FloatMatrixF< N, M > &mat)
Constructs transposed matrix.
FloatMatrixF< N, P > Tdot(const FloatMatrixF< M, N > &a, const FloatMatrixF< M, P > &b)
Computes .
@ SurfaceLoadBGT
Distributed surface load.
Definition bcgeomtype.h:45
@ BodyLoadBGT
Distributed body load.
Definition bcgeomtype.h:43
FloatMatrixF< 6, N *3 > Bmatrix_3d(const FloatMatrixF< 3, N > &dN)
Constructs the B matrix for 3D momentum balance problems.
double dot(const FloatArray &x, const FloatArray &y)
@ ForceLoadBVT
Definition bcvaltype.h:43
@ SpatialLocalizerInterfaceType
@ NodalAveragingRecoveryModelInterfaceType
@ TransmissionBC
Neumann type (prescribed flux).
Definition bctype.h:43
FloatArrayF< N *M > flatten(const FloatMatrixF< N, M > &m)

This page is part of the OOFEM-3.0 documentation. Copyright Copyright (C) 1994-2025 Borek Patzak Bořek Patzák
Project e-mail: oofem@fsv.cvut.cz
Generated at for OOFEM by doxygen 1.15.0 written by Dimitri van Heesch, © 1997-2011