44#ifdef microplane_m1_new_implementation
52 MicroplaneMaterial :: initializeFrom(ir);
55 OOFEM_WARNING(
"Poisson ratio of microplane model M1 must be set to 0.25");
58 EN =
E / ( 1. - 2. *
nu );
75 FloatArray epspN = status->giveNormalMplanePlasticStrains();
89 double sigTrial =
EN * ( epsN - epspN.
at(imp) );
91 double sigYield =
EN * (
s0 +
HN * epsN ) / (
EN +
HN );
92 if ( sigYield < 0. ) {
96 if ( sigTrial > sigYield ) {
97 sigN.
at(imp) = sigYield;
98 epspN.
at(imp) = epsN - sigYield /
EN;
101 sigN.
at(imp) = sigTrial;
105 for (
int i = 1; i <= 6; i++ ) {
113 status->letTempStrainVectorBe(strain);
114 status->letTempStressVectorBe(stress);
115 status->letTempNormalMplaneStressesBe(sigN);
116 status->letTempNormalMplanePlasticStrainsBe(epspN);
117 status->letPlasticStateIndicatorsBe(plState);
122M1Material :: give3dMaterialStiffnessMatrix(MatResponseMode mode,
127 if ( mode == ElasticStiffness ) {
128 return MicroplaneMaterial :: give3dMaterialStiffnessMatrix(mode, gp, tStep);
134 return MicroplaneMaterial :: give3dMaterialStiffnessMatrix(mode, gp, tStep);
137 double aux, D11 = 0., D12 = 0., D13 = 0., D14 = 0., D15 = 0., D16 = 0., D22 = 0., D23 = 0., D24 = 0., D25 = 0., D26 = 0., D33 = 0., D34 = 0., D35 = 0., D36 = 0.;
140 if ( plasticState.
at(im + 1) ) {
145 D11 += aux *
N [ im ] [ 0 ] *
N [ im ] [ 0 ];
146 D12 += aux *
N [ im ] [ 0 ] *
N [ im ] [ 1 ];
147 D13 += aux *
N [ im ] [ 0 ] *
N [ im ] [ 2 ];
148 D14 += aux *
N [ im ] [ 0 ] *
N [ im ] [ 3 ];
149 D15 += aux *
N [ im ] [ 0 ] *
N [ im ] [ 4 ];
150 D16 += aux *
N [ im ] [ 0 ] *
N [ im ] [ 5 ];
152 D22 += aux *
N [ im ] [ 1 ] *
N [ im ] [ 1 ];
153 D23 += aux *
N [ im ] [ 1 ] *
N [ im ] [ 2 ];
154 D24 += aux *
N [ im ] [ 1 ] *
N [ im ] [ 3 ];
155 D25 += aux *
N [ im ] [ 1 ] *
N [ im ] [ 4 ];
156 D26 += aux *
N [ im ] [ 1 ] *
N [ im ] [ 5 ];
158 D33 += aux *
N [ im ] [ 2 ] *
N [ im ] [ 2 ];
159 D34 += aux *
N [ im ] [ 2 ] *
N [ im ] [ 3 ];
160 D35 += aux *
N [ im ] [ 2 ] *
N [ im ] [ 4 ];
161 D36 += aux *
N [ im ] [ 2 ] *
N [ im ] [ 5 ];
164 answer.
at(1, 1) = D11;
165 answer.
at(1, 2) = answer.
at(2, 1) = answer.
at(6, 6) = D12;
166 answer.
at(1, 3) = answer.
at(3, 1) = answer.
at(5, 5) = D13;
167 answer.
at(1, 4) = answer.
at(4, 1) = answer.
at(5, 6) = answer.
at(6, 5) = D14;
168 answer.
at(1, 5) = answer.
at(5, 1) = D15;
169 answer.
at(1, 6) = answer.
at(6, 1) = D16;
171 answer.
at(2, 2) = D22;
172 answer.
at(2, 3) = answer.
at(3, 2) = answer.
at(4, 4) = D23;
173 answer.
at(2, 4) = answer.
at(4, 2) = D24;
174 answer.
at(2, 5) = answer.
at(5, 2) = answer.
at(4, 6) = answer.
at(6, 4) = D25;
175 answer.
at(2, 6) = answer.
at(6, 2) = D26;
177 answer.
at(3, 3) = answer.
at(3, 3) = D33;
178 answer.
at(3, 4) = answer.
at(4, 3) = D34;
179 answer.
at(3, 5) = answer.
at(5, 3) = D35;
180 answer.
at(3, 6) = answer.
at(6, 3) = answer.
at(4, 5) = answer.
at(5, 4) = D36;
190 if ( type == IST_PlasticStrainTensor ) {
195 double aux =
nu * ( sig.
at(1) + sig.
at(2) + sig.
at(3) );
196 double G =
E / ( 2. * ( 1. +
nu ) );
197 answer.
at(1) -= ( ( 1. +
nu ) * sig.
at(1) - aux ) /
E;
198 answer.
at(2) -= ( ( 1. +
nu ) * sig.
at(2) - aux ) /
E;
199 answer.
at(3) -= ( ( 1. +
nu ) * sig.
at(3) - aux ) /
E;
200 answer.
at(4) -= sig.
at(4) / G;
201 answer.
at(5) -= sig.
at(5) / G;
202 answer.
at(6) -= sig.
at(6) / G;
205 return StructuralMaterial :: giveIPValue(answer, gp, type, tStep);
216M1MaterialStatus :: initTempStatus()
218 StructuralMaterialStatus :: initTempStatus();
222M1MaterialStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
224 StructuralMaterialStatus :: printOutputAt(file, tStep);
225 fprintf(file,
"status { sigN ");
226 for (
auto v :
sigN ) {
227 fprintf( file,
" %g ", v );
229 fprintf(file,
" epspN ");
230 for (
auto v :
epspN ) {
231 fprintf( file,
" %g ", v );
233 fprintf(file,
" plast ");
235 fprintf( file,
" %d ", v );
237 fprintf(file,
"}\n");
245 StructuralMaterialStatus :: updateYourself(tStep);
251 StructuralMaterialStatus :: saveContext(stream, mode);
258 StructuralMaterialStatus :: restoreContext(stream, mode);
265{
E = 0.; nu = 0.; EN = 0.; s0 = 0.; HN = 0.; }
268M1Material :: giveRealStressVector_PlaneStress(FloatArray &answer,
270 const FloatArray &totalStrain,
273 FloatArray sigmaN, deps, sigmaNyield;
278 sigmaNyield.resize(nmp);
281 M1MaterialStatus *status =
static_cast< M1MaterialStatus *
>( this->giveStatus(gp) );
282 this->initTempStatus(gp);
283 sigmaN = status->giveNormalMplaneStresses();
284 if ( sigmaN.giveSize() < nmp ) {
288 deps.beDifferenceOf( totalStrain, status->giveStrainVector() );
290 for (
int imp = 1; imp <= nmp; imp++ ) {
291 depsN =
N.at(imp, 1) * deps.at(1) +
N.at(imp, 2) * deps.at(2) +
N.at(imp, 3) * deps.at(3);
292 epsN =
N.at(imp, 1) * totalStrain.at(1) +
N.at(imp, 2) * totalStrain.at(2) +
N.at(imp, 3) * totalStrain.at(3);
293 sigmaN.at(imp) += EN * depsN;
294 double sy = EN * ( s0 + HN * epsN ) / ( EN + HN );
298 if ( sigmaN.at(imp) > sy ) {
301 sigmaNyield.at(imp) = sy;
302 for (
int i = 1; i <= 3; i++ ) {
303 answer.at(i) +=
N.at(imp, i) * sigmaN.at(imp) * mw.at(imp);
308 status->letTempStrainVectorBe(totalStrain);
309 status->letTempNormalMplaneStressesBe(sigmaN);
310 status->letNormalMplaneYieldStressesBe(sigmaNyield);
311 status->letTempStressVectorBe(answer);
315M1Material :: giveElasticPlaneStressStiffMtrx(
FloatMatrix &answer)
318 answer.at(1, 1) = answer.at(2, 2) =
E / ( 1. - nu * nu );
319 answer.at(1, 2) = answer.at(2, 1) =
E * nu / ( 1. - nu * nu );
320 answer.at(1, 3) = answer.at(2, 3) = answer.at(3, 1) = answer.at(3, 2) = 0.;
321 answer.at(3, 3) =
E / ( 2. * ( 1. + nu ) );
328 if ( rMode == ElasticStiffness ) {
329 giveElasticPlaneStressStiffMtrx(answer);
334 FloatArray sigmaN = status->giveTempNormalMplaneStresses();
335 if ( sigmaN.giveSize() != nmp ) {
336 sigmaN = status->giveNormalMplaneStresses();
337 if ( sigmaN.giveSize() != nmp ) {
338 giveElasticPlaneStressStiffMtrx(answer);
342 FloatArray sigmaNyield = status->giveNormalMplaneYieldStresses();
344 double D11, D12, D13, D22, D23, aux;
345 D11 = D12 = D13 = D22 = D23 = 0.;
346 for (
int imp = 1; imp <= nmp; imp++ ) {
347 if ( sigmaN.at(imp) < sigmaNyield.at(imp) ) {
348 aux = mw.at(imp) * EN;
349 }
else if ( sigmaNyield.at(imp) > 0. ) {
350 aux = mw.at(imp) * EN * HN / ( EN + HN );
354 D11 += aux * NN.at(imp, 1);
355 D12 += aux * NN.at(imp, 3);
356 D13 += aux * NN.at(imp, 2);
357 D22 += aux * NN.at(imp, 5);
358 D23 += aux * NN.at(imp, 4);
360 answer.
at(1, 1) = D11;
361 answer.at(1, 2) = answer.at(2, 1) = answer.at(3, 3) = D12;
362 answer.at(1, 3) = answer.at(3, 1) = D13;
363 answer.at(2, 2) = D22;
364 answer.at(2, 3) = answer.at(3, 2) = D23;
371 StructuralMaterial :: initializeFrom(ir);
386 for (
int imp = 1; imp <= nmp; imp++ ) {
387 double alpha = ( imp - 1 ) * (
M_PI / nmp );
388 double c = cos(alpha);
389 double s = sin(alpha);
392 N.at(imp, 1) = c * c;
393 N.at(imp, 2) = s * s;
394 N.at(imp, 3) = c * s;
395 NN.at(imp, 1) = c * c * c * c;
396 NN.at(imp, 2) = c * c * c * s;
397 NN.at(imp, 3) = c * c * s * s;
398 NN.at(imp, 4) = c * s * s * s;
399 NN.at(imp, 5) = s * s * s * s;
400 mw.at(imp) = 2. / nmp;
405M1Material :: hasMaterialModeCapability(MaterialMode mode)
const
407 return mode == _PlaneStress;
414 if ( type == IST_PlasticStrainTensor ) {
416 plasticStrain.zero();
417 FloatArray sigmaN = status->giveTempNormalMplaneStresses();
418 FloatArray strain = status->giveTempStrainVector();
419 double Exx, Eyy, Gamma;
420 Exx = Eyy = Gamma = 0.;
421 if ( sigmaN.giveSize() == nmp ) {
422 for (
int imp = 1; imp <= nmp; imp++ ) {
424 for (
int i = 1; i <= 3; i++ ) {
425 epsN += strain.at(i) *
N.at(imp, i);
427 double epsNpl = epsN - sigmaN.at(imp) / EN;
428 double aux = epsNpl * mw.at(imp);
429 Exx += aux *
N.at(imp, 1);
430 Eyy += aux *
N.at(imp, 2);
431 Gamma += aux *
N.at(imp, 3);
434 plasticStrain.
at(1) = 1.5 * Exx - 0.5 * Eyy;
435 plasticStrain.at(2) = -0.5 * Exx + 1.5 * Eyy;
436 plasticStrain.at(3) = 4. * Gamma;
437 StructuralMaterial :: giveFullSymVectorForm( answer, plasticStrain, gp->giveMaterialMode() );
440 return StructuralMaterial :: giveIPValue(answer, gp, type, tStep);
446M1MaterialStatus :: M1MaterialStatus(
GaussPoint *g) :
451M1MaterialStatus :: ~M1MaterialStatus()
455M1MaterialStatus :: initTempStatus()
457 StructuralMaterialStatus :: initTempStatus();
461M1MaterialStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
463 StructuralMaterialStatus :: printOutputAt(file, tStep);
464 fprintf(file,
"status { sigN ");
465 int nm = sigN.giveSize();
466 for (
int imp = 1; imp <= nm; imp++ ) {
467 fprintf( file,
" %f ", sigN.at(imp) );
469 fprintf(file,
"}\n");
473M1MaterialStatus :: updateYourself(
TimeStep *tStep)
476 StructuralMaterialStatus :: updateYourself(tStep);
482 StructuralMaterialStatus :: saveContext(stream, mode);
488 StructuralMaterialStatus :: restoreContext(stream, mode);
#define REGISTER_Material(class)
double & at(std::size_t i)
Index giveSize() const
Returns the size of receiver.
void zero()
Zeroes all coefficients of receiver.
double at(std::size_t i, std::size_t j) const
const IntArray & givePlasticStateIndicators()
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
virtual void initTempStatus(GaussPoint *gp) const
std::vector< FloatArrayF< 6 > > N
FloatArray microplaneWeights
Integration weights of microplanes.
int numberOfMicroplanes
Number of microplanes.
double nu
Poisson's ratio.
double computeNormalStrainComponent(int mnumber, const FloatArray ¯oStrain) const
MicroplaneMaterial(int n, Domain *d)
const FloatArray & giveStrainVector() const
Returns the const pointer to receiver's strain vector.
StructuralMaterialStatus(GaussPoint *g)
Constructor. Creates new StructuralMaterialStatus with IntegrationPoint g.
const FloatArray & giveStressVector() const
Returns the const pointer to receiver's stress vector.
#define OOFEM_WARNING(...)
#define _IFT_M1Material_s0
#define _IFT_M1Material_hn