diff options
author | diener <diener@4ec1db94-0e4f-0410-ada3-8bed251432c9> | 2007-10-09 11:00:41 +0000 |
---|---|---|
committer | diener <diener@4ec1db94-0e4f-0410-ada3-8bed251432c9> | 2007-10-09 11:00:41 +0000 |
commit | e0b8a997bc1cbb959cb739c37ad14344f7f49873 (patch) | |
tree | 9e00350d8f3653811d1529fedf1f87dc1782a75c | |
parent | 3bf99c974faf66ca91519da304efeac9589c4f21 (diff) |
Add the option to use user defined regions for the elliptic smoothing
procedure. Works by setting the admbase variables to zero in these
regions before doing the smoothing. Needs some testing.
git-svn-id: http://svn.einsteintoolkit.org/cactus/EinsteinInitialData/NoExcision/trunk@12 4ec1db94-0e4f-0410-ada3-8bed251432c9
-rw-r--r-- | param.ccl | 4 | ||||
-rw-r--r-- | schedule.ccl | 7 | ||||
-rw-r--r-- | src/cg.F90 | 75 |
3 files changed, 86 insertions, 0 deletions
@@ -142,3 +142,7 @@ REAL smoothing_eps "CG smoothing stop criteria" { (0.0:* :: "" } 1e-6 + +BOOLEAN use_user_regions "Use user defined regions for the smoothing regions" +{ +} "no" diff --git a/schedule.ccl b/schedule.ccl index 54d402b..824d112 100644 --- a/schedule.ccl +++ b/schedule.ccl @@ -20,6 +20,13 @@ if (smooth_regions) { LANG: Fortran } "Smooth regions" } else { + + if (use_user_regions) { + SCHEDULE NoExcision_Set_Zero IN ADMBase_PostInitial BEFORE NoExcision_CGSmoothing + { + LANG: Fortran + } "set variablse to zero in used defined regions" + } SCHEDULE GROUP NoExcision_CGSmoothing IN ADMBase_PostInitial { @@ -645,3 +645,78 @@ subroutine NoExcision_CGApplySym(CCTK_ARGUMENTS) end if end subroutine NoExcision_CGApplySym + + +subroutine NoExcision_Set_Zero(CCTK_ARGUMENTS) + + use NoExcision_mod + + DECLARE_CCTK_ARGUMENTS + DECLARE_CCTK_PARAMETERS + DECLARE_CCTK_FUNCTIONS + + CCTK_REAL :: cx, cy, cz, radx, rady, radz + CCTK_REAL, dimension(:,:,:), allocatable :: dist2 + integer :: n + CCTK_INT :: my_level, n_levels + + call NoExcision_levelinfo ( cctkGH, my_level, n_levels ) + + if ( my_level == n_levels-1 ) then + + allocate ( dist2(cctk_lsh(1),cctk_lsh(2),cctk_lsh(3)) ) + + do n = 1, num_regions + + cx = centre_x(n) + cy = centre_y(n) + cz = centre_z(n) + + if (CCTK_EQUALS(region_shape(n), "sphere")) then + + radx = radius(n) + rady = radius(n) + radz = radius(n) + + else if (CCTK_EQUALS(region_shape(n), "ellipsoid")) then + + radx = radius_x(n) + rady = radius_y(n) + radz = radius_z(n) + + else + + call CCTK_WARN (0, "internal error") + + end if + + dist2 = ((x - cx) / radx)**2 + ((y - cy) / rady)**2 & + & + ((z - cz) / radz)**2 + + where ( dist2 <= one ) + + gxx = zero + gxy = zero + gxz = zero + gyy = zero + gyz = zero + gzz = zero + kxx = zero + kxy = zero + kxz = zero + kyy = zero + kyz = zero + kzz = zero + alp = zero + betax = zero + betay = zero + betaz = zero + + end where + + end do + + deallocate ( dist2 ) + + end if +end subroutine NoExcision_Set_Zero |