![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /** @example ErrorHandlingSimulation.cpp
00002 * Description: This example simulates MOAB's enhanced error handling in parallel. \n
00003 * All of the errors are contrived, used for simulation purpose only. \n
00004 *
00005 * Note: We do not need a moab instance for this example
00006 *
00007 * To run: mpiexec -np 4 ./ErrorHandlingSimulation \n
00008 */
00009
00010 #include "moab/MOABConfig.h"
00011 #include "moab/ErrorHandler.hpp"
00012 #ifdef MOAB_HAVE_MPI
00013 #include "moab_mpi.h"
00014 #endif
00015
00016 #include
00017 #include
00018
00019 using namespace moab;
00020 using namespace std;
00021
00022 // Functions that create and handle contrived errors
00023 // Call hierarchy: A calls B, and B calls C
00024 ErrorCode FunctionC( int test_case_num, int rank )
00025 {
00026 switch( test_case_num )
00027 {
00028 case 1:
00029 // Simulate a global fatal error MB_NOT_IMPLEMENTED on all processors
00030 // Note, it is printed by root processor 0 only
00031 MB_SET_GLB_ERR( MB_NOT_IMPLEMENTED, "A contrived global error MB_NOT_IMPLEMENTED" );
00032 break;
00033 case 2:
00034 // Simulate a per-processor relevant error MB_INDEX_OUT_OF_RANGE on all processors
00035 // Note, it is printed by all processors
00036 MB_SET_ERR( MB_INDEX_OUT_OF_RANGE, "A contrived error MB_INDEX_OUT_OF_RANGE on processor " << rank );
00037 break;
00038 case 3:
00039 // Simulate a per-processor relevant error MB_TYPE_OUT_OF_RANGE on all processors except
00040 // root Note, it is printed by all non-root processors
00041 if( 0 != rank )
00042 MB_SET_ERR( MB_TYPE_OUT_OF_RANGE, "A contrived error MB_TYPE_OUT_OF_RANGE on processor " << rank );
00043 break;
00044 case 4:
00045 // Simulate a per-processor relevant error MB_INDEX_OUT_OF_RANGE on processor 1
00046 // Note, it is printed by processor 1 only
00047 if( 1 == rank )
00048 MB_SET_ERR( MB_INDEX_OUT_OF_RANGE, "A contrived error MB_INDEX_OUT_OF_RANGE on processor 1" );
00049
00050 // Simulate a per-processor relevant error MB_TYPE_OUT_OF_RANGE on processor 3
00051 // Note, it is printed by processor 3 only
00052 if( 3 == rank ) MB_SET_ERR( MB_TYPE_OUT_OF_RANGE, "A contrived error MB_TYPE_OUT_OF_RANGE on processor 3" );
00053 break;
00054 default:
00055 break;
00056 }
00057
00058 return MB_SUCCESS;
00059 }
00060
00061 ErrorCode FunctionB( int test_case_num, int rank )
00062 {
00063 ErrorCode err_code = FunctionC( test_case_num, rank );MB_CHK_ERR( err_code );
00064
00065 return MB_SUCCESS;
00066 }
00067
00068 ErrorCode FunctionA( int test_case_num, int rank )
00069 {
00070 ErrorCode err_code = FunctionB( test_case_num, rank );MB_CHK_ERR( err_code );
00071
00072 return MB_SUCCESS;
00073 }
00074
00075 int main( int argc, char** argv )
00076 {
00077 if( argc < 2 )
00078 {
00079 cout << "Usage: " << argv[0] << " " << endl;
00080 return 0;
00081 }
00082
00083 #ifdef MOAB_HAVE_MPI
00084 MPI_Init( &argc, &argv );
00085 #endif
00086
00087 // Initialize error handler, required for this example (not using a moab instance)
00088 MBErrorHandler_Init();
00089
00090 int test_case_num = atoi( argv[1] );
00091 int rank = 0;
00092 #ifdef MOAB_HAVE_MPI
00093 MPI_Comm_rank( MPI_COMM_WORLD, &rank );
00094 #endif
00095
00096 ErrorCode rval = FunctionA( test_case_num, rank );MB_CHK_ERR( rval );
00097
00098 // Finalize error handler, required for this example (not using a moab instance)
00099 MBErrorHandler_Finalize();
00100
00101 #ifdef MOAB_HAVE_MPI
00102 MPI_Finalize();
00103 #endif
00104
00105 return 0;
00106 }