diff options
Diffstat (limited to 'src/GHExtension.c')
-rw-r--r-- | src/GHExtension.c | 311 |
1 files changed, 200 insertions, 111 deletions
diff --git a/src/GHExtension.c b/src/GHExtension.c index fb32503..b2bd9d2 100644 --- a/src/GHExtension.c +++ b/src/GHExtension.c @@ -15,144 +15,127 @@ #include "cctk.h" #include "pugh.h" -#include "cctk_parameters.h" +#include "cctk_Parameters.h" static char *rcsid = "$Header$"; extern int PUGH_GHExtension; -int pugh_SetupGroup(pGH *newGH, - int gtype, - int vtype, - int dim, - int n_variables, - int staggertype, - int n_timelevels); - -pGH *SetupPGH(void *callerid, - int dim, - int *nsize, - int *ghostsize); - -void *pugh_SetupGH(tFleshConfig *config, - int convergence_level, - cGH *GH) +int PUGH_SetupGroup + ( + pGH *newGH, + int *nsize, + int *nghostsize, + int gtype, + int vtype, + int dim, + int n_variables, + int staggertype, + int n_timelevels + ); + +pGH *PUGH_SetupPGH + ( + void *callerid, + int dim, + int *nsize, + int *ghostsize + ); + +int pugh_GFSize(int dim, int *nsize); +int pugh_GFGhostsize(int dim,int *ghostsize); + + +void *pugh_SetupGH + ( + tFleshConfig *config, + int convergence_level, + cGH *GH + ) { DECLARE_CCTK_PARAMETERS + int group; + int dim; + int *nsize; + int *ghostsize; + int *groupghostsize; + int *groupsize; + int dir; cGroup pgroup; pGH *newGH; - int group; - int dim; - int *nsize; - int *ghostsize; - int dir; + + /* Set up the GH */ dim = CCTK_MaxDim(); - nsize = (int *)malloc(dim*sizeof(int)); + nsize = (int *)malloc(dim*sizeof(int)); + pugh_GFSize(dim,nsize); + ghostsize = (int *)malloc(dim*sizeof(int)); + pugh_GFGhostsize(dim,ghostsize); - if (global_nsize > 0) + newGH = PUGH_SetupPGH(GH, dim, nsize, ghostsize); + if (!newGH) { - for (dir=0;dir<dim;dir++) - { - nsize[dir] = global_nsize; - } + CCTK_WARN(0,"Failed to allocate memory for a pGH"); } - else + + /* Set up groups on the GH */ + + for (group = 0; group < CCTK_NumGroups(); group++) { - if (local_nsize > 0) + CCTK_INT **size; + int i; + + CCTK_GroupData(group,&pgroup); + + /* Set the global size of the variables in the group */ + size=CCTK_GroupSizesI(group); + + if (size) { - for (dir=0;dir<dim;dir++) + groupsize = (int *)malloc(pgroup.dim*sizeof(int)); + for (i=0;i<pgroup.dim;i++) { - nsize[dir] = -local_nsize; + groupsize[i]=*size[i]; } } else { - if (dim>0) - { - if (local_nx > 0) - { - nsize[0] = -local_nx; - } - else - { - nsize[0] = global_nx; - } - } + groupsize = NULL; + } - if (dim>1) - { - if (local_ny > 0) - { - nsize[1] = -local_ny; - } - else - { - nsize[1] = global_ny; - } - } + /* Set the ghostzone size of the variables in the group */ + size=CCTK_GroupGhostsizesI(group); - if (dim>2) + if (size) + { + groupghostsize = (int *)malloc(pgroup.dim*sizeof(int)); + for (i=0;i<pgroup.dim;i++) { - if (local_nz > 0) - { - nsize[2] = -local_nz; - } - else - { - nsize[2] = global_nz; - } + groupghostsize[i]=*size[i]; } } - } - - if (ghost_size>-1) - { - for (dir=0;dir<dim;dir++) - { - ghostsize[dir] = ghost_size; - } - } - else - { - switch(dim) + else { - case 3: - ghostsize[2] = ghost_size_z; - case 2: - ghostsize[1] = ghost_size_y; - case 1: - ghostsize[0] = ghost_size_x; - default: - ; + groupghostsize = NULL; } - } - - newGH = SetupPGH(GH, dim, nsize, ghostsize); - - if(!newGH) CCTK_WARN(0,"PUGH: Failed to allocate memory for a pGH !\n"); - - for(group = 0; group < CCTK_NumGroups(); group++) - { - -#ifdef DEBUG_PUGH - printf("Calling pugh_SetupGroup for %s [%d]\n", - CCTK_GroupName(group),group); -#endif - CCTK_GroupData(group,&pgroup); - pugh_SetupGroup(newGH, + PUGH_SetupGroup(newGH, + groupsize, + groupghostsize, pgroup.grouptype, pgroup.vartype, pgroup.dim, pgroup.numvars, pgroup.stagtype, pgroup.numtimelevels); + + if (groupsize) free(groupsize); + if (groupghostsize) free(groupghostsize); } free(nsize); @@ -171,15 +154,17 @@ int pugh_InitGH(cGH *GH) int pugh_rfrTraverseGH(cGH *GH, int rfrpoint) { - int var; - int gtype; + int var; + int gtype; + int ntimelevels; + int level; + int idir; + int istag; pGH *mypGH; - int ntimelevels; - int level,idir,istag; mypGH = (pGH *)GH->extensions[PUGH_GHExtension]; - /* Fix me */ + /* FIXME */ GH->cctk_convlevel = 1; for (idir=0;idir<GH->cctk_dim;idir++) @@ -190,7 +175,7 @@ int pugh_rfrTraverseGH(cGH *GH, int rfrpoint) GH->cctk_gsh[idir] = mypGH->nsize[idir]; GH->cctk_bbox[2*idir] = mypGH->lb[mypGH->myproc][idir] == 0; GH->cctk_bbox[2*idir+1] = mypGH->ub[mypGH->myproc][idir] - == mypGH->nsize[idir]-1; + == mypGH->nsize[idir]-1; GH->cctk_lbnd[idir] = mypGH->lb[mypGH->myproc][idir]; GH->cctk_ubnd[idir] = mypGH->ub[mypGH->myproc][idir]; @@ -221,14 +206,19 @@ int pugh_rfrTraverseGH(cGH *GH, int rfrpoint) { switch(gtype) { - case GROUP_SCALAR : - GH->data[var][level] = mypGH->variables[var][level]; break; - case GROUP_GF : - GH->data[var][level] = ((pGF ***)(mypGH->variables))[var][level]->data; break; - case GROUP_ARRAY : - GH->data[var][level] = NULL; break; + case CCTK_SCALAR : + GH->data[var][level] = mypGH->variables[var][level]; + break; + case CCTK_GF : + GH->data[var][level] = + ((pGF ***)(mypGH->variables))[var][level]->data; + break; + case CCTK_ARRAY : + GH->data[var][level] = + ((pGA ***)(mypGH->variables))[var][level]->data; + break; default: - CCTK_WARN(1,"Unknown group type in pugh_rfrTraverse\n"); + CCTK_WARN(1,"Unknown group type in pugh_rfrTraverse"); } } } @@ -237,3 +227,102 @@ int pugh_rfrTraverseGH(cGH *GH, int rfrpoint) return 0; } + +int pugh_GFSize(int dim, int *nsize) +{ + + DECLARE_CCTK_PARAMETERS + + int dir; + + if (global_nsize > 0) + { + for (dir=0;dir<dim;dir++) + { + nsize[dir] = global_nsize; + } + } + else + { + if (local_nsize > 0) + { + for (dir=0;dir<dim;dir++) + { + nsize[dir] = -local_nsize; + } + } + else + { + if (dim>0) + { + if (local_nx > 0) + { + nsize[0] = -local_nx; + } + else + { + nsize[0] = global_nx; + } + } + + if (dim>1) + { + if (local_ny > 0) + { + nsize[1] = -local_ny; + } + else + { + nsize[1] = global_ny; + } + } + + if (dim>2) + { + if (local_nz > 0) + { + nsize[2] = -local_nz; + } + else + { + nsize[2] = global_nz; + } + } + } + } + USE_CCTK_PARAMETERS +} + +int pugh_GFGhostsize(int dim, int *ghostsize) +{ + + DECLARE_CCTK_PARAMETERS + + int dir; + + if (ghost_size>-1) + { + for (dir=0;dir<dim;dir++) + { + ghostsize[dir] = ghost_size; + } + } + else + { + switch(dim) + { + case 3: + ghostsize[2] = ghost_size_z; + ghostsize[1] = ghost_size_y; + ghostsize[0] = ghost_size_x; + case 2: + ghostsize[1] = ghost_size_y; + ghostsize[0] = ghost_size_x; + case 1: + ghostsize[0] = ghost_size_x; + default: + ghostsize = NULL; + } + } + USE_CCTK_PARAMETERS +} |