85
86
95
97# ifdef DISTRIBUTE
99# endif
101
102
103
104 integer, intent(in) :: ng, Lstr, Lend
105 integer, intent(in) :: nfm3, nfm2, nfm1, nf, nfp1
106 logical, intent(in) :: Predictor
107
108# ifdef ASSUMED_SHAPE
109 logical, intent(in) :: bounded(:)
110 logical, intent(in) :: my_thread(Lstr:)
111
112 real(r8), intent(in) :: Tinfo(0:,:)
113
114 real(r8), intent(inout) :: rwalk(:)
115 real(r8), intent(inout) :: nudg(Lstr:)
116 real(r8), intent(inout) :: track(:,0:,:)
117# else
118 logical, intent(in) :: bounded(Nfloats(ng))
119 logical, intent(in) :: my_thread(Lstr:Lend)
120
121 real(r8), intent(in) :: Tinfo(0:izrhs,Nfloats(ng))
122
123 real(r8), intent(inout) :: rwalk(Nfloats(ng))
124 real(r8), intent(inout) :: nudg(Lstr:Lend)
125 real(r8), intent(inout) :: track(NFV(ng),0:NFT,Nfloats(ng))
126# endif
127
128
129
130# ifdef MASKING
131 logical, parameter :: Lmask = .true.
132# else
133 logical, parameter :: Lmask = .false.
134# endif
135 integer :: LBi, UBi, LBj, UBj
136 integer :: i, l, nfindx
137 integer :: ierr
138
139 real(r8) :: HalfDT, akt, dakt, zrhs
140 real(r8) :: cff, cff1, cff2, cff3, cff4
141
142
143
144 lbi=lbound(
grid(ng)%h,dim=1)
145 ubi=ubound(
grid(ng)%h,dim=1)
146 lbj=lbound(
grid(ng)%h,dim=2)
147 ubj=ubound(
grid(ng)%h,dim=2)
148
149
150
151
152
153
154
155 IF (predictor) THEN
156 nfindx=nf
157 ELSE
158 nfindx=nfp1
159 END IF
160
161
162
163 IF (predictor) THEN
164# ifdef DISTRIBUTE
167 END IF
169# else
170
172
173
174# endif
175 END IF
176
177
178
179
180 DO l=lstr,lend
181 nudg(l)=0.0_r8
182 END DO
183
190# ifdef MASKING
191 &
grid(ng) % rmask, &
192# endif
194 & my_thread, bounded, track)
195
202# ifdef MASKING
203 &
grid(ng) % rmask, &
204# endif
206 & my_thread, bounded, track)
207
208
209
210
212 DO l=lstr,lend
213 IF (my_thread(l).and.bounded(l)) THEN
214 nudg(l)=sqrt(cff*max(0.0_r8,track(
ifakt,nfindx,l)))*rwalk(l)+ &
215 & track(
ifdak,nfindx,l)
216 ELSE
217 nudg(l)=0.0_r8
218 END IF
219 END DO
220
221
222
229# ifdef MASKING
230 &
grid(ng) % rmask, &
231# endif
233 & my_thread, bounded, track)
234
235
236
238
239 DO l=lstr,lend
240 IF (my_thread(l).and.bounded(l)) THEN
241 IF (
time(ng)-halfdt.le.tinfo(
itstr,l).and. &
242 &
time(ng)+halfdt.gt.tinfo(
itstr,l))
THEN
243 akt =track(
ifakt,nfindx,l)
244 dakt=track(
ifdak,nfindx,l)
245 zrhs=track(
izrhs,nfindx,l)
248 track(
ifakt,i,l)=dakt
249 track(
izrhs,i,l)=zrhs
250 END DO
251 END IF
252 END IF
253 END DO
254
255
256
257
258
259
260
261 IF (predictor) THEN
262 cff1=8.0_r8/3.0_r8
263 cff2=4.0_r8/3.0_r8
264 ELSE
265 cff1=9.0_r8/8.0_r8
266 cff2=1.0_r8/8.0_r8
267 cff3=3.0_r8/8.0_r8
268 cff4=6.0_r8/8.0_r8
269 END IF
270
271
272
273# ifdef VWALK_FORWARD
274# if defined FLOAT_BIOLOGY
275 DO l=lstr,lend
276 IF (my_thread(l).and.bounded(l)) THEN
279 & track(
iwbio,nf,l)* &
281 END IF
282 END DO
283# else
284 DO l=lstr,lend
285 IF (my_thread(l).and.bounded(l)) THEN
288 END IF
289 END DO
290# endif
291# else
292# if defined FLOAT_BIOLOGY
293 IF (predictor) THEN
294 DO l=lstr,lend
295 IF (my_thread(l).and.bounded(l)) THEN
297 &
dt(ng)*(cff1*track(
izrhs,nf ,l)- &
298 & cff2*track(
izrhs,nfm1,l)+ &
299 & cff1*track(
izrhs,nfm2,l)+ &
300 & cff1*track(
iwbio,nf ,l)* &
301 & track(
i1ohz,nf ,l)- &
302 & cff2*track(
iwbio,nfm1,l)* &
303 & track(
i1ohz,nfm1,l)+ &
304 & cff1*track(
iwbio,nfm2,l)* &
305 & track(
i1ohz,nfm2,l))
306 END IF
307 END DO
308 ELSE
309 DO l=lstr,lend
310 IF (my_thread(l).and.bounded(l)) THEN
311 track(
izgrd,nfp1,l)=cff1*track(
izgrd,nf ,l)- &
312 & cff2*track(
izgrd,nfm2,l)+ &
313 &
dt(ng)*(cff3*track(
izrhs,nfp1,l)+ &
314 & cff4*track(
izrhs,nf ,l)- &
315 & cff3*track(
izrhs,nfm1,l)+ &
316 & cff3*track(
iwbio,nfp1,l)* &
317 & track(
i1ohz,nfp1,l)+ &
318 & cff4*track(
iwbio,nf ,l)* &
319 & track(
i1ohz,nf ,l)- &
320 & cff3*track(
iwbio,nfm1,l)* &
321 & track(
i1ohz,nf ,l))
322 END IF
323 END DO
324 END IF
325# else
326 IF (predictor) THEN
327 DO l=lstr,lend
328 IF (my_thread(l).and.bounded(l)) THEN
330 &
dt(ng)*(cff1*track(
izrhs,nf ,l)- &
331 & cff2*track(
izrhs,nfm1,l)+ &
332 & cff1*track(
izrhs,nfm2,l))
333 END IF
334 END DO
335 ELSE
336 DO l=lstr,lend
337 IF (my_thread(l).and.bounded(l)) THEN
338 track(
izgrd,nfp1,l)=cff1*track(
izgrd,nf ,l)- &
339 & cff2*track(
izgrd,nfm2,l)+ &
340 &
dt(ng)*(cff3*track(
izrhs,nfp1,l)+ &
341 & cff4*track(
izrhs,nf ,l)- &
342 & cff3*track(
izrhs,nfm1,l))
343 END IF
344 END DO
345 END IF
346# endif
347# endif
348
349
350
351 DO l=lstr,lend
352 nudg(l)=0.0_r8
353 END DO
354
355 RETURN
subroutine, public interp_floats(ng, lbi, ubi, lbj, ubj, lbk, ubk, lstr, lend, itime, ifield, isbval, gtype, maskit, fspval, nudg, pm, pn, hz, amask, a, my_thread, bounded, track)
type(t_grid), dimension(:), allocatable grid
type(t_mixing), dimension(:), allocatable mixing
type(t_ocean), dimension(:), allocatable ocean
integer, dimension(:), allocatable n
integer, parameter r3dvar
integer, parameter w3dvar
real(dp), parameter spval
real(dp), dimension(:), allocatable dt
real(dp), dimension(:), allocatable time