MOAB: Mesh Oriented datABase
(version 5.4.1)
|
#include "ScdVertexSeq.hpp"
#include "ScdElementSeq.hpp"
#include "EntitySequenceManager.hpp"
#include "EntitySequence.hpp"
#include "moab/Core.hpp"
#include "moab/ReadUtilIface.hpp"
#include <iostream>
#include <ctime>
Go to the source code of this file.
Functions | |
int | create_3dtri_3_sequences (Core *gMB, const int intervals, EntityHandle *vstart, EntityHandle *estart) |
int | create_3dtri_ucd_sequences (Core *gMB, const int intervals, EntityHandle *vstart, EntityHandle *estart) |
void | print_time () |
int | main (int argc, char **argv) |
int create_3dtri_3_sequences | ( | Core * | gMB, |
const int | intervals, | ||
EntityHandle * | vstart, | ||
EntityHandle * | estart | ||
) |
Definition at line 176 of file scdseq_timing.cpp.
References ErrorCode, MB_SUCCESS, MBHEX, MBVERTEX, moab::Core::sequence_manager(), and moab::HomCoord::unitv.
{ // create 3 brick esequences arranged such that the all share a common (tri-valent) edge; // orient each region similarly to the 2dtri_3_esequences test problem, swept into 3d in the // positive k direction. This direction is divided into intervals intervals // // intervals and intervals controls the i and j intervals in region 0, intervals follows from // that; intervals divides the k axis // input is 4 interval settings controlling the 4 degrees of freedom on the interfacesp int errors = 0; ScdVertexSeq* vseq[3]; ScdElementSeq* eseq[3]; // set vseq parametric spaces directly from intervals-4 // use 0-based parameterization on vseq's just for fun, which means we'll have to transform into // eseq system HomCoord vseq0_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( intervals, intervals, intervals ) }; HomCoord vseq1_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( intervals - 1, intervals, intervals ) }; HomCoord vseq2_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( intervals - 1, intervals - 1, intervals ) }; // get the seq manager from gMB EntitySequenceManager* seq_mgr = gMB->sequence_manager(); // create three vertex sequences EntitySequence* dum_seq; vseq[0] = vseq[1] = vseq[2] = NULL; // first vertex sequence ErrorCode result = seq_mgr->create_scd_sequence( vseq0_minmax[0], vseq0_minmax[1], MBVERTEX, 1, vstart[0], dum_seq ); if( NULL != dum_seq ) vseq[0] = dynamic_cast< ScdVertexSeq* >( dum_seq ); assert( MB_FAILURE != result && vstart[0] != 0 && dum_seq != NULL && vseq[0] != NULL ); // second vertex sequence result = seq_mgr->create_scd_sequence( vseq1_minmax[0], vseq1_minmax[1], MBVERTEX, 1, vstart[1], dum_seq ); if( NULL != dum_seq ) vseq[1] = dynamic_cast< ScdVertexSeq* >( dum_seq ); assert( MB_FAILURE != result && vstart[1] != 0 && dum_seq != NULL && vseq[1] != NULL ); // third vertex sequence result = seq_mgr->create_scd_sequence( vseq2_minmax[0], vseq2_minmax[1], MBVERTEX, 1, vstart[2], dum_seq ); if( NULL != dum_seq ) vseq[2] = dynamic_cast< ScdVertexSeq* >( dum_seq ); assert( MB_FAILURE != result && vstart[2] != 0 && dum_seq != NULL && vseq[2] != NULL ); // now create the three element sequences // set eseq parametric spaces directly from intervals-4 // use 0-based parameterization on eseq's just for fun, which means we'll have to transform into // eseq system HomCoord eseq0_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( intervals, intervals, intervals ) }; HomCoord eseq1_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( intervals, intervals, intervals ) }; HomCoord eseq2_minmax[2] = { HomCoord( 0, 0, 0 ), HomCoord( intervals, intervals, intervals ) }; eseq[0] = eseq[1] = eseq[2] = NULL; // create the first element sequence result = seq_mgr->create_scd_sequence( eseq0_minmax[0], eseq0_minmax[1], MBHEX, 1, estart[0], dum_seq ); if( NULL != dum_seq ) eseq[0] = dynamic_cast< ScdElementSeq* >( dum_seq ); assert( MB_FAILURE != result && estart[0] != 0 && dum_seq != NULL && eseq[0] != NULL ); // only need to add one vseq to this, unity transform result = eseq[0]->add_vsequence( vseq[0], // trick: if I know it's going to be unity, just input // 3 sets of equivalent points vseq0_minmax[0], vseq0_minmax[0], vseq0_minmax[0], vseq0_minmax[0], vseq0_minmax[0], vseq0_minmax[0] ); if( MB_SUCCESS != result ) { std::cout << "Couldn't add first vsequence to first element sequence in tri-composite 3d eseq." << std::endl; errors++; } // create the second element sequence result = seq_mgr->create_scd_sequence( eseq1_minmax[0], eseq1_minmax[1], MBHEX, 1, estart[1], dum_seq ); if( NULL != dum_seq ) eseq[1] = dynamic_cast< ScdElementSeq* >( dum_seq ); assert( MB_FAILURE != result && estart[1] != 0 && dum_seq != NULL && eseq[1] != NULL ); // add shared side from first vseq to this eseq, with bb to get just the face result = eseq[1]->add_vsequence( vseq[0], // p1: origin in both systems vseq0_minmax[0], eseq0_minmax[0], // p2: one unit along the shared line (i in one, j in other) vseq0_minmax[0] + HomCoord::unitv[0], eseq0_minmax[0] + HomCoord::unitv[1], // p3: arbitrary vseq0_minmax[0], eseq0_minmax[0], // set bb such that it's the jmin side of vseq true, eseq[1]->min_params(), HomCoord( eseq[1]->min_params().i(), eseq[1]->max_params().j(), eseq[1]->max_params().k() ) ); if( MB_SUCCESS != result ) { std::cout << "Couldn't add shared vsequence to second element sequence in tri-composite 3d eseq." << std::endl; errors++; } // add second vseq to this eseq, with different orientation but all of it (no bb input) result = eseq[1]->add_vsequence( vseq[1], // p1: origin/i+1 (vseq/eseq) vseq1_minmax[0], eseq1_minmax[0] + HomCoord::unitv[0], // p2: j+1 from p1 vseq1_minmax[0] + HomCoord::unitv[1], eseq1_minmax[0] + HomCoord::unitv[0] + HomCoord::unitv[1], // p3: i+1 from p1 vseq1_minmax[0] + HomCoord::unitv[0], eseq[1]->min_params() + HomCoord::unitv[0] * 2 ); if( MB_SUCCESS != result ) { std::cout << "Couldn't add second vseq to second element sequence in tri-composite 3d eseq." << std::endl; errors++; } // create the third element sequence result = seq_mgr->create_scd_sequence( eseq2_minmax[0], eseq2_minmax[1], MBHEX, 1, estart[2], dum_seq ); if( NULL != dum_seq ) eseq[2] = dynamic_cast< ScdElementSeq* >( dum_seq ); assert( MB_FAILURE != result && estart[2] != 0 && dum_seq != NULL && eseq[2] != NULL ); // add shared side from second vseq to this eseq result = eseq[2]->add_vsequence( vseq[1], // p1: origin/j+1 (vseq/eseq) vseq1_minmax[0], eseq[2]->min_params() + HomCoord::unitv[1], // p2: i+1/j+2 (vseq/eseq) vseq1_minmax[0] + HomCoord::unitv[0], eseq[2]->min_params() + HomCoord::unitv[1] * 2, // p3: arbitrary vseq1_minmax[0], eseq[2]->min_params() + HomCoord::unitv[1], // bb input such that we only get one side of eseq parameter space true, eseq[2]->min_params() + HomCoord::unitv[1], HomCoord( eseq[2]->min_params().i(), eseq[2]->max_params().j(), eseq[2]->max_params().k() ) ); if( MB_SUCCESS != result ) { std::cout << "Couldn't add shared vsequence to third element sequence in tri-composite 3d eseq." << std::endl; errors++; } // add shared side from first vseq to this eseq result = eseq[2]->add_vsequence( vseq[0], // p1: origin/origin vseq1_minmax[0], eseq2_minmax[0], // p2: j+1/i+1 vseq1_minmax[0] + HomCoord::unitv[1], eseq2_minmax[0] + HomCoord::unitv[0], // p3: arbitrary vseq1_minmax[0], eseq2_minmax[0], // bb input such that we only get one side of eseq parameter space true, eseq2_minmax[0], HomCoord( eseq2_minmax[1].i(), eseq2_minmax[0].j(), eseq2_minmax[1].k() ) ); if( MB_SUCCESS != result ) { std::cout << "Couldn't add left shared vsequence to third element sequence in " "tri-composite 3d eseq." << std::endl; errors++; } // add third vseq to this eseq result = eseq[2]->add_vsequence( vseq[2], // p1: origin/i+1,j+1 vseq2_minmax[0], eseq[2]->min_params() + HomCoord::unitv[0] + HomCoord::unitv[1], // p2: i+1 from p1 vseq2_minmax[0] + HomCoord::unitv[0], eseq[2]->min_params() + HomCoord::unitv[0] * 2 + HomCoord::unitv[1], // p3: j+1 from p1 vseq2_minmax[0] + HomCoord::unitv[1], eseq[2]->min_params() + HomCoord::unitv[0] + HomCoord::unitv[1] * 2 ); if( MB_SUCCESS != result ) { std::cout << "Couldn't add third vseq to third element sequence in tri-composite 3d eseq." << std::endl; errors++; } return errors; }
int create_3dtri_ucd_sequences | ( | Core * | gMB, |
const int | intervals, | ||
EntityHandle * | vstart, | ||
EntityHandle * | estart | ||
) |
Definition at line 350 of file scdseq_timing.cpp.
References moab::ReadUtilIface::get_element_connect(), moab::ReadUtilIface::get_node_coords(), MB_START_ID, MBHEX, and moab::Interface::query_interface().
Referenced by main().
{ ReadUtilIface* readMeshIface; gMB->query_interface( readMeshIface ); int num_elements = intervals * intervals * intervals; int num_verts = ( intervals + 1 ) * ( intervals + 1 ) * ( intervals + 1 ); std::vector< double* > arrays; for( int i = 0; i < 3; i++ ) { readMeshIface->get_node_coords( 3, num_verts, MB_START_ID, vstart[i], arrays ); arrays.clear(); } EntityHandle* conn[3]; // allocate 3 arrays to initialize connectivity data for( int i = 0; i < 3; i++ ) { readMeshIface->get_element_connect( num_elements, 8, MBHEX, 1, estart[i], conn[i] ); // now, initialize connectivity data to what it should be; just fudge for now for( int j = 0; j < num_elements * 8; j++ ) conn[i][j] = vstart[i]; } return 0; }
int main | ( | int | argc, |
char ** | argv | ||
) |
Definition at line 46 of file scdseq_timing.cpp.
References create_3dtri_3_sequences(), create_3dtri_ucd_sequences(), ErrorCode, moab::Core::get_connectivity(), gMB, MB_SUCCESS, and print_time().
{ int errors = 0; // first we need to make a new Core Core* gMB = new Core(); // get the intervals if( argc < 2 ) { std::cout << "Usage: <scdseq_timing> <#intervals> " << std::endl << " where #intervals is the number of intervals on each side of each cube." << std::endl; return 0; } int intervals; sscanf( argv[1], "%d", &intervals ); char do_option[8]; bool do_scd = true, do_ucd = true; if( argc > 2 ) { sscanf( argv[2], "%s", do_option ); if( do_option[0] == 'u' ) do_scd = false; else if( do_option[0] == 's' ) do_ucd = false; else { std::cout << "Didn't understand input; doing both scd and ucd." << std::endl; } } EntityHandle estart[3], vstart[3]; int total_elements = intervals * intervals * intervals; std::vector< EntityHandle > connect; ErrorCode result; clock_t start, stop; float time; char inp[1]; // wait for input to get memory reading std::cout << "Hit any key and return to continue..."; std::cin >> inp; std::cout << std::endl; if( do_scd ) { // create structured mesh errors = create_3dtri_3_sequences( gMB, intervals, vstart, estart ); if( errors != 0 ) { std::cout << "Problem creating structured sequences." << std::endl; return errors; } // get connectivity start = clock(); for( int j = 0; j < 3; j++ ) { for( int i = 0; i < total_elements; i++ ) { result = gMB->get_connectivity( estart[j] + i, connect ); if( MB_SUCCESS != result ) break; connect.clear(); } } stop = clock(); time = static_cast< float >( stop - start ) / CLOCKS_PER_SEC; std::cout << "Time to get connectivity for scd mesh of " << 3 * total_elements << " elements: " << time << " seconds." << std::endl; print_time(); // wait for input to get memory reading std::cout << "Hit any key and return to continue..."; std::cin >> inp; std::cout << std::endl; // destroy this mesh delete gMB; } if( do_ucd ) { // now do the same thing, only unstructured gMB = new Core(); // create the elements errors = create_3dtri_ucd_sequences( gMB, intervals, vstart, estart ); if( errors != 0 ) { std::cout << "Problem creating unstructured sequences." << std::endl; return errors; } // get connectivity std::vector< EntityHandle > connect; start = clock(); for( int j = 0; j < 3; j++ ) { for( int i = 0; i < total_elements; i++ ) { result = gMB->get_connectivity( estart[j] + i, connect ); if( MB_SUCCESS != result ) break; connect.clear(); } } stop = clock(); time = static_cast< float >( stop - start ) / CLOCKS_PER_SEC; std::cout << "Time to get connectivity for ucd mesh of " << 3 * total_elements << " elements: " << time << " seconds." << std::endl; print_time(); // wait for input to get memory reading std::cout << "Hit any key and return to continue..."; std::cin >> inp; std::cout << std::endl; // destroy this mesh delete gMB; } }
void print_time | ( | ) |
Definition at line 381 of file scdseq_timing.cpp.
{ /* struct rusage r_usage; float utime, stime; getrusage(RUSAGE_SELF, &r_usage); if (r_usage.ru_maxrss == 0) { // this machine doesn't return rss - try going to /proc // print the file name to open char file_str[4096], dum_str[4096]; int file_ptr = -1, file_len; file_ptr = open("/proc/self/stat", O_RDONLY); file_len = read(file_ptr, file_str, sizeof(file_str)-1); if (file_len == 0) return; close(file_ptr); file_str[file_len] = '\0'; // read the preceeding fields and the ones we really want... int dum_int; unsigned int dum_uint, vm_size, rss; static int page_size = getpagesize(); int num_fields = sscanf(file_str, "%d " // pid "%s " // comm "%c " // state "%d %d %d %d %d " // ppid, pgrp, session, tty, tpgid "%u %u %u %u %u " // flags, minflt, cminflt, majflt, cmajflt "%d %d %d %d %d %d " // utime, stime, cutime, cstime, counter, priority "%u %u " // timeout, itrealvalue "%d " // starttime "%u %u", // vsize, rss &dum_int, dum_str, dum_str, &dum_int, &dum_int, &dum_int, &dum_int, &dum_int, &dum_uint, &dum_uint, &dum_uint, &dum_uint, &dum_uint, &dum_int, &dum_int, &dum_int, &dum_int, &dum_int, &dum_int, &dum_uint, &dum_uint, &dum_int, &vm_size, &rss); if (num_fields == 24) { r_usage.ru_maxrss = rss/page_size; r_usage.ru_idrss = vm_size/page_size; } } utime = (float)r_usage.ru_utime.tv_sec + ((float)r_usage.ru_utime.tv_usec/1.e6); stime = (float)r_usage.ru_stime.tv_sec + ((float)r_usage.ru_stime.tv_usec/1.e6); static int pagesize = getpagesize(); std::cout << "Execution time = " << utime+stime << ", max RSS = " << r_usage.ru_maxrss*pagesize << " bytes." << std::endl; */ }