Пример #1
0
void TPZYCCamClayPV::ProjectSigmaDep(const TPZVec<REAL> &sigma_trial_pv, const REAL aPrev, TPZVec<REAL> &sigma, REAL &aProj, TPZFMatrix<REAL> &GradSigma) const {
    TPZVec<REAL> yield(NYield);
    this->Phi(sigma_trial_pv, aPrev, yield);

    if (yield[0] <= 0.) {
        sigma = sigma_trial_pv;
        aProj = aPrev;
        GradSigma.Identity();
    } else {
        const REAL tol=1.e-5;
        bool threeEigEqual = (fabs(sigma_trial_pv[0] - sigma_trial_pv[1]) < tol && fabs(sigma_trial_pv[1] - sigma_trial_pv[2]) < tol);
//        if (threeEigEqual){
//            ProjectToSurfaceConstantBeta(sigma_trial_pv, aPrev, sigma, aProj, 1.e-5);
//            // we can compute the tangent matrix
//            STATE theta, beta;
//            SurfaceParam(sigma, aProj, theta, beta);
//            TPZFNMatrix<9, STATE> ddist_dsigmatrial(3, 3), jac(3, 3), DFunccart(3, 3);
//            GradSigmaTrial(sigma_trial_pv, theta, beta, aProj, ddist_dsigmatrial);
//            D2DistanceToSurface(sigma_trial_pv, theta, beta, aProj, jac);
//            jac.Solve_LU(&ddist_dsigmatrial);
//            DFuncCart(theta, beta, aProj, DFunccart);
//            DFunccart.Multiply(ddist_dsigmatrial, GradSigma);
//            GradSigma *= -1.;
//        } else {
            ProjectToSurface(sigma_trial_pv, aPrev, sigma, aProj, 1.e-5);
            // we can compute the tangent matrix
            STATE theta, beta;
            SurfaceParam(sigma, aProj, theta, beta);
            TPZFNMatrix<9, STATE> ddist_dsigmatrial(3, 3), jac(3, 3), DFunccart(3, 3);
            GradSigmaTrial(sigma_trial_pv, theta, beta, aProj, ddist_dsigmatrial);
            D2DistanceToSurface(sigma_trial_pv, theta, beta, aProj, jac);
            jac.Solve_LU(&ddist_dsigmatrial);
            DFuncCart(theta, beta, aProj, DFunccart);
            DFunccart.Multiply(ddist_dsigmatrial, GradSigma);
            GradSigma *= -1.;
//        }
    }
}
Пример #2
0
    bool TPZPrism::MapToSide(int side, TPZVec<T> &InternalPar, TPZVec<T> &SidePar, TPZFMatrix<T> &JacToSide) {
        double zero = 1.E-5;
		
		T qsi = InternalPar[0];
		T eta = InternalPar[1];
		T zeta = InternalPar[2];

		bool regularmap = true;
		switch(side)
		{
            case 0:
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            {
                SidePar.Resize(0); JacToSide.Resize(0,0);
                break;
            }
			case 6://1D
				SidePar.Resize(1);
				JacToSide.Resize(1,3);
				if(fabs((T)(eta-1.)) < zero)
				{
					SidePar[0] = 0.;
					JacToSide(0,0) = 1.;
					JacToSide(0,1) = 1.;
					JacToSide(0,2) = 0.;
					regularmap = false;
				}
				else
				{
					SidePar[0] = 2.*qsi/(1.-eta) - 1.;
					JacToSide(0,0) = 2./(1.-eta); JacToSide(0,1) = 2.*qsi/((1.-eta)*(1.-eta)); JacToSide(0,2) = 0.;
				}
				break;
				
			case 7://1D
				SidePar.Resize(1); JacToSide.Resize(1,3);
				if(fabs((T)(qsi+eta)) < zero)
				{
					SidePar[0] = 0.;
                    JacToSide(0,0) = 1.;
					JacToSide(0,1) = 1.;
					JacToSide(0,2) = 0.;
					regularmap = false;
				}
				else
				{
                    SidePar[0] = 1. - 2.*qsi/(qsi + eta);
                    JacToSide(0,0) = -2.*eta/((qsi+eta)*(qsi+eta)); JacToSide(0,1) = 2.*qsi/((qsi+eta)*(qsi+eta)); JacToSide(0,2) = 0.;
				}
				break;
				
			case 8://1D
				SidePar.Resize(1); JacToSide.Resize(1,3);
				if(fabs((T)(qsi-1.)) < zero)
				{
                    SidePar[0] = 0.;
                    JacToSide(0,0) = 1.; JacToSide(0,1) = 1.; JacToSide(0,2) = 0.;
					regularmap = false;
				}
				else
				{
                    SidePar[0] = 1. - 2.*eta/(1.-qsi);
                    JacToSide(0,0) = -2.*eta/((1.-qsi)*(1.-qsi)); JacToSide(0,1) = -2./(1.-qsi); JacToSide(0,2) = 0.;
				}
				break;
				
			case 9://1D
				SidePar.Resize(1); JacToSide.Resize(1,3);
				SidePar[0] = zeta;
				JacToSide(0,0) = 0.; JacToSide(0,1) = 0.; JacToSide(0,2) = 1.;
				break;
				
			case 10://1D
				SidePar.Resize(1); JacToSide.Resize(1,3);
				SidePar[0] = zeta;
				JacToSide(0,0) = 0.; JacToSide(0,1) = 0.; JacToSide(0,2) = 1.;
				break;
				
			case 11://1D
				SidePar.Resize(1); JacToSide.Resize(1,3);
				SidePar[0] = zeta;
				JacToSide(0,0) = 0.; JacToSide(0,1) = 0.; JacToSide(0,2) = 1.;
				break;
				
			case 12://1D
				SidePar.Resize(1); JacToSide.Resize(1,3);
				if(fabs((T)(eta-1.)) < zero)
				{
                    SidePar[0] = 0.;
                    JacToSide(0,0) = 1.; JacToSide(0,1) = 1.; JacToSide(0,2) = 0.;
					regularmap = false;
				}
				else
				{
                    SidePar[0] = 2.*qsi/(1.-eta) - 1.;
                    JacToSide(0,0) = 2./(1.-eta); JacToSide(0,1) = 2.*qsi/((1.-eta)*(1.-eta)); JacToSide(0,2) = 0.;
				}
				break;
				
			case 13://1D
				SidePar.Resize(1); JacToSide.Resize(1,3);
				if(fabs((T)(qsi+eta)) < zero)
				{
                    SidePar[0] = 0.;
                    JacToSide(0,0) = 1.; JacToSide(0,1) = 1.; JacToSide(0,2) = 0.;
					regularmap = false;
				}
				else
				{
                    SidePar[0] = 1. - 2.*qsi/(qsi + eta);
                    JacToSide(0,0) = -2.*eta/((qsi+eta)*(qsi+eta)); JacToSide(0,1) = 2.*qsi/((qsi+eta)*(qsi+eta)); JacToSide(0,2) = 0.;
				}
				break;
				
			case 14://1D
				SidePar.Resize(1); JacToSide.Resize(1,3);
				if(fabs((T)(qsi-1.)) < zero)
				{
                    SidePar[0] = 0.;
                    JacToSide(0,0) = 1.; JacToSide(0,1) = 1.; JacToSide(0,2) = 0.;
					regularmap = false;
				}
				else
				{
                    SidePar[0] = 1. - 2.*eta/(1.-qsi);
                    JacToSide(0,0) = -2.*eta/((1.-qsi)*(1.-qsi)); JacToSide(0,1) = -2./(1.-qsi); JacToSide(0,2) = 0.;
				}
				break;
				
			case 15://2D - triangle
				SidePar.Resize(2); JacToSide.Resize(2,3);
				SidePar[0] = qsi; SidePar[1] = eta;
				JacToSide(0,0) = 1.; JacToSide(0,1) = 0.; JacToSide(0,2) = 0.;
				JacToSide(1,0) = 0.; JacToSide(1,1) = 1.; JacToSide(1,2) = 0.;
				break;
				
			case 16://2D - quadrilateral
				SidePar.Resize(2); JacToSide.Resize(2,3);
				if(fabs((T)(eta-1.)) < zero)
				{
                    SidePar[0] = 0.; SidePar[1] = zeta;
                    JacToSide(0,0) = 1.; JacToSide(0,1) = 1.; JacToSide(0,2) = 0.;
                    JacToSide(1,0) = 0.; JacToSide(1,1) = 0.; JacToSide(1,2) = 1.;
					regularmap = false;
				}
				else
				{
                    SidePar[0] = 2.*qsi/(1.-eta) - 1.; SidePar[1] = zeta;
                    JacToSide(0,0) = 2./(1.-eta); JacToSide(0,1) = 2.*qsi/((1.-eta)*(1.-eta)); JacToSide(0,2) = 0.;
                    JacToSide(1,0) = 0.; JacToSide(1,1) = 0.; JacToSide(0,2) = 1.;
				}
				break;
				
			case 17://2D - quadrilateral
				SidePar.Resize(2); JacToSide.Resize(2,3);
				if(fabs((T)(qsi+eta)) < zero)
				{
                    SidePar[0] = 0.; SidePar[1] = zeta;
                    JacToSide(0,0) = 1.; JacToSide(0,1) = 1.; JacToSide(0,2) = 0.;
                    JacToSide(1,0) = 0.; JacToSide(1,1) = 0.; JacToSide(1,2) = 1.;
					regularmap = false;
				}
				else
				{
                    SidePar[0] = 1. - 2.*qsi/(qsi + eta); SidePar[1] = zeta;
                    JacToSide(0,0) = -2.*eta/((qsi+eta)*(qsi+eta)); JacToSide(0,1) = 2.*qsi/((qsi+eta)*(qsi+eta)); JacToSide(0,2) = 0.;
                    JacToSide(1,0) = 0.; JacToSide(1,1) = 0.; JacToSide(0,2) = 1.;
				}
				break;
				
			case 18://2D - quadrilateral
				SidePar.Resize(2); JacToSide.Resize(2,3);
				if(fabs((T)(qsi-1.)) < zero)
				{
                    SidePar[0] = 0.; SidePar[1] = zeta;
                    JacToSide(0,0) = 1.; JacToSide(0,1) = 1.; JacToSide(0,2) = 0.;
                    JacToSide(1,0) = 0.; JacToSide(1,1) = 0.; JacToSide(1,2) = 1.;
					regularmap = false;
				}
				else
				{
                    SidePar[0] = 1. - 2.*eta/(1.-qsi); SidePar[1] = zeta;
                    JacToSide(0,0) = -2.*eta/((1.-qsi)*(1.-qsi)); JacToSide(0,1) = -2./(1.-qsi); JacToSide(0,2) = 0.;
                    JacToSide(1,0) = 0.; JacToSide(1,1) = 0.; JacToSide(0,2) = 1.;
				}
				break;
				
			case 19://2D - triangle
				SidePar.Resize(2); JacToSide.Resize(2,3);
				SidePar[0] = qsi; SidePar[1] = eta;
				JacToSide(0,0) = 1.; JacToSide(0,1) = 0.; JacToSide(0,2) = 0.;
				JacToSide(1,0) = 0.; JacToSide(1,1) = 1.; JacToSide(1,2) = 0.;
				break;
            case 20:
                SidePar = InternalPar;
                JacToSide.Resize(3, 3);
                JacToSide.Identity();
                break;
		}
		if(side > 20)
		{
			cout << "Cant compute MapToSide method in TPZGeoPrism class!\nParameter (SIDE) must be between 6 and 19!\nMethod Aborted!\n";
			DebugStop();
		}
		return regularmap;
	}