TPZCompMesh *TPZMGAnalysis::UniformlyRefineMesh(TPZCompMesh *mesh, bool withP) { TPZGeoMesh *gmesh = mesh->Reference(); if(!gmesh) { cout << "TPZMGAnalysis::UniformlyRefineMesh encountered no geometric mesh\n"; return 0; } gmesh->ResetReference(); TPZCompMesh *cmesh = new TPZCompMesh(gmesh); mesh->CopyMaterials(*cmesh); TPZAdmChunkVector<TPZCompEl *> &elementvec = mesh->ElementVec(); int el,nelem = elementvec.NElements(); for(el=0; el<nelem; el++) { TPZCompEl *cel = elementvec[el]; if(!cel) continue; TPZInterpolatedElement *cint = dynamic_cast<TPZInterpolatedElement *> (cel); if(!cint) { cout << "TPZMGAnalysis::UniformlyRefineMesh encountered a non interpolated element\n"; continue; } int ncon = cint->NConnects(); int porder = cint->PreferredSideOrder(ncon-1); TPZGeoEl *gel = cint->Reference(); if(!gel) { cout << "TPZMGAnalysis::UniformlyRefineMesh encountered an element without geometric reference\n"; continue; } TPZVec<TPZGeoEl *> sub; gel->Divide(sub); int nsub = sub.NElements(); int isub; int celindex; for(isub=0; isub<nsub; isub++) { TPZInterpolatedElement *csint; csint = (TPZInterpolatedElement *) cmesh->CreateCompEl(sub[isub],celindex); if(withP) csint->PRefine(porder+1); else csint->PRefine(porder); } } return cmesh; }
void TPZMGAnalysis::MeshError(TPZCompMesh *fine, TPZCompMesh *coarse, TPZVec<REAL> &ervec, void (*f)(TPZVec<REAL> &loc, TPZVec<REAL> &val, TPZFMatrix<REAL> &deriv),TPZVec<REAL> &truervec){ coarse->Reference()->ResetReference(); coarse->LoadReferences(); int dim = fine->MaterialVec().begin()->second->Dimension(); ervec.Resize(coarse->NElements()); if(f) { truervec.Resize(coarse->NElements()); truervec.Fill(0.,0); } ervec.Fill(0.,0); TPZCompEl *cel; TPZAdmChunkVector<TPZCompEl *> &elementvec = fine->ElementVec(); int numel = elementvec.NElements(); int el; for(el=0; el<numel; el++) { cel = elementvec[el]; if (!cel) continue; TPZInterpolatedElement *cint = dynamic_cast<TPZInterpolatedElement *> (cel); if(!cint) continue; int ncon = cint->NConnects(); TPZGeoElSide gelside(cint->Reference(),ncon-1); if(gelside.Dimension() != dim) continue; TPZGeoElSide gellarge(gelside); while(!gellarge.Reference().Exists() && gellarge.Father2().Exists()) gellarge = gellarge.Father2(); if(!gellarge.Reference().Exists()) { cout << "TPZMGAnalsysis::BuildTransferMatrix element " << el << " found no corresponding element\n"; continue; } TPZCompElSide cellargeside = gellarge.Reference(); TPZCompEl *cellarge = cellargeside.Element(); TPZInterpolatedElement *cintlarge = (TPZInterpolatedElement *) cellarge; TPZTransform transform(gelside.Dimension(),gellarge.Dimension()); gelside.SideTransform3(gellarge,transform); int index = cellarge->Index(); REAL truerror = 0.; ervec[index] += ElementError(cint,cintlarge,transform,f,truerror); if(f) truervec[index] += truerror; } }