|
cgma
|
#include "MergeTool.hpp"#include "InitCGMA.hpp"#include "GeometryModifyTool.hpp"#include "GeometryQueryTool.hpp"#include "Body.hpp"#include "CGMApp.hpp"#include "CubitAttribManager.hpp"#include "CubitCompat.hpp"#include <stdio.h>#include <stdlib.h>#include <iostream>#include <vector>Go to the source code of this file.
Defines | |
| #define | ENGINE 0 |
| #define | gti GeometryQueryTool::instance() |
| #define | gmti GeometryModifyTool::instance() |
| #define | ASSERT(A) if (!(A)) failed(#A,__FILE__,__LINE__) |
Functions | |
| void | failed (const char *A, const char *FILE, int LINE) |
| static void | print_usage (const char *name, std::ostream &stream) |
| std::string | type_from_file_name (const std::string &filename) |
| int | main (int argc, char *argv[]) |
Definition at line 22 of file cgmpartitioner.cpp.
| #define ENGINE 0 |
Definition at line 16 of file cgmpartitioner.cpp.
| #define gmti GeometryModifyTool::instance() |
Definition at line 20 of file cgmpartitioner.cpp.
| #define gti GeometryQueryTool::instance() |
Definition at line 19 of file cgmpartitioner.cpp.
| void failed | ( | const char * | A, |
| const char * | FILE, | ||
| int | LINE | ||
| ) |
Definition at line 23 of file cgmpartitioner.cpp.
{
printf( "Condition failed at %s:%d : %s\n", FILE, LINE, A );
abort();
}
| int main | ( | int | argc, |
| char * | argv[] | ||
| ) |
Definition at line 57 of file cgmpartitioner.cpp.
{
if (argc !=6){
print_usage(argv[0], std::cerr);
exit(0);
}
// parse command line options for partitioning geometry for parallel mesh generation
CubitStatus rsl = CUBIT_SUCCESS;
rsl = InitCGMA::initialize_cgma( ENGINE );
ASSERT(rsl);
CGMApp::instance()->attrib_manager()->auto_flag( CUBIT_TRUE );
std::string type = type_from_file_name( argv[1] );
if (type.empty()) // just guess OCC
type = "OCC";
rsl = CubitCompat_import_solid_model(argv[1], type.c_str());
if (rsl != CUBIT_SUCCESS) {
PRINT_ERROR("Problems reading geometry file %s.\n", argv[1]);
abort();
}
int npartsx = atoi(argv[2]), npartsy = atoi(argv[3]), npartsz = atoi(argv[4]);
// Get the bounding box for this geometry
DLIList<Body*> old_bodies, new_bodies, junk;
gti->bodies(old_bodies);
old_bodies.reset();
std::vector<CubitBox> box;
box.resize(old_bodies.size());
CubitBox box1;
for(int i=0; i< old_bodies.size (); i++){
box[i] =old_bodies[i]->bounding_box();
if (i>0)
box1 = box[i-1].operator |= (box[i]);
else
box1 = box[i];
}
double bxmax =box1.max_x ();
double bymax =box1.max_y ();
double bzmax =box1.max_z ();
double bxmin =box1.min_x ();
double bymin =box1.min_y ();
double bzmin =box1.min_z ();
std::cout << "Bounding box of the geometry file:" << std::endl;
std::cout << bxmin << " < X < " << bxmax << std::endl;
std::cout << bymin << " < X < " << bymax << std::endl;
std::cout << bzmin << " < X < " << bzmax << std::endl;
double dx = box1.x_range ();
double dy = box1.y_range ();
double dz = box1.z_range ();
for (int i=0; i< npartsx-1; i++){
double xcenter = bxmin + (i+1)*dx/npartsx;
CubitVector center(xcenter,0.0, 0.0);
CubitVector axes[2];
axes[0].set(0.,0.,1.);
axes[1].set(0.,1.,0.);
new_bodies.clean_out ();
rsl = gmti->webcut_with_planar_sheet(old_bodies,center,axes,2*dy,2*dz,new_bodies,junk);
if (rsl== CUBIT_FAILURE)
return rsl;
old_bodies.clean_out ();
old_bodies.copy_from (&new_bodies[0],new_bodies.size ());
}
old_bodies.clean_out ();
gti->bodies(old_bodies);
old_bodies.reset();
for (int j=0; j< npartsy-1; j++){
double ycenter = bymin + (j+1)*dy/npartsy;
CubitVector center(0.0,ycenter, 0.0);
CubitVector axes[2];
axes[0].set(0.,0.,1.);
axes[1].set(1.,0.,0.);
new_bodies.clean_out ();
rsl = gmti->webcut_with_planar_sheet(old_bodies,center,axes,2*dz,2*dx,new_bodies,junk);
if (rsl== CUBIT_FAILURE)
return rsl;
old_bodies.clean_out ();
old_bodies.copy_from (&new_bodies[0],new_bodies.size ());
}
old_bodies.clean_out ();
gti->bodies(old_bodies);
old_bodies.reset();
for (int k=0; k< npartsz-1; k++){
double zcenter = bzmin + (k+1)*dz/npartsz;
CubitVector center(0.0,0.0, zcenter);
CubitVector axes[2];
axes[0].set(0.,1.,0.);
axes[1].set(1.,0.,0.);
new_bodies.clean_out ();
rsl = gmti->webcut_with_planar_sheet(old_bodies,center,axes,2*dx,2*dy,new_bodies,junk);
if (rsl== CUBIT_FAILURE)
return rsl;
old_bodies.clean_out ();
old_bodies.copy_from (&new_bodies[0],new_bodies.size ());
}
// merge entities
rsl = MergeTool::instance()->merge_bodies( new_bodies );
ASSERT(rsl);
int num_ents_exported=0;
DLIList<RefEntity*> ref_entities;
const CubitString cubit_version="10.2";
const char * filename = argv[5];
ref_entities.clean_out();
rsl = CubitCompat_export_solid_model(ref_entities, filename, type.c_str(),
num_ents_exported, cubit_version);
if (rsl== CUBIT_FAILURE)
return rsl;
return 0;
}
| static void print_usage | ( | const char * | name, |
| std::ostream & | stream | ||
| ) | [static] |
Definition at line 30 of file cgmpartitioner.cpp.
{
std::cout << "Usage: " << name << " <input geometry file name> #x-parts #y-parts #z-parts <output geometry file name>" << std::endl;
}
| std::string type_from_file_name | ( | const std::string & | filename | ) |
Definition at line 36 of file cgmpartitioner.cpp.
{
size_t dot_pos = filename.find_last_of( '.' );
if (dot_pos == std::string::npos)
return std::string();
std::string extension = filename.substr( dot_pos + 1 );
std::transform( extension.begin(), extension.end(), extension.begin(), ::tolower );
if (extension == "occ" || extension == "brep")
return "OCC";
else if (extension == "step" || extension == "stp")
return "STEP";
else if (extension == "iges" || extension == "igs")
return "IGES";
else if (extension == "sat")
return "ACIS_SAT";
else
return std::string();
}