77 & LBi, UBi, LBj, UBj, &
78 & IminS, ImaxS, JminS, JmaxS, &
79 & linew, liold, liunw)
84 integer,
intent(in) :: ng, tile, model
85 integer,
intent(in) :: lbi, ubi, lbj, ubj
86 integer,
intent(in) :: imins, imaxs, jmins, jmaxs
87 integer,
intent(in) :: linew, liold, liunw
94#include "set_bounds.h"
101 & lbi, ubi, lbj, ubj, &
102 & imins, imaxs, jmins, jmaxs, &
103 & linew, liold, liunw, &
105 &
grid(ng) % rmask, &
106 &
grid(ng) % umask, &
107 &
grid(ng) % vmask, &
110 &
grid(ng) % rmask_wet, &
111 &
grid(ng) % umask_wet, &
112 &
grid(ng) % vmask_wet, &
128 CALL ice_bc2d_tile (ng, tile, model,
isaice, &
129 & lbi, ubi, lbj, ubj, &
130 & imins, imaxs, jmins, jmaxs, &
142 & lbi, ubi, lbj, ubj, &
143 & imins, imaxs, jmins, jmaxs, &
144 & linew, liold, liunw, &
146 &
grid(ng) % rmask, &
147 &
grid(ng) % umask, &
148 &
grid(ng) % vmask, &
151 &
grid(ng) % rmask_wet, &
152 &
grid(ng) % umask_wet, &
153 &
grid(ng) % vmask_wet, &
169 CALL ice_bc2d_tile (ng, tile, model,
ishice, &
170 & lbi, ubi, lbj, ubj, &
171 & imins, imaxs, jmins, jmaxs, &
194 & lbi, ubi, lbj, ubj, &
195 & imins, imaxs, jmins, jmaxs, &
196 & linew, liold, liunw, &
198 &
grid(ng) % rmask, &
199 &
grid(ng) % umask, &
200 &
grid(ng) % vmask, &
203 &
grid(ng) % rmask_wet, &
204 &
grid(ng) % umask_wet, &
205 &
grid(ng) % vmask_wet, &
221 CALL ice_bc2d_tile (ng, tile, model,
ishsno, &
222 & lbi, ubi, lbj, ubj, &
223 & imins, imaxs, jmins, jmaxs, &
235 & lbi, ubi, lbj, ubj, &
236 & imins, imaxs, jmins, jmaxs, &
237 & linew, liold, liunw, &
239 &
grid(ng) % rmask, &
240 &
grid(ng) % umask, &
241 &
grid(ng) % vmask, &
244 &
grid(ng) % rmask_wet, &
245 &
grid(ng) % umask_wet, &
246 &
grid(ng) % vmask_wet, &
262 CALL ice_bc2d_tile (ng, tile, model,
ishmel, &
263 & lbi, ubi, lbj, ubj, &
264 & imins, imaxs, jmins, jmaxs, &
276 & lbi, ubi, lbj, ubj, &
277 & imins, imaxs, jmins, jmaxs, &
278 & linew, liold, liunw, &
280 &
grid(ng) % rmask, &
281 &
grid(ng) % umask, &
282 &
grid(ng) % vmask, &
285 &
grid(ng) % rmask_wet, &
286 &
grid(ng) % umask_wet, &
287 &
grid(ng) % vmask_wet, &
315 CALL ice_tibc_tile (ng, tile, model, &
316 & lbi, ubi, lbj, ubj, &
343 & lbi, ubi, lbj, ubj, &
344 & imins, imaxs, jmins, jmaxs, &
345 & linew, liold, liunw, &
347 &
grid(ng) % rmask, &
348 &
grid(ng) % umask, &
349 &
grid(ng) % vmask, &
352 &
grid(ng) % rmask_wet, &
353 &
grid(ng) % umask_wet, &
354 &
grid(ng) % vmask_wet, &
382 CALL ice_bc2d_tile (ng, tile, model,
isiage, &
383 & lbi, ubi, lbj, ubj, &
384 & imins, imaxs, jmins, jmaxs, &
392#if defined ICE_THERMO && defined ICE_BIO
399 & lbi, ubi, lbj, ubj, &
400 & imins, imaxs, jmins, jmaxs, &
401 & linew, liold, liunw, &
403 &
grid(ng) % rmask, &
404 &
grid(ng) % rmask, &
405 &
grid(ng) % vmask, &
408 &
grid(ng) % rmask_wet, &
409 &
grid(ng) % umask_wet, &
410 &
grid(ng) % vmask_wet, &
428 CALL ice_bc2d_tile (ng, tile, model,
isiphy, &
429 & lbi, ubi, lbj, ubj, &
441 & lbi, ubi, lbj, ubj, &
442 & imins, imaxs, jmins, jmaxs, &
443 & linew, liold, liunw, &
445 &
grid(ng) % rmask, &
446 &
grid(ng) % umask, &
447 &
grid(ng) % vmask, &
450 &
grid(ng) % rmask_wet, &
451 &
grid(ng) % umask_wet, &
452 &
grid(ng) % vmask_wet, &
468 CALL ice_bc2d_tile (ng, tile, model,
isino3, &
469 & lbi, ubi, lbj, ubj, &
481 & lbi, ubi, lbj, ubj, &
482 & imins, imaxs, jmins, jmaxs, &
483 & linew, liold, liunw, &
485 &
grid(ng) % rmask, &
486 &
grid(ng) % umask, &
487 &
grid(ng) % vmask, &
490 &
grid(ng) % rmask_wet, &
491 &
grid(ng) % umask_wet, &
492 &
grid(ng) % vmask_wet, &
508 CALL ice_bc2d_tile (ng, tile, model,
isinh4, &
509 & lbi, ubi, lbj, ubj, &
523 & lbi, ubi, lbj, ubj, &
527 & lbi, ubi, lbj, ubj, &
532 & lbi, ubi, lbj, ubj, &
536 & lbi, ubi, lbj, ubj, &
540 & lbi, ubi, lbj, ubj, &
544 & lbi, ubi, lbj, ubj, &
548 & lbi, ubi, lbj, ubj, &
552 & lbi, ubi, lbj, ubj, &
557 & lbi, ubi, lbj, ubj, &
561 & lbi, ubi, lbj, ubj, &
565 & lbi, ubi, lbj, ubj, &
574 & lbi, ubi, lbj, ubj, &
581 & lbi, ubi, lbj, ubj, &
587 & lbi, ubi, lbj, ubj, &
596 & lbi, ubi, lbj, ubj, &
610 & LBi, UBi, LBj, UBj, &
611 & IminS, ImaxS, JminS, JmaxS, &
612 & linew, liold, liunw, &
614 & rmask, umask, vmask, &
617 & rmask_wet, umask_wet, vmask_wet, &
631 integer,
intent(in) :: ng, tile, model
632 integer,
intent(in) :: lbi, ubi, lbj, ubj
633 integer,
intent(in) :: imins, imaxs, jmins, jmaxs
634 integer,
intent(in) :: linew, liold, liunw
638 real(r8),
intent(in) :: rmask(lbi:,lbj:)
639 real(r8),
intent(in) :: umask(lbi:,lbj:)
640 real(r8),
intent(in) :: vmask(lbi:,lbj:)
643 real(r8),
intent(in) :: rmask_wet(lbi:,lbj:)
644 real(r8),
intent(in) :: umask_wet(lbi:,lbj:)
645 real(r8),
intent(in) :: vmask_wet(lbi:,lbj:)
648 real(r8),
intent(in) :: zice(lbi:,lbj:)
651 real(r8),
intent(in) :: pm(lbi:,lbj:)
652 real(r8),
intent(in) :: pn(lbi:,lbj:)
654 real(r8),
intent(in) :: on_u(lbi:,lbj:)
655 real(r8),
intent(in) :: om_v(lbi:,lbj:)
656 real(r8),
intent(in) :: omn(lbi:,lbj:)
657 real(r8),
intent(in) :: ui(lbi:,lbj:,:)
658 real(r8),
intent(in) :: vi(lbi:,lbj:,:)
659 real(r8),
intent(inout) :: field(lbi:,lbj:,:)
662 real(r8),
intent(in) :: rmask(lbi:ubi,lbj:ubj)
663 real(r8),
intent(in) :: umask(lbi:ubi,lbj:ubj)
664 real(r8),
intent(in) :: vmask(lbi:ubi,lbj:ubj)
667 real(r8),
intent(in) :: rmask_wet(lbi:ubi,lbj:ubj)
668 real(r8),
intent(in) :: umask_wet(lbi:ubi,lbj:ubj)
669 real(r8),
intent(in) :: vmask_wet(lbi:ubi,lbj:ubj)
672 real(r8),
intent(in) :: zice(lbi:ubi,lbj:ubj)
675 real(r8),
intent(in) :: pm(lbi:ubi,lbj:ubj)
676 real(r8),
intent(in) :: pn(lbi:ubi,lbj:ubj)
678 real(r8),
intent(in) :: on_u(lbi:ubi,lbj:ubj)
679 real(r8),
intent(in) :: om_v(lbi:ubi,lbj:ubj)
680 real(r8),
intent(in) :: omn(lbi:ubi,lbj:ubj)
681 real(r8),
intent(in) :: ui(lbi:ubi,lbj:ubj,2)
682 real(r8),
intent(in) :: vi(lbi:ubi,lbj:ubj,2)
683 real(r8),
intent(inout) :: field(lbi:ubi,lbj:ubj,2)
688 integer :: imin, imax, jmin, jmax
691 real(r8) :: cu_crss, cu
692 real(r8) :: cff1, cff2, rateu, ratev, rateyiu, ratexiv
693 real(r8) :: uspeed, vspeed
695 real(r8),
parameter :: epsil = 1.0e-15_r8
696 real(r8),
parameter :: add = 3.0e+3_r8
698 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: ar
699 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: aflxu
700 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: aflxv
701 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: aif
702 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: fx
703 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: fe
705#include "set_bounds.h"
717 imax=min(iend+1,
lm(ng))
724 jmax=min(jend+1,
mm(ng))
737 cff1=max(0.0_r8,ui(i,j,liunw))
738 cff2=min(0.0_r8,ui(i,j,liunw))
739 aflxu(i,j)=on_u(i,j)* &
740 & (cff1*field(i-1,j,liold)+ &
741 & cff2*field(i ,j,liold))
746 cff1=max(0.0_r8,vi(i,j,liunw))
747 cff2=min(0.0_r8,vi(i,j,liunw))
748 aflxv(i,j)=om_v(i,j)* &
749 & (cff1*field(i,j-1,liold)+ &
750 & cff2*field(i,j ,liold))
758 ar(i,j)=1.0_r8/omn(i,j)
759 aif(i,j)=(field(i,j,liold)- &
760 &
dtice(ng)*(aflxu(i+1,j)-aflxu(i,j)+ &
761 & aflxv(i,j+1)-aflxv(i,j))*ar(i,j))
763 aif(i,j)=aif(i,j)*rmask(i,j)
766 aif(i,j)=aif(i,j)*rmask_wet(i,j)
769 IF (zice(i,j).ne.0.0_r8) aif(i,j)=0.0_r8
777 IF (
domain(ng)%Western_Edge(tile))
THEN
779 aif(istr-1,j)=aif(istr,j)
782 IF (
domain(ng)%Eastern_Edge(tile))
THEN
784 aif(iend+1,j)=aif(iend,j)
790 IF (
domain(ng)%Southern_Edge(tile))
THEN
792 aif(i,jstr-1)=aif(i,jstr)
795 IF (
domain(ng)%Northern_Edge(tile))
THEN
797 aif(i,jend+1)=aif(i,jend)
801 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
802 aif(istr-1,jstr-1)=aif(istr,jstr)
804 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
805 aif(istr-1,jend+1)=aif(istr,jend)
807 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
808 aif(iend+1,jstr-1)=aif(iend,jstr)
810 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
811 aif(iend+1,jend+1)=aif(iend,jend)
822 aif(i,j)=aif(i,j)*rmask(i,j)
824 aif(i,j)=aif(i,j)*rmask_wet(i,j)
832 IF (zice(i,j).ne.0.0_r8)
THEN
858 & (aif(i,j)-aif(i,j-1))
867 & (aif(i,j)-aif(i-1,j))
873 rateu=(aif(i,j)-aif(i-1,j))/ &
874 & max(epsil, aif(i,j)+aif(i-1,j))
876 rateyiu=(fe(i,j+1)+fe(i,j)+fe(i-1,j+1)+fe(i-1,j))/ &
877 & (max(epsil, aif(i ,j)+fe(i ,j+1)-fe(i ,j)+ &
878 & aif(i-1,j)+fe(i-1,j+1)-fe(i-1,j)))
880 cu=0.5*
dtice(ng)*(pm(i,j)+pm(i-1,j))*ui(i,j,liunw)
882 cu_crss=0.5_r8*
dtice(ng)* &
883 & 0.0625_r8*(pn(i-1,j+1)+pn(i,j+1)+ &
884 & pn(i-1,j-1)+pn(i,j-1))* &
885 & (vi(i-1,j+1,liunw)+vi(i,j+1,liunw)+ &
886 & vi(i-1,j ,liunw)+vi(i,j ,liunw))
888 uspeed=rateu*(abs(ui(i,j,liunw))-cu*ui(i,j,liunw))- &
889 & rateyiu*cu_crss*ui(i,j,liunw)
891 cff1=max(0.0_r8,uspeed)
892 cff2=min(0.0_r8,uspeed)
893 aflxu(i,j)=on_u(i,j)*(cff1*aif(i-1,j)+ &
900 ratev=(aif(i,j)-aif(i,j-1))/ &
901 & max(epsil, aif(i,j)+aif(i,j-1))
903 ratexiv=(fx(i+1,j)+fx(i,j) +fx(i+1,j-1)+fx(i,j-1))/ &
904 & (max(epsil, aif(i,j )+fx(i+1,j )-fx(i,j )+ &
905 & aif(i,j-1)+fx(i+1,j-1)-fx(i,j-1)))
907 cu=0.5*
dtice(ng)*(pn(i,j)+pn(i,j-1))*vi(i,j,liunw)
909 cu_crss=0.5_r8*
dtice(ng)* &
910 & 0.0625_r8*(pm(i+1,j)+pm(i+1,j-1)+ &
911 & pm(i-1,j)+pm(i-1,j-1))* &
912 & (ui(i,j ,liunw)+ui(i+1,j ,liunw)+ &
913 & ui(i,j-1,liunw)+ui(i+1,j-1,liunw))
915 vspeed=ratev*(abs(vi(i,j,liunw))-cu*vi(i,j,liunw))- &
916 & ratexiv*cu_crss*vi(i,j,liunw)
918 cff1=max(0.0_r8,vspeed)
919 cff2=min(0.0_r8,vspeed)
920 aflxv(i,j)=om_v(i,j)*(cff1*aif(i,j-1)+ &
930 &
dtice(ng)*pm(i,j)*pn(i,j)* &
931 & (aflxu(i+1,j)-aflxu(i,j)+ &
932 & aflxv(i,j+1)-aflxv(i,j))
934 aif(i,j)=aif(i,j)*rmask(i,j)
937 aif(i,j)=aif(i,j)*rmask_wet(i,j)
940 IF (zice(i,j).ne.0.0_r8) aif(i,j)=0.
950 field(i,j,linew)=aif(i,j)