ADflow  v1.0
ADflow is a finite volume RANS solver tailored for gradient-based aerodynamic design optimization.
adjointExtra_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 !
5  implicit none
6 
7 contains
8 ! differentiation of volume_block in forward (tangent) mode (with options i4 dr8 r8):
9 ! variations of useful results: *vol
10 ! with respect to varying inputs: *x
11 ! rw status of diff variables: *x:in *vol:out
12 ! plus diff mem management of: x:in vol:in
13  subroutine volume_block_d()
14 ! this is copy of metric.f90. it was necessary to copy this file
15 ! since there is debugging stuff in the original that is not
16 ! necessary for ad.
17  use constants
18  use blockpointers
19  use cgnsgrid
20  use communication
22  implicit none
23 !
24 ! local parameter.
25 !
26  real(kind=realtype), parameter :: thresvolume=1.e-2_realtype
27  real(kind=realtype), parameter :: halocellratio=1e-10_realtype
28 !
29 ! local variables.
30 !
31  integer(kind=inttype) :: i, j, k, n, m, l, ii
32  integer(kind=inttype) :: mm
33  real(kind=realtype) :: fact, mult
34  real(kind=realtype) :: xp, yp, zp, vp1, vp2, vp3, vp4, vp5, vp6
35  real(kind=realtype) :: xpd, ypd, zpd, vp1d, vp2d, vp3d, vp4d, vp5d, &
36 & vp6d
37  real(kind=realtype) :: xxp, yyp, zzp
38  real(kind=realtype), dimension(3) :: v1, v2
39  intrinsic abs
40 ! compute the volumes. the hexahedron is split into 6 pyramids
41 ! whose volumes are computed. the volume is positive for a
42 ! right handed block.
43 ! initialize the volumes to zero. the reasons is that the second
44 ! level halo's must be initialized to zero and for convenience
45 ! all the volumes are set to zero.
46  vold = 0.0_8
47  vol = zero
48  if (associated(vold)) vold = 0.0_8
49  vp1d = 0.0_8
50  vp2d = 0.0_8
51  vp3d = 0.0_8
52  vp4d = 0.0_8
53  vp5d = 0.0_8
54  vp6d = 0.0_8
55  do k=1,ke
56  n = k - 1
57  do j=1,je
58  m = j - 1
59  do i=1,ie
60  l = i - 1
61 ! compute the coordinates of the center of gravity.
62  xpd = eighth*(xd(i, j, k, 1)+xd(i, m, k, 1)+xd(i, m, n, 1)+xd(&
63 & i, j, n, 1)+xd(l, j, k, 1)+xd(l, m, k, 1)+xd(l, m, n, 1)+xd(&
64 & l, j, n, 1))
65  xp = eighth*(x(i, j, k, 1)+x(i, m, k, 1)+x(i, m, n, 1)+x(i, j&
66 & , n, 1)+x(l, j, k, 1)+x(l, m, k, 1)+x(l, m, n, 1)+x(l, j, n&
67 & , 1))
68  ypd = eighth*(xd(i, j, k, 2)+xd(i, m, k, 2)+xd(i, m, n, 2)+xd(&
69 & i, j, n, 2)+xd(l, j, k, 2)+xd(l, m, k, 2)+xd(l, m, n, 2)+xd(&
70 & l, j, n, 2))
71  yp = eighth*(x(i, j, k, 2)+x(i, m, k, 2)+x(i, m, n, 2)+x(i, j&
72 & , n, 2)+x(l, j, k, 2)+x(l, m, k, 2)+x(l, m, n, 2)+x(l, j, n&
73 & , 2))
74  zpd = eighth*(xd(i, j, k, 3)+xd(i, m, k, 3)+xd(i, m, n, 3)+xd(&
75 & i, j, n, 3)+xd(l, j, k, 3)+xd(l, m, k, 3)+xd(l, m, n, 3)+xd(&
76 & l, j, n, 3))
77  zp = eighth*(x(i, j, k, 3)+x(i, m, k, 3)+x(i, m, n, 3)+x(i, j&
78 & , n, 3)+x(l, j, k, 3)+x(l, m, k, 3)+x(l, m, n, 3)+x(l, j, n&
79 & , 3))
80 ! compute the volumes of the 6 sub pyramids. the
81 ! arguments of volpym must be such that for a (regular)
82 ! right handed hexahedron all volumes are positive.
83  call volpym_d(x(i, j, k, 1), xd(i, j, k, 1), x(i, j, k, 2), xd&
84 & (i, j, k, 2), x(i, j, k, 3), xd(i, j, k, 3), x(i, j, n&
85 & , 1), xd(i, j, n, 1), x(i, j, n, 2), xd(i, j, n, 2), x&
86 & (i, j, n, 3), xd(i, j, n, 3), x(i, m, n, 1), xd(i, m, &
87 & n, 1), x(i, m, n, 2), xd(i, m, n, 2), x(i, m, n, 3), &
88 & xd(i, m, n, 3), x(i, m, k, 1), xd(i, m, k, 1), x(i, m&
89 & , k, 2), xd(i, m, k, 2), x(i, m, k, 3), xd(i, m, k, 3)&
90 & , vp1, vp1d)
91  call volpym_d(x(l, j, k, 1), xd(l, j, k, 1), x(l, j, k, 2), xd&
92 & (l, j, k, 2), x(l, j, k, 3), xd(l, j, k, 3), x(l, m, k&
93 & , 1), xd(l, m, k, 1), x(l, m, k, 2), xd(l, m, k, 2), x&
94 & (l, m, k, 3), xd(l, m, k, 3), x(l, m, n, 1), xd(l, m, &
95 & n, 1), x(l, m, n, 2), xd(l, m, n, 2), x(l, m, n, 3), &
96 & xd(l, m, n, 3), x(l, j, n, 1), xd(l, j, n, 1), x(l, j&
97 & , n, 2), xd(l, j, n, 2), x(l, j, n, 3), xd(l, j, n, 3)&
98 & , vp2, vp2d)
99  call volpym_d(x(i, j, k, 1), xd(i, j, k, 1), x(i, j, k, 2), xd&
100 & (i, j, k, 2), x(i, j, k, 3), xd(i, j, k, 3), x(l, j, k&
101 & , 1), xd(l, j, k, 1), x(l, j, k, 2), xd(l, j, k, 2), x&
102 & (l, j, k, 3), xd(l, j, k, 3), x(l, j, n, 1), xd(l, j, &
103 & n, 1), x(l, j, n, 2), xd(l, j, n, 2), x(l, j, n, 3), &
104 & xd(l, j, n, 3), x(i, j, n, 1), xd(i, j, n, 1), x(i, j&
105 & , n, 2), xd(i, j, n, 2), x(i, j, n, 3), xd(i, j, n, 3)&
106 & , vp3, vp3d)
107  call volpym_d(x(i, m, k, 1), xd(i, m, k, 1), x(i, m, k, 2), xd&
108 & (i, m, k, 2), x(i, m, k, 3), xd(i, m, k, 3), x(i, m, n&
109 & , 1), xd(i, m, n, 1), x(i, m, n, 2), xd(i, m, n, 2), x&
110 & (i, m, n, 3), xd(i, m, n, 3), x(l, m, n, 1), xd(l, m, &
111 & n, 1), x(l, m, n, 2), xd(l, m, n, 2), x(l, m, n, 3), &
112 & xd(l, m, n, 3), x(l, m, k, 1), xd(l, m, k, 1), x(l, m&
113 & , k, 2), xd(l, m, k, 2), x(l, m, k, 3), xd(l, m, k, 3)&
114 & , vp4, vp4d)
115  call volpym_d(x(i, j, k, 1), xd(i, j, k, 1), x(i, j, k, 2), xd&
116 & (i, j, k, 2), x(i, j, k, 3), xd(i, j, k, 3), x(i, m, k&
117 & , 1), xd(i, m, k, 1), x(i, m, k, 2), xd(i, m, k, 2), x&
118 & (i, m, k, 3), xd(i, m, k, 3), x(l, m, k, 1), xd(l, m, &
119 & k, 1), x(l, m, k, 2), xd(l, m, k, 2), x(l, m, k, 3), &
120 & xd(l, m, k, 3), x(l, j, k, 1), xd(l, j, k, 1), x(l, j&
121 & , k, 2), xd(l, j, k, 2), x(l, j, k, 3), xd(l, j, k, 3)&
122 & , vp5, vp5d)
123  call volpym_d(x(i, j, n, 1), xd(i, j, n, 1), x(i, j, n, 2), xd&
124 & (i, j, n, 2), x(i, j, n, 3), xd(i, j, n, 3), x(l, j, n&
125 & , 1), xd(l, j, n, 1), x(l, j, n, 2), xd(l, j, n, 2), x&
126 & (l, j, n, 3), xd(l, j, n, 3), x(l, m, n, 1), xd(l, m, &
127 & n, 1), x(l, m, n, 2), xd(l, m, n, 2), x(l, m, n, 3), &
128 & xd(l, m, n, 3), x(i, m, n, 1), xd(i, m, n, 1), x(i, m&
129 & , n, 2), xd(i, m, n, 2), x(i, m, n, 3), xd(i, m, n, 3)&
130 & , vp6, vp6d)
131 ! set the volume to 1/6 of the sum of the volumes of the
132 ! pyramid. remember that volpym computes 6 times the
133 ! volume.
134  vold(i, j, k) = sixth*(vp1d+vp2d+vp3d+vp4d+vp5d+vp6d)
135  vol(i, j, k) = sixth*(vp1+vp2+vp3+vp4+vp5+vp6)
136  if (vol(i, j, k) .ge. 0.) then
137  vol(i, j, k) = vol(i, j, k)
138  else
139  vold(i, j, k) = -vold(i, j, k)
140  vol(i, j, k) = -vol(i, j, k)
141  end if
142  end do
143  end do
144  end do
145 ! some additional safety stuff for halo volumes.
146  do k=2,kl
147  do j=2,jl
148  if (vol(1, j, k)/vol(2, j, k) .lt. halocellratio) then
149  vold(1, j, k) = vold(2, j, k)
150  vol(1, j, k) = vol(2, j, k)
151  end if
152  if (vol(ie, j, k)/vol(il, j, k) .lt. halocellratio) then
153  vold(ie, j, k) = vold(il, j, k)
154  vol(ie, j, k) = vol(il, j, k)
155  end if
156  end do
157  end do
158  do k=2,kl
159  do i=1,ie
160  if (vol(i, 1, k)/vol(i, 2, k) .lt. halocellratio) then
161  vold(i, 1, k) = vold(i, 2, k)
162  vol(i, 1, k) = vol(i, 2, k)
163  end if
164  if (vol(i, je, k)/vol(i, jl, k) .lt. halocellratio) then
165  vold(i, je, k) = vold(i, jl, k)
166  vol(i, je, k) = vol(i, jl, k)
167  end if
168  end do
169  end do
170  do j=1,je
171  do i=1,ie
172  if (vol(i, j, 1)/vol(i, j, 2) .lt. halocellratio) then
173  vold(i, j, 1) = vold(i, j, 2)
174  vol(i, j, 1) = vol(i, j, 2)
175  end if
176  if (vol(i, j, ke)/vol(i, j, kl) .lt. halocellratio) then
177  vold(i, j, ke) = vold(i, j, kl)
178  vol(i, j, ke) = vol(i, j, kl)
179  end if
180  end do
181  end do
182 
183  contains
184 ! differentiation of volpym in forward (tangent) mode (with options i4 dr8 r8):
185 ! variations of useful results: volume
186 ! with respect to varying inputs: xp yp zp xa xb xc xd ya yb
187 ! yc yd za zb zc zd
188  subroutine volpym_d(xa, xad, ya, yad, za, zad, xb, xbd, yb, ybd, zb&
189 & , zbd, xc, xcd, yc, ycd, zc, zcd, xd, xdd, yd, ydd, zd, zdd, &
190 & volume, volumed)
191 !
192 ! volpym computes 6 times the volume of a pyramid. node p,
193 ! whose coordinates are set in the subroutine metric itself,
194 ! is the top node and a-b-c-d is the quadrilateral surface.
195 ! it is assumed that the cross product vca * vdb points in
196 ! the direction of the top node. here vca is the diagonal
197 ! running from node c to node a and vdb the diagonal from
198 ! node d to node b.
199 !
200  use precision
201  implicit none
202 !
203 ! function type.
204 !
205  real(kind=realtype) :: volume
206  real(kind=realtype) :: volumed
207 !
208 ! function arguments.
209 !
210  real(kind=realtype), intent(in) :: xa, ya, za, xb, yb, zb
211  real(kind=realtype), intent(in) :: xad, yad, zad, xbd, ybd, zbd
212  real(kind=realtype), intent(in) :: xc, yc, zc, xd, yd, zd
213  real(kind=realtype), intent(in) :: xcd, ycd, zcd, xdd, ydd, zdd
214  real(kind=realtype) :: temp
215  real(kind=realtype) :: temp0
216  real(kind=realtype) :: temp1
217  real(kind=realtype) :: temp2
218  real(kind=realtype) :: temp3
219  real(kind=realtype) :: temp4
220  temp = (ya-yc)*(zb-zd) - (za-zc)*(yb-yd)
221  temp0 = xp - fourth*(xa+xb+xc+xd)
222  temp1 = (za-zc)*(xb-xd) - (xa-xc)*(zb-zd)
223  temp2 = yp - fourth*(ya+yb+yc+yd)
224  temp3 = (xa-xc)*(yb-yd) - (ya-yc)*(xb-xd)
225  temp4 = zp - fourth*(za+zb+zc+zd)
226  volumed = temp*(xpd-fourth*(xad+xbd+xcd+xdd)) + temp0*((zb-zd)*(&
227 & yad-ycd)+(ya-yc)*(zbd-zdd)-(yb-yd)*(zad-zcd)-(za-zc)*(ybd-ydd)) &
228 & + temp1*(ypd-fourth*(yad+ybd+ycd+ydd)) + temp2*((xb-xd)*(zad-zcd&
229 & )+(za-zc)*(xbd-xdd)-(zb-zd)*(xad-xcd)-(xa-xc)*(zbd-zdd)) + temp3&
230 & *(zpd-fourth*(zad+zbd+zcd+zdd)) + temp4*((yb-yd)*(xad-xcd)+(xa-&
231 & xc)*(ybd-ydd)-(xb-xd)*(yad-ycd)-(ya-yc)*(xbd-xdd))
232  volume = temp0*temp + temp2*temp1 + temp4*temp3
233  end subroutine volpym_d
234 
235  subroutine volpym(xa, ya, za, xb, yb, zb, xc, yc, zc, xd, yd, zd, &
236 & volume)
237 !
238 ! volpym computes 6 times the volume of a pyramid. node p,
239 ! whose coordinates are set in the subroutine metric itself,
240 ! is the top node and a-b-c-d is the quadrilateral surface.
241 ! it is assumed that the cross product vca * vdb points in
242 ! the direction of the top node. here vca is the diagonal
243 ! running from node c to node a and vdb the diagonal from
244 ! node d to node b.
245 !
246  use precision
247  implicit none
248 !
249 ! function type.
250 !
251  real(kind=realtype) :: volume
252 !
253 ! function arguments.
254 !
255  real(kind=realtype), intent(in) :: xa, ya, za, xb, yb, zb
256  real(kind=realtype), intent(in) :: xc, yc, zc, xd, yd, zd
257  volume = (xp-fourth*(xa+xb+xc+xd))*((ya-yc)*(zb-zd)-(za-zc)*(yb-yd&
258 & )) + (yp-fourth*(ya+yb+yc+yd))*((za-zc)*(xb-xd)-(xa-xc)*(zb-zd))&
259 & + (zp-fourth*(za+zb+zc+zd))*((xa-xc)*(yb-yd)-(ya-yc)*(xb-xd))
260  end subroutine volpym
261 
262  end subroutine volume_block_d
263 
264  subroutine volume_block()
265 ! this is copy of metric.f90. it was necessary to copy this file
266 ! since there is debugging stuff in the original that is not
267 ! necessary for ad.
268  use constants
269  use blockpointers
270  use cgnsgrid
271  use communication
273  implicit none
274 !
275 ! local parameter.
276 !
277  real(kind=realtype), parameter :: thresvolume=1.e-2_realtype
278  real(kind=realtype), parameter :: halocellratio=1e-10_realtype
279 !
280 ! local variables.
281 !
282  integer(kind=inttype) :: i, j, k, n, m, l, ii
283  integer(kind=inttype) :: mm
284  real(kind=realtype) :: fact, mult
285  real(kind=realtype) :: xp, yp, zp, vp1, vp2, vp3, vp4, vp5, vp6
286  real(kind=realtype) :: xxp, yyp, zzp
287  real(kind=realtype), dimension(3) :: v1, v2
288  intrinsic abs
289 ! compute the volumes. the hexahedron is split into 6 pyramids
290 ! whose volumes are computed. the volume is positive for a
291 ! right handed block.
292 ! initialize the volumes to zero. the reasons is that the second
293 ! level halo's must be initialized to zero and for convenience
294 ! all the volumes are set to zero.
295  vol = zero
296  do k=1,ke
297  n = k - 1
298  do j=1,je
299  m = j - 1
300  do i=1,ie
301  l = i - 1
302 ! compute the coordinates of the center of gravity.
303  xp = eighth*(x(i, j, k, 1)+x(i, m, k, 1)+x(i, m, n, 1)+x(i, j&
304 & , n, 1)+x(l, j, k, 1)+x(l, m, k, 1)+x(l, m, n, 1)+x(l, j, n&
305 & , 1))
306  yp = eighth*(x(i, j, k, 2)+x(i, m, k, 2)+x(i, m, n, 2)+x(i, j&
307 & , n, 2)+x(l, j, k, 2)+x(l, m, k, 2)+x(l, m, n, 2)+x(l, j, n&
308 & , 2))
309  zp = eighth*(x(i, j, k, 3)+x(i, m, k, 3)+x(i, m, n, 3)+x(i, j&
310 & , n, 3)+x(l, j, k, 3)+x(l, m, k, 3)+x(l, m, n, 3)+x(l, j, n&
311 & , 3))
312 ! compute the volumes of the 6 sub pyramids. the
313 ! arguments of volpym must be such that for a (regular)
314 ! right handed hexahedron all volumes are positive.
315  call volpym(x(i, j, k, 1), x(i, j, k, 2), x(i, j, k, 3), x(i, &
316 & j, n, 1), x(i, j, n, 2), x(i, j, n, 3), x(i, m, n, 1), x&
317 & (i, m, n, 2), x(i, m, n, 3), x(i, m, k, 1), x(i, m, k, 2&
318 & ), x(i, m, k, 3), vp1)
319  call volpym(x(l, j, k, 1), x(l, j, k, 2), x(l, j, k, 3), x(l, &
320 & m, k, 1), x(l, m, k, 2), x(l, m, k, 3), x(l, m, n, 1), x&
321 & (l, m, n, 2), x(l, m, n, 3), x(l, j, n, 1), x(l, j, n, 2&
322 & ), x(l, j, n, 3), vp2)
323  call volpym(x(i, j, k, 1), x(i, j, k, 2), x(i, j, k, 3), x(l, &
324 & j, k, 1), x(l, j, k, 2), x(l, j, k, 3), x(l, j, n, 1), x&
325 & (l, j, n, 2), x(l, j, n, 3), x(i, j, n, 1), x(i, j, n, 2&
326 & ), x(i, j, n, 3), vp3)
327  call volpym(x(i, m, k, 1), x(i, m, k, 2), x(i, m, k, 3), x(i, &
328 & m, n, 1), x(i, m, n, 2), x(i, m, n, 3), x(l, m, n, 1), x&
329 & (l, m, n, 2), x(l, m, n, 3), x(l, m, k, 1), x(l, m, k, 2&
330 & ), x(l, m, k, 3), vp4)
331  call volpym(x(i, j, k, 1), x(i, j, k, 2), x(i, j, k, 3), x(i, &
332 & m, k, 1), x(i, m, k, 2), x(i, m, k, 3), x(l, m, k, 1), x&
333 & (l, m, k, 2), x(l, m, k, 3), x(l, j, k, 1), x(l, j, k, 2&
334 & ), x(l, j, k, 3), vp5)
335  call volpym(x(i, j, n, 1), x(i, j, n, 2), x(i, j, n, 3), x(l, &
336 & j, n, 1), x(l, j, n, 2), x(l, j, n, 3), x(l, m, n, 1), x&
337 & (l, m, n, 2), x(l, m, n, 3), x(i, m, n, 1), x(i, m, n, 2&
338 & ), x(i, m, n, 3), vp6)
339 ! set the volume to 1/6 of the sum of the volumes of the
340 ! pyramid. remember that volpym computes 6 times the
341 ! volume.
342  vol(i, j, k) = sixth*(vp1+vp2+vp3+vp4+vp5+vp6)
343  if (vol(i, j, k) .ge. 0.) then
344  vol(i, j, k) = vol(i, j, k)
345  else
346  vol(i, j, k) = -vol(i, j, k)
347  end if
348  end do
349  end do
350  end do
351 ! some additional safety stuff for halo volumes.
352  do k=2,kl
353  do j=2,jl
354  if (vol(1, j, k)/vol(2, j, k) .lt. halocellratio) vol(1, j, k)&
355 & = vol(2, j, k)
356  if (vol(ie, j, k)/vol(il, j, k) .lt. halocellratio) vol(ie, j, k&
357 & ) = vol(il, j, k)
358  end do
359  end do
360  do k=2,kl
361  do i=1,ie
362  if (vol(i, 1, k)/vol(i, 2, k) .lt. halocellratio) vol(i, 1, k)&
363 & = vol(i, 2, k)
364  if (vol(i, je, k)/vol(i, jl, k) .lt. halocellratio) vol(i, je, k&
365 & ) = vol(i, jl, k)
366  end do
367  end do
368  do j=1,je
369  do i=1,ie
370  if (vol(i, j, 1)/vol(i, j, 2) .lt. halocellratio) vol(i, j, 1)&
371 & = vol(i, j, 2)
372  if (vol(i, j, ke)/vol(i, j, kl) .lt. halocellratio) vol(i, j, ke&
373 & ) = vol(i, j, kl)
374  end do
375  end do
376 
377  contains
378  subroutine volpym(xa, ya, za, xb, yb, zb, xc, yc, zc, xd, yd, zd, &
379 & volume)
380 !
381 ! volpym computes 6 times the volume of a pyramid. node p,
382 ! whose coordinates are set in the subroutine metric itself,
383 ! is the top node and a-b-c-d is the quadrilateral surface.
384 ! it is assumed that the cross product vca * vdb points in
385 ! the direction of the top node. here vca is the diagonal
386 ! running from node c to node a and vdb the diagonal from
387 ! node d to node b.
388 !
389  use precision
390  implicit none
391 !
392 ! function type.
393 !
394  real(kind=realtype) :: volume
395 !
396 ! function arguments.
397 !
398  real(kind=realtype), intent(in) :: xa, ya, za, xb, yb, zb
399  real(kind=realtype), intent(in) :: xc, yc, zc, xd, yd, zd
400  volume = (xp-fourth*(xa+xb+xc+xd))*((ya-yc)*(zb-zd)-(za-zc)*(yb-yd&
401 & )) + (yp-fourth*(ya+yb+yc+yd))*((za-zc)*(xb-xd)-(xa-xc)*(zb-zd))&
402 & + (zp-fourth*(za+zb+zc+zd))*((xa-xc)*(yb-yd)-(ya-yc)*(xb-xd))
403  end subroutine volpym
404 
405  end subroutine volume_block
406 
407 ! differentiation of metric_block in forward (tangent) mode (with options i4 dr8 r8):
408 ! variations of useful results: *si *sj *sk
409 ! with respect to varying inputs: *x
410 ! rw status of diff variables: *x:in *si:out *sj:out *sk:out
411 ! plus diff mem management of: x:in si:in sj:in sk:in
412  subroutine metric_block_d()
413  use constants
414  use blockpointers
415  implicit none
416 ! local variables.
417  integer(kind=inttype) :: i, j, k, n, m, l, ii
418  real(kind=realtype) :: fact
419  real(kind=realtype) :: xxp, yyp, zzp
420  real(kind=realtype), dimension(3) :: v1, v2
421  real(kind=realtype), dimension(3) :: v1d, v2d
422  intrinsic mod
423 ! set the factor in the surface normals computation. for a
424 ! left handed block this factor is negative, such that the
425 ! normals still point in the direction of increasing index.
426 ! the formulae used later on assume a right handed block
427 ! and fact is used to correct this for a left handed block,
428 ! as well as the scaling factor of 0.5
429  if (righthanded) then
430  fact = half
431  else
432  fact = -half
433  end if
434  if (associated(sid)) sid = 0.0_8
435  v1d = 0.0_8
436  v2d = 0.0_8
437 !
438 ! computation of the face normals in i-, j- and k-direction.
439 ! formula's are valid for a right handed block; for a left
440 ! handed block the correct orientation is obtained via fact.
441 ! the normals point in the direction of increasing index.
442 ! the absolute value of fact is 0.5, because the cross
443 ! product of the two diagonals is twice the normal vector.
444 ! note that also the normals of the first level halo cells
445 ! are computed. these are needed for the viscous fluxes.
446 !
447 ! projected areas of cell faces in the i direction.
448  do ii=0,ke*je*(ie+1)-1
449 ! 0:ie
450  i = mod(ii, ie + 1) + 0
451 !1:je
452  j = mod(ii/(ie+1), je) + 1
453 !1:ke
454  k = ii/((ie+1)*je) + 1
455  n = k - 1
456  m = j - 1
457 ! determine the two diagonal vectors of the face.
458  v1d(1) = xd(i, j, n, 1) - xd(i, m, k, 1)
459  v1(1) = x(i, j, n, 1) - x(i, m, k, 1)
460  v1d(2) = xd(i, j, n, 2) - xd(i, m, k, 2)
461  v1(2) = x(i, j, n, 2) - x(i, m, k, 2)
462  v1d(3) = xd(i, j, n, 3) - xd(i, m, k, 3)
463  v1(3) = x(i, j, n, 3) - x(i, m, k, 3)
464  v2d(1) = xd(i, j, k, 1) - xd(i, m, n, 1)
465  v2(1) = x(i, j, k, 1) - x(i, m, n, 1)
466  v2d(2) = xd(i, j, k, 2) - xd(i, m, n, 2)
467  v2(2) = x(i, j, k, 2) - x(i, m, n, 2)
468  v2d(3) = xd(i, j, k, 3) - xd(i, m, n, 3)
469  v2(3) = x(i, j, k, 3) - x(i, m, n, 3)
470 ! the face normal, which is the cross product of the two
471 ! diagonal vectors times fact; remember that fact is
472 ! either -0.5 or 0.5.
473  sid(i, j, k, 1) = fact*(v2(3)*v1d(2)+v1(2)*v2d(3)-v2(2)*v1d(3)-v1(&
474 & 3)*v2d(2))
475  si(i, j, k, 1) = fact*(v1(2)*v2(3)-v1(3)*v2(2))
476  sid(i, j, k, 2) = fact*(v2(1)*v1d(3)+v1(3)*v2d(1)-v2(3)*v1d(1)-v1(&
477 & 1)*v2d(3))
478  si(i, j, k, 2) = fact*(v1(3)*v2(1)-v1(1)*v2(3))
479  sid(i, j, k, 3) = fact*(v2(2)*v1d(1)+v1(1)*v2d(2)-v2(1)*v1d(2)-v1(&
480 & 2)*v2d(1))
481  si(i, j, k, 3) = fact*(v1(1)*v2(2)-v1(2)*v2(1))
482  end do
483  if (associated(sjd)) sjd = 0.0_8
484 ! projected areas of cell faces in the j direction
485  do ii=0,ke*(je+1)*ie-1
486 ! 1:ie
487  i = mod(ii, ie) + 1
488 !0:je
489  j = mod(ii/ie, je + 1) + 0
490 !1:ke
491  k = ii/(ie*(je+1)) + 1
492  n = k - 1
493  l = i - 1
494 ! determine the two diagonal vectors of the face.
495  v1d(1) = xd(i, j, n, 1) - xd(l, j, k, 1)
496  v1(1) = x(i, j, n, 1) - x(l, j, k, 1)
497  v1d(2) = xd(i, j, n, 2) - xd(l, j, k, 2)
498  v1(2) = x(i, j, n, 2) - x(l, j, k, 2)
499  v1d(3) = xd(i, j, n, 3) - xd(l, j, k, 3)
500  v1(3) = x(i, j, n, 3) - x(l, j, k, 3)
501  v2d(1) = xd(l, j, n, 1) - xd(i, j, k, 1)
502  v2(1) = x(l, j, n, 1) - x(i, j, k, 1)
503  v2d(2) = xd(l, j, n, 2) - xd(i, j, k, 2)
504  v2(2) = x(l, j, n, 2) - x(i, j, k, 2)
505  v2d(3) = xd(l, j, n, 3) - xd(i, j, k, 3)
506  v2(3) = x(l, j, n, 3) - x(i, j, k, 3)
507 ! the face normal, which is the cross product of the two
508 ! diagonal vectors times fact; remember that fact is
509 ! either -0.5 or 0.5.
510  sjd(i, j, k, 1) = fact*(v2(3)*v1d(2)+v1(2)*v2d(3)-v2(2)*v1d(3)-v1(&
511 & 3)*v2d(2))
512  sj(i, j, k, 1) = fact*(v1(2)*v2(3)-v1(3)*v2(2))
513  sjd(i, j, k, 2) = fact*(v2(1)*v1d(3)+v1(3)*v2d(1)-v2(3)*v1d(1)-v1(&
514 & 1)*v2d(3))
515  sj(i, j, k, 2) = fact*(v1(3)*v2(1)-v1(1)*v2(3))
516  sjd(i, j, k, 3) = fact*(v2(2)*v1d(1)+v1(1)*v2d(2)-v2(1)*v1d(2)-v1(&
517 & 2)*v2d(1))
518  sj(i, j, k, 3) = fact*(v1(1)*v2(2)-v1(2)*v2(1))
519  end do
520  if (associated(skd)) skd = 0.0_8
521 ! projected areas of cell faces in the k direction.
522  do ii=0,(ke+1)*je*ie-1
523 ! 1:ie
524  i = mod(ii, ie) + 1
525 !1:je
526  j = mod(ii/ie, je) + 1
527 !0:ke
528  k = ii/(ie*je) + 0
529  m = j - 1
530  l = i - 1
531 ! determine the two diagonal vectors of the face.
532  v1d(1) = xd(i, j, k, 1) - xd(l, m, k, 1)
533  v1(1) = x(i, j, k, 1) - x(l, m, k, 1)
534  v1d(2) = xd(i, j, k, 2) - xd(l, m, k, 2)
535  v1(2) = x(i, j, k, 2) - x(l, m, k, 2)
536  v1d(3) = xd(i, j, k, 3) - xd(l, m, k, 3)
537  v1(3) = x(i, j, k, 3) - x(l, m, k, 3)
538  v2d(1) = xd(l, j, k, 1) - xd(i, m, k, 1)
539  v2(1) = x(l, j, k, 1) - x(i, m, k, 1)
540  v2d(2) = xd(l, j, k, 2) - xd(i, m, k, 2)
541  v2(2) = x(l, j, k, 2) - x(i, m, k, 2)
542  v2d(3) = xd(l, j, k, 3) - xd(i, m, k, 3)
543  v2(3) = x(l, j, k, 3) - x(i, m, k, 3)
544 ! the face normal, which is the cross product of the two
545 ! diagonal vectors times fact; remember that fact is
546 ! either -0.5 or 0.5.
547  skd(i, j, k, 1) = fact*(v2(3)*v1d(2)+v1(2)*v2d(3)-v2(2)*v1d(3)-v1(&
548 & 3)*v2d(2))
549  sk(i, j, k, 1) = fact*(v1(2)*v2(3)-v1(3)*v2(2))
550  skd(i, j, k, 2) = fact*(v2(1)*v1d(3)+v1(3)*v2d(1)-v2(3)*v1d(1)-v1(&
551 & 1)*v2d(3))
552  sk(i, j, k, 2) = fact*(v1(3)*v2(1)-v1(1)*v2(3))
553  skd(i, j, k, 3) = fact*(v2(2)*v1d(1)+v1(1)*v2d(2)-v2(1)*v1d(2)-v1(&
554 & 2)*v2d(1))
555  sk(i, j, k, 3) = fact*(v1(1)*v2(2)-v1(2)*v2(1))
556  end do
557  end subroutine metric_block_d
558 
559  subroutine metric_block()
560  use constants
561  use blockpointers
562  implicit none
563 ! local variables.
564  integer(kind=inttype) :: i, j, k, n, m, l, ii
565  real(kind=realtype) :: fact
566  real(kind=realtype) :: xxp, yyp, zzp
567  real(kind=realtype), dimension(3) :: v1, v2
568  intrinsic mod
569 ! set the factor in the surface normals computation. for a
570 ! left handed block this factor is negative, such that the
571 ! normals still point in the direction of increasing index.
572 ! the formulae used later on assume a right handed block
573 ! and fact is used to correct this for a left handed block,
574 ! as well as the scaling factor of 0.5
575  if (righthanded) then
576  fact = half
577  else
578  fact = -half
579  end if
580 !$ad ii-loop
581 !
582 ! computation of the face normals in i-, j- and k-direction.
583 ! formula's are valid for a right handed block; for a left
584 ! handed block the correct orientation is obtained via fact.
585 ! the normals point in the direction of increasing index.
586 ! the absolute value of fact is 0.5, because the cross
587 ! product of the two diagonals is twice the normal vector.
588 ! note that also the normals of the first level halo cells
589 ! are computed. these are needed for the viscous fluxes.
590 !
591 ! projected areas of cell faces in the i direction.
592  do ii=0,ke*je*(ie+1)-1
593 ! 0:ie
594  i = mod(ii, ie + 1) + 0
595 !1:je
596  j = mod(ii/(ie+1), je) + 1
597 !1:ke
598  k = ii/((ie+1)*je) + 1
599  n = k - 1
600  m = j - 1
601 ! determine the two diagonal vectors of the face.
602  v1(1) = x(i, j, n, 1) - x(i, m, k, 1)
603  v1(2) = x(i, j, n, 2) - x(i, m, k, 2)
604  v1(3) = x(i, j, n, 3) - x(i, m, k, 3)
605  v2(1) = x(i, j, k, 1) - x(i, m, n, 1)
606  v2(2) = x(i, j, k, 2) - x(i, m, n, 2)
607  v2(3) = x(i, j, k, 3) - x(i, m, n, 3)
608 ! the face normal, which is the cross product of the two
609 ! diagonal vectors times fact; remember that fact is
610 ! either -0.5 or 0.5.
611  si(i, j, k, 1) = fact*(v1(2)*v2(3)-v1(3)*v2(2))
612  si(i, j, k, 2) = fact*(v1(3)*v2(1)-v1(1)*v2(3))
613  si(i, j, k, 3) = fact*(v1(1)*v2(2)-v1(2)*v2(1))
614  end do
615 !$ad ii-loop
616 ! projected areas of cell faces in the j direction
617  do ii=0,ke*(je+1)*ie-1
618 ! 1:ie
619  i = mod(ii, ie) + 1
620 !0:je
621  j = mod(ii/ie, je + 1) + 0
622 !1:ke
623  k = ii/(ie*(je+1)) + 1
624  n = k - 1
625  l = i - 1
626 ! determine the two diagonal vectors of the face.
627  v1(1) = x(i, j, n, 1) - x(l, j, k, 1)
628  v1(2) = x(i, j, n, 2) - x(l, j, k, 2)
629  v1(3) = x(i, j, n, 3) - x(l, j, k, 3)
630  v2(1) = x(l, j, n, 1) - x(i, j, k, 1)
631  v2(2) = x(l, j, n, 2) - x(i, j, k, 2)
632  v2(3) = x(l, j, n, 3) - x(i, j, k, 3)
633 ! the face normal, which is the cross product of the two
634 ! diagonal vectors times fact; remember that fact is
635 ! either -0.5 or 0.5.
636  sj(i, j, k, 1) = fact*(v1(2)*v2(3)-v1(3)*v2(2))
637  sj(i, j, k, 2) = fact*(v1(3)*v2(1)-v1(1)*v2(3))
638  sj(i, j, k, 3) = fact*(v1(1)*v2(2)-v1(2)*v2(1))
639  end do
640 !$ad ii-loop
641 ! projected areas of cell faces in the k direction.
642  do ii=0,(ke+1)*je*ie-1
643 ! 1:ie
644  i = mod(ii, ie) + 1
645 !1:je
646  j = mod(ii/ie, je) + 1
647 !0:ke
648  k = ii/(ie*je) + 0
649  m = j - 1
650  l = i - 1
651 ! determine the two diagonal vectors of the face.
652  v1(1) = x(i, j, k, 1) - x(l, m, k, 1)
653  v1(2) = x(i, j, k, 2) - x(l, m, k, 2)
654  v1(3) = x(i, j, k, 3) - x(l, m, k, 3)
655  v2(1) = x(l, j, k, 1) - x(i, m, k, 1)
656  v2(2) = x(l, j, k, 2) - x(i, m, k, 2)
657  v2(3) = x(l, j, k, 3) - x(i, m, k, 3)
658 ! the face normal, which is the cross product of the two
659 ! diagonal vectors times fact; remember that fact is
660 ! either -0.5 or 0.5.
661  sk(i, j, k, 1) = fact*(v1(2)*v2(3)-v1(3)*v2(2))
662  sk(i, j, k, 2) = fact*(v1(3)*v2(1)-v1(1)*v2(3))
663  sk(i, j, k, 3) = fact*(v1(1)*v2(2)-v1(2)*v2(1))
664  end do
665  end subroutine metric_block
666 
667 ! differentiation of boundarynormals in forward (tangent) mode (with options i4 dr8 r8):
668 ! variations of useful results: *(*bcdata.norm)
669 ! with respect to varying inputs: *si *sj *sk
670 ! rw status of diff variables: *si:in *sj:in *sk:in *(*bcdata.norm):out
671 ! plus diff mem management of: si:in sj:in sk:in bcdata:in *bcdata.norm:in
672  subroutine boundarynormals_d()
673 ! the unit normals on the boundary faces. these always point
674 ! out of the domain, so a multiplication by -1 is needed for
675 ! the imin, jmin and kmin boundaries.
676 !
677  use constants
678  use blockpointers
679  use cgnsgrid
680  use communication
682  use diffsizes
683 ! hint: isize1ofdrfbcdata should be the size of dimension 1 of array *bcdata
684  implicit none
685 ! local variables.
686  integer(kind=inttype) :: i, j, ii
687  integer(kind=inttype) :: mm
688  real(kind=realtype) :: fact, mult
689  real(kind=realtype) :: factd
690  real(kind=realtype) :: xxp, yyp, zzp
691  real(kind=realtype) :: xxpd, yypd, zzpd
692  intrinsic mod
693  intrinsic sqrt
694  real(kind=realtype) :: arg1
695  real(kind=realtype) :: arg1d
696  real(kind=realtype) :: temp
697  integer :: ii1
698  if (associated(bcdatad)) then
699  do ii1=1,isize1ofdrfbcdata
700  bcdatad(ii1)%norm = 0.0_8
701  end do
702  end if
703  zzpd = 0.0_8
704  yypd = 0.0_8
705  xxpd = 0.0_8
706 !loop over the boundary subfaces of this block.
707 bocoloop:do mm=1,nbocos
708 ! loop over the boundary faces of the subface.
709  do ii=0,(bcdata(mm)%jcend-bcdata(mm)%jcbeg+1)*(bcdata(mm)%icend-&
710 & bcdata(mm)%icbeg+1)-1
711  i = mod(ii, bcdata(mm)%icend - bcdata(mm)%icbeg + 1) + bcdata(mm&
712 & )%icbeg
713  j = ii/(bcdata(mm)%icend-bcdata(mm)%icbeg+1) + bcdata(mm)%jcbeg
714  select case (bcfaceid(mm))
715  case (imin)
716  mult = -one
717  xxpd = sid(1, i, j, 1)
718  xxp = si(1, i, j, 1)
719  yypd = sid(1, i, j, 2)
720  yyp = si(1, i, j, 2)
721  zzpd = sid(1, i, j, 3)
722  zzp = si(1, i, j, 3)
723  case (imax)
724  mult = one
725  xxpd = sid(il, i, j, 1)
726  xxp = si(il, i, j, 1)
727  yypd = sid(il, i, j, 2)
728  yyp = si(il, i, j, 2)
729  zzpd = sid(il, i, j, 3)
730  zzp = si(il, i, j, 3)
731  case (jmin)
732  mult = -one
733  xxpd = sjd(i, 1, j, 1)
734  xxp = sj(i, 1, j, 1)
735  yypd = sjd(i, 1, j, 2)
736  yyp = sj(i, 1, j, 2)
737  zzpd = sjd(i, 1, j, 3)
738  zzp = sj(i, 1, j, 3)
739  case (jmax)
740  mult = one
741  xxpd = sjd(i, jl, j, 1)
742  xxp = sj(i, jl, j, 1)
743  yypd = sjd(i, jl, j, 2)
744  yyp = sj(i, jl, j, 2)
745  zzpd = sjd(i, jl, j, 3)
746  zzp = sj(i, jl, j, 3)
747  case (kmin)
748  mult = -one
749  xxpd = skd(i, j, 1, 1)
750  xxp = sk(i, j, 1, 1)
751  yypd = skd(i, j, 1, 2)
752  yyp = sk(i, j, 1, 2)
753  zzpd = skd(i, j, 1, 3)
754  zzp = sk(i, j, 1, 3)
755  case (kmax)
756  mult = one
757  xxpd = skd(i, j, kl, 1)
758  xxp = sk(i, j, kl, 1)
759  yypd = skd(i, j, kl, 2)
760  yyp = sk(i, j, kl, 2)
761  zzpd = skd(i, j, kl, 3)
762  zzp = sk(i, j, kl, 3)
763  end select
764 ! compute the inverse of the length of the normal vector
765 ! and possibly correct for inward pointing.
766  arg1d = 2*xxp*xxpd + 2*yyp*yypd + 2*zzp*zzpd
767  arg1 = xxp*xxp + yyp*yyp + zzp*zzp
768  temp = sqrt(arg1)
769  if (arg1 .eq. 0.0_8) then
770  factd = 0.0_8
771  else
772  factd = arg1d/(2.0*temp)
773  end if
774  fact = temp
775  if (fact .gt. zero) then
776  factd = -(mult*factd/fact**2)
777  fact = mult/fact
778  end if
779 ! compute the unit normal.
780  bcdatad(mm)%norm(i, j, 1) = xxp*factd + fact*xxpd
781  bcdata(mm)%norm(i, j, 1) = fact*xxp
782  bcdatad(mm)%norm(i, j, 2) = yyp*factd + fact*yypd
783  bcdata(mm)%norm(i, j, 2) = fact*yyp
784  bcdatad(mm)%norm(i, j, 3) = zzp*factd + fact*zzpd
785  bcdata(mm)%norm(i, j, 3) = fact*zzp
786  end do
787  end do bocoloop
788  end subroutine boundarynormals_d
789 
790  subroutine boundarynormals()
791 ! the unit normals on the boundary faces. these always point
792 ! out of the domain, so a multiplication by -1 is needed for
793 ! the imin, jmin and kmin boundaries.
794 !
795  use constants
796  use blockpointers
797  use cgnsgrid
798  use communication
800  implicit none
801 ! local variables.
802  integer(kind=inttype) :: i, j, ii
803  integer(kind=inttype) :: mm
804  real(kind=realtype) :: fact, mult
805  real(kind=realtype) :: xxp, yyp, zzp
806  intrinsic mod
807  intrinsic sqrt
808  real(kind=realtype) :: arg1
809 !$ad ii-loop
810 !loop over the boundary subfaces of this block.
811 bocoloop:do mm=1,nbocos
812 !$ad ii-loop
813 ! loop over the boundary faces of the subface.
814  do ii=0,(bcdata(mm)%jcend-bcdata(mm)%jcbeg+1)*(bcdata(mm)%icend-&
815 & bcdata(mm)%icbeg+1)-1
816  i = mod(ii, bcdata(mm)%icend - bcdata(mm)%icbeg + 1) + bcdata(mm&
817 & )%icbeg
818  j = ii/(bcdata(mm)%icend-bcdata(mm)%icbeg+1) + bcdata(mm)%jcbeg
819  select case (bcfaceid(mm))
820  case (imin)
821  mult = -one
822  xxp = si(1, i, j, 1)
823  yyp = si(1, i, j, 2)
824  zzp = si(1, i, j, 3)
825  case (imax)
826  mult = one
827  xxp = si(il, i, j, 1)
828  yyp = si(il, i, j, 2)
829  zzp = si(il, i, j, 3)
830  case (jmin)
831  mult = -one
832  xxp = sj(i, 1, j, 1)
833  yyp = sj(i, 1, j, 2)
834  zzp = sj(i, 1, j, 3)
835  case (jmax)
836  mult = one
837  xxp = sj(i, jl, j, 1)
838  yyp = sj(i, jl, j, 2)
839  zzp = sj(i, jl, j, 3)
840  case (kmin)
841  mult = -one
842  xxp = sk(i, j, 1, 1)
843  yyp = sk(i, j, 1, 2)
844  zzp = sk(i, j, 1, 3)
845  case (kmax)
846  mult = one
847  xxp = sk(i, j, kl, 1)
848  yyp = sk(i, j, kl, 2)
849  zzp = sk(i, j, kl, 3)
850  end select
851 ! compute the inverse of the length of the normal vector
852 ! and possibly correct for inward pointing.
853  arg1 = xxp*xxp + yyp*yyp + zzp*zzp
854  fact = sqrt(arg1)
855  if (fact .gt. zero) fact = mult/fact
856 ! compute the unit normal.
857  bcdata(mm)%norm(i, j, 1) = fact*xxp
858  bcdata(mm)%norm(i, j, 2) = fact*yyp
859  bcdata(mm)%norm(i, j, 3) = fact*zzp
860  end do
861  end do bocoloop
862  end subroutine boundarynormals
863 
864 ! differentiation of xhalo_block in forward (tangent) mode (with options i4 dr8 r8):
865 ! variations of useful results: *x
866 ! with respect to varying inputs: *x
867 ! rw status of diff variables: *x:in-out
868 ! plus diff mem management of: x:in
869  subroutine xhalo_block_d()
870 !
871 ! xhalo determines the coordinates of the nodal halo's.
872 ! first it sets all halo coordinates by simple extrapolation,
873 ! then the symmetry planes are treated (also the unit normal of
874 ! symmetry planes are determined) and finally an exchange is
875 ! made for the internal halo's.
876 !
877  use constants
878  use blockpointers
879  use communication
881  implicit none
882 !
883 ! local variables.
884 !
885  integer(kind=inttype) :: mm, i, j, k
886  integer(kind=inttype) :: ibeg, iend, jbeg, jend, iimax, jjmax
887  logical :: err
888  real(kind=realtype) :: length, dot
889  real(kind=realtype) :: dotd
890  real(kind=realtype), dimension(3) :: v1, v2, norm
891  real(kind=realtype), dimension(3) :: v1d
892  intrinsic sqrt
893  real(kind=realtype) :: arg1
894 ! extrapolation in i-direction.
895  do k=1,kl
896  do j=1,jl
897  xd(0, j, k, 1) = two*xd(1, j, k, 1) - xd(2, j, k, 1)
898  x(0, j, k, 1) = two*x(1, j, k, 1) - x(2, j, k, 1)
899  xd(0, j, k, 2) = two*xd(1, j, k, 2) - xd(2, j, k, 2)
900  x(0, j, k, 2) = two*x(1, j, k, 2) - x(2, j, k, 2)
901  xd(0, j, k, 3) = two*xd(1, j, k, 3) - xd(2, j, k, 3)
902  x(0, j, k, 3) = two*x(1, j, k, 3) - x(2, j, k, 3)
903  xd(ie, j, k, 1) = two*xd(il, j, k, 1) - xd(nx, j, k, 1)
904  x(ie, j, k, 1) = two*x(il, j, k, 1) - x(nx, j, k, 1)
905  xd(ie, j, k, 2) = two*xd(il, j, k, 2) - xd(nx, j, k, 2)
906  x(ie, j, k, 2) = two*x(il, j, k, 2) - x(nx, j, k, 2)
907  xd(ie, j, k, 3) = two*xd(il, j, k, 3) - xd(nx, j, k, 3)
908  x(ie, j, k, 3) = two*x(il, j, k, 3) - x(nx, j, k, 3)
909  end do
910  end do
911 ! extrapolation in j-direction.
912  do k=1,kl
913  do i=0,ie
914  xd(i, 0, k, 1) = two*xd(i, 1, k, 1) - xd(i, 2, k, 1)
915  x(i, 0, k, 1) = two*x(i, 1, k, 1) - x(i, 2, k, 1)
916  xd(i, 0, k, 2) = two*xd(i, 1, k, 2) - xd(i, 2, k, 2)
917  x(i, 0, k, 2) = two*x(i, 1, k, 2) - x(i, 2, k, 2)
918  xd(i, 0, k, 3) = two*xd(i, 1, k, 3) - xd(i, 2, k, 3)
919  x(i, 0, k, 3) = two*x(i, 1, k, 3) - x(i, 2, k, 3)
920  xd(i, je, k, 1) = two*xd(i, jl, k, 1) - xd(i, ny, k, 1)
921  x(i, je, k, 1) = two*x(i, jl, k, 1) - x(i, ny, k, 1)
922  xd(i, je, k, 2) = two*xd(i, jl, k, 2) - xd(i, ny, k, 2)
923  x(i, je, k, 2) = two*x(i, jl, k, 2) - x(i, ny, k, 2)
924  xd(i, je, k, 3) = two*xd(i, jl, k, 3) - xd(i, ny, k, 3)
925  x(i, je, k, 3) = two*x(i, jl, k, 3) - x(i, ny, k, 3)
926  end do
927  end do
928 ! extrapolation in k-direction.
929  do j=0,je
930  do i=0,ie
931  xd(i, j, 0, 1) = two*xd(i, j, 1, 1) - xd(i, j, 2, 1)
932  x(i, j, 0, 1) = two*x(i, j, 1, 1) - x(i, j, 2, 1)
933  xd(i, j, 0, 2) = two*xd(i, j, 1, 2) - xd(i, j, 2, 2)
934  x(i, j, 0, 2) = two*x(i, j, 1, 2) - x(i, j, 2, 2)
935  xd(i, j, 0, 3) = two*xd(i, j, 1, 3) - xd(i, j, 2, 3)
936  x(i, j, 0, 3) = two*x(i, j, 1, 3) - x(i, j, 2, 3)
937  xd(i, j, ke, 1) = two*xd(i, j, kl, 1) - xd(i, j, nz, 1)
938  x(i, j, ke, 1) = two*x(i, j, kl, 1) - x(i, j, nz, 1)
939  xd(i, j, ke, 2) = two*xd(i, j, kl, 2) - xd(i, j, nz, 2)
940  x(i, j, ke, 2) = two*x(i, j, kl, 2) - x(i, j, nz, 2)
941  xd(i, j, ke, 3) = two*xd(i, j, kl, 3) - xd(i, j, nz, 3)
942  x(i, j, ke, 3) = two*x(i, j, kl, 3) - x(i, j, nz, 3)
943  end do
944  end do
945  v1d = 0.0_8
946 !
947 ! mirror the halo coordinates adjacent to the symmetry
948 ! planes
949 !
950 ! loop over boundary subfaces.
951 loopbocos:do mm=1,nbocos
952 ! the actual correction of the coordinates only takes
953 ! place for symmetry planes.
954  if (bctype(mm) .eq. symm) then
955 ! set some variables, depending on the block face on
956 ! which the subface is located.
957  norm(1) = bcdata(mm)%symnorm(1)
958  norm(2) = bcdata(mm)%symnorm(2)
959  norm(3) = bcdata(mm)%symnorm(3)
960  arg1 = norm(1)**2 + norm(2)**2 + norm(3)**2
961  length = sqrt(arg1)
962 ! compute the unit normal of the subface.
963  norm(1) = norm(1)/length
964  norm(2) = norm(2)/length
965  norm(3) = norm(3)/length
966 ! see xhalo_block for comments for below:
967  if (length .gt. eps) then
968  select case (bcfaceid(mm))
969  case (imin)
970  ibeg = jnbeg(mm)
971  iend = jnend(mm)
972  iimax = jl
973  jbeg = knbeg(mm)
974  jend = knend(mm)
975  jjmax = kl
976  if (ibeg .eq. 1) ibeg = 0
977  if (iend .eq. iimax) iend = iimax + 1
978  if (jbeg .eq. 1) jbeg = 0
979  if (jend .eq. jjmax) jend = jjmax + 1
980  do j=jbeg,jend
981  do i=ibeg,iend
982  v1d(1) = xd(1, i, j, 1) - xd(2, i, j, 1)
983  v1(1) = x(1, i, j, 1) - x(2, i, j, 1)
984  v1d(2) = xd(1, i, j, 2) - xd(2, i, j, 2)
985  v1(2) = x(1, i, j, 2) - x(2, i, j, 2)
986  v1d(3) = xd(1, i, j, 3) - xd(2, i, j, 3)
987  v1(3) = x(1, i, j, 3) - x(2, i, j, 3)
988  dotd = two*(norm(1)*v1d(1)+norm(2)*v1d(2)+norm(3)*v1d(3)&
989 & )
990  dot = two*(v1(1)*norm(1)+v1(2)*norm(2)+v1(3)*norm(3))
991  xd(0, i, j, 1) = xd(2, i, j, 1) + norm(1)*dotd
992  x(0, i, j, 1) = x(2, i, j, 1) + dot*norm(1)
993  xd(0, i, j, 2) = xd(2, i, j, 2) + norm(2)*dotd
994  x(0, i, j, 2) = x(2, i, j, 2) + dot*norm(2)
995  xd(0, i, j, 3) = xd(2, i, j, 3) + norm(3)*dotd
996  x(0, i, j, 3) = x(2, i, j, 3) + dot*norm(3)
997  end do
998  end do
999  case (imax)
1000  ibeg = jnbeg(mm)
1001  iend = jnend(mm)
1002  iimax = jl
1003  jbeg = knbeg(mm)
1004  jend = knend(mm)
1005  jjmax = kl
1006  if (ibeg .eq. 1) ibeg = 0
1007  if (iend .eq. iimax) iend = iimax + 1
1008  if (jbeg .eq. 1) jbeg = 0
1009  if (jend .eq. jjmax) jend = jjmax + 1
1010  do j=jbeg,jend
1011  do i=ibeg,iend
1012  v1d(1) = xd(il, i, j, 1) - xd(nx, i, j, 1)
1013  v1(1) = x(il, i, j, 1) - x(nx, i, j, 1)
1014  v1d(2) = xd(il, i, j, 2) - xd(nx, i, j, 2)
1015  v1(2) = x(il, i, j, 2) - x(nx, i, j, 2)
1016  v1d(3) = xd(il, i, j, 3) - xd(nx, i, j, 3)
1017  v1(3) = x(il, i, j, 3) - x(nx, i, j, 3)
1018  dotd = two*(norm(1)*v1d(1)+norm(2)*v1d(2)+norm(3)*v1d(3)&
1019 & )
1020  dot = two*(v1(1)*norm(1)+v1(2)*norm(2)+v1(3)*norm(3))
1021  xd(ie, i, j, 1) = xd(nx, i, j, 1) + norm(1)*dotd
1022  x(ie, i, j, 1) = x(nx, i, j, 1) + dot*norm(1)
1023  xd(ie, i, j, 2) = xd(nx, i, j, 2) + norm(2)*dotd
1024  x(ie, i, j, 2) = x(nx, i, j, 2) + dot*norm(2)
1025  xd(ie, i, j, 3) = xd(nx, i, j, 3) + norm(3)*dotd
1026  x(ie, i, j, 3) = x(nx, i, j, 3) + dot*norm(3)
1027  end do
1028  end do
1029  case (jmin)
1030  ibeg = inbeg(mm)
1031  iend = inend(mm)
1032  iimax = il
1033  jbeg = knbeg(mm)
1034  jend = knend(mm)
1035  jjmax = kl
1036  if (ibeg .eq. 1) ibeg = 0
1037  if (iend .eq. iimax) iend = iimax + 1
1038  if (jbeg .eq. 1) jbeg = 0
1039  if (jend .eq. jjmax) jend = jjmax + 1
1040  do j=jbeg,jend
1041  do i=ibeg,iend
1042  v1d(1) = xd(i, 1, j, 1) - xd(i, 2, j, 1)
1043  v1(1) = x(i, 1, j, 1) - x(i, 2, j, 1)
1044  v1d(2) = xd(i, 1, j, 2) - xd(i, 2, j, 2)
1045  v1(2) = x(i, 1, j, 2) - x(i, 2, j, 2)
1046  v1d(3) = xd(i, 1, j, 3) - xd(i, 2, j, 3)
1047  v1(3) = x(i, 1, j, 3) - x(i, 2, j, 3)
1048  dotd = two*(norm(1)*v1d(1)+norm(2)*v1d(2)+norm(3)*v1d(3)&
1049 & )
1050  dot = two*(v1(1)*norm(1)+v1(2)*norm(2)+v1(3)*norm(3))
1051  xd(i, 0, j, 1) = xd(i, 2, j, 1) + norm(1)*dotd
1052  x(i, 0, j, 1) = x(i, 2, j, 1) + dot*norm(1)
1053  xd(i, 0, j, 2) = xd(i, 2, j, 2) + norm(2)*dotd
1054  x(i, 0, j, 2) = x(i, 2, j, 2) + dot*norm(2)
1055  xd(i, 0, j, 3) = xd(i, 2, j, 3) + norm(3)*dotd
1056  x(i, 0, j, 3) = x(i, 2, j, 3) + dot*norm(3)
1057  end do
1058  end do
1059  case (jmax)
1060  ibeg = inbeg(mm)
1061  iend = inend(mm)
1062  iimax = il
1063  jbeg = knbeg(mm)
1064  jend = knend(mm)
1065  jjmax = kl
1066  if (ibeg .eq. 1) ibeg = 0
1067  if (iend .eq. iimax) iend = iimax + 1
1068  if (jbeg .eq. 1) jbeg = 0
1069  if (jend .eq. jjmax) jend = jjmax + 1
1070  do j=jbeg,jend
1071  do i=ibeg,iend
1072  v1d(1) = xd(i, jl, j, 1) - xd(i, ny, j, 1)
1073  v1(1) = x(i, jl, j, 1) - x(i, ny, j, 1)
1074  v1d(2) = xd(i, jl, j, 2) - xd(i, ny, j, 2)
1075  v1(2) = x(i, jl, j, 2) - x(i, ny, j, 2)
1076  v1d(3) = xd(i, jl, j, 3) - xd(i, ny, j, 3)
1077  v1(3) = x(i, jl, j, 3) - x(i, ny, j, 3)
1078  dotd = two*(norm(1)*v1d(1)+norm(2)*v1d(2)+norm(3)*v1d(3)&
1079 & )
1080  dot = two*(v1(1)*norm(1)+v1(2)*norm(2)+v1(3)*norm(3))
1081  xd(i, je, j, 1) = xd(i, ny, j, 1) + norm(1)*dotd
1082  x(i, je, j, 1) = x(i, ny, j, 1) + dot*norm(1)
1083  xd(i, je, j, 2) = xd(i, ny, j, 2) + norm(2)*dotd
1084  x(i, je, j, 2) = x(i, ny, j, 2) + dot*norm(2)
1085  xd(i, je, j, 3) = xd(i, ny, j, 3) + norm(3)*dotd
1086  x(i, je, j, 3) = x(i, ny, j, 3) + dot*norm(3)
1087  end do
1088  end do
1089  case (kmin)
1090  ibeg = inbeg(mm)
1091  iend = inend(mm)
1092  iimax = il
1093  jbeg = jnbeg(mm)
1094  jend = jnend(mm)
1095  jjmax = jl
1096  if (ibeg .eq. 1) ibeg = 0
1097  if (iend .eq. iimax) iend = iimax + 1
1098  if (jbeg .eq. 1) jbeg = 0
1099  if (jend .eq. jjmax) jend = jjmax + 1
1100  do j=jbeg,jend
1101  do i=ibeg,iend
1102  v1d(1) = xd(i, j, 1, 1) - xd(i, j, 2, 1)
1103  v1(1) = x(i, j, 1, 1) - x(i, j, 2, 1)
1104  v1d(2) = xd(i, j, 1, 2) - xd(i, j, 2, 2)
1105  v1(2) = x(i, j, 1, 2) - x(i, j, 2, 2)
1106  v1d(3) = xd(i, j, 1, 3) - xd(i, j, 2, 3)
1107  v1(3) = x(i, j, 1, 3) - x(i, j, 2, 3)
1108  dotd = two*(norm(1)*v1d(1)+norm(2)*v1d(2)+norm(3)*v1d(3)&
1109 & )
1110  dot = two*(v1(1)*norm(1)+v1(2)*norm(2)+v1(3)*norm(3))
1111  xd(i, j, 0, 1) = xd(i, j, 2, 1) + norm(1)*dotd
1112  x(i, j, 0, 1) = x(i, j, 2, 1) + dot*norm(1)
1113  xd(i, j, 0, 2) = xd(i, j, 2, 2) + norm(2)*dotd
1114  x(i, j, 0, 2) = x(i, j, 2, 2) + dot*norm(2)
1115  xd(i, j, 0, 3) = xd(i, j, 2, 3) + norm(3)*dotd
1116  x(i, j, 0, 3) = x(i, j, 2, 3) + dot*norm(3)
1117  end do
1118  end do
1119  case (kmax)
1120  ibeg = inbeg(mm)
1121  iend = inend(mm)
1122  iimax = il
1123  jbeg = jnbeg(mm)
1124  jend = jnend(mm)
1125  jjmax = jl
1126  if (ibeg .eq. 1) ibeg = 0
1127  if (iend .eq. iimax) iend = iimax + 1
1128  if (jbeg .eq. 1) jbeg = 0
1129  if (jend .eq. jjmax) jend = jjmax + 1
1130  do j=jbeg,jend
1131  do i=ibeg,iend
1132  v1d(1) = xd(i, j, kl, 1) - xd(i, j, nz, 1)
1133  v1(1) = x(i, j, kl, 1) - x(i, j, nz, 1)
1134  v1d(2) = xd(i, j, kl, 2) - xd(i, j, nz, 2)
1135  v1(2) = x(i, j, kl, 2) - x(i, j, nz, 2)
1136  v1d(3) = xd(i, j, kl, 3) - xd(i, j, nz, 3)
1137  v1(3) = x(i, j, kl, 3) - x(i, j, nz, 3)
1138  dotd = two*(norm(1)*v1d(1)+norm(2)*v1d(2)+norm(3)*v1d(3)&
1139 & )
1140  dot = two*(v1(1)*norm(1)+v1(2)*norm(2)+v1(3)*norm(3))
1141  xd(i, j, ke, 1) = xd(i, j, nz, 1) + norm(1)*dotd
1142  x(i, j, ke, 1) = x(i, j, nz, 1) + dot*norm(1)
1143  xd(i, j, ke, 2) = xd(i, j, nz, 2) + norm(2)*dotd
1144  x(i, j, ke, 2) = x(i, j, nz, 2) + dot*norm(2)
1145  xd(i, j, ke, 3) = xd(i, j, nz, 3) + norm(3)*dotd
1146  x(i, j, ke, 3) = x(i, j, nz, 3) + dot*norm(3)
1147  end do
1148  end do
1149  end select
1150  end if
1151  end if
1152  end do loopbocos
1153  end subroutine xhalo_block_d
1154 
1155  subroutine xhalo_block()
1156 !
1157 ! xhalo determines the coordinates of the nodal halo's.
1158 ! first it sets all halo coordinates by simple extrapolation,
1159 ! then the symmetry planes are treated (also the unit normal of
1160 ! symmetry planes are determined) and finally an exchange is
1161 ! made for the internal halo's.
1162 !
1163  use constants
1164  use blockpointers
1165  use communication
1166  use inputtimespectral
1167  implicit none
1168 !
1169 ! local variables.
1170 !
1171  integer(kind=inttype) :: mm, i, j, k
1172  integer(kind=inttype) :: ibeg, iend, jbeg, jend, iimax, jjmax
1173  logical :: err
1174  real(kind=realtype) :: length, dot
1175  real(kind=realtype), dimension(3) :: v1, v2, norm
1176  intrinsic sqrt
1177  real(kind=realtype) :: arg1
1178 ! extrapolation in i-direction.
1179  do k=1,kl
1180  do j=1,jl
1181  x(0, j, k, 1) = two*x(1, j, k, 1) - x(2, j, k, 1)
1182  x(0, j, k, 2) = two*x(1, j, k, 2) - x(2, j, k, 2)
1183  x(0, j, k, 3) = two*x(1, j, k, 3) - x(2, j, k, 3)
1184  x(ie, j, k, 1) = two*x(il, j, k, 1) - x(nx, j, k, 1)
1185  x(ie, j, k, 2) = two*x(il, j, k, 2) - x(nx, j, k, 2)
1186  x(ie, j, k, 3) = two*x(il, j, k, 3) - x(nx, j, k, 3)
1187  end do
1188  end do
1189 ! extrapolation in j-direction.
1190  do k=1,kl
1191  do i=0,ie
1192  x(i, 0, k, 1) = two*x(i, 1, k, 1) - x(i, 2, k, 1)
1193  x(i, 0, k, 2) = two*x(i, 1, k, 2) - x(i, 2, k, 2)
1194  x(i, 0, k, 3) = two*x(i, 1, k, 3) - x(i, 2, k, 3)
1195  x(i, je, k, 1) = two*x(i, jl, k, 1) - x(i, ny, k, 1)
1196  x(i, je, k, 2) = two*x(i, jl, k, 2) - x(i, ny, k, 2)
1197  x(i, je, k, 3) = two*x(i, jl, k, 3) - x(i, ny, k, 3)
1198  end do
1199  end do
1200 ! extrapolation in k-direction.
1201  do j=0,je
1202  do i=0,ie
1203  x(i, j, 0, 1) = two*x(i, j, 1, 1) - x(i, j, 2, 1)
1204  x(i, j, 0, 2) = two*x(i, j, 1, 2) - x(i, j, 2, 2)
1205  x(i, j, 0, 3) = two*x(i, j, 1, 3) - x(i, j, 2, 3)
1206  x(i, j, ke, 1) = two*x(i, j, kl, 1) - x(i, j, nz, 1)
1207  x(i, j, ke, 2) = two*x(i, j, kl, 2) - x(i, j, nz, 2)
1208  x(i, j, ke, 3) = two*x(i, j, kl, 3) - x(i, j, nz, 3)
1209  end do
1210  end do
1211 !
1212 ! mirror the halo coordinates adjacent to the symmetry
1213 ! planes
1214 !
1215 ! loop over boundary subfaces.
1216 loopbocos:do mm=1,nbocos
1217 ! the actual correction of the coordinates only takes
1218 ! place for symmetry planes.
1219  if (bctype(mm) .eq. symm) then
1220 ! set some variables, depending on the block face on
1221 ! which the subface is located.
1222  norm(1) = bcdata(mm)%symnorm(1)
1223  norm(2) = bcdata(mm)%symnorm(2)
1224  norm(3) = bcdata(mm)%symnorm(3)
1225  arg1 = norm(1)**2 + norm(2)**2 + norm(3)**2
1226  length = sqrt(arg1)
1227 ! compute the unit normal of the subface.
1228  norm(1) = norm(1)/length
1229  norm(2) = norm(2)/length
1230  norm(3) = norm(3)/length
1231 ! see xhalo_block for comments for below:
1232  if (length .gt. eps) then
1233  select case (bcfaceid(mm))
1234  case (imin)
1235  ibeg = jnbeg(mm)
1236  iend = jnend(mm)
1237  iimax = jl
1238  jbeg = knbeg(mm)
1239  jend = knend(mm)
1240  jjmax = kl
1241  if (ibeg .eq. 1) ibeg = 0
1242  if (iend .eq. iimax) iend = iimax + 1
1243  if (jbeg .eq. 1) jbeg = 0
1244  if (jend .eq. jjmax) jend = jjmax + 1
1245  do j=jbeg,jend
1246  do i=ibeg,iend
1247  v1(1) = x(1, i, j, 1) - x(2, i, j, 1)
1248  v1(2) = x(1, i, j, 2) - x(2, i, j, 2)
1249  v1(3) = x(1, i, j, 3) - x(2, i, j, 3)
1250  dot = two*(v1(1)*norm(1)+v1(2)*norm(2)+v1(3)*norm(3))
1251  x(0, i, j, 1) = x(2, i, j, 1) + dot*norm(1)
1252  x(0, i, j, 2) = x(2, i, j, 2) + dot*norm(2)
1253  x(0, i, j, 3) = x(2, i, j, 3) + dot*norm(3)
1254  end do
1255  end do
1256  case (imax)
1257  ibeg = jnbeg(mm)
1258  iend = jnend(mm)
1259  iimax = jl
1260  jbeg = knbeg(mm)
1261  jend = knend(mm)
1262  jjmax = kl
1263  if (ibeg .eq. 1) ibeg = 0
1264  if (iend .eq. iimax) iend = iimax + 1
1265  if (jbeg .eq. 1) jbeg = 0
1266  if (jend .eq. jjmax) jend = jjmax + 1
1267  do j=jbeg,jend
1268  do i=ibeg,iend
1269  v1(1) = x(il, i, j, 1) - x(nx, i, j, 1)
1270  v1(2) = x(il, i, j, 2) - x(nx, i, j, 2)
1271  v1(3) = x(il, i, j, 3) - x(nx, i, j, 3)
1272  dot = two*(v1(1)*norm(1)+v1(2)*norm(2)+v1(3)*norm(3))
1273  x(ie, i, j, 1) = x(nx, i, j, 1) + dot*norm(1)
1274  x(ie, i, j, 2) = x(nx, i, j, 2) + dot*norm(2)
1275  x(ie, i, j, 3) = x(nx, i, j, 3) + dot*norm(3)
1276  end do
1277  end do
1278  case (jmin)
1279  ibeg = inbeg(mm)
1280  iend = inend(mm)
1281  iimax = il
1282  jbeg = knbeg(mm)
1283  jend = knend(mm)
1284  jjmax = kl
1285  if (ibeg .eq. 1) ibeg = 0
1286  if (iend .eq. iimax) iend = iimax + 1
1287  if (jbeg .eq. 1) jbeg = 0
1288  if (jend .eq. jjmax) jend = jjmax + 1
1289  do j=jbeg,jend
1290  do i=ibeg,iend
1291  v1(1) = x(i, 1, j, 1) - x(i, 2, j, 1)
1292  v1(2) = x(i, 1, j, 2) - x(i, 2, j, 2)
1293  v1(3) = x(i, 1, j, 3) - x(i, 2, j, 3)
1294  dot = two*(v1(1)*norm(1)+v1(2)*norm(2)+v1(3)*norm(3))
1295  x(i, 0, j, 1) = x(i, 2, j, 1) + dot*norm(1)
1296  x(i, 0, j, 2) = x(i, 2, j, 2) + dot*norm(2)
1297  x(i, 0, j, 3) = x(i, 2, j, 3) + dot*norm(3)
1298  end do
1299  end do
1300  case (jmax)
1301  ibeg = inbeg(mm)
1302  iend = inend(mm)
1303  iimax = il
1304  jbeg = knbeg(mm)
1305  jend = knend(mm)
1306  jjmax = kl
1307  if (ibeg .eq. 1) ibeg = 0
1308  if (iend .eq. iimax) iend = iimax + 1
1309  if (jbeg .eq. 1) jbeg = 0
1310  if (jend .eq. jjmax) jend = jjmax + 1
1311  do j=jbeg,jend
1312  do i=ibeg,iend
1313  v1(1) = x(i, jl, j, 1) - x(i, ny, j, 1)
1314  v1(2) = x(i, jl, j, 2) - x(i, ny, j, 2)
1315  v1(3) = x(i, jl, j, 3) - x(i, ny, j, 3)
1316  dot = two*(v1(1)*norm(1)+v1(2)*norm(2)+v1(3)*norm(3))
1317  x(i, je, j, 1) = x(i, ny, j, 1) + dot*norm(1)
1318  x(i, je, j, 2) = x(i, ny, j, 2) + dot*norm(2)
1319  x(i, je, j, 3) = x(i, ny, j, 3) + dot*norm(3)
1320  end do
1321  end do
1322  case (kmin)
1323  ibeg = inbeg(mm)
1324  iend = inend(mm)
1325  iimax = il
1326  jbeg = jnbeg(mm)
1327  jend = jnend(mm)
1328  jjmax = jl
1329  if (ibeg .eq. 1) ibeg = 0
1330  if (iend .eq. iimax) iend = iimax + 1
1331  if (jbeg .eq. 1) jbeg = 0
1332  if (jend .eq. jjmax) jend = jjmax + 1
1333  do j=jbeg,jend
1334  do i=ibeg,iend
1335  v1(1) = x(i, j, 1, 1) - x(i, j, 2, 1)
1336  v1(2) = x(i, j, 1, 2) - x(i, j, 2, 2)
1337  v1(3) = x(i, j, 1, 3) - x(i, j, 2, 3)
1338  dot = two*(v1(1)*norm(1)+v1(2)*norm(2)+v1(3)*norm(3))
1339  x(i, j, 0, 1) = x(i, j, 2, 1) + dot*norm(1)
1340  x(i, j, 0, 2) = x(i, j, 2, 2) + dot*norm(2)
1341  x(i, j, 0, 3) = x(i, j, 2, 3) + dot*norm(3)
1342  end do
1343  end do
1344  case (kmax)
1345  ibeg = inbeg(mm)
1346  iend = inend(mm)
1347  iimax = il
1348  jbeg = jnbeg(mm)
1349  jend = jnend(mm)
1350  jjmax = jl
1351  if (ibeg .eq. 1) ibeg = 0
1352  if (iend .eq. iimax) iend = iimax + 1
1353  if (jbeg .eq. 1) jbeg = 0
1354  if (jend .eq. jjmax) jend = jjmax + 1
1355  do j=jbeg,jend
1356  do i=ibeg,iend
1357  v1(1) = x(i, j, kl, 1) - x(i, j, nz, 1)
1358  v1(2) = x(i, j, kl, 2) - x(i, j, nz, 2)
1359  v1(3) = x(i, j, kl, 3) - x(i, j, nz, 3)
1360  dot = two*(v1(1)*norm(1)+v1(2)*norm(2)+v1(3)*norm(3))
1361  x(i, j, ke, 1) = x(i, j, nz, 1) + dot*norm(1)
1362  x(i, j, ke, 2) = x(i, j, nz, 2) + dot*norm(2)
1363  x(i, j, ke, 3) = x(i, j, nz, 3) + dot*norm(3)
1364  end do
1365  end do
1366  end select
1367  end if
1368  end if
1369  end do loopbocos
1370  end subroutine xhalo_block
1371 
1372 ! differentiation of resscale in forward (tangent) mode (with options i4 dr8 r8):
1373 ! variations of useful results: *dw
1374 ! with respect to varying inputs: *dw
1375 ! rw status of diff variables: *dw:in-out
1376 ! plus diff mem management of: dw:in
1377  subroutine resscale_d()
1378  use constants
1379  use blockpointers, only : il, jl, kl, nx, ny, nz, volref, dw, dwd
1380  use flowvarrefstate, only : nwf, nt1, nt2
1381  use inputiteration, only : turbresscale
1382  implicit none
1383 ! local variables
1384  integer(kind=inttype) :: i, j, k, ii, nturb
1385  real(kind=realtype) :: ovol
1386 ! divide through by the reference volume
1387  nturb = nt2 - nt1 + 1
1388  do k=2,kl
1389  do j=2,jl
1390  do i=2,il
1391  ovol = one/volref(i, j, k)
1392  dwd(i, j, k, 1:nwf) = ovol*dwd(i, j, k, 1:nwf)
1393  dw(i, j, k, 1:nwf) = dw(i, j, k, 1:nwf)*ovol
1394  dwd(i, j, k, nt1:nt2) = ovol*turbresscale(1:nturb)*dwd(i, j, k&
1395 & , nt1:nt2)
1396  dw(i, j, k, nt1:nt2) = dw(i, j, k, nt1:nt2)*ovol*turbresscale(&
1397 & 1:nturb)
1398  end do
1399  end do
1400  end do
1401  end subroutine resscale_d
1402 
1403  subroutine resscale()
1404  use constants
1405  use blockpointers, only : il, jl, kl, nx, ny, nz, volref, dw
1406  use flowvarrefstate, only : nwf, nt1, nt2
1407  use inputiteration, only : turbresscale
1408  implicit none
1409 ! local variables
1410  integer(kind=inttype) :: i, j, k, ii, nturb
1411  real(kind=realtype) :: ovol
1412 ! divide through by the reference volume
1413  nturb = nt2 - nt1 + 1
1414  do k=2,kl
1415  do j=2,jl
1416  do i=2,il
1417  ovol = one/volref(i, j, k)
1418  dw(i, j, k, 1:nwf) = dw(i, j, k, 1:nwf)*ovol
1419  dw(i, j, k, nt1:nt2) = dw(i, j, k, nt1:nt2)*ovol*turbresscale(&
1420 & 1:nturb)
1421  end do
1422  end do
1423  end do
1424  end subroutine resscale
1425 
1426 ! differentiation of sumdwandfw in forward (tangent) mode (with options i4 dr8 r8):
1427 ! variations of useful results: *dw
1428 ! with respect to varying inputs: *dw *fw
1429 ! rw status of diff variables: *dw:in-out *fw:in
1430 ! plus diff mem management of: dw:in fw:in
1431  subroutine sumdwandfw_d()
1432  use constants
1433  use blockpointers, only : il, jl, kl, dw, dwd, fw, fwd, iblank
1434  use flowvarrefstate, only : nwf
1435  implicit none
1436 ! local variables
1437  integer(kind=inttype) :: i, j, k, l
1438  intrinsic real
1439  intrinsic max
1440  real(realtype) :: x1
1441  real(realtype) :: max1
1442  do l=1,nwf
1443  do k=2,kl
1444  do j=2,jl
1445  do i=2,il
1446  x1 = real(iblank(i, j, k), realtype)
1447  if (x1 .lt. zero) then
1448  max1 = zero
1449  else
1450  max1 = x1
1451  end if
1452  dwd(i, j, k, l) = max1*(dwd(i, j, k, l)+fwd(i, j, k, l))
1453  dw(i, j, k, l) = (dw(i, j, k, l)+fw(i, j, k, l))*max1
1454  end do
1455  end do
1456  end do
1457  end do
1458  end subroutine sumdwandfw_d
1459 
1460  subroutine sumdwandfw()
1461  use constants
1462  use blockpointers, only : il, jl, kl, dw, fw, iblank
1463  use flowvarrefstate, only : nwf
1464  implicit none
1465 ! local variables
1466  integer(kind=inttype) :: i, j, k, l
1467  intrinsic real
1468  intrinsic max
1469  real(realtype) :: x1
1470  real(realtype) :: max1
1471  do l=1,nwf
1472  do k=2,kl
1473  do j=2,jl
1474  do i=2,il
1475  x1 = real(iblank(i, j, k), realtype)
1476  if (x1 .lt. zero) then
1477  max1 = zero
1478  else
1479  max1 = x1
1480  end if
1481  dw(i, j, k, l) = (dw(i, j, k, l)+fw(i, j, k, l))*max1
1482  end do
1483  end do
1484  end do
1485  end do
1486  end subroutine sumdwandfw
1487 
1488 end module adjointextra_d
1489 
subroutine volpym(xa, ya, za, xb, yb, zb, xc, yc, zc, xd, yd, zd, volume)
subroutine volpym_d(xa, xad, ya, yad, za, zad, xb, xbd, yb, ybd, zb, zbd, xc, xcd, yc, ycd, zc, zcd, xd, xdd, yd, ydd, zd, zdd, volume, volumed)
subroutine volume_block_d()
subroutine boundarynormals()
subroutine sumdwandfw_d()
subroutine sumdwandfw()
subroutine metric_block()
subroutine resscale()
subroutine xhalo_block_d()
subroutine metric_block_d()
subroutine volume_block()
subroutine boundarynormals_d()
subroutine resscale_d()
subroutine xhalo_block()
Definition: BCData.F90:1
real(kind=realtype), dimension(:, :, :, :), pointer fwd
integer(kind=inttype) jl
integer(kind=inttype), dimension(:), pointer knend
integer(kind=inttype), dimension(:), pointer inend
real(kind=realtype), dimension(:, :, :, :), pointer sjd
integer(kind=inttype), dimension(:), pointer knbeg
real(kind=realtype), dimension(:, :, :), pointer vold
logical righthanded
integer(kind=inttype), dimension(:), pointer jnbeg
integer(kind=inttype) nx
integer(kind=inttype) ny
integer(kind=inttype) ie
type(bcdatatype), dimension(:), pointer bcdatad
integer(kind=inttype), dimension(:, :, :), pointer iblank
real(kind=realtype), dimension(:, :, :, :), pointer skd
integer(kind=inttype), dimension(:), pointer bcfaceid
real(kind=realtype), dimension(:, :, :, :), pointer si
real(kind=realtype), dimension(:, :, :, :), pointer sid
integer(kind=inttype) nbocos
real(kind=realtype), dimension(:, :, :), pointer volref
real(kind=realtype), dimension(:, :, :, :), pointer sj
integer(kind=inttype), dimension(:), pointer jnend
integer(kind=inttype), dimension(:), pointer bctype
real(kind=realtype), dimension(:, :, :, :), pointer dw
real(kind=realtype), dimension(:, :, :, :), pointer sk
real(kind=realtype), dimension(:, :, :), pointer vol
real(kind=realtype), dimension(:, :, :, :), pointer xd
real(kind=realtype), dimension(:, :, :, :), pointer fw
integer(kind=inttype) nz
integer(kind=inttype) je
integer(kind=inttype) ke
real(kind=realtype), dimension(:, :, :, :), pointer x
integer(kind=inttype), dimension(:), pointer inbeg
real(kind=realtype), dimension(:, :, :, :), pointer dwd
integer(kind=inttype) kl
integer(kind=inttype) il
real(kind=realtype), parameter zero
Definition: constants.F90:71
integer(kind=inttype), parameter imax
Definition: constants.F90:293
integer(kind=inttype), parameter kmin
Definition: constants.F90:296
integer(kind=inttype), parameter jmax
Definition: constants.F90:295
real(kind=realtype), parameter eps
Definition: constants.F90:23
real(kind=realtype), parameter eighth
Definition: constants.F90:84
integer(kind=inttype), parameter symm
Definition: constants.F90:258
real(kind=realtype), parameter one
Definition: constants.F90:72
real(kind=realtype), parameter half
Definition: constants.F90:80
integer(kind=inttype), parameter imin
Definition: constants.F90:292
real(kind=realtype), parameter two
Definition: constants.F90:73
real(kind=realtype), parameter fourth
Definition: constants.F90:82
integer(kind=inttype), parameter kmax
Definition: constants.F90:297
integer(kind=inttype), parameter jmin
Definition: constants.F90:294
real(kind=realtype), parameter sixth
Definition: constants.F90:83
integer(kind=inttype) isize1ofdrfbcdata
Definition: diffSizes.f90:8
integer(kind=inttype) nt1
integer(kind=inttype) nwf
integer(kind=inttype) nt2
real(kind=realtype), dimension(4) turbresscale
Definition: inputParam.F90:293
integer, parameter realtype
Definition: precision.F90:112