108 & LBi, UBi, LBj, UBj, &
109 & IminS, ImaxS, JminS, JmaxS, &
115 & umask_wet, vmask_wet, &
117 & Hz, om_v, on_u, z_w, &
119#ifdef TIDE_GENERATING_FORCES
139 integer,
intent(in) :: ng, tile
140 integer,
intent(in) :: LBi, UBi, LBj, UBj
141 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
142 integer,
intent(in) :: nrhs
146 real(r8),
intent(in) :: umask(LBi:,LBj:)
147 real(r8),
intent(in) :: vmask(LBi:,LBj:)
150 real(r8),
intent(in) :: umask_wet(LBi:,LBj:)
151 real(r8),
intent(in) :: vmask_wet(LBi:,LBj:)
153 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
154 real(r8),
intent(in) :: om_v(LBi:,LBj:)
155 real(r8),
intent(in) :: on_u(LBi:,LBj:)
156 real(r8),
intent(in) :: z_w(LBi:,LBj:,0:)
157 real(r8),
intent(in) :: rho(LBi:,LBj:,:)
158# ifdef TIDE_GENERATING_FORCES
159 real(r8),
intent(in) :: eq_tide(LBi:,LBj:)
162 real(r8),
intent(in) :: zetat(LBi:,LBj:)
165 real(r8),
intent(in) :: Pair(LBi:,LBj:)
167# ifdef DIAGNOSTICS_UV
168 real(r8),
intent(inout) :: DiaRU(LBi:,LBj:,:,:,:)
169 real(r8),
intent(inout) :: DiaRV(LBi:,LBj:,:,:,:)
171 real(r8),
intent(inout) :: ru(LBi:,LBj:,0:,:)
172 real(r8),
intent(inout) :: rv(LBi:,LBj:,0:,:)
175 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
176 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
179 real(r8),
intent(in) :: umask_wet(LBi:UBi,LBj:UBj)
180 real(r8),
intent(in) :: vmask_wet(LBi:UBi,LBj:UBj)
182 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
183 real(r8),
intent(in) :: om_v(LBi:UBi,LBj:UBj)
184 real(r8),
intent(in) :: on_u(LBi:UBi,LBj:UBj)
185 real(r8),
intent(in) :: z_w(LBi:UBi,LBj:UBj,0:N(ng))
186 real(r8),
intent(in) :: rho(LBi:UBi,LBj:UBj,N(ng))
187# ifdef TIDE_GENERATING_FORCES
188 real(r8),
intent(in) :: eq_tide(LBi:UBi,LBj:UBj)
191 real(r8),
intent(in) :: zetat(LBi:UBi,LBj:UBj)
194 real(r8),
intent(in) :: Pair(LBi:UBi,LBj:UBj)
196# ifdef DIAGNOSTICS_UV
197 real(r8),
intent(inout) :: DiaRU(LBi:UBi,LBj:UBj,N(ng),2,NDrhs)
198 real(r8),
intent(inout) :: DiaRV(LBi:UBi,LBj:UBj,N(ng),2,NDrhs)
200 real(r8),
intent(inout) :: ru(LBi:UBi,LBj:UBj,0:N(ng),2)
201 real(r8),
intent(inout) :: rv(LBi:UBi,LBj:UBj,0:N(ng),2)
208 real(r8),
parameter :: eps = 1.0e-8_r8
210 real(r8) :: cff, cff1, cff2, cffL, cffR
211 real(r8) :: deltaL, deltaR, dh, delP, rr
213 real(r8) :: OneAtm, fac
215 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: FX
216 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: P
217 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: r
219 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FC
220 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: aL
221 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: aR
222 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: dL
223 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: dR
225#include "set_bounds.h"
239 fc(i,k)=(rho(i,j,k+1)-rho(i,j,k))/(hz(i,j,k+1)+hz(i,j,k))
251 deltar=hz(i,j,k)*fc(i,k)
252 deltal=hz(i,j,k)*fc(i,k-1)
253 IF ((deltar*deltal).lt.0.0_r8)
THEN
257 cff=hz(i,j,k-1)+2.0_r8*hz(i,j,k)+hz(i,j,k+1)
260 IF (abs(deltar).gt.abs(cffl)) deltar=cffl
261 IF (abs(deltal).gt.abs(cffr)) deltal=cffr
262 cff=(deltar-deltal)/(hz(i,j,k-1)+hz(i,j,k)+hz(i,j,k+1))
263 deltar=deltar-cff*hz(i,j,k+1)
264 deltal=deltal+cff*hz(i,j,k-1)
265 ar(i,k)=rho(i,j,k)+deltar
266 al(i,k)=rho(i,j,k)-deltal
267 dr(i,k)=(2.0_r8*deltar-deltal)**2
268 dl(i,k)=(2.0_r8*deltal-deltar)**2
273 al(i,n(ng))=ar(i,n(ng)-1)
274 ar(i,n(ng))=2.0_r8*rho(i,j,n(ng))-al(i,n(ng))
275 dr(i,n(ng))=(2.0_r8*ar(i,n(ng))+al(i,n(ng))- &
276 & 3.0_r8*rho(i,j,n(ng)))**2
277 dl(i,n(ng))=(3.0_r8*rho(i,j,n(ng))- &
278 & 2.0_r8*al(i,n(ng))-ar(i,n(ng)))**2
280 al(i,1)=2.0_r8*rho(i,j,1)-ar(i,1)
281 dr(i,1)=(2.0_r8*ar(i,1)+al(i,1)-3.0_r8*rho(i,j,1))**2
282 dl(i,1)=(3.0_r8*rho(i,j,1)-2.0_r8*al(i,1)-ar(i,1))**2
287 deltal=max(dl(i,k ),eps)
288 deltar=max(dr(i,k+1),eps)
289 r(i,j,k)=(deltar*ar(i,k)+deltal*al(i,k+1))/ &
296 r(i,j,n(ng))=1.5_r8*rho(i,j,n(ng))-0.5_r8*r(i,j,n(ng)-1)
297 r(i,j,0)=1.5_r8*rho(i,j,1)-0.5_r8*r(i,j,1 )
299 r(i,j,n(ng))=2.0_r8*rho(i,j,n(ng))-r(i,j,n(ng)-1)
300 r(i,j,0)=2.0_r8*rho(i,j,1)-r(i,j,1 )
310 p(i,j,n(ng))=p(i,j,n(ng))+zetat(i,j)
313 p(i,j,n(ng))=p(i,j,n(ng))+fac*(pair(i,j)-oneatm)
315#ifdef TIDE_GENERATING_FORCES
316 p(i,j,n(ng))=p(i,j,n(ng))-
g*eq_tide(i,j)
321 p(i,j,k-1)=p(i,j,k)+hz(i,j,k)*rho(i,j,k)
322 deltar=r(i,j,k)-rho(i,j,k)
323 deltal=rho(i,j,k)-r(i,j,k-1)
324 IF ((deltar*deltal).lt.0.0_r8)
THEN
326 ELSE IF (abs(deltar).gt.(2.0_r8*abs(deltal)))
THEN
328 ELSE IF (abs(deltal).gt.(2.0_r8*abs(deltar)))
THEN
333 fx(i,j,k)=0.5_r8*hz(i,j,k)* &
334 & (p(i,j,k)+p(i,j,k-1)+cff2*rr*hz(i,j,k))
341 IF ((j.ge.jstr).and.(j.le.jend))
THEN
347 delp=p(i-1,j,k-1)-p(i,j,k-1)
348 dh=z_w(i,j,k-1)-z_w(i-1,j,k-1)
349 deltar=dh*r(i,j,k-1)-delp
350 deltal=delp-dh*r(i-1,j,k-1)
351 IF ((deltar*deltal).lt.0.0_r8)
THEN
353 ELSE IF (abs(deltar).gt.(2.0_r8*abs(deltal)))
THEN
355 ELSE IF (abs(deltal).gt.(2.0_r8*abs(deltar)))
THEN
360 fc(i,k-1)=0.5_r8*dh*(p(i,j,k-1)+p(i-1,j,k-1)+cff2*rr)
361 ru(i,j,k,nrhs)=2.0_r8*(fx(i-1,j,k)-fx(i,j,k)+ &
362 & fc(i,k)-fc(i,k-1))/ &
363 & (hz(i-1,j,k)+hz(i,j,k))
365 ru(i,j,k,nrhs)=ru(i,j,k,nrhs)*umask(i,j)
368 ru(i,j,k,nrhs)=ru(i,j,k,nrhs)*umask_wet(i,j)
377 IF (j.ge.jstrv-1)
THEN
383 delp=p(i,j-1,k-1)-p(i,j,k-1)
384 dh=z_w(i,j,k-1)-z_w(i,j-1,k-1)
385 deltar=dh*r(i,j,k-1)-delp
386 deltal=delp-dh*r(i,j-1,k-1)
387 IF ((deltar*deltal).lt.0.0_r8)
THEN
389 ELSE IF (abs(deltar).gt.(2.0_r8*abs(deltal)))
THEN
391 ELSE IF (abs(deltal).gt.(2.0_r8*abs(deltar)))
THEN
396 fc(i,k-1)=0.5_r8*dh*(p(i,j,k-1)+p(i,j-1,k-1)+cff2*rr)
397 rv(i,j,k,nrhs)=2.0_r8*(fx(i,j-1,k)-fx(i,j,k)+ &
398 & fc(i,k)-fc(i,k-1))/ &
399 & (hz(i,j-1,k)+hz(i,j,k))
401 rv(i,j,k,nrhs)=rv(i,j,k,nrhs)*vmask(i,j)
404 rv(i,j,k,nrhs)=rv(i,j,k,nrhs)*vmask_wet(i,j)
417 dh=rr*(z_w(i,j,k)-z_w(i-1,j,k))
418 fc(i,k)=max(dh,0.0_r8)* &
419 & (ru(i,j,k+1,nrhs)+ru(i+1,j,k ,nrhs)- &
420 & ru(i,j,k ,nrhs)-ru(i-1,j,k+1,nrhs))+ &
422 & (ru(i,j,k ,nrhs)+ru(i+1,j,k+1,nrhs)- &
423 & ru(i,j,k+1,nrhs)-ru(i-1,j,k ,nrhs))
428 dh=rr*(z_w(i,j,0)-z_w(i-1,j,0))
429 fc(i,0)=max(dh,0.0_r8)* &
430 & (ru(i ,j,1,nrhs)-ru(i-1,j,1,nrhs))+ &
432 & (ru(i+1,j,1,nrhs)-ru(i ,j,1,nrhs))
436 ru(i,j,k,nrhs)=(cff*(z_w(i-1,j,n(ng))-z_w(i,j,n(ng)))+ &
437 & cff1*ru(i,j,k,nrhs))* &
438 & (hz(i-1,j,k)+hz(i,j,k))*on_u(i,j)+ &
439 & (fc(i,k)-fc(i,k-1))*on_u(i,j)
441 diaru(i,j,k,nrhs,
m3pgrd)=ru(i,j,k,nrhs)
450 dh=rr*(z_w(i,j,k)-z_w(i,j-1,k))
451 fx(i,j,k)=max(dh,0.0_r8)* &
452 & (rv(i,j,k+1,nrhs)+rv(i+1,j ,k ,nrhs)- &
453 & rv(i,j,k ,nrhs)-rv(i ,j-1,k+1,nrhs))+ &
455 & (rv(i,j,k ,nrhs)+rv(i+1,j ,k+1,nrhs)- &
456 & rv(i,j,k+1,nrhs)-rv(i ,j-1,k ,nrhs))
461 dh=rr*(z_w(i,j,0)-z_w(i,j-1,0))
462 fx(i,j,0)=max(dh,0.0_r8)* &
463 & (rv(i ,j,1,nrhs)-rv(i,j-1,1,nrhs))+ &
465 & (rv(i+1,j,1,nrhs)-rv(i,j ,1,nrhs))
471 rv(i,j,k,nrhs)=(cff*(z_w(i,j-1,n(ng))-z_w(i,j,n(ng)))+ &
472 & cff1*rv(i,j,k,nrhs))* &
473 & (hz(i,j-1,k)+hz(i,j,k))*om_v(i,j)+ &
474 & (fx(i,j,k)-fx(i,j,k-1))*om_v(i,j)
476 diarv(i,j,k,nrhs,
m3pgrd)=rv(i,j,k,nrhs)