58 MPlasticMaterial2 :: initializeFrom(ir);
62 k = value / sqrt(3.0);
88std::unique_ptr<MaterialStatus>
95J2Mat :: giveSizeOfFullHardeningVarsVector()
const
112J2Mat :: giveSizeOfReducedHardeningVarsVector(
GaussPoint *gp)
const
118 size += StructuralMaterial :: giveSizeOfVoigtSymVector( gp->
giveMaterialMode() );
131 const FloatArray &strainSpaceHardeningVars)
const
138 helpVector = stressVector;
140 helpVector.
add(backStress);
145 helpVector = stressVector;
155 const FloatArray &strainSpaceHardeningVars)
const
159 double f, ax, ay, az, sx, sy, sz;
167 helpVector = stressVector;
168 helpVector.
add(backStress);
173 helpVector = stressVector;
178 if ( fabs(f) < 1.e-6 ) {
182 ax = helpVector.
at(1);
183 ay = helpVector.
at(2);
184 az = helpVector.
at(3);
186 sx = ( 2. / 3. ) * ax - ( 1. / 3. ) * ay - ( 1. / 3. ) * az;
187 sy = ( 2. / 3. ) * ay - ( 1. / 3. ) * ax - ( 1. / 3. ) * az;
188 sz = ( 2. / 3. ) * az - ( 1. / 3. ) * ay - ( 1. / 3. ) * ax;
190 answer.
at(1) = 0.5 * sx / f;
191 answer.
at(2) = 0.5 * sy / f;
192 answer.
at(3) = 0.5 * sz / f;
193 answer.
at(4) = helpVector.
at(4) / f;
194 answer.
at(5) = helpVector.
at(5) / f;
195 answer.
at(6) = helpVector.
at(6) / f;
208 int sizer = dplasticStrain.
giveSize();
209 double coeff = sqrt(2.) * ( 2. / 3. );
210 for (
int i = 1; i <= sizer; i++ ) {
211 answer.
at(i) = dplasticStrain.
at(i) * coeff;
216 answer.
at(size) = sqrt(1. / 3.) * dlambda.
at(1);
223 const FloatArray &strainSpaceHardeningVariables)
const
238 kcount = reducedKinematicGrad.
giveSize();
239 for (
int i = 1; i <= kcount; i++ ) {
255 int rsize = StructuralMaterial :: giveSizeOfVoigtSymVector( gp->
giveMaterialMode() );
260 double coeff = sqrt(2.) * ( 2. / 3. ) * gamma.
at(1);
264 for (
int i = 1; i <= rsize; i++ ) {
265 for (
int j = 1; j <= rsize; j++ ) {
266 answer.
at(i, j) = coeff * h.
at(i, j);
286 strainSpaceHardeningVars);
288 for (
int i = 1; i <= rsize; i++ ) {
289 answer.
at(i, 1) = loadGradSigVec.
at(i);
292 answer.
times( sqrt(2.) * ( 2. / 3. ) );
296 answer.
at(size, 1) = sqrt(1. / 3.);
303 const FloatArray &strainSpaceHardeningVars)
const
309 double f, f32, f12, ax, ay, az;
311 StructuralMaterial :: giveInvertedVoigtVectorMask( mask, gp->
giveMaterialMode() );
312 size = StructuralMaterial :: giveSizeOfVoigtSymVector( gp->
giveMaterialMode() );
314 gradientMatrix.
resize(size, size);
315 gradientMatrix.
zero();
318 if ( fullStressVector.
giveSize() != 0 ) {
322 helpVector = fullStressVector;
323 helpVector.
add(backStress);
325 helpVector = fullStressVector;
330 f32 = pow(f, 3. / 2.);
332 ax = helpVector.
at(1);
333 ay = helpVector.
at(2);
334 az = helpVector.
at(3);
336 df.
at(1) = ( 2. / 3. ) * ax - ( 1. / 3. ) * ay - ( 1. / 3. ) * az;
337 df.
at(2) = ( 2. / 3. ) * ay - ( 1. / 3. ) * ax - ( 1. / 3. ) * az;
338 df.
at(3) = ( 2. / 3. ) * az - ( 1. / 3. ) * ay - ( 1. / 3. ) * ax;
339 df.
at(4) = 2. * helpVector.
at(4);
340 df.
at(5) = 2. * helpVector.
at(5);
341 df.
at(6) = 2. * helpVector.
at(6);
343 for (
int i = 1; i <= 3; i++ ) {
344 if ( ( imask = mask.
at(i) ) == 0 ) {
348 for (
int j = i; j <= 3; j++ ) {
349 if ( ( jmask = mask.
at(j) ) == 0 ) {
354 gradientMatrix.
at(imask, jmask) = -( 1. / 4. ) * ( 1. / f32 ) * df.
at(i) * df.
at(j) + 0.5 * ( 1. / f12 ) * ( 4. / 6 );
356 gradientMatrix.
at(imask, jmask) = -( 1. / 4. ) * ( 1. / f32 ) * df.
at(i) * df.
at(j) + 0.5 * ( 1. / f12 ) * ( -2. / 6 );
357 gradientMatrix.
at(jmask, imask) = -( 1. / 4. ) * ( 1. / f32 ) * df.
at(i) * df.
at(j) + 0.5 * ( 1. / f12 ) * ( -2. / 6 );
362 for (
int i = 1; i <= 3; i++ ) {
363 if ( ( imask = mask.
at(i) ) == 0 ) {
367 for (
int j = 4; j <= 6; j++ ) {
368 if ( ( jmask = mask.
at(j) ) == 0 ) {
372 gradientMatrix.
at(imask, jmask) = -( 1. / 4. ) * ( 1. / f32 ) * df.
at(i) * df.
at(j);
373 gradientMatrix.
at(jmask, imask) = -( 1. / 4. ) * ( 1. / f32 ) * df.
at(i) * df.
at(j);
377 for (
int i = 4; i <= 6; i++ ) {
378 if ( ( imask = mask.
at(i) ) == 0 ) {
382 for (
int j = i; j <= 6; j++ ) {
383 if ( ( jmask = mask.
at(j) ) == 0 ) {
388 gradientMatrix.
at(imask, jmask) = -( 1. / 4. ) * ( 1. / f32 ) * df.
at(i) * df.
at(j) + 0.5 * ( 1. / f12 ) * 2.;
390 gradientMatrix.
at(imask, jmask) = -( 1. / 4. ) * ( 1. / f32 ) * df.
at(i) * df.
at(j);
391 gradientMatrix.
at(jmask, imask) = -( 1. / 4. ) * ( 1. / f32 ) * df.
at(i) * df.
at(j);
401 const FloatArray &strainSpaceHardeningVariables)
const
407 gradientMatrix.
zero();
414 for (
int ii = 1; ii <= kcount; ii++ ) {
415 for (
int j = 1; j <= kcount; j++ ) {
416 gradientMatrix.
at(ii, j) = helpMat.
at(ii, j);
424J2Mat :: hasHardening()
const
436 if ( stressVector.
isEmpty() ) {
440 v1 = ( ( stressVector.
at(1) - stressVector.
at(2) ) * ( stressVector.
at(1) - stressVector.
at(2) ) );
441 v2 = ( ( stressVector.
at(2) - stressVector.
at(3) ) * ( stressVector.
at(2) - stressVector.
at(3) ) );
442 v3 = ( ( stressVector.
at(3) - stressVector.
at(1) ) * ( stressVector.
at(3) - stressVector.
at(1) ) );
444 answer = ( 1. / 6. ) * ( v1 + v2 + v3 ) + stressVector.
at(4) * stressVector.
at(4) +
445 stressVector.
at(5) * stressVector.
at(5) + stressVector.
at(6) * stressVector.
at(6);
453 const FloatArray &strainSpaceHardeningVars)
const
461 StructuralMaterial :: giveVoigtSymVectorMask( mask, gp->
giveMaterialMode() );
466 for (
int i = 1; i <= isize; i++ ) {
#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)
void zero()
Zeroes all coefficient of receiver.
int giveNumberOfRows() const
Returns number of rows of receiver.
double at(std::size_t i, std::size_t j) const
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
static double computeJ2InvariantAt(const FloatArray &stressVector)
void computeReducedSSGradientMatrix(FloatMatrix &gradientMatrix, int i, GaussPoint *gp, const FloatArray &fullStressVector, const FloatArray &strainSpaceHardeningVariables) const override
Computes second derivative of loading function with respect to stress.
int kinematicHardeningFlag
int giveSizeOfReducedHardeningVarsVector(GaussPoint *gp) const override
double giveIsotropicHardeningVar(GaussPoint *gp, const FloatArray &strainSpaceHardeningVars) const
void giveStressBackVector(FloatArray &answer, GaussPoint *gp, const FloatArray &strainSpaceHardeningVars) const
int isotropicHardeningFlag
int hasHardening() const override
void computeReducedStressGradientVector(FloatArray &answer, functType ftype, int isurf, GaussPoint *gp, const FloatArray &stressVector, const FloatArray &strainSpaceHardeningVariables) const
enum oofem::MPlasticMaterial2::ReturnMappingAlgoType rmType
LinearElasticMaterial * linearElasticMaterial
Reference to bulk (undamaged) material.
functType
Type that allows to distinguish between yield function and loading function.
MPlasticMaterial2(int n, Domain *d)
int nsurf
Number of yield surfaces.