Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
Go to the source code of this file.
Functions | |
double | compute_area (std::vector< EntityHandle > &) |
int | main (int argc, char **argv) |
Variables | |
Interface * | mb |
double compute_area | ( | std::vector< EntityHandle > & | entities | ) |
Definition at line 95 of file SurfArea.cpp.
References ErrorCode, moab::Core::get_connectivity(), moab::Core::get_coords(), length(), mb, and MB_SUCCESS.
Referenced by main().
{ ErrorCode rval = MB_SUCCESS; double area = 0.0; // loop thro' all the elements for( int i = 0; i < int( entities.size() ); i++ ) { std::vector< EntityHandle > conn; EntityHandle handle = entities[i]; // get the connectivity of this element rval = mb->get_connectivity( &handle, 1, conn ); if( MB_SUCCESS != rval ) return -1.0; // break polygon into triangles and sum the area - Limitation: Convex polygon for( int j = 2; j <= int( conn.size() ); ++j ) { EntityHandle vertices[3] = { conn[0], conn[j - 1], conn[j - 2] }; CartVect coords[3]; // get 3 coordinates forming the triangle rval = mb->get_coords( vertices, 3, coords[0].array() ); if( MB_SUCCESS != rval ) return -1.0; CartVect edge0 = coords[1] - coords[0]; CartVect edge1 = coords[2] - coords[0]; // using MBCarVect overloaded operators and computing triangle area area += ( edge0 * edge1 ).length() / 2.0; } } // clear the entities, else old entities remain entities.clear(); return area; }
int main | ( | int | argc, |
char ** | argv | ||
) |
Definition at line 22 of file SurfArea.cpp.
References moab::Range::begin(), compute_area(), moab::Range::end(), ErrorCode, moab::Core::get_entities_by_dimension(), moab::Core::get_entities_by_type_and_tag(), moab::Core::load_file(), mb, MB_SUCCESS, MB_TYPE_INTEGER, MBENTITYSET, moab::Core::tag_get_data(), and moab::Core::tag_get_handle().
{ if( 1 == argc ) { std::cout << "Usage: " << argv[0] << " <filename>" << std::endl; return 0; } // declare variables Tag gtag, idtag; ErrorCode rval; const char* tag_geom = "GEOM_DIMENSION"; const char* tag_gid = "GLOBAL_ID"; Range sets; std::vector< EntityHandle > ents; // load a file mb = new Core(); rval = mb->load_file( argv[1] ); if( MB_SUCCESS != rval ) return 1; // get the tag handle for the tags rval = mb->tag_get_handle( tag_geom, 1, MB_TYPE_INTEGER, gtag ); if( MB_SUCCESS != rval ) return 1; rval = mb->tag_get_handle( tag_gid, 1, MB_TYPE_INTEGER, idtag ); if( MB_SUCCESS != rval ) return 1; // get all the sets with GEOM_DIMESION tag rval = mb->get_entities_by_type_and_tag( 0, MBENTITYSET, >ag, NULL, 1, sets ); if( MB_SUCCESS != rval ) return 1; // iterate over each set, getting entities Range::iterator set_it; // loop thru all the geometric entity sets for( set_it = sets.begin(); set_it != sets.end(); ++set_it ) { EntityHandle this_set = *set_it; // get the id for this set int set_id; rval = mb->tag_get_data( gtag, &this_set, 1, &set_id ); if( MB_SUCCESS != rval ) return 1; // check if it is a surface entities (GEOM_DIMENSION 2) then compute area if( set_id == 2 ) { // area of a surface double total_area = 0.0; // get the global id of this surface int gid = 0; rval = mb->tag_get_data( idtag, &this_set, 1, &gid ); if( MB_SUCCESS != rval ) return 1; // get all entities with dimension 2 in ents rval = mb->get_entities_by_dimension( this_set, 2, ents ); if( MB_SUCCESS != rval ) return 1; // compute the area total_area = compute_area( ents ); ents.clear(); std::cout << "Total area of meshes in surface " << gid << " = " << total_area << std::endl; } } }
Definition at line 20 of file SurfArea.cpp.