135 & LBi, UBi, LBj, UBj, &
136 & IminS, ImaxS, JminS, JmaxS, &
137 & nrhs, nstp, nnew, &
138# if defined STEP2D_FB_AB3_AM4 || defined STEP2D_FB_LF_AM3
145 & umask_wet, vmask_wet, &
148# ifdef OMEGA_IMPLICIT
154 & DU_avg1, DV_avg1, &
155 & DU_avg2, DV_avg2, &
157# ifdef DIAGNOSTICS_UV
158 & DiaU2wrk, DiaV2wrk, &
159 & DiaU2int, DiaV2int, &
160 & DiaU3wrk, DiaV3wrk, &
166 & ubar_stokes, vbar_stokes, &
167 & u_stokes, v_stokes, &
169# ifdef OMEGA_IMPLICIT
177 integer,
intent(in) :: ng, tile
178 integer,
intent(in) :: LBi, UBi, LBj, UBj
179 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
180 integer,
intent(in) :: nrhs, nstp, nnew
181# if defined STEP2D_FB_AB3_AM4 || defined STEP2D_FB_LF_AM3
182 integer,
intent(in) :: knew
187 real(r8),
intent(in) :: umask(LBi:,LBj:)
188 real(r8),
intent(in) :: vmask(LBi:,LBj:)
191 real(r8),
intent(in) :: umask_wet(LBi:,LBj:)
192 real(r8),
intent(in) :: vmask_wet(LBi:,LBj:)
194 real(r8),
intent(in) :: om_v(LBi:,LBj:)
195 real(r8),
intent(in) :: on_u(LBi:,LBj:)
196# ifdef OMEGA_IMPLICIT
197 real(r8),
intent(in) :: om_u(LBi:,LBj:)
198 real(r8),
intent(in) :: on_v(LBi:,LBj:)
200 real(r8),
intent(in) :: pm(LBi:,LBj:)
201 real(r8),
intent(in) :: pn(LBi:,LBj:)
202 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
203 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
204 real(r8),
intent(in) :: z_w(LBi:,LBj:,0:)
205 real(r8),
intent(in) :: Akv(LBi:,LBj:,0:)
206 real(r8),
intent(in) :: DU_avg1(LBi:,LBj:)
207 real(r8),
intent(in) :: DV_avg1(LBi:,LBj:)
208 real(r8),
intent(in) :: DU_avg2(LBi:,LBj:)
209 real(r8),
intent(in) :: DV_avg2(LBi:,LBj:)
211 real(r8),
intent(in) :: ubar_stokes(LBi:,LBj:)
212 real(r8),
intent(in) :: vbar_stokes(LBi:,LBj:)
214# ifdef OMEGA_IMPLICIT
215 real(r8),
intent(in) :: Wi(LBi:,LBj:,0:)
217 real(r8),
intent(inout) :: ru(LBi:,LBj:,0:,:)
218 real(r8),
intent(inout) :: rv(LBi:,LBj:,0:,:)
219# ifdef DIAGNOSTICS_UV
220 real(r8),
intent(inout) :: DiaU2wrk(LBi:,LBj:,:)
221 real(r8),
intent(inout) :: DiaV2wrk(LBi:,LBj:,:)
222 real(r8),
intent(inout) :: DiaU2int(LBi:,LBj:,:)
223 real(r8),
intent(inout) :: DiaV2int(LBi:,LBj:,:)
224 real(r8),
intent(inout) :: DiaU3wrk(LBi:,LBj:,:,:)
225 real(r8),
intent(inout) :: DiaV3wrk(LBi:,LBj:,:,:)
226 real(r8),
intent(inout) :: DiaRU(LBi:,LBj:,:,:,:)
227 real(r8),
intent(inout) :: DiaRV(LBi:,LBj:,:,:,:)
229 real(r8),
intent(inout) :: u(LBi:,LBj:,:,:)
230 real(r8),
intent(inout) :: v(LBi:,LBj:,:,:)
232 real(r8),
intent(inout) :: u_stokes(LBi:,LBj:,:)
233 real(r8),
intent(inout) :: v_stokes(LBi:,LBj:,:)
235 real(r8),
intent(out) :: ubar(LBi:,LBj:,:)
236 real(r8),
intent(out) :: vbar(LBi:,LBj:,:)
237 real(r8),
intent(out) :: Huon(LBi:,LBj:,:)
238 real(r8),
intent(out) :: Hvom(LBi:,LBj:,:)
243 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
244 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
247 real(r8),
intent(in) :: umask_wet(LBi:UBi,LBj:UBj)
248 real(r8),
intent(in) :: vmask_wet(LBi:UBi,LBj:UBj)
250 real(r8),
intent(in) :: om_v(LBi:UBi,LBj:UBj)
251 real(r8),
intent(in) :: on_u(LBi:UBi,LBj:UBj)
252# ifdef OMEGA_IMPLICIT
253 real(r8),
intent(in) :: om_u(LBi:UBi,LBj:UBj)
254 real(r8),
intent(in) :: on_v(LBi:UBi,LBj:UBj)
256 real(r8),
intent(in) :: pm(LBi:UBi,LBj:UBj)
257 real(r8),
intent(in) :: pn(LBi:UBi,LBj:UBj)
258 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
259 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
260 real(r8),
intent(in) :: z_w(LBi:UBi,LBj:UBj,0:N(ng))
261 real(r8),
intent(in) :: Akv(LBi:UBi,LBj:UBj,0:N(ng))
262 real(r8),
intent(in) :: DU_avg1(LBi:UBi,LBj:UBj)
263 real(r8),
intent(in) :: DV_avg1(LBi:UBi,LBj:UBj)
264 real(r8),
intent(in) :: DU_avg2(LBi:UBi,LBj:UBj)
265 real(r8),
intent(in) :: DV_avg2(LBi:UBi,LBj:UBj)
267 real(r8),
intent(in) :: ubar_stokes(LBi:UBi,LBj:UBj)
268 real(r8),
intent(in) :: vbar_stokes(LBi:UBi,LBj:UBj)
270# ifdef OMEGA_IMPLICIT
271 real(r8),
intent(in) :: Wi(LBi:UBi,LBj:UBj,0:N(ng))
273 real(r8),
intent(inout) :: ru(LBi:UBi,LBj:UBj,0:N(ng),2)
274 real(r8),
intent(inout) :: rv(LBi:UBi,LBj:UBj,0:N(ng),2)
275# ifdef DIAGNOSTICS_UV
276 real(r8),
intent(inout) :: DiaU2wrk(LBi:UBi,LBj:UBj,NDM2d)
277 real(r8),
intent(inout) :: DiaV2wrk(LBi:UBi,LBj:UBj,NDM2d)
278 real(r8),
intent(inout) :: DiaU2int(LBi:UBi,LBj:UBj,NDM2d)
279 real(r8),
intent(inout) :: DiaV2int(LBi:UBi,LBj:UBj,NDM2d)
280 real(r8),
intent(inout) :: DiaU3wrk(LBi:UBi,LBj:UBj,N(ng),NDM3d)
281 real(r8),
intent(inout) :: DiaV3wrk(LBi:UBi,LBj:UBj,N(ng),NDM3d)
282 real(r8),
intent(inout) :: DiaRU(LBi:UBi,LBj:UBj,N(ng),2,NDrhs)
283 real(r8),
intent(inout) :: DiaRV(LBi:UBi,LBj:UBj,N(ng),2,NDrhs)
285 real(r8),
intent(inout) :: u(LBi:UBi,LBj:UBj,N(ng),2)
286 real(r8),
intent(inout) :: v(LBi:UBi,LBj:UBj,N(ng),2)
288 real(r8),
intent(inout) :: u_stokes(LBi:UBi,LBj:UBj,N(ng))
289 real(r8),
intent(inout) :: v_stokes(LBi:UBi,LBj:UBj,N(ng))
291 real(r8),
intent(out) :: ubar(LBi:UBi,LBj:UBj,:)
292 real(r8),
intent(out) :: vbar(LBi:UBi,LBj:UBj,:)
293 real(r8),
intent(out) :: Huon(LBi:UBi,LBj:UBj,N(ng))
294 real(r8),
intent(out) :: Hvom(LBi:UBi,LBj:UBj,N(ng))
299 integer :: i, idiag, is, j, k
301 real(r8) :: cff, cff1, cff2
303 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: AK
304 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: BC
305 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: CF
306 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: DC
307 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FC
308# ifdef OMEGA_IMPLICIT
309 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FCmin
310 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FCmax
311 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: WK
314 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: CFs
315 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: DCs
317 real(r8),
dimension(IminS:ImaxS,N(ng)) :: Hzk
318 real(r8),
dimension(IminS:ImaxS,N(ng)) :: oHz
319# ifdef DIAGNOSTICS_UV
320 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: wrk
321 real(r8),
dimension(IminS:ImaxS,1:NDM2d-1) :: Dwrk
324# include "set_bounds.h"
332 ak(i,0)=0.5_r8*(akv(i-1,j,0)+ &
335 ak(i,k)=0.5_r8*(akv(i-1,j,k)+ &
337 hzk(i,k)=0.5_r8*(hz(i-1,j,k)+ &
339# if defined SPLINES_VVISC || defined DIAGNOSTICS_UV
340 ohz(i,k)=1.0_r8/hzk(i,k)
350 cff=0.25_r8*
dt(ng)*3.0_r8/2.0_r8
352 cff=0.25_r8*
dt(ng)*23.0_r8/12.0_r8
355 dc(i,0)=cff*(pm(i,j)+pm(i-1,j))*(pn(i,j)+pn(i-1,j))
359 u(i,j,k,nnew)=u(i,j,k,nnew)+ &
360 & dc(i,0)*ru(i,j,k,nrhs)
362 u(i,j,k,nnew)=u(i,j,k,nnew)*ohz(i,k)
364# ifdef DIAGNOSTICS_UV
366 diau3wrk(i,j,k,idiag)=(diau3wrk(i,j,k,idiag)+ &
367 & dc(i,0)*diaru(i,j,k,nrhs,idiag))* &
370# if defined UV_VIS2 || defined UV_VIS4
378 & dc(i,0)*diaru(i,j,k,nrhs,
m3vvis)* &
395 fc(i,k)=cff1*hzk(i,k )-
dt(ng)*ak(i,k-1)*ohz(i,k )
396 cf(i,k)=cff1*hzk(i,k+1)-
dt(ng)*ak(i,k+1)*ohz(i,k+1)
409 bc(i,k)=cff1*(hzk(i,k)+hzk(i,k+1))+ &
410 &
dt(ng)*ak(i,k)*(ohz(i,k)+ohz(i,k+1))
411 cff=1.0_r8/(bc(i,k)-fc(i,k)*cf(i,k-1))
413 dc(i,k)=cff*(u(i,j,k+1,nnew)-u(i,j,k,nnew)- &
425 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
431 dc(i,k)=dc(i,k)*ak(i,k)
432 cff=
dt(ng)*ohz(i,k)*(dc(i,k)-dc(i,k-1))
433 u(i,j,k,nnew)=u(i,j,k,nnew)+cff
434# ifdef DIAGNOSTICS_UV
448 cff1=1.0_r8/(z_r(i,j,k+1)+z_r(i-1,j,k+1)- &
449 & z_r(i,j,k )-z_r(i-1,j,k ))
450 fc(i,k)=cff*cff1*ak(i,k)
462 dc(i,k)=u(i,j,k,nnew)
463 bc(i,k)=hzk(i,k)-fc(i,k)-fc(i,k-1)
473 cff=1.0_r8/(bc(i,k)-fc(i,k-1)*cf(i,k-1))
475 dc(i,k)=cff*(dc(i,k)-fc(i,k-1)*dc(i,k-1))
482# ifdef DIAGNOSTICS_UV
483 wrk(i,n(ng))=u(i,j,n(ng),nnew)*ohz(i,n(ng))
485 dc(i,n(ng))=(dc(i,n(ng))-fc(i,n(ng)-1)*dc(i,n(ng)-1))/ &
486 & (bc(i,n(ng))-fc(i,n(ng)-1)*cf(i,n(ng)-1))
487 u(i,j,n(ng),nnew)=dc(i,n(ng))
488# ifdef DIAGNOSTICS_UV
489 diau3wrk(i,j,n(ng),
m3vvis)=diau3wrk(i,j,n(ng),
m3vvis)+ &
490 & u(i,j,n(ng),nnew)-wrk(i,n(ng))
495# ifdef DIAGNOSTICS_UV
496 wrk(i,k)=u(i,j,k,nnew)*ohz(i,k)
498 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
499 u(i,j,k,nnew)=dc(i,k)
500# ifdef DIAGNOSTICS_UV
502 & u(i,j,k,nnew)-wrk(i,k)
507# ifdef OMEGA_IMPLICIT
513 wk(i,0)=0.5_r8*(wi(i-1,j,0)+ &
516 wk(i,k)=0.5_r8*(wi(i-1,j,k)+ &
518 hzk(i,k)=0.5_r8*(hz(i-1,j,k)+ &
530 cff1=cff/(on_u(i,j)*om_u(i,j))
531 fcmax(i,k)=max(wk(i,k),0.0_r8)*cff1
532 fcmin(i,k)=min(wk(i,k),0.0_r8)*cff1
538 fcmax(i,n(ng))=0.0_r8
539 fcmin(i,n(ng))=0.0_r8
546 bc(i,k)=hzk(i,k)+fcmax(i,k)-fcmin(i,k-1)
547 dc(i,k)=u(i,j,k,nnew)*hzk(i,k)
552 cf(i,1)=cff*fcmin(i,1)
557 cff=1.0_r8/(bc(i,k)+fcmax(i,k-1)*cf(i,k-1))
558 cf(i,k)=cff*fcmin(i,k)
559 dc(i,k)=cff*(dc(i,k)+fcmax(i,k-1)*dc(i,k-1))
566# ifdef DIAGNOSTICS_UV
567 cff1=u(i,j,n(ng),nnew)
569 cff=1.0_r8/(bc(i,n(ng))+fcmax(i,n(ng)-1)*cf(i,n(ng)-1))
570 dc(i,n(ng))=cff*(dc(i,n(ng))+ &
571 & fcmax(i,n(ng)-1)*dc(i,n(ng)-1))
572 u(i,j,n(ng),nnew)=dc(i,n(ng))
573# ifdef DIAGNOSTICS_UV
574 diaru(i,j,n(ng),nrhs,
m3vadv)=diaru(i,j,n(ng),nrhs,
m3vadv)+ &
575 & u(i,j,n(ng),nnew)-cff1
581# ifdef DIAGNOSTICS_UV
584 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
585 u(i,j,k,nnew)=dc(i,k)
586# ifdef DIAGNOSTICS_UV
599 dc(i,0)=u(i,j,1,nnew)*hzk(i,1)
601 dcs(i,0)=u_stokes(i,j,1)*hzk(i,1)
603# ifdef DIAGNOSTICS_UV
609# if defined UV_VIS2 || defined UV_VIS4
620 dwrk(i,m2hjvf)=diau3wrk(i,j,1,m3hjvf)*hzk(i,1)
621 dwrk(i,m2kvrf)=diau3wrk(i,j,1,m3kvrf)*hzk(i,1)
623 dwrk(i,m2fsco)=diau3wrk(i,j,1,m3fsco)*hzk(i,1)
625# ifdef BOTTOM_STREAMING
626 dwrk(i,m2bstm)=diau3wrk(i,j,1,m3bstm)*hzk(i,1)
628# ifdef SURFACE_STREAMING
629 dwrk(i,m2sstm)=diau3wrk(i,j,1,m3sstm)*hzk(i,1)
631 dwrk(i,m2wrol)=diau3wrk(i,j,1,m3wrol)*hzk(i,1)
632 dwrk(i,m2wbrk)=diau3wrk(i,j,1,m3wbrk)*hzk(i,1)
638 cf(i,0)=cf(i,0)+hzk(i,k)
639 dc(i,0)=dc(i,0)+u(i,j,k,nnew)*hzk(i,k)
641 dcs(i,0)=dcs(i,0)+u_stokes(i,j,k)*hzk(i,k)
643# ifdef DIAGNOSTICS_UV
645 & diau3wrk(i,j,k,
m3pgrd)*hzk(i,k)
647 & diau3wrk(i,j,k,
m3vvis)*hzk(i,k)
650 & diau3wrk(i,j,k,
m3fcor)*hzk(i,k)
652# if defined UV_VIS2 || defined UV_VIS4
654 & diau3wrk(i,j,k,
m3xvis)*hzk(i,k)
656 & diau3wrk(i,j,k,
m3yvis)*hzk(i,k)
658 & diau3wrk(i,j,k,
m3hvis)*hzk(i,k)
662 & diau3wrk(i,j,k,
m3xadv)*hzk(i,k)
664 & diau3wrk(i,j,k,
m3yadv)*hzk(i,k)
666 & diau3wrk(i,j,k,
m3hadv)*hzk(i,k)
669 dwrk(i,m2hjvf)=dwrk(i,m2hjvf)+ &
670 & diau3wrk(i,j,k,m3hjvf)*hzk(i,k)
671 dwrk(i,m2kvrf)=dwrk(i,m2kvrf)+ &
672 & diau3wrk(i,j,k,m3kvrf)*hzk(i,k)
674 dwrk(i,m2fsco)=dwrk(i,m2fsco)+ &
675 & diau3wrk(i,j,k,m3fsco)*hzk(i,k)
677# ifdef BOTTOM_STREAMING
678 dwrk(i,m2bstm)=dwrk(i,m2bstm)+ &
679 & diau3wrk(i,j,k,m3bstm)*hzk(i,k)
681# ifdef SURFACE_STREAMING
682 dwrk(i,m2sstm)=dwrk(i,m2sstm)+ &
683 & diau3wrk(i,j,k,m3sstm)*hzk(i,k)
685 dwrk(i,m2wrol)=dwrk(i,m2wrol)+ &
686 & diau3wrk(i,j,k,m3wrol)*hzk(i,k)
687 dwrk(i,m2wbrk)=dwrk(i,m2wbrk)+ &
688 & diau3wrk(i,j,k,m3wbrk)*hzk(i,k)
694 cff1=1.0_r8/(cf(i,0)*on_u(i,j))
695 dc(i,0)=(dc(i,0)*on_u(i,j)-du_avg1(i,j))*cff1
698 dcs(i,0)=dcs(i,0)*cff2-ubar_stokes(i,j)
700# ifdef DIAGNOSTICS_UV
702 dwrk(i,idiag)=(dwrk(i,idiag)*on_u(i,j)- &
703 & diau2wrk(i,j,idiag))*cff1
715 u(i,j,k,nnew)=u(i,j,k,nnew)-dc(i,0)
717 u(i,j,k,nnew)=u(i,j,k,nnew)*umask(i,j)
720 u(i,j,k,nnew)=u(i,j,k,nnew)*umask_wet(i,j)
721 ru(i,j,k,nrhs)=ru(i,j,k,nrhs)*umask_wet(i,j)
724 u_stokes(i,j,k)=u_stokes(i,j,k)-dcs(i,0)
726 u_stokes(i,j,k)=u_stokes(i,j,k)*umask(i,j)
729 u_stokes(i,j,k)=u_stokes(i,j,k)*umask_wet(i,j)
732# ifdef DIAGNOSTICS_UV
741# if defined UV_VIS2 || defined UV_VIS4
758 diau3wrk(i,j,k,m3hjvf)=diau3wrk(i,j,k,m3hjvf)- &
760 diau3wrk(i,j,k,m3kvrf)=diau3wrk(i,j,k,m3kvrf)- &
763 diau3wrk(i,j,k,m3fsco)=diau3wrk(i,j,k,m3fsco)- &
766# ifdef BOTTOM_STREAMING
767 diau3wrk(i,j,k,m3bstm)=diau3wrk(i,j,k,m3bstm)- &
770# ifdef SURFACE_STREAMING
771 diau3wrk(i,j,k,m3sstm)=diau3wrk(i,j,k,m3sstm)- &
774 diau3wrk(i,j,k,m3wrol)=diau3wrk(i,j,k,m3wrol)- &
776 diau3wrk(i,j,k,m3wbrk)=diau3wrk(i,j,k,m3wbrk)- &
783# if defined DIAGNOSTICS_UV && defined MASKING
787 diau3wrk(i,j,k,idiag)=diau3wrk(i,j,k,idiag)*umask(i,j)
799 ak(i,0)=0.5_r8*(akv(i,j-1,0)+ &
802 ak(i,k)=0.5_r8*(akv(i,j-1,k)+ &
804 hzk(i,k)=0.5_r8*(hz(i,j-1,k)+ &
806# if defined SPLINES_VVISC || defined DIAGNOSTICS_UV
807 ohz(i,k)=1.0_r8/hzk(i,k)
817 cff=0.25_r8*
dt(ng)*3.0_r8/2.0_r8
819 cff=0.25_r8*
dt(ng)*23.0_r8/12.0_r8
822 dc(i,0)=cff*(pm(i,j)+pm(i,j-1))*(pn(i,j)+pn(i,j-1))
826 v(i,j,k,nnew)=v(i,j,k,nnew)+dc(i,0)*rv(i,j,k,nrhs)
828 v(i,j,k,nnew)=v(i,j,k,nnew)*ohz(i,k)
830# ifdef DIAGNOSTICS_UV
832 diav3wrk(i,j,k,idiag)=(diav3wrk(i,j,k,idiag)+ &
834 & diarv(i,j,k,nrhs,idiag))* &
837# if defined UV_VIS2 || defined UV_VIS4
845 & dc(i,0)*diarv(i,j,k,nrhs,
m3vvis)* &
862 fc(i,k)=cff1*hzk(i,k )-
dt(ng)*ak(i,k-1)*ohz(i,k )
863 cf(i,k)=cff1*hzk(i,k+1)-
dt(ng)*ak(i,k+1)*ohz(i,k+1)
876 bc(i,k)=cff1*(hzk(i,k)+hzk(i,k+1))+ &
877 &
dt(ng)*ak(i,k)*(ohz(i,k)+ohz(i,k+1))
878 cff=1.0_r8/(bc(i,k)-fc(i,k)*cf(i,k-1))
880 dc(i,k)=cff*(v(i,j,k+1,nnew)-v(i,j,k,nnew)- &
892 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
898 dc(i,k)=dc(i,k)*ak(i,k)
899 cff=
dt(ng)*ohz(i,k)*(dc(i,k)-dc(i,k-1))
900 v(i,j,k,nnew)=v(i,j,k,nnew)+cff
901# ifdef DIAGNOSTICS_UV
915 cff1=1.0_r8/(z_r(i,j,k+1)+z_r(i,j-1,k+1)- &
916 & z_r(i,j,k )-z_r(i,j-1,k ))
917 fc(i,k)=cff*cff1*ak(i,k)
929 dc(i,k)=v(i,j,k,nnew)
930 bc(i,k)=hzk(i,k)-fc(i,k)-fc(i,k-1)
940 cff=1.0_r8/(bc(i,k)-fc(i,k-1)*cf(i,k-1))
942 dc(i,k)=cff*(dc(i,k)-fc(i,k-1)*dc(i,k-1))
949# ifdef DIAGNOSTICS_UV
950 wrk(i,n(ng))=v(i,j,n(ng),nnew)*ohz(i,n(ng))
952 dc(i,n(ng))=(dc(i,n(ng))-fc(i,n(ng)-1)*dc(i,n(ng)-1))/ &
953 & (bc(i,n(ng))-fc(i,n(ng)-1)*cf(i,n(ng)-1))
954 v(i,j,n(ng),nnew)=dc(i,n(ng))
955# ifdef DIAGNOSTICS_UV
956 diav3wrk(i,j,n(ng),
m3vvis)=diav3wrk(i,j,n(ng),
m3vvis)+ &
957 & v(i,j,n(ng),nnew)-wrk(i,n(ng))
962# ifdef DIAGNOSTICS_UV
963 wrk(i,k)=v(i,j,k,nnew)*ohz(i,k)
965 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
966 v(i,j,k,nnew)=dc(i,k)
967# ifdef DIAGNOSTICS_UV
969 & v(i,j,k,nnew)-wrk(i,k)
974# ifdef OMEGA_IMPLICIT
980 wk(i,0)=0.5_r8*(wi(i,j-1,0)+ &
983 wk(i,k)=0.5_r8*(wi(i,j-1,k)+ &
985 hzk(i,k)=0.5_r8*(hz(i,j-1,k)+ &
997 cff1=cff/(on_v(i,j)*om_v(i,j))
998 fcmax(i,k)=max(wk(i,k),0.0_r8)*cff1
999 fcmin(i,k)=min(wk(i,k),0.0_r8)*cff1
1005 fcmax(i,n(ng))=0.0_r8
1006 fcmin(i,n(ng))=0.0_r8
1013 bc(i,k)=hzk(i,k)+fcmax(i,k)-fcmin(i,k-1)
1014 dc(i,k)=v(i,j,k,nnew)*hzk(i,k)
1019 cf(i,1)=cff*fcmin(i,1)
1024 cff=1.0_r8/(bc(i,k)+fcmax(i,k-1)*cf(i,k-1))
1025 cf(i,k)=cff*fcmin(i,k)
1026 dc(i,k)=cff*(dc(i,k)+fcmax(i,k-1)*dc(i,k-1))
1033# ifdef DIAGNOSTICS_UV
1034 cff1=v(i,j,n(ng),nnew)
1036 cff=1.0_r8/(bc(i,n(ng))+fcmax(i,n(ng)-1)*cf(i,n(ng)-1))
1037 dc(i,n(ng))=cff*(dc(i,n(ng))+ &
1038 & fcmax(i,n(ng)-1)*dc(i,n(ng)-1))
1039 v(i,j,n(ng),nnew)=dc(i,n(ng))
1040# ifdef DIAGNOSTICS_UV
1041 diarv(i,j,n(ng),nrhs,
m3vadv)=diarv(i,j,n(ng),nrhs,
m3vadv)+ &
1042 & v(i,j,n(ng),nnew)-cff1
1048# ifdef DIAGNOSTICS_UV
1051 dc(i,k)=dc(i,k)-cf(i,k)*dc(i,k+1)
1052 v(i,j,k,nnew)=dc(i,k)
1053# ifdef DIAGNOSTICS_UV
1055 & v(i,j,k,nnew)-cff1
1066 dc(i,0)=v(i,j,1,nnew)*hzk(i,1)
1068 dcs(i,0)=v_stokes(i,j,1)*hzk(i,1)
1070# ifdef DIAGNOSTICS_UV
1076# if defined UV_VIS2 || defined UV_VIS4
1087 dwrk(i,m2hjvf)=diav3wrk(i,j,1,m3hjvf)*hzk(i,1)
1088 dwrk(i,m2kvrf)=diav3wrk(i,j,1,m3kvrf)*hzk(i,1)
1090 dwrk(i,m2fsco)=diav3wrk(i,j,1,m3fsco)*hzk(i,1)
1092# ifdef BOTTOM_STREAMING
1093 dwrk(i,m2bstm)=diav3wrk(i,j,1,m3bstm)*hzk(i,1)
1095# ifdef SURFACE_STREAMING
1096 dwrk(i,m2sstm)=diav3wrk(i,j,1,m3sstm)*hzk(i,1)
1098 dwrk(i,m2wrol)=diav3wrk(i,j,1,m3wrol)*hzk(i,1)
1099 dwrk(i,m2wbrk)=diav3wrk(i,j,1,m3wbrk)*hzk(i,1)
1105 cf(i,0)=cf(i,0)+hzk(i,k)
1106 dc(i,0)=dc(i,0)+v(i,j,k,nnew)*hzk(i,k)
1108 dcs(i,0)=dcs(i,0)+v_stokes(i,j,k)*hzk(i,k)
1110# ifdef DIAGNOSTICS_UV
1112 & diav3wrk(i,j,k,
m3pgrd)*hzk(i,k)
1114 & diav3wrk(i,j,k,
m3vvis)*hzk(i,k)
1117 & diav3wrk(i,j,k,
m3fcor)*hzk(i,k)
1119# if defined UV_VIS2 || defined UV_VIS4
1121 & diav3wrk(i,j,k,
m3xvis)*hzk(i,k)
1123 & diav3wrk(i,j,k,
m3yvis)*hzk(i,k)
1125 & diav3wrk(i,j,k,
m3hvis)*hzk(i,k)
1129 & diav3wrk(i,j,k,
m3xadv)*hzk(i,k)
1131 & diav3wrk(i,j,k,
m3yadv)*hzk(i,k)
1133 & diav3wrk(i,j,k,
m3hadv)*hzk(i,k)
1136 dwrk(i,m2hjvf)=dwrk(i,m2hjvf)+ &
1137 & diav3wrk(i,j,k,m3hjvf)*hzk(i,k)
1138 dwrk(i,m2kvrf)=dwrk(i,m2kvrf)+ &
1139 & diav3wrk(i,j,k,m3kvrf)*hzk(i,k)
1141 dwrk(i,m2fsco)=dwrk(i,m2fsco)+ &
1142 & diav3wrk(i,j,k,m3fsco)*hzk(i,k)
1144# ifdef BOTTOM_STREAMING
1145 dwrk(i,m2bstm)=dwrk(i,m2bstm)+ &
1146 & diav3wrk(i,j,k,m3bstm)*hzk(i,k)
1148# ifdef SURFACE_STREAMING
1149 dwrk(i,m2sstm)=dwrk(i,m2sstm)+ &
1150 & diav3wrk(i,j,k,m3sstm)*hzk(i,k)
1152 dwrk(i,m2wrol)=dwrk(i,m2wrol)+ &
1153 & diav3wrk(i,j,k,m3wrol)*hzk(i,k)
1154 dwrk(i,m2wbrk)=dwrk(i,m2wbrk)+ &
1155 & diav3wrk(i,j,k,m3wbrk)*hzk(i,k)
1161 cff1=1.0_r8/(cf(i,0)*om_v(i,j))
1162 dc(i,0)=(dc(i,0)*om_v(i,j)-dv_avg1(i,j))*cff1
1165 dcs(i,0)=dcs(i,0)*cff2-vbar_stokes(i,j)
1167# ifdef DIAGNOSTICS_UV
1169 dwrk(i,idiag)=(dwrk(i,idiag)*om_v(i,j)- &
1170 & diav2wrk(i,j,idiag))*cff1
1182 v(i,j,k,nnew)=v(i,j,k,nnew)-dc(i,0)
1184 v(i,j,k,nnew)=v(i,j,k,nnew)*vmask(i,j)
1187 v(i,j,k,nnew)=v(i,j,k,nnew)*vmask_wet(i,j)
1188 rv(i,j,k,nrhs)=rv(i,j,k,nrhs)*vmask_wet(i,j)
1191 v_stokes(i,j,k)=v_stokes(i,j,k)-dcs(i,0)
1193 v_stokes(i,j,k)=v_stokes(i,j,k)*vmask(i,j)
1196 v_stokes(i,j,k)=v_stokes(i,j,k)*vmask_wet(i,j)
1199# ifdef DIAGNOSTICS_UV
1208# if defined UV_VIS2 || defined UV_VIS4
1225 diav3wrk(i,j,k,m3hjvf)=diav3wrk(i,j,k,m3hjvf)- &
1227 diav3wrk(i,j,k,m3kvrf)=diav3wrk(i,j,k,m3kvrf)- &
1230 diav3wrk(i,j,k,m3fsco)=diav3wrk(i,j,k,m3fsco)- &
1233# ifdef BOTTOM_STREAMING
1234 diav3wrk(i,j,k,m3bstm)=diav3wrk(i,j,k,m3bstm)- &
1237# ifdef SURFACE_STREAMING
1238 diav3wrk(i,j,k,m3sstm)=diav3wrk(i,j,k,m3sstm)- &
1241 diav3wrk(i,j,k,m3wrol)=diav3wrk(i,j,k,m3wrol)- &
1243 diav3wrk(i,j,k,m3wbrk)=diav3wrk(i,j,k,m3wbrk)- &
1250# if defined DIAGNOSTICS_UV && defined MASKING
1254 diav3wrk(i,j,k,idiag)=diav3wrk(i,j,k,idiag)*vmask(i,j)
1267 & lbi, ubi, lbj, ubj, n(ng), &
1268 & imins, imaxs, jmins, jmaxs, &
1272 & lbi, ubi, lbj, ubj, n(ng), &
1273 & imins, imaxs, jmins, jmaxs, &
1285 IF (((istrr.le.i).and.(i.le.iendr)).and. &
1286 & ((jstrr.le.j).and.(j.le.jendr)))
THEN
1287 IF (int(
sources(ng)%Dsrc(is)).eq.0)
THEN
1289 cff1=1.0_r8/(on_u(i,j)* &
1290 & 0.5_r8*(z_w(i-1,j,k)-z_w(i-1,j,k-1)+ &
1291 & z_w(i ,j,k)-z_w(i ,j,k-1)))
1292 u(i,j,k,nnew)=
sources(ng)%Qsrc(is,k)*cff1
1294 ELSE IF (int(
sources(ng)%Dsrc(is)).eq.1)
THEN
1296 cff1=1.0_r8/(om_v(i,j)* &
1297 & 0.5_r8*(z_w(i,j-1,k)-z_w(i,j-1,k-1)+ &
1298 & z_w(i,j ,k)-z_w(i,j ,k-1)))
1299 v(i,j,k,nnew)=
sources(ng)%Qsrc(is,k)*cff1
1329 cff=0.5_r8*on_u(i,j)
1330 dc(i,k)=cff*(hz(i,j,k)+hz(i-1,j,k))
1331 dc(i,0)=dc(i,0)+dc(i,k)
1333 & dc(i,k)*u(i,j,k,nnew)
1335 cfs(i,0)=cfs(i,0)+ &
1336 & dc(i,k)*u_stokes(i,j,k)
1344 cff2=dc(i,0)*ubar_stokes(i,j)
1346 dc(i,0)=1.0_r8/dc(i,0)
1347 cf(i,0)=dc(i,0)*(cf(i,0)-du_avg1(i,j))
1349 cfs(i,0)=dc(i,0)*(cfs(i,0)-cff2)
1351# if defined STEP2D_FB_AB3_AM4 || defined STEP2D_FB_LF_AM3
1352 ubar(i,j,knew)=dc(i,0)*du_avg1(i,j)
1354 ubar(i,j,knew)=ubar(i,j,knew)*umask_wet(i,j)
1357 ubar(i,j,1)=dc(i,0)*du_avg1(i,j)
1359 ubar(i,j,1)=ubar(i,j,1)*umask_wet(i,j)
1361 ubar(i,j,2)=ubar(i,j,1)
1363# ifdef DIAGNOSTICS_UV
1364 diau2wrk(i,j,
m2rate)=ubar(i,j,1)-diau2int(i,j,
m2rate)*dc(i,0)
1365 diau2int(i,j,
m2rate)=ubar(i,j,1)*cff1
1368# ifdef DIAGNOSTICS_UV
1375 diau2wrk(i,j,idiag)=dc(i,0)*diau2wrk(i,j,idiag)
1377 diau2wrk(i,j,idiag)=diau2wrk(i,j,idiag)*umask(i,j)
1396 IF (
domain(ng)%Western_Edge(tile))
THEN
1398 u(istr,j,k,nnew)=u(istr,j,k,nnew)-cf(istr,0)
1400 u(istr,j,k,nnew)=u(istr,j,k,nnew)* &
1404 u(istr,j,k,nnew)=u(istr,j,k,nnew)* &
1408 u_stokes(istr,j,k)=u_stokes(istr,j,k)-cfs(istr,0)
1410 u_stokes(istr,j,k)=u_stokes(istr,j,k)* &
1414 u_stokes(istr,j,k)=u_stokes(istr,j,k)* &
1423 IF (
domain(ng)%Eastern_Edge(tile))
THEN
1425 u(iend+1,j,k,nnew)=u(iend+1,j,k,nnew)-cf(iend+1,0)
1427 u(iend+1,j,k,nnew)=u(iend+1,j,k,nnew)* &
1431 u(iend+1,j,k,nnew)=u(iend+1,j,k,nnew)* &
1432 & umask_wet(iend+1,j)
1435 u_stokes(iend+1,j,k)=u_stokes(iend+1,j,k)-cfs(iend+1,0)
1437 u_stokes(iend+1,j,k)=u_stokes(iend+1,j,k)* &
1441 u_stokes(iend+1,j,k)=u_stokes(iend+1,j,k)* &
1442 & umask_wet(iend+1,j)
1453 u(i,j,k,nnew)=u(i,j,k,nnew)-cf(i,0)
1455 u(i,j,k,nnew)=u(i,j,k,nnew)* &
1459 u(i,j,k,nnew)=u(i,j,k,nnew)* &
1463 u_stokes(i,j,k)=u_stokes(i,j,k)-cfs(i,0)
1465 u_stokes(i,j,k)=u_stokes(i,j,k)* &
1469 u_stokes(i,j,k)=u_stokes(i,j,k)* &
1479 IF (j.eq.
mm(ng)+1)
THEN
1482 u(i,j,k,nnew)=u(i,j,k,nnew)-cf(i,0)
1484 u(i,j,k,nnew)=u(i,j,k,nnew)* &
1488 u(i,j,k,nnew)=u(i,j,k,nnew)* &
1492 u_stokes(i,j,k)=u_stokes(i,j,k)-cfs(i,0)
1494 u_stokes(i,j,k)=u_stokes(i,j,k)* &
1498 u_stokes(i,j,k)=u_stokes(i,j,k)* &
1511 huon(i,j,k)=0.5_r8*(huon(i,j,k)+u(i,j,k,nnew)*dc(i,k))
1513 huon(i,j,k)=huon(i,j,k)+0.5_r8*u_stokes(i,j,k)*dc(i,k)
1515 fc(i,0)=fc(i,0)+huon(i,j,k)
1516# ifdef DIAGNOSTICS_UV
1517 diau3wrk(i,j,k,
m3rate)=u(i,j,k,nnew)-diau3wrk(i,j,k,
m3rate)
1522 fc(i,0)=dc(i,0)*(fc(i,0)-du_avg2(i,j))
1526 huon(i,j,k)=huon(i,j,k)-dc(i,k)*fc(i,0)
1549 cff=0.5_r8*om_v(i,j)
1550 dc(i,k)=cff*(hz(i,j,k)+hz(i,j-1,k))
1551 dc(i,0)=dc(i,0)+dc(i,k)
1553 & dc(i,k)*v(i,j,k,nnew)
1555 cfs(i,0)=cfs(i,0)+ &
1556 & dc(i,k)*v_stokes(i,j,k)
1564 cff2=dc(i,0)*vbar_stokes(i,j)
1566 dc(i,0)=1.0_r8/dc(i,0)
1567 cf(i,0)=dc(i,0)*(cf(i,0)-dv_avg1(i,j))
1569 cfs(i,0)=dc(i,0)*(cfs(i,0)-cff2)
1571# if defined STEP2D_FB_AB3_AM4 || defined STEP2D_FB_LF_AM3
1572 vbar(i,j,knew)=dc(i,0)*dv_avg1(i,j)
1574 vbar(i,j,knew)=vbar(i,j,knew)*vmask_wet(i,j)
1577 vbar(i,j,1)=dc(i,0)*dv_avg1(i,j)
1579 vbar(i,j,1)=vbar(i,j,1)*vmask_wet(i,j)
1581 vbar(i,j,2)=vbar(i,j,1)
1583# ifdef DIAGNOSTICS_UV
1584 diav2wrk(i,j,
m2rate)=vbar(i,j,1)- &
1585 & diav2int(i,j,
m2rate)*dc(i,0)
1586 diav2int(i,j,
m2rate)=vbar(i,j,1)*cff1
1591# ifdef DIAGNOSTICS_UV
1598 diav2wrk(i,j,idiag)=dc(i,0)*diav2wrk(i,j,idiag)
1600 diav2wrk(i,j,idiag)=diav2wrk(i,j,idiag)*vmask(i,j)
1619 IF (
domain(ng)%Western_Edge(tile))
THEN
1621 v(istr-1,j,k,nnew)=v(istr-1,j,k,nnew)-cf(istr-1,0)
1623 v(istr-1,j,k,nnew)=v(istr-1,j,k,nnew)* &
1627 v(istr-1,j,k,nnew)=v(istr-1,j,k,nnew)* &
1628 & vmask_wet(istr-1,j)
1631 v_stokes(istr-1,j,k)=v_stokes(istr-1,j,k)- &
1634 v_stokes(istr-1,j,k)=v_stokes(istr-1,j,k)* &
1638 v_stokes(istr-1,j,k)=v_stokes(istr-1,j,k)* &
1639 & vmask_wet(istr-1,j)
1647 IF (
domain(ng)%Eastern_Edge(tile))
THEN
1649 v(iend+1,j,k,nnew)=v(iend+1,j,k,nnew)-cf(iend+1,0)
1651 v(iend+1,j,k,nnew)=v(iend+1,j,k,nnew)* &
1655 v(iend+1,j,k,nnew)=v(iend+1,j,k,nnew)* &
1656 & vmask_wet(iend+1,j)
1659 v_stokes(iend+1,j,k)=v_stokes(iend+1,j,k)- &
1662 v_stokes(iend+1,j,k)=v_stokes(iend+1,j,k)* &
1666 v_stokes(iend+1,j,k)=v_stokes(iend+1,j,k)* &
1667 & vmask_wet(iend+1,j)
1678 v(i,j,k,nnew)=v(i,j,k,nnew)-cf(i,0)
1680 v(i,j,k,nnew)=v(i,j,k,nnew)* &
1684 v(i,j,k,nnew)=v(i,j,k,nnew)* &
1688 v_stokes(i,j,k)=v_stokes(i,j,k)-cfs(i,0)
1690 v_stokes(i,j,k)=v_stokes(i,j,k)* &
1694 v_stokes(i,j,k)=v_stokes(i,j,k)* &
1704 IF (j.eq.
mm(ng)+1)
THEN
1707 v(i,j,k,nnew)=v(i,j,k,nnew)-cf(i,0)
1709 v(i,j,k,nnew)=v(i,j,k,nnew)* &
1713 v(i,j,k,nnew)=v(i,j,k,nnew)* &
1717 v_stokes(i,j,k)=v_stokes(i,j,k)-cfs(i,0)
1719 v_stokes(i,j,k)=v_stokes(i,j,k)* &
1723 v_stokes(i,j,k)=v_stokes(i,j,k)* &
1736 hvom(i,j,k)=0.5_r8*(hvom(i,j,k)+v(i,j,k,nnew)*dc(i,k))
1738 hvom(i,j,k)=hvom(i,j,k)+0.5_r8*v_stokes(i,j,k)*dc(i,k)
1740 fc(i,0)=fc(i,0)+hvom(i,j,k)
1741# ifdef DIAGNOSTICS_UV
1742 diav3wrk(i,j,k,
m3rate)=v(i,j,k,nnew)- &
1748 fc(i,0)=dc(i,0)*(fc(i,0)-dv_avg2(i,j))
1752 hvom(i,j,k)=hvom(i,j,k)-dc(i,k)*fc(i,0)
1764 & lbi, ubi, lbj, ubj, 1, n(ng), &
1767 & lbi, ubi, lbj, ubj, 1, n(ng), &
1771 & lbi, ubi, lbj, ubj, 1, n(ng), &
1774 & lbi, ubi, lbj, ubj, 1, n(ng), &
1778 & lbi, ubi, lbj, ubj, 1, n(ng), &
1781 & lbi, ubi, lbj, ubj, 1, n(ng), &
1784# if defined STEP2D_FB_AB3_AM4 || defined STEP2D_FB_LF_AM3
1786 & lbi, ubi, lbj, ubj, &
1789 & lbi, ubi, lbj, ubj, &
1794 & lbi, ubi, lbj, ubj, &
1797 & lbi, ubi, lbj, ubj, &
1806 & lbi, ubi, lbj, ubj, 1, n(ng), &
1809 & u(:,:,:,nnew), v(:,:,:,nnew), &
1812# if defined STEP2D_FB_AB3_AM4 || defined STEP2D_FB_LF_AM3
1814 & lbi, ubi, lbj, ubj, &
1817 & ubar(:,:,knew), vbar(:,:,knew))
1820 & lbi, ubi, lbj, ubj, &
1823 & ubar(:,:,1), vbar(:,:,1), &
1824 & ubar(:,:,2), vbar(:,:,2))
1828 & lbi, ubi, lbj, ubj, 1, n(ng), &
1831 & u_stokes(:,:,:), v_stokes(:,:,:))