1
2 #include "moab/ParallelComm.hpp"
3 #include "MBParallelConventions.h"
4 #include "moab/Core.hpp"
5 #include "moab/FileOptions.hpp"
6 #include "ReadParallel.hpp"
7 #include "Coupler.hpp"
8 #include "DebugOutput.hpp"
9 #include "ElemUtil.hpp"
10 #include <iostream>
11 #include <iomanip>
12 #include <sstream>
13 #include <cstring>
14 #include <cstdlib>
15 extern "C" {
16 #include "moab/FindPtFuncs.h"
17 }
18 #include "moab/TupleList.hpp"
19 #include "moab/gs.hpp"
20 #include "moab/Types.hpp"
21 #ifndef IS_BUILDING_MB
22 #define IS_BUILDING_MB
23 #include "Internals.hpp"
24 #undef IS_BUILDING_MB
25 #else
26 #include "Internals.hpp"
27 #endif
28
29 using namespace moab;
30
31 bool debug = true;
32
33
34 void get_file_options( int argc,
35 char** argv,
36 std::vector< const char* >& filenames,
37 std::string& norm_tag,
38 std::vector< const char* >& tag_names,
39 std::vector< const char* >& tag_values,
40 std::string& file_opts,
41 int* err );
42
43 void print_tuples( TupleList* tlp );
44
45 int print_vertex_fields( Interface* mbi,
46 std::vector< std::vector< EntityHandle > >& groups,
47 Tag& norm_hdl,
48 Coupler::IntegType integ_type );
49
50 double const_field( double x, double y, double z );
51 double field_1( double x, double y, double z );
52 double field_2( double x, double y, double z );
53 double field_3( double x, double y, double z );
54 double physField( double x, double y, double z );
55
56 ErrorCode integrate_scalar_field_test();
57 int pack_tuples( TupleList* tl, void** ptr );
58 void unpack_tuples( void* ptr, TupleList** tlp );
59
60
61
62
63 int main( int argc, char** argv )
64 {
65
66
67
68 int err = MPI_Init( &argc, &argv );
69
70
71 if( argc < 3 )
72 {
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\""
80 << std::endl;
81 std::cerr << "file_opts : quoted string of parallel file read options, e.g. "
82 "\"OPTION1=VALUE1;OPTION2;OPTION3=VALUE3\""
83 << std::endl;
84
85 err = integrate_scalar_field_test();MB_CHK_SET_ERR( (ErrorCode)err, "Integrate scalar field test failed" );
86
87 err = MPI_Finalize();
88
89 return err;
90 }
91
92 int nprocs, rank;
93 err = MPI_Comm_size( MPI_COMM_WORLD, &nprocs );
94 assert( MPI_SUCCESS == err );
95 err = MPI_Comm_rank( MPI_COMM_WORLD, &rank );
96 assert( MPI_SUCCESS == err );
97
98
99 std::stringstream fname;
100 fname << argv[0] << rank << ".out";
101 if( !std::freopen( fname.str().c_str(), "a", stdout ) ) return -1;
102 if( !std::freopen( fname.str().c_str(), "a", stderr ) ) return -1;
103
104
105 Interface* mbi = new Core();
106 if( NULL == mbi )
107 {
108 std::cerr << "MOAB constructor failed" << std::endl;
109 return 1;
110 }
111
112
113 std::cout << "Getting options..." << std::endl;
114 std::vector< const char* > filenames;
115 std::vector< const char* > tagNames;
116 std::vector< const char* > tagValues;
117 std::string normTag, fileOpts;
118 get_file_options( argc, argv, filenames, normTag, tagNames, tagValues, fileOpts, &err );MB_CHK_SET_ERR( (ErrorCode)err, "get_file_options failed" );
119
120
121 std::cout << " Input Parameters - " << std::endl;
122 std::cout << " Filenames: ";
123 for( std::vector< const char* >::iterator it = filenames.begin(); it != filenames.end(); ++it )
124 std::cout << *it << " ";
125 std::cout << std::endl;
126 std::cout << " Norm Tag: " << normTag << std::endl;
127 std::cout << " Selection Data: NumNames=" << tagNames.size() << " NumValues=" << tagValues.size() << std::endl;
128 std::cout << " TagNames TagValues " << std::endl;
129 std::cout << " -------------------- --------------------" << std::endl;
130 std::vector< const char* >::iterator nameIt = tagNames.begin();
131 std::vector< const char* >::iterator valIt = tagValues.begin();
132 std::cout << std::setiosflags( std::ios::left );
133 for( ; nameIt != tagNames.end(); ++nameIt )
134 {
135 std::cout << " " << std::setw( 20 ) << *nameIt;
136 if( *valIt != 0 )
137 {
138 std::cout << " " << std::setw( 20 ) << *( (int*)( *valIt ) ) << std::endl;
139 ++valIt;
140 }
141 else
142 std::cout << " NULL " << std::endl;
143 }
144 std::cout << std::resetiosflags( std::ios::left );
145 std::cout << " File Options: " << fileOpts << std::endl;
146
147
148 std::cout << "Reading mesh file(s)..." << std::endl;
149 std::vector< ParallelComm* > pcs( filenames.size() );
150 std::vector< ReadParallel* > rps( filenames.size() );
151
152
153 std::vector< EntityHandle > roots( filenames.size() );
154
155 ErrorCode result;
156 for( unsigned int i = 0; i < filenames.size(); i++ )
157 {
158 pcs[i] = new ParallelComm( mbi, MPI_COMM_WORLD );
159 rps[i] = new ReadParallel( mbi, pcs[i] );
160
161 result = mbi->create_meshset( MESHSET_SET, roots[i] );
162
163 MB_CHK_SET_ERR( result, "Creating root set failed" );
164 result = rps[i]->load_file( filenames[i], &roots[i], FileOptions( fileOpts.c_str() ) );MB_CHK_SET_ERR( result, "load_file failed" );
165 }
166
167
168 DebugOutput debugOut( "ssn_test-", std::cerr );
169 debugOut.set_rank( rank );
170 debugOut.set_verbosity( 10 );
171
172
173 for( unsigned int k = 0; k < filenames.size(); k++ )
174 {
175
176 Range rootRg;
177 result = mbi->get_entities_by_handle( roots[k], rootRg );MB_CHK_SET_ERR( result, "can't get entities" );
178 debugOut.print( 2, "Root set entities: ", rootRg );
179 rootRg.clear();
180
181 Range partRg;
182 pcs[k]->get_part_entities( partRg );
183 debugOut.print( 2, "Partition entities: ", partRg );
184 partRg.clear();
185 }
186
187
188 Range src_elems, targ_elems;
189
190
191 std::cout << "********** Create Coupler **********" << std::endl;
192
193 std::cout << "Creating Coupler..." << std::endl;
194 Coupler mbc( mbi, pcs[0], src_elems, 0 );
195
196
197 std::cout << "Getting tag handles..." << std::endl;
198 int numTagNames = tagNames.size();
199
200 std::vector< Tag > tagHandles( numTagNames );
201 int iTags = 0;
202 while( iTags < numTagNames )
203 {
204 std::cout << "Getting handle for " << tagNames[iTags] << std::endl;
205 result = mbi->tag_get_handle( tagNames[iTags], tagHandles[iTags] );MB_CHK_SET_ERR( result, "Retrieving tag handles failed" );
206 iTags++;
207 }
208
209
210 std::cout << "********** Test create_tuples **********" << std::endl;
211
212 {
213
214 Range entsets1, entsets2;
215 result = mbi->get_entities_by_type_and_tag( roots[0], MBENTITYSET, &tagHandles[0],
216 (const void* const*)&tagValues[0], tagHandles.size(), entsets1,
217 Interface::INTERSECT );
218 MB_CHK_SET_ERR( result, "sets: get_entities_by_type_and_tag failed on Mesh 1." );
219
220
221 std::cout << "Creating tuples for mesh 1..." << std::endl;
222 TupleList* m1TagTuples = NULL;
223 err = mbc.create_tuples( entsets1, &tagHandles[0], tagHandles.size(), &m1TagTuples );MB_CHK_SET_ERR( (ErrorCode)err, "create_tuples failed" );
224
225 std::cout << " create_tuples returned" << std::endl;
226 print_tuples( m1TagTuples );
227
228 result = mbi->get_entities_by_type_and_tag( roots[1], MBENTITYSET, &tagHandles[0],
229 (const void* const*)&tagValues[0], tagHandles.size(), entsets2,
230 Interface::INTERSECT );
231 MB_CHK_SET_ERR( result, "sets: get_entities_by_type_and_tag failed on Mesh 2." );
232
233 std::cout << "Creating tuples for mesh 2..." << std::endl;
234 TupleList* m2TagTuples = NULL;
235 err = mbc.create_tuples( entsets2, (Tag*)( &tagHandles[0] ), tagHandles.size(), &m2TagTuples );MB_CHK_SET_ERR( (ErrorCode)err, "create_tuples failed" );
236
237 std::cout << " create_tuples returned" << std::endl;
238 print_tuples( m2TagTuples );
239
240
241 std::cout << "********** Test consolidate_tuples **********" << std::endl;
242
243
244 std::cout << "Consolidating tuple_lists for Mesh 1 and Mesh 2..." << std::endl;
245 TupleList** tplp_arr = (TupleList**)malloc( 2 * sizeof( TupleList* ) );
246 TupleList* unique_tpl = NULL;
247 tplp_arr[0] = m1TagTuples;
248 tplp_arr[1] = m2TagTuples;
249
250 err = mbc.consolidate_tuples( tplp_arr, 2, &unique_tpl );MB_CHK_SET_ERR( (ErrorCode)err, "consolidate_tuples failed" );
251 std::cout << " consolidate_tuples returned" << std::endl;
252 print_tuples( unique_tpl );
253 }
254
255
256 std::cout << "********** Test get_matching_entities **********" << std::endl;
257 std::vector< std::vector< EntityHandle > > m1EntitySets;
258 std::vector< std::vector< EntityHandle > > m1EntityGroups;
259 std::vector< std::vector< EntityHandle > > m2EntitySets;
260 std::vector< std::vector< EntityHandle > > m2EntityGroups;
261
262
263 std::cout << "Get matching entities for mesh 1..." << std::endl;
264 err = mbc.get_matching_entities( roots[0], &tagHandles[0], &tagValues[0], tagHandles.size(), &m1EntitySets,
265 &m1EntityGroups );MB_CHK_SET_ERR( (ErrorCode)err, "get_matching_entities failed" );
266
267 std::cout << " get_matching_entities returned " << m1EntityGroups.size() << " entity groups" << std::endl;
268
269
270 std::vector< std::vector< EntityHandle > >::iterator iter_esi;
271 std::vector< std::vector< EntityHandle > >::iterator iter_egi;
272 std::vector< EntityHandle >::iterator iter_esj;
273 std::vector< EntityHandle >::iterator iter_egj;
274 Range entSetRg;
275 int icnt;
276 for( iter_egi = m1EntityGroups.begin(), iter_esi = m1EntitySets.begin(), icnt = 1;
277 ( iter_egi != m1EntityGroups.end() ) && ( iter_esi != m1EntitySets.end() ); ++iter_egi, ++iter_esi, icnt++ )
278 {
279 std::cout << " EntityGroup(" << icnt << ") = ";
280 std::cout.flush();
281 entSetRg.clear();
282 for( iter_egj = ( *iter_egi ).begin(); iter_egj != ( *iter_egi ).end(); ++iter_egj )
283 entSetRg.insert( (EntityHandle)*iter_egj );
284 debugOut.print( 2, "Mesh1 matching Entities: ", entSetRg );
285 std::cout.flush();
286
287 std::cout << " EntitySet(" << icnt << ") = ";
288 std::cout.flush();
289 entSetRg.clear();
290 for( iter_esj = ( *iter_esi ).begin(); iter_esj != ( *iter_esi ).end(); ++iter_esj )
291 entSetRg.insert( (EntityHandle)*iter_esj );
292 debugOut.print( 2, "Mesh1 matching EntitySets: ", entSetRg );
293 std::cout.flush();
294 }
295
296
297 std::cout << "Get matching entities for mesh 2..." << std::endl;
298 err = mbc.get_matching_entities( roots[1], &tagHandles[0], &tagValues[0], tagHandles.size(), &m2EntitySets,
299 &m2EntityGroups );MB_CHK_SET_ERR( (ErrorCode)err, "get_matching_entities failed" );
300
301 std::cout << " get_matching_entities returned " << m2EntityGroups.size() << " entity groups" << std::endl;
302 for( iter_egi = m2EntityGroups.begin(), iter_esi = m2EntitySets.begin(), icnt = 1;
303 ( iter_egi != m2EntityGroups.end() ) && ( iter_esi != m2EntitySets.end() ); ++iter_egi, ++iter_esi, icnt++ )
304 {
305 std::cout << " EntityGroup(" << icnt << ") = ";
306 std::cout.flush();
307 entSetRg.clear();
308 for( iter_egj = ( *iter_egi ).begin(); iter_egj != ( *iter_egi ).end(); ++iter_egj )
309 entSetRg.insert( (EntityHandle)*iter_egj );
310 debugOut.print( 2, "Mesh2 matching Entities: ", entSetRg );
311 std::cout.flush();
312
313 std::cout << " EntitySet(" << icnt << ") = ";
314 std::cout.flush();
315 entSetRg.clear();
316 for( iter_esj = ( *iter_esi ).begin(); iter_esj != ( *iter_esi ).end(); ++iter_esj )
317 entSetRg.insert( (EntityHandle)*iter_esj );
318 debugOut.print( 2, "Mesh2 matching EntitySets: ", entSetRg );
319 std::cout.flush();
320 }
321
322 if( debug )
323 {
324
325 std::cout << "********** Test print_tuples **********" << std::endl;
326
327 std::cout << "Testing print_tuples..." << std::endl;
328
329 TupleList test_tuple;
330 int num_ints = 3, num_longs = 2, num_ulongs = 4, num_reals = 6, num_rows = 10;
331
332 std::cout << " print of test_tuples zero init..." << std::endl;
333 test_tuple.initialize( 0, 0, 0, 0, 0 );
334
335 test_tuple.enableWriteAccess();
336
337 print_tuples( &test_tuple );
338
339 std::cout << " print of test_tuples after setting n to 10..." << std::endl;
340 test_tuple.set_n( 10 );
341 print_tuples( &test_tuple );
342
343 test_tuple.initialize( num_ints, num_longs, num_ulongs, num_reals, num_rows );
344 std::cout << " print of test_tuples after init..." << std::endl;
345 print_tuples( &test_tuple );
346
347 std::cout << " print of test_tuples after setting n to 10..." << std::endl;
348 test_tuple.set_n( 10 );
349 print_tuples( &test_tuple );
350
351 for( int i = 0; i < num_rows; i++ )
352 {
353 int j;
354 for( j = 0; j < num_ints; j++ )
355 test_tuple.vi_wr[i * num_ints + j] = (int)( ( j + 1 ) * ( i + 1 ) );
356
357 for( j = 0; j < num_longs; j++ )
358 test_tuple.vl_wr[i * num_longs + j] = (int)( ( j + 1 ) * ( i + 1 ) );
359
360 for( j = 0; j < num_ulongs; j++ )
361 test_tuple.vul_wr[i * num_ulongs + j] = (int)( ( j + 1 ) * ( i + 1 ) );
362
363 for( j = 0; j < num_reals; j++ )
364 test_tuple.vr_wr[i * num_reals + j] = (int)( ( j + 1 ) * ( i + 1 ) + ( j * 0.01 ) );
365 }
366 std::cout << " print of test_tuples after filling with data..." << std::endl;
367 print_tuples( &test_tuple );
368
369
370 std::cout << "********** Test pack_tuples and unpack_tuples **********" << std::endl;
371 void* mp_buf;
372 int buf_sz;
373 if( rank == 0 )
374 {
375 buf_sz = pack_tuples( &test_tuple, &mp_buf );
376 }
377
378
379 err = MPI_Bcast( &buf_sz, 1, MPI_INT, 0, MPI_COMM_WORLD );
380
381 if( err != MPI_SUCCESS )
382 {
383 std::cerr << "MPI_Bcast of buffer size failed" << std::endl;
384 return -1;
385 }
386
387
388 if( rank != 0 )
389 {
390 mp_buf = malloc( buf_sz * sizeof( uint ) );
391 }
392
393 err = MPI_Bcast( mp_buf, buf_sz * sizeof( uint ), MPI_UNSIGNED_CHAR, 0, MPI_COMM_WORLD );
394 if( err != MPI_SUCCESS )
395 {
396 std::cerr << "MPI_Bcast of buffer failed" << std::endl;
397 return -1;
398 }
399
400 TupleList* rcv_tuples;
401 unpack_tuples( mp_buf, &rcv_tuples );
402
403 std::cout << " print of rcv_tuples after unpacking from MPI_Bcast..." << std::endl;
404 print_tuples( rcv_tuples );
405 }
406
407 err = integrate_scalar_field_test();MB_CHK_SET_ERR( (ErrorCode)err, "Failure in integrating a scalar_field" );
408
409
410 std::cout << "********** Test get_group_integ_vals **********" << std::endl;
411 std::cout << "Get group integrated field values..." << std::endl;
412
413
414 std::cout << " print vertex field values first:" << std::endl;
415 Tag norm_hdl;
416 result = mbi->tag_get_handle( normTag.c_str(), norm_hdl );MB_CHK_SET_ERR( (ErrorCode)err, "Failed to get tag handle." );
417
418 Coupler::IntegType integ_type = Coupler::VOLUME;
419
420 std::cout << " Original entity vertex field values (mesh 1): " << std::endl;
421 print_vertex_fields( mbi, m1EntityGroups, norm_hdl, integ_type );
422
423
424 std::cout << " Original entity vertex field values (mesh 2): " << std::endl;
425 print_vertex_fields( mbi, m2EntityGroups, norm_hdl, integ_type );
426
427
428 std::vector< double >::iterator iter_ivals;
429
430 std::cout << "Get group integrated field values for mesh 1..." << std::endl;
431 std::vector< double > m1IntegVals( m1EntityGroups.size() );
432 err = mbc.get_group_integ_vals( m1EntityGroups, m1IntegVals, normTag.c_str(), 4, integ_type );MB_CHK_SET_ERR( (ErrorCode)err, "Failed to get the Mesh 1 group integration values." );
433 std::cout << "Mesh 1 integrated field values(" << m1IntegVals.size() << "): ";
434 for( iter_ivals = m1IntegVals.begin(); iter_ivals != m1IntegVals.end(); ++iter_ivals )
435 {
436 std::cout << ( *iter_ivals ) << " ";
437 }
438 std::cout << std::endl;
439
440 std::cout << "Get group integrated field values for mesh 2..." << std::endl;
441 std::vector< double > m2IntegVals( m2EntityGroups.size() );
442 err = mbc.get_group_integ_vals( m2EntityGroups, m2IntegVals, normTag.c_str(), 4, integ_type );MB_CHK_SET_ERR( (ErrorCode)err, "Failed to get the Mesh 2 group integration values." );
443 std::cout << "Mesh 2 integrated field values(" << m2IntegVals.size() << "): ";
444 for( iter_ivals = m2IntegVals.begin(); iter_ivals != m2IntegVals.end(); ++iter_ivals )
445 {
446 std::cout << ( *iter_ivals ) << " ";
447 }
448 std::cout << std::endl;
449
450
451 std::cout << "********** Test apply_group_norm_factors **********" << std::endl;
452
453 double val;
454 for( unsigned int i = 0; i < m1IntegVals.size(); i++ )
455 {
456 val = m1IntegVals[i];
457 m1IntegVals[i] = 1 / val;
458 }
459
460 for( unsigned int i = 0; i < m2IntegVals.size(); i++ )
461 {
462 val = m2IntegVals[i];
463 m2IntegVals[i] = 1 / val;
464 }
465
466 std::cout << "Mesh 1 norm factors(" << m1IntegVals.size() << "): ";
467 for( iter_ivals = m1IntegVals.begin(); iter_ivals != m1IntegVals.end(); ++iter_ivals )
468 {
469 std::cout << ( *iter_ivals ) << " ";
470 }
471 std::cout << std::endl;
472
473 std::cout << "Mesh 2 norm factors(" << m2IntegVals.size() << "): ";
474 for( iter_ivals = m2IntegVals.begin(); iter_ivals != m2IntegVals.end(); ++iter_ivals )
475 {
476 std::cout << ( *iter_ivals ) << " ";
477 }
478 std::cout << std::endl;
479
480
481 err = mbc.apply_group_norm_factor( m1EntitySets, m1IntegVals, normTag.c_str(), integ_type );MB_CHK_SET_ERR( (ErrorCode)err, "Failed to apply norm factors to Mesh 1." );
482
483 err = mbc.apply_group_norm_factor( m2EntitySets, m2IntegVals, normTag.c_str(), integ_type );MB_CHK_SET_ERR( (ErrorCode)err, "Failed to apply norm factors to Mesh 2." );
484
485
486
487 Tag norm_factor_hdl;
488 std::string normFactor = normTag + "_normf";
489 result = mbi->tag_get_handle( normFactor.c_str(), norm_factor_hdl );MB_CHK_SET_ERR( result, "Failed to get norm factor tag handle." );
490
491
492 std::cout << "Mesh 1 norm factors per EntitySet...";
493 for( iter_esi = m1EntitySets.begin(); iter_esi != m1EntitySets.end(); ++iter_esi )
494 {
495 for( iter_esj = ( *iter_esi ).begin(); iter_esj != ( *iter_esi ).end(); ++iter_esj )
496 {
497 double data = 0;
498 EntityHandle eh = *iter_esj;
499 result = mbi->tag_get_data( norm_factor_hdl, &eh, 1, &data );MB_CHK_SET_ERR( result, "Failed to get tag data." );
500 std::cout << data << ", ";
501 }
502 }
503 std::cout << std::endl;
504
505
506 std::cout << "Mesh 2 norm factors per EntitySet...";
507 for( iter_esi = m2EntitySets.begin(); iter_esi != m2EntitySets.end(); ++iter_esi )
508 {
509 for( iter_esj = ( *iter_esi ).begin(); iter_esj != ( *iter_esi ).end(); ++iter_esj )
510 {
511 double data = 0;
512 EntityHandle eh = *iter_esj;
513 result = mbi->tag_get_data( norm_factor_hdl, &eh, 1, &data );MB_CHK_SET_ERR( result, "Failed to get tag data." );
514 std::cout << data << ", ";
515 }
516 }
517 std::cout << std::endl;
518
519
520 std::cout << "********** Test normalize_subset **********" << std::endl;
521
522 std::cout << "Running Coupler::normalize_subset() on mesh 1" << std::endl;
523 err = mbc.normalize_subset( (EntityHandle)roots[0], normTag.c_str(), &tagNames[0], numTagNames, &tagValues[0],
524 Coupler::VOLUME, 4 );MB_CHK_SET_ERR( (ErrorCode)err, "Failure in call to Coupler::normalize_subset() on mesh 1" );
525
526
527
528 std::cout << "Mesh 1 norm factors per EntitySet...";
529 for( iter_esi = m1EntitySets.begin(); iter_esi != m1EntitySets.end(); ++iter_esi )
530 {
531 for( iter_esj = ( *iter_esi ).begin(); iter_esj != ( *iter_esi ).end(); ++iter_esj )
532 {
533 double data = 0;
534 EntityHandle eh = *iter_esj;
535 result = mbi->tag_get_data( norm_factor_hdl, &eh, 1, &data );MB_CHK_SET_ERR( result, "Failed to get tag data." );
536 std::cout << data << ", ";
537 }
538 }
539 std::cout << std::endl;
540
541 std::cout << "Running Coupler::normalize_subset() on mesh 2" << std::endl;
542 err = mbc.normalize_subset( (EntityHandle)roots[1], normTag.c_str(), &tagNames[0], numTagNames, &tagValues[0],
543 Coupler::VOLUME, 4 );MB_CHK_SET_ERR( (ErrorCode)err, "Failure in call to Coupler::normalize_subset() on mesh 2" );
544
545
546 std::cout << "Mesh 2 norm factors per EntitySet...";
547 for( iter_esi = m2EntitySets.begin(); iter_esi != m2EntitySets.end(); ++iter_esi )
548 {
549 for( iter_esj = ( *iter_esi ).begin(); iter_esj != ( *iter_esi ).end(); ++iter_esj )
550 {
551 double data = 0;
552 EntityHandle eh = *iter_esj;
553 result = mbi->tag_get_data( norm_factor_hdl, &eh, 1, &data );MB_CHK_SET_ERR( result, "Failed to get tag data." );
554
555 std::cout << data << ", ";
556 }
557 }
558 std::cout << std::endl;
559
560
561 std::cout << "********** ssn_test DONE! **********" << std::endl;
562 MPI_Finalize();
563 return 0;
564 }
565
566 ErrorCode integrate_scalar_field_test()
567 {
568
569 std::cout << "********** Test moab::Element::Map::integrate_scalar_field **********" << std::endl;
570
571 std::vector< CartVect > biunit_cube( 8 );
572 biunit_cube[0] = CartVect( -1, -1, -1 );
573 biunit_cube[1] = CartVect( 1, -1, -1 );
574 biunit_cube[2] = CartVect( 1, 1, -1 );
575 biunit_cube[3] = CartVect( -1, 1, -1 );
576 biunit_cube[4] = CartVect( -1, -1, 1 );
577 biunit_cube[5] = CartVect( 1, -1, 1 );
578 biunit_cube[6] = CartVect( 1, 1, 1 );
579 biunit_cube[7] = CartVect( -1, 1, 1 );
580
581 std::vector< CartVect > zerobase_cube( 8 );
582 zerobase_cube[0] = CartVect( 0, 0, 0 );
583 zerobase_cube[1] = CartVect( 2, 0, 0 );
584 zerobase_cube[2] = CartVect( 2, 2, 0 );
585 zerobase_cube[3] = CartVect( 0, 2, 0 );
586 zerobase_cube[4] = CartVect( 0, 0, 2 );
587 zerobase_cube[5] = CartVect( 2, 0, 2 );
588 zerobase_cube[6] = CartVect( 2, 2, 2 );
589 zerobase_cube[7] = CartVect( 0, 2, 2 );
590
591
592 double bcf[8], bf1[8], bf2[8], bf3[8], zcf[8], zf1[8], zf2[8], zf3[8];
593 for( int i = 0; i < 8; i++ )
594 {
595 bcf[i] = const_field( biunit_cube[i][0], biunit_cube[i][1], biunit_cube[i][2] );
596 bf1[i] = field_1( biunit_cube[i][0], biunit_cube[i][1], biunit_cube[i][2] );
597 bf2[i] = field_2( biunit_cube[i][0], biunit_cube[i][1], biunit_cube[i][2] );
598 bf3[i] = field_3( biunit_cube[i][0], biunit_cube[i][1], biunit_cube[i][2] );
599
600 zcf[i] = const_field( zerobase_cube[i][0], zerobase_cube[i][1], zerobase_cube[i][2] );
601 zf1[i] = field_1( zerobase_cube[i][0], zerobase_cube[i][1], zerobase_cube[i][2] );
602 zf2[i] = field_2( zerobase_cube[i][0], zerobase_cube[i][1], zerobase_cube[i][2] );
603 zf3[i] = field_3( zerobase_cube[i][0], zerobase_cube[i][1], zerobase_cube[i][2] );
604 }
605
606 std::cout << "Integrated values:" << std::endl;
607
608 try
609 {
610 double field_const1, field_const2;
611 double field_linear1, field_linear2;
612 double field_quad1, field_quad2;
613 double field_cubic1, field_cubic2;
614
615 int ipoints = 0;
616 Element::LinearHex biunit_hexMap( biunit_cube );
617 Element::LinearHex zerobase_hexMap( zerobase_cube );
618
619 field_const1 = biunit_hexMap.integrate_scalar_field( bcf );
620 field_const2 = zerobase_hexMap.integrate_scalar_field( zcf );
621 std::cout << " binunit_cube, const_field(num_pts=" << ipoints << "): field_val=" << field_const1
622 << std::endl;
623 std::cout << " zerobase_cube, const_field(num_pts=" << ipoints << "): field_val=" << field_const2
624 << std::endl;
625
626 field_linear1 = biunit_hexMap.integrate_scalar_field( bf1 );
627 field_linear2 = zerobase_hexMap.integrate_scalar_field( zf1 );
628 std::cout << " binunit_cube, field_1(num_pts=" << ipoints << "): field_val=" << field_linear1 << std::endl;
629 std::cout << " zerobase_cube, field_1(num_pts=" << ipoints << "): field_val=" << field_linear2 << std::endl;
630
631 field_quad1 = biunit_hexMap.integrate_scalar_field( bf2 );
632 field_quad2 = zerobase_hexMap.integrate_scalar_field( zf2 );
633 std::cout << " binunit_cube, field_2(num_pts=" << ipoints << "): field_val=" << field_quad1 << std::endl;
634 std::cout << " zerobase_cube, field_2(num_pts=" << ipoints << "): field_val=" << field_quad2 << std::endl;
635
636 field_cubic1 = biunit_hexMap.integrate_scalar_field( bf3 );
637 field_cubic2 = zerobase_hexMap.integrate_scalar_field( zf3 );
638 std::cout << " binunit_cube, field_3(num_pts=" << ipoints << "): field_val=" << field_cubic1 << std::endl;
639 std::cout << " zerobase_cube, field_3(num_pts=" << ipoints << "): field_val=" << field_cubic2 << std::endl;
640 }
641 catch( moab::Element::Map::ArgError )
642 {
643 MB_CHK_SET_ERR( MB_FAILURE, "Failed to set vertices on Element::Map." );
644 }
645 catch( moab::Element::Map::EvaluationError )
646 {
647 MB_CHK_SET_ERR( MB_FAILURE, "Failed to get inverse evaluation of coordinate on Element::Map." );
648 }
649 return MB_SUCCESS;
650 }
651
652
653 void get_file_options( int argc,
654 char** argv,
655 std::vector< const char* >& filenames,
656 std::string& normTag,
657 std::vector< const char* >& tagNames,
658 std::vector< const char* >& tagValues,
659 std::string& fileOpts,
660 int* err )
661 {
662 int npos = 1;
663
664
665 int nfiles = atoi( argv[npos++] );
666
667
668 filenames.resize( nfiles );
669 for( int i = 0; i < nfiles; i++ )
670 filenames[i] = argv[npos++];
671
672
673 if( npos < argc )
674 normTag = argv[npos++];
675 else
676 {
677 std::cerr << "Insufficient parameters: norm_tag missing" << std::endl;
678 *err = 1;
679 return;
680 }
681
682
683 if( npos < argc )
684 {
685 char* opts = argv[npos++];
686
687
688 bool end_vals_seen = false;
689 std::vector< char* > tmpTagOpts;
690
691
692 for( char* i = strtok( opts, ";" ); i; i = strtok( 0, ";" ) )
693 {
694 if( debug ) std::cout << "get_file_options: i=" << i << std::endl;
695 tmpTagOpts.push_back( i );
696 }
697
698
699 for( unsigned int j = 0; j < tmpTagOpts.size(); j++ )
700 {
701 char* e = strtok( tmpTagOpts[j], "=" );
702 if( debug ) std::cout << "get_file_options: name=" << e << std::endl;
703 tagNames.push_back( e );
704 e = strtok( 0, "=" );
705 if( e != NULL )
706 {
707 if( debug ) std::cout << "get_file_options: val=" << e << std::endl;
708
709 if( end_vals_seen )
710 {
711
712 std::cerr << "Incorrect parameters: new value seen after end of values" << std::endl;
713 *err = 1;
714 return;
715 }
716
717 int* valp = new int;
718 *valp = atoi( e );
719 tagValues.push_back( (const char*)valp );
720 }
721 else
722 {
723
724 end_vals_seen = true;
725 tagValues.push_back( (const char*)0 );
726 }
727 }
728 }
729 else
730 {
731 std::cerr << "Insufficient parameters: tag_select_opts missing" << std::endl;
732 *err = 1;
733 return;
734 }
735
736
737 if( npos < argc )
738 fileOpts = argv[npos++];
739 else
740 {
741 std::cerr << "Insufficient parameters: file_opts missing" << std::endl;
742 *err = 1;
743 return;
744 }
745 }
746
747
748 void print_tuples( TupleList* tlp )
749 {
750 uint mi, ml, mul, mr;
751 tlp->getTupleSize( mi, ml, mul, mr );
752 std::cout << " tuple data: (n=" << tlp->get_n() << ")" << std::endl;
753 std::cout << " mi:" << mi << " ml:" << ml << " mul:" << mul << " mr:" << mr << std::endl;
754 std::cout << " [" << std::setw( 11 * mi ) << " int data"
755 << " |" << std::setw( 11 * ml ) << " long data"
756 << " |" << std::setw( 11 * mul ) << " Ulong data"
757 << " |" << std::setw( 11 * mr ) << " real data"
758 << " " << std::endl
759 << " ";
760 for( unsigned int i = 0; i < tlp->get_n(); i++ )
761 {
762 if( mi > 0 )
763 {
764 for( unsigned int j = 0; j < mi; j++ )
765 {
766 std::cout << std::setw( 10 ) << tlp->vi_rd[i * mi + j] << " ";
767 }
768 }
769 else
770 {
771 std::cout << " ";
772 }
773 std::cout << "| ";
774
775 if( ml > 0 )
776 {
777 for( unsigned int j = 0; j < ml; j++ )
778 {
779 std::cout << std::setw( 10 ) << tlp->vl_rd[i * ml + j] << " ";
780 }
781 }
782 else
783 {
784 std::cout << " ";
785 }
786 std::cout << "| ";
787
788 if( mul > 0 )
789 {
790 for( unsigned int j = 0; j < mul; j++ )
791 {
792 std::cout << std::setw( 10 ) << tlp->vul_rd[i * mul + j] << " ";
793 }
794 }
795 else
796 {
797 std::cout << " ";
798 }
799 std::cout << "| ";
800
801 if( mr > 0 )
802 {
803 for( unsigned int j = 0; j < mr; j++ )
804 {
805 std::cout << std::setw( 10 ) << tlp->vr_rd[i * mr + j] << " ";
806 }
807 }
808 else
809 {
810 std::cout << " ";
811 }
812
813 if( i + 1 < tlp->get_n() ) std::cout << std::endl << " ";
814 }
815 std::cout << "]" << std::endl;
816 }
817
818
819 int print_vertex_fields( Interface* mbi,
820 std::vector< std::vector< EntityHandle > >& groups,
821 Tag& norm_hdl,
822 Coupler::IntegType integ_type )
823 {
824 int err = 0;
825 ErrorCode result;
826 std::vector< EntityHandle >::iterator iter_j;
827
828 for( unsigned int i = 0; i < groups.size(); i++ )
829 {
830 std::cout << " Group - " << std::endl << " ";
831 for( iter_j = groups[i].begin(); iter_j != groups[i].end(); ++iter_j )
832 {
833 EntityHandle ehandle = ( *iter_j );
834
835
836 int j_type = mbi->dimension_from_handle( ehandle );
837
838 if( ( integ_type == Coupler::VOLUME ) && ( j_type != 3 ) ) continue;
839
840
841 const EntityHandle* conn = NULL;
842 int num_verts = 0;
843 result = mbi->get_connectivity( ehandle, conn, num_verts );
844 if( MB_SUCCESS != result ) return 1;
845 std::cout << std::fixed;
846 for( int iv = 0; iv < num_verts; iv++ )
847 {
848 double data = 0;
849 result = mbi->tag_get_data( norm_hdl, &conn[iv], 1, &data );
850 if( MB_SUCCESS != result ) return 1;
851 std::cout << std::setprecision( 8 ) << data << ", ";
852 }
853 std::cout << std::endl << " ";
854 }
855 std::cout << std::endl;
856 std::cout.unsetf( std::ios_base::floatfield );
857 }
858
859 return err;
860 }
861
862
863 double const_field( double , double , double )
864 {
865
866 return 5.0;
867 }
868
869
870 double field_1( double x, double y, double z )
871 {
872 double f = fabs( x ) + fabs( y ) + fabs( z );
873
874 return f;
875 }
876
877 double field_2( double x, double y, double z )
878 {
879 double f = x * x + y * y + z * z;
880
881 return f;
882 }
883
884 double field_3( double x, double y, double z )
885 {
886 double f = 2 * x + 2 * y + 2 * z;
887
888 return f;
889 }
890
891
892 double physField( double x, double y, double z )
893 {
894 double out;
895
896
897
898 out = x * x + y * y + z * z;
899 out += 1e-1;
900 out = 1 / out;
901
902 return out;
903 }
904
905 #define UINT_PER_X( X ) ( ( sizeof( X ) + sizeof( uint ) - 1 ) / sizeof( uint ) )
906 #define UINT_PER_REAL UINT_PER_X( realType )
907 #define UINT_PER_LONG UINT_PER_X( slong )
908 #define UINT_PER_ULONG UINT_PER_X( Ulong )
909 #define UINT_PER_UNSIGNED UINT_PER_X( unsigned )
910
911
912 int pack_tuples( TupleList* tl, void** ptr )
913 {
914 uint mi, ml, mul, mr;
915 tl->getTupleSize( mi, ml, mul, mr );
916
917 uint n = tl->get_n();
918
919 int sz_buf = 1 + 4 * UINT_PER_UNSIGNED +
920 tl->get_n() * ( mi + ml * UINT_PER_LONG + mul * UINT_PER_LONG + mr * UINT_PER_REAL );
921
922 uint* buf = (uint*)malloc( sz_buf * sizeof( uint ) );
923 *ptr = (void*)buf;
924
925
926 memcpy( buf, &n, sizeof( uint ) ), buf += 1;
927
928 memcpy( buf, &mi, sizeof( unsigned ) ), buf += UINT_PER_UNSIGNED;
929
930 memcpy( buf, &ml, sizeof( unsigned ) ), buf += UINT_PER_UNSIGNED;
931
932 memcpy( buf, &mul, sizeof( unsigned ) ), buf += UINT_PER_UNSIGNED;
933
934 memcpy( buf, &mr, sizeof( unsigned ) ), buf += UINT_PER_UNSIGNED;
935
936 memcpy( buf, tl->vi_rd, tl->get_n() * mi * sizeof( sint ) ), buf += tl->get_n() * mi;
937
938 memcpy( buf, tl->vl_rd, tl->get_n() * ml * sizeof( slong ) ), buf += tl->get_n() * ml * UINT_PER_LONG;
939
940 memcpy( buf, tl->vul_rd, tl->get_n() * mul * sizeof( Ulong ) ), buf += tl->get_n() * mul * UINT_PER_ULONG;
941
942 memcpy( buf, tl->vr_rd, tl->get_n() * mr * sizeof( realType ) ), buf += tl->get_n() * mr * UINT_PER_REAL;
943
944 return sz_buf;
945 }
946
947
948 void unpack_tuples( void* ptr, TupleList** tlp )
949 {
950 TupleList* tl = new TupleList();
951 *tlp = tl;
952
953 uint nt;
954 unsigned mit, mlt, mult, mrt;
955 uint* buf = (uint*)ptr;
956
957
958 memcpy( &nt, buf, sizeof( uint ) ), buf += 1;
959
960 memcpy( &mit, buf, sizeof( unsigned ) ), buf += UINT_PER_UNSIGNED;
961
962 memcpy( &mlt, buf, sizeof( unsigned ) ), buf += UINT_PER_UNSIGNED;
963
964 memcpy( &mult, buf, sizeof( unsigned ) ), buf += UINT_PER_UNSIGNED;
965
966 memcpy( &mrt, buf, sizeof( unsigned ) ), buf += UINT_PER_UNSIGNED;
967
968
969 tl->initialize( mit, mlt, mult, mrt, nt );
970 tl->enableWriteAccess();
971 tl->set_n( nt );
972
973 uint mi, ml, mul, mr;
974 tl->getTupleSize( mi, ml, mul, mr );
975
976
977 memcpy( tl->vi_wr, buf, tl->get_n() * mi * sizeof( sint ) ), buf += tl->get_n() * mi;
978
979 memcpy( tl->vl_wr, buf, tl->get_n() * ml * sizeof( slong ) ), buf += tl->get_n() * ml * UINT_PER_LONG;
980
981 memcpy( tl->vul_wr, buf, tl->get_n() * mul * sizeof( Ulong ) ), buf += tl->get_n() * mul * UINT_PER_ULONG;
982
983 memcpy( tl->vr_wr, buf, tl->get_n() * mr * sizeof( realType ) ), buf += tl->get_n() * mr * UINT_PER_REAL;
984
985 tl->disableWriteAccess();
986
987 return;
988 }