@@ -84,6 +84,10 @@ namespace oofem {
8484
8585 numberOfSubIncrements = 10 ;
8686 IR_GIVE_OPTIONAL_FIELD (ir , this -> numberOfSubIncrements , _IFT_LatticeFrameSteelPlastic_sub ); // Macro
87+
88+ this -> hardeningLength = 0. ;
89+ IR_GIVE_OPTIONAL_FIELD (ir , this -> hardeningLength , _IFT_LatticeFrameSteelPlastic_hlength ); //length scale for hardening variable
90+
8791 hType = 0 ;
8892 IR_GIVE_OPTIONAL_FIELD (ir , this -> hType , _IFT_LatticeFrameSteelPlastic_htype ); //hardening type
8993
@@ -169,7 +173,7 @@ namespace oofem {
169173
170174 if ( this -> hType == 0 ) {
171175 hardening = 1. + this -> H * kappa ;
172- } else {
176+ } else {
173177 if ( kappa > h_eps .at (h_eps .giveSize () ) ) {
174178 OOFEM_ERROR ("kappa outside range of specified hardening law/n" );
175179 }
@@ -254,7 +258,8 @@ namespace oofem {
254258 m .at (2 ) = 2. * mx / ( pow (mx0Reduced , 2. ) * pow (hardening , 2. ) );
255259 m .at (3 ) = 2. * my / ( pow (my0Reduced , 2. ) * pow (hardening , 2. ) );
256260 m .at (4 ) = 2. * mz / ( pow (mz0Reduced , 2. ) * pow (hardening , 2. ) );
257- m .at (5 ) = fabs (2. * nx / ( pow (nx0Reduced , 2. ) * pow (hardening , 2. ) ) );
261+
262+ m .at (5 ) = sqrt (pow (m .at (1 ), 2. ) + pow (this -> hardeningLength , 2. ) * ( pow (m .at (2 ), 2. ) + pow (m .at (3 ), 2. ) + pow (m .at (4 ), 2. ) ) );
258263
259264 return m ;
260265 }
@@ -265,6 +270,8 @@ namespace oofem {
265270 FloatMatrixF < 5 , 5 >
266271 LatticeFrameSteelPlastic ::computeDMMatrix (const FloatArrayF < 4 > & stress , const double kappa , GaussPoint * gp , TimeStep * tStep ) const
267272 {
273+ auto mVector = computeMVector (stress , kappa , gp , tStep );
274+
268275 FloatMatrixF < 5 , 5 > dm ;
269276
270277 double hardening = computeHardening (kappa );
@@ -304,21 +311,36 @@ namespace oofem {
304311 dm .at (3 , 3 ) = 2. / ( pow (my0Reduced , 2. ) * pow (hardening , 2. ) );
305312 dm .at (3 , 4 ) = 0 ;
306313 dm .at (3 , 5 ) = -4. * stress .at (3 ) / ( pow (my0Reduced , 2. ) * pow (hardening , 3. ) ) * dHardeningDKappa ;
307- ;
314+
308315
309316 dm .at (4 , 1 ) = 0 ;
310317 dm .at (4 , 2 ) = 0 ;
311318 dm .at (4 , 3 ) = 0 ;
312319 dm .at (4 , 4 ) = 2. / ( pow (mz0Reduced , 2. ) * pow (hardening , 2. ) );
313320 dm .at (4 , 5 ) = -4. * stress .at (4 ) / ( pow (mz0Reduced , 2. ) * pow (hardening , 3. ) ) * dHardeningDKappa ;
314- ;
315321
316- dm .at (5 , 1 ) = sgn (stress .at (1 ) ) * 2. / ( pow (nx0Reduced , 2. ) * pow (hardening , 2. ) );
317- dm .at (5 , 2 ) = 0. ;
318- dm .at (5 , 3 ) = 0. ;
319- dm .at (5 , 4 ) = 0. ;
320- dm .at (5 , 5 ) = -4.0 * fabs (stress .at (1 ) ) / ( pow (nx0 , 2 ) * pow (hardening , 3. ) ) * dHardeningDKappa ;
321322
323+ if ( this -> hardeningLength == 0. ) {
324+ dm .at (5 , 1 ) = sgn (stress .at (1 ) ) * dm .at (1 , 1 );
325+ dm .at (5 , 2 ) = 0.0 ;
326+ dm .at (5 , 3 ) = 0.0 ;
327+ dm .at (5 , 4 ) = 0.0 ;
328+ dm .at (5 , 5 ) = -4.0 * fabs (stress .at (1 ) ) / ( pow (nx0Reduced , 2. ) * pow (hardening , 3. ) ) * dHardeningDKappa ;
329+ } else if ( fabs (mVector .at (5 ) ) > 1.e-14 ) {
330+ dm .at (5 , 1 ) = mVector .at (1 ) * dm .at (1 , 1 ) / mVector .at (5 );
331+ dm .at (5 , 2 ) = mVector .at (2 ) * dm .at (2 , 2 ) * pow (hardeningLength , 2. ) / mVector .at (5 );
332+ dm .at (5 , 3 ) = mVector .at (3 ) * dm .at (3 , 3 ) * pow (hardeningLength , 2. ) / mVector .at (5 );
333+ dm .at (5 , 4 ) = mVector .at (4 ) * dm .at (4 , 4 ) * pow (hardeningLength , 2. ) / mVector .at (5 );
334+
335+ double term1 = mVector .at (1 ) * ( -4. * stress .at (1 ) / ( pow (nx0Reduced , 2. ) * pow (hardening , 3. ) ) ) * dHardeningDKappa ;
336+ double term2 = mVector .at (2 ) * ( -4. * stress .at (2 ) / ( pow (mx0Reduced , 2. ) * pow (hardening , 3. ) ) ) * dHardeningDKappa ;
337+ double term3 = mVector .at (3 ) * ( -4. * stress .at (3 ) / ( pow (my0Reduced , 2. ) * pow (hardening , 3. ) ) ) * dHardeningDKappa ;
338+ double term4 = mVector .at (4 ) * ( -4. * stress .at (4 ) / ( pow (mz0Reduced , 2. ) * pow (hardening , 3. ) ) ) * dHardeningDKappa ;
339+
340+ dm .at (5 , 5 ) = ( term1 + pow (this -> hardeningLength , 2. ) * ( term2 + term3 + term4 ) ) / mVector .at (5 );
341+ } else {
342+ OOFEM_ERROR ("mVector.at(5) in computeDMMatrix should not be zero\n" );
343+ }
322344 return dm ;
323345 }
324346
@@ -563,7 +585,6 @@ namespace oofem {
563585 residuals .at (6 ) = computeYieldValue (tempStress , tempKappa , gp , tStep );
564586 }
565587 }
566-
567588 status -> letTempReturnResultBe (LatticeFrameSteelPlastic ::RR_Converged );
568589
569590 stress = tempStress ;
@@ -669,7 +690,7 @@ namespace oofem {
669690 fprintf (file , "% .8e ", s );
670691 }
671692 fprintf (file , "kappa % .8e " , this -> kappa );
672- fprintf (file , "\n" );
693+ fprintf (file , "\n" );
673694 }
674695
675696
0 commit comments