[cig-commits] commit:
Mercurial
hg at geodynamics.org
Mon Nov 24 11:58:37 PST 2008
changeset: 62:74c7b464b60b
user: BelindaMay
date: Tue Mar 18 05:11:09 2008 +0000
files: Mesh/src/CartesianGenerator.c Mesh/src/CartesianGenerator.h
description:
changed mesh checkpointing so that we can restart on a different number of processors
diff -r ac0983b2e608 -r 74c7b464b60b Mesh/src/CartesianGenerator.c
--- a/Mesh/src/CartesianGenerator.c Mon Mar 17 05:16:25 2008 +0000
+++ b/Mesh/src/CartesianGenerator.c Tue Mar 18 05:11:09 2008 +0000
@@ -1978,12 +1978,12 @@ void CartesianGenerator_GenGeom( Cartesi
unsigned* inds;
double* steps;
unsigned n_i, d_i;
+ double* vert;
+ unsigned gNode;
AbstractContext* context = (AbstractContext*)data;
char meshSaveFileName[256];
- double* vert;
- unsigned gNode;
Stream* errorStream = Journal_Register( Error_Type, self->type );
- int myRank, nProcs, i;
+ int myRank, nProcs, i, prevProcs;
double temp;
int offset = 0;
MPI_Status status;
@@ -2009,12 +2009,12 @@ void CartesianGenerator_GenGeom( Cartesi
mesh->topo->nDims,
"Mesh::verts" );
- /* If loading from checkpoint, read mesh vertices from file */
if( context && context->restartTimestep && context->timeStep == context->restartTimestep ) {
+ /* Loading from checkpoint */
Journal_Printf( stream, "Loading mesh values from file.\n");
- MPI_Comm_rank( MPI_COMM_WORLD, &myRank );
- MPI_Comm_size( MPI_COMM_WORLD, &nProcs );
+ MPI_Comm_rank( self->mpiComm, &myRank );
+ MPI_Comm_size( self->mpiComm, &nProcs );
if ( strlen( context->checkPointPrefixString ) > 0 ) {
sprintf( meshSaveFileName, "%s/%s.Mesh.%05d.dat", context->checkpointPath,
@@ -2026,11 +2026,10 @@ void CartesianGenerator_GenGeom( Cartesi
}
if( myRank != 0 ) {
- MPI_Recv( &offset, 1, MPI_INT, myRank - 1, OFFSET_TAG, MPI_COMM_WORLD, &status );
- }
-
- FILE* meshFile = fopen( meshSaveFileName, "r" ); /*********************/
- fseek( meshFile, offset, SEEK_SET );
+ MPI_Recv( &offset, 1, MPI_INT, myRank - 1, OFFSET_TAG, self->mpiComm, &status );
+ }
+
+ FILE* meshFile = fopen( meshSaveFileName, "r" );
/*Journal_Firewall(
meshFile != 0,
errorStream,
@@ -2043,64 +2042,52 @@ void CartesianGenerator_GenGeom( Cartesi
Journal_Printf( errorStream,
"Warning - Couldn't find checkpoint mesh file with filename \"%s\".\n",
meshSaveFileName );
-
- for( n_i = 0; n_i < Sync_GetNumDomains( sync ); n_i++ ) {
- gNode = Sync_DomainToGlobal( sync, n_i );
- Grid_Lift( grid, gNode, inds );
- vert = Mesh_GetVertex( mesh, n_i );
-
- /* Calculate coordinate. */
- for( d_i = 0; d_i < mesh->topo->nDims; d_i++ ) {
- vert[d_i] = self->crdMin[d_i] +
- ((double)inds[d_i] / (double)(grid->sizes[d_i] - 1)) * steps[d_i];
- }
- }
- }
+
+ CartesianGenerator_CalcGeom( self, mesh, sync, grid, inds, steps );
+ }
else {
+ fseek( meshFile, offset, SEEK_SET );
/* Read from file */
if( myRank == 0 ) {
fscanf( meshFile, "Min: " );
for( i=0; i<self->nDims; i++ ) {
fscanf( meshFile, "%lg ", &temp );
}
- fscanf( meshFile, "\nMax: " );
+ fscanf( meshFile, "Max: " );
for( i=0; i<self->nDims; i++ ) {
fscanf( meshFile, "%lg ", &temp );
}
+ fscanf( meshFile, "nProcs: %d", &prevProcs );
}
-
- for( n_i = 0; n_i < Sync_GetNumDomains( sync ); n_i++ ) {
- gNode = Sync_DomainToGlobal( sync, n_i );
- Grid_Lift( grid, gNode, inds );
- vert = Mesh_GetVertex( mesh, n_i );
-
- for( d_i = 0; d_i < mesh->topo->nDims; d_i++ ) {
- fscanf( meshFile, "%lg ", &vert[d_i] );
+
+ if( prevProcs == nProcs ) {
+
+ /* Reload mesh vertices from file */
+ for( n_i = 0; n_i < Sync_GetNumDomains( sync ); n_i++ ) {
+ gNode = Sync_DomainToGlobal( sync, n_i );
+ Grid_Lift( grid, gNode, inds );
+ vert = Mesh_GetVertex( mesh, n_i );
+
+ for( d_i = 0; d_i < mesh->topo->nDims; d_i++ ) {
+ fscanf( meshFile, "%lg ", &vert[d_i] );
+ }
+ fscanf( meshFile, "\n" );
}
- fscanf( meshFile, "\n" );
+ offset = ftell( meshFile );
+ fclose( meshFile );
}
- offset = ftell( meshFile );
- fclose( meshFile );
+ else {
+ /* Calculate mesh vertices */
+ CartesianGenerator_CalcGeom( self, mesh, sync, grid, inds, steps );
+ }
}
if ( myRank != nProcs - 1 ) {
- MPI_Ssend( &offset, 1, MPI_INT, myRank + 1, OFFSET_TAG, MPI_COMM_WORLD );
+ MPI_Ssend( &offset, 1, MPI_INT, myRank + 1, OFFSET_TAG, self->mpiComm );
}
}
else {
- /* Loop over domain nodes. */
- for( n_i = 0; n_i < Sync_GetNumDomains( sync ); n_i++ ) {
-
- gNode = Sync_DomainToGlobal( sync, n_i );
- Grid_Lift( grid, gNode, inds );
- vert = Mesh_GetVertex( mesh, n_i );
-
- /* Calculate coordinate. */
- for( d_i = 0; d_i < mesh->topo->nDims; d_i++ ) {
- vert[d_i] = self->crdMin[d_i] +
- ((double)inds[d_i] / (double)(grid->sizes[d_i] - 1)) * steps[d_i];
- }
- }
+ CartesianGenerator_CalcGeom( self, mesh, sync, grid, inds, steps );
}
/* Free resources. */
@@ -2110,6 +2097,25 @@ void CartesianGenerator_GenGeom( Cartesi
MPI_Barrier( self->mpiComm );
Journal_Printf( stream, "... done.\n" );
Stream_UnIndent( stream );
+}
+
+void CartesianGenerator_CalcGeom( CartesianGenerator* self, Mesh* mesh, Sync* sync, Grid* grid, unsigned* inds, double* steps ) {
+ unsigned n_i, d_i;
+ double* vert;
+ unsigned gNode;
+
+ /* Loop over domain nodes. */
+ for( n_i = 0; n_i < Sync_GetNumDomains( sync ); n_i++ ) {
+ gNode = Sync_DomainToGlobal( sync, n_i );
+ Grid_Lift( grid, gNode, inds );
+ vert = Mesh_GetVertex( mesh, n_i );
+
+ /* Calculate coordinate. */
+ for( d_i = 0; d_i < mesh->topo->nDims; d_i++ ) {
+ vert[d_i] = self->crdMin[d_i] +
+ ((double)inds[d_i] / (double)(grid->sizes[d_i] - 1)) * steps[d_i];
+ }
+ }
}
void CartesianGenerator_Destruct( CartesianGenerator* self ) {
diff -r ac0983b2e608 -r 74c7b464b60b Mesh/src/CartesianGenerator.h
--- a/Mesh/src/CartesianGenerator.h Mon Mar 17 05:16:25 2008 +0000
+++ b/Mesh/src/CartesianGenerator.h Tue Mar 18 05:11:09 2008 +0000
@@ -214,6 +214,7 @@
void CartesianGenerator_MapToDomain( CartesianGenerator* self, Sync* sync,
unsigned nIncEls, unsigned* incEls );
void CartesianGenerator_GenGeom( CartesianGenerator* self, Mesh* mesh, void* data );
+ void CartesianGenerator_CalcGeom( CartesianGenerator* self, Mesh* mesh, Sync* sync, Grid* grid, unsigned* inds, double* steps );
void CartesianGenerator_Destruct( CartesianGenerator* self );
void CartesianGenerator_DestructTopology( CartesianGenerator* self );
void CartesianGenerator_DestructGeometry( CartesianGenerator* self );
More information about the CIG-COMMITS
mailing list