Ejemplo n.º 1
0
// Traction law - assume trianglar shape with unloading from down slope back to the origin
void CubicTraction::CrackTractionLaw(CrackSegment *cs,double nCod,double tCod,double dx,double dy,double area)
{
	double Tn=0.,Tt=0.,GI=0.,GII=0.;
	double *upeak =(double *)cs->GetHistoryData();
	
	// normal force and GI (only if open)
	if(nCod>0.)
	{	// is it failed?
		if(nCod>delIc)
		{	cs->SetMatID(0);			// then debonded
			GI = JIc;
		}
		else
		{	if(nCod>upeak[0]) upeak[0]=nCod;		// new peak reached
			double keff=kI1*(delIc-upeak[0])*(delIc-upeak[0]);
			Tn=keff*nCod;
			
			// get GI for failure law
			double d=nCod/delIc;
			GI=JIc*d*d*(6.-8.*d+3.*d*d);		// N/m
		}
	}
	
	// shear force and GII always
    // is it failed?
    double absTCod=fabs(tCod);
    if(absTCod>delIIc)
    {	cs->SetMatID(0);			// then debonded
        GII = JIIc;
    }
    else
    {	if(absTCod>upeak[1]) upeak[1]=absTCod;		// new peak reached in either direction
        double keff=kII1*(delIIc-upeak[1])*(delIIc-upeak[1]);
        Tt=keff*tCod;
        
        // get GII for failure law
        double d=tCod/delIIc;
        GII=JIIc*d*d*(6.-8.*d+3.*d*d);		// N/m
    }
	
    // failure criterion
    if(cs->MatID()<0)
    {   // it failed above in pure mode
        ReportDebond(mtime, cs, GI/(GI+GII),GI+GII);
        Tn = 0.;                                       // turn off in tractions, if calculated
        Tt = 0.;
    }
	else if(nmix>0)
    {   // mixed mode failure? (nmix<=0 uses infinity which means fails when either COD becomes critical)
		if(pow(GI/JIc,nmix)+pow(GII/JIIc,nmix) > 1)
		{	cs->SetMatID(0);				// now debonded
			ReportDebond(mtime,cs,GI/(GI+GII),GI+GII);
			Tn=0.;
			Tt=0.;
		}
	}
	
	// force is traction times area projected onto x-y plane
	cs->tract.x=area*(Tn*dy - Tt*dx);
	cs->tract.y=area*(-Tn*dx - Tt*dy);
}
Ejemplo n.º 2
0
// Traction law - assume trianglar shape with unloading from down slope back to the origin
void TrilinearTraction::CrackTractionLaw(CrackSegment *cs,double nCod,double tCod,double dx,double dy,double area)
{
	double Tn=0.,Tt=0.,GI=0.,GII=0.;
	double *upeak =(double *)cs->GetHistoryData();
	
	// normal force and GI (only if open)
	if(nCod>0.)
	{	// is it failed?
		if(nCod>delIc)
		{	cs->SetMatID(0);                        // then debonded
			GI = JIc;
		}
		else
		{	if(nCod>upeak[0]) upeak[0]=nCod;                        // new peak reached
			double keff;
			if(upeak[0]<=uI2)
			{	if(break1is2I)
					keff = stress1/upeak[0];
				else
					keff = (sI2*(upeak[0]-umidI)+stress1*(uI2-upeak[0]))/((uI2-umidI)*upeak[0]);
			}
			else
				keff = sI2*(delIc-upeak[0])/((delIc-uI2)*upeak[0]);
			Tn = keff*nCod;
			
			// get GI for failure law
			if(nCod<umidI)
            {   // note that initial linear softening never because umidI=0
				GI = 0.5*kI1*nCod*nCod;
            }
			else if(nCod<=uI2)
			{	if(break1is2I)
					GI = 0.5*stress1*umidI;
				else
				{	double s2 = (sI2*(nCod-umidI)+stress1*(uI2-nCod))/(uI2-umidI);
					GI = 0.5*(nCod*stress1 + s2*(nCod - umidI));
				}
			}
			else
			{	double s2 = (delIc-nCod)*sI2/(delIc-uI2);
				GI = 0.5*(stress1*uI2 + sI2*(nCod-umidI) + s2*(nCod-uI2));
			}
		}
	}
	
	// shear force and GII always
    // is it failed?
    double absTCod=fabs(tCod);
    if(absTCod>delIIc)
    {	cs->SetMatID(0);                        // then debonded
        GII = JIIc;
    }
    else if(absTCod>0.)
    {	if(absTCod>upeak[1]) upeak[1]=absTCod;                        // new peak reached
        double keff;
        if(upeak[1]<=uII2)
        {	if(break1is2II)
                keff = stress2/upeak[1];
            else
                keff = (sII2*(upeak[1]-umidII)+stress2*(uII2-upeak[1]))/((uII2-umidII)*upeak[1]);
        }
        else
            keff = sII2*(delIIc-upeak[1])/((delIIc-uII2)*upeak[1]);
        Tt = keff*tCod;
        
        // get GII for failure law
        if(absTCod<umidII)
        {   // note that initial linear softening never because umidI=0
            GII = 0.5*kII1*tCod*tCod;
        }
        else if(absTCod<=uII2)
        {	if(break1is2II)
                GII = 0.5*stress2*umidII;
            else
            {	double s2 = (sII2*(absTCod-umidII)+stress2*(uII2-absTCod))/(uII2-umidII);
                GII = 0.5*(absTCod*stress2 + s2*(absTCod - umidII));
            }
        }
        else
        {	double s2 = (delIIc-absTCod)*sII2/(delIIc-uII2);
            GII = 0.5*(stress2*uII2 + sII2*(absTCod-umidII) + s2*(absTCod-uII2));
        }
    }
	
    // failure criterion
    if(cs->MatID()<0)
    {   // it failed above in pure mode
        ReportDebond(mtime, cs, GI/(GI+GII),GI+GII);
        Tn = 0.;                                       // turn off in tractions, if calculated
        Tt = 0.;
    }
	else if(nmix>0)
    {   // mixed mode failure? (nmix<=0 uses infinity which means fails when either COD becomes critical)
		if(pow(GI/JIc,nmix)+pow(GII/JIIc,nmix) > 1)
		{	cs->SetMatID(0);				// now debonded
			ReportDebond(mtime,cs,GI/(GI+GII),GI+GII);
			Tn = 0.;                                       // turn off in tractions, if calculated
			Tt = 0.;
		}
	}
	
	// force is traction times area projected onto x-y plane
	cs->tract.x = area*(Tn*dy - Tt*dx);
	cs->tract.y = area*(-Tn*dx - Tt*dy);
}