68 int err = MPI_Init( &argc, &argv );
73 std::cerr <<
"Usage: ";
74 std::cerr << argv[0] <<
" <nfiles> <fname1> ... <fnamen> <norm_tag> <tag_select_opts> <file_opts>" << std::endl;
75 std::cerr <<
"nfiles : number of mesh files" << std::endl;
76 std::cerr <<
"fname1...fnamen : mesh files" << std::endl;
77 std::cerr <<
"norm_tag : name of tag to normalize across meshes" << std::endl;
78 std::cerr <<
"tag_select_opts : quoted string of tags and values for subset selection, "
79 "e.g. \"TAG1=VAL1;TAG2=VAL2;TAG3;TAG4\""
81 std::cerr <<
"file_opts : quoted string of parallel file read options, e.g. "
82 "\"OPTION1=VALUE1;OPTION2;OPTION3=VALUE3\""
94 err = MPI_Comm_size( MPI_COMM_WORLD, &nprocs );
95 assert( MPI_SUCCESS == err );
96 err = MPI_Comm_rank( MPI_COMM_WORLD, &rank );
97 assert( MPI_SUCCESS == err );
100 std::stringstream fname;
101 fname << argv[0] << rank <<
".out";
102 if( !std::freopen( fname.str().c_str(),
"a", stdout ) )
return -1;
103 if( !std::freopen( fname.str().c_str(),
"a", stderr ) )
return -1;
109 std::cerr <<
"MOAB constructor failed" << std::endl;
114 std::cout <<
"Getting options..." << std::endl;
115 std::vector< const char* > filenames;
116 std::vector< const char* > tagNames;
117 std::vector< const char* > tagValues;
118 std::string normTag, fileOpts;
119 get_file_options( argc, argv, filenames, normTag, tagNames, tagValues, fileOpts, &err );
123 std::cout <<
" Input Parameters - " << std::endl;
124 std::cout <<
" Filenames: ";
125 for( std::vector< const char* >::iterator it = filenames.begin(); it != filenames.end(); ++it )
126 std::cout << *it <<
" ";
127 std::cout << std::endl;
128 std::cout <<
" Norm Tag: " << normTag << std::endl;
129 std::cout <<
" Selection Data: NumNames=" << tagNames.size() <<
" NumValues=" << tagValues.size() << std::endl;
130 std::cout <<
" TagNames TagValues " << std::endl;
131 std::cout <<
" -------------------- --------------------" << std::endl;
132 std::vector< const char* >::iterator nameIt = tagNames.begin();
133 std::vector< const char* >::iterator valIt = tagValues.begin();
134 std::cout << std::setiosflags( std::ios::left );
135 for( ; nameIt != tagNames.end(); ++nameIt )
137 std::cout <<
" " << std::setw( 20 ) << *nameIt;
140 std::cout <<
" " << std::setw( 20 ) << *( (
int*)( *valIt ) ) << std::endl;
144 std::cout <<
" NULL " << std::endl;
146 std::cout << std::resetiosflags( std::ios::left );
147 std::cout <<
" File Options: " << fileOpts << std::endl;
150 std::cout <<
"Reading mesh file(s)..." << std::endl;
151 std::vector< ParallelComm* > pcs( filenames.size() );
152 std::vector< ReadParallel* > rps( filenames.size() );
155 std::vector< EntityHandle > roots( filenames.size() );
158 for(
unsigned int i = 0; i < filenames.size(); i++ )
166 result = rps[i]->load_file( filenames[i], &roots[i],
FileOptions( fileOpts.c_str() ) );
172 debugOut.set_rank( rank );
173 debugOut.set_verbosity( 10 );
176 for(
unsigned int k = 0; k < filenames.size(); k++ )
182 debugOut.print( 2,
"Root set entities: ", rootRg );
186 pcs[k]->get_part_entities( partRg );
187 debugOut.
print( 2,
"Partition entities: ", partRg );
192 Range src_elems, targ_elems;
195 std::cout <<
"********** Create Coupler **********" << std::endl;
197 std::cout <<
"Creating Coupler..." << std::endl;
198 Coupler mbc( mbi, pcs[0], src_elems, 0 );
201 std::cout <<
"Getting tag handles..." << std::endl;
202 int numTagNames = tagNames.size();
204 std::vector< Tag > tagHandles( numTagNames );
206 while( iTags < numTagNames )
208 std::cout <<
"Getting handle for " << tagNames[iTags] << std::endl;
209 result = mbi->
tag_get_handle( tagNames[iTags], tagHandles[iTags] );
215 std::cout <<
"********** Test create_tuples **********" << std::endl;
219 Range entsets1, entsets2;
221 (
const void*
const*)&tagValues[0], tagHandles.size(), entsets1,
222 Interface::INTERSECT );
223 MB_CHK_SET_ERR( result,
"sets: get_entities_by_type_and_tag failed on Mesh 1." );
226 std::cout <<
"Creating tuples for mesh 1..." << std::endl;
228 err = mbc.create_tuples( entsets1, &tagHandles[0], tagHandles.size(), &m1TagTuples );
231 std::cout <<
" create_tuples returned" << std::endl;
235 (
const void*
const*)&tagValues[0], tagHandles.size(), entsets2,
236 Interface::INTERSECT );
237 MB_CHK_SET_ERR( result,
"sets: get_entities_by_type_and_tag failed on Mesh 2." );
239 std::cout <<
"Creating tuples for mesh 2..." << std::endl;
241 err = mbc.create_tuples( entsets2, (
Tag*)( &tagHandles[0] ), tagHandles.size(), &m2TagTuples );
244 std::cout <<
" create_tuples returned" << std::endl;
248 std::cout <<
"********** Test consolidate_tuples **********" << std::endl;
251 std::cout <<
"Consolidating tuple_lists for Mesh 1 and Mesh 2..." << std::endl;
254 tplp_arr[0] = m1TagTuples;
255 tplp_arr[1] = m2TagTuples;
257 err = mbc.consolidate_tuples( tplp_arr, 2, &unique_tpl );
259 std::cout <<
" consolidate_tuples returned" << std::endl;
264 std::cout <<
"********** Test get_matching_entities **********" << std::endl;
265 std::vector< std::vector< EntityHandle > > m1EntitySets;
266 std::vector< std::vector< EntityHandle > > m1EntityGroups;
267 std::vector< std::vector< EntityHandle > > m2EntitySets;
268 std::vector< std::vector< EntityHandle > > m2EntityGroups;
271 std::cout <<
"Get matching entities for mesh 1..." << std::endl;
272 err = mbc.get_matching_entities( roots[0], &tagHandles[0], &tagValues[0], tagHandles.size(), &m1EntitySets,
276 std::cout <<
" get_matching_entities returned " << m1EntityGroups.size() <<
" entity groups" << std::endl;
279 std::vector< std::vector< EntityHandle > >::iterator iter_esi;
280 std::vector< std::vector< EntityHandle > >::iterator iter_egi;
281 std::vector< EntityHandle >::iterator iter_esj;
282 std::vector< EntityHandle >::iterator iter_egj;
285 for( iter_egi = m1EntityGroups.begin(), iter_esi = m1EntitySets.begin(), icnt = 1;
286 ( iter_egi != m1EntityGroups.end() ) && ( iter_esi != m1EntitySets.end() ); ++iter_egi, ++iter_esi, icnt++ )
288 std::cout <<
" EntityGroup(" << icnt <<
") = ";
291 for( iter_egj = ( *iter_egi ).begin(); iter_egj != ( *iter_egi ).end(); ++iter_egj )
293 debugOut.print( 2,
"Mesh1 matching Entities: ", entSetRg );
296 std::cout <<
" EntitySet(" << icnt <<
") = ";
299 for( iter_esj = ( *iter_esi ).begin(); iter_esj != ( *iter_esi ).end(); ++iter_esj )
301 debugOut.print( 2,
"Mesh1 matching EntitySets: ", entSetRg );
306 std::cout <<
"Get matching entities for mesh 2..." << std::endl;
307 err = mbc.get_matching_entities( roots[1], &tagHandles[0], &tagValues[0], tagHandles.size(), &m2EntitySets,
311 std::cout <<
" get_matching_entities returned " << m2EntityGroups.size() <<
" entity groups" << std::endl;
312 for( iter_egi = m2EntityGroups.begin(), iter_esi = m2EntitySets.begin(), icnt = 1;
313 ( iter_egi != m2EntityGroups.end() ) && ( iter_esi != m2EntitySets.end() ); ++iter_egi, ++iter_esi, icnt++ )
315 std::cout <<
" EntityGroup(" << icnt <<
") = ";
318 for( iter_egj = ( *iter_egi ).begin(); iter_egj != ( *iter_egi ).end(); ++iter_egj )
320 debugOut.print( 2,
"Mesh2 matching Entities: ", entSetRg );
323 std::cout <<
" EntitySet(" << icnt <<
") = ";
326 for( iter_esj = ( *iter_esi ).begin(); iter_esj != ( *iter_esi ).end(); ++iter_esj )
328 debugOut.print( 2,
"Mesh2 matching EntitySets: ", entSetRg );
335 std::cout <<
"********** Test print_tuples **********" << std::endl;
337 std::cout <<
"Testing print_tuples..." << std::endl;
340 int num_ints = 3, num_longs = 2, num_ulongs = 4, num_reals = 6, num_rows = 10;
342 std::cout <<
" print of test_tuples zero init..." << std::endl;
349 std::cout <<
" print of test_tuples after setting n to 10..." << std::endl;
350 test_tuple.
set_n( 10 );
353 test_tuple.
initialize( num_ints, num_longs, num_ulongs, num_reals, num_rows );
354 std::cout <<
" print of test_tuples after init..." << std::endl;
357 std::cout <<
" print of test_tuples after setting n to 10..." << std::endl;
358 test_tuple.
set_n( 10 );
361 for(
int i = 0; i < num_rows; i++ )
364 for( j = 0; j < num_ints; j++ )
365 test_tuple.
vi_wr[i * num_ints + j] = (
int)( ( j + 1 ) * ( i + 1 ) );
367 for( j = 0; j < num_longs; j++ )
368 test_tuple.
vl_wr[i * num_longs + j] = (
int)( ( j + 1 ) * ( i + 1 ) );
370 for( j = 0; j < num_ulongs; j++ )
371 test_tuple.
vul_wr[i * num_ulongs + j] = (
int)( ( j + 1 ) * ( i + 1 ) );
373 for( j = 0; j < num_reals; j++ )
374 test_tuple.
vr_wr[i * num_reals + j] = (
int)( ( j + 1 ) * ( i + 1 ) + ( j * 0.01 ) );
376 std::cout <<
" print of test_tuples after filling with data..." << std::endl;
380 std::cout <<
"********** Test pack_tuples and unpack_tuples **********" << std::endl;
389 err = MPI_Bcast( &buf_sz, 1, MPI_INT, 0, MPI_COMM_WORLD );
391 if( err != MPI_SUCCESS )
393 std::cerr <<
"MPI_Bcast of buffer size failed" << std::endl;
400 mp_buf = malloc( buf_sz *
sizeof(
uint ) );
403 err = MPI_Bcast( mp_buf, buf_sz *
sizeof(
uint ), MPI_UNSIGNED_CHAR, 0, MPI_COMM_WORLD );
404 if( err != MPI_SUCCESS )
406 std::cerr <<
"MPI_Bcast of buffer failed" << std::endl;
413 std::cout <<
" print of rcv_tuples after unpacking from MPI_Bcast..." << std::endl;
421 std::cout <<
"********** Test get_group_integ_vals **********" << std::endl;
422 std::cout <<
"Get group integrated field values..." << std::endl;
425 std::cout <<
" print vertex field values first:" << std::endl;
432 std::cout <<
" Original entity vertex field values (mesh 1): " << std::endl;
436 std::cout <<
" Original entity vertex field values (mesh 2): " << std::endl;
440 std::vector< double >::iterator iter_ivals;
442 std::cout <<
"Get group integrated field values for mesh 1..." << std::endl;
443 std::vector< double > m1IntegVals( m1EntityGroups.size() );
444 err = mbc.get_group_integ_vals( m1EntityGroups, m1IntegVals, normTag.c_str(), 4, integ_type );
446 std::cout <<
"Mesh 1 integrated field values(" << m1IntegVals.size() <<
"): ";
447 for( iter_ivals = m1IntegVals.begin(); iter_ivals != m1IntegVals.end(); ++iter_ivals )
449 std::cout << ( *iter_ivals ) <<
" ";
451 std::cout << std::endl;
453 std::cout <<
"Get group integrated field values for mesh 2..." << std::endl;
454 std::vector< double > m2IntegVals( m2EntityGroups.size() );
455 err = mbc.get_group_integ_vals( m2EntityGroups, m2IntegVals, normTag.c_str(), 4, integ_type );
457 std::cout <<
"Mesh 2 integrated field values(" << m2IntegVals.size() <<
"): ";
458 for( iter_ivals = m2IntegVals.begin(); iter_ivals != m2IntegVals.end(); ++iter_ivals )
460 std::cout << ( *iter_ivals ) <<
" ";
462 std::cout << std::endl;
465 std::cout <<
"********** Test apply_group_norm_factors **********" << std::endl;
468 for(
unsigned int i = 0; i < m1IntegVals.size(); i++ )
470 val = m1IntegVals[i];
471 m1IntegVals[i] = 1 / val;
474 for(
unsigned int i = 0; i < m2IntegVals.size(); i++ )
476 val = m2IntegVals[i];
477 m2IntegVals[i] = 1 / val;
480 std::cout <<
"Mesh 1 norm factors(" << m1IntegVals.size() <<
"): ";
481 for( iter_ivals = m1IntegVals.begin(); iter_ivals != m1IntegVals.end(); ++iter_ivals )
483 std::cout << ( *iter_ivals ) <<
" ";
485 std::cout << std::endl;
487 std::cout <<
"Mesh 2 norm factors(" << m2IntegVals.size() <<
"): ";
488 for( iter_ivals = m2IntegVals.begin(); iter_ivals != m2IntegVals.end(); ++iter_ivals )
490 std::cout << ( *iter_ivals ) <<
" ";
492 std::cout << std::endl;
495 err = mbc.apply_group_norm_factor( m1EntitySets, m1IntegVals, normTag.c_str(), integ_type );
498 err = mbc.apply_group_norm_factor( m2EntitySets, m2IntegVals, normTag.c_str(), integ_type );
504 std::string normFactor = normTag +
"_normf";
505 result = mbi->
tag_get_handle( normFactor.c_str(), norm_factor_hdl );
506 MB_CHK_SET_ERR( result,
"Failed to get norm factor tag handle." );
509 std::cout <<
"Mesh 1 norm factors per EntitySet...";
510 for( iter_esi = m1EntitySets.begin(); iter_esi != m1EntitySets.end(); ++iter_esi )
512 for( iter_esj = ( *iter_esi ).begin(); iter_esj != ( *iter_esi ).end(); ++iter_esj )
516 result = mbi->
tag_get_data( norm_factor_hdl, &eh, 1, &data );
518 std::cout << data <<
", ";
521 std::cout << std::endl;
524 std::cout <<
"Mesh 2 norm factors per EntitySet...";
525 for( iter_esi = m2EntitySets.begin(); iter_esi != m2EntitySets.end(); ++iter_esi )
527 for( iter_esj = ( *iter_esi ).begin(); iter_esj != ( *iter_esi ).end(); ++iter_esj )
531 result = mbi->
tag_get_data( norm_factor_hdl, &eh, 1, &data );
533 std::cout << data <<
", ";
536 std::cout << std::endl;
539 std::cout <<
"********** Test normalize_subset **********" << std::endl;
541 std::cout <<
"Running Coupler::normalize_subset() on mesh 1" << std::endl;
542 err = mbc.normalize_subset( (
EntityHandle)roots[0], normTag.c_str(), &tagNames[0], numTagNames, &tagValues[0],
548 std::cout <<
"Mesh 1 norm factors per EntitySet...";
549 for( iter_esi = m1EntitySets.begin(); iter_esi != m1EntitySets.end(); ++iter_esi )
551 for( iter_esj = ( *iter_esi ).begin(); iter_esj != ( *iter_esi ).end(); ++iter_esj )
555 result = mbi->
tag_get_data( norm_factor_hdl, &eh, 1, &data );
557 std::cout << data <<
", ";
560 std::cout << std::endl;
562 std::cout <<
"Running Coupler::normalize_subset() on mesh 2" << std::endl;
563 err = mbc.normalize_subset( (
EntityHandle)roots[1], normTag.c_str(), &tagNames[0], numTagNames, &tagValues[0],
568 std::cout <<
"Mesh 2 norm factors per EntitySet...";
569 for( iter_esi = m2EntitySets.begin(); iter_esi != m2EntitySets.end(); ++iter_esi )
571 for( iter_esj = ( *iter_esi ).begin(); iter_esj != ( *iter_esi ).end(); ++iter_esj )
575 result = mbi->
tag_get_data( norm_factor_hdl, &eh, 1, &data );
578 std::cout << data <<
", ";
581 std::cout << std::endl;
584 std::cout <<
"********** ssn_test DONE! **********" << std::endl;