OOFEM  2.4
OOFEM.org - Object Oriented Finite Element Solver
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 - 2013 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 "../sm/Elements/nlstructuralelement.h"
36 #include "../sm/Materials/structuralms.h"
37 #include "../sm/CrossSections/structuralcrosssection.h"
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 
51 namespace oofem {
53  StructuralElement(n, aDomain)
54  // Constructor. Creates an element with number n, belonging to aDomain.
55 {
56  nlGeometry = 0; // Geometrical nonlinearities disabled as default
57 }
58 
59 
60 double
62 {
63  double vol=0.0;
64  for ( auto &gp: *this->giveDefaultIntegrationRulePtr() ) {
65  FloatArray F;
66  FloatMatrix Fm;
67 
68 
70  Fm.beMatrixForm(F);
71  double J = Fm.giveDeterminant();
72 
73  FEInterpolation *interpolation = this->giveInterpolation();
74  double detJ = fabs( ( interpolation->giveTransformationJacobian( gp->giveNaturalCoordinates(), FEIElementGeometryWrapper(this) ) ) );
75 
76  vol += gp->giveWeight() * detJ * J;
77  }
78 
79  return vol;
80 }
81 
82 
83 void
85 {
86  // Computes the deformation gradient in the Voigt format at the Gauss point gp of
87  // the receiver at time step tStep.
88  // Order of components: 11, 22, 33, 23, 13, 12, 32, 31, 21 in the 3D.
89 
90  // Obtain the current displacement vector of the element and subtract initial displacements (if present)
91  FloatArray u;
92  this->computeVectorOf({D_u, D_v, D_w}, VM_Total, tStep, u); // solution vector
93  if ( initialDisplacements ) {
95  }
96 
97  // Displacement gradient H = du/dX
98  FloatMatrix B;
99  this->computeBHmatrixAt(gp, B);
100  answer.beProductOf(B, u);
101 
102  // Deformation gradient F = H + I
103  MaterialMode matMode = gp->giveMaterialMode();
104  if ( matMode == _3dMat || matMode == _PlaneStrain ) {
105  answer.at(1) += 1.0;
106  answer.at(2) += 1.0;
107  answer.at(3) += 1.0;
108  } else if ( matMode == _PlaneStress ) {
109  answer.at(1) += 1.0;
110  answer.at(2) += 1.0;
111  } else if ( matMode == _1dMat ) {
112  answer.at(1) += 1.0;
113  } else {
114  OOFEM_ERROR("MaterialMode is not supported yet (%s)", __MaterialModeToString(matMode) );
115  }
116 }
117 
118 
119 void
121 {
122  // Computes the first Piola-Kirchhoff stress vector containing the stresses at the Gauss point
123  // gp of the receiver at time step tStep. The deformation gradient F is computed and sent as
124  // input to the material model.
126 
127  FloatArray vF;
128  this->computeDeformationGradientVector(vF, gp, tStep);
129  cs->giveFirstPKStresses(answer, gp, vF, tStep);
130 }
131 
132 void
134 {
135  // Computes the first Piola-Kirchhoff stress vector containing the stresses at the Gauss point
136  // gp of the receiver at time step tStep. The deformation gradient F is computed and sent as
137  // input to the material model.
139 
140  FloatArray vF;
141  this->computeDeformationGradientVector(vF, gp, tStep);
142  cs->giveCauchyStresses(answer, gp, vF, tStep);
143 }
144 
145 void
147 {
148  FloatMatrix B;
149  FloatArray vStress, vStrain, u;
150 
151  // This function can be quite costly to do inside the loops when one has many slave dofs.
152  this->computeVectorOf(VM_Total, tStep, u);
153  // subtract initial displacements, if defined
154  if ( initialDisplacements ) {
156  }
157 
158  // zero answer will resize accordingly when adding first contribution
159  answer.clear();
160 
161  for ( auto &gp: *this->giveDefaultIntegrationRulePtr() ) {
162  StructuralMaterialStatus *matStat = static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() );
163 
164  // Engineering (small strain) stress
165  if ( nlGeometry == 0 ) {
166  this->computeBmatrixAt(gp, B);
167  if ( useUpdatedGpRecord == 1 ) {
168  vStress = matStat->giveStressVector();
169  } else {
171  if ( !this->isActivated(tStep) ) {
172  vStrain.resize( StructuralMaterial :: giveSizeOfVoigtSymVector( gp->giveMaterialMode() ) );
173  vStrain.zero();
174  }
175  vStrain.beProductOf(B, u);
176  this->computeStressVector(vStress, vStrain, gp, tStep);
177  }
178  } else if ( nlGeometry == 1 ) { // First Piola-Kirchhoff stress
179  if ( this->domain->giveEngngModel()->giveFormulation() == AL ) { // Cauchy stress
180  if ( useUpdatedGpRecord == 1 ) {
181  vStress = matStat->giveCVector();
182  } else {
183  this->computeCauchyStressVector(vStress, gp, tStep);
184  }
185 
186  this->computeBmatrixAt(gp, B);
187  } else { // First Piola-Kirchhoff stress
188  if ( useUpdatedGpRecord == 1 ) {
189  vStress = matStat->givePVector();
190  } else {
191  this->computeFirstPKStressVector(vStress, gp, tStep);
193  }
194 
195  this->computeBHmatrixAt(gp, B);
196  }
197  }
198 
199  if ( vStress.giveSize() == 0 ) {
200  break;
201  }
202 
203  // Compute nodal internal forces at nodes as f = B^T*Stress dV
204  double dV = this->computeVolumeAround(gp);
205 
206  if ( nlGeometry == 1 ) { // First Piola-Kirchhoff stress
207  if ( vStress.giveSize() == 9 ) {
208  FloatArray stressTemp;
209  StructuralMaterial :: giveReducedVectorForm( stressTemp, vStress, gp->giveMaterialMode() );
210  answer.plusProduct(B, stressTemp, dV);
211  } else {
212  answer.plusProduct(B, vStress, dV);
213  }
214  } else {
215  if ( vStress.giveSize() == 6 ) {
216  // It may happen that e.g. plane strain is computed
217  // using the default 3D implementation. If so,
218  // the stress needs to be reduced.
219  // (Note that no reduction will take place if
220  // the simulation is actually 3D.)
221  FloatArray stressTemp;
222  StructuralMaterial :: giveReducedSymVectorForm( stressTemp, vStress, gp->giveMaterialMode() );
223  answer.plusProduct(B, stressTemp, dV);
224  } else {
225  answer.plusProduct(B, vStress, dV);
226  }
227  }
228  }
229 
230  // If inactive: update fields but do not give any contribution to the internal forces
231  if ( !this->isActivated(tStep) ) {
232  answer.zero();
233  return;
234  }
235 }
236 
237 
238 void
240  TimeStep *tStep, int useUpdatedGpRecord)
241 {
242  /*
243  * Returns nodal representation of real internal forces computed from first Piola-Kirchoff stress
244  * if useGpRecord == 1 then stresses stored in the gp are used, otherwise stresses are computed
245  * this must be done if you want internal forces after element->updateYourself() has been called
246  * for the same time step.
247  * The integration procedure uses an integrationRulesArray for numerical integration.
248  * Each integration rule is considered to represent a separate sub-cell/element. Typically this would be used when
249  * integration of the element domain needs special treatment, e.g. when using the XFEM.
250  */
251 
252  FloatMatrix B;
253  FloatArray vStress, vStrain;
254 
255  IntArray irlocnum;
256  FloatArray *m = & answer, temp;
257  if ( this->giveInterpolation() && this->giveInterpolation()->hasSubPatchFormulation() ) {
258  m = & temp;
259  }
260 
261  // zero answer will resize accordingly when adding first contribution
262  answer.clear();
263 
264 
265  // loop over individual integration rules
266  for ( auto &iRule: integrationRulesArray ) {
267  for ( GaussPoint *gp: *iRule ) {
268  StructuralMaterialStatus *matStat = static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() );
269 
270  if ( nlGeometry == 0 ) {
271  this->computeBmatrixAt(gp, B);
272  if ( useUpdatedGpRecord == 1 ) {
273  vStress = matStat->giveStressVector();
274  } else {
275  this->computeStrainVector(vStrain, gp, tStep);
276  this->computeStressVector(vStress, vStrain, gp, tStep);
277  }
278  } else if ( nlGeometry == 1 ) {
279  if ( this->domain->giveEngngModel()->giveFormulation() == AL ) { // Cauchy stress
280  if ( useUpdatedGpRecord == 1 ) {
281  vStress = matStat->giveCVector();
282  } else {
283  this->computeCauchyStressVector(vStress, gp, tStep);
284  }
285 
286  this->computeBmatrixAt(gp, B);
287  } else { // First Piola-Kirchhoff stress
288  if ( useUpdatedGpRecord == 1 ) {
289  vStress = matStat->givePVector();
290  } else {
291  this->computeFirstPKStressVector(vStress, gp, tStep);
292  }
293 
294  this->computeBHmatrixAt(gp, B);
295  }
296  }
297 
298  if ( vStress.giveSize() == 0 ) { //@todo is this really necessary?
299  break;
300  }
301 
302  // compute nodal representation of internal forces at nodes as f = B^T*stress dV
303  double dV = this->computeVolumeAround(gp);
304  m->plusProduct(B, vStress, dV);
305 
306  // localize irule contribution into element matrix
307  if ( this->giveIntegrationRuleLocalCodeNumbers(irlocnum, *iRule) ) {
308  answer.assemble(* m, irlocnum);
309  m->clear();
310  }
311  }
312  }
313 
314  // if inactive: update fields but do not give any contribution to the structure
315  if ( !this->isActivated(tStep) ) {
316  answer.zero();
317  return;
318  }
319 }
320 
321 
322 
323 
324 
325 
326 void
328  MatResponseMode rMode, TimeStep *tStep)
329 {
331  bool matStiffSymmFlag = cs->isCharacteristicMtrxSymmetric(rMode);
332 
333  answer.clear();
334 
335  if ( !this->isActivated(tStep) ) {
336  return;
337  }
338 
339  // Compute matrix from material stiffness (total stiffness for small def.) - B^T * dS/dE * B
340  if ( integrationRulesArray.size() == 1 ) {
341  FloatMatrix B, D, DB;
342  for ( auto &gp : *this->giveDefaultIntegrationRulePtr() ) {
343 
344  // Engineering (small strain) stiffness
345  if ( nlGeometry == 0 ) {
346  this->computeBmatrixAt(gp, B);
347  this->computeConstitutiveMatrixAt(D, rMode, gp, tStep);
348  } else if ( nlGeometry == 1 ) {
349  if ( this->domain->giveEngngModel()->giveFormulation() == AL ) { // Material stiffness dC/de
350  this->computeBmatrixAt(gp, B);
352  cs->giveStiffnessMatrix_dCde(D, rMode, gp, tStep);
353  } else { // Material stiffness dP/dF
354  this->computeBHmatrixAt(gp, B);
356  cs->giveStiffnessMatrix_dPdF(D, rMode, gp, tStep);
357  }
358  }
359 
360  double dV = this->computeVolumeAround(gp);
361  DB.beProductOf(D, B);
362  if ( matStiffSymmFlag ) {
363  answer.plusProductSymmUpper(B, DB, dV);
364  } else {
365  answer.plusProductUnsym(B, DB, dV);
366  }
367  }
368 
369  if ( this->domain->giveEngngModel()->giveFormulation() == AL ) {
370  FloatMatrix initialStressMatrix;
371  this->computeInitialStressMatrix(initialStressMatrix, tStep);
372  answer.add(initialStressMatrix);
373  }
374  } else {
375  if ( this->domain->giveEngngModel()->giveFormulation() == AL ) {
376  OOFEM_ERROR("Updated lagrangian not supported yet");
377  }
378 
379  int iStartIndx, iEndIndx, jStartIndx, jEndIndx;
380  FloatMatrix Bi, Bj, D, Dij, DBj;
381  for ( int i = 0; i < (int)integrationRulesArray.size(); i++ ) {
382  iStartIndx = integrationRulesArray [ i ]->getStartIndexOfLocalStrainWhereApply();
383  iEndIndx = integrationRulesArray [ i ]->getEndIndexOfLocalStrainWhereApply();
384  for ( int j = 0; j < (int)integrationRulesArray.size(); j++ ) {
385  IntegrationRule *iRule;
386  jStartIndx = integrationRulesArray [ j ]->getStartIndexOfLocalStrainWhereApply();
387  jEndIndx = integrationRulesArray [ j ]->getEndIndexOfLocalStrainWhereApply();
388  if ( i == j ) {
389  iRule = integrationRulesArray [ i ].get();
390  } else if ( integrationRulesArray [ i ]->giveNumberOfIntegrationPoints() < integrationRulesArray [ j ]->giveNumberOfIntegrationPoints() ) {
391  iRule = integrationRulesArray [ i ].get();
392  } else {
393  iRule = integrationRulesArray [ j ].get();
394  }
395 
396  for ( GaussPoint *gp: *iRule ) {
397 
398  // Engineering (small strain) stiffness dSig/dEps
399  if ( nlGeometry == 0 ) {
400  this->computeBmatrixAt(gp, Bi, iStartIndx, iEndIndx);
401  this->computeConstitutiveMatrixAt(D, rMode, gp, tStep);
402  } else if ( nlGeometry == 1 ) {
403  if ( this->domain->giveEngngModel()->giveFormulation() == AL ) { // Material stiffness dC/de
404  this->computeBmatrixAt(gp, Bi);
405  cs->giveStiffnessMatrix_dCde(D, rMode, gp, tStep);
406  } else { // Material stiffness dP/dF
407  this->computeBHmatrixAt(gp, Bi);
408  cs->giveStiffnessMatrix_dPdF(D, rMode, gp, tStep);
409  }
410  }
411 
412 
413  if ( i != j ) {
414  if ( nlGeometry == 0 ) {
415  this->computeBmatrixAt(gp, Bj, jStartIndx, jEndIndx);
416  } else if ( nlGeometry == 1 ) {
417  if ( this->domain->giveEngngModel()->giveFormulation() == AL ) {
418  this->computeBmatrixAt(gp, Bj);
419  } else {
420  this->computeBHmatrixAt(gp, Bj);
421  }
422  }
423  } else {
424  Bj = Bi;
425  }
426 
427  Dij.beSubMatrixOf(D, iStartIndx, iEndIndx, jStartIndx, jEndIndx);
428  double dV = this->computeVolumeAround(gp);
429  DBj.beProductOf(Dij, Bj);
430  if ( matStiffSymmFlag ) {
431  answer.plusProductSymmUpper(Bi, DBj, dV);
432  } else {
433  answer.plusProductUnsym(Bi, DBj, dV);
434  }
435  }
436  }
437  }
438  }
439 
440  if ( matStiffSymmFlag ) {
441  answer.symmetrized();
442  }
443 }
444 
445 
446 void
448  MatResponseMode rMode, TimeStep *tStep)
449 {
451  bool matStiffSymmFlag = cs->isCharacteristicMtrxSymmetric(rMode);
452 
453  answer.clear();
454  if ( !this->isActivated(tStep) ) {
455  return;
456  }
457 
458  FloatMatrix temp;
459  FloatMatrix *m = & answer;
460  if ( this->giveInterpolation() && this->giveInterpolation()->hasSubPatchFormulation() ) {
461  m = & temp;
462  }
463 
464  // Compute matrix from material stiffness
465  FloatMatrix B, D, DB;
466  IntArray irlocnum;
467  for ( auto &iRule: integrationRulesArray ) {
468  for ( auto &gp : *iRule ) {
469 
470  if ( nlGeometry == 0 ) {
471  this->computeBmatrixAt(gp, B);
472  this->computeConstitutiveMatrixAt(D, rMode, gp, tStep);
473  } else if ( nlGeometry == 1 ) {
474  if ( this->domain->giveEngngModel()->giveFormulation() == AL ) { // Material stiffness dC/de
475  this->computeBmatrixAt(gp, B);
476  cs->giveStiffnessMatrix_dCde(D, rMode, gp, tStep);
477  } else { // Material stiffness dP/dF
478  this->computeBHmatrixAt(gp, B);
479  cs->giveStiffnessMatrix_dPdF(D, rMode, gp, tStep);
480  }
481  }
482 
483  double dV = this->computeVolumeAround(gp);
484  DB.beProductOf(D, B);
485  if ( matStiffSymmFlag ) {
486  m->plusProductSymmUpper(B, DB, dV);
487  } else {
488  m->plusProductUnsym(B, DB, dV);
489  }
490  }
491 
492  // localize irule contribution into element matrix
493  if ( this->giveIntegrationRuleLocalCodeNumbers(irlocnum, *iRule) ) {
494  answer.assemble(* m, irlocnum);
495  m->clear();
496  }
497  }
498 
499  if ( matStiffSymmFlag ) {
500  answer.symmetrized();
501  }
502 }
503 
504 
505 void
507 {
508  FloatArray stress;
509  FloatMatrix B, stress_ident, stress_identFull;
510  IntArray indx;
511 
512  answer.clear();
513 
514  // assemble initial stress matrix
515  for ( auto &gp : *this->giveDefaultIntegrationRulePtr() ) {
516  // This function fetches the full form of the tensor
517  this->giveIPValue(stress, gp, IST_StressTensor, tStep);
518  if ( stress.giveSize() ) {
519  // Construct the stress_ident matrix
520  // The complicated part, the not-so-pretty product here: s_il delta_jk
521  {
522  stress_identFull.at(1, 1) = stress.at(1);
523  stress_identFull.at(2, 2) = stress.at(2);
524  stress_identFull.at(3, 3) = stress.at(3);
525  stress_identFull.at(4, 4) = stress.at(2) + stress.at(3);
526  stress_identFull.at(5, 5) = stress.at(1) + stress.at(3);
527  stress_identFull.at(6, 6) = stress.at(1) + stress.at(2);
528 
529  stress_identFull.at(1, 5) = stress.at(5);
530  stress_identFull.at(1, 6) = stress.at(6);
531 
532  stress_identFull.at(2, 4) = stress.at(4);
533  stress_identFull.at(2, 5) = stress.at(6);
534 
535  stress_identFull.at(3, 4) = stress.at(4);
536  stress_identFull.at(3, 5) = stress.at(5);
537 
538  stress_identFull.at(4, 5) = stress.at(6);
539  stress_identFull.at(4, 6) = stress.at(5);
540  stress_identFull.at(5, 6) = stress.at(4);
541  }
542  stress_ident.beSubMatrixOf(stress_identFull, indx, indx);
543  stress_ident.symmetrized();
544  OOFEM_WARNING("Implementation not tested yet!");
545 
546  this->computeBmatrixAt(gp, B);
547  answer.plusProductSymmUpper( B, stress_ident, this->computeVolumeAround(gp) );
548  }
549  }
550 
551  answer.symmetrized();
552 }
553 
554 
555 
558 {
559  IRResultType result; // Required by IR_GIVE_FIELD macro
560 
561  nlGeometry = 0;
563 
565 }
566 
568 {
570 
572 }
573 
574 int
576 {
577  if ( this->nlGeometry == 2 ) {
578  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.");
579  return 0;
580  }
581 
582  if ( this->nlGeometry != 0 && this->nlGeometry != 1 ) {
583  OOFEM_ERROR("nlGeometry must be either 0 or 1 (%d not supported)", this->nlGeometry);
584  return 0;
585  } else {
586  return 1;
587  }
588 }
589 } // end namespace oofem
double giveDeterminant() const
Returns the trace (sum of diagonal components) of the receiver.
Definition: floatmatrix.C:1408
static int giveSizeOfVoigtSymVector(MaterialMode mmode)
Returns the size of symmetric part of a reduced stress/strain vector according to given mode...
void setField(int item, InputFieldType id)
virtual bool isActivated(TimeStep *tStep)
Definition: element.C:793
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
Definition: gausspoint.h:191
void subtract(const FloatArray &src)
Subtracts array src to receiver.
Definition: floatarray.C:258
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in full form.
int nlGeometry
Flag indicating if geometrical nonlinearities apply.
Class and object Domain.
Definition: domain.h:115
void computeVectorOf(ValueModeType u, TimeStep *tStep, FloatArray &answer)
Returns local vector of unknowns.
Definition: element.C:86
virtual IntegrationRule * giveDefaultIntegrationRulePtr()
Access method for default integration rule.
Definition: element.h:822
virtual double giveTransformationJacobian(const FloatArray &lcoords, const FEICellGeometry &cellgeo)
Evaluates the determinant of the transformation.
Definition: feinterpol.C:43
Domain * domain
Link to domain object, useful for communicating with other FEM components.
Definition: femcmpnn.h:82
const FloatArray & givePVector() const
Returns the const pointer to receiver&#39;s first Piola-Kirchhoff stress vector.
Definition: structuralms.h:109
std::unique_ptr< FloatArray > initialDisplacements
Initial displacement vector, describes the initial nodal displacements when element has been casted...
virtual void computeConstitutiveMatrixAt(FloatMatrix &answer, MatResponseMode rMode, GaussPoint *gp, TimeStep *tStep)=0
Computes constitutive matrix of receiver.
double & at(int i)
Coefficient access function.
Definition: floatarray.h:131
void beSubMatrixOf(const FloatMatrix &src, int topRow, int bottomRow, int topCol, int bottomCol)
Assigns to the receiver the sub-matrix of another matrix.
Definition: floatmatrix.C:962
This class implements a structural material status information.
Definition: structuralms.h:65
Updated Lagrange.
Definition: fmode.h:45
void clear()
Clears receiver (zero size).
Definition: floatarray.h:206
void giveInternalForcesVector_withIRulesAsSubcells(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord=0)
Evaluates nodal representation of real internal forces.
virtual int checkConsistency()
Performs consistency check.
EngngModel * giveEngngModel()
Returns engineering model to which receiver is associated.
Definition: domain.C:433
const FloatArray & giveCVector() const
Returns the const pointer to receiver&#39;s Cauchy stress vector.
Definition: structuralms.h:111
#define _IFT_NLStructuralElement_nlgeoflag
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record string of receiver.
MaterialMode
Type representing material mode of integration point.
Definition: materialmode.h:89
Class implementing an array of integers.
Definition: intarray.h:61
MatResponseMode
Describes the character of characteristic material matrix.
virtual FEInterpolation * giveInterpolation() const
Definition: element.h:629
Abstract base class representing integration rule.
void beMatrixForm(const FloatArray &aArray)
Definition: floatmatrix.C:1657
virtual void giveStiffnessMatrix_dPdF(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
Computes the material stiffness matrix dPdF of receiver in a given integration point, respecting its history.
Class representing a general abstraction for finite element interpolation class.
Definition: feinterpol.h:132
void plusProductUnsym(const FloatMatrix &a, const FloatMatrix &b, double dV)
Adds to the receiver the product .
Definition: floatmatrix.C:780
const char * __MaterialModeToString(MaterialMode _value)
Definition: cltypes.C:314
void computeFirstPKStressVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
Computes the first Piola-Kirchhoff stress tensor on Voigt format.
Abstract base class for all "structural" finite elements.
double computeCurrentVolume(TimeStep *tStep)
Computes the current volume of element.
virtual double computeVolumeAround(GaussPoint *gp)
Returns volume related to given integration point.
Definition: element.h:518
virtual bool isCharacteristicMtrxSymmetric(MatResponseMode mode)=0
Check for symmetry of stiffness matrix.
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.
#define OOFEM_ERROR(...)
Definition: error.h:61
virtual void giveFirstPKStresses(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedFIncrement, TimeStep *tStep)=0
Computes the First Piola-Kirchoff stress vector for a given deformation gradient and integration poin...
StructuralCrossSection * giveStructuralCrossSection()
Helper function which returns the structural cross-section for the element.
virtual void giveCauchyStresses(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedFIncrement, TimeStep *tStep)=0
Computes the Cauchy stress vector for a given increment of deformation gradient and given integration...
virtual void computeStressVector(FloatArray &answer, const FloatArray &strain, GaussPoint *gp, TimeStep *tStep)=0
Computes the stress vector of receiver at given integration point, at time step tStep.
Wrapper around element definition to provide FEICellGeometry interface.
Definition: feinterpol.h:95
virtual fMode giveFormulation()
Indicates type of non linear computation (total or updated formulation).
Definition: engngm.h:1069
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Receiver becomes the result of the product of aMatrix and anArray.
Definition: floatarray.C:676
virtual void computeStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
Compute strain vector of receiver evaluated at given integration point at given time step from elemen...
void plusProductSymmUpper(const FloatMatrix &a, const FloatMatrix &b, double dV)
Adds to the receiver the product .
Definition: floatmatrix.C:698
double at(int i, int j) const
Coefficient access function.
Definition: floatmatrix.h:176
virtual int giveIntegrationRuleLocalCodeNumbers(IntArray &answer, IntegrationRule &ie)
Assembles the code numbers of given integration element (sub-patch) This is done by obtaining list of...
Definition: element.h:700
void computeCauchyStressVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
Computes the Cauchy stress tensor on Voigt format.
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record string of receiver.
Class representing vector of real numbers.
Definition: floatarray.h:82
virtual void computeDeformationGradientVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
Computes the deformation gradient in Voigt form at integration point ip and at time step tStep...
Implementation of matrix containing floating point numbers.
Definition: floatmatrix.h:94
IRResultType
Type defining the return values of InputRecord reading operations.
Definition: irresulttype.h:47
virtual void computeStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
Computes the stiffness matrix of receiver.
const FloatArray & giveStressVector() const
Returns the const pointer to receiver&#39;s stress vector.
Definition: structuralms.h:107
void assemble(const FloatArray &fe, const IntArray &loc)
Assembles the array fe (typically, the load vector of a finite element) into the receiver, using loc as location array.
Definition: floatarray.C:551
Class representing the general Input Record.
Definition: inputrecord.h:101
void add(const FloatMatrix &a)
Adds matrix to the receiver.
Definition: floatmatrix.C:1023
NLStructuralElement(int n, Domain *d)
Constructor.
void zero()
Zeroes all coefficients of receiver.
Definition: floatarray.C:658
Class representing the a dynamic Input Record.
virtual void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int lowerIndx=1, int upperIndx=ALL_STRAINS)=0
Computes the geometrical matrix of receiver in given integration point.
std::vector< std::unique_ptr< IntegrationRule > > integrationRulesArray
List of integration rules of receiver (each integration rule contains associated integration points a...
Definition: element.h:170
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
virtual void computeBHmatrixAt(GaussPoint *gp, FloatMatrix &answer)
Computes a matrix which, multiplied by the column matrix of nodal displacements, gives the displaceme...
virtual void giveInternalForcesVector(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord=0)
Evaluates nodal representation of real internal forces.
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Macro facilitating the use of input record reading methods.
Definition: inputrecord.h:78
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
Assigns to the receiver product of .
Definition: floatmatrix.C:337
int giveSize() const
Returns the size of receiver.
Definition: floatarray.h:218
Abstract base class for all structural cross section models.
the oofem namespace is to define a context or scope in which all oofem names are defined.
void assemble(const FloatMatrix &src, const IntArray &loc)
Assembles the contribution using localization array into receiver.
Definition: floatmatrix.C:251
void clear()
Sets size of receiver to be an empty matrix. It will have zero rows and zero columns size...
Definition: floatmatrix.h:516
void symmetrized()
Initializes the lower half of the receiver according to the upper half.
Definition: floatmatrix.C:1576
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
virtual void computeInitialStressMatrix(FloatMatrix &answer, TimeStep *tStep)
Computes the initial stiffness matrix of receiver.
virtual void giveStiffnessMatrix_dCde(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
Computes the material stiffness matrix dCde of receiver in a given integration point, respecting its history.
Class representing integration point in finite element program.
Definition: gausspoint.h:93
#define OOFEM_WARNING(...)
Definition: error.h:62
Class representing solution step.
Definition: timestep.h:80
void computeStiffnessMatrix_withIRulesAsSubcells(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
Computes the stiffness matrix of receiver.
void resize(int s)
Resizes receiver towards requested size.
Definition: floatarray.C:631
void plusProduct(const FloatMatrix &b, const FloatArray &s, double dV)
Adds the product .
Definition: floatarray.C:226

This page is part of the OOFEM documentation. Copyright (c) 2011 Borek Patzak
Project e-mail: info@oofem.org
Generated at Tue Jan 2 2018 20:07:30 for OOFEM by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2011