diff options
-rw-r--r-- | src/Comm.c | 1 | ||||
-rw-r--r-- | src/SetupGroup.c | 52 | ||||
-rw-r--r-- | src/SetupPGV.c | 28 | ||||
-rw-r--r-- | src/Storage.c | 153 |
4 files changed, 133 insertions, 101 deletions
@@ -981,6 +981,7 @@ static int PUGH_SyncSingleProc(pGH *pughGH, pComm *comm) char *data; int *istart_from, *iend_from, *iterator_from; int *istart_to, *iterator_to; + int pass, num_passes, pass_total, pass_each, pass_from, pass_to; GA = (pGA *) pughGH->variables [comm->first_var][comm->sync_timelevel]; diff --git a/src/SetupGroup.c b/src/SetupGroup.c index 7a93391..fa4a922 100644 --- a/src/SetupGroup.c +++ b/src/SetupGroup.c @@ -131,36 +131,44 @@ static int PUGH_SetupGAGroup (pGH *newGH, if (gtype == CCTK_ARRAY || gtype == CCTK_SCALAR) { - /* Arrays can't (yet) have periodicity and manual setup, - so initialize them to zero */ - perme = calloc (dim, sizeof (int)); - nprocs = calloc (dim, sizeof (int)); - if (dim && ! (perme && nprocs)) + if (n_variables > 0) { - CCTK_WARN (0, "Memory allocation error in PUGH_SetupGAGroup"); - } + /* Arrays can't (yet) have periodicity and manual setup, + so initialize them to zero */ + perme = calloc (dim, sizeof (int)); + nprocs = calloc (dim, sizeof (int)); + if (dim && ! (perme && nprocs)) + { + CCTK_WARN (0, "Memory allocation error in PUGH_SetupGAGroup"); + } - PUGH_SetupDefaultTopology (dim, nprocs); + PUGH_SetupDefaultTopology (dim, nprocs); - /* Check that there are enough grid points in this dimension - * to make parallelising it worthwhile - */ - for (i = 0 ; i < dim; i++) - { - if (abs (nsize[i]) <= 2*ghostsize[i]) + /* Check that there are enough grid points in this dimension + * to make parallelising it worthwhile + */ + for (i = 0 ; i < dim; i++) { - nprocs[i] = 1; + if (abs (nsize[i]) <= 2*ghostsize[i]) + { + nprocs[i] = 1; + } } - } - connectivity = PUGH_SetupConnectivity (dim, newGH->nprocs, nprocs, perme); + connectivity = PUGH_SetupConnectivity (dim, newGH->nprocs, nprocs, perme); - extras = PUGH_SetupPGExtras (0, dim, perme, staggercode, nsize, ghostsize, - newGH->nprocs, connectivity->nprocs, - connectivity->neighbours, newGH->myproc); + extras = PUGH_SetupPGExtras (0, dim, perme, staggercode, nsize, ghostsize, + newGH->nprocs, connectivity->nprocs, + connectivity->neighbours, newGH->myproc); - free (nprocs); - free (perme); + free (nprocs); + free (perme); + } + else + { + connectivity = NULL; + extras = NULL; + } } else { diff --git a/src/SetupPGV.c b/src/SetupPGV.c index 49c87ea..b01403b 100644 --- a/src/SetupPGV.c +++ b/src/SetupPGV.c @@ -846,7 +846,7 @@ static int PUGH_SetupPGExtrasSizes(int is_gf, } else { - this->nsize[dir] = abs(sh[dir]); + this->nsize[dir] = sh[dir]; } } @@ -944,14 +944,20 @@ static int PUGH_SetupPGExtrasOwnership(int dim, /* Do sanity check for periodic BC */ if(perme[dir]) { - if (this->ownership[PUGH_VERTEXCTR][1][dir] - - this->ownership[PUGH_VERTEXCTR][0][dir] < this->nghostzones[dir]) + const int is_single_proc_in_dim + = (this->lb[this_proc][dir] == 0 + && this->ub[this_proc][dir] == this->nsize[dir]-1); + if (! is_single_proc_in_dim + && this->ownership[PUGH_VERTEXCTR][1][dir] - + this->ownership[PUGH_VERTEXCTR][0][dir] < this->nghostzones[dir]) { CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING, "Not enough interior grid points in dimension %d ! " "Please set the number of global grid points (currently " "%d) to something >= (nprocs+2) * the number of ghostzones " - "(currently (%d+2)*%d=%d) !", + "(currently (%d+2)*%d=%d), " + "or make sure that there is only one processor in this " + "dimension.", dir, this->nsize[dir], nprocs, this->nghostzones[dir], (nprocs+2) * this->nghostzones[dir]); } @@ -1256,15 +1262,15 @@ pComm *PUGH_SetupGArrayGroupComm(pGH *pughGH, #endif this->docomm = malloc (2 * dim * sizeof (int)); - if(this->buffer_sz && - this->send_buffer && - this->recv_buffer && + if((dim==0 || this->buffer_sz) && + (dim==0 || this->send_buffer) && + (dim==0 || this->recv_buffer) && #ifdef CCTK_MPI - this->sreq && - this->rreq && - this->sstatus && + (dim==0 || this->sreq) && + (dim==0 || this->rreq) && + (dim==0 || this->sstatus) && #endif - this->docomm) + (dim==0 || this->docomm)) { this->commflag = PUGH_NOCOMM; this->first_var = first_var; diff --git a/src/Storage.c b/src/Storage.c index c3f8b6f..066fe18 100644 --- a/src/Storage.c +++ b/src/Storage.c @@ -316,43 +316,52 @@ int PUGH_EnableGroupStorage (const cGH *GH, const char *groupname) { first_var = CCTK_FirstVarIndexI (group); - /* get the group info from its index */ - CCTK_GroupData (group, &pgroup); - - retval = PUGH_EnableGArrayGroupStorage (pughGH, - first_var, - pgroup.numvars, - pgroup.numtimelevels); - if (!CCTK_Equals(storage_verbose,"no") && retval == 0) + if (first_var >= 0) { - /* get GA pointer of first var in group */ - GA = (pGA *) pughGH->variables[first_var][0]; - if (pgroup.grouptype == CCTK_GF) - { - totalnumberGF += pgroup.numvars * pgroup.numtimelevels; - } - else - { - totalnumberGA += pgroup.numvars * pgroup.numtimelevels; - } - totalstorage += (GA->extras->npoints * GA->varsize * - pgroup.numtimelevels * pgroup.numvars) / - (float) (1024*1024); - if (totalstorage > maxstorage) - { - numberGF = totalnumberGF; - numberGA = totalnumberGA; - maxstorage = totalstorage; - } - /* Report on memory usage */ - if (CCTK_Equals(storage_verbose,"yes")) + /* get the group info from its index */ + CCTK_GroupData (group, &pgroup); + + retval = PUGH_EnableGArrayGroupStorage (pughGH, + first_var, + pgroup.numvars, + pgroup.numtimelevels); + if (!CCTK_Equals(storage_verbose,"no") && retval == 0) { - CCTK_VInfo (CCTK_THORNSTRING, "Switched memory on for group '%s'" - " [GFs: %d GAs: %d Total Size: %6.2fMB]", - groupname, totalnumberGF, totalnumberGA, totalstorage); + /* get GA pointer of first var in group */ + GA = (pGA *) pughGH->variables[first_var][0]; + if (pgroup.grouptype == CCTK_GF) + { + totalnumberGF += pgroup.numvars * pgroup.numtimelevels; + } + else + { + totalnumberGA += pgroup.numvars * pgroup.numtimelevels; + } + totalstorage += (GA->extras->npoints * GA->varsize * + pgroup.numtimelevels * pgroup.numvars) / + (float) (1024*1024); + if (totalstorage > maxstorage) + { + numberGF = totalnumberGF; + numberGA = totalnumberGA; + maxstorage = totalstorage; + } + + /* Report on memory usage */ + if (CCTK_Equals(storage_verbose,"yes")) + { + CCTK_VInfo (CCTK_THORNSTRING, "Switched memory on for group '%s'" + " [GFs: %d GAs: %d Total Size: %6.2fMB]", + groupname, totalnumberGF, totalnumberGA, totalstorage); + } } } + else + { + /* don't know what to say here; 0 seems safe */ + retval = 0; + } } else @@ -956,28 +965,32 @@ int PUGH_GroupStorageIncrease(const cGH *GH, int n_groups,const int *groups,cons first_var = CCTK_FirstVarIndexI (groups[group]); - /* Enable all timelevels or just some */ - if(timelevels[group] == -1) + if (first_var >= 0) { - tlevels = pgroup.numtimelevels; - } - else - { - tlevels = timelevels[group]; - } - previous = PUGHi_EnableGArrayGroupStorage (pughGH, - first_var, - pgroup.numvars, - pgroup.numtimelevels, - tlevels); + /* Enable all timelevels or just some */ + if(timelevels[group] == -1) + { + tlevels = pgroup.numtimelevels; + } + else + { + tlevels = timelevels[group]; + } + + previous = PUGHi_EnableGArrayGroupStorage (pughGH, + first_var, + pgroup.numvars, + pgroup.numtimelevels, + tlevels); - if(status) - { - status[group] = previous; - } + if(status) + { + status[group] = previous; + } - retval += previous; + retval += previous; + } } } @@ -1066,28 +1079,32 @@ int PUGH_GroupStorageDecrease(const cGH *GH, int n_groups,const int *groups,cons first_var = CCTK_FirstVarIndexI (groups[group]); - /* Disable all timelevels or just some */ - if(timelevels[group] == -1) + if (first_var >= 0) { - tlevels = 0; - } - else - { - tlevels = timelevels[group]; - } - previous = PUGHi_DisableGArrayGroupStorage (pughGH, - first_var, - pgroup.numvars, - pgroup.numtimelevels, - tlevels); + /* Disable all timelevels or just some */ + if(timelevels[group] == -1) + { + tlevels = 0; + } + else + { + tlevels = timelevels[group]; + } - if(status) - { - status[group] = previous; - } + previous = PUGHi_DisableGArrayGroupStorage (pughGH, + first_var, + pgroup.numvars, + pgroup.numtimelevels, + tlevels); + + if(status) + { + status[group] = previous; + } - retval += previous; + retval += previous; + } } } |