118 & LBi, UBi, LBj, UBj, &
119 & IminS, ImaxS, JminS, JmaxS, &
122# if defined UV_LOGDRAG
124# elif defined UV_LDRAG
126# elif defined UV_QDRAG
129# if !defined BBL_MODEL_NOT_YET || defined ICESHELF
137# if !defined BBL_MODEL_NOT_YET || defined ICESHELF
144# if defined SCORRECTION || defined SRELAXATION
151 & tl_sustr, tl_svstr, &
153# ifndef BBL_MODEL_NOT_YET
154 & tl_bustr, tl_bvstr, &
158 & tl_stflx, tl_btflx)
171 integer,
intent(in) :: ng, tile
172 integer,
intent(in) :: LBi, UBi, LBj, UBj
173 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
174 integer,
intent(in) :: nrhs
177 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
178 real(r8),
intent(in) :: tl_Hz(LBi:,LBj:,:)
179# if defined UV_LOGDRAG
180 real(r8),
intent(in) :: ZoBot(LBi:,LBj:)
181# elif defined UV_LDRAG
182 real(r8),
intent(in) :: rdrag(LBi:,LBj:)
183# elif defined UV_QDRAG
184 real(r8),
intent(in) :: rdrag2(LBi:,LBj:)
186# if !defined BBL_MODEL_NOT_YET || defined ICESHELF
187 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
188 real(r8),
intent(in) :: z_w(LBi:,LBj:,0:)
189 real(r8),
intent(in) :: tl_z_r(LBi:,LBj:,:)
190 real(r8),
intent(in) :: tl_z_w(LBi:,LBj:,0:)
193 real(r8),
intent(in) :: zice(LBi:,LBj:)
195 real(r8),
intent(in) :: t(LBi:,LBj:,:,:,:)
196 real(r8),
intent(in) :: tl_t(LBi:,LBj:,:,:,:)
197# if !defined BBL_MODEL_NOT_YET || defined ICESHELF
198 real(r8),
intent(in) :: u(LBi:,LBj:,:,:)
199 real(r8),
intent(in) :: v(LBi:,LBj:,:,:)
200 real(r8),
intent(in) :: tl_u(LBi:,LBj:,:,:)
201 real(r8),
intent(in) :: tl_v(LBi:,LBj:,:,:)
203 real(r8),
intent(in) :: stflx(LBi:,LBj:,:)
204 real(r8),
intent(in) :: btflx(LBi:,LBj:,:)
206 real(r8),
intent(in) :: dqdt(LBi:,LBj:)
207 real(r8),
intent(in) :: sst(LBi:,LBj:)
209# if defined SCORRECTION || defined SRELAXATION
210 real(r8),
intent(in) :: sss(LBi:,LBj:)
212 real(r8),
intent(in) :: stflux(LBi:,LBj:,:)
213 real(r8),
intent(in) :: btflux(LBi:,LBj:,:)
216 real(r8),
intent(inout) :: srflx(LBi:,LBj:)
218 real(r8),
intent(inout) :: tl_sustr(LBi:,LBj:)
219 real(r8),
intent(inout) :: tl_svstr(LBi:,LBj:)
221# ifndef BBL_MODEL_NOT_YET
222 real(r8),
intent(inout) :: tl_bustr(LBi:,LBj:)
223 real(r8),
intent(inout) :: tl_bvstr(LBi:,LBj:)
225 real(r8),
intent(inout) :: tl_stflx(LBi:,LBj:,:)
226 real(r8),
intent(inout) :: tl_btflx(LBi:,LBj:,:)
228 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
229 real(r8),
intent(in) :: tl_Hz(LBi:UBi,LBj:UBj,N(ng))
230# if defined UV_LOGDRAG
231 real(r8),
intent(in) :: ZoBot(LBi:UBi,LBj:UBj)
232# elif defined UV_LDRAG
233 real(r8),
intent(in) :: rdrag(LBi:UBi,LBj:UBj)
234# elif defined UV_QDRAG
235 real(r8),
intent(in) :: rdrag2(LBi:UBi,LBj:UBj)
237# if !defined BBL_MODEL_NOT_YET || defined ICESHELF
238 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
239 real(r8),
intent(in) :: z_w(LBi:UBi,LBj:UBj,0:N(ng))
240 real(r8),
intent(in) :: tl_z_r(LBi:UBi,LBj:UBj,N(ng))
241 real(r8),
intent(in) :: tl_z_w(LBi:UBi,LBj:UBj,0:N(ng))
244 real(r8),
intent(in) :: zice(LBi:UBi,LBj:UBj)
246 real(r8),
intent(in) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
247 real(r8),
intent(in) :: tl_t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
248# if !defined BBL_MODEL_NOT_YET || defined ICESHELF
249 real(r8),
intent(in) :: u(LBi:UBi,LBj:UBj,N(ng),2)
250 real(r8),
intent(in) :: v(LBi:UBi,LBj:UBj,N(ng),2)
251 real(r8),
intent(in) :: tl_u(LBi:UBi,LBj:UBj,N(ng),2)
252 real(r8),
intent(in) :: tl_v(LBi:UBi,LBj:UBj,N(ng),2)
254 real(r8),
intent(in) :: stflx(LBi:UBi,LBj:UBj,NT(ng))
255 real(r8),
intent(in) :: btflx(LBi:UBi,LBj:UBj,NT(ng))
257 real(r8),
intent(in) :: dqdt(LBi:UBi,LBj:UBj)
258 real(r8),
intent(in) :: sst(LBi:UBi,LBj:UBj)
260# if defined SCORRECTION || defined SRELAXATION
261 real(r8),
intent(in) :: sss(LBi:UBi,LBj:UBj)
263 real(r8),
intent(in) :: stflux(LBi:UBi,LBj:UBj,NT(ng))
264 real(r8),
intent(in) :: btflux(LBi:UBi,LBj:UBj,NT(ng))
267 real(r8),
intent(inout) :: srflx(LBi:UBi,LBj:UBj)
269 real(r8),
intent(inout) :: tl_sustr(LBi:UBi,LBj:UBj)
270 real(r8),
intent(inout) :: tl_svstr(LBi:UBi,LBj:UBj)
272# ifndef BBL_MODEL_NOT_YET
273 real(r8),
intent(inout) :: tl_bustr(LBi:UBi,LBj:UBj)
274 real(r8),
intent(inout) :: tl_bvstr(LBi:UBi,LBj:UBj)
276 real(r8),
intent(inout) :: tl_stflx(LBi:UBi,LBj:UBj,NT(ng))
277 real(r8),
intent(inout) :: tl_btflx(LBi:UBi,LBj:UBj,NT(ng))
282 integer :: i, j, itrc
284 real(r8) :: EmP, tl_EmP
285# if !defined BBL_MODEL_NOT_YET || defined ICESHELF
286 real(r8) :: cff1, cff2, cff3
287 real(r8) :: tl_cff1, tl_cff2, tl_cff3
290# if (!defined BBL_MODEL_NOT_YET || defined ICESHELF) && defined UV_LOGDRAG
291 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: wrk
292 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: tl_wrk
295# include "set_bounds.h"
315 tl_stflx(i,j,
itemp)=0.0_r8
318 tl_btflx(i,j,
itemp)=0.0_r8
336 & dqdt(i,j)*tl_t(i,j,n(ng),nrhs,
itemp)
341# ifdef LIMIT_STFLX_COOLING
362 cff2=stflx(i,j,
itemp)
363 tl_cff2=tl_stflx(i,j,
itemp)
364 cff3=0.5_r8*(1.0_r8+sign(1.0_r8,cff1-t(i,j,n(ng),nrhs,
itemp)))
370 tl_stflx(i,j,
itemp)=(1.0_r8- &
371 & cff3*0.5_r8*(1.0_r8-sign(1.0_r8,cff2)))* &
391 emp=stflux(i,j,
isalt)
393# if defined SCORRECTION
398 tl_stflx(i,j,
isalt)=emp*tl_t(i,j,n(ng),nrhs,
isalt)+ &
399 & tl_emp*t(i,j,n(ng),nrhs,
isalt)- &
401 & (tl_hz(i,j,n(ng))* &
402 & (t(i,j,n(ng),nrhs,
isalt)-sss(i,j))+ &
404 & tl_t(i,j,n(ng),nrhs,
isalt))
405# elif defined SRELAXATION
410 & (tl_hz(i,j,n(ng))* &
411 & (t(i,j,n(ng),nrhs,
isalt)-sss(i,j))+ &
413 & tl_t(i,j,n(ng),nrhs,
isalt))
417 tl_stflx(i,j,
isalt)=emp*tl_t(i,j,n(ng),nrhs,
isalt)+ &
418 & tl_emp*t(i,j,n(ng),nrhs,
isalt)
423 & tl_t(i,j,1,nrhs,
isalt)
428# if defined BIOLOGY || defined SEDIMENT || defined T_PASSIVE
439 tl_stflx(i,j,itrc)=0.0_r8
442 tl_btflx(i,j,itrc)=0.0_r8
458 IF (zice(i,j).ne.0.0_r8)
THEN
461 tl_stflx(i,j,itrc)=0.0_r8
469 IF (zice(i,j).ne.0.0_r8)
THEN
483# if defined UV_LOGDRAG
489 cff1=1.0_r8/log((z_w(i,j,n(ng))-z_r(i,j,n(ng)))/zobot(i,j))
490 tl_cff1=-cff1*cff1*(tl_z_w(i,j,n(ng))-tl_z_r(i,j,n(ng)))/ &
491 & (z_w(i,j,n(ng))-z_r(i,j,n(ng)))
495 tl_cff3=(0.5_r8-sign(0.5_r8,
cdb_min-cff2))*tl_cff2
497 tl_wrk(i,j)=(0.5_r8-sign(0.5_r8,cff3-
cdb_max))*tl_cff3
502 IF (zice(i,j)*zice(i-1,j).ne.0.0_r8)
THEN
503 cff1=0.25_r8*(v(i ,j ,n(ng),nrhs)+ &
504 & v(i ,j+1,n(ng),nrhs)+ &
505 & v(i-1,j ,n(ng),nrhs)+ &
506 & v(i-1,j+1,n(ng),nrhs))
507 tl_cff1=0.25_r8*(tl_v(i ,j ,n(ng),nrhs)+ &
508 & tl_v(i ,j+1,n(ng),nrhs)+ &
509 & tl_v(i-1,j ,n(ng),nrhs)+ &
510 & tl_v(i-1,j+1,n(ng),nrhs))
511 cff2=sqrt(u(i,j,n(ng),nrhs)*u(i,j,n(ng),nrhs)+cff1*cff1)
512 IF (cff2.ne.0.0_r8)
THEN
513 tl_cff2=(u(i,j,n(ng),nrhs)*tl_u(i,j,n(ng),nrhs)+ &
521 tl_sustr(i,j)=-0.5_r8* &
522 & ((tl_wrk(i-1,j)+tl_wrk(i,j))* &
523 & u(i,j,n(ng),nrhs)*cff2+ &
524 & (wrk(i-1,j)+wrk(i,j))* &
525 & (tl_u(i,j,n(ng),nrhs)*cff2+ &
526 & u(i,j,n(ng),nrhs)*tl_cff2))
532 IF (zice(i,j)*zice(i,j-1).ne.0.0_r8)
THEN
533 cff1=0.25_r8*(u(i ,j ,n(ng),nrhs)+ &
534 & u(i+1,j ,n(ng),nrhs)+ &
535 & u(i ,j-1,n(ng),nrhs)+ &
536 & u(i+1,j-1,n(ng),nrhs))
537 tl_cff1=0.25_r8*(tl_u(i ,j ,n(ng),nrhs)+ &
538 & tl_u(i+1,j ,n(ng),nrhs)+ &
539 & tl_u(i ,j-1,n(ng),nrhs)+ &
540 & tl_u(i+1,j-1,n(ng),nrhs))
541 cff2=sqrt(cff1*cff1+v(i,j,n(ng),nrhs)*v(i,j,n(ng),nrhs))
542 IF (cff2.ne.0.0_r8)
THEN
543 tl_cff2=(cff1*tl_cff1+ &
544 & v(i,j,n(ng),nrhs)*tl_v(i,j,n(ng),nrhs))/cff2
551 tl_svstr(i,j)=-0.5_r8* &
552 & ((tl_wrk(i,j-1)+tl_wrk(i,j))* &
553 & v(i,j,n(ng),nrhs)*cff2+ &
554 & (wrk(i,j-1)+wrk(i,j))* &
555 & (tl_v(i,j,n(ng),nrhs)*cff2+ &
556 & v(i,j,n(ng),nrhs)*tl_cff2))
560# elif defined UV_QDRAG
566 IF (zice(i,j)*zice(i-1,j).ne.0.0_r8)
THEN
567 cff1=0.25_r8*(v(i ,j ,n(ng),nrhs)+ &
568 & v(i ,j+1,n(ng),nrhs)+ &
569 & v(i-1,j ,n(ng),nrhs)+ &
570 & v(i-1,j+1,n(ng),nrhs))
571 tl_cff1=0.25_r8*(tl_v(i ,j ,n(ng),nrhs)+ &
572 & tl_v(i ,j+1,n(ng),nrhs)+ &
573 & tl_v(i-1,j ,n(ng),nrhs)+ &
574 & tl_v(i-1,j+1,n(ng),nrhs))
575 & cff2=sqrt(u(i,j,n(ng),nrhs)*u(i,j,n(ng),nrhs)+cff1*cff1)
576 IF (cff2.ne.0.0_r8)
THEN
577 tl_cff2=(u(i,j,n(ng),nrhs)*tl_u(i,j,n(ng),nrhs)+ &
585 tl_sustr(i,j)=-0.5_r8*(rdrag2(i-1,j)+rdrag2(i,j))* &
586 & (tl_u(i,j,n(ng),nrhs)*cff2+ &
587 & u(i,j,n(ng),nrhs)*tl_cff2)
593 IF (zice(i,j)*zice(i,j-1).ne.0.0_r8)
THEN
594 cff1=0.25_r8*(u(i ,j ,n(ng),nrhs)+ &
595 & u(i+1,j ,n(ng),nrhs)+ &
596 & u(i ,j-1,n(ng),nrhs)+ &
597 & u(i+1,j-1,n(ng),nrhs))
598 tl_cff1=0.25_r8*(tl_u(i ,j ,n(ng),nrhs)+ &
599 & tl_u(i+1,j ,n(ng),nrhs)+ &
600 & tl_u(i ,j-1,n(ng),nrhs)+ &
601 & tl_u(i+1,j-1,n(ng),nrhs))
602 cff2=sqrt(cff1*cff1+v(i,j,n(ng),nrhs)*v(i,j,n(ng),nrhs))
603 IF (cff2.ne.0.0_r8)
THEN
604 tl_cff2=(cff1*tl_cff1+ &
605 & v(i,j,n(ng),nrhs)*tl_v(i,j,n(ng),nrhs))/cff2
612 tl_svstr(i,j)=-0.5_r8*(rdrag2(i,j-1)+rdrag2(i,j))* &
613 & (tl_v(i,j,n(ng),nrhs)*cff2+ &
614 & v(i,j,n(ng),nrhs)*tl_cff2)
618# elif defined UV_LDRAG
624 IF (zice(i,j)*zice(i-1,j).ne.0.0_r8)
THEN
628 tl_sustr(i,j)=-0.5_r8*(rdrag(i-1,j)+rdrag(i,j))* &
629 & tl_u(i,j,n(ng),nrhs)
635 IF (zice(i,j)*zice(i,j-1).ne.0.0_r8)
THEN
639 tl_svstr(i,j)=-0.5_r8*(rdrag(i,j-1)+rdrag(i,j))* &
640 & tl_v(i,j,n(ng),nrhs)
647 IF (zice(i,j)*zice(i-1,j).ne.0.0_r8)
THEN
656 IF (zice(i,j)*zice(i,j-1).ne.0.0_r8)
THEN
673 & lbi, ubi, lbj, ubj, &
680 & lbi, ubi, lbj, ubj, &
691 & lbi, ubi, lbj, ubj, &
694 & tl_sustr, tl_svstr)
697# ifndef BBL_MODEL_NOT_YET
703# if defined UV_LOGDRAG
709 cff1=1.0_r8/log((z_r(i,j,1)-z_w(i,j,0))/zobot(i,j))
710 tl_cff1=-cff1*cff1*(tl_z_r(i,j,1)-tl_z_w(i,j,0))/ &
711 & (z_r(i,j,1)-z_w(i,j,0))
715 tl_cff3=(0.5_r8-sign(0.5_r8,
cdb_min-cff2))*tl_cff2
717 tl_wrk(i,j)=(0.5_r8-sign(0.5_r8,cff3-
cdb_max))*tl_cff3
722 cff1=0.25_r8*(v(i ,j ,1,nrhs)+ &
723 & v(i ,j+1,1,nrhs)+ &
724 & v(i-1,j ,1,nrhs)+ &
726 tl_cff1=0.25_r8*(tl_v(i ,j ,1,nrhs)+ &
727 & tl_v(i ,j+1,1,nrhs)+ &
728 & tl_v(i-1,j ,1,nrhs)+ &
729 & tl_v(i-1,j+1,1,nrhs))
730 cff2=sqrt(u(i,j,1,nrhs)*u(i,j,1,nrhs)+cff1*cff1)
731 IF (cff2.ne.0.0_r8)
THEN
732 tl_cff2=(u(i,j,1,nrhs)*tl_u(i,j,1,nrhs)+cff1*tl_cff1)/cff2
739 tl_bustr(i,j)=0.5_r8* &
740 & ((tl_wrk(i-1,j)+tl_wrk(i,j))* &
741 & u(i,j,1,nrhs)*cff2+ &
742 & (wrk(i-1,j)+wrk(i,j))* &
743 & (tl_u(i,j,1,nrhs)*cff2+ &
744 & u(i,j,1,nrhs)*tl_cff2))
749 cff1=0.25_r8*(u(i ,j ,1,nrhs)+ &
750 & u(i+1,j ,1,nrhs)+ &
751 & u(i ,j-1,1,nrhs)+ &
753 tl_cff1=0.25_r8*(tl_u(i ,j ,1,nrhs)+ &
754 & tl_u(i+1,j ,1,nrhs)+ &
755 & tl_u(i ,j-1,1,nrhs)+ &
756 & tl_u(i+1,j-1,1,nrhs))
757 cff2=sqrt(cff1*cff1+v(i,j,1,nrhs)*v(i,j,1,nrhs))
758 IF (cff2.ne.0.0_r8)
THEN
759 tl_cff2=(cff1*tl_cff1+v(i,j,1,nrhs)*tl_v(i,j,1,nrhs))/cff2
766 tl_bvstr(i,j)=0.5_r8* &
767 & ((tl_wrk(i,j-1)+tl_wrk(i,j))* &
768 & v(i,j,1,nrhs)*cff2+ &
769 & (wrk(i,j-1)+wrk(i,j))* &
770 & (tl_v(i,j,1,nrhs)*cff2+ &
771 & v(i,j,1,nrhs)*tl_cff2))
774# elif defined UV_QDRAG
780 cff1=0.25_r8*(v(i ,j ,1,nrhs)+ &
781 & v(i ,j+1,1,nrhs)+ &
782 & v(i-1,j ,1,nrhs)+ &
784 tl_cff1=0.25_r8*(tl_v(i ,j ,1,nrhs)+ &
785 & tl_v(i ,j+1,1,nrhs)+ &
786 & tl_v(i-1,j ,1,nrhs)+ &
787 & tl_v(i-1,j+1,1,nrhs))
788 cff2=sqrt(u(i,j,1,nrhs)*u(i,j,1,nrhs)+cff1*cff1)
789 IF (cff2.ne.0.0_r8)
THEN
790 tl_cff2=(u(i,j,1,nrhs)*tl_u(i,j,1,nrhs)+cff1*tl_cff1)/cff2
797 tl_bustr(i,j)=0.5_r8*(rdrag2(i-1,j)+rdrag2(i,j))* &
798 & (tl_u(i,j,1,nrhs)*cff2+ &
799 & u(i,j,1,nrhs)*tl_cff2)
804 cff1=0.25_r8*(u(i ,j ,1,nrhs)+ &
805 & u(i+1,j ,1,nrhs)+ &
806 & u(i ,j-1,1,nrhs)+ &
808 tl_cff1=0.25_r8*(tl_u(i ,j ,1,nrhs)+ &
809 & tl_u(i+1,j ,1,nrhs)+ &
810 & tl_u(i ,j-1,1,nrhs)+ &
811 & tl_u(i+1,j-1,1,nrhs))
812 cff2=sqrt(cff1*cff1+v(i,j,1,nrhs)*v(i,j,1,nrhs))
813 IF (cff2.ne.0.0_r8)
THEN
814 tl_cff2=(cff1*tl_cff1+v(i,j,1,nrhs)*tl_v(i,j,1,nrhs))/cff2
821 tl_bvstr(i,j)=0.5_r8*(rdrag2(i,j-1)+rdrag2(i,j))* &
822 & (tl_v(i,j,1,nrhs)*cff2+ &
823 & v(i,j,1,nrhs)*tl_cff2)
826# elif defined UV_LDRAG
835 tl_bustr(i,j)=0.5_r8*(rdrag(i-1,j)+rdrag(i,j))* &
844 tl_bvstr(i,j)=0.5_r8*(rdrag(i,j-1)+rdrag(i,j))* &
857 & lbi, ubi, lbj, ubj, &
864 & lbi, ubi, lbj, ubj, &
875 & lbi, ubi, lbj, ubj, &
878 & tl_bustr, tl_bvstr)