Exemple #1
0
void COutput::SetCGNS_Coordinates(CConfig *config, CGeometry *geometry, unsigned short iZone) {
  
#ifdef HAVE_CGNS
  
	/*--- local CGNS variables ---*/
	int cgns_file, cgns_coord, element_dims, physical_dims, cgns_err;
	unsigned long iExtIter = config->GetExtIter();
	string base_file, buffer, elements_name;
	stringstream name, results_file;
	bool unsteady = config->GetUnsteady_Simulation();
	cgsize_t isize[3][1];
  
	/*--- Create CGNS base file name ---*/
	base_file = config->GetFlow_FileName();
  
	/*--- Add CGNS extension. ---*/
	base_file = base_file.append(".cgns");
  
	/*--- Create CGNS results file name ---*/
	if (unsteady) {
    
		buffer = config->GetFlow_FileName();
    
		results_file.str(string()); results_file << buffer;
		if (((int)iExtIter >= 0) && ((int)iExtIter < 10))			results_file << "_0000" << iExtIter;
		if (((int)iExtIter >= 10) && ((int)iExtIter < 100))		results_file << "_000" << iExtIter;
		if (((int)iExtIter >= 100) && ((int)iExtIter < 1000))		results_file << "_00" << iExtIter;
		if (((int)iExtIter >= 1000) && ((int)iExtIter < 10000))	results_file << "_0" << iExtIter;
		if ((int)iExtIter >= 10000)							results_file << iExtIter;
		results_file << ".cgns";
	}
  
	/*--- Write base file if not already done ---*/
	if (!wrote_base_file) {
    
		/*--- Write base file ---*/
		cgns_err = cg_open((char *)base_file.c_str(), CG_MODE_MODIFY, &cgns_file);
		if (cgns_err) cg_error_print();
    
		element_dims = geometry->GetnDim();		// Currently (release 2.0) only all-2D or all-3D zones permitted
		physical_dims = element_dims;
		
		isize[0][0] = (cgsize_t)nGlobal_Poin;				// vertex size
		isize[1][0] = (cgsize_t)nGlobal_Elem;				// cell size
		isize[2][0] = 0;						// boundary vertex size (zero if elements not sorted)
    
    cgns_err = cg_goto(cgns_file, cgns_base,"Zone_t", cgns_zone,"end");
		if (cgns_err) cg_error_print();
//    
//    cgns_err = cg_goto(cgns_file, cgns_base, cgns_zone,"end");
//		if (cgns_err) cg_error_print();
    
		/*--- write CGNS node coordinates ---*/
		cgns_err = cg_coord_write(cgns_file, cgns_base, cgns_zone, RealDouble,"x", Coords[0], &cgns_coord);
		if (cgns_err) cg_error_print();
		cgns_err = cg_coord_write(cgns_file, cgns_base, cgns_zone, RealDouble,"y", Coords[1], &cgns_coord);
		if (cgns_err) cg_error_print();
		if (geometry->GetnDim() == 3) {
			cgns_err = cg_coord_write(cgns_file, cgns_base, cgns_zone, RealDouble,"z", Coords[2], &cgns_coord);
			if (cgns_err) cg_error_print();
		}
    
		cgns_err = cg_close(cgns_file);
		if (cgns_err) cg_error_print();
    
        wrote_base_file = true;
    
	}
	
	/*--- Set up results file for this time step if necessary ---*/
	if (unsteady) {
    
		cgns_err = cg_open((char *)results_file.str().c_str(), CG_MODE_WRITE, &cgns_file);

		element_dims = geometry->GetnDim();		// Currently only all-2D or all-3D zones permitted
		physical_dims = element_dims;

    /*--- write CGNS base data (one base assumed currently) ---*/
		cgns_err = cg_base_write(cgns_file,"SU2 Base", element_dims, physical_dims, &cgns_base_results);
		if (cgns_err) cg_error_print();

		isize[0][0] = (cgsize_t)geometry->GetGlobal_nPointDomain();				// vertex size
		isize[1][0] = (cgsize_t)nGlobal_Elem;				// cell size
		isize[2][0] = 0;						// boundary vertex size (zero if elements not sorted)

		/*--- write CGNS zone data ---*/
		cgns_err = cg_zone_write(cgns_file, cgns_base_results,"SU2 Zone", isize[0],Unstructured, &cgns_zone_results);
		if (cgns_err) cg_error_print();

		cgns_err = cg_goto(cgns_file, cgns_base_results,"Zone_t", cgns_zone_results,"end");
		if (cgns_err) cg_error_print();

    /*--- Write CGNS node coordinates, if appliciable ---*/
		if (config->GetGrid_Movement()) {
      
			/*--- write CGNS node coordinates ---*/
			cgns_err = cg_coord_write(cgns_file, cgns_base_results, cgns_zone_results, RealDouble,"x", Coords[0], &cgns_coord);
			if (cgns_err) cg_error_print();
			cgns_err = cg_coord_write(cgns_file, cgns_base_results, cgns_zone_results, RealDouble,"y", Coords[1], &cgns_coord);
			if (cgns_err) cg_error_print();
			if (geometry->GetnDim() == 3) {
				cgns_err = cg_coord_write(cgns_file, cgns_base_results, cgns_zone_results, RealDouble,"z", Coords[2], &cgns_coord);
				if (cgns_err) cg_error_print();
			}
		}
		else {
			/*--- Write a CGNS link for the node coordinates ---*/
			cgns_err = cg_link_write("GridCoordinates",(char *)base_file.c_str(),"/SU2 Base/SU2 Zone/GridCoordinates");
			if (cgns_err) cg_error_print();
		}
    
		/*--- Write a CGNS link for each element type connectivity ---*/
		if (nGlobal_Tria > 0) cgns_err = cg_link_write("Triangle Elements",(char *)base_file.c_str(),"/SU2 Base/SU2 Zone/Triangle Elements");
		if (nGlobal_Quad > 0) cgns_err = cg_link_write("Quadrilateral Elements",(char *)base_file.c_str(),"/SU2 Base/SU2 Zone/Quadrilateral Elements");
		if (nGlobal_Tetr > 0) cgns_err = cg_link_write("Tetrahedral Elements",(char *)base_file.c_str(),"/SU2 Base/SU2 Zone/Tetrahedral Elements");
		if (nGlobal_Hexa > 0) cgns_err = cg_link_write("Hexahedral Elements",(char *)base_file.c_str(),"/SU2 Base/SU2 Zone/Hexahedral Elements");
		if (nGlobal_Pyra > 0) cgns_err = cg_link_write("Pyramid Elements",(char *)base_file.c_str(),"/SU2 Base/SU2 Zone/Pyramid Elements");
		if (nGlobal_Pris > 0) cgns_err = cg_link_write("Prism Elements",(char *)base_file.c_str(),"/SU2 Base/SU2 Zone/Prism Elements");
		if (nGlobal_Line > 0) cgns_err = cg_link_write("Line Elements",(char *)base_file.c_str(),"/SU2 Base/SU2 Zone/Line Elements");
		if (cgns_err) cg_error_print();

    
    /*--- Close CGNS file ---*/
    cgns_err = cg_close(cgns_file);
    if (cgns_err) cg_error_print();
    
	}


  
#else // Not built with CGNS support
  
	cout << "CGNS file requested but SU2 was built without CGNS support. No file written" << "\n"; 
  
#endif
  
}
Exemple #2
0
void COutput::SetCGNS_Connectivity(CConfig *config, CGeometry *geometry, unsigned short iZone) {
  
#ifdef HAVE_CGNS
  
	/*--- local CGNS variables ---*/
	int cgns_file, element_dims, physical_dims, cgns_err;
	int cgns_section;
	unsigned long iExtIter = config->GetExtIter();
	string base_file, buffer, elements_name;
	stringstream name, results_file;
	bool unsteady = config->GetUnsteady_Simulation();
	cgsize_t isize[3][1], elem_start, elem_end;
  
	/*--- Create CGNS base file name ---*/
	base_file = config->GetFlow_FileName();
  
	/*--- Add CGNS extension. ---*/
	base_file = base_file.append(".cgns");
  
	/*--- Create CGNS results file name ---*/
	if (unsteady) {
    
		buffer = config->GetFlow_FileName();
    
		results_file.str(string()); results_file << buffer;
		if (((int)iExtIter >= 0) && ((int)iExtIter < 10))			results_file << "_0000" << iExtIter;
		if (((int)iExtIter >= 10) && ((int)iExtIter < 100))		results_file << "_000" << iExtIter;
		if (((int)iExtIter >= 100) && ((int)iExtIter < 1000))		results_file << "_00" << iExtIter;
		if (((int)iExtIter >= 1000) && ((int)iExtIter < 10000))	results_file << "_0" << iExtIter;
		if ((int)iExtIter >= 10000)							results_file << iExtIter;
		results_file << ".cgns";
	}
  
	/*--- Write base file if not already done ---*/
	if (!wrote_base_file) {
    
    /*--- Write base file ---*/
		cgns_err = cg_open((char *)base_file.c_str(), CG_MODE_WRITE, &cgns_file);
		if (cgns_err) cg_error_print();
    
		element_dims = geometry->GetnDim();		// Currently only all-2D or all-3D zones permitted
		physical_dims = element_dims;
    
		/*--- write CGNS base data (one base assumed currently) ---*/
		cgns_err = cg_base_write(cgns_file,"SU2 Base", element_dims, physical_dims, &cgns_base);
		if (cgns_err) cg_error_print();
    
		/*--- write CGNS descriptor data ---*/
		cgns_err = cg_goto(cgns_file, cgns_base,"end");
		if (cgns_err) cg_error_print();
    
		cgns_err = cg_equationset_write(physical_dims);
		if (cgns_err) cg_error_print();
    
		/*--- Write governing equations to CGNS file ---*/
		cgns_err = cg_goto(cgns_file, cgns_base,"FlowEquationSet_t",1,"end");
		if (cgns_err) cg_error_print();
    switch (config->GetKind_Solver()) {
      case EULER:
        cgns_err = cg_governing_write(Euler); break;
      case NAVIER_STOKES:
        cgns_err = cg_governing_write(NSLaminar); break;
      case RANS:
        cgns_err = cg_governing_write(NSTurbulent); break;
      default:
        break; // cgns_err = cg_governing_write(CG_UserDefined);
    }
    if (cgns_err) cg_error_print();
    
		if (unsteady) cgns_err = cg_simulation_type_write(cgns_file, cgns_base, TimeAccurate);
		else cgns_err = cg_simulation_type_write(cgns_file, cgns_base, NonTimeAccurate);
		if (cgns_err) cg_error_print();
    
		cgns_err = cg_descriptor_write("Solver Information","SU2");
		if (cgns_err) cg_error_print();
		
		isize[0][0] = (cgsize_t)geometry->GetGlobal_nPointDomain(); //;				// vertex size
		isize[1][0] = (cgsize_t)nGlobal_Elem;				// cell size
		isize[2][0] = 0;						// boundary vertex size (zero if elements not sorted)
    
		/*--- write CGNS zone data ---*/
		cgns_err = cg_zone_write(cgns_file, cgns_base,"SU2 Zone", isize[0],Unstructured, &cgns_zone);
		if (cgns_err) cg_error_print();

    cgns_err = cg_goto(cgns_file, cgns_base,"Zone_t", cgns_zone,"end");
		if (cgns_err) cg_error_print();
    
    		/*--- Reference Note: CGNS element type list:
     NODE, BAR_2, BAR_3, TRI_3, TRI_6, QUAD_4, QUAD_8, QUAD_9, TETRA_4, TETRA_10, PYRA_5,
     PYRA_14, PENTA_6, PENTA_15, PENTA_18, HEXA_8, HEXA_20, HEXA_27, MIXED, PYRA_13, NGON_n, NFACE_n ---*/
    
		/*--- Write a CGNS section for each element type ---*/
		// ier = cg_section_write(int fn, int B, int Z, char *ElementSectionName, ElementType_t type,
    // cgsize_t start, cgsize_t end, int nbndry, cgsize_t *Elements, int *S);
		
    if (nGlobal_Tria > 0) {
			elem_start = 1; elem_end = (int)nGlobal_Tria;
			cgns_err = cg_section_write(cgns_file, cgns_base, cgns_zone,
                                  "Triangle Elements", TRI_3, elem_start, elem_end,
                                  0,(cgsize_t *)Conn_Tria, &cgns_section);
    }
		if (nGlobal_Quad > 0) {
			elem_start = 1; elem_end = (int)nGlobal_Quad;
			cgns_err = cg_section_write(cgns_file, cgns_base, cgns_zone,"Quadrilateral Elements", QUAD_4,
                                  elem_start, elem_end,0,(cgsize_t *)Conn_Quad, &cgns_section);
		}
		if (nGlobal_Tetr > 0) {
			elem_start = 1; elem_end = (int)nGlobal_Tetr;
			cgns_err = cg_section_write(cgns_file, cgns_base, cgns_zone,"Tetrahedral Elements", TETRA_4,
                                  elem_start, elem_end,0,(cgsize_t *)Conn_Tetr, &cgns_section);
		}
		if (nGlobal_Hexa > 0) {
			elem_start = 1; elem_end = (int)nGlobal_Hexa;
			cgns_err = cg_section_write(cgns_file, cgns_base, cgns_zone,"Hexahedral Elements", HEXA_8,
                                  elem_start, elem_end,0,(cgsize_t *)Conn_Hexa, &cgns_section);
		}
		if (nGlobal_Pyra > 0) {
			elem_start = 1; elem_end = (int)nGlobal_Pyra;
			cgns_err = cg_section_write(cgns_file, cgns_base, cgns_zone,"Pyramid Elements", PYRA_5,
                                  elem_start, elem_end,0,(cgsize_t *)Conn_Pyra, &cgns_section);
		}
		if (nGlobal_Pris > 0) {
			elem_start = 1; elem_end = (int)nGlobal_Pris;
			cgns_err = cg_section_write(cgns_file, cgns_base, cgns_zone,"Prism Elements", PENTA_6,
                                  elem_start, elem_end,0,(cgsize_t *)Conn_Pris, &cgns_section);
		}
		if (nGlobal_Line > 0) {
			elem_start = 1; elem_end = (int)nGlobal_Line;
			cgns_err = cg_section_write(cgns_file, cgns_base, cgns_zone,"Line Elements", BAR_2,
                                  elem_start, elem_end,0,(cgsize_t *)Conn_Line, &cgns_section);
		}
		if (cgns_err) cg_error_print();
    
    
		cgns_err = cg_close(cgns_file);
		if (cgns_err) cg_error_print();
    
	}
  
#else // Not built with CGNS support
  
	cout << "CGNS file requested but SU2 was built without CGNS support. No file written" << "\n"; 
  
#endif
  
}
Exemple #3
0
void COutput::SetCGNS_Solution(CConfig *config, CGeometry *geometry, unsigned short iZone) {
  
#ifdef HAVE_CGNS
  
	/*--- local CGNS variables ---*/
	int cgns_file, cgns_flow, cgns_field, cgns_err;
//  int element_dims;
	unsigned long jVar, iVar, iExtIter = config->GetExtIter();
	string base_file, buffer, elements_name;
	stringstream name, results_file;
	bool unsteady = config->GetUnsteady_Simulation();
  
  bool compressible = (config->GetKind_Regime() == COMPRESSIBLE);
  
	/*--- Create CGNS base file name ---*/
	base_file = config->GetFlow_FileName();
  
	/*--- Add CGNS extension. ---*/
	base_file = base_file.append(".cgns");
  
	/*--- Create CGNS results file name ---*/
	if (unsteady) {
    
		buffer = config->GetFlow_FileName();
    
		results_file.str(string()); results_file << buffer;
		if (((int)iExtIter >= 0) && ((int)iExtIter < 10))			results_file << "_0000" << iExtIter;
		if (((int)iExtIter >= 10) && ((int)iExtIter < 100))		results_file << "_000" << iExtIter;
		if (((int)iExtIter >= 100) && ((int)iExtIter < 1000))		results_file << "_00" << iExtIter;
		if (((int)iExtIter >= 1000) && ((int)iExtIter < 10000))	results_file << "_0" << iExtIter;
		if ((int)iExtIter >= 10000)							results_file << iExtIter;
		results_file << ".cgns";
	}
    
		if (!unsteady) {
      
      /*--- Write base file ---*/
      cgns_err = cg_open((char *)base_file.c_str(), CG_MODE_MODIFY, &cgns_file);
      if (cgns_err) cg_error_print();
      
//      element_dims = geometry->GetnDim();		// Currently (release 2.0) only all-2D or all-3D zones permitted
      
      /*--- write CGNS descriptor data ---*/
      cgns_err = cg_goto(cgns_file, cgns_base,"end");
      if (cgns_err) cg_error_print();
      
			/*--- Create a CGNS solution node ---*/
			cgns_err = cg_sol_write(cgns_file, cgns_base, cgns_zone,"Solution", Vertex, &cgns_flow);
			if (cgns_err) cg_error_print();
      
			cgns_err = cg_goto(cgns_file, cgns_base,"Zone_t", cgns_zone,"FlowSolution_t", cgns_flow,"end");
			if (cgns_err) cg_error_print();
      
			cgns_err = cg_gridlocation_write(Vertex);
			if (cgns_err) cg_error_print();
		}

    
		//wrote_CGNS_base = true;
    else {
	
	/*--- Set up results file for this time step if necessary ---*/
    
		cgns_err = cg_open((char *)results_file.str().c_str(), CG_MODE_MODIFY, &cgns_file);
    
//		element_dims = geometry->GetnDim();		// Currently (release 2.0) only all-2D or all-3D zones permitted
//    
//		/*--- write CGNS base data (one base assumed currently) ---*/
//		cgns_err = cg_base_write(cgns_file,"SU2 Base", element_dims, physical_dims, &cgns_base);
//		if (cgns_err) cg_error_print();
    
//		/*--- write CGNS zone data ---*/
//		cgns_err = cg_zone_write(cgns_file, cgns_base,"SU2 Zone", isize[0],Unstructured, &cgns_zone);
//		if (cgns_err) cg_error_print();
    
		cgns_err = cg_goto(cgns_file, cgns_base_results,"Zone_t", cgns_zone_results,"end");
		if (cgns_err) cg_error_print();
    
		/*--- Write a CGNS solution node for this time step ---*/
		cgns_err = cg_sol_write(cgns_file, cgns_base_results, cgns_zone_results,"Solution", Vertex, &cgns_flow);
		if (cgns_err) cg_error_print();
    
		cgns_err = cg_goto(cgns_file, cgns_base_results,"Zone_t", cgns_zone_results,"FlowSolution_t", cgns_flow,"end");
		if (cgns_err) cg_error_print();
    
		cgns_err = cg_gridlocation_write(Vertex);
		if (cgns_err) cg_error_print();
    
      cgns_base = cgns_base_results;
      cgns_zone = cgns_zone_results;
	}
//	else {
//    
//		/*--- Open CGNS file for soltuion writing ---*/
//		cgns_err = cg_open((char *)base_file.c_str(), CG_MODE_MODIFY, &cgns_file);
//		cgns_base = 1; cgns_zone = 1; cgns_flow = 1;	// fix for multiple zones
//    
//	}
	
	/*	Reference Note on solution variables:
   index 0 --> (nVar_Consv-1)			= Conservative Variables
   nVar_Consv --> (2*nVar_Consv-1)		= Conservative Variable Residuals
   (2*nVar_Consv-1)+					= Additional p, M, T, laminar, eddy depending on solver used */
  
	/*--- Write conservative variables to CGNS file ---*/
	for (iVar = 0; iVar < nVar_Consv; iVar++) {
		name.str(string()); name << "Conservative Variable " << iVar+1;
		cgns_err = cg_field_write(cgns_file, cgns_base, cgns_zone, cgns_flow, RealDouble,(char *)name.str().c_str(), Data[iVar], &cgns_field);
		if (cgns_err) cg_error_print();
	}
  
  /*--- Write primitive variable residuals to CGNS file ---*/
  if (config->GetWrt_Limiters()) {
    for (jVar = 0; jVar < nVar_Consv; jVar++) {
      name.str(string()); name << "Primitive Limiter " << jVar+1;
      cgns_err = cg_field_write(cgns_file, cgns_base, cgns_zone, cgns_flow, RealDouble,(char *)name.str().c_str(), Data[iVar], &cgns_field); iVar++;
      if (cgns_err) cg_error_print();
    }
  }
  
	/*--- Write conservative variable residuals to CGNS file ---*/
  if (config->GetWrt_Residuals()) {
    for (jVar = 0; jVar < nVar_Consv; jVar++) {
      name.str(string()); name << "Conservative Residual " << jVar+1;
      cgns_err = cg_field_write(cgns_file, cgns_base, cgns_zone, cgns_flow, RealDouble,(char *)name.str().c_str(), Data[iVar], &cgns_field); iVar++;
      if (cgns_err) cg_error_print();
    }
  }
  
	/*--- Write grid velocities to CGNS file, if applicable ---*/
	if (config->GetGrid_Movement()) {
		cgns_err = cg_field_write(cgns_file, cgns_base, cgns_zone, cgns_flow, RealDouble,"Grid Velocity X", Data[iVar], &cgns_field); iVar++;
		if (cgns_err) cg_error_print();
		cgns_err = cg_field_write(cgns_file, cgns_base, cgns_zone, cgns_flow, RealDouble,"Grid Velocity Y", Data[iVar], &cgns_field); iVar++;
		if (cgns_err) cg_error_print();
		if (geometry->GetnDim() == 3) {
			cgns_err = cg_field_write(cgns_file, cgns_base, cgns_zone, cgns_flow, RealDouble,"Grid Velocity Z", Data[iVar], &cgns_field); iVar++;
			if (cgns_err) cg_error_print();
		}
	}
  
	if (compressible) {
		switch (config->GetKind_Solver()) {
        
        /*--- Write pressure and Mach data to CGNS file ---*/
      case EULER:
        cgns_err = cg_field_write(cgns_file, cgns_base, cgns_zone, cgns_flow, RealDouble,"Pressure", Data[iVar], &cgns_field); iVar++;
        if (cgns_err) cg_error_print();
        cgns_err = cg_field_write(cgns_file, cgns_base, cgns_zone, cgns_flow, RealDouble,"Mach", Data[iVar], &cgns_field); iVar++;
        if (cgns_err) cg_error_print();
        break;
        
        /*--- Write temperature and laminar viscosity to CGNS file, if applicable ---*/
      case NAVIER_STOKES:
        cgns_err = cg_field_write(cgns_file, cgns_base, cgns_zone, cgns_flow, RealDouble,"Pressure", Data[iVar], &cgns_field); iVar++;
        if (cgns_err) cg_error_print();
        cgns_err = cg_field_write(cgns_file, cgns_base, cgns_zone, cgns_flow, RealDouble,"Mach", Data[iVar], &cgns_field); iVar++;
        if (cgns_err) cg_error_print();
        cgns_err = cg_field_write(cgns_file, cgns_base, cgns_zone, cgns_flow, RealDouble,"Temperature", Data[iVar], &cgns_field); iVar++;
        if (cgns_err) cg_error_print();
        cgns_err = cg_field_write(cgns_file, cgns_base, cgns_zone, cgns_flow, RealDouble,"Viscosity", Data[iVar], &cgns_field); iVar++;
        if (cgns_err) cg_error_print();
        break;
        
        /*--- Write eddy viscosity to CGNS file, if applicable ---*/
      case RANS:
        cgns_err = cg_field_write(cgns_file, cgns_base, cgns_zone, cgns_flow, RealDouble,"Pressure", Data[iVar], &cgns_field); iVar++;
        if (cgns_err) cg_error_print();
        cgns_err = cg_field_write(cgns_file, cgns_base, cgns_zone, cgns_flow, RealDouble,"Mach", Data[iVar], &cgns_field); iVar++;
        if (cgns_err) cg_error_print();
        cgns_err = cg_field_write(cgns_file, cgns_base, cgns_zone, cgns_flow, RealDouble,"Temperature", Data[iVar], &cgns_field); iVar++;
        if (cgns_err) cg_error_print();
        cgns_err = cg_field_write(cgns_file, cgns_base, cgns_zone, cgns_flow, RealDouble,"Viscosity", Data[iVar], &cgns_field); iVar++;
        if (cgns_err) cg_error_print();
        cgns_err = cg_field_write(cgns_file, cgns_base, cgns_zone, cgns_flow, RealDouble,"Eddy Viscosity", Data[iVar], &cgns_field); iVar++;
        if (cgns_err) cg_error_print();
        break;
        
      default:
        cout << "Error: Unrecognized equation type \n"; 
        exit(EXIT_FAILURE); break;
		}
	}	
  
	/*--- Close CGNS file ---*/
	cgns_err = cg_close(cgns_file);
	if (cgns_err) cg_error_print();
  
#else // Not built with CGNS support
  
	cout << "CGNS file requested but SU2 was built without CGNS support. No file written" << "\n"; 
  
#endif
  
}
Exemple #4
0
void COutput::SetCGNS_Connectivity(CConfig *config, CGeometry *geometry, unsigned short iZone) {
  
#ifndef NO_CGNS
  
	/*--- local CGNS variables ---*/
	int cgns_file,element_dims,physical_dims,cgns_err;
	int cgns_section;
	unsigned long iExtIter = config->GetExtIter();
	string base_file, buffer, elements_name;
	stringstream name, results_file;
	bool unsteady = config->GetUnsteady_Simulation();
	cgsize_t isize[3][1], elem_start, elem_end, N;
  
  bool compressible = (config->GetKind_Regime() == COMPRESSIBLE);
	bool incompressible = (config->GetKind_Regime() == INCOMPRESSIBLE);
	bool freesurface = (config->GetKind_Regime() == FREESURFACE);
  
	/*--- Create CGNS base file name ---*/
	base_file = config->GetFlow_FileName();
  
#ifndef NO_MPI
  /*--- Remove the domain number from the CGNS filename ---*/
  int nProcessor;
#ifdef WINDOWS
  MPI_Comm_size(MPI_COMM_WORLD,&nProcessor);
#else
  nProcessor = MPI::COMM_WORLD.Get_size();
#endif
  if (nProcessor > 1) base_file.erase (base_file.end()-2, base_file.end());
#endif
  
	/*--- Add CGNS extension. ---*/
	base_file = base_file.append(".cgns");
  
	/*--- Create CGNS results file name ---*/
	if (unsteady) {
    
		buffer = config->GetFlow_FileName();
    
#ifndef NO_MPI
    /*--- Remove the domain number from the CGNS filename ---*/
    if (nProcessor > 1) buffer.erase (buffer.end()-2, buffer.end());
#endif
		results_file.str(string()); results_file << buffer;
		if (((int)iExtIter >= 0) && ((int)iExtIter < 10))			results_file << "_0000" << iExtIter;
		if (((int)iExtIter >= 10) && ((int)iExtIter < 100))		results_file << "_000" << iExtIter;
		if (((int)iExtIter >= 100) && ((int)iExtIter < 1000))		results_file << "_00" << iExtIter;
		if (((int)iExtIter >= 1000) && ((int)iExtIter < 10000))	results_file << "_0" << iExtIter;
		if ((int)iExtIter >= 10000)							results_file << iExtIter;
		results_file << ".cgns";
	}
  
	/*--- Write base file if not already done ---*/
	if (!wrote_base_file) {
    
    /*--- Write base file ---*/
		cgns_err = cg_open((char *)base_file.c_str(),CG_MODE_WRITE,&cgns_file);
		if (cgns_err) cg_error_print();
    
		element_dims = geometry->GetnDim();		// Currently (release 2.0) only all-2D or all-3D zones permitted
		physical_dims = element_dims;
    
		/*--- write CGNS base data (one base assumed as of version 3.1.0 "eagle") ---*/
		cgns_err = cg_base_write(cgns_file,"SU^2 Base",element_dims,physical_dims,&cgns_base);
		if (cgns_err) cg_error_print();
    
		/*--- write CGNS descriptor data ---*/
		cgns_err = cg_goto(cgns_file,cgns_base,"end");
		if (cgns_err) cg_error_print();
    
		cgns_err = cg_equationset_write(physical_dims);
		if (cgns_err) cg_error_print();
    
		/*--- Write governing equations to CGNS file ---*/
		cgns_err = cg_goto(cgns_file,cgns_base,"FlowEquationSet_t",1,"end");
		if (cgns_err) cg_error_print();
		if (compressible) {
			switch (config->GetKind_Solver()) {
        case EULER:
          cgns_err = cg_governing_write(Euler); break;
        case NAVIER_STOKES:
          cgns_err = cg_governing_write(NSLaminar); break;
        case RANS:
          cgns_err = cg_governing_write(NSTurbulent); break;
        default:
          break; // cgns_err = cg_governing_write(CG_UserDefined);
			}
			if (cgns_err) cg_error_print();
		}
    
		if (unsteady) cgns_err = cg_simulation_type_write(cgns_file,cgns_base,TimeAccurate);
		else cgns_err = cg_simulation_type_write(cgns_file,cgns_base,NonTimeAccurate);
		if (cgns_err) cg_error_print();
    
		cgns_err = cg_descriptor_write("Solver Information","SU^2 version 3.1.0 \"eagle\", Stanford University Aerospace Design Lab");
		if (cgns_err) cg_error_print();
		
		isize[0][0] = geometry->GetGlobal_nPointDomain(); //;				// vertex size
		isize[1][0] = nGlobal_Elem;				// cell size
		isize[2][0] = 0;						// boundary vertex size (zero if elements not sorted)
    
		/*--- write CGNS zone data ---*/
		cgns_err = cg_zone_write(cgns_file,cgns_base,"SU^2 Zone",isize[0],Unstructured,&cgns_zone);
		if (cgns_err) cg_error_print();

    cgns_err = cg_goto(cgns_file,cgns_base,"Zone_t",cgns_zone,"end");
		if (cgns_err) cg_error_print();
    
    		/*--- Reference Note: CGNS element type list:
     NODE, BAR_2, BAR_3, TRI_3, TRI_6, QUAD_4, QUAD_8, QUAD_9, TETRA_4, TETRA_10, PYRA_5,
     PYRA_14, PENTA_6, PENTA_15, PENTA_18, HEXA_8, HEXA_20, HEXA_27, MIXED, PYRA_13, NGON_n, NFACE_n ---*/
    
		/*--- Write a CGNS section for each element type ---*/
		// ier = cg_section_write(int fn, int B, int Z, char *ElementSectionName, ElementType_t type,
    // cgsize_t start, cgsize_t end, int nbndry, cgsize_t *Elements, int *S);
		
    if (nGlobal_Tria > 0) {
			elem_start = 1; elem_end = (int)nGlobal_Tria;
      N = (int)nGlobal_Tria*N_POINTS_TRIANGLE;
			cgns_err = cg_section_write(cgns_file,cgns_base,cgns_zone,
                                  "Triangle Elements",TRI_3,elem_start,elem_end,
                                  0,(cgsize_t *)Conn_Tria,&cgns_section);
    }
		if (nGlobal_Quad > 0) {
			elem_start = 1; elem_end = (int)nGlobal_Quad; N = (int)nGlobal_Quad*N_POINTS_QUADRILATERAL;
			cgns_err = cg_section_write(cgns_file,cgns_base,cgns_zone,"Quadrilateral Elements",QUAD_4,
                                  elem_start,elem_end,0,(cgsize_t *)Conn_Quad,&cgns_section);
		}
		if (nGlobal_Tetr > 0) {
			elem_start = 1; elem_end = (int)nGlobal_Tetr; N = (int)nGlobal_Tetr*N_POINTS_TETRAHEDRON;
			cgns_err = cg_section_write(cgns_file,cgns_base,cgns_zone,"Tetrahedral Elements",TETRA_4,
                                  elem_start,elem_end,0,(cgsize_t *)Conn_Tetr,&cgns_section);
		}
		if (nGlobal_Hexa > 0) {
			elem_start = 1; elem_end = (int)nGlobal_Hexa; N = (int)nGlobal_Hexa*N_POINTS_HEXAHEDRON;
			cgns_err = cg_section_write(cgns_file,cgns_base,cgns_zone,"Hexahedral Elements",HEXA_8,
                                  elem_start,elem_end,0,(cgsize_t *)Conn_Hexa,&cgns_section);
		}
		if (nGlobal_Pyra > 0) {
			elem_start = 1; elem_end = (int)nGlobal_Pyra; N = (int)nGlobal_Pyra*N_POINTS_PYRAMID;
			cgns_err = cg_section_write(cgns_file,cgns_base,cgns_zone,"Pyramid Elements",PYRA_5,
                                  elem_start,elem_end,0,(cgsize_t *)Conn_Pyra,&cgns_section);
		}
		if (nGlobal_Wedg > 0) {
			elem_start = 1; elem_end = (int)nGlobal_Wedg; N = (int)nGlobal_Wedg*N_POINTS_WEDGE;
			cgns_err = cg_section_write(cgns_file,cgns_base,cgns_zone,"Wedge Elements",PENTA_6,
                                  elem_start,elem_end,0,(cgsize_t *)Conn_Wedg,&cgns_section);
		}
		if (nGlobal_Line > 0) {
			elem_start = 1; elem_end = (int)nGlobal_Line; N = (int)nGlobal_Line*N_POINTS_LINE;
			cgns_err = cg_section_write(cgns_file,cgns_base,cgns_zone,"Line Elements",BAR_2,
                                  elem_start,elem_end,0,(cgsize_t *)Conn_Line,&cgns_section);
		}
		if (cgns_err) cg_error_print();
    
    
		cgns_err = cg_close(cgns_file);
		if (cgns_err) cg_error_print();
    
	}
  
#else // Not built with CGNS support
  
	cout << "CGNS file requested but SU^2 was built without CGNS support. No file written" << "\n"; 
  
#endif
  
}