diff options
author | eschnett <eschnett@578cdeb0-5ea1-4b81-8215-5a3b8777ee0b> | 2014-02-18 18:52:34 +0000 |
---|---|---|
committer | eschnett <eschnett@578cdeb0-5ea1-4b81-8215-5a3b8777ee0b> | 2014-02-18 18:52:34 +0000 |
commit | d5bc7cf9626df7800644836c81712ace1e92ed0f (patch) | |
tree | 52dba02df54191ed69a23e12aca20d65277f33a8 | |
parent | ba1cc65578236e95d23928ab7a1764355bc39e13 (diff) |
Support multiple refinement and time levels in LinearCombination API
git-svn-id: http://svn.cactuscode.org/arrangements/CactusNumerical/MoL/trunk@210 578cdeb0-5ea1-4b81-8215-5a3b8777ee0b
-rw-r--r-- | interface.ccl | 7 | ||||
-rw-r--r-- | src/Euler.c | 10 | ||||
-rw-r--r-- | src/InitialCopy.c | 16 | ||||
-rw-r--r-- | src/Operators.c | 60 | ||||
-rw-r--r-- | src/Operators.h | 2 | ||||
-rw-r--r-- | src/RK2.c | 18 | ||||
-rw-r--r-- | src/RK3.c | 24 | ||||
-rw-r--r-- | src/RK4.c | 14 | ||||
-rw-r--r-- | src/RK87.c | 14 |
9 files changed, 118 insertions, 47 deletions
diff --git a/interface.ccl b/interface.ccl index 51d9647..f12606b 100644 --- a/interface.ccl +++ b/interface.ccl @@ -211,11 +211,17 @@ PROVIDES FUNCTION MoLNumIntegratorSubsteps WITH MoL_NumIntegratorSubsteps \ ### to override low-level grid variable operations. ### ############################################################## +CCTK_INT FUNCTION GetRefinementLevel \ + (CCTK_POINTER_TO_CONST IN cctkGH) +USES FUNCTION GetRefinementLevel + # Computes: # var = scale * var + \sum_i^nsrcs facts[i] * scrcs[i][tls[i]] CCTK_INT FUNCTION LinearCombination \ (CCTK_POINTER_TO_CONST IN cctkGH, \ CCTK_INT IN var, \ + CCTK_INT IN rl , \ + CCTK_INT IN tl , \ CCTK_REAL IN scale, \ CCTK_INT ARRAY IN srcs, \ CCTK_INT ARRAY IN tls, \ @@ -226,6 +232,7 @@ USES FUNCTION LinearCombination CCTK_INT FUNCTION Accelerator_NotifyDataModified \ (CCTK_POINTER_TO_CONST IN cctkGH, \ CCTK_INT ARRAY IN variables, \ + CCTK_INT ARRAY IN rls, \ CCTK_INT ARRAY IN tls, \ CCTK_INT IN nvariables, \ CCTK_INT IN on_device) diff --git a/src/Euler.c b/src/Euler.c index 0033cd1..294b8eb 100644 --- a/src/Euler.c +++ b/src/Euler.c @@ -72,6 +72,12 @@ void MoL_EulerAdd(CCTK_ARGUMENTS) totalsize *= cctk_ash[arraydim]; } + CCTK_INT rl = 0; + if (CCTK_IsFunctionAliased("GetRefinementLevel")) { + rl = GetRefinementLevel(cctkGH); + } + CCTK_INT tl = 0; + switch (*MoL_Intermediate_Step) { case 1: @@ -84,7 +90,7 @@ void MoL_EulerAdd(CCTK_ARGUMENTS) CCTK_INT const tls[] = {1, 0}; CCTK_REAL const facts[] = {1.0, CCTK_DELTA_TIME}; MoL_LinearCombination(cctkGH, - EvolvedVariableIndex[var], 0.0, + EvolvedVariableIndex[var], rl, tl, 0.0, srcs, tls, facts, nsrcs); } @@ -96,7 +102,7 @@ void MoL_EulerAdd(CCTK_ARGUMENTS) CCTK_INT const tls[] = {1, 0}; CCTK_REAL const facts[] = {1.0, CCTK_DELTA_TIME}; MoL_LinearCombination(cctkGH, - EvolvedArrayVariableIndex[var], 0.0, + EvolvedArrayVariableIndex[var], rl, tl, 0.0, srcs, tls, facts, nsrcs); } diff --git a/src/InitialCopy.c b/src/InitialCopy.c index 5cef13c..5a8979d 100644 --- a/src/InitialCopy.c +++ b/src/InitialCopy.c @@ -108,6 +108,12 @@ void MoL_InitialCopy(CCTK_ARGUMENTS) totalsize *= cctk_ash[arraydim]; } + int rl = 0; + if (CCTK_IsFunctionAliased("GetRefinementLevel")) { + rl = GetRefinementLevel(cctkGH); + } + int tl = 0; + for (var = 0; var < MoLNumEvolvedVariables; var++) { const int nsrc = 1; @@ -135,7 +141,7 @@ void MoL_InitialCopy(CCTK_ARGUMENTS) CCTK_WARN(0, "The grid function does not have storage assigned."); } - MoL_LinearCombination(cctkGH, EvolvedVariableIndex[var], 0.0, + MoL_LinearCombination(cctkGH, EvolvedVariableIndex[var], rl, tl, 0.0, srcs, tls, facts, nsrc); } @@ -522,6 +528,12 @@ void MoL_InitRHS(CCTK_ARGUMENTS) totalsize *= cctk_ash[arraydim]; } + CCTK_INT rl = 0; + if (CCTK_IsFunctionAliased("GetRefinementLevel")) { + rl = GetRefinementLevel(cctkGH); + } + CCTK_INT tl = 0; + for (var = 0; var < MoLNumEvolvedVariables; var++) { StorageOn = CCTK_QueryGroupStorageI(cctkGH, @@ -544,7 +556,7 @@ void MoL_InitRHS(CCTK_ARGUMENTS) CCTK_WARN(0, "The grid function does not have storage assigned."); } - MoL_LinearCombination(cctkGH, RHSVariableIndex[var], 0.0, + MoL_LinearCombination(cctkGH, RHSVariableIndex[var], rl, tl, 0.0, NULL, NULL, NULL, 0); } diff --git a/src/Operators.c b/src/Operators.c index 21ff8b2..2cbde16 100644 --- a/src/Operators.c +++ b/src/Operators.c @@ -1,5 +1,10 @@ #include "Operators.h" + +#include <cctk.h> +#include <cctk_Parameters.h> + #include <assert.h> +#include <complex.h> #include <stddef.h> #include <stdlib.h> @@ -13,11 +18,12 @@ static void -error_no_storage(int const var, int const tl) +error_no_storage(int const var, int const rl, int const tl) { char *const fullname = CCTK_FullName(var); - CCTK_VWarn(CCTK_WARN_ABORT, __LINE__, __FILE__, CCTK_THORNSTRING, - "Variable %s, timelevel %d has no storage", fullname, tl); + CCTK_VError(__LINE__, __FILE__, CCTK_THORNSTRING, + "Variable %s, refinement level %d, timelevel %d has no storage", + fullname, rl, tl); free(fullname); return; } @@ -164,6 +170,16 @@ op_real_update_3(CCTK_REAL *restrict const varptr, @vtype int @vio inout @endvar + @var rl + @vdesc refinement level of all variables + @vtype int + @vio in + @endvar + @var tl + @vdesc time level of target variable + @vtype int + @vio in + @endvar @var scale @vdesc scale target by this @vtype CCTK_REAL @@ -200,19 +216,24 @@ op_real_update_3(CCTK_REAL *restrict const varptr, CCTK_INT MoL_LinearCombination(cGH const *const cctkGH, CCTK_INT const var, + CCTK_INT const rl, + CCTK_INT const tl, CCTK_REAL const scale, CCTK_INT const srcs[], CCTK_INT const tls[], CCTK_REAL const facts[], CCTK_INT const nsrcs) { + DECLARE_CCTK_PARAMETERS; + // Forward call to aliased function, if it is defined static int is_aliased = -1; if (is_aliased < 0) { is_aliased = CCTK_IsFunctionAliased("LinearCombination"); } if (is_aliased) { - return LinearCombination(cctkGH, var, scale, srcs, tls, facts, nsrcs); + return + LinearCombination(cctkGH, var, rl, tl, scale, srcs, tls, facts, nsrcs); } // Determine grid variable size @@ -231,12 +252,13 @@ MoL_LinearCombination(cGH const *const cctkGH, case CCTK_VARIABLE_REAL: { // Obtain pointer to variable data // TODO: check that all variable types are CCTK_REAL - CCTK_REAL *restrict const varptr = CCTK_VarDataPtrI(cctkGH, 0, var); - if (!varptr) error_no_storage(var, 0); + CCTK_REAL *restrict const varptr = CCTK_VarDataPtrI(cctkGH, tl, var); + if (!varptr) error_no_storage(var, rl, tl); CCTK_REAL const *restrict srcptrs[nsrcs]; for (int n=0; n<nsrcs; ++n) { + // TODO: Check that this is the right refinement level rl srcptrs[n] = CCTK_VarDataPtrI(cctkGH, tls[n], srcs[n]); - if (!srcptrs[n]) error_no_storage(srcs[n], tls[n]); + if (!srcptrs[n]) error_no_storage(srcs[n], rl, tls[n]); } if (scale == 0.0) { @@ -314,12 +336,13 @@ MoL_LinearCombination(cGH const *const cctkGH, case CCTK_VARIABLE_COMPLEX: { // Obtain pointer to variable data // TODO: check that all variable types are CCTK_COMPLEX - CCTK_COMPLEX *restrict const varptr = CCTK_VarDataPtrI(cctkGH, 0, var); - if (!varptr) error_no_storage(var, 0); + CCTK_COMPLEX *restrict const varptr = CCTK_VarDataPtrI(cctkGH, tl, var); + if (!varptr) error_no_storage(var, rl, tl); CCTK_COMPLEX const *restrict srcptrs[nsrcs]; for (int n=0; n<nsrcs; ++n) { + // TODO: Check that this is the right refinement level rl srcptrs[n] = CCTK_VarDataPtrI(cctkGH, tls[n], srcs[n]); - if (!srcptrs[n]) error_no_storage(srcs[n], tls[n]); + if (!srcptrs[n]) error_no_storage(srcs[n], rl, tls[n]); } if (scale == 0.0) { @@ -327,10 +350,9 @@ MoL_LinearCombination(cGH const *const cctkGH, // Loop over all grid points #pragma omp parallel for for (ptrdiff_t i=0; i<npoints; ++i) { - CCTK_COMPLEX tmp = CCTK_Cmplx(0.0, 0.0); + CCTK_COMPLEX tmp = 0.0; for (int n=0; n<nsrcs; ++n) { - tmp = CCTK_CmplxAdd(tmp, CCTK_CmplxMul(CCTK_Cmplx(facts[n], 0.0), - srcptrs[n][i])); + tmp += facts[n] * srcptrs[n][i]; } varptr[i] = tmp; } @@ -338,10 +360,9 @@ MoL_LinearCombination(cGH const *const cctkGH, // Update (add to) target variable #pragma omp parallel for for (ptrdiff_t i=0; i<npoints; ++i) { - CCTK_COMPLEX tmp = CCTK_CmplxMul(CCTK_Cmplx(scale, 0.0), varptr[i]); + CCTK_COMPLEX tmp = scale * varptr[i]; for (int n=0; n<nsrcs; ++n) { - tmp = CCTK_CmplxAdd(tmp, CCTK_CmplxMul(CCTK_Cmplx(facts[n], 0.0), - srcptrs[n][i])); + tmp += facts[n] * srcptrs[n][i]; } varptr[i] = tmp; } @@ -351,14 +372,13 @@ MoL_LinearCombination(cGH const *const cctkGH, default: // Other types (e.g. CCTK_REAL4) could be supported as well - CCTK_WARN(CCTK_WARN_ABORT, "Unsupported variable type"); + CCTK_ERROR("Unsupported variable type"); } if (CCTK_IsFunctionAliased("Accelerator_NotifyDataModified")) { - CCTK_INT const tl = 0; - Accelerator_NotifyDataModified(cctkGH, &var, &tl, 1, 0); + Accelerator_NotifyDataModified(cctkGH, &var, &rl, &tl, 1, 0); } - + // Done return 0; } diff --git a/src/Operators.h b/src/Operators.h index 72618e4..6a532e9 100644 --- a/src/Operators.h +++ b/src/Operators.h @@ -6,6 +6,8 @@ CCTK_INT MoL_LinearCombination(cGH const *const cctkGH, CCTK_INT const var, + CCTK_INT const rl, + CCTK_INT const tl, CCTK_REAL const scale, CCTK_INT const srcs[], CCTK_INT const tls[], @@ -102,6 +102,12 @@ void MoL_RK2Add(CCTK_ARGUMENTS) totalsize *= cctk_ash[arraydim]; } + CCTK_INT rl = 0; + if (CCTK_IsFunctionAliased("GetRefinementLevel")) { + rl = GetRefinementLevel(cctkGH); + } + CCTK_INT tl = 0; + switch (*MoL_Intermediate_Step) { @@ -114,7 +120,7 @@ void MoL_RK2Add(CCTK_ARGUMENTS) CCTK_INT const tls[] = {0}; CCTK_REAL const facts[] = {CCTK_DELTA_TIME}; MoL_LinearCombination(cctkGH, - EvolvedVariableIndex[var], 1.0, + EvolvedVariableIndex[var], rl, tl, 1.0, srcs, tls, facts, nsrcs); } @@ -125,7 +131,7 @@ void MoL_RK2Add(CCTK_ARGUMENTS) CCTK_INT const tls[] = {0}; CCTK_REAL const facts[] = {CCTK_DELTA_TIME}; MoL_LinearCombination(cctkGH, - EvolvedArrayVariableIndex[var], 1.0, + EvolvedArrayVariableIndex[var], rl, tl, 1.0, srcs, tls, facts, nsrcs); } @@ -140,7 +146,7 @@ void MoL_RK2Add(CCTK_ARGUMENTS) CCTK_INT const tls[] = {0}; CCTK_REAL const facts[] = {CCTK_DELTA_TIME}; MoL_LinearCombination(cctkGH, - EvolvedComplexVariableIndex[var], 1.0, + EvolvedComplexVariableIndex[var], rl, tl, 1.0, srcs, tls, facts, nsrcs); } @@ -158,7 +164,7 @@ void MoL_RK2Add(CCTK_ARGUMENTS) CCTK_INT const tls[] = {1, 0}; CCTK_REAL const facts[] = {0.5, CCTK_DELTA_TIME}; MoL_LinearCombination(cctkGH, - EvolvedVariableIndex[var], 0.5, + EvolvedVariableIndex[var], rl, tl, 0.5, srcs, tls, facts, nsrcs); } @@ -170,7 +176,7 @@ void MoL_RK2Add(CCTK_ARGUMENTS) CCTK_INT const tls[] = {1, 0}; CCTK_REAL const facts[] = {0.5, CCTK_DELTA_TIME}; MoL_LinearCombination(cctkGH, - EvolvedArrayVariableIndex[var], 0.5, + EvolvedArrayVariableIndex[var], rl, tl, 0.5, srcs, tls, facts, nsrcs); } @@ -186,7 +192,7 @@ void MoL_RK2Add(CCTK_ARGUMENTS) CCTK_INT const tls[] = {1, 0}; CCTK_REAL const facts[] = {0.5, CCTK_DELTA_TIME}; MoL_LinearCombination(cctkGH, - EvolvedComplexVariableIndex[var], 0.5, + EvolvedComplexVariableIndex[var], rl, tl, 0.5, srcs, tls, facts, nsrcs); } @@ -105,6 +105,12 @@ void MoL_RK3Add(CCTK_ARGUMENTS) totalsize *= cctk_ash[arraydim]; } + CCTK_INT rl = 0; + if (CCTK_IsFunctionAliased("GetRefinementLevel")) { + rl = GetRefinementLevel(cctkGH); + } + CCTK_INT tl = 0; + switch (*MoL_Intermediate_Step) { @@ -117,7 +123,7 @@ void MoL_RK3Add(CCTK_ARGUMENTS) CCTK_INT const tls[] = {0}; CCTK_REAL const facts[] = {CCTK_DELTA_TIME}; MoL_LinearCombination(cctkGH, - EvolvedVariableIndex[var], 1.0, + EvolvedVariableIndex[var], rl, tl, 1.0, srcs, tls, facts, nsrcs); } @@ -128,7 +134,7 @@ void MoL_RK3Add(CCTK_ARGUMENTS) CCTK_INT const tls[] = {0}; CCTK_REAL const facts[] = {CCTK_DELTA_TIME}; MoL_LinearCombination(cctkGH, - EvolvedArrayVariableIndex[var], 1.0, + EvolvedArrayVariableIndex[var], rl, tl, 1.0, srcs, tls, facts, nsrcs); } @@ -143,7 +149,7 @@ void MoL_RK3Add(CCTK_ARGUMENTS) CCTK_INT const tls[] = {0}; CCTK_REAL const facts[] = {CCTK_DELTA_TIME}; MoL_LinearCombination(cctkGH, - EvolvedComplexVariableIndex[var], 1.0, + EvolvedComplexVariableIndex[var], rl, tl, 1.0, srcs, tls, facts, nsrcs); } @@ -162,7 +168,7 @@ void MoL_RK3Add(CCTK_ARGUMENTS) CCTK_INT const tls[] = {1, 0}; CCTK_REAL const facts[] = {0.75, CCTK_DELTA_TIME}; MoL_LinearCombination(cctkGH, - EvolvedVariableIndex[var], 0.25, + EvolvedVariableIndex[var], rl, tl, 0.25, srcs, tls, facts, nsrcs); } @@ -174,7 +180,7 @@ void MoL_RK3Add(CCTK_ARGUMENTS) CCTK_INT const tls[] = {1, 0}; CCTK_REAL const facts[] = {0.75, CCTK_DELTA_TIME}; MoL_LinearCombination(cctkGH, - EvolvedArrayVariableIndex[var], 0.25, + EvolvedArrayVariableIndex[var], rl, tl, 0.25, srcs, tls, facts, nsrcs); } @@ -190,7 +196,7 @@ void MoL_RK3Add(CCTK_ARGUMENTS) CCTK_INT const tls[] = {1, 0}; CCTK_REAL const facts[] = {0.75, CCTK_DELTA_TIME}; MoL_LinearCombination(cctkGH, - EvolvedComplexVariableIndex[var], 0.25, + EvolvedComplexVariableIndex[var], rl, tl, 0.25, srcs, tls, facts, nsrcs); } @@ -208,7 +214,7 @@ void MoL_RK3Add(CCTK_ARGUMENTS) CCTK_INT const tls[] = {1, 0}; CCTK_REAL const facts[] = {1.0/3.0, CCTK_DELTA_TIME}; MoL_LinearCombination(cctkGH, - EvolvedVariableIndex[var], 2.0/3.0, + EvolvedVariableIndex[var], rl, tl, 2.0/3.0, srcs, tls, facts, nsrcs); } @@ -220,7 +226,7 @@ void MoL_RK3Add(CCTK_ARGUMENTS) CCTK_INT const tls[] = {1, 0}; CCTK_REAL const facts[] = {1.0/3.0, CCTK_DELTA_TIME}; MoL_LinearCombination(cctkGH, - EvolvedArrayVariableIndex[var], 2.0/3.0, + EvolvedArrayVariableIndex[var], rl, tl, 2.0/3.0, srcs, tls, facts, nsrcs); } @@ -236,7 +242,7 @@ void MoL_RK3Add(CCTK_ARGUMENTS) CCTK_INT const tls[] = {1, 0}; CCTK_REAL const facts[] = {1.0/3.0, CCTK_DELTA_TIME}; MoL_LinearCombination(cctkGH, - EvolvedComplexVariableIndex[var], 2.0/3.0, + EvolvedComplexVariableIndex[var], rl, tl, 2.0/3.0, srcs, tls, facts, nsrcs); } @@ -150,6 +150,12 @@ CCTK_WARN(0, "not implemented"); /* Real GFs */ + CCTK_INT rl = 0; + if (CCTK_IsFunctionAliased("GetRefinementLevel")) { + rl = GetRefinementLevel(cctkGH); + } + CCTK_INT tl = 0; + for (var = 0; var < MoLNumEvolvedVariables; var++) { { @@ -160,7 +166,7 @@ CCTK_WARN(0, "not implemented"); CCTK_REAL const facts[] = {1.0, (*Original_Delta_Time) / cctkGH->cctk_timefac * beta}; MoL_LinearCombination(cctkGH, - EvolvedVariableIndex[var], 0.0, + EvolvedVariableIndex[var], rl, tl, 0.0, srcs, tls, facts, nsrcs); time = facts[0] * old_time + facts[1] * time_rhs; } @@ -169,7 +175,7 @@ CCTK_WARN(0, "not implemented"); if ((*MoL_Intermediate_Step) == MoL_Intermediate_Steps) { MoL_LinearCombination(cctkGH, - scratchspace_firstindex + var, 0.0, + scratchspace_firstindex + var, rl, tl, 0.0, NULL, NULL, NULL, 0); scratch_time = 0.0; } @@ -181,7 +187,7 @@ CCTK_WARN(0, "not implemented"); CCTK_INT const tls[] = {0}; CCTK_REAL const facts[] = {alpha}; MoL_LinearCombination(cctkGH, - scratchspace_firstindex + var, 1.0, + scratchspace_firstindex + var, rl, tl, 1.0, srcs, tls, facts, nsrcs); scratch_time += facts[0] * time; } @@ -193,7 +199,7 @@ CCTK_WARN(0, "not implemented"); CCTK_INT const tls[] = {0, 1}; CCTK_REAL const facts[] = {1.0, -4.0/3.0}; MoL_LinearCombination(cctkGH, - EvolvedVariableIndex[var], 1.0, + EvolvedVariableIndex[var], rl, tl, 1.0, srcs, tls, facts, nsrcs); time += facts[0] * scratch_time + facts[1] * old_time; } @@ -136,6 +136,12 @@ void MoL_RK87Add(CCTK_ARGUMENTS) /* First store (dt times) the rhs in the scratch array. */ + CCTK_INT rl = 0; + if (CCTK_IsFunctionAliased("GetRefinementLevel")) { + rl = GetRefinementLevel(cctkGH); + } + CCTK_INT tl = 0; + for (var = 0; var < MoLNumEvolvedVariables; var++) { int const step = MoL_Intermediate_Steps - (*MoL_Intermediate_Step); @@ -147,7 +153,7 @@ void MoL_RK87Add(CCTK_ARGUMENTS) CCTK_INT const tls[] = {0}; CCTK_REAL const facts[] = {(*Original_Delta_Time) / cctkGH->cctk_timefac}; MoL_LinearCombination(cctkGH, - scratchvarindex, 1.0, + scratchvarindex, rl, tl, 1.0, srcs, tls, facts, nsrcs); } @@ -176,7 +182,7 @@ void MoL_RK87Add(CCTK_ARGUMENTS) } MoL_LinearCombination(cctkGH, - EvolvedVariableIndex[var], 0.0, + EvolvedVariableIndex[var], rl, tl, 0.0, srcs, tls, facts, nsrcs); } else @@ -200,7 +206,7 @@ void MoL_RK87Add(CCTK_ARGUMENTS) } MoL_LinearCombination(cctkGH, - EvolvedVariableIndex[var], 0.0, + EvolvedVariableIndex[var], rl, tl, 0.0, srcs, tls, facts, nsrcs); } @@ -221,7 +227,7 @@ void MoL_RK87Add(CCTK_ARGUMENTS) } MoL_LinearCombination(cctkGH, - error_firstindex + var, 0.0, + error_firstindex + var, rl, tl, 0.0, srcs, tls, facts, nsrcs); } |