OOFEM 3.0
Loading...
Searching...
No Matches
mdm.h
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
35#ifndef mdm_h
36#define mdm_h
37
42#define MDM_USE_MMAClosestIPTransfer
43//#define MDM_USE_MMAShapeFunctProjection
44//#define MDM_USE_MMALeastSquareProjection
45
46
47// Allows to select different mapping algorithms
48#define MDM_MAPPING_DEBUG 1
49
50#include "microplanematerial.h"
52#include "matconst.h"
57
58#ifdef MDM_MAPPING_DEBUG
61
62#else
63
64 #ifdef MDM_USE_MMAShapeFunctProjection
66 #endif
67 #ifdef MDM_USE_MMALeastSquareProjection
69 #endif
70#endif
71
74
76
77#define _IFT_MDM_Name "mdm"
78#define _IFT_MDM_talpha "talpha"
79#define _IFT_MDM_parmd "parmd"
80#define _IFT_MDM_nonloc "nonloc"
81#define _IFT_MDM_r "r"
82#define _IFT_MDM_efp "efp"
83#define _IFT_MDM_ep "ep"
84#define _IFT_MDM_gf "gf"
85#define _IFT_MDM_ft "ft"
86#define _IFT_MDM_formulation "formulation"
87#define _IFT_MDM_mode "mode"
88#define _IFT_MDM_mapper "mapper"
89#define _IFT_MDM_sourceRegionSet "sourceregset"
91
92namespace oofem {
93
98{
99protected:
107
108public:
109 MDMStatus(GaussPoint * g, int nsd, int nmplanes);
110
117
118 double giveMicroplaneTempDamage(int m) { return PsiTemp.at(m); }
119 double giveMicroplaneDamage(int m) { return Psi.at(m); }
120 void setMicroplaneTempDamage(int m, double val) { PsiTemp.at(m) = val; }
122 void setMicroplaneTempDamageValues(FloatArray src) { PsiTemp = std :: move(src); }
123
126 void setTempDamageTensor(FloatMatrix src) { DamageTensorTemp = std :: move(src); }
130
131 const char *giveClassName() const override { return "MDMStatus"; }
132
133 void printOutputAt(FILE *file, TimeStep *tStep) const override;
134
135 void initTempStatus() override;
136 void updateYourself(TimeStep *tStep) override;
137
138 void saveContext(DataStream &stream, ContextMode mode) override;
139 void restoreContext(DataStream &stream, ContextMode mode) override;
140
152};
153
154
159{
160public:
163
164protected:
165 int ndc = 0;
166 int nsd = 0;
167 int type_dam = 0;
168 int type_soft = 0;
169
171 mutable double mdm_Ep = 0.;
173 mutable double mdm_Efp = 0.;
174 double ParMd = 0.;
175 double tempDillatCoeff = 0.;
176
178 double Gf = 0.;
180 double Ft = 0.;
181
184
187
189 int nonlocal = 0;
191 double R = 0.;
192
194 std::unique_ptr<Set> sourceElemSet;
195
196#ifdef MDM_MAPPING_DEBUG
200
201 // determines the mapping algorithm to be used
204#else
205
206 #ifdef MDM_USE_MMAClosestIPTransfer
208 static MMAClosestIPTransfer mapper;
209 #endif
210 #ifdef MDM_USE_MMAShapeFunctProjection
212 static MMAShapeFunctProjection mapper;
213 #endif
214 #ifdef MDM_USE_MMALeastSquareProjection
216 static MMALeastSquareProjection mapper;
217 #endif
218#endif
219
222
223public:
236
237 bool hasMaterialModeCapability(MaterialMode mode) const override;
238
240 const FloatArray &reducedStrain, TimeStep *tStep) const override;
241
243 {
244 FloatArray answer;
245 const_cast<MDM*>(this)->giveRealStressVector(answer, gp, strain, tStep);
246 return answer;
247 }
249 {
250 FloatArray answer;
251 const_cast<MDM*>(this)->giveRealStressVector(answer, gp, strain, tStep);
252 return answer;
253 }
255 {
256 FloatArray answer;
257 const_cast<MDM*>(this)->giveRealStressVector(answer, gp, strain, tStep);
258 return answer;
259 }
260
261 FloatMatrixF<6,6> give3dMaterialStiffnessMatrix(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const override;
262
263 int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override;
264
266
267 void initializeFrom(InputRecord &ir) override;
268 void giveInputRecord(DynamicInputRecord &input) override;
269
270 const char *giveInputRecordName() const override { return _IFT_MDM_Name; }
271 const char *giveClassName() const override { return "MDM"; }
272
273 void initializeData(int numberOfMicroplanes) override;
274
275 void updateBeforeNonlocAverage(const FloatArray &strainVector, GaussPoint *gp, TimeStep *tStep) const override;
276
277 double computeWeightFunction(const double cl, const FloatArray &src, const FloatArray &coord) const override;
278
279 int hasBoundedSupport() const override { return 1; }
283 virtual void giveSupportRadius(double &radius) { radius = this->R; }
284
286
287 int MMI_map(GaussPoint *gp, Domain *oldd, TimeStep *tStep) override;
288 int MMI_update(GaussPoint *gp, TimeStep *tStep, FloatArray *estrain = nullptr) override;
289 int MMI_finish(TimeStep *tStep) override;
290
291 int packUnknowns(DataStream &buff, TimeStep *tStep, GaussPoint *ip) override;
292 int unpackAndUpdateUnknowns(DataStream &buff, TimeStep *tStep, GaussPoint *ip) override;
293 int estimatePackSize(DataStream &buff, GaussPoint *ip) override;
294 double predictRelativeComputationalCost(GaussPoint *gp) override;
295 double predictRelativeRedistributionCost(GaussPoint *gp) override { return 1.0; }
296
297 std::unique_ptr<MaterialStatus> CreateStatus(GaussPoint *gp) const override;
298
299protected:
300 void computeDamageTensor(FloatMatrix &tempDamageTensor, const FloatArray &totalStrain,
301 GaussPoint *gp, TimeStep *tStep) const;
302 void computeLocalDamageTensor(FloatMatrix &tempDamageTensor, const FloatArray &totalStrain,
303 GaussPoint *gp, TimeStep *tStep) const;
304 double computeDamageOnPlane(GaussPoint *gp, int mnumber, const FloatArray &strain) const;
305 void computePDC(FloatMatrix &tempDamageTensor, FloatArray &tempDamageTensorEigenVals,
306 FloatMatrix &tempDamageTensorEigenVec) const;
307 void transformStrainToPDC(FloatArray &answer, FloatArray &strain,
308 FloatMatrix &t, GaussPoint *gp) const;
309 void applyDamageTranformation(FloatArray &strainPDC, const FloatArray &tempDamageTensorEigenVals) const;
310 void transformStressFromPDC(FloatArray &answer, const FloatArray &stressPDC, const FloatMatrix &t, GaussPoint *gp) const;
311 void computeEffectiveStress(FloatArray &stressPDC, const FloatArray &strainPDC,
312 GaussPoint *gp, TimeStep *tStep) const;
314 MatResponseMode mode, GaussPoint *gp,
315 TimeStep *tStep) const;
317 void transformStiffnessfromPDC(FloatMatrix &de, const FloatMatrix &t) const;
318
319 FloatMatrixF<3,3> givePlaneStressStiffMtrx(MatResponseMode mmode, GaussPoint *gp, TimeStep *tStep) const override;
320
321 FloatMatrixF<4,4> givePlaneStrainStiffMtrx(MatResponseMode mmode, GaussPoint *gp, TimeStep *tStep) const override;
322
323 void rotateTensor4(FloatMatrix &Dlocal, const FloatMatrix &t) const;
324 void formTransformationMatrix(FloatMatrix &answer, const FloatMatrix &t, int n) const;
325
326 //double giveParameterEfp(const FloatArray &reducedStrain, GaussPoint *gp);
327 void giveRawMDMParameters(double &Efp, double &Ep, const FloatArray &reducedStrain, GaussPoint *gp) const;
328};
329} // end namespace oofem
330#endif // mdm_h
FloatArray tempDamageTensorEigenValues
Principal damage directions.
Definition mdm.h:105
const FloatMatrix * giveLocalDamageTensorForAveragePtr()
Definition mdm.h:129
void setMicroplaneTempDamage(int m, double val)
Definition mdm.h:120
FloatMatrix DamageTensorTemp
Definition mdm.h:103
FloatMatrix localDamageTensor
Definition mdm.h:103
Interface * giveInterface(InterfaceType it) override
Definition mdm.C:1477
const FloatMatrix & giveLocalDamageTensorForAverage()
Definition mdm.h:128
void restoreContext(DataStream &stream, ContextMode mode) override
Definition mdm.C:1401
void initTempStatus() override
Definition mdm.C:1435
FloatArray Psi
Damage values on individual microplanes.
Definition mdm.h:101
FloatMatrix damageTensorEigenVectors
Definition mdm.h:106
const FloatMatrix & giveTempDamageTensorEigenVec()
Definition mdm.h:115
void setLocalDamageTensorForAverage(FloatMatrix src)
Definition mdm.h:127
double giveMicroplaneTempDamage(int m)
Definition mdm.h:118
void setMicroplaneTempDamageValues(FloatArray src)
Definition mdm.h:122
FloatArray PsiTemp
Definition mdm.h:101
void setTempDamageTensorEigenVals(FloatArray src)
Definition mdm.h:111
FloatArray damageTensorEigenValues
Definition mdm.h:105
const FloatArray & giveTempDamageTensorEigenVals()
Definition mdm.h:113
void setTempDamageTensor(FloatMatrix src)
Definition mdm.h:126
void updateYourself(TimeStep *tStep) override
Definition mdm.C:1424
FloatMatrix tempDamageTensorEigenVectors
Definition mdm.h:106
const FloatMatrix & giveTempDamageTensor()
Definition mdm.h:124
MDMStatus(GaussPoint *g, int nsd, int nmplanes)
Definition mdm.C:1367
void saveContext(DataStream &stream, ContextMode mode) override
Definition mdm.C:1377
double giveMicroplaneDamage(int m)
Definition mdm.h:119
void printOutputAt(FILE *file, TimeStep *tStep) const override
Print receiver's output to given stream.
Definition mdm.C:1446
const FloatArray & giveDamageTensorEigenVals()
Definition mdm.h:114
const FloatMatrix & giveDamageTensorEigenVec()
Definition mdm.h:116
const FloatMatrix & giveDamageTensor()
Definition mdm.h:125
const FloatArray & giveMicroplaneDamageValues()
Definition mdm.h:121
void setTempDamageTensorEigenVec(FloatMatrix src)
Definition mdm.h:112
const char * giveClassName() const override
Definition mdm.h:131
FloatMatrix DamageTensor
Macroscopic damage tensor.
Definition mdm.h:103
MDMModeType
Definition mdm.h:162
@ mdm_3d
Definition mdm.h:162
@ mdm_2d
Definition mdm.h:162
void applyDamageToStiffness(FloatMatrix &d, GaussPoint *gp) const
Definition mdm.C:538
double ParMd
THREAD UNSAFE. These are modified when evaluating the material. Why? This must be avoided at all cost...
Definition mdm.h:174
MDMFormulatrionType formulation
Definition mdm.h:182
void giveRawMDMParameters(double &Efp, double &Ep, const FloatArray &reducedStrain, GaussPoint *gp) const
Definition mdm.C:972
void rotateTensor4(FloatMatrix &Dlocal, const FloatMatrix &t) const
Definition mdm.C:901
void initializeData(int numberOfMicroplanes) override
Definition mdm.C:1083
void giveMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const
Definition mdm.C:513
FloatMatrixF< 4, 4 > givePlaneStrainStiffMtrx(MatResponseMode mmode, GaussPoint *gp, TimeStep *tStep) const override
Definition mdm.C:650
double Ft
Macroscopic tensile strength (necessary to determine Ep and Efp if not given).
Definition mdm.h:180
FloatArrayF< 4 > giveRealStressVector_PlaneStrain(const FloatArrayF< 4 > &strain, GaussPoint *gp, TimeStep *tStep) const override
Default implementation relies on giveRealStressVector_3d.
Definition mdm.h:248
MDM(int n, Domain *d)
Definition mdm.h:229
const char * giveInputRecordName() const override
Definition mdm.h:270
void giveInputRecord(DynamicInputRecord &input) override
Definition mdm.C:855
void transformStrainToPDC(FloatArray &answer, FloatArray &strain, FloatMatrix &t, GaussPoint *gp) const
Definition mdm.C:358
virtual void giveSupportRadius(double &radius)
Definition mdm.h:283
double tempDillatCoeff
Temperature dilatation coeff.
Definition mdm.h:175
void initializeFrom(InputRecord &ir) override
Definition mdm.C:775
static MMAShapeFunctProjection mapperSFT
Mapper used to map internal variables in adaptivity.
Definition mdm.h:198
int hasBoundedSupport() const override
Definition mdm.h:279
int nonlocal
Flag indicating local or nonlocal mode.
Definition mdm.h:189
void transformStiffnessfromPDC(FloatMatrix &de, const FloatMatrix &t) const
Definition mdm.C:623
FloatArrayF< 3 > giveRealStressVector_PlaneStress(const FloatArrayF< 3 > &strain, GaussPoint *gp, TimeStep *tStep) const override
Default implementation relies on giveRealStressVector_StressControl.
Definition mdm.h:254
void applyDamageTranformation(FloatArray &strainPDC, const FloatArray &tempDamageTensorEigenVals) const
Definition mdm.C:403
double mdm_Ep
Parameter controlling the elastic limit.
Definition mdm.h:171
double mdm_Efp
Prescribed value of ef-ep.
Definition mdm.h:173
int MMI_finish(TimeStep *tStep) override
Definition mdm.C:1274
int type_soft
Definition mdm.h:168
const char * giveClassName() const override
Definition mdm.h:271
IsotropicLinearElasticMaterial linearElasticMaterial
Reference to bulk (undamaged) material.
Definition mdm.h:186
static MMALeastSquareProjection mapperLST
Definition mdm.h:199
void computePDC(FloatMatrix &tempDamageTensor, FloatArray &tempDamageTensorEigenVals, FloatMatrix &tempDamageTensorEigenVec) const
Definition mdm.C:336
double R
Interaction radius, related to the nonlocal characteristic length of material.
Definition mdm.h:191
std::unique_ptr< Set > sourceElemSet
cached source element set used to map internal variables (adaptivity), created on demand
Definition mdm.h:194
Interface * giveInterface(InterfaceType it) override
Definition mdm.C:1288
void giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep) const override
Definition mdm.C:87
std::unique_ptr< MaterialStatus > CreateStatus(GaussPoint *gp) const override
Definition mdm.C:74
void computeDamageTensor(FloatMatrix &tempDamageTensor, const FloatArray &totalStrain, GaussPoint *gp, TimeStep *tStep) const
Definition mdm.C:153
FloatMatrixF< 3, 3 > givePlaneStressStiffMtrx(MatResponseMode mmode, GaussPoint *gp, TimeStep *tStep) const override
Definition mdm.C:641
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
Definition mdm.C:659
int estimatePackSize(DataStream &buff, GaussPoint *ip) override
Definition mdm.C:1323
bool hasMaterialModeCapability(MaterialMode mode) const override
Definition mdm.C:81
double predictRelativeRedistributionCost(GaussPoint *gp) override
Definition mdm.h:295
MDMFormulatrionType
Definition mdm.h:161
@ COMPLIANCE_DAMAGE
Definition mdm.h:161
@ STIFFNESS_DAMAGE
Definition mdm.h:161
double computeDamageOnPlane(GaussPoint *gp, int mnumber, const FloatArray &strain) const
Definition mdm.C:264
int MMI_update(GaussPoint *gp, TimeStep *tStep, FloatArray *estrain=nullptr) override
Definition mdm.C:1259
static MMAClosestIPTransfer mapper2
Mapper used to map stresses in adaptivity.
Definition mdm.h:221
int MMI_map(GaussPoint *gp, Domain *oldd, TimeStep *tStep) override
Definition mdm.C:1170
int nsd
Number of spatial dimensions.
Definition mdm.h:166
MDMModeType mdmMode
Definition mdm.h:183
void formTransformationMatrix(FloatMatrix &answer, const FloatMatrix &t, int n) const
Definition mdm.C:921
int packUnknowns(DataStream &buff, TimeStep *tStep, GaussPoint *ip) override
Definition mdm.C:1300
MDMMapperType mapperType
Definition mdm.h:203
void updateBeforeNonlocAverage(const FloatArray &strainVector, GaussPoint *gp, TimeStep *tStep) const override
Definition mdm.C:1138
MDMMapperType
Definition mdm.h:202
@ mdm_lst
Definition mdm.h:202
@ mdm_sft
Definition mdm.h:202
@ mdm_cpt
Definition mdm.h:202
int unpackAndUpdateUnknowns(DataStream &buff, TimeStep *tStep, GaussPoint *ip) override
Definition mdm.C:1311
double Gf
Fracture energy (necessary to determine Ep and Efp if not given).
Definition mdm.h:178
int ndc
Number of damage components.
Definition mdm.h:165
FloatMatrixF< 6, 6 > give3dMaterialStiffnessMatrix(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const override
Definition mdm.C:630
void transformStressFromPDC(FloatArray &answer, const FloatArray &stressPDC, const FloatMatrix &t, GaussPoint *gp) const
Definition mdm.C:472
double computeWeightFunction(const double cl, const FloatArray &src, const FloatArray &coord) const override
Definition mdm.C:1154
int type_dam
Definition mdm.h:167
FloatArrayF< 6 > giveThermalDilatationVector(GaussPoint *gp, TimeStep *tStep) const override
Definition mdm.C:763
void computeEffectiveStress(FloatArray &stressPDC, const FloatArray &strainPDC, GaussPoint *gp, TimeStep *tStep) const
Definition mdm.C:452
double predictRelativeComputationalCost(GaussPoint *gp) override
Definition mdm.C:1338
void computeLocalDamageTensor(FloatMatrix &tempDamageTensor, const FloatArray &totalStrain, GaussPoint *gp, TimeStep *tStep) const
Definition mdm.C:198
FloatArrayF< 6 > giveRealStressVector_3d(const FloatArrayF< 6 > &strain, GaussPoint *gp, TimeStep *tStep) const override
Default implementation relies on giveRealStressVector for second Piola-Kirchoff stress.
Definition mdm.h:242
int numberOfMicroplanes
Number of microplanes.
MicroplaneMaterial(int n, Domain *d)
StructuralMaterialStatus(GaussPoint *g)
Constructor. Creates new StructuralMaterialStatus with IntegrationPoint g.
#define _IFT_MDM_Name
Definition mdm.h:77
long ContextMode
Definition contextmode.h:43

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