MOAB: Mesh Oriented datABase
(version 5.4.1)
|
#include "moab/ParallelComm.hpp"
#include "moab/Core.hpp"
#include "moab_mpi.h"
#include "moab/iMOAB.h"
#include "TestUtil.hpp"
Go to the source code of this file.
Defines | |
#define | RUN_TEST_ARG2(A, B) run_test( &( A ), #A, B ) |
#define | CHECKRC(rc, message) |
Functions | |
int | is_any_proc_error (int is_my_error) |
int | run_test (ErrorCode(*func)(const char *), const char *func_name, const char *file_name) |
ErrorCode | migrate_1_1 (const char *filename) |
ErrorCode | migrate_1_2 (const char *filename) |
ErrorCode | migrate_2_1 (const char *filename) |
ErrorCode | migrate_2_2 (const char *filename) |
ErrorCode | migrate_4_2 (const char *filename) |
ErrorCode | migrate_2_4 (const char *filename) |
ErrorCode | migrate_4_3 (const char *filename) |
ErrorCode | migrate_overlap (const char *filename) |
int | main (int argc, char *argv[]) |
ErrorCode | migrate (const char *filename, const char *outfile) |
Variables | |
int | rank |
int | size |
int | ierr |
int | compid1 |
int | compid2 |
int | nghlay |
int | groupTasks [4] |
int | startG1 |
int | startG2 |
int | endG1 |
int | endG2 |
MPI_Comm | jcomm |
MPI_Group | jgroup |
#define CHECKRC | ( | rc, | |
message | |||
) |
if( 0 != ( rc ) ) \ { \ printf( "Error: %s\n", message ); \ return MB_FAILURE; \ }
Definition at line 20 of file migrate_test.cpp.
Referenced by migrate().
#define RUN_TEST_ARG2 | ( | A, | |
B | |||
) | run_test( &( A ), #A, B ) |
Definition at line 16 of file migrate_test.cpp.
Referenced by main().
int is_any_proc_error | ( | int | is_my_error | ) |
Definition at line 27 of file migrate_test.cpp.
References MPI_COMM_WORLD.
{ int result = 0; int err = MPI_Allreduce( &is_my_error, &result, 1, MPI_INT, MPI_MAX, MPI_COMM_WORLD ); return err || result; }
int main | ( | int | argc, |
char * | argv[] | ||
) |
Definition at line 71 of file migrate_test.cpp.
References filename, jcomm, jgroup, migrate_1_1(), migrate_1_2(), migrate_2_1(), migrate_2_2(), migrate_2_4(), migrate_4_2(), migrate_4_3(), migrate_overlap(), MPI_COMM_WORLD, rank, RUN_TEST_ARG2, and size.
{ MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); MPI_Comm_dup( MPI_COMM_WORLD, &jcomm ); MPI_Comm_group( jcomm, &jgroup ); std::string filename; filename = TestDir + "unittest/field1.h5m"; if( argc > 1 ) { filename = argv[1]; } int num_errors = 0; num_errors += RUN_TEST_ARG2( migrate_1_1, filename.c_str() ); num_errors += RUN_TEST_ARG2( migrate_1_2, filename.c_str() ); num_errors += RUN_TEST_ARG2( migrate_2_1, filename.c_str() ); num_errors += RUN_TEST_ARG2( migrate_2_2, filename.c_str() ); if( size >= 4 ) { num_errors += RUN_TEST_ARG2( migrate_4_2, filename.c_str() ); num_errors += RUN_TEST_ARG2( migrate_2_4, filename.c_str() ); num_errors += RUN_TEST_ARG2( migrate_4_3, filename.c_str() ); num_errors += RUN_TEST_ARG2( migrate_overlap, filename.c_str() ); } if( rank == 0 ) { if( !num_errors ) std::cout << "All tests passed" << std::endl; else std::cout << num_errors << " TESTS FAILED!" << std::endl; } MPI_Group_free( &jgroup ); MPI_Comm_free( &jcomm ); MPI_Finalize(); return num_errors; }
Definition at line 112 of file migrate_test.cpp.
References CHECKRC, compid1, compid2, DENSE_DOUBLE, endG1, endG2, groupTasks, ierr, iMOAB_AppID, iMOAB_DefineTagStorage(), iMOAB_DeregisterApplication(), iMOAB_Finalize(), iMOAB_Initialize(), iMOAB_LoadMesh(), iMOAB_RegisterApplication(), iMOAB_WriteMesh(), jcomm, jgroup, MB_SUCCESS, nghlay, readopts(), startG1, and startG2.
Referenced by migrate_1_1(), migrate_1_2(), migrate_2_1(), migrate_2_2(), migrate_2_4(), migrate_4_2(), migrate_4_3(), and migrate_overlap().
{ // first create MPI groups std::string filen( filename ); MPI_Group group1, group2; for( int i = startG1; i <= endG1; i++ ) groupTasks[i - startG1] = i; ierr = MPI_Group_incl( jgroup, endG1 - startG1 + 1, groupTasks, &group1 ); CHECKRC( ierr, "can't create group1" ) for( int i = startG2; i <= endG2; i++ ) groupTasks[i - startG2] = i; ierr = MPI_Group_incl( jgroup, endG2 - startG2 + 1, groupTasks, &group2 ); CHECKRC( ierr, "can't create group2" ) // create 2 communicators, one for each group int tagcomm1 = 1, tagcomm2 = 2; MPI_Comm comm1, comm2; ierr = MPI_Comm_create_group( jcomm, group1, tagcomm1, &comm1 ); CHECKRC( ierr, "can't create comm1" ) ierr = MPI_Comm_create_group( jcomm, group2, tagcomm2, &comm2 ); CHECKRC( ierr, "can't create comm2" ) ierr = iMOAB_Initialize( 0, 0 ); // not really needed anything from argc, argv, yet; maybe we should CHECKRC( ierr, "can't initialize iMOAB" ) // give some dummy values to component ids, just to differentiate between them // the par comm graph is unique between components compid1 = 4; compid2 = 7; int context_id = -1; // default context; will be now set to compid1 or compid2 int appID1; iMOAB_AppID pid1 = &appID1; int appID2; iMOAB_AppID pid2 = &appID2; if( comm1 != MPI_COMM_NULL ) { ierr = iMOAB_RegisterApplication( "APP1", &comm1, &compid1, pid1 ); CHECKRC( ierr, "can't register app1 " ) } if( comm2 != MPI_COMM_NULL ) { ierr = iMOAB_RegisterApplication( "APP2", &comm2, &compid2, pid2 ); CHECKRC( ierr, "can't register app2 " ) } int method = 0; // trivial partition for sending if( comm1 != MPI_COMM_NULL ) { std::string readopts( "PARALLEL=READ_PART;PARTITION=PARALLEL_PARTITION;PARALLEL_RESOLVE_SHARED_ENTS" ); nghlay = 0; ierr = iMOAB_LoadMesh( pid1, filen.c_str(), readopts.c_str(), &nghlay ); CHECKRC( ierr, "can't load mesh " ) ierr = iMOAB_SendMesh( pid1, &jcomm, &group2, &compid2, &method ); // send to component 2 CHECKRC( ierr, "cannot send elements" ) } if( comm2 != MPI_COMM_NULL ) { ierr = iMOAB_ReceiveMesh( pid2, &jcomm, &group1, &compid1 ); // receive from component 1 CHECKRC( ierr, "cannot receive elements" ) std::string wopts; wopts = "PARALLEL=WRITE_PART;"; ierr = iMOAB_WriteMesh( pid2, outfile, wopts.c_str() ); CHECKRC( ierr, "cannot write received mesh" ) } MPI_Barrier( jcomm ); // we can now free the sender buffers if( comm1 != MPI_COMM_NULL ) ierr = iMOAB_FreeSenderBuffers( pid1, &context_id ); // exchange tag, from component to component // one is receiving, one is sending the tag; the one that is sending needs to have communicator // not null int size_tag = 1; // a double dense tag, on elements int tagType = DENSE_DOUBLE; int tagIndex2 = 0, tagIndex1 = 0; // these will be tag indices on each app pid std::string fileAfterTagMigr( outfile ); // has h5m int sizen = fileAfterTagMigr.length(); fileAfterTagMigr.erase( sizen - 4, 4 ); // erase extension .h5m fileAfterTagMigr = fileAfterTagMigr + "_tag.h5m"; // now send a tag from component 2, towards component 1 if( comm2 != MPI_COMM_NULL ) { ierr = iMOAB_DefineTagStorage( pid2, "element_field", &tagType, &size_tag, &tagIndex2 ); CHECKRC( ierr, "failed to get tag element_field " ); // this tag is already existing in the file // first, send from compid2 to compid1, from comm2, using common joint comm // as always, use nonblocking sends // contex_id should be now compid1 context_id = compid1; ierr = iMOAB_SendElementTag( pid2, "element_field", &jcomm, &context_id ); CHECKRC( ierr, "cannot send tag values" ) } // receive on component 1 if( comm1 != MPI_COMM_NULL ) { ierr = iMOAB_DefineTagStorage( pid1, "element_field", &tagType, &size_tag, &tagIndex1 ); CHECKRC( ierr, "failed to get tag DFIELD " ); context_id = compid2; ierr = iMOAB_ReceiveElementTag( pid1, "element_field", &jcomm, &context_id ); CHECKRC( ierr, "cannot send tag values" ) std::string wopts; wopts = "PARALLEL=WRITE_PART;"; ierr = iMOAB_WriteMesh( pid1, fileAfterTagMigr.c_str(), wopts.c_str() ); CHECKRC( ierr, "cannot write received mesh" ) } MPI_Barrier( jcomm ); // we can now free the sender buffers if( comm2 != MPI_COMM_NULL ) ierr = iMOAB_FreeSenderBuffers( pid2, &context_id ); if( comm2 != MPI_COMM_NULL ) { ierr = iMOAB_DeregisterApplication( pid2 ); CHECKRC( ierr, "cannot deregister app 2 receiver" ) } if( comm1 != MPI_COMM_NULL ) { ierr = iMOAB_DeregisterApplication( pid1 ); CHECKRC( ierr, "cannot deregister app 1 sender" ) } ierr = iMOAB_Finalize(); CHECKRC( ierr, "did not finalize iMOAB" ) if( MPI_COMM_NULL != comm1 ) MPI_Comm_free( &comm1 ); if( MPI_COMM_NULL != comm2 ) MPI_Comm_free( &comm2 ); MPI_Group_free( &group1 ); MPI_Group_free( &group2 ); return MB_SUCCESS; }
ErrorCode migrate_1_1 | ( | const char * | filename | ) |
ErrorCode migrate_1_2 | ( | const char * | filename | ) |
ErrorCode migrate_2_1 | ( | const char * | filename | ) |
ErrorCode migrate_2_2 | ( | const char * | filename | ) |
ErrorCode migrate_2_4 | ( | const char * | filename | ) |
ErrorCode migrate_4_2 | ( | const char * | filename | ) |
ErrorCode migrate_4_3 | ( | const char * | filename | ) |
ErrorCode migrate_overlap | ( | const char * | filename | ) |
Definition at line 34 of file migrate_test.cpp.
References ErrorCode, is_any_proc_error(), MB_SUCCESS, MPI_COMM_WORLD, and rank.
{ ErrorCode result = ( *func )( file_name ); int is_err = is_any_proc_error( ( MB_SUCCESS != result ) ); int rank; MPI_Comm_rank( MPI_COMM_WORLD, &rank ); if( rank == 0 ) { if( is_err ) std::cout << func_name << " : FAILED!!" << std::endl; else std::cout << func_name << " : success" << std::endl; } return is_err; }
int compid1 |
Definition at line 63 of file migrate_test.cpp.
int compid2 |
Definition at line 63 of file migrate_test.cpp.
int endG1 |
Definition at line 66 of file migrate_test.cpp.
int endG2 |
Definition at line 66 of file migrate_test.cpp.
int groupTasks[4] |
Definition at line 65 of file migrate_test.cpp.
int ierr |
Definition at line 61 of file migrate_test.cpp.
Definition at line 68 of file migrate_test.cpp.
MPI_Group jgroup |
Definition at line 69 of file migrate_test.cpp.
int nghlay |
Definition at line 64 of file migrate_test.cpp.
int rank |
Definition at line 61 of file migrate_test.cpp.
int size |
Definition at line 61 of file migrate_test.cpp.
int startG1 |
Definition at line 66 of file migrate_test.cpp.
int startG2 |
Definition at line 66 of file migrate_test.cpp.