From 77f234967fbcc6344888c8ef5f84d42adf7d1078 Mon Sep 17 00:00:00 2001 From: Peter Diener Date: Mon, 25 Jan 2010 17:46:15 -0600 Subject: Make BetaDriver spatially varying. Make BetaDriver spatially varying. For now additional storage is unconditional, but that can be changed when we decide on exactly how to do it. Signed-off-by: Peter Diener --- ML_BSSN/interface.ccl | 6 ++ ML_BSSN/param.ccl | 25 ++++++ ML_BSSN/schedule.ccl | 11 +++ ML_BSSN/src/ML_BSSN_Minkowski.c | 4 + ML_BSSN/src/ML_BSSN_RHS.c | 8 +- ML_BSSN/src/ML_BSSN_convertFromADMBase.c | 4 + ML_BSSN/src/ML_BSSN_setBetaDriver.c | 142 +++++++++++++++++++++++++++++++ ML_BSSN/src/RegisterSymmetries.c | 5 ++ ML_BSSN/src/make.code.defn | 2 +- 9 files changed, 203 insertions(+), 4 deletions(-) create mode 100644 ML_BSSN/src/ML_BSSN_setBetaDriver.c (limited to 'ML_BSSN') diff --git a/ML_BSSN/interface.ccl b/ML_BSSN/interface.ccl index 52de196..d31bcd8 100644 --- a/ML_BSSN/interface.ccl +++ b/ML_BSSN/interface.ccl @@ -24,6 +24,12 @@ USES FUNCTION Boundary_SelectGroupForBC CCTK_INT FUNCTION Boundary_SelectVarForBC(CCTK_POINTER_TO_CONST IN GH, CCTK_INT IN faces, CCTK_INT IN boundary_width, CCTK_INT IN table_handle, CCTK_STRING IN var_name, CCTK_STRING IN bc_name) USES FUNCTION Boundary_SelectVarForBC +public: +CCTK_REAL ML_BetaDriver type=GF timelevels=1 tags='tensortypealias="Scalar" tensorweight=1.0000000000000000000' +{ + eta +} "ML_BetaDriver" + public: CCTK_REAL ML_cons_detg type=GF timelevels=1 tags='tensortypealias="Scalar" tensorweight=2.0000000000000000000' { diff --git a/ML_BSSN/param.ccl b/ML_BSSN/param.ccl index 20c4887..8e791df 100644 --- a/ML_BSSN/param.ccl +++ b/ML_BSSN/param.ccl @@ -96,6 +96,12 @@ CCTK_REAL MinimumLapse "Minimum value of the lapse function" "*:*" :: "" } -1 +restricted: +CCTK_REAL SpatialBetaDriverRadius "Radius at which the BetaDriver starts to be reduced" +{ + "*:*" :: "" +} 1000000000000 + restricted: CCTK_INT harmonicN "d/dt alpha = - f alpha^n K (harmonic=2, 1+log=1)" { @@ -156,6 +162,13 @@ KEYWORD calculate_ADMBase_variables_at "calculate_ADMBase_variables_at" "CCTK_ANALYSIS" :: "CCTK_ANALYSIS" } "MoL_PostStep" +restricted: +KEYWORD UseSpatialBetaDriver "UseSpatialBetaDriver" +{ + "no" :: "no" + "yes" :: "yes" +} "no" + private: KEYWORD dt_lapse_shift_method "Treatment of ADMBase dtlapse and dtshift" { @@ -199,6 +212,12 @@ CCTK_INT ML_BSSN_convertFromADMBaseGamma_calc_every "ML_BSSN_convertFromADMBaseG *:* :: "" } 1 +restricted: +CCTK_INT ML_BSSN_setBetaDriver_calc_every "ML_BSSN_setBetaDriver_calc_every" +{ + *:* :: "" +} 1 + restricted: CCTK_INT ML_BSSN_RHS_calc_every "ML_BSSN_RHS_calc_every" { @@ -283,6 +302,12 @@ CCTK_INT ML_BSSN_convertFromADMBaseGamma_calc_offset "ML_BSSN_convertFromADMBase *:* :: "" } 0 +restricted: +CCTK_INT ML_BSSN_setBetaDriver_calc_offset "ML_BSSN_setBetaDriver_calc_offset" +{ + *:* :: "" +} 0 + restricted: CCTK_INT ML_BSSN_RHS_calc_offset "ML_BSSN_RHS_calc_offset" { diff --git a/ML_BSSN/schedule.ccl b/ML_BSSN/schedule.ccl index 353cf71..f8a7f3b 100644 --- a/ML_BSSN/schedule.ccl +++ b/ML_BSSN/schedule.ccl @@ -1,6 +1,8 @@ # File produced by Kranc +STORAGE: ML_BetaDriver[1] + STORAGE: ML_cons_detg[1] STORAGE: ML_cons_Gamma[1] @@ -365,6 +367,15 @@ if (CCTK_EQUALS(my_initial_data, "ADMBase")) } "ML_BSSN_convertFromADMBaseGamma" } + +if (CCTK_EQUALS(UseSpatialBetaDriver, "yes")) +{ + schedule ML_BSSN_setBetaDriver AT initial AFTER ADMBase_PostInitial AFTER ML_BSSN_convertFromADMBase + { + LANG: C + } "ML_BSSN_setBetaDriver" +} + schedule ML_BSSN_RHS IN ML_BSSN_evolCalcGroup { LANG: C diff --git a/ML_BSSN/src/ML_BSSN_Minkowski.c b/ML_BSSN/src/ML_BSSN_Minkowski.c index 28229b7..759310a 100644 --- a/ML_BSSN/src/ML_BSSN_Minkowski.c +++ b/ML_BSSN/src/ML_BSSN_Minkowski.c @@ -108,6 +108,7 @@ void ML_BSSN_Minkowski_Body(cGH const * const cctkGH, CCTK_INT const dir, CCTK_I CCTK_REAL At11L = INITVALUE, At12L = INITVALUE, At13L = INITVALUE, At22L = INITVALUE, At23L = INITVALUE, At33L = INITVALUE; CCTK_REAL B1L = INITVALUE, B2L = INITVALUE, B3L = INITVALUE; CCTK_REAL beta1L = INITVALUE, beta2L = INITVALUE, beta3L = INITVALUE; + CCTK_REAL etaL = INITVALUE; CCTK_REAL gt11L = INITVALUE, gt12L = INITVALUE, gt13L = INITVALUE, gt22L = INITVALUE, gt23L = INITVALUE, gt33L = INITVALUE; CCTK_REAL phiL = INITVALUE; CCTK_REAL trKL = INITVALUE; @@ -177,6 +178,8 @@ void ML_BSSN_Minkowski_Body(cGH const * const cctkGH, CCTK_INT const dir, CCTK_I B3L = 0; + etaL = BetaDriver; + /* Copy local copies back to grid functions */ A[index] = AL; @@ -193,6 +196,7 @@ void ML_BSSN_Minkowski_Body(cGH const * const cctkGH, CCTK_INT const dir, CCTK_I beta1[index] = beta1L; beta2[index] = beta2L; beta3[index] = beta3L; + eta[index] = etaL; gt11[index] = gt11L; gt12[index] = gt12L; gt13[index] = gt13L; diff --git a/ML_BSSN/src/ML_BSSN_RHS.c b/ML_BSSN/src/ML_BSSN_RHS.c index 5dcf923..905b469 100644 --- a/ML_BSSN/src/ML_BSSN_RHS.c +++ b/ML_BSSN/src/ML_BSSN_RHS.c @@ -143,6 +143,7 @@ void ML_BSSN_RHS_Body(cGH const * const cctkGH, CCTK_INT const dir, CCTK_INT con CCTK_REAL At22L = INITVALUE, At22rhsL = INITVALUE, At23L = INITVALUE, At23rhsL = INITVALUE, At33L = INITVALUE, At33rhsL = INITVALUE; CCTK_REAL B1L = INITVALUE, B1rhsL = INITVALUE, B2L = INITVALUE, B2rhsL = INITVALUE, B3L = INITVALUE, B3rhsL = INITVALUE; CCTK_REAL beta1L = INITVALUE, beta1rhsL = INITVALUE, beta2L = INITVALUE, beta2rhsL = INITVALUE, beta3L = INITVALUE, beta3rhsL = INITVALUE; + CCTK_REAL etaL = INITVALUE; CCTK_REAL gt11L = INITVALUE, gt11rhsL = INITVALUE, gt12L = INITVALUE, gt12rhsL = INITVALUE, gt13L = INITVALUE, gt13rhsL = INITVALUE; CCTK_REAL gt22L = INITVALUE, gt22rhsL = INITVALUE, gt23L = INITVALUE, gt23rhsL = INITVALUE, gt33L = INITVALUE, gt33rhsL = INITVALUE; CCTK_REAL phiL = INITVALUE, phirhsL = INITVALUE; @@ -278,6 +279,7 @@ void ML_BSSN_RHS_Body(cGH const * const cctkGH, CCTK_INT const dir, CCTK_INT con beta1L = beta1[index]; beta2L = beta2[index]; beta3L = beta3[index]; + etaL = eta[index]; gt11L = gt11[index]; gt12L = gt12[index]; gt13L = gt13[index]; @@ -1049,15 +1051,15 @@ void ML_BSSN_RHS_Body(cGH const * const cctkGH, CCTK_INT const dir, CCTK_INT con beta3rhsL = (PDupwindNth1(beta3, i, j, k)*beta1L + PDupwindNth2(beta3, i, j, k)*beta2L + PDupwindNth3(beta3, i, j, k)*beta3L)*ShiftAdvectionCoeff + B3L*ShiftGammaCoeff; - B1rhsL = -(B1L*BetaDriver) + ((PDupwindNth1(B1, i, j, k) - PDupwindNth1(Xt1, i, j, k))*beta1L + + B1rhsL = -(B1L*etaL) + ((PDupwindNth1(B1, i, j, k) - PDupwindNth1(Xt1, i, j, k))*beta1L + (PDupwindNth2(B1, i, j, k) - PDupwindNth2(Xt1, i, j, k))*beta2L + (PDupwindNth3(B1, i, j, k) - PDupwindNth3(Xt1, i, j, k))*beta3L)*ShiftAdvectionCoeff + Xt1rhsL; - B2rhsL = -(B2L*BetaDriver) + ((PDupwindNth1(B2, i, j, k) - PDupwindNth1(Xt2, i, j, k))*beta1L + + B2rhsL = -(B2L*etaL) + ((PDupwindNth1(B2, i, j, k) - PDupwindNth1(Xt2, i, j, k))*beta1L + (PDupwindNth2(B2, i, j, k) - PDupwindNth2(Xt2, i, j, k))*beta2L + (PDupwindNth3(B2, i, j, k) - PDupwindNth3(Xt2, i, j, k))*beta3L)*ShiftAdvectionCoeff + Xt2rhsL; - B3rhsL = -(B3L*BetaDriver) + ((PDupwindNth1(B3, i, j, k) - PDupwindNth1(Xt3, i, j, k))*beta1L + + B3rhsL = -(B3L*etaL) + ((PDupwindNth1(B3, i, j, k) - PDupwindNth1(Xt3, i, j, k))*beta1L + (PDupwindNth2(B3, i, j, k) - PDupwindNth2(Xt3, i, j, k))*beta2L + (PDupwindNth3(B3, i, j, k) - PDupwindNth3(Xt3, i, j, k))*beta3L)*ShiftAdvectionCoeff + Xt3rhsL; diff --git a/ML_BSSN/src/ML_BSSN_convertFromADMBase.c b/ML_BSSN/src/ML_BSSN_convertFromADMBase.c index 90cd41c..3d5e687 100644 --- a/ML_BSSN/src/ML_BSSN_convertFromADMBase.c +++ b/ML_BSSN/src/ML_BSSN_convertFromADMBase.c @@ -115,6 +115,7 @@ void ML_BSSN_convertFromADMBase_Body(cGH const * const cctkGH, CCTK_INT const di CCTK_REAL betaxL = INITVALUE; CCTK_REAL betayL = INITVALUE; CCTK_REAL betazL = INITVALUE; + CCTK_REAL etaL = INITVALUE; CCTK_REAL gt11L = INITVALUE, gt12L = INITVALUE, gt13L = INITVALUE, gt22L = INITVALUE, gt23L = INITVALUE, gt33L = INITVALUE; CCTK_REAL gxxL = INITVALUE; CCTK_REAL gxyL = INITVALUE; @@ -239,6 +240,8 @@ void ML_BSSN_convertFromADMBase_Body(cGH const * const cctkGH, CCTK_INT const di beta3L = betazL; + etaL = BetaDriver; + /* Copy local copies back to grid functions */ alpha[index] = alphaL; @@ -251,6 +254,7 @@ void ML_BSSN_convertFromADMBase_Body(cGH const * const cctkGH, CCTK_INT const di beta1[index] = beta1L; beta2[index] = beta2L; beta3[index] = beta3L; + eta[index] = etaL; gt11[index] = gt11L; gt12[index] = gt12L; gt13[index] = gt13L; diff --git a/ML_BSSN/src/ML_BSSN_setBetaDriver.c b/ML_BSSN/src/ML_BSSN_setBetaDriver.c new file mode 100644 index 0000000..04a369a --- /dev/null +++ b/ML_BSSN/src/ML_BSSN_setBetaDriver.c @@ -0,0 +1,142 @@ +/* File produced by Kranc */ + +#define KRANC_C + +#include +#include +#include +#include +#include "cctk.h" +#include "cctk_Arguments.h" +#include "cctk_Parameters.h" +#include "GenericFD.h" +#include "Differencing.h" +#include "loopcontrol.h" + +/* Define macros used in calculations */ +#define INITVALUE (42) +#define INV(x) ((1.0) / (x)) +#define SQR(x) ((x) * (x)) +#define CUB(x) ((x) * (x) * (x)) +#define QAD(x) ((x) * (x) * (x) * (x)) + +void ML_BSSN_setBetaDriver_Body(cGH const * const cctkGH, CCTK_INT const dir, CCTK_INT const face, CCTK_REAL const normal[3], CCTK_REAL const tangentA[3], CCTK_REAL const tangentB[3], CCTK_INT const min[3], CCTK_INT const max[3], CCTK_INT const n_subblock_gfs, CCTK_REAL * const subblock_gfs[]) +{ + DECLARE_CCTK_ARGUMENTS; + DECLARE_CCTK_PARAMETERS; + + + /* Declare finite differencing variables */ + CCTK_REAL dx = INITVALUE, dy = INITVALUE, dz = INITVALUE; + CCTK_REAL dxi = INITVALUE, dyi = INITVALUE, dzi = INITVALUE; + CCTK_REAL khalf = INITVALUE, kthird = INITVALUE, ktwothird = INITVALUE, kfourthird = INITVALUE, keightthird = INITVALUE; + CCTK_REAL hdxi = INITVALUE, hdyi = INITVALUE, hdzi = INITVALUE; + + + /* Declare predefined quantities */ + CCTK_REAL p1o12dx = INITVALUE; + CCTK_REAL p1o12dy = INITVALUE; + CCTK_REAL p1o12dz = INITVALUE; + CCTK_REAL p1o144dxdy = INITVALUE; + CCTK_REAL p1o144dxdz = INITVALUE; + CCTK_REAL p1o144dydz = INITVALUE; + CCTK_REAL p1odx = INITVALUE; + CCTK_REAL p1ody = INITVALUE; + CCTK_REAL p1odz = INITVALUE; + CCTK_REAL pm1o12dx2 = INITVALUE; + CCTK_REAL pm1o12dy2 = INITVALUE; + CCTK_REAL pm1o12dz2 = INITVALUE; + + if (verbose > 1) + { + CCTK_VInfo(CCTK_THORNSTRING,"Entering ML_BSSN_setBetaDriver_Body"); + } + + if (cctk_iteration % ML_BSSN_setBetaDriver_calc_every != ML_BSSN_setBetaDriver_calc_offset) + { + return; + } + + /* Include user-supplied include files */ + + /* Initialise finite differencing variables */ + dx = CCTK_DELTA_SPACE(0); + dy = CCTK_DELTA_SPACE(1); + dz = CCTK_DELTA_SPACE(2); + dxi = 1.0 / dx; + dyi = 1.0 / dy; + dzi = 1.0 / dz; + khalf = 0.5; + kthird = 1/3.0; + ktwothird = 2.0/3.0; + kfourthird = 4.0/3.0; + keightthird = 8.0/3.0; + hdxi = 0.5 * dxi; + hdyi = 0.5 * dyi; + hdzi = 0.5 * dzi; + + /* Initialize predefined quantities */ + p1o12dx = INV(dx)/12.; + p1o12dy = INV(dy)/12.; + p1o12dz = INV(dz)/12.; + p1o144dxdy = (INV(dx)*INV(dy))/144.; + p1o144dxdz = (INV(dx)*INV(dz))/144.; + p1o144dydz = (INV(dy)*INV(dz))/144.; + p1odx = INV(dx); + p1ody = INV(dy); + p1odz = INV(dz); + pm1o12dx2 = -pow(dx,-2)/12.; + pm1o12dy2 = -pow(dy,-2)/12.; + pm1o12dz2 = -pow(dz,-2)/12.; + + /* Loop over the grid points */ + #pragma omp parallel + LC_LOOP3 (ML_BSSN_setBetaDriver, + i,j,k, min[0],min[1],min[2], max[0],max[1],max[2], + cctk_lsh[0],cctk_lsh[1],cctk_lsh[2]) + { + int index = INITVALUE; + int subblock_index = INITVALUE; + index = CCTK_GFINDEX3D(cctkGH,i,j,k); + subblock_index = i - min[0] + (max[0] - min[0]) * (j - min[1] + (max[1]-min[1]) * (k - min[2])); + + /* Declare shorthands */ + + /* Declare local copies of grid functions */ + CCTK_REAL etaL = INITVALUE; + CCTK_REAL rL = INITVALUE; + /* Declare precomputed derivatives*/ + + /* Declare derivatives */ + + /* Assign local copies of grid functions */ + etaL = eta[index]; + rL = r[index]; + + /* Assign local copies of subblock grid functions */ + + /* Include user supplied include files */ + + /* Precompute derivatives (new style) */ + + /* Precompute derivatives (old style) */ + + /* Calculate temporaries and grid functions */ + etaL = etaL*IfThen(rL > SpatialBetaDriverRadius,SpatialBetaDriverRadius*INV(rL),1); + + + /* Copy local copies back to grid functions */ + eta[index] = etaL; + + /* Copy local copies back to subblock grid functions */ + } + LC_ENDLOOP3 (ML_BSSN_setBetaDriver); +} + +void ML_BSSN_setBetaDriver(CCTK_ARGUMENTS) +{ + DECLARE_CCTK_ARGUMENTS; + DECLARE_CCTK_PARAMETERS; + + GenericFD_LoopOverEverything(cctkGH, &ML_BSSN_setBetaDriver_Body); +} diff --git a/ML_BSSN/src/RegisterSymmetries.c b/ML_BSSN/src/RegisterSymmetries.c index 20db895..16bd0d9 100644 --- a/ML_BSSN/src/RegisterSymmetries.c +++ b/ML_BSSN/src/RegisterSymmetries.c @@ -141,6 +141,11 @@ void ML_BSSN_RegisterSymmetries(CCTK_ARGUMENTS) sym[2] = 1; SetCartSymVN(cctkGH, sym, "ML_BSSN::trK"); + sym[0] = 1; + sym[1] = 1; + sym[2] = 1; + SetCartSymVN(cctkGH, sym, "ML_BSSN::eta"); + sym[0] = 1; sym[1] = 1; sym[2] = 1; diff --git a/ML_BSSN/src/make.code.defn b/ML_BSSN/src/make.code.defn index d4d4f44..461adc2 100644 --- a/ML_BSSN/src/make.code.defn +++ b/ML_BSSN/src/make.code.defn @@ -1,3 +1,3 @@ # File produced by Kranc -SRCS = Startup.c RegisterMoL.c RegisterSymmetries.c ML_BSSN_Minkowski.c ML_BSSN_convertFromADMBase.c ML_BSSN_convertFromADMBaseGamma.c ML_BSSN_RHS.c ML_BSSN_RHSStaticBoundary.c ML_BSSN_RHSRadiativeBoundary.c ML_BSSN_enforce.c ML_BSSN_boundary.c ML_BSSN_convertToADMBase.c ML_BSSN_convertToADMBaseDtLapseShift.c ML_BSSN_convertToADMBaseDtLapseShiftBoundary.c ML_BSSN_convertToADMBaseFakeDtLapseShift.c ML_BSSN_constraints.c ML_BSSN_constraints_boundary.c Boundaries.c +SRCS = Startup.c RegisterMoL.c RegisterSymmetries.c ML_BSSN_Minkowski.c ML_BSSN_convertFromADMBase.c ML_BSSN_convertFromADMBaseGamma.c ML_BSSN_setBetaDriver.c ML_BSSN_RHS.c ML_BSSN_RHSStaticBoundary.c ML_BSSN_RHSRadiativeBoundary.c ML_BSSN_enforce.c ML_BSSN_boundary.c ML_BSSN_convertToADMBase.c ML_BSSN_convertToADMBaseDtLapseShift.c ML_BSSN_convertToADMBaseDtLapseShiftBoundary.c ML_BSSN_convertToADMBaseFakeDtLapseShift.c ML_BSSN_constraints.c ML_BSSN_constraints_boundary.c Boundaries.c -- cgit v1.2.3