OOFEM 3.0
Loading...
Searching...
No Matches
nlstructuralelement.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
38#include "feinterpol.h"
39#include "domain.h"
40#include "material.h"
41#include "crosssection.h"
42#include "integrationrule.h"
43#include "intarray.h"
44#include "floatarray.h"
45#include "floatmatrix.h"
46#include "dynamicinputrecord.h"
47#include "gausspoint.h"
48#include "engngm.h"
49#include "mathfem.h"
50#include "parametermanager.h"
51#include "paramkey.h"
52
53namespace oofem {
54
56
58 StructuralElement(n, aDomain)
59 // Constructor. Creates an element with number n, belonging to aDomain.
60{
61 nlGeometry = 0; // Geometrical nonlinearities disabled as default
62}
63
64
65double
67{
68 double vol = 0.0;
69 for ( auto &gp : * this->giveDefaultIntegrationRulePtr() ) {
70 FloatArray F;
71 FloatMatrix Fm;
72
73
75 Fm.beMatrixForm(F);
76 double J = Fm.giveDeterminant();
77
78 FEInterpolation *interpolation = this->giveInterpolation();
79 double detJ = fabs( ( interpolation->giveTransformationJacobian(gp->giveNaturalCoordinates(), FEIElementGeometryWrapper(this) ) ) );
80
81 vol += gp->giveWeight() * detJ * J;
82 }
83
84 return vol;
85}
86
87
88void
90{
91 // Computes the deformation gradient in the Voigt format at the Gauss point gp of
92 // the receiver at time step tStep.
93 // Order of components: 11, 22, 33, 23, 13, 12, 32, 31, 21 in the 3D.
94
95 // Obtain the current displacement vector of the element and subtract initial displacements (if present)
96 FloatArray u;
97 this->computeVectorOf({ D_u, D_v, D_w }, VM_Total, tStep, u); // solution vector
100 }
101
102 // Displacement gradient H = du/dX
103 FloatMatrix B;
104 this->computeBHmatrixAt(gp, B);
105 answer.beProductOf(B, u);
106
107 // Deformation gradient F = H + I
108 MaterialMode matMode = gp->giveMaterialMode();
109 if ( matMode == _3dMat || matMode == _PlaneStrain ) {
110 answer.at(1) += 1.0;
111 answer.at(2) += 1.0;
112 answer.at(3) += 1.0;
113 } else if ( matMode == _PlaneStress ) {
114 answer.at(1) += 1.0;
115 answer.at(2) += 1.0;
116 } else if ( matMode == _1dMat ) {
117 answer.at(1) += 1.0;
118 } else {
119 OOFEM_ERROR("MaterialMode is not supported yet (%s)", __MaterialModeToString(matMode) );
120 }
121}
122
123
124void
126{
127 // Computes the first Piola-Kirchhoff stress vector containing the stresses at the Gauss point
128 // gp of the receiver at time step tStep. The deformation gradient F is computed and sent as
129 // input to the material model.
131
132 FloatArray vF;
133 this->computeDeformationGradientVector(vF, gp, tStep);
134 answer = cs->giveFirstPKStresses(vF, gp, tStep);
135}
136
137void
139{
140 // Computes the first Piola-Kirchhoff stress vector containing the stresses at the Gauss point
141 // gp of the receiver at time step tStep. The deformation gradient F is computed and sent as
142 // input to the material model.
144
145 FloatArray vF;
146 this->computeDeformationGradientVector(vF, gp, tStep);
147 cs->giveCauchyStresses(answer, gp, vF, tStep);
148}
149
150void
152{
153 FloatMatrix B;
154 FloatArray vStress, vStrain, u;
155
156 // This function can be quite costly to do inside the loops when one has many slave dofs.
157 this->computeVectorOf(VM_Total, tStep, u);
158 // subtract initial displacements, if defined
159 if ( initialDisplacements ) {
161 }
162
163 // zero answer will resize accordingly when adding first contribution
164 answer.clear();
165
166 for ( auto &gp : * this->giveDefaultIntegrationRulePtr() ) {
167 StructuralMaterialStatus *matStat = static_cast< StructuralMaterialStatus * >( this->giveCrossSection()->giveMaterial(gp)->giveStatus(gp) );
168
169 // Engineering (small strain) stress
170 if ( nlGeometry == 0 ) {
171 this->computeBmatrixAt(gp, B);
172 if ( useUpdatedGpRecord == 1 ) {
173 vStress = matStat->giveStressVector();
174 } else {
176 if ( !this->isActivated(tStep) ) {
177 vStrain.resize(StructuralMaterial::giveSizeOfVoigtSymVector(gp->giveMaterialMode() ) );
178 vStrain.zero();
179 }
180 vStrain.beProductOf(B, u);
181 this->computeStressVector(vStress, vStrain, gp, tStep);
182 }
183 } else if ( nlGeometry == 1 ) { // First Piola-Kirchhoff stress
184 if ( this->domain->giveEngngModel()->giveFormulation() == AL ) { // Cauchy stress
185 if ( useUpdatedGpRecord == 1 ) {
186 vStress = matStat->giveCVector();
187 } else {
188 this->computeCauchyStressVector(vStress, gp, tStep);
189 }
190
191 this->computeBmatrixAt(gp, B);
192 } else { // First Piola-Kirchhoff stress
193 if ( useUpdatedGpRecord == 1 ) {
194 vStress = matStat->givePVector();
195 } else {
196 this->computeFirstPKStressVector(vStress, gp, tStep);
198 }
199
200 this->computeBHmatrixAt(gp, B);
201 }
202 }
203
204 if ( vStress.giveSize() == 0 ) {
205 break;
206 }
207
208 // Compute nodal internal forces at nodes as f = B^T*Stress dV
209 double dV = this->computeVolumeAround(gp);
210
211 if ( nlGeometry == 1 ) { // First Piola-Kirchhoff stress
212 if ( vStress.giveSize() == 9 ) {
213 FloatArray stressTemp;
214 StructuralMaterial::giveReducedVectorForm(stressTemp, vStress, gp->giveMaterialMode() );
215 answer.plusProduct(B, stressTemp, dV);
216 } else {
217 answer.plusProduct(B, vStress, dV);
218 }
219 } else {
220 if ( vStress.giveSize() == 6 ) {
221 // It may happen that e.g. plane strain is computed
222 // using the default 3D implementation. If so,
223 // the stress needs to be reduced.
224 // (Note that no reduction will take place if
225 // the simulation is actually 3D.)
226 FloatArray stressTemp;
227 StructuralMaterial::giveReducedSymVectorForm(stressTemp, vStress, gp->giveMaterialMode() );
228 answer.plusProduct(B, stressTemp, dV);
229 } else {
230 answer.plusProduct(B, vStress, dV);
231 }
232 }
233 }
234
235 // If inactive: update fields but do not give any contribution to the internal forces
236 if ( !this->isActivated(tStep) ) {
237 answer.zero();
238 return;
239 }
240}
241
242
243void
245 TimeStep *tStep, int useUpdatedGpRecord)
246{
247 /*
248 * Returns nodal representation of real internal forces computed from first Piola-Kirchoff stress
249 * if useGpRecord == 1 then stresses stored in the gp are used, otherwise stresses are computed
250 * this must be done if you want internal forces after element->updateYourself() has been called
251 * for the same time step.
252 * The integration procedure uses an integrationRulesArray for numerical integration.
253 * Each integration rule is considered to represent a separate sub-cell/element. Typically this would be used when
254 * integration of the element domain needs special treatment, e.g. when using the XFEM.
255 */
256
257 FloatMatrix B;
258 FloatArray vStress, vStrain;
259
260 IntArray irlocnum;
261 FloatArray *m = & answer, temp;
262 if ( this->giveInterpolation() && this->giveInterpolation()->hasSubPatchFormulation() ) {
263 m = & temp;
264 }
265
266 // zero answer will resize accordingly when adding first contribution
267 answer.clear();
268
269
270 // loop over individual integration rules
271 for ( auto &iRule : integrationRulesArray ) {
272 for ( GaussPoint *gp : * iRule ) {
273 StructuralMaterialStatus *matStat = static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() );
274
275 if ( nlGeometry == 0 ) {
276 this->computeBmatrixAt(gp, B);
277 if ( useUpdatedGpRecord == 1 ) {
278 vStress = matStat->giveStressVector();
279 } else {
280 this->computeStrainVector(vStrain, gp, tStep);
281 this->computeStressVector(vStress, vStrain, gp, tStep);
282 }
283 } else if ( nlGeometry == 1 ) {
284 if ( this->domain->giveEngngModel()->giveFormulation() == AL ) { // Cauchy stress
285 if ( useUpdatedGpRecord == 1 ) {
286 vStress = matStat->giveCVector();
287 } else {
288 this->computeCauchyStressVector(vStress, gp, tStep);
289 }
290
291 this->computeBmatrixAt(gp, B);
292 } else { // First Piola-Kirchhoff stress
293 if ( useUpdatedGpRecord == 1 ) {
294 vStress = matStat->givePVector();
295 } else {
296 this->computeFirstPKStressVector(vStress, gp, tStep);
297 }
298
299 this->computeBHmatrixAt(gp, B);
300 }
301 }
302
303 if ( vStress.giveSize() == 0 ) { //@todo is this really necessary?
304 break;
305 }
306
307 // compute nodal representation of internal forces at nodes as f = B^T*stress dV
308 double dV = this->computeVolumeAround(gp);
309 m->plusProduct(B, vStress, dV);
310
311 // localize irule contribution into element matrix
312 if ( this->giveIntegrationRuleLocalCodeNumbers(irlocnum, * iRule) ) {
313 answer.assemble(* m, irlocnum);
314 m->clear();
315 }
316 }
317 }
318
319 // if inactive: update fields but do not give any contribution to the structure
320 if ( !this->isActivated(tStep) ) {
321 answer.zero();
322 return;
323 }
324}
325
326
327
328
329
330
331void
333 MatResponseMode rMode, TimeStep *tStep)
334{
336 bool matStiffSymmFlag = cs->isCharacteristicMtrxSymmetric(rMode);
337
338 answer.clear();
339
340 if ( !this->isActivated(tStep) ) {
341 return;
342 }
343
344 // Compute matrix from material stiffness (total stiffness for small def.) - B^T * dS/dE * B
345 if ( integrationRulesArray.size() == 1 ) {
346 FloatMatrix B, D, DB;
347 for ( auto &gp : * this->giveDefaultIntegrationRulePtr() ) {
348 // Engineering (small strain) stiffness
349 if ( nlGeometry == 0 ) {
350 this->computeBmatrixAt(gp, B);
351 this->computeConstitutiveMatrixAt(D, rMode, gp, tStep);
352 } else if ( nlGeometry == 1 ) {
353 if ( this->domain->giveEngngModel()->giveFormulation() == AL ) { // Material stiffness dC/de
354 this->computeBmatrixAt(gp, B);
356 cs->giveStiffnessMatrix_dCde(D, rMode, gp, tStep);
357 } else { // Material stiffness dP/dF
358 this->computeBHmatrixAt(gp, B);
359 this->computeConstitutiveMatrix_dPdF_At(D, rMode, gp, tStep);
360 }
361 }
362
363 double dV = this->computeVolumeAround(gp);
364 DB.beProductOf(D, B);
365 if ( matStiffSymmFlag ) {
366 answer.plusProductSymmUpper(B, DB, dV);
367 } else {
368 answer.plusProductUnsym(B, DB, dV);
369 }
370 }
371
372 if ( this->domain->giveEngngModel()->giveFormulation() == AL ) {
373 FloatMatrix initialStressMatrix;
374 this->computeInitialStressMatrix(initialStressMatrix, tStep);
375 answer.add(initialStressMatrix);
376 }
377 } else {
378 if ( this->domain->giveEngngModel()->giveFormulation() == AL ) {
379 OOFEM_ERROR("Updated lagrangian not supported yet");
380 }
381
382 int iStartIndx, iEndIndx, jStartIndx, jEndIndx;
383 FloatMatrix Bi, Bj, D, Dij, DBj;
384 for ( int i = 0; i < ( int ) integrationRulesArray.size(); i++ ) {
385 iStartIndx = integrationRulesArray [ i ]->getStartIndexOfLocalStrainWhereApply();
386 iEndIndx = integrationRulesArray [ i ]->getEndIndexOfLocalStrainWhereApply();
387 for ( int j = 0; j < ( int ) integrationRulesArray.size(); j++ ) {
388 IntegrationRule *iRule;
389 jStartIndx = integrationRulesArray [ j ]->getStartIndexOfLocalStrainWhereApply();
390 jEndIndx = integrationRulesArray [ j ]->getEndIndexOfLocalStrainWhereApply();
391 if ( i == j ) {
392 iRule = integrationRulesArray [ i ].get();
393 } else if ( integrationRulesArray [ i ]->giveNumberOfIntegrationPoints() < integrationRulesArray [ j ]->giveNumberOfIntegrationPoints() ) {
394 iRule = integrationRulesArray [ i ].get();
395 } else {
396 iRule = integrationRulesArray [ j ].get();
397 }
398
399 for ( GaussPoint *gp : * iRule ) {
400 // Engineering (small strain) stiffness dSig/dEps
401 if ( nlGeometry == 0 ) {
402 this->computeBmatrixAt(gp, Bi, iStartIndx, iEndIndx);
403 this->computeConstitutiveMatrixAt(D, rMode, gp, tStep);
404 } else if ( nlGeometry == 1 ) {
405 if ( this->domain->giveEngngModel()->giveFormulation() == AL ) { // Material stiffness dC/de
406 this->computeBmatrixAt(gp, Bi);
407 cs->giveStiffnessMatrix_dCde(D, rMode, gp, tStep);
408 } else { // Material stiffness dP/dF
409 this->computeBHmatrixAt(gp, Bi);
410 this->computeConstitutiveMatrix_dPdF_At(D, rMode, gp, tStep);
411 //cs->giveStiffnessMatrix_dPdF(D, rMode, gp, tStep);
412 }
413 }
414
415
416 if ( i != j ) {
417 if ( nlGeometry == 0 ) {
418 this->computeBmatrixAt(gp, Bj, jStartIndx, jEndIndx);
419 } else if ( nlGeometry == 1 ) {
420 if ( this->domain->giveEngngModel()->giveFormulation() == AL ) {
421 this->computeBmatrixAt(gp, Bj);
422 } else {
423 this->computeBHmatrixAt(gp, Bj);
424 }
425 }
426 } else {
427 Bj = Bi;
428 }
429
430 Dij.beSubMatrixOf(D, iStartIndx, iEndIndx, jStartIndx, jEndIndx);
431 double dV = this->computeVolumeAround(gp);
432 DBj.beProductOf(Dij, Bj);
433 if ( matStiffSymmFlag ) {
434 answer.plusProductSymmUpper(Bi, DBj, dV);
435 } else {
436 answer.plusProductUnsym(Bi, DBj, dV);
437 }
438 }
439 }
440 }
441 }
442
443 if ( matStiffSymmFlag ) {
444 answer.symmetrized();
445 }
446}
447
448
449void
451 MatResponseMode rMode, TimeStep *tStep)
452{
454 bool matStiffSymmFlag = cs->isCharacteristicMtrxSymmetric(rMode);
455
456 answer.clear();
457 if ( !this->isActivated(tStep) ) {
458 return;
459 }
460
461 FloatMatrix temp;
462 FloatMatrix *m = & answer;
463 if ( this->giveInterpolation() && this->giveInterpolation()->hasSubPatchFormulation() ) {
464 m = & temp;
465 }
466
467 // Compute matrix from material stiffness
468 FloatMatrix B, D, DB;
469 IntArray irlocnum;
470 for ( auto &iRule : integrationRulesArray ) {
471 for ( auto &gp : * iRule ) {
472 if ( nlGeometry == 0 ) {
473 this->computeBmatrixAt(gp, B);
474 this->computeConstitutiveMatrixAt(D, rMode, gp, tStep);
475 } else if ( nlGeometry == 1 ) {
476 if ( this->domain->giveEngngModel()->giveFormulation() == AL ) { // Material stiffness dC/de
477 this->computeBmatrixAt(gp, B);
478 cs->giveStiffnessMatrix_dCde(D, rMode, gp, tStep);
479 } else { // Material stiffness dP/dF
480 this->computeBHmatrixAt(gp, B);
481 this->computeConstitutiveMatrix_dPdF_At(D, rMode, gp, tStep);
482 //cs->giveStiffnessMatrix_dPdF(D, rMode, gp, tStep);
483 }
484 }
485
486 double dV = this->computeVolumeAround(gp);
487 DB.beProductOf(D, B);
488 if ( matStiffSymmFlag ) {
489 m->plusProductSymmUpper(B, DB, dV);
490 } else {
491 m->plusProductUnsym(B, DB, dV);
492 }
493 }
494
495 // localize irule contribution into element matrix
496 if ( this->giveIntegrationRuleLocalCodeNumbers(irlocnum, * iRule) ) {
497 answer.assemble(* m, irlocnum);
498 m->clear();
499 }
500 }
501
502 if ( matStiffSymmFlag ) {
503 answer.symmetrized();
504 }
505}
506
507
508
509
510void
512{
513 ParameterManager &ppm = this->domain->elementPPM;
516}
517
524
525int
527{
528 if ( this->nlGeometry == 2 ) {
529 OOFEM_ERROR("nlGeometry = 2 is not supported anymore. If access to F is needed, then the material \n should overload giveFirstPKStressVector which has F as input.");
530 }
531
532 if ( this->nlGeometry != 0 && this->nlGeometry != 1 ) {
533 OOFEM_ERROR("nlGeometry must be either 0 or 1 (%d not supported)", this->nlGeometry);
534 } else {
535 return 1;
536 }
537}
538} // end namespace oofem
virtual Material * giveMaterial(IntegrationPoint *ip) const =0
hidden by virtual oofem::Material* TransportCrossSection::giveMaterial() const
void setField(int item, InputFieldType id)
virtual bool isActivated(TimeStep *tStep)
Definition element.C:838
virtual FEInterpolation * giveInterpolation() const
Definition element.h:648
void initializeFrom(InputRecord &ir, int priority) override
Definition element.C:687
virtual int giveIntegrationRuleLocalCodeNumbers(IntArray &answer, IntegrationRule &ie)
Definition element.h:747
void computeVectorOf(ValueModeType u, TimeStep *tStep, FloatArray &answer)
Definition element.C:103
std::vector< std ::unique_ptr< IntegrationRule > > integrationRulesArray
Definition element.h:157
CrossSection * giveCrossSection()
Definition element.C:534
virtual IntegrationRule * giveDefaultIntegrationRulePtr()
Definition element.h:886
virtual double computeVolumeAround(GaussPoint *gp)
Definition element.h:530
virtual double giveTransformationJacobian(const FloatArray &lcoords, const FEICellGeometry &cellgeo) const
Definition feinterpol.C:81
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 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
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 subtract(const FloatArray &src)
Definition floatarray.C:320
void plusProductSymmUpper(const FloatMatrix &a, const FloatMatrix &b, double dV)
void add(const FloatMatrix &a)
*Sets size of receiver to be an empty matrix It will have zero rows and zero columns size void clear()
void beSubMatrixOf(const FloatMatrix &src, Index topRow, Index bottomRow, Index topCol, Index bottomCol)
void plusProductUnsym(const FloatMatrix &a, const FloatMatrix &b, double dV)
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
double giveDeterminant() const
void beMatrixForm(const FloatArray &aArray)
void assemble(const FloatMatrix &src, const IntArray &loc)
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
Definition gausspoint.h:190
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Definition material.C:206
virtual void computeDeformationGradientVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
void computeCauchyStressVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
void initializeFrom(InputRecord &ir, int priority) override
NLStructuralElement(int n, Domain *d)
void computeFirstPKStressVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
void computeInitialStressMatrix(FloatMatrix &answer, TimeStep *tStep) override
static ParamKey IPK_NLStructuralElement_nlgeoflag
double computeCurrentVolume(TimeStep *tStep)
void computeStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep) override
void computeStiffnessMatrix_withIRulesAsSubcells(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
void giveInternalForcesVector_withIRulesAsSubcells(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord=0) override
virtual void computeBHmatrixAt(GaussPoint *gp, FloatMatrix &answer)
virtual void computeConstitutiveMatrix_dPdF_At(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep)=0
void giveInputRecord(DynamicInputRecord &input) override
int nlGeometry
Flag indicating if geometrical nonlinearities apply.
void giveInternalForcesVector(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord=0) override
virtual void giveStiffnessMatrix_dCde(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
virtual FloatArray giveFirstPKStresses(const FloatArray &reducedF, GaussPoint *gp, TimeStep *tStep) const
bool isCharacteristicMtrxSymmetric(MatResponseMode mode) const override=0
virtual void giveCauchyStresses(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedFIncrement, TimeStep *tStep)=0
virtual void computeConstitutiveMatrixAt(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep)=0
StructuralCrossSection * giveStructuralCrossSection()
Helper function which returns the structural cross-section for the element.
StructuralElement(int n, Domain *d)
virtual void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int lowerIndx=1, int upperIndx=ALL_STRAINS)=0
void giveInputRecord(DynamicInputRecord &input) override
std::unique_ptr< FloatArray > initialDisplacements
Initial displacement vector, describes the initial nodal displacements when element has been casted.
virtual void computeStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
virtual void computeStressVector(FloatArray &answer, const FloatArray &strain, GaussPoint *gp, TimeStep *tStep)=0
const FloatArray & givePVector() const
Returns the const pointer to receiver's first Piola-Kirchhoff stress vector.
const FloatArray & giveStressVector() const
Returns the const pointer to receiver's stress vector.
const FloatArray & giveCVector() const
Returns the const pointer to receiver's Cauchy stress vector.
static void giveReducedSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the full unsymmetric Voigt vector (2nd order tensor) to reduced form.
static void giveReducedVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the full symmetric Voigt vector (2nd order tensor) to reduced form.
static int giveSizeOfVoigtSymVector(MaterialMode mmode)
#define OOFEM_ERROR(...)
Definition error.h:79
@ AL
Updated Lagrange.
Definition fmode.h:45
#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