aboutsummaryrefslogtreecommitdiff
path: root/src/WaveBinary.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/WaveBinary.c')
-rw-r--r--src/WaveBinary.c204
1 files changed, 204 insertions, 0 deletions
diff --git a/src/WaveBinary.c b/src/WaveBinary.c
new file mode 100644
index 0000000..6a8ca79
--- /dev/null
+++ b/src/WaveBinary.c
@@ -0,0 +1,204 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+/* Using Cactus infrastructure */
+#include "cctk.h"
+
+/* Using Cactus parameters */
+#include "cctk_Parameters.h"
+
+/* Using Cactus arguments lists */
+#include "cctk_Arguments.h"
+
+int IndexCeilC(cGH *GH, CCTK_REAL coord_value, int d);
+int IndexFloorC(cGH *GH, CCTK_REAL coord_value, int d);
+
+void WaveBinaryC(CCTK_ARGUMENTS)
+{
+
+ /* Declare variables in argument list */
+ DECLARE_CCTK_ARGUMENTS
+
+ /* Declare parameters */
+ DECLARE_CCTK_PARAMETERS
+
+ int i,j,k,d,index;
+
+ /* the start/end points in local index space of the binary charge */
+ int lowerloc[3];
+ int upperloc[3];
+
+ /* lower/upper physical coord. of one binary charge */
+ CCTK_REAL lbin[3],ubin[3];
+ CCTK_REAL minc[3],maxc[3];
+
+ /* lower/upper grid points, that we own (no ghostzones) */
+ int mingp[3], maxgp[3];
+
+ /* some flags */
+ int onthisproc, sign;
+ static int firstcall;
+
+ CCTK_REAL xs,ys,zs,rad;
+ CCTK_REAL zmin,zmax,charge_factor;
+
+ /* Because binary_charge and binary_size are a steerable parameters now,
+ charge_factor needs to be recomputed at every iteration. */
+ charge_factor = 3.0*binary_charge/(4.0*3.1415*binary_size*binary_size*binary_size);
+
+ /* Initialize the range arrays */
+ for (d=0;d<3;d++)
+ {
+ mingp[d] = 0;
+ maxgp[d] = cctk_lsh[d]-1;
+ }
+
+
+ /* The physical minimum/maximum coordinates of our grid chunk;
+ will use those to check if the charges are on our proc. */
+ index = CCTK_GFINDEX3D(cctkGH,0,0,0);
+ minc[0] = x[index];
+ minc[1] = y[index];
+ minc[2] = z[index];
+ index = CCTK_GFINDEX3D(cctkGH,cctk_lsh[0]-1,cctk_lsh[1]-1,cctk_lsh[2]-1);
+ maxc[0] = x[index];
+ maxc[1] = y[index];
+ maxc[2] = z[index];
+
+
+ /* we have two charges opposite, origin is the center
+ sign mulitplies the charge xy-positions by +1 and -1 */
+ for (sign=1; sign>=-1; sign-=2)
+ {
+
+ /* default flag: the charge is on this proc. */
+ onthisproc = 0;
+
+ /* calculate the center of a single binary source */
+ CCTK_CoordRange(cctkGH, &zmin, &zmax, "z");
+ xs = sign * binary_radius * cos(binary_omega*cctk_time);
+ ys = sign * binary_radius * sin(binary_omega*cctk_time);
+ zs = (zmax-zmin)/2 + zmin;
+
+ /* shortcuts for the physical boundaries of
+ a single charge */
+ lbin[0] = xs - binary_size;
+ lbin[1] = ys - binary_size;
+ lbin[2] = zs - binary_size;
+
+ ubin[0] = xs + binary_size;
+ ubin[1] = ys + binary_size;
+ ubin[2] = zs + binary_size;
+
+
+ /* loop over all three dimensions */
+ for (d=0;d<3;d++)
+ {
+
+ /* check where our binaries are:
+ - the can be on our grid chunk completly
+ - we have a lower part of the source on our grid chunk
+ - we have a upper part
+ - the source covers a grid chunk completetly
+
+ Get the floor-index of the lower bound and
+ ceiling-index of the upper bound.
+
+ Increase onthisproc : if equal to three, we have the source
+ */
+ if ((lbin[d]>=minc[d]) && (ubin[d]<=minc[d]))
+ {
+ lowerloc[d]=IndexFloorC(cctkGH, lbin[d],d);
+ upperloc[d]=IndexCeilC (cctkGH, ubin[d],d);
+ onthisproc += 1;
+ }
+ else if ((lbin[d]>=minc[d]) && (lbin[d]<=maxc[d]))
+ {
+ lowerloc[d]=IndexFloorC(cctkGH, lbin[d],d);
+ upperloc[d]=maxgp[d];
+ onthisproc += 1;
+ }
+ else if ((ubin[d]>=minc[d]) && (ubin[d]<=maxc[d]))
+ {
+ lowerloc[d]=mingp[d];
+ upperloc[d]=IndexCeilC (cctkGH, ubin[d],d);
+ onthisproc += 1;
+ }
+ else if ((ubin[d]>=maxc[d]) && (lbin[d]<=minc[d]))
+ {
+ lowerloc[d]=mingp[d];
+ upperloc[d]=maxgp[d];
+ onthisproc += 1;
+ }
+ else {
+ lowerloc[d] = -1;
+ upperloc[d] = -1;
+ }
+ }
+
+ /* Debugging debugging */
+ if (((firstcall==1)&&(CCTK_EQUALS(binary_verbose,"yes"))) ||
+ (CCTK_EQUALS(binary_verbose,"debug")))
+ {
+ printf("Charge: %f \n",charge_factor);
+ printf("On this proc: %d \n",onthisproc);
+ printf("cctk_lsh: %d %d %d\n",cctk_lsh[0],cctk_lsh[0],cctk_lsh[0]);
+ printf("Charge center: %f %f %f \n", xs,ys,zs);
+ printf("Charge extension: \n");
+ printf(" x-extension: %f -> %f \n",lbin[0],ubin[0]);
+ printf(" y-extension: %f -> %f \n",lbin[1],ubin[1]);
+ printf(" z-extension: %f -> %f \n",lbin[2],ubin[2]);
+ printf("Charge local index range: \n");
+ printf(" x-index %d %d \n", lowerloc[0],upperloc[0]);
+ printf(" y-index %d %d \n", lowerloc[1],upperloc[1]);
+ printf(" z-index %d %d \n", lowerloc[2],upperloc[2]);
+ index = CCTK_GFINDEX3D(cctkGH, lowerloc[0],lowerloc[1],lowerloc[2]);
+ printf("Charge corner LOW: [%f %f %f] \n",x[index],y[index],z[index]);
+ index = CCTK_GFINDEX3D(cctkGH, upperloc[0],upperloc[1],upperloc[2]);
+ printf("Charge corner UP : [%f %f %f] \n",x[index],y[index],z[index]);
+ printf(" MINC/MAXC [%f %f %f] [%f %f %f] \n\n\n",
+ minc[0],minc[1],minc[2],
+ maxc[0],maxc[1],maxc[2]);
+ }
+
+ /* we have the source, no loop over the index boudary */
+ if (onthisproc==3)
+ {
+ for (k=lowerloc[2];k<=upperloc[2];k++)
+ for (j=lowerloc[1];j<=upperloc[1];j++)
+ for (i=lowerloc[0];i<=upperloc[0];i++)
+ {
+ index = CCTK_GFINDEX3D(cctkGH,i,j,k);
+ rad =
+ ((x[index]-xs)*(x[index]-xs)) +
+ ((y[index]-ys)*(y[index]-ys)) +
+ ((z[index]-zs)*(z[index]-zs));
+
+ if (rad<binary_size*binary_size)
+ phi[index] = phi[index] + charge_factor;
+ }
+ }
+
+ /* end of the sign loop */
+ }
+
+
+ /* reset firstcall to zero */
+ firstcall = 0;
+
+ /* Note, that we do not need to sync anything, since each grid
+ patch has filled out its ghostzones. */
+
+ return;
+}
+
+
+
+
+
+
+
+
+
+