aboutsummaryrefslogtreecommitdiff
path: root/src/volume_integral.c
diff options
context:
space:
mode:
authorbaiotti <baiotti@54511f98-0e4f-0410-826e-eb8b393f5a1e>2005-10-12 15:39:42 +0000
committerbaiotti <baiotti@54511f98-0e4f-0410-826e-eb8b393f5a1e>2005-10-12 15:39:42 +0000
commita770662a2f1becd61ab39302aa5636b7a9771427 (patch)
tree4e451bd62dce2d1e3d1f1cc611e162b45e112933 /src/volume_integral.c
parentbd0fc470a7c3c64f5a14dc021b2d39fbd431a45d (diff)
- make results independent from the number of processors (not yet finished)
- change some parameter names, so that, to me, they are more clear (debatable) - add another way of setting the integration surface position - move constant divisions out of the loops - modify info messages git-svn-id: http://svn.aei.mpg.de/numrel/AEIThorns/ADMMass/trunk@4 54511f98-0e4f-0410-826e-eb8b393f5a1e
Diffstat (limited to 'src/volume_integral.c')
-rw-r--r--src/volume_integral.c82
1 files changed, 56 insertions, 26 deletions
diff --git a/src/volume_integral.c b/src/volume_integral.c
index 7db9d6d..b80b215 100644
--- a/src/volume_integral.c
+++ b/src/volume_integral.c
@@ -1,7 +1,7 @@
-
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
+#include <assert.h>
#include <cctk.h>
#include <cctk_Arguments.h>
@@ -16,10 +16,10 @@ void ADMMass_Volume(CCTK_ARGUMENTS)
DECLARE_CCTK_ARGUMENTS
DECLARE_CCTK_PARAMETERS
- CCTK_INT i,j,k, ijk;
+ CCTK_INT i,j,k, ijk, ghost;
CCTK_REAL detg, idetg;
CCTK_REAL u[3][3], dg[3][3][3];
- CCTK_REAL local_sum = 0.0;
+ /* CCTK_REAL local_sum = 0.0;*/
CCTK_REAL radius;
CCTK_INT mask_descriptor, state_descriptor_outside;
@@ -32,26 +32,40 @@ void ADMMass_Volume(CCTK_ARGUMENTS)
const CCTK_INT dj = cctk_lsh[0];
const CCTK_INT dk = cctk_lsh[0]*cctk_lsh[1];
- if (ADMMass_use_boundary_distance_as_volume_radius &&
+ if (ADMMass_use_surface_distance_as_volume_radius &&
(ADMMass_volume_radius[*ADMMass_LoopCounter] < 0.0))
- radius = ADMMass_boundary_distance[*ADMMass_LoopCounter];
+ radius = ADMMass_surface_distance[*ADMMass_LoopCounter];
else
radius = ADMMass_volume_radius[*ADMMass_LoopCounter];
- if (radius <= 0.0)
+ 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;
+ }
+
#include "CactusEinstein/ADMMacros/src/macro/UPPERMET_declare.h"
#include "CactusEinstein/ADMMacros/src/macro/DG_declare.h"
#include "CactusEinstein/ADMMacros/src/macro/ADM_Spacing_declare.h"
- for(i=3; i<cctk_lsh[0]-3; i++)
- for(j=3; j<cctk_lsh[1]-3; j++)
- for(k=3; k<cctk_lsh[2]-3; k++)
+ /* Compute everywhere. These ADMMacros in C only have second order differencing. */
+ for(i=2; i<cctk_lsh[0]-2; i++)
+ for(j=2; j<cctk_lsh[1]-2; j++)
+ for(k=2; k<cctk_lsh[2]-2; k++)
{
ijk = CCTK_GFINDEX3D(cctkGH, i, j, k);
ADMMass_VolumeMass_GF[ijk] = 0.0;
@@ -111,20 +125,19 @@ void ADMMass_Volume(CCTK_ARGUMENTS)
u[ti][tj] * u[tk][2] *
( dg[ti][tk][tj] - dg[ti][tj][tk] );
}
- ADMMass_VolumeMass_pot_x[ijk] *= alp[ijk] * sqrt(DETG_DETG) /
- 16 / PI;
- ADMMass_VolumeMass_pot_y[ijk] *= alp[ijk] * sqrt(DETG_DETG) /
- 16 / PI;
- ADMMass_VolumeMass_pot_z[ijk] *= alp[ijk] * sqrt(DETG_DETG) /
- 16 / PI;
+ ADMMass_VolumeMass_pot_x[ijk] *= alp[ijk] * sqrt(DETG_DETG);
+ ADMMass_VolumeMass_pot_y[ijk] *= alp[ijk] * sqrt(DETG_DETG);
+ ADMMass_VolumeMass_pot_z[ijk] *= alp[ijk] * sqrt(DETG_DETG);
}
- for(i=4; i<cctk_lsh[0]-4; i++)
- for(j=4; j<cctk_lsh[1]-4; j++)
- for(k=4; k<cctk_lsh[2]-4; k++)
+
+ /* Do not compute in ghost zones */
+ for(i=ghost; i<cctk_lsh[0]-ghost; i++)
+ for(j=ghost; j<cctk_lsh[1]-ghost; j++)
+ for(k=ghost; k<cctk_lsh[2]-ghost; k++)
{
ijk = CCTK_GFINDEX3D(cctkGH, i, j, k);
ADMMass_VolumeMass_GF[ijk] = 0.0;
- if ((!ADMMass_Excise_Horizons ||
+ if ((ADMMass_use_all_volume_as_volume_radius)||((!ADMMass_Excise_Horizons ||
SpaceMask_CheckStateBits(space_mask, ijk,
mask_descriptor,
state_descriptor_outside)) &&
@@ -134,7 +147,7 @@ void ADMMass_Volume(CCTK_ARGUMENTS)
(y[ijk]-ADMMass_y_pos[*ADMMass_LoopCounter]) +
(z[ijk]-ADMMass_z_pos[*ADMMass_LoopCounter])*
(z[ijk]-ADMMass_z_pos[*ADMMass_LoopCounter]) <=
- radius * radius))
+ radius * radius)))
{
ADMMass_VolumeMass_GF[ijk] +=
(i2dx*(ADMMass_VolumeMass_pot_x[CCTK_GFINDEX3D(cctkGH,i+1,j,k)]-
@@ -144,7 +157,7 @@ void ADMMass_Volume(CCTK_ARGUMENTS)
i2dz*(ADMMass_VolumeMass_pot_z[CCTK_GFINDEX3D(cctkGH,i,j,k+1)]-
ADMMass_VolumeMass_pot_z[CCTK_GFINDEX3D(cctkGH,i,j,k-1)]))
*dx*dy*dz;
- local_sum += ADMMass_VolumeMass_GF[ijk];
+ /* local_sum += ADMMass_VolumeMass_GF[ijk]; */
}
}
#include "CactusEinstein/ADMMacros/src/macro/UPPERMET_undefine.h"
@@ -171,11 +184,28 @@ void ADMMass_Volume_Global(CCTK_ARGUMENTS)
CCTK_VarIndex("ADMMass::ADMMass_VolumeMass_GF")))
CCTK_WARN(0, "Error while reducing ADMMass_VolumeMass_GF");
- if (ADMMass_use_boundary_distance_as_volume_radius)
- radius = ADMMass_boundary_distance[*ADMMass_LoopCounter];
+ ADMMass_VolumeMass[*ADMMass_LoopCounter] /= 16.0*PI;
+
+ if (ADMMass_use_surface_distance_as_volume_radius)
+ {
+ CCTK_VInfo(CCTK_THORNSTRING,
+ "detector %d: ADM mass %g, volume (cube): xmin %g, xmax %g, ymin %g, ymax %g, zmin %g, zmax %g\n",
+ *ADMMass_LoopCounter,
+ ADMMass_SurfaceMass[*ADMMass_LoopCounter],
+ *ADMMass_box_x_min,*ADMMass_box_x_max,
+ *ADMMass_box_y_min,*ADMMass_box_y_max,
+ *ADMMass_box_z_min,*ADMMass_box_z_max);
+ }
+ else if (ADMMass_use_all_volume_as_volume_radius)
+ {
+ CCTK_VInfo(CCTK_THORNSTRING," detector %d: ADM mass %g, volume: the whole grid\n",
+ *ADMMass_LoopCounter, ADMMass_VolumeMass[*ADMMass_LoopCounter]);
+ }
else
- radius = ADMMass_volume_radius[*ADMMass_LoopCounter];
- printf("ADM mass, volume, detector %d: %g %g\n", *ADMMass_LoopCounter,
- radius, ADMMass_VolumeMass[*ADMMass_LoopCounter]);
+ {
+ CCTK_VInfo(CCTK_THORNSTRING," detector %d: ADM mass %g, volume (sphere of radius) %g\n",
+ *ADMMass_LoopCounter, ADMMass_VolumeMass[*ADMMass_LoopCounter],
+ ADMMass_volume_radius[*ADMMass_LoopCounter]);
+ }
}