OOFEM 3.0
Loading...
Searching...
No Matches
structural3delement.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
36#include "feinterpol3d.h"
37#include "gausspoint.h"
40#include "mathfem.h"
41#include "parametermanager.h"
42#include "paramkey.h"
43
44namespace oofem {
45
47
49 NLStructuralElement(n, aDomain),
50 matRotation(false)
51{}
52
53
54void
61
62
63void
65// Returns the [ 6 x (nno*3) ] strain-displacement matrix {B} of the receiver, eva-
66// luated at gp.
67// B matrix - 6 rows : epsilon-X, epsilon-Y, epsilon-Z, gamma-YZ, gamma-ZX, gamma-XY :
68{
69 FEInterpolation *interp = this->giveInterpolation();
70 FloatMatrix dNdx;
72
73 answer.resize(6, dNdx.giveNumberOfRows() * 3);
74 answer.zero();
75
76 for ( int i = 1; i <= dNdx.giveNumberOfRows(); i++ ) {
77 answer.at(1, 3 * i - 2) = dNdx.at(i, 1);
78 answer.at(2, 3 * i - 1) = dNdx.at(i, 2);
79 answer.at(3, 3 * i - 0) = dNdx.at(i, 3);
80
81 answer.at(5, 3 * i - 2) = answer.at(4, 3 * i - 1) = dNdx.at(i, 3);
82 answer.at(6, 3 * i - 2) = answer.at(4, 3 * i - 0) = dNdx.at(i, 2);
83 answer.at(6, 3 * i - 1) = answer.at(5, 3 * i - 0) = dNdx.at(i, 1);
84 }
85}
86
87
88
89void
91// Returns the [ 9 x (nno * 3) ] displacement gradient matrix {BH} of the receiver,
92// evaluated at gp.
93// BH matrix - 9 rows : du/dx, dv/dy, dw/dz, dv/dz, du/dz, du/dy, dw/dy, dw/dx, dv/dx
94{
95 FEInterpolation *interp = this->giveInterpolation();
96 FloatMatrix dNdx;
98
99 answer.resize(9, dNdx.giveNumberOfRows() * 3);
100 answer.zero();
101
102 for ( int i = 1; i <= dNdx.giveNumberOfRows(); i++ ) {
103 answer.at(1, 3 * i - 2) = dNdx.at(i, 1); // du/dx
104 answer.at(2, 3 * i - 1) = dNdx.at(i, 2); // dv/dy
105 answer.at(3, 3 * i - 0) = dNdx.at(i, 3); // dw/dz
106 answer.at(4, 3 * i - 1) = dNdx.at(i, 3); // dv/dz
107 answer.at(7, 3 * i - 0) = dNdx.at(i, 2); // dw/dy
108 answer.at(5, 3 * i - 2) = dNdx.at(i, 3); // du/dz
109 answer.at(8, 3 * i - 0) = dNdx.at(i, 1); // dw/dx
110 answer.at(6, 3 * i - 2) = dNdx.at(i, 2); // du/dy
111 answer.at(9, 3 * i - 1) = dNdx.at(i, 1); // dv/dx
112 }
113}
114
115
116void
118{
119 FloatArray stress;
120 FloatMatrix B, DB, stress_ident;
121
122 answer.clear();
123 stress_ident.resize(9, 9);
124 // assemble initial stress matrix
125 for ( auto &gp : * this->giveDefaultIntegrationRulePtr() ) {
126 // This function fetches the full form of the tensor
127 this->giveIPValue(stress, gp, IST_StressTensor, tStep);
128 stress_ident.zero();
129 if ( stress.giveSize() ) {
130 // Construct the stress_ident matrix
131 // product answer_ijkl = delta_ik * sigma_jl
132 /*ij 11 22 33 23 13 12 32 31 21
133 * kl
134 * 11 [ sig11, 0, 0, 0, sig13, sig12, 0, 0, 0]
135 * 22 [ 0, sig22, 0, sig23, 0, 0, 0, 0, sig12]
136 * 33 [ 0, 0, sig33, 0, 0, 0, sig23, sig13, 0]
137 * 23 [ 0, sig23, 0, sig33, 0, 0, 0, 0, sig13]
138 * 13 [ sig13, 0, 0, 0, sig33, sig23, 0, 0, 0]
139 * 12 [ sig12, 0, 0, 0, sig23, sig22, 0, 0, 0]
140 * 32 [ 0, 0, sig23, 0, 0, 0, sig22, sig12, 0]
141 * 31 [ 0, 0, sig13, 0, 0, 0, sig12, sig11, 0]
142 * 21 [ 0, sig12, 0, sig13, 0, 0, 0, 0, sig11]
143 */
144
145 stress_ident.at(1, 1) = stress.at(1);
146 stress_ident.at(1, 5) = stress.at(5);
147 stress_ident.at(1, 6) = stress.at(6);
148
149 stress_ident.at(2, 2) = stress.at(2);
150 stress_ident.at(2, 4) = stress.at(4);
151 stress_ident.at(2, 9) = stress.at(6);
152
153 stress_ident.at(3, 3) = stress.at(3);
154 stress_ident.at(3, 7) = stress.at(4);
155 stress_ident.at(3, 8) = stress.at(5);
156
157 stress_ident.at(4, 2) = stress.at(4);
158 stress_ident.at(4, 4) = stress.at(3);
159 stress_ident.at(4, 9) = stress.at(5);
160
161 stress_ident.at(5, 1) = stress.at(5);
162 stress_ident.at(5, 5) = stress.at(3);
163 stress_ident.at(5, 6) = stress.at(4);
164
165 stress_ident.at(6, 1) = stress.at(6);
166 stress_ident.at(6, 5) = stress.at(4);
167 stress_ident.at(6, 6) = stress.at(2);
168
169 stress_ident.at(7, 3) = stress.at(4);
170 stress_ident.at(7, 7) = stress.at(2);
171 stress_ident.at(7, 8) = stress.at(6);
172
173 stress_ident.at(8, 3) = stress.at(5);
174 stress_ident.at(8, 7) = stress.at(6);
175 stress_ident.at(8, 8) = stress.at(1);
176
177 stress_ident.at(9, 2) = stress.at(6);
178 stress_ident.at(9, 4) = stress.at(5);
179 stress_ident.at(9, 9) = stress.at(1);
180 }
181
182 OOFEM_WARNING("Implementation not tested yet!");
183 this->computeBHmatrixAt(gp, B);
184 DB.beProductOf(stress_ident, B);
185 answer.plusProductUnsym(B, DB, this->computeVolumeAround(gp) );
186 }
187}
188
189
190
191MaterialMode
193{
194 return _3dMat;
195}
196
197
198void
200{
201 if ( this->elemLocalCS.isNotEmpty() ) { // User specified orientation
202 x.beColumnOf(this->elemLocalCS, 1);
203 y.beColumnOf(this->elemLocalCS, 2);
204 z.beColumnOf(this->elemLocalCS, 3);
205 } else {
207 FloatMatrix jac;
208 FloatArray help;
210 x.beColumnOf(jac, 1); // This is {dx/dxi, dy/dxi, dz/dxi}
211 x.normalize();
212 help.beColumnOf(jac, 2);
213 z.beVectorProductOf(x, help); // Normal to the xi-eta plane.
214 z.normalize();
215 y.beVectorProductOf(z, x);
216 }
217}
218
219
220void
222{
223 if ( this->matRotation ) {
225 FloatArray x, y, z;
226
228 // Transform from global c.s. to material c.s.
229 FloatArrayF< 6 >rotStrain = {
230 e [ 0 ] * x [ 0 ] * x [ 0 ] + e [ 5 ] * x [ 0 ] * x [ 1 ] + e [ 1 ] * x [ 1 ] * x [ 1 ] + e [ 4 ] * x [ 0 ] * x [ 2 ] + e [ 3 ] * x [ 1 ] * x [ 2 ] + e [ 2 ] * x [ 2 ] * x [ 2 ],
231 e [ 0 ] * y [ 0 ] * y [ 0 ] + e [ 5 ] * y [ 0 ] * y [ 1 ] + e [ 1 ] * y [ 1 ] * y [ 1 ] + e [ 4 ] * y [ 0 ] * y [ 2 ] + e [ 3 ] * y [ 1 ] * y [ 2 ] + e [ 2 ] * y [ 2 ] * y [ 2 ],
232 e [ 0 ] * z [ 0 ] * z [ 0 ] + e [ 5 ] * z [ 0 ] * z [ 1 ] + e [ 1 ] * z [ 1 ] * z [ 1 ] + e [ 4 ] * z [ 0 ] * z [ 2 ] + e [ 3 ] * z [ 1 ] * z [ 2 ] + e [ 2 ] * z [ 2 ] * z [ 2 ],
233 2 * e [ 0 ] * y [ 0 ] * z [ 0 ] + e [ 4 ] * y [ 2 ] * z [ 0 ] + 2 * e [ 1 ] * y [ 1 ] * z [ 1 ] + e [ 3 ] * y [ 2 ] * z [ 1 ] + e [ 5 ] * ( y [ 1 ] * z [ 0 ] + y [ 0 ] * z [ 1 ] ) + ( e [ 4 ] * y [ 0 ] + e [ 3 ] * y [ 1 ] + 2 * e [ 2 ] * y [ 2 ] ) * z [ 2 ],
234 2 * e [ 0 ] * x [ 0 ] * z [ 0 ] + e [ 4 ] * x [ 2 ] * z [ 0 ] + 2 * e [ 1 ] * x [ 1 ] * z [ 1 ] + e [ 3 ] * x [ 2 ] * z [ 1 ] + e [ 5 ] * ( x [ 1 ] * z [ 0 ] + x [ 0 ] * z [ 1 ] ) + ( e [ 4 ] * x [ 0 ] + e [ 3 ] * x [ 1 ] + 2 * e [ 2 ] * x [ 2 ] ) * z [ 2 ],
235 2 * e [ 0 ] * x [ 0 ] * y [ 0 ] + e [ 4 ] * x [ 2 ] * y [ 0 ] + 2 * e [ 1 ] * x [ 1 ] * y [ 1 ] + e [ 3 ] * x [ 2 ] * y [ 1 ] + e [ 5 ] * ( x [ 1 ] * y [ 0 ] + x [ 0 ] * y [ 1 ] ) + ( e [ 4 ] * x [ 0 ] + e [ 3 ] * x [ 1 ] + 2 * e [ 2 ] * x [ 2 ] ) * y [ 2 ]
236 };
237 auto s = this->giveStructuralCrossSection()->giveRealStress_3d(rotStrain, gp, tStep);
238 answer = Vec6(
239 s [ 0 ] * x [ 0 ] * x [ 0 ] + 2 * s [ 5 ] * x [ 0 ] * y [ 0 ] + s [ 1 ] * y [ 0 ] * y [ 0 ] + 2 * ( s [ 4 ] * x [ 0 ] + s [ 3 ] * y [ 0 ] ) * z [ 0 ] + s [ 2 ] * z [ 0 ] * z [ 0 ],
240 s [ 0 ] * x [ 1 ] * x [ 1 ] + 2 * s [ 5 ] * x [ 1 ] * y [ 1 ] + s [ 1 ] * y [ 1 ] * y [ 1 ] + 2 * ( s [ 4 ] * x [ 1 ] + s [ 3 ] * y [ 1 ] ) * z [ 1 ] + s [ 2 ] * z [ 1 ] * z [ 1 ],
241 s [ 0 ] * x [ 2 ] * x [ 2 ] + 2 * s [ 5 ] * x [ 2 ] * y [ 2 ] + s [ 1 ] * y [ 2 ] * y [ 2 ] + 2 * ( s [ 4 ] * x [ 2 ] + s [ 3 ] * y [ 2 ] ) * z [ 2 ] + s [ 2 ] * z [ 2 ] * z [ 2 ],
242 y [ 2 ] * ( s [ 5 ] * x [ 1 ] + s [ 1 ] * y [ 1 ] + s [ 3 ] * z [ 1 ] ) + x [ 2 ] * ( s [ 0 ] * x [ 1 ] + s [ 5 ] * y [ 1 ] + s [ 4 ] * z [ 1 ] ) + ( s [ 4 ] * x [ 1 ] + s [ 3 ] * y [ 1 ] + s [ 2 ] * z [ 1 ] ) * z [ 2 ],
243 y [ 2 ] * ( s [ 5 ] * x [ 0 ] + s [ 1 ] * y [ 0 ] + s [ 3 ] * z [ 0 ] ) + x [ 2 ] * ( s [ 0 ] * x [ 0 ] + s [ 5 ] * y [ 0 ] + s [ 4 ] * z [ 0 ] ) + ( s [ 4 ] * x [ 0 ] + s [ 3 ] * y [ 0 ] + s [ 2 ] * z [ 0 ] ) * z [ 2 ],
244 y [ 1 ] * ( s [ 5 ] * x [ 0 ] + s [ 1 ] * y [ 0 ] + s [ 3 ] * z [ 0 ] ) + x [ 1 ] * ( s [ 0 ] * x [ 0 ] + s [ 5 ] * y [ 0 ] + s [ 4 ] * z [ 0 ] ) + ( s [ 4 ] * x [ 0 ] + s [ 3 ] * y [ 0 ] + s [ 2 ] * z [ 0 ] ) * z [ 1 ]
245 );
246 } else {
247 answer = this->giveStructuralCrossSection()->giveRealStress_3d(e, gp, tStep);
248 }
249}
250
251void
253{
254 answer = this->giveStructuralCrossSection()->giveStiffnessMatrix_3d(rMode, gp, tStep);
255 if ( this->matRotation ) {
256 FloatArray x, y, z;
257 FloatMatrix Q;
258
260
262 { x(0) * x(0), x(1) * x(1), x(2) * x(2), x(1) * x(2), x(0) * x(2), x(0) * x(1) },
263 { y(0) * y(0), y(1) * y(1), y(2) * y(2), y(1) * y(2), y(0) * y(2), y(0) * y(1) },
264 { z(0) * z(0), z(1) * z(1), z(2) * z(2), z(1) * z(2), z(0) * z(2), z(0) * z(1) },
265 { 2 * y(0) * z(0), 2 * y(1) * z(1), 2 * y(2) * z(2), y(2) * z(1) + y(1) * z(2), y(2) * z(0) + y(0) * z(2), y(1) * z(0) + y(0) * z(1) },
266 { 2 * x(0) * z(0), 2 * x(1) * z(1), 2 * x(2) * z(2), x(2) * z(1) + x(1) * z(2), x(2) * z(0) + x(0) * z(2), x(1) * z(0) + x(0) * z(1) },
267 { 2 * x(0) * y(0), 2 * x(1) * y(1), 2 * x(2) * y(2), x(2) * y(1) + x(1) * y(2), x(2) * y(0) + x(0) * y(2), x(1) * y(0) + x(0) * y(1) }
268 });
269 answer.rotatedWith(Q, 't');
270 }
271}
272
273
274void
276{
277 answer = this->giveStructuralCrossSection()->giveStiffnessMatrix_dPdF_3d(rMode, gp, tStep);
278 if ( this->matRotation ) {
279 FloatArray x, y, z;
280 FloatMatrix Q;
283 { x(0) * x(0), x(1) * x(1), x(2) * x(2), x(1) * x(2), x(0) * x(2), x(0) * x(1), x(2) * x(1), x(2) * x(0), x(1) * x(0) },
284 { y(0) * y(0), y(1) * y(1), y(2) * y(2), y(1) * y(2), y(0) * y(2), y(0) * y(1), y(2) * y(1), y(2) * y(0), y(1) * y(0) },
285 { z(0) * z(0), z(1) * z(1), z(2) * z(2), z(1) * z(2), z(0) * z(2), z(0) * z(1), z(2) * z(1), z(2) * z(0), z(1) * z(0) },
286 { y(0) * z(0), y(1) * z(1), y(2) * z(2), y(1) * z(2), y(0) * z(2), y(0) * z(1), y(2) * z(1), y(2) * z(0), y(1) * z(0) },
287 { x(0) * z(0), x(1) * z(1), x(2) * z(2), x(1) * z(2), x(0) * z(2), x(0) * z(1), x(2) * z(1), x(2) * z(0), x(1) * z(0) },
288 { x(0) * y(0), x(1) * y(1), x(2) * y(2), x(1) * y(2), x(0) * y(2), x(0) * y(1), x(2) * y(1), x(2) * y(0), x(1) * y(0) },
289 { z(0) * y(0), z(1) * y(1), z(2) * y(2), z(1) * y(2), z(0) * y(2), z(0) * y(1), z(2) * y(1), z(2) * y(0), z(1) * y(0) },
290 { z(0) * x(0), z(1) * x(1), z(2) * x(2), z(1) * x(2), z(0) * x(2), z(0) * x(1), z(2) * x(1), z(2) * x(0), z(1) * x(0) },
291 { y(0) * x(0), y(1) * x(1), y(2) * x(2), y(1) * x(2), y(0) * x(2), y(0) * x(1), y(2) * x(1), y(2) * x(0), y(1) * x(0) },
292 });
293 answer.rotatedWith(Q, 't');
294 }
295}
296
297
298
299void
301{
302 answer = {
303 D_u, D_v, D_w
304 };
305}
306
307
308int
310{
312 IntArray dofIdMask;
313 this->giveDofManDofIDMask(-1, dofIdMask); // ok for standard elements
314 return this->giveInterpolation()->giveNumberOfNodes(this->giveGeometryType()) * dofIdMask.giveSize();
315}
316
317
319// Sets up the array containing the four Gauss points of the receiver.
320{
321 if ( integrationRulesArray.size() == 0 ) {
322 integrationRulesArray.resize(1);
323 integrationRulesArray [ 0 ] = std::make_unique< GaussIntegrationRule >(1, this, 1, 6);
325 }
326}
327
328
329
330double
332// Returns the portion of the receiver which is attached to gp.
333{
334 double determinant, weight, volume;
335 determinant = fabs(this->giveInterpolation()->giveTransformationJacobian(gp->giveNaturalCoordinates(),
337
338 weight = gp->giveWeight();
339 volume = determinant * weight;
340
341 return volume;
342}
343
344
345double
347{
348 return this->giveLengthInDir(normalToCrackPlane);
349}
350
351
352// Surface support
353void
355{
356 /* Returns the [ 3 x (nno*3) ] shape function matrix {N} of the receiver,
357 * evaluated at the given gp.
358 * {u} = {N}*{a} gives the displacements at the integration point.
359 */
360
361 // Evaluate the shape functions at the position of the gp.
363 static_cast< FEInterpolation3d * >( this->giveInterpolation() )->
364 surfaceEvalN(N, iSurf, sgp->giveNaturalCoordinates(), FEIElementGeometryWrapper(this) );
365 answer.beNMatrixOf(N, 3);
366}
367
368void
370{
371 const int ndofsn = 3;
372
373 const auto &nodes = static_cast< FEInterpolation3d * >( this->giveInterpolation() )->computeLocalSurfaceMapping(iSurf);
374
375 answer.resize(nodes.giveSize() * 3);
376
377 for ( int i = 1; i <= nodes.giveSize(); i++ ) {
378 answer.at(i * ndofsn - 2) = nodes.at(i) * ndofsn - 2;
379 answer.at(i * ndofsn - 1) = nodes.at(i) * ndofsn - 1;
380 answer.at(i * ndofsn) = nodes.at(i) * ndofsn;
381 }
382}
383
384double
386{
387 double determinant = fabs(static_cast< FEInterpolation3d * >( this->giveInterpolation() )->
388 surfaceGiveTransformationJacobian(iSurf, gp->giveNaturalCoordinates(), FEIElementGeometryWrapper(this) ) );
389
390 double weight = gp->giveWeight();
391 return determinant * weight;
392}
393
394
395int
397{
398 OOFEM_ERROR("surface local coordinate system not supported");
399}
400
401
402// Edge support
403
404void
406{
407 /*
408 * provides dof mapping of local edge dofs (only nonzero are taken into account)
409 * to global element dofs
410 */
411 const auto &eNodes = static_cast< FEInterpolation3d * >( this->giveInterpolation() )->computeLocalEdgeMapping(iEdge);
412
413 answer.resize(eNodes.giveSize() * 3);
414 for ( int i = 1; i <= eNodes.giveSize(); i++ ) {
415 answer.at(i * 3 - 2) = eNodes.at(i) * 3 - 2;
416 answer.at(i * 3 - 1) = eNodes.at(i) * 3 - 1;
417 answer.at(i * 3) = eNodes.at(i) * 3;
418 }
419}
420
421
422double
424{
425 /* Returns the line element ds associated with the given gp on the specific edge.
426 * Note: The name is misleading since there is no volume to speak of in this case.
427 * The returned value is used for integration of a line integral (external forces).
428 */
429 double detJ = static_cast< FEInterpolation3d * >( this->giveInterpolation() )->
430 edgeGiveTransformationJacobian(iEdge, gp->giveNaturalCoordinates(), FEIElementGeometryWrapper(this) );
431 return detJ * gp->giveWeight();
432}
433
434
435int
437{
438 // returns transformation matrix from
439 // edge local coordinate system
440 // to element local c.s
441 // (same as global c.s in this case)
442 //
443 // i.e. f(element local) = T * f(edge local)
444 //
446 OOFEM_ERROR("egde local coordinate system not supported");
447}
448} // end namespace oofem
#define N(a, b)
virtual int setupIntegrationPoints(IntegrationRule &irule, int npoints, Element *element)
ParameterManager elementPPM
Definition domain.h:133
virtual double giveLengthInDir(const FloatArray &normalToCrackPlane)
Definition element.C:1162
virtual FEInterpolation * giveInterpolation() const
Definition element.h:648
std::vector< std ::unique_ptr< IntegrationRule > > integrationRulesArray
Definition element.h:157
int numberOfGaussPoints
Definition element.h:175
FloatMatrix elemLocalCS
Transformation material matrix, used in orthotropic and anisotropic materials, global->local transfor...
Definition element.h:160
CrossSection * giveCrossSection()
Definition element.C:534
virtual IntegrationRule * giveDefaultIntegrationRulePtr()
Definition element.h:886
virtual Element_Geometry_Type giveGeometryType() const =0
virtual int giveNumberOfNodes(const Element_Geometry_Type) const
Definition feinterpol.h:557
virtual void giveJacobianMatrixAt(FloatMatrix &jacobianMatrix, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const
Definition feinterpol.h:284
virtual double evaldNdx(FloatMatrix &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
Domain * giveDomain() const
Definition femcmpnn.h:97
int number
Component number.
Definition femcmpnn.h:77
double & at(Index i)
Definition floatarray.h:202
Index giveSize() const
Returns the size of receiver.
Definition floatarray.h:261
void beColumnOf(const FloatMatrix &mat, int col)
void beVectorProductOf(const FloatArray &v1, const FloatArray &v2)
Definition floatarray.C:476
void rotatedWith(const FloatMatrix &r, char mode='n')
static FloatMatrix fromIniList(std ::initializer_list< std ::initializer_list< double > >)
void resize(Index rows, Index cols)
Definition floatmatrix.C:79
*Sets size of receiver to be an empty matrix It will have zero rows and zero columns size void clear()
void plusProductUnsym(const FloatMatrix &a, const FloatMatrix &b, double dV)
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
void beNMatrixOf(const FloatArray &n, int nsd)
void zero()
Zeroes all coefficient of receiver.
int giveNumberOfRows() const
Returns number of rows of receiver.
double at(std::size_t i, std::size_t j) const
const FloatArray & giveNaturalCoordinates() const
Returns coordinate array of receiver.
Definition gausspoint.h:138
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
int giveSize() const
Definition intarray.h:211
void initializeFrom(InputRecord &ir, int priority) override
NLStructuralElement(int n, Domain *d)
void giveDofManDofIDMask(int inode, IntArray &answer) const override
void computeBHmatrixAt(GaussPoint *gp, FloatMatrix &answer) override
void giveSurfaceDofMapping(IntArray &answer, int) const override
double giveCharacteristicLength(const FloatArray &normalToCrackPlane) override
void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int lowerIndx=1, int upperIndx=ALL_STRAINS) override
Structural3DElement(int n, Domain *d)
int computeLoadLSToLRotationMatrix(FloatMatrix &answer, int, GaussPoint *gp) override
static ParamKey IPK_Structural3DElement_materialCoordinateSystem
[optional] Material coordinate system (local) for the element.
double computeSurfaceVolumeAround(GaussPoint *gp, int) override
void computeConstitutiveMatrixAt(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep) override
void initializeFrom(InputRecord &ir, int priority) override
double computeVolumeAround(GaussPoint *gp) override
int computeLoadLEToLRotationMatrix(FloatMatrix &answer, int iEdge, GaussPoint *gp) override
MaterialMode giveMaterialMode() override
double computeEdgeVolumeAround(GaussPoint *gp, int iEdge) override
void computeConstitutiveMatrix_dPdF_At(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep) override
void giveEdgeDofMapping(IntArray &answer, int iEdge) const override
void computeInitialStressMatrix(FloatMatrix &answer, TimeStep *tStep) override
void computeStressVector(FloatArray &answer, const FloatArray &strain, GaussPoint *gp, TimeStep *tStep) override
void giveMaterialOrientationAt(FloatArray &x, FloatArray &y, FloatArray &z, const FloatArray &lcoords)
void computeSurfaceNMatrixAt(FloatMatrix &answer, int iSurf, GaussPoint *gp)
virtual FloatMatrixF< 9, 9 > giveStiffnessMatrix_dPdF_3d(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const =0
virtual FloatArrayF< 6 > giveRealStress_3d(const FloatArrayF< 6 > &reducedStrain, GaussPoint *gp, TimeStep *tStep) const =0
virtual FloatMatrixF< 6, 6 > giveStiffnessMatrix_3d(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const =0
StructuralCrossSection * giveStructuralCrossSection()
Helper function which returns the structural cross-section for the element.
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
#define OOFEM_WARNING(...)
Definition error.h:80
#define OOFEM_ERROR(...)
Definition error.h:79
static FloatArray Vec6(const double &a, const double &b, const double &c, const double &d, const double &e, const double &f)
Definition floatarray.h:610
#define PM_CHECK_FLAG_AND_REPORT(_pm, _ir, _componentnum, _paramkey, _prio, _flag)

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