117 qtC,sCT,qt,snew,fC,fE,dxs,x)
127 integer,
intent(in) :: method
128 double precision,
intent(in) :: qdt, dtfactor, qtc, qt, dxs(
ndim)
129 integer,
intent(in) :: ixi^
l, ixo^
l, idims^lim
130 double precision,
dimension(ixI^S,1:ndim),
intent(in) :: x
131 double precision,
dimension(ixI^S,1:nwflux,1:ndim) :: fc
132 double precision,
dimension(ixI^S,sdim:3) :: fe
133 type(state) :: sct, snew
136 double precision,
dimension(ixI^S,1:nw) :: wprim
138 double precision,
dimension(ixI^S,1:nw) :: wprim_lim
141 double precision,
dimension(ixI^S,1:nw) :: wlc, wrc
143 double precision,
dimension(ixI^S,1:nw) :: wlp, wrp
144 double precision,
dimension(ixI^S,1:nwflux) :: flc, frc
145 double precision,
dimension(ixI^S,1:ndir,1:ndim) :: fc_mom
146 double precision,
dimension(ixI^S,1:ndir) :: flc_mom, frc_mom
147 double precision,
dimension(ixI^S,1:number_species) :: cmaxc
148 double precision,
dimension(ixI^S,1:number_species) :: cminc
149 double precision,
dimension(ixI^S) :: hspeed
150 double precision,
dimension(ixO^S) :: inv_volume
151 double precision,
dimension(1:ndim) :: dxinv
152 integer :: idims, iw, ix^
d, hx^
d, ix^
l, hxo^
l, ixc^
l, ixcr^
l, kxc^
l, kxr^
l, ii
153 integer :: jdims, jxc^
l, hpc^
l, hmc^
l
155 double precision,
dimension(ixI^S) :: divvc
156 logical :: active=.false., need_hd_mom_flux=.false.
157 type(ct_velocity) :: vcts
159 associate(wct=>sct%w, wnew=>snew%w)
165 ix^
l=ix^
l^ladd2*
kr(idims,^
d);
167 if (ixi^
l^ltix^
l|.or.|.or.) &
168 call mpistop(
"Error in fv : Nonconforming input limits")
188 kxcmin^
d=iximin^
d; kxcmax^
d=iximax^
d-
kr(idims,^
d);
189 kxr^
l=kxc^
l+
kr(idims,^
d);
195 {
do ix^db=iximin^db,iximax^db\}
197 wrp(ix^
d,iw)=wprim(ix^
d,iw)
198 wlp(ix^
d,iw)=wprim(ix^
d,iw)
200 wrp(kxc^s,iw)=wprim(kxr^s,iw)
203 hxo^l=ixo^l-kr(idims,^d);
204 if(stagger_grid)
then
206 ixcmax^d=ixomax^d+transverse_ghost_cells-transverse_ghost_cells*kr(idims,^d);
207 ixcmin^d=hxomin^d-transverse_ghost_cells+transverse_ghost_cells*kr(idims,^d);
210 ixcmax^d=ixomax^d; ixcmin^d=hxomin^d;
215 {ixcrmin^d = max(ixcmin^d - phys_wider_stencil,ixglo^d)\}
216 {ixcrmax^d = min(ixcmax^d + phys_wider_stencil,ixghi^d)\}
220 call reconstruct_lr(ixi^l,ixcr^l,ixcr^l,idims,wprim_lim,wlc,wrc,wlp,wrp,x,dxs(idims))
222 call reconstruct_lr(ixi^l,ixcr^l,ixcr^l,idims,wprim,wlc,wrc,wlp,wrp,x,dxs(idims))
226 call phys_modify_wlr(ixi^l,ixcr^l,qt,wlc,wrc,wlp,wrp,sct,idims)
229 call phys_get_flux(wlc,wlp,x,ixi^l,ixc^l,idims,flc)
230 call phys_get_flux(wrc,wrp,x,ixi^l,ixc^l,idims,frc)
231 if(need_hd_mom_flux)
then
232 call phys_get_hd_mom_flux(wlc,wlp,x,ixi^l,ixc^l,idims,flc_mom)
233 call phys_get_hd_mom_flux(wrc,wrp,x,ixi^l,ixc^l,idims,frc_mom)
235 if(h_correction)
then
236 call phys_get_h_speed(wprim,x,ixi^l,ixo^l,idims,hspeed)
239 if(method==fs_tvdlf.or.method==fs_tvdmu)
then
240 call phys_get_cbounds(wlc,wrc,wlp,wrp,x,ixi^l,ixc^l,idims,hspeed,cmaxc)
242 if(stagger_grid)
call phys_get_ct_velocity(vcts,wlp,wrp,ixi^l,ixc^l,idims,cmaxc(ixi^s,index_v_mag))
244 call phys_get_cbounds(wlc,wrc,wlp,wrp,x,ixi^l,ixc^l,idims,hspeed,cmaxc,cminc)
245 if(stagger_grid)
call phys_get_ct_velocity(vcts,wlp,wrp,ixi^l,ixc^l,idims,cmaxc(ixi^s,index_v_mag),cminc(ixi^s,index_v_mag))
251 do ii=1,number_species
252 call get_riemann_flux_hll(start_indices(ii),stop_indices(ii),flc(ixi^s,start_indices(ii):stop_indices(ii)),frc(ixi^s,start_indices(ii):stop_indices(ii)),fc(ixi^s,start_indices(ii):stop_indices(ii),idims))
254 if(need_hd_mom_flux)
then
256 call get_riemann_flux_hll(iw_mom(1),iw_mom(ndir),flc_mom,frc_mom,fc_mom(ixi^s,1:ndir,idims))
258 case(fs_hllc,fs_hllcd)
259 do ii=1,number_species
260 call get_riemann_flux_hllc(start_indices(ii),stop_indices(ii))
262 if(need_hd_mom_flux)
then
264 call get_riemann_flux_hll(iw_mom(1),iw_mom(ndir),flc_mom,frc_mom,fc_mom(ixi^s,1:ndir,idims))
267 do ii=1,number_species
268 if(ii==index_v_mag)
then
269 call get_riemann_flux_hlld(start_indices(ii),stop_indices(ii))
271 call get_riemann_flux_hll(start_indices(ii),stop_indices(ii),flc(ixi^s,start_indices(ii):stop_indices(ii)),frc(ixi^s,start_indices(ii):stop_indices(ii)),fc(ixi^s,start_indices(ii):stop_indices(ii),idims))
274 if(need_hd_mom_flux)
then
276 call get_riemann_flux_hll(iw_mom(1),iw_mom(ndir),flc_mom,frc_mom,fc_mom(ixi^s,1:ndir,idims))
279 do ii=1,number_species
280 call get_riemann_flux_tvdlf(start_indices(ii),stop_indices(ii),flc(ixi^s,start_indices(ii):stop_indices(ii)),frc(ixi^s,start_indices(ii):stop_indices(ii)),fc(ixi^s,start_indices(ii):stop_indices(ii),idims))
282 if(need_hd_mom_flux)
then
284 call get_riemann_flux_tvdlf(iw_mom(1),iw_mom(ndir),flc_mom,frc_mom,fc_mom(ixi^s,1:ndir,idims))
289 call mpistop(
'unkown Riemann flux in finite volume')
308 if (ppm_avisc > zero)
then
309 jxc^l=ixc^l+kr(idims,^d);
310 divvc(ixc^s)=wprim(jxc^s,iw_mom(idims))-wprim(ixc^s,iw_mom(idims))
312 if (jdims==idims) cycle
313 hpc^l=ixc^l+kr(jdims,^d); hmc^l=ixc^l-kr(jdims,^d);
314 divvc(ixc^s)=divvc(ixc^s) &
315 +0.25d0*(wprim(hpc^s,iw_mom(jdims))-wprim(hmc^s,iw_mom(jdims)))
316 hpc^l=hpc^l+kr(idims,^d); hmc^l=hmc^l+kr(idims,^d);
317 divvc(ixc^s)=divvc(ixc^s) &
318 +0.25d0*(wprim(hpc^s,iw_mom(jdims))-wprim(hmc^s,iw_mom(jdims)))
320 divvc(ixc^s)=ppm_avisc*max(-divvc(ixc^s),zero)
322 fc(ixc^s,iw,idims)=fc(ixc^s,iw,idims) &
323 +divvc(ixc^s)*(wct(ixc^s,iw)-wct(jxc^s,iw))
329 if(stagger_grid)
call phys_update_faces(ixi^l,ixo^l,qt,qdt,wprim,fc,fe,sct,snew,vcts)
330 if(slab_uniform)
then
331 if(local_timestep)
then
332 dxinv(1:ndim)=-dtfactor/dxs(1:ndim)
335 hxomin^d=ixomin^d-hx^d\
337 {
do ix^db=hxomin^db,ixomax^db\}
338 fc(ix^d,iw,idims)=block%dt(ix^d)*dxinv(idims)*fc(ix^d,iw,idims)
340 {
do ix^db=ixomin^db,ixomax^db\}
341 wnew(ix^d,iw)=wnew(ix^d,iw)+fc(ix^d,iw,idims)-fc(ix^d-hx^d,iw,idims)
345 if(method==fs_tvdmu) &
346 call tvdlimit2(method,qdt,ixi^l,ixc^l,ixo^l,idims,wlc,wrc,wnew,x,fc,dxs)
349 dxinv(1:ndim)=-qdt/dxs(1:ndim)
352 hxomin^d=ixomin^d-hx^d\
354 {
do ix^db=hxomin^db,ixomax^db\}
355 fc(ix^d,iw,idims)=dxinv(idims)*fc(ix^d,iw,idims)
357 {
do ix^db=ixomin^db,ixomax^db\}
358 wnew(ix^d,iw)=wnew(ix^d,iw)+fc(ix^d,iw,idims)-fc(ix^d-hx^d,iw,idims)
362 if(method==fs_tvdmu) &
363 call tvdlimit2(method,qdt,ixi^l,ixc^l,ixo^l,idims,wlc,wrc,wnew,x,fc,dxs)
364 if(need_hd_mom_flux)
then
365 {
do ix^db=hxomin^db,ixomax^db\}
366 ^c&fc(ix^d,iw_mom(^c),idims)=dxinv(idims)*fc_mom(ix^d,^c,idims)\
372 inv_volume(ixo^s) = 1.d0/block%dvolume(ixo^s)
373 if(local_timestep)
then
376 hxomin^d=ixomin^d-hx^d\
378 {
do ix^db=hxomin^db,ixomax^db\}
379 fc(ix^d,iw,idims)=-block%dt(ix^d)*dtfactor*fc(ix^d,iw,idims)*block%surfaceC(ix^d,idims)
381 {
do ix^db=ixomin^db,ixomax^db\}
382 wnew(ix^d,iw)=wnew(ix^d,iw)+(fc(ix^d,iw,idims)-fc(ix^d-hx^d,iw,idims))*inv_volume(ix^d)
386 if (method==fs_tvdmu) &
387 call tvdlimit2(method,qdt,ixi^l,ixc^l,ixo^l,idims,wlc,wrc,wnew,x,fc,dxs)
392 hxomin^d=ixomin^d-hx^d\
394 {
do ix^db=hxomin^db,ixomax^db\}
395 fc(ix^d,iw,idims)=-qdt*fc(ix^d,iw,idims)*block%surfaceC(ix^d,idims)
397 {
do ix^db=ixomin^db,ixomax^db\}
398 wnew(ix^d,iw)=wnew(ix^d,iw)+(fc(ix^d,iw,idims)-fc(ix^d-hx^d,iw,idims))*inv_volume(ix^d)
401 if(need_hd_mom_flux)
then
402 {
do ix^db=hxomin^db,ixomax^db\}
403 ^c&fc(ix^d,iw_mom(^c),idims)=-qdt*fc_mom(ix^d,^c,idims)*block%surfaceC(ix^d,idims)\
410 if (.not.slab.and.idimsmin==1) &
411 call phys_add_source_geom(qdt,dtfactor,ixi^l,ixo^l,wct,wprim,wnew,x)
413 if(stagger_grid)
call phys_face_to_center(ixo^l,snew)
416 if(fix_small_values)
then
417 call phys_handle_small_values(.false.,wnew,x,ixi^l,ixo^l,
'multi-D finite_volume')
421 if(stagger_grid) snew%ws=sct%ws
425 call addsource2(qdt*dble(idimsmax-idimsmin+1)/dble(ndim),&
426 dtfactor*dble(idimsmax-idimsmin+1)/dble(ndim),&
427 ixi^l,ixo^l,1,nw,qtc,wct,wprim,qt,wnew,x,.false.,active)
434 fc(ixc^s,iw,idims)=half*(flc(ixc^s,iw)+frc(ixc^s,iw))
438 subroutine get_riemann_flux_tvdlf(iws,iwe,fL,fR,f)
439 integer,
intent(in) :: iws,iwe
440 double precision,
intent(in) :: fL(ixI^S,iws:iwe),fR(ixI^S,iws:iwe)
441 double precision,
intent(out) :: f(ixI^S,iws:iwe)
443 double precision :: fac(ixC^S),phi
446 fac(ixc^s) = -0.5d0*tvdlfeps*cmaxc(ixc^s,ii)
449 if(flux_type(idims, iw) /= flux_no_dissipation)
then
450 if(flux_adaptive_diffusion)
then
451 {
do ix^db=ixcmin^db,ixcmax^db\}
452 jx^d=ix^d+kr(idims,^d)\
460 phi = flux_adaptive_diffusion_min
461 if(((wrc(ix^d,iw)-wlc(ix^d,iw))*(sct%w(jx^d,iw)-sct%w(ix^d,iw))) .gt. 1.d-18)
then
462 phi = max(flux_adaptive_diffusion_min, &
463 min(flux_adaptive_diffusion_scale * &
464 (wrc(ix^d,iw)-wlc(ix^d,iw))**2 / &
465 ((sct%w(jx^d,iw)-sct%w(ix^d,iw))**2 + 1.d-18), one))
469 f(ix^d,iw)=half*(fl(ix^d, iw)+fr(ix^d, iw))+fac(ix^d)*(wrc(ix^d,iw)-wlc(ix^d,iw))*phi
472 {
do ix^db=ixcmin^db,ixcmax^db\}
473 f(ix^d,iw)=half*(fl(ix^d, iw)+fr(ix^d, iw))+fac(ix^d)*(wrc(ix^d,iw)-wlc(ix^d,iw))
478 end subroutine get_riemann_flux_tvdlf
480 subroutine get_riemann_flux_hll(iws,iwe,fL,fR,f)
481 integer,
intent(in) :: iws,iwe
482 double precision,
intent(in) :: fL(ixI^S,iws:iwe),fR(ixI^S,iws:iwe)
483 double precision,
intent(out) :: f(ixI^S,iws:iwe)
485 double precision :: phi
488 if(flux_adaptive_diffusion)
then
490 if(flux_type(idims, iw) == flux_tvdlf)
then
491 if(stagger_grid)
then
495 f(ixc^s,iw)=-tvdlfeps*half*max(cmaxc(ixc^s,ii),dabs(cminc(ixc^s,ii)))*&
496 (wrc(ixc^s,iw)-wlc(ixc^s,iw))
499 {
do ix^db=ixcmin^db,ixcmax^db\}
500 if(cminc(ix^d,ii) >= zero)
then
501 f(ix^d,iw)=fl(ix^d,iw)
502 else if(cmaxc(ix^d,ii) <= zero)
then
503 f(ix^d,iw)=fr(ix^d,iw)
506 phi=max(abs(cmaxc(ix^d,ii)),abs(cminc(ix^d,ii)))/(cmaxc(ix^d,ii)-cminc(ix^d,ii))
507 f(ix^d,iw)=(cmaxc(ix^d,ii)*fl(ix^d, iw)-cminc(ix^d,ii)*fr(ix^d,iw)&
508 +phi*cminc(ix^d,ii)*cmaxc(ix^d,ii)*(wrc(ix^d,iw)-wlc(ix^d,iw)))&
509 /(cmaxc(ix^d,ii)-cminc(ix^d,ii))
516 if(flux_type(idims, iw) == flux_tvdlf)
then
517 if(stagger_grid)
then
521 f(ixc^s,iw)=-tvdlfeps*half*max(cmaxc(ixc^s,ii),dabs(cminc(ixc^s,ii)))*&
522 (wrc(ixc^s,iw)-wlc(ixc^s,iw))
525 {
do ix^db=ixcmin^db,ixcmax^db\}
526 if(cminc(ix^d,ii) >= zero)
then
527 f(ix^d,iw)=fl(ix^d,iw)
528 else if(cmaxc(ix^d,ii) <= zero)
then
529 f(ix^d,iw)=fr(ix^d,iw)
531 f(ix^d,iw)=(cmaxc(ix^d,ii)*fl(ix^d, iw)-cminc(ix^d,ii)*fr(ix^d,iw)&
532 +cminc(ix^d,ii)*cmaxc(ix^d,ii)*(wrc(ix^d,iw)-wlc(ix^d,iw)))&
533 /(cmaxc(ix^d,ii)-cminc(ix^d,ii))
539 end subroutine get_riemann_flux_hll
541 subroutine get_riemann_flux_hllc(iws,iwe)
542 integer,
intent(in) :: iws, iwe
543 double precision,
dimension(ixI^S,1:nwflux) :: whll, Fhll, fCD
544 double precision,
dimension(ixI^S) :: lambdaCD
546 integer,
dimension(ixI^S) :: patchf
547 integer :: rho_, p_, e_, mom(1:ndir)
550 if (
allocated(iw_mom)) mom(:) = iw_mom(:)
553 if(
associated(phys_hllc_init_species))
then
554 call phys_hllc_init_species(ii, rho_, mom(:), e_)
560 where(cminc(ixc^s,1) >= zero)
562 elsewhere(cmaxc(ixc^s,1) <= zero)
566 if(method==fs_hllcd) &
567 call phys_diffuse_hllcd(ixi^l,ixc^l,idims,wlc,wrc,flc,frc,patchf)
570 if(any(patchf(ixc^s)==1)) &
571 call phys_get_lcd(wlc,wrc,flc,frc,cminc(ixi^s,ii),cmaxc(ixi^s,ii),idims,ixi^l,ixc^l, &
572 whll,fhll,lambdacd,patchf)
575 if(any(abs(patchf(ixc^s))== 1))
then
577 call phys_get_wcd(wlc,wrc,whll,frc,flc,fhll,patchf,lambdacd,&
578 cminc(ixi^s,ii),cmaxc(ixi^s,ii),ixi^l,ixc^l,idims,fcd)
582 if (flux_type(idims, iw) == flux_tvdlf)
then
583 flc(ixc^s,iw)=-tvdlfeps*half*max(cmaxc(ixc^s,ii),abs(cminc(ixc^s,ii))) * &
584 (wrc(ixc^s,iw) - wlc(ixc^s,iw))
586 where(patchf(ixc^s)==-2)
587 flc(ixc^s,iw)=flc(ixc^s,iw)
588 elsewhere(abs(patchf(ixc^s))==1)
589 flc(ixc^s,iw)=fcd(ixc^s,iw)
590 elsewhere(patchf(ixc^s)==2)
591 flc(ixc^s,iw)=frc(ixc^s,iw)
592 elsewhere(patchf(ixc^s)==3)
594 flc(ixc^s,iw)=fhll(ixc^s,iw)
595 elsewhere(patchf(ixc^s)==4)
597 flc(ixc^s,iw) = half*((flc(ixc^s,iw)+frc(ixc^s,iw)) &
598 -tvdlfeps * max(cmaxc(ixc^s,ii), dabs(cminc(ixc^s,ii))) * &
599 (wrc(ixc^s,iw)-wlc(ixc^s,iw)))
603 fc(ixc^s,iw,idims)=flc(ixc^s,iw)
606 end subroutine get_riemann_flux_hllc
609 subroutine get_riemann_flux_hlld(iws,iwe)
610 integer,
intent(in) :: iws, iwe
611 double precision,
dimension(ixI^S,1:nwflux) :: w1R,w1L,w2R,w2L
612 double precision,
dimension(ixI^S) :: sm,s1R,s1L,suR,suL,Bx
613 double precision,
dimension(ixI^S) :: pts,ptR,ptL,signBx,r1L,r1R,tmp
615 double precision,
dimension(ixI^S,ndir) :: BR, BL
616 integer :: ip1,ip2,ip3,idir,ix^D,^C&b^C_,^C&m^C_
617 integer :: rho_, p_, e_, mom(1:ndir), mag(1:ndir)
619 associate(sr=>cmaxc,sl=>cminc)
622 ^c&mom(^c)=iw_mom(^c)\
624 ^c&mag(^c)=iw_mag(^c)\
632 br(ixc^s,:)=wrc(ixc^s,mag(:))+block%B0(ixc^s,:,ip1)
633 bl(ixc^s,:)=wlc(ixc^s,mag(:))+block%B0(ixc^s,:,ip1)
635 br(ixc^s,:)=wrc(ixc^s,mag(:))
636 bl(ixc^s,:)=wlc(ixc^s,mag(:))
638 if(stagger_grid)
then
639 bx(ixc^s)=block%ws(ixc^s,ip1)
643 bx(ixc^s)=(sr(ixc^s,ii)*br(ixc^s,ip1)-sl(ixc^s,ii)*bl(ixc^s,ip1))/(sr(ixc^s,ii)-sl(ixc^s,ii))
646 do ix^db=ixcmin^db,ixcmax^db\}
647 ptr(ix^d)=wrp(ix^d,p_)+0.5d0*(^c&br(ix^d,^c)**2+)
648 ptl(ix^d)=wlp(ix^d,p_)+0.5d0*(^c&bl(ix^d,^c)**2+)
649 if(iw_equi_rho>0)
then
650 sur(ix^d)=(sr(ix^d,ii)-wrp(ix^d,mom(ip1)))*(wrc(ix^d,rho_)+block%equi_vars(ix^d,iw_equi_rho,ip1))
651 sul(ix^d)=(sl(ix^d,ii)-wlp(ix^d,mom(ip1)))*(wlc(ix^d,rho_)+block%equi_vars(ix^d,iw_equi_rho,ip1))
653 sur(ix^d)=(sr(ix^d,ii)-wrp(ix^d,mom(ip1)))*wrc(ix^d,rho_)
654 sul(ix^d)=(sl(ix^d,ii)-wlp(ix^d,mom(ip1)))*wlc(ix^d,rho_)
657 sm(ix^d)=(sur(ix^d)*wrp(ix^d,mom(ip1))-sul(ix^d)*wlp(ix^d,mom(ip1))-&
658 ptr(ix^d)+ptl(ix^d))/(sur(ix^d)-sul(ix^d))
660 w1r(ix^d,mom(ip1))=sm(ix^d)
661 w1l(ix^d,mom(ip1))=sm(ix^d)
662 w2r(ix^d,mom(ip1))=sm(ix^d)
663 w2l(ix^d,mom(ip1))=sm(ix^d)
665 w1r(ix^d,mag(ip1))=bx(ix^d)
666 w1l(ix^d,mag(ip1))=bx(ix^d)
668 ptr(ix^d)=wrp(ix^d,p_)+0.5d0*(^c&wrc(ix^d,b^c_)**2+)
669 ptl(ix^d)=wlp(ix^d,p_)+0.5d0*(^c&wlc(ix^d,b^c_)**2+)
672 w1r(ix^d,rho_)=sur(ix^d)/(sr(ix^d,ii)-sm(ix^d))
673 w1l(ix^d,rho_)=sul(ix^d)/(sl(ix^d,ii)-sm(ix^d))
676 r1r(ix^d)=sur(ix^d)*(sr(ix^d,ii)-sm(ix^d))-bx(ix^d)**2
677 if(r1r(ix^d)/=0.d0) r1r(ix^d)=1.d0/r1r(ix^d)
678 r1l(ix^d)=sul(ix^d)*(sl(ix^d,ii)-sm(ix^d))-bx(ix^d)**2
679 if(r1l(ix^d)/=0.d0) r1l(ix^d)=1.d0/r1l(ix^d)
681 w1r(ix^d,mom(ip2))=wrp(ix^d,mom(ip2))-bx(ix^d)*br(ix^d,ip2)*&
682 (sm(ix^d)-wrp(ix^d,mom(ip1)))*r1r(ix^d)
683 w1l(ix^d,mom(ip2))=wlp(ix^d,mom(ip2))-bx(ix^d)*bl(ix^d,ip2)*&
684 (sm(ix^d)-wlp(ix^d,mom(ip1)))*r1l(ix^d)
686 w1r(ix^d,mag(ip2))=(sur(ix^d)*(sr(ix^d,ii)-wrp(ix^d,mom(ip1)))-bx(ix^d)**2)*r1r(ix^d)
687 w1l(ix^d,mag(ip2))=(sul(ix^d)*(sl(ix^d,ii)-wlp(ix^d,mom(ip1)))-bx(ix^d)**2)*r1l(ix^d)
692 w1r(ix^d,mom(ip3))=wrp(ix^d,mom(ip3))-bx(ix^d)*br(ix^d,ip3)*&
693 (sm(ix^d)-wrp(ix^d,mom(ip1)))*r1r(ix^d)
694 w1l(ix^d,mom(ip3))=wlp(ix^d,mom(ip3))-bx(ix^d)*bl(ix^d,ip3)*&
695 (sm(ix^d)-wlp(ix^d,mom(ip1)))*r1l(ix^d)
697 w1r(ix^d,mag(ip3))=br(ix^d,ip3)*w1r(ix^d,mag(ip2))
698 w1l(ix^d,mag(ip3))=bl(ix^d,ip3)*w1l(ix^d,mag(ip2))
701 w1r(ix^d,mag(ip2))=br(ix^d,ip2)*w1r(ix^d,mag(ip2))
702 w1l(ix^d,mag(ip2))=bl(ix^d,ip2)*w1l(ix^d,mag(ip2))
705 ^c&w1r(ix^d,b^c_)=w1r(ix^d,b^c_)-block%B0(ix^d,^c,ip1)\
706 ^c&w1l(ix^d,b^c_)=w1l(ix^d,b^c_)-block%B0(ix^d,^c,ip1)\
711 w1r(ix^d,p_)=sur(ix^d)*(sm(ix^d)-wrp(ix^d,mom(ip1)))+ptr(ix^d)
712 w1l(ix^d,p_)=w1r(ix^d,p_)
715 w1r(ix^d,p_)=w1r(ix^d,p_)+(^c&block%B0(ix^d,^c,ip1)*(wrc(ix^d,b^c_)-w1r(ix^d,b^c_))+)
716 w1l(ix^d,p_)=w1l(ix^d,p_)+(^c&block%B0(ix^d,^c,ip1)*(wlc(ix^d,b^c_)-w1l(ix^d,b^c_))+)
719 w1r(ix^d,e_)=((sr(ix^d,ii)-wrp(ix^d,mom(ip1)))*wrc(ix^d,e_)-ptr(ix^d)*wrp(ix^d,mom(ip1))+&
720 w1r(ix^d,p_)*sm(ix^d)+bx(ix^d)*((^c&wrp(ix^d,m^c_)*wrc(ix^d,b^c_)+)-&
721 (^c&w1r(ix^d,m^c_)*w1r(ix^d,b^c_)+)))/(sr(ix^d,ii)-sm(ix^d))
722 w1l(ix^d,e_)=((sl(ix^d,ii)-wlp(ix^d,mom(ip1)))*wlc(ix^d,e_)-ptl(ix^d)*wlp(ix^d,mom(ip1))+&
723 w1l(ix^d,p_)*sm(ix^d)+bx(ix^d)*((^c&wlp(ix^d,m^c_)*wlc(ix^d,b^c_)+)-&
724 (^c&w1l(ix^d,m^c_)*w1l(ix^d,b^c_)+)))/(sl(ix^d,ii)-sm(ix^d))
727 w1r(ix^d,e_)=w1r(ix^d,e_)+((^c&w1r(ix^d,b^c_)*block%B0(ix^d,^c,ip1)+)*sm(ix^d)-&
728 (^c&wrc(ix^d,b^c_)*block%B0(ix^d,^c,ip1)+)*wrp(ix^d,mom(ip1)))/(sr(ix^d,ii)-sm(ix^d))
729 w1l(ix^d,e_)=w1l(ix^d,e_)+((^c&w1l(ix^d,b^c_)*block%B0(ix^d,^c,ip1)+)*sm(ix^d)-&
730 (^c&wlc(ix^d,b^c_)*block%B0(ix^d,^c,ip1)+)*wlp(ix^d,mom(ip1)))/(sl(ix^d,ii)-sm(ix^d))
733 w1r(ix^d,e_)=w1r(ix^d,e_)+1d0/(phys_gamma-1)*block%equi_vars(ix^d,iw_equi_p,ip1)*&
734 (sm(ix^d)-wrp(ix^d,mom(ip1)))/(sr(ix^d,ii)-sm(ix^d))
735 w1l(ix^d,e_)=w1l(ix^d,e_)+1d0/(phys_gamma-1)*block%equi_vars(ix^d,iw_equi_p,ip1)*&
736 (sm(ix^d)-wlp(ix^d,mom(ip1)))/(sl(ix^d,ii)-sm(ix^d))
741 w2r(ix^d,rho_)=w1r(ix^d,rho_)
742 w2l(ix^d,rho_)=w1l(ix^d,rho_)
743 w2r(ix^d,mag(ip1))=w1r(ix^d,mag(ip1))
744 w2l(ix^d,mag(ip1))=w1l(ix^d,mag(ip1))
745 r1r(ix^d)=sqrt(w1r(ix^d,rho_))
746 r1l(ix^d)=sqrt(w1l(ix^d,rho_))
747 tmp(ix^d)=1.d0/(r1r(ix^d)+r1l(ix^d))
748 signbx(ix^d)=sign(1.d0,bx(ix^d))
750 s1r(ix^d)=sm(ix^d)+abs(bx(ix^d))/r1r(ix^d)
751 s1l(ix^d)=sm(ix^d)-abs(bx(ix^d))/r1l(ix^d)
753 w2r(ix^d,mom(ip2))=(r1l(ix^d)*w1l(ix^d,mom(ip2))+r1r(ix^d)*w1r(ix^d,mom(ip2))+&
754 (w1r(ix^d,mag(ip2))-w1l(ix^d,mag(ip2)))*signbx(ix^d))*tmp(ix^d)
755 w2l(ix^d,mom(ip2))=w2r(ix^d,mom(ip2))
757 w2r(ix^d,mag(ip2))=(r1l(ix^d)*w1r(ix^d,mag(ip2))+r1r(ix^d)*w1l(ix^d,mag(ip2))+&
758 r1l(ix^d)*r1r(ix^d)*(w1r(ix^d,mom(ip2))-w1l(ix^d,mom(ip2)))*signbx(ix^d))*tmp(ix^d)
759 w2l(ix^d,mag(ip2))=w2r(ix^d,mag(ip2))
762 w2r(ix^d,mom(ip3))=(r1l(ix^d)*w1l(ix^d,mom(ip3))+r1r(ix^d)*w1r(ix^d,mom(ip3))+&
763 (w1r(ix^d,mag(ip3))-w1l(ix^d,mag(ip3)))*signbx(ix^d))*tmp(ix^d)
764 w2l(ix^d,mom(ip3))=w2r(ix^d,mom(ip3))
766 w2r(ix^d,mag(ip3))=(r1l(ix^d)*w1r(ix^d,mag(ip3))+r1r(ix^d)*w1l(ix^d,mag(ip3))+&
767 r1l(ix^d)*r1r(ix^d)*(w1r(ix^d,mom(ip3))-w1l(ix^d,mom(ip3)))*signbx(ix^d))*tmp(ix^d)
768 w2l(ix^d,mag(ip3))=w2r(ix^d,mag(ip3))
772 w2r(ix^d,e_)=w1r(ix^d,e_)+r1r(ix^d)*((^c&w1r(ix^d,m^c_)*w1r(ix^d,b^c_)+)-&
773 (^c&w2r(ix^d,m^c_)*w2r(ix^d,b^c_)+))*signbx(ix^d)
774 w2l(ix^d,e_)=w1l(ix^d,e_)-r1l(ix^d)*((^c&w1l(ix^d,m^c_)*w1l(ix^d,b^c_)+)-&
775 (^c&w2l(ix^d,m^c_)*w2l(ix^d,b^c_)+))*signbx(ix^d)
779 ^c&w1r(ix^d,m^c_)=w1r(ix^d,m^c_)*w1r(ix^d,rho_)\
780 ^c&w1l(ix^d,m^c_)=w1l(ix^d,m^c_)*w1l(ix^d,rho_)\
781 ^c&w2r(ix^d,m^c_)=w2r(ix^d,m^c_)*w2r(ix^d,rho_)\
782 ^c&w2l(ix^d,m^c_)=w2l(ix^d,m^c_)*w2l(ix^d,rho_)\
783 if(iw_equi_rho>0)
then
784 w1r(ix^d,rho_)=w1r(ix^d,rho_)-block%equi_vars(ix^d,iw_equi_rho,ip1)
785 w1l(ix^d,rho_)=w1l(ix^d,rho_)-block%equi_vars(ix^d,iw_equi_rho,ip1)
786 w2r(ix^d,rho_)=w2r(ix^d,rho_)-block%equi_vars(ix^d,iw_equi_rho,ip1)
787 w2l(ix^d,rho_)=w2l(ix^d,rho_)-block%equi_vars(ix^d,iw_equi_rho,ip1)
792 if(flux_type(idims, iw)==flux_special)
then
795 do ix^db=ixcmin^db,ixcmax^db\}
796 fc(ix^d,iw,ip1)=flc(ix^d,iw)
798 else if(flux_type(idims, iw)==flux_hll)
then
801 do ix^db=ixcmin^db,ixcmax^db\}
802 fc(ix^d,iw,ip1)=(sr(ix^d,ii)*flc(ix^d,iw)-sl(ix^d,ii)*frc(ix^d,iw) &
803 +sr(ix^d,ii)*sl(ix^d,ii)*(wrc(ix^d,iw)-wlc(ix^d,iw)))/(sr(ix^d,ii)-sl(ix^d,ii))
810 do ix^db=ixcmin^db,ixcmax^db\}
811 if(sl(ix^d,ii)>0.d0)
then
812 fc(ix^d,iw,ip1)=flc(ix^d,iw)
813 else if(s1l(ix^d)>=0.d0)
then
814 fc(ix^d,iw,ip1)=flc(ix^d,iw)+sl(ix^d,ii)*(w1l(ix^d,iw)-wlc(ix^d,iw))
815 else if(sm(ix^d)>=0.d0)
then
816 fc(ix^d,iw,ip1)=flc(ix^d,iw)+sl(ix^d,ii)*(w1l(ix^d,iw)-wlc(ix^d,iw))+&
817 s1l(ix^d)*(w2l(ix^d,iw)-w1l(ix^d,iw))
818 else if(s1r(ix^d)>=0.d0)
then
819 fc(ix^d,iw,ip1)=frc(ix^d,iw)+sr(ix^d,ii)*(w1r(ix^d,iw)-wrc(ix^d,iw))+&
820 s1r(ix^d)*(w2r(ix^d,iw)-w1r(ix^d,iw))
821 else if(sr(ix^d,ii)>=0.d0)
then
822 fc(ix^d,iw,ip1)=frc(ix^d,iw)+sr(ix^d,ii)*(w1r(ix^d,iw)-wrc(ix^d,iw))
823 else if(sr(ix^d,ii)<0.d0)
then
824 fc(ix^d,iw,ip1)=frc(ix^d,iw)
831 end subroutine get_riemann_flux_hlld
835 subroutine get_riemann_flux_hlld_mag2(iws,iwe)
837 integer,
intent(in) :: iws, iwe
839 double precision,
dimension(ixI^S,1:nwflux) :: w1R,w1L,f1R,f1L,f2R,f2L
840 double precision,
dimension(ixI^S,1:nwflux) :: w2R,w2L
841 double precision,
dimension(ixI^S) :: sm,s1R,s1L,suR,suL,Bx
842 double precision,
dimension(ixI^S) :: pts,ptR,ptL,signBx,r1L,r1R,tmp
844 double precision,
dimension(ixI^S,ndir) :: vRC, vLC
846 double precision,
dimension(ixI^S,ndir) :: BR, BL
847 integer :: ip1,ip2,ip3,idir,ix^D
848 double precision :: phiPres, thetaSM, du, dv, dw
849 integer :: ixV^L, ixVb^L, ixVc^L, ixVd^L, ixVe^L, ixVf^L
850 integer :: rho_, p_, e_, mom(1:ndir), mag(1:ndir)
851 double precision,
parameter :: aParam = 4d0
859 associate(sr=>cmaxc,sl=>cminc)
866 vrc(ixc^s,:)=wrp(ixc^s,mom(:))
867 vlc(ixc^s,:)=wlp(ixc^s,mom(:))
870 call get_hlld2_modif_c(wlp,x,ixi^l,ixo^l,s1l)
871 call get_hlld2_modif_c(wrp,x,ixi^l,ixo^l,s1r)
873 phipres = min(1d0, maxval(max(s1l(ixo^s),s1r(ixo^s)))/maxval(cmaxc(ixo^s,1)))
874 phipres = phipres*(2d0 - phipres)
881 du = minval(wprim(ixv^s,mom(1))-wprim(ixo^s,mom(1)))
917 dv = minval(min(wprim(ixo^s,mom(2))-wprim(ixv^s,mom(2)),&
918 wprim(ixvb^s,mom(2))-wprim(ixo^s,mom(2)),&
919 wprim(ixvc^s,mom(2))-wprim(ixvd^s,mom(2)),&
920 wprim(ixve^s,mom(2))-wprim(ixvc^s,mom(2))&
954 dw = minval(min(wprim(ixo^s,mom(3))-wprim(ixv^s,mom(3)),&
955 wprim(ixvb^s,mom(3))-wprim(ixo^s,mom(3)),&
956 wprim(ixvc^s,mom(3))-wprim(ixvd^s,mom(3)),&
957 wprim(ixve^s,mom(3))-wprim(ixvc^s,mom(3))&
960 thetasm = maxval(cmaxc(ixo^s,1))
962 thetasm = (min(1d0, (thetasm-du)/(thetasm-min(dv,dw))))**aparam
965 br(ixc^s,:)=wrc(ixc^s,mag(:))+block%B0(ixc^s,:,ip1)
966 bl(ixc^s,:)=wlc(ixc^s,mag(:))+block%B0(ixc^s,:,ip1)
968 br(ixc^s,:)=wrc(ixc^s,mag(:))
969 bl(ixc^s,:)=wlc(ixc^s,mag(:))
972 bx(ixc^s)=(sr(ixc^s,index_v_mag)*br(ixc^s,ip1)-sl(ixc^s,index_v_mag)*bl(ixc^s,ip1)-&
973 flc(ixc^s,mag(ip1))-frc(ixc^s,mag(ip1)))/(sr(ixc^s,index_v_mag)-sl(ixc^s,index_v_mag))
974 ptr(ixc^s)=wrp(ixc^s,p_)+0.5d0*sum(br(ixc^s,:)**2,dim=ndim+1)
975 ptl(ixc^s)=wlp(ixc^s,p_)+0.5d0*sum(bl(ixc^s,:)**2,dim=ndim+1)
976 sur(ixc^s)=(sr(ixc^s,index_v_mag)-vrc(ixc^s,ip1))*wrc(ixc^s,rho_)
977 sul(ixc^s)=(sl(ixc^s,index_v_mag)-vlc(ixc^s,ip1))*wlc(ixc^s,rho_)
979 sm(ixc^s)=(sur(ixc^s)*vrc(ixc^s,ip1)-sul(ixc^s)*vlc(ixc^s,ip1)-&
980 thetasm*(ptr(ixc^s)-ptl(ixc^s)) )/(sur(ixc^s)-sul(ixc^s))
982 w1r(ixc^s,mom(ip1))=sm(ixc^s)
983 w1l(ixc^s,mom(ip1))=sm(ixc^s)
984 w2r(ixc^s,mom(ip1))=sm(ixc^s)
985 w2l(ixc^s,mom(ip1))=sm(ixc^s)
987 w1r(ixc^s,mag(ip1))=bx(ixc^s)
988 w1l(ixc^s,mag(ip1))=bx(ixc^s)
990 ptr(ixc^s)=wrp(ixc^s,p_)+0.5d0*sum(wrc(ixc^s,mag(:))**2,dim=ndim+1)
991 ptl(ixc^s)=wlp(ixc^s,p_)+0.5d0*sum(wlc(ixc^s,mag(:))**2,dim=ndim+1)
995 w1r(ixc^s,rho_)=sur(ixc^s)/(sr(ixc^s,index_v_mag)-sm(ixc^s))
996 w1l(ixc^s,rho_)=sul(ixc^s)/(sl(ixc^s,index_v_mag)-sm(ixc^s))
1000 r1r(ixc^s)=sur(ixc^s)*(sr(ixc^s,index_v_mag)-sm(ixc^s))-bx(ixc^s)**2
1001 where(r1r(ixc^s)/=0.d0)
1002 r1r(ixc^s)=1.d0/r1r(ixc^s)
1004 r1l(ixc^s)=sul(ixc^s)*(sl(ixc^s,index_v_mag)-sm(ixc^s))-bx(ixc^s)**2
1005 where(r1l(ixc^s)/=0.d0)
1006 r1l(ixc^s)=1.d0/r1l(ixc^s)
1009 w1r(ixc^s,mom(ip2))=vrc(ixc^s,ip2)-bx(ixc^s)*br(ixc^s,ip2)*&
1010 (sm(ixc^s)-vrc(ixc^s,ip1))*r1r(ixc^s)
1011 w1l(ixc^s,mom(ip2))=vlc(ixc^s,ip2)-bx(ixc^s)*bl(ixc^s,ip2)*&
1012 (sm(ixc^s)-vlc(ixc^s,ip1))*r1l(ixc^s)
1014 w1r(ixc^s,mag(ip2))=(sur(ixc^s)*(sr(ixc^s,index_v_mag)-vrc(ixc^s,ip1))-bx(ixc^s)**2)*r1r(ixc^s)
1015 w1l(ixc^s,mag(ip2))=(sul(ixc^s)*(sl(ixc^s,index_v_mag)-vlc(ixc^s,ip1))-bx(ixc^s)**2)*r1l(ixc^s)
1020 w1r(ixc^s,mom(ip3))=vrc(ixc^s,ip3)-bx(ixc^s)*br(ixc^s,ip3)*&
1021 (sm(ixc^s)-vrc(ixc^s,ip1))*r1r(ixc^s)
1022 w1l(ixc^s,mom(ip3))=vlc(ixc^s,ip3)-bx(ixc^s)*bl(ixc^s,ip3)*&
1023 (sm(ixc^s)-vlc(ixc^s,ip1))*r1l(ixc^s)
1025 w1r(ixc^s,mag(ip3))=br(ixc^s,ip3)*w1r(ixc^s,mag(ip2))
1026 w1l(ixc^s,mag(ip3))=bl(ixc^s,ip3)*w1l(ixc^s,mag(ip2))
1029 w1r(ixc^s,mag(ip2))=br(ixc^s,ip2)*w1r(ixc^s,mag(ip2))
1030 w1l(ixc^s,mag(ip2))=bl(ixc^s,ip2)*w1l(ixc^s,mag(ip2))
1033 w1r(ixc^s,mag(:))=w1r(ixc^s,mag(:))-block%B0(ixc^s,:,ip1)
1034 w1l(ixc^s,mag(:))=w1l(ixc^s,mag(:))-block%B0(ixc^s,:,ip1)
1037 if(phys_energy)
then
1039 w1r(ixc^s,p_)=(sur(ixc^s)*ptl(ixc^s) - sul(ixc^s)*ptr(ixc^s) +&
1040 phipres * sur(ixc^s)*sul(ixc^s)*(vrc(ixc^s,ip1)-vlc(ixc^s,ip1)))/&
1041 (sur(ixc^s)-sul(ixc^s))
1042 w1l(ixc^s,p_)=w1r(ixc^s,p_)
1045 w1r(ixc^s,p_)=w1r(ixc^s,p_)+sum(block%B0(ixc^s,:,ip1)*(wrc(ixc^s,mag(:))-w1r(ixc^s,mag(:))),dim=ndim+1)
1046 w1l(ixc^s,p_)=w1l(ixc^s,p_)+sum(block%B0(ixc^s,:,ip1)*(wlc(ixc^s,mag(:))-w1l(ixc^s,mag(:))),dim=ndim+1)
1049 w1r(ixc^s,e_)=((sr(ixc^s,index_v_mag)-vrc(ixc^s,ip1))*wrc(ixc^s,e_)-ptr(ixc^s)*vrc(ixc^s,ip1)+&
1050 w1r(ixc^s,p_)*sm(ixc^s)+bx(ixc^s)*(sum(vrc(ixc^s,:)*wrc(ixc^s,mag(:)),dim=ndim+1)-&
1051 sum(w1r(ixc^s,mom(:))*w1r(ixc^s,mag(:)),dim=ndim+1)))/(sr(ixc^s,index_v_mag)-sm(ixc^s))
1052 w1l(ixc^s,e_)=((sl(ixc^s,index_v_mag)-vlc(ixc^s,ip1))*wlc(ixc^s,e_)-ptl(ixc^s)*vlc(ixc^s,ip1)+&
1053 w1l(ixc^s,p_)*sm(ixc^s)+bx(ixc^s)*(sum(vlc(ixc^s,:)*wlc(ixc^s,mag(:)),dim=ndim+1)-&
1054 sum(w1l(ixc^s,mom(:))*w1l(ixc^s,mag(:)),dim=ndim+1)))/(sl(ixc^s,index_v_mag)-sm(ixc^s))
1057 w1r(ixc^s,e_)=w1r(ixc^s,e_)+(sum(w1r(ixc^s,mag(:))*block%B0(ixc^s,:,ip1),dim=ndim+1)*sm(ixc^s)-&
1058 sum(wrc(ixc^s,mag(:))*block%B0(ixc^s,:,ip1),dim=ndim+1)*vrc(ixc^s,ip1))/(sr(ixc^s,index_v_mag)-sm(ixc^s))
1059 w1l(ixc^s,e_)=w1l(ixc^s,e_)+(sum(w1l(ixc^s,mag(:))*block%B0(ixc^s,:,ip1),dim=ndim+1)*sm(ixc^s)-&
1060 sum(wlc(ixc^s,mag(:))*block%B0(ixc^s,:,ip1),dim=ndim+1)*vlc(ixc^s,ip1))/(sl(ixc^s,index_v_mag)-sm(ixc^s))
1065 w2r(ixc^s,rho_)=w1r(ixc^s,rho_)
1066 w2l(ixc^s,rho_)=w1l(ixc^s,rho_)
1067 w2r(ixc^s,mag(ip1))=w1r(ixc^s,mag(ip1))
1068 w2l(ixc^s,mag(ip1))=w1l(ixc^s,mag(ip1))
1070 r1r(ixc^s)=sqrt(w1r(ixc^s,rho_))
1071 r1l(ixc^s)=sqrt(w1l(ixc^s,rho_))
1072 tmp(ixc^s)=1.d0/(r1r(ixc^s)+r1l(ixc^s))
1073 signbx(ixc^s)=sign(1.d0,bx(ixc^s))
1075 s1r(ixc^s)=sm(ixc^s)+abs(bx(ixc^s))/r1r(ixc^s)
1076 s1l(ixc^s)=sm(ixc^s)-abs(bx(ixc^s))/r1l(ixc^s)
1078 w2r(ixc^s,mom(ip2))=(r1l(ixc^s)*w1l(ixc^s,mom(ip2))+r1r(ixc^s)*w1r(ixc^s,mom(ip2))+&
1079 (w1r(ixc^s,mag(ip2))-w1l(ixc^s,mag(ip2)))*signbx(ixc^s))*tmp(ixc^s)
1080 w2l(ixc^s,mom(ip2))=w2r(ixc^s,mom(ip2))
1082 w2r(ixc^s,mag(ip2))=(r1l(ixc^s)*w1r(ixc^s,mag(ip2))+r1r(ixc^s)*w1l(ixc^s,mag(ip2))+&
1083 r1l(ixc^s)*r1r(ixc^s)*(w1r(ixc^s,mom(ip2))-w1l(ixc^s,mom(ip2)))*signbx(ixc^s))*tmp(ixc^s)
1084 w2l(ixc^s,mag(ip2))=w2r(ixc^s,mag(ip2))
1087 w2r(ixc^s,mom(ip3))=(r1l(ixc^s)*w1l(ixc^s,mom(ip3))+r1r(ixc^s)*w1r(ixc^s,mom(ip3))+&
1088 (w1r(ixc^s,mag(ip3))-w1l(ixc^s,mag(ip3)))*signbx(ixc^s))*tmp(ixc^s)
1089 w2l(ixc^s,mom(ip3))=w2r(ixc^s,mom(ip3))
1091 w2r(ixc^s,mag(ip3))=(r1l(ixc^s)*w1r(ixc^s,mag(ip3))+r1r(ixc^s)*w1l(ixc^s,mag(ip3))+&
1092 r1l(ixc^s)*r1r(ixc^s)*(w1r(ixc^s,mom(ip3))-w1l(ixc^s,mom(ip3)))*signbx(ixc^s))*tmp(ixc^s)
1093 w2l(ixc^s,mag(ip3))=w2r(ixc^s,mag(ip3))
1096 if(phys_energy)
then
1097 w2r(ixc^s,e_)=w1r(ixc^s,e_)+r1r(ixc^s)*(sum(w1r(ixc^s,mom(:))*w1r(ixc^s,mag(:)),dim=ndim+1)-&
1098 sum(w2r(ixc^s,mom(:))*w2r(ixc^s,mag(:)),dim=ndim+1))*signbx(ixc^s)
1099 w2l(ixc^s,e_)=w1l(ixc^s,e_)-r1l(ixc^s)*(sum(w1l(ixc^s,mom(:))*w1l(ixc^s,mag(:)),dim=ndim+1)-&
1100 sum(w2l(ixc^s,mom(:))*w2l(ixc^s,mag(:)),dim=ndim+1))*signbx(ixc^s)
1105 w1r(ixc^s,mom(idir))=w1r(ixc^s,mom(idir))*w1r(ixc^s,rho_)
1106 w1l(ixc^s,mom(idir))=w1l(ixc^s,mom(idir))*w1l(ixc^s,rho_)
1107 w2r(ixc^s,mom(idir))=w2r(ixc^s,mom(idir))*w2r(ixc^s,rho_)
1108 w2l(ixc^s,mom(idir))=w2l(ixc^s,mom(idir))*w2l(ixc^s,rho_)
1114 if(stagger_grid .and. flux_type(idims, iw) == flux_tvdlf) cycle
1115 if(flux_type(idims, iw) == flux_special)
then
1117 f1l(ixc^s,iw)=flc(ixc^s,iw)
1118 f1r(ixc^s,iw)=f1l(ixc^s,iw)
1119 f2l(ixc^s,iw)=f1l(ixc^s,iw)
1120 f2r(ixc^s,iw)=f1l(ixc^s,iw)
1121 else if(flux_type(idims, iw) == flux_hll)
then
1123 f1l(ixc^s,iw)=(sr(ixc^s,index_v_mag)*flc(ixc^s, iw)-sl(ixc^s,index_v_mag)*frc(ixc^s, iw) &
1124 +sr(ixc^s,index_v_mag)*sl(ixc^s,index_v_mag)*(wrc(ixc^s,iw)-wlc(ixc^s,iw)))/(sr(ixc^s,index_v_mag)-sl(ixc^s,index_v_mag))
1125 f1r(ixc^s,iw)=f1l(ixc^s,iw)
1126 f2l(ixc^s,iw)=f1l(ixc^s,iw)
1127 f2r(ixc^s,iw)=f1l(ixc^s,iw)
1129 f1l(ixc^s,iw)=flc(ixc^s,iw)+sl(ixc^s,index_v_mag)*(w1l(ixc^s,iw)-wlc(ixc^s,iw))
1130 f1r(ixc^s,iw)=frc(ixc^s,iw)+sr(ixc^s,index_v_mag)*(w1r(ixc^s,iw)-wrc(ixc^s,iw))
1131 f2l(ixc^s,iw)=f1l(ixc^s,iw)+s1l(ixc^s)*(w2l(ixc^s,iw)-w1l(ixc^s,iw))
1132 f2r(ixc^s,iw)=f1r(ixc^s,iw)+s1r(ixc^s)*(w2r(ixc^s,iw)-w1r(ixc^s,iw))
1137 {
do ix^db=ixcmin^db,ixcmax^db\}
1138 if(sl(ix^d,index_v_mag)>0.d0)
then
1139 fc(ix^d,iws:iwe,ip1)=flc(ix^d,iws:iwe)
1140 else if(s1l(ix^d)>=0.d0)
then
1141 fc(ix^d,iws:iwe,ip1)=f1l(ix^d,iws:iwe)
1142 else if(sm(ix^d)>=0.d0)
then
1143 fc(ix^d,iws:iwe,ip1)=f2l(ix^d,iws:iwe)
1144 else if(s1r(ix^d)>=0.d0)
then
1145 fc(ix^d,iws:iwe,ip1)=f2r(ix^d,iws:iwe)
1146 else if(sr(ix^d,index_v_mag)>=0.d0)
then
1147 fc(ix^d,iws:iwe,ip1)=f1r(ix^d,iws:iwe)
1148 else if(sr(ix^d,index_v_mag)<0.d0)
then
1149 fc(ix^d,iws:iwe,ip1)=frc(ix^d,iws:iwe)
1154 end subroutine get_riemann_flux_hlld_mag2
1157 subroutine get_hlld2_modif_c(w,x,ixI^L,ixO^L,csound)
1160 integer,
intent(in) :: ixI^L, ixO^L
1161 double precision,
intent(in) :: w(ixI^S, nw), x(ixI^S,1:ndim)
1162 double precision,
intent(out):: csound(ixI^S)
1163 double precision :: cfast2(ixI^S), AvMinCs2(ixI^S), b2(ixI^S), kmax
1164 double precision :: inv_rho(ixO^S), gamma_A2(ixO^S)
1165 integer :: rho_, p_, e_, mom(1:ndir), mag(1:ndir)
1173 inv_rho=1.d0/w(ixo^s,rho_)
1178 b2(ixo^s) = sum((w(ixo^s, mag(:))+
block%B0(ixo^s,:,
b0i))**2, dim=ndim+1)
1180 b2(ixo^s) = sum(w(ixo^s, mag(:))**2, dim=ndim+1)
1185 avmincs2= w(ixo^s, mag(idims))+
block%B0(ixo^s,idims,
b0i)
1187 avmincs2= w(ixo^s, mag(idims))
1191 csound(ixo^s) = sum(w(ixo^s, mom(:))**2, dim=ndim+1)
1193 cfast2(ixo^s) = b2(ixo^s) * inv_rho+csound(ixo^s)
1194 avmincs2(ixo^s) = cfast2(ixo^s)**2-4.0d0*csound(ixo^s) &
1195 * avmincs2(ixo^s)**2 &
1198 where(avmincs2(ixo^s)<zero)
1199 avmincs2(ixo^s)=zero
1202 avmincs2(ixo^s)=sqrt(avmincs2(ixo^s))
1204 csound(ixo^s) = sqrt(half*(cfast2(ixo^s)+avmincs2(ixo^s)))
1206 end subroutine get_hlld2_modif_c