aboutsummaryrefslogtreecommitdiff
path: root/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.h
diff options
context:
space:
mode:
Diffstat (limited to 'Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.h')
-rw-r--r--Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.h707
1 files changed, 21 insertions, 686 deletions
diff --git a/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.h b/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.h
index 041347d..401b4e0 100644
--- a/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.h
+++ b/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.h
@@ -27,655 +27,33 @@
along with Kranc; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-
-#ifndef NOPRECOMPUTE
-#define PRECOMPUTE
-#endif
-
-#if defined(FD_C0) || defined(FD_C2) || defined(FD_C4) || defined(FD_C2C4)
-#define FD_SET_BY_USER
-#endif
-#ifndef FD_SET_BY_USER
-#define FD_C2
-#endif
+#include "cctk.h"
-#if defined(FD_C0)
-#define FD_METHOD_DESC "FD method: replace derivatives by zero"
+#ifdef __cplusplus
+extern "C" {
#endif
-#if defined(FD_C2)
-#define FD_METHOD_DESC "FD method: second order centered finite differences"
-#endif
-
-#if defined(FD_C4)
-#define FD_METHOD_DESC "FD method: fourth order centered finite differences"
-#endif
-
-#if defined(FD_C2C4)
-#define FD_METHOD_DESC "FD method: weighted 2nd/4th order centered finite differences"
-#endif
-
-
-
-/* utility functions */
-#if defined(KRANC_C)
-#define string(d,f) d ## f
-#else
-#define string(d,f) d/**/f
+#ifdef __cplusplus
+# ifdef CCTK_CXX_RESTRICT
+# define restrict CCTK_CXX_RESTRICT
+# endif
#endif
-#if defined(KRANC_C)
-#define IMAX(int1, int2) ((int1) > (int2) ? (int1) : (int2))
-#endif
-
-
#include "MathematicaCompat.h"
-/* finite differencing macros */
-
-/* */
-/* add method argument to shorthands */
-/* */
-
-/* third derivatives */
-#define D111x(gf) string(D111,gf)
-#define D211x(gf) string(D211,gf)
-#define D311x(gf) string(D311,gf)
-#define D221x(gf) string(D221,gf)
-#define D321x(gf) string(D321,gf)
-#define D331x(gf) string(D331,gf)
-#define D222x(gf) string(D222,gf)
-#define D322x(gf) string(D322,gf)
-#define D332x(gf) string(D332,gf)
-#define D333x(gf) string(D333,gf)
-
-/* second derivatives */
-#define D11x(gf) string(D11,gf)
-#define D22x(gf) string(D22,gf)
-#define D33x(gf) string(D33,gf)
-#define D21x(gf) string(D21,gf)
-#define D32x(gf) string(D32,gf)
-#define D31x(gf) string(D31,gf)
-
-/* first derivatives */
-#define D1x(gf) string(D1,gf)
-#define D2x(gf) string(D2,gf)
-#define D3x(gf) string(D3,gf)
-
-#ifdef PRECOMPUTE
-
-/* third derivatives */
-#define D111(gf) string(D111,gf)
-#define D211(gf) string(D211,gf)
-#define D311(gf) string(D311,gf)
-#define D221(gf) string(D221,gf)
-#define D321(gf) string(D321,gf)
-#define D331(gf) string(D331,gf)
-#define D222(gf) string(D222,gf)
-#define D322(gf) string(D322,gf)
-#define D332(gf) string(D332,gf)
-#define D333(gf) string(D333,gf)
-
-/* second derivatives */
-#define D11(gf,i,j,k) string(D11,gf)
-#define D22(gf,i,j,k) string(D22,gf)
-#define D33(gf,i,j,k) string(D33,gf)
-#define D21(gf,i,j,k) string(D21,gf)
-#define D32(gf,i,j,k) string(D32,gf)
-#define D31(gf,i,j,k) string(D31,gf)
-
-/* first derivatives */
-#define D1(gf,i,j,k) string(D1,gf)
-#define D2(gf,i,j,k) string(D2,gf)
-#define D3(gf,i,j,k) string(D3,gf)
-
-#else
-
-/* third derivatives */
-#define D111(gf) D111gf(gf,i,j,k)
-#define D211(gf) D211gf(gf,i,j,k)
-#define D311(gf) D311gf(gf,i,j,k)
-#define D221(gf) D221gf(gf,i,j,k)
-#define D321(gf) D321gf(gf,i,j,k)
-#define D331(gf) D331gf(gf,i,j,k)
-#define D222(gf) D222gf(gf,i,j,k)
-#define D322(gf) D322gf(gf,i,j,k)
-#define D332(gf) D332gf(gf,i,j,k)
-#define D333(gf) D333gf(gf,i,j,k)
-
-/* second derivatives */
-#define D11(gf,i,j,k) D11gf(gf,i,j,k)
-#define D22(gf,i,j,k) D22gf(gf,i,j,k)
-#define D33(gf,i,j,k) D33gf(gf,i,j,k)
-#define D21(gf,i,j,k) D21gf(gf,i,j,k)
-#define D32(gf,i,j,k) D32gf(gf,i,j,k)
-#define D31(gf,i,j,k) D31gf(gf,i,j,k)
-
-/* first derivatives */
-#define D1(gf,i,j,k) D1gf(gf, i,j,k)
-#define D2(gf,i,j,k) D2gf(gf, i,j,k)
-#define D3(gf,i,j,k) D3gf(gf, i,j,k)
-
-#endif
-
-
-#ifdef FD_C0
-/* third derivatives */
-#define D111gf(gf,i,j,k) D111_c0(gf,i,j,k)
-#define D211gf(gf,i,j,k) D211_c0(gf,i,j,k)
-#define D311gf(gf,i,j,k) D311_c0(gf,i,j,k)
-#define D221gf(gf,i,j,k) D221_c0(gf,i,j,k)
-#define D321gf(gf,i,j,k) D321_c0(gf,i,j,k)
-#define D331gf(gf,i,j,k) D331_c0(gf,i,j,k)
-#define D222gf(gf,i,j,k) D222_c0(gf,i,j,k)
-#define D322gf(gf,i,j,k) D322_c0(gf,i,j,k)
-#define D332gf(gf,i,j,k) D332_c0(gf,i,j,k)
-#define D333gf(gf,i,j,k) D333_c0(gf,i,j,k)
-
-/* second derivatives */
-#define D11gf(gf,i,j,k) D11_c0(gf,i,j,k)
-#define D22gf(gf,i,j,k) D22_c0(gf,i,j,k)
-#define D33gf(gf,i,j,k) D33_c0(gf,i,j,k)
-#define D21gf(gf,i,j,k) D21_c0(gf,i,j,k)
-#define D32gf(gf,i,j,k) D32_c0(gf,i,j,k)
-#define D31gf(gf,i,j,k) D31_c0(gf,i,j,k)
-
-/* first derivatives */
-#define D1gf(gf,i,j,k) D1_c0(gf, i,j,k)
-#define D2gf(gf,i,j,k) D2_c0(gf, i,j,k)
-#define D3gf(gf,i,j,k) D3_c0(gf, i,j,k)
-#endif
-
-
-
-#ifdef FD_C2
-/* third derivatives */
-#define D111gf(gf,i,j,k) D111_c2(gf,i,j,k)
-#define D211gf(gf,i,j,k) D211_c2(gf,i,j,k)
-#define D311gf(gf,i,j,k) D311_c2(gf,i,j,k)
-#define D221gf(gf,i,j,k) D221_c2(gf,i,j,k)
-#define D321gf(gf,i,j,k) D321_c2(gf,i,j,k)
-#define D331gf(gf,i,j,k) D331_c2(gf,i,j,k)
-#define D222gf(gf,i,j,k) D222_c2(gf,i,j,k)
-#define D322gf(gf,i,j,k) D322_c2(gf,i,j,k)
-#define D332gf(gf,i,j,k) D332_c2(gf,i,j,k)
-#define D333gf(gf,i,j,k) D333_c2(gf,i,j,k)
-
-/* second derivatives */
-#define D11gf(gf,i,j,k) D11_c2(gf,i,j,k)
-#define D22gf(gf,i,j,k) D22_c2(gf,i,j,k)
-#define D33gf(gf,i,j,k) D33_c2(gf,i,j,k)
-#define D21gf(gf,i,j,k) D21_c2(gf,i,j,k)
-#define D32gf(gf,i,j,k) D32_c2(gf,i,j,k)
-#define D31gf(gf,i,j,k) D31_c2(gf,i,j,k)
-
-/* first derivatives */
-#define D1gf(gf,i,j,k) D1_c2(gf, i,j,k)
-#define D2gf(gf,i,j,k) D2_c2(gf, i,j,k)
-#define D3gf(gf,i,j,k) D3_c2(gf, i,j,k)
-#endif
-
-
-
-#ifdef FD_C4
-/* third derivatives */
-#define D111gf(gf,i,j,k) D111_c4(gf,i,j,k)
-#define D211gf(gf,i,j,k) D211_c4(gf,i,j,k)
-#define D311gf(gf,i,j,k) D311_c4(gf,i,j,k)
-#define D221gf(gf,i,j,k) D221_c4(gf,i,j,k)
-#define D321gf(gf,i,j,k) D321_c4(gf,i,j,k)
-#define D331gf(gf,i,j,k) D331_c4(gf,i,j,k)
-#define D222gf(gf,i,j,k) D222_c4(gf,i,j,k)
-#define D322gf(gf,i,j,k) D322_c4(gf,i,j,k)
-#define D332gf(gf,i,j,k) D332_c4(gf,i,j,k)
-#define D333gf(gf,i,j,k) D333_c4(gf,i,j,k)
-
-/* second derivatives */
-#define D11gf(gf,i,j,k) D11_c4(gf,i,j,k)
-#define D22gf(gf,i,j,k) D22_c4(gf,i,j,k)
-#define D33gf(gf,i,j,k) D33_c4(gf,i,j,k)
-#define D21gf(gf,i,j,k) D21_c4(gf,i,j,k)
-#define D32gf(gf,i,j,k) D32_c4(gf,i,j,k)
-#define D31gf(gf,i,j,k) D31_c4(gf,i,j,k)
-
-/* first derivatives */
-#define D1gf(gf,i,j,k) D1_c4(gf, i,j,k)
-#define D2gf(gf,i,j,k) D2_c4(gf, i,j,k)
-#define D3gf(gf,i,j,k) D3_c4(gf, i,j,k)
-#endif
-
-
-#ifdef FD_C2C4
-/* third derivatives */
-#define D111gf(gf,i,j,k) D111_c2c4(gf,i,j,k)
-#define D211gf(gf,i,j,k) D211_c2c4(gf,i,j,k)
-#define D311gf(gf,i,j,k) D311_c2c4(gf,i,j,k)
-#define D221gf(gf,i,j,k) D221_c2c4(gf,i,j,k)
-#define D321gf(gf,i,j,k) D321_c2c4(gf,i,j,k)
-#define D331gf(gf,i,j,k) D331_c2c4(gf,i,j,k)
-#define D222gf(gf,i,j,k) D222_c2c4(gf,i,j,k)
-#define D322gf(gf,i,j,k) D322_c2c4(gf,i,j,k)
-#define D332gf(gf,i,j,k) D332_c2c4(gf,i,j,k)
-#define D333gf(gf,i,j,k) D333_c2c4(gf,i,j,k)
-
-/* second derivatives */
-#define D11gf(gf,i,j,k) D11_c2c4(gf,i,j,k)
-#define D22gf(gf,i,j,k) D22_c2c4(gf,i,j,k)
-#define D33gf(gf,i,j,k) D33_c2c4(gf,i,j,k)
-#define D21gf(gf,i,j,k) D21_c2c4(gf,i,j,k)
-#define D32gf(gf,i,j,k) D32_c2c4(gf,i,j,k)
-#define D31gf(gf,i,j,k) D31_c2c4(gf,i,j,k)
-
-/* first derivatives */
-#define D1gf(gf,i,j,k) D1_c2c4(gf, i,j,k)
-#define D2gf(gf,i,j,k) D2_c2c4(gf, i,j,k)
-#define D3gf(gf,i,j,k) D3_c2c4(gf, i,j,k)
-#endif
-
-
-
-
-/*****************************************************/
-/* */
-/* METHODS */
-/* */
-/*****************************************************/
-
-/* c0 */
-
-/* set all derivatives = 0 */
-/* for debugging and benchmarking */
-
-/* third derivatives */
-
-#define D111_c0(gf,i,j,k) 0.
-#define D211_c0(gf,i,j,k) 0.
-#define D311_c0(gf,i,j,k) 0.
-#define D221_c0(gf,i,j,k) 0.
-#define D321_c0(gf,i,j,k) 0.
-#define D331_c0(gf,i,j,k) 0.
-#define D222_c0(gf,i,j,k) 0.
-#define D322_c0(gf,i,j,k) 0.
-#define D332_c0(gf,i,j,k) 0.
-#define D333_c0(gf,i,j,k) 0.
-
-/* second derivatives */
-
-#define D11_c0(gf,i,j,k) 0.
-#define D22_c0(gf,i,j,k) 0.
-#define D33_c0(gf,i,j,k) 0.
-#define D21_c0(gf,i,j,k) 0.
-#define D32_c0(gf,i,j,k) 0.
-#define D31_c0(gf,i,j,k) 0.
-
-/* first derivatives */
-
-#define D1_c0(gf,i,j,k) 0.
-#define D2_c0(gf,i,j,k) 0.
-#define D3_c0(gf,i,j,k) 0.
-
-
-
-#ifndef KRANC_C
-
-/* c2 */
-/* */
-/* 2nd order centered */
-/* */
-
-/* third derivatives, centered, 2nd order */
-
-#define D111_c2(gf,i,j,k) ((- gf(i+2,j,k) + 2*gf(i+1,j,k) - 2*gf(i-1,j,k) + gf(i-2,j,k)) * dxi*dxi*dxi * (1.0/2.0))
-#define D211_c2(gf,i,j,k) ((gf(i+1,j+1,k) - 2*gf(i,j+1,k) + gf(i-1,j+1,k) - gf(i+1,j-1,k) + 2*gf(i,j-1,k) - gf(i-1,j-1,k)) * dxi*dxi*dyi * (1.0/2.0))
-#define D311_c2(gf,i,j,k) ((gf(i+1,j,k+1) - 2*gf(i,j,k+1) + gf(i-1,j,k+1) - gf(i+1,j,k-1) + 2*gf(i,j,k-1) - gf(i-1,j,k-1)) * dxi*dxi*dzi * (1.0/2.0))
-#define D221_c2(gf,i,j,k) ((gf(i+1,j+1,k) - 2*gf(i+1,j,k) + gf(i+1,j-1,k) - gf(i-1,j+1,k) + 2*gf(i-1,j,k) - gf(i-1,j-1,k)) * dxi*dyi*dyi * (1.0/2.0))
-#define D321_c2(gf,i,j,k) ((gf(i+1,j+1,k+1) - gf(i-1,j+1,k+1) - gf(i+1,j-1,k+1) + gf(i-1,j-1,k+1) - gf(i+1,j+1,k-1) + gf(i-1,j+1,k-1) + gf(i+1,j-1,k-1) - gf(i-1,j-1,k-1)) * dxi*dyi*dzi * (1.0/8.0))
-#define D331_c2(gf,i,j,k) ((gf(i+1,j,k+1) - 2*gf(i+1,j,k) + gf(i+1,j,k-1) - gf(i-1,j,k+1) + 2*gf(i-1,j,k) - gf(i-1,j,k-1)) * dxi*dzi*dzi * (1.0/2.0))
-#define D222_c2(gf,i,j,k) ((- gf(i,j+2,k) + 2*gf(i,j+1,k) - 2*gf(i,j-1,k) + gf(i,j-2,k)) * dyi*dyi*dyi * (1.0/2.0))
-#define D322_c2(gf,i,j,k) ((gf(i,j+1,k+1) - 2*gf(i,j,k+1) + gf(i,j-1,k+1) - gf(i,j+1,k-1) + 2*gf(i,j,k-1) - gf(i,j-1,k-1)) * dyi*dyi*dzi * (1.0/2.0))
-#define D332_c2(gf,i,j,k) ((gf(i,j+1,k+1) - 2*gf(i,j+1,k) + gf(i,j+1,k-1) - gf(i,j-1,k+1) + 2*gf(i,j-1,k) - gf(i,j-1,k-1)) * dyi*dzi*dzi * (1.0/2.0))
-#define D333_c2(gf,i,j,k) ((- gf(i,j,k+2) + 2*gf(i,j,k+1) - 2*gf(i,j,k-1) + gf(i,j,k-2)) * dzi*dzi*dzi * (1.0/2.0))
-
-/* second derivatives, centered, 2nd order */
-
-#define D11_c2(gf,i,j,k) \
- (( gf(i+1,j,k) \
- - 2.*gf(i, j,k) \
- + gf(i-1,j,k)) * dxi * dxi )
-
-#define D22_c2(gf,i,j,k) \
- (( gf(i,j+1,k) \
- - 2.*gf(i,j, k) \
- + gf(i,j-1,k)) * dyi * dyi )
-
-#define D33_c2(gf,i,j,k) \
- (( gf(i,j,k+1) \
- - 2.*gf(i,j,k ) \
- + gf(i,j,k-1)) * dzi * dzi )
-
-#define D21_c2(gf,i,j,k) \
- ((gf(i+1,j+1,k) \
- + gf(i-1,j-1,k) \
- - gf(i+1,j-1,k) \
- - gf(i-1,j+1,k)) * hdxi * hdyi )
-
-#define D32_c2(gf,i,j,k) \
- ((gf(i,j+1,k+1) \
- + gf(i,j-1,k-1) \
- - gf(i,j+1,k-1) \
- - gf(i,j-1,k+1)) * hdyi * hdzi )
-
-#define D31_c2(gf,i,j,k) \
- ((gf(i+1,j,k+1) \
- + gf(i-1,j,k-1) \
- - gf(i+1,j,k-1) \
- - gf(i-1,j,k+1)) * hdxi * hdzi )
-
-/* first derivatives, centered, 2nd order */
-
-#define D1_c2(gf,i,j,k) \
- ((gf(i+1,j,k) \
- - gf(i-1,j,k)) * hdxi)
-
-#define D2_c2(gf,i,j,k) \
- ((gf(i,j+1,k) \
- - gf(i,j-1,k)) * hdyi)
-
-#define D3_c2(gf,i,j,k) \
- ((gf(i,j,k+1) \
- - gf(i,j,k-1)) * hdzi)
-
-#else
-
-
-#define D11_c2(gf,i,j,k) \
- (( gf[CCTK_GFINDEX3D(cctkGH,i+1,j,k)] \
- - 2.*gf[CCTK_GFINDEX3D(cctkGH,i, j,k)] \
- + gf[CCTK_GFINDEX3D(cctkGH,i-1,j,k)]) * dxi * dxi )
-
-#define D22_c2(gf,i,j,k) \
- (( gf[CCTK_GFINDEX3D(cctkGH,i,j+1,k)] \
- - 2.*gf[CCTK_GFINDEX3D(cctkGH,i,j, k)] \
- + gf[CCTK_GFINDEX3D(cctkGH,i,j-1,k)]) * dyi * dyi )
-
-#define D33_c2(gf,i,j,k) \
- (( gf[CCTK_GFINDEX3D(cctkGH,i,j,k+1)] \
- - 2.*gf[CCTK_GFINDEX3D(cctkGH,i,j,k )] \
- + gf[CCTK_GFINDEX3D(cctkGH,i,j,k-1)]) * dzi * dzi )
-
-#define D21_c2(gf,i,j,k) \
- ((gf[CCTK_GFINDEX3D(cctkGH,i+1,j+1,k)] \
- + gf[CCTK_GFINDEX3D(cctkGH,i-1,j-1,k)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i+1,j-1,k)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i-1,j+1,k)]) * hdxi * hdyi )
-
-#define D32_c2(gf,i,j,k) \
- ((gf[CCTK_GFINDEX3D(cctkGH,i,j+1,k+1)] \
- + gf[CCTK_GFINDEX3D(cctkGH,i,j-1,k-1)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i,j+1,k-1)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i,j-1,k+1)]) * hdyi * hdzi )
-
-#define D31_c2(gf,i,j,k) \
- ((gf[CCTK_GFINDEX3D(cctkGH,i+1,j,k+1)] \
- + gf[CCTK_GFINDEX3D(cctkGH,i-1,j,k-1)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i+1,j,k-1)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i-1,j,k+1)]) * hdxi * hdzi )
-
-/* first derivatives, centered, 2nd order */
-
-#define D1_c2(gf,i,j,k) \
- ((gf[CCTK_GFINDEX3D(cctkGH,i+1,j,k)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i-1,j,k)]) * hdxi)
-
-#define D2_c2(gf,i,j,k) \
- ((gf[CCTK_GFINDEX3D(cctkGH,i,j+1,k)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i,j-1,k)]) * hdyi)
-
-#define D3_c2(gf,i,j,k) \
- ((gf[CCTK_GFINDEX3D(cctkGH,i,j,k+1)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i,j,k-1)]) * hdzi)
-
-#endif
-
-
-/* c4 */
-/* */
-/* 4th order centered */
-/* */
-
-/* second derivatives, centered, 4th order */
-
-#ifndef KRANC_C
-
-#define D11_c4(gf,i,j,k) \
- ((- gf(i+2,j,k) \
- + 16. * gf(i+1,j,k) \
- - 30. * gf(i, j,k) \
- + 16. * gf(i-1,j,k) \
- - gf(i-2,j,k)) * dxi * dxi / 12.)
-
-
-#define D22_c4(gf,i,j,k) \
- ((- gf(i,j+2,k) \
- + 16. * gf(i,j+1,k) \
- - 30. * gf(i,j, k) \
- + 16. * gf(i,j-1,k) \
- - gf(i,j-2,k)) * dyi * dyi / 12.)
-
-
-#define D33_c4(gf,i,j,k) \
- ((- gf(i,j,k+2) \
- + 16. * gf(i,j,k+1) \
- - 30. * gf(i,j,k ) \
- + 16. * gf(i,j,k-1) \
- - gf(i,j,k-2)) * dzi * dzi / 12.)
-
-#define D21_c4(gf,i,j,k) \
- ((- gf(i+2,j+2,k) \
- + gf(i+2,j-2,k) \
- + gf(i-2,j+2,k) \
- - gf(i-2,j-2,k) \
- + 16. * gf(i+1,j+1,k) \
- - 16. * gf(i+1,j-1,k) \
- - 16. * gf(i-1,j+1,k) \
- + 16. * gf(i-1,j-1,k)) * dxi * dyi / 48.)
-
-#define D31_c4(gf,i,j,k) \
- ((- gf(i+2,j,k+2) \
- + gf(i+2,j,k-2) \
- + gf(i-2,j,k+2) \
- - gf(i-2,j,k-2) \
- + 16. * gf(i+1,j,k+1) \
- - 16. * gf(i+1,j,k-1) \
- - 16. * gf(i-1,j,k+1) \
- + 16. * gf(i-1,j,k-1)) * dxi * dzi / 48.)
-
-
-#define D32_c4(gf,i,j,k) \
- ((- gf(i,j+2,k+2) \
- + gf(i,j+2,k-2) \
- + gf(i,j-2,k+2) \
- - gf(i,j-2,k-2) \
- + 16. * gf(i,j+1,k+1) \
- - 16. * gf(i,j+1,k-1) \
- - 16. * gf(i,j-1,k+1) \
- + 16. * gf(i,j-1,k-1)) * dzi * dyi / 48.)
-
-
-/* first derivatives, centered, 4th order */
-
-#define D1_c4(gf,i,j,k) \
- ((- gf(i+2,j,k) \
- + 8. * gf(i+1,j,k) \
- - 8. * gf(i-1,j,k) \
- + gf(i-2,j,k)) * (dxi / 12.))
-
-#define D2_c4(gf,i,j,k) \
- ((- gf(i,j+2,k) \
- + 8. * gf(i,j+1,k) \
- - 8. * gf(i,j-1,k) \
- + gf(i,j-2,k)) * (dyi / 12.))
-
-#define D3_c4(gf,i,j,k) \
- ((- gf(i,j,k+2) \
- + 8. * gf(i,j,k+1) \
- - 8. * gf(i,j,k-1) \
- + gf(i,j,k-2)) * (dzi / 12.))
-
-
-#else
-
-#define D11_c4(gf,i,j,k) \
- ((- gf[CCTK_GFINDEX3D(cctkGH,i+2,j,k)] \
- + 16. * gf[CCTK_GFINDEX3D(cctkGH,i+1,j,k)] \
- - 30. * gf[CCTK_GFINDEX3D(cctkGH,i, j,k)] \
- + 16. * gf[CCTK_GFINDEX3D(cctkGH,i-1,j,k)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i-2,j,k)]) * dxi * dxi / 12.)
-
-
-#define D22_c4(gf,i,j,k) \
- ((- gf[CCTK_GFINDEX3D(cctkGH,i,j+2,k)] \
- + 16. * gf[CCTK_GFINDEX3D(cctkGH,i,j+1,k)] \
- - 30. * gf[CCTK_GFINDEX3D(cctkGH,i,j, k)] \
- + 16. * gf[CCTK_GFINDEX3D(cctkGH,i,j-1,k)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i,j-2,k)]) * dyi * dyi / 12.)
-
-
-#define D33_c4(gf,i,j,k) \
- ((- gf[CCTK_GFINDEX3D(cctkGH,i,j,k+2)] \
- + 16. * gf[CCTK_GFINDEX3D(cctkGH,i,j,k+1)] \
- - 30. * gf[CCTK_GFINDEX3D(cctkGH,i,j,k )] \
- + 16. * gf[CCTK_GFINDEX3D(cctkGH,i,j,k-1)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i,j,k-2)]) * dzi * dzi / 12.)
-
-#define D21_c4(gf,i,j,k) \
- ((- gf[CCTK_GFINDEX3D(cctkGH,i+2,j+2,k)] \
- + gf[CCTK_GFINDEX3D(cctkGH,i+2,j-2,k)] \
- + gf[CCTK_GFINDEX3D(cctkGH,i-2,j+2,k)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i-2,j-2,k)] \
- + 16. * gf[CCTK_GFINDEX3D(cctkGH,i+1,j+1,k)] \
- - 16. * gf[CCTK_GFINDEX3D(cctkGH,i+1,j-1,k)] \
- - 16. * gf[CCTK_GFINDEX3D(cctkGH,i-1,j+1,k)] \
- + 16. * gf[CCTK_GFINDEX3D(cctkGH,i-1,j-1,k)]) * dxi * dyi / 48.)
-
-#define D31_c4(gf,i,j,k) \
- ((- gf[CCTK_GFINDEX3D(cctkGH,i+2,j,k+2)] \
- + gf[CCTK_GFINDEX3D(cctkGH,i+2,j,k-2)] \
- + gf[CCTK_GFINDEX3D(cctkGH,i-2,j,k+2)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i-2,j,k-2)] \
- + 16. * gf[CCTK_GFINDEX3D(cctkGH,i+1,j,k+1)] \
- - 16. * gf[CCTK_GFINDEX3D(cctkGH,i+1,j,k-1)] \
- - 16. * gf[CCTK_GFINDEX3D(cctkGH,i-1,j,k+1)] \
- + 16. * gf[CCTK_GFINDEX3D(cctkGH,i-1,j,k-1)]) * dxi * dzi / 48.)
-
-
-#define D32_c4(gf,i,j,k) \
- ((- gf[CCTK_GFINDEX3D(cctkGH,i,j+2,k+2)] \
- + gf[CCTK_GFINDEX3D(cctkGH,i,j+2,k-2)] \
- + gf[CCTK_GFINDEX3D(cctkGH,i,j-2,k+2)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i,j-2,k-2)] \
- + 16. * gf[CCTK_GFINDEX3D(cctkGH,i,j+1,k+1)] \
- - 16. * gf[CCTK_GFINDEX3D(cctkGH,i,j+1,k-1)] \
- - 16. * gf[CCTK_GFINDEX3D(cctkGH,i,j-1,k+1)] \
- + 16. * gf[CCTK_GFINDEX3D(cctkGH,i,j-1,k-1)]) * dzi * dyi / 48.)
-
-
-/* first derivatives, centered, 4th order */
-
-#define D1_c4(gf,i,j,k) \
- ((- gf[CCTK_GFINDEX3D(cctkGH,i+2,j,k)] \
- + 8. * gf[CCTK_GFINDEX3D(cctkGH,i+1,j,k)] \
- - 8. * gf[CCTK_GFINDEX3D(cctkGH,i-1,j,k)] \
- + gf[CCTK_GFINDEX3D(cctkGH,i-2,j,k)]) * (dxi / 12.))
-
-#define D2_c4(gf,i,j,k) \
- ((- gf[CCTK_GFINDEX3D(cctkGH,i,j+2,k)] \
- + 8. * gf[CCTK_GFINDEX3D(cctkGH,i,j+1,k)] \
- - 8. * gf[CCTK_GFINDEX3D(cctkGH,i,j-1,k)] \
- + gf[CCTK_GFINDEX3D(cctkGH,i,j-2,k)]) * (dyi / 12.))
-
-#define D3_c4(gf,i,j,k) \
- ((- gf[CCTK_GFINDEX3D(cctkGH,i,j,k+2)] \
- + 8. * gf[CCTK_GFINDEX3D(cctkGH,i,j,k+1)] \
- - 8. * gf[CCTK_GFINDEX3D(cctkGH,i,j,k-1)] \
- + gf[CCTK_GFINDEX3D(cctkGH,i,j,k-2)]) * (dzi / 12.))
-
-#endif
-
-/*****************************************************/
-/* */
-/* DERIVED METHODS */
-/* */
-/******************************************************/
-
-
-/* blend c2 and c4 */
-/* second derivatives */
-#define D11_c2c4(gf,i,j,k) (fdweight_c2*D11_c2(gf,i,j,k) + fdweight_c4*D11_c4(gf,i,j,k))
-#define D22_c2c4(gf,i,j,k) (fdweight_c2*D22_c2(gf,i,j,k) + fdweight_c4*D22_c4(gf,i,j,k))
-#define D33_c2c4(gf,i,j,k) (fdweight_c2*D33_c2(gf,i,j,k) + fdweight_c4*D33_c4(gf,i,j,k))
-#define D21_c2c4(gf,i,j,k) (fdweight_c2*D21_c2(gf,i,j,k) + fdweight_c4*D21_c4(gf,i,j,k))
-#define D32_c2c4(gf,i,j,k) (fdweight_c2*D32_c2(gf,i,j,k) + fdweight_c4*D32_c4(gf,i,j,k))
-#define D31_c2c4(gf,i,j,k) (fdweight_c2*D31_c2(gf,i,j,k) + fdweight_c4*D31_c4(gf,i,j,k))
-
-/* first derivatives */
-#define D1_c2c4(gf,i,j,k) (fdweight_c2*D1_c2(gf, i,j,k) + fdweight_c4*D1_c4(gf,i,j,k))
-#define D2_c2c4(gf,i,j,k) (fdweight_c2*D2_c2(gf, i,j,k) + fdweight_c4*D2_c4(gf,i,j,k))
-#define D3_c2c4(gf,i,j,k) (fdweight_c2*D3_c2(gf, i,j,k) + fdweight_c4*D3_c4(gf,i,j,k))
-
-
-/*****************************************************/
-/* */
-/* Poor man's one-sided derivatives */
-/* */
-/******************************************************/
-
-
-#define Dplus1(gf,i,j,k) string(Dplus1,gf)
-#define Dplus2(gf,i,j,k) string(Dplus2,gf)
-#define Dplus3(gf,i,j,k) string(Dplus3,gf)
-
-
-#define Dplus1gf(gf,i,j,k) Dplus1x(gf, i,j,k)
-#define Dplus2gf(gf,i,j,k) Dplus2x(gf, i,j,k)
-#define Dplus3gf(gf,i,j,k) Dplus3x(gf, i,j,k)
-
-#ifdef KRANC_C
-
-#define Dplus1x(gf,i,j,k) \
- ((gf[CCTK_GFINDEX3D(cctkGH,i+1,j,k)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i,j,k)]) * dxi)
-
-#define Dplus2x(gf,i,j,k) \
- ((gf[CCTK_GFINDEX3D(cctkGH,i,j+1,k)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i,j,k)]) * dyi)
-
-#define Dplus3x(gf,i,j,k) \
- ((gf[CCTK_GFINDEX3D(cctkGH,i,j,k+1)] \
- - gf[CCTK_GFINDEX3D(cctkGH,i,j,k)]) * dzi)
-
-#else
-
-#define Dplus1x(gf,i,j,k) ( ( gf(i+1, j, k) - gf(i,j,k) ) * dxi )
-#define Dplus2x(gf,i,j,k) ( ( gf(i, j + 1, k) - gf(i,j,k) ) * dxi )
-#define Dplus3x(gf,i,j,k) ( ( gf(i, j, k + 1) - gf(i,j,k) ) * dxi )
-
-#endif
-
#ifdef KRANC_C
int sgn(CCTK_REAL x);
-#define Dupwind1(gf,dir,i,j,k) ((dir * gf[CCTK_GFINDEX3D(cctkGH,i+dir,j,k)] \
- - dir * gf[CCTK_GFINDEX3D(cctkGH,i,j,k)]) * dxi)
-#define Dupwind2(gf,dir,i,j,k) ((dir * gf[CCTK_GFINDEX3D(cctkGH,i,j+dir,k)] \
- - dir * gf[CCTK_GFINDEX3D(cctkGH,i,j,k)]) * dxi)
-#define Dupwind3(gf,dir,i,j,k) ((dir * gf[CCTK_GFINDEX3D(cctkGH,i,j,k+dir)] \
- - dir * gf[CCTK_GFINDEX3D(cctkGH,i,j,k)]) * dxi)
-
int GenericFD_GetBoundaryWidth(cGH const * restrict const cctkGH);
-/* int GenericFD_BoundaryWidthTable(cGH const * restrict const cctkGH); */
+#ifdef __cplusplus
+// Define the restrict qualifier
+# ifdef CCTK_CXX_RESTRICT
+# undef restrict
+# define restrict CCTK_CXX_RESTRICT
+# endif
+#endif
void GenericFD_GetBoundaryInfo(cGH const * restrict cctkGH,
int const * restrict cctk_lsh,
@@ -688,24 +66,8 @@ void GenericFD_GetBoundaryInfo(cGH const * restrict cctkGH,
int * restrict is_physbnd,
int * restrict is_ipbnd);
-#if 0
-/* Finite differencing near boundaries */
-
-/* The array var is to be accessed at the location
- [i+ioff,j+joff,k+koff]. idir,jdir,kdir specify whether there is a
- lower (dir<0), upper (dir>0), or no boundary nearby. If a boundary
- is in the way, the value 0 is returned instead of the array
- content. */
-#define CCTK_GFACCESS3D(cctkGH, var, i,j,k, ioff,joff,koff, idir,jdir,kdir) \
- (((idir)<0 && (ioff)<0) || \
- ((jdir)<0 && (joff)<0) || \
- ((kdir)<0 && (koff)<0) || \
- ((idir)>0 && (ioff)>0) || \
- ((jdir)>0 && (joff)>0) || \
- ((kdir)>0 && (koff)>0) || \
- ? 0 \
- : (var)[CCTK_GFINDEX3D((cctkGH), (i)+(ioff),(j)+(joff),(k)+(koff))])
-#endif
+void GenericFD_AssertGroupStorage(cGH const * restrict const cctkGH, const char *calc,
+ int ngroups, const char *group_names[]);
/* Summation by parts */
@@ -790,40 +152,13 @@ void GenericFD_LoopOverBoundary(cGH const * restrict cctkGH, Kranc_Calculation c
void GenericFD_LoopOverBoundaryWithGhosts(cGH const * restrict cctkGH, Kranc_Calculation calc);
void GenericFD_LoopOverInterior(cGH const * restrict cctkGH, Kranc_Calculation calc);
+void GenericFD_GroupDataPointers(cGH const * restrict const cctkGH, const char *group_name,
+ int nvars, CCTK_REAL const *restrict *ptrs);
+void GenericFD_EnsureStencilFits(cGH const * restrict const cctkGH, const char *calc, int ni, int nj, int nk);
-/* Vectorisation of memory accesses */
-
-#include <stdlib.h>
-#include <cctk.h>
-
-#if defined(__SSE2__) && defined(CCTK_REAL_PRECISION_8)
-
-#include <emmintrin.h>
-
-/* A vector type corresponding to CCTK_REAL */
-typedef __m128d CCTK_REAL_VEC;
-
-/* Really only SSE is required, but there doesn't seem to be a
- preprocessing flag to check for this */
-#elif defined(__SSE2__) && defined(CCTK_REAL_PRECISION_4)
-
-#include <emmintrin.h>
-
-/* A vector type corresponding to CCTK_REAL */
-typedef __m128 CCTK_REAL_VEC;
-
-#else
-
-/* There is no vector type corresponding to CCTK_REAL */
-typedef CCTK_REAL CCTK_REAL_VEC;
-
+#ifdef __cplusplus
+} /* extern "C" */
#endif
-/* The number of vector elements in a CCTK_REAL_VEC */
-static
-size_t const CCTK_REAL_VEC_SIZE = sizeof(CCTK_REAL_VEC) / sizeof(CCTK_REAL);
-
-
-
#endif