diff options
Diffstat (limited to 'src/CartGrid3D.c')
-rw-r--r-- | src/CartGrid3D.c | 355 |
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"); |