diff --git a/dG3D/src/nonLocalDamageDG3DMaterialLaw.cpp b/dG3D/src/nonLocalDamageDG3DMaterialLaw.cpp index bf234e4504b2517fbe25f367314fe462a4b25bde..b5e14db9e0dfcf14b3d82fc88f5caa9ded63fa21 100644 --- a/dG3D/src/nonLocalDamageDG3DMaterialLaw.cpp +++ b/dG3D/src/nonLocalDamageDG3DMaterialLaw.cpp @@ -2560,7 +2560,7 @@ NonlocalDamageTorchANNBasedDG3DMaterialLaw::NonlocalDamageTorchANNBasedDG3DMater _SZXmean(SZXmean), _SZXstd(SZXstd), _elTangCompxxxxmean(elTangCompxxxxmean), _elTangCompxxxxstd(elTangCompxxxxstd), _elTangCompyyxxmean(elTangCompyyxxmean), _elTangCompyyxxstd(elTangCompyyxxstd), _elTangCompzzxxmean(elTangCompzzxxmean), _elTangCompzzxxstd(elTangCompzzxxstd), _elTangCompxyxymean(elTangCompxyxymean), _elTangCompxyxystd(elTangCompxyxystd), _elTangCompxzxzmean(elTangCompxzxzmean), _elTangCompxzxzstd(elTangCompxzxzstd), _elTangCompyyyymean(elTangCompyyyymean), _elTangCompyyyystd(elTangCompyyyystd), _elTangCompzzyymean(elTangCompzzyymean), _elTangCompzzyystd(elTangCompzzyystd), _elTangCompyzyzmean(elTangCompyzyzmean), _elTangCompyzyzstd(elTangCompyzyzstd), _elTangCompzzzzmean(elTangCompzzzzmean), _elTangCompzzzzstd(elTangCompzzzzstd), _NonDamTangCompxxxxmean(NonDamTangCompxxxxmean), _NonDamTangCompxxxxstd(NonDamTangCompxxxxstd), _NonDamTangCompyyxxmean(NonDamTangCompyyxxmean), _NonDamTangCompyyxxstd(NonDamTangCompyyxxstd), _NonDamTangCompzzxxmean(NonDamTangCompzzxxmean), _NonDamTangCompzzxxstd(NonDamTangCompzzxxstd), _NonDamTangCompxyxymean(NonDamTangCompxyxymean), _NonDamTangCompxyxystd(NonDamTangCompxyxystd), _NonDamTangCompxzxzmean(NonDamTangCompxzxzmean), _NonDamTangCompxzxzstd(NonDamTangCompxzxzstd), _NonDamTangCompyyyymean(NonDamTangCompyyyymean), _NonDamTangCompyyyystd(NonDamTangCompyyyystd), _NonDamTangCompzzyymean(NonDamTangCompzzyymean), _NonDamTangCompzzyystd(NonDamTangCompzzyystd), _NonDamTangCompyzyzmean(NonDamTangCompyzyzmean), _NonDamTangCompyzyzstd(NonDamTangCompyzyzstd), _NonDamTangCompzzzzmean(NonDamTangCompzzzzmean), _NonDamTangCompzzzzstd(NonDamTangCompzzzzstd), - _tangentByPerturbation(pert), _pertTol(tol), _kinematicInput(EGL),_NeedExtraNorm(false),_DoubleInput(false),_RNN(true),_Ie00(1), _Ie01(1), _Ie02(1), _Ie11(1), _Ie12(1), _Ie22(1), _Id0000(1), _Id0100(1), _Id0200(1), _Id1100(1), _Id1200(1), _Id2200(1), _Id0101(1), _Id0201(1), _Id1101(1), _Id1201(1), _Id2201(1), _Id0202(1), _Id1102(1), _Id1202(1), _Id2202(1), _Id1111(1), _Id1211(1), _Id2211(1), _Id1212(1), _Id2212(1), _Id2222(1), _incrlimit(0.0004) + _tangentByPerturbation(pert), _pertTol(tol), _kinematicInput(EGL),_NeedExtraNorm(false),_DoubleInput(false),_RNN(true),_Ie00(1), _Ie01(1), _Ie02(1), _Ie11(1), _Ie12(1), _Ie22(1), _Id0000(1), _Id0100(1), _Id0200(1), _Id1100(1), _Id1200(1), _Id2200(1), _Id0101(1), _Id0201(1), _Id1101(1), _Id1201(1), _Id2201(1), _Id0202(1), _Id1102(1), _Id1202(1), _Id2202(1), _Id1111(1), _Id1211(1), _Id2211(1), _Id1212(1), _Id2212(1), _Id2222(1), _incrlimit(0.0004), _tooBigStep(false) { _mecalocalLaw = NULL; cLLaw.resize(_numNonlocalVar); @@ -2653,7 +2653,7 @@ NonlocalDamageTorchANNBasedDG3DMaterialLaw::NonlocalDamageTorchANNBasedDG3DMater _SYZmean(src._SYZmean), _SYZstd(src._SYZstd), _SZZmean(src._SZZmean), _SZZstd(src._SZZstd), _SZXmean(src._SZXmean), _SZXstd(src._SZXstd), _elTangCompxxxxmean(src._elTangCompxxxxmean), _elTangCompxxxxstd(src._elTangCompxxxxstd), _elTangCompyyxxmean(src._elTangCompyyxxmean), _elTangCompyyxxstd(src._elTangCompyyxxstd), _elTangCompzzxxmean(src._elTangCompzzxxmean), _elTangCompzzxxstd(src._elTangCompzzxxstd), _elTangCompxyxymean(src._elTangCompxyxymean), _elTangCompxyxystd(src._elTangCompxyxystd), _elTangCompxzxzmean(src._elTangCompxzxzmean), _elTangCompxzxzstd(src._elTangCompxzxzstd), _elTangCompyyyymean(src._elTangCompyyyymean), _elTangCompyyyystd(src._elTangCompyyyystd), _elTangCompzzyymean(src._elTangCompzzyymean), _elTangCompzzyystd(src._elTangCompzzyystd), _elTangCompyzyzmean(src._elTangCompyzyzmean), _elTangCompyzyzstd(src._elTangCompyzyzstd), _elTangCompzzzzmean(src._elTangCompzzzzmean), _elTangCompzzzzstd(src._elTangCompzzzzstd), _NonDamTangCompxxxxmean(src._NonDamTangCompxxxxmean), _NonDamTangCompxxxxstd(src._NonDamTangCompxxxxstd), _NonDamTangCompyyxxmean(src._NonDamTangCompyyxxmean), _NonDamTangCompyyxxstd(src._NonDamTangCompyyxxstd), _NonDamTangCompzzxxmean(src._NonDamTangCompzzxxmean), _NonDamTangCompzzxxstd(src._NonDamTangCompzzxxstd), _NonDamTangCompxyxymean(src._NonDamTangCompxyxymean), _NonDamTangCompxyxystd(src._NonDamTangCompxyxystd), _NonDamTangCompxzxzmean(src._NonDamTangCompxzxzmean), _NonDamTangCompxzxzstd(src._NonDamTangCompxzxzstd), _NonDamTangCompyyyymean(src._NonDamTangCompyyyymean), _NonDamTangCompyyyystd(src._NonDamTangCompyyyystd), _NonDamTangCompzzyymean(src._NonDamTangCompzzyymean), _NonDamTangCompzzyystd(src._NonDamTangCompzzyystd), _NonDamTangCompyzyzmean(src._NonDamTangCompyzyzmean), _NonDamTangCompyzyzstd(src._NonDamTangCompyzyzstd), _NonDamTangCompzzzzmean(src._NonDamTangCompzzzzmean), _NonDamTangCompzzzzstd(src._NonDamTangCompzzzzstd), - _tangentByPerturbation(src._tangentByPerturbation),_pertTol(src._pertTol), _kinematicInput(src._kinematicInput),_NeedExtraNorm(src._NeedExtraNorm),_DoubleInput(src._DoubleInput), _mecalocalLaw(NULL), _RNN(src._RNN),_Ie00(src._Ie00), _Ie01(src._Ie01), _Ie02(src._Ie02), _Ie11(src._Ie11), _Ie12(src._Ie12), _Ie22(src._Ie22), _Id0000(src._Id0000), _Id0100(src._Id0100), _Id0200(src._Id0200), _Id1100(src._Id1100), _Id1200(src._Id1200), _Id2200(src._Id2200), _Id0101(src._Id0101), _Id0201(src._Id0201), _Id1101(src._Id1101), _Id1201(src._Id1201), _Id2201(src._Id2201), _Id0202(src._Id0202), _Id1102(src._Id1102), _Id1202(src._Id1202), _Id2202(src._Id2202), _Id1111(src._Id1111), _Id1211(src._Id1211), _Id2211(src._Id2211), _Id1212(src._Id1212), _Id2212(src._Id2212), _Id2222(src._Id2222), _incrlimit(src._incrlimit) + _tangentByPerturbation(src._tangentByPerturbation),_pertTol(src._pertTol), _kinematicInput(src._kinematicInput),_NeedExtraNorm(src._NeedExtraNorm),_DoubleInput(src._DoubleInput), _mecalocalLaw(NULL), _RNN(src._RNN),_Ie00(src._Ie00), _Ie01(src._Ie01), _Ie02(src._Ie02), _Ie11(src._Ie11), _Ie12(src._Ie12), _Ie22(src._Ie22), _Id0000(src._Id0000), _Id0100(src._Id0100), _Id0200(src._Id0200), _Id1100(src._Id1100), _Id1200(src._Id1200), _Id2200(src._Id2200), _Id0101(src._Id0101), _Id0201(src._Id0201), _Id1101(src._Id1101), _Id1201(src._Id1201), _Id2201(src._Id2201), _Id0202(src._Id0202), _Id1102(src._Id1102), _Id1202(src._Id1202), _Id2202(src._Id2202), _Id1111(src._Id1111), _Id1211(src._Id1211), _Id2211(src._Id2211), _Id1212(src._Id1212), _Id2212(src._Id2212), _Id2222(src._Id2222), _incrlimit(src._incrlimit), _tooBigStep(src._tooBigStep) { #if defined(HAVE_TORCH) module_stress = src.module_stress; @@ -3552,6 +3552,9 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::stress(IPVariable* ipv, const I //beginning step 8.1: we retrieve the stress STensor3& P = ipvcur->getRefToFirstPiolaKirchhoffStress(); P=S_rec; + if (_tooBigStep){ //added on 13/06/2025 to reject the step if the strain increment is too big + P(0,0)=P(1,1)=P(2,2)=sqrt(-1); + } //end step 8.1 //beginning step 8.1.5: we compute the derivatives even if we do not retrieve them yet @@ -5476,6 +5479,7 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::compute_local_values(const nonL dE(i,j)=E1Tensor(i,j)-E0Tensor(i,j); } } + //beginning of finding the maximal strain increment double max_incr=0.; @@ -5489,11 +5493,16 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::compute_local_values(const nonL //end of finding the maximal strain increment int nb_substep=ceil(max_incr/_incrlimit); //the number of substeps - if(nb_substep >100) - { - Msg::Info("substep reaches the maximum number, %d",nb_substep); - nb_substep=100; + _tooBigStep = false; + if(nb_substep >100){ + Msg::Info("substep reaches the maximum number, %d",nb_substep); + if (nb_substep > 500){ //added on 13/06/2025 to reject the step when the strain increment is too big + _tooBigStep=true; + } + nb_substep=100; } + + STensor3 dEsubstep; for (int i=0;i<3;i++){ for (int j=0;j<3;j++){ @@ -5560,13 +5569,13 @@ void NonlocalDamageTorchANNBasedDG3DMaterialLaw::RNNstress_stiff(const STensor3& dEyy=E1Tensor(1,1)-E0Tensor(1,1); dExy=E1Tensor(0,1)-E0Tensor(0,1); if (abs(dExx)>_incrlimit){ - //std::cout << "Warning: beyond the limit increment for epsilon_XX: " << dExx << "\n"; + //std::cout << "Warning: beyond the limit increment for epsilon_XX: " << dExx << "\n"; //commented on 12/06/25 because the nb of substeps is limited and we can a bit beyond the limit increment } if (abs(dEyy)>_incrlimit){ - //std::cout << "Warning: beyond the limit increment for epsilon_YY: " << dEyy << "\n"; + //std::cout << "Warning: beyond the limit increment for epsilon_YY: " << dEyy << "\n"; //commented on 12/06/25 because the nb of substeps is limited and we can a bit beyond the limit increment } if (abs(dExy)>_incrlimit){ - //std::cout << "Warning: beyond the limit increment for epsilon_XY: " << dExy << "\n"; + //std::cout << "Warning: beyond the limit increment for epsilon_XY: " << dExy << "\n"; //commented on 12/06/25 because the nb of substeps is limited and we can a bit beyond the limit increment } //end check for strain increments diff --git a/dG3D/src/nonLocalDamageDG3DMaterialLaw.h b/dG3D/src/nonLocalDamageDG3DMaterialLaw.h index 89b80597507a5dd77a4bd7ab338b246ed4e5167f..cc31a0d1f1f840127f384b148c2a8aad7bf2ab28 100644 --- a/dG3D/src/nonLocalDamageDG3DMaterialLaw.h +++ b/dG3D/src/nonLocalDamageDG3DMaterialLaw.h @@ -913,6 +913,7 @@ class NonlocalDamageTorchANNBasedDG3DMaterialLaw : public dG3DMaterialLaw{ bool _DoubleInput; int _numNonlocalVar; double _incrlimit; //the maximal strain increment with which your RNN trained can predict + bool _tooBigStep; //(added on 13/06/25) becomes true when the strain step is so big that it would need a lot of substeps to compute the stress corresponding correctly, in that case, the step is rejected std::vector< CLengthLaw * > cLLaw; materialLaw *_mecalocalLaw; bool _RNN;