diff options
author | Ian Hinder <ian.hinder@aei.mpg.de> | 2012-05-01 21:58:57 +0200 |
---|---|---|
committer | Ian Hinder <ian.hinder@aei.mpg.de> | 2012-05-02 09:25:32 +0200 |
commit | 90900d18be8a0b77eb736e622195eecaeaf93bbd (patch) | |
tree | 901a9c60d95301fbc45c48a53625271af2ca305d /Auxiliary | |
parent | 3440bea2b6531a259bbc73d070d5bea69280b717 (diff) |
GenericFD: Correct implementation of Sign
Mathematica defines Sign(x) = Which[x>0, 1, x<0, -1, x==0, 0] whereas
the current implementation in terms of copysign gives Sign(0) != 0.
This causes problems when Sign is used to choose the finite
differencing operator in boundary conditions. This commit restores
the old definition in terms of the sgn function which we define now as
static inline in GenericFD.h.
Diffstat (limited to 'Auxiliary')
3 files changed, 7 insertions, 13 deletions
diff --git a/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.c b/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.c index 1bd1a61..023e6e8 100644 --- a/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.c +++ b/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.c @@ -49,16 +49,6 @@ /* TODO: provide functions for differencing, use FD macros to evaluate corresponding functions */ -int sgn(CCTK_REAL x) -{ - if (x < 0) - return -1; - else if (x > 0) - return 1; - else - return 0; -} - void GenericFD_GetBoundaryWidths(cGH const * restrict const cctkGH, int nboundaryzones[6]) { int is_internal[6]; diff --git a/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.h b/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.h index 53e8035..217b931 100644 --- a/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.h +++ b/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/GenericFD.h @@ -54,7 +54,11 @@ extern "C" { #define KRANC_GFOFFSET3D(var,i,j,k) \ (*(CCTK_REAL const*)&((char const*)(var))[cdi*(i)+cdj*(j)+cdk*(k)]) -int sgn(CCTK_REAL x); +/* Implement the signum function, used for Mathematica's Sign function */ +static inline CCTK_REAL sgn(CCTK_REAL x) +{ + return x==(CCTK_REAL)0.0 ? (CCTK_REAL)0.0 : copysign((CCTK_REAL)1.0, x); +} int GenericFD_GetBoundaryWidth(cGH const * restrict const cctkGH); diff --git a/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/MathematicaCompat.h b/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/MathematicaCompat.h index 252116c..28bcebc 100644 --- a/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/MathematicaCompat.h +++ b/Auxiliary/Cactus/KrancNumericalTools/GenericFD/src/MathematicaCompat.h @@ -40,11 +40,11 @@ #define Csch(x) (1.0/sinh(x)) #define Coth(x) (1.0/tanh(x)) +#define Sign(x) (sgn(x)) + #ifdef KRANC_C -# define Sign(x) (copysign( (CCTK_REAL) 1.0,(CCTK_REAL) (x))) # define ToReal(x) ((CCTK_REAL)(x)) #else -# define Sign(x) (sgn(x)) # define ToReal(x) (real((x),kind(khalf))) #endif |