void UniformRefinement(int h,TPZGeoMesh *gmesh) { //uniform refinement TPZVec<TPZGeoEl *> filhos; for (int ref = 0; ref < h; ref++) { int n = gmesh->NElements(); for(int i = 0; i < n; i++ ) { TPZGeoEl *gel = gmesh->ElementVec()[i]; if(gel->Type() != EPoint) gel->Divide(filhos); // You can to divide point element but it do nothing (only error message) } } }
void TPZHierarquicalGrid::CreateGeometricElement(int n, int iel,int eldim, int elmatid, int &elid) { int jump = fBase->NNodes(); int dim = fBase->Dimension(); TPZGeoEl *gel = fBase->ElementVec()[iel]; int gelNodes = gel->NNodes(); // Computing current topology TPZManVector<int64_t,10> CTopology(gelNodes); for(int inode = 0; inode < CTopology.size(); inode++) { CTopology[inode] = gel->Node(inode).Id(); } bool Is1D = false; bool Is2D = false; bool Is3D = false; for(int il = 1; il < (n+1); il++ ) { switch (eldim) { case 0: { //Defining boundaries if (dim==0) { if (il==1){ TPZVec<int64_t> Topology(gelNodes); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoPoint > (elid++, Topology, ffrontMatID,*fComputedGeomesh); } if (il==n) { TPZVec<int64_t> Topology(gelNodes); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoPoint > (elid++, Topology, fbackMatID,*fComputedGeomesh); } } // if (dim==1) { // if (il==1){ // TPZVec<int64_t> Topology(gelNodes+1); // Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); // Topology[1]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); // new TPZGeoElRefPattern < pzgeom::TPZGeoLinear > (elid++, Topology, elmatid,*fComputedGeomesh); // } // if (il==n) // { // TPZVec<int64_t> Topology(gelNodes+1); // Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); // Topology[1]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); // new TPZGeoElRefPattern < pzgeom::TPZGeoLinear > (elid++, Topology, elmatid,*fComputedGeomesh); // // } // } TPZVec<int64_t> Topology(gelNodes+1); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoLinear > (elid++, Topology, elmatid,*fComputedGeomesh); Is1D = true; } break; case 1: { if (dim==1) { if (il==1){ TPZVec<int64_t> Topology(gelNodes+1); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoLinear > (elid++, Topology, ffrontMatID,*fComputedGeomesh); } if (il==n) { TPZVec<int64_t> Topology(gelNodes+1); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoLinear > (elid++, Topology, fbackMatID,*fComputedGeomesh); } } if (fIsQuad) { // quadrilateras TPZVec<int64_t> Topology(gelNodes+2); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoQuad > (elid++, Topology, elmatid,*fComputedGeomesh); } else { // triangles TPZVec<int64_t> Topology(gelNodes+1); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoTriangle > (elid++, Topology, elmatid,*fComputedGeomesh); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoTriangle > (elid++, Topology, elmatid,*fComputedGeomesh); } Is2D = true; } break; case 2: { if (dim==2) { if (il==1){ if (gel->Type() == EQuadrilateral) { // quadrilateras TPZVec<int64_t> Topology(gelNodes+2); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 1) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[3] + (il - 1) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoQuad > (elid++, Topology, ffrontMatID,*fComputedGeomesh); } else{ // triangles TPZVec<int64_t> Topology(gelNodes+1); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 1) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoTriangle > (elid++, Topology, ffrontMatID,*fComputedGeomesh); } } if (il==n) { if (gel->Type() == EQuadrilateral) { // quadrilateras TPZVec<int64_t> Topology(gelNodes+2); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 0) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[3] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoQuad > (elid++, Topology, fbackMatID,*fComputedGeomesh); } else{ // triangles TPZVec<int64_t> Topology(gelNodes+1); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoTriangle > (elid++, Topology, fbackMatID,*fComputedGeomesh); } } } if (!fIsTetrahedron) { if (fIsPrism) { // Prisms TPZVec<int64_t> Topology(2*gelNodes); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 1) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[4]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[5]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoPrism > (elid++, Topology, elmatid,*fComputedGeomesh); } else { // Cubes TPZVec<int64_t> Topology(gelNodes+4); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 1) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[3] + (il - 1) * jump].Id(); Topology[4]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[5]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[6]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 0) * jump].Id(); Topology[7]=fComputedGeomesh->NodeVec()[CTopology[3] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoCube > (elid++, Topology, elmatid,*fComputedGeomesh); } } else { if (fIsPrism) { // Prisms TPZVec<int64_t> Topology(2*gelNodes); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 1) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[4]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[5]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 0) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoPrism > (elid++, Topology, elmatid,*fComputedGeomesh); } else{ // Tetrahedron TPZVec<int64_t> Topology(gelNodes+1); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 1) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoTetrahedra > (elid++, Topology, elmatid,*fComputedGeomesh); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 1) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 1) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoTetrahedra > (elid++, Topology, elmatid,*fComputedGeomesh); Topology[0]=fComputedGeomesh->NodeVec()[CTopology[0] + (il - 0) * jump].Id(); Topology[1]=fComputedGeomesh->NodeVec()[CTopology[1] + (il - 0) * jump].Id(); Topology[2]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 0) * jump].Id(); Topology[3]=fComputedGeomesh->NodeVec()[CTopology[2] + (il - 1) * jump].Id(); new TPZGeoElRefPattern < pzgeom::TPZGeoTetrahedra > (elid++, Topology, elmatid,*fComputedGeomesh); } } Is3D = true; } break; default: { std::cout << "Connection not implemented " << std::endl; DebugStop(); } break; } } if (Is1D) { fComputedGeomesh->SetDimension(1); } if (Is2D) { fComputedGeomesh->SetDimension(2); } if (Is3D) { fComputedGeomesh->SetDimension(3); } }