aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--param.ccl17
-rw-r--r--schedule.ccl24
-rw-r--r--src/GRHydro_Reconstruct.F905
-rw-r--r--src/GRHydro_WENOReconstruct.F90276
-rw-r--r--src/GRHydro_WENOReconstruct_drv.F90471
-rw-r--r--src/GRHydro_WENOScalars.F9023
-rw-r--r--src/make.code.defn6
7 files changed, 814 insertions, 8 deletions
diff --git a/param.ccl b/param.ccl
index 6eb77df..540f45d 100644
--- a/param.ccl
+++ b/param.ccl
@@ -133,9 +133,10 @@ CCTK_INT GRHydro_MaxNumSandRVars "The maximum number of save and restore variabl
keyword recon_method "Which reconstruction method to use"
{
- "tvd" :: "Slope limited TVD"
- "ppm" :: "PPM reconstruction"
- "eno" :: "ENO reconstruction"
+ "tvd" :: "Slope limited TVD"
+ "ppm" :: "PPM reconstruction"
+ "eno" :: "ENO reconstruction"
+ "weno" :: "WENO reconstruction"
} "tvd"
keyword method_type "Which type of method to use"
@@ -256,6 +257,16 @@ int eno_order "The order of accuracy of the ENO reconstruction"
1:* :: "Anything above 1, but above 5 is pointless"
} 2
+int WENO_order "The order of accuracy of the WENO reconstruction"
+{
+ 5 :: "Fifth-order"
+} 5
+
+real weno_eps "WENO epsilon parameter"
+{
+ 0:* :: "small and positive"
+} 1e-6
+
keyword riemann_solver "Which Riemann solver to use"
{
"Roe" :: "Standard Roe solver"
diff --git a/schedule.ccl b/schedule.ccl
index fa71107..fb017da 100644
--- a/schedule.ccl
+++ b/schedule.ccl
@@ -427,9 +427,9 @@ if(CCTK_Equals(Bvec_evolution_method,"GRHydro"))
{
} "Evaluate ADM constraints, and perform symmetry boundary conditions"
-######################################################################
-### Setup and remove the coefficient arrays for ENO reconstruction ###
-######################################################################
+###########################################################################
+### Setup and remove the coefficient arrays for ENO/WENO reconstruction ###
+###########################################################################
if (CCTK_Equals(recon_method,"eno"))
{
@@ -448,6 +448,24 @@ if (CCTK_Equals(recon_method,"eno"))
}
+if (CCTK_Equals(recon_method,"weno"))
+{
+
+ schedule GRHydro_WENOSetup AT CCTK_Basegrid
+ {
+ OPTIONS: global
+ LANG:Fortran
+ } "Coefficients for WENO reconstruction"
+
+ schedule GRHydro_WENOShutdown AT CCTK_Terminate BEFORE Driver_Terminate
+ {
+ OPTIONS: global
+ LANG:Fortran
+ } "Deallocate WENO coefficients"
+
+}
+
+
######################################################################
### This routine is a bit strangely situated, as it's really to do ###
### with initial data. There may be a better place for it later. ###
diff --git a/src/GRHydro_Reconstruct.F90 b/src/GRHydro_Reconstruct.F90
index 8ac033a..6a2fc27 100644
--- a/src/GRHydro_Reconstruct.F90
+++ b/src/GRHydro_Reconstruct.F90
@@ -89,8 +89,13 @@ subroutine Reconstruction(CCTK_ARGUMENTS)
! this handles MHD and non-MHD
call GRHydro_ENOReconstruct_drv(CCTK_PASS_FTOF)
+ else if (CCTK_EQUALS(recon_method,"weno")) then
+ ! this handles MHD and non-MHD
+ call GRHydro_WENOReconstruct_drv(CCTK_PASS_FTOF)
+
else
call CCTK_WARN(0, "Reconstruction method not recognized!")
+
end if
if (evolve_tracer .ne. 0) then
diff --git a/src/GRHydro_WENOReconstruct.F90 b/src/GRHydro_WENOReconstruct.F90
new file mode 100644
index 0000000..e7273a0
--- /dev/null
+++ b/src/GRHydro_WENOReconstruct.F90
@@ -0,0 +1,276 @@
+ /*@@
+ @file GRHydro_WENOReconstruct.F90
+ @date Fri Jan 3 2013
+ @author Ian Hawke, Christian Reisswig
+ @desc
+ Routines to set up the coefficient array and to perform one dimensional
+ ENO reconstruction of arbitrary order.
+ @enddesc
+ @@*/
+
+#include "cctk.h"
+#include "cctk_Parameters.h"
+#include "cctk_Arguments.h"
+
+ /*@@
+ @routine GRHydro_WENOSetup
+ @date Fri Jan 3 2013
+ @author Christian Reisswig
+ @desc
+ Sets up the coefficient array for WENO reconstruction.
+ Uses the notation of Shu, equation (2.21), in
+ ''High Order ENO and WENO Schemes for CFD''
+ (see ThornGuide for full reference).
+ One exception: (Shu) r -> (Here) i: avoiding name clash.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+subroutine GRHydro_WENOSetup(CCTK_ARGUMENTS)
+
+ USE GRHydro_WENOScalars
+
+ implicit none
+
+ DECLARE_CCTK_ARGUMENTS
+ DECLARE_CCTK_PARAMETERS
+
+ CCTK_INT :: i, j, k, l, m, q, allocstat
+ CCTK_REAL :: denominator, numerator, numerator_product
+
+ if(.not.coeffs_allocated) then
+ ! Right now we hardcode to 5th order
+ allocate(weno_coeffs(3, 5), STAT=allocstat)
+ if (allocstat .ne. 0) call CCTK_WARN(0, "Failed to allocate WENO coefficient arrays!")
+ allocate(beta_shu(3, 6), STAT=allocstat)
+ if (allocstat .ne. 0) call CCTK_WARN(0, "Failed to allocate smoothness indicator stencil coefficient arrays!")
+ coeffs_allocated = .true.
+ endif
+
+ ! Set stencils
+ weno_coeffs(1,1) = 3.0d0/8.0d0
+ weno_coeffs(1,2) = -5.0d0/4.0d0
+ weno_coeffs(1,3) = 15.0d0/8.0d0
+ weno_coeffs(1,4) = 0.0d0
+ weno_coeffs(1,5) = 0.0d0
+
+ weno_coeffs(2,1) = 0.0d0
+ weno_coeffs(2,2) = -1.0d0/8.0d0
+ weno_coeffs(2,3) = 3.0d0/4.0d0
+ weno_coeffs(2,4) = 3.0d0/8.0d0
+ weno_coeffs(2,5) = 0.0d0
+
+ weno_coeffs(3,1) = 0.0d0
+ weno_coeffs(3,2) = 0.0d0
+ weno_coeffs(3,3) = 3.0d0/8.0d0
+ weno_coeffs(3,4) = 3.0d0/4.0d0
+ weno_coeffs(3,5) = -1.0d0/8.0d0
+
+ ! Shu smoothness indicator stencil coefficients
+ beta_shu(1,1) = 4.0d0/3.0d0
+ beta_shu(1,2) = -19.0d0/3.0d0
+ beta_shu(1,3) = 25.0d0/3.0d0
+ beta_shu(1,4) = 11.0d0/3.0d0
+ beta_shu(1,5) = -31.0d0/3.0d0
+ beta_shu(1,6) = 10.0d0/3.0d0
+
+ beta_shu(2,1) = 4.0d0/3.0d0
+ beta_shu(2,2) = -13.0d0/3.0d0
+ beta_shu(2,3) = 13.0d0/3.0d0
+ beta_shu(2,4) = 5.0d0/3.0d0
+ beta_shu(2,5) = -13.0d0/3.0d0
+ beta_shu(2,6) = 4.0d0/3.0d0
+
+ beta_shu(3,1) = 10.0d0/3.0d0
+ beta_shu(3,2) = -31.0d0/3.0d0
+ beta_shu(3,3) = 25.0d0/3.0d0
+ beta_shu(3,4) = 11.0d0/3.0d0
+ beta_shu(3,5) = -19.0d0/3.0d0
+ beta_shu(3,6) = 4.0d0/3.0d0
+
+end subroutine GRHydro_WENOSetup
+
+ /*@@
+ @routine GRHydro_ENOShutdown
+ @date Fri Jan 3 2013
+ @author Christian Reisswig
+ @desc
+ Deallocates the coefficient arrays
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+subroutine GRHydro_WENOShutdown(CCTK_ARGUMENTS)
+
+ USE GRHydro_WENOScalars
+
+ implicit none
+
+ DECLARE_CCTK_ARGUMENTS
+
+ CCTK_INT :: deallocstat
+
+ if(coeffs_allocated) then
+ deallocate(weno_coeffs, STAT = deallocstat)
+ if (deallocstat .ne. 0) call CCTK_WARN(0, "Failed to deallocate WENO coefficients.")
+ deallocate(beta_shu, STAT = deallocstat)
+ if (deallocstat .ne. 0) call CCTK_WARN(0, "Failed to deallocate shu smoothness indicator coefficients.")
+ coeffs_allocated = .false.
+ endif
+
+end subroutine GRHydro_WENOShutdown
+
+ /*@@
+ @routine GRHydro_ENOReconstruct1d
+ @date Fri Jan 3 2013
+ @author Christian Reisswig
+ @desc
+ Perform a one dimensional reconstruction of a given array using WENO.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+#define SpaceMask_CheckStateBitsF90_1D(mask,i,type_bits,state_bits) \
+ (iand(mask((i)),(type_bits)).eq.(state_bits))
+
+subroutine GRHydro_WENOReconstruct1d(order, nx, v, vminus, vplus, trivial_rp, &
+ hydro_excision_mask)
+ USE GRHydro_WENOScalars
+
+ implicit none
+
+ DECLARE_CCTK_PARAMETERS
+
+ CCTK_INT :: order, nx, i, j, k, r
+ CCTK_REAL, dimension(nx) :: v, vplus, vminus
+ CCTK_REAL, dimension(order, 1-order:nx+order) :: vdiff
+
+ CCTK_INT, dimension(nx) :: hydro_excision_mask
+ logical, dimension(nx) :: trivial_rp
+ logical, dimension(nx) :: excise
+ logical :: normal_weno
+
+ CCTK_REAL :: large = 1.d10, gamma1, gamma2, gamma3, beta1, beta2, beta3, w1, w2, w3, wbar1, wbar2, wbar3
+
+ vminus = 0.d0
+ vplus = 0.d0
+
+ excise = .false.
+ trivial_rp = .false.
+
+
+
+!!$ Initialize excision
+ do i = 1, nx
+ if (GRHydro_enable_internal_excision /= 0 .and. (hydro_excision_mask(i) .ne. 0)) then
+ vdiff(1, i) = large * (-1.d0*(1.d0+mod(i,10)))**i
+ trivial_rp(i) = .true.
+ excise(i) = .true.
+ if (i > 1) then
+ trivial_rp(i-1) = .true.
+ end if
+ end if
+ end do
+
+ do i = 3, nx-2
+!!$ Handle excision
+ normal_weno = .true.
+ if (i < nx) then
+ if (excise(i+1)) then
+ vminus(i) = v(i)
+ vplus(i) = v(i)
+ normal_weno = .false.
+ end if
+ end if
+ if (i > 1) then
+ if (excise(i-1)) then
+ vminus(i) = v(i)
+ vplus(i) = v(i)
+ normal_weno = .false.
+ end if
+ end if
+
+ if (normal_weno) then
+
+!!$ Compute smoothness indicators
+ beta1 = beta_shu(1,1)*v(i-2)**2 &
+ + beta_shu(1,2)*v(i-2)*v(i-1) &
+ + beta_shu(1,3)*v(i-1)**2 &
+ + beta_shu(1,4)*v(i-2)*v(i) &
+ + beta_shu(1,5)*v(i-1)*v(i) &
+ + beta_shu(1,6)*v(i)**2
+
+ beta2 = beta_shu(2,1)*v(i-1)**2 &
+ + beta_shu(2,2)*v(i-1)*v(i) &
+ + beta_shu(2,3)*v(i)**2 &
+ + beta_shu(2,4)*v(i-1)*v(i+1) &
+ + beta_shu(2,5)*v(i)*v(i+1) &
+ + beta_shu(2,6)*v(i+1)**2
+
+ beta3 = beta_shu(3,1)*v(i)**2 &
+ + beta_shu(3,2)*v(i)*v(i+1) &
+ + beta_shu(3,3)*v(i+1)**2 &
+ + beta_shu(3,4)*v(i)*v(i+2) &
+ + beta_shu(3,5)*v(i+1)*v(i+2) &
+ + beta_shu(3,6)*v(i+2)**2
+
+
+ wbar1 = 1.0d0/16.d0 / (weno_eps + beta1)**2
+ wbar2 = 5.0d0/8.d0 / (weno_eps + beta2)**2
+ wbar3 = 5.0d0/16.d0 / (weno_eps + beta3)**2
+
+ w1 = wbar1 / (wbar1 + wbar2 + wbar3)
+ w2 = wbar2 / (wbar1 + wbar2 + wbar3)
+ w3 = wbar3 / (wbar1 + wbar2 + wbar3)
+
+!!$ Calculate the reconstruction
+ do j = 1, 5
+ vplus(i) = vplus(i) + w1 * weno_coeffs(1,j)*v(i-3+j) &
+ + w2 * weno_coeffs(2,j)*v(i-3+j) &
+ + w3 * weno_coeffs(3,j)*v(i-3+j)
+ vminus(i) = vminus(i) + w1 * weno_coeffs(3,6-j)*v(i-3+j) &
+ + w2 * weno_coeffs(2,6-j)*v(i-3+j) &
+ + w3 * weno_coeffs(1,6-j)*v(i-3+j)
+
+ end do
+
+ end if
+ end do
+
+ do i = 1, nx
+ if (excise(i)) then
+ if (i > 1) then
+ if (.not. excise(i-1)) then
+ vminus(i) = vplus(i-1)
+ end if
+ end if
+ vplus(i) = vminus(i)
+ end if
+ end do
+ do i = nx, 1, -1
+ if (excise(i)) then
+ if (i < nx) then
+ if (.not. excise(i+1)) then
+ vplus(i) = vminus(i+1)
+ end if
+ end if
+ vminus(i) = vplus(i)
+ end if
+ end do
+
+end subroutine GRHydro_WENOReconstruct1d
diff --git a/src/GRHydro_WENOReconstruct_drv.F90 b/src/GRHydro_WENOReconstruct_drv.F90
new file mode 100644
index 0000000..2c748c5
--- /dev/null
+++ b/src/GRHydro_WENOReconstruct_drv.F90
@@ -0,0 +1,471 @@
+ /*@@
+ @file GRHydro_WENOReconstruct_drv.F90
+ @date Fri Jan 3 2013
+ @author Christian Reisswig, Bruno C. Mundim, Joshua Faber, Christian D. Ott
+ @desc
+ Driver routine to perform the WENO reconstruction.
+ @enddesc
+ @@*/
+
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Parameters.h"
+#include "cctk_Functions.h"
+
+#include "SpaceMask.h"
+
+#define velx(i,j,k) vup(i,j,k,1)
+#define vely(i,j,k) vup(i,j,k,2)
+#define velz(i,j,k) vup(i,j,k,3)
+#define sx(i,j,k) scon(i,j,k,1)
+#define sy(i,j,k) scon(i,j,k,2)
+#define sz(i,j,k) scon(i,j,k,3)
+#define Bvecx(i,j,k) Bprim(i,j,k,1)
+#define Bvecy(i,j,k) Bprim(i,j,k,2)
+#define Bvecz(i,j,k) Bprim(i,j,k,3)
+#define Bconsx(i,j,k) Bcons(i,j,k,1)
+#define Bconsy(i,j,k) Bcons(i,j,k,2)
+#define Bconsz(i,j,k) Bcons(i,j,k,3)
+
+
+ /*@@
+ @routine GRHydro_WENOReconstruct_drv
+ @date Fri Jan 3 2013
+ @author Christian Reisswig, Luca Baiotti, Ian Hawke, Bruno C. Mundim, Joshua Faber, Christian D. Ott
+ @desc
+ A driver routine to do WENO reconstruction.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+subroutine GRHydro_WENOReconstruct_drv(CCTK_ARGUMENTS)
+
+ implicit none
+
+ ! save memory when MP is not used
+ ! TARGET as to be before DECLARE_CCTK_ARGUMENTS for gcc 4.1
+ TARGET vel, lvel
+ TARGET Bvec, lBvec
+
+ DECLARE_CCTK_ARGUMENTS
+ DECLARE_CCTK_PARAMETERS
+ DECLARE_CCTK_FUNCTIONS
+
+ integer :: nx, ny, nz, i, j, k, itracer
+
+ logical, dimension(:,:,:), allocatable :: trivial_rp
+
+ CCTK_INT :: type_bitsx, trivialx, not_trivialx, &
+ &type_bitsy, trivialy, not_trivialy, &
+ &type_bitsz, trivialz, not_trivialz
+
+ CCTK_REAL, dimension(:,:,:),allocatable :: &
+ &dum, dump, dumm
+
+ CCTK_INT :: ierr
+
+ ! save memory when MP is not used
+ CCTK_INT :: GRHydro_UseGeneralCoordinates
+ CCTK_REAL, DIMENSION(:,:,:,:), POINTER :: vup, Bprim
+
+ if (GRHydro_UseGeneralCoordinates(cctkGH).ne.0) then
+ vup => lvel
+ Bprim => lBvec
+ else
+ vup => vel
+ Bprim => Bvec
+ end if
+
+ allocate(trivial_rp(cctk_lsh(1),cctk_lsh(2),cctk_lsh(3)),STAT=ierr)
+ if (ierr .ne. 0) then
+ call CCTK_WARN(0, "Allocation problems with trivial_rp")
+ end if
+
+!!$ The dum variables are used as dummies if MHD on but divergence cleaning off
+ allocate(dum(cctk_lsh(1),cctk_lsh(2),cctk_lsh(3)),&
+ dump(cctk_lsh(1),cctk_lsh(2),cctk_lsh(3)),&
+ dumm(cctk_lsh(1),cctk_lsh(2),cctk_lsh(3)),STAT=ierr)
+
+ if (ierr .ne. 0) then
+ call CCTK_WARN(0, "Allocation problems with dum dump dumm")
+ end if
+
+ call SpaceMask_GetTypeBits(type_bitsx, "Hydro_RiemannProblemX")
+ call SpaceMask_GetStateBits(trivialx, "Hydro_RiemannProblemX", &
+ &"trivial")
+ call SpaceMask_GetStateBits(not_trivialx, "Hydro_RiemannProblemX", &
+ &"not_trivial")
+ call SpaceMask_GetTypeBits(type_bitsy, "Hydro_RiemannProblemY")
+ call SpaceMask_GetStateBits(trivialy, "Hydro_RiemannProblemY", &
+ &"trivial")
+ call SpaceMask_GetStateBits(not_trivialy, "Hydro_RiemannProblemY", &
+ &"not_trivial")
+ call SpaceMask_GetTypeBits(type_bitsz, "Hydro_RiemannProblemZ")
+ call SpaceMask_GetStateBits(trivialz, "Hydro_RiemannProblemZ", &
+ &"trivial")
+ call SpaceMask_GetStateBits(not_trivialz, "Hydro_RiemannProblemZ", &
+ &"not_trivial")
+
+ nx = cctk_lsh(1)
+ ny = cctk_lsh(2)
+ nz = cctk_lsh(3)
+
+!!$ Initialize variables that store reconstructed quantities:
+
+ !$OMP PARALLEL DO PRIVATE(i,j,k)
+ do k=1,cctk_lsh(3)
+ do j=1,cctk_lsh(2)
+ do i=1,cctk_lsh(1)
+ trivial_rp(i,j,k) = .false.
+ rhoplus(i,j,k) = 0.0d0
+ rhominus(i,j,k)= 0.0d0
+ epsplus(i,j,k) = 0.0d0
+ epsminus(i,j,k) = 0.0d0
+ velxplus(i,j,k) = 0.0d0
+ velxminus(i,j,k) = 0.0d0
+ velyplus(i,j,k) = 0.0d0
+ velyminus(i,j,k) = 0.0d0
+ velzplus(i,j,k) = 0.0d0
+ velzminus(i,j,k) = 0.0d0
+
+ if(evolve_mhd.ne.0) then
+ Bvecxplus(i,j,k) = 0.0d0
+ Bvecxminus(i,j,k) = 0.0d0
+ Bvecyplus(i,j,k) = 0.0d0
+ Bvecyminus(i,j,k) = 0.0d0
+ Bveczplus(i,j,k) = 0.0d0
+ Bveczminus(i,j,k) = 0.0d0
+ if(clean_divergence.ne.0) then
+ psidcplus(i,j,k) = 0.0d0
+ psidcminus(i,j,k) = 0.0d0
+ endif
+ endif
+
+ if (evolve_entropy .ne. 0) then
+ entropyplus(i,j,k) = 0.0d0
+ entropyminus(i,j,k) = 0.0d0
+ endif
+
+ if (evolve_tracer .ne. 0) then
+ tracerplus(i,j,k,:) = 0.0d0
+ tracerminus(i,j,k,:) = 0.0d0
+ endif
+
+ if (evolve_Y_e .ne. 0) then
+ Y_e_plus(i,j,k) = 0.0d0
+ Y_e_minus(i,j,k) = 0.0d0
+ endif
+
+ enddo
+ enddo
+ enddo
+ !$OMP END PARALLEL DO
+
+!!$ WENO starts:
+ if (evolve_tracer .ne. 0) then
+ do itracer=1,number_of_tracers
+ call tvdreconstruct(nx, ny, nz, xoffset, yoffset, zoffset, &
+ tracer(:,:,:,itracer), tracerplus(:,:,:,itracer), &
+ tracerminus(:,:,:,itracer), trivial_rp, &
+ hydro_excision_mask)
+ enddo
+ end if
+
+ if (evolve_Y_e .ne. 0) then
+ call tvdreconstruct(nx, ny, nz, xoffset, yoffset, zoffset, &
+ Y_e(:,:,:), Y_e_plus(:,:,:), &
+ Y_e_minus(:,:,:), &
+ trivial_rp, hydro_excision_mask)
+ endif
+
+ if (flux_direction == 1) then
+ ! constraint transport needs to be able to average fluxes in the directions
+ ! other that flux_direction, which in turn need the primitives on interfaces
+ !$OMP PARALLEL DO PRIVATE(i, j, k)
+ do k = GRHydro_stencil, cctk_lsh(3) - GRHydro_stencil + 1 + transport_constraints
+ do j = GRHydro_stencil, cctk_lsh(2) - GRHydro_stencil + 1 + transport_constraints
+ if (CCTK_EQUALS(recon_vars,"primitive")) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ rho(:,j,k),rhominus(:,j,k),rhoplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ velx(:,j,k),velxminus(:,j,k),velxplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ vely(:,j,k),velyminus(:,j,k),velyplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ velz(:,j,k),velzminus(:,j,k),velzplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ eps(:,j,k),epsminus(:,j,k),epsplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ if(evolve_mhd.ne.0) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ Bvecx(:,j,k),Bvecxminus(:,j,k),Bvecxplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ Bvecy(:,j,k),Bvecyminus(:,j,k),Bvecyplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ Bvecz(:,j,k),Bveczminus(:,j,k),Bveczplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ endif
+ if (evolve_entropy .ne. 0) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ entropy(:,j,k),entropyminus(:,j,k),entropyplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ endif
+ else if (CCTK_EQUALS(recon_vars,"conservative")) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ dens(:,j,k),densminus(:,j,k),densplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ sx(:,j,k),sxminus(:,j,k),sxplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ sy(:,j,k),syminus(:,j,k),syplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ sz(:,j,k),szminus(:,j,k),szplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ tau(:,j,k),tauminus(:,j,k),tauplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ if(evolve_mhd.ne.0) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ Bconsx(:,j,k),Bconsxminus(:,j,k),Bconsxplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ Bconsy(:,j,k),Bconsyminus(:,j,k),Bconsyplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ Bconsz(:,j,k),Bconszminus(:,j,k),Bconszplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ endif
+ if (evolve_entropy .ne. 0) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ entropycons(:,j,k),entropyconsminus(:,j,k),entropyconsplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ endif
+ else
+ !$OMP CRITICAL
+ call CCTK_WARN(0, "Variable type to reconstruct not recognized.")
+ !$OMP END CRITICAL
+ end if
+
+ if(evolve_mhd.ne.0.and.clean_divergence.ne.0) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(1),&
+ psidc(:,j,k),psidcminus(:,j,k),psidcplus(:,j,k),&
+ trivial_rp(:,j,k), hydro_excision_mask(:,j,k))
+ endif
+
+ do i = 1, cctk_lsh(1)
+ if (trivial_rp(i,j,k)) then
+ SpaceMask_SetStateBitsF90(space_mask, i, j, k, type_bitsx, trivialx)
+ else
+ SpaceMask_SetStateBitsF90(space_mask, i, j, k, type_bitsx, not_trivialx)
+ end if
+ end do
+ end do
+ end do
+ !$OMP END PARALLEL DO
+ else if (flux_direction == 2) then
+ ! constraint transport needs to be able to average fluxes in the directions
+ ! other that flux_direction, which in turn need the primitives on interfaces
+ !$OMP PARALLEL DO PRIVATE(i, j, k)
+ do k = GRHydro_stencil, cctk_lsh(3) - GRHydro_stencil + 1 + transport_constraints
+ do j = GRHydro_stencil, cctk_lsh(1) - GRHydro_stencil + 1 + transport_constraints
+ if (CCTK_EQUALS(recon_vars,"primitive")) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ rho(j,:,k),rhominus(j,:,k),rhoplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ velx(j,:,k),velxminus(j,:,k),velxplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ vely(j,:,k),velyminus(j,:,k),velyplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ velz(j,:,k),velzminus(j,:,k),velzplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ eps(j,:,k),epsminus(j,:,k),epsplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ if(evolve_mhd.ne.0) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ Bvecx(j,:,k),Bvecxminus(j,:,k),Bvecxplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ Bvecy(j,:,k),Bvecyminus(j,:,k),Bvecyplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ Bvecz(j,:,k),Bveczminus(j,:,k),Bveczplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ endif
+ if (evolve_entropy .ne. 0) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ entropy(j,:,k),entropyminus(j,:,k),entropyplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ endif
+ else if (CCTK_EQUALS(recon_vars,"conservative")) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ dens(j,:,k),densminus(j,:,k),densplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ sx(j,:,k),sxminus(j,:,k),sxplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ sy(j,:,k),syminus(j,:,k),syplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ sz(j,:,k),szminus(j,:,k),szplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ tau(j,:,k),tauminus(j,:,k),tauplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ if(evolve_mhd.ne.0) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ Bconsx(j,:,k),Bconsxminus(j,:,k),Bconsxplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ Bconsy(j,:,k),Bconsyminus(j,:,k),Bconsyplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ Bconsz(j,:,k),Bconszminus(j,:,k),Bconszplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ endif
+ if (evolve_entropy .ne. 0) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ entropycons(j,:,k),entropyconsminus(j,:,k),entropyconsplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ endif
+ else
+ !$OMP CRITICAL
+ call CCTK_WARN(0, "Variable type to reconstruct not recognized.")
+ !$OMP END CRITICAL
+ end if
+
+ if(evolve_mhd.ne.0.and.clean_divergence.ne.0) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ psidc(j,:,k),psidcminus(j,:,k),psidcplus(j,:,k),&
+ trivial_rp(j,:,k), hydro_excision_mask(j,:,k))
+ endif
+
+ do i = 1, cctk_lsh(2)
+ if (trivial_rp(j,i,k)) then
+ SpaceMask_SetStateBitsF90(space_mask, j, i, k, type_bitsy, trivialy)
+ else
+ SpaceMask_SetStateBitsF90(space_mask, j, i, k, type_bitsy, not_trivialy)
+ end if
+ end do
+ end do
+ end do
+ !$OMP END PARALLEL DO
+ else if (flux_direction == 3) then
+ ! constraint transport needs to be able to average fluxes in the directions
+ ! other that flux_direction, which in turn need the primitives on interfaces
+ !$OMP PARALLEL DO PRIVATE(i, j, k)
+ do k = GRHydro_stencil, cctk_lsh(2) - GRHydro_stencil + 1 + transport_constraints
+ do j = GRHydro_stencil, cctk_lsh(1) - GRHydro_stencil + 1 + transport_constraints
+ if (CCTK_EQUALS(recon_vars,"primitive")) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ rho(j,k,:),rhominus(j,k,:),rhoplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ velx(j,k,:),velxminus(j,k,:),velxplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ vely(j,k,:),velyminus(j,k,:),velyplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ velz(j,k,:),velzminus(j,k,:),velzplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ eps(j,k,:),epsminus(j,k,:),epsplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ if(evolve_mhd.ne.0) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ Bvecx(j,k,:),Bvecxminus(j,k,:),Bvecxplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ Bvecy(j,k,:),Bvecyminus(j,k,:),Bvecyplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ Bvecz(j,k,:),Bveczminus(j,k,:),Bveczplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ endif
+ if (evolve_entropy .ne. 0) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(2),&
+ entropy(j,k,:),entropyminus(j,k,:),entropyplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ endif
+ else if (CCTK_EQUALS(recon_vars,"conservative")) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ dens(j,k,:),densminus(j,k,:),densplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ sx(j,k,:),sxminus(j,k,:),sxplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ sy(j,k,:),syminus(j,k,:),syplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ sz(j,k,:),szminus(j,k,:),szplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ tau(j,k,:),tauminus(j,k,:),tauplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ if(evolve_mhd.ne.0) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ Bconsx(j,k,:),Bconsxminus(j,k,:),Bconsxplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ Bconsy(j,k,:),Bconsyminus(j,k,:),Bconsyplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ Bconsz(j,k,:),Bconszminus(j,k,:),Bconszplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ endif
+ if (evolve_entropy .ne. 0) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ entropycons(j,k,:),entropyconsminus(j,k,:),entropyconsplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ endif
+ else
+ !$OMP CRITICAL
+ call CCTK_WARN(0, "Variable type to reconstruct not recognized.")
+ !$OMP END CRITICAL
+ end if
+
+ if(evolve_mhd.ne.0.and.clean_divergence.ne.0) then
+ call GRHydro_WENOReconstruct1d(WENO_order,cctk_lsh(3),&
+ psidc(j,k,:),psidcminus(j,k,:),psidcplus(j,k,:),&
+ trivial_rp(j,k,:), hydro_excision_mask(j,k,:))
+ endif
+
+ do i = 1, cctk_lsh(3)
+ if (trivial_rp(j,k,i)) then
+ SpaceMask_SetStateBitsF90(space_mask, j, k, i, type_bitsz, trivialz)
+ else
+ SpaceMask_SetStateBitsF90(space_mask, j, k, i, type_bitsz, not_trivialz)
+ end if
+ end do
+ end do
+ end do
+ !$OMP END PARALLEL DO
+ else
+ call CCTK_WARN(0, "Flux direction not x,y,z")
+ end if
+!!$ WENO ends.
+
+ deallocate(trivial_rp)
+ deallocate(dum,dump,dumm)
+
+end subroutine GRHydro_WENOReconstruct_drv
+
diff --git a/src/GRHydro_WENOScalars.F90 b/src/GRHydro_WENOScalars.F90
new file mode 100644
index 0000000..2aee7f1
--- /dev/null
+++ b/src/GRHydro_WENOScalars.F90
@@ -0,0 +1,23 @@
+ /*@@
+ @file GRHydro_WENOScalars.F90
+ @date Fri Jan 3 2013
+ @author Ian Hawke, Christian Reisswig
+ @desc
+ Module containing the coefficient array for WENO reconstruction.
+ @enddesc
+ @@*/
+
+#include "cctk.h"
+#include "cctk_Parameters.h"
+#include "cctk_Arguments.h"
+
+ module GRHydro_WENOScalars
+
+ implicit none
+
+ CCTK_REAL, allocatable :: weno_coeffs(:, :)
+ CCTK_REAL, allocatable :: beta_shu(:, :)
+
+ logical, save :: coeffs_allocated = .false.
+
+ end module GRHydro_WENOScalars
diff --git a/src/make.code.defn b/src/make.code.defn
index 5a1b96e..7244b0d 100644
--- a/src/make.code.defn
+++ b/src/make.code.defn
@@ -68,10 +68,12 @@ SRCS = Utils.F90 \
GRHydro_PPMMReconstruct_drv.F90\
GRHydro_ENOReconstruct_drv.F90\
GRHydro_PPMReconstruct_drv.F90\
+ GRHydro_WENOReconstruct_drv.F90\
GRHydro_LastMoLPostStep.c\
GRHydro_TVDReconstruct_drv.F90\
-
-
+ GRHydro_EvolutionMask.F90\
+ GRHydro_WENOReconstruct.F90\
+ GRHydro_WENOScalars.F90
# Subdirectories containing source files
SUBDIRS =