void Cube::AddCube(size_t v0, size_t v1, size_t v2, size_t v3, size_t v4, size_t v5, size_t v6, size_t v7, const Vector4f &normal) { AddTetrahedron(v0, v1, v3, v5, normal); AddTetrahedron(v0, v2, v3, v6, normal); AddTetrahedron(v0, v4, v5, v6, normal); AddTetrahedron(v3, v5, v6, v7, normal); AddTetrahedron(v0, v3, v5, v6, normal); }
int LoadSU2Elements(FILE *FilHdl, Mesh *Msh) { int ref=1; char str[1024]; int iMark, NbrMark=0, CptElt; int iElt, NbrElt=0, typ, is[8], swi[8], buf, s, idx, res; Msh->NbrTri = Msh->NbrTet = Msh->NbrHex = Msh->NbrEfr = Msh->NbrQua = Msh->NbrPyr = Msh->NbrPri = 0; rewind(FilHdl); do { res = fscanf(FilHdl, "%s", str); }while( (res != EOF) && strcmp(str, "NELEM=") ); fscanf(FilHdl, "%d", &NbrElt); fgets (str, sizeof str, FilHdl); idx=0; for (iElt=0; iElt<NbrElt; iElt++) { fscanf(FilHdl, "%d", &typ); if ( typ == SU2_TRIANGLE ) { for (s=0; s<3; s++) { fscanf(FilHdl, "%d", &buf); swi[s] = buf+1; if ( swi[s] > Msh->NbrVer ) { printf(" ## ERROR LoadSU2Elements: vertex out of bound (vid=%d)\n", swi[s]); return 0; } } fscanf(FilHdl, "%d", &buf); Msh->NbrTri++; if ( Msh->NbrTri > Msh->MaxNbrTri ) { printf(" ## ERROR LoadSU2Elements: triangle out of bound (tid=%d, max=%d)\n", Msh->NbrTri, Msh->MaxNbrTri); return 0; } switchTriIdx(swi,is); AddTriangle(Msh,Msh->NbrTri,is,ref); } else if ( typ == SU2_TETRAHEDRAL ) { for (s=0; s<4; s++) { fscanf(FilHdl, "%d", &buf); swi[s] = buf+1; } idx++; Msh->NbrTet++; if ( Msh->NbrTet > Msh->MaxNbrTet ) { printf(" ## ERROR LoadSU2Elements: tetra out of bound (tid=%d)\n", Msh->NbrTet); return 0; } switchTetIdx(swi,is); AddTetrahedron(Msh,Msh->NbrTet,is,ref); } else if ( typ == SU2_HEXAHEDRAL ) { for (s=0; s<8; s++) { fscanf(FilHdl, "%d", &buf); swi[s] = buf+1; } fscanf(FilHdl, "%d", &idx); Msh->NbrHex++; if ( Msh->NbrHex > Msh->MaxNbrHex ) { printf(" ## ERROR LoadSU2Elements: hexahedron out of bound (hid=%d)\n", Msh->NbrHex); return 0; } switchHexIdx(swi,is); AddHexahedron(Msh,Msh->NbrHex,is,ref); } else if ( typ == SU2_PYRAMID ) { for (s=0; s<5; s++) { fscanf(FilHdl, "%d", &buf); swi[s] = buf+1; is[s] = buf+1; } fscanf(FilHdl, "%d", &idx); Msh->NbrPyr++; if ( Msh->NbrPyr > Msh->MaxNbrPyr ) { printf(" ## ERROR LoadSU2Elements: pyramid out of bound (id=%d)\n", Msh->NbrPyr); return 0; } //switchPyrIdx(swi,is); AddPyramid(Msh,Msh->NbrPyr,is,ref); int i=Msh->NbrPyr; if ( i== 1 ) printf("PYR %d : %d %d %d %d %d\n", i, Msh->Pyr[i][0], Msh->Pyr[i][1], Msh->Pyr[i][2], Msh->Pyr[i][3], Msh->Pyr[i][4]); } else if ( typ == SU2_RECTANGLE ) { for (s=0; s<4; s++) { fscanf(FilHdl, "%d", &buf); swi[s] = buf+1; } Msh->NbrQua++; if ( Msh->NbrQua > Msh->MaxNbrQua ) { printf(" ## ERROR LoadSU2Elements: quad out of bound (id=%d)\n", Msh->NbrQua); return 0; } switchQuaIdx(swi,is); //DefaultQuadrilateral(Msh,Msh->NbrQua,&Msh->Qua[NbrQua],is,ref); AddQuadrilateral(Msh,Msh->NbrQua,is,ref); } else if ( typ == SU2_WEDGE ) { for (s=0; s<6; s++) { fscanf(FilHdl, "%d", &buf); swi[s] = buf+1; is[s] = buf+1; } fscanf(FilHdl, "%d", &idx); Msh->NbrPri++; if ( Msh->NbrPri > Msh->MaxNbrPri ) { printf(" ## ERROR LoadSU2Elements: prism out of bound (id=%d)\n", Msh->NbrPri); return 0; } //switchPriIdx(swi,is); //DefaultPrism(Msh,Msh->NbrPri,&Msh->Pri[NbrPri],is,ref); AddPrism(Msh,Msh->NbrPri,is,ref); } //else if ( typ == SU2_LINE ) { // for (s=0; s<2; s++) { // fscanf(FilHdl, "%d", &buf); // swi[s] = buf+1; // } // NbrEfr++; // // if ( NbrEfr > Msh->MaxNbrEfr ) { // printf(" ## ERROR LoadSU2Elements: boundary edge out of bound (id=%d, max=%d)\n", NbrEfr,Msh->MaxNbrEfr ); // return 0; // } // // DefaultBdyEdge(Msh,Msh->NbrEfr,&Msh->Efr[NbrEfr],swi,ref); //} //else if ( typ == SU2_LINEP2 ) { // // fscanf(FilHdl, "%d %d %d", &swi[0], &swi[1], &swi[2]); // for (s=0; s<3; s++) // swi[s]++; // // NbrP2Efr++; // // if ( NbrP2Efr > Msh->MaxNbrP2Efr ) { // printf(" ## ERROR LoadSU2Elements: P2 boundary edge out of bound (id=%d, max=%d)\n", NbrP2Efr,Msh->MaxNbrP2Efr ); // return 0; // } // // switchP2EfrIdx(swi,is); // NbrEfr++; // if ( NbrEfr > Msh->MaxNbrEfr ) { // printf(" ## ERROR LoadSU2Elements: P1 boundary edge out of bound (id=%d, max=%d)\n", NbrEfr,Msh->MaxNbrEfr ); // return 0; // } // DefaultBdyEdge(Msh,NbrEfr,&Msh->Efr[NbrEfr],is,ref); // DefaultP2BdyEdge(Msh,NbrP2Efr,&Msh->Efr[NbrP2Efr],is[2],NbrEfr,&Msh->Efr[NbrEfr]); //} //else if ( typ == SU2_TRIANGLEP2 ) { // // //fscanf(FilHdl, "%d %d %d %d %d %d", &swi[0],&swi[3],&swi[1],&swi[4],&swi[2],&swi[5]); // //fscanf(FilHdl, "%d %d %d %d %d %d", &swi[3],&swi[0],&swi[4],&swi[1],&swi[5],&swi[2]); // //fscanf(FilHdl, "%d %d %d %d %d %d", &swi[0],&swi[1],&swi[2],&swi[3],&swi[4],&swi[5]); // fscanf(FilHdl, "%d %d %d %d %d %d", &swi[0],&swi[3],&swi[1],&swi[5],&swi[4],&swi[2]); // for (s=0; s<6; s++) // swi[s]++; // // // NbrP2Tri++; // // if ( NbrP2Tri > Msh->MaxNbrP2Tri ) { // printf(" ## ERROR LoadSU2Elements: P2 triangle out of bound (id=%d, max=%d)\n", NbrP2Tri,Msh->MaxNbrP2Tri ); // return 0; // } // // switchP2TriIdx(swi,is); // // // NbrTri++; // // if ( NbrTri > Msh->MaxNbrTri ) { // printf(" ## ERROR LoadSU2Elements: P1 triangle out of bound (id=%d, max=%d)\n", NbrTri,Msh->MaxNbrTri ); // return 0; // } // // DefaultTriangle(Msh,NbrTri,&Msh->Tri[NbrTri],is,ref); // DefaultP2Triangle(Msh,NbrP2Tri,&Msh->P2Tri[NbrP2Tri],&is[3],NbrTri,&Msh->Tri[NbrTri]); // //} // else { printf(" ## ERROR : Unknown element type %d\n", typ); return 0; } fgets (str, sizeof str, FilHdl); }//for iElt //--- Read boundary elements //rewind(FilHdl); //do //{ // res = fscanf(FilHdl, "%s", str); //}while( (res != EOF) && strcmp(str, "NMARK=") ); //fscanf(FilHdl, "%d", &NbrMark); //fgets (str, sizeof str, FilHdl); rewind(FilHdl); NbrMark = GetSU2KeywordValue (FilHdl, "NMARK="); for (iMark=1; iMark<=NbrMark; iMark++) { GetSU2KeywordValueStr (FilHdl, "MARKER_TAG=", str); //printf(" Tag %s becomes reference %d\n", str, iMark); if ( !strcmp(str,"SEND_RECEIVE") ) { printf(" Tag %s was ignored.\n", str); continue; } CptElt = GetSU2KeywordValue (FilHdl, "MARKER_ELEMS="); for (iElt=0; iElt<CptElt; iElt++) { fscanf(FilHdl, "%d", &typ); if ( typ == SU2_TRIANGLE ) { for (s=0; s<3; s++) { fscanf(FilHdl, "%d", &buf); swi[s] = buf+1; } Msh->NbrTri++; if ( Msh->NbrTri > Msh->MaxNbrTri ) { printf(" ## ERROR LoadSU2Elements: triangle out of bound (tid=%d, max=%d)\n", Msh->NbrTri, Msh->MaxNbrTri); return 0; } switchTriIdx(swi,is); AddTriangle(Msh,Msh->NbrTri,is,iMark); } else if ( typ == SU2_RECTANGLE ) { for (s=0; s<4; s++) { fscanf(FilHdl, "%d", &buf); swi[s] = buf+1; } Msh->NbrQua++; if ( Msh->NbrQua > Msh->MaxNbrQua ) { printf(" ## ERROR LoadSU2Elements: quad out of bound (id=%d)\n", Msh->NbrQua); return 0; } switchQuaIdx(swi,is); //DefaultQuadrilateral(Msh,Msh->NbrQua,&Msh->Qua[NbrQua],is,iMark); AddQuadrilateral(Msh,Msh->NbrQua,is,iMark); } else if ( typ == SU2_LINE ) { for (s=0; s<2; s++) { fscanf(FilHdl, "%d", &buf); swi[s] = buf+1; } Msh->NbrEfr++; if ( Msh->NbrEfr > Msh->MaxNbrEfr ) { printf(" ## ERROR LoadSU2Elements: boundary edge out of bound (id=%d, max=%d)\n", Msh->NbrEfr, Msh->MaxNbrEfr); return 0; } //DefaultBdyEdge(Msh,Msh->NbrEfr,&Msh->Efr[NbrEfr],swi,iMark); AddEdge(Msh,Msh->NbrEfr,swi,iMark); } //else if ( typ == SU2_LINEP2 ) { // // fscanf(FilHdl, "%d %d %d", &swi[0], &swi[2], &swi[1]); // for (s=0; s<3; s++) // swi[s]++; // // NbrP2Efr++; // if ( NbrP2Efr > Msh->MaxNbrP2Efr ) { // printf(" ## ERROR LoadSU2Elements: P2 boundary edge out of bound (id=%d, max=%d)\n", NbrP2Efr,Msh->MaxNbrP2Efr ); // return 0; // } // // switchP2EfrIdx(swi,is); // // NbrEfr++; // if ( NbrEfr > Msh->MaxNbrEfr ) { // printf(" ## ERROR LoadSU2Elements: P1 boundary edge out of bound (id=%d, max=%d)\n", NbrEfr,Msh->MaxNbrEfr ); // return 0; // } // // DefaultBdyEdge(Msh,NbrEfr,&Msh->Efr[NbrEfr],is,iMark); // DefaultP2BdyEdge(Msh,NbrP2Efr,&Msh->Efr[NbrP2Efr],is[2],NbrEfr,&Msh->Efr[NbrEfr]); //} else { printf(" ## ERROR : Unknown element type %d\n", typ); return 0; } fgets (str, sizeof str, FilHdl); } } return 1; }