16 #include "../tools/mbcoupler/ElemUtil.hpp"
18 #define MBI mb_instance()
37 int main(
int argc,
char** argv )
47 result =
MCNP->initialize_tags();
56 std::cout <<
"Failure reading MCNP file!" << std::endl;
78 std::cout << std::endl <<
"Read in mesh from h5m file." << std::endl << std::endl;
79 std::cout <<
"Querying mesh file..." << std::endl;
83 std::cout <<
"Failure reading h5m file!" << std::endl;
84 std::cerr <<
"Error code: " <<
MBI->get_error_string( MBresult ) <<
" (" << MBresult <<
")" << std::endl;
87 std::cerr <<
"Error message: " << message << std::endl;
97 std::cout <<
"Building KD-Tree..." << std::endl;
106 std::cout <<
"KD-Tree has been built successfully!" << std::endl << std::endl;
107 MBresult =
MBI->write_mesh( (
MCNP->MCNP_filename +
".h5m" ).c_str() );
109 std::cout <<
"Querying mesh file..." << std::endl;
113 std::cout <<
"Error building KD-Tree!" << std::endl << std::endl;
114 std::cerr <<
"Error code: " <<
MBI->get_error_string( MBresult ) <<
" (" << MBresult <<
")" << std::endl;
117 std::cerr <<
"Error message: " << message << std::endl;
125 MBresult =
MBI->tag_get_data(
coord_tag, &root, 1, &coord_sys );
133 std::ifstream cadfile;
134 std::ofstream outfile;
147 double* cfd_coords = NULL;
154 cadfile.getline( line, 10000 );
155 cadfile.getline( line, 10000 );
156 result =
next_int( line, num_pts, p );
164 assert( 0 != meshset );
167 MBresult =
MBI->get_entities_by_type( meshset,
moab::MBVERTEX, cfd_verts,
true );
169 num_pts = cfd_verts.
size();
171 cfd_coords =
new double[3 * num_pts];
172 MBresult =
MBI->get_coords( cfd_verts, cfd_coords );
175 cfd_iter = cfd_verts.
begin();
183 std::cout << std::endl <<
"Read in mesh with query points." << std::endl << std::endl;
187 double transformed_pt[3];
196 std::vector< moab::EntityHandle > verts;
202 std::vector< double > coords;
204 double tal_sum = 0.0, err_sum = 0.0, tal_sum_sqr = 0.0, err_sum_sqr = 0.0;
209 for(
unsigned int i = 0; i < (
unsigned int)num_pts; i++ )
218 cadfile.getline( line, 10000 );
220 nl = std::strtol( line, &ctmp, 10 );
221 n = (
unsigned int)nl;
222 testpt[0] = std::strtod( ctmp + 1, &ctmp );
223 testpt[1] = std::strtod( ctmp + 1, &ctmp );
224 testpt[2] = std::strtod( ctmp + 1, NULL );
228 testpt[0] = cfd_coords[3 * i];
229 testpt[1] = cfd_coords[3 * i + 1];
230 testpt[2] = cfd_coords[3 * i + 2];
234 result =
MCNP->transform_point( testpt, transformed_pt, coord_sys, rmatrix );
236 testvc[0] = transformed_pt[0];
237 testvc[1] = transformed_pt[1];
238 testvc[2] = transformed_pt[2];
242 MBresult = kdtree.
point_search( transformed_pt, tree_node );
245 double x = 0.0, y = 0.0, z = 0.0;
254 x = testvc[0] * cos( 2 * M_PI * testvc[2] );
255 y = testvc[0] * sin( 2 * M_PI * testvc[2] );
260 std::cout <<
"MOAB WARNING: Unhandled error code during point search in KdTree, "
262 << MBresult <<
" and Coord xyz=" << x <<
" " << y <<
" " << z << std::endl;
264 std::cout <<
"No leaf found, MCNP coord xyz=" << x <<
" " << y <<
" " << z << std::endl;
270 MBresult =
MBI->get_entities_by_type( tree_node,
moab::MBHEX, range );
282 MBresult =
MBI->get_connectivity( *rit, connect, num_connect,
true );
285 coords.resize( 3 * num_connect );
286 MBresult =
MBI->get_coords( connect, num_connect, &coords[0] );
289 for(
unsigned int j = 0; j < (
unsigned int)num_connect; j++ )
291 hexverts[j][0] = coords[3 * j];
292 hexverts[j][1] = coords[3 * j + 1];
293 hexverts[j][2] = coords[3 * j + 2];
298 MBresult =
MBI->tag_get_data(
MCNP->tally_tag, &( *rit ), 1, &taldata );
300 MBresult =
MBI->tag_get_data(
MCNP->relerr_tag, &( *rit ), 1, &errdata );
303 outfile << n <<
"," << testpt[0] <<
"," << testpt[1] <<
"," << testpt[2] <<
"," << taldata <<
","
304 << errdata << std::endl;
317 tal_sum = tal_sum + taldata;
318 err_sum = err_sum + errdata;
319 tal_sum_sqr = tal_sum_sqr + taldata * taldata;
320 err_sum_sqr = err_sum_sqr + errdata * errdata;
330 std::cout << n <<
" " << testvc << std::endl;
340 std::cout <<
"Success! " << elems_read <<
" elements interpolated." << std::endl << std::endl;
344 std::cout <<
"Failure during query! " << elems_read <<
" elements interpolated." << std::endl << std::endl;
347 double tal_std_dev = sqrt( ( 1.0 / elems_read ) * ( tal_sum_sqr - ( 1.0 / elems_read ) * tal_sum * tal_sum ) );
348 double err_std_dev = sqrt( ( 1.0 / elems_read ) * ( err_sum_sqr - ( 1.0 / elems_read ) * err_sum * err_sum ) );
350 std::cout <<
"Tally Mean: " << tal_sum / elems_read << std::endl;
351 std::cout <<
"Tally Standard Deviation: " << tal_std_dev << std::endl;
352 std::cout <<
"Error Mean: " << err_sum / elems_read << std::endl;
353 std::cout <<
"Error Standard Deviation: " << err_std_dev << std::endl;
360 MBresult =
MBI->write_mesh( ( out_mesh_fname +
".h5m" ).c_str(), &meshset, 1 );
365 std::cout <<
"Time to read in file: " << (double)
load_time / CLOCKS_PER_SEC << std::endl;
366 std::cout <<
"Time to build kd-tree: " << (double)
build_time / CLOCKS_PER_SEC << std::endl;
367 std::cout <<
"Time to interpolate data: " << (double)
interp_time / CLOCKS_PER_SEC << std::endl;
379 std::cout <<
"Source and Target mesh filenames NOT specified!";
380 std::cout << std::endl;
388 unsigned int itmp = str.find(
".h5m" );
389 if( ( itmp > 0 ) && ( itmp < str.length() ) )
396 result =
MCNP->set_filename( str );
403 itmp = str.find(
".qnv" );
404 if( ( itmp > 0 ) && ( itmp < str.length() ) )
read_qnv =
true;
416 unsigned int slen = s.length();
419 for(
unsigned int i = p; i < slen; i++ )
421 if( ( ( s[i] >= 48 ) && ( s[i] <= 57 ) ) || ( s[i] == 45 ) )
424 j = s.find(
",", i );
425 if( j > slen ) j = slen;
427 d = std::atof( s.substr( i, j - i ).c_str() );
440 unsigned int slen = s.length();
443 for(
unsigned int i = p; i < slen; i++ )
445 if( ( ( s[i] >= 48 ) && ( s[i] <= 57 ) ) || ( s[i] == 45 ) )
448 j = s.find(
",", i );
449 if( j > slen ) j = slen;
451 k = std::atoi( s.substr( i, j - i ).c_str() );