/*@@ @file volume_integral.c @date Wed Oct 5 10:18:34 2005 @author Frank Loeffler and Luca Baiotti @desc Computes the ADM mass as a volume integral. @enddesc @@*/ #include #include #include #include #include #include #include #include "SpaceMask.h" #define PI 3.1415926535897932384626433832795028841971693993751058209749445923 void ADMMass_Volume(CCTK_ARGUMENTS) { DECLARE_CCTK_ARGUMENTS DECLARE_CCTK_PARAMETERS CCTK_INT i,j,k, ijk, ghost, ti, tj, tk, tl; CCTK_REAL detg, idetg; CCTK_REAL u[3][3], dg[3][3][3]; CCTK_REAL radius; CCTK_INT mask_descriptor, state_descriptor_outside; int avoid_origin_parameter; #include "CactusEinstein/ADMMacros/src/macro/UPPERMET_declare.h" /* grid-function strides */ const CCTK_INT di = 1; const CCTK_INT dj = cctk_lsh[0]; const CCTK_INT dk = cctk_lsh[0]*cctk_lsh[1]; /* deonminators for derivatives */ const CCTK_REAL OneOverTwoDX = 1.0 / (2.0 * CCTK_DELTA_SPACE(0)); const CCTK_REAL OneOverTwoDY = 1.0 / (2.0 * CCTK_DELTA_SPACE(1)); const CCTK_REAL OneOverTwoDZ = 1.0 / (2.0 * CCTK_DELTA_SPACE(2)); mask_descriptor = SpaceMask_GetTypeBits("OutsideMask"); state_descriptor_outside = SpaceMask_GetStateBits("OutsideMask", "outside"); if (ADMMass_use_surface_distance_as_volume_radius && (ADMMass_volume_radius[*ADMMass_LoopCounter] < 0.0)) radius = ADMMass_surface_distance[*ADMMass_LoopCounter]; else radius = ADMMass_volume_radius[*ADMMass_LoopCounter]; if ((radius <= 0.0)&&(!ADMMass_use_all_volume_as_volume_radius)) { CCTK_WARN(1, "radius < 0 / not set, not calculating " "the volume integral to get the ADM mass."); return; } if (CCTK_IsThornActive("PUGH")) { const void *ghost_ptr = CCTK_ParameterGet("ghost_size","PUGH",NULL); assert( ghost_ptr != NULL ); ghost = *(const int *)ghost_ptr; } else /* carpet */ { const void *ghost_ptr = CCTK_ParameterGet("ghost_size","Carpet",NULL); assert( ghost_ptr != NULL ); ghost = *(const int *)ghost_ptr; } for(i=1; i