aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordiener <diener@4ec1db94-0e4f-0410-ada3-8bed251432c9>2007-10-09 11:00:41 +0000
committerdiener <diener@4ec1db94-0e4f-0410-ada3-8bed251432c9>2007-10-09 11:00:41 +0000
commite0b8a997bc1cbb959cb739c37ad14344f7f49873 (patch)
tree9e00350d8f3653811d1529fedf1f87dc1782a75c
parent3bf99c974faf66ca91519da304efeac9589c4f21 (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.ccl4
-rw-r--r--schedule.ccl7
-rw-r--r--src/cg.F9075
3 files changed, 86 insertions, 0 deletions
diff --git a/param.ccl b/param.ccl
index 6d93bd3..0b8c6b8 100644
--- a/param.ccl
+++ b/param.ccl
@@ -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
{
diff --git a/src/cg.F90 b/src/cg.F90
index ec4866e..c3dd6c8 100644
--- a/src/cg.F90
+++ b/src/cg.F90
@@ -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