int main( int argc, char* argv[] ) { Dictionary* dictionary=NULL; Dictionary* sources; XML_IO_Handler* ioHandler; Stream* msgs; char* outputFilename = DEFAULT_OUTPUT_FILE; int ii; MPI_Init( &argc, &argv ); if( !StGermainBase_Init( &argc, &argv ) ) { fprintf( stderr, "Error initialising StGermain, exiting.\n" ); exit( EXIT_FAILURE ); } msgs = Journal_Register( Info_Type, "Messages" ); for( ii = 0; ii < argc; ++ii ) { if( strstr( argv[ii], OUTPUT_FILE_FLAG ) == argv[ii] ) { outputFilename = argv[ii] + strlen( OUTPUT_FILE_FLAG ); if( strlen( outputFilename ) < 1 ) { Journal_Printf( msgs, "Invalid outputfile name: %s\n", outputFilename ); Journal_Printf( msgs, "Exiting...\n" ); StGermainBase_Finalise(); return 1; } argv[ii] = " "; /* remove it from the arg list */ } } dictionary = Dictionary_New(); sources = Dictionary_New(); /* Read input */ ioHandler = XML_IO_Handler_New(); IO_Handler_ReadAllFromCommandLine( ioHandler, argc, argv, dictionary, sources ); IO_Handler_WriteAllToFile( ioHandler, outputFilename, dictionary, sources ); Stg_Class_Delete( dictionary ); Stg_Class_Delete( sources ); Stg_Class_Delete( ioHandler ); StGermainBase_Finalise(); MPI_Finalize(); return 0; /* success */ }
int main(int argc, char *argv[]) { MPI_Comm CommWorld; int rank; int procCount; int procToWatch; Dictionary* dictionary; Topology* nTopology; ElementLayout* eLayout; NodeLayout* nLayout; HexaMD* decompCorner; HexaMD* decompBody; Stream* stream; Index decompDims; XML_IO_Handler* ioHandler; Dimension_Index dim_I; /* Initialise MPI, get world info */ MPI_Init(&argc, &argv); MPI_Comm_dup( MPI_COMM_WORLD, &CommWorld ); MPI_Comm_size(CommWorld, &procCount); MPI_Comm_rank(CommWorld, &rank); Base_Init( &argc, &argv ); DiscretisationGeometry_Init( &argc, &argv ); DiscretisationShape_Init( &argc, &argv ); DiscretisationMesh_Init( &argc, &argv ); MPI_Barrier( CommWorld ); /* Ensures copyright info always come first in output */ procToWatch = argc >= 2 ? atoi(argv[1]) : 0; Journal_Enable_TypedStream( DebugStream_Type, False ); stream = Journal_Register( DebugStream_Type, HexaMD_Type ); Stream_EnableBranch( stream, True ); Stream_SetLevelBranch( stream, 3 ); dictionary = Dictionary_New(); Dictionary_Add( dictionary, "rank", Dictionary_Entry_Value_FromUnsignedInt( rank ) ); Dictionary_Add( dictionary, "numProcessors", Dictionary_Entry_Value_FromUnsignedInt( procCount ) ); Dictionary_Add( dictionary, "meshSizeI", Dictionary_Entry_Value_FromUnsignedInt( 5 ) ); Dictionary_Add( dictionary, "meshSizeJ", Dictionary_Entry_Value_FromUnsignedInt( 5 ) ); Dictionary_Add( dictionary, "meshSizeK", Dictionary_Entry_Value_FromUnsignedInt( 5 ) ); Dictionary_Add( dictionary, "allowUnusedCPUs", Dictionary_Entry_Value_FromBool( True ) ); Dictionary_Add( dictionary, "allowPartitionOnElement", Dictionary_Entry_Value_FromBool( False ) ); Dictionary_Add( dictionary, "allowPartitionOnNode", Dictionary_Entry_Value_FromBool( True ) ); Dictionary_Add( dictionary, "allowUnbalancing", Dictionary_Entry_Value_FromBool( False ) ); Dictionary_Add( dictionary, "shadowDepth", Dictionary_Entry_Value_FromUnsignedInt( 1 ) ); /* Moved afterwards to allow command line to over-ride */ ioHandler = XML_IO_Handler_New(); IO_Handler_ReadAllFromCommandLine( ioHandler, argc, argv, dictionary ); decompDims = Dictionary_GetUnsignedInt_WithDefault( dictionary, "decompDims", 1 ); nTopology = (Topology*)IJK6Topology_New( "IJK6Topology", dictionary ); eLayout = (ElementLayout*)ParallelPipedHexaEL_New( "PPHexaEL", 3, dictionary ); nLayout = (NodeLayout*)CornerNL_New( "CornerNL", dictionary, eLayout, nTopology ); decompCorner = HexaMD_New_All( "HexaMD", dictionary, MPI_COMM_WORLD, eLayout, nLayout, decompDims ); if( rank == procToWatch ) { printf( "Corner Node Layout\n" ); PrintDecompInfoOfHexaMD( decompCorner, rank ); printf( "\n" ); } /* Do a run with body nodes */ Stg_Class_Delete( nLayout ); /* TODO: the following is a bit of a hack because of the weird way mesh size is defined by default in the dictionary (assumes a corner mesh ) */ for ( dim_I = 0; dim_I < 3; dim_I++ ) { if ( ((IJKTopology*)nTopology)->size[dim_I] > 1 ) { ((IJKTopology*)nTopology)->size[dim_I]--; } } nLayout = (NodeLayout*)BodyNL_New( "BodyNL", dictionary, eLayout, nTopology ); decompBody = HexaMD_New_All( "HexaMD", dictionary, MPI_COMM_WORLD, eLayout, nLayout, decompDims ); if( rank == procToWatch ) { Bool result; printf( "Body Node Layout\n" ); //PrintDecompInfoOfHexaMD( decompBody, rank ); printf( "Checking body node decomp has same element decomp as corner node decomp:\n" ); result = CheckDecompItemsAreDecomposedIdentically( decompCorner, ELEMENT_ITEM_TYPE, decompBody, ELEMENT_ITEM_TYPE, rank ); if ( result == True ) printf( "\tPassed.\n" ); else printf( "\tFailed.\n" ); printf( "Checking body node decomp has same node decomp as it's element decomp:\n" ); result = CheckDecompItemsAreDecomposedIdentically( decompBody, ELEMENT_ITEM_TYPE, decompBody, NODE_ITEM_TYPE, rank ); if ( result == True ) printf( "\tPassed.\n" ); else printf( "\tFailed.\n" ); } Stg_Class_Delete( decompBody ); Stg_Class_Delete( decompCorner ); Stg_Class_Delete( nLayout ); Stg_Class_Delete( eLayout ); Stg_Class_Delete( nTopology ); Stg_Class_Delete( dictionary ); DiscretisationMesh_Finalise(); DiscretisationShape_Finalise(); DiscretisationGeometry_Finalise(); Base_Finalise(); /* Close off MPI */ MPI_Finalize(); return EXIT_SUCCESS; }