ADflow  v1.0
ADflow is a finite volume RANS solver tailored for gradient-based aerodynamic design optimization.
fluxes_fast_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 !
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: *p *w *dw
10 ! with respect to varying inputs: *p *w *dw
11 ! rw status of diff variables: *p:incr *w:incr *dw:in-out
12 ! plus diff mem management of: p:in w:in dw:in
14 !
15 ! inviscidcentralflux computes the euler fluxes using a central
16 ! discretization for a given block. therefore it is assumed that
17 ! the pointers in block pointer already point to the correct
18 ! block on the correct multigrid level.
19 !
20  use constants
21  use blockpointers, only : nx, il, ie, ny, jl, je, nz, kl, ke,&
22 & spectralsol, w, wd, si, sj, sk, dw, dwd, pori, porj, pork, &
27  use flowvarrefstate, only : timeref
28  use inputphysics, only : equationmode
29  implicit none
30 !
31 ! local variables.
32 !
33  integer(kind=inttype) :: i, j, k, ind, ii
34  real(kind=realtype) :: qsp, qsm, rqsp, rqsm, porvel, porflux
35  real(kind=realtype) :: qspd, qsmd, rqspd, rqsmd
36  real(kind=realtype) :: pa, fs, sface, vnp, vnm
37  real(kind=realtype) :: pad, fsd, vnpd, vnmd
38  real(kind=realtype) :: wwx, wwy, wwz, rvol
39  real(kind=realtype) :: rvold
40  intrinsic mod
41  real(kind=realtype) :: tempd
42  integer :: branch
43  if (blockismoving .and. equationmode .eq. steady) then
44 ! compute the three nondimensional angular velocities.
45  wwx = timeref*cgnsdoms(nbkglobal)%rotrate(1)
46  wwy = timeref*cgnsdoms(nbkglobal)%rotrate(2)
47  wwz = timeref*cgnsdoms(nbkglobal)%rotrate(3)
48 !$bwd-of ii-loop
49  do ii=0,nx*ny*nz-1
50  i = mod(ii, nx) + 2
51  j = mod(ii/nx, ny) + 2
52  k = ii/(nx*ny) + 2
53  rvol = w(i, j, k, irho)*vol(i, j, k)
54  rvold = (wwx*w(i, j, k, ivy)-wwy*w(i, j, k, ivx))*dwd(i, j, k, &
55 & imz) + (wwz*w(i, j, k, ivx)-wwx*w(i, j, k, ivz))*dwd(i, j, k, &
56 & imy) + (wwy*w(i, j, k, ivz)-wwz*w(i, j, k, ivy))*dwd(i, j, k, &
57 & imx)
58  wd(i, j, k, ivy) = wd(i, j, k, ivy) + wwx*rvol*dwd(i, j, k, imz)
59  wd(i, j, k, ivx) = wd(i, j, k, ivx) + wwz*rvol*dwd(i, j, k, imy)&
60 & - wwy*rvol*dwd(i, j, k, imz)
61  wd(i, j, k, ivz) = wd(i, j, k, ivz) + wwy*rvol*dwd(i, j, k, imx)&
62 & - wwx*rvol*dwd(i, j, k, imy)
63  wd(i, j, k, ivy) = wd(i, j, k, ivy) - wwz*rvol*dwd(i, j, k, imx)
64  wd(i, j, k, irho) = wd(i, j, k, irho) + vol(i, j, k)*rvold
65  end do
66  end if
67  sface = zero
68 !$bwd-of ii-loop
69  do ii=0,nx*ny*kl-1
70  i = mod(ii, nx) + 2
71  j = mod(ii/nx, ny) + 2
72  k = ii/(nx*ny) + 1
73 ! set the dot product of the grid velocity and the
74 ! normal in k-direction for a moving face.
75  if (addgridvelocities) sface = sfacek(i, j, k)
76 ! compute the normal velocities of the left and right state.
77  vnp = w(i, j, k+1, ivx)*sk(i, j, k, 1) + w(i, j, k+1, ivy)*sk(i, j&
78 & , k, 2) + w(i, j, k+1, ivz)*sk(i, j, k, 3)
79  vnm = w(i, j, k, ivx)*sk(i, j, k, 1) + w(i, j, k, ivy)*sk(i, j, k&
80 & , 2) + w(i, j, k, ivz)*sk(i, j, k, 3)
81 ! set the values of the porosities for this face.
82 ! porvel defines the porosity w.r.t. velocity;
83 ! porflux defines the porosity w.r.t. the entire flux.
84 ! the latter is only zero for a discontinuous block
85 ! block boundary that must be treated conservatively.
86 ! the default value of porflux is 0.5, such that the
87 ! correct central flux is scattered to both cells.
88 ! in case of a boundflux the normal velocity is set
89 ! to sface.
90  porvel = one
91  porflux = half
92  if (pork(i, j, k) .eq. noflux) porflux = zero
93  if (pork(i, j, k) .eq. boundflux) then
94  porvel = zero
95  vnp = sface
96  vnm = sface
97 myintptr = myintptr + 1
98  myintstack(myintptr) = 0
99  else
100 myintptr = myintptr + 1
101  myintstack(myintptr) = 1
102  end if
103 ! incorporate porflux in porvel.
104  porvel = porvel*porflux
105 ! compute the normal velocities for the face as well as the
106 ! mass fluxes.
107  qsp = (vnp-sface)*porvel
108  qsm = (vnm-sface)*porvel
109  rqsp = qsp*w(i, j, k+1, irho)
110  rqsm = qsm*w(i, j, k, irho)
111 ! compute the sum of the pressure multiplied by porflux.
112 ! for the default value of porflux, 0.5, this leads to
113 ! the average pressure.
114 ! compute the fluxes and scatter them to the cells
115 ! i,j,k and i,j,k+1. store the density flux in the
116 ! mass flow of the appropriate sliding mesh interface.
117  fsd = dwd(i, j, k, irhoe) - dwd(i, j, k+1, irhoe)
118  qspd = w(i, j, k+1, irhoe)*fsd
119  wd(i, j, k+1, irhoe) = wd(i, j, k+1, irhoe) + qsp*fsd
120  qsmd = w(i, j, k, irhoe)*fsd
121  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) + qsm*fsd
122  tempd = porflux*fsd
123  fsd = dwd(i, j, k, imz) - dwd(i, j, k+1, imz)
124  rqspd = w(i, j, k+1, ivz)*fsd
125  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + rqsp*fsd
126  rqsmd = w(i, j, k, ivz)*fsd
127  wd(i, j, k, ivz) = wd(i, j, k, ivz) + rqsm*fsd
128  pad = sk(i, j, k, 3)*fsd
129  fsd = dwd(i, j, k, imy) - dwd(i, j, k+1, imy)
130  rqspd = rqspd + w(i, j, k+1, ivy)*fsd
131  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + rqsp*fsd
132  rqsmd = rqsmd + w(i, j, k, ivy)*fsd
133  wd(i, j, k, ivy) = wd(i, j, k, ivy) + rqsm*fsd
134  pad = pad + sk(i, j, k, 2)*fsd
135  fsd = dwd(i, j, k, imx) - dwd(i, j, k+1, imx)
136  rqspd = rqspd + w(i, j, k+1, ivx)*fsd
137  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + rqsp*fsd
138  rqsmd = rqsmd + w(i, j, k, ivx)*fsd
139  wd(i, j, k, ivx) = wd(i, j, k, ivx) + rqsm*fsd
140  pad = pad + sk(i, j, k, 1)*fsd
141  pd(i, j, k) = pd(i, j, k) + vnm*tempd + porflux*pad
142  pd(i, j, k+1) = pd(i, j, k+1) + vnp*tempd + porflux*pad
143  fsd = dwd(i, j, k, irho) - dwd(i, j, k+1, irho)
144  rqspd = rqspd + fsd
145  rqsmd = rqsmd + fsd
146  qsmd = qsmd + w(i, j, k, irho)*rqsmd
147  vnmd = p(i, j, k)*tempd + porvel*qsmd
148  wd(i, j, k, irho) = wd(i, j, k, irho) + qsm*rqsmd
149  qspd = qspd + w(i, j, k+1, irho)*rqspd
150  vnpd = p(i, j, k+1)*tempd + porvel*qspd
151  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + qsp*rqspd
152 branch = myintstack(myintptr)
153  myintptr = myintptr - 1
154  if (branch .eq. 0) then
155  vnmd = 0.0_8
156  vnpd = 0.0_8
157  end if
158  wd(i, j, k, ivx) = wd(i, j, k, ivx) + sk(i, j, k, 1)*vnmd
159  wd(i, j, k, ivy) = wd(i, j, k, ivy) + sk(i, j, k, 2)*vnmd
160  wd(i, j, k, ivz) = wd(i, j, k, ivz) + sk(i, j, k, 3)*vnmd
161  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + sk(i, j, k, 1)*vnpd
162  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + sk(i, j, k, 2)*vnpd
163  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + sk(i, j, k, 3)*vnpd
164  end do
165  sface = zero
166 !$bwd-of ii-loop
167  do ii=0,nx*jl*nz-1
168  i = mod(ii, nx) + 2
169  j = mod(ii/nx, jl) + 1
170  k = ii/(nx*jl) + 2
171 ! set the dot product of the grid velocity and the
172 ! normal in j-direction for a moving face.
173  if (addgridvelocities) sface = sfacej(i, j, k)
174 ! compute the normal velocities of the left and right state.
175  vnp = w(i, j+1, k, ivx)*sj(i, j, k, 1) + w(i, j+1, k, ivy)*sj(i, j&
176 & , k, 2) + w(i, j+1, k, ivz)*sj(i, j, k, 3)
177  vnm = w(i, j, k, ivx)*sj(i, j, k, 1) + w(i, j, k, ivy)*sj(i, j, k&
178 & , 2) + w(i, j, k, ivz)*sj(i, j, k, 3)
179 ! set the values of the porosities for this face.
180 ! porvel defines the porosity w.r.t. velocity;
181 ! porflux defines the porosity w.r.t. the entire flux.
182 ! the latter is only zero for a discontinuous block
183 ! boundary that must be treated conservatively.
184 ! the default value of porflux is 0.5, such that the
185 ! correct central flux is scattered to both cells.
186 ! in case of a boundflux the normal velocity is set
187 ! to sface.
188  porvel = one
189  porflux = half
190  if (porj(i, j, k) .eq. noflux) porflux = zero
191  if (porj(i, j, k) .eq. boundflux) then
192  porvel = zero
193  vnp = sface
194  vnm = sface
195 myintptr = myintptr + 1
196  myintstack(myintptr) = 0
197  else
198 myintptr = myintptr + 1
199  myintstack(myintptr) = 1
200  end if
201 ! incorporate porflux in porvel.
202  porvel = porvel*porflux
203 ! compute the normal velocities for the face as well as the
204 ! mass fluxes.
205  qsp = (vnp-sface)*porvel
206  qsm = (vnm-sface)*porvel
207  rqsp = qsp*w(i, j+1, k, irho)
208  rqsm = qsm*w(i, j, k, irho)
209 ! compute the sum of the pressure multiplied by porflux.
210 ! for the default value of porflux, 0.5, this leads to
211 ! the average pressure.
212 ! compute the fluxes and scatter them to the cells
213 ! i,j,k and i,j+1,k. store the density flux in the
214 ! mass flow of the appropriate sliding mesh interface.
215  fsd = dwd(i, j, k, irhoe) - dwd(i, j+1, k, irhoe)
216  qspd = w(i, j+1, k, irhoe)*fsd
217  wd(i, j+1, k, irhoe) = wd(i, j+1, k, irhoe) + qsp*fsd
218  qsmd = w(i, j, k, irhoe)*fsd
219  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) + qsm*fsd
220  tempd = porflux*fsd
221  fsd = dwd(i, j, k, imz) - dwd(i, j+1, k, imz)
222  rqspd = w(i, j+1, k, ivz)*fsd
223  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + rqsp*fsd
224  rqsmd = w(i, j, k, ivz)*fsd
225  wd(i, j, k, ivz) = wd(i, j, k, ivz) + rqsm*fsd
226  pad = sj(i, j, k, 3)*fsd
227  fsd = dwd(i, j, k, imy) - dwd(i, j+1, k, imy)
228  rqspd = rqspd + w(i, j+1, k, ivy)*fsd
229  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + rqsp*fsd
230  rqsmd = rqsmd + w(i, j, k, ivy)*fsd
231  wd(i, j, k, ivy) = wd(i, j, k, ivy) + rqsm*fsd
232  pad = pad + sj(i, j, k, 2)*fsd
233  fsd = dwd(i, j, k, imx) - dwd(i, j+1, k, imx)
234  rqspd = rqspd + w(i, j+1, k, ivx)*fsd
235  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + rqsp*fsd
236  rqsmd = rqsmd + w(i, j, k, ivx)*fsd
237  wd(i, j, k, ivx) = wd(i, j, k, ivx) + rqsm*fsd
238  pad = pad + sj(i, j, k, 1)*fsd
239  pd(i, j, k) = pd(i, j, k) + vnm*tempd + porflux*pad
240  pd(i, j+1, k) = pd(i, j+1, k) + vnp*tempd + porflux*pad
241  fsd = dwd(i, j, k, irho) - dwd(i, j+1, k, irho)
242  rqspd = rqspd + fsd
243  rqsmd = rqsmd + fsd
244  qsmd = qsmd + w(i, j, k, irho)*rqsmd
245  vnmd = p(i, j, k)*tempd + porvel*qsmd
246  wd(i, j, k, irho) = wd(i, j, k, irho) + qsm*rqsmd
247  qspd = qspd + w(i, j+1, k, irho)*rqspd
248  vnpd = p(i, j+1, k)*tempd + porvel*qspd
249  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + qsp*rqspd
250 branch = myintstack(myintptr)
251  myintptr = myintptr - 1
252  if (branch .eq. 0) then
253  vnmd = 0.0_8
254  vnpd = 0.0_8
255  end if
256  wd(i, j, k, ivx) = wd(i, j, k, ivx) + sj(i, j, k, 1)*vnmd
257  wd(i, j, k, ivy) = wd(i, j, k, ivy) + sj(i, j, k, 2)*vnmd
258  wd(i, j, k, ivz) = wd(i, j, k, ivz) + sj(i, j, k, 3)*vnmd
259  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + sj(i, j, k, 1)*vnpd
260  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + sj(i, j, k, 2)*vnpd
261  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + sj(i, j, k, 3)*vnpd
262  end do
263 ! initialize sface to zero. this value will be used if the
264 ! block is not moving.
265  sface = zero
266 !$bwd-of ii-loop
267  do ii=0,il*ny*nz-1
268  i = mod(ii, il) + 1
269  j = mod(ii/il, ny) + 2
270  k = ii/(il*ny) + 2
271 ! set the dot product of the grid velocity and the
272 ! normal in i-direction for a moving face.
273  if (addgridvelocities) sface = sfacei(i, j, k)
274 ! compute the normal velocities of the left and right state.
275  vnp = w(i+1, j, k, ivx)*si(i, j, k, 1) + w(i+1, j, k, ivy)*si(i, j&
276 & , k, 2) + w(i+1, j, k, ivz)*si(i, j, k, 3)
277  vnm = w(i, j, k, ivx)*si(i, j, k, 1) + w(i, j, k, ivy)*si(i, j, k&
278 & , 2) + w(i, j, k, ivz)*si(i, j, k, 3)
279 ! set the values of the porosities for this face.
280 ! porvel defines the porosity w.r.t. velocity;
281 ! porflux defines the porosity w.r.t. the entire flux.
282 ! the latter is only zero for a discontinuous block
283 ! boundary that must be treated conservatively.
284 ! the default value of porflux is 0.5, such that the
285 ! correct central flux is scattered to both cells.
286 ! in case of a boundflux the normal velocity is set
287 ! to sface.
288  porvel = one
289  porflux = half
290  if (pori(i, j, k) .eq. noflux) porflux = zero
291  if (pori(i, j, k) .eq. boundflux) then
292  porvel = zero
293  vnp = sface
294  vnm = sface
295 myintptr = myintptr + 1
296  myintstack(myintptr) = 0
297  else
298 myintptr = myintptr + 1
299  myintstack(myintptr) = 1
300  end if
301 ! incorporate porflux in porvel.
302  porvel = porvel*porflux
303 ! compute the normal velocities relative to the grid for
304 ! the face as well as the mass fluxes.
305  qsp = (vnp-sface)*porvel
306  qsm = (vnm-sface)*porvel
307  rqsp = qsp*w(i+1, j, k, irho)
308  rqsm = qsm*w(i, j, k, irho)
309 ! compute the sum of the pressure multiplied by porflux.
310 ! for the default value of porflux, 0.5, this leads to
311 ! the average pressure.
312 ! compute the fluxes and scatter them to the cells
313 ! i,j,k and i+1,j,k. store the density flux in the
314 ! mass flow of the appropriate sliding mesh interface.
315  fsd = dwd(i, j, k, irhoe) - dwd(i+1, j, k, irhoe)
316  qspd = w(i+1, j, k, irhoe)*fsd
317  wd(i+1, j, k, irhoe) = wd(i+1, j, k, irhoe) + qsp*fsd
318  qsmd = w(i, j, k, irhoe)*fsd
319  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) + qsm*fsd
320  tempd = porflux*fsd
321  fsd = dwd(i, j, k, imz) - dwd(i+1, j, k, imz)
322  rqspd = w(i+1, j, k, ivz)*fsd
323  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + rqsp*fsd
324  rqsmd = w(i, j, k, ivz)*fsd
325  wd(i, j, k, ivz) = wd(i, j, k, ivz) + rqsm*fsd
326  pad = si(i, j, k, 3)*fsd
327  fsd = dwd(i, j, k, imy) - dwd(i+1, j, k, imy)
328  rqspd = rqspd + w(i+1, j, k, ivy)*fsd
329  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + rqsp*fsd
330  rqsmd = rqsmd + w(i, j, k, ivy)*fsd
331  wd(i, j, k, ivy) = wd(i, j, k, ivy) + rqsm*fsd
332  pad = pad + si(i, j, k, 2)*fsd
333  fsd = dwd(i, j, k, imx) - dwd(i+1, j, k, imx)
334  rqspd = rqspd + w(i+1, j, k, ivx)*fsd
335  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + rqsp*fsd
336  rqsmd = rqsmd + w(i, j, k, ivx)*fsd
337  wd(i, j, k, ivx) = wd(i, j, k, ivx) + rqsm*fsd
338  pad = pad + si(i, j, k, 1)*fsd
339  pd(i, j, k) = pd(i, j, k) + vnm*tempd + porflux*pad
340  pd(i+1, j, k) = pd(i+1, j, k) + vnp*tempd + porflux*pad
341  fsd = dwd(i, j, k, irho) - dwd(i+1, j, k, irho)
342  rqspd = rqspd + fsd
343  rqsmd = rqsmd + fsd
344  qsmd = qsmd + w(i, j, k, irho)*rqsmd
345  vnmd = p(i, j, k)*tempd + porvel*qsmd
346  wd(i, j, k, irho) = wd(i, j, k, irho) + qsm*rqsmd
347  qspd = qspd + w(i+1, j, k, irho)*rqspd
348  vnpd = p(i+1, j, k)*tempd + porvel*qspd
349  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + qsp*rqspd
350 branch = myintstack(myintptr)
351  myintptr = myintptr - 1
352  if (branch .eq. 0) then
353  vnmd = 0.0_8
354  vnpd = 0.0_8
355  end if
356  wd(i, j, k, ivx) = wd(i, j, k, ivx) + si(i, j, k, 1)*vnmd
357  wd(i, j, k, ivy) = wd(i, j, k, ivy) + si(i, j, k, 2)*vnmd
358  wd(i, j, k, ivz) = wd(i, j, k, ivz) + si(i, j, k, 3)*vnmd
359  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + si(i, j, k, 1)*vnpd
360  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + si(i, j, k, 2)*vnpd
361  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + si(i, j, k, 3)*vnpd
362  end do
363  end subroutine inviscidcentralflux_fast_b
364 
365  subroutine inviscidcentralflux()
366 !
367 ! inviscidcentralflux computes the euler fluxes using a central
368 ! discretization for a given block. therefore it is assumed that
369 ! the pointers in block pointer already point to the correct
370 ! block on the correct multigrid level.
371 !
372  use constants
373  use blockpointers, only : nx, il, ie, ny, jl, je, nz, kl, ke,&
374 & spectralsol, w, si, sj, sk, dw, pori, porj, pork, indfamilyi, &
377 & factfamilyk
378  use cgnsgrid, only : cgnsdoms, massflowfamilyinv
379  use flowvarrefstate, only : timeref
380  use inputphysics, only : equationmode
381  implicit none
382 !
383 ! local variables.
384 !
385  integer(kind=inttype) :: i, j, k, ind, ii
386  real(kind=realtype) :: qsp, qsm, rqsp, rqsm, porvel, porflux
387  real(kind=realtype) :: pa, fs, sface, vnp, vnm
388  real(kind=realtype) :: wwx, wwy, wwz, rvol
389  intrinsic mod
390 !$ad checkpoint-start
391 ! initialize sface to zero. this value will be used if the
392 ! block is not moving.
393  sface = zero
394 !$ad ii-loop
395 !
396 ! advective fluxes in the i-direction.
397 !
398  do ii=0,il*ny*nz-1
399  i = mod(ii, il) + 1
400  j = mod(ii/il, ny) + 2
401  k = ii/(il*ny) + 2
402 ! set the dot product of the grid velocity and the
403 ! normal in i-direction for a moving face.
404  if (addgridvelocities) sface = sfacei(i, j, k)
405 ! compute the normal velocities of the left and right state.
406  vnp = w(i+1, j, k, ivx)*si(i, j, k, 1) + w(i+1, j, k, ivy)*si(i, j&
407 & , k, 2) + w(i+1, j, k, ivz)*si(i, j, k, 3)
408  vnm = w(i, j, k, ivx)*si(i, j, k, 1) + w(i, j, k, ivy)*si(i, j, k&
409 & , 2) + w(i, j, k, ivz)*si(i, j, k, 3)
410 ! set the values of the porosities for this face.
411 ! porvel defines the porosity w.r.t. velocity;
412 ! porflux defines the porosity w.r.t. the entire flux.
413 ! the latter is only zero for a discontinuous block
414 ! boundary that must be treated conservatively.
415 ! the default value of porflux is 0.5, such that the
416 ! correct central flux is scattered to both cells.
417 ! in case of a boundflux the normal velocity is set
418 ! to sface.
419  porvel = one
420  porflux = half
421  if (pori(i, j, k) .eq. noflux) porflux = zero
422  if (pori(i, j, k) .eq. boundflux) then
423  porvel = zero
424  vnp = sface
425  vnm = sface
426  end if
427 ! incorporate porflux in porvel.
428  porvel = porvel*porflux
429 ! compute the normal velocities relative to the grid for
430 ! the face as well as the mass fluxes.
431  qsp = (vnp-sface)*porvel
432  qsm = (vnm-sface)*porvel
433  rqsp = qsp*w(i+1, j, k, irho)
434  rqsm = qsm*w(i, j, k, irho)
435 ! compute the sum of the pressure multiplied by porflux.
436 ! for the default value of porflux, 0.5, this leads to
437 ! the average pressure.
438  pa = porflux*(p(i+1, j, k)+p(i, j, k))
439 ! compute the fluxes and scatter them to the cells
440 ! i,j,k and i+1,j,k. store the density flux in the
441 ! mass flow of the appropriate sliding mesh interface.
442  fs = rqsp + rqsm
443  dw(i+1, j, k, irho) = dw(i+1, j, k, irho) - fs
444  dw(i, j, k, irho) = dw(i, j, k, irho) + fs
445  fs = rqsp*w(i+1, j, k, ivx) + rqsm*w(i, j, k, ivx) + pa*si(i, j, k&
446 & , 1)
447  dw(i+1, j, k, imx) = dw(i+1, j, k, imx) - fs
448  dw(i, j, k, imx) = dw(i, j, k, imx) + fs
449  fs = rqsp*w(i+1, j, k, ivy) + rqsm*w(i, j, k, ivy) + pa*si(i, j, k&
450 & , 2)
451  dw(i+1, j, k, imy) = dw(i+1, j, k, imy) - fs
452  dw(i, j, k, imy) = dw(i, j, k, imy) + fs
453  fs = rqsp*w(i+1, j, k, ivz) + rqsm*w(i, j, k, ivz) + pa*si(i, j, k&
454 & , 3)
455  dw(i+1, j, k, imz) = dw(i+1, j, k, imz) - fs
456  dw(i, j, k, imz) = dw(i, j, k, imz) + fs
457  fs = qsp*w(i+1, j, k, irhoe) + qsm*w(i, j, k, irhoe) + porflux*(&
458 & vnp*p(i+1, j, k)+vnm*p(i, j, k))
459  dw(i+1, j, k, irhoe) = dw(i+1, j, k, irhoe) - fs
460  dw(i, j, k, irhoe) = dw(i, j, k, irhoe) + fs
461  end do
462 !$ad checkpoint-end
463 !
464 ! advective fluxes in the j-direction.
465 !
466  continue
467 !$ad checkpoint-start
468  sface = zero
469 !$ad ii-loop
470  do ii=0,nx*jl*nz-1
471  i = mod(ii, nx) + 2
472  j = mod(ii/nx, jl) + 1
473  k = ii/(nx*jl) + 2
474 ! set the dot product of the grid velocity and the
475 ! normal in j-direction for a moving face.
476  if (addgridvelocities) sface = sfacej(i, j, k)
477 ! compute the normal velocities of the left and right state.
478  vnp = w(i, j+1, k, ivx)*sj(i, j, k, 1) + w(i, j+1, k, ivy)*sj(i, j&
479 & , k, 2) + w(i, j+1, k, ivz)*sj(i, j, k, 3)
480  vnm = w(i, j, k, ivx)*sj(i, j, k, 1) + w(i, j, k, ivy)*sj(i, j, k&
481 & , 2) + w(i, j, k, ivz)*sj(i, j, k, 3)
482 ! set the values of the porosities for this face.
483 ! porvel defines the porosity w.r.t. velocity;
484 ! porflux defines the porosity w.r.t. the entire flux.
485 ! the latter is only zero for a discontinuous block
486 ! boundary that must be treated conservatively.
487 ! the default value of porflux is 0.5, such that the
488 ! correct central flux is scattered to both cells.
489 ! in case of a boundflux the normal velocity is set
490 ! to sface.
491  porvel = one
492  porflux = half
493  if (porj(i, j, k) .eq. noflux) porflux = zero
494  if (porj(i, j, k) .eq. boundflux) then
495  porvel = zero
496  vnp = sface
497  vnm = sface
498  end if
499 ! incorporate porflux in porvel.
500  porvel = porvel*porflux
501 ! compute the normal velocities for the face as well as the
502 ! mass fluxes.
503  qsp = (vnp-sface)*porvel
504  qsm = (vnm-sface)*porvel
505  rqsp = qsp*w(i, j+1, k, irho)
506  rqsm = qsm*w(i, j, k, irho)
507 ! compute the sum of the pressure multiplied by porflux.
508 ! for the default value of porflux, 0.5, this leads to
509 ! the average pressure.
510  pa = porflux*(p(i, j+1, k)+p(i, j, k))
511 ! compute the fluxes and scatter them to the cells
512 ! i,j,k and i,j+1,k. store the density flux in the
513 ! mass flow of the appropriate sliding mesh interface.
514  fs = rqsp + rqsm
515  dw(i, j+1, k, irho) = dw(i, j+1, k, irho) - fs
516  dw(i, j, k, irho) = dw(i, j, k, irho) + fs
517  fs = rqsp*w(i, j+1, k, ivx) + rqsm*w(i, j, k, ivx) + pa*sj(i, j, k&
518 & , 1)
519  dw(i, j+1, k, imx) = dw(i, j+1, k, imx) - fs
520  dw(i, j, k, imx) = dw(i, j, k, imx) + fs
521  fs = rqsp*w(i, j+1, k, ivy) + rqsm*w(i, j, k, ivy) + pa*sj(i, j, k&
522 & , 2)
523  dw(i, j+1, k, imy) = dw(i, j+1, k, imy) - fs
524  dw(i, j, k, imy) = dw(i, j, k, imy) + fs
525  fs = rqsp*w(i, j+1, k, ivz) + rqsm*w(i, j, k, ivz) + pa*sj(i, j, k&
526 & , 3)
527  dw(i, j+1, k, imz) = dw(i, j+1, k, imz) - fs
528  dw(i, j, k, imz) = dw(i, j, k, imz) + fs
529  fs = qsp*w(i, j+1, k, irhoe) + qsm*w(i, j, k, irhoe) + porflux*(&
530 & vnp*p(i, j+1, k)+vnm*p(i, j, k))
531  dw(i, j+1, k, irhoe) = dw(i, j+1, k, irhoe) - fs
532  dw(i, j, k, irhoe) = dw(i, j, k, irhoe) + fs
533  end do
534 !$ad checkpoint-end
535 !
536 ! advective fluxes in the k-direction.
537  continue
538 !$ad checkpoint-start
539  sface = zero
540 !$ad ii-loop
541  do ii=0,nx*ny*kl-1
542  i = mod(ii, nx) + 2
543  j = mod(ii/nx, ny) + 2
544  k = ii/(nx*ny) + 1
545 ! set the dot product of the grid velocity and the
546 ! normal in k-direction for a moving face.
547  if (addgridvelocities) sface = sfacek(i, j, k)
548 ! compute the normal velocities of the left and right state.
549  vnp = w(i, j, k+1, ivx)*sk(i, j, k, 1) + w(i, j, k+1, ivy)*sk(i, j&
550 & , k, 2) + w(i, j, k+1, ivz)*sk(i, j, k, 3)
551  vnm = w(i, j, k, ivx)*sk(i, j, k, 1) + w(i, j, k, ivy)*sk(i, j, k&
552 & , 2) + w(i, j, k, ivz)*sk(i, j, k, 3)
553 ! set the values of the porosities for this face.
554 ! porvel defines the porosity w.r.t. velocity;
555 ! porflux defines the porosity w.r.t. the entire flux.
556 ! the latter is only zero for a discontinuous block
557 ! block boundary that must be treated conservatively.
558 ! the default value of porflux is 0.5, such that the
559 ! correct central flux is scattered to both cells.
560 ! in case of a boundflux the normal velocity is set
561 ! to sface.
562  porvel = one
563  porflux = half
564  if (pork(i, j, k) .eq. noflux) porflux = zero
565  if (pork(i, j, k) .eq. boundflux) then
566  porvel = zero
567  vnp = sface
568  vnm = sface
569  end if
570 ! incorporate porflux in porvel.
571  porvel = porvel*porflux
572 ! compute the normal velocities for the face as well as the
573 ! mass fluxes.
574  qsp = (vnp-sface)*porvel
575  qsm = (vnm-sface)*porvel
576  rqsp = qsp*w(i, j, k+1, irho)
577  rqsm = qsm*w(i, j, k, irho)
578 ! compute the sum of the pressure multiplied by porflux.
579 ! for the default value of porflux, 0.5, this leads to
580 ! the average pressure.
581  pa = porflux*(p(i, j, k+1)+p(i, j, k))
582 ! compute the fluxes and scatter them to the cells
583 ! i,j,k and i,j,k+1. store the density flux in the
584 ! mass flow of the appropriate sliding mesh interface.
585  fs = rqsp + rqsm
586  dw(i, j, k+1, irho) = dw(i, j, k+1, irho) - fs
587  dw(i, j, k, irho) = dw(i, j, k, irho) + fs
588  fs = rqsp*w(i, j, k+1, ivx) + rqsm*w(i, j, k, ivx) + pa*sk(i, j, k&
589 & , 1)
590  dw(i, j, k+1, imx) = dw(i, j, k+1, imx) - fs
591  dw(i, j, k, imx) = dw(i, j, k, imx) + fs
592  fs = rqsp*w(i, j, k+1, ivy) + rqsm*w(i, j, k, ivy) + pa*sk(i, j, k&
593 & , 2)
594  dw(i, j, k+1, imy) = dw(i, j, k+1, imy) - fs
595  dw(i, j, k, imy) = dw(i, j, k, imy) + fs
596  fs = rqsp*w(i, j, k+1, ivz) + rqsm*w(i, j, k, ivz) + pa*sk(i, j, k&
597 & , 3)
598  dw(i, j, k+1, imz) = dw(i, j, k+1, imz) - fs
599  dw(i, j, k, imz) = dw(i, j, k, imz) + fs
600  fs = qsp*w(i, j, k+1, irhoe) + qsm*w(i, j, k, irhoe) + porflux*(&
601 & vnp*p(i, j, k+1)+vnm*p(i, j, k))
602  dw(i, j, k+1, irhoe) = dw(i, j, k+1, irhoe) - fs
603  dw(i, j, k, irhoe) = dw(i, j, k, irhoe) + fs
604  end do
605 !$ad checkpoint-end
606 ! add the rotational source terms for a moving block in a
607 ! steady state computation. these source terms account for the
608 ! centrifugal acceleration and the coriolis term. however, as
609 ! the the equations are solved in the inertial frame and not
610 ! in the moving frame, the form is different than what you
611 ! normally find in a text book.
612  continue
613 !$ad checkpoint-start
614  if (blockismoving .and. equationmode .eq. steady) then
615 ! compute the three nondimensional angular velocities.
616  wwx = timeref*cgnsdoms(nbkglobal)%rotrate(1)
617  wwy = timeref*cgnsdoms(nbkglobal)%rotrate(2)
618  wwz = timeref*cgnsdoms(nbkglobal)%rotrate(3)
619 !$ad ii-loop
620 ! loop over the internal cells of this block to compute the
621 ! rotational terms for the momentum equations.
622  do ii=0,nx*ny*nz-1
623  i = mod(ii, nx) + 2
624  j = mod(ii/nx, ny) + 2
625  k = ii/(nx*ny) + 2
626  rvol = w(i, j, k, irho)*vol(i, j, k)
627  dw(i, j, k, imx) = dw(i, j, k, imx) + rvol*(wwy*w(i, j, k, ivz)-&
628 & wwz*w(i, j, k, ivy))
629  dw(i, j, k, imy) = dw(i, j, k, imy) + rvol*(wwz*w(i, j, k, ivx)-&
630 & wwx*w(i, j, k, ivz))
631  dw(i, j, k, imz) = dw(i, j, k, imz) + rvol*(wwx*w(i, j, k, ivy)-&
632 & wwy*w(i, j, k, ivx))
633  end do
634  end if
635 !$ad checkpoint-end
636 
637  end subroutine inviscidcentralflux
638 
639 ! differentiation of invisciddissfluxmatrix in reverse (adjoint) mode (with options noisize i4 dr8 r8):
640 ! gradient of useful results: *p *w *fw
641 ! with respect to varying inputs: *p *w *fw
642 ! rw status of diff variables: *p:incr *w:incr *fw:in-out
643 ! plus diff mem management of: p:in w:in fw:in
645 !
646 ! invisciddissfluxmatrix computes the matrix artificial
647 ! dissipation term. instead of the spectral radius, as used in
648 ! the scalar dissipation scheme, the absolute value of the flux
649 ! jacobian is used. this leads to a less diffusive and
650 ! consequently more accurate scheme. it is assumed that the
651 ! pointers in blockpointers already point to the correct block.
652 !
653  use constants
654  use blockpointers, only : nx, ny, nz, il, jl, kl, ie, je, ke,&
655 & ib, jb, kb, w, wd, p, pd, pori, porj, pork, fw, fwd, gamma, si, sj, &
658 & factfamilyk
659  use flowvarrefstate, only : pinfcorr
660  use inputdiscretization, only : vis2, vis4
661  use inputphysics, only : equations
662  use iteration, only : rfil
663  use cgnsgrid, only : massflowfamilydiss
665  implicit none
666 !
667 ! local parameters.
668 !
669  real(kind=realtype), parameter :: dpmax=0.25_realtype
670  real(kind=realtype), parameter :: epsacoustic=0.25_realtype
671  real(kind=realtype), parameter :: epsshear=0.025_realtype
672  real(kind=realtype), parameter :: omega=0.5_realtype
673  real(kind=realtype), parameter :: oneminomega=one-omega
674 !
675 ! local variables.
676 !
677  integer(kind=inttype) :: i, j, k, ind, ii
678  real(kind=realtype) :: plim, sface
679  real(kind=realtype) :: sfil, fis2, fis4
680  real(kind=realtype) :: gammaavg, gm1, ovgm1, gm53
681  real(kind=realtype) :: ppor, rrad, dis2, dis4
682  real(kind=realtype) :: rradd, dis2d, dis4d
683  real(kind=realtype) :: dp1, dp2, tmp, fs
684  real(kind=realtype) :: fsd
685  real(kind=realtype) :: ddw1, ddw2, ddw3, ddw4, ddw5, ddw6
686  real(kind=realtype) :: ddw1d, ddw2d, ddw3d, ddw4d, ddw5d, ddw6d
687  real(kind=realtype) :: dr, dru, drv, drw, dre, drk, sx, sy, sz
688  real(kind=realtype) :: drd, drud, drvd, drwd, dred, drkd
689  real(kind=realtype) :: uavg, vavg, wavg, a2avg, aavg, havg
690  real(kind=realtype) :: uavgd, vavgd, wavgd, a2avgd, aavgd, havgd
691  real(kind=realtype) :: alphaavg, unavg, ovaavg, ova2avg
692  real(kind=realtype) :: alphaavgd, unavgd, ovaavgd, ova2avgd
693  real(kind=realtype) :: kavg, lam1, lam2, lam3, area
694  real(kind=realtype) :: kavgd, lam1d, lam2d, lam3d
695  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
696  real(kind=realtype) :: abv1d, abv2d, abv3d, abv4d, abv5d, abv6d, &
697 & abv7d
698  real(kind=realtype), dimension(ie, je, ke, 3) :: dss
699  real(kind=realtype), dimension(ie, je, ke, 3) :: dssd
700  logical :: correctfork
701  intrinsic abs
702  intrinsic mod
703  intrinsic max
704  intrinsic min
705  intrinsic sqrt
706  real(kind=realtype) :: x1
707  real(kind=realtype) :: x1d
708  real(kind=realtype) :: x2
709  real(kind=realtype) :: x2d
710  real(kind=realtype) :: x3
711  real(kind=realtype) :: x3d
712  real(kind=realtype) :: y1
713  real(kind=realtype) :: y1d
714  real(kind=realtype) :: y2
715  real(kind=realtype) :: y2d
716  real(kind=realtype) :: y3
717  real(kind=realtype) :: y3d
718  real(kind=realtype) :: abs0
719  real(kind=realtype) :: min1
720  real(kind=realtype) :: min1d
721  real(realtype) :: max1
722  real(kind=realtype) :: max2
723  real(kind=realtype) :: max2d
724  real(kind=realtype) :: max3
725  real(kind=realtype) :: max3d
726  real(kind=realtype) :: max4
727  real(kind=realtype) :: max4d
728  real(kind=realtype) :: min2
729  real(kind=realtype) :: min2d
730  real(realtype) :: max5
731  real(kind=realtype) :: max6
732  real(kind=realtype) :: max6d
733  real(kind=realtype) :: max7
734  real(kind=realtype) :: max7d
735  real(kind=realtype) :: max8
736  real(kind=realtype) :: max8d
737  real(kind=realtype) :: min3
738  real(kind=realtype) :: min3d
739  real(realtype) :: max9
740  real(kind=realtype) :: max10
741  real(kind=realtype) :: max10d
742  real(kind=realtype) :: max11
743  real(kind=realtype) :: max11d
744  real(kind=realtype) :: max12
745  real(kind=realtype) :: max12d
746  real(kind=realtype) :: abs1
747  real(kind=realtype) :: abs1d
748  real(kind=realtype) :: abs2
749  real(kind=realtype) :: abs2d
750  real(kind=realtype) :: abs3
751  real(kind=realtype) :: abs3d
752  real(kind=realtype) :: abs4
753  real(kind=realtype) :: abs4d
754  real(kind=realtype) :: abs5
755  real(kind=realtype) :: abs5d
756  real(kind=realtype) :: abs6
757  real(kind=realtype) :: abs6d
758  real(kind=realtype) :: arg1
759  real(kind=realtype) :: arg1d
760  real(kind=realtype) :: temp
761  real(kind=realtype) :: temp0
762  real(kind=realtype) :: tempd
763  real(kind=realtype) :: tempd0
764  real(kind=realtype) :: temp1
765  real(kind=realtype) :: tempd1
766  integer :: branch
767  real(kind=realtype) :: temp2
768  real(kind=realtype) :: temp3
769  real(kind=realtype) :: tempd2
770  real(kind=realtype) :: tempd3
771  if (rfil .ge. 0.) then
772  abs0 = rfil
773  else
774  abs0 = -rfil
775  end if
776 ! check if rfil == 0. if so, the dissipative flux needs not to
777 ! be computed.
778  if (abs0 .ge. thresholdreal) then
779 ! set the value of plim. to be fully consistent this must have
780 ! the dimension of a pressure. therefore a fraction of pinfcorr
781 ! is used.
782  plim = 0.001_realtype*pinfcorr
783 ! determine whether or not the total energy must be corrected
784 ! for the presence of the turbulent kinetic energy.
785  correctfork = getcorrectfork()
786 ! initialize sface to zero. this value will be used if the
787 ! block is not moving.
788  sface = zero
789 ! set a couple of constants for the scheme.
790  fis2 = rfil*vis2
791  fis4 = rfil*vis4
792  sfil = one - rfil
793 ! initialize the dissipative residual to a certain times,
794 ! possibly zero, the previously stored value.
795 !$fwd-of ii-loop
796 ! compute the pressure sensor for each cell, in each direction:
797  do ii=0,ie*je*ke-1
798  i = mod(ii, ie) + 1
799  j = mod(ii/ie, je) + 1
800  k = ii/(ie*je) + 1
801  if (p(i+1, j, k) - p(i, j, k) .ge. 0.) then
802  abs1 = p(i+1, j, k) - p(i, j, k)
803  else
804  abs1 = -(p(i+1, j, k)-p(i, j, k))
805  end if
806  if (p(i, j, k) - p(i-1, j, k) .ge. 0.) then
807  abs4 = p(i, j, k) - p(i-1, j, k)
808  else
809  abs4 = -(p(i, j, k)-p(i-1, j, k))
810  end if
811  x1 = (p(i+1, j, k)-two*p(i, j, k)+p(i-1, j, k))/(omega*(p(i+1, j&
812 & , k)+two*p(i, j, k)+p(i-1, j, k))+oneminomega*(abs1+abs4)+plim&
813 & )
814  if (x1 .ge. 0.) then
815  dss(i, j, k, 1) = x1
816  else
817  dss(i, j, k, 1) = -x1
818  end if
819  if (p(i, j+1, k) - p(i, j, k) .ge. 0.) then
820  abs2 = p(i, j+1, k) - p(i, j, k)
821  else
822  abs2 = -(p(i, j+1, k)-p(i, j, k))
823  end if
824  if (p(i, j, k) - p(i, j-1, k) .ge. 0.) then
825  abs5 = p(i, j, k) - p(i, j-1, k)
826  else
827  abs5 = -(p(i, j, k)-p(i, j-1, k))
828  end if
829  x2 = (p(i, j+1, k)-two*p(i, j, k)+p(i, j-1, k))/(omega*(p(i, j+1&
830 & , k)+two*p(i, j, k)+p(i, j-1, k))+oneminomega*(abs2+abs5)+plim&
831 & )
832  if (x2 .ge. 0.) then
833  dss(i, j, k, 2) = x2
834  else
835  dss(i, j, k, 2) = -x2
836  end if
837  if (p(i, j, k+1) - p(i, j, k) .ge. 0.) then
838  abs3 = p(i, j, k+1) - p(i, j, k)
839  else
840  abs3 = -(p(i, j, k+1)-p(i, j, k))
841  end if
842  if (p(i, j, k) - p(i, j, k-1) .ge. 0.) then
843  abs6 = p(i, j, k) - p(i, j, k-1)
844  else
845  abs6 = -(p(i, j, k)-p(i, j, k-1))
846  end if
847  x3 = (p(i, j, k+1)-two*p(i, j, k)+p(i, j, k-1))/(omega*(p(i, j, &
848 & k+1)+two*p(i, j, k)+p(i, j, k-1))+oneminomega*(abs3+abs6)+plim&
849 & )
850  if (x3 .ge. 0.) then
851  dss(i, j, k, 3) = x3
852  else
853  dss(i, j, k, 3) = -x3
854  end if
855  end do
856 !$fwd-of ii-loop
857 !
858 ! dissipative fluxes in the i-direction.
859 !
860  do ii=0,il*ny*nz-1
861  i = mod(ii, il) + 1
862  j = mod(ii/il, ny) + 2
863  k = ii/(il*ny) + 2
864 ! compute the dissipation coefficients for this face.
865  ppor = zero
866  if (pori(i, j, k) .eq. normalflux) ppor = one
867  if (dss(i, j, k, 1) .lt. dss(i+1, j, k, 1)) then
868  y1 = dss(i+1, j, k, 1)
869  else
870  y1 = dss(i, j, k, 1)
871  end if
872  if (dpmax .gt. y1) then
873  min1 = y1
874  else
875  min1 = dpmax
876  end if
877  dis2 = ppor*fis2*min1
878  arg1 = ppor*fis4
879  dis4 = mydim(arg1, dis2)
880 ! construct the vector of the first and third differences
881 ! multiplied by the appropriate constants.
882  ddw1 = w(i+1, j, k, irho) - w(i, j, k, irho)
883  dr = dis2*ddw1 - dis4*(w(i+2, j, k, irho)-w(i-1, j, k, irho)-&
884 & three*ddw1)
885  ddw2 = w(i+1, j, k, irho)*w(i+1, j, k, ivx) - w(i, j, k, irho)*w&
886 & (i, j, k, ivx)
887  dru = dis2*ddw2 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivx)-w(i&
888 & -1, j, k, irho)*w(i-1, j, k, ivx)-three*ddw2)
889  ddw3 = w(i+1, j, k, irho)*w(i+1, j, k, ivy) - w(i, j, k, irho)*w&
890 & (i, j, k, ivy)
891  drv = dis2*ddw3 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivy)-w(i&
892 & -1, j, k, irho)*w(i-1, j, k, ivy)-three*ddw3)
893  ddw4 = w(i+1, j, k, irho)*w(i+1, j, k, ivz) - w(i, j, k, irho)*w&
894 & (i, j, k, ivz)
895  drw = dis2*ddw4 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivz)-w(i&
896 & -1, j, k, irho)*w(i-1, j, k, ivz)-three*ddw4)
897  ddw5 = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
898  dre = dis2*ddw5 - dis4*(w(i+2, j, k, irhoe)-w(i-1, j, k, irhoe)-&
899 & three*ddw5)
900 ! in case a k-equation is present, compute the difference
901 ! of rhok and store the average value of k. if not present,
902 ! set both these values to zero, such that later on no
903 ! decision needs to be made anymore.
904  if (correctfork) then
905  ddw6 = w(i+1, j, k, irho)*w(i+1, j, k, itu1) - w(i, j, k, irho&
906 & )*w(i, j, k, itu1)
907  drk = dis2*ddw6 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, itu1)-&
908 & w(i-1, j, k, irho)*w(i-1, j, k, itu1)-three*ddw6)
909  kavg = half*(w(i, j, k, itu1)+w(i+1, j, k, itu1))
910  else
911  drk = zero
912  kavg = zero
913  end if
914 ! compute the average value of gamma and compute some
915 ! expressions in which it occurs.
916  gammaavg = half*(gamma(i+1, j, k)+gamma(i, j, k))
917  gm1 = gammaavg - one
918  ovgm1 = one/gm1
919  gm53 = gammaavg - five*third
920 ! compute the average state at the interface.
921  uavg = half*(w(i+1, j, k, ivx)+w(i, j, k, ivx))
922  vavg = half*(w(i+1, j, k, ivy)+w(i, j, k, ivy))
923  wavg = half*(w(i+1, j, k, ivz)+w(i, j, k, ivz))
924  a2avg = half*(gamma(i+1, j, k)*p(i+1, j, k)/w(i+1, j, k, irho)+&
925 & gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
926  area = sqrt(si(i, j, k, 1)**2 + si(i, j, k, 2)**2 + si(i, j, k, &
927 & 3)**2)
928  if (1.e-25_realtype .lt. area) then
929  max1 = area
930  else
931  max1 = 1.e-25_realtype
932  end if
933  tmp = one/max1
934  sx = si(i, j, k, 1)*tmp
935  sy = si(i, j, k, 2)*tmp
936  sz = si(i, j, k, 3)*tmp
937  alphaavg = half*(uavg**2+vavg**2+wavg**2)
938  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
939  aavg = sqrt(a2avg)
940  unavg = uavg*sx + vavg*sy + wavg*sz
941  ovaavg = one/aavg
942  ova2avg = one/a2avg
943 ! the mesh velocity if the face is moving. it must be
944 ! divided by the area to obtain a true velocity.
945  if (addgridvelocities) sface = sfacei(i, j, k)*tmp
946  if (unavg - sface + aavg .ge. 0.) then
947  lam1 = unavg - sface + aavg
948  else
949  lam1 = -(unavg-sface+aavg)
950  end if
951  if (unavg - sface - aavg .ge. 0.) then
952  lam2 = unavg - sface - aavg
953  else
954  lam2 = -(unavg-sface-aavg)
955  end if
956  if (unavg - sface .ge. 0.) then
957  lam3 = unavg - sface
958  else
959  lam3 = -(unavg-sface)
960  end if
961  rrad = lam3 + aavg
962  if (lam1 .lt. epsacoustic*rrad) then
963  max2 = epsacoustic*rrad
964  else
965  max2 = lam1
966  end if
967 ! multiply the eigenvalues by the area to obtain
968 ! the correct values for the dissipation term.
969  lam1 = max2*area
970  if (lam2 .lt. epsacoustic*rrad) then
971  max3 = epsacoustic*rrad
972  else
973  max3 = lam2
974  end if
975  lam2 = max3*area
976  if (lam3 .lt. epsshear*rrad) then
977  max4 = epsshear*rrad
978  else
979  max4 = lam3
980  end if
981  lam3 = max4*area
982 ! some abbreviations, which occur quite often in the
983 ! dissipation terms.
984  abv1 = half*(lam1+lam2)
985  abv2 = half*(lam1-lam2)
986  abv3 = abv1 - lam3
987  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53*&
988 & drk
989  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
990  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
991  abv7 = abv2*abv4*ovaavg + abv3*abv5
992 ! compute and scatter the dissipative flux.
993 ! density.
994  fs = lam3*dr + abv6
995  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
996  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
997 ! x-momentum.
998  fs = lam3*dru + uavg*abv6 + sx*abv7
999  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
1000  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
1001 ! y-momentum.
1002  fs = lam3*drv + vavg*abv6 + sy*abv7
1003  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
1004  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
1005 ! z-momentum.
1006  fs = lam3*drw + wavg*abv6 + sz*abv7
1007  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
1008  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
1009 ! energy.
1010  fs = lam3*dre + havg*abv6 + unavg*abv7
1011  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
1012  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
1013  end do
1014 !$fwd-of ii-loop
1015 !
1016 ! dissipative fluxes in the j-direction.
1017 !
1018  do ii=0,nx*jl*nz-1
1019  i = mod(ii, nx) + 2
1020  j = mod(ii/nx, jl) + 1
1021  k = ii/(nx*jl) + 2
1022 ! compute the dissipation coefficients for this face.
1023  ppor = zero
1024  if (porj(i, j, k) .eq. normalflux) ppor = one
1025  if (dss(i, j, k, 2) .lt. dss(i, j+1, k, 2)) then
1026  y2 = dss(i, j+1, k, 2)
1027  else
1028  y2 = dss(i, j, k, 2)
1029  end if
1030  if (dpmax .gt. y2) then
1031  min2 = y2
1032  else
1033  min2 = dpmax
1034  end if
1035  dis2 = ppor*fis2*min2
1036  arg1 = ppor*fis4
1037  dis4 = mydim(arg1, dis2)
1038 ! construct the vector of the first and third differences
1039 ! multiplied by the appropriate constants.
1040  ddw1 = w(i, j+1, k, irho) - w(i, j, k, irho)
1041  dr = dis2*ddw1 - dis4*(w(i, j+2, k, irho)-w(i, j-1, k, irho)-&
1042 & three*ddw1)
1043  ddw2 = w(i, j+1, k, irho)*w(i, j+1, k, ivx) - w(i, j, k, irho)*w&
1044 & (i, j, k, ivx)
1045  dru = dis2*ddw2 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivx)-w(i&
1046 & , j-1, k, irho)*w(i, j-1, k, ivx)-three*ddw2)
1047  ddw3 = w(i, j+1, k, irho)*w(i, j+1, k, ivy) - w(i, j, k, irho)*w&
1048 & (i, j, k, ivy)
1049  drv = dis2*ddw3 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivy)-w(i&
1050 & , j-1, k, irho)*w(i, j-1, k, ivy)-three*ddw3)
1051  ddw4 = w(i, j+1, k, irho)*w(i, j+1, k, ivz) - w(i, j, k, irho)*w&
1052 & (i, j, k, ivz)
1053  drw = dis2*ddw4 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivz)-w(i&
1054 & , j-1, k, irho)*w(i, j-1, k, ivz)-three*ddw4)
1055  ddw5 = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
1056  dre = dis2*ddw5 - dis4*(w(i, j+2, k, irhoe)-w(i, j-1, k, irhoe)-&
1057 & three*ddw5)
1058 ! in case a k-equation is present, compute the difference
1059 ! of rhok and store the average value of k. if not present,
1060 ! set both these values to zero, such that later on no
1061 ! decision needs to be made anymore.
1062  if (correctfork) then
1063  ddw6 = w(i, j+1, k, irho)*w(i, j+1, k, itu1) - w(i, j, k, irho&
1064 & )*w(i, j, k, itu1)
1065  drk = dis2*ddw6 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, itu1)-&
1066 & w(i, j-1, k, irho)*w(i, j-1, k, itu1)-three*ddw6)
1067  kavg = half*(w(i, j, k, itu1)+w(i, j+1, k, itu1))
1068  else
1069  drk = zero
1070  kavg = zero
1071  end if
1072 ! compute the average value of gamma and compute some
1073 ! expressions in which it occurs.
1074  gammaavg = half*(gamma(i, j+1, k)+gamma(i, j, k))
1075  gm1 = gammaavg - one
1076  ovgm1 = one/gm1
1077  gm53 = gammaavg - five*third
1078 ! compute the average state at the interface.
1079  uavg = half*(w(i, j+1, k, ivx)+w(i, j, k, ivx))
1080  vavg = half*(w(i, j+1, k, ivy)+w(i, j, k, ivy))
1081  wavg = half*(w(i, j+1, k, ivz)+w(i, j, k, ivz))
1082  a2avg = half*(gamma(i, j+1, k)*p(i, j+1, k)/w(i, j+1, k, irho)+&
1083 & gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
1084  area = sqrt(sj(i, j, k, 1)**2 + sj(i, j, k, 2)**2 + sj(i, j, k, &
1085 & 3)**2)
1086  if (1.e-25_realtype .lt. area) then
1087  max5 = area
1088  else
1089  max5 = 1.e-25_realtype
1090  end if
1091  tmp = one/max5
1092  sx = sj(i, j, k, 1)*tmp
1093  sy = sj(i, j, k, 2)*tmp
1094  sz = sj(i, j, k, 3)*tmp
1095  alphaavg = half*(uavg**2+vavg**2+wavg**2)
1096  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
1097  aavg = sqrt(a2avg)
1098  unavg = uavg*sx + vavg*sy + wavg*sz
1099  ovaavg = one/aavg
1100  ova2avg = one/a2avg
1101 ! the mesh velocity if the face is moving. it must be
1102 ! divided by the area to obtain a true velocity.
1103  if (addgridvelocities) sface = sfacej(i, j, k)*tmp
1104  if (unavg - sface + aavg .ge. 0.) then
1105  lam1 = unavg - sface + aavg
1106  else
1107  lam1 = -(unavg-sface+aavg)
1108  end if
1109  if (unavg - sface - aavg .ge. 0.) then
1110  lam2 = unavg - sface - aavg
1111  else
1112  lam2 = -(unavg-sface-aavg)
1113  end if
1114  if (unavg - sface .ge. 0.) then
1115  lam3 = unavg - sface
1116  else
1117  lam3 = -(unavg-sface)
1118  end if
1119  rrad = lam3 + aavg
1120  if (lam1 .lt. epsacoustic*rrad) then
1121  max6 = epsacoustic*rrad
1122  else
1123  max6 = lam1
1124  end if
1125 ! multiply the eigenvalues by the area to obtain
1126 ! the correct values for the dissipation term.
1127  lam1 = max6*area
1128  if (lam2 .lt. epsacoustic*rrad) then
1129  max7 = epsacoustic*rrad
1130  else
1131  max7 = lam2
1132  end if
1133  lam2 = max7*area
1134  if (lam3 .lt. epsshear*rrad) then
1135  max8 = epsshear*rrad
1136  else
1137  max8 = lam3
1138  end if
1139  lam3 = max8*area
1140 ! some abbreviations, which occur quite often in the
1141 ! dissipation terms.
1142  abv1 = half*(lam1+lam2)
1143  abv2 = half*(lam1-lam2)
1144  abv3 = abv1 - lam3
1145  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53*&
1146 & drk
1147  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
1148  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
1149  abv7 = abv2*abv4*ovaavg + abv3*abv5
1150 ! compute and scatter the dissipative flux.
1151 ! density.
1152  fs = lam3*dr + abv6
1153  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
1154  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
1155 ! x-momentum.
1156  fs = lam3*dru + uavg*abv6 + sx*abv7
1157  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
1158  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
1159 ! y-momentum.
1160  fs = lam3*drv + vavg*abv6 + sy*abv7
1161  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
1162  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
1163 ! z-momentum.
1164  fs = lam3*drw + wavg*abv6 + sz*abv7
1165  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
1166  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
1167 ! energy.
1168  fs = lam3*dre + havg*abv6 + unavg*abv7
1169  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
1170  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
1171  end do
1172  dssd = 0.0_8
1173 !$bwd-of ii-loop
1174  do ii=0,nx*ny*kl-1
1175  i = mod(ii, nx) + 2
1176  j = mod(ii/nx, ny) + 2
1177  k = ii/(nx*ny) + 1
1178 ! compute the dissipation coefficients for this face.
1179  ppor = zero
1180  if (pork(i, j, k) .eq. normalflux) ppor = one
1181  if (dss(i, j, k, 3) .lt. dss(i, j, k+1, 3)) then
1182  y3 = dss(i, j, k+1, 3)
1183 myintptr = myintptr + 1
1184  myintstack(myintptr) = 0
1185  else
1186  y3 = dss(i, j, k, 3)
1187 myintptr = myintptr + 1
1188  myintstack(myintptr) = 1
1189  end if
1190  if (dpmax .gt. y3) then
1191  min3 = y3
1192 myintptr = myintptr + 1
1193  myintstack(myintptr) = 0
1194  else
1195  min3 = dpmax
1196 myintptr = myintptr + 1
1197  myintstack(myintptr) = 1
1198  end if
1199  dis2 = ppor*fis2*min3
1200  arg1 = ppor*fis4
1201  dis4 = mydim(arg1, dis2)
1202 ! construct the vector of the first and third differences
1203 ! multiplied by the appropriate constants.
1204  ddw1 = w(i, j, k+1, irho) - w(i, j, k, irho)
1205  dr = dis2*ddw1 - dis4*(w(i, j, k+2, irho)-w(i, j, k-1, irho)-&
1206 & three*ddw1)
1207  ddw2 = w(i, j, k+1, irho)*w(i, j, k+1, ivx) - w(i, j, k, irho)*w&
1208 & (i, j, k, ivx)
1209  dru = dis2*ddw2 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, ivx)-w(i&
1210 & , j, k-1, irho)*w(i, j, k-1, ivx)-three*ddw2)
1211  ddw3 = w(i, j, k+1, irho)*w(i, j, k+1, ivy) - w(i, j, k, irho)*w&
1212 & (i, j, k, ivy)
1213  drv = dis2*ddw3 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, ivy)-w(i&
1214 & , j, k-1, irho)*w(i, j, k-1, ivy)-three*ddw3)
1215  ddw4 = w(i, j, k+1, irho)*w(i, j, k+1, ivz) - w(i, j, k, irho)*w&
1216 & (i, j, k, ivz)
1217  drw = dis2*ddw4 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, ivz)-w(i&
1218 & , j, k-1, irho)*w(i, j, k-1, ivz)-three*ddw4)
1219  ddw5 = w(i, j, k+1, irhoe) - w(i, j, k, irhoe)
1220  dre = dis2*ddw5 - dis4*(w(i, j, k+2, irhoe)-w(i, j, k-1, irhoe)-&
1221 & three*ddw5)
1222 ! in case a k-equation is present, compute the difference
1223 ! of rhok and store the average value of k. if not present,
1224 ! set both these values to zero, such that later on no
1225 ! decision needs to be made anymore.
1226  if (correctfork) then
1227  ddw6 = w(i, j, k+1, irho)*w(i, j, k+1, itu1) - w(i, j, k, irho&
1228 & )*w(i, j, k, itu1)
1229  drk = dis2*ddw6 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, itu1)-&
1230 & w(i, j, k-1, irho)*w(i, j, k-1, itu1)-three*ddw6)
1231  kavg = half*(w(i, j, k+1, itu1)+w(i, j, k, itu1))
1232 myintptr = myintptr + 1
1233  myintstack(myintptr) = 1
1234  else
1235  drk = zero
1236  kavg = zero
1237 myintptr = myintptr + 1
1238  myintstack(myintptr) = 0
1239  end if
1240 ! compute the average value of gamma and compute some
1241 ! expressions in which it occurs.
1242  gammaavg = half*(gamma(i, j, k+1)+gamma(i, j, k))
1243  gm1 = gammaavg - one
1244  ovgm1 = one/gm1
1245  gm53 = gammaavg - five*third
1246 ! compute the average state at the interface.
1247  uavg = half*(w(i, j, k+1, ivx)+w(i, j, k, ivx))
1248  vavg = half*(w(i, j, k+1, ivy)+w(i, j, k, ivy))
1249  wavg = half*(w(i, j, k+1, ivz)+w(i, j, k, ivz))
1250  a2avg = half*(gamma(i, j, k+1)*p(i, j, k+1)/w(i, j, k+1, irho)+&
1251 & gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
1252  area = sqrt(sk(i, j, k, 1)**2 + sk(i, j, k, 2)**2 + sk(i, j, k, &
1253 & 3)**2)
1254  if (1.e-25_realtype .lt. area) then
1255  max9 = area
1256  else
1257  max9 = 1.e-25_realtype
1258  end if
1259  tmp = one/max9
1260  sx = sk(i, j, k, 1)*tmp
1261  sy = sk(i, j, k, 2)*tmp
1262  sz = sk(i, j, k, 3)*tmp
1263  alphaavg = half*(uavg**2+vavg**2+wavg**2)
1264  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
1265  aavg = sqrt(a2avg)
1266  unavg = uavg*sx + vavg*sy + wavg*sz
1267  ovaavg = one/aavg
1268  ova2avg = one/a2avg
1269 ! the mesh velocity if the face is moving. it must be
1270 ! divided by the area to obtain a true velocity.
1271  if (addgridvelocities) sface = sfacek(i, j, k)*tmp
1272  if (unavg - sface + aavg .ge. 0.) then
1273  lam1 = unavg - sface + aavg
1274 myintptr = myintptr + 1
1275  myintstack(myintptr) = 0
1276  else
1277  lam1 = -(unavg-sface+aavg)
1278 myintptr = myintptr + 1
1279  myintstack(myintptr) = 1
1280  end if
1281  if (unavg - sface - aavg .ge. 0.) then
1282  lam2 = unavg - sface - aavg
1283 myintptr = myintptr + 1
1284  myintstack(myintptr) = 0
1285  else
1286  lam2 = -(unavg-sface-aavg)
1287 myintptr = myintptr + 1
1288  myintstack(myintptr) = 1
1289  end if
1290  if (unavg - sface .ge. 0.) then
1291  lam3 = unavg - sface
1292 myintptr = myintptr + 1
1293  myintstack(myintptr) = 0
1294  else
1295  lam3 = -(unavg-sface)
1296 myintptr = myintptr + 1
1297  myintstack(myintptr) = 1
1298  end if
1299  rrad = lam3 + aavg
1300  if (lam1 .lt. epsacoustic*rrad) then
1301  max10 = epsacoustic*rrad
1302 myintptr = myintptr + 1
1303  myintstack(myintptr) = 0
1304  else
1305  max10 = lam1
1306 myintptr = myintptr + 1
1307  myintstack(myintptr) = 1
1308  end if
1309 ! multiply the eigenvalues by the area to obtain
1310 ! the correct values for the dissipation term.
1311  lam1 = max10*area
1312  if (lam2 .lt. epsacoustic*rrad) then
1313  max11 = epsacoustic*rrad
1314 myintptr = myintptr + 1
1315  myintstack(myintptr) = 0
1316  else
1317  max11 = lam2
1318 myintptr = myintptr + 1
1319  myintstack(myintptr) = 1
1320  end if
1321  lam2 = max11*area
1322  if (lam3 .lt. epsshear*rrad) then
1323  max12 = epsshear*rrad
1324 myintptr = myintptr + 1
1325  myintstack(myintptr) = 0
1326  else
1327  max12 = lam3
1328 myintptr = myintptr + 1
1329  myintstack(myintptr) = 1
1330  end if
1331  lam3 = max12*area
1332 ! some abbreviations, which occur quite often in the
1333 ! dissipation terms.
1334  abv1 = half*(lam1+lam2)
1335  abv2 = half*(lam1-lam2)
1336  abv3 = abv1 - lam3
1337  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53*&
1338 & drk
1339  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
1340  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
1341  abv7 = abv2*abv4*ovaavg + abv3*abv5
1342 ! compute and scatter the dissipative flux.
1343 ! density.
1344 ! x-momentum.
1345 ! y-momentum.
1346 ! z-momentum.
1347 ! energy.
1348  fsd = fwd(i, j, k+1, irhoe) - fwd(i, j, k, irhoe)
1349  lam3d = dre*fsd
1350  dred = lam3*fsd
1351  havgd = abv6*fsd
1352  abv6d = havg*fsd
1353  unavgd = abv7*fsd
1354  abv7d = unavg*fsd
1355  fsd = fwd(i, j, k+1, imz) - fwd(i, j, k, imz)
1356  lam3d = lam3d + drw*fsd
1357  drwd = lam3*fsd
1358  wavgd = abv6*fsd
1359  abv6d = abv6d + wavg*fsd
1360  abv7d = abv7d + sz*fsd
1361  fsd = fwd(i, j, k+1, imy) - fwd(i, j, k, imy)
1362  lam3d = lam3d + drv*fsd
1363  drvd = lam3*fsd
1364  vavgd = abv6*fsd
1365  abv6d = abv6d + vavg*fsd
1366  abv7d = abv7d + sy*fsd
1367  fsd = fwd(i, j, k+1, imx) - fwd(i, j, k, imx)
1368  lam3d = lam3d + dru*fsd
1369  drud = lam3*fsd
1370  uavgd = abv6*fsd
1371  abv6d = abv6d + uavg*fsd
1372  abv7d = abv7d + sx*fsd
1373  fsd = fwd(i, j, k+1, irho) - fwd(i, j, k, irho)
1374  abv6d = abv6d + fsd
1375  abv2d = abv4*ovaavg*abv7d + abv5*ovaavg*abv6d
1376  abv4d = abv2*ovaavg*abv7d + abv3*ova2avg*abv6d
1377  ovaavgd = abv2*abv4*abv7d + abv2*abv5*abv6d
1378  abv3d = abv5*abv7d + abv4*ova2avg*abv6d
1379  lam3d = lam3d + dr*fsd - abv3d
1380  abv5d = abv3*abv7d + abv2*ovaavg*abv6d
1381  ova2avgd = abv3*abv4*abv6d
1382  unavgd = unavgd - dr*abv5d
1383  tempd2 = gm1*abv4d
1384  drd = lam3*fsd + alphaavg*tempd2 - unavg*abv5d
1385  drud = drud + sx*abv5d - uavg*tempd2
1386  drvd = drvd + sy*abv5d - vavg*tempd2
1387  drwd = drwd + sz*abv5d - wavg*tempd2
1388  drkd = -(gm53*abv4d)
1389  alphaavgd = dr*tempd2
1390  uavgd = uavgd - dru*tempd2
1391  vavgd = vavgd - drv*tempd2
1392  dred = dred + tempd2
1393  wavgd = wavgd - drw*tempd2
1394  abv1d = abv3d
1395  lam1d = half*abv2d + half*abv1d
1396  lam2d = half*abv1d - half*abv2d
1397  max12d = area*lam3d
1398 branch = myintstack(myintptr)
1399  myintptr = myintptr - 1
1400  if (branch .eq. 0) then
1401  rradd = epsshear*max12d
1402  lam3d = 0.0_8
1403  else
1404  lam3d = max12d
1405  rradd = 0.0_8
1406  end if
1407  max11d = area*lam2d
1408 branch = myintstack(myintptr)
1409  myintptr = myintptr - 1
1410  if (branch .eq. 0) then
1411  rradd = rradd + epsacoustic*max11d
1412  lam2d = 0.0_8
1413  else
1414  lam2d = max11d
1415  end if
1416  max10d = area*lam1d
1417 branch = myintstack(myintptr)
1418  myintptr = myintptr - 1
1419  if (branch .eq. 0) then
1420  rradd = rradd + epsacoustic*max10d
1421  lam1d = 0.0_8
1422  else
1423  lam1d = max10d
1424  end if
1425  lam3d = lam3d + rradd
1426  aavgd = rradd
1427 branch = myintstack(myintptr)
1428  myintptr = myintptr - 1
1429  if (branch .eq. 0) then
1430  unavgd = unavgd + lam3d
1431  else
1432  unavgd = unavgd - lam3d
1433  end if
1434 branch = myintstack(myintptr)
1435  myintptr = myintptr - 1
1436  if (branch .eq. 0) then
1437  unavgd = unavgd + lam2d
1438  aavgd = aavgd - lam2d
1439  else
1440  aavgd = aavgd + lam2d
1441  unavgd = unavgd - lam2d
1442  end if
1443 branch = myintstack(myintptr)
1444  myintptr = myintptr - 1
1445  if (branch .eq. 0) then
1446  unavgd = unavgd + lam1d
1447  aavgd = aavgd + lam1d
1448  else
1449  unavgd = unavgd - lam1d
1450  aavgd = aavgd - lam1d
1451  end if
1452  alphaavgd = alphaavgd + havgd
1453  tempd2 = half*alphaavgd
1454  aavgd = aavgd - one*ovaavgd/aavg**2
1455  if (a2avg .eq. 0.0_8) then
1456  a2avgd = ovgm1*havgd - one*ova2avgd/a2avg**2
1457  else
1458  a2avgd = aavgd/(2.0*sqrt(a2avg)) - one*ova2avgd/a2avg**2 + &
1459 & ovgm1*havgd
1460  end if
1461  uavgd = uavgd + sx*unavgd + 2*uavg*tempd2
1462  vavgd = vavgd + sy*unavgd + 2*vavg*tempd2
1463  wavgd = wavgd + sz*unavgd + 2*wavg*tempd2
1464  kavgd = -(gm53*ovgm1*havgd)
1465  temp3 = w(i, j, k+1, irho)
1466  temp1 = w(i, j, k, irho)
1467  tempd3 = gamma(i, j, k+1)*half*a2avgd/temp3
1468  tempd = gamma(i, j, k)*half*a2avgd/temp1
1469  pd(i, j, k) = pd(i, j, k) + tempd
1470  wd(i, j, k, irho) = wd(i, j, k, irho) - p(i, j, k)*tempd/temp1
1471  pd(i, j, k+1) = pd(i, j, k+1) + tempd3
1472  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) - p(i, j, k+1)*tempd3/&
1473 & temp3
1474  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + half*wavgd
1475  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wavgd
1476  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + half*vavgd
1477  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vavgd
1478  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + half*uavgd
1479  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*uavgd
1480 branch = myintstack(myintptr)
1481  myintptr = myintptr - 1
1482  if (branch .eq. 0) then
1483  dis2d = 0.0_8
1484  dis4d = 0.0_8
1485  else
1486  tempd0 = -(dis4*drkd)
1487  wd(i, j, k+1, itu1) = wd(i, j, k+1, itu1) + half*kavgd
1488  wd(i, j, k, itu1) = wd(i, j, k, itu1) + half*kavgd
1489  temp3 = w(i, j, k-1, itu1)
1490  temp2 = w(i, j, k-1, irho)
1491  temp1 = w(i, j, k+2, itu1)
1492  temp0 = w(i, j, k+2, irho)
1493  dis2d = ddw6*drkd
1494  ddw6d = dis2*drkd - three*tempd0
1495  dis4d = -((temp0*temp1-temp2*temp3-three*ddw6)*drkd)
1496  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + temp1*tempd0
1497  wd(i, j, k+2, itu1) = wd(i, j, k+2, itu1) + temp0*tempd0
1498  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - temp3*tempd0
1499  wd(i, j, k-1, itu1) = wd(i, j, k-1, itu1) - temp2*tempd0
1500  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, itu1)&
1501 & *ddw6d
1502  wd(i, j, k+1, itu1) = wd(i, j, k+1, itu1) + w(i, j, k+1, irho)&
1503 & *ddw6d
1504  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, itu1)*ddw6d
1505  wd(i, j, k, itu1) = wd(i, j, k, itu1) - w(i, j, k, irho)*ddw6d
1506  end if
1507  tempd0 = -(dis4*drwd)
1508  temp0 = w(i, j, k+2, irho)
1509  temp1 = w(i, j, k+2, ivz)
1510  temp2 = w(i, j, k-1, irho)
1511  temp3 = w(i, j, k-1, ivz)
1512  tempd2 = -(dis4*dred)
1513  dis2d = dis2d + ddw5*dred + ddw4*drwd + ddw3*drvd + ddw2*drud + &
1514 & ddw1*drd
1515  ddw5d = dis2*dred - three*tempd2
1516  dis4d = dis4d - (w(i, j, k+2, irhoe)-w(i, j, k-1, irhoe)-three*&
1517 & ddw5)*dred - (temp0*temp1-temp2*temp3-three*ddw4)*drwd
1518  wd(i, j, k+2, irhoe) = wd(i, j, k+2, irhoe) + tempd2
1519  wd(i, j, k-1, irhoe) = wd(i, j, k-1, irhoe) - tempd2
1520  wd(i, j, k+1, irhoe) = wd(i, j, k+1, irhoe) + ddw5d
1521  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddw5d
1522  ddw4d = dis2*drwd - three*tempd0
1523  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + temp1*tempd0
1524  wd(i, j, k+2, ivz) = wd(i, j, k+2, ivz) + temp0*tempd0
1525  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - temp3*tempd0
1526  wd(i, j, k-1, ivz) = wd(i, j, k-1, ivz) - temp2*tempd0
1527  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, ivz)*&
1528 & ddw4d
1529  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + w(i, j, k+1, irho)*&
1530 & ddw4d
1531  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivz)*ddw4d
1532  wd(i, j, k, ivz) = wd(i, j, k, ivz) - w(i, j, k, irho)*ddw4d
1533  temp3 = w(i, j, k-1, ivy)
1534  temp2 = w(i, j, k-1, irho)
1535  temp1 = w(i, j, k+2, ivy)
1536  temp0 = w(i, j, k+2, irho)
1537  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw3)*drvd
1538  tempd0 = -(dis4*drvd)
1539  ddw3d = dis2*drvd - three*tempd0
1540  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + temp1*tempd0
1541  wd(i, j, k+2, ivy) = wd(i, j, k+2, ivy) + temp0*tempd0
1542  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - temp3*tempd0
1543  wd(i, j, k-1, ivy) = wd(i, j, k-1, ivy) - temp2*tempd0
1544  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, ivy)*&
1545 & ddw3d
1546  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + w(i, j, k+1, irho)*&
1547 & ddw3d
1548  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivy)*ddw3d
1549  wd(i, j, k, ivy) = wd(i, j, k, ivy) - w(i, j, k, irho)*ddw3d
1550  temp3 = w(i, j, k-1, ivx)
1551  temp2 = w(i, j, k-1, irho)
1552  temp1 = w(i, j, k+2, ivx)
1553  temp0 = w(i, j, k+2, irho)
1554  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw2)*drud - (w(i&
1555 & , j, k+2, irho)-w(i, j, k-1, irho)-three*ddw1)*drd
1556  tempd0 = -(dis4*drud)
1557  ddw2d = dis2*drud - three*tempd0
1558  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + temp1*tempd0
1559  wd(i, j, k+2, ivx) = wd(i, j, k+2, ivx) + temp0*tempd0
1560  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - temp3*tempd0
1561  wd(i, j, k-1, ivx) = wd(i, j, k-1, ivx) - temp2*tempd0
1562  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, ivx)*&
1563 & ddw2d
1564  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + w(i, j, k+1, irho)*&
1565 & ddw2d
1566  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivx)*ddw2d
1567  wd(i, j, k, ivx) = wd(i, j, k, ivx) - w(i, j, k, irho)*ddw2d
1568  tempd2 = -(dis4*drd)
1569  ddw1d = dis2*drd - three*tempd2
1570  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + tempd2
1571  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - tempd2
1572  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + ddw1d
1573  wd(i, j, k, irho) = wd(i, j, k, irho) - ddw1d
1574  call mydim_fast_b(arg1, arg1d, dis2, dis2d, dis4d)
1575  min3d = ppor*fis2*dis2d
1576 branch = myintstack(myintptr)
1577  myintptr = myintptr - 1
1578  if (branch .eq. 0) then
1579  y3d = min3d
1580  else
1581  y3d = 0.0_8
1582  end if
1583 branch = myintstack(myintptr)
1584  myintptr = myintptr - 1
1585  if (branch .eq. 0) then
1586  dssd(i, j, k+1, 3) = dssd(i, j, k+1, 3) + y3d
1587  else
1588  dssd(i, j, k, 3) = dssd(i, j, k, 3) + y3d
1589  end if
1590  end do
1591 !$bwd-of ii-loop
1592  do ii=0,nx*jl*nz-1
1593  i = mod(ii, nx) + 2
1594  j = mod(ii/nx, jl) + 1
1595  k = ii/(nx*jl) + 2
1596 ! compute the dissipation coefficients for this face.
1597  ppor = zero
1598  if (porj(i, j, k) .eq. normalflux) ppor = one
1599  if (dss(i, j, k, 2) .lt. dss(i, j+1, k, 2)) then
1600  y2 = dss(i, j+1, k, 2)
1601 myintptr = myintptr + 1
1602  myintstack(myintptr) = 0
1603  else
1604  y2 = dss(i, j, k, 2)
1605 myintptr = myintptr + 1
1606  myintstack(myintptr) = 1
1607  end if
1608  if (dpmax .gt. y2) then
1609  min2 = y2
1610 myintptr = myintptr + 1
1611  myintstack(myintptr) = 0
1612  else
1613  min2 = dpmax
1614 myintptr = myintptr + 1
1615  myintstack(myintptr) = 1
1616  end if
1617  dis2 = ppor*fis2*min2
1618  arg1 = ppor*fis4
1619  dis4 = mydim(arg1, dis2)
1620 ! construct the vector of the first and third differences
1621 ! multiplied by the appropriate constants.
1622  ddw1 = w(i, j+1, k, irho) - w(i, j, k, irho)
1623  dr = dis2*ddw1 - dis4*(w(i, j+2, k, irho)-w(i, j-1, k, irho)-&
1624 & three*ddw1)
1625  ddw2 = w(i, j+1, k, irho)*w(i, j+1, k, ivx) - w(i, j, k, irho)*w&
1626 & (i, j, k, ivx)
1627  dru = dis2*ddw2 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivx)-w(i&
1628 & , j-1, k, irho)*w(i, j-1, k, ivx)-three*ddw2)
1629  ddw3 = w(i, j+1, k, irho)*w(i, j+1, k, ivy) - w(i, j, k, irho)*w&
1630 & (i, j, k, ivy)
1631  drv = dis2*ddw3 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivy)-w(i&
1632 & , j-1, k, irho)*w(i, j-1, k, ivy)-three*ddw3)
1633  ddw4 = w(i, j+1, k, irho)*w(i, j+1, k, ivz) - w(i, j, k, irho)*w&
1634 & (i, j, k, ivz)
1635  drw = dis2*ddw4 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivz)-w(i&
1636 & , j-1, k, irho)*w(i, j-1, k, ivz)-three*ddw4)
1637  ddw5 = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
1638  dre = dis2*ddw5 - dis4*(w(i, j+2, k, irhoe)-w(i, j-1, k, irhoe)-&
1639 & three*ddw5)
1640 ! in case a k-equation is present, compute the difference
1641 ! of rhok and store the average value of k. if not present,
1642 ! set both these values to zero, such that later on no
1643 ! decision needs to be made anymore.
1644  if (correctfork) then
1645  ddw6 = w(i, j+1, k, irho)*w(i, j+1, k, itu1) - w(i, j, k, irho&
1646 & )*w(i, j, k, itu1)
1647  drk = dis2*ddw6 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, itu1)-&
1648 & w(i, j-1, k, irho)*w(i, j-1, k, itu1)-three*ddw6)
1649  kavg = half*(w(i, j, k, itu1)+w(i, j+1, k, itu1))
1650 myintptr = myintptr + 1
1651  myintstack(myintptr) = 1
1652  else
1653  drk = zero
1654  kavg = zero
1655 myintptr = myintptr + 1
1656  myintstack(myintptr) = 0
1657  end if
1658 ! compute the average value of gamma and compute some
1659 ! expressions in which it occurs.
1660  gammaavg = half*(gamma(i, j+1, k)+gamma(i, j, k))
1661  gm1 = gammaavg - one
1662  ovgm1 = one/gm1
1663  gm53 = gammaavg - five*third
1664 ! compute the average state at the interface.
1665  uavg = half*(w(i, j+1, k, ivx)+w(i, j, k, ivx))
1666  vavg = half*(w(i, j+1, k, ivy)+w(i, j, k, ivy))
1667  wavg = half*(w(i, j+1, k, ivz)+w(i, j, k, ivz))
1668  a2avg = half*(gamma(i, j+1, k)*p(i, j+1, k)/w(i, j+1, k, irho)+&
1669 & gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
1670  area = sqrt(sj(i, j, k, 1)**2 + sj(i, j, k, 2)**2 + sj(i, j, k, &
1671 & 3)**2)
1672  if (1.e-25_realtype .lt. area) then
1673  max5 = area
1674  else
1675  max5 = 1.e-25_realtype
1676  end if
1677  tmp = one/max5
1678  sx = sj(i, j, k, 1)*tmp
1679  sy = sj(i, j, k, 2)*tmp
1680  sz = sj(i, j, k, 3)*tmp
1681  alphaavg = half*(uavg**2+vavg**2+wavg**2)
1682  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
1683  aavg = sqrt(a2avg)
1684  unavg = uavg*sx + vavg*sy + wavg*sz
1685  ovaavg = one/aavg
1686  ova2avg = one/a2avg
1687 ! the mesh velocity if the face is moving. it must be
1688 ! divided by the area to obtain a true velocity.
1689  if (addgridvelocities) sface = sfacej(i, j, k)*tmp
1690  if (unavg - sface + aavg .ge. 0.) then
1691  lam1 = unavg - sface + aavg
1692 myintptr = myintptr + 1
1693  myintstack(myintptr) = 0
1694  else
1695  lam1 = -(unavg-sface+aavg)
1696 myintptr = myintptr + 1
1697  myintstack(myintptr) = 1
1698  end if
1699  if (unavg - sface - aavg .ge. 0.) then
1700  lam2 = unavg - sface - aavg
1701 myintptr = myintptr + 1
1702  myintstack(myintptr) = 0
1703  else
1704  lam2 = -(unavg-sface-aavg)
1705 myintptr = myintptr + 1
1706  myintstack(myintptr) = 1
1707  end if
1708  if (unavg - sface .ge. 0.) then
1709  lam3 = unavg - sface
1710 myintptr = myintptr + 1
1711  myintstack(myintptr) = 0
1712  else
1713  lam3 = -(unavg-sface)
1714 myintptr = myintptr + 1
1715  myintstack(myintptr) = 1
1716  end if
1717  rrad = lam3 + aavg
1718  if (lam1 .lt. epsacoustic*rrad) then
1719  max6 = epsacoustic*rrad
1720 myintptr = myintptr + 1
1721  myintstack(myintptr) = 0
1722  else
1723  max6 = lam1
1724 myintptr = myintptr + 1
1725  myintstack(myintptr) = 1
1726  end if
1727 ! multiply the eigenvalues by the area to obtain
1728 ! the correct values for the dissipation term.
1729  lam1 = max6*area
1730  if (lam2 .lt. epsacoustic*rrad) then
1731  max7 = epsacoustic*rrad
1732 myintptr = myintptr + 1
1733  myintstack(myintptr) = 0
1734  else
1735  max7 = lam2
1736 myintptr = myintptr + 1
1737  myintstack(myintptr) = 1
1738  end if
1739  lam2 = max7*area
1740  if (lam3 .lt. epsshear*rrad) then
1741  max8 = epsshear*rrad
1742 myintptr = myintptr + 1
1743  myintstack(myintptr) = 0
1744  else
1745  max8 = lam3
1746 myintptr = myintptr + 1
1747  myintstack(myintptr) = 1
1748  end if
1749  lam3 = max8*area
1750 ! some abbreviations, which occur quite often in the
1751 ! dissipation terms.
1752  abv1 = half*(lam1+lam2)
1753  abv2 = half*(lam1-lam2)
1754  abv3 = abv1 - lam3
1755  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53*&
1756 & drk
1757  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
1758  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
1759  abv7 = abv2*abv4*ovaavg + abv3*abv5
1760 ! compute and scatter the dissipative flux.
1761 ! density.
1762 ! x-momentum.
1763 ! y-momentum.
1764 ! z-momentum.
1765 ! energy.
1766  fsd = fwd(i, j+1, k, irhoe) - fwd(i, j, k, irhoe)
1767  lam3d = dre*fsd
1768  dred = lam3*fsd
1769  havgd = abv6*fsd
1770  abv6d = havg*fsd
1771  unavgd = abv7*fsd
1772  abv7d = unavg*fsd
1773  fsd = fwd(i, j+1, k, imz) - fwd(i, j, k, imz)
1774  lam3d = lam3d + drw*fsd
1775  drwd = lam3*fsd
1776  wavgd = abv6*fsd
1777  abv6d = abv6d + wavg*fsd
1778  abv7d = abv7d + sz*fsd
1779  fsd = fwd(i, j+1, k, imy) - fwd(i, j, k, imy)
1780  lam3d = lam3d + drv*fsd
1781  drvd = lam3*fsd
1782  vavgd = abv6*fsd
1783  abv6d = abv6d + vavg*fsd
1784  abv7d = abv7d + sy*fsd
1785  fsd = fwd(i, j+1, k, imx) - fwd(i, j, k, imx)
1786  lam3d = lam3d + dru*fsd
1787  drud = lam3*fsd
1788  uavgd = abv6*fsd
1789  abv6d = abv6d + uavg*fsd
1790  abv7d = abv7d + sx*fsd
1791  fsd = fwd(i, j+1, k, irho) - fwd(i, j, k, irho)
1792  abv6d = abv6d + fsd
1793  abv2d = abv4*ovaavg*abv7d + abv5*ovaavg*abv6d
1794  abv4d = abv2*ovaavg*abv7d + abv3*ova2avg*abv6d
1795  ovaavgd = abv2*abv4*abv7d + abv2*abv5*abv6d
1796  abv3d = abv5*abv7d + abv4*ova2avg*abv6d
1797  lam3d = lam3d + dr*fsd - abv3d
1798  abv5d = abv3*abv7d + abv2*ovaavg*abv6d
1799  ova2avgd = abv3*abv4*abv6d
1800  unavgd = unavgd - dr*abv5d
1801  tempd2 = gm1*abv4d
1802  drd = lam3*fsd + alphaavg*tempd2 - unavg*abv5d
1803  drud = drud + sx*abv5d - uavg*tempd2
1804  drvd = drvd + sy*abv5d - vavg*tempd2
1805  drwd = drwd + sz*abv5d - wavg*tempd2
1806  drkd = -(gm53*abv4d)
1807  alphaavgd = dr*tempd2
1808  uavgd = uavgd - dru*tempd2
1809  vavgd = vavgd - drv*tempd2
1810  dred = dred + tempd2
1811  wavgd = wavgd - drw*tempd2
1812  abv1d = abv3d
1813  lam1d = half*abv2d + half*abv1d
1814  lam2d = half*abv1d - half*abv2d
1815  max8d = area*lam3d
1816 branch = myintstack(myintptr)
1817  myintptr = myintptr - 1
1818  if (branch .eq. 0) then
1819  rradd = epsshear*max8d
1820  lam3d = 0.0_8
1821  else
1822  lam3d = max8d
1823  rradd = 0.0_8
1824  end if
1825  max7d = area*lam2d
1826 branch = myintstack(myintptr)
1827  myintptr = myintptr - 1
1828  if (branch .eq. 0) then
1829  rradd = rradd + epsacoustic*max7d
1830  lam2d = 0.0_8
1831  else
1832  lam2d = max7d
1833  end if
1834  max6d = area*lam1d
1835 branch = myintstack(myintptr)
1836  myintptr = myintptr - 1
1837  if (branch .eq. 0) then
1838  rradd = rradd + epsacoustic*max6d
1839  lam1d = 0.0_8
1840  else
1841  lam1d = max6d
1842  end if
1843  lam3d = lam3d + rradd
1844  aavgd = rradd
1845 branch = myintstack(myintptr)
1846  myintptr = myintptr - 1
1847  if (branch .eq. 0) then
1848  unavgd = unavgd + lam3d
1849  else
1850  unavgd = unavgd - lam3d
1851  end if
1852 branch = myintstack(myintptr)
1853  myintptr = myintptr - 1
1854  if (branch .eq. 0) then
1855  unavgd = unavgd + lam2d
1856  aavgd = aavgd - lam2d
1857  else
1858  aavgd = aavgd + lam2d
1859  unavgd = unavgd - lam2d
1860  end if
1861 branch = myintstack(myintptr)
1862  myintptr = myintptr - 1
1863  if (branch .eq. 0) then
1864  unavgd = unavgd + lam1d
1865  aavgd = aavgd + lam1d
1866  else
1867  unavgd = unavgd - lam1d
1868  aavgd = aavgd - lam1d
1869  end if
1870  alphaavgd = alphaavgd + havgd
1871  tempd2 = half*alphaavgd
1872  aavgd = aavgd - one*ovaavgd/aavg**2
1873  if (a2avg .eq. 0.0_8) then
1874  a2avgd = ovgm1*havgd - one*ova2avgd/a2avg**2
1875  else
1876  a2avgd = aavgd/(2.0*sqrt(a2avg)) - one*ova2avgd/a2avg**2 + &
1877 & ovgm1*havgd
1878  end if
1879  uavgd = uavgd + sx*unavgd + 2*uavg*tempd2
1880  vavgd = vavgd + sy*unavgd + 2*vavg*tempd2
1881  wavgd = wavgd + sz*unavgd + 2*wavg*tempd2
1882  kavgd = -(gm53*ovgm1*havgd)
1883  temp3 = w(i, j+1, k, irho)
1884  temp1 = w(i, j, k, irho)
1885  tempd3 = gamma(i, j+1, k)*half*a2avgd/temp3
1886  tempd = gamma(i, j, k)*half*a2avgd/temp1
1887  pd(i, j, k) = pd(i, j, k) + tempd
1888  wd(i, j, k, irho) = wd(i, j, k, irho) - p(i, j, k)*tempd/temp1
1889  pd(i, j+1, k) = pd(i, j+1, k) + tempd3
1890  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) - p(i, j+1, k)*tempd3/&
1891 & temp3
1892  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + half*wavgd
1893  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wavgd
1894  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + half*vavgd
1895  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vavgd
1896  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + half*uavgd
1897  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*uavgd
1898 branch = myintstack(myintptr)
1899  myintptr = myintptr - 1
1900  if (branch .eq. 0) then
1901  dis2d = 0.0_8
1902  dis4d = 0.0_8
1903  else
1904  tempd0 = -(dis4*drkd)
1905  wd(i, j, k, itu1) = wd(i, j, k, itu1) + half*kavgd
1906  wd(i, j+1, k, itu1) = wd(i, j+1, k, itu1) + half*kavgd
1907  temp3 = w(i, j-1, k, itu1)
1908  temp2 = w(i, j-1, k, irho)
1909  temp1 = w(i, j+2, k, itu1)
1910  temp0 = w(i, j+2, k, irho)
1911  dis2d = ddw6*drkd
1912  ddw6d = dis2*drkd - three*tempd0
1913  dis4d = -((temp0*temp1-temp2*temp3-three*ddw6)*drkd)
1914  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + temp1*tempd0
1915  wd(i, j+2, k, itu1) = wd(i, j+2, k, itu1) + temp0*tempd0
1916  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - temp3*tempd0
1917  wd(i, j-1, k, itu1) = wd(i, j-1, k, itu1) - temp2*tempd0
1918  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, itu1)&
1919 & *ddw6d
1920  wd(i, j+1, k, itu1) = wd(i, j+1, k, itu1) + w(i, j+1, k, irho)&
1921 & *ddw6d
1922  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, itu1)*ddw6d
1923  wd(i, j, k, itu1) = wd(i, j, k, itu1) - w(i, j, k, irho)*ddw6d
1924  end if
1925  tempd0 = -(dis4*drwd)
1926  temp0 = w(i, j+2, k, irho)
1927  temp1 = w(i, j+2, k, ivz)
1928  temp2 = w(i, j-1, k, irho)
1929  temp3 = w(i, j-1, k, ivz)
1930  tempd2 = -(dis4*dred)
1931  dis2d = dis2d + ddw5*dred + ddw4*drwd + ddw3*drvd + ddw2*drud + &
1932 & ddw1*drd
1933  ddw5d = dis2*dred - three*tempd2
1934  dis4d = dis4d - (w(i, j+2, k, irhoe)-w(i, j-1, k, irhoe)-three*&
1935 & ddw5)*dred - (temp0*temp1-temp2*temp3-three*ddw4)*drwd
1936  wd(i, j+2, k, irhoe) = wd(i, j+2, k, irhoe) + tempd2
1937  wd(i, j-1, k, irhoe) = wd(i, j-1, k, irhoe) - tempd2
1938  wd(i, j+1, k, irhoe) = wd(i, j+1, k, irhoe) + ddw5d
1939  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddw5d
1940  ddw4d = dis2*drwd - three*tempd0
1941  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + temp1*tempd0
1942  wd(i, j+2, k, ivz) = wd(i, j+2, k, ivz) + temp0*tempd0
1943  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - temp3*tempd0
1944  wd(i, j-1, k, ivz) = wd(i, j-1, k, ivz) - temp2*tempd0
1945  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, ivz)*&
1946 & ddw4d
1947  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + w(i, j+1, k, irho)*&
1948 & ddw4d
1949  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivz)*ddw4d
1950  wd(i, j, k, ivz) = wd(i, j, k, ivz) - w(i, j, k, irho)*ddw4d
1951  temp3 = w(i, j-1, k, ivy)
1952  temp2 = w(i, j-1, k, irho)
1953  temp1 = w(i, j+2, k, ivy)
1954  temp0 = w(i, j+2, k, irho)
1955  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw3)*drvd
1956  tempd0 = -(dis4*drvd)
1957  ddw3d = dis2*drvd - three*tempd0
1958  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + temp1*tempd0
1959  wd(i, j+2, k, ivy) = wd(i, j+2, k, ivy) + temp0*tempd0
1960  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - temp3*tempd0
1961  wd(i, j-1, k, ivy) = wd(i, j-1, k, ivy) - temp2*tempd0
1962  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, ivy)*&
1963 & ddw3d
1964  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + w(i, j+1, k, irho)*&
1965 & ddw3d
1966  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivy)*ddw3d
1967  wd(i, j, k, ivy) = wd(i, j, k, ivy) - w(i, j, k, irho)*ddw3d
1968  temp3 = w(i, j-1, k, ivx)
1969  temp2 = w(i, j-1, k, irho)
1970  temp1 = w(i, j+2, k, ivx)
1971  temp0 = w(i, j+2, k, irho)
1972  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw2)*drud - (w(i&
1973 & , j+2, k, irho)-w(i, j-1, k, irho)-three*ddw1)*drd
1974  tempd0 = -(dis4*drud)
1975  ddw2d = dis2*drud - three*tempd0
1976  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + temp1*tempd0
1977  wd(i, j+2, k, ivx) = wd(i, j+2, k, ivx) + temp0*tempd0
1978  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - temp3*tempd0
1979  wd(i, j-1, k, ivx) = wd(i, j-1, k, ivx) - temp2*tempd0
1980  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, ivx)*&
1981 & ddw2d
1982  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + w(i, j+1, k, irho)*&
1983 & ddw2d
1984  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivx)*ddw2d
1985  wd(i, j, k, ivx) = wd(i, j, k, ivx) - w(i, j, k, irho)*ddw2d
1986  tempd2 = -(dis4*drd)
1987  ddw1d = dis2*drd - three*tempd2
1988  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + tempd2
1989  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - tempd2
1990  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + ddw1d
1991  wd(i, j, k, irho) = wd(i, j, k, irho) - ddw1d
1992  call mydim_fast_b(arg1, arg1d, dis2, dis2d, dis4d)
1993  min2d = ppor*fis2*dis2d
1994 branch = myintstack(myintptr)
1995  myintptr = myintptr - 1
1996  if (branch .eq. 0) then
1997  y2d = min2d
1998  else
1999  y2d = 0.0_8
2000  end if
2001 branch = myintstack(myintptr)
2002  myintptr = myintptr - 1
2003  if (branch .eq. 0) then
2004  dssd(i, j+1, k, 2) = dssd(i, j+1, k, 2) + y2d
2005  else
2006  dssd(i, j, k, 2) = dssd(i, j, k, 2) + y2d
2007  end if
2008  end do
2009 !$bwd-of ii-loop
2010  do ii=0,il*ny*nz-1
2011  i = mod(ii, il) + 1
2012  j = mod(ii/il, ny) + 2
2013  k = ii/(il*ny) + 2
2014 ! compute the dissipation coefficients for this face.
2015  ppor = zero
2016  if (pori(i, j, k) .eq. normalflux) ppor = one
2017  if (dss(i, j, k, 1) .lt. dss(i+1, j, k, 1)) then
2018  y1 = dss(i+1, j, k, 1)
2019 myintptr = myintptr + 1
2020  myintstack(myintptr) = 0
2021  else
2022  y1 = dss(i, j, k, 1)
2023 myintptr = myintptr + 1
2024  myintstack(myintptr) = 1
2025  end if
2026  if (dpmax .gt. y1) then
2027  min1 = y1
2028 myintptr = myintptr + 1
2029  myintstack(myintptr) = 0
2030  else
2031  min1 = dpmax
2032 myintptr = myintptr + 1
2033  myintstack(myintptr) = 1
2034  end if
2035  dis2 = ppor*fis2*min1
2036  arg1 = ppor*fis4
2037  dis4 = mydim(arg1, dis2)
2038 ! construct the vector of the first and third differences
2039 ! multiplied by the appropriate constants.
2040  ddw1 = w(i+1, j, k, irho) - w(i, j, k, irho)
2041  dr = dis2*ddw1 - dis4*(w(i+2, j, k, irho)-w(i-1, j, k, irho)-&
2042 & three*ddw1)
2043  ddw2 = w(i+1, j, k, irho)*w(i+1, j, k, ivx) - w(i, j, k, irho)*w&
2044 & (i, j, k, ivx)
2045  dru = dis2*ddw2 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivx)-w(i&
2046 & -1, j, k, irho)*w(i-1, j, k, ivx)-three*ddw2)
2047  ddw3 = w(i+1, j, k, irho)*w(i+1, j, k, ivy) - w(i, j, k, irho)*w&
2048 & (i, j, k, ivy)
2049  drv = dis2*ddw3 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivy)-w(i&
2050 & -1, j, k, irho)*w(i-1, j, k, ivy)-three*ddw3)
2051  ddw4 = w(i+1, j, k, irho)*w(i+1, j, k, ivz) - w(i, j, k, irho)*w&
2052 & (i, j, k, ivz)
2053  drw = dis2*ddw4 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivz)-w(i&
2054 & -1, j, k, irho)*w(i-1, j, k, ivz)-three*ddw4)
2055  ddw5 = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
2056  dre = dis2*ddw5 - dis4*(w(i+2, j, k, irhoe)-w(i-1, j, k, irhoe)-&
2057 & three*ddw5)
2058 ! in case a k-equation is present, compute the difference
2059 ! of rhok and store the average value of k. if not present,
2060 ! set both these values to zero, such that later on no
2061 ! decision needs to be made anymore.
2062  if (correctfork) then
2063  ddw6 = w(i+1, j, k, irho)*w(i+1, j, k, itu1) - w(i, j, k, irho&
2064 & )*w(i, j, k, itu1)
2065  drk = dis2*ddw6 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, itu1)-&
2066 & w(i-1, j, k, irho)*w(i-1, j, k, itu1)-three*ddw6)
2067  kavg = half*(w(i, j, k, itu1)+w(i+1, j, k, itu1))
2068 myintptr = myintptr + 1
2069  myintstack(myintptr) = 1
2070  else
2071  drk = zero
2072  kavg = zero
2073 myintptr = myintptr + 1
2074  myintstack(myintptr) = 0
2075  end if
2076 ! compute the average value of gamma and compute some
2077 ! expressions in which it occurs.
2078  gammaavg = half*(gamma(i+1, j, k)+gamma(i, j, k))
2079  gm1 = gammaavg - one
2080  ovgm1 = one/gm1
2081  gm53 = gammaavg - five*third
2082 ! compute the average state at the interface.
2083  uavg = half*(w(i+1, j, k, ivx)+w(i, j, k, ivx))
2084  vavg = half*(w(i+1, j, k, ivy)+w(i, j, k, ivy))
2085  wavg = half*(w(i+1, j, k, ivz)+w(i, j, k, ivz))
2086  a2avg = half*(gamma(i+1, j, k)*p(i+1, j, k)/w(i+1, j, k, irho)+&
2087 & gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
2088  area = sqrt(si(i, j, k, 1)**2 + si(i, j, k, 2)**2 + si(i, j, k, &
2089 & 3)**2)
2090  if (1.e-25_realtype .lt. area) then
2091  max1 = area
2092  else
2093  max1 = 1.e-25_realtype
2094  end if
2095  tmp = one/max1
2096  sx = si(i, j, k, 1)*tmp
2097  sy = si(i, j, k, 2)*tmp
2098  sz = si(i, j, k, 3)*tmp
2099  alphaavg = half*(uavg**2+vavg**2+wavg**2)
2100  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
2101  aavg = sqrt(a2avg)
2102  unavg = uavg*sx + vavg*sy + wavg*sz
2103  ovaavg = one/aavg
2104  ova2avg = one/a2avg
2105 ! the mesh velocity if the face is moving. it must be
2106 ! divided by the area to obtain a true velocity.
2107  if (addgridvelocities) sface = sfacei(i, j, k)*tmp
2108  if (unavg - sface + aavg .ge. 0.) then
2109  lam1 = unavg - sface + aavg
2110 myintptr = myintptr + 1
2111  myintstack(myintptr) = 0
2112  else
2113  lam1 = -(unavg-sface+aavg)
2114 myintptr = myintptr + 1
2115  myintstack(myintptr) = 1
2116  end if
2117  if (unavg - sface - aavg .ge. 0.) then
2118  lam2 = unavg - sface - aavg
2119 myintptr = myintptr + 1
2120  myintstack(myintptr) = 0
2121  else
2122  lam2 = -(unavg-sface-aavg)
2123 myintptr = myintptr + 1
2124  myintstack(myintptr) = 1
2125  end if
2126  if (unavg - sface .ge. 0.) then
2127  lam3 = unavg - sface
2128 myintptr = myintptr + 1
2129  myintstack(myintptr) = 0
2130  else
2131  lam3 = -(unavg-sface)
2132 myintptr = myintptr + 1
2133  myintstack(myintptr) = 1
2134  end if
2135  rrad = lam3 + aavg
2136  if (lam1 .lt. epsacoustic*rrad) then
2137  max2 = epsacoustic*rrad
2138 myintptr = myintptr + 1
2139  myintstack(myintptr) = 0
2140  else
2141  max2 = lam1
2142 myintptr = myintptr + 1
2143  myintstack(myintptr) = 1
2144  end if
2145 ! multiply the eigenvalues by the area to obtain
2146 ! the correct values for the dissipation term.
2147  lam1 = max2*area
2148  if (lam2 .lt. epsacoustic*rrad) then
2149  max3 = epsacoustic*rrad
2150 myintptr = myintptr + 1
2151  myintstack(myintptr) = 0
2152  else
2153  max3 = lam2
2154 myintptr = myintptr + 1
2155  myintstack(myintptr) = 1
2156  end if
2157  lam2 = max3*area
2158  if (lam3 .lt. epsshear*rrad) then
2159  max4 = epsshear*rrad
2160 myintptr = myintptr + 1
2161  myintstack(myintptr) = 0
2162  else
2163  max4 = lam3
2164 myintptr = myintptr + 1
2165  myintstack(myintptr) = 1
2166  end if
2167  lam3 = max4*area
2168 ! some abbreviations, which occur quite often in the
2169 ! dissipation terms.
2170  abv1 = half*(lam1+lam2)
2171  abv2 = half*(lam1-lam2)
2172  abv3 = abv1 - lam3
2173  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53*&
2174 & drk
2175  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
2176  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
2177  abv7 = abv2*abv4*ovaavg + abv3*abv5
2178 ! compute and scatter the dissipative flux.
2179 ! density.
2180 ! x-momentum.
2181 ! y-momentum.
2182 ! z-momentum.
2183 ! energy.
2184  fsd = fwd(i+1, j, k, irhoe) - fwd(i, j, k, irhoe)
2185  lam3d = dre*fsd
2186  dred = lam3*fsd
2187  havgd = abv6*fsd
2188  abv6d = havg*fsd
2189  unavgd = abv7*fsd
2190  abv7d = unavg*fsd
2191  fsd = fwd(i+1, j, k, imz) - fwd(i, j, k, imz)
2192  lam3d = lam3d + drw*fsd
2193  drwd = lam3*fsd
2194  wavgd = abv6*fsd
2195  abv6d = abv6d + wavg*fsd
2196  abv7d = abv7d + sz*fsd
2197  fsd = fwd(i+1, j, k, imy) - fwd(i, j, k, imy)
2198  lam3d = lam3d + drv*fsd
2199  drvd = lam3*fsd
2200  vavgd = abv6*fsd
2201  abv6d = abv6d + vavg*fsd
2202  abv7d = abv7d + sy*fsd
2203  fsd = fwd(i+1, j, k, imx) - fwd(i, j, k, imx)
2204  lam3d = lam3d + dru*fsd
2205  drud = lam3*fsd
2206  uavgd = abv6*fsd
2207  abv6d = abv6d + uavg*fsd
2208  abv7d = abv7d + sx*fsd
2209  fsd = fwd(i+1, j, k, irho) - fwd(i, j, k, irho)
2210  abv6d = abv6d + fsd
2211  abv2d = abv4*ovaavg*abv7d + abv5*ovaavg*abv6d
2212  abv4d = abv2*ovaavg*abv7d + abv3*ova2avg*abv6d
2213  ovaavgd = abv2*abv4*abv7d + abv2*abv5*abv6d
2214  abv3d = abv5*abv7d + abv4*ova2avg*abv6d
2215  lam3d = lam3d + dr*fsd - abv3d
2216  abv5d = abv3*abv7d + abv2*ovaavg*abv6d
2217  ova2avgd = abv3*abv4*abv6d
2218  unavgd = unavgd - dr*abv5d
2219  tempd2 = gm1*abv4d
2220  drd = lam3*fsd + alphaavg*tempd2 - unavg*abv5d
2221  drud = drud + sx*abv5d - uavg*tempd2
2222  drvd = drvd + sy*abv5d - vavg*tempd2
2223  drwd = drwd + sz*abv5d - wavg*tempd2
2224  drkd = -(gm53*abv4d)
2225  alphaavgd = dr*tempd2
2226  uavgd = uavgd - dru*tempd2
2227  vavgd = vavgd - drv*tempd2
2228  dred = dred + tempd2
2229  wavgd = wavgd - drw*tempd2
2230  abv1d = abv3d
2231  lam1d = half*abv2d + half*abv1d
2232  lam2d = half*abv1d - half*abv2d
2233  max4d = area*lam3d
2234 branch = myintstack(myintptr)
2235  myintptr = myintptr - 1
2236  if (branch .eq. 0) then
2237  rradd = epsshear*max4d
2238  lam3d = 0.0_8
2239  else
2240  lam3d = max4d
2241  rradd = 0.0_8
2242  end if
2243  max3d = area*lam2d
2244 branch = myintstack(myintptr)
2245  myintptr = myintptr - 1
2246  if (branch .eq. 0) then
2247  rradd = rradd + epsacoustic*max3d
2248  lam2d = 0.0_8
2249  else
2250  lam2d = max3d
2251  end if
2252  max2d = area*lam1d
2253 branch = myintstack(myintptr)
2254  myintptr = myintptr - 1
2255  if (branch .eq. 0) then
2256  rradd = rradd + epsacoustic*max2d
2257  lam1d = 0.0_8
2258  else
2259  lam1d = max2d
2260  end if
2261  lam3d = lam3d + rradd
2262  aavgd = rradd
2263 branch = myintstack(myintptr)
2264  myintptr = myintptr - 1
2265  if (branch .eq. 0) then
2266  unavgd = unavgd + lam3d
2267  else
2268  unavgd = unavgd - lam3d
2269  end if
2270 branch = myintstack(myintptr)
2271  myintptr = myintptr - 1
2272  if (branch .eq. 0) then
2273  unavgd = unavgd + lam2d
2274  aavgd = aavgd - lam2d
2275  else
2276  aavgd = aavgd + lam2d
2277  unavgd = unavgd - lam2d
2278  end if
2279 branch = myintstack(myintptr)
2280  myintptr = myintptr - 1
2281  if (branch .eq. 0) then
2282  unavgd = unavgd + lam1d
2283  aavgd = aavgd + lam1d
2284  else
2285  unavgd = unavgd - lam1d
2286  aavgd = aavgd - lam1d
2287  end if
2288  alphaavgd = alphaavgd + havgd
2289  tempd2 = half*alphaavgd
2290  aavgd = aavgd - one*ovaavgd/aavg**2
2291  if (a2avg .eq. 0.0_8) then
2292  a2avgd = ovgm1*havgd - one*ova2avgd/a2avg**2
2293  else
2294  a2avgd = aavgd/(2.0*sqrt(a2avg)) - one*ova2avgd/a2avg**2 + &
2295 & ovgm1*havgd
2296  end if
2297  uavgd = uavgd + sx*unavgd + 2*uavg*tempd2
2298  vavgd = vavgd + sy*unavgd + 2*vavg*tempd2
2299  wavgd = wavgd + sz*unavgd + 2*wavg*tempd2
2300  kavgd = -(gm53*ovgm1*havgd)
2301  temp3 = w(i+1, j, k, irho)
2302  temp1 = w(i, j, k, irho)
2303  tempd3 = gamma(i+1, j, k)*half*a2avgd/temp3
2304  tempd = gamma(i, j, k)*half*a2avgd/temp1
2305  pd(i, j, k) = pd(i, j, k) + tempd
2306  wd(i, j, k, irho) = wd(i, j, k, irho) - p(i, j, k)*tempd/temp1
2307  pd(i+1, j, k) = pd(i+1, j, k) + tempd3
2308  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) - p(i+1, j, k)*tempd3/&
2309 & temp3
2310  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + half*wavgd
2311  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wavgd
2312  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + half*vavgd
2313  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vavgd
2314  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + half*uavgd
2315  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*uavgd
2316 branch = myintstack(myintptr)
2317  myintptr = myintptr - 1
2318  if (branch .eq. 0) then
2319  dis2d = 0.0_8
2320  dis4d = 0.0_8
2321  else
2322  tempd0 = -(dis4*drkd)
2323  wd(i, j, k, itu1) = wd(i, j, k, itu1) + half*kavgd
2324  wd(i+1, j, k, itu1) = wd(i+1, j, k, itu1) + half*kavgd
2325  temp3 = w(i-1, j, k, itu1)
2326  temp2 = w(i-1, j, k, irho)
2327  temp1 = w(i+2, j, k, itu1)
2328  temp0 = w(i+2, j, k, irho)
2329  dis2d = ddw6*drkd
2330  ddw6d = dis2*drkd - three*tempd0
2331  dis4d = -((temp0*temp1-temp2*temp3-three*ddw6)*drkd)
2332  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + temp1*tempd0
2333  wd(i+2, j, k, itu1) = wd(i+2, j, k, itu1) + temp0*tempd0
2334  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - temp3*tempd0
2335  wd(i-1, j, k, itu1) = wd(i-1, j, k, itu1) - temp2*tempd0
2336  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, itu1)&
2337 & *ddw6d
2338  wd(i+1, j, k, itu1) = wd(i+1, j, k, itu1) + w(i+1, j, k, irho)&
2339 & *ddw6d
2340  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, itu1)*ddw6d
2341  wd(i, j, k, itu1) = wd(i, j, k, itu1) - w(i, j, k, irho)*ddw6d
2342  end if
2343  tempd1 = -(dis4*drd)
2344  tempd0 = -(dis4*drwd)
2345  temp0 = w(i+2, j, k, irho)
2346  temp1 = w(i+2, j, k, ivz)
2347  temp2 = w(i-1, j, k, irho)
2348  temp3 = w(i-1, j, k, ivz)
2349  tempd2 = -(dis4*dred)
2350  dis2d = dis2d + ddw5*dred + ddw4*drwd + ddw3*drvd + ddw2*drud + &
2351 & ddw1*drd
2352  ddw5d = dis2*dred - three*tempd2
2353  dis4d = dis4d - (w(i+2, j, k, irhoe)-w(i-1, j, k, irhoe)-three*&
2354 & ddw5)*dred - (temp0*temp1-temp2*temp3-three*ddw4)*drwd
2355  wd(i+2, j, k, irhoe) = wd(i+2, j, k, irhoe) + tempd2
2356  wd(i-1, j, k, irhoe) = wd(i-1, j, k, irhoe) - tempd2
2357  wd(i+1, j, k, irhoe) = wd(i+1, j, k, irhoe) + ddw5d
2358  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddw5d
2359  ddw4d = dis2*drwd - three*tempd0
2360  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + temp1*tempd0
2361  wd(i+2, j, k, ivz) = wd(i+2, j, k, ivz) + temp0*tempd0
2362  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - temp3*tempd0
2363  wd(i-1, j, k, ivz) = wd(i-1, j, k, ivz) - temp2*tempd0
2364  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, ivz)*&
2365 & ddw4d
2366  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + w(i+1, j, k, irho)*&
2367 & ddw4d
2368  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivz)*ddw4d
2369  wd(i, j, k, ivz) = wd(i, j, k, ivz) - w(i, j, k, irho)*ddw4d
2370  temp3 = w(i-1, j, k, ivy)
2371  temp2 = w(i-1, j, k, irho)
2372  temp1 = w(i+2, j, k, ivy)
2373  temp0 = w(i+2, j, k, irho)
2374  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw3)*drvd
2375  tempd0 = -(dis4*drvd)
2376  ddw3d = dis2*drvd - three*tempd0
2377  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + temp1*tempd0
2378  wd(i+2, j, k, ivy) = wd(i+2, j, k, ivy) + temp0*tempd0
2379  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - temp3*tempd0
2380  wd(i-1, j, k, ivy) = wd(i-1, j, k, ivy) - temp2*tempd0
2381  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, ivy)*&
2382 & ddw3d
2383  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + w(i+1, j, k, irho)*&
2384 & ddw3d
2385  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivy)*ddw3d
2386  wd(i, j, k, ivy) = wd(i, j, k, ivy) - w(i, j, k, irho)*ddw3d
2387  temp1 = w(i-1, j, k, ivx)
2388  temp0 = w(i-1, j, k, irho)
2389  temp = w(i+2, j, k, ivx)
2390  temp2 = w(i+2, j, k, irho)
2391  dis4d = dis4d - (temp2*temp-temp0*temp1-three*ddw2)*drud - (w(i+&
2392 & 2, j, k, irho)-w(i-1, j, k, irho)-three*ddw1)*drd
2393  tempd2 = -(dis4*drud)
2394  ddw2d = dis2*drud - three*tempd2
2395  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + temp*tempd2
2396  wd(i+2, j, k, ivx) = wd(i+2, j, k, ivx) + temp2*tempd2
2397  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - temp1*tempd2
2398  wd(i-1, j, k, ivx) = wd(i-1, j, k, ivx) - temp0*tempd2
2399  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, ivx)*&
2400 & ddw2d
2401  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + w(i+1, j, k, irho)*&
2402 & ddw2d
2403  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivx)*ddw2d
2404  wd(i, j, k, ivx) = wd(i, j, k, ivx) - w(i, j, k, irho)*ddw2d
2405  ddw1d = dis2*drd - three*tempd1
2406  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + tempd1
2407  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - tempd1
2408  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + ddw1d
2409  wd(i, j, k, irho) = wd(i, j, k, irho) - ddw1d
2410  call mydim_fast_b(arg1, arg1d, dis2, dis2d, dis4d)
2411  min1d = ppor*fis2*dis2d
2412 branch = myintstack(myintptr)
2413  myintptr = myintptr - 1
2414  if (branch .eq. 0) then
2415  y1d = min1d
2416  else
2417  y1d = 0.0_8
2418  end if
2419 branch = myintstack(myintptr)
2420  myintptr = myintptr - 1
2421  if (branch .eq. 0) then
2422  dssd(i+1, j, k, 1) = dssd(i+1, j, k, 1) + y1d
2423  else
2424  dssd(i, j, k, 1) = dssd(i, j, k, 1) + y1d
2425  end if
2426  end do
2427 !$bwd-of ii-loop
2428  do ii=0,ie*je*ke-1
2429  i = mod(ii, ie) + 1
2430  j = mod(ii/ie, je) + 1
2431  k = ii/(ie*je) + 1
2432  if (p(i+1, j, k) - p(i, j, k) .ge. 0.) then
2433  abs1 = p(i+1, j, k) - p(i, j, k)
2434 myintptr = myintptr + 1
2435  myintstack(myintptr) = 1
2436  else
2437  abs1 = -(p(i+1, j, k)-p(i, j, k))
2438 myintptr = myintptr + 1
2439  myintstack(myintptr) = 0
2440  end if
2441  if (p(i, j, k) - p(i-1, j, k) .ge. 0.) then
2442  abs4 = p(i, j, k) - p(i-1, j, k)
2443 myintptr = myintptr + 1
2444  myintstack(myintptr) = 0
2445  else
2446  abs4 = -(p(i, j, k)-p(i-1, j, k))
2447 myintptr = myintptr + 1
2448  myintstack(myintptr) = 1
2449  end if
2450  x1 = (p(i+1, j, k)-two*p(i, j, k)+p(i-1, j, k))/(omega*(p(i+1, j&
2451 & , k)+two*p(i, j, k)+p(i-1, j, k))+oneminomega*(abs1+abs4)+plim&
2452 & )
2453  if (x1 .ge. 0.) then
2454 myintptr = myintptr + 1
2455  myintstack(myintptr) = 0
2456  else
2457 myintptr = myintptr + 1
2458  myintstack(myintptr) = 1
2459  end if
2460  if (p(i, j+1, k) - p(i, j, k) .ge. 0.) then
2461  abs2 = p(i, j+1, k) - p(i, j, k)
2462 myintptr = myintptr + 1
2463  myintstack(myintptr) = 1
2464  else
2465  abs2 = -(p(i, j+1, k)-p(i, j, k))
2466 myintptr = myintptr + 1
2467  myintstack(myintptr) = 0
2468  end if
2469  if (p(i, j, k) - p(i, j-1, k) .ge. 0.) then
2470  abs5 = p(i, j, k) - p(i, j-1, k)
2471 myintptr = myintptr + 1
2472  myintstack(myintptr) = 0
2473  else
2474  abs5 = -(p(i, j, k)-p(i, j-1, k))
2475 myintptr = myintptr + 1
2476  myintstack(myintptr) = 1
2477  end if
2478  x2 = (p(i, j+1, k)-two*p(i, j, k)+p(i, j-1, k))/(omega*(p(i, j+1&
2479 & , k)+two*p(i, j, k)+p(i, j-1, k))+oneminomega*(abs2+abs5)+plim&
2480 & )
2481  if (x2 .ge. 0.) then
2482 myintptr = myintptr + 1
2483  myintstack(myintptr) = 0
2484  else
2485 myintptr = myintptr + 1
2486  myintstack(myintptr) = 1
2487  end if
2488  if (p(i, j, k+1) - p(i, j, k) .ge. 0.) then
2489  abs3 = p(i, j, k+1) - p(i, j, k)
2490 myintptr = myintptr + 1
2491  myintstack(myintptr) = 1
2492  else
2493  abs3 = -(p(i, j, k+1)-p(i, j, k))
2494 myintptr = myintptr + 1
2495  myintstack(myintptr) = 0
2496  end if
2497  if (p(i, j, k) - p(i, j, k-1) .ge. 0.) then
2498  abs6 = p(i, j, k) - p(i, j, k-1)
2499 myintptr = myintptr + 1
2500  myintstack(myintptr) = 0
2501  else
2502  abs6 = -(p(i, j, k)-p(i, j, k-1))
2503 myintptr = myintptr + 1
2504  myintstack(myintptr) = 1
2505  end if
2506  x3 = (p(i, j, k+1)-two*p(i, j, k)+p(i, j, k-1))/(omega*(p(i, j, &
2507 & k+1)+two*p(i, j, k)+p(i, j, k-1))+oneminomega*(abs3+abs6)+plim&
2508 & )
2509  if (x3 .ge. 0.) then
2510  x3d = dssd(i, j, k, 3)
2511  dssd(i, j, k, 3) = 0.0_8
2512  else
2513  x3d = -dssd(i, j, k, 3)
2514  dssd(i, j, k, 3) = 0.0_8
2515  end if
2516  temp1 = plim + omega*(p(i, j, k+1)+two*p(i, j, k)+p(i, j, k-1)) &
2517 & + oneminomega*(abs3+abs6)
2518  tempd = x3d/temp1
2519  tempd1 = -((p(i, j, k+1)-two*p(i, j, k)+p(i, j, k-1))*tempd/&
2520 & temp1)
2521  tempd0 = omega*tempd1
2522  pd(i, j, k+1) = pd(i, j, k+1) + tempd + tempd0
2523  pd(i, j, k) = pd(i, j, k) + two*tempd0 - two*tempd
2524  pd(i, j, k-1) = pd(i, j, k-1) + tempd + tempd0
2525  abs3d = oneminomega*tempd1
2526  abs6d = oneminomega*tempd1
2527 branch = myintstack(myintptr)
2528  myintptr = myintptr - 1
2529  if (branch .eq. 0) then
2530  pd(i, j, k) = pd(i, j, k) + abs6d
2531  pd(i, j, k-1) = pd(i, j, k-1) - abs6d
2532  else
2533  pd(i, j, k-1) = pd(i, j, k-1) + abs6d
2534  pd(i, j, k) = pd(i, j, k) - abs6d
2535  end if
2536 branch = myintstack(myintptr)
2537  myintptr = myintptr - 1
2538  if (branch .eq. 0) then
2539  pd(i, j, k) = pd(i, j, k) + abs3d
2540  pd(i, j, k+1) = pd(i, j, k+1) - abs3d
2541  else
2542  pd(i, j, k+1) = pd(i, j, k+1) + abs3d
2543  pd(i, j, k) = pd(i, j, k) - abs3d
2544  end if
2545 branch = myintstack(myintptr)
2546  myintptr = myintptr - 1
2547  if (branch .eq. 0) then
2548  x2d = dssd(i, j, k, 2)
2549  dssd(i, j, k, 2) = 0.0_8
2550  else
2551  x2d = -dssd(i, j, k, 2)
2552  dssd(i, j, k, 2) = 0.0_8
2553  end if
2554  temp1 = plim + omega*(p(i, j+1, k)+two*p(i, j, k)+p(i, j-1, k)) &
2555 & + oneminomega*(abs2+abs5)
2556  tempd = x2d/temp1
2557  tempd1 = -((p(i, j+1, k)-two*p(i, j, k)+p(i, j-1, k))*tempd/&
2558 & temp1)
2559  tempd0 = omega*tempd1
2560  pd(i, j+1, k) = pd(i, j+1, k) + tempd + tempd0
2561  pd(i, j, k) = pd(i, j, k) + two*tempd0 - two*tempd
2562  pd(i, j-1, k) = pd(i, j-1, k) + tempd + tempd0
2563  abs2d = oneminomega*tempd1
2564  abs5d = oneminomega*tempd1
2565 branch = myintstack(myintptr)
2566  myintptr = myintptr - 1
2567  if (branch .eq. 0) then
2568  pd(i, j, k) = pd(i, j, k) + abs5d
2569  pd(i, j-1, k) = pd(i, j-1, k) - abs5d
2570  else
2571  pd(i, j-1, k) = pd(i, j-1, k) + abs5d
2572  pd(i, j, k) = pd(i, j, k) - abs5d
2573  end if
2574 branch = myintstack(myintptr)
2575  myintptr = myintptr - 1
2576  if (branch .eq. 0) then
2577  pd(i, j, k) = pd(i, j, k) + abs2d
2578  pd(i, j+1, k) = pd(i, j+1, k) - abs2d
2579  else
2580  pd(i, j+1, k) = pd(i, j+1, k) + abs2d
2581  pd(i, j, k) = pd(i, j, k) - abs2d
2582  end if
2583 branch = myintstack(myintptr)
2584  myintptr = myintptr - 1
2585  if (branch .eq. 0) then
2586  x1d = dssd(i, j, k, 1)
2587  dssd(i, j, k, 1) = 0.0_8
2588  else
2589  x1d = -dssd(i, j, k, 1)
2590  dssd(i, j, k, 1) = 0.0_8
2591  end if
2592  temp = plim + omega*(p(i+1, j, k)+two*p(i, j, k)+p(i-1, j, k)) +&
2593 & oneminomega*(abs1+abs4)
2594  tempd = x1d/temp
2595  tempd0 = -((p(i+1, j, k)-two*p(i, j, k)+p(i-1, j, k))*tempd/temp&
2596 & )
2597  tempd1 = omega*tempd0
2598  pd(i+1, j, k) = pd(i+1, j, k) + tempd + tempd1
2599  pd(i, j, k) = pd(i, j, k) + two*tempd1 - two*tempd
2600  pd(i-1, j, k) = pd(i-1, j, k) + tempd + tempd1
2601  abs1d = oneminomega*tempd0
2602  abs4d = oneminomega*tempd0
2603 branch = myintstack(myintptr)
2604  myintptr = myintptr - 1
2605  if (branch .eq. 0) then
2606  pd(i, j, k) = pd(i, j, k) + abs4d
2607  pd(i-1, j, k) = pd(i-1, j, k) - abs4d
2608  else
2609  pd(i-1, j, k) = pd(i-1, j, k) + abs4d
2610  pd(i, j, k) = pd(i, j, k) - abs4d
2611  end if
2612 branch = myintstack(myintptr)
2613  myintptr = myintptr - 1
2614  if (branch .eq. 0) then
2615  pd(i, j, k) = pd(i, j, k) + abs1d
2616  pd(i+1, j, k) = pd(i+1, j, k) - abs1d
2617  else
2618  pd(i+1, j, k) = pd(i+1, j, k) + abs1d
2619  pd(i, j, k) = pd(i, j, k) - abs1d
2620  end if
2621  end do
2622  fwd = sfil*fwd
2623  end if
2624  end subroutine invisciddissfluxmatrix_fast_b
2625 
2627 !
2628 ! invisciddissfluxmatrix computes the matrix artificial
2629 ! dissipation term. instead of the spectral radius, as used in
2630 ! the scalar dissipation scheme, the absolute value of the flux
2631 ! jacobian is used. this leads to a less diffusive and
2632 ! consequently more accurate scheme. it is assumed that the
2633 ! pointers in blockpointers already point to the correct block.
2634 !
2635  use constants
2636  use blockpointers, only : nx, ny, nz, il, jl, kl, ie, je, ke,&
2637 & ib, jb, kb, w, p, pori, porj, pork, fw, gamma, si, sj, sk, &
2640  use flowvarrefstate, only : pinfcorr
2641  use inputdiscretization, only : vis2, vis4
2642  use inputphysics, only : equations
2643  use iteration, only : rfil
2644  use cgnsgrid, only : massflowfamilydiss
2645  use utils_fast_b, only : getcorrectfork, mydim
2646  implicit none
2647 !
2648 ! local parameters.
2649 !
2650  real(kind=realtype), parameter :: dpmax=0.25_realtype
2651  real(kind=realtype), parameter :: epsacoustic=0.25_realtype
2652  real(kind=realtype), parameter :: epsshear=0.025_realtype
2653  real(kind=realtype), parameter :: omega=0.5_realtype
2654  real(kind=realtype), parameter :: oneminomega=one-omega
2655 !
2656 ! local variables.
2657 !
2658  integer(kind=inttype) :: i, j, k, ind, ii
2659  real(kind=realtype) :: plim, sface
2660  real(kind=realtype) :: sfil, fis2, fis4
2661  real(kind=realtype) :: gammaavg, gm1, ovgm1, gm53
2662  real(kind=realtype) :: ppor, rrad, dis2, dis4
2663  real(kind=realtype) :: dp1, dp2, tmp, fs
2664  real(kind=realtype) :: ddw1, ddw2, ddw3, ddw4, ddw5, ddw6
2665  real(kind=realtype) :: dr, dru, drv, drw, dre, drk, sx, sy, sz
2666  real(kind=realtype) :: uavg, vavg, wavg, a2avg, aavg, havg
2667  real(kind=realtype) :: alphaavg, unavg, ovaavg, ova2avg
2668  real(kind=realtype) :: kavg, lam1, lam2, lam3, area
2669  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
2670  real(kind=realtype), dimension(ie, je, ke, 3) :: dss
2671  logical :: correctfork
2672  intrinsic abs
2673  intrinsic mod
2674  intrinsic max
2675  intrinsic min
2676  intrinsic sqrt
2677  real(kind=realtype) :: x1
2678  real(kind=realtype) :: x2
2679  real(kind=realtype) :: x3
2680  real(kind=realtype) :: y1
2681  real(kind=realtype) :: y2
2682  real(kind=realtype) :: y3
2683  real(kind=realtype) :: abs0
2684  real(kind=realtype) :: min1
2685  real(realtype) :: max1
2686  real(kind=realtype) :: max2
2687  real(kind=realtype) :: max3
2688  real(kind=realtype) :: max4
2689  real(kind=realtype) :: min2
2690  real(realtype) :: max5
2691  real(kind=realtype) :: max6
2692  real(kind=realtype) :: max7
2693  real(kind=realtype) :: max8
2694  real(kind=realtype) :: min3
2695  real(realtype) :: max9
2696  real(kind=realtype) :: max10
2697  real(kind=realtype) :: max11
2698  real(kind=realtype) :: max12
2699  real(kind=realtype) :: abs1
2700  real(kind=realtype) :: abs2
2701  real(kind=realtype) :: abs3
2702  real(kind=realtype) :: abs4
2703  real(kind=realtype) :: abs5
2704  real(kind=realtype) :: abs6
2705  real(kind=realtype) :: arg1
2706  if (rfil .ge. 0.) then
2707  abs0 = rfil
2708  else
2709  abs0 = -rfil
2710  end if
2711 ! check if rfil == 0. if so, the dissipative flux needs not to
2712 ! be computed.
2713  if (abs0 .lt. thresholdreal) then
2714  return
2715  else
2716 ! set the value of plim. to be fully consistent this must have
2717 ! the dimension of a pressure. therefore a fraction of pinfcorr
2718 ! is used.
2719  plim = 0.001_realtype*pinfcorr
2720 ! determine whether or not the total energy must be corrected
2721 ! for the presence of the turbulent kinetic energy.
2722  correctfork = getcorrectfork()
2723 ! initialize sface to zero. this value will be used if the
2724 ! block is not moving.
2725  sface = zero
2726 ! set a couple of constants for the scheme.
2727  fis2 = rfil*vis2
2728  fis4 = rfil*vis4
2729  sfil = one - rfil
2730 ! initialize the dissipative residual to a certain times,
2731 ! possibly zero, the previously stored value.
2732  fw = sfil*fw
2733 !$ad ii-loop
2734 ! compute the pressure sensor for each cell, in each direction:
2735  do ii=0,ie*je*ke-1
2736  i = mod(ii, ie) + 1
2737  j = mod(ii/ie, je) + 1
2738  k = ii/(ie*je) + 1
2739  if (p(i+1, j, k) - p(i, j, k) .ge. 0.) then
2740  abs1 = p(i+1, j, k) - p(i, j, k)
2741  else
2742  abs1 = -(p(i+1, j, k)-p(i, j, k))
2743  end if
2744  if (p(i, j, k) - p(i-1, j, k) .ge. 0.) then
2745  abs4 = p(i, j, k) - p(i-1, j, k)
2746  else
2747  abs4 = -(p(i, j, k)-p(i-1, j, k))
2748  end if
2749  x1 = (p(i+1, j, k)-two*p(i, j, k)+p(i-1, j, k))/(omega*(p(i+1, j&
2750 & , k)+two*p(i, j, k)+p(i-1, j, k))+oneminomega*(abs1+abs4)+plim&
2751 & )
2752  if (x1 .ge. 0.) then
2753  dss(i, j, k, 1) = x1
2754  else
2755  dss(i, j, k, 1) = -x1
2756  end if
2757  if (p(i, j+1, k) - p(i, j, k) .ge. 0.) then
2758  abs2 = p(i, j+1, k) - p(i, j, k)
2759  else
2760  abs2 = -(p(i, j+1, k)-p(i, j, k))
2761  end if
2762  if (p(i, j, k) - p(i, j-1, k) .ge. 0.) then
2763  abs5 = p(i, j, k) - p(i, j-1, k)
2764  else
2765  abs5 = -(p(i, j, k)-p(i, j-1, k))
2766  end if
2767  x2 = (p(i, j+1, k)-two*p(i, j, k)+p(i, j-1, k))/(omega*(p(i, j+1&
2768 & , k)+two*p(i, j, k)+p(i, j-1, k))+oneminomega*(abs2+abs5)+plim&
2769 & )
2770  if (x2 .ge. 0.) then
2771  dss(i, j, k, 2) = x2
2772  else
2773  dss(i, j, k, 2) = -x2
2774  end if
2775  if (p(i, j, k+1) - p(i, j, k) .ge. 0.) then
2776  abs3 = p(i, j, k+1) - p(i, j, k)
2777  else
2778  abs3 = -(p(i, j, k+1)-p(i, j, k))
2779  end if
2780  if (p(i, j, k) - p(i, j, k-1) .ge. 0.) then
2781  abs6 = p(i, j, k) - p(i, j, k-1)
2782  else
2783  abs6 = -(p(i, j, k)-p(i, j, k-1))
2784  end if
2785  x3 = (p(i, j, k+1)-two*p(i, j, k)+p(i, j, k-1))/(omega*(p(i, j, &
2786 & k+1)+two*p(i, j, k)+p(i, j, k-1))+oneminomega*(abs3+abs6)+plim&
2787 & )
2788  if (x3 .ge. 0.) then
2789  dss(i, j, k, 3) = x3
2790  else
2791  dss(i, j, k, 3) = -x3
2792  end if
2793  end do
2794 !$ad ii-loop
2795 !
2796 ! dissipative fluxes in the i-direction.
2797 !
2798  do ii=0,il*ny*nz-1
2799  i = mod(ii, il) + 1
2800  j = mod(ii/il, ny) + 2
2801  k = ii/(il*ny) + 2
2802 ! compute the dissipation coefficients for this face.
2803  ppor = zero
2804  if (pori(i, j, k) .eq. normalflux) ppor = one
2805  if (dss(i, j, k, 1) .lt. dss(i+1, j, k, 1)) then
2806  y1 = dss(i+1, j, k, 1)
2807  else
2808  y1 = dss(i, j, k, 1)
2809  end if
2810  if (dpmax .gt. y1) then
2811  min1 = y1
2812  else
2813  min1 = dpmax
2814  end if
2815  dis2 = ppor*fis2*min1
2816  arg1 = ppor*fis4
2817  dis4 = mydim(arg1, dis2)
2818 ! construct the vector of the first and third differences
2819 ! multiplied by the appropriate constants.
2820  ddw1 = w(i+1, j, k, irho) - w(i, j, k, irho)
2821  dr = dis2*ddw1 - dis4*(w(i+2, j, k, irho)-w(i-1, j, k, irho)-&
2822 & three*ddw1)
2823  ddw2 = w(i+1, j, k, irho)*w(i+1, j, k, ivx) - w(i, j, k, irho)*w&
2824 & (i, j, k, ivx)
2825  dru = dis2*ddw2 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivx)-w(i&
2826 & -1, j, k, irho)*w(i-1, j, k, ivx)-three*ddw2)
2827  ddw3 = w(i+1, j, k, irho)*w(i+1, j, k, ivy) - w(i, j, k, irho)*w&
2828 & (i, j, k, ivy)
2829  drv = dis2*ddw3 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivy)-w(i&
2830 & -1, j, k, irho)*w(i-1, j, k, ivy)-three*ddw3)
2831  ddw4 = w(i+1, j, k, irho)*w(i+1, j, k, ivz) - w(i, j, k, irho)*w&
2832 & (i, j, k, ivz)
2833  drw = dis2*ddw4 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivz)-w(i&
2834 & -1, j, k, irho)*w(i-1, j, k, ivz)-three*ddw4)
2835  ddw5 = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
2836  dre = dis2*ddw5 - dis4*(w(i+2, j, k, irhoe)-w(i-1, j, k, irhoe)-&
2837 & three*ddw5)
2838 ! in case a k-equation is present, compute the difference
2839 ! of rhok and store the average value of k. if not present,
2840 ! set both these values to zero, such that later on no
2841 ! decision needs to be made anymore.
2842  if (correctfork) then
2843  ddw6 = w(i+1, j, k, irho)*w(i+1, j, k, itu1) - w(i, j, k, irho&
2844 & )*w(i, j, k, itu1)
2845  drk = dis2*ddw6 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, itu1)-&
2846 & w(i-1, j, k, irho)*w(i-1, j, k, itu1)-three*ddw6)
2847  kavg = half*(w(i, j, k, itu1)+w(i+1, j, k, itu1))
2848  else
2849  drk = zero
2850  kavg = zero
2851  end if
2852 ! compute the average value of gamma and compute some
2853 ! expressions in which it occurs.
2854  gammaavg = half*(gamma(i+1, j, k)+gamma(i, j, k))
2855  gm1 = gammaavg - one
2856  ovgm1 = one/gm1
2857  gm53 = gammaavg - five*third
2858 ! compute the average state at the interface.
2859  uavg = half*(w(i+1, j, k, ivx)+w(i, j, k, ivx))
2860  vavg = half*(w(i+1, j, k, ivy)+w(i, j, k, ivy))
2861  wavg = half*(w(i+1, j, k, ivz)+w(i, j, k, ivz))
2862  a2avg = half*(gamma(i+1, j, k)*p(i+1, j, k)/w(i+1, j, k, irho)+&
2863 & gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
2864  area = sqrt(si(i, j, k, 1)**2 + si(i, j, k, 2)**2 + si(i, j, k, &
2865 & 3)**2)
2866  if (1.e-25_realtype .lt. area) then
2867  max1 = area
2868  else
2869  max1 = 1.e-25_realtype
2870  end if
2871  tmp = one/max1
2872  sx = si(i, j, k, 1)*tmp
2873  sy = si(i, j, k, 2)*tmp
2874  sz = si(i, j, k, 3)*tmp
2875  alphaavg = half*(uavg**2+vavg**2+wavg**2)
2876  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
2877  aavg = sqrt(a2avg)
2878  unavg = uavg*sx + vavg*sy + wavg*sz
2879  ovaavg = one/aavg
2880  ova2avg = one/a2avg
2881 ! the mesh velocity if the face is moving. it must be
2882 ! divided by the area to obtain a true velocity.
2883  if (addgridvelocities) sface = sfacei(i, j, k)*tmp
2884  if (unavg - sface + aavg .ge. 0.) then
2885  lam1 = unavg - sface + aavg
2886  else
2887  lam1 = -(unavg-sface+aavg)
2888  end if
2889  if (unavg - sface - aavg .ge. 0.) then
2890  lam2 = unavg - sface - aavg
2891  else
2892  lam2 = -(unavg-sface-aavg)
2893  end if
2894  if (unavg - sface .ge. 0.) then
2895  lam3 = unavg - sface
2896  else
2897  lam3 = -(unavg-sface)
2898  end if
2899  rrad = lam3 + aavg
2900  if (lam1 .lt. epsacoustic*rrad) then
2901  max2 = epsacoustic*rrad
2902  else
2903  max2 = lam1
2904  end if
2905 ! multiply the eigenvalues by the area to obtain
2906 ! the correct values for the dissipation term.
2907  lam1 = max2*area
2908  if (lam2 .lt. epsacoustic*rrad) then
2909  max3 = epsacoustic*rrad
2910  else
2911  max3 = lam2
2912  end if
2913  lam2 = max3*area
2914  if (lam3 .lt. epsshear*rrad) then
2915  max4 = epsshear*rrad
2916  else
2917  max4 = lam3
2918  end if
2919  lam3 = max4*area
2920 ! some abbreviations, which occur quite often in the
2921 ! dissipation terms.
2922  abv1 = half*(lam1+lam2)
2923  abv2 = half*(lam1-lam2)
2924  abv3 = abv1 - lam3
2925  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53*&
2926 & drk
2927  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
2928  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
2929  abv7 = abv2*abv4*ovaavg + abv3*abv5
2930 ! compute and scatter the dissipative flux.
2931 ! density.
2932  fs = lam3*dr + abv6
2933  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
2934  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
2935 ! x-momentum.
2936  fs = lam3*dru + uavg*abv6 + sx*abv7
2937  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
2938  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
2939 ! y-momentum.
2940  fs = lam3*drv + vavg*abv6 + sy*abv7
2941  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
2942  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
2943 ! z-momentum.
2944  fs = lam3*drw + wavg*abv6 + sz*abv7
2945  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
2946  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
2947 ! energy.
2948  fs = lam3*dre + havg*abv6 + unavg*abv7
2949  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
2950  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
2951  end do
2952 !$ad ii-loop
2953 !
2954 ! dissipative fluxes in the j-direction.
2955 !
2956  do ii=0,nx*jl*nz-1
2957  i = mod(ii, nx) + 2
2958  j = mod(ii/nx, jl) + 1
2959  k = ii/(nx*jl) + 2
2960 ! compute the dissipation coefficients for this face.
2961  ppor = zero
2962  if (porj(i, j, k) .eq. normalflux) ppor = one
2963  if (dss(i, j, k, 2) .lt. dss(i, j+1, k, 2)) then
2964  y2 = dss(i, j+1, k, 2)
2965  else
2966  y2 = dss(i, j, k, 2)
2967  end if
2968  if (dpmax .gt. y2) then
2969  min2 = y2
2970  else
2971  min2 = dpmax
2972  end if
2973  dis2 = ppor*fis2*min2
2974  arg1 = ppor*fis4
2975  dis4 = mydim(arg1, dis2)
2976 ! construct the vector of the first and third differences
2977 ! multiplied by the appropriate constants.
2978  ddw1 = w(i, j+1, k, irho) - w(i, j, k, irho)
2979  dr = dis2*ddw1 - dis4*(w(i, j+2, k, irho)-w(i, j-1, k, irho)-&
2980 & three*ddw1)
2981  ddw2 = w(i, j+1, k, irho)*w(i, j+1, k, ivx) - w(i, j, k, irho)*w&
2982 & (i, j, k, ivx)
2983  dru = dis2*ddw2 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivx)-w(i&
2984 & , j-1, k, irho)*w(i, j-1, k, ivx)-three*ddw2)
2985  ddw3 = w(i, j+1, k, irho)*w(i, j+1, k, ivy) - w(i, j, k, irho)*w&
2986 & (i, j, k, ivy)
2987  drv = dis2*ddw3 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivy)-w(i&
2988 & , j-1, k, irho)*w(i, j-1, k, ivy)-three*ddw3)
2989  ddw4 = w(i, j+1, k, irho)*w(i, j+1, k, ivz) - w(i, j, k, irho)*w&
2990 & (i, j, k, ivz)
2991  drw = dis2*ddw4 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivz)-w(i&
2992 & , j-1, k, irho)*w(i, j-1, k, ivz)-three*ddw4)
2993  ddw5 = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
2994  dre = dis2*ddw5 - dis4*(w(i, j+2, k, irhoe)-w(i, j-1, k, irhoe)-&
2995 & three*ddw5)
2996 ! in case a k-equation is present, compute the difference
2997 ! of rhok and store the average value of k. if not present,
2998 ! set both these values to zero, such that later on no
2999 ! decision needs to be made anymore.
3000  if (correctfork) then
3001  ddw6 = w(i, j+1, k, irho)*w(i, j+1, k, itu1) - w(i, j, k, irho&
3002 & )*w(i, j, k, itu1)
3003  drk = dis2*ddw6 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, itu1)-&
3004 & w(i, j-1, k, irho)*w(i, j-1, k, itu1)-three*ddw6)
3005  kavg = half*(w(i, j, k, itu1)+w(i, j+1, k, itu1))
3006  else
3007  drk = zero
3008  kavg = zero
3009  end if
3010 ! compute the average value of gamma and compute some
3011 ! expressions in which it occurs.
3012  gammaavg = half*(gamma(i, j+1, k)+gamma(i, j, k))
3013  gm1 = gammaavg - one
3014  ovgm1 = one/gm1
3015  gm53 = gammaavg - five*third
3016 ! compute the average state at the interface.
3017  uavg = half*(w(i, j+1, k, ivx)+w(i, j, k, ivx))
3018  vavg = half*(w(i, j+1, k, ivy)+w(i, j, k, ivy))
3019  wavg = half*(w(i, j+1, k, ivz)+w(i, j, k, ivz))
3020  a2avg = half*(gamma(i, j+1, k)*p(i, j+1, k)/w(i, j+1, k, irho)+&
3021 & gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
3022  area = sqrt(sj(i, j, k, 1)**2 + sj(i, j, k, 2)**2 + sj(i, j, k, &
3023 & 3)**2)
3024  if (1.e-25_realtype .lt. area) then
3025  max5 = area
3026  else
3027  max5 = 1.e-25_realtype
3028  end if
3029  tmp = one/max5
3030  sx = sj(i, j, k, 1)*tmp
3031  sy = sj(i, j, k, 2)*tmp
3032  sz = sj(i, j, k, 3)*tmp
3033  alphaavg = half*(uavg**2+vavg**2+wavg**2)
3034  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
3035  aavg = sqrt(a2avg)
3036  unavg = uavg*sx + vavg*sy + wavg*sz
3037  ovaavg = one/aavg
3038  ova2avg = one/a2avg
3039 ! the mesh velocity if the face is moving. it must be
3040 ! divided by the area to obtain a true velocity.
3041  if (addgridvelocities) sface = sfacej(i, j, k)*tmp
3042  if (unavg - sface + aavg .ge. 0.) then
3043  lam1 = unavg - sface + aavg
3044  else
3045  lam1 = -(unavg-sface+aavg)
3046  end if
3047  if (unavg - sface - aavg .ge. 0.) then
3048  lam2 = unavg - sface - aavg
3049  else
3050  lam2 = -(unavg-sface-aavg)
3051  end if
3052  if (unavg - sface .ge. 0.) then
3053  lam3 = unavg - sface
3054  else
3055  lam3 = -(unavg-sface)
3056  end if
3057  rrad = lam3 + aavg
3058  if (lam1 .lt. epsacoustic*rrad) then
3059  max6 = epsacoustic*rrad
3060  else
3061  max6 = lam1
3062  end if
3063 ! multiply the eigenvalues by the area to obtain
3064 ! the correct values for the dissipation term.
3065  lam1 = max6*area
3066  if (lam2 .lt. epsacoustic*rrad) then
3067  max7 = epsacoustic*rrad
3068  else
3069  max7 = lam2
3070  end if
3071  lam2 = max7*area
3072  if (lam3 .lt. epsshear*rrad) then
3073  max8 = epsshear*rrad
3074  else
3075  max8 = lam3
3076  end if
3077  lam3 = max8*area
3078 ! some abbreviations, which occur quite often in the
3079 ! dissipation terms.
3080  abv1 = half*(lam1+lam2)
3081  abv2 = half*(lam1-lam2)
3082  abv3 = abv1 - lam3
3083  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53*&
3084 & drk
3085  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
3086  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
3087  abv7 = abv2*abv4*ovaavg + abv3*abv5
3088 ! compute and scatter the dissipative flux.
3089 ! density.
3090  fs = lam3*dr + abv6
3091  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
3092  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
3093 ! x-momentum.
3094  fs = lam3*dru + uavg*abv6 + sx*abv7
3095  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
3096  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
3097 ! y-momentum.
3098  fs = lam3*drv + vavg*abv6 + sy*abv7
3099  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
3100  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
3101 ! z-momentum.
3102  fs = lam3*drw + wavg*abv6 + sz*abv7
3103  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
3104  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
3105 ! energy.
3106  fs = lam3*dre + havg*abv6 + unavg*abv7
3107  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
3108  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
3109  end do
3110 !$ad ii-loop
3111 !
3112 ! dissipative fluxes in the k-direction.
3113 !
3114  do ii=0,nx*ny*kl-1
3115  i = mod(ii, nx) + 2
3116  j = mod(ii/nx, ny) + 2
3117  k = ii/(nx*ny) + 1
3118 ! compute the dissipation coefficients for this face.
3119  ppor = zero
3120  if (pork(i, j, k) .eq. normalflux) ppor = one
3121  if (dss(i, j, k, 3) .lt. dss(i, j, k+1, 3)) then
3122  y3 = dss(i, j, k+1, 3)
3123  else
3124  y3 = dss(i, j, k, 3)
3125  end if
3126  if (dpmax .gt. y3) then
3127  min3 = y3
3128  else
3129  min3 = dpmax
3130  end if
3131  dis2 = ppor*fis2*min3
3132  arg1 = ppor*fis4
3133  dis4 = mydim(arg1, dis2)
3134 ! construct the vector of the first and third differences
3135 ! multiplied by the appropriate constants.
3136  ddw1 = w(i, j, k+1, irho) - w(i, j, k, irho)
3137  dr = dis2*ddw1 - dis4*(w(i, j, k+2, irho)-w(i, j, k-1, irho)-&
3138 & three*ddw1)
3139  ddw2 = w(i, j, k+1, irho)*w(i, j, k+1, ivx) - w(i, j, k, irho)*w&
3140 & (i, j, k, ivx)
3141  dru = dis2*ddw2 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, ivx)-w(i&
3142 & , j, k-1, irho)*w(i, j, k-1, ivx)-three*ddw2)
3143  ddw3 = w(i, j, k+1, irho)*w(i, j, k+1, ivy) - w(i, j, k, irho)*w&
3144 & (i, j, k, ivy)
3145  drv = dis2*ddw3 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, ivy)-w(i&
3146 & , j, k-1, irho)*w(i, j, k-1, ivy)-three*ddw3)
3147  ddw4 = w(i, j, k+1, irho)*w(i, j, k+1, ivz) - w(i, j, k, irho)*w&
3148 & (i, j, k, ivz)
3149  drw = dis2*ddw4 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, ivz)-w(i&
3150 & , j, k-1, irho)*w(i, j, k-1, ivz)-three*ddw4)
3151  ddw5 = w(i, j, k+1, irhoe) - w(i, j, k, irhoe)
3152  dre = dis2*ddw5 - dis4*(w(i, j, k+2, irhoe)-w(i, j, k-1, irhoe)-&
3153 & three*ddw5)
3154 ! in case a k-equation is present, compute the difference
3155 ! of rhok and store the average value of k. if not present,
3156 ! set both these values to zero, such that later on no
3157 ! decision needs to be made anymore.
3158  if (correctfork) then
3159  ddw6 = w(i, j, k+1, irho)*w(i, j, k+1, itu1) - w(i, j, k, irho&
3160 & )*w(i, j, k, itu1)
3161  drk = dis2*ddw6 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, itu1)-&
3162 & w(i, j, k-1, irho)*w(i, j, k-1, itu1)-three*ddw6)
3163  kavg = half*(w(i, j, k+1, itu1)+w(i, j, k, itu1))
3164  else
3165  drk = zero
3166  kavg = zero
3167  end if
3168 ! compute the average value of gamma and compute some
3169 ! expressions in which it occurs.
3170  gammaavg = half*(gamma(i, j, k+1)+gamma(i, j, k))
3171  gm1 = gammaavg - one
3172  ovgm1 = one/gm1
3173  gm53 = gammaavg - five*third
3174 ! compute the average state at the interface.
3175  uavg = half*(w(i, j, k+1, ivx)+w(i, j, k, ivx))
3176  vavg = half*(w(i, j, k+1, ivy)+w(i, j, k, ivy))
3177  wavg = half*(w(i, j, k+1, ivz)+w(i, j, k, ivz))
3178  a2avg = half*(gamma(i, j, k+1)*p(i, j, k+1)/w(i, j, k+1, irho)+&
3179 & gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
3180  area = sqrt(sk(i, j, k, 1)**2 + sk(i, j, k, 2)**2 + sk(i, j, k, &
3181 & 3)**2)
3182  if (1.e-25_realtype .lt. area) then
3183  max9 = area
3184  else
3185  max9 = 1.e-25_realtype
3186  end if
3187  tmp = one/max9
3188  sx = sk(i, j, k, 1)*tmp
3189  sy = sk(i, j, k, 2)*tmp
3190  sz = sk(i, j, k, 3)*tmp
3191  alphaavg = half*(uavg**2+vavg**2+wavg**2)
3192  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
3193  aavg = sqrt(a2avg)
3194  unavg = uavg*sx + vavg*sy + wavg*sz
3195  ovaavg = one/aavg
3196  ova2avg = one/a2avg
3197 ! the mesh velocity if the face is moving. it must be
3198 ! divided by the area to obtain a true velocity.
3199  if (addgridvelocities) sface = sfacek(i, j, k)*tmp
3200  if (unavg - sface + aavg .ge. 0.) then
3201  lam1 = unavg - sface + aavg
3202  else
3203  lam1 = -(unavg-sface+aavg)
3204  end if
3205  if (unavg - sface - aavg .ge. 0.) then
3206  lam2 = unavg - sface - aavg
3207  else
3208  lam2 = -(unavg-sface-aavg)
3209  end if
3210  if (unavg - sface .ge. 0.) then
3211  lam3 = unavg - sface
3212  else
3213  lam3 = -(unavg-sface)
3214  end if
3215  rrad = lam3 + aavg
3216  if (lam1 .lt. epsacoustic*rrad) then
3217  max10 = epsacoustic*rrad
3218  else
3219  max10 = lam1
3220  end if
3221 ! multiply the eigenvalues by the area to obtain
3222 ! the correct values for the dissipation term.
3223  lam1 = max10*area
3224  if (lam2 .lt. epsacoustic*rrad) then
3225  max11 = epsacoustic*rrad
3226  else
3227  max11 = lam2
3228  end if
3229  lam2 = max11*area
3230  if (lam3 .lt. epsshear*rrad) then
3231  max12 = epsshear*rrad
3232  else
3233  max12 = lam3
3234  end if
3235  lam3 = max12*area
3236 ! some abbreviations, which occur quite often in the
3237 ! dissipation terms.
3238  abv1 = half*(lam1+lam2)
3239  abv2 = half*(lam1-lam2)
3240  abv3 = abv1 - lam3
3241  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53*&
3242 & drk
3243  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
3244  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
3245  abv7 = abv2*abv4*ovaavg + abv3*abv5
3246 ! compute and scatter the dissipative flux.
3247 ! density.
3248  fs = lam3*dr + abv6
3249  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) + fs
3250  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
3251 ! x-momentum.
3252  fs = lam3*dru + uavg*abv6 + sx*abv7
3253  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fs
3254  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
3255 ! y-momentum.
3256  fs = lam3*drv + vavg*abv6 + sy*abv7
3257  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fs
3258  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
3259 ! z-momentum.
3260  fs = lam3*drw + wavg*abv6 + sz*abv7
3261  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fs
3262  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
3263 ! energy.
3264  fs = lam3*dre + havg*abv6 + unavg*abv7
3265  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + fs
3266  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
3267  end do
3268  end if
3269  end subroutine invisciddissfluxmatrix
3270 
3271 ! differentiation of invisciddissfluxscalar in reverse (adjoint) mode (with options noisize i4 dr8 r8):
3272 ! gradient of useful results: *p *w *fw
3273 ! with respect to varying inputs: *p *w *fw *radi *radj *radk
3274 ! rw status of diff variables: *p:incr *w:incr *fw:in-out *radi:out
3275 ! *radj:out *radk:out
3276 ! plus diff mem management of: p:in w:in fw:in radi:in radj:in
3277 ! radk:in
3279 !
3280 ! invisciddissfluxscalar computes the scalar artificial
3281 ! dissipation, see aiaa paper 81-1259, for a given block.
3282 ! therefore it is assumed that the pointers in blockpointers
3283 ! already point to the correct block.
3284 !
3285  use constants
3286  use blockpointers, only : nx, ny, nz, il, jl, kl, ie, je, ke,&
3287 & ib, jb, kb, w, wd, p, pd, pori, porj, pork, fw, fwd, radi, radid, &
3288 & radj, radjd, radk, radkd, gamma
3289  use flowvarrefstate, only : gammainf, pinfcorr, rhoinf
3290  use inputdiscretization, only : vis2, vis4
3293  use inputphysics, only : equations
3294  use iteration, only : rfil, totalr0, totalr
3295  use utils_fast_b, only : mydim, mydim_fast_b
3296  implicit none
3297 !
3298 ! local parameter.
3299 !
3300  real(kind=realtype), parameter :: dssmax=0.25_realtype
3301 !
3302 ! local variables.
3303 !
3304  integer(kind=inttype) :: i, j, k, ind, ii
3305  real(kind=realtype) :: sslim, rhoi
3306  real(kind=realtype) :: sfil, fis2, fis4
3307  real(kind=realtype) :: ppor, rrad, dis2, dis4
3308  real(kind=realtype) :: rradd, dis2d, dis4d
3309  real(kind=realtype) :: ddw1, ddw2, ddw3, ddw4, ddw5, fs
3310  real(kind=realtype) :: ddw1d, ddw2d, ddw3d, ddw4d, ddw5d, fsd
3311  real(kind=realtype), dimension(ie, je, ke, 3) :: dss
3312  real(kind=realtype), dimension(ie, je, ke, 3) :: dssd
3313  real(kind=realtype), dimension(0:ib, 0:jb, 0:kb) :: ss
3314  real(kind=realtype), dimension(0:ib, 0:jb, 0:kb) :: ssd
3315  intrinsic abs
3316  intrinsic mod
3317  intrinsic exp
3318  intrinsic log10
3319  intrinsic max
3320  intrinsic min
3321  real(kind=realtype) :: x1
3322  real(kind=realtype) :: x1d
3323  real(kind=realtype) :: x2
3324  real(kind=realtype) :: x2d
3325  real(kind=realtype) :: x3
3326  real(kind=realtype) :: x3d
3327  real(kind=realtype) :: y1
3328  real(kind=realtype) :: y1d
3329  real(kind=realtype) :: y2
3330  real(kind=realtype) :: y2d
3331  real(kind=realtype) :: y3
3332  real(kind=realtype) :: y3d
3333  real(kind=realtype) :: abs0
3334  real(kind=realtype) :: min1
3335  real(kind=realtype) :: min1d
3336  real(kind=realtype) :: min2
3337  real(kind=realtype) :: min2d
3338  real(kind=realtype) :: min3
3339  real(kind=realtype) :: min3d
3340  real(kind=realtype) :: arg1
3341  real(kind=realtype) :: arg1d
3342  real(kind=realtype) :: temp
3343  real(kind=realtype) :: temp0
3344  real(kind=realtype) :: temp1
3345  real(kind=realtype) :: tempd
3346  real(kind=realtype) :: tempd0
3347  integer :: branch
3348  real(kind=realtype) :: temp2
3349  real(kind=realtype) :: temp3
3350  real(kind=realtype) :: tempd1
3351  real(kind=realtype) :: tempd2
3352  if (rfil .ge. 0.) then
3353  abs0 = rfil
3354  else
3355  abs0 = -rfil
3356  end if
3357 ! check if rfil == 0. if so, the dissipative flux needs not to
3358 ! be computed.
3359  if (abs0 .lt. thresholdreal) then
3360  if (associated(radid)) radid = 0.0_8
3361  if (associated(radjd)) radjd = 0.0_8
3362  if (associated(radkd)) radkd = 0.0_8
3363  else
3364 ! determine the variables used to compute the switch.
3365 ! for the inviscid case this is the pressure; for the viscous
3366 ! case it is the entropy.
3367  select case (equations)
3368  case (eulerequations)
3369 ! inviscid case. pressure switch is based on the pressure.
3370 ! also set the value of sslim. to be fully consistent this
3371 ! must have the dimension of pressure and it is therefore
3372 ! set to a fraction of the free stream value.
3373  sslim = 0.001_realtype*pinfcorr
3374 ! copy the pressure in ss. only need the entries used in the
3375 ! discretization, i.e. not including the corner halo's, but we'll
3376 ! just copy all anyway.
3377  ss = p
3378 !===============================================================
3379  call pushcontrol2b(1)
3380  case (nsequations, ransequations)
3381 ! viscous case. pressure switch is based on the entropy.
3382 ! also set the value of sslim. to be fully consistent this
3383 ! must have the dimension of entropy and it is therefore
3384 ! set to a fraction of the free stream value.
3385  sslim = 0.001_realtype*pinfcorr/rhoinf**gammainf
3386 !$fwd-of ii-loop
3387 ! store the entropy in ss. see above.
3388  do ii=0,(ib+1)*(jb+1)*(kb+1)-1
3389  i = mod(ii, ib + 1)
3390  j = mod(ii/(ib+1), jb + 1)
3391  k = ii/((ib+1)*(jb+1))
3392  ss(i, j, k) = p(i, j, k)/w(i, j, k, irho)**gamma(i, j, k)
3393  end do
3394  call pushcontrol2b(2)
3395  case default
3396  call pushcontrol2b(0)
3397  end select
3398 !$fwd-of ii-loop
3399 ! compute the pressure sensor for each cell, in each direction:
3400  do ii=0,ie*je*ke-1
3401  i = mod(ii, ie) + 1
3402  j = mod(ii/ie, je) + 1
3403  k = ii/(ie*je) + 1
3404  x1 = (ss(i+1, j, k)-two*ss(i, j, k)+ss(i-1, j, k))/(ss(i+1, j, k&
3405 & )+two*ss(i, j, k)+ss(i-1, j, k)+sslim)
3406  if (x1 .ge. 0.) then
3407  dss(i, j, k, 1) = x1
3408  else
3409  dss(i, j, k, 1) = -x1
3410  end if
3411  x2 = (ss(i, j+1, k)-two*ss(i, j, k)+ss(i, j-1, k))/(ss(i, j+1, k&
3412 & )+two*ss(i, j, k)+ss(i, j-1, k)+sslim)
3413  if (x2 .ge. 0.) then
3414  dss(i, j, k, 2) = x2
3415  else
3416  dss(i, j, k, 2) = -x2
3417  end if
3418  x3 = (ss(i, j, k+1)-two*ss(i, j, k)+ss(i, j, k-1))/(ss(i, j, k+1&
3419 & )+two*ss(i, j, k)+ss(i, j, k-1)+sslim)
3420  if (x3 .ge. 0.) then
3421  dss(i, j, k, 3) = x3
3422  else
3423  dss(i, j, k, 3) = -x3
3424  end if
3425  end do
3426 ! set the dissipation constants for the scheme.
3427 ! rfil and sfil are fractions used by the runge-kutta solver to compute residuals at intermediate steps.
3428 ! this means that fis2 and fis4 will be some fraction of vis2 and vis4, respectively.
3429 ! for other solvers, rfil==1, sfil==0, fis2==vis2, and fis4==vis4.
3430 ! the sigmoid function used for dissipation-based continuation is described in eq. 28 and eq. 29 from the paper:
3431 ! "improving the performance of a compressible rans solver for low and high mach number flows" (seraj2022c).
3432 ! the options documentation also has information on the parameters in this formulation.
3433  if (usedisscontinuation) then
3434  if (totalr .eq. zero .or. totalr0 .eq. zero) then
3435 myintptr = myintptr + 1
3436  myintstack(myintptr) = 0
3437  fis2 = rfil*(vis2+disscontmagnitude/(1+exp(-(disscontsharpness&
3438 & *disscontmidpoint))))
3439  else
3440 myintptr = myintptr + 1
3441  myintstack(myintptr) = 0
3442  fis2 = rfil*(vis2+disscontmagnitude/(1+exp(-(disscontsharpness&
3443 & *(log10(totalr/totalr0)+disscontmidpoint)))))
3444  end if
3445  else
3446 myintptr = myintptr + 1
3447  myintstack(myintptr) = 1
3448  fis2 = rfil*vis2
3449  end if
3450  fis4 = rfil*vis4
3451  sfil = one - rfil
3452 ! initialize the dissipative residual to a certain times,
3453 ! possibly zero, the previously stored value. owned cells
3454 ! only, because the halo values do not matter.
3455  if (associated(radkd)) radkd = 0.0_8
3456  dssd = 0.0_8
3457 !$bwd-of ii-loop
3458  do ii=0,nx*ny*kl-1
3459  i = mod(ii, nx) + 2
3460  j = mod(ii/nx, ny) + 2
3461  k = ii/(nx*ny) + 1
3462 ! compute the dissipation coefficients for this face.
3463  ppor = zero
3464  if (pork(i, j, k) .eq. normalflux) ppor = half
3465  rrad = ppor*(radk(i, j, k)+radk(i, j, k+1))
3466  if (dss(i, j, k, 3) .lt. dss(i, j, k+1, 3)) then
3467  y3 = dss(i, j, k+1, 3)
3468 myintptr = myintptr + 1
3469  myintstack(myintptr) = 0
3470  else
3471  y3 = dss(i, j, k, 3)
3472 myintptr = myintptr + 1
3473  myintstack(myintptr) = 1
3474  end if
3475  if (dssmax .gt. y3) then
3476  min3 = y3
3477 myintptr = myintptr + 1
3478  myintstack(myintptr) = 0
3479  else
3480  min3 = dssmax
3481 myintptr = myintptr + 1
3482  myintstack(myintptr) = 1
3483  end if
3484  dis2 = fis2*rrad*min3
3485  arg1 = fis4*rrad
3486  dis4 = mydim(arg1, dis2)
3487 ! compute and scatter the dissipative flux.
3488 ! density. store it in the mass flow of the
3489 ! appropriate sliding mesh interface.
3490  ddw1 = w(i, j, k+1, irho) - w(i, j, k, irho)
3491 ! x-momentum.
3492  ddw2 = w(i, j, k+1, ivx)*w(i, j, k+1, irho) - w(i, j, k, ivx)*w(&
3493 & i, j, k, irho)
3494 ! y-momentum.
3495  ddw3 = w(i, j, k+1, ivy)*w(i, j, k+1, irho) - w(i, j, k, ivy)*w(&
3496 & i, j, k, irho)
3497 ! z-momentum.
3498  ddw4 = w(i, j, k+1, ivz)*w(i, j, k+1, irho) - w(i, j, k, ivz)*w(&
3499 & i, j, k, irho)
3500 ! energy.
3501  ddw5 = w(i, j, k+1, irhoe) + p(i, j, k+1) - (w(i, j, k, irhoe)+p&
3502 & (i, j, k))
3503  fsd = fwd(i, j, k+1, irhoe) - fwd(i, j, k, irhoe)
3504  dis2d = ddw5*fsd
3505  dis4d = -((w(i, j, k+2, irhoe)+p(i, j, k+2)-w(i, j, k-1, irhoe)-&
3506 & p(i, j, k-1)-three*ddw5)*fsd)
3507  tempd1 = -(dis4*fsd)
3508  ddw5d = dis2*fsd - three*tempd1
3509  wd(i, j, k+2, irhoe) = wd(i, j, k+2, irhoe) + tempd1
3510  pd(i, j, k+2) = pd(i, j, k+2) + tempd1
3511  wd(i, j, k-1, irhoe) = wd(i, j, k-1, irhoe) - tempd1
3512  pd(i, j, k-1) = pd(i, j, k-1) - tempd1
3513  wd(i, j, k+1, irhoe) = wd(i, j, k+1, irhoe) + ddw5d
3514  pd(i, j, k+1) = pd(i, j, k+1) + ddw5d
3515  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddw5d
3516  pd(i, j, k) = pd(i, j, k) - ddw5d
3517  fsd = fwd(i, j, k+1, imz) - fwd(i, j, k, imz)
3518  temp3 = w(i, j, k-1, irho)
3519  temp2 = w(i, j, k-1, ivz)
3520  temp1 = w(i, j, k+2, irho)
3521  temp0 = w(i, j, k+2, ivz)
3522  dis2d = dis2d + ddw4*fsd
3523  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw4)*fsd
3524  tempd2 = -(dis4*fsd)
3525  ddw4d = dis2*fsd - three*tempd2
3526  wd(i, j, k+2, ivz) = wd(i, j, k+2, ivz) + temp1*tempd2
3527  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + temp0*tempd2
3528  wd(i, j, k-1, ivz) = wd(i, j, k-1, ivz) - temp3*tempd2
3529  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - temp2*tempd2
3530  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + w(i, j, k+1, irho)*&
3531 & ddw4d
3532  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, ivz)*&
3533 & ddw4d
3534  wd(i, j, k, ivz) = wd(i, j, k, ivz) - w(i, j, k, irho)*ddw4d
3535  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivz)*ddw4d
3536  fsd = fwd(i, j, k+1, imy) - fwd(i, j, k, imy)
3537  temp3 = w(i, j, k-1, irho)
3538  temp2 = w(i, j, k-1, ivy)
3539  temp1 = w(i, j, k+2, irho)
3540  temp0 = w(i, j, k+2, ivy)
3541  dis2d = dis2d + ddw3*fsd
3542  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw3)*fsd
3543  tempd2 = -(dis4*fsd)
3544  ddw3d = dis2*fsd - three*tempd2
3545  wd(i, j, k+2, ivy) = wd(i, j, k+2, ivy) + temp1*tempd2
3546  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + temp0*tempd2
3547  wd(i, j, k-1, ivy) = wd(i, j, k-1, ivy) - temp3*tempd2
3548  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - temp2*tempd2
3549  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + w(i, j, k+1, irho)*&
3550 & ddw3d
3551  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, ivy)*&
3552 & ddw3d
3553  wd(i, j, k, ivy) = wd(i, j, k, ivy) - w(i, j, k, irho)*ddw3d
3554  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivy)*ddw3d
3555  fsd = fwd(i, j, k+1, imx) - fwd(i, j, k, imx)
3556  temp3 = w(i, j, k-1, irho)
3557  temp2 = w(i, j, k-1, ivx)
3558  temp1 = w(i, j, k+2, irho)
3559  temp0 = w(i, j, k+2, ivx)
3560  dis2d = dis2d + ddw2*fsd
3561  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw2)*fsd
3562  tempd2 = -(dis4*fsd)
3563  ddw2d = dis2*fsd - three*tempd2
3564  wd(i, j, k+2, ivx) = wd(i, j, k+2, ivx) + temp1*tempd2
3565  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + temp0*tempd2
3566  wd(i, j, k-1, ivx) = wd(i, j, k-1, ivx) - temp3*tempd2
3567  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - temp2*tempd2
3568  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + w(i, j, k+1, irho)*&
3569 & ddw2d
3570  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + w(i, j, k+1, ivx)*&
3571 & ddw2d
3572  wd(i, j, k, ivx) = wd(i, j, k, ivx) - w(i, j, k, irho)*ddw2d
3573  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivx)*ddw2d
3574  fsd = fwd(i, j, k+1, irho) - fwd(i, j, k, irho)
3575  dis2d = dis2d + ddw1*fsd
3576  dis4d = dis4d - (w(i, j, k+2, irho)-w(i, j, k-1, irho)-three*&
3577 & ddw1)*fsd
3578  tempd1 = -(dis4*fsd)
3579  ddw1d = dis2*fsd - three*tempd1
3580  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + tempd1
3581  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - tempd1
3582  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + ddw1d
3583  wd(i, j, k, irho) = wd(i, j, k, irho) - ddw1d
3584  call mydim_fast_b(arg1, arg1d, dis2, dis2d, dis4d)
3585  rradd = fis4*arg1d + min3*fis2*dis2d
3586  min3d = rrad*fis2*dis2d
3587 branch = myintstack(myintptr)
3588  myintptr = myintptr - 1
3589  if (branch .eq. 0) then
3590  y3d = min3d
3591  else
3592  y3d = 0.0_8
3593  end if
3594 branch = myintstack(myintptr)
3595  myintptr = myintptr - 1
3596  if (branch .eq. 0) then
3597  dssd(i, j, k+1, 3) = dssd(i, j, k+1, 3) + y3d
3598  else
3599  dssd(i, j, k, 3) = dssd(i, j, k, 3) + y3d
3600  end if
3601  radkd(i, j, k) = radkd(i, j, k) + ppor*rradd
3602  radkd(i, j, k+1) = radkd(i, j, k+1) + ppor*rradd
3603  end do
3604  if (associated(radjd)) radjd = 0.0_8
3605 !$bwd-of ii-loop
3606  do ii=0,nx*jl*nz-1
3607  i = mod(ii, nx) + 2
3608  j = mod(ii/nx, jl) + 1
3609  k = ii/(nx*jl) + 2
3610 ! compute the dissipation coefficients for this face.
3611  ppor = zero
3612  if (porj(i, j, k) .eq. normalflux) ppor = half
3613  rrad = ppor*(radj(i, j, k)+radj(i, j+1, k))
3614  if (dss(i, j, k, 2) .lt. dss(i, j+1, k, 2)) then
3615  y2 = dss(i, j+1, k, 2)
3616 myintptr = myintptr + 1
3617  myintstack(myintptr) = 0
3618  else
3619  y2 = dss(i, j, k, 2)
3620 myintptr = myintptr + 1
3621  myintstack(myintptr) = 1
3622  end if
3623  if (dssmax .gt. y2) then
3624  min2 = y2
3625 myintptr = myintptr + 1
3626  myintstack(myintptr) = 0
3627  else
3628  min2 = dssmax
3629 myintptr = myintptr + 1
3630  myintstack(myintptr) = 1
3631  end if
3632  dis2 = fis2*rrad*min2
3633  arg1 = fis4*rrad
3634  dis4 = mydim(arg1, dis2)
3635 ! compute and scatter the dissipative flux.
3636 ! density. store it in the mass flow of the
3637 ! appropriate sliding mesh interface.
3638  ddw1 = w(i, j+1, k, irho) - w(i, j, k, irho)
3639 ! x-momentum.
3640  ddw2 = w(i, j+1, k, ivx)*w(i, j+1, k, irho) - w(i, j, k, ivx)*w(&
3641 & i, j, k, irho)
3642 ! y-momentum.
3643  ddw3 = w(i, j+1, k, ivy)*w(i, j+1, k, irho) - w(i, j, k, ivy)*w(&
3644 & i, j, k, irho)
3645 ! z-momentum.
3646  ddw4 = w(i, j+1, k, ivz)*w(i, j+1, k, irho) - w(i, j, k, ivz)*w(&
3647 & i, j, k, irho)
3648 ! energy.
3649  ddw5 = w(i, j+1, k, irhoe) + p(i, j+1, k) - (w(i, j, k, irhoe)+p&
3650 & (i, j, k))
3651  fsd = fwd(i, j+1, k, irhoe) - fwd(i, j, k, irhoe)
3652  dis2d = ddw5*fsd
3653  dis4d = -((w(i, j+2, k, irhoe)+p(i, j+2, k)-w(i, j-1, k, irhoe)-&
3654 & p(i, j-1, k)-three*ddw5)*fsd)
3655  tempd1 = -(dis4*fsd)
3656  ddw5d = dis2*fsd - three*tempd1
3657  wd(i, j+2, k, irhoe) = wd(i, j+2, k, irhoe) + tempd1
3658  pd(i, j+2, k) = pd(i, j+2, k) + tempd1
3659  wd(i, j-1, k, irhoe) = wd(i, j-1, k, irhoe) - tempd1
3660  pd(i, j-1, k) = pd(i, j-1, k) - tempd1
3661  wd(i, j+1, k, irhoe) = wd(i, j+1, k, irhoe) + ddw5d
3662  pd(i, j+1, k) = pd(i, j+1, k) + ddw5d
3663  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddw5d
3664  pd(i, j, k) = pd(i, j, k) - ddw5d
3665  fsd = fwd(i, j+1, k, imz) - fwd(i, j, k, imz)
3666  temp3 = w(i, j-1, k, irho)
3667  temp2 = w(i, j-1, k, ivz)
3668  temp1 = w(i, j+2, k, irho)
3669  temp0 = w(i, j+2, k, ivz)
3670  dis2d = dis2d + ddw4*fsd
3671  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw4)*fsd
3672  tempd2 = -(dis4*fsd)
3673  ddw4d = dis2*fsd - three*tempd2
3674  wd(i, j+2, k, ivz) = wd(i, j+2, k, ivz) + temp1*tempd2
3675  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + temp0*tempd2
3676  wd(i, j-1, k, ivz) = wd(i, j-1, k, ivz) - temp3*tempd2
3677  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - temp2*tempd2
3678  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + w(i, j+1, k, irho)*&
3679 & ddw4d
3680  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, ivz)*&
3681 & ddw4d
3682  wd(i, j, k, ivz) = wd(i, j, k, ivz) - w(i, j, k, irho)*ddw4d
3683  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivz)*ddw4d
3684  fsd = fwd(i, j+1, k, imy) - fwd(i, j, k, imy)
3685  temp3 = w(i, j-1, k, irho)
3686  temp2 = w(i, j-1, k, ivy)
3687  temp1 = w(i, j+2, k, irho)
3688  temp0 = w(i, j+2, k, ivy)
3689  dis2d = dis2d + ddw3*fsd
3690  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw3)*fsd
3691  tempd2 = -(dis4*fsd)
3692  ddw3d = dis2*fsd - three*tempd2
3693  wd(i, j+2, k, ivy) = wd(i, j+2, k, ivy) + temp1*tempd2
3694  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + temp0*tempd2
3695  wd(i, j-1, k, ivy) = wd(i, j-1, k, ivy) - temp3*tempd2
3696  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - temp2*tempd2
3697  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + w(i, j+1, k, irho)*&
3698 & ddw3d
3699  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, ivy)*&
3700 & ddw3d
3701  wd(i, j, k, ivy) = wd(i, j, k, ivy) - w(i, j, k, irho)*ddw3d
3702  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivy)*ddw3d
3703  fsd = fwd(i, j+1, k, imx) - fwd(i, j, k, imx)
3704  temp3 = w(i, j-1, k, irho)
3705  temp2 = w(i, j-1, k, ivx)
3706  temp1 = w(i, j+2, k, irho)
3707  temp0 = w(i, j+2, k, ivx)
3708  dis2d = dis2d + ddw2*fsd
3709  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw2)*fsd
3710  tempd2 = -(dis4*fsd)
3711  ddw2d = dis2*fsd - three*tempd2
3712  wd(i, j+2, k, ivx) = wd(i, j+2, k, ivx) + temp1*tempd2
3713  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + temp0*tempd2
3714  wd(i, j-1, k, ivx) = wd(i, j-1, k, ivx) - temp3*tempd2
3715  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - temp2*tempd2
3716  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + w(i, j+1, k, irho)*&
3717 & ddw2d
3718  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + w(i, j+1, k, ivx)*&
3719 & ddw2d
3720  wd(i, j, k, ivx) = wd(i, j, k, ivx) - w(i, j, k, irho)*ddw2d
3721  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivx)*ddw2d
3722  fsd = fwd(i, j+1, k, irho) - fwd(i, j, k, irho)
3723  dis2d = dis2d + ddw1*fsd
3724  dis4d = dis4d - (w(i, j+2, k, irho)-w(i, j-1, k, irho)-three*&
3725 & ddw1)*fsd
3726  tempd1 = -(dis4*fsd)
3727  ddw1d = dis2*fsd - three*tempd1
3728  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + tempd1
3729  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - tempd1
3730  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + ddw1d
3731  wd(i, j, k, irho) = wd(i, j, k, irho) - ddw1d
3732  call mydim_fast_b(arg1, arg1d, dis2, dis2d, dis4d)
3733  rradd = fis4*arg1d + min2*fis2*dis2d
3734  min2d = rrad*fis2*dis2d
3735 branch = myintstack(myintptr)
3736  myintptr = myintptr - 1
3737  if (branch .eq. 0) then
3738  y2d = min2d
3739  else
3740  y2d = 0.0_8
3741  end if
3742 branch = myintstack(myintptr)
3743  myintptr = myintptr - 1
3744  if (branch .eq. 0) then
3745  dssd(i, j+1, k, 2) = dssd(i, j+1, k, 2) + y2d
3746  else
3747  dssd(i, j, k, 2) = dssd(i, j, k, 2) + y2d
3748  end if
3749  radjd(i, j, k) = radjd(i, j, k) + ppor*rradd
3750  radjd(i, j+1, k) = radjd(i, j+1, k) + ppor*rradd
3751  end do
3752  if (associated(radid)) radid = 0.0_8
3753 !$bwd-of ii-loop
3754  do ii=0,il*ny*nz-1
3755  i = mod(ii, il) + 1
3756  j = mod(ii/il, ny) + 2
3757  k = ii/(il*ny) + 2
3758 ! compute the dissipation coefficients for this face.
3759  ppor = zero
3760  if (pori(i, j, k) .eq. normalflux) ppor = half
3761  rrad = ppor*(radi(i, j, k)+radi(i+1, j, k))
3762  if (dss(i, j, k, 1) .lt. dss(i+1, j, k, 1)) then
3763  y1 = dss(i+1, j, k, 1)
3764 myintptr = myintptr + 1
3765  myintstack(myintptr) = 0
3766  else
3767  y1 = dss(i, j, k, 1)
3768 myintptr = myintptr + 1
3769  myintstack(myintptr) = 1
3770  end if
3771  if (dssmax .gt. y1) then
3772  min1 = y1
3773 myintptr = myintptr + 1
3774  myintstack(myintptr) = 0
3775  else
3776  min1 = dssmax
3777 myintptr = myintptr + 1
3778  myintstack(myintptr) = 1
3779  end if
3780  dis2 = fis2*rrad*min1
3781  arg1 = fis4*rrad
3782  dis4 = mydim(arg1, dis2)
3783 ! compute and scatter the dissipative flux.
3784 ! density. store it in the mass flow of the
3785 ! appropriate sliding mesh interface.
3786  ddw1 = w(i+1, j, k, irho) - w(i, j, k, irho)
3787 ! x-momentum.
3788  ddw2 = w(i+1, j, k, ivx)*w(i+1, j, k, irho) - w(i, j, k, ivx)*w(&
3789 & i, j, k, irho)
3790 ! y-momentum.
3791  ddw3 = w(i+1, j, k, ivy)*w(i+1, j, k, irho) - w(i, j, k, ivy)*w(&
3792 & i, j, k, irho)
3793 ! z-momentum.
3794  ddw4 = w(i+1, j, k, ivz)*w(i+1, j, k, irho) - w(i, j, k, ivz)*w(&
3795 & i, j, k, irho)
3796 ! energy.
3797  ddw5 = w(i+1, j, k, irhoe) + p(i+1, j, k) - (w(i, j, k, irhoe)+p&
3798 & (i, j, k))
3799  fsd = fwd(i+1, j, k, irhoe) - fwd(i, j, k, irhoe)
3800  dis2d = ddw5*fsd
3801  dis4d = -((w(i+2, j, k, irhoe)+p(i+2, j, k)-w(i-1, j, k, irhoe)-&
3802 & p(i-1, j, k)-three*ddw5)*fsd)
3803  tempd1 = -(dis4*fsd)
3804  ddw5d = dis2*fsd - three*tempd1
3805  wd(i+2, j, k, irhoe) = wd(i+2, j, k, irhoe) + tempd1
3806  pd(i+2, j, k) = pd(i+2, j, k) + tempd1
3807  wd(i-1, j, k, irhoe) = wd(i-1, j, k, irhoe) - tempd1
3808  pd(i-1, j, k) = pd(i-1, j, k) - tempd1
3809  wd(i+1, j, k, irhoe) = wd(i+1, j, k, irhoe) + ddw5d
3810  pd(i+1, j, k) = pd(i+1, j, k) + ddw5d
3811  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - ddw5d
3812  pd(i, j, k) = pd(i, j, k) - ddw5d
3813  fsd = fwd(i+1, j, k, imz) - fwd(i, j, k, imz)
3814  temp3 = w(i-1, j, k, irho)
3815  temp2 = w(i-1, j, k, ivz)
3816  temp1 = w(i+2, j, k, irho)
3817  temp0 = w(i+2, j, k, ivz)
3818  dis2d = dis2d + ddw4*fsd
3819  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw4)*fsd
3820  tempd2 = -(dis4*fsd)
3821  ddw4d = dis2*fsd - three*tempd2
3822  wd(i+2, j, k, ivz) = wd(i+2, j, k, ivz) + temp1*tempd2
3823  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + temp0*tempd2
3824  wd(i-1, j, k, ivz) = wd(i-1, j, k, ivz) - temp3*tempd2
3825  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - temp2*tempd2
3826  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + w(i+1, j, k, irho)*&
3827 & ddw4d
3828  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, ivz)*&
3829 & ddw4d
3830  wd(i, j, k, ivz) = wd(i, j, k, ivz) - w(i, j, k, irho)*ddw4d
3831  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivz)*ddw4d
3832  fsd = fwd(i+1, j, k, imy) - fwd(i, j, k, imy)
3833  temp3 = w(i-1, j, k, irho)
3834  temp2 = w(i-1, j, k, ivy)
3835  temp1 = w(i+2, j, k, irho)
3836  temp0 = w(i+2, j, k, ivy)
3837  dis2d = dis2d + ddw3*fsd
3838  dis4d = dis4d - (temp0*temp1-temp2*temp3-three*ddw3)*fsd
3839  tempd2 = -(dis4*fsd)
3840  ddw3d = dis2*fsd - three*tempd2
3841  wd(i+2, j, k, ivy) = wd(i+2, j, k, ivy) + temp1*tempd2
3842  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + temp0*tempd2
3843  wd(i-1, j, k, ivy) = wd(i-1, j, k, ivy) - temp3*tempd2
3844  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - temp2*tempd2
3845  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + w(i+1, j, k, irho)*&
3846 & ddw3d
3847  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, ivy)*&
3848 & ddw3d
3849  wd(i, j, k, ivy) = wd(i, j, k, ivy) - w(i, j, k, irho)*ddw3d
3850  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivy)*ddw3d
3851  fsd = fwd(i+1, j, k, imx) - fwd(i, j, k, imx)
3852  temp1 = w(i-1, j, k, irho)
3853  temp0 = w(i-1, j, k, ivx)
3854  temp = w(i+2, j, k, irho)
3855  temp2 = w(i+2, j, k, ivx)
3856  dis2d = dis2d + ddw2*fsd
3857  dis4d = dis4d - (temp2*temp-temp0*temp1-three*ddw2)*fsd
3858  tempd1 = -(dis4*fsd)
3859  ddw2d = dis2*fsd - three*tempd1
3860  wd(i+2, j, k, ivx) = wd(i+2, j, k, ivx) + temp*tempd1
3861  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + temp2*tempd1
3862  wd(i-1, j, k, ivx) = wd(i-1, j, k, ivx) - temp1*tempd1
3863  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - temp0*tempd1
3864  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + w(i+1, j, k, irho)*&
3865 & ddw2d
3866  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + w(i+1, j, k, ivx)*&
3867 & ddw2d
3868  wd(i, j, k, ivx) = wd(i, j, k, ivx) - w(i, j, k, irho)*ddw2d
3869  wd(i, j, k, irho) = wd(i, j, k, irho) - w(i, j, k, ivx)*ddw2d
3870  fsd = fwd(i+1, j, k, irho) - fwd(i, j, k, irho)
3871  dis2d = dis2d + ddw1*fsd
3872  dis4d = dis4d - (w(i+2, j, k, irho)-w(i-1, j, k, irho)-three*&
3873 & ddw1)*fsd
3874  tempd0 = -(dis4*fsd)
3875  ddw1d = dis2*fsd - three*tempd0
3876  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + tempd0
3877  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - tempd0
3878  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + ddw1d
3879  wd(i, j, k, irho) = wd(i, j, k, irho) - ddw1d
3880  call mydim_fast_b(arg1, arg1d, dis2, dis2d, dis4d)
3881  rradd = fis4*arg1d + min1*fis2*dis2d
3882  min1d = rrad*fis2*dis2d
3883 branch = myintstack(myintptr)
3884  myintptr = myintptr - 1
3885  if (branch .eq. 0) then
3886  y1d = min1d
3887  else
3888  y1d = 0.0_8
3889  end if
3890 branch = myintstack(myintptr)
3891  myintptr = myintptr - 1
3892  if (branch .eq. 0) then
3893  dssd(i+1, j, k, 1) = dssd(i+1, j, k, 1) + y1d
3894  else
3895  dssd(i, j, k, 1) = dssd(i, j, k, 1) + y1d
3896  end if
3897  radid(i, j, k) = radid(i, j, k) + ppor*rradd
3898  radid(i+1, j, k) = radid(i+1, j, k) + ppor*rradd
3899  end do
3900  fwd = sfil*fwd
3901 branch = myintstack(myintptr)
3902  myintptr = myintptr - 1
3903  ssd = 0.0_8
3904 !$bwd-of ii-loop
3905  do ii=0,ie*je*ke-1
3906  i = mod(ii, ie) + 1
3907  j = mod(ii/ie, je) + 1
3908  k = ii/(ie*je) + 1
3909  x1 = (ss(i+1, j, k)-two*ss(i, j, k)+ss(i-1, j, k))/(ss(i+1, j, k&
3910 & )+two*ss(i, j, k)+ss(i-1, j, k)+sslim)
3911  if (x1 .ge. 0.) then
3912 myintptr = myintptr + 1
3913  myintstack(myintptr) = 0
3914  else
3915 myintptr = myintptr + 1
3916  myintstack(myintptr) = 1
3917  end if
3918  x2 = (ss(i, j+1, k)-two*ss(i, j, k)+ss(i, j-1, k))/(ss(i, j+1, k&
3919 & )+two*ss(i, j, k)+ss(i, j-1, k)+sslim)
3920  if (x2 .ge. 0.) then
3921 myintptr = myintptr + 1
3922  myintstack(myintptr) = 0
3923  else
3924 myintptr = myintptr + 1
3925  myintstack(myintptr) = 1
3926  end if
3927  x3 = (ss(i, j, k+1)-two*ss(i, j, k)+ss(i, j, k-1))/(ss(i, j, k+1&
3928 & )+two*ss(i, j, k)+ss(i, j, k-1)+sslim)
3929  if (x3 .ge. 0.) then
3930  x3d = dssd(i, j, k, 3)
3931  dssd(i, j, k, 3) = 0.0_8
3932  else
3933  x3d = -dssd(i, j, k, 3)
3934  dssd(i, j, k, 3) = 0.0_8
3935  end if
3936  temp1 = sslim + ss(i, j, k+1) + two*ss(i, j, k) + ss(i, j, k-1)
3937  tempd = x3d/temp1
3938  tempd0 = -((ss(i, j, k+1)-two*ss(i, j, k)+ss(i, j, k-1))*tempd/&
3939 & temp1)
3940  ssd(i, j, k+1) = ssd(i, j, k+1) + tempd + tempd0
3941  ssd(i, j, k) = ssd(i, j, k) + two*tempd0 - two*tempd
3942  ssd(i, j, k-1) = ssd(i, j, k-1) + tempd + tempd0
3943 branch = myintstack(myintptr)
3944  myintptr = myintptr - 1
3945  if (branch .eq. 0) then
3946  x2d = dssd(i, j, k, 2)
3947  dssd(i, j, k, 2) = 0.0_8
3948  else
3949  x2d = -dssd(i, j, k, 2)
3950  dssd(i, j, k, 2) = 0.0_8
3951  end if
3952  temp1 = sslim + ss(i, j+1, k) + two*ss(i, j, k) + ss(i, j-1, k)
3953  tempd = x2d/temp1
3954  tempd0 = -((ss(i, j+1, k)-two*ss(i, j, k)+ss(i, j-1, k))*tempd/&
3955 & temp1)
3956  ssd(i, j+1, k) = ssd(i, j+1, k) + tempd + tempd0
3957  ssd(i, j, k) = ssd(i, j, k) + two*tempd0 - two*tempd
3958  ssd(i, j-1, k) = ssd(i, j-1, k) + tempd + tempd0
3959 branch = myintstack(myintptr)
3960  myintptr = myintptr - 1
3961  if (branch .eq. 0) then
3962  x1d = dssd(i, j, k, 1)
3963  dssd(i, j, k, 1) = 0.0_8
3964  else
3965  x1d = -dssd(i, j, k, 1)
3966  dssd(i, j, k, 1) = 0.0_8
3967  end if
3968  temp1 = sslim + ss(i+1, j, k) + two*ss(i, j, k) + ss(i-1, j, k)
3969  tempd = x1d/temp1
3970  tempd0 = -((ss(i+1, j, k)-two*ss(i, j, k)+ss(i-1, j, k))*tempd/&
3971 & temp1)
3972  ssd(i+1, j, k) = ssd(i+1, j, k) + tempd + tempd0
3973  ssd(i, j, k) = ssd(i, j, k) + two*tempd0 - two*tempd
3974  ssd(i-1, j, k) = ssd(i-1, j, k) + tempd + tempd0
3975  end do
3976  call popcontrol2b(branch)
3977  if (branch .ne. 0) then
3978  if (branch .eq. 1) then
3979  pd = pd + ssd
3980  else
3981 !$bwd-of ii-loop
3982  do ii=0,(ib+1)*(jb+1)*(kb+1)-1
3983  i = mod(ii, ib + 1)
3984  j = mod(ii/(ib+1), jb + 1)
3985  k = ii/((ib+1)*(jb+1))
3986  temp = gamma(i, j, k)
3987  temp0 = w(i, j, k, irho)
3988  temp1 = temp0**temp
3989  pd(i, j, k) = pd(i, j, k) + ssd(i, j, k)/temp1
3990  if (.not.(temp0 .le. 0.0_8 .and. (temp .eq. 0.0_8 .or. temp &
3991 & .ne. int(temp)))) wd(i, j, k, irho) = wd(i, j, k, irho) &
3992 & - temp*temp0**(temp-1)*p(i, j, k)*ssd(i, j, k)/temp1**2
3993  ssd(i, j, k) = 0.0_8
3994  end do
3995  end if
3996  end if
3997  end if
3998  end subroutine invisciddissfluxscalar_fast_b
3999 
4001 !
4002 ! invisciddissfluxscalar computes the scalar artificial
4003 ! dissipation, see aiaa paper 81-1259, for a given block.
4004 ! therefore it is assumed that the pointers in blockpointers
4005 ! already point to the correct block.
4006 !
4007  use constants
4008  use blockpointers, only : nx, ny, nz, il, jl, kl, ie, je, ke,&
4009 & ib, jb, kb, w, p, pori, porj, pork, fw, radi, radj, radk, gamma
4010  use flowvarrefstate, only : gammainf, pinfcorr, rhoinf
4011  use inputdiscretization, only : vis2, vis4
4014  use inputphysics, only : equations
4015  use iteration, only : rfil, totalr0, totalr
4016  use utils_fast_b, only : mydim
4017  implicit none
4018 !
4019 ! local parameter.
4020 !
4021  real(kind=realtype), parameter :: dssmax=0.25_realtype
4022 !
4023 ! local variables.
4024 !
4025  integer(kind=inttype) :: i, j, k, ind, ii
4026  real(kind=realtype) :: sslim, rhoi
4027  real(kind=realtype) :: sfil, fis2, fis4
4028  real(kind=realtype) :: ppor, rrad, dis2, dis4
4029  real(kind=realtype) :: ddw1, ddw2, ddw3, ddw4, ddw5, fs
4030  real(kind=realtype), dimension(ie, je, ke, 3) :: dss
4031  real(kind=realtype), dimension(0:ib, 0:jb, 0:kb) :: ss
4032  intrinsic abs
4033  intrinsic mod
4034  intrinsic exp
4035  intrinsic log10
4036  intrinsic max
4037  intrinsic min
4038  real(kind=realtype) :: x1
4039  real(kind=realtype) :: x2
4040  real(kind=realtype) :: x3
4041  real(kind=realtype) :: y1
4042  real(kind=realtype) :: y2
4043  real(kind=realtype) :: y3
4044  real(kind=realtype) :: abs0
4045  real(kind=realtype) :: min1
4046  real(kind=realtype) :: min2
4047  real(kind=realtype) :: min3
4048  real(kind=realtype) :: arg1
4049  if (rfil .ge. 0.) then
4050  abs0 = rfil
4051  else
4052  abs0 = -rfil
4053  end if
4054 ! check if rfil == 0. if so, the dissipative flux needs not to
4055 ! be computed.
4056  if (abs0 .lt. thresholdreal) then
4057  return
4058  else
4059 ! determine the variables used to compute the switch.
4060 ! for the inviscid case this is the pressure; for the viscous
4061 ! case it is the entropy.
4062  select case (equations)
4063  case (eulerequations)
4064 ! inviscid case. pressure switch is based on the pressure.
4065 ! also set the value of sslim. to be fully consistent this
4066 ! must have the dimension of pressure and it is therefore
4067 ! set to a fraction of the free stream value.
4068  sslim = 0.001_realtype*pinfcorr
4069 ! copy the pressure in ss. only need the entries used in the
4070 ! discretization, i.e. not including the corner halo's, but we'll
4071 ! just copy all anyway.
4072  ss = p
4073 !===============================================================
4074  case (nsequations, ransequations)
4075 ! viscous case. pressure switch is based on the entropy.
4076 ! also set the value of sslim. to be fully consistent this
4077 ! must have the dimension of entropy and it is therefore
4078 ! set to a fraction of the free stream value.
4079  sslim = 0.001_realtype*pinfcorr/rhoinf**gammainf
4080 !$ad ii-loop
4081 ! store the entropy in ss. see above.
4082  do ii=0,(ib+1)*(jb+1)*(kb+1)-1
4083  i = mod(ii, ib + 1)
4084  j = mod(ii/(ib+1), jb + 1)
4085  k = ii/((ib+1)*(jb+1))
4086  ss(i, j, k) = p(i, j, k)/w(i, j, k, irho)**gamma(i, j, k)
4087  end do
4088  end select
4089 !$ad ii-loop
4090 ! compute the pressure sensor for each cell, in each direction:
4091  do ii=0,ie*je*ke-1
4092  i = mod(ii, ie) + 1
4093  j = mod(ii/ie, je) + 1
4094  k = ii/(ie*je) + 1
4095  x1 = (ss(i+1, j, k)-two*ss(i, j, k)+ss(i-1, j, k))/(ss(i+1, j, k&
4096 & )+two*ss(i, j, k)+ss(i-1, j, k)+sslim)
4097  if (x1 .ge. 0.) then
4098  dss(i, j, k, 1) = x1
4099  else
4100  dss(i, j, k, 1) = -x1
4101  end if
4102  x2 = (ss(i, j+1, k)-two*ss(i, j, k)+ss(i, j-1, k))/(ss(i, j+1, k&
4103 & )+two*ss(i, j, k)+ss(i, j-1, k)+sslim)
4104  if (x2 .ge. 0.) then
4105  dss(i, j, k, 2) = x2
4106  else
4107  dss(i, j, k, 2) = -x2
4108  end if
4109  x3 = (ss(i, j, k+1)-two*ss(i, j, k)+ss(i, j, k-1))/(ss(i, j, k+1&
4110 & )+two*ss(i, j, k)+ss(i, j, k-1)+sslim)
4111  if (x3 .ge. 0.) then
4112  dss(i, j, k, 3) = x3
4113  else
4114  dss(i, j, k, 3) = -x3
4115  end if
4116  end do
4117 ! set the dissipation constants for the scheme.
4118 ! rfil and sfil are fractions used by the runge-kutta solver to compute residuals at intermediate steps.
4119 ! this means that fis2 and fis4 will be some fraction of vis2 and vis4, respectively.
4120 ! for other solvers, rfil==1, sfil==0, fis2==vis2, and fis4==vis4.
4121 ! the sigmoid function used for dissipation-based continuation is described in eq. 28 and eq. 29 from the paper:
4122 ! "improving the performance of a compressible rans solver for low and high mach number flows" (seraj2022c).
4123 ! the options documentation also has information on the parameters in this formulation.
4124  if (usedisscontinuation) then
4125  if (totalr .eq. zero .or. totalr0 .eq. zero) then
4126  fis2 = rfil*(vis2+disscontmagnitude/(1+exp(-(disscontsharpness&
4127 & *disscontmidpoint))))
4128  else
4129  fis2 = rfil*(vis2+disscontmagnitude/(1+exp(-(disscontsharpness&
4130 & *(log10(totalr/totalr0)+disscontmidpoint)))))
4131  end if
4132  else
4133  fis2 = rfil*vis2
4134  end if
4135  fis4 = rfil*vis4
4136  sfil = one - rfil
4137 ! initialize the dissipative residual to a certain times,
4138 ! possibly zero, the previously stored value. owned cells
4139 ! only, because the halo values do not matter.
4140  fw = sfil*fw
4141 !$ad ii-loop
4142 !
4143 ! dissipative fluxes in the i-direction.
4144 !
4145  do ii=0,il*ny*nz-1
4146  i = mod(ii, il) + 1
4147  j = mod(ii/il, ny) + 2
4148  k = ii/(il*ny) + 2
4149 ! compute the dissipation coefficients for this face.
4150  ppor = zero
4151  if (pori(i, j, k) .eq. normalflux) ppor = half
4152  rrad = ppor*(radi(i, j, k)+radi(i+1, j, k))
4153  if (dss(i, j, k, 1) .lt. dss(i+1, j, k, 1)) then
4154  y1 = dss(i+1, j, k, 1)
4155  else
4156  y1 = dss(i, j, k, 1)
4157  end if
4158  if (dssmax .gt. y1) then
4159  min1 = y1
4160  else
4161  min1 = dssmax
4162  end if
4163  dis2 = fis2*rrad*min1
4164  arg1 = fis4*rrad
4165  dis4 = mydim(arg1, dis2)
4166 ! compute and scatter the dissipative flux.
4167 ! density. store it in the mass flow of the
4168 ! appropriate sliding mesh interface.
4169  ddw1 = w(i+1, j, k, irho) - w(i, j, k, irho)
4170  fs = dis2*ddw1 - dis4*(w(i+2, j, k, irho)-w(i-1, j, k, irho)-&
4171 & three*ddw1)
4172  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
4173  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
4174 ! x-momentum.
4175  ddw2 = w(i+1, j, k, ivx)*w(i+1, j, k, irho) - w(i, j, k, ivx)*w(&
4176 & i, j, k, irho)
4177  fs = dis2*ddw2 - dis4*(w(i+2, j, k, ivx)*w(i+2, j, k, irho)-w(i-&
4178 & 1, j, k, ivx)*w(i-1, j, k, irho)-three*ddw2)
4179  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
4180  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
4181 ! y-momentum.
4182  ddw3 = w(i+1, j, k, ivy)*w(i+1, j, k, irho) - w(i, j, k, ivy)*w(&
4183 & i, j, k, irho)
4184  fs = dis2*ddw3 - dis4*(w(i+2, j, k, ivy)*w(i+2, j, k, irho)-w(i-&
4185 & 1, j, k, ivy)*w(i-1, j, k, irho)-three*ddw3)
4186  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
4187  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
4188 ! z-momentum.
4189  ddw4 = w(i+1, j, k, ivz)*w(i+1, j, k, irho) - w(i, j, k, ivz)*w(&
4190 & i, j, k, irho)
4191  fs = dis2*ddw4 - dis4*(w(i+2, j, k, ivz)*w(i+2, j, k, irho)-w(i-&
4192 & 1, j, k, ivz)*w(i-1, j, k, irho)-three*ddw4)
4193  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
4194  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
4195 ! energy.
4196  ddw5 = w(i+1, j, k, irhoe) + p(i+1, j, k) - (w(i, j, k, irhoe)+p&
4197 & (i, j, k))
4198  fs = dis2*ddw5 - dis4*(w(i+2, j, k, irhoe)+p(i+2, j, k)-(w(i-1, &
4199 & j, k, irhoe)+p(i-1, j, k))-three*ddw5)
4200  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
4201  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
4202  end do
4203 !$ad ii-loop
4204 !
4205 ! dissipative fluxes in the j-direction.
4206 !
4207  do ii=0,nx*jl*nz-1
4208  i = mod(ii, nx) + 2
4209  j = mod(ii/nx, jl) + 1
4210  k = ii/(nx*jl) + 2
4211 ! compute the dissipation coefficients for this face.
4212  ppor = zero
4213  if (porj(i, j, k) .eq. normalflux) ppor = half
4214  rrad = ppor*(radj(i, j, k)+radj(i, j+1, k))
4215  if (dss(i, j, k, 2) .lt. dss(i, j+1, k, 2)) then
4216  y2 = dss(i, j+1, k, 2)
4217  else
4218  y2 = dss(i, j, k, 2)
4219  end if
4220  if (dssmax .gt. y2) then
4221  min2 = y2
4222  else
4223  min2 = dssmax
4224  end if
4225  dis2 = fis2*rrad*min2
4226  arg1 = fis4*rrad
4227  dis4 = mydim(arg1, dis2)
4228 ! compute and scatter the dissipative flux.
4229 ! density. store it in the mass flow of the
4230 ! appropriate sliding mesh interface.
4231  ddw1 = w(i, j+1, k, irho) - w(i, j, k, irho)
4232  fs = dis2*ddw1 - dis4*(w(i, j+2, k, irho)-w(i, j-1, k, irho)-&
4233 & three*ddw1)
4234  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
4235  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
4236 ! x-momentum.
4237  ddw2 = w(i, j+1, k, ivx)*w(i, j+1, k, irho) - w(i, j, k, ivx)*w(&
4238 & i, j, k, irho)
4239  fs = dis2*ddw2 - dis4*(w(i, j+2, k, ivx)*w(i, j+2, k, irho)-w(i&
4240 & , j-1, k, ivx)*w(i, j-1, k, irho)-three*ddw2)
4241  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
4242  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
4243 ! y-momentum.
4244  ddw3 = w(i, j+1, k, ivy)*w(i, j+1, k, irho) - w(i, j, k, ivy)*w(&
4245 & i, j, k, irho)
4246  fs = dis2*ddw3 - dis4*(w(i, j+2, k, ivy)*w(i, j+2, k, irho)-w(i&
4247 & , j-1, k, ivy)*w(i, j-1, k, irho)-three*ddw3)
4248  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
4249  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
4250 ! z-momentum.
4251  ddw4 = w(i, j+1, k, ivz)*w(i, j+1, k, irho) - w(i, j, k, ivz)*w(&
4252 & i, j, k, irho)
4253  fs = dis2*ddw4 - dis4*(w(i, j+2, k, ivz)*w(i, j+2, k, irho)-w(i&
4254 & , j-1, k, ivz)*w(i, j-1, k, irho)-three*ddw4)
4255  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
4256  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
4257 ! energy.
4258  ddw5 = w(i, j+1, k, irhoe) + p(i, j+1, k) - (w(i, j, k, irhoe)+p&
4259 & (i, j, k))
4260  fs = dis2*ddw5 - dis4*(w(i, j+2, k, irhoe)+p(i, j+2, k)-(w(i, j-&
4261 & 1, k, irhoe)+p(i, j-1, k))-three*ddw5)
4262  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
4263  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
4264  end do
4265 !$ad ii-loop
4266 !
4267 ! dissipative fluxes in the k-direction.
4268 !
4269  do ii=0,nx*ny*kl-1
4270  i = mod(ii, nx) + 2
4271  j = mod(ii/nx, ny) + 2
4272  k = ii/(nx*ny) + 1
4273 ! compute the dissipation coefficients for this face.
4274  ppor = zero
4275  if (pork(i, j, k) .eq. normalflux) ppor = half
4276  rrad = ppor*(radk(i, j, k)+radk(i, j, k+1))
4277  if (dss(i, j, k, 3) .lt. dss(i, j, k+1, 3)) then
4278  y3 = dss(i, j, k+1, 3)
4279  else
4280  y3 = dss(i, j, k, 3)
4281  end if
4282  if (dssmax .gt. y3) then
4283  min3 = y3
4284  else
4285  min3 = dssmax
4286  end if
4287  dis2 = fis2*rrad*min3
4288  arg1 = fis4*rrad
4289  dis4 = mydim(arg1, dis2)
4290 ! compute and scatter the dissipative flux.
4291 ! density. store it in the mass flow of the
4292 ! appropriate sliding mesh interface.
4293  ddw1 = w(i, j, k+1, irho) - w(i, j, k, irho)
4294  fs = dis2*ddw1 - dis4*(w(i, j, k+2, irho)-w(i, j, k-1, irho)-&
4295 & three*ddw1)
4296  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) + fs
4297  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
4298 ! x-momentum.
4299  ddw2 = w(i, j, k+1, ivx)*w(i, j, k+1, irho) - w(i, j, k, ivx)*w(&
4300 & i, j, k, irho)
4301  fs = dis2*ddw2 - dis4*(w(i, j, k+2, ivx)*w(i, j, k+2, irho)-w(i&
4302 & , j, k-1, ivx)*w(i, j, k-1, irho)-three*ddw2)
4303  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fs
4304  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
4305 ! y-momentum.
4306  ddw3 = w(i, j, k+1, ivy)*w(i, j, k+1, irho) - w(i, j, k, ivy)*w(&
4307 & i, j, k, irho)
4308  fs = dis2*ddw3 - dis4*(w(i, j, k+2, ivy)*w(i, j, k+2, irho)-w(i&
4309 & , j, k-1, ivy)*w(i, j, k-1, irho)-three*ddw3)
4310  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fs
4311  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
4312 ! z-momentum.
4313  ddw4 = w(i, j, k+1, ivz)*w(i, j, k+1, irho) - w(i, j, k, ivz)*w(&
4314 & i, j, k, irho)
4315  fs = dis2*ddw4 - dis4*(w(i, j, k+2, ivz)*w(i, j, k+2, irho)-w(i&
4316 & , j, k-1, ivz)*w(i, j, k-1, irho)-three*ddw4)
4317  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fs
4318  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
4319 ! energy.
4320  ddw5 = w(i, j, k+1, irhoe) + p(i, j, k+1) - (w(i, j, k, irhoe)+p&
4321 & (i, j, k))
4322  fs = dis2*ddw5 - dis4*(w(i, j, k+2, irhoe)+p(i, j, k+2)-(w(i, j&
4323 & , k-1, irhoe)+p(i, j, k-1))-three*ddw5)
4324  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + fs
4325  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
4326  end do
4327  end if
4328  end subroutine invisciddissfluxscalar
4329 
4330 ! differentiation of inviscidupwindflux in reverse (adjoint) mode (with options noisize i4 dr8 r8):
4331 ! gradient of useful results: *p *w *fw
4332 ! with respect to varying inputs: *p *w *fw
4333 ! rw status of diff variables: *p:incr *w:incr *fw:in-out
4334 ! plus diff mem management of: p:in w:in fw:in
4335  subroutine inviscidupwindflux_fast_b(finegrid)
4336 !
4337 ! inviscidupwindflux computes the artificial dissipation part of
4338 ! the euler fluxes by means of an approximate solution of the 1d
4339 ! riemann problem on the face. for first order schemes,
4340 ! finegrid == .false., the states in the cells are assumed to
4341 ! be constant; for the second order schemes on the fine grid a
4342 ! nonlinear reconstruction of the left and right state is done
4343 ! for which several options exist.
4344 ! it is assumed that the pointers in blockpointers already
4345 ! point to the correct block.
4346 !
4347  use constants
4348  use blockpointers, only : il, jl, kl, ie, je, ke, ib, jb, kb,&
4349 & w, wd, p, pd, pori, porj, pork, fw, fwd, gamma, si, sj, sk, &
4353  use flowvarrefstate, only : kpresent, nw, nwf, rgas, tref
4356  use inputphysics, only : equations
4357  use iteration, only : rfil, currentlevel, groundlevel
4358  use cgnsgrid, only : massflowfamilydiss
4360  use flowutils_fast_b, only : etot, etot_fast_b
4361  implicit none
4362 !
4363 ! subroutine arguments.
4364 !
4365  logical, intent(in) :: finegrid
4366 !
4367 ! local variables.
4368 !
4369  integer(kind=portype) :: por
4370  integer(kind=inttype) :: nwint
4371  integer(kind=inttype) :: i, j, k, ind
4372  integer(kind=inttype) :: limused, riemannused
4373  real(kind=realtype) :: sx, sy, sz, omk, opk, sfil, gammaface
4374  real(kind=realtype) :: factminmod, sface
4375  real(kind=realtype), dimension(nw) :: left, right
4376  real(kind=realtype), dimension(nw) :: leftd, rightd
4377  real(kind=realtype), dimension(nw) :: du1, du2, du3
4378  real(kind=realtype), dimension(nw) :: du1d, du2d, du3d
4379  real(kind=realtype), dimension(nwf) :: flux
4380  real(kind=realtype), dimension(nwf) :: fluxd
4381  logical :: firstorderk, correctfork, rotationalperiodic
4382  intrinsic abs
4383  intrinsic associated
4384  intrinsic max
4385  real(kind=realtype) :: abs0
4386  real(realtype) :: max1
4387  integer :: branch
4388  if (rfil .ge. 0.) then
4389  abs0 = rfil
4390  else
4391  abs0 = -rfil
4392  end if
4393 !
4394 ! check if rfil == 0. if so, the dissipative flux needs not to
4395 ! be computed.
4396  if (abs0 .ge. thresholdreal) then
4397 ! check if the formulation for rotational periodic problems
4398 ! must be used.
4399  if (associated(rotmatrixi)) then
4400  rotationalperiodic = .true.
4401  else
4402  rotationalperiodic = .false.
4403  end if
4404 ! initialize the dissipative residual to a certain times,
4405 ! possibly zero, the previously stored value. owned cells
4406 ! only, because the halo values do not matter.
4407  sfil = one - rfil
4408 ! determine whether or not the total energy must be corrected
4409 ! for the presence of the turbulent kinetic energy.
4410  correctfork = getcorrectfork()
4411  if (1.e-10_realtype .lt. one - kappacoef) then
4412  max1 = one - kappacoef
4413  else
4414  max1 = 1.e-10_realtype
4415  end if
4416 ! compute the factor used in the minmod limiter.
4417  factminmod = (three-kappacoef)/max1
4418 ! determine the limiter scheme to be used. on the fine grid the
4419 ! user specified scheme is used; on the coarse grid a first order
4420 ! scheme is computed.
4421  limused = firstorder
4422  if (finegrid) limused = limiter
4423 ! lumped diss is true for doing approx pc
4424  if (lumpeddiss) limused = firstorder
4425 ! determine the riemann solver which must be used.
4426  riemannused = riemanncoarse
4427  if (finegrid) riemannused = riemann
4428 ! store 1-kappa and 1+kappa a bit easier and multiply it by 0.25.
4429  omk = fourth*(one-kappacoef)
4430  opk = fourth*(one+kappacoef)
4431 ! initialize sface to zero. this value will be used if the
4432 ! block is not moving.
4433  sface = zero
4434 ! set the number of variables to be interpolated depending
4435 ! whether or not a k-equation is present. if a k-equation is
4436 ! present also set the logical firstorderk. this indicates
4437 ! whether or not only a first order approximation is to be used
4438 ! for the turbulent kinetic energy.
4439  if (correctfork) then
4440  if (orderturb .eq. firstorder) then
4441 myintptr = myintptr + 1
4442  myintstack(myintptr) = 0
4443  nwint = nwf
4444  firstorderk = .true.
4445  else
4446 myintptr = myintptr + 1
4447  myintstack(myintptr) = 0
4448  nwint = itu1
4449  firstorderk = .false.
4450  end if
4451  else
4452 myintptr = myintptr + 1
4453  myintstack(myintptr) = 1
4454  nwint = nwf
4455  firstorderk = .false.
4456  end if
4457 !
4458 ! flux computation. a distinction is made between first and
4459 ! second order schemes to avoid the overhead for the first order
4460 ! scheme.
4461 !
4462  if (limused .eq. firstorder) then
4463 !
4464 ! first order reconstruction. the states in the cells are
4465 ! constant. the left and right states are constructed easily.
4466 !
4467 ! fluxes in the i-direction.
4468  do k=2,kl
4469  do j=2,jl
4470  do i=1,il
4471 ! store the normal vector, the porosity and the
4472 ! mesh velocity if present.
4473  sx = si(i, j, k, 1)
4474  sy = si(i, j, k, 2)
4475  sz = si(i, j, k, 3)
4476  if (addgridvelocities) then
4477  sface = sfacei(i, j, k)
4478 myintptr = myintptr + 1
4479  myintstack(myintptr) = 0
4480  else
4481 myintptr = myintptr + 1
4482  myintstack(myintptr) = 1
4483  end if
4484 ! determine the left and right state.
4485  left(irho) = w(i, j, k, irho)
4486  left(ivx) = w(i, j, k, ivx)
4487  left(ivy) = w(i, j, k, ivy)
4488  left(ivz) = w(i, j, k, ivz)
4489  left(irhoe) = p(i, j, k)
4490  if (correctfork) then
4491  left(itu1) = w(i, j, k, itu1)
4492 myintptr = myintptr + 1
4493  myintstack(myintptr) = 0
4494  else
4495 myintptr = myintptr + 1
4496  myintstack(myintptr) = 1
4497  end if
4498  right(irho) = w(i+1, j, k, irho)
4499  right(ivx) = w(i+1, j, k, ivx)
4500  right(ivy) = w(i+1, j, k, ivy)
4501  right(ivz) = w(i+1, j, k, ivz)
4502  right(irhoe) = p(i+1, j, k)
4503  if (correctfork) then
4504  right(itu1) = w(i+1, j, k, itu1)
4505 myintptr = myintptr + 1
4506  myintstack(myintptr) = 0
4507  else
4508 myintptr = myintptr + 1
4509  myintstack(myintptr) = 1
4510  end if
4511  end do
4512  end do
4513  end do
4514 ! fluxes in j-direction.
4515  do k=2,kl
4516  do j=1,jl
4517  do i=2,il
4518 ! store the normal vector, the porosity and the
4519 ! mesh velocity if present.
4520  sx = sj(i, j, k, 1)
4521  sy = sj(i, j, k, 2)
4522  sz = sj(i, j, k, 3)
4523  if (addgridvelocities) then
4524  sface = sfacej(i, j, k)
4525 myintptr = myintptr + 1
4526  myintstack(myintptr) = 0
4527  else
4528 myintptr = myintptr + 1
4529  myintstack(myintptr) = 1
4530  end if
4531 ! determine the left and right state.
4532  left(irho) = w(i, j, k, irho)
4533  left(ivx) = w(i, j, k, ivx)
4534  left(ivy) = w(i, j, k, ivy)
4535  left(ivz) = w(i, j, k, ivz)
4536  left(irhoe) = p(i, j, k)
4537  if (correctfork) then
4538  left(itu1) = w(i, j, k, itu1)
4539 myintptr = myintptr + 1
4540  myintstack(myintptr) = 0
4541  else
4542 myintptr = myintptr + 1
4543  myintstack(myintptr) = 1
4544  end if
4545  right(irho) = w(i, j+1, k, irho)
4546  right(ivx) = w(i, j+1, k, ivx)
4547  right(ivy) = w(i, j+1, k, ivy)
4548  right(ivz) = w(i, j+1, k, ivz)
4549  right(irhoe) = p(i, j+1, k)
4550  if (correctfork) then
4551  right(itu1) = w(i, j+1, k, itu1)
4552 myintptr = myintptr + 1
4553  myintstack(myintptr) = 0
4554  else
4555 myintptr = myintptr + 1
4556  myintstack(myintptr) = 1
4557  end if
4558  end do
4559  end do
4560  end do
4561 ! fluxes in k-direction.
4562  do k=1,kl
4563  do j=2,jl
4564  do i=2,il
4565 ! store the normal vector, the porosity and the
4566 ! mesh velocity if present.
4567  sx = sk(i, j, k, 1)
4568  sy = sk(i, j, k, 2)
4569  sz = sk(i, j, k, 3)
4570  if (addgridvelocities) then
4571  sface = sfacek(i, j, k)
4572 myintptr = myintptr + 1
4573  myintstack(myintptr) = 0
4574  else
4575 myintptr = myintptr + 1
4576  myintstack(myintptr) = 1
4577  end if
4578 ! determine the left and right state.
4579  left(irho) = w(i, j, k, irho)
4580  left(ivx) = w(i, j, k, ivx)
4581  left(ivy) = w(i, j, k, ivy)
4582  left(ivz) = w(i, j, k, ivz)
4583  left(irhoe) = p(i, j, k)
4584  if (correctfork) then
4585  left(itu1) = w(i, j, k, itu1)
4586 myintptr = myintptr + 1
4587  myintstack(myintptr) = 0
4588  else
4589 myintptr = myintptr + 1
4590  myintstack(myintptr) = 1
4591  end if
4592  right(irho) = w(i, j, k+1, irho)
4593  right(ivx) = w(i, j, k+1, ivx)
4594  right(ivy) = w(i, j, k+1, ivy)
4595  right(ivz) = w(i, j, k+1, ivz)
4596  right(irhoe) = p(i, j, k+1)
4597  if (correctfork) then
4598  right(itu1) = w(i, j, k+1, itu1)
4599 myintptr = myintptr + 1
4600  myintstack(myintptr) = 0
4601  else
4602 myintptr = myintptr + 1
4603  myintstack(myintptr) = 1
4604  end if
4605  end do
4606  end do
4607  end do
4608  fluxd = 0.0_8
4609  leftd = 0.0_8
4610  rightd = 0.0_8
4611  do k=kl,1,-1
4612  do j=jl,2,-1
4613  do i=il,2,-1
4614  fluxd(irhoe) = fluxd(irhoe) - fwd(i, j, k+1, irhoe)
4615  fluxd(imz) = fluxd(imz) - fwd(i, j, k+1, imz)
4616  fluxd(imy) = fluxd(imy) - fwd(i, j, k+1, imy)
4617  fluxd(imx) = fluxd(imx) - fwd(i, j, k+1, imx)
4618  fluxd(irho) = fluxd(irho) - fwd(i, j, k+1, irho)
4619  fluxd(irhoe) = fluxd(irhoe) + fwd(i, j, k, irhoe)
4620  fluxd(imz) = fluxd(imz) + fwd(i, j, k, imz)
4621  fluxd(imy) = fluxd(imy) + fwd(i, j, k, imy)
4622  fluxd(imx) = fluxd(imx) + fwd(i, j, k, imx)
4623  fluxd(irho) = fluxd(irho) + fwd(i, j, k, irho)
4624  gammaface = half*(gamma(i, j, k)+gamma(i, j, k+1))
4625  por = pork(i, j, k)
4626  call riemannflux_fast_b(left, leftd, right, rightd, flux, &
4627 & fluxd)
4628 branch = myintstack(myintptr)
4629  myintptr = myintptr - 1
4630  if (branch .eq. 0) then
4631  wd(i, j, k+1, itu1) = wd(i, j, k+1, itu1) + rightd(itu1)
4632  rightd(itu1) = 0.0_8
4633  end if
4634  pd(i, j, k+1) = pd(i, j, k+1) + rightd(irhoe)
4635  rightd(irhoe) = 0.0_8
4636  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + rightd(ivz)
4637  rightd(ivz) = 0.0_8
4638  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + rightd(ivy)
4639  rightd(ivy) = 0.0_8
4640  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + rightd(ivx)
4641  rightd(ivx) = 0.0_8
4642  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + rightd(irho)
4643  rightd(irho) = 0.0_8
4644 branch = myintstack(myintptr)
4645  myintptr = myintptr - 1
4646  if (branch .eq. 0) then
4647  wd(i, j, k, itu1) = wd(i, j, k, itu1) + leftd(itu1)
4648  leftd(itu1) = 0.0_8
4649  end if
4650  pd(i, j, k) = pd(i, j, k) + leftd(irhoe)
4651  leftd(irhoe) = 0.0_8
4652  wd(i, j, k, ivz) = wd(i, j, k, ivz) + leftd(ivz)
4653  leftd(ivz) = 0.0_8
4654  wd(i, j, k, ivy) = wd(i, j, k, ivy) + leftd(ivy)
4655  leftd(ivy) = 0.0_8
4656  wd(i, j, k, ivx) = wd(i, j, k, ivx) + leftd(ivx)
4657  leftd(ivx) = 0.0_8
4658  wd(i, j, k, irho) = wd(i, j, k, irho) + leftd(irho)
4659  leftd(irho) = 0.0_8
4660 branch = myintstack(myintptr)
4661  myintptr = myintptr - 1
4662  if (branch .eq. 0) call popreal8(sface)
4663  end do
4664  end do
4665  end do
4666  do k=kl,2,-1
4667  do j=jl,1,-1
4668  do i=il,2,-1
4669  fluxd(irhoe) = fluxd(irhoe) - fwd(i, j+1, k, irhoe)
4670  fluxd(imz) = fluxd(imz) - fwd(i, j+1, k, imz)
4671  fluxd(imy) = fluxd(imy) - fwd(i, j+1, k, imy)
4672  fluxd(imx) = fluxd(imx) - fwd(i, j+1, k, imx)
4673  fluxd(irho) = fluxd(irho) - fwd(i, j+1, k, irho)
4674  fluxd(irhoe) = fluxd(irhoe) + fwd(i, j, k, irhoe)
4675  fluxd(imz) = fluxd(imz) + fwd(i, j, k, imz)
4676  fluxd(imy) = fluxd(imy) + fwd(i, j, k, imy)
4677  fluxd(imx) = fluxd(imx) + fwd(i, j, k, imx)
4678  fluxd(irho) = fluxd(irho) + fwd(i, j, k, irho)
4679  gammaface = half*(gamma(i, j, k)+gamma(i, j+1, k))
4680  por = porj(i, j, k)
4681  call riemannflux_fast_b(left, leftd, right, rightd, flux, &
4682 & fluxd)
4683 branch = myintstack(myintptr)
4684  myintptr = myintptr - 1
4685  if (branch .eq. 0) then
4686  wd(i, j+1, k, itu1) = wd(i, j+1, k, itu1) + rightd(itu1)
4687  rightd(itu1) = 0.0_8
4688  end if
4689  pd(i, j+1, k) = pd(i, j+1, k) + rightd(irhoe)
4690  rightd(irhoe) = 0.0_8
4691  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + rightd(ivz)
4692  rightd(ivz) = 0.0_8
4693  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + rightd(ivy)
4694  rightd(ivy) = 0.0_8
4695  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + rightd(ivx)
4696  rightd(ivx) = 0.0_8
4697  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + rightd(irho)
4698  rightd(irho) = 0.0_8
4699 branch = myintstack(myintptr)
4700  myintptr = myintptr - 1
4701  if (branch .eq. 0) then
4702  wd(i, j, k, itu1) = wd(i, j, k, itu1) + leftd(itu1)
4703  leftd(itu1) = 0.0_8
4704  end if
4705  pd(i, j, k) = pd(i, j, k) + leftd(irhoe)
4706  leftd(irhoe) = 0.0_8
4707  wd(i, j, k, ivz) = wd(i, j, k, ivz) + leftd(ivz)
4708  leftd(ivz) = 0.0_8
4709  wd(i, j, k, ivy) = wd(i, j, k, ivy) + leftd(ivy)
4710  leftd(ivy) = 0.0_8
4711  wd(i, j, k, ivx) = wd(i, j, k, ivx) + leftd(ivx)
4712  leftd(ivx) = 0.0_8
4713  wd(i, j, k, irho) = wd(i, j, k, irho) + leftd(irho)
4714  leftd(irho) = 0.0_8
4715 branch = myintstack(myintptr)
4716  myintptr = myintptr - 1
4717  if (branch .eq. 0) call popreal8(sface)
4718  end do
4719  end do
4720  end do
4721  do k=kl,2,-1
4722  do j=jl,2,-1
4723  do i=il,1,-1
4724  fluxd(irhoe) = fluxd(irhoe) - fwd(i+1, j, k, irhoe)
4725  fluxd(imz) = fluxd(imz) - fwd(i+1, j, k, imz)
4726  fluxd(imy) = fluxd(imy) - fwd(i+1, j, k, imy)
4727  fluxd(imx) = fluxd(imx) - fwd(i+1, j, k, imx)
4728  fluxd(irho) = fluxd(irho) - fwd(i+1, j, k, irho)
4729  fluxd(irhoe) = fluxd(irhoe) + fwd(i, j, k, irhoe)
4730  fluxd(imz) = fluxd(imz) + fwd(i, j, k, imz)
4731  fluxd(imy) = fluxd(imy) + fwd(i, j, k, imy)
4732  fluxd(imx) = fluxd(imx) + fwd(i, j, k, imx)
4733  fluxd(irho) = fluxd(irho) + fwd(i, j, k, irho)
4734  gammaface = half*(gamma(i, j, k)+gamma(i+1, j, k))
4735  por = pori(i, j, k)
4736  call riemannflux_fast_b(left, leftd, right, rightd, flux, &
4737 & fluxd)
4738 branch = myintstack(myintptr)
4739  myintptr = myintptr - 1
4740  if (branch .eq. 0) then
4741  wd(i+1, j, k, itu1) = wd(i+1, j, k, itu1) + rightd(itu1)
4742  rightd(itu1) = 0.0_8
4743  end if
4744  pd(i+1, j, k) = pd(i+1, j, k) + rightd(irhoe)
4745  rightd(irhoe) = 0.0_8
4746  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + rightd(ivz)
4747  rightd(ivz) = 0.0_8
4748  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + rightd(ivy)
4749  rightd(ivy) = 0.0_8
4750  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + rightd(ivx)
4751  rightd(ivx) = 0.0_8
4752  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + rightd(irho)
4753  rightd(irho) = 0.0_8
4754 branch = myintstack(myintptr)
4755  myintptr = myintptr - 1
4756  if (branch .eq. 0) then
4757  wd(i, j, k, itu1) = wd(i, j, k, itu1) + leftd(itu1)
4758  leftd(itu1) = 0.0_8
4759  end if
4760  pd(i, j, k) = pd(i, j, k) + leftd(irhoe)
4761  leftd(irhoe) = 0.0_8
4762  wd(i, j, k, ivz) = wd(i, j, k, ivz) + leftd(ivz)
4763  leftd(ivz) = 0.0_8
4764  wd(i, j, k, ivy) = wd(i, j, k, ivy) + leftd(ivy)
4765  leftd(ivy) = 0.0_8
4766  wd(i, j, k, ivx) = wd(i, j, k, ivx) + leftd(ivx)
4767  leftd(ivx) = 0.0_8
4768  wd(i, j, k, irho) = wd(i, j, k, irho) + leftd(irho)
4769  leftd(irho) = 0.0_8
4770 branch = myintstack(myintptr)
4771  myintptr = myintptr - 1
4772  if (branch .eq. 0) call popreal8(sface)
4773  end do
4774  end do
4775  end do
4776  else
4777 ! ==================================================================
4778 ! ==================================================================
4779 !
4780 ! second order reconstruction of the left and right state.
4781 ! the three differences used in the, possibly nonlinear,
4782 ! interpolation are constructed here; the actual left and
4783 ! right states, or at least the differences from the first
4784 ! order interpolation, are computed in the subroutine
4785 ! leftrightstate.
4786 !
4787 ! fluxes in the i-direction.
4788  do k=2,kl
4789  do j=2,jl
4790  do i=1,il
4791 ! store the three differences used in the interpolation
4792 ! in du1, du2, du3.
4793  du1(irho) = w(i, j, k, irho) - w(i-1, j, k, irho)
4794  du2(irho) = w(i+1, j, k, irho) - w(i, j, k, irho)
4795  du3(irho) = w(i+2, j, k, irho) - w(i+1, j, k, irho)
4796  du1(ivx) = w(i, j, k, ivx) - w(i-1, j, k, ivx)
4797  du2(ivx) = w(i+1, j, k, ivx) - w(i, j, k, ivx)
4798  du3(ivx) = w(i+2, j, k, ivx) - w(i+1, j, k, ivx)
4799  du1(ivy) = w(i, j, k, ivy) - w(i-1, j, k, ivy)
4800  du2(ivy) = w(i+1, j, k, ivy) - w(i, j, k, ivy)
4801  du3(ivy) = w(i+2, j, k, ivy) - w(i+1, j, k, ivy)
4802  du1(ivz) = w(i, j, k, ivz) - w(i-1, j, k, ivz)
4803  du2(ivz) = w(i+1, j, k, ivz) - w(i, j, k, ivz)
4804  du3(ivz) = w(i+2, j, k, ivz) - w(i+1, j, k, ivz)
4805  du1(irhoe) = p(i, j, k) - p(i-1, j, k)
4806  du2(irhoe) = p(i+1, j, k) - p(i, j, k)
4807  du3(irhoe) = p(i+2, j, k) - p(i+1, j, k)
4808  if (correctfork) then
4809  du1(itu1) = w(i, j, k, itu1) - w(i-1, j, k, itu1)
4810  du2(itu1) = w(i+1, j, k, itu1) - w(i, j, k, itu1)
4811  du3(itu1) = w(i+2, j, k, itu1) - w(i+1, j, k, itu1)
4812 myintptr = myintptr + 1
4813  myintstack(myintptr) = 0
4814  else
4815 myintptr = myintptr + 1
4816  myintstack(myintptr) = 1
4817  end if
4818 ! compute the differences from the first order scheme.
4819  call leftrightstate(du1, du2, du3, rotmatrixi, left, right&
4820 & )
4821 ! add the first order part to the currently stored
4822 ! differences, such that the correct state vector
4823 ! is stored.
4824  left(irho) = left(irho) + w(i, j, k, irho)
4825  left(ivx) = left(ivx) + w(i, j, k, ivx)
4826  left(ivy) = left(ivy) + w(i, j, k, ivy)
4827  left(ivz) = left(ivz) + w(i, j, k, ivz)
4828  left(irhoe) = left(irhoe) + p(i, j, k)
4829  right(irho) = right(irho) + w(i+1, j, k, irho)
4830  right(ivx) = right(ivx) + w(i+1, j, k, ivx)
4831  right(ivy) = right(ivy) + w(i+1, j, k, ivy)
4832  right(ivz) = right(ivz) + w(i+1, j, k, ivz)
4833  right(irhoe) = right(irhoe) + p(i+1, j, k)
4834  if (correctfork) then
4835  left(itu1) = left(itu1) + w(i, j, k, itu1)
4836  right(itu1) = right(itu1) + w(i+1, j, k, itu1)
4837 myintptr = myintptr + 1
4838  myintstack(myintptr) = 0
4839  else
4840 myintptr = myintptr + 1
4841  myintstack(myintptr) = 1
4842  end if
4843 ! store the normal vector, the porosity and the
4844 ! mesh velocity if present.
4845  sx = si(i, j, k, 1)
4846  sy = si(i, j, k, 2)
4847  sz = si(i, j, k, 3)
4848  if (addgridvelocities) then
4849  sface = sfacei(i, j, k)
4850 myintptr = myintptr + 1
4851  myintstack(myintptr) = 0
4852  else
4853 myintptr = myintptr + 1
4854  myintstack(myintptr) = 1
4855  end if
4856  end do
4857  end do
4858  end do
4859 ! fluxes in the j-direction.
4860  do k=2,kl
4861  do j=1,jl
4862  do i=2,il
4863 ! store the three differences used in the interpolation
4864 ! in du1, du2, du3.
4865  du1(irho) = w(i, j, k, irho) - w(i, j-1, k, irho)
4866  du2(irho) = w(i, j+1, k, irho) - w(i, j, k, irho)
4867  du3(irho) = w(i, j+2, k, irho) - w(i, j+1, k, irho)
4868  du1(ivx) = w(i, j, k, ivx) - w(i, j-1, k, ivx)
4869  du2(ivx) = w(i, j+1, k, ivx) - w(i, j, k, ivx)
4870  du3(ivx) = w(i, j+2, k, ivx) - w(i, j+1, k, ivx)
4871  du1(ivy) = w(i, j, k, ivy) - w(i, j-1, k, ivy)
4872  du2(ivy) = w(i, j+1, k, ivy) - w(i, j, k, ivy)
4873  du3(ivy) = w(i, j+2, k, ivy) - w(i, j+1, k, ivy)
4874  du1(ivz) = w(i, j, k, ivz) - w(i, j-1, k, ivz)
4875  du2(ivz) = w(i, j+1, k, ivz) - w(i, j, k, ivz)
4876  du3(ivz) = w(i, j+2, k, ivz) - w(i, j+1, k, ivz)
4877  du1(irhoe) = p(i, j, k) - p(i, j-1, k)
4878  du2(irhoe) = p(i, j+1, k) - p(i, j, k)
4879  du3(irhoe) = p(i, j+2, k) - p(i, j+1, k)
4880  if (correctfork) then
4881  du1(itu1) = w(i, j, k, itu1) - w(i, j-1, k, itu1)
4882  du2(itu1) = w(i, j+1, k, itu1) - w(i, j, k, itu1)
4883  du3(itu1) = w(i, j+2, k, itu1) - w(i, j+1, k, itu1)
4884 myintptr = myintptr + 1
4885  myintstack(myintptr) = 0
4886  else
4887 myintptr = myintptr + 1
4888  myintstack(myintptr) = 1
4889  end if
4890 ! compute the differences from the first order scheme.
4891  call leftrightstate(du1, du2, du3, rotmatrixj, left, right&
4892 & )
4893 ! add the first order part to the currently stored
4894 ! differences, such that the correct state vector
4895 ! is stored.
4896  left(irho) = left(irho) + w(i, j, k, irho)
4897  left(ivx) = left(ivx) + w(i, j, k, ivx)
4898  left(ivy) = left(ivy) + w(i, j, k, ivy)
4899  left(ivz) = left(ivz) + w(i, j, k, ivz)
4900  left(irhoe) = left(irhoe) + p(i, j, k)
4901  right(irho) = right(irho) + w(i, j+1, k, irho)
4902  right(ivx) = right(ivx) + w(i, j+1, k, ivx)
4903  right(ivy) = right(ivy) + w(i, j+1, k, ivy)
4904  right(ivz) = right(ivz) + w(i, j+1, k, ivz)
4905  right(irhoe) = right(irhoe) + p(i, j+1, k)
4906  if (correctfork) then
4907  left(itu1) = left(itu1) + w(i, j, k, itu1)
4908  right(itu1) = right(itu1) + w(i, j+1, k, itu1)
4909 myintptr = myintptr + 1
4910  myintstack(myintptr) = 0
4911  else
4912 myintptr = myintptr + 1
4913  myintstack(myintptr) = 1
4914  end if
4915 ! store the normal vector, the porosity and the
4916 ! mesh velocity if present.
4917  sx = sj(i, j, k, 1)
4918  sy = sj(i, j, k, 2)
4919  sz = sj(i, j, k, 3)
4920  if (addgridvelocities) then
4921  sface = sfacej(i, j, k)
4922 myintptr = myintptr + 1
4923  myintstack(myintptr) = 0
4924  else
4925 myintptr = myintptr + 1
4926  myintstack(myintptr) = 1
4927  end if
4928  end do
4929  end do
4930  end do
4931 ! fluxes in the k-direction.
4932  do k=1,kl
4933  do j=2,jl
4934  do i=2,il
4935 ! store the three differences used in the interpolation
4936 ! in du1, du2, du3.
4937  du1(irho) = w(i, j, k, irho) - w(i, j, k-1, irho)
4938  du2(irho) = w(i, j, k+1, irho) - w(i, j, k, irho)
4939  du3(irho) = w(i, j, k+2, irho) - w(i, j, k+1, irho)
4940  du1(ivx) = w(i, j, k, ivx) - w(i, j, k-1, ivx)
4941  du2(ivx) = w(i, j, k+1, ivx) - w(i, j, k, ivx)
4942  du3(ivx) = w(i, j, k+2, ivx) - w(i, j, k+1, ivx)
4943  du1(ivy) = w(i, j, k, ivy) - w(i, j, k-1, ivy)
4944  du2(ivy) = w(i, j, k+1, ivy) - w(i, j, k, ivy)
4945  du3(ivy) = w(i, j, k+2, ivy) - w(i, j, k+1, ivy)
4946  du1(ivz) = w(i, j, k, ivz) - w(i, j, k-1, ivz)
4947  du2(ivz) = w(i, j, k+1, ivz) - w(i, j, k, ivz)
4948  du3(ivz) = w(i, j, k+2, ivz) - w(i, j, k+1, ivz)
4949  du1(irhoe) = p(i, j, k) - p(i, j, k-1)
4950  du2(irhoe) = p(i, j, k+1) - p(i, j, k)
4951  du3(irhoe) = p(i, j, k+2) - p(i, j, k+1)
4952  if (correctfork) then
4953  du1(itu1) = w(i, j, k, itu1) - w(i, j, k-1, itu1)
4954  du2(itu1) = w(i, j, k+1, itu1) - w(i, j, k, itu1)
4955  du3(itu1) = w(i, j, k+2, itu1) - w(i, j, k+1, itu1)
4956 myintptr = myintptr + 1
4957  myintstack(myintptr) = 0
4958  else
4959 myintptr = myintptr + 1
4960  myintstack(myintptr) = 1
4961  end if
4962 ! compute the differences from the first order scheme.
4963  call leftrightstate(du1, du2, du3, rotmatrixk, left, right&
4964 & )
4965 ! add the first order part to the currently stored
4966 ! differences, such that the correct state vector
4967 ! is stored.
4968  left(irho) = left(irho) + w(i, j, k, irho)
4969  left(ivx) = left(ivx) + w(i, j, k, ivx)
4970  left(ivy) = left(ivy) + w(i, j, k, ivy)
4971  left(ivz) = left(ivz) + w(i, j, k, ivz)
4972  left(irhoe) = left(irhoe) + p(i, j, k)
4973  right(irho) = right(irho) + w(i, j, k+1, irho)
4974  right(ivx) = right(ivx) + w(i, j, k+1, ivx)
4975  right(ivy) = right(ivy) + w(i, j, k+1, ivy)
4976  right(ivz) = right(ivz) + w(i, j, k+1, ivz)
4977  right(irhoe) = right(irhoe) + p(i, j, k+1)
4978  if (correctfork) then
4979  left(itu1) = left(itu1) + w(i, j, k, itu1)
4980  right(itu1) = right(itu1) + w(i, j, k+1, itu1)
4981 myintptr = myintptr + 1
4982  myintstack(myintptr) = 0
4983  else
4984 myintptr = myintptr + 1
4985  myintstack(myintptr) = 1
4986  end if
4987 ! store the normal vector, the porosity and the
4988 ! mesh velocity if present.
4989  sx = sk(i, j, k, 1)
4990  sy = sk(i, j, k, 2)
4991  sz = sk(i, j, k, 3)
4992  if (addgridvelocities) then
4993  sface = sfacek(i, j, k)
4994 myintptr = myintptr + 1
4995  myintstack(myintptr) = 0
4996  else
4997 myintptr = myintptr + 1
4998  myintstack(myintptr) = 1
4999  end if
5000  end do
5001  end do
5002  end do
5003  fluxd = 0.0_8
5004  leftd = 0.0_8
5005  rightd = 0.0_8
5006  du1d = 0.0_8
5007  du2d = 0.0_8
5008  du3d = 0.0_8
5009  do k=kl,1,-1
5010  do j=jl,2,-1
5011  do i=il,2,-1
5012  fluxd(irhoe) = fluxd(irhoe) - fwd(i, j, k+1, irhoe)
5013  fluxd(imz) = fluxd(imz) - fwd(i, j, k+1, imz)
5014  fluxd(imy) = fluxd(imy) - fwd(i, j, k+1, imy)
5015  fluxd(imx) = fluxd(imx) - fwd(i, j, k+1, imx)
5016  fluxd(irho) = fluxd(irho) - fwd(i, j, k+1, irho)
5017  fluxd(irhoe) = fluxd(irhoe) + fwd(i, j, k, irhoe)
5018  fluxd(imz) = fluxd(imz) + fwd(i, j, k, imz)
5019  fluxd(imy) = fluxd(imy) + fwd(i, j, k, imy)
5020  fluxd(imx) = fluxd(imx) + fwd(i, j, k, imx)
5021  fluxd(irho) = fluxd(irho) + fwd(i, j, k, irho)
5022  gammaface = half*(gamma(i, j, k)+gamma(i, j, k+1))
5023  por = pork(i, j, k)
5024  call riemannflux_fast_b(left, leftd, right, rightd, flux, &
5025 & fluxd)
5026 branch = myintstack(myintptr)
5027  myintptr = myintptr - 1
5028  if (branch .eq. 0) call popreal8(sface)
5029 branch = myintstack(myintptr)
5030  myintptr = myintptr - 1
5031  if (branch .eq. 0) then
5032  wd(i, j, k+1, itu1) = wd(i, j, k+1, itu1) + rightd(itu1)
5033  wd(i, j, k, itu1) = wd(i, j, k, itu1) + leftd(itu1)
5034  end if
5035  pd(i, j, k+1) = pd(i, j, k+1) + rightd(irhoe)
5036  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + rightd(ivz)
5037  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + rightd(ivy)
5038  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + rightd(ivx)
5039  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + rightd(irho)
5040  pd(i, j, k) = pd(i, j, k) + leftd(irhoe)
5041  wd(i, j, k, ivz) = wd(i, j, k, ivz) + leftd(ivz)
5042  wd(i, j, k, ivy) = wd(i, j, k, ivy) + leftd(ivy)
5043  wd(i, j, k, ivx) = wd(i, j, k, ivx) + leftd(ivx)
5044  wd(i, j, k, irho) = wd(i, j, k, irho) + leftd(irho)
5045  call leftrightstate_fast_b(du1, du1d, du2, du2d, du3, du3d&
5046 & , rotmatrixk, left, leftd, right, &
5047 & rightd)
5048 branch = myintstack(myintptr)
5049  myintptr = myintptr - 1
5050  if (branch .eq. 0) then
5051  wd(i, j, k+2, itu1) = wd(i, j, k+2, itu1) + du3d(itu1)
5052  wd(i, j, k+1, itu1) = wd(i, j, k+1, itu1) + du2d(itu1) -&
5053 & du3d(itu1)
5054  du3d(itu1) = 0.0_8
5055  wd(i, j, k, itu1) = wd(i, j, k, itu1) + du1d(itu1) - &
5056 & du2d(itu1)
5057  du2d(itu1) = 0.0_8
5058  wd(i, j, k-1, itu1) = wd(i, j, k-1, itu1) - du1d(itu1)
5059  du1d(itu1) = 0.0_8
5060  end if
5061  pd(i, j, k+2) = pd(i, j, k+2) + du3d(irhoe)
5062  pd(i, j, k+1) = pd(i, j, k+1) + du2d(irhoe) - du3d(irhoe)
5063  du3d(irhoe) = 0.0_8
5064  pd(i, j, k) = pd(i, j, k) + du1d(irhoe) - du2d(irhoe)
5065  du2d(irhoe) = 0.0_8
5066  pd(i, j, k-1) = pd(i, j, k-1) - du1d(irhoe)
5067  du1d(irhoe) = 0.0_8
5068  wd(i, j, k+2, ivz) = wd(i, j, k+2, ivz) + du3d(ivz)
5069  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + du2d(ivz) - du3d&
5070 & (ivz)
5071  du3d(ivz) = 0.0_8
5072  wd(i, j, k, ivz) = wd(i, j, k, ivz) + du1d(ivz) - du2d(ivz&
5073 & )
5074  du2d(ivz) = 0.0_8
5075  wd(i, j, k-1, ivz) = wd(i, j, k-1, ivz) - du1d(ivz)
5076  du1d(ivz) = 0.0_8
5077  wd(i, j, k+2, ivy) = wd(i, j, k+2, ivy) + du3d(ivy)
5078  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + du2d(ivy) - du3d&
5079 & (ivy)
5080  du3d(ivy) = 0.0_8
5081  wd(i, j, k, ivy) = wd(i, j, k, ivy) + du1d(ivy) - du2d(ivy&
5082 & )
5083  du2d(ivy) = 0.0_8
5084  wd(i, j, k-1, ivy) = wd(i, j, k-1, ivy) - du1d(ivy)
5085  du1d(ivy) = 0.0_8
5086  wd(i, j, k+2, ivx) = wd(i, j, k+2, ivx) + du3d(ivx)
5087  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + du2d(ivx) - du3d&
5088 & (ivx)
5089  du3d(ivx) = 0.0_8
5090  wd(i, j, k, ivx) = wd(i, j, k, ivx) + du1d(ivx) - du2d(ivx&
5091 & )
5092  du2d(ivx) = 0.0_8
5093  wd(i, j, k-1, ivx) = wd(i, j, k-1, ivx) - du1d(ivx)
5094  du1d(ivx) = 0.0_8
5095  wd(i, j, k+2, irho) = wd(i, j, k+2, irho) + du3d(irho)
5096  wd(i, j, k+1, irho) = wd(i, j, k+1, irho) + du2d(irho) - &
5097 & du3d(irho)
5098  du3d(irho) = 0.0_8
5099  wd(i, j, k, irho) = wd(i, j, k, irho) + du1d(irho) - du2d(&
5100 & irho)
5101  du2d(irho) = 0.0_8
5102  wd(i, j, k-1, irho) = wd(i, j, k-1, irho) - du1d(irho)
5103  du1d(irho) = 0.0_8
5104  end do
5105  end do
5106  end do
5107  do k=kl,2,-1
5108  do j=jl,1,-1
5109  do i=il,2,-1
5110  fluxd(irhoe) = fluxd(irhoe) - fwd(i, j+1, k, irhoe)
5111  fluxd(imz) = fluxd(imz) - fwd(i, j+1, k, imz)
5112  fluxd(imy) = fluxd(imy) - fwd(i, j+1, k, imy)
5113  fluxd(imx) = fluxd(imx) - fwd(i, j+1, k, imx)
5114  fluxd(irho) = fluxd(irho) - fwd(i, j+1, k, irho)
5115  fluxd(irhoe) = fluxd(irhoe) + fwd(i, j, k, irhoe)
5116  fluxd(imz) = fluxd(imz) + fwd(i, j, k, imz)
5117  fluxd(imy) = fluxd(imy) + fwd(i, j, k, imy)
5118  fluxd(imx) = fluxd(imx) + fwd(i, j, k, imx)
5119  fluxd(irho) = fluxd(irho) + fwd(i, j, k, irho)
5120  gammaface = half*(gamma(i, j, k)+gamma(i, j+1, k))
5121  por = porj(i, j, k)
5122  call riemannflux_fast_b(left, leftd, right, rightd, flux, &
5123 & fluxd)
5124 branch = myintstack(myintptr)
5125  myintptr = myintptr - 1
5126  if (branch .eq. 0) call popreal8(sface)
5127 branch = myintstack(myintptr)
5128  myintptr = myintptr - 1
5129  if (branch .eq. 0) then
5130  wd(i, j+1, k, itu1) = wd(i, j+1, k, itu1) + rightd(itu1)
5131  wd(i, j, k, itu1) = wd(i, j, k, itu1) + leftd(itu1)
5132  end if
5133  pd(i, j+1, k) = pd(i, j+1, k) + rightd(irhoe)
5134  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + rightd(ivz)
5135  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + rightd(ivy)
5136  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + rightd(ivx)
5137  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + rightd(irho)
5138  pd(i, j, k) = pd(i, j, k) + leftd(irhoe)
5139  wd(i, j, k, ivz) = wd(i, j, k, ivz) + leftd(ivz)
5140  wd(i, j, k, ivy) = wd(i, j, k, ivy) + leftd(ivy)
5141  wd(i, j, k, ivx) = wd(i, j, k, ivx) + leftd(ivx)
5142  wd(i, j, k, irho) = wd(i, j, k, irho) + leftd(irho)
5143  call leftrightstate_fast_b(du1, du1d, du2, du2d, du3, du3d&
5144 & , rotmatrixj, left, leftd, right, &
5145 & rightd)
5146 branch = myintstack(myintptr)
5147  myintptr = myintptr - 1
5148  if (branch .eq. 0) then
5149  wd(i, j+2, k, itu1) = wd(i, j+2, k, itu1) + du3d(itu1)
5150  wd(i, j+1, k, itu1) = wd(i, j+1, k, itu1) + du2d(itu1) -&
5151 & du3d(itu1)
5152  du3d(itu1) = 0.0_8
5153  wd(i, j, k, itu1) = wd(i, j, k, itu1) + du1d(itu1) - &
5154 & du2d(itu1)
5155  du2d(itu1) = 0.0_8
5156  wd(i, j-1, k, itu1) = wd(i, j-1, k, itu1) - du1d(itu1)
5157  du1d(itu1) = 0.0_8
5158  end if
5159  pd(i, j+2, k) = pd(i, j+2, k) + du3d(irhoe)
5160  pd(i, j+1, k) = pd(i, j+1, k) + du2d(irhoe) - du3d(irhoe)
5161  du3d(irhoe) = 0.0_8
5162  pd(i, j, k) = pd(i, j, k) + du1d(irhoe) - du2d(irhoe)
5163  du2d(irhoe) = 0.0_8
5164  pd(i, j-1, k) = pd(i, j-1, k) - du1d(irhoe)
5165  du1d(irhoe) = 0.0_8
5166  wd(i, j+2, k, ivz) = wd(i, j+2, k, ivz) + du3d(ivz)
5167  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + du2d(ivz) - du3d&
5168 & (ivz)
5169  du3d(ivz) = 0.0_8
5170  wd(i, j, k, ivz) = wd(i, j, k, ivz) + du1d(ivz) - du2d(ivz&
5171 & )
5172  du2d(ivz) = 0.0_8
5173  wd(i, j-1, k, ivz) = wd(i, j-1, k, ivz) - du1d(ivz)
5174  du1d(ivz) = 0.0_8
5175  wd(i, j+2, k, ivy) = wd(i, j+2, k, ivy) + du3d(ivy)
5176  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + du2d(ivy) - du3d&
5177 & (ivy)
5178  du3d(ivy) = 0.0_8
5179  wd(i, j, k, ivy) = wd(i, j, k, ivy) + du1d(ivy) - du2d(ivy&
5180 & )
5181  du2d(ivy) = 0.0_8
5182  wd(i, j-1, k, ivy) = wd(i, j-1, k, ivy) - du1d(ivy)
5183  du1d(ivy) = 0.0_8
5184  wd(i, j+2, k, ivx) = wd(i, j+2, k, ivx) + du3d(ivx)
5185  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + du2d(ivx) - du3d&
5186 & (ivx)
5187  du3d(ivx) = 0.0_8
5188  wd(i, j, k, ivx) = wd(i, j, k, ivx) + du1d(ivx) - du2d(ivx&
5189 & )
5190  du2d(ivx) = 0.0_8
5191  wd(i, j-1, k, ivx) = wd(i, j-1, k, ivx) - du1d(ivx)
5192  du1d(ivx) = 0.0_8
5193  wd(i, j+2, k, irho) = wd(i, j+2, k, irho) + du3d(irho)
5194  wd(i, j+1, k, irho) = wd(i, j+1, k, irho) + du2d(irho) - &
5195 & du3d(irho)
5196  du3d(irho) = 0.0_8
5197  wd(i, j, k, irho) = wd(i, j, k, irho) + du1d(irho) - du2d(&
5198 & irho)
5199  du2d(irho) = 0.0_8
5200  wd(i, j-1, k, irho) = wd(i, j-1, k, irho) - du1d(irho)
5201  du1d(irho) = 0.0_8
5202  end do
5203  end do
5204  end do
5205  do k=kl,2,-1
5206  do j=jl,2,-1
5207  do i=il,1,-1
5208  fluxd(irhoe) = fluxd(irhoe) - fwd(i+1, j, k, irhoe)
5209  fluxd(imz) = fluxd(imz) - fwd(i+1, j, k, imz)
5210  fluxd(imy) = fluxd(imy) - fwd(i+1, j, k, imy)
5211  fluxd(imx) = fluxd(imx) - fwd(i+1, j, k, imx)
5212  fluxd(irho) = fluxd(irho) - fwd(i+1, j, k, irho)
5213  fluxd(irhoe) = fluxd(irhoe) + fwd(i, j, k, irhoe)
5214  fluxd(imz) = fluxd(imz) + fwd(i, j, k, imz)
5215  fluxd(imy) = fluxd(imy) + fwd(i, j, k, imy)
5216  fluxd(imx) = fluxd(imx) + fwd(i, j, k, imx)
5217  fluxd(irho) = fluxd(irho) + fwd(i, j, k, irho)
5218  gammaface = half*(gamma(i, j, k)+gamma(i+1, j, k))
5219  por = pori(i, j, k)
5220  call riemannflux_fast_b(left, leftd, right, rightd, flux, &
5221 & fluxd)
5222 branch = myintstack(myintptr)
5223  myintptr = myintptr - 1
5224  if (branch .eq. 0) call popreal8(sface)
5225 branch = myintstack(myintptr)
5226  myintptr = myintptr - 1
5227  if (branch .eq. 0) then
5228  wd(i+1, j, k, itu1) = wd(i+1, j, k, itu1) + rightd(itu1)
5229  wd(i, j, k, itu1) = wd(i, j, k, itu1) + leftd(itu1)
5230  end if
5231  pd(i+1, j, k) = pd(i+1, j, k) + rightd(irhoe)
5232  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + rightd(ivz)
5233  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + rightd(ivy)
5234  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + rightd(ivx)
5235  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + rightd(irho)
5236  pd(i, j, k) = pd(i, j, k) + leftd(irhoe)
5237  wd(i, j, k, ivz) = wd(i, j, k, ivz) + leftd(ivz)
5238  wd(i, j, k, ivy) = wd(i, j, k, ivy) + leftd(ivy)
5239  wd(i, j, k, ivx) = wd(i, j, k, ivx) + leftd(ivx)
5240  wd(i, j, k, irho) = wd(i, j, k, irho) + leftd(irho)
5241  call leftrightstate_fast_b(du1, du1d, du2, du2d, du3, du3d&
5242 & , rotmatrixi, left, leftd, right, &
5243 & rightd)
5244 branch = myintstack(myintptr)
5245  myintptr = myintptr - 1
5246  if (branch .eq. 0) then
5247  wd(i+2, j, k, itu1) = wd(i+2, j, k, itu1) + du3d(itu1)
5248  wd(i+1, j, k, itu1) = wd(i+1, j, k, itu1) + du2d(itu1) -&
5249 & du3d(itu1)
5250  du3d(itu1) = 0.0_8
5251  wd(i, j, k, itu1) = wd(i, j, k, itu1) + du1d(itu1) - &
5252 & du2d(itu1)
5253  du2d(itu1) = 0.0_8
5254  wd(i-1, j, k, itu1) = wd(i-1, j, k, itu1) - du1d(itu1)
5255  du1d(itu1) = 0.0_8
5256  end if
5257  pd(i+2, j, k) = pd(i+2, j, k) + du3d(irhoe)
5258  pd(i+1, j, k) = pd(i+1, j, k) + du2d(irhoe) - du3d(irhoe)
5259  du3d(irhoe) = 0.0_8
5260  pd(i, j, k) = pd(i, j, k) + du1d(irhoe) - du2d(irhoe)
5261  du2d(irhoe) = 0.0_8
5262  pd(i-1, j, k) = pd(i-1, j, k) - du1d(irhoe)
5263  du1d(irhoe) = 0.0_8
5264  wd(i+2, j, k, ivz) = wd(i+2, j, k, ivz) + du3d(ivz)
5265  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + du2d(ivz) - du3d&
5266 & (ivz)
5267  du3d(ivz) = 0.0_8
5268  wd(i, j, k, ivz) = wd(i, j, k, ivz) + du1d(ivz) - du2d(ivz&
5269 & )
5270  du2d(ivz) = 0.0_8
5271  wd(i-1, j, k, ivz) = wd(i-1, j, k, ivz) - du1d(ivz)
5272  du1d(ivz) = 0.0_8
5273  wd(i+2, j, k, ivy) = wd(i+2, j, k, ivy) + du3d(ivy)
5274  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + du2d(ivy) - du3d&
5275 & (ivy)
5276  du3d(ivy) = 0.0_8
5277  wd(i, j, k, ivy) = wd(i, j, k, ivy) + du1d(ivy) - du2d(ivy&
5278 & )
5279  du2d(ivy) = 0.0_8
5280  wd(i-1, j, k, ivy) = wd(i-1, j, k, ivy) - du1d(ivy)
5281  du1d(ivy) = 0.0_8
5282  wd(i+2, j, k, ivx) = wd(i+2, j, k, ivx) + du3d(ivx)
5283  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + du2d(ivx) - du3d&
5284 & (ivx)
5285  du3d(ivx) = 0.0_8
5286  wd(i, j, k, ivx) = wd(i, j, k, ivx) + du1d(ivx) - du2d(ivx&
5287 & )
5288  du2d(ivx) = 0.0_8
5289  wd(i-1, j, k, ivx) = wd(i-1, j, k, ivx) - du1d(ivx)
5290  du1d(ivx) = 0.0_8
5291  wd(i+2, j, k, irho) = wd(i+2, j, k, irho) + du3d(irho)
5292  wd(i+1, j, k, irho) = wd(i+1, j, k, irho) + du2d(irho) - &
5293 & du3d(irho)
5294  du3d(irho) = 0.0_8
5295  wd(i, j, k, irho) = wd(i, j, k, irho) + du1d(irho) - du2d(&
5296 & irho)
5297  du2d(irho) = 0.0_8
5298  wd(i-1, j, k, irho) = wd(i-1, j, k, irho) - du1d(irho)
5299  du1d(irho) = 0.0_8
5300  end do
5301  end do
5302  end do
5303  end if
5304 branch = myintstack(myintptr)
5305  myintptr = myintptr - 1
5306  do k=kl,2,-1
5307  do j=jl,2,-1
5308  do i=il,2,-1
5309  fwd(i, j, k, irhoe) = sfil*fwd(i, j, k, irhoe)
5310  fwd(i, j, k, imz) = sfil*fwd(i, j, k, imz)
5311  fwd(i, j, k, imy) = sfil*fwd(i, j, k, imy)
5312  fwd(i, j, k, imx) = sfil*fwd(i, j, k, imx)
5313  fwd(i, j, k, irho) = sfil*fwd(i, j, k, irho)
5314  end do
5315  end do
5316  end do
5317  end if
5318 
5319  contains
5320 ! differentiation of leftrightstate in reverse (adjoint) mode (with options noisize i4 dr8 r8):
5321 ! gradient of useful results: left right du1 du2 du3
5322 ! with respect to varying inputs: left right du1 du2 du3
5323 ! ==================================================================
5324  subroutine leftrightstate_fast_b(du1, du1d, du2, du2d, du3, du3d, &
5325 & rotmatrix, left, leftd, right, rightd)
5326  implicit none
5327 !
5328 ! local parameter.
5329 !
5330  real(kind=realtype), parameter :: epslim=1.e-10_realtype
5331 !
5332 ! subroutine arguments.
5333 !
5334  real(kind=realtype), dimension(:), intent(inout) :: du1, du2, du3
5335  real(kind=realtype), dimension(:), intent(inout) :: du1d, du2d, &
5336 & du3d
5337  real(kind=realtype), dimension(:) :: left, right
5338  real(kind=realtype), dimension(:) :: leftd, rightd
5339  real(kind=realtype), dimension(:, :, :, :, :), pointer :: &
5340 & rotmatrix
5341 !
5342 ! local variables.
5343 !
5344  integer(kind=inttype) :: l
5345  real(kind=realtype) :: rl1, rl2, rr1, rr2, tmp, dvx, dvy, dvz
5346  real(kind=realtype) :: rl1d, rl2d, rr1d, rr2d, tmpd, dvxd, dvyd, &
5347 & dvzd
5348  real(kind=realtype), dimension(3, 3) :: rot
5349  intrinsic abs
5350  intrinsic max
5351  intrinsic sign
5352  intrinsic min
5353  real(kind=realtype) :: x1
5354  real(kind=realtype) :: x1d
5355  real(kind=realtype) :: y1
5356  real(kind=realtype) :: y1d
5357  real(kind=realtype) :: y2
5358  real(kind=realtype) :: y2d
5359  real(kind=realtype) :: x2
5360  real(kind=realtype) :: x2d
5361  real(kind=realtype) :: y3
5362  real(kind=realtype) :: y3d
5363  real(kind=realtype) :: y4
5364  real(kind=realtype) :: y4d
5365  real(kind=realtype) :: x3
5366  real(kind=realtype) :: x3d
5367  real(kind=realtype) :: x4
5368  real(kind=realtype) :: x4d
5369  real(kind=realtype) :: x5
5370  real(kind=realtype) :: x5d
5371  real(kind=realtype) :: x6
5372  real(kind=realtype) :: x6d
5373  real(kind=realtype) :: max2
5374  real(kind=realtype) :: max2d
5375  real(kind=realtype) :: max3
5376  real(kind=realtype) :: max3d
5377  real(kind=realtype) :: max4
5378  real(kind=realtype) :: max4d
5379  real(kind=realtype) :: max5
5380  real(kind=realtype) :: max5d
5381  real(kind=realtype) :: max6
5382  real(kind=realtype) :: max6d
5383  real(kind=realtype) :: max7
5384  real(kind=realtype) :: max7d
5385  real(kind=realtype) :: temp
5386  real(kind=realtype) :: tempd
5387  integer :: branch
5388 ! check if the velocity components should be transformed to
5389 ! the cylindrical frame.
5390  if (rotationalperiodic) then
5391 ! store the rotation matrix a bit easier. note that the i,j,k
5392 ! come from the main subroutine.
5393  rot(1, 1) = rotmatrix(i, j, k, 1, 1)
5394  rot(1, 2) = rotmatrix(i, j, k, 1, 2)
5395  rot(1, 3) = rotmatrix(i, j, k, 1, 3)
5396  rot(2, 1) = rotmatrix(i, j, k, 2, 1)
5397  rot(2, 2) = rotmatrix(i, j, k, 2, 2)
5398  rot(2, 3) = rotmatrix(i, j, k, 2, 3)
5399  rot(3, 1) = rotmatrix(i, j, k, 3, 1)
5400  rot(3, 2) = rotmatrix(i, j, k, 3, 2)
5401  rot(3, 3) = rotmatrix(i, j, k, 3, 3)
5402 ! apply the transformation to the velocity components
5403 ! of du1, du2 and du3.
5404  dvx = du1(ivx)
5405  dvy = du1(ivy)
5406  dvz = du1(ivz)
5407  du1(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
5408  du1(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
5409  du1(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
5410  dvx = du2(ivx)
5411  dvy = du2(ivy)
5412  dvz = du2(ivz)
5413  du2(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
5414  du2(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
5415  du2(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
5416  dvx = du3(ivx)
5417  dvy = du3(ivy)
5418  dvz = du3(ivz)
5419  du3(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
5420  du3(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
5421  du3(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
5422 myintptr = myintptr + 1
5423  myintstack(myintptr) = 0
5424  else
5425 myintptr = myintptr + 1
5426  myintstack(myintptr) = 1
5427  end if
5428 ! determine the limiter used.
5429  select case (limused)
5430  case (nolimiter)
5431  call pushcontrol2b(1)
5432  case (vanalbeda)
5433 ! ==============================================================
5434 ! nonlinear interpolation using the van albeda limiter.
5435 ! loop over the number of variables to be interpolated.
5436  do l=1,nwint
5437  if (du2(l) .ge. 0.) then
5438  x1 = du2(l)
5439 myintptr = myintptr + 1
5440  myintstack(myintptr) = 0
5441  else
5442  x1 = -du2(l)
5443 myintptr = myintptr + 1
5444  myintstack(myintptr) = 1
5445  end if
5446  if (x1 .lt. epslim) then
5447  max2 = epslim
5448 myintptr = myintptr + 1
5449  myintstack(myintptr) = 0
5450  else
5451  max2 = x1
5452 myintptr = myintptr + 1
5453  myintstack(myintptr) = 1
5454  end if
5455 ! compute the limiter argument rl1, rl2, rr1 and rr2.
5456 ! note the cut off to 0.0.
5457  tmp = one/sign(max2, du2(l))
5458  if (du1(l) .ge. 0.) then
5459  x3 = du1(l)
5460 myintptr = myintptr + 1
5461  myintstack(myintptr) = 0
5462  else
5463  x3 = -du1(l)
5464 myintptr = myintptr + 1
5465  myintstack(myintptr) = 1
5466  end if
5467  if (x3 .lt. epslim) then
5468  max4 = epslim
5469 myintptr = myintptr + 1
5470  myintstack(myintptr) = 0
5471  else
5472  max4 = x3
5473 myintptr = myintptr + 1
5474  myintstack(myintptr) = 1
5475  end if
5476  y1 = du2(l)/sign(max4, du1(l))
5477  if (zero .lt. y1) then
5478  rl1 = y1
5479 myintptr = myintptr + 1
5480  myintstack(myintptr) = 0
5481  else
5482  rl1 = zero
5483 myintptr = myintptr + 1
5484  myintstack(myintptr) = 1
5485  end if
5486  if (zero .lt. du1(l)*tmp) then
5487  rl2 = du1(l)*tmp
5488 myintptr = myintptr + 1
5489  myintstack(myintptr) = 0
5490  else
5491  rl2 = zero
5492 myintptr = myintptr + 1
5493  myintstack(myintptr) = 1
5494  end if
5495  if (zero .lt. du3(l)*tmp) then
5496  rr1 = du3(l)*tmp
5497 myintptr = myintptr + 1
5498  myintstack(myintptr) = 0
5499  else
5500  rr1 = zero
5501 myintptr = myintptr + 1
5502  myintstack(myintptr) = 1
5503  end if
5504  if (du3(l) .ge. 0.) then
5505  x4 = du3(l)
5506 myintptr = myintptr + 1
5507  myintstack(myintptr) = 0
5508  else
5509  x4 = -du3(l)
5510 myintptr = myintptr + 1
5511  myintstack(myintptr) = 1
5512  end if
5513  if (x4 .lt. epslim) then
5514  max5 = epslim
5515 myintptr = myintptr + 1
5516  myintstack(myintptr) = 0
5517  else
5518  max5 = x4
5519 myintptr = myintptr + 1
5520  myintstack(myintptr) = 1
5521  end if
5522  y2 = du2(l)/sign(max5, du3(l))
5523  if (zero .lt. y2) then
5524  rr2 = y2
5525 myintptr = myintptr + 1
5526  myintstack(myintptr) = 0
5527  else
5528  rr2 = zero
5529 myintptr = myintptr + 1
5530  myintstack(myintptr) = 1
5531  end if
5532 ! compute the corresponding limiter values.
5533  rl1 = rl1*(rl1+one)/(rl1*rl1+one)
5534  rl2 = rl2*(rl2+one)/(rl2*rl2+one)
5535  rr1 = rr1*(rr1+one)/(rr1*rr1+one)
5536  rr2 = rr2*(rr2+one)/(rr2*rr2+one)
5537 ! compute the nonlinear corrections to the first order
5538 ! scheme.
5539  end do
5540  call pushcontrol2b(2)
5541  case (minmod)
5542 ! ==============================================================
5543 ! nonlinear interpolation using the minmod limiter.
5544 ! loop over the number of variables to be interpolated.
5545  do l=1,nwint
5546  if (du2(l) .ge. 0.) then
5547  x2 = du2(l)
5548 myintptr = myintptr + 1
5549  myintstack(myintptr) = 0
5550  else
5551  x2 = -du2(l)
5552 myintptr = myintptr + 1
5553  myintstack(myintptr) = 1
5554  end if
5555  if (x2 .lt. epslim) then
5556  max3 = epslim
5557 myintptr = myintptr + 1
5558  myintstack(myintptr) = 0
5559  else
5560  max3 = x2
5561 myintptr = myintptr + 1
5562  myintstack(myintptr) = 1
5563  end if
5564 ! compute the limiter argument rl1, rl2, rr1 and rr2.
5565 ! note the cut off to 0.0.
5566  tmp = one/sign(max3, du2(l))
5567  if (du1(l) .ge. 0.) then
5568  x5 = du1(l)
5569 myintptr = myintptr + 1
5570  myintstack(myintptr) = 0
5571  else
5572  x5 = -du1(l)
5573 myintptr = myintptr + 1
5574  myintstack(myintptr) = 1
5575  end if
5576  if (x5 .lt. epslim) then
5577  max6 = epslim
5578 myintptr = myintptr + 1
5579  myintstack(myintptr) = 0
5580  else
5581  max6 = x5
5582 myintptr = myintptr + 1
5583  myintstack(myintptr) = 1
5584  end if
5585  y3 = du2(l)/sign(max6, du1(l))
5586  if (zero .lt. y3) then
5587  rl1 = y3
5588 myintptr = myintptr + 1
5589  myintstack(myintptr) = 0
5590  else
5591  rl1 = zero
5592 myintptr = myintptr + 1
5593  myintstack(myintptr) = 1
5594  end if
5595  if (zero .lt. du1(l)*tmp) then
5596  rl2 = du1(l)*tmp
5597 myintptr = myintptr + 1
5598  myintstack(myintptr) = 0
5599  else
5600  rl2 = zero
5601 myintptr = myintptr + 1
5602  myintstack(myintptr) = 1
5603  end if
5604  if (zero .lt. du3(l)*tmp) then
5605  rr1 = du3(l)*tmp
5606 myintptr = myintptr + 1
5607  myintstack(myintptr) = 0
5608  else
5609  rr1 = zero
5610 myintptr = myintptr + 1
5611  myintstack(myintptr) = 1
5612  end if
5613  if (du3(l) .ge. 0.) then
5614  x6 = du3(l)
5615 myintptr = myintptr + 1
5616  myintstack(myintptr) = 0
5617  else
5618  x6 = -du3(l)
5619 myintptr = myintptr + 1
5620  myintstack(myintptr) = 1
5621  end if
5622  if (x6 .lt. epslim) then
5623  max7 = epslim
5624 myintptr = myintptr + 1
5625  myintstack(myintptr) = 0
5626  else
5627  max7 = x6
5628 myintptr = myintptr + 1
5629  myintstack(myintptr) = 1
5630  end if
5631  y4 = du2(l)/sign(max7, du3(l))
5632  if (zero .lt. y4) then
5633  rr2 = y4
5634 myintptr = myintptr + 1
5635  myintstack(myintptr) = 0
5636  else
5637  rr2 = zero
5638 myintptr = myintptr + 1
5639  myintstack(myintptr) = 1
5640  end if
5641  if (one .gt. factminmod*rl1) then
5642  rl1 = factminmod*rl1
5643 myintptr = myintptr + 1
5644  myintstack(myintptr) = 0
5645  else
5646  rl1 = one
5647 myintptr = myintptr + 1
5648  myintstack(myintptr) = 1
5649  end if
5650  if (one .gt. factminmod*rl2) then
5651  rl2 = factminmod*rl2
5652 myintptr = myintptr + 1
5653  myintstack(myintptr) = 0
5654  else
5655  rl2 = one
5656 myintptr = myintptr + 1
5657  myintstack(myintptr) = 1
5658  end if
5659  if (one .gt. factminmod*rr1) then
5660  rr1 = factminmod*rr1
5661 myintptr = myintptr + 1
5662  myintstack(myintptr) = 0
5663  else
5664  rr1 = one
5665 myintptr = myintptr + 1
5666  myintstack(myintptr) = 1
5667  end if
5668  if (one .gt. factminmod*rr2) then
5669  rr2 = factminmod*rr2
5670 myintptr = myintptr + 1
5671  myintstack(myintptr) = 0
5672  else
5673  rr2 = one
5674 myintptr = myintptr + 1
5675  myintstack(myintptr) = 1
5676  end if
5677  end do
5678  call pushcontrol2b(3)
5679  case default
5680  call pushcontrol2b(0)
5681  end select
5682 ! in case only a first order scheme must be used for the
5683 ! turbulent transport equations, set the correction for the
5684 ! turbulent kinetic energy to 0.
5685  if (firstorderk) then
5686 myintptr = myintptr + 1
5687  myintstack(myintptr) = 0
5688  else
5689 myintptr = myintptr + 1
5690  myintstack(myintptr) = 1
5691  end if
5692 ! for rotational periodic problems transform the velocity
5693 ! differences back to cartesian again. note that now the
5694 ! transpose of the rotation matrix must be used.
5695  if (rotationalperiodic) then
5696  dvxd = rot(1, 3)*rightd(ivz)
5697  dvyd = rot(2, 3)*rightd(ivz)
5698  dvzd = rot(3, 3)*rightd(ivz)
5699  rightd(ivz) = 0.0_8
5700  dvxd = dvxd + rot(1, 2)*rightd(ivy)
5701  dvyd = dvyd + rot(2, 2)*rightd(ivy)
5702  dvzd = dvzd + rot(3, 2)*rightd(ivy)
5703  rightd(ivy) = 0.0_8
5704  dvxd = dvxd + rot(1, 1)*rightd(ivx)
5705  dvyd = dvyd + rot(2, 1)*rightd(ivx)
5706  dvzd = dvzd + rot(3, 1)*rightd(ivx)
5707  rightd(ivx) = 0.0_8
5708  rightd(ivz) = rightd(ivz) + dvzd
5709  rightd(ivy) = rightd(ivy) + dvyd
5710  rightd(ivx) = rightd(ivx) + dvxd
5711  dvxd = rot(1, 3)*leftd(ivz)
5712  dvyd = rot(2, 3)*leftd(ivz)
5713  dvzd = rot(3, 3)*leftd(ivz)
5714  leftd(ivz) = 0.0_8
5715  dvxd = dvxd + rot(1, 2)*leftd(ivy)
5716  dvyd = dvyd + rot(2, 2)*leftd(ivy)
5717  dvzd = dvzd + rot(3, 2)*leftd(ivy)
5718  leftd(ivy) = 0.0_8
5719  dvxd = dvxd + rot(1, 1)*leftd(ivx)
5720  dvyd = dvyd + rot(2, 1)*leftd(ivx)
5721  dvzd = dvzd + rot(3, 1)*leftd(ivx)
5722  leftd(ivx) = 0.0_8
5723  leftd(ivz) = leftd(ivz) + dvzd
5724  leftd(ivy) = leftd(ivy) + dvyd
5725  leftd(ivx) = leftd(ivx) + dvxd
5726  end if
5727 branch = myintstack(myintptr)
5728  myintptr = myintptr - 1
5729  if (branch .eq. 0) then
5730  rightd(itu1) = 0.0_8
5731  leftd(itu1) = 0.0_8
5732  end if
5733  call popcontrol2b(branch)
5734  if (branch .lt. 2) then
5735  if (branch .ne. 0) then
5736  do l=nwint,1,-1
5737  du3d(l) = du3d(l) - omk*rightd(l)
5738  du2d(l) = du2d(l) + opk*leftd(l) - opk*rightd(l)
5739  rightd(l) = 0.0_8
5740  du1d(l) = du1d(l) + omk*leftd(l)
5741  leftd(l) = 0.0_8
5742  end do
5743  end if
5744  else if (branch .eq. 2) then
5745  do l=nwint,1,-1
5746  rr1d = -(du2(l)*opk*rightd(l))
5747  du2d(l) = du2d(l) + rl2*opk*leftd(l) - rr1*opk*rightd(l)
5748  rr2d = -(du3(l)*omk*rightd(l))
5749  du3d(l) = du3d(l) - rr2*omk*rightd(l)
5750  rightd(l) = 0.0_8
5751  rl1d = du1(l)*omk*leftd(l)
5752  du1d(l) = du1d(l) + rl1*omk*leftd(l)
5753  rl2d = du2(l)*opk*leftd(l)
5754  leftd(l) = 0.0_8
5755  tempd = rr2d/(one+rr2**2)
5756  rr2d = (one+2*rr2-2*rr2**2*(one+rr2)/(one+rr2**2))*tempd
5757  tempd = rr1d/(one+rr1**2)
5758  rr1d = (one+2*rr1-2*rr1**2*(one+rr1)/(one+rr1**2))*tempd
5759  tempd = rl2d/(one+rl2**2)
5760  rl2d = (one+2*rl2-2*rl2**2*(one+rl2)/(one+rl2**2))*tempd
5761  tempd = rl1d/(one+rl1**2)
5762  rl1d = (one+2*rl1-2*rl1**2*(one+rl1)/(one+rl1**2))*tempd
5763 branch = myintstack(myintptr)
5764  myintptr = myintptr - 1
5765  if (branch .eq. 0) then
5766  y2d = rr2d
5767  else
5768  y2d = 0.0_8
5769  end if
5770  temp = sign(max5, du3(l))
5771  du2d(l) = du2d(l) + y2d/temp
5772  tempd = -(du2(l)*y2d/temp**2)
5773  max5d = sign(1.d0, max5*du3(l))*tempd
5774 branch = myintstack(myintptr)
5775  myintptr = myintptr - 1
5776  if (branch .eq. 0) then
5777  x4d = 0.0_8
5778  else
5779  x4d = max5d
5780  end if
5781 branch = myintstack(myintptr)
5782  myintptr = myintptr - 1
5783  if (branch .eq. 0) then
5784  du3d(l) = du3d(l) + x4d
5785  else
5786  du3d(l) = du3d(l) - x4d
5787  end if
5788 branch = myintstack(myintptr)
5789  myintptr = myintptr - 1
5790  if (branch .eq. 0) then
5791  du3d(l) = du3d(l) + tmp*rr1d
5792  tmpd = du3(l)*rr1d
5793  else
5794  tmpd = 0.0_8
5795  end if
5796 branch = myintstack(myintptr)
5797  myintptr = myintptr - 1
5798  if (branch .eq. 0) then
5799  du1d(l) = du1d(l) + tmp*rl2d
5800  tmpd = tmpd + du1(l)*rl2d
5801  else
5802  end if
5803 branch = myintstack(myintptr)
5804  myintptr = myintptr - 1
5805  if (branch .eq. 0) then
5806  y1d = rl1d
5807  else
5808  y1d = 0.0_8
5809  end if
5810  temp = sign(max4, du1(l))
5811  du2d(l) = du2d(l) + y1d/temp
5812  tempd = -(du2(l)*y1d/temp**2)
5813  max4d = sign(1.d0, max4*du1(l))*tempd
5814 branch = myintstack(myintptr)
5815  myintptr = myintptr - 1
5816  if (branch .eq. 0) then
5817  x3d = 0.0_8
5818  else
5819  x3d = max4d
5820  end if
5821 branch = myintstack(myintptr)
5822  myintptr = myintptr - 1
5823  if (branch .eq. 0) then
5824  du1d(l) = du1d(l) + x3d
5825  else
5826  du1d(l) = du1d(l) - x3d
5827  end if
5828  temp = sign(max2, du2(l))
5829  tempd = -(one*tmpd/temp**2)
5830  max2d = sign(1.d0, max2*du2(l))*tempd
5831 branch = myintstack(myintptr)
5832  myintptr = myintptr - 1
5833  if (branch .eq. 0) then
5834  x1d = 0.0_8
5835  else
5836  x1d = max2d
5837  end if
5838 branch = myintstack(myintptr)
5839  myintptr = myintptr - 1
5840  if (branch .eq. 0) then
5841  du2d(l) = du2d(l) + x1d
5842  else
5843  du2d(l) = du2d(l) - x1d
5844  end if
5845  end do
5846  else
5847  do l=nwint,1,-1
5848  rr1d = -(du2(l)*opk*rightd(l))
5849  du2d(l) = du2d(l) + rl2*opk*leftd(l) - rr1*opk*rightd(l)
5850  rr2d = -(du3(l)*omk*rightd(l))
5851  du3d(l) = du3d(l) - rr2*omk*rightd(l)
5852  rightd(l) = 0.0_8
5853  rl1d = du1(l)*omk*leftd(l)
5854  du1d(l) = du1d(l) + rl1*omk*leftd(l)
5855  rl2d = du2(l)*opk*leftd(l)
5856  leftd(l) = 0.0_8
5857 branch = myintstack(myintptr)
5858  myintptr = myintptr - 1
5859  if (branch .eq. 0) then
5860  rr2d = factminmod*rr2d
5861  else
5862  rr2d = 0.0_8
5863  end if
5864 branch = myintstack(myintptr)
5865  myintptr = myintptr - 1
5866  if (branch .eq. 0) then
5867  rr1d = factminmod*rr1d
5868  else
5869  rr1d = 0.0_8
5870  end if
5871 branch = myintstack(myintptr)
5872  myintptr = myintptr - 1
5873  if (branch .eq. 0) then
5874  rl2d = factminmod*rl2d
5875  else
5876  rl2d = 0.0_8
5877  end if
5878 branch = myintstack(myintptr)
5879  myintptr = myintptr - 1
5880  if (branch .eq. 0) then
5881  rl1d = factminmod*rl1d
5882  else
5883  rl1d = 0.0_8
5884  end if
5885 branch = myintstack(myintptr)
5886  myintptr = myintptr - 1
5887  if (branch .eq. 0) then
5888  y4d = rr2d
5889  else
5890  y4d = 0.0_8
5891  end if
5892  temp = sign(max7, du3(l))
5893  du2d(l) = du2d(l) + y4d/temp
5894  tempd = -(du2(l)*y4d/temp**2)
5895  max7d = sign(1.d0, max7*du3(l))*tempd
5896 branch = myintstack(myintptr)
5897  myintptr = myintptr - 1
5898  if (branch .eq. 0) then
5899  x6d = 0.0_8
5900  else
5901  x6d = max7d
5902  end if
5903 branch = myintstack(myintptr)
5904  myintptr = myintptr - 1
5905  if (branch .eq. 0) then
5906  du3d(l) = du3d(l) + x6d
5907  else
5908  du3d(l) = du3d(l) - x6d
5909  end if
5910 branch = myintstack(myintptr)
5911  myintptr = myintptr - 1
5912  if (branch .eq. 0) then
5913  du3d(l) = du3d(l) + tmp*rr1d
5914  tmpd = du3(l)*rr1d
5915  else
5916  tmpd = 0.0_8
5917  end if
5918 branch = myintstack(myintptr)
5919  myintptr = myintptr - 1
5920  if (branch .eq. 0) then
5921  du1d(l) = du1d(l) + tmp*rl2d
5922  tmpd = tmpd + du1(l)*rl2d
5923  else
5924  end if
5925 branch = myintstack(myintptr)
5926  myintptr = myintptr - 1
5927  if (branch .eq. 0) then
5928  y3d = rl1d
5929  else
5930  y3d = 0.0_8
5931  end if
5932  temp = sign(max6, du1(l))
5933  du2d(l) = du2d(l) + y3d/temp
5934  tempd = -(du2(l)*y3d/temp**2)
5935  max6d = sign(1.d0, max6*du1(l))*tempd
5936 branch = myintstack(myintptr)
5937  myintptr = myintptr - 1
5938  if (branch .eq. 0) then
5939  x5d = 0.0_8
5940  else
5941  x5d = max6d
5942  end if
5943 branch = myintstack(myintptr)
5944  myintptr = myintptr - 1
5945  if (branch .eq. 0) then
5946  du1d(l) = du1d(l) + x5d
5947  else
5948  du1d(l) = du1d(l) - x5d
5949  end if
5950  temp = sign(max3, du2(l))
5951  tempd = -(one*tmpd/temp**2)
5952  max3d = sign(1.d0, max3*du2(l))*tempd
5953 branch = myintstack(myintptr)
5954  myintptr = myintptr - 1
5955  if (branch .eq. 0) then
5956  x2d = 0.0_8
5957  else
5958  x2d = max3d
5959  end if
5960 branch = myintstack(myintptr)
5961  myintptr = myintptr - 1
5962  if (branch .eq. 0) then
5963  du2d(l) = du2d(l) + x2d
5964  else
5965  du2d(l) = du2d(l) - x2d
5966  end if
5967  end do
5968  end if
5969 branch = myintstack(myintptr)
5970  myintptr = myintptr - 1
5971  if (branch .eq. 0) then
5972  dvxd = rot(3, 1)*du3d(ivz)
5973  dvyd = rot(3, 2)*du3d(ivz)
5974  dvzd = rot(3, 3)*du3d(ivz)
5975  du3d(ivz) = 0.0_8
5976  dvxd = dvxd + rot(2, 1)*du3d(ivy)
5977  dvyd = dvyd + rot(2, 2)*du3d(ivy)
5978  dvzd = dvzd + rot(2, 3)*du3d(ivy)
5979  du3d(ivy) = 0.0_8
5980  dvxd = dvxd + rot(1, 1)*du3d(ivx)
5981  dvyd = dvyd + rot(1, 2)*du3d(ivx)
5982  dvzd = dvzd + rot(1, 3)*du3d(ivx)
5983  du3d(ivx) = 0.0_8
5984  du3d(ivz) = du3d(ivz) + dvzd
5985  du3d(ivy) = du3d(ivy) + dvyd
5986  du3d(ivx) = du3d(ivx) + dvxd
5987  dvxd = rot(3, 1)*du2d(ivz)
5988  dvyd = rot(3, 2)*du2d(ivz)
5989  dvzd = rot(3, 3)*du2d(ivz)
5990  du2d(ivz) = 0.0_8
5991  dvxd = dvxd + rot(2, 1)*du2d(ivy)
5992  dvyd = dvyd + rot(2, 2)*du2d(ivy)
5993  dvzd = dvzd + rot(2, 3)*du2d(ivy)
5994  du2d(ivy) = 0.0_8
5995  dvxd = dvxd + rot(1, 1)*du2d(ivx)
5996  dvyd = dvyd + rot(1, 2)*du2d(ivx)
5997  dvzd = dvzd + rot(1, 3)*du2d(ivx)
5998  du2d(ivx) = 0.0_8
5999  du2d(ivz) = du2d(ivz) + dvzd
6000  du2d(ivy) = du2d(ivy) + dvyd
6001  du2d(ivx) = du2d(ivx) + dvxd
6002  dvxd = rot(3, 1)*du1d(ivz)
6003  dvyd = rot(3, 2)*du1d(ivz)
6004  dvzd = rot(3, 3)*du1d(ivz)
6005  du1d(ivz) = 0.0_8
6006  dvxd = dvxd + rot(2, 1)*du1d(ivy)
6007  dvyd = dvyd + rot(2, 2)*du1d(ivy)
6008  dvzd = dvzd + rot(2, 3)*du1d(ivy)
6009  du1d(ivy) = 0.0_8
6010  dvxd = dvxd + rot(1, 1)*du1d(ivx)
6011  dvyd = dvyd + rot(1, 2)*du1d(ivx)
6012  dvzd = dvzd + rot(1, 3)*du1d(ivx)
6013  du1d(ivx) = 0.0_8
6014  du1d(ivz) = du1d(ivz) + dvzd
6015  du1d(ivy) = du1d(ivy) + dvyd
6016  du1d(ivx) = du1d(ivx) + dvxd
6017  end if
6018  end subroutine leftrightstate_fast_b
6019 
6020 ! ==================================================================
6021  subroutine leftrightstate(du1, du2, du3, rotmatrix, left, right)
6022  implicit none
6023 !
6024 ! local parameter.
6025 !
6026  real(kind=realtype), parameter :: epslim=1.e-10_realtype
6027 !
6028 ! subroutine arguments.
6029 !
6030  real(kind=realtype), dimension(:), intent(inout) :: du1, du2, du3
6031  real(kind=realtype), dimension(:), intent(out) :: left, right
6032  real(kind=realtype), dimension(:, :, :, :, :), pointer :: &
6033 & rotmatrix
6034 !
6035 ! local variables.
6036 !
6037  integer(kind=inttype) :: l
6038  real(kind=realtype) :: rl1, rl2, rr1, rr2, tmp, dvx, dvy, dvz
6039  real(kind=realtype), dimension(3, 3) :: rot
6040  intrinsic abs
6041  intrinsic max
6042  intrinsic sign
6043  intrinsic min
6044  real(kind=realtype) :: x1
6045  real(kind=realtype) :: y1
6046  real(kind=realtype) :: y2
6047  real(kind=realtype) :: x2
6048  real(kind=realtype) :: y3
6049  real(kind=realtype) :: y4
6050  real(kind=realtype) :: x3
6051  real(kind=realtype) :: x4
6052  real(kind=realtype) :: x5
6053  real(kind=realtype) :: x6
6054  real(kind=realtype) :: max2
6055  real(kind=realtype) :: max3
6056  real(kind=realtype) :: max4
6057  real(kind=realtype) :: max5
6058  real(kind=realtype) :: max6
6059  real(kind=realtype) :: max7
6060 ! check if the velocity components should be transformed to
6061 ! the cylindrical frame.
6062  if (rotationalperiodic) then
6063 ! store the rotation matrix a bit easier. note that the i,j,k
6064 ! come from the main subroutine.
6065  rot(1, 1) = rotmatrix(i, j, k, 1, 1)
6066  rot(1, 2) = rotmatrix(i, j, k, 1, 2)
6067  rot(1, 3) = rotmatrix(i, j, k, 1, 3)
6068  rot(2, 1) = rotmatrix(i, j, k, 2, 1)
6069  rot(2, 2) = rotmatrix(i, j, k, 2, 2)
6070  rot(2, 3) = rotmatrix(i, j, k, 2, 3)
6071  rot(3, 1) = rotmatrix(i, j, k, 3, 1)
6072  rot(3, 2) = rotmatrix(i, j, k, 3, 2)
6073  rot(3, 3) = rotmatrix(i, j, k, 3, 3)
6074 ! apply the transformation to the velocity components
6075 ! of du1, du2 and du3.
6076  dvx = du1(ivx)
6077  dvy = du1(ivy)
6078  dvz = du1(ivz)
6079  du1(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
6080  du1(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
6081  du1(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
6082  dvx = du2(ivx)
6083  dvy = du2(ivy)
6084  dvz = du2(ivz)
6085  du2(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
6086  du2(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
6087  du2(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
6088  dvx = du3(ivx)
6089  dvy = du3(ivy)
6090  dvz = du3(ivz)
6091  du3(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
6092  du3(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
6093  du3(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
6094  end if
6095 ! determine the limiter used.
6096  select case (limused)
6097  case (nolimiter)
6098 ! linear interpolation; no limiter.
6099 ! loop over the number of variables to be interpolated.
6100  do l=1,nwint
6101  left(l) = omk*du1(l) + opk*du2(l)
6102  right(l) = -(omk*du3(l)) - opk*du2(l)
6103  end do
6104  case (vanalbeda)
6105 ! ==============================================================
6106 ! nonlinear interpolation using the van albeda limiter.
6107 ! loop over the number of variables to be interpolated.
6108  do l=1,nwint
6109  if (du2(l) .ge. 0.) then
6110  x1 = du2(l)
6111  else
6112  x1 = -du2(l)
6113  end if
6114  if (x1 .lt. epslim) then
6115  max2 = epslim
6116  else
6117  max2 = x1
6118  end if
6119 ! compute the limiter argument rl1, rl2, rr1 and rr2.
6120 ! note the cut off to 0.0.
6121  tmp = one/sign(max2, du2(l))
6122  if (du1(l) .ge. 0.) then
6123  x3 = du1(l)
6124  else
6125  x3 = -du1(l)
6126  end if
6127  if (x3 .lt. epslim) then
6128  max4 = epslim
6129  else
6130  max4 = x3
6131  end if
6132  y1 = du2(l)/sign(max4, du1(l))
6133  if (zero .lt. y1) then
6134  rl1 = y1
6135  else
6136  rl1 = zero
6137  end if
6138  if (zero .lt. du1(l)*tmp) then
6139  rl2 = du1(l)*tmp
6140  else
6141  rl2 = zero
6142  end if
6143  if (zero .lt. du3(l)*tmp) then
6144  rr1 = du3(l)*tmp
6145  else
6146  rr1 = zero
6147  end if
6148  if (du3(l) .ge. 0.) then
6149  x4 = du3(l)
6150  else
6151  x4 = -du3(l)
6152  end if
6153  if (x4 .lt. epslim) then
6154  max5 = epslim
6155  else
6156  max5 = x4
6157  end if
6158  y2 = du2(l)/sign(max5, du3(l))
6159  if (zero .lt. y2) then
6160  rr2 = y2
6161  else
6162  rr2 = zero
6163  end if
6164 ! compute the corresponding limiter values.
6165  rl1 = rl1*(rl1+one)/(rl1*rl1+one)
6166  rl2 = rl2*(rl2+one)/(rl2*rl2+one)
6167  rr1 = rr1*(rr1+one)/(rr1*rr1+one)
6168  rr2 = rr2*(rr2+one)/(rr2*rr2+one)
6169 ! compute the nonlinear corrections to the first order
6170 ! scheme.
6171  left(l) = omk*rl1*du1(l) + opk*rl2*du2(l)
6172  right(l) = -(opk*rr1*du2(l)) - omk*rr2*du3(l)
6173  end do
6174  case (minmod)
6175 ! ==============================================================
6176 ! nonlinear interpolation using the minmod limiter.
6177 ! loop over the number of variables to be interpolated.
6178  do l=1,nwint
6179  if (du2(l) .ge. 0.) then
6180  x2 = du2(l)
6181  else
6182  x2 = -du2(l)
6183  end if
6184  if (x2 .lt. epslim) then
6185  max3 = epslim
6186  else
6187  max3 = x2
6188  end if
6189 ! compute the limiter argument rl1, rl2, rr1 and rr2.
6190 ! note the cut off to 0.0.
6191  tmp = one/sign(max3, du2(l))
6192  if (du1(l) .ge. 0.) then
6193  x5 = du1(l)
6194  else
6195  x5 = -du1(l)
6196  end if
6197  if (x5 .lt. epslim) then
6198  max6 = epslim
6199  else
6200  max6 = x5
6201  end if
6202  y3 = du2(l)/sign(max6, du1(l))
6203  if (zero .lt. y3) then
6204  rl1 = y3
6205  else
6206  rl1 = zero
6207  end if
6208  if (zero .lt. du1(l)*tmp) then
6209  rl2 = du1(l)*tmp
6210  else
6211  rl2 = zero
6212  end if
6213  if (zero .lt. du3(l)*tmp) then
6214  rr1 = du3(l)*tmp
6215  else
6216  rr1 = zero
6217  end if
6218  if (du3(l) .ge. 0.) then
6219  x6 = du3(l)
6220  else
6221  x6 = -du3(l)
6222  end if
6223  if (x6 .lt. epslim) then
6224  max7 = epslim
6225  else
6226  max7 = x6
6227  end if
6228  y4 = du2(l)/sign(max7, du3(l))
6229  if (zero .lt. y4) then
6230  rr2 = y4
6231  else
6232  rr2 = zero
6233  end if
6234  if (one .gt. factminmod*rl1) then
6235  rl1 = factminmod*rl1
6236  else
6237  rl1 = one
6238  end if
6239  if (one .gt. factminmod*rl2) then
6240  rl2 = factminmod*rl2
6241  else
6242  rl2 = one
6243  end if
6244  if (one .gt. factminmod*rr1) then
6245  rr1 = factminmod*rr1
6246  else
6247  rr1 = one
6248  end if
6249  if (one .gt. factminmod*rr2) then
6250  rr2 = factminmod*rr2
6251  else
6252  rr2 = one
6253  end if
6254 ! compute the nonlinear corrections to the first order
6255 ! scheme.
6256  left(l) = omk*rl1*du1(l) + opk*rl2*du2(l)
6257  right(l) = -(opk*rr1*du2(l)) - omk*rr2*du3(l)
6258  end do
6259  end select
6260 ! in case only a first order scheme must be used for the
6261 ! turbulent transport equations, set the correction for the
6262 ! turbulent kinetic energy to 0.
6263  if (firstorderk) then
6264  left(itu1) = zero
6265  right(itu1) = zero
6266  end if
6267 ! for rotational periodic problems transform the velocity
6268 ! differences back to cartesian again. note that now the
6269 ! transpose of the rotation matrix must be used.
6270  if (rotationalperiodic) then
6271 ! left state.
6272  dvx = left(ivx)
6273  dvy = left(ivy)
6274  dvz = left(ivz)
6275  left(ivx) = rot(1, 1)*dvx + rot(2, 1)*dvy + rot(3, 1)*dvz
6276  left(ivy) = rot(1, 2)*dvx + rot(2, 2)*dvy + rot(3, 2)*dvz
6277  left(ivz) = rot(1, 3)*dvx + rot(2, 3)*dvy + rot(3, 3)*dvz
6278 ! right state.
6279  dvx = right(ivx)
6280  dvy = right(ivy)
6281  dvz = right(ivz)
6282  right(ivx) = rot(1, 1)*dvx + rot(2, 1)*dvy + rot(3, 1)*dvz
6283  right(ivy) = rot(1, 2)*dvx + rot(2, 2)*dvy + rot(3, 2)*dvz
6284  right(ivz) = rot(1, 3)*dvx + rot(2, 3)*dvy + rot(3, 3)*dvz
6285  end if
6286  end subroutine leftrightstate
6287 
6288 ! differentiation of riemannflux in reverse (adjoint) mode (with options noisize i4 dr8 r8):
6289 ! gradient of useful results: flux left right
6290 ! with respect to varying inputs: flux left right
6291 ! ================================================================
6292  subroutine riemannflux_fast_b(left, leftd, right, rightd, flux, &
6293 & fluxd)
6294  implicit none
6295 !
6296 ! subroutine arguments.
6297 !
6298  real(kind=realtype), dimension(*), intent(in) :: left, right
6299  real(kind=realtype), dimension(*) :: leftd, rightd
6300  real(kind=realtype), dimension(*) :: flux
6301  real(kind=realtype), dimension(*) :: fluxd
6302 !
6303 ! local variables.
6304 !
6305  real(kind=realtype) :: porflux, rface
6306  real(kind=realtype) :: etl, etr, z1l, z1r, tmp
6307  real(kind=realtype) :: etld, etrd, z1ld, z1rd, tmpd
6308  real(kind=realtype) :: dr, dru, drv, drw, dre, drk
6309  real(kind=realtype) :: drd, drud, drvd, drwd, dred, drkd
6310  real(kind=realtype) :: ravg, uavg, vavg, wavg, havg, kavg
6311  real(kind=realtype) :: uavgd, vavgd, wavgd, havgd, kavgd
6312  real(kind=realtype) :: alphaavg, a2avg, aavg, unavg
6313  real(kind=realtype) :: alphaavgd, a2avgd, aavgd, unavgd
6314  real(kind=realtype) :: ovaavg, ova2avg, area, eta
6315  real(kind=realtype) :: ovaavgd, ova2avgd, etad
6316  real(kind=realtype) :: gm1, gm53
6317  real(kind=realtype) :: lam1, lam2, lam3
6318  real(kind=realtype) :: lam1d, lam2d, lam3d
6319  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
6320  real(kind=realtype) :: abv1d, abv2d, abv3d, abv4d, abv5d, abv6d, &
6321 & abv7d
6322  real(kind=realtype), dimension(2) :: ktmp
6323  real(kind=realtype), dimension(2) :: ktmpd
6324  intrinsic sqrt
6325  intrinsic max
6326  intrinsic abs
6327  real(kind=realtype) :: x1
6328  real(kind=realtype) :: x1d
6329  real(kind=realtype) :: x2
6330  real(kind=realtype) :: x2d
6331  real(realtype) :: max2
6332  real(kind=realtype) :: abs1
6333  real(kind=realtype) :: abs1d
6334  real(kind=realtype) :: abs2
6335  real(kind=realtype) :: abs2d
6336  real(kind=realtype) :: temp
6337  real(kind=realtype) :: tempd
6338  real(kind=realtype) :: temp0
6339  real(kind=realtype) :: temp1
6340  real(kind=realtype) :: tempd0
6341  real(kind=realtype) :: tempd1
6342  integer :: branch
6343 ! set the porosity for the flux. the default value, 0.5*rfil, is
6344 ! a scaling factor where an rfil != 1 is taken into account.
6345  porflux = half*rfil
6346  if (por .eq. noflux .or. por .eq. boundflux) porflux = zero
6347 ! abbreviate some expressions in which gamma occurs.
6348  gm1 = gammaface - one
6349  gm53 = gammaface - five*third
6350 ! determine which riemann solver must be solved.
6351  select case (riemannused)
6352  case (roe)
6353 ! determine the preconditioner used.
6354  select case (precond)
6355  case (noprecond)
6356 ! no preconditioner used. use the roe scheme of the
6357 ! standard equations.
6358 ! compute the square root of the left and right densities
6359 ! and the inverse of the sum.
6360  z1l = sqrt(left(irho))
6361  z1r = sqrt(right(irho))
6362  tmp = one/(z1l+z1r)
6363 ! compute some variables depending whether or not a
6364 ! k-equation is present.
6365  if (correctfork) then
6366 ! store the left and right kinetic energy in ktmp,
6367 ! which is needed to compute the total energy.
6368  ktmp(1) = left(itu1)
6369  ktmp(2) = right(itu1)
6370 ! store the difference of the turbulent kinetic energy
6371 ! per unit volume, i.e. the conserved variable.
6372  drk = right(irho)*right(itu1) - left(irho)*left(itu1)
6373 ! compute the average turbulent energy per unit mass
6374 ! using roe averages.
6375  kavg = tmp*(z1l*left(itu1)+z1r*right(itu1))
6376 myintptr = myintptr + 1
6377  myintstack(myintptr) = 1
6378  else
6379 myintptr = myintptr + 1
6380  myintstack(myintptr) = 0
6381 ! set the difference of the turbulent kinetic energy
6382 ! per unit volume and the averaged kinetic energy per
6383 ! unit mass to zero.
6384  drk = 0.0
6385  kavg = 0.0
6386  end if
6387 ! compute the total energy of the left and right state.
6388  call etot(left(irho), left(ivx), left(ivy), left(ivz), left(&
6389 & irhoe), ktmp(1), etl, correctfork)
6390  call etot(right(irho), right(ivx), right(ivy), right(ivz), &
6391 & right(irhoe), ktmp(2), etr, correctfork)
6392 ! compute the difference of the conservative mean
6393 ! flow variables.
6394  dr = right(irho) - left(irho)
6395  dru = right(irho)*right(ivx) - left(irho)*left(ivx)
6396  drv = right(irho)*right(ivy) - left(irho)*left(ivy)
6397  drw = right(irho)*right(ivz) - left(irho)*left(ivz)
6398  dre = etr - etl
6399 ! compute the roe average variables, which can be
6400 ! computed directly from the average roe vector.
6401  uavg = tmp*(z1l*left(ivx)+z1r*right(ivx))
6402  vavg = tmp*(z1l*left(ivy)+z1r*right(ivy))
6403  wavg = tmp*(z1l*left(ivz)+z1r*right(ivz))
6404  havg = tmp*((etl+left(irhoe))/z1l+(etr+right(irhoe))/z1r)
6405 ! compute the unit vector and store the area of the
6406 ! normal. also compute the unit normal velocity of the face.
6407  area = sqrt(sx**2 + sy**2 + sz**2)
6408  if (1.e-25_realtype .lt. area) then
6409  max2 = area
6410  else
6411  max2 = 1.e-25_realtype
6412  end if
6413  tmp = one/max2
6414  sx = sx*tmp
6415  sy = sy*tmp
6416  sz = sz*tmp
6417  rface = sface*tmp
6418 ! compute some dependent variables at the roe
6419 ! average state.
6420  alphaavg = half*(uavg**2+vavg**2+wavg**2)
6421  if (gm1*(havg-alphaavg) - gm53*kavg .ge. 0.) then
6422  a2avg = gm1*(havg-alphaavg) - gm53*kavg
6423 myintptr = myintptr + 1
6424  myintstack(myintptr) = 0
6425  else
6426  a2avg = -(gm1*(havg-alphaavg)-gm53*kavg)
6427 myintptr = myintptr + 1
6428  myintstack(myintptr) = 1
6429  end if
6430  aavg = sqrt(a2avg)
6431  unavg = uavg*sx + vavg*sy + wavg*sz
6432  ovaavg = one/aavg
6433  ova2avg = one/a2avg
6434 ! set for a boundary the normal velocity to rface, the
6435 ! normal velocity of the boundary.
6436  if (por .eq. boundflux) then
6437  unavg = rface
6438 myintptr = myintptr + 1
6439  myintstack(myintptr) = 1
6440  else
6441 myintptr = myintptr + 1
6442  myintstack(myintptr) = 0
6443  end if
6444  x1 = (left(ivx)-right(ivx))*sx + (left(ivy)-right(ivy))*sy + (&
6445 & left(ivz)-right(ivz))*sz
6446  if (x1 .ge. 0.) then
6447  abs1 = x1
6448 myintptr = myintptr + 1
6449  myintstack(myintptr) = 1
6450  else
6451  abs1 = -x1
6452 myintptr = myintptr + 1
6453  myintstack(myintptr) = 0
6454  end if
6455  x2 = sqrt(gammaface*left(irhoe)/left(irho)) - sqrt(gammaface*&
6456 & right(irhoe)/right(irho))
6457  if (x2 .ge. 0.) then
6458  abs2 = x2
6459 myintptr = myintptr + 1
6460  myintstack(myintptr) = 0
6461  else
6462  abs2 = -x2
6463 myintptr = myintptr + 1
6464  myintstack(myintptr) = 1
6465  end if
6466 ! compute the coefficient eta for the entropy correction.
6467 ! at the moment a 1d entropy correction is used, which
6468 ! removes expansion shocks. although it also reduces the
6469 ! carbuncle phenomenon, it does not remove it completely.
6470 ! in other to do that a multi-dimensional entropy fix is
6471 ! needed, see sanders et. al, jcp, vol. 145, 1998,
6472 ! pp. 511 - 537. although relatively easy to implement,
6473 ! an efficient implementation requires the storage of
6474 ! all the left and right states, which is rather
6475 ! expensive in terms of memory.
6476  eta = half*(abs1+abs2)
6477  if (unavg - rface + aavg .ge. 0.) then
6478  lam1 = unavg - rface + aavg
6479 myintptr = myintptr + 1
6480  myintstack(myintptr) = 0
6481  else
6482  lam1 = -(unavg-rface+aavg)
6483 myintptr = myintptr + 1
6484  myintstack(myintptr) = 1
6485  end if
6486  if (unavg - rface - aavg .ge. 0.) then
6487  lam2 = unavg - rface - aavg
6488 myintptr = myintptr + 1
6489  myintstack(myintptr) = 0
6490  else
6491  lam2 = -(unavg-rface-aavg)
6492 myintptr = myintptr + 1
6493  myintstack(myintptr) = 1
6494  end if
6495  if (unavg - rface .ge. 0.) then
6496  lam3 = unavg - rface
6497 myintptr = myintptr + 1
6498  myintstack(myintptr) = 0
6499  else
6500  lam3 = -(unavg-rface)
6501 myintptr = myintptr + 1
6502  myintstack(myintptr) = 1
6503  end if
6504 ! apply the entropy correction to the eigenvalues.
6505  tmp = two*eta
6506  if (lam1 .lt. tmp) then
6507  lam1 = eta + fourth*lam1*lam1/eta
6508 myintptr = myintptr + 1
6509  myintstack(myintptr) = 0
6510  else
6511 myintptr = myintptr + 1
6512  myintstack(myintptr) = 1
6513  end if
6514  if (lam2 .lt. tmp) then
6515  lam2 = eta + fourth*lam2*lam2/eta
6516 myintptr = myintptr + 1
6517  myintstack(myintptr) = 0
6518  else
6519 myintptr = myintptr + 1
6520  myintstack(myintptr) = 1
6521  end if
6522  if (lam3 .lt. tmp) then
6523  lam3 = eta + fourth*lam3*lam3/eta
6524 myintptr = myintptr + 1
6525  myintstack(myintptr) = 0
6526  else
6527 myintptr = myintptr + 1
6528  myintstack(myintptr) = 1
6529  end if
6530 ! multiply the eigenvalues by the area to obtain
6531 ! the correct values for the dissipation term.
6532  lam1 = lam1*area
6533  lam2 = lam2*area
6534  lam3 = lam3*area
6535 ! some abbreviations, which occur quite often in the
6536 ! dissipation terms.
6537  abv1 = half*(lam1+lam2)
6538  abv2 = half*(lam1-lam2)
6539  abv3 = abv1 - lam3
6540  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53&
6541 & *drk
6542  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
6543  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
6544  abv7 = abv2*abv4*ovaavg + abv3*abv5
6545 ! compute the dissipation term, -|a| (wr - wl), which is
6546 ! multiplied by porflux. note that porflux is either
6547 ! 0.0 or 0.5*rfil.
6548 ! tmp = max(lam1,lam2,lam3)
6549 ! flux(irho) = -porflux*(tmp*dr)
6550 ! flux(imx) = -porflux*(tmp*dru)
6551 ! flux(imy) = -porflux*(tmp*drv)
6552 ! flux(imz) = -porflux*(tmp*drw)
6553 ! flux(irhoe) = -porflux*(tmp*dre)
6554  tempd0 = -(porflux*fluxd(irhoe))
6555  fluxd(irhoe) = 0.0_8
6556  lam3d = dre*tempd0
6557  dred = lam3*tempd0
6558  havgd = abv6*tempd0
6559  abv6d = havg*tempd0
6560  unavgd = abv7*tempd0
6561  abv7d = unavg*tempd0
6562  tempd0 = -(porflux*fluxd(imz))
6563  fluxd(imz) = 0.0_8
6564  lam3d = lam3d + drw*tempd0
6565  drwd = lam3*tempd0
6566  wavgd = abv6*tempd0
6567  abv6d = abv6d + wavg*tempd0
6568  abv7d = abv7d + sz*tempd0
6569  tempd0 = -(porflux*fluxd(imy))
6570  fluxd(imy) = 0.0_8
6571  lam3d = lam3d + drv*tempd0
6572  drvd = lam3*tempd0
6573  vavgd = abv6*tempd0
6574  abv6d = abv6d + vavg*tempd0
6575  abv7d = abv7d + sy*tempd0
6576  tempd0 = -(porflux*fluxd(imx))
6577  fluxd(imx) = 0.0_8
6578  lam3d = lam3d + dru*tempd0
6579  drud = lam3*tempd0
6580  uavgd = abv6*tempd0
6581  abv6d = abv6d + uavg*tempd0
6582  abv7d = abv7d + sx*tempd0
6583  tempd0 = -(porflux*fluxd(irho))
6584  fluxd(irho) = 0.0_8
6585  drd = lam3*tempd0
6586  abv6d = abv6d + tempd0
6587  abv2d = abv4*ovaavg*abv7d + abv5*ovaavg*abv6d
6588  abv4d = abv2*ovaavg*abv7d + abv3*ova2avg*abv6d
6589  ovaavgd = abv2*abv4*abv7d + abv2*abv5*abv6d
6590  abv3d = abv5*abv7d + abv4*ova2avg*abv6d
6591  lam3d = lam3d + dr*tempd0 - abv3d
6592  abv5d = abv3*abv7d + abv2*ovaavg*abv6d
6593  ova2avgd = abv3*abv4*abv6d
6594  unavgd = unavgd - dr*abv5d
6595  tempd0 = gm1*abv4d
6596  drud = drud + sx*abv5d - uavg*tempd0
6597  drvd = drvd + sy*abv5d - vavg*tempd0
6598  drwd = drwd + sz*abv5d - wavg*tempd0
6599  drd = drd + alphaavg*tempd0 - unavg*abv5d
6600  drkd = -(gm53*abv4d)
6601  alphaavgd = dr*tempd0
6602  uavgd = uavgd - dru*tempd0
6603  vavgd = vavgd - drv*tempd0
6604  dred = dred + tempd0
6605  wavgd = wavgd - drw*tempd0
6606  abv1d = abv3d
6607  lam1d = half*abv2d + half*abv1d
6608  lam2d = half*abv1d - half*abv2d
6609  lam3d = area*lam3d
6610  lam2d = area*lam2d
6611  lam1d = area*lam1d
6612 branch = myintstack(myintptr)
6613  myintptr = myintptr - 1
6614  if (branch .eq. 0) then
6615  tempd0 = fourth*lam3d/eta
6616  etad = lam3d - lam3**2*tempd0/eta
6617  lam3d = 2*lam3*tempd0
6618  else
6619  etad = 0.0_8
6620  end if
6621 branch = myintstack(myintptr)
6622  myintptr = myintptr - 1
6623  if (branch .eq. 0) then
6624  tempd0 = fourth*lam2d/eta
6625  etad = etad + lam2d - lam2**2*tempd0/eta
6626  lam2d = 2*lam2*tempd0
6627  end if
6628 branch = myintstack(myintptr)
6629  myintptr = myintptr - 1
6630  if (branch .eq. 0) then
6631  tempd0 = fourth*lam1d/eta
6632  etad = etad + lam1d - lam1**2*tempd0/eta
6633  lam1d = 2*lam1*tempd0
6634  end if
6635 branch = myintstack(myintptr)
6636  myintptr = myintptr - 1
6637  if (branch .eq. 0) then
6638  unavgd = unavgd + lam3d
6639  else
6640  unavgd = unavgd - lam3d
6641  end if
6642 branch = myintstack(myintptr)
6643  myintptr = myintptr - 1
6644  if (branch .eq. 0) then
6645  unavgd = unavgd + lam2d
6646  aavgd = -lam2d
6647  else
6648  aavgd = lam2d
6649  unavgd = unavgd - lam2d
6650  end if
6651 branch = myintstack(myintptr)
6652  myintptr = myintptr - 1
6653  if (branch .eq. 0) then
6654  unavgd = unavgd + lam1d
6655  aavgd = aavgd + lam1d
6656  else
6657  unavgd = unavgd - lam1d
6658  aavgd = aavgd - lam1d
6659  end if
6660  abs1d = half*etad
6661  abs2d = half*etad
6662 branch = myintstack(myintptr)
6663  myintptr = myintptr - 1
6664  if (branch .eq. 0) then
6665  x2d = abs2d
6666  else
6667  x2d = -abs2d
6668  end if
6669  temp1 = left(irhoe)/left(irho)
6670  temp0 = right(irhoe)/right(irho)
6671  if (gammaface*temp1 .eq. 0.0_8) then
6672  tempd0 = 0.0_8
6673  else
6674  tempd0 = gammaface*x2d/(left(irho)*2.0*sqrt(gammaface*temp1)&
6675 & )
6676  end if
6677  if (gammaface*temp0 .eq. 0.0_8) then
6678  tempd1 = 0.0_8
6679  else
6680  tempd1 = -(gammaface*x2d/(right(irho)*2.0*sqrt(gammaface*&
6681 & temp0)))
6682  end if
6683  rightd(irhoe) = rightd(irhoe) + tempd1
6684  rightd(irho) = rightd(irho) - temp0*tempd1
6685  leftd(irhoe) = leftd(irhoe) + tempd0
6686  leftd(irho) = leftd(irho) - temp1*tempd0
6687 branch = myintstack(myintptr)
6688  myintptr = myintptr - 1
6689  if (branch .eq. 0) then
6690  x1d = -abs1d
6691  else
6692  x1d = abs1d
6693  end if
6694  leftd(ivx) = leftd(ivx) + sx*x1d
6695  rightd(ivx) = rightd(ivx) - sx*x1d
6696  leftd(ivy) = leftd(ivy) + sy*x1d
6697  rightd(ivy) = rightd(ivy) - sy*x1d
6698  leftd(ivz) = leftd(ivz) + sz*x1d
6699  rightd(ivz) = rightd(ivz) - sz*x1d
6700 branch = myintstack(myintptr)
6701  myintptr = myintptr - 1
6702  if (branch .ne. 0) unavgd = 0.0_8
6703  aavgd = aavgd - one*ovaavgd/aavg**2
6704  if (a2avg .eq. 0.0_8) then
6705  a2avgd = -(one*ova2avgd/a2avg**2)
6706  else
6707  a2avgd = aavgd/(2.0*sqrt(a2avg)) - one*ova2avgd/a2avg**2
6708  end if
6709  uavgd = uavgd + sx*unavgd
6710  vavgd = vavgd + sy*unavgd
6711  wavgd = wavgd + sz*unavgd
6712 branch = myintstack(myintptr)
6713  myintptr = myintptr - 1
6714  if (branch .eq. 0) then
6715  havgd = havgd + gm1*a2avgd
6716  alphaavgd = alphaavgd - gm1*a2avgd
6717  kavgd = -(gm53*a2avgd)
6718  else
6719  kavgd = gm53*a2avgd
6720  havgd = havgd - gm1*a2avgd
6721  alphaavgd = alphaavgd + gm1*a2avgd
6722  end if
6723  tempd0 = half*alphaavgd
6724  uavgd = uavgd + 2*uavg*tempd0
6725  vavgd = vavgd + 2*vavg*tempd0
6726  wavgd = wavgd + 2*wavg*tempd0
6727  tmp = one/(z1l+z1r)
6728  temp = (etr+right(irhoe))/z1r
6729  temp0 = (etl+left(irhoe))/z1l
6730  tmpd = (temp0+temp)*havgd + (z1l*left(ivz)+z1r*right(ivz))*&
6731 & wavgd + (z1l*left(ivy)+z1r*right(ivy))*vavgd + (z1l*left(ivx&
6732 & )+z1r*right(ivx))*uavgd
6733  tempd0 = tmp*havgd
6734  tempd1 = tempd0/z1l
6735  tempd = tempd0/z1r
6736  etrd = tempd + dred
6737  rightd(irhoe) = rightd(irhoe) + tempd
6738  z1rd = -(temp*tempd)
6739  etld = tempd1 - dred
6740  leftd(irhoe) = leftd(irhoe) + tempd1
6741  tempd = tmp*wavgd
6742  z1ld = left(ivz)*tempd - temp0*tempd1
6743  leftd(ivz) = leftd(ivz) + z1l*tempd
6744  z1rd = z1rd + right(ivz)*tempd
6745  rightd(ivz) = rightd(ivz) + z1r*tempd
6746  tempd = tmp*vavgd
6747  z1ld = z1ld + left(ivy)*tempd
6748  leftd(ivy) = leftd(ivy) + z1l*tempd
6749  z1rd = z1rd + right(ivy)*tempd
6750  rightd(ivy) = rightd(ivy) + z1r*tempd
6751  tempd = tmp*uavgd
6752  z1ld = z1ld + left(ivx)*tempd
6753  leftd(ivx) = leftd(ivx) + z1l*tempd
6754  z1rd = z1rd + right(ivx)*tempd
6755  rightd(ivx) = rightd(ivx) + z1r*tempd
6756  rightd(irho) = rightd(irho) + right(ivz)*drwd
6757  rightd(ivz) = rightd(ivz) + right(irho)*drwd
6758  leftd(irho) = leftd(irho) - left(ivz)*drwd
6759  leftd(ivz) = leftd(ivz) - left(irho)*drwd
6760  rightd(irho) = rightd(irho) + right(ivy)*drvd
6761  rightd(ivy) = rightd(ivy) + right(irho)*drvd
6762  leftd(irho) = leftd(irho) - left(ivy)*drvd
6763  leftd(ivy) = leftd(ivy) - left(irho)*drvd
6764  rightd(irho) = rightd(irho) + right(ivx)*drud
6765  rightd(ivx) = rightd(ivx) + right(irho)*drud
6766  leftd(irho) = leftd(irho) - left(ivx)*drud
6767  leftd(ivx) = leftd(ivx) - left(irho)*drud
6768  rightd(irho) = rightd(irho) + drd
6769  leftd(irho) = leftd(irho) - drd
6770  ktmpd = 0.0_8
6771  call etot_fast_b(right(irho), rightd(irho), right(ivx), rightd&
6772 & (ivx), right(ivy), rightd(ivy), right(ivz), rightd(&
6773 & ivz), right(irhoe), rightd(irhoe), ktmp(2), ktmpd(2&
6774 & ), etr, etrd, correctfork)
6775  call etot_fast_b(left(irho), leftd(irho), left(ivx), leftd(ivx&
6776 & ), left(ivy), leftd(ivy), left(ivz), leftd(ivz), &
6777 & left(irhoe), leftd(irhoe), ktmp(1), ktmpd(1), etl, &
6778 & etld, correctfork)
6779 branch = myintstack(myintptr)
6780  myintptr = myintptr - 1
6781  if (branch .ne. 0) then
6782  tmpd = tmpd + (z1l*left(itu1)+z1r*right(itu1))*kavgd
6783  tempd = tmp*kavgd
6784  z1ld = z1ld + left(itu1)*tempd
6785  leftd(itu1) = leftd(itu1) + z1l*tempd
6786  z1rd = z1rd + right(itu1)*tempd
6787  rightd(itu1) = rightd(itu1) + z1r*tempd
6788  rightd(irho) = rightd(irho) + right(itu1)*drkd
6789  rightd(itu1) = rightd(itu1) + right(irho)*drkd + ktmpd(2)
6790  leftd(irho) = leftd(irho) - left(itu1)*drkd
6791  leftd(itu1) = leftd(itu1) + ktmpd(1) - left(irho)*drkd
6792  ktmpd(2) = 0.0_8
6793  end if
6794  tempd = -(one*tmpd/(z1l+z1r)**2)
6795  z1ld = z1ld + tempd
6796  z1rd = z1rd + tempd
6797  if (.not.right(irho) .eq. 0.0_8) rightd(irho) = rightd(irho) +&
6798 & z1rd/(2.0*sqrt(right(irho)))
6799  if (.not.left(irho) .eq. 0.0_8) leftd(irho) = leftd(irho) + &
6800 & z1ld/(2.0*sqrt(left(irho)))
6801  end select
6802  end select
6803  end subroutine riemannflux_fast_b
6804 
6805 ! ================================================================
6806  subroutine riemannflux(left, right, flux)
6807  implicit none
6808 !
6809 ! subroutine arguments.
6810 !
6811  real(kind=realtype), dimension(*), intent(in) :: left, right
6812  real(kind=realtype), dimension(*), intent(out) :: flux
6813 !
6814 ! local variables.
6815 !
6816  real(kind=realtype) :: porflux, rface
6817  real(kind=realtype) :: etl, etr, z1l, z1r, tmp
6818  real(kind=realtype) :: dr, dru, drv, drw, dre, drk
6819  real(kind=realtype) :: ravg, uavg, vavg, wavg, havg, kavg
6820  real(kind=realtype) :: alphaavg, a2avg, aavg, unavg
6821  real(kind=realtype) :: ovaavg, ova2avg, area, eta
6822  real(kind=realtype) :: gm1, gm53
6823  real(kind=realtype) :: lam1, lam2, lam3
6824  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
6825  real(kind=realtype), dimension(2) :: ktmp
6826  intrinsic sqrt
6827  intrinsic max
6828  intrinsic abs
6829  real(kind=realtype) :: x1
6830  real(kind=realtype) :: x2
6831  real(realtype) :: max2
6832  real(kind=realtype) :: abs1
6833  real(kind=realtype) :: abs2
6834 ! set the porosity for the flux. the default value, 0.5*rfil, is
6835 ! a scaling factor where an rfil != 1 is taken into account.
6836  porflux = half*rfil
6837  if (por .eq. noflux .or. por .eq. boundflux) porflux = zero
6838 ! abbreviate some expressions in which gamma occurs.
6839  gm1 = gammaface - one
6840  gm53 = gammaface - five*third
6841 ! determine which riemann solver must be solved.
6842  select case (riemannused)
6843  case (roe)
6844 ! determine the preconditioner used.
6845  select case (precond)
6846  case (noprecond)
6847 ! no preconditioner used. use the roe scheme of the
6848 ! standard equations.
6849 ! compute the square root of the left and right densities
6850 ! and the inverse of the sum.
6851  z1l = sqrt(left(irho))
6852  z1r = sqrt(right(irho))
6853  tmp = one/(z1l+z1r)
6854 ! compute some variables depending whether or not a
6855 ! k-equation is present.
6856  if (correctfork) then
6857 ! store the left and right kinetic energy in ktmp,
6858 ! which is needed to compute the total energy.
6859  ktmp(1) = left(itu1)
6860  ktmp(2) = right(itu1)
6861 ! store the difference of the turbulent kinetic energy
6862 ! per unit volume, i.e. the conserved variable.
6863  drk = right(irho)*right(itu1) - left(irho)*left(itu1)
6864 ! compute the average turbulent energy per unit mass
6865 ! using roe averages.
6866  kavg = tmp*(z1l*left(itu1)+z1r*right(itu1))
6867  else
6868 ! set the difference of the turbulent kinetic energy
6869 ! per unit volume and the averaged kinetic energy per
6870 ! unit mass to zero.
6871  drk = 0.0
6872  kavg = 0.0
6873  end if
6874 ! compute the total energy of the left and right state.
6875  call etot(left(irho), left(ivx), left(ivy), left(ivz), left(&
6876 & irhoe), ktmp(1), etl, correctfork)
6877  call etot(right(irho), right(ivx), right(ivy), right(ivz), &
6878 & right(irhoe), ktmp(2), etr, correctfork)
6879 ! compute the difference of the conservative mean
6880 ! flow variables.
6881  dr = right(irho) - left(irho)
6882  dru = right(irho)*right(ivx) - left(irho)*left(ivx)
6883  drv = right(irho)*right(ivy) - left(irho)*left(ivy)
6884  drw = right(irho)*right(ivz) - left(irho)*left(ivz)
6885  dre = etr - etl
6886 ! compute the roe average variables, which can be
6887 ! computed directly from the average roe vector.
6888  ravg = fourth*(z1r+z1l)**2
6889  uavg = tmp*(z1l*left(ivx)+z1r*right(ivx))
6890  vavg = tmp*(z1l*left(ivy)+z1r*right(ivy))
6891  wavg = tmp*(z1l*left(ivz)+z1r*right(ivz))
6892  havg = tmp*((etl+left(irhoe))/z1l+(etr+right(irhoe))/z1r)
6893 ! compute the unit vector and store the area of the
6894 ! normal. also compute the unit normal velocity of the face.
6895  area = sqrt(sx**2 + sy**2 + sz**2)
6896  if (1.e-25_realtype .lt. area) then
6897  max2 = area
6898  else
6899  max2 = 1.e-25_realtype
6900  end if
6901  tmp = one/max2
6902  sx = sx*tmp
6903  sy = sy*tmp
6904  sz = sz*tmp
6905  rface = sface*tmp
6906 ! compute some dependent variables at the roe
6907 ! average state.
6908  alphaavg = half*(uavg**2+vavg**2+wavg**2)
6909  if (gm1*(havg-alphaavg) - gm53*kavg .ge. 0.) then
6910  a2avg = gm1*(havg-alphaavg) - gm53*kavg
6911  else
6912  a2avg = -(gm1*(havg-alphaavg)-gm53*kavg)
6913  end if
6914  aavg = sqrt(a2avg)
6915  unavg = uavg*sx + vavg*sy + wavg*sz
6916  ovaavg = one/aavg
6917  ova2avg = one/a2avg
6918 ! set for a boundary the normal velocity to rface, the
6919 ! normal velocity of the boundary.
6920  if (por .eq. boundflux) unavg = rface
6921  x1 = (left(ivx)-right(ivx))*sx + (left(ivy)-right(ivy))*sy + (&
6922 & left(ivz)-right(ivz))*sz
6923  if (x1 .ge. 0.) then
6924  abs1 = x1
6925  else
6926  abs1 = -x1
6927  end if
6928  x2 = sqrt(gammaface*left(irhoe)/left(irho)) - sqrt(gammaface*&
6929 & right(irhoe)/right(irho))
6930  if (x2 .ge. 0.) then
6931  abs2 = x2
6932  else
6933  abs2 = -x2
6934  end if
6935 ! compute the coefficient eta for the entropy correction.
6936 ! at the moment a 1d entropy correction is used, which
6937 ! removes expansion shocks. although it also reduces the
6938 ! carbuncle phenomenon, it does not remove it completely.
6939 ! in other to do that a multi-dimensional entropy fix is
6940 ! needed, see sanders et. al, jcp, vol. 145, 1998,
6941 ! pp. 511 - 537. although relatively easy to implement,
6942 ! an efficient implementation requires the storage of
6943 ! all the left and right states, which is rather
6944 ! expensive in terms of memory.
6945  eta = half*(abs1+abs2)
6946  if (unavg - rface + aavg .ge. 0.) then
6947  lam1 = unavg - rface + aavg
6948  else
6949  lam1 = -(unavg-rface+aavg)
6950  end if
6951  if (unavg - rface - aavg .ge. 0.) then
6952  lam2 = unavg - rface - aavg
6953  else
6954  lam2 = -(unavg-rface-aavg)
6955  end if
6956  if (unavg - rface .ge. 0.) then
6957  lam3 = unavg - rface
6958  else
6959  lam3 = -(unavg-rface)
6960  end if
6961 ! apply the entropy correction to the eigenvalues.
6962  tmp = two*eta
6963  if (lam1 .lt. tmp) lam1 = eta + fourth*lam1*lam1/eta
6964  if (lam2 .lt. tmp) lam2 = eta + fourth*lam2*lam2/eta
6965  if (lam3 .lt. tmp) lam3 = eta + fourth*lam3*lam3/eta
6966 ! multiply the eigenvalues by the area to obtain
6967 ! the correct values for the dissipation term.
6968  lam1 = lam1*area
6969  lam2 = lam2*area
6970  lam3 = lam3*area
6971 ! some abbreviations, which occur quite often in the
6972 ! dissipation terms.
6973  abv1 = half*(lam1+lam2)
6974  abv2 = half*(lam1-lam2)
6975  abv3 = abv1 - lam3
6976  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53&
6977 & *drk
6978  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
6979  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
6980  abv7 = abv2*abv4*ovaavg + abv3*abv5
6981 ! compute the dissipation term, -|a| (wr - wl), which is
6982 ! multiplied by porflux. note that porflux is either
6983 ! 0.0 or 0.5*rfil.
6984  flux(irho) = -(porflux*(lam3*dr+abv6))
6985  flux(imx) = -(porflux*(lam3*dru+uavg*abv6+sx*abv7))
6986  flux(imy) = -(porflux*(lam3*drv+vavg*abv6+sy*abv7))
6987  flux(imz) = -(porflux*(lam3*drw+wavg*abv6+sz*abv7))
6988  flux(irhoe) = -(porflux*(lam3*dre+havg*abv6+unavg*abv7))
6989 ! tmp = max(lam1,lam2,lam3)
6990 ! flux(irho) = -porflux*(tmp*dr)
6991 ! flux(imx) = -porflux*(tmp*dru)
6992 ! flux(imy) = -porflux*(tmp*drv)
6993 ! flux(imz) = -porflux*(tmp*drw)
6994 ! flux(irhoe) = -porflux*(tmp*dre)
6995  case (turkel)
6996  call terminate('riemannflux', &
6997 & 'turkel preconditioner not implemented yet')
6998  case (choimerkle)
6999  call terminate('riemannflux', &
7000 & 'choi merkle preconditioner not implemented yet')
7001  end select
7002  case (vanleer)
7003  call terminate('riemannflux', 'van leer fvs not implemented yet'&
7004 & )
7005  case (ausmdv)
7006  call terminate('riemannflux', 'ausmdv fvs not implemented yet')
7007  end select
7008  end subroutine riemannflux
7009 
7010  end subroutine inviscidupwindflux_fast_b
7011 
7012  subroutine inviscidupwindflux(finegrid)
7013 !
7014 ! inviscidupwindflux computes the artificial dissipation part of
7015 ! the euler fluxes by means of an approximate solution of the 1d
7016 ! riemann problem on the face. for first order schemes,
7017 ! finegrid == .false., the states in the cells are assumed to
7018 ! be constant; for the second order schemes on the fine grid a
7019 ! nonlinear reconstruction of the left and right state is done
7020 ! for which several options exist.
7021 ! it is assumed that the pointers in blockpointers already
7022 ! point to the correct block.
7023 !
7024  use constants
7025  use blockpointers, only : il, jl, kl, ie, je, ke, ib, jb, kb,&
7026 & w, p, pori, porj, pork, fw, gamma, si, sj, sk, indfamilyi, &
7030  use flowvarrefstate, only : kpresent, nw, nwf, rgas, tref
7033  use inputphysics, only : equations
7034  use iteration, only : rfil, currentlevel, groundlevel
7035  use cgnsgrid, only : massflowfamilydiss
7037  use flowutils_fast_b, only : etot
7038  implicit none
7039 !
7040 ! subroutine arguments.
7041 !
7042  logical, intent(in) :: finegrid
7043 !
7044 ! local variables.
7045 !
7046  integer(kind=portype) :: por
7047  integer(kind=inttype) :: nwint
7048  integer(kind=inttype) :: i, j, k, ind
7049  integer(kind=inttype) :: limused, riemannused
7050  real(kind=realtype) :: sx, sy, sz, omk, opk, sfil, gammaface
7051  real(kind=realtype) :: factminmod, sface
7052  real(kind=realtype), dimension(nw) :: left, right
7053  real(kind=realtype), dimension(nw) :: du1, du2, du3
7054  real(kind=realtype), dimension(nwf) :: flux
7055  logical :: firstorderk, correctfork, rotationalperiodic
7056  intrinsic abs
7057  intrinsic associated
7058  intrinsic max
7059  real(kind=realtype) :: abs0
7060  real(realtype) :: max1
7061  if (rfil .ge. 0.) then
7062  abs0 = rfil
7063  else
7064  abs0 = -rfil
7065  end if
7066 !
7067 ! check if rfil == 0. if so, the dissipative flux needs not to
7068 ! be computed.
7069  if (abs0 .lt. thresholdreal) then
7070  return
7071  else
7072 ! check if the formulation for rotational periodic problems
7073 ! must be used.
7074  if (associated(rotmatrixi)) then
7075  rotationalperiodic = .true.
7076  else
7077  rotationalperiodic = .false.
7078  end if
7079 ! initialize the dissipative residual to a certain times,
7080 ! possibly zero, the previously stored value. owned cells
7081 ! only, because the halo values do not matter.
7082  sfil = one - rfil
7083  do k=2,kl
7084  do j=2,jl
7085  do i=2,il
7086  fw(i, j, k, irho) = sfil*fw(i, j, k, irho)
7087  fw(i, j, k, imx) = sfil*fw(i, j, k, imx)
7088  fw(i, j, k, imy) = sfil*fw(i, j, k, imy)
7089  fw(i, j, k, imz) = sfil*fw(i, j, k, imz)
7090  fw(i, j, k, irhoe) = sfil*fw(i, j, k, irhoe)
7091  end do
7092  end do
7093  end do
7094 ! determine whether or not the total energy must be corrected
7095 ! for the presence of the turbulent kinetic energy.
7096  correctfork = getcorrectfork()
7097  if (1.e-10_realtype .lt. one - kappacoef) then
7098  max1 = one - kappacoef
7099  else
7100  max1 = 1.e-10_realtype
7101  end if
7102 ! compute the factor used in the minmod limiter.
7103  factminmod = (three-kappacoef)/max1
7104 ! determine the limiter scheme to be used. on the fine grid the
7105 ! user specified scheme is used; on the coarse grid a first order
7106 ! scheme is computed.
7107  limused = firstorder
7108  if (finegrid) limused = limiter
7109 ! lumped diss is true for doing approx pc
7110  if (lumpeddiss) limused = firstorder
7111 ! determine the riemann solver which must be used.
7112  riemannused = riemanncoarse
7113  if (finegrid) riemannused = riemann
7114 ! store 1-kappa and 1+kappa a bit easier and multiply it by 0.25.
7115  omk = fourth*(one-kappacoef)
7116  opk = fourth*(one+kappacoef)
7117 ! initialize sface to zero. this value will be used if the
7118 ! block is not moving.
7119  sface = zero
7120 ! set the number of variables to be interpolated depending
7121 ! whether or not a k-equation is present. if a k-equation is
7122 ! present also set the logical firstorderk. this indicates
7123 ! whether or not only a first order approximation is to be used
7124 ! for the turbulent kinetic energy.
7125  if (correctfork) then
7126  if (orderturb .eq. firstorder) then
7127  nwint = nwf
7128  firstorderk = .true.
7129  else
7130  nwint = itu1
7131  firstorderk = .false.
7132  end if
7133  else
7134  nwint = nwf
7135  firstorderk = .false.
7136  end if
7137 !
7138 ! flux computation. a distinction is made between first and
7139 ! second order schemes to avoid the overhead for the first order
7140 ! scheme.
7141 !
7142  if (limused .eq. firstorder) then
7143 !
7144 ! first order reconstruction. the states in the cells are
7145 ! constant. the left and right states are constructed easily.
7146 !
7147 ! fluxes in the i-direction.
7148  do k=2,kl
7149  do j=2,jl
7150  do i=1,il
7151 ! store the normal vector, the porosity and the
7152 ! mesh velocity if present.
7153  sx = si(i, j, k, 1)
7154  sy = si(i, j, k, 2)
7155  sz = si(i, j, k, 3)
7156  por = pori(i, j, k)
7157  if (addgridvelocities) sface = sfacei(i, j, k)
7158 ! determine the left and right state.
7159  left(irho) = w(i, j, k, irho)
7160  left(ivx) = w(i, j, k, ivx)
7161  left(ivy) = w(i, j, k, ivy)
7162  left(ivz) = w(i, j, k, ivz)
7163  left(irhoe) = p(i, j, k)
7164  if (correctfork) left(itu1) = w(i, j, k, itu1)
7165  right(irho) = w(i+1, j, k, irho)
7166  right(ivx) = w(i+1, j, k, ivx)
7167  right(ivy) = w(i+1, j, k, ivy)
7168  right(ivz) = w(i+1, j, k, ivz)
7169  right(irhoe) = p(i+1, j, k)
7170  if (correctfork) right(itu1) = w(i+1, j, k, itu1)
7171 ! compute the value of gamma on the face. take an
7172 ! arithmetic average of the two states.
7173  gammaface = half*(gamma(i, j, k)+gamma(i+1, j, k))
7174 ! compute the dissipative flux across the interface.
7175  call riemannflux(left, right, flux)
7176 ! and scatter it to the left and right.
7177  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
7178  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
7179  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
7180  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
7181  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
7182  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) - flux(irho)
7183  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) - flux(imx)
7184  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) - flux(imy)
7185  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) - flux(imz)
7186  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) - flux(irhoe)
7187 ! store the density flux in the mass flow of the
7188 ! appropriate sliding mesh interface.
7189  end do
7190  end do
7191  end do
7192 ! fluxes in j-direction.
7193  do k=2,kl
7194  do j=1,jl
7195  do i=2,il
7196 ! store the normal vector, the porosity and the
7197 ! mesh velocity if present.
7198  sx = sj(i, j, k, 1)
7199  sy = sj(i, j, k, 2)
7200  sz = sj(i, j, k, 3)
7201  por = porj(i, j, k)
7202  if (addgridvelocities) sface = sfacej(i, j, k)
7203 ! determine the left and right state.
7204  left(irho) = w(i, j, k, irho)
7205  left(ivx) = w(i, j, k, ivx)
7206  left(ivy) = w(i, j, k, ivy)
7207  left(ivz) = w(i, j, k, ivz)
7208  left(irhoe) = p(i, j, k)
7209  if (correctfork) left(itu1) = w(i, j, k, itu1)
7210  right(irho) = w(i, j+1, k, irho)
7211  right(ivx) = w(i, j+1, k, ivx)
7212  right(ivy) = w(i, j+1, k, ivy)
7213  right(ivz) = w(i, j+1, k, ivz)
7214  right(irhoe) = p(i, j+1, k)
7215  if (correctfork) right(itu1) = w(i, j+1, k, itu1)
7216 ! compute the value of gamma on the face. take an
7217 ! arithmetic average of the two states.
7218  gammaface = half*(gamma(i, j, k)+gamma(i, j+1, k))
7219 ! compute the dissipative flux across the interface.
7220  call riemannflux(left, right, flux)
7221 ! and scatter it to the left and right.
7222  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
7223  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
7224  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
7225  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
7226  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
7227  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) - flux(irho)
7228  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) - flux(imx)
7229  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) - flux(imy)
7230  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) - flux(imz)
7231  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) - flux(irhoe)
7232 ! store the density flux in the mass flow of the
7233 ! appropriate sliding mesh interface.
7234  end do
7235  end do
7236  end do
7237 ! fluxes in k-direction.
7238  do k=1,kl
7239  do j=2,jl
7240  do i=2,il
7241 ! store the normal vector, the porosity and the
7242 ! mesh velocity if present.
7243  sx = sk(i, j, k, 1)
7244  sy = sk(i, j, k, 2)
7245  sz = sk(i, j, k, 3)
7246  por = pork(i, j, k)
7247  if (addgridvelocities) sface = sfacek(i, j, k)
7248 ! determine the left and right state.
7249  left(irho) = w(i, j, k, irho)
7250  left(ivx) = w(i, j, k, ivx)
7251  left(ivy) = w(i, j, k, ivy)
7252  left(ivz) = w(i, j, k, ivz)
7253  left(irhoe) = p(i, j, k)
7254  if (correctfork) left(itu1) = w(i, j, k, itu1)
7255  right(irho) = w(i, j, k+1, irho)
7256  right(ivx) = w(i, j, k+1, ivx)
7257  right(ivy) = w(i, j, k+1, ivy)
7258  right(ivz) = w(i, j, k+1, ivz)
7259  right(irhoe) = p(i, j, k+1)
7260  if (correctfork) right(itu1) = w(i, j, k+1, itu1)
7261 ! compute the value of gamma on the face. take an
7262 ! arithmetic average of the two states.
7263  gammaface = half*(gamma(i, j, k)+gamma(i, j, k+1))
7264 ! compute the dissipative flux across the interface.
7265  call riemannflux(left, right, flux)
7266 ! and scatter it the left and right.
7267  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
7268  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
7269  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
7270  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
7271  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
7272  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) - flux(irho)
7273  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) - flux(imx)
7274  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) - flux(imy)
7275  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) - flux(imz)
7276  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) - flux(irhoe)
7277 ! store the density flux in the mass flow of the
7278 ! appropriate sliding mesh interface.
7279  end do
7280  end do
7281  end do
7282  else
7283 ! ==================================================================
7284 ! ==================================================================
7285 !
7286 ! second order reconstruction of the left and right state.
7287 ! the three differences used in the, possibly nonlinear,
7288 ! interpolation are constructed here; the actual left and
7289 ! right states, or at least the differences from the first
7290 ! order interpolation, are computed in the subroutine
7291 ! leftrightstate.
7292 !
7293 ! fluxes in the i-direction.
7294  do k=2,kl
7295  do j=2,jl
7296  do i=1,il
7297 ! store the three differences used in the interpolation
7298 ! in du1, du2, du3.
7299  du1(irho) = w(i, j, k, irho) - w(i-1, j, k, irho)
7300  du2(irho) = w(i+1, j, k, irho) - w(i, j, k, irho)
7301  du3(irho) = w(i+2, j, k, irho) - w(i+1, j, k, irho)
7302  du1(ivx) = w(i, j, k, ivx) - w(i-1, j, k, ivx)
7303  du2(ivx) = w(i+1, j, k, ivx) - w(i, j, k, ivx)
7304  du3(ivx) = w(i+2, j, k, ivx) - w(i+1, j, k, ivx)
7305  du1(ivy) = w(i, j, k, ivy) - w(i-1, j, k, ivy)
7306  du2(ivy) = w(i+1, j, k, ivy) - w(i, j, k, ivy)
7307  du3(ivy) = w(i+2, j, k, ivy) - w(i+1, j, k, ivy)
7308  du1(ivz) = w(i, j, k, ivz) - w(i-1, j, k, ivz)
7309  du2(ivz) = w(i+1, j, k, ivz) - w(i, j, k, ivz)
7310  du3(ivz) = w(i+2, j, k, ivz) - w(i+1, j, k, ivz)
7311  du1(irhoe) = p(i, j, k) - p(i-1, j, k)
7312  du2(irhoe) = p(i+1, j, k) - p(i, j, k)
7313  du3(irhoe) = p(i+2, j, k) - p(i+1, j, k)
7314  if (correctfork) then
7315  du1(itu1) = w(i, j, k, itu1) - w(i-1, j, k, itu1)
7316  du2(itu1) = w(i+1, j, k, itu1) - w(i, j, k, itu1)
7317  du3(itu1) = w(i+2, j, k, itu1) - w(i+1, j, k, itu1)
7318  end if
7319 ! compute the differences from the first order scheme.
7320  call leftrightstate(du1, du2, du3, rotmatrixi, left, right&
7321 & )
7322 ! add the first order part to the currently stored
7323 ! differences, such that the correct state vector
7324 ! is stored.
7325  left(irho) = left(irho) + w(i, j, k, irho)
7326  left(ivx) = left(ivx) + w(i, j, k, ivx)
7327  left(ivy) = left(ivy) + w(i, j, k, ivy)
7328  left(ivz) = left(ivz) + w(i, j, k, ivz)
7329  left(irhoe) = left(irhoe) + p(i, j, k)
7330  right(irho) = right(irho) + w(i+1, j, k, irho)
7331  right(ivx) = right(ivx) + w(i+1, j, k, ivx)
7332  right(ivy) = right(ivy) + w(i+1, j, k, ivy)
7333  right(ivz) = right(ivz) + w(i+1, j, k, ivz)
7334  right(irhoe) = right(irhoe) + p(i+1, j, k)
7335  if (correctfork) then
7336  left(itu1) = left(itu1) + w(i, j, k, itu1)
7337  right(itu1) = right(itu1) + w(i+1, j, k, itu1)
7338  end if
7339 ! store the normal vector, the porosity and the
7340 ! mesh velocity if present.
7341  sx = si(i, j, k, 1)
7342  sy = si(i, j, k, 2)
7343  sz = si(i, j, k, 3)
7344  por = pori(i, j, k)
7345  if (addgridvelocities) sface = sfacei(i, j, k)
7346 ! compute the value of gamma on the face. take an
7347 ! arithmetic average of the two states.
7348  gammaface = half*(gamma(i, j, k)+gamma(i+1, j, k))
7349 ! compute the dissipative flux across the interface.
7350  call riemannflux(left, right, flux)
7351 ! and scatter it to the left and right.
7352  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
7353  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
7354  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
7355  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
7356  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
7357  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) - flux(irho)
7358  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) - flux(imx)
7359  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) - flux(imy)
7360  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) - flux(imz)
7361  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) - flux(irhoe)
7362 ! store the density flux in the mass flow of the
7363 ! appropriate sliding mesh interface.
7364  end do
7365  end do
7366  end do
7367 ! fluxes in the j-direction.
7368  do k=2,kl
7369  do j=1,jl
7370  do i=2,il
7371 ! store the three differences used in the interpolation
7372 ! in du1, du2, du3.
7373  du1(irho) = w(i, j, k, irho) - w(i, j-1, k, irho)
7374  du2(irho) = w(i, j+1, k, irho) - w(i, j, k, irho)
7375  du3(irho) = w(i, j+2, k, irho) - w(i, j+1, k, irho)
7376  du1(ivx) = w(i, j, k, ivx) - w(i, j-1, k, ivx)
7377  du2(ivx) = w(i, j+1, k, ivx) - w(i, j, k, ivx)
7378  du3(ivx) = w(i, j+2, k, ivx) - w(i, j+1, k, ivx)
7379  du1(ivy) = w(i, j, k, ivy) - w(i, j-1, k, ivy)
7380  du2(ivy) = w(i, j+1, k, ivy) - w(i, j, k, ivy)
7381  du3(ivy) = w(i, j+2, k, ivy) - w(i, j+1, k, ivy)
7382  du1(ivz) = w(i, j, k, ivz) - w(i, j-1, k, ivz)
7383  du2(ivz) = w(i, j+1, k, ivz) - w(i, j, k, ivz)
7384  du3(ivz) = w(i, j+2, k, ivz) - w(i, j+1, k, ivz)
7385  du1(irhoe) = p(i, j, k) - p(i, j-1, k)
7386  du2(irhoe) = p(i, j+1, k) - p(i, j, k)
7387  du3(irhoe) = p(i, j+2, k) - p(i, j+1, k)
7388  if (correctfork) then
7389  du1(itu1) = w(i, j, k, itu1) - w(i, j-1, k, itu1)
7390  du2(itu1) = w(i, j+1, k, itu1) - w(i, j, k, itu1)
7391  du3(itu1) = w(i, j+2, k, itu1) - w(i, j+1, k, itu1)
7392  end if
7393 ! compute the differences from the first order scheme.
7394  call leftrightstate(du1, du2, du3, rotmatrixj, left, right&
7395 & )
7396 ! add the first order part to the currently stored
7397 ! differences, such that the correct state vector
7398 ! is stored.
7399  left(irho) = left(irho) + w(i, j, k, irho)
7400  left(ivx) = left(ivx) + w(i, j, k, ivx)
7401  left(ivy) = left(ivy) + w(i, j, k, ivy)
7402  left(ivz) = left(ivz) + w(i, j, k, ivz)
7403  left(irhoe) = left(irhoe) + p(i, j, k)
7404  right(irho) = right(irho) + w(i, j+1, k, irho)
7405  right(ivx) = right(ivx) + w(i, j+1, k, ivx)
7406  right(ivy) = right(ivy) + w(i, j+1, k, ivy)
7407  right(ivz) = right(ivz) + w(i, j+1, k, ivz)
7408  right(irhoe) = right(irhoe) + p(i, j+1, k)
7409  if (correctfork) then
7410  left(itu1) = left(itu1) + w(i, j, k, itu1)
7411  right(itu1) = right(itu1) + w(i, j+1, k, itu1)
7412  end if
7413 ! store the normal vector, the porosity and the
7414 ! mesh velocity if present.
7415  sx = sj(i, j, k, 1)
7416  sy = sj(i, j, k, 2)
7417  sz = sj(i, j, k, 3)
7418  por = porj(i, j, k)
7419  if (addgridvelocities) sface = sfacej(i, j, k)
7420 ! compute the value of gamma on the face. take an
7421 ! arithmetic average of the two states.
7422  gammaface = half*(gamma(i, j, k)+gamma(i, j+1, k))
7423 ! compute the dissipative flux across the interface.
7424  call riemannflux(left, right, flux)
7425 ! and scatter it to the left and right.
7426  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
7427  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
7428  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
7429  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
7430  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
7431  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) - flux(irho)
7432  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) - flux(imx)
7433  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) - flux(imy)
7434  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) - flux(imz)
7435  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) - flux(irhoe)
7436 ! store the density flux in the mass flow of the
7437 ! appropriate sliding mesh interface.
7438  end do
7439  end do
7440  end do
7441 ! fluxes in the k-direction.
7442  do k=1,kl
7443  do j=2,jl
7444  do i=2,il
7445 ! store the three differences used in the interpolation
7446 ! in du1, du2, du3.
7447  du1(irho) = w(i, j, k, irho) - w(i, j, k-1, irho)
7448  du2(irho) = w(i, j, k+1, irho) - w(i, j, k, irho)
7449  du3(irho) = w(i, j, k+2, irho) - w(i, j, k+1, irho)
7450  du1(ivx) = w(i, j, k, ivx) - w(i, j, k-1, ivx)
7451  du2(ivx) = w(i, j, k+1, ivx) - w(i, j, k, ivx)
7452  du3(ivx) = w(i, j, k+2, ivx) - w(i, j, k+1, ivx)
7453  du1(ivy) = w(i, j, k, ivy) - w(i, j, k-1, ivy)
7454  du2(ivy) = w(i, j, k+1, ivy) - w(i, j, k, ivy)
7455  du3(ivy) = w(i, j, k+2, ivy) - w(i, j, k+1, ivy)
7456  du1(ivz) = w(i, j, k, ivz) - w(i, j, k-1, ivz)
7457  du2(ivz) = w(i, j, k+1, ivz) - w(i, j, k, ivz)
7458  du3(ivz) = w(i, j, k+2, ivz) - w(i, j, k+1, ivz)
7459  du1(irhoe) = p(i, j, k) - p(i, j, k-1)
7460  du2(irhoe) = p(i, j, k+1) - p(i, j, k)
7461  du3(irhoe) = p(i, j, k+2) - p(i, j, k+1)
7462  if (correctfork) then
7463  du1(itu1) = w(i, j, k, itu1) - w(i, j, k-1, itu1)
7464  du2(itu1) = w(i, j, k+1, itu1) - w(i, j, k, itu1)
7465  du3(itu1) = w(i, j, k+2, itu1) - w(i, j, k+1, itu1)
7466  end if
7467 ! compute the differences from the first order scheme.
7468  call leftrightstate(du1, du2, du3, rotmatrixk, left, right&
7469 & )
7470 ! add the first order part to the currently stored
7471 ! differences, such that the correct state vector
7472 ! is stored.
7473  left(irho) = left(irho) + w(i, j, k, irho)
7474  left(ivx) = left(ivx) + w(i, j, k, ivx)
7475  left(ivy) = left(ivy) + w(i, j, k, ivy)
7476  left(ivz) = left(ivz) + w(i, j, k, ivz)
7477  left(irhoe) = left(irhoe) + p(i, j, k)
7478  right(irho) = right(irho) + w(i, j, k+1, irho)
7479  right(ivx) = right(ivx) + w(i, j, k+1, ivx)
7480  right(ivy) = right(ivy) + w(i, j, k+1, ivy)
7481  right(ivz) = right(ivz) + w(i, j, k+1, ivz)
7482  right(irhoe) = right(irhoe) + p(i, j, k+1)
7483  if (correctfork) then
7484  left(itu1) = left(itu1) + w(i, j, k, itu1)
7485  right(itu1) = right(itu1) + w(i, j, k+1, itu1)
7486  end if
7487 ! store the normal vector, the porosity and the
7488 ! mesh velocity if present.
7489  sx = sk(i, j, k, 1)
7490  sy = sk(i, j, k, 2)
7491  sz = sk(i, j, k, 3)
7492  por = pork(i, j, k)
7493  if (addgridvelocities) sface = sfacek(i, j, k)
7494 ! compute the value of gamma on the face. take an
7495 ! arithmetic average of the two states.
7496  gammaface = half*(gamma(i, j, k)+gamma(i, j, k+1))
7497 ! compute the dissipative flux across the interface.
7498  call riemannflux(left, right, flux)
7499 ! and scatter it to the left and right.
7500  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
7501  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
7502  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
7503  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
7504  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
7505  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) - flux(irho)
7506  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) - flux(imx)
7507  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) - flux(imy)
7508  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) - flux(imz)
7509  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) - flux(irhoe)
7510 ! store the density flux in the mass flow of the
7511 ! appropriate sliding mesh interface.
7512  end do
7513  end do
7514  end do
7515  end if
7516  end if
7517 
7518  contains
7519 ! ==================================================================
7520  subroutine leftrightstate(du1, du2, du3, rotmatrix, left, right)
7521  implicit none
7522 !
7523 ! local parameter.
7524 !
7525  real(kind=realtype), parameter :: epslim=1.e-10_realtype
7526 !
7527 ! subroutine arguments.
7528 !
7529  real(kind=realtype), dimension(:), intent(inout) :: du1, du2, du3
7530  real(kind=realtype), dimension(:), intent(out) :: left, right
7531  real(kind=realtype), dimension(:, :, :, :, :), pointer :: &
7532 & rotmatrix
7533 !
7534 ! local variables.
7535 !
7536  integer(kind=inttype) :: l
7537  real(kind=realtype) :: rl1, rl2, rr1, rr2, tmp, dvx, dvy, dvz
7538  real(kind=realtype), dimension(3, 3) :: rot
7539  intrinsic abs
7540  intrinsic max
7541  intrinsic sign
7542  intrinsic min
7543  real(kind=realtype) :: x1
7544  real(kind=realtype) :: y1
7545  real(kind=realtype) :: y2
7546  real(kind=realtype) :: x2
7547  real(kind=realtype) :: y3
7548  real(kind=realtype) :: y4
7549  real(kind=realtype) :: x3
7550  real(kind=realtype) :: x4
7551  real(kind=realtype) :: x5
7552  real(kind=realtype) :: x6
7553  real(kind=realtype) :: max2
7554  real(kind=realtype) :: max3
7555  real(kind=realtype) :: max4
7556  real(kind=realtype) :: max5
7557  real(kind=realtype) :: max6
7558  real(kind=realtype) :: max7
7559 ! check if the velocity components should be transformed to
7560 ! the cylindrical frame.
7561  if (rotationalperiodic) then
7562 ! store the rotation matrix a bit easier. note that the i,j,k
7563 ! come from the main subroutine.
7564  rot(1, 1) = rotmatrix(i, j, k, 1, 1)
7565  rot(1, 2) = rotmatrix(i, j, k, 1, 2)
7566  rot(1, 3) = rotmatrix(i, j, k, 1, 3)
7567  rot(2, 1) = rotmatrix(i, j, k, 2, 1)
7568  rot(2, 2) = rotmatrix(i, j, k, 2, 2)
7569  rot(2, 3) = rotmatrix(i, j, k, 2, 3)
7570  rot(3, 1) = rotmatrix(i, j, k, 3, 1)
7571  rot(3, 2) = rotmatrix(i, j, k, 3, 2)
7572  rot(3, 3) = rotmatrix(i, j, k, 3, 3)
7573 ! apply the transformation to the velocity components
7574 ! of du1, du2 and du3.
7575  dvx = du1(ivx)
7576  dvy = du1(ivy)
7577  dvz = du1(ivz)
7578  du1(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
7579  du1(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
7580  du1(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
7581  dvx = du2(ivx)
7582  dvy = du2(ivy)
7583  dvz = du2(ivz)
7584  du2(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
7585  du2(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
7586  du2(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
7587  dvx = du3(ivx)
7588  dvy = du3(ivy)
7589  dvz = du3(ivz)
7590  du3(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
7591  du3(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
7592  du3(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
7593  end if
7594 ! determine the limiter used.
7595  select case (limused)
7596  case (nolimiter)
7597 ! linear interpolation; no limiter.
7598 ! loop over the number of variables to be interpolated.
7599  do l=1,nwint
7600  left(l) = omk*du1(l) + opk*du2(l)
7601  right(l) = -(omk*du3(l)) - opk*du2(l)
7602  end do
7603  case (vanalbeda)
7604 ! ==============================================================
7605 ! nonlinear interpolation using the van albeda limiter.
7606 ! loop over the number of variables to be interpolated.
7607  do l=1,nwint
7608  if (du2(l) .ge. 0.) then
7609  x1 = du2(l)
7610  else
7611  x1 = -du2(l)
7612  end if
7613  if (x1 .lt. epslim) then
7614  max2 = epslim
7615  else
7616  max2 = x1
7617  end if
7618 ! compute the limiter argument rl1, rl2, rr1 and rr2.
7619 ! note the cut off to 0.0.
7620  tmp = one/sign(max2, du2(l))
7621  if (du1(l) .ge. 0.) then
7622  x3 = du1(l)
7623  else
7624  x3 = -du1(l)
7625  end if
7626  if (x3 .lt. epslim) then
7627  max4 = epslim
7628  else
7629  max4 = x3
7630  end if
7631  y1 = du2(l)/sign(max4, du1(l))
7632  if (zero .lt. y1) then
7633  rl1 = y1
7634  else
7635  rl1 = zero
7636  end if
7637  if (zero .lt. du1(l)*tmp) then
7638  rl2 = du1(l)*tmp
7639  else
7640  rl2 = zero
7641  end if
7642  if (zero .lt. du3(l)*tmp) then
7643  rr1 = du3(l)*tmp
7644  else
7645  rr1 = zero
7646  end if
7647  if (du3(l) .ge. 0.) then
7648  x4 = du3(l)
7649  else
7650  x4 = -du3(l)
7651  end if
7652  if (x4 .lt. epslim) then
7653  max5 = epslim
7654  else
7655  max5 = x4
7656  end if
7657  y2 = du2(l)/sign(max5, du3(l))
7658  if (zero .lt. y2) then
7659  rr2 = y2
7660  else
7661  rr2 = zero
7662  end if
7663 ! compute the corresponding limiter values.
7664  rl1 = rl1*(rl1+one)/(rl1*rl1+one)
7665  rl2 = rl2*(rl2+one)/(rl2*rl2+one)
7666  rr1 = rr1*(rr1+one)/(rr1*rr1+one)
7667  rr2 = rr2*(rr2+one)/(rr2*rr2+one)
7668 ! compute the nonlinear corrections to the first order
7669 ! scheme.
7670  left(l) = omk*rl1*du1(l) + opk*rl2*du2(l)
7671  right(l) = -(opk*rr1*du2(l)) - omk*rr2*du3(l)
7672  end do
7673  case (minmod)
7674 ! ==============================================================
7675 ! nonlinear interpolation using the minmod limiter.
7676 ! loop over the number of variables to be interpolated.
7677  do l=1,nwint
7678  if (du2(l) .ge. 0.) then
7679  x2 = du2(l)
7680  else
7681  x2 = -du2(l)
7682  end if
7683  if (x2 .lt. epslim) then
7684  max3 = epslim
7685  else
7686  max3 = x2
7687  end if
7688 ! compute the limiter argument rl1, rl2, rr1 and rr2.
7689 ! note the cut off to 0.0.
7690  tmp = one/sign(max3, du2(l))
7691  if (du1(l) .ge. 0.) then
7692  x5 = du1(l)
7693  else
7694  x5 = -du1(l)
7695  end if
7696  if (x5 .lt. epslim) then
7697  max6 = epslim
7698  else
7699  max6 = x5
7700  end if
7701  y3 = du2(l)/sign(max6, du1(l))
7702  if (zero .lt. y3) then
7703  rl1 = y3
7704  else
7705  rl1 = zero
7706  end if
7707  if (zero .lt. du1(l)*tmp) then
7708  rl2 = du1(l)*tmp
7709  else
7710  rl2 = zero
7711  end if
7712  if (zero .lt. du3(l)*tmp) then
7713  rr1 = du3(l)*tmp
7714  else
7715  rr1 = zero
7716  end if
7717  if (du3(l) .ge. 0.) then
7718  x6 = du3(l)
7719  else
7720  x6 = -du3(l)
7721  end if
7722  if (x6 .lt. epslim) then
7723  max7 = epslim
7724  else
7725  max7 = x6
7726  end if
7727  y4 = du2(l)/sign(max7, du3(l))
7728  if (zero .lt. y4) then
7729  rr2 = y4
7730  else
7731  rr2 = zero
7732  end if
7733  if (one .gt. factminmod*rl1) then
7734  rl1 = factminmod*rl1
7735  else
7736  rl1 = one
7737  end if
7738  if (one .gt. factminmod*rl2) then
7739  rl2 = factminmod*rl2
7740  else
7741  rl2 = one
7742  end if
7743  if (one .gt. factminmod*rr1) then
7744  rr1 = factminmod*rr1
7745  else
7746  rr1 = one
7747  end if
7748  if (one .gt. factminmod*rr2) then
7749  rr2 = factminmod*rr2
7750  else
7751  rr2 = one
7752  end if
7753 ! compute the nonlinear corrections to the first order
7754 ! scheme.
7755  left(l) = omk*rl1*du1(l) + opk*rl2*du2(l)
7756  right(l) = -(opk*rr1*du2(l)) - omk*rr2*du3(l)
7757  end do
7758  end select
7759 ! in case only a first order scheme must be used for the
7760 ! turbulent transport equations, set the correction for the
7761 ! turbulent kinetic energy to 0.
7762  if (firstorderk) then
7763  left(itu1) = zero
7764  right(itu1) = zero
7765  end if
7766 ! for rotational periodic problems transform the velocity
7767 ! differences back to cartesian again. note that now the
7768 ! transpose of the rotation matrix must be used.
7769  if (rotationalperiodic) then
7770 ! left state.
7771  dvx = left(ivx)
7772  dvy = left(ivy)
7773  dvz = left(ivz)
7774  left(ivx) = rot(1, 1)*dvx + rot(2, 1)*dvy + rot(3, 1)*dvz
7775  left(ivy) = rot(1, 2)*dvx + rot(2, 2)*dvy + rot(3, 2)*dvz
7776  left(ivz) = rot(1, 3)*dvx + rot(2, 3)*dvy + rot(3, 3)*dvz
7777 ! right state.
7778  dvx = right(ivx)
7779  dvy = right(ivy)
7780  dvz = right(ivz)
7781  right(ivx) = rot(1, 1)*dvx + rot(2, 1)*dvy + rot(3, 1)*dvz
7782  right(ivy) = rot(1, 2)*dvx + rot(2, 2)*dvy + rot(3, 2)*dvz
7783  right(ivz) = rot(1, 3)*dvx + rot(2, 3)*dvy + rot(3, 3)*dvz
7784  end if
7785  end subroutine leftrightstate
7786 
7787 ! ================================================================
7788  subroutine riemannflux(left, right, flux)
7789  implicit none
7790 !
7791 ! subroutine arguments.
7792 !
7793  real(kind=realtype), dimension(*), intent(in) :: left, right
7794  real(kind=realtype), dimension(*), intent(out) :: flux
7795 !
7796 ! local variables.
7797 !
7798  real(kind=realtype) :: porflux, rface
7799  real(kind=realtype) :: etl, etr, z1l, z1r, tmp
7800  real(kind=realtype) :: dr, dru, drv, drw, dre, drk
7801  real(kind=realtype) :: ravg, uavg, vavg, wavg, havg, kavg
7802  real(kind=realtype) :: alphaavg, a2avg, aavg, unavg
7803  real(kind=realtype) :: ovaavg, ova2avg, area, eta
7804  real(kind=realtype) :: gm1, gm53
7805  real(kind=realtype) :: lam1, lam2, lam3
7806  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
7807  real(kind=realtype), dimension(2) :: ktmp
7808  intrinsic sqrt
7809  intrinsic max
7810  intrinsic abs
7811  real(kind=realtype) :: x1
7812  real(kind=realtype) :: x2
7813  real(realtype) :: max2
7814  real(kind=realtype) :: abs1
7815  real(kind=realtype) :: abs2
7816 ! set the porosity for the flux. the default value, 0.5*rfil, is
7817 ! a scaling factor where an rfil != 1 is taken into account.
7818  porflux = half*rfil
7819  if (por .eq. noflux .or. por .eq. boundflux) porflux = zero
7820 ! abbreviate some expressions in which gamma occurs.
7821  gm1 = gammaface - one
7822  gm53 = gammaface - five*third
7823 ! determine which riemann solver must be solved.
7824  select case (riemannused)
7825  case (roe)
7826 ! determine the preconditioner used.
7827  select case (precond)
7828  case (noprecond)
7829 ! no preconditioner used. use the roe scheme of the
7830 ! standard equations.
7831 ! compute the square root of the left and right densities
7832 ! and the inverse of the sum.
7833  z1l = sqrt(left(irho))
7834  z1r = sqrt(right(irho))
7835  tmp = one/(z1l+z1r)
7836 ! compute some variables depending whether or not a
7837 ! k-equation is present.
7838  if (correctfork) then
7839 ! store the left and right kinetic energy in ktmp,
7840 ! which is needed to compute the total energy.
7841  ktmp(1) = left(itu1)
7842  ktmp(2) = right(itu1)
7843 ! store the difference of the turbulent kinetic energy
7844 ! per unit volume, i.e. the conserved variable.
7845  drk = right(irho)*right(itu1) - left(irho)*left(itu1)
7846 ! compute the average turbulent energy per unit mass
7847 ! using roe averages.
7848  kavg = tmp*(z1l*left(itu1)+z1r*right(itu1))
7849  else
7850 ! set the difference of the turbulent kinetic energy
7851 ! per unit volume and the averaged kinetic energy per
7852 ! unit mass to zero.
7853  drk = 0.0
7854  kavg = 0.0
7855  end if
7856 ! compute the total energy of the left and right state.
7857  call etot(left(irho), left(ivx), left(ivy), left(ivz), left(&
7858 & irhoe), ktmp(1), etl, correctfork)
7859  call etot(right(irho), right(ivx), right(ivy), right(ivz), &
7860 & right(irhoe), ktmp(2), etr, correctfork)
7861 ! compute the difference of the conservative mean
7862 ! flow variables.
7863  dr = right(irho) - left(irho)
7864  dru = right(irho)*right(ivx) - left(irho)*left(ivx)
7865  drv = right(irho)*right(ivy) - left(irho)*left(ivy)
7866  drw = right(irho)*right(ivz) - left(irho)*left(ivz)
7867  dre = etr - etl
7868 ! compute the roe average variables, which can be
7869 ! computed directly from the average roe vector.
7870  ravg = fourth*(z1r+z1l)**2
7871  uavg = tmp*(z1l*left(ivx)+z1r*right(ivx))
7872  vavg = tmp*(z1l*left(ivy)+z1r*right(ivy))
7873  wavg = tmp*(z1l*left(ivz)+z1r*right(ivz))
7874  havg = tmp*((etl+left(irhoe))/z1l+(etr+right(irhoe))/z1r)
7875 ! compute the unit vector and store the area of the
7876 ! normal. also compute the unit normal velocity of the face.
7877  area = sqrt(sx**2 + sy**2 + sz**2)
7878  if (1.e-25_realtype .lt. area) then
7879  max2 = area
7880  else
7881  max2 = 1.e-25_realtype
7882  end if
7883  tmp = one/max2
7884  sx = sx*tmp
7885  sy = sy*tmp
7886  sz = sz*tmp
7887  rface = sface*tmp
7888 ! compute some dependent variables at the roe
7889 ! average state.
7890  alphaavg = half*(uavg**2+vavg**2+wavg**2)
7891  if (gm1*(havg-alphaavg) - gm53*kavg .ge. 0.) then
7892  a2avg = gm1*(havg-alphaavg) - gm53*kavg
7893  else
7894  a2avg = -(gm1*(havg-alphaavg)-gm53*kavg)
7895  end if
7896  aavg = sqrt(a2avg)
7897  unavg = uavg*sx + vavg*sy + wavg*sz
7898  ovaavg = one/aavg
7899  ova2avg = one/a2avg
7900 ! set for a boundary the normal velocity to rface, the
7901 ! normal velocity of the boundary.
7902  if (por .eq. boundflux) unavg = rface
7903  x1 = (left(ivx)-right(ivx))*sx + (left(ivy)-right(ivy))*sy + (&
7904 & left(ivz)-right(ivz))*sz
7905  if (x1 .ge. 0.) then
7906  abs1 = x1
7907  else
7908  abs1 = -x1
7909  end if
7910  x2 = sqrt(gammaface*left(irhoe)/left(irho)) - sqrt(gammaface*&
7911 & right(irhoe)/right(irho))
7912  if (x2 .ge. 0.) then
7913  abs2 = x2
7914  else
7915  abs2 = -x2
7916  end if
7917 ! compute the coefficient eta for the entropy correction.
7918 ! at the moment a 1d entropy correction is used, which
7919 ! removes expansion shocks. although it also reduces the
7920 ! carbuncle phenomenon, it does not remove it completely.
7921 ! in other to do that a multi-dimensional entropy fix is
7922 ! needed, see sanders et. al, jcp, vol. 145, 1998,
7923 ! pp. 511 - 537. although relatively easy to implement,
7924 ! an efficient implementation requires the storage of
7925 ! all the left and right states, which is rather
7926 ! expensive in terms of memory.
7927  eta = half*(abs1+abs2)
7928  if (unavg - rface + aavg .ge. 0.) then
7929  lam1 = unavg - rface + aavg
7930  else
7931  lam1 = -(unavg-rface+aavg)
7932  end if
7933  if (unavg - rface - aavg .ge. 0.) then
7934  lam2 = unavg - rface - aavg
7935  else
7936  lam2 = -(unavg-rface-aavg)
7937  end if
7938  if (unavg - rface .ge. 0.) then
7939  lam3 = unavg - rface
7940  else
7941  lam3 = -(unavg-rface)
7942  end if
7943 ! apply the entropy correction to the eigenvalues.
7944  tmp = two*eta
7945  if (lam1 .lt. tmp) lam1 = eta + fourth*lam1*lam1/eta
7946  if (lam2 .lt. tmp) lam2 = eta + fourth*lam2*lam2/eta
7947  if (lam3 .lt. tmp) lam3 = eta + fourth*lam3*lam3/eta
7948 ! multiply the eigenvalues by the area to obtain
7949 ! the correct values for the dissipation term.
7950  lam1 = lam1*area
7951  lam2 = lam2*area
7952  lam3 = lam3*area
7953 ! some abbreviations, which occur quite often in the
7954 ! dissipation terms.
7955  abv1 = half*(lam1+lam2)
7956  abv2 = half*(lam1-lam2)
7957  abv3 = abv1 - lam3
7958  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53&
7959 & *drk
7960  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
7961  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
7962  abv7 = abv2*abv4*ovaavg + abv3*abv5
7963 ! compute the dissipation term, -|a| (wr - wl), which is
7964 ! multiplied by porflux. note that porflux is either
7965 ! 0.0 or 0.5*rfil.
7966  flux(irho) = -(porflux*(lam3*dr+abv6))
7967  flux(imx) = -(porflux*(lam3*dru+uavg*abv6+sx*abv7))
7968  flux(imy) = -(porflux*(lam3*drv+vavg*abv6+sy*abv7))
7969  flux(imz) = -(porflux*(lam3*drw+wavg*abv6+sz*abv7))
7970  flux(irhoe) = -(porflux*(lam3*dre+havg*abv6+unavg*abv7))
7971 ! tmp = max(lam1,lam2,lam3)
7972 ! flux(irho) = -porflux*(tmp*dr)
7973 ! flux(imx) = -porflux*(tmp*dru)
7974 ! flux(imy) = -porflux*(tmp*drv)
7975 ! flux(imz) = -porflux*(tmp*drw)
7976 ! flux(irhoe) = -porflux*(tmp*dre)
7977  case (turkel)
7978  call terminate('riemannflux', &
7979 & 'turkel preconditioner not implemented yet')
7980  case (choimerkle)
7981  call terminate('riemannflux', &
7982 & 'choi merkle preconditioner not implemented yet')
7983  end select
7984  case (vanleer)
7985  call terminate('riemannflux', 'van leer fvs not implemented yet'&
7986 & )
7987  case (ausmdv)
7988  call terminate('riemannflux', 'ausmdv fvs not implemented yet')
7989  end select
7990  end subroutine riemannflux
7991 
7992  end subroutine inviscidupwindflux
7993 
7994 ! differentiation of viscousflux in reverse (adjoint) mode (with options noisize i4 dr8 r8):
7995 ! gradient of useful results: *aa *w *fw
7996 ! with respect to varying inputs: *rev *aa *wx *wy *wz *w *rlv
7997 ! *qx *qy *qz *ux *uy *uz *vx *vy *vz *fw
7998 ! rw status of diff variables: *rev:out *aa:incr *wx:out *wy:out
7999 ! *wz:out *w:incr *rlv:out *qx:out *qy:out *qz:out
8000 ! *ux:out *uy:out *uz:out *vx:out *vy:out *vz:out
8001 ! *fw:in-out
8002 ! plus diff mem management of: rev:in aa:in wx:in wy:in wz:in
8003 ! w:in rlv:in qx:in qy:in qz:in ux:in uy:in uz:in
8004 ! vx:in vy:in vz:in fw:in
8005  subroutine viscousflux_fast_b()
8006 !
8007 ! viscousflux computes the viscous fluxes using a central
8008 ! difference scheme for a block.
8009 ! it is assumed that the pointers in block pointer already point
8010 ! to the correct block.
8011 !
8012  use constants
8013  use blockpointers
8014  use flowvarrefstate
8015  use inputphysics
8016  use iteration
8017  implicit none
8018 !
8019 ! local parameter.
8020 !
8021  real(kind=realtype), parameter :: twothird=two*third
8022  real(kind=realtype), parameter :: xminn=1.e-14_realtype
8023 !
8024 ! local variables.
8025 !
8026  integer(kind=inttype) :: i, j, k, ii
8027  real(kind=realtype) :: rfilv, por, mul, mue, mut, heatcoef
8028  real(kind=realtype) :: muld, mued, mutd, heatcoefd
8029  real(kind=realtype) :: gm1, factlamheat, factturbheat
8030  real(kind=realtype) :: u_x, u_y, u_z, v_x, v_y, v_z, w_x, w_y, w_z
8031  real(kind=realtype) :: u_xd, u_yd, u_zd, v_xd, v_yd, v_zd, w_xd, &
8032 & w_yd, w_zd
8033  real(kind=realtype) :: q_x, q_y, q_z, ubar, vbar, wbar
8034  real(kind=realtype) :: q_xd, q_yd, q_zd, ubard, vbard, wbard
8035  real(kind=realtype) :: corr, ssx, ssy, ssz, ss, fracdiv
8036  real(kind=realtype) :: corrd, fracdivd
8037  real(kind=realtype) :: tauxx, tauyy, tauzz
8038  real(kind=realtype) :: tauxxd, tauyyd, tauzzd
8039  real(kind=realtype) :: tauxy, tauxz, tauyz
8040  real(kind=realtype) :: tauxyd, tauxzd, tauyzd
8041  real(kind=realtype) :: tauxxs, tauyys, tauzzs
8042  real(kind=realtype) :: tauxxsd, tauyysd, tauzzsd
8043  real(kind=realtype) :: tauxys, tauxzs, tauyzs
8044  real(kind=realtype) :: tauxysd, tauxzsd, tauyzsd
8045  real(kind=realtype) :: exx, eyy, ezz
8046  real(kind=realtype) :: exxd, eyyd, ezzd
8047  real(kind=realtype) :: exy, exz, eyz
8048  real(kind=realtype) :: exyd, exzd, eyzd
8049  real(kind=realtype) :: wxy, wxz, wyz, wyx, wzx, wzy
8050  real(kind=realtype) :: wxyd, wxzd, wyzd, wyxd, wzxd, wzyd
8051  real(kind=realtype) :: den, ccr1, fact
8052  real(kind=realtype) :: dend, factd
8053  real(kind=realtype) :: fmx, fmy, fmz, frhoe
8054  real(kind=realtype) :: fmxd, fmyd, fmzd, frhoed
8055  logical :: correctfork, storewalltensor
8056  intrinsic abs
8057  intrinsic mod
8058  intrinsic sqrt
8059  intrinsic max
8060  real(kind=realtype) :: abs0
8061  real(kind=realtype) :: tempd
8062  integer :: branch
8063  real(kind=realtype) :: tempd0
8064  real(kind=realtype) :: tempd1
8065 ! set qcr parameters
8066  ccr1 = 0.3_realtype
8067 ! set rfilv to rfil to indicate that this is the viscous part.
8068 ! if rfilv == 0 the viscous residuals need not to be computed
8069 ! and a return can be made.
8070  rfilv = rfil
8071  if (rfilv .ge. 0.) then
8072  abs0 = rfilv
8073  else
8074  abs0 = -rfilv
8075  end if
8076  if (abs0 .lt. thresholdreal) then
8077  if (associated(revd)) revd = 0.0_8
8078  if (associated(wxd)) wxd = 0.0_8
8079  if (associated(wyd)) wyd = 0.0_8
8080  if (associated(wzd)) wzd = 0.0_8
8081  if (associated(rlvd)) rlvd = 0.0_8
8082  if (associated(qxd)) qxd = 0.0_8
8083  if (associated(qyd)) qyd = 0.0_8
8084  if (associated(qzd)) qzd = 0.0_8
8085  if (associated(uxd)) uxd = 0.0_8
8086  if (associated(uyd)) uyd = 0.0_8
8087  if (associated(uzd)) uzd = 0.0_8
8088  if (associated(vxd)) vxd = 0.0_8
8089  if (associated(vyd)) vyd = 0.0_8
8090  if (associated(vzd)) vzd = 0.0_8
8091  else
8092  if (associated(revd)) revd = 0.0_8
8093  if (associated(wxd)) wxd = 0.0_8
8094  if (associated(wyd)) wyd = 0.0_8
8095  if (associated(wzd)) wzd = 0.0_8
8096  if (associated(rlvd)) rlvd = 0.0_8
8097  if (associated(qxd)) qxd = 0.0_8
8098  if (associated(qyd)) qyd = 0.0_8
8099  if (associated(qzd)) qzd = 0.0_8
8100  if (associated(uxd)) uxd = 0.0_8
8101  if (associated(uyd)) uyd = 0.0_8
8102  if (associated(uzd)) uzd = 0.0_8
8103  if (associated(vxd)) vxd = 0.0_8
8104  if (associated(vyd)) vyd = 0.0_8
8105  if (associated(vzd)) vzd = 0.0_8
8106  mued = 0.0_8
8107  mue = zero
8108  if (associated(revd)) revd = 0.0_8
8109  if (associated(wxd)) wxd = 0.0_8
8110  if (associated(wyd)) wyd = 0.0_8
8111  if (associated(wzd)) wzd = 0.0_8
8112  if (associated(rlvd)) rlvd = 0.0_8
8113  if (associated(qxd)) qxd = 0.0_8
8114  if (associated(qyd)) qyd = 0.0_8
8115  if (associated(qzd)) qzd = 0.0_8
8116  if (associated(uxd)) uxd = 0.0_8
8117  if (associated(uyd)) uyd = 0.0_8
8118  if (associated(uzd)) uzd = 0.0_8
8119  if (associated(vxd)) vxd = 0.0_8
8120  if (associated(vyd)) vyd = 0.0_8
8121  if (associated(vzd)) vzd = 0.0_8
8122  mued = 0.0_8
8123 !$bwd-of ii-loop
8124  do ii=0,il*ny*nz-1
8125  i = mod(ii, il) + 1
8126  j = mod(ii/il, ny) + 2
8127  k = ii/(il*ny) + 2
8128 ! set the value of the porosity. if not zero, it is set
8129 ! to average the eddy-viscosity and to take the factor
8130 ! rfilv into account.
8131  por = half*rfilv
8132  if (pori(i, j, k) .eq. noflux) por = zero
8133 ! compute the laminar and (if present) the eddy viscosities
8134 ! multiplied the porosity. compute the factor in front of
8135 ! the gradients of the speed of sound squared for the heat
8136 ! flux.
8137  mul = por*(rlv(i, j, k)+rlv(i+1, j, k))
8138  if (eddymodel) then
8139  mue = por*(rev(i, j, k)+rev(i+1, j, k))
8140 myintptr = myintptr + 1
8141  myintstack(myintptr) = 0
8142  else
8143 myintptr = myintptr + 1
8144  myintstack(myintptr) = 1
8145  end if
8146  mut = mul + mue
8147  gm1 = half*(gamma(i, j, k)+gamma(i+1, j, k)) - one
8148  factlamheat = one/(prandtl*gm1)
8149  factturbheat = one/(prandtlturb*gm1)
8150  heatcoef = mul*factlamheat + mue*factturbheat
8151 ! compute the gradients at the face by averaging the four
8152 ! nodal values.
8153  u_x = fourth*(ux(i, j-1, k-1)+ux(i, j, k-1)+ux(i, j-1, k)+ux(i, &
8154 & j, k))
8155  u_y = fourth*(uy(i, j-1, k-1)+uy(i, j, k-1)+uy(i, j-1, k)+uy(i, &
8156 & j, k))
8157  u_z = fourth*(uz(i, j-1, k-1)+uz(i, j, k-1)+uz(i, j-1, k)+uz(i, &
8158 & j, k))
8159  v_x = fourth*(vx(i, j-1, k-1)+vx(i, j, k-1)+vx(i, j-1, k)+vx(i, &
8160 & j, k))
8161  v_y = fourth*(vy(i, j-1, k-1)+vy(i, j, k-1)+vy(i, j-1, k)+vy(i, &
8162 & j, k))
8163  v_z = fourth*(vz(i, j-1, k-1)+vz(i, j, k-1)+vz(i, j-1, k)+vz(i, &
8164 & j, k))
8165  w_x = fourth*(wx(i, j-1, k-1)+wx(i, j, k-1)+wx(i, j-1, k)+wx(i, &
8166 & j, k))
8167  w_y = fourth*(wy(i, j-1, k-1)+wy(i, j, k-1)+wy(i, j-1, k)+wy(i, &
8168 & j, k))
8169  w_z = fourth*(wz(i, j-1, k-1)+wz(i, j, k-1)+wz(i, j-1, k)+wz(i, &
8170 & j, k))
8171  q_x = fourth*(qx(i, j-1, k-1)+qx(i, j, k-1)+qx(i, j-1, k)+qx(i, &
8172 & j, k))
8173  q_y = fourth*(qy(i, j-1, k-1)+qy(i, j, k-1)+qy(i, j-1, k)+qy(i, &
8174 & j, k))
8175  q_z = fourth*(qz(i, j-1, k-1)+qz(i, j, k-1)+qz(i, j-1, k)+qz(i, &
8176 & j, k))
8177 ! the gradients in the normal direction are corrected, such
8178 ! that no averaging takes places here.
8179 ! first determine the vector in the direction from the
8180 ! cell center i to cell center i+1.
8181  ssx = eighth*(x(i+1, j-1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i+1, j-1&
8182 & , k, 1)-x(i-1, j-1, k, 1)+x(i+1, j, k-1, 1)-x(i-1, j, k-1, 1)+&
8183 & x(i+1, j, k, 1)-x(i-1, j, k, 1))
8184  ssy = eighth*(x(i+1, j-1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i+1, j-1&
8185 & , k, 2)-x(i-1, j-1, k, 2)+x(i+1, j, k-1, 2)-x(i-1, j, k-1, 2)+&
8186 & x(i+1, j, k, 2)-x(i-1, j, k, 2))
8187  ssz = eighth*(x(i+1, j-1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i+1, j-1&
8188 & , k, 3)-x(i-1, j-1, k, 3)+x(i+1, j, k-1, 3)-x(i-1, j, k-1, 3)+&
8189 & x(i+1, j, k, 3)-x(i-1, j, k, 3))
8190 ! determine the length of this vector and create the
8191 ! unit normal.
8192  ss = one/sqrt(ssx*ssx+ssy*ssy+ssz*ssz)
8193  ssx = ss*ssx
8194  ssy = ss*ssy
8195  ssz = ss*ssz
8196 ! correct the gradients.
8197  corr = u_x*ssx + u_y*ssy + u_z*ssz - (w(i+1, j, k, ivx)-w(i, j, &
8198 & k, ivx))*ss
8199  u_x = u_x - corr*ssx
8200  u_y = u_y - corr*ssy
8201  u_z = u_z - corr*ssz
8202  corr = v_x*ssx + v_y*ssy + v_z*ssz - (w(i+1, j, k, ivy)-w(i, j, &
8203 & k, ivy))*ss
8204  v_x = v_x - corr*ssx
8205  v_y = v_y - corr*ssy
8206  v_z = v_z - corr*ssz
8207  corr = w_x*ssx + w_y*ssy + w_z*ssz - (w(i+1, j, k, ivz)-w(i, j, &
8208 & k, ivz))*ss
8209  w_x = w_x - corr*ssx
8210  w_y = w_y - corr*ssy
8211  w_z = w_z - corr*ssz
8212  corr = q_x*ssx + q_y*ssy + q_z*ssz + (aa(i+1, j, k)-aa(i, j, k))&
8213 & *ss
8214  q_x = q_x - corr*ssx
8215  q_y = q_y - corr*ssy
8216  q_z = q_z - corr*ssz
8217 ! compute the stress tensor and the heat flux vector.
8218 ! we remove the viscosity from the stress tensor (tau)
8219 ! to define taus since we still need to separate between
8220 ! laminar and turbulent stress for qcr.
8221 ! therefore, laminar tau = mue*taus, turbulent
8222 ! tau = mue*taus, and total tau = mut*taus.
8223  fracdiv = twothird*(u_x+v_y+w_z)
8224  tauxxs = two*u_x - fracdiv
8225  tauyys = two*v_y - fracdiv
8226  tauzzs = two*w_z - fracdiv
8227  tauxys = u_y + v_x
8228  tauxzs = u_z + w_x
8229  tauyzs = v_z + w_y
8230 ! add qcr corrections if necessary
8231  if (useqcr) then
8232 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
8233 !
8234 ! tau_ij,qcr = tau_ij - e_ij
8235 !
8236 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
8237 !
8238 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
8239 !
8240 ! we are computing o_ik as follows:
8241 !
8242 ! o_ik = 2*w_ik/den
8243 !
8244 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
8245 ! compute denominator
8246  den = sqrt(u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
8247 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z)
8248  if (den .lt. xminn) then
8249  den = xminn
8250 myintptr = myintptr + 1
8251  myintstack(myintptr) = 0
8252  else
8253 myintptr = myintptr + 1
8254  myintstack(myintptr) = 1
8255  den = den
8256  end if
8257 ! compute factor that will multiply all tensor components.
8258 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
8259 ! components as well.
8260  fact = mue*ccr1/den
8261 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
8262 ! the diagonals of the vorticity tensor components are always zero
8263  wxy = u_y - v_x
8264  wxz = u_z - w_x
8265  wyz = v_z - w_y
8266  wyx = -wxy
8267  wzx = -wxz
8268  wzy = -wyz
8269 ! compute the extra terms of the boussinesq relation
8270  exx = fact*(wxy*tauxys+wxz*tauxzs)*two
8271  eyy = fact*(wyx*tauxys+wyz*tauyzs)*two
8272  ezz = fact*(wzx*tauxzs+wzy*tauyzs)*two
8273  exy = fact*(wxy*tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)
8274  exz = fact*(wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)
8275  eyz = fact*(wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)
8276 ! apply the total viscosity to the stress tensor and add extra terms
8277  tauxx = mut*tauxxs - exx
8278  tauyy = mut*tauyys - eyy
8279  tauzz = mut*tauzzs - ezz
8280  tauxy = mut*tauxys - exy
8281  tauxz = mut*tauxzs - exz
8282  tauyz = mut*tauyzs - eyz
8283 myintptr = myintptr + 1
8284  myintstack(myintptr) = 0
8285  else
8286 ! just apply the total viscosity to the stress tensor
8287  tauxx = mut*tauxxs
8288  tauyy = mut*tauyys
8289  tauzz = mut*tauzzs
8290  tauxy = mut*tauxys
8291  tauxz = mut*tauxzs
8292  tauyz = mut*tauyzs
8293 myintptr = myintptr + 1
8294  myintstack(myintptr) = 1
8295  end if
8296 ! compute the average velocities for the face. remember that
8297 ! the velocities are stored and not the momentum.
8298  ubar = half*(w(i, j, k, ivx)+w(i+1, j, k, ivx))
8299  vbar = half*(w(i, j, k, ivy)+w(i+1, j, k, ivy))
8300  wbar = half*(w(i, j, k, ivz)+w(i+1, j, k, ivz))
8301 ! compute the viscous fluxes for this i-face.
8302 ! update the residuals of cell i and i+1.
8303 ! store the stress tensor and the heat flux vector if this
8304 ! face is part of a viscous subface. both the cases i == 1
8305 ! and i == il must be tested.
8306  frhoed = fwd(i+1, j, k, irhoe) - fwd(i, j, k, irhoe)
8307  fmzd = fwd(i+1, j, k, imz) - fwd(i, j, k, imz)
8308  fmyd = fwd(i+1, j, k, imy) - fwd(i, j, k, imy)
8309  fmxd = fwd(i+1, j, k, imx) - fwd(i, j, k, imx)
8310  tempd1 = si(i, j, k, 1)*frhoed
8311  tempd0 = si(i, j, k, 2)*frhoed
8312  tempd = si(i, j, k, 3)*frhoed
8313  q_xd = -(si(i, j, k, 1)*frhoed)
8314  q_yd = -(si(i, j, k, 2)*frhoed)
8315  q_zd = -(si(i, j, k, 3)*frhoed)
8316  ubard = tauxz*tempd + tauxy*tempd0 + tauxx*tempd1
8317  tauxzd = ubar*tempd + wbar*tempd1 + si(i, j, k, 1)*fmzd + si(i, &
8318 & j, k, 3)*fmxd
8319  vbard = tauyz*tempd + tauyy*tempd0 + tauxy*tempd1
8320  tauyzd = vbar*tempd + wbar*tempd0 + si(i, j, k, 2)*fmzd + si(i, &
8321 & j, k, 3)*fmyd
8322  wbard = tauzz*tempd + tauyz*tempd0 + tauxz*tempd1
8323  tauzzd = wbar*tempd + si(i, j, k, 3)*fmzd
8324  tauxyd = ubar*tempd0 + vbar*tempd1 + si(i, j, k, 1)*fmyd + si(i&
8325 & , j, k, 2)*fmxd
8326  tauyyd = vbar*tempd0 + si(i, j, k, 2)*fmyd
8327  tauxxd = ubar*tempd1 + si(i, j, k, 1)*fmxd
8328  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wbard
8329  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) + half*wbard
8330  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vbard
8331  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) + half*vbard
8332  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*ubard
8333  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) + half*ubard
8334 branch = myintstack(myintptr)
8335  myintptr = myintptr - 1
8336  if (branch .eq. 0) then
8337  eyzd = -tauyzd
8338  exzd = -tauxzd
8339  tempd1 = fact*eyzd
8340  tauxzsd = mut*tauxzd + wyx*tempd1
8341  tauxysd = mut*tauxyd + wzx*tempd1
8342  tauzzsd = mut*tauzzd + wyz*tempd1
8343  tauyysd = mut*tauyyd + wzy*tempd1
8344  wyxd = tauxzs*tempd1
8345  wyzd = tauzzs*tempd1
8346  wzxd = tauxys*tempd1
8347  wzyd = tauyys*tempd1
8348  tempd1 = fact*exzd
8349  mutd = tauyzs*tauyzd + tauxzs*tauxzd + tauxys*tauxyd + tauzzs*&
8350 & tauzzd + tauyys*tauyyd + tauxxs*tauxxd
8351  tauyzsd = mut*tauyzd + wxy*tempd1
8352  exyd = -tauxyd
8353  ezzd = -tauzzd
8354  eyyd = -tauyyd
8355  tauxxsd = mut*tauxxd + wzx*tempd1
8356  exxd = -tauxxd
8357  factd = (wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)*eyzd + (&
8358 & wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)*exzd + (wxy*&
8359 & tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)*exyd + (wzx*tauxzs+&
8360 & wzy*tauyzs)*two*ezzd + (wyx*tauxys+wyz*tauyzs)*two*eyyd + (&
8361 & wxy*tauxys+wxz*tauxzs)*two*exxd
8362  wxyd = tauyzs*tempd1
8363  wxzd = tauzzs*tempd1
8364  tauzzsd = tauzzsd + wxz*tempd1
8365  wzxd = wzxd + tauxxs*tempd1
8366  wzyd = wzyd + tauxys*tempd1
8367  tauxysd = tauxysd + wzy*tempd1
8368  tempd1 = fact*exyd
8369  wxyd = wxyd + tauyys*tempd1
8370  tauyysd = tauyysd + wxy*tempd1
8371  wxzd = wxzd + tauyzs*tempd1
8372  tauyzsd = tauyzsd + wxz*tempd1
8373  wyxd = wyxd + tauxxs*tempd1
8374  tauxxsd = tauxxsd + wyx*tempd1
8375  wyzd = wyzd + tauxzs*tempd1
8376  tauxzsd = tauxzsd + wyz*tempd1
8377  tempd1 = fact*two*ezzd
8378  wzxd = wzxd + tauxzs*tempd1
8379  tauxzsd = tauxzsd + wzx*tempd1
8380  wzyd = wzyd + tauyzs*tempd1
8381  tauyzsd = tauyzsd + wzy*tempd1
8382  tempd1 = fact*two*eyyd
8383  wyxd = wyxd + tauxys*tempd1
8384  tauxysd = tauxysd + wyx*tempd1
8385  wyzd = wyzd + tauyzs*tempd1 - wzyd
8386  tauyzsd = tauyzsd + wyz*tempd1
8387  tempd1 = fact*two*exxd
8388  wxyd = wxyd + tauxys*tempd1 - wyxd
8389  tauxysd = tauxysd + wxy*tempd1
8390  wxzd = wxzd + tauxzs*tempd1 - wzxd
8391  tauxzsd = tauxzsd + wxz*tempd1
8392  v_zd = wyzd
8393  w_yd = -wyzd
8394  u_zd = wxzd
8395  w_xd = -wxzd
8396  u_yd = wxyd
8397  v_xd = -wxyd
8398  tempd1 = ccr1*factd/den
8399  mued = mued + tempd1
8400  dend = -(mue*tempd1/den)
8401 branch = myintstack(myintptr)
8402  myintptr = myintptr - 1
8403  if (branch .eq. 0) dend = 0.0_8
8404  if (u_x**2 + u_y**2 + u_z**2 + v_x**2 + v_y**2 + v_z**2 + w_x&
8405 & **2 + w_y**2 + w_z**2 .eq. 0.0_8) then
8406  tempd1 = 0.0_8
8407  else
8408  tempd1 = dend/(2.0*sqrt(u_x**2+u_y**2+u_z**2+v_x**2+v_y**2+&
8409 & v_z**2+w_x**2+w_y**2+w_z**2))
8410  end if
8411  u_xd = 2*u_x*tempd1
8412  u_yd = u_yd + 2*u_y*tempd1
8413  u_zd = u_zd + 2*u_z*tempd1
8414  v_xd = v_xd + 2*v_x*tempd1
8415  v_yd = 2*v_y*tempd1
8416  v_zd = v_zd + 2*v_z*tempd1
8417  w_xd = w_xd + 2*w_x*tempd1
8418  w_yd = w_yd + 2*w_y*tempd1
8419  w_zd = 2*w_z*tempd1
8420  else
8421  mutd = tauyzs*tauyzd + tauxzs*tauxzd + tauxys*tauxyd + tauzzs*&
8422 & tauzzd + tauyys*tauyyd + tauxxs*tauxxd
8423  tauyzsd = mut*tauyzd
8424  tauxzsd = mut*tauxzd
8425  tauxysd = mut*tauxyd
8426  tauzzsd = mut*tauzzd
8427  tauyysd = mut*tauyyd
8428  tauxxsd = mut*tauxxd
8429  u_xd = 0.0_8
8430  u_yd = 0.0_8
8431  u_zd = 0.0_8
8432  w_xd = 0.0_8
8433  w_yd = 0.0_8
8434  w_zd = 0.0_8
8435  v_xd = 0.0_8
8436  v_yd = 0.0_8
8437  v_zd = 0.0_8
8438  end if
8439  fracdivd = -tauzzsd - tauyysd - tauxxsd
8440  tempd1 = twothird*fracdivd
8441  heatcoefd = q_z*q_zd + q_y*q_yd + q_x*q_xd
8442  q_zd = heatcoef*q_zd
8443  q_yd = heatcoef*q_yd
8444  q_xd = heatcoef*q_xd
8445  v_zd = v_zd + tauyzsd
8446  w_yd = w_yd + tauyzsd
8447  u_zd = u_zd + tauxzsd
8448  w_xd = w_xd + tauxzsd
8449  u_yd = u_yd + tauxysd
8450  v_xd = v_xd + tauxysd
8451  w_zd = w_zd + two*tauzzsd + tempd1
8452  v_yd = v_yd + two*tauyysd + tempd1
8453  u_xd = u_xd + two*tauxxsd + tempd1
8454  corrd = -(ssz*q_zd) - ssy*q_yd - ssx*q_xd
8455  q_xd = q_xd + ssx*corrd
8456  q_yd = q_yd + ssy*corrd
8457  q_zd = q_zd + ssz*corrd
8458  aad(i+1, j, k) = aad(i+1, j, k) + ss*corrd
8459  aad(i, j, k) = aad(i, j, k) - ss*corrd
8460  corrd = -(ssz*w_zd) - ssy*w_yd - ssx*w_xd
8461  w_xd = w_xd + ssx*corrd
8462  w_yd = w_yd + ssy*corrd
8463  w_zd = w_zd + ssz*corrd
8464  wd(i+1, j, k, ivz) = wd(i+1, j, k, ivz) - ss*corrd
8465  wd(i, j, k, ivz) = wd(i, j, k, ivz) + ss*corrd
8466  corrd = -(ssz*v_zd) - ssy*v_yd - ssx*v_xd
8467  v_xd = v_xd + ssx*corrd
8468  v_yd = v_yd + ssy*corrd
8469  v_zd = v_zd + ssz*corrd
8470  wd(i+1, j, k, ivy) = wd(i+1, j, k, ivy) - ss*corrd
8471  wd(i, j, k, ivy) = wd(i, j, k, ivy) + ss*corrd
8472  corrd = -(ssz*u_zd) - ssy*u_yd - ssx*u_xd
8473  u_xd = u_xd + ssx*corrd
8474  u_yd = u_yd + ssy*corrd
8475  u_zd = u_zd + ssz*corrd
8476  wd(i+1, j, k, ivx) = wd(i+1, j, k, ivx) - ss*corrd
8477  wd(i, j, k, ivx) = wd(i, j, k, ivx) + ss*corrd
8478  tempd1 = fourth*q_zd
8479  qzd(i, j-1, k-1) = qzd(i, j-1, k-1) + tempd1
8480  qzd(i, j, k-1) = qzd(i, j, k-1) + tempd1
8481  qzd(i, j-1, k) = qzd(i, j-1, k) + tempd1
8482  qzd(i, j, k) = qzd(i, j, k) + tempd1
8483  tempd1 = fourth*q_yd
8484  qyd(i, j-1, k-1) = qyd(i, j-1, k-1) + tempd1
8485  qyd(i, j, k-1) = qyd(i, j, k-1) + tempd1
8486  qyd(i, j-1, k) = qyd(i, j-1, k) + tempd1
8487  qyd(i, j, k) = qyd(i, j, k) + tempd1
8488  tempd1 = fourth*q_xd
8489  qxd(i, j-1, k-1) = qxd(i, j-1, k-1) + tempd1
8490  qxd(i, j, k-1) = qxd(i, j, k-1) + tempd1
8491  qxd(i, j-1, k) = qxd(i, j-1, k) + tempd1
8492  qxd(i, j, k) = qxd(i, j, k) + tempd1
8493  tempd1 = fourth*w_zd
8494  wzd(i, j-1, k-1) = wzd(i, j-1, k-1) + tempd1
8495  wzd(i, j, k-1) = wzd(i, j, k-1) + tempd1
8496  wzd(i, j-1, k) = wzd(i, j-1, k) + tempd1
8497  wzd(i, j, k) = wzd(i, j, k) + tempd1
8498  tempd1 = fourth*w_yd
8499  wyd(i, j-1, k-1) = wyd(i, j-1, k-1) + tempd1
8500  wyd(i, j, k-1) = wyd(i, j, k-1) + tempd1
8501  wyd(i, j-1, k) = wyd(i, j-1, k) + tempd1
8502  wyd(i, j, k) = wyd(i, j, k) + tempd1
8503  tempd1 = fourth*w_xd
8504  wxd(i, j-1, k-1) = wxd(i, j-1, k-1) + tempd1
8505  wxd(i, j, k-1) = wxd(i, j, k-1) + tempd1
8506  wxd(i, j-1, k) = wxd(i, j-1, k) + tempd1
8507  wxd(i, j, k) = wxd(i, j, k) + tempd1
8508  tempd1 = fourth*v_zd
8509  vzd(i, j-1, k-1) = vzd(i, j-1, k-1) + tempd1
8510  vzd(i, j, k-1) = vzd(i, j, k-1) + tempd1
8511  vzd(i, j-1, k) = vzd(i, j-1, k) + tempd1
8512  vzd(i, j, k) = vzd(i, j, k) + tempd1
8513  tempd1 = fourth*v_yd
8514  vyd(i, j-1, k-1) = vyd(i, j-1, k-1) + tempd1
8515  vyd(i, j, k-1) = vyd(i, j, k-1) + tempd1
8516  vyd(i, j-1, k) = vyd(i, j-1, k) + tempd1
8517  vyd(i, j, k) = vyd(i, j, k) + tempd1
8518  tempd1 = fourth*v_xd
8519  vxd(i, j-1, k-1) = vxd(i, j-1, k-1) + tempd1
8520  vxd(i, j, k-1) = vxd(i, j, k-1) + tempd1
8521  vxd(i, j-1, k) = vxd(i, j-1, k) + tempd1
8522  vxd(i, j, k) = vxd(i, j, k) + tempd1
8523  tempd1 = fourth*u_zd
8524  uzd(i, j-1, k-1) = uzd(i, j-1, k-1) + tempd1
8525  uzd(i, j, k-1) = uzd(i, j, k-1) + tempd1
8526  uzd(i, j-1, k) = uzd(i, j-1, k) + tempd1
8527  uzd(i, j, k) = uzd(i, j, k) + tempd1
8528  tempd1 = fourth*u_yd
8529  uyd(i, j-1, k-1) = uyd(i, j-1, k-1) + tempd1
8530  uyd(i, j, k-1) = uyd(i, j, k-1) + tempd1
8531  uyd(i, j-1, k) = uyd(i, j-1, k) + tempd1
8532  uyd(i, j, k) = uyd(i, j, k) + tempd1
8533  tempd1 = fourth*u_xd
8534  uxd(i, j-1, k-1) = uxd(i, j-1, k-1) + tempd1
8535  uxd(i, j, k-1) = uxd(i, j, k-1) + tempd1
8536  uxd(i, j-1, k) = uxd(i, j-1, k) + tempd1
8537  uxd(i, j, k) = uxd(i, j, k) + tempd1
8538  muld = factlamheat*heatcoefd + mutd
8539  mued = mued + factturbheat*heatcoefd + mutd
8540 branch = myintstack(myintptr)
8541  myintptr = myintptr - 1
8542  if (branch .eq. 0) then
8543  revd(i, j, k) = revd(i, j, k) + por*mued
8544  revd(i+1, j, k) = revd(i+1, j, k) + por*mued
8545  mued = 0.0_8
8546  end if
8547  rlvd(i, j, k) = rlvd(i, j, k) + por*muld
8548  rlvd(i+1, j, k) = rlvd(i+1, j, k) + por*muld
8549  end do
8550  mued = 0.0_8
8551  mue = zero
8552  mued = 0.0_8
8553 !$bwd-of ii-loop
8554  do ii=0,nx*jl*nz-1
8555  i = mod(ii, nx) + 2
8556  j = mod(ii/nx, jl) + 1
8557  k = ii/(nx*jl) + 2
8558 ! set the value of the porosity. if not zero, it is set
8559 ! to average the eddy-viscosity and to take the factor
8560 ! rfilv into account.
8561  por = half*rfilv
8562  if (porj(i, j, k) .eq. noflux) por = zero
8563 ! compute the laminar and (if present) the eddy viscosities
8564 ! multiplied by the porosity. compute the factor in front of
8565 ! the gradients of the speed of sound squared for the heat
8566 ! flux.
8567  mul = por*(rlv(i, j, k)+rlv(i, j+1, k))
8568  if (eddymodel) then
8569  mue = por*(rev(i, j, k)+rev(i, j+1, k))
8570 myintptr = myintptr + 1
8571  myintstack(myintptr) = 0
8572  else
8573 myintptr = myintptr + 1
8574  myintstack(myintptr) = 1
8575  end if
8576  mut = mul + mue
8577  gm1 = half*(gamma(i, j, k)+gamma(i, j+1, k)) - one
8578  factlamheat = one/(prandtl*gm1)
8579  factturbheat = one/(prandtlturb*gm1)
8580  heatcoef = mul*factlamheat + mue*factturbheat
8581 ! compute the gradients at the face by averaging the four
8582 ! nodal values.
8583  u_x = fourth*(ux(i-1, j, k-1)+ux(i, j, k-1)+ux(i-1, j, k)+ux(i, &
8584 & j, k))
8585  u_y = fourth*(uy(i-1, j, k-1)+uy(i, j, k-1)+uy(i-1, j, k)+uy(i, &
8586 & j, k))
8587  u_z = fourth*(uz(i-1, j, k-1)+uz(i, j, k-1)+uz(i-1, j, k)+uz(i, &
8588 & j, k))
8589  v_x = fourth*(vx(i-1, j, k-1)+vx(i, j, k-1)+vx(i-1, j, k)+vx(i, &
8590 & j, k))
8591  v_y = fourth*(vy(i-1, j, k-1)+vy(i, j, k-1)+vy(i-1, j, k)+vy(i, &
8592 & j, k))
8593  v_z = fourth*(vz(i-1, j, k-1)+vz(i, j, k-1)+vz(i-1, j, k)+vz(i, &
8594 & j, k))
8595  w_x = fourth*(wx(i-1, j, k-1)+wx(i, j, k-1)+wx(i-1, j, k)+wx(i, &
8596 & j, k))
8597  w_y = fourth*(wy(i-1, j, k-1)+wy(i, j, k-1)+wy(i-1, j, k)+wy(i, &
8598 & j, k))
8599  w_z = fourth*(wz(i-1, j, k-1)+wz(i, j, k-1)+wz(i-1, j, k)+wz(i, &
8600 & j, k))
8601  q_x = fourth*(qx(i-1, j, k-1)+qx(i, j, k-1)+qx(i-1, j, k)+qx(i, &
8602 & j, k))
8603  q_y = fourth*(qy(i-1, j, k-1)+qy(i, j, k-1)+qy(i-1, j, k)+qy(i, &
8604 & j, k))
8605  q_z = fourth*(qz(i-1, j, k-1)+qz(i, j, k-1)+qz(i-1, j, k)+qz(i, &
8606 & j, k))
8607 ! the gradients in the normal direction are corrected, such
8608 ! that no averaging takes places here.
8609 ! first determine the vector in the direction from the
8610 ! cell center j to cell center j+1.
8611  ssx = eighth*(x(i-1, j+1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j+1&
8612 & , k, 1)-x(i-1, j-1, k, 1)+x(i, j+1, k-1, 1)-x(i, j-1, k-1, 1)+&
8613 & x(i, j+1, k, 1)-x(i, j-1, k, 1))
8614  ssy = eighth*(x(i-1, j+1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j+1&
8615 & , k, 2)-x(i-1, j-1, k, 2)+x(i, j+1, k-1, 2)-x(i, j-1, k-1, 2)+&
8616 & x(i, j+1, k, 2)-x(i, j-1, k, 2))
8617  ssz = eighth*(x(i-1, j+1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j+1&
8618 & , k, 3)-x(i-1, j-1, k, 3)+x(i, j+1, k-1, 3)-x(i, j-1, k-1, 3)+&
8619 & x(i, j+1, k, 3)-x(i, j-1, k, 3))
8620 ! determine the length of this vector and create the
8621 ! unit normal.
8622  ss = one/sqrt(ssx*ssx+ssy*ssy+ssz*ssz)
8623  ssx = ss*ssx
8624  ssy = ss*ssy
8625  ssz = ss*ssz
8626 ! correct the gradients.
8627  corr = u_x*ssx + u_y*ssy + u_z*ssz - (w(i, j+1, k, ivx)-w(i, j, &
8628 & k, ivx))*ss
8629  u_x = u_x - corr*ssx
8630  u_y = u_y - corr*ssy
8631  u_z = u_z - corr*ssz
8632  corr = v_x*ssx + v_y*ssy + v_z*ssz - (w(i, j+1, k, ivy)-w(i, j, &
8633 & k, ivy))*ss
8634  v_x = v_x - corr*ssx
8635  v_y = v_y - corr*ssy
8636  v_z = v_z - corr*ssz
8637  corr = w_x*ssx + w_y*ssy + w_z*ssz - (w(i, j+1, k, ivz)-w(i, j, &
8638 & k, ivz))*ss
8639  w_x = w_x - corr*ssx
8640  w_y = w_y - corr*ssy
8641  w_z = w_z - corr*ssz
8642  corr = q_x*ssx + q_y*ssy + q_z*ssz + (aa(i, j+1, k)-aa(i, j, k))&
8643 & *ss
8644  q_x = q_x - corr*ssx
8645  q_y = q_y - corr*ssy
8646  q_z = q_z - corr*ssz
8647 ! compute the stress tensor and the heat flux vector.
8648 ! we remove the viscosity from the stress tensor (tau)
8649 ! to define taus since we still need to separate between
8650 ! laminar and turbulent stress for qcr.
8651 ! therefore, laminar tau = mue*taus, turbulent
8652 ! tau = mue*taus, and total tau = mut*taus.
8653  fracdiv = twothird*(u_x+v_y+w_z)
8654  tauxxs = two*u_x - fracdiv
8655  tauyys = two*v_y - fracdiv
8656  tauzzs = two*w_z - fracdiv
8657  tauxys = u_y + v_x
8658  tauxzs = u_z + w_x
8659  tauyzs = v_z + w_y
8660 ! add qcr corrections if necessary
8661  if (useqcr) then
8662 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
8663 !
8664 ! tau_ij,qcr = tau_ij - e_ij
8665 !
8666 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
8667 !
8668 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
8669 !
8670 ! we are computing o_ik as follows:
8671 !
8672 ! o_ik = 2*w_ik/den
8673 !
8674 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
8675 ! compute denominator
8676  den = sqrt(u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
8677 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z)
8678  if (den .lt. xminn) then
8679  den = xminn
8680 myintptr = myintptr + 1
8681  myintstack(myintptr) = 0
8682  else
8683 myintptr = myintptr + 1
8684  myintstack(myintptr) = 1
8685  den = den
8686  end if
8687 ! compute factor that will multiply all tensor components.
8688 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
8689 ! components as well.
8690  fact = mue*ccr1/den
8691 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
8692 ! the diagonals of the vorticity tensor components are always zero
8693  wxy = u_y - v_x
8694  wxz = u_z - w_x
8695  wyz = v_z - w_y
8696  wyx = -wxy
8697  wzx = -wxz
8698  wzy = -wyz
8699 ! compute the extra terms of the boussinesq relation
8700  exx = fact*(wxy*tauxys+wxz*tauxzs)*two
8701  eyy = fact*(wyx*tauxys+wyz*tauyzs)*two
8702  ezz = fact*(wzx*tauxzs+wzy*tauyzs)*two
8703  exy = fact*(wxy*tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)
8704  exz = fact*(wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)
8705  eyz = fact*(wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)
8706 ! apply the total viscosity to the stress tensor and add extra terms
8707  tauxx = mut*tauxxs - exx
8708  tauyy = mut*tauyys - eyy
8709  tauzz = mut*tauzzs - ezz
8710  tauxy = mut*tauxys - exy
8711  tauxz = mut*tauxzs - exz
8712  tauyz = mut*tauyzs - eyz
8713 myintptr = myintptr + 1
8714  myintstack(myintptr) = 0
8715  else
8716 ! just apply the total viscosity to the stress tensor
8717  tauxx = mut*tauxxs
8718  tauyy = mut*tauyys
8719  tauzz = mut*tauzzs
8720  tauxy = mut*tauxys
8721  tauxz = mut*tauxzs
8722  tauyz = mut*tauyzs
8723 myintptr = myintptr + 1
8724  myintstack(myintptr) = 1
8725  end if
8726 ! compute the average velocities for the face. remember that
8727 ! the velocities are stored and not the momentum.
8728  ubar = half*(w(i, j, k, ivx)+w(i, j+1, k, ivx))
8729  vbar = half*(w(i, j, k, ivy)+w(i, j+1, k, ivy))
8730  wbar = half*(w(i, j, k, ivz)+w(i, j+1, k, ivz))
8731 ! compute the viscous fluxes for this j-face.
8732 ! update the residuals of cell j and j+1.
8733 ! store the stress tensor and the heat flux vector if this
8734 ! face is part of a viscous subface. both the cases j == 1
8735 ! and j == jl must be tested.
8736  frhoed = fwd(i, j+1, k, irhoe) - fwd(i, j, k, irhoe)
8737  fmzd = fwd(i, j+1, k, imz) - fwd(i, j, k, imz)
8738  fmyd = fwd(i, j+1, k, imy) - fwd(i, j, k, imy)
8739  fmxd = fwd(i, j+1, k, imx) - fwd(i, j, k, imx)
8740  tempd = sj(i, j, k, 1)*frhoed
8741  tempd0 = sj(i, j, k, 2)*frhoed
8742  tempd1 = sj(i, j, k, 3)*frhoed
8743  q_xd = -(sj(i, j, k, 1)*frhoed)
8744  q_yd = -(sj(i, j, k, 2)*frhoed)
8745  q_zd = -(sj(i, j, k, 3)*frhoed)
8746  ubard = tauxz*tempd1 + tauxy*tempd0 + tauxx*tempd
8747  tauxzd = ubar*tempd1 + wbar*tempd + sj(i, j, k, 1)*fmzd + sj(i, &
8748 & j, k, 3)*fmxd
8749  vbard = tauyz*tempd1 + tauyy*tempd0 + tauxy*tempd
8750  tauyzd = vbar*tempd1 + wbar*tempd0 + sj(i, j, k, 2)*fmzd + sj(i&
8751 & , j, k, 3)*fmyd
8752  wbard = tauzz*tempd1 + tauyz*tempd0 + tauxz*tempd
8753  tauzzd = wbar*tempd1 + sj(i, j, k, 3)*fmzd
8754  tauxyd = ubar*tempd0 + vbar*tempd + sj(i, j, k, 1)*fmyd + sj(i, &
8755 & j, k, 2)*fmxd
8756  tauyyd = vbar*tempd0 + sj(i, j, k, 2)*fmyd
8757  tauxxd = ubar*tempd + sj(i, j, k, 1)*fmxd
8758  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wbard
8759  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) + half*wbard
8760  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vbard
8761  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) + half*vbard
8762  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*ubard
8763  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) + half*ubard
8764 branch = myintstack(myintptr)
8765  myintptr = myintptr - 1
8766  if (branch .eq. 0) then
8767  eyzd = -tauyzd
8768  exzd = -tauxzd
8769  tempd = fact*eyzd
8770  tauxzsd = mut*tauxzd + wyx*tempd
8771  tauxysd = mut*tauxyd + wzx*tempd
8772  tauzzsd = mut*tauzzd + wyz*tempd
8773  tauyysd = mut*tauyyd + wzy*tempd
8774  wyxd = tauxzs*tempd
8775  wyzd = tauzzs*tempd
8776  wzxd = tauxys*tempd
8777  wzyd = tauyys*tempd
8778  tempd = fact*exzd
8779  mutd = tauyzs*tauyzd + tauxzs*tauxzd + tauxys*tauxyd + tauzzs*&
8780 & tauzzd + tauyys*tauyyd + tauxxs*tauxxd
8781  tauyzsd = mut*tauyzd + wxy*tempd
8782  exyd = -tauxyd
8783  ezzd = -tauzzd
8784  eyyd = -tauyyd
8785  tauxxsd = mut*tauxxd + wzx*tempd
8786  exxd = -tauxxd
8787  factd = (wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)*eyzd + (&
8788 & wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)*exzd + (wxy*&
8789 & tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)*exyd + (wzx*tauxzs+&
8790 & wzy*tauyzs)*two*ezzd + (wyx*tauxys+wyz*tauyzs)*two*eyyd + (&
8791 & wxy*tauxys+wxz*tauxzs)*two*exxd
8792  wxyd = tauyzs*tempd
8793  wxzd = tauzzs*tempd
8794  tauzzsd = tauzzsd + wxz*tempd
8795  wzxd = wzxd + tauxxs*tempd
8796  wzyd = wzyd + tauxys*tempd
8797  tauxysd = tauxysd + wzy*tempd
8798  tempd = fact*exyd
8799  wxyd = wxyd + tauyys*tempd
8800  tauyysd = tauyysd + wxy*tempd
8801  wxzd = wxzd + tauyzs*tempd
8802  tauyzsd = tauyzsd + wxz*tempd
8803  wyxd = wyxd + tauxxs*tempd
8804  tauxxsd = tauxxsd + wyx*tempd
8805  wyzd = wyzd + tauxzs*tempd
8806  tauxzsd = tauxzsd + wyz*tempd
8807  tempd = fact*two*ezzd
8808  wzxd = wzxd + tauxzs*tempd
8809  tauxzsd = tauxzsd + wzx*tempd
8810  wzyd = wzyd + tauyzs*tempd
8811  tauyzsd = tauyzsd + wzy*tempd
8812  tempd = fact*two*eyyd
8813  wyxd = wyxd + tauxys*tempd
8814  tauxysd = tauxysd + wyx*tempd
8815  wyzd = wyzd + tauyzs*tempd - wzyd
8816  tauyzsd = tauyzsd + wyz*tempd
8817  tempd = fact*two*exxd
8818  wxyd = wxyd + tauxys*tempd - wyxd
8819  tauxysd = tauxysd + wxy*tempd
8820  wxzd = wxzd + tauxzs*tempd - wzxd
8821  tauxzsd = tauxzsd + wxz*tempd
8822  v_zd = wyzd
8823  w_yd = -wyzd
8824  u_zd = wxzd
8825  w_xd = -wxzd
8826  u_yd = wxyd
8827  v_xd = -wxyd
8828  tempd = ccr1*factd/den
8829  mued = mued + tempd
8830  dend = -(mue*tempd/den)
8831 branch = myintstack(myintptr)
8832  myintptr = myintptr - 1
8833  if (branch .eq. 0) dend = 0.0_8
8834  if (u_x**2 + u_y**2 + u_z**2 + v_x**2 + v_y**2 + v_z**2 + w_x&
8835 & **2 + w_y**2 + w_z**2 .eq. 0.0_8) then
8836  tempd = 0.0_8
8837  else
8838  tempd = dend/(2.0*sqrt(u_x**2+u_y**2+u_z**2+v_x**2+v_y**2+&
8839 & v_z**2+w_x**2+w_y**2+w_z**2))
8840  end if
8841  u_xd = 2*u_x*tempd
8842  u_yd = u_yd + 2*u_y*tempd
8843  u_zd = u_zd + 2*u_z*tempd
8844  v_xd = v_xd + 2*v_x*tempd
8845  v_yd = 2*v_y*tempd
8846  v_zd = v_zd + 2*v_z*tempd
8847  w_xd = w_xd + 2*w_x*tempd
8848  w_yd = w_yd + 2*w_y*tempd
8849  w_zd = 2*w_z*tempd
8850  else
8851  mutd = tauyzs*tauyzd + tauxzs*tauxzd + tauxys*tauxyd + tauzzs*&
8852 & tauzzd + tauyys*tauyyd + tauxxs*tauxxd
8853  tauyzsd = mut*tauyzd
8854  tauxzsd = mut*tauxzd
8855  tauxysd = mut*tauxyd
8856  tauzzsd = mut*tauzzd
8857  tauyysd = mut*tauyyd
8858  tauxxsd = mut*tauxxd
8859  u_xd = 0.0_8
8860  u_yd = 0.0_8
8861  u_zd = 0.0_8
8862  w_xd = 0.0_8
8863  w_yd = 0.0_8
8864  w_zd = 0.0_8
8865  v_xd = 0.0_8
8866  v_yd = 0.0_8
8867  v_zd = 0.0_8
8868  end if
8869  fracdivd = -tauzzsd - tauyysd - tauxxsd
8870  tempd = twothird*fracdivd
8871  heatcoefd = q_z*q_zd + q_y*q_yd + q_x*q_xd
8872  q_zd = heatcoef*q_zd
8873  q_yd = heatcoef*q_yd
8874  q_xd = heatcoef*q_xd
8875  v_zd = v_zd + tauyzsd
8876  w_yd = w_yd + tauyzsd
8877  u_zd = u_zd + tauxzsd
8878  w_xd = w_xd + tauxzsd
8879  u_yd = u_yd + tauxysd
8880  v_xd = v_xd + tauxysd
8881  w_zd = w_zd + two*tauzzsd + tempd
8882  v_yd = v_yd + two*tauyysd + tempd
8883  u_xd = u_xd + two*tauxxsd + tempd
8884  corrd = -(ssz*q_zd) - ssy*q_yd - ssx*q_xd
8885  q_xd = q_xd + ssx*corrd
8886  q_yd = q_yd + ssy*corrd
8887  q_zd = q_zd + ssz*corrd
8888  aad(i, j+1, k) = aad(i, j+1, k) + ss*corrd
8889  aad(i, j, k) = aad(i, j, k) - ss*corrd
8890  corrd = -(ssz*w_zd) - ssy*w_yd - ssx*w_xd
8891  w_xd = w_xd + ssx*corrd
8892  w_yd = w_yd + ssy*corrd
8893  w_zd = w_zd + ssz*corrd
8894  wd(i, j+1, k, ivz) = wd(i, j+1, k, ivz) - ss*corrd
8895  wd(i, j, k, ivz) = wd(i, j, k, ivz) + ss*corrd
8896  corrd = -(ssz*v_zd) - ssy*v_yd - ssx*v_xd
8897  v_xd = v_xd + ssx*corrd
8898  v_yd = v_yd + ssy*corrd
8899  v_zd = v_zd + ssz*corrd
8900  wd(i, j+1, k, ivy) = wd(i, j+1, k, ivy) - ss*corrd
8901  wd(i, j, k, ivy) = wd(i, j, k, ivy) + ss*corrd
8902  corrd = -(ssz*u_zd) - ssy*u_yd - ssx*u_xd
8903  u_xd = u_xd + ssx*corrd
8904  u_yd = u_yd + ssy*corrd
8905  u_zd = u_zd + ssz*corrd
8906  wd(i, j+1, k, ivx) = wd(i, j+1, k, ivx) - ss*corrd
8907  wd(i, j, k, ivx) = wd(i, j, k, ivx) + ss*corrd
8908  tempd = fourth*q_zd
8909  qzd(i-1, j, k-1) = qzd(i-1, j, k-1) + tempd
8910  qzd(i, j, k-1) = qzd(i, j, k-1) + tempd
8911  qzd(i-1, j, k) = qzd(i-1, j, k) + tempd
8912  qzd(i, j, k) = qzd(i, j, k) + tempd
8913  tempd = fourth*q_yd
8914  qyd(i-1, j, k-1) = qyd(i-1, j, k-1) + tempd
8915  qyd(i, j, k-1) = qyd(i, j, k-1) + tempd
8916  qyd(i-1, j, k) = qyd(i-1, j, k) + tempd
8917  qyd(i, j, k) = qyd(i, j, k) + tempd
8918  tempd = fourth*q_xd
8919  qxd(i-1, j, k-1) = qxd(i-1, j, k-1) + tempd
8920  qxd(i, j, k-1) = qxd(i, j, k-1) + tempd
8921  qxd(i-1, j, k) = qxd(i-1, j, k) + tempd
8922  qxd(i, j, k) = qxd(i, j, k) + tempd
8923  tempd = fourth*w_zd
8924  wzd(i-1, j, k-1) = wzd(i-1, j, k-1) + tempd
8925  wzd(i, j, k-1) = wzd(i, j, k-1) + tempd
8926  wzd(i-1, j, k) = wzd(i-1, j, k) + tempd
8927  wzd(i, j, k) = wzd(i, j, k) + tempd
8928  tempd = fourth*w_yd
8929  wyd(i-1, j, k-1) = wyd(i-1, j, k-1) + tempd
8930  wyd(i, j, k-1) = wyd(i, j, k-1) + tempd
8931  wyd(i-1, j, k) = wyd(i-1, j, k) + tempd
8932  wyd(i, j, k) = wyd(i, j, k) + tempd
8933  tempd = fourth*w_xd
8934  wxd(i-1, j, k-1) = wxd(i-1, j, k-1) + tempd
8935  wxd(i, j, k-1) = wxd(i, j, k-1) + tempd
8936  wxd(i-1, j, k) = wxd(i-1, j, k) + tempd
8937  wxd(i, j, k) = wxd(i, j, k) + tempd
8938  tempd = fourth*v_zd
8939  vzd(i-1, j, k-1) = vzd(i-1, j, k-1) + tempd
8940  vzd(i, j, k-1) = vzd(i, j, k-1) + tempd
8941  vzd(i-1, j, k) = vzd(i-1, j, k) + tempd
8942  vzd(i, j, k) = vzd(i, j, k) + tempd
8943  tempd = fourth*v_yd
8944  vyd(i-1, j, k-1) = vyd(i-1, j, k-1) + tempd
8945  vyd(i, j, k-1) = vyd(i, j, k-1) + tempd
8946  vyd(i-1, j, k) = vyd(i-1, j, k) + tempd
8947  vyd(i, j, k) = vyd(i, j, k) + tempd
8948  tempd = fourth*v_xd
8949  vxd(i-1, j, k-1) = vxd(i-1, j, k-1) + tempd
8950  vxd(i, j, k-1) = vxd(i, j, k-1) + tempd
8951  vxd(i-1, j, k) = vxd(i-1, j, k) + tempd
8952  vxd(i, j, k) = vxd(i, j, k) + tempd
8953  tempd = fourth*u_zd
8954  uzd(i-1, j, k-1) = uzd(i-1, j, k-1) + tempd
8955  uzd(i, j, k-1) = uzd(i, j, k-1) + tempd
8956  uzd(i-1, j, k) = uzd(i-1, j, k) + tempd
8957  uzd(i, j, k) = uzd(i, j, k) + tempd
8958  tempd = fourth*u_yd
8959  uyd(i-1, j, k-1) = uyd(i-1, j, k-1) + tempd
8960  uyd(i, j, k-1) = uyd(i, j, k-1) + tempd
8961  uyd(i-1, j, k) = uyd(i-1, j, k) + tempd
8962  uyd(i, j, k) = uyd(i, j, k) + tempd
8963  tempd = fourth*u_xd
8964  uxd(i-1, j, k-1) = uxd(i-1, j, k-1) + tempd
8965  uxd(i, j, k-1) = uxd(i, j, k-1) + tempd
8966  uxd(i-1, j, k) = uxd(i-1, j, k) + tempd
8967  uxd(i, j, k) = uxd(i, j, k) + tempd
8968  muld = factlamheat*heatcoefd + mutd
8969  mued = mued + factturbheat*heatcoefd + mutd
8970 branch = myintstack(myintptr)
8971  myintptr = myintptr - 1
8972  if (branch .eq. 0) then
8973  revd(i, j, k) = revd(i, j, k) + por*mued
8974  revd(i, j+1, k) = revd(i, j+1, k) + por*mued
8975  mued = 0.0_8
8976  end if
8977  rlvd(i, j, k) = rlvd(i, j, k) + por*muld
8978  rlvd(i, j+1, k) = rlvd(i, j+1, k) + por*muld
8979  end do
8980  mued = 0.0_8
8981 !
8982 ! viscous fluxes in the k-direction.
8983 !
8984  mue = zero
8985  mued = 0.0_8
8986 !$bwd-of ii-loop
8987  do ii=0,nx*ny*kl-1
8988  i = mod(ii, nx) + 2
8989  j = mod(ii/nx, ny) + 2
8990  k = ii/(nx*ny) + 1
8991 ! set the value of the porosity. if not zero, it is set
8992 ! to average the eddy-viscosity and to take the factor
8993 ! rfilv into account.
8994  por = half*rfilv
8995  if (pork(i, j, k) .eq. noflux) por = zero
8996 ! compute the laminar and (if present) the eddy viscosities
8997 ! multiplied by the porosity. compute the factor in front of
8998 ! the gradients of the speed of sound squared for the heat
8999 ! flux.
9000  mul = por*(rlv(i, j, k)+rlv(i, j, k+1))
9001  if (eddymodel) then
9002  mue = por*(rev(i, j, k)+rev(i, j, k+1))
9003 myintptr = myintptr + 1
9004  myintstack(myintptr) = 0
9005  else
9006 myintptr = myintptr + 1
9007  myintstack(myintptr) = 1
9008  end if
9009  mut = mul + mue
9010  gm1 = half*(gamma(i, j, k)+gamma(i, j, k+1)) - one
9011  factlamheat = one/(prandtl*gm1)
9012  factturbheat = one/(prandtlturb*gm1)
9013  heatcoef = mul*factlamheat + mue*factturbheat
9014 ! compute the gradients at the face by averaging the four
9015 ! nodal values.
9016  u_x = fourth*(ux(i-1, j-1, k)+ux(i, j-1, k)+ux(i-1, j, k)+ux(i, &
9017 & j, k))
9018  u_y = fourth*(uy(i-1, j-1, k)+uy(i, j-1, k)+uy(i-1, j, k)+uy(i, &
9019 & j, k))
9020  u_z = fourth*(uz(i-1, j-1, k)+uz(i, j-1, k)+uz(i-1, j, k)+uz(i, &
9021 & j, k))
9022  v_x = fourth*(vx(i-1, j-1, k)+vx(i, j-1, k)+vx(i-1, j, k)+vx(i, &
9023 & j, k))
9024  v_y = fourth*(vy(i-1, j-1, k)+vy(i, j-1, k)+vy(i-1, j, k)+vy(i, &
9025 & j, k))
9026  v_z = fourth*(vz(i-1, j-1, k)+vz(i, j-1, k)+vz(i-1, j, k)+vz(i, &
9027 & j, k))
9028  w_x = fourth*(wx(i-1, j-1, k)+wx(i, j-1, k)+wx(i-1, j, k)+wx(i, &
9029 & j, k))
9030  w_y = fourth*(wy(i-1, j-1, k)+wy(i, j-1, k)+wy(i-1, j, k)+wy(i, &
9031 & j, k))
9032  w_z = fourth*(wz(i-1, j-1, k)+wz(i, j-1, k)+wz(i-1, j, k)+wz(i, &
9033 & j, k))
9034  q_x = fourth*(qx(i-1, j-1, k)+qx(i, j-1, k)+qx(i-1, j, k)+qx(i, &
9035 & j, k))
9036  q_y = fourth*(qy(i-1, j-1, k)+qy(i, j-1, k)+qy(i-1, j, k)+qy(i, &
9037 & j, k))
9038  q_z = fourth*(qz(i-1, j-1, k)+qz(i, j-1, k)+qz(i-1, j, k)+qz(i, &
9039 & j, k))
9040 ! the gradients in the normal direction are corrected, such
9041 ! that no averaging takes places here.
9042 ! first determine the vector in the direction from the
9043 ! cell center k to cell center k+1.
9044  ssx = eighth*(x(i-1, j-1, k+1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j, &
9045 & k+1, 1)-x(i-1, j, k-1, 1)+x(i, j-1, k+1, 1)-x(i, j-1, k-1, 1)+&
9046 & x(i, j, k+1, 1)-x(i, j, k-1, 1))
9047  ssy = eighth*(x(i-1, j-1, k+1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j, &
9048 & k+1, 2)-x(i-1, j, k-1, 2)+x(i, j-1, k+1, 2)-x(i, j-1, k-1, 2)+&
9049 & x(i, j, k+1, 2)-x(i, j, k-1, 2))
9050  ssz = eighth*(x(i-1, j-1, k+1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j, &
9051 & k+1, 3)-x(i-1, j, k-1, 3)+x(i, j-1, k+1, 3)-x(i, j-1, k-1, 3)+&
9052 & x(i, j, k+1, 3)-x(i, j, k-1, 3))
9053 ! determine the length of this vector and create the
9054 ! unit normal.
9055  ss = one/sqrt(ssx*ssx+ssy*ssy+ssz*ssz)
9056  ssx = ss*ssx
9057  ssy = ss*ssy
9058  ssz = ss*ssz
9059 ! correct the gradients.
9060  corr = u_x*ssx + u_y*ssy + u_z*ssz - (w(i, j, k+1, ivx)-w(i, j, &
9061 & k, ivx))*ss
9062  u_x = u_x - corr*ssx
9063  u_y = u_y - corr*ssy
9064  u_z = u_z - corr*ssz
9065  corr = v_x*ssx + v_y*ssy + v_z*ssz - (w(i, j, k+1, ivy)-w(i, j, &
9066 & k, ivy))*ss
9067  v_x = v_x - corr*ssx
9068  v_y = v_y - corr*ssy
9069  v_z = v_z - corr*ssz
9070  corr = w_x*ssx + w_y*ssy + w_z*ssz - (w(i, j, k+1, ivz)-w(i, j, &
9071 & k, ivz))*ss
9072  w_x = w_x - corr*ssx
9073  w_y = w_y - corr*ssy
9074  w_z = w_z - corr*ssz
9075  corr = q_x*ssx + q_y*ssy + q_z*ssz + (aa(i, j, k+1)-aa(i, j, k))&
9076 & *ss
9077  q_x = q_x - corr*ssx
9078  q_y = q_y - corr*ssy
9079  q_z = q_z - corr*ssz
9080 ! compute the stress tensor and the heat flux vector.
9081 ! we remove the viscosity from the stress tensor (tau)
9082 ! to define taus since we still need to separate between
9083 ! laminar and turbulent stress for qcr.
9084 ! therefore, laminar tau = mue*taus, turbulent
9085 ! tau = mue*taus, and total tau = mut*taus.
9086  fracdiv = twothird*(u_x+v_y+w_z)
9087  tauxxs = two*u_x - fracdiv
9088  tauyys = two*v_y - fracdiv
9089  tauzzs = two*w_z - fracdiv
9090  tauxys = u_y + v_x
9091  tauxzs = u_z + w_x
9092  tauyzs = v_z + w_y
9093 ! add qcr corrections if necessary
9094  if (useqcr) then
9095 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
9096 !
9097 ! tau_ij,qcr = tau_ij - e_ij
9098 !
9099 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
9100 !
9101 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
9102 !
9103 ! we are computing o_ik as follows:
9104 !
9105 ! o_ik = 2*w_ik/den
9106 !
9107 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
9108 ! compute denominator
9109  den = sqrt(u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
9110 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z)
9111  if (den .lt. xminn) then
9112  den = xminn
9113 myintptr = myintptr + 1
9114  myintstack(myintptr) = 0
9115  else
9116 myintptr = myintptr + 1
9117  myintstack(myintptr) = 1
9118  den = den
9119  end if
9120 ! compute factor that will multiply all tensor components.
9121 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
9122 ! components as well.
9123  fact = mue*ccr1/den
9124 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
9125 ! the diagonals of the vorticity tensor components are always zero
9126  wxy = u_y - v_x
9127  wxz = u_z - w_x
9128  wyz = v_z - w_y
9129  wyx = -wxy
9130  wzx = -wxz
9131  wzy = -wyz
9132 ! compute the extra terms of the boussinesq relation
9133  exx = fact*(wxy*tauxys+wxz*tauxzs)*two
9134  eyy = fact*(wyx*tauxys+wyz*tauyzs)*two
9135  ezz = fact*(wzx*tauxzs+wzy*tauyzs)*two
9136  exy = fact*(wxy*tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)
9137  exz = fact*(wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)
9138  eyz = fact*(wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)
9139 ! apply the total viscosity to the stress tensor and add extra terms
9140  tauxx = mut*tauxxs - exx
9141  tauyy = mut*tauyys - eyy
9142  tauzz = mut*tauzzs - ezz
9143  tauxy = mut*tauxys - exy
9144  tauxz = mut*tauxzs - exz
9145  tauyz = mut*tauyzs - eyz
9146 myintptr = myintptr + 1
9147  myintstack(myintptr) = 0
9148  else
9149 ! just apply the total viscosity to the stress tensor
9150  tauxx = mut*tauxxs
9151  tauyy = mut*tauyys
9152  tauzz = mut*tauzzs
9153  tauxy = mut*tauxys
9154  tauxz = mut*tauxzs
9155  tauyz = mut*tauyzs
9156 myintptr = myintptr + 1
9157  myintstack(myintptr) = 1
9158  end if
9159 ! compute the average velocities for the face. remember that
9160 ! the velocities are stored and not the momentum.
9161  ubar = half*(w(i, j, k, ivx)+w(i, j, k+1, ivx))
9162  vbar = half*(w(i, j, k, ivy)+w(i, j, k+1, ivy))
9163  wbar = half*(w(i, j, k, ivz)+w(i, j, k+1, ivz))
9164 ! compute the viscous fluxes for this k-face.
9165 ! update the residuals of cell k and k+1.
9166 ! store the stress tensor and the heat flux vector if this
9167 ! face is part of a viscous subface. both the cases k == 1
9168 ! and k == kl must be tested.
9169  frhoed = fwd(i, j, k+1, irhoe) - fwd(i, j, k, irhoe)
9170  fmzd = fwd(i, j, k+1, imz) - fwd(i, j, k, imz)
9171  fmyd = fwd(i, j, k+1, imy) - fwd(i, j, k, imy)
9172  fmxd = fwd(i, j, k+1, imx) - fwd(i, j, k, imx)
9173  q_xd = -(sk(i, j, k, 1)*frhoed)
9174  q_yd = -(sk(i, j, k, 2)*frhoed)
9175  q_zd = -(sk(i, j, k, 3)*frhoed)
9176  tempd = sk(i, j, k, 3)*frhoed
9177  ubard = tauxz*tempd
9178  tauxzd = ubar*tempd
9179  vbard = tauyz*tempd
9180  tauyzd = vbar*tempd
9181  wbard = tauzz*tempd
9182  tauzzd = wbar*tempd + sk(i, j, k, 3)*fmzd
9183  tempd = sk(i, j, k, 2)*frhoed
9184  ubard = ubard + tauxy*tempd
9185  tauxyd = ubar*tempd
9186  vbard = vbard + tauyy*tempd
9187  tauyyd = vbar*tempd + sk(i, j, k, 2)*fmyd
9188  wbard = wbard + tauyz*tempd
9189  tauyzd = tauyzd + wbar*tempd + sk(i, j, k, 2)*fmzd + sk(i, j, k&
9190 & , 3)*fmyd
9191  tempd = sk(i, j, k, 1)*frhoed
9192  ubard = ubard + tauxx*tempd
9193  tauxxd = ubar*tempd + sk(i, j, k, 1)*fmxd
9194  vbard = vbard + tauxy*tempd
9195  tauxyd = tauxyd + vbar*tempd + sk(i, j, k, 1)*fmyd + sk(i, j, k&
9196 & , 2)*fmxd
9197  wbard = wbard + tauxz*tempd
9198  tauxzd = tauxzd + wbar*tempd + sk(i, j, k, 1)*fmzd + sk(i, j, k&
9199 & , 3)*fmxd
9200  wd(i, j, k, ivz) = wd(i, j, k, ivz) + half*wbard
9201  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) + half*wbard
9202  wd(i, j, k, ivy) = wd(i, j, k, ivy) + half*vbard
9203  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) + half*vbard
9204  wd(i, j, k, ivx) = wd(i, j, k, ivx) + half*ubard
9205  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) + half*ubard
9206 branch = myintstack(myintptr)
9207  myintptr = myintptr - 1
9208  if (branch .eq. 0) then
9209  eyzd = -tauyzd
9210  exzd = -tauxzd
9211  tempd = fact*eyzd
9212  tauxzsd = mut*tauxzd + wyx*tempd
9213  tauxysd = mut*tauxyd + wzx*tempd
9214  tauzzsd = mut*tauzzd + wyz*tempd
9215  tauyysd = mut*tauyyd + wzy*tempd
9216  wyxd = tauxzs*tempd
9217  wyzd = tauzzs*tempd
9218  wzxd = tauxys*tempd
9219  wzyd = tauyys*tempd
9220  tempd = fact*exzd
9221  mutd = tauyzs*tauyzd + tauxzs*tauxzd + tauxys*tauxyd + tauzzs*&
9222 & tauzzd + tauyys*tauyyd + tauxxs*tauxxd
9223  tauyzsd = mut*tauyzd + wxy*tempd
9224  exyd = -tauxyd
9225  ezzd = -tauzzd
9226  eyyd = -tauyyd
9227  tauxxsd = mut*tauxxd + wzx*tempd
9228  exxd = -tauxxd
9229  factd = (wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)*eyzd + (&
9230 & wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)*exzd + (wxy*&
9231 & tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)*exyd + (wzx*tauxzs+&
9232 & wzy*tauyzs)*two*ezzd + (wyx*tauxys+wyz*tauyzs)*two*eyyd + (&
9233 & wxy*tauxys+wxz*tauxzs)*two*exxd
9234  wxyd = tauyzs*tempd
9235  wxzd = tauzzs*tempd
9236  tauzzsd = tauzzsd + wxz*tempd
9237  wzxd = wzxd + tauxxs*tempd
9238  wzyd = wzyd + tauxys*tempd
9239  tauxysd = tauxysd + wzy*tempd
9240  tempd = fact*exyd
9241  wxyd = wxyd + tauyys*tempd
9242  tauyysd = tauyysd + wxy*tempd
9243  wxzd = wxzd + tauyzs*tempd
9244  tauyzsd = tauyzsd + wxz*tempd
9245  wyxd = wyxd + tauxxs*tempd
9246  tauxxsd = tauxxsd + wyx*tempd
9247  wyzd = wyzd + tauxzs*tempd
9248  tauxzsd = tauxzsd + wyz*tempd
9249  tempd = fact*two*ezzd
9250  wzxd = wzxd + tauxzs*tempd
9251  tauxzsd = tauxzsd + wzx*tempd
9252  wzyd = wzyd + tauyzs*tempd
9253  tauyzsd = tauyzsd + wzy*tempd
9254  tempd = fact*two*eyyd
9255  wyxd = wyxd + tauxys*tempd
9256  tauxysd = tauxysd + wyx*tempd
9257  wyzd = wyzd + tauyzs*tempd - wzyd
9258  tauyzsd = tauyzsd + wyz*tempd
9259  tempd = fact*two*exxd
9260  wxyd = wxyd + tauxys*tempd - wyxd
9261  tauxysd = tauxysd + wxy*tempd
9262  wxzd = wxzd + tauxzs*tempd - wzxd
9263  tauxzsd = tauxzsd + wxz*tempd
9264  v_zd = wyzd
9265  w_yd = -wyzd
9266  u_zd = wxzd
9267  w_xd = -wxzd
9268  u_yd = wxyd
9269  v_xd = -wxyd
9270  tempd = ccr1*factd/den
9271  mued = mued + tempd
9272  dend = -(mue*tempd/den)
9273 branch = myintstack(myintptr)
9274  myintptr = myintptr - 1
9275  if (branch .eq. 0) dend = 0.0_8
9276  if (u_x**2 + u_y**2 + u_z**2 + v_x**2 + v_y**2 + v_z**2 + w_x&
9277 & **2 + w_y**2 + w_z**2 .eq. 0.0_8) then
9278  tempd = 0.0_8
9279  else
9280  tempd = dend/(2.0*sqrt(u_x**2+u_y**2+u_z**2+v_x**2+v_y**2+&
9281 & v_z**2+w_x**2+w_y**2+w_z**2))
9282  end if
9283  u_xd = 2*u_x*tempd
9284  u_yd = u_yd + 2*u_y*tempd
9285  u_zd = u_zd + 2*u_z*tempd
9286  v_xd = v_xd + 2*v_x*tempd
9287  v_yd = 2*v_y*tempd
9288  v_zd = v_zd + 2*v_z*tempd
9289  w_xd = w_xd + 2*w_x*tempd
9290  w_yd = w_yd + 2*w_y*tempd
9291  w_zd = 2*w_z*tempd
9292  else
9293  mutd = tauyzs*tauyzd + tauxzs*tauxzd + tauxys*tauxyd + tauzzs*&
9294 & tauzzd + tauyys*tauyyd + tauxxs*tauxxd
9295  tauyzsd = mut*tauyzd
9296  tauxzsd = mut*tauxzd
9297  tauxysd = mut*tauxyd
9298  tauzzsd = mut*tauzzd
9299  tauyysd = mut*tauyyd
9300  tauxxsd = mut*tauxxd
9301  u_xd = 0.0_8
9302  u_yd = 0.0_8
9303  u_zd = 0.0_8
9304  w_xd = 0.0_8
9305  w_yd = 0.0_8
9306  w_zd = 0.0_8
9307  v_xd = 0.0_8
9308  v_yd = 0.0_8
9309  v_zd = 0.0_8
9310  end if
9311  fracdivd = -tauzzsd - tauyysd - tauxxsd
9312  tempd = twothird*fracdivd
9313  heatcoefd = q_z*q_zd + q_y*q_yd + q_x*q_xd
9314  q_zd = heatcoef*q_zd
9315  q_yd = heatcoef*q_yd
9316  q_xd = heatcoef*q_xd
9317  v_zd = v_zd + tauyzsd
9318  w_yd = w_yd + tauyzsd
9319  u_zd = u_zd + tauxzsd
9320  w_xd = w_xd + tauxzsd
9321  u_yd = u_yd + tauxysd
9322  v_xd = v_xd + tauxysd
9323  w_zd = w_zd + two*tauzzsd + tempd
9324  v_yd = v_yd + two*tauyysd + tempd
9325  u_xd = u_xd + two*tauxxsd + tempd
9326  corrd = -(ssz*q_zd) - ssy*q_yd - ssx*q_xd
9327  q_xd = q_xd + ssx*corrd
9328  q_yd = q_yd + ssy*corrd
9329  q_zd = q_zd + ssz*corrd
9330  aad(i, j, k+1) = aad(i, j, k+1) + ss*corrd
9331  aad(i, j, k) = aad(i, j, k) - ss*corrd
9332  corrd = -(ssz*w_zd) - ssy*w_yd - ssx*w_xd
9333  w_xd = w_xd + ssx*corrd
9334  w_yd = w_yd + ssy*corrd
9335  w_zd = w_zd + ssz*corrd
9336  wd(i, j, k+1, ivz) = wd(i, j, k+1, ivz) - ss*corrd
9337  wd(i, j, k, ivz) = wd(i, j, k, ivz) + ss*corrd
9338  corrd = -(ssz*v_zd) - ssy*v_yd - ssx*v_xd
9339  v_xd = v_xd + ssx*corrd
9340  v_yd = v_yd + ssy*corrd
9341  v_zd = v_zd + ssz*corrd
9342  wd(i, j, k+1, ivy) = wd(i, j, k+1, ivy) - ss*corrd
9343  wd(i, j, k, ivy) = wd(i, j, k, ivy) + ss*corrd
9344  corrd = -(ssz*u_zd) - ssy*u_yd - ssx*u_xd
9345  u_xd = u_xd + ssx*corrd
9346  u_yd = u_yd + ssy*corrd
9347  u_zd = u_zd + ssz*corrd
9348  wd(i, j, k+1, ivx) = wd(i, j, k+1, ivx) - ss*corrd
9349  wd(i, j, k, ivx) = wd(i, j, k, ivx) + ss*corrd
9350  tempd = fourth*q_zd
9351  qzd(i-1, j-1, k) = qzd(i-1, j-1, k) + tempd
9352  qzd(i, j-1, k) = qzd(i, j-1, k) + tempd
9353  qzd(i-1, j, k) = qzd(i-1, j, k) + tempd
9354  qzd(i, j, k) = qzd(i, j, k) + tempd
9355  tempd = fourth*q_yd
9356  qyd(i-1, j-1, k) = qyd(i-1, j-1, k) + tempd
9357  qyd(i, j-1, k) = qyd(i, j-1, k) + tempd
9358  qyd(i-1, j, k) = qyd(i-1, j, k) + tempd
9359  qyd(i, j, k) = qyd(i, j, k) + tempd
9360  tempd = fourth*q_xd
9361  qxd(i-1, j-1, k) = qxd(i-1, j-1, k) + tempd
9362  qxd(i, j-1, k) = qxd(i, j-1, k) + tempd
9363  qxd(i-1, j, k) = qxd(i-1, j, k) + tempd
9364  qxd(i, j, k) = qxd(i, j, k) + tempd
9365  tempd = fourth*w_zd
9366  wzd(i-1, j-1, k) = wzd(i-1, j-1, k) + tempd
9367  wzd(i, j-1, k) = wzd(i, j-1, k) + tempd
9368  wzd(i-1, j, k) = wzd(i-1, j, k) + tempd
9369  wzd(i, j, k) = wzd(i, j, k) + tempd
9370  tempd = fourth*w_yd
9371  wyd(i-1, j-1, k) = wyd(i-1, j-1, k) + tempd
9372  wyd(i, j-1, k) = wyd(i, j-1, k) + tempd
9373  wyd(i-1, j, k) = wyd(i-1, j, k) + tempd
9374  wyd(i, j, k) = wyd(i, j, k) + tempd
9375  tempd = fourth*w_xd
9376  wxd(i-1, j-1, k) = wxd(i-1, j-1, k) + tempd
9377  wxd(i, j-1, k) = wxd(i, j-1, k) + tempd
9378  wxd(i-1, j, k) = wxd(i-1, j, k) + tempd
9379  wxd(i, j, k) = wxd(i, j, k) + tempd
9380  tempd = fourth*v_zd
9381  vzd(i-1, j-1, k) = vzd(i-1, j-1, k) + tempd
9382  vzd(i, j-1, k) = vzd(i, j-1, k) + tempd
9383  vzd(i-1, j, k) = vzd(i-1, j, k) + tempd
9384  vzd(i, j, k) = vzd(i, j, k) + tempd
9385  tempd = fourth*v_yd
9386  vyd(i-1, j-1, k) = vyd(i-1, j-1, k) + tempd
9387  vyd(i, j-1, k) = vyd(i, j-1, k) + tempd
9388  vyd(i-1, j, k) = vyd(i-1, j, k) + tempd
9389  vyd(i, j, k) = vyd(i, j, k) + tempd
9390  tempd = fourth*v_xd
9391  vxd(i-1, j-1, k) = vxd(i-1, j-1, k) + tempd
9392  vxd(i, j-1, k) = vxd(i, j-1, k) + tempd
9393  vxd(i-1, j, k) = vxd(i-1, j, k) + tempd
9394  vxd(i, j, k) = vxd(i, j, k) + tempd
9395  tempd = fourth*u_zd
9396  uzd(i-1, j-1, k) = uzd(i-1, j-1, k) + tempd
9397  uzd(i, j-1, k) = uzd(i, j-1, k) + tempd
9398  uzd(i-1, j, k) = uzd(i-1, j, k) + tempd
9399  uzd(i, j, k) = uzd(i, j, k) + tempd
9400  tempd = fourth*u_yd
9401  uyd(i-1, j-1, k) = uyd(i-1, j-1, k) + tempd
9402  uyd(i, j-1, k) = uyd(i, j-1, k) + tempd
9403  uyd(i-1, j, k) = uyd(i-1, j, k) + tempd
9404  uyd(i, j, k) = uyd(i, j, k) + tempd
9405  tempd = fourth*u_xd
9406  uxd(i-1, j-1, k) = uxd(i-1, j-1, k) + tempd
9407  uxd(i, j-1, k) = uxd(i, j-1, k) + tempd
9408  uxd(i-1, j, k) = uxd(i-1, j, k) + tempd
9409  uxd(i, j, k) = uxd(i, j, k) + tempd
9410  muld = factlamheat*heatcoefd + mutd
9411  mued = mued + factturbheat*heatcoefd + mutd
9412 branch = myintstack(myintptr)
9413  myintptr = myintptr - 1
9414  if (branch .eq. 0) then
9415  revd(i, j, k) = revd(i, j, k) + por*mued
9416  revd(i, j, k+1) = revd(i, j, k+1) + por*mued
9417  mued = 0.0_8
9418  end if
9419  rlvd(i, j, k) = rlvd(i, j, k) + por*muld
9420  rlvd(i, j, k+1) = rlvd(i, j, k+1) + por*muld
9421  end do
9422  end if
9423  end subroutine viscousflux_fast_b
9424 
9425  subroutine viscousflux()
9426 !
9427 ! viscousflux computes the viscous fluxes using a central
9428 ! difference scheme for a block.
9429 ! it is assumed that the pointers in block pointer already point
9430 ! to the correct block.
9431 !
9432  use constants
9433  use blockpointers
9434  use flowvarrefstate
9435  use inputphysics
9436  use iteration
9437  implicit none
9438 !
9439 ! local parameter.
9440 !
9441  real(kind=realtype), parameter :: twothird=two*third
9442  real(kind=realtype), parameter :: xminn=1.e-14_realtype
9443 !
9444 ! local variables.
9445 !
9446  integer(kind=inttype) :: i, j, k, ii
9447  real(kind=realtype) :: rfilv, por, mul, mue, mut, heatcoef
9448  real(kind=realtype) :: gm1, factlamheat, factturbheat
9449  real(kind=realtype) :: u_x, u_y, u_z, v_x, v_y, v_z, w_x, w_y, w_z
9450  real(kind=realtype) :: q_x, q_y, q_z, ubar, vbar, wbar
9451  real(kind=realtype) :: corr, ssx, ssy, ssz, ss, fracdiv
9452  real(kind=realtype) :: tauxx, tauyy, tauzz
9453  real(kind=realtype) :: tauxy, tauxz, tauyz
9454  real(kind=realtype) :: tauxxs, tauyys, tauzzs
9455  real(kind=realtype) :: tauxys, tauxzs, tauyzs
9456  real(kind=realtype) :: exx, eyy, ezz
9457  real(kind=realtype) :: exy, exz, eyz
9458  real(kind=realtype) :: wxy, wxz, wyz, wyx, wzx, wzy
9459  real(kind=realtype) :: den, ccr1, fact
9460  real(kind=realtype) :: fmx, fmy, fmz, frhoe
9461  logical :: correctfork, storewalltensor
9462  intrinsic abs
9463  intrinsic mod
9464  intrinsic sqrt
9465  intrinsic max
9466  real(kind=realtype) :: abs0
9467 ! set qcr parameters
9468  ccr1 = 0.3_realtype
9469 ! set rfilv to rfil to indicate that this is the viscous part.
9470 ! if rfilv == 0 the viscous residuals need not to be computed
9471 ! and a return can be made.
9472  rfilv = rfil
9473  if (rfilv .ge. 0.) then
9474  abs0 = rfilv
9475  else
9476  abs0 = -rfilv
9477  end if
9478  if (abs0 .lt. thresholdreal) then
9479  return
9480  else
9481 ! determine whether or not the wall stress tensor and wall heat
9482 ! flux must be stored for viscous walls.
9483  storewalltensor = .false.
9484  if (wallfunctions) then
9485  storewalltensor = .true.
9486  else if (rkstage .eq. 0 .and. currentlevel .eq. groundlevel) then
9487  storewalltensor = .true.
9488  end if
9489 !$ad checkpoint-start
9490 !
9491 ! viscous fluxes in the k-direction.
9492 !
9493  mue = zero
9494 !$ad ii-loop
9495  do ii=0,nx*ny*kl-1
9496  i = mod(ii, nx) + 2
9497  j = mod(ii/nx, ny) + 2
9498  k = ii/(nx*ny) + 1
9499 ! set the value of the porosity. if not zero, it is set
9500 ! to average the eddy-viscosity and to take the factor
9501 ! rfilv into account.
9502  por = half*rfilv
9503  if (pork(i, j, k) .eq. noflux) por = zero
9504 ! compute the laminar and (if present) the eddy viscosities
9505 ! multiplied by the porosity. compute the factor in front of
9506 ! the gradients of the speed of sound squared for the heat
9507 ! flux.
9508  mul = por*(rlv(i, j, k)+rlv(i, j, k+1))
9509  if (eddymodel) mue = por*(rev(i, j, k)+rev(i, j, k+1))
9510  mut = mul + mue
9511  gm1 = half*(gamma(i, j, k)+gamma(i, j, k+1)) - one
9512  factlamheat = one/(prandtl*gm1)
9513  factturbheat = one/(prandtlturb*gm1)
9514  heatcoef = mul*factlamheat + mue*factturbheat
9515 ! compute the gradients at the face by averaging the four
9516 ! nodal values.
9517  u_x = fourth*(ux(i-1, j-1, k)+ux(i, j-1, k)+ux(i-1, j, k)+ux(i, &
9518 & j, k))
9519  u_y = fourth*(uy(i-1, j-1, k)+uy(i, j-1, k)+uy(i-1, j, k)+uy(i, &
9520 & j, k))
9521  u_z = fourth*(uz(i-1, j-1, k)+uz(i, j-1, k)+uz(i-1, j, k)+uz(i, &
9522 & j, k))
9523  v_x = fourth*(vx(i-1, j-1, k)+vx(i, j-1, k)+vx(i-1, j, k)+vx(i, &
9524 & j, k))
9525  v_y = fourth*(vy(i-1, j-1, k)+vy(i, j-1, k)+vy(i-1, j, k)+vy(i, &
9526 & j, k))
9527  v_z = fourth*(vz(i-1, j-1, k)+vz(i, j-1, k)+vz(i-1, j, k)+vz(i, &
9528 & j, k))
9529  w_x = fourth*(wx(i-1, j-1, k)+wx(i, j-1, k)+wx(i-1, j, k)+wx(i, &
9530 & j, k))
9531  w_y = fourth*(wy(i-1, j-1, k)+wy(i, j-1, k)+wy(i-1, j, k)+wy(i, &
9532 & j, k))
9533  w_z = fourth*(wz(i-1, j-1, k)+wz(i, j-1, k)+wz(i-1, j, k)+wz(i, &
9534 & j, k))
9535  q_x = fourth*(qx(i-1, j-1, k)+qx(i, j-1, k)+qx(i-1, j, k)+qx(i, &
9536 & j, k))
9537  q_y = fourth*(qy(i-1, j-1, k)+qy(i, j-1, k)+qy(i-1, j, k)+qy(i, &
9538 & j, k))
9539  q_z = fourth*(qz(i-1, j-1, k)+qz(i, j-1, k)+qz(i-1, j, k)+qz(i, &
9540 & j, k))
9541 ! the gradients in the normal direction are corrected, such
9542 ! that no averaging takes places here.
9543 ! first determine the vector in the direction from the
9544 ! cell center k to cell center k+1.
9545  ssx = eighth*(x(i-1, j-1, k+1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j, &
9546 & k+1, 1)-x(i-1, j, k-1, 1)+x(i, j-1, k+1, 1)-x(i, j-1, k-1, 1)+&
9547 & x(i, j, k+1, 1)-x(i, j, k-1, 1))
9548  ssy = eighth*(x(i-1, j-1, k+1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j, &
9549 & k+1, 2)-x(i-1, j, k-1, 2)+x(i, j-1, k+1, 2)-x(i, j-1, k-1, 2)+&
9550 & x(i, j, k+1, 2)-x(i, j, k-1, 2))
9551  ssz = eighth*(x(i-1, j-1, k+1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j, &
9552 & k+1, 3)-x(i-1, j, k-1, 3)+x(i, j-1, k+1, 3)-x(i, j-1, k-1, 3)+&
9553 & x(i, j, k+1, 3)-x(i, j, k-1, 3))
9554 ! determine the length of this vector and create the
9555 ! unit normal.
9556  ss = one/sqrt(ssx*ssx+ssy*ssy+ssz*ssz)
9557  ssx = ss*ssx
9558  ssy = ss*ssy
9559  ssz = ss*ssz
9560 ! correct the gradients.
9561  corr = u_x*ssx + u_y*ssy + u_z*ssz - (w(i, j, k+1, ivx)-w(i, j, &
9562 & k, ivx))*ss
9563  u_x = u_x - corr*ssx
9564  u_y = u_y - corr*ssy
9565  u_z = u_z - corr*ssz
9566  corr = v_x*ssx + v_y*ssy + v_z*ssz - (w(i, j, k+1, ivy)-w(i, j, &
9567 & k, ivy))*ss
9568  v_x = v_x - corr*ssx
9569  v_y = v_y - corr*ssy
9570  v_z = v_z - corr*ssz
9571  corr = w_x*ssx + w_y*ssy + w_z*ssz - (w(i, j, k+1, ivz)-w(i, j, &
9572 & k, ivz))*ss
9573  w_x = w_x - corr*ssx
9574  w_y = w_y - corr*ssy
9575  w_z = w_z - corr*ssz
9576  corr = q_x*ssx + q_y*ssy + q_z*ssz + (aa(i, j, k+1)-aa(i, j, k))&
9577 & *ss
9578  q_x = q_x - corr*ssx
9579  q_y = q_y - corr*ssy
9580  q_z = q_z - corr*ssz
9581 ! compute the stress tensor and the heat flux vector.
9582 ! we remove the viscosity from the stress tensor (tau)
9583 ! to define taus since we still need to separate between
9584 ! laminar and turbulent stress for qcr.
9585 ! therefore, laminar tau = mue*taus, turbulent
9586 ! tau = mue*taus, and total tau = mut*taus.
9587  fracdiv = twothird*(u_x+v_y+w_z)
9588  tauxxs = two*u_x - fracdiv
9589  tauyys = two*v_y - fracdiv
9590  tauzzs = two*w_z - fracdiv
9591  tauxys = u_y + v_x
9592  tauxzs = u_z + w_x
9593  tauyzs = v_z + w_y
9594  q_x = heatcoef*q_x
9595  q_y = heatcoef*q_y
9596  q_z = heatcoef*q_z
9597 ! add qcr corrections if necessary
9598  if (useqcr) then
9599 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
9600 !
9601 ! tau_ij,qcr = tau_ij - e_ij
9602 !
9603 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
9604 !
9605 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
9606 !
9607 ! we are computing o_ik as follows:
9608 !
9609 ! o_ik = 2*w_ik/den
9610 !
9611 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
9612 ! compute denominator
9613  den = sqrt(u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
9614 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z)
9615  if (den .lt. xminn) then
9616  den = xminn
9617  else
9618  den = den
9619  end if
9620 ! compute factor that will multiply all tensor components.
9621 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
9622 ! components as well.
9623  fact = mue*ccr1/den
9624 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
9625 ! the diagonals of the vorticity tensor components are always zero
9626  wxy = u_y - v_x
9627  wxz = u_z - w_x
9628  wyz = v_z - w_y
9629  wyx = -wxy
9630  wzx = -wxz
9631  wzy = -wyz
9632 ! compute the extra terms of the boussinesq relation
9633  exx = fact*(wxy*tauxys+wxz*tauxzs)*two
9634  eyy = fact*(wyx*tauxys+wyz*tauyzs)*two
9635  ezz = fact*(wzx*tauxzs+wzy*tauyzs)*two
9636  exy = fact*(wxy*tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)
9637  exz = fact*(wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)
9638  eyz = fact*(wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)
9639 ! apply the total viscosity to the stress tensor and add extra terms
9640  tauxx = mut*tauxxs - exx
9641  tauyy = mut*tauyys - eyy
9642  tauzz = mut*tauzzs - ezz
9643  tauxy = mut*tauxys - exy
9644  tauxz = mut*tauxzs - exz
9645  tauyz = mut*tauyzs - eyz
9646  else
9647 ! just apply the total viscosity to the stress tensor
9648  tauxx = mut*tauxxs
9649  tauyy = mut*tauyys
9650  tauzz = mut*tauzzs
9651  tauxy = mut*tauxys
9652  tauxz = mut*tauxzs
9653  tauyz = mut*tauyzs
9654  end if
9655 ! compute the average velocities for the face. remember that
9656 ! the velocities are stored and not the momentum.
9657  ubar = half*(w(i, j, k, ivx)+w(i, j, k+1, ivx))
9658  vbar = half*(w(i, j, k, ivy)+w(i, j, k+1, ivy))
9659  wbar = half*(w(i, j, k, ivz)+w(i, j, k+1, ivz))
9660 ! compute the viscous fluxes for this k-face.
9661  fmx = tauxx*sk(i, j, k, 1) + tauxy*sk(i, j, k, 2) + tauxz*sk(i, &
9662 & j, k, 3)
9663  fmy = tauxy*sk(i, j, k, 1) + tauyy*sk(i, j, k, 2) + tauyz*sk(i, &
9664 & j, k, 3)
9665  fmz = tauxz*sk(i, j, k, 1) + tauyz*sk(i, j, k, 2) + tauzz*sk(i, &
9666 & j, k, 3)
9667  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*sk(i, j, k, 1)
9668  frhoe = frhoe + (ubar*tauxy+vbar*tauyy+wbar*tauyz)*sk(i, j, k, 2&
9669 & )
9670  frhoe = frhoe + (ubar*tauxz+vbar*tauyz+wbar*tauzz)*sk(i, j, k, 3&
9671 & )
9672  frhoe = frhoe - q_x*sk(i, j, k, 1) - q_y*sk(i, j, k, 2) - q_z*sk&
9673 & (i, j, k, 3)
9674 ! update the residuals of cell k and k+1.
9675  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
9676  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
9677  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
9678  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
9679  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fmx
9680  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fmy
9681  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fmz
9682  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + frhoe
9683 ! store the stress tensor and the heat flux vector if this
9684 ! face is part of a viscous subface. both the cases k == 1
9685 ! and k == kl must be tested.
9686  if (k .eq. 1 .and. storewalltensor .and. visckminpointer(i, j) &
9687 & .gt. 0) then
9688 ! we need to index viscsubface with visckminpointer(i,j)
9689 ! since tapenade does not like temporary indexes
9690  viscsubface(visckminpointer(i, j))%tau(i, j, 1) = tauxx
9691  viscsubface(visckminpointer(i, j))%tau(i, j, 2) = tauyy
9692  viscsubface(visckminpointer(i, j))%tau(i, j, 3) = tauzz
9693  viscsubface(visckminpointer(i, j))%tau(i, j, 4) = tauxy
9694  viscsubface(visckminpointer(i, j))%tau(i, j, 5) = tauxz
9695  viscsubface(visckminpointer(i, j))%tau(i, j, 6) = tauyz
9696  viscsubface(visckminpointer(i, j))%q(i, j, 1) = q_x
9697  viscsubface(visckminpointer(i, j))%q(i, j, 2) = q_y
9698  viscsubface(visckminpointer(i, j))%q(i, j, 3) = q_z
9699  end if
9700 ! and the k == kl case.
9701  if (k .eq. kl .and. storewalltensor .and. visckmaxpointer(i, j) &
9702 & .gt. 0) then
9703  viscsubface(visckmaxpointer(i, j))%tau(i, j, 1) = tauxx
9704  viscsubface(visckmaxpointer(i, j))%tau(i, j, 2) = tauyy
9705  viscsubface(visckmaxpointer(i, j))%tau(i, j, 3) = tauzz
9706  viscsubface(visckmaxpointer(i, j))%tau(i, j, 4) = tauxy
9707  viscsubface(visckmaxpointer(i, j))%tau(i, j, 5) = tauxz
9708  viscsubface(visckmaxpointer(i, j))%tau(i, j, 6) = tauyz
9709  viscsubface(visckmaxpointer(i, j))%q(i, j, 1) = q_x
9710  viscsubface(visckmaxpointer(i, j))%q(i, j, 2) = q_y
9711  viscsubface(visckmaxpointer(i, j))%q(i, j, 3) = q_z
9712  end if
9713  end do
9714 !$ad checkpoint-end
9715 !
9716 ! viscous fluxes in the j-direction.
9717 !
9718  continue
9719 !$ad checkpoint-start
9720  mue = zero
9721 !$ad ii-loop
9722  do ii=0,nx*jl*nz-1
9723  i = mod(ii, nx) + 2
9724  j = mod(ii/nx, jl) + 1
9725  k = ii/(nx*jl) + 2
9726 ! set the value of the porosity. if not zero, it is set
9727 ! to average the eddy-viscosity and to take the factor
9728 ! rfilv into account.
9729  por = half*rfilv
9730  if (porj(i, j, k) .eq. noflux) por = zero
9731 ! compute the laminar and (if present) the eddy viscosities
9732 ! multiplied by the porosity. compute the factor in front of
9733 ! the gradients of the speed of sound squared for the heat
9734 ! flux.
9735  mul = por*(rlv(i, j, k)+rlv(i, j+1, k))
9736  if (eddymodel) mue = por*(rev(i, j, k)+rev(i, j+1, k))
9737  mut = mul + mue
9738  gm1 = half*(gamma(i, j, k)+gamma(i, j+1, k)) - one
9739  factlamheat = one/(prandtl*gm1)
9740  factturbheat = one/(prandtlturb*gm1)
9741  heatcoef = mul*factlamheat + mue*factturbheat
9742 ! compute the gradients at the face by averaging the four
9743 ! nodal values.
9744  u_x = fourth*(ux(i-1, j, k-1)+ux(i, j, k-1)+ux(i-1, j, k)+ux(i, &
9745 & j, k))
9746  u_y = fourth*(uy(i-1, j, k-1)+uy(i, j, k-1)+uy(i-1, j, k)+uy(i, &
9747 & j, k))
9748  u_z = fourth*(uz(i-1, j, k-1)+uz(i, j, k-1)+uz(i-1, j, k)+uz(i, &
9749 & j, k))
9750  v_x = fourth*(vx(i-1, j, k-1)+vx(i, j, k-1)+vx(i-1, j, k)+vx(i, &
9751 & j, k))
9752  v_y = fourth*(vy(i-1, j, k-1)+vy(i, j, k-1)+vy(i-1, j, k)+vy(i, &
9753 & j, k))
9754  v_z = fourth*(vz(i-1, j, k-1)+vz(i, j, k-1)+vz(i-1, j, k)+vz(i, &
9755 & j, k))
9756  w_x = fourth*(wx(i-1, j, k-1)+wx(i, j, k-1)+wx(i-1, j, k)+wx(i, &
9757 & j, k))
9758  w_y = fourth*(wy(i-1, j, k-1)+wy(i, j, k-1)+wy(i-1, j, k)+wy(i, &
9759 & j, k))
9760  w_z = fourth*(wz(i-1, j, k-1)+wz(i, j, k-1)+wz(i-1, j, k)+wz(i, &
9761 & j, k))
9762  q_x = fourth*(qx(i-1, j, k-1)+qx(i, j, k-1)+qx(i-1, j, k)+qx(i, &
9763 & j, k))
9764  q_y = fourth*(qy(i-1, j, k-1)+qy(i, j, k-1)+qy(i-1, j, k)+qy(i, &
9765 & j, k))
9766  q_z = fourth*(qz(i-1, j, k-1)+qz(i, j, k-1)+qz(i-1, j, k)+qz(i, &
9767 & j, k))
9768 ! the gradients in the normal direction are corrected, such
9769 ! that no averaging takes places here.
9770 ! first determine the vector in the direction from the
9771 ! cell center j to cell center j+1.
9772  ssx = eighth*(x(i-1, j+1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j+1&
9773 & , k, 1)-x(i-1, j-1, k, 1)+x(i, j+1, k-1, 1)-x(i, j-1, k-1, 1)+&
9774 & x(i, j+1, k, 1)-x(i, j-1, k, 1))
9775  ssy = eighth*(x(i-1, j+1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j+1&
9776 & , k, 2)-x(i-1, j-1, k, 2)+x(i, j+1, k-1, 2)-x(i, j-1, k-1, 2)+&
9777 & x(i, j+1, k, 2)-x(i, j-1, k, 2))
9778  ssz = eighth*(x(i-1, j+1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j+1&
9779 & , k, 3)-x(i-1, j-1, k, 3)+x(i, j+1, k-1, 3)-x(i, j-1, k-1, 3)+&
9780 & x(i, j+1, k, 3)-x(i, j-1, k, 3))
9781 ! determine the length of this vector and create the
9782 ! unit normal.
9783  ss = one/sqrt(ssx*ssx+ssy*ssy+ssz*ssz)
9784  ssx = ss*ssx
9785  ssy = ss*ssy
9786  ssz = ss*ssz
9787 ! correct the gradients.
9788  corr = u_x*ssx + u_y*ssy + u_z*ssz - (w(i, j+1, k, ivx)-w(i, j, &
9789 & k, ivx))*ss
9790  u_x = u_x - corr*ssx
9791  u_y = u_y - corr*ssy
9792  u_z = u_z - corr*ssz
9793  corr = v_x*ssx + v_y*ssy + v_z*ssz - (w(i, j+1, k, ivy)-w(i, j, &
9794 & k, ivy))*ss
9795  v_x = v_x - corr*ssx
9796  v_y = v_y - corr*ssy
9797  v_z = v_z - corr*ssz
9798  corr = w_x*ssx + w_y*ssy + w_z*ssz - (w(i, j+1, k, ivz)-w(i, j, &
9799 & k, ivz))*ss
9800  w_x = w_x - corr*ssx
9801  w_y = w_y - corr*ssy
9802  w_z = w_z - corr*ssz
9803  corr = q_x*ssx + q_y*ssy + q_z*ssz + (aa(i, j+1, k)-aa(i, j, k))&
9804 & *ss
9805  q_x = q_x - corr*ssx
9806  q_y = q_y - corr*ssy
9807  q_z = q_z - corr*ssz
9808 ! compute the stress tensor and the heat flux vector.
9809 ! we remove the viscosity from the stress tensor (tau)
9810 ! to define taus since we still need to separate between
9811 ! laminar and turbulent stress for qcr.
9812 ! therefore, laminar tau = mue*taus, turbulent
9813 ! tau = mue*taus, and total tau = mut*taus.
9814  fracdiv = twothird*(u_x+v_y+w_z)
9815  tauxxs = two*u_x - fracdiv
9816  tauyys = two*v_y - fracdiv
9817  tauzzs = two*w_z - fracdiv
9818  tauxys = u_y + v_x
9819  tauxzs = u_z + w_x
9820  tauyzs = v_z + w_y
9821  q_x = heatcoef*q_x
9822  q_y = heatcoef*q_y
9823  q_z = heatcoef*q_z
9824 ! add qcr corrections if necessary
9825  if (useqcr) then
9826 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
9827 !
9828 ! tau_ij,qcr = tau_ij - e_ij
9829 !
9830 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
9831 !
9832 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
9833 !
9834 ! we are computing o_ik as follows:
9835 !
9836 ! o_ik = 2*w_ik/den
9837 !
9838 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
9839 ! compute denominator
9840  den = sqrt(u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
9841 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z)
9842  if (den .lt. xminn) then
9843  den = xminn
9844  else
9845  den = den
9846  end if
9847 ! compute factor that will multiply all tensor components.
9848 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
9849 ! components as well.
9850  fact = mue*ccr1/den
9851 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
9852 ! the diagonals of the vorticity tensor components are always zero
9853  wxy = u_y - v_x
9854  wxz = u_z - w_x
9855  wyz = v_z - w_y
9856  wyx = -wxy
9857  wzx = -wxz
9858  wzy = -wyz
9859 ! compute the extra terms of the boussinesq relation
9860  exx = fact*(wxy*tauxys+wxz*tauxzs)*two
9861  eyy = fact*(wyx*tauxys+wyz*tauyzs)*two
9862  ezz = fact*(wzx*tauxzs+wzy*tauyzs)*two
9863  exy = fact*(wxy*tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)
9864  exz = fact*(wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)
9865  eyz = fact*(wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)
9866 ! apply the total viscosity to the stress tensor and add extra terms
9867  tauxx = mut*tauxxs - exx
9868  tauyy = mut*tauyys - eyy
9869  tauzz = mut*tauzzs - ezz
9870  tauxy = mut*tauxys - exy
9871  tauxz = mut*tauxzs - exz
9872  tauyz = mut*tauyzs - eyz
9873  else
9874 ! just apply the total viscosity to the stress tensor
9875  tauxx = mut*tauxxs
9876  tauyy = mut*tauyys
9877  tauzz = mut*tauzzs
9878  tauxy = mut*tauxys
9879  tauxz = mut*tauxzs
9880  tauyz = mut*tauyzs
9881  end if
9882 ! compute the average velocities for the face. remember that
9883 ! the velocities are stored and not the momentum.
9884  ubar = half*(w(i, j, k, ivx)+w(i, j+1, k, ivx))
9885  vbar = half*(w(i, j, k, ivy)+w(i, j+1, k, ivy))
9886  wbar = half*(w(i, j, k, ivz)+w(i, j+1, k, ivz))
9887 ! compute the viscous fluxes for this j-face.
9888  fmx = tauxx*sj(i, j, k, 1) + tauxy*sj(i, j, k, 2) + tauxz*sj(i, &
9889 & j, k, 3)
9890  fmy = tauxy*sj(i, j, k, 1) + tauyy*sj(i, j, k, 2) + tauyz*sj(i, &
9891 & j, k, 3)
9892  fmz = tauxz*sj(i, j, k, 1) + tauyz*sj(i, j, k, 2) + tauzz*sj(i, &
9893 & j, k, 3)
9894  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*sj(i, j, k, 1) + (&
9895 & ubar*tauxy+vbar*tauyy+wbar*tauyz)*sj(i, j, k, 2) + (ubar*tauxz&
9896 & +vbar*tauyz+wbar*tauzz)*sj(i, j, k, 3) - q_x*sj(i, j, k, 1) - &
9897 & q_y*sj(i, j, k, 2) - q_z*sj(i, j, k, 3)
9898 ! update the residuals of cell j and j+1.
9899  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
9900  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
9901  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
9902  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
9903  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fmx
9904  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fmy
9905  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fmz
9906  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + frhoe
9907 ! store the stress tensor and the heat flux vector if this
9908 ! face is part of a viscous subface. both the cases j == 1
9909 ! and j == jl must be tested.
9910  if (j .eq. 1 .and. storewalltensor .and. viscjminpointer(i, k) &
9911 & .gt. 0) then
9912 ! we need to index viscsubface with viscjminpointer(i,k)
9913 ! since tapenade does not like temporary indexes
9914  viscsubface(viscjminpointer(i, k))%tau(i, k, 1) = tauxx
9915  viscsubface(viscjminpointer(i, k))%tau(i, k, 2) = tauyy
9916  viscsubface(viscjminpointer(i, k))%tau(i, k, 3) = tauzz
9917  viscsubface(viscjminpointer(i, k))%tau(i, k, 4) = tauxy
9918  viscsubface(viscjminpointer(i, k))%tau(i, k, 5) = tauxz
9919  viscsubface(viscjminpointer(i, k))%tau(i, k, 6) = tauyz
9920  viscsubface(viscjminpointer(i, k))%q(i, k, 1) = q_x
9921  viscsubface(viscjminpointer(i, k))%q(i, k, 2) = q_y
9922  viscsubface(viscjminpointer(i, k))%q(i, k, 3) = q_z
9923  end if
9924 ! and the j == jl case.
9925  if (j .eq. jl .and. storewalltensor .and. viscjmaxpointer(i, k) &
9926 & .gt. 0) then
9927  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 1) = tauxx
9928  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 2) = tauyy
9929  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 3) = tauzz
9930  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 4) = tauxy
9931  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 5) = tauxz
9932  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 6) = tauyz
9933  viscsubface(viscjmaxpointer(i, k))%q(i, k, 1) = q_x
9934  viscsubface(viscjmaxpointer(i, k))%q(i, k, 2) = q_y
9935  viscsubface(viscjmaxpointer(i, k))%q(i, k, 3) = q_z
9936  end if
9937  end do
9938 !$ad checkpoint-end
9939 !
9940 ! viscous fluxes in the i-direction.
9941 !
9942  continue
9943 !$ad checkpoint-start
9944  mue = zero
9945 !$ad ii-loop
9946  do ii=0,il*ny*nz-1
9947  i = mod(ii, il) + 1
9948  j = mod(ii/il, ny) + 2
9949  k = ii/(il*ny) + 2
9950 ! set the value of the porosity. if not zero, it is set
9951 ! to average the eddy-viscosity and to take the factor
9952 ! rfilv into account.
9953  por = half*rfilv
9954  if (pori(i, j, k) .eq. noflux) por = zero
9955 ! compute the laminar and (if present) the eddy viscosities
9956 ! multiplied the porosity. compute the factor in front of
9957 ! the gradients of the speed of sound squared for the heat
9958 ! flux.
9959  mul = por*(rlv(i, j, k)+rlv(i+1, j, k))
9960  if (eddymodel) mue = por*(rev(i, j, k)+rev(i+1, j, k))
9961  mut = mul + mue
9962  gm1 = half*(gamma(i, j, k)+gamma(i+1, j, k)) - one
9963  factlamheat = one/(prandtl*gm1)
9964  factturbheat = one/(prandtlturb*gm1)
9965  heatcoef = mul*factlamheat + mue*factturbheat
9966 ! compute the gradients at the face by averaging the four
9967 ! nodal values.
9968  u_x = fourth*(ux(i, j-1, k-1)+ux(i, j, k-1)+ux(i, j-1, k)+ux(i, &
9969 & j, k))
9970  u_y = fourth*(uy(i, j-1, k-1)+uy(i, j, k-1)+uy(i, j-1, k)+uy(i, &
9971 & j, k))
9972  u_z = fourth*(uz(i, j-1, k-1)+uz(i, j, k-1)+uz(i, j-1, k)+uz(i, &
9973 & j, k))
9974  v_x = fourth*(vx(i, j-1, k-1)+vx(i, j, k-1)+vx(i, j-1, k)+vx(i, &
9975 & j, k))
9976  v_y = fourth*(vy(i, j-1, k-1)+vy(i, j, k-1)+vy(i, j-1, k)+vy(i, &
9977 & j, k))
9978  v_z = fourth*(vz(i, j-1, k-1)+vz(i, j, k-1)+vz(i, j-1, k)+vz(i, &
9979 & j, k))
9980  w_x = fourth*(wx(i, j-1, k-1)+wx(i, j, k-1)+wx(i, j-1, k)+wx(i, &
9981 & j, k))
9982  w_y = fourth*(wy(i, j-1, k-1)+wy(i, j, k-1)+wy(i, j-1, k)+wy(i, &
9983 & j, k))
9984  w_z = fourth*(wz(i, j-1, k-1)+wz(i, j, k-1)+wz(i, j-1, k)+wz(i, &
9985 & j, k))
9986  q_x = fourth*(qx(i, j-1, k-1)+qx(i, j, k-1)+qx(i, j-1, k)+qx(i, &
9987 & j, k))
9988  q_y = fourth*(qy(i, j-1, k-1)+qy(i, j, k-1)+qy(i, j-1, k)+qy(i, &
9989 & j, k))
9990  q_z = fourth*(qz(i, j-1, k-1)+qz(i, j, k-1)+qz(i, j-1, k)+qz(i, &
9991 & j, k))
9992 ! the gradients in the normal direction are corrected, such
9993 ! that no averaging takes places here.
9994 ! first determine the vector in the direction from the
9995 ! cell center i to cell center i+1.
9996  ssx = eighth*(x(i+1, j-1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i+1, j-1&
9997 & , k, 1)-x(i-1, j-1, k, 1)+x(i+1, j, k-1, 1)-x(i-1, j, k-1, 1)+&
9998 & x(i+1, j, k, 1)-x(i-1, j, k, 1))
9999  ssy = eighth*(x(i+1, j-1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i+1, j-1&
10000 & , k, 2)-x(i-1, j-1, k, 2)+x(i+1, j, k-1, 2)-x(i-1, j, k-1, 2)+&
10001 & x(i+1, j, k, 2)-x(i-1, j, k, 2))
10002  ssz = eighth*(x(i+1, j-1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i+1, j-1&
10003 & , k, 3)-x(i-1, j-1, k, 3)+x(i+1, j, k-1, 3)-x(i-1, j, k-1, 3)+&
10004 & x(i+1, j, k, 3)-x(i-1, j, k, 3))
10005 ! determine the length of this vector and create the
10006 ! unit normal.
10007  ss = one/sqrt(ssx*ssx+ssy*ssy+ssz*ssz)
10008  ssx = ss*ssx
10009  ssy = ss*ssy
10010  ssz = ss*ssz
10011 ! correct the gradients.
10012  corr = u_x*ssx + u_y*ssy + u_z*ssz - (w(i+1, j, k, ivx)-w(i, j, &
10013 & k, ivx))*ss
10014  u_x = u_x - corr*ssx
10015  u_y = u_y - corr*ssy
10016  u_z = u_z - corr*ssz
10017  corr = v_x*ssx + v_y*ssy + v_z*ssz - (w(i+1, j, k, ivy)-w(i, j, &
10018 & k, ivy))*ss
10019  v_x = v_x - corr*ssx
10020  v_y = v_y - corr*ssy
10021  v_z = v_z - corr*ssz
10022  corr = w_x*ssx + w_y*ssy + w_z*ssz - (w(i+1, j, k, ivz)-w(i, j, &
10023 & k, ivz))*ss
10024  w_x = w_x - corr*ssx
10025  w_y = w_y - corr*ssy
10026  w_z = w_z - corr*ssz
10027  corr = q_x*ssx + q_y*ssy + q_z*ssz + (aa(i+1, j, k)-aa(i, j, k))&
10028 & *ss
10029  q_x = q_x - corr*ssx
10030  q_y = q_y - corr*ssy
10031  q_z = q_z - corr*ssz
10032 ! compute the stress tensor and the heat flux vector.
10033 ! we remove the viscosity from the stress tensor (tau)
10034 ! to define taus since we still need to separate between
10035 ! laminar and turbulent stress for qcr.
10036 ! therefore, laminar tau = mue*taus, turbulent
10037 ! tau = mue*taus, and total tau = mut*taus.
10038  fracdiv = twothird*(u_x+v_y+w_z)
10039  tauxxs = two*u_x - fracdiv
10040  tauyys = two*v_y - fracdiv
10041  tauzzs = two*w_z - fracdiv
10042  tauxys = u_y + v_x
10043  tauxzs = u_z + w_x
10044  tauyzs = v_z + w_y
10045  q_x = heatcoef*q_x
10046  q_y = heatcoef*q_y
10047  q_z = heatcoef*q_z
10048 ! add qcr corrections if necessary
10049  if (useqcr) then
10050 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
10051 !
10052 ! tau_ij,qcr = tau_ij - e_ij
10053 !
10054 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
10055 !
10056 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
10057 !
10058 ! we are computing o_ik as follows:
10059 !
10060 ! o_ik = 2*w_ik/den
10061 !
10062 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
10063 ! compute denominator
10064  den = sqrt(u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
10065 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z)
10066  if (den .lt. xminn) then
10067  den = xminn
10068  else
10069  den = den
10070  end if
10071 ! compute factor that will multiply all tensor components.
10072 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
10073 ! components as well.
10074  fact = mue*ccr1/den
10075 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
10076 ! the diagonals of the vorticity tensor components are always zero
10077  wxy = u_y - v_x
10078  wxz = u_z - w_x
10079  wyz = v_z - w_y
10080  wyx = -wxy
10081  wzx = -wxz
10082  wzy = -wyz
10083 ! compute the extra terms of the boussinesq relation
10084  exx = fact*(wxy*tauxys+wxz*tauxzs)*two
10085  eyy = fact*(wyx*tauxys+wyz*tauyzs)*two
10086  ezz = fact*(wzx*tauxzs+wzy*tauyzs)*two
10087  exy = fact*(wxy*tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)
10088  exz = fact*(wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)
10089  eyz = fact*(wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)
10090 ! apply the total viscosity to the stress tensor and add extra terms
10091  tauxx = mut*tauxxs - exx
10092  tauyy = mut*tauyys - eyy
10093  tauzz = mut*tauzzs - ezz
10094  tauxy = mut*tauxys - exy
10095  tauxz = mut*tauxzs - exz
10096  tauyz = mut*tauyzs - eyz
10097  else
10098 ! just apply the total viscosity to the stress tensor
10099  tauxx = mut*tauxxs
10100  tauyy = mut*tauyys
10101  tauzz = mut*tauzzs
10102  tauxy = mut*tauxys
10103  tauxz = mut*tauxzs
10104  tauyz = mut*tauyzs
10105  end if
10106 ! compute the average velocities for the face. remember that
10107 ! the velocities are stored and not the momentum.
10108  ubar = half*(w(i, j, k, ivx)+w(i+1, j, k, ivx))
10109  vbar = half*(w(i, j, k, ivy)+w(i+1, j, k, ivy))
10110  wbar = half*(w(i, j, k, ivz)+w(i+1, j, k, ivz))
10111 ! compute the viscous fluxes for this i-face.
10112  fmx = tauxx*si(i, j, k, 1) + tauxy*si(i, j, k, 2) + tauxz*si(i, &
10113 & j, k, 3)
10114  fmy = tauxy*si(i, j, k, 1) + tauyy*si(i, j, k, 2) + tauyz*si(i, &
10115 & j, k, 3)
10116  fmz = tauxz*si(i, j, k, 1) + tauyz*si(i, j, k, 2) + tauzz*si(i, &
10117 & j, k, 3)
10118  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*si(i, j, k, 1) + (&
10119 & ubar*tauxy+vbar*tauyy+wbar*tauyz)*si(i, j, k, 2) + (ubar*tauxz&
10120 & +vbar*tauyz+wbar*tauzz)*si(i, j, k, 3) - q_x*si(i, j, k, 1) - &
10121 & q_y*si(i, j, k, 2) - q_z*si(i, j, k, 3)
10122 ! update the residuals of cell i and i+1.
10123  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
10124  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
10125  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
10126  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
10127  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fmx
10128  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fmy
10129  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fmz
10130  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + frhoe
10131 ! store the stress tensor and the heat flux vector if this
10132 ! face is part of a viscous subface. both the cases i == 1
10133 ! and i == il must be tested.
10134  if (i .eq. 1 .and. storewalltensor .and. visciminpointer(j, k) &
10135 & .gt. 0) then
10136 ! we need to index viscsubface with visciminpointer(j,k)
10137 ! since tapenade does not like temporary indexes
10138  viscsubface(visciminpointer(j, k))%tau(j, k, 1) = tauxx
10139  viscsubface(visciminpointer(j, k))%tau(j, k, 2) = tauyy
10140  viscsubface(visciminpointer(j, k))%tau(j, k, 3) = tauzz
10141  viscsubface(visciminpointer(j, k))%tau(j, k, 4) = tauxy
10142  viscsubface(visciminpointer(j, k))%tau(j, k, 5) = tauxz
10143  viscsubface(visciminpointer(j, k))%tau(j, k, 6) = tauyz
10144  viscsubface(visciminpointer(j, k))%q(j, k, 1) = q_x
10145  viscsubface(visciminpointer(j, k))%q(j, k, 2) = q_y
10146  viscsubface(visciminpointer(j, k))%q(j, k, 3) = q_z
10147  end if
10148 ! and the i == il case.
10149  if (i .eq. il .and. storewalltensor .and. viscimaxpointer(j, k) &
10150 & .gt. 0) then
10151 ! we need to index viscsubface with viscimaxpointer(j,k)
10152 ! since tapenade does not like temporary indexes
10153  viscsubface(viscimaxpointer(j, k))%tau(j, k, 1) = tauxx
10154  viscsubface(viscimaxpointer(j, k))%tau(j, k, 2) = tauyy
10155  viscsubface(viscimaxpointer(j, k))%tau(j, k, 3) = tauzz
10156  viscsubface(viscimaxpointer(j, k))%tau(j, k, 4) = tauxy
10157  viscsubface(viscimaxpointer(j, k))%tau(j, k, 5) = tauxz
10158  viscsubface(viscimaxpointer(j, k))%tau(j, k, 6) = tauyz
10159  viscsubface(viscimaxpointer(j, k))%q(j, k, 1) = q_x
10160  viscsubface(viscimaxpointer(j, k))%q(j, k, 2) = q_y
10161  viscsubface(viscimaxpointer(j, k))%q(j, k, 3) = q_z
10162  end if
10163  end do
10164 !$ad checkpoint-end
10165  continue
10166 ! possibly correct the wall shear stress.
10167 ! wall function is not aded
10168  end if
10169  end subroutine viscousflux
10170 
10171  subroutine viscousfluxapprox()
10172  use constants
10173  use blockpointers
10174  use flowvarrefstate
10175  use inputphysics
10176  use iteration
10177  implicit none
10178 !
10179 ! local parameter.
10180 !
10181  real(kind=realtype), parameter :: twothird=two*third
10182 !
10183 ! local variables.
10184 !
10185  integer(kind=inttype) :: i, j, k
10186  integer(kind=inttype) :: ii, jj, kk
10187  real(kind=realtype) :: rfilv, por, mul, mue, mut, heatcoef
10188  real(kind=realtype) :: gm1, factlamheat, factturbheat
10189  real(kind=realtype) :: u_x, u_y, u_z, v_x, v_y, v_z, w_x, w_y, w_z
10190  real(kind=realtype) :: q_x, q_y, q_z, ubar, vbar, wbar
10191  real(kind=realtype) :: corr, ssx, ssy, ssz, ss, fracdiv
10192  real(kind=realtype) :: tauxx, tauyy, tauzz
10193  real(kind=realtype) :: tauxy, tauxz, tauyz
10194  real(kind=realtype) :: fmx, fmy, fmz, frhoe
10195  real(kind=realtype) :: dd
10196  logical :: correctfork
10197  mue = zero
10198  rfilv = rfil
10199 ! viscous fluxes in the i-direction
10200  do k=2,kl
10201  do j=2,jl
10202  do i=1,il
10203 ! compute the vector from the center of cell i to cell i+1
10204  ssx = eighth*(x(i+1, j-1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i+1, j&
10205 & -1, k, 1)-x(i-1, j-1, k, 1)+x(i+1, j, k-1, 1)-x(i-1, j, k-1&
10206 & , 1)+x(i+1, j, k, 1)-x(i-1, j, k, 1))
10207  ssy = eighth*(x(i+1, j-1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i+1, j&
10208 & -1, k, 2)-x(i-1, j-1, k, 2)+x(i+1, j, k-1, 2)-x(i-1, j, k-1&
10209 & , 2)+x(i+1, j, k, 2)-x(i-1, j, k, 2))
10210  ssz = eighth*(x(i+1, j-1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i+1, j&
10211 & -1, k, 3)-x(i-1, j-1, k, 3)+x(i+1, j, k-1, 3)-x(i-1, j, k-1&
10212 & , 3)+x(i+1, j, k, 3)-x(i-1, j, k, 3))
10213 ! and determine one/ length of vector squared
10214  ss = one/(ssx*ssx+ssy*ssy+ssz*ssz)
10215  ssx = ss*ssx
10216  ssy = ss*ssy
10217  ssz = ss*ssz
10218 ! now compute each gradient
10219  dd = w(i+1, j, k, ivx) - w(i, j, k, ivx)
10220  u_x = dd*ssx
10221  u_y = dd*ssy
10222  u_z = dd*ssz
10223  dd = w(i+1, j, k, ivy) - w(i, j, k, ivy)
10224  v_x = dd*ssx
10225  v_y = dd*ssy
10226  v_z = dd*ssz
10227  dd = w(i+1, j, k, ivz) - w(i, j, k, ivz)
10228  w_x = dd*ssx
10229  w_y = dd*ssy
10230  w_z = dd*ssz
10231  dd = aa(i+1, j, k) - aa(i, j, k)
10232  q_x = -(dd*ssx)
10233  q_y = -(dd*ssy)
10234  q_z = -(dd*ssz)
10235  por = half*rfilv
10236  if (pori(i, j, k) .eq. noflux) por = zero
10237 ! compute the laminar and (if present) the eddy viscosities
10238 ! multiplied by the porosity. compute the factor in front of
10239 ! the gradients of the speed of sound squared for the heat
10240 ! flux.
10241  mul = por*(rlv(i, j, k)+rlv(i+1, j, k))
10242  if (eddymodel) mue = por*(rev(i, j, k)+rev(i+1, j, k))
10243  mut = mul + mue
10244  gm1 = half*(gamma(i, j, k)+gamma(i+1, j, k)) - one
10245  factlamheat = one/(prandtl*gm1)
10246  factturbheat = one/(prandtlturb*gm1)
10247  heatcoef = mul*factlamheat + mue*factturbheat
10248 ! compute the stress tensor and the heat flux vector.
10249  fracdiv = twothird*(u_x+v_y+w_z)
10250  tauxx = mut*(two*u_x-fracdiv)
10251  tauyy = mut*(two*v_y-fracdiv)
10252  tauzz = mut*(two*w_z-fracdiv)
10253  tauxy = mut*(u_y+v_x)
10254  tauxz = mut*(u_z+w_x)
10255  tauyz = mut*(v_z+w_y)
10256  q_x = heatcoef*q_x
10257  q_y = heatcoef*q_y
10258  q_z = heatcoef*q_z
10259 ! compute the average velocities for the face. remember that
10260 ! the velocities are stored and not the momentum.
10261  ubar = half*(w(i, j, k, ivx)+w(i+1, j, k, ivx))
10262  vbar = half*(w(i, j, k, ivy)+w(i+1, j, k, ivy))
10263  wbar = half*(w(i, j, k, ivz)+w(i+1, j, k, ivz))
10264 ! compute the viscous fluxes for this i-face.
10265  fmx = tauxx*si(i, j, k, 1) + tauxy*si(i, j, k, 2) + tauxz*si(i&
10266 & , j, k, 3)
10267  fmy = tauxy*si(i, j, k, 1) + tauyy*si(i, j, k, 2) + tauyz*si(i&
10268 & , j, k, 3)
10269  fmz = tauxz*si(i, j, k, 1) + tauyz*si(i, j, k, 2) + tauzz*si(i&
10270 & , j, k, 3)
10271  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*si(i, j, k, 1) + (&
10272 & ubar*tauxy+vbar*tauyy+wbar*tauyz)*si(i, j, k, 2) + (ubar*&
10273 & tauxz+vbar*tauyz+wbar*tauzz)*si(i, j, k, 3) - q_x*si(i, j, k&
10274 & , 1) - q_y*si(i, j, k, 2) - q_z*si(i, j, k, 3)
10275 ! update the residuals of cell i and i+1.
10276  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
10277  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
10278  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
10279  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
10280  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fmx
10281  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fmy
10282  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fmz
10283  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + frhoe
10284  end do
10285  end do
10286  end do
10287 ! viscous fluxes in the j-direction
10288  do k=2,kl
10289  do j=1,jl
10290  do i=2,il
10291 ! compute the vector from the center of cell j to cell j+1
10292  ssx = eighth*(x(i-1, j+1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j&
10293 & +1, k, 1)-x(i-1, j-1, k, 1)+x(i, j+1, k-1, 1)-x(i, j-1, k-1&
10294 & , 1)+x(i, j+1, k, 1)-x(i, j-1, k, 1))
10295  ssy = eighth*(x(i-1, j+1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j&
10296 & +1, k, 2)-x(i-1, j-1, k, 2)+x(i, j+1, k-1, 2)-x(i, j-1, k-1&
10297 & , 2)+x(i, j+1, k, 2)-x(i, j-1, k, 2))
10298  ssz = eighth*(x(i-1, j+1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j&
10299 & +1, k, 3)-x(i-1, j-1, k, 3)+x(i, j+1, k-1, 3)-x(i, j-1, k-1&
10300 & , 3)+x(i, j+1, k, 3)-x(i, j-1, k, 3))
10301 ! and determine one/ length of vector squared
10302  ss = one/(ssx*ssx+ssy*ssy+ssz*ssz)
10303  ssx = ss*ssx
10304  ssy = ss*ssy
10305  ssz = ss*ssz
10306 ! now compute each gradient
10307  dd = w(i, j+1, k, ivx) - w(i, j, k, ivx)
10308  u_x = dd*ssx
10309  u_y = dd*ssy
10310  u_z = dd*ssz
10311  dd = w(i, j+1, k, ivy) - w(i, j, k, ivy)
10312  v_x = dd*ssx
10313  v_y = dd*ssy
10314  v_z = dd*ssz
10315  dd = w(i, j+1, k, ivz) - w(i, j, k, ivz)
10316  w_x = dd*ssx
10317  w_y = dd*ssy
10318  w_z = dd*ssz
10319  dd = aa(i, j+1, k) - aa(i, j, k)
10320  q_x = -(dd*ssx)
10321  q_y = -(dd*ssy)
10322  q_z = -(dd*ssz)
10323  por = half*rfilv
10324  if (porj(i, j, k) .eq. noflux) por = zero
10325 ! compute the laminar and (if present) the eddy viscosities
10326 ! multiplied by the porosity. compute the factor in front of
10327 ! the gradients of the speed of sound squared for the heat
10328 ! flux.
10329  mul = por*(rlv(i, j, k)+rlv(i, j+1, k))
10330  if (eddymodel) mue = por*(rev(i, j, k)+rev(i, j+1, k))
10331  mut = mul + mue
10332  gm1 = half*(gamma(i, j, k)+gamma(i, j+1, k)) - one
10333  factlamheat = one/(prandtl*gm1)
10334  factturbheat = one/(prandtlturb*gm1)
10335  heatcoef = mul*factlamheat + mue*factturbheat
10336 ! compute the stress tensor and the heat flux vector.
10337  fracdiv = twothird*(u_x+v_y+w_z)
10338  tauxx = mut*(two*u_x-fracdiv)
10339  tauyy = mut*(two*v_y-fracdiv)
10340  tauzz = mut*(two*w_z-fracdiv)
10341  tauxy = mut*(u_y+v_x)
10342  tauxz = mut*(u_z+w_x)
10343  tauyz = mut*(v_z+w_y)
10344  q_x = heatcoef*q_x
10345  q_y = heatcoef*q_y
10346  q_z = heatcoef*q_z
10347 ! compute the average velocities for the face. remember that
10348 ! the velocities are stored and not the momentum.
10349  ubar = half*(w(i, j, k, ivx)+w(i, j+1, k, ivx))
10350  vbar = half*(w(i, j, k, ivy)+w(i, j+1, k, ivy))
10351  wbar = half*(w(i, j, k, ivz)+w(i, j+1, k, ivz))
10352 ! compute the viscous fluxes for this j-face.
10353  fmx = tauxx*sj(i, j, k, 1) + tauxy*sj(i, j, k, 2) + tauxz*sj(i&
10354 & , j, k, 3)
10355  fmy = tauxy*sj(i, j, k, 1) + tauyy*sj(i, j, k, 2) + tauyz*sj(i&
10356 & , j, k, 3)
10357  fmz = tauxz*sj(i, j, k, 1) + tauyz*sj(i, j, k, 2) + tauzz*sj(i&
10358 & , j, k, 3)
10359  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*sj(i, j, k, 1) + (&
10360 & ubar*tauxy+vbar*tauyy+wbar*tauyz)*sj(i, j, k, 2) + (ubar*&
10361 & tauxz+vbar*tauyz+wbar*tauzz)*sj(i, j, k, 3) - q_x*sj(i, j, k&
10362 & , 1) - q_y*sj(i, j, k, 2) - q_z*sj(i, j, k, 3)
10363 ! update the residuals of cell j and j+1.
10364  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
10365  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
10366  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
10367  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
10368  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fmx
10369  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fmy
10370  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fmz
10371  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + frhoe
10372  end do
10373  end do
10374  end do
10375 ! viscous fluxes in the k-direction
10376  do k=1,kl
10377  do j=2,jl
10378  do i=2,il
10379 ! compute the vector from the center of cell k to cell k+1
10380  ssx = eighth*(x(i-1, j-1, k+1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j&
10381 & , k+1, 1)-x(i-1, j, k-1, 1)+x(i, j-1, k+1, 1)-x(i, j-1, k-1&
10382 & , 1)+x(i, j, k+1, 1)-x(i, j, k-1, 1))
10383  ssy = eighth*(x(i-1, j-1, k+1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j&
10384 & , k+1, 2)-x(i-1, j, k-1, 2)+x(i, j-1, k+1, 2)-x(i, j-1, k-1&
10385 & , 2)+x(i, j, k+1, 2)-x(i, j, k-1, 2))
10386  ssz = eighth*(x(i-1, j-1, k+1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j&
10387 & , k+1, 3)-x(i-1, j, k-1, 3)+x(i, j-1, k+1, 3)-x(i, j-1, k-1&
10388 & , 3)+x(i, j, k+1, 3)-x(i, j, k-1, 3))
10389 ! and determine one/ length of vector squared
10390  ss = one/(ssx*ssx+ssy*ssy+ssz*ssz)
10391  ssx = ss*ssx
10392  ssy = ss*ssy
10393  ssz = ss*ssz
10394 ! now compute each gradient
10395  dd = w(i, j, k+1, ivx) - w(i, j, k, ivx)
10396  u_x = dd*ssx
10397  u_y = dd*ssy
10398  u_z = dd*ssz
10399  dd = w(i, j, k+1, ivy) - w(i, j, k, ivy)
10400  v_x = dd*ssx
10401  v_y = dd*ssy
10402  v_z = dd*ssz
10403  dd = w(i, j, k+1, ivz) - w(i, j, k, ivz)
10404  w_x = dd*ssx
10405  w_y = dd*ssy
10406  w_z = dd*ssz
10407  dd = aa(i, j, k+1) - aa(i, j, k)
10408  q_x = -(dd*ssx)
10409  q_y = -(dd*ssy)
10410  q_z = -(dd*ssz)
10411  por = half*rfilv
10412  if (pork(i, j, k) .eq. noflux) por = zero
10413 ! compute the laminar and (if present) the eddy viscosities
10414 ! multiplied by the porosity. compute the factor in front of
10415 ! the gradients of the speed of sound squared for the heat
10416 ! flux.
10417  mul = por*(rlv(i, j, k)+rlv(i, j, k+1))
10418  if (eddymodel) mue = por*(rev(i, j, k)+rev(i, j, k+1))
10419  mut = mul + mue
10420  gm1 = half*(gamma(i, j, k)+gamma(i, j, k+1)) - one
10421  factlamheat = one/(prandtl*gm1)
10422  factturbheat = one/(prandtlturb*gm1)
10423  heatcoef = mul*factlamheat + mue*factturbheat
10424 ! compute the stress tensor and the heat flux vector.
10425  fracdiv = twothird*(u_x+v_y+w_z)
10426  tauxx = mut*(two*u_x-fracdiv)
10427  tauyy = mut*(two*v_y-fracdiv)
10428  tauzz = mut*(two*w_z-fracdiv)
10429  tauxy = mut*(u_y+v_x)
10430  tauxz = mut*(u_z+w_x)
10431  tauyz = mut*(v_z+w_y)
10432  q_x = heatcoef*q_x
10433  q_y = heatcoef*q_y
10434  q_z = heatcoef*q_z
10435 ! compute the average velocities for the face. remember that
10436 ! the velocities are stored and not the momentum.
10437  ubar = half*(w(i, j, k, ivx)+w(i, j, k+1, ivx))
10438  vbar = half*(w(i, j, k, ivy)+w(i, j, k+1, ivy))
10439  wbar = half*(w(i, j, k, ivz)+w(i, j, k+1, ivz))
10440 ! compute the viscous fluxes for this j-face.
10441  fmx = tauxx*sk(i, j, k, 1) + tauxy*sk(i, j, k, 2) + tauxz*sk(i&
10442 & , j, k, 3)
10443  fmy = tauxy*sk(i, j, k, 1) + tauyy*sk(i, j, k, 2) + tauyz*sk(i&
10444 & , j, k, 3)
10445  fmz = tauxz*sk(i, j, k, 1) + tauyz*sk(i, j, k, 2) + tauzz*sk(i&
10446 & , j, k, 3)
10447  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*sk(i, j, k, 1) + (&
10448 & ubar*tauxy+vbar*tauyy+wbar*tauyz)*sk(i, j, k, 2) + (ubar*&
10449 & tauxz+vbar*tauyz+wbar*tauzz)*sk(i, j, k, 3) - q_x*sk(i, j, k&
10450 & , 1) - q_y*sk(i, j, k, 2) - q_z*sk(i, j, k, 3)
10451 ! update the residuals of cell j and j+1.
10452  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
10453  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
10454  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
10455  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
10456  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fmx
10457  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fmy
10458  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fmz
10459  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + frhoe
10460  end do
10461  end do
10462  end do
10463  end subroutine viscousfluxapprox
10464 
10466 !
10467 ! invisciddissfluxscalar computes the scalar artificial
10468 ! dissipation, see aiaa paper 81-1259, for a given block.
10469 ! therefore it is assumed that the pointers in blockpointers
10470 ! already point to the correct block.
10471 !
10472  use blockpointers
10473  use cgnsgrid
10474  use constants
10475  use flowvarrefstate
10479  use inputphysics
10480  use iteration
10481  implicit none
10482 !
10483 ! local parameter.
10484 !
10485  real(kind=realtype), parameter :: dssmax=0.25_realtype
10486 !
10487 ! local variables.
10488 !
10489  integer(kind=inttype) :: i, j, k, ind
10490  real(kind=realtype) :: sslim, rhoi
10491  real(kind=realtype) :: sfil, fis2, fis4
10492  real(kind=realtype) :: ppor, rrad, dis2
10493  real(kind=realtype) :: dss1, dss2, ddw, fs
10494  intrinsic abs
10495  intrinsic log10
10496  intrinsic exp
10497  intrinsic max
10498  intrinsic min
10499  real(kind=realtype) :: x1
10500  real(kind=realtype) :: x2
10501  real(kind=realtype) :: y1
10502  real(kind=realtype) :: x3
10503  real(kind=realtype) :: x4
10504  real(kind=realtype) :: y2
10505  real(kind=realtype) :: x5
10506  real(kind=realtype) :: x6
10507  real(kind=realtype) :: y3
10508  real(kind=realtype) :: abs0
10509  real(kind=realtype) :: min1
10510  real(kind=realtype) :: min2
10511  real(kind=realtype) :: min3
10512  if (rfil .ge. 0.) then
10513  abs0 = rfil
10514  else
10515  abs0 = -rfil
10516  end if
10517 ! check if rfil == 0. if so, the dissipative flux needs not to
10518 ! be computed.
10519  if (abs0 .lt. thresholdreal) then
10520  return
10521  else
10522 ! determine the variables used to compute the switch.
10523 ! for the inviscid case this is the pressure; for the viscous
10524 ! case it is the entropy.
10525  select case (equations)
10526  case (eulerequations)
10527 ! inviscid case. pressure switch is based on the pressure.
10528 ! also set the value of sslim. to be fully consistent this
10529 ! must have the dimension of pressure and it is therefore
10530 ! set to a fraction of the free stream value.
10531  sslim = 0.001_realtype*pinfcorr
10532 !===============================================================
10533  case (nsequations, ransequations)
10534 ! viscous case. pressure switch is based on the entropy.
10535 ! also set the value of sslim. to be fully consistent this
10536 ! must have the dimension of entropy and it is therefore
10537 ! set to a fraction of the free stream value.
10538  sslim = 0.001_realtype*pinfcorr/rhoinf**gammainf
10539  end select
10540 ! set the dissipation constants for the scheme.
10541 ! rfil and sfil are fractions used by the runge-kutta solver to compute residuals at intermediate steps.
10542 ! this means that fis2 and fis4 will be some fraction of vis2 and vis4, respectively.
10543 ! for other solvers, rfil==1, sfil==0, fis2==vis2, and fis4==vis4.
10544 ! the sigmoid function used for dissipation-based continuation is described in eq. 28 and eq. 29 from the paper:
10545 ! "improving the performance of a compressible rans solver for low and high mach number flows" (seraj2022c).
10546 ! the options documentation also has information on the parameters in this formulation.
10547  if (usedisscontinuation) then
10548  fis2 = rfil*(vis2+disscontmagnitude/(1+exp(-(disscontsharpness*(&
10549 & log10(totalr/totalr0)+disscontmidpoint)))))
10550  else
10551  fis2 = rfil*vis2
10552  end if
10553  fis4 = rfil*vis4
10554  sfil = one - rfil
10555 ! replace the total energy by rho times the total enthalpy.
10556 ! in this way the numerical solution is total enthalpy preserving
10557 ! for the steady euler equations. also replace the velocities by
10558 ! the momentum. only done for the entries used in the
10559 ! discretization, i.e. ignore the corner halo's.
10560  do k=0,kb
10561  do j=2,jl
10562  do i=2,il
10563  w(i, j, k, ivx) = w(i, j, k, irho)*w(i, j, k, ivx)
10564  w(i, j, k, ivy) = w(i, j, k, irho)*w(i, j, k, ivy)
10565  w(i, j, k, ivz) = w(i, j, k, irho)*w(i, j, k, ivz)
10566  w(i, j, k, irhoe) = w(i, j, k, irhoe) + p(i, j, k)
10567  end do
10568  end do
10569  end do
10570  do k=2,kl
10571  do j=2,jl
10572  w(0, j, k, ivx) = w(0, j, k, irho)*w(0, j, k, ivx)
10573  w(0, j, k, ivy) = w(0, j, k, irho)*w(0, j, k, ivy)
10574  w(0, j, k, ivz) = w(0, j, k, irho)*w(0, j, k, ivz)
10575  w(0, j, k, irhoe) = w(0, j, k, irhoe) + p(0, j, k)
10576  w(1, j, k, ivx) = w(1, j, k, irho)*w(1, j, k, ivx)
10577  w(1, j, k, ivy) = w(1, j, k, irho)*w(1, j, k, ivy)
10578  w(1, j, k, ivz) = w(1, j, k, irho)*w(1, j, k, ivz)
10579  w(1, j, k, irhoe) = w(1, j, k, irhoe) + p(1, j, k)
10580  w(ie, j, k, ivx) = w(ie, j, k, irho)*w(ie, j, k, ivx)
10581  w(ie, j, k, ivy) = w(ie, j, k, irho)*w(ie, j, k, ivy)
10582  w(ie, j, k, ivz) = w(ie, j, k, irho)*w(ie, j, k, ivz)
10583  w(ie, j, k, irhoe) = w(ie, j, k, irhoe) + p(ie, j, k)
10584  w(ib, j, k, ivx) = w(ib, j, k, irho)*w(ib, j, k, ivx)
10585  w(ib, j, k, ivy) = w(ib, j, k, irho)*w(ib, j, k, ivy)
10586  w(ib, j, k, ivz) = w(ib, j, k, irho)*w(ib, j, k, ivz)
10587  w(ib, j, k, irhoe) = w(ib, j, k, irhoe) + p(ib, j, k)
10588  end do
10589  end do
10590  do k=2,kl
10591  do i=2,il
10592  w(i, 0, k, ivx) = w(i, 0, k, irho)*w(i, 0, k, ivx)
10593  w(i, 0, k, ivy) = w(i, 0, k, irho)*w(i, 0, k, ivy)
10594  w(i, 0, k, ivz) = w(i, 0, k, irho)*w(i, 0, k, ivz)
10595  w(i, 0, k, irhoe) = w(i, 0, k, irhoe) + p(i, 0, k)
10596  w(i, 1, k, ivx) = w(i, 1, k, irho)*w(i, 1, k, ivx)
10597  w(i, 1, k, ivy) = w(i, 1, k, irho)*w(i, 1, k, ivy)
10598  w(i, 1, k, ivz) = w(i, 1, k, irho)*w(i, 1, k, ivz)
10599  w(i, 1, k, irhoe) = w(i, 1, k, irhoe) + p(i, 1, k)
10600  w(i, je, k, ivx) = w(i, je, k, irho)*w(i, je, k, ivx)
10601  w(i, je, k, ivy) = w(i, je, k, irho)*w(i, je, k, ivy)
10602  w(i, je, k, ivz) = w(i, je, k, irho)*w(i, je, k, ivz)
10603  w(i, je, k, irhoe) = w(i, je, k, irhoe) + p(i, je, k)
10604  w(i, jb, k, ivx) = w(i, jb, k, irho)*w(i, jb, k, ivx)
10605  w(i, jb, k, ivy) = w(i, jb, k, irho)*w(i, jb, k, ivy)
10606  w(i, jb, k, ivz) = w(i, jb, k, irho)*w(i, jb, k, ivz)
10607  w(i, jb, k, irhoe) = w(i, jb, k, irhoe) + p(i, jb, k)
10608  end do
10609  end do
10610 ! initialize the dissipative residual to a certain times,
10611 ! possibly zero, the previously stored value. owned cells
10612 ! only, because the halo values do not matter.
10613  do k=2,kl
10614  do j=2,jl
10615  do i=2,il
10616  fw(i, j, k, irho) = sfil*fw(i, j, k, irho)
10617  fw(i, j, k, imx) = sfil*fw(i, j, k, imx)
10618  fw(i, j, k, imy) = sfil*fw(i, j, k, imy)
10619  fw(i, j, k, imz) = sfil*fw(i, j, k, imz)
10620  fw(i, j, k, irhoe) = sfil*fw(i, j, k, irhoe)
10621  end do
10622  end do
10623  end do
10624 !
10625 ! dissipative fluxes in the i-direction.
10626 !
10627  do k=2,kl
10628  do j=2,jl
10629  x1 = (shocksensor(2, j, k)-two*shocksensor(1, j, k)+&
10630 & shocksensor(0, j, k))/(shocksensor(2, j, k)+two*shocksensor(&
10631 & 1, j, k)+shocksensor(0, j, k)+sslim)
10632  if (x1 .ge. 0.) then
10633  dss1 = x1
10634  else
10635  dss1 = -x1
10636  end if
10637 ! loop in i-direction.
10638  do i=1,il
10639  x2 = (shocksensor(i+2, j, k)-two*shocksensor(i+1, j, k)+&
10640 & shocksensor(i, j, k))/(shocksensor(i+2, j, k)+two*&
10641 & shocksensor(i+1, j, k)+shocksensor(i, j, k)+sslim)
10642  if (x2 .ge. 0.) then
10643  dss2 = x2
10644  else
10645  dss2 = -x2
10646  end if
10647 ! compute the dissipation coefficients for this face.
10648  ppor = zero
10649  if (pori(i, j, k) .eq. normalflux) ppor = half
10650  rrad = ppor*(radi(i, j, k)+radi(i+1, j, k))
10651  if (dss1 .lt. dss2) then
10652  y1 = dss2
10653  else
10654  y1 = dss1
10655  end if
10656  if (dssmax .gt. y1) then
10657  min1 = y1
10658  else
10659  min1 = dssmax
10660  end if
10661 ! modification for fd preconditioner note: this lumping
10662 ! actually still results in a greater than 3 cell stencil
10663 ! in any direction. since this seems to work slightly
10664 ! better than the dis2=sigma*fis4*rrad, we will just use
10665 ! a 5-cell stencil for doing the pc
10666  dis2 = fis2*rrad*min1 + sigma*fis4*rrad
10667 ! compute and scatter the dissipative flux.
10668 ! density. store it in the mass flow of the
10669 ! appropriate sliding mesh interface.
10670  ddw = w(i+1, j, k, irho) - w(i, j, k, irho)
10671  fs = dis2*ddw
10672  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
10673  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
10674 ! x-momentum.
10675  ddw = w(i+1, j, k, ivx) - w(i, j, k, ivx)
10676  fs = dis2*ddw
10677  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
10678  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
10679 ! y-momentum.
10680  ddw = w(i+1, j, k, ivy) - w(i, j, k, ivy)
10681  fs = dis2*ddw
10682  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
10683  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
10684 ! z-momentum.
10685  ddw = w(i+1, j, k, ivz) - w(i, j, k, ivz)
10686  fs = dis2*ddw
10687  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
10688  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
10689 ! energy.
10690  ddw = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
10691  fs = dis2*ddw
10692  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
10693  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
10694 ! set dss1 to dss2 for the next face.
10695  dss1 = dss2
10696  end do
10697  end do
10698  end do
10699 !
10700 ! dissipative fluxes in the j-direction.
10701 !
10702  do k=2,kl
10703  do i=2,il
10704  x3 = (shocksensor(i, 2, k)-two*shocksensor(i, 1, k)+&
10705 & shocksensor(i, 0, k))/(shocksensor(i, 2, k)+two*shocksensor(&
10706 & i, 1, k)+shocksensor(i, 0, k)+sslim)
10707  if (x3 .ge. 0.) then
10708  dss1 = x3
10709  else
10710  dss1 = -x3
10711  end if
10712 ! loop in j-direction.
10713  do j=1,jl
10714  x4 = (shocksensor(i, j+2, k)-two*shocksensor(i, j+1, k)+&
10715 & shocksensor(i, j, k))/(shocksensor(i, j+2, k)+two*&
10716 & shocksensor(i, j+1, k)+shocksensor(i, j, k)+sslim)
10717  if (x4 .ge. 0.) then
10718  dss2 = x4
10719  else
10720  dss2 = -x4
10721  end if
10722 ! compute the dissipation coefficients for this face.
10723  ppor = zero
10724  if (porj(i, j, k) .eq. normalflux) ppor = half
10725  rrad = ppor*(radj(i, j, k)+radj(i, j+1, k))
10726  if (dss1 .lt. dss2) then
10727  y2 = dss2
10728  else
10729  y2 = dss1
10730  end if
10731  if (dssmax .gt. y2) then
10732  min2 = y2
10733  else
10734  min2 = dssmax
10735  end if
10736 ! modification for fd preconditioner
10737  dis2 = fis2*rrad*min2 + sigma*fis4*rrad
10738 ! compute and scatter the dissipative flux.
10739 ! density. store it in the mass flow of the
10740 ! appropriate sliding mesh interface.
10741  ddw = w(i, j+1, k, irho) - w(i, j, k, irho)
10742  fs = dis2*ddw
10743  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
10744  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
10745 ! x-momentum.
10746  ddw = w(i, j+1, k, ivx) - w(i, j, k, ivx)
10747  fs = dis2*ddw
10748  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
10749  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
10750 ! y-momentum.
10751  ddw = w(i, j+1, k, ivy) - w(i, j, k, ivy)
10752  fs = dis2*ddw
10753  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
10754  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
10755 ! z-momentum.
10756  ddw = w(i, j+1, k, ivz) - w(i, j, k, ivz)
10757  fs = dis2*ddw
10758  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
10759  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
10760 ! energy.
10761  ddw = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
10762  fs = dis2*ddw
10763  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
10764  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
10765 ! set dss1 to dss2 for the next face.
10766  dss1 = dss2
10767  end do
10768  end do
10769  end do
10770 !
10771 ! dissipative fluxes in the k-direction.
10772 !
10773  do j=2,jl
10774  do i=2,il
10775  x5 = (shocksensor(i, j, 2)-two*shocksensor(i, j, 1)+&
10776 & shocksensor(i, j, 0))/(shocksensor(i, j, 2)+two*shocksensor(&
10777 & i, j, 1)+shocksensor(i, j, 0)+sslim)
10778  if (x5 .ge. 0.) then
10779  dss1 = x5
10780  else
10781  dss1 = -x5
10782  end if
10783 ! loop in k-direction.
10784  do k=1,kl
10785  x6 = (shocksensor(i, j, k+2)-two*shocksensor(i, j, k+1)+&
10786 & shocksensor(i, j, k))/(shocksensor(i, j, k+2)+two*&
10787 & shocksensor(i, j, k+1)+shocksensor(i, j, k)+sslim)
10788  if (x6 .ge. 0.) then
10789  dss2 = x6
10790  else
10791  dss2 = -x6
10792  end if
10793 ! compute the dissipation coefficients for this face.
10794  ppor = zero
10795  if (pork(i, j, k) .eq. normalflux) ppor = half
10796  rrad = ppor*(radk(i, j, k)+radk(i, j, k+1))
10797  if (dss1 .lt. dss2) then
10798  y3 = dss2
10799  else
10800  y3 = dss1
10801  end if
10802  if (dssmax .gt. y3) then
10803  min3 = y3
10804  else
10805  min3 = dssmax
10806  end if
10807 ! modification for fd preconditioner
10808  dis2 = fis2*rrad*min3 + sigma*fis4*rrad
10809 ! compute and scatter the dissipative flux.
10810 ! density. store it in the mass flow of the
10811 ! appropriate sliding mesh interface.
10812  ddw = w(i, j, k+1, irho) - w(i, j, k, irho)
10813  fs = dis2*ddw
10814  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) + fs
10815  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
10816 ! x-momentum.
10817  ddw = w(i, j, k+1, ivx) - w(i, j, k, ivx)
10818  fs = dis2*ddw
10819  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fs
10820  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
10821 ! y-momentum.
10822  ddw = w(i, j, k+1, ivy) - w(i, j, k, ivy)
10823  fs = dis2*ddw
10824  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fs
10825  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
10826 ! z-momentum.
10827  ddw = w(i, j, k+1, ivz) - w(i, j, k, ivz)
10828  fs = dis2*ddw
10829  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fs
10830  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
10831 ! energy.
10832  ddw = w(i, j, k+1, irhoe) - w(i, j, k, irhoe)
10833  fs = dis2*ddw
10834  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + fs
10835  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
10836 ! set dss1 to dss2 for the next face.
10837  dss1 = dss2
10838  end do
10839  end do
10840  end do
10841 ! replace rho times the total enthalpy by the total energy and
10842 ! store the velocities again instead of the momentum. only for
10843 ! those entries that have been altered, i.e. ignore the
10844 ! corner halo's.
10845  do k=0,kb
10846  do j=2,jl
10847  do i=2,il
10848  rhoi = one/w(i, j, k, irho)
10849  w(i, j, k, ivx) = w(i, j, k, ivx)*rhoi
10850  w(i, j, k, ivy) = w(i, j, k, ivy)*rhoi
10851  w(i, j, k, ivz) = w(i, j, k, ivz)*rhoi
10852  w(i, j, k, irhoe) = w(i, j, k, irhoe) - p(i, j, k)
10853  end do
10854  end do
10855  end do
10856  do k=2,kl
10857  do j=2,jl
10858  rhoi = one/w(0, j, k, irho)
10859  w(0, j, k, ivx) = w(0, j, k, ivx)*rhoi
10860  w(0, j, k, ivy) = w(0, j, k, ivy)*rhoi
10861  w(0, j, k, ivz) = w(0, j, k, ivz)*rhoi
10862  w(0, j, k, irhoe) = w(0, j, k, irhoe) - p(0, j, k)
10863  rhoi = one/w(1, j, k, irho)
10864  w(1, j, k, ivx) = w(1, j, k, ivx)*rhoi
10865  w(1, j, k, ivy) = w(1, j, k, ivy)*rhoi
10866  w(1, j, k, ivz) = w(1, j, k, ivz)*rhoi
10867  w(1, j, k, irhoe) = w(1, j, k, irhoe) - p(1, j, k)
10868  rhoi = one/w(ie, j, k, irho)
10869  w(ie, j, k, ivx) = w(ie, j, k, ivx)*rhoi
10870  w(ie, j, k, ivy) = w(ie, j, k, ivy)*rhoi
10871  w(ie, j, k, ivz) = w(ie, j, k, ivz)*rhoi
10872  w(ie, j, k, irhoe) = w(ie, j, k, irhoe) - p(ie, j, k)
10873  rhoi = one/w(ib, j, k, irho)
10874  w(ib, j, k, ivx) = w(ib, j, k, ivx)*rhoi
10875  w(ib, j, k, ivy) = w(ib, j, k, ivy)*rhoi
10876  w(ib, j, k, ivz) = w(ib, j, k, ivz)*rhoi
10877  w(ib, j, k, irhoe) = w(ib, j, k, irhoe) - p(ib, j, k)
10878  end do
10879  end do
10880  do k=2,kl
10881  do i=2,il
10882  rhoi = one/w(i, 0, k, irho)
10883  w(i, 0, k, ivx) = w(i, 0, k, ivx)*rhoi
10884  w(i, 0, k, ivy) = w(i, 0, k, ivy)*rhoi
10885  w(i, 0, k, ivz) = w(i, 0, k, ivz)*rhoi
10886  w(i, 0, k, irhoe) = w(i, 0, k, irhoe) - p(i, 0, k)
10887  rhoi = one/w(i, 1, k, irho)
10888  w(i, 1, k, ivx) = w(i, 1, k, ivx)*rhoi
10889  w(i, 1, k, ivy) = w(i, 1, k, ivy)*rhoi
10890  w(i, 1, k, ivz) = w(i, 1, k, ivz)*rhoi
10891  w(i, 1, k, irhoe) = w(i, 1, k, irhoe) - p(i, 1, k)
10892  rhoi = one/w(i, je, k, irho)
10893  w(i, je, k, ivx) = w(i, je, k, ivx)*rhoi
10894  w(i, je, k, ivy) = w(i, je, k, ivy)*rhoi
10895  w(i, je, k, ivz) = w(i, je, k, ivz)*rhoi
10896  w(i, je, k, irhoe) = w(i, je, k, irhoe) - p(i, je, k)
10897  rhoi = one/w(i, jb, k, irho)
10898  w(i, jb, k, ivx) = w(i, jb, k, ivx)*rhoi
10899  w(i, jb, k, ivy) = w(i, jb, k, ivy)*rhoi
10900  w(i, jb, k, ivz) = w(i, jb, k, ivz)*rhoi
10901  w(i, jb, k, irhoe) = w(i, jb, k, irhoe) - p(i, jb, k)
10902  end do
10903  end do
10904  end if
10905  end subroutine invisciddissfluxscalarapprox
10906 
10908 !
10909 ! invisciddissfluxmatrix computes the matrix artificial
10910 ! dissipation term. instead of the spectral radius, as used in
10911 ! the scalar dissipation scheme, the absolute value of the flux
10912 ! jacobian is used. this leads to a less diffusive and
10913 ! consequently more accurate scheme. it is assumed that the
10914 ! pointers in blockpointers already point to the correct block.
10915 !
10916  use blockpointers
10917  use cgnsgrid
10918  use constants
10919  use flowvarrefstate
10921  use inputphysics
10922  use iteration
10923  use utils_fast_b, only : getcorrectfork
10924  implicit none
10925 !
10926 ! local parameters.
10927 !
10928  real(kind=realtype), parameter :: dpmax=0.25_realtype
10929  real(kind=realtype), parameter :: epsacoustic=0.25_realtype
10930  real(kind=realtype), parameter :: epsshear=0.025_realtype
10931  real(kind=realtype), parameter :: omega=0.5_realtype
10932  real(kind=realtype), parameter :: oneminomega=one-omega
10933 !
10934 ! local variables.
10935 !
10936  integer(kind=inttype) :: i, j, k, ind
10937  real(kind=realtype) :: plim, sface
10938  real(kind=realtype) :: sfil, fis2, fis4
10939  real(kind=realtype) :: gammaavg, gm1, ovgm1, gm53
10940  real(kind=realtype) :: ppor, rrad, dis2
10941  real(kind=realtype) :: dp1, dp2, ddw, tmp, fs
10942  real(kind=realtype) :: dr, dru, drv, drw, dre, drk, sx, sy, sz
10943  real(kind=realtype) :: uavg, vavg, wavg, a2avg, aavg, havg
10944  real(kind=realtype) :: alphaavg, unavg, ovaavg, ova2avg
10945  real(kind=realtype) :: kavg, lam1, lam2, lam3, area
10946  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
10947  logical :: correctfork
10948  intrinsic abs
10949  intrinsic max
10950  intrinsic min
10951  intrinsic sqrt
10952  real(kind=realtype) :: x1
10953  real(kind=realtype) :: x2
10954  real(kind=realtype) :: y1
10955  real(kind=realtype) :: x3
10956  real(kind=realtype) :: x4
10957  real(kind=realtype) :: y2
10958  real(kind=realtype) :: x5
10959  real(kind=realtype) :: x6
10960  real(kind=realtype) :: y3
10961  real(kind=realtype) :: abs0
10962  real(kind=realtype) :: min1
10963  real(realtype) :: max1
10964  real(kind=realtype) :: min2
10965  real(realtype) :: max2
10966  real(kind=realtype) :: min3
10967  real(realtype) :: max3
10968  real(kind=realtype) :: abs1
10969  real(kind=realtype) :: abs2
10970  real(kind=realtype) :: abs3
10971  real(kind=realtype) :: abs4
10972  real(kind=realtype) :: abs5
10973  real(kind=realtype) :: abs6
10974  real(kind=realtype) :: abs7
10975  real(kind=realtype) :: abs8
10976  real(kind=realtype) :: abs9
10977  real(kind=realtype) :: abs10
10978  real(kind=realtype) :: abs11
10979  real(kind=realtype) :: abs12
10980  if (rfil .ge. 0.) then
10981  abs0 = rfil
10982  else
10983  abs0 = -rfil
10984  end if
10985 ! check if rfil == 0. if so, the dissipative flux needs not to
10986 ! be computed.
10987  if (abs0 .lt. thresholdreal) then
10988  return
10989  else
10990 ! set the value of plim. to be fully consistent this must have
10991 ! the dimension of a pressure. therefore a fraction of pinfcorr
10992 ! is used.
10993  plim = 0.001_realtype*pinfcorr
10994 ! determine whether or not the total energy must be corrected
10995 ! for the presence of the turbulent kinetic energy.
10996  correctfork = getcorrectfork()
10997 ! initialize sface to zero. this value will be used if the
10998 ! block is not moving.
10999  sface = zero
11000 ! set a couple of constants for the scheme.
11001  fis2 = rfil*vis2
11002  fis4 = rfil*vis4
11003  sfil = one - rfil
11004 ! initialize the dissipative residual to a certain times,
11005 ! possibly zero, the previously stored value. owned cells
11006 ! only, because the halo values do not matter.
11007  do k=2,kl
11008  do j=2,jl
11009  do i=2,il
11010  fw(i, j, k, irho) = sfil*fw(i, j, k, irho)
11011  fw(i, j, k, imx) = sfil*fw(i, j, k, imx)
11012  fw(i, j, k, imy) = sfil*fw(i, j, k, imy)
11013  fw(i, j, k, imz) = sfil*fw(i, j, k, imz)
11014  fw(i, j, k, irhoe) = sfil*fw(i, j, k, irhoe)
11015  end do
11016  end do
11017  end do
11018 !
11019 ! dissipative fluxes in the i-direction.
11020 !
11021  do k=2,kl
11022  do j=2,jl
11023  if (shocksensor(2, j, k) - shocksensor(1, j, k) .ge. 0.) then
11024  abs1 = shocksensor(2, j, k) - shocksensor(1, j, k)
11025  else
11026  abs1 = -(shocksensor(2, j, k)-shocksensor(1, j, k))
11027  end if
11028  if (shocksensor(1, j, k) - shocksensor(0, j, k) .ge. 0.) then
11029  abs7 = shocksensor(1, j, k) - shocksensor(0, j, k)
11030  else
11031  abs7 = -(shocksensor(1, j, k)-shocksensor(0, j, k))
11032  end if
11033  x1 = (shocksensor(2, j, k)-two*shocksensor(1, j, k)+&
11034 & shocksensor(0, j, k))/(omega*(shocksensor(2, j, k)+two*&
11035 & shocksensor(1, j, k)+shocksensor(0, j, k))+oneminomega*(abs1&
11036 & +abs7)+plim)
11037  if (x1 .ge. 0.) then
11038  dp1 = x1
11039  else
11040  dp1 = -x1
11041  end if
11042 ! loop in i-direction.
11043  do i=1,il
11044  if (shocksensor(i+2, j, k) - shocksensor(i+1, j, k) .ge. 0.&
11045 & ) then
11046  abs2 = shocksensor(i+2, j, k) - shocksensor(i+1, j, k)
11047  else
11048  abs2 = -(shocksensor(i+2, j, k)-shocksensor(i+1, j, k))
11049  end if
11050  if (shocksensor(i+1, j, k) - shocksensor(i, j, k) .ge. 0.) &
11051 & then
11052  abs8 = shocksensor(i+1, j, k) - shocksensor(i, j, k)
11053  else
11054  abs8 = -(shocksensor(i+1, j, k)-shocksensor(i, j, k))
11055  end if
11056  x2 = (shocksensor(i+2, j, k)-two*shocksensor(i+1, j, k)+&
11057 & shocksensor(i, j, k))/(omega*(shocksensor(i+2, j, k)+two*&
11058 & shocksensor(i+1, j, k)+shocksensor(i, j, k))+oneminomega*(&
11059 & abs2+abs8)+plim)
11060  if (x2 .ge. 0.) then
11061  dp2 = x2
11062  else
11063  dp2 = -x2
11064  end if
11065 ! compute the dissipation coefficients for this face.
11066  ppor = zero
11067  if (pori(i, j, k) .eq. normalflux) ppor = one
11068  if (dp1 .lt. dp2) then
11069  y1 = dp2
11070  else
11071  y1 = dp1
11072  end if
11073  if (dpmax .gt. y1) then
11074  min1 = y1
11075  else
11076  min1 = dpmax
11077  end if
11078  dis2 = fis2*ppor*min1 + sigma*fis4*ppor
11079 ! construct the vector of the first and third differences
11080 ! multiplied by the appropriate constants.
11081  ddw = w(i+1, j, k, irho) - w(i, j, k, irho)
11082  dr = dis2*ddw
11083  ddw = w(i+1, j, k, irho)*w(i+1, j, k, ivx) - w(i, j, k, irho&
11084 & )*w(i, j, k, ivx)
11085  dru = dis2*ddw
11086  ddw = w(i+1, j, k, irho)*w(i+1, j, k, ivy) - w(i, j, k, irho&
11087 & )*w(i, j, k, ivy)
11088  drv = dis2*ddw
11089  ddw = w(i+1, j, k, irho)*w(i+1, j, k, ivz) - w(i, j, k, irho&
11090 & )*w(i, j, k, ivz)
11091  drw = dis2*ddw
11092  ddw = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
11093  dre = dis2*ddw
11094 ! in case a k-equation is present, compute the difference
11095 ! of rhok and store the average value of k. if not present,
11096 ! set both these values to zero, such that later on no
11097 ! decision needs to be made anymore.
11098  if (correctfork) then
11099  ddw = w(i+1, j, k, irho)*w(i+1, j, k, itu1) - w(i, j, k, &
11100 & irho)*w(i, j, k, itu1)
11101  drk = dis2*ddw
11102  kavg = half*(w(i, j, k, itu1)+w(i+1, j, k, itu1))
11103  else
11104  drk = zero
11105  kavg = zero
11106  end if
11107 ! compute the average value of gamma and compute some
11108 ! expressions in which it occurs.
11109  gammaavg = half*(gamma(i+1, j, k)+gamma(i, j, k))
11110  gm1 = gammaavg - one
11111  ovgm1 = one/gm1
11112  gm53 = gammaavg - five*third
11113 ! compute the average state at the interface.
11114  uavg = half*(w(i+1, j, k, ivx)+w(i, j, k, ivx))
11115  vavg = half*(w(i+1, j, k, ivy)+w(i, j, k, ivy))
11116  wavg = half*(w(i+1, j, k, ivz)+w(i, j, k, ivz))
11117  a2avg = half*(gamma(i+1, j, k)*p(i+1, j, k)/w(i+1, j, k, &
11118 & irho)+gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
11119  sx = si(i, j, k, 1)
11120  sy = si(i, j, k, 2)
11121  sz = si(i, j, k, 3)
11122  area = sqrt(sx**2 + sy**2 + sz**2)
11123  if (1.e-25_realtype .lt. area) then
11124  max1 = area
11125  else
11126  max1 = 1.e-25_realtype
11127  end if
11128  tmp = one/max1
11129  sx = sx*tmp
11130  sy = sy*tmp
11131  sz = sz*tmp
11132  alphaavg = half*(uavg**2+vavg**2+wavg**2)
11133  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
11134  aavg = sqrt(a2avg)
11135  unavg = uavg*sx + vavg*sy + wavg*sz
11136  ovaavg = one/aavg
11137  ova2avg = one/a2avg
11138 ! the mesh velocity if the face is moving. it must be
11139 ! divided by the area to obtain a true velocity.
11140  if (addgridvelocities) sface = sfacei(i, j, k)*tmp
11141  if (unavg - sface + aavg .ge. 0.) then
11142  lam1 = unavg - sface + aavg
11143  else
11144  lam1 = -(unavg-sface+aavg)
11145  end if
11146  if (unavg - sface - aavg .ge. 0.) then
11147  lam2 = unavg - sface - aavg
11148  else
11149  lam2 = -(unavg-sface-aavg)
11150  end if
11151  if (unavg - sface .ge. 0.) then
11152  lam3 = unavg - sface
11153  else
11154  lam3 = -(unavg-sface)
11155  end if
11156  rrad = lam3 + aavg
11157  if (lam1 .lt. epsacoustic*rrad) then
11158  lam1 = epsacoustic*rrad
11159  else
11160  lam1 = lam1
11161  end if
11162  if (lam2 .lt. epsacoustic*rrad) then
11163  lam2 = epsacoustic*rrad
11164  else
11165  lam2 = lam2
11166  end if
11167  if (lam3 .lt. epsshear*rrad) then
11168  lam3 = epsshear*rrad
11169  else
11170  lam3 = lam3
11171  end if
11172 ! multiply the eigenvalues by the area to obtain
11173 ! the correct values for the dissipation term.
11174  lam1 = lam1*area
11175  lam2 = lam2*area
11176  lam3 = lam3*area
11177 ! some abbreviations, which occur quite often in the
11178 ! dissipation terms.
11179  abv1 = half*(lam1+lam2)
11180  abv2 = half*(lam1-lam2)
11181  abv3 = abv1 - lam3
11182  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
11183 & gm53*drk
11184  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
11185  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
11186  abv7 = abv2*abv4*ovaavg + abv3*abv5
11187 ! compute and scatter the dissipative flux.
11188 ! density.
11189  fs = lam3*dr + abv6
11190  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
11191  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
11192 ! x-momentum.
11193  fs = lam3*dru + uavg*abv6 + sx*abv7
11194  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
11195  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
11196 ! y-momentum.
11197  fs = lam3*drv + vavg*abv6 + sy*abv7
11198  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
11199  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
11200 ! z-momentum.
11201  fs = lam3*drw + wavg*abv6 + sz*abv7
11202  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
11203  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
11204 ! energy.
11205  fs = lam3*dre + havg*abv6 + unavg*abv7
11206  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
11207  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
11208 ! set dp1 to dp2 for the next face.
11209  dp1 = dp2
11210  end do
11211  end do
11212  end do
11213 !
11214 ! dissipative fluxes in the j-direction.
11215 !
11216  do k=2,kl
11217  do i=2,il
11218  if (shocksensor(i, 2, k) - shocksensor(i, 1, k) .ge. 0.) then
11219  abs3 = shocksensor(i, 2, k) - shocksensor(i, 1, k)
11220  else
11221  abs3 = -(shocksensor(i, 2, k)-shocksensor(i, 1, k))
11222  end if
11223  if (shocksensor(i, 1, k) - shocksensor(i, 0, k) .ge. 0.) then
11224  abs9 = shocksensor(i, 1, k) - shocksensor(i, 0, k)
11225  else
11226  abs9 = -(shocksensor(i, 1, k)-shocksensor(i, 0, k))
11227  end if
11228  x3 = (shocksensor(i, 2, k)-two*shocksensor(i, 1, k)+&
11229 & shocksensor(i, 0, k))/(omega*(shocksensor(i, 2, k)+two*&
11230 & shocksensor(i, 1, k)+shocksensor(i, 0, k))+oneminomega*(abs3&
11231 & +abs9)+plim)
11232  if (x3 .ge. 0.) then
11233  dp1 = x3
11234  else
11235  dp1 = -x3
11236  end if
11237 ! loop in j-direction.
11238  do j=1,jl
11239  if (shocksensor(i, j+2, k) - shocksensor(i, j+1, k) .ge. 0.&
11240 & ) then
11241  abs4 = shocksensor(i, j+2, k) - shocksensor(i, j+1, k)
11242  else
11243  abs4 = -(shocksensor(i, j+2, k)-shocksensor(i, j+1, k))
11244  end if
11245  if (shocksensor(i, j+1, k) - shocksensor(i, j, k) .ge. 0.) &
11246 & then
11247  abs10 = shocksensor(i, j+1, k) - shocksensor(i, j, k)
11248  else
11249  abs10 = -(shocksensor(i, j+1, k)-shocksensor(i, j, k))
11250  end if
11251  x4 = (shocksensor(i, j+2, k)-two*shocksensor(i, j+1, k)+&
11252 & shocksensor(i, j, k))/(omega*(shocksensor(i, j+2, k)+two*&
11253 & shocksensor(i, j+1, k)+shocksensor(i, j, k))+oneminomega*(&
11254 & abs4+abs10)+plim)
11255  if (x4 .ge. 0.) then
11256  dp2 = x4
11257  else
11258  dp2 = -x4
11259  end if
11260 ! compute the dissipation coefficients for this face.
11261  ppor = zero
11262  if (porj(i, j, k) .eq. normalflux) ppor = one
11263  if (dp1 .lt. dp2) then
11264  y2 = dp2
11265  else
11266  y2 = dp1
11267  end if
11268  if (dpmax .gt. y2) then
11269  min2 = y2
11270  else
11271  min2 = dpmax
11272  end if
11273  dis2 = fis2*ppor*min2 + sigma*fis4*ppor
11274 ! construct the vector of the first and third differences
11275 ! multiplied by the appropriate constants.
11276  ddw = w(i, j+1, k, irho) - w(i, j, k, irho)
11277  dr = dis2*ddw
11278  ddw = w(i, j+1, k, irho)*w(i, j+1, k, ivx) - w(i, j, k, irho&
11279 & )*w(i, j, k, ivx)
11280  dru = dis2*ddw
11281  ddw = w(i, j+1, k, irho)*w(i, j+1, k, ivy) - w(i, j, k, irho&
11282 & )*w(i, j, k, ivy)
11283  drv = dis2*ddw
11284  ddw = w(i, j+1, k, irho)*w(i, j+1, k, ivz) - w(i, j, k, irho&
11285 & )*w(i, j, k, ivz)
11286  drw = dis2*ddw
11287  ddw = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
11288  dre = dis2*ddw
11289 ! in case a k-equation is present, compute the difference
11290 ! of rhok and store the average value of k. if not present,
11291 ! set both these values to zero, such that later on no
11292 ! decision needs to be made anymore.
11293  if (correctfork) then
11294  ddw = w(i, j+1, k, irho)*w(i, j+1, k, itu1) - w(i, j, k, &
11295 & irho)*w(i, j, k, itu1)
11296  drk = dis2*ddw
11297  kavg = half*(w(i, j, k, itu1)+w(i, j+1, k, itu1))
11298  else
11299  drk = zero
11300  kavg = zero
11301  end if
11302 ! compute the average value of gamma and compute some
11303 ! expressions in which it occurs.
11304  gammaavg = half*(gamma(i, j+1, k)+gamma(i, j, k))
11305  gm1 = gammaavg - one
11306  ovgm1 = one/gm1
11307  gm53 = gammaavg - five*third
11308 ! compute the average state at the interface.
11309  uavg = half*(w(i, j+1, k, ivx)+w(i, j, k, ivx))
11310  vavg = half*(w(i, j+1, k, ivy)+w(i, j, k, ivy))
11311  wavg = half*(w(i, j+1, k, ivz)+w(i, j, k, ivz))
11312  a2avg = half*(gamma(i, j+1, k)*p(i, j+1, k)/w(i, j+1, k, &
11313 & irho)+gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
11314  sx = sj(i, j, k, 1)
11315  sy = sj(i, j, k, 2)
11316  sz = sj(i, j, k, 3)
11317  area = sqrt(sx**2 + sy**2 + sz**2)
11318  if (1.e-25_realtype .lt. area) then
11319  max2 = area
11320  else
11321  max2 = 1.e-25_realtype
11322  end if
11323  tmp = one/max2
11324  sx = sx*tmp
11325  sy = sy*tmp
11326  sz = sz*tmp
11327  alphaavg = half*(uavg**2+vavg**2+wavg**2)
11328  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
11329  aavg = sqrt(a2avg)
11330  unavg = uavg*sx + vavg*sy + wavg*sz
11331  ovaavg = one/aavg
11332  ova2avg = one/a2avg
11333 ! the mesh velocity if the face is moving. it must be
11334 ! divided by the area to obtain a true velocity.
11335  if (addgridvelocities) sface = sfacej(i, j, k)*tmp
11336  if (unavg - sface + aavg .ge. 0.) then
11337  lam1 = unavg - sface + aavg
11338  else
11339  lam1 = -(unavg-sface+aavg)
11340  end if
11341  if (unavg - sface - aavg .ge. 0.) then
11342  lam2 = unavg - sface - aavg
11343  else
11344  lam2 = -(unavg-sface-aavg)
11345  end if
11346  if (unavg - sface .ge. 0.) then
11347  lam3 = unavg - sface
11348  else
11349  lam3 = -(unavg-sface)
11350  end if
11351  rrad = lam3 + aavg
11352  if (lam1 .lt. epsacoustic*rrad) then
11353  lam1 = epsacoustic*rrad
11354  else
11355  lam1 = lam1
11356  end if
11357  if (lam2 .lt. epsacoustic*rrad) then
11358  lam2 = epsacoustic*rrad
11359  else
11360  lam2 = lam2
11361  end if
11362  if (lam3 .lt. epsshear*rrad) then
11363  lam3 = epsshear*rrad
11364  else
11365  lam3 = lam3
11366  end if
11367 ! multiply the eigenvalues by the area to obtain
11368 ! the correct values for the dissipation term.
11369  lam1 = lam1*area
11370  lam2 = lam2*area
11371  lam3 = lam3*area
11372 ! some abbreviations, which occur quite often in the
11373 ! dissipation terms.
11374  abv1 = half*(lam1+lam2)
11375  abv2 = half*(lam1-lam2)
11376  abv3 = abv1 - lam3
11377  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
11378 & gm53*drk
11379  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
11380  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
11381  abv7 = abv2*abv4*ovaavg + abv3*abv5
11382 ! compute and scatter the dissipative flux.
11383 ! density.
11384  fs = lam3*dr + abv6
11385  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
11386  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
11387 ! x-momentum.
11388  fs = lam3*dru + uavg*abv6 + sx*abv7
11389  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
11390  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
11391 ! y-momentum.
11392  fs = lam3*drv + vavg*abv6 + sy*abv7
11393  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
11394  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
11395 ! z-momentum.
11396  fs = lam3*drw + wavg*abv6 + sz*abv7
11397  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
11398  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
11399 ! energy.
11400  fs = lam3*dre + havg*abv6 + unavg*abv7
11401  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
11402  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
11403 ! set dp1 to dp2 for the next face.
11404  dp1 = dp2
11405  end do
11406  end do
11407  end do
11408 !
11409 ! dissipative fluxes in the k-direction.
11410 !
11411  do j=2,jl
11412  do i=2,il
11413  if (shocksensor(i, j, 2) - shocksensor(i, j, 1) .ge. 0.) then
11414  abs5 = shocksensor(i, j, 2) - shocksensor(i, j, 1)
11415  else
11416  abs5 = -(shocksensor(i, j, 2)-shocksensor(i, j, 1))
11417  end if
11418  if (shocksensor(i, j, 1) - shocksensor(i, j, 0) .ge. 0.) then
11419  abs11 = shocksensor(i, j, 1) - shocksensor(i, j, 0)
11420  else
11421  abs11 = -(shocksensor(i, j, 1)-shocksensor(i, j, 0))
11422  end if
11423  x5 = (shocksensor(i, j, 2)-two*shocksensor(i, j, 1)+&
11424 & shocksensor(i, j, 0))/(omega*(shocksensor(i, j, 2)+two*&
11425 & shocksensor(i, j, 1)+shocksensor(i, j, 0))+oneminomega*(abs5&
11426 & +abs11)+plim)
11427  if (x5 .ge. 0.) then
11428  dp1 = x5
11429  else
11430  dp1 = -x5
11431  end if
11432 ! loop in k-direction.
11433  do k=1,kl
11434  if (shocksensor(i, j, k+2) - shocksensor(i, j, k+1) .ge. 0.&
11435 & ) then
11436  abs6 = shocksensor(i, j, k+2) - shocksensor(i, j, k+1)
11437  else
11438  abs6 = -(shocksensor(i, j, k+2)-shocksensor(i, j, k+1))
11439  end if
11440  if (shocksensor(i, j, k+1) - shocksensor(i, j, k) .ge. 0.) &
11441 & then
11442  abs12 = shocksensor(i, j, k+1) - shocksensor(i, j, k)
11443  else
11444  abs12 = -(shocksensor(i, j, k+1)-shocksensor(i, j, k))
11445  end if
11446  x6 = (shocksensor(i, j, k+2)-two*shocksensor(i, j, k+1)+&
11447 & shocksensor(i, j, k))/(omega*(shocksensor(i, j, k+2)+two*&
11448 & shocksensor(i, j, k+1)+shocksensor(i, j, k))+oneminomega*(&
11449 & abs6+abs12)+plim)
11450  if (x6 .ge. 0.) then
11451  dp2 = x6
11452  else
11453  dp2 = -x6
11454  end if
11455 ! compute the dissipation coefficients for this face.
11456  ppor = zero
11457  if (pork(i, j, k) .eq. normalflux) ppor = one
11458  if (dp1 .lt. dp2) then
11459  y3 = dp2
11460  else
11461  y3 = dp1
11462  end if
11463  if (dpmax .gt. y3) then
11464  min3 = y3
11465  else
11466  min3 = dpmax
11467  end if
11468  dis2 = fis2*ppor*min3 + sigma*fis4*ppor
11469 ! construct the vector of the first and third differences
11470 ! multiplied by the appropriate constants.
11471  ddw = w(i, j, k+1, irho) - w(i, j, k, irho)
11472  dr = dis2*ddw
11473  ddw = w(i, j, k+1, irho)*w(i, j, k+1, ivx) - w(i, j, k, irho&
11474 & )*w(i, j, k, ivx)
11475  dru = dis2*ddw
11476  ddw = w(i, j, k+1, irho)*w(i, j, k+1, ivy) - w(i, j, k, irho&
11477 & )*w(i, j, k, ivy)
11478  drv = dis2*ddw
11479  ddw = w(i, j, k+1, irho)*w(i, j, k+1, ivz) - w(i, j, k, irho&
11480 & )*w(i, j, k, ivz)
11481  drw = dis2*ddw
11482  ddw = w(i, j, k+1, irhoe) - w(i, j, k, irhoe)
11483  dre = dis2*ddw
11484 ! in case a k-equation is present, compute the difference
11485 ! of rhok and store the average value of k. if not present,
11486 ! set both these values to zero, such that later on no
11487 ! decision needs to be made anymore.
11488  if (correctfork) then
11489  ddw = w(i, j, k+1, irho)*w(i, j, k+1, itu1) - w(i, j, k, &
11490 & irho)*w(i, j, k, itu1)
11491  drk = dis2*ddw
11492  kavg = half*(w(i, j, k+1, itu1)+w(i, j, k, itu1))
11493  else
11494  drk = zero
11495  kavg = zero
11496  end if
11497 ! compute the average value of gamma and compute some
11498 ! expressions in which it occurs.
11499  gammaavg = half*(gamma(i, j, k+1)+gamma(i, j, k))
11500  gm1 = gammaavg - one
11501  ovgm1 = one/gm1
11502  gm53 = gammaavg - five*third
11503 ! compute the average state at the interface.
11504  uavg = half*(w(i, j, k+1, ivx)+w(i, j, k, ivx))
11505  vavg = half*(w(i, j, k+1, ivy)+w(i, j, k, ivy))
11506  wavg = half*(w(i, j, k+1, ivz)+w(i, j, k, ivz))
11507  a2avg = half*(gamma(i, j, k+1)*p(i, j, k+1)/w(i, j, k+1, &
11508 & irho)+gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
11509  sx = sk(i, j, k, 1)
11510  sy = sk(i, j, k, 2)
11511  sz = sk(i, j, k, 3)
11512  area = sqrt(sx**2 + sy**2 + sz**2)
11513  if (1.e-25_realtype .lt. area) then
11514  max3 = area
11515  else
11516  max3 = 1.e-25_realtype
11517  end if
11518  tmp = one/max3
11519  sx = sx*tmp
11520  sy = sy*tmp
11521  sz = sz*tmp
11522  alphaavg = half*(uavg**2+vavg**2+wavg**2)
11523  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
11524  aavg = sqrt(a2avg)
11525  unavg = uavg*sx + vavg*sy + wavg*sz
11526  ovaavg = one/aavg
11527  ova2avg = one/a2avg
11528 ! the mesh velocity if the face is moving. it must be
11529 ! divided by the area to obtain a true velocity.
11530  if (addgridvelocities) sface = sfacek(i, j, k)*tmp
11531  if (unavg - sface + aavg .ge. 0.) then
11532  lam1 = unavg - sface + aavg
11533  else
11534  lam1 = -(unavg-sface+aavg)
11535  end if
11536  if (unavg - sface - aavg .ge. 0.) then
11537  lam2 = unavg - sface - aavg
11538  else
11539  lam2 = -(unavg-sface-aavg)
11540  end if
11541  if (unavg - sface .ge. 0.) then
11542  lam3 = unavg - sface
11543  else
11544  lam3 = -(unavg-sface)
11545  end if
11546  rrad = lam3 + aavg
11547  if (lam1 .lt. epsacoustic*rrad) then
11548  lam1 = epsacoustic*rrad
11549  else
11550  lam1 = lam1
11551  end if
11552  if (lam2 .lt. epsacoustic*rrad) then
11553  lam2 = epsacoustic*rrad
11554  else
11555  lam2 = lam2
11556  end if
11557  if (lam3 .lt. epsshear*rrad) then
11558  lam3 = epsshear*rrad
11559  else
11560  lam3 = lam3
11561  end if
11562 ! multiply the eigenvalues by the area to obtain
11563 ! the correct values for the dissipation term.
11564  lam1 = lam1*area
11565  lam2 = lam2*area
11566  lam3 = lam3*area
11567 ! some abbreviations, which occur quite often in the
11568 ! dissipation terms.
11569  abv1 = half*(lam1+lam2)
11570  abv2 = half*(lam1-lam2)
11571  abv3 = abv1 - lam3
11572  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
11573 & gm53*drk
11574  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
11575  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
11576  abv7 = abv2*abv4*ovaavg + abv3*abv5
11577 ! compute and scatter the dissipative flux.
11578 ! density.
11579  fs = lam3*dr + abv6
11580  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) + fs
11581  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
11582 ! x-momentum.
11583  fs = lam3*dru + uavg*abv6 + sx*abv7
11584  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fs
11585  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
11586 ! y-momentum.
11587  fs = lam3*drv + vavg*abv6 + sy*abv7
11588  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fs
11589  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
11590 ! z-momentum.
11591  fs = lam3*drw + wavg*abv6 + sz*abv7
11592  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fs
11593  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
11594 ! energy.
11595  fs = lam3*dre + havg*abv6 + unavg*abv7
11596  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + fs
11597  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
11598 ! set dp1 to dp2 for the next face.
11599  dp1 = dp2
11600  end do
11601  end do
11602  end do
11603  end if
11604  end subroutine invisciddissfluxmatrixapprox
11605 ! ----------------------------------------------------------------------
11606 ! |
11607 ! no tapenade routine below this line |
11608 ! |
11609 ! ----------------------------------------------------------------------
11610 
11611 end module fluxes_fast_b
11612 
subroutine riemannflux(left, right, flux)
Definition: fluxes_d.f90:5366
subroutine leftrightstate(du1, du2, du3, rotmatrix, left, right)
Definition: fluxes_d.f90:4708
subroutine leftrightstate_fast_b(du1, du1d, du2, du2d, du3, du3d, rotmatrix, left, leftd, right, rightd)
subroutine riemannflux_fast_b(left, leftd, right, rightd, flux, fluxd)
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 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
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
integer(kind=inttype) jb
integer(kind=inttype) kb
real(kind=realtype), dimension(:, :, :), pointer rlv
real(kind=realtype), dimension(:, :, :, :), pointer si
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
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 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
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
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=inttype), dimension(32) myintstack
Definition: constants.F90:299
integer(kind=portype), parameter normalflux
Definition: constants.F90:30
integer, parameter irhoe
Definition: constants.F90:38
integer(kind=inttype) myintptr
Definition: constants.F90:300
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(rho, u, v, w, p, k, etotal, correctfork)
subroutine etot_fast_b(rho, rhod, u, ud, v, vd, w, wd, p, pd, k, kd, etotal, etotald, correctfork)
real(kind=realtype) gammainf
real(kind=realtype) pinfcorr
real(kind=realtype) rgas
integer(kind=inttype) nwf
real(kind=realtype) tref
integer(kind=inttype) nw
real(kind=realtype) rhoinf
real(kind=realtype) timeref
subroutine invisciddissfluxscalar()
subroutine inviscidcentralflux()
subroutine invisciddissfluxmatrix_fast_b()
subroutine viscousflux_fast_b()
subroutine viscousfluxapprox()
subroutine inviscidcentralflux_fast_b()
subroutine inviscidupwindflux_fast_b(finegrid)
subroutine invisciddissfluxscalarapprox()
subroutine invisciddissfluxmatrix()
subroutine inviscidupwindflux(finegrid)
subroutine invisciddissfluxscalar_fast_b()
subroutine invisciddissfluxmatrixapprox()
subroutine viscousflux()
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
logical function getcorrectfork()
subroutine terminate(routinename, errormessage)
real(kind=realtype) function mydim(x, y)
subroutine mydim_fast_b(x, xd, y, yd, mydimd)