OOFEM 3.0
Loading...
Searching...
No Matches
graddamageelement.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 *
14 * Copyright (C) 1993 - 2025 Borek Patzak
15 *
16 *
17 *
18 * Czech Technical University, Faculty of Civil Engineering,
19 * Department of Structural Mechanics, 166 29 Prague, Czech Republic
20 *
21 * This library is free software; you can redistribute it and/or
22 * modify it under the terms of the GNU Lesser General Public
23 * License as published by the Free Software Foundation; either
24 * version 2.1 of the License, or (at your option) any later version.
25 *
26 * This program is distributed in the hope that it will be useful,
27 * but WITHOUT ANY WARRANTY; without even the implied warranty of
28 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
29 * Lesser General Public License for more details.
30 *
31 * You should have received a copy of the GNU Lesser General Public
32 * License along with this library; if not, write to the Free Software
33 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
34 */
35
36
42#include "node.h"
43#include "material.h"
44#include "gausspoint.h"
46#include "floatmatrix.h"
47#include "floatarray.h"
48#include "intarray.h"
49#include "domain.h"
50#include "cltypes.h"
51#include "mathfem.h"
52#include "nonlocalbarrier.h"
53#include "engngm.h"
55
56#include <cstdio>
57
58namespace oofem {
59GradientDamageElement :: GradientDamageElement()
60{}
61
62
63
64void
65GradientDamageElement :: giveLocationArrayOfDofIDs(IntArray &locationArray_u, IntArray &locationArray_d, const UnknownNumberingScheme &s, const IntArray &dofIdArray_u, const IntArray &dofIdArray_d)
66{
67 // Routine to extract the location array of an element for given dofid array.
68 locationArray_u.clear();
69 locationArray_d.clear();
71 int k = 0;
72 IntArray nodalArray;
73 for ( int i = 1; i <= el->giveNumberOfDofManagers(); i++ ) {
74 DofManager *dMan = el->giveDofManager(i);
75 int itt = 1;
76 for ( int j = 1; j <= dofIdArray_u.giveSize(); j++ ) {
77 if ( dMan->hasDofID( ( DofIDItem ) dofIdArray_u.at(j) ) ) {
78 // Dof *d = dMan->giveDofWithID( dofIdArray_u.at( j ) );
79 locationArray_u.followedBy(k + itt);
80 }
81 itt++;
82 }
83 for ( int j = 1; j <= dofIdArray_d.giveSize(); j++ ) {
84 if ( dMan->hasDofID( ( DofIDItem ) dofIdArray_d.at(j) ) ) {
85 //Dof *d = dMan->giveDofWithID( dofIdArray_m.at( j ) );
86 locationArray_d.followedBy(k + itt);
87 }
88 itt++;
89 }
90 k += dMan->giveNumberOfDofs();
91 }
92}
93
94
95
96
97
98/*
99 * void
100 * GradientDamageElement :: setDisplacementLocationArray()
101 * {
102 * locU.resize(locSize);
103 *
104 * for ( int i = 1; i <= totalSize; i++ ) {
105 * if ( i < nSecNodes * nPrimVars + 1 ) {
106 * locU.at(i) = i + ( int ) ( ( ( i - 1 ) / nPrimVars ) ) * nSecVars;
107 * } else if ( i > nSecNodes * ( nPrimVars + nSecVars ) ) {
108 * locU.at(i - nSecVars * nSecNodes) = i;
109 * }
110 * }
111 * }
112 *
113 * void
114 * GradientDamageElement :: setNonlocalLocationArray()
115 * {
116 * locK.resize(nlSize);
117 * for ( int i = 1; i <= nlSize; i++ ) {
118 * locK.at(i) = i * nPrimVars + i;
119 * }
120 * }
121 */
122
123void
124GradientDamageElement :: computeDisplacementDegreesOfFreedom(FloatArray &answer, TimeStep *tStep)
125{
126 this->giveStructuralElement()->computeVectorOf({ D_u, D_v, D_w }, VM_Total, tStep, answer);
127}
128
129void
130GradientDamageElement :: computeNonlocalDegreesOfFreedom(FloatArray &answer, TimeStep *tStep, ValueModeType mode)
131{
132 this->giveStructuralElement()->computeVectorOf({ G_0 }, mode, tStep, answer);
133}
134
135void
136GradientDamageElement :: computeStressVector_and_localDamageDrivingVariable(FloatArray &answer, double &localDamageDrivingVariable, GaussPoint *gp, TimeStep *tStep)
137{
139
140 double nlDamageDrivingVariable;
141
142 int nlGeo = elem->giveGeometryMode();
146
147 if ( !gdmat ) {
148 OOFEM_ERROR("Material doesn't implement the required Gradient damage interface!");
149 }
150
151 this->computeNonlocalDamageDrivingVariable(nlDamageDrivingVariable, gp, tStep);
152 if ( nlGeo == 0 ) {
153 FloatArray Epsilon;
154 this->computeStrainVector(Epsilon, gp, tStep);
155 gdmat->giveRealStressVectorGradientDamage(answer, localDamageDrivingVariable, gp, Epsilon, nlDamageDrivingVariable, tStep);
156 } else if ( nlGeo == 1 ) {
157 if ( elem->giveDomain()->giveEngngModel()->giveFormulation() == TL ) {
158 FloatArray vF;
159 this->computeDeformationGradientVector(vF, gp, tStep);
160 gdmat->giveFirstPKStressVectorGradientDamage(answer, localDamageDrivingVariable, gp, vF, nlDamageDrivingVariable, tStep);
161 } else {
162 FloatArray vF;
163 this->computeDeformationGradientVector(vF, gp, tStep);
164 gdmat->giveCauchyStressVectorGradientDamage(answer, localDamageDrivingVariable, gp, vF, nlDamageDrivingVariable, tStep);
165 }
166 }
167}
168
169
170void
171GradientDamageElement :: computeStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
172{
173 FloatArray u;
174 FloatMatrix b;
176
178 elem->computeBmatrixAt(gp, b);
179 answer.beProductOf(b, u);
180}
181
182void
183GradientDamageElement :: computeDeformationGradientVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
184{
185 // Computes the deformation gradient in the Voigt format at the Gauss point gp of
186 // the receiver at time step tStep.
187 // Order of components: 11, 22, 33, 23, 13, 12, 32, 31, 21 in the 3D.
188
189 // Obtain the current displacement vector of the element and subtract initial displacements (if present)
190 FloatArray u;
191 FloatMatrix B;
193
195 // Displacement gradient H = du/dX
196 elem->computeBHmatrixAt(gp, B);
197 answer.beProductOf(B, u);
198
199 // Deformation gradient F = H + I
200 MaterialMode matMode = gp->giveMaterialMode();
201 if ( matMode == _3dMat || matMode == _PlaneStrain ) {
202 answer.at(1) += 1.0;
203 answer.at(2) += 1.0;
204 answer.at(3) += 1.0;
205 } else if ( matMode == _PlaneStress ) {
206 answer.at(1) += 1.0;
207 answer.at(2) += 1.0;
208 } else if ( matMode == _1dMat ) {
209 answer.at(1) += 1.0;
210 } else {
211 OOFEM_ERROR( "MaterialMode is not supported yet (%s)", __MaterialModeToString(matMode) );
212 }
213}
214
215void
216GradientDamageElement :: computeNonlocalDamageDrivingVariable(double &answer, GaussPoint *gp, TimeStep *tStep)
217{
218 FloatArray Nd, d;
219
220 this->computeNdMatrixAt(gp, Nd);
221 this->computeNonlocalDegreesOfFreedom(d, tStep);
222 answer = Nd.dotProduct(d);
223}
224
225
226void
227GradientDamageElement :: computeNonlocalDamageDrivingVariableGradient(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
228{
229 FloatMatrix Bd;
230 FloatArray d;
231
232 this->computeBdMatrixAt(gp, Bd);
233 this->computeNonlocalDegreesOfFreedom(d, tStep);
234 answer.beProductOf(Bd, d);
235}
236
237
238void
239GradientDamageElement :: giveInternalForcesVector_d(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord)
240{
242
243 double localDamageDrivingVariable = 0., f_dN = 0., nonlocalDamageDrivingVariable;
244 FloatArray Nd, stress, d_d, nonlocalDamageDrivingVariable_grad, f_dB;
245 FloatMatrix Bd;
246
248 int size = nSecVars * nSecNodes;
249
250 answer.resize(size);
251 for ( GaussPoint *gp : *elem->giveIntegrationRule(0) ) {
252 this->computeNdMatrixAt(gp, Nd);
253 this->computeBdMatrixAt(gp, Bd);
254 if ( useUpdatedGpRecord == 1 ) {
255 StructuralMaterialStatus *ms = static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() );
256 stress = ms->giveTempStressVector();
257 /* StructuralCrossSection *cs = elem->giveStructuralCrossSection();
258 * GradientDamageMaterialStatusExtensionInterface *gdms = dynamic_cast< GradientDamageMaterialStatusExtensionInterface * >(cs->giveMaterialInterface(GradientDamageMaterialStatusExtensionInterfaceType, gp) );
259 * localCumulatedStrain = gdms->giveLocalCumulatedStrain();
260 */
261 } else {
262 this->computeStressVector_and_localDamageDrivingVariable(stress, localDamageDrivingVariable, gp, tStep);
263 }
264
265 double dV = elem->computeVolumeAround(gp);
266 this->computeNonlocalDegreesOfFreedom(d_d, tStep);
267
268 nonlocalDamageDrivingVariable = Nd.dotProduct(d_d);
269 nonlocalDamageDrivingVariable_grad.beProductOf(Bd, d_d);
270
271 this->computeInternalForces_dN(f_dN, localDamageDrivingVariable, nonlocalDamageDrivingVariable, gp, tStep);
272 this->computeInternalForces_dB(f_dB, localDamageDrivingVariable, nonlocalDamageDrivingVariable_grad, gp, tStep);
273
274
276 if ( !gdmat ) {
277 OOFEM_ERROR("Material doesn't implement the required Gradient damage interface!");
278 }
279
280 FloatArray N_f, B_f;
281 N_f = Nd;
282 N_f.times(f_dN);
283 B_f.beTProductOf(Bd, f_dB);
284 answer.add(dV, N_f);
285 answer.add(dV, B_f);
286 }
287
288
289 // add penalty stiffness
290 if ( penalty > 0. ) {
291 FloatArray d;
292 this->computeNonlocalDegreesOfFreedom(d, tStep, VM_Incremental);
293 for ( int i = 1; i <= d.giveSize(); i++ ) {
294 if ( d.at(i) <= 0. ) {
295 answer.at(i) += penalty * d.at(i);
296 }
297 }
298 }
299}
300
301void
302GradientDamageElement :: computeInternalForces_dN(double &answer, double localDamageDrivingVariable, double nonlocalDamageDrivingVariable, GaussPoint *gp, TimeStep *tStep)
303{
308
309 if ( !gdmat ) {
310 OOFEM_ERROR("Material doesn't implement the required Gradient damage interface!");
311 }
312
313 gdmat->giveNonlocalInternalForces_N_factor(answer, nonlocalDamageDrivingVariable, gp, tStep);
314}
315
316
317void
318GradientDamageElement :: computeInternalForces_dB(FloatArray &answer, double localDamageDrivingVariable, const FloatArray nonlocalDamageDrivingVariable_grad, GaussPoint *gp, TimeStep *tStep)
319{
324
325 if ( !gdmat ) {
326 OOFEM_ERROR("Material doesn't implement the required Gradient damage interface!");
327 }
328
329 gdmat->giveNonlocalInternalForces_B_factor(answer, nonlocalDamageDrivingVariable_grad, gp, tStep);
330}
331
332
333void
334GradientDamageElement :: giveInternalForcesVector_u(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord)
335{
337 int nlGeo = elem->giveGeometryMode();
338 double localDamageDrivingVariable;
339 FloatArray BS, vStress, vRedStress;
340 FloatMatrix B;
341
342 for ( GaussPoint *gp : *elem->giveIntegrationRule(0) ) {
343 if ( nlGeo == 0 || elem->domain->giveEngngModel()->giveFormulation() == AL ) {
344 elem->computeBmatrixAt(gp, B);
345 } else if ( nlGeo == 1 ) {
346 elem->computeBHmatrixAt(gp, B);
347 }
348
349 if ( useUpdatedGpRecord == 1 ) {
350 StructuralMaterialStatus *ms = static_cast< StructuralMaterialStatus * >( gp->giveMaterialStatus() );
351 vStress = ms->giveTempStressVector();
352 /* StructuralCrossSection *cs = elem->giveStructuralCrossSection();
353 * GradientDamageMaterialStatusExtensionInterface *gdms = dynamic_cast< GradientDamageMaterialStatusExtensionInterface * >(cs->giveMaterialInterface(GradientDamageMaterialStatusExtensionInterfaceType, gp) );
354 * localCumulatedStrain = gdms->giveLocalCumulatedStrain();
355 */
356 } else {
357 this->computeStressVector_and_localDamageDrivingVariable(vStress, localDamageDrivingVariable, gp, tStep);
358 }
359
360 StructuralMaterial :: giveReducedSymVectorForm( vRedStress, vStress, gp->giveMaterialMode() );
361
362
363
364
365 if ( vStress.giveSize() == 0 ) {
366 break;
367 }
368
369 // Compute nodal internal forces at nodes as f = B^T*Stress dV
370 double dV = elem->computeVolumeAround(gp);
371 BS.beTProductOf(B, vRedStress);
372 answer.add(dV, BS);
373 }
374}
375
376
377void
378GradientDamageElement :: giveInternalForcesVector(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord)
379{
380 answer.resize(totalSize);
381 answer.zero();
382 FloatArray answerU;
383 answerU.resize(locSize);
384 answer.zero();
385 FloatArray answerD(nlSize);
386 answerD.zero();
387
388 this->giveInternalForcesVector_u(answerU, tStep, useUpdatedGpRecord);
389 this->giveInternalForcesVector_d(answerD, tStep, useUpdatedGpRecord);
390
391
392 answer.assemble(answerU, locationArray_u);
393 answer.assemble(answerD, locationArray_d);
394}
395
396
397
398
399void
400GradientDamageElement :: computeStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
401{
402 answer.resize(totalSize, totalSize);
403 answer.zero();
404
405 FloatMatrix answer1, answer2, answer3, answer4;
406 this->computeStiffnessMatrix_uu(answer1, rMode, tStep);
407 this->computeStiffnessMatrix_ud(answer2, rMode, tStep);
408 this->computeStiffnessMatrix_du(answer3, rMode, tStep);
409 this->computeStiffnessMatrix_dd(answer4, rMode, tStep);
410 answer.assemble(answer1, locationArray_u);
411 answer.assemble(answer2, locationArray_u, locationArray_d);
412 answer.assemble(answer3, locationArray_d, locationArray_u);
413 answer.assemble(answer4, locationArray_d);
414}
415
416
417void
418GradientDamageElement :: computeStiffnessMatrix_uu(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
419{
422 FloatMatrix B, D, DB;
423
424 int nlGeo = elem->giveGeometryMode();
425 bool matStiffSymmFlag = elem->giveCrossSection()->isCharacteristicMtrxSymmetric(rMode);
426 answer.clear();
427 for ( GaussPoint *gp : *elem->giveIntegrationRule(0) ) {
430 if ( !gdmat ) {
431 OOFEM_ERROR("Material doesn't implement the required DpGrad interface!");
432 }
433 if ( nlGeo == 0 ) {
434 elem->computeBmatrixAt(gp, B);
435 } else if ( nlGeo == 1 ) {
436 if ( elem->domain->giveEngngModel()->giveFormulation() == AL ) {
437 elem->computeBmatrixAt(gp, B);
438 } else {
439 elem->computeBHmatrixAt(gp, B);
440 }
441 }
442 gdmat->giveGradientDamageStiffnessMatrix_uu(D, rMode, gp, tStep);
443 double dV = elem->computeVolumeAround(gp);
444 DB.beProductOf(D, B);
445 if ( matStiffSymmFlag ) {
446 answer.plusProductSymmUpper(B, DB, dV);
447 } else {
448 answer.plusProductUnsym(B, DB, dV);
449 }
450 }
451
452
453 if ( matStiffSymmFlag ) {
454 answer.symmetrized();
455 }
456}
457
458
459void
460GradientDamageElement :: computeStiffnessMatrix_du(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
461{
462 double dV;
464 FloatArray Nd;
465 FloatMatrix B, DduB, Ddu;
467
468 answer.clear();
469
470 int nlGeo = elem->giveGeometryMode();
471
472 for ( auto &gp : *elem->giveIntegrationRule(0) ) {
475 if ( !gdmat ) {
476 OOFEM_ERROR("Material doesn't implement the required DpGrad interface!");
477 }
478
479 elem->computeBmatrixAt(gp, B);
480 if ( nlGeo == 1 ) {
481 if ( elem->domain->giveEngngModel()->giveFormulation() == AL ) {
482 elem->computeBmatrixAt(gp, B);
483 } else {
484 elem->computeBHmatrixAt(gp, B);
485 }
486 }
487
488 gdmat->giveGradientDamageStiffnessMatrix_du(Ddu, rMode, gp, tStep);
489 this->computeNdMatrixAt(gp, Nd);
490 dV = elem->computeVolumeAround(gp);
491 if ( Ddu.giveNumberOfRows() > 0 ) {
492 DduB.beTProductOf(Ddu, B);
494 answer.plusProductUnsym(Ndm, DduB, dV);
495 } else {
496 if ( answer.giveNumberOfColumns() == 0 ) {
497 answer.resize( Nd.giveSize(), B.giveNumberOfColumns() );
498 }
499 }
500 }
501}
502
503
504void
505GradientDamageElement :: computeStiffnessMatrix_dd(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
506{
508 double dV;
509 FloatMatrix Ddd_NN, Ddd_BB, Ddd_BN;
510 FloatArray Nd;
511 FloatMatrix Bd;
512 FloatMatrix Ddd;
514
515 answer.clear();
516 for ( auto &gp : *elem->giveIntegrationRule(0) ) {
519 if ( !gdmat ) {
520 OOFEM_ERROR("Material doesn't implement the required Gradient damage interface!");
521 }
522
523 this->computeNdMatrixAt(gp, Nd);
525 this->computeBdMatrixAt(gp, Bd);
526 dV = elem->computeVolumeAround(gp);
527
528 gdmat->giveGradientDamageStiffnessMatrix_dd_NN(Ddd_NN, rMode, gp, tStep);
529 gdmat->giveGradientDamageStiffnessMatrix_dd_BB(Ddd_BB, rMode, gp, tStep);
530 gdmat->giveGradientDamageStiffnessMatrix_dd_BN(Ddd_BN, rMode, gp, tStep);
531
532
533
534 if ( Ddd_NN.giveNumberOfRows() > 0 ) {
535
536 Ddd.beProductOf(Ddd_NN, Ndm);
537 answer.plusProductUnsym(Ndm, Ddd, dV);
538 } else {
539 answer.plusProductUnsym(Ndm, Ndm, dV);
540 }
541
542 Ddd.beProductOf(Ddd_BB, Bd);
543 answer.plusProductUnsym(Bd, Ddd, dV);
544
545
546
547 if ( Ddd_BN.giveNumberOfRows() > 0 ) {
548 Ddd.beProductOf(Ddd_BN, Ndm);
549 answer.plusProductUnsym(Bd, Ddd, dV);
550 }
551 }
552
553 // add penalty stiffness
554 if ( penalty > 0. ) {
555 FloatArray d;
556 this->computeNonlocalDegreesOfFreedom(d, tStep, VM_Incremental);
557 for ( int i = 1; i <= d.giveSize(); i++ ) {
558 if ( d.at(i) <= 0. ) {
559 answer.at(i, i) += penalty;
560 }
561 }
562 }
563}
564
565
566void
567GradientDamageElement :: computeStiffnessMatrix_ud(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
568{
570 double dV;
572 int nlGeo = elem->giveGeometryMode();
573 FloatArray Nd;
574 FloatMatrix B;
575 FloatMatrix Dud, DudN;
576
577 answer.clear();
578
579 for ( auto &gp : *elem->giveIntegrationRule(0) ) {
582 if ( !gdmat ) {
583 OOFEM_ERROR("Material doesn't implement the required gradient interface!");
584 }
585 gdmat->giveGradientDamageStiffnessMatrix_ud(Dud, rMode, gp, tStep);
586 this->computeNdMatrixAt(gp, Nd);
587 elem->computeBmatrixAt(gp, B);
588 if ( nlGeo == 1 ) {
589 if ( elem->domain->giveEngngModel()->giveFormulation() == AL ) {
590 elem->computeBmatrixAt(gp, B);
591 } else {
592 elem->computeBHmatrixAt(gp, B);
593 }
594 }
595 dV = elem->computeVolumeAround(gp);
596
598 answer.plusProductUnsym(B, DudN, dV);
599 }
600}
601
602
603void
604GradientDamageElement :: initializeFrom(InputRecord &ir)
605{
606 //nlGeo = 0;
607 penalty = 0.;
609}
610
611void
612GradientDamageElement :: postInitialize()
613{
616}
617
618
619/*
620 * void
621 * GradientDamageElement :: postInitialize()
622 * {
623 * IntArray IdMask_u, IdMask_d;
624 * this->giveDofManDofIDMask_u( IdMask_u );
625 * this->giveDofManDofIDMask_d( IdMask_d );
626 * this->giveLocationArrayOfDofIDs(locationArray_u,locationArray_d, EModelDefaultEquationNumbering(), IdMask_u, IdMask_d);
627 * }
628 */
629} // end namespace oofem
virtual bool isCharacteristicMtrxSymmetric(MatResponseMode rMode) const
bool hasDofID(DofIDItem id) const
Definition dofmanager.C:174
int giveNumberOfDofs() const
Definition dofmanager.C:287
EngngModel * giveEngngModel()
Definition domain.C:419
virtual IntegrationRule * giveIntegrationRule(int i)
Definition element.h:899
virtual int giveNumberOfDofManagers() const
Definition element.h:695
DofManager * giveDofManager(int i) const
Definition element.C:553
CrossSection * giveCrossSection()
Definition element.C:534
virtual double computeVolumeAround(GaussPoint *gp)
Definition element.h:530
virtual fMode giveFormulation()
Definition engngm.h:1165
Domain * giveDomain() const
Definition femcmpnn.h:97
Domain * domain
Link to domain object, useful for communicating with other FEM components.
Definition femcmpnn.h:79
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
double dotProduct(const FloatArray &x) const
Definition floatarray.C:524
Index giveSize() const
Returns the size of receiver.
Definition floatarray.h:261
void zero()
Zeroes all coefficients of receiver.
Definition floatarray.C:683
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Definition floatarray.C:689
void beTProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Definition floatarray.C:721
void add(const FloatArray &src)
Definition floatarray.C:218
void times(double s)
Definition floatarray.C:834
void plusProductSymmUpper(const FloatMatrix &a, const FloatMatrix &b, double dV)
static FloatMatrix fromArray(const FloatArray &vector, bool transpose=false)
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 beProductTOf(const FloatMatrix &a, const FloatMatrix &b)
void plusProductUnsym(const FloatMatrix &a, const FloatMatrix &b, double dV)
int giveNumberOfColumns() const
Returns number of columns of receiver.
void beProductOf(const FloatMatrix &a, const FloatMatrix &b)
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 beTProductOf(const FloatMatrix &a, const FloatMatrix &b)
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
Definition gausspoint.h:190
void computeDisplacementDegreesOfFreedom(FloatArray &answer, TimeStep *tStep)
void computeInternalForces_dB(FloatArray &answer, double localDamageDrivingVariable, FloatArray damage_grad, GaussPoint *gp, TimeStep *tStep)
void computeNonlocalDegreesOfFreedom(FloatArray &answer, TimeStep *tStep, ValueModeType vmt=VM_Total)
virtual void computeBdMatrixAt(GaussPoint *gp, FloatMatrix &answer)=0
void computeInternalForces_dN(double &answer, double localDamageDrivingVariable, double damage, GaussPoint *gp, TimeStep *tStep)
void computeDeformationGradientVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
virtual StructuralElement * giveStructuralElement()=0
void computeNonlocalDamageDrivingVariable(double &answer, GaussPoint *gp, TimeStep *tStep)
void computeStressVector_and_localDamageDrivingVariable(FloatArray &answer, double &localCumulatedPlasticStrain, GaussPoint *gp, TimeStep *tStep)
void computeStiffnessMatrix_ud(FloatMatrix &, MatResponseMode, TimeStep *)
void computeStiffnessMatrix_du(FloatMatrix &, MatResponseMode, TimeStep *)
void computeStiffnessMatrix_uu(FloatMatrix &, MatResponseMode, TimeStep *)
virtual void giveLocationArray_d(IntArray &answer)=0
void computeStiffnessMatrix_dd(FloatMatrix &, MatResponseMode, TimeStep *)
void giveInternalForcesVector_d(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord)
virtual void giveLocationArray_u(IntArray &answer)=0
virtual NLStructuralElement * giveNLStructuralElement()=0
void giveInternalForcesVector_u(FloatArray &answer, TimeStep *tStep, int useUpdatedGpRecord)
void computeStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
virtual void computeNdMatrixAt(GaussPoint *gp, FloatArray &answer)=0
virtual void giveRealStressVectorGradientDamage(FloatArray &answer1, double &answer2, GaussPoint *gp, const FloatArray &totalStrain, double nonlocalDamageDrivningVariable, TimeStep *tStep)
gradient - based giveRealStressVector
virtual void giveGradientDamageStiffnessMatrix_du(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
Left lower block.
virtual void giveGradientDamageStiffnessMatrix_dd_BB(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
virtual void giveGradientDamageStiffnessMatrix_dd_NN(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Right lower block.
virtual void giveNonlocalInternalForces_N_factor(double &answer, double nlddv, GaussPoint *gp, TimeStep *tStep)=0
virtual void giveFirstPKStressVectorGradientDamage(FloatArray &answer1, double &answer2, GaussPoint *gp, const FloatArray &totalStrain, double nonlocalDamageDrivningVariable, TimeStep *tStep)
virtual void giveGradientDamageStiffnessMatrix_ud(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
Right upper block.
virtual void giveCauchyStressVectorGradientDamage(FloatArray &answer1, double &answer2, GaussPoint *gp, const FloatArray &totalStrain, double nonlocalDamageDrivningVariable, TimeStep *tStep)
virtual void giveGradientDamageStiffnessMatrix_uu(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)=0
Left upper block.
virtual void giveGradientDamageStiffnessMatrix_dd_BN(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
virtual void giveNonlocalInternalForces_B_factor(FloatArray &answer, const FloatArray &nlddv, GaussPoint *gp, TimeStep *tStep)=0
int & at(std::size_t i)
Definition intarray.h:104
int giveSize() const
Definition intarray.h:211
virtual void computeBHmatrixAt(GaussPoint *gp, FloatMatrix &answer)
virtual Interface * giveMaterialInterface(InterfaceType t, IntegrationPoint *ip)
StructuralCrossSection * giveStructuralCrossSection()
Helper function which returns the structural cross-section for the element.
virtual void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int lowerIndx=1, int upperIndx=ALL_STRAINS)=0
const FloatArray & giveTempStressVector() const
Returns the const pointer to receiver's temporary stress vector.
#define OOFEM_ERROR(...)
Definition error.h:79
#define _IFT_GradientDamageElement_penalty
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Definition inputrecord.h:75
@ AL
Updated Lagrange.
Definition fmode.h:45
@ TL
Total Lagrange.
Definition fmode.h:44
@ GradientDamageMaterialExtensionInterfaceType

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