57 & Lstr, Lend, itime, ifield, isBval, &
58 & gtype, maskit, Fspval, nudg, &
66 & A, my_thread, bounded, track)
78 integer,
intent(in) :: ng, lbi, ubi, lbj, ubj, lbk, ubk
79 integer,
intent(in) :: lstr, lend, itime, ifield, isbval, gtype
81 logical,
intent(in) :: maskit
82 logical,
intent(in) :: my_thread(lstr:lend)
83 logical,
intent(in) :: bounded(
nfloats(ng))
85 real(dp),
intent(in) :: fspval
87 real(r8),
intent(in) :: nudg(lstr:lend)
89 real(r8),
intent(in) :: pm(lbi:ubi,lbj:ubj)
90 real(r8),
intent(in) :: pn(lbi:ubi,lbj:ubj)
92 real(r8),
intent(in) :: hz(lbi:ubi,lbj:ubj,ubk)
95 real(r8),
intent(in) :: amask(lbi:ubi,lbj:ubj)
97 real(r8),
intent(in) :: a(lbi:ubi,lbj:ubj,lbk:ubk)
103 logical :: irvar, iuvar, jrvar, jvvar, krvar, kwvar, lmask
106 integer :: ir, iu, jr, jv, kr, kw, l
107 integer :: i1, i2, j1, j2, k1, k2, khm, khp, vtype
109 real(r8) :: p1, p2, q1, q2, r1, r2
110 real(r8) :: s111, s211, s121, s221, s112, s212, s122, s222
111 real(r8) :: t111, t211, t121, t221, t112, t212, t122, t222
114 integer :: irn, irnm1, irnp1, jrn, jrnm1, jrnp1
116 real(r8) :: cff1, cff2, cff3
172 IF (my_thread(l))
THEN
173 IF (.not.bounded(l))
THEN
174 track(ifield,itime,l)=fspval
180 kr=int(track(
izgrd,itime,l)+0.5_r8)
181 k1=min(max(kr ,1),
n(ng))
182 k2=min(max(kr+1,1),
n(ng))
183 r2=real(k2-k1,r8)*(track(
izgrd,itime,l)+ &
184 & 0.5_r8-real(k1,r8))
186 kw=int(track(
izgrd,itime,l))
187 k1=min(max(kw ,0),
n(ng))
188 k2=min(max(kw+1,0),
n(ng))
189 r2=real(k2-k1,r8)*(track(
izgrd,itime,l)-real(k1,r8))
201 IF (irvar.and.jrvar)
THEN
203 ir=int(track(
ixgrd,itime,l))
204 jr=int(track(
iygrd,itime,l))
206 i1=min(max(ir ,0),
lm(ng)+1)
207 i2=min(max(ir+1,1),
lm(ng)+1)
208 j1=min(max(jr ,0),
mm(ng)+1)
209 j2=min(max(jr+1,1),
mm(ng)+1)
211 p2=real(i2-i1,r8)*(track(
ixgrd,itime,l)-real(i1,r8))
212 q2=real(j2-j1,r8)*(track(
iygrd,itime,l)-real(j1,r8))
217 IF (gtype.eq.-
w3dvar)
THEN
218 khm=min(max(k1 ,1),
n(ng))
219 khp=min(max(k1+1,1),
n(ng))
220 s111=2.0_r8*pm(i1,j1)*pn(i1,j1)/ &
221 & (hz(i1,j1,khm)+hz(i1,j1,khp))
222 s211=2.0_r8*pm(i2,j1)*pn(i2,j1)/ &
223 & (hz(i2,j1,khm)+hz(i2,j1,khp))
224 s121=2.0_r8*pm(i1,j2)*pn(i1,j2)/ &
225 & (hz(i1,j2,khm)+hz(i1,j2,khp))
226 s221=2.0_r8*pm(i2,j2)*pn(i2,j2)/ &
227 & (hz(i2,j2,khm)+hz(i2,j2,khp))
228 t111=2.0_r8/(hz(i1,j1,khm)+hz(i1,j1,khp))
229 t211=2.0_r8/(hz(i2,j1,khm)+hz(i2,j1,khp))
230 t121=2.0_r8/(hz(i1,j2,khm)+hz(i1,j2,khp))
231 t221=2.0_r8/(hz(i2,j2,khm)+hz(i2,j2,khp))
232 khm=min(max(k2 ,1),
n(ng))
233 khp=min(max(k2+1,1),
n(ng))
234 s112=2.0_r8*pm(i1,j1)*pn(i1,j1)/ &
235 & (hz(i1,j1,khm)+hz(i1,j1,khp))
236 s212=2.0_r8*pm(i2,j1)*pn(i2,j1)/ &
237 & (hz(i2,j1,khm)+hz(i2,j1,khp))
238 s122=2.0_r8*pm(i1,j2)*pn(i1,j2)/ &
239 & (hz(i1,j2,khm)+hz(i1,j2,khp))
240 s222=2.0_r8*pm(i2,j2)*pn(i2,j2)/ &
241 & (hz(i2,j2,khm)+hz(i2,j2,khp))
242 t112=2.0_r8/(hz(i1,j1,khm)+hz(i1,j1,khp))
243 t212=2.0_r8/(hz(i2,j1,khm)+hz(i2,j1,khp))
244 t122=2.0_r8/(hz(i1,j2,khm)+hz(i1,j2,khp))
245 t222=2.0_r8/(hz(i2,j2,khm)+hz(i2,j2,khp))
251 cff1=p1*q1*r1*amask(i1,j1)+ &
252 & p2*q1*r1*amask(i2,j1)+ &
253 & p1*q2*r1*amask(i1,j2)+ &
254 & p2*q2*r1*amask(i2,j2)+ &
255 & p1*q1*r2*amask(i1,j1)+ &
256 & p2*q1*r2*amask(i2,j1)+ &
257 & p1*q2*r2*amask(i1,j2)+ &
258 & p2*q2*r2*amask(i2,j2)
259 IF (cff1.gt.0.0_r8)
THEN
260 cff2=p1*q1*r1*amask(i1,j1)*s111*a(i1,j1,k1)+ &
261 & p2*q1*r1*amask(i2,j1)*s211*a(i2,j1,k1)+ &
262 & p1*q2*r1*amask(i1,j2)*s121*a(i1,j2,k1)+ &
263 & p2*q2*r1*amask(i2,j2)*s221*a(i2,j2,k1)+ &
264 & p1*q1*r2*amask(i1,j1)*s112*a(i1,j1,k2)+ &
265 & p2*q1*r2*amask(i2,j1)*s212*a(i2,j1,k2)+ &
266 & p1*q2*r2*amask(i1,j2)*s122*a(i1,j2,k2)+ &
267 & p2*q2*r2*amask(i2,j2)*s222*a(i2,j2,k2)
268 cff3=(p1*q1*r1*amask(i1,j1)*t111+ &
269 & p2*q1*r1*amask(i2,j1)*t211+ &
270 & p1*q2*r1*amask(i1,j2)*t121+ &
271 & p2*q2*r1*amask(i2,j2)*t221+ &
272 & p1*q1*r2*amask(i1,j1)*t112+ &
273 & p2*q1*r2*amask(i2,j1)*t212+ &
274 & p1*q2*r2*amask(i1,j2)*t122+ &
275 & p2*q2*r2*amask(i2,j2)*t222)*nudg(l)
276 track(ifield,itime,l)=cff2/cff1+cff3
278 track(ifield,itime,l)=0.0_r8
282 track(ifield,itime,l)=p1*q1*r1*s111*a(i1,j1,k1)+ &
283 & p2*q1*r1*s211*a(i2,j1,k1)+ &
284 & p1*q2*r1*s121*a(i1,j2,k1)+ &
285 & p2*q2*r1*s221*a(i2,j2,k1)+ &
286 & p1*q1*r2*s112*a(i1,j1,k2)+ &
287 & p2*q1*r2*s212*a(i2,j1,k2)+ &
288 & p1*q2*r2*s122*a(i1,j2,k2)+ &
289 & p2*q2*r2*s222*a(i2,j2,k2)+ &
297 & p2*q2*r2*t222)*nudg(l)
305 ir=int(track(
ixgrd,itime,l))
306 jr=int(track(
iygrd,itime,l))
307 iu=int(track(
ixgrd,itime,l)+0.5_r8)
308 jv=int(track(
iygrd,itime,l)+0.5_r8)
327 irn=nint(track(
ixgrd,itime,l))
328 jrn=nint(track(
iygrd,itime,l))
330 IF (irn.ge.
lm(ng))
THEN
345 IF (jrn.ge.
mm(ng))
THEN
359 IF (amask(irn,jrn).lt.0.5_r8)
THEN
361 ELSE IF ((ir.lt.irn).and. &
362 & (amask(irn-1,jrn).lt.0.5_r8))
THEN
364 ELSE IF ((ir.eq.irn).and. &
365 & (amask(irn+1,jrn).lt.0.5_r8))
THEN
367 ELSE IF ((jr.lt.jrn).and. &
368 & (amask(irn,jrn-1).lt.0.5_r8))
THEN
370 ELSE IF ((jr.eq.jrn).and. &
371 & (amask(irn,jrn+1).lt.0.5_r8))
THEN
373 ELSE IF ((ir.lt.irn).and.(jr.lt.jrn).and. &
374 & (amask(irn-1,jrn-1).lt.0.5_r8))
THEN
376 ELSE IF ((ir.eq.irn).and.(jr.lt.jrn).and. &
377 & (amask(irn+1,jrn-1).lt.0.5_r8))
THEN
379 ELSE IF ((ir.lt.irn).and.(jr.eq.jrn).and. &
380 & (amask(irn-1,jrn+1).lt.0.5_r8))
THEN
382 ELSE IF ((ir.eq.irn).and.(jr.eq.jrn).and. &
383 & (amask(irn+1,jrn+1).lt.0.5_r8))
THEN
402 i1=min(max(iu ,1),
lm(ng)+1)
403 i2=min(max(iu+1,1),
lm(ng)+1)
407 & (track(
ixgrd,itime,l)-real(i1,r8)+0.5_r8)
412 s111=0.5_r8*(pm(i1-1,j1)+pm(i1,j1))
413 s211=0.5_r8*(pm(i2-1,j1)+pm(i2,j1))
418 track(ifield,itime,l)=p1*q1*r1*s111*a(i1,j1,k1)+ &
419 & p2*q1*r1*s211*a(i2,j1,k1)+ &
420 & p1*q1*r2*s112*a(i1,j1,k2)+ &
421 & p2*q1*r2*s212*a(i2,j1,k2)+ &
428 i1=min(max(iu ,1),
lm(ng)+1)
429 i2=min(max(iu+1,1),
lm(ng)+1)
430 j1=min(max(jr ,0),
mm(ng)+1)
431 j2=min(max(jr+1,0),
mm(ng)+1)
434 & (track(
ixgrd,itime,l)-real(i1,r8)+0.5_r8)
436 & (track(
iygrd,itime,l)-real(j1,r8))
441 s111=0.5_r8*(pm(i1-1,j1)+pm(i1,j1))
442 s211=0.5_r8*(pm(i2-1,j1)+pm(i2,j1))
443 s121=0.5_r8*(pm(i1-1,j2)+pm(i1,j2))
444 s221=0.5_r8*(pm(i2-1,j2)+pm(i2,j2))
451 track(ifield,itime,l)=p1*q1*r1*s111*a(i1,j1,k1)+ &
452 & p2*q1*r1*s211*a(i2,j1,k1)+ &
453 & p1*q2*r1*s121*a(i1,j2,k1)+ &
454 & p2*q2*r1*s221*a(i2,j2,k1)+ &
455 & p1*q1*r2*s112*a(i1,j1,k2)+ &
456 & p2*q1*r2*s212*a(i2,j1,k2)+ &
457 & p1*q2*r2*s122*a(i1,j2,k2)+ &
458 & p2*q2*r2*s222*a(i2,j2,k2)+ &
476 j1=min(max(jv ,1),
mm(ng)+1)
477 j2=min(max(jv+1,1),
mm(ng)+1)
480 & (track(
iygrd,itime,l)-real(j1,r8)+0.5_r8)
485 s111=0.5_r8*(pn(i1,j1-1)+pn(i1,j1))
486 s121=0.5_r8*(pn(i1,j2-1)+pn(i1,j2))
491 track(ifield,itime,l)=p1*q1*r1*s111*a(i1,j1,k1)+ &
492 & p1*q2*r1*s121*a(i1,j2,k1)+ &
493 & p1*q1*r2*s112*a(i1,j1,k2)+ &
494 & p1*q2*r2*s122*a(i1,j2,k2)+ &
501 i1=min(max(ir ,0),
lm(ng)+1)
502 i2=min(max(ir+1,1),
lm(ng)+1)
503 j1=min(max(jv ,1),
mm(ng)+1)
504 j2=min(max(jv+1,1),
mm(ng)+1)
507 & (track(
ixgrd,itime,l)-real(i1,r8))
509 & (track(
iygrd,itime,l)-real(j1,r8)+0.5_r8)
514 s111=0.5_r8*(pn(i1,j1-1)+pn(i1,j1))
515 s211=0.5_r8*(pn(i2,j1-1)+pn(i2,j1))
516 s121=0.5_r8*(pn(i1,j2-1)+pn(i1,j2))
517 s221=0.5_r8*(pn(i2,j2-1)+pn(i2,j2))
524 track(ifield,itime,l)=p1*q1*r1*s111*a(i1,j1,k1)+ &
525 & p2*q1*r1*s211*a(i2,j1,k1)+ &
526 & p1*q2*r1*s121*a(i1,j2,k1)+ &
527 & p2*q2*r1*s221*a(i2,j2,k1)+ &
528 & p1*q1*r2*s112*a(i1,j1,k2)+ &
529 & p2*q1*r2*s212*a(i2,j1,k2)+ &
530 & p1*q2*r2*s122*a(i1,j2,k2)+ &
531 & p2*q2*r2*s222*a(i2,j2,k2)+ &