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);}