aboutsummaryrefslogtreecommitdiff
path: root/src/Comm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/Comm.c')
-rw-r--r--src/Comm.c373
1 files changed, 215 insertions, 158 deletions
diff --git a/src/Comm.c b/src/Comm.c
index cda777e..78f8571 100644
--- a/src/Comm.c
+++ b/src/Comm.c
@@ -7,7 +7,8 @@
@enddesc
@@*/
-/*#define DEBUG_COMM*/
+/*#define DEBUG_PUGH*/
+
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
@@ -22,8 +23,17 @@
extern int PUGH_GHExtension;
/* local function prototypes */
-int pugh_SyncGroupArray (cGH *GH, int group, int vtype, int n_vars, int timelevel);
-int pugh_SyncGroupGF (cGH *GH, int group, int vtype, int n_vars, int timelevel);
+
+int pugh_SyncGroupArray (cGH *GH,
+ int group,
+ int vtype,
+ int n_vars,
+ int timelevel);
+int pugh_SyncGroupGF (cGH *GH,
+ int group,
+ int vtype,
+ int n_vars,
+ int timelevel);
int pugh_SyncGFs(pGH *pughGH, int first_var, int n_vars, int timelevel);
void DisableGFDataStorage(pGH *GH, pGF *GF);
void EnableGFDataStorage(pGH *GH, pGF *GF);
@@ -55,6 +65,7 @@ void pGF_FinishRecv(pGH *GH, pGF *GF, int dir);
void pGF_PostRecv(pGH *GH, pGF *GF, int dir);
void pGF_PostSend(pGH *GH, pGF *GF, int dir);
void SetGFComm(pGH *GH, pGF *res, int docomm);
+int pugh_GAComm(pGA *GA, int docomm);
/*@@
@routine pugh_SyncGroup
@@ -90,16 +101,6 @@ int pugh_SyncGroup (cGH *GH, const char *groupname)
group = CCTK_GroupIndex(groupname);
- if (group < 0) {
- char *msg;
-
- msg = (char *) malloc (strlen (groupname) + 80);
- sprintf (msg, "Unknown group \"%s\" in pugh_SyncGroup", groupname);
- CCTK_WARN (1, msg);
- free (msg);
- return (0);
- }
-
/* get the group info from its index */
CCTK_GroupData (group,&pgroup);
@@ -116,11 +117,11 @@ int pugh_SyncGroup (cGH *GH, const char *groupname)
break;
case GROUP_ARRAY :
- rc = pugh_SyncGroupArray (GH,
- group,
- pgroup.vartype,
- pgroup.numvars,
- timelevel);
+ /* rc = pugh_SyncGA (GH,
+ group,
+ pgroup.vartype,
+ pgroup.numvars,
+ timelevel);*/
rc = 1;
break;
@@ -181,18 +182,11 @@ int *pugh_ArrayGroupSize (cGH *GH, int dir, int group, const char *groupname)
int *sizep;
pGH *pughGH;
pGF *pughGF;
+ pGA *pughGA;
if (groupname)
{
group = CCTK_GroupIndex(groupname);
-
- if (group < 0) {
- char *msg;
- msg = (char *) malloc (strlen (groupname) + 80);
- sprintf (msg, "Unknown group \"%s\" in pugh_ArrayGroupSize", groupname);
- CCTK_WARN (1, msg);
- free (msg);
- }
}
/* get PUGH extension handle */
@@ -200,33 +194,65 @@ int *pugh_ArrayGroupSize (cGH *GH, int dir, int group, const char *groupname)
/* get first variable in group */
first = CCTK_FirstVarIndexI(group);
-
- /* get pointer to pGF for a timelevel of this variable */
- pughGF = (pGF *)(pughGH->variables[first][0]);
- if (pughGF->storage == PUGH_STORAGE)
+ if (CCTK_GroupTypeI(group)==GROUP_GF)
{
- switch (dir)
+ /* get pointer to pGF for a timelevel of this variable */
+ pughGF = (pGF *)(pughGH->variables[first][0]);
+
+ if (pughGF->storage == PUGH_STORAGE)
+ {
+ switch (dir)
+ {
+ case 0:
+ sizep = &pughGH->lnsize[0];
+ break;
+ case 1:
+ sizep = &pughGH->lnsize[1];
+ break;
+ case 2:
+ sizep = &pughGH->lnsize[2];
+ break;
+ default :
+ sizep = NULL;
+ printf("Wrong value for dir in pugh_ArrayGroupSize\n");
+ break;
+ }
+ }
+ else
+ {
+ sizep = &_cctk_one;
+ }
+ }
+ else if (CCTK_GroupTypeI(group)==GROUP_ARRAY)
{
- case 0:
- sizep = &pughGH->lnsize[0];
- break;
- case 1:
- sizep = &pughGH->lnsize[1];
- break;
- case 2:
- sizep = &pughGH->lnsize[2];
- break;
- default :
- sizep = NULL;
- printf("Wrong value for dir in pugh_ArrayGroupSize\n");
- break;
+ /* get pointer to pGF for a timelevel of this variable */
+ pughGA = (pGA *)(pughGH->variables[first][0]);
+
+ if (pughGA->storage == PUGH_STORAGE)
+ {
+ switch (dir)
+ {
+ case 0:
+ sizep = &pughGA->extras->lnsize[0];
+ break;
+ case 1:
+ sizep = &pughGA->extras->lnsize[1];
+ break;
+ case 2:
+ sizep = &pughGA->extras->lnsize[2];
+ break;
+ default :
+ sizep = NULL;
+ printf("Wrong value for dir in pugh_ArrayGroupSize\n");
+ break;
+ }
+ }
+ else
+ {
+ sizep = &_cctk_one;
+ }
}
- }
- else
- {
- sizep = &_cctk_one;
- }
return (sizep);
@@ -265,35 +291,17 @@ int *pugh_ArrayGroupSize (cGH *GH, int dir, int group, const char *groupname)
int pugh_QueryGroupStorage(cGH *GH, int group, const char *groupname)
{
- int first;
+
+ int first,storage;
int retval;
- int group_from_name;
+ int grouptype;
pGH *pughGH;
- pGF *pughGF;
if (groupname)
{
- group_from_name = CCTK_GroupIndex(groupname);
-
- if (group>=0 && group_from_name != group)
- {
- CCTK_WARN(1,"Name and Index differ in pugh_QueryGroupStorage, using name");
- }
-
- group = group_from_name;
-
- if (group < 0) {
- char *msg;
- msg = (char *) malloc (strlen (groupname) + 80);
- sprintf (msg, "Unknown group \"%s\" in pugh_QueryGroupStorage", groupname);
- CCTK_WARN (1, msg);
- free (msg);
- }
+ group = CCTK_GroupIndex(groupname);
}
- /* get PUGH extension handle */
- pughGH = (pGH *) GH->extensions [PUGH_GHExtension];
-
/* get first variable in group */
first = CCTK_FirstVarIndexI(group);
if (first < 0) {
@@ -304,43 +312,36 @@ int pugh_QueryGroupStorage(cGH *GH, int group, const char *groupname)
free (msg);
}
- /* scalars have always storage assigned */
- if (CCTK_GroupTypeFromVarI (first) == GROUP_SCALAR)
- return (1);
+ /* get PUGH extension handle */
+ pughGH = (pGH *) GH->extensions [PUGH_GHExtension];
- /* get pointer to pGF for a timelevel of this variable */
- pughGF = (pGF *)(pughGH->variables[first][0]);
+ grouptype = CCTK_GroupTypeI(group);
- if (pughGF->storage == PUGH_STORAGE)
+ if (grouptype == CCTK_SCALAR)
{
+ storage = PUGH_STORAGE;
+ }
+ else if (grouptype==CCTK_GF)
+ {
+ storage = ((pGF *)(pughGH->variables[first][0]))->storage;
+ }
+ else if (grouptype==CCTK_ARRAY)
+ {
+ storage = ((pGA *)(pughGH->variables[first][0]))->storage;
+ }
-#ifdef DEBUG_COMM
- printf("--------------------------------------------------------------\n");
- printf("In QueryGroupStorage\n");
- printf("--------------------\n");
- printf(" Storage assigned for %s\n",groupname);
- printf("--------------------------------------------------------------\n");
-#endif
-
+ if (storage == PUGH_STORAGE)
+ {
retval = 1;
}
- else if (pughGF->storage == PUGH_NOSTORAGE)
+ else if (storage == PUGH_NOSTORAGE)
{
-
-#ifdef DEBUG_COMM
- printf("--------------------------------------------------------------\n");
- printf("In QueryGroupStorage\n");
- printf("--------------------\n");
- printf(" Storage NOT assigned for %s\n",groupname);
- printf("--------------------------------------------------------------\n");
-#endif
-
retval = 0;
}
else
{
CCTK_WARN(0,"Inconsistency in pugh_QueryGroupStorage");
- retval = -1;
+ retval = PUGH_ERROR;
}
return (retval);
@@ -386,26 +387,16 @@ int pugh_EnableGroupStorage(cGH *GH, const char *groupname)
group = CCTK_GroupIndex(groupname);
- if (group < 0) {
- char *msg;
-
- msg = (char *) malloc (strlen (groupname) + 80);
- sprintf (msg, "Unknown group \"%s\" in pugh_EnableGroupStorage", groupname);
- CCTK_WARN (1, msg);
- free (msg);
- return (0);
- }
-
/* get the group info from its index */
CCTK_GroupData (group, &pgroup);
/* branch to "enable storage" function according to group type */
switch (pgroup.grouptype) {
- case GROUP_SCALAR :
+ case CCTK_SCALAR :
rc = 1;
break;
- case GROUP_ARRAY :
+ case CCTK_ARRAY :
rc = pugh_EnableArrayGroupStorage (GH,
group,
pgroup.vartype,
@@ -414,7 +405,7 @@ int pugh_EnableGroupStorage(cGH *GH, const char *groupname)
pgroup.numtimelevels);
break;
- case GROUP_GF :
+ case CCTK_GF :
rc = pugh_EnableGFGroupStorage (GH,
group,
pgroup.vartype,
@@ -470,21 +461,12 @@ int pugh_DisableGroupStorage(cGH *GH, const char *groupname)
group = CCTK_GroupIndex(groupname);
- if (group < 0) {
- char *msg;
-
- msg = (char *) malloc (strlen (groupname) + 80);
- sprintf (msg, "Unknown group \"%s\" in pugh_DisableGroupStorage", groupname);
- CCTK_WARN (1, msg);
- free (msg);
- return (0);
- }
-
/* get the group info from its index */
CCTK_GroupData (group,&pgroup);
- /* branch to "disable storage" function according to group type */
- switch (pgroup.grouptype) {
+ switch (pgroup.grouptype)
+ {
+
case GROUP_SCALAR :
rc = 1;
break;
@@ -549,19 +531,8 @@ int pugh_EnableGroupComm (cGH *GH, const char *groupname)
int first_var; /* global index of first variable in group */
int rc; /* return code */
-
group = CCTK_GroupIndex(groupname);
- if (group < 0) {
- char *msg;
-
- msg = (char *) malloc (strlen (groupname) + 80);
- sprintf (msg, "Unknown group \"%s\" in pugh_EnableGroupComm", groupname);
- CCTK_WARN (1, msg);
- free (msg);
- return (0);
- }
-
/* get the group info from its index */
CCTK_GroupData (group,&pgroup);
@@ -572,20 +543,33 @@ int pugh_EnableGroupComm (cGH *GH, const char *groupname)
pughGH = (pGH *) GH->extensions [PUGH_GHExtension];
/* branch to "enable comm" function according to group type */
- switch (pgroup.grouptype) {
+ switch (pgroup.grouptype)
+ {
case GROUP_SCALAR :
rc = 1;
break;
case GROUP_ARRAY :
- CCTK_WARN (1, "GROUP_ARRAY type not yet supported in pugh_EnableGroupComm");
+ for (var = first_var; var < first_var+pgroup.numvars; var++)
+ {
+ for (level = 0; level < pgroup.numtimelevels; level++)
+ {
+ pugh_GAComm ((pGA *)(pughGH->variables[var][level]),
+ PUGH_ALLCOMM);
+ }
+ }
rc = 1;
break;
case GROUP_GF :
for (var = first_var; var < first_var+pgroup.numvars; var++)
+ {
for (level = 0; level < pgroup.numtimelevels; level++)
- SetGFComm (pughGH, (pGF *)(pughGH->variables[var][level]), PUGH_ALLCOMM);
+ {
+ SetGFComm (pughGH, (pGF *)(pughGH->variables[var][level]),
+ PUGH_ALLCOMM);
+ }
+ }
rc = 1;
break;
@@ -625,7 +609,7 @@ int pugh_EnableGroupComm (cGH *GH, const char *groupname)
int pugh_DisableGroupComm(cGH *GH, const char *groupname)
{
int group; /* group index */
- cGroup pgroup; /* pointer to group information */
+ cGroup pgroup; /* pointer to group information */
pGH *pughGH; /* PUGH extension reference */
int var, level; /* loop variables */
int first_var; /* global index of first variable in group */
@@ -633,16 +617,6 @@ int pugh_DisableGroupComm(cGH *GH, const char *groupname)
group = CCTK_GroupIndex(groupname);
- if (group < 0) {
- char *msg;
-
- msg = (char *) malloc (strlen (groupname) + 80);
- sprintf (msg, "Unknown group \"%s\" in pugh_DisableGroupComm", groupname);
- CCTK_WARN (1, msg);
- free (msg);
- return (0);
- }
-
/* get the group info from its index */
CCTK_GroupData (group,&pgroup);
@@ -653,13 +627,22 @@ int pugh_DisableGroupComm(cGH *GH, const char *groupname)
pughGH = (pGH *) GH->extensions [PUGH_GHExtension];
/* branch to "disable comm" function according to group type */
- switch (pgroup.grouptype) {
+ switch (pgroup.grouptype)
+ {
+
case GROUP_SCALAR :
rc = 1;
break;
case GROUP_ARRAY :
- CCTK_WARN (1, "GROUP_ARRAY type not yet supported in pugh_DisableGroupComm");
+ for (var = first_var; var < first_var+pgroup.numvars; var++)
+ {
+ for (level = 0; level < pgroup.numtimelevels; level++)
+ {
+ pugh_GAComm ((pGA *)(pughGH->variables[var][level]),
+ PUGH_NOCOMM);
+ }
+ }
rc = 1;
break;
@@ -746,7 +729,7 @@ int pugh_SyncGroupArray (cGH *GH, int group, int vtype, int n_vars, int timeleve
}
/*@@
- @routine pugh_SyncGroupGF
+ @routine pugh_SyncGroup
@author Paul Walker
@date March 1997
@desc
@@ -827,7 +810,8 @@ int pugh_SyncGroupGF (cGH *GH, int group, int vtype, int n_vars, int timelevel)
int first_var = CCTK_FirstVarIndexI (group);
/* Say which grid functions will actually be synchronised */
- if (pughGH->sync_verbose && pughGH->myproc == 0) {
+ if (pughGH->sync_verbose && pughGH->myproc == 0)
+ {
char *gname = CCTK_GroupName (group);
printf("Syncing %d grid functions in group %s\n", n_vars, gname);
@@ -1001,7 +985,86 @@ int pugh_EnableArrayGroupStorage(cGH *GH,
int n_variables,
int n_timelevels)
{
- return 0;
+ int nstorage; /* Number of Arrays for which storage was set */
+ int nnostorage; /* Number of Arrays for which no storage was set */
+ int retval;
+ int first_var;
+ int var;
+ pGH *mypGH;
+ pGA *GA;
+ int level;
+ int zero_memory=0;
+ int padding_active=0;
+ int padding_cacheline_bits=0;
+ int padding_size=0;
+ int padding_address_spacing=0;
+
+ nstorage = 0;
+ nnostorage = 0;
+
+ mypGH = (pGH *)GH->extensions[PUGH_GHExtension];
+
+ first_var = CCTK_FirstVarIndexI(group);
+
+ for(var = first_var; var < first_var+n_variables; var++)
+ {
+ for(level = 0; level < n_timelevels; level++)
+ {
+ GA = (pGA *)(mypGH->variables[var][level]);
+
+ if(!GA->storage)
+ {
+#ifdef DEBUG_PUGH
+ {
+ const char *name;
+ name = CCTK_FullName(var);
+ printf("Storage on in pugh_EnableArrayGroupStorage for %s\n",name);
+ }
+#endif
+ pugh_EnablePGAStorage
+ (
+ GA,
+ mypGH->myproc,
+ zero_memory,
+ padding_active,
+ padding_cacheline_bits,
+ padding_size,
+ padding_address_spacing
+ );
+
+ GH->data[var][level] = GA->data;
+
+ nnostorage++;
+ }
+ else
+ {
+ GH->data[var][level] = GA->data;
+ nstorage++;
+ }
+ }
+ }
+
+ if (nstorage > 0 && nnostorage > 0)
+ {
+ CCTK_WARN(0,"Group storage violation in pugh_EnableArrayGroupStorage");
+ retval = -1;
+ }
+ else if (nstorage > 0)
+ {
+ retval = 1;
+ }
+ else if (nnostorage > 0)
+ {
+ retval = 0;
+ }
+ else
+ {
+ CCTK_WARN(0,"Problem in pugh_EnableArrayGroupStorage");
+ retval = -1;
+ }
+
+ return retval;
+
}
@@ -1044,15 +1107,12 @@ int pugh_EnableGFGroupStorage(cGH *GH,
}
#endif
EnableGFDataStorage(mypGH,GF);
-
GH->data[var][level] = GF->data;
-
nnostorage++;
}
else
{
- GH->data[var][level] = GF->data;
-
+ GH->data[var][level] = GF->data;
nstorage++;
}
}
@@ -1121,7 +1181,6 @@ int pugh_DisableGFGroupStorage(cGH *GH,
{
GF = (pGF *)(mypGH->variables[var][level]);
-
if(GF->storage)
{
#ifdef DEBUG_PUGH
@@ -1132,7 +1191,6 @@ int pugh_DisableGFGroupStorage(cGH *GH,
printf(" for %s\n",gfname);
}
#endif
-
DisableGFDataStorage(mypGH,GF);
number_disabled++;
GH->data[var][level] = GF->data;
@@ -1178,7 +1236,6 @@ int pugh_MyProc(cGH *GH)
#ifdef MPI
pGH *pughGH;
-
pughGH = (pGH *) GH->extensions [PUGH_GHExtension];
CACTUS_MPI_ERROR(MPI_Comm_rank(pughGH->PUGH_COMM_WORLD, &myproc));
#else