diff options
-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 |