aboutsummaryrefslogtreecommitdiff
path: root/src/GHExtension.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/GHExtension.c')
-rw-r--r--src/GHExtension.c311
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
+}