aboutsummaryrefslogtreecommitdiff
path: root/src/CopyBoundary.c
diff options
context:
space:
mode:
authorallen <allen@6a38eb6e-646e-4a02-a296-d141613ad6c4>1999-11-01 09:33:02 +0000
committerallen <allen@6a38eb6e-646e-4a02-a296-d141613ad6c4>1999-11-01 09:33:02 +0000
commitb77a02dc282b020ce72a5e68dccca1b54f0c621e (patch)
tree6fd059cf6722e310d7787d40a0efe31e59c22c60 /src/CopyBoundary.c
parent2abfd5897d720af20f59e80580fdc5d36b528546 (diff)
ScalarBoundary will be a replacement to the badly named ConstantBoundary
CopyBoundary copies the values from a second GF to the first GF git-svn-id: http://svn.cactuscode.org/arrangements/CactusBase/Boundary/trunk@60 6a38eb6e-646e-4a02-a296-d141613ad6c4
Diffstat (limited to 'src/CopyBoundary.c')
-rw-r--r--src/CopyBoundary.c327
1 files changed, 327 insertions, 0 deletions
diff --git a/src/CopyBoundary.c b/src/CopyBoundary.c
new file mode 100644
index 0000000..06e07c3
--- /dev/null
+++ b/src/CopyBoundary.c
@@ -0,0 +1,327 @@
+ /*@@
+ @file CopyBoundary.c
+ @date Mon Mar 15 15:09:00 1999
+ @author Gerd Lanfermann, Gabrielle Allen
+ @desc
+ Static boundary conditions for a given GF group or single GF
+ @enddesc
+ @@*/
+
+/*#define DEBUG_BOUND*/
+
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include "cctk.h"
+#include "cctk_parameters.h"
+#include "CactusBase/CartGrid3D/src/Symmetry.h"
+#include "cctk_FortranString.h"
+
+
+/* The actual boundary condition */
+
+void ApplyStatic3Di(cGH *GH,
+ int *doBC,
+ int *lsh,
+ int *stencil_size,
+ CCTK_REAL *var,
+ CCTK_REAL *varp)
+{
+
+ if (doBC[0] == 1)
+ {
+
+ int j,k,sw;
+
+#ifdef DEBUG_BOUND
+ printf("Applying copy boundary for lower x\n");
+#endif
+
+ for (k=0;k<lsh[2];k++)
+ {
+ for (j=0;j<lsh[1];j++)
+ {
+ for (sw=0;sw<stencil_size[0];sw++)
+ {
+ var[CCTK_GFINDEX3D(GH,sw,j,k)]
+ = varp[CCTK_GFINDEX3D(GH,sw,j,k)];
+ }
+ }
+ }
+ }
+
+ if (doBC[1] == 1)
+ {
+
+ int j,k,sw;
+
+#ifdef DEBUG_BOUND
+ printf("Applying copy boundary for upper x\n");
+#endif
+
+ for (k=0;k<lsh[2];k++)
+ {
+ for (j=0;j<lsh[1];j++)
+ {
+ for (sw=0;sw<stencil_size[0];sw++)
+ {
+ var[CCTK_GFINDEX3D(GH,lsh[0]-sw-1,j,k)]
+ = varp[CCTK_GFINDEX3D(GH,lsh[0]-sw-1,j,k)];
+ }
+ }
+ }
+ }
+
+ if (doBC[2] == 1)
+ {
+ int i,k,sw;
+
+#ifdef DEBUG_BOUND
+ printf("Applying copy boundary for lower y\n");
+#endif
+
+ for (k=0;k<lsh[2];k++)
+ {
+ for (i=0;i<lsh[0];i++)
+ {
+ for (sw=0;sw<stencil_size[1];sw++)
+ {
+ var[CCTK_GFINDEX3D(GH,i,sw,k)]
+ = varp[CCTK_GFINDEX3D(GH,i,sw,k)];
+ }
+ }
+ }
+ }
+
+ if (doBC[3] == 1)
+ {
+ int i,k,sw;
+
+#ifdef DEBUG_BOUND
+ printf("Applying copy boundary for upper y\n");
+#endif
+
+ for (k=0;k<lsh[2];k++)
+ {
+ for (i=0;i<lsh[0];i++)
+ {
+ for (sw=0;sw<stencil_size[1];sw++)
+ {
+ var[CCTK_GFINDEX3D(GH,i,lsh[1]-sw-1,k)]
+ = varp[CCTK_GFINDEX3D(GH,i,lsh[1]-sw-1,k)];
+ }
+ }
+ }
+ }
+
+ if (doBC[4] == 1)
+ {
+ int i,j,sw;
+
+#ifdef DEBUG_BOUND
+ printf("Applying copy boundary for lower z\n");
+#endif
+
+ for (j=0;j<lsh[1];j++)
+ {
+ for (i=0;i<lsh[0];i++)
+ {
+ for (sw=0;sw<stencil_size[2];sw++)
+ {
+ var[CCTK_GFINDEX3D(GH,i,j,sw)]
+ = varp[CCTK_GFINDEX3D(GH,i,j,sw)];
+ }
+ }
+ }
+ }
+
+ if (doBC[5] == 1)
+ {
+ int i,j,sw;
+
+#ifdef DEBUG_BOUND
+ printf("Applying copy boundary for upper z\n");
+#endif
+
+ for (j=0;j<lsh[1];j++)
+ {
+ for (i=0;i<lsh[0];i++)
+ {
+ for (sw=0;sw<stencil_size[2];sw++)
+ {
+ var[CCTK_GFINDEX3D(GH,i,j,lsh[2]-sw-1)]
+ = varp[CCTK_GFINDEX3D(GH,i,j,lsh[2]-sw-1)];
+ }
+ }
+ }
+ }
+
+}
+
+
+
+
+
+/* Boundary Conditions by Variable */
+
+
+int CopyBCVarI(cGH *GH,
+ int *stencil_size,
+ int vi,
+ int vpi)
+{
+
+ DECLARE_CCTK_PARAMETERS
+
+ SymmetryGHex *sGHex; /* the Symmetry GHextension */
+ int *doBC; /* lower/upper BCs are applied (1) or not (0) */
+ int retval=0;
+
+ sGHex = (SymmetryGHex*)malloc(sizeof(SymmetryGHex));
+ sGHex = (SymmetryGHex*)GH->extensions[CCTK_GHExtensionHandle("Symmetry")];
+ doBC = (int *)malloc(2*(GH->cctk_dim)*sizeof(int));
+
+ if (CCTK_GroupTypeFromVarI(vi) == GROUP_GF||
+ CCTK_GroupTypeFromVarI(vpi) == GROUP_GF)
+ {
+ int idim,retval;
+
+ /* Apply condition if:
+ + boundary is not a symmetry boundary,
+ + boundary is a physical boundary
+ + have enough grid points
+ */
+ for (idim=0;idim<GH->cctk_dim;idim++)
+ {
+
+ doBC[idim*2] = (((sGHex->GFSym[vi][idim*2]==GFSYM_NOSYM)||
+ (sGHex->GFSym[vi][idim*2]==GFSYM_UNSET)) &&
+ GH->cctk_lsh[idim]>1 && GH->cctk_bbox[idim*2]);
+ doBC[idim*2+1] = (((sGHex->GFSym[vi][idim*2+1]==GFSYM_NOSYM)||
+ (sGHex->GFSym[vi][idim*2+1]==GFSYM_UNSET)) &&
+ GH->cctk_lsh[idim]>1 && GH->cctk_bbox[idim*2+1]);
+ }
+ if (GH->cctk_dim == 3) {
+ ApplyCopy3Di(GH,
+ doBC,
+ GH->cctk_lsh,
+ stencil_size,
+ GH->data[vi][0],
+ GH->data[vpi][0]);
+ retval = 0;
+ }
+ else {
+ CCTKi_NotYetImplemented("Copy boundaries in other than 3D");
+ retval = -1;
+ }
+ }
+ else
+ {
+ CCTK_WARN(1,"Applying boundary condition to non grid function");
+ retval = -2;
+ }
+
+ if (doBC) free(doBC);
+
+ return(retval);
+}
+
+int CopyBCVar(cGH *GH,
+ int *stencil_size,
+ const char *impvarname,
+ const char *imppvarname)
+{
+ int vi,vip;
+ vi = CCTK_VarIndex(impvarname);
+ vip = CCTK_VarIndex(imppvarname);
+ return(CopyBCVarI(GH, stencil_size, vi, vip));
+}
+
+void FMODIFIER FORTRAN_NAME(CopyBCVar)(int *retval,
+ cGH *GH,
+ int *stencil_size,
+ TWO_FORTSTRINGS_ARGS)
+{
+ TWO_FORTSTRINGS_CREATE(impvarname,imppvarname)
+ *retval = CopyBCVar(GH, stencil_size, impvarname,imppvarname);
+ free(impvarname);
+ free(imppvarname);
+}
+
+void FMODIFIER FORTRAN_NAME(CopyBCVarI)(int *retval,
+ cGH *GH,
+ int *stencil_size,
+ int *vi,
+ int *vip)
+{
+ *retval = CopyBCVarI(GH, stencil_size, *vi, *vip);
+}
+
+
+
+
+/* Boundary Conditions by Group */
+
+int CopyBCGroup(cGH *GH,
+ int *stencil_size,
+ const char *impgrpname,
+ const char *imppgrpname)
+{
+ int gi,gip;
+ gi = CCTK_GroupIndex(impgrpname);
+ gip = CCTK_GroupIndex(imppgrpname);
+ return(CopyBCGroupI(GH, stencil_size, gi, gip));
+}
+
+int CopyBCGroupI(cGH *GH,
+ int *stencil_size,
+ int gi,
+ int gip)
+{
+ int firstVarI,firstVarIp,numvars,vi,i1,i2;
+ int retval=0, rettmp=0;
+
+ firstVarI = CCTK_FirstVarIndexI(gi);
+ firstVarIp = CCTK_FirstVarIndexI(gip);
+ numvars = CCTK_NumVarsInGroupI(gi);
+
+ for (vi=0; vi<numvars; vi++)
+ {
+ i1 = firstVarI+vi;
+ i2 = firstVarIp+vi;
+ rettmp = CopyBCVarI(GH,stencil_size,i1,i2);
+ if (rettmp!=0) CCTK_WARN(1,"CopyBCGroupI: Failure for one var in group");
+ retval = retval || rettmp;
+ }
+
+ return(retval);
+}
+
+void FMODIFIER FORTRAN_NAME(CopyBCGroup)(int *retval,
+ cGH *GH,
+ int *stencil_size,
+ TWO_FORTSTRINGS_ARGS)
+{
+ TWO_FORTSTRINGS_CREATE(impgrpname,imppgrpname)
+ *retval = CopyBCGroup(GH, stencil_size, impgrpname,imppgrpname);
+ free(impgrpname);
+ free(imppgrpname);
+}
+
+void FMODIFIER FORTRAN_NAME(CopyBCGroupI)(int *retval,
+ cGH *GH,
+ int *stencil_size,
+ int *gi,
+ int *gip)
+{
+ *retval=CopyBCGroupI(GH, stencil_size, *gi, *gip);
+}
+
+
+
+
+