void TPZAnalysisError::ExpandConnected(TPZStack<TPZCompElSide> &singel){ int64_t nelem = singel.NElements(); TPZStack<TPZGeoElSide> gelstack; TPZStack<TPZCompElSide> celstack; int64_t iel; for(iel=0; iel<nelem; iel++) { TPZCompElSide celside = singel[iel]; TPZGeoElSide gelside; gelside = celside.Reference(); if(!gelside.Exists()) continue; gelstack.Resize(0); cout << "This part needs to be fixed\n"; // gelside.Element()->LowerDimensionSides(gelside.Side(),gelstack); while(gelstack.NElements()) { TPZGeoElSide gelsideloc; gelsideloc = gelstack.Pop(); gelsideloc.EqualLevelCompElementList(celstack,1,0); while(celstack.NElements()) { TPZCompElSide celsideloc = celstack.Pop(); if(! celsideloc.Exists()) continue; int64_t nelsing = singel.NElements(); int64_t smel; for(smel=0; smel<nelsing; smel++) if(singel[smel].Element() == celsideloc.Element()) break; if(smel != nelsing) singel.Push(celsideloc); } } } }
// IT IS BAD !!!! IMPROVE IT !!! void TPZGeoCloneMesh::AddBoundaryConditionElements(TPZGeoEl *eltoadd) { int nsides = eltoadd->NSides(); int is; for(is=0; is<nsides; is++) { TPZGeoElSide elside(eltoadd,is); TPZGeoElSide neighbour = elside.Neighbour(); #ifdef PZDEBUG if (!neighbour.Element()) DebugStop(); #endif while(neighbour != elside) { if(neighbour.Element()->Dimension() < eltoadd->Dimension() && neighbour.Side() == neighbour.Element()->NSides() - 1 // && neighbour.Element()->Reference() ) { TPZGeoEl *gel = neighbour.Element(); if (HasElement(gel)) { neighbour = neighbour.Neighbour(); continue; } TPZGeoEl *father = gel->Father(); while(father) { gel = father; father = gel->Father(); } CloneElement(gel); // verificar se neighbour.Element ja esta no map // TPZGeoEl *localpatch = fMapElements[neighbour.Element()]; TPZGeoEl *localpatch = fMapElements[gel]; // Jorge 2013/03/28 fPatchElements.insert(localpatch); } neighbour = neighbour.Neighbour(); #ifdef PZDEBUG if (!neighbour.Exists()) { DebugStop(); } #endif } } }
//SingularElements(..) void TPZAnalysisError::ZoomInSingularity(REAL csi, TPZCompElSide elside, REAL singularity_strength) { REAL hn = 1./pow(csi,1./singularity_strength); REAL Q=2.; REAL NcReal = log( 1.+(1./hn - 1.)*(Q - 1.) )/log(Q); int Nc = 0; while(REAL(Nc) < (NcReal+0.5)) Nc++; int minporder = 2; TPZStack<TPZCompElSide> ElToRefine; TPZStack<int> POrder; TPZStack<TPZGeoElSide> subelements; TPZStack<int64_t> csubindex; ElToRefine.Push(elside); POrder.Push(Nc); while(ElToRefine.NElements()) { /** Take the next element and its interpolation order from the stack*/ TPZCompElSide curelside = ElToRefine.Pop(); int curporder = POrder.Pop(); if(!curelside.Exists()) continue; int64_t cindex = curelside.Element()->Index(); if(cindex < 0) continue; /** Cast the element to an interpolated element if possible*/ TPZCompEl *cel = curelside.Element(); TPZInterpolatedElement *cintel = 0; cintel = dynamic_cast<TPZInterpolatedElement *> (cel); /** If the element is not interpolated, nothing to do */ if(!cintel) continue; /** Set the interpolation order of the current element to curporder*/ if(curporder == minporder) { cintel->PRefine(Nc); fSingular.Push(curelside); } else { cintel->PRefine(curporder); cintel->Divide(cindex,csubindex,1); /** Identify the subelements along the side and push them on the stack*/ } TPZGeoElSide gelside = curelside.Reference(); if(!gelside.Exists()) continue; gelside.GetSubElements2(subelements); int64_t ns = subelements.NElements(); curporder--; int64_t is; for(is=0; is<ns; is++) { TPZGeoElSide sub = subelements[is]; TPZCompElSide csub = sub.Reference(); if(csub.Exists()) { ElToRefine.Push(csub); POrder.Push(curporder); } } } ExpandConnected(fSingular); /* REAL H1_error,L2_error,estimate; TPZBlock *flux=0; int64_t nel = fElIndexes.NElements(); for(int64_t elloc=0;elloc<nel;elloc++) { int64_t el = fElIndexes[elloc]; estimate = fElErrors[elloc]; REAL csi = estimate / fAdmissibleError; REAL h = h_Parameter(intellist[el]); REAL hn = h/pow(csi,1./.9); REAL Nc = log( 1.+(h/hn - 1.)*(Q - 1.) )/log(Q); if(hn > 1.3*h) hn = 2.0*h*hn / (h + hn); REAL hsub = h;//100.0;//pode ser = h ; Cedric TPZCompEl *locel = intellist[el]; //obter um subelemento que contem o ponto singular e tem tamanho <= hn TPZAdmChunkVector<TPZCompEl *> sublist; while(hsub > hn) { TPZVec<int64_t> indexsubs; int64_t index = locel->Index(); locel->Divide(index,indexsubs,1); int64_t nsub = indexsubs.NElements(); TPZAdmChunkVector<TPZCompEl *> listsub(0); for(int64_t k=0;k<nsub;k++) { index = listsub.AllocateNewElement(); listsub[index] = Mesh()->ElementVec()[indexsubs[k]]; } //existe um unico filho que contem o ponto singular SingularElement(point,listsub,sublist); hsub = h_Parameter(sublist[0]); } TPZInterpolatedElement *intel = (TPZInterpolatedElement *) locel; intel->PRefine(Nc+1); indexlist.Push(intel->Index()); //os elemento viz devem ter ordens menores a cel quanto mais longe de point TPZInterpolatedElement *neighkeep,*neigh; //feito s�para o caso 1d , extender para o caso geral int dim = intel->Dimension(); if(dim != 1) { cout << "TPZAnalysisError::Step3 not dimension implemented , dimension = " << intellist[el]->Dimension() << endl; return ;//exit(1); } for(int side=0;side<2;side++) { int ly = 1; TPZGeoElSide neighside = intel->Reference()->Neighbour(side); TPZGeoElSide neighsidekeep = neighside; TPZCompElSide neighsidecomp(0,0); TPZStack<TPZCompElSide> elvec(0); TPZCompElSide thisside(intel,side); if(!neighsidekeep.Exists()) thisside.HigherLevelElementList(elvec,1,1); if(!neighsidekeep.Exists() && elvec.NElements() == 0) { neighsidekeep = thisside.LowerLevelElementList(1).Reference(); } else if(elvec.NElements() != 0) { neighsidekeep = elvec[0].Reference(); } while(ly < (Nc+1) && neighsidekeep.Exists() && neighsidekeep.Element()->Reference()->Material()->Id() > -1) { neigh = (TPZInterpolatedElement *) neighsidekeep.Element()->Reference(); if(neigh) { neigh->PRefine(ly); int otherside = (neighsidekeep.Side()+1)%2; neighsidekeep.SetSide(otherside); indexlist.Push(neighsidekeep.Reference().Element()->Index()); } neighside = neighsidekeep.Neighbour(); while(!neighside.Exists()) { neighsidecomp = neighsidekeep.Reference(); neighsidecomp.HigherLevelElementList(elvec,1,1); if(elvec.NElements()) { neighside = elvec[0].Reference(); break; } neighside = neighsidecomp.LowerLevelElementList(1).Reference(); if(!neighside.Exists()) break; } neighsidekeep = neighside; ly++; } } }//for Mesh()->InitializeBlock(); */ }
int TPZCheckGeom::CheckSubFatherTransform(TPZGeoEl *subel, int sidesub) { int check = 0; TPZGeoElSide father = subel->Father2(sidesub); if(!father.Exists()) return check; TPZIntPoints *integ = subel->CreateSideIntegrationRule(sidesub,2); int subsidedim = subel->SideDimension(sidesub); int subdim = subel->Dimension(); TPZTransform trans(subsidedim); trans = subel->BuildTransform2(sidesub,father.Element(),trans); int fathsidedim = father.Dimension(); int fathdim = father.Element()->Dimension(); int nsubsides = subel->NSides(); int nfathsides = father.Element()->NSides(); TPZTransform trans1 = subel->SideToSideTransform(sidesub,nsubsides-1); TPZTransform trans2 = father.Element()->SideToSideTransform(father.Side(),nfathsides-1); TPZVec<REAL> intpoint(subsidedim); TPZVec<REAL> sidetopoint(fathsidedim); TPZVec<REAL> elpoint1(subdim),elpoint2(fathdim); TPZVec<REAL> x1(3),x2(3); int nintpoints = integ->NPoints(); int ip; REAL w; for(ip=0; ip<nintpoints; ip++) { integ->Point(ip,intpoint,w); trans.Apply(intpoint,sidetopoint); trans1.Apply(intpoint,elpoint1); trans2.Apply(sidetopoint,elpoint2); subel->X(elpoint1,x1); father.Element()->X(elpoint2,x2); int otherfatherside = father.Element()->WhichSide(elpoint2); if(otherfatherside != father.Side()) { int son = subel->WhichSubel(); PZError << "TPZCheckGeom::CheckSubFatherTransform son " << son << " sidesub = "<< sidesub << " fathside = " << father.Side() << " otherfatherside = " << otherfatherside << endl; check=1; } REAL dif = 0; int nx = x1.NElements(); int ix; for(ix=0; ix<nx; ix++) dif += (x1[ix]-x2[ix])*(x1[ix]-x2[ix]); if(dif > 1.e-6) { int son = subel->WhichSubel(); PZError << "TPZCheckGeom::CheckSubFatherTransform son " << son << " sidesub = "<< sidesub << " fathside = " << father.Side() << " dif = " << dif << endl; // subel->Print(); check = 1; TPZTransform t = subel->ComputeParamTrans(father.Element(),father.Side(),sidesub); t.PrintInputForm(cout); cout << endl; trans.PrintInputForm(cout); cout << endl; check = 1; } } if(check == 0) { TPZTransform t = subel->ComputeParamTrans(father.Element(),father.Side(),sidesub); check = t.Compare(trans); if(check == 1){ int son = subel->WhichSubel(); PZError << "TPZCheckGeom::CheckSubFatherTransform son " << son << " sidesub = "<< sidesub << " fathside = " << father.Side() << endl; t.PrintInputForm(cout); cout << endl; trans.PrintInputForm(cout); cout << endl; } // compare t with trans } delete integ; return check; }