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.; // } } }
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; }