ADflow  v1.0
ADflow is a finite volume RANS solver tailored for gradient-based aerodynamic design optimization.
fluxes_b.f90
Go to the documentation of this file.
1 ! generated by tapenade (inria, ecuador team)
2 ! tapenade 3.16 (develop) - 22 aug 2023 15:51
3 !
4 module fluxes_b
5  implicit none
6 
7 contains
8 ! differentiation of inviscidcentralflux in reverse (adjoint) mode (with options noisize i4 dr8 r8):
9 ! gradient of useful results: timeref *p *sfacei *sfacej
10 ! *sfacek *w *dw *vol *si *sj *sk
11 ! with respect to varying inputs: timeref *p *sfacei *sfacej
12 ! *sfacek *w *dw *vol *si *sj *sk
13 ! rw status of diff variables: timeref:incr *p:incr *sfacei:incr
14 ! *sfacej:incr *sfacek:incr *w:incr *dw:in-out *vol:incr
15 ! *si:incr *sj:incr *sk:incr
16 ! plus diff mem management of: p:in sfacei:in sfacej:in sfacek:in
17 ! w:in dw:in vol:in si:in sj:in sk:in
18  subroutine inviscidcentralflux_b()
19 !
20 ! inviscidcentralflux computes the euler fluxes using a central
21 ! discretization for a given block. therefore it is assumed that
22 ! the pointers in block pointer already point to the correct
23 ! block on the correct multigrid level.
24 !
25  use constants
26  use blockpointers, only : nx, il, ie, ny, jl, je, nz, kl, ke, &
27 & spectralsol, w, wd, si, sid, sj, sjd, sk, skd, dw, dwd, pori, porj, &
32  use flowvarrefstate, only : timeref, timerefd
33  use inputphysics, only : equationmode
34  implicit none
35 !
36 ! local variables.
37 !
38  integer(kind=inttype) :: i, j, k, ind, ii
39  real(kind=realtype) :: qsp, qsm, rqsp, rqsm, porvel, porflux
40  real(kind=realtype) :: qspd, qsmd, rqspd, rqsmd
41  real(kind=realtype) :: pa, fs, sface, vnp, vnm
42  real(kind=realtype) :: pad, fsd, sfaced, vnpd, vnmd
43  real(kind=realtype) :: wwx, wwy, wwz, rvol
44  real(kind=realtype) :: wwxd, wwyd, wwzd, rvold
45  intrinsic mod
46  real(kind=realtype) :: temp
47  real(kind=realtype) :: tempd
48  integer :: branch
49  real(kind=realtype) :: temp0
50  real(kind=realtype) :: temp1
51  real(kind=realtype) :: tempd0
52  if (blockismoving .and. equationmode .eq. steady) then
53 ! compute the three nondimensional angular velocities.
54  wwx = timeref*cgnsdoms(nbkglobal)%rotrate(1)
55  wwy = timeref*cgnsdoms(nbkglobal)%rotrate(2)
56  wwz = timeref*cgnsdoms(nbkglobal)%rotrate(3)
57  wwxd = 0.0_8
58  wwyd = 0.0_8
59  wwzd = 0.0_8
60 !$bwd-of ii-loop
61  do ii=0,nx*ny*nz-1
62  i = mod(ii, nx) + 2
63  j = mod(ii/nx, ny) + 2
64  k = ii/(nx*ny) + 2
65  rvol = w(i, j, k, irho)*vol(i, j, k)
66  tempd0 = rvol*dwd(i, j, k, imx)
67  temp = w(i, j, k, ivy)
68  temp1 = w(i, j, k, ivx)
69  temp0 = w(i, j, k, ivy)
70  rvold = (wwx*temp0-wwy*temp1)*dwd(i, j, k, imz)
71  tempd = rvol*dwd(i, j, k, imz)
72  wwxd = wwxd + temp0*tempd
73  wd(i, j, k, ivy) = wd(i, j, k, ivy) + wwx*tempd
74  wwyd = wwyd - temp1*tempd
75  wd(i, j, k, ivx) = wd(i, j, k, ivx) - wwy*tempd
76  temp1 = w(i, j, k, ivz)
77  temp0 = w(i, j, k, ivx)
78  rvold = rvold + (wwz*temp0-wwx*temp1)*dwd(i, j, k, imy)
79  tempd = rvol*dwd(i, j, k, imy)
80  wwzd = wwzd + temp0*tempd - temp*tempd0
81  wd(i, j, k, ivx) = wd(i, j, k, ivx) + wwz*tempd
82  wwxd = wwxd - temp1*tempd
83  wd(i, j, k, ivz) = wd(i, j, k, ivz) + wwy*tempd0 - wwx*tempd
84  temp0 = w(i, j, k, ivz)
85  rvold = rvold + (wwy*temp0-wwz*temp)*dwd(i, j, k, imx)
86  wwyd = wwyd + temp0*tempd0
87  wd(i, j, k, ivy) = wd(i, j, k, ivy) - wwz*tempd0
88  wd(i, j, k, irho) = wd(i, j, k, irho) + vol(i, j, k)*rvold
89  vold(i, j, k) = vold(i, j, k) + w(i, j, k, irho)*rvold
90  end do
91  timerefd = timerefd + cgnsdoms(nbkglobal)%rotrate(3)*wwzd + &
92 & cgnsdoms(nbkglobal)%rotrate(2)*wwyd + cgnsdoms(nbkglobal)%&
93 & rotrate(1)*wwxd
94  end if
95  sfaced = 0.0_8
96  sface = zero
97  sfaced = 0.0_8
98 !$bwd-of ii-loop
99  do ii=0,nx*ny*kl-1
100  i = mod(ii, nx) + 2
101  j = mod(ii/nx, ny) + 2
102  k = ii/(nx*ny) + 1
103 ! set the dot product of the grid velocity and the
104 ! normal in k-direction for a moving face.
105  if (addgridvelocities) then
106  sface = sfacek(i, j, k)
107  call pushcontrol1b(0)
108  else
109  call pushcontrol1b(1)
110  end if
111 ! compute the normal velocities of the left and right state.
112  vnp = w(i, j, k+1, ivx)*sk(i, j, k, 1) + w(i, j, k+1, ivy)*sk(i, j&
113 & , k, 2) + w(i, j, k+1, ivz)*sk(i, j, k, 3)
114  vnm = w(i, j, k, ivx)*sk(i, j, k, 1) + w(i, j, k, ivy)*sk(i, j, k&
115 & , 2) + w(i, j, k, ivz)*sk(i, j, k, 3)
116 ! set the values of the porosities for this face.
117 ! porvel defines the porosity w.r.t. velocity;
118 ! porflux defines the porosity w.r.t. the entire flux.
119 ! the latter is only zero for a discontinuous block
120 ! block boundary that must be treated conservatively.
121 ! the default value of porflux is 0.5, such that the
122 ! correct central flux is scattered to both cells.
123 ! in case of a boundflux the normal velocity is set
124 ! to sface.
125  porvel = one
126  porflux = half
127  if (pork(i, j, k) .eq. noflux) porflux = zero
128  if (pork(i, j, k) .eq. boundflux) then
129  porvel = zero
130  vnp = sface
131  vnm = sface
132  call pushcontrol1b(0)
133  else
134  call pushcontrol1b(1)
135  end if
136 ! incorporate porflux in porvel.
137  porvel = porvel*porflux
138 ! compute the normal velocities for the face as well as the
139 ! mass fluxes.
140  qsp = (vnp-sface)*porvel
141  qsm = (vnm-sface)*porvel
142  rqsp = qsp*w(i, j, k+1, irho)
143  rqsm = qsm*w(i, j, k, irho)
144 ! compute the sum of the pressure multiplied by porflux.
145 ! for the default value of porflux, 0.5, this leads to
146 ! the average pressure.
147  pa = porflux*(p(i, j, k+1)+p(i, j, k))
148 ! compute the fluxes and scatter them to the cells
149 ! i,j,k and i,j,k+1. store the density flux in the
150 ! mass flow of the appropriate sliding mesh interface.
151  fsd = dwd(i, j, k, irhoe) - dwd(i, j, k+1, irhoe)
152  qspd = w(i, j, k+1, irhoe)*fsd
153  wd(i, j, k+1, irhoe) = wd(i, j, k+1, irhoe) + qsp*fsd
154  qsmd = w(i, j, k, irhoe)*fsd
155  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) + qsm*fsd
156  tempd = porflux*fsd
157  fsd = dwd(i, j, k, imz) - dwd(i, j, k+1, imz)
158  rqspd = w(i, j, k+1, ivz)*fsd
159  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + rqsp*fsd
160  rqsmd = w(i, j, k, ivz)*fsd
161  wd(i, j, k, ivz) = wd(i, j, k, ivz) + rqsm*fsd
162  pad = sk(i, j, k, 3)*fsd
163  skd(i, j, k, 3) = skd(i, j, k, 3) + pa*fsd
164  fsd = dwd(i, j, k, imy) - dwd(i, j, k+1, imy)
165  rqspd = rqspd + w(i, j, k+1, ivy)*fsd
166  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + rqsp*fsd
167  rqsmd = rqsmd + w(i, j, k, ivy)*fsd
168  wd(i, j, k, ivy) = wd(i, j, k, ivy) + rqsm*fsd
169  pad = pad + sk(i, j, k, 2)*fsd
170  skd(i, j, k, 2) = skd(i, j, k, 2) + pa*fsd
171  fsd = dwd(i, j, k, imx) - dwd(i, j, k+1, imx)
172  rqspd = rqspd + w(i, j, k+1, ivx)*fsd
173  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + rqsp*fsd
174  rqsmd = rqsmd + w(i, j, k, ivx)*fsd
175  wd(i, j, k, ivx) = wd(i, j, k, ivx) + rqsm*fsd
176  pad = pad + sk(i, j, k, 1)*fsd
177  pd(i, j, k) = pd(i, j, k) + vnm*tempd + porflux*pad
178  pd(i, j, k+1) = pd(i, j, k+1) + vnp*tempd + porflux*pad
179  skd(i, j, k, 1) = skd(i, j, k, 1) + pa*fsd
180  fsd = dwd(i, j, k, irho) - dwd(i, j, k+1, irho)
181  rqspd = rqspd + fsd
182  rqsmd = rqsmd + fsd
183  qsmd = qsmd + w(i, j, k, irho)*rqsmd
184  vnmd = p(i, j, k)*tempd + porvel*qsmd
185  wd(i, j, k, irho) = wd(i, j, k, irho) + qsm*rqsmd
186  qspd = qspd + w(i, j, k+1, irho)*rqspd
187  vnpd = p(i, j, k+1)*tempd + porvel*qspd
188  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + qsp*rqspd
189  sfaced = sfaced - porvel*qsmd - porvel*qspd
190  call popcontrol1b(branch)
191  if (branch .eq. 0) then
192  sfaced = sfaced + vnmd + vnpd
193  vnmd = 0.0_8
194  vnpd = 0.0_8
195  end if
196  skd(i, j, k, 3) = skd(i, j, k, 3) + w(i, j, k, ivz)*vnmd + w(i, j&
197 & , k+1, ivz)*vnpd
198  skd(i, j, k, 2) = skd(i, j, k, 2) + w(i, j, k, ivy)*vnmd + w(i, j&
199 & , k+1, ivy)*vnpd
200  wd(i, j, k, ivx) = wd(i, j, k, ivx) + sk(i, j, k, 1)*vnmd
201  skd(i, j, k, 1) = skd(i, j, k, 1) + w(i, j, k, ivx)*vnmd + w(i, j&
202 & , k+1, ivx)*vnpd
203  wd(i, j, k, ivy) = wd(i, j, k, ivy) + sk(i, j, k, 2)*vnmd
204  wd(i, j, k, ivz) = wd(i, j, k, ivz) + sk(i, j, k, 3)*vnmd
205  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + sk(i, j, k, 1)*vnpd
206  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + sk(i, j, k, 2)*vnpd
207  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + sk(i, j, k, 3)*vnpd
208  call popcontrol1b(branch)
209  if (branch .eq. 0) then
210  sfacekd(i, j, k) = sfacekd(i, j, k) + sfaced
211  sfaced = 0.0_8
212  end if
213  end do
214  sfaced = 0.0_8
215  sface = zero
216  sfaced = 0.0_8
217 !$bwd-of ii-loop
218  do ii=0,nx*jl*nz-1
219  i = mod(ii, nx) + 2
220  j = mod(ii/nx, jl) + 1
221  k = ii/(nx*jl) + 2
222 ! set the dot product of the grid velocity and the
223 ! normal in j-direction for a moving face.
224  if (addgridvelocities) then
225  sface = sfacej(i, j, k)
226  call pushcontrol1b(0)
227  else
228  call pushcontrol1b(1)
229  end if
230 ! compute the normal velocities of the left and right state.
231  vnp = w(i, j+1, k, ivx)*sj(i, j, k, 1) + w(i, j+1, k, ivy)*sj(i, j&
232 & , k, 2) + w(i, j+1, k, ivz)*sj(i, j, k, 3)
233  vnm = w(i, j, k, ivx)*sj(i, j, k, 1) + w(i, j, k, ivy)*sj(i, j, k&
234 & , 2) + w(i, j, k, ivz)*sj(i, j, k, 3)
235 ! set the values of the porosities for this face.
236 ! porvel defines the porosity w.r.t. velocity;
237 ! porflux defines the porosity w.r.t. the entire flux.
238 ! the latter is only zero for a discontinuous block
239 ! boundary that must be treated conservatively.
240 ! the default value of porflux is 0.5, such that the
241 ! correct central flux is scattered to both cells.
242 ! in case of a boundflux the normal velocity is set
243 ! to sface.
244  porvel = one
245  porflux = half
246  if (porj(i, j, k) .eq. noflux) porflux = zero
247  if (porj(i, j, k) .eq. boundflux) then
248  porvel = zero
249  vnp = sface
250  vnm = sface
251  call pushcontrol1b(0)
252  else
253  call pushcontrol1b(1)
254  end if
255 ! incorporate porflux in porvel.
256  porvel = porvel*porflux
257 ! compute the normal velocities for the face as well as the
258 ! mass fluxes.
259  qsp = (vnp-sface)*porvel
260  qsm = (vnm-sface)*porvel
261  rqsp = qsp*w(i, j+1, k, irho)
262  rqsm = qsm*w(i, j, k, irho)
263 ! compute the sum of the pressure multiplied by porflux.
264 ! for the default value of porflux, 0.5, this leads to
265 ! the average pressure.
266  pa = porflux*(p(i, j+1, k)+p(i, j, k))
267 ! compute the fluxes and scatter them to the cells
268 ! i,j,k and i,j+1,k. store the density flux in the
269 ! mass flow of the appropriate sliding mesh interface.
270  fsd = dwd(i, j, k, irhoe) - dwd(i, j+1, k, irhoe)
271  qspd = w(i, j+1, k, irhoe)*fsd
272  wd(i, j+1, k, irhoe) = wd(i, j+1, k, irhoe) + qsp*fsd
273  qsmd = w(i, j, k, irhoe)*fsd
274  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) + qsm*fsd
275  tempd = porflux*fsd
276  fsd = dwd(i, j, k, imz) - dwd(i, j+1, k, imz)
277  rqspd = w(i, j+1, k, ivz)*fsd
278  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + rqsp*fsd
279  rqsmd = w(i, j, k, ivz)*fsd
280  wd(i, j, k, ivz) = wd(i, j, k, ivz) + rqsm*fsd
281  pad = sj(i, j, k, 3)*fsd
282  sjd(i, j, k, 3) = sjd(i, j, k, 3) + pa*fsd
283  fsd = dwd(i, j, k, imy) - dwd(i, j+1, k, imy)
284  rqspd = rqspd + w(i, j+1, k, ivy)*fsd
285  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + rqsp*fsd
286  rqsmd = rqsmd + w(i, j, k, ivy)*fsd
287  wd(i, j, k, ivy) = wd(i, j, k, ivy) + rqsm*fsd
288  pad = pad + sj(i, j, k, 2)*fsd
289  sjd(i, j, k, 2) = sjd(i, j, k, 2) + pa*fsd
290  fsd = dwd(i, j, k, imx) - dwd(i, j+1, k, imx)
291  rqspd = rqspd + w(i, j+1, k, ivx)*fsd
292  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + rqsp*fsd
293  rqsmd = rqsmd + w(i, j, k, ivx)*fsd
294  wd(i, j, k, ivx) = wd(i, j, k, ivx) + rqsm*fsd
295  pad = pad + sj(i, j, k, 1)*fsd
296  pd(i, j, k) = pd(i, j, k) + vnm*tempd + porflux*pad
297  pd(i, j+1, k) = pd(i, j+1, k) + vnp*tempd + porflux*pad
298  sjd(i, j, k, 1) = sjd(i, j, k, 1) + pa*fsd
299  fsd = dwd(i, j, k, irho) - dwd(i, j+1, k, irho)
300  rqspd = rqspd + fsd
301  rqsmd = rqsmd + fsd
302  qsmd = qsmd + w(i, j, k, irho)*rqsmd
303  vnmd = p(i, j, k)*tempd + porvel*qsmd
304  wd(i, j, k, irho) = wd(i, j, k, irho) + qsm*rqsmd
305  qspd = qspd + w(i, j+1, k, irho)*rqspd
306  vnpd = p(i, j+1, k)*tempd + porvel*qspd
307  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + qsp*rqspd
308  sfaced = sfaced - porvel*qsmd - porvel*qspd
309  call popcontrol1b(branch)
310  if (branch .eq. 0) then
311  sfaced = sfaced + vnmd + vnpd
312  vnmd = 0.0_8
313  vnpd = 0.0_8
314  end if
315  sjd(i, j, k, 3) = sjd(i, j, k, 3) + w(i, j, k, ivz)*vnmd + w(i, j+&
316 & 1, k, ivz)*vnpd
317  sjd(i, j, k, 2) = sjd(i, j, k, 2) + w(i, j, k, ivy)*vnmd + w(i, j+&
318 & 1, k, ivy)*vnpd
319  wd(i, j, k, ivx) = wd(i, j, k, ivx) + sj(i, j, k, 1)*vnmd
320  sjd(i, j, k, 1) = sjd(i, j, k, 1) + w(i, j, k, ivx)*vnmd + w(i, j+&
321 & 1, k, ivx)*vnpd
322  wd(i, j, k, ivy) = wd(i, j, k, ivy) + sj(i, j, k, 2)*vnmd
323  wd(i, j, k, ivz) = wd(i, j, k, ivz) + sj(i, j, k, 3)*vnmd
324  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + sj(i, j, k, 1)*vnpd
325  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + sj(i, j, k, 2)*vnpd
326  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + sj(i, j, k, 3)*vnpd
327  call popcontrol1b(branch)
328  if (branch .eq. 0) then
329  sfacejd(i, j, k) = sfacejd(i, j, k) + sfaced
330  sfaced = 0.0_8
331  end if
332  end do
333  sfaced = 0.0_8
334 ! initialize sface to zero. this value will be used if the
335 ! block is not moving.
336  sface = zero
337  sfaced = 0.0_8
338 !$bwd-of ii-loop
339  do ii=0,il*ny*nz-1
340  i = mod(ii, il) + 1
341  j = mod(ii/il, ny) + 2
342  k = ii/(il*ny) + 2
343 ! set the dot product of the grid velocity and the
344 ! normal in i-direction for a moving face.
345  if (addgridvelocities) then
346  sface = sfacei(i, j, k)
347  call pushcontrol1b(0)
348  else
349  call pushcontrol1b(1)
350  end if
351 ! compute the normal velocities of the left and right state.
352  vnp = w(i+1, j, k, ivx)*si(i, j, k, 1) + w(i+1, j, k, ivy)*si(i, j&
353 & , k, 2) + w(i+1, j, k, ivz)*si(i, j, k, 3)
354  vnm = w(i, j, k, ivx)*si(i, j, k, 1) + w(i, j, k, ivy)*si(i, j, k&
355 & , 2) + w(i, j, k, ivz)*si(i, j, k, 3)
356 ! set the values of the porosities for this face.
357 ! porvel defines the porosity w.r.t. velocity;
358 ! porflux defines the porosity w.r.t. the entire flux.
359 ! the latter is only zero for a discontinuous block
360 ! boundary that must be treated conservatively.
361 ! the default value of porflux is 0.5, such that the
362 ! correct central flux is scattered to both cells.
363 ! in case of a boundflux the normal velocity is set
364 ! to sface.
365  porvel = one
366  porflux = half
367  if (pori(i, j, k) .eq. noflux) porflux = zero
368  if (pori(i, j, k) .eq. boundflux) then
369  porvel = zero
370  vnp = sface
371  vnm = sface
372  call pushcontrol1b(0)
373  else
374  call pushcontrol1b(1)
375  end if
376 ! incorporate porflux in porvel.
377  porvel = porvel*porflux
378 ! compute the normal velocities relative to the grid for
379 ! the face as well as the mass fluxes.
380  qsp = (vnp-sface)*porvel
381  qsm = (vnm-sface)*porvel
382  rqsp = qsp*w(i+1, j, k, irho)
383  rqsm = qsm*w(i, j, k, irho)
384 ! compute the sum of the pressure multiplied by porflux.
385 ! for the default value of porflux, 0.5, this leads to
386 ! the average pressure.
387  pa = porflux*(p(i+1, j, k)+p(i, j, k))
388 ! compute the fluxes and scatter them to the cells
389 ! i,j,k and i+1,j,k. store the density flux in the
390 ! mass flow of the appropriate sliding mesh interface.
391  fsd = dwd(i, j, k, irhoe) - dwd(i+1, j, k, irhoe)
392  qspd = w(i+1, j, k, irhoe)*fsd
393  wd(i+1, j, k, irhoe) = wd(i+1, j, k, irhoe) + qsp*fsd
394  qsmd = w(i, j, k, irhoe)*fsd
395  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) + qsm*fsd
396  tempd = porflux*fsd
397  fsd = dwd(i, j, k, imz) - dwd(i+1, j, k, imz)
398  rqspd = w(i+1, j, k, ivz)*fsd
399  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + rqsp*fsd
400  rqsmd = w(i, j, k, ivz)*fsd
401  wd(i, j, k, ivz) = wd(i, j, k, ivz) + rqsm*fsd
402  pad = si(i, j, k, 3)*fsd
403  sid(i, j, k, 3) = sid(i, j, k, 3) + pa*fsd
404  fsd = dwd(i, j, k, imy) - dwd(i+1, j, k, imy)
405  rqspd = rqspd + w(i+1, j, k, ivy)*fsd
406  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + rqsp*fsd
407  rqsmd = rqsmd + w(i, j, k, ivy)*fsd
408  wd(i, j, k, ivy) = wd(i, j, k, ivy) + rqsm*fsd
409  pad = pad + si(i, j, k, 2)*fsd
410  sid(i, j, k, 2) = sid(i, j, k, 2) + pa*fsd
411  fsd = dwd(i, j, k, imx) - dwd(i+1, j, k, imx)
412  rqspd = rqspd + w(i+1, j, k, ivx)*fsd
413  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + rqsp*fsd
414  rqsmd = rqsmd + w(i, j, k, ivx)*fsd
415  wd(i, j, k, ivx) = wd(i, j, k, ivx) + rqsm*fsd
416  pad = pad + si(i, j, k, 1)*fsd
417  pd(i, j, k) = pd(i, j, k) + vnm*tempd + porflux*pad
418  pd(i+1, j, k) = pd(i+1, j, k) + vnp*tempd + porflux*pad
419  sid(i, j, k, 1) = sid(i, j, k, 1) + pa*fsd
420  fsd = dwd(i, j, k, irho) - dwd(i+1, j, k, irho)
421  rqspd = rqspd + fsd
422  rqsmd = rqsmd + fsd
423  qsmd = qsmd + w(i, j, k, irho)*rqsmd
424  vnmd = p(i, j, k)*tempd + porvel*qsmd
425  wd(i, j, k, irho) = wd(i, j, k, irho) + qsm*rqsmd
426  qspd = qspd + w(i+1, j, k, irho)*rqspd
427  vnpd = p(i+1, j, k)*tempd + porvel*qspd
428  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + qsp*rqspd
429  sfaced = sfaced - porvel*qsmd - porvel*qspd
430  call popcontrol1b(branch)
431  if (branch .eq. 0) then
432  sfaced = sfaced + vnmd + vnpd
433  vnmd = 0.0_8
434  vnpd = 0.0_8
435  end if
436  sid(i, j, k, 3) = sid(i, j, k, 3) + w(i, j, k, ivz)*vnmd + w(i+1, &
437 & j, k, ivz)*vnpd
438  sid(i, j, k, 2) = sid(i, j, k, 2) + w(i, j, k, ivy)*vnmd + w(i+1, &
439 & j, k, ivy)*vnpd
440  wd(i, j, k, ivx) = wd(i, j, k, ivx) + si(i, j, k, 1)*vnmd
441  sid(i, j, k, 1) = sid(i, j, k, 1) + w(i, j, k, ivx)*vnmd + w(i+1, &
442 & j, k, ivx)*vnpd
443  wd(i, j, k, ivy) = wd(i, j, k, ivy) + si(i, j, k, 2)*vnmd
444  wd(i, j, k, ivz) = wd(i, j, k, ivz) + si(i, j, k, 3)*vnmd
445  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + si(i, j, k, 1)*vnpd
446  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + si(i, j, k, 2)*vnpd
447  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + si(i, j, k, 3)*vnpd
448  call popcontrol1b(branch)
449  if (branch .eq. 0) then
450  sfaceid(i, j, k) = sfaceid(i, j, k) + sfaced
451  sfaced = 0.0_8
452  end if
453  end do
454  end subroutine inviscidcentralflux_b
455 
456  subroutine inviscidcentralflux()
457 !
458 ! inviscidcentralflux computes the euler fluxes using a central
459 ! discretization for a given block. therefore it is assumed that
460 ! the pointers in block pointer already point to the correct
461 ! block on the correct multigrid level.
462 !
463  use constants
464  use blockpointers, only : nx, il, ie, ny, jl, je, nz, kl, ke, &
465 & spectralsol, w, si, sj, sk, dw, pori, porj, pork, indfamilyi, &
468 & factfamilyk
469  use cgnsgrid, only : cgnsdoms, massflowfamilyinv
470  use flowvarrefstate, only : timeref
471  use inputphysics, only : equationmode
472  implicit none
473 !
474 ! local variables.
475 !
476  integer(kind=inttype) :: i, j, k, ind, ii
477  real(kind=realtype) :: qsp, qsm, rqsp, rqsm, porvel, porflux
478  real(kind=realtype) :: pa, fs, sface, vnp, vnm
479  real(kind=realtype) :: wwx, wwy, wwz, rvol
480  intrinsic mod
481 !$ad checkpoint-start
482 ! initialize sface to zero. this value will be used if the
483 ! block is not moving.
484  sface = zero
485 !$ad ii-loop
486 !
487 ! advective fluxes in the i-direction.
488 !
489  do ii=0,il*ny*nz-1
490  i = mod(ii, il) + 1
491  j = mod(ii/il, ny) + 2
492  k = ii/(il*ny) + 2
493 ! set the dot product of the grid velocity and the
494 ! normal in i-direction for a moving face.
495  if (addgridvelocities) sface = sfacei(i, j, k)
496 ! compute the normal velocities of the left and right state.
497  vnp = w(i+1, j, k, ivx)*si(i, j, k, 1) + w(i+1, j, k, ivy)*si(i, j&
498 & , k, 2) + w(i+1, j, k, ivz)*si(i, j, k, 3)
499  vnm = w(i, j, k, ivx)*si(i, j, k, 1) + w(i, j, k, ivy)*si(i, j, k&
500 & , 2) + w(i, j, k, ivz)*si(i, j, k, 3)
501 ! set the values of the porosities for this face.
502 ! porvel defines the porosity w.r.t. velocity;
503 ! porflux defines the porosity w.r.t. the entire flux.
504 ! the latter is only zero for a discontinuous block
505 ! boundary that must be treated conservatively.
506 ! the default value of porflux is 0.5, such that the
507 ! correct central flux is scattered to both cells.
508 ! in case of a boundflux the normal velocity is set
509 ! to sface.
510  porvel = one
511  porflux = half
512  if (pori(i, j, k) .eq. noflux) porflux = zero
513  if (pori(i, j, k) .eq. boundflux) then
514  porvel = zero
515  vnp = sface
516  vnm = sface
517  end if
518 ! incorporate porflux in porvel.
519  porvel = porvel*porflux
520 ! compute the normal velocities relative to the grid for
521 ! the face as well as the mass fluxes.
522  qsp = (vnp-sface)*porvel
523  qsm = (vnm-sface)*porvel
524  rqsp = qsp*w(i+1, j, k, irho)
525  rqsm = qsm*w(i, j, k, irho)
526 ! compute the sum of the pressure multiplied by porflux.
527 ! for the default value of porflux, 0.5, this leads to
528 ! the average pressure.
529  pa = porflux*(p(i+1, j, k)+p(i, j, k))
530 ! compute the fluxes and scatter them to the cells
531 ! i,j,k and i+1,j,k. store the density flux in the
532 ! mass flow of the appropriate sliding mesh interface.
533  fs = rqsp + rqsm
534  dw(i+1, j, k, irho) = dw(i+1, j, k, irho) - fs
535  dw(i, j, k, irho) = dw(i, j, k, irho) + fs
536  fs = rqsp*w(i+1, j, k, ivx) + rqsm*w(i, j, k, ivx) + pa*si(i, j, k&
537 & , 1)
538  dw(i+1, j, k, imx) = dw(i+1, j, k, imx) - fs
539  dw(i, j, k, imx) = dw(i, j, k, imx) + fs
540  fs = rqsp*w(i+1, j, k, ivy) + rqsm*w(i, j, k, ivy) + pa*si(i, j, k&
541 & , 2)
542  dw(i+1, j, k, imy) = dw(i+1, j, k, imy) - fs
543  dw(i, j, k, imy) = dw(i, j, k, imy) + fs
544  fs = rqsp*w(i+1, j, k, ivz) + rqsm*w(i, j, k, ivz) + pa*si(i, j, k&
545 & , 3)
546  dw(i+1, j, k, imz) = dw(i+1, j, k, imz) - fs
547  dw(i, j, k, imz) = dw(i, j, k, imz) + fs
548  fs = qsp*w(i+1, j, k, irhoe) + qsm*w(i, j, k, irhoe) + porflux*(&
549 & vnp*p(i+1, j, k)+vnm*p(i, j, k))
550  dw(i+1, j, k, irhoe) = dw(i+1, j, k, irhoe) - fs
551  dw(i, j, k, irhoe) = dw(i, j, k, irhoe) + fs
552  end do
553 !$ad checkpoint-end
554 !
555 ! advective fluxes in the j-direction.
556 !
557  continue
558 !$ad checkpoint-start
559  sface = zero
560 !$ad ii-loop
561  do ii=0,nx*jl*nz-1
562  i = mod(ii, nx) + 2
563  j = mod(ii/nx, jl) + 1
564  k = ii/(nx*jl) + 2
565 ! set the dot product of the grid velocity and the
566 ! normal in j-direction for a moving face.
567  if (addgridvelocities) sface = sfacej(i, j, k)
568 ! compute the normal velocities of the left and right state.
569  vnp = w(i, j+1, k, ivx)*sj(i, j, k, 1) + w(i, j+1, k, ivy)*sj(i, j&
570 & , k, 2) + w(i, j+1, k, ivz)*sj(i, j, k, 3)
571  vnm = w(i, j, k, ivx)*sj(i, j, k, 1) + w(i, j, k, ivy)*sj(i, j, k&
572 & , 2) + w(i, j, k, ivz)*sj(i, j, k, 3)
573 ! set the values of the porosities for this face.
574 ! porvel defines the porosity w.r.t. velocity;
575 ! porflux defines the porosity w.r.t. the entire flux.
576 ! the latter is only zero for a discontinuous block
577 ! boundary that must be treated conservatively.
578 ! the default value of porflux is 0.5, such that the
579 ! correct central flux is scattered to both cells.
580 ! in case of a boundflux the normal velocity is set
581 ! to sface.
582  porvel = one
583  porflux = half
584  if (porj(i, j, k) .eq. noflux) porflux = zero
585  if (porj(i, j, k) .eq. boundflux) then
586  porvel = zero
587  vnp = sface
588  vnm = sface
589  end if
590 ! incorporate porflux in porvel.
591  porvel = porvel*porflux
592 ! compute the normal velocities for the face as well as the
593 ! mass fluxes.
594  qsp = (vnp-sface)*porvel
595  qsm = (vnm-sface)*porvel
596  rqsp = qsp*w(i, j+1, k, irho)
597  rqsm = qsm*w(i, j, k, irho)
598 ! compute the sum of the pressure multiplied by porflux.
599 ! for the default value of porflux, 0.5, this leads to
600 ! the average pressure.
601  pa = porflux*(p(i, j+1, k)+p(i, j, k))
602 ! compute the fluxes and scatter them to the cells
603 ! i,j,k and i,j+1,k. store the density flux in the
604 ! mass flow of the appropriate sliding mesh interface.
605  fs = rqsp + rqsm
606  dw(i, j+1, k, irho) = dw(i, j+1, k, irho) - fs
607  dw(i, j, k, irho) = dw(i, j, k, irho) + fs
608  fs = rqsp*w(i, j+1, k, ivx) + rqsm*w(i, j, k, ivx) + pa*sj(i, j, k&
609 & , 1)
610  dw(i, j+1, k, imx) = dw(i, j+1, k, imx) - fs
611  dw(i, j, k, imx) = dw(i, j, k, imx) + fs
612  fs = rqsp*w(i, j+1, k, ivy) + rqsm*w(i, j, k, ivy) + pa*sj(i, j, k&
613 & , 2)
614  dw(i, j+1, k, imy) = dw(i, j+1, k, imy) - fs
615  dw(i, j, k, imy) = dw(i, j, k, imy) + fs
616  fs = rqsp*w(i, j+1, k, ivz) + rqsm*w(i, j, k, ivz) + pa*sj(i, j, k&
617 & , 3)
618  dw(i, j+1, k, imz) = dw(i, j+1, k, imz) - fs
619  dw(i, j, k, imz) = dw(i, j, k, imz) + fs
620  fs = qsp*w(i, j+1, k, irhoe) + qsm*w(i, j, k, irhoe) + porflux*(&
621 & vnp*p(i, j+1, k)+vnm*p(i, j, k))
622  dw(i, j+1, k, irhoe) = dw(i, j+1, k, irhoe) - fs
623  dw(i, j, k, irhoe) = dw(i, j, k, irhoe) + fs
624  end do
625 !$ad checkpoint-end
626 !
627 ! advective fluxes in the k-direction.
628  continue
629 !$ad checkpoint-start
630  sface = zero
631 !$ad ii-loop
632  do ii=0,nx*ny*kl-1
633  i = mod(ii, nx) + 2
634  j = mod(ii/nx, ny) + 2
635  k = ii/(nx*ny) + 1
636 ! set the dot product of the grid velocity and the
637 ! normal in k-direction for a moving face.
638  if (addgridvelocities) sface = sfacek(i, j, k)
639 ! compute the normal velocities of the left and right state.
640  vnp = w(i, j, k+1, ivx)*sk(i, j, k, 1) + w(i, j, k+1, ivy)*sk(i, j&
641 & , k, 2) + w(i, j, k+1, ivz)*sk(i, j, k, 3)
642  vnm = w(i, j, k, ivx)*sk(i, j, k, 1) + w(i, j, k, ivy)*sk(i, j, k&
643 & , 2) + w(i, j, k, ivz)*sk(i, j, k, 3)
644 ! set the values of the porosities for this face.
645 ! porvel defines the porosity w.r.t. velocity;
646 ! porflux defines the porosity w.r.t. the entire flux.
647 ! the latter is only zero for a discontinuous block
648 ! block boundary that must be treated conservatively.
649 ! the default value of porflux is 0.5, such that the
650 ! correct central flux is scattered to both cells.
651 ! in case of a boundflux the normal velocity is set
652 ! to sface.
653  porvel = one
654  porflux = half
655  if (pork(i, j, k) .eq. noflux) porflux = zero
656  if (pork(i, j, k) .eq. boundflux) then
657  porvel = zero
658  vnp = sface
659  vnm = sface
660  end if
661 ! incorporate porflux in porvel.
662  porvel = porvel*porflux
663 ! compute the normal velocities for the face as well as the
664 ! mass fluxes.
665  qsp = (vnp-sface)*porvel
666  qsm = (vnm-sface)*porvel
667  rqsp = qsp*w(i, j, k+1, irho)
668  rqsm = qsm*w(i, j, k, irho)
669 ! compute the sum of the pressure multiplied by porflux.
670 ! for the default value of porflux, 0.5, this leads to
671 ! the average pressure.
672  pa = porflux*(p(i, j, k+1)+p(i, j, k))
673 ! compute the fluxes and scatter them to the cells
674 ! i,j,k and i,j,k+1. store the density flux in the
675 ! mass flow of the appropriate sliding mesh interface.
676  fs = rqsp + rqsm
677  dw(i, j, k+1, irho) = dw(i, j, k+1, irho) - fs
678  dw(i, j, k, irho) = dw(i, j, k, irho) + fs
679  fs = rqsp*w(i, j, k+1, ivx) + rqsm*w(i, j, k, ivx) + pa*sk(i, j, k&
680 & , 1)
681  dw(i, j, k+1, imx) = dw(i, j, k+1, imx) - fs
682  dw(i, j, k, imx) = dw(i, j, k, imx) + fs
683  fs = rqsp*w(i, j, k+1, ivy) + rqsm*w(i, j, k, ivy) + pa*sk(i, j, k&
684 & , 2)
685  dw(i, j, k+1, imy) = dw(i, j, k+1, imy) - fs
686  dw(i, j, k, imy) = dw(i, j, k, imy) + fs
687  fs = rqsp*w(i, j, k+1, ivz) + rqsm*w(i, j, k, ivz) + pa*sk(i, j, k&
688 & , 3)
689  dw(i, j, k+1, imz) = dw(i, j, k+1, imz) - fs
690  dw(i, j, k, imz) = dw(i, j, k, imz) + fs
691  fs = qsp*w(i, j, k+1, irhoe) + qsm*w(i, j, k, irhoe) + porflux*(&
692 & vnp*p(i, j, k+1)+vnm*p(i, j, k))
693  dw(i, j, k+1, irhoe) = dw(i, j, k+1, irhoe) - fs
694  dw(i, j, k, irhoe) = dw(i, j, k, irhoe) + fs
695  end do
696 !$ad checkpoint-end
697 ! add the rotational source terms for a moving block in a
698 ! steady state computation. these source terms account for the
699 ! centrifugal acceleration and the coriolis term. however, as
700 ! the the equations are solved in the inertial frame and not
701 ! in the moving frame, the form is different than what you
702 ! normally find in a text book.
703  continue
704 !$ad checkpoint-start
705  if (blockismoving .and. equationmode .eq. steady) then
706 ! compute the three nondimensional angular velocities.
707  wwx = timeref*cgnsdoms(nbkglobal)%rotrate(1)
708  wwy = timeref*cgnsdoms(nbkglobal)%rotrate(2)
709  wwz = timeref*cgnsdoms(nbkglobal)%rotrate(3)
710 !$ad ii-loop
711 ! loop over the internal cells of this block to compute the
712 ! rotational terms for the momentum equations.
713  do ii=0,nx*ny*nz-1
714  i = mod(ii, nx) + 2
715  j = mod(ii/nx, ny) + 2
716  k = ii/(nx*ny) + 2
717  rvol = w(i, j, k, irho)*vol(i, j, k)
718  dw(i, j, k, imx) = dw(i, j, k, imx) + rvol*(wwy*w(i, j, k, ivz)-&
719 & wwz*w(i, j, k, ivy))
720  dw(i, j, k, imy) = dw(i, j, k, imy) + rvol*(wwz*w(i, j, k, ivx)-&
721 & wwx*w(i, j, k, ivz))
722  dw(i, j, k, imz) = dw(i, j, k, imz) + rvol*(wwx*w(i, j, k, ivy)-&
723 & wwy*w(i, j, k, ivx))
724  end do
725  end if
726 !$ad checkpoint-end
727 
728  end subroutine inviscidcentralflux
729 
730 ! differentiation of invisciddissfluxmatrix in reverse (adjoint) mode (with options noisize i4 dr8 r8):
731 ! gradient of useful results: pinfcorr *p *sfacei *sfacej
732 ! *sfacek *w *si *sj *sk *fw
733 ! with respect to varying inputs: pinfcorr *p *sfacei *sfacej
734 ! *sfacek *w *si *sj *sk *fw
735 ! rw status of diff variables: pinfcorr:incr *p:incr *sfacei:incr
736 ! *sfacej:incr *sfacek:incr *w:incr *si:incr *sj:incr
737 ! *sk:incr *fw:in-out
738 ! plus diff mem management of: p:in sfacei:in sfacej:in sfacek:in
739 ! w:in si:in sj:in sk:in fw:in
741 !
742 ! invisciddissfluxmatrix computes the matrix artificial
743 ! dissipation term. instead of the spectral radius, as used in
744 ! the scalar dissipation scheme, the absolute value of the flux
745 ! jacobian is used. this leads to a less diffusive and
746 ! consequently more accurate scheme. it is assumed that the
747 ! pointers in blockpointers already point to the correct block.
748 !
749  use constants
750  use blockpointers, only : nx, ny, nz, il, jl, kl, ie, je, ke, ib, &
751 & jb, kb, w, wd, p, pd, pori, porj, pork, fw, fwd, gamma, si, sid, sj,&
755  use flowvarrefstate, only : pinfcorr, pinfcorrd
756  use inputdiscretization, only : vis2, vis4
757  use inputphysics, only : equations
758  use iteration, only : rfil
759  use cgnsgrid, only : massflowfamilydiss
760  use utils_b, only : getcorrectfork, mydim, mydim_b
761  implicit none
762 !
763 ! local parameters.
764 !
765  real(kind=realtype), parameter :: dpmax=0.25_realtype
766  real(kind=realtype), parameter :: epsacoustic=0.25_realtype
767  real(kind=realtype), parameter :: epsshear=0.025_realtype
768  real(kind=realtype), parameter :: omega=0.5_realtype
769  real(kind=realtype), parameter :: oneminomega=one-omega
770 !
771 ! local variables.
772 !
773  integer(kind=inttype) :: i, j, k, ind, ii
774  real(kind=realtype) :: plim, sface
775  real(kind=realtype) :: plimd, sfaced
776  real(kind=realtype) :: sfil, fis2, fis4
777  real(kind=realtype) :: gammaavg, gm1, ovgm1, gm53
778  real(kind=realtype) :: ppor, rrad, dis2, dis4
779  real(kind=realtype) :: rradd, dis2d, dis4d
780  real(kind=realtype) :: dp1, dp2, tmp, fs
781  real(kind=realtype) :: tmpd, fsd
782  real(kind=realtype) :: ddw1, ddw2, ddw3, ddw4, ddw5, ddw6
783  real(kind=realtype) :: ddw1d, ddw2d, ddw3d, ddw4d, ddw5d, ddw6d
784  real(kind=realtype) :: dr, dru, drv, drw, dre, drk, sx, sy, sz
785  real(kind=realtype) :: drd, drud, drvd, drwd, dred, drkd, sxd, syd, &
786 & szd
787  real(kind=realtype) :: uavg, vavg, wavg, a2avg, aavg, havg
788  real(kind=realtype) :: uavgd, vavgd, wavgd, a2avgd, aavgd, havgd
789  real(kind=realtype) :: alphaavg, unavg, ovaavg, ova2avg
790  real(kind=realtype) :: alphaavgd, unavgd, ovaavgd, ova2avgd
791  real(kind=realtype) :: kavg, lam1, lam2, lam3, area
792  real(kind=realtype) :: kavgd, lam1d, lam2d, lam3d, aread
793  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
794  real(kind=realtype) :: abv1d, abv2d, abv3d, abv4d, abv5d, abv6d, &
795 & abv7d
796  real(kind=realtype), dimension(ie, je, ke, 3) :: dss
797  real(kind=realtype), dimension(ie, je, ke, 3) :: dssd
798  logical :: correctfork
799  intrinsic abs
800  intrinsic mod
801  intrinsic max
802  intrinsic min
803  intrinsic sqrt
804  real(kind=realtype) :: x1
805  real(kind=realtype) :: x1d
806  real(kind=realtype) :: x2
807  real(kind=realtype) :: x2d
808  real(kind=realtype) :: x3
809  real(kind=realtype) :: x3d
810  real(kind=realtype) :: y1
811  real(kind=realtype) :: y1d
812  real(kind=realtype) :: y2
813  real(kind=realtype) :: y2d
814  real(kind=realtype) :: y3
815  real(kind=realtype) :: y3d
816  real(kind=realtype) :: abs0
817  real(kind=realtype) :: min1
818  real(kind=realtype) :: min1d
819  real(realtype) :: max1
820  real(realtype) :: max1d
821  real(kind=realtype) :: max2
822  real(kind=realtype) :: max2d
823  real(kind=realtype) :: max3
824  real(kind=realtype) :: max3d
825  real(kind=realtype) :: max4
826  real(kind=realtype) :: max4d
827  real(kind=realtype) :: min2
828  real(kind=realtype) :: min2d
829  real(realtype) :: max5
830  real(realtype) :: max5d
831  real(kind=realtype) :: max6
832  real(kind=realtype) :: max6d
833  real(kind=realtype) :: max7
834  real(kind=realtype) :: max7d
835  real(kind=realtype) :: max8
836  real(kind=realtype) :: max8d
837  real(kind=realtype) :: min3
838  real(kind=realtype) :: min3d
839  real(realtype) :: max9
840  real(realtype) :: max9d
841  real(kind=realtype) :: max10
842  real(kind=realtype) :: max10d
843  real(kind=realtype) :: max11
844  real(kind=realtype) :: max11d
845  real(kind=realtype) :: max12
846  real(kind=realtype) :: max12d
847  real(kind=realtype) :: abs1
848  real(kind=realtype) :: abs1d
849  real(kind=realtype) :: abs2
850  real(kind=realtype) :: abs2d
851  real(kind=realtype) :: abs3
852  real(kind=realtype) :: abs3d
853  real(kind=realtype) :: abs4
854  real(kind=realtype) :: abs4d
855  real(kind=realtype) :: abs5
856  real(kind=realtype) :: abs5d
857  real(kind=realtype) :: abs6
858  real(kind=realtype) :: abs6d
859  real(kind=realtype) :: arg1
860  real(kind=realtype) :: arg1d
861  real(kind=realtype) :: temp
862  real(kind=realtype) :: temp0
863  real(kind=realtype) :: tempd
864  real(kind=realtype) :: tempd0
865  real(kind=realtype) :: temp1
866  real(kind=realtype) :: tempd1
867  integer :: branch
868  real(kind=realtype) :: temp2
869  real(kind=realtype) :: temp3
870  real(kind=realtype) :: tempd2
871  real(kind=realtype) :: tempd3
872  if (rfil .ge. 0.) then
873  abs0 = rfil
874  else
875  abs0 = -rfil
876  end if
877 ! check if rfil == 0. if so, the dissipative flux needs not to
878 ! be computed.
879  if (abs0 .ge. thresholdreal) then
880 ! set the value of plim. to be fully consistent this must have
881 ! the dimension of a pressure. therefore a fraction of pinfcorr
882 ! is used.
883  plim = 0.001_realtype*pinfcorr
884 ! determine whether or not the total energy must be corrected
885 ! for the presence of the turbulent kinetic energy.
886  correctfork = getcorrectfork()
887 ! initialize sface to zero. this value will be used if the
888 ! block is not moving.
889  sface = zero
890 ! set a couple of constants for the scheme.
891  fis2 = rfil*vis2
892  fis4 = rfil*vis4
893  sfil = one - rfil
894 ! initialize the dissipative residual to a certain times,
895 ! possibly zero, the previously stored value.
896 !$fwd-of ii-loop
897 ! compute the pressure sensor for each cell, in each direction:
898  do ii=0,ie*je*ke-1
899  i = mod(ii, ie) + 1
900  j = mod(ii/ie, je) + 1
901  k = ii/(ie*je) + 1
902  if (p(i+1, j, k) - p(i, j, k) .ge. 0.) then
903  abs1 = p(i+1, j, k) - p(i, j, k)
904  else
905  abs1 = -(p(i+1, j, k)-p(i, j, k))
906  end if
907  if (p(i, j, k) - p(i-1, j, k) .ge. 0.) then
908  abs4 = p(i, j, k) - p(i-1, j, k)
909  else
910  abs4 = -(p(i, j, k)-p(i-1, j, k))
911  end if
912  x1 = (p(i+1, j, k)-two*p(i, j, k)+p(i-1, j, k))/(omega*(p(i+1, j&
913 & , k)+two*p(i, j, k)+p(i-1, j, k))+oneminomega*(abs1+abs4)+plim&
914 & )
915  if (x1 .ge. 0.) then
916  dss(i, j, k, 1) = x1
917  else
918  dss(i, j, k, 1) = -x1
919  end if
920  if (p(i, j+1, k) - p(i, j, k) .ge. 0.) then
921  abs2 = p(i, j+1, k) - p(i, j, k)
922  else
923  abs2 = -(p(i, j+1, k)-p(i, j, k))
924  end if
925  if (p(i, j, k) - p(i, j-1, k) .ge. 0.) then
926  abs5 = p(i, j, k) - p(i, j-1, k)
927  else
928  abs5 = -(p(i, j, k)-p(i, j-1, k))
929  end if
930  x2 = (p(i, j+1, k)-two*p(i, j, k)+p(i, j-1, k))/(omega*(p(i, j+1&
931 & , k)+two*p(i, j, k)+p(i, j-1, k))+oneminomega*(abs2+abs5)+plim&
932 & )
933  if (x2 .ge. 0.) then
934  dss(i, j, k, 2) = x2
935  else
936  dss(i, j, k, 2) = -x2
937  end if
938  if (p(i, j, k+1) - p(i, j, k) .ge. 0.) then
939  abs3 = p(i, j, k+1) - p(i, j, k)
940  else
941  abs3 = -(p(i, j, k+1)-p(i, j, k))
942  end if
943  if (p(i, j, k) - p(i, j, k-1) .ge. 0.) then
944  abs6 = p(i, j, k) - p(i, j, k-1)
945  else
946  abs6 = -(p(i, j, k)-p(i, j, k-1))
947  end if
948  x3 = (p(i, j, k+1)-two*p(i, j, k)+p(i, j, k-1))/(omega*(p(i, j, &
949 & k+1)+two*p(i, j, k)+p(i, j, k-1))+oneminomega*(abs3+abs6)+plim&
950 & )
951  if (x3 .ge. 0.) then
952  dss(i, j, k, 3) = x3
953  else
954  dss(i, j, k, 3) = -x3
955  end if
956  end do
957  call pushreal8(sface)
958 !$fwd-of ii-loop
959 !
960 ! dissipative fluxes in the i-direction.
961 !
962  do ii=0,il*ny*nz-1
963  i = mod(ii, il) + 1
964  j = mod(ii/il, ny) + 2
965  k = ii/(il*ny) + 2
966 ! compute the dissipation coefficients for this face.
967  ppor = zero
968  if (pori(i, j, k) .eq. normalflux) ppor = one
969  if (dss(i, j, k, 1) .lt. dss(i+1, j, k, 1)) then
970  y1 = dss(i+1, j, k, 1)
971  else
972  y1 = dss(i, j, k, 1)
973  end if
974  if (dpmax .gt. y1) then
975  min1 = y1
976  else
977  min1 = dpmax
978  end if
979  dis2 = ppor*fis2*min1
980  arg1 = ppor*fis4
981  dis4 = mydim(arg1, dis2)
982 ! construct the vector of the first and third differences
983 ! multiplied by the appropriate constants.
984  ddw1 = w(i+1, j, k, irho) - w(i, j, k, irho)
985  dr = dis2*ddw1 - dis4*(w(i+2, j, k, irho)-w(i-1, j, k, irho)-&
986 & three*ddw1)
987  ddw2 = w(i+1, j, k, irho)*w(i+1, j, k, ivx) - w(i, j, k, irho)*w&
988 & (i, j, k, ivx)
989  dru = dis2*ddw2 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivx)-w(i&
990 & -1, j, k, irho)*w(i-1, j, k, ivx)-three*ddw2)
991  ddw3 = w(i+1, j, k, irho)*w(i+1, j, k, ivy) - w(i, j, k, irho)*w&
992 & (i, j, k, ivy)
993  drv = dis2*ddw3 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivy)-w(i&
994 & -1, j, k, irho)*w(i-1, j, k, ivy)-three*ddw3)
995  ddw4 = w(i+1, j, k, irho)*w(i+1, j, k, ivz) - w(i, j, k, irho)*w&
996 & (i, j, k, ivz)
997  drw = dis2*ddw4 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivz)-w(i&
998 & -1, j, k, irho)*w(i-1, j, k, ivz)-three*ddw4)
999  ddw5 = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
1000  dre = dis2*ddw5 - dis4*(w(i+2, j, k, irhoe)-w(i-1, j, k, irhoe)-&
1001 & three*ddw5)
1002 ! in case a k-equation is present, compute the difference
1003 ! of rhok and store the average value of k. if not present,
1004 ! set both these values to zero, such that later on no
1005 ! decision needs to be made anymore.
1006  if (correctfork) then
1007  ddw6 = w(i+1, j, k, irho)*w(i+1, j, k, itu1) - w(i, j, k, irho&
1008 & )*w(i, j, k, itu1)
1009  drk = dis2*ddw6 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, itu1)-&
1010 & w(i-1, j, k, irho)*w(i-1, j, k, itu1)-three*ddw6)
1011  kavg = half*(w(i, j, k, itu1)+w(i+1, j, k, itu1))
1012  else
1013  drk = zero
1014  kavg = zero
1015  end if
1016 ! compute the average value of gamma and compute some
1017 ! expressions in which it occurs.
1018  gammaavg = half*(gamma(i+1, j, k)+gamma(i, j, k))
1019  gm1 = gammaavg - one
1020  ovgm1 = one/gm1
1021  gm53 = gammaavg - five*third
1022 ! compute the average state at the interface.
1023  uavg = half*(w(i+1, j, k, ivx)+w(i, j, k, ivx))
1024  vavg = half*(w(i+1, j, k, ivy)+w(i, j, k, ivy))
1025  wavg = half*(w(i+1, j, k, ivz)+w(i, j, k, ivz))
1026  a2avg = half*(gamma(i+1, j, k)*p(i+1, j, k)/w(i+1, j, k, irho)+&
1027 & gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
1028  area = sqrt(si(i, j, k, 1)**2 + si(i, j, k, 2)**2 + si(i, j, k, &
1029 & 3)**2)
1030  if (1.e-25_realtype .lt. area) then
1031  max1 = area
1032  else
1033  max1 = 1.e-25_realtype
1034  end if
1035  tmp = one/max1
1036  sx = si(i, j, k, 1)*tmp
1037  sy = si(i, j, k, 2)*tmp
1038  sz = si(i, j, k, 3)*tmp
1039  alphaavg = half*(uavg**2+vavg**2+wavg**2)
1040  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
1041  aavg = sqrt(a2avg)
1042  unavg = uavg*sx + vavg*sy + wavg*sz
1043  ovaavg = one/aavg
1044  ova2avg = one/a2avg
1045 ! the mesh velocity if the face is moving. it must be
1046 ! divided by the area to obtain a true velocity.
1047  if (addgridvelocities) sface = sfacei(i, j, k)*tmp
1048  if (unavg - sface + aavg .ge. 0.) then
1049  lam1 = unavg - sface + aavg
1050  else
1051  lam1 = -(unavg-sface+aavg)
1052  end if
1053  if (unavg - sface - aavg .ge. 0.) then
1054  lam2 = unavg - sface - aavg
1055  else
1056  lam2 = -(unavg-sface-aavg)
1057  end if
1058  if (unavg - sface .ge. 0.) then
1059  lam3 = unavg - sface
1060  else
1061  lam3 = -(unavg-sface)
1062  end if
1063  rrad = lam3 + aavg
1064  if (lam1 .lt. epsacoustic*rrad) then
1065  max2 = epsacoustic*rrad
1066  else
1067  max2 = lam1
1068  end if
1069 ! multiply the eigenvalues by the area to obtain
1070 ! the correct values for the dissipation term.
1071  lam1 = max2*area
1072  if (lam2 .lt. epsacoustic*rrad) then
1073  max3 = epsacoustic*rrad
1074  else
1075  max3 = lam2
1076  end if
1077  lam2 = max3*area
1078  if (lam3 .lt. epsshear*rrad) then
1079  max4 = epsshear*rrad
1080  else
1081  max4 = lam3
1082  end if
1083  lam3 = max4*area
1084 ! some abbreviations, which occur quite often in the
1085 ! dissipation terms.
1086  abv1 = half*(lam1+lam2)
1087  abv2 = half*(lam1-lam2)
1088  abv3 = abv1 - lam3
1089  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53*&
1090 & drk
1091  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
1092  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
1093  abv7 = abv2*abv4*ovaavg + abv3*abv5
1094 ! compute and scatter the dissipative flux.
1095 ! density.
1096  fs = lam3*dr + abv6
1097  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
1098  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
1099 ! x-momentum.
1100  fs = lam3*dru + uavg*abv6 + sx*abv7
1101  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
1102  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
1103 ! y-momentum.
1104  fs = lam3*drv + vavg*abv6 + sy*abv7
1105  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
1106  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
1107 ! z-momentum.
1108  fs = lam3*drw + wavg*abv6 + sz*abv7
1109  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
1110  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
1111 ! energy.
1112  fs = lam3*dre + havg*abv6 + unavg*abv7
1113  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
1114  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
1115  end do
1116  call pushreal8(sface)
1117 !$fwd-of ii-loop
1118 !
1119 ! dissipative fluxes in the j-direction.
1120 !
1121  do ii=0,nx*jl*nz-1
1122  i = mod(ii, nx) + 2
1123  j = mod(ii/nx, jl) + 1
1124  k = ii/(nx*jl) + 2
1125 ! compute the dissipation coefficients for this face.
1126  ppor = zero
1127  if (porj(i, j, k) .eq. normalflux) ppor = one
1128  if (dss(i, j, k, 2) .lt. dss(i, j+1, k, 2)) then
1129  y2 = dss(i, j+1, k, 2)
1130  else
1131  y2 = dss(i, j, k, 2)
1132  end if
1133  if (dpmax .gt. y2) then
1134  min2 = y2
1135  else
1136  min2 = dpmax
1137  end if
1138  dis2 = ppor*fis2*min2
1139  arg1 = ppor*fis4
1140  dis4 = mydim(arg1, dis2)
1141 ! construct the vector of the first and third differences
1142 ! multiplied by the appropriate constants.
1143  ddw1 = w(i, j+1, k, irho) - w(i, j, k, irho)
1144  dr = dis2*ddw1 - dis4*(w(i, j+2, k, irho)-w(i, j-1, k, irho)-&
1145 & three*ddw1)
1146  ddw2 = w(i, j+1, k, irho)*w(i, j+1, k, ivx) - w(i, j, k, irho)*w&
1147 & (i, j, k, ivx)
1148  dru = dis2*ddw2 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivx)-w(i&
1149 & , j-1, k, irho)*w(i, j-1, k, ivx)-three*ddw2)
1150  ddw3 = w(i, j+1, k, irho)*w(i, j+1, k, ivy) - w(i, j, k, irho)*w&
1151 & (i, j, k, ivy)
1152  drv = dis2*ddw3 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivy)-w(i&
1153 & , j-1, k, irho)*w(i, j-1, k, ivy)-three*ddw3)
1154  ddw4 = w(i, j+1, k, irho)*w(i, j+1, k, ivz) - w(i, j, k, irho)*w&
1155 & (i, j, k, ivz)
1156  drw = dis2*ddw4 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivz)-w(i&
1157 & , j-1, k, irho)*w(i, j-1, k, ivz)-three*ddw4)
1158  ddw5 = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
1159  dre = dis2*ddw5 - dis4*(w(i, j+2, k, irhoe)-w(i, j-1, k, irhoe)-&
1160 & three*ddw5)
1161 ! in case a k-equation is present, compute the difference
1162 ! of rhok and store the average value of k. if not present,
1163 ! set both these values to zero, such that later on no
1164 ! decision needs to be made anymore.
1165  if (correctfork) then
1166  ddw6 = w(i, j+1, k, irho)*w(i, j+1, k, itu1) - w(i, j, k, irho&
1167 & )*w(i, j, k, itu1)
1168  drk = dis2*ddw6 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, itu1)-&
1169 & w(i, j-1, k, irho)*w(i, j-1, k, itu1)-three*ddw6)
1170  kavg = half*(w(i, j, k, itu1)+w(i, j+1, k, itu1))
1171  else
1172  drk = zero
1173  kavg = zero
1174  end if
1175 ! compute the average value of gamma and compute some
1176 ! expressions in which it occurs.
1177  gammaavg = half*(gamma(i, j+1, k)+gamma(i, j, k))
1178  gm1 = gammaavg - one
1179  ovgm1 = one/gm1
1180  gm53 = gammaavg - five*third
1181 ! compute the average state at the interface.
1182  uavg = half*(w(i, j+1, k, ivx)+w(i, j, k, ivx))
1183  vavg = half*(w(i, j+1, k, ivy)+w(i, j, k, ivy))
1184  wavg = half*(w(i, j+1, k, ivz)+w(i, j, k, ivz))
1185  a2avg = half*(gamma(i, j+1, k)*p(i, j+1, k)/w(i, j+1, k, irho)+&
1186 & gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
1187  area = sqrt(sj(i, j, k, 1)**2 + sj(i, j, k, 2)**2 + sj(i, j, k, &
1188 & 3)**2)
1189  if (1.e-25_realtype .lt. area) then
1190  max5 = area
1191  else
1192  max5 = 1.e-25_realtype
1193  end if
1194  tmp = one/max5
1195  sx = sj(i, j, k, 1)*tmp
1196  sy = sj(i, j, k, 2)*tmp
1197  sz = sj(i, j, k, 3)*tmp
1198  alphaavg = half*(uavg**2+vavg**2+wavg**2)
1199  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
1200  aavg = sqrt(a2avg)
1201  unavg = uavg*sx + vavg*sy + wavg*sz
1202  ovaavg = one/aavg
1203  ova2avg = one/a2avg
1204 ! the mesh velocity if the face is moving. it must be
1205 ! divided by the area to obtain a true velocity.
1206  if (addgridvelocities) sface = sfacej(i, j, k)*tmp
1207  if (unavg - sface + aavg .ge. 0.) then
1208  lam1 = unavg - sface + aavg
1209  else
1210  lam1 = -(unavg-sface+aavg)
1211  end if
1212  if (unavg - sface - aavg .ge. 0.) then
1213  lam2 = unavg - sface - aavg
1214  else
1215  lam2 = -(unavg-sface-aavg)
1216  end if
1217  if (unavg - sface .ge. 0.) then
1218  lam3 = unavg - sface
1219  else
1220  lam3 = -(unavg-sface)
1221  end if
1222  rrad = lam3 + aavg
1223  if (lam1 .lt. epsacoustic*rrad) then
1224  max6 = epsacoustic*rrad
1225  else
1226  max6 = lam1
1227  end if
1228 ! multiply the eigenvalues by the area to obtain
1229 ! the correct values for the dissipation term.
1230  lam1 = max6*area
1231  if (lam2 .lt. epsacoustic*rrad) then
1232  max7 = epsacoustic*rrad
1233  else
1234  max7 = lam2
1235  end if
1236  lam2 = max7*area
1237  if (lam3 .lt. epsshear*rrad) then
1238  max8 = epsshear*rrad
1239  else
1240  max8 = lam3
1241  end if
1242  lam3 = max8*area
1243 ! some abbreviations, which occur quite often in the
1244 ! dissipation terms.
1245  abv1 = half*(lam1+lam2)
1246  abv2 = half*(lam1-lam2)
1247  abv3 = abv1 - lam3
1248  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53*&
1249 & drk
1250  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
1251  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
1252  abv7 = abv2*abv4*ovaavg + abv3*abv5
1253 ! compute and scatter the dissipative flux.
1254 ! density.
1255  fs = lam3*dr + abv6
1256  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
1257  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
1258 ! x-momentum.
1259  fs = lam3*dru + uavg*abv6 + sx*abv7
1260  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
1261  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
1262 ! y-momentum.
1263  fs = lam3*drv + vavg*abv6 + sy*abv7
1264  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
1265  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
1266 ! z-momentum.
1267  fs = lam3*drw + wavg*abv6 + sz*abv7
1268  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
1269  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
1270 ! energy.
1271  fs = lam3*dre + havg*abv6 + unavg*abv7
1272  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
1273  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
1274  end do
1275  dssd = 0.0_8
1276  sfaced = 0.0_8
1277 !$bwd-of ii-loop
1278  do ii=0,nx*ny*kl-1
1279  i = mod(ii, nx) + 2
1280  j = mod(ii/nx, ny) + 2
1281  k = ii/(nx*ny) + 1
1282 ! compute the dissipation coefficients for this face.
1283  ppor = zero
1284  if (pork(i, j, k) .eq. normalflux) ppor = one
1285  if (dss(i, j, k, 3) .lt. dss(i, j, k+1, 3)) then
1286  y3 = dss(i, j, k+1, 3)
1287  call pushcontrol1b(0)
1288  else
1289  y3 = dss(i, j, k, 3)
1290  call pushcontrol1b(1)
1291  end if
1292  if (dpmax .gt. y3) then
1293  min3 = y3
1294  call pushcontrol1b(0)
1295  else
1296  min3 = dpmax
1297  call pushcontrol1b(1)
1298  end if
1299  dis2 = ppor*fis2*min3
1300  arg1 = ppor*fis4
1301  dis4 = mydim(arg1, dis2)
1302 ! construct the vector of the first and third differences
1303 ! multiplied by the appropriate constants.
1304  ddw1 = w(i, j, k+1, irho) - w(i, j, k, irho)
1305  dr = dis2*ddw1 - dis4*(w(i, j, k+2, irho)-w(i, j, k-1, irho)-&
1306 & three*ddw1)
1307  ddw2 = w(i, j, k+1, irho)*w(i, j, k+1, ivx) - w(i, j, k, irho)*w&
1308 & (i, j, k, ivx)
1309  dru = dis2*ddw2 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, ivx)-w(i&
1310 & , j, k-1, irho)*w(i, j, k-1, ivx)-three*ddw2)
1311  ddw3 = w(i, j, k+1, irho)*w(i, j, k+1, ivy) - w(i, j, k, irho)*w&
1312 & (i, j, k, ivy)
1313  drv = dis2*ddw3 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, ivy)-w(i&
1314 & , j, k-1, irho)*w(i, j, k-1, ivy)-three*ddw3)
1315  ddw4 = w(i, j, k+1, irho)*w(i, j, k+1, ivz) - w(i, j, k, irho)*w&
1316 & (i, j, k, ivz)
1317  drw = dis2*ddw4 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, ivz)-w(i&
1318 & , j, k-1, irho)*w(i, j, k-1, ivz)-three*ddw4)
1319  ddw5 = w(i, j, k+1, irhoe) - w(i, j, k, irhoe)
1320  dre = dis2*ddw5 - dis4*(w(i, j, k+2, irhoe)-w(i, j, k-1, irhoe)-&
1321 & three*ddw5)
1322 ! in case a k-equation is present, compute the difference
1323 ! of rhok and store the average value of k. if not present,
1324 ! set both these values to zero, such that later on no
1325 ! decision needs to be made anymore.
1326  if (correctfork) then
1327  ddw6 = w(i, j, k+1, irho)*w(i, j, k+1, itu1) - w(i, j, k, irho&
1328 & )*w(i, j, k, itu1)
1329  drk = dis2*ddw6 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, itu1)-&
1330 & w(i, j, k-1, irho)*w(i, j, k-1, itu1)-three*ddw6)
1331  kavg = half*(w(i, j, k+1, itu1)+w(i, j, k, itu1))
1332  call pushcontrol1b(1)
1333  else
1334  drk = zero
1335  kavg = zero
1336  call pushcontrol1b(0)
1337  end if
1338 ! compute the average value of gamma and compute some
1339 ! expressions in which it occurs.
1340  gammaavg = half*(gamma(i, j, k+1)+gamma(i, j, k))
1341  gm1 = gammaavg - one
1342  ovgm1 = one/gm1
1343  gm53 = gammaavg - five*third
1344 ! compute the average state at the interface.
1345  uavg = half*(w(i, j, k+1, ivx)+w(i, j, k, ivx))
1346  vavg = half*(w(i, j, k+1, ivy)+w(i, j, k, ivy))
1347  wavg = half*(w(i, j, k+1, ivz)+w(i, j, k, ivz))
1348  a2avg = half*(gamma(i, j, k+1)*p(i, j, k+1)/w(i, j, k+1, irho)+&
1349 & gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
1350  area = sqrt(sk(i, j, k, 1)**2 + sk(i, j, k, 2)**2 + sk(i, j, k, &
1351 & 3)**2)
1352  if (1.e-25_realtype .lt. area) then
1353  max9 = area
1354  call pushcontrol1b(0)
1355  else
1356  call pushcontrol1b(1)
1357  max9 = 1.e-25_realtype
1358  end if
1359  tmp = one/max9
1360  sx = sk(i, j, k, 1)*tmp
1361  sy = sk(i, j, k, 2)*tmp
1362  sz = sk(i, j, k, 3)*tmp
1363  alphaavg = half*(uavg**2+vavg**2+wavg**2)
1364  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
1365  aavg = sqrt(a2avg)
1366  unavg = uavg*sx + vavg*sy + wavg*sz
1367  ovaavg = one/aavg
1368  ova2avg = one/a2avg
1369 ! the mesh velocity if the face is moving. it must be
1370 ! divided by the area to obtain a true velocity.
1371  if (addgridvelocities) then
1372  sface = sfacek(i, j, k)*tmp
1373  call pushcontrol1b(1)
1374  else
1375  call pushcontrol1b(0)
1376  end if
1377  if (unavg - sface + aavg .ge. 0.) then
1378  lam1 = unavg - sface + aavg
1379  call pushcontrol1b(0)
1380  else
1381  lam1 = -(unavg-sface+aavg)
1382  call pushcontrol1b(1)
1383  end if
1384  if (unavg - sface - aavg .ge. 0.) then
1385  lam2 = unavg - sface - aavg
1386  call pushcontrol1b(0)
1387  else
1388  lam2 = -(unavg-sface-aavg)
1389  call pushcontrol1b(1)
1390  end if
1391  if (unavg - sface .ge. 0.) then
1392  lam3 = unavg - sface
1393  call pushcontrol1b(0)
1394  else
1395  lam3 = -(unavg-sface)
1396  call pushcontrol1b(1)
1397  end if
1398  rrad = lam3 + aavg
1399  if (lam1 .lt. epsacoustic*rrad) then
1400  max10 = epsacoustic*rrad
1401  call pushcontrol1b(0)
1402  else
1403  max10 = lam1
1404  call pushcontrol1b(1)
1405  end if
1406 ! multiply the eigenvalues by the area to obtain
1407 ! the correct values for the dissipation term.
1408  lam1 = max10*area
1409  if (lam2 .lt. epsacoustic*rrad) then
1410  max11 = epsacoustic*rrad
1411  call pushcontrol1b(0)
1412  else
1413  max11 = lam2
1414  call pushcontrol1b(1)
1415  end if
1416  lam2 = max11*area
1417  if (lam3 .lt. epsshear*rrad) then
1418  max12 = epsshear*rrad
1419  call pushcontrol1b(0)
1420  else
1421  max12 = lam3
1422  call pushcontrol1b(1)
1423  end if
1424  lam3 = max12*area
1425 ! some abbreviations, which occur quite often in the
1426 ! dissipation terms.
1427  abv1 = half*(lam1+lam2)
1428  abv2 = half*(lam1-lam2)
1429  abv3 = abv1 - lam3
1430  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53*&
1431 & drk
1432  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
1433  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
1434  abv7 = abv2*abv4*ovaavg + abv3*abv5
1435 ! compute and scatter the dissipative flux.
1436 ! density.
1437 ! x-momentum.
1438 ! y-momentum.
1439 ! z-momentum.
1440 ! energy.
1441  fsd = fwd(i, j, k+1, irhoe) - fwd(i, j, k, irhoe)
1442  lam3d = dre*fsd
1443  dred = lam3*fsd
1444  havgd = abv6*fsd
1445  abv6d = havg*fsd
1446  unavgd = abv7*fsd
1447  abv7d = unavg*fsd
1448  fsd = fwd(i, j, k+1, imz) - fwd(i, j, k, imz)
1449  lam3d = lam3d + drw*fsd
1450  drwd = lam3*fsd
1451  wavgd = abv6*fsd
1452  abv6d = abv6d + wavg*fsd
1453  szd = abv7*fsd
1454  abv7d = abv7d + sz*fsd
1455  fsd = fwd(i, j, k+1, imy) - fwd(i, j, k, imy)
1456  lam3d = lam3d + drv*fsd
1457  drvd = lam3*fsd
1458  vavgd = abv6*fsd
1459  abv6d = abv6d + vavg*fsd
1460  syd = abv7*fsd
1461  abv7d = abv7d + sy*fsd
1462  fsd = fwd(i, j, k+1, imx) - fwd(i, j, k, imx)
1463  lam3d = lam3d + dru*fsd
1464  drud = lam3*fsd
1465  uavgd = abv6*fsd
1466  abv6d = abv6d + uavg*fsd
1467  sxd = abv7*fsd
1468  abv7d = abv7d + sx*fsd
1469  fsd = fwd(i, j, k+1, irho) - fwd(i, j, k, irho)
1470  abv6d = abv6d + fsd
1471  abv2d = abv4*ovaavg*abv7d + abv5*ovaavg*abv6d
1472  abv4d = abv2*ovaavg*abv7d + abv3*ova2avg*abv6d
1473  ovaavgd = abv2*abv4*abv7d + abv2*abv5*abv6d
1474  abv3d = abv5*abv7d + abv4*ova2avg*abv6d
1475  lam3d = lam3d + dr*fsd - abv3d
1476  abv5d = abv3*abv7d + abv2*ovaavg*abv6d
1477  ova2avgd = abv3*abv4*abv6d
1478  sxd = sxd + dru*abv5d
1479  syd = syd + drv*abv5d
1480  szd = szd + drw*abv5d
1481  unavgd = unavgd - dr*abv5d
1482  tempd2 = gm1*abv4d
1483  drd = lam3*fsd + alphaavg*tempd2 - unavg*abv5d
1484  drud = drud + sx*abv5d - uavg*tempd2
1485  drvd = drvd + sy*abv5d - vavg*tempd2
1486  drwd = drwd + sz*abv5d - wavg*tempd2
1487  drkd = -(gm53*abv4d)
1488  alphaavgd = dr*tempd2
1489  uavgd = uavgd - dru*tempd2
1490  vavgd = vavgd - drv*tempd2
1491  dred = dred + tempd2
1492  wavgd = wavgd - drw*tempd2
1493  abv1d = abv3d
1494  lam1d = half*abv2d + half*abv1d
1495  lam2d = half*abv1d - half*abv2d
1496  max12d = area*lam3d
1497  aread = max12*lam3d
1498  call popcontrol1b(branch)
1499  if (branch .eq. 0) then
1500  rradd = epsshear*max12d
1501  lam3d = 0.0_8
1502  else
1503  lam3d = max12d
1504  rradd = 0.0_8
1505  end if
1506  max11d = area*lam2d
1507  aread = aread + max11*lam2d
1508  call popcontrol1b(branch)
1509  if (branch .eq. 0) then
1510  rradd = rradd + epsacoustic*max11d
1511  lam2d = 0.0_8
1512  else
1513  lam2d = max11d
1514  end if
1515  max10d = area*lam1d
1516  aread = aread + max10*lam1d
1517  call popcontrol1b(branch)
1518  if (branch .eq. 0) then
1519  rradd = rradd + epsacoustic*max10d
1520  lam1d = 0.0_8
1521  else
1522  lam1d = max10d
1523  end if
1524  lam3d = lam3d + rradd
1525  aavgd = rradd
1526  call popcontrol1b(branch)
1527  if (branch .eq. 0) then
1528  unavgd = unavgd + lam3d
1529  sfaced = sfaced - lam3d
1530  else
1531  sfaced = sfaced + lam3d
1532  unavgd = unavgd - lam3d
1533  end if
1534  call popcontrol1b(branch)
1535  if (branch .eq. 0) then
1536  unavgd = unavgd + lam2d
1537  sfaced = sfaced - lam2d
1538  aavgd = aavgd - lam2d
1539  else
1540  sfaced = sfaced + lam2d
1541  unavgd = unavgd - lam2d
1542  aavgd = aavgd + lam2d
1543  end if
1544  call popcontrol1b(branch)
1545  if (branch .eq. 0) then
1546  unavgd = unavgd + lam1d
1547  sfaced = sfaced - lam1d
1548  aavgd = aavgd + lam1d
1549  else
1550  sfaced = sfaced + lam1d
1551  unavgd = unavgd - lam1d
1552  aavgd = aavgd - lam1d
1553  end if
1554  call popcontrol1b(branch)
1555  if (branch .eq. 0) then
1556  tmpd = 0.0_8
1557  else
1558  sfacekd(i, j, k) = sfacekd(i, j, k) + tmp*sfaced
1559  tmpd = sfacek(i, j, k)*sfaced
1560  sfaced = 0.0_8
1561  end if
1562  alphaavgd = alphaavgd + havgd
1563  tempd2 = half*alphaavgd
1564  aavgd = aavgd - one*ovaavgd/aavg**2
1565  if (a2avg .eq. 0.0_8) then
1566  a2avgd = ovgm1*havgd - one*ova2avgd/a2avg**2
1567  else
1568  a2avgd = aavgd/(2.0*sqrt(a2avg)) - one*ova2avgd/a2avg**2 + &
1569 & ovgm1*havgd
1570  end if
1571  uavgd = uavgd + sx*unavgd + 2*uavg*tempd2
1572  sxd = sxd + uavg*unavgd
1573  vavgd = vavgd + sy*unavgd + 2*vavg*tempd2
1574  syd = syd + vavg*unavgd
1575  wavgd = wavgd + sz*unavgd + 2*wavg*tempd2
1576  szd = szd + wavg*unavgd
1577  kavgd = -(gm53*ovgm1*havgd)
1578  skd(i, j, k, 3) = skd(i, j, k, 3) + tmp*szd
1579  tmpd = tmpd + sk(i, j, k, 3)*szd + sk(i, j, k, 2)*syd + sk(i, j&
1580 & , k, 1)*sxd
1581  skd(i, j, k, 2) = skd(i, j, k, 2) + tmp*syd
1582  skd(i, j, k, 1) = skd(i, j, k, 1) + tmp*sxd
1583  max9d = -(one*tmpd/max9**2)
1584  call popcontrol1b(branch)
1585  if (branch .eq. 0) aread = aread + max9d
1586  temp3 = sk(i, j, k, 3)
1587  temp2 = sk(i, j, k, 2)
1588  temp1 = sk(i, j, k, 1)
1589  if (temp1**2 + temp2**2 + temp3**2 .eq. 0.0_8) then
1590  tempd = 0.0_8
1591  else
1592  tempd = aread/(2.0*sqrt(temp1**2+temp2**2+temp3**2))
1593  end if
1594  skd(i, j, k, 1) = skd(i, j, k, 1) + 2*temp1*tempd
1595  skd(i, j, k, 2) = skd(i, j, k, 2) + 2*temp2*tempd
1596  skd(i, j, k, 3) = skd(i, j, k, 3) + 2*temp3*tempd
1597  temp3 = w(i, j, k+1, irho)
1598  temp1 = w(i, j, k, irho)
1599  tempd3 = gamma(i, j, k+1)*half*a2avgd/temp3
1600  tempd = gamma(i, j, k)*half*a2avgd/temp1
1601  pd(i, j, k) = pd(i, j, k) + tempd
1602  wd(i, j, k, irho) = wd(i, j, k, irho) - p(i, j, k)*tempd/temp1
1603  pd(i, j, k+1) = pd(i, j, k+1) + tempd3
1604  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) - p(i, j, k+1)*tempd3/&
1605 & temp3
1606  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + half*wavgd
1607  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wavgd
1608  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + half*vavgd
1609  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vavgd
1610  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + half*uavgd
1611  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*uavgd
1612  call popcontrol1b(branch)
1613  if (branch .eq. 0) then
1614  dis2d = 0.0_8
1615  dis4d = 0.0_8
1616  else
1617  tempd0 = -(dis4*drkd)
1618  wd(i, j, k+1, itu1) = wd(i, j, k+1, itu1) + half*kavgd
1619  wd(i, j, k, itu1) = wd(i, j, k, itu1) + half*kavgd
1620  temp3 = w(i, j, k-1, itu1)
1621  temp2 = w(i, j, k-1, irho)
1622  temp1 = w(i, j, k+2, itu1)
1623  temp0 = w(i, j, k+2, irho)
1624  dis2d = ddw6*drkd
1625  ddw6d = dis2*drkd - three*tempd0
1626  dis4d = -((temp0*temp1-temp2*temp3-three*ddw6)*drkd)
1627  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + temp1*tempd0
1628  wd(i, j, k+2, itu1) = wd(i, j, k+2, itu1) + temp0*tempd0
1629  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - temp3*tempd0
1630  wd(i, j, k-1, itu1) = wd(i, j, k-1, itu1) - temp2*tempd0
1631  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, itu1)&
1632 & *ddw6d
1633  wd(i, j, k+1, itu1) = wd(i, j, k+1, itu1) + w(i, j, k+1, irho)&
1634 & *ddw6d
1635  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, itu1)*ddw6d
1636  wd(i, j, k, itu1) = wd(i, j, k, itu1) - w(i, j, k, irho)*ddw6d
1637  end if
1638  tempd0 = -(dis4*drwd)
1639  temp0 = w(i, j, k+2, irho)
1640  temp1 = w(i, j, k+2, ivz)
1641  temp2 = w(i, j, k-1, irho)
1642  temp3 = w(i, j, k-1, ivz)
1643  tempd2 = -(dis4*dred)
1644  dis2d = dis2d + ddw5*dred + ddw4*drwd + ddw3*drvd + ddw2*drud + &
1645 & ddw1*drd
1646  ddw5d = dis2*dred - three*tempd2
1647  dis4d = dis4d - (w(i, j, k+2, irhoe)-w(i, j, k-1, irhoe)-three*&
1648 & ddw5)*dred - (temp0*temp1-temp2*temp3-three*ddw4)*drwd
1649  wd(i, j, k+2, irhoe) = wd(i, j, k+2, irhoe) + tempd2
1650  wd(i, j, k-1, irhoe) = wd(i, j, k-1, irhoe) - tempd2
1651  wd(i, j, k+1, irhoe) = wd(i, j, k+1, irhoe) + ddw5d
1652  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddw5d
1653  ddw4d = dis2*drwd - three*tempd0
1654  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + temp1*tempd0
1655  wd(i, j, k+2, ivz) = wd(i, j, k+2, ivz) + temp0*tempd0
1656  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - temp3*tempd0
1657  wd(i, j, k-1, ivz) = wd(i, j, k-1, ivz) - temp2*tempd0
1658  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, ivz)*&
1659 & ddw4d
1660  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + w(i, j, k+1, irho)*&
1661 & ddw4d
1662  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivz)*ddw4d
1663  wd(i, j, k, ivz) = wd(i, j, k, ivz) - w(i, j, k, irho)*ddw4d
1664  temp3 = w(i, j, k-1, ivy)
1665  temp2 = w(i, j, k-1, irho)
1666  temp1 = w(i, j, k+2, ivy)
1667  temp0 = w(i, j, k+2, irho)
1668  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw3)*drvd
1669  tempd0 = -(dis4*drvd)
1670  ddw3d = dis2*drvd - three*tempd0
1671  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + temp1*tempd0
1672  wd(i, j, k+2, ivy) = wd(i, j, k+2, ivy) + temp0*tempd0
1673  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - temp3*tempd0
1674  wd(i, j, k-1, ivy) = wd(i, j, k-1, ivy) - temp2*tempd0
1675  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, ivy)*&
1676 & ddw3d
1677  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + w(i, j, k+1, irho)*&
1678 & ddw3d
1679  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivy)*ddw3d
1680  wd(i, j, k, ivy) = wd(i, j, k, ivy) - w(i, j, k, irho)*ddw3d
1681  temp3 = w(i, j, k-1, ivx)
1682  temp2 = w(i, j, k-1, irho)
1683  temp1 = w(i, j, k+2, ivx)
1684  temp0 = w(i, j, k+2, irho)
1685  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw2)*drud - (w(i&
1686 & , j, k+2, irho)-w(i, j, k-1, irho)-three*ddw1)*drd
1687  tempd0 = -(dis4*drud)
1688  ddw2d = dis2*drud - three*tempd0
1689  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + temp1*tempd0
1690  wd(i, j, k+2, ivx) = wd(i, j, k+2, ivx) + temp0*tempd0
1691  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - temp3*tempd0
1692  wd(i, j, k-1, ivx) = wd(i, j, k-1, ivx) - temp2*tempd0
1693  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, ivx)*&
1694 & ddw2d
1695  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + w(i, j, k+1, irho)*&
1696 & ddw2d
1697  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivx)*ddw2d
1698  wd(i, j, k, ivx) = wd(i, j, k, ivx) - w(i, j, k, irho)*ddw2d
1699  tempd2 = -(dis4*drd)
1700  ddw1d = dis2*drd - three*tempd2
1701  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + tempd2
1702  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - tempd2
1703  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + ddw1d
1704  wd(i, j, k, irho) = wd(i, j, k, irho) - ddw1d
1705  arg1d = 0.0_8
1706  call mydim_b(arg1, arg1d, dis2, dis2d, dis4d)
1707  min3d = ppor*fis2*dis2d
1708  call popcontrol1b(branch)
1709  if (branch .eq. 0) then
1710  y3d = min3d
1711  else
1712  y3d = 0.0_8
1713  end if
1714  call popcontrol1b(branch)
1715  if (branch .eq. 0) then
1716  dssd(i, j, k+1, 3) = dssd(i, j, k+1, 3) + y3d
1717  else
1718  dssd(i, j, k, 3) = dssd(i, j, k, 3) + y3d
1719  end if
1720  end do
1721  call popreal8(sface)
1722 !$bwd-of ii-loop
1723  do ii=0,nx*jl*nz-1
1724  i = mod(ii, nx) + 2
1725  j = mod(ii/nx, jl) + 1
1726  k = ii/(nx*jl) + 2
1727 ! compute the dissipation coefficients for this face.
1728  ppor = zero
1729  if (porj(i, j, k) .eq. normalflux) ppor = one
1730  if (dss(i, j, k, 2) .lt. dss(i, j+1, k, 2)) then
1731  y2 = dss(i, j+1, k, 2)
1732  call pushcontrol1b(0)
1733  else
1734  y2 = dss(i, j, k, 2)
1735  call pushcontrol1b(1)
1736  end if
1737  if (dpmax .gt. y2) then
1738  min2 = y2
1739  call pushcontrol1b(0)
1740  else
1741  min2 = dpmax
1742  call pushcontrol1b(1)
1743  end if
1744  dis2 = ppor*fis2*min2
1745  arg1 = ppor*fis4
1746  dis4 = mydim(arg1, dis2)
1747 ! construct the vector of the first and third differences
1748 ! multiplied by the appropriate constants.
1749  ddw1 = w(i, j+1, k, irho) - w(i, j, k, irho)
1750  dr = dis2*ddw1 - dis4*(w(i, j+2, k, irho)-w(i, j-1, k, irho)-&
1751 & three*ddw1)
1752  ddw2 = w(i, j+1, k, irho)*w(i, j+1, k, ivx) - w(i, j, k, irho)*w&
1753 & (i, j, k, ivx)
1754  dru = dis2*ddw2 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivx)-w(i&
1755 & , j-1, k, irho)*w(i, j-1, k, ivx)-three*ddw2)
1756  ddw3 = w(i, j+1, k, irho)*w(i, j+1, k, ivy) - w(i, j, k, irho)*w&
1757 & (i, j, k, ivy)
1758  drv = dis2*ddw3 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivy)-w(i&
1759 & , j-1, k, irho)*w(i, j-1, k, ivy)-three*ddw3)
1760  ddw4 = w(i, j+1, k, irho)*w(i, j+1, k, ivz) - w(i, j, k, irho)*w&
1761 & (i, j, k, ivz)
1762  drw = dis2*ddw4 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivz)-w(i&
1763 & , j-1, k, irho)*w(i, j-1, k, ivz)-three*ddw4)
1764  ddw5 = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
1765  dre = dis2*ddw5 - dis4*(w(i, j+2, k, irhoe)-w(i, j-1, k, irhoe)-&
1766 & three*ddw5)
1767 ! in case a k-equation is present, compute the difference
1768 ! of rhok and store the average value of k. if not present,
1769 ! set both these values to zero, such that later on no
1770 ! decision needs to be made anymore.
1771  if (correctfork) then
1772  ddw6 = w(i, j+1, k, irho)*w(i, j+1, k, itu1) - w(i, j, k, irho&
1773 & )*w(i, j, k, itu1)
1774  drk = dis2*ddw6 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, itu1)-&
1775 & w(i, j-1, k, irho)*w(i, j-1, k, itu1)-three*ddw6)
1776  kavg = half*(w(i, j, k, itu1)+w(i, j+1, k, itu1))
1777  call pushcontrol1b(1)
1778  else
1779  drk = zero
1780  kavg = zero
1781  call pushcontrol1b(0)
1782  end if
1783 ! compute the average value of gamma and compute some
1784 ! expressions in which it occurs.
1785  gammaavg = half*(gamma(i, j+1, k)+gamma(i, j, k))
1786  gm1 = gammaavg - one
1787  ovgm1 = one/gm1
1788  gm53 = gammaavg - five*third
1789 ! compute the average state at the interface.
1790  uavg = half*(w(i, j+1, k, ivx)+w(i, j, k, ivx))
1791  vavg = half*(w(i, j+1, k, ivy)+w(i, j, k, ivy))
1792  wavg = half*(w(i, j+1, k, ivz)+w(i, j, k, ivz))
1793  a2avg = half*(gamma(i, j+1, k)*p(i, j+1, k)/w(i, j+1, k, irho)+&
1794 & gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
1795  area = sqrt(sj(i, j, k, 1)**2 + sj(i, j, k, 2)**2 + sj(i, j, k, &
1796 & 3)**2)
1797  if (1.e-25_realtype .lt. area) then
1798  max5 = area
1799  call pushcontrol1b(0)
1800  else
1801  call pushcontrol1b(1)
1802  max5 = 1.e-25_realtype
1803  end if
1804  tmp = one/max5
1805  sx = sj(i, j, k, 1)*tmp
1806  sy = sj(i, j, k, 2)*tmp
1807  sz = sj(i, j, k, 3)*tmp
1808  alphaavg = half*(uavg**2+vavg**2+wavg**2)
1809  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
1810  aavg = sqrt(a2avg)
1811  unavg = uavg*sx + vavg*sy + wavg*sz
1812  ovaavg = one/aavg
1813  ova2avg = one/a2avg
1814 ! the mesh velocity if the face is moving. it must be
1815 ! divided by the area to obtain a true velocity.
1816  if (addgridvelocities) then
1817  sface = sfacej(i, j, k)*tmp
1818  call pushcontrol1b(1)
1819  else
1820  call pushcontrol1b(0)
1821  end if
1822  if (unavg - sface + aavg .ge. 0.) then
1823  lam1 = unavg - sface + aavg
1824  call pushcontrol1b(0)
1825  else
1826  lam1 = -(unavg-sface+aavg)
1827  call pushcontrol1b(1)
1828  end if
1829  if (unavg - sface - aavg .ge. 0.) then
1830  lam2 = unavg - sface - aavg
1831  call pushcontrol1b(0)
1832  else
1833  lam2 = -(unavg-sface-aavg)
1834  call pushcontrol1b(1)
1835  end if
1836  if (unavg - sface .ge. 0.) then
1837  lam3 = unavg - sface
1838  call pushcontrol1b(0)
1839  else
1840  lam3 = -(unavg-sface)
1841  call pushcontrol1b(1)
1842  end if
1843  rrad = lam3 + aavg
1844  if (lam1 .lt. epsacoustic*rrad) then
1845  max6 = epsacoustic*rrad
1846  call pushcontrol1b(0)
1847  else
1848  max6 = lam1
1849  call pushcontrol1b(1)
1850  end if
1851 ! multiply the eigenvalues by the area to obtain
1852 ! the correct values for the dissipation term.
1853  lam1 = max6*area
1854  if (lam2 .lt. epsacoustic*rrad) then
1855  max7 = epsacoustic*rrad
1856  call pushcontrol1b(0)
1857  else
1858  max7 = lam2
1859  call pushcontrol1b(1)
1860  end if
1861  lam2 = max7*area
1862  if (lam3 .lt. epsshear*rrad) then
1863  max8 = epsshear*rrad
1864  call pushcontrol1b(0)
1865  else
1866  max8 = lam3
1867  call pushcontrol1b(1)
1868  end if
1869  lam3 = max8*area
1870 ! some abbreviations, which occur quite often in the
1871 ! dissipation terms.
1872  abv1 = half*(lam1+lam2)
1873  abv2 = half*(lam1-lam2)
1874  abv3 = abv1 - lam3
1875  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53*&
1876 & drk
1877  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
1878  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
1879  abv7 = abv2*abv4*ovaavg + abv3*abv5
1880 ! compute and scatter the dissipative flux.
1881 ! density.
1882 ! x-momentum.
1883 ! y-momentum.
1884 ! z-momentum.
1885 ! energy.
1886  fsd = fwd(i, j+1, k, irhoe) - fwd(i, j, k, irhoe)
1887  lam3d = dre*fsd
1888  dred = lam3*fsd
1889  havgd = abv6*fsd
1890  abv6d = havg*fsd
1891  unavgd = abv7*fsd
1892  abv7d = unavg*fsd
1893  fsd = fwd(i, j+1, k, imz) - fwd(i, j, k, imz)
1894  lam3d = lam3d + drw*fsd
1895  drwd = lam3*fsd
1896  wavgd = abv6*fsd
1897  abv6d = abv6d + wavg*fsd
1898  szd = abv7*fsd
1899  abv7d = abv7d + sz*fsd
1900  fsd = fwd(i, j+1, k, imy) - fwd(i, j, k, imy)
1901  lam3d = lam3d + drv*fsd
1902  drvd = lam3*fsd
1903  vavgd = abv6*fsd
1904  abv6d = abv6d + vavg*fsd
1905  syd = abv7*fsd
1906  abv7d = abv7d + sy*fsd
1907  fsd = fwd(i, j+1, k, imx) - fwd(i, j, k, imx)
1908  lam3d = lam3d + dru*fsd
1909  drud = lam3*fsd
1910  uavgd = abv6*fsd
1911  abv6d = abv6d + uavg*fsd
1912  sxd = abv7*fsd
1913  abv7d = abv7d + sx*fsd
1914  fsd = fwd(i, j+1, k, irho) - fwd(i, j, k, irho)
1915  abv6d = abv6d + fsd
1916  abv2d = abv4*ovaavg*abv7d + abv5*ovaavg*abv6d
1917  abv4d = abv2*ovaavg*abv7d + abv3*ova2avg*abv6d
1918  ovaavgd = abv2*abv4*abv7d + abv2*abv5*abv6d
1919  abv3d = abv5*abv7d + abv4*ova2avg*abv6d
1920  lam3d = lam3d + dr*fsd - abv3d
1921  abv5d = abv3*abv7d + abv2*ovaavg*abv6d
1922  ova2avgd = abv3*abv4*abv6d
1923  sxd = sxd + dru*abv5d
1924  syd = syd + drv*abv5d
1925  szd = szd + drw*abv5d
1926  unavgd = unavgd - dr*abv5d
1927  tempd2 = gm1*abv4d
1928  drd = lam3*fsd + alphaavg*tempd2 - unavg*abv5d
1929  drud = drud + sx*abv5d - uavg*tempd2
1930  drvd = drvd + sy*abv5d - vavg*tempd2
1931  drwd = drwd + sz*abv5d - wavg*tempd2
1932  drkd = -(gm53*abv4d)
1933  alphaavgd = dr*tempd2
1934  uavgd = uavgd - dru*tempd2
1935  vavgd = vavgd - drv*tempd2
1936  dred = dred + tempd2
1937  wavgd = wavgd - drw*tempd2
1938  abv1d = abv3d
1939  lam1d = half*abv2d + half*abv1d
1940  lam2d = half*abv1d - half*abv2d
1941  max8d = area*lam3d
1942  aread = max8*lam3d
1943  call popcontrol1b(branch)
1944  if (branch .eq. 0) then
1945  rradd = epsshear*max8d
1946  lam3d = 0.0_8
1947  else
1948  lam3d = max8d
1949  rradd = 0.0_8
1950  end if
1951  max7d = area*lam2d
1952  aread = aread + max7*lam2d
1953  call popcontrol1b(branch)
1954  if (branch .eq. 0) then
1955  rradd = rradd + epsacoustic*max7d
1956  lam2d = 0.0_8
1957  else
1958  lam2d = max7d
1959  end if
1960  max6d = area*lam1d
1961  aread = aread + max6*lam1d
1962  call popcontrol1b(branch)
1963  if (branch .eq. 0) then
1964  rradd = rradd + epsacoustic*max6d
1965  lam1d = 0.0_8
1966  else
1967  lam1d = max6d
1968  end if
1969  lam3d = lam3d + rradd
1970  aavgd = rradd
1971  call popcontrol1b(branch)
1972  if (branch .eq. 0) then
1973  unavgd = unavgd + lam3d
1974  sfaced = sfaced - lam3d
1975  else
1976  sfaced = sfaced + lam3d
1977  unavgd = unavgd - lam3d
1978  end if
1979  call popcontrol1b(branch)
1980  if (branch .eq. 0) then
1981  unavgd = unavgd + lam2d
1982  sfaced = sfaced - lam2d
1983  aavgd = aavgd - lam2d
1984  else
1985  sfaced = sfaced + lam2d
1986  unavgd = unavgd - lam2d
1987  aavgd = aavgd + lam2d
1988  end if
1989  call popcontrol1b(branch)
1990  if (branch .eq. 0) then
1991  unavgd = unavgd + lam1d
1992  sfaced = sfaced - lam1d
1993  aavgd = aavgd + lam1d
1994  else
1995  sfaced = sfaced + lam1d
1996  unavgd = unavgd - lam1d
1997  aavgd = aavgd - lam1d
1998  end if
1999  call popcontrol1b(branch)
2000  if (branch .eq. 0) then
2001  tmpd = 0.0_8
2002  else
2003  sfacejd(i, j, k) = sfacejd(i, j, k) + tmp*sfaced
2004  tmpd = sfacej(i, j, k)*sfaced
2005  sfaced = 0.0_8
2006  end if
2007  alphaavgd = alphaavgd + havgd
2008  tempd2 = half*alphaavgd
2009  aavgd = aavgd - one*ovaavgd/aavg**2
2010  if (a2avg .eq. 0.0_8) then
2011  a2avgd = ovgm1*havgd - one*ova2avgd/a2avg**2
2012  else
2013  a2avgd = aavgd/(2.0*sqrt(a2avg)) - one*ova2avgd/a2avg**2 + &
2014 & ovgm1*havgd
2015  end if
2016  uavgd = uavgd + sx*unavgd + 2*uavg*tempd2
2017  sxd = sxd + uavg*unavgd
2018  vavgd = vavgd + sy*unavgd + 2*vavg*tempd2
2019  syd = syd + vavg*unavgd
2020  wavgd = wavgd + sz*unavgd + 2*wavg*tempd2
2021  szd = szd + wavg*unavgd
2022  kavgd = -(gm53*ovgm1*havgd)
2023  sjd(i, j, k, 3) = sjd(i, j, k, 3) + tmp*szd
2024  tmpd = tmpd + sj(i, j, k, 3)*szd + sj(i, j, k, 2)*syd + sj(i, j&
2025 & , k, 1)*sxd
2026  sjd(i, j, k, 2) = sjd(i, j, k, 2) + tmp*syd
2027  sjd(i, j, k, 1) = sjd(i, j, k, 1) + tmp*sxd
2028  max5d = -(one*tmpd/max5**2)
2029  call popcontrol1b(branch)
2030  if (branch .eq. 0) aread = aread + max5d
2031  temp3 = sj(i, j, k, 3)
2032  temp2 = sj(i, j, k, 2)
2033  temp1 = sj(i, j, k, 1)
2034  if (temp1**2 + temp2**2 + temp3**2 .eq. 0.0_8) then
2035  tempd = 0.0_8
2036  else
2037  tempd = aread/(2.0*sqrt(temp1**2+temp2**2+temp3**2))
2038  end if
2039  sjd(i, j, k, 1) = sjd(i, j, k, 1) + 2*temp1*tempd
2040  sjd(i, j, k, 2) = sjd(i, j, k, 2) + 2*temp2*tempd
2041  sjd(i, j, k, 3) = sjd(i, j, k, 3) + 2*temp3*tempd
2042  temp3 = w(i, j+1, k, irho)
2043  temp1 = w(i, j, k, irho)
2044  tempd3 = gamma(i, j+1, k)*half*a2avgd/temp3
2045  tempd = gamma(i, j, k)*half*a2avgd/temp1
2046  pd(i, j, k) = pd(i, j, k) + tempd
2047  wd(i, j, k, irho) = wd(i, j, k, irho) - p(i, j, k)*tempd/temp1
2048  pd(i, j+1, k) = pd(i, j+1, k) + tempd3
2049  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) - p(i, j+1, k)*tempd3/&
2050 & temp3
2051  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + half*wavgd
2052  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wavgd
2053  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + half*vavgd
2054  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vavgd
2055  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + half*uavgd
2056  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*uavgd
2057  call popcontrol1b(branch)
2058  if (branch .eq. 0) then
2059  dis2d = 0.0_8
2060  dis4d = 0.0_8
2061  else
2062  tempd0 = -(dis4*drkd)
2063  wd(i, j, k, itu1) = wd(i, j, k, itu1) + half*kavgd
2064  wd(i, j+1, k, itu1) = wd(i, j+1, k, itu1) + half*kavgd
2065  temp3 = w(i, j-1, k, itu1)
2066  temp2 = w(i, j-1, k, irho)
2067  temp1 = w(i, j+2, k, itu1)
2068  temp0 = w(i, j+2, k, irho)
2069  dis2d = ddw6*drkd
2070  ddw6d = dis2*drkd - three*tempd0
2071  dis4d = -((temp0*temp1-temp2*temp3-three*ddw6)*drkd)
2072  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + temp1*tempd0
2073  wd(i, j+2, k, itu1) = wd(i, j+2, k, itu1) + temp0*tempd0
2074  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - temp3*tempd0
2075  wd(i, j-1, k, itu1) = wd(i, j-1, k, itu1) - temp2*tempd0
2076  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, itu1)&
2077 & *ddw6d
2078  wd(i, j+1, k, itu1) = wd(i, j+1, k, itu1) + w(i, j+1, k, irho)&
2079 & *ddw6d
2080  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, itu1)*ddw6d
2081  wd(i, j, k, itu1) = wd(i, j, k, itu1) - w(i, j, k, irho)*ddw6d
2082  end if
2083  tempd0 = -(dis4*drwd)
2084  temp0 = w(i, j+2, k, irho)
2085  temp1 = w(i, j+2, k, ivz)
2086  temp2 = w(i, j-1, k, irho)
2087  temp3 = w(i, j-1, k, ivz)
2088  tempd2 = -(dis4*dred)
2089  dis2d = dis2d + ddw5*dred + ddw4*drwd + ddw3*drvd + ddw2*drud + &
2090 & ddw1*drd
2091  ddw5d = dis2*dred - three*tempd2
2092  dis4d = dis4d - (w(i, j+2, k, irhoe)-w(i, j-1, k, irhoe)-three*&
2093 & ddw5)*dred - (temp0*temp1-temp2*temp3-three*ddw4)*drwd
2094  wd(i, j+2, k, irhoe) = wd(i, j+2, k, irhoe) + tempd2
2095  wd(i, j-1, k, irhoe) = wd(i, j-1, k, irhoe) - tempd2
2096  wd(i, j+1, k, irhoe) = wd(i, j+1, k, irhoe) + ddw5d
2097  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddw5d
2098  ddw4d = dis2*drwd - three*tempd0
2099  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + temp1*tempd0
2100  wd(i, j+2, k, ivz) = wd(i, j+2, k, ivz) + temp0*tempd0
2101  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - temp3*tempd0
2102  wd(i, j-1, k, ivz) = wd(i, j-1, k, ivz) - temp2*tempd0
2103  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, ivz)*&
2104 & ddw4d
2105  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + w(i, j+1, k, irho)*&
2106 & ddw4d
2107  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivz)*ddw4d
2108  wd(i, j, k, ivz) = wd(i, j, k, ivz) - w(i, j, k, irho)*ddw4d
2109  temp3 = w(i, j-1, k, ivy)
2110  temp2 = w(i, j-1, k, irho)
2111  temp1 = w(i, j+2, k, ivy)
2112  temp0 = w(i, j+2, k, irho)
2113  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw3)*drvd
2114  tempd0 = -(dis4*drvd)
2115  ddw3d = dis2*drvd - three*tempd0
2116  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + temp1*tempd0
2117  wd(i, j+2, k, ivy) = wd(i, j+2, k, ivy) + temp0*tempd0
2118  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - temp3*tempd0
2119  wd(i, j-1, k, ivy) = wd(i, j-1, k, ivy) - temp2*tempd0
2120  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, ivy)*&
2121 & ddw3d
2122  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + w(i, j+1, k, irho)*&
2123 & ddw3d
2124  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivy)*ddw3d
2125  wd(i, j, k, ivy) = wd(i, j, k, ivy) - w(i, j, k, irho)*ddw3d
2126  temp3 = w(i, j-1, k, ivx)
2127  temp2 = w(i, j-1, k, irho)
2128  temp1 = w(i, j+2, k, ivx)
2129  temp0 = w(i, j+2, k, irho)
2130  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw2)*drud - (w(i&
2131 & , j+2, k, irho)-w(i, j-1, k, irho)-three*ddw1)*drd
2132  tempd0 = -(dis4*drud)
2133  ddw2d = dis2*drud - three*tempd0
2134  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + temp1*tempd0
2135  wd(i, j+2, k, ivx) = wd(i, j+2, k, ivx) + temp0*tempd0
2136  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - temp3*tempd0
2137  wd(i, j-1, k, ivx) = wd(i, j-1, k, ivx) - temp2*tempd0
2138  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, ivx)*&
2139 & ddw2d
2140  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + w(i, j+1, k, irho)*&
2141 & ddw2d
2142  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivx)*ddw2d
2143  wd(i, j, k, ivx) = wd(i, j, k, ivx) - w(i, j, k, irho)*ddw2d
2144  tempd2 = -(dis4*drd)
2145  ddw1d = dis2*drd - three*tempd2
2146  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + tempd2
2147  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - tempd2
2148  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + ddw1d
2149  wd(i, j, k, irho) = wd(i, j, k, irho) - ddw1d
2150  arg1d = 0.0_8
2151  call mydim_b(arg1, arg1d, dis2, dis2d, dis4d)
2152  min2d = ppor*fis2*dis2d
2153  call popcontrol1b(branch)
2154  if (branch .eq. 0) then
2155  y2d = min2d
2156  else
2157  y2d = 0.0_8
2158  end if
2159  call popcontrol1b(branch)
2160  if (branch .eq. 0) then
2161  dssd(i, j+1, k, 2) = dssd(i, j+1, k, 2) + y2d
2162  else
2163  dssd(i, j, k, 2) = dssd(i, j, k, 2) + y2d
2164  end if
2165  end do
2166  call popreal8(sface)
2167 !$bwd-of ii-loop
2168  do ii=0,il*ny*nz-1
2169  i = mod(ii, il) + 1
2170  j = mod(ii/il, ny) + 2
2171  k = ii/(il*ny) + 2
2172 ! compute the dissipation coefficients for this face.
2173  ppor = zero
2174  if (pori(i, j, k) .eq. normalflux) ppor = one
2175  if (dss(i, j, k, 1) .lt. dss(i+1, j, k, 1)) then
2176  y1 = dss(i+1, j, k, 1)
2177  call pushcontrol1b(0)
2178  else
2179  y1 = dss(i, j, k, 1)
2180  call pushcontrol1b(1)
2181  end if
2182  if (dpmax .gt. y1) then
2183  min1 = y1
2184  call pushcontrol1b(0)
2185  else
2186  min1 = dpmax
2187  call pushcontrol1b(1)
2188  end if
2189  dis2 = ppor*fis2*min1
2190  arg1 = ppor*fis4
2191  dis4 = mydim(arg1, dis2)
2192 ! construct the vector of the first and third differences
2193 ! multiplied by the appropriate constants.
2194  ddw1 = w(i+1, j, k, irho) - w(i, j, k, irho)
2195  dr = dis2*ddw1 - dis4*(w(i+2, j, k, irho)-w(i-1, j, k, irho)-&
2196 & three*ddw1)
2197  ddw2 = w(i+1, j, k, irho)*w(i+1, j, k, ivx) - w(i, j, k, irho)*w&
2198 & (i, j, k, ivx)
2199  dru = dis2*ddw2 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivx)-w(i&
2200 & -1, j, k, irho)*w(i-1, j, k, ivx)-three*ddw2)
2201  ddw3 = w(i+1, j, k, irho)*w(i+1, j, k, ivy) - w(i, j, k, irho)*w&
2202 & (i, j, k, ivy)
2203  drv = dis2*ddw3 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivy)-w(i&
2204 & -1, j, k, irho)*w(i-1, j, k, ivy)-three*ddw3)
2205  ddw4 = w(i+1, j, k, irho)*w(i+1, j, k, ivz) - w(i, j, k, irho)*w&
2206 & (i, j, k, ivz)
2207  drw = dis2*ddw4 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivz)-w(i&
2208 & -1, j, k, irho)*w(i-1, j, k, ivz)-three*ddw4)
2209  ddw5 = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
2210  dre = dis2*ddw5 - dis4*(w(i+2, j, k, irhoe)-w(i-1, j, k, irhoe)-&
2211 & three*ddw5)
2212 ! in case a k-equation is present, compute the difference
2213 ! of rhok and store the average value of k. if not present,
2214 ! set both these values to zero, such that later on no
2215 ! decision needs to be made anymore.
2216  if (correctfork) then
2217  ddw6 = w(i+1, j, k, irho)*w(i+1, j, k, itu1) - w(i, j, k, irho&
2218 & )*w(i, j, k, itu1)
2219  drk = dis2*ddw6 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, itu1)-&
2220 & w(i-1, j, k, irho)*w(i-1, j, k, itu1)-three*ddw6)
2221  kavg = half*(w(i, j, k, itu1)+w(i+1, j, k, itu1))
2222  call pushcontrol1b(1)
2223  else
2224  drk = zero
2225  kavg = zero
2226  call pushcontrol1b(0)
2227  end if
2228 ! compute the average value of gamma and compute some
2229 ! expressions in which it occurs.
2230  gammaavg = half*(gamma(i+1, j, k)+gamma(i, j, k))
2231  gm1 = gammaavg - one
2232  ovgm1 = one/gm1
2233  gm53 = gammaavg - five*third
2234 ! compute the average state at the interface.
2235  uavg = half*(w(i+1, j, k, ivx)+w(i, j, k, ivx))
2236  vavg = half*(w(i+1, j, k, ivy)+w(i, j, k, ivy))
2237  wavg = half*(w(i+1, j, k, ivz)+w(i, j, k, ivz))
2238  a2avg = half*(gamma(i+1, j, k)*p(i+1, j, k)/w(i+1, j, k, irho)+&
2239 & gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
2240  area = sqrt(si(i, j, k, 1)**2 + si(i, j, k, 2)**2 + si(i, j, k, &
2241 & 3)**2)
2242  if (1.e-25_realtype .lt. area) then
2243  max1 = area
2244  call pushcontrol1b(0)
2245  else
2246  call pushcontrol1b(1)
2247  max1 = 1.e-25_realtype
2248  end if
2249  tmp = one/max1
2250  sx = si(i, j, k, 1)*tmp
2251  sy = si(i, j, k, 2)*tmp
2252  sz = si(i, j, k, 3)*tmp
2253  alphaavg = half*(uavg**2+vavg**2+wavg**2)
2254  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
2255  aavg = sqrt(a2avg)
2256  unavg = uavg*sx + vavg*sy + wavg*sz
2257  ovaavg = one/aavg
2258  ova2avg = one/a2avg
2259 ! the mesh velocity if the face is moving. it must be
2260 ! divided by the area to obtain a true velocity.
2261  if (addgridvelocities) then
2262  sface = sfacei(i, j, k)*tmp
2263  call pushcontrol1b(1)
2264  else
2265  call pushcontrol1b(0)
2266  end if
2267  if (unavg - sface + aavg .ge. 0.) then
2268  lam1 = unavg - sface + aavg
2269  call pushcontrol1b(0)
2270  else
2271  lam1 = -(unavg-sface+aavg)
2272  call pushcontrol1b(1)
2273  end if
2274  if (unavg - sface - aavg .ge. 0.) then
2275  lam2 = unavg - sface - aavg
2276  call pushcontrol1b(0)
2277  else
2278  lam2 = -(unavg-sface-aavg)
2279  call pushcontrol1b(1)
2280  end if
2281  if (unavg - sface .ge. 0.) then
2282  lam3 = unavg - sface
2283  call pushcontrol1b(0)
2284  else
2285  lam3 = -(unavg-sface)
2286  call pushcontrol1b(1)
2287  end if
2288  rrad = lam3 + aavg
2289  if (lam1 .lt. epsacoustic*rrad) then
2290  max2 = epsacoustic*rrad
2291  call pushcontrol1b(0)
2292  else
2293  max2 = lam1
2294  call pushcontrol1b(1)
2295  end if
2296 ! multiply the eigenvalues by the area to obtain
2297 ! the correct values for the dissipation term.
2298  lam1 = max2*area
2299  if (lam2 .lt. epsacoustic*rrad) then
2300  max3 = epsacoustic*rrad
2301  call pushcontrol1b(0)
2302  else
2303  max3 = lam2
2304  call pushcontrol1b(1)
2305  end if
2306  lam2 = max3*area
2307  if (lam3 .lt. epsshear*rrad) then
2308  max4 = epsshear*rrad
2309  call pushcontrol1b(0)
2310  else
2311  max4 = lam3
2312  call pushcontrol1b(1)
2313  end if
2314  lam3 = max4*area
2315 ! some abbreviations, which occur quite often in the
2316 ! dissipation terms.
2317  abv1 = half*(lam1+lam2)
2318  abv2 = half*(lam1-lam2)
2319  abv3 = abv1 - lam3
2320  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53*&
2321 & drk
2322  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
2323  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
2324  abv7 = abv2*abv4*ovaavg + abv3*abv5
2325 ! compute and scatter the dissipative flux.
2326 ! density.
2327 ! x-momentum.
2328 ! y-momentum.
2329 ! z-momentum.
2330 ! energy.
2331  fsd = fwd(i+1, j, k, irhoe) - fwd(i, j, k, irhoe)
2332  lam3d = dre*fsd
2333  dred = lam3*fsd
2334  havgd = abv6*fsd
2335  abv6d = havg*fsd
2336  unavgd = abv7*fsd
2337  abv7d = unavg*fsd
2338  fsd = fwd(i+1, j, k, imz) - fwd(i, j, k, imz)
2339  lam3d = lam3d + drw*fsd
2340  drwd = lam3*fsd
2341  wavgd = abv6*fsd
2342  abv6d = abv6d + wavg*fsd
2343  szd = abv7*fsd
2344  abv7d = abv7d + sz*fsd
2345  fsd = fwd(i+1, j, k, imy) - fwd(i, j, k, imy)
2346  lam3d = lam3d + drv*fsd
2347  drvd = lam3*fsd
2348  vavgd = abv6*fsd
2349  abv6d = abv6d + vavg*fsd
2350  syd = abv7*fsd
2351  abv7d = abv7d + sy*fsd
2352  fsd = fwd(i+1, j, k, imx) - fwd(i, j, k, imx)
2353  lam3d = lam3d + dru*fsd
2354  drud = lam3*fsd
2355  uavgd = abv6*fsd
2356  abv6d = abv6d + uavg*fsd
2357  sxd = abv7*fsd
2358  abv7d = abv7d + sx*fsd
2359  fsd = fwd(i+1, j, k, irho) - fwd(i, j, k, irho)
2360  abv6d = abv6d + fsd
2361  abv2d = abv4*ovaavg*abv7d + abv5*ovaavg*abv6d
2362  abv4d = abv2*ovaavg*abv7d + abv3*ova2avg*abv6d
2363  ovaavgd = abv2*abv4*abv7d + abv2*abv5*abv6d
2364  abv3d = abv5*abv7d + abv4*ova2avg*abv6d
2365  lam3d = lam3d + dr*fsd - abv3d
2366  abv5d = abv3*abv7d + abv2*ovaavg*abv6d
2367  ova2avgd = abv3*abv4*abv6d
2368  sxd = sxd + dru*abv5d
2369  syd = syd + drv*abv5d
2370  szd = szd + drw*abv5d
2371  unavgd = unavgd - dr*abv5d
2372  tempd2 = gm1*abv4d
2373  drd = lam3*fsd + alphaavg*tempd2 - unavg*abv5d
2374  drud = drud + sx*abv5d - uavg*tempd2
2375  drvd = drvd + sy*abv5d - vavg*tempd2
2376  drwd = drwd + sz*abv5d - wavg*tempd2
2377  drkd = -(gm53*abv4d)
2378  alphaavgd = dr*tempd2
2379  uavgd = uavgd - dru*tempd2
2380  vavgd = vavgd - drv*tempd2
2381  dred = dred + tempd2
2382  wavgd = wavgd - drw*tempd2
2383  abv1d = abv3d
2384  lam1d = half*abv2d + half*abv1d
2385  lam2d = half*abv1d - half*abv2d
2386  max4d = area*lam3d
2387  aread = max4*lam3d
2388  call popcontrol1b(branch)
2389  if (branch .eq. 0) then
2390  rradd = epsshear*max4d
2391  lam3d = 0.0_8
2392  else
2393  lam3d = max4d
2394  rradd = 0.0_8
2395  end if
2396  max3d = area*lam2d
2397  aread = aread + max3*lam2d
2398  call popcontrol1b(branch)
2399  if (branch .eq. 0) then
2400  rradd = rradd + epsacoustic*max3d
2401  lam2d = 0.0_8
2402  else
2403  lam2d = max3d
2404  end if
2405  max2d = area*lam1d
2406  aread = aread + max2*lam1d
2407  call popcontrol1b(branch)
2408  if (branch .eq. 0) then
2409  rradd = rradd + epsacoustic*max2d
2410  lam1d = 0.0_8
2411  else
2412  lam1d = max2d
2413  end if
2414  lam3d = lam3d + rradd
2415  aavgd = rradd
2416  call popcontrol1b(branch)
2417  if (branch .eq. 0) then
2418  unavgd = unavgd + lam3d
2419  sfaced = sfaced - lam3d
2420  else
2421  sfaced = sfaced + lam3d
2422  unavgd = unavgd - lam3d
2423  end if
2424  call popcontrol1b(branch)
2425  if (branch .eq. 0) then
2426  unavgd = unavgd + lam2d
2427  sfaced = sfaced - lam2d
2428  aavgd = aavgd - lam2d
2429  else
2430  sfaced = sfaced + lam2d
2431  unavgd = unavgd - lam2d
2432  aavgd = aavgd + lam2d
2433  end if
2434  call popcontrol1b(branch)
2435  if (branch .eq. 0) then
2436  unavgd = unavgd + lam1d
2437  sfaced = sfaced - lam1d
2438  aavgd = aavgd + lam1d
2439  else
2440  sfaced = sfaced + lam1d
2441  unavgd = unavgd - lam1d
2442  aavgd = aavgd - lam1d
2443  end if
2444  call popcontrol1b(branch)
2445  if (branch .eq. 0) then
2446  tmpd = 0.0_8
2447  else
2448  sfaceid(i, j, k) = sfaceid(i, j, k) + tmp*sfaced
2449  tmpd = sfacei(i, j, k)*sfaced
2450  sfaced = 0.0_8
2451  end if
2452  alphaavgd = alphaavgd + havgd
2453  tempd2 = half*alphaavgd
2454  aavgd = aavgd - one*ovaavgd/aavg**2
2455  if (a2avg .eq. 0.0_8) then
2456  a2avgd = ovgm1*havgd - one*ova2avgd/a2avg**2
2457  else
2458  a2avgd = aavgd/(2.0*sqrt(a2avg)) - one*ova2avgd/a2avg**2 + &
2459 & ovgm1*havgd
2460  end if
2461  uavgd = uavgd + sx*unavgd + 2*uavg*tempd2
2462  sxd = sxd + uavg*unavgd
2463  vavgd = vavgd + sy*unavgd + 2*vavg*tempd2
2464  syd = syd + vavg*unavgd
2465  wavgd = wavgd + sz*unavgd + 2*wavg*tempd2
2466  szd = szd + wavg*unavgd
2467  kavgd = -(gm53*ovgm1*havgd)
2468  sid(i, j, k, 3) = sid(i, j, k, 3) + tmp*szd
2469  tmpd = tmpd + si(i, j, k, 3)*szd + si(i, j, k, 2)*syd + si(i, j&
2470 & , k, 1)*sxd
2471  sid(i, j, k, 2) = sid(i, j, k, 2) + tmp*syd
2472  sid(i, j, k, 1) = sid(i, j, k, 1) + tmp*sxd
2473  max1d = -(one*tmpd/max1**2)
2474  call popcontrol1b(branch)
2475  if (branch .eq. 0) aread = aread + max1d
2476  temp3 = si(i, j, k, 3)
2477  temp2 = si(i, j, k, 2)
2478  temp1 = si(i, j, k, 1)
2479  if (temp1**2 + temp2**2 + temp3**2 .eq. 0.0_8) then
2480  tempd = 0.0_8
2481  else
2482  tempd = aread/(2.0*sqrt(temp1**2+temp2**2+temp3**2))
2483  end if
2484  sid(i, j, k, 1) = sid(i, j, k, 1) + 2*temp1*tempd
2485  sid(i, j, k, 2) = sid(i, j, k, 2) + 2*temp2*tempd
2486  sid(i, j, k, 3) = sid(i, j, k, 3) + 2*temp3*tempd
2487  temp3 = w(i+1, j, k, irho)
2488  temp1 = w(i, j, k, irho)
2489  tempd3 = gamma(i+1, j, k)*half*a2avgd/temp3
2490  tempd = gamma(i, j, k)*half*a2avgd/temp1
2491  pd(i, j, k) = pd(i, j, k) + tempd
2492  wd(i, j, k, irho) = wd(i, j, k, irho) - p(i, j, k)*tempd/temp1
2493  pd(i+1, j, k) = pd(i+1, j, k) + tempd3
2494  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) - p(i+1, j, k)*tempd3/&
2495 & temp3
2496  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + half*wavgd
2497  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wavgd
2498  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + half*vavgd
2499  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vavgd
2500  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + half*uavgd
2501  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*uavgd
2502  call popcontrol1b(branch)
2503  if (branch .eq. 0) then
2504  dis2d = 0.0_8
2505  dis4d = 0.0_8
2506  else
2507  tempd0 = -(dis4*drkd)
2508  wd(i, j, k, itu1) = wd(i, j, k, itu1) + half*kavgd
2509  wd(i+1, j, k, itu1) = wd(i+1, j, k, itu1) + half*kavgd
2510  temp3 = w(i-1, j, k, itu1)
2511  temp2 = w(i-1, j, k, irho)
2512  temp1 = w(i+2, j, k, itu1)
2513  temp0 = w(i+2, j, k, irho)
2514  dis2d = ddw6*drkd
2515  ddw6d = dis2*drkd - three*tempd0
2516  dis4d = -((temp0*temp1-temp2*temp3-three*ddw6)*drkd)
2517  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + temp1*tempd0
2518  wd(i+2, j, k, itu1) = wd(i+2, j, k, itu1) + temp0*tempd0
2519  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - temp3*tempd0
2520  wd(i-1, j, k, itu1) = wd(i-1, j, k, itu1) - temp2*tempd0
2521  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, itu1)&
2522 & *ddw6d
2523  wd(i+1, j, k, itu1) = wd(i+1, j, k, itu1) + w(i+1, j, k, irho)&
2524 & *ddw6d
2525  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, itu1)*ddw6d
2526  wd(i, j, k, itu1) = wd(i, j, k, itu1) - w(i, j, k, irho)*ddw6d
2527  end if
2528  tempd1 = -(dis4*drd)
2529  tempd0 = -(dis4*drwd)
2530  temp0 = w(i+2, j, k, irho)
2531  temp1 = w(i+2, j, k, ivz)
2532  temp2 = w(i-1, j, k, irho)
2533  temp3 = w(i-1, j, k, ivz)
2534  tempd2 = -(dis4*dred)
2535  dis2d = dis2d + ddw5*dred + ddw4*drwd + ddw3*drvd + ddw2*drud + &
2536 & ddw1*drd
2537  ddw5d = dis2*dred - three*tempd2
2538  dis4d = dis4d - (w(i+2, j, k, irhoe)-w(i-1, j, k, irhoe)-three*&
2539 & ddw5)*dred - (temp0*temp1-temp2*temp3-three*ddw4)*drwd
2540  wd(i+2, j, k, irhoe) = wd(i+2, j, k, irhoe) + tempd2
2541  wd(i-1, j, k, irhoe) = wd(i-1, j, k, irhoe) - tempd2
2542  wd(i+1, j, k, irhoe) = wd(i+1, j, k, irhoe) + ddw5d
2543  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddw5d
2544  ddw4d = dis2*drwd - three*tempd0
2545  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + temp1*tempd0
2546  wd(i+2, j, k, ivz) = wd(i+2, j, k, ivz) + temp0*tempd0
2547  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - temp3*tempd0
2548  wd(i-1, j, k, ivz) = wd(i-1, j, k, ivz) - temp2*tempd0
2549  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, ivz)*&
2550 & ddw4d
2551  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + w(i+1, j, k, irho)*&
2552 & ddw4d
2553  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivz)*ddw4d
2554  wd(i, j, k, ivz) = wd(i, j, k, ivz) - w(i, j, k, irho)*ddw4d
2555  temp3 = w(i-1, j, k, ivy)
2556  temp2 = w(i-1, j, k, irho)
2557  temp1 = w(i+2, j, k, ivy)
2558  temp0 = w(i+2, j, k, irho)
2559  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw3)*drvd
2560  tempd0 = -(dis4*drvd)
2561  ddw3d = dis2*drvd - three*tempd0
2562  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + temp1*tempd0
2563  wd(i+2, j, k, ivy) = wd(i+2, j, k, ivy) + temp0*tempd0
2564  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - temp3*tempd0
2565  wd(i-1, j, k, ivy) = wd(i-1, j, k, ivy) - temp2*tempd0
2566  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, ivy)*&
2567 & ddw3d
2568  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + w(i+1, j, k, irho)*&
2569 & ddw3d
2570  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivy)*ddw3d
2571  wd(i, j, k, ivy) = wd(i, j, k, ivy) - w(i, j, k, irho)*ddw3d
2572  temp1 = w(i-1, j, k, ivx)
2573  temp0 = w(i-1, j, k, irho)
2574  temp = w(i+2, j, k, ivx)
2575  temp2 = w(i+2, j, k, irho)
2576  dis4d = dis4d - (temp2*temp-temp0*temp1-three*ddw2)*drud - (w(i+&
2577 & 2, j, k, irho)-w(i-1, j, k, irho)-three*ddw1)*drd
2578  tempd2 = -(dis4*drud)
2579  ddw2d = dis2*drud - three*tempd2
2580  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + temp*tempd2
2581  wd(i+2, j, k, ivx) = wd(i+2, j, k, ivx) + temp2*tempd2
2582  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - temp1*tempd2
2583  wd(i-1, j, k, ivx) = wd(i-1, j, k, ivx) - temp0*tempd2
2584  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, ivx)*&
2585 & ddw2d
2586  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + w(i+1, j, k, irho)*&
2587 & ddw2d
2588  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivx)*ddw2d
2589  wd(i, j, k, ivx) = wd(i, j, k, ivx) - w(i, j, k, irho)*ddw2d
2590  ddw1d = dis2*drd - three*tempd1
2591  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + tempd1
2592  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - tempd1
2593  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + ddw1d
2594  wd(i, j, k, irho) = wd(i, j, k, irho) - ddw1d
2595  arg1d = 0.0_8
2596  call mydim_b(arg1, arg1d, dis2, dis2d, dis4d)
2597  min1d = ppor*fis2*dis2d
2598  call popcontrol1b(branch)
2599  if (branch .eq. 0) then
2600  y1d = min1d
2601  else
2602  y1d = 0.0_8
2603  end if
2604  call popcontrol1b(branch)
2605  if (branch .eq. 0) then
2606  dssd(i+1, j, k, 1) = dssd(i+1, j, k, 1) + y1d
2607  else
2608  dssd(i, j, k, 1) = dssd(i, j, k, 1) + y1d
2609  end if
2610  end do
2611  plimd = 0.0_8
2612 !$bwd-of ii-loop
2613  do ii=0,ie*je*ke-1
2614  i = mod(ii, ie) + 1
2615  j = mod(ii/ie, je) + 1
2616  k = ii/(ie*je) + 1
2617  if (p(i+1, j, k) - p(i, j, k) .ge. 0.) then
2618  abs1 = p(i+1, j, k) - p(i, j, k)
2619  call pushcontrol1b(1)
2620  else
2621  abs1 = -(p(i+1, j, k)-p(i, j, k))
2622  call pushcontrol1b(0)
2623  end if
2624  if (p(i, j, k) - p(i-1, j, k) .ge. 0.) then
2625  abs4 = p(i, j, k) - p(i-1, j, k)
2626  call pushcontrol1b(0)
2627  else
2628  abs4 = -(p(i, j, k)-p(i-1, j, k))
2629  call pushcontrol1b(1)
2630  end if
2631  x1 = (p(i+1, j, k)-two*p(i, j, k)+p(i-1, j, k))/(omega*(p(i+1, j&
2632 & , k)+two*p(i, j, k)+p(i-1, j, k))+oneminomega*(abs1+abs4)+plim&
2633 & )
2634  if (x1 .ge. 0.) then
2635  call pushcontrol1b(0)
2636  else
2637  call pushcontrol1b(1)
2638  end if
2639  if (p(i, j+1, k) - p(i, j, k) .ge. 0.) then
2640  abs2 = p(i, j+1, k) - p(i, j, k)
2641  call pushcontrol1b(1)
2642  else
2643  abs2 = -(p(i, j+1, k)-p(i, j, k))
2644  call pushcontrol1b(0)
2645  end if
2646  if (p(i, j, k) - p(i, j-1, k) .ge. 0.) then
2647  abs5 = p(i, j, k) - p(i, j-1, k)
2648  call pushcontrol1b(0)
2649  else
2650  abs5 = -(p(i, j, k)-p(i, j-1, k))
2651  call pushcontrol1b(1)
2652  end if
2653  x2 = (p(i, j+1, k)-two*p(i, j, k)+p(i, j-1, k))/(omega*(p(i, j+1&
2654 & , k)+two*p(i, j, k)+p(i, j-1, k))+oneminomega*(abs2+abs5)+plim&
2655 & )
2656  if (x2 .ge. 0.) then
2657  call pushcontrol1b(0)
2658  else
2659  call pushcontrol1b(1)
2660  end if
2661  if (p(i, j, k+1) - p(i, j, k) .ge. 0.) then
2662  abs3 = p(i, j, k+1) - p(i, j, k)
2663  call pushcontrol1b(1)
2664  else
2665  abs3 = -(p(i, j, k+1)-p(i, j, k))
2666  call pushcontrol1b(0)
2667  end if
2668  if (p(i, j, k) - p(i, j, k-1) .ge. 0.) then
2669  abs6 = p(i, j, k) - p(i, j, k-1)
2670  call pushcontrol1b(0)
2671  else
2672  abs6 = -(p(i, j, k)-p(i, j, k-1))
2673  call pushcontrol1b(1)
2674  end if
2675  x3 = (p(i, j, k+1)-two*p(i, j, k)+p(i, j, k-1))/(omega*(p(i, j, &
2676 & k+1)+two*p(i, j, k)+p(i, j, k-1))+oneminomega*(abs3+abs6)+plim&
2677 & )
2678  if (x3 .ge. 0.) then
2679  x3d = dssd(i, j, k, 3)
2680  dssd(i, j, k, 3) = 0.0_8
2681  else
2682  x3d = -dssd(i, j, k, 3)
2683  dssd(i, j, k, 3) = 0.0_8
2684  end if
2685  temp1 = omega*(p(i, j, k+1)+two*p(i, j, k)+p(i, j, k-1)) + &
2686 & oneminomega*(abs3+abs6) + plim
2687  tempd = x3d/temp1
2688  tempd1 = -((p(i, j, k+1)-two*p(i, j, k)+p(i, j, k-1))*tempd/&
2689 & temp1)
2690  tempd0 = omega*tempd1
2691  pd(i, j, k+1) = pd(i, j, k+1) + tempd + tempd0
2692  pd(i, j, k) = pd(i, j, k) + two*tempd0 - two*tempd
2693  pd(i, j, k-1) = pd(i, j, k-1) + tempd + tempd0
2694  abs3d = oneminomega*tempd1
2695  abs6d = oneminomega*tempd1
2696  plimd = plimd + tempd1
2697  call popcontrol1b(branch)
2698  if (branch .eq. 0) then
2699  pd(i, j, k) = pd(i, j, k) + abs6d
2700  pd(i, j, k-1) = pd(i, j, k-1) - abs6d
2701  else
2702  pd(i, j, k-1) = pd(i, j, k-1) + abs6d
2703  pd(i, j, k) = pd(i, j, k) - abs6d
2704  end if
2705  call popcontrol1b(branch)
2706  if (branch .eq. 0) then
2707  pd(i, j, k) = pd(i, j, k) + abs3d
2708  pd(i, j, k+1) = pd(i, j, k+1) - abs3d
2709  else
2710  pd(i, j, k+1) = pd(i, j, k+1) + abs3d
2711  pd(i, j, k) = pd(i, j, k) - abs3d
2712  end if
2713  call popcontrol1b(branch)
2714  if (branch .eq. 0) then
2715  x2d = dssd(i, j, k, 2)
2716  dssd(i, j, k, 2) = 0.0_8
2717  else
2718  x2d = -dssd(i, j, k, 2)
2719  dssd(i, j, k, 2) = 0.0_8
2720  end if
2721  temp1 = omega*(p(i, j+1, k)+two*p(i, j, k)+p(i, j-1, k)) + &
2722 & oneminomega*(abs2+abs5) + plim
2723  tempd = x2d/temp1
2724  tempd1 = -((p(i, j+1, k)-two*p(i, j, k)+p(i, j-1, k))*tempd/&
2725 & temp1)
2726  tempd0 = omega*tempd1
2727  pd(i, j+1, k) = pd(i, j+1, k) + tempd + tempd0
2728  pd(i, j, k) = pd(i, j, k) + two*tempd0 - two*tempd
2729  pd(i, j-1, k) = pd(i, j-1, k) + tempd + tempd0
2730  abs2d = oneminomega*tempd1
2731  abs5d = oneminomega*tempd1
2732  plimd = plimd + tempd1
2733  call popcontrol1b(branch)
2734  if (branch .eq. 0) then
2735  pd(i, j, k) = pd(i, j, k) + abs5d
2736  pd(i, j-1, k) = pd(i, j-1, k) - abs5d
2737  else
2738  pd(i, j-1, k) = pd(i, j-1, k) + abs5d
2739  pd(i, j, k) = pd(i, j, k) - abs5d
2740  end if
2741  call popcontrol1b(branch)
2742  if (branch .eq. 0) then
2743  pd(i, j, k) = pd(i, j, k) + abs2d
2744  pd(i, j+1, k) = pd(i, j+1, k) - abs2d
2745  else
2746  pd(i, j+1, k) = pd(i, j+1, k) + abs2d
2747  pd(i, j, k) = pd(i, j, k) - abs2d
2748  end if
2749  call popcontrol1b(branch)
2750  if (branch .eq. 0) then
2751  x1d = dssd(i, j, k, 1)
2752  dssd(i, j, k, 1) = 0.0_8
2753  else
2754  x1d = -dssd(i, j, k, 1)
2755  dssd(i, j, k, 1) = 0.0_8
2756  end if
2757  temp = omega*(p(i+1, j, k)+two*p(i, j, k)+p(i-1, j, k)) + &
2758 & oneminomega*(abs1+abs4) + plim
2759  tempd = x1d/temp
2760  tempd0 = -((p(i+1, j, k)-two*p(i, j, k)+p(i-1, j, k))*tempd/temp&
2761 & )
2762  tempd1 = omega*tempd0
2763  pd(i+1, j, k) = pd(i+1, j, k) + tempd + tempd1
2764  pd(i, j, k) = pd(i, j, k) + two*tempd1 - two*tempd
2765  pd(i-1, j, k) = pd(i-1, j, k) + tempd + tempd1
2766  abs1d = oneminomega*tempd0
2767  abs4d = oneminomega*tempd0
2768  plimd = plimd + tempd0
2769  call popcontrol1b(branch)
2770  if (branch .eq. 0) then
2771  pd(i, j, k) = pd(i, j, k) + abs4d
2772  pd(i-1, j, k) = pd(i-1, j, k) - abs4d
2773  else
2774  pd(i-1, j, k) = pd(i-1, j, k) + abs4d
2775  pd(i, j, k) = pd(i, j, k) - abs4d
2776  end if
2777  call popcontrol1b(branch)
2778  if (branch .eq. 0) then
2779  pd(i, j, k) = pd(i, j, k) + abs1d
2780  pd(i+1, j, k) = pd(i+1, j, k) - abs1d
2781  else
2782  pd(i+1, j, k) = pd(i+1, j, k) + abs1d
2783  pd(i, j, k) = pd(i, j, k) - abs1d
2784  end if
2785  end do
2786  fwd = sfil*fwd
2787  pinfcorrd = pinfcorrd + 0.001_realtype*plimd
2788  end if
2789  end subroutine invisciddissfluxmatrix_b
2790 
2792 !
2793 ! invisciddissfluxmatrix computes the matrix artificial
2794 ! dissipation term. instead of the spectral radius, as used in
2795 ! the scalar dissipation scheme, the absolute value of the flux
2796 ! jacobian is used. this leads to a less diffusive and
2797 ! consequently more accurate scheme. it is assumed that the
2798 ! pointers in blockpointers already point to the correct block.
2799 !
2800  use constants
2801  use blockpointers, only : nx, ny, nz, il, jl, kl, ie, je, ke, ib, &
2802 & jb, kb, w, p, pori, porj, pork, fw, gamma, si, sj, sk, indfamilyi, &
2805  use flowvarrefstate, only : pinfcorr
2806  use inputdiscretization, only : vis2, vis4
2807  use inputphysics, only : equations
2808  use iteration, only : rfil
2809  use cgnsgrid, only : massflowfamilydiss
2810  use utils_b, only : getcorrectfork, mydim
2811  implicit none
2812 !
2813 ! local parameters.
2814 !
2815  real(kind=realtype), parameter :: dpmax=0.25_realtype
2816  real(kind=realtype), parameter :: epsacoustic=0.25_realtype
2817  real(kind=realtype), parameter :: epsshear=0.025_realtype
2818  real(kind=realtype), parameter :: omega=0.5_realtype
2819  real(kind=realtype), parameter :: oneminomega=one-omega
2820 !
2821 ! local variables.
2822 !
2823  integer(kind=inttype) :: i, j, k, ind, ii
2824  real(kind=realtype) :: plim, sface
2825  real(kind=realtype) :: sfil, fis2, fis4
2826  real(kind=realtype) :: gammaavg, gm1, ovgm1, gm53
2827  real(kind=realtype) :: ppor, rrad, dis2, dis4
2828  real(kind=realtype) :: dp1, dp2, tmp, fs
2829  real(kind=realtype) :: ddw1, ddw2, ddw3, ddw4, ddw5, ddw6
2830  real(kind=realtype) :: dr, dru, drv, drw, dre, drk, sx, sy, sz
2831  real(kind=realtype) :: uavg, vavg, wavg, a2avg, aavg, havg
2832  real(kind=realtype) :: alphaavg, unavg, ovaavg, ova2avg
2833  real(kind=realtype) :: kavg, lam1, lam2, lam3, area
2834  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
2835  real(kind=realtype), dimension(ie, je, ke, 3) :: dss
2836  logical :: correctfork
2837  intrinsic abs
2838  intrinsic mod
2839  intrinsic max
2840  intrinsic min
2841  intrinsic sqrt
2842  real(kind=realtype) :: x1
2843  real(kind=realtype) :: x2
2844  real(kind=realtype) :: x3
2845  real(kind=realtype) :: y1
2846  real(kind=realtype) :: y2
2847  real(kind=realtype) :: y3
2848  real(kind=realtype) :: abs0
2849  real(kind=realtype) :: min1
2850  real(realtype) :: max1
2851  real(kind=realtype) :: max2
2852  real(kind=realtype) :: max3
2853  real(kind=realtype) :: max4
2854  real(kind=realtype) :: min2
2855  real(realtype) :: max5
2856  real(kind=realtype) :: max6
2857  real(kind=realtype) :: max7
2858  real(kind=realtype) :: max8
2859  real(kind=realtype) :: min3
2860  real(realtype) :: max9
2861  real(kind=realtype) :: max10
2862  real(kind=realtype) :: max11
2863  real(kind=realtype) :: max12
2864  real(kind=realtype) :: abs1
2865  real(kind=realtype) :: abs2
2866  real(kind=realtype) :: abs3
2867  real(kind=realtype) :: abs4
2868  real(kind=realtype) :: abs5
2869  real(kind=realtype) :: abs6
2870  real(kind=realtype) :: arg1
2871  if (rfil .ge. 0.) then
2872  abs0 = rfil
2873  else
2874  abs0 = -rfil
2875  end if
2876 ! check if rfil == 0. if so, the dissipative flux needs not to
2877 ! be computed.
2878  if (abs0 .lt. thresholdreal) then
2879  return
2880  else
2881 ! set the value of plim. to be fully consistent this must have
2882 ! the dimension of a pressure. therefore a fraction of pinfcorr
2883 ! is used.
2884  plim = 0.001_realtype*pinfcorr
2885 ! determine whether or not the total energy must be corrected
2886 ! for the presence of the turbulent kinetic energy.
2887  correctfork = getcorrectfork()
2888 ! initialize sface to zero. this value will be used if the
2889 ! block is not moving.
2890  sface = zero
2891 ! set a couple of constants for the scheme.
2892  fis2 = rfil*vis2
2893  fis4 = rfil*vis4
2894  sfil = one - rfil
2895 ! initialize the dissipative residual to a certain times,
2896 ! possibly zero, the previously stored value.
2897  fw = sfil*fw
2898 !$ad ii-loop
2899 ! compute the pressure sensor for each cell, in each direction:
2900  do ii=0,ie*je*ke-1
2901  i = mod(ii, ie) + 1
2902  j = mod(ii/ie, je) + 1
2903  k = ii/(ie*je) + 1
2904  if (p(i+1, j, k) - p(i, j, k) .ge. 0.) then
2905  abs1 = p(i+1, j, k) - p(i, j, k)
2906  else
2907  abs1 = -(p(i+1, j, k)-p(i, j, k))
2908  end if
2909  if (p(i, j, k) - p(i-1, j, k) .ge. 0.) then
2910  abs4 = p(i, j, k) - p(i-1, j, k)
2911  else
2912  abs4 = -(p(i, j, k)-p(i-1, j, k))
2913  end if
2914  x1 = (p(i+1, j, k)-two*p(i, j, k)+p(i-1, j, k))/(omega*(p(i+1, j&
2915 & , k)+two*p(i, j, k)+p(i-1, j, k))+oneminomega*(abs1+abs4)+plim&
2916 & )
2917  if (x1 .ge. 0.) then
2918  dss(i, j, k, 1) = x1
2919  else
2920  dss(i, j, k, 1) = -x1
2921  end if
2922  if (p(i, j+1, k) - p(i, j, k) .ge. 0.) then
2923  abs2 = p(i, j+1, k) - p(i, j, k)
2924  else
2925  abs2 = -(p(i, j+1, k)-p(i, j, k))
2926  end if
2927  if (p(i, j, k) - p(i, j-1, k) .ge. 0.) then
2928  abs5 = p(i, j, k) - p(i, j-1, k)
2929  else
2930  abs5 = -(p(i, j, k)-p(i, j-1, k))
2931  end if
2932  x2 = (p(i, j+1, k)-two*p(i, j, k)+p(i, j-1, k))/(omega*(p(i, j+1&
2933 & , k)+two*p(i, j, k)+p(i, j-1, k))+oneminomega*(abs2+abs5)+plim&
2934 & )
2935  if (x2 .ge. 0.) then
2936  dss(i, j, k, 2) = x2
2937  else
2938  dss(i, j, k, 2) = -x2
2939  end if
2940  if (p(i, j, k+1) - p(i, j, k) .ge. 0.) then
2941  abs3 = p(i, j, k+1) - p(i, j, k)
2942  else
2943  abs3 = -(p(i, j, k+1)-p(i, j, k))
2944  end if
2945  if (p(i, j, k) - p(i, j, k-1) .ge. 0.) then
2946  abs6 = p(i, j, k) - p(i, j, k-1)
2947  else
2948  abs6 = -(p(i, j, k)-p(i, j, k-1))
2949  end if
2950  x3 = (p(i, j, k+1)-two*p(i, j, k)+p(i, j, k-1))/(omega*(p(i, j, &
2951 & k+1)+two*p(i, j, k)+p(i, j, k-1))+oneminomega*(abs3+abs6)+plim&
2952 & )
2953  if (x3 .ge. 0.) then
2954  dss(i, j, k, 3) = x3
2955  else
2956  dss(i, j, k, 3) = -x3
2957  end if
2958  end do
2959 !$ad ii-loop
2960 !
2961 ! dissipative fluxes in the i-direction.
2962 !
2963  do ii=0,il*ny*nz-1
2964  i = mod(ii, il) + 1
2965  j = mod(ii/il, ny) + 2
2966  k = ii/(il*ny) + 2
2967 ! compute the dissipation coefficients for this face.
2968  ppor = zero
2969  if (pori(i, j, k) .eq. normalflux) ppor = one
2970  if (dss(i, j, k, 1) .lt. dss(i+1, j, k, 1)) then
2971  y1 = dss(i+1, j, k, 1)
2972  else
2973  y1 = dss(i, j, k, 1)
2974  end if
2975  if (dpmax .gt. y1) then
2976  min1 = y1
2977  else
2978  min1 = dpmax
2979  end if
2980  dis2 = ppor*fis2*min1
2981  arg1 = ppor*fis4
2982  dis4 = mydim(arg1, dis2)
2983 ! construct the vector of the first and third differences
2984 ! multiplied by the appropriate constants.
2985  ddw1 = w(i+1, j, k, irho) - w(i, j, k, irho)
2986  dr = dis2*ddw1 - dis4*(w(i+2, j, k, irho)-w(i-1, j, k, irho)-&
2987 & three*ddw1)
2988  ddw2 = w(i+1, j, k, irho)*w(i+1, j, k, ivx) - w(i, j, k, irho)*w&
2989 & (i, j, k, ivx)
2990  dru = dis2*ddw2 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivx)-w(i&
2991 & -1, j, k, irho)*w(i-1, j, k, ivx)-three*ddw2)
2992  ddw3 = w(i+1, j, k, irho)*w(i+1, j, k, ivy) - w(i, j, k, irho)*w&
2993 & (i, j, k, ivy)
2994  drv = dis2*ddw3 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivy)-w(i&
2995 & -1, j, k, irho)*w(i-1, j, k, ivy)-three*ddw3)
2996  ddw4 = w(i+1, j, k, irho)*w(i+1, j, k, ivz) - w(i, j, k, irho)*w&
2997 & (i, j, k, ivz)
2998  drw = dis2*ddw4 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivz)-w(i&
2999 & -1, j, k, irho)*w(i-1, j, k, ivz)-three*ddw4)
3000  ddw5 = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
3001  dre = dis2*ddw5 - dis4*(w(i+2, j, k, irhoe)-w(i-1, j, k, irhoe)-&
3002 & three*ddw5)
3003 ! in case a k-equation is present, compute the difference
3004 ! of rhok and store the average value of k. if not present,
3005 ! set both these values to zero, such that later on no
3006 ! decision needs to be made anymore.
3007  if (correctfork) then
3008  ddw6 = w(i+1, j, k, irho)*w(i+1, j, k, itu1) - w(i, j, k, irho&
3009 & )*w(i, j, k, itu1)
3010  drk = dis2*ddw6 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, itu1)-&
3011 & w(i-1, j, k, irho)*w(i-1, j, k, itu1)-three*ddw6)
3012  kavg = half*(w(i, j, k, itu1)+w(i+1, j, k, itu1))
3013  else
3014  drk = zero
3015  kavg = zero
3016  end if
3017 ! compute the average value of gamma and compute some
3018 ! expressions in which it occurs.
3019  gammaavg = half*(gamma(i+1, j, k)+gamma(i, j, k))
3020  gm1 = gammaavg - one
3021  ovgm1 = one/gm1
3022  gm53 = gammaavg - five*third
3023 ! compute the average state at the interface.
3024  uavg = half*(w(i+1, j, k, ivx)+w(i, j, k, ivx))
3025  vavg = half*(w(i+1, j, k, ivy)+w(i, j, k, ivy))
3026  wavg = half*(w(i+1, j, k, ivz)+w(i, j, k, ivz))
3027  a2avg = half*(gamma(i+1, j, k)*p(i+1, j, k)/w(i+1, j, k, irho)+&
3028 & gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
3029  area = sqrt(si(i, j, k, 1)**2 + si(i, j, k, 2)**2 + si(i, j, k, &
3030 & 3)**2)
3031  if (1.e-25_realtype .lt. area) then
3032  max1 = area
3033  else
3034  max1 = 1.e-25_realtype
3035  end if
3036  tmp = one/max1
3037  sx = si(i, j, k, 1)*tmp
3038  sy = si(i, j, k, 2)*tmp
3039  sz = si(i, j, k, 3)*tmp
3040  alphaavg = half*(uavg**2+vavg**2+wavg**2)
3041  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
3042  aavg = sqrt(a2avg)
3043  unavg = uavg*sx + vavg*sy + wavg*sz
3044  ovaavg = one/aavg
3045  ova2avg = one/a2avg
3046 ! the mesh velocity if the face is moving. it must be
3047 ! divided by the area to obtain a true velocity.
3048  if (addgridvelocities) sface = sfacei(i, j, k)*tmp
3049  if (unavg - sface + aavg .ge. 0.) then
3050  lam1 = unavg - sface + aavg
3051  else
3052  lam1 = -(unavg-sface+aavg)
3053  end if
3054  if (unavg - sface - aavg .ge. 0.) then
3055  lam2 = unavg - sface - aavg
3056  else
3057  lam2 = -(unavg-sface-aavg)
3058  end if
3059  if (unavg - sface .ge. 0.) then
3060  lam3 = unavg - sface
3061  else
3062  lam3 = -(unavg-sface)
3063  end if
3064  rrad = lam3 + aavg
3065  if (lam1 .lt. epsacoustic*rrad) then
3066  max2 = epsacoustic*rrad
3067  else
3068  max2 = lam1
3069  end if
3070 ! multiply the eigenvalues by the area to obtain
3071 ! the correct values for the dissipation term.
3072  lam1 = max2*area
3073  if (lam2 .lt. epsacoustic*rrad) then
3074  max3 = epsacoustic*rrad
3075  else
3076  max3 = lam2
3077  end if
3078  lam2 = max3*area
3079  if (lam3 .lt. epsshear*rrad) then
3080  max4 = epsshear*rrad
3081  else
3082  max4 = lam3
3083  end if
3084  lam3 = max4*area
3085 ! some abbreviations, which occur quite often in the
3086 ! dissipation terms.
3087  abv1 = half*(lam1+lam2)
3088  abv2 = half*(lam1-lam2)
3089  abv3 = abv1 - lam3
3090  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53*&
3091 & drk
3092  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
3093  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
3094  abv7 = abv2*abv4*ovaavg + abv3*abv5
3095 ! compute and scatter the dissipative flux.
3096 ! density.
3097  fs = lam3*dr + abv6
3098  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
3099  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
3100 ! x-momentum.
3101  fs = lam3*dru + uavg*abv6 + sx*abv7
3102  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
3103  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
3104 ! y-momentum.
3105  fs = lam3*drv + vavg*abv6 + sy*abv7
3106  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
3107  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
3108 ! z-momentum.
3109  fs = lam3*drw + wavg*abv6 + sz*abv7
3110  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
3111  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
3112 ! energy.
3113  fs = lam3*dre + havg*abv6 + unavg*abv7
3114  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
3115  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
3116  end do
3117 !$ad ii-loop
3118 !
3119 ! dissipative fluxes in the j-direction.
3120 !
3121  do ii=0,nx*jl*nz-1
3122  i = mod(ii, nx) + 2
3123  j = mod(ii/nx, jl) + 1
3124  k = ii/(nx*jl) + 2
3125 ! compute the dissipation coefficients for this face.
3126  ppor = zero
3127  if (porj(i, j, k) .eq. normalflux) ppor = one
3128  if (dss(i, j, k, 2) .lt. dss(i, j+1, k, 2)) then
3129  y2 = dss(i, j+1, k, 2)
3130  else
3131  y2 = dss(i, j, k, 2)
3132  end if
3133  if (dpmax .gt. y2) then
3134  min2 = y2
3135  else
3136  min2 = dpmax
3137  end if
3138  dis2 = ppor*fis2*min2
3139  arg1 = ppor*fis4
3140  dis4 = mydim(arg1, dis2)
3141 ! construct the vector of the first and third differences
3142 ! multiplied by the appropriate constants.
3143  ddw1 = w(i, j+1, k, irho) - w(i, j, k, irho)
3144  dr = dis2*ddw1 - dis4*(w(i, j+2, k, irho)-w(i, j-1, k, irho)-&
3145 & three*ddw1)
3146  ddw2 = w(i, j+1, k, irho)*w(i, j+1, k, ivx) - w(i, j, k, irho)*w&
3147 & (i, j, k, ivx)
3148  dru = dis2*ddw2 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivx)-w(i&
3149 & , j-1, k, irho)*w(i, j-1, k, ivx)-three*ddw2)
3150  ddw3 = w(i, j+1, k, irho)*w(i, j+1, k, ivy) - w(i, j, k, irho)*w&
3151 & (i, j, k, ivy)
3152  drv = dis2*ddw3 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivy)-w(i&
3153 & , j-1, k, irho)*w(i, j-1, k, ivy)-three*ddw3)
3154  ddw4 = w(i, j+1, k, irho)*w(i, j+1, k, ivz) - w(i, j, k, irho)*w&
3155 & (i, j, k, ivz)
3156  drw = dis2*ddw4 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivz)-w(i&
3157 & , j-1, k, irho)*w(i, j-1, k, ivz)-three*ddw4)
3158  ddw5 = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
3159  dre = dis2*ddw5 - dis4*(w(i, j+2, k, irhoe)-w(i, j-1, k, irhoe)-&
3160 & three*ddw5)
3161 ! in case a k-equation is present, compute the difference
3162 ! of rhok and store the average value of k. if not present,
3163 ! set both these values to zero, such that later on no
3164 ! decision needs to be made anymore.
3165  if (correctfork) then
3166  ddw6 = w(i, j+1, k, irho)*w(i, j+1, k, itu1) - w(i, j, k, irho&
3167 & )*w(i, j, k, itu1)
3168  drk = dis2*ddw6 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, itu1)-&
3169 & w(i, j-1, k, irho)*w(i, j-1, k, itu1)-three*ddw6)
3170  kavg = half*(w(i, j, k, itu1)+w(i, j+1, k, itu1))
3171  else
3172  drk = zero
3173  kavg = zero
3174  end if
3175 ! compute the average value of gamma and compute some
3176 ! expressions in which it occurs.
3177  gammaavg = half*(gamma(i, j+1, k)+gamma(i, j, k))
3178  gm1 = gammaavg - one
3179  ovgm1 = one/gm1
3180  gm53 = gammaavg - five*third
3181 ! compute the average state at the interface.
3182  uavg = half*(w(i, j+1, k, ivx)+w(i, j, k, ivx))
3183  vavg = half*(w(i, j+1, k, ivy)+w(i, j, k, ivy))
3184  wavg = half*(w(i, j+1, k, ivz)+w(i, j, k, ivz))
3185  a2avg = half*(gamma(i, j+1, k)*p(i, j+1, k)/w(i, j+1, k, irho)+&
3186 & gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
3187  area = sqrt(sj(i, j, k, 1)**2 + sj(i, j, k, 2)**2 + sj(i, j, k, &
3188 & 3)**2)
3189  if (1.e-25_realtype .lt. area) then
3190  max5 = area
3191  else
3192  max5 = 1.e-25_realtype
3193  end if
3194  tmp = one/max5
3195  sx = sj(i, j, k, 1)*tmp
3196  sy = sj(i, j, k, 2)*tmp
3197  sz = sj(i, j, k, 3)*tmp
3198  alphaavg = half*(uavg**2+vavg**2+wavg**2)
3199  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
3200  aavg = sqrt(a2avg)
3201  unavg = uavg*sx + vavg*sy + wavg*sz
3202  ovaavg = one/aavg
3203  ova2avg = one/a2avg
3204 ! the mesh velocity if the face is moving. it must be
3205 ! divided by the area to obtain a true velocity.
3206  if (addgridvelocities) sface = sfacej(i, j, k)*tmp
3207  if (unavg - sface + aavg .ge. 0.) then
3208  lam1 = unavg - sface + aavg
3209  else
3210  lam1 = -(unavg-sface+aavg)
3211  end if
3212  if (unavg - sface - aavg .ge. 0.) then
3213  lam2 = unavg - sface - aavg
3214  else
3215  lam2 = -(unavg-sface-aavg)
3216  end if
3217  if (unavg - sface .ge. 0.) then
3218  lam3 = unavg - sface
3219  else
3220  lam3 = -(unavg-sface)
3221  end if
3222  rrad = lam3 + aavg
3223  if (lam1 .lt. epsacoustic*rrad) then
3224  max6 = epsacoustic*rrad
3225  else
3226  max6 = lam1
3227  end if
3228 ! multiply the eigenvalues by the area to obtain
3229 ! the correct values for the dissipation term.
3230  lam1 = max6*area
3231  if (lam2 .lt. epsacoustic*rrad) then
3232  max7 = epsacoustic*rrad
3233  else
3234  max7 = lam2
3235  end if
3236  lam2 = max7*area
3237  if (lam3 .lt. epsshear*rrad) then
3238  max8 = epsshear*rrad
3239  else
3240  max8 = lam3
3241  end if
3242  lam3 = max8*area
3243 ! some abbreviations, which occur quite often in the
3244 ! dissipation terms.
3245  abv1 = half*(lam1+lam2)
3246  abv2 = half*(lam1-lam2)
3247  abv3 = abv1 - lam3
3248  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53*&
3249 & drk
3250  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
3251  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
3252  abv7 = abv2*abv4*ovaavg + abv3*abv5
3253 ! compute and scatter the dissipative flux.
3254 ! density.
3255  fs = lam3*dr + abv6
3256  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
3257  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
3258 ! x-momentum.
3259  fs = lam3*dru + uavg*abv6 + sx*abv7
3260  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
3261  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
3262 ! y-momentum.
3263  fs = lam3*drv + vavg*abv6 + sy*abv7
3264  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
3265  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
3266 ! z-momentum.
3267  fs = lam3*drw + wavg*abv6 + sz*abv7
3268  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
3269  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
3270 ! energy.
3271  fs = lam3*dre + havg*abv6 + unavg*abv7
3272  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
3273  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
3274  end do
3275 !$ad ii-loop
3276 !
3277 ! dissipative fluxes in the k-direction.
3278 !
3279  do ii=0,nx*ny*kl-1
3280  i = mod(ii, nx) + 2
3281  j = mod(ii/nx, ny) + 2
3282  k = ii/(nx*ny) + 1
3283 ! compute the dissipation coefficients for this face.
3284  ppor = zero
3285  if (pork(i, j, k) .eq. normalflux) ppor = one
3286  if (dss(i, j, k, 3) .lt. dss(i, j, k+1, 3)) then
3287  y3 = dss(i, j, k+1, 3)
3288  else
3289  y3 = dss(i, j, k, 3)
3290  end if
3291  if (dpmax .gt. y3) then
3292  min3 = y3
3293  else
3294  min3 = dpmax
3295  end if
3296  dis2 = ppor*fis2*min3
3297  arg1 = ppor*fis4
3298  dis4 = mydim(arg1, dis2)
3299 ! construct the vector of the first and third differences
3300 ! multiplied by the appropriate constants.
3301  ddw1 = w(i, j, k+1, irho) - w(i, j, k, irho)
3302  dr = dis2*ddw1 - dis4*(w(i, j, k+2, irho)-w(i, j, k-1, irho)-&
3303 & three*ddw1)
3304  ddw2 = w(i, j, k+1, irho)*w(i, j, k+1, ivx) - w(i, j, k, irho)*w&
3305 & (i, j, k, ivx)
3306  dru = dis2*ddw2 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, ivx)-w(i&
3307 & , j, k-1, irho)*w(i, j, k-1, ivx)-three*ddw2)
3308  ddw3 = w(i, j, k+1, irho)*w(i, j, k+1, ivy) - w(i, j, k, irho)*w&
3309 & (i, j, k, ivy)
3310  drv = dis2*ddw3 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, ivy)-w(i&
3311 & , j, k-1, irho)*w(i, j, k-1, ivy)-three*ddw3)
3312  ddw4 = w(i, j, k+1, irho)*w(i, j, k+1, ivz) - w(i, j, k, irho)*w&
3313 & (i, j, k, ivz)
3314  drw = dis2*ddw4 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, ivz)-w(i&
3315 & , j, k-1, irho)*w(i, j, k-1, ivz)-three*ddw4)
3316  ddw5 = w(i, j, k+1, irhoe) - w(i, j, k, irhoe)
3317  dre = dis2*ddw5 - dis4*(w(i, j, k+2, irhoe)-w(i, j, k-1, irhoe)-&
3318 & three*ddw5)
3319 ! in case a k-equation is present, compute the difference
3320 ! of rhok and store the average value of k. if not present,
3321 ! set both these values to zero, such that later on no
3322 ! decision needs to be made anymore.
3323  if (correctfork) then
3324  ddw6 = w(i, j, k+1, irho)*w(i, j, k+1, itu1) - w(i, j, k, irho&
3325 & )*w(i, j, k, itu1)
3326  drk = dis2*ddw6 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, itu1)-&
3327 & w(i, j, k-1, irho)*w(i, j, k-1, itu1)-three*ddw6)
3328  kavg = half*(w(i, j, k+1, itu1)+w(i, j, k, itu1))
3329  else
3330  drk = zero
3331  kavg = zero
3332  end if
3333 ! compute the average value of gamma and compute some
3334 ! expressions in which it occurs.
3335  gammaavg = half*(gamma(i, j, k+1)+gamma(i, j, k))
3336  gm1 = gammaavg - one
3337  ovgm1 = one/gm1
3338  gm53 = gammaavg - five*third
3339 ! compute the average state at the interface.
3340  uavg = half*(w(i, j, k+1, ivx)+w(i, j, k, ivx))
3341  vavg = half*(w(i, j, k+1, ivy)+w(i, j, k, ivy))
3342  wavg = half*(w(i, j, k+1, ivz)+w(i, j, k, ivz))
3343  a2avg = half*(gamma(i, j, k+1)*p(i, j, k+1)/w(i, j, k+1, irho)+&
3344 & gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
3345  area = sqrt(sk(i, j, k, 1)**2 + sk(i, j, k, 2)**2 + sk(i, j, k, &
3346 & 3)**2)
3347  if (1.e-25_realtype .lt. area) then
3348  max9 = area
3349  else
3350  max9 = 1.e-25_realtype
3351  end if
3352  tmp = one/max9
3353  sx = sk(i, j, k, 1)*tmp
3354  sy = sk(i, j, k, 2)*tmp
3355  sz = sk(i, j, k, 3)*tmp
3356  alphaavg = half*(uavg**2+vavg**2+wavg**2)
3357  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
3358  aavg = sqrt(a2avg)
3359  unavg = uavg*sx + vavg*sy + wavg*sz
3360  ovaavg = one/aavg
3361  ova2avg = one/a2avg
3362 ! the mesh velocity if the face is moving. it must be
3363 ! divided by the area to obtain a true velocity.
3364  if (addgridvelocities) sface = sfacek(i, j, k)*tmp
3365  if (unavg - sface + aavg .ge. 0.) then
3366  lam1 = unavg - sface + aavg
3367  else
3368  lam1 = -(unavg-sface+aavg)
3369  end if
3370  if (unavg - sface - aavg .ge. 0.) then
3371  lam2 = unavg - sface - aavg
3372  else
3373  lam2 = -(unavg-sface-aavg)
3374  end if
3375  if (unavg - sface .ge. 0.) then
3376  lam3 = unavg - sface
3377  else
3378  lam3 = -(unavg-sface)
3379  end if
3380  rrad = lam3 + aavg
3381  if (lam1 .lt. epsacoustic*rrad) then
3382  max10 = epsacoustic*rrad
3383  else
3384  max10 = lam1
3385  end if
3386 ! multiply the eigenvalues by the area to obtain
3387 ! the correct values for the dissipation term.
3388  lam1 = max10*area
3389  if (lam2 .lt. epsacoustic*rrad) then
3390  max11 = epsacoustic*rrad
3391  else
3392  max11 = lam2
3393  end if
3394  lam2 = max11*area
3395  if (lam3 .lt. epsshear*rrad) then
3396  max12 = epsshear*rrad
3397  else
3398  max12 = lam3
3399  end if
3400  lam3 = max12*area
3401 ! some abbreviations, which occur quite often in the
3402 ! dissipation terms.
3403  abv1 = half*(lam1+lam2)
3404  abv2 = half*(lam1-lam2)
3405  abv3 = abv1 - lam3
3406  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53*&
3407 & drk
3408  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
3409  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
3410  abv7 = abv2*abv4*ovaavg + abv3*abv5
3411 ! compute and scatter the dissipative flux.
3412 ! density.
3413  fs = lam3*dr + abv6
3414  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) + fs
3415  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
3416 ! x-momentum.
3417  fs = lam3*dru + uavg*abv6 + sx*abv7
3418  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fs
3419  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
3420 ! y-momentum.
3421  fs = lam3*drv + vavg*abv6 + sy*abv7
3422  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fs
3423  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
3424 ! z-momentum.
3425  fs = lam3*drw + wavg*abv6 + sz*abv7
3426  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fs
3427  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
3428 ! energy.
3429  fs = lam3*dre + havg*abv6 + unavg*abv7
3430  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + fs
3431  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
3432  end do
3433  end if
3434  end subroutine invisciddissfluxmatrix
3435 
3436 ! differentiation of invisciddissfluxscalar in reverse (adjoint) mode (with options noisize i4 dr8 r8):
3437 ! gradient of useful results: rhoinf pinfcorr *p *w *fw *radi
3438 ! *radj *radk
3439 ! with respect to varying inputs: rhoinf pinfcorr *p *w *fw *radi
3440 ! *radj *radk
3441 ! rw status of diff variables: rhoinf:incr pinfcorr:incr *p:incr
3442 ! *w:incr *fw:in-out *radi:incr *radj:incr *radk:incr
3443 ! plus diff mem management of: p:in w:in fw:in radi:in radj:in
3444 ! radk:in
3446 !
3447 ! invisciddissfluxscalar computes the scalar artificial
3448 ! dissipation, see aiaa paper 81-1259, for a given block.
3449 ! therefore it is assumed that the pointers in blockpointers
3450 ! already point to the correct block.
3451 !
3452  use constants
3453  use blockpointers, only : nx, ny, nz, il, jl, kl, ie, je, ke, ib, &
3454 & jb, kb, w, wd, p, pd, pori, porj, pork, fw, fwd, radi, radid, radj, &
3455 & radjd, radk, radkd, gamma
3457 & rhoinfd
3458  use inputdiscretization, only : vis2, vis4
3461  use inputphysics, only : equations
3462  use iteration, only : rfil, totalr0, totalr
3463  use utils_b, only : mydim, mydim_b
3464  implicit none
3465 !
3466 ! local parameter.
3467 !
3468  real(kind=realtype), parameter :: dssmax=0.25_realtype
3469 !
3470 ! local variables.
3471 !
3472  integer(kind=inttype) :: i, j, k, ind, ii
3473  real(kind=realtype) :: sslim, rhoi
3474  real(kind=realtype) :: sslimd
3475  real(kind=realtype) :: sfil, fis2, fis4
3476  real(kind=realtype) :: ppor, rrad, dis2, dis4
3477  real(kind=realtype) :: rradd, dis2d, dis4d
3478  real(kind=realtype) :: ddw1, ddw2, ddw3, ddw4, ddw5, fs
3479  real(kind=realtype) :: ddw1d, ddw2d, ddw3d, ddw4d, ddw5d, fsd
3480  real(kind=realtype), dimension(ie, je, ke, 3) :: dss
3481  real(kind=realtype), dimension(ie, je, ke, 3) :: dssd
3482  real(kind=realtype), dimension(0:ib, 0:jb, 0:kb) :: ss
3483  real(kind=realtype), dimension(0:ib, 0:jb, 0:kb) :: ssd
3484  intrinsic abs
3485  intrinsic mod
3486  intrinsic exp
3487  intrinsic log10
3488  intrinsic max
3489  intrinsic min
3490  real(kind=realtype) :: x1
3491  real(kind=realtype) :: x1d
3492  real(kind=realtype) :: x2
3493  real(kind=realtype) :: x2d
3494  real(kind=realtype) :: x3
3495  real(kind=realtype) :: x3d
3496  real(kind=realtype) :: y1
3497  real(kind=realtype) :: y1d
3498  real(kind=realtype) :: y2
3499  real(kind=realtype) :: y2d
3500  real(kind=realtype) :: y3
3501  real(kind=realtype) :: y3d
3502  real(kind=realtype) :: abs0
3503  real(kind=realtype) :: min1
3504  real(kind=realtype) :: min1d
3505  real(kind=realtype) :: min2
3506  real(kind=realtype) :: min2d
3507  real(kind=realtype) :: min3
3508  real(kind=realtype) :: min3d
3509  real(kind=realtype) :: arg1
3510  real(kind=realtype) :: arg1d
3511  real(kind=realtype) :: temp
3512  real(kind=realtype) :: temp0
3513  real(kind=realtype) :: tempd
3514  real(kind=realtype) :: temp1
3515  real(kind=realtype) :: tempd0
3516  integer :: branch
3517  real(kind=realtype) :: temp2
3518  real(kind=realtype) :: temp3
3519  real(kind=realtype) :: tempd1
3520  real(kind=realtype) :: tempd2
3521  if (rfil .ge. 0.) then
3522  abs0 = rfil
3523  else
3524  abs0 = -rfil
3525  end if
3526 ! check if rfil == 0. if so, the dissipative flux needs not to
3527 ! be computed.
3528  if (abs0 .ge. thresholdreal) then
3529 ! determine the variables used to compute the switch.
3530 ! for the inviscid case this is the pressure; for the viscous
3531 ! case it is the entropy.
3532  select case (equations)
3533  case (eulerequations)
3534 ! inviscid case. pressure switch is based on the pressure.
3535 ! also set the value of sslim. to be fully consistent this
3536 ! must have the dimension of pressure and it is therefore
3537 ! set to a fraction of the free stream value.
3538  sslim = 0.001_realtype*pinfcorr
3539 ! copy the pressure in ss. only need the entries used in the
3540 ! discretization, i.e. not including the corner halo's, but we'll
3541 ! just copy all anyway.
3542  ss = p
3543 !===============================================================
3544  call pushcontrol2b(1)
3545  case (nsequations, ransequations)
3546 ! viscous case. pressure switch is based on the entropy.
3547 ! also set the value of sslim. to be fully consistent this
3548 ! must have the dimension of entropy and it is therefore
3549 ! set to a fraction of the free stream value.
3550  sslim = 0.001_realtype*pinfcorr/rhoinf**gammainf
3551 !$fwd-of ii-loop
3552 ! store the entropy in ss. see above.
3553  do ii=0,(ib+1)*(jb+1)*(kb+1)-1
3554  i = mod(ii, ib + 1)
3555  j = mod(ii/(ib+1), jb + 1)
3556  k = ii/((ib+1)*(jb+1))
3557  ss(i, j, k) = p(i, j, k)/w(i, j, k, irho)**gamma(i, j, k)
3558  end do
3559  call pushcontrol2b(2)
3560  case default
3561  call pushcontrol2b(0)
3562  end select
3563 !$fwd-of ii-loop
3564 ! compute the pressure sensor for each cell, in each direction:
3565  do ii=0,ie*je*ke-1
3566  i = mod(ii, ie) + 1
3567  j = mod(ii/ie, je) + 1
3568  k = ii/(ie*je) + 1
3569  x1 = (ss(i+1, j, k)-two*ss(i, j, k)+ss(i-1, j, k))/(ss(i+1, j, k&
3570 & )+two*ss(i, j, k)+ss(i-1, j, k)+sslim)
3571  if (x1 .ge. 0.) then
3572  dss(i, j, k, 1) = x1
3573  else
3574  dss(i, j, k, 1) = -x1
3575  end if
3576  x2 = (ss(i, j+1, k)-two*ss(i, j, k)+ss(i, j-1, k))/(ss(i, j+1, k&
3577 & )+two*ss(i, j, k)+ss(i, j-1, k)+sslim)
3578  if (x2 .ge. 0.) then
3579  dss(i, j, k, 2) = x2
3580  else
3581  dss(i, j, k, 2) = -x2
3582  end if
3583  x3 = (ss(i, j, k+1)-two*ss(i, j, k)+ss(i, j, k-1))/(ss(i, j, k+1&
3584 & )+two*ss(i, j, k)+ss(i, j, k-1)+sslim)
3585  if (x3 .ge. 0.) then
3586  dss(i, j, k, 3) = x3
3587  else
3588  dss(i, j, k, 3) = -x3
3589  end if
3590  end do
3591 ! set the dissipation constants for the scheme.
3592 ! rfil and sfil are fractions used by the runge-kutta solver to compute residuals at intermediate steps.
3593 ! this means that fis2 and fis4 will be some fraction of vis2 and vis4, respectively.
3594 ! for other solvers, rfil==1, sfil==0, fis2==vis2, and fis4==vis4.
3595 ! the sigmoid function used for dissipation-based continuation is described in eq. 28 and eq. 29 from the paper:
3596 ! "improving the performance of a compressible rans solver for low and high mach number flows" (seraj2022c).
3597 ! the options documentation also has information on the parameters in this formulation.
3598  if (usedisscontinuation) then
3599  if (totalr .eq. zero .or. totalr0 .eq. zero) then
3600  call pushcontrol1b(0)
3601  fis2 = rfil*(vis2+disscontmagnitude/(1+exp(-(disscontsharpness&
3602 & *disscontmidpoint))))
3603  else
3604  call pushcontrol1b(0)
3605  fis2 = rfil*(vis2+disscontmagnitude/(1+exp(-(disscontsharpness&
3606 & *(log10(totalr/totalr0)+disscontmidpoint)))))
3607  end if
3608  else
3609  call pushcontrol1b(1)
3610  fis2 = rfil*vis2
3611  end if
3612  fis4 = rfil*vis4
3613  sfil = one - rfil
3614 ! initialize the dissipative residual to a certain times,
3615 ! possibly zero, the previously stored value. owned cells
3616 ! only, because the halo values do not matter.
3617  dssd = 0.0_8
3618 !$bwd-of ii-loop
3619  do ii=0,nx*ny*kl-1
3620  i = mod(ii, nx) + 2
3621  j = mod(ii/nx, ny) + 2
3622  k = ii/(nx*ny) + 1
3623 ! compute the dissipation coefficients for this face.
3624  ppor = zero
3625  if (pork(i, j, k) .eq. normalflux) ppor = half
3626  rrad = ppor*(radk(i, j, k)+radk(i, j, k+1))
3627  if (dss(i, j, k, 3) .lt. dss(i, j, k+1, 3)) then
3628  y3 = dss(i, j, k+1, 3)
3629  call pushcontrol1b(0)
3630  else
3631  y3 = dss(i, j, k, 3)
3632  call pushcontrol1b(1)
3633  end if
3634  if (dssmax .gt. y3) then
3635  min3 = y3
3636  call pushcontrol1b(0)
3637  else
3638  min3 = dssmax
3639  call pushcontrol1b(1)
3640  end if
3641  dis2 = fis2*rrad*min3
3642  arg1 = fis4*rrad
3643  dis4 = mydim(arg1, dis2)
3644 ! compute and scatter the dissipative flux.
3645 ! density. store it in the mass flow of the
3646 ! appropriate sliding mesh interface.
3647  ddw1 = w(i, j, k+1, irho) - w(i, j, k, irho)
3648 ! x-momentum.
3649  ddw2 = w(i, j, k+1, ivx)*w(i, j, k+1, irho) - w(i, j, k, ivx)*w(&
3650 & i, j, k, irho)
3651 ! y-momentum.
3652  ddw3 = w(i, j, k+1, ivy)*w(i, j, k+1, irho) - w(i, j, k, ivy)*w(&
3653 & i, j, k, irho)
3654 ! z-momentum.
3655  ddw4 = w(i, j, k+1, ivz)*w(i, j, k+1, irho) - w(i, j, k, ivz)*w(&
3656 & i, j, k, irho)
3657 ! energy.
3658  ddw5 = w(i, j, k+1, irhoe) + p(i, j, k+1) - (w(i, j, k, irhoe)+p&
3659 & (i, j, k))
3660  fsd = fwd(i, j, k+1, irhoe) - fwd(i, j, k, irhoe)
3661  dis2d = ddw5*fsd
3662  dis4d = -((w(i, j, k+2, irhoe)+p(i, j, k+2)-w(i, j, k-1, irhoe)-&
3663 & p(i, j, k-1)-three*ddw5)*fsd)
3664  tempd1 = -(dis4*fsd)
3665  ddw5d = dis2*fsd - three*tempd1
3666  wd(i, j, k+2, irhoe) = wd(i, j, k+2, irhoe) + tempd1
3667  pd(i, j, k+2) = pd(i, j, k+2) + tempd1
3668  wd(i, j, k-1, irhoe) = wd(i, j, k-1, irhoe) - tempd1
3669  pd(i, j, k-1) = pd(i, j, k-1) - tempd1
3670  wd(i, j, k+1, irhoe) = wd(i, j, k+1, irhoe) + ddw5d
3671  pd(i, j, k+1) = pd(i, j, k+1) + ddw5d
3672  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddw5d
3673  pd(i, j, k) = pd(i, j, k) - ddw5d
3674  fsd = fwd(i, j, k+1, imz) - fwd(i, j, k, imz)
3675  temp3 = w(i, j, k-1, irho)
3676  temp2 = w(i, j, k-1, ivz)
3677  temp1 = w(i, j, k+2, irho)
3678  temp0 = w(i, j, k+2, ivz)
3679  dis2d = dis2d + ddw4*fsd
3680  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw4)*fsd
3681  tempd2 = -(dis4*fsd)
3682  ddw4d = dis2*fsd - three*tempd2
3683  wd(i, j, k+2, ivz) = wd(i, j, k+2, ivz) + temp1*tempd2
3684  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + temp0*tempd2
3685  wd(i, j, k-1, ivz) = wd(i, j, k-1, ivz) - temp3*tempd2
3686  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - temp2*tempd2
3687  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + w(i, j, k+1, irho)*&
3688 & ddw4d
3689  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, ivz)*&
3690 & ddw4d
3691  wd(i, j, k, ivz) = wd(i, j, k, ivz) - w(i, j, k, irho)*ddw4d
3692  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivz)*ddw4d
3693  fsd = fwd(i, j, k+1, imy) - fwd(i, j, k, imy)
3694  temp3 = w(i, j, k-1, irho)
3695  temp2 = w(i, j, k-1, ivy)
3696  temp1 = w(i, j, k+2, irho)
3697  temp0 = w(i, j, k+2, ivy)
3698  dis2d = dis2d + ddw3*fsd
3699  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw3)*fsd
3700  tempd2 = -(dis4*fsd)
3701  ddw3d = dis2*fsd - three*tempd2
3702  wd(i, j, k+2, ivy) = wd(i, j, k+2, ivy) + temp1*tempd2
3703  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + temp0*tempd2
3704  wd(i, j, k-1, ivy) = wd(i, j, k-1, ivy) - temp3*tempd2
3705  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - temp2*tempd2
3706  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + w(i, j, k+1, irho)*&
3707 & ddw3d
3708  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, ivy)*&
3709 & ddw3d
3710  wd(i, j, k, ivy) = wd(i, j, k, ivy) - w(i, j, k, irho)*ddw3d
3711  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivy)*ddw3d
3712  fsd = fwd(i, j, k+1, imx) - fwd(i, j, k, imx)
3713  temp3 = w(i, j, k-1, irho)
3714  temp2 = w(i, j, k-1, ivx)
3715  temp1 = w(i, j, k+2, irho)
3716  temp0 = w(i, j, k+2, ivx)
3717  dis2d = dis2d + ddw2*fsd
3718  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw2)*fsd
3719  tempd2 = -(dis4*fsd)
3720  ddw2d = dis2*fsd - three*tempd2
3721  wd(i, j, k+2, ivx) = wd(i, j, k+2, ivx) + temp1*tempd2
3722  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + temp0*tempd2
3723  wd(i, j, k-1, ivx) = wd(i, j, k-1, ivx) - temp3*tempd2
3724  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - temp2*tempd2
3725  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + w(i, j, k+1, irho)*&
3726 & ddw2d
3727  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, ivx)*&
3728 & ddw2d
3729  wd(i, j, k, ivx) = wd(i, j, k, ivx) - w(i, j, k, irho)*ddw2d
3730  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivx)*ddw2d
3731  fsd = fwd(i, j, k+1, irho) - fwd(i, j, k, irho)
3732  dis2d = dis2d + ddw1*fsd
3733  dis4d = dis4d - (w(i, j, k+2, irho)-w(i, j, k-1, irho)-three*&
3734 & ddw1)*fsd
3735  tempd1 = -(dis4*fsd)
3736  ddw1d = dis2*fsd - three*tempd1
3737  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + tempd1
3738  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - tempd1
3739  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + ddw1d
3740  wd(i, j, k, irho) = wd(i, j, k, irho) - ddw1d
3741  arg1d = 0.0_8
3742  call mydim_b(arg1, arg1d, dis2, dis2d, dis4d)
3743  rradd = fis4*arg1d + min3*fis2*dis2d
3744  min3d = rrad*fis2*dis2d
3745  call popcontrol1b(branch)
3746  if (branch .eq. 0) then
3747  y3d = min3d
3748  else
3749  y3d = 0.0_8
3750  end if
3751  call popcontrol1b(branch)
3752  if (branch .eq. 0) then
3753  dssd(i, j, k+1, 3) = dssd(i, j, k+1, 3) + y3d
3754  else
3755  dssd(i, j, k, 3) = dssd(i, j, k, 3) + y3d
3756  end if
3757  radkd(i, j, k) = radkd(i, j, k) + ppor*rradd
3758  radkd(i, j, k+1) = radkd(i, j, k+1) + ppor*rradd
3759  end do
3760 !$bwd-of ii-loop
3761  do ii=0,nx*jl*nz-1
3762  i = mod(ii, nx) + 2
3763  j = mod(ii/nx, jl) + 1
3764  k = ii/(nx*jl) + 2
3765 ! compute the dissipation coefficients for this face.
3766  ppor = zero
3767  if (porj(i, j, k) .eq. normalflux) ppor = half
3768  rrad = ppor*(radj(i, j, k)+radj(i, j+1, k))
3769  if (dss(i, j, k, 2) .lt. dss(i, j+1, k, 2)) then
3770  y2 = dss(i, j+1, k, 2)
3771  call pushcontrol1b(0)
3772  else
3773  y2 = dss(i, j, k, 2)
3774  call pushcontrol1b(1)
3775  end if
3776  if (dssmax .gt. y2) then
3777  min2 = y2
3778  call pushcontrol1b(0)
3779  else
3780  min2 = dssmax
3781  call pushcontrol1b(1)
3782  end if
3783  dis2 = fis2*rrad*min2
3784  arg1 = fis4*rrad
3785  dis4 = mydim(arg1, dis2)
3786 ! compute and scatter the dissipative flux.
3787 ! density. store it in the mass flow of the
3788 ! appropriate sliding mesh interface.
3789  ddw1 = w(i, j+1, k, irho) - w(i, j, k, irho)
3790 ! x-momentum.
3791  ddw2 = w(i, j+1, k, ivx)*w(i, j+1, k, irho) - w(i, j, k, ivx)*w(&
3792 & i, j, k, irho)
3793 ! y-momentum.
3794  ddw3 = w(i, j+1, k, ivy)*w(i, j+1, k, irho) - w(i, j, k, ivy)*w(&
3795 & i, j, k, irho)
3796 ! z-momentum.
3797  ddw4 = w(i, j+1, k, ivz)*w(i, j+1, k, irho) - w(i, j, k, ivz)*w(&
3798 & i, j, k, irho)
3799 ! energy.
3800  ddw5 = w(i, j+1, k, irhoe) + p(i, j+1, k) - (w(i, j, k, irhoe)+p&
3801 & (i, j, k))
3802  fsd = fwd(i, j+1, k, irhoe) - fwd(i, j, k, irhoe)
3803  dis2d = ddw5*fsd
3804  dis4d = -((w(i, j+2, k, irhoe)+p(i, j+2, k)-w(i, j-1, k, irhoe)-&
3805 & p(i, j-1, k)-three*ddw5)*fsd)
3806  tempd1 = -(dis4*fsd)
3807  ddw5d = dis2*fsd - three*tempd1
3808  wd(i, j+2, k, irhoe) = wd(i, j+2, k, irhoe) + tempd1
3809  pd(i, j+2, k) = pd(i, j+2, k) + tempd1
3810  wd(i, j-1, k, irhoe) = wd(i, j-1, k, irhoe) - tempd1
3811  pd(i, j-1, k) = pd(i, j-1, k) - tempd1
3812  wd(i, j+1, k, irhoe) = wd(i, j+1, k, irhoe) + ddw5d
3813  pd(i, j+1, k) = pd(i, j+1, k) + ddw5d
3814  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddw5d
3815  pd(i, j, k) = pd(i, j, k) - ddw5d
3816  fsd = fwd(i, j+1, k, imz) - fwd(i, j, k, imz)
3817  temp3 = w(i, j-1, k, irho)
3818  temp2 = w(i, j-1, k, ivz)
3819  temp1 = w(i, j+2, k, irho)
3820  temp0 = w(i, j+2, k, ivz)
3821  dis2d = dis2d + ddw4*fsd
3822  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw4)*fsd
3823  tempd2 = -(dis4*fsd)
3824  ddw4d = dis2*fsd - three*tempd2
3825  wd(i, j+2, k, ivz) = wd(i, j+2, k, ivz) + temp1*tempd2
3826  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + temp0*tempd2
3827  wd(i, j-1, k, ivz) = wd(i, j-1, k, ivz) - temp3*tempd2
3828  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - temp2*tempd2
3829  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + w(i, j+1, k, irho)*&
3830 & ddw4d
3831  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, ivz)*&
3832 & ddw4d
3833  wd(i, j, k, ivz) = wd(i, j, k, ivz) - w(i, j, k, irho)*ddw4d
3834  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivz)*ddw4d
3835  fsd = fwd(i, j+1, k, imy) - fwd(i, j, k, imy)
3836  temp3 = w(i, j-1, k, irho)
3837  temp2 = w(i, j-1, k, ivy)
3838  temp1 = w(i, j+2, k, irho)
3839  temp0 = w(i, j+2, k, ivy)
3840  dis2d = dis2d + ddw3*fsd
3841  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw3)*fsd
3842  tempd2 = -(dis4*fsd)
3843  ddw3d = dis2*fsd - three*tempd2
3844  wd(i, j+2, k, ivy) = wd(i, j+2, k, ivy) + temp1*tempd2
3845  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + temp0*tempd2
3846  wd(i, j-1, k, ivy) = wd(i, j-1, k, ivy) - temp3*tempd2
3847  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - temp2*tempd2
3848  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + w(i, j+1, k, irho)*&
3849 & ddw3d
3850  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, ivy)*&
3851 & ddw3d
3852  wd(i, j, k, ivy) = wd(i, j, k, ivy) - w(i, j, k, irho)*ddw3d
3853  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivy)*ddw3d
3854  fsd = fwd(i, j+1, k, imx) - fwd(i, j, k, imx)
3855  temp3 = w(i, j-1, k, irho)
3856  temp2 = w(i, j-1, k, ivx)
3857  temp1 = w(i, j+2, k, irho)
3858  temp0 = w(i, j+2, k, ivx)
3859  dis2d = dis2d + ddw2*fsd
3860  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw2)*fsd
3861  tempd2 = -(dis4*fsd)
3862  ddw2d = dis2*fsd - three*tempd2
3863  wd(i, j+2, k, ivx) = wd(i, j+2, k, ivx) + temp1*tempd2
3864  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + temp0*tempd2
3865  wd(i, j-1, k, ivx) = wd(i, j-1, k, ivx) - temp3*tempd2
3866  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - temp2*tempd2
3867  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + w(i, j+1, k, irho)*&
3868 & ddw2d
3869  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, ivx)*&
3870 & ddw2d
3871  wd(i, j, k, ivx) = wd(i, j, k, ivx) - w(i, j, k, irho)*ddw2d
3872  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivx)*ddw2d
3873  fsd = fwd(i, j+1, k, irho) - fwd(i, j, k, irho)
3874  dis2d = dis2d + ddw1*fsd
3875  dis4d = dis4d - (w(i, j+2, k, irho)-w(i, j-1, k, irho)-three*&
3876 & ddw1)*fsd
3877  tempd1 = -(dis4*fsd)
3878  ddw1d = dis2*fsd - three*tempd1
3879  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + tempd1
3880  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - tempd1
3881  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + ddw1d
3882  wd(i, j, k, irho) = wd(i, j, k, irho) - ddw1d
3883  arg1d = 0.0_8
3884  call mydim_b(arg1, arg1d, dis2, dis2d, dis4d)
3885  rradd = fis4*arg1d + min2*fis2*dis2d
3886  min2d = rrad*fis2*dis2d
3887  call popcontrol1b(branch)
3888  if (branch .eq. 0) then
3889  y2d = min2d
3890  else
3891  y2d = 0.0_8
3892  end if
3893  call popcontrol1b(branch)
3894  if (branch .eq. 0) then
3895  dssd(i, j+1, k, 2) = dssd(i, j+1, k, 2) + y2d
3896  else
3897  dssd(i, j, k, 2) = dssd(i, j, k, 2) + y2d
3898  end if
3899  radjd(i, j, k) = radjd(i, j, k) + ppor*rradd
3900  radjd(i, j+1, k) = radjd(i, j+1, k) + ppor*rradd
3901  end do
3902 !$bwd-of ii-loop
3903  do ii=0,il*ny*nz-1
3904  i = mod(ii, il) + 1
3905  j = mod(ii/il, ny) + 2
3906  k = ii/(il*ny) + 2
3907 ! compute the dissipation coefficients for this face.
3908  ppor = zero
3909  if (pori(i, j, k) .eq. normalflux) ppor = half
3910  rrad = ppor*(radi(i, j, k)+radi(i+1, j, k))
3911  if (dss(i, j, k, 1) .lt. dss(i+1, j, k, 1)) then
3912  y1 = dss(i+1, j, k, 1)
3913  call pushcontrol1b(0)
3914  else
3915  y1 = dss(i, j, k, 1)
3916  call pushcontrol1b(1)
3917  end if
3918  if (dssmax .gt. y1) then
3919  min1 = y1
3920  call pushcontrol1b(0)
3921  else
3922  min1 = dssmax
3923  call pushcontrol1b(1)
3924  end if
3925  dis2 = fis2*rrad*min1
3926  arg1 = fis4*rrad
3927  dis4 = mydim(arg1, dis2)
3928 ! compute and scatter the dissipative flux.
3929 ! density. store it in the mass flow of the
3930 ! appropriate sliding mesh interface.
3931  ddw1 = w(i+1, j, k, irho) - w(i, j, k, irho)
3932 ! x-momentum.
3933  ddw2 = w(i+1, j, k, ivx)*w(i+1, j, k, irho) - w(i, j, k, ivx)*w(&
3934 & i, j, k, irho)
3935 ! y-momentum.
3936  ddw3 = w(i+1, j, k, ivy)*w(i+1, j, k, irho) - w(i, j, k, ivy)*w(&
3937 & i, j, k, irho)
3938 ! z-momentum.
3939  ddw4 = w(i+1, j, k, ivz)*w(i+1, j, k, irho) - w(i, j, k, ivz)*w(&
3940 & i, j, k, irho)
3941 ! energy.
3942  ddw5 = w(i+1, j, k, irhoe) + p(i+1, j, k) - (w(i, j, k, irhoe)+p&
3943 & (i, j, k))
3944  fsd = fwd(i+1, j, k, irhoe) - fwd(i, j, k, irhoe)
3945  dis2d = ddw5*fsd
3946  dis4d = -((w(i+2, j, k, irhoe)+p(i+2, j, k)-w(i-1, j, k, irhoe)-&
3947 & p(i-1, j, k)-three*ddw5)*fsd)
3948  tempd1 = -(dis4*fsd)
3949  ddw5d = dis2*fsd - three*tempd1
3950  wd(i+2, j, k, irhoe) = wd(i+2, j, k, irhoe) + tempd1
3951  pd(i+2, j, k) = pd(i+2, j, k) + tempd1
3952  wd(i-1, j, k, irhoe) = wd(i-1, j, k, irhoe) - tempd1
3953  pd(i-1, j, k) = pd(i-1, j, k) - tempd1
3954  wd(i+1, j, k, irhoe) = wd(i+1, j, k, irhoe) + ddw5d
3955  pd(i+1, j, k) = pd(i+1, j, k) + ddw5d
3956  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddw5d
3957  pd(i, j, k) = pd(i, j, k) - ddw5d
3958  fsd = fwd(i+1, j, k, imz) - fwd(i, j, k, imz)
3959  temp3 = w(i-1, j, k, irho)
3960  temp2 = w(i-1, j, k, ivz)
3961  temp1 = w(i+2, j, k, irho)
3962  temp0 = w(i+2, j, k, ivz)
3963  dis2d = dis2d + ddw4*fsd
3964  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw4)*fsd
3965  tempd2 = -(dis4*fsd)
3966  ddw4d = dis2*fsd - three*tempd2
3967  wd(i+2, j, k, ivz) = wd(i+2, j, k, ivz) + temp1*tempd2
3968  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + temp0*tempd2
3969  wd(i-1, j, k, ivz) = wd(i-1, j, k, ivz) - temp3*tempd2
3970  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - temp2*tempd2
3971  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + w(i+1, j, k, irho)*&
3972 & ddw4d
3973  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, ivz)*&
3974 & ddw4d
3975  wd(i, j, k, ivz) = wd(i, j, k, ivz) - w(i, j, k, irho)*ddw4d
3976  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivz)*ddw4d
3977  fsd = fwd(i+1, j, k, imy) - fwd(i, j, k, imy)
3978  temp3 = w(i-1, j, k, irho)
3979  temp2 = w(i-1, j, k, ivy)
3980  temp1 = w(i+2, j, k, irho)
3981  temp0 = w(i+2, j, k, ivy)
3982  dis2d = dis2d + ddw3*fsd
3983  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw3)*fsd
3984  tempd2 = -(dis4*fsd)
3985  ddw3d = dis2*fsd - three*tempd2
3986  wd(i+2, j, k, ivy) = wd(i+2, j, k, ivy) + temp1*tempd2
3987  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + temp0*tempd2
3988  wd(i-1, j, k, ivy) = wd(i-1, j, k, ivy) - temp3*tempd2
3989  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - temp2*tempd2
3990  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + w(i+1, j, k, irho)*&
3991 & ddw3d
3992  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, ivy)*&
3993 & ddw3d
3994  wd(i, j, k, ivy) = wd(i, j, k, ivy) - w(i, j, k, irho)*ddw3d
3995  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivy)*ddw3d
3996  fsd = fwd(i+1, j, k, imx) - fwd(i, j, k, imx)
3997  temp1 = w(i-1, j, k, irho)
3998  temp0 = w(i-1, j, k, ivx)
3999  temp = w(i+2, j, k, irho)
4000  temp2 = w(i+2, j, k, ivx)
4001  dis2d = dis2d + ddw2*fsd
4002  dis4d = dis4d - (temp2*temp-temp0*temp1-three*ddw2)*fsd
4003  tempd1 = -(dis4*fsd)
4004  ddw2d = dis2*fsd - three*tempd1
4005  wd(i+2, j, k, ivx) = wd(i+2, j, k, ivx) + temp*tempd1
4006  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + temp2*tempd1
4007  wd(i-1, j, k, ivx) = wd(i-1, j, k, ivx) - temp1*tempd1
4008  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - temp0*tempd1
4009  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + w(i+1, j, k, irho)*&
4010 & ddw2d
4011  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, ivx)*&
4012 & ddw2d
4013  wd(i, j, k, ivx) = wd(i, j, k, ivx) - w(i, j, k, irho)*ddw2d
4014  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivx)*ddw2d
4015  fsd = fwd(i+1, j, k, irho) - fwd(i, j, k, irho)
4016  dis2d = dis2d + ddw1*fsd
4017  dis4d = dis4d - (w(i+2, j, k, irho)-w(i-1, j, k, irho)-three*&
4018 & ddw1)*fsd
4019  tempd0 = -(dis4*fsd)
4020  ddw1d = dis2*fsd - three*tempd0
4021  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + tempd0
4022  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - tempd0
4023  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + ddw1d
4024  wd(i, j, k, irho) = wd(i, j, k, irho) - ddw1d
4025  arg1d = 0.0_8
4026  call mydim_b(arg1, arg1d, dis2, dis2d, dis4d)
4027  rradd = fis4*arg1d + min1*fis2*dis2d
4028  min1d = rrad*fis2*dis2d
4029  call popcontrol1b(branch)
4030  if (branch .eq. 0) then
4031  y1d = min1d
4032  else
4033  y1d = 0.0_8
4034  end if
4035  call popcontrol1b(branch)
4036  if (branch .eq. 0) then
4037  dssd(i+1, j, k, 1) = dssd(i+1, j, k, 1) + y1d
4038  else
4039  dssd(i, j, k, 1) = dssd(i, j, k, 1) + y1d
4040  end if
4041  radid(i, j, k) = radid(i, j, k) + ppor*rradd
4042  radid(i+1, j, k) = radid(i+1, j, k) + ppor*rradd
4043  end do
4044  fwd = sfil*fwd
4045  call popcontrol1b(branch)
4046  sslimd = 0.0_8
4047  ssd = 0.0_8
4048 !$bwd-of ii-loop
4049  do ii=0,ie*je*ke-1
4050  i = mod(ii, ie) + 1
4051  j = mod(ii/ie, je) + 1
4052  k = ii/(ie*je) + 1
4053  x1 = (ss(i+1, j, k)-two*ss(i, j, k)+ss(i-1, j, k))/(ss(i+1, j, k&
4054 & )+two*ss(i, j, k)+ss(i-1, j, k)+sslim)
4055  if (x1 .ge. 0.) then
4056  call pushcontrol1b(0)
4057  else
4058  call pushcontrol1b(1)
4059  end if
4060  x2 = (ss(i, j+1, k)-two*ss(i, j, k)+ss(i, j-1, k))/(ss(i, j+1, k&
4061 & )+two*ss(i, j, k)+ss(i, j-1, k)+sslim)
4062  if (x2 .ge. 0.) then
4063  call pushcontrol1b(0)
4064  else
4065  call pushcontrol1b(1)
4066  end if
4067  x3 = (ss(i, j, k+1)-two*ss(i, j, k)+ss(i, j, k-1))/(ss(i, j, k+1&
4068 & )+two*ss(i, j, k)+ss(i, j, k-1)+sslim)
4069  if (x3 .ge. 0.) then
4070  x3d = dssd(i, j, k, 3)
4071  dssd(i, j, k, 3) = 0.0_8
4072  else
4073  x3d = -dssd(i, j, k, 3)
4074  dssd(i, j, k, 3) = 0.0_8
4075  end if
4076  temp1 = ss(i, j, k+1) + two*ss(i, j, k) + ss(i, j, k-1) + sslim
4077  tempd = x3d/temp1
4078  tempd0 = -((ss(i, j, k+1)-two*ss(i, j, k)+ss(i, j, k-1))*tempd/&
4079 & temp1)
4080  ssd(i, j, k+1) = ssd(i, j, k+1) + tempd + tempd0
4081  ssd(i, j, k) = ssd(i, j, k) + two*tempd0 - two*tempd
4082  ssd(i, j, k-1) = ssd(i, j, k-1) + tempd + tempd0
4083  sslimd = sslimd + tempd0
4084  call popcontrol1b(branch)
4085  if (branch .eq. 0) then
4086  x2d = dssd(i, j, k, 2)
4087  dssd(i, j, k, 2) = 0.0_8
4088  else
4089  x2d = -dssd(i, j, k, 2)
4090  dssd(i, j, k, 2) = 0.0_8
4091  end if
4092  temp1 = ss(i, j+1, k) + two*ss(i, j, k) + ss(i, j-1, k) + sslim
4093  tempd = x2d/temp1
4094  tempd0 = -((ss(i, j+1, k)-two*ss(i, j, k)+ss(i, j-1, k))*tempd/&
4095 & temp1)
4096  ssd(i, j+1, k) = ssd(i, j+1, k) + tempd + tempd0
4097  ssd(i, j, k) = ssd(i, j, k) + two*tempd0 - two*tempd
4098  ssd(i, j-1, k) = ssd(i, j-1, k) + tempd + tempd0
4099  sslimd = sslimd + tempd0
4100  call popcontrol1b(branch)
4101  if (branch .eq. 0) then
4102  x1d = dssd(i, j, k, 1)
4103  dssd(i, j, k, 1) = 0.0_8
4104  else
4105  x1d = -dssd(i, j, k, 1)
4106  dssd(i, j, k, 1) = 0.0_8
4107  end if
4108  temp1 = ss(i+1, j, k) + two*ss(i, j, k) + ss(i-1, j, k) + sslim
4109  tempd = x1d/temp1
4110  tempd0 = -((ss(i+1, j, k)-two*ss(i, j, k)+ss(i-1, j, k))*tempd/&
4111 & temp1)
4112  ssd(i+1, j, k) = ssd(i+1, j, k) + tempd + tempd0
4113  ssd(i, j, k) = ssd(i, j, k) + two*tempd0 - two*tempd
4114  ssd(i-1, j, k) = ssd(i-1, j, k) + tempd + tempd0
4115  sslimd = sslimd + tempd0
4116  end do
4117  call popcontrol2b(branch)
4118  if (branch .ne. 0) then
4119  if (branch .eq. 1) then
4120  pd = pd + ssd
4121  pinfcorrd = pinfcorrd + 0.001_realtype*sslimd
4122  else
4123 !$bwd-of ii-loop
4124  do ii=0,(ib+1)*(jb+1)*(kb+1)-1
4125  i = mod(ii, ib + 1)
4126  j = mod(ii/(ib+1), jb + 1)
4127  k = ii/((ib+1)*(jb+1))
4128  temp0 = gamma(i, j, k)
4129  temp = w(i, j, k, irho)
4130  temp1 = temp**temp0
4131  pd(i, j, k) = pd(i, j, k) + ssd(i, j, k)/temp1
4132  if (.not.(temp .le. 0.0_8 .and. (temp0 .eq. 0.0_8 .or. temp0&
4133 & .ne. int(temp0)))) wd(i, j, k, irho) = wd(i, j, k, irho)&
4134 & - temp0*temp**(temp0-1)*p(i, j, k)*ssd(i, j, k)/temp1**2
4135  ssd(i, j, k) = 0.0_8
4136  end do
4137  temp = rhoinf**gammainf
4138  tempd = 0.001_realtype*sslimd/temp
4139  pinfcorrd = pinfcorrd + tempd
4140  if (.not.(rhoinf .le. 0.0_8 .and. (gammainf .eq. 0.0_8 .or. &
4141 & gammainf .ne. int(gammainf)))) rhoinfd = rhoinfd - &
4142 & gammainf*rhoinf**(gammainf-1)*pinfcorr*tempd/temp
4143  end if
4144  end if
4145  end if
4146  end subroutine invisciddissfluxscalar_b
4147 
4149 !
4150 ! invisciddissfluxscalar computes the scalar artificial
4151 ! dissipation, see aiaa paper 81-1259, for a given block.
4152 ! therefore it is assumed that the pointers in blockpointers
4153 ! already point to the correct block.
4154 !
4155  use constants
4156  use blockpointers, only : nx, ny, nz, il, jl, kl, ie, je, ke, ib, &
4157 & jb, kb, w, p, pori, porj, pork, fw, radi, radj, radk, gamma
4158  use flowvarrefstate, only : gammainf, pinfcorr, rhoinf
4159  use inputdiscretization, only : vis2, vis4
4162  use inputphysics, only : equations
4163  use iteration, only : rfil, totalr0, totalr
4164  use utils_b, only : mydim
4165  implicit none
4166 !
4167 ! local parameter.
4168 !
4169  real(kind=realtype), parameter :: dssmax=0.25_realtype
4170 !
4171 ! local variables.
4172 !
4173  integer(kind=inttype) :: i, j, k, ind, ii
4174  real(kind=realtype) :: sslim, rhoi
4175  real(kind=realtype) :: sfil, fis2, fis4
4176  real(kind=realtype) :: ppor, rrad, dis2, dis4
4177  real(kind=realtype) :: ddw1, ddw2, ddw3, ddw4, ddw5, fs
4178  real(kind=realtype), dimension(ie, je, ke, 3) :: dss
4179  real(kind=realtype), dimension(0:ib, 0:jb, 0:kb) :: ss
4180  intrinsic abs
4181  intrinsic mod
4182  intrinsic exp
4183  intrinsic log10
4184  intrinsic max
4185  intrinsic min
4186  real(kind=realtype) :: x1
4187  real(kind=realtype) :: x2
4188  real(kind=realtype) :: x3
4189  real(kind=realtype) :: y1
4190  real(kind=realtype) :: y2
4191  real(kind=realtype) :: y3
4192  real(kind=realtype) :: abs0
4193  real(kind=realtype) :: min1
4194  real(kind=realtype) :: min2
4195  real(kind=realtype) :: min3
4196  real(kind=realtype) :: arg1
4197  if (rfil .ge. 0.) then
4198  abs0 = rfil
4199  else
4200  abs0 = -rfil
4201  end if
4202 ! check if rfil == 0. if so, the dissipative flux needs not to
4203 ! be computed.
4204  if (abs0 .lt. thresholdreal) then
4205  return
4206  else
4207 ! determine the variables used to compute the switch.
4208 ! for the inviscid case this is the pressure; for the viscous
4209 ! case it is the entropy.
4210  select case (equations)
4211  case (eulerequations)
4212 ! inviscid case. pressure switch is based on the pressure.
4213 ! also set the value of sslim. to be fully consistent this
4214 ! must have the dimension of pressure and it is therefore
4215 ! set to a fraction of the free stream value.
4216  sslim = 0.001_realtype*pinfcorr
4217 ! copy the pressure in ss. only need the entries used in the
4218 ! discretization, i.e. not including the corner halo's, but we'll
4219 ! just copy all anyway.
4220  ss = p
4221 !===============================================================
4222  case (nsequations, ransequations)
4223 ! viscous case. pressure switch is based on the entropy.
4224 ! also set the value of sslim. to be fully consistent this
4225 ! must have the dimension of entropy and it is therefore
4226 ! set to a fraction of the free stream value.
4227  sslim = 0.001_realtype*pinfcorr/rhoinf**gammainf
4228 !$ad ii-loop
4229 ! store the entropy in ss. see above.
4230  do ii=0,(ib+1)*(jb+1)*(kb+1)-1
4231  i = mod(ii, ib + 1)
4232  j = mod(ii/(ib+1), jb + 1)
4233  k = ii/((ib+1)*(jb+1))
4234  ss(i, j, k) = p(i, j, k)/w(i, j, k, irho)**gamma(i, j, k)
4235  end do
4236  end select
4237 !$ad ii-loop
4238 ! compute the pressure sensor for each cell, in each direction:
4239  do ii=0,ie*je*ke-1
4240  i = mod(ii, ie) + 1
4241  j = mod(ii/ie, je) + 1
4242  k = ii/(ie*je) + 1
4243  x1 = (ss(i+1, j, k)-two*ss(i, j, k)+ss(i-1, j, k))/(ss(i+1, j, k&
4244 & )+two*ss(i, j, k)+ss(i-1, j, k)+sslim)
4245  if (x1 .ge. 0.) then
4246  dss(i, j, k, 1) = x1
4247  else
4248  dss(i, j, k, 1) = -x1
4249  end if
4250  x2 = (ss(i, j+1, k)-two*ss(i, j, k)+ss(i, j-1, k))/(ss(i, j+1, k&
4251 & )+two*ss(i, j, k)+ss(i, j-1, k)+sslim)
4252  if (x2 .ge. 0.) then
4253  dss(i, j, k, 2) = x2
4254  else
4255  dss(i, j, k, 2) = -x2
4256  end if
4257  x3 = (ss(i, j, k+1)-two*ss(i, j, k)+ss(i, j, k-1))/(ss(i, j, k+1&
4258 & )+two*ss(i, j, k)+ss(i, j, k-1)+sslim)
4259  if (x3 .ge. 0.) then
4260  dss(i, j, k, 3) = x3
4261  else
4262  dss(i, j, k, 3) = -x3
4263  end if
4264  end do
4265 ! set the dissipation constants for the scheme.
4266 ! rfil and sfil are fractions used by the runge-kutta solver to compute residuals at intermediate steps.
4267 ! this means that fis2 and fis4 will be some fraction of vis2 and vis4, respectively.
4268 ! for other solvers, rfil==1, sfil==0, fis2==vis2, and fis4==vis4.
4269 ! the sigmoid function used for dissipation-based continuation is described in eq. 28 and eq. 29 from the paper:
4270 ! "improving the performance of a compressible rans solver for low and high mach number flows" (seraj2022c).
4271 ! the options documentation also has information on the parameters in this formulation.
4272  if (usedisscontinuation) then
4273  if (totalr .eq. zero .or. totalr0 .eq. zero) then
4274  fis2 = rfil*(vis2+disscontmagnitude/(1+exp(-(disscontsharpness&
4275 & *disscontmidpoint))))
4276  else
4277  fis2 = rfil*(vis2+disscontmagnitude/(1+exp(-(disscontsharpness&
4278 & *(log10(totalr/totalr0)+disscontmidpoint)))))
4279  end if
4280  else
4281  fis2 = rfil*vis2
4282  end if
4283  fis4 = rfil*vis4
4284  sfil = one - rfil
4285 ! initialize the dissipative residual to a certain times,
4286 ! possibly zero, the previously stored value. owned cells
4287 ! only, because the halo values do not matter.
4288  fw = sfil*fw
4289 !$ad ii-loop
4290 !
4291 ! dissipative fluxes in the i-direction.
4292 !
4293  do ii=0,il*ny*nz-1
4294  i = mod(ii, il) + 1
4295  j = mod(ii/il, ny) + 2
4296  k = ii/(il*ny) + 2
4297 ! compute the dissipation coefficients for this face.
4298  ppor = zero
4299  if (pori(i, j, k) .eq. normalflux) ppor = half
4300  rrad = ppor*(radi(i, j, k)+radi(i+1, j, k))
4301  if (dss(i, j, k, 1) .lt. dss(i+1, j, k, 1)) then
4302  y1 = dss(i+1, j, k, 1)
4303  else
4304  y1 = dss(i, j, k, 1)
4305  end if
4306  if (dssmax .gt. y1) then
4307  min1 = y1
4308  else
4309  min1 = dssmax
4310  end if
4311  dis2 = fis2*rrad*min1
4312  arg1 = fis4*rrad
4313  dis4 = mydim(arg1, dis2)
4314 ! compute and scatter the dissipative flux.
4315 ! density. store it in the mass flow of the
4316 ! appropriate sliding mesh interface.
4317  ddw1 = w(i+1, j, k, irho) - w(i, j, k, irho)
4318  fs = dis2*ddw1 - dis4*(w(i+2, j, k, irho)-w(i-1, j, k, irho)-&
4319 & three*ddw1)
4320  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
4321  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
4322 ! x-momentum.
4323  ddw2 = w(i+1, j, k, ivx)*w(i+1, j, k, irho) - w(i, j, k, ivx)*w(&
4324 & i, j, k, irho)
4325  fs = dis2*ddw2 - dis4*(w(i+2, j, k, ivx)*w(i+2, j, k, irho)-w(i-&
4326 & 1, j, k, ivx)*w(i-1, j, k, irho)-three*ddw2)
4327  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
4328  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
4329 ! y-momentum.
4330  ddw3 = w(i+1, j, k, ivy)*w(i+1, j, k, irho) - w(i, j, k, ivy)*w(&
4331 & i, j, k, irho)
4332  fs = dis2*ddw3 - dis4*(w(i+2, j, k, ivy)*w(i+2, j, k, irho)-w(i-&
4333 & 1, j, k, ivy)*w(i-1, j, k, irho)-three*ddw3)
4334  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
4335  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
4336 ! z-momentum.
4337  ddw4 = w(i+1, j, k, ivz)*w(i+1, j, k, irho) - w(i, j, k, ivz)*w(&
4338 & i, j, k, irho)
4339  fs = dis2*ddw4 - dis4*(w(i+2, j, k, ivz)*w(i+2, j, k, irho)-w(i-&
4340 & 1, j, k, ivz)*w(i-1, j, k, irho)-three*ddw4)
4341  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
4342  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
4343 ! energy.
4344  ddw5 = w(i+1, j, k, irhoe) + p(i+1, j, k) - (w(i, j, k, irhoe)+p&
4345 & (i, j, k))
4346  fs = dis2*ddw5 - dis4*(w(i+2, j, k, irhoe)+p(i+2, j, k)-(w(i-1, &
4347 & j, k, irhoe)+p(i-1, j, k))-three*ddw5)
4348  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
4349  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
4350  end do
4351 !$ad ii-loop
4352 !
4353 ! dissipative fluxes in the j-direction.
4354 !
4355  do ii=0,nx*jl*nz-1
4356  i = mod(ii, nx) + 2
4357  j = mod(ii/nx, jl) + 1
4358  k = ii/(nx*jl) + 2
4359 ! compute the dissipation coefficients for this face.
4360  ppor = zero
4361  if (porj(i, j, k) .eq. normalflux) ppor = half
4362  rrad = ppor*(radj(i, j, k)+radj(i, j+1, k))
4363  if (dss(i, j, k, 2) .lt. dss(i, j+1, k, 2)) then
4364  y2 = dss(i, j+1, k, 2)
4365  else
4366  y2 = dss(i, j, k, 2)
4367  end if
4368  if (dssmax .gt. y2) then
4369  min2 = y2
4370  else
4371  min2 = dssmax
4372  end if
4373  dis2 = fis2*rrad*min2
4374  arg1 = fis4*rrad
4375  dis4 = mydim(arg1, dis2)
4376 ! compute and scatter the dissipative flux.
4377 ! density. store it in the mass flow of the
4378 ! appropriate sliding mesh interface.
4379  ddw1 = w(i, j+1, k, irho) - w(i, j, k, irho)
4380  fs = dis2*ddw1 - dis4*(w(i, j+2, k, irho)-w(i, j-1, k, irho)-&
4381 & three*ddw1)
4382  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
4383  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
4384 ! x-momentum.
4385  ddw2 = w(i, j+1, k, ivx)*w(i, j+1, k, irho) - w(i, j, k, ivx)*w(&
4386 & i, j, k, irho)
4387  fs = dis2*ddw2 - dis4*(w(i, j+2, k, ivx)*w(i, j+2, k, irho)-w(i&
4388 & , j-1, k, ivx)*w(i, j-1, k, irho)-three*ddw2)
4389  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
4390  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
4391 ! y-momentum.
4392  ddw3 = w(i, j+1, k, ivy)*w(i, j+1, k, irho) - w(i, j, k, ivy)*w(&
4393 & i, j, k, irho)
4394  fs = dis2*ddw3 - dis4*(w(i, j+2, k, ivy)*w(i, j+2, k, irho)-w(i&
4395 & , j-1, k, ivy)*w(i, j-1, k, irho)-three*ddw3)
4396  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
4397  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
4398 ! z-momentum.
4399  ddw4 = w(i, j+1, k, ivz)*w(i, j+1, k, irho) - w(i, j, k, ivz)*w(&
4400 & i, j, k, irho)
4401  fs = dis2*ddw4 - dis4*(w(i, j+2, k, ivz)*w(i, j+2, k, irho)-w(i&
4402 & , j-1, k, ivz)*w(i, j-1, k, irho)-three*ddw4)
4403  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
4404  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
4405 ! energy.
4406  ddw5 = w(i, j+1, k, irhoe) + p(i, j+1, k) - (w(i, j, k, irhoe)+p&
4407 & (i, j, k))
4408  fs = dis2*ddw5 - dis4*(w(i, j+2, k, irhoe)+p(i, j+2, k)-(w(i, j-&
4409 & 1, k, irhoe)+p(i, j-1, k))-three*ddw5)
4410  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
4411  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
4412  end do
4413 !$ad ii-loop
4414 !
4415 ! dissipative fluxes in the k-direction.
4416 !
4417  do ii=0,nx*ny*kl-1
4418  i = mod(ii, nx) + 2
4419  j = mod(ii/nx, ny) + 2
4420  k = ii/(nx*ny) + 1
4421 ! compute the dissipation coefficients for this face.
4422  ppor = zero
4423  if (pork(i, j, k) .eq. normalflux) ppor = half
4424  rrad = ppor*(radk(i, j, k)+radk(i, j, k+1))
4425  if (dss(i, j, k, 3) .lt. dss(i, j, k+1, 3)) then
4426  y3 = dss(i, j, k+1, 3)
4427  else
4428  y3 = dss(i, j, k, 3)
4429  end if
4430  if (dssmax .gt. y3) then
4431  min3 = y3
4432  else
4433  min3 = dssmax
4434  end if
4435  dis2 = fis2*rrad*min3
4436  arg1 = fis4*rrad
4437  dis4 = mydim(arg1, dis2)
4438 ! compute and scatter the dissipative flux.
4439 ! density. store it in the mass flow of the
4440 ! appropriate sliding mesh interface.
4441  ddw1 = w(i, j, k+1, irho) - w(i, j, k, irho)
4442  fs = dis2*ddw1 - dis4*(w(i, j, k+2, irho)-w(i, j, k-1, irho)-&
4443 & three*ddw1)
4444  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) + fs
4445  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
4446 ! x-momentum.
4447  ddw2 = w(i, j, k+1, ivx)*w(i, j, k+1, irho) - w(i, j, k, ivx)*w(&
4448 & i, j, k, irho)
4449  fs = dis2*ddw2 - dis4*(w(i, j, k+2, ivx)*w(i, j, k+2, irho)-w(i&
4450 & , j, k-1, ivx)*w(i, j, k-1, irho)-three*ddw2)
4451  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fs
4452  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
4453 ! y-momentum.
4454  ddw3 = w(i, j, k+1, ivy)*w(i, j, k+1, irho) - w(i, j, k, ivy)*w(&
4455 & i, j, k, irho)
4456  fs = dis2*ddw3 - dis4*(w(i, j, k+2, ivy)*w(i, j, k+2, irho)-w(i&
4457 & , j, k-1, ivy)*w(i, j, k-1, irho)-three*ddw3)
4458  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fs
4459  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
4460 ! z-momentum.
4461  ddw4 = w(i, j, k+1, ivz)*w(i, j, k+1, irho) - w(i, j, k, ivz)*w(&
4462 & i, j, k, irho)
4463  fs = dis2*ddw4 - dis4*(w(i, j, k+2, ivz)*w(i, j, k+2, irho)-w(i&
4464 & , j, k-1, ivz)*w(i, j, k-1, irho)-three*ddw4)
4465  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fs
4466  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
4467 ! energy.
4468  ddw5 = w(i, j, k+1, irhoe) + p(i, j, k+1) - (w(i, j, k, irhoe)+p&
4469 & (i, j, k))
4470  fs = dis2*ddw5 - dis4*(w(i, j, k+2, irhoe)+p(i, j, k+2)-(w(i, j&
4471 & , k-1, irhoe)+p(i, j, k-1))-three*ddw5)
4472  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + fs
4473  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
4474  end do
4475  end if
4476  end subroutine invisciddissfluxscalar
4477 
4478 ! differentiation of inviscidupwindflux in reverse (adjoint) mode (with options noisize i4 dr8 r8):
4479 ! gradient of useful results: *p *sfacei *sfacej *sfacek
4480 ! *w *si *sj *sk *fw
4481 ! with respect to varying inputs: *p *sfacei *sfacej *sfacek
4482 ! *w *si *sj *sk *fw
4483 ! rw status of diff variables: *p:incr *sfacei:incr *sfacej:incr
4484 ! *sfacek:incr *w:incr *si:incr *sj:incr *sk:incr
4485 ! *fw:in-out
4486 ! plus diff mem management of: p:in sfacei:in sfacej:in sfacek:in
4487 ! w:in si:in sj:in sk:in fw:in
4488  subroutine inviscidupwindflux_b(finegrid)
4489 !
4490 ! inviscidupwindflux computes the artificial dissipation part of
4491 ! the euler fluxes by means of an approximate solution of the 1d
4492 ! riemann problem on the face. for first order schemes,
4493 ! finegrid == .false., the states in the cells are assumed to
4494 ! be constant; for the second order schemes on the fine grid a
4495 ! nonlinear reconstruction of the left and right state is done
4496 ! for which several options exist.
4497 ! it is assumed that the pointers in blockpointers already
4498 ! point to the correct block.
4499 !
4500  use constants
4501  use blockpointers, only : il, jl, kl, ie, je, ke, ib, jb, kb, w, &
4502 & wd, p, pd, pori, porj, pork, fw, fwd, gamma, si, sid, sj, sjd, sk, &
4506 & factfamilyk
4507  use flowvarrefstate, only : kpresent, nw, nwf, rgas, rgasd, tref, &
4508 & trefd
4511  use inputphysics, only : equations
4512  use iteration, only : rfil, currentlevel, groundlevel
4513  use cgnsgrid, only : massflowfamilydiss
4514  use utils_b, only : getcorrectfork, terminate
4515  use flowutils_b, only : etot, etot_b
4516  implicit none
4517 !
4518 ! subroutine arguments.
4519 !
4520  logical, intent(in) :: finegrid
4521 !
4522 ! local variables.
4523 !
4524  integer(kind=portype) :: por
4525  integer(kind=inttype) :: nwint
4526  integer(kind=inttype) :: i, j, k, ind
4527  integer(kind=inttype) :: limused, riemannused
4528  real(kind=realtype) :: sx, sy, sz, omk, opk, sfil, gammaface
4529  real(kind=realtype) :: sxd, syd, szd
4530  real(kind=realtype) :: factminmod, sface
4531  real(kind=realtype) :: sfaced
4532  real(kind=realtype), dimension(nw) :: left, right
4533  real(kind=realtype), dimension(nw) :: leftd, rightd
4534  real(kind=realtype), dimension(nw) :: du1, du2, du3
4535  real(kind=realtype), dimension(nw) :: du1d, du2d, du3d
4536  real(kind=realtype), dimension(nwf) :: flux
4537  real(kind=realtype), dimension(nwf) :: fluxd
4538  logical :: firstorderk, correctfork, rotationalperiodic
4539  intrinsic abs
4540  intrinsic associated
4541  intrinsic max
4542  real(kind=realtype) :: abs0
4543  real(realtype) :: max1
4544  integer :: branch
4545  if (rfil .ge. 0.) then
4546  abs0 = rfil
4547  else
4548  abs0 = -rfil
4549  end if
4550 !
4551 ! check if rfil == 0. if so, the dissipative flux needs not to
4552 ! be computed.
4553  if (abs0 .ge. thresholdreal) then
4554 ! check if the formulation for rotational periodic problems
4555 ! must be used.
4556  if (associated(rotmatrixi)) then
4557  rotationalperiodic = .true.
4558  else
4559  rotationalperiodic = .false.
4560  end if
4561 ! initialize the dissipative residual to a certain times,
4562 ! possibly zero, the previously stored value. owned cells
4563 ! only, because the halo values do not matter.
4564  sfil = one - rfil
4565 ! determine whether or not the total energy must be corrected
4566 ! for the presence of the turbulent kinetic energy.
4567  correctfork = getcorrectfork()
4568  if (1.e-10_realtype .lt. one - kappacoef) then
4569  max1 = one - kappacoef
4570  else
4571  max1 = 1.e-10_realtype
4572  end if
4573 ! compute the factor used in the minmod limiter.
4574  factminmod = (three-kappacoef)/max1
4575 ! determine the limiter scheme to be used. on the fine grid the
4576 ! user specified scheme is used; on the coarse grid a first order
4577 ! scheme is computed.
4578  limused = firstorder
4579  if (finegrid) limused = limiter
4580 ! lumped diss is true for doing approx pc
4581  if (lumpeddiss) limused = firstorder
4582 ! determine the riemann solver which must be used.
4583  riemannused = riemanncoarse
4584  if (finegrid) riemannused = riemann
4585 ! store 1-kappa and 1+kappa a bit easier and multiply it by 0.25.
4586  omk = fourth*(one-kappacoef)
4587  opk = fourth*(one+kappacoef)
4588 ! initialize sface to zero. this value will be used if the
4589 ! block is not moving.
4590  sface = zero
4591 ! set the number of variables to be interpolated depending
4592 ! whether or not a k-equation is present. if a k-equation is
4593 ! present also set the logical firstorderk. this indicates
4594 ! whether or not only a first order approximation is to be used
4595 ! for the turbulent kinetic energy.
4596  if (correctfork) then
4597  if (orderturb .eq. firstorder) then
4598  call pushcontrol1b(0)
4599  nwint = nwf
4600  firstorderk = .true.
4601  else
4602  call pushcontrol1b(0)
4603  nwint = itu1
4604  firstorderk = .false.
4605  end if
4606  else
4607  call pushcontrol1b(1)
4608  nwint = nwf
4609  firstorderk = .false.
4610  end if
4611 !
4612 ! flux computation. a distinction is made between first and
4613 ! second order schemes to avoid the overhead for the first order
4614 ! scheme.
4615 !
4616  if (limused .eq. firstorder) then
4617 !
4618 ! first order reconstruction. the states in the cells are
4619 ! constant. the left and right states are constructed easily.
4620 !
4621 ! fluxes in the i-direction.
4622  do k=2,kl
4623  do j=2,jl
4624  do i=1,il
4625 ! store the normal vector, the porosity and the
4626 ! mesh velocity if present.
4627  call pushreal8(sx)
4628  sx = si(i, j, k, 1)
4629  call pushreal8(sy)
4630  sy = si(i, j, k, 2)
4631  call pushreal8(sz)
4632  sz = si(i, j, k, 3)
4633  if (addgridvelocities) then
4634  call pushreal8(sface)
4635  sface = sfacei(i, j, k)
4636  call pushcontrol1b(0)
4637  else
4638  call pushcontrol1b(1)
4639  end if
4640 ! determine the left and right state.
4641  call pushreal8(left(irho))
4642  left(irho) = w(i, j, k, irho)
4643  call pushreal8(left(ivx))
4644  left(ivx) = w(i, j, k, ivx)
4645  call pushreal8(left(ivy))
4646  left(ivy) = w(i, j, k, ivy)
4647  call pushreal8(left(ivz))
4648  left(ivz) = w(i, j, k, ivz)
4649  call pushreal8(left(irhoe))
4650  left(irhoe) = p(i, j, k)
4651  if (correctfork) then
4652  call pushreal8(left(itu1))
4653  left(itu1) = w(i, j, k, itu1)
4654  call pushcontrol1b(0)
4655  else
4656  call pushcontrol1b(1)
4657  end if
4658  call pushreal8(right(irho))
4659  right(irho) = w(i+1, j, k, irho)
4660  call pushreal8(right(ivx))
4661  right(ivx) = w(i+1, j, k, ivx)
4662  call pushreal8(right(ivy))
4663  right(ivy) = w(i+1, j, k, ivy)
4664  call pushreal8(right(ivz))
4665  right(ivz) = w(i+1, j, k, ivz)
4666  call pushreal8(right(irhoe))
4667  right(irhoe) = p(i+1, j, k)
4668  if (correctfork) then
4669  call pushreal8(right(itu1))
4670  right(itu1) = w(i+1, j, k, itu1)
4671  call pushcontrol1b(0)
4672  else
4673  call pushcontrol1b(1)
4674  end if
4675  end do
4676  end do
4677  end do
4678 ! fluxes in j-direction.
4679  do k=2,kl
4680  do j=1,jl
4681  do i=2,il
4682 ! store the normal vector, the porosity and the
4683 ! mesh velocity if present.
4684  call pushreal8(sx)
4685  sx = sj(i, j, k, 1)
4686  call pushreal8(sy)
4687  sy = sj(i, j, k, 2)
4688  call pushreal8(sz)
4689  sz = sj(i, j, k, 3)
4690  if (addgridvelocities) then
4691  call pushreal8(sface)
4692  sface = sfacej(i, j, k)
4693  call pushcontrol1b(0)
4694  else
4695  call pushcontrol1b(1)
4696  end if
4697 ! determine the left and right state.
4698  call pushreal8(left(irho))
4699  left(irho) = w(i, j, k, irho)
4700  call pushreal8(left(ivx))
4701  left(ivx) = w(i, j, k, ivx)
4702  call pushreal8(left(ivy))
4703  left(ivy) = w(i, j, k, ivy)
4704  call pushreal8(left(ivz))
4705  left(ivz) = w(i, j, k, ivz)
4706  call pushreal8(left(irhoe))
4707  left(irhoe) = p(i, j, k)
4708  if (correctfork) then
4709  call pushreal8(left(itu1))
4710  left(itu1) = w(i, j, k, itu1)
4711  call pushcontrol1b(0)
4712  else
4713  call pushcontrol1b(1)
4714  end if
4715  call pushreal8(right(irho))
4716  right(irho) = w(i, j+1, k, irho)
4717  call pushreal8(right(ivx))
4718  right(ivx) = w(i, j+1, k, ivx)
4719  call pushreal8(right(ivy))
4720  right(ivy) = w(i, j+1, k, ivy)
4721  call pushreal8(right(ivz))
4722  right(ivz) = w(i, j+1, k, ivz)
4723  call pushreal8(right(irhoe))
4724  right(irhoe) = p(i, j+1, k)
4725  if (correctfork) then
4726  call pushreal8(right(itu1))
4727  right(itu1) = w(i, j+1, k, itu1)
4728  call pushcontrol1b(0)
4729  else
4730  call pushcontrol1b(1)
4731  end if
4732  end do
4733  end do
4734  end do
4735 ! fluxes in k-direction.
4736  do k=1,kl
4737  do j=2,jl
4738  do i=2,il
4739 ! store the normal vector, the porosity and the
4740 ! mesh velocity if present.
4741  call pushreal8(sx)
4742  sx = sk(i, j, k, 1)
4743  call pushreal8(sy)
4744  sy = sk(i, j, k, 2)
4745  call pushreal8(sz)
4746  sz = sk(i, j, k, 3)
4747  if (addgridvelocities) then
4748  call pushreal8(sface)
4749  sface = sfacek(i, j, k)
4750  call pushcontrol1b(0)
4751  else
4752  call pushcontrol1b(1)
4753  end if
4754 ! determine the left and right state.
4755  call pushreal8(left(irho))
4756  left(irho) = w(i, j, k, irho)
4757  call pushreal8(left(ivx))
4758  left(ivx) = w(i, j, k, ivx)
4759  call pushreal8(left(ivy))
4760  left(ivy) = w(i, j, k, ivy)
4761  call pushreal8(left(ivz))
4762  left(ivz) = w(i, j, k, ivz)
4763  call pushreal8(left(irhoe))
4764  left(irhoe) = p(i, j, k)
4765  if (correctfork) then
4766  call pushreal8(left(itu1))
4767  left(itu1) = w(i, j, k, itu1)
4768  call pushcontrol1b(0)
4769  else
4770  call pushcontrol1b(1)
4771  end if
4772  call pushreal8(right(irho))
4773  right(irho) = w(i, j, k+1, irho)
4774  call pushreal8(right(ivx))
4775  right(ivx) = w(i, j, k+1, ivx)
4776  call pushreal8(right(ivy))
4777  right(ivy) = w(i, j, k+1, ivy)
4778  call pushreal8(right(ivz))
4779  right(ivz) = w(i, j, k+1, ivz)
4780  call pushreal8(right(irhoe))
4781  right(irhoe) = p(i, j, k+1)
4782  if (correctfork) then
4783  call pushreal8(right(itu1))
4784  right(itu1) = w(i, j, k+1, itu1)
4785  call pushcontrol1b(0)
4786  else
4787  call pushcontrol1b(1)
4788  end if
4789  end do
4790  end do
4791  end do
4792  fluxd = 0.0_8
4793  leftd = 0.0_8
4794  rightd = 0.0_8
4795  sfaced = 0.0_8
4796  do k=kl,1,-1
4797  do j=jl,2,-1
4798  do i=il,2,-1
4799  fluxd(irhoe) = fluxd(irhoe) - fwd(i, j, k+1, irhoe)
4800  fluxd(imz) = fluxd(imz) - fwd(i, j, k+1, imz)
4801  fluxd(imy) = fluxd(imy) - fwd(i, j, k+1, imy)
4802  fluxd(imx) = fluxd(imx) - fwd(i, j, k+1, imx)
4803  fluxd(irho) = fluxd(irho) - fwd(i, j, k+1, irho)
4804  fluxd(irhoe) = fluxd(irhoe) + fwd(i, j, k, irhoe)
4805  fluxd(imz) = fluxd(imz) + fwd(i, j, k, imz)
4806  fluxd(imy) = fluxd(imy) + fwd(i, j, k, imy)
4807  fluxd(imx) = fluxd(imx) + fwd(i, j, k, imx)
4808  fluxd(irho) = fluxd(irho) + fwd(i, j, k, irho)
4809  gammaface = half*(gamma(i, j, k)+gamma(i, j, k+1))
4810  por = pork(i, j, k)
4811  call riemannflux_b(left, leftd, right, rightd, flux, fluxd&
4812 & )
4813  call popcontrol1b(branch)
4814  if (branch .eq. 0) then
4815  call popreal8(right(itu1))
4816  wd(i, j, k+1, itu1) = wd(i, j, k+1, itu1) + rightd(itu1)
4817  rightd(itu1) = 0.0_8
4818  end if
4819  call popreal8(right(irhoe))
4820  pd(i, j, k+1) = pd(i, j, k+1) + rightd(irhoe)
4821  rightd(irhoe) = 0.0_8
4822  call popreal8(right(ivz))
4823  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + rightd(ivz)
4824  rightd(ivz) = 0.0_8
4825  call popreal8(right(ivy))
4826  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + rightd(ivy)
4827  rightd(ivy) = 0.0_8
4828  call popreal8(right(ivx))
4829  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + rightd(ivx)
4830  rightd(ivx) = 0.0_8
4831  call popreal8(right(irho))
4832  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + rightd(irho)
4833  rightd(irho) = 0.0_8
4834  call popcontrol1b(branch)
4835  if (branch .eq. 0) then
4836  call popreal8(left(itu1))
4837  wd(i, j, k, itu1) = wd(i, j, k, itu1) + leftd(itu1)
4838  leftd(itu1) = 0.0_8
4839  end if
4840  call popreal8(left(irhoe))
4841  pd(i, j, k) = pd(i, j, k) + leftd(irhoe)
4842  leftd(irhoe) = 0.0_8
4843  call popreal8(left(ivz))
4844  wd(i, j, k, ivz) = wd(i, j, k, ivz) + leftd(ivz)
4845  leftd(ivz) = 0.0_8
4846  call popreal8(left(ivy))
4847  wd(i, j, k, ivy) = wd(i, j, k, ivy) + leftd(ivy)
4848  leftd(ivy) = 0.0_8
4849  call popreal8(left(ivx))
4850  wd(i, j, k, ivx) = wd(i, j, k, ivx) + leftd(ivx)
4851  leftd(ivx) = 0.0_8
4852  call popreal8(left(irho))
4853  wd(i, j, k, irho) = wd(i, j, k, irho) + leftd(irho)
4854  leftd(irho) = 0.0_8
4855  call popcontrol1b(branch)
4856  if (branch .eq. 0) then
4857  call popreal8(sface)
4858  sfacekd(i, j, k) = sfacekd(i, j, k) + sfaced
4859  sfaced = 0.0_8
4860  end if
4861  call popreal8(sz)
4862  skd(i, j, k, 3) = skd(i, j, k, 3) + szd
4863  call popreal8(sy)
4864  skd(i, j, k, 2) = skd(i, j, k, 2) + syd
4865  call popreal8(sx)
4866  skd(i, j, k, 1) = skd(i, j, k, 1) + sxd
4867  end do
4868  end do
4869  end do
4870  do k=kl,2,-1
4871  do j=jl,1,-1
4872  do i=il,2,-1
4873  fluxd(irhoe) = fluxd(irhoe) - fwd(i, j+1, k, irhoe)
4874  fluxd(imz) = fluxd(imz) - fwd(i, j+1, k, imz)
4875  fluxd(imy) = fluxd(imy) - fwd(i, j+1, k, imy)
4876  fluxd(imx) = fluxd(imx) - fwd(i, j+1, k, imx)
4877  fluxd(irho) = fluxd(irho) - fwd(i, j+1, k, irho)
4878  fluxd(irhoe) = fluxd(irhoe) + fwd(i, j, k, irhoe)
4879  fluxd(imz) = fluxd(imz) + fwd(i, j, k, imz)
4880  fluxd(imy) = fluxd(imy) + fwd(i, j, k, imy)
4881  fluxd(imx) = fluxd(imx) + fwd(i, j, k, imx)
4882  fluxd(irho) = fluxd(irho) + fwd(i, j, k, irho)
4883  gammaface = half*(gamma(i, j, k)+gamma(i, j+1, k))
4884  por = porj(i, j, k)
4885  call riemannflux_b(left, leftd, right, rightd, flux, fluxd&
4886 & )
4887  call popcontrol1b(branch)
4888  if (branch .eq. 0) then
4889  call popreal8(right(itu1))
4890  wd(i, j+1, k, itu1) = wd(i, j+1, k, itu1) + rightd(itu1)
4891  rightd(itu1) = 0.0_8
4892  end if
4893  call popreal8(right(irhoe))
4894  pd(i, j+1, k) = pd(i, j+1, k) + rightd(irhoe)
4895  rightd(irhoe) = 0.0_8
4896  call popreal8(right(ivz))
4897  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + rightd(ivz)
4898  rightd(ivz) = 0.0_8
4899  call popreal8(right(ivy))
4900  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + rightd(ivy)
4901  rightd(ivy) = 0.0_8
4902  call popreal8(right(ivx))
4903  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + rightd(ivx)
4904  rightd(ivx) = 0.0_8
4905  call popreal8(right(irho))
4906  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + rightd(irho)
4907  rightd(irho) = 0.0_8
4908  call popcontrol1b(branch)
4909  if (branch .eq. 0) then
4910  call popreal8(left(itu1))
4911  wd(i, j, k, itu1) = wd(i, j, k, itu1) + leftd(itu1)
4912  leftd(itu1) = 0.0_8
4913  end if
4914  call popreal8(left(irhoe))
4915  pd(i, j, k) = pd(i, j, k) + leftd(irhoe)
4916  leftd(irhoe) = 0.0_8
4917  call popreal8(left(ivz))
4918  wd(i, j, k, ivz) = wd(i, j, k, ivz) + leftd(ivz)
4919  leftd(ivz) = 0.0_8
4920  call popreal8(left(ivy))
4921  wd(i, j, k, ivy) = wd(i, j, k, ivy) + leftd(ivy)
4922  leftd(ivy) = 0.0_8
4923  call popreal8(left(ivx))
4924  wd(i, j, k, ivx) = wd(i, j, k, ivx) + leftd(ivx)
4925  leftd(ivx) = 0.0_8
4926  call popreal8(left(irho))
4927  wd(i, j, k, irho) = wd(i, j, k, irho) + leftd(irho)
4928  leftd(irho) = 0.0_8
4929  call popcontrol1b(branch)
4930  if (branch .eq. 0) then
4931  call popreal8(sface)
4932  sfacejd(i, j, k) = sfacejd(i, j, k) + sfaced
4933  sfaced = 0.0_8
4934  end if
4935  call popreal8(sz)
4936  sjd(i, j, k, 3) = sjd(i, j, k, 3) + szd
4937  call popreal8(sy)
4938  sjd(i, j, k, 2) = sjd(i, j, k, 2) + syd
4939  call popreal8(sx)
4940  sjd(i, j, k, 1) = sjd(i, j, k, 1) + sxd
4941  end do
4942  end do
4943  end do
4944  do k=kl,2,-1
4945  do j=jl,2,-1
4946  do i=il,1,-1
4947  fluxd(irhoe) = fluxd(irhoe) - fwd(i+1, j, k, irhoe)
4948  fluxd(imz) = fluxd(imz) - fwd(i+1, j, k, imz)
4949  fluxd(imy) = fluxd(imy) - fwd(i+1, j, k, imy)
4950  fluxd(imx) = fluxd(imx) - fwd(i+1, j, k, imx)
4951  fluxd(irho) = fluxd(irho) - fwd(i+1, j, k, irho)
4952  fluxd(irhoe) = fluxd(irhoe) + fwd(i, j, k, irhoe)
4953  fluxd(imz) = fluxd(imz) + fwd(i, j, k, imz)
4954  fluxd(imy) = fluxd(imy) + fwd(i, j, k, imy)
4955  fluxd(imx) = fluxd(imx) + fwd(i, j, k, imx)
4956  fluxd(irho) = fluxd(irho) + fwd(i, j, k, irho)
4957  gammaface = half*(gamma(i, j, k)+gamma(i+1, j, k))
4958  por = pori(i, j, k)
4959  call riemannflux_b(left, leftd, right, rightd, flux, fluxd&
4960 & )
4961  call popcontrol1b(branch)
4962  if (branch .eq. 0) then
4963  call popreal8(right(itu1))
4964  wd(i+1, j, k, itu1) = wd(i+1, j, k, itu1) + rightd(itu1)
4965  rightd(itu1) = 0.0_8
4966  end if
4967  call popreal8(right(irhoe))
4968  pd(i+1, j, k) = pd(i+1, j, k) + rightd(irhoe)
4969  rightd(irhoe) = 0.0_8
4970  call popreal8(right(ivz))
4971  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + rightd(ivz)
4972  rightd(ivz) = 0.0_8
4973  call popreal8(right(ivy))
4974  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + rightd(ivy)
4975  rightd(ivy) = 0.0_8
4976  call popreal8(right(ivx))
4977  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + rightd(ivx)
4978  rightd(ivx) = 0.0_8
4979  call popreal8(right(irho))
4980  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + rightd(irho)
4981  rightd(irho) = 0.0_8
4982  call popcontrol1b(branch)
4983  if (branch .eq. 0) then
4984  call popreal8(left(itu1))
4985  wd(i, j, k, itu1) = wd(i, j, k, itu1) + leftd(itu1)
4986  leftd(itu1) = 0.0_8
4987  end if
4988  call popreal8(left(irhoe))
4989  pd(i, j, k) = pd(i, j, k) + leftd(irhoe)
4990  leftd(irhoe) = 0.0_8
4991  call popreal8(left(ivz))
4992  wd(i, j, k, ivz) = wd(i, j, k, ivz) + leftd(ivz)
4993  leftd(ivz) = 0.0_8
4994  call popreal8(left(ivy))
4995  wd(i, j, k, ivy) = wd(i, j, k, ivy) + leftd(ivy)
4996  leftd(ivy) = 0.0_8
4997  call popreal8(left(ivx))
4998  wd(i, j, k, ivx) = wd(i, j, k, ivx) + leftd(ivx)
4999  leftd(ivx) = 0.0_8
5000  call popreal8(left(irho))
5001  wd(i, j, k, irho) = wd(i, j, k, irho) + leftd(irho)
5002  leftd(irho) = 0.0_8
5003  call popcontrol1b(branch)
5004  if (branch .eq. 0) then
5005  call popreal8(sface)
5006  sfaceid(i, j, k) = sfaceid(i, j, k) + sfaced
5007  sfaced = 0.0_8
5008  end if
5009  call popreal8(sz)
5010  sid(i, j, k, 3) = sid(i, j, k, 3) + szd
5011  call popreal8(sy)
5012  sid(i, j, k, 2) = sid(i, j, k, 2) + syd
5013  call popreal8(sx)
5014  sid(i, j, k, 1) = sid(i, j, k, 1) + sxd
5015  end do
5016  end do
5017  end do
5018  else
5019 ! ==================================================================
5020 ! ==================================================================
5021 !
5022 ! second order reconstruction of the left and right state.
5023 ! the three differences used in the, possibly nonlinear,
5024 ! interpolation are constructed here; the actual left and
5025 ! right states, or at least the differences from the first
5026 ! order interpolation, are computed in the subroutine
5027 ! leftrightstate.
5028 !
5029 ! fluxes in the i-direction.
5030  do k=2,kl
5031  do j=2,jl
5032  do i=1,il
5033 ! store the three differences used in the interpolation
5034 ! in du1, du2, du3.
5035  du1(irho) = w(i, j, k, irho) - w(i-1, j, k, irho)
5036  du2(irho) = w(i+1, j, k, irho) - w(i, j, k, irho)
5037  du3(irho) = w(i+2, j, k, irho) - w(i+1, j, k, irho)
5038  du1(ivx) = w(i, j, k, ivx) - w(i-1, j, k, ivx)
5039  du2(ivx) = w(i+1, j, k, ivx) - w(i, j, k, ivx)
5040  du3(ivx) = w(i+2, j, k, ivx) - w(i+1, j, k, ivx)
5041  du1(ivy) = w(i, j, k, ivy) - w(i-1, j, k, ivy)
5042  du2(ivy) = w(i+1, j, k, ivy) - w(i, j, k, ivy)
5043  du3(ivy) = w(i+2, j, k, ivy) - w(i+1, j, k, ivy)
5044  du1(ivz) = w(i, j, k, ivz) - w(i-1, j, k, ivz)
5045  du2(ivz) = w(i+1, j, k, ivz) - w(i, j, k, ivz)
5046  du3(ivz) = w(i+2, j, k, ivz) - w(i+1, j, k, ivz)
5047  du1(irhoe) = p(i, j, k) - p(i-1, j, k)
5048  du2(irhoe) = p(i+1, j, k) - p(i, j, k)
5049  du3(irhoe) = p(i+2, j, k) - p(i+1, j, k)
5050  if (correctfork) then
5051  du1(itu1) = w(i, j, k, itu1) - w(i-1, j, k, itu1)
5052  du2(itu1) = w(i+1, j, k, itu1) - w(i, j, k, itu1)
5053  du3(itu1) = w(i+2, j, k, itu1) - w(i+1, j, k, itu1)
5054  call pushcontrol1b(0)
5055  else
5056  call pushcontrol1b(1)
5057  end if
5058 ! compute the differences from the first order scheme.
5059  call pushreal8array(right, nw)
5060  call pushreal8array(left, nw)
5061  call pushreal8array(du3, nw)
5062  call pushreal8array(du2, nw)
5063  call pushreal8array(du1, nw)
5064  call leftrightstate(du1, du2, du3, rotmatrixi, left, right&
5065 & )
5066 ! add the first order part to the currently stored
5067 ! differences, such that the correct state vector
5068 ! is stored.
5069  left(irho) = left(irho) + w(i, j, k, irho)
5070  left(ivx) = left(ivx) + w(i, j, k, ivx)
5071  left(ivy) = left(ivy) + w(i, j, k, ivy)
5072  left(ivz) = left(ivz) + w(i, j, k, ivz)
5073  left(irhoe) = left(irhoe) + p(i, j, k)
5074  right(irho) = right(irho) + w(i+1, j, k, irho)
5075  right(ivx) = right(ivx) + w(i+1, j, k, ivx)
5076  right(ivy) = right(ivy) + w(i+1, j, k, ivy)
5077  right(ivz) = right(ivz) + w(i+1, j, k, ivz)
5078  right(irhoe) = right(irhoe) + p(i+1, j, k)
5079  if (correctfork) then
5080  left(itu1) = left(itu1) + w(i, j, k, itu1)
5081  right(itu1) = right(itu1) + w(i+1, j, k, itu1)
5082  call pushcontrol1b(0)
5083  else
5084  call pushcontrol1b(1)
5085  end if
5086 ! store the normal vector, the porosity and the
5087 ! mesh velocity if present.
5088  call pushreal8(sx)
5089  sx = si(i, j, k, 1)
5090  call pushreal8(sy)
5091  sy = si(i, j, k, 2)
5092  call pushreal8(sz)
5093  sz = si(i, j, k, 3)
5094  if (addgridvelocities) then
5095  call pushreal8(sface)
5096  sface = sfacei(i, j, k)
5097  call pushcontrol1b(0)
5098  else
5099  call pushcontrol1b(1)
5100  end if
5101  end do
5102  end do
5103  end do
5104 ! fluxes in the j-direction.
5105  do k=2,kl
5106  do j=1,jl
5107  do i=2,il
5108 ! store the three differences used in the interpolation
5109 ! in du1, du2, du3.
5110  du1(irho) = w(i, j, k, irho) - w(i, j-1, k, irho)
5111  du2(irho) = w(i, j+1, k, irho) - w(i, j, k, irho)
5112  du3(irho) = w(i, j+2, k, irho) - w(i, j+1, k, irho)
5113  du1(ivx) = w(i, j, k, ivx) - w(i, j-1, k, ivx)
5114  du2(ivx) = w(i, j+1, k, ivx) - w(i, j, k, ivx)
5115  du3(ivx) = w(i, j+2, k, ivx) - w(i, j+1, k, ivx)
5116  du1(ivy) = w(i, j, k, ivy) - w(i, j-1, k, ivy)
5117  du2(ivy) = w(i, j+1, k, ivy) - w(i, j, k, ivy)
5118  du3(ivy) = w(i, j+2, k, ivy) - w(i, j+1, k, ivy)
5119  du1(ivz) = w(i, j, k, ivz) - w(i, j-1, k, ivz)
5120  du2(ivz) = w(i, j+1, k, ivz) - w(i, j, k, ivz)
5121  du3(ivz) = w(i, j+2, k, ivz) - w(i, j+1, k, ivz)
5122  du1(irhoe) = p(i, j, k) - p(i, j-1, k)
5123  du2(irhoe) = p(i, j+1, k) - p(i, j, k)
5124  du3(irhoe) = p(i, j+2, k) - p(i, j+1, k)
5125  if (correctfork) then
5126  du1(itu1) = w(i, j, k, itu1) - w(i, j-1, k, itu1)
5127  du2(itu1) = w(i, j+1, k, itu1) - w(i, j, k, itu1)
5128  du3(itu1) = w(i, j+2, k, itu1) - w(i, j+1, k, itu1)
5129  call pushcontrol1b(0)
5130  else
5131  call pushcontrol1b(1)
5132  end if
5133 ! compute the differences from the first order scheme.
5134  call pushreal8array(right, nw)
5135  call pushreal8array(left, nw)
5136  call pushreal8array(du3, nw)
5137  call pushreal8array(du2, nw)
5138  call pushreal8array(du1, nw)
5139  call leftrightstate(du1, du2, du3, rotmatrixj, left, right&
5140 & )
5141 ! add the first order part to the currently stored
5142 ! differences, such that the correct state vector
5143 ! is stored.
5144  left(irho) = left(irho) + w(i, j, k, irho)
5145  left(ivx) = left(ivx) + w(i, j, k, ivx)
5146  left(ivy) = left(ivy) + w(i, j, k, ivy)
5147  left(ivz) = left(ivz) + w(i, j, k, ivz)
5148  left(irhoe) = left(irhoe) + p(i, j, k)
5149  right(irho) = right(irho) + w(i, j+1, k, irho)
5150  right(ivx) = right(ivx) + w(i, j+1, k, ivx)
5151  right(ivy) = right(ivy) + w(i, j+1, k, ivy)
5152  right(ivz) = right(ivz) + w(i, j+1, k, ivz)
5153  right(irhoe) = right(irhoe) + p(i, j+1, k)
5154  if (correctfork) then
5155  left(itu1) = left(itu1) + w(i, j, k, itu1)
5156  right(itu1) = right(itu1) + w(i, j+1, k, itu1)
5157  call pushcontrol1b(0)
5158  else
5159  call pushcontrol1b(1)
5160  end if
5161 ! store the normal vector, the porosity and the
5162 ! mesh velocity if present.
5163  call pushreal8(sx)
5164  sx = sj(i, j, k, 1)
5165  call pushreal8(sy)
5166  sy = sj(i, j, k, 2)
5167  call pushreal8(sz)
5168  sz = sj(i, j, k, 3)
5169  if (addgridvelocities) then
5170  call pushreal8(sface)
5171  sface = sfacej(i, j, k)
5172  call pushcontrol1b(0)
5173  else
5174  call pushcontrol1b(1)
5175  end if
5176  end do
5177  end do
5178  end do
5179 ! fluxes in the k-direction.
5180  do k=1,kl
5181  do j=2,jl
5182  do i=2,il
5183 ! store the three differences used in the interpolation
5184 ! in du1, du2, du3.
5185  du1(irho) = w(i, j, k, irho) - w(i, j, k-1, irho)
5186  du2(irho) = w(i, j, k+1, irho) - w(i, j, k, irho)
5187  du3(irho) = w(i, j, k+2, irho) - w(i, j, k+1, irho)
5188  du1(ivx) = w(i, j, k, ivx) - w(i, j, k-1, ivx)
5189  du2(ivx) = w(i, j, k+1, ivx) - w(i, j, k, ivx)
5190  du3(ivx) = w(i, j, k+2, ivx) - w(i, j, k+1, ivx)
5191  du1(ivy) = w(i, j, k, ivy) - w(i, j, k-1, ivy)
5192  du2(ivy) = w(i, j, k+1, ivy) - w(i, j, k, ivy)
5193  du3(ivy) = w(i, j, k+2, ivy) - w(i, j, k+1, ivy)
5194  du1(ivz) = w(i, j, k, ivz) - w(i, j, k-1, ivz)
5195  du2(ivz) = w(i, j, k+1, ivz) - w(i, j, k, ivz)
5196  du3(ivz) = w(i, j, k+2, ivz) - w(i, j, k+1, ivz)
5197  du1(irhoe) = p(i, j, k) - p(i, j, k-1)
5198  du2(irhoe) = p(i, j, k+1) - p(i, j, k)
5199  du3(irhoe) = p(i, j, k+2) - p(i, j, k+1)
5200  if (correctfork) then
5201  du1(itu1) = w(i, j, k, itu1) - w(i, j, k-1, itu1)
5202  du2(itu1) = w(i, j, k+1, itu1) - w(i, j, k, itu1)
5203  du3(itu1) = w(i, j, k+2, itu1) - w(i, j, k+1, itu1)
5204  call pushcontrol1b(0)
5205  else
5206  call pushcontrol1b(1)
5207  end if
5208 ! compute the differences from the first order scheme.
5209  call pushreal8array(right, nw)
5210  call pushreal8array(left, nw)
5211  call pushreal8array(du3, nw)
5212  call pushreal8array(du2, nw)
5213  call pushreal8array(du1, nw)
5214  call leftrightstate(du1, du2, du3, rotmatrixk, left, right&
5215 & )
5216 ! add the first order part to the currently stored
5217 ! differences, such that the correct state vector
5218 ! is stored.
5219  left(irho) = left(irho) + w(i, j, k, irho)
5220  left(ivx) = left(ivx) + w(i, j, k, ivx)
5221  left(ivy) = left(ivy) + w(i, j, k, ivy)
5222  left(ivz) = left(ivz) + w(i, j, k, ivz)
5223  left(irhoe) = left(irhoe) + p(i, j, k)
5224  right(irho) = right(irho) + w(i, j, k+1, irho)
5225  right(ivx) = right(ivx) + w(i, j, k+1, ivx)
5226  right(ivy) = right(ivy) + w(i, j, k+1, ivy)
5227  right(ivz) = right(ivz) + w(i, j, k+1, ivz)
5228  right(irhoe) = right(irhoe) + p(i, j, k+1)
5229  if (correctfork) then
5230  left(itu1) = left(itu1) + w(i, j, k, itu1)
5231  right(itu1) = right(itu1) + w(i, j, k+1, itu1)
5232  call pushcontrol1b(0)
5233  else
5234  call pushcontrol1b(1)
5235  end if
5236 ! store the normal vector, the porosity and the
5237 ! mesh velocity if present.
5238  call pushreal8(sx)
5239  sx = sk(i, j, k, 1)
5240  call pushreal8(sy)
5241  sy = sk(i, j, k, 2)
5242  call pushreal8(sz)
5243  sz = sk(i, j, k, 3)
5244  if (addgridvelocities) then
5245  call pushreal8(sface)
5246  sface = sfacek(i, j, k)
5247  call pushcontrol1b(0)
5248  else
5249  call pushcontrol1b(1)
5250  end if
5251  end do
5252  end do
5253  end do
5254  fluxd = 0.0_8
5255  leftd = 0.0_8
5256  rightd = 0.0_8
5257  du1d = 0.0_8
5258  du2d = 0.0_8
5259  du3d = 0.0_8
5260  sfaced = 0.0_8
5261  do k=kl,1,-1
5262  do j=jl,2,-1
5263  do i=il,2,-1
5264  fluxd(irhoe) = fluxd(irhoe) - fwd(i, j, k+1, irhoe)
5265  fluxd(imz) = fluxd(imz) - fwd(i, j, k+1, imz)
5266  fluxd(imy) = fluxd(imy) - fwd(i, j, k+1, imy)
5267  fluxd(imx) = fluxd(imx) - fwd(i, j, k+1, imx)
5268  fluxd(irho) = fluxd(irho) - fwd(i, j, k+1, irho)
5269  fluxd(irhoe) = fluxd(irhoe) + fwd(i, j, k, irhoe)
5270  fluxd(imz) = fluxd(imz) + fwd(i, j, k, imz)
5271  fluxd(imy) = fluxd(imy) + fwd(i, j, k, imy)
5272  fluxd(imx) = fluxd(imx) + fwd(i, j, k, imx)
5273  fluxd(irho) = fluxd(irho) + fwd(i, j, k, irho)
5274  gammaface = half*(gamma(i, j, k)+gamma(i, j, k+1))
5275  por = pork(i, j, k)
5276  call riemannflux_b(left, leftd, right, rightd, flux, fluxd&
5277 & )
5278  call popcontrol1b(branch)
5279  if (branch .eq. 0) then
5280  call popreal8(sface)
5281  sfacekd(i, j, k) = sfacekd(i, j, k) + sfaced
5282  sfaced = 0.0_8
5283  end if
5284  call popreal8(sz)
5285  skd(i, j, k, 3) = skd(i, j, k, 3) + szd
5286  call popreal8(sy)
5287  skd(i, j, k, 2) = skd(i, j, k, 2) + syd
5288  call popreal8(sx)
5289  skd(i, j, k, 1) = skd(i, j, k, 1) + sxd
5290  call popcontrol1b(branch)
5291  if (branch .eq. 0) then
5292  wd(i, j, k+1, itu1) = wd(i, j, k+1, itu1) + rightd(itu1)
5293  wd(i, j, k, itu1) = wd(i, j, k, itu1) + leftd(itu1)
5294  end if
5295  pd(i, j, k+1) = pd(i, j, k+1) + rightd(irhoe)
5296  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + rightd(ivz)
5297  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + rightd(ivy)
5298  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + rightd(ivx)
5299  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + rightd(irho)
5300  pd(i, j, k) = pd(i, j, k) + leftd(irhoe)
5301  wd(i, j, k, ivz) = wd(i, j, k, ivz) + leftd(ivz)
5302  wd(i, j, k, ivy) = wd(i, j, k, ivy) + leftd(ivy)
5303  wd(i, j, k, ivx) = wd(i, j, k, ivx) + leftd(ivx)
5304  wd(i, j, k, irho) = wd(i, j, k, irho) + leftd(irho)
5305  call popreal8array(du1, nw)
5306  call popreal8array(du2, nw)
5307  call popreal8array(du3, nw)
5308  call popreal8array(left, nw)
5309  call popreal8array(right, nw)
5310  call leftrightstate_b(du1, du1d, du2, du2d, du3, du3d, &
5311 & rotmatrixk, left, leftd, right, rightd)
5312  call popcontrol1b(branch)
5313  if (branch .eq. 0) then
5314  wd(i, j, k+2, itu1) = wd(i, j, k+2, itu1) + du3d(itu1)
5315  wd(i, j, k+1, itu1) = wd(i, j, k+1, itu1) + du2d(itu1) -&
5316 & du3d(itu1)
5317  du3d(itu1) = 0.0_8
5318  wd(i, j, k, itu1) = wd(i, j, k, itu1) + du1d(itu1) - &
5319 & du2d(itu1)
5320  du2d(itu1) = 0.0_8
5321  wd(i, j, k-1, itu1) = wd(i, j, k-1, itu1) - du1d(itu1)
5322  du1d(itu1) = 0.0_8
5323  end if
5324  pd(i, j, k+2) = pd(i, j, k+2) + du3d(irhoe)
5325  pd(i, j, k+1) = pd(i, j, k+1) + du2d(irhoe) - du3d(irhoe)
5326  du3d(irhoe) = 0.0_8
5327  pd(i, j, k) = pd(i, j, k) + du1d(irhoe) - du2d(irhoe)
5328  du2d(irhoe) = 0.0_8
5329  pd(i, j, k-1) = pd(i, j, k-1) - du1d(irhoe)
5330  du1d(irhoe) = 0.0_8
5331  wd(i, j, k+2, ivz) = wd(i, j, k+2, ivz) + du3d(ivz)
5332  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + du2d(ivz) - du3d&
5333 & (ivz)
5334  du3d(ivz) = 0.0_8
5335  wd(i, j, k, ivz) = wd(i, j, k, ivz) + du1d(ivz) - du2d(ivz&
5336 & )
5337  du2d(ivz) = 0.0_8
5338  wd(i, j, k-1, ivz) = wd(i, j, k-1, ivz) - du1d(ivz)
5339  du1d(ivz) = 0.0_8
5340  wd(i, j, k+2, ivy) = wd(i, j, k+2, ivy) + du3d(ivy)
5341  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + du2d(ivy) - du3d&
5342 & (ivy)
5343  du3d(ivy) = 0.0_8
5344  wd(i, j, k, ivy) = wd(i, j, k, ivy) + du1d(ivy) - du2d(ivy&
5345 & )
5346  du2d(ivy) = 0.0_8
5347  wd(i, j, k-1, ivy) = wd(i, j, k-1, ivy) - du1d(ivy)
5348  du1d(ivy) = 0.0_8
5349  wd(i, j, k+2, ivx) = wd(i, j, k+2, ivx) + du3d(ivx)
5350  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + du2d(ivx) - du3d&
5351 & (ivx)
5352  du3d(ivx) = 0.0_8
5353  wd(i, j, k, ivx) = wd(i, j, k, ivx) + du1d(ivx) - du2d(ivx&
5354 & )
5355  du2d(ivx) = 0.0_8
5356  wd(i, j, k-1, ivx) = wd(i, j, k-1, ivx) - du1d(ivx)
5357  du1d(ivx) = 0.0_8
5358  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + du3d(irho)
5359  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + du2d(irho) - &
5360 & du3d(irho)
5361  du3d(irho) = 0.0_8
5362  wd(i, j, k, irho) = wd(i, j, k, irho) + du1d(irho) - du2d(&
5363 & irho)
5364  du2d(irho) = 0.0_8
5365  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - du1d(irho)
5366  du1d(irho) = 0.0_8
5367  end do
5368  end do
5369  end do
5370  do k=kl,2,-1
5371  do j=jl,1,-1
5372  do i=il,2,-1
5373  fluxd(irhoe) = fluxd(irhoe) - fwd(i, j+1, k, irhoe)
5374  fluxd(imz) = fluxd(imz) - fwd(i, j+1, k, imz)
5375  fluxd(imy) = fluxd(imy) - fwd(i, j+1, k, imy)
5376  fluxd(imx) = fluxd(imx) - fwd(i, j+1, k, imx)
5377  fluxd(irho) = fluxd(irho) - fwd(i, j+1, k, irho)
5378  fluxd(irhoe) = fluxd(irhoe) + fwd(i, j, k, irhoe)
5379  fluxd(imz) = fluxd(imz) + fwd(i, j, k, imz)
5380  fluxd(imy) = fluxd(imy) + fwd(i, j, k, imy)
5381  fluxd(imx) = fluxd(imx) + fwd(i, j, k, imx)
5382  fluxd(irho) = fluxd(irho) + fwd(i, j, k, irho)
5383  gammaface = half*(gamma(i, j, k)+gamma(i, j+1, k))
5384  por = porj(i, j, k)
5385  call riemannflux_b(left, leftd, right, rightd, flux, fluxd&
5386 & )
5387  call popcontrol1b(branch)
5388  if (branch .eq. 0) then
5389  call popreal8(sface)
5390  sfacejd(i, j, k) = sfacejd(i, j, k) + sfaced
5391  sfaced = 0.0_8
5392  end if
5393  call popreal8(sz)
5394  sjd(i, j, k, 3) = sjd(i, j, k, 3) + szd
5395  call popreal8(sy)
5396  sjd(i, j, k, 2) = sjd(i, j, k, 2) + syd
5397  call popreal8(sx)
5398  sjd(i, j, k, 1) = sjd(i, j, k, 1) + sxd
5399  call popcontrol1b(branch)
5400  if (branch .eq. 0) then
5401  wd(i, j+1, k, itu1) = wd(i, j+1, k, itu1) + rightd(itu1)
5402  wd(i, j, k, itu1) = wd(i, j, k, itu1) + leftd(itu1)
5403  end if
5404  pd(i, j+1, k) = pd(i, j+1, k) + rightd(irhoe)
5405  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + rightd(ivz)
5406  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + rightd(ivy)
5407  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + rightd(ivx)
5408  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + rightd(irho)
5409  pd(i, j, k) = pd(i, j, k) + leftd(irhoe)
5410  wd(i, j, k, ivz) = wd(i, j, k, ivz) + leftd(ivz)
5411  wd(i, j, k, ivy) = wd(i, j, k, ivy) + leftd(ivy)
5412  wd(i, j, k, ivx) = wd(i, j, k, ivx) + leftd(ivx)
5413  wd(i, j, k, irho) = wd(i, j, k, irho) + leftd(irho)
5414  call popreal8array(du1, nw)
5415  call popreal8array(du2, nw)
5416  call popreal8array(du3, nw)
5417  call popreal8array(left, nw)
5418  call popreal8array(right, nw)
5419  call leftrightstate_b(du1, du1d, du2, du2d, du3, du3d, &
5420 & rotmatrixj, left, leftd, right, rightd)
5421  call popcontrol1b(branch)
5422  if (branch .eq. 0) then
5423  wd(i, j+2, k, itu1) = wd(i, j+2, k, itu1) + du3d(itu1)
5424  wd(i, j+1, k, itu1) = wd(i, j+1, k, itu1) + du2d(itu1) -&
5425 & du3d(itu1)
5426  du3d(itu1) = 0.0_8
5427  wd(i, j, k, itu1) = wd(i, j, k, itu1) + du1d(itu1) - &
5428 & du2d(itu1)
5429  du2d(itu1) = 0.0_8
5430  wd(i, j-1, k, itu1) = wd(i, j-1, k, itu1) - du1d(itu1)
5431  du1d(itu1) = 0.0_8
5432  end if
5433  pd(i, j+2, k) = pd(i, j+2, k) + du3d(irhoe)
5434  pd(i, j+1, k) = pd(i, j+1, k) + du2d(irhoe) - du3d(irhoe)
5435  du3d(irhoe) = 0.0_8
5436  pd(i, j, k) = pd(i, j, k) + du1d(irhoe) - du2d(irhoe)
5437  du2d(irhoe) = 0.0_8
5438  pd(i, j-1, k) = pd(i, j-1, k) - du1d(irhoe)
5439  du1d(irhoe) = 0.0_8
5440  wd(i, j+2, k, ivz) = wd(i, j+2, k, ivz) + du3d(ivz)
5441  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + du2d(ivz) - du3d&
5442 & (ivz)
5443  du3d(ivz) = 0.0_8
5444  wd(i, j, k, ivz) = wd(i, j, k, ivz) + du1d(ivz) - du2d(ivz&
5445 & )
5446  du2d(ivz) = 0.0_8
5447  wd(i, j-1, k, ivz) = wd(i, j-1, k, ivz) - du1d(ivz)
5448  du1d(ivz) = 0.0_8
5449  wd(i, j+2, k, ivy) = wd(i, j+2, k, ivy) + du3d(ivy)
5450  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + du2d(ivy) - du3d&
5451 & (ivy)
5452  du3d(ivy) = 0.0_8
5453  wd(i, j, k, ivy) = wd(i, j, k, ivy) + du1d(ivy) - du2d(ivy&
5454 & )
5455  du2d(ivy) = 0.0_8
5456  wd(i, j-1, k, ivy) = wd(i, j-1, k, ivy) - du1d(ivy)
5457  du1d(ivy) = 0.0_8
5458  wd(i, j+2, k, ivx) = wd(i, j+2, k, ivx) + du3d(ivx)
5459  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + du2d(ivx) - du3d&
5460 & (ivx)
5461  du3d(ivx) = 0.0_8
5462  wd(i, j, k, ivx) = wd(i, j, k, ivx) + du1d(ivx) - du2d(ivx&
5463 & )
5464  du2d(ivx) = 0.0_8
5465  wd(i, j-1, k, ivx) = wd(i, j-1, k, ivx) - du1d(ivx)
5466  du1d(ivx) = 0.0_8
5467  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + du3d(irho)
5468  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + du2d(irho) - &
5469 & du3d(irho)
5470  du3d(irho) = 0.0_8
5471  wd(i, j, k, irho) = wd(i, j, k, irho) + du1d(irho) - du2d(&
5472 & irho)
5473  du2d(irho) = 0.0_8
5474  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - du1d(irho)
5475  du1d(irho) = 0.0_8
5476  end do
5477  end do
5478  end do
5479  do k=kl,2,-1
5480  do j=jl,2,-1
5481  do i=il,1,-1
5482  fluxd(irhoe) = fluxd(irhoe) - fwd(i+1, j, k, irhoe)
5483  fluxd(imz) = fluxd(imz) - fwd(i+1, j, k, imz)
5484  fluxd(imy) = fluxd(imy) - fwd(i+1, j, k, imy)
5485  fluxd(imx) = fluxd(imx) - fwd(i+1, j, k, imx)
5486  fluxd(irho) = fluxd(irho) - fwd(i+1, j, k, irho)
5487  fluxd(irhoe) = fluxd(irhoe) + fwd(i, j, k, irhoe)
5488  fluxd(imz) = fluxd(imz) + fwd(i, j, k, imz)
5489  fluxd(imy) = fluxd(imy) + fwd(i, j, k, imy)
5490  fluxd(imx) = fluxd(imx) + fwd(i, j, k, imx)
5491  fluxd(irho) = fluxd(irho) + fwd(i, j, k, irho)
5492  gammaface = half*(gamma(i, j, k)+gamma(i+1, j, k))
5493  por = pori(i, j, k)
5494  call riemannflux_b(left, leftd, right, rightd, flux, fluxd&
5495 & )
5496  call popcontrol1b(branch)
5497  if (branch .eq. 0) then
5498  call popreal8(sface)
5499  sfaceid(i, j, k) = sfaceid(i, j, k) + sfaced
5500  sfaced = 0.0_8
5501  end if
5502  call popreal8(sz)
5503  sid(i, j, k, 3) = sid(i, j, k, 3) + szd
5504  call popreal8(sy)
5505  sid(i, j, k, 2) = sid(i, j, k, 2) + syd
5506  call popreal8(sx)
5507  sid(i, j, k, 1) = sid(i, j, k, 1) + sxd
5508  call popcontrol1b(branch)
5509  if (branch .eq. 0) then
5510  wd(i+1, j, k, itu1) = wd(i+1, j, k, itu1) + rightd(itu1)
5511  wd(i, j, k, itu1) = wd(i, j, k, itu1) + leftd(itu1)
5512  end if
5513  pd(i+1, j, k) = pd(i+1, j, k) + rightd(irhoe)
5514  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + rightd(ivz)
5515  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + rightd(ivy)
5516  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + rightd(ivx)
5517  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + rightd(irho)
5518  pd(i, j, k) = pd(i, j, k) + leftd(irhoe)
5519  wd(i, j, k, ivz) = wd(i, j, k, ivz) + leftd(ivz)
5520  wd(i, j, k, ivy) = wd(i, j, k, ivy) + leftd(ivy)
5521  wd(i, j, k, ivx) = wd(i, j, k, ivx) + leftd(ivx)
5522  wd(i, j, k, irho) = wd(i, j, k, irho) + leftd(irho)
5523  call popreal8array(du1, nw)
5524  call popreal8array(du2, nw)
5525  call popreal8array(du3, nw)
5526  call popreal8array(left, nw)
5527  call popreal8array(right, nw)
5528  call leftrightstate_b(du1, du1d, du2, du2d, du3, du3d, &
5529 & rotmatrixi, left, leftd, right, rightd)
5530  call popcontrol1b(branch)
5531  if (branch .eq. 0) then
5532  wd(i+2, j, k, itu1) = wd(i+2, j, k, itu1) + du3d(itu1)
5533  wd(i+1, j, k, itu1) = wd(i+1, j, k, itu1) + du2d(itu1) -&
5534 & du3d(itu1)
5535  du3d(itu1) = 0.0_8
5536  wd(i, j, k, itu1) = wd(i, j, k, itu1) + du1d(itu1) - &
5537 & du2d(itu1)
5538  du2d(itu1) = 0.0_8
5539  wd(i-1, j, k, itu1) = wd(i-1, j, k, itu1) - du1d(itu1)
5540  du1d(itu1) = 0.0_8
5541  end if
5542  pd(i+2, j, k) = pd(i+2, j, k) + du3d(irhoe)
5543  pd(i+1, j, k) = pd(i+1, j, k) + du2d(irhoe) - du3d(irhoe)
5544  du3d(irhoe) = 0.0_8
5545  pd(i, j, k) = pd(i, j, k) + du1d(irhoe) - du2d(irhoe)
5546  du2d(irhoe) = 0.0_8
5547  pd(i-1, j, k) = pd(i-1, j, k) - du1d(irhoe)
5548  du1d(irhoe) = 0.0_8
5549  wd(i+2, j, k, ivz) = wd(i+2, j, k, ivz) + du3d(ivz)
5550  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + du2d(ivz) - du3d&
5551 & (ivz)
5552  du3d(ivz) = 0.0_8
5553  wd(i, j, k, ivz) = wd(i, j, k, ivz) + du1d(ivz) - du2d(ivz&
5554 & )
5555  du2d(ivz) = 0.0_8
5556  wd(i-1, j, k, ivz) = wd(i-1, j, k, ivz) - du1d(ivz)
5557  du1d(ivz) = 0.0_8
5558  wd(i+2, j, k, ivy) = wd(i+2, j, k, ivy) + du3d(ivy)
5559  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + du2d(ivy) - du3d&
5560 & (ivy)
5561  du3d(ivy) = 0.0_8
5562  wd(i, j, k, ivy) = wd(i, j, k, ivy) + du1d(ivy) - du2d(ivy&
5563 & )
5564  du2d(ivy) = 0.0_8
5565  wd(i-1, j, k, ivy) = wd(i-1, j, k, ivy) - du1d(ivy)
5566  du1d(ivy) = 0.0_8
5567  wd(i+2, j, k, ivx) = wd(i+2, j, k, ivx) + du3d(ivx)
5568  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + du2d(ivx) - du3d&
5569 & (ivx)
5570  du3d(ivx) = 0.0_8
5571  wd(i, j, k, ivx) = wd(i, j, k, ivx) + du1d(ivx) - du2d(ivx&
5572 & )
5573  du2d(ivx) = 0.0_8
5574  wd(i-1, j, k, ivx) = wd(i-1, j, k, ivx) - du1d(ivx)
5575  du1d(ivx) = 0.0_8
5576  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + du3d(irho)
5577  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + du2d(irho) - &
5578 & du3d(irho)
5579  du3d(irho) = 0.0_8
5580  wd(i, j, k, irho) = wd(i, j, k, irho) + du1d(irho) - du2d(&
5581 & irho)
5582  du2d(irho) = 0.0_8
5583  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - du1d(irho)
5584  du1d(irho) = 0.0_8
5585  end do
5586  end do
5587  end do
5588  end if
5589  call popcontrol1b(branch)
5590  do k=kl,2,-1
5591  do j=jl,2,-1
5592  do i=il,2,-1
5593  fwd(i, j, k, irhoe) = sfil*fwd(i, j, k, irhoe)
5594  fwd(i, j, k, imz) = sfil*fwd(i, j, k, imz)
5595  fwd(i, j, k, imy) = sfil*fwd(i, j, k, imy)
5596  fwd(i, j, k, imx) = sfil*fwd(i, j, k, imx)
5597  fwd(i, j, k, irho) = sfil*fwd(i, j, k, irho)
5598  end do
5599  end do
5600  end do
5601  end if
5602 
5603  contains
5604 ! differentiation of leftrightstate in reverse (adjoint) mode (with options noisize i4 dr8 r8):
5605 ! gradient of useful results: left right du1 du2 du3
5606 ! with respect to varying inputs: left right du1 du2 du3
5607 ! ==================================================================
5608  subroutine leftrightstate_b(du1, du1d, du2, du2d, du3, du3d, &
5609 & rotmatrix, left, leftd, right, rightd)
5610  implicit none
5611 !
5612 ! local parameter.
5613 !
5614  real(kind=realtype), parameter :: epslim=1.e-10_realtype
5615 !
5616 ! subroutine arguments.
5617 !
5618  real(kind=realtype), dimension(:), intent(inout) :: du1, du2, du3
5619  real(kind=realtype), dimension(:), intent(inout) :: du1d, du2d, &
5620 & du3d
5621  real(kind=realtype), dimension(:) :: left, right
5622  real(kind=realtype), dimension(:) :: leftd, rightd
5623  real(kind=realtype), dimension(:, :, :, :, :), pointer :: &
5624 & rotmatrix
5625 !
5626 ! local variables.
5627 !
5628  integer(kind=inttype) :: l
5629  real(kind=realtype) :: rl1, rl2, rr1, rr2, tmp, dvx, dvy, dvz
5630  real(kind=realtype) :: rl1d, rl2d, rr1d, rr2d, tmpd, dvxd, dvyd, &
5631 & dvzd
5632  real(kind=realtype), dimension(3, 3) :: rot
5633  intrinsic abs
5634  intrinsic max
5635  intrinsic sign
5636  intrinsic min
5637  real(kind=realtype) :: x1
5638  real(kind=realtype) :: x1d
5639  real(kind=realtype) :: y1
5640  real(kind=realtype) :: y1d
5641  real(kind=realtype) :: y2
5642  real(kind=realtype) :: y2d
5643  real(kind=realtype) :: x2
5644  real(kind=realtype) :: x2d
5645  real(kind=realtype) :: y3
5646  real(kind=realtype) :: y3d
5647  real(kind=realtype) :: y4
5648  real(kind=realtype) :: y4d
5649  real(kind=realtype) :: x3
5650  real(kind=realtype) :: x3d
5651  real(kind=realtype) :: x4
5652  real(kind=realtype) :: x4d
5653  real(kind=realtype) :: x5
5654  real(kind=realtype) :: x5d
5655  real(kind=realtype) :: x6
5656  real(kind=realtype) :: x6d
5657  real(kind=realtype) :: max2
5658  real(kind=realtype) :: max2d
5659  real(kind=realtype) :: max3
5660  real(kind=realtype) :: max3d
5661  real(kind=realtype) :: max4
5662  real(kind=realtype) :: max4d
5663  real(kind=realtype) :: max5
5664  real(kind=realtype) :: max5d
5665  real(kind=realtype) :: max6
5666  real(kind=realtype) :: max6d
5667  real(kind=realtype) :: max7
5668  real(kind=realtype) :: max7d
5669  real(kind=realtype) :: temp
5670  real(kind=realtype) :: tempd
5671  integer :: branch
5672 ! check if the velocity components should be transformed to
5673 ! the cylindrical frame.
5674  if (rotationalperiodic) then
5675 ! store the rotation matrix a bit easier. note that the i,j,k
5676 ! come from the main subroutine.
5677  rot(1, 1) = rotmatrix(i, j, k, 1, 1)
5678  rot(1, 2) = rotmatrix(i, j, k, 1, 2)
5679  rot(1, 3) = rotmatrix(i, j, k, 1, 3)
5680  rot(2, 1) = rotmatrix(i, j, k, 2, 1)
5681  rot(2, 2) = rotmatrix(i, j, k, 2, 2)
5682  rot(2, 3) = rotmatrix(i, j, k, 2, 3)
5683  rot(3, 1) = rotmatrix(i, j, k, 3, 1)
5684  rot(3, 2) = rotmatrix(i, j, k, 3, 2)
5685  rot(3, 3) = rotmatrix(i, j, k, 3, 3)
5686 ! apply the transformation to the velocity components
5687 ! of du1, du2 and du3.
5688  dvx = du1(ivx)
5689  dvy = du1(ivy)
5690  dvz = du1(ivz)
5691  du1(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
5692  du1(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
5693  du1(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
5694  dvx = du2(ivx)
5695  dvy = du2(ivy)
5696  dvz = du2(ivz)
5697  du2(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
5698  du2(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
5699  du2(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
5700  dvx = du3(ivx)
5701  dvy = du3(ivy)
5702  dvz = du3(ivz)
5703  du3(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
5704  du3(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
5705  du3(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
5706  call pushcontrol1b(0)
5707  else
5708  call pushcontrol1b(1)
5709  end if
5710 ! determine the limiter used.
5711  select case (limused)
5712  case (nolimiter)
5713  call pushcontrol2b(1)
5714  case (vanalbeda)
5715 ! ==============================================================
5716 ! nonlinear interpolation using the van albeda limiter.
5717 ! loop over the number of variables to be interpolated.
5718  do l=1,nwint
5719  if (du2(l) .ge. 0.) then
5720  x1 = du2(l)
5721  call pushcontrol1b(0)
5722  else
5723  x1 = -du2(l)
5724  call pushcontrol1b(1)
5725  end if
5726  if (x1 .lt. epslim) then
5727  call pushreal8(max2)
5728  max2 = epslim
5729  call pushcontrol1b(0)
5730  else
5731  call pushreal8(max2)
5732  max2 = x1
5733  call pushcontrol1b(1)
5734  end if
5735 ! compute the limiter argument rl1, rl2, rr1 and rr2.
5736 ! note the cut off to 0.0.
5737  call pushreal8(tmp)
5738  tmp = one/sign(max2, du2(l))
5739  if (du1(l) .ge. 0.) then
5740  x3 = du1(l)
5741  call pushcontrol1b(0)
5742  else
5743  x3 = -du1(l)
5744  call pushcontrol1b(1)
5745  end if
5746  if (x3 .lt. epslim) then
5747  call pushreal8(max4)
5748  max4 = epslim
5749  call pushcontrol1b(0)
5750  else
5751  call pushreal8(max4)
5752  max4 = x3
5753  call pushcontrol1b(1)
5754  end if
5755  y1 = du2(l)/sign(max4, du1(l))
5756  if (zero .lt. y1) then
5757  call pushreal8(rl1)
5758  rl1 = y1
5759  call pushcontrol1b(0)
5760  else
5761  call pushreal8(rl1)
5762  rl1 = zero
5763  call pushcontrol1b(1)
5764  end if
5765  if (zero .lt. du1(l)*tmp) then
5766  call pushreal8(rl2)
5767  rl2 = du1(l)*tmp
5768  call pushcontrol1b(0)
5769  else
5770  call pushreal8(rl2)
5771  rl2 = zero
5772  call pushcontrol1b(1)
5773  end if
5774  if (zero .lt. du3(l)*tmp) then
5775  call pushreal8(rr1)
5776  rr1 = du3(l)*tmp
5777  call pushcontrol1b(0)
5778  else
5779  call pushreal8(rr1)
5780  rr1 = zero
5781  call pushcontrol1b(1)
5782  end if
5783  if (du3(l) .ge. 0.) then
5784  x4 = du3(l)
5785  call pushcontrol1b(0)
5786  else
5787  x4 = -du3(l)
5788  call pushcontrol1b(1)
5789  end if
5790  if (x4 .lt. epslim) then
5791  call pushreal8(max5)
5792  max5 = epslim
5793  call pushcontrol1b(0)
5794  else
5795  call pushreal8(max5)
5796  max5 = x4
5797  call pushcontrol1b(1)
5798  end if
5799  y2 = du2(l)/sign(max5, du3(l))
5800  if (zero .lt. y2) then
5801  call pushreal8(rr2)
5802  rr2 = y2
5803  call pushcontrol1b(0)
5804  else
5805  call pushreal8(rr2)
5806  rr2 = zero
5807  call pushcontrol1b(1)
5808  end if
5809 ! compute the corresponding limiter values.
5810  call pushreal8(rl1)
5811  rl1 = rl1*(rl1+one)/(rl1*rl1+one)
5812  call pushreal8(rl2)
5813  rl2 = rl2*(rl2+one)/(rl2*rl2+one)
5814  call pushreal8(rr1)
5815  rr1 = rr1*(rr1+one)/(rr1*rr1+one)
5816  call pushreal8(rr2)
5817  rr2 = rr2*(rr2+one)/(rr2*rr2+one)
5818 ! compute the nonlinear corrections to the first order
5819 ! scheme.
5820  end do
5821  call pushcontrol2b(2)
5822  case (minmod)
5823 ! ==============================================================
5824 ! nonlinear interpolation using the minmod limiter.
5825 ! loop over the number of variables to be interpolated.
5826  do l=1,nwint
5827  if (du2(l) .ge. 0.) then
5828  x2 = du2(l)
5829  call pushcontrol1b(0)
5830  else
5831  x2 = -du2(l)
5832  call pushcontrol1b(1)
5833  end if
5834  if (x2 .lt. epslim) then
5835  call pushreal8(max3)
5836  max3 = epslim
5837  call pushcontrol1b(0)
5838  else
5839  call pushreal8(max3)
5840  max3 = x2
5841  call pushcontrol1b(1)
5842  end if
5843 ! compute the limiter argument rl1, rl2, rr1 and rr2.
5844 ! note the cut off to 0.0.
5845  call pushreal8(tmp)
5846  tmp = one/sign(max3, du2(l))
5847  if (du1(l) .ge. 0.) then
5848  x5 = du1(l)
5849  call pushcontrol1b(0)
5850  else
5851  x5 = -du1(l)
5852  call pushcontrol1b(1)
5853  end if
5854  if (x5 .lt. epslim) then
5855  call pushreal8(max6)
5856  max6 = epslim
5857  call pushcontrol1b(0)
5858  else
5859  call pushreal8(max6)
5860  max6 = x5
5861  call pushcontrol1b(1)
5862  end if
5863  y3 = du2(l)/sign(max6, du1(l))
5864  if (zero .lt. y3) then
5865  call pushreal8(rl1)
5866  rl1 = y3
5867  call pushcontrol1b(0)
5868  else
5869  call pushreal8(rl1)
5870  rl1 = zero
5871  call pushcontrol1b(1)
5872  end if
5873  if (zero .lt. du1(l)*tmp) then
5874  call pushreal8(rl2)
5875  rl2 = du1(l)*tmp
5876  call pushcontrol1b(0)
5877  else
5878  call pushreal8(rl2)
5879  rl2 = zero
5880  call pushcontrol1b(1)
5881  end if
5882  if (zero .lt. du3(l)*tmp) then
5883  call pushreal8(rr1)
5884  rr1 = du3(l)*tmp
5885  call pushcontrol1b(0)
5886  else
5887  call pushreal8(rr1)
5888  rr1 = zero
5889  call pushcontrol1b(1)
5890  end if
5891  if (du3(l) .ge. 0.) then
5892  x6 = du3(l)
5893  call pushcontrol1b(0)
5894  else
5895  x6 = -du3(l)
5896  call pushcontrol1b(1)
5897  end if
5898  if (x6 .lt. epslim) then
5899  call pushreal8(max7)
5900  max7 = epslim
5901  call pushcontrol1b(0)
5902  else
5903  call pushreal8(max7)
5904  max7 = x6
5905  call pushcontrol1b(1)
5906  end if
5907  y4 = du2(l)/sign(max7, du3(l))
5908  if (zero .lt. y4) then
5909  call pushreal8(rr2)
5910  rr2 = y4
5911  call pushcontrol1b(0)
5912  else
5913  call pushreal8(rr2)
5914  rr2 = zero
5915  call pushcontrol1b(1)
5916  end if
5917  if (one .gt. factminmod*rl1) then
5918  rl1 = factminmod*rl1
5919  call pushcontrol1b(0)
5920  else
5921  rl1 = one
5922  call pushcontrol1b(1)
5923  end if
5924  if (one .gt. factminmod*rl2) then
5925  rl2 = factminmod*rl2
5926  call pushcontrol1b(0)
5927  else
5928  rl2 = one
5929  call pushcontrol1b(1)
5930  end if
5931  if (one .gt. factminmod*rr1) then
5932  rr1 = factminmod*rr1
5933  call pushcontrol1b(0)
5934  else
5935  rr1 = one
5936  call pushcontrol1b(1)
5937  end if
5938  if (one .gt. factminmod*rr2) then
5939  rr2 = factminmod*rr2
5940  call pushcontrol1b(0)
5941  else
5942  rr2 = one
5943  call pushcontrol1b(1)
5944  end if
5945  end do
5946  call pushcontrol2b(3)
5947  case default
5948  call pushcontrol2b(0)
5949  end select
5950 ! in case only a first order scheme must be used for the
5951 ! turbulent transport equations, set the correction for the
5952 ! turbulent kinetic energy to 0.
5953  if (firstorderk) then
5954  call pushcontrol1b(0)
5955  else
5956  call pushcontrol1b(1)
5957  end if
5958 ! for rotational periodic problems transform the velocity
5959 ! differences back to cartesian again. note that now the
5960 ! transpose of the rotation matrix must be used.
5961  if (rotationalperiodic) then
5962  dvxd = rot(1, 3)*rightd(ivz)
5963  dvyd = rot(2, 3)*rightd(ivz)
5964  dvzd = rot(3, 3)*rightd(ivz)
5965  rightd(ivz) = 0.0_8
5966  dvxd = dvxd + rot(1, 2)*rightd(ivy)
5967  dvyd = dvyd + rot(2, 2)*rightd(ivy)
5968  dvzd = dvzd + rot(3, 2)*rightd(ivy)
5969  rightd(ivy) = 0.0_8
5970  dvxd = dvxd + rot(1, 1)*rightd(ivx)
5971  dvyd = dvyd + rot(2, 1)*rightd(ivx)
5972  dvzd = dvzd + rot(3, 1)*rightd(ivx)
5973  rightd(ivx) = 0.0_8
5974  rightd(ivz) = rightd(ivz) + dvzd
5975  rightd(ivy) = rightd(ivy) + dvyd
5976  rightd(ivx) = rightd(ivx) + dvxd
5977  dvxd = rot(1, 3)*leftd(ivz)
5978  dvyd = rot(2, 3)*leftd(ivz)
5979  dvzd = rot(3, 3)*leftd(ivz)
5980  leftd(ivz) = 0.0_8
5981  dvxd = dvxd + rot(1, 2)*leftd(ivy)
5982  dvyd = dvyd + rot(2, 2)*leftd(ivy)
5983  dvzd = dvzd + rot(3, 2)*leftd(ivy)
5984  leftd(ivy) = 0.0_8
5985  dvxd = dvxd + rot(1, 1)*leftd(ivx)
5986  dvyd = dvyd + rot(2, 1)*leftd(ivx)
5987  dvzd = dvzd + rot(3, 1)*leftd(ivx)
5988  leftd(ivx) = 0.0_8
5989  leftd(ivz) = leftd(ivz) + dvzd
5990  leftd(ivy) = leftd(ivy) + dvyd
5991  leftd(ivx) = leftd(ivx) + dvxd
5992  end if
5993  call popcontrol1b(branch)
5994  if (branch .eq. 0) then
5995  rightd(itu1) = 0.0_8
5996  leftd(itu1) = 0.0_8
5997  end if
5998  call popcontrol2b(branch)
5999  if (branch .lt. 2) then
6000  if (branch .ne. 0) then
6001  do l=nwint,1,-1
6002  du3d(l) = du3d(l) - omk*rightd(l)
6003  du2d(l) = du2d(l) + opk*leftd(l) - opk*rightd(l)
6004  rightd(l) = 0.0_8
6005  du1d(l) = du1d(l) + omk*leftd(l)
6006  leftd(l) = 0.0_8
6007  end do
6008  end if
6009  else if (branch .eq. 2) then
6010  do l=nwint,1,-1
6011  rr1d = -(du2(l)*opk*rightd(l))
6012  du2d(l) = du2d(l) + rl2*opk*leftd(l) - rr1*opk*rightd(l)
6013  rr2d = -(du3(l)*omk*rightd(l))
6014  du3d(l) = du3d(l) - rr2*omk*rightd(l)
6015  rightd(l) = 0.0_8
6016  rl1d = du1(l)*omk*leftd(l)
6017  du1d(l) = du1d(l) + rl1*omk*leftd(l)
6018  rl2d = du2(l)*opk*leftd(l)
6019  leftd(l) = 0.0_8
6020  call popreal8(rr2)
6021  tempd = rr2d/(one+rr2**2)
6022  rr2d = (one+2*rr2-2*rr2**2*(one+rr2)/(one+rr2**2))*tempd
6023  call popreal8(rr1)
6024  tempd = rr1d/(one+rr1**2)
6025  rr1d = (one+2*rr1-2*rr1**2*(one+rr1)/(one+rr1**2))*tempd
6026  call popreal8(rl2)
6027  tempd = rl2d/(one+rl2**2)
6028  rl2d = (one+2*rl2-2*rl2**2*(one+rl2)/(one+rl2**2))*tempd
6029  call popreal8(rl1)
6030  tempd = rl1d/(one+rl1**2)
6031  rl1d = (one+2*rl1-2*rl1**2*(one+rl1)/(one+rl1**2))*tempd
6032  call popcontrol1b(branch)
6033  if (branch .eq. 0) then
6034  call popreal8(rr2)
6035  y2d = rr2d
6036  else
6037  call popreal8(rr2)
6038  y2d = 0.0_8
6039  end if
6040  temp = sign(max5, du3(l))
6041  du2d(l) = du2d(l) + y2d/temp
6042  tempd = -(du2(l)*y2d/temp**2)
6043  max5d = sign(1.d0, max5*du3(l))*tempd
6044  call popcontrol1b(branch)
6045  if (branch .eq. 0) then
6046  call popreal8(max5)
6047  x4d = 0.0_8
6048  else
6049  call popreal8(max5)
6050  x4d = max5d
6051  end if
6052  call popcontrol1b(branch)
6053  if (branch .eq. 0) then
6054  du3d(l) = du3d(l) + x4d
6055  else
6056  du3d(l) = du3d(l) - x4d
6057  end if
6058  call popcontrol1b(branch)
6059  if (branch .eq. 0) then
6060  call popreal8(rr1)
6061  du3d(l) = du3d(l) + tmp*rr1d
6062  tmpd = du3(l)*rr1d
6063  else
6064  call popreal8(rr1)
6065  tmpd = 0.0_8
6066  end if
6067  call popcontrol1b(branch)
6068  if (branch .eq. 0) then
6069  call popreal8(rl2)
6070  du1d(l) = du1d(l) + tmp*rl2d
6071  tmpd = tmpd + du1(l)*rl2d
6072  else
6073  call popreal8(rl2)
6074  end if
6075  call popcontrol1b(branch)
6076  if (branch .eq. 0) then
6077  call popreal8(rl1)
6078  y1d = rl1d
6079  else
6080  call popreal8(rl1)
6081  y1d = 0.0_8
6082  end if
6083  temp = sign(max4, du1(l))
6084  du2d(l) = du2d(l) + y1d/temp
6085  tempd = -(du2(l)*y1d/temp**2)
6086  max4d = sign(1.d0, max4*du1(l))*tempd
6087  call popcontrol1b(branch)
6088  if (branch .eq. 0) then
6089  call popreal8(max4)
6090  x3d = 0.0_8
6091  else
6092  call popreal8(max4)
6093  x3d = max4d
6094  end if
6095  call popcontrol1b(branch)
6096  if (branch .eq. 0) then
6097  du1d(l) = du1d(l) + x3d
6098  else
6099  du1d(l) = du1d(l) - x3d
6100  end if
6101  call popreal8(tmp)
6102  temp = sign(max2, du2(l))
6103  tempd = -(one*tmpd/temp**2)
6104  max2d = sign(1.d0, max2*du2(l))*tempd
6105  call popcontrol1b(branch)
6106  if (branch .eq. 0) then
6107  call popreal8(max2)
6108  x1d = 0.0_8
6109  else
6110  call popreal8(max2)
6111  x1d = max2d
6112  end if
6113  call popcontrol1b(branch)
6114  if (branch .eq. 0) then
6115  du2d(l) = du2d(l) + x1d
6116  else
6117  du2d(l) = du2d(l) - x1d
6118  end if
6119  end do
6120  else
6121  do l=nwint,1,-1
6122  rr1d = -(du2(l)*opk*rightd(l))
6123  du2d(l) = du2d(l) + rl2*opk*leftd(l) - rr1*opk*rightd(l)
6124  rr2d = -(du3(l)*omk*rightd(l))
6125  du3d(l) = du3d(l) - rr2*omk*rightd(l)
6126  rightd(l) = 0.0_8
6127  rl1d = du1(l)*omk*leftd(l)
6128  du1d(l) = du1d(l) + rl1*omk*leftd(l)
6129  rl2d = du2(l)*opk*leftd(l)
6130  leftd(l) = 0.0_8
6131  call popcontrol1b(branch)
6132  if (branch .eq. 0) then
6133  rr2d = factminmod*rr2d
6134  else
6135  rr2d = 0.0_8
6136  end if
6137  call popcontrol1b(branch)
6138  if (branch .eq. 0) then
6139  rr1d = factminmod*rr1d
6140  else
6141  rr1d = 0.0_8
6142  end if
6143  call popcontrol1b(branch)
6144  if (branch .eq. 0) then
6145  rl2d = factminmod*rl2d
6146  else
6147  rl2d = 0.0_8
6148  end if
6149  call popcontrol1b(branch)
6150  if (branch .eq. 0) then
6151  rl1d = factminmod*rl1d
6152  else
6153  rl1d = 0.0_8
6154  end if
6155  call popcontrol1b(branch)
6156  if (branch .eq. 0) then
6157  call popreal8(rr2)
6158  y4d = rr2d
6159  else
6160  call popreal8(rr2)
6161  y4d = 0.0_8
6162  end if
6163  temp = sign(max7, du3(l))
6164  du2d(l) = du2d(l) + y4d/temp
6165  tempd = -(du2(l)*y4d/temp**2)
6166  max7d = sign(1.d0, max7*du3(l))*tempd
6167  call popcontrol1b(branch)
6168  if (branch .eq. 0) then
6169  call popreal8(max7)
6170  x6d = 0.0_8
6171  else
6172  call popreal8(max7)
6173  x6d = max7d
6174  end if
6175  call popcontrol1b(branch)
6176  if (branch .eq. 0) then
6177  du3d(l) = du3d(l) + x6d
6178  else
6179  du3d(l) = du3d(l) - x6d
6180  end if
6181  call popcontrol1b(branch)
6182  if (branch .eq. 0) then
6183  call popreal8(rr1)
6184  du3d(l) = du3d(l) + tmp*rr1d
6185  tmpd = du3(l)*rr1d
6186  else
6187  call popreal8(rr1)
6188  tmpd = 0.0_8
6189  end if
6190  call popcontrol1b(branch)
6191  if (branch .eq. 0) then
6192  call popreal8(rl2)
6193  du1d(l) = du1d(l) + tmp*rl2d
6194  tmpd = tmpd + du1(l)*rl2d
6195  else
6196  call popreal8(rl2)
6197  end if
6198  call popcontrol1b(branch)
6199  if (branch .eq. 0) then
6200  call popreal8(rl1)
6201  y3d = rl1d
6202  else
6203  call popreal8(rl1)
6204  y3d = 0.0_8
6205  end if
6206  temp = sign(max6, du1(l))
6207  du2d(l) = du2d(l) + y3d/temp
6208  tempd = -(du2(l)*y3d/temp**2)
6209  max6d = sign(1.d0, max6*du1(l))*tempd
6210  call popcontrol1b(branch)
6211  if (branch .eq. 0) then
6212  call popreal8(max6)
6213  x5d = 0.0_8
6214  else
6215  call popreal8(max6)
6216  x5d = max6d
6217  end if
6218  call popcontrol1b(branch)
6219  if (branch .eq. 0) then
6220  du1d(l) = du1d(l) + x5d
6221  else
6222  du1d(l) = du1d(l) - x5d
6223  end if
6224  call popreal8(tmp)
6225  temp = sign(max3, du2(l))
6226  tempd = -(one*tmpd/temp**2)
6227  max3d = sign(1.d0, max3*du2(l))*tempd
6228  call popcontrol1b(branch)
6229  if (branch .eq. 0) then
6230  call popreal8(max3)
6231  x2d = 0.0_8
6232  else
6233  call popreal8(max3)
6234  x2d = max3d
6235  end if
6236  call popcontrol1b(branch)
6237  if (branch .eq. 0) then
6238  du2d(l) = du2d(l) + x2d
6239  else
6240  du2d(l) = du2d(l) - x2d
6241  end if
6242  end do
6243  end if
6244  call popcontrol1b(branch)
6245  if (branch .eq. 0) then
6246  dvxd = rot(3, 1)*du3d(ivz)
6247  dvyd = rot(3, 2)*du3d(ivz)
6248  dvzd = rot(3, 3)*du3d(ivz)
6249  du3d(ivz) = 0.0_8
6250  dvxd = dvxd + rot(2, 1)*du3d(ivy)
6251  dvyd = dvyd + rot(2, 2)*du3d(ivy)
6252  dvzd = dvzd + rot(2, 3)*du3d(ivy)
6253  du3d(ivy) = 0.0_8
6254  dvxd = dvxd + rot(1, 1)*du3d(ivx)
6255  dvyd = dvyd + rot(1, 2)*du3d(ivx)
6256  dvzd = dvzd + rot(1, 3)*du3d(ivx)
6257  du3d(ivx) = 0.0_8
6258  du3d(ivz) = du3d(ivz) + dvzd
6259  du3d(ivy) = du3d(ivy) + dvyd
6260  du3d(ivx) = du3d(ivx) + dvxd
6261  dvxd = rot(3, 1)*du2d(ivz)
6262  dvyd = rot(3, 2)*du2d(ivz)
6263  dvzd = rot(3, 3)*du2d(ivz)
6264  du2d(ivz) = 0.0_8
6265  dvxd = dvxd + rot(2, 1)*du2d(ivy)
6266  dvyd = dvyd + rot(2, 2)*du2d(ivy)
6267  dvzd = dvzd + rot(2, 3)*du2d(ivy)
6268  du2d(ivy) = 0.0_8
6269  dvxd = dvxd + rot(1, 1)*du2d(ivx)
6270  dvyd = dvyd + rot(1, 2)*du2d(ivx)
6271  dvzd = dvzd + rot(1, 3)*du2d(ivx)
6272  du2d(ivx) = 0.0_8
6273  du2d(ivz) = du2d(ivz) + dvzd
6274  du2d(ivy) = du2d(ivy) + dvyd
6275  du2d(ivx) = du2d(ivx) + dvxd
6276  dvxd = rot(3, 1)*du1d(ivz)
6277  dvyd = rot(3, 2)*du1d(ivz)
6278  dvzd = rot(3, 3)*du1d(ivz)
6279  du1d(ivz) = 0.0_8
6280  dvxd = dvxd + rot(2, 1)*du1d(ivy)
6281  dvyd = dvyd + rot(2, 2)*du1d(ivy)
6282  dvzd = dvzd + rot(2, 3)*du1d(ivy)
6283  du1d(ivy) = 0.0_8
6284  dvxd = dvxd + rot(1, 1)*du1d(ivx)
6285  dvyd = dvyd + rot(1, 2)*du1d(ivx)
6286  dvzd = dvzd + rot(1, 3)*du1d(ivx)
6287  du1d(ivx) = 0.0_8
6288  du1d(ivz) = du1d(ivz) + dvzd
6289  du1d(ivy) = du1d(ivy) + dvyd
6290  du1d(ivx) = du1d(ivx) + dvxd
6291  end if
6292  end subroutine leftrightstate_b
6293 
6294 ! ==================================================================
6295  subroutine leftrightstate(du1, du2, du3, rotmatrix, left, right)
6296  implicit none
6297 !
6298 ! local parameter.
6299 !
6300  real(kind=realtype), parameter :: epslim=1.e-10_realtype
6301 !
6302 ! subroutine arguments.
6303 !
6304  real(kind=realtype), dimension(:), intent(inout) :: du1, du2, du3
6305  real(kind=realtype), dimension(:), intent(out) :: left, right
6306  real(kind=realtype), dimension(:, :, :, :, :), pointer :: &
6307 & rotmatrix
6308 !
6309 ! local variables.
6310 !
6311  integer(kind=inttype) :: l
6312  real(kind=realtype) :: rl1, rl2, rr1, rr2, tmp, dvx, dvy, dvz
6313  real(kind=realtype), dimension(3, 3) :: rot
6314  intrinsic abs
6315  intrinsic max
6316  intrinsic sign
6317  intrinsic min
6318  real(kind=realtype) :: x1
6319  real(kind=realtype) :: y1
6320  real(kind=realtype) :: y2
6321  real(kind=realtype) :: x2
6322  real(kind=realtype) :: y3
6323  real(kind=realtype) :: y4
6324  real(kind=realtype) :: x3
6325  real(kind=realtype) :: x4
6326  real(kind=realtype) :: x5
6327  real(kind=realtype) :: x6
6328  real(kind=realtype) :: max2
6329  real(kind=realtype) :: max3
6330  real(kind=realtype) :: max4
6331  real(kind=realtype) :: max5
6332  real(kind=realtype) :: max6
6333  real(kind=realtype) :: max7
6334 ! check if the velocity components should be transformed to
6335 ! the cylindrical frame.
6336  if (rotationalperiodic) then
6337 ! store the rotation matrix a bit easier. note that the i,j,k
6338 ! come from the main subroutine.
6339  rot(1, 1) = rotmatrix(i, j, k, 1, 1)
6340  rot(1, 2) = rotmatrix(i, j, k, 1, 2)
6341  rot(1, 3) = rotmatrix(i, j, k, 1, 3)
6342  rot(2, 1) = rotmatrix(i, j, k, 2, 1)
6343  rot(2, 2) = rotmatrix(i, j, k, 2, 2)
6344  rot(2, 3) = rotmatrix(i, j, k, 2, 3)
6345  rot(3, 1) = rotmatrix(i, j, k, 3, 1)
6346  rot(3, 2) = rotmatrix(i, j, k, 3, 2)
6347  rot(3, 3) = rotmatrix(i, j, k, 3, 3)
6348 ! apply the transformation to the velocity components
6349 ! of du1, du2 and du3.
6350  dvx = du1(ivx)
6351  dvy = du1(ivy)
6352  dvz = du1(ivz)
6353  du1(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
6354  du1(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
6355  du1(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
6356  dvx = du2(ivx)
6357  dvy = du2(ivy)
6358  dvz = du2(ivz)
6359  du2(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
6360  du2(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
6361  du2(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
6362  dvx = du3(ivx)
6363  dvy = du3(ivy)
6364  dvz = du3(ivz)
6365  du3(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
6366  du3(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
6367  du3(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
6368  end if
6369 ! determine the limiter used.
6370  select case (limused)
6371  case (nolimiter)
6372 ! linear interpolation; no limiter.
6373 ! loop over the number of variables to be interpolated.
6374  do l=1,nwint
6375  left(l) = omk*du1(l) + opk*du2(l)
6376  right(l) = -(omk*du3(l)) - opk*du2(l)
6377  end do
6378  case (vanalbeda)
6379 ! ==============================================================
6380 ! nonlinear interpolation using the van albeda limiter.
6381 ! loop over the number of variables to be interpolated.
6382  do l=1,nwint
6383  if (du2(l) .ge. 0.) then
6384  x1 = du2(l)
6385  else
6386  x1 = -du2(l)
6387  end if
6388  if (x1 .lt. epslim) then
6389  max2 = epslim
6390  else
6391  max2 = x1
6392  end if
6393 ! compute the limiter argument rl1, rl2, rr1 and rr2.
6394 ! note the cut off to 0.0.
6395  tmp = one/sign(max2, du2(l))
6396  if (du1(l) .ge. 0.) then
6397  x3 = du1(l)
6398  else
6399  x3 = -du1(l)
6400  end if
6401  if (x3 .lt. epslim) then
6402  max4 = epslim
6403  else
6404  max4 = x3
6405  end if
6406  y1 = du2(l)/sign(max4, du1(l))
6407  if (zero .lt. y1) then
6408  rl1 = y1
6409  else
6410  rl1 = zero
6411  end if
6412  if (zero .lt. du1(l)*tmp) then
6413  rl2 = du1(l)*tmp
6414  else
6415  rl2 = zero
6416  end if
6417  if (zero .lt. du3(l)*tmp) then
6418  rr1 = du3(l)*tmp
6419  else
6420  rr1 = zero
6421  end if
6422  if (du3(l) .ge. 0.) then
6423  x4 = du3(l)
6424  else
6425  x4 = -du3(l)
6426  end if
6427  if (x4 .lt. epslim) then
6428  max5 = epslim
6429  else
6430  max5 = x4
6431  end if
6432  y2 = du2(l)/sign(max5, du3(l))
6433  if (zero .lt. y2) then
6434  rr2 = y2
6435  else
6436  rr2 = zero
6437  end if
6438 ! compute the corresponding limiter values.
6439  rl1 = rl1*(rl1+one)/(rl1*rl1+one)
6440  rl2 = rl2*(rl2+one)/(rl2*rl2+one)
6441  rr1 = rr1*(rr1+one)/(rr1*rr1+one)
6442  rr2 = rr2*(rr2+one)/(rr2*rr2+one)
6443 ! compute the nonlinear corrections to the first order
6444 ! scheme.
6445  left(l) = omk*rl1*du1(l) + opk*rl2*du2(l)
6446  right(l) = -(opk*rr1*du2(l)) - omk*rr2*du3(l)
6447  end do
6448  case (minmod)
6449 ! ==============================================================
6450 ! nonlinear interpolation using the minmod limiter.
6451 ! loop over the number of variables to be interpolated.
6452  do l=1,nwint
6453  if (du2(l) .ge. 0.) then
6454  x2 = du2(l)
6455  else
6456  x2 = -du2(l)
6457  end if
6458  if (x2 .lt. epslim) then
6459  max3 = epslim
6460  else
6461  max3 = x2
6462  end if
6463 ! compute the limiter argument rl1, rl2, rr1 and rr2.
6464 ! note the cut off to 0.0.
6465  tmp = one/sign(max3, du2(l))
6466  if (du1(l) .ge. 0.) then
6467  x5 = du1(l)
6468  else
6469  x5 = -du1(l)
6470  end if
6471  if (x5 .lt. epslim) then
6472  max6 = epslim
6473  else
6474  max6 = x5
6475  end if
6476  y3 = du2(l)/sign(max6, du1(l))
6477  if (zero .lt. y3) then
6478  rl1 = y3
6479  else
6480  rl1 = zero
6481  end if
6482  if (zero .lt. du1(l)*tmp) then
6483  rl2 = du1(l)*tmp
6484  else
6485  rl2 = zero
6486  end if
6487  if (zero .lt. du3(l)*tmp) then
6488  rr1 = du3(l)*tmp
6489  else
6490  rr1 = zero
6491  end if
6492  if (du3(l) .ge. 0.) then
6493  x6 = du3(l)
6494  else
6495  x6 = -du3(l)
6496  end if
6497  if (x6 .lt. epslim) then
6498  max7 = epslim
6499  else
6500  max7 = x6
6501  end if
6502  y4 = du2(l)/sign(max7, du3(l))
6503  if (zero .lt. y4) then
6504  rr2 = y4
6505  else
6506  rr2 = zero
6507  end if
6508  if (one .gt. factminmod*rl1) then
6509  rl1 = factminmod*rl1
6510  else
6511  rl1 = one
6512  end if
6513  if (one .gt. factminmod*rl2) then
6514  rl2 = factminmod*rl2
6515  else
6516  rl2 = one
6517  end if
6518  if (one .gt. factminmod*rr1) then
6519  rr1 = factminmod*rr1
6520  else
6521  rr1 = one
6522  end if
6523  if (one .gt. factminmod*rr2) then
6524  rr2 = factminmod*rr2
6525  else
6526  rr2 = one
6527  end if
6528 ! compute the nonlinear corrections to the first order
6529 ! scheme.
6530  left(l) = omk*rl1*du1(l) + opk*rl2*du2(l)
6531  right(l) = -(opk*rr1*du2(l)) - omk*rr2*du3(l)
6532  end do
6533  end select
6534 ! in case only a first order scheme must be used for the
6535 ! turbulent transport equations, set the correction for the
6536 ! turbulent kinetic energy to 0.
6537  if (firstorderk) then
6538  left(itu1) = zero
6539  right(itu1) = zero
6540  end if
6541 ! for rotational periodic problems transform the velocity
6542 ! differences back to cartesian again. note that now the
6543 ! transpose of the rotation matrix must be used.
6544  if (rotationalperiodic) then
6545 ! left state.
6546  dvx = left(ivx)
6547  dvy = left(ivy)
6548  dvz = left(ivz)
6549  left(ivx) = rot(1, 1)*dvx + rot(2, 1)*dvy + rot(3, 1)*dvz
6550  left(ivy) = rot(1, 2)*dvx + rot(2, 2)*dvy + rot(3, 2)*dvz
6551  left(ivz) = rot(1, 3)*dvx + rot(2, 3)*dvy + rot(3, 3)*dvz
6552 ! right state.
6553  dvx = right(ivx)
6554  dvy = right(ivy)
6555  dvz = right(ivz)
6556  right(ivx) = rot(1, 1)*dvx + rot(2, 1)*dvy + rot(3, 1)*dvz
6557  right(ivy) = rot(1, 2)*dvx + rot(2, 2)*dvy + rot(3, 2)*dvz
6558  right(ivz) = rot(1, 3)*dvx + rot(2, 3)*dvy + rot(3, 3)*dvz
6559  end if
6560  end subroutine leftrightstate
6561 
6562 ! differentiation of riemannflux in reverse (adjoint) mode (with options noisize i4 dr8 r8):
6563 ! gradient of useful results: sface flux left right
6564 ! with respect to varying inputs: sface sx sy sz flux left right
6565 ! ================================================================
6566  subroutine riemannflux_b(left, leftd, right, rightd, flux, fluxd)
6567  implicit none
6568 !
6569 ! subroutine arguments.
6570 !
6571  real(kind=realtype), dimension(*), intent(in) :: left, right
6572  real(kind=realtype), dimension(*) :: leftd, rightd
6573  real(kind=realtype), dimension(*) :: flux
6574  real(kind=realtype), dimension(*) :: fluxd
6575 !
6576 ! local variables.
6577 !
6578  real(kind=realtype) :: porflux, rface
6579  real(kind=realtype) :: rfaced
6580  real(kind=realtype) :: etl, etr, z1l, z1r, tmp
6581  real(kind=realtype) :: etld, etrd, z1ld, z1rd, tmpd
6582  real(kind=realtype) :: dr, dru, drv, drw, dre, drk
6583  real(kind=realtype) :: drd, drud, drvd, drwd, dred, drkd
6584  real(kind=realtype) :: ravg, uavg, vavg, wavg, havg, kavg
6585  real(kind=realtype) :: uavgd, vavgd, wavgd, havgd, kavgd
6586  real(kind=realtype) :: alphaavg, a2avg, aavg, unavg
6587  real(kind=realtype) :: alphaavgd, a2avgd, aavgd, unavgd
6588  real(kind=realtype) :: ovaavg, ova2avg, area, eta
6589  real(kind=realtype) :: ovaavgd, ova2avgd, aread, etad
6590  real(kind=realtype) :: gm1, gm53
6591  real(kind=realtype) :: lam1, lam2, lam3
6592  real(kind=realtype) :: lam1d, lam2d, lam3d
6593  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
6594  real(kind=realtype) :: abv1d, abv2d, abv3d, abv4d, abv5d, abv6d, &
6595 & abv7d
6596  real(kind=realtype), dimension(2) :: ktmp
6597  real(kind=realtype), dimension(2) :: ktmpd
6598  intrinsic sqrt
6599  intrinsic max
6600  intrinsic abs
6601  real(kind=realtype) :: x1
6602  real(kind=realtype) :: x1d
6603  real(kind=realtype) :: x2
6604  real(kind=realtype) :: x2d
6605  real(realtype) :: max2
6606  real(realtype) :: max2d
6607  real(kind=realtype) :: abs1
6608  real(kind=realtype) :: abs1d
6609  real(kind=realtype) :: abs2
6610  real(kind=realtype) :: abs2d
6611  real(kind=realtype) :: temp
6612  real(kind=realtype) :: tempd
6613  real(kind=realtype) :: temp0
6614  real(kind=realtype) :: temp1
6615  real(kind=realtype) :: tempd0
6616  real(kind=realtype) :: tempd1
6617  integer :: branch
6618 ! set the porosity for the flux. the default value, 0.5*rfil, is
6619 ! a scaling factor where an rfil != 1 is taken into account.
6620  porflux = half*rfil
6621  if (por .eq. noflux .or. por .eq. boundflux) porflux = zero
6622 ! abbreviate some expressions in which gamma occurs.
6623  gm1 = gammaface - one
6624  gm53 = gammaface - five*third
6625 ! determine which riemann solver must be solved.
6626  select case (riemannused)
6627  case (roe)
6628 ! determine the preconditioner used.
6629  select case (precond)
6630  case (noprecond)
6631 ! no preconditioner used. use the roe scheme of the
6632 ! standard equations.
6633 ! compute the square root of the left and right densities
6634 ! and the inverse of the sum.
6635  z1l = sqrt(left(irho))
6636  z1r = sqrt(right(irho))
6637  tmp = one/(z1l+z1r)
6638 ! compute some variables depending whether or not a
6639 ! k-equation is present.
6640  if (correctfork) then
6641 ! store the left and right kinetic energy in ktmp,
6642 ! which is needed to compute the total energy.
6643  ktmp(1) = left(itu1)
6644  ktmp(2) = right(itu1)
6645 ! store the difference of the turbulent kinetic energy
6646 ! per unit volume, i.e. the conserved variable.
6647  drk = right(irho)*right(itu1) - left(irho)*left(itu1)
6648 ! compute the average turbulent energy per unit mass
6649 ! using roe averages.
6650  kavg = tmp*(z1l*left(itu1)+z1r*right(itu1))
6651  call pushcontrol1b(1)
6652  else
6653  call pushcontrol1b(0)
6654 ! set the difference of the turbulent kinetic energy
6655 ! per unit volume and the averaged kinetic energy per
6656 ! unit mass to zero.
6657  drk = 0.0
6658  kavg = 0.0
6659  end if
6660 ! compute the total energy of the left and right state.
6661  call pushreal8(etl)
6662  call etot(left(irho), left(ivx), left(ivy), left(ivz), left(&
6663 & irhoe), ktmp(1), etl, correctfork)
6664  call pushreal8(etr)
6665  call etot(right(irho), right(ivx), right(ivy), right(ivz), &
6666 & right(irhoe), ktmp(2), etr, correctfork)
6667 ! compute the difference of the conservative mean
6668 ! flow variables.
6669  dr = right(irho) - left(irho)
6670  dru = right(irho)*right(ivx) - left(irho)*left(ivx)
6671  drv = right(irho)*right(ivy) - left(irho)*left(ivy)
6672  drw = right(irho)*right(ivz) - left(irho)*left(ivz)
6673  dre = etr - etl
6674 ! compute the roe average variables, which can be
6675 ! computed directly from the average roe vector.
6676  uavg = tmp*(z1l*left(ivx)+z1r*right(ivx))
6677  vavg = tmp*(z1l*left(ivy)+z1r*right(ivy))
6678  wavg = tmp*(z1l*left(ivz)+z1r*right(ivz))
6679  havg = tmp*((etl+left(irhoe))/z1l+(etr+right(irhoe))/z1r)
6680 ! compute the unit vector and store the area of the
6681 ! normal. also compute the unit normal velocity of the face.
6682  area = sqrt(sx**2 + sy**2 + sz**2)
6683  if (1.e-25_realtype .lt. area) then
6684  max2 = area
6685  call pushcontrol1b(0)
6686  else
6687  call pushcontrol1b(1)
6688  max2 = 1.e-25_realtype
6689  end if
6690  tmp = one/max2
6691  call pushreal8(sx)
6692  sx = sx*tmp
6693  call pushreal8(sy)
6694  sy = sy*tmp
6695  call pushreal8(sz)
6696  sz = sz*tmp
6697  rface = sface*tmp
6698 ! compute some dependent variables at the roe
6699 ! average state.
6700  alphaavg = half*(uavg**2+vavg**2+wavg**2)
6701  if (gm1*(havg-alphaavg) - gm53*kavg .ge. 0.) then
6702  a2avg = gm1*(havg-alphaavg) - gm53*kavg
6703  call pushcontrol1b(0)
6704  else
6705  a2avg = -(gm1*(havg-alphaavg)-gm53*kavg)
6706  call pushcontrol1b(1)
6707  end if
6708  aavg = sqrt(a2avg)
6709  unavg = uavg*sx + vavg*sy + wavg*sz
6710  ovaavg = one/aavg
6711  ova2avg = one/a2avg
6712 ! set for a boundary the normal velocity to rface, the
6713 ! normal velocity of the boundary.
6714  if (por .eq. boundflux) then
6715  unavg = rface
6716  call pushcontrol1b(1)
6717  else
6718  call pushcontrol1b(0)
6719  end if
6720  x1 = (left(ivx)-right(ivx))*sx + (left(ivy)-right(ivy))*sy + (&
6721 & left(ivz)-right(ivz))*sz
6722  if (x1 .ge. 0.) then
6723  abs1 = x1
6724  call pushcontrol1b(1)
6725  else
6726  abs1 = -x1
6727  call pushcontrol1b(0)
6728  end if
6729  x2 = sqrt(gammaface*left(irhoe)/left(irho)) - sqrt(gammaface*&
6730 & right(irhoe)/right(irho))
6731  if (x2 .ge. 0.) then
6732  abs2 = x2
6733  call pushcontrol1b(0)
6734  else
6735  abs2 = -x2
6736  call pushcontrol1b(1)
6737  end if
6738 ! compute the coefficient eta for the entropy correction.
6739 ! at the moment a 1d entropy correction is used, which
6740 ! removes expansion shocks. although it also reduces the
6741 ! carbuncle phenomenon, it does not remove it completely.
6742 ! in other to do that a multi-dimensional entropy fix is
6743 ! needed, see sanders et. al, jcp, vol. 145, 1998,
6744 ! pp. 511 - 537. although relatively easy to implement,
6745 ! an efficient implementation requires the storage of
6746 ! all the left and right states, which is rather
6747 ! expensive in terms of memory.
6748  eta = half*(abs1+abs2)
6749  if (unavg - rface + aavg .ge. 0.) then
6750  lam1 = unavg - rface + aavg
6751  call pushcontrol1b(0)
6752  else
6753  lam1 = -(unavg-rface+aavg)
6754  call pushcontrol1b(1)
6755  end if
6756  if (unavg - rface - aavg .ge. 0.) then
6757  lam2 = unavg - rface - aavg
6758  call pushcontrol1b(0)
6759  else
6760  lam2 = -(unavg-rface-aavg)
6761  call pushcontrol1b(1)
6762  end if
6763  if (unavg - rface .ge. 0.) then
6764  lam3 = unavg - rface
6765  call pushcontrol1b(0)
6766  else
6767  lam3 = -(unavg-rface)
6768  call pushcontrol1b(1)
6769  end if
6770 ! apply the entropy correction to the eigenvalues.
6771  tmp = two*eta
6772  if (lam1 .lt. tmp) then
6773  call pushreal8(lam1)
6774  lam1 = eta + fourth*lam1*lam1/eta
6775  call pushcontrol1b(0)
6776  else
6777  call pushcontrol1b(1)
6778  end if
6779  if (lam2 .lt. tmp) then
6780  call pushreal8(lam2)
6781  lam2 = eta + fourth*lam2*lam2/eta
6782  call pushcontrol1b(0)
6783  else
6784  call pushcontrol1b(1)
6785  end if
6786  if (lam3 .lt. tmp) then
6787  call pushreal8(lam3)
6788  lam3 = eta + fourth*lam3*lam3/eta
6789  call pushcontrol1b(0)
6790  else
6791  call pushcontrol1b(1)
6792  end if
6793 ! multiply the eigenvalues by the area to obtain
6794 ! the correct values for the dissipation term.
6795  call pushreal8(lam1)
6796  lam1 = lam1*area
6797  call pushreal8(lam2)
6798  lam2 = lam2*area
6799  call pushreal8(lam3)
6800  lam3 = lam3*area
6801 ! some abbreviations, which occur quite often in the
6802 ! dissipation terms.
6803  abv1 = half*(lam1+lam2)
6804  abv2 = half*(lam1-lam2)
6805  abv3 = abv1 - lam3
6806  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53&
6807 & *drk
6808  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
6809  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
6810  abv7 = abv2*abv4*ovaavg + abv3*abv5
6811 ! compute the dissipation term, -|a| (wr - wl), which is
6812 ! multiplied by porflux. note that porflux is either
6813 ! 0.0 or 0.5*rfil.
6814 ! tmp = max(lam1,lam2,lam3)
6815 ! flux(irho) = -porflux*(tmp*dr)
6816 ! flux(imx) = -porflux*(tmp*dru)
6817 ! flux(imy) = -porflux*(tmp*drv)
6818 ! flux(imz) = -porflux*(tmp*drw)
6819 ! flux(irhoe) = -porflux*(tmp*dre)
6820  tempd0 = -(porflux*fluxd(irhoe))
6821  fluxd(irhoe) = 0.0_8
6822  lam3d = dre*tempd0
6823  dred = lam3*tempd0
6824  havgd = abv6*tempd0
6825  abv6d = havg*tempd0
6826  unavgd = abv7*tempd0
6827  abv7d = unavg*tempd0
6828  tempd0 = -(porflux*fluxd(imz))
6829  fluxd(imz) = 0.0_8
6830  lam3d = lam3d + drw*tempd0
6831  drwd = lam3*tempd0
6832  wavgd = abv6*tempd0
6833  abv6d = abv6d + wavg*tempd0
6834  szd = abv7*tempd0
6835  abv7d = abv7d + sz*tempd0
6836  tempd0 = -(porflux*fluxd(imy))
6837  fluxd(imy) = 0.0_8
6838  lam3d = lam3d + drv*tempd0
6839  drvd = lam3*tempd0
6840  vavgd = abv6*tempd0
6841  abv6d = abv6d + vavg*tempd0
6842  syd = abv7*tempd0
6843  abv7d = abv7d + sy*tempd0
6844  tempd0 = -(porflux*fluxd(imx))
6845  fluxd(imx) = 0.0_8
6846  lam3d = lam3d + dru*tempd0
6847  drud = lam3*tempd0
6848  uavgd = abv6*tempd0
6849  abv6d = abv6d + uavg*tempd0
6850  sxd = abv7*tempd0
6851  abv7d = abv7d + sx*tempd0
6852  tempd0 = -(porflux*fluxd(irho))
6853  fluxd(irho) = 0.0_8
6854  drd = lam3*tempd0
6855  abv6d = abv6d + tempd0
6856  abv2d = abv4*ovaavg*abv7d + abv5*ovaavg*abv6d
6857  abv4d = abv2*ovaavg*abv7d + abv3*ova2avg*abv6d
6858  ovaavgd = abv2*abv4*abv7d + abv2*abv5*abv6d
6859  abv3d = abv5*abv7d + abv4*ova2avg*abv6d
6860  lam3d = lam3d + dr*tempd0 - abv3d
6861  abv5d = abv3*abv7d + abv2*ovaavg*abv6d
6862  ova2avgd = abv3*abv4*abv6d
6863  sxd = sxd + dru*abv5d
6864  syd = syd + drv*abv5d
6865  szd = szd + drw*abv5d
6866  unavgd = unavgd - dr*abv5d
6867  tempd0 = gm1*abv4d
6868  drud = drud + sx*abv5d - uavg*tempd0
6869  drvd = drvd + sy*abv5d - vavg*tempd0
6870  drwd = drwd + sz*abv5d - wavg*tempd0
6871  drd = drd + alphaavg*tempd0 - unavg*abv5d
6872  drkd = -(gm53*abv4d)
6873  alphaavgd = dr*tempd0
6874  uavgd = uavgd - dru*tempd0
6875  vavgd = vavgd - drv*tempd0
6876  dred = dred + tempd0
6877  wavgd = wavgd - drw*tempd0
6878  abv1d = abv3d
6879  lam1d = half*abv2d + half*abv1d
6880  lam2d = half*abv1d - half*abv2d
6881  call popreal8(lam3)
6882  call popreal8(lam2)
6883  call popreal8(lam1)
6884  aread = lam3*lam3d + lam2*lam2d + lam1*lam1d
6885  lam3d = area*lam3d
6886  lam2d = area*lam2d
6887  lam1d = area*lam1d
6888  call popcontrol1b(branch)
6889  if (branch .eq. 0) then
6890  tempd0 = fourth*lam3d/eta
6891  call popreal8(lam3)
6892  etad = lam3d - lam3**2*tempd0/eta
6893  lam3d = 2*lam3*tempd0
6894  else
6895  etad = 0.0_8
6896  end if
6897  call popcontrol1b(branch)
6898  if (branch .eq. 0) then
6899  tempd0 = fourth*lam2d/eta
6900  call popreal8(lam2)
6901  etad = etad + lam2d - lam2**2*tempd0/eta
6902  lam2d = 2*lam2*tempd0
6903  end if
6904  call popcontrol1b(branch)
6905  if (branch .eq. 0) then
6906  tempd0 = fourth*lam1d/eta
6907  call popreal8(lam1)
6908  etad = etad + lam1d - lam1**2*tempd0/eta
6909  lam1d = 2*lam1*tempd0
6910  end if
6911  tmp = one/max2
6912  call popcontrol1b(branch)
6913  if (branch .eq. 0) then
6914  unavgd = unavgd + lam3d
6915  rfaced = -lam3d
6916  else
6917  rfaced = lam3d
6918  unavgd = unavgd - lam3d
6919  end if
6920  call popcontrol1b(branch)
6921  if (branch .eq. 0) then
6922  unavgd = unavgd + lam2d
6923  rfaced = rfaced - lam2d
6924  aavgd = -lam2d
6925  else
6926  rfaced = rfaced + lam2d
6927  unavgd = unavgd - lam2d
6928  aavgd = lam2d
6929  end if
6930  call popcontrol1b(branch)
6931  if (branch .eq. 0) then
6932  unavgd = unavgd + lam1d
6933  rfaced = rfaced - lam1d
6934  aavgd = aavgd + lam1d
6935  else
6936  rfaced = rfaced + lam1d
6937  unavgd = unavgd - lam1d
6938  aavgd = aavgd - lam1d
6939  end if
6940  abs1d = half*etad
6941  abs2d = half*etad
6942  call popcontrol1b(branch)
6943  if (branch .eq. 0) then
6944  x2d = abs2d
6945  else
6946  x2d = -abs2d
6947  end if
6948  temp1 = left(irhoe)/left(irho)
6949  temp0 = right(irhoe)/right(irho)
6950  if (gammaface*temp1 .eq. 0.0_8) then
6951  tempd0 = 0.0_8
6952  else
6953  tempd0 = gammaface*x2d/(left(irho)*2.0*sqrt(gammaface*temp1)&
6954 & )
6955  end if
6956  if (gammaface*temp0 .eq. 0.0_8) then
6957  tempd1 = 0.0_8
6958  else
6959  tempd1 = -(gammaface*x2d/(right(irho)*2.0*sqrt(gammaface*&
6960 & temp0)))
6961  end if
6962  rightd(irhoe) = rightd(irhoe) + tempd1
6963  rightd(irho) = rightd(irho) - temp0*tempd1
6964  leftd(irhoe) = leftd(irhoe) + tempd0
6965  leftd(irho) = leftd(irho) - temp1*tempd0
6966  call popcontrol1b(branch)
6967  if (branch .eq. 0) then
6968  x1d = -abs1d
6969  else
6970  x1d = abs1d
6971  end if
6972  leftd(ivx) = leftd(ivx) + sx*x1d
6973  rightd(ivx) = rightd(ivx) - sx*x1d
6974  sxd = sxd + (left(ivx)-right(ivx))*x1d
6975  leftd(ivy) = leftd(ivy) + sy*x1d
6976  rightd(ivy) = rightd(ivy) - sy*x1d
6977  syd = syd + (left(ivy)-right(ivy))*x1d
6978  leftd(ivz) = leftd(ivz) + sz*x1d
6979  rightd(ivz) = rightd(ivz) - sz*x1d
6980  szd = szd + (left(ivz)-right(ivz))*x1d
6981  call popcontrol1b(branch)
6982  if (branch .ne. 0) then
6983  rfaced = rfaced + unavgd
6984  unavgd = 0.0_8
6985  end if
6986  aavgd = aavgd - one*ovaavgd/aavg**2
6987  if (a2avg .eq. 0.0_8) then
6988  a2avgd = -(one*ova2avgd/a2avg**2)
6989  else
6990  a2avgd = aavgd/(2.0*sqrt(a2avg)) - one*ova2avgd/a2avg**2
6991  end if
6992  uavgd = uavgd + sx*unavgd
6993  sxd = sxd + uavg*unavgd
6994  vavgd = vavgd + sy*unavgd
6995  syd = syd + vavg*unavgd
6996  wavgd = wavgd + sz*unavgd
6997  szd = szd + wavg*unavgd
6998  call popcontrol1b(branch)
6999  if (branch .eq. 0) then
7000  havgd = havgd + gm1*a2avgd
7001  alphaavgd = alphaavgd - gm1*a2avgd
7002  kavgd = -(gm53*a2avgd)
7003  else
7004  kavgd = gm53*a2avgd
7005  havgd = havgd - gm1*a2avgd
7006  alphaavgd = alphaavgd + gm1*a2avgd
7007  end if
7008  call popreal8(sz)
7009  call popreal8(sy)
7010  call popreal8(sx)
7011  tempd0 = half*alphaavgd
7012  uavgd = uavgd + 2*uavg*tempd0
7013  vavgd = vavgd + 2*vavg*tempd0
7014  wavgd = wavgd + 2*wavg*tempd0
7015  sfaced = sfaced + tmp*rfaced
7016  tmpd = sface*rfaced + sz*szd + sy*syd + sx*sxd
7017  szd = tmp*szd
7018  syd = tmp*syd
7019  sxd = tmp*sxd
7020  max2d = -(one*tmpd/max2**2)
7021  tmp = one/(z1l+z1r)
7022  call popcontrol1b(branch)
7023  if (branch .eq. 0) aread = aread + max2d
7024  if (sx**2 + sy**2 + sz**2 .eq. 0.0_8) then
7025  tempd0 = 0.0_8
7026  else
7027  tempd0 = aread/(2.0*sqrt(sx**2+sy**2+sz**2))
7028  end if
7029  sxd = sxd + 2*sx*tempd0
7030  syd = syd + 2*sy*tempd0
7031  szd = szd + 2*sz*tempd0
7032  temp = (etr+right(irhoe))/z1r
7033  temp0 = (etl+left(irhoe))/z1l
7034  tmpd = (temp0+temp)*havgd + (z1l*left(ivz)+z1r*right(ivz))*&
7035 & wavgd + (z1l*left(ivy)+z1r*right(ivy))*vavgd + (z1l*left(ivx&
7036 & )+z1r*right(ivx))*uavgd
7037  tempd0 = tmp*havgd
7038  tempd1 = tempd0/z1l
7039  tempd = tempd0/z1r
7040  etrd = tempd + dred
7041  rightd(irhoe) = rightd(irhoe) + tempd
7042  z1rd = -(temp*tempd)
7043  etld = tempd1 - dred
7044  leftd(irhoe) = leftd(irhoe) + tempd1
7045  tempd = tmp*wavgd
7046  z1ld = left(ivz)*tempd - temp0*tempd1
7047  leftd(ivz) = leftd(ivz) + z1l*tempd
7048  z1rd = z1rd + right(ivz)*tempd
7049  rightd(ivz) = rightd(ivz) + z1r*tempd
7050  tempd = tmp*vavgd
7051  z1ld = z1ld + left(ivy)*tempd
7052  leftd(ivy) = leftd(ivy) + z1l*tempd
7053  z1rd = z1rd + right(ivy)*tempd
7054  rightd(ivy) = rightd(ivy) + z1r*tempd
7055  tempd = tmp*uavgd
7056  z1ld = z1ld + left(ivx)*tempd
7057  leftd(ivx) = leftd(ivx) + z1l*tempd
7058  z1rd = z1rd + right(ivx)*tempd
7059  rightd(ivx) = rightd(ivx) + z1r*tempd
7060  rightd(irho) = rightd(irho) + right(ivz)*drwd
7061  rightd(ivz) = rightd(ivz) + right(irho)*drwd
7062  leftd(irho) = leftd(irho) - left(ivz)*drwd
7063  leftd(ivz) = leftd(ivz) - left(irho)*drwd
7064  rightd(irho) = rightd(irho) + right(ivy)*drvd
7065  rightd(ivy) = rightd(ivy) + right(irho)*drvd
7066  leftd(irho) = leftd(irho) - left(ivy)*drvd
7067  leftd(ivy) = leftd(ivy) - left(irho)*drvd
7068  rightd(irho) = rightd(irho) + right(ivx)*drud
7069  rightd(ivx) = rightd(ivx) + right(irho)*drud
7070  leftd(irho) = leftd(irho) - left(ivx)*drud
7071  leftd(ivx) = leftd(ivx) - left(irho)*drud
7072  rightd(irho) = rightd(irho) + drd
7073  leftd(irho) = leftd(irho) - drd
7074  call popreal8(etr)
7075  ktmpd = 0.0_8
7076  call etot_b(right(irho), rightd(irho), right(ivx), rightd(ivx)&
7077 & , right(ivy), rightd(ivy), right(ivz), rightd(ivz), &
7078 & right(irhoe), rightd(irhoe), ktmp(2), ktmpd(2), etr, &
7079 & etrd, correctfork)
7080  call popreal8(etl)
7081  call etot_b(left(irho), leftd(irho), left(ivx), leftd(ivx), &
7082 & left(ivy), leftd(ivy), left(ivz), leftd(ivz), left(irhoe&
7083 & ), leftd(irhoe), ktmp(1), ktmpd(1), etl, etld, &
7084 & correctfork)
7085  call popcontrol1b(branch)
7086  if (branch .ne. 0) then
7087  tmpd = tmpd + (z1l*left(itu1)+z1r*right(itu1))*kavgd
7088  tempd = tmp*kavgd
7089  z1ld = z1ld + left(itu1)*tempd
7090  leftd(itu1) = leftd(itu1) + z1l*tempd
7091  z1rd = z1rd + right(itu1)*tempd
7092  rightd(itu1) = rightd(itu1) + z1r*tempd
7093  rightd(irho) = rightd(irho) + right(itu1)*drkd
7094  rightd(itu1) = rightd(itu1) + right(irho)*drkd + ktmpd(2)
7095  leftd(irho) = leftd(irho) - left(itu1)*drkd
7096  leftd(itu1) = leftd(itu1) + ktmpd(1) - left(irho)*drkd
7097  ktmpd(2) = 0.0_8
7098  end if
7099  tempd = -(one*tmpd/(z1l+z1r)**2)
7100  z1ld = z1ld + tempd
7101  z1rd = z1rd + tempd
7102  if (.not.right(irho) .eq. 0.0_8) rightd(irho) = rightd(irho) +&
7103 & z1rd/(2.0*sqrt(right(irho)))
7104  if (.not.left(irho) .eq. 0.0_8) leftd(irho) = leftd(irho) + &
7105 & z1ld/(2.0*sqrt(left(irho)))
7106  case (turkel)
7107  sxd = 0.0_8
7108  syd = 0.0_8
7109  szd = 0.0_8
7110  case (choimerkle)
7111  sxd = 0.0_8
7112  syd = 0.0_8
7113  szd = 0.0_8
7114  case default
7115  sxd = 0.0_8
7116  syd = 0.0_8
7117  szd = 0.0_8
7118  end select
7119  case (vanleer)
7120  sxd = 0.0_8
7121  syd = 0.0_8
7122  szd = 0.0_8
7123  case (ausmdv)
7124  sxd = 0.0_8
7125  syd = 0.0_8
7126  szd = 0.0_8
7127  case default
7128  sxd = 0.0_8
7129  syd = 0.0_8
7130  szd = 0.0_8
7131  end select
7132  end subroutine riemannflux_b
7133 
7134 ! ================================================================
7135  subroutine riemannflux(left, right, flux)
7136  implicit none
7137 !
7138 ! subroutine arguments.
7139 !
7140  real(kind=realtype), dimension(*), intent(in) :: left, right
7141  real(kind=realtype), dimension(*), intent(out) :: flux
7142 !
7143 ! local variables.
7144 !
7145  real(kind=realtype) :: porflux, rface
7146  real(kind=realtype) :: etl, etr, z1l, z1r, tmp
7147  real(kind=realtype) :: dr, dru, drv, drw, dre, drk
7148  real(kind=realtype) :: ravg, uavg, vavg, wavg, havg, kavg
7149  real(kind=realtype) :: alphaavg, a2avg, aavg, unavg
7150  real(kind=realtype) :: ovaavg, ova2avg, area, eta
7151  real(kind=realtype) :: gm1, gm53
7152  real(kind=realtype) :: lam1, lam2, lam3
7153  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
7154  real(kind=realtype), dimension(2) :: ktmp
7155  intrinsic sqrt
7156  intrinsic max
7157  intrinsic abs
7158  real(kind=realtype) :: x1
7159  real(kind=realtype) :: x2
7160  real(realtype) :: max2
7161  real(kind=realtype) :: abs1
7162  real(kind=realtype) :: abs2
7163 ! set the porosity for the flux. the default value, 0.5*rfil, is
7164 ! a scaling factor where an rfil != 1 is taken into account.
7165  porflux = half*rfil
7166  if (por .eq. noflux .or. por .eq. boundflux) porflux = zero
7167 ! abbreviate some expressions in which gamma occurs.
7168  gm1 = gammaface - one
7169  gm53 = gammaface - five*third
7170 ! determine which riemann solver must be solved.
7171  select case (riemannused)
7172  case (roe)
7173 ! determine the preconditioner used.
7174  select case (precond)
7175  case (noprecond)
7176 ! no preconditioner used. use the roe scheme of the
7177 ! standard equations.
7178 ! compute the square root of the left and right densities
7179 ! and the inverse of the sum.
7180  z1l = sqrt(left(irho))
7181  z1r = sqrt(right(irho))
7182  tmp = one/(z1l+z1r)
7183 ! compute some variables depending whether or not a
7184 ! k-equation is present.
7185  if (correctfork) then
7186 ! store the left and right kinetic energy in ktmp,
7187 ! which is needed to compute the total energy.
7188  ktmp(1) = left(itu1)
7189  ktmp(2) = right(itu1)
7190 ! store the difference of the turbulent kinetic energy
7191 ! per unit volume, i.e. the conserved variable.
7192  drk = right(irho)*right(itu1) - left(irho)*left(itu1)
7193 ! compute the average turbulent energy per unit mass
7194 ! using roe averages.
7195  kavg = tmp*(z1l*left(itu1)+z1r*right(itu1))
7196  else
7197 ! set the difference of the turbulent kinetic energy
7198 ! per unit volume and the averaged kinetic energy per
7199 ! unit mass to zero.
7200  drk = 0.0
7201  kavg = 0.0
7202  end if
7203 ! compute the total energy of the left and right state.
7204  call etot(left(irho), left(ivx), left(ivy), left(ivz), left(&
7205 & irhoe), ktmp(1), etl, correctfork)
7206  call etot(right(irho), right(ivx), right(ivy), right(ivz), &
7207 & right(irhoe), ktmp(2), etr, correctfork)
7208 ! compute the difference of the conservative mean
7209 ! flow variables.
7210  dr = right(irho) - left(irho)
7211  dru = right(irho)*right(ivx) - left(irho)*left(ivx)
7212  drv = right(irho)*right(ivy) - left(irho)*left(ivy)
7213  drw = right(irho)*right(ivz) - left(irho)*left(ivz)
7214  dre = etr - etl
7215 ! compute the roe average variables, which can be
7216 ! computed directly from the average roe vector.
7217  ravg = fourth*(z1r+z1l)**2
7218  uavg = tmp*(z1l*left(ivx)+z1r*right(ivx))
7219  vavg = tmp*(z1l*left(ivy)+z1r*right(ivy))
7220  wavg = tmp*(z1l*left(ivz)+z1r*right(ivz))
7221  havg = tmp*((etl+left(irhoe))/z1l+(etr+right(irhoe))/z1r)
7222 ! compute the unit vector and store the area of the
7223 ! normal. also compute the unit normal velocity of the face.
7224  area = sqrt(sx**2 + sy**2 + sz**2)
7225  if (1.e-25_realtype .lt. area) then
7226  max2 = area
7227  else
7228  max2 = 1.e-25_realtype
7229  end if
7230  tmp = one/max2
7231  sx = sx*tmp
7232  sy = sy*tmp
7233  sz = sz*tmp
7234  rface = sface*tmp
7235 ! compute some dependent variables at the roe
7236 ! average state.
7237  alphaavg = half*(uavg**2+vavg**2+wavg**2)
7238  if (gm1*(havg-alphaavg) - gm53*kavg .ge. 0.) then
7239  a2avg = gm1*(havg-alphaavg) - gm53*kavg
7240  else
7241  a2avg = -(gm1*(havg-alphaavg)-gm53*kavg)
7242  end if
7243  aavg = sqrt(a2avg)
7244  unavg = uavg*sx + vavg*sy + wavg*sz
7245  ovaavg = one/aavg
7246  ova2avg = one/a2avg
7247 ! set for a boundary the normal velocity to rface, the
7248 ! normal velocity of the boundary.
7249  if (por .eq. boundflux) unavg = rface
7250  x1 = (left(ivx)-right(ivx))*sx + (left(ivy)-right(ivy))*sy + (&
7251 & left(ivz)-right(ivz))*sz
7252  if (x1 .ge. 0.) then
7253  abs1 = x1
7254  else
7255  abs1 = -x1
7256  end if
7257  x2 = sqrt(gammaface*left(irhoe)/left(irho)) - sqrt(gammaface*&
7258 & right(irhoe)/right(irho))
7259  if (x2 .ge. 0.) then
7260  abs2 = x2
7261  else
7262  abs2 = -x2
7263  end if
7264 ! compute the coefficient eta for the entropy correction.
7265 ! at the moment a 1d entropy correction is used, which
7266 ! removes expansion shocks. although it also reduces the
7267 ! carbuncle phenomenon, it does not remove it completely.
7268 ! in other to do that a multi-dimensional entropy fix is
7269 ! needed, see sanders et. al, jcp, vol. 145, 1998,
7270 ! pp. 511 - 537. although relatively easy to implement,
7271 ! an efficient implementation requires the storage of
7272 ! all the left and right states, which is rather
7273 ! expensive in terms of memory.
7274  eta = half*(abs1+abs2)
7275  if (unavg - rface + aavg .ge. 0.) then
7276  lam1 = unavg - rface + aavg
7277  else
7278  lam1 = -(unavg-rface+aavg)
7279  end if
7280  if (unavg - rface - aavg .ge. 0.) then
7281  lam2 = unavg - rface - aavg
7282  else
7283  lam2 = -(unavg-rface-aavg)
7284  end if
7285  if (unavg - rface .ge. 0.) then
7286  lam3 = unavg - rface
7287  else
7288  lam3 = -(unavg-rface)
7289  end if
7290 ! apply the entropy correction to the eigenvalues.
7291  tmp = two*eta
7292  if (lam1 .lt. tmp) lam1 = eta + fourth*lam1*lam1/eta
7293  if (lam2 .lt. tmp) lam2 = eta + fourth*lam2*lam2/eta
7294  if (lam3 .lt. tmp) lam3 = eta + fourth*lam3*lam3/eta
7295 ! multiply the eigenvalues by the area to obtain
7296 ! the correct values for the dissipation term.
7297  lam1 = lam1*area
7298  lam2 = lam2*area
7299  lam3 = lam3*area
7300 ! some abbreviations, which occur quite often in the
7301 ! dissipation terms.
7302  abv1 = half*(lam1+lam2)
7303  abv2 = half*(lam1-lam2)
7304  abv3 = abv1 - lam3
7305  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53&
7306 & *drk
7307  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
7308  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
7309  abv7 = abv2*abv4*ovaavg + abv3*abv5
7310 ! compute the dissipation term, -|a| (wr - wl), which is
7311 ! multiplied by porflux. note that porflux is either
7312 ! 0.0 or 0.5*rfil.
7313  flux(irho) = -(porflux*(lam3*dr+abv6))
7314  flux(imx) = -(porflux*(lam3*dru+uavg*abv6+sx*abv7))
7315  flux(imy) = -(porflux*(lam3*drv+vavg*abv6+sy*abv7))
7316  flux(imz) = -(porflux*(lam3*drw+wavg*abv6+sz*abv7))
7317  flux(irhoe) = -(porflux*(lam3*dre+havg*abv6+unavg*abv7))
7318 ! tmp = max(lam1,lam2,lam3)
7319 ! flux(irho) = -porflux*(tmp*dr)
7320 ! flux(imx) = -porflux*(tmp*dru)
7321 ! flux(imy) = -porflux*(tmp*drv)
7322 ! flux(imz) = -porflux*(tmp*drw)
7323 ! flux(irhoe) = -porflux*(tmp*dre)
7324  case (turkel)
7325  call terminate('riemannflux', &
7326 & 'turkel preconditioner not implemented yet')
7327  case (choimerkle)
7328  call terminate('riemannflux', &
7329 & 'choi merkle preconditioner not implemented yet')
7330  end select
7331  case (vanleer)
7332  call terminate('riemannflux', 'van leer fvs not implemented yet'&
7333 & )
7334  case (ausmdv)
7335  call terminate('riemannflux', 'ausmdv fvs not implemented yet')
7336  end select
7337  end subroutine riemannflux
7338 
7339  end subroutine inviscidupwindflux_b
7340 
7341  subroutine inviscidupwindflux(finegrid)
7342 !
7343 ! inviscidupwindflux computes the artificial dissipation part of
7344 ! the euler fluxes by means of an approximate solution of the 1d
7345 ! riemann problem on the face. for first order schemes,
7346 ! finegrid == .false., the states in the cells are assumed to
7347 ! be constant; for the second order schemes on the fine grid a
7348 ! nonlinear reconstruction of the left and right state is done
7349 ! for which several options exist.
7350 ! it is assumed that the pointers in blockpointers already
7351 ! point to the correct block.
7352 !
7353  use constants
7354  use blockpointers, only : il, jl, kl, ie, je, ke, ib, jb, kb, w, p&
7355 & , pori, porj, pork, fw, gamma, si, sj, sk, indfamilyi, indfamilyj, &
7358 & factfamilyk
7359  use flowvarrefstate, only : kpresent, nw, nwf, rgas, tref
7362  use inputphysics, only : equations
7363  use iteration, only : rfil, currentlevel, groundlevel
7364  use cgnsgrid, only : massflowfamilydiss
7365  use utils_b, only : getcorrectfork, terminate
7366  use flowutils_b, only : etot
7367  implicit none
7368 !
7369 ! subroutine arguments.
7370 !
7371  logical, intent(in) :: finegrid
7372 !
7373 ! local variables.
7374 !
7375  integer(kind=portype) :: por
7376  integer(kind=inttype) :: nwint
7377  integer(kind=inttype) :: i, j, k, ind
7378  integer(kind=inttype) :: limused, riemannused
7379  real(kind=realtype) :: sx, sy, sz, omk, opk, sfil, gammaface
7380  real(kind=realtype) :: factminmod, sface
7381  real(kind=realtype), dimension(nw) :: left, right
7382  real(kind=realtype), dimension(nw) :: du1, du2, du3
7383  real(kind=realtype), dimension(nwf) :: flux
7384  logical :: firstorderk, correctfork, rotationalperiodic
7385  intrinsic abs
7386  intrinsic associated
7387  intrinsic max
7388  real(kind=realtype) :: abs0
7389  real(realtype) :: max1
7390  if (rfil .ge. 0.) then
7391  abs0 = rfil
7392  else
7393  abs0 = -rfil
7394  end if
7395 !
7396 ! check if rfil == 0. if so, the dissipative flux needs not to
7397 ! be computed.
7398  if (abs0 .lt. thresholdreal) then
7399  return
7400  else
7401 ! check if the formulation for rotational periodic problems
7402 ! must be used.
7403  if (associated(rotmatrixi)) then
7404  rotationalperiodic = .true.
7405  else
7406  rotationalperiodic = .false.
7407  end if
7408 ! initialize the dissipative residual to a certain times,
7409 ! possibly zero, the previously stored value. owned cells
7410 ! only, because the halo values do not matter.
7411  sfil = one - rfil
7412  do k=2,kl
7413  do j=2,jl
7414  do i=2,il
7415  fw(i, j, k, irho) = sfil*fw(i, j, k, irho)
7416  fw(i, j, k, imx) = sfil*fw(i, j, k, imx)
7417  fw(i, j, k, imy) = sfil*fw(i, j, k, imy)
7418  fw(i, j, k, imz) = sfil*fw(i, j, k, imz)
7419  fw(i, j, k, irhoe) = sfil*fw(i, j, k, irhoe)
7420  end do
7421  end do
7422  end do
7423 ! determine whether or not the total energy must be corrected
7424 ! for the presence of the turbulent kinetic energy.
7425  correctfork = getcorrectfork()
7426  if (1.e-10_realtype .lt. one - kappacoef) then
7427  max1 = one - kappacoef
7428  else
7429  max1 = 1.e-10_realtype
7430  end if
7431 ! compute the factor used in the minmod limiter.
7432  factminmod = (three-kappacoef)/max1
7433 ! determine the limiter scheme to be used. on the fine grid the
7434 ! user specified scheme is used; on the coarse grid a first order
7435 ! scheme is computed.
7436  limused = firstorder
7437  if (finegrid) limused = limiter
7438 ! lumped diss is true for doing approx pc
7439  if (lumpeddiss) limused = firstorder
7440 ! determine the riemann solver which must be used.
7441  riemannused = riemanncoarse
7442  if (finegrid) riemannused = riemann
7443 ! store 1-kappa and 1+kappa a bit easier and multiply it by 0.25.
7444  omk = fourth*(one-kappacoef)
7445  opk = fourth*(one+kappacoef)
7446 ! initialize sface to zero. this value will be used if the
7447 ! block is not moving.
7448  sface = zero
7449 ! set the number of variables to be interpolated depending
7450 ! whether or not a k-equation is present. if a k-equation is
7451 ! present also set the logical firstorderk. this indicates
7452 ! whether or not only a first order approximation is to be used
7453 ! for the turbulent kinetic energy.
7454  if (correctfork) then
7455  if (orderturb .eq. firstorder) then
7456  nwint = nwf
7457  firstorderk = .true.
7458  else
7459  nwint = itu1
7460  firstorderk = .false.
7461  end if
7462  else
7463  nwint = nwf
7464  firstorderk = .false.
7465  end if
7466 !
7467 ! flux computation. a distinction is made between first and
7468 ! second order schemes to avoid the overhead for the first order
7469 ! scheme.
7470 !
7471  if (limused .eq. firstorder) then
7472 !
7473 ! first order reconstruction. the states in the cells are
7474 ! constant. the left and right states are constructed easily.
7475 !
7476 ! fluxes in the i-direction.
7477  do k=2,kl
7478  do j=2,jl
7479  do i=1,il
7480 ! store the normal vector, the porosity and the
7481 ! mesh velocity if present.
7482  sx = si(i, j, k, 1)
7483  sy = si(i, j, k, 2)
7484  sz = si(i, j, k, 3)
7485  por = pori(i, j, k)
7486  if (addgridvelocities) sface = sfacei(i, j, k)
7487 ! determine the left and right state.
7488  left(irho) = w(i, j, k, irho)
7489  left(ivx) = w(i, j, k, ivx)
7490  left(ivy) = w(i, j, k, ivy)
7491  left(ivz) = w(i, j, k, ivz)
7492  left(irhoe) = p(i, j, k)
7493  if (correctfork) left(itu1) = w(i, j, k, itu1)
7494  right(irho) = w(i+1, j, k, irho)
7495  right(ivx) = w(i+1, j, k, ivx)
7496  right(ivy) = w(i+1, j, k, ivy)
7497  right(ivz) = w(i+1, j, k, ivz)
7498  right(irhoe) = p(i+1, j, k)
7499  if (correctfork) right(itu1) = w(i+1, j, k, itu1)
7500 ! compute the value of gamma on the face. take an
7501 ! arithmetic average of the two states.
7502  gammaface = half*(gamma(i, j, k)+gamma(i+1, j, k))
7503 ! compute the dissipative flux across the interface.
7504  call riemannflux(left, right, flux)
7505 ! and scatter it to the left and right.
7506  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
7507  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
7508  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
7509  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
7510  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
7511  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) - flux(irho)
7512  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) - flux(imx)
7513  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) - flux(imy)
7514  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) - flux(imz)
7515  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) - flux(irhoe)
7516 ! store the density flux in the mass flow of the
7517 ! appropriate sliding mesh interface.
7518  end do
7519  end do
7520  end do
7521 ! fluxes in j-direction.
7522  do k=2,kl
7523  do j=1,jl
7524  do i=2,il
7525 ! store the normal vector, the porosity and the
7526 ! mesh velocity if present.
7527  sx = sj(i, j, k, 1)
7528  sy = sj(i, j, k, 2)
7529  sz = sj(i, j, k, 3)
7530  por = porj(i, j, k)
7531  if (addgridvelocities) sface = sfacej(i, j, k)
7532 ! determine the left and right state.
7533  left(irho) = w(i, j, k, irho)
7534  left(ivx) = w(i, j, k, ivx)
7535  left(ivy) = w(i, j, k, ivy)
7536  left(ivz) = w(i, j, k, ivz)
7537  left(irhoe) = p(i, j, k)
7538  if (correctfork) left(itu1) = w(i, j, k, itu1)
7539  right(irho) = w(i, j+1, k, irho)
7540  right(ivx) = w(i, j+1, k, ivx)
7541  right(ivy) = w(i, j+1, k, ivy)
7542  right(ivz) = w(i, j+1, k, ivz)
7543  right(irhoe) = p(i, j+1, k)
7544  if (correctfork) right(itu1) = w(i, j+1, k, itu1)
7545 ! compute the value of gamma on the face. take an
7546 ! arithmetic average of the two states.
7547  gammaface = half*(gamma(i, j, k)+gamma(i, j+1, k))
7548 ! compute the dissipative flux across the interface.
7549  call riemannflux(left, right, flux)
7550 ! and scatter it to the left and right.
7551  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
7552  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
7553  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
7554  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
7555  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
7556  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) - flux(irho)
7557  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) - flux(imx)
7558  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) - flux(imy)
7559  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) - flux(imz)
7560  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) - flux(irhoe)
7561 ! store the density flux in the mass flow of the
7562 ! appropriate sliding mesh interface.
7563  end do
7564  end do
7565  end do
7566 ! fluxes in k-direction.
7567  do k=1,kl
7568  do j=2,jl
7569  do i=2,il
7570 ! store the normal vector, the porosity and the
7571 ! mesh velocity if present.
7572  sx = sk(i, j, k, 1)
7573  sy = sk(i, j, k, 2)
7574  sz = sk(i, j, k, 3)
7575  por = pork(i, j, k)
7576  if (addgridvelocities) sface = sfacek(i, j, k)
7577 ! determine the left and right state.
7578  left(irho) = w(i, j, k, irho)
7579  left(ivx) = w(i, j, k, ivx)
7580  left(ivy) = w(i, j, k, ivy)
7581  left(ivz) = w(i, j, k, ivz)
7582  left(irhoe) = p(i, j, k)
7583  if (correctfork) left(itu1) = w(i, j, k, itu1)
7584  right(irho) = w(i, j, k+1, irho)
7585  right(ivx) = w(i, j, k+1, ivx)
7586  right(ivy) = w(i, j, k+1, ivy)
7587  right(ivz) = w(i, j, k+1, ivz)
7588  right(irhoe) = p(i, j, k+1)
7589  if (correctfork) right(itu1) = w(i, j, k+1, itu1)
7590 ! compute the value of gamma on the face. take an
7591 ! arithmetic average of the two states.
7592  gammaface = half*(gamma(i, j, k)+gamma(i, j, k+1))
7593 ! compute the dissipative flux across the interface.
7594  call riemannflux(left, right, flux)
7595 ! and scatter it the left and right.
7596  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
7597  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
7598  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
7599  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
7600  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
7601  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) - flux(irho)
7602  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) - flux(imx)
7603  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) - flux(imy)
7604  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) - flux(imz)
7605  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) - flux(irhoe)
7606 ! store the density flux in the mass flow of the
7607 ! appropriate sliding mesh interface.
7608  end do
7609  end do
7610  end do
7611  else
7612 ! ==================================================================
7613 ! ==================================================================
7614 !
7615 ! second order reconstruction of the left and right state.
7616 ! the three differences used in the, possibly nonlinear,
7617 ! interpolation are constructed here; the actual left and
7618 ! right states, or at least the differences from the first
7619 ! order interpolation, are computed in the subroutine
7620 ! leftrightstate.
7621 !
7622 ! fluxes in the i-direction.
7623  do k=2,kl
7624  do j=2,jl
7625  do i=1,il
7626 ! store the three differences used in the interpolation
7627 ! in du1, du2, du3.
7628  du1(irho) = w(i, j, k, irho) - w(i-1, j, k, irho)
7629  du2(irho) = w(i+1, j, k, irho) - w(i, j, k, irho)
7630  du3(irho) = w(i+2, j, k, irho) - w(i+1, j, k, irho)
7631  du1(ivx) = w(i, j, k, ivx) - w(i-1, j, k, ivx)
7632  du2(ivx) = w(i+1, j, k, ivx) - w(i, j, k, ivx)
7633  du3(ivx) = w(i+2, j, k, ivx) - w(i+1, j, k, ivx)
7634  du1(ivy) = w(i, j, k, ivy) - w(i-1, j, k, ivy)
7635  du2(ivy) = w(i+1, j, k, ivy) - w(i, j, k, ivy)
7636  du3(ivy) = w(i+2, j, k, ivy) - w(i+1, j, k, ivy)
7637  du1(ivz) = w(i, j, k, ivz) - w(i-1, j, k, ivz)
7638  du2(ivz) = w(i+1, j, k, ivz) - w(i, j, k, ivz)
7639  du3(ivz) = w(i+2, j, k, ivz) - w(i+1, j, k, ivz)
7640  du1(irhoe) = p(i, j, k) - p(i-1, j, k)
7641  du2(irhoe) = p(i+1, j, k) - p(i, j, k)
7642  du3(irhoe) = p(i+2, j, k) - p(i+1, j, k)
7643  if (correctfork) then
7644  du1(itu1) = w(i, j, k, itu1) - w(i-1, j, k, itu1)
7645  du2(itu1) = w(i+1, j, k, itu1) - w(i, j, k, itu1)
7646  du3(itu1) = w(i+2, j, k, itu1) - w(i+1, j, k, itu1)
7647  end if
7648 ! compute the differences from the first order scheme.
7649  call leftrightstate(du1, du2, du3, rotmatrixi, left, right&
7650 & )
7651 ! add the first order part to the currently stored
7652 ! differences, such that the correct state vector
7653 ! is stored.
7654  left(irho) = left(irho) + w(i, j, k, irho)
7655  left(ivx) = left(ivx) + w(i, j, k, ivx)
7656  left(ivy) = left(ivy) + w(i, j, k, ivy)
7657  left(ivz) = left(ivz) + w(i, j, k, ivz)
7658  left(irhoe) = left(irhoe) + p(i, j, k)
7659  right(irho) = right(irho) + w(i+1, j, k, irho)
7660  right(ivx) = right(ivx) + w(i+1, j, k, ivx)
7661  right(ivy) = right(ivy) + w(i+1, j, k, ivy)
7662  right(ivz) = right(ivz) + w(i+1, j, k, ivz)
7663  right(irhoe) = right(irhoe) + p(i+1, j, k)
7664  if (correctfork) then
7665  left(itu1) = left(itu1) + w(i, j, k, itu1)
7666  right(itu1) = right(itu1) + w(i+1, j, k, itu1)
7667  end if
7668 ! store the normal vector, the porosity and the
7669 ! mesh velocity if present.
7670  sx = si(i, j, k, 1)
7671  sy = si(i, j, k, 2)
7672  sz = si(i, j, k, 3)
7673  por = pori(i, j, k)
7674  if (addgridvelocities) sface = sfacei(i, j, k)
7675 ! compute the value of gamma on the face. take an
7676 ! arithmetic average of the two states.
7677  gammaface = half*(gamma(i, j, k)+gamma(i+1, j, k))
7678 ! compute the dissipative flux across the interface.
7679  call riemannflux(left, right, flux)
7680 ! and scatter it to the left and right.
7681  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
7682  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
7683  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
7684  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
7685  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
7686  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) - flux(irho)
7687  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) - flux(imx)
7688  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) - flux(imy)
7689  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) - flux(imz)
7690  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) - flux(irhoe)
7691 ! store the density flux in the mass flow of the
7692 ! appropriate sliding mesh interface.
7693  end do
7694  end do
7695  end do
7696 ! fluxes in the j-direction.
7697  do k=2,kl
7698  do j=1,jl
7699  do i=2,il
7700 ! store the three differences used in the interpolation
7701 ! in du1, du2, du3.
7702  du1(irho) = w(i, j, k, irho) - w(i, j-1, k, irho)
7703  du2(irho) = w(i, j+1, k, irho) - w(i, j, k, irho)
7704  du3(irho) = w(i, j+2, k, irho) - w(i, j+1, k, irho)
7705  du1(ivx) = w(i, j, k, ivx) - w(i, j-1, k, ivx)
7706  du2(ivx) = w(i, j+1, k, ivx) - w(i, j, k, ivx)
7707  du3(ivx) = w(i, j+2, k, ivx) - w(i, j+1, k, ivx)
7708  du1(ivy) = w(i, j, k, ivy) - w(i, j-1, k, ivy)
7709  du2(ivy) = w(i, j+1, k, ivy) - w(i, j, k, ivy)
7710  du3(ivy) = w(i, j+2, k, ivy) - w(i, j+1, k, ivy)
7711  du1(ivz) = w(i, j, k, ivz) - w(i, j-1, k, ivz)
7712  du2(ivz) = w(i, j+1, k, ivz) - w(i, j, k, ivz)
7713  du3(ivz) = w(i, j+2, k, ivz) - w(i, j+1, k, ivz)
7714  du1(irhoe) = p(i, j, k) - p(i, j-1, k)
7715  du2(irhoe) = p(i, j+1, k) - p(i, j, k)
7716  du3(irhoe) = p(i, j+2, k) - p(i, j+1, k)
7717  if (correctfork) then
7718  du1(itu1) = w(i, j, k, itu1) - w(i, j-1, k, itu1)
7719  du2(itu1) = w(i, j+1, k, itu1) - w(i, j, k, itu1)
7720  du3(itu1) = w(i, j+2, k, itu1) - w(i, j+1, k, itu1)
7721  end if
7722 ! compute the differences from the first order scheme.
7723  call leftrightstate(du1, du2, du3, rotmatrixj, left, right&
7724 & )
7725 ! add the first order part to the currently stored
7726 ! differences, such that the correct state vector
7727 ! is stored.
7728  left(irho) = left(irho) + w(i, j, k, irho)
7729  left(ivx) = left(ivx) + w(i, j, k, ivx)
7730  left(ivy) = left(ivy) + w(i, j, k, ivy)
7731  left(ivz) = left(ivz) + w(i, j, k, ivz)
7732  left(irhoe) = left(irhoe) + p(i, j, k)
7733  right(irho) = right(irho) + w(i, j+1, k, irho)
7734  right(ivx) = right(ivx) + w(i, j+1, k, ivx)
7735  right(ivy) = right(ivy) + w(i, j+1, k, ivy)
7736  right(ivz) = right(ivz) + w(i, j+1, k, ivz)
7737  right(irhoe) = right(irhoe) + p(i, j+1, k)
7738  if (correctfork) then
7739  left(itu1) = left(itu1) + w(i, j, k, itu1)
7740  right(itu1) = right(itu1) + w(i, j+1, k, itu1)
7741  end if
7742 ! store the normal vector, the porosity and the
7743 ! mesh velocity if present.
7744  sx = sj(i, j, k, 1)
7745  sy = sj(i, j, k, 2)
7746  sz = sj(i, j, k, 3)
7747  por = porj(i, j, k)
7748  if (addgridvelocities) sface = sfacej(i, j, k)
7749 ! compute the value of gamma on the face. take an
7750 ! arithmetic average of the two states.
7751  gammaface = half*(gamma(i, j, k)+gamma(i, j+1, k))
7752 ! compute the dissipative flux across the interface.
7753  call riemannflux(left, right, flux)
7754 ! and scatter it to the left and right.
7755  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
7756  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
7757  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
7758  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
7759  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
7760  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) - flux(irho)
7761  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) - flux(imx)
7762  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) - flux(imy)
7763  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) - flux(imz)
7764  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) - flux(irhoe)
7765 ! store the density flux in the mass flow of the
7766 ! appropriate sliding mesh interface.
7767  end do
7768  end do
7769  end do
7770 ! fluxes in the k-direction.
7771  do k=1,kl
7772  do j=2,jl
7773  do i=2,il
7774 ! store the three differences used in the interpolation
7775 ! in du1, du2, du3.
7776  du1(irho) = w(i, j, k, irho) - w(i, j, k-1, irho)
7777  du2(irho) = w(i, j, k+1, irho) - w(i, j, k, irho)
7778  du3(irho) = w(i, j, k+2, irho) - w(i, j, k+1, irho)
7779  du1(ivx) = w(i, j, k, ivx) - w(i, j, k-1, ivx)
7780  du2(ivx) = w(i, j, k+1, ivx) - w(i, j, k, ivx)
7781  du3(ivx) = w(i, j, k+2, ivx) - w(i, j, k+1, ivx)
7782  du1(ivy) = w(i, j, k, ivy) - w(i, j, k-1, ivy)
7783  du2(ivy) = w(i, j, k+1, ivy) - w(i, j, k, ivy)
7784  du3(ivy) = w(i, j, k+2, ivy) - w(i, j, k+1, ivy)
7785  du1(ivz) = w(i, j, k, ivz) - w(i, j, k-1, ivz)
7786  du2(ivz) = w(i, j, k+1, ivz) - w(i, j, k, ivz)
7787  du3(ivz) = w(i, j, k+2, ivz) - w(i, j, k+1, ivz)
7788  du1(irhoe) = p(i, j, k) - p(i, j, k-1)
7789  du2(irhoe) = p(i, j, k+1) - p(i, j, k)
7790  du3(irhoe) = p(i, j, k+2) - p(i, j, k+1)
7791  if (correctfork) then
7792  du1(itu1) = w(i, j, k, itu1) - w(i, j, k-1, itu1)
7793  du2(itu1) = w(i, j, k+1, itu1) - w(i, j, k, itu1)
7794  du3(itu1) = w(i, j, k+2, itu1) - w(i, j, k+1, itu1)
7795  end if
7796 ! compute the differences from the first order scheme.
7797  call leftrightstate(du1, du2, du3, rotmatrixk, left, right&
7798 & )
7799 ! add the first order part to the currently stored
7800 ! differences, such that the correct state vector
7801 ! is stored.
7802  left(irho) = left(irho) + w(i, j, k, irho)
7803  left(ivx) = left(ivx) + w(i, j, k, ivx)
7804  left(ivy) = left(ivy) + w(i, j, k, ivy)
7805  left(ivz) = left(ivz) + w(i, j, k, ivz)
7806  left(irhoe) = left(irhoe) + p(i, j, k)
7807  right(irho) = right(irho) + w(i, j, k+1, irho)
7808  right(ivx) = right(ivx) + w(i, j, k+1, ivx)
7809  right(ivy) = right(ivy) + w(i, j, k+1, ivy)
7810  right(ivz) = right(ivz) + w(i, j, k+1, ivz)
7811  right(irhoe) = right(irhoe) + p(i, j, k+1)
7812  if (correctfork) then
7813  left(itu1) = left(itu1) + w(i, j, k, itu1)
7814  right(itu1) = right(itu1) + w(i, j, k+1, itu1)
7815  end if
7816 ! store the normal vector, the porosity and the
7817 ! mesh velocity if present.
7818  sx = sk(i, j, k, 1)
7819  sy = sk(i, j, k, 2)
7820  sz = sk(i, j, k, 3)
7821  por = pork(i, j, k)
7822  if (addgridvelocities) sface = sfacek(i, j, k)
7823 ! compute the value of gamma on the face. take an
7824 ! arithmetic average of the two states.
7825  gammaface = half*(gamma(i, j, k)+gamma(i, j, k+1))
7826 ! compute the dissipative flux across the interface.
7827  call riemannflux(left, right, flux)
7828 ! and scatter it to the left and right.
7829  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
7830  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
7831  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
7832  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
7833  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
7834  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) - flux(irho)
7835  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) - flux(imx)
7836  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) - flux(imy)
7837  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) - flux(imz)
7838  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) - flux(irhoe)
7839 ! store the density flux in the mass flow of the
7840 ! appropriate sliding mesh interface.
7841  end do
7842  end do
7843  end do
7844  end if
7845  end if
7846 
7847  contains
7848 ! ==================================================================
7849  subroutine leftrightstate(du1, du2, du3, rotmatrix, left, right)
7850  implicit none
7851 !
7852 ! local parameter.
7853 !
7854  real(kind=realtype), parameter :: epslim=1.e-10_realtype
7855 !
7856 ! subroutine arguments.
7857 !
7858  real(kind=realtype), dimension(:), intent(inout) :: du1, du2, du3
7859  real(kind=realtype), dimension(:), intent(out) :: left, right
7860  real(kind=realtype), dimension(:, :, :, :, :), pointer :: &
7861 & rotmatrix
7862 !
7863 ! local variables.
7864 !
7865  integer(kind=inttype) :: l
7866  real(kind=realtype) :: rl1, rl2, rr1, rr2, tmp, dvx, dvy, dvz
7867  real(kind=realtype), dimension(3, 3) :: rot
7868  intrinsic abs
7869  intrinsic max
7870  intrinsic sign
7871  intrinsic min
7872  real(kind=realtype) :: x1
7873  real(kind=realtype) :: y1
7874  real(kind=realtype) :: y2
7875  real(kind=realtype) :: x2
7876  real(kind=realtype) :: y3
7877  real(kind=realtype) :: y4
7878  real(kind=realtype) :: x3
7879  real(kind=realtype) :: x4
7880  real(kind=realtype) :: x5
7881  real(kind=realtype) :: x6
7882  real(kind=realtype) :: max2
7883  real(kind=realtype) :: max3
7884  real(kind=realtype) :: max4
7885  real(kind=realtype) :: max5
7886  real(kind=realtype) :: max6
7887  real(kind=realtype) :: max7
7888 ! check if the velocity components should be transformed to
7889 ! the cylindrical frame.
7890  if (rotationalperiodic) then
7891 ! store the rotation matrix a bit easier. note that the i,j,k
7892 ! come from the main subroutine.
7893  rot(1, 1) = rotmatrix(i, j, k, 1, 1)
7894  rot(1, 2) = rotmatrix(i, j, k, 1, 2)
7895  rot(1, 3) = rotmatrix(i, j, k, 1, 3)
7896  rot(2, 1) = rotmatrix(i, j, k, 2, 1)
7897  rot(2, 2) = rotmatrix(i, j, k, 2, 2)
7898  rot(2, 3) = rotmatrix(i, j, k, 2, 3)
7899  rot(3, 1) = rotmatrix(i, j, k, 3, 1)
7900  rot(3, 2) = rotmatrix(i, j, k, 3, 2)
7901  rot(3, 3) = rotmatrix(i, j, k, 3, 3)
7902 ! apply the transformation to the velocity components
7903 ! of du1, du2 and du3.
7904  dvx = du1(ivx)
7905  dvy = du1(ivy)
7906  dvz = du1(ivz)
7907  du1(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
7908  du1(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
7909  du1(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
7910  dvx = du2(ivx)
7911  dvy = du2(ivy)
7912  dvz = du2(ivz)
7913  du2(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
7914  du2(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
7915  du2(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
7916  dvx = du3(ivx)
7917  dvy = du3(ivy)
7918  dvz = du3(ivz)
7919  du3(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
7920  du3(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
7921  du3(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
7922  end if
7923 ! determine the limiter used.
7924  select case (limused)
7925  case (nolimiter)
7926 ! linear interpolation; no limiter.
7927 ! loop over the number of variables to be interpolated.
7928  do l=1,nwint
7929  left(l) = omk*du1(l) + opk*du2(l)
7930  right(l) = -(omk*du3(l)) - opk*du2(l)
7931  end do
7932  case (vanalbeda)
7933 ! ==============================================================
7934 ! nonlinear interpolation using the van albeda limiter.
7935 ! loop over the number of variables to be interpolated.
7936  do l=1,nwint
7937  if (du2(l) .ge. 0.) then
7938  x1 = du2(l)
7939  else
7940  x1 = -du2(l)
7941  end if
7942  if (x1 .lt. epslim) then
7943  max2 = epslim
7944  else
7945  max2 = x1
7946  end if
7947 ! compute the limiter argument rl1, rl2, rr1 and rr2.
7948 ! note the cut off to 0.0.
7949  tmp = one/sign(max2, du2(l))
7950  if (du1(l) .ge. 0.) then
7951  x3 = du1(l)
7952  else
7953  x3 = -du1(l)
7954  end if
7955  if (x3 .lt. epslim) then
7956  max4 = epslim
7957  else
7958  max4 = x3
7959  end if
7960  y1 = du2(l)/sign(max4, du1(l))
7961  if (zero .lt. y1) then
7962  rl1 = y1
7963  else
7964  rl1 = zero
7965  end if
7966  if (zero .lt. du1(l)*tmp) then
7967  rl2 = du1(l)*tmp
7968  else
7969  rl2 = zero
7970  end if
7971  if (zero .lt. du3(l)*tmp) then
7972  rr1 = du3(l)*tmp
7973  else
7974  rr1 = zero
7975  end if
7976  if (du3(l) .ge. 0.) then
7977  x4 = du3(l)
7978  else
7979  x4 = -du3(l)
7980  end if
7981  if (x4 .lt. epslim) then
7982  max5 = epslim
7983  else
7984  max5 = x4
7985  end if
7986  y2 = du2(l)/sign(max5, du3(l))
7987  if (zero .lt. y2) then
7988  rr2 = y2
7989  else
7990  rr2 = zero
7991  end if
7992 ! compute the corresponding limiter values.
7993  rl1 = rl1*(rl1+one)/(rl1*rl1+one)
7994  rl2 = rl2*(rl2+one)/(rl2*rl2+one)
7995  rr1 = rr1*(rr1+one)/(rr1*rr1+one)
7996  rr2 = rr2*(rr2+one)/(rr2*rr2+one)
7997 ! compute the nonlinear corrections to the first order
7998 ! scheme.
7999  left(l) = omk*rl1*du1(l) + opk*rl2*du2(l)
8000  right(l) = -(opk*rr1*du2(l)) - omk*rr2*du3(l)
8001  end do
8002  case (minmod)
8003 ! ==============================================================
8004 ! nonlinear interpolation using the minmod limiter.
8005 ! loop over the number of variables to be interpolated.
8006  do l=1,nwint
8007  if (du2(l) .ge. 0.) then
8008  x2 = du2(l)
8009  else
8010  x2 = -du2(l)
8011  end if
8012  if (x2 .lt. epslim) then
8013  max3 = epslim
8014  else
8015  max3 = x2
8016  end if
8017 ! compute the limiter argument rl1, rl2, rr1 and rr2.
8018 ! note the cut off to 0.0.
8019  tmp = one/sign(max3, du2(l))
8020  if (du1(l) .ge. 0.) then
8021  x5 = du1(l)
8022  else
8023  x5 = -du1(l)
8024  end if
8025  if (x5 .lt. epslim) then
8026  max6 = epslim
8027  else
8028  max6 = x5
8029  end if
8030  y3 = du2(l)/sign(max6, du1(l))
8031  if (zero .lt. y3) then
8032  rl1 = y3
8033  else
8034  rl1 = zero
8035  end if
8036  if (zero .lt. du1(l)*tmp) then
8037  rl2 = du1(l)*tmp
8038  else
8039  rl2 = zero
8040  end if
8041  if (zero .lt. du3(l)*tmp) then
8042  rr1 = du3(l)*tmp
8043  else
8044  rr1 = zero
8045  end if
8046  if (du3(l) .ge. 0.) then
8047  x6 = du3(l)
8048  else
8049  x6 = -du3(l)
8050  end if
8051  if (x6 .lt. epslim) then
8052  max7 = epslim
8053  else
8054  max7 = x6
8055  end if
8056  y4 = du2(l)/sign(max7, du3(l))
8057  if (zero .lt. y4) then
8058  rr2 = y4
8059  else
8060  rr2 = zero
8061  end if
8062  if (one .gt. factminmod*rl1) then
8063  rl1 = factminmod*rl1
8064  else
8065  rl1 = one
8066  end if
8067  if (one .gt. factminmod*rl2) then
8068  rl2 = factminmod*rl2
8069  else
8070  rl2 = one
8071  end if
8072  if (one .gt. factminmod*rr1) then
8073  rr1 = factminmod*rr1
8074  else
8075  rr1 = one
8076  end if
8077  if (one .gt. factminmod*rr2) then
8078  rr2 = factminmod*rr2
8079  else
8080  rr2 = one
8081  end if
8082 ! compute the nonlinear corrections to the first order
8083 ! scheme.
8084  left(l) = omk*rl1*du1(l) + opk*rl2*du2(l)
8085  right(l) = -(opk*rr1*du2(l)) - omk*rr2*du3(l)
8086  end do
8087  end select
8088 ! in case only a first order scheme must be used for the
8089 ! turbulent transport equations, set the correction for the
8090 ! turbulent kinetic energy to 0.
8091  if (firstorderk) then
8092  left(itu1) = zero
8093  right(itu1) = zero
8094  end if
8095 ! for rotational periodic problems transform the velocity
8096 ! differences back to cartesian again. note that now the
8097 ! transpose of the rotation matrix must be used.
8098  if (rotationalperiodic) then
8099 ! left state.
8100  dvx = left(ivx)
8101  dvy = left(ivy)
8102  dvz = left(ivz)
8103  left(ivx) = rot(1, 1)*dvx + rot(2, 1)*dvy + rot(3, 1)*dvz
8104  left(ivy) = rot(1, 2)*dvx + rot(2, 2)*dvy + rot(3, 2)*dvz
8105  left(ivz) = rot(1, 3)*dvx + rot(2, 3)*dvy + rot(3, 3)*dvz
8106 ! right state.
8107  dvx = right(ivx)
8108  dvy = right(ivy)
8109  dvz = right(ivz)
8110  right(ivx) = rot(1, 1)*dvx + rot(2, 1)*dvy + rot(3, 1)*dvz
8111  right(ivy) = rot(1, 2)*dvx + rot(2, 2)*dvy + rot(3, 2)*dvz
8112  right(ivz) = rot(1, 3)*dvx + rot(2, 3)*dvy + rot(3, 3)*dvz
8113  end if
8114  end subroutine leftrightstate
8115 
8116 ! ================================================================
8117  subroutine riemannflux(left, right, flux)
8118  implicit none
8119 !
8120 ! subroutine arguments.
8121 !
8122  real(kind=realtype), dimension(*), intent(in) :: left, right
8123  real(kind=realtype), dimension(*), intent(out) :: flux
8124 !
8125 ! local variables.
8126 !
8127  real(kind=realtype) :: porflux, rface
8128  real(kind=realtype) :: etl, etr, z1l, z1r, tmp
8129  real(kind=realtype) :: dr, dru, drv, drw, dre, drk
8130  real(kind=realtype) :: ravg, uavg, vavg, wavg, havg, kavg
8131  real(kind=realtype) :: alphaavg, a2avg, aavg, unavg
8132  real(kind=realtype) :: ovaavg, ova2avg, area, eta
8133  real(kind=realtype) :: gm1, gm53
8134  real(kind=realtype) :: lam1, lam2, lam3
8135  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
8136  real(kind=realtype), dimension(2) :: ktmp
8137  intrinsic sqrt
8138  intrinsic max
8139  intrinsic abs
8140  real(kind=realtype) :: x1
8141  real(kind=realtype) :: x2
8142  real(realtype) :: max2
8143  real(kind=realtype) :: abs1
8144  real(kind=realtype) :: abs2
8145 ! set the porosity for the flux. the default value, 0.5*rfil, is
8146 ! a scaling factor where an rfil != 1 is taken into account.
8147  porflux = half*rfil
8148  if (por .eq. noflux .or. por .eq. boundflux) porflux = zero
8149 ! abbreviate some expressions in which gamma occurs.
8150  gm1 = gammaface - one
8151  gm53 = gammaface - five*third
8152 ! determine which riemann solver must be solved.
8153  select case (riemannused)
8154  case (roe)
8155 ! determine the preconditioner used.
8156  select case (precond)
8157  case (noprecond)
8158 ! no preconditioner used. use the roe scheme of the
8159 ! standard equations.
8160 ! compute the square root of the left and right densities
8161 ! and the inverse of the sum.
8162  z1l = sqrt(left(irho))
8163  z1r = sqrt(right(irho))
8164  tmp = one/(z1l+z1r)
8165 ! compute some variables depending whether or not a
8166 ! k-equation is present.
8167  if (correctfork) then
8168 ! store the left and right kinetic energy in ktmp,
8169 ! which is needed to compute the total energy.
8170  ktmp(1) = left(itu1)
8171  ktmp(2) = right(itu1)
8172 ! store the difference of the turbulent kinetic energy
8173 ! per unit volume, i.e. the conserved variable.
8174  drk = right(irho)*right(itu1) - left(irho)*left(itu1)
8175 ! compute the average turbulent energy per unit mass
8176 ! using roe averages.
8177  kavg = tmp*(z1l*left(itu1)+z1r*right(itu1))
8178  else
8179 ! set the difference of the turbulent kinetic energy
8180 ! per unit volume and the averaged kinetic energy per
8181 ! unit mass to zero.
8182  drk = 0.0
8183  kavg = 0.0
8184  end if
8185 ! compute the total energy of the left and right state.
8186  call etot(left(irho), left(ivx), left(ivy), left(ivz), left(&
8187 & irhoe), ktmp(1), etl, correctfork)
8188  call etot(right(irho), right(ivx), right(ivy), right(ivz), &
8189 & right(irhoe), ktmp(2), etr, correctfork)
8190 ! compute the difference of the conservative mean
8191 ! flow variables.
8192  dr = right(irho) - left(irho)
8193  dru = right(irho)*right(ivx) - left(irho)*left(ivx)
8194  drv = right(irho)*right(ivy) - left(irho)*left(ivy)
8195  drw = right(irho)*right(ivz) - left(irho)*left(ivz)
8196  dre = etr - etl
8197 ! compute the roe average variables, which can be
8198 ! computed directly from the average roe vector.
8199  ravg = fourth*(z1r+z1l)**2
8200  uavg = tmp*(z1l*left(ivx)+z1r*right(ivx))
8201  vavg = tmp*(z1l*left(ivy)+z1r*right(ivy))
8202  wavg = tmp*(z1l*left(ivz)+z1r*right(ivz))
8203  havg = tmp*((etl+left(irhoe))/z1l+(etr+right(irhoe))/z1r)
8204 ! compute the unit vector and store the area of the
8205 ! normal. also compute the unit normal velocity of the face.
8206  area = sqrt(sx**2 + sy**2 + sz**2)
8207  if (1.e-25_realtype .lt. area) then
8208  max2 = area
8209  else
8210  max2 = 1.e-25_realtype
8211  end if
8212  tmp = one/max2
8213  sx = sx*tmp
8214  sy = sy*tmp
8215  sz = sz*tmp
8216  rface = sface*tmp
8217 ! compute some dependent variables at the roe
8218 ! average state.
8219  alphaavg = half*(uavg**2+vavg**2+wavg**2)
8220  if (gm1*(havg-alphaavg) - gm53*kavg .ge. 0.) then
8221  a2avg = gm1*(havg-alphaavg) - gm53*kavg
8222  else
8223  a2avg = -(gm1*(havg-alphaavg)-gm53*kavg)
8224  end if
8225  aavg = sqrt(a2avg)
8226  unavg = uavg*sx + vavg*sy + wavg*sz
8227  ovaavg = one/aavg
8228  ova2avg = one/a2avg
8229 ! set for a boundary the normal velocity to rface, the
8230 ! normal velocity of the boundary.
8231  if (por .eq. boundflux) unavg = rface
8232  x1 = (left(ivx)-right(ivx))*sx + (left(ivy)-right(ivy))*sy + (&
8233 & left(ivz)-right(ivz))*sz
8234  if (x1 .ge. 0.) then
8235  abs1 = x1
8236  else
8237  abs1 = -x1
8238  end if
8239  x2 = sqrt(gammaface*left(irhoe)/left(irho)) - sqrt(gammaface*&
8240 & right(irhoe)/right(irho))
8241  if (x2 .ge. 0.) then
8242  abs2 = x2
8243  else
8244  abs2 = -x2
8245  end if
8246 ! compute the coefficient eta for the entropy correction.
8247 ! at the moment a 1d entropy correction is used, which
8248 ! removes expansion shocks. although it also reduces the
8249 ! carbuncle phenomenon, it does not remove it completely.
8250 ! in other to do that a multi-dimensional entropy fix is
8251 ! needed, see sanders et. al, jcp, vol. 145, 1998,
8252 ! pp. 511 - 537. although relatively easy to implement,
8253 ! an efficient implementation requires the storage of
8254 ! all the left and right states, which is rather
8255 ! expensive in terms of memory.
8256  eta = half*(abs1+abs2)
8257  if (unavg - rface + aavg .ge. 0.) then
8258  lam1 = unavg - rface + aavg
8259  else
8260  lam1 = -(unavg-rface+aavg)
8261  end if
8262  if (unavg - rface - aavg .ge. 0.) then
8263  lam2 = unavg - rface - aavg
8264  else
8265  lam2 = -(unavg-rface-aavg)
8266  end if
8267  if (unavg - rface .ge. 0.) then
8268  lam3 = unavg - rface
8269  else
8270  lam3 = -(unavg-rface)
8271  end if
8272 ! apply the entropy correction to the eigenvalues.
8273  tmp = two*eta
8274  if (lam1 .lt. tmp) lam1 = eta + fourth*lam1*lam1/eta
8275  if (lam2 .lt. tmp) lam2 = eta + fourth*lam2*lam2/eta
8276  if (lam3 .lt. tmp) lam3 = eta + fourth*lam3*lam3/eta
8277 ! multiply the eigenvalues by the area to obtain
8278 ! the correct values for the dissipation term.
8279  lam1 = lam1*area
8280  lam2 = lam2*area
8281  lam3 = lam3*area
8282 ! some abbreviations, which occur quite often in the
8283 ! dissipation terms.
8284  abv1 = half*(lam1+lam2)
8285  abv2 = half*(lam1-lam2)
8286  abv3 = abv1 - lam3
8287  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53&
8288 & *drk
8289  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
8290  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
8291  abv7 = abv2*abv4*ovaavg + abv3*abv5
8292 ! compute the dissipation term, -|a| (wr - wl), which is
8293 ! multiplied by porflux. note that porflux is either
8294 ! 0.0 or 0.5*rfil.
8295  flux(irho) = -(porflux*(lam3*dr+abv6))
8296  flux(imx) = -(porflux*(lam3*dru+uavg*abv6+sx*abv7))
8297  flux(imy) = -(porflux*(lam3*drv+vavg*abv6+sy*abv7))
8298  flux(imz) = -(porflux*(lam3*drw+wavg*abv6+sz*abv7))
8299  flux(irhoe) = -(porflux*(lam3*dre+havg*abv6+unavg*abv7))
8300 ! tmp = max(lam1,lam2,lam3)
8301 ! flux(irho) = -porflux*(tmp*dr)
8302 ! flux(imx) = -porflux*(tmp*dru)
8303 ! flux(imy) = -porflux*(tmp*drv)
8304 ! flux(imz) = -porflux*(tmp*drw)
8305 ! flux(irhoe) = -porflux*(tmp*dre)
8306  case (turkel)
8307  call terminate('riemannflux', &
8308 & 'turkel preconditioner not implemented yet')
8309  case (choimerkle)
8310  call terminate('riemannflux', &
8311 & 'choi merkle preconditioner not implemented yet')
8312  end select
8313  case (vanleer)
8314  call terminate('riemannflux', 'van leer fvs not implemented yet'&
8315 & )
8316  case (ausmdv)
8317  call terminate('riemannflux', 'ausmdv fvs not implemented yet')
8318  end select
8319  end subroutine riemannflux
8320 
8321  end subroutine inviscidupwindflux
8322 
8323 ! differentiation of viscousflux in reverse (adjoint) mode (with options noisize i4 dr8 r8):
8324 ! gradient of useful results: *w *x *si *sj *sk *fw *(*viscsubface.tau)
8325 ! *(*viscsubface.q)
8326 ! with respect to varying inputs: *rev *aa *wx *wy *wz *w *x
8327 ! *rlv *qx *qy *qz *ux *uy *uz *si *sj *sk *vx *vy
8328 ! *vz *fw *(*viscsubface.tau) *(*viscsubface.q)
8329 ! rw status of diff variables: *rev:out *aa:out *wx:out *wy:out
8330 ! *wz:out *w:incr *x:incr *rlv:out *qx:out *qy:out
8331 ! *qz:out *ux:out *uy:out *uz:out *si:incr *sj:incr
8332 ! *sk:incr *vx:out *vy:out *vz:out *fw:in-out *(*viscsubface.tau):in-out
8333 ! *(*viscsubface.q):in-out
8334 ! plus diff mem management of: rev:in aa:in wx:in wy:in wz:in
8335 ! w:in x:in rlv:in qx:in qy:in qz:in ux:in uy:in
8336 ! uz:in si:in sj:in sk:in vx:in vy:in vz:in fw:in
8337 ! viscsubface:in *viscsubface.tau:in *viscsubface.q:in
8338  subroutine viscousflux_b()
8339 !
8340 ! viscousflux computes the viscous fluxes using a central
8341 ! difference scheme for a block.
8342 ! it is assumed that the pointers in block pointer already point
8343 ! to the correct block.
8344 !
8345  use constants
8346  use blockpointers
8347  use flowvarrefstate
8348  use inputphysics
8349  use iteration
8350  implicit none
8351 !
8352 ! local parameter.
8353 !
8354  real(kind=realtype), parameter :: twothird=two*third
8355  real(kind=realtype), parameter :: xminn=1.e-14_realtype
8356 !
8357 ! local variables.
8358 !
8359  integer(kind=inttype) :: i, j, k, ii
8360  real(kind=realtype) :: rfilv, por, mul, mue, mut, heatcoef
8361  real(kind=realtype) :: muld, mued, mutd, heatcoefd
8362  real(kind=realtype) :: gm1, factlamheat, factturbheat
8363  real(kind=realtype) :: u_x, u_y, u_z, v_x, v_y, v_z, w_x, w_y, w_z
8364  real(kind=realtype) :: u_xd, u_yd, u_zd, v_xd, v_yd, v_zd, w_xd, &
8365 & w_yd, w_zd
8366  real(kind=realtype) :: q_x, q_y, q_z, ubar, vbar, wbar
8367  real(kind=realtype) :: q_xd, q_yd, q_zd, ubard, vbard, wbard
8368  real(kind=realtype) :: corr, ssx, ssy, ssz, ss, fracdiv
8369  real(kind=realtype) :: corrd, ssxd, ssyd, sszd, ssd, fracdivd
8370  real(kind=realtype) :: tauxx, tauyy, tauzz
8371  real(kind=realtype) :: tauxxd, tauyyd, tauzzd
8372  real(kind=realtype) :: tauxy, tauxz, tauyz
8373  real(kind=realtype) :: tauxyd, tauxzd, tauyzd
8374  real(kind=realtype) :: tauxxs, tauyys, tauzzs
8375  real(kind=realtype) :: tauxxsd, tauyysd, tauzzsd
8376  real(kind=realtype) :: tauxys, tauxzs, tauyzs
8377  real(kind=realtype) :: tauxysd, tauxzsd, tauyzsd
8378  real(kind=realtype) :: exx, eyy, ezz
8379  real(kind=realtype) :: exxd, eyyd, ezzd
8380  real(kind=realtype) :: exy, exz, eyz
8381  real(kind=realtype) :: exyd, exzd, eyzd
8382  real(kind=realtype) :: wxy, wxz, wyz, wyx, wzx, wzy
8383  real(kind=realtype) :: wxyd, wxzd, wyzd, wyxd, wzxd, wzyd
8384  real(kind=realtype) :: den, ccr1, fact
8385  real(kind=realtype) :: dend, factd
8386  real(kind=realtype) :: fmx, fmy, fmz, frhoe
8387  real(kind=realtype) :: fmxd, fmyd, fmzd, frhoed
8388  logical :: correctfork, storewalltensor
8389  intrinsic abs
8390  intrinsic mod
8391  intrinsic sqrt
8392  intrinsic max
8393  real(kind=realtype) :: abs0
8394  real(kind=realtype) :: temp
8395  real(kind=realtype) :: tempd
8396  real(kind=realtype) :: temp0
8397  real(kind=realtype) :: tempd0
8398  integer :: branch
8399  real(kind=realtype) :: temp1
8400  real(kind=realtype) :: tempd1
8401 ! set qcr parameters
8402  ccr1 = 0.3_realtype
8403 ! set rfilv to rfil to indicate that this is the viscous part.
8404 ! if rfilv == 0 the viscous residuals need not to be computed
8405 ! and a return can be made.
8406  rfilv = rfil
8407  if (rfilv .ge. 0.) then
8408  abs0 = rfilv
8409  else
8410  abs0 = -rfilv
8411  end if
8412  if (abs0 .lt. thresholdreal) then
8413  if (associated(revd)) revd = 0.0_8
8414  if (associated(aad)) aad = 0.0_8
8415  if (associated(wxd)) wxd = 0.0_8
8416  if (associated(wyd)) wyd = 0.0_8
8417  if (associated(wzd)) wzd = 0.0_8
8418  if (associated(rlvd)) rlvd = 0.0_8
8419  if (associated(qxd)) qxd = 0.0_8
8420  if (associated(qyd)) qyd = 0.0_8
8421  if (associated(qzd)) qzd = 0.0_8
8422  if (associated(uxd)) uxd = 0.0_8
8423  if (associated(uyd)) uyd = 0.0_8
8424  if (associated(uzd)) uzd = 0.0_8
8425  if (associated(vxd)) vxd = 0.0_8
8426  if (associated(vyd)) vyd = 0.0_8
8427  if (associated(vzd)) vzd = 0.0_8
8428  else
8429 ! determine whether or not the wall stress tensor and wall heat
8430 ! flux must be stored for viscous walls.
8431  storewalltensor = .false.
8432  if (wallfunctions) then
8433  call pushcontrol1b(1)
8434  storewalltensor = .true.
8435  else if (rkstage .eq. 0 .and. currentlevel .eq. groundlevel) then
8436  call pushcontrol1b(0)
8437  storewalltensor = .true.
8438  else
8439  call pushcontrol1b(0)
8440  end if
8441  if (associated(revd)) revd = 0.0_8
8442  if (associated(aad)) aad = 0.0_8
8443  if (associated(wxd)) wxd = 0.0_8
8444  if (associated(wyd)) wyd = 0.0_8
8445  if (associated(wzd)) wzd = 0.0_8
8446  if (associated(rlvd)) rlvd = 0.0_8
8447  if (associated(qxd)) qxd = 0.0_8
8448  if (associated(qyd)) qyd = 0.0_8
8449  if (associated(qzd)) qzd = 0.0_8
8450  if (associated(uxd)) uxd = 0.0_8
8451  if (associated(uyd)) uyd = 0.0_8
8452  if (associated(uzd)) uzd = 0.0_8
8453  if (associated(vxd)) vxd = 0.0_8
8454  if (associated(vyd)) vyd = 0.0_8
8455  if (associated(vzd)) vzd = 0.0_8
8456  mued = 0.0_8
8457  mue = zero
8458  if (associated(revd)) revd = 0.0_8
8459  if (associated(aad)) aad = 0.0_8
8460  if (associated(wxd)) wxd = 0.0_8
8461  if (associated(wyd)) wyd = 0.0_8
8462  if (associated(wzd)) wzd = 0.0_8
8463  if (associated(rlvd)) rlvd = 0.0_8
8464  if (associated(qxd)) qxd = 0.0_8
8465  if (associated(qyd)) qyd = 0.0_8
8466  if (associated(qzd)) qzd = 0.0_8
8467  if (associated(uxd)) uxd = 0.0_8
8468  if (associated(uyd)) uyd = 0.0_8
8469  if (associated(uzd)) uzd = 0.0_8
8470  if (associated(vxd)) vxd = 0.0_8
8471  if (associated(vyd)) vyd = 0.0_8
8472  if (associated(vzd)) vzd = 0.0_8
8473  mued = 0.0_8
8474 !$bwd-of ii-loop
8475  do ii=0,il*ny*nz-1
8476  i = mod(ii, il) + 1
8477  j = mod(ii/il, ny) + 2
8478  k = ii/(il*ny) + 2
8479 ! set the value of the porosity. if not zero, it is set
8480 ! to average the eddy-viscosity and to take the factor
8481 ! rfilv into account.
8482  por = half*rfilv
8483  if (pori(i, j, k) .eq. noflux) por = zero
8484 ! compute the laminar and (if present) the eddy viscosities
8485 ! multiplied the porosity. compute the factor in front of
8486 ! the gradients of the speed of sound squared for the heat
8487 ! flux.
8488  mul = por*(rlv(i, j, k)+rlv(i+1, j, k))
8489  if (eddymodel) then
8490  mue = por*(rev(i, j, k)+rev(i+1, j, k))
8491  call pushcontrol1b(0)
8492  else
8493  call pushcontrol1b(1)
8494  end if
8495  mut = mul + mue
8496  gm1 = half*(gamma(i, j, k)+gamma(i+1, j, k)) - one
8497  factlamheat = one/(prandtl*gm1)
8498  factturbheat = one/(prandtlturb*gm1)
8499  heatcoef = mul*factlamheat + mue*factturbheat
8500 ! compute the gradients at the face by averaging the four
8501 ! nodal values.
8502  u_x = fourth*(ux(i, j-1, k-1)+ux(i, j, k-1)+ux(i, j-1, k)+ux(i, &
8503 & j, k))
8504  u_y = fourth*(uy(i, j-1, k-1)+uy(i, j, k-1)+uy(i, j-1, k)+uy(i, &
8505 & j, k))
8506  u_z = fourth*(uz(i, j-1, k-1)+uz(i, j, k-1)+uz(i, j-1, k)+uz(i, &
8507 & j, k))
8508  v_x = fourth*(vx(i, j-1, k-1)+vx(i, j, k-1)+vx(i, j-1, k)+vx(i, &
8509 & j, k))
8510  v_y = fourth*(vy(i, j-1, k-1)+vy(i, j, k-1)+vy(i, j-1, k)+vy(i, &
8511 & j, k))
8512  v_z = fourth*(vz(i, j-1, k-1)+vz(i, j, k-1)+vz(i, j-1, k)+vz(i, &
8513 & j, k))
8514  w_x = fourth*(wx(i, j-1, k-1)+wx(i, j, k-1)+wx(i, j-1, k)+wx(i, &
8515 & j, k))
8516  w_y = fourth*(wy(i, j-1, k-1)+wy(i, j, k-1)+wy(i, j-1, k)+wy(i, &
8517 & j, k))
8518  w_z = fourth*(wz(i, j-1, k-1)+wz(i, j, k-1)+wz(i, j-1, k)+wz(i, &
8519 & j, k))
8520  q_x = fourth*(qx(i, j-1, k-1)+qx(i, j, k-1)+qx(i, j-1, k)+qx(i, &
8521 & j, k))
8522  q_y = fourth*(qy(i, j-1, k-1)+qy(i, j, k-1)+qy(i, j-1, k)+qy(i, &
8523 & j, k))
8524  q_z = fourth*(qz(i, j-1, k-1)+qz(i, j, k-1)+qz(i, j-1, k)+qz(i, &
8525 & j, k))
8526 ! the gradients in the normal direction are corrected, such
8527 ! that no averaging takes places here.
8528 ! first determine the vector in the direction from the
8529 ! cell center i to cell center i+1.
8530  ssx = eighth*(x(i+1, j-1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i+1, j-1&
8531 & , k, 1)-x(i-1, j-1, k, 1)+x(i+1, j, k-1, 1)-x(i-1, j, k-1, 1)+&
8532 & x(i+1, j, k, 1)-x(i-1, j, k, 1))
8533  ssy = eighth*(x(i+1, j-1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i+1, j-1&
8534 & , k, 2)-x(i-1, j-1, k, 2)+x(i+1, j, k-1, 2)-x(i-1, j, k-1, 2)+&
8535 & x(i+1, j, k, 2)-x(i-1, j, k, 2))
8536  ssz = eighth*(x(i+1, j-1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i+1, j-1&
8537 & , k, 3)-x(i-1, j-1, k, 3)+x(i+1, j, k-1, 3)-x(i-1, j, k-1, 3)+&
8538 & x(i+1, j, k, 3)-x(i-1, j, k, 3))
8539 ! determine the length of this vector and create the
8540 ! unit normal.
8541  ss = one/sqrt(ssx*ssx+ssy*ssy+ssz*ssz)
8542  call pushreal8(ssx)
8543  ssx = ss*ssx
8544  call pushreal8(ssy)
8545  ssy = ss*ssy
8546  call pushreal8(ssz)
8547  ssz = ss*ssz
8548 ! correct the gradients.
8549  corr = u_x*ssx + u_y*ssy + u_z*ssz - (w(i+1, j, k, ivx)-w(i, j, &
8550 & k, ivx))*ss
8551  call pushreal8(u_x)
8552  u_x = u_x - corr*ssx
8553  call pushreal8(u_y)
8554  u_y = u_y - corr*ssy
8555  call pushreal8(u_z)
8556  u_z = u_z - corr*ssz
8557  call pushreal8(corr)
8558  corr = v_x*ssx + v_y*ssy + v_z*ssz - (w(i+1, j, k, ivy)-w(i, j, &
8559 & k, ivy))*ss
8560  call pushreal8(v_x)
8561  v_x = v_x - corr*ssx
8562  call pushreal8(v_y)
8563  v_y = v_y - corr*ssy
8564  call pushreal8(v_z)
8565  v_z = v_z - corr*ssz
8566  call pushreal8(corr)
8567  corr = w_x*ssx + w_y*ssy + w_z*ssz - (w(i+1, j, k, ivz)-w(i, j, &
8568 & k, ivz))*ss
8569  call pushreal8(w_x)
8570  w_x = w_x - corr*ssx
8571  call pushreal8(w_y)
8572  w_y = w_y - corr*ssy
8573  call pushreal8(w_z)
8574  w_z = w_z - corr*ssz
8575  call pushreal8(corr)
8576  corr = q_x*ssx + q_y*ssy + q_z*ssz + (aa(i+1, j, k)-aa(i, j, k))&
8577 & *ss
8578  call pushreal8(q_x)
8579  q_x = q_x - corr*ssx
8580  call pushreal8(q_y)
8581  q_y = q_y - corr*ssy
8582  call pushreal8(q_z)
8583  q_z = q_z - corr*ssz
8584 ! compute the stress tensor and the heat flux vector.
8585 ! we remove the viscosity from the stress tensor (tau)
8586 ! to define taus since we still need to separate between
8587 ! laminar and turbulent stress for qcr.
8588 ! therefore, laminar tau = mue*taus, turbulent
8589 ! tau = mue*taus, and total tau = mut*taus.
8590  fracdiv = twothird*(u_x+v_y+w_z)
8591  tauxxs = two*u_x - fracdiv
8592  tauyys = two*v_y - fracdiv
8593  tauzzs = two*w_z - fracdiv
8594  tauxys = u_y + v_x
8595  tauxzs = u_z + w_x
8596  tauyzs = v_z + w_y
8597  call pushreal8(q_x)
8598  q_x = heatcoef*q_x
8599  call pushreal8(q_y)
8600  q_y = heatcoef*q_y
8601  call pushreal8(q_z)
8602  q_z = heatcoef*q_z
8603 ! add qcr corrections if necessary
8604  if (useqcr) then
8605 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
8606 !
8607 ! tau_ij,qcr = tau_ij - e_ij
8608 !
8609 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
8610 !
8611 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
8612 !
8613 ! we are computing o_ik as follows:
8614 !
8615 ! o_ik = 2*w_ik/den
8616 !
8617 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
8618 ! compute denominator
8619  den = sqrt(u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
8620 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z)
8621  if (den .lt. xminn) then
8622  den = xminn
8623  call pushcontrol1b(0)
8624  else
8625  call pushcontrol1b(1)
8626  den = den
8627  end if
8628 ! compute factor that will multiply all tensor components.
8629 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
8630 ! components as well.
8631  fact = mue*ccr1/den
8632 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
8633 ! the diagonals of the vorticity tensor components are always zero
8634  wxy = u_y - v_x
8635  wxz = u_z - w_x
8636  wyz = v_z - w_y
8637  wyx = -wxy
8638  wzx = -wxz
8639  wzy = -wyz
8640 ! compute the extra terms of the boussinesq relation
8641  exx = fact*(wxy*tauxys+wxz*tauxzs)*two
8642  eyy = fact*(wyx*tauxys+wyz*tauyzs)*two
8643  ezz = fact*(wzx*tauxzs+wzy*tauyzs)*two
8644  exy = fact*(wxy*tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)
8645  exz = fact*(wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)
8646  eyz = fact*(wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)
8647 ! apply the total viscosity to the stress tensor and add extra terms
8648  tauxx = mut*tauxxs - exx
8649  tauyy = mut*tauyys - eyy
8650  tauzz = mut*tauzzs - ezz
8651  tauxy = mut*tauxys - exy
8652  tauxz = mut*tauxzs - exz
8653  tauyz = mut*tauyzs - eyz
8654  call pushcontrol1b(0)
8655  else
8656 ! just apply the total viscosity to the stress tensor
8657  tauxx = mut*tauxxs
8658  tauyy = mut*tauyys
8659  tauzz = mut*tauzzs
8660  tauxy = mut*tauxys
8661  tauxz = mut*tauxzs
8662  tauyz = mut*tauyzs
8663  call pushcontrol1b(1)
8664  end if
8665 ! compute the average velocities for the face. remember that
8666 ! the velocities are stored and not the momentum.
8667  ubar = half*(w(i, j, k, ivx)+w(i+1, j, k, ivx))
8668  vbar = half*(w(i, j, k, ivy)+w(i+1, j, k, ivy))
8669  wbar = half*(w(i, j, k, ivz)+w(i+1, j, k, ivz))
8670 ! compute the viscous fluxes for this i-face.
8671 ! update the residuals of cell i and i+1.
8672 ! store the stress tensor and the heat flux vector if this
8673 ! face is part of a viscous subface. both the cases i == 1
8674 ! and i == il must be tested.
8675  if (i .eq. 1 .and. storewalltensor .and. visciminpointer(j, k) &
8676 & .gt. 0) then
8677  call pushcontrol1b(0)
8678  else
8679  call pushcontrol1b(1)
8680  end if
8681 ! and the i == il case.
8682  if (i .eq. il .and. storewalltensor .and. viscimaxpointer(j, k) &
8683 & .gt. 0) then
8684  q_zd = viscsubfaced(viscimaxpointer(j, k))%q(j, k, 3)
8685  viscsubfaced(viscimaxpointer(j, k))%q(j, k, 3) = 0.0_8
8686  q_yd = viscsubfaced(viscimaxpointer(j, k))%q(j, k, 2)
8687  viscsubfaced(viscimaxpointer(j, k))%q(j, k, 2) = 0.0_8
8688  q_xd = viscsubfaced(viscimaxpointer(j, k))%q(j, k, 1)
8689  viscsubfaced(viscimaxpointer(j, k))%q(j, k, 1) = 0.0_8
8690  tauyzd = viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 6)
8691  viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 6) = 0.0_8
8692  tauxzd = viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 5)
8693  viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 5) = 0.0_8
8694  tauxyd = viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 4)
8695  viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 4) = 0.0_8
8696  tauzzd = viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 3)
8697  viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 3) = 0.0_8
8698  tauyyd = viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 2)
8699  viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 2) = 0.0_8
8700  tauxxd = viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 1)
8701  viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 1) = 0.0_8
8702  else
8703  tauzzd = 0.0_8
8704  tauxxd = 0.0_8
8705  tauxyd = 0.0_8
8706  tauxzd = 0.0_8
8707  q_xd = 0.0_8
8708  q_yd = 0.0_8
8709  q_zd = 0.0_8
8710  tauyyd = 0.0_8
8711  tauyzd = 0.0_8
8712  end if
8713  call popcontrol1b(branch)
8714  if (branch .eq. 0) then
8715  q_zd = q_zd + viscsubfaced(visciminpointer(j, k))%q(j, k, 3)
8716  viscsubfaced(visciminpointer(j, k))%q(j, k, 3) = 0.0_8
8717  q_yd = q_yd + viscsubfaced(visciminpointer(j, k))%q(j, k, 2)
8718  viscsubfaced(visciminpointer(j, k))%q(j, k, 2) = 0.0_8
8719  q_xd = q_xd + viscsubfaced(visciminpointer(j, k))%q(j, k, 1)
8720  viscsubfaced(visciminpointer(j, k))%q(j, k, 1) = 0.0_8
8721  tauyzd = tauyzd + viscsubfaced(visciminpointer(j, k))%tau(j, k&
8722 & , 6)
8723  viscsubfaced(visciminpointer(j, k))%tau(j, k, 6) = 0.0_8
8724  tauxzd = tauxzd + viscsubfaced(visciminpointer(j, k))%tau(j, k&
8725 & , 5)
8726  viscsubfaced(visciminpointer(j, k))%tau(j, k, 5) = 0.0_8
8727  tauxyd = tauxyd + viscsubfaced(visciminpointer(j, k))%tau(j, k&
8728 & , 4)
8729  viscsubfaced(visciminpointer(j, k))%tau(j, k, 4) = 0.0_8
8730  tauzzd = tauzzd + viscsubfaced(visciminpointer(j, k))%tau(j, k&
8731 & , 3)
8732  viscsubfaced(visciminpointer(j, k))%tau(j, k, 3) = 0.0_8
8733  tauyyd = tauyyd + viscsubfaced(visciminpointer(j, k))%tau(j, k&
8734 & , 2)
8735  viscsubfaced(visciminpointer(j, k))%tau(j, k, 2) = 0.0_8
8736  tauxxd = tauxxd + viscsubfaced(visciminpointer(j, k))%tau(j, k&
8737 & , 1)
8738  viscsubfaced(visciminpointer(j, k))%tau(j, k, 1) = 0.0_8
8739  end if
8740  frhoed = fwd(i+1, j, k, irhoe) - fwd(i, j, k, irhoe)
8741  fmzd = fwd(i+1, j, k, imz) - fwd(i, j, k, imz)
8742  fmyd = fwd(i+1, j, k, imy) - fwd(i, j, k, imy)
8743  fmxd = fwd(i+1, j, k, imx) - fwd(i, j, k, imx)
8744  tempd1 = si(i, j, k, 1)*frhoed
8745  tempd0 = si(i, j, k, 2)*frhoed
8746  tempd = si(i, j, k, 3)*frhoed
8747  sid(i, j, k, 3) = sid(i, j, k, 3) + (ubar*tauxz+vbar*tauyz+wbar*&
8748 & tauzz-q_z)*frhoed + tauzz*fmzd + tauyz*fmyd + tauxz*fmxd
8749  sid(i, j, k, 2) = sid(i, j, k, 2) + (ubar*tauxy+vbar*tauyy+wbar*&
8750 & tauyz-q_y)*frhoed + tauyz*fmzd + tauyy*fmyd + tauxy*fmxd
8751  sid(i, j, k, 1) = sid(i, j, k, 1) + (ubar*tauxx+vbar*tauxy+wbar*&
8752 & tauxz-q_x)*frhoed + tauxz*fmzd + tauxy*fmyd + tauxx*fmxd
8753  q_xd = q_xd - si(i, j, k, 1)*frhoed
8754  q_yd = q_yd - si(i, j, k, 2)*frhoed
8755  q_zd = q_zd - si(i, j, k, 3)*frhoed
8756  ubard = tauxz*tempd + tauxy*tempd0 + tauxx*tempd1
8757  tauxzd = tauxzd + ubar*tempd + wbar*tempd1 + si(i, j, k, 1)*fmzd&
8758 & + si(i, j, k, 3)*fmxd
8759  vbard = tauyz*tempd + tauyy*tempd0 + tauxy*tempd1
8760  tauyzd = tauyzd + vbar*tempd + wbar*tempd0 + si(i, j, k, 2)*fmzd&
8761 & + si(i, j, k, 3)*fmyd
8762  wbard = tauzz*tempd + tauyz*tempd0 + tauxz*tempd1
8763  tauzzd = tauzzd + wbar*tempd + si(i, j, k, 3)*fmzd
8764  tauxyd = tauxyd + ubar*tempd0 + vbar*tempd1 + si(i, j, k, 1)*&
8765 & fmyd + si(i, j, k, 2)*fmxd
8766  tauyyd = tauyyd + vbar*tempd0 + si(i, j, k, 2)*fmyd
8767  tauxxd = tauxxd + ubar*tempd1 + si(i, j, k, 1)*fmxd
8768  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wbard
8769  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + half*wbard
8770  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vbard
8771  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + half*vbard
8772  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*ubard
8773  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + half*ubard
8774  call popcontrol1b(branch)
8775  if (branch .eq. 0) then
8776  eyzd = -tauyzd
8777  exzd = -tauxzd
8778  tempd1 = fact*eyzd
8779  tauxzsd = mut*tauxzd + wyx*tempd1
8780  tauxysd = mut*tauxyd + wzx*tempd1
8781  tauzzsd = mut*tauzzd + wyz*tempd1
8782  tauyysd = mut*tauyyd + wzy*tempd1
8783  wyxd = tauxzs*tempd1
8784  wyzd = tauzzs*tempd1
8785  wzxd = tauxys*tempd1
8786  wzyd = tauyys*tempd1
8787  tempd1 = fact*exzd
8788  mutd = tauyzs*tauyzd + tauxzs*tauxzd + tauxys*tauxyd + tauzzs*&
8789 & tauzzd + tauyys*tauyyd + tauxxs*tauxxd
8790  tauyzsd = mut*tauyzd + wxy*tempd1
8791  exyd = -tauxyd
8792  ezzd = -tauzzd
8793  eyyd = -tauyyd
8794  tauxxsd = mut*tauxxd + wzx*tempd1
8795  exxd = -tauxxd
8796  factd = (wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)*eyzd + (&
8797 & wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)*exzd + (wxy*&
8798 & tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)*exyd + (wzx*tauxzs+&
8799 & wzy*tauyzs)*two*ezzd + (wyx*tauxys+wyz*tauyzs)*two*eyyd + (&
8800 & wxy*tauxys+wxz*tauxzs)*two*exxd
8801  wxyd = tauyzs*tempd1
8802  wxzd = tauzzs*tempd1
8803  tauzzsd = tauzzsd + wxz*tempd1
8804  wzxd = wzxd + tauxxs*tempd1
8805  wzyd = wzyd + tauxys*tempd1
8806  tauxysd = tauxysd + wzy*tempd1
8807  tempd1 = fact*exyd
8808  wxyd = wxyd + tauyys*tempd1
8809  tauyysd = tauyysd + wxy*tempd1
8810  wxzd = wxzd + tauyzs*tempd1
8811  tauyzsd = tauyzsd + wxz*tempd1
8812  wyxd = wyxd + tauxxs*tempd1
8813  tauxxsd = tauxxsd + wyx*tempd1
8814  wyzd = wyzd + tauxzs*tempd1
8815  tauxzsd = tauxzsd + wyz*tempd1
8816  tempd1 = fact*two*ezzd
8817  wzxd = wzxd + tauxzs*tempd1
8818  tauxzsd = tauxzsd + wzx*tempd1
8819  wzyd = wzyd + tauyzs*tempd1
8820  tauyzsd = tauyzsd + wzy*tempd1
8821  tempd1 = fact*two*eyyd
8822  wyxd = wyxd + tauxys*tempd1
8823  tauxysd = tauxysd + wyx*tempd1
8824  wyzd = wyzd + tauyzs*tempd1 - wzyd
8825  tauyzsd = tauyzsd + wyz*tempd1
8826  tempd1 = fact*two*exxd
8827  wxyd = wxyd + tauxys*tempd1 - wyxd
8828  tauxysd = tauxysd + wxy*tempd1
8829  wxzd = wxzd + tauxzs*tempd1 - wzxd
8830  tauxzsd = tauxzsd + wxz*tempd1
8831  v_zd = wyzd
8832  w_yd = -wyzd
8833  u_zd = wxzd
8834  w_xd = -wxzd
8835  u_yd = wxyd
8836  v_xd = -wxyd
8837  tempd1 = ccr1*factd/den
8838  mued = mued + tempd1
8839  dend = -(mue*tempd1/den)
8840  call popcontrol1b(branch)
8841  if (branch .eq. 0) dend = 0.0_8
8842  if (u_x**2 + u_y**2 + u_z**2 + v_x**2 + v_y**2 + v_z**2 + w_x&
8843 & **2 + w_y**2 + w_z**2 .eq. 0.0_8) then
8844  tempd1 = 0.0_8
8845  else
8846  tempd1 = dend/(2.0*sqrt(u_x**2+u_y**2+u_z**2+v_x**2+v_y**2+&
8847 & v_z**2+w_x**2+w_y**2+w_z**2))
8848  end if
8849  u_xd = 2*u_x*tempd1
8850  u_yd = u_yd + 2*u_y*tempd1
8851  u_zd = u_zd + 2*u_z*tempd1
8852  v_xd = v_xd + 2*v_x*tempd1
8853  v_yd = 2*v_y*tempd1
8854  v_zd = v_zd + 2*v_z*tempd1
8855  w_xd = w_xd + 2*w_x*tempd1
8856  w_yd = w_yd + 2*w_y*tempd1
8857  w_zd = 2*w_z*tempd1
8858  else
8859  mutd = tauyzs*tauyzd + tauxzs*tauxzd + tauxys*tauxyd + tauzzs*&
8860 & tauzzd + tauyys*tauyyd + tauxxs*tauxxd
8861  tauyzsd = mut*tauyzd
8862  tauxzsd = mut*tauxzd
8863  tauxysd = mut*tauxyd
8864  tauzzsd = mut*tauzzd
8865  tauyysd = mut*tauyyd
8866  tauxxsd = mut*tauxxd
8867  u_xd = 0.0_8
8868  u_yd = 0.0_8
8869  u_zd = 0.0_8
8870  w_xd = 0.0_8
8871  w_yd = 0.0_8
8872  w_zd = 0.0_8
8873  v_xd = 0.0_8
8874  v_yd = 0.0_8
8875  v_zd = 0.0_8
8876  end if
8877  fracdivd = -tauzzsd - tauyysd - tauxxsd
8878  tempd1 = twothird*fracdivd
8879  call popreal8(q_z)
8880  call popreal8(q_y)
8881  call popreal8(q_x)
8882  heatcoefd = q_z*q_zd + q_y*q_yd + q_x*q_xd
8883  q_zd = heatcoef*q_zd
8884  q_yd = heatcoef*q_yd
8885  q_xd = heatcoef*q_xd
8886  v_zd = v_zd + tauyzsd
8887  w_yd = w_yd + tauyzsd
8888  u_zd = u_zd + tauxzsd
8889  w_xd = w_xd + tauxzsd
8890  u_yd = u_yd + tauxysd
8891  v_xd = v_xd + tauxysd
8892  w_zd = w_zd + two*tauzzsd + tempd1
8893  v_yd = v_yd + two*tauyysd + tempd1
8894  u_xd = u_xd + two*tauxxsd + tempd1
8895  call popreal8(q_z)
8896  corrd = -(ssz*q_zd) - ssy*q_yd - ssx*q_xd
8897  sszd = q_z*corrd - corr*q_zd
8898  call popreal8(q_y)
8899  ssyd = q_y*corrd - corr*q_yd
8900  call popreal8(q_x)
8901  ssxd = q_x*corrd - corr*q_xd
8902  call popreal8(corr)
8903  q_xd = q_xd + ssx*corrd
8904  q_yd = q_yd + ssy*corrd
8905  q_zd = q_zd + ssz*corrd
8906  aad(i+1, j, k) = aad(i+1, j, k) + ss*corrd
8907  aad(i, j, k) = aad(i, j, k) - ss*corrd
8908  ssd = (aa(i+1, j, k)-aa(i, j, k))*corrd
8909  call popreal8(w_z)
8910  corrd = -(ssz*w_zd) - ssy*w_yd - ssx*w_xd
8911  sszd = sszd + w_z*corrd - corr*w_zd
8912  call popreal8(w_y)
8913  ssyd = ssyd + w_y*corrd - corr*w_yd
8914  call popreal8(w_x)
8915  ssxd = ssxd + w_x*corrd - corr*w_xd
8916  call popreal8(corr)
8917  w_xd = w_xd + ssx*corrd
8918  w_yd = w_yd + ssy*corrd
8919  w_zd = w_zd + ssz*corrd
8920  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) - ss*corrd
8921  wd(i, j, k, ivz) = wd(i, j, k, ivz) + ss*corrd
8922  ssd = ssd - (w(i+1, j, k, ivz)-w(i, j, k, ivz))*corrd
8923  call popreal8(v_z)
8924  corrd = -(ssz*v_zd) - ssy*v_yd - ssx*v_xd
8925  sszd = sszd + v_z*corrd - corr*v_zd
8926  call popreal8(v_y)
8927  ssyd = ssyd + v_y*corrd - corr*v_yd
8928  call popreal8(v_x)
8929  ssxd = ssxd + v_x*corrd - corr*v_xd
8930  call popreal8(corr)
8931  v_xd = v_xd + ssx*corrd
8932  v_yd = v_yd + ssy*corrd
8933  v_zd = v_zd + ssz*corrd
8934  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) - ss*corrd
8935  wd(i, j, k, ivy) = wd(i, j, k, ivy) + ss*corrd
8936  ssd = ssd - (w(i+1, j, k, ivy)-w(i, j, k, ivy))*corrd
8937  call popreal8(u_z)
8938  corrd = -(ssz*u_zd) - ssy*u_yd - ssx*u_xd
8939  sszd = sszd + u_z*corrd - corr*u_zd
8940  call popreal8(u_y)
8941  ssyd = ssyd + u_y*corrd - corr*u_yd
8942  call popreal8(u_x)
8943  ssxd = ssxd + u_x*corrd - corr*u_xd
8944  u_xd = u_xd + ssx*corrd
8945  u_yd = u_yd + ssy*corrd
8946  u_zd = u_zd + ssz*corrd
8947  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) - ss*corrd
8948  wd(i, j, k, ivx) = wd(i, j, k, ivx) + ss*corrd
8949  call popreal8(ssz)
8950  call popreal8(ssy)
8951  call popreal8(ssx)
8952  ssd = ssd + ssz*sszd - (w(i+1, j, k, ivx)-w(i, j, k, ivx))*corrd&
8953 & + ssy*ssyd + ssx*ssxd
8954  temp1 = ssx*ssx + ssy*ssy + ssz*ssz
8955  temp0 = sqrt(temp1)
8956  if (temp1 .eq. 0.0_8) then
8957  tempd1 = 0.0_8
8958  else
8959  tempd1 = -(one*ssd/(2.0*temp0**3))
8960  end if
8961  sszd = ss*sszd + 2*ssz*tempd1
8962  ssyd = ss*ssyd + 2*ssy*tempd1
8963  ssxd = ss*ssxd + 2*ssx*tempd1
8964  tempd1 = eighth*sszd
8965  xd(i+1, j-1, k-1, 3) = xd(i+1, j-1, k-1, 3) + tempd1
8966  xd(i-1, j-1, k-1, 3) = xd(i-1, j-1, k-1, 3) - tempd1
8967  xd(i+1, j-1, k, 3) = xd(i+1, j-1, k, 3) + tempd1
8968  xd(i-1, j-1, k, 3) = xd(i-1, j-1, k, 3) - tempd1
8969  xd(i+1, j, k-1, 3) = xd(i+1, j, k-1, 3) + tempd1
8970  xd(i-1, j, k-1, 3) = xd(i-1, j, k-1, 3) - tempd1
8971  xd(i+1, j, k, 3) = xd(i+1, j, k, 3) + tempd1
8972  xd(i-1, j, k, 3) = xd(i-1, j, k, 3) - tempd1
8973  tempd1 = eighth*ssyd
8974  xd(i+1, j-1, k-1, 2) = xd(i+1, j-1, k-1, 2) + tempd1
8975  xd(i-1, j-1, k-1, 2) = xd(i-1, j-1, k-1, 2) - tempd1
8976  xd(i+1, j-1, k, 2) = xd(i+1, j-1, k, 2) + tempd1
8977  xd(i-1, j-1, k, 2) = xd(i-1, j-1, k, 2) - tempd1
8978  xd(i+1, j, k-1, 2) = xd(i+1, j, k-1, 2) + tempd1
8979  xd(i-1, j, k-1, 2) = xd(i-1, j, k-1, 2) - tempd1
8980  xd(i+1, j, k, 2) = xd(i+1, j, k, 2) + tempd1
8981  xd(i-1, j, k, 2) = xd(i-1, j, k, 2) - tempd1
8982  tempd1 = eighth*ssxd
8983  xd(i+1, j-1, k-1, 1) = xd(i+1, j-1, k-1, 1) + tempd1
8984  xd(i-1, j-1, k-1, 1) = xd(i-1, j-1, k-1, 1) - tempd1
8985  xd(i+1, j-1, k, 1) = xd(i+1, j-1, k, 1) + tempd1
8986  xd(i-1, j-1, k, 1) = xd(i-1, j-1, k, 1) - tempd1
8987  xd(i+1, j, k-1, 1) = xd(i+1, j, k-1, 1) + tempd1
8988  xd(i-1, j, k-1, 1) = xd(i-1, j, k-1, 1) - tempd1
8989  xd(i+1, j, k, 1) = xd(i+1, j, k, 1) + tempd1
8990  xd(i-1, j, k, 1) = xd(i-1, j, k, 1) - tempd1
8991  tempd1 = fourth*q_zd
8992  qzd(i, j-1, k-1) = qzd(i, j-1, k-1) + tempd1
8993  qzd(i, j, k-1) = qzd(i, j, k-1) + tempd1
8994  qzd(i, j-1, k) = qzd(i, j-1, k) + tempd1
8995  qzd(i, j, k) = qzd(i, j, k) + tempd1
8996  tempd1 = fourth*q_yd
8997  qyd(i, j-1, k-1) = qyd(i, j-1, k-1) + tempd1
8998  qyd(i, j, k-1) = qyd(i, j, k-1) + tempd1
8999  qyd(i, j-1, k) = qyd(i, j-1, k) + tempd1
9000  qyd(i, j, k) = qyd(i, j, k) + tempd1
9001  tempd1 = fourth*q_xd
9002  qxd(i, j-1, k-1) = qxd(i, j-1, k-1) + tempd1
9003  qxd(i, j, k-1) = qxd(i, j, k-1) + tempd1
9004  qxd(i, j-1, k) = qxd(i, j-1, k) + tempd1
9005  qxd(i, j, k) = qxd(i, j, k) + tempd1
9006  tempd1 = fourth*w_zd
9007  wzd(i, j-1, k-1) = wzd(i, j-1, k-1) + tempd1
9008  wzd(i, j, k-1) = wzd(i, j, k-1) + tempd1
9009  wzd(i, j-1, k) = wzd(i, j-1, k) + tempd1
9010  wzd(i, j, k) = wzd(i, j, k) + tempd1
9011  tempd1 = fourth*w_yd
9012  wyd(i, j-1, k-1) = wyd(i, j-1, k-1) + tempd1
9013  wyd(i, j, k-1) = wyd(i, j, k-1) + tempd1
9014  wyd(i, j-1, k) = wyd(i, j-1, k) + tempd1
9015  wyd(i, j, k) = wyd(i, j, k) + tempd1
9016  tempd1 = fourth*w_xd
9017  wxd(i, j-1, k-1) = wxd(i, j-1, k-1) + tempd1
9018  wxd(i, j, k-1) = wxd(i, j, k-1) + tempd1
9019  wxd(i, j-1, k) = wxd(i, j-1, k) + tempd1
9020  wxd(i, j, k) = wxd(i, j, k) + tempd1
9021  tempd1 = fourth*v_zd
9022  vzd(i, j-1, k-1) = vzd(i, j-1, k-1) + tempd1
9023  vzd(i, j, k-1) = vzd(i, j, k-1) + tempd1
9024  vzd(i, j-1, k) = vzd(i, j-1, k) + tempd1
9025  vzd(i, j, k) = vzd(i, j, k) + tempd1
9026  tempd1 = fourth*v_yd
9027  vyd(i, j-1, k-1) = vyd(i, j-1, k-1) + tempd1
9028  vyd(i, j, k-1) = vyd(i, j, k-1) + tempd1
9029  vyd(i, j-1, k) = vyd(i, j-1, k) + tempd1
9030  vyd(i, j, k) = vyd(i, j, k) + tempd1
9031  tempd1 = fourth*v_xd
9032  vxd(i, j-1, k-1) = vxd(i, j-1, k-1) + tempd1
9033  vxd(i, j, k-1) = vxd(i, j, k-1) + tempd1
9034  vxd(i, j-1, k) = vxd(i, j-1, k) + tempd1
9035  vxd(i, j, k) = vxd(i, j, k) + tempd1
9036  tempd1 = fourth*u_zd
9037  uzd(i, j-1, k-1) = uzd(i, j-1, k-1) + tempd1
9038  uzd(i, j, k-1) = uzd(i, j, k-1) + tempd1
9039  uzd(i, j-1, k) = uzd(i, j-1, k) + tempd1
9040  uzd(i, j, k) = uzd(i, j, k) + tempd1
9041  tempd1 = fourth*u_yd
9042  uyd(i, j-1, k-1) = uyd(i, j-1, k-1) + tempd1
9043  uyd(i, j, k-1) = uyd(i, j, k-1) + tempd1
9044  uyd(i, j-1, k) = uyd(i, j-1, k) + tempd1
9045  uyd(i, j, k) = uyd(i, j, k) + tempd1
9046  tempd1 = fourth*u_xd
9047  uxd(i, j-1, k-1) = uxd(i, j-1, k-1) + tempd1
9048  uxd(i, j, k-1) = uxd(i, j, k-1) + tempd1
9049  uxd(i, j-1, k) = uxd(i, j-1, k) + tempd1
9050  uxd(i, j, k) = uxd(i, j, k) + tempd1
9051  muld = factlamheat*heatcoefd + mutd
9052  mued = mued + factturbheat*heatcoefd + mutd
9053  call popcontrol1b(branch)
9054  if (branch .eq. 0) then
9055  revd(i, j, k) = revd(i, j, k) + por*mued
9056  revd(i+1, j, k) = revd(i+1, j, k) + por*mued
9057  mued = 0.0_8
9058  end if
9059  rlvd(i, j, k) = rlvd(i, j, k) + por*muld
9060  rlvd(i+1, j, k) = rlvd(i+1, j, k) + por*muld
9061  end do
9062  mued = 0.0_8
9063  mue = zero
9064  mued = 0.0_8
9065 !$bwd-of ii-loop
9066  do ii=0,nx*jl*nz-1
9067  i = mod(ii, nx) + 2
9068  j = mod(ii/nx, jl) + 1
9069  k = ii/(nx*jl) + 2
9070 ! set the value of the porosity. if not zero, it is set
9071 ! to average the eddy-viscosity and to take the factor
9072 ! rfilv into account.
9073  por = half*rfilv
9074  if (porj(i, j, k) .eq. noflux) por = zero
9075 ! compute the laminar and (if present) the eddy viscosities
9076 ! multiplied by the porosity. compute the factor in front of
9077 ! the gradients of the speed of sound squared for the heat
9078 ! flux.
9079  mul = por*(rlv(i, j, k)+rlv(i, j+1, k))
9080  if (eddymodel) then
9081  mue = por*(rev(i, j, k)+rev(i, j+1, k))
9082  call pushcontrol1b(0)
9083  else
9084  call pushcontrol1b(1)
9085  end if
9086  mut = mul + mue
9087  gm1 = half*(gamma(i, j, k)+gamma(i, j+1, k)) - one
9088  factlamheat = one/(prandtl*gm1)
9089  factturbheat = one/(prandtlturb*gm1)
9090  heatcoef = mul*factlamheat + mue*factturbheat
9091 ! compute the gradients at the face by averaging the four
9092 ! nodal values.
9093  u_x = fourth*(ux(i-1, j, k-1)+ux(i, j, k-1)+ux(i-1, j, k)+ux(i, &
9094 & j, k))
9095  u_y = fourth*(uy(i-1, j, k-1)+uy(i, j, k-1)+uy(i-1, j, k)+uy(i, &
9096 & j, k))
9097  u_z = fourth*(uz(i-1, j, k-1)+uz(i, j, k-1)+uz(i-1, j, k)+uz(i, &
9098 & j, k))
9099  v_x = fourth*(vx(i-1, j, k-1)+vx(i, j, k-1)+vx(i-1, j, k)+vx(i, &
9100 & j, k))
9101  v_y = fourth*(vy(i-1, j, k-1)+vy(i, j, k-1)+vy(i-1, j, k)+vy(i, &
9102 & j, k))
9103  v_z = fourth*(vz(i-1, j, k-1)+vz(i, j, k-1)+vz(i-1, j, k)+vz(i, &
9104 & j, k))
9105  w_x = fourth*(wx(i-1, j, k-1)+wx(i, j, k-1)+wx(i-1, j, k)+wx(i, &
9106 & j, k))
9107  w_y = fourth*(wy(i-1, j, k-1)+wy(i, j, k-1)+wy(i-1, j, k)+wy(i, &
9108 & j, k))
9109  w_z = fourth*(wz(i-1, j, k-1)+wz(i, j, k-1)+wz(i-1, j, k)+wz(i, &
9110 & j, k))
9111  q_x = fourth*(qx(i-1, j, k-1)+qx(i, j, k-1)+qx(i-1, j, k)+qx(i, &
9112 & j, k))
9113  q_y = fourth*(qy(i-1, j, k-1)+qy(i, j, k-1)+qy(i-1, j, k)+qy(i, &
9114 & j, k))
9115  q_z = fourth*(qz(i-1, j, k-1)+qz(i, j, k-1)+qz(i-1, j, k)+qz(i, &
9116 & j, k))
9117 ! the gradients in the normal direction are corrected, such
9118 ! that no averaging takes places here.
9119 ! first determine the vector in the direction from the
9120 ! cell center j to cell center j+1.
9121  ssx = eighth*(x(i-1, j+1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j+1&
9122 & , k, 1)-x(i-1, j-1, k, 1)+x(i, j+1, k-1, 1)-x(i, j-1, k-1, 1)+&
9123 & x(i, j+1, k, 1)-x(i, j-1, k, 1))
9124  ssy = eighth*(x(i-1, j+1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j+1&
9125 & , k, 2)-x(i-1, j-1, k, 2)+x(i, j+1, k-1, 2)-x(i, j-1, k-1, 2)+&
9126 & x(i, j+1, k, 2)-x(i, j-1, k, 2))
9127  ssz = eighth*(x(i-1, j+1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j+1&
9128 & , k, 3)-x(i-1, j-1, k, 3)+x(i, j+1, k-1, 3)-x(i, j-1, k-1, 3)+&
9129 & x(i, j+1, k, 3)-x(i, j-1, k, 3))
9130 ! determine the length of this vector and create the
9131 ! unit normal.
9132  ss = one/sqrt(ssx*ssx+ssy*ssy+ssz*ssz)
9133  call pushreal8(ssx)
9134  ssx = ss*ssx
9135  call pushreal8(ssy)
9136  ssy = ss*ssy
9137  call pushreal8(ssz)
9138  ssz = ss*ssz
9139 ! correct the gradients.
9140  corr = u_x*ssx + u_y*ssy + u_z*ssz - (w(i, j+1, k, ivx)-w(i, j, &
9141 & k, ivx))*ss
9142  call pushreal8(u_x)
9143  u_x = u_x - corr*ssx
9144  call pushreal8(u_y)
9145  u_y = u_y - corr*ssy
9146  call pushreal8(u_z)
9147  u_z = u_z - corr*ssz
9148  call pushreal8(corr)
9149  corr = v_x*ssx + v_y*ssy + v_z*ssz - (w(i, j+1, k, ivy)-w(i, j, &
9150 & k, ivy))*ss
9151  call pushreal8(v_x)
9152  v_x = v_x - corr*ssx
9153  call pushreal8(v_y)
9154  v_y = v_y - corr*ssy
9155  call pushreal8(v_z)
9156  v_z = v_z - corr*ssz
9157  call pushreal8(corr)
9158  corr = w_x*ssx + w_y*ssy + w_z*ssz - (w(i, j+1, k, ivz)-w(i, j, &
9159 & k, ivz))*ss
9160  call pushreal8(w_x)
9161  w_x = w_x - corr*ssx
9162  call pushreal8(w_y)
9163  w_y = w_y - corr*ssy
9164  call pushreal8(w_z)
9165  w_z = w_z - corr*ssz
9166  call pushreal8(corr)
9167  corr = q_x*ssx + q_y*ssy + q_z*ssz + (aa(i, j+1, k)-aa(i, j, k))&
9168 & *ss
9169  call pushreal8(q_x)
9170  q_x = q_x - corr*ssx
9171  call pushreal8(q_y)
9172  q_y = q_y - corr*ssy
9173  call pushreal8(q_z)
9174  q_z = q_z - corr*ssz
9175 ! compute the stress tensor and the heat flux vector.
9176 ! we remove the viscosity from the stress tensor (tau)
9177 ! to define taus since we still need to separate between
9178 ! laminar and turbulent stress for qcr.
9179 ! therefore, laminar tau = mue*taus, turbulent
9180 ! tau = mue*taus, and total tau = mut*taus.
9181  fracdiv = twothird*(u_x+v_y+w_z)
9182  tauxxs = two*u_x - fracdiv
9183  tauyys = two*v_y - fracdiv
9184  tauzzs = two*w_z - fracdiv
9185  tauxys = u_y + v_x
9186  tauxzs = u_z + w_x
9187  tauyzs = v_z + w_y
9188  call pushreal8(q_x)
9189  q_x = heatcoef*q_x
9190  call pushreal8(q_y)
9191  q_y = heatcoef*q_y
9192  call pushreal8(q_z)
9193  q_z = heatcoef*q_z
9194 ! add qcr corrections if necessary
9195  if (useqcr) then
9196 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
9197 !
9198 ! tau_ij,qcr = tau_ij - e_ij
9199 !
9200 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
9201 !
9202 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
9203 !
9204 ! we are computing o_ik as follows:
9205 !
9206 ! o_ik = 2*w_ik/den
9207 !
9208 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
9209 ! compute denominator
9210  den = sqrt(u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
9211 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z)
9212  if (den .lt. xminn) then
9213  den = xminn
9214  call pushcontrol1b(0)
9215  else
9216  call pushcontrol1b(1)
9217  den = den
9218  end if
9219 ! compute factor that will multiply all tensor components.
9220 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
9221 ! components as well.
9222  fact = mue*ccr1/den
9223 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
9224 ! the diagonals of the vorticity tensor components are always zero
9225  wxy = u_y - v_x
9226  wxz = u_z - w_x
9227  wyz = v_z - w_y
9228  wyx = -wxy
9229  wzx = -wxz
9230  wzy = -wyz
9231 ! compute the extra terms of the boussinesq relation
9232  exx = fact*(wxy*tauxys+wxz*tauxzs)*two
9233  eyy = fact*(wyx*tauxys+wyz*tauyzs)*two
9234  ezz = fact*(wzx*tauxzs+wzy*tauyzs)*two
9235  exy = fact*(wxy*tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)
9236  exz = fact*(wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)
9237  eyz = fact*(wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)
9238 ! apply the total viscosity to the stress tensor and add extra terms
9239  tauxx = mut*tauxxs - exx
9240  tauyy = mut*tauyys - eyy
9241  tauzz = mut*tauzzs - ezz
9242  tauxy = mut*tauxys - exy
9243  tauxz = mut*tauxzs - exz
9244  tauyz = mut*tauyzs - eyz
9245  call pushcontrol1b(0)
9246  else
9247 ! just apply the total viscosity to the stress tensor
9248  tauxx = mut*tauxxs
9249  tauyy = mut*tauyys
9250  tauzz = mut*tauzzs
9251  tauxy = mut*tauxys
9252  tauxz = mut*tauxzs
9253  tauyz = mut*tauyzs
9254  call pushcontrol1b(1)
9255  end if
9256 ! compute the average velocities for the face. remember that
9257 ! the velocities are stored and not the momentum.
9258  ubar = half*(w(i, j, k, ivx)+w(i, j+1, k, ivx))
9259  vbar = half*(w(i, j, k, ivy)+w(i, j+1, k, ivy))
9260  wbar = half*(w(i, j, k, ivz)+w(i, j+1, k, ivz))
9261 ! compute the viscous fluxes for this j-face.
9262 ! update the residuals of cell j and j+1.
9263 ! store the stress tensor and the heat flux vector if this
9264 ! face is part of a viscous subface. both the cases j == 1
9265 ! and j == jl must be tested.
9266  if (j .eq. 1 .and. storewalltensor .and. viscjminpointer(i, k) &
9267 & .gt. 0) then
9268  call pushcontrol1b(0)
9269  else
9270  call pushcontrol1b(1)
9271  end if
9272 ! and the j == jl case.
9273  if (j .eq. jl .and. storewalltensor .and. viscjmaxpointer(i, k) &
9274 & .gt. 0) then
9275  q_zd = viscsubfaced(viscjmaxpointer(i, k))%q(i, k, 3)
9276  viscsubfaced(viscjmaxpointer(i, k))%q(i, k, 3) = 0.0_8
9277  q_yd = viscsubfaced(viscjmaxpointer(i, k))%q(i, k, 2)
9278  viscsubfaced(viscjmaxpointer(i, k))%q(i, k, 2) = 0.0_8
9279  q_xd = viscsubfaced(viscjmaxpointer(i, k))%q(i, k, 1)
9280  viscsubfaced(viscjmaxpointer(i, k))%q(i, k, 1) = 0.0_8
9281  tauyzd = viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 6)
9282  viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 6) = 0.0_8
9283  tauxzd = viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 5)
9284  viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 5) = 0.0_8
9285  tauxyd = viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 4)
9286  viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 4) = 0.0_8
9287  tauzzd = viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 3)
9288  viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 3) = 0.0_8
9289  tauyyd = viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 2)
9290  viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 2) = 0.0_8
9291  tauxxd = viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 1)
9292  viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 1) = 0.0_8
9293  else
9294  tauzzd = 0.0_8
9295  tauxxd = 0.0_8
9296  tauxyd = 0.0_8
9297  tauxzd = 0.0_8
9298  q_xd = 0.0_8
9299  q_yd = 0.0_8
9300  q_zd = 0.0_8
9301  tauyyd = 0.0_8
9302  tauyzd = 0.0_8
9303  end if
9304  call popcontrol1b(branch)
9305  if (branch .eq. 0) then
9306  q_zd = q_zd + viscsubfaced(viscjminpointer(i, k))%q(i, k, 3)
9307  viscsubfaced(viscjminpointer(i, k))%q(i, k, 3) = 0.0_8
9308  q_yd = q_yd + viscsubfaced(viscjminpointer(i, k))%q(i, k, 2)
9309  viscsubfaced(viscjminpointer(i, k))%q(i, k, 2) = 0.0_8
9310  q_xd = q_xd + viscsubfaced(viscjminpointer(i, k))%q(i, k, 1)
9311  viscsubfaced(viscjminpointer(i, k))%q(i, k, 1) = 0.0_8
9312  tauyzd = tauyzd + viscsubfaced(viscjminpointer(i, k))%tau(i, k&
9313 & , 6)
9314  viscsubfaced(viscjminpointer(i, k))%tau(i, k, 6) = 0.0_8
9315  tauxzd = tauxzd + viscsubfaced(viscjminpointer(i, k))%tau(i, k&
9316 & , 5)
9317  viscsubfaced(viscjminpointer(i, k))%tau(i, k, 5) = 0.0_8
9318  tauxyd = tauxyd + viscsubfaced(viscjminpointer(i, k))%tau(i, k&
9319 & , 4)
9320  viscsubfaced(viscjminpointer(i, k))%tau(i, k, 4) = 0.0_8
9321  tauzzd = tauzzd + viscsubfaced(viscjminpointer(i, k))%tau(i, k&
9322 & , 3)
9323  viscsubfaced(viscjminpointer(i, k))%tau(i, k, 3) = 0.0_8
9324  tauyyd = tauyyd + viscsubfaced(viscjminpointer(i, k))%tau(i, k&
9325 & , 2)
9326  viscsubfaced(viscjminpointer(i, k))%tau(i, k, 2) = 0.0_8
9327  tauxxd = tauxxd + viscsubfaced(viscjminpointer(i, k))%tau(i, k&
9328 & , 1)
9329  viscsubfaced(viscjminpointer(i, k))%tau(i, k, 1) = 0.0_8
9330  end if
9331  frhoed = fwd(i, j+1, k, irhoe) - fwd(i, j, k, irhoe)
9332  fmzd = fwd(i, j+1, k, imz) - fwd(i, j, k, imz)
9333  fmyd = fwd(i, j+1, k, imy) - fwd(i, j, k, imy)
9334  fmxd = fwd(i, j+1, k, imx) - fwd(i, j, k, imx)
9335  tempd0 = sj(i, j, k, 1)*frhoed
9336  tempd = sj(i, j, k, 2)*frhoed
9337  tempd1 = sj(i, j, k, 3)*frhoed
9338  sjd(i, j, k, 3) = sjd(i, j, k, 3) + (ubar*tauxz+vbar*tauyz+wbar*&
9339 & tauzz-q_z)*frhoed + tauzz*fmzd + tauyz*fmyd + tauxz*fmxd
9340  sjd(i, j, k, 2) = sjd(i, j, k, 2) + (ubar*tauxy+vbar*tauyy+wbar*&
9341 & tauyz-q_y)*frhoed + tauyz*fmzd + tauyy*fmyd + tauxy*fmxd
9342  sjd(i, j, k, 1) = sjd(i, j, k, 1) + (ubar*tauxx+vbar*tauxy+wbar*&
9343 & tauxz-q_x)*frhoed + tauxz*fmzd + tauxy*fmyd + tauxx*fmxd
9344  q_xd = q_xd - sj(i, j, k, 1)*frhoed
9345  q_yd = q_yd - sj(i, j, k, 2)*frhoed
9346  q_zd = q_zd - sj(i, j, k, 3)*frhoed
9347  ubard = tauxz*tempd1 + tauxy*tempd + tauxx*tempd0
9348  tauxzd = tauxzd + ubar*tempd1 + wbar*tempd0 + sj(i, j, k, 1)*&
9349 & fmzd + sj(i, j, k, 3)*fmxd
9350  vbard = tauyz*tempd1 + tauyy*tempd + tauxy*tempd0
9351  tauyzd = tauyzd + vbar*tempd1 + wbar*tempd + sj(i, j, k, 2)*fmzd&
9352 & + sj(i, j, k, 3)*fmyd
9353  wbard = tauzz*tempd1 + tauyz*tempd + tauxz*tempd0
9354  tauzzd = tauzzd + wbar*tempd1 + sj(i, j, k, 3)*fmzd
9355  tauxyd = tauxyd + ubar*tempd + vbar*tempd0 + sj(i, j, k, 1)*fmyd&
9356 & + sj(i, j, k, 2)*fmxd
9357  tauyyd = tauyyd + vbar*tempd + sj(i, j, k, 2)*fmyd
9358  tauxxd = tauxxd + ubar*tempd0 + sj(i, j, k, 1)*fmxd
9359  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wbard
9360  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + half*wbard
9361  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vbard
9362  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + half*vbard
9363  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*ubard
9364  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + half*ubard
9365  call popcontrol1b(branch)
9366  if (branch .eq. 0) then
9367  eyzd = -tauyzd
9368  exzd = -tauxzd
9369  tempd0 = fact*eyzd
9370  tauxzsd = mut*tauxzd + wyx*tempd0
9371  tauxysd = mut*tauxyd + wzx*tempd0
9372  tauzzsd = mut*tauzzd + wyz*tempd0
9373  tauyysd = mut*tauyyd + wzy*tempd0
9374  wyxd = tauxzs*tempd0
9375  wyzd = tauzzs*tempd0
9376  wzxd = tauxys*tempd0
9377  wzyd = tauyys*tempd0
9378  tempd0 = fact*exzd
9379  mutd = tauyzs*tauyzd + tauxzs*tauxzd + tauxys*tauxyd + tauzzs*&
9380 & tauzzd + tauyys*tauyyd + tauxxs*tauxxd
9381  tauyzsd = mut*tauyzd + wxy*tempd0
9382  exyd = -tauxyd
9383  ezzd = -tauzzd
9384  eyyd = -tauyyd
9385  tauxxsd = mut*tauxxd + wzx*tempd0
9386  exxd = -tauxxd
9387  factd = (wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)*eyzd + (&
9388 & wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)*exzd + (wxy*&
9389 & tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)*exyd + (wzx*tauxzs+&
9390 & wzy*tauyzs)*two*ezzd + (wyx*tauxys+wyz*tauyzs)*two*eyyd + (&
9391 & wxy*tauxys+wxz*tauxzs)*two*exxd
9392  wxyd = tauyzs*tempd0
9393  wxzd = tauzzs*tempd0
9394  tauzzsd = tauzzsd + wxz*tempd0
9395  wzxd = wzxd + tauxxs*tempd0
9396  wzyd = wzyd + tauxys*tempd0
9397  tauxysd = tauxysd + wzy*tempd0
9398  tempd0 = fact*exyd
9399  wxyd = wxyd + tauyys*tempd0
9400  tauyysd = tauyysd + wxy*tempd0
9401  wxzd = wxzd + tauyzs*tempd0
9402  tauyzsd = tauyzsd + wxz*tempd0
9403  wyxd = wyxd + tauxxs*tempd0
9404  tauxxsd = tauxxsd + wyx*tempd0
9405  wyzd = wyzd + tauxzs*tempd0
9406  tauxzsd = tauxzsd + wyz*tempd0
9407  tempd0 = fact*two*ezzd
9408  wzxd = wzxd + tauxzs*tempd0
9409  tauxzsd = tauxzsd + wzx*tempd0
9410  wzyd = wzyd + tauyzs*tempd0
9411  tauyzsd = tauyzsd + wzy*tempd0
9412  tempd0 = fact*two*eyyd
9413  wyxd = wyxd + tauxys*tempd0
9414  tauxysd = tauxysd + wyx*tempd0
9415  wyzd = wyzd + tauyzs*tempd0 - wzyd
9416  tauyzsd = tauyzsd + wyz*tempd0
9417  tempd0 = fact*two*exxd
9418  wxyd = wxyd + tauxys*tempd0 - wyxd
9419  tauxysd = tauxysd + wxy*tempd0
9420  wxzd = wxzd + tauxzs*tempd0 - wzxd
9421  tauxzsd = tauxzsd + wxz*tempd0
9422  v_zd = wyzd
9423  w_yd = -wyzd
9424  u_zd = wxzd
9425  w_xd = -wxzd
9426  u_yd = wxyd
9427  v_xd = -wxyd
9428  tempd0 = ccr1*factd/den
9429  mued = mued + tempd0
9430  dend = -(mue*tempd0/den)
9431  call popcontrol1b(branch)
9432  if (branch .eq. 0) dend = 0.0_8
9433  if (u_x**2 + u_y**2 + u_z**2 + v_x**2 + v_y**2 + v_z**2 + w_x&
9434 & **2 + w_y**2 + w_z**2 .eq. 0.0_8) then
9435  tempd0 = 0.0_8
9436  else
9437  tempd0 = dend/(2.0*sqrt(u_x**2+u_y**2+u_z**2+v_x**2+v_y**2+&
9438 & v_z**2+w_x**2+w_y**2+w_z**2))
9439  end if
9440  u_xd = 2*u_x*tempd0
9441  u_yd = u_yd + 2*u_y*tempd0
9442  u_zd = u_zd + 2*u_z*tempd0
9443  v_xd = v_xd + 2*v_x*tempd0
9444  v_yd = 2*v_y*tempd0
9445  v_zd = v_zd + 2*v_z*tempd0
9446  w_xd = w_xd + 2*w_x*tempd0
9447  w_yd = w_yd + 2*w_y*tempd0
9448  w_zd = 2*w_z*tempd0
9449  else
9450  mutd = tauyzs*tauyzd + tauxzs*tauxzd + tauxys*tauxyd + tauzzs*&
9451 & tauzzd + tauyys*tauyyd + tauxxs*tauxxd
9452  tauyzsd = mut*tauyzd
9453  tauxzsd = mut*tauxzd
9454  tauxysd = mut*tauxyd
9455  tauzzsd = mut*tauzzd
9456  tauyysd = mut*tauyyd
9457  tauxxsd = mut*tauxxd
9458  u_xd = 0.0_8
9459  u_yd = 0.0_8
9460  u_zd = 0.0_8
9461  w_xd = 0.0_8
9462  w_yd = 0.0_8
9463  w_zd = 0.0_8
9464  v_xd = 0.0_8
9465  v_yd = 0.0_8
9466  v_zd = 0.0_8
9467  end if
9468  fracdivd = -tauzzsd - tauyysd - tauxxsd
9469  tempd0 = twothird*fracdivd
9470  call popreal8(q_z)
9471  call popreal8(q_y)
9472  call popreal8(q_x)
9473  heatcoefd = q_z*q_zd + q_y*q_yd + q_x*q_xd
9474  q_zd = heatcoef*q_zd
9475  q_yd = heatcoef*q_yd
9476  q_xd = heatcoef*q_xd
9477  v_zd = v_zd + tauyzsd
9478  w_yd = w_yd + tauyzsd
9479  u_zd = u_zd + tauxzsd
9480  w_xd = w_xd + tauxzsd
9481  u_yd = u_yd + tauxysd
9482  v_xd = v_xd + tauxysd
9483  w_zd = w_zd + two*tauzzsd + tempd0
9484  v_yd = v_yd + two*tauyysd + tempd0
9485  u_xd = u_xd + two*tauxxsd + tempd0
9486  call popreal8(q_z)
9487  corrd = -(ssz*q_zd) - ssy*q_yd - ssx*q_xd
9488  sszd = q_z*corrd - corr*q_zd
9489  call popreal8(q_y)
9490  ssyd = q_y*corrd - corr*q_yd
9491  call popreal8(q_x)
9492  ssxd = q_x*corrd - corr*q_xd
9493  call popreal8(corr)
9494  q_xd = q_xd + ssx*corrd
9495  q_yd = q_yd + ssy*corrd
9496  q_zd = q_zd + ssz*corrd
9497  aad(i, j+1, k) = aad(i, j+1, k) + ss*corrd
9498  aad(i, j, k) = aad(i, j, k) - ss*corrd
9499  ssd = (aa(i, j+1, k)-aa(i, j, k))*corrd
9500  call popreal8(w_z)
9501  corrd = -(ssz*w_zd) - ssy*w_yd - ssx*w_xd
9502  sszd = sszd + w_z*corrd - corr*w_zd
9503  call popreal8(w_y)
9504  ssyd = ssyd + w_y*corrd - corr*w_yd
9505  call popreal8(w_x)
9506  ssxd = ssxd + w_x*corrd - corr*w_xd
9507  call popreal8(corr)
9508  w_xd = w_xd + ssx*corrd
9509  w_yd = w_yd + ssy*corrd
9510  w_zd = w_zd + ssz*corrd
9511  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) - ss*corrd
9512  wd(i, j, k, ivz) = wd(i, j, k, ivz) + ss*corrd
9513  ssd = ssd - (w(i, j+1, k, ivz)-w(i, j, k, ivz))*corrd
9514  call popreal8(v_z)
9515  corrd = -(ssz*v_zd) - ssy*v_yd - ssx*v_xd
9516  sszd = sszd + v_z*corrd - corr*v_zd
9517  call popreal8(v_y)
9518  ssyd = ssyd + v_y*corrd - corr*v_yd
9519  call popreal8(v_x)
9520  ssxd = ssxd + v_x*corrd - corr*v_xd
9521  call popreal8(corr)
9522  v_xd = v_xd + ssx*corrd
9523  v_yd = v_yd + ssy*corrd
9524  v_zd = v_zd + ssz*corrd
9525  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) - ss*corrd
9526  wd(i, j, k, ivy) = wd(i, j, k, ivy) + ss*corrd
9527  ssd = ssd - (w(i, j+1, k, ivy)-w(i, j, k, ivy))*corrd
9528  call popreal8(u_z)
9529  corrd = -(ssz*u_zd) - ssy*u_yd - ssx*u_xd
9530  sszd = sszd + u_z*corrd - corr*u_zd
9531  call popreal8(u_y)
9532  ssyd = ssyd + u_y*corrd - corr*u_yd
9533  call popreal8(u_x)
9534  ssxd = ssxd + u_x*corrd - corr*u_xd
9535  u_xd = u_xd + ssx*corrd
9536  u_yd = u_yd + ssy*corrd
9537  u_zd = u_zd + ssz*corrd
9538  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) - ss*corrd
9539  wd(i, j, k, ivx) = wd(i, j, k, ivx) + ss*corrd
9540  call popreal8(ssz)
9541  call popreal8(ssy)
9542  call popreal8(ssx)
9543  ssd = ssd + ssz*sszd - (w(i, j+1, k, ivx)-w(i, j, k, ivx))*corrd&
9544 & + ssy*ssyd + ssx*ssxd
9545  temp0 = ssx*ssx + ssy*ssy + ssz*ssz
9546  temp = sqrt(temp0)
9547  if (temp0 .eq. 0.0_8) then
9548  tempd0 = 0.0_8
9549  else
9550  tempd0 = -(one*ssd/(2.0*temp**3))
9551  end if
9552  sszd = ss*sszd + 2*ssz*tempd0
9553  ssyd = ss*ssyd + 2*ssy*tempd0
9554  ssxd = ss*ssxd + 2*ssx*tempd0
9555  tempd0 = eighth*sszd
9556  xd(i-1, j+1, k-1, 3) = xd(i-1, j+1, k-1, 3) + tempd0
9557  xd(i-1, j-1, k-1, 3) = xd(i-1, j-1, k-1, 3) - tempd0
9558  xd(i-1, j+1, k, 3) = xd(i-1, j+1, k, 3) + tempd0
9559  xd(i-1, j-1, k, 3) = xd(i-1, j-1, k, 3) - tempd0
9560  xd(i, j+1, k-1, 3) = xd(i, j+1, k-1, 3) + tempd0
9561  xd(i, j-1, k-1, 3) = xd(i, j-1, k-1, 3) - tempd0
9562  xd(i, j+1, k, 3) = xd(i, j+1, k, 3) + tempd0
9563  xd(i, j-1, k, 3) = xd(i, j-1, k, 3) - tempd0
9564  tempd0 = eighth*ssyd
9565  xd(i-1, j+1, k-1, 2) = xd(i-1, j+1, k-1, 2) + tempd0
9566  xd(i-1, j-1, k-1, 2) = xd(i-1, j-1, k-1, 2) - tempd0
9567  xd(i-1, j+1, k, 2) = xd(i-1, j+1, k, 2) + tempd0
9568  xd(i-1, j-1, k, 2) = xd(i-1, j-1, k, 2) - tempd0
9569  xd(i, j+1, k-1, 2) = xd(i, j+1, k-1, 2) + tempd0
9570  xd(i, j-1, k-1, 2) = xd(i, j-1, k-1, 2) - tempd0
9571  xd(i, j+1, k, 2) = xd(i, j+1, k, 2) + tempd0
9572  xd(i, j-1, k, 2) = xd(i, j-1, k, 2) - tempd0
9573  tempd0 = eighth*ssxd
9574  xd(i-1, j+1, k-1, 1) = xd(i-1, j+1, k-1, 1) + tempd0
9575  xd(i-1, j-1, k-1, 1) = xd(i-1, j-1, k-1, 1) - tempd0
9576  xd(i-1, j+1, k, 1) = xd(i-1, j+1, k, 1) + tempd0
9577  xd(i-1, j-1, k, 1) = xd(i-1, j-1, k, 1) - tempd0
9578  xd(i, j+1, k-1, 1) = xd(i, j+1, k-1, 1) + tempd0
9579  xd(i, j-1, k-1, 1) = xd(i, j-1, k-1, 1) - tempd0
9580  xd(i, j+1, k, 1) = xd(i, j+1, k, 1) + tempd0
9581  xd(i, j-1, k, 1) = xd(i, j-1, k, 1) - tempd0
9582  tempd0 = fourth*q_zd
9583  qzd(i-1, j, k-1) = qzd(i-1, j, k-1) + tempd0
9584  qzd(i, j, k-1) = qzd(i, j, k-1) + tempd0
9585  qzd(i-1, j, k) = qzd(i-1, j, k) + tempd0
9586  qzd(i, j, k) = qzd(i, j, k) + tempd0
9587  tempd0 = fourth*q_yd
9588  qyd(i-1, j, k-1) = qyd(i-1, j, k-1) + tempd0
9589  qyd(i, j, k-1) = qyd(i, j, k-1) + tempd0
9590  qyd(i-1, j, k) = qyd(i-1, j, k) + tempd0
9591  qyd(i, j, k) = qyd(i, j, k) + tempd0
9592  tempd0 = fourth*q_xd
9593  qxd(i-1, j, k-1) = qxd(i-1, j, k-1) + tempd0
9594  qxd(i, j, k-1) = qxd(i, j, k-1) + tempd0
9595  qxd(i-1, j, k) = qxd(i-1, j, k) + tempd0
9596  qxd(i, j, k) = qxd(i, j, k) + tempd0
9597  tempd0 = fourth*w_zd
9598  wzd(i-1, j, k-1) = wzd(i-1, j, k-1) + tempd0
9599  wzd(i, j, k-1) = wzd(i, j, k-1) + tempd0
9600  wzd(i-1, j, k) = wzd(i-1, j, k) + tempd0
9601  wzd(i, j, k) = wzd(i, j, k) + tempd0
9602  tempd0 = fourth*w_yd
9603  wyd(i-1, j, k-1) = wyd(i-1, j, k-1) + tempd0
9604  wyd(i, j, k-1) = wyd(i, j, k-1) + tempd0
9605  wyd(i-1, j, k) = wyd(i-1, j, k) + tempd0
9606  wyd(i, j, k) = wyd(i, j, k) + tempd0
9607  tempd0 = fourth*w_xd
9608  wxd(i-1, j, k-1) = wxd(i-1, j, k-1) + tempd0
9609  wxd(i, j, k-1) = wxd(i, j, k-1) + tempd0
9610  wxd(i-1, j, k) = wxd(i-1, j, k) + tempd0
9611  wxd(i, j, k) = wxd(i, j, k) + tempd0
9612  tempd0 = fourth*v_zd
9613  vzd(i-1, j, k-1) = vzd(i-1, j, k-1) + tempd0
9614  vzd(i, j, k-1) = vzd(i, j, k-1) + tempd0
9615  vzd(i-1, j, k) = vzd(i-1, j, k) + tempd0
9616  vzd(i, j, k) = vzd(i, j, k) + tempd0
9617  tempd0 = fourth*v_yd
9618  vyd(i-1, j, k-1) = vyd(i-1, j, k-1) + tempd0
9619  vyd(i, j, k-1) = vyd(i, j, k-1) + tempd0
9620  vyd(i-1, j, k) = vyd(i-1, j, k) + tempd0
9621  vyd(i, j, k) = vyd(i, j, k) + tempd0
9622  tempd0 = fourth*v_xd
9623  vxd(i-1, j, k-1) = vxd(i-1, j, k-1) + tempd0
9624  vxd(i, j, k-1) = vxd(i, j, k-1) + tempd0
9625  vxd(i-1, j, k) = vxd(i-1, j, k) + tempd0
9626  vxd(i, j, k) = vxd(i, j, k) + tempd0
9627  tempd0 = fourth*u_zd
9628  uzd(i-1, j, k-1) = uzd(i-1, j, k-1) + tempd0
9629  uzd(i, j, k-1) = uzd(i, j, k-1) + tempd0
9630  uzd(i-1, j, k) = uzd(i-1, j, k) + tempd0
9631  uzd(i, j, k) = uzd(i, j, k) + tempd0
9632  tempd0 = fourth*u_yd
9633  uyd(i-1, j, k-1) = uyd(i-1, j, k-1) + tempd0
9634  uyd(i, j, k-1) = uyd(i, j, k-1) + tempd0
9635  uyd(i-1, j, k) = uyd(i-1, j, k) + tempd0
9636  uyd(i, j, k) = uyd(i, j, k) + tempd0
9637  tempd0 = fourth*u_xd
9638  uxd(i-1, j, k-1) = uxd(i-1, j, k-1) + tempd0
9639  uxd(i, j, k-1) = uxd(i, j, k-1) + tempd0
9640  uxd(i-1, j, k) = uxd(i-1, j, k) + tempd0
9641  uxd(i, j, k) = uxd(i, j, k) + tempd0
9642  muld = factlamheat*heatcoefd + mutd
9643  mued = mued + factturbheat*heatcoefd + mutd
9644  call popcontrol1b(branch)
9645  if (branch .eq. 0) then
9646  revd(i, j, k) = revd(i, j, k) + por*mued
9647  revd(i, j+1, k) = revd(i, j+1, k) + por*mued
9648  mued = 0.0_8
9649  end if
9650  rlvd(i, j, k) = rlvd(i, j, k) + por*muld
9651  rlvd(i, j+1, k) = rlvd(i, j+1, k) + por*muld
9652  end do
9653  mued = 0.0_8
9654 !
9655 ! viscous fluxes in the k-direction.
9656 !
9657  mue = zero
9658  mued = 0.0_8
9659 !$bwd-of ii-loop
9660  do ii=0,nx*ny*kl-1
9661  i = mod(ii, nx) + 2
9662  j = mod(ii/nx, ny) + 2
9663  k = ii/(nx*ny) + 1
9664 ! set the value of the porosity. if not zero, it is set
9665 ! to average the eddy-viscosity and to take the factor
9666 ! rfilv into account.
9667  por = half*rfilv
9668  if (pork(i, j, k) .eq. noflux) por = zero
9669 ! compute the laminar and (if present) the eddy viscosities
9670 ! multiplied by the porosity. compute the factor in front of
9671 ! the gradients of the speed of sound squared for the heat
9672 ! flux.
9673  mul = por*(rlv(i, j, k)+rlv(i, j, k+1))
9674  if (eddymodel) then
9675  mue = por*(rev(i, j, k)+rev(i, j, k+1))
9676  call pushcontrol1b(0)
9677  else
9678  call pushcontrol1b(1)
9679  end if
9680  mut = mul + mue
9681  gm1 = half*(gamma(i, j, k)+gamma(i, j, k+1)) - one
9682  factlamheat = one/(prandtl*gm1)
9683  factturbheat = one/(prandtlturb*gm1)
9684  heatcoef = mul*factlamheat + mue*factturbheat
9685 ! compute the gradients at the face by averaging the four
9686 ! nodal values.
9687  u_x = fourth*(ux(i-1, j-1, k)+ux(i, j-1, k)+ux(i-1, j, k)+ux(i, &
9688 & j, k))
9689  u_y = fourth*(uy(i-1, j-1, k)+uy(i, j-1, k)+uy(i-1, j, k)+uy(i, &
9690 & j, k))
9691  u_z = fourth*(uz(i-1, j-1, k)+uz(i, j-1, k)+uz(i-1, j, k)+uz(i, &
9692 & j, k))
9693  v_x = fourth*(vx(i-1, j-1, k)+vx(i, j-1, k)+vx(i-1, j, k)+vx(i, &
9694 & j, k))
9695  v_y = fourth*(vy(i-1, j-1, k)+vy(i, j-1, k)+vy(i-1, j, k)+vy(i, &
9696 & j, k))
9697  v_z = fourth*(vz(i-1, j-1, k)+vz(i, j-1, k)+vz(i-1, j, k)+vz(i, &
9698 & j, k))
9699  w_x = fourth*(wx(i-1, j-1, k)+wx(i, j-1, k)+wx(i-1, j, k)+wx(i, &
9700 & j, k))
9701  w_y = fourth*(wy(i-1, j-1, k)+wy(i, j-1, k)+wy(i-1, j, k)+wy(i, &
9702 & j, k))
9703  w_z = fourth*(wz(i-1, j-1, k)+wz(i, j-1, k)+wz(i-1, j, k)+wz(i, &
9704 & j, k))
9705  q_x = fourth*(qx(i-1, j-1, k)+qx(i, j-1, k)+qx(i-1, j, k)+qx(i, &
9706 & j, k))
9707  q_y = fourth*(qy(i-1, j-1, k)+qy(i, j-1, k)+qy(i-1, j, k)+qy(i, &
9708 & j, k))
9709  q_z = fourth*(qz(i-1, j-1, k)+qz(i, j-1, k)+qz(i-1, j, k)+qz(i, &
9710 & j, k))
9711 ! the gradients in the normal direction are corrected, such
9712 ! that no averaging takes places here.
9713 ! first determine the vector in the direction from the
9714 ! cell center k to cell center k+1.
9715  ssx = eighth*(x(i-1, j-1, k+1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j, &
9716 & k+1, 1)-x(i-1, j, k-1, 1)+x(i, j-1, k+1, 1)-x(i, j-1, k-1, 1)+&
9717 & x(i, j, k+1, 1)-x(i, j, k-1, 1))
9718  ssy = eighth*(x(i-1, j-1, k+1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j, &
9719 & k+1, 2)-x(i-1, j, k-1, 2)+x(i, j-1, k+1, 2)-x(i, j-1, k-1, 2)+&
9720 & x(i, j, k+1, 2)-x(i, j, k-1, 2))
9721  ssz = eighth*(x(i-1, j-1, k+1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j, &
9722 & k+1, 3)-x(i-1, j, k-1, 3)+x(i, j-1, k+1, 3)-x(i, j-1, k-1, 3)+&
9723 & x(i, j, k+1, 3)-x(i, j, k-1, 3))
9724 ! determine the length of this vector and create the
9725 ! unit normal.
9726  ss = one/sqrt(ssx*ssx+ssy*ssy+ssz*ssz)
9727  call pushreal8(ssx)
9728  ssx = ss*ssx
9729  call pushreal8(ssy)
9730  ssy = ss*ssy
9731  call pushreal8(ssz)
9732  ssz = ss*ssz
9733 ! correct the gradients.
9734  corr = u_x*ssx + u_y*ssy + u_z*ssz - (w(i, j, k+1, ivx)-w(i, j, &
9735 & k, ivx))*ss
9736  call pushreal8(u_x)
9737  u_x = u_x - corr*ssx
9738  call pushreal8(u_y)
9739  u_y = u_y - corr*ssy
9740  call pushreal8(u_z)
9741  u_z = u_z - corr*ssz
9742  call pushreal8(corr)
9743  corr = v_x*ssx + v_y*ssy + v_z*ssz - (w(i, j, k+1, ivy)-w(i, j, &
9744 & k, ivy))*ss
9745  call pushreal8(v_x)
9746  v_x = v_x - corr*ssx
9747  call pushreal8(v_y)
9748  v_y = v_y - corr*ssy
9749  call pushreal8(v_z)
9750  v_z = v_z - corr*ssz
9751  call pushreal8(corr)
9752  corr = w_x*ssx + w_y*ssy + w_z*ssz - (w(i, j, k+1, ivz)-w(i, j, &
9753 & k, ivz))*ss
9754  call pushreal8(w_x)
9755  w_x = w_x - corr*ssx
9756  call pushreal8(w_y)
9757  w_y = w_y - corr*ssy
9758  call pushreal8(w_z)
9759  w_z = w_z - corr*ssz
9760  call pushreal8(corr)
9761  corr = q_x*ssx + q_y*ssy + q_z*ssz + (aa(i, j, k+1)-aa(i, j, k))&
9762 & *ss
9763  call pushreal8(q_x)
9764  q_x = q_x - corr*ssx
9765  call pushreal8(q_y)
9766  q_y = q_y - corr*ssy
9767  call pushreal8(q_z)
9768  q_z = q_z - corr*ssz
9769 ! compute the stress tensor and the heat flux vector.
9770 ! we remove the viscosity from the stress tensor (tau)
9771 ! to define taus since we still need to separate between
9772 ! laminar and turbulent stress for qcr.
9773 ! therefore, laminar tau = mue*taus, turbulent
9774 ! tau = mue*taus, and total tau = mut*taus.
9775  fracdiv = twothird*(u_x+v_y+w_z)
9776  tauxxs = two*u_x - fracdiv
9777  tauyys = two*v_y - fracdiv
9778  tauzzs = two*w_z - fracdiv
9779  tauxys = u_y + v_x
9780  tauxzs = u_z + w_x
9781  tauyzs = v_z + w_y
9782  call pushreal8(q_x)
9783  q_x = heatcoef*q_x
9784  call pushreal8(q_y)
9785  q_y = heatcoef*q_y
9786  call pushreal8(q_z)
9787  q_z = heatcoef*q_z
9788 ! add qcr corrections if necessary
9789  if (useqcr) then
9790 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
9791 !
9792 ! tau_ij,qcr = tau_ij - e_ij
9793 !
9794 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
9795 !
9796 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
9797 !
9798 ! we are computing o_ik as follows:
9799 !
9800 ! o_ik = 2*w_ik/den
9801 !
9802 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
9803 ! compute denominator
9804  den = sqrt(u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
9805 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z)
9806  if (den .lt. xminn) then
9807  den = xminn
9808  call pushcontrol1b(0)
9809  else
9810  call pushcontrol1b(1)
9811  den = den
9812  end if
9813 ! compute factor that will multiply all tensor components.
9814 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
9815 ! components as well.
9816  fact = mue*ccr1/den
9817 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
9818 ! the diagonals of the vorticity tensor components are always zero
9819  wxy = u_y - v_x
9820  wxz = u_z - w_x
9821  wyz = v_z - w_y
9822  wyx = -wxy
9823  wzx = -wxz
9824  wzy = -wyz
9825 ! compute the extra terms of the boussinesq relation
9826  exx = fact*(wxy*tauxys+wxz*tauxzs)*two
9827  eyy = fact*(wyx*tauxys+wyz*tauyzs)*two
9828  ezz = fact*(wzx*tauxzs+wzy*tauyzs)*two
9829  exy = fact*(wxy*tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)
9830  exz = fact*(wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)
9831  eyz = fact*(wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)
9832 ! apply the total viscosity to the stress tensor and add extra terms
9833  tauxx = mut*tauxxs - exx
9834  tauyy = mut*tauyys - eyy
9835  tauzz = mut*tauzzs - ezz
9836  tauxy = mut*tauxys - exy
9837  tauxz = mut*tauxzs - exz
9838  tauyz = mut*tauyzs - eyz
9839  call pushcontrol1b(0)
9840  else
9841 ! just apply the total viscosity to the stress tensor
9842  tauxx = mut*tauxxs
9843  tauyy = mut*tauyys
9844  tauzz = mut*tauzzs
9845  tauxy = mut*tauxys
9846  tauxz = mut*tauxzs
9847  tauyz = mut*tauyzs
9848  call pushcontrol1b(1)
9849  end if
9850 ! compute the average velocities for the face. remember that
9851 ! the velocities are stored and not the momentum.
9852  ubar = half*(w(i, j, k, ivx)+w(i, j, k+1, ivx))
9853  vbar = half*(w(i, j, k, ivy)+w(i, j, k+1, ivy))
9854  wbar = half*(w(i, j, k, ivz)+w(i, j, k+1, ivz))
9855 ! compute the viscous fluxes for this k-face.
9856 ! update the residuals of cell k and k+1.
9857 ! store the stress tensor and the heat flux vector if this
9858 ! face is part of a viscous subface. both the cases k == 1
9859 ! and k == kl must be tested.
9860  if (k .eq. 1 .and. storewalltensor .and. visckminpointer(i, j) &
9861 & .gt. 0) then
9862  call pushcontrol1b(0)
9863  else
9864  call pushcontrol1b(1)
9865  end if
9866 ! and the k == kl case.
9867  if (k .eq. kl .and. storewalltensor .and. visckmaxpointer(i, j) &
9868 & .gt. 0) then
9869  q_zd = viscsubfaced(visckmaxpointer(i, j))%q(i, j, 3)
9870  viscsubfaced(visckmaxpointer(i, j))%q(i, j, 3) = 0.0_8
9871  q_yd = viscsubfaced(visckmaxpointer(i, j))%q(i, j, 2)
9872  viscsubfaced(visckmaxpointer(i, j))%q(i, j, 2) = 0.0_8
9873  q_xd = viscsubfaced(visckmaxpointer(i, j))%q(i, j, 1)
9874  viscsubfaced(visckmaxpointer(i, j))%q(i, j, 1) = 0.0_8
9875  tauyzd = viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 6)
9876  viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 6) = 0.0_8
9877  tauxzd = viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 5)
9878  viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 5) = 0.0_8
9879  tauxyd = viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 4)
9880  viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 4) = 0.0_8
9881  tauzzd = viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 3)
9882  viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 3) = 0.0_8
9883  tauyyd = viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 2)
9884  viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 2) = 0.0_8
9885  tauxxd = viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 1)
9886  viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 1) = 0.0_8
9887  else
9888  tauzzd = 0.0_8
9889  tauxxd = 0.0_8
9890  tauxyd = 0.0_8
9891  tauxzd = 0.0_8
9892  q_xd = 0.0_8
9893  q_yd = 0.0_8
9894  q_zd = 0.0_8
9895  tauyyd = 0.0_8
9896  tauyzd = 0.0_8
9897  end if
9898  call popcontrol1b(branch)
9899  if (branch .eq. 0) then
9900  q_zd = q_zd + viscsubfaced(visckminpointer(i, j))%q(i, j, 3)
9901  viscsubfaced(visckminpointer(i, j))%q(i, j, 3) = 0.0_8
9902  q_yd = q_yd + viscsubfaced(visckminpointer(i, j))%q(i, j, 2)
9903  viscsubfaced(visckminpointer(i, j))%q(i, j, 2) = 0.0_8
9904  q_xd = q_xd + viscsubfaced(visckminpointer(i, j))%q(i, j, 1)
9905  viscsubfaced(visckminpointer(i, j))%q(i, j, 1) = 0.0_8
9906  tauyzd = tauyzd + viscsubfaced(visckminpointer(i, j))%tau(i, j&
9907 & , 6)
9908  viscsubfaced(visckminpointer(i, j))%tau(i, j, 6) = 0.0_8
9909  tauxzd = tauxzd + viscsubfaced(visckminpointer(i, j))%tau(i, j&
9910 & , 5)
9911  viscsubfaced(visckminpointer(i, j))%tau(i, j, 5) = 0.0_8
9912  tauxyd = tauxyd + viscsubfaced(visckminpointer(i, j))%tau(i, j&
9913 & , 4)
9914  viscsubfaced(visckminpointer(i, j))%tau(i, j, 4) = 0.0_8
9915  tauzzd = tauzzd + viscsubfaced(visckminpointer(i, j))%tau(i, j&
9916 & , 3)
9917  viscsubfaced(visckminpointer(i, j))%tau(i, j, 3) = 0.0_8
9918  tauyyd = tauyyd + viscsubfaced(visckminpointer(i, j))%tau(i, j&
9919 & , 2)
9920  viscsubfaced(visckminpointer(i, j))%tau(i, j, 2) = 0.0_8
9921  tauxxd = tauxxd + viscsubfaced(visckminpointer(i, j))%tau(i, j&
9922 & , 1)
9923  viscsubfaced(visckminpointer(i, j))%tau(i, j, 1) = 0.0_8
9924  end if
9925  frhoed = fwd(i, j, k+1, irhoe) - fwd(i, j, k, irhoe)
9926  fmzd = fwd(i, j, k+1, imz) - fwd(i, j, k, imz)
9927  fmyd = fwd(i, j, k+1, imy) - fwd(i, j, k, imy)
9928  fmxd = fwd(i, j, k+1, imx) - fwd(i, j, k, imx)
9929  q_xd = q_xd - sk(i, j, k, 1)*frhoed
9930  q_yd = q_yd - sk(i, j, k, 2)*frhoed
9931  q_zd = q_zd - sk(i, j, k, 3)*frhoed
9932  skd(i, j, k, 3) = skd(i, j, k, 3) + (ubar*tauxz+vbar*tauyz+wbar*&
9933 & tauzz-q_z)*frhoed
9934  skd(i, j, k, 2) = skd(i, j, k, 2) + (ubar*tauxy+vbar*tauyy+wbar*&
9935 & tauyz-q_y)*frhoed
9936  skd(i, j, k, 1) = skd(i, j, k, 1) + (ubar*tauxx+vbar*tauxy+wbar*&
9937 & tauxz-q_x)*frhoed
9938  tempd0 = sk(i, j, k, 3)*frhoed
9939  ubard = tauxz*tempd0
9940  tauxzd = tauxzd + ubar*tempd0
9941  vbard = tauyz*tempd0
9942  tauyzd = tauyzd + vbar*tempd0
9943  wbard = tauzz*tempd0
9944  tauzzd = tauzzd + wbar*tempd0 + sk(i, j, k, 3)*fmzd
9945  tempd0 = sk(i, j, k, 2)*frhoed
9946  ubard = ubard + tauxy*tempd0
9947  tauxyd = tauxyd + ubar*tempd0
9948  vbard = vbard + tauyy*tempd0
9949  tauyyd = tauyyd + vbar*tempd0 + sk(i, j, k, 2)*fmyd
9950  wbard = wbard + tauyz*tempd0
9951  tauyzd = tauyzd + wbar*tempd0 + sk(i, j, k, 2)*fmzd + sk(i, j, k&
9952 & , 3)*fmyd
9953  tempd0 = sk(i, j, k, 1)*frhoed
9954  ubard = ubard + tauxx*tempd0
9955  tauxxd = tauxxd + ubar*tempd0 + sk(i, j, k, 1)*fmxd
9956  vbard = vbard + tauxy*tempd0
9957  tauxyd = tauxyd + vbar*tempd0 + sk(i, j, k, 1)*fmyd + sk(i, j, k&
9958 & , 2)*fmxd
9959  wbard = wbard + tauxz*tempd0
9960  tauxzd = tauxzd + wbar*tempd0 + sk(i, j, k, 1)*fmzd + sk(i, j, k&
9961 & , 3)*fmxd
9962  skd(i, j, k, 3) = skd(i, j, k, 3) + tauzz*fmzd + tauyz*fmyd + &
9963 & tauxz*fmxd
9964  skd(i, j, k, 2) = skd(i, j, k, 2) + tauyz*fmzd + tauyy*fmyd + &
9965 & tauxy*fmxd
9966  skd(i, j, k, 1) = skd(i, j, k, 1) + tauxz*fmzd + tauxy*fmyd + &
9967 & tauxx*fmxd
9968  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wbard
9969  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + half*wbard
9970  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vbard
9971  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + half*vbard
9972  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*ubard
9973  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + half*ubard
9974  call popcontrol1b(branch)
9975  if (branch .eq. 0) then
9976  eyzd = -tauyzd
9977  exzd = -tauxzd
9978  tempd0 = fact*eyzd
9979  tauxzsd = mut*tauxzd + wyx*tempd0
9980  tauxysd = mut*tauxyd + wzx*tempd0
9981  tauzzsd = mut*tauzzd + wyz*tempd0
9982  tauyysd = mut*tauyyd + wzy*tempd0
9983  wyxd = tauxzs*tempd0
9984  wyzd = tauzzs*tempd0
9985  wzxd = tauxys*tempd0
9986  wzyd = tauyys*tempd0
9987  tempd0 = fact*exzd
9988  mutd = tauyzs*tauyzd + tauxzs*tauxzd + tauxys*tauxyd + tauzzs*&
9989 & tauzzd + tauyys*tauyyd + tauxxs*tauxxd
9990  tauyzsd = mut*tauyzd + wxy*tempd0
9991  exyd = -tauxyd
9992  ezzd = -tauzzd
9993  eyyd = -tauyyd
9994  tauxxsd = mut*tauxxd + wzx*tempd0
9995  exxd = -tauxxd
9996  factd = (wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)*eyzd + (&
9997 & wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)*exzd + (wxy*&
9998 & tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)*exyd + (wzx*tauxzs+&
9999 & wzy*tauyzs)*two*ezzd + (wyx*tauxys+wyz*tauyzs)*two*eyyd + (&
10000 & wxy*tauxys+wxz*tauxzs)*two*exxd
10001  wxyd = tauyzs*tempd0
10002  wxzd = tauzzs*tempd0
10003  tauzzsd = tauzzsd + wxz*tempd0
10004  wzxd = wzxd + tauxxs*tempd0
10005  wzyd = wzyd + tauxys*tempd0
10006  tauxysd = tauxysd + wzy*tempd0
10007  tempd0 = fact*exyd
10008  wxyd = wxyd + tauyys*tempd0
10009  tauyysd = tauyysd + wxy*tempd0
10010  wxzd = wxzd + tauyzs*tempd0
10011  tauyzsd = tauyzsd + wxz*tempd0
10012  wyxd = wyxd + tauxxs*tempd0
10013  tauxxsd = tauxxsd + wyx*tempd0
10014  wyzd = wyzd + tauxzs*tempd0
10015  tauxzsd = tauxzsd + wyz*tempd0
10016  tempd0 = fact*two*ezzd
10017  wzxd = wzxd + tauxzs*tempd0
10018  tauxzsd = tauxzsd + wzx*tempd0
10019  wzyd = wzyd + tauyzs*tempd0
10020  tauyzsd = tauyzsd + wzy*tempd0
10021  tempd0 = fact*two*eyyd
10022  wyxd = wyxd + tauxys*tempd0
10023  tauxysd = tauxysd + wyx*tempd0
10024  wyzd = wyzd + tauyzs*tempd0 - wzyd
10025  tauyzsd = tauyzsd + wyz*tempd0
10026  tempd0 = fact*two*exxd
10027  wxyd = wxyd + tauxys*tempd0 - wyxd
10028  tauxysd = tauxysd + wxy*tempd0
10029  wxzd = wxzd + tauxzs*tempd0 - wzxd
10030  tauxzsd = tauxzsd + wxz*tempd0
10031  v_zd = wyzd
10032  w_yd = -wyzd
10033  u_zd = wxzd
10034  w_xd = -wxzd
10035  u_yd = wxyd
10036  v_xd = -wxyd
10037  tempd0 = ccr1*factd/den
10038  mued = mued + tempd0
10039  dend = -(mue*tempd0/den)
10040  call popcontrol1b(branch)
10041  if (branch .eq. 0) dend = 0.0_8
10042  if (u_x**2 + u_y**2 + u_z**2 + v_x**2 + v_y**2 + v_z**2 + w_x&
10043 & **2 + w_y**2 + w_z**2 .eq. 0.0_8) then
10044  tempd0 = 0.0_8
10045  else
10046  tempd0 = dend/(2.0*sqrt(u_x**2+u_y**2+u_z**2+v_x**2+v_y**2+&
10047 & v_z**2+w_x**2+w_y**2+w_z**2))
10048  end if
10049  u_xd = 2*u_x*tempd0
10050  u_yd = u_yd + 2*u_y*tempd0
10051  u_zd = u_zd + 2*u_z*tempd0
10052  v_xd = v_xd + 2*v_x*tempd0
10053  v_yd = 2*v_y*tempd0
10054  v_zd = v_zd + 2*v_z*tempd0
10055  w_xd = w_xd + 2*w_x*tempd0
10056  w_yd = w_yd + 2*w_y*tempd0
10057  w_zd = 2*w_z*tempd0
10058  else
10059  mutd = tauyzs*tauyzd + tauxzs*tauxzd + tauxys*tauxyd + tauzzs*&
10060 & tauzzd + tauyys*tauyyd + tauxxs*tauxxd
10061  tauyzsd = mut*tauyzd
10062  tauxzsd = mut*tauxzd
10063  tauxysd = mut*tauxyd
10064  tauzzsd = mut*tauzzd
10065  tauyysd = mut*tauyyd
10066  tauxxsd = mut*tauxxd
10067  u_xd = 0.0_8
10068  u_yd = 0.0_8
10069  u_zd = 0.0_8
10070  w_xd = 0.0_8
10071  w_yd = 0.0_8
10072  w_zd = 0.0_8
10073  v_xd = 0.0_8
10074  v_yd = 0.0_8
10075  v_zd = 0.0_8
10076  end if
10077  fracdivd = -tauzzsd - tauyysd - tauxxsd
10078  tempd0 = twothird*fracdivd
10079  call popreal8(q_z)
10080  call popreal8(q_y)
10081  call popreal8(q_x)
10082  heatcoefd = q_z*q_zd + q_y*q_yd + q_x*q_xd
10083  q_zd = heatcoef*q_zd
10084  q_yd = heatcoef*q_yd
10085  q_xd = heatcoef*q_xd
10086  v_zd = v_zd + tauyzsd
10087  w_yd = w_yd + tauyzsd
10088  u_zd = u_zd + tauxzsd
10089  w_xd = w_xd + tauxzsd
10090  u_yd = u_yd + tauxysd
10091  v_xd = v_xd + tauxysd
10092  w_zd = w_zd + two*tauzzsd + tempd0
10093  v_yd = v_yd + two*tauyysd + tempd0
10094  u_xd = u_xd + two*tauxxsd + tempd0
10095  call popreal8(q_z)
10096  corrd = -(ssz*q_zd) - ssy*q_yd - ssx*q_xd
10097  sszd = q_z*corrd - corr*q_zd
10098  call popreal8(q_y)
10099  ssyd = q_y*corrd - corr*q_yd
10100  call popreal8(q_x)
10101  ssxd = q_x*corrd - corr*q_xd
10102  call popreal8(corr)
10103  q_xd = q_xd + ssx*corrd
10104  q_yd = q_yd + ssy*corrd
10105  q_zd = q_zd + ssz*corrd
10106  aad(i, j, k+1) = aad(i, j, k+1) + ss*corrd
10107  aad(i, j, k) = aad(i, j, k) - ss*corrd
10108  ssd = (aa(i, j, k+1)-aa(i, j, k))*corrd
10109  call popreal8(w_z)
10110  corrd = -(ssz*w_zd) - ssy*w_yd - ssx*w_xd
10111  sszd = sszd + w_z*corrd - corr*w_zd
10112  call popreal8(w_y)
10113  ssyd = ssyd + w_y*corrd - corr*w_yd
10114  call popreal8(w_x)
10115  ssxd = ssxd + w_x*corrd - corr*w_xd
10116  call popreal8(corr)
10117  w_xd = w_xd + ssx*corrd
10118  w_yd = w_yd + ssy*corrd
10119  w_zd = w_zd + ssz*corrd
10120  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) - ss*corrd
10121  wd(i, j, k, ivz) = wd(i, j, k, ivz) + ss*corrd
10122  ssd = ssd - (w(i, j, k+1, ivz)-w(i, j, k, ivz))*corrd
10123  call popreal8(v_z)
10124  corrd = -(ssz*v_zd) - ssy*v_yd - ssx*v_xd
10125  sszd = sszd + v_z*corrd - corr*v_zd
10126  call popreal8(v_y)
10127  ssyd = ssyd + v_y*corrd - corr*v_yd
10128  call popreal8(v_x)
10129  ssxd = ssxd + v_x*corrd - corr*v_xd
10130  call popreal8(corr)
10131  v_xd = v_xd + ssx*corrd
10132  v_yd = v_yd + ssy*corrd
10133  v_zd = v_zd + ssz*corrd
10134  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) - ss*corrd
10135  wd(i, j, k, ivy) = wd(i, j, k, ivy) + ss*corrd
10136  ssd = ssd - (w(i, j, k+1, ivy)-w(i, j, k, ivy))*corrd
10137  call popreal8(u_z)
10138  corrd = -(ssz*u_zd) - ssy*u_yd - ssx*u_xd
10139  sszd = sszd + u_z*corrd - corr*u_zd
10140  call popreal8(u_y)
10141  ssyd = ssyd + u_y*corrd - corr*u_yd
10142  call popreal8(u_x)
10143  ssxd = ssxd + u_x*corrd - corr*u_xd
10144  u_xd = u_xd + ssx*corrd
10145  u_yd = u_yd + ssy*corrd
10146  u_zd = u_zd + ssz*corrd
10147  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) - ss*corrd
10148  wd(i, j, k, ivx) = wd(i, j, k, ivx) + ss*corrd
10149  call popreal8(ssz)
10150  call popreal8(ssy)
10151  call popreal8(ssx)
10152  ssd = ssd + ssz*sszd - (w(i, j, k+1, ivx)-w(i, j, k, ivx))*corrd&
10153 & + ssy*ssyd + ssx*ssxd
10154  temp = ssx*ssx + ssy*ssy + ssz*ssz
10155  temp0 = sqrt(temp)
10156  if (temp .eq. 0.0_8) then
10157  tempd = 0.0_8
10158  else
10159  tempd = -(one*ssd/(2.0*temp0**3))
10160  end if
10161  sszd = ss*sszd + 2*ssz*tempd
10162  ssyd = ss*ssyd + 2*ssy*tempd
10163  ssxd = ss*ssxd + 2*ssx*tempd
10164  tempd = eighth*sszd
10165  xd(i-1, j-1, k+1, 3) = xd(i-1, j-1, k+1, 3) + tempd
10166  xd(i-1, j-1, k-1, 3) = xd(i-1, j-1, k-1, 3) - tempd
10167  xd(i-1, j, k+1, 3) = xd(i-1, j, k+1, 3) + tempd
10168  xd(i-1, j, k-1, 3) = xd(i-1, j, k-1, 3) - tempd
10169  xd(i, j-1, k+1, 3) = xd(i, j-1, k+1, 3) + tempd
10170  xd(i, j-1, k-1, 3) = xd(i, j-1, k-1, 3) - tempd
10171  xd(i, j, k+1, 3) = xd(i, j, k+1, 3) + tempd
10172  xd(i, j, k-1, 3) = xd(i, j, k-1, 3) - tempd
10173  tempd = eighth*ssyd
10174  xd(i-1, j-1, k+1, 2) = xd(i-1, j-1, k+1, 2) + tempd
10175  xd(i-1, j-1, k-1, 2) = xd(i-1, j-1, k-1, 2) - tempd
10176  xd(i-1, j, k+1, 2) = xd(i-1, j, k+1, 2) + tempd
10177  xd(i-1, j, k-1, 2) = xd(i-1, j, k-1, 2) - tempd
10178  xd(i, j-1, k+1, 2) = xd(i, j-1, k+1, 2) + tempd
10179  xd(i, j-1, k-1, 2) = xd(i, j-1, k-1, 2) - tempd
10180  xd(i, j, k+1, 2) = xd(i, j, k+1, 2) + tempd
10181  xd(i, j, k-1, 2) = xd(i, j, k-1, 2) - tempd
10182  tempd = eighth*ssxd
10183  xd(i-1, j-1, k+1, 1) = xd(i-1, j-1, k+1, 1) + tempd
10184  xd(i-1, j-1, k-1, 1) = xd(i-1, j-1, k-1, 1) - tempd
10185  xd(i-1, j, k+1, 1) = xd(i-1, j, k+1, 1) + tempd
10186  xd(i-1, j, k-1, 1) = xd(i-1, j, k-1, 1) - tempd
10187  xd(i, j-1, k+1, 1) = xd(i, j-1, k+1, 1) + tempd
10188  xd(i, j-1, k-1, 1) = xd(i, j-1, k-1, 1) - tempd
10189  xd(i, j, k+1, 1) = xd(i, j, k+1, 1) + tempd
10190  xd(i, j, k-1, 1) = xd(i, j, k-1, 1) - tempd
10191  tempd = fourth*q_zd
10192  qzd(i-1, j-1, k) = qzd(i-1, j-1, k) + tempd
10193  qzd(i, j-1, k) = qzd(i, j-1, k) + tempd
10194  qzd(i-1, j, k) = qzd(i-1, j, k) + tempd
10195  qzd(i, j, k) = qzd(i, j, k) + tempd
10196  tempd = fourth*q_yd
10197  qyd(i-1, j-1, k) = qyd(i-1, j-1, k) + tempd
10198  qyd(i, j-1, k) = qyd(i, j-1, k) + tempd
10199  qyd(i-1, j, k) = qyd(i-1, j, k) + tempd
10200  qyd(i, j, k) = qyd(i, j, k) + tempd
10201  tempd = fourth*q_xd
10202  qxd(i-1, j-1, k) = qxd(i-1, j-1, k) + tempd
10203  qxd(i, j-1, k) = qxd(i, j-1, k) + tempd
10204  qxd(i-1, j, k) = qxd(i-1, j, k) + tempd
10205  qxd(i, j, k) = qxd(i, j, k) + tempd
10206  tempd = fourth*w_zd
10207  wzd(i-1, j-1, k) = wzd(i-1, j-1, k) + tempd
10208  wzd(i, j-1, k) = wzd(i, j-1, k) + tempd
10209  wzd(i-1, j, k) = wzd(i-1, j, k) + tempd
10210  wzd(i, j, k) = wzd(i, j, k) + tempd
10211  tempd = fourth*w_yd
10212  wyd(i-1, j-1, k) = wyd(i-1, j-1, k) + tempd
10213  wyd(i, j-1, k) = wyd(i, j-1, k) + tempd
10214  wyd(i-1, j, k) = wyd(i-1, j, k) + tempd
10215  wyd(i, j, k) = wyd(i, j, k) + tempd
10216  tempd = fourth*w_xd
10217  wxd(i-1, j-1, k) = wxd(i-1, j-1, k) + tempd
10218  wxd(i, j-1, k) = wxd(i, j-1, k) + tempd
10219  wxd(i-1, j, k) = wxd(i-1, j, k) + tempd
10220  wxd(i, j, k) = wxd(i, j, k) + tempd
10221  tempd = fourth*v_zd
10222  vzd(i-1, j-1, k) = vzd(i-1, j-1, k) + tempd
10223  vzd(i, j-1, k) = vzd(i, j-1, k) + tempd
10224  vzd(i-1, j, k) = vzd(i-1, j, k) + tempd
10225  vzd(i, j, k) = vzd(i, j, k) + tempd
10226  tempd = fourth*v_yd
10227  vyd(i-1, j-1, k) = vyd(i-1, j-1, k) + tempd
10228  vyd(i, j-1, k) = vyd(i, j-1, k) + tempd
10229  vyd(i-1, j, k) = vyd(i-1, j, k) + tempd
10230  vyd(i, j, k) = vyd(i, j, k) + tempd
10231  tempd = fourth*v_xd
10232  vxd(i-1, j-1, k) = vxd(i-1, j-1, k) + tempd
10233  vxd(i, j-1, k) = vxd(i, j-1, k) + tempd
10234  vxd(i-1, j, k) = vxd(i-1, j, k) + tempd
10235  vxd(i, j, k) = vxd(i, j, k) + tempd
10236  tempd = fourth*u_zd
10237  uzd(i-1, j-1, k) = uzd(i-1, j-1, k) + tempd
10238  uzd(i, j-1, k) = uzd(i, j-1, k) + tempd
10239  uzd(i-1, j, k) = uzd(i-1, j, k) + tempd
10240  uzd(i, j, k) = uzd(i, j, k) + tempd
10241  tempd = fourth*u_yd
10242  uyd(i-1, j-1, k) = uyd(i-1, j-1, k) + tempd
10243  uyd(i, j-1, k) = uyd(i, j-1, k) + tempd
10244  uyd(i-1, j, k) = uyd(i-1, j, k) + tempd
10245  uyd(i, j, k) = uyd(i, j, k) + tempd
10246  tempd = fourth*u_xd
10247  uxd(i-1, j-1, k) = uxd(i-1, j-1, k) + tempd
10248  uxd(i, j-1, k) = uxd(i, j-1, k) + tempd
10249  uxd(i-1, j, k) = uxd(i-1, j, k) + tempd
10250  uxd(i, j, k) = uxd(i, j, k) + tempd
10251  muld = factlamheat*heatcoefd + mutd
10252  mued = mued + factturbheat*heatcoefd + mutd
10253  call popcontrol1b(branch)
10254  if (branch .eq. 0) then
10255  revd(i, j, k) = revd(i, j, k) + por*mued
10256  revd(i, j, k+1) = revd(i, j, k+1) + por*mued
10257  mued = 0.0_8
10258  end if
10259  rlvd(i, j, k) = rlvd(i, j, k) + por*muld
10260  rlvd(i, j, k+1) = rlvd(i, j, k+1) + por*muld
10261  end do
10262  call popcontrol1b(branch)
10263  end if
10264  end subroutine viscousflux_b
10265 
10266  subroutine viscousflux()
10267 !
10268 ! viscousflux computes the viscous fluxes using a central
10269 ! difference scheme for a block.
10270 ! it is assumed that the pointers in block pointer already point
10271 ! to the correct block.
10272 !
10273  use constants
10274  use blockpointers
10275  use flowvarrefstate
10276  use inputphysics
10277  use iteration
10278  implicit none
10279 !
10280 ! local parameter.
10281 !
10282  real(kind=realtype), parameter :: twothird=two*third
10283  real(kind=realtype), parameter :: xminn=1.e-14_realtype
10284 !
10285 ! local variables.
10286 !
10287  integer(kind=inttype) :: i, j, k, ii
10288  real(kind=realtype) :: rfilv, por, mul, mue, mut, heatcoef
10289  real(kind=realtype) :: gm1, factlamheat, factturbheat
10290  real(kind=realtype) :: u_x, u_y, u_z, v_x, v_y, v_z, w_x, w_y, w_z
10291  real(kind=realtype) :: q_x, q_y, q_z, ubar, vbar, wbar
10292  real(kind=realtype) :: corr, ssx, ssy, ssz, ss, fracdiv
10293  real(kind=realtype) :: tauxx, tauyy, tauzz
10294  real(kind=realtype) :: tauxy, tauxz, tauyz
10295  real(kind=realtype) :: tauxxs, tauyys, tauzzs
10296  real(kind=realtype) :: tauxys, tauxzs, tauyzs
10297  real(kind=realtype) :: exx, eyy, ezz
10298  real(kind=realtype) :: exy, exz, eyz
10299  real(kind=realtype) :: wxy, wxz, wyz, wyx, wzx, wzy
10300  real(kind=realtype) :: den, ccr1, fact
10301  real(kind=realtype) :: fmx, fmy, fmz, frhoe
10302  logical :: correctfork, storewalltensor
10303  intrinsic abs
10304  intrinsic mod
10305  intrinsic sqrt
10306  intrinsic max
10307  real(kind=realtype) :: abs0
10308 ! set qcr parameters
10309  ccr1 = 0.3_realtype
10310 ! set rfilv to rfil to indicate that this is the viscous part.
10311 ! if rfilv == 0 the viscous residuals need not to be computed
10312 ! and a return can be made.
10313  rfilv = rfil
10314  if (rfilv .ge. 0.) then
10315  abs0 = rfilv
10316  else
10317  abs0 = -rfilv
10318  end if
10319  if (abs0 .lt. thresholdreal) then
10320  return
10321  else
10322 ! determine whether or not the wall stress tensor and wall heat
10323 ! flux must be stored for viscous walls.
10324  storewalltensor = .false.
10325  if (wallfunctions) then
10326  storewalltensor = .true.
10327  else if (rkstage .eq. 0 .and. currentlevel .eq. groundlevel) then
10328  storewalltensor = .true.
10329  end if
10330 !$ad checkpoint-start
10331 !
10332 ! viscous fluxes in the k-direction.
10333 !
10334  mue = zero
10335 !$ad ii-loop
10336  do ii=0,nx*ny*kl-1
10337  i = mod(ii, nx) + 2
10338  j = mod(ii/nx, ny) + 2
10339  k = ii/(nx*ny) + 1
10340 ! set the value of the porosity. if not zero, it is set
10341 ! to average the eddy-viscosity and to take the factor
10342 ! rfilv into account.
10343  por = half*rfilv
10344  if (pork(i, j, k) .eq. noflux) por = zero
10345 ! compute the laminar and (if present) the eddy viscosities
10346 ! multiplied by the porosity. compute the factor in front of
10347 ! the gradients of the speed of sound squared for the heat
10348 ! flux.
10349  mul = por*(rlv(i, j, k)+rlv(i, j, k+1))
10350  if (eddymodel) mue = por*(rev(i, j, k)+rev(i, j, k+1))
10351  mut = mul + mue
10352  gm1 = half*(gamma(i, j, k)+gamma(i, j, k+1)) - one
10353  factlamheat = one/(prandtl*gm1)
10354  factturbheat = one/(prandtlturb*gm1)
10355  heatcoef = mul*factlamheat + mue*factturbheat
10356 ! compute the gradients at the face by averaging the four
10357 ! nodal values.
10358  u_x = fourth*(ux(i-1, j-1, k)+ux(i, j-1, k)+ux(i-1, j, k)+ux(i, &
10359 & j, k))
10360  u_y = fourth*(uy(i-1, j-1, k)+uy(i, j-1, k)+uy(i-1, j, k)+uy(i, &
10361 & j, k))
10362  u_z = fourth*(uz(i-1, j-1, k)+uz(i, j-1, k)+uz(i-1, j, k)+uz(i, &
10363 & j, k))
10364  v_x = fourth*(vx(i-1, j-1, k)+vx(i, j-1, k)+vx(i-1, j, k)+vx(i, &
10365 & j, k))
10366  v_y = fourth*(vy(i-1, j-1, k)+vy(i, j-1, k)+vy(i-1, j, k)+vy(i, &
10367 & j, k))
10368  v_z = fourth*(vz(i-1, j-1, k)+vz(i, j-1, k)+vz(i-1, j, k)+vz(i, &
10369 & j, k))
10370  w_x = fourth*(wx(i-1, j-1, k)+wx(i, j-1, k)+wx(i-1, j, k)+wx(i, &
10371 & j, k))
10372  w_y = fourth*(wy(i-1, j-1, k)+wy(i, j-1, k)+wy(i-1, j, k)+wy(i, &
10373 & j, k))
10374  w_z = fourth*(wz(i-1, j-1, k)+wz(i, j-1, k)+wz(i-1, j, k)+wz(i, &
10375 & j, k))
10376  q_x = fourth*(qx(i-1, j-1, k)+qx(i, j-1, k)+qx(i-1, j, k)+qx(i, &
10377 & j, k))
10378  q_y = fourth*(qy(i-1, j-1, k)+qy(i, j-1, k)+qy(i-1, j, k)+qy(i, &
10379 & j, k))
10380  q_z = fourth*(qz(i-1, j-1, k)+qz(i, j-1, k)+qz(i-1, j, k)+qz(i, &
10381 & j, k))
10382 ! the gradients in the normal direction are corrected, such
10383 ! that no averaging takes places here.
10384 ! first determine the vector in the direction from the
10385 ! cell center k to cell center k+1.
10386  ssx = eighth*(x(i-1, j-1, k+1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j, &
10387 & k+1, 1)-x(i-1, j, k-1, 1)+x(i, j-1, k+1, 1)-x(i, j-1, k-1, 1)+&
10388 & x(i, j, k+1, 1)-x(i, j, k-1, 1))
10389  ssy = eighth*(x(i-1, j-1, k+1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j, &
10390 & k+1, 2)-x(i-1, j, k-1, 2)+x(i, j-1, k+1, 2)-x(i, j-1, k-1, 2)+&
10391 & x(i, j, k+1, 2)-x(i, j, k-1, 2))
10392  ssz = eighth*(x(i-1, j-1, k+1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j, &
10393 & k+1, 3)-x(i-1, j, k-1, 3)+x(i, j-1, k+1, 3)-x(i, j-1, k-1, 3)+&
10394 & x(i, j, k+1, 3)-x(i, j, k-1, 3))
10395 ! determine the length of this vector and create the
10396 ! unit normal.
10397  ss = one/sqrt(ssx*ssx+ssy*ssy+ssz*ssz)
10398  ssx = ss*ssx
10399  ssy = ss*ssy
10400  ssz = ss*ssz
10401 ! correct the gradients.
10402  corr = u_x*ssx + u_y*ssy + u_z*ssz - (w(i, j, k+1, ivx)-w(i, j, &
10403 & k, ivx))*ss
10404  u_x = u_x - corr*ssx
10405  u_y = u_y - corr*ssy
10406  u_z = u_z - corr*ssz
10407  corr = v_x*ssx + v_y*ssy + v_z*ssz - (w(i, j, k+1, ivy)-w(i, j, &
10408 & k, ivy))*ss
10409  v_x = v_x - corr*ssx
10410  v_y = v_y - corr*ssy
10411  v_z = v_z - corr*ssz
10412  corr = w_x*ssx + w_y*ssy + w_z*ssz - (w(i, j, k+1, ivz)-w(i, j, &
10413 & k, ivz))*ss
10414  w_x = w_x - corr*ssx
10415  w_y = w_y - corr*ssy
10416  w_z = w_z - corr*ssz
10417  corr = q_x*ssx + q_y*ssy + q_z*ssz + (aa(i, j, k+1)-aa(i, j, k))&
10418 & *ss
10419  q_x = q_x - corr*ssx
10420  q_y = q_y - corr*ssy
10421  q_z = q_z - corr*ssz
10422 ! compute the stress tensor and the heat flux vector.
10423 ! we remove the viscosity from the stress tensor (tau)
10424 ! to define taus since we still need to separate between
10425 ! laminar and turbulent stress for qcr.
10426 ! therefore, laminar tau = mue*taus, turbulent
10427 ! tau = mue*taus, and total tau = mut*taus.
10428  fracdiv = twothird*(u_x+v_y+w_z)
10429  tauxxs = two*u_x - fracdiv
10430  tauyys = two*v_y - fracdiv
10431  tauzzs = two*w_z - fracdiv
10432  tauxys = u_y + v_x
10433  tauxzs = u_z + w_x
10434  tauyzs = v_z + w_y
10435  q_x = heatcoef*q_x
10436  q_y = heatcoef*q_y
10437  q_z = heatcoef*q_z
10438 ! add qcr corrections if necessary
10439  if (useqcr) then
10440 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
10441 !
10442 ! tau_ij,qcr = tau_ij - e_ij
10443 !
10444 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
10445 !
10446 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
10447 !
10448 ! we are computing o_ik as follows:
10449 !
10450 ! o_ik = 2*w_ik/den
10451 !
10452 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
10453 ! compute denominator
10454  den = sqrt(u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
10455 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z)
10456  if (den .lt. xminn) then
10457  den = xminn
10458  else
10459  den = den
10460  end if
10461 ! compute factor that will multiply all tensor components.
10462 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
10463 ! components as well.
10464  fact = mue*ccr1/den
10465 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
10466 ! the diagonals of the vorticity tensor components are always zero
10467  wxy = u_y - v_x
10468  wxz = u_z - w_x
10469  wyz = v_z - w_y
10470  wyx = -wxy
10471  wzx = -wxz
10472  wzy = -wyz
10473 ! compute the extra terms of the boussinesq relation
10474  exx = fact*(wxy*tauxys+wxz*tauxzs)*two
10475  eyy = fact*(wyx*tauxys+wyz*tauyzs)*two
10476  ezz = fact*(wzx*tauxzs+wzy*tauyzs)*two
10477  exy = fact*(wxy*tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)
10478  exz = fact*(wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)
10479  eyz = fact*(wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)
10480 ! apply the total viscosity to the stress tensor and add extra terms
10481  tauxx = mut*tauxxs - exx
10482  tauyy = mut*tauyys - eyy
10483  tauzz = mut*tauzzs - ezz
10484  tauxy = mut*tauxys - exy
10485  tauxz = mut*tauxzs - exz
10486  tauyz = mut*tauyzs - eyz
10487  else
10488 ! just apply the total viscosity to the stress tensor
10489  tauxx = mut*tauxxs
10490  tauyy = mut*tauyys
10491  tauzz = mut*tauzzs
10492  tauxy = mut*tauxys
10493  tauxz = mut*tauxzs
10494  tauyz = mut*tauyzs
10495  end if
10496 ! compute the average velocities for the face. remember that
10497 ! the velocities are stored and not the momentum.
10498  ubar = half*(w(i, j, k, ivx)+w(i, j, k+1, ivx))
10499  vbar = half*(w(i, j, k, ivy)+w(i, j, k+1, ivy))
10500  wbar = half*(w(i, j, k, ivz)+w(i, j, k+1, ivz))
10501 ! compute the viscous fluxes for this k-face.
10502  fmx = tauxx*sk(i, j, k, 1) + tauxy*sk(i, j, k, 2) + tauxz*sk(i, &
10503 & j, k, 3)
10504  fmy = tauxy*sk(i, j, k, 1) + tauyy*sk(i, j, k, 2) + tauyz*sk(i, &
10505 & j, k, 3)
10506  fmz = tauxz*sk(i, j, k, 1) + tauyz*sk(i, j, k, 2) + tauzz*sk(i, &
10507 & j, k, 3)
10508  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*sk(i, j, k, 1)
10509  frhoe = frhoe + (ubar*tauxy+vbar*tauyy+wbar*tauyz)*sk(i, j, k, 2&
10510 & )
10511  frhoe = frhoe + (ubar*tauxz+vbar*tauyz+wbar*tauzz)*sk(i, j, k, 3&
10512 & )
10513  frhoe = frhoe - q_x*sk(i, j, k, 1) - q_y*sk(i, j, k, 2) - q_z*sk&
10514 & (i, j, k, 3)
10515 ! update the residuals of cell k and k+1.
10516  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
10517  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
10518  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
10519  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
10520  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fmx
10521  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fmy
10522  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fmz
10523  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + frhoe
10524 ! store the stress tensor and the heat flux vector if this
10525 ! face is part of a viscous subface. both the cases k == 1
10526 ! and k == kl must be tested.
10527  if (k .eq. 1 .and. storewalltensor .and. visckminpointer(i, j) &
10528 & .gt. 0) then
10529 ! we need to index viscsubface with visckminpointer(i,j)
10530 ! since tapenade does not like temporary indexes
10531  viscsubface(visckminpointer(i, j))%tau(i, j, 1) = tauxx
10532  viscsubface(visckminpointer(i, j))%tau(i, j, 2) = tauyy
10533  viscsubface(visckminpointer(i, j))%tau(i, j, 3) = tauzz
10534  viscsubface(visckminpointer(i, j))%tau(i, j, 4) = tauxy
10535  viscsubface(visckminpointer(i, j))%tau(i, j, 5) = tauxz
10536  viscsubface(visckminpointer(i, j))%tau(i, j, 6) = tauyz
10537  viscsubface(visckminpointer(i, j))%q(i, j, 1) = q_x
10538  viscsubface(visckminpointer(i, j))%q(i, j, 2) = q_y
10539  viscsubface(visckminpointer(i, j))%q(i, j, 3) = q_z
10540  end if
10541 ! and the k == kl case.
10542  if (k .eq. kl .and. storewalltensor .and. visckmaxpointer(i, j) &
10543 & .gt. 0) then
10544  viscsubface(visckmaxpointer(i, j))%tau(i, j, 1) = tauxx
10545  viscsubface(visckmaxpointer(i, j))%tau(i, j, 2) = tauyy
10546  viscsubface(visckmaxpointer(i, j))%tau(i, j, 3) = tauzz
10547  viscsubface(visckmaxpointer(i, j))%tau(i, j, 4) = tauxy
10548  viscsubface(visckmaxpointer(i, j))%tau(i, j, 5) = tauxz
10549  viscsubface(visckmaxpointer(i, j))%tau(i, j, 6) = tauyz
10550  viscsubface(visckmaxpointer(i, j))%q(i, j, 1) = q_x
10551  viscsubface(visckmaxpointer(i, j))%q(i, j, 2) = q_y
10552  viscsubface(visckmaxpointer(i, j))%q(i, j, 3) = q_z
10553  end if
10554  end do
10555 !$ad checkpoint-end
10556 !
10557 ! viscous fluxes in the j-direction.
10558 !
10559  continue
10560 !$ad checkpoint-start
10561  mue = zero
10562 !$ad ii-loop
10563  do ii=0,nx*jl*nz-1
10564  i = mod(ii, nx) + 2
10565  j = mod(ii/nx, jl) + 1
10566  k = ii/(nx*jl) + 2
10567 ! set the value of the porosity. if not zero, it is set
10568 ! to average the eddy-viscosity and to take the factor
10569 ! rfilv into account.
10570  por = half*rfilv
10571  if (porj(i, j, k) .eq. noflux) por = zero
10572 ! compute the laminar and (if present) the eddy viscosities
10573 ! multiplied by the porosity. compute the factor in front of
10574 ! the gradients of the speed of sound squared for the heat
10575 ! flux.
10576  mul = por*(rlv(i, j, k)+rlv(i, j+1, k))
10577  if (eddymodel) mue = por*(rev(i, j, k)+rev(i, j+1, k))
10578  mut = mul + mue
10579  gm1 = half*(gamma(i, j, k)+gamma(i, j+1, k)) - one
10580  factlamheat = one/(prandtl*gm1)
10581  factturbheat = one/(prandtlturb*gm1)
10582  heatcoef = mul*factlamheat + mue*factturbheat
10583 ! compute the gradients at the face by averaging the four
10584 ! nodal values.
10585  u_x = fourth*(ux(i-1, j, k-1)+ux(i, j, k-1)+ux(i-1, j, k)+ux(i, &
10586 & j, k))
10587  u_y = fourth*(uy(i-1, j, k-1)+uy(i, j, k-1)+uy(i-1, j, k)+uy(i, &
10588 & j, k))
10589  u_z = fourth*(uz(i-1, j, k-1)+uz(i, j, k-1)+uz(i-1, j, k)+uz(i, &
10590 & j, k))
10591  v_x = fourth*(vx(i-1, j, k-1)+vx(i, j, k-1)+vx(i-1, j, k)+vx(i, &
10592 & j, k))
10593  v_y = fourth*(vy(i-1, j, k-1)+vy(i, j, k-1)+vy(i-1, j, k)+vy(i, &
10594 & j, k))
10595  v_z = fourth*(vz(i-1, j, k-1)+vz(i, j, k-1)+vz(i-1, j, k)+vz(i, &
10596 & j, k))
10597  w_x = fourth*(wx(i-1, j, k-1)+wx(i, j, k-1)+wx(i-1, j, k)+wx(i, &
10598 & j, k))
10599  w_y = fourth*(wy(i-1, j, k-1)+wy(i, j, k-1)+wy(i-1, j, k)+wy(i, &
10600 & j, k))
10601  w_z = fourth*(wz(i-1, j, k-1)+wz(i, j, k-1)+wz(i-1, j, k)+wz(i, &
10602 & j, k))
10603  q_x = fourth*(qx(i-1, j, k-1)+qx(i, j, k-1)+qx(i-1, j, k)+qx(i, &
10604 & j, k))
10605  q_y = fourth*(qy(i-1, j, k-1)+qy(i, j, k-1)+qy(i-1, j, k)+qy(i, &
10606 & j, k))
10607  q_z = fourth*(qz(i-1, j, k-1)+qz(i, j, k-1)+qz(i-1, j, k)+qz(i, &
10608 & j, k))
10609 ! the gradients in the normal direction are corrected, such
10610 ! that no averaging takes places here.
10611 ! first determine the vector in the direction from the
10612 ! cell center j to cell center j+1.
10613  ssx = eighth*(x(i-1, j+1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j+1&
10614 & , k, 1)-x(i-1, j-1, k, 1)+x(i, j+1, k-1, 1)-x(i, j-1, k-1, 1)+&
10615 & x(i, j+1, k, 1)-x(i, j-1, k, 1))
10616  ssy = eighth*(x(i-1, j+1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j+1&
10617 & , k, 2)-x(i-1, j-1, k, 2)+x(i, j+1, k-1, 2)-x(i, j-1, k-1, 2)+&
10618 & x(i, j+1, k, 2)-x(i, j-1, k, 2))
10619  ssz = eighth*(x(i-1, j+1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j+1&
10620 & , k, 3)-x(i-1, j-1, k, 3)+x(i, j+1, k-1, 3)-x(i, j-1, k-1, 3)+&
10621 & x(i, j+1, k, 3)-x(i, j-1, k, 3))
10622 ! determine the length of this vector and create the
10623 ! unit normal.
10624  ss = one/sqrt(ssx*ssx+ssy*ssy+ssz*ssz)
10625  ssx = ss*ssx
10626  ssy = ss*ssy
10627  ssz = ss*ssz
10628 ! correct the gradients.
10629  corr = u_x*ssx + u_y*ssy + u_z*ssz - (w(i, j+1, k, ivx)-w(i, j, &
10630 & k, ivx))*ss
10631  u_x = u_x - corr*ssx
10632  u_y = u_y - corr*ssy
10633  u_z = u_z - corr*ssz
10634  corr = v_x*ssx + v_y*ssy + v_z*ssz - (w(i, j+1, k, ivy)-w(i, j, &
10635 & k, ivy))*ss
10636  v_x = v_x - corr*ssx
10637  v_y = v_y - corr*ssy
10638  v_z = v_z - corr*ssz
10639  corr = w_x*ssx + w_y*ssy + w_z*ssz - (w(i, j+1, k, ivz)-w(i, j, &
10640 & k, ivz))*ss
10641  w_x = w_x - corr*ssx
10642  w_y = w_y - corr*ssy
10643  w_z = w_z - corr*ssz
10644  corr = q_x*ssx + q_y*ssy + q_z*ssz + (aa(i, j+1, k)-aa(i, j, k))&
10645 & *ss
10646  q_x = q_x - corr*ssx
10647  q_y = q_y - corr*ssy
10648  q_z = q_z - corr*ssz
10649 ! compute the stress tensor and the heat flux vector.
10650 ! we remove the viscosity from the stress tensor (tau)
10651 ! to define taus since we still need to separate between
10652 ! laminar and turbulent stress for qcr.
10653 ! therefore, laminar tau = mue*taus, turbulent
10654 ! tau = mue*taus, and total tau = mut*taus.
10655  fracdiv = twothird*(u_x+v_y+w_z)
10656  tauxxs = two*u_x - fracdiv
10657  tauyys = two*v_y - fracdiv
10658  tauzzs = two*w_z - fracdiv
10659  tauxys = u_y + v_x
10660  tauxzs = u_z + w_x
10661  tauyzs = v_z + w_y
10662  q_x = heatcoef*q_x
10663  q_y = heatcoef*q_y
10664  q_z = heatcoef*q_z
10665 ! add qcr corrections if necessary
10666  if (useqcr) then
10667 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
10668 !
10669 ! tau_ij,qcr = tau_ij - e_ij
10670 !
10671 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
10672 !
10673 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
10674 !
10675 ! we are computing o_ik as follows:
10676 !
10677 ! o_ik = 2*w_ik/den
10678 !
10679 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
10680 ! compute denominator
10681  den = sqrt(u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
10682 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z)
10683  if (den .lt. xminn) then
10684  den = xminn
10685  else
10686  den = den
10687  end if
10688 ! compute factor that will multiply all tensor components.
10689 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
10690 ! components as well.
10691  fact = mue*ccr1/den
10692 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
10693 ! the diagonals of the vorticity tensor components are always zero
10694  wxy = u_y - v_x
10695  wxz = u_z - w_x
10696  wyz = v_z - w_y
10697  wyx = -wxy
10698  wzx = -wxz
10699  wzy = -wyz
10700 ! compute the extra terms of the boussinesq relation
10701  exx = fact*(wxy*tauxys+wxz*tauxzs)*two
10702  eyy = fact*(wyx*tauxys+wyz*tauyzs)*two
10703  ezz = fact*(wzx*tauxzs+wzy*tauyzs)*two
10704  exy = fact*(wxy*tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)
10705  exz = fact*(wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)
10706  eyz = fact*(wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)
10707 ! apply the total viscosity to the stress tensor and add extra terms
10708  tauxx = mut*tauxxs - exx
10709  tauyy = mut*tauyys - eyy
10710  tauzz = mut*tauzzs - ezz
10711  tauxy = mut*tauxys - exy
10712  tauxz = mut*tauxzs - exz
10713  tauyz = mut*tauyzs - eyz
10714  else
10715 ! just apply the total viscosity to the stress tensor
10716  tauxx = mut*tauxxs
10717  tauyy = mut*tauyys
10718  tauzz = mut*tauzzs
10719  tauxy = mut*tauxys
10720  tauxz = mut*tauxzs
10721  tauyz = mut*tauyzs
10722  end if
10723 ! compute the average velocities for the face. remember that
10724 ! the velocities are stored and not the momentum.
10725  ubar = half*(w(i, j, k, ivx)+w(i, j+1, k, ivx))
10726  vbar = half*(w(i, j, k, ivy)+w(i, j+1, k, ivy))
10727  wbar = half*(w(i, j, k, ivz)+w(i, j+1, k, ivz))
10728 ! compute the viscous fluxes for this j-face.
10729  fmx = tauxx*sj(i, j, k, 1) + tauxy*sj(i, j, k, 2) + tauxz*sj(i, &
10730 & j, k, 3)
10731  fmy = tauxy*sj(i, j, k, 1) + tauyy*sj(i, j, k, 2) + tauyz*sj(i, &
10732 & j, k, 3)
10733  fmz = tauxz*sj(i, j, k, 1) + tauyz*sj(i, j, k, 2) + tauzz*sj(i, &
10734 & j, k, 3)
10735  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*sj(i, j, k, 1) + (&
10736 & ubar*tauxy+vbar*tauyy+wbar*tauyz)*sj(i, j, k, 2) + (ubar*tauxz&
10737 & +vbar*tauyz+wbar*tauzz)*sj(i, j, k, 3) - q_x*sj(i, j, k, 1) - &
10738 & q_y*sj(i, j, k, 2) - q_z*sj(i, j, k, 3)
10739 ! update the residuals of cell j and j+1.
10740  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
10741  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
10742  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
10743  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
10744  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fmx
10745  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fmy
10746  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fmz
10747  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + frhoe
10748 ! store the stress tensor and the heat flux vector if this
10749 ! face is part of a viscous subface. both the cases j == 1
10750 ! and j == jl must be tested.
10751  if (j .eq. 1 .and. storewalltensor .and. viscjminpointer(i, k) &
10752 & .gt. 0) then
10753 ! we need to index viscsubface with viscjminpointer(i,k)
10754 ! since tapenade does not like temporary indexes
10755  viscsubface(viscjminpointer(i, k))%tau(i, k, 1) = tauxx
10756  viscsubface(viscjminpointer(i, k))%tau(i, k, 2) = tauyy
10757  viscsubface(viscjminpointer(i, k))%tau(i, k, 3) = tauzz
10758  viscsubface(viscjminpointer(i, k))%tau(i, k, 4) = tauxy
10759  viscsubface(viscjminpointer(i, k))%tau(i, k, 5) = tauxz
10760  viscsubface(viscjminpointer(i, k))%tau(i, k, 6) = tauyz
10761  viscsubface(viscjminpointer(i, k))%q(i, k, 1) = q_x
10762  viscsubface(viscjminpointer(i, k))%q(i, k, 2) = q_y
10763  viscsubface(viscjminpointer(i, k))%q(i, k, 3) = q_z
10764  end if
10765 ! and the j == jl case.
10766  if (j .eq. jl .and. storewalltensor .and. viscjmaxpointer(i, k) &
10767 & .gt. 0) then
10768  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 1) = tauxx
10769  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 2) = tauyy
10770  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 3) = tauzz
10771  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 4) = tauxy
10772  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 5) = tauxz
10773  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 6) = tauyz
10774  viscsubface(viscjmaxpointer(i, k))%q(i, k, 1) = q_x
10775  viscsubface(viscjmaxpointer(i, k))%q(i, k, 2) = q_y
10776  viscsubface(viscjmaxpointer(i, k))%q(i, k, 3) = q_z
10777  end if
10778  end do
10779 !$ad checkpoint-end
10780 !
10781 ! viscous fluxes in the i-direction.
10782 !
10783  continue
10784 !$ad checkpoint-start
10785  mue = zero
10786 !$ad ii-loop
10787  do ii=0,il*ny*nz-1
10788  i = mod(ii, il) + 1
10789  j = mod(ii/il, ny) + 2
10790  k = ii/(il*ny) + 2
10791 ! set the value of the porosity. if not zero, it is set
10792 ! to average the eddy-viscosity and to take the factor
10793 ! rfilv into account.
10794  por = half*rfilv
10795  if (pori(i, j, k) .eq. noflux) por = zero
10796 ! compute the laminar and (if present) the eddy viscosities
10797 ! multiplied the porosity. compute the factor in front of
10798 ! the gradients of the speed of sound squared for the heat
10799 ! flux.
10800  mul = por*(rlv(i, j, k)+rlv(i+1, j, k))
10801  if (eddymodel) mue = por*(rev(i, j, k)+rev(i+1, j, k))
10802  mut = mul + mue
10803  gm1 = half*(gamma(i, j, k)+gamma(i+1, j, k)) - one
10804  factlamheat = one/(prandtl*gm1)
10805  factturbheat = one/(prandtlturb*gm1)
10806  heatcoef = mul*factlamheat + mue*factturbheat
10807 ! compute the gradients at the face by averaging the four
10808 ! nodal values.
10809  u_x = fourth*(ux(i, j-1, k-1)+ux(i, j, k-1)+ux(i, j-1, k)+ux(i, &
10810 & j, k))
10811  u_y = fourth*(uy(i, j-1, k-1)+uy(i, j, k-1)+uy(i, j-1, k)+uy(i, &
10812 & j, k))
10813  u_z = fourth*(uz(i, j-1, k-1)+uz(i, j, k-1)+uz(i, j-1, k)+uz(i, &
10814 & j, k))
10815  v_x = fourth*(vx(i, j-1, k-1)+vx(i, j, k-1)+vx(i, j-1, k)+vx(i, &
10816 & j, k))
10817  v_y = fourth*(vy(i, j-1, k-1)+vy(i, j, k-1)+vy(i, j-1, k)+vy(i, &
10818 & j, k))
10819  v_z = fourth*(vz(i, j-1, k-1)+vz(i, j, k-1)+vz(i, j-1, k)+vz(i, &
10820 & j, k))
10821  w_x = fourth*(wx(i, j-1, k-1)+wx(i, j, k-1)+wx(i, j-1, k)+wx(i, &
10822 & j, k))
10823  w_y = fourth*(wy(i, j-1, k-1)+wy(i, j, k-1)+wy(i, j-1, k)+wy(i, &
10824 & j, k))
10825  w_z = fourth*(wz(i, j-1, k-1)+wz(i, j, k-1)+wz(i, j-1, k)+wz(i, &
10826 & j, k))
10827  q_x = fourth*(qx(i, j-1, k-1)+qx(i, j, k-1)+qx(i, j-1, k)+qx(i, &
10828 & j, k))
10829  q_y = fourth*(qy(i, j-1, k-1)+qy(i, j, k-1)+qy(i, j-1, k)+qy(i, &
10830 & j, k))
10831  q_z = fourth*(qz(i, j-1, k-1)+qz(i, j, k-1)+qz(i, j-1, k)+qz(i, &
10832 & j, k))
10833 ! the gradients in the normal direction are corrected, such
10834 ! that no averaging takes places here.
10835 ! first determine the vector in the direction from the
10836 ! cell center i to cell center i+1.
10837  ssx = eighth*(x(i+1, j-1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i+1, j-1&
10838 & , k, 1)-x(i-1, j-1, k, 1)+x(i+1, j, k-1, 1)-x(i-1, j, k-1, 1)+&
10839 & x(i+1, j, k, 1)-x(i-1, j, k, 1))
10840  ssy = eighth*(x(i+1, j-1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i+1, j-1&
10841 & , k, 2)-x(i-1, j-1, k, 2)+x(i+1, j, k-1, 2)-x(i-1, j, k-1, 2)+&
10842 & x(i+1, j, k, 2)-x(i-1, j, k, 2))
10843  ssz = eighth*(x(i+1, j-1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i+1, j-1&
10844 & , k, 3)-x(i-1, j-1, k, 3)+x(i+1, j, k-1, 3)-x(i-1, j, k-1, 3)+&
10845 & x(i+1, j, k, 3)-x(i-1, j, k, 3))
10846 ! determine the length of this vector and create the
10847 ! unit normal.
10848  ss = one/sqrt(ssx*ssx+ssy*ssy+ssz*ssz)
10849  ssx = ss*ssx
10850  ssy = ss*ssy
10851  ssz = ss*ssz
10852 ! correct the gradients.
10853  corr = u_x*ssx + u_y*ssy + u_z*ssz - (w(i+1, j, k, ivx)-w(i, j, &
10854 & k, ivx))*ss
10855  u_x = u_x - corr*ssx
10856  u_y = u_y - corr*ssy
10857  u_z = u_z - corr*ssz
10858  corr = v_x*ssx + v_y*ssy + v_z*ssz - (w(i+1, j, k, ivy)-w(i, j, &
10859 & k, ivy))*ss
10860  v_x = v_x - corr*ssx
10861  v_y = v_y - corr*ssy
10862  v_z = v_z - corr*ssz
10863  corr = w_x*ssx + w_y*ssy + w_z*ssz - (w(i+1, j, k, ivz)-w(i, j, &
10864 & k, ivz))*ss
10865  w_x = w_x - corr*ssx
10866  w_y = w_y - corr*ssy
10867  w_z = w_z - corr*ssz
10868  corr = q_x*ssx + q_y*ssy + q_z*ssz + (aa(i+1, j, k)-aa(i, j, k))&
10869 & *ss
10870  q_x = q_x - corr*ssx
10871  q_y = q_y - corr*ssy
10872  q_z = q_z - corr*ssz
10873 ! compute the stress tensor and the heat flux vector.
10874 ! we remove the viscosity from the stress tensor (tau)
10875 ! to define taus since we still need to separate between
10876 ! laminar and turbulent stress for qcr.
10877 ! therefore, laminar tau = mue*taus, turbulent
10878 ! tau = mue*taus, and total tau = mut*taus.
10879  fracdiv = twothird*(u_x+v_y+w_z)
10880  tauxxs = two*u_x - fracdiv
10881  tauyys = two*v_y - fracdiv
10882  tauzzs = two*w_z - fracdiv
10883  tauxys = u_y + v_x
10884  tauxzs = u_z + w_x
10885  tauyzs = v_z + w_y
10886  q_x = heatcoef*q_x
10887  q_y = heatcoef*q_y
10888  q_z = heatcoef*q_z
10889 ! add qcr corrections if necessary
10890  if (useqcr) then
10891 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
10892 !
10893 ! tau_ij,qcr = tau_ij - e_ij
10894 !
10895 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
10896 !
10897 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
10898 !
10899 ! we are computing o_ik as follows:
10900 !
10901 ! o_ik = 2*w_ik/den
10902 !
10903 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
10904 ! compute denominator
10905  den = sqrt(u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
10906 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z)
10907  if (den .lt. xminn) then
10908  den = xminn
10909  else
10910  den = den
10911  end if
10912 ! compute factor that will multiply all tensor components.
10913 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
10914 ! components as well.
10915  fact = mue*ccr1/den
10916 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
10917 ! the diagonals of the vorticity tensor components are always zero
10918  wxy = u_y - v_x
10919  wxz = u_z - w_x
10920  wyz = v_z - w_y
10921  wyx = -wxy
10922  wzx = -wxz
10923  wzy = -wyz
10924 ! compute the extra terms of the boussinesq relation
10925  exx = fact*(wxy*tauxys+wxz*tauxzs)*two
10926  eyy = fact*(wyx*tauxys+wyz*tauyzs)*two
10927  ezz = fact*(wzx*tauxzs+wzy*tauyzs)*two
10928  exy = fact*(wxy*tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)
10929  exz = fact*(wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)
10930  eyz = fact*(wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)
10931 ! apply the total viscosity to the stress tensor and add extra terms
10932  tauxx = mut*tauxxs - exx
10933  tauyy = mut*tauyys - eyy
10934  tauzz = mut*tauzzs - ezz
10935  tauxy = mut*tauxys - exy
10936  tauxz = mut*tauxzs - exz
10937  tauyz = mut*tauyzs - eyz
10938  else
10939 ! just apply the total viscosity to the stress tensor
10940  tauxx = mut*tauxxs
10941  tauyy = mut*tauyys
10942  tauzz = mut*tauzzs
10943  tauxy = mut*tauxys
10944  tauxz = mut*tauxzs
10945  tauyz = mut*tauyzs
10946  end if
10947 ! compute the average velocities for the face. remember that
10948 ! the velocities are stored and not the momentum.
10949  ubar = half*(w(i, j, k, ivx)+w(i+1, j, k, ivx))
10950  vbar = half*(w(i, j, k, ivy)+w(i+1, j, k, ivy))
10951  wbar = half*(w(i, j, k, ivz)+w(i+1, j, k, ivz))
10952 ! compute the viscous fluxes for this i-face.
10953  fmx = tauxx*si(i, j, k, 1) + tauxy*si(i, j, k, 2) + tauxz*si(i, &
10954 & j, k, 3)
10955  fmy = tauxy*si(i, j, k, 1) + tauyy*si(i, j, k, 2) + tauyz*si(i, &
10956 & j, k, 3)
10957  fmz = tauxz*si(i, j, k, 1) + tauyz*si(i, j, k, 2) + tauzz*si(i, &
10958 & j, k, 3)
10959  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*si(i, j, k, 1) + (&
10960 & ubar*tauxy+vbar*tauyy+wbar*tauyz)*si(i, j, k, 2) + (ubar*tauxz&
10961 & +vbar*tauyz+wbar*tauzz)*si(i, j, k, 3) - q_x*si(i, j, k, 1) - &
10962 & q_y*si(i, j, k, 2) - q_z*si(i, j, k, 3)
10963 ! update the residuals of cell i and i+1.
10964  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
10965  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
10966  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
10967  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
10968  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fmx
10969  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fmy
10970  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fmz
10971  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + frhoe
10972 ! store the stress tensor and the heat flux vector if this
10973 ! face is part of a viscous subface. both the cases i == 1
10974 ! and i == il must be tested.
10975  if (i .eq. 1 .and. storewalltensor .and. visciminpointer(j, k) &
10976 & .gt. 0) then
10977 ! we need to index viscsubface with visciminpointer(j,k)
10978 ! since tapenade does not like temporary indexes
10979  viscsubface(visciminpointer(j, k))%tau(j, k, 1) = tauxx
10980  viscsubface(visciminpointer(j, k))%tau(j, k, 2) = tauyy
10981  viscsubface(visciminpointer(j, k))%tau(j, k, 3) = tauzz
10982  viscsubface(visciminpointer(j, k))%tau(j, k, 4) = tauxy
10983  viscsubface(visciminpointer(j, k))%tau(j, k, 5) = tauxz
10984  viscsubface(visciminpointer(j, k))%tau(j, k, 6) = tauyz
10985  viscsubface(visciminpointer(j, k))%q(j, k, 1) = q_x
10986  viscsubface(visciminpointer(j, k))%q(j, k, 2) = q_y
10987  viscsubface(visciminpointer(j, k))%q(j, k, 3) = q_z
10988  end if
10989 ! and the i == il case.
10990  if (i .eq. il .and. storewalltensor .and. viscimaxpointer(j, k) &
10991 & .gt. 0) then
10992 ! we need to index viscsubface with viscimaxpointer(j,k)
10993 ! since tapenade does not like temporary indexes
10994  viscsubface(viscimaxpointer(j, k))%tau(j, k, 1) = tauxx
10995  viscsubface(viscimaxpointer(j, k))%tau(j, k, 2) = tauyy
10996  viscsubface(viscimaxpointer(j, k))%tau(j, k, 3) = tauzz
10997  viscsubface(viscimaxpointer(j, k))%tau(j, k, 4) = tauxy
10998  viscsubface(viscimaxpointer(j, k))%tau(j, k, 5) = tauxz
10999  viscsubface(viscimaxpointer(j, k))%tau(j, k, 6) = tauyz
11000  viscsubface(viscimaxpointer(j, k))%q(j, k, 1) = q_x
11001  viscsubface(viscimaxpointer(j, k))%q(j, k, 2) = q_y
11002  viscsubface(viscimaxpointer(j, k))%q(j, k, 3) = q_z
11003  end if
11004  end do
11005 !$ad checkpoint-end
11006  continue
11007 ! possibly correct the wall shear stress.
11008 ! wall function is not aded
11009  end if
11010  end subroutine viscousflux
11011 
11012 ! differentiation of viscousfluxapprox in reverse (adjoint) mode (with options noisize i4 dr8 r8):
11013 ! gradient of useful results: *w *x *fw
11014 ! with respect to varying inputs: *rev *aa *w *x *rlv *si *sj
11015 ! *sk *fw
11016 ! rw status of diff variables: *rev:out *aa:out *w:incr *x:incr
11017 ! *rlv:out *si:out *sj:out *sk:out *fw:in-out
11018 ! plus diff mem management of: rev:in aa:in w:in x:in rlv:in
11019 ! si:in sj:in sk:in fw:in
11020  subroutine viscousfluxapprox_b()
11021  use constants
11022  use blockpointers
11023  use flowvarrefstate
11024  use inputphysics
11025  use iteration
11026  implicit none
11027 !
11028 ! local parameter.
11029 !
11030  real(kind=realtype), parameter :: twothird=two*third
11031 !
11032 ! local variables.
11033 !
11034  integer(kind=inttype) :: i, j, k
11035  integer(kind=inttype) :: ii, jj, kk
11036  real(kind=realtype) :: rfilv, por, mul, mue, mut, heatcoef
11037  real(kind=realtype) :: muld, mued, mutd, heatcoefd
11038  real(kind=realtype) :: gm1, factlamheat, factturbheat
11039  real(kind=realtype) :: u_x, u_y, u_z, v_x, v_y, v_z, w_x, w_y, w_z
11040  real(kind=realtype) :: u_xd, u_yd, u_zd, v_xd, v_yd, v_zd, w_xd, &
11041 & w_yd, w_zd
11042  real(kind=realtype) :: q_x, q_y, q_z, ubar, vbar, wbar
11043  real(kind=realtype) :: q_xd, q_yd, q_zd, ubard, vbard, wbard
11044  real(kind=realtype) :: corr, ssx, ssy, ssz, ss, fracdiv
11045  real(kind=realtype) :: ssxd, ssyd, sszd, ssd, fracdivd
11046  real(kind=realtype) :: tauxx, tauyy, tauzz
11047  real(kind=realtype) :: tauxxd, tauyyd, tauzzd
11048  real(kind=realtype) :: tauxy, tauxz, tauyz
11049  real(kind=realtype) :: tauxyd, tauxzd, tauyzd
11050  real(kind=realtype) :: fmx, fmy, fmz, frhoe
11051  real(kind=realtype) :: fmxd, fmyd, fmzd, frhoed
11052  real(kind=realtype) :: dd
11053  real(kind=realtype) :: ddd
11054  logical :: correctfork
11055  real(kind=realtype) :: temp
11056  real(kind=realtype) :: tempd
11057  real(kind=realtype) :: tempd0
11058  real(kind=realtype) :: temp0
11059  real(kind=realtype) :: tempd1
11060  integer :: branch
11061  mue = zero
11062  rfilv = rfil
11063 ! viscous fluxes in the i-direction
11064  do k=2,kl
11065  do j=2,jl
11066  do i=1,il
11067 ! compute the vector from the center of cell i to cell i+1
11068  call pushreal8(ssx)
11069  ssx = eighth*(x(i+1, j-1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i+1, j&
11070 & -1, k, 1)-x(i-1, j-1, k, 1)+x(i+1, j, k-1, 1)-x(i-1, j, k-1&
11071 & , 1)+x(i+1, j, k, 1)-x(i-1, j, k, 1))
11072  call pushreal8(ssy)
11073  ssy = eighth*(x(i+1, j-1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i+1, j&
11074 & -1, k, 2)-x(i-1, j-1, k, 2)+x(i+1, j, k-1, 2)-x(i-1, j, k-1&
11075 & , 2)+x(i+1, j, k, 2)-x(i-1, j, k, 2))
11076  call pushreal8(ssz)
11077  ssz = eighth*(x(i+1, j-1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i+1, j&
11078 & -1, k, 3)-x(i-1, j-1, k, 3)+x(i+1, j, k-1, 3)-x(i-1, j, k-1&
11079 & , 3)+x(i+1, j, k, 3)-x(i-1, j, k, 3))
11080 ! and determine one/ length of vector squared
11081  call pushreal8(ss)
11082  ss = one/(ssx*ssx+ssy*ssy+ssz*ssz)
11083  call pushreal8(ssx)
11084  ssx = ss*ssx
11085  call pushreal8(ssy)
11086  ssy = ss*ssy
11087  call pushreal8(ssz)
11088  ssz = ss*ssz
11089 ! now compute each gradient
11090  dd = w(i+1, j, k, ivx) - w(i, j, k, ivx)
11091  call pushreal8(u_x)
11092  u_x = dd*ssx
11093  call pushreal8(u_y)
11094  u_y = dd*ssy
11095  call pushreal8(u_z)
11096  u_z = dd*ssz
11097  dd = w(i+1, j, k, ivy) - w(i, j, k, ivy)
11098  call pushreal8(v_x)
11099  v_x = dd*ssx
11100  call pushreal8(v_y)
11101  v_y = dd*ssy
11102  call pushreal8(v_z)
11103  v_z = dd*ssz
11104  dd = w(i+1, j, k, ivz) - w(i, j, k, ivz)
11105  call pushreal8(w_x)
11106  w_x = dd*ssx
11107  call pushreal8(w_y)
11108  w_y = dd*ssy
11109  call pushreal8(w_z)
11110  w_z = dd*ssz
11111  dd = aa(i+1, j, k) - aa(i, j, k)
11112  call pushreal8(q_x)
11113  q_x = -(dd*ssx)
11114  call pushreal8(q_y)
11115  q_y = -(dd*ssy)
11116  call pushreal8(q_z)
11117  q_z = -(dd*ssz)
11118  call pushreal8(por)
11119  por = half*rfilv
11120  if (pori(i, j, k) .eq. noflux) por = zero
11121 ! compute the laminar and (if present) the eddy viscosities
11122 ! multiplied by the porosity. compute the factor in front of
11123 ! the gradients of the speed of sound squared for the heat
11124 ! flux.
11125  mul = por*(rlv(i, j, k)+rlv(i+1, j, k))
11126  if (eddymodel) then
11127  mue = por*(rev(i, j, k)+rev(i+1, j, k))
11128  call pushcontrol1b(0)
11129  else
11130  call pushcontrol1b(1)
11131  end if
11132  call pushreal8(mut)
11133  mut = mul + mue
11134  gm1 = half*(gamma(i, j, k)+gamma(i+1, j, k)) - one
11135  factlamheat = one/(prandtl*gm1)
11136  factturbheat = one/(prandtlturb*gm1)
11137  call pushreal8(heatcoef)
11138  heatcoef = mul*factlamheat + mue*factturbheat
11139 ! compute the stress tensor and the heat flux vector.
11140  call pushreal8(fracdiv)
11141  fracdiv = twothird*(u_x+v_y+w_z)
11142  call pushreal8(q_x)
11143  q_x = heatcoef*q_x
11144  call pushreal8(q_y)
11145  q_y = heatcoef*q_y
11146  call pushreal8(q_z)
11147  q_z = heatcoef*q_z
11148 ! compute the average velocities for the face. remember that
11149 ! the velocities are stored and not the momentum.
11150 ! compute the viscous fluxes for this i-face.
11151 ! update the residuals of cell i and i+1.
11152  end do
11153  end do
11154  end do
11155 ! viscous fluxes in the j-direction
11156  do k=2,kl
11157  do j=1,jl
11158  do i=2,il
11159 ! compute the vector from the center of cell j to cell j+1
11160  call pushreal8(ssx)
11161  ssx = eighth*(x(i-1, j+1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j&
11162 & +1, k, 1)-x(i-1, j-1, k, 1)+x(i, j+1, k-1, 1)-x(i, j-1, k-1&
11163 & , 1)+x(i, j+1, k, 1)-x(i, j-1, k, 1))
11164  call pushreal8(ssy)
11165  ssy = eighth*(x(i-1, j+1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j&
11166 & +1, k, 2)-x(i-1, j-1, k, 2)+x(i, j+1, k-1, 2)-x(i, j-1, k-1&
11167 & , 2)+x(i, j+1, k, 2)-x(i, j-1, k, 2))
11168  call pushreal8(ssz)
11169  ssz = eighth*(x(i-1, j+1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j&
11170 & +1, k, 3)-x(i-1, j-1, k, 3)+x(i, j+1, k-1, 3)-x(i, j-1, k-1&
11171 & , 3)+x(i, j+1, k, 3)-x(i, j-1, k, 3))
11172 ! and determine one/ length of vector squared
11173  call pushreal8(ss)
11174  ss = one/(ssx*ssx+ssy*ssy+ssz*ssz)
11175  call pushreal8(ssx)
11176  ssx = ss*ssx
11177  call pushreal8(ssy)
11178  ssy = ss*ssy
11179  call pushreal8(ssz)
11180  ssz = ss*ssz
11181 ! now compute each gradient
11182  dd = w(i, j+1, k, ivx) - w(i, j, k, ivx)
11183  call pushreal8(u_x)
11184  u_x = dd*ssx
11185  call pushreal8(u_y)
11186  u_y = dd*ssy
11187  call pushreal8(u_z)
11188  u_z = dd*ssz
11189  dd = w(i, j+1, k, ivy) - w(i, j, k, ivy)
11190  call pushreal8(v_x)
11191  v_x = dd*ssx
11192  call pushreal8(v_y)
11193  v_y = dd*ssy
11194  call pushreal8(v_z)
11195  v_z = dd*ssz
11196  dd = w(i, j+1, k, ivz) - w(i, j, k, ivz)
11197  call pushreal8(w_x)
11198  w_x = dd*ssx
11199  call pushreal8(w_y)
11200  w_y = dd*ssy
11201  call pushreal8(w_z)
11202  w_z = dd*ssz
11203  dd = aa(i, j+1, k) - aa(i, j, k)
11204  call pushreal8(q_x)
11205  q_x = -(dd*ssx)
11206  call pushreal8(q_y)
11207  q_y = -(dd*ssy)
11208  call pushreal8(q_z)
11209  q_z = -(dd*ssz)
11210  call pushreal8(por)
11211  por = half*rfilv
11212  if (porj(i, j, k) .eq. noflux) por = zero
11213 ! compute the laminar and (if present) the eddy viscosities
11214 ! multiplied by the porosity. compute the factor in front of
11215 ! the gradients of the speed of sound squared for the heat
11216 ! flux.
11217  mul = por*(rlv(i, j, k)+rlv(i, j+1, k))
11218  if (eddymodel) then
11219  mue = por*(rev(i, j, k)+rev(i, j+1, k))
11220  call pushcontrol1b(0)
11221  else
11222  call pushcontrol1b(1)
11223  end if
11224  call pushreal8(mut)
11225  mut = mul + mue
11226  gm1 = half*(gamma(i, j, k)+gamma(i, j+1, k)) - one
11227  factlamheat = one/(prandtl*gm1)
11228  factturbheat = one/(prandtlturb*gm1)
11229  call pushreal8(heatcoef)
11230  heatcoef = mul*factlamheat + mue*factturbheat
11231 ! compute the stress tensor and the heat flux vector.
11232  call pushreal8(fracdiv)
11233  fracdiv = twothird*(u_x+v_y+w_z)
11234  call pushreal8(q_x)
11235  q_x = heatcoef*q_x
11236  call pushreal8(q_y)
11237  q_y = heatcoef*q_y
11238  call pushreal8(q_z)
11239  q_z = heatcoef*q_z
11240 ! compute the average velocities for the face. remember that
11241 ! the velocities are stored and not the momentum.
11242 ! compute the viscous fluxes for this j-face.
11243 ! update the residuals of cell j and j+1.
11244  end do
11245  end do
11246  end do
11247 ! viscous fluxes in the k-direction
11248  do k=1,kl
11249  do j=2,jl
11250  do i=2,il
11251 ! compute the vector from the center of cell k to cell k+1
11252  call pushreal8(ssx)
11253  ssx = eighth*(x(i-1, j-1, k+1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j&
11254 & , k+1, 1)-x(i-1, j, k-1, 1)+x(i, j-1, k+1, 1)-x(i, j-1, k-1&
11255 & , 1)+x(i, j, k+1, 1)-x(i, j, k-1, 1))
11256  call pushreal8(ssy)
11257  ssy = eighth*(x(i-1, j-1, k+1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j&
11258 & , k+1, 2)-x(i-1, j, k-1, 2)+x(i, j-1, k+1, 2)-x(i, j-1, k-1&
11259 & , 2)+x(i, j, k+1, 2)-x(i, j, k-1, 2))
11260  call pushreal8(ssz)
11261  ssz = eighth*(x(i-1, j-1, k+1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j&
11262 & , k+1, 3)-x(i-1, j, k-1, 3)+x(i, j-1, k+1, 3)-x(i, j-1, k-1&
11263 & , 3)+x(i, j, k+1, 3)-x(i, j, k-1, 3))
11264 ! and determine one/ length of vector squared
11265  call pushreal8(ss)
11266  ss = one/(ssx*ssx+ssy*ssy+ssz*ssz)
11267  call pushreal8(ssx)
11268  ssx = ss*ssx
11269  call pushreal8(ssy)
11270  ssy = ss*ssy
11271  call pushreal8(ssz)
11272  ssz = ss*ssz
11273 ! now compute each gradient
11274  dd = w(i, j, k+1, ivx) - w(i, j, k, ivx)
11275  call pushreal8(u_x)
11276  u_x = dd*ssx
11277  call pushreal8(u_y)
11278  u_y = dd*ssy
11279  call pushreal8(u_z)
11280  u_z = dd*ssz
11281  dd = w(i, j, k+1, ivy) - w(i, j, k, ivy)
11282  call pushreal8(v_x)
11283  v_x = dd*ssx
11284  call pushreal8(v_y)
11285  v_y = dd*ssy
11286  call pushreal8(v_z)
11287  v_z = dd*ssz
11288  dd = w(i, j, k+1, ivz) - w(i, j, k, ivz)
11289  call pushreal8(w_x)
11290  w_x = dd*ssx
11291  call pushreal8(w_y)
11292  w_y = dd*ssy
11293  call pushreal8(w_z)
11294  w_z = dd*ssz
11295  dd = aa(i, j, k+1) - aa(i, j, k)
11296  call pushreal8(q_x)
11297  q_x = -(dd*ssx)
11298  call pushreal8(q_y)
11299  q_y = -(dd*ssy)
11300  call pushreal8(q_z)
11301  q_z = -(dd*ssz)
11302  call pushreal8(por)
11303  por = half*rfilv
11304  if (pork(i, j, k) .eq. noflux) por = zero
11305 ! compute the laminar and (if present) the eddy viscosities
11306 ! multiplied by the porosity. compute the factor in front of
11307 ! the gradients of the speed of sound squared for the heat
11308 ! flux.
11309  mul = por*(rlv(i, j, k)+rlv(i, j, k+1))
11310  if (eddymodel) then
11311  mue = por*(rev(i, j, k)+rev(i, j, k+1))
11312  call pushcontrol1b(0)
11313  else
11314  call pushcontrol1b(1)
11315  end if
11316  call pushreal8(mut)
11317  mut = mul + mue
11318  gm1 = half*(gamma(i, j, k)+gamma(i, j, k+1)) - one
11319  factlamheat = one/(prandtl*gm1)
11320  factturbheat = one/(prandtlturb*gm1)
11321  call pushreal8(heatcoef)
11322  heatcoef = mul*factlamheat + mue*factturbheat
11323 ! compute the stress tensor and the heat flux vector.
11324  call pushreal8(fracdiv)
11325  fracdiv = twothird*(u_x+v_y+w_z)
11326  call pushreal8(q_x)
11327  q_x = heatcoef*q_x
11328  call pushreal8(q_y)
11329  q_y = heatcoef*q_y
11330  call pushreal8(q_z)
11331  q_z = heatcoef*q_z
11332 ! compute the average velocities for the face. remember that
11333 ! the velocities are stored and not the momentum.
11334 ! compute the viscous fluxes for this j-face.
11335 ! update the residuals of cell j and j+1.
11336  end do
11337  end do
11338  end do
11339  if (associated(revd)) revd = 0.0_8
11340  if (associated(aad)) aad = 0.0_8
11341  if (associated(rlvd)) rlvd = 0.0_8
11342  if (associated(skd)) skd = 0.0_8
11343  mued = 0.0_8
11344  do k=kl,1,-1
11345  do j=jl,2,-1
11346  do i=il,2,-1
11347  frhoed = fwd(i, j, k+1, irhoe) - fwd(i, j, k, irhoe)
11348  fmzd = fwd(i, j, k+1, imz) - fwd(i, j, k, imz)
11349  fmyd = fwd(i, j, k+1, imy) - fwd(i, j, k, imy)
11350  fmxd = fwd(i, j, k+1, imx) - fwd(i, j, k, imx)
11351  tauzz = mut*(two*w_z-fracdiv)
11352  wbar = half*(w(i, j, k, ivz)+w(i, j, k+1, ivz))
11353  vbar = half*(w(i, j, k, ivy)+w(i, j, k+1, ivy))
11354  tauxx = mut*(two*u_x-fracdiv)
11355  tauxy = mut*(u_y+v_x)
11356  tauxz = mut*(u_z+w_x)
11357  ubar = half*(w(i, j, k, ivx)+w(i, j, k+1, ivx))
11358  tauyy = mut*(two*v_y-fracdiv)
11359  tauyz = mut*(v_z+w_y)
11360  tempd1 = sk(i, j, k, 1)*frhoed
11361  tempd0 = sk(i, j, k, 2)*frhoed
11362  tempd = sk(i, j, k, 3)*frhoed
11363  skd(i, j, k, 3) = skd(i, j, k, 3) + (ubar*tauxz+vbar*tauyz+&
11364 & wbar*tauzz-q_z)*frhoed + tauzz*fmzd + tauyz*fmyd + tauxz*&
11365 & fmxd
11366  skd(i, j, k, 2) = skd(i, j, k, 2) + (ubar*tauxy+vbar*tauyy+&
11367 & wbar*tauyz-q_y)*frhoed + tauyz*fmzd + tauyy*fmyd + tauxy*&
11368 & fmxd
11369  skd(i, j, k, 1) = skd(i, j, k, 1) + (ubar*tauxx+vbar*tauxy+&
11370 & wbar*tauxz-q_x)*frhoed + tauxz*fmzd + tauxy*fmyd + tauxx*&
11371 & fmxd
11372  q_xd = -(sk(i, j, k, 1)*frhoed)
11373  q_yd = -(sk(i, j, k, 2)*frhoed)
11374  q_zd = -(sk(i, j, k, 3)*frhoed)
11375  ubard = tauxz*tempd + tauxy*tempd0 + tauxx*tempd1
11376  tauxzd = ubar*tempd + wbar*tempd1 + sk(i, j, k, 1)*fmzd + sk(i&
11377 & , j, k, 3)*fmxd
11378  vbard = tauyz*tempd + tauyy*tempd0 + tauxy*tempd1
11379  tauyzd = vbar*tempd + wbar*tempd0 + sk(i, j, k, 2)*fmzd + sk(i&
11380 & , j, k, 3)*fmyd
11381  wbard = tauzz*tempd + tauyz*tempd0 + tauxz*tempd1
11382  tauzzd = wbar*tempd + sk(i, j, k, 3)*fmzd
11383  tauxyd = ubar*tempd0 + vbar*tempd1 + sk(i, j, k, 1)*fmyd + sk(&
11384 & i, j, k, 2)*fmxd
11385  tauyyd = vbar*tempd0 + sk(i, j, k, 2)*fmyd
11386  tauxxd = ubar*tempd1 + sk(i, j, k, 1)*fmxd
11387  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wbard
11388  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + half*wbard
11389  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vbard
11390  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + half*vbard
11391  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*ubard
11392  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + half*ubard
11393  dd = aa(i, j, k+1) - aa(i, j, k)
11394  call popreal8(q_z)
11395  call popreal8(q_y)
11396  call popreal8(q_x)
11397  heatcoefd = q_z*q_zd + q_y*q_yd + q_x*q_xd
11398  q_zd = heatcoef*q_zd
11399  q_yd = heatcoef*q_yd
11400  q_xd = heatcoef*q_xd
11401  mutd = (v_z+w_y)*tauyzd + (u_z+w_x)*tauxzd + (u_y+v_x)*tauxyd &
11402 & + (two*w_z-fracdiv)*tauzzd + (two*v_y-fracdiv)*tauyyd + (two&
11403 & *u_x-fracdiv)*tauxxd
11404  v_zd = mut*tauyzd
11405  w_yd = mut*tauyzd
11406  u_zd = mut*tauxzd
11407  w_xd = mut*tauxzd
11408  u_yd = mut*tauxyd
11409  v_xd = mut*tauxyd
11410  fracdivd = -(mut*tauzzd) - mut*tauyyd - mut*tauxxd
11411  call popreal8(fracdiv)
11412  tempd1 = twothird*fracdivd
11413  w_zd = two*mut*tauzzd + tempd1
11414  v_yd = two*mut*tauyyd + tempd1
11415  u_xd = two*mut*tauxxd + tempd1
11416  gm1 = half*(gamma(i, j, k)+gamma(i, j, k+1)) - one
11417  factlamheat = one/(prandtl*gm1)
11418  factturbheat = one/(prandtlturb*gm1)
11419  call popreal8(heatcoef)
11420  muld = factlamheat*heatcoefd + mutd
11421  mued = mued + factturbheat*heatcoefd + mutd
11422  call popreal8(mut)
11423  call popcontrol1b(branch)
11424  if (branch .eq. 0) then
11425  revd(i, j, k) = revd(i, j, k) + por*mued
11426  revd(i, j, k+1) = revd(i, j, k+1) + por*mued
11427  mued = 0.0_8
11428  end if
11429  rlvd(i, j, k) = rlvd(i, j, k) + por*muld
11430  rlvd(i, j, k+1) = rlvd(i, j, k+1) + por*muld
11431  call popreal8(por)
11432  call popreal8(q_z)
11433  ddd = -(ssz*q_zd) - ssy*q_yd - ssx*q_xd
11434  sszd = -(dd*q_zd)
11435  call popreal8(q_y)
11436  ssyd = -(dd*q_yd)
11437  call popreal8(q_x)
11438  ssxd = -(dd*q_xd)
11439  aad(i, j, k+1) = aad(i, j, k+1) + ddd
11440  aad(i, j, k) = aad(i, j, k) - ddd
11441  dd = w(i, j, k+1, ivz) - w(i, j, k, ivz)
11442  call popreal8(w_z)
11443  ddd = ssz*w_zd + ssy*w_yd + ssx*w_xd
11444  sszd = sszd + dd*w_zd
11445  call popreal8(w_y)
11446  ssyd = ssyd + dd*w_yd
11447  call popreal8(w_x)
11448  ssxd = ssxd + dd*w_xd
11449  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + ddd
11450  wd(i, j, k, ivz) = wd(i, j, k, ivz) - ddd
11451  dd = w(i, j, k+1, ivy) - w(i, j, k, ivy)
11452  call popreal8(v_z)
11453  ddd = ssz*v_zd + ssy*v_yd + ssx*v_xd
11454  sszd = sszd + dd*v_zd
11455  call popreal8(v_y)
11456  ssyd = ssyd + dd*v_yd
11457  call popreal8(v_x)
11458  ssxd = ssxd + dd*v_xd
11459  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + ddd
11460  wd(i, j, k, ivy) = wd(i, j, k, ivy) - ddd
11461  dd = w(i, j, k+1, ivx) - w(i, j, k, ivx)
11462  call popreal8(u_z)
11463  ddd = ssz*u_zd + ssy*u_yd + ssx*u_xd
11464  sszd = sszd + dd*u_zd
11465  call popreal8(u_y)
11466  ssyd = ssyd + dd*u_yd
11467  call popreal8(u_x)
11468  ssxd = ssxd + dd*u_xd
11469  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + ddd
11470  wd(i, j, k, ivx) = wd(i, j, k, ivx) - ddd
11471  call popreal8(ssz)
11472  call popreal8(ssy)
11473  call popreal8(ssx)
11474  ssd = ssz*sszd + ssy*ssyd + ssx*ssxd
11475  temp0 = ssx*ssx + ssy*ssy + ssz*ssz
11476  tempd1 = -(one*ssd/temp0**2)
11477  sszd = ss*sszd + 2*ssz*tempd1
11478  ssyd = ss*ssyd + 2*ssy*tempd1
11479  ssxd = ss*ssxd + 2*ssx*tempd1
11480  call popreal8(ss)
11481  call popreal8(ssz)
11482  tempd1 = eighth*sszd
11483  xd(i-1, j-1, k+1, 3) = xd(i-1, j-1, k+1, 3) + tempd1
11484  xd(i-1, j-1, k-1, 3) = xd(i-1, j-1, k-1, 3) - tempd1
11485  xd(i-1, j, k+1, 3) = xd(i-1, j, k+1, 3) + tempd1
11486  xd(i-1, j, k-1, 3) = xd(i-1, j, k-1, 3) - tempd1
11487  xd(i, j-1, k+1, 3) = xd(i, j-1, k+1, 3) + tempd1
11488  xd(i, j-1, k-1, 3) = xd(i, j-1, k-1, 3) - tempd1
11489  xd(i, j, k+1, 3) = xd(i, j, k+1, 3) + tempd1
11490  xd(i, j, k-1, 3) = xd(i, j, k-1, 3) - tempd1
11491  call popreal8(ssy)
11492  tempd1 = eighth*ssyd
11493  xd(i-1, j-1, k+1, 2) = xd(i-1, j-1, k+1, 2) + tempd1
11494  xd(i-1, j-1, k-1, 2) = xd(i-1, j-1, k-1, 2) - tempd1
11495  xd(i-1, j, k+1, 2) = xd(i-1, j, k+1, 2) + tempd1
11496  xd(i-1, j, k-1, 2) = xd(i-1, j, k-1, 2) - tempd1
11497  xd(i, j-1, k+1, 2) = xd(i, j-1, k+1, 2) + tempd1
11498  xd(i, j-1, k-1, 2) = xd(i, j-1, k-1, 2) - tempd1
11499  xd(i, j, k+1, 2) = xd(i, j, k+1, 2) + tempd1
11500  xd(i, j, k-1, 2) = xd(i, j, k-1, 2) - tempd1
11501  call popreal8(ssx)
11502  tempd1 = eighth*ssxd
11503  xd(i-1, j-1, k+1, 1) = xd(i-1, j-1, k+1, 1) + tempd1
11504  xd(i-1, j-1, k-1, 1) = xd(i-1, j-1, k-1, 1) - tempd1
11505  xd(i-1, j, k+1, 1) = xd(i-1, j, k+1, 1) + tempd1
11506  xd(i-1, j, k-1, 1) = xd(i-1, j, k-1, 1) - tempd1
11507  xd(i, j-1, k+1, 1) = xd(i, j-1, k+1, 1) + tempd1
11508  xd(i, j-1, k-1, 1) = xd(i, j-1, k-1, 1) - tempd1
11509  xd(i, j, k+1, 1) = xd(i, j, k+1, 1) + tempd1
11510  xd(i, j, k-1, 1) = xd(i, j, k-1, 1) - tempd1
11511  end do
11512  end do
11513  end do
11514  if (associated(sjd)) sjd = 0.0_8
11515  do k=kl,2,-1
11516  do j=jl,1,-1
11517  do i=il,2,-1
11518  frhoed = fwd(i, j+1, k, irhoe) - fwd(i, j, k, irhoe)
11519  fmzd = fwd(i, j+1, k, imz) - fwd(i, j, k, imz)
11520  fmyd = fwd(i, j+1, k, imy) - fwd(i, j, k, imy)
11521  fmxd = fwd(i, j+1, k, imx) - fwd(i, j, k, imx)
11522  tauzz = mut*(two*w_z-fracdiv)
11523  wbar = half*(w(i, j, k, ivz)+w(i, j+1, k, ivz))
11524  vbar = half*(w(i, j, k, ivy)+w(i, j+1, k, ivy))
11525  tauxx = mut*(two*u_x-fracdiv)
11526  tauxy = mut*(u_y+v_x)
11527  tauxz = mut*(u_z+w_x)
11528  ubar = half*(w(i, j, k, ivx)+w(i, j+1, k, ivx))
11529  tauyy = mut*(two*v_y-fracdiv)
11530  tauyz = mut*(v_z+w_y)
11531  tempd1 = sj(i, j, k, 1)*frhoed
11532  tempd0 = sj(i, j, k, 2)*frhoed
11533  tempd = sj(i, j, k, 3)*frhoed
11534  sjd(i, j, k, 3) = sjd(i, j, k, 3) + (ubar*tauxz+vbar*tauyz+&
11535 & wbar*tauzz-q_z)*frhoed + tauzz*fmzd + tauyz*fmyd + tauxz*&
11536 & fmxd
11537  sjd(i, j, k, 2) = sjd(i, j, k, 2) + (ubar*tauxy+vbar*tauyy+&
11538 & wbar*tauyz-q_y)*frhoed + tauyz*fmzd + tauyy*fmyd + tauxy*&
11539 & fmxd
11540  sjd(i, j, k, 1) = sjd(i, j, k, 1) + (ubar*tauxx+vbar*tauxy+&
11541 & wbar*tauxz-q_x)*frhoed + tauxz*fmzd + tauxy*fmyd + tauxx*&
11542 & fmxd
11543  q_xd = -(sj(i, j, k, 1)*frhoed)
11544  q_yd = -(sj(i, j, k, 2)*frhoed)
11545  q_zd = -(sj(i, j, k, 3)*frhoed)
11546  ubard = tauxz*tempd + tauxy*tempd0 + tauxx*tempd1
11547  tauxzd = ubar*tempd + wbar*tempd1 + sj(i, j, k, 1)*fmzd + sj(i&
11548 & , j, k, 3)*fmxd
11549  vbard = tauyz*tempd + tauyy*tempd0 + tauxy*tempd1
11550  tauyzd = vbar*tempd + wbar*tempd0 + sj(i, j, k, 2)*fmzd + sj(i&
11551 & , j, k, 3)*fmyd
11552  wbard = tauzz*tempd + tauyz*tempd0 + tauxz*tempd1
11553  tauzzd = wbar*tempd + sj(i, j, k, 3)*fmzd
11554  tauxyd = ubar*tempd0 + vbar*tempd1 + sj(i, j, k, 1)*fmyd + sj(&
11555 & i, j, k, 2)*fmxd
11556  tauyyd = vbar*tempd0 + sj(i, j, k, 2)*fmyd
11557  tauxxd = ubar*tempd1 + sj(i, j, k, 1)*fmxd
11558  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wbard
11559  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + half*wbard
11560  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vbard
11561  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + half*vbard
11562  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*ubard
11563  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + half*ubard
11564  dd = aa(i, j+1, k) - aa(i, j, k)
11565  call popreal8(q_z)
11566  call popreal8(q_y)
11567  call popreal8(q_x)
11568  heatcoefd = q_z*q_zd + q_y*q_yd + q_x*q_xd
11569  q_zd = heatcoef*q_zd
11570  q_yd = heatcoef*q_yd
11571  q_xd = heatcoef*q_xd
11572  mutd = (v_z+w_y)*tauyzd + (u_z+w_x)*tauxzd + (u_y+v_x)*tauxyd &
11573 & + (two*w_z-fracdiv)*tauzzd + (two*v_y-fracdiv)*tauyyd + (two&
11574 & *u_x-fracdiv)*tauxxd
11575  v_zd = mut*tauyzd
11576  w_yd = mut*tauyzd
11577  u_zd = mut*tauxzd
11578  w_xd = mut*tauxzd
11579  u_yd = mut*tauxyd
11580  v_xd = mut*tauxyd
11581  fracdivd = -(mut*tauzzd) - mut*tauyyd - mut*tauxxd
11582  call popreal8(fracdiv)
11583  tempd1 = twothird*fracdivd
11584  w_zd = two*mut*tauzzd + tempd1
11585  v_yd = two*mut*tauyyd + tempd1
11586  u_xd = two*mut*tauxxd + tempd1
11587  gm1 = half*(gamma(i, j, k)+gamma(i, j+1, k)) - one
11588  factlamheat = one/(prandtl*gm1)
11589  factturbheat = one/(prandtlturb*gm1)
11590  call popreal8(heatcoef)
11591  muld = factlamheat*heatcoefd + mutd
11592  mued = mued + factturbheat*heatcoefd + mutd
11593  call popreal8(mut)
11594  call popcontrol1b(branch)
11595  if (branch .eq. 0) then
11596  revd(i, j, k) = revd(i, j, k) + por*mued
11597  revd(i, j+1, k) = revd(i, j+1, k) + por*mued
11598  mued = 0.0_8
11599  end if
11600  rlvd(i, j, k) = rlvd(i, j, k) + por*muld
11601  rlvd(i, j+1, k) = rlvd(i, j+1, k) + por*muld
11602  call popreal8(por)
11603  call popreal8(q_z)
11604  ddd = -(ssz*q_zd) - ssy*q_yd - ssx*q_xd
11605  sszd = -(dd*q_zd)
11606  call popreal8(q_y)
11607  ssyd = -(dd*q_yd)
11608  call popreal8(q_x)
11609  ssxd = -(dd*q_xd)
11610  aad(i, j+1, k) = aad(i, j+1, k) + ddd
11611  aad(i, j, k) = aad(i, j, k) - ddd
11612  dd = w(i, j+1, k, ivz) - w(i, j, k, ivz)
11613  call popreal8(w_z)
11614  ddd = ssz*w_zd + ssy*w_yd + ssx*w_xd
11615  sszd = sszd + dd*w_zd
11616  call popreal8(w_y)
11617  ssyd = ssyd + dd*w_yd
11618  call popreal8(w_x)
11619  ssxd = ssxd + dd*w_xd
11620  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + ddd
11621  wd(i, j, k, ivz) = wd(i, j, k, ivz) - ddd
11622  dd = w(i, j+1, k, ivy) - w(i, j, k, ivy)
11623  call popreal8(v_z)
11624  ddd = ssz*v_zd + ssy*v_yd + ssx*v_xd
11625  sszd = sszd + dd*v_zd
11626  call popreal8(v_y)
11627  ssyd = ssyd + dd*v_yd
11628  call popreal8(v_x)
11629  ssxd = ssxd + dd*v_xd
11630  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + ddd
11631  wd(i, j, k, ivy) = wd(i, j, k, ivy) - ddd
11632  dd = w(i, j+1, k, ivx) - w(i, j, k, ivx)
11633  call popreal8(u_z)
11634  ddd = ssz*u_zd + ssy*u_yd + ssx*u_xd
11635  sszd = sszd + dd*u_zd
11636  call popreal8(u_y)
11637  ssyd = ssyd + dd*u_yd
11638  call popreal8(u_x)
11639  ssxd = ssxd + dd*u_xd
11640  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + ddd
11641  wd(i, j, k, ivx) = wd(i, j, k, ivx) - ddd
11642  call popreal8(ssz)
11643  call popreal8(ssy)
11644  call popreal8(ssx)
11645  ssd = ssz*sszd + ssy*ssyd + ssx*ssxd
11646  temp0 = ssx*ssx + ssy*ssy + ssz*ssz
11647  tempd1 = -(one*ssd/temp0**2)
11648  sszd = ss*sszd + 2*ssz*tempd1
11649  ssyd = ss*ssyd + 2*ssy*tempd1
11650  ssxd = ss*ssxd + 2*ssx*tempd1
11651  call popreal8(ss)
11652  call popreal8(ssz)
11653  tempd1 = eighth*sszd
11654  xd(i-1, j+1, k-1, 3) = xd(i-1, j+1, k-1, 3) + tempd1
11655  xd(i-1, j-1, k-1, 3) = xd(i-1, j-1, k-1, 3) - tempd1
11656  xd(i-1, j+1, k, 3) = xd(i-1, j+1, k, 3) + tempd1
11657  xd(i-1, j-1, k, 3) = xd(i-1, j-1, k, 3) - tempd1
11658  xd(i, j+1, k-1, 3) = xd(i, j+1, k-1, 3) + tempd1
11659  xd(i, j-1, k-1, 3) = xd(i, j-1, k-1, 3) - tempd1
11660  xd(i, j+1, k, 3) = xd(i, j+1, k, 3) + tempd1
11661  xd(i, j-1, k, 3) = xd(i, j-1, k, 3) - tempd1
11662  call popreal8(ssy)
11663  tempd1 = eighth*ssyd
11664  xd(i-1, j+1, k-1, 2) = xd(i-1, j+1, k-1, 2) + tempd1
11665  xd(i-1, j-1, k-1, 2) = xd(i-1, j-1, k-1, 2) - tempd1
11666  xd(i-1, j+1, k, 2) = xd(i-1, j+1, k, 2) + tempd1
11667  xd(i-1, j-1, k, 2) = xd(i-1, j-1, k, 2) - tempd1
11668  xd(i, j+1, k-1, 2) = xd(i, j+1, k-1, 2) + tempd1
11669  xd(i, j-1, k-1, 2) = xd(i, j-1, k-1, 2) - tempd1
11670  xd(i, j+1, k, 2) = xd(i, j+1, k, 2) + tempd1
11671  xd(i, j-1, k, 2) = xd(i, j-1, k, 2) - tempd1
11672  call popreal8(ssx)
11673  tempd1 = eighth*ssxd
11674  xd(i-1, j+1, k-1, 1) = xd(i-1, j+1, k-1, 1) + tempd1
11675  xd(i-1, j-1, k-1, 1) = xd(i-1, j-1, k-1, 1) - tempd1
11676  xd(i-1, j+1, k, 1) = xd(i-1, j+1, k, 1) + tempd1
11677  xd(i-1, j-1, k, 1) = xd(i-1, j-1, k, 1) - tempd1
11678  xd(i, j+1, k-1, 1) = xd(i, j+1, k-1, 1) + tempd1
11679  xd(i, j-1, k-1, 1) = xd(i, j-1, k-1, 1) - tempd1
11680  xd(i, j+1, k, 1) = xd(i, j+1, k, 1) + tempd1
11681  xd(i, j-1, k, 1) = xd(i, j-1, k, 1) - tempd1
11682  end do
11683  end do
11684  end do
11685  if (associated(sid)) sid = 0.0_8
11686  do k=kl,2,-1
11687  do j=jl,2,-1
11688  do i=il,1,-1
11689  frhoed = fwd(i+1, j, k, irhoe) - fwd(i, j, k, irhoe)
11690  fmzd = fwd(i+1, j, k, imz) - fwd(i, j, k, imz)
11691  fmyd = fwd(i+1, j, k, imy) - fwd(i, j, k, imy)
11692  fmxd = fwd(i+1, j, k, imx) - fwd(i, j, k, imx)
11693  tauzz = mut*(two*w_z-fracdiv)
11694  wbar = half*(w(i, j, k, ivz)+w(i+1, j, k, ivz))
11695  vbar = half*(w(i, j, k, ivy)+w(i+1, j, k, ivy))
11696  tauxx = mut*(two*u_x-fracdiv)
11697  tauxy = mut*(u_y+v_x)
11698  tauxz = mut*(u_z+w_x)
11699  ubar = half*(w(i, j, k, ivx)+w(i+1, j, k, ivx))
11700  tauyy = mut*(two*v_y-fracdiv)
11701  tauyz = mut*(v_z+w_y)
11702  tempd = si(i, j, k, 1)*frhoed
11703  tempd0 = si(i, j, k, 2)*frhoed
11704  tempd1 = si(i, j, k, 3)*frhoed
11705  sid(i, j, k, 3) = sid(i, j, k, 3) + (ubar*tauxz+vbar*tauyz+&
11706 & wbar*tauzz-q_z)*frhoed + tauzz*fmzd + tauyz*fmyd + tauxz*&
11707 & fmxd
11708  sid(i, j, k, 2) = sid(i, j, k, 2) + (ubar*tauxy+vbar*tauyy+&
11709 & wbar*tauyz-q_y)*frhoed + tauyz*fmzd + tauyy*fmyd + tauxy*&
11710 & fmxd
11711  sid(i, j, k, 1) = sid(i, j, k, 1) + (ubar*tauxx+vbar*tauxy+&
11712 & wbar*tauxz-q_x)*frhoed + tauxz*fmzd + tauxy*fmyd + tauxx*&
11713 & fmxd
11714  q_xd = -(si(i, j, k, 1)*frhoed)
11715  q_yd = -(si(i, j, k, 2)*frhoed)
11716  q_zd = -(si(i, j, k, 3)*frhoed)
11717  ubard = tauxz*tempd1 + tauxy*tempd0 + tauxx*tempd
11718  tauxzd = ubar*tempd1 + wbar*tempd + si(i, j, k, 1)*fmzd + si(i&
11719 & , j, k, 3)*fmxd
11720  vbard = tauyz*tempd1 + tauyy*tempd0 + tauxy*tempd
11721  tauyzd = vbar*tempd1 + wbar*tempd0 + si(i, j, k, 2)*fmzd + si(&
11722 & i, j, k, 3)*fmyd
11723  wbard = tauzz*tempd1 + tauyz*tempd0 + tauxz*tempd
11724  tauzzd = wbar*tempd1 + si(i, j, k, 3)*fmzd
11725  tauxyd = ubar*tempd0 + vbar*tempd + si(i, j, k, 1)*fmyd + si(i&
11726 & , j, k, 2)*fmxd
11727  tauyyd = vbar*tempd0 + si(i, j, k, 2)*fmyd
11728  tauxxd = ubar*tempd + si(i, j, k, 1)*fmxd
11729  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wbard
11730  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + half*wbard
11731  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vbard
11732  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + half*vbard
11733  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*ubard
11734  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + half*ubard
11735  dd = aa(i+1, j, k) - aa(i, j, k)
11736  call popreal8(q_z)
11737  call popreal8(q_y)
11738  call popreal8(q_x)
11739  heatcoefd = q_z*q_zd + q_y*q_yd + q_x*q_xd
11740  q_zd = heatcoef*q_zd
11741  q_yd = heatcoef*q_yd
11742  q_xd = heatcoef*q_xd
11743  mutd = (v_z+w_y)*tauyzd + (u_z+w_x)*tauxzd + (u_y+v_x)*tauxyd &
11744 & + (two*w_z-fracdiv)*tauzzd + (two*v_y-fracdiv)*tauyyd + (two&
11745 & *u_x-fracdiv)*tauxxd
11746  v_zd = mut*tauyzd
11747  w_yd = mut*tauyzd
11748  u_zd = mut*tauxzd
11749  w_xd = mut*tauxzd
11750  u_yd = mut*tauxyd
11751  v_xd = mut*tauxyd
11752  fracdivd = -(mut*tauzzd) - mut*tauyyd - mut*tauxxd
11753  call popreal8(fracdiv)
11754  tempd = twothird*fracdivd
11755  w_zd = two*mut*tauzzd + tempd
11756  v_yd = two*mut*tauyyd + tempd
11757  u_xd = two*mut*tauxxd + tempd
11758  gm1 = half*(gamma(i, j, k)+gamma(i+1, j, k)) - one
11759  factlamheat = one/(prandtl*gm1)
11760  factturbheat = one/(prandtlturb*gm1)
11761  call popreal8(heatcoef)
11762  muld = factlamheat*heatcoefd + mutd
11763  mued = mued + factturbheat*heatcoefd + mutd
11764  call popreal8(mut)
11765  call popcontrol1b(branch)
11766  if (branch .eq. 0) then
11767  revd(i, j, k) = revd(i, j, k) + por*mued
11768  revd(i+1, j, k) = revd(i+1, j, k) + por*mued
11769  mued = 0.0_8
11770  end if
11771  rlvd(i, j, k) = rlvd(i, j, k) + por*muld
11772  rlvd(i+1, j, k) = rlvd(i+1, j, k) + por*muld
11773  call popreal8(por)
11774  call popreal8(q_z)
11775  ddd = -(ssz*q_zd) - ssy*q_yd - ssx*q_xd
11776  sszd = -(dd*q_zd)
11777  call popreal8(q_y)
11778  ssyd = -(dd*q_yd)
11779  call popreal8(q_x)
11780  ssxd = -(dd*q_xd)
11781  aad(i+1, j, k) = aad(i+1, j, k) + ddd
11782  aad(i, j, k) = aad(i, j, k) - ddd
11783  dd = w(i+1, j, k, ivz) - w(i, j, k, ivz)
11784  call popreal8(w_z)
11785  ddd = ssz*w_zd + ssy*w_yd + ssx*w_xd
11786  sszd = sszd + dd*w_zd
11787  call popreal8(w_y)
11788  ssyd = ssyd + dd*w_yd
11789  call popreal8(w_x)
11790  ssxd = ssxd + dd*w_xd
11791  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + ddd
11792  wd(i, j, k, ivz) = wd(i, j, k, ivz) - ddd
11793  dd = w(i+1, j, k, ivy) - w(i, j, k, ivy)
11794  call popreal8(v_z)
11795  ddd = ssz*v_zd + ssy*v_yd + ssx*v_xd
11796  sszd = sszd + dd*v_zd
11797  call popreal8(v_y)
11798  ssyd = ssyd + dd*v_yd
11799  call popreal8(v_x)
11800  ssxd = ssxd + dd*v_xd
11801  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + ddd
11802  wd(i, j, k, ivy) = wd(i, j, k, ivy) - ddd
11803  dd = w(i+1, j, k, ivx) - w(i, j, k, ivx)
11804  call popreal8(u_z)
11805  ddd = ssz*u_zd + ssy*u_yd + ssx*u_xd
11806  sszd = sszd + dd*u_zd
11807  call popreal8(u_y)
11808  ssyd = ssyd + dd*u_yd
11809  call popreal8(u_x)
11810  ssxd = ssxd + dd*u_xd
11811  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + ddd
11812  wd(i, j, k, ivx) = wd(i, j, k, ivx) - ddd
11813  call popreal8(ssz)
11814  call popreal8(ssy)
11815  call popreal8(ssx)
11816  ssd = ssz*sszd + ssy*ssyd + ssx*ssxd
11817  temp = ssx*ssx + ssy*ssy + ssz*ssz
11818  tempd = -(one*ssd/temp**2)
11819  sszd = ss*sszd + 2*ssz*tempd
11820  ssyd = ss*ssyd + 2*ssy*tempd
11821  ssxd = ss*ssxd + 2*ssx*tempd
11822  call popreal8(ss)
11823  call popreal8(ssz)
11824  tempd = eighth*sszd
11825  xd(i+1, j-1, k-1, 3) = xd(i+1, j-1, k-1, 3) + tempd
11826  xd(i-1, j-1, k-1, 3) = xd(i-1, j-1, k-1, 3) - tempd
11827  xd(i+1, j-1, k, 3) = xd(i+1, j-1, k, 3) + tempd
11828  xd(i-1, j-1, k, 3) = xd(i-1, j-1, k, 3) - tempd
11829  xd(i+1, j, k-1, 3) = xd(i+1, j, k-1, 3) + tempd
11830  xd(i-1, j, k-1, 3) = xd(i-1, j, k-1, 3) - tempd
11831  xd(i+1, j, k, 3) = xd(i+1, j, k, 3) + tempd
11832  xd(i-1, j, k, 3) = xd(i-1, j, k, 3) - tempd
11833  call popreal8(ssy)
11834  tempd = eighth*ssyd
11835  xd(i+1, j-1, k-1, 2) = xd(i+1, j-1, k-1, 2) + tempd
11836  xd(i-1, j-1, k-1, 2) = xd(i-1, j-1, k-1, 2) - tempd
11837  xd(i+1, j-1, k, 2) = xd(i+1, j-1, k, 2) + tempd
11838  xd(i-1, j-1, k, 2) = xd(i-1, j-1, k, 2) - tempd
11839  xd(i+1, j, k-1, 2) = xd(i+1, j, k-1, 2) + tempd
11840  xd(i-1, j, k-1, 2) = xd(i-1, j, k-1, 2) - tempd
11841  xd(i+1, j, k, 2) = xd(i+1, j, k, 2) + tempd
11842  xd(i-1, j, k, 2) = xd(i-1, j, k, 2) - tempd
11843  call popreal8(ssx)
11844  tempd = eighth*ssxd
11845  xd(i+1, j-1, k-1, 1) = xd(i+1, j-1, k-1, 1) + tempd
11846  xd(i-1, j-1, k-1, 1) = xd(i-1, j-1, k-1, 1) - tempd
11847  xd(i+1, j-1, k, 1) = xd(i+1, j-1, k, 1) + tempd
11848  xd(i-1, j-1, k, 1) = xd(i-1, j-1, k, 1) - tempd
11849  xd(i+1, j, k-1, 1) = xd(i+1, j, k-1, 1) + tempd
11850  xd(i-1, j, k-1, 1) = xd(i-1, j, k-1, 1) - tempd
11851  xd(i+1, j, k, 1) = xd(i+1, j, k, 1) + tempd
11852  xd(i-1, j, k, 1) = xd(i-1, j, k, 1) - tempd
11853  end do
11854  end do
11855  end do
11856  end subroutine viscousfluxapprox_b
11857 
11858  subroutine viscousfluxapprox()
11859  use constants
11860  use blockpointers
11861  use flowvarrefstate
11862  use inputphysics
11863  use iteration
11864  implicit none
11865 !
11866 ! local parameter.
11867 !
11868  real(kind=realtype), parameter :: twothird=two*third
11869 !
11870 ! local variables.
11871 !
11872  integer(kind=inttype) :: i, j, k
11873  integer(kind=inttype) :: ii, jj, kk
11874  real(kind=realtype) :: rfilv, por, mul, mue, mut, heatcoef
11875  real(kind=realtype) :: gm1, factlamheat, factturbheat
11876  real(kind=realtype) :: u_x, u_y, u_z, v_x, v_y, v_z, w_x, w_y, w_z
11877  real(kind=realtype) :: q_x, q_y, q_z, ubar, vbar, wbar
11878  real(kind=realtype) :: corr, ssx, ssy, ssz, ss, fracdiv
11879  real(kind=realtype) :: tauxx, tauyy, tauzz
11880  real(kind=realtype) :: tauxy, tauxz, tauyz
11881  real(kind=realtype) :: fmx, fmy, fmz, frhoe
11882  real(kind=realtype) :: dd
11883  logical :: correctfork
11884  mue = zero
11885  rfilv = rfil
11886 ! viscous fluxes in the i-direction
11887  do k=2,kl
11888  do j=2,jl
11889  do i=1,il
11890 ! compute the vector from the center of cell i to cell i+1
11891  ssx = eighth*(x(i+1, j-1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i+1, j&
11892 & -1, k, 1)-x(i-1, j-1, k, 1)+x(i+1, j, k-1, 1)-x(i-1, j, k-1&
11893 & , 1)+x(i+1, j, k, 1)-x(i-1, j, k, 1))
11894  ssy = eighth*(x(i+1, j-1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i+1, j&
11895 & -1, k, 2)-x(i-1, j-1, k, 2)+x(i+1, j, k-1, 2)-x(i-1, j, k-1&
11896 & , 2)+x(i+1, j, k, 2)-x(i-1, j, k, 2))
11897  ssz = eighth*(x(i+1, j-1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i+1, j&
11898 & -1, k, 3)-x(i-1, j-1, k, 3)+x(i+1, j, k-1, 3)-x(i-1, j, k-1&
11899 & , 3)+x(i+1, j, k, 3)-x(i-1, j, k, 3))
11900 ! and determine one/ length of vector squared
11901  ss = one/(ssx*ssx+ssy*ssy+ssz*ssz)
11902  ssx = ss*ssx
11903  ssy = ss*ssy
11904  ssz = ss*ssz
11905 ! now compute each gradient
11906  dd = w(i+1, j, k, ivx) - w(i, j, k, ivx)
11907  u_x = dd*ssx
11908  u_y = dd*ssy
11909  u_z = dd*ssz
11910  dd = w(i+1, j, k, ivy) - w(i, j, k, ivy)
11911  v_x = dd*ssx
11912  v_y = dd*ssy
11913  v_z = dd*ssz
11914  dd = w(i+1, j, k, ivz) - w(i, j, k, ivz)
11915  w_x = dd*ssx
11916  w_y = dd*ssy
11917  w_z = dd*ssz
11918  dd = aa(i+1, j, k) - aa(i, j, k)
11919  q_x = -(dd*ssx)
11920  q_y = -(dd*ssy)
11921  q_z = -(dd*ssz)
11922  por = half*rfilv
11923  if (pori(i, j, k) .eq. noflux) por = zero
11924 ! compute the laminar and (if present) the eddy viscosities
11925 ! multiplied by the porosity. compute the factor in front of
11926 ! the gradients of the speed of sound squared for the heat
11927 ! flux.
11928  mul = por*(rlv(i, j, k)+rlv(i+1, j, k))
11929  if (eddymodel) mue = por*(rev(i, j, k)+rev(i+1, j, k))
11930  mut = mul + mue
11931  gm1 = half*(gamma(i, j, k)+gamma(i+1, j, k)) - one
11932  factlamheat = one/(prandtl*gm1)
11933  factturbheat = one/(prandtlturb*gm1)
11934  heatcoef = mul*factlamheat + mue*factturbheat
11935 ! compute the stress tensor and the heat flux vector.
11936  fracdiv = twothird*(u_x+v_y+w_z)
11937  tauxx = mut*(two*u_x-fracdiv)
11938  tauyy = mut*(two*v_y-fracdiv)
11939  tauzz = mut*(two*w_z-fracdiv)
11940  tauxy = mut*(u_y+v_x)
11941  tauxz = mut*(u_z+w_x)
11942  tauyz = mut*(v_z+w_y)
11943  q_x = heatcoef*q_x
11944  q_y = heatcoef*q_y
11945  q_z = heatcoef*q_z
11946 ! compute the average velocities for the face. remember that
11947 ! the velocities are stored and not the momentum.
11948  ubar = half*(w(i, j, k, ivx)+w(i+1, j, k, ivx))
11949  vbar = half*(w(i, j, k, ivy)+w(i+1, j, k, ivy))
11950  wbar = half*(w(i, j, k, ivz)+w(i+1, j, k, ivz))
11951 ! compute the viscous fluxes for this i-face.
11952  fmx = tauxx*si(i, j, k, 1) + tauxy*si(i, j, k, 2) + tauxz*si(i&
11953 & , j, k, 3)
11954  fmy = tauxy*si(i, j, k, 1) + tauyy*si(i, j, k, 2) + tauyz*si(i&
11955 & , j, k, 3)
11956  fmz = tauxz*si(i, j, k, 1) + tauyz*si(i, j, k, 2) + tauzz*si(i&
11957 & , j, k, 3)
11958  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*si(i, j, k, 1) + (&
11959 & ubar*tauxy+vbar*tauyy+wbar*tauyz)*si(i, j, k, 2) + (ubar*&
11960 & tauxz+vbar*tauyz+wbar*tauzz)*si(i, j, k, 3) - q_x*si(i, j, k&
11961 & , 1) - q_y*si(i, j, k, 2) - q_z*si(i, j, k, 3)
11962 ! update the residuals of cell i and i+1.
11963  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
11964  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
11965  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
11966  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
11967  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fmx
11968  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fmy
11969  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fmz
11970  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + frhoe
11971  end do
11972  end do
11973  end do
11974 ! viscous fluxes in the j-direction
11975  do k=2,kl
11976  do j=1,jl
11977  do i=2,il
11978 ! compute the vector from the center of cell j to cell j+1
11979  ssx = eighth*(x(i-1, j+1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j&
11980 & +1, k, 1)-x(i-1, j-1, k, 1)+x(i, j+1, k-1, 1)-x(i, j-1, k-1&
11981 & , 1)+x(i, j+1, k, 1)-x(i, j-1, k, 1))
11982  ssy = eighth*(x(i-1, j+1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j&
11983 & +1, k, 2)-x(i-1, j-1, k, 2)+x(i, j+1, k-1, 2)-x(i, j-1, k-1&
11984 & , 2)+x(i, j+1, k, 2)-x(i, j-1, k, 2))
11985  ssz = eighth*(x(i-1, j+1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j&
11986 & +1, k, 3)-x(i-1, j-1, k, 3)+x(i, j+1, k-1, 3)-x(i, j-1, k-1&
11987 & , 3)+x(i, j+1, k, 3)-x(i, j-1, k, 3))
11988 ! and determine one/ length of vector squared
11989  ss = one/(ssx*ssx+ssy*ssy+ssz*ssz)
11990  ssx = ss*ssx
11991  ssy = ss*ssy
11992  ssz = ss*ssz
11993 ! now compute each gradient
11994  dd = w(i, j+1, k, ivx) - w(i, j, k, ivx)
11995  u_x = dd*ssx
11996  u_y = dd*ssy
11997  u_z = dd*ssz
11998  dd = w(i, j+1, k, ivy) - w(i, j, k, ivy)
11999  v_x = dd*ssx
12000  v_y = dd*ssy
12001  v_z = dd*ssz
12002  dd = w(i, j+1, k, ivz) - w(i, j, k, ivz)
12003  w_x = dd*ssx
12004  w_y = dd*ssy
12005  w_z = dd*ssz
12006  dd = aa(i, j+1, k) - aa(i, j, k)
12007  q_x = -(dd*ssx)
12008  q_y = -(dd*ssy)
12009  q_z = -(dd*ssz)
12010  por = half*rfilv
12011  if (porj(i, j, k) .eq. noflux) por = zero
12012 ! compute the laminar and (if present) the eddy viscosities
12013 ! multiplied by the porosity. compute the factor in front of
12014 ! the gradients of the speed of sound squared for the heat
12015 ! flux.
12016  mul = por*(rlv(i, j, k)+rlv(i, j+1, k))
12017  if (eddymodel) mue = por*(rev(i, j, k)+rev(i, j+1, k))
12018  mut = mul + mue
12019  gm1 = half*(gamma(i, j, k)+gamma(i, j+1, k)) - one
12020  factlamheat = one/(prandtl*gm1)
12021  factturbheat = one/(prandtlturb*gm1)
12022  heatcoef = mul*factlamheat + mue*factturbheat
12023 ! compute the stress tensor and the heat flux vector.
12024  fracdiv = twothird*(u_x+v_y+w_z)
12025  tauxx = mut*(two*u_x-fracdiv)
12026  tauyy = mut*(two*v_y-fracdiv)
12027  tauzz = mut*(two*w_z-fracdiv)
12028  tauxy = mut*(u_y+v_x)
12029  tauxz = mut*(u_z+w_x)
12030  tauyz = mut*(v_z+w_y)
12031  q_x = heatcoef*q_x
12032  q_y = heatcoef*q_y
12033  q_z = heatcoef*q_z
12034 ! compute the average velocities for the face. remember that
12035 ! the velocities are stored and not the momentum.
12036  ubar = half*(w(i, j, k, ivx)+w(i, j+1, k, ivx))
12037  vbar = half*(w(i, j, k, ivy)+w(i, j+1, k, ivy))
12038  wbar = half*(w(i, j, k, ivz)+w(i, j+1, k, ivz))
12039 ! compute the viscous fluxes for this j-face.
12040  fmx = tauxx*sj(i, j, k, 1) + tauxy*sj(i, j, k, 2) + tauxz*sj(i&
12041 & , j, k, 3)
12042  fmy = tauxy*sj(i, j, k, 1) + tauyy*sj(i, j, k, 2) + tauyz*sj(i&
12043 & , j, k, 3)
12044  fmz = tauxz*sj(i, j, k, 1) + tauyz*sj(i, j, k, 2) + tauzz*sj(i&
12045 & , j, k, 3)
12046  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*sj(i, j, k, 1) + (&
12047 & ubar*tauxy+vbar*tauyy+wbar*tauyz)*sj(i, j, k, 2) + (ubar*&
12048 & tauxz+vbar*tauyz+wbar*tauzz)*sj(i, j, k, 3) - q_x*sj(i, j, k&
12049 & , 1) - q_y*sj(i, j, k, 2) - q_z*sj(i, j, k, 3)
12050 ! update the residuals of cell j and j+1.
12051  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
12052  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
12053  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
12054  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
12055  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fmx
12056  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fmy
12057  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fmz
12058  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + frhoe
12059  end do
12060  end do
12061  end do
12062 ! viscous fluxes in the k-direction
12063  do k=1,kl
12064  do j=2,jl
12065  do i=2,il
12066 ! compute the vector from the center of cell k to cell k+1
12067  ssx = eighth*(x(i-1, j-1, k+1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j&
12068 & , k+1, 1)-x(i-1, j, k-1, 1)+x(i, j-1, k+1, 1)-x(i, j-1, k-1&
12069 & , 1)+x(i, j, k+1, 1)-x(i, j, k-1, 1))
12070  ssy = eighth*(x(i-1, j-1, k+1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j&
12071 & , k+1, 2)-x(i-1, j, k-1, 2)+x(i, j-1, k+1, 2)-x(i, j-1, k-1&
12072 & , 2)+x(i, j, k+1, 2)-x(i, j, k-1, 2))
12073  ssz = eighth*(x(i-1, j-1, k+1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j&
12074 & , k+1, 3)-x(i-1, j, k-1, 3)+x(i, j-1, k+1, 3)-x(i, j-1, k-1&
12075 & , 3)+x(i, j, k+1, 3)-x(i, j, k-1, 3))
12076 ! and determine one/ length of vector squared
12077  ss = one/(ssx*ssx+ssy*ssy+ssz*ssz)
12078  ssx = ss*ssx
12079  ssy = ss*ssy
12080  ssz = ss*ssz
12081 ! now compute each gradient
12082  dd = w(i, j, k+1, ivx) - w(i, j, k, ivx)
12083  u_x = dd*ssx
12084  u_y = dd*ssy
12085  u_z = dd*ssz
12086  dd = w(i, j, k+1, ivy) - w(i, j, k, ivy)
12087  v_x = dd*ssx
12088  v_y = dd*ssy
12089  v_z = dd*ssz
12090  dd = w(i, j, k+1, ivz) - w(i, j, k, ivz)
12091  w_x = dd*ssx
12092  w_y = dd*ssy
12093  w_z = dd*ssz
12094  dd = aa(i, j, k+1) - aa(i, j, k)
12095  q_x = -(dd*ssx)
12096  q_y = -(dd*ssy)
12097  q_z = -(dd*ssz)
12098  por = half*rfilv
12099  if (pork(i, j, k) .eq. noflux) por = zero
12100 ! compute the laminar and (if present) the eddy viscosities
12101 ! multiplied by the porosity. compute the factor in front of
12102 ! the gradients of the speed of sound squared for the heat
12103 ! flux.
12104  mul = por*(rlv(i, j, k)+rlv(i, j, k+1))
12105  if (eddymodel) mue = por*(rev(i, j, k)+rev(i, j, k+1))
12106  mut = mul + mue
12107  gm1 = half*(gamma(i, j, k)+gamma(i, j, k+1)) - one
12108  factlamheat = one/(prandtl*gm1)
12109  factturbheat = one/(prandtlturb*gm1)
12110  heatcoef = mul*factlamheat + mue*factturbheat
12111 ! compute the stress tensor and the heat flux vector.
12112  fracdiv = twothird*(u_x+v_y+w_z)
12113  tauxx = mut*(two*u_x-fracdiv)
12114  tauyy = mut*(two*v_y-fracdiv)
12115  tauzz = mut*(two*w_z-fracdiv)
12116  tauxy = mut*(u_y+v_x)
12117  tauxz = mut*(u_z+w_x)
12118  tauyz = mut*(v_z+w_y)
12119  q_x = heatcoef*q_x
12120  q_y = heatcoef*q_y
12121  q_z = heatcoef*q_z
12122 ! compute the average velocities for the face. remember that
12123 ! the velocities are stored and not the momentum.
12124  ubar = half*(w(i, j, k, ivx)+w(i, j, k+1, ivx))
12125  vbar = half*(w(i, j, k, ivy)+w(i, j, k+1, ivy))
12126  wbar = half*(w(i, j, k, ivz)+w(i, j, k+1, ivz))
12127 ! compute the viscous fluxes for this j-face.
12128  fmx = tauxx*sk(i, j, k, 1) + tauxy*sk(i, j, k, 2) + tauxz*sk(i&
12129 & , j, k, 3)
12130  fmy = tauxy*sk(i, j, k, 1) + tauyy*sk(i, j, k, 2) + tauyz*sk(i&
12131 & , j, k, 3)
12132  fmz = tauxz*sk(i, j, k, 1) + tauyz*sk(i, j, k, 2) + tauzz*sk(i&
12133 & , j, k, 3)
12134  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*sk(i, j, k, 1) + (&
12135 & ubar*tauxy+vbar*tauyy+wbar*tauyz)*sk(i, j, k, 2) + (ubar*&
12136 & tauxz+vbar*tauyz+wbar*tauzz)*sk(i, j, k, 3) - q_x*sk(i, j, k&
12137 & , 1) - q_y*sk(i, j, k, 2) - q_z*sk(i, j, k, 3)
12138 ! update the residuals of cell j and j+1.
12139  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
12140  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
12141  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
12142  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
12143  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fmx
12144  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fmy
12145  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fmz
12146  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + frhoe
12147  end do
12148  end do
12149  end do
12150  end subroutine viscousfluxapprox
12151 
12152 ! differentiation of invisciddissfluxscalarapprox in reverse (adjoint) mode (with options noisize i4 dr8 r8):
12153 ! gradient of useful results: *p *w *fw
12154 ! with respect to varying inputs: rhoinf pinfcorr *p *w *fw *radi
12155 ! *radj *radk
12156 ! rw status of diff variables: rhoinf:out pinfcorr:out *p:incr
12157 ! *w:in-out *fw:in-out *radi:out *radj:out *radk:out
12158 ! plus diff mem management of: p:in w:in fw:in radi:in radj:in
12159 ! radk:in
12161 !
12162 ! invisciddissfluxscalar computes the scalar artificial
12163 ! dissipation, see aiaa paper 81-1259, for a given block.
12164 ! therefore it is assumed that the pointers in blockpointers
12165 ! already point to the correct block.
12166 !
12167  use blockpointers
12168  use cgnsgrid
12169  use constants
12170  use flowvarrefstate
12174  use inputphysics
12175  use iteration
12176  implicit none
12177 !
12178 ! local parameter.
12179 !
12180  real(kind=realtype), parameter :: dssmax=0.25_realtype
12181 !
12182 ! local variables.
12183 !
12184  integer(kind=inttype) :: i, j, k, ind
12185  real(kind=realtype) :: sslim, rhoi
12186  real(kind=realtype) :: sslimd, rhoid
12187  real(kind=realtype) :: sfil, fis2, fis4
12188  real(kind=realtype) :: ppor, rrad, dis2
12189  real(kind=realtype) :: rradd, dis2d
12190  real(kind=realtype) :: dss1, dss2, ddw, fs
12191  real(kind=realtype) :: dss1d, dss2d, ddwd, fsd
12192  intrinsic abs
12193  intrinsic log10
12194  intrinsic exp
12195  intrinsic max
12196  intrinsic min
12197  real(kind=realtype) :: x1
12198  real(kind=realtype) :: x1d
12199  real(kind=realtype) :: x2
12200  real(kind=realtype) :: x2d
12201  real(kind=realtype) :: y1
12202  real(kind=realtype) :: y1d
12203  real(kind=realtype) :: x3
12204  real(kind=realtype) :: x3d
12205  real(kind=realtype) :: x4
12206  real(kind=realtype) :: x4d
12207  real(kind=realtype) :: y2
12208  real(kind=realtype) :: y2d
12209  real(kind=realtype) :: x5
12210  real(kind=realtype) :: x5d
12211  real(kind=realtype) :: x6
12212  real(kind=realtype) :: x6d
12213  real(kind=realtype) :: y3
12214  real(kind=realtype) :: y3d
12215  real(kind=realtype) :: abs0
12216  real(kind=realtype) :: min1
12217  real(kind=realtype) :: min1d
12218  real(kind=realtype) :: min2
12219  real(kind=realtype) :: min2d
12220  real(kind=realtype) :: min3
12221  real(kind=realtype) :: min3d
12222  real(kind=realtype) :: temp
12223  real(kind=realtype) :: temp0
12224  real(kind=realtype) :: tempd
12225  real(kind=realtype) :: tmp
12226  real(kind=realtype) :: tmpd
12227  real(kind=realtype) :: tmp0
12228  real(kind=realtype) :: tmpd0
12229  real(kind=realtype) :: tmp1
12230  real(kind=realtype) :: tmpd1
12231  real(kind=realtype) :: tmp2
12232  real(kind=realtype) :: tmpd2
12233  real(kind=realtype) :: tmp3
12234  real(kind=realtype) :: tmpd3
12235  real(kind=realtype) :: tmp4
12236  real(kind=realtype) :: tmpd4
12237  real(kind=realtype) :: tmp5
12238  real(kind=realtype) :: tmpd5
12239  real(kind=realtype) :: tmp6
12240  real(kind=realtype) :: tmpd6
12241  real(kind=realtype) :: tmp7
12242  real(kind=realtype) :: tmpd7
12243  real(kind=realtype) :: tmp8
12244  real(kind=realtype) :: tmpd8
12245  real(kind=realtype) :: tmp9
12246  real(kind=realtype) :: tmpd9
12247  real(kind=realtype) :: tmp10
12248  real(kind=realtype) :: tmpd10
12249  real(kind=realtype) :: tmp11
12250  real(kind=realtype) :: tmpd11
12251  real(kind=realtype) :: tmp12
12252  real(kind=realtype) :: tmpd12
12253  real(kind=realtype) :: tmp13
12254  real(kind=realtype) :: tmpd13
12255  real(kind=realtype) :: tmp14
12256  real(kind=realtype) :: tmpd14
12257  real(kind=realtype) :: tmp15
12258  real(kind=realtype) :: tmpd15
12259  real(kind=realtype) :: tmp16
12260  real(kind=realtype) :: tmpd16
12261  real(kind=realtype) :: tmp17
12262  real(kind=realtype) :: tmpd17
12263  real(kind=realtype) :: tmp18
12264  real(kind=realtype) :: tmpd18
12265  real(kind=realtype) :: tmp19
12266  real(kind=realtype) :: tmpd19
12267  real(kind=realtype) :: tmp20
12268  real(kind=realtype) :: tmpd20
12269  real(kind=realtype) :: tmp21
12270  real(kind=realtype) :: tmpd21
12271  real(kind=realtype) :: tmp22
12272  real(kind=realtype) :: tmpd22
12273  real(kind=realtype) :: tmp23
12274  real(kind=realtype) :: tmpd23
12275  real(kind=realtype) :: tmp24
12276  real(kind=realtype) :: tmpd24
12277  real(kind=realtype) :: tmp25
12278  real(kind=realtype) :: tmpd25
12279  integer :: branch
12280  if (rfil .ge. 0.) then
12281  abs0 = rfil
12282  else
12283  abs0 = -rfil
12284  end if
12285 ! check if rfil == 0. if so, the dissipative flux needs not to
12286 ! be computed.
12287  if (abs0 .lt. thresholdreal) then
12288  rhoinfd = 0.0_8
12289  pinfcorrd = 0.0_8
12290  if (associated(radid)) radid = 0.0_8
12291  if (associated(radjd)) radjd = 0.0_8
12292  if (associated(radkd)) radkd = 0.0_8
12293  else
12294 ! determine the variables used to compute the switch.
12295 ! for the inviscid case this is the pressure; for the viscous
12296 ! case it is the entropy.
12297  select case (equations)
12298  case (eulerequations)
12299 ! inviscid case. pressure switch is based on the pressure.
12300 ! also set the value of sslim. to be fully consistent this
12301 ! must have the dimension of pressure and it is therefore
12302 ! set to a fraction of the free stream value.
12303  sslim = 0.001_realtype*pinfcorr
12304 !===============================================================
12305  call pushcontrol2b(1)
12306  case (nsequations, ransequations)
12307 ! viscous case. pressure switch is based on the entropy.
12308 ! also set the value of sslim. to be fully consistent this
12309 ! must have the dimension of entropy and it is therefore
12310 ! set to a fraction of the free stream value.
12311  sslim = 0.001_realtype*pinfcorr/rhoinf**gammainf
12312  call pushcontrol2b(2)
12313  case default
12314  call pushcontrol2b(0)
12315  end select
12316 ! set the dissipation constants for the scheme.
12317 ! rfil and sfil are fractions used by the runge-kutta solver to compute residuals at intermediate steps.
12318 ! this means that fis2 and fis4 will be some fraction of vis2 and vis4, respectively.
12319 ! for other solvers, rfil==1, sfil==0, fis2==vis2, and fis4==vis4.
12320 ! the sigmoid function used for dissipation-based continuation is described in eq. 28 and eq. 29 from the paper:
12321 ! "improving the performance of a compressible rans solver for low and high mach number flows" (seraj2022c).
12322 ! the options documentation also has information on the parameters in this formulation.
12323  if (usedisscontinuation) then
12324  fis2 = rfil*(vis2+disscontmagnitude/(1+exp(-(disscontsharpness*(&
12325 & log10(totalr/totalr0)+disscontmidpoint)))))
12326  else
12327  fis2 = rfil*vis2
12328  end if
12329  fis4 = rfil*vis4
12330  sfil = one - rfil
12331 ! replace the total energy by rho times the total enthalpy.
12332 ! in this way the numerical solution is total enthalpy preserving
12333 ! for the steady euler equations. also replace the velocities by
12334 ! the momentum. only done for the entries used in the
12335 ! discretization, i.e. ignore the corner halo's.
12336  do k=0,kb
12337  do j=2,jl
12338  do i=2,il
12339  tmp = w(i, j, k, irho)*w(i, j, k, ivx)
12340  call pushreal8(w(i, j, k, ivx))
12341  w(i, j, k, ivx) = tmp
12342  tmp0 = w(i, j, k, irho)*w(i, j, k, ivy)
12343  call pushreal8(w(i, j, k, ivy))
12344  w(i, j, k, ivy) = tmp0
12345  tmp1 = w(i, j, k, irho)*w(i, j, k, ivz)
12346  call pushreal8(w(i, j, k, ivz))
12347  w(i, j, k, ivz) = tmp1
12348  call pushreal8(w(i, j, k, irhoe))
12349  w(i, j, k, irhoe) = w(i, j, k, irhoe) + p(i, j, k)
12350  end do
12351  end do
12352  end do
12353  do k=2,kl
12354  do j=2,jl
12355  tmp2 = w(0, j, k, irho)*w(0, j, k, ivx)
12356  call pushreal8(w(0, j, k, ivx))
12357  w(0, j, k, ivx) = tmp2
12358  tmp3 = w(0, j, k, irho)*w(0, j, k, ivy)
12359  call pushreal8(w(0, j, k, ivy))
12360  w(0, j, k, ivy) = tmp3
12361  tmp4 = w(0, j, k, irho)*w(0, j, k, ivz)
12362  call pushreal8(w(0, j, k, ivz))
12363  w(0, j, k, ivz) = tmp4
12364  call pushreal8(w(0, j, k, irhoe))
12365  w(0, j, k, irhoe) = w(0, j, k, irhoe) + p(0, j, k)
12366  tmp5 = w(1, j, k, irho)*w(1, j, k, ivx)
12367  call pushreal8(w(1, j, k, ivx))
12368  w(1, j, k, ivx) = tmp5
12369  tmp6 = w(1, j, k, irho)*w(1, j, k, ivy)
12370  call pushreal8(w(1, j, k, ivy))
12371  w(1, j, k, ivy) = tmp6
12372  tmp7 = w(1, j, k, irho)*w(1, j, k, ivz)
12373  call pushreal8(w(1, j, k, ivz))
12374  w(1, j, k, ivz) = tmp7
12375  call pushreal8(w(1, j, k, irhoe))
12376  w(1, j, k, irhoe) = w(1, j, k, irhoe) + p(1, j, k)
12377  tmp8 = w(ie, j, k, irho)*w(ie, j, k, ivx)
12378  call pushreal8(w(ie, j, k, ivx))
12379  w(ie, j, k, ivx) = tmp8
12380  tmp9 = w(ie, j, k, irho)*w(ie, j, k, ivy)
12381  call pushreal8(w(ie, j, k, ivy))
12382  w(ie, j, k, ivy) = tmp9
12383  tmp10 = w(ie, j, k, irho)*w(ie, j, k, ivz)
12384  call pushreal8(w(ie, j, k, ivz))
12385  w(ie, j, k, ivz) = tmp10
12386  call pushreal8(w(ie, j, k, irhoe))
12387  w(ie, j, k, irhoe) = w(ie, j, k, irhoe) + p(ie, j, k)
12388  tmp11 = w(ib, j, k, irho)*w(ib, j, k, ivx)
12389  call pushreal8(w(ib, j, k, ivx))
12390  w(ib, j, k, ivx) = tmp11
12391  tmp12 = w(ib, j, k, irho)*w(ib, j, k, ivy)
12392  call pushreal8(w(ib, j, k, ivy))
12393  w(ib, j, k, ivy) = tmp12
12394  tmp13 = w(ib, j, k, irho)*w(ib, j, k, ivz)
12395  call pushreal8(w(ib, j, k, ivz))
12396  w(ib, j, k, ivz) = tmp13
12397  call pushreal8(w(ib, j, k, irhoe))
12398  w(ib, j, k, irhoe) = w(ib, j, k, irhoe) + p(ib, j, k)
12399  end do
12400  end do
12401  do k=2,kl
12402  do i=2,il
12403  tmp14 = w(i, 0, k, irho)*w(i, 0, k, ivx)
12404  call pushreal8(w(i, 0, k, ivx))
12405  w(i, 0, k, ivx) = tmp14
12406  tmp15 = w(i, 0, k, irho)*w(i, 0, k, ivy)
12407  call pushreal8(w(i, 0, k, ivy))
12408  w(i, 0, k, ivy) = tmp15
12409  tmp16 = w(i, 0, k, irho)*w(i, 0, k, ivz)
12410  call pushreal8(w(i, 0, k, ivz))
12411  w(i, 0, k, ivz) = tmp16
12412  call pushreal8(w(i, 0, k, irhoe))
12413  w(i, 0, k, irhoe) = w(i, 0, k, irhoe) + p(i, 0, k)
12414  tmp17 = w(i, 1, k, irho)*w(i, 1, k, ivx)
12415  call pushreal8(w(i, 1, k, ivx))
12416  w(i, 1, k, ivx) = tmp17
12417  tmp18 = w(i, 1, k, irho)*w(i, 1, k, ivy)
12418  call pushreal8(w(i, 1, k, ivy))
12419  w(i, 1, k, ivy) = tmp18
12420  tmp19 = w(i, 1, k, irho)*w(i, 1, k, ivz)
12421  call pushreal8(w(i, 1, k, ivz))
12422  w(i, 1, k, ivz) = tmp19
12423  call pushreal8(w(i, 1, k, irhoe))
12424  w(i, 1, k, irhoe) = w(i, 1, k, irhoe) + p(i, 1, k)
12425  tmp20 = w(i, je, k, irho)*w(i, je, k, ivx)
12426  call pushreal8(w(i, je, k, ivx))
12427  w(i, je, k, ivx) = tmp20
12428  tmp21 = w(i, je, k, irho)*w(i, je, k, ivy)
12429  call pushreal8(w(i, je, k, ivy))
12430  w(i, je, k, ivy) = tmp21
12431  tmp22 = w(i, je, k, irho)*w(i, je, k, ivz)
12432  call pushreal8(w(i, je, k, ivz))
12433  w(i, je, k, ivz) = tmp22
12434  call pushreal8(w(i, je, k, irhoe))
12435  w(i, je, k, irhoe) = w(i, je, k, irhoe) + p(i, je, k)
12436  tmp23 = w(i, jb, k, irho)*w(i, jb, k, ivx)
12437  call pushreal8(w(i, jb, k, ivx))
12438  w(i, jb, k, ivx) = tmp23
12439  tmp24 = w(i, jb, k, irho)*w(i, jb, k, ivy)
12440  call pushreal8(w(i, jb, k, ivy))
12441  w(i, jb, k, ivy) = tmp24
12442  tmp25 = w(i, jb, k, irho)*w(i, jb, k, ivz)
12443  call pushreal8(w(i, jb, k, ivz))
12444  w(i, jb, k, ivz) = tmp25
12445  call pushreal8(w(i, jb, k, irhoe))
12446  w(i, jb, k, irhoe) = w(i, jb, k, irhoe) + p(i, jb, k)
12447  end do
12448  end do
12449 !
12450 ! dissipative fluxes in the i-direction.
12451 !
12452  do k=2,kl
12453  do j=2,jl
12454  x1 = (shocksensor(2, j, k)-two*shocksensor(1, j, k)+&
12455 & shocksensor(0, j, k))/(shocksensor(2, j, k)+two*shocksensor(&
12456 & 1, j, k)+shocksensor(0, j, k)+sslim)
12457  if (x1 .ge. 0.) then
12458  dss1 = x1
12459  call pushcontrol1b(0)
12460  else
12461  dss1 = -x1
12462  call pushcontrol1b(1)
12463  end if
12464 ! loop in i-direction.
12465  do i=1,il
12466  x2 = (shocksensor(i+2, j, k)-two*shocksensor(i+1, j, k)+&
12467 & shocksensor(i, j, k))/(shocksensor(i+2, j, k)+two*&
12468 & shocksensor(i+1, j, k)+shocksensor(i, j, k)+sslim)
12469  if (x2 .ge. 0.) then
12470  dss2 = x2
12471  call pushcontrol1b(0)
12472  else
12473  dss2 = -x2
12474  call pushcontrol1b(1)
12475  end if
12476 ! compute the dissipation coefficients for this face.
12477  call pushreal8(ppor)
12478  ppor = zero
12479  if (pori(i, j, k) .eq. normalflux) ppor = half
12480  if (dss1 .lt. dss2) then
12481  y1 = dss2
12482  call pushcontrol1b(0)
12483  else
12484  y1 = dss1
12485  call pushcontrol1b(1)
12486  end if
12487  if (dssmax .gt. y1) then
12488  call pushreal8(min1)
12489  min1 = y1
12490  call pushcontrol1b(0)
12491  else
12492  call pushreal8(min1)
12493  min1 = dssmax
12494  call pushcontrol1b(1)
12495  end if
12496 ! modification for fd preconditioner note: this lumping
12497 ! actually still results in a greater than 3 cell stencil
12498 ! in any direction. since this seems to work slightly
12499 ! better than the dis2=sigma*fis4*rrad, we will just use
12500 ! a 5-cell stencil for doing the pc
12501 ! compute and scatter the dissipative flux.
12502 ! density. store it in the mass flow of the
12503 ! appropriate sliding mesh interface.
12504 ! x-momentum.
12505 ! y-momentum.
12506 ! z-momentum.
12507 ! energy.
12508 ! set dss1 to dss2 for the next face.
12509  dss1 = dss2
12510  end do
12511  end do
12512  end do
12513 !
12514 ! dissipative fluxes in the j-direction.
12515 !
12516  do k=2,kl
12517  do i=2,il
12518  x3 = (shocksensor(i, 2, k)-two*shocksensor(i, 1, k)+&
12519 & shocksensor(i, 0, k))/(shocksensor(i, 2, k)+two*shocksensor(&
12520 & i, 1, k)+shocksensor(i, 0, k)+sslim)
12521  if (x3 .ge. 0.) then
12522  dss1 = x3
12523  call pushcontrol1b(0)
12524  else
12525  dss1 = -x3
12526  call pushcontrol1b(1)
12527  end if
12528 ! loop in j-direction.
12529  do j=1,jl
12530  x4 = (shocksensor(i, j+2, k)-two*shocksensor(i, j+1, k)+&
12531 & shocksensor(i, j, k))/(shocksensor(i, j+2, k)+two*&
12532 & shocksensor(i, j+1, k)+shocksensor(i, j, k)+sslim)
12533  if (x4 .ge. 0.) then
12534  dss2 = x4
12535  call pushcontrol1b(0)
12536  else
12537  dss2 = -x4
12538  call pushcontrol1b(1)
12539  end if
12540 ! compute the dissipation coefficients for this face.
12541  call pushreal8(ppor)
12542  ppor = zero
12543  if (porj(i, j, k) .eq. normalflux) ppor = half
12544  if (dss1 .lt. dss2) then
12545  y2 = dss2
12546  call pushcontrol1b(0)
12547  else
12548  y2 = dss1
12549  call pushcontrol1b(1)
12550  end if
12551  if (dssmax .gt. y2) then
12552  call pushreal8(min2)
12553  min2 = y2
12554  call pushcontrol1b(0)
12555  else
12556  call pushreal8(min2)
12557  min2 = dssmax
12558  call pushcontrol1b(1)
12559  end if
12560 ! modification for fd preconditioner
12561 ! compute and scatter the dissipative flux.
12562 ! density. store it in the mass flow of the
12563 ! appropriate sliding mesh interface.
12564 ! x-momentum.
12565 ! y-momentum.
12566 ! z-momentum.
12567 ! energy.
12568 ! set dss1 to dss2 for the next face.
12569  dss1 = dss2
12570  end do
12571  end do
12572  end do
12573 !
12574 ! dissipative fluxes in the k-direction.
12575 !
12576  do j=2,jl
12577  do i=2,il
12578  x5 = (shocksensor(i, j, 2)-two*shocksensor(i, j, 1)+&
12579 & shocksensor(i, j, 0))/(shocksensor(i, j, 2)+two*shocksensor(&
12580 & i, j, 1)+shocksensor(i, j, 0)+sslim)
12581  if (x5 .ge. 0.) then
12582  dss1 = x5
12583  call pushcontrol1b(0)
12584  else
12585  dss1 = -x5
12586  call pushcontrol1b(1)
12587  end if
12588 ! loop in k-direction.
12589  do k=1,kl
12590  x6 = (shocksensor(i, j, k+2)-two*shocksensor(i, j, k+1)+&
12591 & shocksensor(i, j, k))/(shocksensor(i, j, k+2)+two*&
12592 & shocksensor(i, j, k+1)+shocksensor(i, j, k)+sslim)
12593  if (x6 .ge. 0.) then
12594  dss2 = x6
12595  call pushcontrol1b(0)
12596  else
12597  dss2 = -x6
12598  call pushcontrol1b(1)
12599  end if
12600 ! compute the dissipation coefficients for this face.
12601  call pushreal8(ppor)
12602  ppor = zero
12603  if (pork(i, j, k) .eq. normalflux) ppor = half
12604  if (dss1 .lt. dss2) then
12605  y3 = dss2
12606  call pushcontrol1b(0)
12607  else
12608  y3 = dss1
12609  call pushcontrol1b(1)
12610  end if
12611  if (dssmax .gt. y3) then
12612  call pushreal8(min3)
12613  min3 = y3
12614  call pushcontrol1b(0)
12615  else
12616  call pushreal8(min3)
12617  min3 = dssmax
12618  call pushcontrol1b(1)
12619  end if
12620 ! modification for fd preconditioner
12621 ! compute and scatter the dissipative flux.
12622 ! density. store it in the mass flow of the
12623 ! appropriate sliding mesh interface.
12624 ! x-momentum.
12625 ! y-momentum.
12626 ! z-momentum.
12627 ! energy.
12628 ! set dss1 to dss2 for the next face.
12629  dss1 = dss2
12630  end do
12631  end do
12632  end do
12633 ! replace rho times the total enthalpy by the total energy and
12634 ! store the velocities again instead of the momentum. only for
12635 ! those entries that have been altered, i.e. ignore the
12636 ! corner halo's.
12637  do k=0,kb
12638  do j=2,jl
12639  do i=2,il
12640  call pushreal8(rhoi)
12641  rhoi = one/w(i, j, k, irho)
12642  call pushreal8(w(i, j, k, ivx))
12643  w(i, j, k, ivx) = w(i, j, k, ivx)*rhoi
12644  call pushreal8(w(i, j, k, ivy))
12645  w(i, j, k, ivy) = w(i, j, k, ivy)*rhoi
12646  call pushreal8(w(i, j, k, ivz))
12647  w(i, j, k, ivz) = w(i, j, k, ivz)*rhoi
12648  call pushreal8(w(i, j, k, irhoe))
12649  w(i, j, k, irhoe) = w(i, j, k, irhoe) - p(i, j, k)
12650  end do
12651  end do
12652  end do
12653  do k=2,kl
12654  do j=2,jl
12655  call pushreal8(rhoi)
12656  rhoi = one/w(0, j, k, irho)
12657  call pushreal8(w(0, j, k, ivx))
12658  w(0, j, k, ivx) = w(0, j, k, ivx)*rhoi
12659  call pushreal8(w(0, j, k, ivy))
12660  w(0, j, k, ivy) = w(0, j, k, ivy)*rhoi
12661  call pushreal8(w(0, j, k, ivz))
12662  w(0, j, k, ivz) = w(0, j, k, ivz)*rhoi
12663  call pushreal8(w(0, j, k, irhoe))
12664  w(0, j, k, irhoe) = w(0, j, k, irhoe) - p(0, j, k)
12665  call pushreal8(rhoi)
12666  rhoi = one/w(1, j, k, irho)
12667  call pushreal8(w(1, j, k, ivx))
12668  w(1, j, k, ivx) = w(1, j, k, ivx)*rhoi
12669  call pushreal8(w(1, j, k, ivy))
12670  w(1, j, k, ivy) = w(1, j, k, ivy)*rhoi
12671  call pushreal8(w(1, j, k, ivz))
12672  w(1, j, k, ivz) = w(1, j, k, ivz)*rhoi
12673  call pushreal8(w(1, j, k, irhoe))
12674  w(1, j, k, irhoe) = w(1, j, k, irhoe) - p(1, j, k)
12675  call pushreal8(rhoi)
12676  rhoi = one/w(ie, j, k, irho)
12677  call pushreal8(w(ie, j, k, ivx))
12678  w(ie, j, k, ivx) = w(ie, j, k, ivx)*rhoi
12679  call pushreal8(w(ie, j, k, ivy))
12680  w(ie, j, k, ivy) = w(ie, j, k, ivy)*rhoi
12681  call pushreal8(w(ie, j, k, ivz))
12682  w(ie, j, k, ivz) = w(ie, j, k, ivz)*rhoi
12683  call pushreal8(w(ie, j, k, irhoe))
12684  w(ie, j, k, irhoe) = w(ie, j, k, irhoe) - p(ie, j, k)
12685  call pushreal8(rhoi)
12686  rhoi = one/w(ib, j, k, irho)
12687  call pushreal8(w(ib, j, k, ivx))
12688  w(ib, j, k, ivx) = w(ib, j, k, ivx)*rhoi
12689  call pushreal8(w(ib, j, k, ivy))
12690  w(ib, j, k, ivy) = w(ib, j, k, ivy)*rhoi
12691  call pushreal8(w(ib, j, k, ivz))
12692  w(ib, j, k, ivz) = w(ib, j, k, ivz)*rhoi
12693  call pushreal8(w(ib, j, k, irhoe))
12694  w(ib, j, k, irhoe) = w(ib, j, k, irhoe) - p(ib, j, k)
12695  end do
12696  end do
12697  do k=2,kl
12698  do i=2,il
12699  call pushreal8(rhoi)
12700  rhoi = one/w(i, 0, k, irho)
12701  call pushreal8(w(i, 0, k, ivx))
12702  w(i, 0, k, ivx) = w(i, 0, k, ivx)*rhoi
12703  call pushreal8(w(i, 0, k, ivy))
12704  w(i, 0, k, ivy) = w(i, 0, k, ivy)*rhoi
12705  call pushreal8(w(i, 0, k, ivz))
12706  w(i, 0, k, ivz) = w(i, 0, k, ivz)*rhoi
12707  call pushreal8(w(i, 0, k, irhoe))
12708  w(i, 0, k, irhoe) = w(i, 0, k, irhoe) - p(i, 0, k)
12709  call pushreal8(rhoi)
12710  rhoi = one/w(i, 1, k, irho)
12711  call pushreal8(w(i, 1, k, ivx))
12712  w(i, 1, k, ivx) = w(i, 1, k, ivx)*rhoi
12713  call pushreal8(w(i, 1, k, ivy))
12714  w(i, 1, k, ivy) = w(i, 1, k, ivy)*rhoi
12715  call pushreal8(w(i, 1, k, ivz))
12716  w(i, 1, k, ivz) = w(i, 1, k, ivz)*rhoi
12717  call pushreal8(w(i, 1, k, irhoe))
12718  w(i, 1, k, irhoe) = w(i, 1, k, irhoe) - p(i, 1, k)
12719  call pushreal8(rhoi)
12720  rhoi = one/w(i, je, k, irho)
12721  call pushreal8(w(i, je, k, ivx))
12722  w(i, je, k, ivx) = w(i, je, k, ivx)*rhoi
12723  call pushreal8(w(i, je, k, ivy))
12724  w(i, je, k, ivy) = w(i, je, k, ivy)*rhoi
12725  call pushreal8(w(i, je, k, ivz))
12726  w(i, je, k, ivz) = w(i, je, k, ivz)*rhoi
12727  call pushreal8(w(i, je, k, irhoe))
12728  w(i, je, k, irhoe) = w(i, je, k, irhoe) - p(i, je, k)
12729  call pushreal8(rhoi)
12730  rhoi = one/w(i, jb, k, irho)
12731  call pushreal8(w(i, jb, k, ivx))
12732  w(i, jb, k, ivx) = w(i, jb, k, ivx)*rhoi
12733  call pushreal8(w(i, jb, k, ivy))
12734  w(i, jb, k, ivy) = w(i, jb, k, ivy)*rhoi
12735  call pushreal8(w(i, jb, k, ivz))
12736  w(i, jb, k, ivz) = w(i, jb, k, ivz)*rhoi
12737  call pushreal8(w(i, jb, k, irhoe))
12738  w(i, jb, k, irhoe) = w(i, jb, k, irhoe) - p(i, jb, k)
12739  end do
12740  end do
12741  do k=kl,2,-1
12742  do i=il,2,-1
12743  call popreal8(w(i, jb, k, irhoe))
12744  pd(i, jb, k) = pd(i, jb, k) - wd(i, jb, k, irhoe)
12745  call popreal8(w(i, jb, k, ivz))
12746  rhoid = w(i, jb, k, ivz)*wd(i, jb, k, ivz)
12747  wd(i, jb, k, ivz) = rhoi*wd(i, jb, k, ivz)
12748  call popreal8(w(i, jb, k, ivy))
12749  rhoid = rhoid + w(i, jb, k, ivy)*wd(i, jb, k, ivy)
12750  wd(i, jb, k, ivy) = rhoi*wd(i, jb, k, ivy)
12751  call popreal8(w(i, jb, k, ivx))
12752  rhoid = rhoid + w(i, jb, k, ivx)*wd(i, jb, k, ivx)
12753  wd(i, jb, k, ivx) = rhoi*wd(i, jb, k, ivx)
12754  call popreal8(rhoi)
12755  temp0 = w(i, jb, k, irho)
12756  wd(i, jb, k, irho) = wd(i, jb, k, irho) - one*rhoid/temp0**2
12757  call popreal8(w(i, je, k, irhoe))
12758  pd(i, je, k) = pd(i, je, k) - wd(i, je, k, irhoe)
12759  call popreal8(w(i, je, k, ivz))
12760  rhoid = w(i, je, k, ivz)*wd(i, je, k, ivz)
12761  wd(i, je, k, ivz) = rhoi*wd(i, je, k, ivz)
12762  call popreal8(w(i, je, k, ivy))
12763  rhoid = rhoid + w(i, je, k, ivy)*wd(i, je, k, ivy)
12764  wd(i, je, k, ivy) = rhoi*wd(i, je, k, ivy)
12765  call popreal8(w(i, je, k, ivx))
12766  rhoid = rhoid + w(i, je, k, ivx)*wd(i, je, k, ivx)
12767  wd(i, je, k, ivx) = rhoi*wd(i, je, k, ivx)
12768  call popreal8(rhoi)
12769  temp0 = w(i, je, k, irho)
12770  wd(i, je, k, irho) = wd(i, je, k, irho) - one*rhoid/temp0**2
12771  call popreal8(w(i, 1, k, irhoe))
12772  pd(i, 1, k) = pd(i, 1, k) - wd(i, 1, k, irhoe)
12773  call popreal8(w(i, 1, k, ivz))
12774  rhoid = w(i, 1, k, ivz)*wd(i, 1, k, ivz)
12775  wd(i, 1, k, ivz) = rhoi*wd(i, 1, k, ivz)
12776  call popreal8(w(i, 1, k, ivy))
12777  rhoid = rhoid + w(i, 1, k, ivy)*wd(i, 1, k, ivy)
12778  wd(i, 1, k, ivy) = rhoi*wd(i, 1, k, ivy)
12779  call popreal8(w(i, 1, k, ivx))
12780  rhoid = rhoid + w(i, 1, k, ivx)*wd(i, 1, k, ivx)
12781  wd(i, 1, k, ivx) = rhoi*wd(i, 1, k, ivx)
12782  call popreal8(rhoi)
12783  temp0 = w(i, 1, k, irho)
12784  wd(i, 1, k, irho) = wd(i, 1, k, irho) - one*rhoid/temp0**2
12785  call popreal8(w(i, 0, k, irhoe))
12786  pd(i, 0, k) = pd(i, 0, k) - wd(i, 0, k, irhoe)
12787  call popreal8(w(i, 0, k, ivz))
12788  rhoid = w(i, 0, k, ivz)*wd(i, 0, k, ivz)
12789  wd(i, 0, k, ivz) = rhoi*wd(i, 0, k, ivz)
12790  call popreal8(w(i, 0, k, ivy))
12791  rhoid = rhoid + w(i, 0, k, ivy)*wd(i, 0, k, ivy)
12792  wd(i, 0, k, ivy) = rhoi*wd(i, 0, k, ivy)
12793  call popreal8(w(i, 0, k, ivx))
12794  rhoid = rhoid + w(i, 0, k, ivx)*wd(i, 0, k, ivx)
12795  wd(i, 0, k, ivx) = rhoi*wd(i, 0, k, ivx)
12796  call popreal8(rhoi)
12797  temp0 = w(i, 0, k, irho)
12798  wd(i, 0, k, irho) = wd(i, 0, k, irho) - one*rhoid/temp0**2
12799  end do
12800  end do
12801  do k=kl,2,-1
12802  do j=jl,2,-1
12803  call popreal8(w(ib, j, k, irhoe))
12804  pd(ib, j, k) = pd(ib, j, k) - wd(ib, j, k, irhoe)
12805  call popreal8(w(ib, j, k, ivz))
12806  rhoid = w(ib, j, k, ivz)*wd(ib, j, k, ivz)
12807  wd(ib, j, k, ivz) = rhoi*wd(ib, j, k, ivz)
12808  call popreal8(w(ib, j, k, ivy))
12809  rhoid = rhoid + w(ib, j, k, ivy)*wd(ib, j, k, ivy)
12810  wd(ib, j, k, ivy) = rhoi*wd(ib, j, k, ivy)
12811  call popreal8(w(ib, j, k, ivx))
12812  rhoid = rhoid + w(ib, j, k, ivx)*wd(ib, j, k, ivx)
12813  wd(ib, j, k, ivx) = rhoi*wd(ib, j, k, ivx)
12814  call popreal8(rhoi)
12815  temp0 = w(ib, j, k, irho)
12816  wd(ib, j, k, irho) = wd(ib, j, k, irho) - one*rhoid/temp0**2
12817  call popreal8(w(ie, j, k, irhoe))
12818  pd(ie, j, k) = pd(ie, j, k) - wd(ie, j, k, irhoe)
12819  call popreal8(w(ie, j, k, ivz))
12820  rhoid = w(ie, j, k, ivz)*wd(ie, j, k, ivz)
12821  wd(ie, j, k, ivz) = rhoi*wd(ie, j, k, ivz)
12822  call popreal8(w(ie, j, k, ivy))
12823  rhoid = rhoid + w(ie, j, k, ivy)*wd(ie, j, k, ivy)
12824  wd(ie, j, k, ivy) = rhoi*wd(ie, j, k, ivy)
12825  call popreal8(w(ie, j, k, ivx))
12826  rhoid = rhoid + w(ie, j, k, ivx)*wd(ie, j, k, ivx)
12827  wd(ie, j, k, ivx) = rhoi*wd(ie, j, k, ivx)
12828  call popreal8(rhoi)
12829  temp0 = w(ie, j, k, irho)
12830  wd(ie, j, k, irho) = wd(ie, j, k, irho) - one*rhoid/temp0**2
12831  call popreal8(w(1, j, k, irhoe))
12832  pd(1, j, k) = pd(1, j, k) - wd(1, j, k, irhoe)
12833  call popreal8(w(1, j, k, ivz))
12834  rhoid = w(1, j, k, ivz)*wd(1, j, k, ivz)
12835  wd(1, j, k, ivz) = rhoi*wd(1, j, k, ivz)
12836  call popreal8(w(1, j, k, ivy))
12837  rhoid = rhoid + w(1, j, k, ivy)*wd(1, j, k, ivy)
12838  wd(1, j, k, ivy) = rhoi*wd(1, j, k, ivy)
12839  call popreal8(w(1, j, k, ivx))
12840  rhoid = rhoid + w(1, j, k, ivx)*wd(1, j, k, ivx)
12841  wd(1, j, k, ivx) = rhoi*wd(1, j, k, ivx)
12842  call popreal8(rhoi)
12843  temp0 = w(1, j, k, irho)
12844  wd(1, j, k, irho) = wd(1, j, k, irho) - one*rhoid/temp0**2
12845  call popreal8(w(0, j, k, irhoe))
12846  pd(0, j, k) = pd(0, j, k) - wd(0, j, k, irhoe)
12847  call popreal8(w(0, j, k, ivz))
12848  rhoid = w(0, j, k, ivz)*wd(0, j, k, ivz)
12849  wd(0, j, k, ivz) = rhoi*wd(0, j, k, ivz)
12850  call popreal8(w(0, j, k, ivy))
12851  rhoid = rhoid + w(0, j, k, ivy)*wd(0, j, k, ivy)
12852  wd(0, j, k, ivy) = rhoi*wd(0, j, k, ivy)
12853  call popreal8(w(0, j, k, ivx))
12854  rhoid = rhoid + w(0, j, k, ivx)*wd(0, j, k, ivx)
12855  wd(0, j, k, ivx) = rhoi*wd(0, j, k, ivx)
12856  call popreal8(rhoi)
12857  temp0 = w(0, j, k, irho)
12858  wd(0, j, k, irho) = wd(0, j, k, irho) - one*rhoid/temp0**2
12859  end do
12860  end do
12861  do k=kb,0,-1
12862  do j=jl,2,-1
12863  do i=il,2,-1
12864  call popreal8(w(i, j, k, irhoe))
12865  pd(i, j, k) = pd(i, j, k) - wd(i, j, k, irhoe)
12866  call popreal8(w(i, j, k, ivz))
12867  rhoid = w(i, j, k, ivz)*wd(i, j, k, ivz)
12868  wd(i, j, k, ivz) = rhoi*wd(i, j, k, ivz)
12869  call popreal8(w(i, j, k, ivy))
12870  rhoid = rhoid + w(i, j, k, ivy)*wd(i, j, k, ivy)
12871  wd(i, j, k, ivy) = rhoi*wd(i, j, k, ivy)
12872  call popreal8(w(i, j, k, ivx))
12873  rhoid = rhoid + w(i, j, k, ivx)*wd(i, j, k, ivx)
12874  wd(i, j, k, ivx) = rhoi*wd(i, j, k, ivx)
12875  call popreal8(rhoi)
12876  temp0 = w(i, j, k, irho)
12877  wd(i, j, k, irho) = wd(i, j, k, irho) - one*rhoid/temp0**2
12878  end do
12879  end do
12880  end do
12881  if (associated(radkd)) radkd = 0.0_8
12882  sslimd = 0.0_8
12883  do j=jl,2,-1
12884  do i=il,2,-1
12885  dss1d = 0.0_8
12886  do k=kl,1,-1
12887  dss2d = dss1d
12888  fsd = fwd(i, j, k+1, irhoe) - fwd(i, j, k, irhoe)
12889  ddw = w(i, j, k+1, irhoe) - w(i, j, k, irhoe)
12890  rrad = ppor*(radk(i, j, k)+radk(i, j, k+1))
12891  dis2 = fis2*rrad*min3 + sigma*fis4*rrad
12892  dis2d = ddw*fsd
12893  ddwd = dis2*fsd
12894  wd(i, j, k+1, irhoe) = wd(i, j, k+1, irhoe) + ddwd
12895  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddwd
12896  fsd = fwd(i, j, k+1, imz) - fwd(i, j, k, imz)
12897  ddw = w(i, j, k+1, ivz) - w(i, j, k, ivz)
12898  dis2d = dis2d + ddw*fsd
12899  ddwd = dis2*fsd
12900  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + ddwd
12901  wd(i, j, k, ivz) = wd(i, j, k, ivz) - ddwd
12902  fsd = fwd(i, j, k+1, imy) - fwd(i, j, k, imy)
12903  ddw = w(i, j, k+1, ivy) - w(i, j, k, ivy)
12904  dis2d = dis2d + ddw*fsd
12905  ddwd = dis2*fsd
12906  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + ddwd
12907  wd(i, j, k, ivy) = wd(i, j, k, ivy) - ddwd
12908  fsd = fwd(i, j, k+1, imx) - fwd(i, j, k, imx)
12909  ddw = w(i, j, k+1, ivx) - w(i, j, k, ivx)
12910  dis2d = dis2d + ddw*fsd
12911  ddwd = dis2*fsd
12912  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + ddwd
12913  wd(i, j, k, ivx) = wd(i, j, k, ivx) - ddwd
12914  fsd = fwd(i, j, k+1, irho) - fwd(i, j, k, irho)
12915  ddw = w(i, j, k+1, irho) - w(i, j, k, irho)
12916  dis2d = dis2d + ddw*fsd
12917  ddwd = dis2*fsd
12918  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + ddwd
12919  wd(i, j, k, irho) = wd(i, j, k, irho) - ddwd
12920  rradd = (min3*fis2+sigma*fis4)*dis2d
12921  min3d = rrad*fis2*dis2d
12922  call popcontrol1b(branch)
12923  if (branch .eq. 0) then
12924  call popreal8(min3)
12925  y3d = min3d
12926  else
12927  call popreal8(min3)
12928  y3d = 0.0_8
12929  end if
12930  call popcontrol1b(branch)
12931  if (branch .eq. 0) then
12932  dss2d = dss2d + y3d
12933  dss1d = 0.0_8
12934  else
12935  dss1d = y3d
12936  end if
12937  radkd(i, j, k) = radkd(i, j, k) + ppor*rradd
12938  radkd(i, j, k+1) = radkd(i, j, k+1) + ppor*rradd
12939  call popreal8(ppor)
12940  call popcontrol1b(branch)
12941  if (branch .eq. 0) then
12942  x6d = dss2d
12943  else
12944  x6d = -dss2d
12945  end if
12946  temp0 = shocksensor(i, j, k+2) + two*shocksensor(i, j, k+1) &
12947 & + shocksensor(i, j, k) + sslim
12948  sslimd = sslimd - (shocksensor(i, j, k+2)-two*shocksensor(i&
12949 & , j, k+1)+shocksensor(i, j, k))*x6d/temp0**2
12950  end do
12951  call popcontrol1b(branch)
12952  if (branch .eq. 0) then
12953  x5d = dss1d
12954  else
12955  x5d = -dss1d
12956  end if
12957  temp0 = shocksensor(i, j, 2) + two*shocksensor(i, j, 1) + &
12958 & shocksensor(i, j, 0) + sslim
12959  sslimd = sslimd - (shocksensor(i, j, 2)-two*shocksensor(i, j, &
12960 & 1)+shocksensor(i, j, 0))*x5d/temp0**2
12961  end do
12962  end do
12963  if (associated(radjd)) radjd = 0.0_8
12964  do k=kl,2,-1
12965  do i=il,2,-1
12966  dss1d = 0.0_8
12967  do j=jl,1,-1
12968  dss2d = dss1d
12969  fsd = fwd(i, j+1, k, irhoe) - fwd(i, j, k, irhoe)
12970  ddw = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
12971  rrad = ppor*(radj(i, j, k)+radj(i, j+1, k))
12972  dis2 = fis2*rrad*min2 + sigma*fis4*rrad
12973  dis2d = ddw*fsd
12974  ddwd = dis2*fsd
12975  wd(i, j+1, k, irhoe) = wd(i, j+1, k, irhoe) + ddwd
12976  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddwd
12977  fsd = fwd(i, j+1, k, imz) - fwd(i, j, k, imz)
12978  ddw = w(i, j+1, k, ivz) - w(i, j, k, ivz)
12979  dis2d = dis2d + ddw*fsd
12980  ddwd = dis2*fsd
12981  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + ddwd
12982  wd(i, j, k, ivz) = wd(i, j, k, ivz) - ddwd
12983  fsd = fwd(i, j+1, k, imy) - fwd(i, j, k, imy)
12984  ddw = w(i, j+1, k, ivy) - w(i, j, k, ivy)
12985  dis2d = dis2d + ddw*fsd
12986  ddwd = dis2*fsd
12987  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + ddwd
12988  wd(i, j, k, ivy) = wd(i, j, k, ivy) - ddwd
12989  fsd = fwd(i, j+1, k, imx) - fwd(i, j, k, imx)
12990  ddw = w(i, j+1, k, ivx) - w(i, j, k, ivx)
12991  dis2d = dis2d + ddw*fsd
12992  ddwd = dis2*fsd
12993  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + ddwd
12994  wd(i, j, k, ivx) = wd(i, j, k, ivx) - ddwd
12995  fsd = fwd(i, j+1, k, irho) - fwd(i, j, k, irho)
12996  ddw = w(i, j+1, k, irho) - w(i, j, k, irho)
12997  dis2d = dis2d + ddw*fsd
12998  ddwd = dis2*fsd
12999  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + ddwd
13000  wd(i, j, k, irho) = wd(i, j, k, irho) - ddwd
13001  rradd = (min2*fis2+sigma*fis4)*dis2d
13002  min2d = rrad*fis2*dis2d
13003  call popcontrol1b(branch)
13004  if (branch .eq. 0) then
13005  call popreal8(min2)
13006  y2d = min2d
13007  else
13008  call popreal8(min2)
13009  y2d = 0.0_8
13010  end if
13011  call popcontrol1b(branch)
13012  if (branch .eq. 0) then
13013  dss2d = dss2d + y2d
13014  dss1d = 0.0_8
13015  else
13016  dss1d = y2d
13017  end if
13018  radjd(i, j, k) = radjd(i, j, k) + ppor*rradd
13019  radjd(i, j+1, k) = radjd(i, j+1, k) + ppor*rradd
13020  call popreal8(ppor)
13021  call popcontrol1b(branch)
13022  if (branch .eq. 0) then
13023  x4d = dss2d
13024  else
13025  x4d = -dss2d
13026  end if
13027  temp0 = shocksensor(i, j+2, k) + two*shocksensor(i, j+1, k) &
13028 & + shocksensor(i, j, k) + sslim
13029  sslimd = sslimd - (shocksensor(i, j+2, k)-two*shocksensor(i&
13030 & , j+1, k)+shocksensor(i, j, k))*x4d/temp0**2
13031  end do
13032  call popcontrol1b(branch)
13033  if (branch .eq. 0) then
13034  x3d = dss1d
13035  else
13036  x3d = -dss1d
13037  end if
13038  temp0 = shocksensor(i, 2, k) + two*shocksensor(i, 1, k) + &
13039 & shocksensor(i, 0, k) + sslim
13040  sslimd = sslimd - (shocksensor(i, 2, k)-two*shocksensor(i, 1, &
13041 & k)+shocksensor(i, 0, k))*x3d/temp0**2
13042  end do
13043  end do
13044  if (associated(radid)) radid = 0.0_8
13045  do k=kl,2,-1
13046  do j=jl,2,-1
13047  dss1d = 0.0_8
13048  do i=il,1,-1
13049  dss2d = dss1d
13050  fsd = fwd(i+1, j, k, irhoe) - fwd(i, j, k, irhoe)
13051  ddw = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
13052  rrad = ppor*(radi(i, j, k)+radi(i+1, j, k))
13053  dis2 = fis2*rrad*min1 + sigma*fis4*rrad
13054  dis2d = ddw*fsd
13055  ddwd = dis2*fsd
13056  wd(i+1, j, k, irhoe) = wd(i+1, j, k, irhoe) + ddwd
13057  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddwd
13058  fsd = fwd(i+1, j, k, imz) - fwd(i, j, k, imz)
13059  ddw = w(i+1, j, k, ivz) - w(i, j, k, ivz)
13060  dis2d = dis2d + ddw*fsd
13061  ddwd = dis2*fsd
13062  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + ddwd
13063  wd(i, j, k, ivz) = wd(i, j, k, ivz) - ddwd
13064  fsd = fwd(i+1, j, k, imy) - fwd(i, j, k, imy)
13065  ddw = w(i+1, j, k, ivy) - w(i, j, k, ivy)
13066  dis2d = dis2d + ddw*fsd
13067  ddwd = dis2*fsd
13068  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + ddwd
13069  wd(i, j, k, ivy) = wd(i, j, k, ivy) - ddwd
13070  fsd = fwd(i+1, j, k, imx) - fwd(i, j, k, imx)
13071  ddw = w(i+1, j, k, ivx) - w(i, j, k, ivx)
13072  dis2d = dis2d + ddw*fsd
13073  ddwd = dis2*fsd
13074  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + ddwd
13075  wd(i, j, k, ivx) = wd(i, j, k, ivx) - ddwd
13076  fsd = fwd(i+1, j, k, irho) - fwd(i, j, k, irho)
13077  ddw = w(i+1, j, k, irho) - w(i, j, k, irho)
13078  dis2d = dis2d + ddw*fsd
13079  ddwd = dis2*fsd
13080  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + ddwd
13081  wd(i, j, k, irho) = wd(i, j, k, irho) - ddwd
13082  rradd = (min1*fis2+sigma*fis4)*dis2d
13083  min1d = rrad*fis2*dis2d
13084  call popcontrol1b(branch)
13085  if (branch .eq. 0) then
13086  call popreal8(min1)
13087  y1d = min1d
13088  else
13089  call popreal8(min1)
13090  y1d = 0.0_8
13091  end if
13092  call popcontrol1b(branch)
13093  if (branch .eq. 0) then
13094  dss2d = dss2d + y1d
13095  dss1d = 0.0_8
13096  else
13097  dss1d = y1d
13098  end if
13099  radid(i, j, k) = radid(i, j, k) + ppor*rradd
13100  radid(i+1, j, k) = radid(i+1, j, k) + ppor*rradd
13101  call popreal8(ppor)
13102  call popcontrol1b(branch)
13103  if (branch .eq. 0) then
13104  x2d = dss2d
13105  else
13106  x2d = -dss2d
13107  end if
13108  temp0 = shocksensor(i+2, j, k) + two*shocksensor(i+1, j, k) &
13109 & + shocksensor(i, j, k) + sslim
13110  sslimd = sslimd - (shocksensor(i+2, j, k)-two*shocksensor(i+&
13111 & 1, j, k)+shocksensor(i, j, k))*x2d/temp0**2
13112  end do
13113  call popcontrol1b(branch)
13114  if (branch .eq. 0) then
13115  x1d = dss1d
13116  else
13117  x1d = -dss1d
13118  end if
13119  temp0 = shocksensor(2, j, k) + two*shocksensor(1, j, k) + &
13120 & shocksensor(0, j, k) + sslim
13121  sslimd = sslimd - (shocksensor(2, j, k)-two*shocksensor(1, j, &
13122 & k)+shocksensor(0, j, k))*x1d/temp0**2
13123  end do
13124  end do
13125  do k=kl,2,-1
13126  do j=jl,2,-1
13127  do i=il,2,-1
13128  fwd(i, j, k, irhoe) = sfil*fwd(i, j, k, irhoe)
13129  fwd(i, j, k, imz) = sfil*fwd(i, j, k, imz)
13130  fwd(i, j, k, imy) = sfil*fwd(i, j, k, imy)
13131  fwd(i, j, k, imx) = sfil*fwd(i, j, k, imx)
13132  fwd(i, j, k, irho) = sfil*fwd(i, j, k, irho)
13133  end do
13134  end do
13135  end do
13136  do k=kl,2,-1
13137  do i=il,2,-1
13138  call popreal8(w(i, jb, k, irhoe))
13139  pd(i, jb, k) = pd(i, jb, k) + wd(i, jb, k, irhoe)
13140  call popreal8(w(i, jb, k, ivz))
13141  tmpd25 = wd(i, jb, k, ivz)
13142  wd(i, jb, k, ivz) = 0.0_8
13143  wd(i, jb, k, irho) = wd(i, jb, k, irho) + w(i, jb, k, ivz)*&
13144 & tmpd25
13145  wd(i, jb, k, ivz) = wd(i, jb, k, ivz) + w(i, jb, k, irho)*&
13146 & tmpd25
13147  call popreal8(w(i, jb, k, ivy))
13148  tmpd24 = wd(i, jb, k, ivy)
13149  wd(i, jb, k, ivy) = 0.0_8
13150  wd(i, jb, k, irho) = wd(i, jb, k, irho) + w(i, jb, k, ivy)*&
13151 & tmpd24
13152  wd(i, jb, k, ivy) = wd(i, jb, k, ivy) + w(i, jb, k, irho)*&
13153 & tmpd24
13154  call popreal8(w(i, jb, k, ivx))
13155  tmpd23 = wd(i, jb, k, ivx)
13156  wd(i, jb, k, ivx) = 0.0_8
13157  wd(i, jb, k, irho) = wd(i, jb, k, irho) + w(i, jb, k, ivx)*&
13158 & tmpd23
13159  wd(i, jb, k, ivx) = wd(i, jb, k, ivx) + w(i, jb, k, irho)*&
13160 & tmpd23
13161  call popreal8(w(i, je, k, irhoe))
13162  pd(i, je, k) = pd(i, je, k) + wd(i, je, k, irhoe)
13163  call popreal8(w(i, je, k, ivz))
13164  tmpd22 = wd(i, je, k, ivz)
13165  wd(i, je, k, ivz) = 0.0_8
13166  wd(i, je, k, irho) = wd(i, je, k, irho) + w(i, je, k, ivz)*&
13167 & tmpd22
13168  wd(i, je, k, ivz) = wd(i, je, k, ivz) + w(i, je, k, irho)*&
13169 & tmpd22
13170  call popreal8(w(i, je, k, ivy))
13171  tmpd21 = wd(i, je, k, ivy)
13172  wd(i, je, k, ivy) = 0.0_8
13173  wd(i, je, k, irho) = wd(i, je, k, irho) + w(i, je, k, ivy)*&
13174 & tmpd21
13175  wd(i, je, k, ivy) = wd(i, je, k, ivy) + w(i, je, k, irho)*&
13176 & tmpd21
13177  call popreal8(w(i, je, k, ivx))
13178  tmpd20 = wd(i, je, k, ivx)
13179  wd(i, je, k, ivx) = 0.0_8
13180  wd(i, je, k, irho) = wd(i, je, k, irho) + w(i, je, k, ivx)*&
13181 & tmpd20
13182  wd(i, je, k, ivx) = wd(i, je, k, ivx) + w(i, je, k, irho)*&
13183 & tmpd20
13184  call popreal8(w(i, 1, k, irhoe))
13185  pd(i, 1, k) = pd(i, 1, k) + wd(i, 1, k, irhoe)
13186  call popreal8(w(i, 1, k, ivz))
13187  tmpd19 = wd(i, 1, k, ivz)
13188  wd(i, 1, k, ivz) = 0.0_8
13189  wd(i, 1, k, irho) = wd(i, 1, k, irho) + w(i, 1, k, ivz)*tmpd19
13190  wd(i, 1, k, ivz) = wd(i, 1, k, ivz) + w(i, 1, k, irho)*tmpd19
13191  call popreal8(w(i, 1, k, ivy))
13192  tmpd18 = wd(i, 1, k, ivy)
13193  wd(i, 1, k, ivy) = 0.0_8
13194  wd(i, 1, k, irho) = wd(i, 1, k, irho) + w(i, 1, k, ivy)*tmpd18
13195  wd(i, 1, k, ivy) = wd(i, 1, k, ivy) + w(i, 1, k, irho)*tmpd18
13196  call popreal8(w(i, 1, k, ivx))
13197  tmpd17 = wd(i, 1, k, ivx)
13198  wd(i, 1, k, ivx) = 0.0_8
13199  wd(i, 1, k, irho) = wd(i, 1, k, irho) + w(i, 1, k, ivx)*tmpd17
13200  wd(i, 1, k, ivx) = wd(i, 1, k, ivx) + w(i, 1, k, irho)*tmpd17
13201  call popreal8(w(i, 0, k, irhoe))
13202  pd(i, 0, k) = pd(i, 0, k) + wd(i, 0, k, irhoe)
13203  call popreal8(w(i, 0, k, ivz))
13204  tmpd16 = wd(i, 0, k, ivz)
13205  wd(i, 0, k, ivz) = 0.0_8
13206  wd(i, 0, k, irho) = wd(i, 0, k, irho) + w(i, 0, k, ivz)*tmpd16
13207  wd(i, 0, k, ivz) = wd(i, 0, k, ivz) + w(i, 0, k, irho)*tmpd16
13208  call popreal8(w(i, 0, k, ivy))
13209  tmpd15 = wd(i, 0, k, ivy)
13210  wd(i, 0, k, ivy) = 0.0_8
13211  wd(i, 0, k, irho) = wd(i, 0, k, irho) + w(i, 0, k, ivy)*tmpd15
13212  wd(i, 0, k, ivy) = wd(i, 0, k, ivy) + w(i, 0, k, irho)*tmpd15
13213  call popreal8(w(i, 0, k, ivx))
13214  tmpd14 = wd(i, 0, k, ivx)
13215  wd(i, 0, k, ivx) = 0.0_8
13216  wd(i, 0, k, irho) = wd(i, 0, k, irho) + w(i, 0, k, ivx)*tmpd14
13217  wd(i, 0, k, ivx) = wd(i, 0, k, ivx) + w(i, 0, k, irho)*tmpd14
13218  end do
13219  end do
13220  do k=kl,2,-1
13221  do j=jl,2,-1
13222  call popreal8(w(ib, j, k, irhoe))
13223  pd(ib, j, k) = pd(ib, j, k) + wd(ib, j, k, irhoe)
13224  call popreal8(w(ib, j, k, ivz))
13225  tmpd13 = wd(ib, j, k, ivz)
13226  wd(ib, j, k, ivz) = 0.0_8
13227  wd(ib, j, k, irho) = wd(ib, j, k, irho) + w(ib, j, k, ivz)*&
13228 & tmpd13
13229  wd(ib, j, k, ivz) = wd(ib, j, k, ivz) + w(ib, j, k, irho)*&
13230 & tmpd13
13231  call popreal8(w(ib, j, k, ivy))
13232  tmpd12 = wd(ib, j, k, ivy)
13233  wd(ib, j, k, ivy) = 0.0_8
13234  wd(ib, j, k, irho) = wd(ib, j, k, irho) + w(ib, j, k, ivy)*&
13235 & tmpd12
13236  wd(ib, j, k, ivy) = wd(ib, j, k, ivy) + w(ib, j, k, irho)*&
13237 & tmpd12
13238  call popreal8(w(ib, j, k, ivx))
13239  tmpd11 = wd(ib, j, k, ivx)
13240  wd(ib, j, k, ivx) = 0.0_8
13241  wd(ib, j, k, irho) = wd(ib, j, k, irho) + w(ib, j, k, ivx)*&
13242 & tmpd11
13243  wd(ib, j, k, ivx) = wd(ib, j, k, ivx) + w(ib, j, k, irho)*&
13244 & tmpd11
13245  call popreal8(w(ie, j, k, irhoe))
13246  pd(ie, j, k) = pd(ie, j, k) + wd(ie, j, k, irhoe)
13247  call popreal8(w(ie, j, k, ivz))
13248  tmpd10 = wd(ie, j, k, ivz)
13249  wd(ie, j, k, ivz) = 0.0_8
13250  wd(ie, j, k, irho) = wd(ie, j, k, irho) + w(ie, j, k, ivz)*&
13251 & tmpd10
13252  wd(ie, j, k, ivz) = wd(ie, j, k, ivz) + w(ie, j, k, irho)*&
13253 & tmpd10
13254  call popreal8(w(ie, j, k, ivy))
13255  tmpd9 = wd(ie, j, k, ivy)
13256  wd(ie, j, k, ivy) = 0.0_8
13257  wd(ie, j, k, irho) = wd(ie, j, k, irho) + w(ie, j, k, ivy)*&
13258 & tmpd9
13259  wd(ie, j, k, ivy) = wd(ie, j, k, ivy) + w(ie, j, k, irho)*&
13260 & tmpd9
13261  call popreal8(w(ie, j, k, ivx))
13262  tmpd8 = wd(ie, j, k, ivx)
13263  wd(ie, j, k, ivx) = 0.0_8
13264  wd(ie, j, k, irho) = wd(ie, j, k, irho) + w(ie, j, k, ivx)*&
13265 & tmpd8
13266  wd(ie, j, k, ivx) = wd(ie, j, k, ivx) + w(ie, j, k, irho)*&
13267 & tmpd8
13268  call popreal8(w(1, j, k, irhoe))
13269  pd(1, j, k) = pd(1, j, k) + wd(1, j, k, irhoe)
13270  call popreal8(w(1, j, k, ivz))
13271  tmpd7 = wd(1, j, k, ivz)
13272  wd(1, j, k, ivz) = 0.0_8
13273  wd(1, j, k, irho) = wd(1, j, k, irho) + w(1, j, k, ivz)*tmpd7
13274  wd(1, j, k, ivz) = wd(1, j, k, ivz) + w(1, j, k, irho)*tmpd7
13275  call popreal8(w(1, j, k, ivy))
13276  tmpd6 = wd(1, j, k, ivy)
13277  wd(1, j, k, ivy) = 0.0_8
13278  wd(1, j, k, irho) = wd(1, j, k, irho) + w(1, j, k, ivy)*tmpd6
13279  wd(1, j, k, ivy) = wd(1, j, k, ivy) + w(1, j, k, irho)*tmpd6
13280  call popreal8(w(1, j, k, ivx))
13281  tmpd5 = wd(1, j, k, ivx)
13282  wd(1, j, k, ivx) = 0.0_8
13283  wd(1, j, k, irho) = wd(1, j, k, irho) + w(1, j, k, ivx)*tmpd5
13284  wd(1, j, k, ivx) = wd(1, j, k, ivx) + w(1, j, k, irho)*tmpd5
13285  call popreal8(w(0, j, k, irhoe))
13286  pd(0, j, k) = pd(0, j, k) + wd(0, j, k, irhoe)
13287  call popreal8(w(0, j, k, ivz))
13288  tmpd4 = wd(0, j, k, ivz)
13289  wd(0, j, k, ivz) = 0.0_8
13290  wd(0, j, k, irho) = wd(0, j, k, irho) + w(0, j, k, ivz)*tmpd4
13291  wd(0, j, k, ivz) = wd(0, j, k, ivz) + w(0, j, k, irho)*tmpd4
13292  call popreal8(w(0, j, k, ivy))
13293  tmpd3 = wd(0, j, k, ivy)
13294  wd(0, j, k, ivy) = 0.0_8
13295  wd(0, j, k, irho) = wd(0, j, k, irho) + w(0, j, k, ivy)*tmpd3
13296  wd(0, j, k, ivy) = wd(0, j, k, ivy) + w(0, j, k, irho)*tmpd3
13297  call popreal8(w(0, j, k, ivx))
13298  tmpd2 = wd(0, j, k, ivx)
13299  wd(0, j, k, ivx) = 0.0_8
13300  wd(0, j, k, irho) = wd(0, j, k, irho) + w(0, j, k, ivx)*tmpd2
13301  wd(0, j, k, ivx) = wd(0, j, k, ivx) + w(0, j, k, irho)*tmpd2
13302  end do
13303  end do
13304  do k=kb,0,-1
13305  do j=jl,2,-1
13306  do i=il,2,-1
13307  call popreal8(w(i, j, k, irhoe))
13308  pd(i, j, k) = pd(i, j, k) + wd(i, j, k, irhoe)
13309  call popreal8(w(i, j, k, ivz))
13310  tmpd1 = wd(i, j, k, ivz)
13311  wd(i, j, k, ivz) = 0.0_8
13312  wd(i, j, k, irho) = wd(i, j, k, irho) + w(i, j, k, ivz)*&
13313 & tmpd1
13314  wd(i, j, k, ivz) = wd(i, j, k, ivz) + w(i, j, k, irho)*tmpd1
13315  call popreal8(w(i, j, k, ivy))
13316  tmpd0 = wd(i, j, k, ivy)
13317  wd(i, j, k, ivy) = 0.0_8
13318  wd(i, j, k, irho) = wd(i, j, k, irho) + w(i, j, k, ivy)*&
13319 & tmpd0
13320  wd(i, j, k, ivy) = wd(i, j, k, ivy) + w(i, j, k, irho)*tmpd0
13321  call popreal8(w(i, j, k, ivx))
13322  tmpd = wd(i, j, k, ivx)
13323  wd(i, j, k, ivx) = 0.0_8
13324  wd(i, j, k, irho) = wd(i, j, k, irho) + w(i, j, k, ivx)*tmpd
13325  wd(i, j, k, ivx) = wd(i, j, k, ivx) + w(i, j, k, irho)*tmpd
13326  end do
13327  end do
13328  end do
13329  call popcontrol2b(branch)
13330  if (branch .eq. 0) then
13331  rhoinfd = 0.0_8
13332  pinfcorrd = 0.0_8
13333  else if (branch .eq. 1) then
13334  pinfcorrd = 0.001_realtype*sslimd
13335  rhoinfd = 0.0_8
13336  else
13337  temp = rhoinf**gammainf
13338  tempd = 0.001_realtype*sslimd/temp
13339  pinfcorrd = tempd
13340  if (rhoinf .le. 0.0_8 .and. (gammainf .eq. 0.0_8 .or. gammainf &
13341 & .ne. int(gammainf))) then
13342  rhoinfd = 0.0_8
13343  else
13344  rhoinfd = -(gammainf*rhoinf**(gammainf-1)*pinfcorr*tempd/temp)
13345  end if
13346  end if
13347  end if
13348  end subroutine invisciddissfluxscalarapprox_b
13349 
13351 !
13352 ! invisciddissfluxscalar computes the scalar artificial
13353 ! dissipation, see aiaa paper 81-1259, for a given block.
13354 ! therefore it is assumed that the pointers in blockpointers
13355 ! already point to the correct block.
13356 !
13357  use blockpointers
13358  use cgnsgrid
13359  use constants
13360  use flowvarrefstate
13364  use inputphysics
13365  use iteration
13366  implicit none
13367 !
13368 ! local parameter.
13369 !
13370  real(kind=realtype), parameter :: dssmax=0.25_realtype
13371 !
13372 ! local variables.
13373 !
13374  integer(kind=inttype) :: i, j, k, ind
13375  real(kind=realtype) :: sslim, rhoi
13376  real(kind=realtype) :: sfil, fis2, fis4
13377  real(kind=realtype) :: ppor, rrad, dis2
13378  real(kind=realtype) :: dss1, dss2, ddw, fs
13379  intrinsic abs
13380  intrinsic log10
13381  intrinsic exp
13382  intrinsic max
13383  intrinsic min
13384  real(kind=realtype) :: x1
13385  real(kind=realtype) :: x2
13386  real(kind=realtype) :: y1
13387  real(kind=realtype) :: x3
13388  real(kind=realtype) :: x4
13389  real(kind=realtype) :: y2
13390  real(kind=realtype) :: x5
13391  real(kind=realtype) :: x6
13392  real(kind=realtype) :: y3
13393  real(kind=realtype) :: abs0
13394  real(kind=realtype) :: min1
13395  real(kind=realtype) :: min2
13396  real(kind=realtype) :: min3
13397  if (rfil .ge. 0.) then
13398  abs0 = rfil
13399  else
13400  abs0 = -rfil
13401  end if
13402 ! check if rfil == 0. if so, the dissipative flux needs not to
13403 ! be computed.
13404  if (abs0 .lt. thresholdreal) then
13405  return
13406  else
13407 ! determine the variables used to compute the switch.
13408 ! for the inviscid case this is the pressure; for the viscous
13409 ! case it is the entropy.
13410  select case (equations)
13411  case (eulerequations)
13412 ! inviscid case. pressure switch is based on the pressure.
13413 ! also set the value of sslim. to be fully consistent this
13414 ! must have the dimension of pressure and it is therefore
13415 ! set to a fraction of the free stream value.
13416  sslim = 0.001_realtype*pinfcorr
13417 !===============================================================
13418  case (nsequations, ransequations)
13419 ! viscous case. pressure switch is based on the entropy.
13420 ! also set the value of sslim. to be fully consistent this
13421 ! must have the dimension of entropy and it is therefore
13422 ! set to a fraction of the free stream value.
13423  sslim = 0.001_realtype*pinfcorr/rhoinf**gammainf
13424  end select
13425 ! set the dissipation constants for the scheme.
13426 ! rfil and sfil are fractions used by the runge-kutta solver to compute residuals at intermediate steps.
13427 ! this means that fis2 and fis4 will be some fraction of vis2 and vis4, respectively.
13428 ! for other solvers, rfil==1, sfil==0, fis2==vis2, and fis4==vis4.
13429 ! the sigmoid function used for dissipation-based continuation is described in eq. 28 and eq. 29 from the paper:
13430 ! "improving the performance of a compressible rans solver for low and high mach number flows" (seraj2022c).
13431 ! the options documentation also has information on the parameters in this formulation.
13432  if (usedisscontinuation) then
13433  fis2 = rfil*(vis2+disscontmagnitude/(1+exp(-(disscontsharpness*(&
13434 & log10(totalr/totalr0)+disscontmidpoint)))))
13435  else
13436  fis2 = rfil*vis2
13437  end if
13438  fis4 = rfil*vis4
13439  sfil = one - rfil
13440 ! replace the total energy by rho times the total enthalpy.
13441 ! in this way the numerical solution is total enthalpy preserving
13442 ! for the steady euler equations. also replace the velocities by
13443 ! the momentum. only done for the entries used in the
13444 ! discretization, i.e. ignore the corner halo's.
13445  do k=0,kb
13446  do j=2,jl
13447  do i=2,il
13448  w(i, j, k, ivx) = w(i, j, k, irho)*w(i, j, k, ivx)
13449  w(i, j, k, ivy) = w(i, j, k, irho)*w(i, j, k, ivy)
13450  w(i, j, k, ivz) = w(i, j, k, irho)*w(i, j, k, ivz)
13451  w(i, j, k, irhoe) = w(i, j, k, irhoe) + p(i, j, k)
13452  end do
13453  end do
13454  end do
13455  do k=2,kl
13456  do j=2,jl
13457  w(0, j, k, ivx) = w(0, j, k, irho)*w(0, j, k, ivx)
13458  w(0, j, k, ivy) = w(0, j, k, irho)*w(0, j, k, ivy)
13459  w(0, j, k, ivz) = w(0, j, k, irho)*w(0, j, k, ivz)
13460  w(0, j, k, irhoe) = w(0, j, k, irhoe) + p(0, j, k)
13461  w(1, j, k, ivx) = w(1, j, k, irho)*w(1, j, k, ivx)
13462  w(1, j, k, ivy) = w(1, j, k, irho)*w(1, j, k, ivy)
13463  w(1, j, k, ivz) = w(1, j, k, irho)*w(1, j, k, ivz)
13464  w(1, j, k, irhoe) = w(1, j, k, irhoe) + p(1, j, k)
13465  w(ie, j, k, ivx) = w(ie, j, k, irho)*w(ie, j, k, ivx)
13466  w(ie, j, k, ivy) = w(ie, j, k, irho)*w(ie, j, k, ivy)
13467  w(ie, j, k, ivz) = w(ie, j, k, irho)*w(ie, j, k, ivz)
13468  w(ie, j, k, irhoe) = w(ie, j, k, irhoe) + p(ie, j, k)
13469  w(ib, j, k, ivx) = w(ib, j, k, irho)*w(ib, j, k, ivx)
13470  w(ib, j, k, ivy) = w(ib, j, k, irho)*w(ib, j, k, ivy)
13471  w(ib, j, k, ivz) = w(ib, j, k, irho)*w(ib, j, k, ivz)
13472  w(ib, j, k, irhoe) = w(ib, j, k, irhoe) + p(ib, j, k)
13473  end do
13474  end do
13475  do k=2,kl
13476  do i=2,il
13477  w(i, 0, k, ivx) = w(i, 0, k, irho)*w(i, 0, k, ivx)
13478  w(i, 0, k, ivy) = w(i, 0, k, irho)*w(i, 0, k, ivy)
13479  w(i, 0, k, ivz) = w(i, 0, k, irho)*w(i, 0, k, ivz)
13480  w(i, 0, k, irhoe) = w(i, 0, k, irhoe) + p(i, 0, k)
13481  w(i, 1, k, ivx) = w(i, 1, k, irho)*w(i, 1, k, ivx)
13482  w(i, 1, k, ivy) = w(i, 1, k, irho)*w(i, 1, k, ivy)
13483  w(i, 1, k, ivz) = w(i, 1, k, irho)*w(i, 1, k, ivz)
13484  w(i, 1, k, irhoe) = w(i, 1, k, irhoe) + p(i, 1, k)
13485  w(i, je, k, ivx) = w(i, je, k, irho)*w(i, je, k, ivx)
13486  w(i, je, k, ivy) = w(i, je, k, irho)*w(i, je, k, ivy)
13487  w(i, je, k, ivz) = w(i, je, k, irho)*w(i, je, k, ivz)
13488  w(i, je, k, irhoe) = w(i, je, k, irhoe) + p(i, je, k)
13489  w(i, jb, k, ivx) = w(i, jb, k, irho)*w(i, jb, k, ivx)
13490  w(i, jb, k, ivy) = w(i, jb, k, irho)*w(i, jb, k, ivy)
13491  w(i, jb, k, ivz) = w(i, jb, k, irho)*w(i, jb, k, ivz)
13492  w(i, jb, k, irhoe) = w(i, jb, k, irhoe) + p(i, jb, k)
13493  end do
13494  end do
13495 ! initialize the dissipative residual to a certain times,
13496 ! possibly zero, the previously stored value. owned cells
13497 ! only, because the halo values do not matter.
13498  do k=2,kl
13499  do j=2,jl
13500  do i=2,il
13501  fw(i, j, k, irho) = sfil*fw(i, j, k, irho)
13502  fw(i, j, k, imx) = sfil*fw(i, j, k, imx)
13503  fw(i, j, k, imy) = sfil*fw(i, j, k, imy)
13504  fw(i, j, k, imz) = sfil*fw(i, j, k, imz)
13505  fw(i, j, k, irhoe) = sfil*fw(i, j, k, irhoe)
13506  end do
13507  end do
13508  end do
13509 !
13510 ! dissipative fluxes in the i-direction.
13511 !
13512  do k=2,kl
13513  do j=2,jl
13514  x1 = (shocksensor(2, j, k)-two*shocksensor(1, j, k)+&
13515 & shocksensor(0, j, k))/(shocksensor(2, j, k)+two*shocksensor(&
13516 & 1, j, k)+shocksensor(0, j, k)+sslim)
13517  if (x1 .ge. 0.) then
13518  dss1 = x1
13519  else
13520  dss1 = -x1
13521  end if
13522 ! loop in i-direction.
13523  do i=1,il
13524  x2 = (shocksensor(i+2, j, k)-two*shocksensor(i+1, j, k)+&
13525 & shocksensor(i, j, k))/(shocksensor(i+2, j, k)+two*&
13526 & shocksensor(i+1, j, k)+shocksensor(i, j, k)+sslim)
13527  if (x2 .ge. 0.) then
13528  dss2 = x2
13529  else
13530  dss2 = -x2
13531  end if
13532 ! compute the dissipation coefficients for this face.
13533  ppor = zero
13534  if (pori(i, j, k) .eq. normalflux) ppor = half
13535  rrad = ppor*(radi(i, j, k)+radi(i+1, j, k))
13536  if (dss1 .lt. dss2) then
13537  y1 = dss2
13538  else
13539  y1 = dss1
13540  end if
13541  if (dssmax .gt. y1) then
13542  min1 = y1
13543  else
13544  min1 = dssmax
13545  end if
13546 ! modification for fd preconditioner note: this lumping
13547 ! actually still results in a greater than 3 cell stencil
13548 ! in any direction. since this seems to work slightly
13549 ! better than the dis2=sigma*fis4*rrad, we will just use
13550 ! a 5-cell stencil for doing the pc
13551  dis2 = fis2*rrad*min1 + sigma*fis4*rrad
13552 ! compute and scatter the dissipative flux.
13553 ! density. store it in the mass flow of the
13554 ! appropriate sliding mesh interface.
13555  ddw = w(i+1, j, k, irho) - w(i, j, k, irho)
13556  fs = dis2*ddw
13557  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
13558  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
13559 ! x-momentum.
13560  ddw = w(i+1, j, k, ivx) - w(i, j, k, ivx)
13561  fs = dis2*ddw
13562  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
13563  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
13564 ! y-momentum.
13565  ddw = w(i+1, j, k, ivy) - w(i, j, k, ivy)
13566  fs = dis2*ddw
13567  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
13568  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
13569 ! z-momentum.
13570  ddw = w(i+1, j, k, ivz) - w(i, j, k, ivz)
13571  fs = dis2*ddw
13572  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
13573  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
13574 ! energy.
13575  ddw = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
13576  fs = dis2*ddw
13577  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
13578  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
13579 ! set dss1 to dss2 for the next face.
13580  dss1 = dss2
13581  end do
13582  end do
13583  end do
13584 !
13585 ! dissipative fluxes in the j-direction.
13586 !
13587  do k=2,kl
13588  do i=2,il
13589  x3 = (shocksensor(i, 2, k)-two*shocksensor(i, 1, k)+&
13590 & shocksensor(i, 0, k))/(shocksensor(i, 2, k)+two*shocksensor(&
13591 & i, 1, k)+shocksensor(i, 0, k)+sslim)
13592  if (x3 .ge. 0.) then
13593  dss1 = x3
13594  else
13595  dss1 = -x3
13596  end if
13597 ! loop in j-direction.
13598  do j=1,jl
13599  x4 = (shocksensor(i, j+2, k)-two*shocksensor(i, j+1, k)+&
13600 & shocksensor(i, j, k))/(shocksensor(i, j+2, k)+two*&
13601 & shocksensor(i, j+1, k)+shocksensor(i, j, k)+sslim)
13602  if (x4 .ge. 0.) then
13603  dss2 = x4
13604  else
13605  dss2 = -x4
13606  end if
13607 ! compute the dissipation coefficients for this face.
13608  ppor = zero
13609  if (porj(i, j, k) .eq. normalflux) ppor = half
13610  rrad = ppor*(radj(i, j, k)+radj(i, j+1, k))
13611  if (dss1 .lt. dss2) then
13612  y2 = dss2
13613  else
13614  y2 = dss1
13615  end if
13616  if (dssmax .gt. y2) then
13617  min2 = y2
13618  else
13619  min2 = dssmax
13620  end if
13621 ! modification for fd preconditioner
13622  dis2 = fis2*rrad*min2 + sigma*fis4*rrad
13623 ! compute and scatter the dissipative flux.
13624 ! density. store it in the mass flow of the
13625 ! appropriate sliding mesh interface.
13626  ddw = w(i, j+1, k, irho) - w(i, j, k, irho)
13627  fs = dis2*ddw
13628  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
13629  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
13630 ! x-momentum.
13631  ddw = w(i, j+1, k, ivx) - w(i, j, k, ivx)
13632  fs = dis2*ddw
13633  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
13634  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
13635 ! y-momentum.
13636  ddw = w(i, j+1, k, ivy) - w(i, j, k, ivy)
13637  fs = dis2*ddw
13638  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
13639  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
13640 ! z-momentum.
13641  ddw = w(i, j+1, k, ivz) - w(i, j, k, ivz)
13642  fs = dis2*ddw
13643  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
13644  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
13645 ! energy.
13646  ddw = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
13647  fs = dis2*ddw
13648  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
13649  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
13650 ! set dss1 to dss2 for the next face.
13651  dss1 = dss2
13652  end do
13653  end do
13654  end do
13655 !
13656 ! dissipative fluxes in the k-direction.
13657 !
13658  do j=2,jl
13659  do i=2,il
13660  x5 = (shocksensor(i, j, 2)-two*shocksensor(i, j, 1)+&
13661 & shocksensor(i, j, 0))/(shocksensor(i, j, 2)+two*shocksensor(&
13662 & i, j, 1)+shocksensor(i, j, 0)+sslim)
13663  if (x5 .ge. 0.) then
13664  dss1 = x5
13665  else
13666  dss1 = -x5
13667  end if
13668 ! loop in k-direction.
13669  do k=1,kl
13670  x6 = (shocksensor(i, j, k+2)-two*shocksensor(i, j, k+1)+&
13671 & shocksensor(i, j, k))/(shocksensor(i, j, k+2)+two*&
13672 & shocksensor(i, j, k+1)+shocksensor(i, j, k)+sslim)
13673  if (x6 .ge. 0.) then
13674  dss2 = x6
13675  else
13676  dss2 = -x6
13677  end if
13678 ! compute the dissipation coefficients for this face.
13679  ppor = zero
13680  if (pork(i, j, k) .eq. normalflux) ppor = half
13681  rrad = ppor*(radk(i, j, k)+radk(i, j, k+1))
13682  if (dss1 .lt. dss2) then
13683  y3 = dss2
13684  else
13685  y3 = dss1
13686  end if
13687  if (dssmax .gt. y3) then
13688  min3 = y3
13689  else
13690  min3 = dssmax
13691  end if
13692 ! modification for fd preconditioner
13693  dis2 = fis2*rrad*min3 + sigma*fis4*rrad
13694 ! compute and scatter the dissipative flux.
13695 ! density. store it in the mass flow of the
13696 ! appropriate sliding mesh interface.
13697  ddw = w(i, j, k+1, irho) - w(i, j, k, irho)
13698  fs = dis2*ddw
13699  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) + fs
13700  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
13701 ! x-momentum.
13702  ddw = w(i, j, k+1, ivx) - w(i, j, k, ivx)
13703  fs = dis2*ddw
13704  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fs
13705  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
13706 ! y-momentum.
13707  ddw = w(i, j, k+1, ivy) - w(i, j, k, ivy)
13708  fs = dis2*ddw
13709  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fs
13710  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
13711 ! z-momentum.
13712  ddw = w(i, j, k+1, ivz) - w(i, j, k, ivz)
13713  fs = dis2*ddw
13714  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fs
13715  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
13716 ! energy.
13717  ddw = w(i, j, k+1, irhoe) - w(i, j, k, irhoe)
13718  fs = dis2*ddw
13719  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + fs
13720  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
13721 ! set dss1 to dss2 for the next face.
13722  dss1 = dss2
13723  end do
13724  end do
13725  end do
13726 ! replace rho times the total enthalpy by the total energy and
13727 ! store the velocities again instead of the momentum. only for
13728 ! those entries that have been altered, i.e. ignore the
13729 ! corner halo's.
13730  do k=0,kb
13731  do j=2,jl
13732  do i=2,il
13733  rhoi = one/w(i, j, k, irho)
13734  w(i, j, k, ivx) = w(i, j, k, ivx)*rhoi
13735  w(i, j, k, ivy) = w(i, j, k, ivy)*rhoi
13736  w(i, j, k, ivz) = w(i, j, k, ivz)*rhoi
13737  w(i, j, k, irhoe) = w(i, j, k, irhoe) - p(i, j, k)
13738  end do
13739  end do
13740  end do
13741  do k=2,kl
13742  do j=2,jl
13743  rhoi = one/w(0, j, k, irho)
13744  w(0, j, k, ivx) = w(0, j, k, ivx)*rhoi
13745  w(0, j, k, ivy) = w(0, j, k, ivy)*rhoi
13746  w(0, j, k, ivz) = w(0, j, k, ivz)*rhoi
13747  w(0, j, k, irhoe) = w(0, j, k, irhoe) - p(0, j, k)
13748  rhoi = one/w(1, j, k, irho)
13749  w(1, j, k, ivx) = w(1, j, k, ivx)*rhoi
13750  w(1, j, k, ivy) = w(1, j, k, ivy)*rhoi
13751  w(1, j, k, ivz) = w(1, j, k, ivz)*rhoi
13752  w(1, j, k, irhoe) = w(1, j, k, irhoe) - p(1, j, k)
13753  rhoi = one/w(ie, j, k, irho)
13754  w(ie, j, k, ivx) = w(ie, j, k, ivx)*rhoi
13755  w(ie, j, k, ivy) = w(ie, j, k, ivy)*rhoi
13756  w(ie, j, k, ivz) = w(ie, j, k, ivz)*rhoi
13757  w(ie, j, k, irhoe) = w(ie, j, k, irhoe) - p(ie, j, k)
13758  rhoi = one/w(ib, j, k, irho)
13759  w(ib, j, k, ivx) = w(ib, j, k, ivx)*rhoi
13760  w(ib, j, k, ivy) = w(ib, j, k, ivy)*rhoi
13761  w(ib, j, k, ivz) = w(ib, j, k, ivz)*rhoi
13762  w(ib, j, k, irhoe) = w(ib, j, k, irhoe) - p(ib, j, k)
13763  end do
13764  end do
13765  do k=2,kl
13766  do i=2,il
13767  rhoi = one/w(i, 0, k, irho)
13768  w(i, 0, k, ivx) = w(i, 0, k, ivx)*rhoi
13769  w(i, 0, k, ivy) = w(i, 0, k, ivy)*rhoi
13770  w(i, 0, k, ivz) = w(i, 0, k, ivz)*rhoi
13771  w(i, 0, k, irhoe) = w(i, 0, k, irhoe) - p(i, 0, k)
13772  rhoi = one/w(i, 1, k, irho)
13773  w(i, 1, k, ivx) = w(i, 1, k, ivx)*rhoi
13774  w(i, 1, k, ivy) = w(i, 1, k, ivy)*rhoi
13775  w(i, 1, k, ivz) = w(i, 1, k, ivz)*rhoi
13776  w(i, 1, k, irhoe) = w(i, 1, k, irhoe) - p(i, 1, k)
13777  rhoi = one/w(i, je, k, irho)
13778  w(i, je, k, ivx) = w(i, je, k, ivx)*rhoi
13779  w(i, je, k, ivy) = w(i, je, k, ivy)*rhoi
13780  w(i, je, k, ivz) = w(i, je, k, ivz)*rhoi
13781  w(i, je, k, irhoe) = w(i, je, k, irhoe) - p(i, je, k)
13782  rhoi = one/w(i, jb, k, irho)
13783  w(i, jb, k, ivx) = w(i, jb, k, ivx)*rhoi
13784  w(i, jb, k, ivy) = w(i, jb, k, ivy)*rhoi
13785  w(i, jb, k, ivz) = w(i, jb, k, ivz)*rhoi
13786  w(i, jb, k, irhoe) = w(i, jb, k, irhoe) - p(i, jb, k)
13787  end do
13788  end do
13789  end if
13790  end subroutine invisciddissfluxscalarapprox
13791 
13792 ! differentiation of invisciddissfluxmatrixapprox in reverse (adjoint) mode (with options noisize i4 dr8 r8):
13793 ! gradient of useful results: pinfcorr *p *sfacei *sfacej
13794 ! *sfacek *w *si *sj *sk *fw
13795 ! with respect to varying inputs: pinfcorr *p *sfacei *sfacej
13796 ! *sfacek *w *si *sj *sk *fw
13797 ! rw status of diff variables: pinfcorr:incr *p:incr *sfacei:incr
13798 ! *sfacej:incr *sfacek:incr *w:incr *si:incr *sj:incr
13799 ! *sk:incr *fw:in-out
13800 ! plus diff mem management of: p:in sfacei:in sfacej:in sfacek:in
13801 ! w:in si:in sj:in sk:in fw:in
13803 !
13804 ! invisciddissfluxmatrix computes the matrix artificial
13805 ! dissipation term. instead of the spectral radius, as used in
13806 ! the scalar dissipation scheme, the absolute value of the flux
13807 ! jacobian is used. this leads to a less diffusive and
13808 ! consequently more accurate scheme. it is assumed that the
13809 ! pointers in blockpointers already point to the correct block.
13810 !
13811  use blockpointers
13812  use cgnsgrid
13813  use constants
13814  use flowvarrefstate
13816  use inputphysics
13817  use iteration
13818  use utils_b, only : getcorrectfork
13819  implicit none
13820 !
13821 ! local parameters.
13822 !
13823  real(kind=realtype), parameter :: dpmax=0.25_realtype
13824  real(kind=realtype), parameter :: epsacoustic=0.25_realtype
13825  real(kind=realtype), parameter :: epsshear=0.025_realtype
13826  real(kind=realtype), parameter :: omega=0.5_realtype
13827  real(kind=realtype), parameter :: oneminomega=one-omega
13828 !
13829 ! local variables.
13830 !
13831  integer(kind=inttype) :: i, j, k, ind
13832  real(kind=realtype) :: plim, sface
13833  real(kind=realtype) :: plimd, sfaced
13834  real(kind=realtype) :: sfil, fis2, fis4
13835  real(kind=realtype) :: gammaavg, gm1, ovgm1, gm53
13836  real(kind=realtype) :: ppor, rrad, dis2
13837  real(kind=realtype) :: rradd, dis2d
13838  real(kind=realtype) :: dp1, dp2, ddw, tmp, fs
13839  real(kind=realtype) :: dp1d, dp2d, ddwd, tmpd, fsd
13840  real(kind=realtype) :: dr, dru, drv, drw, dre, drk, sx, sy, sz
13841  real(kind=realtype) :: drd, drud, drvd, drwd, dred, drkd, sxd, syd, &
13842 & szd
13843  real(kind=realtype) :: uavg, vavg, wavg, a2avg, aavg, havg
13844  real(kind=realtype) :: uavgd, vavgd, wavgd, a2avgd, aavgd, havgd
13845  real(kind=realtype) :: alphaavg, unavg, ovaavg, ova2avg
13846  real(kind=realtype) :: alphaavgd, unavgd, ovaavgd, ova2avgd
13847  real(kind=realtype) :: kavg, lam1, lam2, lam3, area
13848  real(kind=realtype) :: kavgd, lam1d, lam2d, lam3d, aread
13849  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
13850  real(kind=realtype) :: abv1d, abv2d, abv3d, abv4d, abv5d, abv6d, &
13851 & abv7d
13852  logical :: correctfork
13853  intrinsic abs
13854  intrinsic max
13855  intrinsic min
13856  intrinsic sqrt
13857  real(kind=realtype) :: x1
13858  real(kind=realtype) :: x1d
13859  real(kind=realtype) :: x2
13860  real(kind=realtype) :: x2d
13861  real(kind=realtype) :: y1
13862  real(kind=realtype) :: y1d
13863  real(kind=realtype) :: x3
13864  real(kind=realtype) :: x3d
13865  real(kind=realtype) :: x4
13866  real(kind=realtype) :: x4d
13867  real(kind=realtype) :: y2
13868  real(kind=realtype) :: y2d
13869  real(kind=realtype) :: x5
13870  real(kind=realtype) :: x5d
13871  real(kind=realtype) :: x6
13872  real(kind=realtype) :: x6d
13873  real(kind=realtype) :: y3
13874  real(kind=realtype) :: y3d
13875  real(kind=realtype) :: abs0
13876  real(kind=realtype) :: min1
13877  real(kind=realtype) :: min1d
13878  real(realtype) :: max1
13879  real(realtype) :: max1d
13880  real(kind=realtype) :: min2
13881  real(kind=realtype) :: min2d
13882  real(realtype) :: max2
13883  real(realtype) :: max2d
13884  real(kind=realtype) :: min3
13885  real(kind=realtype) :: min3d
13886  real(realtype) :: max3
13887  real(realtype) :: max3d
13888  real(kind=realtype) :: abs1
13889  real(kind=realtype) :: abs2
13890  real(kind=realtype) :: abs3
13891  real(kind=realtype) :: abs4
13892  real(kind=realtype) :: abs5
13893  real(kind=realtype) :: abs6
13894  real(kind=realtype) :: abs7
13895  real(kind=realtype) :: abs8
13896  real(kind=realtype) :: abs9
13897  real(kind=realtype) :: abs10
13898  real(kind=realtype) :: abs11
13899  real(kind=realtype) :: abs12
13900  real(kind=realtype) :: temp
13901  real(kind=realtype) :: temp0
13902  real(kind=realtype) :: tempd
13903  real(kind=realtype) :: temp1
13904  real(kind=realtype) :: temp2
13905  real(kind=realtype) :: tempd0
13906  real(kind=realtype) :: tempd1
13907  real(kind=realtype) :: tempd2
13908  integer :: branch
13909  if (rfil .ge. 0.) then
13910  abs0 = rfil
13911  else
13912  abs0 = -rfil
13913  end if
13914 ! check if rfil == 0. if so, the dissipative flux needs not to
13915 ! be computed.
13916  if (abs0 .ge. thresholdreal) then
13917 ! set the value of plim. to be fully consistent this must have
13918 ! the dimension of a pressure. therefore a fraction of pinfcorr
13919 ! is used.
13920  plim = 0.001_realtype*pinfcorr
13921 ! determine whether or not the total energy must be corrected
13922 ! for the presence of the turbulent kinetic energy.
13923  correctfork = getcorrectfork()
13924 ! initialize sface to zero. this value will be used if the
13925 ! block is not moving.
13926  sface = zero
13927 ! set a couple of constants for the scheme.
13928  fis2 = rfil*vis2
13929  fis4 = rfil*vis4
13930  sfil = one - rfil
13931 !
13932 ! dissipative fluxes in the i-direction.
13933 !
13934  do k=2,kl
13935  do j=2,jl
13936  if (shocksensor(2, j, k) - shocksensor(1, j, k) .ge. 0.) then
13937  call pushreal8(abs1)
13938  abs1 = shocksensor(2, j, k) - shocksensor(1, j, k)
13939  call pushcontrol1b(1)
13940  else
13941  call pushreal8(abs1)
13942  abs1 = -(shocksensor(2, j, k)-shocksensor(1, j, k))
13943  call pushcontrol1b(0)
13944  end if
13945  if (shocksensor(1, j, k) - shocksensor(0, j, k) .ge. 0.) then
13946  call pushreal8(abs7)
13947  abs7 = shocksensor(1, j, k) - shocksensor(0, j, k)
13948  call pushcontrol1b(0)
13949  else
13950  call pushreal8(abs7)
13951  abs7 = -(shocksensor(1, j, k)-shocksensor(0, j, k))
13952  call pushcontrol1b(1)
13953  end if
13954  x1 = (shocksensor(2, j, k)-two*shocksensor(1, j, k)+&
13955 & shocksensor(0, j, k))/(omega*(shocksensor(2, j, k)+two*&
13956 & shocksensor(1, j, k)+shocksensor(0, j, k))+oneminomega*(abs1&
13957 & +abs7)+plim)
13958  if (x1 .ge. 0.) then
13959  dp1 = x1
13960  call pushcontrol1b(0)
13961  else
13962  dp1 = -x1
13963  call pushcontrol1b(1)
13964  end if
13965 ! loop in i-direction.
13966  do i=1,il
13967  if (shocksensor(i+2, j, k) - shocksensor(i+1, j, k) .ge. 0.&
13968 & ) then
13969  call pushreal8(abs2)
13970  abs2 = shocksensor(i+2, j, k) - shocksensor(i+1, j, k)
13971  call pushcontrol1b(1)
13972  else
13973  call pushreal8(abs2)
13974  abs2 = -(shocksensor(i+2, j, k)-shocksensor(i+1, j, k))
13975  call pushcontrol1b(0)
13976  end if
13977  if (shocksensor(i+1, j, k) - shocksensor(i, j, k) .ge. 0.) &
13978 & then
13979  call pushreal8(abs8)
13980  abs8 = shocksensor(i+1, j, k) - shocksensor(i, j, k)
13981  call pushcontrol1b(0)
13982  else
13983  call pushreal8(abs8)
13984  abs8 = -(shocksensor(i+1, j, k)-shocksensor(i, j, k))
13985  call pushcontrol1b(1)
13986  end if
13987  x2 = (shocksensor(i+2, j, k)-two*shocksensor(i+1, j, k)+&
13988 & shocksensor(i, j, k))/(omega*(shocksensor(i+2, j, k)+two*&
13989 & shocksensor(i+1, j, k)+shocksensor(i, j, k))+oneminomega*(&
13990 & abs2+abs8)+plim)
13991  if (x2 .ge. 0.) then
13992  dp2 = x2
13993  call pushcontrol1b(0)
13994  else
13995  dp2 = -x2
13996  call pushcontrol1b(1)
13997  end if
13998 ! compute the dissipation coefficients for this face.
13999  call pushreal8(ppor)
14000  ppor = zero
14001  if (pori(i, j, k) .eq. normalflux) ppor = one
14002  if (dp1 .lt. dp2) then
14003  y1 = dp2
14004  call pushcontrol1b(0)
14005  else
14006  y1 = dp1
14007  call pushcontrol1b(1)
14008  end if
14009  if (dpmax .gt. y1) then
14010  min1 = y1
14011  call pushcontrol1b(0)
14012  else
14013  min1 = dpmax
14014  call pushcontrol1b(1)
14015  end if
14016  call pushreal8(dis2)
14017  dis2 = fis2*ppor*min1 + sigma*fis4*ppor
14018 ! construct the vector of the first and third differences
14019 ! multiplied by the appropriate constants.
14020  call pushreal8(ddw)
14021  ddw = w(i+1, j, k, irho) - w(i, j, k, irho)
14022  call pushreal8(dr)
14023  dr = dis2*ddw
14024  ddw = w(i+1, j, k, irho)*w(i+1, j, k, ivx) - w(i, j, k, irho&
14025 & )*w(i, j, k, ivx)
14026  call pushreal8(dru)
14027  dru = dis2*ddw
14028  call pushreal8(ddw)
14029  ddw = w(i+1, j, k, irho)*w(i+1, j, k, ivy) - w(i, j, k, irho&
14030 & )*w(i, j, k, ivy)
14031  call pushreal8(drv)
14032  drv = dis2*ddw
14033  call pushreal8(ddw)
14034  ddw = w(i+1, j, k, irho)*w(i+1, j, k, ivz) - w(i, j, k, irho&
14035 & )*w(i, j, k, ivz)
14036  call pushreal8(drw)
14037  drw = dis2*ddw
14038  call pushreal8(ddw)
14039  ddw = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
14040  call pushreal8(dre)
14041  dre = dis2*ddw
14042 ! in case a k-equation is present, compute the difference
14043 ! of rhok and store the average value of k. if not present,
14044 ! set both these values to zero, such that later on no
14045 ! decision needs to be made anymore.
14046  if (correctfork) then
14047  ddw = w(i+1, j, k, irho)*w(i+1, j, k, itu1) - w(i, j, k, &
14048 & irho)*w(i, j, k, itu1)
14049  drk = dis2*ddw
14050  kavg = half*(w(i, j, k, itu1)+w(i+1, j, k, itu1))
14051  call pushcontrol1b(1)
14052  else
14053  drk = zero
14054  kavg = zero
14055  call pushcontrol1b(0)
14056  end if
14057 ! compute the average value of gamma and compute some
14058 ! expressions in which it occurs.
14059  gammaavg = half*(gamma(i+1, j, k)+gamma(i, j, k))
14060  gm1 = gammaavg - one
14061  ovgm1 = one/gm1
14062  gm53 = gammaavg - five*third
14063 ! compute the average state at the interface.
14064  uavg = half*(w(i+1, j, k, ivx)+w(i, j, k, ivx))
14065  vavg = half*(w(i+1, j, k, ivy)+w(i, j, k, ivy))
14066  wavg = half*(w(i+1, j, k, ivz)+w(i, j, k, ivz))
14067  call pushreal8(a2avg)
14068  a2avg = half*(gamma(i+1, j, k)*p(i+1, j, k)/w(i+1, j, k, &
14069 & irho)+gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
14070  call pushreal8(sx)
14071  sx = si(i, j, k, 1)
14072  call pushreal8(sy)
14073  sy = si(i, j, k, 2)
14074  call pushreal8(sz)
14075  sz = si(i, j, k, 3)
14076  call pushreal8(area)
14077  area = sqrt(sx**2 + sy**2 + sz**2)
14078  if (1.e-25_realtype .lt. area) then
14079  call pushreal8(max1)
14080  max1 = area
14081  call pushcontrol1b(0)
14082  else
14083  call pushreal8(max1)
14084  max1 = 1.e-25_realtype
14085  call pushcontrol1b(1)
14086  end if
14087  tmp = one/max1
14088  call pushreal8(sx)
14089  sx = sx*tmp
14090  call pushreal8(sy)
14091  sy = sy*tmp
14092  call pushreal8(sz)
14093  sz = sz*tmp
14094  alphaavg = half*(uavg**2+vavg**2+wavg**2)
14095  call pushreal8(havg)
14096  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
14097  call pushreal8(aavg)
14098  aavg = sqrt(a2avg)
14099  unavg = uavg*sx + vavg*sy + wavg*sz
14100 ! the mesh velocity if the face is moving. it must be
14101 ! divided by the area to obtain a true velocity.
14102  if (addgridvelocities) then
14103  sface = sfacei(i, j, k)*tmp
14104  call pushcontrol1b(1)
14105  else
14106  call pushcontrol1b(0)
14107  end if
14108  if (unavg - sface + aavg .ge. 0.) then
14109  lam1 = unavg - sface + aavg
14110  call pushcontrol1b(0)
14111  else
14112  lam1 = -(unavg-sface+aavg)
14113  call pushcontrol1b(1)
14114  end if
14115  if (unavg - sface - aavg .ge. 0.) then
14116  lam2 = unavg - sface - aavg
14117  call pushcontrol1b(0)
14118  else
14119  lam2 = -(unavg-sface-aavg)
14120  call pushcontrol1b(1)
14121  end if
14122  if (unavg - sface .ge. 0.) then
14123  call pushreal8(lam3)
14124  lam3 = unavg - sface
14125  call pushcontrol1b(0)
14126  else
14127  call pushreal8(lam3)
14128  lam3 = -(unavg-sface)
14129  call pushcontrol1b(1)
14130  end if
14131  rrad = lam3 + aavg
14132  if (lam1 .lt. epsacoustic*rrad) then
14133  lam1 = epsacoustic*rrad
14134  call pushcontrol1b(0)
14135  else
14136  call pushcontrol1b(1)
14137  lam1 = lam1
14138  end if
14139  if (lam2 .lt. epsacoustic*rrad) then
14140  lam2 = epsacoustic*rrad
14141  call pushcontrol1b(0)
14142  else
14143  call pushcontrol1b(1)
14144  lam2 = lam2
14145  end if
14146  if (lam3 .lt. epsshear*rrad) then
14147  lam3 = epsshear*rrad
14148  call pushcontrol1b(0)
14149  else
14150  lam3 = lam3
14151  call pushcontrol1b(1)
14152  end if
14153 ! multiply the eigenvalues by the area to obtain
14154 ! the correct values for the dissipation term.
14155  call pushreal8(lam1)
14156  lam1 = lam1*area
14157  call pushreal8(lam2)
14158  lam2 = lam2*area
14159  call pushreal8(lam3)
14160  lam3 = lam3*area
14161 ! some abbreviations, which occur quite often in the
14162 ! dissipation terms.
14163  abv1 = half*(lam1+lam2)
14164  call pushreal8(abv2)
14165  abv2 = half*(lam1-lam2)
14166  call pushreal8(abv3)
14167  abv3 = abv1 - lam3
14168  call pushreal8(abv4)
14169  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
14170 & gm53*drk
14171 ! compute and scatter the dissipative flux.
14172 ! density.
14173 ! x-momentum.
14174 ! y-momentum.
14175 ! z-momentum.
14176 ! energy.
14177 ! set dp1 to dp2 for the next face.
14178  dp1 = dp2
14179  end do
14180  end do
14181  end do
14182 !
14183 ! dissipative fluxes in the j-direction.
14184 !
14185  do k=2,kl
14186  do i=2,il
14187  if (shocksensor(i, 2, k) - shocksensor(i, 1, k) .ge. 0.) then
14188  call pushreal8(abs3)
14189  abs3 = shocksensor(i, 2, k) - shocksensor(i, 1, k)
14190  call pushcontrol1b(1)
14191  else
14192  call pushreal8(abs3)
14193  abs3 = -(shocksensor(i, 2, k)-shocksensor(i, 1, k))
14194  call pushcontrol1b(0)
14195  end if
14196  if (shocksensor(i, 1, k) - shocksensor(i, 0, k) .ge. 0.) then
14197  call pushreal8(abs9)
14198  abs9 = shocksensor(i, 1, k) - shocksensor(i, 0, k)
14199  call pushcontrol1b(0)
14200  else
14201  call pushreal8(abs9)
14202  abs9 = -(shocksensor(i, 1, k)-shocksensor(i, 0, k))
14203  call pushcontrol1b(1)
14204  end if
14205  x3 = (shocksensor(i, 2, k)-two*shocksensor(i, 1, k)+&
14206 & shocksensor(i, 0, k))/(omega*(shocksensor(i, 2, k)+two*&
14207 & shocksensor(i, 1, k)+shocksensor(i, 0, k))+oneminomega*(abs3&
14208 & +abs9)+plim)
14209  if (x3 .ge. 0.) then
14210  dp1 = x3
14211  call pushcontrol1b(0)
14212  else
14213  dp1 = -x3
14214  call pushcontrol1b(1)
14215  end if
14216 ! loop in j-direction.
14217  do j=1,jl
14218  if (shocksensor(i, j+2, k) - shocksensor(i, j+1, k) .ge. 0.&
14219 & ) then
14220  call pushreal8(abs4)
14221  abs4 = shocksensor(i, j+2, k) - shocksensor(i, j+1, k)
14222  call pushcontrol1b(1)
14223  else
14224  call pushreal8(abs4)
14225  abs4 = -(shocksensor(i, j+2, k)-shocksensor(i, j+1, k))
14226  call pushcontrol1b(0)
14227  end if
14228  if (shocksensor(i, j+1, k) - shocksensor(i, j, k) .ge. 0.) &
14229 & then
14230  call pushreal8(abs10)
14231  abs10 = shocksensor(i, j+1, k) - shocksensor(i, j, k)
14232  call pushcontrol1b(0)
14233  else
14234  call pushreal8(abs10)
14235  abs10 = -(shocksensor(i, j+1, k)-shocksensor(i, j, k))
14236  call pushcontrol1b(1)
14237  end if
14238  x4 = (shocksensor(i, j+2, k)-two*shocksensor(i, j+1, k)+&
14239 & shocksensor(i, j, k))/(omega*(shocksensor(i, j+2, k)+two*&
14240 & shocksensor(i, j+1, k)+shocksensor(i, j, k))+oneminomega*(&
14241 & abs4+abs10)+plim)
14242  if (x4 .ge. 0.) then
14243  dp2 = x4
14244  call pushcontrol1b(0)
14245  else
14246  dp2 = -x4
14247  call pushcontrol1b(1)
14248  end if
14249 ! compute the dissipation coefficients for this face.
14250  call pushreal8(ppor)
14251  ppor = zero
14252  if (porj(i, j, k) .eq. normalflux) ppor = one
14253  if (dp1 .lt. dp2) then
14254  y2 = dp2
14255  call pushcontrol1b(0)
14256  else
14257  y2 = dp1
14258  call pushcontrol1b(1)
14259  end if
14260  if (dpmax .gt. y2) then
14261  min2 = y2
14262  call pushcontrol1b(0)
14263  else
14264  min2 = dpmax
14265  call pushcontrol1b(1)
14266  end if
14267  call pushreal8(dis2)
14268  dis2 = fis2*ppor*min2 + sigma*fis4*ppor
14269 ! construct the vector of the first and third differences
14270 ! multiplied by the appropriate constants.
14271  call pushreal8(ddw)
14272  ddw = w(i, j+1, k, irho) - w(i, j, k, irho)
14273  call pushreal8(dr)
14274  dr = dis2*ddw
14275  ddw = w(i, j+1, k, irho)*w(i, j+1, k, ivx) - w(i, j, k, irho&
14276 & )*w(i, j, k, ivx)
14277  call pushreal8(dru)
14278  dru = dis2*ddw
14279  call pushreal8(ddw)
14280  ddw = w(i, j+1, k, irho)*w(i, j+1, k, ivy) - w(i, j, k, irho&
14281 & )*w(i, j, k, ivy)
14282  call pushreal8(drv)
14283  drv = dis2*ddw
14284  call pushreal8(ddw)
14285  ddw = w(i, j+1, k, irho)*w(i, j+1, k, ivz) - w(i, j, k, irho&
14286 & )*w(i, j, k, ivz)
14287  call pushreal8(drw)
14288  drw = dis2*ddw
14289  call pushreal8(ddw)
14290  ddw = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
14291  call pushreal8(dre)
14292  dre = dis2*ddw
14293 ! in case a k-equation is present, compute the difference
14294 ! of rhok and store the average value of k. if not present,
14295 ! set both these values to zero, such that later on no
14296 ! decision needs to be made anymore.
14297  if (correctfork) then
14298  ddw = w(i, j+1, k, irho)*w(i, j+1, k, itu1) - w(i, j, k, &
14299 & irho)*w(i, j, k, itu1)
14300  drk = dis2*ddw
14301  kavg = half*(w(i, j, k, itu1)+w(i, j+1, k, itu1))
14302  call pushcontrol1b(1)
14303  else
14304  drk = zero
14305  kavg = zero
14306  call pushcontrol1b(0)
14307  end if
14308 ! compute the average value of gamma and compute some
14309 ! expressions in which it occurs.
14310  gammaavg = half*(gamma(i, j+1, k)+gamma(i, j, k))
14311  gm1 = gammaavg - one
14312  ovgm1 = one/gm1
14313  gm53 = gammaavg - five*third
14314 ! compute the average state at the interface.
14315  uavg = half*(w(i, j+1, k, ivx)+w(i, j, k, ivx))
14316  vavg = half*(w(i, j+1, k, ivy)+w(i, j, k, ivy))
14317  wavg = half*(w(i, j+1, k, ivz)+w(i, j, k, ivz))
14318  call pushreal8(a2avg)
14319  a2avg = half*(gamma(i, j+1, k)*p(i, j+1, k)/w(i, j+1, k, &
14320 & irho)+gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
14321  call pushreal8(sx)
14322  sx = sj(i, j, k, 1)
14323  call pushreal8(sy)
14324  sy = sj(i, j, k, 2)
14325  call pushreal8(sz)
14326  sz = sj(i, j, k, 3)
14327  call pushreal8(area)
14328  area = sqrt(sx**2 + sy**2 + sz**2)
14329  if (1.e-25_realtype .lt. area) then
14330  call pushreal8(max2)
14331  max2 = area
14332  call pushcontrol1b(0)
14333  else
14334  call pushreal8(max2)
14335  max2 = 1.e-25_realtype
14336  call pushcontrol1b(1)
14337  end if
14338  tmp = one/max2
14339  call pushreal8(sx)
14340  sx = sx*tmp
14341  call pushreal8(sy)
14342  sy = sy*tmp
14343  call pushreal8(sz)
14344  sz = sz*tmp
14345  alphaavg = half*(uavg**2+vavg**2+wavg**2)
14346  call pushreal8(havg)
14347  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
14348  call pushreal8(aavg)
14349  aavg = sqrt(a2avg)
14350  unavg = uavg*sx + vavg*sy + wavg*sz
14351 ! the mesh velocity if the face is moving. it must be
14352 ! divided by the area to obtain a true velocity.
14353  if (addgridvelocities) then
14354  sface = sfacej(i, j, k)*tmp
14355  call pushcontrol1b(1)
14356  else
14357  call pushcontrol1b(0)
14358  end if
14359  if (unavg - sface + aavg .ge. 0.) then
14360  lam1 = unavg - sface + aavg
14361  call pushcontrol1b(0)
14362  else
14363  lam1 = -(unavg-sface+aavg)
14364  call pushcontrol1b(1)
14365  end if
14366  if (unavg - sface - aavg .ge. 0.) then
14367  lam2 = unavg - sface - aavg
14368  call pushcontrol1b(0)
14369  else
14370  lam2 = -(unavg-sface-aavg)
14371  call pushcontrol1b(1)
14372  end if
14373  if (unavg - sface .ge. 0.) then
14374  call pushreal8(lam3)
14375  lam3 = unavg - sface
14376  call pushcontrol1b(0)
14377  else
14378  call pushreal8(lam3)
14379  lam3 = -(unavg-sface)
14380  call pushcontrol1b(1)
14381  end if
14382  rrad = lam3 + aavg
14383  if (lam1 .lt. epsacoustic*rrad) then
14384  lam1 = epsacoustic*rrad
14385  call pushcontrol1b(0)
14386  else
14387  call pushcontrol1b(1)
14388  lam1 = lam1
14389  end if
14390  if (lam2 .lt. epsacoustic*rrad) then
14391  lam2 = epsacoustic*rrad
14392  call pushcontrol1b(0)
14393  else
14394  call pushcontrol1b(1)
14395  lam2 = lam2
14396  end if
14397  if (lam3 .lt. epsshear*rrad) then
14398  lam3 = epsshear*rrad
14399  call pushcontrol1b(0)
14400  else
14401  lam3 = lam3
14402  call pushcontrol1b(1)
14403  end if
14404 ! multiply the eigenvalues by the area to obtain
14405 ! the correct values for the dissipation term.
14406  call pushreal8(lam1)
14407  lam1 = lam1*area
14408  call pushreal8(lam2)
14409  lam2 = lam2*area
14410  call pushreal8(lam3)
14411  lam3 = lam3*area
14412 ! some abbreviations, which occur quite often in the
14413 ! dissipation terms.
14414  abv1 = half*(lam1+lam2)
14415  call pushreal8(abv2)
14416  abv2 = half*(lam1-lam2)
14417  call pushreal8(abv3)
14418  abv3 = abv1 - lam3
14419  call pushreal8(abv4)
14420  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
14421 & gm53*drk
14422 ! compute and scatter the dissipative flux.
14423 ! density.
14424 ! x-momentum.
14425 ! y-momentum.
14426 ! z-momentum.
14427 ! energy.
14428 ! set dp1 to dp2 for the next face.
14429  dp1 = dp2
14430  end do
14431  end do
14432  end do
14433 !
14434 ! dissipative fluxes in the k-direction.
14435 !
14436  do j=2,jl
14437  do i=2,il
14438  if (shocksensor(i, j, 2) - shocksensor(i, j, 1) .ge. 0.) then
14439  call pushreal8(abs5)
14440  abs5 = shocksensor(i, j, 2) - shocksensor(i, j, 1)
14441  call pushcontrol1b(1)
14442  else
14443  call pushreal8(abs5)
14444  abs5 = -(shocksensor(i, j, 2)-shocksensor(i, j, 1))
14445  call pushcontrol1b(0)
14446  end if
14447  if (shocksensor(i, j, 1) - shocksensor(i, j, 0) .ge. 0.) then
14448  call pushreal8(abs11)
14449  abs11 = shocksensor(i, j, 1) - shocksensor(i, j, 0)
14450  call pushcontrol1b(0)
14451  else
14452  call pushreal8(abs11)
14453  abs11 = -(shocksensor(i, j, 1)-shocksensor(i, j, 0))
14454  call pushcontrol1b(1)
14455  end if
14456  x5 = (shocksensor(i, j, 2)-two*shocksensor(i, j, 1)+&
14457 & shocksensor(i, j, 0))/(omega*(shocksensor(i, j, 2)+two*&
14458 & shocksensor(i, j, 1)+shocksensor(i, j, 0))+oneminomega*(abs5&
14459 & +abs11)+plim)
14460  if (x5 .ge. 0.) then
14461  dp1 = x5
14462  call pushcontrol1b(0)
14463  else
14464  dp1 = -x5
14465  call pushcontrol1b(1)
14466  end if
14467 ! loop in k-direction.
14468  do k=1,kl
14469  if (shocksensor(i, j, k+2) - shocksensor(i, j, k+1) .ge. 0.&
14470 & ) then
14471  call pushreal8(abs6)
14472  abs6 = shocksensor(i, j, k+2) - shocksensor(i, j, k+1)
14473  call pushcontrol1b(1)
14474  else
14475  call pushreal8(abs6)
14476  abs6 = -(shocksensor(i, j, k+2)-shocksensor(i, j, k+1))
14477  call pushcontrol1b(0)
14478  end if
14479  if (shocksensor(i, j, k+1) - shocksensor(i, j, k) .ge. 0.) &
14480 & then
14481  call pushreal8(abs12)
14482  abs12 = shocksensor(i, j, k+1) - shocksensor(i, j, k)
14483  call pushcontrol1b(0)
14484  else
14485  call pushreal8(abs12)
14486  abs12 = -(shocksensor(i, j, k+1)-shocksensor(i, j, k))
14487  call pushcontrol1b(1)
14488  end if
14489  x6 = (shocksensor(i, j, k+2)-two*shocksensor(i, j, k+1)+&
14490 & shocksensor(i, j, k))/(omega*(shocksensor(i, j, k+2)+two*&
14491 & shocksensor(i, j, k+1)+shocksensor(i, j, k))+oneminomega*(&
14492 & abs6+abs12)+plim)
14493  if (x6 .ge. 0.) then
14494  dp2 = x6
14495  call pushcontrol1b(0)
14496  else
14497  dp2 = -x6
14498  call pushcontrol1b(1)
14499  end if
14500 ! compute the dissipation coefficients for this face.
14501  call pushreal8(ppor)
14502  ppor = zero
14503  if (pork(i, j, k) .eq. normalflux) ppor = one
14504  if (dp1 .lt. dp2) then
14505  y3 = dp2
14506  call pushcontrol1b(0)
14507  else
14508  y3 = dp1
14509  call pushcontrol1b(1)
14510  end if
14511  if (dpmax .gt. y3) then
14512  min3 = y3
14513  call pushcontrol1b(0)
14514  else
14515  min3 = dpmax
14516  call pushcontrol1b(1)
14517  end if
14518  call pushreal8(dis2)
14519  dis2 = fis2*ppor*min3 + sigma*fis4*ppor
14520 ! construct the vector of the first and third differences
14521 ! multiplied by the appropriate constants.
14522  call pushreal8(ddw)
14523  ddw = w(i, j, k+1, irho) - w(i, j, k, irho)
14524  call pushreal8(dr)
14525  dr = dis2*ddw
14526  ddw = w(i, j, k+1, irho)*w(i, j, k+1, ivx) - w(i, j, k, irho&
14527 & )*w(i, j, k, ivx)
14528  call pushreal8(dru)
14529  dru = dis2*ddw
14530  call pushreal8(ddw)
14531  ddw = w(i, j, k+1, irho)*w(i, j, k+1, ivy) - w(i, j, k, irho&
14532 & )*w(i, j, k, ivy)
14533  call pushreal8(drv)
14534  drv = dis2*ddw
14535  call pushreal8(ddw)
14536  ddw = w(i, j, k+1, irho)*w(i, j, k+1, ivz) - w(i, j, k, irho&
14537 & )*w(i, j, k, ivz)
14538  call pushreal8(drw)
14539  drw = dis2*ddw
14540  call pushreal8(ddw)
14541  ddw = w(i, j, k+1, irhoe) - w(i, j, k, irhoe)
14542  call pushreal8(dre)
14543  dre = dis2*ddw
14544 ! in case a k-equation is present, compute the difference
14545 ! of rhok and store the average value of k. if not present,
14546 ! set both these values to zero, such that later on no
14547 ! decision needs to be made anymore.
14548  if (correctfork) then
14549  ddw = w(i, j, k+1, irho)*w(i, j, k+1, itu1) - w(i, j, k, &
14550 & irho)*w(i, j, k, itu1)
14551  drk = dis2*ddw
14552  kavg = half*(w(i, j, k+1, itu1)+w(i, j, k, itu1))
14553  call pushcontrol1b(1)
14554  else
14555  drk = zero
14556  kavg = zero
14557  call pushcontrol1b(0)
14558  end if
14559 ! compute the average value of gamma and compute some
14560 ! expressions in which it occurs.
14561  gammaavg = half*(gamma(i, j, k+1)+gamma(i, j, k))
14562  gm1 = gammaavg - one
14563  ovgm1 = one/gm1
14564  gm53 = gammaavg - five*third
14565 ! compute the average state at the interface.
14566  uavg = half*(w(i, j, k+1, ivx)+w(i, j, k, ivx))
14567  vavg = half*(w(i, j, k+1, ivy)+w(i, j, k, ivy))
14568  wavg = half*(w(i, j, k+1, ivz)+w(i, j, k, ivz))
14569  call pushreal8(a2avg)
14570  a2avg = half*(gamma(i, j, k+1)*p(i, j, k+1)/w(i, j, k+1, &
14571 & irho)+gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
14572  call pushreal8(sx)
14573  sx = sk(i, j, k, 1)
14574  call pushreal8(sy)
14575  sy = sk(i, j, k, 2)
14576  call pushreal8(sz)
14577  sz = sk(i, j, k, 3)
14578  call pushreal8(area)
14579  area = sqrt(sx**2 + sy**2 + sz**2)
14580  if (1.e-25_realtype .lt. area) then
14581  call pushreal8(max3)
14582  max3 = area
14583  call pushcontrol1b(0)
14584  else
14585  call pushreal8(max3)
14586  max3 = 1.e-25_realtype
14587  call pushcontrol1b(1)
14588  end if
14589  tmp = one/max3
14590  call pushreal8(sx)
14591  sx = sx*tmp
14592  call pushreal8(sy)
14593  sy = sy*tmp
14594  call pushreal8(sz)
14595  sz = sz*tmp
14596  alphaavg = half*(uavg**2+vavg**2+wavg**2)
14597  call pushreal8(havg)
14598  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
14599  call pushreal8(aavg)
14600  aavg = sqrt(a2avg)
14601  unavg = uavg*sx + vavg*sy + wavg*sz
14602 ! the mesh velocity if the face is moving. it must be
14603 ! divided by the area to obtain a true velocity.
14604  if (addgridvelocities) then
14605  sface = sfacek(i, j, k)*tmp
14606  call pushcontrol1b(1)
14607  else
14608  call pushcontrol1b(0)
14609  end if
14610  if (unavg - sface + aavg .ge. 0.) then
14611  lam1 = unavg - sface + aavg
14612  call pushcontrol1b(0)
14613  else
14614  lam1 = -(unavg-sface+aavg)
14615  call pushcontrol1b(1)
14616  end if
14617  if (unavg - sface - aavg .ge. 0.) then
14618  lam2 = unavg - sface - aavg
14619  call pushcontrol1b(0)
14620  else
14621  lam2 = -(unavg-sface-aavg)
14622  call pushcontrol1b(1)
14623  end if
14624  if (unavg - sface .ge. 0.) then
14625  call pushreal8(lam3)
14626  lam3 = unavg - sface
14627  call pushcontrol1b(0)
14628  else
14629  call pushreal8(lam3)
14630  lam3 = -(unavg-sface)
14631  call pushcontrol1b(1)
14632  end if
14633  rrad = lam3 + aavg
14634  if (lam1 .lt. epsacoustic*rrad) then
14635  lam1 = epsacoustic*rrad
14636  call pushcontrol1b(0)
14637  else
14638  call pushcontrol1b(1)
14639  lam1 = lam1
14640  end if
14641  if (lam2 .lt. epsacoustic*rrad) then
14642  lam2 = epsacoustic*rrad
14643  call pushcontrol1b(0)
14644  else
14645  call pushcontrol1b(1)
14646  lam2 = lam2
14647  end if
14648  if (lam3 .lt. epsshear*rrad) then
14649  lam3 = epsshear*rrad
14650  call pushcontrol1b(0)
14651  else
14652  lam3 = lam3
14653  call pushcontrol1b(1)
14654  end if
14655 ! multiply the eigenvalues by the area to obtain
14656 ! the correct values for the dissipation term.
14657  call pushreal8(lam1)
14658  lam1 = lam1*area
14659  call pushreal8(lam2)
14660  lam2 = lam2*area
14661  call pushreal8(lam3)
14662  lam3 = lam3*area
14663 ! some abbreviations, which occur quite often in the
14664 ! dissipation terms.
14665  abv1 = half*(lam1+lam2)
14666  call pushreal8(abv2)
14667  abv2 = half*(lam1-lam2)
14668  call pushreal8(abv3)
14669  abv3 = abv1 - lam3
14670  call pushreal8(abv4)
14671  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
14672 & gm53*drk
14673 ! compute and scatter the dissipative flux.
14674 ! density.
14675 ! x-momentum.
14676 ! y-momentum.
14677 ! z-momentum.
14678 ! energy.
14679 ! set dp1 to dp2 for the next face.
14680  dp1 = dp2
14681  end do
14682  end do
14683  end do
14684  plimd = 0.0_8
14685  sfaced = 0.0_8
14686  do j=jl,2,-1
14687  do i=il,2,-1
14688  dp1d = 0.0_8
14689  do k=kl,1,-1
14690  dp2d = dp1d
14691  fsd = fwd(i, j, k+1, irhoe) - fwd(i, j, k, irhoe)
14692  wavg = half*(w(i, j, k+1, ivz)+w(i, j, k, ivz))
14693  vavg = half*(w(i, j, k+1, ivy)+w(i, j, k, ivy))
14694  uavg = half*(w(i, j, k+1, ivx)+w(i, j, k, ivx))
14695  unavg = uavg*sx + vavg*sy + wavg*sz
14696  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
14697  ovaavg = one/aavg
14698  ova2avg = one/a2avg
14699  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
14700  abv7 = abv2*abv4*ovaavg + abv3*abv5
14701  lam3d = dre*fsd
14702  dred = lam3*fsd
14703  havgd = abv6*fsd
14704  abv6d = havg*fsd
14705  unavgd = abv7*fsd
14706  abv7d = unavg*fsd
14707  fsd = fwd(i, j, k+1, imz) - fwd(i, j, k, imz)
14708  lam3d = lam3d + drw*fsd
14709  drwd = lam3*fsd
14710  wavgd = abv6*fsd
14711  abv6d = abv6d + wavg*fsd
14712  szd = abv7*fsd
14713  abv7d = abv7d + sz*fsd
14714  fsd = fwd(i, j, k+1, imy) - fwd(i, j, k, imy)
14715  lam3d = lam3d + drv*fsd
14716  drvd = lam3*fsd
14717  vavgd = abv6*fsd
14718  abv6d = abv6d + vavg*fsd
14719  syd = abv7*fsd
14720  abv7d = abv7d + sy*fsd
14721  fsd = fwd(i, j, k+1, imx) - fwd(i, j, k, imx)
14722  lam3d = lam3d + dru*fsd
14723  drud = lam3*fsd
14724  uavgd = abv6*fsd
14725  abv6d = abv6d + uavg*fsd
14726  sxd = abv7*fsd
14727  abv7d = abv7d + sx*fsd
14728  fsd = fwd(i, j, k+1, irho) - fwd(i, j, k, irho)
14729  abv6d = abv6d + fsd
14730  abv2d = abv4*ovaavg*abv7d + abv5*ovaavg*abv6d
14731  abv4d = abv2*ovaavg*abv7d + abv3*ova2avg*abv6d
14732  ovaavgd = abv2*abv4*abv7d + abv2*abv5*abv6d
14733  abv3d = abv5*abv7d + abv4*ova2avg*abv6d
14734  lam3d = lam3d + dr*fsd - abv3d
14735  abv5d = abv3*abv7d + abv2*ovaavg*abv6d
14736  ova2avgd = abv3*abv4*abv6d
14737  sxd = sxd + dru*abv5d
14738  syd = syd + drv*abv5d
14739  szd = szd + drw*abv5d
14740  unavgd = unavgd - dr*abv5d
14741  gammaavg = half*(gamma(i, j, k+1)+gamma(i, j, k))
14742  gm1 = gammaavg - one
14743  gm53 = gammaavg - five*third
14744  alphaavg = half*(uavg**2+vavg**2+wavg**2)
14745  call popreal8(abv4)
14746  tempd0 = gm1*abv4d
14747  drd = lam3*fsd + alphaavg*tempd0 - unavg*abv5d
14748  drud = drud + sx*abv5d - uavg*tempd0
14749  drvd = drvd + sy*abv5d - vavg*tempd0
14750  drwd = drwd + sz*abv5d - wavg*tempd0
14751  drkd = -(gm53*abv4d)
14752  alphaavgd = dr*tempd0
14753  uavgd = uavgd - dru*tempd0
14754  vavgd = vavgd - drv*tempd0
14755  dred = dred + tempd0
14756  wavgd = wavgd - drw*tempd0
14757  call popreal8(abv3)
14758  abv1d = abv3d
14759  call popreal8(abv2)
14760  lam1d = half*abv2d + half*abv1d
14761  lam2d = half*abv1d - half*abv2d
14762  call popreal8(lam3)
14763  call popreal8(lam2)
14764  call popreal8(lam1)
14765  aread = lam3*lam3d + lam2*lam2d + lam1*lam1d
14766  lam3d = area*lam3d
14767  lam2d = area*lam2d
14768  lam1d = area*lam1d
14769  call popcontrol1b(branch)
14770  if (branch .eq. 0) then
14771  rradd = epsshear*lam3d
14772  lam3d = 0.0_8
14773  else
14774  rradd = 0.0_8
14775  end if
14776  call popcontrol1b(branch)
14777  if (branch .eq. 0) then
14778  rradd = rradd + epsacoustic*lam2d
14779  lam2d = 0.0_8
14780  end if
14781  call popcontrol1b(branch)
14782  if (branch .eq. 0) then
14783  rradd = rradd + epsacoustic*lam1d
14784  lam1d = 0.0_8
14785  end if
14786  lam3d = lam3d + rradd
14787  aavgd = rradd
14788  call popcontrol1b(branch)
14789  if (branch .eq. 0) then
14790  call popreal8(lam3)
14791  unavgd = unavgd + lam3d
14792  sfaced = sfaced - lam3d
14793  else
14794  call popreal8(lam3)
14795  sfaced = sfaced + lam3d
14796  unavgd = unavgd - lam3d
14797  end if
14798  call popcontrol1b(branch)
14799  if (branch .eq. 0) then
14800  unavgd = unavgd + lam2d
14801  sfaced = sfaced - lam2d
14802  aavgd = aavgd - lam2d
14803  else
14804  sfaced = sfaced + lam2d
14805  unavgd = unavgd - lam2d
14806  aavgd = aavgd + lam2d
14807  end if
14808  call popcontrol1b(branch)
14809  if (branch .eq. 0) then
14810  unavgd = unavgd + lam1d
14811  sfaced = sfaced - lam1d
14812  aavgd = aavgd + lam1d
14813  else
14814  sfaced = sfaced + lam1d
14815  unavgd = unavgd - lam1d
14816  aavgd = aavgd - lam1d
14817  end if
14818  tmp = one/max3
14819  call popcontrol1b(branch)
14820  if (branch .eq. 0) then
14821  tmpd = 0.0_8
14822  else
14823  sfacekd(i, j, k) = sfacekd(i, j, k) + tmp*sfaced
14824  tmpd = sfacek(i, j, k)*sfaced
14825  sfaced = 0.0_8
14826  end if
14827  alphaavgd = alphaavgd + havgd
14828  tempd0 = half*alphaavgd
14829  ovgm1 = one/gm1
14830  aavgd = aavgd - one*ovaavgd/aavg**2
14831  if (a2avg .eq. 0.0_8) then
14832  a2avgd = ovgm1*havgd - one*ova2avgd/a2avg**2
14833  else
14834  a2avgd = aavgd/(2.0*sqrt(a2avg)) - one*ova2avgd/a2avg**2 +&
14835 & ovgm1*havgd
14836  end if
14837  uavgd = uavgd + sx*unavgd + 2*uavg*tempd0
14838  sxd = sxd + uavg*unavgd
14839  vavgd = vavgd + sy*unavgd + 2*vavg*tempd0
14840  syd = syd + vavg*unavgd
14841  wavgd = wavgd + sz*unavgd + 2*wavg*tempd0
14842  szd = szd + wavg*unavgd
14843  call popreal8(aavg)
14844  call popreal8(havg)
14845  kavgd = -(gm53*ovgm1*havgd)
14846  call popreal8(sz)
14847  call popreal8(sy)
14848  call popreal8(sx)
14849  tmpd = tmpd + sz*szd + sy*syd + sx*sxd
14850  szd = tmp*szd
14851  syd = tmp*syd
14852  sxd = tmp*sxd
14853  max3d = -(one*tmpd/max3**2)
14854  call popcontrol1b(branch)
14855  if (branch .eq. 0) then
14856  call popreal8(max3)
14857  aread = aread + max3d
14858  else
14859  call popreal8(max3)
14860  end if
14861  call popreal8(area)
14862  if (sx**2 + sy**2 + sz**2 .eq. 0.0_8) then
14863  tempd0 = 0.0_8
14864  else
14865  tempd0 = aread/(2.0*sqrt(sx**2+sy**2+sz**2))
14866  end if
14867  sxd = sxd + 2*sx*tempd0
14868  syd = syd + 2*sy*tempd0
14869  szd = szd + 2*sz*tempd0
14870  call popreal8(sz)
14871  skd(i, j, k, 3) = skd(i, j, k, 3) + szd
14872  call popreal8(sy)
14873  skd(i, j, k, 2) = skd(i, j, k, 2) + syd
14874  call popreal8(sx)
14875  skd(i, j, k, 1) = skd(i, j, k, 1) + sxd
14876  call popreal8(a2avg)
14877  temp2 = w(i, j, k+1, irho)
14878  temp0 = w(i, j, k, irho)
14879  tempd1 = gamma(i, j, k+1)*half*a2avgd/temp2
14880  tempd2 = gamma(i, j, k)*half*a2avgd/temp0
14881  pd(i, j, k) = pd(i, j, k) + tempd2
14882  wd(i, j, k, irho) = wd(i, j, k, irho) - p(i, j, k)*tempd2/&
14883 & temp0
14884  pd(i, j, k+1) = pd(i, j, k+1) + tempd1
14885  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) - p(i, j, k+1)*&
14886 & tempd1/temp2
14887  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + half*wavgd
14888  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wavgd
14889  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + half*vavgd
14890  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vavgd
14891  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + half*uavgd
14892  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*uavgd
14893  call popcontrol1b(branch)
14894  if (branch .eq. 0) then
14895  dis2d = 0.0_8
14896  else
14897  wd(i, j, k+1, itu1) = wd(i, j, k+1, itu1) + half*kavgd
14898  wd(i, j, k, itu1) = wd(i, j, k, itu1) + half*kavgd
14899  dis2d = ddw*drkd
14900  ddwd = dis2*drkd
14901  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, &
14902 & itu1)*ddwd
14903  wd(i, j, k+1, itu1) = wd(i, j, k+1, itu1) + w(i, j, k+1, &
14904 & irho)*ddwd
14905  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, itu1)*&
14906 & ddwd
14907  wd(i, j, k, itu1) = wd(i, j, k, itu1) - w(i, j, k, irho)*&
14908 & ddwd
14909  ddw = w(i, j, k+1, irhoe) - w(i, j, k, irhoe)
14910  end if
14911  call popreal8(dre)
14912  dis2d = dis2d + ddw*dred
14913  ddwd = dis2*dred
14914  call popreal8(ddw)
14915  wd(i, j, k+1, irhoe) = wd(i, j, k+1, irhoe) + ddwd
14916  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddwd
14917  call popreal8(drw)
14918  dis2d = dis2d + ddw*drwd
14919  ddwd = dis2*drwd
14920  call popreal8(ddw)
14921  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, ivz&
14922 & )*ddwd
14923  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + w(i, j, k+1, irho)&
14924 & *ddwd
14925  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivz)*ddwd
14926  wd(i, j, k, ivz) = wd(i, j, k, ivz) - w(i, j, k, irho)*ddwd
14927  call popreal8(drv)
14928  dis2d = dis2d + ddw*drvd
14929  ddwd = dis2*drvd
14930  call popreal8(ddw)
14931  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, ivy&
14932 & )*ddwd
14933  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + w(i, j, k+1, irho)&
14934 & *ddwd
14935  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivy)*ddwd
14936  wd(i, j, k, ivy) = wd(i, j, k, ivy) - w(i, j, k, irho)*ddwd
14937  call popreal8(dru)
14938  dis2d = dis2d + ddw*drud
14939  ddwd = dis2*drud
14940  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, ivx&
14941 & )*ddwd
14942  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + w(i, j, k+1, irho)&
14943 & *ddwd
14944  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivx)*ddwd
14945  wd(i, j, k, ivx) = wd(i, j, k, ivx) - w(i, j, k, irho)*ddwd
14946  ddw = w(i, j, k+1, irho) - w(i, j, k, irho)
14947  call popreal8(dr)
14948  dis2d = dis2d + ddw*drd
14949  ddwd = dis2*drd
14950  call popreal8(ddw)
14951  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + ddwd
14952  wd(i, j, k, irho) = wd(i, j, k, irho) - ddwd
14953  call popreal8(dis2)
14954  min3d = fis2*ppor*dis2d
14955  call popcontrol1b(branch)
14956  if (branch .eq. 0) then
14957  y3d = min3d
14958  else
14959  y3d = 0.0_8
14960  end if
14961  call popcontrol1b(branch)
14962  if (branch .eq. 0) then
14963  dp2d = dp2d + y3d
14964  dp1d = 0.0_8
14965  else
14966  dp1d = y3d
14967  end if
14968  call popreal8(ppor)
14969  call popcontrol1b(branch)
14970  if (branch .eq. 0) then
14971  x6d = dp2d
14972  else
14973  x6d = -dp2d
14974  end if
14975  temp2 = omega*(shocksensor(i, j, k+2)+two*shocksensor(i, j, &
14976 & k+1)+shocksensor(i, j, k)) + oneminomega*(abs6+abs12) + &
14977 & plim
14978  plimd = plimd - (shocksensor(i, j, k+2)-two*shocksensor(i, j&
14979 & , k+1)+shocksensor(i, j, k))*x6d/temp2**2
14980  call popcontrol1b(branch)
14981  if (branch .eq. 0) then
14982  call popreal8(abs12)
14983  else
14984  call popreal8(abs12)
14985  end if
14986  call popcontrol1b(branch)
14987  if (branch .eq. 0) then
14988  call popreal8(abs6)
14989  else
14990  call popreal8(abs6)
14991  end if
14992  end do
14993  call popcontrol1b(branch)
14994  if (branch .eq. 0) then
14995  x5d = dp1d
14996  else
14997  x5d = -dp1d
14998  end if
14999  temp2 = omega*(shocksensor(i, j, 2)+two*shocksensor(i, j, 1)+&
15000 & shocksensor(i, j, 0)) + oneminomega*(abs5+abs11) + plim
15001  plimd = plimd - (shocksensor(i, j, 2)-two*shocksensor(i, j, 1)&
15002 & +shocksensor(i, j, 0))*x5d/temp2**2
15003  call popcontrol1b(branch)
15004  if (branch .eq. 0) then
15005  call popreal8(abs11)
15006  else
15007  call popreal8(abs11)
15008  end if
15009  call popcontrol1b(branch)
15010  if (branch .eq. 0) then
15011  call popreal8(abs5)
15012  else
15013  call popreal8(abs5)
15014  end if
15015  end do
15016  end do
15017  do k=kl,2,-1
15018  do i=il,2,-1
15019  dp1d = 0.0_8
15020  do j=jl,1,-1
15021  dp2d = dp1d
15022  fsd = fwd(i, j+1, k, irhoe) - fwd(i, j, k, irhoe)
15023  wavg = half*(w(i, j+1, k, ivz)+w(i, j, k, ivz))
15024  vavg = half*(w(i, j+1, k, ivy)+w(i, j, k, ivy))
15025  uavg = half*(w(i, j+1, k, ivx)+w(i, j, k, ivx))
15026  unavg = uavg*sx + vavg*sy + wavg*sz
15027  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
15028  ovaavg = one/aavg
15029  ova2avg = one/a2avg
15030  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
15031  abv7 = abv2*abv4*ovaavg + abv3*abv5
15032  lam3d = dre*fsd
15033  dred = lam3*fsd
15034  havgd = abv6*fsd
15035  abv6d = havg*fsd
15036  unavgd = abv7*fsd
15037  abv7d = unavg*fsd
15038  fsd = fwd(i, j+1, k, imz) - fwd(i, j, k, imz)
15039  lam3d = lam3d + drw*fsd
15040  drwd = lam3*fsd
15041  wavgd = abv6*fsd
15042  abv6d = abv6d + wavg*fsd
15043  szd = abv7*fsd
15044  abv7d = abv7d + sz*fsd
15045  fsd = fwd(i, j+1, k, imy) - fwd(i, j, k, imy)
15046  lam3d = lam3d + drv*fsd
15047  drvd = lam3*fsd
15048  vavgd = abv6*fsd
15049  abv6d = abv6d + vavg*fsd
15050  syd = abv7*fsd
15051  abv7d = abv7d + sy*fsd
15052  fsd = fwd(i, j+1, k, imx) - fwd(i, j, k, imx)
15053  lam3d = lam3d + dru*fsd
15054  drud = lam3*fsd
15055  uavgd = abv6*fsd
15056  abv6d = abv6d + uavg*fsd
15057  sxd = abv7*fsd
15058  abv7d = abv7d + sx*fsd
15059  fsd = fwd(i, j+1, k, irho) - fwd(i, j, k, irho)
15060  abv6d = abv6d + fsd
15061  abv2d = abv4*ovaavg*abv7d + abv5*ovaavg*abv6d
15062  abv4d = abv2*ovaavg*abv7d + abv3*ova2avg*abv6d
15063  ovaavgd = abv2*abv4*abv7d + abv2*abv5*abv6d
15064  abv3d = abv5*abv7d + abv4*ova2avg*abv6d
15065  lam3d = lam3d + dr*fsd - abv3d
15066  abv5d = abv3*abv7d + abv2*ovaavg*abv6d
15067  ova2avgd = abv3*abv4*abv6d
15068  sxd = sxd + dru*abv5d
15069  syd = syd + drv*abv5d
15070  szd = szd + drw*abv5d
15071  unavgd = unavgd - dr*abv5d
15072  gammaavg = half*(gamma(i, j+1, k)+gamma(i, j, k))
15073  gm1 = gammaavg - one
15074  gm53 = gammaavg - five*third
15075  alphaavg = half*(uavg**2+vavg**2+wavg**2)
15076  call popreal8(abv4)
15077  tempd0 = gm1*abv4d
15078  drd = lam3*fsd + alphaavg*tempd0 - unavg*abv5d
15079  drud = drud + sx*abv5d - uavg*tempd0
15080  drvd = drvd + sy*abv5d - vavg*tempd0
15081  drwd = drwd + sz*abv5d - wavg*tempd0
15082  drkd = -(gm53*abv4d)
15083  alphaavgd = dr*tempd0
15084  uavgd = uavgd - dru*tempd0
15085  vavgd = vavgd - drv*tempd0
15086  dred = dred + tempd0
15087  wavgd = wavgd - drw*tempd0
15088  call popreal8(abv3)
15089  abv1d = abv3d
15090  call popreal8(abv2)
15091  lam1d = half*abv2d + half*abv1d
15092  lam2d = half*abv1d - half*abv2d
15093  call popreal8(lam3)
15094  call popreal8(lam2)
15095  call popreal8(lam1)
15096  aread = lam3*lam3d + lam2*lam2d + lam1*lam1d
15097  lam3d = area*lam3d
15098  lam2d = area*lam2d
15099  lam1d = area*lam1d
15100  call popcontrol1b(branch)
15101  if (branch .eq. 0) then
15102  rradd = epsshear*lam3d
15103  lam3d = 0.0_8
15104  else
15105  rradd = 0.0_8
15106  end if
15107  call popcontrol1b(branch)
15108  if (branch .eq. 0) then
15109  rradd = rradd + epsacoustic*lam2d
15110  lam2d = 0.0_8
15111  end if
15112  call popcontrol1b(branch)
15113  if (branch .eq. 0) then
15114  rradd = rradd + epsacoustic*lam1d
15115  lam1d = 0.0_8
15116  end if
15117  lam3d = lam3d + rradd
15118  aavgd = rradd
15119  call popcontrol1b(branch)
15120  if (branch .eq. 0) then
15121  call popreal8(lam3)
15122  unavgd = unavgd + lam3d
15123  sfaced = sfaced - lam3d
15124  else
15125  call popreal8(lam3)
15126  sfaced = sfaced + lam3d
15127  unavgd = unavgd - lam3d
15128  end if
15129  call popcontrol1b(branch)
15130  if (branch .eq. 0) then
15131  unavgd = unavgd + lam2d
15132  sfaced = sfaced - lam2d
15133  aavgd = aavgd - lam2d
15134  else
15135  sfaced = sfaced + lam2d
15136  unavgd = unavgd - lam2d
15137  aavgd = aavgd + lam2d
15138  end if
15139  call popcontrol1b(branch)
15140  if (branch .eq. 0) then
15141  unavgd = unavgd + lam1d
15142  sfaced = sfaced - lam1d
15143  aavgd = aavgd + lam1d
15144  else
15145  sfaced = sfaced + lam1d
15146  unavgd = unavgd - lam1d
15147  aavgd = aavgd - lam1d
15148  end if
15149  tmp = one/max2
15150  call popcontrol1b(branch)
15151  if (branch .eq. 0) then
15152  tmpd = 0.0_8
15153  else
15154  sfacejd(i, j, k) = sfacejd(i, j, k) + tmp*sfaced
15155  tmpd = sfacej(i, j, k)*sfaced
15156  sfaced = 0.0_8
15157  end if
15158  alphaavgd = alphaavgd + havgd
15159  tempd0 = half*alphaavgd
15160  ovgm1 = one/gm1
15161  aavgd = aavgd - one*ovaavgd/aavg**2
15162  if (a2avg .eq. 0.0_8) then
15163  a2avgd = ovgm1*havgd - one*ova2avgd/a2avg**2
15164  else
15165  a2avgd = aavgd/(2.0*sqrt(a2avg)) - one*ova2avgd/a2avg**2 +&
15166 & ovgm1*havgd
15167  end if
15168  uavgd = uavgd + sx*unavgd + 2*uavg*tempd0
15169  sxd = sxd + uavg*unavgd
15170  vavgd = vavgd + sy*unavgd + 2*vavg*tempd0
15171  syd = syd + vavg*unavgd
15172  wavgd = wavgd + sz*unavgd + 2*wavg*tempd0
15173  szd = szd + wavg*unavgd
15174  call popreal8(aavg)
15175  call popreal8(havg)
15176  kavgd = -(gm53*ovgm1*havgd)
15177  call popreal8(sz)
15178  call popreal8(sy)
15179  call popreal8(sx)
15180  tmpd = tmpd + sz*szd + sy*syd + sx*sxd
15181  szd = tmp*szd
15182  syd = tmp*syd
15183  sxd = tmp*sxd
15184  max2d = -(one*tmpd/max2**2)
15185  call popcontrol1b(branch)
15186  if (branch .eq. 0) then
15187  call popreal8(max2)
15188  aread = aread + max2d
15189  else
15190  call popreal8(max2)
15191  end if
15192  call popreal8(area)
15193  if (sx**2 + sy**2 + sz**2 .eq. 0.0_8) then
15194  tempd0 = 0.0_8
15195  else
15196  tempd0 = aread/(2.0*sqrt(sx**2+sy**2+sz**2))
15197  end if
15198  sxd = sxd + 2*sx*tempd0
15199  syd = syd + 2*sy*tempd0
15200  szd = szd + 2*sz*tempd0
15201  call popreal8(sz)
15202  sjd(i, j, k, 3) = sjd(i, j, k, 3) + szd
15203  call popreal8(sy)
15204  sjd(i, j, k, 2) = sjd(i, j, k, 2) + syd
15205  call popreal8(sx)
15206  sjd(i, j, k, 1) = sjd(i, j, k, 1) + sxd
15207  call popreal8(a2avg)
15208  temp2 = w(i, j+1, k, irho)
15209  temp0 = w(i, j, k, irho)
15210  tempd1 = gamma(i, j+1, k)*half*a2avgd/temp2
15211  tempd2 = gamma(i, j, k)*half*a2avgd/temp0
15212  pd(i, j, k) = pd(i, j, k) + tempd2
15213  wd(i, j, k, irho) = wd(i, j, k, irho) - p(i, j, k)*tempd2/&
15214 & temp0
15215  pd(i, j+1, k) = pd(i, j+1, k) + tempd1
15216  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) - p(i, j+1, k)*&
15217 & tempd1/temp2
15218  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + half*wavgd
15219  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wavgd
15220  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + half*vavgd
15221  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vavgd
15222  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + half*uavgd
15223  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*uavgd
15224  call popcontrol1b(branch)
15225  if (branch .eq. 0) then
15226  dis2d = 0.0_8
15227  else
15228  wd(i, j, k, itu1) = wd(i, j, k, itu1) + half*kavgd
15229  wd(i, j+1, k, itu1) = wd(i, j+1, k, itu1) + half*kavgd
15230  dis2d = ddw*drkd
15231  ddwd = dis2*drkd
15232  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, &
15233 & itu1)*ddwd
15234  wd(i, j+1, k, itu1) = wd(i, j+1, k, itu1) + w(i, j+1, k, &
15235 & irho)*ddwd
15236  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, itu1)*&
15237 & ddwd
15238  wd(i, j, k, itu1) = wd(i, j, k, itu1) - w(i, j, k, irho)*&
15239 & ddwd
15240  ddw = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
15241  end if
15242  call popreal8(dre)
15243  dis2d = dis2d + ddw*dred
15244  ddwd = dis2*dred
15245  call popreal8(ddw)
15246  wd(i, j+1, k, irhoe) = wd(i, j+1, k, irhoe) + ddwd
15247  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddwd
15248  call popreal8(drw)
15249  dis2d = dis2d + ddw*drwd
15250  ddwd = dis2*drwd
15251  call popreal8(ddw)
15252  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, ivz&
15253 & )*ddwd
15254  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + w(i, j+1, k, irho)&
15255 & *ddwd
15256  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivz)*ddwd
15257  wd(i, j, k, ivz) = wd(i, j, k, ivz) - w(i, j, k, irho)*ddwd
15258  call popreal8(drv)
15259  dis2d = dis2d + ddw*drvd
15260  ddwd = dis2*drvd
15261  call popreal8(ddw)
15262  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, ivy&
15263 & )*ddwd
15264  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + w(i, j+1, k, irho)&
15265 & *ddwd
15266  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivy)*ddwd
15267  wd(i, j, k, ivy) = wd(i, j, k, ivy) - w(i, j, k, irho)*ddwd
15268  call popreal8(dru)
15269  dis2d = dis2d + ddw*drud
15270  ddwd = dis2*drud
15271  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, ivx&
15272 & )*ddwd
15273  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + w(i, j+1, k, irho)&
15274 & *ddwd
15275  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivx)*ddwd
15276  wd(i, j, k, ivx) = wd(i, j, k, ivx) - w(i, j, k, irho)*ddwd
15277  ddw = w(i, j+1, k, irho) - w(i, j, k, irho)
15278  call popreal8(dr)
15279  dis2d = dis2d + ddw*drd
15280  ddwd = dis2*drd
15281  call popreal8(ddw)
15282  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + ddwd
15283  wd(i, j, k, irho) = wd(i, j, k, irho) - ddwd
15284  call popreal8(dis2)
15285  min2d = fis2*ppor*dis2d
15286  call popcontrol1b(branch)
15287  if (branch .eq. 0) then
15288  y2d = min2d
15289  else
15290  y2d = 0.0_8
15291  end if
15292  call popcontrol1b(branch)
15293  if (branch .eq. 0) then
15294  dp2d = dp2d + y2d
15295  dp1d = 0.0_8
15296  else
15297  dp1d = y2d
15298  end if
15299  call popreal8(ppor)
15300  call popcontrol1b(branch)
15301  if (branch .eq. 0) then
15302  x4d = dp2d
15303  else
15304  x4d = -dp2d
15305  end if
15306  temp2 = omega*(shocksensor(i, j+2, k)+two*shocksensor(i, j+1&
15307 & , k)+shocksensor(i, j, k)) + oneminomega*(abs4+abs10) + &
15308 & plim
15309  plimd = plimd - (shocksensor(i, j+2, k)-two*shocksensor(i, j&
15310 & +1, k)+shocksensor(i, j, k))*x4d/temp2**2
15311  call popcontrol1b(branch)
15312  if (branch .eq. 0) then
15313  call popreal8(abs10)
15314  else
15315  call popreal8(abs10)
15316  end if
15317  call popcontrol1b(branch)
15318  if (branch .eq. 0) then
15319  call popreal8(abs4)
15320  else
15321  call popreal8(abs4)
15322  end if
15323  end do
15324  call popcontrol1b(branch)
15325  if (branch .eq. 0) then
15326  x3d = dp1d
15327  else
15328  x3d = -dp1d
15329  end if
15330  temp2 = omega*(shocksensor(i, 2, k)+two*shocksensor(i, 1, k)+&
15331 & shocksensor(i, 0, k)) + oneminomega*(abs3+abs9) + plim
15332  plimd = plimd - (shocksensor(i, 2, k)-two*shocksensor(i, 1, k)&
15333 & +shocksensor(i, 0, k))*x3d/temp2**2
15334  call popcontrol1b(branch)
15335  if (branch .eq. 0) then
15336  call popreal8(abs9)
15337  else
15338  call popreal8(abs9)
15339  end if
15340  call popcontrol1b(branch)
15341  if (branch .eq. 0) then
15342  call popreal8(abs3)
15343  else
15344  call popreal8(abs3)
15345  end if
15346  end do
15347  end do
15348  do k=kl,2,-1
15349  do j=jl,2,-1
15350  dp1d = 0.0_8
15351  do i=il,1,-1
15352  dp2d = dp1d
15353  fsd = fwd(i+1, j, k, irhoe) - fwd(i, j, k, irhoe)
15354  wavg = half*(w(i+1, j, k, ivz)+w(i, j, k, ivz))
15355  vavg = half*(w(i+1, j, k, ivy)+w(i, j, k, ivy))
15356  uavg = half*(w(i+1, j, k, ivx)+w(i, j, k, ivx))
15357  unavg = uavg*sx + vavg*sy + wavg*sz
15358  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
15359  ovaavg = one/aavg
15360  ova2avg = one/a2avg
15361  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
15362  abv7 = abv2*abv4*ovaavg + abv3*abv5
15363  lam3d = dre*fsd
15364  dred = lam3*fsd
15365  havgd = abv6*fsd
15366  abv6d = havg*fsd
15367  unavgd = abv7*fsd
15368  abv7d = unavg*fsd
15369  fsd = fwd(i+1, j, k, imz) - fwd(i, j, k, imz)
15370  lam3d = lam3d + drw*fsd
15371  drwd = lam3*fsd
15372  wavgd = abv6*fsd
15373  abv6d = abv6d + wavg*fsd
15374  szd = abv7*fsd
15375  abv7d = abv7d + sz*fsd
15376  fsd = fwd(i+1, j, k, imy) - fwd(i, j, k, imy)
15377  lam3d = lam3d + drv*fsd
15378  drvd = lam3*fsd
15379  vavgd = abv6*fsd
15380  abv6d = abv6d + vavg*fsd
15381  syd = abv7*fsd
15382  abv7d = abv7d + sy*fsd
15383  fsd = fwd(i+1, j, k, imx) - fwd(i, j, k, imx)
15384  lam3d = lam3d + dru*fsd
15385  drud = lam3*fsd
15386  uavgd = abv6*fsd
15387  abv6d = abv6d + uavg*fsd
15388  sxd = abv7*fsd
15389  abv7d = abv7d + sx*fsd
15390  fsd = fwd(i+1, j, k, irho) - fwd(i, j, k, irho)
15391  abv6d = abv6d + fsd
15392  abv2d = abv4*ovaavg*abv7d + abv5*ovaavg*abv6d
15393  abv4d = abv2*ovaavg*abv7d + abv3*ova2avg*abv6d
15394  ovaavgd = abv2*abv4*abv7d + abv2*abv5*abv6d
15395  abv3d = abv5*abv7d + abv4*ova2avg*abv6d
15396  lam3d = lam3d + dr*fsd - abv3d
15397  abv5d = abv3*abv7d + abv2*ovaavg*abv6d
15398  ova2avgd = abv3*abv4*abv6d
15399  sxd = sxd + dru*abv5d
15400  syd = syd + drv*abv5d
15401  szd = szd + drw*abv5d
15402  unavgd = unavgd - dr*abv5d
15403  gammaavg = half*(gamma(i+1, j, k)+gamma(i, j, k))
15404  gm1 = gammaavg - one
15405  gm53 = gammaavg - five*third
15406  alphaavg = half*(uavg**2+vavg**2+wavg**2)
15407  call popreal8(abv4)
15408  tempd0 = gm1*abv4d
15409  drd = lam3*fsd + alphaavg*tempd0 - unavg*abv5d
15410  drud = drud + sx*abv5d - uavg*tempd0
15411  drvd = drvd + sy*abv5d - vavg*tempd0
15412  drwd = drwd + sz*abv5d - wavg*tempd0
15413  drkd = -(gm53*abv4d)
15414  alphaavgd = dr*tempd0
15415  uavgd = uavgd - dru*tempd0
15416  vavgd = vavgd - drv*tempd0
15417  dred = dred + tempd0
15418  wavgd = wavgd - drw*tempd0
15419  call popreal8(abv3)
15420  abv1d = abv3d
15421  call popreal8(abv2)
15422  lam1d = half*abv2d + half*abv1d
15423  lam2d = half*abv1d - half*abv2d
15424  call popreal8(lam3)
15425  call popreal8(lam2)
15426  call popreal8(lam1)
15427  aread = lam3*lam3d + lam2*lam2d + lam1*lam1d
15428  lam3d = area*lam3d
15429  lam2d = area*lam2d
15430  lam1d = area*lam1d
15431  call popcontrol1b(branch)
15432  if (branch .eq. 0) then
15433  rradd = epsshear*lam3d
15434  lam3d = 0.0_8
15435  else
15436  rradd = 0.0_8
15437  end if
15438  call popcontrol1b(branch)
15439  if (branch .eq. 0) then
15440  rradd = rradd + epsacoustic*lam2d
15441  lam2d = 0.0_8
15442  end if
15443  call popcontrol1b(branch)
15444  if (branch .eq. 0) then
15445  rradd = rradd + epsacoustic*lam1d
15446  lam1d = 0.0_8
15447  end if
15448  lam3d = lam3d + rradd
15449  aavgd = rradd
15450  call popcontrol1b(branch)
15451  if (branch .eq. 0) then
15452  call popreal8(lam3)
15453  unavgd = unavgd + lam3d
15454  sfaced = sfaced - lam3d
15455  else
15456  call popreal8(lam3)
15457  sfaced = sfaced + lam3d
15458  unavgd = unavgd - lam3d
15459  end if
15460  call popcontrol1b(branch)
15461  if (branch .eq. 0) then
15462  unavgd = unavgd + lam2d
15463  sfaced = sfaced - lam2d
15464  aavgd = aavgd - lam2d
15465  else
15466  sfaced = sfaced + lam2d
15467  unavgd = unavgd - lam2d
15468  aavgd = aavgd + lam2d
15469  end if
15470  call popcontrol1b(branch)
15471  if (branch .eq. 0) then
15472  unavgd = unavgd + lam1d
15473  sfaced = sfaced - lam1d
15474  aavgd = aavgd + lam1d
15475  else
15476  sfaced = sfaced + lam1d
15477  unavgd = unavgd - lam1d
15478  aavgd = aavgd - lam1d
15479  end if
15480  tmp = one/max1
15481  call popcontrol1b(branch)
15482  if (branch .eq. 0) then
15483  tmpd = 0.0_8
15484  else
15485  sfaceid(i, j, k) = sfaceid(i, j, k) + tmp*sfaced
15486  tmpd = sfacei(i, j, k)*sfaced
15487  sfaced = 0.0_8
15488  end if
15489  alphaavgd = alphaavgd + havgd
15490  tempd0 = half*alphaavgd
15491  ovgm1 = one/gm1
15492  aavgd = aavgd - one*ovaavgd/aavg**2
15493  if (a2avg .eq. 0.0_8) then
15494  a2avgd = ovgm1*havgd - one*ova2avgd/a2avg**2
15495  else
15496  a2avgd = aavgd/(2.0*sqrt(a2avg)) - one*ova2avgd/a2avg**2 +&
15497 & ovgm1*havgd
15498  end if
15499  uavgd = uavgd + sx*unavgd + 2*uavg*tempd0
15500  sxd = sxd + uavg*unavgd
15501  vavgd = vavgd + sy*unavgd + 2*vavg*tempd0
15502  syd = syd + vavg*unavgd
15503  wavgd = wavgd + sz*unavgd + 2*wavg*tempd0
15504  szd = szd + wavg*unavgd
15505  call popreal8(aavg)
15506  call popreal8(havg)
15507  kavgd = -(gm53*ovgm1*havgd)
15508  call popreal8(sz)
15509  call popreal8(sy)
15510  call popreal8(sx)
15511  tmpd = tmpd + sz*szd + sy*syd + sx*sxd
15512  szd = tmp*szd
15513  syd = tmp*syd
15514  sxd = tmp*sxd
15515  max1d = -(one*tmpd/max1**2)
15516  call popcontrol1b(branch)
15517  if (branch .eq. 0) then
15518  call popreal8(max1)
15519  aread = aread + max1d
15520  else
15521  call popreal8(max1)
15522  end if
15523  call popreal8(area)
15524  if (sx**2 + sy**2 + sz**2 .eq. 0.0_8) then
15525  tempd0 = 0.0_8
15526  else
15527  tempd0 = aread/(2.0*sqrt(sx**2+sy**2+sz**2))
15528  end if
15529  sxd = sxd + 2*sx*tempd0
15530  syd = syd + 2*sy*tempd0
15531  szd = szd + 2*sz*tempd0
15532  call popreal8(sz)
15533  sid(i, j, k, 3) = sid(i, j, k, 3) + szd
15534  call popreal8(sy)
15535  sid(i, j, k, 2) = sid(i, j, k, 2) + syd
15536  call popreal8(sx)
15537  sid(i, j, k, 1) = sid(i, j, k, 1) + sxd
15538  call popreal8(a2avg)
15539  temp = w(i+1, j, k, irho)
15540  temp1 = w(i, j, k, irho)
15541  tempd = gamma(i+1, j, k)*half*a2avgd/temp
15542  tempd0 = gamma(i, j, k)*half*a2avgd/temp1
15543  pd(i, j, k) = pd(i, j, k) + tempd0
15544  wd(i, j, k, irho) = wd(i, j, k, irho) - p(i, j, k)*tempd0/&
15545 & temp1
15546  pd(i+1, j, k) = pd(i+1, j, k) + tempd
15547  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) - p(i+1, j, k)*&
15548 & tempd/temp
15549  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + half*wavgd
15550  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wavgd
15551  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + half*vavgd
15552  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vavgd
15553  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + half*uavgd
15554  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*uavgd
15555  call popcontrol1b(branch)
15556  if (branch .eq. 0) then
15557  dis2d = 0.0_8
15558  else
15559  wd(i, j, k, itu1) = wd(i, j, k, itu1) + half*kavgd
15560  wd(i+1, j, k, itu1) = wd(i+1, j, k, itu1) + half*kavgd
15561  dis2d = ddw*drkd
15562  ddwd = dis2*drkd
15563  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, &
15564 & itu1)*ddwd
15565  wd(i+1, j, k, itu1) = wd(i+1, j, k, itu1) + w(i+1, j, k, &
15566 & irho)*ddwd
15567  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, itu1)*&
15568 & ddwd
15569  wd(i, j, k, itu1) = wd(i, j, k, itu1) - w(i, j, k, irho)*&
15570 & ddwd
15571  ddw = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
15572  end if
15573  call popreal8(dre)
15574  dis2d = dis2d + ddw*dred
15575  ddwd = dis2*dred
15576  call popreal8(ddw)
15577  wd(i+1, j, k, irhoe) = wd(i+1, j, k, irhoe) + ddwd
15578  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddwd
15579  call popreal8(drw)
15580  dis2d = dis2d + ddw*drwd
15581  ddwd = dis2*drwd
15582  call popreal8(ddw)
15583  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, ivz&
15584 & )*ddwd
15585  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + w(i+1, j, k, irho)&
15586 & *ddwd
15587  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivz)*ddwd
15588  wd(i, j, k, ivz) = wd(i, j, k, ivz) - w(i, j, k, irho)*ddwd
15589  call popreal8(drv)
15590  dis2d = dis2d + ddw*drvd
15591  ddwd = dis2*drvd
15592  call popreal8(ddw)
15593  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, ivy&
15594 & )*ddwd
15595  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + w(i+1, j, k, irho)&
15596 & *ddwd
15597  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivy)*ddwd
15598  wd(i, j, k, ivy) = wd(i, j, k, ivy) - w(i, j, k, irho)*ddwd
15599  call popreal8(dru)
15600  dis2d = dis2d + ddw*drud
15601  ddwd = dis2*drud
15602  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, ivx&
15603 & )*ddwd
15604  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + w(i+1, j, k, irho)&
15605 & *ddwd
15606  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivx)*ddwd
15607  wd(i, j, k, ivx) = wd(i, j, k, ivx) - w(i, j, k, irho)*ddwd
15608  ddw = w(i+1, j, k, irho) - w(i, j, k, irho)
15609  call popreal8(dr)
15610  dis2d = dis2d + ddw*drd
15611  ddwd = dis2*drd
15612  call popreal8(ddw)
15613  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + ddwd
15614  wd(i, j, k, irho) = wd(i, j, k, irho) - ddwd
15615  call popreal8(dis2)
15616  min1d = fis2*ppor*dis2d
15617  call popcontrol1b(branch)
15618  if (branch .eq. 0) then
15619  y1d = min1d
15620  else
15621  y1d = 0.0_8
15622  end if
15623  call popcontrol1b(branch)
15624  if (branch .eq. 0) then
15625  dp2d = dp2d + y1d
15626  dp1d = 0.0_8
15627  else
15628  dp1d = y1d
15629  end if
15630  call popreal8(ppor)
15631  call popcontrol1b(branch)
15632  if (branch .eq. 0) then
15633  x2d = dp2d
15634  else
15635  x2d = -dp2d
15636  end if
15637  temp = omega*(shocksensor(i+2, j, k)+two*shocksensor(i+1, j&
15638 & , k)+shocksensor(i, j, k)) + oneminomega*(abs2+abs8) + &
15639 & plim
15640  plimd = plimd - (shocksensor(i+2, j, k)-two*shocksensor(i+1&
15641 & , j, k)+shocksensor(i, j, k))*x2d/temp**2
15642  call popcontrol1b(branch)
15643  if (branch .eq. 0) then
15644  call popreal8(abs8)
15645  else
15646  call popreal8(abs8)
15647  end if
15648  call popcontrol1b(branch)
15649  if (branch .eq. 0) then
15650  call popreal8(abs2)
15651  else
15652  call popreal8(abs2)
15653  end if
15654  end do
15655  call popcontrol1b(branch)
15656  if (branch .eq. 0) then
15657  x1d = dp1d
15658  else
15659  x1d = -dp1d
15660  end if
15661  temp = omega*(shocksensor(2, j, k)+two*shocksensor(1, j, k)+&
15662 & shocksensor(0, j, k)) + oneminomega*(abs1+abs7) + plim
15663  plimd = plimd - (shocksensor(2, j, k)-two*shocksensor(1, j, k)&
15664 & +shocksensor(0, j, k))*x1d/temp**2
15665  call popcontrol1b(branch)
15666  if (branch .eq. 0) then
15667  call popreal8(abs7)
15668  else
15669  call popreal8(abs7)
15670  end if
15671  call popcontrol1b(branch)
15672  if (branch .eq. 0) then
15673  call popreal8(abs1)
15674  else
15675  call popreal8(abs1)
15676  end if
15677  end do
15678  end do
15679  do k=kl,2,-1
15680  do j=jl,2,-1
15681  do i=il,2,-1
15682  fwd(i, j, k, irhoe) = sfil*fwd(i, j, k, irhoe)
15683  fwd(i, j, k, imz) = sfil*fwd(i, j, k, imz)
15684  fwd(i, j, k, imy) = sfil*fwd(i, j, k, imy)
15685  fwd(i, j, k, imx) = sfil*fwd(i, j, k, imx)
15686  fwd(i, j, k, irho) = sfil*fwd(i, j, k, irho)
15687  end do
15688  end do
15689  end do
15690  pinfcorrd = pinfcorrd + 0.001_realtype*plimd
15691  end if
15692  end subroutine invisciddissfluxmatrixapprox_b
15693 
15695 !
15696 ! invisciddissfluxmatrix computes the matrix artificial
15697 ! dissipation term. instead of the spectral radius, as used in
15698 ! the scalar dissipation scheme, the absolute value of the flux
15699 ! jacobian is used. this leads to a less diffusive and
15700 ! consequently more accurate scheme. it is assumed that the
15701 ! pointers in blockpointers already point to the correct block.
15702 !
15703  use blockpointers
15704  use cgnsgrid
15705  use constants
15706  use flowvarrefstate
15708  use inputphysics
15709  use iteration
15710  use utils_b, only : getcorrectfork
15711  implicit none
15712 !
15713 ! local parameters.
15714 !
15715  real(kind=realtype), parameter :: dpmax=0.25_realtype
15716  real(kind=realtype), parameter :: epsacoustic=0.25_realtype
15717  real(kind=realtype), parameter :: epsshear=0.025_realtype
15718  real(kind=realtype), parameter :: omega=0.5_realtype
15719  real(kind=realtype), parameter :: oneminomega=one-omega
15720 !
15721 ! local variables.
15722 !
15723  integer(kind=inttype) :: i, j, k, ind
15724  real(kind=realtype) :: plim, sface
15725  real(kind=realtype) :: sfil, fis2, fis4
15726  real(kind=realtype) :: gammaavg, gm1, ovgm1, gm53
15727  real(kind=realtype) :: ppor, rrad, dis2
15728  real(kind=realtype) :: dp1, dp2, ddw, tmp, fs
15729  real(kind=realtype) :: dr, dru, drv, drw, dre, drk, sx, sy, sz
15730  real(kind=realtype) :: uavg, vavg, wavg, a2avg, aavg, havg
15731  real(kind=realtype) :: alphaavg, unavg, ovaavg, ova2avg
15732  real(kind=realtype) :: kavg, lam1, lam2, lam3, area
15733  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
15734  logical :: correctfork
15735  intrinsic abs
15736  intrinsic max
15737  intrinsic min
15738  intrinsic sqrt
15739  real(kind=realtype) :: x1
15740  real(kind=realtype) :: x2
15741  real(kind=realtype) :: y1
15742  real(kind=realtype) :: x3
15743  real(kind=realtype) :: x4
15744  real(kind=realtype) :: y2
15745  real(kind=realtype) :: x5
15746  real(kind=realtype) :: x6
15747  real(kind=realtype) :: y3
15748  real(kind=realtype) :: abs0
15749  real(kind=realtype) :: min1
15750  real(realtype) :: max1
15751  real(kind=realtype) :: min2
15752  real(realtype) :: max2
15753  real(kind=realtype) :: min3
15754  real(realtype) :: max3
15755  real(kind=realtype) :: abs1
15756  real(kind=realtype) :: abs2
15757  real(kind=realtype) :: abs3
15758  real(kind=realtype) :: abs4
15759  real(kind=realtype) :: abs5
15760  real(kind=realtype) :: abs6
15761  real(kind=realtype) :: abs7
15762  real(kind=realtype) :: abs8
15763  real(kind=realtype) :: abs9
15764  real(kind=realtype) :: abs10
15765  real(kind=realtype) :: abs11
15766  real(kind=realtype) :: abs12
15767  if (rfil .ge. 0.) then
15768  abs0 = rfil
15769  else
15770  abs0 = -rfil
15771  end if
15772 ! check if rfil == 0. if so, the dissipative flux needs not to
15773 ! be computed.
15774  if (abs0 .lt. thresholdreal) then
15775  return
15776  else
15777 ! set the value of plim. to be fully consistent this must have
15778 ! the dimension of a pressure. therefore a fraction of pinfcorr
15779 ! is used.
15780  plim = 0.001_realtype*pinfcorr
15781 ! determine whether or not the total energy must be corrected
15782 ! for the presence of the turbulent kinetic energy.
15783  correctfork = getcorrectfork()
15784 ! initialize sface to zero. this value will be used if the
15785 ! block is not moving.
15786  sface = zero
15787 ! set a couple of constants for the scheme.
15788  fis2 = rfil*vis2
15789  fis4 = rfil*vis4
15790  sfil = one - rfil
15791 ! initialize the dissipative residual to a certain times,
15792 ! possibly zero, the previously stored value. owned cells
15793 ! only, because the halo values do not matter.
15794  do k=2,kl
15795  do j=2,jl
15796  do i=2,il
15797  fw(i, j, k, irho) = sfil*fw(i, j, k, irho)
15798  fw(i, j, k, imx) = sfil*fw(i, j, k, imx)
15799  fw(i, j, k, imy) = sfil*fw(i, j, k, imy)
15800  fw(i, j, k, imz) = sfil*fw(i, j, k, imz)
15801  fw(i, j, k, irhoe) = sfil*fw(i, j, k, irhoe)
15802  end do
15803  end do
15804  end do
15805 !
15806 ! dissipative fluxes in the i-direction.
15807 !
15808  do k=2,kl
15809  do j=2,jl
15810  if (shocksensor(2, j, k) - shocksensor(1, j, k) .ge. 0.) then
15811  abs1 = shocksensor(2, j, k) - shocksensor(1, j, k)
15812  else
15813  abs1 = -(shocksensor(2, j, k)-shocksensor(1, j, k))
15814  end if
15815  if (shocksensor(1, j, k) - shocksensor(0, j, k) .ge. 0.) then
15816  abs7 = shocksensor(1, j, k) - shocksensor(0, j, k)
15817  else
15818  abs7 = -(shocksensor(1, j, k)-shocksensor(0, j, k))
15819  end if
15820  x1 = (shocksensor(2, j, k)-two*shocksensor(1, j, k)+&
15821 & shocksensor(0, j, k))/(omega*(shocksensor(2, j, k)+two*&
15822 & shocksensor(1, j, k)+shocksensor(0, j, k))+oneminomega*(abs1&
15823 & +abs7)+plim)
15824  if (x1 .ge. 0.) then
15825  dp1 = x1
15826  else
15827  dp1 = -x1
15828  end if
15829 ! loop in i-direction.
15830  do i=1,il
15831  if (shocksensor(i+2, j, k) - shocksensor(i+1, j, k) .ge. 0.&
15832 & ) then
15833  abs2 = shocksensor(i+2, j, k) - shocksensor(i+1, j, k)
15834  else
15835  abs2 = -(shocksensor(i+2, j, k)-shocksensor(i+1, j, k))
15836  end if
15837  if (shocksensor(i+1, j, k) - shocksensor(i, j, k) .ge. 0.) &
15838 & then
15839  abs8 = shocksensor(i+1, j, k) - shocksensor(i, j, k)
15840  else
15841  abs8 = -(shocksensor(i+1, j, k)-shocksensor(i, j, k))
15842  end if
15843  x2 = (shocksensor(i+2, j, k)-two*shocksensor(i+1, j, k)+&
15844 & shocksensor(i, j, k))/(omega*(shocksensor(i+2, j, k)+two*&
15845 & shocksensor(i+1, j, k)+shocksensor(i, j, k))+oneminomega*(&
15846 & abs2+abs8)+plim)
15847  if (x2 .ge. 0.) then
15848  dp2 = x2
15849  else
15850  dp2 = -x2
15851  end if
15852 ! compute the dissipation coefficients for this face.
15853  ppor = zero
15854  if (pori(i, j, k) .eq. normalflux) ppor = one
15855  if (dp1 .lt. dp2) then
15856  y1 = dp2
15857  else
15858  y1 = dp1
15859  end if
15860  if (dpmax .gt. y1) then
15861  min1 = y1
15862  else
15863  min1 = dpmax
15864  end if
15865  dis2 = fis2*ppor*min1 + sigma*fis4*ppor
15866 ! construct the vector of the first and third differences
15867 ! multiplied by the appropriate constants.
15868  ddw = w(i+1, j, k, irho) - w(i, j, k, irho)
15869  dr = dis2*ddw
15870  ddw = w(i+1, j, k, irho)*w(i+1, j, k, ivx) - w(i, j, k, irho&
15871 & )*w(i, j, k, ivx)
15872  dru = dis2*ddw
15873  ddw = w(i+1, j, k, irho)*w(i+1, j, k, ivy) - w(i, j, k, irho&
15874 & )*w(i, j, k, ivy)
15875  drv = dis2*ddw
15876  ddw = w(i+1, j, k, irho)*w(i+1, j, k, ivz) - w(i, j, k, irho&
15877 & )*w(i, j, k, ivz)
15878  drw = dis2*ddw
15879  ddw = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
15880  dre = dis2*ddw
15881 ! in case a k-equation is present, compute the difference
15882 ! of rhok and store the average value of k. if not present,
15883 ! set both these values to zero, such that later on no
15884 ! decision needs to be made anymore.
15885  if (correctfork) then
15886  ddw = w(i+1, j, k, irho)*w(i+1, j, k, itu1) - w(i, j, k, &
15887 & irho)*w(i, j, k, itu1)
15888  drk = dis2*ddw
15889  kavg = half*(w(i, j, k, itu1)+w(i+1, j, k, itu1))
15890  else
15891  drk = zero
15892  kavg = zero
15893  end if
15894 ! compute the average value of gamma and compute some
15895 ! expressions in which it occurs.
15896  gammaavg = half*(gamma(i+1, j, k)+gamma(i, j, k))
15897  gm1 = gammaavg - one
15898  ovgm1 = one/gm1
15899  gm53 = gammaavg - five*third
15900 ! compute the average state at the interface.
15901  uavg = half*(w(i+1, j, k, ivx)+w(i, j, k, ivx))
15902  vavg = half*(w(i+1, j, k, ivy)+w(i, j, k, ivy))
15903  wavg = half*(w(i+1, j, k, ivz)+w(i, j, k, ivz))
15904  a2avg = half*(gamma(i+1, j, k)*p(i+1, j, k)/w(i+1, j, k, &
15905 & irho)+gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
15906  sx = si(i, j, k, 1)
15907  sy = si(i, j, k, 2)
15908  sz = si(i, j, k, 3)
15909  area = sqrt(sx**2 + sy**2 + sz**2)
15910  if (1.e-25_realtype .lt. area) then
15911  max1 = area
15912  else
15913  max1 = 1.e-25_realtype
15914  end if
15915  tmp = one/max1
15916  sx = sx*tmp
15917  sy = sy*tmp
15918  sz = sz*tmp
15919  alphaavg = half*(uavg**2+vavg**2+wavg**2)
15920  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
15921  aavg = sqrt(a2avg)
15922  unavg = uavg*sx + vavg*sy + wavg*sz
15923  ovaavg = one/aavg
15924  ova2avg = one/a2avg
15925 ! the mesh velocity if the face is moving. it must be
15926 ! divided by the area to obtain a true velocity.
15927  if (addgridvelocities) sface = sfacei(i, j, k)*tmp
15928  if (unavg - sface + aavg .ge. 0.) then
15929  lam1 = unavg - sface + aavg
15930  else
15931  lam1 = -(unavg-sface+aavg)
15932  end if
15933  if (unavg - sface - aavg .ge. 0.) then
15934  lam2 = unavg - sface - aavg
15935  else
15936  lam2 = -(unavg-sface-aavg)
15937  end if
15938  if (unavg - sface .ge. 0.) then
15939  lam3 = unavg - sface
15940  else
15941  lam3 = -(unavg-sface)
15942  end if
15943  rrad = lam3 + aavg
15944  if (lam1 .lt. epsacoustic*rrad) then
15945  lam1 = epsacoustic*rrad
15946  else
15947  lam1 = lam1
15948  end if
15949  if (lam2 .lt. epsacoustic*rrad) then
15950  lam2 = epsacoustic*rrad
15951  else
15952  lam2 = lam2
15953  end if
15954  if (lam3 .lt. epsshear*rrad) then
15955  lam3 = epsshear*rrad
15956  else
15957  lam3 = lam3
15958  end if
15959 ! multiply the eigenvalues by the area to obtain
15960 ! the correct values for the dissipation term.
15961  lam1 = lam1*area
15962  lam2 = lam2*area
15963  lam3 = lam3*area
15964 ! some abbreviations, which occur quite often in the
15965 ! dissipation terms.
15966  abv1 = half*(lam1+lam2)
15967  abv2 = half*(lam1-lam2)
15968  abv3 = abv1 - lam3
15969  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
15970 & gm53*drk
15971  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
15972  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
15973  abv7 = abv2*abv4*ovaavg + abv3*abv5
15974 ! compute and scatter the dissipative flux.
15975 ! density.
15976  fs = lam3*dr + abv6
15977  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
15978  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
15979 ! x-momentum.
15980  fs = lam3*dru + uavg*abv6 + sx*abv7
15981  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
15982  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
15983 ! y-momentum.
15984  fs = lam3*drv + vavg*abv6 + sy*abv7
15985  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
15986  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
15987 ! z-momentum.
15988  fs = lam3*drw + wavg*abv6 + sz*abv7
15989  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
15990  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
15991 ! energy.
15992  fs = lam3*dre + havg*abv6 + unavg*abv7
15993  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
15994  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
15995 ! set dp1 to dp2 for the next face.
15996  dp1 = dp2
15997  end do
15998  end do
15999  end do
16000 !
16001 ! dissipative fluxes in the j-direction.
16002 !
16003  do k=2,kl
16004  do i=2,il
16005  if (shocksensor(i, 2, k) - shocksensor(i, 1, k) .ge. 0.) then
16006  abs3 = shocksensor(i, 2, k) - shocksensor(i, 1, k)
16007  else
16008  abs3 = -(shocksensor(i, 2, k)-shocksensor(i, 1, k))
16009  end if
16010  if (shocksensor(i, 1, k) - shocksensor(i, 0, k) .ge. 0.) then
16011  abs9 = shocksensor(i, 1, k) - shocksensor(i, 0, k)
16012  else
16013  abs9 = -(shocksensor(i, 1, k)-shocksensor(i, 0, k))
16014  end if
16015  x3 = (shocksensor(i, 2, k)-two*shocksensor(i, 1, k)+&
16016 & shocksensor(i, 0, k))/(omega*(shocksensor(i, 2, k)+two*&
16017 & shocksensor(i, 1, k)+shocksensor(i, 0, k))+oneminomega*(abs3&
16018 & +abs9)+plim)
16019  if (x3 .ge. 0.) then
16020  dp1 = x3
16021  else
16022  dp1 = -x3
16023  end if
16024 ! loop in j-direction.
16025  do j=1,jl
16026  if (shocksensor(i, j+2, k) - shocksensor(i, j+1, k) .ge. 0.&
16027 & ) then
16028  abs4 = shocksensor(i, j+2, k) - shocksensor(i, j+1, k)
16029  else
16030  abs4 = -(shocksensor(i, j+2, k)-shocksensor(i, j+1, k))
16031  end if
16032  if (shocksensor(i, j+1, k) - shocksensor(i, j, k) .ge. 0.) &
16033 & then
16034  abs10 = shocksensor(i, j+1, k) - shocksensor(i, j, k)
16035  else
16036  abs10 = -(shocksensor(i, j+1, k)-shocksensor(i, j, k))
16037  end if
16038  x4 = (shocksensor(i, j+2, k)-two*shocksensor(i, j+1, k)+&
16039 & shocksensor(i, j, k))/(omega*(shocksensor(i, j+2, k)+two*&
16040 & shocksensor(i, j+1, k)+shocksensor(i, j, k))+oneminomega*(&
16041 & abs4+abs10)+plim)
16042  if (x4 .ge. 0.) then
16043  dp2 = x4
16044  else
16045  dp2 = -x4
16046  end if
16047 ! compute the dissipation coefficients for this face.
16048  ppor = zero
16049  if (porj(i, j, k) .eq. normalflux) ppor = one
16050  if (dp1 .lt. dp2) then
16051  y2 = dp2
16052  else
16053  y2 = dp1
16054  end if
16055  if (dpmax .gt. y2) then
16056  min2 = y2
16057  else
16058  min2 = dpmax
16059  end if
16060  dis2 = fis2*ppor*min2 + sigma*fis4*ppor
16061 ! construct the vector of the first and third differences
16062 ! multiplied by the appropriate constants.
16063  ddw = w(i, j+1, k, irho) - w(i, j, k, irho)
16064  dr = dis2*ddw
16065  ddw = w(i, j+1, k, irho)*w(i, j+1, k, ivx) - w(i, j, k, irho&
16066 & )*w(i, j, k, ivx)
16067  dru = dis2*ddw
16068  ddw = w(i, j+1, k, irho)*w(i, j+1, k, ivy) - w(i, j, k, irho&
16069 & )*w(i, j, k, ivy)
16070  drv = dis2*ddw
16071  ddw = w(i, j+1, k, irho)*w(i, j+1, k, ivz) - w(i, j, k, irho&
16072 & )*w(i, j, k, ivz)
16073  drw = dis2*ddw
16074  ddw = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
16075  dre = dis2*ddw
16076 ! in case a k-equation is present, compute the difference
16077 ! of rhok and store the average value of k. if not present,
16078 ! set both these values to zero, such that later on no
16079 ! decision needs to be made anymore.
16080  if (correctfork) then
16081  ddw = w(i, j+1, k, irho)*w(i, j+1, k, itu1) - w(i, j, k, &
16082 & irho)*w(i, j, k, itu1)
16083  drk = dis2*ddw
16084  kavg = half*(w(i, j, k, itu1)+w(i, j+1, k, itu1))
16085  else
16086  drk = zero
16087  kavg = zero
16088  end if
16089 ! compute the average value of gamma and compute some
16090 ! expressions in which it occurs.
16091  gammaavg = half*(gamma(i, j+1, k)+gamma(i, j, k))
16092  gm1 = gammaavg - one
16093  ovgm1 = one/gm1
16094  gm53 = gammaavg - five*third
16095 ! compute the average state at the interface.
16096  uavg = half*(w(i, j+1, k, ivx)+w(i, j, k, ivx))
16097  vavg = half*(w(i, j+1, k, ivy)+w(i, j, k, ivy))
16098  wavg = half*(w(i, j+1, k, ivz)+w(i, j, k, ivz))
16099  a2avg = half*(gamma(i, j+1, k)*p(i, j+1, k)/w(i, j+1, k, &
16100 & irho)+gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
16101  sx = sj(i, j, k, 1)
16102  sy = sj(i, j, k, 2)
16103  sz = sj(i, j, k, 3)
16104  area = sqrt(sx**2 + sy**2 + sz**2)
16105  if (1.e-25_realtype .lt. area) then
16106  max2 = area
16107  else
16108  max2 = 1.e-25_realtype
16109  end if
16110  tmp = one/max2
16111  sx = sx*tmp
16112  sy = sy*tmp
16113  sz = sz*tmp
16114  alphaavg = half*(uavg**2+vavg**2+wavg**2)
16115  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
16116  aavg = sqrt(a2avg)
16117  unavg = uavg*sx + vavg*sy + wavg*sz
16118  ovaavg = one/aavg
16119  ova2avg = one/a2avg
16120 ! the mesh velocity if the face is moving. it must be
16121 ! divided by the area to obtain a true velocity.
16122  if (addgridvelocities) sface = sfacej(i, j, k)*tmp
16123  if (unavg - sface + aavg .ge. 0.) then
16124  lam1 = unavg - sface + aavg
16125  else
16126  lam1 = -(unavg-sface+aavg)
16127  end if
16128  if (unavg - sface - aavg .ge. 0.) then
16129  lam2 = unavg - sface - aavg
16130  else
16131  lam2 = -(unavg-sface-aavg)
16132  end if
16133  if (unavg - sface .ge. 0.) then
16134  lam3 = unavg - sface
16135  else
16136  lam3 = -(unavg-sface)
16137  end if
16138  rrad = lam3 + aavg
16139  if (lam1 .lt. epsacoustic*rrad) then
16140  lam1 = epsacoustic*rrad
16141  else
16142  lam1 = lam1
16143  end if
16144  if (lam2 .lt. epsacoustic*rrad) then
16145  lam2 = epsacoustic*rrad
16146  else
16147  lam2 = lam2
16148  end if
16149  if (lam3 .lt. epsshear*rrad) then
16150  lam3 = epsshear*rrad
16151  else
16152  lam3 = lam3
16153  end if
16154 ! multiply the eigenvalues by the area to obtain
16155 ! the correct values for the dissipation term.
16156  lam1 = lam1*area
16157  lam2 = lam2*area
16158  lam3 = lam3*area
16159 ! some abbreviations, which occur quite often in the
16160 ! dissipation terms.
16161  abv1 = half*(lam1+lam2)
16162  abv2 = half*(lam1-lam2)
16163  abv3 = abv1 - lam3
16164  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
16165 & gm53*drk
16166  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
16167  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
16168  abv7 = abv2*abv4*ovaavg + abv3*abv5
16169 ! compute and scatter the dissipative flux.
16170 ! density.
16171  fs = lam3*dr + abv6
16172  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
16173  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
16174 ! x-momentum.
16175  fs = lam3*dru + uavg*abv6 + sx*abv7
16176  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
16177  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
16178 ! y-momentum.
16179  fs = lam3*drv + vavg*abv6 + sy*abv7
16180  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
16181  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
16182 ! z-momentum.
16183  fs = lam3*drw + wavg*abv6 + sz*abv7
16184  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
16185  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
16186 ! energy.
16187  fs = lam3*dre + havg*abv6 + unavg*abv7
16188  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
16189  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
16190 ! set dp1 to dp2 for the next face.
16191  dp1 = dp2
16192  end do
16193  end do
16194  end do
16195 !
16196 ! dissipative fluxes in the k-direction.
16197 !
16198  do j=2,jl
16199  do i=2,il
16200  if (shocksensor(i, j, 2) - shocksensor(i, j, 1) .ge. 0.) then
16201  abs5 = shocksensor(i, j, 2) - shocksensor(i, j, 1)
16202  else
16203  abs5 = -(shocksensor(i, j, 2)-shocksensor(i, j, 1))
16204  end if
16205  if (shocksensor(i, j, 1) - shocksensor(i, j, 0) .ge. 0.) then
16206  abs11 = shocksensor(i, j, 1) - shocksensor(i, j, 0)
16207  else
16208  abs11 = -(shocksensor(i, j, 1)-shocksensor(i, j, 0))
16209  end if
16210  x5 = (shocksensor(i, j, 2)-two*shocksensor(i, j, 1)+&
16211 & shocksensor(i, j, 0))/(omega*(shocksensor(i, j, 2)+two*&
16212 & shocksensor(i, j, 1)+shocksensor(i, j, 0))+oneminomega*(abs5&
16213 & +abs11)+plim)
16214  if (x5 .ge. 0.) then
16215  dp1 = x5
16216  else
16217  dp1 = -x5
16218  end if
16219 ! loop in k-direction.
16220  do k=1,kl
16221  if (shocksensor(i, j, k+2) - shocksensor(i, j, k+1) .ge. 0.&
16222 & ) then
16223  abs6 = shocksensor(i, j, k+2) - shocksensor(i, j, k+1)
16224  else
16225  abs6 = -(shocksensor(i, j, k+2)-shocksensor(i, j, k+1))
16226  end if
16227  if (shocksensor(i, j, k+1) - shocksensor(i, j, k) .ge. 0.) &
16228 & then
16229  abs12 = shocksensor(i, j, k+1) - shocksensor(i, j, k)
16230  else
16231  abs12 = -(shocksensor(i, j, k+1)-shocksensor(i, j, k))
16232  end if
16233  x6 = (shocksensor(i, j, k+2)-two*shocksensor(i, j, k+1)+&
16234 & shocksensor(i, j, k))/(omega*(shocksensor(i, j, k+2)+two*&
16235 & shocksensor(i, j, k+1)+shocksensor(i, j, k))+oneminomega*(&
16236 & abs6+abs12)+plim)
16237  if (x6 .ge. 0.) then
16238  dp2 = x6
16239  else
16240  dp2 = -x6
16241  end if
16242 ! compute the dissipation coefficients for this face.
16243  ppor = zero
16244  if (pork(i, j, k) .eq. normalflux) ppor = one
16245  if (dp1 .lt. dp2) then
16246  y3 = dp2
16247  else
16248  y3 = dp1
16249  end if
16250  if (dpmax .gt. y3) then
16251  min3 = y3
16252  else
16253  min3 = dpmax
16254  end if
16255  dis2 = fis2*ppor*min3 + sigma*fis4*ppor
16256 ! construct the vector of the first and third differences
16257 ! multiplied by the appropriate constants.
16258  ddw = w(i, j, k+1, irho) - w(i, j, k, irho)
16259  dr = dis2*ddw
16260  ddw = w(i, j, k+1, irho)*w(i, j, k+1, ivx) - w(i, j, k, irho&
16261 & )*w(i, j, k, ivx)
16262  dru = dis2*ddw
16263  ddw = w(i, j, k+1, irho)*w(i, j, k+1, ivy) - w(i, j, k, irho&
16264 & )*w(i, j, k, ivy)
16265  drv = dis2*ddw
16266  ddw = w(i, j, k+1, irho)*w(i, j, k+1, ivz) - w(i, j, k, irho&
16267 & )*w(i, j, k, ivz)
16268  drw = dis2*ddw
16269  ddw = w(i, j, k+1, irhoe) - w(i, j, k, irhoe)
16270  dre = dis2*ddw
16271 ! in case a k-equation is present, compute the difference
16272 ! of rhok and store the average value of k. if not present,
16273 ! set both these values to zero, such that later on no
16274 ! decision needs to be made anymore.
16275  if (correctfork) then
16276  ddw = w(i, j, k+1, irho)*w(i, j, k+1, itu1) - w(i, j, k, &
16277 & irho)*w(i, j, k, itu1)
16278  drk = dis2*ddw
16279  kavg = half*(w(i, j, k+1, itu1)+w(i, j, k, itu1))
16280  else
16281  drk = zero
16282  kavg = zero
16283  end if
16284 ! compute the average value of gamma and compute some
16285 ! expressions in which it occurs.
16286  gammaavg = half*(gamma(i, j, k+1)+gamma(i, j, k))
16287  gm1 = gammaavg - one
16288  ovgm1 = one/gm1
16289  gm53 = gammaavg - five*third
16290 ! compute the average state at the interface.
16291  uavg = half*(w(i, j, k+1, ivx)+w(i, j, k, ivx))
16292  vavg = half*(w(i, j, k+1, ivy)+w(i, j, k, ivy))
16293  wavg = half*(w(i, j, k+1, ivz)+w(i, j, k, ivz))
16294  a2avg = half*(gamma(i, j, k+1)*p(i, j, k+1)/w(i, j, k+1, &
16295 & irho)+gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
16296  sx = sk(i, j, k, 1)
16297  sy = sk(i, j, k, 2)
16298  sz = sk(i, j, k, 3)
16299  area = sqrt(sx**2 + sy**2 + sz**2)
16300  if (1.e-25_realtype .lt. area) then
16301  max3 = area
16302  else
16303  max3 = 1.e-25_realtype
16304  end if
16305  tmp = one/max3
16306  sx = sx*tmp
16307  sy = sy*tmp
16308  sz = sz*tmp
16309  alphaavg = half*(uavg**2+vavg**2+wavg**2)
16310  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
16311  aavg = sqrt(a2avg)
16312  unavg = uavg*sx + vavg*sy + wavg*sz
16313  ovaavg = one/aavg
16314  ova2avg = one/a2avg
16315 ! the mesh velocity if the face is moving. it must be
16316 ! divided by the area to obtain a true velocity.
16317  if (addgridvelocities) sface = sfacek(i, j, k)*tmp
16318  if (unavg - sface + aavg .ge. 0.) then
16319  lam1 = unavg - sface + aavg
16320  else
16321  lam1 = -(unavg-sface+aavg)
16322  end if
16323  if (unavg - sface - aavg .ge. 0.) then
16324  lam2 = unavg - sface - aavg
16325  else
16326  lam2 = -(unavg-sface-aavg)
16327  end if
16328  if (unavg - sface .ge. 0.) then
16329  lam3 = unavg - sface
16330  else
16331  lam3 = -(unavg-sface)
16332  end if
16333  rrad = lam3 + aavg
16334  if (lam1 .lt. epsacoustic*rrad) then
16335  lam1 = epsacoustic*rrad
16336  else
16337  lam1 = lam1
16338  end if
16339  if (lam2 .lt. epsacoustic*rrad) then
16340  lam2 = epsacoustic*rrad
16341  else
16342  lam2 = lam2
16343  end if
16344  if (lam3 .lt. epsshear*rrad) then
16345  lam3 = epsshear*rrad
16346  else
16347  lam3 = lam3
16348  end if
16349 ! multiply the eigenvalues by the area to obtain
16350 ! the correct values for the dissipation term.
16351  lam1 = lam1*area
16352  lam2 = lam2*area
16353  lam3 = lam3*area
16354 ! some abbreviations, which occur quite often in the
16355 ! dissipation terms.
16356  abv1 = half*(lam1+lam2)
16357  abv2 = half*(lam1-lam2)
16358  abv3 = abv1 - lam3
16359  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
16360 & gm53*drk
16361  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
16362  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
16363  abv7 = abv2*abv4*ovaavg + abv3*abv5
16364 ! compute and scatter the dissipative flux.
16365 ! density.
16366  fs = lam3*dr + abv6
16367  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) + fs
16368  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
16369 ! x-momentum.
16370  fs = lam3*dru + uavg*abv6 + sx*abv7
16371  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fs
16372  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
16373 ! y-momentum.
16374  fs = lam3*drv + vavg*abv6 + sy*abv7
16375  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fs
16376  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
16377 ! z-momentum.
16378  fs = lam3*drw + wavg*abv6 + sz*abv7
16379  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fs
16380  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
16381 ! energy.
16382  fs = lam3*dre + havg*abv6 + unavg*abv7
16383  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + fs
16384  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
16385 ! set dp1 to dp2 for the next face.
16386  dp1 = dp2
16387  end do
16388  end do
16389  end do
16390  end if
16391  end subroutine invisciddissfluxmatrixapprox
16392 ! ----------------------------------------------------------------------
16393 ! |
16394 ! no tapenade routine below this line |
16395 ! |
16396 ! ----------------------------------------------------------------------
16397 
16398 end module fluxes_b
16399 
subroutine riemannflux_b(left, leftd, right, rightd, flux, fluxd)
Definition: fluxes_b.f90:6567
subroutine leftrightstate_b(du1, du1d, du2, du2d, du3, du3d, rotmatrix, left, leftd, right, rightd)
Definition: fluxes_b.f90:5610
subroutine riemannflux(left, right, flux)
Definition: fluxes_d.f90:5366
subroutine leftrightstate(du1, du2, du3, rotmatrix, left, right)
Definition: fluxes_d.f90:4708
real(kind=realtype), dimension(:, :, :), pointer sfacek
integer(kind=inttype), dimension(:, :), pointer viscjminpointer
real(kind=realtype), dimension(:, :, :), pointer gamma
real(kind=realtype), dimension(:, :, :), pointer qz
real(kind=realtype), dimension(:, :, :, :), pointer fwd
real(kind=realtype), dimension(:, :, :), pointer radid
logical addgridvelocities
integer(kind=inttype) jl
real(kind=realtype), dimension(:, :, :), pointer wzd
real(kind=realtype), dimension(:, :, :), pointer aad
real(kind=realtype), dimension(:, :, :), pointer radk
integer(kind=portype), dimension(:, :, :), pointer pork
integer(kind=inttype), dimension(:, :, :), pointer indfamilyj
integer(kind=inttype), dimension(:, :), pointer viscjmaxpointer
real(kind=realtype), dimension(:, :, :, :), pointer sjd
real(kind=realtype), dimension(:, :, :), pointer vxd
real(kind=realtype), dimension(:, :, :), pointer qy
real(kind=realtype), dimension(:, :, :), pointer aa
real(kind=realtype), dimension(:, :, :), pointer uz
real(kind=realtype), dimension(:, :, :, :), pointer wd
real(kind=realtype), dimension(:, :, :), pointer uzd
integer(kind=inttype), dimension(:, :, :), pointer factfamilyj
real(kind=realtype), dimension(:, :, :), pointer vold
logical blockismoving
real(kind=realtype), dimension(:, :, :), pointer qxd
integer(kind=inttype) nx
integer(kind=inttype) spectralsol
real(kind=realtype), dimension(:, :, :), pointer p
real(kind=realtype), dimension(:, :, :), pointer radj
integer(kind=inttype) ny
integer(kind=inttype) ie
real(kind=realtype), dimension(:, :, :, :), pointer w
real(kind=realtype), dimension(:, :, :), pointer uy
integer(kind=inttype), dimension(:, :, :), pointer indfamilyk
real(kind=realtype), dimension(:, :, :), pointer sfacei
type(viscsubfacetype), dimension(:), pointer viscsubface
integer(kind=portype), dimension(:, :, :), pointer porj
real(kind=realtype), dimension(:, :, :), pointer wyd
real(kind=realtype), dimension(:, :, :), pointer revd
integer(kind=portype), dimension(:, :, :), pointer pori
real(kind=realtype), dimension(:, :, :), pointer wx
real(kind=realtype), dimension(:, :, :), pointer radjd
integer(kind=inttype) nbkglobal
integer(kind=inttype), dimension(:, :), pointer viscimaxpointer
real(kind=realtype), dimension(:, :, :, :), pointer skd
integer(kind=inttype) jb
real(kind=realtype), dimension(:, :, :), pointer sfacejd
integer(kind=inttype) kb
real(kind=realtype), dimension(:, :, :), pointer rlv
real(kind=realtype), dimension(:, :, :, :), pointer si
real(kind=realtype), dimension(:, :, :, :), pointer sid
real(kind=realtype), dimension(:, :, :), pointer radkd
real(kind=realtype), dimension(:, :, :, :), pointer sj
integer(kind=inttype), dimension(:, :), pointer visckminpointer
integer(kind=inttype), dimension(:, :, :), pointer factfamilyi
real(kind=realtype), dimension(:, :, :), pointer uyd
real(kind=realtype), dimension(:, :, :), pointer qx
integer(kind=inttype), dimension(:, :, :), pointer factfamilyk
real(kind=realtype), dimension(:, :, :), pointer uxd
real(kind=realtype), dimension(:, :, :), pointer vz
real(kind=realtype), dimension(:, :, :, :, :), pointer rotmatrixj
real(kind=realtype), dimension(:, :, :), pointer rev
real(kind=realtype), dimension(:, :, :), pointer qyd
real(kind=realtype), dimension(:, :, :, :), pointer dw
real(kind=realtype), dimension(:, :, :, :), pointer sk
real(kind=realtype), dimension(:, :, :), pointer ux
real(kind=realtype), dimension(:, :, :), pointer shocksensor
type(viscsubfacetype), dimension(:), pointer viscsubfaced
real(kind=realtype), dimension(:, :, :), pointer wy
real(kind=realtype), dimension(:, :, :), pointer rlvd
real(kind=realtype), dimension(:, :, :), pointer wz
real(kind=realtype), dimension(:, :, :), pointer vol
real(kind=realtype), dimension(:, :, :), pointer wxd
integer(kind=inttype) ib
real(kind=realtype), dimension(:, :, :, :), pointer xd
real(kind=realtype), dimension(:, :, :), pointer sfacej
real(kind=realtype), dimension(:, :, :), pointer vy
real(kind=realtype), dimension(:, :, :, :), pointer fw
integer(kind=inttype) nz
real(kind=realtype), dimension(:, :, :), pointer vx
integer(kind=inttype) je
real(kind=realtype), dimension(:, :, :), pointer radi
real(kind=realtype), dimension(:, :, :), pointer sfacekd
integer(kind=inttype) ke
integer(kind=inttype), dimension(:, :, :), pointer indfamilyi
real(kind=realtype), dimension(:, :, :, :), pointer x
integer(kind=inttype), dimension(:, :), pointer visckmaxpointer
real(kind=realtype), dimension(:, :, :), pointer qzd
real(kind=realtype), dimension(:, :, :), pointer sfaceid
integer(kind=inttype), dimension(:, :), pointer visciminpointer
real(kind=realtype), dimension(:, :, :), pointer vzd
real(kind=realtype), dimension(:, :, :), pointer pd
real(kind=realtype), dimension(:, :, :), pointer vyd
real(kind=realtype), dimension(:, :, :, :, :), pointer rotmatrixi
real(kind=realtype), dimension(:, :, :, :), pointer dwd
integer(kind=inttype) kl
integer(kind=inttype) il
real(kind=realtype), dimension(:, :, :, :, :), pointer rotmatrixk
type(cgnsblockinfotype), dimension(:), allocatable cgnsdoms
Definition: cgnsGrid.F90:495
real(kind=realtype), dimension(:, :), allocatable massflowfamilydiss
Definition: cgnsGrid.F90:547
real(kind=realtype), dimension(:, :), allocatable massflowfamilyinv
Definition: cgnsGrid.F90:546
integer(kind=inttype), parameter roe
Definition: constants.F90:155
integer(kind=inttype), parameter vanleer
Definition: constants.F90:155
integer(kind=inttype), parameter firstorder
Definition: constants.F90:142
real(kind=realtype), parameter zero
Definition: constants.F90:71
real(kind=realtype), parameter three
Definition: constants.F90:74
real(kind=realtype), parameter third
Definition: constants.F90:81
real(kind=realtype), parameter thresholdreal
Definition: constants.F90:101
integer(kind=inttype), parameter ausmdv
Definition: constants.F90:155
real(kind=realtype), parameter eighth
Definition: constants.F90:84
integer(kind=inttype), parameter turkel
Definition: constants.F90:165
integer, parameter itu1
Definition: constants.F90:40
integer, parameter irho
Definition: constants.F90:34
integer, parameter imx
Definition: constants.F90:65
integer(kind=inttype), parameter choimerkle
Definition: constants.F90:165
integer(kind=inttype), parameter vanalbeda
Definition: constants.F90:160
integer(kind=portype), parameter boundflux
Definition: constants.F90:29
integer(kind=portype), parameter noflux
Definition: constants.F90:28
integer(kind=inttype), parameter eulerequations
Definition: constants.F90:110
integer, parameter ivx
Definition: constants.F90:35
integer(kind=portype), parameter normalflux
Definition: constants.F90:30
integer, parameter irhoe
Definition: constants.F90:38
real(kind=realtype), parameter five
Definition: constants.F90:76
integer(kind=inttype), parameter noprecond
Definition: constants.F90:165
real(kind=realtype), parameter one
Definition: constants.F90:72
real(kind=realtype), parameter half
Definition: constants.F90:80
integer(kind=inttype), parameter steady
Definition: constants.F90:115
integer, parameter ivz
Definition: constants.F90:37
real(kind=realtype), parameter two
Definition: constants.F90:73
integer(kind=inttype), parameter minmod
Definition: constants.F90:160
real(kind=realtype), parameter fourth
Definition: constants.F90:82
integer, parameter imz
Definition: constants.F90:67
integer(kind=inttype), parameter nolimiter
Definition: constants.F90:160
integer, parameter imy
Definition: constants.F90:66
integer(kind=inttype), parameter nsequations
Definition: constants.F90:110
integer, parameter ivy
Definition: constants.F90:36
integer(kind=inttype), parameter ransequations
Definition: constants.F90:110
subroutine etot_b(rho, rhod, u, ud, v, vd, w, wd, p, pd, k, kd, etotal, etotald, correctfork)
subroutine etot(rho, u, v, w, p, k, etotal, correctfork)
real(kind=realtype) gammainf
real(kind=realtype) rhoinfd
real(kind=realtype) pinfcorr
real(kind=realtype) pinfcorrd
real(kind=realtype) rgas
real(kind=realtype) trefd
real(kind=realtype) rgasd
integer(kind=inttype) nwf
real(kind=realtype) tref
integer(kind=inttype) nw
real(kind=realtype) rhoinf
real(kind=realtype) timeref
real(kind=realtype) timerefd
subroutine invisciddissfluxmatrix_b()
Definition: fluxes_b.f90:741
subroutine viscousflux()
Definition: fluxes_b.f90:10267
subroutine inviscidcentralflux_b()
Definition: fluxes_b.f90:19
subroutine inviscidcentralflux()
Definition: fluxes_b.f90:457
subroutine invisciddissfluxmatrixapprox_b()
Definition: fluxes_b.f90:13803
subroutine viscousfluxapprox_b()
Definition: fluxes_b.f90:11021
subroutine viscousfluxapprox()
Definition: fluxes_b.f90:11859
subroutine inviscidupwindflux_b(finegrid)
Definition: fluxes_b.f90:4489
subroutine invisciddissfluxmatrixapprox()
Definition: fluxes_b.f90:15695
subroutine invisciddissfluxscalarapprox()
Definition: fluxes_b.f90:13351
subroutine invisciddissfluxscalarapprox_b()
Definition: fluxes_b.f90:12161
subroutine invisciddissfluxmatrix()
Definition: fluxes_b.f90:2792
subroutine invisciddissfluxscalar()
Definition: fluxes_b.f90:4149
subroutine viscousflux_b()
Definition: fluxes_b.f90:8339
subroutine inviscidupwindflux(finegrid)
Definition: fluxes_b.f90:7342
subroutine invisciddissfluxscalar_b()
Definition: fluxes_b.f90:3446
real(kind=realtype) vis2
Definition: inputParam.F90:78
real(kind=realtype) sigma
Definition: inputParam.F90:83
integer(kind=inttype) orderturb
Definition: inputParam.F90:73
integer(kind=inttype) riemanncoarse
Definition: inputParam.F90:74
real(kind=realtype) vis4
Definition: inputParam.F90:78
real(kind=realtype) kappacoef
Definition: inputParam.F90:80
integer(kind=inttype) riemann
Definition: inputParam.F90:74
integer(kind=inttype) limiter
Definition: inputParam.F90:73
integer(kind=inttype) precond
Definition: inputParam.F90:74
real(kind=realtype) disscontmidpoint
Definition: inputParam.F90:297
logical usedisscontinuation
Definition: inputParam.F90:296
real(kind=realtype) disscontmagnitude
Definition: inputParam.F90:297
real(kind=realtype) disscontsharpness
Definition: inputParam.F90:297
integer(kind=inttype) equations
Definition: inputParam.F90:583
integer(kind=inttype) equationmode
Definition: inputParam.F90:583
real(kind=realtype) prandtlturb
Definition: inputParam.F90:596
logical useqcr
Definition: inputParam.F90:587
logical wallfunctions
Definition: inputParam.F90:589
real(kind=realtype) prandtl
Definition: inputParam.F90:596
real(kind=realtype) totalr0
Definition: iteration.f90:126
integer(kind=inttype) currentlevel
Definition: iteration.f90:18
real(kind=realtype) totalr
Definition: iteration.f90:126
integer(kind=inttype) groundlevel
Definition: iteration.f90:18
integer(kind=inttype) rkstage
Definition: iteration.f90:19
real(kind=realtype) rfil
Definition: iteration.f90:36
real(kind=realtype) function mydim(x, y)
Definition: utils_b.f90:471
logical function getcorrectfork()
Definition: utils_b.f90:480
subroutine terminate(routinename, errormessage)
Definition: utils_b.f90:493
subroutine mydim_b(x, xd, y, yd, mydimd)
Definition: utils_b.f90:458