void cMMTP::ExportResultInit() { int aNbIn = 0; int aNbOut = 0; Pt2di aP; for (aP.y = mP0Tiep.y ; aP.y<mP1Tiep.y ; aP.y++) { for (aP.x = mP0Tiep.x ; aP.x<mP1Tiep.x ; aP.x++) { cCelTiep & aCel = Cel(aP); Pt2di aPIm = aP - mP0Tiep; if (aCel.IsSet()) { int aZ = aCel.Pt().z; aNbIn++; if (mMasq3D && (! mMasq3D->IsInMasq(mNuage3D->IndexAndProfPixel2Euclid(Pt2dr(aPIm),aZ)))) { aNbOut++; } mTImProf.oset(aPIm,aZ); mTImMasqInit.oset(aPIm,1); } else { mTImProf.oset(aPIm,0); mTImMasqInit.oset(aPIm,0); } } } }
void IsotropicRankineDamage2D::CalculateMaterialResponse(const Vector& StrainVector, const Matrix& DeformationGradient, Vector& StressVector, Matrix& AlgorithmicTangent, const ProcessInfo& CurrentProcessInfo, const Properties& props, const GeometryType& geom, const Vector& ShapeFunctionsValues, bool CalculateStresses, int CalculateTangent, bool SaveInternalVariables) { //get material parameters const double E = props[YOUNG_MODULUS]; const double NU = props[POISSON_RATIO]; const double Gf = props[FRACTURE_ENERGY]; //*************************** const double sigma0 = props[YIELD_STRESS]; //*************************** const double r0 = sigma0; //*************************** const double retat = props[VISCOSITY]; //compute elastic stress Matrix Cel(3,3); Vector stress(3); CalculateElasticMatrix(Cel, E, NU); noalias(stress) = prod(Cel,StrainVector); //compute stress max eigenvalue const double sigma_m = 0.5*(stress[0]+ stress[1]); const double R = sqrt(stress[2]*stress[2] + 0.25*(stress[0]-stress[1])*(stress[0]-stress[1]) ); double smax = sigma_m + R; //compute tau double tau = smax; if(tau < 0) tau=0.0; //compute actualized damage indicator double r = mrold; if(tau > r) { if(retat == 0) r=tau; else { double dt = CurrentProcessInfo[DELTA_TIME]; double ratio = dt/retat; r = std::max( r , (mrold + ratio*tau)/(1.0+ratio) ); } } //compute element lenght double he=0.0; for(unsigned int i=0; i<geom.size(); i++) { const double hn = geom[i].GetSolutionStepValue(NODAL_H); he += hn*ShapeFunctionsValues[i]; } // double A = geom.Area(); // const double he = sqrt(2.0*A); const double lch=2.0*he; const double ls =2.0*E*Gf/(sigma0*sigma0); double Hs = lch/(ls -lch); if(Hs < 0.0) Hs=1.0e10; // KRATOS_WATCH(Hs); double d=0.0; if(r>=r0) d = 1.0 - r0/r*exp(-2.0*Hs*(r-r0)/r0); if(d > 0.9999) d = 0.9999; // KRATOS_WATCH(d); //write outputs as needed if(CalculateStresses == true) noalias(StressVector) = (1.0-d)*stress; if(CalculateTangent == 1) noalias(AlgorithmicTangent) = (1.0-d)*Cel; //keep trace of internal variables if allowed, otherwise reset them if(SaveInternalVariables == false) mr = mrold; else { mr = r; //save variable for output md=d; } // KRATOS_WATCH(md); //std::cout << this << " inside calculate md " << md << std::endl; }
cCelTiep & Cel(const Pt2di & aP) { return Cel(aP.x,aP.y);}