aboutsummaryrefslogtreecommitdiff
path: root/src/CartGrid3D.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/CartGrid3D.c')
-rw-r--r--src/CartGrid3D.c355
1 files changed, 141 insertions, 214 deletions
diff --git a/src/CartGrid3D.c b/src/CartGrid3D.c
index 5e0e7bb..3d2fd5c 100644
--- a/src/CartGrid3D.c
+++ b/src/CartGrid3D.c
@@ -10,6 +10,7 @@
/*#define CCTK_DEBUG*/
+#include <assert.h>
#include <stdio.h>
#include <math.h>
@@ -17,18 +18,11 @@
#include "cctk_Arguments.h"
#include "cctk_Parameters.h"
-static char *rcsid = "$Header$";
+static const char *rcsid = "$Header$";
CCTK_FILEVERSION(CactusBase_CartGrid3D_CartGrid3D_c)
-void bitant_byspacing(CCTK_ARGUMENTS,
- CCTK_REAL this_dx,
- CCTK_REAL this_dy,
- CCTK_REAL this_dz,
- CCTK_REAL *x_origin,
- CCTK_REAL *y_origin,
- CCTK_REAL *z_origin);
-
+void DecodeSymParameters3D(int sym[6]);
#define max(a,b) ((a) > (b) ? (a) : (b))
#define SQR(a) ((a)*(a))
@@ -46,29 +40,21 @@ void CartGrid3D(CCTK_ARGUMENTS)
CCTK_REAL lowerx,upperx,lowery,uppery,lowerz,upperz;
char infoline[120];
+ int domainsym[6];
int cntstag[3];
- /* default: not staggered */
- cntstag[0]=0;
- cntstag[1]=0;
- cntstag[2]=0;
-
- /* stagger around origin, if... */
- if (no_origin)
- {
- cntstag[0]=1;
- cntstag[1]=1;
- cntstag[2]=1;
- }
- else
- {
- if (no_originx) cntstag[0] = 1;
- if (no_originy) cntstag[1] = 1;
- if (no_originz) cntstag[2] = 1;
- }
-
- iconv = pow(2, cctk_convlevel);
+ int dir;
+ /* Avoid origin? Default is yes */
+ cntstag[0] = no_origin && no_originx && avoid_origin && avoid_originx;
+ cntstag[1] = no_origin && no_originy && avoid_origin && avoid_originy;
+ cntstag[2] = no_origin && no_originz && avoid_origin && avoid_originz;
+
+ iconv = rint(pow(2, cctk_convlevel));
+
+ /* Determine symmetries of domain */
+ DecodeSymParameters3D(domainsym);
+
/****************************************************************
*
* BYRANGE
@@ -77,103 +63,109 @@ void CartGrid3D(CCTK_ARGUMENTS)
* the number of gridpoints on the coarse grid
*
***************************************************************/
+ /**************************************************************
+ *
+ * BOX (-0.5 to 0.5)
+ *
+ * User gives: number of gridpoints on the coarse grid
+ *
+ **************************************************************/
- if (CCTK_Equals(type,"byrange"))
- {
-
- if (xyzmax != -424242)
- {
- xmax1 = xyzmax;
- ymax1 = xyzmax;
- zmax1 = xyzmax;
- }
- else
- {
- xmax1 = xmax;
- ymax1 = ymax;
- zmax1 = zmax;
- }
-
- if (xyzmin != -424242)
+ if (CCTK_Equals(type,"byrange") || CCTK_Equals(type,"box"))
+ {
+
+ if (CCTK_Equals(type,"box"))
{
- xmin1 = xyzmin;
- ymin1 = xyzmin;
- zmin1 = xyzmin;
+
+ /* Coordinates are all -0.5 to 0.5 */
+ xmax1 = 0.5;
+ ymax1 = 0.5;
+ zmax1 = 0.5;
+
+ xmin1 = -0.5;
+ ymin1 = -0.5;
+ zmin1 = -0.5;
+
}
else
{
- xmin1 = xmin;
- ymin1 = ymin;
- zmin1 = zmin;
- }
-
-
-
- if (CCTK_Equals(domain,"octant"))
- {
-
- /* Grid spacing on coarsest grid */
- if (cntstag[0]==1)
- *coarse_dx = xmax1/(cctk_gsh[0]-1.5);
- else
- *coarse_dx = xmax1/(cctk_gsh[0]-cctk_nghostzones[0]-1.0);
-
- if (cntstag[1]==1)
- *coarse_dy = ymax1/(cctk_gsh[1]-1.5);
- else
- *coarse_dy = ymax1/(cctk_gsh[1]-cctk_nghostzones[1]-1.0);
-
- if (cntstag[2]==1)
- *coarse_dz = zmax1/(cctk_gsh[2]-1.5);
- else
- *coarse_dz = zmax1/(cctk_gsh[2]-cctk_nghostzones[2]-1.0);
-
- /* Grid spacing on this grid */
- this_dx = *coarse_dx;
- this_dy = *coarse_dy;
- this_dz = *coarse_dz;
- /* Minimum coordinate values on this grid */
- if (cntstag[0]==1)
- x_origin = (0.5-cctk_nghostzones[0])*this_dx;
+ if (xyzmax != -424242)
+ {
+ xmax1 = xyzmax;
+ ymax1 = xyzmax;
+ zmax1 = xyzmax;
+ }
else
- x_origin = (-cctk_nghostzones[0])*this_dx;
- if (cntstag[1]==1)
- y_origin = (0.5-cctk_nghostzones[1])*this_dy;
- else
- y_origin = (-cctk_nghostzones[1])*this_dy;
- if (cntstag[2]==1)
- z_origin = (0.5-cctk_nghostzones[2])*this_dz;
+ {
+ xmax1 = xmax;
+ ymax1 = ymax;
+ zmax1 = zmax;
+ }
+
+ if (xyzmin != -424242)
+ {
+ xmin1 = xyzmin;
+ ymin1 = xyzmin;
+ zmin1 = xyzmin;
+ }
else
- z_origin = (-cctk_nghostzones[2])*this_dz;
+ {
+ xmin1 = xmin;
+ ymin1 = ymin;
+ zmin1 = zmin;
+ }
}
- else if (CCTK_Equals(domain,"quadrant"))
- {
- fprintf(stderr, "FIXME");
- }
- else if (CCTK_Equals(domain,"bitant"))
- {
- fprintf(stderr, "FIXME");
- }
- else if (CCTK_Equals(domain,"full"))
- {
- /* Set minimum values of coordinates */
+
+
+ /* Grid spacing on coarsest grid */
+ /* TODO: Put the coordinates into arrays, and loop over the
+ dimensions. That gets ride of all the triplicated code. */
+ if (domainsym[0]) {
+ if (cntstag[0]) {
+ *coarse_dx = xmax1 / (cctk_gsh[0] - cctk_nghostzones[0] - 0.5);
+ x_origin = - (cctk_nghostzones[0] - 0.5) * *coarse_dx * iconv;
+ } else {
+ *coarse_dx = xmax1 / (cctk_gsh[0] - cctk_nghostzones[0] - 1);
+ x_origin = - cctk_nghostzones[0] * *coarse_dx * iconv;
+ }
+ } else {
+ *coarse_dx = (xmax1 - xmin1) / max(cctk_gsh[0] - 1, 1);
x_origin = xmin1;
+ }
+
+ if (domainsym[2]) {
+ if (cntstag[1]) {
+ *coarse_dy = ymax1 / (cctk_gsh[1] - cctk_nghostzones[1] - 0.5);
+ y_origin = - (cctk_nghostzones[1] - 0.5) * *coarse_dy * iconv;
+ } else {
+ *coarse_dy = ymax1 / (cctk_gsh[1] - cctk_nghostzones[1] - 1);
+ y_origin = - cctk_nghostzones[1] * *coarse_dy * iconv;
+ }
+ } else {
+ *coarse_dy = (ymax1 - ymin1) / max(cctk_gsh[1] - 1, 1);
y_origin = ymin1;
+ }
+
+ if (domainsym[4]) {
+ if (cntstag[2]) {
+ *coarse_dz = zmax1 / (cctk_gsh[2] - cctk_nghostzones[2] - 0.5);
+ z_origin = - (cctk_nghostzones[2] - 0.5) * *coarse_dz * iconv;
+ } else {
+ *coarse_dz = zmax1 / (cctk_gsh[2] - cctk_nghostzones[2] - 1);
+ z_origin = - cctk_nghostzones[2] * *coarse_dz * iconv;
+ }
+ } else {
+ *coarse_dz = (zmax1 - zmin1) / max(cctk_gsh[2] - 1, 1);
z_origin = zmin1;
-
- /* dx,dy,dz on the coarsest grid of each GH */
- *coarse_dx = (xmax1-xmin1)/max(cctk_gsh[0]-1,1);
- *coarse_dy = (ymax1-ymin1)/max(cctk_gsh[1]-1,1);
- *coarse_dz = (zmax1-zmin1)/max(cctk_gsh[2]-1,1);
}
-
+
/* dx,dy,dz on the grid we are on */
- this_dx = *coarse_dx*iconv;
- this_dy = *coarse_dy*iconv;
- this_dz = *coarse_dz*iconv;
+ this_dx = *coarse_dx * iconv;
+ this_dy = *coarse_dy * iconv;
+ this_dz = *coarse_dz * iconv;
}
@@ -204,112 +196,43 @@ void CartGrid3D(CCTK_ARGUMENTS)
}
/* dx, dy, dz on the grid we are on */
- this_dx = *coarse_dx*iconv;
- this_dy = *coarse_dy*iconv;
- this_dz = *coarse_dz*iconv;
-
- if (CCTK_Equals(domain,"bitant"))
- {
- bitant_byspacing(CCTK_PASS_CTOC,
- this_dx,
- this_dy,
- this_dz,
- &x_origin,
- &y_origin,
- &z_origin);
- }
- else if (CCTK_Equals(domain,"quadrant"))
- {
-
- if (cntstag[0]==1)
- x_origin = (- cctk_nghostzones[0] + 0.5)*this_dx;
- else
- x_origin = (- cctk_nghostzones[0])*this_dx;
- if (cntstag[1]==1)
- y_origin = (- cctk_nghostzones[1] + 0.5)*this_dy;
- else
- y_origin = (- cctk_nghostzones[1])*this_dy;
- if (cntstag[2]==1)
- z_origin = (0.5 - cctk_gsh[2]/2)*this_dz;
- else
- z_origin = (- cctk_gsh[2]/2)*this_dz;
+ this_dx = *coarse_dx * iconv;
+ this_dy = *coarse_dy * iconv;
+ this_dz = *coarse_dz * iconv;
+
+
+
+ /* Set minimum values of coordinates */
+ if (domainsym[0]) {
+ if (cntstag[0]) {
+ x_origin = (- cctk_nghostzones[0] + 0.5) * this_dx;
+ } else {
+ x_origin = (- cctk_nghostzones[0] ) * this_dx;
+ }
+ } else {
+ x_origin = -0.5 * (cctk_gsh[0] - 1) * this_dx;
}
- else if (CCTK_Equals(domain,"octant"))
- {
- if (cntstag[0]==1)
- x_origin = (- cctk_nghostzones[0]+0.5)*this_dx;
- else
- x_origin = (- cctk_nghostzones[0])*this_dx;
- if (cntstag[1]==1)
- y_origin = (- cctk_nghostzones[1]+0.5)*this_dy;
- else
- y_origin = (- cctk_nghostzones[1])*this_dy;
- if (cntstag[2]==1)
- z_origin = (- cctk_nghostzones[2]+0.5)*this_dz;
- else
- z_origin = (- cctk_nghostzones[2])*this_dz;
-
+
+ if (domainsym[2]) {
+ if (cntstag[1]) {
+ y_origin = (- cctk_nghostzones[1] + 0.5) * this_dy;
+ } else {
+ y_origin = (- cctk_nghostzones[1] ) * this_dy;
+ }
+ } else {
+ y_origin = -0.5 * (cctk_gsh[1] - 1) * this_dy;
}
- else if (CCTK_Equals(domain,"full"))
- {
- if (cntstag[0]==1)
- x_origin = (0.5 - cctk_gsh[0]/2)*this_dx;
- else
- x_origin = (- cctk_gsh[0]/2)*this_dx;
- if (cntstag[1]==1)
- y_origin = (0.5 - cctk_gsh[1]/2)*this_dy;
- else
- y_origin = (- cctk_gsh[1]/2)*this_dy;
- if (cntstag[2]==1)
- z_origin = (0.5 - cctk_gsh[2]/2)*this_dz;
- else
- z_origin = (- cctk_gsh[2]/2)*this_dz;
-
-
+
+ if (domainsym[4]) {
+ if (cntstag[2]) {
+ z_origin = (- cctk_nghostzones[2] + 0.5) * this_dz;
+ } else {
+ z_origin = (- cctk_nghostzones[2] ) * this_dz;
+ }
+ } else {
+ z_origin = -0.5 * (cctk_gsh[2] - 1) * this_dz;
}
- }
-
-
- /**************************************************************
- *
- * BOX (-0.5 to 0.5)
- *
- * User gives: number of gridpoints on the coarse grid
- *
- **************************************************************/
-
- else if (CCTK_Equals(type,"box"))
- {
-
- /* Coordinates are all -0.5 to 0.5 */
- x_origin = -0.5;
- y_origin = -0.5;
- z_origin = -0.5;
-
- /* dx,dy,dz on the coarsest grid of each GH */
- *coarse_dx = 1.0/max(cctk_gsh[0]-1,1);
- *coarse_dy = 1.0/max(cctk_gsh[1]-1,1);
- *coarse_dz = 1.0/max(cctk_gsh[2]-1,1);
-
- /* dx,dy,dz on the grid we are on */
- this_dx = *coarse_dx*iconv;
- this_dy = *coarse_dy*iconv;
- this_dz = *coarse_dz*iconv;
-
- /* Special cases */
- if (cctk_gsh[0] == 1) x_origin = 0.0;
- if (cctk_gsh[1] == 1) y_origin = 0.0;
- if (cctk_gsh[2] == 1) z_origin = 0.0;
-
- }
- else
- {
- /* Put some sort of default here to stop
- * unitialised values being used later.
- */
- this_dx = 1;
- this_dy = 1;
- this_dz = 1;
+
}
/* Set spatial coordinates */
@@ -323,7 +246,9 @@ void CartGrid3D(CCTK_ARGUMENTS)
x[CCTK_GFINDEX3D(cctkGH,i,j,k)] = this_dx*(i+cctk_lbnd[0]) + x_origin;
y[CCTK_GFINDEX3D(cctkGH,i,j,k)] = this_dy*(j+cctk_lbnd[1]) + y_origin;
z[CCTK_GFINDEX3D(cctkGH,i,j,k)] = this_dz*(k+cctk_lbnd[2]) + z_origin;
- r[CCTK_GFINDEX3D(cctkGH,i,j,k)] = sqrt(SQR(x[CCTK_GFINDEX3D(cctkGH,i,j,k)])+SQR(y[CCTK_GFINDEX3D(cctkGH,i,j,k)])+SQR(z[CCTK_GFINDEX3D(cctkGH,i,j,k)]));
+ r[CCTK_GFINDEX3D(cctkGH,i,j,k)] = sqrt(SQR(x[CCTK_GFINDEX3D(cctkGH,i,j,k)])+
+ SQR(y[CCTK_GFINDEX3D(cctkGH,i,j,k)])+
+ SQR(z[CCTK_GFINDEX3D(cctkGH,i,j,k)]));
}
}
}
@@ -339,9 +264,11 @@ void CartGrid3D(CCTK_ARGUMENTS)
lowerx = x_origin;
upperx = x_origin+this_dx*(cctk_gsh[0]-1);
CCTK_CoordRegisterRange(cctkGH,lowerx,upperx,"x");
+
lowery = y_origin;
uppery = y_origin+this_dy*(cctk_gsh[1]-1);
CCTK_CoordRegisterRange(cctkGH,lowery,uppery,"y");
+
lowerz = z_origin;
upperz = z_origin+this_dz*(cctk_gsh[2]-1);
CCTK_CoordRegisterRange(cctkGH,lowerz,upperz,"z");