From fa841eb53fef24d99d33ac303a60b9f9cc06a59c Mon Sep 17 00:00:00 2001 From: reisswig Date: Wed, 23 Jan 2008 19:45:18 +0000 Subject: - fixed "surface not valid" bug - replaced MPI calls by ReduceLocScalar calls git-svn-id: http://svn.cactuscode.org/arrangements/CactusNumerical/SphericalSurface/trunk@33 40f6ab95-0e4f-0410-8daa-ee8d7420be1d --- schedule.ccl | 2 ++ src/setup.cc | 92 +++++++++++++++++++++++++++++++++++++++++------------------- 2 files changed, 65 insertions(+), 29 deletions(-) diff --git a/schedule.ccl b/schedule.ccl index 53827c4..89aec32 100644 --- a/schedule.ccl +++ b/schedule.ccl @@ -16,11 +16,13 @@ STORAGE: sf_maxreflevel SCHEDULE SphericalSurface_SetupRes AT basegrid BEFORE SphericalSurface_Setup AFTER SpatialCoordinates AFTER CorrectCoordinates { LANG: C + OPTIONS: GLOBAL LOOP-LOCAL } "Set surface resolution automatically" SCHEDULE SphericalSurface_Setup AT basegrid { LANG: C + OPTIONS: GLOBAL } "Calculate surface coordinate descriptors" diff --git a/src/setup.cc b/src/setup.cc index 897efb3..fa22c5d 100644 --- a/src/setup.cc +++ b/src/setup.cc @@ -164,15 +164,15 @@ extern "C" void SphericalSurface_Setup (CCTK_ARGUMENTS) if (verbose) { - CCTK_VInfo (CCTK_THORNSTRING, "SphericalSurface[%d]: setting sf_ntheta = %d\n", n, sf_ntheta[n]); - CCTK_VInfo (CCTK_THORNSTRING, "SphericalSurface[%d]: setting sf_nphi = %d\n", n, sf_nphi[n]); + CCTK_VInfo (CCTK_THORNSTRING, "SphericalSurface[%d]: setting sf_ntheta = %d", n, sf_ntheta[n]); + CCTK_VInfo (CCTK_THORNSTRING, "SphericalSurface[%d]: setting sf_nphi = %d", n, sf_nphi[n]); } } if (verbose) { - CCTK_VInfo (CCTK_THORNSTRING, "SphericalSurface[%d]: finest refinement-level that fully contains this surface: sf_maxreflevel = %d\n", n, sf_maxreflevel[n]); - CCTK_VInfo (CCTK_THORNSTRING, "SphericalSurface[%d]: finest refinement-level that overlaps with this surface : sf_minreflevel = %d\n", n, sf_minreflevel[n]); + CCTK_VInfo (CCTK_THORNSTRING, "SphericalSurface[%d]: finest refinement-level that fully contains this surface: sf_maxreflevel = %d", n, sf_maxreflevel[n]); + CCTK_VInfo (CCTK_THORNSTRING, "SphericalSurface[%d]: finest refinement-level that overlaps with this surface : sf_minreflevel = %d", n, sf_minreflevel[n]); } // coordinates in the theta direction @@ -249,6 +249,14 @@ extern "C" void SphericalSurface_SetupRes (CCTK_ARGUMENTS) static bool first_call = true; + int min_reduction_handle = CCTK_ReductionArrayHandle("minimum"); + int max_reduction_handle = CCTK_ReductionArrayHandle("maximum"); + + if (min_reduction_handle < 0) + CCTK_WARN(0, "Cannot get reduction handle for minimum operation."); + if (max_reduction_handle < 0) + CCTK_WARN(0, "Cannot get reduction handle for maximum operation."); + for (int n=0; n= dist && // Cart. grid and SphericalSurface overlap @@ -350,11 +360,13 @@ extern "C" void SphericalSurface_SetupRes (CCTK_ARGUMENTS) { // find minimum value of "sf_delta_phi/theta" over all processors CCTK_REAL dummy = 0; - MPI_Allreduce(&sf_delta_theta_estimate[n], &dummy, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD); + //MPI_Allreduce(&sf_delta_theta_estimate[n], &dummy, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD); + CCTK_ReduceLocScalar(cctkGH, -1, min_reduction_handle, &sf_delta_theta_estimate[n], &dummy, CCTK_VARIABLE_REAL); sf_delta_theta_estimate[n] = dummy; dummy = 0; - MPI_Allreduce(&sf_delta_phi_estimate[n], &dummy, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD); + //MPI_Allreduce(&sf_delta_phi_estimate[n], &dummy, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD); + CCTK_ReduceLocScalar(cctkGH, -1, min_reduction_handle, &sf_delta_phi_estimate[n], &dummy, CCTK_VARIABLE_REAL); sf_delta_phi_estimate[n] = dummy; /* @@ -379,7 +391,8 @@ extern "C" void SphericalSurface_SetupRes (CCTK_ARGUMENTS) // find maximum value of "sf_minreflevel" over all processors int idummy; - MPI_Allreduce(&sf_minreflevel[n], &idummy, 1, MPI_INT, MPI_MAX, MPI_COMM_WORLD); + //MPI_Allreduce(&sf_minreflevel[n], &idummy, 1, MPI_INT, MPI_MAX, MPI_COMM_WORLD); + CCTK_ReduceLocScalar(cctkGH, -1, max_reduction_handle, &sf_minreflevel[n], &idummy, CCTK_VARIABLE_INT); sf_minreflevel[n] = idummy; @@ -398,12 +411,12 @@ extern "C" void SphericalSurface_SetupRes (CCTK_ARGUMENTS) if (verbose) { //CCTK_VInfo (CCTK_THORNSTRING, "SphericalSurface: calculated max_radius = %.12f\n", max_radius); - CCTK_VInfo (CCTK_THORNSTRING, "SphericalSurface: buffer_radius = %.12f\n", double (sqrt( np*np*CCTK_DELTA_SPACE(0)*CCTK_DELTA_SPACE(0) - + np*np*CCTK_DELTA_SPACE(1)*CCTK_DELTA_SPACE(1) - + np*np*CCTK_DELTA_SPACE(2)*CCTK_DELTA_SPACE(2) ))); + CCTK_VInfo (CCTK_THORNSTRING, "SphericalSurface: buffer_radius = %.12f", double (sqrt( np*np*CCTK_DELTA_SPACE(0)*CCTK_DELTA_SPACE(0) + + np*np*CCTK_DELTA_SPACE(1)*CCTK_DELTA_SPACE(1) + + np*np*CCTK_DELTA_SPACE(2)*CCTK_DELTA_SPACE(2) ))); } - + /* unsigned long k[8]; k[0] = CCTK_GFINDEX3D(cctkGH, 0, 0, 0); @@ -414,12 +427,30 @@ extern "C" void SphericalSurface_SetupRes (CCTK_ARGUMENTS) k[5] = CCTK_GFINDEX3D(cctkGH, cctk_lsh[0]-1, 0, cctk_lsh[2]-1); k[6] = CCTK_GFINDEX3D(cctkGH, 0, cctk_lsh[1]-1, cctk_lsh[2]-1); k[7] = CCTK_GFINDEX3D(cctkGH, cctk_lsh[0]-1, cctk_lsh[1]-1, cctk_lsh[2]-1); - + */ + + unsigned long kx[8], ky[8], kz[8]; + + kx[0] = 0; ky[0] = 0; kz[0] = 0; + kx[1] = cctk_lsh[0]-1, ky[1] = 0; kz[1] = 0; + kx[2] = 0; ky[2] = cctk_lsh[1]-1; kz[2] = 0; + kx[3] = cctk_lsh[0]-1; ky[3] = cctk_lsh[1]-1; kz[3] = 0; + kx[4] = 0; ky[4] = 0; kz[4] = cctk_lsh[2]-1; + kx[5] = cctk_lsh[0]-1; ky[5] = 0; kz[5] = cctk_lsh[2]-1; + kx[6] = 0; ky[6] = cctk_lsh[1]-1; kz[6] = cctk_lsh[2]-1; + kx[7] = cctk_lsh[0]-1; ky[7] = cctk_lsh[1]-1; kz[7] = cctk_lsh[2]-1; + + int i; bool is_contained = false; for (i=0; i < 8; i++) { - if (max_radius < sqrt(x[k[i]]*x[k[i]] + y[k[i]]*y[k[i]] + z[k[i]]*z[k[i]])) + //if (max_radius < sqrt(x[k[i]]*x[k[i]] + y[k[i]]*y[k[i]] + z[k[i]]*z[k[i]])) + // is_contained = true; + CCTK_REAL xx = CCTK_ORIGIN_SPACE(0) + (cctk_lbnd[0] + kx[i]) * CCTK_DELTA_SPACE(0); + CCTK_REAL yy = CCTK_ORIGIN_SPACE(1) + (cctk_lbnd[1] + ky[i]) * CCTK_DELTA_SPACE(1); + CCTK_REAL zz = CCTK_ORIGIN_SPACE(2) + (cctk_lbnd[2] + kz[i]) * CCTK_DELTA_SPACE(2); + if (max_radius < sqrt(xx*xx + yy*yy + zz*zz)) is_contained = true; } @@ -448,7 +479,8 @@ extern "C" void SphericalSurface_SetupRes (CCTK_ARGUMENTS) // find minimum value of "sf_maxreflevel" over all processors - MPI_Allreduce(&max_rl, &idummy, 1, MPI_INT, MPI_MIN, MPI_COMM_WORLD); + //MPI_Allreduce(&max_rl, &idummy, 1, MPI_INT, MPI_MIN, MPI_COMM_WORLD); + CCTK_ReduceLocScalar(cctkGH, -1, min_reduction_handle, &max_rl, &idummy, CCTK_VARIABLE_INT); if (idummy != 0 || first_call) sf_maxreflevel[n] = idummy; @@ -462,17 +494,19 @@ extern "C" void SphericalSurface_SetupRes (CCTK_ARGUMENTS) { // find maximum value of "sf_delta_phi/theta" over all processors CCTK_REAL dummy = 0; - MPI_Allreduce(&sf_delta_theta_estimate[n], &dummy, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); + //MPI_Allreduce(&sf_delta_theta_estimate[n], &dummy, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); + CCTK_ReduceLocScalar(cctkGH, -1, max_reduction_handle, &sf_delta_theta_estimate[n], &dummy, CCTK_VARIABLE_REAL); sf_delta_theta_estimate[n] = dummy; dummy = 0; - MPI_Allreduce(&sf_delta_phi_estimate[n], &dummy, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); + //MPI_Allreduce(&sf_delta_phi_estimate[n], &dummy, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); + CCTK_ReduceLocScalar(cctkGH, -1, max_reduction_handle, &sf_delta_phi_estimate[n], &dummy, CCTK_VARIABLE_REAL); sf_delta_phi_estimate[n] = dummy; } if (verbose) { - CCTK_VInfo (CCTK_THORNSTRING, "SphericalSurface: sf_maxreflevel[%d] = %d, sf_minreflevel[%d] = %d \n", n, sf_maxreflevel[n], n, sf_minreflevel[n]); - CCTK_VInfo (CCTK_THORNSTRING, "SphericalSurface: sf_delta_theta[%d] = %.6f, sf_delta_phi[%d] = %.6f, \n", n, sf_delta_theta_estimate[n], n, sf_delta_phi_estimate[n]); + CCTK_VInfo (CCTK_THORNSTRING, "SphericalSurface: sf_maxreflevel[%d] = %d, sf_minreflevel[%d] = %d", n, sf_maxreflevel[n], n, sf_minreflevel[n]); + CCTK_VInfo (CCTK_THORNSTRING, "SphericalSurface: sf_delta_theta[%d] = %.6f, sf_delta_phi[%d] = %.6f\n", n, sf_delta_theta_estimate[n], n, sf_delta_phi_estimate[n]); } } -- cgit v1.2.3