diff options
author | cott <cott@c83d129a-5a75-4d5a-9c4d-ed3a5855bf45> | 2010-12-06 21:13:20 +0000 |
---|---|---|
committer | cott <cott@c83d129a-5a75-4d5a-9c4d-ed3a5855bf45> | 2010-12-06 21:13:20 +0000 |
commit | e6322a50c9ceb945b7c2ec9966b33da831662882 (patch) | |
tree | 07f7e189e781b22ce0448aa6c99c8db7a0c7c15c | |
parent | 9b147a8c397b5bb7a0c1e8c1537f870474c71a74 (diff) |
* rename HLLE routine source code files to reflect
true content
git-svn-id: http://svn.einsteintoolkit.org/cactus/EinsteinEvolve/GRHydro/trunk@189 c83d129a-5a75-4d5a-9c4d-ed3a5855bf45
-rw-r--r-- | src/GRHydro_HLLE.F90 | 669 | ||||
-rw-r--r-- | src/GRHydro_HLLEM.F90 | 383 | ||||
-rw-r--r-- | src/GRHydro_HLLEPoly.F90 | 621 | ||||
-rw-r--r-- | src/GRHydro_HLLE_EOSG.F90 | 576 | ||||
-rw-r--r-- | src/GRHydro_HLLE_EOSGM.F90 (renamed from src/GRHydro_HLLEPolyM.F90) | 383 | ||||
-rw-r--r-- | src/make.code.defn | 6 |
6 files changed, 1319 insertions, 1319 deletions
diff --git a/src/GRHydro_HLLE.F90 b/src/GRHydro_HLLE.F90 index 7a3f5f8..bd976e1 100644 --- a/src/GRHydro_HLLE.F90 +++ b/src/GRHydro_HLLE.F90 @@ -12,16 +12,16 @@ #include "cctk_Parameters.h" #include "cctk_Arguments.h" #include "cctk_Functions.h" + #include "GRHydro_Macros.h" #include "SpaceMask.h" /*@@ - @routine GRHydro_HLLEGeneral + @routine GRHydro_HLLE @date Sat Jan 26 01:41:02 2002 @author Ian Hawke, Pedro Montero, Toni Font @desc The HLLE solver. Sufficiently simple that its just one big routine. - Rewritten for the new EOS interface. @enddesc @calls @calledby @@ -31,36 +31,25 @@ @@*/ -subroutine GRHydro_HLLEGeneral(CCTK_ARGUMENTS) - +subroutine GRHydro_HLLE(CCTK_ARGUMENTS) USE GRHydro_Eigenproblem + implicit none DECLARE_CCTK_ARGUMENTS DECLARE_CCTK_PARAMETERS - DECLARE_CCTK_FUNCTIONS integer :: i, j, k, m - CCTK_REAL, dimension(5) :: cons_p,cons_m,fplus,fminus,lamplus + CCTK_REAL, dimension(5) :: consp,consm_i,fplus,fminus,lamplus CCTK_REAL, dimension(5) :: f1,lamminus CCTK_REAL, dimension(5) :: qdiff - CCTK_REAL, dimension(6) :: prim_p, prim_m CCTK_REAL :: charmin, charmax, charpm,avg_alp,avg_det CCTK_REAL :: gxxh, gxyh, gxzh, gyyh, gyzh, gzzh, uxxh, uxyh, & - uxzh, uyyh, uyzh, uzzh, avg_beta, usendh, alp_l, alp_r, & - cs2_p, cs2_m, dpdeps_p, dpdeps_m + uxzh, uyyh, uyzh, uzzh, avg_beta, usendh, alp_l, alp_r + CCTK_REAL :: xtemp CCTK_INT :: type_bits, trivial, not_trivial - integer tadmor - - if(CCTK_EQUALS(HLLE_type,"Tadmor")) then - tadmor = 1 - else - tadmor = 0 - endif - - if (flux_direction == 1) then call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemX") call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemX", & @@ -84,45 +73,25 @@ subroutine GRHydro_HLLEGeneral(CCTK_ARGUMENTS) f1 = 0.d0 lamminus = 0.d0 lamplus = 0.d0 - cons_p = 0.d0 - cons_m = 0.d0 + consp = 0.d0 + consm_i = 0.d0 fplus = 0.d0 fminus = 0.d0 qdiff = 0.d0 !!$ Set the left (p for plus) and right (m_i for minus, i+1) states - cons_p(1) = densplus(i,j,k) - cons_p(2) = sxplus(i,j,k) - cons_p(3) = syplus(i,j,k) - cons_p(4) = szplus(i,j,k) - cons_p(5) = tauplus(i,j,k) + consp(1) = densplus(i,j,k) + consp(2) = sxplus(i,j,k) + consp(3) = syplus(i,j,k) + consp(4) = szplus(i,j,k) + consp(5) = tauplus(i,j,k) - cons_m(1) = densminus(i+xoffset,j+yoffset,k+zoffset) - cons_m(2) = sxminus(i+xoffset,j+yoffset,k+zoffset) - cons_m(3) = syminus(i+xoffset,j+yoffset,k+zoffset) - cons_m(4) = szminus(i+xoffset,j+yoffset,k+zoffset) - cons_m(5) = tauminus(i+xoffset,j+yoffset,k+zoffset) - - prim_p(1) = rhoplus(i,j,k) - prim_p(2) = velxplus(i,j,k) - prim_p(3) = velyplus(i,j,k) - prim_p(4) = velzplus(i,j,k) - prim_p(5) = epsplus(i,j,k) - - prim_m(1) = rhominus(i+xoffset,j+yoffset,k+zoffset) - prim_m(2) = velxminus(i+xoffset,j+yoffset,k+zoffset) - prim_m(3) = velyminus(i+xoffset,j+yoffset,k+zoffset) - prim_m(4) = velzminus(i+xoffset,j+yoffset,k+zoffset) - prim_m(5) = epsminus(i+xoffset,j+yoffset,k+zoffset) - - prim_p(6) = pressplus(i,j,k) - cs2_p = eos_cs2_p(i,j,k) - dpdeps_p = eos_dpdeps_p(i,j,k) - - prim_m(6) = pressminus(i+xoffset,j+yoffset,k+zoffset) - cs2_m = eos_cs2_m(i+xoffset,j+yoffset,k+zoffset) - dpdeps_m = eos_dpdeps_m(i+xoffset,j+yoffset,k+zoffset) + consm_i(1) = densminus(i+xoffset,j+yoffset,k+zoffset) + consm_i(2) = sxminus(i+xoffset,j+yoffset,k+zoffset) + consm_i(3) = syminus(i+xoffset,j+yoffset,k+zoffset) + consm_i(4) = szminus(i+xoffset,j+yoffset,k+zoffset) + consm_i(5) = tauminus(i+xoffset,j+yoffset,k+zoffset) !!$ Calculate various metric terms here. !!$ Note also need the average of the lapse at the @@ -154,27 +123,31 @@ subroutine GRHydro_HLLEGeneral(CCTK_ARGUMENTS) gyzh = 0.5d0 * (gyz(i+xoffset,j+yoffset,k+zoffset) + gyz(i,j,k)) gzzh = 0.5d0 * (gzz(i+xoffset,j+yoffset,k+zoffset) + gzz(i,j,k)) - avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh) + avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,\ + gyyh,gyzh,gzzh) !!$ If the Riemann problem is trivial, just calculate the fluxes from the !!$ left state and skip to the next cell if (SpaceMask_CheckStateBitsF90(space_mask, i, j, k, type_bits, trivial)) then - + if (flux_direction == 1) then - call num_x_flux(cons_m(1),cons_m(2),cons_m(3),cons_m(4),cons_m(5),& - f1(1),f1(2),f1(3),f1(4),f1(5),& - prim_m(2),prim_m(6), & + call num_x_flux(consp(1),consp(2),consp(3),consp(4),consp(5),& + f1(1),f1(2),f1(3),& + f1(4),f1(5),& + velxplus(i,j,k),pressplus(i,j,k),& avg_det,avg_alp,avg_beta) else if (flux_direction == 2) then - call num_x_flux(cons_m(1),cons_m(3),cons_m(4),cons_m(2),cons_m(5),& - f1(1),f1(3),f1(4),f1(2),f1(5),& - prim_m(3),prim_m(6), & + call num_x_flux(consp(1),consp(3),consp(4),consp(2),consp(5),& + f1(1),f1(3),f1(4),& + f1(2),f1(5),& + velyplus(i,j,k),pressplus(i,j,k),& avg_det,avg_alp,avg_beta) else if (flux_direction == 3) then - call num_x_flux(cons_m(1),cons_m(4),cons_m(2),cons_m(3),cons_m(5),& - f1(1),f1(4),f1(2),f1(3),f1(5), & - prim_m(4),prim_m(6), & + call num_x_flux(consp(1),consp(4),consp(2),consp(3),consp(5),& + f1(1),f1(4),f1(2),& + f1(3),f1(5),& + velzplus(i,j,k),pressplus(i,j,k),& avg_det,avg_alp,avg_beta) else call CCTK_WARN(0, "Flux direction not x,y,z") @@ -183,8 +156,8 @@ subroutine GRHydro_HLLEGeneral(CCTK_ARGUMENTS) else !!! The end of this branch is right at the bottom of the routine call UpperMetric(uxxh, uxyh, uxzh, uyyh, uyzh, uzzh, & - avg_det,gxxh,gxyh,gxzh, & - gyyh,gyzh, gzzh) + avg_det,gxxh, gxyh, gxzh, & + gyyh, gyzh, gzzh) if (flux_direction == 1) then usendh = uxxh @@ -198,127 +171,201 @@ subroutine GRHydro_HLLEGeneral(CCTK_ARGUMENTS) !!$ Calculate the jumps in the conserved variables - qdiff(1) = cons_m(1) - cons_p(1) - qdiff(2) = cons_m(2) - cons_p(2) - qdiff(3) = cons_m(3) - cons_p(3) - qdiff(4) = cons_m(4) - cons_p(4) - qdiff(5) = cons_m(5) - cons_p(5) + qdiff(1) = consm_i(1) - consp(1) + qdiff(2) = consm_i(2) - consp(2) + qdiff(3) = consm_i(3) - consp(3) + qdiff(4) = consm_i(4) - consp(4) + qdiff(5) = consm_i(5) - consp(5) !!$ Eigenvalues and fluxes either side of the cell interface if (flux_direction == 1) then - call eigenvalues_general(& - prim_m(2),prim_m(3),prim_m(4),cs2_m, & - lamminus,& - gxxh,gxyh,gxzh,& - gyyh,gyzh,gzzh,& - usendh,avg_alp,avg_beta) - call eigenvalues_general(& - prim_p(2),prim_p(3),prim_p(4),cs2_p, & - lamplus,& - gxxh,gxyh,gxzh,& - gyyh,gyzh,gzzh,& - usendh,avg_alp,avg_beta) - call num_x_flux(cons_p(1),cons_p(2),cons_p(3),cons_p(4),cons_p(5),& - fplus(1),fplus(2),fplus(3),fplus(4),fplus(5),& - prim_p(2),prim_p(6), & + if(evolve_temper.ne.1) then + call eigenvalues(GRHydro_eos_handle,& + rhominus(i+xoffset,j+yoffset,k+zoffset),& + velxminus(i+xoffset,j+yoffset,k+zoffset),& + velyminus(i+xoffset,j+yoffset,k+zoffset),& + velzminus(i+xoffset,j+yoffset,k+zoffset),& + epsminus(i+xoffset,j+yoffset,k+zoffset),& + w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& + lamminus,gxxh,gxyh,gxzh,gyyh,& + gyzh,gzzh,& + usendh,avg_alp,avg_beta) + call eigenvalues(GRHydro_eos_handle,rhoplus(i,j,k),& + velxplus(i,j,k),velyplus(i,j,k),& + velzplus(i,j,k),epsplus(i,j,k),w_lorentzplus(i,j,k),& + lamplus,gxxh,gxyh,gxzh,gyyh,& + gyzh,gzzh,& + usendh,avg_alp,avg_beta) + else + xtemp = temperature(i,j,k) + call eigenvalues_hot(GRHydro_eos_handle,i,j,k,& + rhominus(i+xoffset,j+yoffset,k+zoffset),& + velxminus(i+xoffset,j+yoffset,k+zoffset),& + velyminus(i+xoffset,j+yoffset,k+zoffset),& + velzminus(i+xoffset,j+yoffset,k+zoffset),& + epsminus(i+xoffset,j+yoffset,k+zoffset),& + xtemp,& + y_e_minus(i+xoffset,j+yoffset,k+zoffset),& + w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& + lamminus,gxxh,gxyh,gxzh,gyyh,& + gyzh,gzzh,& + usendh,avg_alp,avg_beta) + xtemp = temperature(i,j,k) + call eigenvalues_hot(GRHydro_eos_handle,i,j,k,& + rhoplus(i,j,k),& + velxplus(i,j,k),velyplus(i,j,k),& + velzplus(i,j,k),epsplus(i,j,k), & + xtemp,y_e_plus(i,j,k),& + w_lorentzplus(i,j,k),& + lamplus,gxxh,gxyh,gxzh,gyyh,& + gyzh,gzzh,& + usendh,avg_alp,avg_beta) + endif + call num_x_flux(consp(1),consp(2),consp(3),consp(4),consp(5),& + fplus(1),fplus(2),fplus(3),fplus(4),& + fplus(5),velxplus(i,j,k),pressplus(i,j,k),& avg_det,avg_alp,avg_beta) - call num_x_flux(cons_m(1),cons_m(2),cons_m(3),cons_m(4),cons_m(5),& - fminus(1),fminus(2),fminus(3),fminus(4),fminus(5),& - prim_m(2),prim_m(6), & + call num_x_flux(consm_i(1),consm_i(2),consm_i(3),& + consm_i(4),consm_i(5),fminus(1),fminus(2),fminus(3),& + fminus(4), fminus(5),& + velxminus(i+xoffset,j+yoffset,k+zoffset),& + pressminus(i+xoffset,j+yoffset,k+zoffset),& avg_det,avg_alp,avg_beta) else if (flux_direction == 2) then - call eigenvalues_general(& - prim_m(3),prim_m(4),prim_m(2),cs2_m, & - lamminus,& - gyyh,gyzh,gxyh,& - gzzh,gxzh,gxxh,& - usendh,avg_alp,avg_beta) - call eigenvalues_general(& - prim_p(3),prim_p(4),prim_p(2),cs2_p, & - lamplus,& - gyyh,gyzh,gxyh,& - gzzh,gxzh,gxxh,& - usendh,avg_alp,avg_beta) - call num_x_flux(cons_p(1),cons_p(3),cons_p(4),cons_p(2),cons_p(5),& - fplus(1),fplus(3),fplus(4),fplus(2),fplus(5),& - prim_p(3),prim_p(6), & + if(evolve_temper.ne.1) then + call eigenvalues(GRHydro_eos_handle,& + rhominus(i+xoffset,j+yoffset,k+zoffset),& + velyminus(i+xoffset,j+yoffset,k+zoffset),& + velzminus(i+xoffset,j+yoffset,k+zoffset),& + velxminus(i+xoffset,j+yoffset,k+zoffset),& + epsminus(i+xoffset,j+yoffset,k+zoffset),& + w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& + lamminus,gyyh,gyzh,gxyh,gzzh,& + gxzh,gxxh,& + usendh,avg_alp,avg_beta) + call eigenvalues(GRHydro_eos_handle,rhoplus(i,j,k),& + velyplus(i,j,k),velzplus(i,j,k),& + velxplus(i,j,k),epsplus(i,j,k),w_lorentzplus(i,j,k),& + lamplus,gyyh,gyzh,gxyh,gzzh,& + gxzh,gxxh,& + usendh,avg_alp,avg_beta) + else + xtemp = temperature(i,j,k) + call eigenvalues_hot(GRHydro_eos_handle,i,j,k,& + rhominus(i+xoffset,j+yoffset,k+zoffset),& + velyminus(i+xoffset,j+yoffset,k+zoffset),& + velzminus(i+xoffset,j+yoffset,k+zoffset),& + velxminus(i+xoffset,j+yoffset,k+zoffset),& + epsminus(i+xoffset,j+yoffset,k+zoffset),& + xtemp,& + y_e_minus(i+xoffset,j+yoffset,k+zoffset),& + w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& + lamminus,gyyh,gyzh,gxyh,gzzh,& + gxzh,gxxh,& + usendh,avg_alp,avg_beta) + xtemp = temperature(i,j,k) + call eigenvalues_hot(GRHydro_eos_handle,i,j,k,& + rhoplus(i,j,k),& + velyplus(i,j,k),velzplus(i,j,k),& + velxplus(i,j,k),epsplus(i,j,k),& + xtemp,y_e_plus(i,j,k),& + w_lorentzplus(i,j,k),& + lamplus,gyyh,gyzh,gxyh,gzzh,& + gxzh,gxxh,& + usendh,avg_alp,avg_beta) + endif + call num_x_flux(consp(1),consp(3),consp(4),consp(2),consp(5),& + fplus(1),fplus(3),fplus(4),fplus(2),& + fplus(5),velyplus(i,j,k),pressplus(i,j,k),& avg_det,avg_alp,avg_beta) - call num_x_flux(cons_m(1),cons_m(3),cons_m(4),cons_m(2),cons_m(5),& - fminus(1),fminus(3),fminus(4),fminus(2),fminus(5),& - prim_m(3),prim_m(6), & + call num_x_flux(consm_i(1),consm_i(3),consm_i(4),& + consm_i(2),consm_i(5),fminus(1),fminus(3),fminus(4),& + fminus(2), fminus(5),& + velyminus(i+xoffset,j+yoffset,k+zoffset),& + pressminus(i+xoffset,j+yoffset,k+zoffset),& avg_det,avg_alp,avg_beta) else if (flux_direction == 3) then - call eigenvalues_general(& - prim_m(4),prim_m(2),prim_m(3),cs2_m, & - lamminus,& - gzzh,gxzh,gyzh,& - gxxh,gxyh,gyyh,& - usendh,avg_alp,avg_beta) - call eigenvalues_general(& - prim_p(4),prim_p(2),prim_p(3),cs2_p, & - lamplus,& - gzzh,gxzh,gyzh,& - gxxh,gxyh,gyyh,& - usendh,avg_alp,avg_beta) - call num_x_flux(cons_p(1),cons_p(4),cons_p(2),cons_p(3),cons_p(5),& - fplus(1),fplus(4),fplus(2),fplus(3),fplus(5), & - prim_p(4),prim_p(6), & - avg_det,avg_alp,avg_beta) - call num_x_flux(cons_m(1),cons_m(4),cons_m(2),cons_m(3),cons_m(5),& - fminus(1),fminus(4),fminus(2),fminus(3),fminus(5), & - prim_m(4),prim_m(6), & + if(evolve_temper.ne.1) then + call eigenvalues(GRHydro_eos_handle,& + rhominus(i+xoffset,j+yoffset,k+zoffset),& + velzminus(i+xoffset,j+yoffset,k+zoffset),& + velxminus(i+xoffset,j+yoffset,k+zoffset),& + velyminus(i+xoffset,j+yoffset,k+zoffset),& + epsminus(i+xoffset,j+yoffset,k+zoffset),& + w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& + lamminus,gzzh,gxzh,gyzh,& + gxxh,gxyh,gyyh,& + usendh,avg_alp,avg_beta) + call eigenvalues(GRHydro_eos_handle,rhoplus(i,j,k),& + velzplus(i,j,k),velxplus(i,j,k),& + velyplus(i,j,k),epsplus(i,j,k),w_lorentzplus(i,j,k),& + lamplus,gzzh,gxzh,gyzh,& + gxxh,gxyh,gyyh,& + usendh,avg_alp,avg_beta) + else + xtemp = temperature(i,j,k) + call eigenvalues_hot(GRHydro_eos_handle,i,j,k,& + rhominus(i+xoffset,j+yoffset,k+zoffset),& + velzminus(i+xoffset,j+yoffset,k+zoffset),& + velxminus(i+xoffset,j+yoffset,k+zoffset),& + velyminus(i+xoffset,j+yoffset,k+zoffset),& + epsminus(i+xoffset,j+yoffset,k+zoffset),& + xtemp,y_e_minus(i+xoffset,j+yoffset,k+zoffset),& + w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& + lamminus,gzzh,gxzh,gyzh,& + gxxh,gxyh,gyyh,& + usendh,avg_alp,avg_beta) + xtemp = temperature(i,j,k) + call eigenvalues_hot(GRHydro_eos_handle,i,j,k,& + rhoplus(i,j,k),& + velzplus(i,j,k),velxplus(i,j,k),& + velyplus(i,j,k),epsplus(i,j,k),& + xtemp,y_e_plus(i,j,k),& + w_lorentzplus(i,j,k),& + lamplus,gzzh,gxzh,gyzh,& + gxxh,gxyh,gyyh,& + usendh,avg_alp,avg_beta) + endif + call num_x_flux(consp(1),consp(4),consp(2),consp(3),consp(5),& + fplus(1),fplus(4),fplus(2),fplus(3),& + fplus(5),velzplus(i,j,k),pressplus(i,j,k),avg_det,& + avg_alp,avg_beta) + call num_x_flux(consm_i(1),consm_i(4),consm_i(2),& + consm_i(3),consm_i(5),fminus(1),fminus(4),fminus(2),& + fminus(3), fminus(5),& + velzminus(i+xoffset,j+yoffset,k+zoffset),& + pressminus(i+xoffset,j+yoffset,k+zoffset),& avg_det,avg_alp,avg_beta) else call CCTK_WARN(0, "Flux direction not x,y,z") end if - - if(tadmor.eq.0) then - + !!$ Find minimum and maximum wavespeeds - charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), & - lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& - lamminus(4),lamminus(5)) + charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), & + lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& + lamminus(4),lamminus(5)) - charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), & - lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& - lamminus(4),lamminus(5)) + charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), & + lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& + lamminus(4),lamminus(5)) - charpm = charmax - charmin + charpm = charmax - charmin !!$ Calculate flux by standard formula - do m = 1,5 - - qdiff(m) = cons_m(m) - cons_p(m) - - f1(m) = (charmax * fplus(m) - charmin * fminus(m) + & - charmax * charmin * qdiff(m)) / charpm - - end do + do m = 1,5 - else - ! Tadmor's semi-discrete scheme: JcP 160, 241 (2000) - - charmax = max(abs(lamplus(1)), abs(lamplus(2)), abs(lamplus(3)), & - abs(lamplus(4)),abs(lamplus(5)),abs(lamminus(1)),abs(lamminus(2)), & - abs(lamminus(3)),abs(lamminus(4)),abs(lamminus(5))) - - do m = 1,5 + qdiff(m) = consm_i(m) - consp(m) - qdiff(m) = cons_m(m) - cons_p(m) - - f1(m) = 0.5d0 * (fplus(m) + fminus(m)) - 0.5d0*charmax* & - qdiff(m) - - end do + f1(m) = (charmax * fplus(m) - charmin * fminus(m) + & + charmax * charmin * qdiff(m)) / charpm - end if - + end do end if !!! The end of the SpaceMask check for a trivial RP. - + densflux(i, j, k) = f1(1) sxflux(i, j, k) = f1(2) syflux(i, j, k) = f1(3) @@ -330,22 +377,36 @@ subroutine GRHydro_HLLEGeneral(CCTK_ARGUMENTS) Y_e_con_flux(i, j, k) = & Y_e_plus(i, j, k) * & densflux(i, j, k) - else - Y_e_con_flux(i, j, k) = & - Y_e_minus(i + xoffset, j + yoffset, k + zoffset) * & - densflux(i, j, k) - endif - endif + else + Y_e_con_flux(i, j, k) = & + Y_e_minus(i + xoffset, j + yoffset, k + zoffset) * & + densflux(i, j, k) + endif + endif - end do + end do end do end do + +end subroutine GRHydro_HLLE -end subroutine GRHydro_HLLEGeneral + /*@@ + @routine GRHydro_HLLE_Tracer + @date Mon Mar 8 13:47:13 2004 + @author Ian Hawke + @desc + HLLE just for the tracer. + @enddesc + @calls + @calledby + @history + + @endhistory +@@*/ -subroutine GRHydro_HLLE_TracerGeneral(CCTK_ARGUMENTS) +subroutine GRHydro_HLLE_Tracer(CCTK_ARGUMENTS) USE GRHydro_Eigenproblem @@ -353,26 +414,32 @@ subroutine GRHydro_HLLE_TracerGeneral(CCTK_ARGUMENTS) DECLARE_CCTK_ARGUMENTS DECLARE_CCTK_PARAMETERS - DECLARE_CCTK_FUNCTIONS - integer :: i, j, k, m - CCTK_REAL, dimension(number_of_tracers) :: cons_p,cons_m,fplus,fminus,f1 + integer :: i, j, k, m + CCTK_REAL, dimension(number_of_tracers) :: consp,consm_i,fplus,fminus,f1 CCTK_REAL, dimension(5) :: lamminus,lamplus CCTK_REAL, dimension(number_of_tracers) :: qdiff - CCTK_REAL, dimension(6) :: prim_p, prim_m CCTK_REAL :: charmin, charmax, charpm,avg_alp,avg_det CCTK_REAL :: gxxh, gxyh, gxzh, gyyh, gyzh, gzzh, uxxh, uxyh, & - uxzh, uyyh, uyzh, uzzh, avg_beta, usendh, alp_l, alp_r, & - cs2_p, cs2_m, dpdeps_p, dpdeps_m - - integer tadmor + uxzh, uyyh, uyzh, uzzh, avg_beta, usendh, alp_l, alp_r + + CCTK_INT :: type_bits, trivial, not_trivial - if(CCTK_EQUALS(HLLE_type,"Tadmor")) then - tadmor = 1 + if (flux_direction == 1) then + call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemX") + call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemX", & + &"trivial") + else if (flux_direction == 2) then + call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemY") + call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemY", & + &"trivial") + else if (flux_direction == 3) then + call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemZ") + call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemZ", & + &"trivial") else - tadmor = 0 - endif - + call CCTK_WARN(0, "Flux direction not x,y,z") + end if do k = GRHydro_stencil, cctk_lsh(3) - GRHydro_stencil do j = GRHydro_stencil, cctk_lsh(2) - GRHydro_stencil @@ -381,37 +448,18 @@ subroutine GRHydro_HLLE_TracerGeneral(CCTK_ARGUMENTS) f1 = 0.d0 lamminus = 0.d0 lamplus = 0.d0 - cons_p = 0.d0 - cons_m = 0.d0 + consp = 0.d0 + consm_i = 0.d0 fplus = 0.d0 fminus = 0.d0 qdiff = 0.d0 !!$ Set the left (p for plus) and right (m_i for minus, i+1) states - cons_p(:) = cons_tracerplus(i,j,k,:) - cons_m(:) = cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) - - prim_p(1) = rhoplus(i,j,k) - prim_p(2) = velxplus(i,j,k) - prim_p(3) = velyplus(i,j,k) - prim_p(4) = velzplus(i,j,k) - prim_p(5) = epsplus(i,j,k) - - prim_m(1) = rhominus(i+xoffset,j+yoffset,k+zoffset) - prim_m(2) = velxminus(i+xoffset,j+yoffset,k+zoffset) - prim_m(3) = velyminus(i+xoffset,j+yoffset,k+zoffset) - prim_m(4) = velzminus(i+xoffset,j+yoffset,k+zoffset) - prim_m(5) = epsminus(i+xoffset,j+yoffset,k+zoffset) - - prim_p(6) = pressplus(i,j,k) - cs2_p = eos_cs2_p(i,j,k) - dpdeps_p = eos_dpdeps_p(i,j,k) - - prim_m(6) = pressminus(i+xoffset,j+yoffset,k+zoffset) - cs2_m = eos_cs2_m(i+xoffset,j+yoffset,k+zoffset) - dpdeps_m = eos_dpdeps_m(i+xoffset,j+yoffset,k+zoffset) - + do m=1,number_of_tracers + consp(m) = cons_tracerplus(i,j,k,m) + consm_i(m) = cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,m) + enddo !!$ Calculate various metric terms here. !!$ Note also need the average of the lapse at the !!$ left and right points. @@ -442,135 +490,132 @@ subroutine GRHydro_HLLE_TracerGeneral(CCTK_ARGUMENTS) gyzh = 0.5d0 * (gyz(i+xoffset,j+yoffset,k+zoffset) + gyz(i,j,k)) gzzh = 0.5d0 * (gzz(i+xoffset,j+yoffset,k+zoffset) + gzz(i,j,k)) - avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh) + avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,\ + gyyh,gyzh,gzzh) -!!$ If the Riemann problem is trivial, just calculate the fluxes from the -!!$ left state and skip to the next cell - call UpperMetric(uxxh, uxyh, uxzh, uyyh, uyzh, uzzh, & avg_det,gxxh, gxyh, gxzh, & gyyh, gyzh, gzzh) - + if (flux_direction == 1) then - usendh = uxxh + usendh = uxxh else if (flux_direction == 2) then - usendh = uyyh + usendh = uyyh else if (flux_direction == 3) then - usendh = uzzh + usendh = uzzh else - call CCTK_WARN(0, "Flux direction not x,y,z") + call CCTK_WARN(0, "Flux direction not x,y,z") end if -!!$ Eigenvalues and fluxes either side of the cell interface +!!$ Calculate the jumps in the conserved variables - if (flux_direction == 1) then - call eigenvalues_general(& - prim_m(2),prim_m(3),prim_m(4),cs2_m, & - lamminus,& - gxxh,gxyh,gxzh,& - gyyh,gyzh,gzzh,& - usendh,avg_alp,avg_beta) - call eigenvalues_general(& - prim_p(2),prim_p(3),prim_p(4),cs2_p, & - lamplus,& - gxxh,gxyh,gxzh,& - gyyh,gyzh,gzzh,& - usendh,avg_alp,avg_beta) - fplus(:) = (velxplus(i,j,k) - avg_beta / avg_alp) * & - cons_tracerplus(i,j,k,:) - fminus(:) = (velxminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * & - cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) - else if (flux_direction == 2) then - call eigenvalues_general(& - prim_m(3),prim_m(4),prim_m(2),cs2_m, & - lamminus,& - gyyh,gyzh,gxyh,& - gzzh,gxzh,gxxh,& - usendh,avg_alp,avg_beta) - call eigenvalues_general(& - prim_p(3),prim_p(4),prim_p(2),cs2_p, & - lamplus,& - gyyh,gyzh,gxyh,& - gzzh,gxzh,gxxh,& - usendh,avg_alp,avg_beta) - fplus(:) = (velyplus(i,j,k) - avg_beta / avg_alp) * & - cons_tracerplus(i,j,k,:) - fminus(:) = (velyminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * & - cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) - else if (flux_direction == 3) then - call eigenvalues_general(& - prim_m(4),prim_m(2),prim_m(3),cs2_m, & - lamminus,& - gzzh,gxzh,gyzh,& - gxxh,gxyh,gyyh,& - usendh,avg_alp,avg_beta) - call eigenvalues_general(& - prim_p(4),prim_p(2),prim_p(3),cs2_p, & - lamplus,& - gzzh,gxzh,gyzh,& - gxxh,gxyh,gyyh,& - usendh,avg_alp,avg_beta) - fplus(:) = (velzplus(i,j,k) - avg_beta / avg_alp) * & - cons_tracerplus(i,j,k,:) - fminus(:) = (velzminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * & - cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) - else - call CCTK_WARN(0, "Flux direction not x,y,z") - end if - - if(tadmor.eq.0) then + qdiff = consm_i - consp + +!!$ Eigenvalues and fluxes either side of the cell interface + if (flux_direction == 1) then + call eigenvalues(GRHydro_eos_handle,& + rhominus(i+xoffset,j+yoffset,k+zoffset),& + velxminus(i+xoffset,j+yoffset,k+zoffset),& + velyminus(i+xoffset,j+yoffset,k+zoffset),& + velzminus(i+xoffset,j+yoffset,k+zoffset),& + epsminus(i+xoffset,j+yoffset,k+zoffset),& + w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& + lamminus,gxxh,gxyh,gxzh,gyyh,& + gyzh,gzzh,& + usendh,avg_alp,avg_beta) + call eigenvalues(GRHydro_eos_handle,rhoplus(i,j,k),& + velxplus(i,j,k),velyplus(i,j,k),& + velzplus(i,j,k),epsplus(i,j,k),w_lorentzplus(i,j,k),& + lamplus,gxxh,gxyh,gxzh,gyyh,& + gyzh,gzzh,& + usendh,avg_alp,avg_beta) + fplus(:) = (velxplus(i,j,k) - avg_beta / avg_alp) * & + cons_tracerplus(i,j,k,:) + fminus(:) = (velxminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * & + cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) + else if (flux_direction == 2) then + call eigenvalues(GRHydro_eos_handle,& + rhominus(i+xoffset,j+yoffset,k+zoffset),& + velyminus(i+xoffset,j+yoffset,k+zoffset),& + velzminus(i+xoffset,j+yoffset,k+zoffset),& + velxminus(i+xoffset,j+yoffset,k+zoffset),& + epsminus(i+xoffset,j+yoffset,k+zoffset),& + w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& + lamminus,gyyh,gyzh,gxyh,gzzh,& + gxzh,gxxh,& + usendh,avg_alp,avg_beta) + call eigenvalues(GRHydro_eos_handle,rhoplus(i,j,k),& + velyplus(i,j,k),velzplus(i,j,k),& + velxplus(i,j,k),epsplus(i,j,k),w_lorentzplus(i,j,k),& + lamplus,gyyh,gyzh,gxyh,gzzh,& + gxzh,gxxh,& + usendh,avg_alp,avg_beta) + fplus(:) = (velyplus(i,j,k) - avg_beta / avg_alp) * & + cons_tracerplus(i,j,k,:) + fminus(:) = (velyminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * & + cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) + else if (flux_direction == 3) then + call eigenvalues(GRHydro_eos_handle,& + rhominus(i+xoffset,j+yoffset,k+zoffset),& + velzminus(i+xoffset,j+yoffset,k+zoffset),& + velxminus(i+xoffset,j+yoffset,k+zoffset),& + velyminus(i+xoffset,j+yoffset,k+zoffset),& + epsminus(i+xoffset,j+yoffset,k+zoffset),& + w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& + lamminus,gzzh,gxzh,gyzh,& + gxxh,gxyh,gyyh,& + usendh,avg_alp,avg_beta) + call eigenvalues(GRHydro_eos_handle,rhoplus(i,j,k),& + velzplus(i,j,k),velxplus(i,j,k),& + velyplus(i,j,k),epsplus(i,j,k),w_lorentzplus(i,j,k),& + lamplus,gzzh,gxzh,gyzh,& + gxxh,gxyh,gyyh,& + usendh,avg_alp,avg_beta) + fplus(:) = (velzplus(i,j,k) - avg_beta / avg_alp) * & + cons_tracerplus(i,j,k,:) + fminus(:) = (velzminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * & + cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) + else + call CCTK_WARN(0, "Flux direction not x,y,z") + end if + !!$ Find minimum and maximum wavespeeds - charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), & - lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& - lamminus(4),lamminus(5)) + charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), & + lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& + lamminus(4),lamminus(5)) - charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), & - lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& - lamminus(4),lamminus(5)) - - - charpm = charmax - charmin + charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), & + lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& + lamminus(4),lamminus(5)) + + charpm = charmax - charmin !!$ Calculate flux by standard formula - do m = 1,number_of_tracers - - qdiff(m) = cons_m(m) - cons_p(m) - - f1(m) = (charmax * fplus(m) - charmin * fminus(m) + & - charmax * charmin * qdiff(m)) / charpm - end do - - else - ! Tadmor's semi-descrite scheme: JcP 160, 241 (2000) - - charmax = max(abs(lamplus(1)), abs(lamplus(2)), abs(lamplus(3)), & - abs(lamplus(4)),abs(lamplus(5)),abs(lamminus(1)),abs(lamminus(2)), & - abs(lamminus(3)),abs(lamminus(4)),abs(lamminus(5))) - - do m = 1,number_of_tracers - - qdiff(m) = cons_m(m) - cons_p(m) - - f1(m) = 0.5d0 * (fplus(m) + fminus(m)) - 0.5d0*charmax* & - qdiff(m) - - end do + do m = 1,number_of_tracers - - end if - + qdiff(m) = consm_i(m) - consp(m) + + f1(m) = (charmax * fplus(m) - charmin * fminus(m) + & + charmax * charmin * qdiff(m)) / charpm + + end do - cons_tracerflux(i,j,k,:) = f1(:) - + cons_tracerflux(i, j, k,:) = f1(:) +!!$ +!!$ if ( ((flux_direction.eq.3).and.(i.eq.4).and.(j.eq.4)).or.& +!!$ ((flux_direction.eq.2).and.(i.eq.4).and.(k.eq.4)).or.& +!!$ ((flux_direction.eq.1).and.(j.eq.4).and.(k.eq.4))& +!!$ ) then +!!$ write(*,*) flux_direction, i, j, k, f1(1), consm_i(1), consp(1) +!!$ end if + end do end do end do -end subroutine GRHydro_HLLE_TracerGeneral - - - + +end subroutine GRHydro_HLLE_Tracer diff --git a/src/GRHydro_HLLEM.F90 b/src/GRHydro_HLLEM.F90 index 8fe2ef0..aec2899 100644 --- a/src/GRHydro_HLLEM.F90 +++ b/src/GRHydro_HLLEM.F90 @@ -1,5 +1,5 @@ /*@@ - @file GRHydro_HLLEM.F90 + @file GRHydro_HLLEPolyM.F90 @date Aug 30, 2010 @author Joshua Faber, Scott Noble, Bruno Mundim, Ian Hawke, Pedro Montero, Toni Font @desc @@ -12,16 +12,16 @@ #include "cctk_Parameters.h" #include "cctk_Arguments.h" #include "cctk_Functions.h" + #include "GRHydro_Macros.h" #include "SpaceMask.h" /*@@ - @routine GRHydro_HLLEGeneralM + @routine GRHydro_HLLEM @date Aug 30, 2010 @author Joshua Faber, Scott Noble, Bruno Mundim, Ian Hawke, Pedro Montero, Toni Font @desc The HLLE solver. Sufficiently simple that its just one big routine. - Rewritten for the new EOS interface. @enddesc @calls @calledby @@ -31,18 +31,17 @@ @@*/ -subroutine GRHydro_HLLEGeneralM(CCTK_ARGUMENTS) +subroutine GRHydro_HLLEM(CCTK_ARGUMENTS) USE GRHydro_EigenproblemM implicit none DECLARE_CCTK_ARGUMENTS DECLARE_CCTK_PARAMETERS - DECLARE_CCTK_FUNCTIONS integer :: i, j, k, m CCTK_REAL, dimension(8) :: cons_p,cons_m,fplus,fminus,f1,qdiff - CCTK_REAL, dimension(6) :: prim_p, prim_m + CCTK_REAL, dimension(7) :: prim_p, prim_m CCTK_REAL, dimension(5) :: lamminus,lamplus CCTK_REAL :: charmin, charmax, charpm,avg_alp,avg_det CCTK_REAL :: gxxh, gxyh, gxzh, gyyh, gyzh, gzzh, uxxh, uxyh, & @@ -58,15 +57,6 @@ subroutine GRHydro_HLLEGeneralM(CCTK_ARGUMENTS) CCTK_INT :: type_bits, trivial, not_trivial - integer tadmor - - if(CCTK_EQUALS(HLLE_type,"Tadmor")) then - tadmor = 1 - else - tadmor = 0 - endif - - if (flux_direction == 1) then call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemX") call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemX", & @@ -126,28 +116,22 @@ subroutine GRHydro_HLLEGeneralM(CCTK_ARGUMENTS) prim_p(3) = velyplus(i,j,k) prim_p(4) = velzplus(i,j,k) prim_p(5) = epsplus(i,j,k) + prim_p(6) = pressplus(i,j,k) + prim_p(7) = w_lorentzplus(i,j,k) prim_m(1) = rhominus(i+xoffset,j+yoffset,k+zoffset) prim_m(2) = velxminus(i+xoffset,j+yoffset,k+zoffset) prim_m(3) = velyminus(i+xoffset,j+yoffset,k+zoffset) prim_m(4) = velzminus(i+xoffset,j+yoffset,k+zoffset) prim_m(5) = epsminus(i+xoffset,j+yoffset,k+zoffset) - - prim_p(6) = pressplus(i,j,k) - cs2_p = eos_cs2_p(i,j,k) - dpdeps_p = eos_dpdeps_p(i,j,k) - rhoenth_p = prim_p(1)*(1.0d0+prim_p(5))+prim_p(6) - - prim_m(6) = pressminus(i+xoffset,j+yoffset,k+zoffset) - cs2_m = eos_cs2_m(i+xoffset,j+yoffset,k+zoffset) - dpdeps_m = eos_dpdeps_m(i+xoffset,j+yoffset,k+zoffset) - rhoenth_m = prim_m(1)*(1.0d0+prim_m(5))+prim_m(6) - + prim_m(6) = pressminus(i+xoffset,j+yoffset,k+zoffset) + prim_m(7) = w_lorentzminus(i+xoffset,j+yoffset,k+zoffset) + if(clean_divergence.ne.0) then psidcp = psidcplus(i,j,k) psidcm = psidcminus(i+xoffset,j+yoffset,k+zoffset) endif - + !!$ Calculate various metric terms here. !!$ Note also need the average of the lapse at the !!$ left and right points. @@ -186,7 +170,7 @@ subroutine GRHydro_HLLEGeneralM(CCTK_ARGUMENTS) gyzh = 0.5d0 * (gyz(i+xoffset,j+yoffset,k+zoffset) + gyz(i,j,k)) gzzh = 0.5d0 * (gzz(i+xoffset,j+yoffset,k+zoffset) + gzz(i,j,k)) - avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh) + avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh) vxtp = prim_p(2)-avg_betax/avg_alp vytp = prim_p(3)-avg_betay/avg_alp @@ -225,30 +209,30 @@ subroutine GRHydro_HLLEGeneralM(CCTK_ARGUMENTS) !!$ alp, and beta in the flux dir if (flux_direction == 1) then - call num_x_fluxM(cons_m(1),cons_m(2),cons_m(3),cons_m(4),cons_m(5),& - cons_m(6),cons_m(7),cons_m(8),& + call num_x_fluxM(cons_p(1),cons_p(2),cons_p(3),cons_p(4),cons_p(5),& + cons_p(6),cons_p(7),cons_p(8),& f1(1),f1(2),f1(3),f1(4),f1(5),f1(6),f1(7),f1(8),& - vxtm,vytm,vztm,pressstarm,bxlowm,bylowm,bzlowm,ab0m,wm, & + vxtp,vytp,vztp,pressstarp,bxlowp,bylowp,bzlowp,ab0p,wp, & avg_det,avg_alp,avg_beta) if(clean_divergence.ne.0) then psidcf = cons_p(6) endif else if (flux_direction == 2) then - call num_x_fluxM(cons_m(1),cons_m(3),cons_m(4),cons_m(2),cons_m(5),& - cons_m(7),cons_m(8),cons_m(6),& + call num_x_fluxM(cons_p(1),cons_p(3),cons_p(4),cons_p(2),cons_p(5),& + cons_p(7),cons_p(8),cons_p(6),& f1(1),f1(3),f1(4),f1(2),f1(5),f1(7),f1(8),f1(6),& - vytm,vztm,vxtm,pressstarm,bylowm,bzlowm,bxlowm,ab0m,wm, & + vytp,vztp,vxtp,pressstarp,bylowp,bzlowp,bxlowp,ab0p,wp, & avg_det,avg_alp,avg_beta) if(clean_divergence.ne.0) then psidcf = cons_p(7) endif else if (flux_direction == 3) then - call num_x_fluxM(cons_m(1),cons_m(4),cons_m(2),cons_m(3),cons_m(5),& - cons_m(8),cons_m(6),cons_m(7),& + call num_x_fluxM(cons_p(1),cons_p(4),cons_p(2),cons_p(3),cons_p(5),& + cons_p(8),cons_p(6),cons_p(7),& f1(1),f1(4),f1(2),f1(3),f1(5),f1(8),f1(6),f1(7), & - vztm,vxtm,vytm,pressstarm,bzlowm,bxlowm,bylowm,ab0m,wm, & + vztp,vxtp,vytp,pressstarp,bzlowp,bxlowp,bylowp,ab0p,wp, & avg_det,avg_alp,avg_beta) if(clean_divergence.ne.0) then psidcf = cons_p(8) @@ -292,12 +276,14 @@ subroutine GRHydro_HLLEGeneralM(CCTK_ARGUMENTS) !!$ Eigenvalues and fluxes either side of the cell interface if (flux_direction == 1) then - call eigenvalues_generalM(& - prim_m(2),prim_m(3),prim_m(4),cs2_m,vA2m, & + call eigenvaluesM(GRHydro_eos_handle,& + prim_m(1),prim_m(2),prim_m(3),prim_m(4),prim_m(5),prim_m(7), & + cons_m(6),cons_m(7),cons_m(8),& lamminus,gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,& usendh,avg_alp,avg_beta) - call eigenvalues_generalM(& - prim_p(2),prim_p(3),prim_p(4),cs2_p,vA2p, & + call eigenvaluesM(GRHydro_eos_handle, & + prim_p(1),prim_p(2),prim_p(3),prim_p(4),prim_p(5),prim_p(7), & + cons_p(6),cons_p(7),cons_p(8),& lamplus,gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,& usendh,avg_alp,avg_beta) call num_x_fluxM(cons_p(1),cons_p(2),cons_p(3),cons_p(4),cons_p(5),& @@ -318,12 +304,14 @@ subroutine GRHydro_HLLEGeneralM(CCTK_ARGUMENTS) endif else if (flux_direction == 2) then - call eigenvalues_generalM(& - prim_m(3),prim_m(4),prim_m(2),cs2_m,vA2m, & + call eigenvaluesM(GRHydro_eos_handle,& + prim_m(1),prim_m(3),prim_m(4),prim_m(2),prim_m(5),prim_m(7), & + cons_m(7),cons_m(8),cons_m(6),& lamminus,gyyh,gyzh,gxyh,gzzh,gxzh,gxxh,& usendh,avg_alp,avg_beta) - call eigenvalues_generalM(& - prim_p(3),prim_p(4),prim_p(2),cs2_p,vA2p, & + call eigenvaluesM(GRHydro_eos_handle, & + prim_p(1),prim_p(3),prim_p(4),prim_p(2),prim_p(5),prim_p(7), & + cons_p(7),cons_p(8),cons_p(6),& lamplus,gyyh,gyzh,gxyh,gzzh,gxzh,gxxh,& usendh,avg_alp,avg_beta) call num_x_fluxM(cons_p(1),cons_p(3),cons_p(4),cons_p(2),cons_p(5),& @@ -343,12 +331,14 @@ subroutine GRHydro_HLLEGeneralM(CCTK_ARGUMENTS) endif else if (flux_direction == 3) then - call eigenvalues_generalM(& - prim_m(4),prim_m(2),prim_m(3),cs2_m,vA2m, & + call eigenvaluesM(GRHydro_eos_handle,& + prim_m(1),prim_m(4),prim_m(2),prim_m(3),prim_m(5),prim_m(7), & + cons_m(8),cons_m(6),cons_m(7),& lamminus,gzzh,gxzh,gyzh,gxxh,gxyh,gyyh,& usendh,avg_alp,avg_beta) - call eigenvalues_generalM(& - prim_p(4),prim_p(2),prim_p(3),cs2_p,vA2p, & + call eigenvaluesM(GRHydro_eos_handle,& + prim_p(1),prim_p(4),prim_p(2),prim_p(3),prim_p(5),prim_p(7), & + cons_p(8),cons_p(6),cons_p(7),& lamplus,gzzh,gxzh,gyzh,gxxh,gxyh,gyyh,& usendh,avg_alp,avg_beta) call num_x_fluxM(cons_p(1),cons_p(4),cons_p(2),cons_p(3),cons_p(5),& @@ -370,66 +360,38 @@ subroutine GRHydro_HLLEGeneralM(CCTK_ARGUMENTS) else call CCTK_WARN(0, "Flux direction not x,y,z") end if - - if(tadmor.eq.0) then - + !!$ Find minimum and maximum wavespeeds - charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), & - lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& - lamminus(4),lamminus(5)) + charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), & + lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& + lamminus(4),lamminus(5)) - charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), & - lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& - lamminus(4),lamminus(5)) + charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), & + lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& + lamminus(4),lamminus(5)) - charpm = charmax - charmin + charpm = charmax - charmin !!$ Calculate flux by standard formula do m = 1,8 - qdiff(m) = cons_m(m) - cons_p(m) - - f1(m) = (charmax * fplus(m) - charmin * fminus(m) + & - charmax * charmin * qdiff(m)) / charpm - - end do - - if(clean_divergence.ne.0) then - psidcdiff = psidcm - psidcp - psidcf = (charmax * psidcfp - charmin * psidcfm + & - charmax * charmin * psidcdiff) / charpm - endif - - else - ! Tadmor's semi-discrete scheme: JcP 160, 241 (2000) - - charmax = max(abs(lamplus(1)), abs(lamplus(2)), abs(lamplus(3)), & - abs(lamplus(4)),abs(lamplus(5)),abs(lamminus(1)),abs(lamminus(2)), & - abs(lamminus(3)),abs(lamminus(4)),abs(lamminus(5))) - - do m = 1,8 + qdiff(m) = cons_m(m) - cons_p(m) - qdiff(m) = cons_m(m) - cons_p(m) - - f1(m) = 0.5d0 * (fplus(m) + fminus(m)) - 0.5d0*charmax* & - qdiff(m) - - end do + f1(m) = (charmax * fplus(m) - charmin * fminus(m) + & + charmax * charmin * qdiff(m)) / charpm - if(clean_divergence.ne.0) then - psidcdiff = psidcm - psidcp - psidcf = 0.5d0 * (psidcfp + psidcfm) - 0.5d0*charmax* & - psidcdiff - endif - - end if - + end do + if(clean_divergence.ne.0) then + psidcdiff = psidcm - psidcp + psidcf = (charmax * psidcfp - charmin * psidcfm + & + charmax * charmin * psidcdiff) / charpm + endif end if !!! The end of the SpaceMask check for a trivial RP. - + densflux(i, j, k) = f1(1) sxflux(i, j, k) = f1(2) syflux(i, j, k) = f1(3) @@ -439,13 +401,13 @@ subroutine GRHydro_HLLEGeneralM(CCTK_ARGUMENTS) Bvecyflux(i, j, k) = f1(7) Bveczflux(i, j, k) = f1(8) psidcflux(i,j,k) = psidcf - + if(evolve_Y_e.ne.0) then if (densflux(i, j, k) > 0.d0) then Y_e_con_flux(i, j, k) = & Y_e_plus(i, j, k) * & densflux(i, j, k) - else + else Y_e_con_flux(i, j, k) = & Y_e_minus(i + xoffset, j + yoffset, k + zoffset) * & densflux(i, j, k) @@ -456,10 +418,24 @@ subroutine GRHydro_HLLEGeneralM(CCTK_ARGUMENTS) end do end do -end subroutine GRHydro_HLLEGeneralM +end subroutine GRHydro_HLLEM + + /*@@ + @routine GRHydro_HLLE_TracerM + @date Aug 30, 2010 + @author Joshua Faber, Scott Noble, Bruno Mundim, Ian Hawke + @desc + HLLE just for the tracer. + @enddesc + @calls + @calledby + @history + + @endhistory +@@*/ -subroutine GRHydro_HLLE_TracerGeneralM(CCTK_ARGUMENTS) +subroutine GRHydro_HLLE_TracerM(CCTK_ARGUMENTS) USE GRHydro_EigenproblemM @@ -467,28 +443,36 @@ subroutine GRHydro_HLLE_TracerGeneralM(CCTK_ARGUMENTS) DECLARE_CCTK_ARGUMENTS DECLARE_CCTK_PARAMETERS - DECLARE_CCTK_FUNCTIONS - integer :: i, j, k, m + integer :: i, j, k, m CCTK_REAL, dimension(number_of_tracers) :: cons_p,cons_m,fplus,fminus,f1 CCTK_REAL, dimension(5) :: lamminus,lamplus CCTK_REAL, dimension(number_of_tracers) :: qdiff - CCTK_REAL, dimension(6) :: prim_p, prim_m + CCTK_REAL, dimension(7) :: prim_p, prim_m CCTK_REAL, dimension(3) :: mag_p, mag_m CCTK_REAL :: charmin, charmax, charpm,avg_alp,avg_det CCTK_REAL :: gxxh, gxyh, gxzh, gyyh, gyzh, gzzh, uxxh, uxyh, & uxzh, uyyh, uyzh, uzzh, avg_beta, usendh, alp_l, alp_r, & cs2_p, cs2_m, dpdeps_p, dpdeps_m CCTK_REAL :: b2p,b2m,vA2m,vA2p + + CCTK_INT :: type_bits, trivial, not_trivial - integer tadmor - - if(CCTK_EQUALS(HLLE_type,"Tadmor")) then - tadmor = 1 + if (flux_direction == 1) then + call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemX") + call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemX", & + &"trivial") + else if (flux_direction == 2) then + call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemY") + call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemY", & + &"trivial") + else if (flux_direction == 3) then + call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemZ") + call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemZ", & + &"trivial") else - tadmor = 0 - endif - + call CCTK_WARN(0, "Flux direction not x,y,z") + end if do k = GRHydro_stencil, cctk_lsh(3) - GRHydro_stencil do j = GRHydro_stencil, cctk_lsh(2) - GRHydro_stencil @@ -523,21 +507,17 @@ subroutine GRHydro_HLLE_TracerGeneralM(CCTK_ARGUMENTS) prim_p(3) = velyplus(i,j,k) prim_p(4) = velzplus(i,j,k) prim_p(5) = epsplus(i,j,k) + prim_p(6) = pressplus(i,j,k) + prim_p(7) = w_lorentzplus(i,j,k) prim_m(1) = rhominus(i+xoffset,j+yoffset,k+zoffset) prim_m(2) = velxminus(i+xoffset,j+yoffset,k+zoffset) prim_m(3) = velyminus(i+xoffset,j+yoffset,k+zoffset) prim_m(4) = velzminus(i+xoffset,j+yoffset,k+zoffset) prim_m(5) = epsminus(i+xoffset,j+yoffset,k+zoffset) + prim_m(6) = pressminus(i+xoffset,j+yoffset,k+zoffset) + prim_m(7) = w_lorentzminus(i+xoffset,j+yoffset,k+zoffset) - prim_p(6) = pressplus(i,j,k) - cs2_p = eos_cs2_p(i,j,k) - dpdeps_p = eos_dpdeps_p(i,j,k) - - prim_m(6) = pressminus(i+xoffset,j+yoffset,k+zoffset) - cs2_m = eos_cs2_m(i+xoffset,j+yoffset,k+zoffset) - dpdeps_m = eos_dpdeps_m(i+xoffset,j+yoffset,k+zoffset) - !!$ Calculate various metric terms here. !!$ Note also need the average of the lapse at the !!$ left and right points. @@ -568,84 +548,77 @@ subroutine GRHydro_HLLE_TracerGeneralM(CCTK_ARGUMENTS) gyzh = 0.5d0 * (gyz(i+xoffset,j+yoffset,k+zoffset) + gyz(i,j,k)) gzzh = 0.5d0 * (gzz(i+xoffset,j+yoffset,k+zoffset) + gzz(i,j,k)) - avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh) + avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh) -!!$ If the Riemann problem is trivial, just calculate the fluxes from the -!!$ left state and skip to the next cell - call UpperMetric(uxxh, uxyh, uxzh, uyyh, uyzh, uzzh, & avg_det,gxxh, gxyh, gxzh, & gyyh, gyzh, gzzh) - + if (flux_direction == 1) then - usendh = uxxh + usendh = uxxh else if (flux_direction == 2) then - usendh = uyyh + usendh = uyyh else if (flux_direction == 3) then - usendh = uzzh + usendh = uzzh else - call CCTK_WARN(0, "Flux direction not x,y,z") + call CCTK_WARN(0, "Flux direction not x,y,z") end if !!$ b^2 = (1-v^2)B^2+(B dot v)^2 - b2p=(1.d0-DOTP2(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,prim_p(2),prim_p(3),prim_p(4)))* & - DOTP2(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,mag_p(1),mag_p(2),mag_p(3)) + & + b2p=DOTP2(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,mag_p(1),mag_p(2),mag_p(3))/prim_p(7)**2 + & (DOTP(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,prim_p(2),prim_p(3),prim_p(4),mag_p(1),mag_p(2),mag_p(3)))**2 - b2m=(1.d0-DOTP2(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,prim_m(2),prim_m(3),prim_m(4)))* & - DOTP2(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,mag_m(1),mag_m(2),mag_m(3)) + & + b2m=DOTP2(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,mag_m(1),mag_m(2),mag_m(3))/prim_m(7)**2 + & (DOTP(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,prim_m(2),prim_m(3),prim_m(4),mag_m(1),mag_m(2),mag_m(3)))**2 vA2p = b2p/(prim_p(1)*(1.0d0+prim_p(5))+prim_p(6)+b2p) vA2m = b2m/(prim_m(1)*(1.0d0+prim_m(5))+prim_m(6)+b2m) - + +!!$ Calculate the jumps in the conserved variables + + qdiff = cons_m - cons_p + !!$ Eigenvalues and fluxes either side of the cell interface - + if (flux_direction == 1) then - call eigenvalues_generalM(& - prim_m(2),prim_m(3),prim_m(4),cs2_m,vA2m, & - lamminus,& - gxxh,gxyh,gxzh,& - gyyh,gyzh,gzzh,& + call eigenvaluesM(GRHydro_eos_handle,& + prim_m(1),prim_m(2),prim_m(3),prim_m(4),prim_m(5),prim_m(7), & + cons_m(6),cons_m(7),cons_m(8),& + lamminus,gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,& usendh,avg_alp,avg_beta) - call eigenvalues_generalM(& - prim_p(2),prim_p(3),prim_p(4),cs2_p,vA2p, & - lamplus,& - gxxh,gxyh,gxzh,& - gyyh,gyzh,gzzh,& + call eigenvaluesM(GRHydro_eos_handle, & + prim_p(1),prim_p(2),prim_p(3),prim_p(4),prim_p(5),prim_p(7), & + cons_p(6),cons_p(7),cons_p(8),& + lamplus,gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,& usendh,avg_alp,avg_beta) fplus(:) = (velxplus(i,j,k) - avg_beta / avg_alp) * & cons_tracerplus(i,j,k,:) fminus(:) = (velxminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * & cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) else if (flux_direction == 2) then - call eigenvalues_generalM(& - prim_m(3),prim_m(4),prim_m(2),cs2_m,vA2m, & - lamminus,& - gyyh,gyzh,gxyh,& - gzzh,gxzh,gxxh,& + call eigenvaluesM(GRHydro_eos_handle,& + prim_m(1),prim_m(3),prim_m(4),prim_m(2),prim_m(5),prim_m(7), & + cons_m(7),cons_m(8),cons_m(6),& + lamminus,gyyh,gyzh,gxyh,gzzh,gxzh,gxxh,& usendh,avg_alp,avg_beta) - call eigenvalues_generalM(& - prim_p(3),prim_p(4),prim_p(2),cs2_p,vA2p, & - lamplus,& - gyyh,gyzh,gxyh,& - gzzh,gxzh,gxxh,& + call eigenvaluesM(GRHydro_eos_handle, & + prim_p(1),prim_p(3),prim_p(4),prim_p(2),prim_p(5),prim_p(7), & + cons_p(7),cons_p(8),cons_p(6),& + lamplus,gyyh,gyzh,gxyh,gzzh,gxzh,gxxh,& usendh,avg_alp,avg_beta) fplus(:) = (velyplus(i,j,k) - avg_beta / avg_alp) * & cons_tracerplus(i,j,k,:) fminus(:) = (velyminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * & cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) else if (flux_direction == 3) then - call eigenvalues_generalM(& - prim_m(4),prim_m(2),prim_m(3),cs2_m,vA2m, & - lamminus,& - gzzh,gxzh,gyzh,& - gxxh,gxyh,gyyh,& + call eigenvaluesM(GRHydro_eos_handle,& + prim_m(1),prim_m(4),prim_m(2),prim_m(3),prim_m(5),prim_m(7), & + cons_m(8),cons_m(6),cons_m(7),& + lamminus,gzzh,gxzh,gyzh,gxxh,gxyh,gyyh,& usendh,avg_alp,avg_beta) - call eigenvalues_generalM(& - prim_p(4),prim_p(2),prim_p(3),cs2_p,vA2p, & - lamplus,& - gzzh,gxzh,gyzh,& - gxxh,gxyh,gyyh,& + call eigenvaluesM(GRHydro_eos_handle,& + prim_p(1),prim_p(4),prim_p(2),prim_p(3),prim_p(5),prim_p(7), & + cons_p(8),cons_p(6),cons_p(7),& + lamplus,gzzh,gxzh,gyzh,gxxh,gxyh,gyyh,& usendh,avg_alp,avg_beta) fplus(:) = (velzplus(i,j,k) - avg_beta / avg_alp) * & cons_tracerplus(i,j,k,:) @@ -654,57 +627,43 @@ subroutine GRHydro_HLLE_TracerGeneralM(CCTK_ARGUMENTS) else call CCTK_WARN(0, "Flux direction not x,y,z") end if - - if(tadmor.eq.0) then - + !!$ Find minimum and maximum wavespeeds + + charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), & + lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& + lamminus(4),lamminus(5)) + + charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), & + lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& + lamminus(4),lamminus(5)) + + charpm = charmax - charmin + +!!$ Calculate flux by standard formula + + do m = 1,number_of_tracers - charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), & - lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& - lamminus(4),lamminus(5)) + qdiff(m) = cons_m(m) - cons_p(m) - charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), & - lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& - lamminus(4),lamminus(5)) - - - charpm = charmax - charmin - -!!$ Calculate flux by standard formula - - do m = 1,number_of_tracers - - qdiff(m) = cons_m(m) - cons_p(m) - - f1(m) = (charmax * fplus(m) - charmin * fminus(m) + & - charmax * charmin * qdiff(m)) / charpm - end do - - else - ! Tadmor's semi-descrite scheme: JcP 160, 241 (2000) - - charmax = max(abs(lamplus(1)), abs(lamplus(2)), abs(lamplus(3)), & - abs(lamplus(4)),abs(lamplus(5)),abs(lamminus(1)),abs(lamminus(2)), & - abs(lamminus(3)),abs(lamminus(4)),abs(lamminus(5))) - - do m = 1,number_of_tracers - - qdiff(m) = cons_m(m) - cons_p(m) - - f1(m) = 0.5d0 * (fplus(m) + fminus(m)) - 0.5d0*charmax* & - qdiff(m) - - end do - - - end if - - - cons_tracerflux(i,j,k,:) = f1(:) - - end do - end do - end do - -end subroutine GRHydro_HLLE_TracerGeneralM + f1(m) = (charmax * fplus(m) - charmin * fminus(m) + & + charmax * charmin * qdiff(m)) / charpm + + end do + + cons_tracerflux(i, j, k,:) = f1(:) +!!$ +!!$ if ( ((flux_direction.eq.3).and.(i.eq.4).and.(j.eq.4)).or.& +!!$ ((flux_direction.eq.2).and.(i.eq.4).and.(k.eq.4)).or.& +!!$ ((flux_direction.eq.1).and.(j.eq.4).and.(k.eq.4))& +!!$ ) then +!!$ write(*,*) flux_direction, i, j, k, f1(1), cons_m(1), cons_p(1) +!!$ end if + + end do + end do +end do + + +end subroutine GRHydro_HLLE_TracerM diff --git a/src/GRHydro_HLLEPoly.F90 b/src/GRHydro_HLLEPoly.F90 deleted file mode 100644 index bd976e1..0000000 --- a/src/GRHydro_HLLEPoly.F90 +++ /dev/null @@ -1,621 +0,0 @@ - /*@@ - @file GRHydro_HLLE.F90 - @date Sat Jan 26 01:40:14 2002 - @author Ian Hawke, Pedro Montero, Toni Font - @desc - The HLLE solver. Called from the wrapper function, so works in - all directions. - @enddesc - @@*/ - -#include "cctk.h" -#include "cctk_Parameters.h" -#include "cctk_Arguments.h" -#include "cctk_Functions.h" - -#include "GRHydro_Macros.h" -#include "SpaceMask.h" - - /*@@ - @routine GRHydro_HLLE - @date Sat Jan 26 01:41:02 2002 - @author Ian Hawke, Pedro Montero, Toni Font - @desc - The HLLE solver. Sufficiently simple that its just one big routine. - @enddesc - @calls - @calledby - @history - Altered from Cactus 3 routines originally written by Toni Font. - @endhistory - -@@*/ - -subroutine GRHydro_HLLE(CCTK_ARGUMENTS) - USE GRHydro_Eigenproblem - - implicit none - - DECLARE_CCTK_ARGUMENTS - DECLARE_CCTK_PARAMETERS - - integer :: i, j, k, m - CCTK_REAL, dimension(5) :: consp,consm_i,fplus,fminus,lamplus - CCTK_REAL, dimension(5) :: f1,lamminus - CCTK_REAL, dimension(5) :: qdiff - CCTK_REAL :: charmin, charmax, charpm,avg_alp,avg_det - CCTK_REAL :: gxxh, gxyh, gxzh, gyyh, gyzh, gzzh, uxxh, uxyh, & - uxzh, uyyh, uyzh, uzzh, avg_beta, usendh, alp_l, alp_r - CCTK_REAL :: xtemp - - CCTK_INT :: type_bits, trivial, not_trivial - - if (flux_direction == 1) then - call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemX") - call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemX", & - &"trivial") - else if (flux_direction == 2) then - call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemY") - call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemY", & - &"trivial") - else if (flux_direction == 3) then - call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemZ") - call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemZ", & - &"trivial") - else - call CCTK_WARN(0, "Flux direction not x,y,z") - end if - - do k = GRHydro_stencil, cctk_lsh(3) - GRHydro_stencil - do j = GRHydro_stencil, cctk_lsh(2) - GRHydro_stencil - do i = GRHydro_stencil, cctk_lsh(1) - GRHydro_stencil - - f1 = 0.d0 - lamminus = 0.d0 - lamplus = 0.d0 - consp = 0.d0 - consm_i = 0.d0 - fplus = 0.d0 - fminus = 0.d0 - qdiff = 0.d0 - -!!$ Set the left (p for plus) and right (m_i for minus, i+1) states - - consp(1) = densplus(i,j,k) - consp(2) = sxplus(i,j,k) - consp(3) = syplus(i,j,k) - consp(4) = szplus(i,j,k) - consp(5) = tauplus(i,j,k) - - consm_i(1) = densminus(i+xoffset,j+yoffset,k+zoffset) - consm_i(2) = sxminus(i+xoffset,j+yoffset,k+zoffset) - consm_i(3) = syminus(i+xoffset,j+yoffset,k+zoffset) - consm_i(4) = szminus(i+xoffset,j+yoffset,k+zoffset) - consm_i(5) = tauminus(i+xoffset,j+yoffset,k+zoffset) - -!!$ Calculate various metric terms here. -!!$ Note also need the average of the lapse at the -!!$ left and right points. - - if (shift_state .ne. 0) then - if (flux_direction == 1) then - avg_beta = 0.5d0 * (betax(i+xoffset,j+yoffset,k+zoffset) + & - betax(i,j,k)) - else if (flux_direction == 2) then - avg_beta = 0.5d0 * (betay(i+xoffset,j+yoffset,k+zoffset) + & - betay(i,j,k)) - else if (flux_direction == 3) then - avg_beta = 0.5d0 * (betaz(i+xoffset,j+yoffset,k+zoffset) + & - betaz(i,j,k)) - else - call CCTK_WARN(0, "Flux direction not x,y,z") - end if - else - avg_beta = 0.d0 - end if - - avg_alp = 0.5 * (alp(i,j,k) + alp(i+xoffset,j+yoffset,k+zoffset)) - - gxxh = 0.5d0 * (gxx(i+xoffset,j+yoffset,k+zoffset) + gxx(i,j,k)) - gxyh = 0.5d0 * (gxy(i+xoffset,j+yoffset,k+zoffset) + gxy(i,j,k)) - gxzh = 0.5d0 * (gxz(i+xoffset,j+yoffset,k+zoffset) + gxz(i,j,k)) - gyyh = 0.5d0 * (gyy(i+xoffset,j+yoffset,k+zoffset) + gyy(i,j,k)) - gyzh = 0.5d0 * (gyz(i+xoffset,j+yoffset,k+zoffset) + gyz(i,j,k)) - gzzh = 0.5d0 * (gzz(i+xoffset,j+yoffset,k+zoffset) + gzz(i,j,k)) - - avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,\ - gyyh,gyzh,gzzh) - -!!$ If the Riemann problem is trivial, just calculate the fluxes from the -!!$ left state and skip to the next cell - - if (SpaceMask_CheckStateBitsF90(space_mask, i, j, k, type_bits, trivial)) then - - if (flux_direction == 1) then - call num_x_flux(consp(1),consp(2),consp(3),consp(4),consp(5),& - f1(1),f1(2),f1(3),& - f1(4),f1(5),& - velxplus(i,j,k),pressplus(i,j,k),& - avg_det,avg_alp,avg_beta) - else if (flux_direction == 2) then - call num_x_flux(consp(1),consp(3),consp(4),consp(2),consp(5),& - f1(1),f1(3),f1(4),& - f1(2),f1(5),& - velyplus(i,j,k),pressplus(i,j,k),& - avg_det,avg_alp,avg_beta) - else if (flux_direction == 3) then - call num_x_flux(consp(1),consp(4),consp(2),consp(3),consp(5),& - f1(1),f1(4),f1(2),& - f1(3),f1(5),& - velzplus(i,j,k),pressplus(i,j,k),& - avg_det,avg_alp,avg_beta) - else - call CCTK_WARN(0, "Flux direction not x,y,z") - end if - - else !!! The end of this branch is right at the bottom of the routine - - call UpperMetric(uxxh, uxyh, uxzh, uyyh, uyzh, uzzh, & - avg_det,gxxh, gxyh, gxzh, & - gyyh, gyzh, gzzh) - - if (flux_direction == 1) then - usendh = uxxh - else if (flux_direction == 2) then - usendh = uyyh - else if (flux_direction == 3) then - usendh = uzzh - else - call CCTK_WARN(0, "Flux direction not x,y,z") - end if - -!!$ Calculate the jumps in the conserved variables - - qdiff(1) = consm_i(1) - consp(1) - qdiff(2) = consm_i(2) - consp(2) - qdiff(3) = consm_i(3) - consp(3) - qdiff(4) = consm_i(4) - consp(4) - qdiff(5) = consm_i(5) - consp(5) - -!!$ Eigenvalues and fluxes either side of the cell interface - - if (flux_direction == 1) then - if(evolve_temper.ne.1) then - call eigenvalues(GRHydro_eos_handle,& - rhominus(i+xoffset,j+yoffset,k+zoffset),& - velxminus(i+xoffset,j+yoffset,k+zoffset),& - velyminus(i+xoffset,j+yoffset,k+zoffset),& - velzminus(i+xoffset,j+yoffset,k+zoffset),& - epsminus(i+xoffset,j+yoffset,k+zoffset),& - w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& - lamminus,gxxh,gxyh,gxzh,gyyh,& - gyzh,gzzh,& - usendh,avg_alp,avg_beta) - call eigenvalues(GRHydro_eos_handle,rhoplus(i,j,k),& - velxplus(i,j,k),velyplus(i,j,k),& - velzplus(i,j,k),epsplus(i,j,k),w_lorentzplus(i,j,k),& - lamplus,gxxh,gxyh,gxzh,gyyh,& - gyzh,gzzh,& - usendh,avg_alp,avg_beta) - else - xtemp = temperature(i,j,k) - call eigenvalues_hot(GRHydro_eos_handle,i,j,k,& - rhominus(i+xoffset,j+yoffset,k+zoffset),& - velxminus(i+xoffset,j+yoffset,k+zoffset),& - velyminus(i+xoffset,j+yoffset,k+zoffset),& - velzminus(i+xoffset,j+yoffset,k+zoffset),& - epsminus(i+xoffset,j+yoffset,k+zoffset),& - xtemp,& - y_e_minus(i+xoffset,j+yoffset,k+zoffset),& - w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& - lamminus,gxxh,gxyh,gxzh,gyyh,& - gyzh,gzzh,& - usendh,avg_alp,avg_beta) - xtemp = temperature(i,j,k) - call eigenvalues_hot(GRHydro_eos_handle,i,j,k,& - rhoplus(i,j,k),& - velxplus(i,j,k),velyplus(i,j,k),& - velzplus(i,j,k),epsplus(i,j,k), & - xtemp,y_e_plus(i,j,k),& - w_lorentzplus(i,j,k),& - lamplus,gxxh,gxyh,gxzh,gyyh,& - gyzh,gzzh,& - usendh,avg_alp,avg_beta) - endif - call num_x_flux(consp(1),consp(2),consp(3),consp(4),consp(5),& - fplus(1),fplus(2),fplus(3),fplus(4),& - fplus(5),velxplus(i,j,k),pressplus(i,j,k),& - avg_det,avg_alp,avg_beta) - call num_x_flux(consm_i(1),consm_i(2),consm_i(3),& - consm_i(4),consm_i(5),fminus(1),fminus(2),fminus(3),& - fminus(4), fminus(5),& - velxminus(i+xoffset,j+yoffset,k+zoffset),& - pressminus(i+xoffset,j+yoffset,k+zoffset),& - avg_det,avg_alp,avg_beta) - else if (flux_direction == 2) then - if(evolve_temper.ne.1) then - call eigenvalues(GRHydro_eos_handle,& - rhominus(i+xoffset,j+yoffset,k+zoffset),& - velyminus(i+xoffset,j+yoffset,k+zoffset),& - velzminus(i+xoffset,j+yoffset,k+zoffset),& - velxminus(i+xoffset,j+yoffset,k+zoffset),& - epsminus(i+xoffset,j+yoffset,k+zoffset),& - w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& - lamminus,gyyh,gyzh,gxyh,gzzh,& - gxzh,gxxh,& - usendh,avg_alp,avg_beta) - call eigenvalues(GRHydro_eos_handle,rhoplus(i,j,k),& - velyplus(i,j,k),velzplus(i,j,k),& - velxplus(i,j,k),epsplus(i,j,k),w_lorentzplus(i,j,k),& - lamplus,gyyh,gyzh,gxyh,gzzh,& - gxzh,gxxh,& - usendh,avg_alp,avg_beta) - else - xtemp = temperature(i,j,k) - call eigenvalues_hot(GRHydro_eos_handle,i,j,k,& - rhominus(i+xoffset,j+yoffset,k+zoffset),& - velyminus(i+xoffset,j+yoffset,k+zoffset),& - velzminus(i+xoffset,j+yoffset,k+zoffset),& - velxminus(i+xoffset,j+yoffset,k+zoffset),& - epsminus(i+xoffset,j+yoffset,k+zoffset),& - xtemp,& - y_e_minus(i+xoffset,j+yoffset,k+zoffset),& - w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& - lamminus,gyyh,gyzh,gxyh,gzzh,& - gxzh,gxxh,& - usendh,avg_alp,avg_beta) - xtemp = temperature(i,j,k) - call eigenvalues_hot(GRHydro_eos_handle,i,j,k,& - rhoplus(i,j,k),& - velyplus(i,j,k),velzplus(i,j,k),& - velxplus(i,j,k),epsplus(i,j,k),& - xtemp,y_e_plus(i,j,k),& - w_lorentzplus(i,j,k),& - lamplus,gyyh,gyzh,gxyh,gzzh,& - gxzh,gxxh,& - usendh,avg_alp,avg_beta) - endif - call num_x_flux(consp(1),consp(3),consp(4),consp(2),consp(5),& - fplus(1),fplus(3),fplus(4),fplus(2),& - fplus(5),velyplus(i,j,k),pressplus(i,j,k),& - avg_det,avg_alp,avg_beta) - call num_x_flux(consm_i(1),consm_i(3),consm_i(4),& - consm_i(2),consm_i(5),fminus(1),fminus(3),fminus(4),& - fminus(2), fminus(5),& - velyminus(i+xoffset,j+yoffset,k+zoffset),& - pressminus(i+xoffset,j+yoffset,k+zoffset),& - avg_det,avg_alp,avg_beta) - else if (flux_direction == 3) then - if(evolve_temper.ne.1) then - call eigenvalues(GRHydro_eos_handle,& - rhominus(i+xoffset,j+yoffset,k+zoffset),& - velzminus(i+xoffset,j+yoffset,k+zoffset),& - velxminus(i+xoffset,j+yoffset,k+zoffset),& - velyminus(i+xoffset,j+yoffset,k+zoffset),& - epsminus(i+xoffset,j+yoffset,k+zoffset),& - w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& - lamminus,gzzh,gxzh,gyzh,& - gxxh,gxyh,gyyh,& - usendh,avg_alp,avg_beta) - call eigenvalues(GRHydro_eos_handle,rhoplus(i,j,k),& - velzplus(i,j,k),velxplus(i,j,k),& - velyplus(i,j,k),epsplus(i,j,k),w_lorentzplus(i,j,k),& - lamplus,gzzh,gxzh,gyzh,& - gxxh,gxyh,gyyh,& - usendh,avg_alp,avg_beta) - else - xtemp = temperature(i,j,k) - call eigenvalues_hot(GRHydro_eos_handle,i,j,k,& - rhominus(i+xoffset,j+yoffset,k+zoffset),& - velzminus(i+xoffset,j+yoffset,k+zoffset),& - velxminus(i+xoffset,j+yoffset,k+zoffset),& - velyminus(i+xoffset,j+yoffset,k+zoffset),& - epsminus(i+xoffset,j+yoffset,k+zoffset),& - xtemp,y_e_minus(i+xoffset,j+yoffset,k+zoffset),& - w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& - lamminus,gzzh,gxzh,gyzh,& - gxxh,gxyh,gyyh,& - usendh,avg_alp,avg_beta) - xtemp = temperature(i,j,k) - call eigenvalues_hot(GRHydro_eos_handle,i,j,k,& - rhoplus(i,j,k),& - velzplus(i,j,k),velxplus(i,j,k),& - velyplus(i,j,k),epsplus(i,j,k),& - xtemp,y_e_plus(i,j,k),& - w_lorentzplus(i,j,k),& - lamplus,gzzh,gxzh,gyzh,& - gxxh,gxyh,gyyh,& - usendh,avg_alp,avg_beta) - endif - call num_x_flux(consp(1),consp(4),consp(2),consp(3),consp(5),& - fplus(1),fplus(4),fplus(2),fplus(3),& - fplus(5),velzplus(i,j,k),pressplus(i,j,k),avg_det,& - avg_alp,avg_beta) - call num_x_flux(consm_i(1),consm_i(4),consm_i(2),& - consm_i(3),consm_i(5),fminus(1),fminus(4),fminus(2),& - fminus(3), fminus(5),& - velzminus(i+xoffset,j+yoffset,k+zoffset),& - pressminus(i+xoffset,j+yoffset,k+zoffset),& - avg_det,avg_alp,avg_beta) - else - call CCTK_WARN(0, "Flux direction not x,y,z") - end if - -!!$ Find minimum and maximum wavespeeds - - charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), & - lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& - lamminus(4),lamminus(5)) - - charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), & - lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& - lamminus(4),lamminus(5)) - - charpm = charmax - charmin - -!!$ Calculate flux by standard formula - - do m = 1,5 - - qdiff(m) = consm_i(m) - consp(m) - - f1(m) = (charmax * fplus(m) - charmin * fminus(m) + & - charmax * charmin * qdiff(m)) / charpm - - end do - - end if !!! The end of the SpaceMask check for a trivial RP. - - densflux(i, j, k) = f1(1) - sxflux(i, j, k) = f1(2) - syflux(i, j, k) = f1(3) - szflux(i, j, k) = f1(4) - tauflux(i, j, k) = f1(5) - - if(evolve_Y_e.ne.0) then - if (densflux(i, j, k) > 0.d0) then - Y_e_con_flux(i, j, k) = & - Y_e_plus(i, j, k) * & - densflux(i, j, k) - else - Y_e_con_flux(i, j, k) = & - Y_e_minus(i + xoffset, j + yoffset, k + zoffset) * & - densflux(i, j, k) - endif - endif - - end do - end do - end do - - -end subroutine GRHydro_HLLE - - /*@@ - @routine GRHydro_HLLE_Tracer - @date Mon Mar 8 13:47:13 2004 - @author Ian Hawke - @desc - HLLE just for the tracer. - @enddesc - @calls - @calledby - @history - - @endhistory - -@@*/ - -subroutine GRHydro_HLLE_Tracer(CCTK_ARGUMENTS) - - USE GRHydro_Eigenproblem - - implicit none - - DECLARE_CCTK_ARGUMENTS - DECLARE_CCTK_PARAMETERS - - integer :: i, j, k, m - CCTK_REAL, dimension(number_of_tracers) :: consp,consm_i,fplus,fminus,f1 - CCTK_REAL, dimension(5) :: lamminus,lamplus - CCTK_REAL, dimension(number_of_tracers) :: qdiff - CCTK_REAL :: charmin, charmax, charpm,avg_alp,avg_det - CCTK_REAL :: gxxh, gxyh, gxzh, gyyh, gyzh, gzzh, uxxh, uxyh, & - uxzh, uyyh, uyzh, uzzh, avg_beta, usendh, alp_l, alp_r - - CCTK_INT :: type_bits, trivial, not_trivial - - if (flux_direction == 1) then - call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemX") - call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemX", & - &"trivial") - else if (flux_direction == 2) then - call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemY") - call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemY", & - &"trivial") - else if (flux_direction == 3) then - call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemZ") - call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemZ", & - &"trivial") - else - call CCTK_WARN(0, "Flux direction not x,y,z") - end if - - do k = GRHydro_stencil, cctk_lsh(3) - GRHydro_stencil - do j = GRHydro_stencil, cctk_lsh(2) - GRHydro_stencil - do i = GRHydro_stencil, cctk_lsh(1) - GRHydro_stencil - - f1 = 0.d0 - lamminus = 0.d0 - lamplus = 0.d0 - consp = 0.d0 - consm_i = 0.d0 - fplus = 0.d0 - fminus = 0.d0 - qdiff = 0.d0 - -!!$ Set the left (p for plus) and right (m_i for minus, i+1) states - - do m=1,number_of_tracers - consp(m) = cons_tracerplus(i,j,k,m) - consm_i(m) = cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,m) - enddo -!!$ Calculate various metric terms here. -!!$ Note also need the average of the lapse at the -!!$ left and right points. - - if (shift_state .ne. 0) then - if (flux_direction == 1) then - avg_beta = 0.5d0 * (betax(i+xoffset,j+yoffset,k+zoffset) + & - betax(i,j,k)) - else if (flux_direction == 2) then - avg_beta = 0.5d0 * (betay(i+xoffset,j+yoffset,k+zoffset) + & - betay(i,j,k)) - else if (flux_direction == 3) then - avg_beta = 0.5d0 * (betaz(i+xoffset,j+yoffset,k+zoffset) + & - betaz(i,j,k)) - else - call CCTK_WARN(0, "Flux direction not x,y,z") - end if - else - avg_beta = 0.d0 - end if - - avg_alp = 0.5 * (alp(i,j,k) + alp(i+xoffset,j+yoffset,k+zoffset)) - - gxxh = 0.5d0 * (gxx(i+xoffset,j+yoffset,k+zoffset) + gxx(i,j,k)) - gxyh = 0.5d0 * (gxy(i+xoffset,j+yoffset,k+zoffset) + gxy(i,j,k)) - gxzh = 0.5d0 * (gxz(i+xoffset,j+yoffset,k+zoffset) + gxz(i,j,k)) - gyyh = 0.5d0 * (gyy(i+xoffset,j+yoffset,k+zoffset) + gyy(i,j,k)) - gyzh = 0.5d0 * (gyz(i+xoffset,j+yoffset,k+zoffset) + gyz(i,j,k)) - gzzh = 0.5d0 * (gzz(i+xoffset,j+yoffset,k+zoffset) + gzz(i,j,k)) - - avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,\ - gyyh,gyzh,gzzh) - - call UpperMetric(uxxh, uxyh, uxzh, uyyh, uyzh, uzzh, & - avg_det,gxxh, gxyh, gxzh, & - gyyh, gyzh, gzzh) - - if (flux_direction == 1) then - usendh = uxxh - else if (flux_direction == 2) then - usendh = uyyh - else if (flux_direction == 3) then - usendh = uzzh - else - call CCTK_WARN(0, "Flux direction not x,y,z") - end if - -!!$ Calculate the jumps in the conserved variables - - qdiff = consm_i - consp - -!!$ Eigenvalues and fluxes either side of the cell interface - - if (flux_direction == 1) then - call eigenvalues(GRHydro_eos_handle,& - rhominus(i+xoffset,j+yoffset,k+zoffset),& - velxminus(i+xoffset,j+yoffset,k+zoffset),& - velyminus(i+xoffset,j+yoffset,k+zoffset),& - velzminus(i+xoffset,j+yoffset,k+zoffset),& - epsminus(i+xoffset,j+yoffset,k+zoffset),& - w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& - lamminus,gxxh,gxyh,gxzh,gyyh,& - gyzh,gzzh,& - usendh,avg_alp,avg_beta) - call eigenvalues(GRHydro_eos_handle,rhoplus(i,j,k),& - velxplus(i,j,k),velyplus(i,j,k),& - velzplus(i,j,k),epsplus(i,j,k),w_lorentzplus(i,j,k),& - lamplus,gxxh,gxyh,gxzh,gyyh,& - gyzh,gzzh,& - usendh,avg_alp,avg_beta) - fplus(:) = (velxplus(i,j,k) - avg_beta / avg_alp) * & - cons_tracerplus(i,j,k,:) - fminus(:) = (velxminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * & - cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) - else if (flux_direction == 2) then - call eigenvalues(GRHydro_eos_handle,& - rhominus(i+xoffset,j+yoffset,k+zoffset),& - velyminus(i+xoffset,j+yoffset,k+zoffset),& - velzminus(i+xoffset,j+yoffset,k+zoffset),& - velxminus(i+xoffset,j+yoffset,k+zoffset),& - epsminus(i+xoffset,j+yoffset,k+zoffset),& - w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& - lamminus,gyyh,gyzh,gxyh,gzzh,& - gxzh,gxxh,& - usendh,avg_alp,avg_beta) - call eigenvalues(GRHydro_eos_handle,rhoplus(i,j,k),& - velyplus(i,j,k),velzplus(i,j,k),& - velxplus(i,j,k),epsplus(i,j,k),w_lorentzplus(i,j,k),& - lamplus,gyyh,gyzh,gxyh,gzzh,& - gxzh,gxxh,& - usendh,avg_alp,avg_beta) - fplus(:) = (velyplus(i,j,k) - avg_beta / avg_alp) * & - cons_tracerplus(i,j,k,:) - fminus(:) = (velyminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * & - cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) - else if (flux_direction == 3) then - call eigenvalues(GRHydro_eos_handle,& - rhominus(i+xoffset,j+yoffset,k+zoffset),& - velzminus(i+xoffset,j+yoffset,k+zoffset),& - velxminus(i+xoffset,j+yoffset,k+zoffset),& - velyminus(i+xoffset,j+yoffset,k+zoffset),& - epsminus(i+xoffset,j+yoffset,k+zoffset),& - w_lorentzminus(i+xoffset,j+yoffset,k+zoffset),& - lamminus,gzzh,gxzh,gyzh,& - gxxh,gxyh,gyyh,& - usendh,avg_alp,avg_beta) - call eigenvalues(GRHydro_eos_handle,rhoplus(i,j,k),& - velzplus(i,j,k),velxplus(i,j,k),& - velyplus(i,j,k),epsplus(i,j,k),w_lorentzplus(i,j,k),& - lamplus,gzzh,gxzh,gyzh,& - gxxh,gxyh,gyyh,& - usendh,avg_alp,avg_beta) - fplus(:) = (velzplus(i,j,k) - avg_beta / avg_alp) * & - cons_tracerplus(i,j,k,:) - fminus(:) = (velzminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * & - cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) - else - call CCTK_WARN(0, "Flux direction not x,y,z") - end if - -!!$ Find minimum and maximum wavespeeds - - charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), & - lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& - lamminus(4),lamminus(5)) - - charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), & - lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& - lamminus(4),lamminus(5)) - - charpm = charmax - charmin - -!!$ Calculate flux by standard formula - - do m = 1,number_of_tracers - - qdiff(m) = consm_i(m) - consp(m) - - f1(m) = (charmax * fplus(m) - charmin * fminus(m) + & - charmax * charmin * qdiff(m)) / charpm - - end do - - cons_tracerflux(i, j, k,:) = f1(:) -!!$ -!!$ if ( ((flux_direction.eq.3).and.(i.eq.4).and.(j.eq.4)).or.& -!!$ ((flux_direction.eq.2).and.(i.eq.4).and.(k.eq.4)).or.& -!!$ ((flux_direction.eq.1).and.(j.eq.4).and.(k.eq.4))& -!!$ ) then -!!$ write(*,*) flux_direction, i, j, k, f1(1), consm_i(1), consp(1) -!!$ end if - - end do - end do - end do - - -end subroutine GRHydro_HLLE_Tracer - diff --git a/src/GRHydro_HLLE_EOSG.F90 b/src/GRHydro_HLLE_EOSG.F90 new file mode 100644 index 0000000..7a3f5f8 --- /dev/null +++ b/src/GRHydro_HLLE_EOSG.F90 @@ -0,0 +1,576 @@ + /*@@ + @file GRHydro_HLLE.F90 + @date Sat Jan 26 01:40:14 2002 + @author Ian Hawke, Pedro Montero, Toni Font + @desc + The HLLE solver. Called from the wrapper function, so works in + all directions. + @enddesc + @@*/ + +#include "cctk.h" +#include "cctk_Parameters.h" +#include "cctk_Arguments.h" +#include "cctk_Functions.h" +#include "GRHydro_Macros.h" +#include "SpaceMask.h" + + /*@@ + @routine GRHydro_HLLEGeneral + @date Sat Jan 26 01:41:02 2002 + @author Ian Hawke, Pedro Montero, Toni Font + @desc + The HLLE solver. Sufficiently simple that its just one big routine. + Rewritten for the new EOS interface. + @enddesc + @calls + @calledby + @history + Altered from Cactus 3 routines originally written by Toni Font. + @endhistory + +@@*/ + +subroutine GRHydro_HLLEGeneral(CCTK_ARGUMENTS) + + USE GRHydro_Eigenproblem + implicit none + + DECLARE_CCTK_ARGUMENTS + DECLARE_CCTK_PARAMETERS + DECLARE_CCTK_FUNCTIONS + + integer :: i, j, k, m + CCTK_REAL, dimension(5) :: cons_p,cons_m,fplus,fminus,lamplus + CCTK_REAL, dimension(5) :: f1,lamminus + CCTK_REAL, dimension(5) :: qdiff + CCTK_REAL, dimension(6) :: prim_p, prim_m + CCTK_REAL :: charmin, charmax, charpm,avg_alp,avg_det + CCTK_REAL :: gxxh, gxyh, gxzh, gyyh, gyzh, gzzh, uxxh, uxyh, & + uxzh, uyyh, uyzh, uzzh, avg_beta, usendh, alp_l, alp_r, & + cs2_p, cs2_m, dpdeps_p, dpdeps_m + + CCTK_INT :: type_bits, trivial, not_trivial + + integer tadmor + + if(CCTK_EQUALS(HLLE_type,"Tadmor")) then + tadmor = 1 + else + tadmor = 0 + endif + + + if (flux_direction == 1) then + call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemX") + call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemX", & + &"trivial") + else if (flux_direction == 2) then + call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemY") + call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemY", & + &"trivial") + else if (flux_direction == 3) then + call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemZ") + call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemZ", & + &"trivial") + else + call CCTK_WARN(0, "Flux direction not x,y,z") + end if + + do k = GRHydro_stencil, cctk_lsh(3) - GRHydro_stencil + do j = GRHydro_stencil, cctk_lsh(2) - GRHydro_stencil + do i = GRHydro_stencil, cctk_lsh(1) - GRHydro_stencil + + f1 = 0.d0 + lamminus = 0.d0 + lamplus = 0.d0 + cons_p = 0.d0 + cons_m = 0.d0 + fplus = 0.d0 + fminus = 0.d0 + qdiff = 0.d0 + +!!$ Set the left (p for plus) and right (m_i for minus, i+1) states + + cons_p(1) = densplus(i,j,k) + cons_p(2) = sxplus(i,j,k) + cons_p(3) = syplus(i,j,k) + cons_p(4) = szplus(i,j,k) + cons_p(5) = tauplus(i,j,k) + + cons_m(1) = densminus(i+xoffset,j+yoffset,k+zoffset) + cons_m(2) = sxminus(i+xoffset,j+yoffset,k+zoffset) + cons_m(3) = syminus(i+xoffset,j+yoffset,k+zoffset) + cons_m(4) = szminus(i+xoffset,j+yoffset,k+zoffset) + cons_m(5) = tauminus(i+xoffset,j+yoffset,k+zoffset) + + prim_p(1) = rhoplus(i,j,k) + prim_p(2) = velxplus(i,j,k) + prim_p(3) = velyplus(i,j,k) + prim_p(4) = velzplus(i,j,k) + prim_p(5) = epsplus(i,j,k) + + prim_m(1) = rhominus(i+xoffset,j+yoffset,k+zoffset) + prim_m(2) = velxminus(i+xoffset,j+yoffset,k+zoffset) + prim_m(3) = velyminus(i+xoffset,j+yoffset,k+zoffset) + prim_m(4) = velzminus(i+xoffset,j+yoffset,k+zoffset) + prim_m(5) = epsminus(i+xoffset,j+yoffset,k+zoffset) + + prim_p(6) = pressplus(i,j,k) + cs2_p = eos_cs2_p(i,j,k) + dpdeps_p = eos_dpdeps_p(i,j,k) + + prim_m(6) = pressminus(i+xoffset,j+yoffset,k+zoffset) + cs2_m = eos_cs2_m(i+xoffset,j+yoffset,k+zoffset) + dpdeps_m = eos_dpdeps_m(i+xoffset,j+yoffset,k+zoffset) + +!!$ Calculate various metric terms here. +!!$ Note also need the average of the lapse at the +!!$ left and right points. + + if (shift_state .ne. 0) then + if (flux_direction == 1) then + avg_beta = 0.5d0 * (betax(i+xoffset,j+yoffset,k+zoffset) + & + betax(i,j,k)) + else if (flux_direction == 2) then + avg_beta = 0.5d0 * (betay(i+xoffset,j+yoffset,k+zoffset) + & + betay(i,j,k)) + else if (flux_direction == 3) then + avg_beta = 0.5d0 * (betaz(i+xoffset,j+yoffset,k+zoffset) + & + betaz(i,j,k)) + else + call CCTK_WARN(0, "Flux direction not x,y,z") + end if + else + avg_beta = 0.d0 + end if + + avg_alp = 0.5 * (alp(i,j,k) + alp(i+xoffset,j+yoffset,k+zoffset)) + + gxxh = 0.5d0 * (gxx(i+xoffset,j+yoffset,k+zoffset) + gxx(i,j,k)) + gxyh = 0.5d0 * (gxy(i+xoffset,j+yoffset,k+zoffset) + gxy(i,j,k)) + gxzh = 0.5d0 * (gxz(i+xoffset,j+yoffset,k+zoffset) + gxz(i,j,k)) + gyyh = 0.5d0 * (gyy(i+xoffset,j+yoffset,k+zoffset) + gyy(i,j,k)) + gyzh = 0.5d0 * (gyz(i+xoffset,j+yoffset,k+zoffset) + gyz(i,j,k)) + gzzh = 0.5d0 * (gzz(i+xoffset,j+yoffset,k+zoffset) + gzz(i,j,k)) + + avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh) + +!!$ If the Riemann problem is trivial, just calculate the fluxes from the +!!$ left state and skip to the next cell + + if (SpaceMask_CheckStateBitsF90(space_mask, i, j, k, type_bits, trivial)) then + + if (flux_direction == 1) then + call num_x_flux(cons_m(1),cons_m(2),cons_m(3),cons_m(4),cons_m(5),& + f1(1),f1(2),f1(3),f1(4),f1(5),& + prim_m(2),prim_m(6), & + avg_det,avg_alp,avg_beta) + else if (flux_direction == 2) then + call num_x_flux(cons_m(1),cons_m(3),cons_m(4),cons_m(2),cons_m(5),& + f1(1),f1(3),f1(4),f1(2),f1(5),& + prim_m(3),prim_m(6), & + avg_det,avg_alp,avg_beta) + else if (flux_direction == 3) then + call num_x_flux(cons_m(1),cons_m(4),cons_m(2),cons_m(3),cons_m(5),& + f1(1),f1(4),f1(2),f1(3),f1(5), & + prim_m(4),prim_m(6), & + avg_det,avg_alp,avg_beta) + else + call CCTK_WARN(0, "Flux direction not x,y,z") + end if + + else !!! The end of this branch is right at the bottom of the routine + + call UpperMetric(uxxh, uxyh, uxzh, uyyh, uyzh, uzzh, & + avg_det,gxxh,gxyh,gxzh, & + gyyh,gyzh, gzzh) + + if (flux_direction == 1) then + usendh = uxxh + else if (flux_direction == 2) then + usendh = uyyh + else if (flux_direction == 3) then + usendh = uzzh + else + call CCTK_WARN(0, "Flux direction not x,y,z") + end if + +!!$ Calculate the jumps in the conserved variables + + qdiff(1) = cons_m(1) - cons_p(1) + qdiff(2) = cons_m(2) - cons_p(2) + qdiff(3) = cons_m(3) - cons_p(3) + qdiff(4) = cons_m(4) - cons_p(4) + qdiff(5) = cons_m(5) - cons_p(5) + +!!$ Eigenvalues and fluxes either side of the cell interface + + if (flux_direction == 1) then + call eigenvalues_general(& + prim_m(2),prim_m(3),prim_m(4),cs2_m, & + lamminus,& + gxxh,gxyh,gxzh,& + gyyh,gyzh,gzzh,& + usendh,avg_alp,avg_beta) + call eigenvalues_general(& + prim_p(2),prim_p(3),prim_p(4),cs2_p, & + lamplus,& + gxxh,gxyh,gxzh,& + gyyh,gyzh,gzzh,& + usendh,avg_alp,avg_beta) + call num_x_flux(cons_p(1),cons_p(2),cons_p(3),cons_p(4),cons_p(5),& + fplus(1),fplus(2),fplus(3),fplus(4),fplus(5),& + prim_p(2),prim_p(6), & + avg_det,avg_alp,avg_beta) + call num_x_flux(cons_m(1),cons_m(2),cons_m(3),cons_m(4),cons_m(5),& + fminus(1),fminus(2),fminus(3),fminus(4),fminus(5),& + prim_m(2),prim_m(6), & + avg_det,avg_alp,avg_beta) + else if (flux_direction == 2) then + call eigenvalues_general(& + prim_m(3),prim_m(4),prim_m(2),cs2_m, & + lamminus,& + gyyh,gyzh,gxyh,& + gzzh,gxzh,gxxh,& + usendh,avg_alp,avg_beta) + call eigenvalues_general(& + prim_p(3),prim_p(4),prim_p(2),cs2_p, & + lamplus,& + gyyh,gyzh,gxyh,& + gzzh,gxzh,gxxh,& + usendh,avg_alp,avg_beta) + call num_x_flux(cons_p(1),cons_p(3),cons_p(4),cons_p(2),cons_p(5),& + fplus(1),fplus(3),fplus(4),fplus(2),fplus(5),& + prim_p(3),prim_p(6), & + avg_det,avg_alp,avg_beta) + call num_x_flux(cons_m(1),cons_m(3),cons_m(4),cons_m(2),cons_m(5),& + fminus(1),fminus(3),fminus(4),fminus(2),fminus(5),& + prim_m(3),prim_m(6), & + avg_det,avg_alp,avg_beta) + else if (flux_direction == 3) then + call eigenvalues_general(& + prim_m(4),prim_m(2),prim_m(3),cs2_m, & + lamminus,& + gzzh,gxzh,gyzh,& + gxxh,gxyh,gyyh,& + usendh,avg_alp,avg_beta) + call eigenvalues_general(& + prim_p(4),prim_p(2),prim_p(3),cs2_p, & + lamplus,& + gzzh,gxzh,gyzh,& + gxxh,gxyh,gyyh,& + usendh,avg_alp,avg_beta) + call num_x_flux(cons_p(1),cons_p(4),cons_p(2),cons_p(3),cons_p(5),& + fplus(1),fplus(4),fplus(2),fplus(3),fplus(5), & + prim_p(4),prim_p(6), & + avg_det,avg_alp,avg_beta) + call num_x_flux(cons_m(1),cons_m(4),cons_m(2),cons_m(3),cons_m(5),& + fminus(1),fminus(4),fminus(2),fminus(3),fminus(5), & + prim_m(4),prim_m(6), & + avg_det,avg_alp,avg_beta) + else + call CCTK_WARN(0, "Flux direction not x,y,z") + end if + + if(tadmor.eq.0) then + +!!$ Find minimum and maximum wavespeeds + + charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), & + lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& + lamminus(4),lamminus(5)) + + charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), & + lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& + lamminus(4),lamminus(5)) + + charpm = charmax - charmin + +!!$ Calculate flux by standard formula + + do m = 1,5 + + qdiff(m) = cons_m(m) - cons_p(m) + + f1(m) = (charmax * fplus(m) - charmin * fminus(m) + & + charmax * charmin * qdiff(m)) / charpm + + end do + + else + ! Tadmor's semi-discrete scheme: JcP 160, 241 (2000) + + charmax = max(abs(lamplus(1)), abs(lamplus(2)), abs(lamplus(3)), & + abs(lamplus(4)),abs(lamplus(5)),abs(lamminus(1)),abs(lamminus(2)), & + abs(lamminus(3)),abs(lamminus(4)),abs(lamminus(5))) + + do m = 1,5 + + qdiff(m) = cons_m(m) - cons_p(m) + + f1(m) = 0.5d0 * (fplus(m) + fminus(m)) - 0.5d0*charmax* & + qdiff(m) + + end do + + end if + + + end if !!! The end of the SpaceMask check for a trivial RP. + + densflux(i, j, k) = f1(1) + sxflux(i, j, k) = f1(2) + syflux(i, j, k) = f1(3) + szflux(i, j, k) = f1(4) + tauflux(i, j, k) = f1(5) + + if(evolve_Y_e.ne.0) then + if (densflux(i, j, k) > 0.d0) then + Y_e_con_flux(i, j, k) = & + Y_e_plus(i, j, k) * & + densflux(i, j, k) + else + Y_e_con_flux(i, j, k) = & + Y_e_minus(i + xoffset, j + yoffset, k + zoffset) * & + densflux(i, j, k) + endif + endif + + end do + end do + end do + + +end subroutine GRHydro_HLLEGeneral + + +subroutine GRHydro_HLLE_TracerGeneral(CCTK_ARGUMENTS) + + USE GRHydro_Eigenproblem + + implicit none + + DECLARE_CCTK_ARGUMENTS + DECLARE_CCTK_PARAMETERS + DECLARE_CCTK_FUNCTIONS + + integer :: i, j, k, m + CCTK_REAL, dimension(number_of_tracers) :: cons_p,cons_m,fplus,fminus,f1 + CCTK_REAL, dimension(5) :: lamminus,lamplus + CCTK_REAL, dimension(number_of_tracers) :: qdiff + CCTK_REAL, dimension(6) :: prim_p, prim_m + CCTK_REAL :: charmin, charmax, charpm,avg_alp,avg_det + CCTK_REAL :: gxxh, gxyh, gxzh, gyyh, gyzh, gzzh, uxxh, uxyh, & + uxzh, uyyh, uyzh, uzzh, avg_beta, usendh, alp_l, alp_r, & + cs2_p, cs2_m, dpdeps_p, dpdeps_m + + integer tadmor + + if(CCTK_EQUALS(HLLE_type,"Tadmor")) then + tadmor = 1 + else + tadmor = 0 + endif + + + do k = GRHydro_stencil, cctk_lsh(3) - GRHydro_stencil + do j = GRHydro_stencil, cctk_lsh(2) - GRHydro_stencil + do i = GRHydro_stencil, cctk_lsh(1) - GRHydro_stencil + + f1 = 0.d0 + lamminus = 0.d0 + lamplus = 0.d0 + cons_p = 0.d0 + cons_m = 0.d0 + fplus = 0.d0 + fminus = 0.d0 + qdiff = 0.d0 + +!!$ Set the left (p for plus) and right (m_i for minus, i+1) states + + cons_p(:) = cons_tracerplus(i,j,k,:) + cons_m(:) = cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) + + prim_p(1) = rhoplus(i,j,k) + prim_p(2) = velxplus(i,j,k) + prim_p(3) = velyplus(i,j,k) + prim_p(4) = velzplus(i,j,k) + prim_p(5) = epsplus(i,j,k) + + prim_m(1) = rhominus(i+xoffset,j+yoffset,k+zoffset) + prim_m(2) = velxminus(i+xoffset,j+yoffset,k+zoffset) + prim_m(3) = velyminus(i+xoffset,j+yoffset,k+zoffset) + prim_m(4) = velzminus(i+xoffset,j+yoffset,k+zoffset) + prim_m(5) = epsminus(i+xoffset,j+yoffset,k+zoffset) + + prim_p(6) = pressplus(i,j,k) + cs2_p = eos_cs2_p(i,j,k) + dpdeps_p = eos_dpdeps_p(i,j,k) + + prim_m(6) = pressminus(i+xoffset,j+yoffset,k+zoffset) + cs2_m = eos_cs2_m(i+xoffset,j+yoffset,k+zoffset) + dpdeps_m = eos_dpdeps_m(i+xoffset,j+yoffset,k+zoffset) + +!!$ Calculate various metric terms here. +!!$ Note also need the average of the lapse at the +!!$ left and right points. + + if (shift_state .ne. 0) then + if (flux_direction == 1) then + avg_beta = 0.5d0 * (betax(i+xoffset,j+yoffset,k+zoffset) + & + betax(i,j,k)) + else if (flux_direction == 2) then + avg_beta = 0.5d0 * (betay(i+xoffset,j+yoffset,k+zoffset) + & + betay(i,j,k)) + else if (flux_direction == 3) then + avg_beta = 0.5d0 * (betaz(i+xoffset,j+yoffset,k+zoffset) + & + betaz(i,j,k)) + else + call CCTK_WARN(0, "Flux direction not x,y,z") + end if + else + avg_beta = 0.d0 + end if + + avg_alp = 0.5 * (alp(i,j,k) + alp(i+xoffset,j+yoffset,k+zoffset)) + + gxxh = 0.5d0 * (gxx(i+xoffset,j+yoffset,k+zoffset) + gxx(i,j,k)) + gxyh = 0.5d0 * (gxy(i+xoffset,j+yoffset,k+zoffset) + gxy(i,j,k)) + gxzh = 0.5d0 * (gxz(i+xoffset,j+yoffset,k+zoffset) + gxz(i,j,k)) + gyyh = 0.5d0 * (gyy(i+xoffset,j+yoffset,k+zoffset) + gyy(i,j,k)) + gyzh = 0.5d0 * (gyz(i+xoffset,j+yoffset,k+zoffset) + gyz(i,j,k)) + gzzh = 0.5d0 * (gzz(i+xoffset,j+yoffset,k+zoffset) + gzz(i,j,k)) + + avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh) + +!!$ If the Riemann problem is trivial, just calculate the fluxes from the +!!$ left state and skip to the next cell + + call UpperMetric(uxxh, uxyh, uxzh, uyyh, uyzh, uzzh, & + avg_det,gxxh, gxyh, gxzh, & + gyyh, gyzh, gzzh) + + if (flux_direction == 1) then + usendh = uxxh + else if (flux_direction == 2) then + usendh = uyyh + else if (flux_direction == 3) then + usendh = uzzh + else + call CCTK_WARN(0, "Flux direction not x,y,z") + end if + +!!$ Eigenvalues and fluxes either side of the cell interface + + if (flux_direction == 1) then + call eigenvalues_general(& + prim_m(2),prim_m(3),prim_m(4),cs2_m, & + lamminus,& + gxxh,gxyh,gxzh,& + gyyh,gyzh,gzzh,& + usendh,avg_alp,avg_beta) + call eigenvalues_general(& + prim_p(2),prim_p(3),prim_p(4),cs2_p, & + lamplus,& + gxxh,gxyh,gxzh,& + gyyh,gyzh,gzzh,& + usendh,avg_alp,avg_beta) + fplus(:) = (velxplus(i,j,k) - avg_beta / avg_alp) * & + cons_tracerplus(i,j,k,:) + fminus(:) = (velxminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * & + cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) + else if (flux_direction == 2) then + call eigenvalues_general(& + prim_m(3),prim_m(4),prim_m(2),cs2_m, & + lamminus,& + gyyh,gyzh,gxyh,& + gzzh,gxzh,gxxh,& + usendh,avg_alp,avg_beta) + call eigenvalues_general(& + prim_p(3),prim_p(4),prim_p(2),cs2_p, & + lamplus,& + gyyh,gyzh,gxyh,& + gzzh,gxzh,gxxh,& + usendh,avg_alp,avg_beta) + fplus(:) = (velyplus(i,j,k) - avg_beta / avg_alp) * & + cons_tracerplus(i,j,k,:) + fminus(:) = (velyminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * & + cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) + else if (flux_direction == 3) then + call eigenvalues_general(& + prim_m(4),prim_m(2),prim_m(3),cs2_m, & + lamminus,& + gzzh,gxzh,gyzh,& + gxxh,gxyh,gyyh,& + usendh,avg_alp,avg_beta) + call eigenvalues_general(& + prim_p(4),prim_p(2),prim_p(3),cs2_p, & + lamplus,& + gzzh,gxzh,gyzh,& + gxxh,gxyh,gyyh,& + usendh,avg_alp,avg_beta) + fplus(:) = (velzplus(i,j,k) - avg_beta / avg_alp) * & + cons_tracerplus(i,j,k,:) + fminus(:) = (velzminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * & + cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) + else + call CCTK_WARN(0, "Flux direction not x,y,z") + end if + + if(tadmor.eq.0) then + +!!$ Find minimum and maximum wavespeeds + + charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), & + lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& + lamminus(4),lamminus(5)) + + charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), & + lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& + lamminus(4),lamminus(5)) + + + charpm = charmax - charmin + +!!$ Calculate flux by standard formula + + do m = 1,number_of_tracers + + qdiff(m) = cons_m(m) - cons_p(m) + + f1(m) = (charmax * fplus(m) - charmin * fminus(m) + & + charmax * charmin * qdiff(m)) / charpm + end do + + else + ! Tadmor's semi-descrite scheme: JcP 160, 241 (2000) + + charmax = max(abs(lamplus(1)), abs(lamplus(2)), abs(lamplus(3)), & + abs(lamplus(4)),abs(lamplus(5)),abs(lamminus(1)),abs(lamminus(2)), & + abs(lamminus(3)),abs(lamminus(4)),abs(lamminus(5))) + + do m = 1,number_of_tracers + + qdiff(m) = cons_m(m) - cons_p(m) + + f1(m) = 0.5d0 * (fplus(m) + fminus(m)) - 0.5d0*charmax* & + qdiff(m) + + end do + + + end if + + + cons_tracerflux(i,j,k,:) = f1(:) + + end do + end do + end do + +end subroutine GRHydro_HLLE_TracerGeneral + + + + diff --git a/src/GRHydro_HLLEPolyM.F90 b/src/GRHydro_HLLE_EOSGM.F90 index aec2899..8fe2ef0 100644 --- a/src/GRHydro_HLLEPolyM.F90 +++ b/src/GRHydro_HLLE_EOSGM.F90 @@ -1,5 +1,5 @@ /*@@ - @file GRHydro_HLLEPolyM.F90 + @file GRHydro_HLLEM.F90 @date Aug 30, 2010 @author Joshua Faber, Scott Noble, Bruno Mundim, Ian Hawke, Pedro Montero, Toni Font @desc @@ -12,16 +12,16 @@ #include "cctk_Parameters.h" #include "cctk_Arguments.h" #include "cctk_Functions.h" - #include "GRHydro_Macros.h" #include "SpaceMask.h" /*@@ - @routine GRHydro_HLLEM + @routine GRHydro_HLLEGeneralM @date Aug 30, 2010 @author Joshua Faber, Scott Noble, Bruno Mundim, Ian Hawke, Pedro Montero, Toni Font @desc The HLLE solver. Sufficiently simple that its just one big routine. + Rewritten for the new EOS interface. @enddesc @calls @calledby @@ -31,17 +31,18 @@ @@*/ -subroutine GRHydro_HLLEM(CCTK_ARGUMENTS) +subroutine GRHydro_HLLEGeneralM(CCTK_ARGUMENTS) USE GRHydro_EigenproblemM implicit none DECLARE_CCTK_ARGUMENTS DECLARE_CCTK_PARAMETERS + DECLARE_CCTK_FUNCTIONS integer :: i, j, k, m CCTK_REAL, dimension(8) :: cons_p,cons_m,fplus,fminus,f1,qdiff - CCTK_REAL, dimension(7) :: prim_p, prim_m + CCTK_REAL, dimension(6) :: prim_p, prim_m CCTK_REAL, dimension(5) :: lamminus,lamplus CCTK_REAL :: charmin, charmax, charpm,avg_alp,avg_det CCTK_REAL :: gxxh, gxyh, gxzh, gyyh, gyzh, gzzh, uxxh, uxyh, & @@ -57,6 +58,15 @@ subroutine GRHydro_HLLEM(CCTK_ARGUMENTS) CCTK_INT :: type_bits, trivial, not_trivial + integer tadmor + + if(CCTK_EQUALS(HLLE_type,"Tadmor")) then + tadmor = 1 + else + tadmor = 0 + endif + + if (flux_direction == 1) then call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemX") call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemX", & @@ -116,22 +126,28 @@ subroutine GRHydro_HLLEM(CCTK_ARGUMENTS) prim_p(3) = velyplus(i,j,k) prim_p(4) = velzplus(i,j,k) prim_p(5) = epsplus(i,j,k) - prim_p(6) = pressplus(i,j,k) - prim_p(7) = w_lorentzplus(i,j,k) prim_m(1) = rhominus(i+xoffset,j+yoffset,k+zoffset) prim_m(2) = velxminus(i+xoffset,j+yoffset,k+zoffset) prim_m(3) = velyminus(i+xoffset,j+yoffset,k+zoffset) prim_m(4) = velzminus(i+xoffset,j+yoffset,k+zoffset) prim_m(5) = epsminus(i+xoffset,j+yoffset,k+zoffset) - prim_m(6) = pressminus(i+xoffset,j+yoffset,k+zoffset) - prim_m(7) = w_lorentzminus(i+xoffset,j+yoffset,k+zoffset) - + + prim_p(6) = pressplus(i,j,k) + cs2_p = eos_cs2_p(i,j,k) + dpdeps_p = eos_dpdeps_p(i,j,k) + rhoenth_p = prim_p(1)*(1.0d0+prim_p(5))+prim_p(6) + + prim_m(6) = pressminus(i+xoffset,j+yoffset,k+zoffset) + cs2_m = eos_cs2_m(i+xoffset,j+yoffset,k+zoffset) + dpdeps_m = eos_dpdeps_m(i+xoffset,j+yoffset,k+zoffset) + rhoenth_m = prim_m(1)*(1.0d0+prim_m(5))+prim_m(6) + if(clean_divergence.ne.0) then psidcp = psidcplus(i,j,k) psidcm = psidcminus(i+xoffset,j+yoffset,k+zoffset) endif - + !!$ Calculate various metric terms here. !!$ Note also need the average of the lapse at the !!$ left and right points. @@ -170,7 +186,7 @@ subroutine GRHydro_HLLEM(CCTK_ARGUMENTS) gyzh = 0.5d0 * (gyz(i+xoffset,j+yoffset,k+zoffset) + gyz(i,j,k)) gzzh = 0.5d0 * (gzz(i+xoffset,j+yoffset,k+zoffset) + gzz(i,j,k)) - avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh) + avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh) vxtp = prim_p(2)-avg_betax/avg_alp vytp = prim_p(3)-avg_betay/avg_alp @@ -209,30 +225,30 @@ subroutine GRHydro_HLLEM(CCTK_ARGUMENTS) !!$ alp, and beta in the flux dir if (flux_direction == 1) then - call num_x_fluxM(cons_p(1),cons_p(2),cons_p(3),cons_p(4),cons_p(5),& - cons_p(6),cons_p(7),cons_p(8),& + call num_x_fluxM(cons_m(1),cons_m(2),cons_m(3),cons_m(4),cons_m(5),& + cons_m(6),cons_m(7),cons_m(8),& f1(1),f1(2),f1(3),f1(4),f1(5),f1(6),f1(7),f1(8),& - vxtp,vytp,vztp,pressstarp,bxlowp,bylowp,bzlowp,ab0p,wp, & + vxtm,vytm,vztm,pressstarm,bxlowm,bylowm,bzlowm,ab0m,wm, & avg_det,avg_alp,avg_beta) if(clean_divergence.ne.0) then psidcf = cons_p(6) endif else if (flux_direction == 2) then - call num_x_fluxM(cons_p(1),cons_p(3),cons_p(4),cons_p(2),cons_p(5),& - cons_p(7),cons_p(8),cons_p(6),& + call num_x_fluxM(cons_m(1),cons_m(3),cons_m(4),cons_m(2),cons_m(5),& + cons_m(7),cons_m(8),cons_m(6),& f1(1),f1(3),f1(4),f1(2),f1(5),f1(7),f1(8),f1(6),& - vytp,vztp,vxtp,pressstarp,bylowp,bzlowp,bxlowp,ab0p,wp, & + vytm,vztm,vxtm,pressstarm,bylowm,bzlowm,bxlowm,ab0m,wm, & avg_det,avg_alp,avg_beta) if(clean_divergence.ne.0) then psidcf = cons_p(7) endif else if (flux_direction == 3) then - call num_x_fluxM(cons_p(1),cons_p(4),cons_p(2),cons_p(3),cons_p(5),& - cons_p(8),cons_p(6),cons_p(7),& + call num_x_fluxM(cons_m(1),cons_m(4),cons_m(2),cons_m(3),cons_m(5),& + cons_m(8),cons_m(6),cons_m(7),& f1(1),f1(4),f1(2),f1(3),f1(5),f1(8),f1(6),f1(7), & - vztp,vxtp,vytp,pressstarp,bzlowp,bxlowp,bylowp,ab0p,wp, & + vztm,vxtm,vytm,pressstarm,bzlowm,bxlowm,bylowm,ab0m,wm, & avg_det,avg_alp,avg_beta) if(clean_divergence.ne.0) then psidcf = cons_p(8) @@ -276,14 +292,12 @@ subroutine GRHydro_HLLEM(CCTK_ARGUMENTS) !!$ Eigenvalues and fluxes either side of the cell interface if (flux_direction == 1) then - call eigenvaluesM(GRHydro_eos_handle,& - prim_m(1),prim_m(2),prim_m(3),prim_m(4),prim_m(5),prim_m(7), & - cons_m(6),cons_m(7),cons_m(8),& + call eigenvalues_generalM(& + prim_m(2),prim_m(3),prim_m(4),cs2_m,vA2m, & lamminus,gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,& usendh,avg_alp,avg_beta) - call eigenvaluesM(GRHydro_eos_handle, & - prim_p(1),prim_p(2),prim_p(3),prim_p(4),prim_p(5),prim_p(7), & - cons_p(6),cons_p(7),cons_p(8),& + call eigenvalues_generalM(& + prim_p(2),prim_p(3),prim_p(4),cs2_p,vA2p, & lamplus,gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,& usendh,avg_alp,avg_beta) call num_x_fluxM(cons_p(1),cons_p(2),cons_p(3),cons_p(4),cons_p(5),& @@ -304,14 +318,12 @@ subroutine GRHydro_HLLEM(CCTK_ARGUMENTS) endif else if (flux_direction == 2) then - call eigenvaluesM(GRHydro_eos_handle,& - prim_m(1),prim_m(3),prim_m(4),prim_m(2),prim_m(5),prim_m(7), & - cons_m(7),cons_m(8),cons_m(6),& + call eigenvalues_generalM(& + prim_m(3),prim_m(4),prim_m(2),cs2_m,vA2m, & lamminus,gyyh,gyzh,gxyh,gzzh,gxzh,gxxh,& usendh,avg_alp,avg_beta) - call eigenvaluesM(GRHydro_eos_handle, & - prim_p(1),prim_p(3),prim_p(4),prim_p(2),prim_p(5),prim_p(7), & - cons_p(7),cons_p(8),cons_p(6),& + call eigenvalues_generalM(& + prim_p(3),prim_p(4),prim_p(2),cs2_p,vA2p, & lamplus,gyyh,gyzh,gxyh,gzzh,gxzh,gxxh,& usendh,avg_alp,avg_beta) call num_x_fluxM(cons_p(1),cons_p(3),cons_p(4),cons_p(2),cons_p(5),& @@ -331,14 +343,12 @@ subroutine GRHydro_HLLEM(CCTK_ARGUMENTS) endif else if (flux_direction == 3) then - call eigenvaluesM(GRHydro_eos_handle,& - prim_m(1),prim_m(4),prim_m(2),prim_m(3),prim_m(5),prim_m(7), & - cons_m(8),cons_m(6),cons_m(7),& + call eigenvalues_generalM(& + prim_m(4),prim_m(2),prim_m(3),cs2_m,vA2m, & lamminus,gzzh,gxzh,gyzh,gxxh,gxyh,gyyh,& usendh,avg_alp,avg_beta) - call eigenvaluesM(GRHydro_eos_handle,& - prim_p(1),prim_p(4),prim_p(2),prim_p(3),prim_p(5),prim_p(7), & - cons_p(8),cons_p(6),cons_p(7),& + call eigenvalues_generalM(& + prim_p(4),prim_p(2),prim_p(3),cs2_p,vA2p, & lamplus,gzzh,gxzh,gyzh,gxxh,gxyh,gyyh,& usendh,avg_alp,avg_beta) call num_x_fluxM(cons_p(1),cons_p(4),cons_p(2),cons_p(3),cons_p(5),& @@ -360,38 +370,66 @@ subroutine GRHydro_HLLEM(CCTK_ARGUMENTS) else call CCTK_WARN(0, "Flux direction not x,y,z") end if - + + if(tadmor.eq.0) then + !!$ Find minimum and maximum wavespeeds - charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), & - lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& - lamminus(4),lamminus(5)) + charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), & + lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& + lamminus(4),lamminus(5)) - charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), & - lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& - lamminus(4),lamminus(5)) + charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), & + lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& + lamminus(4),lamminus(5)) - charpm = charmax - charmin + charpm = charmax - charmin !!$ Calculate flux by standard formula do m = 1,8 - qdiff(m) = cons_m(m) - cons_p(m) + qdiff(m) = cons_m(m) - cons_p(m) + + f1(m) = (charmax * fplus(m) - charmin * fminus(m) + & + charmax * charmin * qdiff(m)) / charpm + + end do + + if(clean_divergence.ne.0) then + psidcdiff = psidcm - psidcp + psidcf = (charmax * psidcfp - charmin * psidcfm + & + charmax * charmin * psidcdiff) / charpm + endif + + else + ! Tadmor's semi-discrete scheme: JcP 160, 241 (2000) + + charmax = max(abs(lamplus(1)), abs(lamplus(2)), abs(lamplus(3)), & + abs(lamplus(4)),abs(lamplus(5)),abs(lamminus(1)),abs(lamminus(2)), & + abs(lamminus(3)),abs(lamminus(4)),abs(lamminus(5))) + + do m = 1,8 - f1(m) = (charmax * fplus(m) - charmin * fminus(m) + & - charmax * charmin * qdiff(m)) / charpm + qdiff(m) = cons_m(m) - cons_p(m) + + f1(m) = 0.5d0 * (fplus(m) + fminus(m)) - 0.5d0*charmax* & + qdiff(m) + + end do - end do + if(clean_divergence.ne.0) then + psidcdiff = psidcm - psidcp + psidcf = 0.5d0 * (psidcfp + psidcfm) - 0.5d0*charmax* & + psidcdiff + endif + + end if + - if(clean_divergence.ne.0) then - psidcdiff = psidcm - psidcp - psidcf = (charmax * psidcfp - charmin * psidcfm + & - charmax * charmin * psidcdiff) / charpm - endif end if !!! The end of the SpaceMask check for a trivial RP. - + densflux(i, j, k) = f1(1) sxflux(i, j, k) = f1(2) syflux(i, j, k) = f1(3) @@ -401,13 +439,13 @@ subroutine GRHydro_HLLEM(CCTK_ARGUMENTS) Bvecyflux(i, j, k) = f1(7) Bveczflux(i, j, k) = f1(8) psidcflux(i,j,k) = psidcf - + if(evolve_Y_e.ne.0) then if (densflux(i, j, k) > 0.d0) then Y_e_con_flux(i, j, k) = & Y_e_plus(i, j, k) * & densflux(i, j, k) - else + else Y_e_con_flux(i, j, k) = & Y_e_minus(i + xoffset, j + yoffset, k + zoffset) * & densflux(i, j, k) @@ -418,24 +456,10 @@ subroutine GRHydro_HLLEM(CCTK_ARGUMENTS) end do end do -end subroutine GRHydro_HLLEM - - /*@@ - @routine GRHydro_HLLE_TracerM - @date Aug 30, 2010 - @author Joshua Faber, Scott Noble, Bruno Mundim, Ian Hawke - @desc - HLLE just for the tracer. - @enddesc - @calls - @calledby - @history - - @endhistory +end subroutine GRHydro_HLLEGeneralM -@@*/ -subroutine GRHydro_HLLE_TracerM(CCTK_ARGUMENTS) +subroutine GRHydro_HLLE_TracerGeneralM(CCTK_ARGUMENTS) USE GRHydro_EigenproblemM @@ -443,36 +467,28 @@ subroutine GRHydro_HLLE_TracerM(CCTK_ARGUMENTS) DECLARE_CCTK_ARGUMENTS DECLARE_CCTK_PARAMETERS + DECLARE_CCTK_FUNCTIONS - integer :: i, j, k, m + integer :: i, j, k, m CCTK_REAL, dimension(number_of_tracers) :: cons_p,cons_m,fplus,fminus,f1 CCTK_REAL, dimension(5) :: lamminus,lamplus CCTK_REAL, dimension(number_of_tracers) :: qdiff - CCTK_REAL, dimension(7) :: prim_p, prim_m + CCTK_REAL, dimension(6) :: prim_p, prim_m CCTK_REAL, dimension(3) :: mag_p, mag_m CCTK_REAL :: charmin, charmax, charpm,avg_alp,avg_det CCTK_REAL :: gxxh, gxyh, gxzh, gyyh, gyzh, gzzh, uxxh, uxyh, & uxzh, uyyh, uyzh, uzzh, avg_beta, usendh, alp_l, alp_r, & cs2_p, cs2_m, dpdeps_p, dpdeps_m CCTK_REAL :: b2p,b2m,vA2m,vA2p - - CCTK_INT :: type_bits, trivial, not_trivial - if (flux_direction == 1) then - call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemX") - call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemX", & - &"trivial") - else if (flux_direction == 2) then - call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemY") - call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemY", & - &"trivial") - else if (flux_direction == 3) then - call SpaceMask_GetTypeBits(type_bits, "Hydro_RiemannProblemZ") - call SpaceMask_GetStateBits(trivial, "Hydro_RiemannProblemZ", & - &"trivial") + integer tadmor + + if(CCTK_EQUALS(HLLE_type,"Tadmor")) then + tadmor = 1 else - call CCTK_WARN(0, "Flux direction not x,y,z") - end if + tadmor = 0 + endif + do k = GRHydro_stencil, cctk_lsh(3) - GRHydro_stencil do j = GRHydro_stencil, cctk_lsh(2) - GRHydro_stencil @@ -507,17 +523,21 @@ subroutine GRHydro_HLLE_TracerM(CCTK_ARGUMENTS) prim_p(3) = velyplus(i,j,k) prim_p(4) = velzplus(i,j,k) prim_p(5) = epsplus(i,j,k) - prim_p(6) = pressplus(i,j,k) - prim_p(7) = w_lorentzplus(i,j,k) prim_m(1) = rhominus(i+xoffset,j+yoffset,k+zoffset) prim_m(2) = velxminus(i+xoffset,j+yoffset,k+zoffset) prim_m(3) = velyminus(i+xoffset,j+yoffset,k+zoffset) prim_m(4) = velzminus(i+xoffset,j+yoffset,k+zoffset) prim_m(5) = epsminus(i+xoffset,j+yoffset,k+zoffset) - prim_m(6) = pressminus(i+xoffset,j+yoffset,k+zoffset) - prim_m(7) = w_lorentzminus(i+xoffset,j+yoffset,k+zoffset) + prim_p(6) = pressplus(i,j,k) + cs2_p = eos_cs2_p(i,j,k) + dpdeps_p = eos_dpdeps_p(i,j,k) + + prim_m(6) = pressminus(i+xoffset,j+yoffset,k+zoffset) + cs2_m = eos_cs2_m(i+xoffset,j+yoffset,k+zoffset) + dpdeps_m = eos_dpdeps_m(i+xoffset,j+yoffset,k+zoffset) + !!$ Calculate various metric terms here. !!$ Note also need the average of the lapse at the !!$ left and right points. @@ -548,77 +568,84 @@ subroutine GRHydro_HLLE_TracerM(CCTK_ARGUMENTS) gyzh = 0.5d0 * (gyz(i+xoffset,j+yoffset,k+zoffset) + gyz(i,j,k)) gzzh = 0.5d0 * (gzz(i+xoffset,j+yoffset,k+zoffset) + gzz(i,j,k)) - avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh) + avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh) +!!$ If the Riemann problem is trivial, just calculate the fluxes from the +!!$ left state and skip to the next cell + call UpperMetric(uxxh, uxyh, uxzh, uyyh, uyzh, uzzh, & avg_det,gxxh, gxyh, gxzh, & gyyh, gyzh, gzzh) - + if (flux_direction == 1) then - usendh = uxxh + usendh = uxxh else if (flux_direction == 2) then - usendh = uyyh + usendh = uyyh else if (flux_direction == 3) then - usendh = uzzh + usendh = uzzh else - call CCTK_WARN(0, "Flux direction not x,y,z") + call CCTK_WARN(0, "Flux direction not x,y,z") end if !!$ b^2 = (1-v^2)B^2+(B dot v)^2 - b2p=DOTP2(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,mag_p(1),mag_p(2),mag_p(3))/prim_p(7)**2 + & + b2p=(1.d0-DOTP2(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,prim_p(2),prim_p(3),prim_p(4)))* & + DOTP2(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,mag_p(1),mag_p(2),mag_p(3)) + & (DOTP(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,prim_p(2),prim_p(3),prim_p(4),mag_p(1),mag_p(2),mag_p(3)))**2 - b2m=DOTP2(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,mag_m(1),mag_m(2),mag_m(3))/prim_m(7)**2 + & + b2m=(1.d0-DOTP2(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,prim_m(2),prim_m(3),prim_m(4)))* & + DOTP2(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,mag_m(1),mag_m(2),mag_m(3)) + & (DOTP(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,prim_m(2),prim_m(3),prim_m(4),mag_m(1),mag_m(2),mag_m(3)))**2 vA2p = b2p/(prim_p(1)*(1.0d0+prim_p(5))+prim_p(6)+b2p) vA2m = b2m/(prim_m(1)*(1.0d0+prim_m(5))+prim_m(6)+b2m) - -!!$ Calculate the jumps in the conserved variables - - qdiff = cons_m - cons_p - + !!$ Eigenvalues and fluxes either side of the cell interface - + if (flux_direction == 1) then - call eigenvaluesM(GRHydro_eos_handle,& - prim_m(1),prim_m(2),prim_m(3),prim_m(4),prim_m(5),prim_m(7), & - cons_m(6),cons_m(7),cons_m(8),& - lamminus,gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,& + call eigenvalues_generalM(& + prim_m(2),prim_m(3),prim_m(4),cs2_m,vA2m, & + lamminus,& + gxxh,gxyh,gxzh,& + gyyh,gyzh,gzzh,& usendh,avg_alp,avg_beta) - call eigenvaluesM(GRHydro_eos_handle, & - prim_p(1),prim_p(2),prim_p(3),prim_p(4),prim_p(5),prim_p(7), & - cons_p(6),cons_p(7),cons_p(8),& - lamplus,gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,& + call eigenvalues_generalM(& + prim_p(2),prim_p(3),prim_p(4),cs2_p,vA2p, & + lamplus,& + gxxh,gxyh,gxzh,& + gyyh,gyzh,gzzh,& usendh,avg_alp,avg_beta) fplus(:) = (velxplus(i,j,k) - avg_beta / avg_alp) * & cons_tracerplus(i,j,k,:) fminus(:) = (velxminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * & cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) else if (flux_direction == 2) then - call eigenvaluesM(GRHydro_eos_handle,& - prim_m(1),prim_m(3),prim_m(4),prim_m(2),prim_m(5),prim_m(7), & - cons_m(7),cons_m(8),cons_m(6),& - lamminus,gyyh,gyzh,gxyh,gzzh,gxzh,gxxh,& + call eigenvalues_generalM(& + prim_m(3),prim_m(4),prim_m(2),cs2_m,vA2m, & + lamminus,& + gyyh,gyzh,gxyh,& + gzzh,gxzh,gxxh,& usendh,avg_alp,avg_beta) - call eigenvaluesM(GRHydro_eos_handle, & - prim_p(1),prim_p(3),prim_p(4),prim_p(2),prim_p(5),prim_p(7), & - cons_p(7),cons_p(8),cons_p(6),& - lamplus,gyyh,gyzh,gxyh,gzzh,gxzh,gxxh,& + call eigenvalues_generalM(& + prim_p(3),prim_p(4),prim_p(2),cs2_p,vA2p, & + lamplus,& + gyyh,gyzh,gxyh,& + gzzh,gxzh,gxxh,& usendh,avg_alp,avg_beta) fplus(:) = (velyplus(i,j,k) - avg_beta / avg_alp) * & cons_tracerplus(i,j,k,:) fminus(:) = (velyminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * & cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:) else if (flux_direction == 3) then - call eigenvaluesM(GRHydro_eos_handle,& - prim_m(1),prim_m(4),prim_m(2),prim_m(3),prim_m(5),prim_m(7), & - cons_m(8),cons_m(6),cons_m(7),& - lamminus,gzzh,gxzh,gyzh,gxxh,gxyh,gyyh,& + call eigenvalues_generalM(& + prim_m(4),prim_m(2),prim_m(3),cs2_m,vA2m, & + lamminus,& + gzzh,gxzh,gyzh,& + gxxh,gxyh,gyyh,& usendh,avg_alp,avg_beta) - call eigenvaluesM(GRHydro_eos_handle,& - prim_p(1),prim_p(4),prim_p(2),prim_p(3),prim_p(5),prim_p(7), & - cons_p(8),cons_p(6),cons_p(7),& - lamplus,gzzh,gxzh,gyzh,gxxh,gxyh,gyyh,& + call eigenvalues_generalM(& + prim_p(4),prim_p(2),prim_p(3),cs2_p,vA2p, & + lamplus,& + gzzh,gxzh,gyzh,& + gxxh,gxyh,gyyh,& usendh,avg_alp,avg_beta) fplus(:) = (velzplus(i,j,k) - avg_beta / avg_alp) * & cons_tracerplus(i,j,k,:) @@ -627,43 +654,57 @@ subroutine GRHydro_HLLE_TracerM(CCTK_ARGUMENTS) else call CCTK_WARN(0, "Flux direction not x,y,z") end if - -!!$ Find minimum and maximum wavespeeds - - charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), & - lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& - lamminus(4),lamminus(5)) - - charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), & - lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& - lamminus(4),lamminus(5)) - - charpm = charmax - charmin - -!!$ Calculate flux by standard formula - - do m = 1,number_of_tracers + + if(tadmor.eq.0) then - qdiff(m) = cons_m(m) - cons_p(m) +!!$ Find minimum and maximum wavespeeds - f1(m) = (charmax * fplus(m) - charmin * fminus(m) + & - charmax * charmin * qdiff(m)) / charpm + charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), & + lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& + lamminus(4),lamminus(5)) - end do - - cons_tracerflux(i, j, k,:) = f1(:) -!!$ -!!$ if ( ((flux_direction.eq.3).and.(i.eq.4).and.(j.eq.4)).or.& -!!$ ((flux_direction.eq.2).and.(i.eq.4).and.(k.eq.4)).or.& -!!$ ((flux_direction.eq.1).and.(j.eq.4).and.(k.eq.4))& -!!$ ) then -!!$ write(*,*) flux_direction, i, j, k, f1(1), cons_m(1), cons_p(1) -!!$ end if - - end do - end do -end do - - -end subroutine GRHydro_HLLE_TracerM + charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), & + lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),& + lamminus(4),lamminus(5)) + + + charpm = charmax - charmin + +!!$ Calculate flux by standard formula + + do m = 1,number_of_tracers + + qdiff(m) = cons_m(m) - cons_p(m) + + f1(m) = (charmax * fplus(m) - charmin * fminus(m) + & + charmax * charmin * qdiff(m)) / charpm + end do + + else + ! Tadmor's semi-descrite scheme: JcP 160, 241 (2000) + + charmax = max(abs(lamplus(1)), abs(lamplus(2)), abs(lamplus(3)), & + abs(lamplus(4)),abs(lamplus(5)),abs(lamminus(1)),abs(lamminus(2)), & + abs(lamminus(3)),abs(lamminus(4)),abs(lamminus(5))) + + do m = 1,number_of_tracers + + qdiff(m) = cons_m(m) - cons_p(m) + + f1(m) = 0.5d0 * (fplus(m) + fminus(m)) - 0.5d0*charmax* & + qdiff(m) + + end do + + + end if + + + cons_tracerflux(i,j,k,:) = f1(:) + + end do + end do + end do + +end subroutine GRHydro_HLLE_TracerGeneralM diff --git a/src/make.code.defn b/src/make.code.defn index 53fe17c..2a00a1b 100644 --- a/src/make.code.defn +++ b/src/make.code.defn @@ -14,8 +14,8 @@ SRCS = Utils.F90 \ GRHydro_EOS.c \ GRHydro_Flux.F90 \ GRHydro_FluxSplit.F90 \ + GRHydro_HLLE_EOSG.F90 \ GRHydro_HLLE.F90 \ - GRHydro_HLLEPoly.F90 \ GRHydro_Loop.F90 \ GRHydro_Minima.F90 \ GRHydro_Minima.cc \ @@ -52,9 +52,9 @@ SRCS = Utils.F90 \ GRHydro_Con2PrimM_pt.c \ GRHydro_EigenproblemM.F90 \ GRHydro_FluxM.F90 \ + GRHydro_HLLE_EOSGM.F90 \ GRHydro_HLLEM.F90 \ - GRHydro_HLLEPolyM.F90 \ - GRHydro_PPMM.F90 \ + GRHydro_PPMM.F90 \ GRHydro_ParamCheckM.F90 \ GRHydro_Prim2ConM.F90 \ GRHydro_RiemannSolveM.F90 \ |