inline void TPZQuadraticQuad::GradX(const TPZFMatrix<REAL> &nodes,TPZVec<T> &loc, TPZFMatrix<T> &gradx){ gradx.Resize(3,2); gradx.Zero(); int nrow = nodes.Rows(); int ncol = nodes.Cols(); #ifdef PZDEBUG if(nrow != 3 || ncol != 8){ std::cout << "Objects of incompatible lengths, gradient cannot be computed." << std::endl; std::cout << "nodes matrix must be 3x8." << std::endl; DebugStop(); } #endif TPZFNMatrix<3,T> phi(NNodes,1); TPZFNMatrix<6,T> dphi(2,NNodes); TShape(loc,phi,dphi); for(int i = 0; i < NNodes; i++) { for(int j = 0; j < 3; j++) { gradx(j,0) += nodes.GetVal(j,i)*dphi(0,i); gradx(j,1) += nodes.GetVal(j,i)*dphi(1,i); } } }
void TPBrCellMarx::ExtractMatrix(TPZManVector<REAL> &input, TPZFMatrix<REAL> &output) { output.Resize(input.NElements(), 1); int i; for (i=0; i<input.NElements(); i++) { output(i,0) = input[i]; } }
void SolExataU(const TPZVec<REAL> &pt, TPZVec<STATE> &solU, TPZFMatrix<STATE> &GradU){ double x = pt[0]; GradU.Resize(2, 1); solU[0]= 4.*x - 4.*x*x; GradU(0,0) = 4.-8.*x; GradU(1,0) = 0.; }
void SolSuave(const TPZVec<REAL> &loc, TPZVec<STATE> &u, TPZFMatrix<STATE> &du){ const REAL x = loc[0]; const REAL y = loc[1]; const REAL sol = /*x*(1.-x)*y*(1.-y);*/sin(M_PI*x)*sin(M_PI*y); u[0] = sol; du.Resize(2, 1); du(0,0) = /*(1. - x)*(1. - y)*y - x*(1. - y)*y;*/M_PI*cos(M_PI*x)*sin(M_PI*y); du(1,0) = /*(1. - x)*x*(1. - y) - (1. - x)*x*y;*/M_PI*cos(M_PI*y)*sin(M_PI*x); }
void TPBrCellMarx::ExtractMatrix(TPZManVector<TFad<TPBrCellMarx::NUMVARS,REAL> > &input, TPZFMatrix<REAL> &output) { output.Resize(NUMVARS, NUMVARS); int i,j; for (i=0; i<NUMVARS; i++) { for (j=0; j<NUMVARS; j++) { output(i,j) = input[i].d(j); } } }
void SolExataP(const TPZVec<REAL> &pt, TPZVec<STATE> &solP, TPZFMatrix<STATE> &GradP){ REAL x = pt[0]; REAL y = pt[1]; GradP.Resize(2, 1); solP[0]= sin(M_PI*x)*sin(M_PI*y); GradP(0,0) = M_PI*cos(M_PI*x)*sin(M_PI*y); GradP(1,0) = M_PI*cos(M_PI*y)*sin(M_PI*x); }
void TPZGeoTriangle::Jacobian(TPZFMatrix<REAL> & coord, TPZVec<REAL> ¶m,TPZFMatrix<REAL> &jacobian,TPZFMatrix<REAL> &axes,REAL &detjac,TPZFMatrix<REAL> &jacinv) { int spacedim = coord.Rows(); jacobian.Resize(2,2); axes.Resize(2,3); jacinv.Resize(2,2); TPZFNMatrix<3> phi(3,1); TPZFNMatrix<6> dphi(2,3),axest(3,2); jacobian.Zero(); Shape(param,phi,dphi); TPZFNMatrix<6> VecMatrix(3,2,0.); for(int i = 0; i < 3; i++) { for(int j = 0; j < spacedim; j++) { VecMatrix(j,0) += coord(j,i)*dphi(0,i); VecMatrix(j,1) += coord(j,i)*dphi(1,i); } } VecMatrix.GramSchmidt(axest,jacobian); axest.Transpose(&axes); detjac = jacobian(0,0)*jacobian(1,1)-jacobian(1,0)*jacobian(0,1); if(IsZero(detjac)) { std::stringstream sout; sout << "Singular Jacobian " << detjac; LOGPZ_ERROR(logger, sout.str()) detjac = ZeroTolerance(); } if(detjac) { jacinv(0,0) = jacobian(1,1)/detjac; jacinv(1,1) = jacobian(0,0)/detjac; jacinv(0,1) = -jacobian(0,1)/detjac; jacinv(1,0) = -jacobian(1,0)/detjac; } else { jacinv.Zero(); } }
void EstadoAd(const TPZVec<REAL> &loc, TPZVec<STATE> &u, TPZFMatrix<STATE> &du){ const REAL x = loc[0]; const REAL y = loc[1]; u.Resize(1, 0.); du.Resize(3, 1.); du(0,0)=du(1,0)=du(2,0)=0.; //const REAL alpha=0.001; const REAL sol = 10.*x*y*(1-x)*(1-y); u[0] = sol; }
void OOPParMatrix::BuildMe(int size, TPZMatrix<REAL> * matrix, TPZFMatrix<REAL> & vU) { matrix->Resize(size, size); int i, j; vU.Resize(size, 1); for(i = 0; i < size; i++) { double value; for(j=0; j < size; j++) { value = rand()/1e8; matrix->Put(i, j, value); } vU.Put(i, 0,value * 1.4); } }
void TPZErrorIndicator::Sort(TPZFMatrix &error, TPZFMatrix &perm) { int i,j,k; int imin = 0; int imax = error.Rows(); perm.Resize(imax,error.Cols()); for (i=0;i<imax;i++) for (j=0;j<error.Cols();j++) perm(i,j) = i; for(i=imin; i<imax; i++) { for(j=i+1; j<imax; j++) { for (k=0;k<error.Cols();k++){ if(error((int)perm(i,k)) < error((int)perm(j,k))) { int kp = (int) perm(i,k); perm(i,k) = perm(j,k); perm(j,k) = kp; } } } } }
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; }
bool TPZPoint::MapToSide(int side, TPZVec<T> &InternalPar, TPZVec<T> &SidePar, TPZFMatrix<T> &JacToSide) { SidePar.Resize(0); JacToSide.Resize(0,0); return true; }
void TPZGeoTriangle::VecHdiv(TPZFMatrix<REAL> & coord, TPZFMatrix<REAL> & fNormalVec,TPZVec<int> &fVectorSide) { if(coord.Rows()!=3) { cout<< "Erro na dimens�o das linhas de coord"<< endl; } if(coord.Cols()!=3) { cout<< "Erro na dimens�o das colunas de coord"<< endl; } TPZVec<REAL> p1(3), p2(3), p3(3),result(3); for(int j=0; j<3; j++) { p1[j]=coord(j,0); p2[j]=coord(j,1); p3[j]=coord(j,2); } fNormalVec.Resize(14, 3); fVectorSide.Resize(14); int count=0; //primeira face for(int j=0; j<3; j++) //v0 { fNormalVec(0,j) = coord(j,0)- coord(j,2); } fVectorSide[count]=0; count++; for(int j=0; j<3; j++) //v1 { fNormalVec(1,j) = coord(j,1)- coord(j,2); } fVectorSide[count]=1; count++; //v2 ComputeNormal(p1,p2,p3,result); fNormalVec(2,0) = -result[0]; fNormalVec(2,1) = -result[1]; fNormalVec(2,2) = -result[2]; fVectorSide[count]=3; count++; //segunda face for(int j=0; j<3; j++) //v3 { fNormalVec(3,j) = coord(j,1)- coord(j,0); } fVectorSide[count]=1; count++; for(int j=0; j<3; j++) //v4 { fNormalVec(4,j) = coord(j,2)- coord(j,0); } fVectorSide[count]=2; count++; //v5 ComputeNormal(p2,p3,p1,result); fNormalVec(5,0) = -result[0]; fNormalVec(5,1) = -result[1]; fNormalVec(5,2) = -result[2]; fVectorSide[count]=4; count++; //terceira face for(int j=0; j<3; j++) //v6 { fNormalVec(6,j) = coord(j,2)- coord(j,1); } fVectorSide[count]=2; count++; for(int j=0; j<3; j++) //v7 { fNormalVec(7,j) = coord(j,0)- coord(j,1); } fVectorSide[count]=0; count++; //v8 ComputeNormal(p3,p1,p2,result); fNormalVec(8,0) = -result[0]; fNormalVec(8,1) = -result[1]; fNormalVec(8,2) = -result[2]; fVectorSide[count]=5; count++; // internos tangentes for(int j=0; j<3; j++) //v9 { fNormalVec(9,j) = coord(j,1)- coord(j,0); } fVectorSide[count]=3; count++; for(int j=0; j<3; j++) //v10 { fNormalVec(10,j) = coord(j,2)- coord(j,1); } fVectorSide[count]=4; count++; for(int j=0; j<3; j++) //v11 { fNormalVec(11,j) = coord(j,0)- coord(j,2); } fVectorSide[count]=5; count++; //internos meio TPZVec<REAL> midle(3,0.); midle[0]=(1./3.)*(coord(0,2)+coord(0,0)+coord(0,1)); midle[1]=(1./3.)*(coord(1,2)+coord(1,0)+coord(1,1)); midle[2]=(1./3.)*(coord(2,2)+coord(2,0)+coord(2,1)); TPZFMatrix<REAL> jacobian; TPZFMatrix<REAL> axes; REAL detjac; TPZFMatrix<REAL> jacinv; Jacobian(coord,midle,jacobian,axes,detjac,jacinv); fNormalVec(12,0)=axes(0,0); fNormalVec(12,1)=axes(0,1); fNormalVec(12,2)=axes(0,2); fNormalVec(13,0)=axes(1,0); fNormalVec(13,1)=axes(1,1); fNormalVec(13,2)=axes(1,2); fVectorSide[count]=6; fVectorSide[count+1]=6; //normaliza��o for(int k=0; k<14; k++) { REAL temp=0.; temp=sqrt( fNormalVec(k,0)*fNormalVec(k,0) + fNormalVec(k,1)*fNormalVec(k,1) + fNormalVec(k,2)*fNormalVec(k,2)); fNormalVec(k,0) *=1./temp; fNormalVec(k,1) *=1./temp; } // produto normal == 1 for(int kk=0; kk<3; kk++) { REAL temp1=0.; REAL temp2=0.; temp1 = fNormalVec(kk*3,0)*fNormalVec(kk*3+2,0) + fNormalVec(kk*3,1)*fNormalVec(kk*3+2,1); temp2 = fNormalVec(kk*3+1,0)*fNormalVec(kk*3+2,0) + fNormalVec(kk*3+1,1)*fNormalVec(kk*3+2,1); fNormalVec(kk*3,0) *=1./temp1; fNormalVec(kk*3,1) *=1./temp1; fNormalVec(kk*3+1,0) *=1./temp2; fNormalVec(kk*3+1,1) *=1./temp2; } #ifdef LOG4CXX { std::stringstream sout; fNormalVec.Print("fNormalVec", sout); LOGPZ_DEBUG(logger,sout.str()) } #endif }
bool TPZGeoTriangle::MapToSide(int side, TPZVec<REAL> &InternalPar, TPZVec<REAL> &SidePar, TPZFMatrix<REAL> &JacToSide) { double zero = 1.E-5; REAL qsi = InternalPar[0]; REAL eta = InternalPar[1]; SidePar.Resize(1); JacToSide.Resize(1,2); if((qsi + eta - 1.) > 1.e-5 || qsi < -1.e-5 || eta < -1.e-5) { cout << "Point (qsi,eta) = (" << qsi << "," << eta << ") is out of TPZGeoTriangle Master Element Range!\n"; cout << "See TPZGeoTriangle::MapToSide() method!\n"; DebugStop(); } if(qsi < 0.) qsi = 0.; if(eta < 0.) eta = 0.; if(qsi+eta > 1.) { REAL qsieta = 1.-qsi-eta; qsi += qsieta/2.; eta += qsieta/2.; } bool regularmap = true; switch(side) { case 3: if(fabs(eta - 1.) < zero) { SidePar[0] = 0.; JacToSide(0,0) = 0.; JacToSide(0,1) = 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)); } break; case 4: if(qsi+eta < zero) { SidePar[0] = 0.; JacToSide(0,0) = 0.; JacToSide(0,1) = 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)); } break; case 5: if(fabs(qsi - 1.) < zero) { SidePar[0] = 0.; JacToSide(0,0) = 0.; JacToSide(0,1) = 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); } break; } if(side < 3 || side > 5) { cout << "Cant compute MapToSide method in TPZGeoTriangle class!\nParameter (SIDE) must be 3, 4 or 5!\nMethod Aborted!\n"; DebugStop(); } return regularmap; }
/** * Calcula os valores das funcoes de forma e suas derivadas * @point ponto onde calcular as funcoes de forma * @phi valores das funcoes de forma * @dphi valores das derivadas das funcoes de forma */ void TElemento0d::Shape(std::vector<double> &point, std::vector<double> &phi, TPZFMatrix &dphi) { phi.resize(1); phi[0] = 1.; dphi.Resize(0,1); }
void TElemento0d::Jacobian(std::vector< double >& point, TPZFMatrix& jacobian, TPZFMatrix& jacinv, double &detjac, TMalha& malha) { jacobian.Resize(0,0); jacinv.Resize(0,0); detjac = 1; }