111 & LBi, UBi, LBj, UBj, &
112 & IminS, ImaxS, JminS, JmaxS, &
115# if defined UV_LOGDRAG
117# elif defined UV_LDRAG
119# elif defined UV_QDRAG
122# if !defined BBL_MODEL || defined ICESHELF
135# if !defined BBL_MODEL || defined ICESHELF
141# if defined SCORRECTION || defined SRELAXATION
167 integer,
intent(in) :: ng, tile
168 integer,
intent(in) :: LBi, UBi, LBj, UBj
169 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
170 integer,
intent(in) :: nrhs
173 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
174# if defined UV_LOGDRAG
175 real(r8),
intent(in) :: ZoBot(LBi:,LBj:)
176# elif defined UV_LDRAG
177 real(r8),
intent(in) :: rdrag(LBi:,LBj:)
178# elif defined UV_QDRAG
179 real(r8),
intent(in) :: rdrag2(LBi:,LBj:)
181# if !defined BBL_MODEL || defined ICESHELF
182 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
183 real(r8),
intent(in) :: z_w(LBi:,LBj:,0:)
186 real(r8),
intent(in) :: rmask(LBi:,LBj:)
189 real(r8),
intent(in) :: rmask_wet(LBi:,LBj:)
192 real(r8),
intent(in) :: zice(LBi:,LBj:)
194 real(r8),
intent(in) :: t(LBi:,LBj:,:,:,:)
195# if !defined BBL_MODEL || defined ICESHELF
196 real(r8),
intent(in) :: u(LBi:,LBj:,:,:)
197 real(r8),
intent(in) :: v(LBi:,LBj:,:,:)
200 real(r8),
intent(in) :: dqdt(LBi:,LBj:)
201 real(r8),
intent(in) :: sst(LBi:,LBj:)
203# if defined SCORRECTION || defined SRELAXATION
204 real(r8),
intent(in) :: sss(LBi:,LBj:)
206 real(r8),
intent(in) :: stflux(LBi:,LBj:,:)
207 real(r8),
intent(in) :: btflux(LBi:,LBj:,:)
210 real(r8),
intent(inout) :: srflx(LBi:,LBj:)
212 real(r8),
intent(inout) :: sustr(LBi:,LBj:)
213 real(r8),
intent(inout) :: svstr(LBi:,LBj:)
216 real(r8),
intent(inout) :: bustr(LBi:,LBj:)
217 real(r8),
intent(inout) :: bvstr(LBi:,LBj:)
219 real(r8),
intent(inout) :: stflx(LBi:,LBj:,:)
220 real(r8),
intent(inout) :: btflx(LBi:,LBj:,:)
222 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
223# if defined UV_LOGDRAG
224 real(r8),
intent(in) :: ZoBot(LBi:UBi,LBj:UBj)
225# elif defined UV_LDRAG
226 real(r8),
intent(in) :: rdrag(LBi:UBi,LBj:UBj)
227# elif defined UV_QDRAG
228 real(r8),
intent(in) :: rdrag2(LBi:UBi,LBj:UBj)
230# if !defined BBL_MODEL || defined ICESHELF
231 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
232 real(r8),
intent(in) :: z_w(LBi:UBi,LBj:UBj,0:N(ng))
235 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
238 real(r8),
intent(in) :: rmask_wet(LBi:UBi,LBj:UBj)
241 real(r8),
intent(in) :: zice(LBi:UBi,LBj:UBj)
243 real(r8),
intent(in) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
244# if !defined BBL_MODEL || defined ICESHELF
245 real(r8),
intent(in) :: u(LBi:UBi,LBj:UBj,N(ng),2)
246 real(r8),
intent(in) :: v(LBi:UBi,LBj:UBj,N(ng),2)
249 real(r8),
intent(in) :: dqdt(LBi:UBi,LBj:UBj)
250 real(r8),
intent(in) :: sst(LBi:UBi,LBj:UBj)
252# if defined SCORRECTION || defined SRELAXATION
253 real(r8),
intent(in) :: sss(LBi:UBi,LBj:UBj)
255 real(r8),
intent(in) :: stflux(LBi:UBi,LBj:UBj,NT(ng))
256 real(r8),
intent(in) :: btflux(LBi:UBi,LBj:UBj,NT(ng))
259 real(r8),
intent(inout) :: srflx(LBi:UBi,LBj:UBj)
261 real(r8),
intent(inout) :: sustr(LBi:UBi,LBj:UBj)
262 real(r8),
intent(inout) :: svstr(LBi:UBi,LBj:UBj)
265 real(r8),
intent(inout) :: bustr(LBi:UBi,LBj:UBj)
266 real(r8),
intent(inout) :: bvstr(LBi:UBi,LBj:UBj)
268 real(r8),
intent(inout) :: stflx(LBi:UBi,LBj:UBj,NT(ng))
269 real(r8),
intent(inout) :: btflx(LBi:UBi,LBj:UBj,NT(ng))
274 integer :: i, j, itrc
277# if !defined BBL_MODEL || defined ICESHELF || \
278 defined limit_stflx_cooling
279 real(r8) :: cff, cff1, cff2, cff3
282# if (!defined BBL_MODEL || defined ICESHELF) && defined UV_LOGDRAG
283 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: wrk
286# include "set_bounds.h"
307 stflx(i,j,
itemp)=stflx(i,j,
itemp)*rmask_wet(i,j)
308 btflx(i,j,
itemp)=btflx(i,j,
itemp)*rmask_wet(i,j)
324 & dqdt(i,j)*(t(i,j,n(ng),nrhs,
itemp)-sst(i,j))
326 stflx(i,j,
itemp)=stflx(i,j,
itemp)*rmask_wet(i,j)
332# ifdef LIMIT_STFLX_COOLING
353 cff2=stflx(i,j,
itemp)
354 cff3=0.5_r8*(1.0_r8+sign(1.0_r8,cff1-t(i,j,n(ng),nrhs,
itemp)))
355 stflx(i,j,
itemp)=cff2-cff3*0.5_r8*(cff2-abs(cff2))
357 stflx(i,j,
itemp)=stflx(i,j,
itemp)*rmask_wet(i,j)
376 emp=stflux(i,j,
isalt)
377# if defined SCORRECTION
378 stflx(i,j,
isalt)=emp*t(i,j,n(ng),nrhs,
isalt)- &
380 & (t(i,j,n(ng),nrhs,
isalt)-sss(i,j))
382 stflx(i,j,
isalt) = rmask_wet(i,j)*stflx(i,j,
isalt)
383# elif defined MASKING
384 stflx(i,j,
isalt) = rmask(i,j)*stflx(i,j,
isalt)
386# elif defined SRELAXATION
388 & (t(i,j,n(ng),nrhs,
isalt)-sss(i,j))
390 stflx(i,j,
isalt) = rmask_wet(i,j)*stflx(i,j,
isalt)
391# elif defined MASKING
392 stflx(i,j,
isalt) = rmask(i,j)*stflx(i,j,
isalt)
397 stflx(i,j,
isalt) = rmask_wet(i,j)*stflx(i,j,
isalt)
398# elif defined MASKING
399 stflx(i,j,
isalt) = rmask(i,j)*stflx(i,j,
isalt)
407# if defined BIOLOGY || defined SEDIMENT || defined T_PASSIVE
416 stflx(i,j,itrc)=stflux(i,j,itrc)
417 btflx(i,j,itrc)=btflux(i,j,itrc)
433 IF (zice(i,j).ne.0.0_r8)
THEN
434 stflx(i,j,itrc)=0.0_r8
442 IF (zice(i,j).ne.0.0_r8)
THEN
454# if defined UV_LOGDRAG
460 cff1=1.0_r8/log((z_w(i,j,n(ng))-z_r(i,j,n(ng)))/zobot(i,j))
467 IF (zice(i,j)*zice(i-1,j).ne.0.0_r8)
THEN
468 cff1=0.25_r8*(v(i ,j ,n(ng),nrhs)+ &
469 & v(i ,j+1,n(ng),nrhs)+ &
470 & v(i-1,j ,n(ng),nrhs)+ &
471 & v(i-1,j+1,n(ng),nrhs))
472 cff2=sqrt(u(i,j,n(ng),nrhs)*u(i,j,n(ng),nrhs)+cff1*cff1)
473 sustr(i,j)=-0.5_r8*(wrk(i-1,j)+wrk(i,j))* &
474 & u(i,j,n(ng),nrhs)*cff2
480 IF (zice(i,j)*zice(i,j-1).ne.0.0_r8)
THEN
481 cff1=0.25_r8*(u(i ,j ,n(ng),nrhs)+ &
482 & u(i+1,j ,n(ng),nrhs)+ &
483 & u(i ,j-1,n(ng),nrhs)+ &
484 & u(i+1,j-1,n(ng),nrhs))
485 cff2=sqrt(cff1*cff1+v(i,j,n(ng),nrhs)*v(i,j,n(ng),nrhs))
486 svstr(i,j)=-0.5_r8*(wrk(i,j-1)+wrk(i,j))* &
487 & v(i,j,n(ng),nrhs)*cff2
491# elif defined UV_QDRAG
497 IF (zice(i,j)*zice(i-1,j).ne.0.0_r8)
THEN
498 cff1=0.25_r8*(v(i ,j ,n(ng),nrhs)+ &
499 & v(i ,j+1,n(ng),nrhs)+ &
500 & v(i-1,j ,n(ng),nrhs)+ &
501 & v(i-1,j+1,n(ng),nrhs))
502 cff2=sqrt(u(i,j,n(ng),nrhs)*u(i,j,n(ng),nrhs)+cff1*cff1)
503 sustr(i,j)=-0.5_r8*(rdrag2(i-1,j)+rdrag2(i,j))* &
504 & u(i,j,n(ng),nrhs)*cff2
510 IF (zice(i,j)*zice(i,j-1).ne.0.0_r8)
THEN
511 cff1=0.25_r8*(u(i ,j ,n(ng),nrhs)+ &
512 & u(i+1,j ,n(ng),nrhs)+ &
513 & u(i ,j-1,n(ng),nrhs)+ &
514 & u(i+1,j-1,n(ng),nrhs))
515 cff2=sqrt(cff1*cff1+v(i,j,n(ng),nrhs)*v(i,j,n(ng),nrhs))
516 svstr(i,j)=-0.5_r8*(rdrag2(i,j-1)+rdrag2(i,j))* &
517 & v(i,j,n(ng),nrhs)*cff2
521# elif defined UV_LDRAG
527 IF (zice(i,j)*zice(i-1,j).ne.0.0_r8)
THEN
528 sustr(i,j)=-0.5_r8*(rdrag(i-1,j)+rdrag(i,j))* &
535 IF (zice(i,j)*zice(i,j-1).ne.0.0_r8)
THEN
536 svstr(i,j)=-0.5_r8*(rdrag(i,j-1)+rdrag(i,j))* &
544 IF (zice(i,j)*zice(i-1,j).ne.0.0_r8)
THEN
551 IF (zice(i,j)*zice(i,j-1).ne.0.0_r8)
THEN
562 & lbi, ubi, lbj, ubj, &
565 & lbi, ubi, lbj, ubj, &
569 & lbi, ubi, lbj, ubj, &
591# if defined UV_LOGDRAG
597 cff1=1.0_r8/log((z_r(i,j,1)-z_w(i,j,0))/zobot(i,j))
604 cff1=0.25_r8*(v(i ,j ,1,nrhs)+ &
605 & v(i ,j+1,1,nrhs)+ &
606 & v(i-1,j ,1,nrhs)+ &
608 cff2=sqrt(u(i,j,1,nrhs)*u(i,j,1,nrhs)+cff1*cff1)
609 bustr(i,j)=0.5_r8*(wrk(i-1,j)+wrk(i,j))* &
612 cff3=cff*0.5_r8*(hz(i-1,j,1)+hz(i,j,1))
613 bustr(i,j)=sign(1.0_r8, bustr(i,j))* &
614 & min(abs(bustr(i,j)), &
615 & abs(u(i,j,1,nrhs))*cff3)
621 cff1=0.25_r8*(u(i ,j ,1,nrhs)+ &
622 & u(i+1,j ,1,nrhs)+ &
623 & u(i ,j-1,1,nrhs)+ &
625 cff2=sqrt(cff1*cff1+v(i,j,1,nrhs)*v(i,j,1,nrhs))
626 bvstr(i,j)=0.5_r8*(wrk(i,j-1)+wrk(i,j))* &
629 cff3=cff*0.5_r8*(hz(i,j-1,1)+hz(i,j,1))
630 bvstr(i,j)=sign(1.0_r8, bvstr(i,j))* &
631 & min(abs(bvstr(i,j)), &
632 & abs(v(i,j,1,nrhs))*cff3)
636# elif defined UV_QDRAG
642 cff1=0.25_r8*(v(i ,j ,1,nrhs)+ &
643 & v(i ,j+1,1,nrhs)+ &
644 & v(i-1,j ,1,nrhs)+ &
646 cff2=sqrt(u(i,j,1,nrhs)*u(i,j,1,nrhs)+cff1*cff1)
647 bustr(i,j)=0.5_r8*(rdrag2(i-1,j)+rdrag2(i,j))* &
650 cff3=cff*0.5_r8*(hz(i-1,j,1)+hz(i,j,1))
651 bustr(i,j)=sign(1.0_r8, bustr(i,j))* &
652 & min(abs(bustr(i,j)), &
653 & abs(u(i,j,1,nrhs))*cff3)
659 cff1=0.25_r8*(u(i ,j ,1,nrhs)+ &
660 & u(i+1,j ,1,nrhs)+ &
661 & u(i ,j-1,1,nrhs)+ &
663 cff2=sqrt(cff1*cff1+v(i,j,1,nrhs)*v(i,j,1,nrhs))
664 bvstr(i,j)=0.5_r8*(rdrag2(i,j-1)+rdrag2(i,j))* &
667 cff3=cff*0.5_r8*(hz(i,j-1,1)+hz(i,j,1))
668 bvstr(i,j)=sign(1.0_r8, bvstr(i,j))* &
669 & min(abs(bvstr(i,j)), &
670 & abs(v(i,j,1,nrhs))*cff3)
674# elif defined UV_LDRAG
680 bustr(i,j)=0.5_r8*(rdrag(i-1,j)+rdrag(i,j))* &
683 cff1=cff*0.5_r8*(hz(i-1,j,1)+hz(i,j,1))
684 bustr(i,j)=sign(1.0_r8, bustr(i,j))* &
685 & min(abs(bustr(i,j)), &
686 & abs(u(i,j,1,nrhs))*cff1)
692 bvstr(i,j)=0.5_r8*(rdrag(i,j-1)+rdrag(i,j))* &
695 cff1=cff*0.5_r8*(hz(i,j-1,1)+hz(i,j,1))
696 bvstr(i,j)=sign(1.0_r8, bvstr(i,j))* &
697 & min(abs(bvstr(i,j)), &
698 & abs(v(i,j,1,nrhs))*cff1)
707 & lbi, ubi, lbj, ubj, &
710 & lbi, ubi, lbj, ubj, &
714 & lbi, ubi, lbj, ubj, &