82 & nfm3, nfm2, nfm1, nf, nfp1, &
83 & bounded, Ftype, Tinfo, Fz0, &
84# if defined SOLVE3D && defined FLOAT_STICKY
106# if defined SOLVE3D && defined FLOAT_VWALK
112 integer,
intent(in) :: ng, Lstr, Lend
113 integer,
intent(in) :: knew, nnew, nfm3, nfm2, nfm1, nf, nfp1
116 integer,
intent(in) :: Ftype(:)
117 real(r8),
intent(in) :: Tinfo(0:,:)
118 real(r8),
intent(in) :: Fz0(:)
120 logical,
intent(inout) :: bounded(:)
121# if defined SOLVE3D && defined FLOAT_STICKY
122 logical,
intent(inout) :: stuck(:)
124 real(r8),
intent(inout) :: track(:,0:,:)
126 integer,
intent(in) :: Ftype(Nfloats(ng))
127 real(r8),
intent(in) :: Tinfo(0:izrhs,Nfloats(ng))
128 real(r8),
intent(in) :: Fz0(Nfloats(ng))
130 logical,
intent(inout) :: bounded(Nfloats(ng))
131# if defined SOLVE3D && defined FLOAT_STICKY
132 logical,
intent(inout) :: stuck(Nfloats(ng))
134 real(r8),
intent(inout) :: track(NFV(ng),0:NFT,Nfloats(ng))
139 logical,
parameter :: Gmask = .false.
141 logical,
parameter :: Lmask = .true.
143 logical,
parameter :: Lmask = .false.
145 logical,
dimension(Lstr:Lend) :: my_thread
147 integer :: LBi, UBi, LBj, UBj
148 integer :: Ir, Jr, Npts, i, i1, i2, j, j1, j2, itrc, l, k
150 real(r8),
parameter :: Fspv = 0.0_r8
152 real(r8) :: cff1, cff2, cff3, cff4, cff5, cff6, cff7, cff8, cff9
153 real(r8) :: oHz, p1, p2, q1, q2, xrhs, yrhs, zrhs, zfloat
156 real(r8),
dimension(Lstr:Lend) :: nudg
159 real(r8) :: Xstr, Xend, Ystr, Yend
160 real(r8),
dimension(Nfloats(ng)*NFV(ng)*(NFT+1)) :: Fwrk
165 lbi=lbound(
grid(ng)%h,dim=1)
166 ubi=ubound(
grid(ng)%h,dim=1)
167 lbj=lbound(
grid(ng)%h,dim=2)
168 ubj=ubound(
grid(ng)%h,dim=2)
185 npts=nfv(ng)*(nft+1)*nfloats(ng)
193 IF ((xstr.le.track(
ixgrd,nf,l)).and. &
194 & (track(
ixgrd,nf,l).lt.xend).and. &
195 & (ystr.le.track(
iygrd,nf,l)).and. &
196 & (track(
iygrd,nf,l).lt.yend))
THEN
198 ELSE IF (
master.and.(.not.bounded(l)))
THEN
218# if !(defined SOLVE3D && defined FLOAT_VWALK)
223# if defined SOLVE3D && defined FLOAT_VWALK
230 CALL vwalk_floats (ng, lstr, lend, .true., my_thread, nudg)
241 IF (my_thread(l).and.bounded(l))
THEN
243 &
dt(ng)*(cff1*track(
ixrhs,nf ,l)- &
244 & cff2*track(
ixrhs,nfm1,l)+ &
245 & cff1*track(
ixrhs,nfm2,l))
247 &
dt(ng)*(cff1*track(
iyrhs,nf ,l)- &
248 & cff2*track(
iyrhs,nfm1,l)+ &
249 & cff1*track(
iyrhs,nfm2,l))
251# if defined SOLVE3D && !defined FLOAT_VWALK
258 &
dt(ng)*(cff1*track(izrhs,nf ,l)- &
259 & cff2*track(izrhs,nfm1,l)+ &
260 & cff1*track(izrhs,nfm2,l)+ &
261 & cff1*track(
iwbio,nf ,l)* &
262 & track(
i1ohz,nf ,l)- &
263 & cff2*track(
iwbio,nfm1,l)* &
264 & track(
i1ohz,nfm1,l)+ &
265 & cff1*track(
iwbio,nfm2,l)* &
266 & track(
i1ohz,nfm2,l))
269 &
dt(ng)*(cff1*track(izrhs,nf ,l)- &
270 & cff2*track(izrhs,nfm1,l)+ &
271 & cff1*track(izrhs,nfm2,l))
280 ir=int(track(
ixgrd,nfp1,l))
281 jr=int(track(
iygrd,nfp1,l))
283 i1=min(max(ir ,0),
lm(ng)+1)
284 i2=min(max(ir+1,1),
lm(ng)+1)
285 j1=min(max(jr ,0),
mm(ng)+1)
286 j2=min(max(jr+1,0),
mm(ng)+1)
288 p2=real(i2-i1,r8)*(track(
ixgrd,nfp1,l)-real(i1,r8))
289 q2=real(j2-j1,r8)*(track(
iygrd,nfp1,l)-real(j1,r8))
293 cff7=p1*q1*
grid(ng)%z_w(i1,j1,
n(ng))*
grid(ng)%rmask(i1,j1)+ &
294 & p2*q1*
grid(ng)%z_w(i2,j1,
n(ng))*
grid(ng)%rmask(i2,j1)+ &
295 & p1*q2*
grid(ng)%z_w(i1,j2,
n(ng))*
grid(ng)%rmask(i1,j2)+ &
296 & p2*q2*
grid(ng)%z_w(i2,j2,
n(ng))*
grid(ng)%rmask(i2,j2)
297 cff8=p1*q1*
grid(ng)%rmask(i1,j1)+ &
298 & p2*q1*
grid(ng)%rmask(i2,j1)+ &
299 & p1*q2*
grid(ng)%rmask(i1,j2)+ &
300 & p2*q2*
grid(ng)%rmask(i2,j2)
302 IF (cff8.gt.0.0_r8) cff9=cff7/cff8
304 cff9=p1*q1*
grid(ng)%z_w(i1,j1,
n(ng))+ &
305 & p2*q1*
grid(ng)%z_w(i2,j1,
n(ng))+ &
306 & p1*q2*
grid(ng)%z_w(i1,j2,
n(ng))+ &
307 & p2*q2*
grid(ng)%z_w(i2,j2,
n(ng))
319 cff7=p1*q1*
grid(ng)%z_w(i1,j1,k)*
grid(ng)%rmask(i1,j1)+ &
320 & p2*q1*
grid(ng)%z_w(i2,j1,k)*
grid(ng)%rmask(i2,j1)+ &
321 & p1*q2*
grid(ng)%z_w(i1,j2,k)*
grid(ng)%rmask(i1,j2)+ &
322 & p2*q2*
grid(ng)%z_w(i2,j2,k)*
grid(ng)%rmask(i2,j2)
323 cff8=p1*q1*
grid(ng)%rmask(i1,j1)+ &
324 & p2*q1*
grid(ng)%rmask(i2,j1)+ &
325 & p1*q2*
grid(ng)%rmask(i1,j2)+ &
326 & p2*q2*
grid(ng)%rmask(i2,j2)
327 IF (cff8.gt.0.0_r8)
THEN
333 cff5=p1*q1*
grid(ng)%z_w(i1,j1,k)+ &
334 & p2*q1*
grid(ng)%z_w(i2,j1,k)+ &
335 & p1*q2*
grid(ng)%z_w(i1,j2,k)+ &
336 & p2*q2*
grid(ng)%z_w(i2,j2,k)
338 IF ((zfloat-cff5)*(cff6-zfloat).ge.0.0_r8)
THEN
339 track(
izgrd,nfp1,l)=real(k,r8)+(zfloat-cff5)/(cff6-cff5)
360 &
grid(ng) % rmask, &
362 &
ocean(ng) % u(:,:,:,nnew), &
363 & my_thread, bounded, track)
372 &
grid(ng) % rmask, &
374 &
ocean(ng) % v(:,:,:,nnew), &
375 & my_thread, bounded, track)
377# if !defined FLOAT_VWALK
379 & lstr, lend, nfp1, izrhs,
isbw3d, &
385 &
grid(ng) % rmask, &
388 & my_thread, bounded, track)
390# if defined FLOAT_BIOLOGY
393 &
r3dvar, gmask, fspv, nudg, &
398 &
grid(ng) % rmask, &
401 & my_thread, bounded, track)
403 IF (my_thread(l).and.bounded(l))
THEN
404 track(
i1ohz,nfp1,l)=1.0_r8/track(
i1ohz,nfp1,l)
415 &
grid(ng) % rmask, &
417 &
ocean(ng) % ubar(:,:,knew), &
418 & my_thread, bounded, track)
426 &
grid(ng) % rmask, &
428 &
ocean(ng) % vbar(:,:,knew), &
429 & my_thread, bounded, track)
443 & lstr, lend, nfp1,
iftvar(itrc), &
449 &
grid(ng) % rmask, &
451 &
ocean(ng) % t(:,:,:,nnew,itrc), &
452 & my_thread, bounded, track)
470 IF (my_thread(l).and.bounded(l))
THEN
471 track(
ixgrd,nfp1,l)=cff1*track(
ixgrd,nf ,l)- &
472 & cff2*track(
ixgrd,nfm2,l)+ &
473 &
dt(ng)*(cff3*track(
ixrhs,nfp1,l)+ &
474 & cff4*track(
ixrhs,nf ,l)- &
475 & cff3*track(
ixrhs,nfm1,l))
476 track(
iygrd,nfp1,l)=cff1*track(
iygrd,nf ,l)- &
477 & cff2*track(
iygrd,nfm2,l)+ &
478 &
dt(ng)*(cff3*track(
iyrhs,nfp1,l)+ &
479 & cff4*track(
iyrhs,nf ,l)- &
480 & cff3*track(
iyrhs,nfm1,l))
482# if defined SOLVE3D && !defined FLOAT_VWALK
487# if defined FLOAT_BIOLOGY
488 track(
izgrd,nfp1,l)=cff1*track(
izgrd,nf ,l)- &
489 & cff2*track(
izgrd,nfm2,l)+ &
490 &
dt(ng)*(cff3*track(izrhs,nfp1,l)+ &
491 & cff4*track(izrhs,nf ,l)- &
492 & cff3*track(izrhs,nfm1,l)+ &
493 & cff3*track(
iwbio,nfp1,l)* &
494 & track(
i1ohz,nfp1,l)+ &
495 & cff4*track(
iwbio,nf ,l)* &
496 & track(
i1ohz,nf ,l)- &
497 & cff3*track(
iwbio,nfm1,l)* &
498 & track(
i1ohz,nf ,l))
500 track(
izgrd,nfp1,l)=cff1*track(
izgrd,nf ,l)- &
501 & cff2*track(
izgrd,nfm2,l)+ &
502 &
dt(ng)*(cff3*track(izrhs,nfp1,l)+ &
503 & cff4*track(izrhs,nf ,l)- &
504 & cff3*track(izrhs,nfm1,l))
513 ir=int(track(
ixgrd,nfp1,l))
514 jr=int(track(
iygrd,nfp1,l))
516 i1=min(max(ir ,0),
lm(ng)+1)
517 i2=min(max(ir+1,1),
lm(ng)+1)
518 j1=min(max(jr ,0),
mm(ng)+1)
519 j2=min(max(jr+1,0),
mm(ng)+1)
521 p2=real(i2-i1,r8)*(track(
ixgrd,nfp1,l)-real(i1,r8))
522 q2=real(j2-j1,r8)*(track(
iygrd,nfp1,l)-real(j1,r8))
526 cff7=p1*q1*
grid(ng)%z_w(i1,j1,
n(ng))*
grid(ng)%rmask(i1,j1)+ &
527 & p2*q1*
grid(ng)%z_w(i2,j1,
n(ng))*
grid(ng)%rmask(i2,j1)+ &
528 & p1*q2*
grid(ng)%z_w(i1,j2,
n(ng))*
grid(ng)%rmask(i1,j2)+ &
529 & p2*q2*
grid(ng)%z_w(i2,j2,
n(ng))*
grid(ng)%rmask(i2,j2)
530 cff8=p1*q1*
grid(ng)%rmask(i1,j1)+ &
531 & p2*q1*
grid(ng)%rmask(i2,j1)+ &
532 & p1*q2*
grid(ng)%rmask(i1,j2)+ &
533 & p2*q2*
grid(ng)%rmask(i2,j2)
534 IF (cff8.gt.0.0_r8)
THEN
540 cff9=p1*q1*
grid(ng)%z_w(i1,j1,
n(ng))+ &
541 & p2*q1*
grid(ng)%z_w(i2,j1,
n(ng))+ &
542 & p1*q2*
grid(ng)%z_w(i1,j2,
n(ng))+ &
543 & p2*q2*
grid(ng)%z_w(i2,j2,
n(ng))
555 cff7=p1*q1*
grid(ng)%z_w(i1,j1,k)*
grid(ng)%rmask(i1,j1)+ &
556 & p2*q1*
grid(ng)%z_w(i2,j1,k)*
grid(ng)%rmask(i2,j1)+ &
557 & p1*q2*
grid(ng)%z_w(i1,j2,k)*
grid(ng)%rmask(i1,j2)+ &
558 & p2*q2*
grid(ng)%z_w(i2,j2,k)*
grid(ng)%rmask(i2,j2)
559 cff8=p1*q1*
grid(ng)%rmask(i1,j1)+ &
560 & p2*q1*
grid(ng)%rmask(i2,j1)+ &
561 & p1*q2*
grid(ng)%rmask(i1,j2)+ &
562 & p2*q2*
grid(ng)%rmask(i2,j2)
564 IF (cff8.gt.0.0_r8) cff5=cff7/cff8
566 cff5=p1*q1*
grid(ng)%z_w(i1,j1,k)+ &
567 & p2*q1*
grid(ng)%z_w(i2,j1,k)+ &
568 & p1*q2*
grid(ng)%z_w(i1,j2,k)+ &
569 & p2*q2*
grid(ng)%z_w(i2,j2,k)
571 IF ((zfloat-cff5)*(cff6-zfloat).ge.0.0_r8)
THEN
572 track(
izgrd,nfp1,l)=real(k,r8)+(zfloat-cff5)/(cff6-cff5)
588 IF (my_thread(l).and.bounded(l))
THEN
589 IF (track(
ixgrd,nfp1,l).ge.real(
lm(ng)+1,r8)-0.5_r8)
THEN
595 ELSE IF (track(
ixgrd,nfp1,l).lt.0.5_r8)
THEN
606 fwrk=reshape(track,(/npts/))
608 track=reshape(fwrk,(/nfv(ng),nft+1,nfloats(ng)/))
610 IF ((xstr.le.track(
ixgrd,nfp1,l)).and. &
611 & (track(
ixgrd,nfp1,l).lt.xend).and. &
612 & (ystr.le.track(
iygrd,nfp1,l)).and. &
613 & (track(
iygrd,nfp1,l).lt.yend))
THEN
615 ELSE IF (
master.and.(.not.bounded(l)))
THEN
630 IF (my_thread(l).and.bounded(l))
THEN
631 IF ((track(
ixgrd,nfp1,l).ge.real(
lm(ng)+1,r8)-0.5_r8).or. &
632 & (track(
ixgrd,nfp1,l).lt.0.5_r8))
THEN
642 IF (my_thread(l).and.bounded(l))
THEN
643 IF (track(
iygrd,nfp1,l).ge.real(
mm(ng)+1,r8)-0.5_r8)
THEN
649 ELSE IF (track(
iygrd,nfp1,l).lt.0.5_r8)
THEN
660 fwrk=reshape(track,(/npts/))
662 track=reshape(fwrk,(/nfv(ng),nft+1,nfloats(ng)/))
664 IF ((xstr.le.track(
ixgrd,nfp1,l)).and. &
665 & (track(
ixgrd,nfp1,l).lt.xend).and. &
666 & (ystr.le.track(
iygrd,nfp1,l)).and. &
667 & (track(
iygrd,nfp1,l).lt.yend))
THEN
669 ELSE IF (
master.and.(.not.bounded(l)))
THEN
684 IF (my_thread(l).and.bounded(l))
THEN
685 IF ((track(
iygrd,nfp1,l).ge.real(
mm(ng)+1,r8)-0.5_r8).or. &
686 & (track(
iygrd,nfp1,l).lt.0.5_r8))
THEN
701 IF (.not.bounded(l).and. &
702 & (
time(ng)-halfdt.le.tinfo(
itstr,l).and. &
703 &
time(ng)+halfdt.gt.tinfo(
itstr,l)))
THEN
705 IF ((tinfo(
ixgrd,l).lt.0.5_r8).or. &
706 & (tinfo(
iygrd,l).lt.0.5_r8).or. &
707 & (tinfo(
ixgrd,l).gt.real(
lm(ng),r8)+0.5_r8).or. &
708 & (tinfo(
iygrd,l).gt.real(
mm(ng),r8)+0.5_r8))
THEN
711# if defined SOLVE3D && defined FLOAT_STICKY
715 IF ((xstr.le.tinfo(
ixgrd,l)).and. &
716 & (tinfo(
ixgrd,l).lt.xend).and. &
717 & (ystr.le.tinfo(
iygrd,l)).and. &
718 & (tinfo(
iygrd,l).lt.yend).and.bounded(l))
THEN
762 &
grid(ng) % rmask, &
764 &
ocean(ng) % u(:,:,:,nnew), &
765 & my_thread, bounded, track)
774 &
grid(ng) % rmask, &
776 &
ocean(ng) % v(:,:,:,nnew), &
777 & my_thread, bounded, track)
779# if !defined FLOAT_VWALK
781 & lstr, lend, nfp1, izrhs,
isbw3d, &
787 &
grid(ng) % rmask, &
790 & my_thread, bounded, track)
795 &
r3dvar, gmask, fspv, nudg, &
800 &
grid(ng) % rmask, &
803 & my_thread, bounded, track)
805 IF (my_thread(l).and.bounded(l))
THEN
806 track(
i1ohz,nfp1,l)=1.0_r8/track(
i1ohz,nfp1,l)
817 &
grid(ng) % rmask, &
819 &
ocean(ng) % ubar(:,:,knew), &
820 & my_thread, bounded, track)
828 &
grid(ng) % rmask, &
830 &
ocean(ng) % vbar(:,:,knew), &
831 & my_thread, bounded, track)
837 IF (my_thread(l).and.bounded(l).and. &
838 & (
time(ng)-halfdt.le.tinfo(
itstr,l).and. &
839 &
time(ng)+halfdt.gt.tinfo(
itstr,l)))
THEN
840 xrhs=track(
ixrhs,nfp1,l)
841 yrhs=track(
iyrhs,nfp1,l)
843 zrhs=track(izrhs,nfp1,l)
846 ohz=track(
i1ohz,nfp1,l)
849 track(
ixrhs,i,l)=xrhs
850 track(
iyrhs,i,l)=yrhs
852 track(izrhs,i,l)=zrhs
875 &
grid(ng) % rmask, &
878 & my_thread, bounded, track)
889 &
grid(ng) % rmask, &
892 & my_thread, bounded, track)
903 &
grid(ng) % rmask, &
906 & my_thread, bounded, track)
917 &
grid(ng) % rmask, &
920 & my_thread, bounded, track)
930 &
grid(ng) % rmask, &
933 & my_thread, bounded, track)
942 &
grid(ng) % rmask, &
945 & my_thread, bounded, track)
949 & lstr, lend, nfp1,
iftvar(itrc), &
955 &
grid(ng) % rmask, &
957 &
ocean(ng) % t(:,:,:,nnew,itrc), &
958 & my_thread, bounded, track)
969# if defined SOLVE3D && defined FLOAT_VWALK && !defined VWALK_FORWARD
976 CALL vwalk_floats (ng, lstr, lend, .false., my_thread, nudg)
985 IF (my_thread(l).and.bounded(l))
THEN
991 IF (track(
izgrd,nfp1,l).gt.real(
n(ng),r8))
THEN
993 track(
izgrd,j,l)=2.0_r8*real(
n(ng),r8)- &
996 ELSE IF (track(
izgrd,nfp1,l).lt.0.0_r8)
THEN
998 track(
izgrd,j,l)=0.0_r8
1010 IF (my_thread(l).and.bounded(l))
THEN
1011 IF (track(
izgrd,nfp1,l).gt.real(
n(ng),r8))
THEN
1013 track(
izgrd,j,l)=2.0_r8*real(
n(ng),r8)-track(
izgrd,j,l)
1015 ELSE IF (track(
izgrd,nfp1,l).lt.0.0_r8)
THEN
1030 fwrk=reshape(track,(/npts/))
1032 track=reshape(fwrk,(/nfv(ng),nft+1,nfloats(ng)/))
1038 IF (bounded(l))
THEN
1044 IF (fwrk(l).ne.fspv)
THEN