OOFEM 3.0
Loading...
Searching...
No Matches
ltrspaceboundary.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
37#include "node.h"
38#include "material.h"
39#include "gausspoint.h"
41#include "floatmatrix.h"
42#include "floatarray.h"
43#include "intarray.h"
44#include "mathfem.h"
45#include "fei3dtetlin.h"
46#include "classfactory.h"
48#include "parametermanager.h"
49#include "paramkey.h"
50
51
52namespace oofem {
54
56
57FEI3dTetLin LTRSpaceBoundary :: interpolation;
58
59LTRSpaceBoundary :: LTRSpaceBoundary(int n, Domain *aDomain) :
61{
64}
65
66void
67LTRSpaceBoundary :: initializeFrom(InputRecord &ir, int priority)
68{
69 Structural3DElement :: initializeFrom(ir, priority);
70 ParameterManager &ppm = this->giveDomain()->elementPPM;
72}
73
74void
75LTRSpaceBoundary :: postInitialize()
76{
77 Structural3DElement :: postInitialize();
78 ParameterManager &ppm = domain->elementPPM;
80}
81
83LTRSpaceBoundary :: giveInterface(InterfaceType interface)
84{
86 return static_cast< NodalAveragingRecoveryModelInterface * >( this );
87 } else if ( interface == SpatialLocalizerInterfaceType ) {
88 return static_cast< SpatialLocalizerInterface * >( this );
89 }
90
91 return NULL;
92}
93
94
96LTRSpaceBoundary :: giveInterpolation() const
97{
98 return & interpolation;
99}
100
101int
102LTRSpaceBoundary :: computeGlobalCoordinates(FloatArray &answer, const FloatArray &lcoords)
103{
104 FEInterpolation *fei = this->giveInterpolation();
105 FloatArray n;
106 FEIElementGeometryWrapper cellgeo(this);
107
108 fei->evalN(n, lcoords, cellgeo); //this interpolation doesn't use cell geometry to compute shape functions, so it's ok to have it here
109
110 answer.clear();
111 for ( int i = 1; i <= 4; i++ ) {
112 if ( location.at(i) != 0 ) { //recalculate vertex coordinates
113 IntArray switches;
114 FloatArray vertexCoords;
115 recalculateCoordinates(i, vertexCoords);
116
117 answer.add(n.at(i), vertexCoords);
118 } else {
119 answer.add(n.at(i), cellgeo.giveVertexCoordinates(i) );
120 }
121 }
122
123 return true;
124}
125
126void
127LTRSpaceBoundary :: giveDofManDofIDMask(int inode, IntArray &answer) const
128{
129 if ( inode == 5 ) {
130 answer = { E_xx, E_xy, E_xz, E_yx, E_yy, E_yz, E_zx, E_zy, E_zz };
131 } else {
132 answer = { D_u, D_v, D_w };
133 }
134}
135
136void
137LTRSpaceBoundary :: giveSwitches(IntArray &answer, int location) {
138 answer.resize(3);
139 int counter = 1;
140 for ( int x = -1; x < 2; x++ ) {
141 for ( int y = -1; y < 2; y++ ) {
142 for ( int z = -1; z < 2; z++ ) {
143 if ( !( z == 0 && y == 0 && x == 0 ) ) {
144 if ( counter == location ) {
145 answer(0) = x;
146 answer(1) = y;
147 answer(2) = z;
148 }
149 counter++;
150 }
151 }
152 }
153 }
154 return;
155}
156
157double
158LTRSpaceBoundary :: computeVolumeAround(GaussPoint *gp)
159{
160 double x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4, detJ, weight, volume;
161 FloatArray v1, v2, v3, v4;
162
167
168 x1 = v1.at(1);
169 x2 = v2.at(1);
170 x3 = v3.at(1);
171 x4 = v4.at(1);
172 y1 = v1.at(2);
173 y2 = v2.at(2);
174 y3 = v3.at(2);
175 y4 = v4.at(2);
176 z1 = v1.at(3);
177 z2 = v2.at(3);
178 z3 = v3.at(3);
179 z4 = v4.at(3);
180
181 detJ = ( ( x4 - x1 ) * ( y2 - y1 ) * ( z3 - z1 ) - ( x4 - x1 ) * ( y3 - y1 ) * ( z2 - z1 ) +
182 ( x3 - x1 ) * ( y4 - y1 ) * ( z2 - z1 ) - ( x2 - x1 ) * ( y4 - y1 ) * ( z3 - z1 ) +
183 ( x2 - x1 ) * ( y3 - y1 ) * ( z4 - z1 ) - ( x3 - x1 ) * ( y2 - y1 ) * ( z4 - z1 ) );
184
185 if ( detJ <= 0.0 ) {
186 OOFEM_ERROR("negative volume");
187 }
188
189 weight = gp->giveWeight();
190 volume = detJ * weight;
191
192 return volume;
193}
194
195void
196LTRSpaceBoundary :: computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int li, int ui)
197{
198 double x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4, detJ;
199 FloatArray v1, v2, v3, v4;
200 FloatMatrix dNdx;
201
206
207 x1 = v1.at(1);
208 x2 = v2.at(1);
209 x3 = v3.at(1);
210 x4 = v4.at(1);
211 y1 = v1.at(2);
212 y2 = v2.at(2);
213 y3 = v3.at(2);
214 y4 = v4.at(2);
215 z1 = v1.at(3);
216 z2 = v2.at(3);
217 z3 = v3.at(3);
218 z4 = v4.at(3);
219
220 detJ = ( ( x4 - x1 ) * ( y2 - y1 ) * ( z3 - z1 ) - ( x4 - x1 ) * ( y3 - y1 ) * ( z2 - z1 ) +
221 ( x3 - x1 ) * ( y4 - y1 ) * ( z2 - z1 ) - ( x2 - x1 ) * ( y4 - y1 ) * ( z3 - z1 ) +
222 ( x2 - x1 ) * ( y3 - y1 ) * ( z4 - z1 ) - ( x3 - x1 ) * ( y2 - y1 ) * ( z4 - z1 ) );
223
224 if ( detJ <= 0.0 ) {
225 OOFEM_ERROR("negative volume");
226 }
227
228 dNdx.resize(4, 3);
229 dNdx.at(1, 1) = -( ( y3 - y2 ) * ( z4 - z2 ) - ( y4 - y2 ) * ( z3 - z2 ) );
230 dNdx.at(2, 1) = ( y4 - y3 ) * ( z1 - z3 ) - ( y1 - y3 ) * ( z4 - z3 );
231 dNdx.at(3, 1) = -( ( y1 - y4 ) * ( z2 - z4 ) - ( y2 - y4 ) * ( z1 - z4 ) );
232 dNdx.at(4, 1) = ( y2 - y1 ) * ( z3 - z1 ) - ( y3 - y1 ) * ( z2 - z1 );
233
234 dNdx.at(1, 2) = -( ( x4 - x2 ) * ( z3 - z2 ) - ( x3 - x2 ) * ( z4 - z2 ) );
235 dNdx.at(2, 2) = ( x1 - x3 ) * ( z4 - z3 ) - ( x4 - x3 ) * ( z1 - z3 );
236 dNdx.at(3, 2) = -( ( x2 - x4 ) * ( z1 - z4 ) - ( x1 - x4 ) * ( z2 - z4 ) );
237 dNdx.at(4, 2) = ( x3 - x1 ) * ( z2 - z1 ) - ( x2 - x1 ) * ( z3 - z1 );
238
239 dNdx.at(1, 3) = -( ( x3 - x2 ) * ( y4 - y2 ) - ( x4 - x2 ) * ( y3 - y2 ) );
240 dNdx.at(2, 3) = ( x4 - x3 ) * ( y1 - y3 ) - ( x1 - x3 ) * ( y4 - y3 );
241 dNdx.at(3, 3) = -( ( x1 - x4 ) * ( y2 - y4 ) - ( x2 - x4 ) * ( y1 - y4 ) );
242 dNdx.at(4, 3) = ( x2 - x1 ) * ( y3 - y1 ) - ( x3 - x1 ) * ( y2 - y1 );
243 dNdx.times(1. / detJ);
244
245 answer.resize(6, dNdx.giveNumberOfRows() * 3);
246 answer.zero();
247
248 for ( int i = 1; i <= dNdx.giveNumberOfRows(); i++ ) {
249 answer.at(1, 3 * i - 2) = dNdx.at(i, 1);
250 answer.at(2, 3 * i - 1) = dNdx.at(i, 2);
251 answer.at(3, 3 * i - 0) = dNdx.at(i, 3);
252
253 answer.at(5, 3 * i - 2) = answer.at(4, 3 * i - 1) = dNdx.at(i, 3);
254 answer.at(6, 3 * i - 2) = answer.at(4, 3 * i - 0) = dNdx.at(i, 2);
255 answer.at(6, 3 * i - 1) = answer.at(5, 3 * i - 0) = dNdx.at(i, 1);
256 }
257}
258
259void
260LTRSpaceBoundary :: computeDeformationGradientVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
261{
262 FloatArray u;
263 this->computeVectorOf({ D_u, D_v, D_w }, VM_Total, tStep, u); // solution vector
264 if ( initialDisplacements ) {
266 }
267 u.resizeWithValues(12);
268
269 // Displacement gradient H = du/dX
270 FloatMatrix B;
271 this->computeBHmatrixAt(gp, B);
272 answer.beProductOf(B, u);
273
274 // Deformation gradient F = H + I
275 answer.at(1) += 1.0;
276 answer.at(2) += 1.0;
277 answer.at(3) += 1.0;
278}
279
280void
281LTRSpaceBoundary :: computeBHmatrixAt(GaussPoint *gp, FloatMatrix &answer)
282// Returns the [ 9 x (nno * 3) ] displacement gradient matrix {BH} of the receiver,
283// evaluated at gp.
284// BH matrix - 9 rows : du/dx, dv/dy, dw/dz, dv/dz, du/dz, du/dy, dw/dy, dw/dx, dv/dx
285{
286 double x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4, detJ;
287 FloatArray v1, v2, v3, v4;
288 FloatMatrix dNdx;
289
294
295 x1 = v1.at(1);
296 x2 = v2.at(1);
297 x3 = v3.at(1);
298 x4 = v4.at(1);
299 y1 = v1.at(2);
300 y2 = v2.at(2);
301 y3 = v3.at(2);
302 y4 = v4.at(2);
303 z1 = v1.at(3);
304 z2 = v2.at(3);
305 z3 = v3.at(3);
306 z4 = v4.at(3);
307
308 detJ = ( ( x4 - x1 ) * ( y2 - y1 ) * ( z3 - z1 ) - ( x4 - x1 ) * ( y3 - y1 ) * ( z2 - z1 ) +
309 ( x3 - x1 ) * ( y4 - y1 ) * ( z2 - z1 ) - ( x2 - x1 ) * ( y4 - y1 ) * ( z3 - z1 ) +
310 ( x2 - x1 ) * ( y3 - y1 ) * ( z4 - z1 ) - ( x3 - x1 ) * ( y2 - y1 ) * ( z4 - z1 ) );
311
312 if ( detJ <= 0.0 ) {
313 OOFEM_ERROR("negative volume");
314 }
315
316 dNdx.resize(4, 3);
317 dNdx.at(1, 1) = -( ( y3 - y2 ) * ( z4 - z2 ) - ( y4 - y2 ) * ( z3 - z2 ) );
318 dNdx.at(2, 1) = ( y4 - y3 ) * ( z1 - z3 ) - ( y1 - y3 ) * ( z4 - z3 );
319 dNdx.at(3, 1) = -( ( y1 - y4 ) * ( z2 - z4 ) - ( y2 - y4 ) * ( z1 - z4 ) );
320 dNdx.at(4, 1) = ( y2 - y1 ) * ( z3 - z1 ) - ( y3 - y1 ) * ( z2 - z1 );
321
322 dNdx.at(1, 2) = -( ( x4 - x2 ) * ( z3 - z2 ) - ( x3 - x2 ) * ( z4 - z2 ) );
323 dNdx.at(2, 2) = ( x1 - x3 ) * ( z4 - z3 ) - ( x4 - x3 ) * ( z1 - z3 );
324 dNdx.at(3, 2) = -( ( x2 - x4 ) * ( z1 - z4 ) - ( x1 - x4 ) * ( z2 - z4 ) );
325 dNdx.at(4, 2) = ( x3 - x1 ) * ( z2 - z1 ) - ( x2 - x1 ) * ( z3 - z1 );
326
327 dNdx.at(1, 3) = -( ( x3 - x2 ) * ( y4 - y2 ) - ( x4 - x2 ) * ( y3 - y2 ) );
328 dNdx.at(2, 3) = ( x4 - x3 ) * ( y1 - y3 ) - ( x1 - x3 ) * ( y4 - y3 );
329 dNdx.at(3, 3) = -( ( x1 - x4 ) * ( y2 - y4 ) - ( x2 - x4 ) * ( y1 - y4 ) );
330 dNdx.at(4, 3) = ( x2 - x1 ) * ( y3 - y1 ) - ( x3 - x1 ) * ( y2 - y1 );
331 dNdx.times(1. / detJ);
332
333 answer.resize(9, dNdx.giveNumberOfRows() * 3);
334 answer.zero();
335
336 for ( int i = 1; i <= dNdx.giveNumberOfRows(); i++ ) {
337 answer.at(1, 3 * i - 2) = dNdx.at(i, 1); // du/dx
338 answer.at(2, 3 * i - 1) = dNdx.at(i, 2); // dv/dy
339 answer.at(3, 3 * i - 0) = dNdx.at(i, 3); // dw/dz
340 answer.at(4, 3 * i - 1) = dNdx.at(i, 3); // dv/dz
341 answer.at(7, 3 * i - 0) = dNdx.at(i, 2); // dw/dy
342 answer.at(5, 3 * i - 2) = dNdx.at(i, 3); // du/dz
343 answer.at(8, 3 * i - 0) = dNdx.at(i, 1); // dw/dx
344 answer.at(6, 3 * i - 2) = dNdx.at(i, 2); // du/dy
345 answer.at(9, 3 * i - 1) = dNdx.at(i, 1); // dv/dx
346 }
347}
348
349void
350LTRSpaceBoundary :: computeStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
351{
352 FloatArray u, dispVec;
353 FloatMatrix B, T;
354 this->computeVectorOf(VM_Total, tStep, u);
355 // subtract initial displacements, if defined
356 if ( initialDisplacements ) {
358 }
359
360 this->computeTransformationMatrix(T, tStep);
361 dispVec.beProductOf(T, u);
362
363 this->computeBmatrixAt(gp, B);
364 answer.beProductOf(B, dispVec);
365}
366
367void
368LTRSpaceBoundary :: giveInternalForcesVector(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord)
369{
370 FloatMatrix B, T, Tt;
371 FloatArray vStress, vStrain, fintsub;
372
373 // zero answer will resize accordingly when adding first contribution
374 answer.clear();
375 fintsub.resize(12);
376
377 for ( auto &gp : * this->giveDefaultIntegrationRulePtr() ) {
378 StructuralMaterialStatus *matStat = static_cast< StructuralMaterialStatus * >( this->giveCrossSection()->giveMaterial(gp)->giveStatus(gp) );
379
380 // Engineering (small strain) stress
381 if ( nlGeometry == 0 ) {
382 this->computeBmatrixAt(gp, B);
383 if ( useUpdatedGpRecord == 1 ) {
384 vStress = matStat->giveStressVector();
385 } else {
386 if ( !this->isActivated(tStep) ) {
387 vStrain.resize(StructuralMaterial :: giveSizeOfVoigtSymVector(gp->giveMaterialMode() ) );
388 vStrain.zero();
389 }
390 this->computeStrainVector(vStrain, gp, tStep);
391 this->computeStressVector(vStress, vStrain, gp, tStep);
392 }
393 }
394
395 // Compute nodal internal forces at nodes as f = B^T*Stress dV
396 double dV = this->computeVolumeAround(gp);
397
398 if ( vStress.giveSize() == 6 ) {
399 FloatArray stressTemp;
400 StructuralMaterial :: giveReducedSymVectorForm(stressTemp, vStress, gp->giveMaterialMode() );
401 fintsub.plusProduct(B, stressTemp, dV);
402 } else {
403 fintsub.plusProduct(B, vStress, dV);
404 }
405 }
406
407 this->computeTransformationMatrix(T, tStep);
408 Tt.beTranspositionOf(T);
409
410 answer.beProductOf(Tt, fintsub);
411}
412
413void
414LTRSpaceBoundary :: computeStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
415{
416 FloatMatrix Korig, T, Tt, TtK;
417 NLStructuralElement :: computeStiffnessMatrix(Korig, rMode, tStep);
418
419 this->computeTransformationMatrix(T, tStep);
420 Tt.beTranspositionOf(T);
421
422 TtK.beProductOf(Tt, Korig);
423 answer.beProductOf(TtK, T);
424}
425
426void
427LTRSpaceBoundary :: computeTransformationMatrix(FloatMatrix &answer, TimeStep *tStep)
428{
429 FloatArray unitCellSize;
430 unitCellSize.resize(3);
431 unitCellSize.at(1) = this->giveNode(5)->giveCoordinate(1);
432 unitCellSize.at(2) = this->giveNode(5)->giveCoordinate(2);
433 unitCellSize.at(3) = this->giveNode(5)->giveCoordinate(3);
434
435 IntArray switches1, switches2, switches3, switches4;
436 this->giveSwitches(switches1, this->location.at(1) );
437 this->giveSwitches(switches2, this->location.at(2) );
438 this->giveSwitches(switches3, this->location.at(3) );
439 this->giveSwitches(switches4, this->location.at(4) );
440
441 FloatMatrix k1, k2, k3, k4;
442 k1.resize(3, 9);
443 k2.resize(3, 9);
444 k3.resize(3, 9);
445 k4.resize(3, 9);
446
447 for ( int i = 1; i <= 3; i++ ) {
448 k1.at(i, 3 * i - 2) = unitCellSize.at(1) * switches1.at(1);
449 k1.at(i, 3 * i - 1) = unitCellSize.at(2) * switches1.at(2);
450 k1.at(i, 3 * i) = unitCellSize.at(3) * switches1.at(3);
451 }
452
453 for ( int i = 1; i <= 3; i++ ) {
454 k2.at(i, 3 * i - 2) = unitCellSize.at(1) * switches2.at(1);
455 k2.at(i, 3 * i - 1) = unitCellSize.at(2) * switches2.at(2);
456 k2.at(i, 3 * i) = unitCellSize.at(3) * switches2.at(3);
457 }
458
459 for ( int i = 1; i <= 3; i++ ) {
460 k3.at(i, 3 * i - 2) = unitCellSize.at(1) * switches3.at(1);
461 k3.at(i, 3 * i - 1) = unitCellSize.at(2) * switches3.at(2);
462 k3.at(i, 3 * i) = unitCellSize.at(3) * switches3.at(3);
463 }
464
465 for ( int i = 1; i <= 3; i++ ) {
466 k4.at(i, 3 * i - 2) = unitCellSize.at(1) * switches4.at(1);
467 k4.at(i, 3 * i - 1) = unitCellSize.at(2) * switches4.at(2);
468 k4.at(i, 3 * i) = unitCellSize.at(3) * switches4.at(3);
469 }
470
471 answer.resize(12, 12);
472 answer.beUnitMatrix();
473 answer.resizeWithData(12, 21);
474
475 answer.assemble(k1, { 1, 2, 3 }, { 13, 14, 15, 16, 17, 18, 19, 20, 21 });
476 answer.assemble(k2, { 4, 5, 6 }, { 13, 14, 15, 16, 17, 18, 19, 20, 21 });
477 answer.assemble(k3, { 7, 8, 9 }, { 13, 14, 15, 16, 17, 18, 19, 20, 21 });
478 answer.assemble(k4, { 10, 11, 12 }, { 13, 14, 15, 16, 17, 18, 19, 20, 21 });
479}
480
481void
482LTRSpaceBoundary :: recalculateCoordinates(int nodeNumber, FloatArray &coords)
483{
484 FloatArray unitCellSize;
485 unitCellSize.resize(3);
486 unitCellSize.at(1) = this->giveNode(5)->giveCoordinate(1);
487 unitCellSize.at(2) = this->giveNode(5)->giveCoordinate(2);
488 unitCellSize.at(3) = this->giveNode(5)->giveCoordinate(3);
489
490 IntArray switches;
491 this->giveSwitches(switches, this->location.at(nodeNumber) );
492
493 coords.resize(3);
494 coords.at(1) = this->giveNode(nodeNumber)->giveCoordinate(1) + switches.at(1) * unitCellSize.at(1);
495 coords.at(2) = this->giveNode(nodeNumber)->giveCoordinate(2) + switches.at(2) * unitCellSize.at(2);
496 coords.at(3) = this->giveNode(nodeNumber)->giveCoordinate(3) + switches.at(3) * unitCellSize.at(3);
497
498 return;
499}
500
501int
502LTRSpaceBoundary :: giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
503{
504 if ( type == IST_DisplacementVector ) {
505 FloatArray u;
507 this->computeVectorOf(VM_Total, tStep, u);
508 u.resizeWithValues(12);
509 this->computeNmatrixAt(gp->giveSubPatchCoordinates(), N); //no special treatment needed for this interpolation
510 answer.beProductOf(N, u);
511 return 1;
512 }
513 return Element :: giveIPValue(answer, gp, type, tStep);
514}
515
516double
517LTRSpaceBoundary :: giveLengthInDir(const FloatArray &normalToCrackPlane)
518{
519 double maxDis, minDis;
520 int nnode = giveNumberOfNodes() - 1; //don't take control node
521
522 FloatArray coords(3);
523 recalculateCoordinates(1, coords);
524 minDis = maxDis = normalToCrackPlane.dotProduct(coords, coords.giveSize() );
525
526 for ( int i = 2; i <= nnode; i++ ) {
527 FloatArray coords(3);
528 recalculateCoordinates(i, coords);
529 double dis = normalToCrackPlane.dotProduct(coords, coords.giveSize() );
530 if ( dis > maxDis ) {
531 maxDis = dis;
532 } else if ( dis < minDis ) {
533 minDis = dis;
534 }
535 }
536
537 return maxDis - minDis;
538}
539
540void
541LTRSpaceBoundary :: NodalAveragingRecoveryMI_computeNodalValue(FloatArray &answer, int node,
542 InternalStateType type, TimeStep *tStep)
543{
544 GaussPoint *gp;
545
546 if ( numberOfGaussPoints != 1 ) {
547 answer.clear(); // for more gp's need to be refined
548 return;
549 }
550
551 gp = integrationRulesArray [ 0 ]->getIntegrationPoint(0);
552 giveIPValue(answer, gp, type, tStep);
553}
554} // end namespace oofem
#define N(a, b)
#define REGISTER_Element(class)
Node * giveNode(int i) const
Definition element.h:629
virtual bool isActivated(TimeStep *tStep)
Definition element.C:838
virtual int giveNumberOfNodes() const
Definition element.h:703
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
virtual IntegrationRule * giveDefaultIntegrationRulePtr()
Definition element.h:886
const FloatArray giveVertexCoordinates(int i) const override
Definition feinterpol.h:116
virtual void evalN(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
Domain * giveDomain() const
Definition femcmpnn.h:97
Domain * domain
Link to domain object, useful for communicating with other FEM components.
Definition femcmpnn.h:79
int number
Component number.
Definition femcmpnn.h:77
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 resizeWithValues(Index s, std::size_t allocChunk=0)
Definition floatarray.C:103
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 subtract(const FloatArray &src)
Definition floatarray.C:320
void times(double f)
void resizeWithData(Index, Index)
Definition floatmatrix.C:91
void resize(Index rows, Index cols)
Definition floatmatrix.C:79
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
void beTranspositionOf(const FloatMatrix &src)
void zero()
Zeroes all coefficient of receiver.
int giveNumberOfRows() const
Returns number of rows of receiver.
void assemble(const FloatMatrix &src, const IntArray &loc)
double at(std::size_t i, std::size_t j) const
void beUnitMatrix()
Sets receiver to unity matrix.
const FloatArray & giveSubPatchCoordinates() const
Returns local sub-patch coordinates of the receiver.
Definition gausspoint.h:142
double giveWeight()
Returns integration weight of receiver.
Definition gausspoint.h:180
void resize(int n)
Definition intarray.C:73
int & at(std::size_t i)
Definition intarray.h:104
void computeBHmatrixAt(GaussPoint *gp, FloatMatrix &answer) override
void recalculateCoordinates(int nodeNumber, FloatArray &coords) override
static ParamKey IPK_LTRSpaceBoundary_location
[optional] Location of the element (1-4) - 1: left, 2: right, 3: top, 4: bottom
void computeStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep) override
double computeVolumeAround(GaussPoint *gp) override
FEInterpolation * giveInterpolation() const override
static FEI3dTetLin interpolation
void giveSwitches(IntArray &answer, int location)
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int lowerIndx=1, int upperIndx=ALL_STRAINS) override
virtual void computeTransformationMatrix(FloatMatrix &answer, TimeStep *tStep)
int nlGeometry
Flag indicating if geometrical nonlinearities apply.
SpatialLocalizerInterface(Element *element)
Structural3DElement(int n, Domain *d)
void computeStressVector(FloatArray &answer, const FloatArray &strain, GaussPoint *gp, TimeStep *tStep) override
virtual void computeNmatrixAt(const FloatArray &iLocCoord, FloatMatrix &answer)
std::unique_ptr< FloatArray > initialDisplacements
Initial displacement vector, describes the initial nodal displacements when element has been casted.
const FloatArray & giveStressVector() const
Returns the const pointer to receiver's stress vector.
#define OOFEM_ERROR(...)
Definition error.h:79
@ SpatialLocalizerInterfaceType
@ NodalAveragingRecoveryModelInterfaceType
#define PM_ELEMENT_ERROR_IFNOTSET(_pm, _componentnum, _paramkey)
#define PM_UPDATE_PARAMETER(_val, _pm, _ir, _componentnum, _paramkey, _prio)

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