#include #include "cctk.h" #include "cctk_Parameters.h" #include "cctk_Arguments.h" #include "cctk_Functions.h" #define SQR(x) ((x)*(x)) /* helper routine to let Fortran code test for the presence of Multipatch. * Required since Fortran cannot access grid scalars via pointers returned by CCTK_VarDataPtrI * Returns 0 when no general coordinates are used * Returns 1 when general coordinates are used */ CCTK_FCALL CCTK_INT CCTK_FNAME(GRHydro_UseGeneralCoordinates)(CCTK_POINTER ptr_to_cctkGH); CCTK_INT GRHydro_UseGeneralCoordinates(const cGH * cctkGH); CCTK_FCALL CCTK_INT CCTK_FNAME(GRHydro_UseGeneralCoordinates)(CCTK_POINTER ptr_to_cctkGH) { return GRHydro_UseGeneralCoordinates(*(cGH **)ptr_to_cctkGH); } CCTK_INT GRHydro_UseGeneralCoordinates(const cGH * cctkGH) { static CCTK_INT idxGeneral_coordinates = -1; static CCTK_INT coordinates_active_set = 0; static CCTK_INT coordinates_active; if (!coordinates_active_set) { coordinates_active = CCTK_IsImplementationActive("Coordinates"); coordinates_active_set = 1; } if (idxGeneral_coordinates == -1) { idxGeneral_coordinates = CCTK_VarIndex("Coordinates::general_coordinates"); assert(!coordinates_active || idxGeneral_coordinates >= 0); } /* are coordinates relly not Cartesian? */ return coordinates_active && *(CCTK_INT *)CCTK_VarDataPtrI(cctkGH, 0, idxGeneral_coordinates); } void GRHydroTransformADMToLocalBasis(CCTK_ARGUMENTS) { DECLARE_CCTK_ARGUMENTS; DECLARE_CCTK_PARAMETERS; int i,j,k; static CCTK_INT idxJacobian = -1, idxiJacobian = -1; static CCTK_INT idxJacobian_state = -1, idxiJacobian_state = -1; static CCTK_INT idxGeneral_coordinates = -1; CCTK_REAL *J11, *J12, *J13, *J21, *J22, *J23, *J31, *J32, *J33; CCTK_REAL *iJ11, *iJ12, *iJ13, *iJ21, *iJ22, *iJ23, *iJ31, *iJ32, *iJ33; if (idxGeneral_coordinates == -1) { idxGeneral_coordinates = CCTK_VarIndex("Coordinates::general_coordinates"); assert(idxGeneral_coordinates >= 0); } if (!*(CCTK_INT *)CCTK_VarDataPtrI(cctkGH, 0, idxGeneral_coordinates)) return; /* corodinates are Cartesian */ if (idxJacobian == -1) { idxJacobian = CCTK_FirstVarIndex("Coordinates::jacobian"); assert(idxJacobian >= 0); } if (idxiJacobian == -1) { idxiJacobian = CCTK_FirstVarIndex("Coordinates::inverse_jacobian"); assert(idxiJacobian >= 0); } if (idxJacobian_state == -1) { idxJacobian_state = CCTK_VarIndex("Coordinates::jacobian_state"); assert(idxJacobian_state >= 0); } if (idxiJacobian_state == -1) { idxiJacobian_state = CCTK_VarIndex("Coordinates::inverse_jacobian_state"); assert(idxiJacobian_state >= 0); } if (!*(CCTK_INT *)CCTK_VarDataPtrI(cctkGH, 0, idxJacobian_state)) CCTK_WARN(0,"No storage for Jacobians allocated! Tell your coordinates implemetation to store Jacobians!"); if (!*(CCTK_INT *)CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian_state)) CCTK_WARN(0,"No storage for inverse Jacobians allocated! Tell your coordinates implemetation to store inverse Jacobians!"); /* Cactus guarantess that variables in a group are consecutive, and * ReflectionSymmetry etc. require the order we use */ J11 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+0); J12 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+1); J13 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+2); J21 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+3); J22 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+4); J23 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+5); J31 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+6); J32 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+7); J33 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+8); assert(J11 && J12 && J13 && J21 && J22 && J23 && J31 && J32 && J33); iJ11 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+0); iJ12 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+1); iJ13 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+2); iJ21 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+3); iJ22 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+4); iJ23 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+5); iJ31 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+6); iJ32 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+7); iJ33 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+8); assert(iJ11 && iJ12 && iJ13 && iJ21 && iJ22 && iJ23 && iJ31 && iJ32 && iJ33); #pragma omp parallel for private (i,j,k) for (k=0 ; k= 0); } if (!*(CCTK_INT *)CCTK_VarDataPtrI(cctkGH, 0, idxGeneral_coordinates)) return; /* corodinates are Cartesian */ if (idxJacobian == -1) { idxJacobian = CCTK_FirstVarIndex("Coordinates::jacobian"); assert(idxJacobian >= 0); } if (idxiJacobian == -1) { idxiJacobian = CCTK_FirstVarIndex("Coordinates::inverse_jacobian"); assert(idxiJacobian >= 0); } if (idxJacobian_state == -1) { idxJacobian_state = CCTK_VarIndex("Coordinates::jacobian_state"); assert(idxJacobian_state >= 0); } if (idxiJacobian_state == -1) { idxiJacobian_state = CCTK_VarIndex("Coordinates::inverse_jacobian_state"); assert(idxiJacobian_state >= 0); } if (!*(CCTK_INT *)CCTK_VarDataPtrI(cctkGH, 0, idxJacobian_state)) CCTK_WARN(0,"No storage for Jacobians allocated! Tell your coordinates implemetation to store Jacobians!"); if (!*(CCTK_INT *)CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian_state)) CCTK_WARN(0,"No storage for inverse Jacobians allocated! Tell your coordinates implemetation to store inverse Jacobians!"); /* CCTK_INFO("Transforming primitives to local basis."); */ /* Cactus guarantess that variables in a group are consecutive, and * ReflectionSymmetry etc. require the order we use */ J11 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+0); J12 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+1); J13 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+2); J21 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+3); J22 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+4); J23 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+5); J31 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+6); J32 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+7); J33 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+8); assert(J11 && J12 && J13 && J21 && J22 && J23 && J31 && J32 && J33); iJ11 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+0); iJ12 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+1); iJ13 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+2); iJ21 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+3); iJ22 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+4); iJ23 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+5); iJ31 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+6); iJ32 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+7); iJ33 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+8); assert(iJ11 && iJ12 && iJ13 && iJ21 && iJ22 && iJ23 && iJ31 && iJ32 && iJ33); #pragma omp parallel for private (i,j,k) for (k=0 ; k= 0); } if (!*(CCTK_INT *)CCTK_VarDataPtrI(cctkGH, 0, idxGeneral_coordinates)) return; /* corodinates are Cartesian */ if (idxJacobian == -1) { idxJacobian = CCTK_FirstVarIndex("Coordinates::jacobian"); assert(idxJacobian >= 0); } if (idxiJacobian == -1) { idxiJacobian = CCTK_FirstVarIndex("Coordinates::inverse_jacobian"); assert(idxiJacobian >= 0); } if (idxJacobian_state == -1) { idxJacobian_state = CCTK_VarIndex("Coordinates::jacobian_state"); assert(idxJacobian_state >= 0); } if (idxiJacobian_state == -1) { idxiJacobian_state = CCTK_VarIndex("Coordinates::inverse_jacobian_state"); assert(idxiJacobian_state >= 0); } if (!*(CCTK_INT *)CCTK_VarDataPtrI(cctkGH, 0, idxJacobian_state)) CCTK_WARN(0,"No storage for Jacobians allocated! Tell your coordinates implemetation to store Jacobians!"); if (!*(CCTK_INT *)CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian_state)) CCTK_WARN(0,"No storage for inverse Jacobians allocated! Tell your coordinates implemetation to store inverse Jacobians!"); /* CCTK_INFO("Transforming primitives to global basis."); */ /* Cactus guarantess that variables in a group are consecutive, and * ReflectionSymmetry etc. require the order we use */ J11 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+0); J12 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+1); J13 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+2); J21 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+3); J22 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+4); J23 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+5); J31 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+6); J32 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+7); J33 = CCTK_VarDataPtrI(cctkGH, 0, idxJacobian+8); assert(J11 && J12 && J13 && J21 && J22 && J23 && J31 && J32 && J33); iJ11 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+0); iJ12 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+1); iJ13 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+2); iJ21 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+3); iJ22 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+4); iJ23 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+5); iJ31 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+6); iJ32 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+7); iJ33 = CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian+8); assert(iJ11 && iJ12 && iJ13 && iJ21 && iJ22 && iJ23 && iJ31 && iJ32 && iJ33); #pragma omp parallel for private (i,j,k) for (k=0 ; k