21 subroutine mhd_diffuse_hllcd(ixI^L,ixO^L,idim,wLC,wRC,fLC,fRC,patchf)
29 integer,
intent(in) :: ixi^
l,ixo^
l,idim
30 double precision,
dimension(ixI^S,1:nw),
intent(in) :: wrc,wlc
31 double precision,
dimension(ixI^S,1:nwflux),
intent(in) :: flc, frc
32 integer,
dimension(ixI^S),
intent(inout) :: patchf
34 integer :: ixoo^
d,txoo^
l
39 {
do ixoo^
d= ixo^lim^
d\}
44 if(abs(patchf(ixoo^
d)) == 1 .or. abs(patchf(ixoo^
d)) == 4)
Then
45 if(any(frc(ixoo^
d,1:nwflux)*flc(ixoo^
d,1:nwflux)<-smalldouble))
Then
46 where(abs(patchf(txoo^s))==1)
53 end subroutine mhd_diffuse_hllcd
55 subroutine mhd_get_lcd(wLC,wRC,fLC,fRC,cmin,cmax,idim,ixI^L,ixO^L, &
56 whll,Fhll,lambdaCD,patchf)
62 integer,
intent(in) :: ixi^
l,ixo^
l,idim
63 double precision,
dimension(ixI^S,1:nw),
intent(in) :: wlc,wrc
64 double precision,
dimension(ixI^S,1:nwflux),
intent(in) :: flc,frc
65 double precision,
dimension(ixI^S),
intent(in) :: cmax,cmin
66 integer ,
dimension(ixI^S),
intent(inout) :: patchf
67 double precision,
dimension(ixI^S,1:nwflux),
intent(out) :: fhll,whll
68 double precision,
dimension(ixI^S),
intent(out) :: lambdacd
70 logical ,
dimension(ixO^S) :: cond_patchf
71 double precision :: epsilon
80 cond_patchf(ixo^s)=(abs(patchf(ixo^s))==1)
84 where(cond_patchf(ixo^s))
86 fhll(ixo^s,iw)= (cmax(ixo^s)*flc(ixo^s,iw)-cmin(ixo^s)*frc(ixo^s,iw) &
87 + cmin(ixo^s)*cmax(ixo^s)*(wrc(ixo^s,iw)-wlc(ixo^s,iw)))&
88 /(cmax(ixo^s)-cmin(ixo^s))
90 whll(ixo^s,iw) = (cmax(ixo^s)*wrc(ixo^s,iw)-cmin(ixo^s)*wlc(ixo^s,iw)&
91 +flc(ixo^s,iw)-frc(ixo^s,iw))/(cmax(ixo^s)-cmin(ixo^s))
96 where(cond_patchf(ixo^s))
97 lambdacd(ixo^s)=whll(ixo^s,
mom(idim))/whll(ixo^s,
rho_)
100 {
do ix^db=ixomin^db,ixomax^db\}
101 if(cond_patchf(ix^
d))
then
104 if(cmin(ix^
d)<zero.and.lambdacd(ix^
d)>zero&
105 .and.lambdacd(ix^
d)<cmax(ix^
d))
then
107 else if(cmax(ix^
d)>zero.and.lambdacd(ix^
d)<zero&
108 .and.lambdacd(ix^
d)>cmin(ix^
d))
then
110 else if(lambdacd(ix^
d)>=cmax(ix^
d).or.lambdacd(ix^
d) <= cmin(ix^
d))
then
111 lambdacd(ix^
d) = zero
118 where(patchf(ixo^s)== 3)
119 cond_patchf(ixo^s)=.false.
123 if(any(lambdacd(ixo^s)==zero.and.cond_patchf(ixo^s)))
then
126 {
do ix^db=ixomin^db,ixomax^db\}
127 if(lambdacd(ix^d)==zero.and.cond_patchf(ix^d))
then
128 if(-cmin(ix^d)>=cmax(ix^d))
then
140 where(cond_patchf(ixo^s).and. &
141 dabs(lambdacd(ixo^s))/max(cmax(ixo^s),epsilon)< epsilon .and. &
142 dabs(lambdacd(ixo^s))/max(dabs(cmin(ixo^s)),epsilon)< epsilon)
143 lambdacd(ixo^s) = zero
147 end subroutine mhd_get_lcd
149 subroutine mhd_get_wcd(wLC,wRC,whll,fRC,fLC,Fhll,patchf,lambdaCD,cmin,cmax,&
158 integer,
intent(in) :: ixi^
l,ixo^
l,idim
159 double precision,
dimension(ixI^S,1:nw),
intent(in) :: wrc,wlc
160 double precision,
dimension(ixI^S,1:nwflux),
intent(in):: whll, fhll
161 double precision,
dimension(ixI^S),
intent(in) :: lambdacd
162 double precision,
dimension(ixI^S),
intent(in) :: cmax,cmin
163 double precision,
dimension(ixI^S,1:nwflux),
intent(in):: frc,flc
164 double precision,
dimension(ixI^S,1:nwflux),
intent(out):: f
165 double precision,
dimension(ixI^S,1:nw) :: wcd,wsub
166 double precision,
dimension(ixI^S,1:nwflux) :: fsub
167 double precision,
dimension(ixI^S) :: vsub,cspeed,pcd,vdotbcd
168 integer ,
dimension(ixI^S),
intent(in) :: patchf
170 integer :: n, iw, idir,ix^
d
173 {
do ix^db=ixomin^db,ixomax^db\}
174 if(patchf(ix^
d)==1)
then
175 cspeed(ix^
d)=cmax(ix^
d)
176 vsub(ix^
d)=wrc(ix^
d,mom(idim))/wrc(ix^
d,rho_)
177 wsub(ix^
d,:)=wrc(ix^
d,:)
178 fsub(ix^
d,:)=frc(ix^
d,:)
179 else if(patchf(ix^
d)==-1)
then
180 cspeed(ix^
d)=cmin(ix^
d)
181 vsub(ix^
d)=wlc(ix^
d,mom(idim))/wlc(ix^
d,rho_)
182 wsub(ix^
d,:)=wlc(ix^
d,:)
183 fsub(ix^
d,:)=flc(ix^
d,:)
187 {
do ix^db=ixomin^db,ixomax^db\}
188 if(abs(patchf(ix^d))==1)
then
189 wcd(ix^d,rho_) = wsub(ix^d,rho_)&
190 *(cspeed(ix^d)-vsub(ix^d))/(cspeed(ix^d)-lambdacd(ix^d))
193 wcd(ix^d,iw) = wsub(ix^d,iw)*(cspeed(ix^d)-vsub(ix^d))&
194 /(cspeed(ix^d)-lambdacd(ix^d))
199 wcd(ix^d,mag(idir)) = whll(ix^d,mag(idir))
205 wcd(ix^d,mom(iw))=(cspeed(ix^d)*wsub(ix^d,mom(iw))-fsub(ix^d,mom(iw))&
206 -wcd(ix^d,mag(idim))*wcd(ix^d,mag(iw)))/&
207 (cspeed(ix^d)-lambdacd(ix^d))
210 wcd(ix^d,mom(iw)) = wcd(ix^d,rho_) * lambdacd(ix^d)
214 vdotbcd(ix^d) = sum(whll(ix^d,mom(:))*whll(ix^d,mag(:)))/whll(ix^d,rho_)
216 pcd(ix^d) = wsub(ix^d,rho_)*(cspeed(ix^d)-vsub(ix^d))&
217 *(lambdacd(ix^d)-vsub(ix^d))&
218 +fsub(ix^d,mom(idim))-wsub(ix^d,mom(idim))*vsub(ix^d)&
219 + wcd(ix^d,mag(idim))**2
221 wcd(ix^d,e_) = (cspeed(ix^d)*wsub(ix^d,e_) &
222 -fsub(ix^d,e_)+lambdacd(ix^d)*pcd(ix^d)&
223 -vdotbcd(ix^d)*wcd(ix^d,mag(idim)))&
224 /(cspeed(ix^d)-lambdacd(ix^d))
230 if(iw == mag(idim))
then
232 else if(mhd_glm .and. iw == psi_)
then
235 where(abs(patchf(ixo^s))==1)
237 f(ixo^s,iw)=fsub(ixo^s,iw)+cspeed(ixo^s)*(wcd(ixo^s,iw)-wsub(ixo^s,iw))
242 end subroutine mhd_get_wcd
integer, dimension(:), allocatable, public mag
Indices of the magnetic field.
This module contains definitions of global parameters and variables and some generic functions/subrou...
integer, dimension(3, 3) kr
Kronecker delta tensor.
double precision, dimension(:), allocatable, parameter d
subroutine, public mhd_hllc_init()
Magneto-hydrodynamics module.
integer, dimension(:), allocatable, public, protected mom
Indices of the momentum density.
integer, public, protected rho_
Index of the density (in the w array)
procedure(sub_get_wcd), pointer phys_get_wcd
procedure(sub_get_lcd), pointer phys_get_lcd
procedure(sub_diffuse_hllcd), pointer phys_diffuse_hllcd