MPI-AMRVAC 3.2
The MPI - Adaptive Mesh Refinement - Versatile Advection Code (development version)
Loading...
Searching...
No Matches
mod_ppm.t
Go to the documentation of this file.
1module mod_ppm
2
3 implicit none
4 private
5
6 public :: ppmlimiter
7 public :: ppmlimitervar
8
9contains
10
11 subroutine ppmlimitervar(ixI^L,ix^L,idims,q,qCT,qLC,qRC)
12
13 ! references:
14 ! Mignone et al 2005, ApJS 160, 199,
15 ! Miller and Colella 2002, JCP 183, 26
16 ! Fryxell et al. 2000 ApJ, 131, 273 (Flash)
17 ! baciotti Phd (http://www.aei.mpg.de/~baiotti/Baiotti_PhD.pdf)
18 ! old version : april 2009
19 ! author: zakaria.meliani@wis.kuleuven.be
20 ! current version : March 2023 by Chun Xia
21
23
24 integer, intent(in) :: ixi^l, ix^l, idims
25 double precision, intent(in) :: q(ixi^s),qct(ixi^s)
26
27 double precision, intent(inout) :: qrc(ixi^s),qlc(ixi^s)
28
29 double precision,dimension(ixI^S) :: dqc,d2qc,ldq
30 double precision,dimension(ixI^S) :: qmin,qmax,tmp
31
32 integer :: lxc^l,lxr^l,lxl^l
33 integer :: ixl^l,ixo^l,ixr^l,ixol^l,ixor^l
34 integer :: hxl^l,hxc^l,hxr^l
35 integer :: kxl^l,kxc^l,kxr^l
36
37 ixomin^d=ixmin^d-kr(idims,^d);ixomax^d=ixmax^d+kr(idims,^d);!ixO[ixMmin-1,ixMmax+1]
38 ixolmin^d=ixomin^d-kr(idims,^d);ixolmax^d=ixomax^d; !ixOL[ixMmin-2,ixMmax+1]
39 ixor^l=ixol^l+kr(idims,^d); !ixOR=[iMmin-1,ixMmax+2]
40 ixl^l=ixo^l-kr(idims,^d); !ixL[ixMmin-2,ixMmax]
41 ixr^l=ixo^l+kr(idims,^d); !ixR=[iMmin,ixMmax+2]
42
43 hxcmin^d=ixomin^d;hxcmax^d=ixmax^d; ! hxC = [ixMmin-1,ixMmax]
44 hxl^l=hxc^l-kr(idims,^d); ! hxL = [ixMmin-2,ixMmax-1]
45 hxr^l=hxc^l+kr(idims,^d); ! hxR = [ixMmin,ixMmax+1]
46
47 kxcmin^d=ixlmin^d-1; kxcmax^d=ixrmax^d; ! kxC=[iMmin-3,ixMmax+2]
48 kxr^l=kxc^l+kr(idims,^d); ! kxR=[iMmin-2,ixMmax+3]
49
50 lxcmin^d=ixomin^d-kr(idims,^d);lxcmax^d=ixomax^d+kr(idims,^d);! lxC=[iMmin-2,ixMmax+2]
51 lxl^l=lxc^l-kr(idims,^d); ! lxL=[iMmin-3,ixMmax+1]
52 lxr^l=lxc^l+kr(idims,^d); ! lxR=[iMmin-1,ixMmax+3]
53
54 dqc(kxc^s)=q(kxr^s)-q(kxc^s)
55 ! Eq. 64, Miller and Colella 2002, JCP 183, 26
56 d2qc(kxc^s)=half*(q(lxr^s)-q(lxl^s))
57 where(dqc(lxc^s)*dqc(lxl^s)>zero)
58 ! Store the sign of dwC in wMin
59 qmin(kxc^s)= sign(one,d2qc(lxc^s))
60 ! Eq. 65, Miller and Colella 2002, JCP 183, 26
61 ldq(lxc^s)= qmin(lxc^s)*min(dabs(d2qc(lxc^s)),&
62 2.0d0*dabs(dqc(lxl^s)),&
63 2.0d0*dabs(dqc(lxc^s)))
64 else where
65 ldq(lxc^s)=zero
66 end where
67
68 ! Eq. 66, Miller and Colella 2002, JCP 183, 26
69 qlc(ixol^s)=qlc(ixol^s)+half*dqc(ixol^s)&
70 +(ldq(ixol^s)-ldq(ixor^s))/6.0d0
71 qrc(ixl^s)=qlc(ixl^s)
72
73 ! make sure that min wCT(i)<wLC(i)<wCT(i+1) same for wRC(i)
74 call extremaq(ixi^l,ixo^l,qct,1,qmax,qmin)
75
76 ! Eq. B8, page 217, Mignone et al 2005, ApJS
77 qrc(ixl^s)=max(qmin(ixo^s),min(qmax(ixo^s),qrc(ixl^s)))
78 qlc(ixo^s)=max(qmin(ixo^s),min(qmax(ixo^s),qlc(ixo^s)))
79
80 ! Eq. B9, page 217, Mignone et al 2005, ApJS
81 where((qrc(ixl^s)-qct(ixo^s))*(qct(ixo^s)-qlc(ixo^s))<=zero)
82 qrc(ixl^s)=qct(ixo^s)
83 qlc(ixo^s)=qct(ixo^s)
84 end where
85
86 qmax(ixo^s)=(qlc(ixo^s)-qrc(ixl^s))&
87 *(qct(ixo^s)-half*(qlc(ixo^s)+qrc(ixl^s)))
88 qmin(ixo^s)=(qlc(ixo^s)-qrc(ixl^s))**2/6.0d0
89
90 tmp(hxl^s)=qrc(hxl^s)
91 ! Eq. B10, page 218, Mignone et al 2005, ApJS
92 where(qmax(hxr^s)>qmin(hxr^s))
93 qrc(hxc^s)= 3.0d0*qct(hxr^s)-2.0d0*qlc(hxr^s)
94 end where
95 ! Eq. B11, page 218, Mignone et al 2005, ApJS
96 where(qmax(hxc^s)<-qmin(hxc^s))
97 qlc(hxc^s)= 3.0d0*qct(hxc^s)-2.0d0*tmp(hxl^s)
98 end where
99
100 end subroutine ppmlimitervar
101
102 subroutine ppmlimiter(ixI^L,ix^L,idims,w,wCT,wLC,wRC)
103
104 ! references:
105 ! Mignone et al 2005, ApJS 160, 199,
106 ! Miller and Colella 2002, JCP 183, 26
107 ! Fryxell et al. 2000 ApJ, 131, 273 (Flash)
108 ! baciotti Phd (http://www.aei.mpg.de/~baiotti/Baiotti_PhD.pdf)
109 ! old version : april 2009
110 ! author: zakaria.meliani@wis.kuleuven.be
111 ! current version : March 2023 by Chun Xia
113
114 integer, intent(in) :: ixi^l, ix^l, idims
115 double precision, intent(in) :: w(ixi^s,1:nw),wct(ixi^s,1:nw)
116
117 double precision, intent(inout) :: wrc(ixi^s,1:nw),wlc(ixi^s,1:nw)
118
119 double precision,dimension(ixI^S,1:nwflux) :: dwc,d2wc,ldw
120 double precision,dimension(ixI^S,1:nwflux) :: wmin,wmax,tmp
121 double precision,dimension(ixI^S) :: aa, ab, ac, ki
122
123 double precision, parameter :: betamin=0.75d0, betamax=0.85d0,&
124 zmin=0.25d0, zmax=0.75d0,&
125 eta1=20.0d0,eta2=0.05d0,eps=0.01d0,kappa=0.1d0
126 integer :: lxc^l,lxl^l,lxr^l
127 integer :: ixll^l,ixl^l,ixo^l,ixr^l,ixrr^l,ixol^l,ixor^l
128 integer :: hxl^l,hxc^l,hxr^l
129 integer :: kxll^l,kxl^l,kxc^l,kxr^l,kxrr^l
130 integer :: iw, idimss
131
132 ixomin^d=ixmin^d-kr(idims,^d);ixomax^d=ixmax^d+kr(idims,^d);!ixO[ixMmin-1,ixMmax+1]
133 ixolmin^d=ixomin^d-kr(idims,^d);ixolmax^d=ixomax^d; !ixOL[ixMmin-2,ixMmax+1]
134 ixor^l=ixol^l+kr(idims,^d); !ixOR=[iMmin-1,ixMmax+2]
135 ixl^l=ixo^l-kr(idims,^d); !ixL[ixMmin-2,ixMmax]
136 ixr^l=ixo^l+kr(idims,^d); !ixR=[iMmin,ixMmax+2]
137
138 hxcmin^d=ixomin^d;hxcmax^d=ixmax^d; ! hxC = [ixMmin-1,ixMmax]
139 hxl^l=hxc^l-kr(idims,^d); ! hxL = [ixMmin-2,ixMmax-1]
140 hxr^l=hxc^l+kr(idims,^d); ! hxR = [ixMmin,ixMmax+1]
141
142 kxcmin^d=ixlmin^d-kr(idims,^d); kxcmax^d=ixrmax^d; ! kxC=[iMmin-3,ixMmax+2]
143 kxr^l=kxc^l+kr(idims,^d); ! kxR=[iMmin-2,ixMmax+3]
144
145 lxcmin^d=ixomin^d-kr(idims,^d);lxcmax^d=ixomax^d+kr(idims,^d);! lxC=[iMmin-2,ixMmax+2]
146 lxl^l=lxc^l-kr(idims,^d); ! lxL=[iMmin-3,ixMmax+1]
147 lxr^l=lxc^l+kr(idims,^d); ! lxR=[iMmin-1,ixMmax+3]
148
149 dwc(kxc^s,1:nwflux)=w(kxr^s,1:nwflux)-w(kxc^s,1:nwflux)
150 ! Eq. 64, Miller and Colella 2002, JCP 183, 26
151 d2wc(lxc^s,1:nwflux)=half*(w(lxr^s,1:nwflux)-w(lxl^s,1:nwflux))
152 where(dwc(lxc^s,1:nwflux)*dwc(lxl^s,1:nwflux)>zero)
153 ! Store the sign of dwC in wMin
154 wmin(lxc^s,1:nwflux)= sign(one,d2wc(lxc^s,1:nwflux))
155 ! Eq. 65, Miller and Colella 2002, JCP 183, 26
156 ldw(lxc^s,1:nwflux)= wmin(lxc^s,1:nwflux)*min(dabs(d2wc(lxc^s,1:nwflux)),&
157 2.0d0*dabs(dwc(lxl^s,1:nwflux)),&
158 2.0d0*dabs(dwc(lxc^s,1:nwflux)))
159 else where
160 ldw(lxc^s,1:nwflux)=zero
161 end where
162
163 ! Eq. 66, Miller and Colella 2002, JCP 183, 26
164 wlc(ixol^s,1:nwflux)=wlc(ixol^s,1:nwflux)+half*dwc(ixol^s,1:nwflux)&
165 +(ldw(ixol^s,1:nwflux)-ldw(ixor^s,1:nwflux))/6.0d0
166 wrc(ixl^s,1:nwflux)=wlc(ixl^s,1:nwflux)
167
168 ! make sure that min w(i)<wLC(i)<w(i+1) same for wRC(i)
169 call extremaw(ixi^l,ixo^l,w,1,wmax,wmin)
170
171 ! Eq. B8, page 217, Mignone et al 2005, ApJS
172 wrc(ixl^s,1:nwflux)=max(wmin(ixo^s,1:nwflux)&
173 ,min(wmax(ixo^s,1:nwflux),wrc(ixl^s,1:nwflux)))
174 wlc(ixo^s,1:nwflux)=max(wmin(ixo^s,1:nwflux)&
175 ,min(wmax(ixo^s,1:nwflux),wlc(ixo^s,1:nwflux)))
176
177 ! Eq. B9, page 217, Mignone et al 2005, ApJS
178 where((wrc(ixl^s,1:nwflux)-wct(ixo^s,1:nwflux))&
179 *(wct(ixo^s,1:nwflux)-wlc(ixo^s,1:nwflux))<=zero)
180 wrc(ixl^s,1:nwflux)=wct(ixo^s,1:nwflux)
181 wlc(ixo^s,1:nwflux)=wct(ixo^s,1:nwflux)
182 end where
183
184 wmax(ixo^s,1:nwflux)=(wlc(ixo^s,1:nwflux)-wrc(ixl^s,1:nwflux))*&
185 (wct(ixo^s,1:nwflux)-half*(wlc(ixo^s,1:nwflux)+wrc(ixl^s,1:nwflux)))
186 wmin(ixo^s,1:nwflux)=(wlc(ixo^s,1:nwflux)-wrc(ixl^s,1:nwflux))**2/6.0d0
187 tmp(hxl^s,1:nwflux)=wrc(hxl^s,1:nwflux)
188 ! Eq. B10, page 218, Mignone et al 2005, ApJS
189 where(wmax(hxr^s,1:nwflux)>wmin(hxr^s,1:nwflux))
190 wrc(hxc^s,1:nwflux)= 3.0d0*wct(hxr^s,1:nwflux)&
191 -2.0d0*wlc(hxr^s,1:nwflux)
192 end where
193 ! Eq. B11, page 218, Mignone et al 2005, ApJS
194 where(wmax(hxc^s,1:nwflux)<-wmin(hxc^s,1:nwflux))
195 wlc(hxc^s,1:nwflux)= 3.0d0*wct(hxc^s,1:nwflux)&
196 -2.0d0*tmp(hxl^s,1:nwflux)
197 end where
198
199 ! flattening at the contact discontinuities
200 if(flatcd)then
201 ixrr^l=ixr^l+kr(idims,^d); !ixRR=[iMmin+1,ixMmax+3]
202 kxl^l=kxc^l-kr(idims,^d); ! kxL=[iMmin-4,ixMmax+1]
203 ! d2wC above is assigned only over lxC, but ppm_flatcd reads it over kxC, which
204 ! reaches one plane further down (kxCmin = ixOmin-2, lxCmin = ixOmin-1). That plane
205 ! was never written, so the contact-flattening detector was fed uninitialised memory.
206 ! Re-derive it over kxC here. The extra plane needs w at kxCmin-1, which is in range
207 ! only because flatcd forces nghostcells>=4 (mod_input_output.t), so this stays
208 ! inside the flatcd branch.
209 d2wc(kxc^s,1:nwflux)=half*(w(kxr^s,1:nwflux)-w(kxl^s,1:nwflux))
210 call ppm_flatcd(ixi^l,kxc^l,kxl^l,kxr^l,wct,d2wc,aa,ab)
211 if(any(kappa*aa(kxc^s)>=ab(kxc^s)))then
212 do iw=1,nwflux
213 where(kappa*aa(kxc^s)>=ab(kxc^s).and. dabs(dwc(kxc^s,iw))>smalldouble)
214 wmax(kxc^s,iw) = wct(kxr^s,iw)-2.0d0*wct(kxc^s,iw)+wct(kxl^s,iw)
215 end where
216
217 where(wmax(ixr^s,iw)*wmax(ixl^s,iw)<zero .and.&
218 dabs(wct(ixr^s,iw)-wct(ixl^s,iw))&
219 -eps*min(dabs(wct(ixr^s,iw)),dabs(wct(ixl^s,iw)))>zero &
220 .and. kappa*aa(ixo^s)>=ab(ixo^s)&
221 .and. dabs(dwc(ixo^s,iw))>smalldouble)
222
223 ac(ixo^s)=(wct(ixll^s,iw)-wct(ixrr^s,iw)+4.0d0*dwc(ixo^s,iw))&
224 /(12.0d0*dwc(ixo^s,iw))
225 wmin(ixo^s,iw)=max(zero,min(eta1*(ac(ixo^s)-eta2),one))
226 else where
227 wmin(ixo^s,iw)=zero
228 end where
229
230 where(wmin(hxc^s,iw)>zero)
231 wlc(hxc^s,iw) = wlc(hxc^s,iw)*(one-wmin(hxc^s,iw))&
232 +(wct(hxc^s,iw)+half*ldw(hxc^s,iw))*wmin(hxc^s,iw)
233 end where
234 where(wmin(hxr^s,iw)>zero)
235 wrc(hxc^s,iw) = wrc(hxc^s,iw)*(one-wmin(hxr^s,iw))&
236 +(wct(hxr^s,iw)-half*ldw(hxr^s,iw))*wmin(hxr^s,iw)
237 end where
238 end do
239 end if
240 end if
241
242 ! flattening at the shocks
243 if(flatsh)then
244 ! following MILLER and COLELLA 2002 JCP 183, 26
245 kxcmin^d=ixmin^d-2; kxcmax^d=ixmax^d+2; ! kxC=[ixMmin-2,ixMmax+2]
246 ki=bigdouble
247 do idimss=1,ndim
248 kxl^l=kxc^l-kr(idimss,^d); ! kxL=[ixMmin-3,ixMmax+1]
249 kxr^l=kxc^l+kr(idimss,^d); ! kxR=[ixMmin-1,ixMmax+3]
250 kxll^l=kxl^l-kr(idimss,^d);! kxLL=[ixMmin-4,ixMmax]
251 kxrr^l=kxr^l+kr(idimss,^d);! kxRR=[ixMmin,ixMmax+4]
252
253 call ppm_flatsh(ixi^l,kxc^l,kxll^l,kxl^l,kxr^l,kxrr^l,idimss,wct,aa,ab)
254
255 ! eq. B17, page 218, Mignone et al 2005, ApJS (Xi1 min)
256 ac(kxc^s) = max(zero,min(one,(betamax-aa(kxc^s))/(betamax-betamin)))
257 ! eq. B18, page 218, Mignone et al 2005, ApJS (Xi1)
258 ! recycling aa(ixL^S)
259 where(wct(kxr^s,iw_mom(idimss))<wct(kxl^s,iw_mom(idimss)))
260 aa(kxc^s) = max(ac(kxc^s), min(one,(zmax-ab(kxc^s))/(zmax-zmin)))
261 else where
262 aa(kxc^s) = one
263 end where
264 ixl^l=ixo^l-kr(idimss,^d); ! ixL=[ixMmin-2,ixMmax]
265 ixr^l=ixo^l+kr(idimss,^d); ! ixR=[ixMmin,ixMmax+2]
266 ki(ixo^s)=min(ki(ixo^s),aa(ixl^s),aa(ixo^s),aa(ixr^s))
267 end do
268 ! Eq. B12/B13, page 217, Mignone et al 2005, ApJS:
269 ! q_L -> chi*q_L + (1-chi)*qbar , q_R -> chi*q_R + (1-chi)*qbar
270 ! with chi the flattening parameter of eq. B14, i.e. the minimum of the
271 ! one-dimensional chi~ of eq. B17/B18 over the neighbouring zones. That is exactly
272 ! what ki holds. This used to blend with ab instead -- the raw shock-strength
273 ! measure returned by ppm_flatsh, which is not a weight in [0,1]: on smooth data
274 ! it runs 1e-4 to 0.09, so every cell was flattened by >90% toward its own
275 ! average. Measured on an Alfven wave over one period with flatsh enabled, that
276 ! left the scheme not converging at all -- L1 fell by 17% between 32 and 256
277 ! cells, an observed order of 0.0 to 0.2 -- against second order once ki is used
278 ! (1.9, 1.7, 2.1 over the same refinements). ki was computed and never read.
279 ! recycling wMax
280 do iw=1,nwflux
281 where(dabs(ki(ixo^s)-one)>smalldouble)
282 wmax(ixo^s,iw) = (one-ki(ixo^s))*wct(ixo^s,iw)
283 end where
284
285 where(dabs(ki(hxc^s)-one)>smalldouble)
286 wlc(hxc^s,iw) = ki(hxc^s)*wlc(hxc^s,iw)+wmax(hxc^s,iw)
287 end where
288
289 where(dabs(ki(hxr^s)-one)>smalldouble)
290 wrc(hxc^s,iw) = ki(hxr^s)*wrc(hxc^s,iw)+wmax(hxr^s,iw)
291 end where
292 end do
293 end if
294
295 end subroutine ppmlimiter
296
297 subroutine ppm_flatcd(ixI^L,ixO^L,ixL^L,ixR^L,w,d2w,drho,dp)
299 use mod_physics, only: phys_gamma
300
301 integer, intent(in) :: ixi^l, ixo^l, ixl^l, ixr^l
302 double precision, intent(in) :: w(ixi^s, nw), d2w(ixg^t, 1:nwflux)
303 double precision, intent(inout) :: drho(ixg^t), dp(ixg^t)
304
305 drho(ixo^s) = phys_gamma*abs(d2w(ixo^s, iw_rho))&
306 /min(w(ixl^s, iw_rho), w(ixr^s, iw_rho))
307 dp(ixo^s) = abs(d2w(ixo^s, iw_e))/min(w(ixl^s, iw_e), w(ixr^s, iw_e))
308
309 end subroutine ppm_flatcd
310
311 subroutine ppm_flatsh(ixI^L,ixO^L,ixLL^L,ixL^L,ixR^L,ixRR^L,idims,w,drho,dp)
313 use mod_physics, only: phys_gamma
314
315 integer, intent(in) :: ixi^l, ixo^l, ixll^l, ixl^l, ixr^l, ixrr^l
316 integer, intent(in) :: idims
317 double precision, intent(in) :: w(ixi^s, nw)
318 double precision, intent(inout) :: drho(ixi^s), dp(ixi^s)
319
320 ! eq. B15, page 218, Mignone and Bodo 2005, ApJS (beta1)
321 where (abs(w(ixrr^s, iw_e)-w(ixll^s, iw_e))>smalldouble)
322 drho(ixo^s) = abs((w(ixr^s, iw_e)-w(ixl^s, iw_e))&
323 /(w(ixrr^s, iw_e)-w(ixll^s, iw_e)))
324 else where
325 drho(ixo^s) = zero
326 end where
327
328 ! eq. 76, page 48, Miller and Colella 2002, JCoPh, adjusted
329 dp(ixo^s) = abs(w(ixr^s, iw_e)-w(ixl^s, iw_e))&
330 /(phys_gamma*(w(ixr^s, iw_e)+w(ixl^s, iw_e)))
331
332 end subroutine ppm_flatsh
333
334 subroutine extremaq(ixI^L,ixO^L,q,nshift,qMax,qMin)
335
337
338 integer,intent(in) :: ixi^l,ixo^l
339 double precision, intent(in) :: q(ixi^s)
340 integer,intent(in) :: nshift
341
342 double precision, intent(out) :: qmax(ixi^s),qmin(ixi^s)
343
344 integer :: ixs^l,ixsr^l,ixsl^l,idims,jdims,kdims,ishift,i,j
345
346 do ishift=1,nshift
347 idims=1
348 ixsr^l=ixo^l+ishift*kr(idims,^d);
349 ixsl^l=ixo^l-ishift*kr(idims,^d);
350 if (ishift==1) then
351 qmax(ixo^s)=max(q(ixo^s),q(ixsr^s),q(ixsl^s))
352 qmin(ixo^s)=min(q(ixo^s),q(ixsr^s),q(ixsl^s))
353 else
354 qmax(ixo^s)=max(qmax(ixo^s),q(ixsr^s),q(ixsl^s))
355 qmin(ixo^s)=min(qmin(ixo^s),q(ixsr^s),q(ixsl^s))
356 end if
357 {^nooned
358 idims=1
359 jdims=idims+1
360 do i=-1,1
361 ixs^l=ixo^l+i*ishift*kr(idims,^d);
362 ixsr^l=ixs^l+ishift*kr(jdims,^d);
363 ixsl^l=ixs^l-ishift*kr(jdims,^d);
364 qmax(ixo^s)=max(qmax(ixo^s),q(ixsr^s),q(ixsl^s))
365 qmin(ixo^s)=min(qmin(ixo^s),q(ixsr^s),q(ixsl^s))
366 end do
367 }
368 {^ifthreed
369 idims=1
370 jdims=idims+1
371 kdims=jdims+1
372 do i=-1,1
373 ixs^l=ixo^l+i*ishift*kr(idims,^d);
374 do j=-1,1
375 ixs^l=ixo^l+j*ishift*kr(jdims,^d);
376 ixsr^l=ixs^l+ishift*kr(kdims,^d);
377 ixsl^l=ixs^l-ishift*kr(kdims,^d);
378 qmax(ixo^s)=max(qmax(ixo^s),q(ixsr^s),q(ixsl^s))
379 qmin(ixo^s)=min(qmin(ixo^s),q(ixsr^s),q(ixsl^s))
380 end do
381 end do
382 }
383 enddo
384
385 end subroutine extremaq
386
387 subroutine extremaw(ixI^L,ixO^L,w,nshift,wMax,wMin)
389
390 integer,intent(in) :: ixi^l,ixo^l
391 double precision, intent(in) :: w(ixi^s,1:nw)
392 integer,intent(in) :: nshift
393
394 double precision, intent(out) :: wmax(ixi^s,1:nwflux),wmin(ixi^s,1:nwflux)
395
396 integer :: ixs^l,ixsr^l,ixsl^l,idims,jdims,kdims,ishift,i,j
397
398 do ishift=1,nshift
399 idims=1
400 ixsr^l=ixo^l+ishift*kr(idims,^d);
401 ixsl^l=ixo^l-ishift*kr(idims,^d);
402 if (ishift==1) then
403 wmax(ixo^s,1:nwflux)= &
404 max(w(ixo^s,1:nwflux),w(ixsr^s,1:nwflux),w(ixsl^s,1:nwflux))
405 wmin(ixo^s,1:nwflux)= &
406 min(w(ixo^s,1:nwflux),w(ixsr^s,1:nwflux),w(ixsl^s,1:nwflux))
407 else
408 wmax(ixo^s,1:nwflux)= &
409 max(wmax(ixo^s,1:nwflux),w(ixsr^s,1:nwflux),w(ixsl^s,1:nwflux))
410 wmin(ixo^s,1:nwflux)= &
411 min(wmin(ixo^s,1:nwflux),w(ixsr^s,1:nwflux),w(ixsl^s,1:nwflux))
412 end if
413 {^nooned
414 idims=1
415 jdims=idims+1
416 do i=-1,1
417 ixs^l=ixo^l+i*ishift*kr(idims,^d);
418 ixsr^l=ixs^l+ishift*kr(jdims,^d);
419 ixsl^l=ixs^l-ishift*kr(jdims,^d);
420 wmax(ixo^s,1:nwflux)= &
421 max(wmax(ixo^s,1:nwflux),w(ixsr^s,1:nwflux),w(ixsl^s,1:nwflux))
422 wmin(ixo^s,1:nwflux)= &
423 min(wmin(ixo^s,1:nwflux),w(ixsr^s,1:nwflux),w(ixsl^s,1:nwflux))
424 end do
425 }
426 {^ifthreed
427 idims=1
428 jdims=idims+1
429 kdims=jdims+1
430 do i=-1,1
431 ixs^l=ixo^l+i*ishift*kr(idims,^d);
432 do j=-1,1
433 ixs^l=ixo^l+j*ishift*kr(jdims,^d);
434 ixsr^l=ixs^l+ishift*kr(kdims,^d);
435 ixsl^l=ixs^l-ishift*kr(kdims,^d);
436 wmax(ixo^s,1:nwflux)= &
437 max(wmax(ixo^s,1:nwflux),w(ixsr^s,1:nwflux),w(ixsl^s,1:nwflux))
438 wmin(ixo^s,1:nwflux)= &
439 min(wmin(ixo^s,1:nwflux),w(ixsr^s,1:nwflux),w(ixsl^s,1:nwflux))
440 end do
441 end do
442 }
443 enddo
444
445 end subroutine extremaw
446
447end module mod_ppm
This module contains definitions of global parameters and variables and some generic functions/subrou...
integer, dimension(3, 3) kr
Kronecker delta tensor.
integer, parameter ndim
Number of spatial dimensions for grid variables.
double precision, dimension(:), allocatable, parameter d
This module defines the procedures of a physics module. It contains function pointers for the various...
Definition mod_physics.t:4
double precision phys_gamma
Definition mod_physics.t:13
subroutine, public ppmlimitervar(ixil, ixl, idims, q, qct, qlc, qrc)
Definition mod_ppm.t:12
subroutine, public ppmlimiter(ixil, ixl, idims, w, wct, wlc, wrc)
Definition mod_ppm.t:103