ADflow  v1.0
ADflow is a finite volume RANS solver tailored for gradient-based aerodynamic design optimization.
fluxes_d.f90
Go to the documentation of this file.
1 ! generated by tapenade (inria, ecuador team)
2 ! tapenade 3.16 (develop) - 22 aug 2023 15:51
3 !
4 module fluxes_d
5  implicit none
6 
7 contains
8 ! differentiation of inviscidcentralflux in forward (tangent) mode (with options i4 dr8 r8):
9 ! variations of useful results: *dw
10 ! with respect to varying inputs: timeref *p *sfacei *sfacej
11 ! *sfacek *w *dw *vol *si *sj *sk
12 ! rw status of diff variables: timeref:in *p:in *sfacei:in *sfacej:in
13 ! *sfacek:in *w:in *dw:in-out *vol:in *si:in *sj:in
14 ! *sk:in
15 ! plus diff mem management of: p:in sfacei:in sfacej:in sfacek:in
16 ! w:in dw:in vol:in si:in sj:in sk:in
17  subroutine inviscidcentralflux_d()
18 !
19 ! inviscidcentralflux computes the euler fluxes using a central
20 ! discretization for a given block. therefore it is assumed that
21 ! the pointers in block pointer already point to the correct
22 ! block on the correct multigrid level.
23 !
24  use constants
25  use blockpointers, only : nx, il, ie, ny, jl, je, nz, kl, ke, &
26 & spectralsol, w, wd, si, sid, sj, sjd, sk, skd, dw, dwd, pori, porj, &
31  use flowvarrefstate, only : timeref, timerefd
32  use inputphysics, only : equationmode
33  implicit none
34 !
35 ! local variables.
36 !
37  integer(kind=inttype) :: i, j, k, ind, ii
38  real(kind=realtype) :: qsp, qsm, rqsp, rqsm, porvel, porflux
39  real(kind=realtype) :: qspd, qsmd, rqspd, rqsmd
40  real(kind=realtype) :: pa, fs, sface, vnp, vnm
41  real(kind=realtype) :: pad, fsd, sfaced, vnpd, vnmd
42  real(kind=realtype) :: wwx, wwy, wwz, rvol
43  real(kind=realtype) :: wwxd, wwyd, wwzd, rvold
44  intrinsic mod
45  real(kind=realtype) :: temp
46  real(kind=realtype) :: temp0
47  real(kind=realtype) :: temp1
48  real(kind=realtype) :: temp2
49  real(kind=realtype) :: temp3
50  real(kind=realtype) :: temp4
51 ! initialize sface to zero. this value will be used if the
52 ! block is not moving.
53  sface = zero
54  sfaced = 0.0_8
55 !
56 ! advective fluxes in the i-direction.
57 !
58  do k=2,kl
59  do j=2,jl
60  do i=1,il
61 ! set the dot product of the grid velocity and the
62 ! normal in i-direction for a moving face.
63  if (addgridvelocities) then
64  sfaced = sfaceid(i, j, k)
65  sface = sfacei(i, j, k)
66  end if
67 ! compute the normal velocities of the left and right state.
68  temp = si(i, j, k, 1)
69  temp0 = w(i+1, j, k, ivx)
70  temp1 = si(i, j, k, 2)
71  temp2 = w(i+1, j, k, ivy)
72  temp3 = si(i, j, k, 3)
73  temp4 = w(i+1, j, k, ivz)
74  vnpd = temp*wd(i+1, j, k, ivx) + temp0*sid(i, j, k, 1) + temp1&
75 & *wd(i+1, j, k, ivy) + temp2*sid(i, j, k, 2) + temp3*wd(i+1, &
76 & j, k, ivz) + temp4*sid(i, j, k, 3)
77  vnp = temp0*temp + temp2*temp1 + temp4*temp3
78  temp4 = si(i, j, k, 1)
79  temp3 = w(i, j, k, ivx)
80  temp2 = si(i, j, k, 2)
81  temp1 = w(i, j, k, ivy)
82  temp0 = si(i, j, k, 3)
83  temp = w(i, j, k, ivz)
84  vnmd = temp4*wd(i, j, k, ivx) + temp3*sid(i, j, k, 1) + temp2*&
85 & wd(i, j, k, ivy) + temp1*sid(i, j, k, 2) + temp0*wd(i, j, k&
86 & , ivz) + temp*sid(i, j, k, 3)
87  vnm = temp3*temp4 + temp1*temp2 + temp*temp0
88 ! set the values of the porosities for this face.
89 ! porvel defines the porosity w.r.t. velocity;
90 ! porflux defines the porosity w.r.t. the entire flux.
91 ! the latter is only zero for a discontinuous block
92 ! boundary that must be treated conservatively.
93 ! the default value of porflux is 0.5, such that the
94 ! correct central flux is scattered to both cells.
95 ! in case of a boundflux the normal velocity is set
96 ! to sface.
97  porvel = one
98  porflux = half
99  if (pori(i, j, k) .eq. noflux) porflux = zero
100  if (pori(i, j, k) .eq. boundflux) then
101  porvel = zero
102  vnpd = sfaced
103  vnp = sface
104  vnmd = sfaced
105  vnm = sface
106  end if
107 ! incorporate porflux in porvel.
108  porvel = porvel*porflux
109 ! compute the normal velocities relative to the grid for
110 ! the face as well as the mass fluxes.
111  qspd = porvel*(vnpd-sfaced)
112  qsp = (vnp-sface)*porvel
113  qsmd = porvel*(vnmd-sfaced)
114  qsm = (vnm-sface)*porvel
115  temp4 = w(i+1, j, k, irho)
116  rqspd = temp4*qspd + qsp*wd(i+1, j, k, irho)
117  rqsp = qsp*temp4
118  temp4 = w(i, j, k, irho)
119  rqsmd = temp4*qsmd + qsm*wd(i, j, k, irho)
120  rqsm = qsm*temp4
121 ! compute the sum of the pressure multiplied by porflux.
122 ! for the default value of porflux, 0.5, this leads to
123 ! the average pressure.
124  pad = porflux*(pd(i+1, j, k)+pd(i, j, k))
125  pa = porflux*(p(i+1, j, k)+p(i, j, k))
126 ! compute the fluxes and scatter them to the cells
127 ! i,j,k and i+1,j,k. store the density flux in the
128 ! mass flow of the appropriate sliding mesh interface.
129  fsd = rqspd + rqsmd
130  fs = rqsp + rqsm
131  dwd(i+1, j, k, irho) = dwd(i+1, j, k, irho) - fsd
132  dw(i+1, j, k, irho) = dw(i+1, j, k, irho) - fs
133  dwd(i, j, k, irho) = dwd(i, j, k, irho) + fsd
134  dw(i, j, k, irho) = dw(i, j, k, irho) + fs
135  temp4 = w(i+1, j, k, ivx)
136  temp3 = w(i, j, k, ivx)
137  temp2 = si(i, j, k, 1)
138  fsd = temp4*rqspd + rqsp*wd(i+1, j, k, ivx) + temp3*rqsmd + &
139 & rqsm*wd(i, j, k, ivx) + temp2*pad + pa*sid(i, j, k, 1)
140  fs = rqsp*temp4 + rqsm*temp3 + pa*temp2
141  dwd(i+1, j, k, imx) = dwd(i+1, j, k, imx) - fsd
142  dw(i+1, j, k, imx) = dw(i+1, j, k, imx) - fs
143  dwd(i, j, k, imx) = dwd(i, j, k, imx) + fsd
144  dw(i, j, k, imx) = dw(i, j, k, imx) + fs
145  temp4 = w(i+1, j, k, ivy)
146  temp3 = w(i, j, k, ivy)
147  temp2 = si(i, j, k, 2)
148  fsd = temp4*rqspd + rqsp*wd(i+1, j, k, ivy) + temp3*rqsmd + &
149 & rqsm*wd(i, j, k, ivy) + temp2*pad + pa*sid(i, j, k, 2)
150  fs = rqsp*temp4 + rqsm*temp3 + pa*temp2
151  dwd(i+1, j, k, imy) = dwd(i+1, j, k, imy) - fsd
152  dw(i+1, j, k, imy) = dw(i+1, j, k, imy) - fs
153  dwd(i, j, k, imy) = dwd(i, j, k, imy) + fsd
154  dw(i, j, k, imy) = dw(i, j, k, imy) + fs
155  temp4 = w(i+1, j, k, ivz)
156  temp3 = w(i, j, k, ivz)
157  temp2 = si(i, j, k, 3)
158  fsd = temp4*rqspd + rqsp*wd(i+1, j, k, ivz) + temp3*rqsmd + &
159 & rqsm*wd(i, j, k, ivz) + temp2*pad + pa*sid(i, j, k, 3)
160  fs = rqsp*temp4 + rqsm*temp3 + pa*temp2
161  dwd(i+1, j, k, imz) = dwd(i+1, j, k, imz) - fsd
162  dw(i+1, j, k, imz) = dw(i+1, j, k, imz) - fs
163  dwd(i, j, k, imz) = dwd(i, j, k, imz) + fsd
164  dw(i, j, k, imz) = dw(i, j, k, imz) + fs
165  temp4 = w(i+1, j, k, irhoe)
166  temp3 = w(i, j, k, irhoe)
167  temp2 = p(i+1, j, k)
168  fsd = temp4*qspd + qsp*wd(i+1, j, k, irhoe) + temp3*qsmd + qsm&
169 & *wd(i, j, k, irhoe) + porflux*(temp2*vnpd+vnp*pd(i+1, j, k)+&
170 & p(i, j, k)*vnmd+vnm*pd(i, j, k))
171  fs = qsp*temp4 + qsm*temp3 + porflux*(vnp*temp2+vnm*p(i, j, k)&
172 & )
173  dwd(i+1, j, k, irhoe) = dwd(i+1, j, k, irhoe) - fsd
174  dw(i+1, j, k, irhoe) = dw(i+1, j, k, irhoe) - fs
175  dwd(i, j, k, irhoe) = dwd(i, j, k, irhoe) + fsd
176  dw(i, j, k, irhoe) = dw(i, j, k, irhoe) + fs
177  end do
178  end do
179  end do
180 !
181 ! advective fluxes in the j-direction.
182 !
183  sface = zero
184  sfaced = 0.0_8
185  do k=2,kl
186  do j=1,jl
187  do i=2,il
188 ! set the dot product of the grid velocity and the
189 ! normal in j-direction for a moving face.
190  if (addgridvelocities) then
191  sfaced = sfacejd(i, j, k)
192  sface = sfacej(i, j, k)
193  end if
194 ! compute the normal velocities of the left and right state.
195  temp4 = sj(i, j, k, 1)
196  temp3 = w(i, j+1, k, ivx)
197  temp2 = sj(i, j, k, 2)
198  temp1 = w(i, j+1, k, ivy)
199  temp0 = sj(i, j, k, 3)
200  temp = w(i, j+1, k, ivz)
201  vnpd = temp4*wd(i, j+1, k, ivx) + temp3*sjd(i, j, k, 1) + &
202 & temp2*wd(i, j+1, k, ivy) + temp1*sjd(i, j, k, 2) + temp0*wd(&
203 & i, j+1, k, ivz) + temp*sjd(i, j, k, 3)
204  vnp = temp3*temp4 + temp1*temp2 + temp*temp0
205  temp4 = sj(i, j, k, 1)
206  temp3 = w(i, j, k, ivx)
207  temp2 = sj(i, j, k, 2)
208  temp1 = w(i, j, k, ivy)
209  temp0 = sj(i, j, k, 3)
210  temp = w(i, j, k, ivz)
211  vnmd = temp4*wd(i, j, k, ivx) + temp3*sjd(i, j, k, 1) + temp2*&
212 & wd(i, j, k, ivy) + temp1*sjd(i, j, k, 2) + temp0*wd(i, j, k&
213 & , ivz) + temp*sjd(i, j, k, 3)
214  vnm = temp3*temp4 + temp1*temp2 + temp*temp0
215 ! set the values of the porosities for this face.
216 ! porvel defines the porosity w.r.t. velocity;
217 ! porflux defines the porosity w.r.t. the entire flux.
218 ! the latter is only zero for a discontinuous block
219 ! boundary that must be treated conservatively.
220 ! the default value of porflux is 0.5, such that the
221 ! correct central flux is scattered to both cells.
222 ! in case of a boundflux the normal velocity is set
223 ! to sface.
224  porvel = one
225  porflux = half
226  if (porj(i, j, k) .eq. noflux) porflux = zero
227  if (porj(i, j, k) .eq. boundflux) then
228  porvel = zero
229  vnpd = sfaced
230  vnp = sface
231  vnmd = sfaced
232  vnm = sface
233  end if
234 ! incorporate porflux in porvel.
235  porvel = porvel*porflux
236 ! compute the normal velocities for the face as well as the
237 ! mass fluxes.
238  qspd = porvel*(vnpd-sfaced)
239  qsp = (vnp-sface)*porvel
240  qsmd = porvel*(vnmd-sfaced)
241  qsm = (vnm-sface)*porvel
242  temp4 = w(i, j+1, k, irho)
243  rqspd = temp4*qspd + qsp*wd(i, j+1, k, irho)
244  rqsp = qsp*temp4
245  temp4 = w(i, j, k, irho)
246  rqsmd = temp4*qsmd + qsm*wd(i, j, k, irho)
247  rqsm = qsm*temp4
248 ! compute the sum of the pressure multiplied by porflux.
249 ! for the default value of porflux, 0.5, this leads to
250 ! the average pressure.
251  pad = porflux*(pd(i, j+1, k)+pd(i, j, k))
252  pa = porflux*(p(i, j+1, k)+p(i, j, k))
253 ! compute the fluxes and scatter them to the cells
254 ! i,j,k and i,j+1,k. store the density flux in the
255 ! mass flow of the appropriate sliding mesh interface.
256  fsd = rqspd + rqsmd
257  fs = rqsp + rqsm
258  dwd(i, j+1, k, irho) = dwd(i, j+1, k, irho) - fsd
259  dw(i, j+1, k, irho) = dw(i, j+1, k, irho) - fs
260  dwd(i, j, k, irho) = dwd(i, j, k, irho) + fsd
261  dw(i, j, k, irho) = dw(i, j, k, irho) + fs
262  temp4 = w(i, j+1, k, ivx)
263  temp3 = w(i, j, k, ivx)
264  temp2 = sj(i, j, k, 1)
265  fsd = temp4*rqspd + rqsp*wd(i, j+1, k, ivx) + temp3*rqsmd + &
266 & rqsm*wd(i, j, k, ivx) + temp2*pad + pa*sjd(i, j, k, 1)
267  fs = rqsp*temp4 + rqsm*temp3 + pa*temp2
268  dwd(i, j+1, k, imx) = dwd(i, j+1, k, imx) - fsd
269  dw(i, j+1, k, imx) = dw(i, j+1, k, imx) - fs
270  dwd(i, j, k, imx) = dwd(i, j, k, imx) + fsd
271  dw(i, j, k, imx) = dw(i, j, k, imx) + fs
272  temp4 = w(i, j+1, k, ivy)
273  temp3 = w(i, j, k, ivy)
274  temp2 = sj(i, j, k, 2)
275  fsd = temp4*rqspd + rqsp*wd(i, j+1, k, ivy) + temp3*rqsmd + &
276 & rqsm*wd(i, j, k, ivy) + temp2*pad + pa*sjd(i, j, k, 2)
277  fs = rqsp*temp4 + rqsm*temp3 + pa*temp2
278  dwd(i, j+1, k, imy) = dwd(i, j+1, k, imy) - fsd
279  dw(i, j+1, k, imy) = dw(i, j+1, k, imy) - fs
280  dwd(i, j, k, imy) = dwd(i, j, k, imy) + fsd
281  dw(i, j, k, imy) = dw(i, j, k, imy) + fs
282  temp4 = w(i, j+1, k, ivz)
283  temp3 = w(i, j, k, ivz)
284  temp2 = sj(i, j, k, 3)
285  fsd = temp4*rqspd + rqsp*wd(i, j+1, k, ivz) + temp3*rqsmd + &
286 & rqsm*wd(i, j, k, ivz) + temp2*pad + pa*sjd(i, j, k, 3)
287  fs = rqsp*temp4 + rqsm*temp3 + pa*temp2
288  dwd(i, j+1, k, imz) = dwd(i, j+1, k, imz) - fsd
289  dw(i, j+1, k, imz) = dw(i, j+1, k, imz) - fs
290  dwd(i, j, k, imz) = dwd(i, j, k, imz) + fsd
291  dw(i, j, k, imz) = dw(i, j, k, imz) + fs
292  temp4 = w(i, j+1, k, irhoe)
293  temp3 = w(i, j, k, irhoe)
294  temp2 = p(i, j+1, k)
295  fsd = temp4*qspd + qsp*wd(i, j+1, k, irhoe) + temp3*qsmd + qsm&
296 & *wd(i, j, k, irhoe) + porflux*(temp2*vnpd+vnp*pd(i, j+1, k)+&
297 & p(i, j, k)*vnmd+vnm*pd(i, j, k))
298  fs = qsp*temp4 + qsm*temp3 + porflux*(vnp*temp2+vnm*p(i, j, k)&
299 & )
300  dwd(i, j+1, k, irhoe) = dwd(i, j+1, k, irhoe) - fsd
301  dw(i, j+1, k, irhoe) = dw(i, j+1, k, irhoe) - fs
302  dwd(i, j, k, irhoe) = dwd(i, j, k, irhoe) + fsd
303  dw(i, j, k, irhoe) = dw(i, j, k, irhoe) + fs
304  end do
305  end do
306  end do
307 !
308 ! advective fluxes in the k-direction.
309  sface = zero
310  sfaced = 0.0_8
311  do k=1,kl
312  do j=2,jl
313  do i=2,il
314 ! set the dot product of the grid velocity and the
315 ! normal in k-direction for a moving face.
316  if (addgridvelocities) then
317  sfaced = sfacekd(i, j, k)
318  sface = sfacek(i, j, k)
319  end if
320 ! compute the normal velocities of the left and right state.
321  temp4 = sk(i, j, k, 1)
322  temp3 = w(i, j, k+1, ivx)
323  temp2 = sk(i, j, k, 2)
324  temp1 = w(i, j, k+1, ivy)
325  temp0 = sk(i, j, k, 3)
326  temp = w(i, j, k+1, ivz)
327  vnpd = temp4*wd(i, j, k+1, ivx) + temp3*skd(i, j, k, 1) + &
328 & temp2*wd(i, j, k+1, ivy) + temp1*skd(i, j, k, 2) + temp0*wd(&
329 & i, j, k+1, ivz) + temp*skd(i, j, k, 3)
330  vnp = temp3*temp4 + temp1*temp2 + temp*temp0
331  temp4 = sk(i, j, k, 1)
332  temp3 = w(i, j, k, ivx)
333  temp2 = sk(i, j, k, 2)
334  temp1 = w(i, j, k, ivy)
335  temp0 = sk(i, j, k, 3)
336  temp = w(i, j, k, ivz)
337  vnmd = temp4*wd(i, j, k, ivx) + temp3*skd(i, j, k, 1) + temp2*&
338 & wd(i, j, k, ivy) + temp1*skd(i, j, k, 2) + temp0*wd(i, j, k&
339 & , ivz) + temp*skd(i, j, k, 3)
340  vnm = temp3*temp4 + temp1*temp2 + temp*temp0
341 ! set the values of the porosities for this face.
342 ! porvel defines the porosity w.r.t. velocity;
343 ! porflux defines the porosity w.r.t. the entire flux.
344 ! the latter is only zero for a discontinuous block
345 ! block boundary that must be treated conservatively.
346 ! the default value of porflux is 0.5, such that the
347 ! correct central flux is scattered to both cells.
348 ! in case of a boundflux the normal velocity is set
349 ! to sface.
350  porvel = one
351  porflux = half
352  if (pork(i, j, k) .eq. noflux) porflux = zero
353  if (pork(i, j, k) .eq. boundflux) then
354  porvel = zero
355  vnpd = sfaced
356  vnp = sface
357  vnmd = sfaced
358  vnm = sface
359  end if
360 ! incorporate porflux in porvel.
361  porvel = porvel*porflux
362 ! compute the normal velocities for the face as well as the
363 ! mass fluxes.
364  qspd = porvel*(vnpd-sfaced)
365  qsp = (vnp-sface)*porvel
366  qsmd = porvel*(vnmd-sfaced)
367  qsm = (vnm-sface)*porvel
368  temp4 = w(i, j, k+1, irho)
369  rqspd = temp4*qspd + qsp*wd(i, j, k+1, irho)
370  rqsp = qsp*temp4
371  temp4 = w(i, j, k, irho)
372  rqsmd = temp4*qsmd + qsm*wd(i, j, k, irho)
373  rqsm = qsm*temp4
374 ! compute the sum of the pressure multiplied by porflux.
375 ! for the default value of porflux, 0.5, this leads to
376 ! the average pressure.
377  pad = porflux*(pd(i, j, k+1)+pd(i, j, k))
378  pa = porflux*(p(i, j, k+1)+p(i, j, k))
379 ! compute the fluxes and scatter them to the cells
380 ! i,j,k and i,j,k+1. store the density flux in the
381 ! mass flow of the appropriate sliding mesh interface.
382  fsd = rqspd + rqsmd
383  fs = rqsp + rqsm
384  dwd(i, j, k+1, irho) = dwd(i, j, k+1, irho) - fsd
385  dw(i, j, k+1, irho) = dw(i, j, k+1, irho) - fs
386  dwd(i, j, k, irho) = dwd(i, j, k, irho) + fsd
387  dw(i, j, k, irho) = dw(i, j, k, irho) + fs
388  temp4 = w(i, j, k+1, ivx)
389  temp3 = w(i, j, k, ivx)
390  temp2 = sk(i, j, k, 1)
391  fsd = temp4*rqspd + rqsp*wd(i, j, k+1, ivx) + temp3*rqsmd + &
392 & rqsm*wd(i, j, k, ivx) + temp2*pad + pa*skd(i, j, k, 1)
393  fs = rqsp*temp4 + rqsm*temp3 + pa*temp2
394  dwd(i, j, k+1, imx) = dwd(i, j, k+1, imx) - fsd
395  dw(i, j, k+1, imx) = dw(i, j, k+1, imx) - fs
396  dwd(i, j, k, imx) = dwd(i, j, k, imx) + fsd
397  dw(i, j, k, imx) = dw(i, j, k, imx) + fs
398  temp4 = w(i, j, k+1, ivy)
399  temp3 = w(i, j, k, ivy)
400  temp2 = sk(i, j, k, 2)
401  fsd = temp4*rqspd + rqsp*wd(i, j, k+1, ivy) + temp3*rqsmd + &
402 & rqsm*wd(i, j, k, ivy) + temp2*pad + pa*skd(i, j, k, 2)
403  fs = rqsp*temp4 + rqsm*temp3 + pa*temp2
404  dwd(i, j, k+1, imy) = dwd(i, j, k+1, imy) - fsd
405  dw(i, j, k+1, imy) = dw(i, j, k+1, imy) - fs
406  dwd(i, j, k, imy) = dwd(i, j, k, imy) + fsd
407  dw(i, j, k, imy) = dw(i, j, k, imy) + fs
408  temp4 = w(i, j, k+1, ivz)
409  temp3 = w(i, j, k, ivz)
410  temp2 = sk(i, j, k, 3)
411  fsd = temp4*rqspd + rqsp*wd(i, j, k+1, ivz) + temp3*rqsmd + &
412 & rqsm*wd(i, j, k, ivz) + temp2*pad + pa*skd(i, j, k, 3)
413  fs = rqsp*temp4 + rqsm*temp3 + pa*temp2
414  dwd(i, j, k+1, imz) = dwd(i, j, k+1, imz) - fsd
415  dw(i, j, k+1, imz) = dw(i, j, k+1, imz) - fs
416  dwd(i, j, k, imz) = dwd(i, j, k, imz) + fsd
417  dw(i, j, k, imz) = dw(i, j, k, imz) + fs
418  temp4 = w(i, j, k+1, irhoe)
419  temp3 = w(i, j, k, irhoe)
420  temp2 = p(i, j, k+1)
421  fsd = temp4*qspd + qsp*wd(i, j, k+1, irhoe) + temp3*qsmd + qsm&
422 & *wd(i, j, k, irhoe) + porflux*(temp2*vnpd+vnp*pd(i, j, k+1)+&
423 & p(i, j, k)*vnmd+vnm*pd(i, j, k))
424  fs = qsp*temp4 + qsm*temp3 + porflux*(vnp*temp2+vnm*p(i, j, k)&
425 & )
426  dwd(i, j, k+1, irhoe) = dwd(i, j, k+1, irhoe) - fsd
427  dw(i, j, k+1, irhoe) = dw(i, j, k+1, irhoe) - fs
428  dwd(i, j, k, irhoe) = dwd(i, j, k, irhoe) + fsd
429  dw(i, j, k, irhoe) = dw(i, j, k, irhoe) + fs
430  end do
431  end do
432  end do
433 ! add the rotational source terms for a moving block in a
434 ! steady state computation. these source terms account for the
435 ! centrifugal acceleration and the coriolis term. however, as
436 ! the the equations are solved in the inertial frame and not
437 ! in the moving frame, the form is different than what you
438 ! normally find in a text book.
439  if (blockismoving .and. equationmode .eq. steady) then
440 ! compute the three nondimensional angular velocities.
441  wwxd = cgnsdoms(nbkglobal)%rotrate(1)*timerefd
442  wwx = timeref*cgnsdoms(nbkglobal)%rotrate(1)
443  wwyd = cgnsdoms(nbkglobal)%rotrate(2)*timerefd
444  wwy = timeref*cgnsdoms(nbkglobal)%rotrate(2)
445  wwzd = cgnsdoms(nbkglobal)%rotrate(3)*timerefd
446  wwz = timeref*cgnsdoms(nbkglobal)%rotrate(3)
447 ! loop over the internal cells of this block to compute the
448 ! rotational terms for the momentum equations.
449  do ii=0,nx*ny*nz-1
450  i = mod(ii, nx) + 2
451  j = mod(ii/nx, ny) + 2
452  k = ii/(nx*ny) + 2
453  temp4 = w(i, j, k, irho)
454  rvold = vol(i, j, k)*wd(i, j, k, irho) + temp4*vold(i, j, k)
455  rvol = temp4*vol(i, j, k)
456  temp4 = w(i, j, k, ivy)
457  temp3 = w(i, j, k, ivz)
458  temp2 = wwy*temp3 - wwz*temp4
459  dwd(i, j, k, imx) = dwd(i, j, k, imx) + temp2*rvold + rvol*(&
460 & temp3*wwyd+wwy*wd(i, j, k, ivz)-temp4*wwzd-wwz*wd(i, j, k, ivy&
461 & ))
462  dw(i, j, k, imx) = dw(i, j, k, imx) + rvol*temp2
463  temp4 = w(i, j, k, ivz)
464  temp3 = w(i, j, k, ivx)
465  temp2 = wwz*temp3 - wwx*temp4
466  dwd(i, j, k, imy) = dwd(i, j, k, imy) + temp2*rvold + rvol*(&
467 & temp3*wwzd+wwz*wd(i, j, k, ivx)-temp4*wwxd-wwx*wd(i, j, k, ivz&
468 & ))
469  dw(i, j, k, imy) = dw(i, j, k, imy) + rvol*temp2
470  temp4 = w(i, j, k, ivx)
471  temp3 = w(i, j, k, ivy)
472  temp2 = wwx*temp3 - wwy*temp4
473  dwd(i, j, k, imz) = dwd(i, j, k, imz) + temp2*rvold + rvol*(&
474 & temp3*wwxd+wwx*wd(i, j, k, ivy)-temp4*wwyd-wwy*wd(i, j, k, ivx&
475 & ))
476  dw(i, j, k, imz) = dw(i, j, k, imz) + rvol*temp2
477  end do
478  end if
479  end subroutine inviscidcentralflux_d
480 
481  subroutine inviscidcentralflux()
482 !
483 ! inviscidcentralflux computes the euler fluxes using a central
484 ! discretization for a given block. therefore it is assumed that
485 ! the pointers in block pointer already point to the correct
486 ! block on the correct multigrid level.
487 !
488  use constants
489  use blockpointers, only : nx, il, ie, ny, jl, je, nz, kl, ke, &
490 & spectralsol, w, si, sj, sk, dw, pori, porj, pork, indfamilyi, &
493 & factfamilyk
494  use cgnsgrid, only : cgnsdoms, massflowfamilyinv
495  use flowvarrefstate, only : timeref
496  use inputphysics, only : equationmode
497  implicit none
498 !
499 ! local variables.
500 !
501  integer(kind=inttype) :: i, j, k, ind, ii
502  real(kind=realtype) :: qsp, qsm, rqsp, rqsm, porvel, porflux
503  real(kind=realtype) :: pa, fs, sface, vnp, vnm
504  real(kind=realtype) :: wwx, wwy, wwz, rvol
505  intrinsic mod
506 !$ad checkpoint-start
507 ! initialize sface to zero. this value will be used if the
508 ! block is not moving.
509  sface = zero
510 !
511 ! advective fluxes in the i-direction.
512 !
513  do k=2,kl
514  do j=2,jl
515  do i=1,il
516 ! set the dot product of the grid velocity and the
517 ! normal in i-direction for a moving face.
518  if (addgridvelocities) sface = sfacei(i, j, k)
519 ! compute the normal velocities of the left and right state.
520  vnp = w(i+1, j, k, ivx)*si(i, j, k, 1) + w(i+1, j, k, ivy)*si(&
521 & i, j, k, 2) + w(i+1, j, k, ivz)*si(i, j, k, 3)
522  vnm = w(i, j, k, ivx)*si(i, j, k, 1) + w(i, j, k, ivy)*si(i, j&
523 & , k, 2) + w(i, j, k, ivz)*si(i, j, k, 3)
524 ! set the values of the porosities for this face.
525 ! porvel defines the porosity w.r.t. velocity;
526 ! porflux defines the porosity w.r.t. the entire flux.
527 ! the latter is only zero for a discontinuous block
528 ! boundary that must be treated conservatively.
529 ! the default value of porflux is 0.5, such that the
530 ! correct central flux is scattered to both cells.
531 ! in case of a boundflux the normal velocity is set
532 ! to sface.
533  porvel = one
534  porflux = half
535  if (pori(i, j, k) .eq. noflux) porflux = zero
536  if (pori(i, j, k) .eq. boundflux) then
537  porvel = zero
538  vnp = sface
539  vnm = sface
540  end if
541 ! incorporate porflux in porvel.
542  porvel = porvel*porflux
543 ! compute the normal velocities relative to the grid for
544 ! the face as well as the mass fluxes.
545  qsp = (vnp-sface)*porvel
546  qsm = (vnm-sface)*porvel
547  rqsp = qsp*w(i+1, j, k, irho)
548  rqsm = qsm*w(i, j, k, irho)
549 ! compute the sum of the pressure multiplied by porflux.
550 ! for the default value of porflux, 0.5, this leads to
551 ! the average pressure.
552  pa = porflux*(p(i+1, j, k)+p(i, j, k))
553 ! compute the fluxes and scatter them to the cells
554 ! i,j,k and i+1,j,k. store the density flux in the
555 ! mass flow of the appropriate sliding mesh interface.
556  fs = rqsp + rqsm
557  dw(i+1, j, k, irho) = dw(i+1, j, k, irho) - fs
558  dw(i, j, k, irho) = dw(i, j, k, irho) + fs
559  fs = rqsp*w(i+1, j, k, ivx) + rqsm*w(i, j, k, ivx) + pa*si(i, &
560 & j, k, 1)
561  dw(i+1, j, k, imx) = dw(i+1, j, k, imx) - fs
562  dw(i, j, k, imx) = dw(i, j, k, imx) + fs
563  fs = rqsp*w(i+1, j, k, ivy) + rqsm*w(i, j, k, ivy) + pa*si(i, &
564 & j, k, 2)
565  dw(i+1, j, k, imy) = dw(i+1, j, k, imy) - fs
566  dw(i, j, k, imy) = dw(i, j, k, imy) + fs
567  fs = rqsp*w(i+1, j, k, ivz) + rqsm*w(i, j, k, ivz) + pa*si(i, &
568 & j, k, 3)
569  dw(i+1, j, k, imz) = dw(i+1, j, k, imz) - fs
570  dw(i, j, k, imz) = dw(i, j, k, imz) + fs
571  fs = qsp*w(i+1, j, k, irhoe) + qsm*w(i, j, k, irhoe) + porflux&
572 & *(vnp*p(i+1, j, k)+vnm*p(i, j, k))
573  dw(i+1, j, k, irhoe) = dw(i+1, j, k, irhoe) - fs
574  dw(i, j, k, irhoe) = dw(i, j, k, irhoe) + fs
575  end do
576  end do
577  end do
578 !$ad checkpoint-end
579 !
580 ! advective fluxes in the j-direction.
581 !
582  continue
583 !$ad checkpoint-start
584  sface = zero
585  do k=2,kl
586  do j=1,jl
587  do i=2,il
588 ! set the dot product of the grid velocity and the
589 ! normal in j-direction for a moving face.
590  if (addgridvelocities) sface = sfacej(i, j, k)
591 ! compute the normal velocities of the left and right state.
592  vnp = w(i, j+1, k, ivx)*sj(i, j, k, 1) + w(i, j+1, k, ivy)*sj(&
593 & i, j, k, 2) + w(i, j+1, k, ivz)*sj(i, j, k, 3)
594  vnm = w(i, j, k, ivx)*sj(i, j, k, 1) + w(i, j, k, ivy)*sj(i, j&
595 & , k, 2) + w(i, j, k, ivz)*sj(i, j, k, 3)
596 ! set the values of the porosities for this face.
597 ! porvel defines the porosity w.r.t. velocity;
598 ! porflux defines the porosity w.r.t. the entire flux.
599 ! the latter is only zero for a discontinuous block
600 ! boundary that must be treated conservatively.
601 ! the default value of porflux is 0.5, such that the
602 ! correct central flux is scattered to both cells.
603 ! in case of a boundflux the normal velocity is set
604 ! to sface.
605  porvel = one
606  porflux = half
607  if (porj(i, j, k) .eq. noflux) porflux = zero
608  if (porj(i, j, k) .eq. boundflux) then
609  porvel = zero
610  vnp = sface
611  vnm = sface
612  end if
613 ! incorporate porflux in porvel.
614  porvel = porvel*porflux
615 ! compute the normal velocities for the face as well as the
616 ! mass fluxes.
617  qsp = (vnp-sface)*porvel
618  qsm = (vnm-sface)*porvel
619  rqsp = qsp*w(i, j+1, k, irho)
620  rqsm = qsm*w(i, j, k, irho)
621 ! compute the sum of the pressure multiplied by porflux.
622 ! for the default value of porflux, 0.5, this leads to
623 ! the average pressure.
624  pa = porflux*(p(i, j+1, k)+p(i, j, k))
625 ! compute the fluxes and scatter them to the cells
626 ! i,j,k and i,j+1,k. store the density flux in the
627 ! mass flow of the appropriate sliding mesh interface.
628  fs = rqsp + rqsm
629  dw(i, j+1, k, irho) = dw(i, j+1, k, irho) - fs
630  dw(i, j, k, irho) = dw(i, j, k, irho) + fs
631  fs = rqsp*w(i, j+1, k, ivx) + rqsm*w(i, j, k, ivx) + pa*sj(i, &
632 & j, k, 1)
633  dw(i, j+1, k, imx) = dw(i, j+1, k, imx) - fs
634  dw(i, j, k, imx) = dw(i, j, k, imx) + fs
635  fs = rqsp*w(i, j+1, k, ivy) + rqsm*w(i, j, k, ivy) + pa*sj(i, &
636 & j, k, 2)
637  dw(i, j+1, k, imy) = dw(i, j+1, k, imy) - fs
638  dw(i, j, k, imy) = dw(i, j, k, imy) + fs
639  fs = rqsp*w(i, j+1, k, ivz) + rqsm*w(i, j, k, ivz) + pa*sj(i, &
640 & j, k, 3)
641  dw(i, j+1, k, imz) = dw(i, j+1, k, imz) - fs
642  dw(i, j, k, imz) = dw(i, j, k, imz) + fs
643  fs = qsp*w(i, j+1, k, irhoe) + qsm*w(i, j, k, irhoe) + porflux&
644 & *(vnp*p(i, j+1, k)+vnm*p(i, j, k))
645  dw(i, j+1, k, irhoe) = dw(i, j+1, k, irhoe) - fs
646  dw(i, j, k, irhoe) = dw(i, j, k, irhoe) + fs
647  end do
648  end do
649  end do
650 !$ad checkpoint-end
651 !
652 ! advective fluxes in the k-direction.
653  continue
654 !$ad checkpoint-start
655  sface = zero
656  do k=1,kl
657  do j=2,jl
658  do i=2,il
659 ! set the dot product of the grid velocity and the
660 ! normal in k-direction for a moving face.
661  if (addgridvelocities) sface = sfacek(i, j, k)
662 ! compute the normal velocities of the left and right state.
663  vnp = w(i, j, k+1, ivx)*sk(i, j, k, 1) + w(i, j, k+1, ivy)*sk(&
664 & i, j, k, 2) + w(i, j, k+1, ivz)*sk(i, j, k, 3)
665  vnm = w(i, j, k, ivx)*sk(i, j, k, 1) + w(i, j, k, ivy)*sk(i, j&
666 & , k, 2) + w(i, j, k, ivz)*sk(i, j, k, 3)
667 ! set the values of the porosities for this face.
668 ! porvel defines the porosity w.r.t. velocity;
669 ! porflux defines the porosity w.r.t. the entire flux.
670 ! the latter is only zero for a discontinuous block
671 ! block boundary that must be treated conservatively.
672 ! the default value of porflux is 0.5, such that the
673 ! correct central flux is scattered to both cells.
674 ! in case of a boundflux the normal velocity is set
675 ! to sface.
676  porvel = one
677  porflux = half
678  if (pork(i, j, k) .eq. noflux) porflux = zero
679  if (pork(i, j, k) .eq. boundflux) then
680  porvel = zero
681  vnp = sface
682  vnm = sface
683  end if
684 ! incorporate porflux in porvel.
685  porvel = porvel*porflux
686 ! compute the normal velocities for the face as well as the
687 ! mass fluxes.
688  qsp = (vnp-sface)*porvel
689  qsm = (vnm-sface)*porvel
690  rqsp = qsp*w(i, j, k+1, irho)
691  rqsm = qsm*w(i, j, k, irho)
692 ! compute the sum of the pressure multiplied by porflux.
693 ! for the default value of porflux, 0.5, this leads to
694 ! the average pressure.
695  pa = porflux*(p(i, j, k+1)+p(i, j, k))
696 ! compute the fluxes and scatter them to the cells
697 ! i,j,k and i,j,k+1. store the density flux in the
698 ! mass flow of the appropriate sliding mesh interface.
699  fs = rqsp + rqsm
700  dw(i, j, k+1, irho) = dw(i, j, k+1, irho) - fs
701  dw(i, j, k, irho) = dw(i, j, k, irho) + fs
702  fs = rqsp*w(i, j, k+1, ivx) + rqsm*w(i, j, k, ivx) + pa*sk(i, &
703 & j, k, 1)
704  dw(i, j, k+1, imx) = dw(i, j, k+1, imx) - fs
705  dw(i, j, k, imx) = dw(i, j, k, imx) + fs
706  fs = rqsp*w(i, j, k+1, ivy) + rqsm*w(i, j, k, ivy) + pa*sk(i, &
707 & j, k, 2)
708  dw(i, j, k+1, imy) = dw(i, j, k+1, imy) - fs
709  dw(i, j, k, imy) = dw(i, j, k, imy) + fs
710  fs = rqsp*w(i, j, k+1, ivz) + rqsm*w(i, j, k, ivz) + pa*sk(i, &
711 & j, k, 3)
712  dw(i, j, k+1, imz) = dw(i, j, k+1, imz) - fs
713  dw(i, j, k, imz) = dw(i, j, k, imz) + fs
714  fs = qsp*w(i, j, k+1, irhoe) + qsm*w(i, j, k, irhoe) + porflux&
715 & *(vnp*p(i, j, k+1)+vnm*p(i, j, k))
716  dw(i, j, k+1, irhoe) = dw(i, j, k+1, irhoe) - fs
717  dw(i, j, k, irhoe) = dw(i, j, k, irhoe) + fs
718  end do
719  end do
720  end do
721 !$ad checkpoint-end
722 ! add the rotational source terms for a moving block in a
723 ! steady state computation. these source terms account for the
724 ! centrifugal acceleration and the coriolis term. however, as
725 ! the the equations are solved in the inertial frame and not
726 ! in the moving frame, the form is different than what you
727 ! normally find in a text book.
728  continue
729 !$ad checkpoint-start
730  if (blockismoving .and. equationmode .eq. steady) then
731 ! compute the three nondimensional angular velocities.
732  wwx = timeref*cgnsdoms(nbkglobal)%rotrate(1)
733  wwy = timeref*cgnsdoms(nbkglobal)%rotrate(2)
734  wwz = timeref*cgnsdoms(nbkglobal)%rotrate(3)
735 !$ad ii-loop
736 ! loop over the internal cells of this block to compute the
737 ! rotational terms for the momentum equations.
738  do ii=0,nx*ny*nz-1
739  i = mod(ii, nx) + 2
740  j = mod(ii/nx, ny) + 2
741  k = ii/(nx*ny) + 2
742  rvol = w(i, j, k, irho)*vol(i, j, k)
743  dw(i, j, k, imx) = dw(i, j, k, imx) + rvol*(wwy*w(i, j, k, ivz)-&
744 & wwz*w(i, j, k, ivy))
745  dw(i, j, k, imy) = dw(i, j, k, imy) + rvol*(wwz*w(i, j, k, ivx)-&
746 & wwx*w(i, j, k, ivz))
747  dw(i, j, k, imz) = dw(i, j, k, imz) + rvol*(wwx*w(i, j, k, ivy)-&
748 & wwy*w(i, j, k, ivx))
749  end do
750  end if
751 !$ad checkpoint-end
752 
753  end subroutine inviscidcentralflux
754 
755 ! differentiation of invisciddissfluxmatrix in forward (tangent) mode (with options i4 dr8 r8):
756 ! variations of useful results: *fw
757 ! with respect to varying inputs: pinfcorr *p *sfacei *sfacej
758 ! *sfacek *w *si *sj *sk *fw
759 ! rw status of diff variables: pinfcorr:in *p:in *sfacei:in *sfacej:in
760 ! *sfacek:in *w:in *si:in *sj:in *sk:in *fw:in-out
761 ! plus diff mem management of: p:in sfacei:in sfacej:in sfacek:in
762 ! w:in si:in sj:in sk:in fw:in
764 !
765 ! invisciddissfluxmatrix computes the matrix artificial
766 ! dissipation term. instead of the spectral radius, as used in
767 ! the scalar dissipation scheme, the absolute value of the flux
768 ! jacobian is used. this leads to a less diffusive and
769 ! consequently more accurate scheme. it is assumed that the
770 ! pointers in blockpointers already point to the correct block.
771 !
772  use constants
773  use blockpointers, only : nx, ny, nz, il, jl, kl, ie, je, ke, ib, &
774 & jb, kb, w, wd, p, pd, pori, porj, pork, fw, fwd, gamma, si, sid, sj,&
778  use flowvarrefstate, only : pinfcorr, pinfcorrd
779  use inputdiscretization, only : vis2, vis4
780  use inputphysics, only : equations
781  use iteration, only : rfil
782  use cgnsgrid, only : massflowfamilydiss
783  use utils_d, only : getcorrectfork, mydim, mydim_d
784  implicit none
785 !
786 ! local parameters.
787 !
788  real(kind=realtype), parameter :: dpmax=0.25_realtype
789  real(kind=realtype), parameter :: epsacoustic=0.25_realtype
790  real(kind=realtype), parameter :: epsshear=0.025_realtype
791  real(kind=realtype), parameter :: omega=0.5_realtype
792  real(kind=realtype), parameter :: oneminomega=one-omega
793 !
794 ! local variables.
795 !
796  integer(kind=inttype) :: i, j, k, ind, ii
797  real(kind=realtype) :: plim, sface
798  real(kind=realtype) :: plimd, sfaced
799  real(kind=realtype) :: sfil, fis2, fis4
800  real(kind=realtype) :: gammaavg, gm1, ovgm1, gm53
801  real(kind=realtype) :: ppor, rrad, dis2, dis4
802  real(kind=realtype) :: rradd, dis2d, dis4d
803  real(kind=realtype) :: dp1, dp2, tmp, fs
804  real(kind=realtype) :: tmpd, fsd
805  real(kind=realtype) :: ddw1, ddw2, ddw3, ddw4, ddw5, ddw6
806  real(kind=realtype) :: ddw1d, ddw2d, ddw3d, ddw4d, ddw5d, ddw6d
807  real(kind=realtype) :: dr, dru, drv, drw, dre, drk, sx, sy, sz
808  real(kind=realtype) :: drd, drud, drvd, drwd, dred, drkd, sxd, syd, &
809 & szd
810  real(kind=realtype) :: uavg, vavg, wavg, a2avg, aavg, havg
811  real(kind=realtype) :: uavgd, vavgd, wavgd, a2avgd, aavgd, havgd
812  real(kind=realtype) :: alphaavg, unavg, ovaavg, ova2avg
813  real(kind=realtype) :: alphaavgd, unavgd, ovaavgd, ova2avgd
814  real(kind=realtype) :: kavg, lam1, lam2, lam3, area
815  real(kind=realtype) :: kavgd, lam1d, lam2d, lam3d, aread
816  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
817  real(kind=realtype) :: abv1d, abv2d, abv3d, abv4d, abv5d, abv6d, &
818 & abv7d
819  real(kind=realtype), dimension(ie, je, ke, 3) :: dss
820  real(kind=realtype), dimension(ie, je, ke, 3) :: dssd
821  logical :: correctfork
822  intrinsic abs
823  intrinsic max
824  intrinsic min
825  intrinsic sqrt
826  real(kind=realtype) :: x1
827  real(kind=realtype) :: x1d
828  real(kind=realtype) :: x2
829  real(kind=realtype) :: x2d
830  real(kind=realtype) :: x3
831  real(kind=realtype) :: x3d
832  real(kind=realtype) :: y1
833  real(kind=realtype) :: y1d
834  real(kind=realtype) :: y2
835  real(kind=realtype) :: y2d
836  real(kind=realtype) :: y3
837  real(kind=realtype) :: y3d
838  real(kind=realtype) :: abs0
839  real(kind=realtype) :: min1
840  real(kind=realtype) :: min1d
841  real(realtype) :: max1
842  real(realtype) :: max1d
843  real(kind=realtype) :: max2
844  real(kind=realtype) :: max2d
845  real(kind=realtype) :: max3
846  real(kind=realtype) :: max3d
847  real(kind=realtype) :: max4
848  real(kind=realtype) :: max4d
849  real(kind=realtype) :: min2
850  real(kind=realtype) :: min2d
851  real(realtype) :: max5
852  real(realtype) :: max5d
853  real(kind=realtype) :: max6
854  real(kind=realtype) :: max6d
855  real(kind=realtype) :: max7
856  real(kind=realtype) :: max7d
857  real(kind=realtype) :: max8
858  real(kind=realtype) :: max8d
859  real(kind=realtype) :: min3
860  real(kind=realtype) :: min3d
861  real(realtype) :: max9
862  real(realtype) :: max9d
863  real(kind=realtype) :: max10
864  real(kind=realtype) :: max10d
865  real(kind=realtype) :: max11
866  real(kind=realtype) :: max11d
867  real(kind=realtype) :: max12
868  real(kind=realtype) :: max12d
869  real(kind=realtype) :: abs1
870  real(kind=realtype) :: abs1d
871  real(kind=realtype) :: abs2
872  real(kind=realtype) :: abs2d
873  real(kind=realtype) :: abs3
874  real(kind=realtype) :: abs3d
875  real(kind=realtype) :: abs4
876  real(kind=realtype) :: abs4d
877  real(kind=realtype) :: abs5
878  real(kind=realtype) :: abs5d
879  real(kind=realtype) :: abs6
880  real(kind=realtype) :: abs6d
881  real(kind=realtype) :: arg1
882  real(kind=realtype) :: arg1d
883  real(kind=realtype) :: temp
884  real(kind=realtype) :: temp0
885  real(kind=realtype) :: temp1
886  real(kind=realtype) :: temp2
887  real(kind=realtype) :: temp3
888  if (rfil .ge. 0.) then
889  abs0 = rfil
890  else
891  abs0 = -rfil
892  end if
893 ! check if rfil == 0. if so, the dissipative flux needs not to
894 ! be computed.
895  if (abs0 .lt. thresholdreal) then
896  return
897  else
898 ! set the value of plim. to be fully consistent this must have
899 ! the dimension of a pressure. therefore a fraction of pinfcorr
900 ! is used.
901  plimd = 0.001_realtype*pinfcorrd
902  plim = 0.001_realtype*pinfcorr
903 ! determine whether or not the total energy must be corrected
904 ! for the presence of the turbulent kinetic energy.
905  correctfork = getcorrectfork()
906 ! initialize sface to zero. this value will be used if the
907 ! block is not moving.
908  sface = zero
909 ! set a couple of constants for the scheme.
910  fis2 = rfil*vis2
911  fis4 = rfil*vis4
912  sfil = one - rfil
913 ! initialize the dissipative residual to a certain times,
914 ! possibly zero, the previously stored value.
915  fwd = sfil*fwd
916  fw = sfil*fw
917  dssd = 0.0_8
918 ! compute the pressure sensor for each cell, in each direction:
919  do k=1,ke
920  do j=1,je
921  do i=1,ie
922  if (p(i+1, j, k) - p(i, j, k) .ge. 0.) then
923  abs1d = pd(i+1, j, k) - pd(i, j, k)
924  abs1 = p(i+1, j, k) - p(i, j, k)
925  else
926  abs1d = pd(i, j, k) - pd(i+1, j, k)
927  abs1 = -(p(i+1, j, k)-p(i, j, k))
928  end if
929  if (p(i, j, k) - p(i-1, j, k) .ge. 0.) then
930  abs4d = pd(i, j, k) - pd(i-1, j, k)
931  abs4 = p(i, j, k) - p(i-1, j, k)
932  else
933  abs4d = pd(i-1, j, k) - pd(i, j, k)
934  abs4 = -(p(i, j, k)-p(i-1, j, k))
935  end if
936  temp = omega*(p(i+1, j, k)+two*p(i, j, k)+p(i-1, j, k)) + &
937 & oneminomega*(abs1+abs4) + plim
938  temp0 = (p(i+1, j, k)-two*p(i, j, k)+p(i-1, j, k))/temp
939  x1d = (pd(i+1, j, k)-two*pd(i, j, k)+pd(i-1, j, k)-temp0*(&
940 & omega*(pd(i+1, j, k)+two*pd(i, j, k)+pd(i-1, j, k))+&
941 & oneminomega*(abs1d+abs4d)+plimd))/temp
942  x1 = temp0
943  if (x1 .ge. 0.) then
944  dssd(i, j, k, 1) = x1d
945  dss(i, j, k, 1) = x1
946  else
947  dssd(i, j, k, 1) = -x1d
948  dss(i, j, k, 1) = -x1
949  end if
950  if (p(i, j+1, k) - p(i, j, k) .ge. 0.) then
951  abs2d = pd(i, j+1, k) - pd(i, j, k)
952  abs2 = p(i, j+1, k) - p(i, j, k)
953  else
954  abs2d = pd(i, j, k) - pd(i, j+1, k)
955  abs2 = -(p(i, j+1, k)-p(i, j, k))
956  end if
957  if (p(i, j, k) - p(i, j-1, k) .ge. 0.) then
958  abs5d = pd(i, j, k) - pd(i, j-1, k)
959  abs5 = p(i, j, k) - p(i, j-1, k)
960  else
961  abs5d = pd(i, j-1, k) - pd(i, j, k)
962  abs5 = -(p(i, j, k)-p(i, j-1, k))
963  end if
964  temp0 = omega*(p(i, j+1, k)+two*p(i, j, k)+p(i, j-1, k)) + &
965 & oneminomega*(abs2+abs5) + plim
966  temp = (p(i, j+1, k)-two*p(i, j, k)+p(i, j-1, k))/temp0
967  x2d = (pd(i, j+1, k)-two*pd(i, j, k)+pd(i, j-1, k)-temp*(&
968 & omega*(pd(i, j+1, k)+two*pd(i, j, k)+pd(i, j-1, k))+&
969 & oneminomega*(abs2d+abs5d)+plimd))/temp0
970  x2 = temp
971  if (x2 .ge. 0.) then
972  dssd(i, j, k, 2) = x2d
973  dss(i, j, k, 2) = x2
974  else
975  dssd(i, j, k, 2) = -x2d
976  dss(i, j, k, 2) = -x2
977  end if
978  if (p(i, j, k+1) - p(i, j, k) .ge. 0.) then
979  abs3d = pd(i, j, k+1) - pd(i, j, k)
980  abs3 = p(i, j, k+1) - p(i, j, k)
981  else
982  abs3d = pd(i, j, k) - pd(i, j, k+1)
983  abs3 = -(p(i, j, k+1)-p(i, j, k))
984  end if
985  if (p(i, j, k) - p(i, j, k-1) .ge. 0.) then
986  abs6d = pd(i, j, k) - pd(i, j, k-1)
987  abs6 = p(i, j, k) - p(i, j, k-1)
988  else
989  abs6d = pd(i, j, k-1) - pd(i, j, k)
990  abs6 = -(p(i, j, k)-p(i, j, k-1))
991  end if
992  temp0 = omega*(p(i, j, k+1)+two*p(i, j, k)+p(i, j, k-1)) + &
993 & oneminomega*(abs3+abs6) + plim
994  temp = (p(i, j, k+1)-two*p(i, j, k)+p(i, j, k-1))/temp0
995  x3d = (pd(i, j, k+1)-two*pd(i, j, k)+pd(i, j, k-1)-temp*(&
996 & omega*(pd(i, j, k+1)+two*pd(i, j, k)+pd(i, j, k-1))+&
997 & oneminomega*(abs3d+abs6d)+plimd))/temp0
998  x3 = temp
999  if (x3 .ge. 0.) then
1000  dssd(i, j, k, 3) = x3d
1001  dss(i, j, k, 3) = x3
1002  else
1003  dssd(i, j, k, 3) = -x3d
1004  dss(i, j, k, 3) = -x3
1005  end if
1006  end do
1007  end do
1008  end do
1009  sfaced = 0.0_8
1010 !
1011 ! dissipative fluxes in the i-direction.
1012 !
1013  do k=2,kl
1014  do j=2,jl
1015  do i=1,il
1016 ! compute the dissipation coefficients for this face.
1017  ppor = zero
1018  if (pori(i, j, k) .eq. normalflux) ppor = one
1019  if (dss(i, j, k, 1) .lt. dss(i+1, j, k, 1)) then
1020  y1d = dssd(i+1, j, k, 1)
1021  y1 = dss(i+1, j, k, 1)
1022  else
1023  y1d = dssd(i, j, k, 1)
1024  y1 = dss(i, j, k, 1)
1025  end if
1026  if (dpmax .gt. y1) then
1027  min1d = y1d
1028  min1 = y1
1029  else
1030  min1 = dpmax
1031  min1d = 0.0_8
1032  end if
1033  dis2d = ppor*fis2*min1d
1034  dis2 = ppor*fis2*min1
1035  dis4d = mydim_d(ppor*fis4, 0.0_8, dis2, dis2d, dis4)
1036 ! construct the vector of the first and third differences
1037 ! multiplied by the appropriate constants.
1038  ddw1d = wd(i+1, j, k, irho) - wd(i, j, k, irho)
1039  ddw1 = w(i+1, j, k, irho) - w(i, j, k, irho)
1040  temp0 = w(i+2, j, k, irho) - w(i-1, j, k, irho) - three*ddw1
1041  drd = ddw1*dis2d + dis2*ddw1d - temp0*dis4d - dis4*(wd(i+2, &
1042 & j, k, irho)-wd(i-1, j, k, irho)-three*ddw1d)
1043  dr = dis2*ddw1 - dis4*temp0
1044  temp0 = w(i+1, j, k, ivx)
1045  temp = w(i+1, j, k, irho)
1046  temp1 = w(i, j, k, ivx)
1047  temp2 = w(i, j, k, irho)
1048  ddw2d = temp0*wd(i+1, j, k, irho) + temp*wd(i+1, j, k, ivx) &
1049 & - temp1*wd(i, j, k, irho) - temp2*wd(i, j, k, ivx)
1050  ddw2 = temp*temp0 - temp2*temp1
1051  temp2 = w(i-1, j, k, ivx)
1052  temp1 = w(i-1, j, k, irho)
1053  temp0 = w(i+2, j, k, ivx)
1054  temp = w(i+2, j, k, irho)
1055  temp3 = temp*temp0 - temp1*temp2 - three*ddw2
1056  drud = ddw2*dis2d + dis2*ddw2d - temp3*dis4d - dis4*(temp0*&
1057 & wd(i+2, j, k, irho)+temp*wd(i+2, j, k, ivx)-temp2*wd(i-1, &
1058 & j, k, irho)-temp1*wd(i-1, j, k, ivx)-three*ddw2d)
1059  dru = dis2*ddw2 - dis4*temp3
1060  temp3 = w(i+1, j, k, ivy)
1061  temp2 = w(i+1, j, k, irho)
1062  temp1 = w(i, j, k, ivy)
1063  temp0 = w(i, j, k, irho)
1064  ddw3d = temp3*wd(i+1, j, k, irho) + temp2*wd(i+1, j, k, ivy)&
1065 & - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, ivy)
1066  ddw3 = temp2*temp3 - temp0*temp1
1067  temp3 = w(i-1, j, k, ivy)
1068  temp2 = w(i-1, j, k, irho)
1069  temp1 = w(i+2, j, k, ivy)
1070  temp0 = w(i+2, j, k, irho)
1071  temp = temp0*temp1 - temp2*temp3 - three*ddw3
1072  drvd = ddw3*dis2d + dis2*ddw3d - temp*dis4d - dis4*(temp1*wd&
1073 & (i+2, j, k, irho)+temp0*wd(i+2, j, k, ivy)-temp3*wd(i-1, j&
1074 & , k, irho)-temp2*wd(i-1, j, k, ivy)-three*ddw3d)
1075  drv = dis2*ddw3 - dis4*temp
1076  temp3 = w(i+1, j, k, ivz)
1077  temp2 = w(i+1, j, k, irho)
1078  temp1 = w(i, j, k, ivz)
1079  temp0 = w(i, j, k, irho)
1080  ddw4d = temp3*wd(i+1, j, k, irho) + temp2*wd(i+1, j, k, ivz)&
1081 & - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, ivz)
1082  ddw4 = temp2*temp3 - temp0*temp1
1083  temp3 = w(i-1, j, k, ivz)
1084  temp2 = w(i-1, j, k, irho)
1085  temp1 = w(i+2, j, k, ivz)
1086  temp0 = w(i+2, j, k, irho)
1087  temp = temp0*temp1 - temp2*temp3 - three*ddw4
1088  drwd = ddw4*dis2d + dis2*ddw4d - temp*dis4d - dis4*(temp1*wd&
1089 & (i+2, j, k, irho)+temp0*wd(i+2, j, k, ivz)-temp3*wd(i-1, j&
1090 & , k, irho)-temp2*wd(i-1, j, k, ivz)-three*ddw4d)
1091  drw = dis2*ddw4 - dis4*temp
1092  ddw5d = wd(i+1, j, k, irhoe) - wd(i, j, k, irhoe)
1093  ddw5 = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
1094  temp3 = w(i+2, j, k, irhoe) - w(i-1, j, k, irhoe) - three*&
1095 & ddw5
1096  dred = ddw5*dis2d + dis2*ddw5d - temp3*dis4d - dis4*(wd(i+2&
1097 & , j, k, irhoe)-wd(i-1, j, k, irhoe)-three*ddw5d)
1098  dre = dis2*ddw5 - dis4*temp3
1099 ! in case a k-equation is present, compute the difference
1100 ! of rhok and store the average value of k. if not present,
1101 ! set both these values to zero, such that later on no
1102 ! decision needs to be made anymore.
1103  if (correctfork) then
1104  temp3 = w(i+1, j, k, itu1)
1105  temp2 = w(i+1, j, k, irho)
1106  temp1 = w(i, j, k, itu1)
1107  temp0 = w(i, j, k, irho)
1108  ddw6d = temp3*wd(i+1, j, k, irho) + temp2*wd(i+1, j, k, &
1109 & itu1) - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, itu1&
1110 & )
1111  ddw6 = temp2*temp3 - temp0*temp1
1112  temp3 = w(i-1, j, k, itu1)
1113  temp2 = w(i-1, j, k, irho)
1114  temp1 = w(i+2, j, k, itu1)
1115  temp0 = w(i+2, j, k, irho)
1116  temp = temp0*temp1 - temp2*temp3 - three*ddw6
1117  drkd = ddw6*dis2d + dis2*ddw6d - temp*dis4d - dis4*(temp1*&
1118 & wd(i+2, j, k, irho)+temp0*wd(i+2, j, k, itu1)-temp3*wd(i&
1119 & -1, j, k, irho)-temp2*wd(i-1, j, k, itu1)-three*ddw6d)
1120  drk = dis2*ddw6 - dis4*temp
1121  kavgd = half*(wd(i, j, k, itu1)+wd(i+1, j, k, itu1))
1122  kavg = half*(w(i, j, k, itu1)+w(i+1, j, k, itu1))
1123  else
1124  drk = zero
1125  kavg = zero
1126  kavgd = 0.0_8
1127  drkd = 0.0_8
1128  end if
1129 ! compute the average value of gamma and compute some
1130 ! expressions in which it occurs.
1131  gammaavg = half*(gamma(i+1, j, k)+gamma(i, j, k))
1132  gm1 = gammaavg - one
1133  ovgm1 = one/gm1
1134  gm53 = gammaavg - five*third
1135 ! compute the average state at the interface.
1136  uavgd = half*(wd(i+1, j, k, ivx)+wd(i, j, k, ivx))
1137  uavg = half*(w(i+1, j, k, ivx)+w(i, j, k, ivx))
1138  vavgd = half*(wd(i+1, j, k, ivy)+wd(i, j, k, ivy))
1139  vavg = half*(w(i+1, j, k, ivy)+w(i, j, k, ivy))
1140  wavgd = half*(wd(i+1, j, k, ivz)+wd(i, j, k, ivz))
1141  wavg = half*(w(i+1, j, k, ivz)+w(i, j, k, ivz))
1142  temp3 = gamma(i+1, j, k)
1143  temp2 = w(i+1, j, k, irho)
1144  temp1 = p(i+1, j, k)/temp2
1145  temp0 = w(i, j, k, irho)
1146  temp = p(i, j, k)/temp0
1147  a2avgd = half*(temp3*(pd(i+1, j, k)-temp1*wd(i+1, j, k, irho&
1148 & ))/temp2+gamma(i, j, k)*(pd(i, j, k)-temp*wd(i, j, k, irho&
1149 & ))/temp0)
1150  a2avg = half*(temp3*temp1+gamma(i, j, k)*temp)
1151  temp3 = si(i, j, k, 1)
1152  temp2 = si(i, j, k, 2)
1153  temp1 = si(i, j, k, 3)
1154  arg1d = 2*temp3*sid(i, j, k, 1) + 2*temp2*sid(i, j, k, 2) + &
1155 & 2*temp1*sid(i, j, k, 3)
1156  arg1 = temp3*temp3 + temp2*temp2 + temp1*temp1
1157  temp3 = sqrt(arg1)
1158  if (arg1 .eq. 0.0_8) then
1159  aread = 0.0_8
1160  else
1161  aread = arg1d/(2.0*temp3)
1162  end if
1163  area = temp3
1164  if (1.e-25_realtype .lt. area) then
1165  max1d = aread
1166  max1 = area
1167  else
1168  max1 = 1.e-25_realtype
1169  max1d = 0.0_8
1170  end if
1171  tmpd = -(one*max1d/max1**2)
1172  tmp = one/max1
1173  temp3 = si(i, j, k, 1)
1174  sxd = tmp*sid(i, j, k, 1) + temp3*tmpd
1175  sx = temp3*tmp
1176  temp3 = si(i, j, k, 2)
1177  syd = tmp*sid(i, j, k, 2) + temp3*tmpd
1178  sy = temp3*tmp
1179  temp3 = si(i, j, k, 3)
1180  szd = tmp*sid(i, j, k, 3) + temp3*tmpd
1181  sz = temp3*tmp
1182  alphaavgd = half*(2*uavg*uavgd+2*vavg*vavgd+2*wavg*wavgd)
1183  alphaavg = half*(uavg**2+vavg**2+wavg**2)
1184  havgd = alphaavgd + ovgm1*(a2avgd-gm53*kavgd)
1185  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
1186  temp3 = sqrt(a2avg)
1187  if (a2avg .eq. 0.0_8) then
1188  aavgd = 0.0_8
1189  else
1190  aavgd = a2avgd/(2.0*temp3)
1191  end if
1192  aavg = temp3
1193  unavgd = sx*uavgd + uavg*sxd + sy*vavgd + vavg*syd + sz*&
1194 & wavgd + wavg*szd
1195  unavg = uavg*sx + vavg*sy + wavg*sz
1196  ovaavgd = -(one*aavgd/aavg**2)
1197  ovaavg = one/aavg
1198  ova2avgd = -(one*a2avgd/a2avg**2)
1199  ova2avg = one/a2avg
1200 ! the mesh velocity if the face is moving. it must be
1201 ! divided by the area to obtain a true velocity.
1202  if (addgridvelocities) then
1203  sfaced = tmp*sfaceid(i, j, k) + sfacei(i, j, k)*tmpd
1204  sface = sfacei(i, j, k)*tmp
1205  end if
1206  if (unavg - sface + aavg .ge. 0.) then
1207  lam1d = unavgd - sfaced + aavgd
1208  lam1 = unavg - sface + aavg
1209  else
1210  lam1d = sfaced - unavgd - aavgd
1211  lam1 = -(unavg-sface+aavg)
1212  end if
1213  if (unavg - sface - aavg .ge. 0.) then
1214  lam2d = unavgd - sfaced - aavgd
1215  lam2 = unavg - sface - aavg
1216  else
1217  lam2d = sfaced - unavgd + aavgd
1218  lam2 = -(unavg-sface-aavg)
1219  end if
1220  if (unavg - sface .ge. 0.) then
1221  lam3d = unavgd - sfaced
1222  lam3 = unavg - sface
1223  else
1224  lam3d = sfaced - unavgd
1225  lam3 = -(unavg-sface)
1226  end if
1227  rradd = lam3d + aavgd
1228  rrad = lam3 + aavg
1229  if (lam1 .lt. epsacoustic*rrad) then
1230  max2d = epsacoustic*rradd
1231  max2 = epsacoustic*rrad
1232  else
1233  max2d = lam1d
1234  max2 = lam1
1235  end if
1236 ! multiply the eigenvalues by the area to obtain
1237 ! the correct values for the dissipation term.
1238  lam1d = area*max2d + max2*aread
1239  lam1 = max2*area
1240  if (lam2 .lt. epsacoustic*rrad) then
1241  max3d = epsacoustic*rradd
1242  max3 = epsacoustic*rrad
1243  else
1244  max3d = lam2d
1245  max3 = lam2
1246  end if
1247  lam2d = area*max3d + max3*aread
1248  lam2 = max3*area
1249  if (lam3 .lt. epsshear*rrad) then
1250  max4d = epsshear*rradd
1251  max4 = epsshear*rrad
1252  else
1253  max4d = lam3d
1254  max4 = lam3
1255  end if
1256  lam3d = area*max4d + max4*aread
1257  lam3 = max4*area
1258 ! some abbreviations, which occur quite often in the
1259 ! dissipation terms.
1260  abv1d = half*(lam1d+lam2d)
1261  abv1 = half*(lam1+lam2)
1262  abv2d = half*(lam1d-lam2d)
1263  abv2 = half*(lam1-lam2)
1264  abv3d = abv1d - lam3d
1265  abv3 = abv1 - lam3
1266  abv4d = gm1*(dr*alphaavgd+alphaavg*drd-dru*uavgd-uavg*drud-&
1267 & drv*vavgd-vavg*drvd+dred-drw*wavgd-wavg*drwd) - gm53*drkd
1268  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
1269 & gm53*drk
1270  abv5d = dru*sxd + sx*drud + drv*syd + sy*drvd + drw*szd + sz&
1271 & *drwd - dr*unavgd - unavg*drd
1272  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
1273  abv6d = ova2avg*(abv4*abv3d+abv3*abv4d) + abv3*abv4*ova2avgd&
1274 & + ovaavg*(abv5*abv2d+abv2*abv5d) + abv2*abv5*ovaavgd
1275  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
1276  abv7d = ovaavg*(abv4*abv2d+abv2*abv4d) + abv2*abv4*ovaavgd +&
1277 & abv5*abv3d + abv3*abv5d
1278  abv7 = abv2*abv4*ovaavg + abv3*abv5
1279 ! compute and scatter the dissipative flux.
1280 ! density.
1281  fsd = dr*lam3d + lam3*drd + abv6d
1282  fs = lam3*dr + abv6
1283  fwd(i+1, j, k, irho) = fwd(i+1, j, k, irho) + fsd
1284  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
1285  fwd(i, j, k, irho) = fwd(i, j, k, irho) - fsd
1286  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
1287 ! x-momentum.
1288  fsd = dru*lam3d + lam3*drud + abv6*uavgd + uavg*abv6d + abv7&
1289 & *sxd + sx*abv7d
1290  fs = lam3*dru + uavg*abv6 + sx*abv7
1291  fwd(i+1, j, k, imx) = fwd(i+1, j, k, imx) + fsd
1292  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
1293  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fsd
1294  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
1295 ! y-momentum.
1296  fsd = drv*lam3d + lam3*drvd + abv6*vavgd + vavg*abv6d + abv7&
1297 & *syd + sy*abv7d
1298  fs = lam3*drv + vavg*abv6 + sy*abv7
1299  fwd(i+1, j, k, imy) = fwd(i+1, j, k, imy) + fsd
1300  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
1301  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fsd
1302  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
1303 ! z-momentum.
1304  fsd = drw*lam3d + lam3*drwd + abv6*wavgd + wavg*abv6d + abv7&
1305 & *szd + sz*abv7d
1306  fs = lam3*drw + wavg*abv6 + sz*abv7
1307  fwd(i+1, j, k, imz) = fwd(i+1, j, k, imz) + fsd
1308  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
1309  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fsd
1310  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
1311 ! energy.
1312  fsd = dre*lam3d + lam3*dred + abv6*havgd + havg*abv6d + abv7&
1313 & *unavgd + unavg*abv7d
1314  fs = lam3*dre + havg*abv6 + unavg*abv7
1315  fwd(i+1, j, k, irhoe) = fwd(i+1, j, k, irhoe) + fsd
1316  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
1317  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - fsd
1318  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
1319  end do
1320  end do
1321  end do
1322 !
1323 ! dissipative fluxes in the j-direction.
1324 !
1325  do k=2,kl
1326  do j=1,jl
1327  do i=2,il
1328 ! compute the dissipation coefficients for this face.
1329  ppor = zero
1330  if (porj(i, j, k) .eq. normalflux) ppor = one
1331  if (dss(i, j, k, 2) .lt. dss(i, j+1, k, 2)) then
1332  y2d = dssd(i, j+1, k, 2)
1333  y2 = dss(i, j+1, k, 2)
1334  else
1335  y2d = dssd(i, j, k, 2)
1336  y2 = dss(i, j, k, 2)
1337  end if
1338  if (dpmax .gt. y2) then
1339  min2d = y2d
1340  min2 = y2
1341  else
1342  min2 = dpmax
1343  min2d = 0.0_8
1344  end if
1345  dis2d = ppor*fis2*min2d
1346  dis2 = ppor*fis2*min2
1347  dis4d = mydim_d(ppor*fis4, 0.0_8, dis2, dis2d, dis4)
1348 ! construct the vector of the first and third differences
1349 ! multiplied by the appropriate constants.
1350  ddw1d = wd(i, j+1, k, irho) - wd(i, j, k, irho)
1351  ddw1 = w(i, j+1, k, irho) - w(i, j, k, irho)
1352  temp3 = w(i, j+2, k, irho) - w(i, j-1, k, irho) - three*ddw1
1353  drd = ddw1*dis2d + dis2*ddw1d - temp3*dis4d - dis4*(wd(i, j+&
1354 & 2, k, irho)-wd(i, j-1, k, irho)-three*ddw1d)
1355  dr = dis2*ddw1 - dis4*temp3
1356  temp3 = w(i, j+1, k, ivx)
1357  temp2 = w(i, j+1, k, irho)
1358  temp1 = w(i, j, k, ivx)
1359  temp0 = w(i, j, k, irho)
1360  ddw2d = temp3*wd(i, j+1, k, irho) + temp2*wd(i, j+1, k, ivx)&
1361 & - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, ivx)
1362  ddw2 = temp2*temp3 - temp0*temp1
1363  temp3 = w(i, j-1, k, ivx)
1364  temp2 = w(i, j-1, k, irho)
1365  temp1 = w(i, j+2, k, ivx)
1366  temp0 = w(i, j+2, k, irho)
1367  temp = temp0*temp1 - temp2*temp3 - three*ddw2
1368  drud = ddw2*dis2d + dis2*ddw2d - temp*dis4d - dis4*(temp1*wd&
1369 & (i, j+2, k, irho)+temp0*wd(i, j+2, k, ivx)-temp3*wd(i, j-1&
1370 & , k, irho)-temp2*wd(i, j-1, k, ivx)-three*ddw2d)
1371  dru = dis2*ddw2 - dis4*temp
1372  temp3 = w(i, j+1, k, ivy)
1373  temp2 = w(i, j+1, k, irho)
1374  temp1 = w(i, j, k, ivy)
1375  temp0 = w(i, j, k, irho)
1376  ddw3d = temp3*wd(i, j+1, k, irho) + temp2*wd(i, j+1, k, ivy)&
1377 & - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, ivy)
1378  ddw3 = temp2*temp3 - temp0*temp1
1379  temp3 = w(i, j-1, k, ivy)
1380  temp2 = w(i, j-1, k, irho)
1381  temp1 = w(i, j+2, k, ivy)
1382  temp0 = w(i, j+2, k, irho)
1383  temp = temp0*temp1 - temp2*temp3 - three*ddw3
1384  drvd = ddw3*dis2d + dis2*ddw3d - temp*dis4d - dis4*(temp1*wd&
1385 & (i, j+2, k, irho)+temp0*wd(i, j+2, k, ivy)-temp3*wd(i, j-1&
1386 & , k, irho)-temp2*wd(i, j-1, k, ivy)-three*ddw3d)
1387  drv = dis2*ddw3 - dis4*temp
1388  temp3 = w(i, j+1, k, ivz)
1389  temp2 = w(i, j+1, k, irho)
1390  temp1 = w(i, j, k, ivz)
1391  temp0 = w(i, j, k, irho)
1392  ddw4d = temp3*wd(i, j+1, k, irho) + temp2*wd(i, j+1, k, ivz)&
1393 & - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, ivz)
1394  ddw4 = temp2*temp3 - temp0*temp1
1395  temp3 = w(i, j-1, k, ivz)
1396  temp2 = w(i, j-1, k, irho)
1397  temp1 = w(i, j+2, k, ivz)
1398  temp0 = w(i, j+2, k, irho)
1399  temp = temp0*temp1 - temp2*temp3 - three*ddw4
1400  drwd = ddw4*dis2d + dis2*ddw4d - temp*dis4d - dis4*(temp1*wd&
1401 & (i, j+2, k, irho)+temp0*wd(i, j+2, k, ivz)-temp3*wd(i, j-1&
1402 & , k, irho)-temp2*wd(i, j-1, k, ivz)-three*ddw4d)
1403  drw = dis2*ddw4 - dis4*temp
1404  ddw5d = wd(i, j+1, k, irhoe) - wd(i, j, k, irhoe)
1405  ddw5 = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
1406  temp3 = w(i, j+2, k, irhoe) - w(i, j-1, k, irhoe) - three*&
1407 & ddw5
1408  dred = ddw5*dis2d + dis2*ddw5d - temp3*dis4d - dis4*(wd(i, j&
1409 & +2, k, irhoe)-wd(i, j-1, k, irhoe)-three*ddw5d)
1410  dre = dis2*ddw5 - dis4*temp3
1411 ! in case a k-equation is present, compute the difference
1412 ! of rhok and store the average value of k. if not present,
1413 ! set both these values to zero, such that later on no
1414 ! decision needs to be made anymore.
1415  if (correctfork) then
1416  temp3 = w(i, j+1, k, itu1)
1417  temp2 = w(i, j+1, k, irho)
1418  temp1 = w(i, j, k, itu1)
1419  temp0 = w(i, j, k, irho)
1420  ddw6d = temp3*wd(i, j+1, k, irho) + temp2*wd(i, j+1, k, &
1421 & itu1) - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, itu1&
1422 & )
1423  ddw6 = temp2*temp3 - temp0*temp1
1424  temp3 = w(i, j-1, k, itu1)
1425  temp2 = w(i, j-1, k, irho)
1426  temp1 = w(i, j+2, k, itu1)
1427  temp0 = w(i, j+2, k, irho)
1428  temp = temp0*temp1 - temp2*temp3 - three*ddw6
1429  drkd = ddw6*dis2d + dis2*ddw6d - temp*dis4d - dis4*(temp1*&
1430 & wd(i, j+2, k, irho)+temp0*wd(i, j+2, k, itu1)-temp3*wd(i&
1431 & , j-1, k, irho)-temp2*wd(i, j-1, k, itu1)-three*ddw6d)
1432  drk = dis2*ddw6 - dis4*temp
1433  kavgd = half*(wd(i, j, k, itu1)+wd(i, j+1, k, itu1))
1434  kavg = half*(w(i, j, k, itu1)+w(i, j+1, k, itu1))
1435  else
1436  drk = zero
1437  kavg = zero
1438  kavgd = 0.0_8
1439  drkd = 0.0_8
1440  end if
1441 ! compute the average value of gamma and compute some
1442 ! expressions in which it occurs.
1443  gammaavg = half*(gamma(i, j+1, k)+gamma(i, j, k))
1444  gm1 = gammaavg - one
1445  ovgm1 = one/gm1
1446  gm53 = gammaavg - five*third
1447 ! compute the average state at the interface.
1448  uavgd = half*(wd(i, j+1, k, ivx)+wd(i, j, k, ivx))
1449  uavg = half*(w(i, j+1, k, ivx)+w(i, j, k, ivx))
1450  vavgd = half*(wd(i, j+1, k, ivy)+wd(i, j, k, ivy))
1451  vavg = half*(w(i, j+1, k, ivy)+w(i, j, k, ivy))
1452  wavgd = half*(wd(i, j+1, k, ivz)+wd(i, j, k, ivz))
1453  wavg = half*(w(i, j+1, k, ivz)+w(i, j, k, ivz))
1454  temp3 = gamma(i, j+1, k)
1455  temp2 = w(i, j+1, k, irho)
1456  temp1 = p(i, j+1, k)/temp2
1457  temp0 = w(i, j, k, irho)
1458  temp = p(i, j, k)/temp0
1459  a2avgd = half*(temp3*(pd(i, j+1, k)-temp1*wd(i, j+1, k, irho&
1460 & ))/temp2+gamma(i, j, k)*(pd(i, j, k)-temp*wd(i, j, k, irho&
1461 & ))/temp0)
1462  a2avg = half*(temp3*temp1+gamma(i, j, k)*temp)
1463  temp3 = sj(i, j, k, 1)
1464  temp2 = sj(i, j, k, 2)
1465  temp1 = sj(i, j, k, 3)
1466  arg1d = 2*temp3*sjd(i, j, k, 1) + 2*temp2*sjd(i, j, k, 2) + &
1467 & 2*temp1*sjd(i, j, k, 3)
1468  arg1 = temp3*temp3 + temp2*temp2 + temp1*temp1
1469  temp3 = sqrt(arg1)
1470  if (arg1 .eq. 0.0_8) then
1471  aread = 0.0_8
1472  else
1473  aread = arg1d/(2.0*temp3)
1474  end if
1475  area = temp3
1476  if (1.e-25_realtype .lt. area) then
1477  max5d = aread
1478  max5 = area
1479  else
1480  max5 = 1.e-25_realtype
1481  max5d = 0.0_8
1482  end if
1483  tmpd = -(one*max5d/max5**2)
1484  tmp = one/max5
1485  temp3 = sj(i, j, k, 1)
1486  sxd = tmp*sjd(i, j, k, 1) + temp3*tmpd
1487  sx = temp3*tmp
1488  temp3 = sj(i, j, k, 2)
1489  syd = tmp*sjd(i, j, k, 2) + temp3*tmpd
1490  sy = temp3*tmp
1491  temp3 = sj(i, j, k, 3)
1492  szd = tmp*sjd(i, j, k, 3) + temp3*tmpd
1493  sz = temp3*tmp
1494  alphaavgd = half*(2*uavg*uavgd+2*vavg*vavgd+2*wavg*wavgd)
1495  alphaavg = half*(uavg**2+vavg**2+wavg**2)
1496  havgd = alphaavgd + ovgm1*(a2avgd-gm53*kavgd)
1497  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
1498  temp3 = sqrt(a2avg)
1499  if (a2avg .eq. 0.0_8) then
1500  aavgd = 0.0_8
1501  else
1502  aavgd = a2avgd/(2.0*temp3)
1503  end if
1504  aavg = temp3
1505  unavgd = sx*uavgd + uavg*sxd + sy*vavgd + vavg*syd + sz*&
1506 & wavgd + wavg*szd
1507  unavg = uavg*sx + vavg*sy + wavg*sz
1508  ovaavgd = -(one*aavgd/aavg**2)
1509  ovaavg = one/aavg
1510  ova2avgd = -(one*a2avgd/a2avg**2)
1511  ova2avg = one/a2avg
1512 ! the mesh velocity if the face is moving. it must be
1513 ! divided by the area to obtain a true velocity.
1514  if (addgridvelocities) then
1515  sfaced = tmp*sfacejd(i, j, k) + sfacej(i, j, k)*tmpd
1516  sface = sfacej(i, j, k)*tmp
1517  end if
1518  if (unavg - sface + aavg .ge. 0.) then
1519  lam1d = unavgd - sfaced + aavgd
1520  lam1 = unavg - sface + aavg
1521  else
1522  lam1d = sfaced - unavgd - aavgd
1523  lam1 = -(unavg-sface+aavg)
1524  end if
1525  if (unavg - sface - aavg .ge. 0.) then
1526  lam2d = unavgd - sfaced - aavgd
1527  lam2 = unavg - sface - aavg
1528  else
1529  lam2d = sfaced - unavgd + aavgd
1530  lam2 = -(unavg-sface-aavg)
1531  end if
1532  if (unavg - sface .ge. 0.) then
1533  lam3d = unavgd - sfaced
1534  lam3 = unavg - sface
1535  else
1536  lam3d = sfaced - unavgd
1537  lam3 = -(unavg-sface)
1538  end if
1539  rradd = lam3d + aavgd
1540  rrad = lam3 + aavg
1541  if (lam1 .lt. epsacoustic*rrad) then
1542  max6d = epsacoustic*rradd
1543  max6 = epsacoustic*rrad
1544  else
1545  max6d = lam1d
1546  max6 = lam1
1547  end if
1548 ! multiply the eigenvalues by the area to obtain
1549 ! the correct values for the dissipation term.
1550  lam1d = area*max6d + max6*aread
1551  lam1 = max6*area
1552  if (lam2 .lt. epsacoustic*rrad) then
1553  max7d = epsacoustic*rradd
1554  max7 = epsacoustic*rrad
1555  else
1556  max7d = lam2d
1557  max7 = lam2
1558  end if
1559  lam2d = area*max7d + max7*aread
1560  lam2 = max7*area
1561  if (lam3 .lt. epsshear*rrad) then
1562  max8d = epsshear*rradd
1563  max8 = epsshear*rrad
1564  else
1565  max8d = lam3d
1566  max8 = lam3
1567  end if
1568  lam3d = area*max8d + max8*aread
1569  lam3 = max8*area
1570 ! some abbreviations, which occur quite often in the
1571 ! dissipation terms.
1572  abv1d = half*(lam1d+lam2d)
1573  abv1 = half*(lam1+lam2)
1574  abv2d = half*(lam1d-lam2d)
1575  abv2 = half*(lam1-lam2)
1576  abv3d = abv1d - lam3d
1577  abv3 = abv1 - lam3
1578  abv4d = gm1*(dr*alphaavgd+alphaavg*drd-dru*uavgd-uavg*drud-&
1579 & drv*vavgd-vavg*drvd+dred-drw*wavgd-wavg*drwd) - gm53*drkd
1580  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
1581 & gm53*drk
1582  abv5d = dru*sxd + sx*drud + drv*syd + sy*drvd + drw*szd + sz&
1583 & *drwd - dr*unavgd - unavg*drd
1584  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
1585  abv6d = ova2avg*(abv4*abv3d+abv3*abv4d) + abv3*abv4*ova2avgd&
1586 & + ovaavg*(abv5*abv2d+abv2*abv5d) + abv2*abv5*ovaavgd
1587  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
1588  abv7d = ovaavg*(abv4*abv2d+abv2*abv4d) + abv2*abv4*ovaavgd +&
1589 & abv5*abv3d + abv3*abv5d
1590  abv7 = abv2*abv4*ovaavg + abv3*abv5
1591 ! compute and scatter the dissipative flux.
1592 ! density.
1593  fsd = dr*lam3d + lam3*drd + abv6d
1594  fs = lam3*dr + abv6
1595  fwd(i, j+1, k, irho) = fwd(i, j+1, k, irho) + fsd
1596  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
1597  fwd(i, j, k, irho) = fwd(i, j, k, irho) - fsd
1598  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
1599 ! x-momentum.
1600  fsd = dru*lam3d + lam3*drud + abv6*uavgd + uavg*abv6d + abv7&
1601 & *sxd + sx*abv7d
1602  fs = lam3*dru + uavg*abv6 + sx*abv7
1603  fwd(i, j+1, k, imx) = fwd(i, j+1, k, imx) + fsd
1604  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
1605  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fsd
1606  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
1607 ! y-momentum.
1608  fsd = drv*lam3d + lam3*drvd + abv6*vavgd + vavg*abv6d + abv7&
1609 & *syd + sy*abv7d
1610  fs = lam3*drv + vavg*abv6 + sy*abv7
1611  fwd(i, j+1, k, imy) = fwd(i, j+1, k, imy) + fsd
1612  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
1613  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fsd
1614  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
1615 ! z-momentum.
1616  fsd = drw*lam3d + lam3*drwd + abv6*wavgd + wavg*abv6d + abv7&
1617 & *szd + sz*abv7d
1618  fs = lam3*drw + wavg*abv6 + sz*abv7
1619  fwd(i, j+1, k, imz) = fwd(i, j+1, k, imz) + fsd
1620  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
1621  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fsd
1622  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
1623 ! energy.
1624  fsd = dre*lam3d + lam3*dred + abv6*havgd + havg*abv6d + abv7&
1625 & *unavgd + unavg*abv7d
1626  fs = lam3*dre + havg*abv6 + unavg*abv7
1627  fwd(i, j+1, k, irhoe) = fwd(i, j+1, k, irhoe) + fsd
1628  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
1629  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - fsd
1630  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
1631  end do
1632  end do
1633  end do
1634 !
1635 ! dissipative fluxes in the k-direction.
1636 !
1637  do k=1,kl
1638  do j=2,jl
1639  do i=2,il
1640 ! compute the dissipation coefficients for this face.
1641  ppor = zero
1642  if (pork(i, j, k) .eq. normalflux) ppor = one
1643  if (dss(i, j, k, 3) .lt. dss(i, j, k+1, 3)) then
1644  y3d = dssd(i, j, k+1, 3)
1645  y3 = dss(i, j, k+1, 3)
1646  else
1647  y3d = dssd(i, j, k, 3)
1648  y3 = dss(i, j, k, 3)
1649  end if
1650  if (dpmax .gt. y3) then
1651  min3d = y3d
1652  min3 = y3
1653  else
1654  min3 = dpmax
1655  min3d = 0.0_8
1656  end if
1657  dis2d = ppor*fis2*min3d
1658  dis2 = ppor*fis2*min3
1659  dis4d = mydim_d(ppor*fis4, 0.0_8, dis2, dis2d, dis4)
1660 ! construct the vector of the first and third differences
1661 ! multiplied by the appropriate constants.
1662  ddw1d = wd(i, j, k+1, irho) - wd(i, j, k, irho)
1663  ddw1 = w(i, j, k+1, irho) - w(i, j, k, irho)
1664  temp3 = w(i, j, k+2, irho) - w(i, j, k-1, irho) - three*ddw1
1665  drd = ddw1*dis2d + dis2*ddw1d - temp3*dis4d - dis4*(wd(i, j&
1666 & , k+2, irho)-wd(i, j, k-1, irho)-three*ddw1d)
1667  dr = dis2*ddw1 - dis4*temp3
1668  temp3 = w(i, j, k+1, ivx)
1669  temp2 = w(i, j, k+1, irho)
1670  temp1 = w(i, j, k, ivx)
1671  temp0 = w(i, j, k, irho)
1672  ddw2d = temp3*wd(i, j, k+1, irho) + temp2*wd(i, j, k+1, ivx)&
1673 & - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, ivx)
1674  ddw2 = temp2*temp3 - temp0*temp1
1675  temp3 = w(i, j, k-1, ivx)
1676  temp2 = w(i, j, k-1, irho)
1677  temp1 = w(i, j, k+2, ivx)
1678  temp0 = w(i, j, k+2, irho)
1679  temp = temp0*temp1 - temp2*temp3 - three*ddw2
1680  drud = ddw2*dis2d + dis2*ddw2d - temp*dis4d - dis4*(temp1*wd&
1681 & (i, j, k+2, irho)+temp0*wd(i, j, k+2, ivx)-temp3*wd(i, j, &
1682 & k-1, irho)-temp2*wd(i, j, k-1, ivx)-three*ddw2d)
1683  dru = dis2*ddw2 - dis4*temp
1684  temp3 = w(i, j, k+1, ivy)
1685  temp2 = w(i, j, k+1, irho)
1686  temp1 = w(i, j, k, ivy)
1687  temp0 = w(i, j, k, irho)
1688  ddw3d = temp3*wd(i, j, k+1, irho) + temp2*wd(i, j, k+1, ivy)&
1689 & - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, ivy)
1690  ddw3 = temp2*temp3 - temp0*temp1
1691  temp3 = w(i, j, k-1, ivy)
1692  temp2 = w(i, j, k-1, irho)
1693  temp1 = w(i, j, k+2, ivy)
1694  temp0 = w(i, j, k+2, irho)
1695  temp = temp0*temp1 - temp2*temp3 - three*ddw3
1696  drvd = ddw3*dis2d + dis2*ddw3d - temp*dis4d - dis4*(temp1*wd&
1697 & (i, j, k+2, irho)+temp0*wd(i, j, k+2, ivy)-temp3*wd(i, j, &
1698 & k-1, irho)-temp2*wd(i, j, k-1, ivy)-three*ddw3d)
1699  drv = dis2*ddw3 - dis4*temp
1700  temp3 = w(i, j, k+1, ivz)
1701  temp2 = w(i, j, k+1, irho)
1702  temp1 = w(i, j, k, ivz)
1703  temp0 = w(i, j, k, irho)
1704  ddw4d = temp3*wd(i, j, k+1, irho) + temp2*wd(i, j, k+1, ivz)&
1705 & - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, ivz)
1706  ddw4 = temp2*temp3 - temp0*temp1
1707  temp3 = w(i, j, k-1, ivz)
1708  temp2 = w(i, j, k-1, irho)
1709  temp1 = w(i, j, k+2, ivz)
1710  temp0 = w(i, j, k+2, irho)
1711  temp = temp0*temp1 - temp2*temp3 - three*ddw4
1712  drwd = ddw4*dis2d + dis2*ddw4d - temp*dis4d - dis4*(temp1*wd&
1713 & (i, j, k+2, irho)+temp0*wd(i, j, k+2, ivz)-temp3*wd(i, j, &
1714 & k-1, irho)-temp2*wd(i, j, k-1, ivz)-three*ddw4d)
1715  drw = dis2*ddw4 - dis4*temp
1716  ddw5d = wd(i, j, k+1, irhoe) - wd(i, j, k, irhoe)
1717  ddw5 = w(i, j, k+1, irhoe) - w(i, j, k, irhoe)
1718  temp3 = w(i, j, k+2, irhoe) - w(i, j, k-1, irhoe) - three*&
1719 & ddw5
1720  dred = ddw5*dis2d + dis2*ddw5d - temp3*dis4d - dis4*(wd(i, j&
1721 & , k+2, irhoe)-wd(i, j, k-1, irhoe)-three*ddw5d)
1722  dre = dis2*ddw5 - dis4*temp3
1723 ! in case a k-equation is present, compute the difference
1724 ! of rhok and store the average value of k. if not present,
1725 ! set both these values to zero, such that later on no
1726 ! decision needs to be made anymore.
1727  if (correctfork) then
1728  temp3 = w(i, j, k+1, itu1)
1729  temp2 = w(i, j, k+1, irho)
1730  temp1 = w(i, j, k, itu1)
1731  temp0 = w(i, j, k, irho)
1732  ddw6d = temp3*wd(i, j, k+1, irho) + temp2*wd(i, j, k+1, &
1733 & itu1) - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, itu1&
1734 & )
1735  ddw6 = temp2*temp3 - temp0*temp1
1736  temp3 = w(i, j, k-1, itu1)
1737  temp2 = w(i, j, k-1, irho)
1738  temp1 = w(i, j, k+2, itu1)
1739  temp0 = w(i, j, k+2, irho)
1740  temp = temp0*temp1 - temp2*temp3 - three*ddw6
1741  drkd = ddw6*dis2d + dis2*ddw6d - temp*dis4d - dis4*(temp1*&
1742 & wd(i, j, k+2, irho)+temp0*wd(i, j, k+2, itu1)-temp3*wd(i&
1743 & , j, k-1, irho)-temp2*wd(i, j, k-1, itu1)-three*ddw6d)
1744  drk = dis2*ddw6 - dis4*temp
1745  kavgd = half*(wd(i, j, k+1, itu1)+wd(i, j, k, itu1))
1746  kavg = half*(w(i, j, k+1, itu1)+w(i, j, k, itu1))
1747  else
1748  drk = zero
1749  kavg = zero
1750  kavgd = 0.0_8
1751  drkd = 0.0_8
1752  end if
1753 ! compute the average value of gamma and compute some
1754 ! expressions in which it occurs.
1755  gammaavg = half*(gamma(i, j, k+1)+gamma(i, j, k))
1756  gm1 = gammaavg - one
1757  ovgm1 = one/gm1
1758  gm53 = gammaavg - five*third
1759 ! compute the average state at the interface.
1760  uavgd = half*(wd(i, j, k+1, ivx)+wd(i, j, k, ivx))
1761  uavg = half*(w(i, j, k+1, ivx)+w(i, j, k, ivx))
1762  vavgd = half*(wd(i, j, k+1, ivy)+wd(i, j, k, ivy))
1763  vavg = half*(w(i, j, k+1, ivy)+w(i, j, k, ivy))
1764  wavgd = half*(wd(i, j, k+1, ivz)+wd(i, j, k, ivz))
1765  wavg = half*(w(i, j, k+1, ivz)+w(i, j, k, ivz))
1766  temp3 = gamma(i, j, k+1)
1767  temp2 = w(i, j, k+1, irho)
1768  temp1 = p(i, j, k+1)/temp2
1769  temp0 = w(i, j, k, irho)
1770  temp = p(i, j, k)/temp0
1771  a2avgd = half*(temp3*(pd(i, j, k+1)-temp1*wd(i, j, k+1, irho&
1772 & ))/temp2+gamma(i, j, k)*(pd(i, j, k)-temp*wd(i, j, k, irho&
1773 & ))/temp0)
1774  a2avg = half*(temp3*temp1+gamma(i, j, k)*temp)
1775  temp3 = sk(i, j, k, 1)
1776  temp2 = sk(i, j, k, 2)
1777  temp1 = sk(i, j, k, 3)
1778  arg1d = 2*temp3*skd(i, j, k, 1) + 2*temp2*skd(i, j, k, 2) + &
1779 & 2*temp1*skd(i, j, k, 3)
1780  arg1 = temp3*temp3 + temp2*temp2 + temp1*temp1
1781  temp3 = sqrt(arg1)
1782  if (arg1 .eq. 0.0_8) then
1783  aread = 0.0_8
1784  else
1785  aread = arg1d/(2.0*temp3)
1786  end if
1787  area = temp3
1788  if (1.e-25_realtype .lt. area) then
1789  max9d = aread
1790  max9 = area
1791  else
1792  max9 = 1.e-25_realtype
1793  max9d = 0.0_8
1794  end if
1795  tmpd = -(one*max9d/max9**2)
1796  tmp = one/max9
1797  temp3 = sk(i, j, k, 1)
1798  sxd = tmp*skd(i, j, k, 1) + temp3*tmpd
1799  sx = temp3*tmp
1800  temp3 = sk(i, j, k, 2)
1801  syd = tmp*skd(i, j, k, 2) + temp3*tmpd
1802  sy = temp3*tmp
1803  temp3 = sk(i, j, k, 3)
1804  szd = tmp*skd(i, j, k, 3) + temp3*tmpd
1805  sz = temp3*tmp
1806  alphaavgd = half*(2*uavg*uavgd+2*vavg*vavgd+2*wavg*wavgd)
1807  alphaavg = half*(uavg**2+vavg**2+wavg**2)
1808  havgd = alphaavgd + ovgm1*(a2avgd-gm53*kavgd)
1809  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
1810  temp3 = sqrt(a2avg)
1811  if (a2avg .eq. 0.0_8) then
1812  aavgd = 0.0_8
1813  else
1814  aavgd = a2avgd/(2.0*temp3)
1815  end if
1816  aavg = temp3
1817  unavgd = sx*uavgd + uavg*sxd + sy*vavgd + vavg*syd + sz*&
1818 & wavgd + wavg*szd
1819  unavg = uavg*sx + vavg*sy + wavg*sz
1820  ovaavgd = -(one*aavgd/aavg**2)
1821  ovaavg = one/aavg
1822  ova2avgd = -(one*a2avgd/a2avg**2)
1823  ova2avg = one/a2avg
1824 ! the mesh velocity if the face is moving. it must be
1825 ! divided by the area to obtain a true velocity.
1826  if (addgridvelocities) then
1827  sfaced = tmp*sfacekd(i, j, k) + sfacek(i, j, k)*tmpd
1828  sface = sfacek(i, j, k)*tmp
1829  end if
1830  if (unavg - sface + aavg .ge. 0.) then
1831  lam1d = unavgd - sfaced + aavgd
1832  lam1 = unavg - sface + aavg
1833  else
1834  lam1d = sfaced - unavgd - aavgd
1835  lam1 = -(unavg-sface+aavg)
1836  end if
1837  if (unavg - sface - aavg .ge. 0.) then
1838  lam2d = unavgd - sfaced - aavgd
1839  lam2 = unavg - sface - aavg
1840  else
1841  lam2d = sfaced - unavgd + aavgd
1842  lam2 = -(unavg-sface-aavg)
1843  end if
1844  if (unavg - sface .ge. 0.) then
1845  lam3d = unavgd - sfaced
1846  lam3 = unavg - sface
1847  else
1848  lam3d = sfaced - unavgd
1849  lam3 = -(unavg-sface)
1850  end if
1851  rradd = lam3d + aavgd
1852  rrad = lam3 + aavg
1853  if (lam1 .lt. epsacoustic*rrad) then
1854  max10d = epsacoustic*rradd
1855  max10 = epsacoustic*rrad
1856  else
1857  max10d = lam1d
1858  max10 = lam1
1859  end if
1860 ! multiply the eigenvalues by the area to obtain
1861 ! the correct values for the dissipation term.
1862  lam1d = area*max10d + max10*aread
1863  lam1 = max10*area
1864  if (lam2 .lt. epsacoustic*rrad) then
1865  max11d = epsacoustic*rradd
1866  max11 = epsacoustic*rrad
1867  else
1868  max11d = lam2d
1869  max11 = lam2
1870  end if
1871  lam2d = area*max11d + max11*aread
1872  lam2 = max11*area
1873  if (lam3 .lt. epsshear*rrad) then
1874  max12d = epsshear*rradd
1875  max12 = epsshear*rrad
1876  else
1877  max12d = lam3d
1878  max12 = lam3
1879  end if
1880  lam3d = area*max12d + max12*aread
1881  lam3 = max12*area
1882 ! some abbreviations, which occur quite often in the
1883 ! dissipation terms.
1884  abv1d = half*(lam1d+lam2d)
1885  abv1 = half*(lam1+lam2)
1886  abv2d = half*(lam1d-lam2d)
1887  abv2 = half*(lam1-lam2)
1888  abv3d = abv1d - lam3d
1889  abv3 = abv1 - lam3
1890  abv4d = gm1*(dr*alphaavgd+alphaavg*drd-dru*uavgd-uavg*drud-&
1891 & drv*vavgd-vavg*drvd+dred-drw*wavgd-wavg*drwd) - gm53*drkd
1892  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
1893 & gm53*drk
1894  abv5d = dru*sxd + sx*drud + drv*syd + sy*drvd + drw*szd + sz&
1895 & *drwd - dr*unavgd - unavg*drd
1896  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
1897  abv6d = ova2avg*(abv4*abv3d+abv3*abv4d) + abv3*abv4*ova2avgd&
1898 & + ovaavg*(abv5*abv2d+abv2*abv5d) + abv2*abv5*ovaavgd
1899  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
1900  abv7d = ovaavg*(abv4*abv2d+abv2*abv4d) + abv2*abv4*ovaavgd +&
1901 & abv5*abv3d + abv3*abv5d
1902  abv7 = abv2*abv4*ovaavg + abv3*abv5
1903 ! compute and scatter the dissipative flux.
1904 ! density.
1905  fsd = dr*lam3d + lam3*drd + abv6d
1906  fs = lam3*dr + abv6
1907  fwd(i, j, k+1, irho) = fwd(i, j, k+1, irho) + fsd
1908  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) + fs
1909  fwd(i, j, k, irho) = fwd(i, j, k, irho) - fsd
1910  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
1911 ! x-momentum.
1912  fsd = dru*lam3d + lam3*drud + abv6*uavgd + uavg*abv6d + abv7&
1913 & *sxd + sx*abv7d
1914  fs = lam3*dru + uavg*abv6 + sx*abv7
1915  fwd(i, j, k+1, imx) = fwd(i, j, k+1, imx) + fsd
1916  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fs
1917  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fsd
1918  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
1919 ! y-momentum.
1920  fsd = drv*lam3d + lam3*drvd + abv6*vavgd + vavg*abv6d + abv7&
1921 & *syd + sy*abv7d
1922  fs = lam3*drv + vavg*abv6 + sy*abv7
1923  fwd(i, j, k+1, imy) = fwd(i, j, k+1, imy) + fsd
1924  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fs
1925  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fsd
1926  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
1927 ! z-momentum.
1928  fsd = drw*lam3d + lam3*drwd + abv6*wavgd + wavg*abv6d + abv7&
1929 & *szd + sz*abv7d
1930  fs = lam3*drw + wavg*abv6 + sz*abv7
1931  fwd(i, j, k+1, imz) = fwd(i, j, k+1, imz) + fsd
1932  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fs
1933  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fsd
1934  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
1935 ! energy.
1936  fsd = dre*lam3d + lam3*dred + abv6*havgd + havg*abv6d + abv7&
1937 & *unavgd + unavg*abv7d
1938  fs = lam3*dre + havg*abv6 + unavg*abv7
1939  fwd(i, j, k+1, irhoe) = fwd(i, j, k+1, irhoe) + fsd
1940  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + fs
1941  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - fsd
1942  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
1943  end do
1944  end do
1945  end do
1946  end if
1947  end subroutine invisciddissfluxmatrix_d
1948 
1950 !
1951 ! invisciddissfluxmatrix computes the matrix artificial
1952 ! dissipation term. instead of the spectral radius, as used in
1953 ! the scalar dissipation scheme, the absolute value of the flux
1954 ! jacobian is used. this leads to a less diffusive and
1955 ! consequently more accurate scheme. it is assumed that the
1956 ! pointers in blockpointers already point to the correct block.
1957 !
1958  use constants
1959  use blockpointers, only : nx, ny, nz, il, jl, kl, ie, je, ke, ib, &
1960 & jb, kb, w, p, pori, porj, pork, fw, gamma, si, sj, sk, indfamilyi, &
1963  use flowvarrefstate, only : pinfcorr
1964  use inputdiscretization, only : vis2, vis4
1965  use inputphysics, only : equations
1966  use iteration, only : rfil
1967  use cgnsgrid, only : massflowfamilydiss
1968  use utils_d, only : getcorrectfork, mydim
1969  implicit none
1970 !
1971 ! local parameters.
1972 !
1973  real(kind=realtype), parameter :: dpmax=0.25_realtype
1974  real(kind=realtype), parameter :: epsacoustic=0.25_realtype
1975  real(kind=realtype), parameter :: epsshear=0.025_realtype
1976  real(kind=realtype), parameter :: omega=0.5_realtype
1977  real(kind=realtype), parameter :: oneminomega=one-omega
1978 !
1979 ! local variables.
1980 !
1981  integer(kind=inttype) :: i, j, k, ind, ii
1982  real(kind=realtype) :: plim, sface
1983  real(kind=realtype) :: sfil, fis2, fis4
1984  real(kind=realtype) :: gammaavg, gm1, ovgm1, gm53
1985  real(kind=realtype) :: ppor, rrad, dis2, dis4
1986  real(kind=realtype) :: dp1, dp2, tmp, fs
1987  real(kind=realtype) :: ddw1, ddw2, ddw3, ddw4, ddw5, ddw6
1988  real(kind=realtype) :: dr, dru, drv, drw, dre, drk, sx, sy, sz
1989  real(kind=realtype) :: uavg, vavg, wavg, a2avg, aavg, havg
1990  real(kind=realtype) :: alphaavg, unavg, ovaavg, ova2avg
1991  real(kind=realtype) :: kavg, lam1, lam2, lam3, area
1992  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
1993  real(kind=realtype), dimension(ie, je, ke, 3) :: dss
1994  logical :: correctfork
1995  intrinsic abs
1996  intrinsic max
1997  intrinsic min
1998  intrinsic sqrt
1999  real(kind=realtype) :: x1
2000  real(kind=realtype) :: x2
2001  real(kind=realtype) :: x3
2002  real(kind=realtype) :: y1
2003  real(kind=realtype) :: y2
2004  real(kind=realtype) :: y3
2005  real(kind=realtype) :: abs0
2006  real(kind=realtype) :: min1
2007  real(realtype) :: max1
2008  real(kind=realtype) :: max2
2009  real(kind=realtype) :: max3
2010  real(kind=realtype) :: max4
2011  real(kind=realtype) :: min2
2012  real(realtype) :: max5
2013  real(kind=realtype) :: max6
2014  real(kind=realtype) :: max7
2015  real(kind=realtype) :: max8
2016  real(kind=realtype) :: min3
2017  real(realtype) :: max9
2018  real(kind=realtype) :: max10
2019  real(kind=realtype) :: max11
2020  real(kind=realtype) :: max12
2021  real(kind=realtype) :: abs1
2022  real(kind=realtype) :: abs2
2023  real(kind=realtype) :: abs3
2024  real(kind=realtype) :: abs4
2025  real(kind=realtype) :: abs5
2026  real(kind=realtype) :: abs6
2027  real(kind=realtype) :: arg1
2028  if (rfil .ge. 0.) then
2029  abs0 = rfil
2030  else
2031  abs0 = -rfil
2032  end if
2033 ! check if rfil == 0. if so, the dissipative flux needs not to
2034 ! be computed.
2035  if (abs0 .lt. thresholdreal) then
2036  return
2037  else
2038 ! set the value of plim. to be fully consistent this must have
2039 ! the dimension of a pressure. therefore a fraction of pinfcorr
2040 ! is used.
2041  plim = 0.001_realtype*pinfcorr
2042 ! determine whether or not the total energy must be corrected
2043 ! for the presence of the turbulent kinetic energy.
2044  correctfork = getcorrectfork()
2045 ! initialize sface to zero. this value will be used if the
2046 ! block is not moving.
2047  sface = zero
2048 ! set a couple of constants for the scheme.
2049  fis2 = rfil*vis2
2050  fis4 = rfil*vis4
2051  sfil = one - rfil
2052 ! initialize the dissipative residual to a certain times,
2053 ! possibly zero, the previously stored value.
2054  fw = sfil*fw
2055 ! compute the pressure sensor for each cell, in each direction:
2056  do k=1,ke
2057  do j=1,je
2058  do i=1,ie
2059  if (p(i+1, j, k) - p(i, j, k) .ge. 0.) then
2060  abs1 = p(i+1, j, k) - p(i, j, k)
2061  else
2062  abs1 = -(p(i+1, j, k)-p(i, j, k))
2063  end if
2064  if (p(i, j, k) - p(i-1, j, k) .ge. 0.) then
2065  abs4 = p(i, j, k) - p(i-1, j, k)
2066  else
2067  abs4 = -(p(i, j, k)-p(i-1, j, k))
2068  end if
2069  x1 = (p(i+1, j, k)-two*p(i, j, k)+p(i-1, j, k))/(omega*(p(i+&
2070 & 1, j, k)+two*p(i, j, k)+p(i-1, j, k))+oneminomega*(abs1+&
2071 & abs4)+plim)
2072  if (x1 .ge. 0.) then
2073  dss(i, j, k, 1) = x1
2074  else
2075  dss(i, j, k, 1) = -x1
2076  end if
2077  if (p(i, j+1, k) - p(i, j, k) .ge. 0.) then
2078  abs2 = p(i, j+1, k) - p(i, j, k)
2079  else
2080  abs2 = -(p(i, j+1, k)-p(i, j, k))
2081  end if
2082  if (p(i, j, k) - p(i, j-1, k) .ge. 0.) then
2083  abs5 = p(i, j, k) - p(i, j-1, k)
2084  else
2085  abs5 = -(p(i, j, k)-p(i, j-1, k))
2086  end if
2087  x2 = (p(i, j+1, k)-two*p(i, j, k)+p(i, j-1, k))/(omega*(p(i&
2088 & , j+1, k)+two*p(i, j, k)+p(i, j-1, k))+oneminomega*(abs2+&
2089 & abs5)+plim)
2090  if (x2 .ge. 0.) then
2091  dss(i, j, k, 2) = x2
2092  else
2093  dss(i, j, k, 2) = -x2
2094  end if
2095  if (p(i, j, k+1) - p(i, j, k) .ge. 0.) then
2096  abs3 = p(i, j, k+1) - p(i, j, k)
2097  else
2098  abs3 = -(p(i, j, k+1)-p(i, j, k))
2099  end if
2100  if (p(i, j, k) - p(i, j, k-1) .ge. 0.) then
2101  abs6 = p(i, j, k) - p(i, j, k-1)
2102  else
2103  abs6 = -(p(i, j, k)-p(i, j, k-1))
2104  end if
2105  x3 = (p(i, j, k+1)-two*p(i, j, k)+p(i, j, k-1))/(omega*(p(i&
2106 & , j, k+1)+two*p(i, j, k)+p(i, j, k-1))+oneminomega*(abs3+&
2107 & abs6)+plim)
2108  if (x3 .ge. 0.) then
2109  dss(i, j, k, 3) = x3
2110  else
2111  dss(i, j, k, 3) = -x3
2112  end if
2113  end do
2114  end do
2115  end do
2116 !
2117 ! dissipative fluxes in the i-direction.
2118 !
2119  do k=2,kl
2120  do j=2,jl
2121  do i=1,il
2122 ! compute the dissipation coefficients for this face.
2123  ppor = zero
2124  if (pori(i, j, k) .eq. normalflux) ppor = one
2125  if (dss(i, j, k, 1) .lt. dss(i+1, j, k, 1)) then
2126  y1 = dss(i+1, j, k, 1)
2127  else
2128  y1 = dss(i, j, k, 1)
2129  end if
2130  if (dpmax .gt. y1) then
2131  min1 = y1
2132  else
2133  min1 = dpmax
2134  end if
2135  dis2 = ppor*fis2*min1
2136  dis4 = mydim(ppor*fis4, dis2)
2137 ! construct the vector of the first and third differences
2138 ! multiplied by the appropriate constants.
2139  ddw1 = w(i+1, j, k, irho) - w(i, j, k, irho)
2140  dr = dis2*ddw1 - dis4*(w(i+2, j, k, irho)-w(i-1, j, k, irho)&
2141 & -three*ddw1)
2142  ddw2 = w(i+1, j, k, irho)*w(i+1, j, k, ivx) - w(i, j, k, &
2143 & irho)*w(i, j, k, ivx)
2144  dru = dis2*ddw2 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivx)&
2145 & -w(i-1, j, k, irho)*w(i-1, j, k, ivx)-three*ddw2)
2146  ddw3 = w(i+1, j, k, irho)*w(i+1, j, k, ivy) - w(i, j, k, &
2147 & irho)*w(i, j, k, ivy)
2148  drv = dis2*ddw3 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivy)&
2149 & -w(i-1, j, k, irho)*w(i-1, j, k, ivy)-three*ddw3)
2150  ddw4 = w(i+1, j, k, irho)*w(i+1, j, k, ivz) - w(i, j, k, &
2151 & irho)*w(i, j, k, ivz)
2152  drw = dis2*ddw4 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, ivz)&
2153 & -w(i-1, j, k, irho)*w(i-1, j, k, ivz)-three*ddw4)
2154  ddw5 = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
2155  dre = dis2*ddw5 - dis4*(w(i+2, j, k, irhoe)-w(i-1, j, k, &
2156 & irhoe)-three*ddw5)
2157 ! in case a k-equation is present, compute the difference
2158 ! of rhok and store the average value of k. if not present,
2159 ! set both these values to zero, such that later on no
2160 ! decision needs to be made anymore.
2161  if (correctfork) then
2162  ddw6 = w(i+1, j, k, irho)*w(i+1, j, k, itu1) - w(i, j, k, &
2163 & irho)*w(i, j, k, itu1)
2164  drk = dis2*ddw6 - dis4*(w(i+2, j, k, irho)*w(i+2, j, k, &
2165 & itu1)-w(i-1, j, k, irho)*w(i-1, j, k, itu1)-three*ddw6)
2166  kavg = half*(w(i, j, k, itu1)+w(i+1, j, k, itu1))
2167  else
2168  drk = zero
2169  kavg = zero
2170  end if
2171 ! compute the average value of gamma and compute some
2172 ! expressions in which it occurs.
2173  gammaavg = half*(gamma(i+1, j, k)+gamma(i, j, k))
2174  gm1 = gammaavg - one
2175  ovgm1 = one/gm1
2176  gm53 = gammaavg - five*third
2177 ! compute the average state at the interface.
2178  uavg = half*(w(i+1, j, k, ivx)+w(i, j, k, ivx))
2179  vavg = half*(w(i+1, j, k, ivy)+w(i, j, k, ivy))
2180  wavg = half*(w(i+1, j, k, ivz)+w(i, j, k, ivz))
2181  a2avg = half*(gamma(i+1, j, k)*p(i+1, j, k)/w(i+1, j, k, &
2182 & irho)+gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
2183  arg1 = si(i, j, k, 1)**2 + si(i, j, k, 2)**2 + si(i, j, k, 3&
2184 & )**2
2185  area = sqrt(arg1)
2186  if (1.e-25_realtype .lt. area) then
2187  max1 = area
2188  else
2189  max1 = 1.e-25_realtype
2190  end if
2191  tmp = one/max1
2192  sx = si(i, j, k, 1)*tmp
2193  sy = si(i, j, k, 2)*tmp
2194  sz = si(i, j, k, 3)*tmp
2195  alphaavg = half*(uavg**2+vavg**2+wavg**2)
2196  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
2197  aavg = sqrt(a2avg)
2198  unavg = uavg*sx + vavg*sy + wavg*sz
2199  ovaavg = one/aavg
2200  ova2avg = one/a2avg
2201 ! the mesh velocity if the face is moving. it must be
2202 ! divided by the area to obtain a true velocity.
2203  if (addgridvelocities) sface = sfacei(i, j, k)*tmp
2204  if (unavg - sface + aavg .ge. 0.) then
2205  lam1 = unavg - sface + aavg
2206  else
2207  lam1 = -(unavg-sface+aavg)
2208  end if
2209  if (unavg - sface - aavg .ge. 0.) then
2210  lam2 = unavg - sface - aavg
2211  else
2212  lam2 = -(unavg-sface-aavg)
2213  end if
2214  if (unavg - sface .ge. 0.) then
2215  lam3 = unavg - sface
2216  else
2217  lam3 = -(unavg-sface)
2218  end if
2219  rrad = lam3 + aavg
2220  if (lam1 .lt. epsacoustic*rrad) then
2221  max2 = epsacoustic*rrad
2222  else
2223  max2 = lam1
2224  end if
2225 ! multiply the eigenvalues by the area to obtain
2226 ! the correct values for the dissipation term.
2227  lam1 = max2*area
2228  if (lam2 .lt. epsacoustic*rrad) then
2229  max3 = epsacoustic*rrad
2230  else
2231  max3 = lam2
2232  end if
2233  lam2 = max3*area
2234  if (lam3 .lt. epsshear*rrad) then
2235  max4 = epsshear*rrad
2236  else
2237  max4 = lam3
2238  end if
2239  lam3 = max4*area
2240 ! some abbreviations, which occur quite often in the
2241 ! dissipation terms.
2242  abv1 = half*(lam1+lam2)
2243  abv2 = half*(lam1-lam2)
2244  abv3 = abv1 - lam3
2245  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
2246 & gm53*drk
2247  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
2248  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
2249  abv7 = abv2*abv4*ovaavg + abv3*abv5
2250 ! compute and scatter the dissipative flux.
2251 ! density.
2252  fs = lam3*dr + abv6
2253  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
2254  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
2255 ! x-momentum.
2256  fs = lam3*dru + uavg*abv6 + sx*abv7
2257  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
2258  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
2259 ! y-momentum.
2260  fs = lam3*drv + vavg*abv6 + sy*abv7
2261  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
2262  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
2263 ! z-momentum.
2264  fs = lam3*drw + wavg*abv6 + sz*abv7
2265  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
2266  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
2267 ! energy.
2268  fs = lam3*dre + havg*abv6 + unavg*abv7
2269  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
2270  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
2271  end do
2272  end do
2273  end do
2274 !
2275 ! dissipative fluxes in the j-direction.
2276 !
2277  do k=2,kl
2278  do j=1,jl
2279  do i=2,il
2280 ! compute the dissipation coefficients for this face.
2281  ppor = zero
2282  if (porj(i, j, k) .eq. normalflux) ppor = one
2283  if (dss(i, j, k, 2) .lt. dss(i, j+1, k, 2)) then
2284  y2 = dss(i, j+1, k, 2)
2285  else
2286  y2 = dss(i, j, k, 2)
2287  end if
2288  if (dpmax .gt. y2) then
2289  min2 = y2
2290  else
2291  min2 = dpmax
2292  end if
2293  dis2 = ppor*fis2*min2
2294  dis4 = mydim(ppor*fis4, dis2)
2295 ! construct the vector of the first and third differences
2296 ! multiplied by the appropriate constants.
2297  ddw1 = w(i, j+1, k, irho) - w(i, j, k, irho)
2298  dr = dis2*ddw1 - dis4*(w(i, j+2, k, irho)-w(i, j-1, k, irho)&
2299 & -three*ddw1)
2300  ddw2 = w(i, j+1, k, irho)*w(i, j+1, k, ivx) - w(i, j, k, &
2301 & irho)*w(i, j, k, ivx)
2302  dru = dis2*ddw2 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivx)&
2303 & -w(i, j-1, k, irho)*w(i, j-1, k, ivx)-three*ddw2)
2304  ddw3 = w(i, j+1, k, irho)*w(i, j+1, k, ivy) - w(i, j, k, &
2305 & irho)*w(i, j, k, ivy)
2306  drv = dis2*ddw3 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivy)&
2307 & -w(i, j-1, k, irho)*w(i, j-1, k, ivy)-three*ddw3)
2308  ddw4 = w(i, j+1, k, irho)*w(i, j+1, k, ivz) - w(i, j, k, &
2309 & irho)*w(i, j, k, ivz)
2310  drw = dis2*ddw4 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, ivz)&
2311 & -w(i, j-1, k, irho)*w(i, j-1, k, ivz)-three*ddw4)
2312  ddw5 = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
2313  dre = dis2*ddw5 - dis4*(w(i, j+2, k, irhoe)-w(i, j-1, k, &
2314 & irhoe)-three*ddw5)
2315 ! in case a k-equation is present, compute the difference
2316 ! of rhok and store the average value of k. if not present,
2317 ! set both these values to zero, such that later on no
2318 ! decision needs to be made anymore.
2319  if (correctfork) then
2320  ddw6 = w(i, j+1, k, irho)*w(i, j+1, k, itu1) - w(i, j, k, &
2321 & irho)*w(i, j, k, itu1)
2322  drk = dis2*ddw6 - dis4*(w(i, j+2, k, irho)*w(i, j+2, k, &
2323 & itu1)-w(i, j-1, k, irho)*w(i, j-1, k, itu1)-three*ddw6)
2324  kavg = half*(w(i, j, k, itu1)+w(i, j+1, k, itu1))
2325  else
2326  drk = zero
2327  kavg = zero
2328  end if
2329 ! compute the average value of gamma and compute some
2330 ! expressions in which it occurs.
2331  gammaavg = half*(gamma(i, j+1, k)+gamma(i, j, k))
2332  gm1 = gammaavg - one
2333  ovgm1 = one/gm1
2334  gm53 = gammaavg - five*third
2335 ! compute the average state at the interface.
2336  uavg = half*(w(i, j+1, k, ivx)+w(i, j, k, ivx))
2337  vavg = half*(w(i, j+1, k, ivy)+w(i, j, k, ivy))
2338  wavg = half*(w(i, j+1, k, ivz)+w(i, j, k, ivz))
2339  a2avg = half*(gamma(i, j+1, k)*p(i, j+1, k)/w(i, j+1, k, &
2340 & irho)+gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
2341  arg1 = sj(i, j, k, 1)**2 + sj(i, j, k, 2)**2 + sj(i, j, k, 3&
2342 & )**2
2343  area = sqrt(arg1)
2344  if (1.e-25_realtype .lt. area) then
2345  max5 = area
2346  else
2347  max5 = 1.e-25_realtype
2348  end if
2349  tmp = one/max5
2350  sx = sj(i, j, k, 1)*tmp
2351  sy = sj(i, j, k, 2)*tmp
2352  sz = sj(i, j, k, 3)*tmp
2353  alphaavg = half*(uavg**2+vavg**2+wavg**2)
2354  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
2355  aavg = sqrt(a2avg)
2356  unavg = uavg*sx + vavg*sy + wavg*sz
2357  ovaavg = one/aavg
2358  ova2avg = one/a2avg
2359 ! the mesh velocity if the face is moving. it must be
2360 ! divided by the area to obtain a true velocity.
2361  if (addgridvelocities) sface = sfacej(i, j, k)*tmp
2362  if (unavg - sface + aavg .ge. 0.) then
2363  lam1 = unavg - sface + aavg
2364  else
2365  lam1 = -(unavg-sface+aavg)
2366  end if
2367  if (unavg - sface - aavg .ge. 0.) then
2368  lam2 = unavg - sface - aavg
2369  else
2370  lam2 = -(unavg-sface-aavg)
2371  end if
2372  if (unavg - sface .ge. 0.) then
2373  lam3 = unavg - sface
2374  else
2375  lam3 = -(unavg-sface)
2376  end if
2377  rrad = lam3 + aavg
2378  if (lam1 .lt. epsacoustic*rrad) then
2379  max6 = epsacoustic*rrad
2380  else
2381  max6 = lam1
2382  end if
2383 ! multiply the eigenvalues by the area to obtain
2384 ! the correct values for the dissipation term.
2385  lam1 = max6*area
2386  if (lam2 .lt. epsacoustic*rrad) then
2387  max7 = epsacoustic*rrad
2388  else
2389  max7 = lam2
2390  end if
2391  lam2 = max7*area
2392  if (lam3 .lt. epsshear*rrad) then
2393  max8 = epsshear*rrad
2394  else
2395  max8 = lam3
2396  end if
2397  lam3 = max8*area
2398 ! some abbreviations, which occur quite often in the
2399 ! dissipation terms.
2400  abv1 = half*(lam1+lam2)
2401  abv2 = half*(lam1-lam2)
2402  abv3 = abv1 - lam3
2403  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
2404 & gm53*drk
2405  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
2406  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
2407  abv7 = abv2*abv4*ovaavg + abv3*abv5
2408 ! compute and scatter the dissipative flux.
2409 ! density.
2410  fs = lam3*dr + abv6
2411  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
2412  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
2413 ! x-momentum.
2414  fs = lam3*dru + uavg*abv6 + sx*abv7
2415  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
2416  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
2417 ! y-momentum.
2418  fs = lam3*drv + vavg*abv6 + sy*abv7
2419  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
2420  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
2421 ! z-momentum.
2422  fs = lam3*drw + wavg*abv6 + sz*abv7
2423  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
2424  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
2425 ! energy.
2426  fs = lam3*dre + havg*abv6 + unavg*abv7
2427  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
2428  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
2429  end do
2430  end do
2431  end do
2432 !
2433 ! dissipative fluxes in the k-direction.
2434 !
2435  do k=1,kl
2436  do j=2,jl
2437  do i=2,il
2438 ! compute the dissipation coefficients for this face.
2439  ppor = zero
2440  if (pork(i, j, k) .eq. normalflux) ppor = one
2441  if (dss(i, j, k, 3) .lt. dss(i, j, k+1, 3)) then
2442  y3 = dss(i, j, k+1, 3)
2443  else
2444  y3 = dss(i, j, k, 3)
2445  end if
2446  if (dpmax .gt. y3) then
2447  min3 = y3
2448  else
2449  min3 = dpmax
2450  end if
2451  dis2 = ppor*fis2*min3
2452  dis4 = mydim(ppor*fis4, dis2)
2453 ! construct the vector of the first and third differences
2454 ! multiplied by the appropriate constants.
2455  ddw1 = w(i, j, k+1, irho) - w(i, j, k, irho)
2456  dr = dis2*ddw1 - dis4*(w(i, j, k+2, irho)-w(i, j, k-1, irho)&
2457 & -three*ddw1)
2458  ddw2 = w(i, j, k+1, irho)*w(i, j, k+1, ivx) - w(i, j, k, &
2459 & irho)*w(i, j, k, ivx)
2460  dru = dis2*ddw2 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, ivx)&
2461 & -w(i, j, k-1, irho)*w(i, j, k-1, ivx)-three*ddw2)
2462  ddw3 = w(i, j, k+1, irho)*w(i, j, k+1, ivy) - w(i, j, k, &
2463 & irho)*w(i, j, k, ivy)
2464  drv = dis2*ddw3 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, ivy)&
2465 & -w(i, j, k-1, irho)*w(i, j, k-1, ivy)-three*ddw3)
2466  ddw4 = w(i, j, k+1, irho)*w(i, j, k+1, ivz) - w(i, j, k, &
2467 & irho)*w(i, j, k, ivz)
2468  drw = dis2*ddw4 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, ivz)&
2469 & -w(i, j, k-1, irho)*w(i, j, k-1, ivz)-three*ddw4)
2470  ddw5 = w(i, j, k+1, irhoe) - w(i, j, k, irhoe)
2471  dre = dis2*ddw5 - dis4*(w(i, j, k+2, irhoe)-w(i, j, k-1, &
2472 & irhoe)-three*ddw5)
2473 ! in case a k-equation is present, compute the difference
2474 ! of rhok and store the average value of k. if not present,
2475 ! set both these values to zero, such that later on no
2476 ! decision needs to be made anymore.
2477  if (correctfork) then
2478  ddw6 = w(i, j, k+1, irho)*w(i, j, k+1, itu1) - w(i, j, k, &
2479 & irho)*w(i, j, k, itu1)
2480  drk = dis2*ddw6 - dis4*(w(i, j, k+2, irho)*w(i, j, k+2, &
2481 & itu1)-w(i, j, k-1, irho)*w(i, j, k-1, itu1)-three*ddw6)
2482  kavg = half*(w(i, j, k+1, itu1)+w(i, j, k, itu1))
2483  else
2484  drk = zero
2485  kavg = zero
2486  end if
2487 ! compute the average value of gamma and compute some
2488 ! expressions in which it occurs.
2489  gammaavg = half*(gamma(i, j, k+1)+gamma(i, j, k))
2490  gm1 = gammaavg - one
2491  ovgm1 = one/gm1
2492  gm53 = gammaavg - five*third
2493 ! compute the average state at the interface.
2494  uavg = half*(w(i, j, k+1, ivx)+w(i, j, k, ivx))
2495  vavg = half*(w(i, j, k+1, ivy)+w(i, j, k, ivy))
2496  wavg = half*(w(i, j, k+1, ivz)+w(i, j, k, ivz))
2497  a2avg = half*(gamma(i, j, k+1)*p(i, j, k+1)/w(i, j, k+1, &
2498 & irho)+gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
2499  arg1 = sk(i, j, k, 1)**2 + sk(i, j, k, 2)**2 + sk(i, j, k, 3&
2500 & )**2
2501  area = sqrt(arg1)
2502  if (1.e-25_realtype .lt. area) then
2503  max9 = area
2504  else
2505  max9 = 1.e-25_realtype
2506  end if
2507  tmp = one/max9
2508  sx = sk(i, j, k, 1)*tmp
2509  sy = sk(i, j, k, 2)*tmp
2510  sz = sk(i, j, k, 3)*tmp
2511  alphaavg = half*(uavg**2+vavg**2+wavg**2)
2512  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
2513  aavg = sqrt(a2avg)
2514  unavg = uavg*sx + vavg*sy + wavg*sz
2515  ovaavg = one/aavg
2516  ova2avg = one/a2avg
2517 ! the mesh velocity if the face is moving. it must be
2518 ! divided by the area to obtain a true velocity.
2519  if (addgridvelocities) sface = sfacek(i, j, k)*tmp
2520  if (unavg - sface + aavg .ge. 0.) then
2521  lam1 = unavg - sface + aavg
2522  else
2523  lam1 = -(unavg-sface+aavg)
2524  end if
2525  if (unavg - sface - aavg .ge. 0.) then
2526  lam2 = unavg - sface - aavg
2527  else
2528  lam2 = -(unavg-sface-aavg)
2529  end if
2530  if (unavg - sface .ge. 0.) then
2531  lam3 = unavg - sface
2532  else
2533  lam3 = -(unavg-sface)
2534  end if
2535  rrad = lam3 + aavg
2536  if (lam1 .lt. epsacoustic*rrad) then
2537  max10 = epsacoustic*rrad
2538  else
2539  max10 = lam1
2540  end if
2541 ! multiply the eigenvalues by the area to obtain
2542 ! the correct values for the dissipation term.
2543  lam1 = max10*area
2544  if (lam2 .lt. epsacoustic*rrad) then
2545  max11 = epsacoustic*rrad
2546  else
2547  max11 = lam2
2548  end if
2549  lam2 = max11*area
2550  if (lam3 .lt. epsshear*rrad) then
2551  max12 = epsshear*rrad
2552  else
2553  max12 = lam3
2554  end if
2555  lam3 = max12*area
2556 ! some abbreviations, which occur quite often in the
2557 ! dissipation terms.
2558  abv1 = half*(lam1+lam2)
2559  abv2 = half*(lam1-lam2)
2560  abv3 = abv1 - lam3
2561  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
2562 & gm53*drk
2563  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
2564  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
2565  abv7 = abv2*abv4*ovaavg + abv3*abv5
2566 ! compute and scatter the dissipative flux.
2567 ! density.
2568  fs = lam3*dr + abv6
2569  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) + fs
2570  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
2571 ! x-momentum.
2572  fs = lam3*dru + uavg*abv6 + sx*abv7
2573  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fs
2574  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
2575 ! y-momentum.
2576  fs = lam3*drv + vavg*abv6 + sy*abv7
2577  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fs
2578  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
2579 ! z-momentum.
2580  fs = lam3*drw + wavg*abv6 + sz*abv7
2581  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fs
2582  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
2583 ! energy.
2584  fs = lam3*dre + havg*abv6 + unavg*abv7
2585  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + fs
2586  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
2587  end do
2588  end do
2589  end do
2590  end if
2591  end subroutine invisciddissfluxmatrix
2592 
2593 ! differentiation of invisciddissfluxscalar in forward (tangent) mode (with options i4 dr8 r8):
2594 ! variations of useful results: *fw
2595 ! with respect to varying inputs: rhoinf pinfcorr *p *w *fw *radi
2596 ! *radj *radk
2597 ! rw status of diff variables: rhoinf:in pinfcorr:in *p:in *w:in
2598 ! *fw:in-out *radi:in *radj:in *radk:in
2599 ! plus diff mem management of: p:in w:in fw:in radi:in radj:in
2600 ! radk:in
2602 !
2603 ! invisciddissfluxscalar computes the scalar artificial
2604 ! dissipation, see aiaa paper 81-1259, for a given block.
2605 ! therefore it is assumed that the pointers in blockpointers
2606 ! already point to the correct block.
2607 !
2608  use constants
2609  use blockpointers, only : nx, ny, nz, il, jl, kl, ie, je, ke, ib, &
2610 & jb, kb, w, wd, p, pd, pori, porj, pork, fw, fwd, radi, radid, radj, &
2611 & radjd, radk, radkd, gamma
2613 & rhoinfd
2614  use inputdiscretization, only : vis2, vis4
2617  use inputphysics, only : equations
2618  use iteration, only : rfil, totalr0, totalr
2619  use utils_d, only : mydim, mydim_d
2620  implicit none
2621 !
2622 ! local parameter.
2623 !
2624  real(kind=realtype), parameter :: dssmax=0.25_realtype
2625 !
2626 ! local variables.
2627 !
2628  integer(kind=inttype) :: i, j, k, ind, ii
2629  real(kind=realtype) :: sslim, rhoi
2630  real(kind=realtype) :: sslimd
2631  real(kind=realtype) :: sfil, fis2, fis4
2632  real(kind=realtype) :: ppor, rrad, dis2, dis4
2633  real(kind=realtype) :: rradd, dis2d, dis4d
2634  real(kind=realtype) :: ddw1, ddw2, ddw3, ddw4, ddw5, fs
2635  real(kind=realtype) :: ddw1d, ddw2d, ddw3d, ddw4d, ddw5d, fsd
2636  real(kind=realtype), dimension(ie, je, ke, 3) :: dss
2637  real(kind=realtype), dimension(ie, je, ke, 3) :: dssd
2638  real(kind=realtype), dimension(0:ib, 0:jb, 0:kb) :: ss
2639  real(kind=realtype), dimension(0:ib, 0:jb, 0:kb) :: ssd
2640  intrinsic abs
2641  intrinsic exp
2642  intrinsic log10
2643  intrinsic max
2644  intrinsic min
2645  real(kind=realtype) :: x1
2646  real(kind=realtype) :: x1d
2647  real(kind=realtype) :: x2
2648  real(kind=realtype) :: x2d
2649  real(kind=realtype) :: x3
2650  real(kind=realtype) :: x3d
2651  real(kind=realtype) :: y1
2652  real(kind=realtype) :: y1d
2653  real(kind=realtype) :: y2
2654  real(kind=realtype) :: y2d
2655  real(kind=realtype) :: y3
2656  real(kind=realtype) :: y3d
2657  real(kind=realtype) :: abs0
2658  real(kind=realtype) :: min1
2659  real(kind=realtype) :: min1d
2660  real(kind=realtype) :: min2
2661  real(kind=realtype) :: min2d
2662  real(kind=realtype) :: min3
2663  real(kind=realtype) :: min3d
2664  real(kind=realtype) :: arg1
2665  real(kind=realtype) :: temp
2666  real(kind=realtype) :: tempd
2667  real(kind=realtype) :: temp0
2668  real(kind=realtype) :: temp1
2669  real(kind=realtype) :: temp2
2670  real(kind=realtype) :: tempd0
2671  real(kind=realtype) :: temp3
2672  if (rfil .ge. 0.) then
2673  abs0 = rfil
2674  else
2675  abs0 = -rfil
2676  end if
2677 ! check if rfil == 0. if so, the dissipative flux needs not to
2678 ! be computed.
2679  if (abs0 .lt. thresholdreal) then
2680  return
2681  else
2682 ! determine the variables used to compute the switch.
2683 ! for the inviscid case this is the pressure; for the viscous
2684 ! case it is the entropy.
2685  select case (equations)
2686  case (eulerequations)
2687 ! inviscid case. pressure switch is based on the pressure.
2688 ! also set the value of sslim. to be fully consistent this
2689 ! must have the dimension of pressure and it is therefore
2690 ! set to a fraction of the free stream value.
2691  sslimd = 0.001_realtype*pinfcorrd
2692  sslim = 0.001_realtype*pinfcorr
2693 ! copy the pressure in ss. only need the entries used in the
2694 ! discretization, i.e. not including the corner halo's, but we'll
2695 ! just copy all anyway.
2696  ssd = pd
2697  ss = p
2698 !===============================================================
2699  dssd = 0.0_8
2700  case (nsequations, ransequations)
2701 ! viscous case. pressure switch is based on the entropy.
2702 ! also set the value of sslim. to be fully consistent this
2703 ! must have the dimension of entropy and it is therefore
2704 ! set to a fraction of the free stream value.
2705  temp = rhoinf**gammainf
2706  if (rhoinf .le. 0.0_8 .and. (gammainf .eq. 0.0_8 .or. gammainf &
2707 & .ne. int(gammainf))) then
2708  tempd = 0.0_8
2709  else
2710  tempd = gammainf*rhoinf**(gammainf-1)*rhoinfd
2711  end if
2712  sslimd = 0.001_realtype*(pinfcorrd-pinfcorr*tempd/temp)/temp
2713  sslim = 0.001_realtype*(pinfcorr/temp)
2714  ssd = 0.0_8
2715 ! store the entropy in ss. see above.
2716  do k=0,kb
2717  do j=0,jb
2718  do i=0,ib
2719  temp = gamma(i, j, k)
2720  temp0 = w(i, j, k, irho)
2721  temp1 = temp0**temp
2722  temp2 = p(i, j, k)/temp1
2723  if (temp0 .le. 0.0_8 .and. (temp .eq. 0.0_8 .or. temp .ne.&
2724 & int(temp))) then
2725  tempd0 = 0.0_8
2726  else
2727  tempd0 = temp*temp0**(temp-1)*wd(i, j, k, irho)
2728  end if
2729  ssd(i, j, k) = (pd(i, j, k)-temp2*tempd0)/temp1
2730  ss(i, j, k) = temp2
2731  end do
2732  end do
2733  end do
2734  dssd = 0.0_8
2735  case default
2736  sslimd = 0.0_8
2737  ssd = 0.0_8
2738  dssd = 0.0_8
2739  end select
2740 ! compute the pressure sensor for each cell, in each direction:
2741  do k=1,ke
2742  do j=1,je
2743  do i=1,ie
2744  temp2 = ss(i+1, j, k) + two*ss(i, j, k) + ss(i-1, j, k) + &
2745 & sslim
2746  temp1 = (ss(i+1, j, k)-two*ss(i, j, k)+ss(i-1, j, k))/temp2
2747  x1d = (ssd(i+1, j, k)-two*ssd(i, j, k)+ssd(i-1, j, k)-temp1*&
2748 & (ssd(i+1, j, k)+two*ssd(i, j, k)+ssd(i-1, j, k)+sslimd))/&
2749 & temp2
2750  x1 = temp1
2751  if (x1 .ge. 0.) then
2752  dssd(i, j, k, 1) = x1d
2753  dss(i, j, k, 1) = x1
2754  else
2755  dssd(i, j, k, 1) = -x1d
2756  dss(i, j, k, 1) = -x1
2757  end if
2758  temp2 = ss(i, j+1, k) + two*ss(i, j, k) + ss(i, j-1, k) + &
2759 & sslim
2760  temp1 = (ss(i, j+1, k)-two*ss(i, j, k)+ss(i, j-1, k))/temp2
2761  x2d = (ssd(i, j+1, k)-two*ssd(i, j, k)+ssd(i, j-1, k)-temp1*&
2762 & (ssd(i, j+1, k)+two*ssd(i, j, k)+ssd(i, j-1, k)+sslimd))/&
2763 & temp2
2764  x2 = temp1
2765  if (x2 .ge. 0.) then
2766  dssd(i, j, k, 2) = x2d
2767  dss(i, j, k, 2) = x2
2768  else
2769  dssd(i, j, k, 2) = -x2d
2770  dss(i, j, k, 2) = -x2
2771  end if
2772  temp2 = ss(i, j, k+1) + two*ss(i, j, k) + ss(i, j, k-1) + &
2773 & sslim
2774  temp1 = (ss(i, j, k+1)-two*ss(i, j, k)+ss(i, j, k-1))/temp2
2775  x3d = (ssd(i, j, k+1)-two*ssd(i, j, k)+ssd(i, j, k-1)-temp1*&
2776 & (ssd(i, j, k+1)+two*ssd(i, j, k)+ssd(i, j, k-1)+sslimd))/&
2777 & temp2
2778  x3 = temp1
2779  if (x3 .ge. 0.) then
2780  dssd(i, j, k, 3) = x3d
2781  dss(i, j, k, 3) = x3
2782  else
2783  dssd(i, j, k, 3) = -x3d
2784  dss(i, j, k, 3) = -x3
2785  end if
2786  end do
2787  end do
2788  end do
2789 ! set the dissipation constants for the scheme.
2790 ! rfil and sfil are fractions used by the runge-kutta solver to compute residuals at intermediate steps.
2791 ! this means that fis2 and fis4 will be some fraction of vis2 and vis4, respectively.
2792 ! for other solvers, rfil==1, sfil==0, fis2==vis2, and fis4==vis4.
2793 ! the sigmoid function used for dissipation-based continuation is described in eq. 28 and eq. 29 from the paper:
2794 ! "improving the performance of a compressible rans solver for low and high mach number flows" (seraj2022c).
2795 ! the options documentation also has information on the parameters in this formulation.
2796  if (usedisscontinuation) then
2797  if (totalr .eq. zero .or. totalr0 .eq. zero) then
2798  fis2 = rfil*(vis2+disscontmagnitude/(1+exp(-(disscontsharpness&
2799 & *disscontmidpoint))))
2800  else
2801  arg1 = -(disscontsharpness*(log10(totalr/totalr0)+&
2802 & disscontmidpoint))
2803  fis2 = rfil*(vis2+disscontmagnitude/(1+exp(arg1)))
2804  end if
2805  else
2806  fis2 = rfil*vis2
2807  end if
2808  fis4 = rfil*vis4
2809  sfil = one - rfil
2810 ! initialize the dissipative residual to a certain times,
2811 ! possibly zero, the previously stored value. owned cells
2812 ! only, because the halo values do not matter.
2813  fwd = sfil*fwd
2814  fw = sfil*fw
2815 !
2816 ! dissipative fluxes in the i-direction.
2817 !
2818  do k=2,kl
2819  do j=2,jl
2820  do i=1,il
2821 ! compute the dissipation coefficients for this face.
2822  ppor = zero
2823  if (pori(i, j, k) .eq. normalflux) ppor = half
2824  rradd = ppor*(radid(i, j, k)+radid(i+1, j, k))
2825  rrad = ppor*(radi(i, j, k)+radi(i+1, j, k))
2826  if (dss(i, j, k, 1) .lt. dss(i+1, j, k, 1)) then
2827  y1d = dssd(i+1, j, k, 1)
2828  y1 = dss(i+1, j, k, 1)
2829  else
2830  y1d = dssd(i, j, k, 1)
2831  y1 = dss(i, j, k, 1)
2832  end if
2833  if (dssmax .gt. y1) then
2834  min1d = y1d
2835  min1 = y1
2836  else
2837  min1 = dssmax
2838  min1d = 0.0_8
2839  end if
2840  dis2d = fis2*(min1*rradd+rrad*min1d)
2841  dis2 = fis2*rrad*min1
2842  dis4d = mydim_d(fis4*rrad, fis4*rradd, dis2, dis2d, dis4)
2843 ! compute and scatter the dissipative flux.
2844 ! density. store it in the mass flow of the
2845 ! appropriate sliding mesh interface.
2846  ddw1d = wd(i+1, j, k, irho) - wd(i, j, k, irho)
2847  ddw1 = w(i+1, j, k, irho) - w(i, j, k, irho)
2848  temp2 = w(i+2, j, k, irho) - w(i-1, j, k, irho) - three*ddw1
2849  fsd = ddw1*dis2d + dis2*ddw1d - temp2*dis4d - dis4*(wd(i+2, &
2850 & j, k, irho)-wd(i-1, j, k, irho)-three*ddw1d)
2851  fs = dis2*ddw1 - dis4*temp2
2852  fwd(i+1, j, k, irho) = fwd(i+1, j, k, irho) + fsd
2853  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
2854  fwd(i, j, k, irho) = fwd(i, j, k, irho) - fsd
2855  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
2856 ! x-momentum.
2857  temp2 = w(i+1, j, k, irho)
2858  temp1 = w(i+1, j, k, ivx)
2859  temp0 = w(i, j, k, irho)
2860  temp = w(i, j, k, ivx)
2861  ddw2d = temp2*wd(i+1, j, k, ivx) + temp1*wd(i+1, j, k, irho)&
2862 & - temp0*wd(i, j, k, ivx) - temp*wd(i, j, k, irho)
2863  ddw2 = temp1*temp2 - temp*temp0
2864  temp2 = w(i-1, j, k, irho)
2865  temp1 = w(i-1, j, k, ivx)
2866  temp0 = w(i+2, j, k, irho)
2867  temp = w(i+2, j, k, ivx)
2868  temp3 = temp*temp0 - temp1*temp2 - three*ddw2
2869  fsd = ddw2*dis2d + dis2*ddw2d - temp3*dis4d - dis4*(temp0*wd&
2870 & (i+2, j, k, ivx)+temp*wd(i+2, j, k, irho)-temp2*wd(i-1, j&
2871 & , k, ivx)-temp1*wd(i-1, j, k, irho)-three*ddw2d)
2872  fs = dis2*ddw2 - dis4*temp3
2873  fwd(i+1, j, k, imx) = fwd(i+1, j, k, imx) + fsd
2874  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
2875  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fsd
2876  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
2877 ! y-momentum.
2878  temp3 = w(i+1, j, k, irho)
2879  temp2 = w(i+1, j, k, ivy)
2880  temp1 = w(i, j, k, irho)
2881  temp0 = w(i, j, k, ivy)
2882  ddw3d = temp3*wd(i+1, j, k, ivy) + temp2*wd(i+1, j, k, irho)&
2883 & - temp1*wd(i, j, k, ivy) - temp0*wd(i, j, k, irho)
2884  ddw3 = temp2*temp3 - temp0*temp1
2885  temp3 = w(i-1, j, k, irho)
2886  temp2 = w(i-1, j, k, ivy)
2887  temp1 = w(i+2, j, k, irho)
2888  temp0 = w(i+2, j, k, ivy)
2889  temp = temp0*temp1 - temp2*temp3 - three*ddw3
2890  fsd = ddw3*dis2d + dis2*ddw3d - temp*dis4d - dis4*(temp1*wd(&
2891 & i+2, j, k, ivy)+temp0*wd(i+2, j, k, irho)-temp3*wd(i-1, j&
2892 & , k, ivy)-temp2*wd(i-1, j, k, irho)-three*ddw3d)
2893  fs = dis2*ddw3 - dis4*temp
2894  fwd(i+1, j, k, imy) = fwd(i+1, j, k, imy) + fsd
2895  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
2896  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fsd
2897  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
2898 ! z-momentum.
2899  temp3 = w(i+1, j, k, irho)
2900  temp2 = w(i+1, j, k, ivz)
2901  temp1 = w(i, j, k, irho)
2902  temp0 = w(i, j, k, ivz)
2903  ddw4d = temp3*wd(i+1, j, k, ivz) + temp2*wd(i+1, j, k, irho)&
2904 & - temp1*wd(i, j, k, ivz) - temp0*wd(i, j, k, irho)
2905  ddw4 = temp2*temp3 - temp0*temp1
2906  temp3 = w(i-1, j, k, irho)
2907  temp2 = w(i-1, j, k, ivz)
2908  temp1 = w(i+2, j, k, irho)
2909  temp0 = w(i+2, j, k, ivz)
2910  temp = temp0*temp1 - temp2*temp3 - three*ddw4
2911  fsd = ddw4*dis2d + dis2*ddw4d - temp*dis4d - dis4*(temp1*wd(&
2912 & i+2, j, k, ivz)+temp0*wd(i+2, j, k, irho)-temp3*wd(i-1, j&
2913 & , k, ivz)-temp2*wd(i-1, j, k, irho)-three*ddw4d)
2914  fs = dis2*ddw4 - dis4*temp
2915  fwd(i+1, j, k, imz) = fwd(i+1, j, k, imz) + fsd
2916  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
2917  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fsd
2918  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
2919 ! energy.
2920  ddw5d = wd(i+1, j, k, irhoe) + pd(i+1, j, k) - wd(i, j, k, &
2921 & irhoe) - pd(i, j, k)
2922  ddw5 = w(i+1, j, k, irhoe) + p(i+1, j, k) - (w(i, j, k, &
2923 & irhoe)+p(i, j, k))
2924  temp3 = w(i+2, j, k, irhoe) + p(i+2, j, k) - w(i-1, j, k, &
2925 & irhoe) - p(i-1, j, k) - three*ddw5
2926  fsd = ddw5*dis2d + dis2*ddw5d - temp3*dis4d - dis4*(wd(i+2, &
2927 & j, k, irhoe)+pd(i+2, j, k)-wd(i-1, j, k, irhoe)-pd(i-1, j&
2928 & , k)-three*ddw5d)
2929  fs = dis2*ddw5 - dis4*temp3
2930  fwd(i+1, j, k, irhoe) = fwd(i+1, j, k, irhoe) + fsd
2931  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
2932  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - fsd
2933  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
2934  end do
2935  end do
2936  end do
2937 !
2938 ! dissipative fluxes in the j-direction.
2939 !
2940  do k=2,kl
2941  do j=1,jl
2942  do i=2,il
2943 ! compute the dissipation coefficients for this face.
2944  ppor = zero
2945  if (porj(i, j, k) .eq. normalflux) ppor = half
2946  rradd = ppor*(radjd(i, j, k)+radjd(i, j+1, k))
2947  rrad = ppor*(radj(i, j, k)+radj(i, j+1, k))
2948  if (dss(i, j, k, 2) .lt. dss(i, j+1, k, 2)) then
2949  y2d = dssd(i, j+1, k, 2)
2950  y2 = dss(i, j+1, k, 2)
2951  else
2952  y2d = dssd(i, j, k, 2)
2953  y2 = dss(i, j, k, 2)
2954  end if
2955  if (dssmax .gt. y2) then
2956  min2d = y2d
2957  min2 = y2
2958  else
2959  min2 = dssmax
2960  min2d = 0.0_8
2961  end if
2962  dis2d = fis2*(min2*rradd+rrad*min2d)
2963  dis2 = fis2*rrad*min2
2964  dis4d = mydim_d(fis4*rrad, fis4*rradd, dis2, dis2d, dis4)
2965 ! compute and scatter the dissipative flux.
2966 ! density. store it in the mass flow of the
2967 ! appropriate sliding mesh interface.
2968  ddw1d = wd(i, j+1, k, irho) - wd(i, j, k, irho)
2969  ddw1 = w(i, j+1, k, irho) - w(i, j, k, irho)
2970  temp3 = w(i, j+2, k, irho) - w(i, j-1, k, irho) - three*ddw1
2971  fsd = ddw1*dis2d + dis2*ddw1d - temp3*dis4d - dis4*(wd(i, j+&
2972 & 2, k, irho)-wd(i, j-1, k, irho)-three*ddw1d)
2973  fs = dis2*ddw1 - dis4*temp3
2974  fwd(i, j+1, k, irho) = fwd(i, j+1, k, irho) + fsd
2975  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
2976  fwd(i, j, k, irho) = fwd(i, j, k, irho) - fsd
2977  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
2978 ! x-momentum.
2979  temp3 = w(i, j+1, k, irho)
2980  temp2 = w(i, j+1, k, ivx)
2981  temp1 = w(i, j, k, irho)
2982  temp0 = w(i, j, k, ivx)
2983  ddw2d = temp3*wd(i, j+1, k, ivx) + temp2*wd(i, j+1, k, irho)&
2984 & - temp1*wd(i, j, k, ivx) - temp0*wd(i, j, k, irho)
2985  ddw2 = temp2*temp3 - temp0*temp1
2986  temp3 = w(i, j-1, k, irho)
2987  temp2 = w(i, j-1, k, ivx)
2988  temp1 = w(i, j+2, k, irho)
2989  temp0 = w(i, j+2, k, ivx)
2990  temp = temp0*temp1 - temp2*temp3 - three*ddw2
2991  fsd = ddw2*dis2d + dis2*ddw2d - temp*dis4d - dis4*(temp1*wd(&
2992 & i, j+2, k, ivx)+temp0*wd(i, j+2, k, irho)-temp3*wd(i, j-1&
2993 & , k, ivx)-temp2*wd(i, j-1, k, irho)-three*ddw2d)
2994  fs = dis2*ddw2 - dis4*temp
2995  fwd(i, j+1, k, imx) = fwd(i, j+1, k, imx) + fsd
2996  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
2997  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fsd
2998  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
2999 ! y-momentum.
3000  temp3 = w(i, j+1, k, irho)
3001  temp2 = w(i, j+1, k, ivy)
3002  temp1 = w(i, j, k, irho)
3003  temp0 = w(i, j, k, ivy)
3004  ddw3d = temp3*wd(i, j+1, k, ivy) + temp2*wd(i, j+1, k, irho)&
3005 & - temp1*wd(i, j, k, ivy) - temp0*wd(i, j, k, irho)
3006  ddw3 = temp2*temp3 - temp0*temp1
3007  temp3 = w(i, j-1, k, irho)
3008  temp2 = w(i, j-1, k, ivy)
3009  temp1 = w(i, j+2, k, irho)
3010  temp0 = w(i, j+2, k, ivy)
3011  temp = temp0*temp1 - temp2*temp3 - three*ddw3
3012  fsd = ddw3*dis2d + dis2*ddw3d - temp*dis4d - dis4*(temp1*wd(&
3013 & i, j+2, k, ivy)+temp0*wd(i, j+2, k, irho)-temp3*wd(i, j-1&
3014 & , k, ivy)-temp2*wd(i, j-1, k, irho)-three*ddw3d)
3015  fs = dis2*ddw3 - dis4*temp
3016  fwd(i, j+1, k, imy) = fwd(i, j+1, k, imy) + fsd
3017  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
3018  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fsd
3019  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
3020 ! z-momentum.
3021  temp3 = w(i, j+1, k, irho)
3022  temp2 = w(i, j+1, k, ivz)
3023  temp1 = w(i, j, k, irho)
3024  temp0 = w(i, j, k, ivz)
3025  ddw4d = temp3*wd(i, j+1, k, ivz) + temp2*wd(i, j+1, k, irho)&
3026 & - temp1*wd(i, j, k, ivz) - temp0*wd(i, j, k, irho)
3027  ddw4 = temp2*temp3 - temp0*temp1
3028  temp3 = w(i, j-1, k, irho)
3029  temp2 = w(i, j-1, k, ivz)
3030  temp1 = w(i, j+2, k, irho)
3031  temp0 = w(i, j+2, k, ivz)
3032  temp = temp0*temp1 - temp2*temp3 - three*ddw4
3033  fsd = ddw4*dis2d + dis2*ddw4d - temp*dis4d - dis4*(temp1*wd(&
3034 & i, j+2, k, ivz)+temp0*wd(i, j+2, k, irho)-temp3*wd(i, j-1&
3035 & , k, ivz)-temp2*wd(i, j-1, k, irho)-three*ddw4d)
3036  fs = dis2*ddw4 - dis4*temp
3037  fwd(i, j+1, k, imz) = fwd(i, j+1, k, imz) + fsd
3038  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
3039  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fsd
3040  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
3041 ! energy.
3042  ddw5d = wd(i, j+1, k, irhoe) + pd(i, j+1, k) - wd(i, j, k, &
3043 & irhoe) - pd(i, j, k)
3044  ddw5 = w(i, j+1, k, irhoe) + p(i, j+1, k) - (w(i, j, k, &
3045 & irhoe)+p(i, j, k))
3046  temp3 = w(i, j+2, k, irhoe) + p(i, j+2, k) - w(i, j-1, k, &
3047 & irhoe) - p(i, j-1, k) - three*ddw5
3048  fsd = ddw5*dis2d + dis2*ddw5d - temp3*dis4d - dis4*(wd(i, j+&
3049 & 2, k, irhoe)+pd(i, j+2, k)-wd(i, j-1, k, irhoe)-pd(i, j-1&
3050 & , k)-three*ddw5d)
3051  fs = dis2*ddw5 - dis4*temp3
3052  fwd(i, j+1, k, irhoe) = fwd(i, j+1, k, irhoe) + fsd
3053  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
3054  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - fsd
3055  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
3056  end do
3057  end do
3058  end do
3059 !
3060 ! dissipative fluxes in the k-direction.
3061 !
3062  do k=1,kl
3063  do j=2,jl
3064  do i=2,il
3065 ! compute the dissipation coefficients for this face.
3066  ppor = zero
3067  if (pork(i, j, k) .eq. normalflux) ppor = half
3068  rradd = ppor*(radkd(i, j, k)+radkd(i, j, k+1))
3069  rrad = ppor*(radk(i, j, k)+radk(i, j, k+1))
3070  if (dss(i, j, k, 3) .lt. dss(i, j, k+1, 3)) then
3071  y3d = dssd(i, j, k+1, 3)
3072  y3 = dss(i, j, k+1, 3)
3073  else
3074  y3d = dssd(i, j, k, 3)
3075  y3 = dss(i, j, k, 3)
3076  end if
3077  if (dssmax .gt. y3) then
3078  min3d = y3d
3079  min3 = y3
3080  else
3081  min3 = dssmax
3082  min3d = 0.0_8
3083  end if
3084  dis2d = fis2*(min3*rradd+rrad*min3d)
3085  dis2 = fis2*rrad*min3
3086  dis4d = mydim_d(fis4*rrad, fis4*rradd, dis2, dis2d, dis4)
3087 ! compute and scatter the dissipative flux.
3088 ! density. store it in the mass flow of the
3089 ! appropriate sliding mesh interface.
3090  ddw1d = wd(i, j, k+1, irho) - wd(i, j, k, irho)
3091  ddw1 = w(i, j, k+1, irho) - w(i, j, k, irho)
3092  temp3 = w(i, j, k+2, irho) - w(i, j, k-1, irho) - three*ddw1
3093  fsd = ddw1*dis2d + dis2*ddw1d - temp3*dis4d - dis4*(wd(i, j&
3094 & , k+2, irho)-wd(i, j, k-1, irho)-three*ddw1d)
3095  fs = dis2*ddw1 - dis4*temp3
3096  fwd(i, j, k+1, irho) = fwd(i, j, k+1, irho) + fsd
3097  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) + fs
3098  fwd(i, j, k, irho) = fwd(i, j, k, irho) - fsd
3099  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
3100 ! x-momentum.
3101  temp3 = w(i, j, k+1, irho)
3102  temp2 = w(i, j, k+1, ivx)
3103  temp1 = w(i, j, k, irho)
3104  temp0 = w(i, j, k, ivx)
3105  ddw2d = temp3*wd(i, j, k+1, ivx) + temp2*wd(i, j, k+1, irho)&
3106 & - temp1*wd(i, j, k, ivx) - temp0*wd(i, j, k, irho)
3107  ddw2 = temp2*temp3 - temp0*temp1
3108  temp3 = w(i, j, k-1, irho)
3109  temp2 = w(i, j, k-1, ivx)
3110  temp1 = w(i, j, k+2, irho)
3111  temp0 = w(i, j, k+2, ivx)
3112  temp = temp0*temp1 - temp2*temp3 - three*ddw2
3113  fsd = ddw2*dis2d + dis2*ddw2d - temp*dis4d - dis4*(temp1*wd(&
3114 & i, j, k+2, ivx)+temp0*wd(i, j, k+2, irho)-temp3*wd(i, j, k&
3115 & -1, ivx)-temp2*wd(i, j, k-1, irho)-three*ddw2d)
3116  fs = dis2*ddw2 - dis4*temp
3117  fwd(i, j, k+1, imx) = fwd(i, j, k+1, imx) + fsd
3118  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fs
3119  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fsd
3120  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
3121 ! y-momentum.
3122  temp3 = w(i, j, k+1, irho)
3123  temp2 = w(i, j, k+1, ivy)
3124  temp1 = w(i, j, k, irho)
3125  temp0 = w(i, j, k, ivy)
3126  ddw3d = temp3*wd(i, j, k+1, ivy) + temp2*wd(i, j, k+1, irho)&
3127 & - temp1*wd(i, j, k, ivy) - temp0*wd(i, j, k, irho)
3128  ddw3 = temp2*temp3 - temp0*temp1
3129  temp3 = w(i, j, k-1, irho)
3130  temp2 = w(i, j, k-1, ivy)
3131  temp1 = w(i, j, k+2, irho)
3132  temp0 = w(i, j, k+2, ivy)
3133  temp = temp0*temp1 - temp2*temp3 - three*ddw3
3134  fsd = ddw3*dis2d + dis2*ddw3d - temp*dis4d - dis4*(temp1*wd(&
3135 & i, j, k+2, ivy)+temp0*wd(i, j, k+2, irho)-temp3*wd(i, j, k&
3136 & -1, ivy)-temp2*wd(i, j, k-1, irho)-three*ddw3d)
3137  fs = dis2*ddw3 - dis4*temp
3138  fwd(i, j, k+1, imy) = fwd(i, j, k+1, imy) + fsd
3139  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fs
3140  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fsd
3141  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
3142 ! z-momentum.
3143  temp3 = w(i, j, k+1, irho)
3144  temp2 = w(i, j, k+1, ivz)
3145  temp1 = w(i, j, k, irho)
3146  temp0 = w(i, j, k, ivz)
3147  ddw4d = temp3*wd(i, j, k+1, ivz) + temp2*wd(i, j, k+1, irho)&
3148 & - temp1*wd(i, j, k, ivz) - temp0*wd(i, j, k, irho)
3149  ddw4 = temp2*temp3 - temp0*temp1
3150  temp3 = w(i, j, k-1, irho)
3151  temp2 = w(i, j, k-1, ivz)
3152  temp1 = w(i, j, k+2, irho)
3153  temp0 = w(i, j, k+2, ivz)
3154  temp = temp0*temp1 - temp2*temp3 - three*ddw4
3155  fsd = ddw4*dis2d + dis2*ddw4d - temp*dis4d - dis4*(temp1*wd(&
3156 & i, j, k+2, ivz)+temp0*wd(i, j, k+2, irho)-temp3*wd(i, j, k&
3157 & -1, ivz)-temp2*wd(i, j, k-1, irho)-three*ddw4d)
3158  fs = dis2*ddw4 - dis4*temp
3159  fwd(i, j, k+1, imz) = fwd(i, j, k+1, imz) + fsd
3160  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fs
3161  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fsd
3162  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
3163 ! energy.
3164  ddw5d = wd(i, j, k+1, irhoe) + pd(i, j, k+1) - wd(i, j, k, &
3165 & irhoe) - pd(i, j, k)
3166  ddw5 = w(i, j, k+1, irhoe) + p(i, j, k+1) - (w(i, j, k, &
3167 & irhoe)+p(i, j, k))
3168  temp3 = w(i, j, k+2, irhoe) + p(i, j, k+2) - w(i, j, k-1, &
3169 & irhoe) - p(i, j, k-1) - three*ddw5
3170  fsd = ddw5*dis2d + dis2*ddw5d - temp3*dis4d - dis4*(wd(i, j&
3171 & , k+2, irhoe)+pd(i, j, k+2)-wd(i, j, k-1, irhoe)-pd(i, j, &
3172 & k-1)-three*ddw5d)
3173  fs = dis2*ddw5 - dis4*temp3
3174  fwd(i, j, k+1, irhoe) = fwd(i, j, k+1, irhoe) + fsd
3175  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + fs
3176  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - fsd
3177  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
3178  end do
3179  end do
3180  end do
3181  end if
3182  end subroutine invisciddissfluxscalar_d
3183 
3185 !
3186 ! invisciddissfluxscalar computes the scalar artificial
3187 ! dissipation, see aiaa paper 81-1259, for a given block.
3188 ! therefore it is assumed that the pointers in blockpointers
3189 ! already point to the correct block.
3190 !
3191  use constants
3192  use blockpointers, only : nx, ny, nz, il, jl, kl, ie, je, ke, ib, &
3193 & jb, kb, w, p, pori, porj, pork, fw, radi, radj, radk, gamma
3194  use flowvarrefstate, only : gammainf, pinfcorr, rhoinf
3195  use inputdiscretization, only : vis2, vis4
3198  use inputphysics, only : equations
3199  use iteration, only : rfil, totalr0, totalr
3200  use utils_d, only : mydim
3201  implicit none
3202 !
3203 ! local parameter.
3204 !
3205  real(kind=realtype), parameter :: dssmax=0.25_realtype
3206 !
3207 ! local variables.
3208 !
3209  integer(kind=inttype) :: i, j, k, ind, ii
3210  real(kind=realtype) :: sslim, rhoi
3211  real(kind=realtype) :: sfil, fis2, fis4
3212  real(kind=realtype) :: ppor, rrad, dis2, dis4
3213  real(kind=realtype) :: ddw1, ddw2, ddw3, ddw4, ddw5, fs
3214  real(kind=realtype), dimension(ie, je, ke, 3) :: dss
3215  real(kind=realtype), dimension(0:ib, 0:jb, 0:kb) :: ss
3216  intrinsic abs
3217  intrinsic exp
3218  intrinsic log10
3219  intrinsic max
3220  intrinsic min
3221  real(kind=realtype) :: x1
3222  real(kind=realtype) :: x2
3223  real(kind=realtype) :: x3
3224  real(kind=realtype) :: y1
3225  real(kind=realtype) :: y2
3226  real(kind=realtype) :: y3
3227  real(kind=realtype) :: abs0
3228  real(kind=realtype) :: min1
3229  real(kind=realtype) :: min2
3230  real(kind=realtype) :: min3
3231  real(kind=realtype) :: arg1
3232  if (rfil .ge. 0.) then
3233  abs0 = rfil
3234  else
3235  abs0 = -rfil
3236  end if
3237 ! check if rfil == 0. if so, the dissipative flux needs not to
3238 ! be computed.
3239  if (abs0 .lt. thresholdreal) then
3240  return
3241  else
3242 ! determine the variables used to compute the switch.
3243 ! for the inviscid case this is the pressure; for the viscous
3244 ! case it is the entropy.
3245  select case (equations)
3246  case (eulerequations)
3247 ! inviscid case. pressure switch is based on the pressure.
3248 ! also set the value of sslim. to be fully consistent this
3249 ! must have the dimension of pressure and it is therefore
3250 ! set to a fraction of the free stream value.
3251  sslim = 0.001_realtype*pinfcorr
3252 ! copy the pressure in ss. only need the entries used in the
3253 ! discretization, i.e. not including the corner halo's, but we'll
3254 ! just copy all anyway.
3255  ss = p
3256 !===============================================================
3257  case (nsequations, ransequations)
3258 ! viscous case. pressure switch is based on the entropy.
3259 ! also set the value of sslim. to be fully consistent this
3260 ! must have the dimension of entropy and it is therefore
3261 ! set to a fraction of the free stream value.
3262  sslim = 0.001_realtype*pinfcorr/rhoinf**gammainf
3263 ! store the entropy in ss. see above.
3264  do k=0,kb
3265  do j=0,jb
3266  do i=0,ib
3267  ss(i, j, k) = p(i, j, k)/w(i, j, k, irho)**gamma(i, j, k)
3268  end do
3269  end do
3270  end do
3271  end select
3272 ! compute the pressure sensor for each cell, in each direction:
3273  do k=1,ke
3274  do j=1,je
3275  do i=1,ie
3276  x1 = (ss(i+1, j, k)-two*ss(i, j, k)+ss(i-1, j, k))/(ss(i+1, &
3277 & j, k)+two*ss(i, j, k)+ss(i-1, j, k)+sslim)
3278  if (x1 .ge. 0.) then
3279  dss(i, j, k, 1) = x1
3280  else
3281  dss(i, j, k, 1) = -x1
3282  end if
3283  x2 = (ss(i, j+1, k)-two*ss(i, j, k)+ss(i, j-1, k))/(ss(i, j+&
3284 & 1, k)+two*ss(i, j, k)+ss(i, j-1, k)+sslim)
3285  if (x2 .ge. 0.) then
3286  dss(i, j, k, 2) = x2
3287  else
3288  dss(i, j, k, 2) = -x2
3289  end if
3290  x3 = (ss(i, j, k+1)-two*ss(i, j, k)+ss(i, j, k-1))/(ss(i, j&
3291 & , k+1)+two*ss(i, j, k)+ss(i, j, k-1)+sslim)
3292  if (x3 .ge. 0.) then
3293  dss(i, j, k, 3) = x3
3294  else
3295  dss(i, j, k, 3) = -x3
3296  end if
3297  end do
3298  end do
3299  end do
3300 ! set the dissipation constants for the scheme.
3301 ! rfil and sfil are fractions used by the runge-kutta solver to compute residuals at intermediate steps.
3302 ! this means that fis2 and fis4 will be some fraction of vis2 and vis4, respectively.
3303 ! for other solvers, rfil==1, sfil==0, fis2==vis2, and fis4==vis4.
3304 ! the sigmoid function used for dissipation-based continuation is described in eq. 28 and eq. 29 from the paper:
3305 ! "improving the performance of a compressible rans solver for low and high mach number flows" (seraj2022c).
3306 ! the options documentation also has information on the parameters in this formulation.
3307  if (usedisscontinuation) then
3308  if (totalr .eq. zero .or. totalr0 .eq. zero) then
3309  fis2 = rfil*(vis2+disscontmagnitude/(1+exp(-(disscontsharpness&
3310 & *disscontmidpoint))))
3311  else
3312  arg1 = -(disscontsharpness*(log10(totalr/totalr0)+&
3313 & disscontmidpoint))
3314  fis2 = rfil*(vis2+disscontmagnitude/(1+exp(arg1)))
3315  end if
3316  else
3317  fis2 = rfil*vis2
3318  end if
3319  fis4 = rfil*vis4
3320  sfil = one - rfil
3321 ! initialize the dissipative residual to a certain times,
3322 ! possibly zero, the previously stored value. owned cells
3323 ! only, because the halo values do not matter.
3324  fw = sfil*fw
3325 !
3326 ! dissipative fluxes in the i-direction.
3327 !
3328  do k=2,kl
3329  do j=2,jl
3330  do i=1,il
3331 ! compute the dissipation coefficients for this face.
3332  ppor = zero
3333  if (pori(i, j, k) .eq. normalflux) ppor = half
3334  rrad = ppor*(radi(i, j, k)+radi(i+1, j, k))
3335  if (dss(i, j, k, 1) .lt. dss(i+1, j, k, 1)) then
3336  y1 = dss(i+1, j, k, 1)
3337  else
3338  y1 = dss(i, j, k, 1)
3339  end if
3340  if (dssmax .gt. y1) then
3341  min1 = y1
3342  else
3343  min1 = dssmax
3344  end if
3345  dis2 = fis2*rrad*min1
3346  dis4 = mydim(fis4*rrad, dis2)
3347 ! compute and scatter the dissipative flux.
3348 ! density. store it in the mass flow of the
3349 ! appropriate sliding mesh interface.
3350  ddw1 = w(i+1, j, k, irho) - w(i, j, k, irho)
3351  fs = dis2*ddw1 - dis4*(w(i+2, j, k, irho)-w(i-1, j, k, irho)&
3352 & -three*ddw1)
3353  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
3354  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
3355 ! x-momentum.
3356  ddw2 = w(i+1, j, k, ivx)*w(i+1, j, k, irho) - w(i, j, k, ivx&
3357 & )*w(i, j, k, irho)
3358  fs = dis2*ddw2 - dis4*(w(i+2, j, k, ivx)*w(i+2, j, k, irho)-&
3359 & w(i-1, j, k, ivx)*w(i-1, j, k, irho)-three*ddw2)
3360  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
3361  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
3362 ! y-momentum.
3363  ddw3 = w(i+1, j, k, ivy)*w(i+1, j, k, irho) - w(i, j, k, ivy&
3364 & )*w(i, j, k, irho)
3365  fs = dis2*ddw3 - dis4*(w(i+2, j, k, ivy)*w(i+2, j, k, irho)-&
3366 & w(i-1, j, k, ivy)*w(i-1, j, k, irho)-three*ddw3)
3367  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
3368  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
3369 ! z-momentum.
3370  ddw4 = w(i+1, j, k, ivz)*w(i+1, j, k, irho) - w(i, j, k, ivz&
3371 & )*w(i, j, k, irho)
3372  fs = dis2*ddw4 - dis4*(w(i+2, j, k, ivz)*w(i+2, j, k, irho)-&
3373 & w(i-1, j, k, ivz)*w(i-1, j, k, irho)-three*ddw4)
3374  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
3375  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
3376 ! energy.
3377  ddw5 = w(i+1, j, k, irhoe) + p(i+1, j, k) - (w(i, j, k, &
3378 & irhoe)+p(i, j, k))
3379  fs = dis2*ddw5 - dis4*(w(i+2, j, k, irhoe)+p(i+2, j, k)-(w(i&
3380 & -1, j, k, irhoe)+p(i-1, j, k))-three*ddw5)
3381  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
3382  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
3383  end do
3384  end do
3385  end do
3386 !
3387 ! dissipative fluxes in the j-direction.
3388 !
3389  do k=2,kl
3390  do j=1,jl
3391  do i=2,il
3392 ! compute the dissipation coefficients for this face.
3393  ppor = zero
3394  if (porj(i, j, k) .eq. normalflux) ppor = half
3395  rrad = ppor*(radj(i, j, k)+radj(i, j+1, k))
3396  if (dss(i, j, k, 2) .lt. dss(i, j+1, k, 2)) then
3397  y2 = dss(i, j+1, k, 2)
3398  else
3399  y2 = dss(i, j, k, 2)
3400  end if
3401  if (dssmax .gt. y2) then
3402  min2 = y2
3403  else
3404  min2 = dssmax
3405  end if
3406  dis2 = fis2*rrad*min2
3407  dis4 = mydim(fis4*rrad, dis2)
3408 ! compute and scatter the dissipative flux.
3409 ! density. store it in the mass flow of the
3410 ! appropriate sliding mesh interface.
3411  ddw1 = w(i, j+1, k, irho) - w(i, j, k, irho)
3412  fs = dis2*ddw1 - dis4*(w(i, j+2, k, irho)-w(i, j-1, k, irho)&
3413 & -three*ddw1)
3414  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
3415  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
3416 ! x-momentum.
3417  ddw2 = w(i, j+1, k, ivx)*w(i, j+1, k, irho) - w(i, j, k, ivx&
3418 & )*w(i, j, k, irho)
3419  fs = dis2*ddw2 - dis4*(w(i, j+2, k, ivx)*w(i, j+2, k, irho)-&
3420 & w(i, j-1, k, ivx)*w(i, j-1, k, irho)-three*ddw2)
3421  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
3422  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
3423 ! y-momentum.
3424  ddw3 = w(i, j+1, k, ivy)*w(i, j+1, k, irho) - w(i, j, k, ivy&
3425 & )*w(i, j, k, irho)
3426  fs = dis2*ddw3 - dis4*(w(i, j+2, k, ivy)*w(i, j+2, k, irho)-&
3427 & w(i, j-1, k, ivy)*w(i, j-1, k, irho)-three*ddw3)
3428  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
3429  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
3430 ! z-momentum.
3431  ddw4 = w(i, j+1, k, ivz)*w(i, j+1, k, irho) - w(i, j, k, ivz&
3432 & )*w(i, j, k, irho)
3433  fs = dis2*ddw4 - dis4*(w(i, j+2, k, ivz)*w(i, j+2, k, irho)-&
3434 & w(i, j-1, k, ivz)*w(i, j-1, k, irho)-three*ddw4)
3435  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
3436  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
3437 ! energy.
3438  ddw5 = w(i, j+1, k, irhoe) + p(i, j+1, k) - (w(i, j, k, &
3439 & irhoe)+p(i, j, k))
3440  fs = dis2*ddw5 - dis4*(w(i, j+2, k, irhoe)+p(i, j+2, k)-(w(i&
3441 & , j-1, k, irhoe)+p(i, j-1, k))-three*ddw5)
3442  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
3443  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
3444  end do
3445  end do
3446  end do
3447 !
3448 ! dissipative fluxes in the k-direction.
3449 !
3450  do k=1,kl
3451  do j=2,jl
3452  do i=2,il
3453 ! compute the dissipation coefficients for this face.
3454  ppor = zero
3455  if (pork(i, j, k) .eq. normalflux) ppor = half
3456  rrad = ppor*(radk(i, j, k)+radk(i, j, k+1))
3457  if (dss(i, j, k, 3) .lt. dss(i, j, k+1, 3)) then
3458  y3 = dss(i, j, k+1, 3)
3459  else
3460  y3 = dss(i, j, k, 3)
3461  end if
3462  if (dssmax .gt. y3) then
3463  min3 = y3
3464  else
3465  min3 = dssmax
3466  end if
3467  dis2 = fis2*rrad*min3
3468  dis4 = mydim(fis4*rrad, dis2)
3469 ! compute and scatter the dissipative flux.
3470 ! density. store it in the mass flow of the
3471 ! appropriate sliding mesh interface.
3472  ddw1 = w(i, j, k+1, irho) - w(i, j, k, irho)
3473  fs = dis2*ddw1 - dis4*(w(i, j, k+2, irho)-w(i, j, k-1, irho)&
3474 & -three*ddw1)
3475  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) + fs
3476  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
3477 ! x-momentum.
3478  ddw2 = w(i, j, k+1, ivx)*w(i, j, k+1, irho) - w(i, j, k, ivx&
3479 & )*w(i, j, k, irho)
3480  fs = dis2*ddw2 - dis4*(w(i, j, k+2, ivx)*w(i, j, k+2, irho)-&
3481 & w(i, j, k-1, ivx)*w(i, j, k-1, irho)-three*ddw2)
3482  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fs
3483  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
3484 ! y-momentum.
3485  ddw3 = w(i, j, k+1, ivy)*w(i, j, k+1, irho) - w(i, j, k, ivy&
3486 & )*w(i, j, k, irho)
3487  fs = dis2*ddw3 - dis4*(w(i, j, k+2, ivy)*w(i, j, k+2, irho)-&
3488 & w(i, j, k-1, ivy)*w(i, j, k-1, irho)-three*ddw3)
3489  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fs
3490  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
3491 ! z-momentum.
3492  ddw4 = w(i, j, k+1, ivz)*w(i, j, k+1, irho) - w(i, j, k, ivz&
3493 & )*w(i, j, k, irho)
3494  fs = dis2*ddw4 - dis4*(w(i, j, k+2, ivz)*w(i, j, k+2, irho)-&
3495 & w(i, j, k-1, ivz)*w(i, j, k-1, irho)-three*ddw4)
3496  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fs
3497  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
3498 ! energy.
3499  ddw5 = w(i, j, k+1, irhoe) + p(i, j, k+1) - (w(i, j, k, &
3500 & irhoe)+p(i, j, k))
3501  fs = dis2*ddw5 - dis4*(w(i, j, k+2, irhoe)+p(i, j, k+2)-(w(i&
3502 & , j, k-1, irhoe)+p(i, j, k-1))-three*ddw5)
3503  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + fs
3504  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
3505  end do
3506  end do
3507  end do
3508  end if
3509  end subroutine invisciddissfluxscalar
3510 
3511 ! differentiation of inviscidupwindflux in forward (tangent) mode (with options i4 dr8 r8):
3512 ! variations of useful results: *fw
3513 ! with respect to varying inputs: *p *sfacei *sfacej *sfacek
3514 ! *w *si *sj *sk *fw
3515 ! rw status of diff variables: *p:in *sfacei:in *sfacej:in *sfacek:in
3516 ! *w:in *si:in *sj:in *sk:in *fw:in-out
3517 ! plus diff mem management of: p:in sfacei:in sfacej:in sfacek:in
3518 ! w:in si:in sj:in sk:in fw:in
3519  subroutine inviscidupwindflux_d(finegrid)
3520 !
3521 ! inviscidupwindflux computes the artificial dissipation part of
3522 ! the euler fluxes by means of an approximate solution of the 1d
3523 ! riemann problem on the face. for first order schemes,
3524 ! finegrid == .false., the states in the cells are assumed to
3525 ! be constant; for the second order schemes on the fine grid a
3526 ! nonlinear reconstruction of the left and right state is done
3527 ! for which several options exist.
3528 ! it is assumed that the pointers in blockpointers already
3529 ! point to the correct block.
3530 !
3531  use constants
3532  use blockpointers, only : il, jl, kl, ie, je, ke, ib, jb, kb, w, &
3533 & wd, p, pd, pori, porj, pork, fw, fwd, gamma, si, sid, sj, sjd, sk, &
3537 & factfamilyk
3538  use flowvarrefstate, only : kpresent, nw, nwf, rgas, rgasd, tref, &
3539 & trefd
3542  use inputphysics, only : equations
3543  use iteration, only : rfil, currentlevel, groundlevel
3544  use cgnsgrid, only : massflowfamilydiss
3545  use utils_d, only : getcorrectfork, terminate
3546  use flowutils_d, only : etot, etot_d
3547  implicit none
3548 !
3549 ! subroutine arguments.
3550 !
3551  logical, intent(in) :: finegrid
3552 !
3553 ! local variables.
3554 !
3555  integer(kind=portype) :: por
3556  integer(kind=inttype) :: nwint
3557  integer(kind=inttype) :: i, j, k, ind
3558  integer(kind=inttype) :: limused, riemannused
3559  real(kind=realtype) :: sx, sy, sz, omk, opk, sfil, gammaface
3560  real(kind=realtype) :: sxd, syd, szd
3561  real(kind=realtype) :: factminmod, sface
3562  real(kind=realtype) :: sfaced
3563  real(kind=realtype), dimension(nw) :: left, right
3564  real(kind=realtype), dimension(nw) :: leftd, rightd
3565  real(kind=realtype), dimension(nw) :: du1, du2, du3
3566  real(kind=realtype), dimension(nw) :: du1d, du2d, du3d
3567  real(kind=realtype), dimension(nwf) :: flux
3568  real(kind=realtype), dimension(nwf) :: fluxd
3569  logical :: firstorderk, correctfork, rotationalperiodic
3570  intrinsic abs
3571  intrinsic associated
3572  intrinsic max
3573  real(kind=realtype) :: abs0
3574  real(realtype) :: max1
3575  if (rfil .ge. 0.) then
3576  abs0 = rfil
3577  else
3578  abs0 = -rfil
3579  end if
3580 !
3581 ! check if rfil == 0. if so, the dissipative flux needs not to
3582 ! be computed.
3583  if (abs0 .lt. thresholdreal) then
3584  return
3585  else
3586 ! check if the formulation for rotational periodic problems
3587 ! must be used.
3588  if (associated(rotmatrixi)) then
3589  rotationalperiodic = .true.
3590  else
3591  rotationalperiodic = .false.
3592  end if
3593 ! initialize the dissipative residual to a certain times,
3594 ! possibly zero, the previously stored value. owned cells
3595 ! only, because the halo values do not matter.
3596  sfil = one - rfil
3597  do k=2,kl
3598  do j=2,jl
3599  do i=2,il
3600  fwd(i, j, k, irho) = sfil*fwd(i, j, k, irho)
3601  fw(i, j, k, irho) = sfil*fw(i, j, k, irho)
3602  fwd(i, j, k, imx) = sfil*fwd(i, j, k, imx)
3603  fw(i, j, k, imx) = sfil*fw(i, j, k, imx)
3604  fwd(i, j, k, imy) = sfil*fwd(i, j, k, imy)
3605  fw(i, j, k, imy) = sfil*fw(i, j, k, imy)
3606  fwd(i, j, k, imz) = sfil*fwd(i, j, k, imz)
3607  fw(i, j, k, imz) = sfil*fw(i, j, k, imz)
3608  fwd(i, j, k, irhoe) = sfil*fwd(i, j, k, irhoe)
3609  fw(i, j, k, irhoe) = sfil*fw(i, j, k, irhoe)
3610  end do
3611  end do
3612  end do
3613 ! determine whether or not the total energy must be corrected
3614 ! for the presence of the turbulent kinetic energy.
3615  correctfork = getcorrectfork()
3616  if (1.e-10_realtype .lt. one - kappacoef) then
3617  max1 = one - kappacoef
3618  else
3619  max1 = 1.e-10_realtype
3620  end if
3621 ! compute the factor used in the minmod limiter.
3622  factminmod = (three-kappacoef)/max1
3623 ! determine the limiter scheme to be used. on the fine grid the
3624 ! user specified scheme is used; on the coarse grid a first order
3625 ! scheme is computed.
3626  limused = firstorder
3627  if (finegrid) limused = limiter
3628 ! lumped diss is true for doing approx pc
3629  if (lumpeddiss) limused = firstorder
3630 ! determine the riemann solver which must be used.
3631  riemannused = riemanncoarse
3632  if (finegrid) riemannused = riemann
3633 ! store 1-kappa and 1+kappa a bit easier and multiply it by 0.25.
3634  omk = fourth*(one-kappacoef)
3635  opk = fourth*(one+kappacoef)
3636 ! initialize sface to zero. this value will be used if the
3637 ! block is not moving.
3638  sface = zero
3639 ! set the number of variables to be interpolated depending
3640 ! whether or not a k-equation is present. if a k-equation is
3641 ! present also set the logical firstorderk. this indicates
3642 ! whether or not only a first order approximation is to be used
3643 ! for the turbulent kinetic energy.
3644  if (correctfork) then
3645  if (orderturb .eq. firstorder) then
3646  nwint = nwf
3647  firstorderk = .true.
3648  else
3649  nwint = itu1
3650  firstorderk = .false.
3651  end if
3652  else
3653  nwint = nwf
3654  firstorderk = .false.
3655  end if
3656 !
3657 ! flux computation. a distinction is made between first and
3658 ! second order schemes to avoid the overhead for the first order
3659 ! scheme.
3660 !
3661  if (limused .eq. firstorder) then
3662  fluxd = 0.0_8
3663  leftd = 0.0_8
3664  rightd = 0.0_8
3665  sfaced = 0.0_8
3666 !
3667 ! first order reconstruction. the states in the cells are
3668 ! constant. the left and right states are constructed easily.
3669 !
3670 ! fluxes in the i-direction.
3671  do k=2,kl
3672  do j=2,jl
3673  do i=1,il
3674 ! store the normal vector, the porosity and the
3675 ! mesh velocity if present.
3676  sxd = sid(i, j, k, 1)
3677  sx = si(i, j, k, 1)
3678  syd = sid(i, j, k, 2)
3679  sy = si(i, j, k, 2)
3680  szd = sid(i, j, k, 3)
3681  sz = si(i, j, k, 3)
3682  por = pori(i, j, k)
3683  if (addgridvelocities) then
3684  sfaced = sfaceid(i, j, k)
3685  sface = sfacei(i, j, k)
3686  end if
3687 ! determine the left and right state.
3688  leftd(irho) = wd(i, j, k, irho)
3689  left(irho) = w(i, j, k, irho)
3690  leftd(ivx) = wd(i, j, k, ivx)
3691  left(ivx) = w(i, j, k, ivx)
3692  leftd(ivy) = wd(i, j, k, ivy)
3693  left(ivy) = w(i, j, k, ivy)
3694  leftd(ivz) = wd(i, j, k, ivz)
3695  left(ivz) = w(i, j, k, ivz)
3696  leftd(irhoe) = pd(i, j, k)
3697  left(irhoe) = p(i, j, k)
3698  if (correctfork) then
3699  leftd(itu1) = wd(i, j, k, itu1)
3700  left(itu1) = w(i, j, k, itu1)
3701  end if
3702  rightd(irho) = wd(i+1, j, k, irho)
3703  right(irho) = w(i+1, j, k, irho)
3704  rightd(ivx) = wd(i+1, j, k, ivx)
3705  right(ivx) = w(i+1, j, k, ivx)
3706  rightd(ivy) = wd(i+1, j, k, ivy)
3707  right(ivy) = w(i+1, j, k, ivy)
3708  rightd(ivz) = wd(i+1, j, k, ivz)
3709  right(ivz) = w(i+1, j, k, ivz)
3710  rightd(irhoe) = pd(i+1, j, k)
3711  right(irhoe) = p(i+1, j, k)
3712  if (correctfork) then
3713  rightd(itu1) = wd(i+1, j, k, itu1)
3714  right(itu1) = w(i+1, j, k, itu1)
3715  end if
3716 ! compute the value of gamma on the face. take an
3717 ! arithmetic average of the two states.
3718  gammaface = half*(gamma(i, j, k)+gamma(i+1, j, k))
3719 ! compute the dissipative flux across the interface.
3720  call riemannflux_d(left, leftd, right, rightd, flux, fluxd&
3721 & )
3722 ! and scatter it to the left and right.
3723  fwd(i, j, k, irho) = fwd(i, j, k, irho) + fluxd(irho)
3724  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
3725  fwd(i, j, k, imx) = fwd(i, j, k, imx) + fluxd(imx)
3726  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
3727  fwd(i, j, k, imy) = fwd(i, j, k, imy) + fluxd(imy)
3728  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
3729  fwd(i, j, k, imz) = fwd(i, j, k, imz) + fluxd(imz)
3730  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
3731  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) + fluxd(irhoe)
3732  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
3733  fwd(i+1, j, k, irho) = fwd(i+1, j, k, irho) - fluxd(irho)
3734  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) - flux(irho)
3735  fwd(i+1, j, k, imx) = fwd(i+1, j, k, imx) - fluxd(imx)
3736  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) - flux(imx)
3737  fwd(i+1, j, k, imy) = fwd(i+1, j, k, imy) - fluxd(imy)
3738  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) - flux(imy)
3739  fwd(i+1, j, k, imz) = fwd(i+1, j, k, imz) - fluxd(imz)
3740  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) - flux(imz)
3741  fwd(i+1, j, k, irhoe) = fwd(i+1, j, k, irhoe) - fluxd(&
3742 & irhoe)
3743  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) - flux(irhoe)
3744 ! store the density flux in the mass flow of the
3745 ! appropriate sliding mesh interface.
3746  end do
3747  end do
3748  end do
3749 ! fluxes in j-direction.
3750  do k=2,kl
3751  do j=1,jl
3752  do i=2,il
3753 ! store the normal vector, the porosity and the
3754 ! mesh velocity if present.
3755  sxd = sjd(i, j, k, 1)
3756  sx = sj(i, j, k, 1)
3757  syd = sjd(i, j, k, 2)
3758  sy = sj(i, j, k, 2)
3759  szd = sjd(i, j, k, 3)
3760  sz = sj(i, j, k, 3)
3761  por = porj(i, j, k)
3762  if (addgridvelocities) then
3763  sfaced = sfacejd(i, j, k)
3764  sface = sfacej(i, j, k)
3765  end if
3766 ! determine the left and right state.
3767  leftd(irho) = wd(i, j, k, irho)
3768  left(irho) = w(i, j, k, irho)
3769  leftd(ivx) = wd(i, j, k, ivx)
3770  left(ivx) = w(i, j, k, ivx)
3771  leftd(ivy) = wd(i, j, k, ivy)
3772  left(ivy) = w(i, j, k, ivy)
3773  leftd(ivz) = wd(i, j, k, ivz)
3774  left(ivz) = w(i, j, k, ivz)
3775  leftd(irhoe) = pd(i, j, k)
3776  left(irhoe) = p(i, j, k)
3777  if (correctfork) then
3778  leftd(itu1) = wd(i, j, k, itu1)
3779  left(itu1) = w(i, j, k, itu1)
3780  end if
3781  rightd(irho) = wd(i, j+1, k, irho)
3782  right(irho) = w(i, j+1, k, irho)
3783  rightd(ivx) = wd(i, j+1, k, ivx)
3784  right(ivx) = w(i, j+1, k, ivx)
3785  rightd(ivy) = wd(i, j+1, k, ivy)
3786  right(ivy) = w(i, j+1, k, ivy)
3787  rightd(ivz) = wd(i, j+1, k, ivz)
3788  right(ivz) = w(i, j+1, k, ivz)
3789  rightd(irhoe) = pd(i, j+1, k)
3790  right(irhoe) = p(i, j+1, k)
3791  if (correctfork) then
3792  rightd(itu1) = wd(i, j+1, k, itu1)
3793  right(itu1) = w(i, j+1, k, itu1)
3794  end if
3795 ! compute the value of gamma on the face. take an
3796 ! arithmetic average of the two states.
3797  gammaface = half*(gamma(i, j, k)+gamma(i, j+1, k))
3798 ! compute the dissipative flux across the interface.
3799  call riemannflux_d(left, leftd, right, rightd, flux, fluxd&
3800 & )
3801 ! and scatter it to the left and right.
3802  fwd(i, j, k, irho) = fwd(i, j, k, irho) + fluxd(irho)
3803  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
3804  fwd(i, j, k, imx) = fwd(i, j, k, imx) + fluxd(imx)
3805  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
3806  fwd(i, j, k, imy) = fwd(i, j, k, imy) + fluxd(imy)
3807  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
3808  fwd(i, j, k, imz) = fwd(i, j, k, imz) + fluxd(imz)
3809  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
3810  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) + fluxd(irhoe)
3811  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
3812  fwd(i, j+1, k, irho) = fwd(i, j+1, k, irho) - fluxd(irho)
3813  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) - flux(irho)
3814  fwd(i, j+1, k, imx) = fwd(i, j+1, k, imx) - fluxd(imx)
3815  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) - flux(imx)
3816  fwd(i, j+1, k, imy) = fwd(i, j+1, k, imy) - fluxd(imy)
3817  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) - flux(imy)
3818  fwd(i, j+1, k, imz) = fwd(i, j+1, k, imz) - fluxd(imz)
3819  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) - flux(imz)
3820  fwd(i, j+1, k, irhoe) = fwd(i, j+1, k, irhoe) - fluxd(&
3821 & irhoe)
3822  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) - flux(irhoe)
3823 ! store the density flux in the mass flow of the
3824 ! appropriate sliding mesh interface.
3825  end do
3826  end do
3827  end do
3828 ! fluxes in k-direction.
3829  do k=1,kl
3830  do j=2,jl
3831  do i=2,il
3832 ! store the normal vector, the porosity and the
3833 ! mesh velocity if present.
3834  sxd = skd(i, j, k, 1)
3835  sx = sk(i, j, k, 1)
3836  syd = skd(i, j, k, 2)
3837  sy = sk(i, j, k, 2)
3838  szd = skd(i, j, k, 3)
3839  sz = sk(i, j, k, 3)
3840  por = pork(i, j, k)
3841  if (addgridvelocities) then
3842  sfaced = sfacekd(i, j, k)
3843  sface = sfacek(i, j, k)
3844  end if
3845 ! determine the left and right state.
3846  leftd(irho) = wd(i, j, k, irho)
3847  left(irho) = w(i, j, k, irho)
3848  leftd(ivx) = wd(i, j, k, ivx)
3849  left(ivx) = w(i, j, k, ivx)
3850  leftd(ivy) = wd(i, j, k, ivy)
3851  left(ivy) = w(i, j, k, ivy)
3852  leftd(ivz) = wd(i, j, k, ivz)
3853  left(ivz) = w(i, j, k, ivz)
3854  leftd(irhoe) = pd(i, j, k)
3855  left(irhoe) = p(i, j, k)
3856  if (correctfork) then
3857  leftd(itu1) = wd(i, j, k, itu1)
3858  left(itu1) = w(i, j, k, itu1)
3859  end if
3860  rightd(irho) = wd(i, j, k+1, irho)
3861  right(irho) = w(i, j, k+1, irho)
3862  rightd(ivx) = wd(i, j, k+1, ivx)
3863  right(ivx) = w(i, j, k+1, ivx)
3864  rightd(ivy) = wd(i, j, k+1, ivy)
3865  right(ivy) = w(i, j, k+1, ivy)
3866  rightd(ivz) = wd(i, j, k+1, ivz)
3867  right(ivz) = w(i, j, k+1, ivz)
3868  rightd(irhoe) = pd(i, j, k+1)
3869  right(irhoe) = p(i, j, k+1)
3870  if (correctfork) then
3871  rightd(itu1) = wd(i, j, k+1, itu1)
3872  right(itu1) = w(i, j, k+1, itu1)
3873  end if
3874 ! compute the value of gamma on the face. take an
3875 ! arithmetic average of the two states.
3876  gammaface = half*(gamma(i, j, k)+gamma(i, j, k+1))
3877 ! compute the dissipative flux across the interface.
3878  call riemannflux_d(left, leftd, right, rightd, flux, fluxd&
3879 & )
3880 ! and scatter it the left and right.
3881  fwd(i, j, k, irho) = fwd(i, j, k, irho) + fluxd(irho)
3882  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
3883  fwd(i, j, k, imx) = fwd(i, j, k, imx) + fluxd(imx)
3884  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
3885  fwd(i, j, k, imy) = fwd(i, j, k, imy) + fluxd(imy)
3886  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
3887  fwd(i, j, k, imz) = fwd(i, j, k, imz) + fluxd(imz)
3888  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
3889  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) + fluxd(irhoe)
3890  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
3891  fwd(i, j, k+1, irho) = fwd(i, j, k+1, irho) - fluxd(irho)
3892  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) - flux(irho)
3893  fwd(i, j, k+1, imx) = fwd(i, j, k+1, imx) - fluxd(imx)
3894  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) - flux(imx)
3895  fwd(i, j, k+1, imy) = fwd(i, j, k+1, imy) - fluxd(imy)
3896  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) - flux(imy)
3897  fwd(i, j, k+1, imz) = fwd(i, j, k+1, imz) - fluxd(imz)
3898  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) - flux(imz)
3899  fwd(i, j, k+1, irhoe) = fwd(i, j, k+1, irhoe) - fluxd(&
3900 & irhoe)
3901  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) - flux(irhoe)
3902 ! store the density flux in the mass flow of the
3903 ! appropriate sliding mesh interface.
3904  end do
3905  end do
3906  end do
3907  else
3908  fluxd = 0.0_8
3909  leftd = 0.0_8
3910  rightd = 0.0_8
3911  du1d = 0.0_8
3912  du2d = 0.0_8
3913  du3d = 0.0_8
3914  sfaced = 0.0_8
3915 ! ==================================================================
3916 ! ==================================================================
3917 !
3918 ! second order reconstruction of the left and right state.
3919 ! the three differences used in the, possibly nonlinear,
3920 ! interpolation are constructed here; the actual left and
3921 ! right states, or at least the differences from the first
3922 ! order interpolation, are computed in the subroutine
3923 ! leftrightstate.
3924 !
3925 ! fluxes in the i-direction.
3926  do k=2,kl
3927  do j=2,jl
3928  do i=1,il
3929 ! store the three differences used in the interpolation
3930 ! in du1, du2, du3.
3931  du1d(irho) = wd(i, j, k, irho) - wd(i-1, j, k, irho)
3932  du1(irho) = w(i, j, k, irho) - w(i-1, j, k, irho)
3933  du2d(irho) = wd(i+1, j, k, irho) - wd(i, j, k, irho)
3934  du2(irho) = w(i+1, j, k, irho) - w(i, j, k, irho)
3935  du3d(irho) = wd(i+2, j, k, irho) - wd(i+1, j, k, irho)
3936  du3(irho) = w(i+2, j, k, irho) - w(i+1, j, k, irho)
3937  du1d(ivx) = wd(i, j, k, ivx) - wd(i-1, j, k, ivx)
3938  du1(ivx) = w(i, j, k, ivx) - w(i-1, j, k, ivx)
3939  du2d(ivx) = wd(i+1, j, k, ivx) - wd(i, j, k, ivx)
3940  du2(ivx) = w(i+1, j, k, ivx) - w(i, j, k, ivx)
3941  du3d(ivx) = wd(i+2, j, k, ivx) - wd(i+1, j, k, ivx)
3942  du3(ivx) = w(i+2, j, k, ivx) - w(i+1, j, k, ivx)
3943  du1d(ivy) = wd(i, j, k, ivy) - wd(i-1, j, k, ivy)
3944  du1(ivy) = w(i, j, k, ivy) - w(i-1, j, k, ivy)
3945  du2d(ivy) = wd(i+1, j, k, ivy) - wd(i, j, k, ivy)
3946  du2(ivy) = w(i+1, j, k, ivy) - w(i, j, k, ivy)
3947  du3d(ivy) = wd(i+2, j, k, ivy) - wd(i+1, j, k, ivy)
3948  du3(ivy) = w(i+2, j, k, ivy) - w(i+1, j, k, ivy)
3949  du1d(ivz) = wd(i, j, k, ivz) - wd(i-1, j, k, ivz)
3950  du1(ivz) = w(i, j, k, ivz) - w(i-1, j, k, ivz)
3951  du2d(ivz) = wd(i+1, j, k, ivz) - wd(i, j, k, ivz)
3952  du2(ivz) = w(i+1, j, k, ivz) - w(i, j, k, ivz)
3953  du3d(ivz) = wd(i+2, j, k, ivz) - wd(i+1, j, k, ivz)
3954  du3(ivz) = w(i+2, j, k, ivz) - w(i+1, j, k, ivz)
3955  du1d(irhoe) = pd(i, j, k) - pd(i-1, j, k)
3956  du1(irhoe) = p(i, j, k) - p(i-1, j, k)
3957  du2d(irhoe) = pd(i+1, j, k) - pd(i, j, k)
3958  du2(irhoe) = p(i+1, j, k) - p(i, j, k)
3959  du3d(irhoe) = pd(i+2, j, k) - pd(i+1, j, k)
3960  du3(irhoe) = p(i+2, j, k) - p(i+1, j, k)
3961  if (correctfork) then
3962  du1d(itu1) = wd(i, j, k, itu1) - wd(i-1, j, k, itu1)
3963  du1(itu1) = w(i, j, k, itu1) - w(i-1, j, k, itu1)
3964  du2d(itu1) = wd(i+1, j, k, itu1) - wd(i, j, k, itu1)
3965  du2(itu1) = w(i+1, j, k, itu1) - w(i, j, k, itu1)
3966  du3d(itu1) = wd(i+2, j, k, itu1) - wd(i+1, j, k, itu1)
3967  du3(itu1) = w(i+2, j, k, itu1) - w(i+1, j, k, itu1)
3968  end if
3969 ! compute the differences from the first order scheme.
3970  call leftrightstate_d(du1, du1d, du2, du2d, du3, du3d, &
3971 & rotmatrixi, left, leftd, right, rightd)
3972 ! add the first order part to the currently stored
3973 ! differences, such that the correct state vector
3974 ! is stored.
3975  leftd(irho) = leftd(irho) + wd(i, j, k, irho)
3976  left(irho) = left(irho) + w(i, j, k, irho)
3977  leftd(ivx) = leftd(ivx) + wd(i, j, k, ivx)
3978  left(ivx) = left(ivx) + w(i, j, k, ivx)
3979  leftd(ivy) = leftd(ivy) + wd(i, j, k, ivy)
3980  left(ivy) = left(ivy) + w(i, j, k, ivy)
3981  leftd(ivz) = leftd(ivz) + wd(i, j, k, ivz)
3982  left(ivz) = left(ivz) + w(i, j, k, ivz)
3983  leftd(irhoe) = leftd(irhoe) + pd(i, j, k)
3984  left(irhoe) = left(irhoe) + p(i, j, k)
3985  rightd(irho) = rightd(irho) + wd(i+1, j, k, irho)
3986  right(irho) = right(irho) + w(i+1, j, k, irho)
3987  rightd(ivx) = rightd(ivx) + wd(i+1, j, k, ivx)
3988  right(ivx) = right(ivx) + w(i+1, j, k, ivx)
3989  rightd(ivy) = rightd(ivy) + wd(i+1, j, k, ivy)
3990  right(ivy) = right(ivy) + w(i+1, j, k, ivy)
3991  rightd(ivz) = rightd(ivz) + wd(i+1, j, k, ivz)
3992  right(ivz) = right(ivz) + w(i+1, j, k, ivz)
3993  rightd(irhoe) = rightd(irhoe) + pd(i+1, j, k)
3994  right(irhoe) = right(irhoe) + p(i+1, j, k)
3995  if (correctfork) then
3996  leftd(itu1) = leftd(itu1) + wd(i, j, k, itu1)
3997  left(itu1) = left(itu1) + w(i, j, k, itu1)
3998  rightd(itu1) = rightd(itu1) + wd(i+1, j, k, itu1)
3999  right(itu1) = right(itu1) + w(i+1, j, k, itu1)
4000  end if
4001 ! store the normal vector, the porosity and the
4002 ! mesh velocity if present.
4003  sxd = sid(i, j, k, 1)
4004  sx = si(i, j, k, 1)
4005  syd = sid(i, j, k, 2)
4006  sy = si(i, j, k, 2)
4007  szd = sid(i, j, k, 3)
4008  sz = si(i, j, k, 3)
4009  por = pori(i, j, k)
4010  if (addgridvelocities) then
4011  sfaced = sfaceid(i, j, k)
4012  sface = sfacei(i, j, k)
4013  end if
4014 ! compute the value of gamma on the face. take an
4015 ! arithmetic average of the two states.
4016  gammaface = half*(gamma(i, j, k)+gamma(i+1, j, k))
4017 ! compute the dissipative flux across the interface.
4018  call riemannflux_d(left, leftd, right, rightd, flux, fluxd&
4019 & )
4020 ! and scatter it to the left and right.
4021  fwd(i, j, k, irho) = fwd(i, j, k, irho) + fluxd(irho)
4022  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
4023  fwd(i, j, k, imx) = fwd(i, j, k, imx) + fluxd(imx)
4024  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
4025  fwd(i, j, k, imy) = fwd(i, j, k, imy) + fluxd(imy)
4026  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
4027  fwd(i, j, k, imz) = fwd(i, j, k, imz) + fluxd(imz)
4028  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
4029  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) + fluxd(irhoe)
4030  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
4031  fwd(i+1, j, k, irho) = fwd(i+1, j, k, irho) - fluxd(irho)
4032  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) - flux(irho)
4033  fwd(i+1, j, k, imx) = fwd(i+1, j, k, imx) - fluxd(imx)
4034  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) - flux(imx)
4035  fwd(i+1, j, k, imy) = fwd(i+1, j, k, imy) - fluxd(imy)
4036  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) - flux(imy)
4037  fwd(i+1, j, k, imz) = fwd(i+1, j, k, imz) - fluxd(imz)
4038  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) - flux(imz)
4039  fwd(i+1, j, k, irhoe) = fwd(i+1, j, k, irhoe) - fluxd(&
4040 & irhoe)
4041  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) - flux(irhoe)
4042 ! store the density flux in the mass flow of the
4043 ! appropriate sliding mesh interface.
4044  end do
4045  end do
4046  end do
4047 ! fluxes in the j-direction.
4048  do k=2,kl
4049  do j=1,jl
4050  do i=2,il
4051 ! store the three differences used in the interpolation
4052 ! in du1, du2, du3.
4053  du1d(irho) = wd(i, j, k, irho) - wd(i, j-1, k, irho)
4054  du1(irho) = w(i, j, k, irho) - w(i, j-1, k, irho)
4055  du2d(irho) = wd(i, j+1, k, irho) - wd(i, j, k, irho)
4056  du2(irho) = w(i, j+1, k, irho) - w(i, j, k, irho)
4057  du3d(irho) = wd(i, j+2, k, irho) - wd(i, j+1, k, irho)
4058  du3(irho) = w(i, j+2, k, irho) - w(i, j+1, k, irho)
4059  du1d(ivx) = wd(i, j, k, ivx) - wd(i, j-1, k, ivx)
4060  du1(ivx) = w(i, j, k, ivx) - w(i, j-1, k, ivx)
4061  du2d(ivx) = wd(i, j+1, k, ivx) - wd(i, j, k, ivx)
4062  du2(ivx) = w(i, j+1, k, ivx) - w(i, j, k, ivx)
4063  du3d(ivx) = wd(i, j+2, k, ivx) - wd(i, j+1, k, ivx)
4064  du3(ivx) = w(i, j+2, k, ivx) - w(i, j+1, k, ivx)
4065  du1d(ivy) = wd(i, j, k, ivy) - wd(i, j-1, k, ivy)
4066  du1(ivy) = w(i, j, k, ivy) - w(i, j-1, k, ivy)
4067  du2d(ivy) = wd(i, j+1, k, ivy) - wd(i, j, k, ivy)
4068  du2(ivy) = w(i, j+1, k, ivy) - w(i, j, k, ivy)
4069  du3d(ivy) = wd(i, j+2, k, ivy) - wd(i, j+1, k, ivy)
4070  du3(ivy) = w(i, j+2, k, ivy) - w(i, j+1, k, ivy)
4071  du1d(ivz) = wd(i, j, k, ivz) - wd(i, j-1, k, ivz)
4072  du1(ivz) = w(i, j, k, ivz) - w(i, j-1, k, ivz)
4073  du2d(ivz) = wd(i, j+1, k, ivz) - wd(i, j, k, ivz)
4074  du2(ivz) = w(i, j+1, k, ivz) - w(i, j, k, ivz)
4075  du3d(ivz) = wd(i, j+2, k, ivz) - wd(i, j+1, k, ivz)
4076  du3(ivz) = w(i, j+2, k, ivz) - w(i, j+1, k, ivz)
4077  du1d(irhoe) = pd(i, j, k) - pd(i, j-1, k)
4078  du1(irhoe) = p(i, j, k) - p(i, j-1, k)
4079  du2d(irhoe) = pd(i, j+1, k) - pd(i, j, k)
4080  du2(irhoe) = p(i, j+1, k) - p(i, j, k)
4081  du3d(irhoe) = pd(i, j+2, k) - pd(i, j+1, k)
4082  du3(irhoe) = p(i, j+2, k) - p(i, j+1, k)
4083  if (correctfork) then
4084  du1d(itu1) = wd(i, j, k, itu1) - wd(i, j-1, k, itu1)
4085  du1(itu1) = w(i, j, k, itu1) - w(i, j-1, k, itu1)
4086  du2d(itu1) = wd(i, j+1, k, itu1) - wd(i, j, k, itu1)
4087  du2(itu1) = w(i, j+1, k, itu1) - w(i, j, k, itu1)
4088  du3d(itu1) = wd(i, j+2, k, itu1) - wd(i, j+1, k, itu1)
4089  du3(itu1) = w(i, j+2, k, itu1) - w(i, j+1, k, itu1)
4090  end if
4091 ! compute the differences from the first order scheme.
4092  call leftrightstate_d(du1, du1d, du2, du2d, du3, du3d, &
4093 & rotmatrixj, left, leftd, right, rightd)
4094 ! add the first order part to the currently stored
4095 ! differences, such that the correct state vector
4096 ! is stored.
4097  leftd(irho) = leftd(irho) + wd(i, j, k, irho)
4098  left(irho) = left(irho) + w(i, j, k, irho)
4099  leftd(ivx) = leftd(ivx) + wd(i, j, k, ivx)
4100  left(ivx) = left(ivx) + w(i, j, k, ivx)
4101  leftd(ivy) = leftd(ivy) + wd(i, j, k, ivy)
4102  left(ivy) = left(ivy) + w(i, j, k, ivy)
4103  leftd(ivz) = leftd(ivz) + wd(i, j, k, ivz)
4104  left(ivz) = left(ivz) + w(i, j, k, ivz)
4105  leftd(irhoe) = leftd(irhoe) + pd(i, j, k)
4106  left(irhoe) = left(irhoe) + p(i, j, k)
4107  rightd(irho) = rightd(irho) + wd(i, j+1, k, irho)
4108  right(irho) = right(irho) + w(i, j+1, k, irho)
4109  rightd(ivx) = rightd(ivx) + wd(i, j+1, k, ivx)
4110  right(ivx) = right(ivx) + w(i, j+1, k, ivx)
4111  rightd(ivy) = rightd(ivy) + wd(i, j+1, k, ivy)
4112  right(ivy) = right(ivy) + w(i, j+1, k, ivy)
4113  rightd(ivz) = rightd(ivz) + wd(i, j+1, k, ivz)
4114  right(ivz) = right(ivz) + w(i, j+1, k, ivz)
4115  rightd(irhoe) = rightd(irhoe) + pd(i, j+1, k)
4116  right(irhoe) = right(irhoe) + p(i, j+1, k)
4117  if (correctfork) then
4118  leftd(itu1) = leftd(itu1) + wd(i, j, k, itu1)
4119  left(itu1) = left(itu1) + w(i, j, k, itu1)
4120  rightd(itu1) = rightd(itu1) + wd(i, j+1, k, itu1)
4121  right(itu1) = right(itu1) + w(i, j+1, k, itu1)
4122  end if
4123 ! store the normal vector, the porosity and the
4124 ! mesh velocity if present.
4125  sxd = sjd(i, j, k, 1)
4126  sx = sj(i, j, k, 1)
4127  syd = sjd(i, j, k, 2)
4128  sy = sj(i, j, k, 2)
4129  szd = sjd(i, j, k, 3)
4130  sz = sj(i, j, k, 3)
4131  por = porj(i, j, k)
4132  if (addgridvelocities) then
4133  sfaced = sfacejd(i, j, k)
4134  sface = sfacej(i, j, k)
4135  end if
4136 ! compute the value of gamma on the face. take an
4137 ! arithmetic average of the two states.
4138  gammaface = half*(gamma(i, j, k)+gamma(i, j+1, k))
4139 ! compute the dissipative flux across the interface.
4140  call riemannflux_d(left, leftd, right, rightd, flux, fluxd&
4141 & )
4142 ! and scatter it to the left and right.
4143  fwd(i, j, k, irho) = fwd(i, j, k, irho) + fluxd(irho)
4144  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
4145  fwd(i, j, k, imx) = fwd(i, j, k, imx) + fluxd(imx)
4146  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
4147  fwd(i, j, k, imy) = fwd(i, j, k, imy) + fluxd(imy)
4148  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
4149  fwd(i, j, k, imz) = fwd(i, j, k, imz) + fluxd(imz)
4150  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
4151  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) + fluxd(irhoe)
4152  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
4153  fwd(i, j+1, k, irho) = fwd(i, j+1, k, irho) - fluxd(irho)
4154  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) - flux(irho)
4155  fwd(i, j+1, k, imx) = fwd(i, j+1, k, imx) - fluxd(imx)
4156  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) - flux(imx)
4157  fwd(i, j+1, k, imy) = fwd(i, j+1, k, imy) - fluxd(imy)
4158  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) - flux(imy)
4159  fwd(i, j+1, k, imz) = fwd(i, j+1, k, imz) - fluxd(imz)
4160  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) - flux(imz)
4161  fwd(i, j+1, k, irhoe) = fwd(i, j+1, k, irhoe) - fluxd(&
4162 & irhoe)
4163  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) - flux(irhoe)
4164 ! store the density flux in the mass flow of the
4165 ! appropriate sliding mesh interface.
4166  end do
4167  end do
4168  end do
4169 ! fluxes in the k-direction.
4170  do k=1,kl
4171  do j=2,jl
4172  do i=2,il
4173 ! store the three differences used in the interpolation
4174 ! in du1, du2, du3.
4175  du1d(irho) = wd(i, j, k, irho) - wd(i, j, k-1, irho)
4176  du1(irho) = w(i, j, k, irho) - w(i, j, k-1, irho)
4177  du2d(irho) = wd(i, j, k+1, irho) - wd(i, j, k, irho)
4178  du2(irho) = w(i, j, k+1, irho) - w(i, j, k, irho)
4179  du3d(irho) = wd(i, j, k+2, irho) - wd(i, j, k+1, irho)
4180  du3(irho) = w(i, j, k+2, irho) - w(i, j, k+1, irho)
4181  du1d(ivx) = wd(i, j, k, ivx) - wd(i, j, k-1, ivx)
4182  du1(ivx) = w(i, j, k, ivx) - w(i, j, k-1, ivx)
4183  du2d(ivx) = wd(i, j, k+1, ivx) - wd(i, j, k, ivx)
4184  du2(ivx) = w(i, j, k+1, ivx) - w(i, j, k, ivx)
4185  du3d(ivx) = wd(i, j, k+2, ivx) - wd(i, j, k+1, ivx)
4186  du3(ivx) = w(i, j, k+2, ivx) - w(i, j, k+1, ivx)
4187  du1d(ivy) = wd(i, j, k, ivy) - wd(i, j, k-1, ivy)
4188  du1(ivy) = w(i, j, k, ivy) - w(i, j, k-1, ivy)
4189  du2d(ivy) = wd(i, j, k+1, ivy) - wd(i, j, k, ivy)
4190  du2(ivy) = w(i, j, k+1, ivy) - w(i, j, k, ivy)
4191  du3d(ivy) = wd(i, j, k+2, ivy) - wd(i, j, k+1, ivy)
4192  du3(ivy) = w(i, j, k+2, ivy) - w(i, j, k+1, ivy)
4193  du1d(ivz) = wd(i, j, k, ivz) - wd(i, j, k-1, ivz)
4194  du1(ivz) = w(i, j, k, ivz) - w(i, j, k-1, ivz)
4195  du2d(ivz) = wd(i, j, k+1, ivz) - wd(i, j, k, ivz)
4196  du2(ivz) = w(i, j, k+1, ivz) - w(i, j, k, ivz)
4197  du3d(ivz) = wd(i, j, k+2, ivz) - wd(i, j, k+1, ivz)
4198  du3(ivz) = w(i, j, k+2, ivz) - w(i, j, k+1, ivz)
4199  du1d(irhoe) = pd(i, j, k) - pd(i, j, k-1)
4200  du1(irhoe) = p(i, j, k) - p(i, j, k-1)
4201  du2d(irhoe) = pd(i, j, k+1) - pd(i, j, k)
4202  du2(irhoe) = p(i, j, k+1) - p(i, j, k)
4203  du3d(irhoe) = pd(i, j, k+2) - pd(i, j, k+1)
4204  du3(irhoe) = p(i, j, k+2) - p(i, j, k+1)
4205  if (correctfork) then
4206  du1d(itu1) = wd(i, j, k, itu1) - wd(i, j, k-1, itu1)
4207  du1(itu1) = w(i, j, k, itu1) - w(i, j, k-1, itu1)
4208  du2d(itu1) = wd(i, j, k+1, itu1) - wd(i, j, k, itu1)
4209  du2(itu1) = w(i, j, k+1, itu1) - w(i, j, k, itu1)
4210  du3d(itu1) = wd(i, j, k+2, itu1) - wd(i, j, k+1, itu1)
4211  du3(itu1) = w(i, j, k+2, itu1) - w(i, j, k+1, itu1)
4212  end if
4213 ! compute the differences from the first order scheme.
4214  call leftrightstate_d(du1, du1d, du2, du2d, du3, du3d, &
4215 & rotmatrixk, left, leftd, right, rightd)
4216 ! add the first order part to the currently stored
4217 ! differences, such that the correct state vector
4218 ! is stored.
4219  leftd(irho) = leftd(irho) + wd(i, j, k, irho)
4220  left(irho) = left(irho) + w(i, j, k, irho)
4221  leftd(ivx) = leftd(ivx) + wd(i, j, k, ivx)
4222  left(ivx) = left(ivx) + w(i, j, k, ivx)
4223  leftd(ivy) = leftd(ivy) + wd(i, j, k, ivy)
4224  left(ivy) = left(ivy) + w(i, j, k, ivy)
4225  leftd(ivz) = leftd(ivz) + wd(i, j, k, ivz)
4226  left(ivz) = left(ivz) + w(i, j, k, ivz)
4227  leftd(irhoe) = leftd(irhoe) + pd(i, j, k)
4228  left(irhoe) = left(irhoe) + p(i, j, k)
4229  rightd(irho) = rightd(irho) + wd(i, j, k+1, irho)
4230  right(irho) = right(irho) + w(i, j, k+1, irho)
4231  rightd(ivx) = rightd(ivx) + wd(i, j, k+1, ivx)
4232  right(ivx) = right(ivx) + w(i, j, k+1, ivx)
4233  rightd(ivy) = rightd(ivy) + wd(i, j, k+1, ivy)
4234  right(ivy) = right(ivy) + w(i, j, k+1, ivy)
4235  rightd(ivz) = rightd(ivz) + wd(i, j, k+1, ivz)
4236  right(ivz) = right(ivz) + w(i, j, k+1, ivz)
4237  rightd(irhoe) = rightd(irhoe) + pd(i, j, k+1)
4238  right(irhoe) = right(irhoe) + p(i, j, k+1)
4239  if (correctfork) then
4240  leftd(itu1) = leftd(itu1) + wd(i, j, k, itu1)
4241  left(itu1) = left(itu1) + w(i, j, k, itu1)
4242  rightd(itu1) = rightd(itu1) + wd(i, j, k+1, itu1)
4243  right(itu1) = right(itu1) + w(i, j, k+1, itu1)
4244  end if
4245 ! store the normal vector, the porosity and the
4246 ! mesh velocity if present.
4247  sxd = skd(i, j, k, 1)
4248  sx = sk(i, j, k, 1)
4249  syd = skd(i, j, k, 2)
4250  sy = sk(i, j, k, 2)
4251  szd = skd(i, j, k, 3)
4252  sz = sk(i, j, k, 3)
4253  por = pork(i, j, k)
4254  if (addgridvelocities) then
4255  sfaced = sfacekd(i, j, k)
4256  sface = sfacek(i, j, k)
4257  end if
4258 ! compute the value of gamma on the face. take an
4259 ! arithmetic average of the two states.
4260  gammaface = half*(gamma(i, j, k)+gamma(i, j, k+1))
4261 ! compute the dissipative flux across the interface.
4262  call riemannflux_d(left, leftd, right, rightd, flux, fluxd&
4263 & )
4264 ! and scatter it to the left and right.
4265  fwd(i, j, k, irho) = fwd(i, j, k, irho) + fluxd(irho)
4266  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
4267  fwd(i, j, k, imx) = fwd(i, j, k, imx) + fluxd(imx)
4268  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
4269  fwd(i, j, k, imy) = fwd(i, j, k, imy) + fluxd(imy)
4270  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
4271  fwd(i, j, k, imz) = fwd(i, j, k, imz) + fluxd(imz)
4272  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
4273  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) + fluxd(irhoe)
4274  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
4275  fwd(i, j, k+1, irho) = fwd(i, j, k+1, irho) - fluxd(irho)
4276  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) - flux(irho)
4277  fwd(i, j, k+1, imx) = fwd(i, j, k+1, imx) - fluxd(imx)
4278  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) - flux(imx)
4279  fwd(i, j, k+1, imy) = fwd(i, j, k+1, imy) - fluxd(imy)
4280  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) - flux(imy)
4281  fwd(i, j, k+1, imz) = fwd(i, j, k+1, imz) - fluxd(imz)
4282  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) - flux(imz)
4283  fwd(i, j, k+1, irhoe) = fwd(i, j, k+1, irhoe) - fluxd(&
4284 & irhoe)
4285  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) - flux(irhoe)
4286 ! store the density flux in the mass flow of the
4287 ! appropriate sliding mesh interface.
4288  end do
4289  end do
4290  end do
4291  end if
4292  end if
4293 
4294  contains
4295 ! differentiation of leftrightstate in forward (tangent) mode (with options i4 dr8 r8):
4296 ! variations of useful results: left right du1 du2 du3
4297 ! with respect to varying inputs: left right du1 du2 du3
4298 ! ==================================================================
4299  subroutine leftrightstate_d(du1, du1d, du2, du2d, du3, du3d, &
4300 & rotmatrix, left, leftd, right, rightd)
4301  implicit none
4302 !
4303 ! local parameter.
4304 !
4305  real(kind=realtype), parameter :: epslim=1.e-10_realtype
4306 !
4307 ! subroutine arguments.
4308 !
4309  real(kind=realtype), dimension(:), intent(inout) :: du1, du2, du3
4310  real(kind=realtype), dimension(:), intent(inout) :: du1d, du2d, &
4311 & du3d
4312  real(kind=realtype), dimension(:), intent(out) :: left, right
4313  real(kind=realtype), dimension(:), intent(out) :: leftd, rightd
4314  real(kind=realtype), dimension(:, :, :, :, :), pointer :: &
4315 & rotmatrix
4316 !
4317 ! local variables.
4318 !
4319  integer(kind=inttype) :: l
4320  real(kind=realtype) :: rl1, rl2, rr1, rr2, tmp, dvx, dvy, dvz
4321  real(kind=realtype) :: rl1d, rl2d, rr1d, rr2d, tmpd, dvxd, dvyd, &
4322 & dvzd
4323  real(kind=realtype), dimension(3, 3) :: rot
4324  intrinsic abs
4325  intrinsic max
4326  intrinsic sign
4327  intrinsic min
4328  real(kind=realtype) :: x1
4329  real(kind=realtype) :: x1d
4330  real(kind=realtype) :: y1
4331  real(kind=realtype) :: y1d
4332  real(kind=realtype) :: y2
4333  real(kind=realtype) :: y2d
4334  real(kind=realtype) :: x2
4335  real(kind=realtype) :: x2d
4336  real(kind=realtype) :: y3
4337  real(kind=realtype) :: y3d
4338  real(kind=realtype) :: y4
4339  real(kind=realtype) :: y4d
4340  real(kind=realtype) :: x3
4341  real(kind=realtype) :: x3d
4342  real(kind=realtype) :: x4
4343  real(kind=realtype) :: x4d
4344  real(kind=realtype) :: x5
4345  real(kind=realtype) :: x5d
4346  real(kind=realtype) :: x6
4347  real(kind=realtype) :: x6d
4348  real(kind=realtype) :: max2
4349  real(kind=realtype) :: max2d
4350  real(kind=realtype) :: max3
4351  real(kind=realtype) :: max3d
4352  real(kind=realtype) :: max4
4353  real(kind=realtype) :: max4d
4354  real(kind=realtype) :: max5
4355  real(kind=realtype) :: max5d
4356  real(kind=realtype) :: max6
4357  real(kind=realtype) :: max6d
4358  real(kind=realtype) :: max7
4359  real(kind=realtype) :: max7d
4360  real(kind=realtype) :: temp
4361  real(kind=realtype) :: temp0
4362 ! check if the velocity components should be transformed to
4363 ! the cylindrical frame.
4364  if (rotationalperiodic) then
4365 ! store the rotation matrix a bit easier. note that the i,j,k
4366 ! come from the main subroutine.
4367  rot(1, 1) = rotmatrix(i, j, k, 1, 1)
4368  rot(1, 2) = rotmatrix(i, j, k, 1, 2)
4369  rot(1, 3) = rotmatrix(i, j, k, 1, 3)
4370  rot(2, 1) = rotmatrix(i, j, k, 2, 1)
4371  rot(2, 2) = rotmatrix(i, j, k, 2, 2)
4372  rot(2, 3) = rotmatrix(i, j, k, 2, 3)
4373  rot(3, 1) = rotmatrix(i, j, k, 3, 1)
4374  rot(3, 2) = rotmatrix(i, j, k, 3, 2)
4375  rot(3, 3) = rotmatrix(i, j, k, 3, 3)
4376 ! apply the transformation to the velocity components
4377 ! of du1, du2 and du3.
4378  dvxd = du1d(ivx)
4379  dvx = du1(ivx)
4380  dvyd = du1d(ivy)
4381  dvy = du1(ivy)
4382  dvzd = du1d(ivz)
4383  dvz = du1(ivz)
4384  du1d(ivx) = rot(1, 1)*dvxd + rot(1, 2)*dvyd + rot(1, 3)*dvzd
4385  du1(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
4386  du1d(ivy) = rot(2, 1)*dvxd + rot(2, 2)*dvyd + rot(2, 3)*dvzd
4387  du1(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
4388  du1d(ivz) = rot(3, 1)*dvxd + rot(3, 2)*dvyd + rot(3, 3)*dvzd
4389  du1(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
4390  dvxd = du2d(ivx)
4391  dvx = du2(ivx)
4392  dvyd = du2d(ivy)
4393  dvy = du2(ivy)
4394  dvzd = du2d(ivz)
4395  dvz = du2(ivz)
4396  du2d(ivx) = rot(1, 1)*dvxd + rot(1, 2)*dvyd + rot(1, 3)*dvzd
4397  du2(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
4398  du2d(ivy) = rot(2, 1)*dvxd + rot(2, 2)*dvyd + rot(2, 3)*dvzd
4399  du2(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
4400  du2d(ivz) = rot(3, 1)*dvxd + rot(3, 2)*dvyd + rot(3, 3)*dvzd
4401  du2(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
4402  dvxd = du3d(ivx)
4403  dvx = du3(ivx)
4404  dvyd = du3d(ivy)
4405  dvy = du3(ivy)
4406  dvzd = du3d(ivz)
4407  dvz = du3(ivz)
4408  du3d(ivx) = rot(1, 1)*dvxd + rot(1, 2)*dvyd + rot(1, 3)*dvzd
4409  du3(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
4410  du3d(ivy) = rot(2, 1)*dvxd + rot(2, 2)*dvyd + rot(2, 3)*dvzd
4411  du3(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
4412  du3d(ivz) = rot(3, 1)*dvxd + rot(3, 2)*dvyd + rot(3, 3)*dvzd
4413  du3(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
4414  end if
4415 ! determine the limiter used.
4416  select case (limused)
4417  case (nolimiter)
4418 ! linear interpolation; no limiter.
4419 ! loop over the number of variables to be interpolated.
4420  do l=1,nwint
4421  leftd(l) = omk*du1d(l) + opk*du2d(l)
4422  left(l) = omk*du1(l) + opk*du2(l)
4423  rightd(l) = -(omk*du3d(l)) - opk*du2d(l)
4424  right(l) = -(omk*du3(l)) - opk*du2(l)
4425  end do
4426  case (vanalbeda)
4427 ! ==============================================================
4428 ! nonlinear interpolation using the van albeda limiter.
4429 ! loop over the number of variables to be interpolated.
4430  do l=1,nwint
4431  if (du2(l) .ge. 0.) then
4432  x1d = du2d(l)
4433  x1 = du2(l)
4434  else
4435  x1d = -du2d(l)
4436  x1 = -du2(l)
4437  end if
4438  if (x1 .lt. epslim) then
4439  max2 = epslim
4440  max2d = 0.0_8
4441  else
4442  max2d = x1d
4443  max2 = x1
4444  end if
4445 ! compute the limiter argument rl1, rl2, rr1 and rr2.
4446 ! note the cut off to 0.0.
4447  temp = one/sign(max2, du2(l))
4448  tmpd = -(temp*sign(1.d0, max2*du2(l))*max2d/sign(max2, du2(l))&
4449 & )
4450  tmp = temp
4451  if (du1(l) .ge. 0.) then
4452  x3d = du1d(l)
4453  x3 = du1(l)
4454  else
4455  x3d = -du1d(l)
4456  x3 = -du1(l)
4457  end if
4458  if (x3 .lt. epslim) then
4459  max4 = epslim
4460  max4d = 0.0_8
4461  else
4462  max4d = x3d
4463  max4 = x3
4464  end if
4465  temp = sign(max4, du1(l))
4466  temp0 = du2(l)/temp
4467  y1d = (du2d(l)-temp0*sign(1.d0, max4*du1(l))*max4d)/temp
4468  y1 = temp0
4469  if (zero .lt. y1) then
4470  rl1d = y1d
4471  rl1 = y1
4472  else
4473  rl1 = zero
4474  rl1d = 0.0_8
4475  end if
4476  if (zero .lt. du1(l)*tmp) then
4477  rl2d = tmp*du1d(l) + du1(l)*tmpd
4478  rl2 = du1(l)*tmp
4479  else
4480  rl2 = zero
4481  rl2d = 0.0_8
4482  end if
4483  if (zero .lt. du3(l)*tmp) then
4484  rr1d = tmp*du3d(l) + du3(l)*tmpd
4485  rr1 = du3(l)*tmp
4486  else
4487  rr1 = zero
4488  rr1d = 0.0_8
4489  end if
4490  if (du3(l) .ge. 0.) then
4491  x4d = du3d(l)
4492  x4 = du3(l)
4493  else
4494  x4d = -du3d(l)
4495  x4 = -du3(l)
4496  end if
4497  if (x4 .lt. epslim) then
4498  max5 = epslim
4499  max5d = 0.0_8
4500  else
4501  max5d = x4d
4502  max5 = x4
4503  end if
4504  temp0 = sign(max5, du3(l))
4505  temp = du2(l)/temp0
4506  y2d = (du2d(l)-temp*sign(1.d0, max5*du3(l))*max5d)/temp0
4507  y2 = temp
4508  if (zero .lt. y2) then
4509  rr2d = y2d
4510  rr2 = y2
4511  else
4512  rr2 = zero
4513  rr2d = 0.0_8
4514  end if
4515 ! compute the corresponding limiter values.
4516  temp0 = rl1*(one+rl1)/(one+rl1*rl1)
4517  rl1d = (one+2*rl1-temp0*2*rl1)*rl1d/(one+rl1**2)
4518  rl1 = temp0
4519  temp0 = rl2*(one+rl2)/(one+rl2*rl2)
4520  rl2d = (one+2*rl2-temp0*2*rl2)*rl2d/(one+rl2**2)
4521  rl2 = temp0
4522  temp0 = rr1*(one+rr1)/(one+rr1*rr1)
4523  rr1d = (one+2*rr1-temp0*2*rr1)*rr1d/(one+rr1**2)
4524  rr1 = temp0
4525  temp0 = rr2*(one+rr2)/(one+rr2*rr2)
4526  rr2d = (one+2*rr2-temp0*2*rr2)*rr2d/(one+rr2**2)
4527  rr2 = temp0
4528 ! compute the nonlinear corrections to the first order
4529 ! scheme.
4530  leftd(l) = omk*(du1(l)*rl1d+rl1*du1d(l)) + opk*(du2(l)*rl2d+&
4531 & rl2*du2d(l))
4532  left(l) = omk*rl1*du1(l) + opk*rl2*du2(l)
4533  rightd(l) = -(opk*(du2(l)*rr1d+rr1*du2d(l))) - omk*(du3(l)*&
4534 & rr2d+rr2*du3d(l))
4535  right(l) = -(opk*rr1*du2(l)) - omk*rr2*du3(l)
4536  end do
4537  case (minmod)
4538 ! ==============================================================
4539 ! nonlinear interpolation using the minmod limiter.
4540 ! loop over the number of variables to be interpolated.
4541  do l=1,nwint
4542  if (du2(l) .ge. 0.) then
4543  x2d = du2d(l)
4544  x2 = du2(l)
4545  else
4546  x2d = -du2d(l)
4547  x2 = -du2(l)
4548  end if
4549  if (x2 .lt. epslim) then
4550  max3 = epslim
4551  max3d = 0.0_8
4552  else
4553  max3d = x2d
4554  max3 = x2
4555  end if
4556 ! compute the limiter argument rl1, rl2, rr1 and rr2.
4557 ! note the cut off to 0.0.
4558  temp0 = one/sign(max3, du2(l))
4559  tmpd = -(temp0*sign(1.d0, max3*du2(l))*max3d/sign(max3, du2(l)&
4560 & ))
4561  tmp = temp0
4562  if (du1(l) .ge. 0.) then
4563  x5d = du1d(l)
4564  x5 = du1(l)
4565  else
4566  x5d = -du1d(l)
4567  x5 = -du1(l)
4568  end if
4569  if (x5 .lt. epslim) then
4570  max6 = epslim
4571  max6d = 0.0_8
4572  else
4573  max6d = x5d
4574  max6 = x5
4575  end if
4576  temp0 = sign(max6, du1(l))
4577  temp = du2(l)/temp0
4578  y3d = (du2d(l)-temp*sign(1.d0, max6*du1(l))*max6d)/temp0
4579  y3 = temp
4580  if (zero .lt. y3) then
4581  rl1d = y3d
4582  rl1 = y3
4583  else
4584  rl1 = zero
4585  rl1d = 0.0_8
4586  end if
4587  if (zero .lt. du1(l)*tmp) then
4588  rl2d = tmp*du1d(l) + du1(l)*tmpd
4589  rl2 = du1(l)*tmp
4590  else
4591  rl2 = zero
4592  rl2d = 0.0_8
4593  end if
4594  if (zero .lt. du3(l)*tmp) then
4595  rr1d = tmp*du3d(l) + du3(l)*tmpd
4596  rr1 = du3(l)*tmp
4597  else
4598  rr1 = zero
4599  rr1d = 0.0_8
4600  end if
4601  if (du3(l) .ge. 0.) then
4602  x6d = du3d(l)
4603  x6 = du3(l)
4604  else
4605  x6d = -du3d(l)
4606  x6 = -du3(l)
4607  end if
4608  if (x6 .lt. epslim) then
4609  max7 = epslim
4610  max7d = 0.0_8
4611  else
4612  max7d = x6d
4613  max7 = x6
4614  end if
4615  temp0 = sign(max7, du3(l))
4616  temp = du2(l)/temp0
4617  y4d = (du2d(l)-temp*sign(1.d0, max7*du3(l))*max7d)/temp0
4618  y4 = temp
4619  if (zero .lt. y4) then
4620  rr2d = y4d
4621  rr2 = y4
4622  else
4623  rr2 = zero
4624  rr2d = 0.0_8
4625  end if
4626  if (one .gt. factminmod*rl1) then
4627  rl1d = factminmod*rl1d
4628  rl1 = factminmod*rl1
4629  else
4630  rl1 = one
4631  rl1d = 0.0_8
4632  end if
4633  if (one .gt. factminmod*rl2) then
4634  rl2d = factminmod*rl2d
4635  rl2 = factminmod*rl2
4636  else
4637  rl2 = one
4638  rl2d = 0.0_8
4639  end if
4640  if (one .gt. factminmod*rr1) then
4641  rr1d = factminmod*rr1d
4642  rr1 = factminmod*rr1
4643  else
4644  rr1 = one
4645  rr1d = 0.0_8
4646  end if
4647  if (one .gt. factminmod*rr2) then
4648  rr2d = factminmod*rr2d
4649  rr2 = factminmod*rr2
4650  else
4651  rr2 = one
4652  rr2d = 0.0_8
4653  end if
4654 ! compute the nonlinear corrections to the first order
4655 ! scheme.
4656  leftd(l) = omk*(du1(l)*rl1d+rl1*du1d(l)) + opk*(du2(l)*rl2d+&
4657 & rl2*du2d(l))
4658  left(l) = omk*rl1*du1(l) + opk*rl2*du2(l)
4659  rightd(l) = -(opk*(du2(l)*rr1d+rr1*du2d(l))) - omk*(du3(l)*&
4660 & rr2d+rr2*du3d(l))
4661  right(l) = -(opk*rr1*du2(l)) - omk*rr2*du3(l)
4662  end do
4663  end select
4664 ! in case only a first order scheme must be used for the
4665 ! turbulent transport equations, set the correction for the
4666 ! turbulent kinetic energy to 0.
4667  if (firstorderk) then
4668  leftd(itu1) = 0.0_8
4669  left(itu1) = zero
4670  rightd(itu1) = 0.0_8
4671  right(itu1) = zero
4672  end if
4673 ! for rotational periodic problems transform the velocity
4674 ! differences back to cartesian again. note that now the
4675 ! transpose of the rotation matrix must be used.
4676  if (rotationalperiodic) then
4677 ! left state.
4678  dvxd = leftd(ivx)
4679  dvx = left(ivx)
4680  dvyd = leftd(ivy)
4681  dvy = left(ivy)
4682  dvzd = leftd(ivz)
4683  dvz = left(ivz)
4684  leftd(ivx) = rot(1, 1)*dvxd + rot(2, 1)*dvyd + rot(3, 1)*dvzd
4685  left(ivx) = rot(1, 1)*dvx + rot(2, 1)*dvy + rot(3, 1)*dvz
4686  leftd(ivy) = rot(1, 2)*dvxd + rot(2, 2)*dvyd + rot(3, 2)*dvzd
4687  left(ivy) = rot(1, 2)*dvx + rot(2, 2)*dvy + rot(3, 2)*dvz
4688  leftd(ivz) = rot(1, 3)*dvxd + rot(2, 3)*dvyd + rot(3, 3)*dvzd
4689  left(ivz) = rot(1, 3)*dvx + rot(2, 3)*dvy + rot(3, 3)*dvz
4690 ! right state.
4691  dvxd = rightd(ivx)
4692  dvx = right(ivx)
4693  dvyd = rightd(ivy)
4694  dvy = right(ivy)
4695  dvzd = rightd(ivz)
4696  dvz = right(ivz)
4697  rightd(ivx) = rot(1, 1)*dvxd + rot(2, 1)*dvyd + rot(3, 1)*dvzd
4698  right(ivx) = rot(1, 1)*dvx + rot(2, 1)*dvy + rot(3, 1)*dvz
4699  rightd(ivy) = rot(1, 2)*dvxd + rot(2, 2)*dvyd + rot(3, 2)*dvzd
4700  right(ivy) = rot(1, 2)*dvx + rot(2, 2)*dvy + rot(3, 2)*dvz
4701  rightd(ivz) = rot(1, 3)*dvxd + rot(2, 3)*dvyd + rot(3, 3)*dvzd
4702  right(ivz) = rot(1, 3)*dvx + rot(2, 3)*dvy + rot(3, 3)*dvz
4703  end if
4704  end subroutine leftrightstate_d
4705 
4706 ! ==================================================================
4707  subroutine leftrightstate(du1, du2, du3, rotmatrix, left, right)
4708  implicit none
4709 !
4710 ! local parameter.
4711 !
4712  real(kind=realtype), parameter :: epslim=1.e-10_realtype
4713 !
4714 ! subroutine arguments.
4715 !
4716  real(kind=realtype), dimension(:), intent(inout) :: du1, du2, du3
4717  real(kind=realtype), dimension(:), intent(out) :: left, right
4718  real(kind=realtype), dimension(:, :, :, :, :), pointer :: &
4719 & rotmatrix
4720 !
4721 ! local variables.
4722 !
4723  integer(kind=inttype) :: l
4724  real(kind=realtype) :: rl1, rl2, rr1, rr2, tmp, dvx, dvy, dvz
4725  real(kind=realtype), dimension(3, 3) :: rot
4726  intrinsic abs
4727  intrinsic max
4728  intrinsic sign
4729  intrinsic min
4730  real(kind=realtype) :: x1
4731  real(kind=realtype) :: y1
4732  real(kind=realtype) :: y2
4733  real(kind=realtype) :: x2
4734  real(kind=realtype) :: y3
4735  real(kind=realtype) :: y4
4736  real(kind=realtype) :: x3
4737  real(kind=realtype) :: x4
4738  real(kind=realtype) :: x5
4739  real(kind=realtype) :: x6
4740  real(kind=realtype) :: max2
4741  real(kind=realtype) :: max3
4742  real(kind=realtype) :: max4
4743  real(kind=realtype) :: max5
4744  real(kind=realtype) :: max6
4745  real(kind=realtype) :: max7
4746 ! check if the velocity components should be transformed to
4747 ! the cylindrical frame.
4748  if (rotationalperiodic) then
4749 ! store the rotation matrix a bit easier. note that the i,j,k
4750 ! come from the main subroutine.
4751  rot(1, 1) = rotmatrix(i, j, k, 1, 1)
4752  rot(1, 2) = rotmatrix(i, j, k, 1, 2)
4753  rot(1, 3) = rotmatrix(i, j, k, 1, 3)
4754  rot(2, 1) = rotmatrix(i, j, k, 2, 1)
4755  rot(2, 2) = rotmatrix(i, j, k, 2, 2)
4756  rot(2, 3) = rotmatrix(i, j, k, 2, 3)
4757  rot(3, 1) = rotmatrix(i, j, k, 3, 1)
4758  rot(3, 2) = rotmatrix(i, j, k, 3, 2)
4759  rot(3, 3) = rotmatrix(i, j, k, 3, 3)
4760 ! apply the transformation to the velocity components
4761 ! of du1, du2 and du3.
4762  dvx = du1(ivx)
4763  dvy = du1(ivy)
4764  dvz = du1(ivz)
4765  du1(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
4766  du1(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
4767  du1(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
4768  dvx = du2(ivx)
4769  dvy = du2(ivy)
4770  dvz = du2(ivz)
4771  du2(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
4772  du2(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
4773  du2(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
4774  dvx = du3(ivx)
4775  dvy = du3(ivy)
4776  dvz = du3(ivz)
4777  du3(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
4778  du3(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
4779  du3(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
4780  end if
4781 ! determine the limiter used.
4782  select case (limused)
4783  case (nolimiter)
4784 ! linear interpolation; no limiter.
4785 ! loop over the number of variables to be interpolated.
4786  do l=1,nwint
4787  left(l) = omk*du1(l) + opk*du2(l)
4788  right(l) = -(omk*du3(l)) - opk*du2(l)
4789  end do
4790  case (vanalbeda)
4791 ! ==============================================================
4792 ! nonlinear interpolation using the van albeda limiter.
4793 ! loop over the number of variables to be interpolated.
4794  do l=1,nwint
4795  if (du2(l) .ge. 0.) then
4796  x1 = du2(l)
4797  else
4798  x1 = -du2(l)
4799  end if
4800  if (x1 .lt. epslim) then
4801  max2 = epslim
4802  else
4803  max2 = x1
4804  end if
4805 ! compute the limiter argument rl1, rl2, rr1 and rr2.
4806 ! note the cut off to 0.0.
4807  tmp = one/sign(max2, du2(l))
4808  if (du1(l) .ge. 0.) then
4809  x3 = du1(l)
4810  else
4811  x3 = -du1(l)
4812  end if
4813  if (x3 .lt. epslim) then
4814  max4 = epslim
4815  else
4816  max4 = x3
4817  end if
4818  y1 = du2(l)/sign(max4, du1(l))
4819  if (zero .lt. y1) then
4820  rl1 = y1
4821  else
4822  rl1 = zero
4823  end if
4824  if (zero .lt. du1(l)*tmp) then
4825  rl2 = du1(l)*tmp
4826  else
4827  rl2 = zero
4828  end if
4829  if (zero .lt. du3(l)*tmp) then
4830  rr1 = du3(l)*tmp
4831  else
4832  rr1 = zero
4833  end if
4834  if (du3(l) .ge. 0.) then
4835  x4 = du3(l)
4836  else
4837  x4 = -du3(l)
4838  end if
4839  if (x4 .lt. epslim) then
4840  max5 = epslim
4841  else
4842  max5 = x4
4843  end if
4844  y2 = du2(l)/sign(max5, du3(l))
4845  if (zero .lt. y2) then
4846  rr2 = y2
4847  else
4848  rr2 = zero
4849  end if
4850 ! compute the corresponding limiter values.
4851  rl1 = rl1*(rl1+one)/(rl1*rl1+one)
4852  rl2 = rl2*(rl2+one)/(rl2*rl2+one)
4853  rr1 = rr1*(rr1+one)/(rr1*rr1+one)
4854  rr2 = rr2*(rr2+one)/(rr2*rr2+one)
4855 ! compute the nonlinear corrections to the first order
4856 ! scheme.
4857  left(l) = omk*rl1*du1(l) + opk*rl2*du2(l)
4858  right(l) = -(opk*rr1*du2(l)) - omk*rr2*du3(l)
4859  end do
4860  case (minmod)
4861 ! ==============================================================
4862 ! nonlinear interpolation using the minmod limiter.
4863 ! loop over the number of variables to be interpolated.
4864  do l=1,nwint
4865  if (du2(l) .ge. 0.) then
4866  x2 = du2(l)
4867  else
4868  x2 = -du2(l)
4869  end if
4870  if (x2 .lt. epslim) then
4871  max3 = epslim
4872  else
4873  max3 = x2
4874  end if
4875 ! compute the limiter argument rl1, rl2, rr1 and rr2.
4876 ! note the cut off to 0.0.
4877  tmp = one/sign(max3, du2(l))
4878  if (du1(l) .ge. 0.) then
4879  x5 = du1(l)
4880  else
4881  x5 = -du1(l)
4882  end if
4883  if (x5 .lt. epslim) then
4884  max6 = epslim
4885  else
4886  max6 = x5
4887  end if
4888  y3 = du2(l)/sign(max6, du1(l))
4889  if (zero .lt. y3) then
4890  rl1 = y3
4891  else
4892  rl1 = zero
4893  end if
4894  if (zero .lt. du1(l)*tmp) then
4895  rl2 = du1(l)*tmp
4896  else
4897  rl2 = zero
4898  end if
4899  if (zero .lt. du3(l)*tmp) then
4900  rr1 = du3(l)*tmp
4901  else
4902  rr1 = zero
4903  end if
4904  if (du3(l) .ge. 0.) then
4905  x6 = du3(l)
4906  else
4907  x6 = -du3(l)
4908  end if
4909  if (x6 .lt. epslim) then
4910  max7 = epslim
4911  else
4912  max7 = x6
4913  end if
4914  y4 = du2(l)/sign(max7, du3(l))
4915  if (zero .lt. y4) then
4916  rr2 = y4
4917  else
4918  rr2 = zero
4919  end if
4920  if (one .gt. factminmod*rl1) then
4921  rl1 = factminmod*rl1
4922  else
4923  rl1 = one
4924  end if
4925  if (one .gt. factminmod*rl2) then
4926  rl2 = factminmod*rl2
4927  else
4928  rl2 = one
4929  end if
4930  if (one .gt. factminmod*rr1) then
4931  rr1 = factminmod*rr1
4932  else
4933  rr1 = one
4934  end if
4935  if (one .gt. factminmod*rr2) then
4936  rr2 = factminmod*rr2
4937  else
4938  rr2 = one
4939  end if
4940 ! compute the nonlinear corrections to the first order
4941 ! scheme.
4942  left(l) = omk*rl1*du1(l) + opk*rl2*du2(l)
4943  right(l) = -(opk*rr1*du2(l)) - omk*rr2*du3(l)
4944  end do
4945  end select
4946 ! in case only a first order scheme must be used for the
4947 ! turbulent transport equations, set the correction for the
4948 ! turbulent kinetic energy to 0.
4949  if (firstorderk) then
4950  left(itu1) = zero
4951  right(itu1) = zero
4952  end if
4953 ! for rotational periodic problems transform the velocity
4954 ! differences back to cartesian again. note that now the
4955 ! transpose of the rotation matrix must be used.
4956  if (rotationalperiodic) then
4957 ! left state.
4958  dvx = left(ivx)
4959  dvy = left(ivy)
4960  dvz = left(ivz)
4961  left(ivx) = rot(1, 1)*dvx + rot(2, 1)*dvy + rot(3, 1)*dvz
4962  left(ivy) = rot(1, 2)*dvx + rot(2, 2)*dvy + rot(3, 2)*dvz
4963  left(ivz) = rot(1, 3)*dvx + rot(2, 3)*dvy + rot(3, 3)*dvz
4964 ! right state.
4965  dvx = right(ivx)
4966  dvy = right(ivy)
4967  dvz = right(ivz)
4968  right(ivx) = rot(1, 1)*dvx + rot(2, 1)*dvy + rot(3, 1)*dvz
4969  right(ivy) = rot(1, 2)*dvx + rot(2, 2)*dvy + rot(3, 2)*dvz
4970  right(ivz) = rot(1, 3)*dvx + rot(2, 3)*dvy + rot(3, 3)*dvz
4971  end if
4972  end subroutine leftrightstate
4973 
4974 ! differentiation of riemannflux in forward (tangent) mode (with options i4 dr8 r8):
4975 ! variations of useful results: flux
4976 ! with respect to varying inputs: sface sx sy sz flux left right
4977 ! ================================================================
4978  subroutine riemannflux_d(left, leftd, right, rightd, flux, fluxd)
4979  implicit none
4980 !
4981 ! subroutine arguments.
4982 !
4983  real(kind=realtype), dimension(*), intent(in) :: left, right
4984  real(kind=realtype), dimension(*), intent(in) :: leftd, rightd
4985  real(kind=realtype), dimension(*), intent(out) :: flux
4986  real(kind=realtype), dimension(*), intent(out) :: fluxd
4987 !
4988 ! local variables.
4989 !
4990  real(kind=realtype) :: porflux, rface
4991  real(kind=realtype) :: rfaced
4992  real(kind=realtype) :: etl, etr, z1l, z1r, tmp
4993  real(kind=realtype) :: etld, etrd, z1ld, z1rd, tmpd
4994  real(kind=realtype) :: dr, dru, drv, drw, dre, drk
4995  real(kind=realtype) :: drd, drud, drvd, drwd, dred, drkd
4996  real(kind=realtype) :: ravg, uavg, vavg, wavg, havg, kavg
4997  real(kind=realtype) :: uavgd, vavgd, wavgd, havgd, kavgd
4998  real(kind=realtype) :: alphaavg, a2avg, aavg, unavg
4999  real(kind=realtype) :: alphaavgd, a2avgd, aavgd, unavgd
5000  real(kind=realtype) :: ovaavg, ova2avg, area, eta
5001  real(kind=realtype) :: ovaavgd, ova2avgd, aread, etad
5002  real(kind=realtype) :: gm1, gm53
5003  real(kind=realtype) :: lam1, lam2, lam3
5004  real(kind=realtype) :: lam1d, lam2d, lam3d
5005  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
5006  real(kind=realtype) :: abv1d, abv2d, abv3d, abv4d, abv5d, abv6d, &
5007 & abv7d
5008  real(kind=realtype), dimension(2) :: ktmp
5009  real(kind=realtype), dimension(2) :: ktmpd
5010  intrinsic sqrt
5011  intrinsic max
5012  intrinsic abs
5013  real(kind=realtype) :: x1
5014  real(kind=realtype) :: x1d
5015  real(kind=realtype) :: x2
5016  real(kind=realtype) :: x2d
5017  real(realtype) :: max2
5018  real(realtype) :: max2d
5019  real(kind=realtype) :: abs1
5020  real(kind=realtype) :: abs1d
5021  real(kind=realtype) :: abs2
5022  real(kind=realtype) :: abs2d
5023  real(kind=realtype) :: arg1
5024  real(kind=realtype) :: arg1d
5025  real(kind=realtype) :: result1
5026  real(kind=realtype) :: result1d
5027  real(kind=realtype) :: arg2
5028  real(kind=realtype) :: arg2d
5029  real(kind=realtype) :: result2
5030  real(kind=realtype) :: result2d
5031  real(kind=realtype) :: temp
5032  real(kind=realtype) :: temp0
5033  real(kind=realtype) :: temp1
5034 ! set the porosity for the flux. the default value, 0.5*rfil, is
5035 ! a scaling factor where an rfil != 1 is taken into account.
5036  porflux = half*rfil
5037  if (por .eq. noflux .or. por .eq. boundflux) porflux = zero
5038 ! abbreviate some expressions in which gamma occurs.
5039  gm1 = gammaface - one
5040  gm53 = gammaface - five*third
5041 ! determine which riemann solver must be solved.
5042  select case (riemannused)
5043  case (roe)
5044 ! determine the preconditioner used.
5045  select case (precond)
5046  case (noprecond)
5047 ! no preconditioner used. use the roe scheme of the
5048 ! standard equations.
5049 ! compute the square root of the left and right densities
5050 ! and the inverse of the sum.
5051  temp = sqrt(left(irho))
5052  if (left(irho) .eq. 0.0_8) then
5053  z1ld = 0.0_8
5054  else
5055  z1ld = leftd(irho)/(2.0*temp)
5056  end if
5057  z1l = temp
5058  temp = sqrt(right(irho))
5059  if (right(irho) .eq. 0.0_8) then
5060  z1rd = 0.0_8
5061  else
5062  z1rd = rightd(irho)/(2.0*temp)
5063  end if
5064  z1r = temp
5065  temp = one/(z1l+z1r)
5066  tmpd = -(temp*(z1ld+z1rd)/(z1l+z1r))
5067  tmp = temp
5068 ! compute some variables depending whether or not a
5069 ! k-equation is present.
5070  if (correctfork) then
5071 ! store the left and right kinetic energy in ktmp,
5072 ! which is needed to compute the total energy.
5073  ktmpd = 0.0_8
5074  ktmpd(1) = leftd(itu1)
5075  ktmp(1) = left(itu1)
5076  ktmpd(2) = rightd(itu1)
5077  ktmp(2) = right(itu1)
5078 ! store the difference of the turbulent kinetic energy
5079 ! per unit volume, i.e. the conserved variable.
5080  drkd = right(itu1)*rightd(irho) + right(irho)*rightd(itu1) -&
5081 & left(itu1)*leftd(irho) - left(irho)*leftd(itu1)
5082  drk = right(irho)*right(itu1) - left(irho)*left(itu1)
5083 ! compute the average turbulent energy per unit mass
5084 ! using roe averages.
5085  temp = z1l*left(itu1) + z1r*right(itu1)
5086  kavgd = temp*tmpd + tmp*(left(itu1)*z1ld+z1l*leftd(itu1)+&
5087 & right(itu1)*z1rd+z1r*rightd(itu1))
5088  kavg = tmp*temp
5089  else
5090 ! set the difference of the turbulent kinetic energy
5091 ! per unit volume and the averaged kinetic energy per
5092 ! unit mass to zero.
5093  drk = 0.0
5094  kavg = 0.0
5095  ktmpd = 0.0_8
5096  kavgd = 0.0_8
5097  drkd = 0.0_8
5098  end if
5099 ! compute the total energy of the left and right state.
5100  etld = 0.0_8
5101  call etot_d(left(irho), leftd(irho), left(ivx), leftd(ivx), &
5102 & left(ivy), leftd(ivy), left(ivz), leftd(ivz), left(irhoe&
5103 & ), leftd(irhoe), ktmp(1), ktmpd(1), etl, etld, &
5104 & correctfork)
5105  etrd = 0.0_8
5106  call etot_d(right(irho), rightd(irho), right(ivx), rightd(ivx)&
5107 & , right(ivy), rightd(ivy), right(ivz), rightd(ivz), &
5108 & right(irhoe), rightd(irhoe), ktmp(2), ktmpd(2), etr, &
5109 & etrd, correctfork)
5110 ! compute the difference of the conservative mean
5111 ! flow variables.
5112  drd = rightd(irho) - leftd(irho)
5113  dr = right(irho) - left(irho)
5114  drud = right(ivx)*rightd(irho) + right(irho)*rightd(ivx) - &
5115 & left(ivx)*leftd(irho) - left(irho)*leftd(ivx)
5116  dru = right(irho)*right(ivx) - left(irho)*left(ivx)
5117  drvd = right(ivy)*rightd(irho) + right(irho)*rightd(ivy) - &
5118 & left(ivy)*leftd(irho) - left(irho)*leftd(ivy)
5119  drv = right(irho)*right(ivy) - left(irho)*left(ivy)
5120  drwd = right(ivz)*rightd(irho) + right(irho)*rightd(ivz) - &
5121 & left(ivz)*leftd(irho) - left(irho)*leftd(ivz)
5122  drw = right(irho)*right(ivz) - left(irho)*left(ivz)
5123  dred = etrd - etld
5124  dre = etr - etl
5125 ! compute the roe average variables, which can be
5126 ! computed directly from the average roe vector.
5127  ravg = fourth*(z1r+z1l)**2
5128  temp = z1l*left(ivx) + z1r*right(ivx)
5129  uavgd = temp*tmpd + tmp*(left(ivx)*z1ld+z1l*leftd(ivx)+right(&
5130 & ivx)*z1rd+z1r*rightd(ivx))
5131  uavg = tmp*temp
5132  temp = z1l*left(ivy) + z1r*right(ivy)
5133  vavgd = temp*tmpd + tmp*(left(ivy)*z1ld+z1l*leftd(ivy)+right(&
5134 & ivy)*z1rd+z1r*rightd(ivy))
5135  vavg = tmp*temp
5136  temp = z1l*left(ivz) + z1r*right(ivz)
5137  wavgd = temp*tmpd + tmp*(left(ivz)*z1ld+z1l*leftd(ivz)+right(&
5138 & ivz)*z1rd+z1r*rightd(ivz))
5139  wavg = tmp*temp
5140  temp = (etr+right(irhoe))/z1r
5141  temp0 = (etl+left(irhoe))/z1l
5142  temp1 = temp0 + temp
5143  havgd = temp1*tmpd + tmp*((etld+leftd(irhoe)-temp0*z1ld)/z1l+(&
5144 & etrd+rightd(irhoe)-temp*z1rd)/z1r)
5145  havg = tmp*temp1
5146 ! compute the unit vector and store the area of the
5147 ! normal. also compute the unit normal velocity of the face.
5148  arg1d = 2*sx*sxd + 2*sy*syd + 2*sz*szd
5149  arg1 = sx**2 + sy**2 + sz**2
5150  temp1 = sqrt(arg1)
5151  if (arg1 .eq. 0.0_8) then
5152  aread = 0.0_8
5153  else
5154  aread = arg1d/(2.0*temp1)
5155  end if
5156  area = temp1
5157  if (1.e-25_realtype .lt. area) then
5158  max2d = aread
5159  max2 = area
5160  else
5161  max2 = 1.e-25_realtype
5162  max2d = 0.0_8
5163  end if
5164  tmpd = -(one*max2d/max2**2)
5165  tmp = one/max2
5166  sxd = tmp*sxd + sx*tmpd
5167  sx = sx*tmp
5168  syd = tmp*syd + sy*tmpd
5169  sy = sy*tmp
5170  szd = tmp*szd + sz*tmpd
5171  sz = sz*tmp
5172  rfaced = tmp*sfaced + sface*tmpd
5173  rface = sface*tmp
5174 ! compute some dependent variables at the roe
5175 ! average state.
5176  alphaavgd = half*(2*uavg*uavgd+2*vavg*vavgd+2*wavg*wavgd)
5177  alphaavg = half*(uavg**2+vavg**2+wavg**2)
5178  if (gm1*(havg-alphaavg) - gm53*kavg .ge. 0.) then
5179  a2avgd = gm1*(havgd-alphaavgd) - gm53*kavgd
5180  a2avg = gm1*(havg-alphaavg) - gm53*kavg
5181  else
5182  a2avgd = gm53*kavgd - gm1*(havgd-alphaavgd)
5183  a2avg = -(gm1*(havg-alphaavg)-gm53*kavg)
5184  end if
5185  temp1 = sqrt(a2avg)
5186  if (a2avg .eq. 0.0_8) then
5187  aavgd = 0.0_8
5188  else
5189  aavgd = a2avgd/(2.0*temp1)
5190  end if
5191  aavg = temp1
5192  unavgd = sx*uavgd + uavg*sxd + sy*vavgd + vavg*syd + sz*wavgd &
5193 & + wavg*szd
5194  unavg = uavg*sx + vavg*sy + wavg*sz
5195  ovaavgd = -(one*aavgd/aavg**2)
5196  ovaavg = one/aavg
5197  ova2avgd = -(one*a2avgd/a2avg**2)
5198  ova2avg = one/a2avg
5199 ! set for a boundary the normal velocity to rface, the
5200 ! normal velocity of the boundary.
5201  if (por .eq. boundflux) then
5202  unavgd = rfaced
5203  unavg = rface
5204  end if
5205  x1d = sx*(leftd(ivx)-rightd(ivx)) + (left(ivx)-right(ivx))*sxd&
5206 & + sy*(leftd(ivy)-rightd(ivy)) + (left(ivy)-right(ivy))*syd +&
5207 & sz*(leftd(ivz)-rightd(ivz)) + (left(ivz)-right(ivz))*szd
5208  x1 = (left(ivx)-right(ivx))*sx + (left(ivy)-right(ivy))*sy + (&
5209 & left(ivz)-right(ivz))*sz
5210  if (x1 .ge. 0.) then
5211  abs1d = x1d
5212  abs1 = x1
5213  else
5214  abs1d = -x1d
5215  abs1 = -x1
5216  end if
5217  temp1 = left(irhoe)/left(irho)
5218  arg1d = gammaface*(leftd(irhoe)-temp1*leftd(irho))/left(irho)
5219  arg1 = gammaface*temp1
5220  temp1 = sqrt(arg1)
5221  if (arg1 .eq. 0.0_8) then
5222  result1d = 0.0_8
5223  else
5224  result1d = arg1d/(2.0*temp1)
5225  end if
5226  result1 = temp1
5227  temp1 = right(irhoe)/right(irho)
5228  arg2d = gammaface*(rightd(irhoe)-temp1*rightd(irho))/right(&
5229 & irho)
5230  arg2 = gammaface*temp1
5231  temp1 = sqrt(arg2)
5232  if (arg2 .eq. 0.0_8) then
5233  result2d = 0.0_8
5234  else
5235  result2d = arg2d/(2.0*temp1)
5236  end if
5237  result2 = temp1
5238  x2d = result1d - result2d
5239  x2 = result1 - result2
5240  if (x2 .ge. 0.) then
5241  abs2d = x2d
5242  abs2 = x2
5243  else
5244  abs2d = -x2d
5245  abs2 = -x2
5246  end if
5247 ! compute the coefficient eta for the entropy correction.
5248 ! at the moment a 1d entropy correction is used, which
5249 ! removes expansion shocks. although it also reduces the
5250 ! carbuncle phenomenon, it does not remove it completely.
5251 ! in other to do that a multi-dimensional entropy fix is
5252 ! needed, see sanders et. al, jcp, vol. 145, 1998,
5253 ! pp. 511 - 537. although relatively easy to implement,
5254 ! an efficient implementation requires the storage of
5255 ! all the left and right states, which is rather
5256 ! expensive in terms of memory.
5257  etad = half*(abs1d+abs2d)
5258  eta = half*(abs1+abs2)
5259  if (unavg - rface + aavg .ge. 0.) then
5260  lam1d = unavgd - rfaced + aavgd
5261  lam1 = unavg - rface + aavg
5262  else
5263  lam1d = rfaced - unavgd - aavgd
5264  lam1 = -(unavg-rface+aavg)
5265  end if
5266  if (unavg - rface - aavg .ge. 0.) then
5267  lam2d = unavgd - rfaced - aavgd
5268  lam2 = unavg - rface - aavg
5269  else
5270  lam2d = rfaced - unavgd + aavgd
5271  lam2 = -(unavg-rface-aavg)
5272  end if
5273  if (unavg - rface .ge. 0.) then
5274  lam3d = unavgd - rfaced
5275  lam3 = unavg - rface
5276  else
5277  lam3d = rfaced - unavgd
5278  lam3 = -(unavg-rface)
5279  end if
5280 ! apply the entropy correction to the eigenvalues.
5281  tmp = two*eta
5282  if (lam1 .lt. tmp) then
5283  temp1 = lam1*lam1/eta
5284  lam1d = etad + fourth*(2*lam1*lam1d-temp1*etad)/eta
5285  lam1 = eta + fourth*temp1
5286  end if
5287  if (lam2 .lt. tmp) then
5288  temp1 = lam2*lam2/eta
5289  lam2d = etad + fourth*(2*lam2*lam2d-temp1*etad)/eta
5290  lam2 = eta + fourth*temp1
5291  end if
5292  if (lam3 .lt. tmp) then
5293  temp1 = lam3*lam3/eta
5294  lam3d = etad + fourth*(2*lam3*lam3d-temp1*etad)/eta
5295  lam3 = eta + fourth*temp1
5296  end if
5297 ! multiply the eigenvalues by the area to obtain
5298 ! the correct values for the dissipation term.
5299  lam1d = area*lam1d + lam1*aread
5300  lam1 = lam1*area
5301  lam2d = area*lam2d + lam2*aread
5302  lam2 = lam2*area
5303  lam3d = area*lam3d + lam3*aread
5304  lam3 = lam3*area
5305 ! some abbreviations, which occur quite often in the
5306 ! dissipation terms.
5307  abv1d = half*(lam1d+lam2d)
5308  abv1 = half*(lam1+lam2)
5309  abv2d = half*(lam1d-lam2d)
5310  abv2 = half*(lam1-lam2)
5311  abv3d = abv1d - lam3d
5312  abv3 = abv1 - lam3
5313  abv4d = gm1*(dr*alphaavgd+alphaavg*drd-dru*uavgd-uavg*drud-drv&
5314 & *vavgd-vavg*drvd+dred-drw*wavgd-wavg*drwd) - gm53*drkd
5315  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53&
5316 & *drk
5317  abv5d = dru*sxd + sx*drud + drv*syd + sy*drvd + drw*szd + sz*&
5318 & drwd - dr*unavgd - unavg*drd
5319  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
5320  abv6d = ova2avg*(abv4*abv3d+abv3*abv4d) + abv3*abv4*ova2avgd +&
5321 & ovaavg*(abv5*abv2d+abv2*abv5d) + abv2*abv5*ovaavgd
5322  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
5323  abv7d = ovaavg*(abv4*abv2d+abv2*abv4d) + abv2*abv4*ovaavgd + &
5324 & abv5*abv3d + abv3*abv5d
5325  abv7 = abv2*abv4*ovaavg + abv3*abv5
5326 ! compute the dissipation term, -|a| (wr - wl), which is
5327 ! multiplied by porflux. note that porflux is either
5328 ! 0.0 or 0.5*rfil.
5329  fluxd(irho) = -(porflux*(dr*lam3d+lam3*drd+abv6d))
5330  flux(irho) = -(porflux*(lam3*dr+abv6))
5331  fluxd(imx) = -(porflux*(dru*lam3d+lam3*drud+abv6*uavgd+uavg*&
5332 & abv6d+abv7*sxd+sx*abv7d))
5333  flux(imx) = -(porflux*(lam3*dru+uavg*abv6+sx*abv7))
5334  fluxd(imy) = -(porflux*(drv*lam3d+lam3*drvd+abv6*vavgd+vavg*&
5335 & abv6d+abv7*syd+sy*abv7d))
5336  flux(imy) = -(porflux*(lam3*drv+vavg*abv6+sy*abv7))
5337  fluxd(imz) = -(porflux*(drw*lam3d+lam3*drwd+abv6*wavgd+wavg*&
5338 & abv6d+abv7*szd+sz*abv7d))
5339  flux(imz) = -(porflux*(lam3*drw+wavg*abv6+sz*abv7))
5340  fluxd(irhoe) = -(porflux*(dre*lam3d+lam3*dred+abv6*havgd+havg*&
5341 & abv6d+abv7*unavgd+unavg*abv7d))
5342  flux(irhoe) = -(porflux*(lam3*dre+havg*abv6+unavg*abv7))
5343 ! tmp = max(lam1,lam2,lam3)
5344 ! flux(irho) = -porflux*(tmp*dr)
5345 ! flux(imx) = -porflux*(tmp*dru)
5346 ! flux(imy) = -porflux*(tmp*drv)
5347 ! flux(imz) = -porflux*(tmp*drw)
5348 ! flux(irhoe) = -porflux*(tmp*dre)
5349  case (turkel)
5350  call terminate('riemannflux', &
5351 & 'turkel preconditioner not implemented yet')
5352  case (choimerkle)
5353  call terminate('riemannflux', &
5354 & 'choi merkle preconditioner not implemented yet')
5355  end select
5356  case (vanleer)
5357  call terminate('riemannflux', 'van leer fvs not implemented yet'&
5358 & )
5359  case (ausmdv)
5360  call terminate('riemannflux', 'ausmdv fvs not implemented yet')
5361  end select
5362  end subroutine riemannflux_d
5363 
5364 ! ================================================================
5365  subroutine riemannflux(left, right, flux)
5366  implicit none
5367 !
5368 ! subroutine arguments.
5369 !
5370  real(kind=realtype), dimension(*), intent(in) :: left, right
5371  real(kind=realtype), dimension(*), intent(out) :: flux
5372 !
5373 ! local variables.
5374 !
5375  real(kind=realtype) :: porflux, rface
5376  real(kind=realtype) :: etl, etr, z1l, z1r, tmp
5377  real(kind=realtype) :: dr, dru, drv, drw, dre, drk
5378  real(kind=realtype) :: ravg, uavg, vavg, wavg, havg, kavg
5379  real(kind=realtype) :: alphaavg, a2avg, aavg, unavg
5380  real(kind=realtype) :: ovaavg, ova2avg, area, eta
5381  real(kind=realtype) :: gm1, gm53
5382  real(kind=realtype) :: lam1, lam2, lam3
5383  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
5384  real(kind=realtype), dimension(2) :: ktmp
5385  intrinsic sqrt
5386  intrinsic max
5387  intrinsic abs
5388  real(kind=realtype) :: x1
5389  real(kind=realtype) :: x2
5390  real(realtype) :: max2
5391  real(kind=realtype) :: abs1
5392  real(kind=realtype) :: abs2
5393  real(kind=realtype) :: arg1
5394  real(kind=realtype) :: result1
5395  real(kind=realtype) :: arg2
5396  real(kind=realtype) :: result2
5397 ! set the porosity for the flux. the default value, 0.5*rfil, is
5398 ! a scaling factor where an rfil != 1 is taken into account.
5399  porflux = half*rfil
5400  if (por .eq. noflux .or. por .eq. boundflux) porflux = zero
5401 ! abbreviate some expressions in which gamma occurs.
5402  gm1 = gammaface - one
5403  gm53 = gammaface - five*third
5404 ! determine which riemann solver must be solved.
5405  select case (riemannused)
5406  case (roe)
5407 ! determine the preconditioner used.
5408  select case (precond)
5409  case (noprecond)
5410 ! no preconditioner used. use the roe scheme of the
5411 ! standard equations.
5412 ! compute the square root of the left and right densities
5413 ! and the inverse of the sum.
5414  z1l = sqrt(left(irho))
5415  z1r = sqrt(right(irho))
5416  tmp = one/(z1l+z1r)
5417 ! compute some variables depending whether or not a
5418 ! k-equation is present.
5419  if (correctfork) then
5420 ! store the left and right kinetic energy in ktmp,
5421 ! which is needed to compute the total energy.
5422  ktmp(1) = left(itu1)
5423  ktmp(2) = right(itu1)
5424 ! store the difference of the turbulent kinetic energy
5425 ! per unit volume, i.e. the conserved variable.
5426  drk = right(irho)*right(itu1) - left(irho)*left(itu1)
5427 ! compute the average turbulent energy per unit mass
5428 ! using roe averages.
5429  kavg = tmp*(z1l*left(itu1)+z1r*right(itu1))
5430  else
5431 ! set the difference of the turbulent kinetic energy
5432 ! per unit volume and the averaged kinetic energy per
5433 ! unit mass to zero.
5434  drk = 0.0
5435  kavg = 0.0
5436  end if
5437 ! compute the total energy of the left and right state.
5438  call etot(left(irho), left(ivx), left(ivy), left(ivz), left(&
5439 & irhoe), ktmp(1), etl, correctfork)
5440  call etot(right(irho), right(ivx), right(ivy), right(ivz), &
5441 & right(irhoe), ktmp(2), etr, correctfork)
5442 ! compute the difference of the conservative mean
5443 ! flow variables.
5444  dr = right(irho) - left(irho)
5445  dru = right(irho)*right(ivx) - left(irho)*left(ivx)
5446  drv = right(irho)*right(ivy) - left(irho)*left(ivy)
5447  drw = right(irho)*right(ivz) - left(irho)*left(ivz)
5448  dre = etr - etl
5449 ! compute the roe average variables, which can be
5450 ! computed directly from the average roe vector.
5451  ravg = fourth*(z1r+z1l)**2
5452  uavg = tmp*(z1l*left(ivx)+z1r*right(ivx))
5453  vavg = tmp*(z1l*left(ivy)+z1r*right(ivy))
5454  wavg = tmp*(z1l*left(ivz)+z1r*right(ivz))
5455  havg = tmp*((etl+left(irhoe))/z1l+(etr+right(irhoe))/z1r)
5456 ! compute the unit vector and store the area of the
5457 ! normal. also compute the unit normal velocity of the face.
5458  arg1 = sx**2 + sy**2 + sz**2
5459  area = sqrt(arg1)
5460  if (1.e-25_realtype .lt. area) then
5461  max2 = area
5462  else
5463  max2 = 1.e-25_realtype
5464  end if
5465  tmp = one/max2
5466  sx = sx*tmp
5467  sy = sy*tmp
5468  sz = sz*tmp
5469  rface = sface*tmp
5470 ! compute some dependent variables at the roe
5471 ! average state.
5472  alphaavg = half*(uavg**2+vavg**2+wavg**2)
5473  if (gm1*(havg-alphaavg) - gm53*kavg .ge. 0.) then
5474  a2avg = gm1*(havg-alphaavg) - gm53*kavg
5475  else
5476  a2avg = -(gm1*(havg-alphaavg)-gm53*kavg)
5477  end if
5478  aavg = sqrt(a2avg)
5479  unavg = uavg*sx + vavg*sy + wavg*sz
5480  ovaavg = one/aavg
5481  ova2avg = one/a2avg
5482 ! set for a boundary the normal velocity to rface, the
5483 ! normal velocity of the boundary.
5484  if (por .eq. boundflux) unavg = rface
5485  x1 = (left(ivx)-right(ivx))*sx + (left(ivy)-right(ivy))*sy + (&
5486 & left(ivz)-right(ivz))*sz
5487  if (x1 .ge. 0.) then
5488  abs1 = x1
5489  else
5490  abs1 = -x1
5491  end if
5492  arg1 = gammaface*left(irhoe)/left(irho)
5493  result1 = sqrt(arg1)
5494  arg2 = gammaface*right(irhoe)/right(irho)
5495  result2 = sqrt(arg2)
5496  x2 = result1 - result2
5497  if (x2 .ge. 0.) then
5498  abs2 = x2
5499  else
5500  abs2 = -x2
5501  end if
5502 ! compute the coefficient eta for the entropy correction.
5503 ! at the moment a 1d entropy correction is used, which
5504 ! removes expansion shocks. although it also reduces the
5505 ! carbuncle phenomenon, it does not remove it completely.
5506 ! in other to do that a multi-dimensional entropy fix is
5507 ! needed, see sanders et. al, jcp, vol. 145, 1998,
5508 ! pp. 511 - 537. although relatively easy to implement,
5509 ! an efficient implementation requires the storage of
5510 ! all the left and right states, which is rather
5511 ! expensive in terms of memory.
5512  eta = half*(abs1+abs2)
5513  if (unavg - rface + aavg .ge. 0.) then
5514  lam1 = unavg - rface + aavg
5515  else
5516  lam1 = -(unavg-rface+aavg)
5517  end if
5518  if (unavg - rface - aavg .ge. 0.) then
5519  lam2 = unavg - rface - aavg
5520  else
5521  lam2 = -(unavg-rface-aavg)
5522  end if
5523  if (unavg - rface .ge. 0.) then
5524  lam3 = unavg - rface
5525  else
5526  lam3 = -(unavg-rface)
5527  end if
5528 ! apply the entropy correction to the eigenvalues.
5529  tmp = two*eta
5530  if (lam1 .lt. tmp) lam1 = eta + fourth*lam1*lam1/eta
5531  if (lam2 .lt. tmp) lam2 = eta + fourth*lam2*lam2/eta
5532  if (lam3 .lt. tmp) lam3 = eta + fourth*lam3*lam3/eta
5533 ! multiply the eigenvalues by the area to obtain
5534 ! the correct values for the dissipation term.
5535  lam1 = lam1*area
5536  lam2 = lam2*area
5537  lam3 = lam3*area
5538 ! some abbreviations, which occur quite often in the
5539 ! dissipation terms.
5540  abv1 = half*(lam1+lam2)
5541  abv2 = half*(lam1-lam2)
5542  abv3 = abv1 - lam3
5543  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53&
5544 & *drk
5545  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
5546  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
5547  abv7 = abv2*abv4*ovaavg + abv3*abv5
5548 ! compute the dissipation term, -|a| (wr - wl), which is
5549 ! multiplied by porflux. note that porflux is either
5550 ! 0.0 or 0.5*rfil.
5551  flux(irho) = -(porflux*(lam3*dr+abv6))
5552  flux(imx) = -(porflux*(lam3*dru+uavg*abv6+sx*abv7))
5553  flux(imy) = -(porflux*(lam3*drv+vavg*abv6+sy*abv7))
5554  flux(imz) = -(porflux*(lam3*drw+wavg*abv6+sz*abv7))
5555  flux(irhoe) = -(porflux*(lam3*dre+havg*abv6+unavg*abv7))
5556 ! tmp = max(lam1,lam2,lam3)
5557 ! flux(irho) = -porflux*(tmp*dr)
5558 ! flux(imx) = -porflux*(tmp*dru)
5559 ! flux(imy) = -porflux*(tmp*drv)
5560 ! flux(imz) = -porflux*(tmp*drw)
5561 ! flux(irhoe) = -porflux*(tmp*dre)
5562  case (turkel)
5563  call terminate('riemannflux', &
5564 & 'turkel preconditioner not implemented yet')
5565  case (choimerkle)
5566  call terminate('riemannflux', &
5567 & 'choi merkle preconditioner not implemented yet')
5568  end select
5569  case (vanleer)
5570  call terminate('riemannflux', 'van leer fvs not implemented yet'&
5571 & )
5572  case (ausmdv)
5573  call terminate('riemannflux', 'ausmdv fvs not implemented yet')
5574  end select
5575  end subroutine riemannflux
5576 
5577  end subroutine inviscidupwindflux_d
5578 
5579  subroutine inviscidupwindflux(finegrid)
5580 !
5581 ! inviscidupwindflux computes the artificial dissipation part of
5582 ! the euler fluxes by means of an approximate solution of the 1d
5583 ! riemann problem on the face. for first order schemes,
5584 ! finegrid == .false., the states in the cells are assumed to
5585 ! be constant; for the second order schemes on the fine grid a
5586 ! nonlinear reconstruction of the left and right state is done
5587 ! for which several options exist.
5588 ! it is assumed that the pointers in blockpointers already
5589 ! point to the correct block.
5590 !
5591  use constants
5592  use blockpointers, only : il, jl, kl, ie, je, ke, ib, jb, kb, w, p&
5593 & , pori, porj, pork, fw, gamma, si, sj, sk, indfamilyi, indfamilyj, &
5596 & factfamilyk
5597  use flowvarrefstate, only : kpresent, nw, nwf, rgas, tref
5600  use inputphysics, only : equations
5601  use iteration, only : rfil, currentlevel, groundlevel
5602  use cgnsgrid, only : massflowfamilydiss
5603  use utils_d, only : getcorrectfork, terminate
5604  use flowutils_d, only : etot
5605  implicit none
5606 !
5607 ! subroutine arguments.
5608 !
5609  logical, intent(in) :: finegrid
5610 !
5611 ! local variables.
5612 !
5613  integer(kind=portype) :: por
5614  integer(kind=inttype) :: nwint
5615  integer(kind=inttype) :: i, j, k, ind
5616  integer(kind=inttype) :: limused, riemannused
5617  real(kind=realtype) :: sx, sy, sz, omk, opk, sfil, gammaface
5618  real(kind=realtype) :: factminmod, sface
5619  real(kind=realtype), dimension(nw) :: left, right
5620  real(kind=realtype), dimension(nw) :: du1, du2, du3
5621  real(kind=realtype), dimension(nwf) :: flux
5622  logical :: firstorderk, correctfork, rotationalperiodic
5623  intrinsic abs
5624  intrinsic associated
5625  intrinsic max
5626  real(kind=realtype) :: abs0
5627  real(realtype) :: max1
5628  if (rfil .ge. 0.) then
5629  abs0 = rfil
5630  else
5631  abs0 = -rfil
5632  end if
5633 !
5634 ! check if rfil == 0. if so, the dissipative flux needs not to
5635 ! be computed.
5636  if (abs0 .lt. thresholdreal) then
5637  return
5638  else
5639 ! check if the formulation for rotational periodic problems
5640 ! must be used.
5641  if (associated(rotmatrixi)) then
5642  rotationalperiodic = .true.
5643  else
5644  rotationalperiodic = .false.
5645  end if
5646 ! initialize the dissipative residual to a certain times,
5647 ! possibly zero, the previously stored value. owned cells
5648 ! only, because the halo values do not matter.
5649  sfil = one - rfil
5650  do k=2,kl
5651  do j=2,jl
5652  do i=2,il
5653  fw(i, j, k, irho) = sfil*fw(i, j, k, irho)
5654  fw(i, j, k, imx) = sfil*fw(i, j, k, imx)
5655  fw(i, j, k, imy) = sfil*fw(i, j, k, imy)
5656  fw(i, j, k, imz) = sfil*fw(i, j, k, imz)
5657  fw(i, j, k, irhoe) = sfil*fw(i, j, k, irhoe)
5658  end do
5659  end do
5660  end do
5661 ! determine whether or not the total energy must be corrected
5662 ! for the presence of the turbulent kinetic energy.
5663  correctfork = getcorrectfork()
5664  if (1.e-10_realtype .lt. one - kappacoef) then
5665  max1 = one - kappacoef
5666  else
5667  max1 = 1.e-10_realtype
5668  end if
5669 ! compute the factor used in the minmod limiter.
5670  factminmod = (three-kappacoef)/max1
5671 ! determine the limiter scheme to be used. on the fine grid the
5672 ! user specified scheme is used; on the coarse grid a first order
5673 ! scheme is computed.
5674  limused = firstorder
5675  if (finegrid) limused = limiter
5676 ! lumped diss is true for doing approx pc
5677  if (lumpeddiss) limused = firstorder
5678 ! determine the riemann solver which must be used.
5679  riemannused = riemanncoarse
5680  if (finegrid) riemannused = riemann
5681 ! store 1-kappa and 1+kappa a bit easier and multiply it by 0.25.
5682  omk = fourth*(one-kappacoef)
5683  opk = fourth*(one+kappacoef)
5684 ! initialize sface to zero. this value will be used if the
5685 ! block is not moving.
5686  sface = zero
5687 ! set the number of variables to be interpolated depending
5688 ! whether or not a k-equation is present. if a k-equation is
5689 ! present also set the logical firstorderk. this indicates
5690 ! whether or not only a first order approximation is to be used
5691 ! for the turbulent kinetic energy.
5692  if (correctfork) then
5693  if (orderturb .eq. firstorder) then
5694  nwint = nwf
5695  firstorderk = .true.
5696  else
5697  nwint = itu1
5698  firstorderk = .false.
5699  end if
5700  else
5701  nwint = nwf
5702  firstorderk = .false.
5703  end if
5704 !
5705 ! flux computation. a distinction is made between first and
5706 ! second order schemes to avoid the overhead for the first order
5707 ! scheme.
5708 !
5709  if (limused .eq. firstorder) then
5710 !
5711 ! first order reconstruction. the states in the cells are
5712 ! constant. the left and right states are constructed easily.
5713 !
5714 ! fluxes in the i-direction.
5715  do k=2,kl
5716  do j=2,jl
5717  do i=1,il
5718 ! store the normal vector, the porosity and the
5719 ! mesh velocity if present.
5720  sx = si(i, j, k, 1)
5721  sy = si(i, j, k, 2)
5722  sz = si(i, j, k, 3)
5723  por = pori(i, j, k)
5724  if (addgridvelocities) sface = sfacei(i, j, k)
5725 ! determine the left and right state.
5726  left(irho) = w(i, j, k, irho)
5727  left(ivx) = w(i, j, k, ivx)
5728  left(ivy) = w(i, j, k, ivy)
5729  left(ivz) = w(i, j, k, ivz)
5730  left(irhoe) = p(i, j, k)
5731  if (correctfork) left(itu1) = w(i, j, k, itu1)
5732  right(irho) = w(i+1, j, k, irho)
5733  right(ivx) = w(i+1, j, k, ivx)
5734  right(ivy) = w(i+1, j, k, ivy)
5735  right(ivz) = w(i+1, j, k, ivz)
5736  right(irhoe) = p(i+1, j, k)
5737  if (correctfork) right(itu1) = w(i+1, j, k, itu1)
5738 ! compute the value of gamma on the face. take an
5739 ! arithmetic average of the two states.
5740  gammaface = half*(gamma(i, j, k)+gamma(i+1, j, k))
5741 ! compute the dissipative flux across the interface.
5742  call riemannflux(left, right, flux)
5743 ! and scatter it to the left and right.
5744  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
5745  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
5746  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
5747  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
5748  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
5749  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) - flux(irho)
5750  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) - flux(imx)
5751  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) - flux(imy)
5752  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) - flux(imz)
5753  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) - flux(irhoe)
5754 ! store the density flux in the mass flow of the
5755 ! appropriate sliding mesh interface.
5756  end do
5757  end do
5758  end do
5759 ! fluxes in j-direction.
5760  do k=2,kl
5761  do j=1,jl
5762  do i=2,il
5763 ! store the normal vector, the porosity and the
5764 ! mesh velocity if present.
5765  sx = sj(i, j, k, 1)
5766  sy = sj(i, j, k, 2)
5767  sz = sj(i, j, k, 3)
5768  por = porj(i, j, k)
5769  if (addgridvelocities) sface = sfacej(i, j, k)
5770 ! determine the left and right state.
5771  left(irho) = w(i, j, k, irho)
5772  left(ivx) = w(i, j, k, ivx)
5773  left(ivy) = w(i, j, k, ivy)
5774  left(ivz) = w(i, j, k, ivz)
5775  left(irhoe) = p(i, j, k)
5776  if (correctfork) left(itu1) = w(i, j, k, itu1)
5777  right(irho) = w(i, j+1, k, irho)
5778  right(ivx) = w(i, j+1, k, ivx)
5779  right(ivy) = w(i, j+1, k, ivy)
5780  right(ivz) = w(i, j+1, k, ivz)
5781  right(irhoe) = p(i, j+1, k)
5782  if (correctfork) right(itu1) = w(i, j+1, k, itu1)
5783 ! compute the value of gamma on the face. take an
5784 ! arithmetic average of the two states.
5785  gammaface = half*(gamma(i, j, k)+gamma(i, j+1, k))
5786 ! compute the dissipative flux across the interface.
5787  call riemannflux(left, right, flux)
5788 ! and scatter it to the left and right.
5789  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
5790  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
5791  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
5792  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
5793  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
5794  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) - flux(irho)
5795  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) - flux(imx)
5796  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) - flux(imy)
5797  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) - flux(imz)
5798  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) - flux(irhoe)
5799 ! store the density flux in the mass flow of the
5800 ! appropriate sliding mesh interface.
5801  end do
5802  end do
5803  end do
5804 ! fluxes in k-direction.
5805  do k=1,kl
5806  do j=2,jl
5807  do i=2,il
5808 ! store the normal vector, the porosity and the
5809 ! mesh velocity if present.
5810  sx = sk(i, j, k, 1)
5811  sy = sk(i, j, k, 2)
5812  sz = sk(i, j, k, 3)
5813  por = pork(i, j, k)
5814  if (addgridvelocities) sface = sfacek(i, j, k)
5815 ! determine the left and right state.
5816  left(irho) = w(i, j, k, irho)
5817  left(ivx) = w(i, j, k, ivx)
5818  left(ivy) = w(i, j, k, ivy)
5819  left(ivz) = w(i, j, k, ivz)
5820  left(irhoe) = p(i, j, k)
5821  if (correctfork) left(itu1) = w(i, j, k, itu1)
5822  right(irho) = w(i, j, k+1, irho)
5823  right(ivx) = w(i, j, k+1, ivx)
5824  right(ivy) = w(i, j, k+1, ivy)
5825  right(ivz) = w(i, j, k+1, ivz)
5826  right(irhoe) = p(i, j, k+1)
5827  if (correctfork) right(itu1) = w(i, j, k+1, itu1)
5828 ! compute the value of gamma on the face. take an
5829 ! arithmetic average of the two states.
5830  gammaface = half*(gamma(i, j, k)+gamma(i, j, k+1))
5831 ! compute the dissipative flux across the interface.
5832  call riemannflux(left, right, flux)
5833 ! and scatter it the left and right.
5834  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
5835  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
5836  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
5837  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
5838  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
5839  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) - flux(irho)
5840  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) - flux(imx)
5841  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) - flux(imy)
5842  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) - flux(imz)
5843  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) - flux(irhoe)
5844 ! store the density flux in the mass flow of the
5845 ! appropriate sliding mesh interface.
5846  end do
5847  end do
5848  end do
5849  else
5850 ! ==================================================================
5851 ! ==================================================================
5852 !
5853 ! second order reconstruction of the left and right state.
5854 ! the three differences used in the, possibly nonlinear,
5855 ! interpolation are constructed here; the actual left and
5856 ! right states, or at least the differences from the first
5857 ! order interpolation, are computed in the subroutine
5858 ! leftrightstate.
5859 !
5860 ! fluxes in the i-direction.
5861  do k=2,kl
5862  do j=2,jl
5863  do i=1,il
5864 ! store the three differences used in the interpolation
5865 ! in du1, du2, du3.
5866  du1(irho) = w(i, j, k, irho) - w(i-1, j, k, irho)
5867  du2(irho) = w(i+1, j, k, irho) - w(i, j, k, irho)
5868  du3(irho) = w(i+2, j, k, irho) - w(i+1, j, k, irho)
5869  du1(ivx) = w(i, j, k, ivx) - w(i-1, j, k, ivx)
5870  du2(ivx) = w(i+1, j, k, ivx) - w(i, j, k, ivx)
5871  du3(ivx) = w(i+2, j, k, ivx) - w(i+1, j, k, ivx)
5872  du1(ivy) = w(i, j, k, ivy) - w(i-1, j, k, ivy)
5873  du2(ivy) = w(i+1, j, k, ivy) - w(i, j, k, ivy)
5874  du3(ivy) = w(i+2, j, k, ivy) - w(i+1, j, k, ivy)
5875  du1(ivz) = w(i, j, k, ivz) - w(i-1, j, k, ivz)
5876  du2(ivz) = w(i+1, j, k, ivz) - w(i, j, k, ivz)
5877  du3(ivz) = w(i+2, j, k, ivz) - w(i+1, j, k, ivz)
5878  du1(irhoe) = p(i, j, k) - p(i-1, j, k)
5879  du2(irhoe) = p(i+1, j, k) - p(i, j, k)
5880  du3(irhoe) = p(i+2, j, k) - p(i+1, j, k)
5881  if (correctfork) then
5882  du1(itu1) = w(i, j, k, itu1) - w(i-1, j, k, itu1)
5883  du2(itu1) = w(i+1, j, k, itu1) - w(i, j, k, itu1)
5884  du3(itu1) = w(i+2, j, k, itu1) - w(i+1, j, k, itu1)
5885  end if
5886 ! compute the differences from the first order scheme.
5887  call leftrightstate(du1, du2, du3, rotmatrixi, left, right&
5888 & )
5889 ! add the first order part to the currently stored
5890 ! differences, such that the correct state vector
5891 ! is stored.
5892  left(irho) = left(irho) + w(i, j, k, irho)
5893  left(ivx) = left(ivx) + w(i, j, k, ivx)
5894  left(ivy) = left(ivy) + w(i, j, k, ivy)
5895  left(ivz) = left(ivz) + w(i, j, k, ivz)
5896  left(irhoe) = left(irhoe) + p(i, j, k)
5897  right(irho) = right(irho) + w(i+1, j, k, irho)
5898  right(ivx) = right(ivx) + w(i+1, j, k, ivx)
5899  right(ivy) = right(ivy) + w(i+1, j, k, ivy)
5900  right(ivz) = right(ivz) + w(i+1, j, k, ivz)
5901  right(irhoe) = right(irhoe) + p(i+1, j, k)
5902  if (correctfork) then
5903  left(itu1) = left(itu1) + w(i, j, k, itu1)
5904  right(itu1) = right(itu1) + w(i+1, j, k, itu1)
5905  end if
5906 ! store the normal vector, the porosity and the
5907 ! mesh velocity if present.
5908  sx = si(i, j, k, 1)
5909  sy = si(i, j, k, 2)
5910  sz = si(i, j, k, 3)
5911  por = pori(i, j, k)
5912  if (addgridvelocities) sface = sfacei(i, j, k)
5913 ! compute the value of gamma on the face. take an
5914 ! arithmetic average of the two states.
5915  gammaface = half*(gamma(i, j, k)+gamma(i+1, j, k))
5916 ! compute the dissipative flux across the interface.
5917  call riemannflux(left, right, flux)
5918 ! and scatter it to the left and right.
5919  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
5920  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
5921  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
5922  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
5923  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
5924  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) - flux(irho)
5925  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) - flux(imx)
5926  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) - flux(imy)
5927  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) - flux(imz)
5928  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) - flux(irhoe)
5929 ! store the density flux in the mass flow of the
5930 ! appropriate sliding mesh interface.
5931  end do
5932  end do
5933  end do
5934 ! fluxes in the j-direction.
5935  do k=2,kl
5936  do j=1,jl
5937  do i=2,il
5938 ! store the three differences used in the interpolation
5939 ! in du1, du2, du3.
5940  du1(irho) = w(i, j, k, irho) - w(i, j-1, k, irho)
5941  du2(irho) = w(i, j+1, k, irho) - w(i, j, k, irho)
5942  du3(irho) = w(i, j+2, k, irho) - w(i, j+1, k, irho)
5943  du1(ivx) = w(i, j, k, ivx) - w(i, j-1, k, ivx)
5944  du2(ivx) = w(i, j+1, k, ivx) - w(i, j, k, ivx)
5945  du3(ivx) = w(i, j+2, k, ivx) - w(i, j+1, k, ivx)
5946  du1(ivy) = w(i, j, k, ivy) - w(i, j-1, k, ivy)
5947  du2(ivy) = w(i, j+1, k, ivy) - w(i, j, k, ivy)
5948  du3(ivy) = w(i, j+2, k, ivy) - w(i, j+1, k, ivy)
5949  du1(ivz) = w(i, j, k, ivz) - w(i, j-1, k, ivz)
5950  du2(ivz) = w(i, j+1, k, ivz) - w(i, j, k, ivz)
5951  du3(ivz) = w(i, j+2, k, ivz) - w(i, j+1, k, ivz)
5952  du1(irhoe) = p(i, j, k) - p(i, j-1, k)
5953  du2(irhoe) = p(i, j+1, k) - p(i, j, k)
5954  du3(irhoe) = p(i, j+2, k) - p(i, j+1, k)
5955  if (correctfork) then
5956  du1(itu1) = w(i, j, k, itu1) - w(i, j-1, k, itu1)
5957  du2(itu1) = w(i, j+1, k, itu1) - w(i, j, k, itu1)
5958  du3(itu1) = w(i, j+2, k, itu1) - w(i, j+1, k, itu1)
5959  end if
5960 ! compute the differences from the first order scheme.
5961  call leftrightstate(du1, du2, du3, rotmatrixj, left, right&
5962 & )
5963 ! add the first order part to the currently stored
5964 ! differences, such that the correct state vector
5965 ! is stored.
5966  left(irho) = left(irho) + w(i, j, k, irho)
5967  left(ivx) = left(ivx) + w(i, j, k, ivx)
5968  left(ivy) = left(ivy) + w(i, j, k, ivy)
5969  left(ivz) = left(ivz) + w(i, j, k, ivz)
5970  left(irhoe) = left(irhoe) + p(i, j, k)
5971  right(irho) = right(irho) + w(i, j+1, k, irho)
5972  right(ivx) = right(ivx) + w(i, j+1, k, ivx)
5973  right(ivy) = right(ivy) + w(i, j+1, k, ivy)
5974  right(ivz) = right(ivz) + w(i, j+1, k, ivz)
5975  right(irhoe) = right(irhoe) + p(i, j+1, k)
5976  if (correctfork) then
5977  left(itu1) = left(itu1) + w(i, j, k, itu1)
5978  right(itu1) = right(itu1) + w(i, j+1, k, itu1)
5979  end if
5980 ! store the normal vector, the porosity and the
5981 ! mesh velocity if present.
5982  sx = sj(i, j, k, 1)
5983  sy = sj(i, j, k, 2)
5984  sz = sj(i, j, k, 3)
5985  por = porj(i, j, k)
5986  if (addgridvelocities) sface = sfacej(i, j, k)
5987 ! compute the value of gamma on the face. take an
5988 ! arithmetic average of the two states.
5989  gammaface = half*(gamma(i, j, k)+gamma(i, j+1, k))
5990 ! compute the dissipative flux across the interface.
5991  call riemannflux(left, right, flux)
5992 ! and scatter it to the left and right.
5993  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
5994  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
5995  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
5996  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
5997  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
5998  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) - flux(irho)
5999  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) - flux(imx)
6000  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) - flux(imy)
6001  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) - flux(imz)
6002  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) - flux(irhoe)
6003 ! store the density flux in the mass flow of the
6004 ! appropriate sliding mesh interface.
6005  end do
6006  end do
6007  end do
6008 ! fluxes in the k-direction.
6009  do k=1,kl
6010  do j=2,jl
6011  do i=2,il
6012 ! store the three differences used in the interpolation
6013 ! in du1, du2, du3.
6014  du1(irho) = w(i, j, k, irho) - w(i, j, k-1, irho)
6015  du2(irho) = w(i, j, k+1, irho) - w(i, j, k, irho)
6016  du3(irho) = w(i, j, k+2, irho) - w(i, j, k+1, irho)
6017  du1(ivx) = w(i, j, k, ivx) - w(i, j, k-1, ivx)
6018  du2(ivx) = w(i, j, k+1, ivx) - w(i, j, k, ivx)
6019  du3(ivx) = w(i, j, k+2, ivx) - w(i, j, k+1, ivx)
6020  du1(ivy) = w(i, j, k, ivy) - w(i, j, k-1, ivy)
6021  du2(ivy) = w(i, j, k+1, ivy) - w(i, j, k, ivy)
6022  du3(ivy) = w(i, j, k+2, ivy) - w(i, j, k+1, ivy)
6023  du1(ivz) = w(i, j, k, ivz) - w(i, j, k-1, ivz)
6024  du2(ivz) = w(i, j, k+1, ivz) - w(i, j, k, ivz)
6025  du3(ivz) = w(i, j, k+2, ivz) - w(i, j, k+1, ivz)
6026  du1(irhoe) = p(i, j, k) - p(i, j, k-1)
6027  du2(irhoe) = p(i, j, k+1) - p(i, j, k)
6028  du3(irhoe) = p(i, j, k+2) - p(i, j, k+1)
6029  if (correctfork) then
6030  du1(itu1) = w(i, j, k, itu1) - w(i, j, k-1, itu1)
6031  du2(itu1) = w(i, j, k+1, itu1) - w(i, j, k, itu1)
6032  du3(itu1) = w(i, j, k+2, itu1) - w(i, j, k+1, itu1)
6033  end if
6034 ! compute the differences from the first order scheme.
6035  call leftrightstate(du1, du2, du3, rotmatrixk, left, right&
6036 & )
6037 ! add the first order part to the currently stored
6038 ! differences, such that the correct state vector
6039 ! is stored.
6040  left(irho) = left(irho) + w(i, j, k, irho)
6041  left(ivx) = left(ivx) + w(i, j, k, ivx)
6042  left(ivy) = left(ivy) + w(i, j, k, ivy)
6043  left(ivz) = left(ivz) + w(i, j, k, ivz)
6044  left(irhoe) = left(irhoe) + p(i, j, k)
6045  right(irho) = right(irho) + w(i, j, k+1, irho)
6046  right(ivx) = right(ivx) + w(i, j, k+1, ivx)
6047  right(ivy) = right(ivy) + w(i, j, k+1, ivy)
6048  right(ivz) = right(ivz) + w(i, j, k+1, ivz)
6049  right(irhoe) = right(irhoe) + p(i, j, k+1)
6050  if (correctfork) then
6051  left(itu1) = left(itu1) + w(i, j, k, itu1)
6052  right(itu1) = right(itu1) + w(i, j, k+1, itu1)
6053  end if
6054 ! store the normal vector, the porosity and the
6055 ! mesh velocity if present.
6056  sx = sk(i, j, k, 1)
6057  sy = sk(i, j, k, 2)
6058  sz = sk(i, j, k, 3)
6059  por = pork(i, j, k)
6060  if (addgridvelocities) sface = sfacek(i, j, k)
6061 ! compute the value of gamma on the face. take an
6062 ! arithmetic average of the two states.
6063  gammaface = half*(gamma(i, j, k)+gamma(i, j, k+1))
6064 ! compute the dissipative flux across the interface.
6065  call riemannflux(left, right, flux)
6066 ! and scatter it to the left and right.
6067  fw(i, j, k, irho) = fw(i, j, k, irho) + flux(irho)
6068  fw(i, j, k, imx) = fw(i, j, k, imx) + flux(imx)
6069  fw(i, j, k, imy) = fw(i, j, k, imy) + flux(imy)
6070  fw(i, j, k, imz) = fw(i, j, k, imz) + flux(imz)
6071  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) + flux(irhoe)
6072  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) - flux(irho)
6073  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) - flux(imx)
6074  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) - flux(imy)
6075  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) - flux(imz)
6076  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) - flux(irhoe)
6077 ! store the density flux in the mass flow of the
6078 ! appropriate sliding mesh interface.
6079  end do
6080  end do
6081  end do
6082  end if
6083  end if
6084 
6085  contains
6086 ! ==================================================================
6087  subroutine leftrightstate(du1, du2, du3, rotmatrix, left, right)
6088  implicit none
6089 !
6090 ! local parameter.
6091 !
6092  real(kind=realtype), parameter :: epslim=1.e-10_realtype
6093 !
6094 ! subroutine arguments.
6095 !
6096  real(kind=realtype), dimension(:), intent(inout) :: du1, du2, du3
6097  real(kind=realtype), dimension(:), intent(out) :: left, right
6098  real(kind=realtype), dimension(:, :, :, :, :), pointer :: &
6099 & rotmatrix
6100 !
6101 ! local variables.
6102 !
6103  integer(kind=inttype) :: l
6104  real(kind=realtype) :: rl1, rl2, rr1, rr2, tmp, dvx, dvy, dvz
6105  real(kind=realtype), dimension(3, 3) :: rot
6106  intrinsic abs
6107  intrinsic max
6108  intrinsic sign
6109  intrinsic min
6110  real(kind=realtype) :: x1
6111  real(kind=realtype) :: y1
6112  real(kind=realtype) :: y2
6113  real(kind=realtype) :: x2
6114  real(kind=realtype) :: y3
6115  real(kind=realtype) :: y4
6116  real(kind=realtype) :: x3
6117  real(kind=realtype) :: x4
6118  real(kind=realtype) :: x5
6119  real(kind=realtype) :: x6
6120  real(kind=realtype) :: max2
6121  real(kind=realtype) :: max3
6122  real(kind=realtype) :: max4
6123  real(kind=realtype) :: max5
6124  real(kind=realtype) :: max6
6125  real(kind=realtype) :: max7
6126 ! check if the velocity components should be transformed to
6127 ! the cylindrical frame.
6128  if (rotationalperiodic) then
6129 ! store the rotation matrix a bit easier. note that the i,j,k
6130 ! come from the main subroutine.
6131  rot(1, 1) = rotmatrix(i, j, k, 1, 1)
6132  rot(1, 2) = rotmatrix(i, j, k, 1, 2)
6133  rot(1, 3) = rotmatrix(i, j, k, 1, 3)
6134  rot(2, 1) = rotmatrix(i, j, k, 2, 1)
6135  rot(2, 2) = rotmatrix(i, j, k, 2, 2)
6136  rot(2, 3) = rotmatrix(i, j, k, 2, 3)
6137  rot(3, 1) = rotmatrix(i, j, k, 3, 1)
6138  rot(3, 2) = rotmatrix(i, j, k, 3, 2)
6139  rot(3, 3) = rotmatrix(i, j, k, 3, 3)
6140 ! apply the transformation to the velocity components
6141 ! of du1, du2 and du3.
6142  dvx = du1(ivx)
6143  dvy = du1(ivy)
6144  dvz = du1(ivz)
6145  du1(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
6146  du1(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
6147  du1(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
6148  dvx = du2(ivx)
6149  dvy = du2(ivy)
6150  dvz = du2(ivz)
6151  du2(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
6152  du2(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
6153  du2(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
6154  dvx = du3(ivx)
6155  dvy = du3(ivy)
6156  dvz = du3(ivz)
6157  du3(ivx) = rot(1, 1)*dvx + rot(1, 2)*dvy + rot(1, 3)*dvz
6158  du3(ivy) = rot(2, 1)*dvx + rot(2, 2)*dvy + rot(2, 3)*dvz
6159  du3(ivz) = rot(3, 1)*dvx + rot(3, 2)*dvy + rot(3, 3)*dvz
6160  end if
6161 ! determine the limiter used.
6162  select case (limused)
6163  case (nolimiter)
6164 ! linear interpolation; no limiter.
6165 ! loop over the number of variables to be interpolated.
6166  do l=1,nwint
6167  left(l) = omk*du1(l) + opk*du2(l)
6168  right(l) = -(omk*du3(l)) - opk*du2(l)
6169  end do
6170  case (vanalbeda)
6171 ! ==============================================================
6172 ! nonlinear interpolation using the van albeda limiter.
6173 ! loop over the number of variables to be interpolated.
6174  do l=1,nwint
6175  if (du2(l) .ge. 0.) then
6176  x1 = du2(l)
6177  else
6178  x1 = -du2(l)
6179  end if
6180  if (x1 .lt. epslim) then
6181  max2 = epslim
6182  else
6183  max2 = x1
6184  end if
6185 ! compute the limiter argument rl1, rl2, rr1 and rr2.
6186 ! note the cut off to 0.0.
6187  tmp = one/sign(max2, du2(l))
6188  if (du1(l) .ge. 0.) then
6189  x3 = du1(l)
6190  else
6191  x3 = -du1(l)
6192  end if
6193  if (x3 .lt. epslim) then
6194  max4 = epslim
6195  else
6196  max4 = x3
6197  end if
6198  y1 = du2(l)/sign(max4, du1(l))
6199  if (zero .lt. y1) then
6200  rl1 = y1
6201  else
6202  rl1 = zero
6203  end if
6204  if (zero .lt. du1(l)*tmp) then
6205  rl2 = du1(l)*tmp
6206  else
6207  rl2 = zero
6208  end if
6209  if (zero .lt. du3(l)*tmp) then
6210  rr1 = du3(l)*tmp
6211  else
6212  rr1 = zero
6213  end if
6214  if (du3(l) .ge. 0.) then
6215  x4 = du3(l)
6216  else
6217  x4 = -du3(l)
6218  end if
6219  if (x4 .lt. epslim) then
6220  max5 = epslim
6221  else
6222  max5 = x4
6223  end if
6224  y2 = du2(l)/sign(max5, du3(l))
6225  if (zero .lt. y2) then
6226  rr2 = y2
6227  else
6228  rr2 = zero
6229  end if
6230 ! compute the corresponding limiter values.
6231  rl1 = rl1*(rl1+one)/(rl1*rl1+one)
6232  rl2 = rl2*(rl2+one)/(rl2*rl2+one)
6233  rr1 = rr1*(rr1+one)/(rr1*rr1+one)
6234  rr2 = rr2*(rr2+one)/(rr2*rr2+one)
6235 ! compute the nonlinear corrections to the first order
6236 ! scheme.
6237  left(l) = omk*rl1*du1(l) + opk*rl2*du2(l)
6238  right(l) = -(opk*rr1*du2(l)) - omk*rr2*du3(l)
6239  end do
6240  case (minmod)
6241 ! ==============================================================
6242 ! nonlinear interpolation using the minmod limiter.
6243 ! loop over the number of variables to be interpolated.
6244  do l=1,nwint
6245  if (du2(l) .ge. 0.) then
6246  x2 = du2(l)
6247  else
6248  x2 = -du2(l)
6249  end if
6250  if (x2 .lt. epslim) then
6251  max3 = epslim
6252  else
6253  max3 = x2
6254  end if
6255 ! compute the limiter argument rl1, rl2, rr1 and rr2.
6256 ! note the cut off to 0.0.
6257  tmp = one/sign(max3, du2(l))
6258  if (du1(l) .ge. 0.) then
6259  x5 = du1(l)
6260  else
6261  x5 = -du1(l)
6262  end if
6263  if (x5 .lt. epslim) then
6264  max6 = epslim
6265  else
6266  max6 = x5
6267  end if
6268  y3 = du2(l)/sign(max6, du1(l))
6269  if (zero .lt. y3) then
6270  rl1 = y3
6271  else
6272  rl1 = zero
6273  end if
6274  if (zero .lt. du1(l)*tmp) then
6275  rl2 = du1(l)*tmp
6276  else
6277  rl2 = zero
6278  end if
6279  if (zero .lt. du3(l)*tmp) then
6280  rr1 = du3(l)*tmp
6281  else
6282  rr1 = zero
6283  end if
6284  if (du3(l) .ge. 0.) then
6285  x6 = du3(l)
6286  else
6287  x6 = -du3(l)
6288  end if
6289  if (x6 .lt. epslim) then
6290  max7 = epslim
6291  else
6292  max7 = x6
6293  end if
6294  y4 = du2(l)/sign(max7, du3(l))
6295  if (zero .lt. y4) then
6296  rr2 = y4
6297  else
6298  rr2 = zero
6299  end if
6300  if (one .gt. factminmod*rl1) then
6301  rl1 = factminmod*rl1
6302  else
6303  rl1 = one
6304  end if
6305  if (one .gt. factminmod*rl2) then
6306  rl2 = factminmod*rl2
6307  else
6308  rl2 = one
6309  end if
6310  if (one .gt. factminmod*rr1) then
6311  rr1 = factminmod*rr1
6312  else
6313  rr1 = one
6314  end if
6315  if (one .gt. factminmod*rr2) then
6316  rr2 = factminmod*rr2
6317  else
6318  rr2 = one
6319  end if
6320 ! compute the nonlinear corrections to the first order
6321 ! scheme.
6322  left(l) = omk*rl1*du1(l) + opk*rl2*du2(l)
6323  right(l) = -(opk*rr1*du2(l)) - omk*rr2*du3(l)
6324  end do
6325  end select
6326 ! in case only a first order scheme must be used for the
6327 ! turbulent transport equations, set the correction for the
6328 ! turbulent kinetic energy to 0.
6329  if (firstorderk) then
6330  left(itu1) = zero
6331  right(itu1) = zero
6332  end if
6333 ! for rotational periodic problems transform the velocity
6334 ! differences back to cartesian again. note that now the
6335 ! transpose of the rotation matrix must be used.
6336  if (rotationalperiodic) then
6337 ! left state.
6338  dvx = left(ivx)
6339  dvy = left(ivy)
6340  dvz = left(ivz)
6341  left(ivx) = rot(1, 1)*dvx + rot(2, 1)*dvy + rot(3, 1)*dvz
6342  left(ivy) = rot(1, 2)*dvx + rot(2, 2)*dvy + rot(3, 2)*dvz
6343  left(ivz) = rot(1, 3)*dvx + rot(2, 3)*dvy + rot(3, 3)*dvz
6344 ! right state.
6345  dvx = right(ivx)
6346  dvy = right(ivy)
6347  dvz = right(ivz)
6348  right(ivx) = rot(1, 1)*dvx + rot(2, 1)*dvy + rot(3, 1)*dvz
6349  right(ivy) = rot(1, 2)*dvx + rot(2, 2)*dvy + rot(3, 2)*dvz
6350  right(ivz) = rot(1, 3)*dvx + rot(2, 3)*dvy + rot(3, 3)*dvz
6351  end if
6352  end subroutine leftrightstate
6353 
6354 ! ================================================================
6355  subroutine riemannflux(left, right, flux)
6356  implicit none
6357 !
6358 ! subroutine arguments.
6359 !
6360  real(kind=realtype), dimension(*), intent(in) :: left, right
6361  real(kind=realtype), dimension(*), intent(out) :: flux
6362 !
6363 ! local variables.
6364 !
6365  real(kind=realtype) :: porflux, rface
6366  real(kind=realtype) :: etl, etr, z1l, z1r, tmp
6367  real(kind=realtype) :: dr, dru, drv, drw, dre, drk
6368  real(kind=realtype) :: ravg, uavg, vavg, wavg, havg, kavg
6369  real(kind=realtype) :: alphaavg, a2avg, aavg, unavg
6370  real(kind=realtype) :: ovaavg, ova2avg, area, eta
6371  real(kind=realtype) :: gm1, gm53
6372  real(kind=realtype) :: lam1, lam2, lam3
6373  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
6374  real(kind=realtype), dimension(2) :: ktmp
6375  intrinsic sqrt
6376  intrinsic max
6377  intrinsic abs
6378  real(kind=realtype) :: x1
6379  real(kind=realtype) :: x2
6380  real(realtype) :: max2
6381  real(kind=realtype) :: abs1
6382  real(kind=realtype) :: abs2
6383  real(kind=realtype) :: arg1
6384  real(kind=realtype) :: result1
6385  real(kind=realtype) :: arg2
6386  real(kind=realtype) :: result2
6387 ! set the porosity for the flux. the default value, 0.5*rfil, is
6388 ! a scaling factor where an rfil != 1 is taken into account.
6389  porflux = half*rfil
6390  if (por .eq. noflux .or. por .eq. boundflux) porflux = zero
6391 ! abbreviate some expressions in which gamma occurs.
6392  gm1 = gammaface - one
6393  gm53 = gammaface - five*third
6394 ! determine which riemann solver must be solved.
6395  select case (riemannused)
6396  case (roe)
6397 ! determine the preconditioner used.
6398  select case (precond)
6399  case (noprecond)
6400 ! no preconditioner used. use the roe scheme of the
6401 ! standard equations.
6402 ! compute the square root of the left and right densities
6403 ! and the inverse of the sum.
6404  z1l = sqrt(left(irho))
6405  z1r = sqrt(right(irho))
6406  tmp = one/(z1l+z1r)
6407 ! compute some variables depending whether or not a
6408 ! k-equation is present.
6409  if (correctfork) then
6410 ! store the left and right kinetic energy in ktmp,
6411 ! which is needed to compute the total energy.
6412  ktmp(1) = left(itu1)
6413  ktmp(2) = right(itu1)
6414 ! store the difference of the turbulent kinetic energy
6415 ! per unit volume, i.e. the conserved variable.
6416  drk = right(irho)*right(itu1) - left(irho)*left(itu1)
6417 ! compute the average turbulent energy per unit mass
6418 ! using roe averages.
6419  kavg = tmp*(z1l*left(itu1)+z1r*right(itu1))
6420  else
6421 ! set the difference of the turbulent kinetic energy
6422 ! per unit volume and the averaged kinetic energy per
6423 ! unit mass to zero.
6424  drk = 0.0
6425  kavg = 0.0
6426  end if
6427 ! compute the total energy of the left and right state.
6428  call etot(left(irho), left(ivx), left(ivy), left(ivz), left(&
6429 & irhoe), ktmp(1), etl, correctfork)
6430  call etot(right(irho), right(ivx), right(ivy), right(ivz), &
6431 & right(irhoe), ktmp(2), etr, correctfork)
6432 ! compute the difference of the conservative mean
6433 ! flow variables.
6434  dr = right(irho) - left(irho)
6435  dru = right(irho)*right(ivx) - left(irho)*left(ivx)
6436  drv = right(irho)*right(ivy) - left(irho)*left(ivy)
6437  drw = right(irho)*right(ivz) - left(irho)*left(ivz)
6438  dre = etr - etl
6439 ! compute the roe average variables, which can be
6440 ! computed directly from the average roe vector.
6441  ravg = fourth*(z1r+z1l)**2
6442  uavg = tmp*(z1l*left(ivx)+z1r*right(ivx))
6443  vavg = tmp*(z1l*left(ivy)+z1r*right(ivy))
6444  wavg = tmp*(z1l*left(ivz)+z1r*right(ivz))
6445  havg = tmp*((etl+left(irhoe))/z1l+(etr+right(irhoe))/z1r)
6446 ! compute the unit vector and store the area of the
6447 ! normal. also compute the unit normal velocity of the face.
6448  arg1 = sx**2 + sy**2 + sz**2
6449  area = sqrt(arg1)
6450  if (1.e-25_realtype .lt. area) then
6451  max2 = area
6452  else
6453  max2 = 1.e-25_realtype
6454  end if
6455  tmp = one/max2
6456  sx = sx*tmp
6457  sy = sy*tmp
6458  sz = sz*tmp
6459  rface = sface*tmp
6460 ! compute some dependent variables at the roe
6461 ! average state.
6462  alphaavg = half*(uavg**2+vavg**2+wavg**2)
6463  if (gm1*(havg-alphaavg) - gm53*kavg .ge. 0.) then
6464  a2avg = gm1*(havg-alphaavg) - gm53*kavg
6465  else
6466  a2avg = -(gm1*(havg-alphaavg)-gm53*kavg)
6467  end if
6468  aavg = sqrt(a2avg)
6469  unavg = uavg*sx + vavg*sy + wavg*sz
6470  ovaavg = one/aavg
6471  ova2avg = one/a2avg
6472 ! set for a boundary the normal velocity to rface, the
6473 ! normal velocity of the boundary.
6474  if (por .eq. boundflux) unavg = rface
6475  x1 = (left(ivx)-right(ivx))*sx + (left(ivy)-right(ivy))*sy + (&
6476 & left(ivz)-right(ivz))*sz
6477  if (x1 .ge. 0.) then
6478  abs1 = x1
6479  else
6480  abs1 = -x1
6481  end if
6482  arg1 = gammaface*left(irhoe)/left(irho)
6483  result1 = sqrt(arg1)
6484  arg2 = gammaface*right(irhoe)/right(irho)
6485  result2 = sqrt(arg2)
6486  x2 = result1 - result2
6487  if (x2 .ge. 0.) then
6488  abs2 = x2
6489  else
6490  abs2 = -x2
6491  end if
6492 ! compute the coefficient eta for the entropy correction.
6493 ! at the moment a 1d entropy correction is used, which
6494 ! removes expansion shocks. although it also reduces the
6495 ! carbuncle phenomenon, it does not remove it completely.
6496 ! in other to do that a multi-dimensional entropy fix is
6497 ! needed, see sanders et. al, jcp, vol. 145, 1998,
6498 ! pp. 511 - 537. although relatively easy to implement,
6499 ! an efficient implementation requires the storage of
6500 ! all the left and right states, which is rather
6501 ! expensive in terms of memory.
6502  eta = half*(abs1+abs2)
6503  if (unavg - rface + aavg .ge. 0.) then
6504  lam1 = unavg - rface + aavg
6505  else
6506  lam1 = -(unavg-rface+aavg)
6507  end if
6508  if (unavg - rface - aavg .ge. 0.) then
6509  lam2 = unavg - rface - aavg
6510  else
6511  lam2 = -(unavg-rface-aavg)
6512  end if
6513  if (unavg - rface .ge. 0.) then
6514  lam3 = unavg - rface
6515  else
6516  lam3 = -(unavg-rface)
6517  end if
6518 ! apply the entropy correction to the eigenvalues.
6519  tmp = two*eta
6520  if (lam1 .lt. tmp) lam1 = eta + fourth*lam1*lam1/eta
6521  if (lam2 .lt. tmp) lam2 = eta + fourth*lam2*lam2/eta
6522  if (lam3 .lt. tmp) lam3 = eta + fourth*lam3*lam3/eta
6523 ! multiply the eigenvalues by the area to obtain
6524 ! the correct values for the dissipation term.
6525  lam1 = lam1*area
6526  lam2 = lam2*area
6527  lam3 = lam3*area
6528 ! some abbreviations, which occur quite often in the
6529 ! dissipation terms.
6530  abv1 = half*(lam1+lam2)
6531  abv2 = half*(lam1-lam2)
6532  abv3 = abv1 - lam3
6533  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - gm53&
6534 & *drk
6535  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
6536  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
6537  abv7 = abv2*abv4*ovaavg + abv3*abv5
6538 ! compute the dissipation term, -|a| (wr - wl), which is
6539 ! multiplied by porflux. note that porflux is either
6540 ! 0.0 or 0.5*rfil.
6541  flux(irho) = -(porflux*(lam3*dr+abv6))
6542  flux(imx) = -(porflux*(lam3*dru+uavg*abv6+sx*abv7))
6543  flux(imy) = -(porflux*(lam3*drv+vavg*abv6+sy*abv7))
6544  flux(imz) = -(porflux*(lam3*drw+wavg*abv6+sz*abv7))
6545  flux(irhoe) = -(porflux*(lam3*dre+havg*abv6+unavg*abv7))
6546 ! tmp = max(lam1,lam2,lam3)
6547 ! flux(irho) = -porflux*(tmp*dr)
6548 ! flux(imx) = -porflux*(tmp*dru)
6549 ! flux(imy) = -porflux*(tmp*drv)
6550 ! flux(imz) = -porflux*(tmp*drw)
6551 ! flux(irhoe) = -porflux*(tmp*dre)
6552  case (turkel)
6553  call terminate('riemannflux', &
6554 & 'turkel preconditioner not implemented yet')
6555  case (choimerkle)
6556  call terminate('riemannflux', &
6557 & 'choi merkle preconditioner not implemented yet')
6558  end select
6559  case (vanleer)
6560  call terminate('riemannflux', 'van leer fvs not implemented yet'&
6561 & )
6562  case (ausmdv)
6563  call terminate('riemannflux', 'ausmdv fvs not implemented yet')
6564  end select
6565  end subroutine riemannflux
6566 
6567  end subroutine inviscidupwindflux
6568 
6569 ! differentiation of viscousflux in forward (tangent) mode (with options i4 dr8 r8):
6570 ! variations of useful results: *fw *(*viscsubface.tau) *(*viscsubface.q)
6571 ! with respect to varying inputs: *rev *aa *wx *wy *wz *w *x
6572 ! *rlv *qx *qy *qz *ux *uy *uz *si *sj *sk *vx *vy
6573 ! *vz *fw *(*viscsubface.tau) *(*viscsubface.q)
6574 ! rw status of diff variables: *rev:in *aa:in *wx:in *wy:in *wz:in
6575 ! *w:in *x:in *rlv:in *qx:in *qy:in *qz:in *ux:in
6576 ! *uy:in *uz:in *si:in *sj:in *sk:in *vx:in *vy:in
6577 ! *vz:in *fw:in-out *(*viscsubface.tau):in-out *(*viscsubface.q):in-out
6578 ! plus diff mem management of: rev:in aa:in wx:in wy:in wz:in
6579 ! w:in x:in rlv:in qx:in qy:in qz:in ux:in uy:in
6580 ! uz:in si:in sj:in sk:in vx:in vy:in vz:in fw:in
6581 ! viscsubface:in *viscsubface.tau:in *viscsubface.q:in
6582  subroutine viscousflux_d()
6583 !
6584 ! viscousflux computes the viscous fluxes using a central
6585 ! difference scheme for a block.
6586 ! it is assumed that the pointers in block pointer already point
6587 ! to the correct block.
6588 !
6589  use constants
6590  use blockpointers
6591  use flowvarrefstate
6592  use inputphysics
6593  use iteration
6594  implicit none
6595 !
6596 ! local parameter.
6597 !
6598  real(kind=realtype), parameter :: twothird=two*third
6599  real(kind=realtype), parameter :: xminn=1.e-14_realtype
6600 !
6601 ! local variables.
6602 !
6603  integer(kind=inttype) :: i, j, k, ii
6604  real(kind=realtype) :: rfilv, por, mul, mue, mut, heatcoef
6605  real(kind=realtype) :: muld, mued, mutd, heatcoefd
6606  real(kind=realtype) :: gm1, factlamheat, factturbheat
6607  real(kind=realtype) :: u_x, u_y, u_z, v_x, v_y, v_z, w_x, w_y, w_z
6608  real(kind=realtype) :: u_xd, u_yd, u_zd, v_xd, v_yd, v_zd, w_xd, &
6609 & w_yd, w_zd
6610  real(kind=realtype) :: q_x, q_y, q_z, ubar, vbar, wbar
6611  real(kind=realtype) :: q_xd, q_yd, q_zd, ubard, vbard, wbard
6612  real(kind=realtype) :: corr, ssx, ssy, ssz, ss, fracdiv
6613  real(kind=realtype) :: corrd, ssxd, ssyd, sszd, ssd, fracdivd
6614  real(kind=realtype) :: tauxx, tauyy, tauzz
6615  real(kind=realtype) :: tauxxd, tauyyd, tauzzd
6616  real(kind=realtype) :: tauxy, tauxz, tauyz
6617  real(kind=realtype) :: tauxyd, tauxzd, tauyzd
6618  real(kind=realtype) :: tauxxs, tauyys, tauzzs
6619  real(kind=realtype) :: tauxxsd, tauyysd, tauzzsd
6620  real(kind=realtype) :: tauxys, tauxzs, tauyzs
6621  real(kind=realtype) :: tauxysd, tauxzsd, tauyzsd
6622  real(kind=realtype) :: exx, eyy, ezz
6623  real(kind=realtype) :: exxd, eyyd, ezzd
6624  real(kind=realtype) :: exy, exz, eyz
6625  real(kind=realtype) :: exyd, exzd, eyzd
6626  real(kind=realtype) :: wxy, wxz, wyz, wyx, wzx, wzy
6627  real(kind=realtype) :: wxyd, wxzd, wyzd, wyxd, wzxd, wzyd
6628  real(kind=realtype) :: den, ccr1, fact
6629  real(kind=realtype) :: dend, factd
6630  real(kind=realtype) :: fmx, fmy, fmz, frhoe
6631  real(kind=realtype) :: fmxd, fmyd, fmzd, frhoed
6632  logical :: correctfork, storewalltensor
6633  intrinsic abs
6634  intrinsic sqrt
6635  intrinsic max
6636  real(kind=realtype) :: abs0
6637  real(kind=realtype) :: arg1
6638  real(kind=realtype) :: arg1d
6639  real(kind=realtype) :: result1
6640  real(kind=realtype) :: result1d
6641  real(kind=realtype) :: temp
6642  real(kind=realtype) :: temp0
6643  real(kind=realtype) :: temp1
6644  real(kind=realtype) :: temp2
6645  real(kind=realtype) :: temp3
6646  real(kind=realtype) :: temp4
6647  real(kind=realtype) :: temp5
6648  real(kind=realtype) :: temp6
6649  real(kind=realtype) :: temp7
6650 ! set qcr parameters
6651  ccr1 = 0.3_realtype
6652 ! set rfilv to rfil to indicate that this is the viscous part.
6653 ! if rfilv == 0 the viscous residuals need not to be computed
6654 ! and a return can be made.
6655  rfilv = rfil
6656  if (rfilv .ge. 0.) then
6657  abs0 = rfilv
6658  else
6659  abs0 = -rfilv
6660  end if
6661  if (abs0 .lt. thresholdreal) then
6662  return
6663  else
6664 ! determine whether or not the wall stress tensor and wall heat
6665 ! flux must be stored for viscous walls.
6666  storewalltensor = .false.
6667  if (wallfunctions) then
6668  storewalltensor = .true.
6669  else if (rkstage .eq. 0 .and. currentlevel .eq. groundlevel) then
6670  storewalltensor = .true.
6671  end if
6672 !
6673 ! viscous fluxes in the k-direction.
6674 !
6675  mue = zero
6676  mued = 0.0_8
6677  do k=1,kl
6678  do j=2,jl
6679  do i=2,il
6680 ! set the value of the porosity. if not zero, it is set
6681 ! to average the eddy-viscosity and to take the factor
6682 ! rfilv into account.
6683  por = half*rfilv
6684  if (pork(i, j, k) .eq. noflux) por = zero
6685 ! compute the laminar and (if present) the eddy viscosities
6686 ! multiplied by the porosity. compute the factor in front of
6687 ! the gradients of the speed of sound squared for the heat
6688 ! flux.
6689  muld = por*(rlvd(i, j, k)+rlvd(i, j, k+1))
6690  mul = por*(rlv(i, j, k)+rlv(i, j, k+1))
6691  if (eddymodel) then
6692  mued = por*(revd(i, j, k)+revd(i, j, k+1))
6693  mue = por*(rev(i, j, k)+rev(i, j, k+1))
6694  end if
6695  mutd = muld + mued
6696  mut = mul + mue
6697  gm1 = half*(gamma(i, j, k)+gamma(i, j, k+1)) - one
6698  factlamheat = one/(prandtl*gm1)
6699  factturbheat = one/(prandtlturb*gm1)
6700  heatcoefd = factlamheat*muld + factturbheat*mued
6701  heatcoef = mul*factlamheat + mue*factturbheat
6702 ! compute the gradients at the face by averaging the four
6703 ! nodal values.
6704  u_xd = fourth*(uxd(i-1, j-1, k)+uxd(i, j-1, k)+uxd(i-1, j, k&
6705 & )+uxd(i, j, k))
6706  u_x = fourth*(ux(i-1, j-1, k)+ux(i, j-1, k)+ux(i-1, j, k)+ux&
6707 & (i, j, k))
6708  u_yd = fourth*(uyd(i-1, j-1, k)+uyd(i, j-1, k)+uyd(i-1, j, k&
6709 & )+uyd(i, j, k))
6710  u_y = fourth*(uy(i-1, j-1, k)+uy(i, j-1, k)+uy(i-1, j, k)+uy&
6711 & (i, j, k))
6712  u_zd = fourth*(uzd(i-1, j-1, k)+uzd(i, j-1, k)+uzd(i-1, j, k&
6713 & )+uzd(i, j, k))
6714  u_z = fourth*(uz(i-1, j-1, k)+uz(i, j-1, k)+uz(i-1, j, k)+uz&
6715 & (i, j, k))
6716  v_xd = fourth*(vxd(i-1, j-1, k)+vxd(i, j-1, k)+vxd(i-1, j, k&
6717 & )+vxd(i, j, k))
6718  v_x = fourth*(vx(i-1, j-1, k)+vx(i, j-1, k)+vx(i-1, j, k)+vx&
6719 & (i, j, k))
6720  v_yd = fourth*(vyd(i-1, j-1, k)+vyd(i, j-1, k)+vyd(i-1, j, k&
6721 & )+vyd(i, j, k))
6722  v_y = fourth*(vy(i-1, j-1, k)+vy(i, j-1, k)+vy(i-1, j, k)+vy&
6723 & (i, j, k))
6724  v_zd = fourth*(vzd(i-1, j-1, k)+vzd(i, j-1, k)+vzd(i-1, j, k&
6725 & )+vzd(i, j, k))
6726  v_z = fourth*(vz(i-1, j-1, k)+vz(i, j-1, k)+vz(i-1, j, k)+vz&
6727 & (i, j, k))
6728  w_xd = fourth*(wxd(i-1, j-1, k)+wxd(i, j-1, k)+wxd(i-1, j, k&
6729 & )+wxd(i, j, k))
6730  w_x = fourth*(wx(i-1, j-1, k)+wx(i, j-1, k)+wx(i-1, j, k)+wx&
6731 & (i, j, k))
6732  w_yd = fourth*(wyd(i-1, j-1, k)+wyd(i, j-1, k)+wyd(i-1, j, k&
6733 & )+wyd(i, j, k))
6734  w_y = fourth*(wy(i-1, j-1, k)+wy(i, j-1, k)+wy(i-1, j, k)+wy&
6735 & (i, j, k))
6736  w_zd = fourth*(wzd(i-1, j-1, k)+wzd(i, j-1, k)+wzd(i-1, j, k&
6737 & )+wzd(i, j, k))
6738  w_z = fourth*(wz(i-1, j-1, k)+wz(i, j-1, k)+wz(i-1, j, k)+wz&
6739 & (i, j, k))
6740  q_xd = fourth*(qxd(i-1, j-1, k)+qxd(i, j-1, k)+qxd(i-1, j, k&
6741 & )+qxd(i, j, k))
6742  q_x = fourth*(qx(i-1, j-1, k)+qx(i, j-1, k)+qx(i-1, j, k)+qx&
6743 & (i, j, k))
6744  q_yd = fourth*(qyd(i-1, j-1, k)+qyd(i, j-1, k)+qyd(i-1, j, k&
6745 & )+qyd(i, j, k))
6746  q_y = fourth*(qy(i-1, j-1, k)+qy(i, j-1, k)+qy(i-1, j, k)+qy&
6747 & (i, j, k))
6748  q_zd = fourth*(qzd(i-1, j-1, k)+qzd(i, j-1, k)+qzd(i-1, j, k&
6749 & )+qzd(i, j, k))
6750  q_z = fourth*(qz(i-1, j-1, k)+qz(i, j-1, k)+qz(i-1, j, k)+qz&
6751 & (i, j, k))
6752 ! the gradients in the normal direction are corrected, such
6753 ! that no averaging takes places here.
6754 ! first determine the vector in the direction from the
6755 ! cell center k to cell center k+1.
6756  ssxd = eighth*(xd(i-1, j-1, k+1, 1)-xd(i-1, j-1, k-1, 1)+xd(&
6757 & i-1, j, k+1, 1)-xd(i-1, j, k-1, 1)+xd(i, j-1, k+1, 1)-xd(i&
6758 & , j-1, k-1, 1)+xd(i, j, k+1, 1)-xd(i, j, k-1, 1))
6759  ssx = eighth*(x(i-1, j-1, k+1, 1)-x(i-1, j-1, k-1, 1)+x(i-1&
6760 & , j, k+1, 1)-x(i-1, j, k-1, 1)+x(i, j-1, k+1, 1)-x(i, j-1&
6761 & , k-1, 1)+x(i, j, k+1, 1)-x(i, j, k-1, 1))
6762  ssyd = eighth*(xd(i-1, j-1, k+1, 2)-xd(i-1, j-1, k-1, 2)+xd(&
6763 & i-1, j, k+1, 2)-xd(i-1, j, k-1, 2)+xd(i, j-1, k+1, 2)-xd(i&
6764 & , j-1, k-1, 2)+xd(i, j, k+1, 2)-xd(i, j, k-1, 2))
6765  ssy = eighth*(x(i-1, j-1, k+1, 2)-x(i-1, j-1, k-1, 2)+x(i-1&
6766 & , j, k+1, 2)-x(i-1, j, k-1, 2)+x(i, j-1, k+1, 2)-x(i, j-1&
6767 & , k-1, 2)+x(i, j, k+1, 2)-x(i, j, k-1, 2))
6768  sszd = eighth*(xd(i-1, j-1, k+1, 3)-xd(i-1, j-1, k-1, 3)+xd(&
6769 & i-1, j, k+1, 3)-xd(i-1, j, k-1, 3)+xd(i, j-1, k+1, 3)-xd(i&
6770 & , j-1, k-1, 3)+xd(i, j, k+1, 3)-xd(i, j, k-1, 3))
6771  ssz = eighth*(x(i-1, j-1, k+1, 3)-x(i-1, j-1, k-1, 3)+x(i-1&
6772 & , j, k+1, 3)-x(i-1, j, k-1, 3)+x(i, j-1, k+1, 3)-x(i, j-1&
6773 & , k-1, 3)+x(i, j, k+1, 3)-x(i, j, k-1, 3))
6774 ! determine the length of this vector and create the
6775 ! unit normal.
6776  arg1d = 2*ssx*ssxd + 2*ssy*ssyd + 2*ssz*sszd
6777  arg1 = ssx*ssx + ssy*ssy + ssz*ssz
6778  temp = sqrt(arg1)
6779  if (arg1 .eq. 0.0_8) then
6780  result1d = 0.0_8
6781  else
6782  result1d = arg1d/(2.0*temp)
6783  end if
6784  result1 = temp
6785  ssd = -(one*result1d/result1**2)
6786  ss = one/result1
6787  ssxd = ssx*ssd + ss*ssxd
6788  ssx = ss*ssx
6789  ssyd = ssy*ssd + ss*ssyd
6790  ssy = ss*ssy
6791  sszd = ssz*ssd + ss*sszd
6792  ssz = ss*ssz
6793 ! correct the gradients.
6794  temp = w(i, j, k+1, ivx) - w(i, j, k, ivx)
6795  corrd = ssx*u_xd + u_x*ssxd + ssy*u_yd + u_y*ssyd + ssz*u_zd&
6796 & + u_z*sszd - ss*(wd(i, j, k+1, ivx)-wd(i, j, k, ivx)) - &
6797 & temp*ssd
6798  corr = u_x*ssx + u_y*ssy + u_z*ssz - temp*ss
6799  u_xd = u_xd - ssx*corrd - corr*ssxd
6800  u_x = u_x - corr*ssx
6801  u_yd = u_yd - ssy*corrd - corr*ssyd
6802  u_y = u_y - corr*ssy
6803  u_zd = u_zd - ssz*corrd - corr*sszd
6804  u_z = u_z - corr*ssz
6805  temp = w(i, j, k+1, ivy) - w(i, j, k, ivy)
6806  corrd = ssx*v_xd + v_x*ssxd + ssy*v_yd + v_y*ssyd + ssz*v_zd&
6807 & + v_z*sszd - ss*(wd(i, j, k+1, ivy)-wd(i, j, k, ivy)) - &
6808 & temp*ssd
6809  corr = v_x*ssx + v_y*ssy + v_z*ssz - temp*ss
6810  v_xd = v_xd - ssx*corrd - corr*ssxd
6811  v_x = v_x - corr*ssx
6812  v_yd = v_yd - ssy*corrd - corr*ssyd
6813  v_y = v_y - corr*ssy
6814  v_zd = v_zd - ssz*corrd - corr*sszd
6815  v_z = v_z - corr*ssz
6816  temp = w(i, j, k+1, ivz) - w(i, j, k, ivz)
6817  corrd = ssx*w_xd + w_x*ssxd + ssy*w_yd + w_y*ssyd + ssz*w_zd&
6818 & + w_z*sszd - ss*(wd(i, j, k+1, ivz)-wd(i, j, k, ivz)) - &
6819 & temp*ssd
6820  corr = w_x*ssx + w_y*ssy + w_z*ssz - temp*ss
6821  w_xd = w_xd - ssx*corrd - corr*ssxd
6822  w_x = w_x - corr*ssx
6823  w_yd = w_yd - ssy*corrd - corr*ssyd
6824  w_y = w_y - corr*ssy
6825  w_zd = w_zd - ssz*corrd - corr*sszd
6826  w_z = w_z - corr*ssz
6827  temp = aa(i, j, k+1) - aa(i, j, k)
6828  corrd = ssx*q_xd + q_x*ssxd + ssy*q_yd + q_y*ssyd + ssz*q_zd&
6829 & + q_z*sszd + ss*(aad(i, j, k+1)-aad(i, j, k)) + temp*ssd
6830  corr = q_x*ssx + q_y*ssy + q_z*ssz + temp*ss
6831  q_xd = q_xd - ssx*corrd - corr*ssxd
6832  q_x = q_x - corr*ssx
6833  q_yd = q_yd - ssy*corrd - corr*ssyd
6834  q_y = q_y - corr*ssy
6835  q_zd = q_zd - ssz*corrd - corr*sszd
6836  q_z = q_z - corr*ssz
6837 ! compute the stress tensor and the heat flux vector.
6838 ! we remove the viscosity from the stress tensor (tau)
6839 ! to define taus since we still need to separate between
6840 ! laminar and turbulent stress for qcr.
6841 ! therefore, laminar tau = mue*taus, turbulent
6842 ! tau = mue*taus, and total tau = mut*taus.
6843  fracdivd = twothird*(u_xd+v_yd+w_zd)
6844  fracdiv = twothird*(u_x+v_y+w_z)
6845  tauxxsd = two*u_xd - fracdivd
6846  tauxxs = two*u_x - fracdiv
6847  tauyysd = two*v_yd - fracdivd
6848  tauyys = two*v_y - fracdiv
6849  tauzzsd = two*w_zd - fracdivd
6850  tauzzs = two*w_z - fracdiv
6851  tauxysd = u_yd + v_xd
6852  tauxys = u_y + v_x
6853  tauxzsd = u_zd + w_xd
6854  tauxzs = u_z + w_x
6855  tauyzsd = v_zd + w_yd
6856  tauyzs = v_z + w_y
6857  q_xd = q_x*heatcoefd + heatcoef*q_xd
6858  q_x = heatcoef*q_x
6859  q_yd = q_y*heatcoefd + heatcoef*q_yd
6860  q_y = heatcoef*q_y
6861  q_zd = q_z*heatcoefd + heatcoef*q_zd
6862  q_z = heatcoef*q_z
6863 ! add qcr corrections if necessary
6864  if (useqcr) then
6865 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
6866 !
6867 ! tau_ij,qcr = tau_ij - e_ij
6868 !
6869 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
6870 !
6871 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
6872 !
6873 ! we are computing o_ik as follows:
6874 !
6875 ! o_ik = 2*w_ik/den
6876 !
6877 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
6878 ! compute denominator
6879  arg1d = 2*u_x*u_xd + 2*u_y*u_yd + 2*u_z*u_zd + 2*v_x*v_xd &
6880 & + 2*v_y*v_yd + 2*v_z*v_zd + 2*w_x*w_xd + 2*w_y*w_yd + 2*&
6881 & w_z*w_zd
6882  arg1 = u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
6883 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z
6884  temp = sqrt(arg1)
6885  if (arg1 .eq. 0.0_8) then
6886  dend = 0.0_8
6887  else
6888  dend = arg1d/(2.0*temp)
6889  end if
6890  den = temp
6891  if (den .lt. xminn) then
6892  den = xminn
6893  dend = 0.0_8
6894  else
6895  den = den
6896  end if
6897 ! compute factor that will multiply all tensor components.
6898 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
6899 ! components as well.
6900  factd = ccr1*(mued-mue*dend/den)/den
6901  fact = mue*ccr1/den
6902 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
6903 ! the diagonals of the vorticity tensor components are always zero
6904  wxyd = u_yd - v_xd
6905  wxy = u_y - v_x
6906  wxzd = u_zd - w_xd
6907  wxz = u_z - w_x
6908  wyzd = v_zd - w_yd
6909  wyz = v_z - w_y
6910  wyxd = -wxyd
6911  wyx = -wxy
6912  wzxd = -wxzd
6913  wzx = -wxz
6914  wzyd = -wyzd
6915  wzy = -wyz
6916 ! compute the extra terms of the boussinesq relation
6917  temp = wxy*tauxys + wxz*tauxzs
6918  exxd = two*(temp*factd+fact*(tauxys*wxyd+wxy*tauxysd+&
6919 & tauxzs*wxzd+wxz*tauxzsd))
6920  exx = two*(fact*temp)
6921  temp = wyx*tauxys + wyz*tauyzs
6922  eyyd = two*(temp*factd+fact*(tauxys*wyxd+wyx*tauxysd+&
6923 & tauyzs*wyzd+wyz*tauyzsd))
6924  eyy = two*(fact*temp)
6925  temp = wzx*tauxzs + wzy*tauyzs
6926  ezzd = two*(temp*factd+fact*(tauxzs*wzxd+wzx*tauxzsd+&
6927 & tauyzs*wzyd+wzy*tauyzsd))
6928  ezz = two*(fact*temp)
6929  temp = wxy*tauyys + wxz*tauyzs + wyx*tauxxs + wyz*tauxzs
6930  exyd = temp*factd + fact*(tauyys*wxyd+wxy*tauyysd+tauyzs*&
6931 & wxzd+wxz*tauyzsd+tauxxs*wyxd+wyx*tauxxsd+tauxzs*wyzd+wyz&
6932 & *tauxzsd)
6933  exy = fact*temp
6934  temp = wxy*tauyzs + wxz*tauzzs + wzx*tauxxs + wzy*tauxys
6935  exzd = temp*factd + fact*(tauyzs*wxyd+wxy*tauyzsd+tauzzs*&
6936 & wxzd+wxz*tauzzsd+tauxxs*wzxd+wzx*tauxxsd+tauxys*wzyd+wzy&
6937 & *tauxysd)
6938  exz = fact*temp
6939  temp = wyx*tauxzs + wyz*tauzzs + wzx*tauxys + wzy*tauyys
6940  eyzd = temp*factd + fact*(tauxzs*wyxd+wyx*tauxzsd+tauzzs*&
6941 & wyzd+wyz*tauzzsd+tauxys*wzxd+wzx*tauxysd+tauyys*wzyd+wzy&
6942 & *tauyysd)
6943  eyz = fact*temp
6944 ! apply the total viscosity to the stress tensor and add extra terms
6945  tauxxd = tauxxs*mutd + mut*tauxxsd - exxd
6946  tauxx = mut*tauxxs - exx
6947  tauyyd = tauyys*mutd + mut*tauyysd - eyyd
6948  tauyy = mut*tauyys - eyy
6949  tauzzd = tauzzs*mutd + mut*tauzzsd - ezzd
6950  tauzz = mut*tauzzs - ezz
6951  tauxyd = tauxys*mutd + mut*tauxysd - exyd
6952  tauxy = mut*tauxys - exy
6953  tauxzd = tauxzs*mutd + mut*tauxzsd - exzd
6954  tauxz = mut*tauxzs - exz
6955  tauyzd = tauyzs*mutd + mut*tauyzsd - eyzd
6956  tauyz = mut*tauyzs - eyz
6957  else
6958 ! just apply the total viscosity to the stress tensor
6959  tauxxd = tauxxs*mutd + mut*tauxxsd
6960  tauxx = mut*tauxxs
6961  tauyyd = tauyys*mutd + mut*tauyysd
6962  tauyy = mut*tauyys
6963  tauzzd = tauzzs*mutd + mut*tauzzsd
6964  tauzz = mut*tauzzs
6965  tauxyd = tauxys*mutd + mut*tauxysd
6966  tauxy = mut*tauxys
6967  tauxzd = tauxzs*mutd + mut*tauxzsd
6968  tauxz = mut*tauxzs
6969  tauyzd = tauyzs*mutd + mut*tauyzsd
6970  tauyz = mut*tauyzs
6971  end if
6972 ! compute the average velocities for the face. remember that
6973 ! the velocities are stored and not the momentum.
6974  ubard = half*(wd(i, j, k, ivx)+wd(i, j, k+1, ivx))
6975  ubar = half*(w(i, j, k, ivx)+w(i, j, k+1, ivx))
6976  vbard = half*(wd(i, j, k, ivy)+wd(i, j, k+1, ivy))
6977  vbar = half*(w(i, j, k, ivy)+w(i, j, k+1, ivy))
6978  wbard = half*(wd(i, j, k, ivz)+wd(i, j, k+1, ivz))
6979  wbar = half*(w(i, j, k, ivz)+w(i, j, k+1, ivz))
6980 ! compute the viscous fluxes for this k-face.
6981  temp = sk(i, j, k, 1)
6982  temp0 = sk(i, j, k, 2)
6983  temp1 = sk(i, j, k, 3)
6984  fmxd = temp*tauxxd + tauxx*skd(i, j, k, 1) + temp0*tauxyd + &
6985 & tauxy*skd(i, j, k, 2) + temp1*tauxzd + tauxz*skd(i, j, k, &
6986 & 3)
6987  fmx = tauxx*temp + tauxy*temp0 + tauxz*temp1
6988  temp1 = sk(i, j, k, 1)
6989  temp0 = sk(i, j, k, 2)
6990  temp = sk(i, j, k, 3)
6991  fmyd = temp1*tauxyd + tauxy*skd(i, j, k, 1) + temp0*tauyyd +&
6992 & tauyy*skd(i, j, k, 2) + temp*tauyzd + tauyz*skd(i, j, k, 3&
6993 & )
6994  fmy = tauxy*temp1 + tauyy*temp0 + tauyz*temp
6995  temp1 = sk(i, j, k, 1)
6996  temp0 = sk(i, j, k, 2)
6997  temp = sk(i, j, k, 3)
6998  fmzd = temp1*tauxzd + tauxz*skd(i, j, k, 1) + temp0*tauyzd +&
6999 & tauyz*skd(i, j, k, 2) + temp*tauzzd + tauzz*skd(i, j, k, 3&
7000 & )
7001  fmz = tauxz*temp1 + tauyz*temp0 + tauzz*temp
7002  temp1 = sk(i, j, k, 1)
7003  temp0 = ubar*tauxx + vbar*tauxy + wbar*tauxz
7004  frhoed = temp1*(tauxx*ubard+ubar*tauxxd+tauxy*vbard+vbar*&
7005 & tauxyd+tauxz*wbard+wbar*tauxzd) + temp0*skd(i, j, k, 1)
7006  frhoe = temp0*temp1
7007  temp1 = sk(i, j, k, 2)
7008  temp0 = ubar*tauxy + vbar*tauyy + wbar*tauyz
7009  frhoed = frhoed + temp1*(tauxy*ubard+ubar*tauxyd+tauyy*vbard&
7010 & +vbar*tauyyd+tauyz*wbard+wbar*tauyzd) + temp0*skd(i, j, k&
7011 & , 2)
7012  frhoe = frhoe + temp0*temp1
7013  temp1 = sk(i, j, k, 3)
7014  temp0 = ubar*tauxz + vbar*tauyz + wbar*tauzz
7015  frhoed = frhoed + temp1*(tauxz*ubard+ubar*tauxzd+tauyz*vbard&
7016 & +vbar*tauyzd+tauzz*wbard+wbar*tauzzd) + temp0*skd(i, j, k&
7017 & , 3)
7018  frhoe = frhoe + temp0*temp1
7019  temp1 = sk(i, j, k, 1)
7020  temp0 = sk(i, j, k, 2)
7021  temp = sk(i, j, k, 3)
7022  frhoed = frhoed - temp1*q_xd - q_x*skd(i, j, k, 1) - temp0*&
7023 & q_yd - q_y*skd(i, j, k, 2) - temp*q_zd - q_z*skd(i, j, k, &
7024 & 3)
7025  frhoe = frhoe - q_x*temp1 - q_y*temp0 - q_z*temp
7026 ! update the residuals of cell k and k+1.
7027  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fmxd
7028  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
7029  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fmyd
7030  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
7031  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fmzd
7032  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
7033  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - frhoed
7034  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
7035  fwd(i, j, k+1, imx) = fwd(i, j, k+1, imx) + fmxd
7036  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fmx
7037  fwd(i, j, k+1, imy) = fwd(i, j, k+1, imy) + fmyd
7038  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fmy
7039  fwd(i, j, k+1, imz) = fwd(i, j, k+1, imz) + fmzd
7040  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fmz
7041  fwd(i, j, k+1, irhoe) = fwd(i, j, k+1, irhoe) + frhoed
7042  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + frhoe
7043 ! store the stress tensor and the heat flux vector if this
7044 ! face is part of a viscous subface. both the cases k == 1
7045 ! and k == kl must be tested.
7046  if (k .eq. 1 .and. storewalltensor .and. visckminpointer(i, &
7047 & j) .gt. 0) then
7048 ! we need to index viscsubface with visckminpointer(i,j)
7049 ! since tapenade does not like temporary indexes
7050  viscsubfaced(visckminpointer(i, j))%tau(i, j, 1) = tauxxd
7051  viscsubface(visckminpointer(i, j))%tau(i, j, 1) = tauxx
7052  viscsubfaced(visckminpointer(i, j))%tau(i, j, 2) = tauyyd
7053  viscsubface(visckminpointer(i, j))%tau(i, j, 2) = tauyy
7054  viscsubfaced(visckminpointer(i, j))%tau(i, j, 3) = tauzzd
7055  viscsubface(visckminpointer(i, j))%tau(i, j, 3) = tauzz
7056  viscsubfaced(visckminpointer(i, j))%tau(i, j, 4) = tauxyd
7057  viscsubface(visckminpointer(i, j))%tau(i, j, 4) = tauxy
7058  viscsubfaced(visckminpointer(i, j))%tau(i, j, 5) = tauxzd
7059  viscsubface(visckminpointer(i, j))%tau(i, j, 5) = tauxz
7060  viscsubfaced(visckminpointer(i, j))%tau(i, j, 6) = tauyzd
7061  viscsubface(visckminpointer(i, j))%tau(i, j, 6) = tauyz
7062  viscsubfaced(visckminpointer(i, j))%q(i, j, 1) = q_xd
7063  viscsubface(visckminpointer(i, j))%q(i, j, 1) = q_x
7064  viscsubfaced(visckminpointer(i, j))%q(i, j, 2) = q_yd
7065  viscsubface(visckminpointer(i, j))%q(i, j, 2) = q_y
7066  viscsubfaced(visckminpointer(i, j))%q(i, j, 3) = q_zd
7067  viscsubface(visckminpointer(i, j))%q(i, j, 3) = q_z
7068  end if
7069 ! and the k == kl case.
7070  if (k .eq. kl .and. storewalltensor .and. visckmaxpointer(i&
7071 & , j) .gt. 0) then
7072  viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 1) = tauxxd
7073  viscsubface(visckmaxpointer(i, j))%tau(i, j, 1) = tauxx
7074  viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 2) = tauyyd
7075  viscsubface(visckmaxpointer(i, j))%tau(i, j, 2) = tauyy
7076  viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 3) = tauzzd
7077  viscsubface(visckmaxpointer(i, j))%tau(i, j, 3) = tauzz
7078  viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 4) = tauxyd
7079  viscsubface(visckmaxpointer(i, j))%tau(i, j, 4) = tauxy
7080  viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 5) = tauxzd
7081  viscsubface(visckmaxpointer(i, j))%tau(i, j, 5) = tauxz
7082  viscsubfaced(visckmaxpointer(i, j))%tau(i, j, 6) = tauyzd
7083  viscsubface(visckmaxpointer(i, j))%tau(i, j, 6) = tauyz
7084  viscsubfaced(visckmaxpointer(i, j))%q(i, j, 1) = q_xd
7085  viscsubface(visckmaxpointer(i, j))%q(i, j, 1) = q_x
7086  viscsubfaced(visckmaxpointer(i, j))%q(i, j, 2) = q_yd
7087  viscsubface(visckmaxpointer(i, j))%q(i, j, 2) = q_y
7088  viscsubfaced(visckmaxpointer(i, j))%q(i, j, 3) = q_zd
7089  viscsubface(visckmaxpointer(i, j))%q(i, j, 3) = q_z
7090  end if
7091  end do
7092  end do
7093  end do
7094 !
7095 ! viscous fluxes in the j-direction.
7096 !
7097  mue = zero
7098  mued = 0.0_8
7099  do k=2,kl
7100  do j=1,jl
7101  do i=2,il
7102 ! set the value of the porosity. if not zero, it is set
7103 ! to average the eddy-viscosity and to take the factor
7104 ! rfilv into account.
7105  por = half*rfilv
7106  if (porj(i, j, k) .eq. noflux) por = zero
7107 ! compute the laminar and (if present) the eddy viscosities
7108 ! multiplied by the porosity. compute the factor in front of
7109 ! the gradients of the speed of sound squared for the heat
7110 ! flux.
7111  muld = por*(rlvd(i, j, k)+rlvd(i, j+1, k))
7112  mul = por*(rlv(i, j, k)+rlv(i, j+1, k))
7113  if (eddymodel) then
7114  mued = por*(revd(i, j, k)+revd(i, j+1, k))
7115  mue = por*(rev(i, j, k)+rev(i, j+1, k))
7116  end if
7117  mutd = muld + mued
7118  mut = mul + mue
7119  gm1 = half*(gamma(i, j, k)+gamma(i, j+1, k)) - one
7120  factlamheat = one/(prandtl*gm1)
7121  factturbheat = one/(prandtlturb*gm1)
7122  heatcoefd = factlamheat*muld + factturbheat*mued
7123  heatcoef = mul*factlamheat + mue*factturbheat
7124 ! compute the gradients at the face by averaging the four
7125 ! nodal values.
7126  u_xd = fourth*(uxd(i-1, j, k-1)+uxd(i, j, k-1)+uxd(i-1, j, k&
7127 & )+uxd(i, j, k))
7128  u_x = fourth*(ux(i-1, j, k-1)+ux(i, j, k-1)+ux(i-1, j, k)+ux&
7129 & (i, j, k))
7130  u_yd = fourth*(uyd(i-1, j, k-1)+uyd(i, j, k-1)+uyd(i-1, j, k&
7131 & )+uyd(i, j, k))
7132  u_y = fourth*(uy(i-1, j, k-1)+uy(i, j, k-1)+uy(i-1, j, k)+uy&
7133 & (i, j, k))
7134  u_zd = fourth*(uzd(i-1, j, k-1)+uzd(i, j, k-1)+uzd(i-1, j, k&
7135 & )+uzd(i, j, k))
7136  u_z = fourth*(uz(i-1, j, k-1)+uz(i, j, k-1)+uz(i-1, j, k)+uz&
7137 & (i, j, k))
7138  v_xd = fourth*(vxd(i-1, j, k-1)+vxd(i, j, k-1)+vxd(i-1, j, k&
7139 & )+vxd(i, j, k))
7140  v_x = fourth*(vx(i-1, j, k-1)+vx(i, j, k-1)+vx(i-1, j, k)+vx&
7141 & (i, j, k))
7142  v_yd = fourth*(vyd(i-1, j, k-1)+vyd(i, j, k-1)+vyd(i-1, j, k&
7143 & )+vyd(i, j, k))
7144  v_y = fourth*(vy(i-1, j, k-1)+vy(i, j, k-1)+vy(i-1, j, k)+vy&
7145 & (i, j, k))
7146  v_zd = fourth*(vzd(i-1, j, k-1)+vzd(i, j, k-1)+vzd(i-1, j, k&
7147 & )+vzd(i, j, k))
7148  v_z = fourth*(vz(i-1, j, k-1)+vz(i, j, k-1)+vz(i-1, j, k)+vz&
7149 & (i, j, k))
7150  w_xd = fourth*(wxd(i-1, j, k-1)+wxd(i, j, k-1)+wxd(i-1, j, k&
7151 & )+wxd(i, j, k))
7152  w_x = fourth*(wx(i-1, j, k-1)+wx(i, j, k-1)+wx(i-1, j, k)+wx&
7153 & (i, j, k))
7154  w_yd = fourth*(wyd(i-1, j, k-1)+wyd(i, j, k-1)+wyd(i-1, j, k&
7155 & )+wyd(i, j, k))
7156  w_y = fourth*(wy(i-1, j, k-1)+wy(i, j, k-1)+wy(i-1, j, k)+wy&
7157 & (i, j, k))
7158  w_zd = fourth*(wzd(i-1, j, k-1)+wzd(i, j, k-1)+wzd(i-1, j, k&
7159 & )+wzd(i, j, k))
7160  w_z = fourth*(wz(i-1, j, k-1)+wz(i, j, k-1)+wz(i-1, j, k)+wz&
7161 & (i, j, k))
7162  q_xd = fourth*(qxd(i-1, j, k-1)+qxd(i, j, k-1)+qxd(i-1, j, k&
7163 & )+qxd(i, j, k))
7164  q_x = fourth*(qx(i-1, j, k-1)+qx(i, j, k-1)+qx(i-1, j, k)+qx&
7165 & (i, j, k))
7166  q_yd = fourth*(qyd(i-1, j, k-1)+qyd(i, j, k-1)+qyd(i-1, j, k&
7167 & )+qyd(i, j, k))
7168  q_y = fourth*(qy(i-1, j, k-1)+qy(i, j, k-1)+qy(i-1, j, k)+qy&
7169 & (i, j, k))
7170  q_zd = fourth*(qzd(i-1, j, k-1)+qzd(i, j, k-1)+qzd(i-1, j, k&
7171 & )+qzd(i, j, k))
7172  q_z = fourth*(qz(i-1, j, k-1)+qz(i, j, k-1)+qz(i-1, j, k)+qz&
7173 & (i, j, k))
7174 ! the gradients in the normal direction are corrected, such
7175 ! that no averaging takes places here.
7176 ! first determine the vector in the direction from the
7177 ! cell center j to cell center j+1.
7178  ssxd = eighth*(xd(i-1, j+1, k-1, 1)-xd(i-1, j-1, k-1, 1)+xd(&
7179 & i-1, j+1, k, 1)-xd(i-1, j-1, k, 1)+xd(i, j+1, k-1, 1)-xd(i&
7180 & , j-1, k-1, 1)+xd(i, j+1, k, 1)-xd(i, j-1, k, 1))
7181  ssx = eighth*(x(i-1, j+1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i-1&
7182 & , j+1, k, 1)-x(i-1, j-1, k, 1)+x(i, j+1, k-1, 1)-x(i, j-1&
7183 & , k-1, 1)+x(i, j+1, k, 1)-x(i, j-1, k, 1))
7184  ssyd = eighth*(xd(i-1, j+1, k-1, 2)-xd(i-1, j-1, k-1, 2)+xd(&
7185 & i-1, j+1, k, 2)-xd(i-1, j-1, k, 2)+xd(i, j+1, k-1, 2)-xd(i&
7186 & , j-1, k-1, 2)+xd(i, j+1, k, 2)-xd(i, j-1, k, 2))
7187  ssy = eighth*(x(i-1, j+1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i-1&
7188 & , j+1, k, 2)-x(i-1, j-1, k, 2)+x(i, j+1, k-1, 2)-x(i, j-1&
7189 & , k-1, 2)+x(i, j+1, k, 2)-x(i, j-1, k, 2))
7190  sszd = eighth*(xd(i-1, j+1, k-1, 3)-xd(i-1, j-1, k-1, 3)+xd(&
7191 & i-1, j+1, k, 3)-xd(i-1, j-1, k, 3)+xd(i, j+1, k-1, 3)-xd(i&
7192 & , j-1, k-1, 3)+xd(i, j+1, k, 3)-xd(i, j-1, k, 3))
7193  ssz = eighth*(x(i-1, j+1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i-1&
7194 & , j+1, k, 3)-x(i-1, j-1, k, 3)+x(i, j+1, k-1, 3)-x(i, j-1&
7195 & , k-1, 3)+x(i, j+1, k, 3)-x(i, j-1, k, 3))
7196 ! determine the length of this vector and create the
7197 ! unit normal.
7198  arg1d = 2*ssx*ssxd + 2*ssy*ssyd + 2*ssz*sszd
7199  arg1 = ssx*ssx + ssy*ssy + ssz*ssz
7200  temp1 = sqrt(arg1)
7201  if (arg1 .eq. 0.0_8) then
7202  result1d = 0.0_8
7203  else
7204  result1d = arg1d/(2.0*temp1)
7205  end if
7206  result1 = temp1
7207  ssd = -(one*result1d/result1**2)
7208  ss = one/result1
7209  ssxd = ssx*ssd + ss*ssxd
7210  ssx = ss*ssx
7211  ssyd = ssy*ssd + ss*ssyd
7212  ssy = ss*ssy
7213  sszd = ssz*ssd + ss*sszd
7214  ssz = ss*ssz
7215 ! correct the gradients.
7216  temp1 = w(i, j+1, k, ivx) - w(i, j, k, ivx)
7217  corrd = ssx*u_xd + u_x*ssxd + ssy*u_yd + u_y*ssyd + ssz*u_zd&
7218 & + u_z*sszd - ss*(wd(i, j+1, k, ivx)-wd(i, j, k, ivx)) - &
7219 & temp1*ssd
7220  corr = u_x*ssx + u_y*ssy + u_z*ssz - temp1*ss
7221  u_xd = u_xd - ssx*corrd - corr*ssxd
7222  u_x = u_x - corr*ssx
7223  u_yd = u_yd - ssy*corrd - corr*ssyd
7224  u_y = u_y - corr*ssy
7225  u_zd = u_zd - ssz*corrd - corr*sszd
7226  u_z = u_z - corr*ssz
7227  temp1 = w(i, j+1, k, ivy) - w(i, j, k, ivy)
7228  corrd = ssx*v_xd + v_x*ssxd + ssy*v_yd + v_y*ssyd + ssz*v_zd&
7229 & + v_z*sszd - ss*(wd(i, j+1, k, ivy)-wd(i, j, k, ivy)) - &
7230 & temp1*ssd
7231  corr = v_x*ssx + v_y*ssy + v_z*ssz - temp1*ss
7232  v_xd = v_xd - ssx*corrd - corr*ssxd
7233  v_x = v_x - corr*ssx
7234  v_yd = v_yd - ssy*corrd - corr*ssyd
7235  v_y = v_y - corr*ssy
7236  v_zd = v_zd - ssz*corrd - corr*sszd
7237  v_z = v_z - corr*ssz
7238  temp1 = w(i, j+1, k, ivz) - w(i, j, k, ivz)
7239  corrd = ssx*w_xd + w_x*ssxd + ssy*w_yd + w_y*ssyd + ssz*w_zd&
7240 & + w_z*sszd - ss*(wd(i, j+1, k, ivz)-wd(i, j, k, ivz)) - &
7241 & temp1*ssd
7242  corr = w_x*ssx + w_y*ssy + w_z*ssz - temp1*ss
7243  w_xd = w_xd - ssx*corrd - corr*ssxd
7244  w_x = w_x - corr*ssx
7245  w_yd = w_yd - ssy*corrd - corr*ssyd
7246  w_y = w_y - corr*ssy
7247  w_zd = w_zd - ssz*corrd - corr*sszd
7248  w_z = w_z - corr*ssz
7249  temp1 = aa(i, j+1, k) - aa(i, j, k)
7250  corrd = ssx*q_xd + q_x*ssxd + ssy*q_yd + q_y*ssyd + ssz*q_zd&
7251 & + q_z*sszd + ss*(aad(i, j+1, k)-aad(i, j, k)) + temp1*ssd
7252  corr = q_x*ssx + q_y*ssy + q_z*ssz + temp1*ss
7253  q_xd = q_xd - ssx*corrd - corr*ssxd
7254  q_x = q_x - corr*ssx
7255  q_yd = q_yd - ssy*corrd - corr*ssyd
7256  q_y = q_y - corr*ssy
7257  q_zd = q_zd - ssz*corrd - corr*sszd
7258  q_z = q_z - corr*ssz
7259 ! compute the stress tensor and the heat flux vector.
7260 ! we remove the viscosity from the stress tensor (tau)
7261 ! to define taus since we still need to separate between
7262 ! laminar and turbulent stress for qcr.
7263 ! therefore, laminar tau = mue*taus, turbulent
7264 ! tau = mue*taus, and total tau = mut*taus.
7265  fracdivd = twothird*(u_xd+v_yd+w_zd)
7266  fracdiv = twothird*(u_x+v_y+w_z)
7267  tauxxsd = two*u_xd - fracdivd
7268  tauxxs = two*u_x - fracdiv
7269  tauyysd = two*v_yd - fracdivd
7270  tauyys = two*v_y - fracdiv
7271  tauzzsd = two*w_zd - fracdivd
7272  tauzzs = two*w_z - fracdiv
7273  tauxysd = u_yd + v_xd
7274  tauxys = u_y + v_x
7275  tauxzsd = u_zd + w_xd
7276  tauxzs = u_z + w_x
7277  tauyzsd = v_zd + w_yd
7278  tauyzs = v_z + w_y
7279  q_xd = q_x*heatcoefd + heatcoef*q_xd
7280  q_x = heatcoef*q_x
7281  q_yd = q_y*heatcoefd + heatcoef*q_yd
7282  q_y = heatcoef*q_y
7283  q_zd = q_z*heatcoefd + heatcoef*q_zd
7284  q_z = heatcoef*q_z
7285 ! add qcr corrections if necessary
7286  if (useqcr) then
7287 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
7288 !
7289 ! tau_ij,qcr = tau_ij - e_ij
7290 !
7291 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
7292 !
7293 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
7294 !
7295 ! we are computing o_ik as follows:
7296 !
7297 ! o_ik = 2*w_ik/den
7298 !
7299 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
7300 ! compute denominator
7301  arg1d = 2*u_x*u_xd + 2*u_y*u_yd + 2*u_z*u_zd + 2*v_x*v_xd &
7302 & + 2*v_y*v_yd + 2*v_z*v_zd + 2*w_x*w_xd + 2*w_y*w_yd + 2*&
7303 & w_z*w_zd
7304  arg1 = u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
7305 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z
7306  temp1 = sqrt(arg1)
7307  if (arg1 .eq. 0.0_8) then
7308  dend = 0.0_8
7309  else
7310  dend = arg1d/(2.0*temp1)
7311  end if
7312  den = temp1
7313  if (den .lt. xminn) then
7314  den = xminn
7315  dend = 0.0_8
7316  else
7317  den = den
7318  end if
7319 ! compute factor that will multiply all tensor components.
7320 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
7321 ! components as well.
7322  factd = ccr1*(mued-mue*dend/den)/den
7323  fact = mue*ccr1/den
7324 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
7325 ! the diagonals of the vorticity tensor components are always zero
7326  wxyd = u_yd - v_xd
7327  wxy = u_y - v_x
7328  wxzd = u_zd - w_xd
7329  wxz = u_z - w_x
7330  wyzd = v_zd - w_yd
7331  wyz = v_z - w_y
7332  wyxd = -wxyd
7333  wyx = -wxy
7334  wzxd = -wxzd
7335  wzx = -wxz
7336  wzyd = -wyzd
7337  wzy = -wyz
7338 ! compute the extra terms of the boussinesq relation
7339  temp1 = wxy*tauxys + wxz*tauxzs
7340  exxd = two*(temp1*factd+fact*(tauxys*wxyd+wxy*tauxysd+&
7341 & tauxzs*wxzd+wxz*tauxzsd))
7342  exx = two*(fact*temp1)
7343  temp1 = wyx*tauxys + wyz*tauyzs
7344  eyyd = two*(temp1*factd+fact*(tauxys*wyxd+wyx*tauxysd+&
7345 & tauyzs*wyzd+wyz*tauyzsd))
7346  eyy = two*(fact*temp1)
7347  temp1 = wzx*tauxzs + wzy*tauyzs
7348  ezzd = two*(temp1*factd+fact*(tauxzs*wzxd+wzx*tauxzsd+&
7349 & tauyzs*wzyd+wzy*tauyzsd))
7350  ezz = two*(fact*temp1)
7351  temp1 = wxy*tauyys + wxz*tauyzs + wyx*tauxxs + wyz*tauxzs
7352  exyd = temp1*factd + fact*(tauyys*wxyd+wxy*tauyysd+tauyzs*&
7353 & wxzd+wxz*tauyzsd+tauxxs*wyxd+wyx*tauxxsd+tauxzs*wyzd+wyz&
7354 & *tauxzsd)
7355  exy = fact*temp1
7356  temp1 = wxy*tauyzs + wxz*tauzzs + wzx*tauxxs + wzy*tauxys
7357  exzd = temp1*factd + fact*(tauyzs*wxyd+wxy*tauyzsd+tauzzs*&
7358 & wxzd+wxz*tauzzsd+tauxxs*wzxd+wzx*tauxxsd+tauxys*wzyd+wzy&
7359 & *tauxysd)
7360  exz = fact*temp1
7361  temp1 = wyx*tauxzs + wyz*tauzzs + wzx*tauxys + wzy*tauyys
7362  eyzd = temp1*factd + fact*(tauxzs*wyxd+wyx*tauxzsd+tauzzs*&
7363 & wyzd+wyz*tauzzsd+tauxys*wzxd+wzx*tauxysd+tauyys*wzyd+wzy&
7364 & *tauyysd)
7365  eyz = fact*temp1
7366 ! apply the total viscosity to the stress tensor and add extra terms
7367  tauxxd = tauxxs*mutd + mut*tauxxsd - exxd
7368  tauxx = mut*tauxxs - exx
7369  tauyyd = tauyys*mutd + mut*tauyysd - eyyd
7370  tauyy = mut*tauyys - eyy
7371  tauzzd = tauzzs*mutd + mut*tauzzsd - ezzd
7372  tauzz = mut*tauzzs - ezz
7373  tauxyd = tauxys*mutd + mut*tauxysd - exyd
7374  tauxy = mut*tauxys - exy
7375  tauxzd = tauxzs*mutd + mut*tauxzsd - exzd
7376  tauxz = mut*tauxzs - exz
7377  tauyzd = tauyzs*mutd + mut*tauyzsd - eyzd
7378  tauyz = mut*tauyzs - eyz
7379  else
7380 ! just apply the total viscosity to the stress tensor
7381  tauxxd = tauxxs*mutd + mut*tauxxsd
7382  tauxx = mut*tauxxs
7383  tauyyd = tauyys*mutd + mut*tauyysd
7384  tauyy = mut*tauyys
7385  tauzzd = tauzzs*mutd + mut*tauzzsd
7386  tauzz = mut*tauzzs
7387  tauxyd = tauxys*mutd + mut*tauxysd
7388  tauxy = mut*tauxys
7389  tauxzd = tauxzs*mutd + mut*tauxzsd
7390  tauxz = mut*tauxzs
7391  tauyzd = tauyzs*mutd + mut*tauyzsd
7392  tauyz = mut*tauyzs
7393  end if
7394 ! compute the average velocities for the face. remember that
7395 ! the velocities are stored and not the momentum.
7396  ubard = half*(wd(i, j, k, ivx)+wd(i, j+1, k, ivx))
7397  ubar = half*(w(i, j, k, ivx)+w(i, j+1, k, ivx))
7398  vbard = half*(wd(i, j, k, ivy)+wd(i, j+1, k, ivy))
7399  vbar = half*(w(i, j, k, ivy)+w(i, j+1, k, ivy))
7400  wbard = half*(wd(i, j, k, ivz)+wd(i, j+1, k, ivz))
7401  wbar = half*(w(i, j, k, ivz)+w(i, j+1, k, ivz))
7402 ! compute the viscous fluxes for this j-face.
7403  temp1 = sj(i, j, k, 1)
7404  temp0 = sj(i, j, k, 2)
7405  temp = sj(i, j, k, 3)
7406  fmxd = temp1*tauxxd + tauxx*sjd(i, j, k, 1) + temp0*tauxyd +&
7407 & tauxy*sjd(i, j, k, 2) + temp*tauxzd + tauxz*sjd(i, j, k, 3&
7408 & )
7409  fmx = tauxx*temp1 + tauxy*temp0 + tauxz*temp
7410  temp1 = sj(i, j, k, 1)
7411  temp0 = sj(i, j, k, 2)
7412  temp = sj(i, j, k, 3)
7413  fmyd = temp1*tauxyd + tauxy*sjd(i, j, k, 1) + temp0*tauyyd +&
7414 & tauyy*sjd(i, j, k, 2) + temp*tauyzd + tauyz*sjd(i, j, k, 3&
7415 & )
7416  fmy = tauxy*temp1 + tauyy*temp0 + tauyz*temp
7417  temp1 = sj(i, j, k, 1)
7418  temp0 = sj(i, j, k, 2)
7419  temp = sj(i, j, k, 3)
7420  fmzd = temp1*tauxzd + tauxz*sjd(i, j, k, 1) + temp0*tauyzd +&
7421 & tauyz*sjd(i, j, k, 2) + temp*tauzzd + tauzz*sjd(i, j, k, 3&
7422 & )
7423  fmz = tauxz*temp1 + tauyz*temp0 + tauzz*temp
7424  temp1 = sj(i, j, k, 1)
7425  temp0 = ubar*tauxx + vbar*tauxy + wbar*tauxz
7426  temp = sj(i, j, k, 2)
7427  temp2 = ubar*tauxy + vbar*tauyy + wbar*tauyz
7428  temp3 = sj(i, j, k, 3)
7429  temp4 = ubar*tauxz + vbar*tauyz + wbar*tauzz
7430  temp5 = sj(i, j, k, 1)
7431  temp6 = sj(i, j, k, 2)
7432  temp7 = sj(i, j, k, 3)
7433  frhoed = temp1*(tauxx*ubard+ubar*tauxxd+tauxy*vbard+vbar*&
7434 & tauxyd+tauxz*wbard+wbar*tauxzd) + (temp0-q_x)*sjd(i, j, k&
7435 & , 1) + temp*(tauxy*ubard+ubar*tauxyd+tauyy*vbard+vbar*&
7436 & tauyyd+tauyz*wbard+wbar*tauyzd) + (temp2-q_y)*sjd(i, j, k&
7437 & , 2) + temp3*(tauxz*ubard+ubar*tauxzd+tauyz*vbard+vbar*&
7438 & tauyzd+tauzz*wbard+wbar*tauzzd) + (temp4-q_z)*sjd(i, j, k&
7439 & , 3) - temp5*q_xd - temp6*q_yd - temp7*q_zd
7440  frhoe = temp0*temp1 + temp2*temp + temp4*temp3 - q_x*temp5 -&
7441 & q_y*temp6 - q_z*temp7
7442 ! update the residuals of cell j and j+1.
7443  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fmxd
7444  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
7445  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fmyd
7446  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
7447  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fmzd
7448  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
7449  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - frhoed
7450  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
7451  fwd(i, j+1, k, imx) = fwd(i, j+1, k, imx) + fmxd
7452  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fmx
7453  fwd(i, j+1, k, imy) = fwd(i, j+1, k, imy) + fmyd
7454  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fmy
7455  fwd(i, j+1, k, imz) = fwd(i, j+1, k, imz) + fmzd
7456  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fmz
7457  fwd(i, j+1, k, irhoe) = fwd(i, j+1, k, irhoe) + frhoed
7458  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + frhoe
7459 ! store the stress tensor and the heat flux vector if this
7460 ! face is part of a viscous subface. both the cases j == 1
7461 ! and j == jl must be tested.
7462  if (j .eq. 1 .and. storewalltensor .and. viscjminpointer(i, &
7463 & k) .gt. 0) then
7464 ! we need to index viscsubface with viscjminpointer(i,k)
7465 ! since tapenade does not like temporary indexes
7466  viscsubfaced(viscjminpointer(i, k))%tau(i, k, 1) = tauxxd
7467  viscsubface(viscjminpointer(i, k))%tau(i, k, 1) = tauxx
7468  viscsubfaced(viscjminpointer(i, k))%tau(i, k, 2) = tauyyd
7469  viscsubface(viscjminpointer(i, k))%tau(i, k, 2) = tauyy
7470  viscsubfaced(viscjminpointer(i, k))%tau(i, k, 3) = tauzzd
7471  viscsubface(viscjminpointer(i, k))%tau(i, k, 3) = tauzz
7472  viscsubfaced(viscjminpointer(i, k))%tau(i, k, 4) = tauxyd
7473  viscsubface(viscjminpointer(i, k))%tau(i, k, 4) = tauxy
7474  viscsubfaced(viscjminpointer(i, k))%tau(i, k, 5) = tauxzd
7475  viscsubface(viscjminpointer(i, k))%tau(i, k, 5) = tauxz
7476  viscsubfaced(viscjminpointer(i, k))%tau(i, k, 6) = tauyzd
7477  viscsubface(viscjminpointer(i, k))%tau(i, k, 6) = tauyz
7478  viscsubfaced(viscjminpointer(i, k))%q(i, k, 1) = q_xd
7479  viscsubface(viscjminpointer(i, k))%q(i, k, 1) = q_x
7480  viscsubfaced(viscjminpointer(i, k))%q(i, k, 2) = q_yd
7481  viscsubface(viscjminpointer(i, k))%q(i, k, 2) = q_y
7482  viscsubfaced(viscjminpointer(i, k))%q(i, k, 3) = q_zd
7483  viscsubface(viscjminpointer(i, k))%q(i, k, 3) = q_z
7484  end if
7485 ! and the j == jl case.
7486  if (j .eq. jl .and. storewalltensor .and. viscjmaxpointer(i&
7487 & , k) .gt. 0) then
7488  viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 1) = tauxxd
7489  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 1) = tauxx
7490  viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 2) = tauyyd
7491  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 2) = tauyy
7492  viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 3) = tauzzd
7493  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 3) = tauzz
7494  viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 4) = tauxyd
7495  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 4) = tauxy
7496  viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 5) = tauxzd
7497  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 5) = tauxz
7498  viscsubfaced(viscjmaxpointer(i, k))%tau(i, k, 6) = tauyzd
7499  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 6) = tauyz
7500  viscsubfaced(viscjmaxpointer(i, k))%q(i, k, 1) = q_xd
7501  viscsubface(viscjmaxpointer(i, k))%q(i, k, 1) = q_x
7502  viscsubfaced(viscjmaxpointer(i, k))%q(i, k, 2) = q_yd
7503  viscsubface(viscjmaxpointer(i, k))%q(i, k, 2) = q_y
7504  viscsubfaced(viscjmaxpointer(i, k))%q(i, k, 3) = q_zd
7505  viscsubface(viscjmaxpointer(i, k))%q(i, k, 3) = q_z
7506  end if
7507  end do
7508  end do
7509  end do
7510 !
7511 ! viscous fluxes in the i-direction.
7512 !
7513  mue = zero
7514  mued = 0.0_8
7515  do k=2,kl
7516  do j=2,jl
7517  do i=1,il
7518 ! set the value of the porosity. if not zero, it is set
7519 ! to average the eddy-viscosity and to take the factor
7520 ! rfilv into account.
7521  por = half*rfilv
7522  if (pori(i, j, k) .eq. noflux) por = zero
7523 ! compute the laminar and (if present) the eddy viscosities
7524 ! multiplied the porosity. compute the factor in front of
7525 ! the gradients of the speed of sound squared for the heat
7526 ! flux.
7527  muld = por*(rlvd(i, j, k)+rlvd(i+1, j, k))
7528  mul = por*(rlv(i, j, k)+rlv(i+1, j, k))
7529  if (eddymodel) then
7530  mued = por*(revd(i, j, k)+revd(i+1, j, k))
7531  mue = por*(rev(i, j, k)+rev(i+1, j, k))
7532  end if
7533  mutd = muld + mued
7534  mut = mul + mue
7535  gm1 = half*(gamma(i, j, k)+gamma(i+1, j, k)) - one
7536  factlamheat = one/(prandtl*gm1)
7537  factturbheat = one/(prandtlturb*gm1)
7538  heatcoefd = factlamheat*muld + factturbheat*mued
7539  heatcoef = mul*factlamheat + mue*factturbheat
7540 ! compute the gradients at the face by averaging the four
7541 ! nodal values.
7542  u_xd = fourth*(uxd(i, j-1, k-1)+uxd(i, j, k-1)+uxd(i, j-1, k&
7543 & )+uxd(i, j, k))
7544  u_x = fourth*(ux(i, j-1, k-1)+ux(i, j, k-1)+ux(i, j-1, k)+ux&
7545 & (i, j, k))
7546  u_yd = fourth*(uyd(i, j-1, k-1)+uyd(i, j, k-1)+uyd(i, j-1, k&
7547 & )+uyd(i, j, k))
7548  u_y = fourth*(uy(i, j-1, k-1)+uy(i, j, k-1)+uy(i, j-1, k)+uy&
7549 & (i, j, k))
7550  u_zd = fourth*(uzd(i, j-1, k-1)+uzd(i, j, k-1)+uzd(i, j-1, k&
7551 & )+uzd(i, j, k))
7552  u_z = fourth*(uz(i, j-1, k-1)+uz(i, j, k-1)+uz(i, j-1, k)+uz&
7553 & (i, j, k))
7554  v_xd = fourth*(vxd(i, j-1, k-1)+vxd(i, j, k-1)+vxd(i, j-1, k&
7555 & )+vxd(i, j, k))
7556  v_x = fourth*(vx(i, j-1, k-1)+vx(i, j, k-1)+vx(i, j-1, k)+vx&
7557 & (i, j, k))
7558  v_yd = fourth*(vyd(i, j-1, k-1)+vyd(i, j, k-1)+vyd(i, j-1, k&
7559 & )+vyd(i, j, k))
7560  v_y = fourth*(vy(i, j-1, k-1)+vy(i, j, k-1)+vy(i, j-1, k)+vy&
7561 & (i, j, k))
7562  v_zd = fourth*(vzd(i, j-1, k-1)+vzd(i, j, k-1)+vzd(i, j-1, k&
7563 & )+vzd(i, j, k))
7564  v_z = fourth*(vz(i, j-1, k-1)+vz(i, j, k-1)+vz(i, j-1, k)+vz&
7565 & (i, j, k))
7566  w_xd = fourth*(wxd(i, j-1, k-1)+wxd(i, j, k-1)+wxd(i, j-1, k&
7567 & )+wxd(i, j, k))
7568  w_x = fourth*(wx(i, j-1, k-1)+wx(i, j, k-1)+wx(i, j-1, k)+wx&
7569 & (i, j, k))
7570  w_yd = fourth*(wyd(i, j-1, k-1)+wyd(i, j, k-1)+wyd(i, j-1, k&
7571 & )+wyd(i, j, k))
7572  w_y = fourth*(wy(i, j-1, k-1)+wy(i, j, k-1)+wy(i, j-1, k)+wy&
7573 & (i, j, k))
7574  w_zd = fourth*(wzd(i, j-1, k-1)+wzd(i, j, k-1)+wzd(i, j-1, k&
7575 & )+wzd(i, j, k))
7576  w_z = fourth*(wz(i, j-1, k-1)+wz(i, j, k-1)+wz(i, j-1, k)+wz&
7577 & (i, j, k))
7578  q_xd = fourth*(qxd(i, j-1, k-1)+qxd(i, j, k-1)+qxd(i, j-1, k&
7579 & )+qxd(i, j, k))
7580  q_x = fourth*(qx(i, j-1, k-1)+qx(i, j, k-1)+qx(i, j-1, k)+qx&
7581 & (i, j, k))
7582  q_yd = fourth*(qyd(i, j-1, k-1)+qyd(i, j, k-1)+qyd(i, j-1, k&
7583 & )+qyd(i, j, k))
7584  q_y = fourth*(qy(i, j-1, k-1)+qy(i, j, k-1)+qy(i, j-1, k)+qy&
7585 & (i, j, k))
7586  q_zd = fourth*(qzd(i, j-1, k-1)+qzd(i, j, k-1)+qzd(i, j-1, k&
7587 & )+qzd(i, j, k))
7588  q_z = fourth*(qz(i, j-1, k-1)+qz(i, j, k-1)+qz(i, j-1, k)+qz&
7589 & (i, j, k))
7590 ! the gradients in the normal direction are corrected, such
7591 ! that no averaging takes places here.
7592 ! first determine the vector in the direction from the
7593 ! cell center i to cell center i+1.
7594  ssxd = eighth*(xd(i+1, j-1, k-1, 1)-xd(i-1, j-1, k-1, 1)+xd(&
7595 & i+1, j-1, k, 1)-xd(i-1, j-1, k, 1)+xd(i+1, j, k-1, 1)-xd(i&
7596 & -1, j, k-1, 1)+xd(i+1, j, k, 1)-xd(i-1, j, k, 1))
7597  ssx = eighth*(x(i+1, j-1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i+1&
7598 & , j-1, k, 1)-x(i-1, j-1, k, 1)+x(i+1, j, k-1, 1)-x(i-1, j&
7599 & , k-1, 1)+x(i+1, j, k, 1)-x(i-1, j, k, 1))
7600  ssyd = eighth*(xd(i+1, j-1, k-1, 2)-xd(i-1, j-1, k-1, 2)+xd(&
7601 & i+1, j-1, k, 2)-xd(i-1, j-1, k, 2)+xd(i+1, j, k-1, 2)-xd(i&
7602 & -1, j, k-1, 2)+xd(i+1, j, k, 2)-xd(i-1, j, k, 2))
7603  ssy = eighth*(x(i+1, j-1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i+1&
7604 & , j-1, k, 2)-x(i-1, j-1, k, 2)+x(i+1, j, k-1, 2)-x(i-1, j&
7605 & , k-1, 2)+x(i+1, j, k, 2)-x(i-1, j, k, 2))
7606  sszd = eighth*(xd(i+1, j-1, k-1, 3)-xd(i-1, j-1, k-1, 3)+xd(&
7607 & i+1, j-1, k, 3)-xd(i-1, j-1, k, 3)+xd(i+1, j, k-1, 3)-xd(i&
7608 & -1, j, k-1, 3)+xd(i+1, j, k, 3)-xd(i-1, j, k, 3))
7609  ssz = eighth*(x(i+1, j-1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i+1&
7610 & , j-1, k, 3)-x(i-1, j-1, k, 3)+x(i+1, j, k-1, 3)-x(i-1, j&
7611 & , k-1, 3)+x(i+1, j, k, 3)-x(i-1, j, k, 3))
7612 ! determine the length of this vector and create the
7613 ! unit normal.
7614  arg1d = 2*ssx*ssxd + 2*ssy*ssyd + 2*ssz*sszd
7615  arg1 = ssx*ssx + ssy*ssy + ssz*ssz
7616  temp7 = sqrt(arg1)
7617  if (arg1 .eq. 0.0_8) then
7618  result1d = 0.0_8
7619  else
7620  result1d = arg1d/(2.0*temp7)
7621  end if
7622  result1 = temp7
7623  ssd = -(one*result1d/result1**2)
7624  ss = one/result1
7625  ssxd = ssx*ssd + ss*ssxd
7626  ssx = ss*ssx
7627  ssyd = ssy*ssd + ss*ssyd
7628  ssy = ss*ssy
7629  sszd = ssz*ssd + ss*sszd
7630  ssz = ss*ssz
7631 ! correct the gradients.
7632  temp7 = w(i+1, j, k, ivx) - w(i, j, k, ivx)
7633  corrd = ssx*u_xd + u_x*ssxd + ssy*u_yd + u_y*ssyd + ssz*u_zd&
7634 & + u_z*sszd - ss*(wd(i+1, j, k, ivx)-wd(i, j, k, ivx)) - &
7635 & temp7*ssd
7636  corr = u_x*ssx + u_y*ssy + u_z*ssz - temp7*ss
7637  u_xd = u_xd - ssx*corrd - corr*ssxd
7638  u_x = u_x - corr*ssx
7639  u_yd = u_yd - ssy*corrd - corr*ssyd
7640  u_y = u_y - corr*ssy
7641  u_zd = u_zd - ssz*corrd - corr*sszd
7642  u_z = u_z - corr*ssz
7643  temp7 = w(i+1, j, k, ivy) - w(i, j, k, ivy)
7644  corrd = ssx*v_xd + v_x*ssxd + ssy*v_yd + v_y*ssyd + ssz*v_zd&
7645 & + v_z*sszd - ss*(wd(i+1, j, k, ivy)-wd(i, j, k, ivy)) - &
7646 & temp7*ssd
7647  corr = v_x*ssx + v_y*ssy + v_z*ssz - temp7*ss
7648  v_xd = v_xd - ssx*corrd - corr*ssxd
7649  v_x = v_x - corr*ssx
7650  v_yd = v_yd - ssy*corrd - corr*ssyd
7651  v_y = v_y - corr*ssy
7652  v_zd = v_zd - ssz*corrd - corr*sszd
7653  v_z = v_z - corr*ssz
7654  temp7 = w(i+1, j, k, ivz) - w(i, j, k, ivz)
7655  corrd = ssx*w_xd + w_x*ssxd + ssy*w_yd + w_y*ssyd + ssz*w_zd&
7656 & + w_z*sszd - ss*(wd(i+1, j, k, ivz)-wd(i, j, k, ivz)) - &
7657 & temp7*ssd
7658  corr = w_x*ssx + w_y*ssy + w_z*ssz - temp7*ss
7659  w_xd = w_xd - ssx*corrd - corr*ssxd
7660  w_x = w_x - corr*ssx
7661  w_yd = w_yd - ssy*corrd - corr*ssyd
7662  w_y = w_y - corr*ssy
7663  w_zd = w_zd - ssz*corrd - corr*sszd
7664  w_z = w_z - corr*ssz
7665  temp7 = aa(i+1, j, k) - aa(i, j, k)
7666  corrd = ssx*q_xd + q_x*ssxd + ssy*q_yd + q_y*ssyd + ssz*q_zd&
7667 & + q_z*sszd + ss*(aad(i+1, j, k)-aad(i, j, k)) + temp7*ssd
7668  corr = q_x*ssx + q_y*ssy + q_z*ssz + temp7*ss
7669  q_xd = q_xd - ssx*corrd - corr*ssxd
7670  q_x = q_x - corr*ssx
7671  q_yd = q_yd - ssy*corrd - corr*ssyd
7672  q_y = q_y - corr*ssy
7673  q_zd = q_zd - ssz*corrd - corr*sszd
7674  q_z = q_z - corr*ssz
7675 ! compute the stress tensor and the heat flux vector.
7676 ! we remove the viscosity from the stress tensor (tau)
7677 ! to define taus since we still need to separate between
7678 ! laminar and turbulent stress for qcr.
7679 ! therefore, laminar tau = mue*taus, turbulent
7680 ! tau = mue*taus, and total tau = mut*taus.
7681  fracdivd = twothird*(u_xd+v_yd+w_zd)
7682  fracdiv = twothird*(u_x+v_y+w_z)
7683  tauxxsd = two*u_xd - fracdivd
7684  tauxxs = two*u_x - fracdiv
7685  tauyysd = two*v_yd - fracdivd
7686  tauyys = two*v_y - fracdiv
7687  tauzzsd = two*w_zd - fracdivd
7688  tauzzs = two*w_z - fracdiv
7689  tauxysd = u_yd + v_xd
7690  tauxys = u_y + v_x
7691  tauxzsd = u_zd + w_xd
7692  tauxzs = u_z + w_x
7693  tauyzsd = v_zd + w_yd
7694  tauyzs = v_z + w_y
7695  q_xd = q_x*heatcoefd + heatcoef*q_xd
7696  q_x = heatcoef*q_x
7697  q_yd = q_y*heatcoefd + heatcoef*q_yd
7698  q_y = heatcoef*q_y
7699  q_zd = q_z*heatcoefd + heatcoef*q_zd
7700  q_z = heatcoef*q_z
7701 ! add qcr corrections if necessary
7702  if (useqcr) then
7703 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
7704 !
7705 ! tau_ij,qcr = tau_ij - e_ij
7706 !
7707 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
7708 !
7709 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
7710 !
7711 ! we are computing o_ik as follows:
7712 !
7713 ! o_ik = 2*w_ik/den
7714 !
7715 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
7716 ! compute denominator
7717  arg1d = 2*u_x*u_xd + 2*u_y*u_yd + 2*u_z*u_zd + 2*v_x*v_xd &
7718 & + 2*v_y*v_yd + 2*v_z*v_zd + 2*w_x*w_xd + 2*w_y*w_yd + 2*&
7719 & w_z*w_zd
7720  arg1 = u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
7721 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z
7722  temp7 = sqrt(arg1)
7723  if (arg1 .eq. 0.0_8) then
7724  dend = 0.0_8
7725  else
7726  dend = arg1d/(2.0*temp7)
7727  end if
7728  den = temp7
7729  if (den .lt. xminn) then
7730  den = xminn
7731  dend = 0.0_8
7732  else
7733  den = den
7734  end if
7735 ! compute factor that will multiply all tensor components.
7736 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
7737 ! components as well.
7738  factd = ccr1*(mued-mue*dend/den)/den
7739  fact = mue*ccr1/den
7740 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
7741 ! the diagonals of the vorticity tensor components are always zero
7742  wxyd = u_yd - v_xd
7743  wxy = u_y - v_x
7744  wxzd = u_zd - w_xd
7745  wxz = u_z - w_x
7746  wyzd = v_zd - w_yd
7747  wyz = v_z - w_y
7748  wyxd = -wxyd
7749  wyx = -wxy
7750  wzxd = -wxzd
7751  wzx = -wxz
7752  wzyd = -wyzd
7753  wzy = -wyz
7754 ! compute the extra terms of the boussinesq relation
7755  temp7 = wxy*tauxys + wxz*tauxzs
7756  exxd = two*(temp7*factd+fact*(tauxys*wxyd+wxy*tauxysd+&
7757 & tauxzs*wxzd+wxz*tauxzsd))
7758  exx = two*(fact*temp7)
7759  temp7 = wyx*tauxys + wyz*tauyzs
7760  eyyd = two*(temp7*factd+fact*(tauxys*wyxd+wyx*tauxysd+&
7761 & tauyzs*wyzd+wyz*tauyzsd))
7762  eyy = two*(fact*temp7)
7763  temp7 = wzx*tauxzs + wzy*tauyzs
7764  ezzd = two*(temp7*factd+fact*(tauxzs*wzxd+wzx*tauxzsd+&
7765 & tauyzs*wzyd+wzy*tauyzsd))
7766  ezz = two*(fact*temp7)
7767  temp7 = wxy*tauyys + wxz*tauyzs + wyx*tauxxs + wyz*tauxzs
7768  exyd = temp7*factd + fact*(tauyys*wxyd+wxy*tauyysd+tauyzs*&
7769 & wxzd+wxz*tauyzsd+tauxxs*wyxd+wyx*tauxxsd+tauxzs*wyzd+wyz&
7770 & *tauxzsd)
7771  exy = fact*temp7
7772  temp7 = wxy*tauyzs + wxz*tauzzs + wzx*tauxxs + wzy*tauxys
7773  exzd = temp7*factd + fact*(tauyzs*wxyd+wxy*tauyzsd+tauzzs*&
7774 & wxzd+wxz*tauzzsd+tauxxs*wzxd+wzx*tauxxsd+tauxys*wzyd+wzy&
7775 & *tauxysd)
7776  exz = fact*temp7
7777  temp7 = wyx*tauxzs + wyz*tauzzs + wzx*tauxys + wzy*tauyys
7778  eyzd = temp7*factd + fact*(tauxzs*wyxd+wyx*tauxzsd+tauzzs*&
7779 & wyzd+wyz*tauzzsd+tauxys*wzxd+wzx*tauxysd+tauyys*wzyd+wzy&
7780 & *tauyysd)
7781  eyz = fact*temp7
7782 ! apply the total viscosity to the stress tensor and add extra terms
7783  tauxxd = tauxxs*mutd + mut*tauxxsd - exxd
7784  tauxx = mut*tauxxs - exx
7785  tauyyd = tauyys*mutd + mut*tauyysd - eyyd
7786  tauyy = mut*tauyys - eyy
7787  tauzzd = tauzzs*mutd + mut*tauzzsd - ezzd
7788  tauzz = mut*tauzzs - ezz
7789  tauxyd = tauxys*mutd + mut*tauxysd - exyd
7790  tauxy = mut*tauxys - exy
7791  tauxzd = tauxzs*mutd + mut*tauxzsd - exzd
7792  tauxz = mut*tauxzs - exz
7793  tauyzd = tauyzs*mutd + mut*tauyzsd - eyzd
7794  tauyz = mut*tauyzs - eyz
7795  else
7796 ! just apply the total viscosity to the stress tensor
7797  tauxxd = tauxxs*mutd + mut*tauxxsd
7798  tauxx = mut*tauxxs
7799  tauyyd = tauyys*mutd + mut*tauyysd
7800  tauyy = mut*tauyys
7801  tauzzd = tauzzs*mutd + mut*tauzzsd
7802  tauzz = mut*tauzzs
7803  tauxyd = tauxys*mutd + mut*tauxysd
7804  tauxy = mut*tauxys
7805  tauxzd = tauxzs*mutd + mut*tauxzsd
7806  tauxz = mut*tauxzs
7807  tauyzd = tauyzs*mutd + mut*tauyzsd
7808  tauyz = mut*tauyzs
7809  end if
7810 ! compute the average velocities for the face. remember that
7811 ! the velocities are stored and not the momentum.
7812  ubard = half*(wd(i, j, k, ivx)+wd(i+1, j, k, ivx))
7813  ubar = half*(w(i, j, k, ivx)+w(i+1, j, k, ivx))
7814  vbard = half*(wd(i, j, k, ivy)+wd(i+1, j, k, ivy))
7815  vbar = half*(w(i, j, k, ivy)+w(i+1, j, k, ivy))
7816  wbard = half*(wd(i, j, k, ivz)+wd(i+1, j, k, ivz))
7817  wbar = half*(w(i, j, k, ivz)+w(i+1, j, k, ivz))
7818 ! compute the viscous fluxes for this i-face.
7819  temp7 = si(i, j, k, 1)
7820  temp6 = si(i, j, k, 2)
7821  temp5 = si(i, j, k, 3)
7822  fmxd = temp7*tauxxd + tauxx*sid(i, j, k, 1) + temp6*tauxyd +&
7823 & tauxy*sid(i, j, k, 2) + temp5*tauxzd + tauxz*sid(i, j, k, &
7824 & 3)
7825  fmx = tauxx*temp7 + tauxy*temp6 + tauxz*temp5
7826  temp7 = si(i, j, k, 1)
7827  temp6 = si(i, j, k, 2)
7828  temp5 = si(i, j, k, 3)
7829  fmyd = temp7*tauxyd + tauxy*sid(i, j, k, 1) + temp6*tauyyd +&
7830 & tauyy*sid(i, j, k, 2) + temp5*tauyzd + tauyz*sid(i, j, k, &
7831 & 3)
7832  fmy = tauxy*temp7 + tauyy*temp6 + tauyz*temp5
7833  temp7 = si(i, j, k, 1)
7834  temp6 = si(i, j, k, 2)
7835  temp5 = si(i, j, k, 3)
7836  fmzd = temp7*tauxzd + tauxz*sid(i, j, k, 1) + temp6*tauyzd +&
7837 & tauyz*sid(i, j, k, 2) + temp5*tauzzd + tauzz*sid(i, j, k, &
7838 & 3)
7839  fmz = tauxz*temp7 + tauyz*temp6 + tauzz*temp5
7840  temp7 = si(i, j, k, 1)
7841  temp6 = ubar*tauxx + vbar*tauxy + wbar*tauxz
7842  temp5 = si(i, j, k, 2)
7843  temp4 = ubar*tauxy + vbar*tauyy + wbar*tauyz
7844  temp3 = si(i, j, k, 3)
7845  temp2 = ubar*tauxz + vbar*tauyz + wbar*tauzz
7846  temp1 = si(i, j, k, 1)
7847  temp0 = si(i, j, k, 2)
7848  temp = si(i, j, k, 3)
7849  frhoed = temp7*(tauxx*ubard+ubar*tauxxd+tauxy*vbard+vbar*&
7850 & tauxyd+tauxz*wbard+wbar*tauxzd) + (temp6-q_x)*sid(i, j, k&
7851 & , 1) + temp5*(tauxy*ubard+ubar*tauxyd+tauyy*vbard+vbar*&
7852 & tauyyd+tauyz*wbard+wbar*tauyzd) + (temp4-q_y)*sid(i, j, k&
7853 & , 2) + temp3*(tauxz*ubard+ubar*tauxzd+tauyz*vbard+vbar*&
7854 & tauyzd+tauzz*wbard+wbar*tauzzd) + (temp2-q_z)*sid(i, j, k&
7855 & , 3) - temp1*q_xd - temp0*q_yd - temp*q_zd
7856  frhoe = temp6*temp7 + temp4*temp5 + temp2*temp3 - q_x*temp1 &
7857 & - q_y*temp0 - q_z*temp
7858 ! update the residuals of cell i and i+1.
7859  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fmxd
7860  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
7861  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fmyd
7862  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
7863  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fmzd
7864  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
7865  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - frhoed
7866  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
7867  fwd(i+1, j, k, imx) = fwd(i+1, j, k, imx) + fmxd
7868  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fmx
7869  fwd(i+1, j, k, imy) = fwd(i+1, j, k, imy) + fmyd
7870  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fmy
7871  fwd(i+1, j, k, imz) = fwd(i+1, j, k, imz) + fmzd
7872  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fmz
7873  fwd(i+1, j, k, irhoe) = fwd(i+1, j, k, irhoe) + frhoed
7874  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + frhoe
7875 ! store the stress tensor and the heat flux vector if this
7876 ! face is part of a viscous subface. both the cases i == 1
7877 ! and i == il must be tested.
7878  if (i .eq. 1 .and. storewalltensor .and. visciminpointer(j, &
7879 & k) .gt. 0) then
7880 ! we need to index viscsubface with visciminpointer(j,k)
7881 ! since tapenade does not like temporary indexes
7882  viscsubfaced(visciminpointer(j, k))%tau(j, k, 1) = tauxxd
7883  viscsubface(visciminpointer(j, k))%tau(j, k, 1) = tauxx
7884  viscsubfaced(visciminpointer(j, k))%tau(j, k, 2) = tauyyd
7885  viscsubface(visciminpointer(j, k))%tau(j, k, 2) = tauyy
7886  viscsubfaced(visciminpointer(j, k))%tau(j, k, 3) = tauzzd
7887  viscsubface(visciminpointer(j, k))%tau(j, k, 3) = tauzz
7888  viscsubfaced(visciminpointer(j, k))%tau(j, k, 4) = tauxyd
7889  viscsubface(visciminpointer(j, k))%tau(j, k, 4) = tauxy
7890  viscsubfaced(visciminpointer(j, k))%tau(j, k, 5) = tauxzd
7891  viscsubface(visciminpointer(j, k))%tau(j, k, 5) = tauxz
7892  viscsubfaced(visciminpointer(j, k))%tau(j, k, 6) = tauyzd
7893  viscsubface(visciminpointer(j, k))%tau(j, k, 6) = tauyz
7894  viscsubfaced(visciminpointer(j, k))%q(j, k, 1) = q_xd
7895  viscsubface(visciminpointer(j, k))%q(j, k, 1) = q_x
7896  viscsubfaced(visciminpointer(j, k))%q(j, k, 2) = q_yd
7897  viscsubface(visciminpointer(j, k))%q(j, k, 2) = q_y
7898  viscsubfaced(visciminpointer(j, k))%q(j, k, 3) = q_zd
7899  viscsubface(visciminpointer(j, k))%q(j, k, 3) = q_z
7900  end if
7901 ! and the i == il case.
7902  if (i .eq. il .and. storewalltensor .and. viscimaxpointer(j&
7903 & , k) .gt. 0) then
7904 ! we need to index viscsubface with viscimaxpointer(j,k)
7905 ! since tapenade does not like temporary indexes
7906  viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 1) = tauxxd
7907  viscsubface(viscimaxpointer(j, k))%tau(j, k, 1) = tauxx
7908  viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 2) = tauyyd
7909  viscsubface(viscimaxpointer(j, k))%tau(j, k, 2) = tauyy
7910  viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 3) = tauzzd
7911  viscsubface(viscimaxpointer(j, k))%tau(j, k, 3) = tauzz
7912  viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 4) = tauxyd
7913  viscsubface(viscimaxpointer(j, k))%tau(j, k, 4) = tauxy
7914  viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 5) = tauxzd
7915  viscsubface(viscimaxpointer(j, k))%tau(j, k, 5) = tauxz
7916  viscsubfaced(viscimaxpointer(j, k))%tau(j, k, 6) = tauyzd
7917  viscsubface(viscimaxpointer(j, k))%tau(j, k, 6) = tauyz
7918  viscsubfaced(viscimaxpointer(j, k))%q(j, k, 1) = q_xd
7919  viscsubface(viscimaxpointer(j, k))%q(j, k, 1) = q_x
7920  viscsubfaced(viscimaxpointer(j, k))%q(j, k, 2) = q_yd
7921  viscsubface(viscimaxpointer(j, k))%q(j, k, 2) = q_y
7922  viscsubfaced(viscimaxpointer(j, k))%q(j, k, 3) = q_zd
7923  viscsubface(viscimaxpointer(j, k))%q(j, k, 3) = q_z
7924  end if
7925  end do
7926  end do
7927  end do
7928  continue
7929 ! possibly correct the wall shear stress.
7930 ! wall function is not aded
7931  end if
7932  end subroutine viscousflux_d
7933 
7934  subroutine viscousflux()
7935 !
7936 ! viscousflux computes the viscous fluxes using a central
7937 ! difference scheme for a block.
7938 ! it is assumed that the pointers in block pointer already point
7939 ! to the correct block.
7940 !
7941  use constants
7942  use blockpointers
7943  use flowvarrefstate
7944  use inputphysics
7945  use iteration
7946  implicit none
7947 !
7948 ! local parameter.
7949 !
7950  real(kind=realtype), parameter :: twothird=two*third
7951  real(kind=realtype), parameter :: xminn=1.e-14_realtype
7952 !
7953 ! local variables.
7954 !
7955  integer(kind=inttype) :: i, j, k, ii
7956  real(kind=realtype) :: rfilv, por, mul, mue, mut, heatcoef
7957  real(kind=realtype) :: gm1, factlamheat, factturbheat
7958  real(kind=realtype) :: u_x, u_y, u_z, v_x, v_y, v_z, w_x, w_y, w_z
7959  real(kind=realtype) :: q_x, q_y, q_z, ubar, vbar, wbar
7960  real(kind=realtype) :: corr, ssx, ssy, ssz, ss, fracdiv
7961  real(kind=realtype) :: tauxx, tauyy, tauzz
7962  real(kind=realtype) :: tauxy, tauxz, tauyz
7963  real(kind=realtype) :: tauxxs, tauyys, tauzzs
7964  real(kind=realtype) :: tauxys, tauxzs, tauyzs
7965  real(kind=realtype) :: exx, eyy, ezz
7966  real(kind=realtype) :: exy, exz, eyz
7967  real(kind=realtype) :: wxy, wxz, wyz, wyx, wzx, wzy
7968  real(kind=realtype) :: den, ccr1, fact
7969  real(kind=realtype) :: fmx, fmy, fmz, frhoe
7970  logical :: correctfork, storewalltensor
7971  intrinsic abs
7972  intrinsic sqrt
7973  intrinsic max
7974  real(kind=realtype) :: abs0
7975  real(kind=realtype) :: arg1
7976  real(kind=realtype) :: result1
7977 ! set qcr parameters
7978  ccr1 = 0.3_realtype
7979 ! set rfilv to rfil to indicate that this is the viscous part.
7980 ! if rfilv == 0 the viscous residuals need not to be computed
7981 ! and a return can be made.
7982  rfilv = rfil
7983  if (rfilv .ge. 0.) then
7984  abs0 = rfilv
7985  else
7986  abs0 = -rfilv
7987  end if
7988  if (abs0 .lt. thresholdreal) then
7989  return
7990  else
7991 ! determine whether or not the wall stress tensor and wall heat
7992 ! flux must be stored for viscous walls.
7993  storewalltensor = .false.
7994  if (wallfunctions) then
7995  storewalltensor = .true.
7996  else if (rkstage .eq. 0 .and. currentlevel .eq. groundlevel) then
7997  storewalltensor = .true.
7998  end if
7999 !$ad checkpoint-start
8000 !
8001 ! viscous fluxes in the k-direction.
8002 !
8003  mue = zero
8004  do k=1,kl
8005  do j=2,jl
8006  do i=2,il
8007 ! set the value of the porosity. if not zero, it is set
8008 ! to average the eddy-viscosity and to take the factor
8009 ! rfilv into account.
8010  por = half*rfilv
8011  if (pork(i, j, k) .eq. noflux) por = zero
8012 ! compute the laminar and (if present) the eddy viscosities
8013 ! multiplied by the porosity. compute the factor in front of
8014 ! the gradients of the speed of sound squared for the heat
8015 ! flux.
8016  mul = por*(rlv(i, j, k)+rlv(i, j, k+1))
8017  if (eddymodel) mue = por*(rev(i, j, k)+rev(i, j, k+1))
8018  mut = mul + mue
8019  gm1 = half*(gamma(i, j, k)+gamma(i, j, k+1)) - one
8020  factlamheat = one/(prandtl*gm1)
8021  factturbheat = one/(prandtlturb*gm1)
8022  heatcoef = mul*factlamheat + mue*factturbheat
8023 ! compute the gradients at the face by averaging the four
8024 ! nodal values.
8025  u_x = fourth*(ux(i-1, j-1, k)+ux(i, j-1, k)+ux(i-1, j, k)+ux&
8026 & (i, j, k))
8027  u_y = fourth*(uy(i-1, j-1, k)+uy(i, j-1, k)+uy(i-1, j, k)+uy&
8028 & (i, j, k))
8029  u_z = fourth*(uz(i-1, j-1, k)+uz(i, j-1, k)+uz(i-1, j, k)+uz&
8030 & (i, j, k))
8031  v_x = fourth*(vx(i-1, j-1, k)+vx(i, j-1, k)+vx(i-1, j, k)+vx&
8032 & (i, j, k))
8033  v_y = fourth*(vy(i-1, j-1, k)+vy(i, j-1, k)+vy(i-1, j, k)+vy&
8034 & (i, j, k))
8035  v_z = fourth*(vz(i-1, j-1, k)+vz(i, j-1, k)+vz(i-1, j, k)+vz&
8036 & (i, j, k))
8037  w_x = fourth*(wx(i-1, j-1, k)+wx(i, j-1, k)+wx(i-1, j, k)+wx&
8038 & (i, j, k))
8039  w_y = fourth*(wy(i-1, j-1, k)+wy(i, j-1, k)+wy(i-1, j, k)+wy&
8040 & (i, j, k))
8041  w_z = fourth*(wz(i-1, j-1, k)+wz(i, j-1, k)+wz(i-1, j, k)+wz&
8042 & (i, j, k))
8043  q_x = fourth*(qx(i-1, j-1, k)+qx(i, j-1, k)+qx(i-1, j, k)+qx&
8044 & (i, j, k))
8045  q_y = fourth*(qy(i-1, j-1, k)+qy(i, j-1, k)+qy(i-1, j, k)+qy&
8046 & (i, j, k))
8047  q_z = fourth*(qz(i-1, j-1, k)+qz(i, j-1, k)+qz(i-1, j, k)+qz&
8048 & (i, j, k))
8049 ! the gradients in the normal direction are corrected, such
8050 ! that no averaging takes places here.
8051 ! first determine the vector in the direction from the
8052 ! cell center k to cell center k+1.
8053  ssx = eighth*(x(i-1, j-1, k+1, 1)-x(i-1, j-1, k-1, 1)+x(i-1&
8054 & , j, k+1, 1)-x(i-1, j, k-1, 1)+x(i, j-1, k+1, 1)-x(i, j-1&
8055 & , k-1, 1)+x(i, j, k+1, 1)-x(i, j, k-1, 1))
8056  ssy = eighth*(x(i-1, j-1, k+1, 2)-x(i-1, j-1, k-1, 2)+x(i-1&
8057 & , j, k+1, 2)-x(i-1, j, k-1, 2)+x(i, j-1, k+1, 2)-x(i, j-1&
8058 & , k-1, 2)+x(i, j, k+1, 2)-x(i, j, k-1, 2))
8059  ssz = eighth*(x(i-1, j-1, k+1, 3)-x(i-1, j-1, k-1, 3)+x(i-1&
8060 & , j, k+1, 3)-x(i-1, j, k-1, 3)+x(i, j-1, k+1, 3)-x(i, j-1&
8061 & , k-1, 3)+x(i, j, k+1, 3)-x(i, j, k-1, 3))
8062 ! determine the length of this vector and create the
8063 ! unit normal.
8064  arg1 = ssx*ssx + ssy*ssy + ssz*ssz
8065  result1 = sqrt(arg1)
8066  ss = one/result1
8067  ssx = ss*ssx
8068  ssy = ss*ssy
8069  ssz = ss*ssz
8070 ! correct the gradients.
8071  corr = u_x*ssx + u_y*ssy + u_z*ssz - (w(i, j, k+1, ivx)-w(i&
8072 & , j, k, ivx))*ss
8073  u_x = u_x - corr*ssx
8074  u_y = u_y - corr*ssy
8075  u_z = u_z - corr*ssz
8076  corr = v_x*ssx + v_y*ssy + v_z*ssz - (w(i, j, k+1, ivy)-w(i&
8077 & , j, k, ivy))*ss
8078  v_x = v_x - corr*ssx
8079  v_y = v_y - corr*ssy
8080  v_z = v_z - corr*ssz
8081  corr = w_x*ssx + w_y*ssy + w_z*ssz - (w(i, j, k+1, ivz)-w(i&
8082 & , j, k, ivz))*ss
8083  w_x = w_x - corr*ssx
8084  w_y = w_y - corr*ssy
8085  w_z = w_z - corr*ssz
8086  corr = q_x*ssx + q_y*ssy + q_z*ssz + (aa(i, j, k+1)-aa(i, j&
8087 & , k))*ss
8088  q_x = q_x - corr*ssx
8089  q_y = q_y - corr*ssy
8090  q_z = q_z - corr*ssz
8091 ! compute the stress tensor and the heat flux vector.
8092 ! we remove the viscosity from the stress tensor (tau)
8093 ! to define taus since we still need to separate between
8094 ! laminar and turbulent stress for qcr.
8095 ! therefore, laminar tau = mue*taus, turbulent
8096 ! tau = mue*taus, and total tau = mut*taus.
8097  fracdiv = twothird*(u_x+v_y+w_z)
8098  tauxxs = two*u_x - fracdiv
8099  tauyys = two*v_y - fracdiv
8100  tauzzs = two*w_z - fracdiv
8101  tauxys = u_y + v_x
8102  tauxzs = u_z + w_x
8103  tauyzs = v_z + w_y
8104  q_x = heatcoef*q_x
8105  q_y = heatcoef*q_y
8106  q_z = heatcoef*q_z
8107 ! add qcr corrections if necessary
8108  if (useqcr) then
8109 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
8110 !
8111 ! tau_ij,qcr = tau_ij - e_ij
8112 !
8113 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
8114 !
8115 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
8116 !
8117 ! we are computing o_ik as follows:
8118 !
8119 ! o_ik = 2*w_ik/den
8120 !
8121 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
8122 ! compute denominator
8123  arg1 = u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
8124 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z
8125  den = sqrt(arg1)
8126  if (den .lt. xminn) then
8127  den = xminn
8128  else
8129  den = den
8130  end if
8131 ! compute factor that will multiply all tensor components.
8132 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
8133 ! components as well.
8134  fact = mue*ccr1/den
8135 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
8136 ! the diagonals of the vorticity tensor components are always zero
8137  wxy = u_y - v_x
8138  wxz = u_z - w_x
8139  wyz = v_z - w_y
8140  wyx = -wxy
8141  wzx = -wxz
8142  wzy = -wyz
8143 ! compute the extra terms of the boussinesq relation
8144  exx = fact*(wxy*tauxys+wxz*tauxzs)*two
8145  eyy = fact*(wyx*tauxys+wyz*tauyzs)*two
8146  ezz = fact*(wzx*tauxzs+wzy*tauyzs)*two
8147  exy = fact*(wxy*tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)
8148  exz = fact*(wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)
8149  eyz = fact*(wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)
8150 ! apply the total viscosity to the stress tensor and add extra terms
8151  tauxx = mut*tauxxs - exx
8152  tauyy = mut*tauyys - eyy
8153  tauzz = mut*tauzzs - ezz
8154  tauxy = mut*tauxys - exy
8155  tauxz = mut*tauxzs - exz
8156  tauyz = mut*tauyzs - eyz
8157  else
8158 ! just apply the total viscosity to the stress tensor
8159  tauxx = mut*tauxxs
8160  tauyy = mut*tauyys
8161  tauzz = mut*tauzzs
8162  tauxy = mut*tauxys
8163  tauxz = mut*tauxzs
8164  tauyz = mut*tauyzs
8165  end if
8166 ! compute the average velocities for the face. remember that
8167 ! the velocities are stored and not the momentum.
8168  ubar = half*(w(i, j, k, ivx)+w(i, j, k+1, ivx))
8169  vbar = half*(w(i, j, k, ivy)+w(i, j, k+1, ivy))
8170  wbar = half*(w(i, j, k, ivz)+w(i, j, k+1, ivz))
8171 ! compute the viscous fluxes for this k-face.
8172  fmx = tauxx*sk(i, j, k, 1) + tauxy*sk(i, j, k, 2) + tauxz*sk&
8173 & (i, j, k, 3)
8174  fmy = tauxy*sk(i, j, k, 1) + tauyy*sk(i, j, k, 2) + tauyz*sk&
8175 & (i, j, k, 3)
8176  fmz = tauxz*sk(i, j, k, 1) + tauyz*sk(i, j, k, 2) + tauzz*sk&
8177 & (i, j, k, 3)
8178  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*sk(i, j, k, 1)
8179  frhoe = frhoe + (ubar*tauxy+vbar*tauyy+wbar*tauyz)*sk(i, j, &
8180 & k, 2)
8181  frhoe = frhoe + (ubar*tauxz+vbar*tauyz+wbar*tauzz)*sk(i, j, &
8182 & k, 3)
8183  frhoe = frhoe - q_x*sk(i, j, k, 1) - q_y*sk(i, j, k, 2) - &
8184 & q_z*sk(i, j, k, 3)
8185 ! update the residuals of cell k and k+1.
8186  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
8187  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
8188  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
8189  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
8190  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fmx
8191  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fmy
8192  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fmz
8193  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + frhoe
8194 ! store the stress tensor and the heat flux vector if this
8195 ! face is part of a viscous subface. both the cases k == 1
8196 ! and k == kl must be tested.
8197  if (k .eq. 1 .and. storewalltensor .and. visckminpointer(i, &
8198 & j) .gt. 0) then
8199 ! we need to index viscsubface with visckminpointer(i,j)
8200 ! since tapenade does not like temporary indexes
8201  viscsubface(visckminpointer(i, j))%tau(i, j, 1) = tauxx
8202  viscsubface(visckminpointer(i, j))%tau(i, j, 2) = tauyy
8203  viscsubface(visckminpointer(i, j))%tau(i, j, 3) = tauzz
8204  viscsubface(visckminpointer(i, j))%tau(i, j, 4) = tauxy
8205  viscsubface(visckminpointer(i, j))%tau(i, j, 5) = tauxz
8206  viscsubface(visckminpointer(i, j))%tau(i, j, 6) = tauyz
8207  viscsubface(visckminpointer(i, j))%q(i, j, 1) = q_x
8208  viscsubface(visckminpointer(i, j))%q(i, j, 2) = q_y
8209  viscsubface(visckminpointer(i, j))%q(i, j, 3) = q_z
8210  end if
8211 ! and the k == kl case.
8212  if (k .eq. kl .and. storewalltensor .and. visckmaxpointer(i&
8213 & , j) .gt. 0) then
8214  viscsubface(visckmaxpointer(i, j))%tau(i, j, 1) = tauxx
8215  viscsubface(visckmaxpointer(i, j))%tau(i, j, 2) = tauyy
8216  viscsubface(visckmaxpointer(i, j))%tau(i, j, 3) = tauzz
8217  viscsubface(visckmaxpointer(i, j))%tau(i, j, 4) = tauxy
8218  viscsubface(visckmaxpointer(i, j))%tau(i, j, 5) = tauxz
8219  viscsubface(visckmaxpointer(i, j))%tau(i, j, 6) = tauyz
8220  viscsubface(visckmaxpointer(i, j))%q(i, j, 1) = q_x
8221  viscsubface(visckmaxpointer(i, j))%q(i, j, 2) = q_y
8222  viscsubface(visckmaxpointer(i, j))%q(i, j, 3) = q_z
8223  end if
8224  end do
8225  end do
8226  end do
8227 !$ad checkpoint-end
8228 !
8229 ! viscous fluxes in the j-direction.
8230 !
8231  continue
8232 !$ad checkpoint-start
8233  mue = zero
8234  do k=2,kl
8235  do j=1,jl
8236  do i=2,il
8237 ! set the value of the porosity. if not zero, it is set
8238 ! to average the eddy-viscosity and to take the factor
8239 ! rfilv into account.
8240  por = half*rfilv
8241  if (porj(i, j, k) .eq. noflux) por = zero
8242 ! compute the laminar and (if present) the eddy viscosities
8243 ! multiplied by the porosity. compute the factor in front of
8244 ! the gradients of the speed of sound squared for the heat
8245 ! flux.
8246  mul = por*(rlv(i, j, k)+rlv(i, j+1, k))
8247  if (eddymodel) mue = por*(rev(i, j, k)+rev(i, j+1, k))
8248  mut = mul + mue
8249  gm1 = half*(gamma(i, j, k)+gamma(i, j+1, k)) - one
8250  factlamheat = one/(prandtl*gm1)
8251  factturbheat = one/(prandtlturb*gm1)
8252  heatcoef = mul*factlamheat + mue*factturbheat
8253 ! compute the gradients at the face by averaging the four
8254 ! nodal values.
8255  u_x = fourth*(ux(i-1, j, k-1)+ux(i, j, k-1)+ux(i-1, j, k)+ux&
8256 & (i, j, k))
8257  u_y = fourth*(uy(i-1, j, k-1)+uy(i, j, k-1)+uy(i-1, j, k)+uy&
8258 & (i, j, k))
8259  u_z = fourth*(uz(i-1, j, k-1)+uz(i, j, k-1)+uz(i-1, j, k)+uz&
8260 & (i, j, k))
8261  v_x = fourth*(vx(i-1, j, k-1)+vx(i, j, k-1)+vx(i-1, j, k)+vx&
8262 & (i, j, k))
8263  v_y = fourth*(vy(i-1, j, k-1)+vy(i, j, k-1)+vy(i-1, j, k)+vy&
8264 & (i, j, k))
8265  v_z = fourth*(vz(i-1, j, k-1)+vz(i, j, k-1)+vz(i-1, j, k)+vz&
8266 & (i, j, k))
8267  w_x = fourth*(wx(i-1, j, k-1)+wx(i, j, k-1)+wx(i-1, j, k)+wx&
8268 & (i, j, k))
8269  w_y = fourth*(wy(i-1, j, k-1)+wy(i, j, k-1)+wy(i-1, j, k)+wy&
8270 & (i, j, k))
8271  w_z = fourth*(wz(i-1, j, k-1)+wz(i, j, k-1)+wz(i-1, j, k)+wz&
8272 & (i, j, k))
8273  q_x = fourth*(qx(i-1, j, k-1)+qx(i, j, k-1)+qx(i-1, j, k)+qx&
8274 & (i, j, k))
8275  q_y = fourth*(qy(i-1, j, k-1)+qy(i, j, k-1)+qy(i-1, j, k)+qy&
8276 & (i, j, k))
8277  q_z = fourth*(qz(i-1, j, k-1)+qz(i, j, k-1)+qz(i-1, j, k)+qz&
8278 & (i, j, k))
8279 ! the gradients in the normal direction are corrected, such
8280 ! that no averaging takes places here.
8281 ! first determine the vector in the direction from the
8282 ! cell center j to cell center j+1.
8283  ssx = eighth*(x(i-1, j+1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i-1&
8284 & , j+1, k, 1)-x(i-1, j-1, k, 1)+x(i, j+1, k-1, 1)-x(i, j-1&
8285 & , k-1, 1)+x(i, j+1, k, 1)-x(i, j-1, k, 1))
8286  ssy = eighth*(x(i-1, j+1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i-1&
8287 & , j+1, k, 2)-x(i-1, j-1, k, 2)+x(i, j+1, k-1, 2)-x(i, j-1&
8288 & , k-1, 2)+x(i, j+1, k, 2)-x(i, j-1, k, 2))
8289  ssz = eighth*(x(i-1, j+1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i-1&
8290 & , j+1, k, 3)-x(i-1, j-1, k, 3)+x(i, j+1, k-1, 3)-x(i, j-1&
8291 & , k-1, 3)+x(i, j+1, k, 3)-x(i, j-1, k, 3))
8292 ! determine the length of this vector and create the
8293 ! unit normal.
8294  arg1 = ssx*ssx + ssy*ssy + ssz*ssz
8295  result1 = sqrt(arg1)
8296  ss = one/result1
8297  ssx = ss*ssx
8298  ssy = ss*ssy
8299  ssz = ss*ssz
8300 ! correct the gradients.
8301  corr = u_x*ssx + u_y*ssy + u_z*ssz - (w(i, j+1, k, ivx)-w(i&
8302 & , j, k, ivx))*ss
8303  u_x = u_x - corr*ssx
8304  u_y = u_y - corr*ssy
8305  u_z = u_z - corr*ssz
8306  corr = v_x*ssx + v_y*ssy + v_z*ssz - (w(i, j+1, k, ivy)-w(i&
8307 & , j, k, ivy))*ss
8308  v_x = v_x - corr*ssx
8309  v_y = v_y - corr*ssy
8310  v_z = v_z - corr*ssz
8311  corr = w_x*ssx + w_y*ssy + w_z*ssz - (w(i, j+1, k, ivz)-w(i&
8312 & , j, k, ivz))*ss
8313  w_x = w_x - corr*ssx
8314  w_y = w_y - corr*ssy
8315  w_z = w_z - corr*ssz
8316  corr = q_x*ssx + q_y*ssy + q_z*ssz + (aa(i, j+1, k)-aa(i, j&
8317 & , k))*ss
8318  q_x = q_x - corr*ssx
8319  q_y = q_y - corr*ssy
8320  q_z = q_z - corr*ssz
8321 ! compute the stress tensor and the heat flux vector.
8322 ! we remove the viscosity from the stress tensor (tau)
8323 ! to define taus since we still need to separate between
8324 ! laminar and turbulent stress for qcr.
8325 ! therefore, laminar tau = mue*taus, turbulent
8326 ! tau = mue*taus, and total tau = mut*taus.
8327  fracdiv = twothird*(u_x+v_y+w_z)
8328  tauxxs = two*u_x - fracdiv
8329  tauyys = two*v_y - fracdiv
8330  tauzzs = two*w_z - fracdiv
8331  tauxys = u_y + v_x
8332  tauxzs = u_z + w_x
8333  tauyzs = v_z + w_y
8334  q_x = heatcoef*q_x
8335  q_y = heatcoef*q_y
8336  q_z = heatcoef*q_z
8337 ! add qcr corrections if necessary
8338  if (useqcr) then
8339 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
8340 !
8341 ! tau_ij,qcr = tau_ij - e_ij
8342 !
8343 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
8344 !
8345 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
8346 !
8347 ! we are computing o_ik as follows:
8348 !
8349 ! o_ik = 2*w_ik/den
8350 !
8351 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
8352 ! compute denominator
8353  arg1 = u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
8354 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z
8355  den = sqrt(arg1)
8356  if (den .lt. xminn) then
8357  den = xminn
8358  else
8359  den = den
8360  end if
8361 ! compute factor that will multiply all tensor components.
8362 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
8363 ! components as well.
8364  fact = mue*ccr1/den
8365 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
8366 ! the diagonals of the vorticity tensor components are always zero
8367  wxy = u_y - v_x
8368  wxz = u_z - w_x
8369  wyz = v_z - w_y
8370  wyx = -wxy
8371  wzx = -wxz
8372  wzy = -wyz
8373 ! compute the extra terms of the boussinesq relation
8374  exx = fact*(wxy*tauxys+wxz*tauxzs)*two
8375  eyy = fact*(wyx*tauxys+wyz*tauyzs)*two
8376  ezz = fact*(wzx*tauxzs+wzy*tauyzs)*two
8377  exy = fact*(wxy*tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)
8378  exz = fact*(wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)
8379  eyz = fact*(wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)
8380 ! apply the total viscosity to the stress tensor and add extra terms
8381  tauxx = mut*tauxxs - exx
8382  tauyy = mut*tauyys - eyy
8383  tauzz = mut*tauzzs - ezz
8384  tauxy = mut*tauxys - exy
8385  tauxz = mut*tauxzs - exz
8386  tauyz = mut*tauyzs - eyz
8387  else
8388 ! just apply the total viscosity to the stress tensor
8389  tauxx = mut*tauxxs
8390  tauyy = mut*tauyys
8391  tauzz = mut*tauzzs
8392  tauxy = mut*tauxys
8393  tauxz = mut*tauxzs
8394  tauyz = mut*tauyzs
8395  end if
8396 ! compute the average velocities for the face. remember that
8397 ! the velocities are stored and not the momentum.
8398  ubar = half*(w(i, j, k, ivx)+w(i, j+1, k, ivx))
8399  vbar = half*(w(i, j, k, ivy)+w(i, j+1, k, ivy))
8400  wbar = half*(w(i, j, k, ivz)+w(i, j+1, k, ivz))
8401 ! compute the viscous fluxes for this j-face.
8402  fmx = tauxx*sj(i, j, k, 1) + tauxy*sj(i, j, k, 2) + tauxz*sj&
8403 & (i, j, k, 3)
8404  fmy = tauxy*sj(i, j, k, 1) + tauyy*sj(i, j, k, 2) + tauyz*sj&
8405 & (i, j, k, 3)
8406  fmz = tauxz*sj(i, j, k, 1) + tauyz*sj(i, j, k, 2) + tauzz*sj&
8407 & (i, j, k, 3)
8408  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*sj(i, j, k, 1) + &
8409 & (ubar*tauxy+vbar*tauyy+wbar*tauyz)*sj(i, j, k, 2) + (ubar*&
8410 & tauxz+vbar*tauyz+wbar*tauzz)*sj(i, j, k, 3) - q_x*sj(i, j&
8411 & , k, 1) - q_y*sj(i, j, k, 2) - q_z*sj(i, j, k, 3)
8412 ! update the residuals of cell j and j+1.
8413  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
8414  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
8415  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
8416  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
8417  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fmx
8418  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fmy
8419  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fmz
8420  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + frhoe
8421 ! store the stress tensor and the heat flux vector if this
8422 ! face is part of a viscous subface. both the cases j == 1
8423 ! and j == jl must be tested.
8424  if (j .eq. 1 .and. storewalltensor .and. viscjminpointer(i, &
8425 & k) .gt. 0) then
8426 ! we need to index viscsubface with viscjminpointer(i,k)
8427 ! since tapenade does not like temporary indexes
8428  viscsubface(viscjminpointer(i, k))%tau(i, k, 1) = tauxx
8429  viscsubface(viscjminpointer(i, k))%tau(i, k, 2) = tauyy
8430  viscsubface(viscjminpointer(i, k))%tau(i, k, 3) = tauzz
8431  viscsubface(viscjminpointer(i, k))%tau(i, k, 4) = tauxy
8432  viscsubface(viscjminpointer(i, k))%tau(i, k, 5) = tauxz
8433  viscsubface(viscjminpointer(i, k))%tau(i, k, 6) = tauyz
8434  viscsubface(viscjminpointer(i, k))%q(i, k, 1) = q_x
8435  viscsubface(viscjminpointer(i, k))%q(i, k, 2) = q_y
8436  viscsubface(viscjminpointer(i, k))%q(i, k, 3) = q_z
8437  end if
8438 ! and the j == jl case.
8439  if (j .eq. jl .and. storewalltensor .and. viscjmaxpointer(i&
8440 & , k) .gt. 0) then
8441  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 1) = tauxx
8442  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 2) = tauyy
8443  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 3) = tauzz
8444  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 4) = tauxy
8445  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 5) = tauxz
8446  viscsubface(viscjmaxpointer(i, k))%tau(i, k, 6) = tauyz
8447  viscsubface(viscjmaxpointer(i, k))%q(i, k, 1) = q_x
8448  viscsubface(viscjmaxpointer(i, k))%q(i, k, 2) = q_y
8449  viscsubface(viscjmaxpointer(i, k))%q(i, k, 3) = q_z
8450  end if
8451  end do
8452  end do
8453  end do
8454 !$ad checkpoint-end
8455 !
8456 ! viscous fluxes in the i-direction.
8457 !
8458  continue
8459 !$ad checkpoint-start
8460  mue = zero
8461  do k=2,kl
8462  do j=2,jl
8463  do i=1,il
8464 ! set the value of the porosity. if not zero, it is set
8465 ! to average the eddy-viscosity and to take the factor
8466 ! rfilv into account.
8467  por = half*rfilv
8468  if (pori(i, j, k) .eq. noflux) por = zero
8469 ! compute the laminar and (if present) the eddy viscosities
8470 ! multiplied the porosity. compute the factor in front of
8471 ! the gradients of the speed of sound squared for the heat
8472 ! flux.
8473  mul = por*(rlv(i, j, k)+rlv(i+1, j, k))
8474  if (eddymodel) mue = por*(rev(i, j, k)+rev(i+1, j, k))
8475  mut = mul + mue
8476  gm1 = half*(gamma(i, j, k)+gamma(i+1, j, k)) - one
8477  factlamheat = one/(prandtl*gm1)
8478  factturbheat = one/(prandtlturb*gm1)
8479  heatcoef = mul*factlamheat + mue*factturbheat
8480 ! compute the gradients at the face by averaging the four
8481 ! nodal values.
8482  u_x = fourth*(ux(i, j-1, k-1)+ux(i, j, k-1)+ux(i, j-1, k)+ux&
8483 & (i, j, k))
8484  u_y = fourth*(uy(i, j-1, k-1)+uy(i, j, k-1)+uy(i, j-1, k)+uy&
8485 & (i, j, k))
8486  u_z = fourth*(uz(i, j-1, k-1)+uz(i, j, k-1)+uz(i, j-1, k)+uz&
8487 & (i, j, k))
8488  v_x = fourth*(vx(i, j-1, k-1)+vx(i, j, k-1)+vx(i, j-1, k)+vx&
8489 & (i, j, k))
8490  v_y = fourth*(vy(i, j-1, k-1)+vy(i, j, k-1)+vy(i, j-1, k)+vy&
8491 & (i, j, k))
8492  v_z = fourth*(vz(i, j-1, k-1)+vz(i, j, k-1)+vz(i, j-1, k)+vz&
8493 & (i, j, k))
8494  w_x = fourth*(wx(i, j-1, k-1)+wx(i, j, k-1)+wx(i, j-1, k)+wx&
8495 & (i, j, k))
8496  w_y = fourth*(wy(i, j-1, k-1)+wy(i, j, k-1)+wy(i, j-1, k)+wy&
8497 & (i, j, k))
8498  w_z = fourth*(wz(i, j-1, k-1)+wz(i, j, k-1)+wz(i, j-1, k)+wz&
8499 & (i, j, k))
8500  q_x = fourth*(qx(i, j-1, k-1)+qx(i, j, k-1)+qx(i, j-1, k)+qx&
8501 & (i, j, k))
8502  q_y = fourth*(qy(i, j-1, k-1)+qy(i, j, k-1)+qy(i, j-1, k)+qy&
8503 & (i, j, k))
8504  q_z = fourth*(qz(i, j-1, k-1)+qz(i, j, k-1)+qz(i, j-1, k)+qz&
8505 & (i, j, k))
8506 ! the gradients in the normal direction are corrected, such
8507 ! that no averaging takes places here.
8508 ! first determine the vector in the direction from the
8509 ! cell center i to cell center i+1.
8510  ssx = eighth*(x(i+1, j-1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i+1&
8511 & , j-1, k, 1)-x(i-1, j-1, k, 1)+x(i+1, j, k-1, 1)-x(i-1, j&
8512 & , k-1, 1)+x(i+1, j, k, 1)-x(i-1, j, k, 1))
8513  ssy = eighth*(x(i+1, j-1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i+1&
8514 & , j-1, k, 2)-x(i-1, j-1, k, 2)+x(i+1, j, k-1, 2)-x(i-1, j&
8515 & , k-1, 2)+x(i+1, j, k, 2)-x(i-1, j, k, 2))
8516  ssz = eighth*(x(i+1, j-1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i+1&
8517 & , j-1, k, 3)-x(i-1, j-1, k, 3)+x(i+1, j, k-1, 3)-x(i-1, j&
8518 & , k-1, 3)+x(i+1, j, k, 3)-x(i-1, j, k, 3))
8519 ! determine the length of this vector and create the
8520 ! unit normal.
8521  arg1 = ssx*ssx + ssy*ssy + ssz*ssz
8522  result1 = sqrt(arg1)
8523  ss = one/result1
8524  ssx = ss*ssx
8525  ssy = ss*ssy
8526  ssz = ss*ssz
8527 ! correct the gradients.
8528  corr = u_x*ssx + u_y*ssy + u_z*ssz - (w(i+1, j, k, ivx)-w(i&
8529 & , j, k, ivx))*ss
8530  u_x = u_x - corr*ssx
8531  u_y = u_y - corr*ssy
8532  u_z = u_z - corr*ssz
8533  corr = v_x*ssx + v_y*ssy + v_z*ssz - (w(i+1, j, k, ivy)-w(i&
8534 & , j, k, ivy))*ss
8535  v_x = v_x - corr*ssx
8536  v_y = v_y - corr*ssy
8537  v_z = v_z - corr*ssz
8538  corr = w_x*ssx + w_y*ssy + w_z*ssz - (w(i+1, j, k, ivz)-w(i&
8539 & , j, k, ivz))*ss
8540  w_x = w_x - corr*ssx
8541  w_y = w_y - corr*ssy
8542  w_z = w_z - corr*ssz
8543  corr = q_x*ssx + q_y*ssy + q_z*ssz + (aa(i+1, j, k)-aa(i, j&
8544 & , k))*ss
8545  q_x = q_x - corr*ssx
8546  q_y = q_y - corr*ssy
8547  q_z = q_z - corr*ssz
8548 ! compute the stress tensor and the heat flux vector.
8549 ! we remove the viscosity from the stress tensor (tau)
8550 ! to define taus since we still need to separate between
8551 ! laminar and turbulent stress for qcr.
8552 ! therefore, laminar tau = mue*taus, turbulent
8553 ! tau = mue*taus, and total tau = mut*taus.
8554  fracdiv = twothird*(u_x+v_y+w_z)
8555  tauxxs = two*u_x - fracdiv
8556  tauyys = two*v_y - fracdiv
8557  tauzzs = two*w_z - fracdiv
8558  tauxys = u_y + v_x
8559  tauxzs = u_z + w_x
8560  tauyzs = v_z + w_y
8561  q_x = heatcoef*q_x
8562  q_y = heatcoef*q_y
8563  q_z = heatcoef*q_z
8564 ! add qcr corrections if necessary
8565  if (useqcr) then
8566 ! in the qcr formulation, we add an extra term to the turbulent stress tensor:
8567 !
8568 ! tau_ij,qcr = tau_ij - e_ij
8569 !
8570 ! where, according to tmr website (http://turbmodels.larc.nasa.gov/spalart.html):
8571 !
8572 ! e_ij = ccr1*(o_ik*tau_jk + o_jk*tau_ik)
8573 !
8574 ! we are computing o_ik as follows:
8575 !
8576 ! o_ik = 2*w_ik/den
8577 !
8578 ! remember that the tau_ij in e_ij should use only the eddy viscosity!
8579 ! compute denominator
8580  arg1 = u_x*u_x + u_y*u_y + u_z*u_z + v_x*v_x + v_y*v_y + &
8581 & v_z*v_z + w_x*w_x + w_y*w_y + w_z*w_z
8582  den = sqrt(arg1)
8583  if (den .lt. xminn) then
8584  den = xminn
8585  else
8586  den = den
8587  end if
8588 ! compute factor that will multiply all tensor components.
8589 ! here we add the eddy viscosity that should multiply the stress tensor (tau)
8590 ! components as well.
8591  fact = mue*ccr1/den
8592 ! compute off-diagonal terms of vorticity tensor (we will ommit the 1/2)
8593 ! the diagonals of the vorticity tensor components are always zero
8594  wxy = u_y - v_x
8595  wxz = u_z - w_x
8596  wyz = v_z - w_y
8597  wyx = -wxy
8598  wzx = -wxz
8599  wzy = -wyz
8600 ! compute the extra terms of the boussinesq relation
8601  exx = fact*(wxy*tauxys+wxz*tauxzs)*two
8602  eyy = fact*(wyx*tauxys+wyz*tauyzs)*two
8603  ezz = fact*(wzx*tauxzs+wzy*tauyzs)*two
8604  exy = fact*(wxy*tauyys+wxz*tauyzs+wyx*tauxxs+wyz*tauxzs)
8605  exz = fact*(wxy*tauyzs+wxz*tauzzs+wzx*tauxxs+wzy*tauxys)
8606  eyz = fact*(wyx*tauxzs+wyz*tauzzs+wzx*tauxys+wzy*tauyys)
8607 ! apply the total viscosity to the stress tensor and add extra terms
8608  tauxx = mut*tauxxs - exx
8609  tauyy = mut*tauyys - eyy
8610  tauzz = mut*tauzzs - ezz
8611  tauxy = mut*tauxys - exy
8612  tauxz = mut*tauxzs - exz
8613  tauyz = mut*tauyzs - eyz
8614  else
8615 ! just apply the total viscosity to the stress tensor
8616  tauxx = mut*tauxxs
8617  tauyy = mut*tauyys
8618  tauzz = mut*tauzzs
8619  tauxy = mut*tauxys
8620  tauxz = mut*tauxzs
8621  tauyz = mut*tauyzs
8622  end if
8623 ! compute the average velocities for the face. remember that
8624 ! the velocities are stored and not the momentum.
8625  ubar = half*(w(i, j, k, ivx)+w(i+1, j, k, ivx))
8626  vbar = half*(w(i, j, k, ivy)+w(i+1, j, k, ivy))
8627  wbar = half*(w(i, j, k, ivz)+w(i+1, j, k, ivz))
8628 ! compute the viscous fluxes for this i-face.
8629  fmx = tauxx*si(i, j, k, 1) + tauxy*si(i, j, k, 2) + tauxz*si&
8630 & (i, j, k, 3)
8631  fmy = tauxy*si(i, j, k, 1) + tauyy*si(i, j, k, 2) + tauyz*si&
8632 & (i, j, k, 3)
8633  fmz = tauxz*si(i, j, k, 1) + tauyz*si(i, j, k, 2) + tauzz*si&
8634 & (i, j, k, 3)
8635  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*si(i, j, k, 1) + &
8636 & (ubar*tauxy+vbar*tauyy+wbar*tauyz)*si(i, j, k, 2) + (ubar*&
8637 & tauxz+vbar*tauyz+wbar*tauzz)*si(i, j, k, 3) - q_x*si(i, j&
8638 & , k, 1) - q_y*si(i, j, k, 2) - q_z*si(i, j, k, 3)
8639 ! update the residuals of cell i and i+1.
8640  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
8641  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
8642  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
8643  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
8644  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fmx
8645  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fmy
8646  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fmz
8647  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + frhoe
8648 ! store the stress tensor and the heat flux vector if this
8649 ! face is part of a viscous subface. both the cases i == 1
8650 ! and i == il must be tested.
8651  if (i .eq. 1 .and. storewalltensor .and. visciminpointer(j, &
8652 & k) .gt. 0) then
8653 ! we need to index viscsubface with visciminpointer(j,k)
8654 ! since tapenade does not like temporary indexes
8655  viscsubface(visciminpointer(j, k))%tau(j, k, 1) = tauxx
8656  viscsubface(visciminpointer(j, k))%tau(j, k, 2) = tauyy
8657  viscsubface(visciminpointer(j, k))%tau(j, k, 3) = tauzz
8658  viscsubface(visciminpointer(j, k))%tau(j, k, 4) = tauxy
8659  viscsubface(visciminpointer(j, k))%tau(j, k, 5) = tauxz
8660  viscsubface(visciminpointer(j, k))%tau(j, k, 6) = tauyz
8661  viscsubface(visciminpointer(j, k))%q(j, k, 1) = q_x
8662  viscsubface(visciminpointer(j, k))%q(j, k, 2) = q_y
8663  viscsubface(visciminpointer(j, k))%q(j, k, 3) = q_z
8664  end if
8665 ! and the i == il case.
8666  if (i .eq. il .and. storewalltensor .and. viscimaxpointer(j&
8667 & , k) .gt. 0) then
8668 ! we need to index viscsubface with viscimaxpointer(j,k)
8669 ! since tapenade does not like temporary indexes
8670  viscsubface(viscimaxpointer(j, k))%tau(j, k, 1) = tauxx
8671  viscsubface(viscimaxpointer(j, k))%tau(j, k, 2) = tauyy
8672  viscsubface(viscimaxpointer(j, k))%tau(j, k, 3) = tauzz
8673  viscsubface(viscimaxpointer(j, k))%tau(j, k, 4) = tauxy
8674  viscsubface(viscimaxpointer(j, k))%tau(j, k, 5) = tauxz
8675  viscsubface(viscimaxpointer(j, k))%tau(j, k, 6) = tauyz
8676  viscsubface(viscimaxpointer(j, k))%q(j, k, 1) = q_x
8677  viscsubface(viscimaxpointer(j, k))%q(j, k, 2) = q_y
8678  viscsubface(viscimaxpointer(j, k))%q(j, k, 3) = q_z
8679  end if
8680  end do
8681  end do
8682  end do
8683 !$ad checkpoint-end
8684  continue
8685 ! possibly correct the wall shear stress.
8686 ! wall function is not aded
8687  end if
8688  end subroutine viscousflux
8689 
8690 ! differentiation of viscousfluxapprox in forward (tangent) mode (with options i4 dr8 r8):
8691 ! variations of useful results: *fw
8692 ! with respect to varying inputs: *rev *aa *w *x *rlv *si *sj
8693 ! *sk *fw
8694 ! rw status of diff variables: *rev:in *aa:in *w:in *x:in *rlv:in
8695 ! *si:in *sj:in *sk:in *fw:in-out
8696 ! plus diff mem management of: rev:in aa:in w:in x:in rlv:in
8697 ! si:in sj:in sk:in fw:in
8698  subroutine viscousfluxapprox_d()
8699  use constants
8700  use blockpointers
8701  use flowvarrefstate
8702  use inputphysics
8703  use iteration
8704  implicit none
8705 !
8706 ! local parameter.
8707 !
8708  real(kind=realtype), parameter :: twothird=two*third
8709 !
8710 ! local variables.
8711 !
8712  integer(kind=inttype) :: i, j, k
8713  integer(kind=inttype) :: ii, jj, kk
8714  real(kind=realtype) :: rfilv, por, mul, mue, mut, heatcoef
8715  real(kind=realtype) :: muld, mued, mutd, heatcoefd
8716  real(kind=realtype) :: gm1, factlamheat, factturbheat
8717  real(kind=realtype) :: u_x, u_y, u_z, v_x, v_y, v_z, w_x, w_y, w_z
8718  real(kind=realtype) :: u_xd, u_yd, u_zd, v_xd, v_yd, v_zd, w_xd, &
8719 & w_yd, w_zd
8720  real(kind=realtype) :: q_x, q_y, q_z, ubar, vbar, wbar
8721  real(kind=realtype) :: q_xd, q_yd, q_zd, ubard, vbard, wbard
8722  real(kind=realtype) :: corr, ssx, ssy, ssz, ss, fracdiv
8723  real(kind=realtype) :: ssxd, ssyd, sszd, ssd, fracdivd
8724  real(kind=realtype) :: tauxx, tauyy, tauzz
8725  real(kind=realtype) :: tauxxd, tauyyd, tauzzd
8726  real(kind=realtype) :: tauxy, tauxz, tauyz
8727  real(kind=realtype) :: tauxyd, tauxzd, tauyzd
8728  real(kind=realtype) :: fmx, fmy, fmz, frhoe
8729  real(kind=realtype) :: fmxd, fmyd, fmzd, frhoed
8730  real(kind=realtype) :: dd
8731  real(kind=realtype) :: ddd
8732  logical :: correctfork
8733  real(kind=realtype) :: temp
8734  real(kind=realtype) :: temp0
8735  real(kind=realtype) :: temp1
8736  real(kind=realtype) :: temp2
8737  real(kind=realtype) :: temp3
8738  real(kind=realtype) :: temp4
8739  real(kind=realtype) :: temp5
8740  real(kind=realtype) :: temp6
8741  real(kind=realtype) :: temp7
8742  mue = zero
8743  rfilv = rfil
8744  mued = 0.0_8
8745 ! viscous fluxes in the i-direction
8746  do k=2,kl
8747  do j=2,jl
8748  do i=1,il
8749 ! compute the vector from the center of cell i to cell i+1
8750  ssxd = eighth*(xd(i+1, j-1, k-1, 1)-xd(i-1, j-1, k-1, 1)+xd(i+&
8751 & 1, j-1, k, 1)-xd(i-1, j-1, k, 1)+xd(i+1, j, k-1, 1)-xd(i-1, &
8752 & j, k-1, 1)+xd(i+1, j, k, 1)-xd(i-1, j, k, 1))
8753  ssx = eighth*(x(i+1, j-1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i+1, j&
8754 & -1, k, 1)-x(i-1, j-1, k, 1)+x(i+1, j, k-1, 1)-x(i-1, j, k-1&
8755 & , 1)+x(i+1, j, k, 1)-x(i-1, j, k, 1))
8756  ssyd = eighth*(xd(i+1, j-1, k-1, 2)-xd(i-1, j-1, k-1, 2)+xd(i+&
8757 & 1, j-1, k, 2)-xd(i-1, j-1, k, 2)+xd(i+1, j, k-1, 2)-xd(i-1, &
8758 & j, k-1, 2)+xd(i+1, j, k, 2)-xd(i-1, j, k, 2))
8759  ssy = eighth*(x(i+1, j-1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i+1, j&
8760 & -1, k, 2)-x(i-1, j-1, k, 2)+x(i+1, j, k-1, 2)-x(i-1, j, k-1&
8761 & , 2)+x(i+1, j, k, 2)-x(i-1, j, k, 2))
8762  sszd = eighth*(xd(i+1, j-1, k-1, 3)-xd(i-1, j-1, k-1, 3)+xd(i+&
8763 & 1, j-1, k, 3)-xd(i-1, j-1, k, 3)+xd(i+1, j, k-1, 3)-xd(i-1, &
8764 & j, k-1, 3)+xd(i+1, j, k, 3)-xd(i-1, j, k, 3))
8765  ssz = eighth*(x(i+1, j-1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i+1, j&
8766 & -1, k, 3)-x(i-1, j-1, k, 3)+x(i+1, j, k-1, 3)-x(i-1, j, k-1&
8767 & , 3)+x(i+1, j, k, 3)-x(i-1, j, k, 3))
8768 ! and determine one/ length of vector squared
8769  temp = one/(ssx*ssx+ssy*ssy+ssz*ssz)
8770  ssd = -(temp*(2*ssx*ssxd+2*ssy*ssyd+2*ssz*sszd)/(ssx**2+ssy**2&
8771 & +ssz**2))
8772  ss = temp
8773  ssxd = ssx*ssd + ss*ssxd
8774  ssx = ss*ssx
8775  ssyd = ssy*ssd + ss*ssyd
8776  ssy = ss*ssy
8777  sszd = ssz*ssd + ss*sszd
8778  ssz = ss*ssz
8779 ! now compute each gradient
8780  ddd = wd(i+1, j, k, ivx) - wd(i, j, k, ivx)
8781  dd = w(i+1, j, k, ivx) - w(i, j, k, ivx)
8782  u_xd = ssx*ddd + dd*ssxd
8783  u_x = dd*ssx
8784  u_yd = ssy*ddd + dd*ssyd
8785  u_y = dd*ssy
8786  u_zd = ssz*ddd + dd*sszd
8787  u_z = dd*ssz
8788  ddd = wd(i+1, j, k, ivy) - wd(i, j, k, ivy)
8789  dd = w(i+1, j, k, ivy) - w(i, j, k, ivy)
8790  v_xd = ssx*ddd + dd*ssxd
8791  v_x = dd*ssx
8792  v_yd = ssy*ddd + dd*ssyd
8793  v_y = dd*ssy
8794  v_zd = ssz*ddd + dd*sszd
8795  v_z = dd*ssz
8796  ddd = wd(i+1, j, k, ivz) - wd(i, j, k, ivz)
8797  dd = w(i+1, j, k, ivz) - w(i, j, k, ivz)
8798  w_xd = ssx*ddd + dd*ssxd
8799  w_x = dd*ssx
8800  w_yd = ssy*ddd + dd*ssyd
8801  w_y = dd*ssy
8802  w_zd = ssz*ddd + dd*sszd
8803  w_z = dd*ssz
8804  ddd = aad(i+1, j, k) - aad(i, j, k)
8805  dd = aa(i+1, j, k) - aa(i, j, k)
8806  q_xd = -(ssx*ddd+dd*ssxd)
8807  q_x = -(dd*ssx)
8808  q_yd = -(ssy*ddd+dd*ssyd)
8809  q_y = -(dd*ssy)
8810  q_zd = -(ssz*ddd+dd*sszd)
8811  q_z = -(dd*ssz)
8812  por = half*rfilv
8813  if (pori(i, j, k) .eq. noflux) por = zero
8814 ! compute the laminar and (if present) the eddy viscosities
8815 ! multiplied by the porosity. compute the factor in front of
8816 ! the gradients of the speed of sound squared for the heat
8817 ! flux.
8818  muld = por*(rlvd(i, j, k)+rlvd(i+1, j, k))
8819  mul = por*(rlv(i, j, k)+rlv(i+1, j, k))
8820  if (eddymodel) then
8821  mued = por*(revd(i, j, k)+revd(i+1, j, k))
8822  mue = por*(rev(i, j, k)+rev(i+1, j, k))
8823  end if
8824  mutd = muld + mued
8825  mut = mul + mue
8826  gm1 = half*(gamma(i, j, k)+gamma(i+1, j, k)) - one
8827  factlamheat = one/(prandtl*gm1)
8828  factturbheat = one/(prandtlturb*gm1)
8829  heatcoefd = factlamheat*muld + factturbheat*mued
8830  heatcoef = mul*factlamheat + mue*factturbheat
8831 ! compute the stress tensor and the heat flux vector.
8832  fracdivd = twothird*(u_xd+v_yd+w_zd)
8833  fracdiv = twothird*(u_x+v_y+w_z)
8834  tauxxd = (two*u_x-fracdiv)*mutd + mut*(two*u_xd-fracdivd)
8835  tauxx = mut*(two*u_x-fracdiv)
8836  tauyyd = (two*v_y-fracdiv)*mutd + mut*(two*v_yd-fracdivd)
8837  tauyy = mut*(two*v_y-fracdiv)
8838  tauzzd = (two*w_z-fracdiv)*mutd + mut*(two*w_zd-fracdivd)
8839  tauzz = mut*(two*w_z-fracdiv)
8840  tauxyd = (u_y+v_x)*mutd + mut*(u_yd+v_xd)
8841  tauxy = mut*(u_y+v_x)
8842  tauxzd = (u_z+w_x)*mutd + mut*(u_zd+w_xd)
8843  tauxz = mut*(u_z+w_x)
8844  tauyzd = (v_z+w_y)*mutd + mut*(v_zd+w_yd)
8845  tauyz = mut*(v_z+w_y)
8846  q_xd = q_x*heatcoefd + heatcoef*q_xd
8847  q_x = heatcoef*q_x
8848  q_yd = q_y*heatcoefd + heatcoef*q_yd
8849  q_y = heatcoef*q_y
8850  q_zd = q_z*heatcoefd + heatcoef*q_zd
8851  q_z = heatcoef*q_z
8852 ! compute the average velocities for the face. remember that
8853 ! the velocities are stored and not the momentum.
8854  ubard = half*(wd(i, j, k, ivx)+wd(i+1, j, k, ivx))
8855  ubar = half*(w(i, j, k, ivx)+w(i+1, j, k, ivx))
8856  vbard = half*(wd(i, j, k, ivy)+wd(i+1, j, k, ivy))
8857  vbar = half*(w(i, j, k, ivy)+w(i+1, j, k, ivy))
8858  wbard = half*(wd(i, j, k, ivz)+wd(i+1, j, k, ivz))
8859  wbar = half*(w(i, j, k, ivz)+w(i+1, j, k, ivz))
8860 ! compute the viscous fluxes for this i-face.
8861  temp = si(i, j, k, 1)
8862  temp0 = si(i, j, k, 2)
8863  temp1 = si(i, j, k, 3)
8864  fmxd = temp*tauxxd + tauxx*sid(i, j, k, 1) + temp0*tauxyd + &
8865 & tauxy*sid(i, j, k, 2) + temp1*tauxzd + tauxz*sid(i, j, k, 3)
8866  fmx = tauxx*temp + tauxy*temp0 + tauxz*temp1
8867  temp1 = si(i, j, k, 1)
8868  temp0 = si(i, j, k, 2)
8869  temp = si(i, j, k, 3)
8870  fmyd = temp1*tauxyd + tauxy*sid(i, j, k, 1) + temp0*tauyyd + &
8871 & tauyy*sid(i, j, k, 2) + temp*tauyzd + tauyz*sid(i, j, k, 3)
8872  fmy = tauxy*temp1 + tauyy*temp0 + tauyz*temp
8873  temp1 = si(i, j, k, 1)
8874  temp0 = si(i, j, k, 2)
8875  temp = si(i, j, k, 3)
8876  fmzd = temp1*tauxzd + tauxz*sid(i, j, k, 1) + temp0*tauyzd + &
8877 & tauyz*sid(i, j, k, 2) + temp*tauzzd + tauzz*sid(i, j, k, 3)
8878  fmz = tauxz*temp1 + tauyz*temp0 + tauzz*temp
8879  temp1 = si(i, j, k, 1)
8880  temp0 = ubar*tauxx + vbar*tauxy + wbar*tauxz
8881  temp = si(i, j, k, 2)
8882  temp2 = ubar*tauxy + vbar*tauyy + wbar*tauyz
8883  temp3 = si(i, j, k, 3)
8884  temp4 = ubar*tauxz + vbar*tauyz + wbar*tauzz
8885  temp5 = si(i, j, k, 1)
8886  temp6 = si(i, j, k, 2)
8887  temp7 = si(i, j, k, 3)
8888  frhoed = temp1*(tauxx*ubard+ubar*tauxxd+tauxy*vbard+vbar*&
8889 & tauxyd+tauxz*wbard+wbar*tauxzd) + (temp0-q_x)*sid(i, j, k, 1&
8890 & ) + temp*(tauxy*ubard+ubar*tauxyd+tauyy*vbard+vbar*tauyyd+&
8891 & tauyz*wbard+wbar*tauyzd) + (temp2-q_y)*sid(i, j, k, 2) + &
8892 & temp3*(tauxz*ubard+ubar*tauxzd+tauyz*vbard+vbar*tauyzd+tauzz&
8893 & *wbard+wbar*tauzzd) + (temp4-q_z)*sid(i, j, k, 3) - temp5*&
8894 & q_xd - temp6*q_yd - temp7*q_zd
8895  frhoe = temp0*temp1 + temp2*temp + temp4*temp3 - q_x*temp5 - &
8896 & q_y*temp6 - q_z*temp7
8897 ! update the residuals of cell i and i+1.
8898  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fmxd
8899  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
8900  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fmyd
8901  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
8902  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fmzd
8903  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
8904  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - frhoed
8905  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
8906  fwd(i+1, j, k, imx) = fwd(i+1, j, k, imx) + fmxd
8907  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fmx
8908  fwd(i+1, j, k, imy) = fwd(i+1, j, k, imy) + fmyd
8909  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fmy
8910  fwd(i+1, j, k, imz) = fwd(i+1, j, k, imz) + fmzd
8911  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fmz
8912  fwd(i+1, j, k, irhoe) = fwd(i+1, j, k, irhoe) + frhoed
8913  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + frhoe
8914  end do
8915  end do
8916  end do
8917 ! viscous fluxes in the j-direction
8918  do k=2,kl
8919  do j=1,jl
8920  do i=2,il
8921 ! compute the vector from the center of cell j to cell j+1
8922  ssxd = eighth*(xd(i-1, j+1, k-1, 1)-xd(i-1, j-1, k-1, 1)+xd(i-&
8923 & 1, j+1, k, 1)-xd(i-1, j-1, k, 1)+xd(i, j+1, k-1, 1)-xd(i, j-&
8924 & 1, k-1, 1)+xd(i, j+1, k, 1)-xd(i, j-1, k, 1))
8925  ssx = eighth*(x(i-1, j+1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j&
8926 & +1, k, 1)-x(i-1, j-1, k, 1)+x(i, j+1, k-1, 1)-x(i, j-1, k-1&
8927 & , 1)+x(i, j+1, k, 1)-x(i, j-1, k, 1))
8928  ssyd = eighth*(xd(i-1, j+1, k-1, 2)-xd(i-1, j-1, k-1, 2)+xd(i-&
8929 & 1, j+1, k, 2)-xd(i-1, j-1, k, 2)+xd(i, j+1, k-1, 2)-xd(i, j-&
8930 & 1, k-1, 2)+xd(i, j+1, k, 2)-xd(i, j-1, k, 2))
8931  ssy = eighth*(x(i-1, j+1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j&
8932 & +1, k, 2)-x(i-1, j-1, k, 2)+x(i, j+1, k-1, 2)-x(i, j-1, k-1&
8933 & , 2)+x(i, j+1, k, 2)-x(i, j-1, k, 2))
8934  sszd = eighth*(xd(i-1, j+1, k-1, 3)-xd(i-1, j-1, k-1, 3)+xd(i-&
8935 & 1, j+1, k, 3)-xd(i-1, j-1, k, 3)+xd(i, j+1, k-1, 3)-xd(i, j-&
8936 & 1, k-1, 3)+xd(i, j+1, k, 3)-xd(i, j-1, k, 3))
8937  ssz = eighth*(x(i-1, j+1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j&
8938 & +1, k, 3)-x(i-1, j-1, k, 3)+x(i, j+1, k-1, 3)-x(i, j-1, k-1&
8939 & , 3)+x(i, j+1, k, 3)-x(i, j-1, k, 3))
8940 ! and determine one/ length of vector squared
8941  temp7 = one/(ssx*ssx+ssy*ssy+ssz*ssz)
8942  ssd = -(temp7*(2*ssx*ssxd+2*ssy*ssyd+2*ssz*sszd)/(ssx**2+ssy**&
8943 & 2+ssz**2))
8944  ss = temp7
8945  ssxd = ssx*ssd + ss*ssxd
8946  ssx = ss*ssx
8947  ssyd = ssy*ssd + ss*ssyd
8948  ssy = ss*ssy
8949  sszd = ssz*ssd + ss*sszd
8950  ssz = ss*ssz
8951 ! now compute each gradient
8952  ddd = wd(i, j+1, k, ivx) - wd(i, j, k, ivx)
8953  dd = w(i, j+1, k, ivx) - w(i, j, k, ivx)
8954  u_xd = ssx*ddd + dd*ssxd
8955  u_x = dd*ssx
8956  u_yd = ssy*ddd + dd*ssyd
8957  u_y = dd*ssy
8958  u_zd = ssz*ddd + dd*sszd
8959  u_z = dd*ssz
8960  ddd = wd(i, j+1, k, ivy) - wd(i, j, k, ivy)
8961  dd = w(i, j+1, k, ivy) - w(i, j, k, ivy)
8962  v_xd = ssx*ddd + dd*ssxd
8963  v_x = dd*ssx
8964  v_yd = ssy*ddd + dd*ssyd
8965  v_y = dd*ssy
8966  v_zd = ssz*ddd + dd*sszd
8967  v_z = dd*ssz
8968  ddd = wd(i, j+1, k, ivz) - wd(i, j, k, ivz)
8969  dd = w(i, j+1, k, ivz) - w(i, j, k, ivz)
8970  w_xd = ssx*ddd + dd*ssxd
8971  w_x = dd*ssx
8972  w_yd = ssy*ddd + dd*ssyd
8973  w_y = dd*ssy
8974  w_zd = ssz*ddd + dd*sszd
8975  w_z = dd*ssz
8976  ddd = aad(i, j+1, k) - aad(i, j, k)
8977  dd = aa(i, j+1, k) - aa(i, j, k)
8978  q_xd = -(ssx*ddd+dd*ssxd)
8979  q_x = -(dd*ssx)
8980  q_yd = -(ssy*ddd+dd*ssyd)
8981  q_y = -(dd*ssy)
8982  q_zd = -(ssz*ddd+dd*sszd)
8983  q_z = -(dd*ssz)
8984  por = half*rfilv
8985  if (porj(i, j, k) .eq. noflux) por = zero
8986 ! compute the laminar and (if present) the eddy viscosities
8987 ! multiplied by the porosity. compute the factor in front of
8988 ! the gradients of the speed of sound squared for the heat
8989 ! flux.
8990  muld = por*(rlvd(i, j, k)+rlvd(i, j+1, k))
8991  mul = por*(rlv(i, j, k)+rlv(i, j+1, k))
8992  if (eddymodel) then
8993  mued = por*(revd(i, j, k)+revd(i, j+1, k))
8994  mue = por*(rev(i, j, k)+rev(i, j+1, k))
8995  end if
8996  mutd = muld + mued
8997  mut = mul + mue
8998  gm1 = half*(gamma(i, j, k)+gamma(i, j+1, k)) - one
8999  factlamheat = one/(prandtl*gm1)
9000  factturbheat = one/(prandtlturb*gm1)
9001  heatcoefd = factlamheat*muld + factturbheat*mued
9002  heatcoef = mul*factlamheat + mue*factturbheat
9003 ! compute the stress tensor and the heat flux vector.
9004  fracdivd = twothird*(u_xd+v_yd+w_zd)
9005  fracdiv = twothird*(u_x+v_y+w_z)
9006  tauxxd = (two*u_x-fracdiv)*mutd + mut*(two*u_xd-fracdivd)
9007  tauxx = mut*(two*u_x-fracdiv)
9008  tauyyd = (two*v_y-fracdiv)*mutd + mut*(two*v_yd-fracdivd)
9009  tauyy = mut*(two*v_y-fracdiv)
9010  tauzzd = (two*w_z-fracdiv)*mutd + mut*(two*w_zd-fracdivd)
9011  tauzz = mut*(two*w_z-fracdiv)
9012  tauxyd = (u_y+v_x)*mutd + mut*(u_yd+v_xd)
9013  tauxy = mut*(u_y+v_x)
9014  tauxzd = (u_z+w_x)*mutd + mut*(u_zd+w_xd)
9015  tauxz = mut*(u_z+w_x)
9016  tauyzd = (v_z+w_y)*mutd + mut*(v_zd+w_yd)
9017  tauyz = mut*(v_z+w_y)
9018  q_xd = q_x*heatcoefd + heatcoef*q_xd
9019  q_x = heatcoef*q_x
9020  q_yd = q_y*heatcoefd + heatcoef*q_yd
9021  q_y = heatcoef*q_y
9022  q_zd = q_z*heatcoefd + heatcoef*q_zd
9023  q_z = heatcoef*q_z
9024 ! compute the average velocities for the face. remember that
9025 ! the velocities are stored and not the momentum.
9026  ubard = half*(wd(i, j, k, ivx)+wd(i, j+1, k, ivx))
9027  ubar = half*(w(i, j, k, ivx)+w(i, j+1, k, ivx))
9028  vbard = half*(wd(i, j, k, ivy)+wd(i, j+1, k, ivy))
9029  vbar = half*(w(i, j, k, ivy)+w(i, j+1, k, ivy))
9030  wbard = half*(wd(i, j, k, ivz)+wd(i, j+1, k, ivz))
9031  wbar = half*(w(i, j, k, ivz)+w(i, j+1, k, ivz))
9032 ! compute the viscous fluxes for this j-face.
9033  temp7 = sj(i, j, k, 1)
9034  temp6 = sj(i, j, k, 2)
9035  temp5 = sj(i, j, k, 3)
9036  fmxd = temp7*tauxxd + tauxx*sjd(i, j, k, 1) + temp6*tauxyd + &
9037 & tauxy*sjd(i, j, k, 2) + temp5*tauxzd + tauxz*sjd(i, j, k, 3)
9038  fmx = tauxx*temp7 + tauxy*temp6 + tauxz*temp5
9039  temp7 = sj(i, j, k, 1)
9040  temp6 = sj(i, j, k, 2)
9041  temp5 = sj(i, j, k, 3)
9042  fmyd = temp7*tauxyd + tauxy*sjd(i, j, k, 1) + temp6*tauyyd + &
9043 & tauyy*sjd(i, j, k, 2) + temp5*tauyzd + tauyz*sjd(i, j, k, 3)
9044  fmy = tauxy*temp7 + tauyy*temp6 + tauyz*temp5
9045  temp7 = sj(i, j, k, 1)
9046  temp6 = sj(i, j, k, 2)
9047  temp5 = sj(i, j, k, 3)
9048  fmzd = temp7*tauxzd + tauxz*sjd(i, j, k, 1) + temp6*tauyzd + &
9049 & tauyz*sjd(i, j, k, 2) + temp5*tauzzd + tauzz*sjd(i, j, k, 3)
9050  fmz = tauxz*temp7 + tauyz*temp6 + tauzz*temp5
9051  temp7 = sj(i, j, k, 1)
9052  temp6 = ubar*tauxx + vbar*tauxy + wbar*tauxz
9053  temp5 = sj(i, j, k, 2)
9054  temp4 = ubar*tauxy + vbar*tauyy + wbar*tauyz
9055  temp3 = sj(i, j, k, 3)
9056  temp2 = ubar*tauxz + vbar*tauyz + wbar*tauzz
9057  temp1 = sj(i, j, k, 1)
9058  temp0 = sj(i, j, k, 2)
9059  temp = sj(i, j, k, 3)
9060  frhoed = temp7*(tauxx*ubard+ubar*tauxxd+tauxy*vbard+vbar*&
9061 & tauxyd+tauxz*wbard+wbar*tauxzd) + (temp6-q_x)*sjd(i, j, k, 1&
9062 & ) + temp5*(tauxy*ubard+ubar*tauxyd+tauyy*vbard+vbar*tauyyd+&
9063 & tauyz*wbard+wbar*tauyzd) + (temp4-q_y)*sjd(i, j, k, 2) + &
9064 & temp3*(tauxz*ubard+ubar*tauxzd+tauyz*vbard+vbar*tauyzd+tauzz&
9065 & *wbard+wbar*tauzzd) + (temp2-q_z)*sjd(i, j, k, 3) - temp1*&
9066 & q_xd - temp0*q_yd - temp*q_zd
9067  frhoe = temp6*temp7 + temp4*temp5 + temp2*temp3 - q_x*temp1 - &
9068 & q_y*temp0 - q_z*temp
9069 ! update the residuals of cell j and j+1.
9070  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fmxd
9071  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
9072  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fmyd
9073  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
9074  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fmzd
9075  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
9076  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - frhoed
9077  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
9078  fwd(i, j+1, k, imx) = fwd(i, j+1, k, imx) + fmxd
9079  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fmx
9080  fwd(i, j+1, k, imy) = fwd(i, j+1, k, imy) + fmyd
9081  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fmy
9082  fwd(i, j+1, k, imz) = fwd(i, j+1, k, imz) + fmzd
9083  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fmz
9084  fwd(i, j+1, k, irhoe) = fwd(i, j+1, k, irhoe) + frhoed
9085  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + frhoe
9086  end do
9087  end do
9088  end do
9089 ! viscous fluxes in the k-direction
9090  do k=1,kl
9091  do j=2,jl
9092  do i=2,il
9093 ! compute the vector from the center of cell k to cell k+1
9094  ssxd = eighth*(xd(i-1, j-1, k+1, 1)-xd(i-1, j-1, k-1, 1)+xd(i-&
9095 & 1, j, k+1, 1)-xd(i-1, j, k-1, 1)+xd(i, j-1, k+1, 1)-xd(i, j-&
9096 & 1, k-1, 1)+xd(i, j, k+1, 1)-xd(i, j, k-1, 1))
9097  ssx = eighth*(x(i-1, j-1, k+1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j&
9098 & , k+1, 1)-x(i-1, j, k-1, 1)+x(i, j-1, k+1, 1)-x(i, j-1, k-1&
9099 & , 1)+x(i, j, k+1, 1)-x(i, j, k-1, 1))
9100  ssyd = eighth*(xd(i-1, j-1, k+1, 2)-xd(i-1, j-1, k-1, 2)+xd(i-&
9101 & 1, j, k+1, 2)-xd(i-1, j, k-1, 2)+xd(i, j-1, k+1, 2)-xd(i, j-&
9102 & 1, k-1, 2)+xd(i, j, k+1, 2)-xd(i, j, k-1, 2))
9103  ssy = eighth*(x(i-1, j-1, k+1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j&
9104 & , k+1, 2)-x(i-1, j, k-1, 2)+x(i, j-1, k+1, 2)-x(i, j-1, k-1&
9105 & , 2)+x(i, j, k+1, 2)-x(i, j, k-1, 2))
9106  sszd = eighth*(xd(i-1, j-1, k+1, 3)-xd(i-1, j-1, k-1, 3)+xd(i-&
9107 & 1, j, k+1, 3)-xd(i-1, j, k-1, 3)+xd(i, j-1, k+1, 3)-xd(i, j-&
9108 & 1, k-1, 3)+xd(i, j, k+1, 3)-xd(i, j, k-1, 3))
9109  ssz = eighth*(x(i-1, j-1, k+1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j&
9110 & , k+1, 3)-x(i-1, j, k-1, 3)+x(i, j-1, k+1, 3)-x(i, j-1, k-1&
9111 & , 3)+x(i, j, k+1, 3)-x(i, j, k-1, 3))
9112 ! and determine one/ length of vector squared
9113  temp7 = one/(ssx*ssx+ssy*ssy+ssz*ssz)
9114  ssd = -(temp7*(2*ssx*ssxd+2*ssy*ssyd+2*ssz*sszd)/(ssx**2+ssy**&
9115 & 2+ssz**2))
9116  ss = temp7
9117  ssxd = ssx*ssd + ss*ssxd
9118  ssx = ss*ssx
9119  ssyd = ssy*ssd + ss*ssyd
9120  ssy = ss*ssy
9121  sszd = ssz*ssd + ss*sszd
9122  ssz = ss*ssz
9123 ! now compute each gradient
9124  ddd = wd(i, j, k+1, ivx) - wd(i, j, k, ivx)
9125  dd = w(i, j, k+1, ivx) - w(i, j, k, ivx)
9126  u_xd = ssx*ddd + dd*ssxd
9127  u_x = dd*ssx
9128  u_yd = ssy*ddd + dd*ssyd
9129  u_y = dd*ssy
9130  u_zd = ssz*ddd + dd*sszd
9131  u_z = dd*ssz
9132  ddd = wd(i, j, k+1, ivy) - wd(i, j, k, ivy)
9133  dd = w(i, j, k+1, ivy) - w(i, j, k, ivy)
9134  v_xd = ssx*ddd + dd*ssxd
9135  v_x = dd*ssx
9136  v_yd = ssy*ddd + dd*ssyd
9137  v_y = dd*ssy
9138  v_zd = ssz*ddd + dd*sszd
9139  v_z = dd*ssz
9140  ddd = wd(i, j, k+1, ivz) - wd(i, j, k, ivz)
9141  dd = w(i, j, k+1, ivz) - w(i, j, k, ivz)
9142  w_xd = ssx*ddd + dd*ssxd
9143  w_x = dd*ssx
9144  w_yd = ssy*ddd + dd*ssyd
9145  w_y = dd*ssy
9146  w_zd = ssz*ddd + dd*sszd
9147  w_z = dd*ssz
9148  ddd = aad(i, j, k+1) - aad(i, j, k)
9149  dd = aa(i, j, k+1) - aa(i, j, k)
9150  q_xd = -(ssx*ddd+dd*ssxd)
9151  q_x = -(dd*ssx)
9152  q_yd = -(ssy*ddd+dd*ssyd)
9153  q_y = -(dd*ssy)
9154  q_zd = -(ssz*ddd+dd*sszd)
9155  q_z = -(dd*ssz)
9156  por = half*rfilv
9157  if (pork(i, j, k) .eq. noflux) por = zero
9158 ! compute the laminar and (if present) the eddy viscosities
9159 ! multiplied by the porosity. compute the factor in front of
9160 ! the gradients of the speed of sound squared for the heat
9161 ! flux.
9162  muld = por*(rlvd(i, j, k)+rlvd(i, j, k+1))
9163  mul = por*(rlv(i, j, k)+rlv(i, j, k+1))
9164  if (eddymodel) then
9165  mued = por*(revd(i, j, k)+revd(i, j, k+1))
9166  mue = por*(rev(i, j, k)+rev(i, j, k+1))
9167  end if
9168  mutd = muld + mued
9169  mut = mul + mue
9170  gm1 = half*(gamma(i, j, k)+gamma(i, j, k+1)) - one
9171  factlamheat = one/(prandtl*gm1)
9172  factturbheat = one/(prandtlturb*gm1)
9173  heatcoefd = factlamheat*muld + factturbheat*mued
9174  heatcoef = mul*factlamheat + mue*factturbheat
9175 ! compute the stress tensor and the heat flux vector.
9176  fracdivd = twothird*(u_xd+v_yd+w_zd)
9177  fracdiv = twothird*(u_x+v_y+w_z)
9178  tauxxd = (two*u_x-fracdiv)*mutd + mut*(two*u_xd-fracdivd)
9179  tauxx = mut*(two*u_x-fracdiv)
9180  tauyyd = (two*v_y-fracdiv)*mutd + mut*(two*v_yd-fracdivd)
9181  tauyy = mut*(two*v_y-fracdiv)
9182  tauzzd = (two*w_z-fracdiv)*mutd + mut*(two*w_zd-fracdivd)
9183  tauzz = mut*(two*w_z-fracdiv)
9184  tauxyd = (u_y+v_x)*mutd + mut*(u_yd+v_xd)
9185  tauxy = mut*(u_y+v_x)
9186  tauxzd = (u_z+w_x)*mutd + mut*(u_zd+w_xd)
9187  tauxz = mut*(u_z+w_x)
9188  tauyzd = (v_z+w_y)*mutd + mut*(v_zd+w_yd)
9189  tauyz = mut*(v_z+w_y)
9190  q_xd = q_x*heatcoefd + heatcoef*q_xd
9191  q_x = heatcoef*q_x
9192  q_yd = q_y*heatcoefd + heatcoef*q_yd
9193  q_y = heatcoef*q_y
9194  q_zd = q_z*heatcoefd + heatcoef*q_zd
9195  q_z = heatcoef*q_z
9196 ! compute the average velocities for the face. remember that
9197 ! the velocities are stored and not the momentum.
9198  ubard = half*(wd(i, j, k, ivx)+wd(i, j, k+1, ivx))
9199  ubar = half*(w(i, j, k, ivx)+w(i, j, k+1, ivx))
9200  vbard = half*(wd(i, j, k, ivy)+wd(i, j, k+1, ivy))
9201  vbar = half*(w(i, j, k, ivy)+w(i, j, k+1, ivy))
9202  wbard = half*(wd(i, j, k, ivz)+wd(i, j, k+1, ivz))
9203  wbar = half*(w(i, j, k, ivz)+w(i, j, k+1, ivz))
9204 ! compute the viscous fluxes for this j-face.
9205  temp7 = sk(i, j, k, 1)
9206  temp6 = sk(i, j, k, 2)
9207  temp5 = sk(i, j, k, 3)
9208  fmxd = temp7*tauxxd + tauxx*skd(i, j, k, 1) + temp6*tauxyd + &
9209 & tauxy*skd(i, j, k, 2) + temp5*tauxzd + tauxz*skd(i, j, k, 3)
9210  fmx = tauxx*temp7 + tauxy*temp6 + tauxz*temp5
9211  temp7 = sk(i, j, k, 1)
9212  temp6 = sk(i, j, k, 2)
9213  temp5 = sk(i, j, k, 3)
9214  fmyd = temp7*tauxyd + tauxy*skd(i, j, k, 1) + temp6*tauyyd + &
9215 & tauyy*skd(i, j, k, 2) + temp5*tauyzd + tauyz*skd(i, j, k, 3)
9216  fmy = tauxy*temp7 + tauyy*temp6 + tauyz*temp5
9217  temp7 = sk(i, j, k, 1)
9218  temp6 = sk(i, j, k, 2)
9219  temp5 = sk(i, j, k, 3)
9220  fmzd = temp7*tauxzd + tauxz*skd(i, j, k, 1) + temp6*tauyzd + &
9221 & tauyz*skd(i, j, k, 2) + temp5*tauzzd + tauzz*skd(i, j, k, 3)
9222  fmz = tauxz*temp7 + tauyz*temp6 + tauzz*temp5
9223  temp7 = sk(i, j, k, 1)
9224  temp6 = ubar*tauxx + vbar*tauxy + wbar*tauxz
9225  temp5 = sk(i, j, k, 2)
9226  temp4 = ubar*tauxy + vbar*tauyy + wbar*tauyz
9227  temp3 = sk(i, j, k, 3)
9228  temp2 = ubar*tauxz + vbar*tauyz + wbar*tauzz
9229  temp1 = sk(i, j, k, 1)
9230  temp0 = sk(i, j, k, 2)
9231  temp = sk(i, j, k, 3)
9232  frhoed = temp7*(tauxx*ubard+ubar*tauxxd+tauxy*vbard+vbar*&
9233 & tauxyd+tauxz*wbard+wbar*tauxzd) + (temp6-q_x)*skd(i, j, k, 1&
9234 & ) + temp5*(tauxy*ubard+ubar*tauxyd+tauyy*vbard+vbar*tauyyd+&
9235 & tauyz*wbard+wbar*tauyzd) + (temp4-q_y)*skd(i, j, k, 2) + &
9236 & temp3*(tauxz*ubard+ubar*tauxzd+tauyz*vbard+vbar*tauyzd+tauzz&
9237 & *wbard+wbar*tauzzd) + (temp2-q_z)*skd(i, j, k, 3) - temp1*&
9238 & q_xd - temp0*q_yd - temp*q_zd
9239  frhoe = temp6*temp7 + temp4*temp5 + temp2*temp3 - q_x*temp1 - &
9240 & q_y*temp0 - q_z*temp
9241 ! update the residuals of cell j and j+1.
9242  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fmxd
9243  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
9244  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fmyd
9245  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
9246  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fmzd
9247  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
9248  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - frhoed
9249  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
9250  fwd(i, j, k+1, imx) = fwd(i, j, k+1, imx) + fmxd
9251  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fmx
9252  fwd(i, j, k+1, imy) = fwd(i, j, k+1, imy) + fmyd
9253  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fmy
9254  fwd(i, j, k+1, imz) = fwd(i, j, k+1, imz) + fmzd
9255  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fmz
9256  fwd(i, j, k+1, irhoe) = fwd(i, j, k+1, irhoe) + frhoed
9257  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + frhoe
9258  end do
9259  end do
9260  end do
9261  end subroutine viscousfluxapprox_d
9262 
9263  subroutine viscousfluxapprox()
9264  use constants
9265  use blockpointers
9266  use flowvarrefstate
9267  use inputphysics
9268  use iteration
9269  implicit none
9270 !
9271 ! local parameter.
9272 !
9273  real(kind=realtype), parameter :: twothird=two*third
9274 !
9275 ! local variables.
9276 !
9277  integer(kind=inttype) :: i, j, k
9278  integer(kind=inttype) :: ii, jj, kk
9279  real(kind=realtype) :: rfilv, por, mul, mue, mut, heatcoef
9280  real(kind=realtype) :: gm1, factlamheat, factturbheat
9281  real(kind=realtype) :: u_x, u_y, u_z, v_x, v_y, v_z, w_x, w_y, w_z
9282  real(kind=realtype) :: q_x, q_y, q_z, ubar, vbar, wbar
9283  real(kind=realtype) :: corr, ssx, ssy, ssz, ss, fracdiv
9284  real(kind=realtype) :: tauxx, tauyy, tauzz
9285  real(kind=realtype) :: tauxy, tauxz, tauyz
9286  real(kind=realtype) :: fmx, fmy, fmz, frhoe
9287  real(kind=realtype) :: dd
9288  logical :: correctfork
9289  mue = zero
9290  rfilv = rfil
9291 ! viscous fluxes in the i-direction
9292  do k=2,kl
9293  do j=2,jl
9294  do i=1,il
9295 ! compute the vector from the center of cell i to cell i+1
9296  ssx = eighth*(x(i+1, j-1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i+1, j&
9297 & -1, k, 1)-x(i-1, j-1, k, 1)+x(i+1, j, k-1, 1)-x(i-1, j, k-1&
9298 & , 1)+x(i+1, j, k, 1)-x(i-1, j, k, 1))
9299  ssy = eighth*(x(i+1, j-1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i+1, j&
9300 & -1, k, 2)-x(i-1, j-1, k, 2)+x(i+1, j, k-1, 2)-x(i-1, j, k-1&
9301 & , 2)+x(i+1, j, k, 2)-x(i-1, j, k, 2))
9302  ssz = eighth*(x(i+1, j-1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i+1, j&
9303 & -1, k, 3)-x(i-1, j-1, k, 3)+x(i+1, j, k-1, 3)-x(i-1, j, k-1&
9304 & , 3)+x(i+1, j, k, 3)-x(i-1, j, k, 3))
9305 ! and determine one/ length of vector squared
9306  ss = one/(ssx*ssx+ssy*ssy+ssz*ssz)
9307  ssx = ss*ssx
9308  ssy = ss*ssy
9309  ssz = ss*ssz
9310 ! now compute each gradient
9311  dd = w(i+1, j, k, ivx) - w(i, j, k, ivx)
9312  u_x = dd*ssx
9313  u_y = dd*ssy
9314  u_z = dd*ssz
9315  dd = w(i+1, j, k, ivy) - w(i, j, k, ivy)
9316  v_x = dd*ssx
9317  v_y = dd*ssy
9318  v_z = dd*ssz
9319  dd = w(i+1, j, k, ivz) - w(i, j, k, ivz)
9320  w_x = dd*ssx
9321  w_y = dd*ssy
9322  w_z = dd*ssz
9323  dd = aa(i+1, j, k) - aa(i, j, k)
9324  q_x = -(dd*ssx)
9325  q_y = -(dd*ssy)
9326  q_z = -(dd*ssz)
9327  por = half*rfilv
9328  if (pori(i, j, k) .eq. noflux) por = zero
9329 ! compute the laminar and (if present) the eddy viscosities
9330 ! multiplied by the porosity. compute the factor in front of
9331 ! the gradients of the speed of sound squared for the heat
9332 ! flux.
9333  mul = por*(rlv(i, j, k)+rlv(i+1, j, k))
9334  if (eddymodel) mue = por*(rev(i, j, k)+rev(i+1, j, k))
9335  mut = mul + mue
9336  gm1 = half*(gamma(i, j, k)+gamma(i+1, j, k)) - one
9337  factlamheat = one/(prandtl*gm1)
9338  factturbheat = one/(prandtlturb*gm1)
9339  heatcoef = mul*factlamheat + mue*factturbheat
9340 ! compute the stress tensor and the heat flux vector.
9341  fracdiv = twothird*(u_x+v_y+w_z)
9342  tauxx = mut*(two*u_x-fracdiv)
9343  tauyy = mut*(two*v_y-fracdiv)
9344  tauzz = mut*(two*w_z-fracdiv)
9345  tauxy = mut*(u_y+v_x)
9346  tauxz = mut*(u_z+w_x)
9347  tauyz = mut*(v_z+w_y)
9348  q_x = heatcoef*q_x
9349  q_y = heatcoef*q_y
9350  q_z = heatcoef*q_z
9351 ! compute the average velocities for the face. remember that
9352 ! the velocities are stored and not the momentum.
9353  ubar = half*(w(i, j, k, ivx)+w(i+1, j, k, ivx))
9354  vbar = half*(w(i, j, k, ivy)+w(i+1, j, k, ivy))
9355  wbar = half*(w(i, j, k, ivz)+w(i+1, j, k, ivz))
9356 ! compute the viscous fluxes for this i-face.
9357  fmx = tauxx*si(i, j, k, 1) + tauxy*si(i, j, k, 2) + tauxz*si(i&
9358 & , j, k, 3)
9359  fmy = tauxy*si(i, j, k, 1) + tauyy*si(i, j, k, 2) + tauyz*si(i&
9360 & , j, k, 3)
9361  fmz = tauxz*si(i, j, k, 1) + tauyz*si(i, j, k, 2) + tauzz*si(i&
9362 & , j, k, 3)
9363  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*si(i, j, k, 1) + (&
9364 & ubar*tauxy+vbar*tauyy+wbar*tauyz)*si(i, j, k, 2) + (ubar*&
9365 & tauxz+vbar*tauyz+wbar*tauzz)*si(i, j, k, 3) - q_x*si(i, j, k&
9366 & , 1) - q_y*si(i, j, k, 2) - q_z*si(i, j, k, 3)
9367 ! update the residuals of cell i and i+1.
9368  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
9369  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
9370  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
9371  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
9372  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fmx
9373  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fmy
9374  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fmz
9375  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + frhoe
9376  end do
9377  end do
9378  end do
9379 ! viscous fluxes in the j-direction
9380  do k=2,kl
9381  do j=1,jl
9382  do i=2,il
9383 ! compute the vector from the center of cell j to cell j+1
9384  ssx = eighth*(x(i-1, j+1, k-1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j&
9385 & +1, k, 1)-x(i-1, j-1, k, 1)+x(i, j+1, k-1, 1)-x(i, j-1, k-1&
9386 & , 1)+x(i, j+1, k, 1)-x(i, j-1, k, 1))
9387  ssy = eighth*(x(i-1, j+1, k-1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j&
9388 & +1, k, 2)-x(i-1, j-1, k, 2)+x(i, j+1, k-1, 2)-x(i, j-1, k-1&
9389 & , 2)+x(i, j+1, k, 2)-x(i, j-1, k, 2))
9390  ssz = eighth*(x(i-1, j+1, k-1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j&
9391 & +1, k, 3)-x(i-1, j-1, k, 3)+x(i, j+1, k-1, 3)-x(i, j-1, k-1&
9392 & , 3)+x(i, j+1, k, 3)-x(i, j-1, k, 3))
9393 ! and determine one/ length of vector squared
9394  ss = one/(ssx*ssx+ssy*ssy+ssz*ssz)
9395  ssx = ss*ssx
9396  ssy = ss*ssy
9397  ssz = ss*ssz
9398 ! now compute each gradient
9399  dd = w(i, j+1, k, ivx) - w(i, j, k, ivx)
9400  u_x = dd*ssx
9401  u_y = dd*ssy
9402  u_z = dd*ssz
9403  dd = w(i, j+1, k, ivy) - w(i, j, k, ivy)
9404  v_x = dd*ssx
9405  v_y = dd*ssy
9406  v_z = dd*ssz
9407  dd = w(i, j+1, k, ivz) - w(i, j, k, ivz)
9408  w_x = dd*ssx
9409  w_y = dd*ssy
9410  w_z = dd*ssz
9411  dd = aa(i, j+1, k) - aa(i, j, k)
9412  q_x = -(dd*ssx)
9413  q_y = -(dd*ssy)
9414  q_z = -(dd*ssz)
9415  por = half*rfilv
9416  if (porj(i, j, k) .eq. noflux) por = zero
9417 ! compute the laminar and (if present) the eddy viscosities
9418 ! multiplied by the porosity. compute the factor in front of
9419 ! the gradients of the speed of sound squared for the heat
9420 ! flux.
9421  mul = por*(rlv(i, j, k)+rlv(i, j+1, k))
9422  if (eddymodel) mue = por*(rev(i, j, k)+rev(i, j+1, k))
9423  mut = mul + mue
9424  gm1 = half*(gamma(i, j, k)+gamma(i, j+1, k)) - one
9425  factlamheat = one/(prandtl*gm1)
9426  factturbheat = one/(prandtlturb*gm1)
9427  heatcoef = mul*factlamheat + mue*factturbheat
9428 ! compute the stress tensor and the heat flux vector.
9429  fracdiv = twothird*(u_x+v_y+w_z)
9430  tauxx = mut*(two*u_x-fracdiv)
9431  tauyy = mut*(two*v_y-fracdiv)
9432  tauzz = mut*(two*w_z-fracdiv)
9433  tauxy = mut*(u_y+v_x)
9434  tauxz = mut*(u_z+w_x)
9435  tauyz = mut*(v_z+w_y)
9436  q_x = heatcoef*q_x
9437  q_y = heatcoef*q_y
9438  q_z = heatcoef*q_z
9439 ! compute the average velocities for the face. remember that
9440 ! the velocities are stored and not the momentum.
9441  ubar = half*(w(i, j, k, ivx)+w(i, j+1, k, ivx))
9442  vbar = half*(w(i, j, k, ivy)+w(i, j+1, k, ivy))
9443  wbar = half*(w(i, j, k, ivz)+w(i, j+1, k, ivz))
9444 ! compute the viscous fluxes for this j-face.
9445  fmx = tauxx*sj(i, j, k, 1) + tauxy*sj(i, j, k, 2) + tauxz*sj(i&
9446 & , j, k, 3)
9447  fmy = tauxy*sj(i, j, k, 1) + tauyy*sj(i, j, k, 2) + tauyz*sj(i&
9448 & , j, k, 3)
9449  fmz = tauxz*sj(i, j, k, 1) + tauyz*sj(i, j, k, 2) + tauzz*sj(i&
9450 & , j, k, 3)
9451  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*sj(i, j, k, 1) + (&
9452 & ubar*tauxy+vbar*tauyy+wbar*tauyz)*sj(i, j, k, 2) + (ubar*&
9453 & tauxz+vbar*tauyz+wbar*tauzz)*sj(i, j, k, 3) - q_x*sj(i, j, k&
9454 & , 1) - q_y*sj(i, j, k, 2) - q_z*sj(i, j, k, 3)
9455 ! update the residuals of cell j and j+1.
9456  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
9457  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
9458  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
9459  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
9460  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fmx
9461  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fmy
9462  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fmz
9463  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + frhoe
9464  end do
9465  end do
9466  end do
9467 ! viscous fluxes in the k-direction
9468  do k=1,kl
9469  do j=2,jl
9470  do i=2,il
9471 ! compute the vector from the center of cell k to cell k+1
9472  ssx = eighth*(x(i-1, j-1, k+1, 1)-x(i-1, j-1, k-1, 1)+x(i-1, j&
9473 & , k+1, 1)-x(i-1, j, k-1, 1)+x(i, j-1, k+1, 1)-x(i, j-1, k-1&
9474 & , 1)+x(i, j, k+1, 1)-x(i, j, k-1, 1))
9475  ssy = eighth*(x(i-1, j-1, k+1, 2)-x(i-1, j-1, k-1, 2)+x(i-1, j&
9476 & , k+1, 2)-x(i-1, j, k-1, 2)+x(i, j-1, k+1, 2)-x(i, j-1, k-1&
9477 & , 2)+x(i, j, k+1, 2)-x(i, j, k-1, 2))
9478  ssz = eighth*(x(i-1, j-1, k+1, 3)-x(i-1, j-1, k-1, 3)+x(i-1, j&
9479 & , k+1, 3)-x(i-1, j, k-1, 3)+x(i, j-1, k+1, 3)-x(i, j-1, k-1&
9480 & , 3)+x(i, j, k+1, 3)-x(i, j, k-1, 3))
9481 ! and determine one/ length of vector squared
9482  ss = one/(ssx*ssx+ssy*ssy+ssz*ssz)
9483  ssx = ss*ssx
9484  ssy = ss*ssy
9485  ssz = ss*ssz
9486 ! now compute each gradient
9487  dd = w(i, j, k+1, ivx) - w(i, j, k, ivx)
9488  u_x = dd*ssx
9489  u_y = dd*ssy
9490  u_z = dd*ssz
9491  dd = w(i, j, k+1, ivy) - w(i, j, k, ivy)
9492  v_x = dd*ssx
9493  v_y = dd*ssy
9494  v_z = dd*ssz
9495  dd = w(i, j, k+1, ivz) - w(i, j, k, ivz)
9496  w_x = dd*ssx
9497  w_y = dd*ssy
9498  w_z = dd*ssz
9499  dd = aa(i, j, k+1) - aa(i, j, k)
9500  q_x = -(dd*ssx)
9501  q_y = -(dd*ssy)
9502  q_z = -(dd*ssz)
9503  por = half*rfilv
9504  if (pork(i, j, k) .eq. noflux) por = zero
9505 ! compute the laminar and (if present) the eddy viscosities
9506 ! multiplied by the porosity. compute the factor in front of
9507 ! the gradients of the speed of sound squared for the heat
9508 ! flux.
9509  mul = por*(rlv(i, j, k)+rlv(i, j, k+1))
9510  if (eddymodel) mue = por*(rev(i, j, k)+rev(i, j, k+1))
9511  mut = mul + mue
9512  gm1 = half*(gamma(i, j, k)+gamma(i, j, k+1)) - one
9513  factlamheat = one/(prandtl*gm1)
9514  factturbheat = one/(prandtlturb*gm1)
9515  heatcoef = mul*factlamheat + mue*factturbheat
9516 ! compute the stress tensor and the heat flux vector.
9517  fracdiv = twothird*(u_x+v_y+w_z)
9518  tauxx = mut*(two*u_x-fracdiv)
9519  tauyy = mut*(two*v_y-fracdiv)
9520  tauzz = mut*(two*w_z-fracdiv)
9521  tauxy = mut*(u_y+v_x)
9522  tauxz = mut*(u_z+w_x)
9523  tauyz = mut*(v_z+w_y)
9524  q_x = heatcoef*q_x
9525  q_y = heatcoef*q_y
9526  q_z = heatcoef*q_z
9527 ! compute the average velocities for the face. remember that
9528 ! the velocities are stored and not the momentum.
9529  ubar = half*(w(i, j, k, ivx)+w(i, j, k+1, ivx))
9530  vbar = half*(w(i, j, k, ivy)+w(i, j, k+1, ivy))
9531  wbar = half*(w(i, j, k, ivz)+w(i, j, k+1, ivz))
9532 ! compute the viscous fluxes for this j-face.
9533  fmx = tauxx*sk(i, j, k, 1) + tauxy*sk(i, j, k, 2) + tauxz*sk(i&
9534 & , j, k, 3)
9535  fmy = tauxy*sk(i, j, k, 1) + tauyy*sk(i, j, k, 2) + tauyz*sk(i&
9536 & , j, k, 3)
9537  fmz = tauxz*sk(i, j, k, 1) + tauyz*sk(i, j, k, 2) + tauzz*sk(i&
9538 & , j, k, 3)
9539  frhoe = (ubar*tauxx+vbar*tauxy+wbar*tauxz)*sk(i, j, k, 1) + (&
9540 & ubar*tauxy+vbar*tauyy+wbar*tauyz)*sk(i, j, k, 2) + (ubar*&
9541 & tauxz+vbar*tauyz+wbar*tauzz)*sk(i, j, k, 3) - q_x*sk(i, j, k&
9542 & , 1) - q_y*sk(i, j, k, 2) - q_z*sk(i, j, k, 3)
9543 ! update the residuals of cell j and j+1.
9544  fw(i, j, k, imx) = fw(i, j, k, imx) - fmx
9545  fw(i, j, k, imy) = fw(i, j, k, imy) - fmy
9546  fw(i, j, k, imz) = fw(i, j, k, imz) - fmz
9547  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - frhoe
9548  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fmx
9549  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fmy
9550  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fmz
9551  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + frhoe
9552  end do
9553  end do
9554  end do
9555  end subroutine viscousfluxapprox
9556 
9557 ! differentiation of invisciddissfluxscalarapprox in forward (tangent) mode (with options i4 dr8 r8):
9558 ! variations of useful results: *w *fw
9559 ! with respect to varying inputs: rhoinf pinfcorr *p *w *fw *radi
9560 ! *radj *radk
9561 ! rw status of diff variables: rhoinf:in pinfcorr:in *p:in *w:in-out
9562 ! *fw:in-out *radi:in *radj:in *radk:in
9563 ! plus diff mem management of: p:in w:in fw:in radi:in radj:in
9564 ! radk:in
9566 !
9567 ! invisciddissfluxscalar computes the scalar artificial
9568 ! dissipation, see aiaa paper 81-1259, for a given block.
9569 ! therefore it is assumed that the pointers in blockpointers
9570 ! already point to the correct block.
9571 !
9572  use blockpointers
9573  use cgnsgrid
9574  use constants
9575  use flowvarrefstate
9579  use inputphysics
9580  use iteration
9581  implicit none
9582 !
9583 ! local parameter.
9584 !
9585  real(kind=realtype), parameter :: dssmax=0.25_realtype
9586 !
9587 ! local variables.
9588 !
9589  integer(kind=inttype) :: i, j, k, ind
9590  real(kind=realtype) :: sslim, rhoi
9591  real(kind=realtype) :: sslimd, rhoid
9592  real(kind=realtype) :: sfil, fis2, fis4
9593  real(kind=realtype) :: ppor, rrad, dis2
9594  real(kind=realtype) :: rradd, dis2d
9595  real(kind=realtype) :: dss1, dss2, ddw, fs
9596  real(kind=realtype) :: dss1d, dss2d, ddwd, fsd
9597  intrinsic abs
9598  intrinsic log10
9599  intrinsic exp
9600  intrinsic max
9601  intrinsic min
9602  real(kind=realtype) :: x1
9603  real(kind=realtype) :: x1d
9604  real(kind=realtype) :: x2
9605  real(kind=realtype) :: x2d
9606  real(kind=realtype) :: y1
9607  real(kind=realtype) :: y1d
9608  real(kind=realtype) :: x3
9609  real(kind=realtype) :: x3d
9610  real(kind=realtype) :: x4
9611  real(kind=realtype) :: x4d
9612  real(kind=realtype) :: y2
9613  real(kind=realtype) :: y2d
9614  real(kind=realtype) :: x5
9615  real(kind=realtype) :: x5d
9616  real(kind=realtype) :: x6
9617  real(kind=realtype) :: x6d
9618  real(kind=realtype) :: y3
9619  real(kind=realtype) :: y3d
9620  real(kind=realtype) :: abs0
9621  real(kind=realtype) :: min1
9622  real(kind=realtype) :: min1d
9623  real(kind=realtype) :: min2
9624  real(kind=realtype) :: min2d
9625  real(kind=realtype) :: min3
9626  real(kind=realtype) :: min3d
9627  real(kind=realtype) :: arg1
9628  real(kind=realtype) :: temp
9629  real(kind=realtype) :: tempd
9630  real(kind=realtype) :: temp0
9631  if (rfil .ge. 0.) then
9632  abs0 = rfil
9633  else
9634  abs0 = -rfil
9635  end if
9636 ! check if rfil == 0. if so, the dissipative flux needs not to
9637 ! be computed.
9638  if (abs0 .lt. thresholdreal) then
9639  return
9640  else
9641 ! determine the variables used to compute the switch.
9642 ! for the inviscid case this is the pressure; for the viscous
9643 ! case it is the entropy.
9644  select case (equations)
9645  case (eulerequations)
9646 ! inviscid case. pressure switch is based on the pressure.
9647 ! also set the value of sslim. to be fully consistent this
9648 ! must have the dimension of pressure and it is therefore
9649 ! set to a fraction of the free stream value.
9650  sslimd = 0.001_realtype*pinfcorrd
9651  sslim = 0.001_realtype*pinfcorr
9652 !===============================================================
9653  case (nsequations, ransequations)
9654 ! viscous case. pressure switch is based on the entropy.
9655 ! also set the value of sslim. to be fully consistent this
9656 ! must have the dimension of entropy and it is therefore
9657 ! set to a fraction of the free stream value.
9658  temp = rhoinf**gammainf
9659  if (rhoinf .le. 0.0_8 .and. (gammainf .eq. 0.0_8 .or. gammainf &
9660 & .ne. int(gammainf))) then
9661  tempd = 0.0_8
9662  else
9663  tempd = gammainf*rhoinf**(gammainf-1)*rhoinfd
9664  end if
9665  sslimd = 0.001_realtype*(pinfcorrd-pinfcorr*tempd/temp)/temp
9666  sslim = 0.001_realtype*(pinfcorr/temp)
9667  case default
9668  sslimd = 0.0_8
9669  end select
9670 ! set the dissipation constants for the scheme.
9671 ! rfil and sfil are fractions used by the runge-kutta solver to compute residuals at intermediate steps.
9672 ! this means that fis2 and fis4 will be some fraction of vis2 and vis4, respectively.
9673 ! for other solvers, rfil==1, sfil==0, fis2==vis2, and fis4==vis4.
9674 ! the sigmoid function used for dissipation-based continuation is described in eq. 28 and eq. 29 from the paper:
9675 ! "improving the performance of a compressible rans solver for low and high mach number flows" (seraj2022c).
9676 ! the options documentation also has information on the parameters in this formulation.
9677  if (usedisscontinuation) then
9678  arg1 = -(disscontsharpness*(log10(totalr/totalr0)+&
9679 & disscontmidpoint))
9680  fis2 = rfil*(vis2+disscontmagnitude/(1+exp(arg1)))
9681  else
9682  fis2 = rfil*vis2
9683  end if
9684  fis4 = rfil*vis4
9685  sfil = one - rfil
9686 ! replace the total energy by rho times the total enthalpy.
9687 ! in this way the numerical solution is total enthalpy preserving
9688 ! for the steady euler equations. also replace the velocities by
9689 ! the momentum. only done for the entries used in the
9690 ! discretization, i.e. ignore the corner halo's.
9691  do k=0,kb
9692  do j=2,jl
9693  do i=2,il
9694  temp = w(i, j, k, ivx)
9695  temp0 = w(i, j, k, irho)
9696  wd(i, j, k, ivx) = temp*wd(i, j, k, irho) + temp0*wd(i, j, k&
9697 & , ivx)
9698  w(i, j, k, ivx) = temp0*temp
9699  temp0 = w(i, j, k, ivy)
9700  temp = w(i, j, k, irho)
9701  wd(i, j, k, ivy) = temp0*wd(i, j, k, irho) + temp*wd(i, j, k&
9702 & , ivy)
9703  w(i, j, k, ivy) = temp*temp0
9704  temp0 = w(i, j, k, ivz)
9705  temp = w(i, j, k, irho)
9706  wd(i, j, k, ivz) = temp0*wd(i, j, k, irho) + temp*wd(i, j, k&
9707 & , ivz)
9708  w(i, j, k, ivz) = temp*temp0
9709  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) + pd(i, j, k)
9710  w(i, j, k, irhoe) = w(i, j, k, irhoe) + p(i, j, k)
9711  end do
9712  end do
9713  end do
9714  do k=2,kl
9715  do j=2,jl
9716  temp0 = w(0, j, k, ivx)
9717  temp = w(0, j, k, irho)
9718  wd(0, j, k, ivx) = temp0*wd(0, j, k, irho) + temp*wd(0, j, k, &
9719 & ivx)
9720  w(0, j, k, ivx) = temp*temp0
9721  temp0 = w(0, j, k, ivy)
9722  temp = w(0, j, k, irho)
9723  wd(0, j, k, ivy) = temp0*wd(0, j, k, irho) + temp*wd(0, j, k, &
9724 & ivy)
9725  w(0, j, k, ivy) = temp*temp0
9726  temp0 = w(0, j, k, ivz)
9727  temp = w(0, j, k, irho)
9728  wd(0, j, k, ivz) = temp0*wd(0, j, k, irho) + temp*wd(0, j, k, &
9729 & ivz)
9730  w(0, j, k, ivz) = temp*temp0
9731  wd(0, j, k, irhoe) = wd(0, j, k, irhoe) + pd(0, j, k)
9732  w(0, j, k, irhoe) = w(0, j, k, irhoe) + p(0, j, k)
9733  temp0 = w(1, j, k, ivx)
9734  temp = w(1, j, k, irho)
9735  wd(1, j, k, ivx) = temp0*wd(1, j, k, irho) + temp*wd(1, j, k, &
9736 & ivx)
9737  w(1, j, k, ivx) = temp*temp0
9738  temp0 = w(1, j, k, ivy)
9739  temp = w(1, j, k, irho)
9740  wd(1, j, k, ivy) = temp0*wd(1, j, k, irho) + temp*wd(1, j, k, &
9741 & ivy)
9742  w(1, j, k, ivy) = temp*temp0
9743  temp0 = w(1, j, k, ivz)
9744  temp = w(1, j, k, irho)
9745  wd(1, j, k, ivz) = temp0*wd(1, j, k, irho) + temp*wd(1, j, k, &
9746 & ivz)
9747  w(1, j, k, ivz) = temp*temp0
9748  wd(1, j, k, irhoe) = wd(1, j, k, irhoe) + pd(1, j, k)
9749  w(1, j, k, irhoe) = w(1, j, k, irhoe) + p(1, j, k)
9750  temp0 = w(ie, j, k, ivx)
9751  temp = w(ie, j, k, irho)
9752  wd(ie, j, k, ivx) = temp0*wd(ie, j, k, irho) + temp*wd(ie, j, &
9753 & k, ivx)
9754  w(ie, j, k, ivx) = temp*temp0
9755  temp0 = w(ie, j, k, ivy)
9756  temp = w(ie, j, k, irho)
9757  wd(ie, j, k, ivy) = temp0*wd(ie, j, k, irho) + temp*wd(ie, j, &
9758 & k, ivy)
9759  w(ie, j, k, ivy) = temp*temp0
9760  temp0 = w(ie, j, k, ivz)
9761  temp = w(ie, j, k, irho)
9762  wd(ie, j, k, ivz) = temp0*wd(ie, j, k, irho) + temp*wd(ie, j, &
9763 & k, ivz)
9764  w(ie, j, k, ivz) = temp*temp0
9765  wd(ie, j, k, irhoe) = wd(ie, j, k, irhoe) + pd(ie, j, k)
9766  w(ie, j, k, irhoe) = w(ie, j, k, irhoe) + p(ie, j, k)
9767  temp0 = w(ib, j, k, ivx)
9768  temp = w(ib, j, k, irho)
9769  wd(ib, j, k, ivx) = temp0*wd(ib, j, k, irho) + temp*wd(ib, j, &
9770 & k, ivx)
9771  w(ib, j, k, ivx) = temp*temp0
9772  temp0 = w(ib, j, k, ivy)
9773  temp = w(ib, j, k, irho)
9774  wd(ib, j, k, ivy) = temp0*wd(ib, j, k, irho) + temp*wd(ib, j, &
9775 & k, ivy)
9776  w(ib, j, k, ivy) = temp*temp0
9777  temp0 = w(ib, j, k, ivz)
9778  temp = w(ib, j, k, irho)
9779  wd(ib, j, k, ivz) = temp0*wd(ib, j, k, irho) + temp*wd(ib, j, &
9780 & k, ivz)
9781  w(ib, j, k, ivz) = temp*temp0
9782  wd(ib, j, k, irhoe) = wd(ib, j, k, irhoe) + pd(ib, j, k)
9783  w(ib, j, k, irhoe) = w(ib, j, k, irhoe) + p(ib, j, k)
9784  end do
9785  end do
9786  do k=2,kl
9787  do i=2,il
9788  temp0 = w(i, 0, k, ivx)
9789  temp = w(i, 0, k, irho)
9790  wd(i, 0, k, ivx) = temp0*wd(i, 0, k, irho) + temp*wd(i, 0, k, &
9791 & ivx)
9792  w(i, 0, k, ivx) = temp*temp0
9793  temp0 = w(i, 0, k, ivy)
9794  temp = w(i, 0, k, irho)
9795  wd(i, 0, k, ivy) = temp0*wd(i, 0, k, irho) + temp*wd(i, 0, k, &
9796 & ivy)
9797  w(i, 0, k, ivy) = temp*temp0
9798  temp0 = w(i, 0, k, ivz)
9799  temp = w(i, 0, k, irho)
9800  wd(i, 0, k, ivz) = temp0*wd(i, 0, k, irho) + temp*wd(i, 0, k, &
9801 & ivz)
9802  w(i, 0, k, ivz) = temp*temp0
9803  wd(i, 0, k, irhoe) = wd(i, 0, k, irhoe) + pd(i, 0, k)
9804  w(i, 0, k, irhoe) = w(i, 0, k, irhoe) + p(i, 0, k)
9805  temp0 = w(i, 1, k, ivx)
9806  temp = w(i, 1, k, irho)
9807  wd(i, 1, k, ivx) = temp0*wd(i, 1, k, irho) + temp*wd(i, 1, k, &
9808 & ivx)
9809  w(i, 1, k, ivx) = temp*temp0
9810  temp0 = w(i, 1, k, ivy)
9811  temp = w(i, 1, k, irho)
9812  wd(i, 1, k, ivy) = temp0*wd(i, 1, k, irho) + temp*wd(i, 1, k, &
9813 & ivy)
9814  w(i, 1, k, ivy) = temp*temp0
9815  temp0 = w(i, 1, k, ivz)
9816  temp = w(i, 1, k, irho)
9817  wd(i, 1, k, ivz) = temp0*wd(i, 1, k, irho) + temp*wd(i, 1, k, &
9818 & ivz)
9819  w(i, 1, k, ivz) = temp*temp0
9820  wd(i, 1, k, irhoe) = wd(i, 1, k, irhoe) + pd(i, 1, k)
9821  w(i, 1, k, irhoe) = w(i, 1, k, irhoe) + p(i, 1, k)
9822  temp0 = w(i, je, k, ivx)
9823  temp = w(i, je, k, irho)
9824  wd(i, je, k, ivx) = temp0*wd(i, je, k, irho) + temp*wd(i, je, &
9825 & k, ivx)
9826  w(i, je, k, ivx) = temp*temp0
9827  temp0 = w(i, je, k, ivy)
9828  temp = w(i, je, k, irho)
9829  wd(i, je, k, ivy) = temp0*wd(i, je, k, irho) + temp*wd(i, je, &
9830 & k, ivy)
9831  w(i, je, k, ivy) = temp*temp0
9832  temp0 = w(i, je, k, ivz)
9833  temp = w(i, je, k, irho)
9834  wd(i, je, k, ivz) = temp0*wd(i, je, k, irho) + temp*wd(i, je, &
9835 & k, ivz)
9836  w(i, je, k, ivz) = temp*temp0
9837  wd(i, je, k, irhoe) = wd(i, je, k, irhoe) + pd(i, je, k)
9838  w(i, je, k, irhoe) = w(i, je, k, irhoe) + p(i, je, k)
9839  temp0 = w(i, jb, k, ivx)
9840  temp = w(i, jb, k, irho)
9841  wd(i, jb, k, ivx) = temp0*wd(i, jb, k, irho) + temp*wd(i, jb, &
9842 & k, ivx)
9843  w(i, jb, k, ivx) = temp*temp0
9844  temp0 = w(i, jb, k, ivy)
9845  temp = w(i, jb, k, irho)
9846  wd(i, jb, k, ivy) = temp0*wd(i, jb, k, irho) + temp*wd(i, jb, &
9847 & k, ivy)
9848  w(i, jb, k, ivy) = temp*temp0
9849  temp0 = w(i, jb, k, ivz)
9850  temp = w(i, jb, k, irho)
9851  wd(i, jb, k, ivz) = temp0*wd(i, jb, k, irho) + temp*wd(i, jb, &
9852 & k, ivz)
9853  w(i, jb, k, ivz) = temp*temp0
9854  wd(i, jb, k, irhoe) = wd(i, jb, k, irhoe) + pd(i, jb, k)
9855  w(i, jb, k, irhoe) = w(i, jb, k, irhoe) + p(i, jb, k)
9856  end do
9857  end do
9858 ! initialize the dissipative residual to a certain times,
9859 ! possibly zero, the previously stored value. owned cells
9860 ! only, because the halo values do not matter.
9861  do k=2,kl
9862  do j=2,jl
9863  do i=2,il
9864  fwd(i, j, k, irho) = sfil*fwd(i, j, k, irho)
9865  fw(i, j, k, irho) = sfil*fw(i, j, k, irho)
9866  fwd(i, j, k, imx) = sfil*fwd(i, j, k, imx)
9867  fw(i, j, k, imx) = sfil*fw(i, j, k, imx)
9868  fwd(i, j, k, imy) = sfil*fwd(i, j, k, imy)
9869  fw(i, j, k, imy) = sfil*fw(i, j, k, imy)
9870  fwd(i, j, k, imz) = sfil*fwd(i, j, k, imz)
9871  fw(i, j, k, imz) = sfil*fw(i, j, k, imz)
9872  fwd(i, j, k, irhoe) = sfil*fwd(i, j, k, irhoe)
9873  fw(i, j, k, irhoe) = sfil*fw(i, j, k, irhoe)
9874  end do
9875  end do
9876  end do
9877 !
9878 ! dissipative fluxes in the i-direction.
9879 !
9880  do k=2,kl
9881  do j=2,jl
9882  temp0 = (shocksensor(2, j, k)-two*shocksensor(1, j, k)+&
9883 & shocksensor(0, j, k))/(shocksensor(2, j, k)+two*shocksensor(&
9884 & 1, j, k)+shocksensor(0, j, k)+sslim)
9885  x1d = -(temp0*sslimd/(shocksensor(2, j, k)+two*shocksensor(1, &
9886 & j, k)+shocksensor(0, j, k)+sslim))
9887  x1 = temp0
9888  if (x1 .ge. 0.) then
9889  dss1d = x1d
9890  dss1 = x1
9891  else
9892  dss1d = -x1d
9893  dss1 = -x1
9894  end if
9895 ! loop in i-direction.
9896  do i=1,il
9897  temp0 = (shocksensor(i+2, j, k)-two*shocksensor(i+1, j, k)+&
9898 & shocksensor(i, j, k))/(shocksensor(i+2, j, k)+two*&
9899 & shocksensor(i+1, j, k)+shocksensor(i, j, k)+sslim)
9900  x2d = -(temp0*sslimd/(shocksensor(i+2, j, k)+two*shocksensor&
9901 & (i+1, j, k)+shocksensor(i, j, k)+sslim))
9902  x2 = temp0
9903  if (x2 .ge. 0.) then
9904  dss2d = x2d
9905  dss2 = x2
9906  else
9907  dss2d = -x2d
9908  dss2 = -x2
9909  end if
9910 ! compute the dissipation coefficients for this face.
9911  ppor = zero
9912  if (pori(i, j, k) .eq. normalflux) ppor = half
9913  rradd = ppor*(radid(i, j, k)+radid(i+1, j, k))
9914  rrad = ppor*(radi(i, j, k)+radi(i+1, j, k))
9915  if (dss1 .lt. dss2) then
9916  y1d = dss2d
9917  y1 = dss2
9918  else
9919  y1d = dss1d
9920  y1 = dss1
9921  end if
9922  if (dssmax .gt. y1) then
9923  min1d = y1d
9924  min1 = y1
9925  else
9926  min1 = dssmax
9927  min1d = 0.0_8
9928  end if
9929 ! modification for fd preconditioner note: this lumping
9930 ! actually still results in a greater than 3 cell stencil
9931 ! in any direction. since this seems to work slightly
9932 ! better than the dis2=sigma*fis4*rrad, we will just use
9933 ! a 5-cell stencil for doing the pc
9934  dis2d = fis2*(min1*rradd+rrad*min1d) + sigma*fis4*rradd
9935  dis2 = fis2*rrad*min1 + sigma*fis4*rrad
9936 ! compute and scatter the dissipative flux.
9937 ! density. store it in the mass flow of the
9938 ! appropriate sliding mesh interface.
9939  ddwd = wd(i+1, j, k, irho) - wd(i, j, k, irho)
9940  ddw = w(i+1, j, k, irho) - w(i, j, k, irho)
9941  fsd = ddw*dis2d + dis2*ddwd
9942  fs = dis2*ddw
9943  fwd(i+1, j, k, irho) = fwd(i+1, j, k, irho) + fsd
9944  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
9945  fwd(i, j, k, irho) = fwd(i, j, k, irho) - fsd
9946  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
9947 ! x-momentum.
9948  ddwd = wd(i+1, j, k, ivx) - wd(i, j, k, ivx)
9949  ddw = w(i+1, j, k, ivx) - w(i, j, k, ivx)
9950  fsd = ddw*dis2d + dis2*ddwd
9951  fs = dis2*ddw
9952  fwd(i+1, j, k, imx) = fwd(i+1, j, k, imx) + fsd
9953  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
9954  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fsd
9955  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
9956 ! y-momentum.
9957  ddwd = wd(i+1, j, k, ivy) - wd(i, j, k, ivy)
9958  ddw = w(i+1, j, k, ivy) - w(i, j, k, ivy)
9959  fsd = ddw*dis2d + dis2*ddwd
9960  fs = dis2*ddw
9961  fwd(i+1, j, k, imy) = fwd(i+1, j, k, imy) + fsd
9962  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
9963  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fsd
9964  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
9965 ! z-momentum.
9966  ddwd = wd(i+1, j, k, ivz) - wd(i, j, k, ivz)
9967  ddw = w(i+1, j, k, ivz) - w(i, j, k, ivz)
9968  fsd = ddw*dis2d + dis2*ddwd
9969  fs = dis2*ddw
9970  fwd(i+1, j, k, imz) = fwd(i+1, j, k, imz) + fsd
9971  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
9972  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fsd
9973  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
9974 ! energy.
9975  ddwd = wd(i+1, j, k, irhoe) - wd(i, j, k, irhoe)
9976  ddw = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
9977  fsd = ddw*dis2d + dis2*ddwd
9978  fs = dis2*ddw
9979  fwd(i+1, j, k, irhoe) = fwd(i+1, j, k, irhoe) + fsd
9980  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
9981  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - fsd
9982  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
9983 ! set dss1 to dss2 for the next face.
9984  dss1d = dss2d
9985  dss1 = dss2
9986  end do
9987  end do
9988  end do
9989 !
9990 ! dissipative fluxes in the j-direction.
9991 !
9992  do k=2,kl
9993  do i=2,il
9994  temp0 = (shocksensor(i, 2, k)-two*shocksensor(i, 1, k)+&
9995 & shocksensor(i, 0, k))/(shocksensor(i, 2, k)+two*shocksensor(&
9996 & i, 1, k)+shocksensor(i, 0, k)+sslim)
9997  x3d = -(temp0*sslimd/(shocksensor(i, 2, k)+two*shocksensor(i, &
9998 & 1, k)+shocksensor(i, 0, k)+sslim))
9999  x3 = temp0
10000  if (x3 .ge. 0.) then
10001  dss1d = x3d
10002  dss1 = x3
10003  else
10004  dss1d = -x3d
10005  dss1 = -x3
10006  end if
10007 ! loop in j-direction.
10008  do j=1,jl
10009  temp0 = (shocksensor(i, j+2, k)-two*shocksensor(i, j+1, k)+&
10010 & shocksensor(i, j, k))/(shocksensor(i, j+2, k)+two*&
10011 & shocksensor(i, j+1, k)+shocksensor(i, j, k)+sslim)
10012  x4d = -(temp0*sslimd/(shocksensor(i, j+2, k)+two*shocksensor&
10013 & (i, j+1, k)+shocksensor(i, j, k)+sslim))
10014  x4 = temp0
10015  if (x4 .ge. 0.) then
10016  dss2d = x4d
10017  dss2 = x4
10018  else
10019  dss2d = -x4d
10020  dss2 = -x4
10021  end if
10022 ! compute the dissipation coefficients for this face.
10023  ppor = zero
10024  if (porj(i, j, k) .eq. normalflux) ppor = half
10025  rradd = ppor*(radjd(i, j, k)+radjd(i, j+1, k))
10026  rrad = ppor*(radj(i, j, k)+radj(i, j+1, k))
10027  if (dss1 .lt. dss2) then
10028  y2d = dss2d
10029  y2 = dss2
10030  else
10031  y2d = dss1d
10032  y2 = dss1
10033  end if
10034  if (dssmax .gt. y2) then
10035  min2d = y2d
10036  min2 = y2
10037  else
10038  min2 = dssmax
10039  min2d = 0.0_8
10040  end if
10041 ! modification for fd preconditioner
10042  dis2d = fis2*(min2*rradd+rrad*min2d) + sigma*fis4*rradd
10043  dis2 = fis2*rrad*min2 + sigma*fis4*rrad
10044 ! compute and scatter the dissipative flux.
10045 ! density. store it in the mass flow of the
10046 ! appropriate sliding mesh interface.
10047  ddwd = wd(i, j+1, k, irho) - wd(i, j, k, irho)
10048  ddw = w(i, j+1, k, irho) - w(i, j, k, irho)
10049  fsd = ddw*dis2d + dis2*ddwd
10050  fs = dis2*ddw
10051  fwd(i, j+1, k, irho) = fwd(i, j+1, k, irho) + fsd
10052  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
10053  fwd(i, j, k, irho) = fwd(i, j, k, irho) - fsd
10054  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
10055 ! x-momentum.
10056  ddwd = wd(i, j+1, k, ivx) - wd(i, j, k, ivx)
10057  ddw = w(i, j+1, k, ivx) - w(i, j, k, ivx)
10058  fsd = ddw*dis2d + dis2*ddwd
10059  fs = dis2*ddw
10060  fwd(i, j+1, k, imx) = fwd(i, j+1, k, imx) + fsd
10061  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
10062  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fsd
10063  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
10064 ! y-momentum.
10065  ddwd = wd(i, j+1, k, ivy) - wd(i, j, k, ivy)
10066  ddw = w(i, j+1, k, ivy) - w(i, j, k, ivy)
10067  fsd = ddw*dis2d + dis2*ddwd
10068  fs = dis2*ddw
10069  fwd(i, j+1, k, imy) = fwd(i, j+1, k, imy) + fsd
10070  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
10071  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fsd
10072  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
10073 ! z-momentum.
10074  ddwd = wd(i, j+1, k, ivz) - wd(i, j, k, ivz)
10075  ddw = w(i, j+1, k, ivz) - w(i, j, k, ivz)
10076  fsd = ddw*dis2d + dis2*ddwd
10077  fs = dis2*ddw
10078  fwd(i, j+1, k, imz) = fwd(i, j+1, k, imz) + fsd
10079  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
10080  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fsd
10081  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
10082 ! energy.
10083  ddwd = wd(i, j+1, k, irhoe) - wd(i, j, k, irhoe)
10084  ddw = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
10085  fsd = ddw*dis2d + dis2*ddwd
10086  fs = dis2*ddw
10087  fwd(i, j+1, k, irhoe) = fwd(i, j+1, k, irhoe) + fsd
10088  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
10089  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - fsd
10090  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
10091 ! set dss1 to dss2 for the next face.
10092  dss1d = dss2d
10093  dss1 = dss2
10094  end do
10095  end do
10096  end do
10097 !
10098 ! dissipative fluxes in the k-direction.
10099 !
10100  do j=2,jl
10101  do i=2,il
10102  temp0 = (shocksensor(i, j, 2)-two*shocksensor(i, j, 1)+&
10103 & shocksensor(i, j, 0))/(shocksensor(i, j, 2)+two*shocksensor(&
10104 & i, j, 1)+shocksensor(i, j, 0)+sslim)
10105  x5d = -(temp0*sslimd/(shocksensor(i, j, 2)+two*shocksensor(i, &
10106 & j, 1)+shocksensor(i, j, 0)+sslim))
10107  x5 = temp0
10108  if (x5 .ge. 0.) then
10109  dss1d = x5d
10110  dss1 = x5
10111  else
10112  dss1d = -x5d
10113  dss1 = -x5
10114  end if
10115 ! loop in k-direction.
10116  do k=1,kl
10117  temp0 = (shocksensor(i, j, k+2)-two*shocksensor(i, j, k+1)+&
10118 & shocksensor(i, j, k))/(shocksensor(i, j, k+2)+two*&
10119 & shocksensor(i, j, k+1)+shocksensor(i, j, k)+sslim)
10120  x6d = -(temp0*sslimd/(shocksensor(i, j, k+2)+two*shocksensor&
10121 & (i, j, k+1)+shocksensor(i, j, k)+sslim))
10122  x6 = temp0
10123  if (x6 .ge. 0.) then
10124  dss2d = x6d
10125  dss2 = x6
10126  else
10127  dss2d = -x6d
10128  dss2 = -x6
10129  end if
10130 ! compute the dissipation coefficients for this face.
10131  ppor = zero
10132  if (pork(i, j, k) .eq. normalflux) ppor = half
10133  rradd = ppor*(radkd(i, j, k)+radkd(i, j, k+1))
10134  rrad = ppor*(radk(i, j, k)+radk(i, j, k+1))
10135  if (dss1 .lt. dss2) then
10136  y3d = dss2d
10137  y3 = dss2
10138  else
10139  y3d = dss1d
10140  y3 = dss1
10141  end if
10142  if (dssmax .gt. y3) then
10143  min3d = y3d
10144  min3 = y3
10145  else
10146  min3 = dssmax
10147  min3d = 0.0_8
10148  end if
10149 ! modification for fd preconditioner
10150  dis2d = fis2*(min3*rradd+rrad*min3d) + sigma*fis4*rradd
10151  dis2 = fis2*rrad*min3 + sigma*fis4*rrad
10152 ! compute and scatter the dissipative flux.
10153 ! density. store it in the mass flow of the
10154 ! appropriate sliding mesh interface.
10155  ddwd = wd(i, j, k+1, irho) - wd(i, j, k, irho)
10156  ddw = w(i, j, k+1, irho) - w(i, j, k, irho)
10157  fsd = ddw*dis2d + dis2*ddwd
10158  fs = dis2*ddw
10159  fwd(i, j, k+1, irho) = fwd(i, j, k+1, irho) + fsd
10160  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) + fs
10161  fwd(i, j, k, irho) = fwd(i, j, k, irho) - fsd
10162  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
10163 ! x-momentum.
10164  ddwd = wd(i, j, k+1, ivx) - wd(i, j, k, ivx)
10165  ddw = w(i, j, k+1, ivx) - w(i, j, k, ivx)
10166  fsd = ddw*dis2d + dis2*ddwd
10167  fs = dis2*ddw
10168  fwd(i, j, k+1, imx) = fwd(i, j, k+1, imx) + fsd
10169  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fs
10170  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fsd
10171  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
10172 ! y-momentum.
10173  ddwd = wd(i, j, k+1, ivy) - wd(i, j, k, ivy)
10174  ddw = w(i, j, k+1, ivy) - w(i, j, k, ivy)
10175  fsd = ddw*dis2d + dis2*ddwd
10176  fs = dis2*ddw
10177  fwd(i, j, k+1, imy) = fwd(i, j, k+1, imy) + fsd
10178  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fs
10179  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fsd
10180  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
10181 ! z-momentum.
10182  ddwd = wd(i, j, k+1, ivz) - wd(i, j, k, ivz)
10183  ddw = w(i, j, k+1, ivz) - w(i, j, k, ivz)
10184  fsd = ddw*dis2d + dis2*ddwd
10185  fs = dis2*ddw
10186  fwd(i, j, k+1, imz) = fwd(i, j, k+1, imz) + fsd
10187  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fs
10188  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fsd
10189  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
10190 ! energy.
10191  ddwd = wd(i, j, k+1, irhoe) - wd(i, j, k, irhoe)
10192  ddw = w(i, j, k+1, irhoe) - w(i, j, k, irhoe)
10193  fsd = ddw*dis2d + dis2*ddwd
10194  fs = dis2*ddw
10195  fwd(i, j, k+1, irhoe) = fwd(i, j, k+1, irhoe) + fsd
10196  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + fs
10197  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - fsd
10198  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
10199 ! set dss1 to dss2 for the next face.
10200  dss1d = dss2d
10201  dss1 = dss2
10202  end do
10203  end do
10204  end do
10205 ! replace rho times the total enthalpy by the total energy and
10206 ! store the velocities again instead of the momentum. only for
10207 ! those entries that have been altered, i.e. ignore the
10208 ! corner halo's.
10209  do k=0,kb
10210  do j=2,jl
10211  do i=2,il
10212  temp0 = one/w(i, j, k, irho)
10213  rhoid = -(temp0*wd(i, j, k, irho)/w(i, j, k, irho))
10214  rhoi = temp0
10215  temp0 = w(i, j, k, ivx)
10216  wd(i, j, k, ivx) = rhoi*wd(i, j, k, ivx) + temp0*rhoid
10217  w(i, j, k, ivx) = temp0*rhoi
10218  temp0 = w(i, j, k, ivy)
10219  wd(i, j, k, ivy) = rhoi*wd(i, j, k, ivy) + temp0*rhoid
10220  w(i, j, k, ivy) = temp0*rhoi
10221  temp0 = w(i, j, k, ivz)
10222  wd(i, j, k, ivz) = rhoi*wd(i, j, k, ivz) + temp0*rhoid
10223  w(i, j, k, ivz) = temp0*rhoi
10224  wd(i, j, k, irhoe) = wd(i, j, k, irhoe) - pd(i, j, k)
10225  w(i, j, k, irhoe) = w(i, j, k, irhoe) - p(i, j, k)
10226  end do
10227  end do
10228  end do
10229  do k=2,kl
10230  do j=2,jl
10231  temp0 = one/w(0, j, k, irho)
10232  rhoid = -(temp0*wd(0, j, k, irho)/w(0, j, k, irho))
10233  rhoi = temp0
10234  temp0 = w(0, j, k, ivx)
10235  wd(0, j, k, ivx) = rhoi*wd(0, j, k, ivx) + temp0*rhoid
10236  w(0, j, k, ivx) = temp0*rhoi
10237  temp0 = w(0, j, k, ivy)
10238  wd(0, j, k, ivy) = rhoi*wd(0, j, k, ivy) + temp0*rhoid
10239  w(0, j, k, ivy) = temp0*rhoi
10240  temp0 = w(0, j, k, ivz)
10241  wd(0, j, k, ivz) = rhoi*wd(0, j, k, ivz) + temp0*rhoid
10242  w(0, j, k, ivz) = temp0*rhoi
10243  wd(0, j, k, irhoe) = wd(0, j, k, irhoe) - pd(0, j, k)
10244  w(0, j, k, irhoe) = w(0, j, k, irhoe) - p(0, j, k)
10245  temp0 = one/w(1, j, k, irho)
10246  rhoid = -(temp0*wd(1, j, k, irho)/w(1, j, k, irho))
10247  rhoi = temp0
10248  temp0 = w(1, j, k, ivx)
10249  wd(1, j, k, ivx) = rhoi*wd(1, j, k, ivx) + temp0*rhoid
10250  w(1, j, k, ivx) = temp0*rhoi
10251  temp0 = w(1, j, k, ivy)
10252  wd(1, j, k, ivy) = rhoi*wd(1, j, k, ivy) + temp0*rhoid
10253  w(1, j, k, ivy) = temp0*rhoi
10254  temp0 = w(1, j, k, ivz)
10255  wd(1, j, k, ivz) = rhoi*wd(1, j, k, ivz) + temp0*rhoid
10256  w(1, j, k, ivz) = temp0*rhoi
10257  wd(1, j, k, irhoe) = wd(1, j, k, irhoe) - pd(1, j, k)
10258  w(1, j, k, irhoe) = w(1, j, k, irhoe) - p(1, j, k)
10259  temp0 = one/w(ie, j, k, irho)
10260  rhoid = -(temp0*wd(ie, j, k, irho)/w(ie, j, k, irho))
10261  rhoi = temp0
10262  temp0 = w(ie, j, k, ivx)
10263  wd(ie, j, k, ivx) = rhoi*wd(ie, j, k, ivx) + temp0*rhoid
10264  w(ie, j, k, ivx) = temp0*rhoi
10265  temp0 = w(ie, j, k, ivy)
10266  wd(ie, j, k, ivy) = rhoi*wd(ie, j, k, ivy) + temp0*rhoid
10267  w(ie, j, k, ivy) = temp0*rhoi
10268  temp0 = w(ie, j, k, ivz)
10269  wd(ie, j, k, ivz) = rhoi*wd(ie, j, k, ivz) + temp0*rhoid
10270  w(ie, j, k, ivz) = temp0*rhoi
10271  wd(ie, j, k, irhoe) = wd(ie, j, k, irhoe) - pd(ie, j, k)
10272  w(ie, j, k, irhoe) = w(ie, j, k, irhoe) - p(ie, j, k)
10273  temp0 = one/w(ib, j, k, irho)
10274  rhoid = -(temp0*wd(ib, j, k, irho)/w(ib, j, k, irho))
10275  rhoi = temp0
10276  temp0 = w(ib, j, k, ivx)
10277  wd(ib, j, k, ivx) = rhoi*wd(ib, j, k, ivx) + temp0*rhoid
10278  w(ib, j, k, ivx) = temp0*rhoi
10279  temp0 = w(ib, j, k, ivy)
10280  wd(ib, j, k, ivy) = rhoi*wd(ib, j, k, ivy) + temp0*rhoid
10281  w(ib, j, k, ivy) = temp0*rhoi
10282  temp0 = w(ib, j, k, ivz)
10283  wd(ib, j, k, ivz) = rhoi*wd(ib, j, k, ivz) + temp0*rhoid
10284  w(ib, j, k, ivz) = temp0*rhoi
10285  wd(ib, j, k, irhoe) = wd(ib, j, k, irhoe) - pd(ib, j, k)
10286  w(ib, j, k, irhoe) = w(ib, j, k, irhoe) - p(ib, j, k)
10287  end do
10288  end do
10289  do k=2,kl
10290  do i=2,il
10291  temp0 = one/w(i, 0, k, irho)
10292  rhoid = -(temp0*wd(i, 0, k, irho)/w(i, 0, k, irho))
10293  rhoi = temp0
10294  temp0 = w(i, 0, k, ivx)
10295  wd(i, 0, k, ivx) = rhoi*wd(i, 0, k, ivx) + temp0*rhoid
10296  w(i, 0, k, ivx) = temp0*rhoi
10297  temp0 = w(i, 0, k, ivy)
10298  wd(i, 0, k, ivy) = rhoi*wd(i, 0, k, ivy) + temp0*rhoid
10299  w(i, 0, k, ivy) = temp0*rhoi
10300  temp0 = w(i, 0, k, ivz)
10301  wd(i, 0, k, ivz) = rhoi*wd(i, 0, k, ivz) + temp0*rhoid
10302  w(i, 0, k, ivz) = temp0*rhoi
10303  wd(i, 0, k, irhoe) = wd(i, 0, k, irhoe) - pd(i, 0, k)
10304  w(i, 0, k, irhoe) = w(i, 0, k, irhoe) - p(i, 0, k)
10305  temp0 = one/w(i, 1, k, irho)
10306  rhoid = -(temp0*wd(i, 1, k, irho)/w(i, 1, k, irho))
10307  rhoi = temp0
10308  temp0 = w(i, 1, k, ivx)
10309  wd(i, 1, k, ivx) = rhoi*wd(i, 1, k, ivx) + temp0*rhoid
10310  w(i, 1, k, ivx) = temp0*rhoi
10311  temp0 = w(i, 1, k, ivy)
10312  wd(i, 1, k, ivy) = rhoi*wd(i, 1, k, ivy) + temp0*rhoid
10313  w(i, 1, k, ivy) = temp0*rhoi
10314  temp0 = w(i, 1, k, ivz)
10315  wd(i, 1, k, ivz) = rhoi*wd(i, 1, k, ivz) + temp0*rhoid
10316  w(i, 1, k, ivz) = temp0*rhoi
10317  wd(i, 1, k, irhoe) = wd(i, 1, k, irhoe) - pd(i, 1, k)
10318  w(i, 1, k, irhoe) = w(i, 1, k, irhoe) - p(i, 1, k)
10319  temp0 = one/w(i, je, k, irho)
10320  rhoid = -(temp0*wd(i, je, k, irho)/w(i, je, k, irho))
10321  rhoi = temp0
10322  temp0 = w(i, je, k, ivx)
10323  wd(i, je, k, ivx) = rhoi*wd(i, je, k, ivx) + temp0*rhoid
10324  w(i, je, k, ivx) = temp0*rhoi
10325  temp0 = w(i, je, k, ivy)
10326  wd(i, je, k, ivy) = rhoi*wd(i, je, k, ivy) + temp0*rhoid
10327  w(i, je, k, ivy) = temp0*rhoi
10328  temp0 = w(i, je, k, ivz)
10329  wd(i, je, k, ivz) = rhoi*wd(i, je, k, ivz) + temp0*rhoid
10330  w(i, je, k, ivz) = temp0*rhoi
10331  wd(i, je, k, irhoe) = wd(i, je, k, irhoe) - pd(i, je, k)
10332  w(i, je, k, irhoe) = w(i, je, k, irhoe) - p(i, je, k)
10333  temp0 = one/w(i, jb, k, irho)
10334  rhoid = -(temp0*wd(i, jb, k, irho)/w(i, jb, k, irho))
10335  rhoi = temp0
10336  temp0 = w(i, jb, k, ivx)
10337  wd(i, jb, k, ivx) = rhoi*wd(i, jb, k, ivx) + temp0*rhoid
10338  w(i, jb, k, ivx) = temp0*rhoi
10339  temp0 = w(i, jb, k, ivy)
10340  wd(i, jb, k, ivy) = rhoi*wd(i, jb, k, ivy) + temp0*rhoid
10341  w(i, jb, k, ivy) = temp0*rhoi
10342  temp0 = w(i, jb, k, ivz)
10343  wd(i, jb, k, ivz) = rhoi*wd(i, jb, k, ivz) + temp0*rhoid
10344  w(i, jb, k, ivz) = temp0*rhoi
10345  wd(i, jb, k, irhoe) = wd(i, jb, k, irhoe) - pd(i, jb, k)
10346  w(i, jb, k, irhoe) = w(i, jb, k, irhoe) - p(i, jb, k)
10347  end do
10348  end do
10349  end if
10350  end subroutine invisciddissfluxscalarapprox_d
10351 
10353 !
10354 ! invisciddissfluxscalar computes the scalar artificial
10355 ! dissipation, see aiaa paper 81-1259, for a given block.
10356 ! therefore it is assumed that the pointers in blockpointers
10357 ! already point to the correct block.
10358 !
10359  use blockpointers
10360  use cgnsgrid
10361  use constants
10362  use flowvarrefstate
10366  use inputphysics
10367  use iteration
10368  implicit none
10369 !
10370 ! local parameter.
10371 !
10372  real(kind=realtype), parameter :: dssmax=0.25_realtype
10373 !
10374 ! local variables.
10375 !
10376  integer(kind=inttype) :: i, j, k, ind
10377  real(kind=realtype) :: sslim, rhoi
10378  real(kind=realtype) :: sfil, fis2, fis4
10379  real(kind=realtype) :: ppor, rrad, dis2
10380  real(kind=realtype) :: dss1, dss2, ddw, fs
10381  intrinsic abs
10382  intrinsic log10
10383  intrinsic exp
10384  intrinsic max
10385  intrinsic min
10386  real(kind=realtype) :: x1
10387  real(kind=realtype) :: x2
10388  real(kind=realtype) :: y1
10389  real(kind=realtype) :: x3
10390  real(kind=realtype) :: x4
10391  real(kind=realtype) :: y2
10392  real(kind=realtype) :: x5
10393  real(kind=realtype) :: x6
10394  real(kind=realtype) :: y3
10395  real(kind=realtype) :: abs0
10396  real(kind=realtype) :: min1
10397  real(kind=realtype) :: min2
10398  real(kind=realtype) :: min3
10399  real(kind=realtype) :: arg1
10400  if (rfil .ge. 0.) then
10401  abs0 = rfil
10402  else
10403  abs0 = -rfil
10404  end if
10405 ! check if rfil == 0. if so, the dissipative flux needs not to
10406 ! be computed.
10407  if (abs0 .lt. thresholdreal) then
10408  return
10409  else
10410 ! determine the variables used to compute the switch.
10411 ! for the inviscid case this is the pressure; for the viscous
10412 ! case it is the entropy.
10413  select case (equations)
10414  case (eulerequations)
10415 ! inviscid case. pressure switch is based on the pressure.
10416 ! also set the value of sslim. to be fully consistent this
10417 ! must have the dimension of pressure and it is therefore
10418 ! set to a fraction of the free stream value.
10419  sslim = 0.001_realtype*pinfcorr
10420 !===============================================================
10421  case (nsequations, ransequations)
10422 ! viscous case. pressure switch is based on the entropy.
10423 ! also set the value of sslim. to be fully consistent this
10424 ! must have the dimension of entropy and it is therefore
10425 ! set to a fraction of the free stream value.
10426  sslim = 0.001_realtype*pinfcorr/rhoinf**gammainf
10427  end select
10428 ! set the dissipation constants for the scheme.
10429 ! rfil and sfil are fractions used by the runge-kutta solver to compute residuals at intermediate steps.
10430 ! this means that fis2 and fis4 will be some fraction of vis2 and vis4, respectively.
10431 ! for other solvers, rfil==1, sfil==0, fis2==vis2, and fis4==vis4.
10432 ! the sigmoid function used for dissipation-based continuation is described in eq. 28 and eq. 29 from the paper:
10433 ! "improving the performance of a compressible rans solver for low and high mach number flows" (seraj2022c).
10434 ! the options documentation also has information on the parameters in this formulation.
10435  if (usedisscontinuation) then
10436  arg1 = -(disscontsharpness*(log10(totalr/totalr0)+&
10437 & disscontmidpoint))
10438  fis2 = rfil*(vis2+disscontmagnitude/(1+exp(arg1)))
10439  else
10440  fis2 = rfil*vis2
10441  end if
10442  fis4 = rfil*vis4
10443  sfil = one - rfil
10444 ! replace the total energy by rho times the total enthalpy.
10445 ! in this way the numerical solution is total enthalpy preserving
10446 ! for the steady euler equations. also replace the velocities by
10447 ! the momentum. only done for the entries used in the
10448 ! discretization, i.e. ignore the corner halo's.
10449  do k=0,kb
10450  do j=2,jl
10451  do i=2,il
10452  w(i, j, k, ivx) = w(i, j, k, irho)*w(i, j, k, ivx)
10453  w(i, j, k, ivy) = w(i, j, k, irho)*w(i, j, k, ivy)
10454  w(i, j, k, ivz) = w(i, j, k, irho)*w(i, j, k, ivz)
10455  w(i, j, k, irhoe) = w(i, j, k, irhoe) + p(i, j, k)
10456  end do
10457  end do
10458  end do
10459  do k=2,kl
10460  do j=2,jl
10461  w(0, j, k, ivx) = w(0, j, k, irho)*w(0, j, k, ivx)
10462  w(0, j, k, ivy) = w(0, j, k, irho)*w(0, j, k, ivy)
10463  w(0, j, k, ivz) = w(0, j, k, irho)*w(0, j, k, ivz)
10464  w(0, j, k, irhoe) = w(0, j, k, irhoe) + p(0, j, k)
10465  w(1, j, k, ivx) = w(1, j, k, irho)*w(1, j, k, ivx)
10466  w(1, j, k, ivy) = w(1, j, k, irho)*w(1, j, k, ivy)
10467  w(1, j, k, ivz) = w(1, j, k, irho)*w(1, j, k, ivz)
10468  w(1, j, k, irhoe) = w(1, j, k, irhoe) + p(1, j, k)
10469  w(ie, j, k, ivx) = w(ie, j, k, irho)*w(ie, j, k, ivx)
10470  w(ie, j, k, ivy) = w(ie, j, k, irho)*w(ie, j, k, ivy)
10471  w(ie, j, k, ivz) = w(ie, j, k, irho)*w(ie, j, k, ivz)
10472  w(ie, j, k, irhoe) = w(ie, j, k, irhoe) + p(ie, j, k)
10473  w(ib, j, k, ivx) = w(ib, j, k, irho)*w(ib, j, k, ivx)
10474  w(ib, j, k, ivy) = w(ib, j, k, irho)*w(ib, j, k, ivy)
10475  w(ib, j, k, ivz) = w(ib, j, k, irho)*w(ib, j, k, ivz)
10476  w(ib, j, k, irhoe) = w(ib, j, k, irhoe) + p(ib, j, k)
10477  end do
10478  end do
10479  do k=2,kl
10480  do i=2,il
10481  w(i, 0, k, ivx) = w(i, 0, k, irho)*w(i, 0, k, ivx)
10482  w(i, 0, k, ivy) = w(i, 0, k, irho)*w(i, 0, k, ivy)
10483  w(i, 0, k, ivz) = w(i, 0, k, irho)*w(i, 0, k, ivz)
10484  w(i, 0, k, irhoe) = w(i, 0, k, irhoe) + p(i, 0, k)
10485  w(i, 1, k, ivx) = w(i, 1, k, irho)*w(i, 1, k, ivx)
10486  w(i, 1, k, ivy) = w(i, 1, k, irho)*w(i, 1, k, ivy)
10487  w(i, 1, k, ivz) = w(i, 1, k, irho)*w(i, 1, k, ivz)
10488  w(i, 1, k, irhoe) = w(i, 1, k, irhoe) + p(i, 1, k)
10489  w(i, je, k, ivx) = w(i, je, k, irho)*w(i, je, k, ivx)
10490  w(i, je, k, ivy) = w(i, je, k, irho)*w(i, je, k, ivy)
10491  w(i, je, k, ivz) = w(i, je, k, irho)*w(i, je, k, ivz)
10492  w(i, je, k, irhoe) = w(i, je, k, irhoe) + p(i, je, k)
10493  w(i, jb, k, ivx) = w(i, jb, k, irho)*w(i, jb, k, ivx)
10494  w(i, jb, k, ivy) = w(i, jb, k, irho)*w(i, jb, k, ivy)
10495  w(i, jb, k, ivz) = w(i, jb, k, irho)*w(i, jb, k, ivz)
10496  w(i, jb, k, irhoe) = w(i, jb, k, irhoe) + p(i, jb, k)
10497  end do
10498  end do
10499 ! initialize the dissipative residual to a certain times,
10500 ! possibly zero, the previously stored value. owned cells
10501 ! only, because the halo values do not matter.
10502  do k=2,kl
10503  do j=2,jl
10504  do i=2,il
10505  fw(i, j, k, irho) = sfil*fw(i, j, k, irho)
10506  fw(i, j, k, imx) = sfil*fw(i, j, k, imx)
10507  fw(i, j, k, imy) = sfil*fw(i, j, k, imy)
10508  fw(i, j, k, imz) = sfil*fw(i, j, k, imz)
10509  fw(i, j, k, irhoe) = sfil*fw(i, j, k, irhoe)
10510  end do
10511  end do
10512  end do
10513 !
10514 ! dissipative fluxes in the i-direction.
10515 !
10516  do k=2,kl
10517  do j=2,jl
10518  x1 = (shocksensor(2, j, k)-two*shocksensor(1, j, k)+&
10519 & shocksensor(0, j, k))/(shocksensor(2, j, k)+two*shocksensor(&
10520 & 1, j, k)+shocksensor(0, j, k)+sslim)
10521  if (x1 .ge. 0.) then
10522  dss1 = x1
10523  else
10524  dss1 = -x1
10525  end if
10526 ! loop in i-direction.
10527  do i=1,il
10528  x2 = (shocksensor(i+2, j, k)-two*shocksensor(i+1, j, k)+&
10529 & shocksensor(i, j, k))/(shocksensor(i+2, j, k)+two*&
10530 & shocksensor(i+1, j, k)+shocksensor(i, j, k)+sslim)
10531  if (x2 .ge. 0.) then
10532  dss2 = x2
10533  else
10534  dss2 = -x2
10535  end if
10536 ! compute the dissipation coefficients for this face.
10537  ppor = zero
10538  if (pori(i, j, k) .eq. normalflux) ppor = half
10539  rrad = ppor*(radi(i, j, k)+radi(i+1, j, k))
10540  if (dss1 .lt. dss2) then
10541  y1 = dss2
10542  else
10543  y1 = dss1
10544  end if
10545  if (dssmax .gt. y1) then
10546  min1 = y1
10547  else
10548  min1 = dssmax
10549  end if
10550 ! modification for fd preconditioner note: this lumping
10551 ! actually still results in a greater than 3 cell stencil
10552 ! in any direction. since this seems to work slightly
10553 ! better than the dis2=sigma*fis4*rrad, we will just use
10554 ! a 5-cell stencil for doing the pc
10555  dis2 = fis2*rrad*min1 + sigma*fis4*rrad
10556 ! compute and scatter the dissipative flux.
10557 ! density. store it in the mass flow of the
10558 ! appropriate sliding mesh interface.
10559  ddw = w(i+1, j, k, irho) - w(i, j, k, irho)
10560  fs = dis2*ddw
10561  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
10562  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
10563 ! x-momentum.
10564  ddw = w(i+1, j, k, ivx) - w(i, j, k, ivx)
10565  fs = dis2*ddw
10566  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
10567  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
10568 ! y-momentum.
10569  ddw = w(i+1, j, k, ivy) - w(i, j, k, ivy)
10570  fs = dis2*ddw
10571  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
10572  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
10573 ! z-momentum.
10574  ddw = w(i+1, j, k, ivz) - w(i, j, k, ivz)
10575  fs = dis2*ddw
10576  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
10577  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
10578 ! energy.
10579  ddw = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
10580  fs = dis2*ddw
10581  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
10582  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
10583 ! set dss1 to dss2 for the next face.
10584  dss1 = dss2
10585  end do
10586  end do
10587  end do
10588 !
10589 ! dissipative fluxes in the j-direction.
10590 !
10591  do k=2,kl
10592  do i=2,il
10593  x3 = (shocksensor(i, 2, k)-two*shocksensor(i, 1, k)+&
10594 & shocksensor(i, 0, k))/(shocksensor(i, 2, k)+two*shocksensor(&
10595 & i, 1, k)+shocksensor(i, 0, k)+sslim)
10596  if (x3 .ge. 0.) then
10597  dss1 = x3
10598  else
10599  dss1 = -x3
10600  end if
10601 ! loop in j-direction.
10602  do j=1,jl
10603  x4 = (shocksensor(i, j+2, k)-two*shocksensor(i, j+1, k)+&
10604 & shocksensor(i, j, k))/(shocksensor(i, j+2, k)+two*&
10605 & shocksensor(i, j+1, k)+shocksensor(i, j, k)+sslim)
10606  if (x4 .ge. 0.) then
10607  dss2 = x4
10608  else
10609  dss2 = -x4
10610  end if
10611 ! compute the dissipation coefficients for this face.
10612  ppor = zero
10613  if (porj(i, j, k) .eq. normalflux) ppor = half
10614  rrad = ppor*(radj(i, j, k)+radj(i, j+1, k))
10615  if (dss1 .lt. dss2) then
10616  y2 = dss2
10617  else
10618  y2 = dss1
10619  end if
10620  if (dssmax .gt. y2) then
10621  min2 = y2
10622  else
10623  min2 = dssmax
10624  end if
10625 ! modification for fd preconditioner
10626  dis2 = fis2*rrad*min2 + sigma*fis4*rrad
10627 ! compute and scatter the dissipative flux.
10628 ! density. store it in the mass flow of the
10629 ! appropriate sliding mesh interface.
10630  ddw = w(i, j+1, k, irho) - w(i, j, k, irho)
10631  fs = dis2*ddw
10632  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
10633  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
10634 ! x-momentum.
10635  ddw = w(i, j+1, k, ivx) - w(i, j, k, ivx)
10636  fs = dis2*ddw
10637  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
10638  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
10639 ! y-momentum.
10640  ddw = w(i, j+1, k, ivy) - w(i, j, k, ivy)
10641  fs = dis2*ddw
10642  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
10643  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
10644 ! z-momentum.
10645  ddw = w(i, j+1, k, ivz) - w(i, j, k, ivz)
10646  fs = dis2*ddw
10647  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
10648  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
10649 ! energy.
10650  ddw = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
10651  fs = dis2*ddw
10652  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
10653  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
10654 ! set dss1 to dss2 for the next face.
10655  dss1 = dss2
10656  end do
10657  end do
10658  end do
10659 !
10660 ! dissipative fluxes in the k-direction.
10661 !
10662  do j=2,jl
10663  do i=2,il
10664  x5 = (shocksensor(i, j, 2)-two*shocksensor(i, j, 1)+&
10665 & shocksensor(i, j, 0))/(shocksensor(i, j, 2)+two*shocksensor(&
10666 & i, j, 1)+shocksensor(i, j, 0)+sslim)
10667  if (x5 .ge. 0.) then
10668  dss1 = x5
10669  else
10670  dss1 = -x5
10671  end if
10672 ! loop in k-direction.
10673  do k=1,kl
10674  x6 = (shocksensor(i, j, k+2)-two*shocksensor(i, j, k+1)+&
10675 & shocksensor(i, j, k))/(shocksensor(i, j, k+2)+two*&
10676 & shocksensor(i, j, k+1)+shocksensor(i, j, k)+sslim)
10677  if (x6 .ge. 0.) then
10678  dss2 = x6
10679  else
10680  dss2 = -x6
10681  end if
10682 ! compute the dissipation coefficients for this face.
10683  ppor = zero
10684  if (pork(i, j, k) .eq. normalflux) ppor = half
10685  rrad = ppor*(radk(i, j, k)+radk(i, j, k+1))
10686  if (dss1 .lt. dss2) then
10687  y3 = dss2
10688  else
10689  y3 = dss1
10690  end if
10691  if (dssmax .gt. y3) then
10692  min3 = y3
10693  else
10694  min3 = dssmax
10695  end if
10696 ! modification for fd preconditioner
10697  dis2 = fis2*rrad*min3 + sigma*fis4*rrad
10698 ! compute and scatter the dissipative flux.
10699 ! density. store it in the mass flow of the
10700 ! appropriate sliding mesh interface.
10701  ddw = w(i, j, k+1, irho) - w(i, j, k, irho)
10702  fs = dis2*ddw
10703  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) + fs
10704  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
10705 ! x-momentum.
10706  ddw = w(i, j, k+1, ivx) - w(i, j, k, ivx)
10707  fs = dis2*ddw
10708  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fs
10709  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
10710 ! y-momentum.
10711  ddw = w(i, j, k+1, ivy) - w(i, j, k, ivy)
10712  fs = dis2*ddw
10713  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fs
10714  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
10715 ! z-momentum.
10716  ddw = w(i, j, k+1, ivz) - w(i, j, k, ivz)
10717  fs = dis2*ddw
10718  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fs
10719  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
10720 ! energy.
10721  ddw = w(i, j, k+1, irhoe) - w(i, j, k, irhoe)
10722  fs = dis2*ddw
10723  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + fs
10724  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
10725 ! set dss1 to dss2 for the next face.
10726  dss1 = dss2
10727  end do
10728  end do
10729  end do
10730 ! replace rho times the total enthalpy by the total energy and
10731 ! store the velocities again instead of the momentum. only for
10732 ! those entries that have been altered, i.e. ignore the
10733 ! corner halo's.
10734  do k=0,kb
10735  do j=2,jl
10736  do i=2,il
10737  rhoi = one/w(i, j, k, irho)
10738  w(i, j, k, ivx) = w(i, j, k, ivx)*rhoi
10739  w(i, j, k, ivy) = w(i, j, k, ivy)*rhoi
10740  w(i, j, k, ivz) = w(i, j, k, ivz)*rhoi
10741  w(i, j, k, irhoe) = w(i, j, k, irhoe) - p(i, j, k)
10742  end do
10743  end do
10744  end do
10745  do k=2,kl
10746  do j=2,jl
10747  rhoi = one/w(0, j, k, irho)
10748  w(0, j, k, ivx) = w(0, j, k, ivx)*rhoi
10749  w(0, j, k, ivy) = w(0, j, k, ivy)*rhoi
10750  w(0, j, k, ivz) = w(0, j, k, ivz)*rhoi
10751  w(0, j, k, irhoe) = w(0, j, k, irhoe) - p(0, j, k)
10752  rhoi = one/w(1, j, k, irho)
10753  w(1, j, k, ivx) = w(1, j, k, ivx)*rhoi
10754  w(1, j, k, ivy) = w(1, j, k, ivy)*rhoi
10755  w(1, j, k, ivz) = w(1, j, k, ivz)*rhoi
10756  w(1, j, k, irhoe) = w(1, j, k, irhoe) - p(1, j, k)
10757  rhoi = one/w(ie, j, k, irho)
10758  w(ie, j, k, ivx) = w(ie, j, k, ivx)*rhoi
10759  w(ie, j, k, ivy) = w(ie, j, k, ivy)*rhoi
10760  w(ie, j, k, ivz) = w(ie, j, k, ivz)*rhoi
10761  w(ie, j, k, irhoe) = w(ie, j, k, irhoe) - p(ie, j, k)
10762  rhoi = one/w(ib, j, k, irho)
10763  w(ib, j, k, ivx) = w(ib, j, k, ivx)*rhoi
10764  w(ib, j, k, ivy) = w(ib, j, k, ivy)*rhoi
10765  w(ib, j, k, ivz) = w(ib, j, k, ivz)*rhoi
10766  w(ib, j, k, irhoe) = w(ib, j, k, irhoe) - p(ib, j, k)
10767  end do
10768  end do
10769  do k=2,kl
10770  do i=2,il
10771  rhoi = one/w(i, 0, k, irho)
10772  w(i, 0, k, ivx) = w(i, 0, k, ivx)*rhoi
10773  w(i, 0, k, ivy) = w(i, 0, k, ivy)*rhoi
10774  w(i, 0, k, ivz) = w(i, 0, k, ivz)*rhoi
10775  w(i, 0, k, irhoe) = w(i, 0, k, irhoe) - p(i, 0, k)
10776  rhoi = one/w(i, 1, k, irho)
10777  w(i, 1, k, ivx) = w(i, 1, k, ivx)*rhoi
10778  w(i, 1, k, ivy) = w(i, 1, k, ivy)*rhoi
10779  w(i, 1, k, ivz) = w(i, 1, k, ivz)*rhoi
10780  w(i, 1, k, irhoe) = w(i, 1, k, irhoe) - p(i, 1, k)
10781  rhoi = one/w(i, je, k, irho)
10782  w(i, je, k, ivx) = w(i, je, k, ivx)*rhoi
10783  w(i, je, k, ivy) = w(i, je, k, ivy)*rhoi
10784  w(i, je, k, ivz) = w(i, je, k, ivz)*rhoi
10785  w(i, je, k, irhoe) = w(i, je, k, irhoe) - p(i, je, k)
10786  rhoi = one/w(i, jb, k, irho)
10787  w(i, jb, k, ivx) = w(i, jb, k, ivx)*rhoi
10788  w(i, jb, k, ivy) = w(i, jb, k, ivy)*rhoi
10789  w(i, jb, k, ivz) = w(i, jb, k, ivz)*rhoi
10790  w(i, jb, k, irhoe) = w(i, jb, k, irhoe) - p(i, jb, k)
10791  end do
10792  end do
10793  end if
10794  end subroutine invisciddissfluxscalarapprox
10795 
10796 ! differentiation of invisciddissfluxmatrixapprox in forward (tangent) mode (with options i4 dr8 r8):
10797 ! variations of useful results: *fw
10798 ! with respect to varying inputs: pinfcorr *p *sfacei *sfacej
10799 ! *sfacek *w *si *sj *sk *fw
10800 ! rw status of diff variables: pinfcorr:in *p:in *sfacei:in *sfacej:in
10801 ! *sfacek:in *w:in *si:in *sj:in *sk:in *fw:in-out
10802 ! plus diff mem management of: p:in sfacei:in sfacej:in sfacek:in
10803 ! w:in si:in sj:in sk:in fw:in
10805 !
10806 ! invisciddissfluxmatrix computes the matrix artificial
10807 ! dissipation term. instead of the spectral radius, as used in
10808 ! the scalar dissipation scheme, the absolute value of the flux
10809 ! jacobian is used. this leads to a less diffusive and
10810 ! consequently more accurate scheme. it is assumed that the
10811 ! pointers in blockpointers already point to the correct block.
10812 !
10813  use blockpointers
10814  use cgnsgrid
10815  use constants
10816  use flowvarrefstate
10818  use inputphysics
10819  use iteration
10820  use utils_d, only : getcorrectfork
10821  implicit none
10822 !
10823 ! local parameters.
10824 !
10825  real(kind=realtype), parameter :: dpmax=0.25_realtype
10826  real(kind=realtype), parameter :: epsacoustic=0.25_realtype
10827  real(kind=realtype), parameter :: epsshear=0.025_realtype
10828  real(kind=realtype), parameter :: omega=0.5_realtype
10829  real(kind=realtype), parameter :: oneminomega=one-omega
10830 !
10831 ! local variables.
10832 !
10833  integer(kind=inttype) :: i, j, k, ind
10834  real(kind=realtype) :: plim, sface
10835  real(kind=realtype) :: plimd, sfaced
10836  real(kind=realtype) :: sfil, fis2, fis4
10837  real(kind=realtype) :: gammaavg, gm1, ovgm1, gm53
10838  real(kind=realtype) :: ppor, rrad, dis2
10839  real(kind=realtype) :: rradd, dis2d
10840  real(kind=realtype) :: dp1, dp2, ddw, tmp, fs
10841  real(kind=realtype) :: dp1d, dp2d, ddwd, tmpd, fsd
10842  real(kind=realtype) :: dr, dru, drv, drw, dre, drk, sx, sy, sz
10843  real(kind=realtype) :: drd, drud, drvd, drwd, dred, drkd, sxd, syd, &
10844 & szd
10845  real(kind=realtype) :: uavg, vavg, wavg, a2avg, aavg, havg
10846  real(kind=realtype) :: uavgd, vavgd, wavgd, a2avgd, aavgd, havgd
10847  real(kind=realtype) :: alphaavg, unavg, ovaavg, ova2avg
10848  real(kind=realtype) :: alphaavgd, unavgd, ovaavgd, ova2avgd
10849  real(kind=realtype) :: kavg, lam1, lam2, lam3, area
10850  real(kind=realtype) :: kavgd, lam1d, lam2d, lam3d, aread
10851  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
10852  real(kind=realtype) :: abv1d, abv2d, abv3d, abv4d, abv5d, abv6d, &
10853 & abv7d
10854  logical :: correctfork
10855  intrinsic abs
10856  intrinsic max
10857  intrinsic min
10858  intrinsic sqrt
10859  real(kind=realtype) :: x1
10860  real(kind=realtype) :: x1d
10861  real(kind=realtype) :: x2
10862  real(kind=realtype) :: x2d
10863  real(kind=realtype) :: y1
10864  real(kind=realtype) :: y1d
10865  real(kind=realtype) :: x3
10866  real(kind=realtype) :: x3d
10867  real(kind=realtype) :: x4
10868  real(kind=realtype) :: x4d
10869  real(kind=realtype) :: y2
10870  real(kind=realtype) :: y2d
10871  real(kind=realtype) :: x5
10872  real(kind=realtype) :: x5d
10873  real(kind=realtype) :: x6
10874  real(kind=realtype) :: x6d
10875  real(kind=realtype) :: y3
10876  real(kind=realtype) :: y3d
10877  real(kind=realtype) :: abs0
10878  real(kind=realtype) :: min1
10879  real(kind=realtype) :: min1d
10880  real(realtype) :: max1
10881  real(realtype) :: max1d
10882  real(kind=realtype) :: min2
10883  real(kind=realtype) :: min2d
10884  real(realtype) :: max2
10885  real(realtype) :: max2d
10886  real(kind=realtype) :: min3
10887  real(kind=realtype) :: min3d
10888  real(realtype) :: max3
10889  real(realtype) :: max3d
10890  real(kind=realtype) :: abs1
10891  real(kind=realtype) :: abs2
10892  real(kind=realtype) :: abs3
10893  real(kind=realtype) :: abs4
10894  real(kind=realtype) :: abs5
10895  real(kind=realtype) :: abs6
10896  real(kind=realtype) :: abs7
10897  real(kind=realtype) :: abs8
10898  real(kind=realtype) :: abs9
10899  real(kind=realtype) :: abs10
10900  real(kind=realtype) :: abs11
10901  real(kind=realtype) :: abs12
10902  real(kind=realtype) :: arg1
10903  real(kind=realtype) :: arg1d
10904  real(kind=realtype) :: temp
10905  real(kind=realtype) :: temp0
10906  real(kind=realtype) :: temp1
10907  real(kind=realtype) :: temp2
10908  real(kind=realtype) :: temp3
10909  if (rfil .ge. 0.) then
10910  abs0 = rfil
10911  else
10912  abs0 = -rfil
10913  end if
10914 ! check if rfil == 0. if so, the dissipative flux needs not to
10915 ! be computed.
10916  if (abs0 .lt. thresholdreal) then
10917  return
10918  else
10919 ! set the value of plim. to be fully consistent this must have
10920 ! the dimension of a pressure. therefore a fraction of pinfcorr
10921 ! is used.
10922  plimd = 0.001_realtype*pinfcorrd
10923  plim = 0.001_realtype*pinfcorr
10924 ! determine whether or not the total energy must be corrected
10925 ! for the presence of the turbulent kinetic energy.
10926  correctfork = getcorrectfork()
10927 ! initialize sface to zero. this value will be used if the
10928 ! block is not moving.
10929  sface = zero
10930 ! set a couple of constants for the scheme.
10931  fis2 = rfil*vis2
10932  fis4 = rfil*vis4
10933  sfil = one - rfil
10934 ! initialize the dissipative residual to a certain times,
10935 ! possibly zero, the previously stored value. owned cells
10936 ! only, because the halo values do not matter.
10937  do k=2,kl
10938  do j=2,jl
10939  do i=2,il
10940  fwd(i, j, k, irho) = sfil*fwd(i, j, k, irho)
10941  fw(i, j, k, irho) = sfil*fw(i, j, k, irho)
10942  fwd(i, j, k, imx) = sfil*fwd(i, j, k, imx)
10943  fw(i, j, k, imx) = sfil*fw(i, j, k, imx)
10944  fwd(i, j, k, imy) = sfil*fwd(i, j, k, imy)
10945  fw(i, j, k, imy) = sfil*fw(i, j, k, imy)
10946  fwd(i, j, k, imz) = sfil*fwd(i, j, k, imz)
10947  fw(i, j, k, imz) = sfil*fw(i, j, k, imz)
10948  fwd(i, j, k, irhoe) = sfil*fwd(i, j, k, irhoe)
10949  fw(i, j, k, irhoe) = sfil*fw(i, j, k, irhoe)
10950  end do
10951  end do
10952  end do
10953  sfaced = 0.0_8
10954 !
10955 ! dissipative fluxes in the i-direction.
10956 !
10957  do k=2,kl
10958  do j=2,jl
10959  if (shocksensor(2, j, k) - shocksensor(1, j, k) .ge. 0.) then
10960  abs1 = shocksensor(2, j, k) - shocksensor(1, j, k)
10961  else
10962  abs1 = -(shocksensor(2, j, k)-shocksensor(1, j, k))
10963  end if
10964  if (shocksensor(1, j, k) - shocksensor(0, j, k) .ge. 0.) then
10965  abs7 = shocksensor(1, j, k) - shocksensor(0, j, k)
10966  else
10967  abs7 = -(shocksensor(1, j, k)-shocksensor(0, j, k))
10968  end if
10969  temp = (shocksensor(2, j, k)-two*shocksensor(1, j, k)+&
10970 & shocksensor(0, j, k))/(omega*(shocksensor(2, j, k)+two*&
10971 & shocksensor(1, j, k)+shocksensor(0, j, k))+oneminomega*(abs1&
10972 & +abs7)+plim)
10973  x1d = -(temp*plimd/(omega*(shocksensor(2, j, k)+two*&
10974 & shocksensor(1, j, k)+shocksensor(0, j, k))+oneminomega*(abs1&
10975 & +abs7)+plim))
10976  x1 = temp
10977  if (x1 .ge. 0.) then
10978  dp1d = x1d
10979  dp1 = x1
10980  else
10981  dp1d = -x1d
10982  dp1 = -x1
10983  end if
10984 ! loop in i-direction.
10985  do i=1,il
10986  if (shocksensor(i+2, j, k) - shocksensor(i+1, j, k) .ge. 0.&
10987 & ) then
10988  abs2 = shocksensor(i+2, j, k) - shocksensor(i+1, j, k)
10989  else
10990  abs2 = -(shocksensor(i+2, j, k)-shocksensor(i+1, j, k))
10991  end if
10992  if (shocksensor(i+1, j, k) - shocksensor(i, j, k) .ge. 0.) &
10993 & then
10994  abs8 = shocksensor(i+1, j, k) - shocksensor(i, j, k)
10995  else
10996  abs8 = -(shocksensor(i+1, j, k)-shocksensor(i, j, k))
10997  end if
10998  temp = (shocksensor(i+2, j, k)-two*shocksensor(i+1, j, k)+&
10999 & shocksensor(i, j, k))/(omega*(shocksensor(i+2, j, k)+two*&
11000 & shocksensor(i+1, j, k)+shocksensor(i, j, k))+oneminomega*(&
11001 & abs2+abs8)+plim)
11002  x2d = -(temp*plimd/(omega*(shocksensor(i+2, j, k)+two*&
11003 & shocksensor(i+1, j, k)+shocksensor(i, j, k))+oneminomega*(&
11004 & abs2+abs8)+plim))
11005  x2 = temp
11006  if (x2 .ge. 0.) then
11007  dp2d = x2d
11008  dp2 = x2
11009  else
11010  dp2d = -x2d
11011  dp2 = -x2
11012  end if
11013 ! compute the dissipation coefficients for this face.
11014  ppor = zero
11015  if (pori(i, j, k) .eq. normalflux) ppor = one
11016  if (dp1 .lt. dp2) then
11017  y1d = dp2d
11018  y1 = dp2
11019  else
11020  y1d = dp1d
11021  y1 = dp1
11022  end if
11023  if (dpmax .gt. y1) then
11024  min1d = y1d
11025  min1 = y1
11026  else
11027  min1 = dpmax
11028  min1d = 0.0_8
11029  end if
11030  dis2d = fis2*ppor*min1d
11031  dis2 = fis2*ppor*min1 + sigma*fis4*ppor
11032 ! construct the vector of the first and third differences
11033 ! multiplied by the appropriate constants.
11034  ddwd = wd(i+1, j, k, irho) - wd(i, j, k, irho)
11035  ddw = w(i+1, j, k, irho) - w(i, j, k, irho)
11036  drd = ddw*dis2d + dis2*ddwd
11037  dr = dis2*ddw
11038  temp = w(i+1, j, k, ivx)
11039  temp0 = w(i+1, j, k, irho)
11040  temp1 = w(i, j, k, ivx)
11041  temp2 = w(i, j, k, irho)
11042  ddwd = temp*wd(i+1, j, k, irho) + temp0*wd(i+1, j, k, ivx) -&
11043 & temp1*wd(i, j, k, irho) - temp2*wd(i, j, k, ivx)
11044  ddw = temp0*temp - temp2*temp1
11045  drud = ddw*dis2d + dis2*ddwd
11046  dru = dis2*ddw
11047  temp2 = w(i+1, j, k, ivy)
11048  temp1 = w(i+1, j, k, irho)
11049  temp0 = w(i, j, k, ivy)
11050  temp = w(i, j, k, irho)
11051  ddwd = temp2*wd(i+1, j, k, irho) + temp1*wd(i+1, j, k, ivy) &
11052 & - temp0*wd(i, j, k, irho) - temp*wd(i, j, k, ivy)
11053  ddw = temp1*temp2 - temp*temp0
11054  drvd = ddw*dis2d + dis2*ddwd
11055  drv = dis2*ddw
11056  temp2 = w(i+1, j, k, ivz)
11057  temp1 = w(i+1, j, k, irho)
11058  temp0 = w(i, j, k, ivz)
11059  temp = w(i, j, k, irho)
11060  ddwd = temp2*wd(i+1, j, k, irho) + temp1*wd(i+1, j, k, ivz) &
11061 & - temp0*wd(i, j, k, irho) - temp*wd(i, j, k, ivz)
11062  ddw = temp1*temp2 - temp*temp0
11063  drwd = ddw*dis2d + dis2*ddwd
11064  drw = dis2*ddw
11065  ddwd = wd(i+1, j, k, irhoe) - wd(i, j, k, irhoe)
11066  ddw = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
11067  dred = ddw*dis2d + dis2*ddwd
11068  dre = dis2*ddw
11069 ! in case a k-equation is present, compute the difference
11070 ! of rhok and store the average value of k. if not present,
11071 ! set both these values to zero, such that later on no
11072 ! decision needs to be made anymore.
11073  if (correctfork) then
11074  temp2 = w(i+1, j, k, itu1)
11075  temp1 = w(i+1, j, k, irho)
11076  temp0 = w(i, j, k, itu1)
11077  temp = w(i, j, k, irho)
11078  ddwd = temp2*wd(i+1, j, k, irho) + temp1*wd(i+1, j, k, &
11079 & itu1) - temp0*wd(i, j, k, irho) - temp*wd(i, j, k, itu1)
11080  ddw = temp1*temp2 - temp*temp0
11081  drkd = ddw*dis2d + dis2*ddwd
11082  drk = dis2*ddw
11083  kavgd = half*(wd(i, j, k, itu1)+wd(i+1, j, k, itu1))
11084  kavg = half*(w(i, j, k, itu1)+w(i+1, j, k, itu1))
11085  else
11086  drk = zero
11087  kavg = zero
11088  kavgd = 0.0_8
11089  drkd = 0.0_8
11090  end if
11091 ! compute the average value of gamma and compute some
11092 ! expressions in which it occurs.
11093  gammaavg = half*(gamma(i+1, j, k)+gamma(i, j, k))
11094  gm1 = gammaavg - one
11095  ovgm1 = one/gm1
11096  gm53 = gammaavg - five*third
11097 ! compute the average state at the interface.
11098  uavgd = half*(wd(i+1, j, k, ivx)+wd(i, j, k, ivx))
11099  uavg = half*(w(i+1, j, k, ivx)+w(i, j, k, ivx))
11100  vavgd = half*(wd(i+1, j, k, ivy)+wd(i, j, k, ivy))
11101  vavg = half*(w(i+1, j, k, ivy)+w(i, j, k, ivy))
11102  wavgd = half*(wd(i+1, j, k, ivz)+wd(i, j, k, ivz))
11103  wavg = half*(w(i+1, j, k, ivz)+w(i, j, k, ivz))
11104  temp2 = gamma(i+1, j, k)
11105  temp1 = w(i+1, j, k, irho)
11106  temp0 = p(i+1, j, k)/temp1
11107  temp = w(i, j, k, irho)
11108  temp3 = p(i, j, k)/temp
11109  a2avgd = half*(temp2*(pd(i+1, j, k)-temp0*wd(i+1, j, k, irho&
11110 & ))/temp1+gamma(i, j, k)*(pd(i, j, k)-temp3*wd(i, j, k, &
11111 & irho))/temp)
11112  a2avg = half*(temp2*temp0+gamma(i, j, k)*temp3)
11113  sxd = sid(i, j, k, 1)
11114  sx = si(i, j, k, 1)
11115  syd = sid(i, j, k, 2)
11116  sy = si(i, j, k, 2)
11117  szd = sid(i, j, k, 3)
11118  sz = si(i, j, k, 3)
11119  arg1d = 2*sx*sxd + 2*sy*syd + 2*sz*szd
11120  arg1 = sx**2 + sy**2 + sz**2
11121  temp3 = sqrt(arg1)
11122  if (arg1 .eq. 0.0_8) then
11123  aread = 0.0_8
11124  else
11125  aread = arg1d/(2.0*temp3)
11126  end if
11127  area = temp3
11128  if (1.e-25_realtype .lt. area) then
11129  max1d = aread
11130  max1 = area
11131  else
11132  max1 = 1.e-25_realtype
11133  max1d = 0.0_8
11134  end if
11135  tmpd = -(one*max1d/max1**2)
11136  tmp = one/max1
11137  sxd = tmp*sxd + sx*tmpd
11138  sx = sx*tmp
11139  syd = tmp*syd + sy*tmpd
11140  sy = sy*tmp
11141  szd = tmp*szd + sz*tmpd
11142  sz = sz*tmp
11143  alphaavgd = half*(2*uavg*uavgd+2*vavg*vavgd+2*wavg*wavgd)
11144  alphaavg = half*(uavg**2+vavg**2+wavg**2)
11145  havgd = alphaavgd + ovgm1*(a2avgd-gm53*kavgd)
11146  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
11147  temp3 = sqrt(a2avg)
11148  if (a2avg .eq. 0.0_8) then
11149  aavgd = 0.0_8
11150  else
11151  aavgd = a2avgd/(2.0*temp3)
11152  end if
11153  aavg = temp3
11154  unavgd = sx*uavgd + uavg*sxd + sy*vavgd + vavg*syd + sz*&
11155 & wavgd + wavg*szd
11156  unavg = uavg*sx + vavg*sy + wavg*sz
11157  ovaavgd = -(one*aavgd/aavg**2)
11158  ovaavg = one/aavg
11159  ova2avgd = -(one*a2avgd/a2avg**2)
11160  ova2avg = one/a2avg
11161 ! the mesh velocity if the face is moving. it must be
11162 ! divided by the area to obtain a true velocity.
11163  if (addgridvelocities) then
11164  sfaced = tmp*sfaceid(i, j, k) + sfacei(i, j, k)*tmpd
11165  sface = sfacei(i, j, k)*tmp
11166  end if
11167  if (unavg - sface + aavg .ge. 0.) then
11168  lam1d = unavgd - sfaced + aavgd
11169  lam1 = unavg - sface + aavg
11170  else
11171  lam1d = sfaced - unavgd - aavgd
11172  lam1 = -(unavg-sface+aavg)
11173  end if
11174  if (unavg - sface - aavg .ge. 0.) then
11175  lam2d = unavgd - sfaced - aavgd
11176  lam2 = unavg - sface - aavg
11177  else
11178  lam2d = sfaced - unavgd + aavgd
11179  lam2 = -(unavg-sface-aavg)
11180  end if
11181  if (unavg - sface .ge. 0.) then
11182  lam3d = unavgd - sfaced
11183  lam3 = unavg - sface
11184  else
11185  lam3d = sfaced - unavgd
11186  lam3 = -(unavg-sface)
11187  end if
11188  rradd = lam3d + aavgd
11189  rrad = lam3 + aavg
11190  if (lam1 .lt. epsacoustic*rrad) then
11191  lam1d = epsacoustic*rradd
11192  lam1 = epsacoustic*rrad
11193  else
11194  lam1 = lam1
11195  end if
11196  if (lam2 .lt. epsacoustic*rrad) then
11197  lam2d = epsacoustic*rradd
11198  lam2 = epsacoustic*rrad
11199  else
11200  lam2 = lam2
11201  end if
11202  if (lam3 .lt. epsshear*rrad) then
11203  lam3d = epsshear*rradd
11204  lam3 = epsshear*rrad
11205  else
11206  lam3 = lam3
11207  end if
11208 ! multiply the eigenvalues by the area to obtain
11209 ! the correct values for the dissipation term.
11210  lam1d = area*lam1d + lam1*aread
11211  lam1 = lam1*area
11212  lam2d = area*lam2d + lam2*aread
11213  lam2 = lam2*area
11214  lam3d = area*lam3d + lam3*aread
11215  lam3 = lam3*area
11216 ! some abbreviations, which occur quite often in the
11217 ! dissipation terms.
11218  abv1d = half*(lam1d+lam2d)
11219  abv1 = half*(lam1+lam2)
11220  abv2d = half*(lam1d-lam2d)
11221  abv2 = half*(lam1-lam2)
11222  abv3d = abv1d - lam3d
11223  abv3 = abv1 - lam3
11224  abv4d = gm1*(dr*alphaavgd+alphaavg*drd-dru*uavgd-uavg*drud-&
11225 & drv*vavgd-vavg*drvd+dred-drw*wavgd-wavg*drwd) - gm53*drkd
11226  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
11227 & gm53*drk
11228  abv5d = dru*sxd + sx*drud + drv*syd + sy*drvd + drw*szd + sz&
11229 & *drwd - dr*unavgd - unavg*drd
11230  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
11231  abv6d = ova2avg*(abv4*abv3d+abv3*abv4d) + abv3*abv4*ova2avgd&
11232 & + ovaavg*(abv5*abv2d+abv2*abv5d) + abv2*abv5*ovaavgd
11233  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
11234  abv7d = ovaavg*(abv4*abv2d+abv2*abv4d) + abv2*abv4*ovaavgd +&
11235 & abv5*abv3d + abv3*abv5d
11236  abv7 = abv2*abv4*ovaavg + abv3*abv5
11237 ! compute and scatter the dissipative flux.
11238 ! density.
11239  fsd = dr*lam3d + lam3*drd + abv6d
11240  fs = lam3*dr + abv6
11241  fwd(i+1, j, k, irho) = fwd(i+1, j, k, irho) + fsd
11242  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
11243  fwd(i, j, k, irho) = fwd(i, j, k, irho) - fsd
11244  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
11245 ! x-momentum.
11246  fsd = dru*lam3d + lam3*drud + abv6*uavgd + uavg*abv6d + abv7&
11247 & *sxd + sx*abv7d
11248  fs = lam3*dru + uavg*abv6 + sx*abv7
11249  fwd(i+1, j, k, imx) = fwd(i+1, j, k, imx) + fsd
11250  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
11251  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fsd
11252  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
11253 ! y-momentum.
11254  fsd = drv*lam3d + lam3*drvd + abv6*vavgd + vavg*abv6d + abv7&
11255 & *syd + sy*abv7d
11256  fs = lam3*drv + vavg*abv6 + sy*abv7
11257  fwd(i+1, j, k, imy) = fwd(i+1, j, k, imy) + fsd
11258  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
11259  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fsd
11260  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
11261 ! z-momentum.
11262  fsd = drw*lam3d + lam3*drwd + abv6*wavgd + wavg*abv6d + abv7&
11263 & *szd + sz*abv7d
11264  fs = lam3*drw + wavg*abv6 + sz*abv7
11265  fwd(i+1, j, k, imz) = fwd(i+1, j, k, imz) + fsd
11266  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
11267  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fsd
11268  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
11269 ! energy.
11270  fsd = dre*lam3d + lam3*dred + abv6*havgd + havg*abv6d + abv7&
11271 & *unavgd + unavg*abv7d
11272  fs = lam3*dre + havg*abv6 + unavg*abv7
11273  fwd(i+1, j, k, irhoe) = fwd(i+1, j, k, irhoe) + fsd
11274  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
11275  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - fsd
11276  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
11277 ! set dp1 to dp2 for the next face.
11278  dp1d = dp2d
11279  dp1 = dp2
11280  end do
11281  end do
11282  end do
11283 !
11284 ! dissipative fluxes in the j-direction.
11285 !
11286  do k=2,kl
11287  do i=2,il
11288  if (shocksensor(i, 2, k) - shocksensor(i, 1, k) .ge. 0.) then
11289  abs3 = shocksensor(i, 2, k) - shocksensor(i, 1, k)
11290  else
11291  abs3 = -(shocksensor(i, 2, k)-shocksensor(i, 1, k))
11292  end if
11293  if (shocksensor(i, 1, k) - shocksensor(i, 0, k) .ge. 0.) then
11294  abs9 = shocksensor(i, 1, k) - shocksensor(i, 0, k)
11295  else
11296  abs9 = -(shocksensor(i, 1, k)-shocksensor(i, 0, k))
11297  end if
11298  temp3 = (shocksensor(i, 2, k)-two*shocksensor(i, 1, k)+&
11299 & shocksensor(i, 0, k))/(omega*(shocksensor(i, 2, k)+two*&
11300 & shocksensor(i, 1, k)+shocksensor(i, 0, k))+oneminomega*(abs3&
11301 & +abs9)+plim)
11302  x3d = -(temp3*plimd/(omega*(shocksensor(i, 2, k)+two*&
11303 & shocksensor(i, 1, k)+shocksensor(i, 0, k))+oneminomega*(abs3&
11304 & +abs9)+plim))
11305  x3 = temp3
11306  if (x3 .ge. 0.) then
11307  dp1d = x3d
11308  dp1 = x3
11309  else
11310  dp1d = -x3d
11311  dp1 = -x3
11312  end if
11313 ! loop in j-direction.
11314  do j=1,jl
11315  if (shocksensor(i, j+2, k) - shocksensor(i, j+1, k) .ge. 0.&
11316 & ) then
11317  abs4 = shocksensor(i, j+2, k) - shocksensor(i, j+1, k)
11318  else
11319  abs4 = -(shocksensor(i, j+2, k)-shocksensor(i, j+1, k))
11320  end if
11321  if (shocksensor(i, j+1, k) - shocksensor(i, j, k) .ge. 0.) &
11322 & then
11323  abs10 = shocksensor(i, j+1, k) - shocksensor(i, j, k)
11324  else
11325  abs10 = -(shocksensor(i, j+1, k)-shocksensor(i, j, k))
11326  end if
11327  temp3 = (shocksensor(i, j+2, k)-two*shocksensor(i, j+1, k)+&
11328 & shocksensor(i, j, k))/(omega*(shocksensor(i, j+2, k)+two*&
11329 & shocksensor(i, j+1, k)+shocksensor(i, j, k))+oneminomega*(&
11330 & abs4+abs10)+plim)
11331  x4d = -(temp3*plimd/(omega*(shocksensor(i, j+2, k)+two*&
11332 & shocksensor(i, j+1, k)+shocksensor(i, j, k))+oneminomega*(&
11333 & abs4+abs10)+plim))
11334  x4 = temp3
11335  if (x4 .ge. 0.) then
11336  dp2d = x4d
11337  dp2 = x4
11338  else
11339  dp2d = -x4d
11340  dp2 = -x4
11341  end if
11342 ! compute the dissipation coefficients for this face.
11343  ppor = zero
11344  if (porj(i, j, k) .eq. normalflux) ppor = one
11345  if (dp1 .lt. dp2) then
11346  y2d = dp2d
11347  y2 = dp2
11348  else
11349  y2d = dp1d
11350  y2 = dp1
11351  end if
11352  if (dpmax .gt. y2) then
11353  min2d = y2d
11354  min2 = y2
11355  else
11356  min2 = dpmax
11357  min2d = 0.0_8
11358  end if
11359  dis2d = fis2*ppor*min2d
11360  dis2 = fis2*ppor*min2 + sigma*fis4*ppor
11361 ! construct the vector of the first and third differences
11362 ! multiplied by the appropriate constants.
11363  ddwd = wd(i, j+1, k, irho) - wd(i, j, k, irho)
11364  ddw = w(i, j+1, k, irho) - w(i, j, k, irho)
11365  drd = ddw*dis2d + dis2*ddwd
11366  dr = dis2*ddw
11367  temp3 = w(i, j+1, k, ivx)
11368  temp2 = w(i, j+1, k, irho)
11369  temp1 = w(i, j, k, ivx)
11370  temp0 = w(i, j, k, irho)
11371  ddwd = temp3*wd(i, j+1, k, irho) + temp2*wd(i, j+1, k, ivx) &
11372 & - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, ivx)
11373  ddw = temp2*temp3 - temp0*temp1
11374  drud = ddw*dis2d + dis2*ddwd
11375  dru = dis2*ddw
11376  temp3 = w(i, j+1, k, ivy)
11377  temp2 = w(i, j+1, k, irho)
11378  temp1 = w(i, j, k, ivy)
11379  temp0 = w(i, j, k, irho)
11380  ddwd = temp3*wd(i, j+1, k, irho) + temp2*wd(i, j+1, k, ivy) &
11381 & - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, ivy)
11382  ddw = temp2*temp3 - temp0*temp1
11383  drvd = ddw*dis2d + dis2*ddwd
11384  drv = dis2*ddw
11385  temp3 = w(i, j+1, k, ivz)
11386  temp2 = w(i, j+1, k, irho)
11387  temp1 = w(i, j, k, ivz)
11388  temp0 = w(i, j, k, irho)
11389  ddwd = temp3*wd(i, j+1, k, irho) + temp2*wd(i, j+1, k, ivz) &
11390 & - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, ivz)
11391  ddw = temp2*temp3 - temp0*temp1
11392  drwd = ddw*dis2d + dis2*ddwd
11393  drw = dis2*ddw
11394  ddwd = wd(i, j+1, k, irhoe) - wd(i, j, k, irhoe)
11395  ddw = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
11396  dred = ddw*dis2d + dis2*ddwd
11397  dre = dis2*ddw
11398 ! in case a k-equation is present, compute the difference
11399 ! of rhok and store the average value of k. if not present,
11400 ! set both these values to zero, such that later on no
11401 ! decision needs to be made anymore.
11402  if (correctfork) then
11403  temp3 = w(i, j+1, k, itu1)
11404  temp2 = w(i, j+1, k, irho)
11405  temp1 = w(i, j, k, itu1)
11406  temp0 = w(i, j, k, irho)
11407  ddwd = temp3*wd(i, j+1, k, irho) + temp2*wd(i, j+1, k, &
11408 & itu1) - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, itu1&
11409 & )
11410  ddw = temp2*temp3 - temp0*temp1
11411  drkd = ddw*dis2d + dis2*ddwd
11412  drk = dis2*ddw
11413  kavgd = half*(wd(i, j, k, itu1)+wd(i, j+1, k, itu1))
11414  kavg = half*(w(i, j, k, itu1)+w(i, j+1, k, itu1))
11415  else
11416  drk = zero
11417  kavg = zero
11418  kavgd = 0.0_8
11419  drkd = 0.0_8
11420  end if
11421 ! compute the average value of gamma and compute some
11422 ! expressions in which it occurs.
11423  gammaavg = half*(gamma(i, j+1, k)+gamma(i, j, k))
11424  gm1 = gammaavg - one
11425  ovgm1 = one/gm1
11426  gm53 = gammaavg - five*third
11427 ! compute the average state at the interface.
11428  uavgd = half*(wd(i, j+1, k, ivx)+wd(i, j, k, ivx))
11429  uavg = half*(w(i, j+1, k, ivx)+w(i, j, k, ivx))
11430  vavgd = half*(wd(i, j+1, k, ivy)+wd(i, j, k, ivy))
11431  vavg = half*(w(i, j+1, k, ivy)+w(i, j, k, ivy))
11432  wavgd = half*(wd(i, j+1, k, ivz)+wd(i, j, k, ivz))
11433  wavg = half*(w(i, j+1, k, ivz)+w(i, j, k, ivz))
11434  temp3 = gamma(i, j+1, k)
11435  temp2 = w(i, j+1, k, irho)
11436  temp1 = p(i, j+1, k)/temp2
11437  temp0 = w(i, j, k, irho)
11438  temp = p(i, j, k)/temp0
11439  a2avgd = half*(temp3*(pd(i, j+1, k)-temp1*wd(i, j+1, k, irho&
11440 & ))/temp2+gamma(i, j, k)*(pd(i, j, k)-temp*wd(i, j, k, irho&
11441 & ))/temp0)
11442  a2avg = half*(temp3*temp1+gamma(i, j, k)*temp)
11443  sxd = sjd(i, j, k, 1)
11444  sx = sj(i, j, k, 1)
11445  syd = sjd(i, j, k, 2)
11446  sy = sj(i, j, k, 2)
11447  szd = sjd(i, j, k, 3)
11448  sz = sj(i, j, k, 3)
11449  arg1d = 2*sx*sxd + 2*sy*syd + 2*sz*szd
11450  arg1 = sx**2 + sy**2 + sz**2
11451  temp3 = sqrt(arg1)
11452  if (arg1 .eq. 0.0_8) then
11453  aread = 0.0_8
11454  else
11455  aread = arg1d/(2.0*temp3)
11456  end if
11457  area = temp3
11458  if (1.e-25_realtype .lt. area) then
11459  max2d = aread
11460  max2 = area
11461  else
11462  max2 = 1.e-25_realtype
11463  max2d = 0.0_8
11464  end if
11465  tmpd = -(one*max2d/max2**2)
11466  tmp = one/max2
11467  sxd = tmp*sxd + sx*tmpd
11468  sx = sx*tmp
11469  syd = tmp*syd + sy*tmpd
11470  sy = sy*tmp
11471  szd = tmp*szd + sz*tmpd
11472  sz = sz*tmp
11473  alphaavgd = half*(2*uavg*uavgd+2*vavg*vavgd+2*wavg*wavgd)
11474  alphaavg = half*(uavg**2+vavg**2+wavg**2)
11475  havgd = alphaavgd + ovgm1*(a2avgd-gm53*kavgd)
11476  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
11477  temp3 = sqrt(a2avg)
11478  if (a2avg .eq. 0.0_8) then
11479  aavgd = 0.0_8
11480  else
11481  aavgd = a2avgd/(2.0*temp3)
11482  end if
11483  aavg = temp3
11484  unavgd = sx*uavgd + uavg*sxd + sy*vavgd + vavg*syd + sz*&
11485 & wavgd + wavg*szd
11486  unavg = uavg*sx + vavg*sy + wavg*sz
11487  ovaavgd = -(one*aavgd/aavg**2)
11488  ovaavg = one/aavg
11489  ova2avgd = -(one*a2avgd/a2avg**2)
11490  ova2avg = one/a2avg
11491 ! the mesh velocity if the face is moving. it must be
11492 ! divided by the area to obtain a true velocity.
11493  if (addgridvelocities) then
11494  sfaced = tmp*sfacejd(i, j, k) + sfacej(i, j, k)*tmpd
11495  sface = sfacej(i, j, k)*tmp
11496  end if
11497  if (unavg - sface + aavg .ge. 0.) then
11498  lam1d = unavgd - sfaced + aavgd
11499  lam1 = unavg - sface + aavg
11500  else
11501  lam1d = sfaced - unavgd - aavgd
11502  lam1 = -(unavg-sface+aavg)
11503  end if
11504  if (unavg - sface - aavg .ge. 0.) then
11505  lam2d = unavgd - sfaced - aavgd
11506  lam2 = unavg - sface - aavg
11507  else
11508  lam2d = sfaced - unavgd + aavgd
11509  lam2 = -(unavg-sface-aavg)
11510  end if
11511  if (unavg - sface .ge. 0.) then
11512  lam3d = unavgd - sfaced
11513  lam3 = unavg - sface
11514  else
11515  lam3d = sfaced - unavgd
11516  lam3 = -(unavg-sface)
11517  end if
11518  rradd = lam3d + aavgd
11519  rrad = lam3 + aavg
11520  if (lam1 .lt. epsacoustic*rrad) then
11521  lam1d = epsacoustic*rradd
11522  lam1 = epsacoustic*rrad
11523  else
11524  lam1 = lam1
11525  end if
11526  if (lam2 .lt. epsacoustic*rrad) then
11527  lam2d = epsacoustic*rradd
11528  lam2 = epsacoustic*rrad
11529  else
11530  lam2 = lam2
11531  end if
11532  if (lam3 .lt. epsshear*rrad) then
11533  lam3d = epsshear*rradd
11534  lam3 = epsshear*rrad
11535  else
11536  lam3 = lam3
11537  end if
11538 ! multiply the eigenvalues by the area to obtain
11539 ! the correct values for the dissipation term.
11540  lam1d = area*lam1d + lam1*aread
11541  lam1 = lam1*area
11542  lam2d = area*lam2d + lam2*aread
11543  lam2 = lam2*area
11544  lam3d = area*lam3d + lam3*aread
11545  lam3 = lam3*area
11546 ! some abbreviations, which occur quite often in the
11547 ! dissipation terms.
11548  abv1d = half*(lam1d+lam2d)
11549  abv1 = half*(lam1+lam2)
11550  abv2d = half*(lam1d-lam2d)
11551  abv2 = half*(lam1-lam2)
11552  abv3d = abv1d - lam3d
11553  abv3 = abv1 - lam3
11554  abv4d = gm1*(dr*alphaavgd+alphaavg*drd-dru*uavgd-uavg*drud-&
11555 & drv*vavgd-vavg*drvd+dred-drw*wavgd-wavg*drwd) - gm53*drkd
11556  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
11557 & gm53*drk
11558  abv5d = dru*sxd + sx*drud + drv*syd + sy*drvd + drw*szd + sz&
11559 & *drwd - dr*unavgd - unavg*drd
11560  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
11561  abv6d = ova2avg*(abv4*abv3d+abv3*abv4d) + abv3*abv4*ova2avgd&
11562 & + ovaavg*(abv5*abv2d+abv2*abv5d) + abv2*abv5*ovaavgd
11563  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
11564  abv7d = ovaavg*(abv4*abv2d+abv2*abv4d) + abv2*abv4*ovaavgd +&
11565 & abv5*abv3d + abv3*abv5d
11566  abv7 = abv2*abv4*ovaavg + abv3*abv5
11567 ! compute and scatter the dissipative flux.
11568 ! density.
11569  fsd = dr*lam3d + lam3*drd + abv6d
11570  fs = lam3*dr + abv6
11571  fwd(i, j+1, k, irho) = fwd(i, j+1, k, irho) + fsd
11572  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
11573  fwd(i, j, k, irho) = fwd(i, j, k, irho) - fsd
11574  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
11575 ! x-momentum.
11576  fsd = dru*lam3d + lam3*drud + abv6*uavgd + uavg*abv6d + abv7&
11577 & *sxd + sx*abv7d
11578  fs = lam3*dru + uavg*abv6 + sx*abv7
11579  fwd(i, j+1, k, imx) = fwd(i, j+1, k, imx) + fsd
11580  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
11581  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fsd
11582  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
11583 ! y-momentum.
11584  fsd = drv*lam3d + lam3*drvd + abv6*vavgd + vavg*abv6d + abv7&
11585 & *syd + sy*abv7d
11586  fs = lam3*drv + vavg*abv6 + sy*abv7
11587  fwd(i, j+1, k, imy) = fwd(i, j+1, k, imy) + fsd
11588  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
11589  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fsd
11590  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
11591 ! z-momentum.
11592  fsd = drw*lam3d + lam3*drwd + abv6*wavgd + wavg*abv6d + abv7&
11593 & *szd + sz*abv7d
11594  fs = lam3*drw + wavg*abv6 + sz*abv7
11595  fwd(i, j+1, k, imz) = fwd(i, j+1, k, imz) + fsd
11596  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
11597  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fsd
11598  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
11599 ! energy.
11600  fsd = dre*lam3d + lam3*dred + abv6*havgd + havg*abv6d + abv7&
11601 & *unavgd + unavg*abv7d
11602  fs = lam3*dre + havg*abv6 + unavg*abv7
11603  fwd(i, j+1, k, irhoe) = fwd(i, j+1, k, irhoe) + fsd
11604  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
11605  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - fsd
11606  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
11607 ! set dp1 to dp2 for the next face.
11608  dp1d = dp2d
11609  dp1 = dp2
11610  end do
11611  end do
11612  end do
11613 !
11614 ! dissipative fluxes in the k-direction.
11615 !
11616  do j=2,jl
11617  do i=2,il
11618  if (shocksensor(i, j, 2) - shocksensor(i, j, 1) .ge. 0.) then
11619  abs5 = shocksensor(i, j, 2) - shocksensor(i, j, 1)
11620  else
11621  abs5 = -(shocksensor(i, j, 2)-shocksensor(i, j, 1))
11622  end if
11623  if (shocksensor(i, j, 1) - shocksensor(i, j, 0) .ge. 0.) then
11624  abs11 = shocksensor(i, j, 1) - shocksensor(i, j, 0)
11625  else
11626  abs11 = -(shocksensor(i, j, 1)-shocksensor(i, j, 0))
11627  end if
11628  temp3 = (shocksensor(i, j, 2)-two*shocksensor(i, j, 1)+&
11629 & shocksensor(i, j, 0))/(omega*(shocksensor(i, j, 2)+two*&
11630 & shocksensor(i, j, 1)+shocksensor(i, j, 0))+oneminomega*(abs5&
11631 & +abs11)+plim)
11632  x5d = -(temp3*plimd/(omega*(shocksensor(i, j, 2)+two*&
11633 & shocksensor(i, j, 1)+shocksensor(i, j, 0))+oneminomega*(abs5&
11634 & +abs11)+plim))
11635  x5 = temp3
11636  if (x5 .ge. 0.) then
11637  dp1d = x5d
11638  dp1 = x5
11639  else
11640  dp1d = -x5d
11641  dp1 = -x5
11642  end if
11643 ! loop in k-direction.
11644  do k=1,kl
11645  if (shocksensor(i, j, k+2) - shocksensor(i, j, k+1) .ge. 0.&
11646 & ) then
11647  abs6 = shocksensor(i, j, k+2) - shocksensor(i, j, k+1)
11648  else
11649  abs6 = -(shocksensor(i, j, k+2)-shocksensor(i, j, k+1))
11650  end if
11651  if (shocksensor(i, j, k+1) - shocksensor(i, j, k) .ge. 0.) &
11652 & then
11653  abs12 = shocksensor(i, j, k+1) - shocksensor(i, j, k)
11654  else
11655  abs12 = -(shocksensor(i, j, k+1)-shocksensor(i, j, k))
11656  end if
11657  temp3 = (shocksensor(i, j, k+2)-two*shocksensor(i, j, k+1)+&
11658 & shocksensor(i, j, k))/(omega*(shocksensor(i, j, k+2)+two*&
11659 & shocksensor(i, j, k+1)+shocksensor(i, j, k))+oneminomega*(&
11660 & abs6+abs12)+plim)
11661  x6d = -(temp3*plimd/(omega*(shocksensor(i, j, k+2)+two*&
11662 & shocksensor(i, j, k+1)+shocksensor(i, j, k))+oneminomega*(&
11663 & abs6+abs12)+plim))
11664  x6 = temp3
11665  if (x6 .ge. 0.) then
11666  dp2d = x6d
11667  dp2 = x6
11668  else
11669  dp2d = -x6d
11670  dp2 = -x6
11671  end if
11672 ! compute the dissipation coefficients for this face.
11673  ppor = zero
11674  if (pork(i, j, k) .eq. normalflux) ppor = one
11675  if (dp1 .lt. dp2) then
11676  y3d = dp2d
11677  y3 = dp2
11678  else
11679  y3d = dp1d
11680  y3 = dp1
11681  end if
11682  if (dpmax .gt. y3) then
11683  min3d = y3d
11684  min3 = y3
11685  else
11686  min3 = dpmax
11687  min3d = 0.0_8
11688  end if
11689  dis2d = fis2*ppor*min3d
11690  dis2 = fis2*ppor*min3 + sigma*fis4*ppor
11691 ! construct the vector of the first and third differences
11692 ! multiplied by the appropriate constants.
11693  ddwd = wd(i, j, k+1, irho) - wd(i, j, k, irho)
11694  ddw = w(i, j, k+1, irho) - w(i, j, k, irho)
11695  drd = ddw*dis2d + dis2*ddwd
11696  dr = dis2*ddw
11697  temp3 = w(i, j, k+1, ivx)
11698  temp2 = w(i, j, k+1, irho)
11699  temp1 = w(i, j, k, ivx)
11700  temp0 = w(i, j, k, irho)
11701  ddwd = temp3*wd(i, j, k+1, irho) + temp2*wd(i, j, k+1, ivx) &
11702 & - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, ivx)
11703  ddw = temp2*temp3 - temp0*temp1
11704  drud = ddw*dis2d + dis2*ddwd
11705  dru = dis2*ddw
11706  temp3 = w(i, j, k+1, ivy)
11707  temp2 = w(i, j, k+1, irho)
11708  temp1 = w(i, j, k, ivy)
11709  temp0 = w(i, j, k, irho)
11710  ddwd = temp3*wd(i, j, k+1, irho) + temp2*wd(i, j, k+1, ivy) &
11711 & - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, ivy)
11712  ddw = temp2*temp3 - temp0*temp1
11713  drvd = ddw*dis2d + dis2*ddwd
11714  drv = dis2*ddw
11715  temp3 = w(i, j, k+1, ivz)
11716  temp2 = w(i, j, k+1, irho)
11717  temp1 = w(i, j, k, ivz)
11718  temp0 = w(i, j, k, irho)
11719  ddwd = temp3*wd(i, j, k+1, irho) + temp2*wd(i, j, k+1, ivz) &
11720 & - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, ivz)
11721  ddw = temp2*temp3 - temp0*temp1
11722  drwd = ddw*dis2d + dis2*ddwd
11723  drw = dis2*ddw
11724  ddwd = wd(i, j, k+1, irhoe) - wd(i, j, k, irhoe)
11725  ddw = w(i, j, k+1, irhoe) - w(i, j, k, irhoe)
11726  dred = ddw*dis2d + dis2*ddwd
11727  dre = dis2*ddw
11728 ! in case a k-equation is present, compute the difference
11729 ! of rhok and store the average value of k. if not present,
11730 ! set both these values to zero, such that later on no
11731 ! decision needs to be made anymore.
11732  if (correctfork) then
11733  temp3 = w(i, j, k+1, itu1)
11734  temp2 = w(i, j, k+1, irho)
11735  temp1 = w(i, j, k, itu1)
11736  temp0 = w(i, j, k, irho)
11737  ddwd = temp3*wd(i, j, k+1, irho) + temp2*wd(i, j, k+1, &
11738 & itu1) - temp1*wd(i, j, k, irho) - temp0*wd(i, j, k, itu1&
11739 & )
11740  ddw = temp2*temp3 - temp0*temp1
11741  drkd = ddw*dis2d + dis2*ddwd
11742  drk = dis2*ddw
11743  kavgd = half*(wd(i, j, k+1, itu1)+wd(i, j, k, itu1))
11744  kavg = half*(w(i, j, k+1, itu1)+w(i, j, k, itu1))
11745  else
11746  drk = zero
11747  kavg = zero
11748  kavgd = 0.0_8
11749  drkd = 0.0_8
11750  end if
11751 ! compute the average value of gamma and compute some
11752 ! expressions in which it occurs.
11753  gammaavg = half*(gamma(i, j, k+1)+gamma(i, j, k))
11754  gm1 = gammaavg - one
11755  ovgm1 = one/gm1
11756  gm53 = gammaavg - five*third
11757 ! compute the average state at the interface.
11758  uavgd = half*(wd(i, j, k+1, ivx)+wd(i, j, k, ivx))
11759  uavg = half*(w(i, j, k+1, ivx)+w(i, j, k, ivx))
11760  vavgd = half*(wd(i, j, k+1, ivy)+wd(i, j, k, ivy))
11761  vavg = half*(w(i, j, k+1, ivy)+w(i, j, k, ivy))
11762  wavgd = half*(wd(i, j, k+1, ivz)+wd(i, j, k, ivz))
11763  wavg = half*(w(i, j, k+1, ivz)+w(i, j, k, ivz))
11764  temp3 = gamma(i, j, k+1)
11765  temp2 = w(i, j, k+1, irho)
11766  temp1 = p(i, j, k+1)/temp2
11767  temp0 = w(i, j, k, irho)
11768  temp = p(i, j, k)/temp0
11769  a2avgd = half*(temp3*(pd(i, j, k+1)-temp1*wd(i, j, k+1, irho&
11770 & ))/temp2+gamma(i, j, k)*(pd(i, j, k)-temp*wd(i, j, k, irho&
11771 & ))/temp0)
11772  a2avg = half*(temp3*temp1+gamma(i, j, k)*temp)
11773  sxd = skd(i, j, k, 1)
11774  sx = sk(i, j, k, 1)
11775  syd = skd(i, j, k, 2)
11776  sy = sk(i, j, k, 2)
11777  szd = skd(i, j, k, 3)
11778  sz = sk(i, j, k, 3)
11779  arg1d = 2*sx*sxd + 2*sy*syd + 2*sz*szd
11780  arg1 = sx**2 + sy**2 + sz**2
11781  temp3 = sqrt(arg1)
11782  if (arg1 .eq. 0.0_8) then
11783  aread = 0.0_8
11784  else
11785  aread = arg1d/(2.0*temp3)
11786  end if
11787  area = temp3
11788  if (1.e-25_realtype .lt. area) then
11789  max3d = aread
11790  max3 = area
11791  else
11792  max3 = 1.e-25_realtype
11793  max3d = 0.0_8
11794  end if
11795  tmpd = -(one*max3d/max3**2)
11796  tmp = one/max3
11797  sxd = tmp*sxd + sx*tmpd
11798  sx = sx*tmp
11799  syd = tmp*syd + sy*tmpd
11800  sy = sy*tmp
11801  szd = tmp*szd + sz*tmpd
11802  sz = sz*tmp
11803  alphaavgd = half*(2*uavg*uavgd+2*vavg*vavgd+2*wavg*wavgd)
11804  alphaavg = half*(uavg**2+vavg**2+wavg**2)
11805  havgd = alphaavgd + ovgm1*(a2avgd-gm53*kavgd)
11806  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
11807  temp3 = sqrt(a2avg)
11808  if (a2avg .eq. 0.0_8) then
11809  aavgd = 0.0_8
11810  else
11811  aavgd = a2avgd/(2.0*temp3)
11812  end if
11813  aavg = temp3
11814  unavgd = sx*uavgd + uavg*sxd + sy*vavgd + vavg*syd + sz*&
11815 & wavgd + wavg*szd
11816  unavg = uavg*sx + vavg*sy + wavg*sz
11817  ovaavgd = -(one*aavgd/aavg**2)
11818  ovaavg = one/aavg
11819  ova2avgd = -(one*a2avgd/a2avg**2)
11820  ova2avg = one/a2avg
11821 ! the mesh velocity if the face is moving. it must be
11822 ! divided by the area to obtain a true velocity.
11823  if (addgridvelocities) then
11824  sfaced = tmp*sfacekd(i, j, k) + sfacek(i, j, k)*tmpd
11825  sface = sfacek(i, j, k)*tmp
11826  end if
11827  if (unavg - sface + aavg .ge. 0.) then
11828  lam1d = unavgd - sfaced + aavgd
11829  lam1 = unavg - sface + aavg
11830  else
11831  lam1d = sfaced - unavgd - aavgd
11832  lam1 = -(unavg-sface+aavg)
11833  end if
11834  if (unavg - sface - aavg .ge. 0.) then
11835  lam2d = unavgd - sfaced - aavgd
11836  lam2 = unavg - sface - aavg
11837  else
11838  lam2d = sfaced - unavgd + aavgd
11839  lam2 = -(unavg-sface-aavg)
11840  end if
11841  if (unavg - sface .ge. 0.) then
11842  lam3d = unavgd - sfaced
11843  lam3 = unavg - sface
11844  else
11845  lam3d = sfaced - unavgd
11846  lam3 = -(unavg-sface)
11847  end if
11848  rradd = lam3d + aavgd
11849  rrad = lam3 + aavg
11850  if (lam1 .lt. epsacoustic*rrad) then
11851  lam1d = epsacoustic*rradd
11852  lam1 = epsacoustic*rrad
11853  else
11854  lam1 = lam1
11855  end if
11856  if (lam2 .lt. epsacoustic*rrad) then
11857  lam2d = epsacoustic*rradd
11858  lam2 = epsacoustic*rrad
11859  else
11860  lam2 = lam2
11861  end if
11862  if (lam3 .lt. epsshear*rrad) then
11863  lam3d = epsshear*rradd
11864  lam3 = epsshear*rrad
11865  else
11866  lam3 = lam3
11867  end if
11868 ! multiply the eigenvalues by the area to obtain
11869 ! the correct values for the dissipation term.
11870  lam1d = area*lam1d + lam1*aread
11871  lam1 = lam1*area
11872  lam2d = area*lam2d + lam2*aread
11873  lam2 = lam2*area
11874  lam3d = area*lam3d + lam3*aread
11875  lam3 = lam3*area
11876 ! some abbreviations, which occur quite often in the
11877 ! dissipation terms.
11878  abv1d = half*(lam1d+lam2d)
11879  abv1 = half*(lam1+lam2)
11880  abv2d = half*(lam1d-lam2d)
11881  abv2 = half*(lam1-lam2)
11882  abv3d = abv1d - lam3d
11883  abv3 = abv1 - lam3
11884  abv4d = gm1*(dr*alphaavgd+alphaavg*drd-dru*uavgd-uavg*drud-&
11885 & drv*vavgd-vavg*drvd+dred-drw*wavgd-wavg*drwd) - gm53*drkd
11886  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
11887 & gm53*drk
11888  abv5d = dru*sxd + sx*drud + drv*syd + sy*drvd + drw*szd + sz&
11889 & *drwd - dr*unavgd - unavg*drd
11890  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
11891  abv6d = ova2avg*(abv4*abv3d+abv3*abv4d) + abv3*abv4*ova2avgd&
11892 & + ovaavg*(abv5*abv2d+abv2*abv5d) + abv2*abv5*ovaavgd
11893  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
11894  abv7d = ovaavg*(abv4*abv2d+abv2*abv4d) + abv2*abv4*ovaavgd +&
11895 & abv5*abv3d + abv3*abv5d
11896  abv7 = abv2*abv4*ovaavg + abv3*abv5
11897 ! compute and scatter the dissipative flux.
11898 ! density.
11899  fsd = dr*lam3d + lam3*drd + abv6d
11900  fs = lam3*dr + abv6
11901  fwd(i, j, k+1, irho) = fwd(i, j, k+1, irho) + fsd
11902  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) + fs
11903  fwd(i, j, k, irho) = fwd(i, j, k, irho) - fsd
11904  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
11905 ! x-momentum.
11906  fsd = dru*lam3d + lam3*drud + abv6*uavgd + uavg*abv6d + abv7&
11907 & *sxd + sx*abv7d
11908  fs = lam3*dru + uavg*abv6 + sx*abv7
11909  fwd(i, j, k+1, imx) = fwd(i, j, k+1, imx) + fsd
11910  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fs
11911  fwd(i, j, k, imx) = fwd(i, j, k, imx) - fsd
11912  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
11913 ! y-momentum.
11914  fsd = drv*lam3d + lam3*drvd + abv6*vavgd + vavg*abv6d + abv7&
11915 & *syd + sy*abv7d
11916  fs = lam3*drv + vavg*abv6 + sy*abv7
11917  fwd(i, j, k+1, imy) = fwd(i, j, k+1, imy) + fsd
11918  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fs
11919  fwd(i, j, k, imy) = fwd(i, j, k, imy) - fsd
11920  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
11921 ! z-momentum.
11922  fsd = drw*lam3d + lam3*drwd + abv6*wavgd + wavg*abv6d + abv7&
11923 & *szd + sz*abv7d
11924  fs = lam3*drw + wavg*abv6 + sz*abv7
11925  fwd(i, j, k+1, imz) = fwd(i, j, k+1, imz) + fsd
11926  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fs
11927  fwd(i, j, k, imz) = fwd(i, j, k, imz) - fsd
11928  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
11929 ! energy.
11930  fsd = dre*lam3d + lam3*dred + abv6*havgd + havg*abv6d + abv7&
11931 & *unavgd + unavg*abv7d
11932  fs = lam3*dre + havg*abv6 + unavg*abv7
11933  fwd(i, j, k+1, irhoe) = fwd(i, j, k+1, irhoe) + fsd
11934  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + fs
11935  fwd(i, j, k, irhoe) = fwd(i, j, k, irhoe) - fsd
11936  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
11937 ! set dp1 to dp2 for the next face.
11938  dp1d = dp2d
11939  dp1 = dp2
11940  end do
11941  end do
11942  end do
11943  end if
11944  end subroutine invisciddissfluxmatrixapprox_d
11945 
11947 !
11948 ! invisciddissfluxmatrix computes the matrix artificial
11949 ! dissipation term. instead of the spectral radius, as used in
11950 ! the scalar dissipation scheme, the absolute value of the flux
11951 ! jacobian is used. this leads to a less diffusive and
11952 ! consequently more accurate scheme. it is assumed that the
11953 ! pointers in blockpointers already point to the correct block.
11954 !
11955  use blockpointers
11956  use cgnsgrid
11957  use constants
11958  use flowvarrefstate
11960  use inputphysics
11961  use iteration
11962  use utils_d, only : getcorrectfork
11963  implicit none
11964 !
11965 ! local parameters.
11966 !
11967  real(kind=realtype), parameter :: dpmax=0.25_realtype
11968  real(kind=realtype), parameter :: epsacoustic=0.25_realtype
11969  real(kind=realtype), parameter :: epsshear=0.025_realtype
11970  real(kind=realtype), parameter :: omega=0.5_realtype
11971  real(kind=realtype), parameter :: oneminomega=one-omega
11972 !
11973 ! local variables.
11974 !
11975  integer(kind=inttype) :: i, j, k, ind
11976  real(kind=realtype) :: plim, sface
11977  real(kind=realtype) :: sfil, fis2, fis4
11978  real(kind=realtype) :: gammaavg, gm1, ovgm1, gm53
11979  real(kind=realtype) :: ppor, rrad, dis2
11980  real(kind=realtype) :: dp1, dp2, ddw, tmp, fs
11981  real(kind=realtype) :: dr, dru, drv, drw, dre, drk, sx, sy, sz
11982  real(kind=realtype) :: uavg, vavg, wavg, a2avg, aavg, havg
11983  real(kind=realtype) :: alphaavg, unavg, ovaavg, ova2avg
11984  real(kind=realtype) :: kavg, lam1, lam2, lam3, area
11985  real(kind=realtype) :: abv1, abv2, abv3, abv4, abv5, abv6, abv7
11986  logical :: correctfork
11987  intrinsic abs
11988  intrinsic max
11989  intrinsic min
11990  intrinsic sqrt
11991  real(kind=realtype) :: x1
11992  real(kind=realtype) :: x2
11993  real(kind=realtype) :: y1
11994  real(kind=realtype) :: x3
11995  real(kind=realtype) :: x4
11996  real(kind=realtype) :: y2
11997  real(kind=realtype) :: x5
11998  real(kind=realtype) :: x6
11999  real(kind=realtype) :: y3
12000  real(kind=realtype) :: abs0
12001  real(kind=realtype) :: min1
12002  real(realtype) :: max1
12003  real(kind=realtype) :: min2
12004  real(realtype) :: max2
12005  real(kind=realtype) :: min3
12006  real(realtype) :: max3
12007  real(kind=realtype) :: abs1
12008  real(kind=realtype) :: abs2
12009  real(kind=realtype) :: abs3
12010  real(kind=realtype) :: abs4
12011  real(kind=realtype) :: abs5
12012  real(kind=realtype) :: abs6
12013  real(kind=realtype) :: abs7
12014  real(kind=realtype) :: abs8
12015  real(kind=realtype) :: abs9
12016  real(kind=realtype) :: abs10
12017  real(kind=realtype) :: abs11
12018  real(kind=realtype) :: abs12
12019  real(kind=realtype) :: arg1
12020  if (rfil .ge. 0.) then
12021  abs0 = rfil
12022  else
12023  abs0 = -rfil
12024  end if
12025 ! check if rfil == 0. if so, the dissipative flux needs not to
12026 ! be computed.
12027  if (abs0 .lt. thresholdreal) then
12028  return
12029  else
12030 ! set the value of plim. to be fully consistent this must have
12031 ! the dimension of a pressure. therefore a fraction of pinfcorr
12032 ! is used.
12033  plim = 0.001_realtype*pinfcorr
12034 ! determine whether or not the total energy must be corrected
12035 ! for the presence of the turbulent kinetic energy.
12036  correctfork = getcorrectfork()
12037 ! initialize sface to zero. this value will be used if the
12038 ! block is not moving.
12039  sface = zero
12040 ! set a couple of constants for the scheme.
12041  fis2 = rfil*vis2
12042  fis4 = rfil*vis4
12043  sfil = one - rfil
12044 ! initialize the dissipative residual to a certain times,
12045 ! possibly zero, the previously stored value. owned cells
12046 ! only, because the halo values do not matter.
12047  do k=2,kl
12048  do j=2,jl
12049  do i=2,il
12050  fw(i, j, k, irho) = sfil*fw(i, j, k, irho)
12051  fw(i, j, k, imx) = sfil*fw(i, j, k, imx)
12052  fw(i, j, k, imy) = sfil*fw(i, j, k, imy)
12053  fw(i, j, k, imz) = sfil*fw(i, j, k, imz)
12054  fw(i, j, k, irhoe) = sfil*fw(i, j, k, irhoe)
12055  end do
12056  end do
12057  end do
12058 !
12059 ! dissipative fluxes in the i-direction.
12060 !
12061  do k=2,kl
12062  do j=2,jl
12063  if (shocksensor(2, j, k) - shocksensor(1, j, k) .ge. 0.) then
12064  abs1 = shocksensor(2, j, k) - shocksensor(1, j, k)
12065  else
12066  abs1 = -(shocksensor(2, j, k)-shocksensor(1, j, k))
12067  end if
12068  if (shocksensor(1, j, k) - shocksensor(0, j, k) .ge. 0.) then
12069  abs7 = shocksensor(1, j, k) - shocksensor(0, j, k)
12070  else
12071  abs7 = -(shocksensor(1, j, k)-shocksensor(0, j, k))
12072  end if
12073  x1 = (shocksensor(2, j, k)-two*shocksensor(1, j, k)+&
12074 & shocksensor(0, j, k))/(omega*(shocksensor(2, j, k)+two*&
12075 & shocksensor(1, j, k)+shocksensor(0, j, k))+oneminomega*(abs1&
12076 & +abs7)+plim)
12077  if (x1 .ge. 0.) then
12078  dp1 = x1
12079  else
12080  dp1 = -x1
12081  end if
12082 ! loop in i-direction.
12083  do i=1,il
12084  if (shocksensor(i+2, j, k) - shocksensor(i+1, j, k) .ge. 0.&
12085 & ) then
12086  abs2 = shocksensor(i+2, j, k) - shocksensor(i+1, j, k)
12087  else
12088  abs2 = -(shocksensor(i+2, j, k)-shocksensor(i+1, j, k))
12089  end if
12090  if (shocksensor(i+1, j, k) - shocksensor(i, j, k) .ge. 0.) &
12091 & then
12092  abs8 = shocksensor(i+1, j, k) - shocksensor(i, j, k)
12093  else
12094  abs8 = -(shocksensor(i+1, j, k)-shocksensor(i, j, k))
12095  end if
12096  x2 = (shocksensor(i+2, j, k)-two*shocksensor(i+1, j, k)+&
12097 & shocksensor(i, j, k))/(omega*(shocksensor(i+2, j, k)+two*&
12098 & shocksensor(i+1, j, k)+shocksensor(i, j, k))+oneminomega*(&
12099 & abs2+abs8)+plim)
12100  if (x2 .ge. 0.) then
12101  dp2 = x2
12102  else
12103  dp2 = -x2
12104  end if
12105 ! compute the dissipation coefficients for this face.
12106  ppor = zero
12107  if (pori(i, j, k) .eq. normalflux) ppor = one
12108  if (dp1 .lt. dp2) then
12109  y1 = dp2
12110  else
12111  y1 = dp1
12112  end if
12113  if (dpmax .gt. y1) then
12114  min1 = y1
12115  else
12116  min1 = dpmax
12117  end if
12118  dis2 = fis2*ppor*min1 + sigma*fis4*ppor
12119 ! construct the vector of the first and third differences
12120 ! multiplied by the appropriate constants.
12121  ddw = w(i+1, j, k, irho) - w(i, j, k, irho)
12122  dr = dis2*ddw
12123  ddw = w(i+1, j, k, irho)*w(i+1, j, k, ivx) - w(i, j, k, irho&
12124 & )*w(i, j, k, ivx)
12125  dru = dis2*ddw
12126  ddw = w(i+1, j, k, irho)*w(i+1, j, k, ivy) - w(i, j, k, irho&
12127 & )*w(i, j, k, ivy)
12128  drv = dis2*ddw
12129  ddw = w(i+1, j, k, irho)*w(i+1, j, k, ivz) - w(i, j, k, irho&
12130 & )*w(i, j, k, ivz)
12131  drw = dis2*ddw
12132  ddw = w(i+1, j, k, irhoe) - w(i, j, k, irhoe)
12133  dre = dis2*ddw
12134 ! in case a k-equation is present, compute the difference
12135 ! of rhok and store the average value of k. if not present,
12136 ! set both these values to zero, such that later on no
12137 ! decision needs to be made anymore.
12138  if (correctfork) then
12139  ddw = w(i+1, j, k, irho)*w(i+1, j, k, itu1) - w(i, j, k, &
12140 & irho)*w(i, j, k, itu1)
12141  drk = dis2*ddw
12142  kavg = half*(w(i, j, k, itu1)+w(i+1, j, k, itu1))
12143  else
12144  drk = zero
12145  kavg = zero
12146  end if
12147 ! compute the average value of gamma and compute some
12148 ! expressions in which it occurs.
12149  gammaavg = half*(gamma(i+1, j, k)+gamma(i, j, k))
12150  gm1 = gammaavg - one
12151  ovgm1 = one/gm1
12152  gm53 = gammaavg - five*third
12153 ! compute the average state at the interface.
12154  uavg = half*(w(i+1, j, k, ivx)+w(i, j, k, ivx))
12155  vavg = half*(w(i+1, j, k, ivy)+w(i, j, k, ivy))
12156  wavg = half*(w(i+1, j, k, ivz)+w(i, j, k, ivz))
12157  a2avg = half*(gamma(i+1, j, k)*p(i+1, j, k)/w(i+1, j, k, &
12158 & irho)+gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
12159  sx = si(i, j, k, 1)
12160  sy = si(i, j, k, 2)
12161  sz = si(i, j, k, 3)
12162  arg1 = sx**2 + sy**2 + sz**2
12163  area = sqrt(arg1)
12164  if (1.e-25_realtype .lt. area) then
12165  max1 = area
12166  else
12167  max1 = 1.e-25_realtype
12168  end if
12169  tmp = one/max1
12170  sx = sx*tmp
12171  sy = sy*tmp
12172  sz = sz*tmp
12173  alphaavg = half*(uavg**2+vavg**2+wavg**2)
12174  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
12175  aavg = sqrt(a2avg)
12176  unavg = uavg*sx + vavg*sy + wavg*sz
12177  ovaavg = one/aavg
12178  ova2avg = one/a2avg
12179 ! the mesh velocity if the face is moving. it must be
12180 ! divided by the area to obtain a true velocity.
12181  if (addgridvelocities) sface = sfacei(i, j, k)*tmp
12182  if (unavg - sface + aavg .ge. 0.) then
12183  lam1 = unavg - sface + aavg
12184  else
12185  lam1 = -(unavg-sface+aavg)
12186  end if
12187  if (unavg - sface - aavg .ge. 0.) then
12188  lam2 = unavg - sface - aavg
12189  else
12190  lam2 = -(unavg-sface-aavg)
12191  end if
12192  if (unavg - sface .ge. 0.) then
12193  lam3 = unavg - sface
12194  else
12195  lam3 = -(unavg-sface)
12196  end if
12197  rrad = lam3 + aavg
12198  if (lam1 .lt. epsacoustic*rrad) then
12199  lam1 = epsacoustic*rrad
12200  else
12201  lam1 = lam1
12202  end if
12203  if (lam2 .lt. epsacoustic*rrad) then
12204  lam2 = epsacoustic*rrad
12205  else
12206  lam2 = lam2
12207  end if
12208  if (lam3 .lt. epsshear*rrad) then
12209  lam3 = epsshear*rrad
12210  else
12211  lam3 = lam3
12212  end if
12213 ! multiply the eigenvalues by the area to obtain
12214 ! the correct values for the dissipation term.
12215  lam1 = lam1*area
12216  lam2 = lam2*area
12217  lam3 = lam3*area
12218 ! some abbreviations, which occur quite often in the
12219 ! dissipation terms.
12220  abv1 = half*(lam1+lam2)
12221  abv2 = half*(lam1-lam2)
12222  abv3 = abv1 - lam3
12223  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
12224 & gm53*drk
12225  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
12226  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
12227  abv7 = abv2*abv4*ovaavg + abv3*abv5
12228 ! compute and scatter the dissipative flux.
12229 ! density.
12230  fs = lam3*dr + abv6
12231  fw(i+1, j, k, irho) = fw(i+1, j, k, irho) + fs
12232  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
12233 ! x-momentum.
12234  fs = lam3*dru + uavg*abv6 + sx*abv7
12235  fw(i+1, j, k, imx) = fw(i+1, j, k, imx) + fs
12236  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
12237 ! y-momentum.
12238  fs = lam3*drv + vavg*abv6 + sy*abv7
12239  fw(i+1, j, k, imy) = fw(i+1, j, k, imy) + fs
12240  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
12241 ! z-momentum.
12242  fs = lam3*drw + wavg*abv6 + sz*abv7
12243  fw(i+1, j, k, imz) = fw(i+1, j, k, imz) + fs
12244  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
12245 ! energy.
12246  fs = lam3*dre + havg*abv6 + unavg*abv7
12247  fw(i+1, j, k, irhoe) = fw(i+1, j, k, irhoe) + fs
12248  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
12249 ! set dp1 to dp2 for the next face.
12250  dp1 = dp2
12251  end do
12252  end do
12253  end do
12254 !
12255 ! dissipative fluxes in the j-direction.
12256 !
12257  do k=2,kl
12258  do i=2,il
12259  if (shocksensor(i, 2, k) - shocksensor(i, 1, k) .ge. 0.) then
12260  abs3 = shocksensor(i, 2, k) - shocksensor(i, 1, k)
12261  else
12262  abs3 = -(shocksensor(i, 2, k)-shocksensor(i, 1, k))
12263  end if
12264  if (shocksensor(i, 1, k) - shocksensor(i, 0, k) .ge. 0.) then
12265  abs9 = shocksensor(i, 1, k) - shocksensor(i, 0, k)
12266  else
12267  abs9 = -(shocksensor(i, 1, k)-shocksensor(i, 0, k))
12268  end if
12269  x3 = (shocksensor(i, 2, k)-two*shocksensor(i, 1, k)+&
12270 & shocksensor(i, 0, k))/(omega*(shocksensor(i, 2, k)+two*&
12271 & shocksensor(i, 1, k)+shocksensor(i, 0, k))+oneminomega*(abs3&
12272 & +abs9)+plim)
12273  if (x3 .ge. 0.) then
12274  dp1 = x3
12275  else
12276  dp1 = -x3
12277  end if
12278 ! loop in j-direction.
12279  do j=1,jl
12280  if (shocksensor(i, j+2, k) - shocksensor(i, j+1, k) .ge. 0.&
12281 & ) then
12282  abs4 = shocksensor(i, j+2, k) - shocksensor(i, j+1, k)
12283  else
12284  abs4 = -(shocksensor(i, j+2, k)-shocksensor(i, j+1, k))
12285  end if
12286  if (shocksensor(i, j+1, k) - shocksensor(i, j, k) .ge. 0.) &
12287 & then
12288  abs10 = shocksensor(i, j+1, k) - shocksensor(i, j, k)
12289  else
12290  abs10 = -(shocksensor(i, j+1, k)-shocksensor(i, j, k))
12291  end if
12292  x4 = (shocksensor(i, j+2, k)-two*shocksensor(i, j+1, k)+&
12293 & shocksensor(i, j, k))/(omega*(shocksensor(i, j+2, k)+two*&
12294 & shocksensor(i, j+1, k)+shocksensor(i, j, k))+oneminomega*(&
12295 & abs4+abs10)+plim)
12296  if (x4 .ge. 0.) then
12297  dp2 = x4
12298  else
12299  dp2 = -x4
12300  end if
12301 ! compute the dissipation coefficients for this face.
12302  ppor = zero
12303  if (porj(i, j, k) .eq. normalflux) ppor = one
12304  if (dp1 .lt. dp2) then
12305  y2 = dp2
12306  else
12307  y2 = dp1
12308  end if
12309  if (dpmax .gt. y2) then
12310  min2 = y2
12311  else
12312  min2 = dpmax
12313  end if
12314  dis2 = fis2*ppor*min2 + sigma*fis4*ppor
12315 ! construct the vector of the first and third differences
12316 ! multiplied by the appropriate constants.
12317  ddw = w(i, j+1, k, irho) - w(i, j, k, irho)
12318  dr = dis2*ddw
12319  ddw = w(i, j+1, k, irho)*w(i, j+1, k, ivx) - w(i, j, k, irho&
12320 & )*w(i, j, k, ivx)
12321  dru = dis2*ddw
12322  ddw = w(i, j+1, k, irho)*w(i, j+1, k, ivy) - w(i, j, k, irho&
12323 & )*w(i, j, k, ivy)
12324  drv = dis2*ddw
12325  ddw = w(i, j+1, k, irho)*w(i, j+1, k, ivz) - w(i, j, k, irho&
12326 & )*w(i, j, k, ivz)
12327  drw = dis2*ddw
12328  ddw = w(i, j+1, k, irhoe) - w(i, j, k, irhoe)
12329  dre = dis2*ddw
12330 ! in case a k-equation is present, compute the difference
12331 ! of rhok and store the average value of k. if not present,
12332 ! set both these values to zero, such that later on no
12333 ! decision needs to be made anymore.
12334  if (correctfork) then
12335  ddw = w(i, j+1, k, irho)*w(i, j+1, k, itu1) - w(i, j, k, &
12336 & irho)*w(i, j, k, itu1)
12337  drk = dis2*ddw
12338  kavg = half*(w(i, j, k, itu1)+w(i, j+1, k, itu1))
12339  else
12340  drk = zero
12341  kavg = zero
12342  end if
12343 ! compute the average value of gamma and compute some
12344 ! expressions in which it occurs.
12345  gammaavg = half*(gamma(i, j+1, k)+gamma(i, j, k))
12346  gm1 = gammaavg - one
12347  ovgm1 = one/gm1
12348  gm53 = gammaavg - five*third
12349 ! compute the average state at the interface.
12350  uavg = half*(w(i, j+1, k, ivx)+w(i, j, k, ivx))
12351  vavg = half*(w(i, j+1, k, ivy)+w(i, j, k, ivy))
12352  wavg = half*(w(i, j+1, k, ivz)+w(i, j, k, ivz))
12353  a2avg = half*(gamma(i, j+1, k)*p(i, j+1, k)/w(i, j+1, k, &
12354 & irho)+gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
12355  sx = sj(i, j, k, 1)
12356  sy = sj(i, j, k, 2)
12357  sz = sj(i, j, k, 3)
12358  arg1 = sx**2 + sy**2 + sz**2
12359  area = sqrt(arg1)
12360  if (1.e-25_realtype .lt. area) then
12361  max2 = area
12362  else
12363  max2 = 1.e-25_realtype
12364  end if
12365  tmp = one/max2
12366  sx = sx*tmp
12367  sy = sy*tmp
12368  sz = sz*tmp
12369  alphaavg = half*(uavg**2+vavg**2+wavg**2)
12370  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
12371  aavg = sqrt(a2avg)
12372  unavg = uavg*sx + vavg*sy + wavg*sz
12373  ovaavg = one/aavg
12374  ova2avg = one/a2avg
12375 ! the mesh velocity if the face is moving. it must be
12376 ! divided by the area to obtain a true velocity.
12377  if (addgridvelocities) sface = sfacej(i, j, k)*tmp
12378  if (unavg - sface + aavg .ge. 0.) then
12379  lam1 = unavg - sface + aavg
12380  else
12381  lam1 = -(unavg-sface+aavg)
12382  end if
12383  if (unavg - sface - aavg .ge. 0.) then
12384  lam2 = unavg - sface - aavg
12385  else
12386  lam2 = -(unavg-sface-aavg)
12387  end if
12388  if (unavg - sface .ge. 0.) then
12389  lam3 = unavg - sface
12390  else
12391  lam3 = -(unavg-sface)
12392  end if
12393  rrad = lam3 + aavg
12394  if (lam1 .lt. epsacoustic*rrad) then
12395  lam1 = epsacoustic*rrad
12396  else
12397  lam1 = lam1
12398  end if
12399  if (lam2 .lt. epsacoustic*rrad) then
12400  lam2 = epsacoustic*rrad
12401  else
12402  lam2 = lam2
12403  end if
12404  if (lam3 .lt. epsshear*rrad) then
12405  lam3 = epsshear*rrad
12406  else
12407  lam3 = lam3
12408  end if
12409 ! multiply the eigenvalues by the area to obtain
12410 ! the correct values for the dissipation term.
12411  lam1 = lam1*area
12412  lam2 = lam2*area
12413  lam3 = lam3*area
12414 ! some abbreviations, which occur quite often in the
12415 ! dissipation terms.
12416  abv1 = half*(lam1+lam2)
12417  abv2 = half*(lam1-lam2)
12418  abv3 = abv1 - lam3
12419  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
12420 & gm53*drk
12421  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
12422  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
12423  abv7 = abv2*abv4*ovaavg + abv3*abv5
12424 ! compute and scatter the dissipative flux.
12425 ! density.
12426  fs = lam3*dr + abv6
12427  fw(i, j+1, k, irho) = fw(i, j+1, k, irho) + fs
12428  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
12429 ! x-momentum.
12430  fs = lam3*dru + uavg*abv6 + sx*abv7
12431  fw(i, j+1, k, imx) = fw(i, j+1, k, imx) + fs
12432  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
12433 ! y-momentum.
12434  fs = lam3*drv + vavg*abv6 + sy*abv7
12435  fw(i, j+1, k, imy) = fw(i, j+1, k, imy) + fs
12436  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
12437 ! z-momentum.
12438  fs = lam3*drw + wavg*abv6 + sz*abv7
12439  fw(i, j+1, k, imz) = fw(i, j+1, k, imz) + fs
12440  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
12441 ! energy.
12442  fs = lam3*dre + havg*abv6 + unavg*abv7
12443  fw(i, j+1, k, irhoe) = fw(i, j+1, k, irhoe) + fs
12444  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
12445 ! set dp1 to dp2 for the next face.
12446  dp1 = dp2
12447  end do
12448  end do
12449  end do
12450 !
12451 ! dissipative fluxes in the k-direction.
12452 !
12453  do j=2,jl
12454  do i=2,il
12455  if (shocksensor(i, j, 2) - shocksensor(i, j, 1) .ge. 0.) then
12456  abs5 = shocksensor(i, j, 2) - shocksensor(i, j, 1)
12457  else
12458  abs5 = -(shocksensor(i, j, 2)-shocksensor(i, j, 1))
12459  end if
12460  if (shocksensor(i, j, 1) - shocksensor(i, j, 0) .ge. 0.) then
12461  abs11 = shocksensor(i, j, 1) - shocksensor(i, j, 0)
12462  else
12463  abs11 = -(shocksensor(i, j, 1)-shocksensor(i, j, 0))
12464  end if
12465  x5 = (shocksensor(i, j, 2)-two*shocksensor(i, j, 1)+&
12466 & shocksensor(i, j, 0))/(omega*(shocksensor(i, j, 2)+two*&
12467 & shocksensor(i, j, 1)+shocksensor(i, j, 0))+oneminomega*(abs5&
12468 & +abs11)+plim)
12469  if (x5 .ge. 0.) then
12470  dp1 = x5
12471  else
12472  dp1 = -x5
12473  end if
12474 ! loop in k-direction.
12475  do k=1,kl
12476  if (shocksensor(i, j, k+2) - shocksensor(i, j, k+1) .ge. 0.&
12477 & ) then
12478  abs6 = shocksensor(i, j, k+2) - shocksensor(i, j, k+1)
12479  else
12480  abs6 = -(shocksensor(i, j, k+2)-shocksensor(i, j, k+1))
12481  end if
12482  if (shocksensor(i, j, k+1) - shocksensor(i, j, k) .ge. 0.) &
12483 & then
12484  abs12 = shocksensor(i, j, k+1) - shocksensor(i, j, k)
12485  else
12486  abs12 = -(shocksensor(i, j, k+1)-shocksensor(i, j, k))
12487  end if
12488  x6 = (shocksensor(i, j, k+2)-two*shocksensor(i, j, k+1)+&
12489 & shocksensor(i, j, k))/(omega*(shocksensor(i, j, k+2)+two*&
12490 & shocksensor(i, j, k+1)+shocksensor(i, j, k))+oneminomega*(&
12491 & abs6+abs12)+plim)
12492  if (x6 .ge. 0.) then
12493  dp2 = x6
12494  else
12495  dp2 = -x6
12496  end if
12497 ! compute the dissipation coefficients for this face.
12498  ppor = zero
12499  if (pork(i, j, k) .eq. normalflux) ppor = one
12500  if (dp1 .lt. dp2) then
12501  y3 = dp2
12502  else
12503  y3 = dp1
12504  end if
12505  if (dpmax .gt. y3) then
12506  min3 = y3
12507  else
12508  min3 = dpmax
12509  end if
12510  dis2 = fis2*ppor*min3 + sigma*fis4*ppor
12511 ! construct the vector of the first and third differences
12512 ! multiplied by the appropriate constants.
12513  ddw = w(i, j, k+1, irho) - w(i, j, k, irho)
12514  dr = dis2*ddw
12515  ddw = w(i, j, k+1, irho)*w(i, j, k+1, ivx) - w(i, j, k, irho&
12516 & )*w(i, j, k, ivx)
12517  dru = dis2*ddw
12518  ddw = w(i, j, k+1, irho)*w(i, j, k+1, ivy) - w(i, j, k, irho&
12519 & )*w(i, j, k, ivy)
12520  drv = dis2*ddw
12521  ddw = w(i, j, k+1, irho)*w(i, j, k+1, ivz) - w(i, j, k, irho&
12522 & )*w(i, j, k, ivz)
12523  drw = dis2*ddw
12524  ddw = w(i, j, k+1, irhoe) - w(i, j, k, irhoe)
12525  dre = dis2*ddw
12526 ! in case a k-equation is present, compute the difference
12527 ! of rhok and store the average value of k. if not present,
12528 ! set both these values to zero, such that later on no
12529 ! decision needs to be made anymore.
12530  if (correctfork) then
12531  ddw = w(i, j, k+1, irho)*w(i, j, k+1, itu1) - w(i, j, k, &
12532 & irho)*w(i, j, k, itu1)
12533  drk = dis2*ddw
12534  kavg = half*(w(i, j, k+1, itu1)+w(i, j, k, itu1))
12535  else
12536  drk = zero
12537  kavg = zero
12538  end if
12539 ! compute the average value of gamma and compute some
12540 ! expressions in which it occurs.
12541  gammaavg = half*(gamma(i, j, k+1)+gamma(i, j, k))
12542  gm1 = gammaavg - one
12543  ovgm1 = one/gm1
12544  gm53 = gammaavg - five*third
12545 ! compute the average state at the interface.
12546  uavg = half*(w(i, j, k+1, ivx)+w(i, j, k, ivx))
12547  vavg = half*(w(i, j, k+1, ivy)+w(i, j, k, ivy))
12548  wavg = half*(w(i, j, k+1, ivz)+w(i, j, k, ivz))
12549  a2avg = half*(gamma(i, j, k+1)*p(i, j, k+1)/w(i, j, k+1, &
12550 & irho)+gamma(i, j, k)*p(i, j, k)/w(i, j, k, irho))
12551  sx = sk(i, j, k, 1)
12552  sy = sk(i, j, k, 2)
12553  sz = sk(i, j, k, 3)
12554  arg1 = sx**2 + sy**2 + sz**2
12555  area = sqrt(arg1)
12556  if (1.e-25_realtype .lt. area) then
12557  max3 = area
12558  else
12559  max3 = 1.e-25_realtype
12560  end if
12561  tmp = one/max3
12562  sx = sx*tmp
12563  sy = sy*tmp
12564  sz = sz*tmp
12565  alphaavg = half*(uavg**2+vavg**2+wavg**2)
12566  havg = alphaavg + ovgm1*(a2avg-gm53*kavg)
12567  aavg = sqrt(a2avg)
12568  unavg = uavg*sx + vavg*sy + wavg*sz
12569  ovaavg = one/aavg
12570  ova2avg = one/a2avg
12571 ! the mesh velocity if the face is moving. it must be
12572 ! divided by the area to obtain a true velocity.
12573  if (addgridvelocities) sface = sfacek(i, j, k)*tmp
12574  if (unavg - sface + aavg .ge. 0.) then
12575  lam1 = unavg - sface + aavg
12576  else
12577  lam1 = -(unavg-sface+aavg)
12578  end if
12579  if (unavg - sface - aavg .ge. 0.) then
12580  lam2 = unavg - sface - aavg
12581  else
12582  lam2 = -(unavg-sface-aavg)
12583  end if
12584  if (unavg - sface .ge. 0.) then
12585  lam3 = unavg - sface
12586  else
12587  lam3 = -(unavg-sface)
12588  end if
12589  rrad = lam3 + aavg
12590  if (lam1 .lt. epsacoustic*rrad) then
12591  lam1 = epsacoustic*rrad
12592  else
12593  lam1 = lam1
12594  end if
12595  if (lam2 .lt. epsacoustic*rrad) then
12596  lam2 = epsacoustic*rrad
12597  else
12598  lam2 = lam2
12599  end if
12600  if (lam3 .lt. epsshear*rrad) then
12601  lam3 = epsshear*rrad
12602  else
12603  lam3 = lam3
12604  end if
12605 ! multiply the eigenvalues by the area to obtain
12606 ! the correct values for the dissipation term.
12607  lam1 = lam1*area
12608  lam2 = lam2*area
12609  lam3 = lam3*area
12610 ! some abbreviations, which occur quite often in the
12611 ! dissipation terms.
12612  abv1 = half*(lam1+lam2)
12613  abv2 = half*(lam1-lam2)
12614  abv3 = abv1 - lam3
12615  abv4 = gm1*(alphaavg*dr-uavg*dru-vavg*drv-wavg*drw+dre) - &
12616 & gm53*drk
12617  abv5 = sx*dru + sy*drv + sz*drw - unavg*dr
12618  abv6 = abv3*abv4*ova2avg + abv2*abv5*ovaavg
12619  abv7 = abv2*abv4*ovaavg + abv3*abv5
12620 ! compute and scatter the dissipative flux.
12621 ! density.
12622  fs = lam3*dr + abv6
12623  fw(i, j, k+1, irho) = fw(i, j, k+1, irho) + fs
12624  fw(i, j, k, irho) = fw(i, j, k, irho) - fs
12625 ! x-momentum.
12626  fs = lam3*dru + uavg*abv6 + sx*abv7
12627  fw(i, j, k+1, imx) = fw(i, j, k+1, imx) + fs
12628  fw(i, j, k, imx) = fw(i, j, k, imx) - fs
12629 ! y-momentum.
12630  fs = lam3*drv + vavg*abv6 + sy*abv7
12631  fw(i, j, k+1, imy) = fw(i, j, k+1, imy) + fs
12632  fw(i, j, k, imy) = fw(i, j, k, imy) - fs
12633 ! z-momentum.
12634  fs = lam3*drw + wavg*abv6 + sz*abv7
12635  fw(i, j, k+1, imz) = fw(i, j, k+1, imz) + fs
12636  fw(i, j, k, imz) = fw(i, j, k, imz) - fs
12637 ! energy.
12638  fs = lam3*dre + havg*abv6 + unavg*abv7
12639  fw(i, j, k+1, irhoe) = fw(i, j, k+1, irhoe) + fs
12640  fw(i, j, k, irhoe) = fw(i, j, k, irhoe) - fs
12641 ! set dp1 to dp2 for the next face.
12642  dp1 = dp2
12643  end do
12644  end do
12645  end do
12646  end if
12647  end subroutine invisciddissfluxmatrixapprox
12648 ! ----------------------------------------------------------------------
12649 ! |
12650 ! no tapenade routine below this line |
12651 ! |
12652 ! ----------------------------------------------------------------------
12653 
12654 end module fluxes_d
12655 
subroutine riemannflux_d(left, leftd, right, rightd, flux, fluxd)
Definition: fluxes_d.f90:4979
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_d(du1, du1d, du2, du2d, du3, du3d, rotmatrix, left, leftd, right, rightd)
Definition: fluxes_d.f90:4301
real(kind=realtype), dimension(:, :, :), pointer sfacek
integer(kind=inttype), dimension(:, :), pointer viscjminpointer
real(kind=realtype), dimension(:, :, :), pointer gamma
real(kind=realtype), dimension(:, :, :), pointer qz
real(kind=realtype), dimension(:, :, :, :), pointer fwd
real(kind=realtype), dimension(:, :, :), pointer radid
logical addgridvelocities
integer(kind=inttype) jl
real(kind=realtype), dimension(:, :, :), pointer wzd
real(kind=realtype), dimension(:, :, :), pointer aad
real(kind=realtype), dimension(:, :, :), pointer radk
integer(kind=portype), dimension(:, :, :), pointer pork
integer(kind=inttype), dimension(:, :, :), pointer indfamilyj
integer(kind=inttype), dimension(:, :), pointer viscjmaxpointer
real(kind=realtype), dimension(:, :, :, :), pointer sjd
real(kind=realtype), dimension(:, :, :), pointer vxd
real(kind=realtype), dimension(:, :, :), pointer qy
real(kind=realtype), dimension(:, :, :), pointer aa
real(kind=realtype), dimension(:, :, :), pointer uz
real(kind=realtype), dimension(:, :, :, :), pointer wd
real(kind=realtype), dimension(:, :, :), pointer uzd
integer(kind=inttype), dimension(:, :, :), pointer factfamilyj
real(kind=realtype), dimension(:, :, :), pointer vold
logical blockismoving
real(kind=realtype), dimension(:, :, :), pointer qxd
integer(kind=inttype) nx
integer(kind=inttype) spectralsol
real(kind=realtype), dimension(:, :, :), pointer p
real(kind=realtype), dimension(:, :, :), pointer radj
integer(kind=inttype) ny
integer(kind=inttype) ie
real(kind=realtype), dimension(:, :, :, :), pointer w
real(kind=realtype), dimension(:, :, :), pointer uy
integer(kind=inttype), dimension(:, :, :), pointer indfamilyk
real(kind=realtype), dimension(:, :, :), pointer sfacei
type(viscsubfacetype), dimension(:), pointer viscsubface
integer(kind=portype), dimension(:, :, :), pointer porj
real(kind=realtype), dimension(:, :, :), pointer wyd
real(kind=realtype), dimension(:, :, :), pointer revd
integer(kind=portype), dimension(:, :, :), pointer pori
real(kind=realtype), dimension(:, :, :), pointer wx
real(kind=realtype), dimension(:, :, :), pointer radjd
integer(kind=inttype) nbkglobal
integer(kind=inttype), dimension(:, :), pointer viscimaxpointer
real(kind=realtype), dimension(:, :, :, :), pointer skd
integer(kind=inttype) jb
real(kind=realtype), dimension(:, :, :), pointer sfacejd
integer(kind=inttype) kb
real(kind=realtype), dimension(:, :, :), pointer rlv
real(kind=realtype), dimension(:, :, :, :), pointer si
real(kind=realtype), dimension(:, :, :, :), pointer sid
real(kind=realtype), dimension(:, :, :), pointer radkd
real(kind=realtype), dimension(:, :, :, :), pointer sj
integer(kind=inttype), dimension(:, :), pointer visckminpointer
integer(kind=inttype), dimension(:, :, :), pointer factfamilyi
real(kind=realtype), dimension(:, :, :), pointer uyd
real(kind=realtype), dimension(:, :, :), pointer qx
integer(kind=inttype), dimension(:, :, :), pointer factfamilyk
real(kind=realtype), dimension(:, :, :), pointer uxd
real(kind=realtype), dimension(:, :, :), pointer vz
real(kind=realtype), dimension(:, :, :, :, :), pointer rotmatrixj
real(kind=realtype), dimension(:, :, :), pointer rev
real(kind=realtype), dimension(:, :, :), pointer qyd
real(kind=realtype), dimension(:, :, :, :), pointer dw
real(kind=realtype), dimension(:, :, :, :), pointer sk
real(kind=realtype), dimension(:, :, :), pointer ux
real(kind=realtype), dimension(:, :, :), pointer shocksensor
type(viscsubfacetype), dimension(:), pointer viscsubfaced
real(kind=realtype), dimension(:, :, :), pointer wy
real(kind=realtype), dimension(:, :, :), pointer rlvd
real(kind=realtype), dimension(:, :, :), pointer wz
real(kind=realtype), dimension(:, :, :), pointer vol
real(kind=realtype), dimension(:, :, :), pointer wxd
integer(kind=inttype) ib
real(kind=realtype), dimension(:, :, :, :), pointer xd
real(kind=realtype), dimension(:, :, :), pointer sfacej
real(kind=realtype), dimension(:, :, :), pointer vy
real(kind=realtype), dimension(:, :, :, :), pointer fw
integer(kind=inttype) nz
real(kind=realtype), dimension(:, :, :), pointer vx
integer(kind=inttype) je
real(kind=realtype), dimension(:, :, :), pointer radi
real(kind=realtype), dimension(:, :, :), pointer sfacekd
integer(kind=inttype) ke
integer(kind=inttype), dimension(:, :, :), pointer indfamilyi
real(kind=realtype), dimension(:, :, :, :), pointer x
integer(kind=inttype), dimension(:, :), pointer visckmaxpointer
real(kind=realtype), dimension(:, :, :), pointer qzd
real(kind=realtype), dimension(:, :, :), pointer sfaceid
integer(kind=inttype), dimension(:, :), pointer visciminpointer
real(kind=realtype), dimension(:, :, :), pointer vzd
real(kind=realtype), dimension(:, :, :), pointer pd
real(kind=realtype), dimension(:, :, :), pointer vyd
real(kind=realtype), dimension(:, :, :, :, :), pointer rotmatrixi
real(kind=realtype), dimension(:, :, :, :), pointer dwd
integer(kind=inttype) kl
integer(kind=inttype) il
real(kind=realtype), dimension(:, :, :, :, :), pointer rotmatrixk
type(cgnsblockinfotype), dimension(:), allocatable cgnsdoms
Definition: cgnsGrid.F90:495
real(kind=realtype), dimension(:, :), allocatable massflowfamilydiss
Definition: cgnsGrid.F90:547
real(kind=realtype), dimension(:, :), allocatable massflowfamilyinv
Definition: cgnsGrid.F90:546
integer(kind=inttype), parameter roe
Definition: constants.F90:155
integer(kind=inttype), parameter vanleer
Definition: constants.F90:155
integer(kind=inttype), parameter firstorder
Definition: constants.F90:142
real(kind=realtype), parameter zero
Definition: constants.F90:71
real(kind=realtype), parameter three
Definition: constants.F90:74
real(kind=realtype), parameter third
Definition: constants.F90:81
real(kind=realtype), parameter thresholdreal
Definition: constants.F90:101
integer(kind=inttype), parameter ausmdv
Definition: constants.F90:155
real(kind=realtype), parameter eighth
Definition: constants.F90:84
integer(kind=inttype), parameter turkel
Definition: constants.F90:165
integer, parameter itu1
Definition: constants.F90:40
integer, parameter irho
Definition: constants.F90:34
integer, parameter imx
Definition: constants.F90:65
integer(kind=inttype), parameter choimerkle
Definition: constants.F90:165
integer(kind=inttype), parameter vanalbeda
Definition: constants.F90:160
integer(kind=portype), parameter boundflux
Definition: constants.F90:29
integer(kind=portype), parameter noflux
Definition: constants.F90:28
integer(kind=inttype), parameter eulerequations
Definition: constants.F90:110
integer, parameter ivx
Definition: constants.F90:35
integer(kind=portype), parameter normalflux
Definition: constants.F90:30
integer, parameter irhoe
Definition: constants.F90:38
real(kind=realtype), parameter five
Definition: constants.F90:76
integer(kind=inttype), parameter noprecond
Definition: constants.F90:165
real(kind=realtype), parameter one
Definition: constants.F90:72
real(kind=realtype), parameter half
Definition: constants.F90:80
integer(kind=inttype), parameter steady
Definition: constants.F90:115
integer, parameter ivz
Definition: constants.F90:37
real(kind=realtype), parameter two
Definition: constants.F90:73
integer(kind=inttype), parameter minmod
Definition: constants.F90:160
real(kind=realtype), parameter fourth
Definition: constants.F90:82
integer, parameter imz
Definition: constants.F90:67
integer(kind=inttype), parameter nolimiter
Definition: constants.F90:160
integer, parameter imy
Definition: constants.F90:66
integer(kind=inttype), parameter nsequations
Definition: constants.F90:110
integer, parameter ivy
Definition: constants.F90:36
integer(kind=inttype), parameter ransequations
Definition: constants.F90:110
subroutine etot(rho, u, v, w, p, k, etotal, correctfork)
subroutine etot_d(rho, rhod, u, ud, v, vd, w, wd, p, pd, k, kd, etotal, etotald, correctfork)
real(kind=realtype) gammainf
real(kind=realtype) rhoinfd
real(kind=realtype) pinfcorr
real(kind=realtype) pinfcorrd
real(kind=realtype) rgas
real(kind=realtype) trefd
real(kind=realtype) rgasd
integer(kind=inttype) nwf
real(kind=realtype) tref
integer(kind=inttype) nw
real(kind=realtype) rhoinf
real(kind=realtype) timeref
real(kind=realtype) timerefd
subroutine viscousfluxapprox_d()
Definition: fluxes_d.f90:8699
subroutine viscousfluxapprox()
Definition: fluxes_d.f90:9264
subroutine inviscidcentralflux()
Definition: fluxes_d.f90:482
subroutine viscousflux()
Definition: fluxes_d.f90:7935
subroutine invisciddissfluxmatrixapprox_d()
Definition: fluxes_d.f90:10805
subroutine invisciddissfluxscalar()
Definition: fluxes_d.f90:3185
subroutine viscousflux_d()
Definition: fluxes_d.f90:6583
subroutine invisciddissfluxmatrix()
Definition: fluxes_d.f90:1950
subroutine invisciddissfluxscalarapprox_d()
Definition: fluxes_d.f90:9566
subroutine invisciddissfluxmatrixapprox()
Definition: fluxes_d.f90:11947
subroutine invisciddissfluxscalarapprox()
Definition: fluxes_d.f90:10353
subroutine inviscidupwindflux_d(finegrid)
Definition: fluxes_d.f90:3520
subroutine inviscidupwindflux(finegrid)
Definition: fluxes_d.f90:5580
subroutine invisciddissfluxscalar_d()
Definition: fluxes_d.f90:2602
subroutine invisciddissfluxmatrix_d()
Definition: fluxes_d.f90:764
subroutine inviscidcentralflux_d()
Definition: fluxes_d.f90:18
real(kind=realtype) vis2
Definition: inputParam.F90:78
real(kind=realtype) sigma
Definition: inputParam.F90:83
integer(kind=inttype) orderturb
Definition: inputParam.F90:73
integer(kind=inttype) riemanncoarse
Definition: inputParam.F90:74
real(kind=realtype) vis4
Definition: inputParam.F90:78
real(kind=realtype) kappacoef
Definition: inputParam.F90:80
integer(kind=inttype) riemann
Definition: inputParam.F90:74
integer(kind=inttype) limiter
Definition: inputParam.F90:73
integer(kind=inttype) precond
Definition: inputParam.F90:74
real(kind=realtype) disscontmidpoint
Definition: inputParam.F90:297
logical usedisscontinuation
Definition: inputParam.F90:296
real(kind=realtype) disscontmagnitude
Definition: inputParam.F90:297
real(kind=realtype) disscontsharpness
Definition: inputParam.F90:297
integer(kind=inttype) equations
Definition: inputParam.F90:583
integer(kind=inttype) equationmode
Definition: inputParam.F90:583
real(kind=realtype) prandtlturb
Definition: inputParam.F90:596
logical useqcr
Definition: inputParam.F90:587
logical wallfunctions
Definition: inputParam.F90:589
real(kind=realtype) prandtl
Definition: inputParam.F90:596
real(kind=realtype) totalr0
Definition: iteration.f90:126
integer(kind=inttype) currentlevel
Definition: iteration.f90:18
real(kind=realtype) totalr
Definition: iteration.f90:126
integer(kind=inttype) groundlevel
Definition: iteration.f90:18
integer(kind=inttype) rkstage
Definition: iteration.f90:19
real(kind=realtype) rfil
Definition: iteration.f90:36
real(kind=realtype) function mydim_d(x, xd, y, yd, mydim)
Definition: utils_d.f90:464
real(kind=realtype) function mydim(x, y)
Definition: utils_d.f90:478
logical function getcorrectfork()
Definition: utils_d.f90:487
subroutine terminate(routinename, errormessage)
Definition: utils_d.f90:500