Ejemplo n.º 1
0
int SetCartSymGI(cGH *GH, int *sym, int gi) 
{
  
  DECLARE_CCTK_PARAMETERS

  int domainsym[MAX_FACE];
  SymmetryGHex *sGHex; 
  int first_vari,numvars,vi;
  int dir;
  
  sGHex  = (SymmetryGHex *)GH->extensions[CCTK_GHExtensionHandle("Symmetry")];

  first_vari = CCTK_FirstVarIndexI(gi);
  numvars    = CCTK_NumVarsInGroupI(gi);

  if (first_vari<0)
  {
    CCTK_VWarn(1,__LINE__,__FILE__,CCTK_THORNSTRING,
	       "Cannot find group %s (grp.index: %d) in SetCartSymGI",
	       CCTK_GroupName(gi),first_vari);
    return(-1);
  }

  /* Reference the hash table in the GHex and tell it what kind of
     symmetry is being applied 
     (depending on sym and the grid layout) 
     If there is no symmetry necessary,set ESYM_NOSYM
     When we apply a symmetry and find ESYM_UNSET, something went wrong! 
   */
  for (vi=first_vari; vi<first_vari+numvars; vi++) 
  {

#ifdef SYM_DEBUG
    printf("SetSymmetry: %s   [%d,%d,%d]\n",CCTK_VarName(vi), 
	   sym[0],sym[1],sym[2]);
#endif
    
    DecodeSymParameters3D (domainsym);
    for (dir=0; dir<MAX_FACE; dir++) 
    {
      if (domainsym[dir]) 
      {
	sGHex->GFSym[vi][dir] = sym[dir/2];
      }
      else 
      {
	sGHex->GFSym[vi][dir] = GFSYM_NOSYM;
      }
    }

#ifdef SYM_DEBUG
    printf("SetSymmetry: %s   [%d,%d,%d]\n\n",imp_gf, 
	   sGHex->GFSym[vi][0],
	   sGHex->GFSym[vi][2],
	   sGHex->GFSym[vi][4]);
#endif
  }
  USE_CCTK_PARAMETERS;   return(0);
}
Ejemplo n.º 2
0
 /*@@
   @routine    CCTK_SyncGroupI
   @date       Thu Sep  18 14:27:18 1999
   @author     Gerd Lanfermann
   @desc
               Synchronizes a group given by its index.
   @enddesc
   @calls      CCTK_GroupName
               CCTK_SyncGroup

   @var        GH
   @vdesc      Pointer to Grid Hierachy
   @vtype      cGH *
   @vio        in
   @endvar
   @var        group
   @vdesc      group index
   @vtype      int
   @vio        in
   @endvar

   @returntype int
   @returndesc
                0 for success, or<BR>
               -1 if an invalid group was given,<BR>
               -2 if driver returned an error on syncing the group
   @endreturndesc
@@*/
int CCTK_SyncGroupI (cGH *GH, int group)
{
  int retval;
  char *groupname;


  retval = -1;
  groupname = CCTK_GroupName (group);
  if (groupname)
  {
    retval = CCTK_SyncGroup (GH, groupname);
    if (retval)
    {
      retval = -2;
    }
    free (groupname);
  }

  return (retval);
}
Ejemplo n.º 3
0
 /*@@
   @routine    PUGH_DestroyPGH
   @date       Thu Aug 21 11:38:10 1997
   @author     Paul Walker
   @desc
               Destroys a GH object.
   @enddesc

   @var        GHin
   @vdesc      address of PUGH GH extensions object to be destroyed
   @vtype      pGH **
   @vio        in
   @endvar
@@*/
void PUGH_DestroyPGH (pGH **GHin)
{
  pGH    *GH;
  pGA    *GA;
  cGroup pgroup;
  int i;
  int variable;
  int group;
  int this_var;


  GH = *GHin;

#ifdef CCTK_MPI
  CACTUS_MPI_ERROR (MPI_Comm_free (&GH->PUGH_COMM_WORLD));

  CACTUS_MPI_ERROR (MPI_Type_free (&GH->PUGH_mpi_complex));
#ifdef CCTK_REAL4
  CACTUS_MPI_ERROR (MPI_Type_free (&GH->PUGH_mpi_complex8));
#endif
#ifdef CCTK_REAL8
  CACTUS_MPI_ERROR (MPI_Type_free (&GH->PUGH_mpi_complex16));
#endif
#ifdef CCTK_REAL16
  CACTUS_MPI_ERROR (MPI_Type_free (&GH->PUGH_mpi_complex32));
#endif
#endif

  /* Great. Now go about the work of destroying me. */
  variable = 0;
  for(group = 0; group < CCTK_NumGroups(); group++)
  {
#ifdef DEBUG_PUGH
    printf("Calling Destroying Group %s\n", CCTK_GroupName(group));
    fflush(stdout);
#endif

    CCTK_GroupData(group,&pgroup);

    if (pgroup.grouptype == CCTK_ARRAY || pgroup.grouptype == CCTK_GF)
    {
      GA = (pGA *) GH->variables[variable][0];

      /* Destroy group comm buffers */
      if (GA->groupcomm)
      {
        if (GA->groupcomm->commflag != PUGH_NOCOMM)
        {
          PUGH_DisableGArrayGroupComm (GH, variable, GA->groupcomm);
        }
        PUGH_DestroyComm (&GA->groupcomm);
      }

      /* Destroy the group's connectivity and extras structure
         for CCTK_ARRAY groups.
         Remember that the connectivity and extras for CCTK_GF types
         are shared between all such groups and are destroyed later. */
      if (GA->connectivity != GH->Connectivity[pgroup.dim-1])
      {
        PUGH_DestroyConnectivity (&GA->connectivity);
      }
      if (GA->extras != GH->GFExtras[pgroup.dim-1])
      {
        PUGH_DestroyPGExtras (&GA->extras);
      }
    }

    for (this_var = 0; this_var < pgroup.numvars; this_var++, variable++)
    {
      for(i = 0 ; i < pgroup.numtimelevels; i++)
      {
        switch(pgroup.grouptype)
        {
          case CCTK_GF:
          case CCTK_ARRAY:
            PUGH_DestroyGArray(&(((pGA ***)GH->variables)[variable][i]));
            break;
          case CCTK_SCALAR:
            if (GH->variables[variable][i])
            {
              free(GH->variables[variable][i]);
            }
            break;
        }
      }
      free(GH->variables[variable]);
    }
  }

  for (i=1;i<=GH->dim;i++)
  {
    PUGH_DestroyConnectivity(&GH->Connectivity[i-1]);
    PUGH_DestroyPGExtras(&GH->GFExtras[i-1]);
  }

  if(GH->identity_string)
  {
    free(GH->identity_string);
  }
  free(GH->Connectivity);
  free(GH->GFExtras);
  free(GH->variables);
  free(GH);
  *GHin = NULL;
}