59 MPlasticMaterial :: initializeFrom(ir);
63 k = value / sqrt(3.0);
89std::unique_ptr<MaterialStatus>
97 const FloatArray &strainSpaceHardeningVariables)
const
109 StructuralMaterial :: giveVoigtSymVectorMask( mask, gp->
giveMaterialMode() );
115 for (
int i = 1; i <= isize; i++ ) {
118 answer.
at( mask.
at(i) ) = ( sqrt(2.) * 2. / 3. ) * this->
kinematicModuli * strainSpaceHardeningVariables.
at(i);
126 strainSpaceHardeningVariables.
at(rSize);
136 const FloatArray &stressSpaceHardeningVars)
const
144 helpVector = stressVector;
145 helpVector.
add(backStress);
150 helpVector = stressVector;
163 const FloatArray &strainSpaceHardeningVariables,
175 answer.
resize(size, size);
180 int ksize = StructuralMaterial :: giveSizeOfVoigtSymVector( gp->
giveMaterialMode() );
181 for (
int i = 1; i <= ksize; i++ ) {
194 const FloatArray &stressSpaceHardeningVars)
const
198 double f, ax, ay, az, sx, sy, sz;
206 helpVector = stressVector;
207 helpVector.
add(backStress);
212 helpVector = stressVector;
217 if ( fabs(f) < 1.e-6 ) {
221 ax = helpVector.
at(1);
222 ay = helpVector.
at(2);
223 az = helpVector.
at(3);
225 sx = ( 2. / 3. ) * ax - ( 1. / 3. ) * ay - ( 1. / 3. ) * az;
226 sy = ( 2. / 3. ) * ay - ( 1. / 3. ) * ax - ( 1. / 3. ) * az;
227 sz = ( 2. / 3. ) * az - ( 1. / 3. ) * ay - ( 1. / 3. ) * ax;
229 answer.
at(1) = 0.5 * sx / f;
230 answer.
at(2) = 0.5 * sy / f;
231 answer.
at(3) = 0.5 * sz / f;
232 answer.
at(4) = helpVector.
at(4) / f;
233 answer.
at(5) = helpVector.
at(5) / f;
234 answer.
at(6) = helpVector.
at(6) / f;
240 const FloatArray &stressSpaceHardeningVars)
const
246 FloatArray fullKinematicGradient, reducedKinematicGrad;
258 StructuralMaterial :: giveReducedSymVectorForm( reducedKinematicGrad, fullKinematicGradient, gp->
giveMaterialMode() );
260 kcount = reducedKinematicGrad.
giveSize();
264 for (
int i = 1; i <= kcount; i++ ) {
265 answer.
at(i) = reducedKinematicGrad.
at(i);
270 answer.
at(size) = sqrt(1. / 3.);
276J2MPlasticMaterial :: hasHardening()
const
283J2MPlasticMaterial :: computeReducedGradientMatrix(
FloatMatrix &answer,
int isurf,
286 const FloatArray &stressSpaceHardeningVars)
const
292 double f, f32, f12, ax, ay, az;
294 StructuralMaterial :: giveInvertedVoigtVectorMask( mask, gp->
giveMaterialMode() );
295 size = StructuralMaterial :: giveSizeOfVoigtSymVector( gp->
giveMaterialMode() ) +
298 answer.
resize(size, size);
302 if ( stressVector.
giveSize() != 0 ) {
306 helpVector = stressVector;
307 helpVector.
add(backStress);
309 helpVector = stressVector;
314 f32 = pow(f, 3. / 2.);
316 ax = helpVector.
at(1);
317 ay = helpVector.
at(2);
318 az = helpVector.
at(3);
320 df.
at(1) = ( 2. / 3. ) * ax - ( 1. / 3. ) * ay - ( 1. / 3. ) * az;
321 df.
at(2) = ( 2. / 3. ) * ay - ( 1. / 3. ) * ax - ( 1. / 3. ) * az;
322 df.
at(3) = ( 2. / 3. ) * az - ( 1. / 3. ) * ay - ( 1. / 3. ) * ax;
323 df.
at(4) = 2. * helpVector.
at(4);
324 df.
at(5) = 2. * helpVector.
at(5);
325 df.
at(6) = 2. * helpVector.
at(6);
327 for (
int i = 1; i <= 3; i++ ) {
328 if ( ( imask = mask.
at(i) ) == 0 ) {
332 for (
int j = i; j <= 3; j++ ) {
333 if ( ( jmask = mask.
at(j) ) == 0 ) {
338 answer.
at(imask, jmask) = -( 1. / 4. ) * ( 1. / f32 ) * df.
at(i) * df.
at(j) + 0.5 * ( 1. / f12 ) * ( 4. / 6 );
340 answer.
at(imask, jmask) = -( 1. / 4. ) * ( 1. / f32 ) * df.
at(i) * df.
at(j) + 0.5 * ( 1. / f12 ) * ( -2. / 6 );
341 answer.
at(jmask, imask) = -( 1. / 4. ) * ( 1. / f32 ) * df.
at(i) * df.
at(j) + 0.5 * ( 1. / f12 ) * ( -2. / 6 );
346 for (
int i = 1; i <= 3; i++ ) {
347 if ( ( imask = mask.
at(i) ) == 0 ) {
351 for (
int j = 4; j <= 6; j++ ) {
352 if ( ( jmask = mask.
at(j) ) == 0 ) {
356 answer.
at(imask, jmask) = -( 1. / 4. ) * ( 1. / f32 ) * df.
at(i) * df.
at(j);
357 answer.
at(jmask, imask) = -( 1. / 4. ) * ( 1. / f32 ) * df.
at(i) * df.
at(j);
361 for (
int i = 4; i <= 6; i++ ) {
362 if ( ( imask = mask.
at(i) ) == 0 ) {
366 for (
int j = i; j <= 6; j++ ) {
367 if ( ( jmask = mask.
at(j) ) == 0 ) {
372 answer.
at(imask, jmask) = -( 1. / 4. ) * ( 1. / f32 ) * df.
at(i) * df.
at(j) + 0.5 * ( 1. / f12 ) * 2.;
374 answer.
at(imask, jmask) = -( 1. / 4. ) * ( 1. / f32 ) * df.
at(i) * df.
at(j);
375 answer.
at(jmask, imask) = -( 1. / 4. ) * ( 1. / f32 ) * df.
at(i) * df.
at(j);
396J2MPlasticMaterial :: computeJ2InvariantAt(
const FloatArray &stressVector)
const
401 if ( stressVector.
isEmpty() ) {
405 v1 = ( ( stressVector.
at(1) - stressVector.
at(2) ) * ( stressVector.
at(1) - stressVector.
at(2) ) );
406 v2 = ( ( stressVector.
at(2) - stressVector.
at(3) ) * ( stressVector.
at(2) - stressVector.
at(3) ) );
407 v3 = ( ( stressVector.
at(3) - stressVector.
at(1) ) * ( stressVector.
at(3) - stressVector.
at(1) ) );
409 answer = ( 1. / 6. ) * ( v1 + v2 + v3 ) + stressVector.
at(4) * stressVector.
at(4) +
410 stressVector.
at(5) * stressVector.
at(5) + stressVector.
at(6) * stressVector.
at(6);
417J2MPlasticMaterial :: giveSizeOfFullHardeningVarsVector()
const
434J2MPlasticMaterial :: giveSizeOfReducedHardeningVarsVector(
GaussPoint *gp)
const
440 size += StructuralMaterial :: giveSizeOfVoigtSymVector( gp->
giveMaterialMode() );
452J2MPlasticMaterial :: giveStressBackVector(
FloatArray &answer,
453 const FloatArray &stressSpaceHardeningVars)
const
458 for (
int i = 1; i <= 6; i++ ) {
459 answer.
at(i) = stressSpaceHardeningVars.
at(i);
470J2MPlasticMaterial :: giveIsotropicHardeningVar(
const FloatArray &stressSpaceHardeningVars)
const
476 return stressSpaceHardeningVars.
at(7);
478 return stressSpaceHardeningVars.
at(1);
#define REGISTER_Material(class)
Index giveSize() const
Returns the size of receiver.
void zero()
Zeroes all coefficients of receiver.
bool isEmpty() const
Returns true if receiver is empty.
void add(const FloatArray &src)
bool isNotEmpty() const
Returns true if receiver is not empty.
void resize(Index rows, Index cols)
*Sets size of receiver to be an empty matrix It will have zero rows and zero columns size void clear()
void zero()
Zeroes all coefficient of receiver.
double at(std::size_t i, std::size_t j) const
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
int hasHardening() const override
int kinematicHardeningFlag
int giveSizeOfFullHardeningVarsVector() const override
double giveIsotropicHardeningVar(const FloatArray &stressSpaceHardeningVars) const
void giveStressBackVector(FloatArray &answer, const FloatArray &stressSpaceHardeningVars) const
double computeJ2InvariantAt(const FloatArray &stressVector) const
int giveSizeOfReducedHardeningVarsVector(GaussPoint *gp) const override
int isotropicHardeningFlag
void computeStressGradientVector(FloatArray &answer, functType ftype, int isurf, GaussPoint *gp, const FloatArray &stressVector, const FloatArray &stressSpaceHardeningVars) const override
MPlasticMaterial(int n, Domain *d)
functType
Type that allows to distinguish between yield function and loading function.
int nsurf
Number of yield surfaces.
enum oofem::MPlasticMaterial::ReturnMappingAlgoType rmType
LinearElasticMaterial * linearElasticMaterial
Reference to bulk (undamaged) material.
#define _IFT_J2MPlasticMaterial_khm
#define _IFT_J2MPlasticMaterial_ihm
#define _IFT_J2MPlasticMaterial_rma
#define _IFT_J2MPlasticMaterial_ry