11 integer :: i_rho, i_e, i_eaux
12 integer,
allocatable :: i_mom(:)
21 allocate(i_mom(1:
ndir))
29 integer,
intent(in) :: ii
30 integer,
intent(out) :: rho_, mom(1:ndir),e_,eaux_
38 i_mom(1:ndir) =
mom_c(1:ndir)
48 i_mom(1:ndir) =
mom_n(1:ndir)
73 integer,
intent(in) :: ixI^L,ixO^L,idim
74 double precision,
dimension(ixI^S,1:nw),
intent(in) :: wRC,wLC
75 double precision,
dimension(ixI^S,1:nwflux),
intent(in) :: fLC, fRC
76 integer ,
dimension(ixI^S),
intent(inout) :: patchf
78 integer :: ixOO^D,TxOO^L
82 {
do ixoo^d= ixo^lim^d\}
87 if(abs(patchf(ixoo^d)) == 1 .or. abs(patchf(ixoo^d)) == 4)
Then
88 if(any(frc(ixoo^d,1:nwflux)*flc(ixoo^d,1:nwflux)<-smalldouble))
Then
89 where(abs(patchf(txoo^s))==1)
99 whll,Fhll,lambdaCD,patchf)
107 integer,
intent(in) :: ixI^L,ixO^L,idim
108 double precision,
dimension(ixI^S,1:nw),
intent(in) :: wLC,wRC
109 double precision,
dimension(ixI^S,1:nwflux),
intent(in) :: fLC,fRC
110 double precision,
dimension(ixI^S),
intent(in) :: cmax,cmin
111 integer ,
dimension(ixI^S),
intent(inout) :: patchf
112 double precision,
dimension(ixI^S,1:nwflux),
intent(out) :: Fhll,whll
113 double precision,
dimension(ixI^S),
intent(out) :: lambdaCD
115 logical ,
dimension(ixI^S) :: Cond_patchf
116 double precision :: Epsilon
126 cond_patchf(ixo^s)=(abs(patchf(ixo^s))==1)
130 where(cond_patchf(ixo^s))
132 fhll(ixo^s,iw)= (cmax(ixo^s)*flc(ixo^s,iw)-cmin(ixo^s)*frc(ixo^s,iw) &
133 + cmin(ixo^s)*cmax(ixo^s)*(wrc(ixo^s,iw)-wlc(ixo^s,iw)))&
134 /(cmax(ixo^s)-cmin(ixo^s))
136 whll(ixo^s,iw) = (cmax(ixo^s)*wrc(ixo^s,iw)-cmin(ixo^s)*wlc(ixo^s,iw)&
137 +flc(ixo^s,iw)-frc(ixo^s,iw))/(cmax(ixo^s)-cmin(ixo^s))
142 where(cond_patchf(ixo^s))
143 lambdacd(ixo^s)=whll(ixo^s,i_mom(idim))/whll(ixo^s,i_rho)
146 {
do ix^db=ixomin^db,ixomax^db\}
147 if(cond_patchf(ix^d))
then
150 if(cmin(ix^d) < zero .and. lambdacd(ix^d)>zero&
151 .and.lambdacd(ix^d)<cmax(ix^d))
then
153 else if(cmax(ix^d) > zero .and. lambdacd(ix^d) < zero&
154 .and.lambdacd(ix^d)>cmin(ix^d))
then
156 else if(lambdacd(ix^d) >= cmax(ix^d) .or. &
157 lambdacd(ix^d) <= cmin(ix^d))
then
158 lambdacd(ix^d) = zero
165 where(patchf(ixo^s)== 3)
166 cond_patchf(ixo^s)=.false.
170 if(any(cond_patchf(ixo^s).and.lambdacd(ixo^s)==zero))
then
173 {
do ix^db=ixomin^db,ixomax^db\}
174 if(lambdacd(ix^d)==zero.and.cond_patchf(ix^d))
then
175 if(-cmin(ix^d)>=cmax(ix^d))
then
187 where(cond_patchf(ixo^s).and. &
188 dabs(lambdacd(ixo^s))/max(cmax(ixo^s),epsilon)< epsilon .and. &
189 dabs(lambdacd(ixo^s))/max(dabs(cmin(ixo^s)),epsilon)< epsilon)
190 lambdacd(ixo^s) = zero
196 subroutine twofl_get_wcd_n(wLC,wRC,whll,fRC,fLC,Fhll,patchf,lambdaCD,cmin,cmax,&
207 integer,
intent(in) :: ixI^L,ixO^L,idim
208 double precision,
dimension(ixI^S,1:nw),
intent(in) :: wRC,wLC
209 double precision,
dimension(ixI^S,1:nwflux),
intent(in):: whll, Fhll
210 double precision,
dimension(ixI^S),
intent(in) :: lambdaCD
211 double precision,
dimension(ixI^S),
intent(in) :: cmax,cmin
212 double precision,
dimension(ixI^S,1:nwflux),
intent(in):: fRC,fLC
213 double precision,
dimension(ixI^S,1:nwflux),
intent(out):: f
214 double precision,
dimension(ixI^S,1:nw) :: wCD,wSub
215 double precision,
dimension(ixI^S,1:nwflux) :: fSub
216 double precision,
dimension(ixI^S) :: vSub,cspeed,pCD
217 integer ,
dimension(ixI^S),
intent(in) :: patchf
219 double precision :: csmls
220 integer :: n, iw, ix^D
223 {
do ix^db=ixomin^db,ixomax^db\}
224 if(patchf(ix^d)==1)
then
225 cspeed(ix^d)=cmax(ix^d)
226 vsub(ix^d)=wrc(ix^d,i_mom(idim))/wrc(ix^d,i_rho)
227 wsub(ix^d,:)=wrc(ix^d,:)
228 fsub(ix^d,:)=frc(ix^d,:)
229 else if(patchf(ix^d)==-1)
then
230 cspeed(ix^d)=cmin(ix^d)
231 vsub(ix^d)=wlc(ix^d,i_mom(idim))/wlc(ix^d,i_rho)
232 wsub(ix^d,:)=wlc(ix^d,:)
233 fsub(ix^d,:)=flc(ix^d,:)
237 {
do ix^db=ixomin^db,ixomax^db\}
238 if(abs(patchf(ix^d))==1)
then
239 csmls=one/(cspeed(ix^d)-lambdacd(ix^d))
240 wcd(ix^d,i_rho) = wsub(ix^d,i_rho)&
241 *(cspeed(ix^d)-vsub(ix^d))*csmls
247 wcd(ix^d,i_mom(iw))=(cspeed(ix^d)*wsub(ix^d,i_mom(iw))-fsub(ix^d,i_mom(iw)))*csmls
250 wcd(ix^d,i_mom(iw)) = wcd(ix^d,i_rho) * lambdacd(ix^d)
254 pcd(ix^d) = wsub(ix^d,i_rho)*(cspeed(ix^d)-vsub(ix^d))&
255 *(lambdacd(ix^d)-vsub(ix^d))&
256 +fsub(ix^d,i_mom(idim))-wsub(ix^d,i_mom(idim))*vsub(ix^d)
258 wcd(ix^d,i_e) = (cspeed(ix^d)*wsub(ix^d,i_e) &
259 -fsub(ix^d,i_e)+lambdacd(ix^d)*pcd(ix^d))*csmls
263 f(ix^d,iw)=fsub(ix^d,iw)+cspeed(ix^d)*(wcd(ix^d,iw)-wsub(ix^d,iw))
278 integer,
intent(in) :: ixI^L,ixO^L,idim
279 double precision,
dimension(ixI^S,1:nw),
intent(in) :: wRC,wLC
280 double precision,
dimension(ixI^S,1:nwflux),
intent(in) :: fLC, fRC
281 integer,
dimension(ixI^S),
intent(inout) :: patchf
283 integer :: ixOO^D,TxOO^L
288 {
do ixoo^d= ixo^lim^d\}
293 if(abs(patchf(ixoo^d)) == 1 .or. abs(patchf(ixoo^d)) == 4)
Then
294 if(any(frc(ixoo^d,1:nwflux)*flc(ixoo^d,1:nwflux)<-smalldouble))
Then
295 where(abs(patchf(txoo^s))==1)
305 whll,Fhll,lambdaCD,patchf)
313 integer,
intent(in) :: ixI^L,ixO^L,idim
314 double precision,
dimension(ixI^S,1:nw),
intent(in) :: wLC,wRC
315 double precision,
dimension(ixI^S,1:nwflux),
intent(in):: fLC,fRC
316 double precision,
dimension(ixI^S),
intent(in) :: cmax,cmin
317 integer ,
dimension(ixI^S),
intent(inout) :: patchf
318 double precision,
dimension(ixI^S,1:nwflux),
intent(out) :: Fhll,whll
319 double precision,
dimension(ixI^S),
intent(out) :: lambdaCD
321 logical ,
dimension(ixI^S) :: Cond_patchf
322 double precision :: Epsilon
331 cond_patchf(ixo^s)=(abs(patchf(ixo^s))==1)
334 where(cond_patchf(ixo^s))
336 fhll(ixo^s,iw)= (cmax(ixo^s)*flc(ixo^s,iw)-cmin(ixo^s)*frc(ixo^s,iw) &
337 + cmin(ixo^s)*cmax(ixo^s)*(wrc(ixo^s,iw)-wlc(ixo^s,iw)))&
338 /(cmax(ixo^s)-cmin(ixo^s))
340 whll(ixo^s,iw) = (cmax(ixo^s)*wrc(ixo^s,iw)-cmin(ixo^s)*wlc(ixo^s,iw)&
341 +flc(ixo^s,iw)-frc(ixo^s,iw))/(cmax(ixo^s)-cmin(ixo^s))
346 where(cond_patchf(ixo^s))
347 lambdacd(ixo^s)=whll(ixo^s,i_mom(idim))/whll(ixo^s,i_rho)
351 where(cond_patchf(ixo^s))
354 where(cmin(ixo^s)<zero.and.lambdacd(ixo^s)>zero&
355 .and.lambdacd(ixo^s)<cmax(ixo^s))
357 elsewhere(cmax(ixo^s)>zero.and.lambdacd(ixo^s)<zero&
358 .and.lambdacd(ixo^s)>cmin(ixo^s))
360 elsewhere(lambdacd(ixo^s)>=cmax(ixo^s).or.lambdacd(ixo^s) <= cmin(ixo^s))
361 lambdacd(ixo^s) = zero
368 where(patchf(ixo^s)== 3)
369 cond_patchf(ixo^s)=.false.
374 if(any(lambdacd(ixo^s)==zero.and.cond_patchf(ixo^s)))
then
377 where(lambdacd(ixo^s)==zero.and.cond_patchf(ixo^s))
378 where(-cmin(ixo^s)>=cmax(ixo^s))
389 where(cond_patchf(ixo^s).and. &
390 dabs(lambdacd(ixo^s))/max(cmax(ixo^s),epsilon)< epsilon .and. &
391 dabs(lambdacd(ixo^s))/max(dabs(cmin(ixo^s)),epsilon)< epsilon)
392 lambdacd(ixo^s) = zero
398 subroutine twofl_get_wcd_c(wLC,wRC,whll,fRC,fLC,Fhll,patchf,lambdaCD,cmin,cmax,&
407 integer,
intent(in) :: ixI^L,ixO^L,idim
408 double precision,
dimension(ixI^S,1:nw),
intent(in) :: wRC,wLC
409 double precision,
dimension(ixI^S,1:nwflux),
intent(in):: whll, Fhll
410 double precision,
dimension(ixI^S),
intent(in) :: lambdaCD
411 double precision,
dimension(ixI^S),
intent(in) :: cmax,cmin
412 double precision,
dimension(ixI^S,1:nwflux),
intent(in):: fRC,fLC
413 double precision,
dimension(ixI^S,1:nwflux),
intent(out):: f
414 double precision,
dimension(ixI^S,1:nw) :: wCD,wSub
415 double precision,
dimension(ixI^S,1:nwflux) :: fSub
416 double precision,
dimension(ixI^S) :: vSub,cspeed,pCD,VdotBCD
417 integer ,
dimension(ixI^S),
intent(in) :: patchf
419 integer :: n, iw, idir,ix^D
420 double precision,
dimension(ixI^S) :: rho
424 {
do ix^db=ixomin^db,ixomax^db\}
425 if(patchf(ix^d)==1)
then
426 cspeed(ix^d)=cmax(ix^d)
427 vsub(ix^d)=wrc(ix^d,i_mom(idim))/wrc(ix^d,i_rho)
428 wsub(ix^d,:)=wrc(ix^d,:)
429 fsub(ix^d,:)=frc(ix^d,:)
430 else if(patchf(ix^d)==-1)
then
431 cspeed(ix^d)=cmin(ix^d)
432 vsub(ix^d)=wlc(ix^d,i_mom(idim))/wlc(ix^d,i_rho)
433 wsub(ix^d,:)=wlc(ix^d,:)
434 fsub(ix^d,:)=flc(ix^d,:)
438 {
do ix^db=ixomin^db,ixomax^db\}
439 if(abs(patchf(ix^d))==1)
then
440 wcd(ix^d,i_rho) = wsub(ix^d,i_rho)&
441 *(cspeed(ix^d)-vsub(ix^d))/(cspeed(ix^d)-lambdacd(ix^d))
451 wcd(ix^d,mag(idir)) = whll(ix^d,mag(idir))
457 wcd(ix^d,i_mom(iw))=(cspeed(ix^d)*wsub(ix^d,i_mom(iw))-fsub(ix^d,i_mom(iw))&
458 -wcd(ix^d,mag(idim))*wcd(ix^d,mag(iw)))/&
459 (cspeed(ix^d)-lambdacd(ix^d))
462 wcd(ix^d,i_mom(iw)) = wcd(ix^d,i_rho) * lambdacd(ix^d)
466 vdotbcd(ix^d) = sum(whll(ix^d,i_mom(:))*whll(ix^d,mag(:)))/whll(ix^d,i_rho)
468 pcd(ix^d) = wsub(ix^d,i_rho)*(cspeed(ix^d)-vsub(ix^d))&
469 *(lambdacd(ix^d)-vsub(ix^d))&
470 +fsub(ix^d,i_mom(idim))-wsub(ix^d,i_mom(idim))*vsub(ix^d)&
471 + wcd(ix^d,mag(idim))**2
473 wcd(ix^d,i_e) = (cspeed(ix^d)*wsub(ix^d,i_e) &
474 -fsub(ix^d,i_e)+lambdacd(ix^d)*pcd(ix^d)&
475 -vdotbcd(ix^d)*wcd(ix^d,mag(idim)))&
476 /(cspeed(ix^d)-lambdacd(ix^d))
482 if(iw == mag(idim))
then
484 else if(twofl_glm .and. iw == psi_)
then
487 where(abs(patchf(ixo^s))==1)
489 f(ixo^s,iw)=fsub(ixo^s,iw)+cspeed(ixo^s)*(wcd(ixo^s,iw)-wsub(ixo^s,iw))
This module contains definitions of global parameters and variables and some generic functions/subrou...
integer, dimension(3, 3) kr
Kronecker delta tensor.
integer, dimension(:), allocatable, parameter d
integer ndir
Number of spatial dimensions (components) for vector variables.
procedure(sub_get_wcd), pointer phys_get_wcd
procedure(sub_hllc_init_species), pointer phys_hllc_init_species
procedure(sub_get_lcd), pointer phys_get_lcd
procedure(sub_diffuse_hllcd), pointer phys_diffuse_hllcd
This module defines the procedures of a physics module. It contains function pointers for the various...
subroutine twofl_get_wcd_c(wLC, wRC, whll, fRC, fLC, Fhll, patchf, lambdaCD, cmin, cmax, ixIL, ixOL, idim, f)
subroutine twofl_get_wcd_n(wLC, wRC, whll, fRC, fLC, Fhll, patchf, lambdaCD, cmin, cmax, ixIL, ixOL, idim, f)
subroutine twofl_get_lcd_n(wLC, wRC, fLC, fRC, cmin, cmax, idim, ixIL, ixOL, whll, Fhll, lambdaCD, patchf)
subroutine twofl_get_lcd_c(wLC, wRC, fLC, fRC, cmin, cmax, idim, ixIL, ixOL, whll, Fhll, lambdaCD, patchf)
subroutine twofl_hllc_init_species(ii, rho_, mom, e_, eaux_)
subroutine, public twofl_hllc_init()
subroutine twofl_diffuse_hllcd_c(ixIL, ixOL, idim, wLC, wRC, fLC, fRC, patchf)
subroutine twofl_diffuse_hllcd_n(ixIL, ixOL, idim, wLC, wRC, fLC, fRC, patchf)
Magneto-hydrodynamics module.
integer, public e_c_
Index of the energy density (-1 if not present)
integer, dimension(:), allocatable, public mom_c
Indices of the momentum density.
integer, dimension(:), allocatable, public mom_n
integer, public rho_c_
Index of the density (in the w array)
integer, public eaux_c_
Indices of auxiliary internal energy.