void TPZQuadraticQuad::InsertExampleElement(TPZGeoMesh &gmesh, int matid, TPZVec<REAL> &lowercorner, TPZVec<REAL> &size) { TPZManVector<REAL,3> co(3),shift(3),scale(3); TPZManVector<int64_t,4> nodeindexes(NCornerNodes); for (int i=0; i<3; i++) { scale[i] = size[i]/3.; shift[i] = size[i]/2.+lowercorner[i]; } for (int i=0; i<NCornerNodes; i++) { ParametricDomainNodeCoord(i, co); co.Resize(3,0.); for (int j=0; j<3; j++) { co[j] = shift[j]+scale[j]*co[j]+(rand()*0.2/RAND_MAX)-0.1; } nodeindexes[i] = gmesh.NodeVec().AllocateNewElement(); gmesh.NodeVec()[nodeindexes[i]].Initialize(co, gmesh); } int64_t index; CreateGeoElement(gmesh, EQuadrilateral, nodeindexes, matid, index); TPZGeoEl *gel = gmesh.Element(index); int nsides = gel->NSides(); for (int is=0; is<nsides; is++) { gel->SetSideDefined(is); } gel = TPZChangeEl::ChangeToQuadratic(&gmesh, index); for (int node = gel->NCornerNodes(); node < gel->NNodes(); node++) { TPZManVector<REAL,3> co(3); gel->NodePtr(node)->GetCoordinates(co); for (int i=0; i<3; i++) { co[i] += (0.2*rand())/RAND_MAX - 0.1; } gel->NodePtr(node)->SetCoord(co); } }
TPZDXGraphMesh::TPZDXGraphMesh(TPZCompMesh *cmesh, int dimension, TPZAutoPointer<TPZMaterial> mat, const TPZVec<std::string> &scalarnames, const TPZVec<std::string> &vecnames) : TPZGraphMesh(cmesh,dimension,mat) { SetNames(scalarnames,vecnames); fNextDataField = 1; fStyle = EDXStyle; // int index = 0; TPZCompEl *ce = FindFirstInterpolatedElement(cmesh,dimension); fElementType = "noname"; if(ce) { int type = ce->Type(); if(type == EOned) fElementType = "lines"; if(type == ETriangle) fElementType = "triangles"; if(type == EQuadrilateral) fElementType = "quads"; if(type == ECube) fElementType = "cubes"; if(type == EPrisma) fElementType = "cubes"; TPZGeoEl *gel = ce->Reference(); if( type == EDiscontinuous || (type == EAgglomerate && gel) ){ int nnodes = gel->NNodes(); if(nnodes==4 && dimension==2) fElementType = "quads"; if(nnodes==3 && dimension==2) fElementType = "triangles"; if(dimension==3) fElementType = "cubes"; } } fNumCases = 0; fNumConnectObjects[0] = 1; fNumConnectObjects[1] = 1; fNumConnectObjects[2] = 1; fNormalObject = 0; for(int i = 0; i < 8; i++) fElConnectivityObject[i] = -1; }
// Output as Mathematica format void OutputMathematica(std::ofstream &outMath,int var,int pointsByElement,TPZCompMesh *cmesh) { int i, j, k, nnodes; int nelem = cmesh->ElementVec().NElements(); int dim = cmesh->Dimension(); // Dimension of the model REAL w; if(var-1 < 0) var = 1; // Map to store the points and values map<REAL,TPZVec<REAL> > Graph; TPZVec<REAL> tograph(4,0.); map<TPZVec<REAL>,REAL> Graphics; for(i=0;i<nelem;i++) { TPZCompEl *cel = cmesh->ElementVec()[i]; TPZGeoEl *gel = cel->Reference(); TPZInterpolationSpace * sp = dynamic_cast <TPZInterpolationSpace*>(cel); int nstates = cel->Material()->NStateVariables(); // If var is higher than nstates of the element, go to next element if(var > nstates) continue; TPZVec<REAL> qsi(3,0.), sol(nstates,0.), outfem(3,0.); nnodes = gel->NNodes(); if(pointsByElement < nnodes) pointsByElement = nnodes; for(j=0;j<gel->NNodes();j++) { // Get corners points to compute solution on gel->CenterPoint(j,qsi); sp->Solution(qsi,0,sol); cel->Reference()->X(qsi,outfem); // Jointed point coordinates and solution value on for(k=0;k<3;k++) tograph[k] = outfem[k]; tograph[k] = sol[var-1]; Graph.insert(pair<REAL,TPZVec<REAL> >(outfem[0],tograph)); Graphics.insert(pair<TPZVec<REAL>,REAL>(outfem,sol[var-1])); // If cel is point gets one point value if(cel->Type() == EPoint) { break; } } // If cel is point gets one point value if(cel->Type() == EPoint) continue; // Print another points using integration points TPZIntPoints *rule = NULL; int order = 1, npoints = 0; while(pointsByElement-(npoints+nnodes) > 0) { if(rule) delete rule; // Cleaning unnecessary allocation int nsides = gel->NSides(); // Get the integration rule to compute internal points to print, not to print rule = gel->CreateSideIntegrationRule(nsides-1,order); if(!rule) break; npoints = rule->NPoints(); order += 2; } for(j=0;j<npoints;j++) { // Get integration points to get internal points rule->Point(j,qsi,w); sp->Solution(qsi,0,sol); cel->Reference()->X(qsi,outfem); // Jointed point coordinates and solution value on for(k=0;k<3;k++) tograph[k] = outfem[k]; tograph[k] = sol[var-1]; Graph.insert(pair<REAL,TPZVec<REAL> >(outfem[0],tograph)); Graphics.insert(pair<TPZVec<REAL>,REAL>(outfem,sol[var-1])); } } // Printing the points and values into the Mathematica file outMath << "Saida = { "; // Formatting output outMath << fixed << setprecision(10); if(dim<2) { map<REAL,TPZVec<REAL> >::iterator it; for(it=Graph.begin();it!=Graph.end();it++) { if(it!=Graph.begin()) outMath << ","; outMath << "{"; for(j=0;j<dim;j++) outMath << (*it).second[j] << ","; outMath << (*it).second[3] << "}"; } outMath << "};" << std::endl; // Choose Mathematica command depending on model dimension outMath << "ListPlot[Saida,Joined->True]"<< endl; } else { map<TPZVec<REAL>,REAL>::iterator it; for(it=Graphics.begin();it!=Graphics.end();it++) { if(it!=Graphics.begin()) outMath << ","; outMath << "{"; for(j=0;j<dim;j++) outMath << (*it).first[j] << ","; outMath << (*it).second << "}"; } outMath << "};" << std::endl; outMath << "ListPlot3D[Saida]"<< endl; } }
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); } }