示例#1
0
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);
}
示例#2
0
文件: SU2io.c 项目: rfenrich/MULTIF
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;
}