This subroutine does epipycnal diffusion of all tracers between the mixed and buffer layers and the interior, using the diffusivity in CSKhTr. Multiple iterations are used (if necessary) so that there is no limit on the acceptable time increment.
589 type(ocean_grid_type),
intent(inout) :: G
590 type(verticalGrid_type),
intent(in) :: GV
591 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: h
592 real,
intent(in) :: dt
593 type(tracer_type),
intent(inout) :: Tr(:)
594 integer,
intent(in) :: ntr
595 real,
dimension(SZIB_(G),SZJ_(G)),
intent(in) :: khdt_epi_x
598 real,
dimension(SZI_(G),SZJB_(G)),
intent(in) :: khdt_epi_y
601 type(unit_scale_type),
intent(in) :: US
602 type(tracer_hor_diff_CS),
intent(inout) :: CS
603 type(thermo_var_ptrs),
intent(in) :: tv
604 integer,
intent(in) :: num_itts
607 real,
dimension(SZI_(G), SZJ_(G)) :: &
609 real,
dimension(SZI_(G), SZJ_(G), max(1,GV%nk_rho_varies)) :: &
614 type(p2d),
dimension(SZJ_(G)) :: &
615 deep_wt_Lu, deep_wt_Ru, &
618 type(p2d),
dimension(SZJB_(G)) :: &
619 deep_wt_Lv, deep_wt_Rv, &
622 type(p2di),
dimension(SZJ_(G)) :: &
625 type(p2di),
dimension(SZJB_(G)) :: &
629 real,
dimension(SZI_(G), SZJ_(G), SZK_(G)) :: &
631 real,
dimension(SZI_(G), SZJ_(G), SZK_(G)) :: Tr_flux_3d, Tr_adj_vert_L, Tr_adj_vert_R
633 real,
dimension(SZI_(G), SZK_(G), SZJ_(G)) :: &
636 integer,
dimension(SZI_(G), SZK_(G), SZJ_(G)) :: &
640 real,
dimension(SZK_(G)) :: &
647 integer,
dimension(SZI_(G), SZJ_(G)) :: &
653 integer,
dimension(SZJ_(G)) :: &
655 integer,
dimension(SZIB_(G), SZJ_(G)) :: &
657 integer,
dimension(SZI_(G), SZJB_(G)) :: &
663 real :: rho_pair, rho_a, rho_b
679 integer,
dimension(SZK_(G)*2) :: &
682 logical,
dimension(SZK_(G)*2) :: &
687 real :: p_ref_cv(SZI_(G))
689 integer,
dimension(2) :: EOSdom
690 integer :: k_max, k_min, k_test, itmp
691 integer :: i, j, k, k2, m, is, ie, js, je, nz, nkmb
692 integer :: isd, ied, jsd, jed, IsdB, IedB, k_size
693 integer :: kL, kR, kLa, kLb, kRa, kRb, nP, itt, ns, max_itt
694 integer :: PEmax_kRho
695 integer :: isv, iev, jsv, jev
697 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = gv%ke
698 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
699 isdb = g%IsdB ; iedb = g%IedB
701 nkmb = gv%nk_rho_varies
703 if (num_itts <= 1)
then
704 max_itt = 1 ; i_maxitt = 1.0
706 max_itt = num_itts ; i_maxitt = 1.0 / (real(max_itt))
709 do i=is-2,ie+2 ; p_ref_cv(i) = tv%P_Ref ;
enddo
710 eosdom(:) = eos_domain(g%HI,halo=2)
712 call do_group_pass(cs%pass_t, g%Domain, clock=id_clock_pass)
715 do k=1,nkmb ;
do j=js-2,je+2
716 call calculate_density(tv%T(:,j,k),tv%S(:,j,k), p_ref_cv, rho_coord(:,j,k), &
717 tv%eqn_of_state, eosdom)
720 do j=js-2,je+2 ;
do i=is-2,ie+2
721 rml_max(i,j) = rho_coord(i,j,1)
722 num_srt(i,j) = 0 ; max_krho(i,j) = 0
724 do k=2,nkmb ;
do j=js-2,je+2 ;
do i=is-2,ie+2
725 if (rml_max(i,j) < rho_coord(i,j,k)) rml_max(i,j) = rho_coord(i,j,k)
726 enddo ;
enddo ;
enddo
731 do j=js-2,je+2 ;
do i=is-2,ie+2 ;
if (g%mask2dT(i,j) > 0.5)
then
732 if ((rml_max(i,j) > gv%Rlay(nz)) .or. (nkmb+1 > nz))
then ; max_krho(i,j) = nz+1
733 elseif ((rml_max(i,j) <= gv%Rlay(nkmb+1)) .or. (nkmb+2 > nz))
then ; max_krho(i,j) = nkmb+1
735 k_min = nkmb+2 ; k_max = nz
737 k_test = (k_min + k_max) / 2
738 if (rml_max(i,j) <= gv%Rlay(k_test-1))
then ; k_max = k_test-1
739 elseif (gv%Rlay(k_test) < rml_max(i,j))
then ; k_min = k_test+1
740 else ; max_krho(i,j) = k_test ;
exit ;
endif
742 if (k_min == k_max)
then ; max_krho(i,j) = k_max ;
exit ;
endif
745 endif ;
enddo ;
enddo
748 do j=js-1,je+1 ;
do i=is-1,ie+1
749 k_end_srt(i,j) = max(max_krho(i,j), max_krho(i-1,j), max_krho(i+1,j), &
750 max_krho(i,j-1), max_krho(i,j+1))
751 if (pemax_krho < k_end_srt(i,j)) pemax_krho = k_end_srt(i,j)
753 if (pemax_krho > nz) pemax_krho = nz
755 h_exclude = 10.0*(gv%Angstrom_H + gv%H_subroundoff)
759 do k=1,nkmb ;
do i=is-1,ie+1 ;
if (g%mask2dT(i,j) > 0.5)
then
760 if (h(i,j,k) > h_exclude)
then
761 num_srt(i,j) = num_srt(i,j) + 1 ; ns = num_srt(i,j)
763 rho_srt(i,ns,j) = rho_coord(i,j,k)
764 h_srt(i,ns,j) = h(i,j,k)
766 endif ;
enddo ;
enddo
767 do k=nkmb+1,pemax_krho ;
do i=is-1,ie+1 ;
if (g%mask2dT(i,j) > 0.5)
then
768 if ((k<=k_end_srt(i,j)) .and. (h(i,j,k) > h_exclude))
then
769 num_srt(i,j) = num_srt(i,j) + 1 ; ns = num_srt(i,j)
771 rho_srt(i,ns,j) = gv%Rlay(k)
772 h_srt(i,ns,j) = h(i,j,k)
774 endif ;
enddo ;
enddo
779 do j=js-1,je+1;
do i=is-1,ie+1
780 do k=2,num_srt(i,j) ;
if (rho_srt(i,k,j) < rho_srt(i,k-1,j))
then
782 do k2 = k,2,-1 ;
if (rho_srt(i,k2,j) >= rho_srt(i,k2-1,j))
exit
783 itmp = k0_srt(i,k2-1,j) ; k0_srt(i,k2-1,j) = k0_srt(i,k2,j) ; k0_srt(i,k2,j) = itmp
784 tmp = rho_srt(i,k2-1,j) ; rho_srt(i,k2-1,j) = rho_srt(i,k2,j) ; rho_srt(i,k2,j) = tmp
785 tmp = h_srt(i,k2-1,j) ; h_srt(i,k2-1,j) = h_srt(i,k2,j) ; h_srt(i,k2,j) = tmp
792 do i=is-1,ie+1 ; max_srt(j) = max(max_srt(j), num_srt(i,j)) ;
enddo
797 k_size = max(2*max_srt(j),1)
798 allocate(deep_wt_lu(j)%p(isdb:iedb,k_size))
799 allocate(deep_wt_ru(j)%p(isdb:iedb,k_size))
800 allocate(hp_lu(j)%p(isdb:iedb,k_size))
801 allocate(hp_ru(j)%p(isdb:iedb,k_size))
802 allocate(k0a_lu(j)%p(isdb:iedb,k_size))
803 allocate(k0a_ru(j)%p(isdb:iedb,k_size))
804 allocate(k0b_lu(j)%p(isdb:iedb,k_size))
805 allocate(k0b_ru(j)%p(isdb:iedb,k_size))
815 do j=js,je ;
do i=is-1,ie ;
if (g%mask2dCu(i,j) > 0.5)
then
818 do k=1,num_srt(i,j) ; h_demand_l(k) = 0.0 ; h_used_l(k) = 0.0 ;
enddo
819 do k=1,num_srt(i+1,j) ; h_demand_r(k) = 0.0 ; h_used_r(k) = 0.0 ;
enddo
826 if (rho_srt(i,1,j) < rho_srt(i+1,1,j))
then
828 do kl=2,num_srt(i,j) ;
if (rho_srt(i,kl,j) >= rho_srt(i+1,1,j))
exit ;
enddo
829 elseif (rho_srt(i+1,1,j) < rho_srt(i,1,j))
then
831 do kr=2,num_srt(i+1,j) ;
if (rho_srt(i+1,kr,j) >= rho_srt(i,1,j))
exit ;
enddo
837 if ((kl > num_srt(i,j)) .or. (kr > num_srt(i+1,j)))
exit
839 if (rho_srt(i,kl,j) > rho_srt(i+1,kr,j))
then
842 rho_pair = rho_srt(i+1,kr,j)
844 k0b_lu(j)%p(i,k) = k0_srt(i,kl,j) ; k0b_ru(j)%p(i,k) = k0_srt(i+1,kr,j)
845 k0a_lu(j)%p(i,k) = k0_srt(i,kl-1,j) ; k0a_ru(j)%p(i,k) = k0b_ru(j)%p(i,k)
846 kbs_lp(k) = kl ; kbs_rp(k) = kr
848 rho_a = rho_srt(i,kl-1,j) ; rho_b = rho_srt(i,kl,j)
849 wt_b = 1.0 ;
if (abs(rho_a - rho_b) > abs(rho_pair - rho_a)) &
850 wt_b = (rho_pair - rho_a) / (rho_b - rho_a)
851 deep_wt_lu(j)%p(i,k) = wt_b ; deep_wt_ru(j)%p(i,k) = 1.0
853 h_demand_l(kl) = h_demand_l(kl) + 0.5*h_srt(i+1,kr,j) * wt_b
854 h_demand_l(kl-1) = h_demand_l(kl-1) + 0.5*h_srt(i+1,kr,j) * (1.0-wt_b)
856 kr = kr+1 ; left_set(k) = .false. ; right_set(k) = .true.
857 elseif (rho_srt(i,kl,j) < rho_srt(i+1,kr,j))
then
860 rho_pair = rho_srt(i,kl,j)
861 k0b_lu(j)%p(i,k) = k0_srt(i,kl,j) ; k0b_ru(j)%p(i,k) = k0_srt(i+1,kr,j)
862 k0a_lu(j)%p(i,k) = k0b_lu(j)%p(i,k) ; k0a_ru(j)%p(i,k) = k0_srt(i+1,kr-1,j)
864 kbs_lp(k) = kl ; kbs_rp(k) = kr
866 rho_a = rho_srt(i+1,kr-1,j) ; rho_b = rho_srt(i+1,kr,j)
867 wt_b = 1.0 ;
if (abs(rho_a - rho_b) > abs(rho_pair - rho_a)) &
868 wt_b = (rho_pair - rho_a) / (rho_b - rho_a)
869 deep_wt_lu(j)%p(i,k) = 1.0 ; deep_wt_ru(j)%p(i,k) = wt_b
871 h_demand_r(kr) = h_demand_r(kr) + 0.5*h_srt(i,kl,j) * wt_b
872 h_demand_r(kr-1) = h_demand_r(kr-1) + 0.5*h_srt(i,kl,j) * (1.0-wt_b)
874 kl = kl+1 ; left_set(k) = .true. ; right_set(k) = .false.
875 elseif ((k0_srt(i,kl,j) <= nkmb) .or. (k0_srt(i+1,kr,j) <= nkmb))
then
878 k0b_lu(j)%p(i,k) = k0_srt(i,kl,j) ; k0b_ru(j)%p(i,k) = k0_srt(i+1,kr,j)
879 k0a_lu(j)%p(i,k) = k0b_lu(j)%p(i,k) ; k0a_ru(j)%p(i,k) = k0b_ru(j)%p(i,k)
880 kbs_lp(k) = kl ; kbs_rp(k) = kr
881 deep_wt_lu(j)%p(i,k) = 1.0 ; deep_wt_ru(j)%p(i,k) = 1.0
883 h_demand_l(kl) = h_demand_l(kl) + 0.5*h_srt(i+1,kr,j)
884 h_demand_r(kr) = h_demand_r(kr) + 0.5*h_srt(i,kl,j)
886 kl = kl+1 ; kr = kr+1 ; left_set(k) = .true. ; right_set(k) = .true.
890 h_demand_l(kl) = h_demand_l(kl) + 0.5*h_srt(i+1,kr,j)
891 h_demand_r(kr) = h_demand_r(kr) + 0.5*h_srt(i,kl,j)
893 kl = kl+1 ; kr = kr+1
899 do k=1,num_srt(i+1,j)
900 h_supply_frac_r(k) = 1.0
901 if (h_demand_r(k) > 0.5*h_srt(i+1,k,j)) &
902 h_supply_frac_r(k) = 0.5*h_srt(i+1,k,j) / h_demand_r(k)
905 h_supply_frac_l(k) = 1.0
906 if (h_demand_l(k) > 0.5*h_srt(i,k,j)) &
907 h_supply_frac_l(k) = 0.5*h_srt(i,k,j) / h_demand_l(k)
912 kl = kbs_lp(k) ; kr = kbs_rp(k)
913 hp_lu(j)%p(i,k) = 0.0 ; hp_ru(j)%p(i,k) = 0.0
914 if (left_set(k))
then
915 if (deep_wt_ru(j)%p(i,k) < 1.0)
then
916 hp_ru(j)%p(i,k) = 0.5*h_srt(i,kl,j) * min(h_supply_frac_r(kr), h_supply_frac_r(kr-1))
917 wt_b = deep_wt_ru(j)%p(i,k)
918 h_used_r(kr-1) = h_used_r(kr-1) + (1.0 - wt_b)*hp_ru(j)%p(i,k)
919 h_used_r(kr) = h_used_r(kr) + wt_b*hp_ru(j)%p(i,k)
921 hp_ru(j)%p(i,k) = 0.5*h_srt(i,kl,j) * h_supply_frac_r(kr)
922 h_used_r(kr) = h_used_r(kr) + hp_ru(j)%p(i,k)
925 if (right_set(k))
then
926 if (deep_wt_lu(j)%p(i,k) < 1.0)
then
927 hp_lu(j)%p(i,k) = 0.5*h_srt(i+1,kr,j) * min(h_supply_frac_l(kl), h_supply_frac_l(kl-1))
928 wt_b = deep_wt_lu(j)%p(i,k)
929 h_used_l(kl-1) = h_used_l(kl-1) + (1.0 - wt_b)*hp_lu(j)%p(i,k)
930 h_used_l(kl) = h_used_l(kl) + wt_b*hp_lu(j)%p(i,k)
932 hp_lu(j)%p(i,k) = 0.5*h_srt(i+1,kr,j) * h_supply_frac_l(kl)
933 h_used_l(kl) = h_used_l(kl) + hp_lu(j)%p(i,k)
941 if (left_set(k)) hp_lu(j)%p(i,k) = hp_lu(j)%p(i,k) + &
942 (h_srt(i,kbs_lp(k),j) - h_used_l(kbs_lp(k)))
943 if (right_set(k)) hp_ru(j)%p(i,k) = hp_ru(j)%p(i,k) + &
944 (h_srt(i+1,kbs_rp(k),j) - h_used_r(kbs_rp(k)))
947 endif ;
enddo ;
enddo
950 k_size = max(max_srt(j)+max_srt(j+1),1)
951 allocate(deep_wt_lv(j)%p(isd:ied,k_size))
952 allocate(deep_wt_rv(j)%p(isd:ied,k_size))
953 allocate(hp_lv(j)%p(isd:ied,k_size))
954 allocate(hp_rv(j)%p(isd:ied,k_size))
955 allocate(k0a_lv(j)%p(isd:ied,k_size))
956 allocate(k0a_rv(j)%p(isd:ied,k_size))
957 allocate(k0b_lv(j)%p(isd:ied,k_size))
958 allocate(k0b_rv(j)%p(isd:ied,k_size))
968 do j=js-1,je ;
do i=is,ie ;
if (g%mask2dCv(i,j) > 0.5)
then
971 do k=1,num_srt(i,j) ; h_demand_l(k) = 0.0 ; h_used_l(k) = 0.0 ;
enddo
972 do k=1,num_srt(i,j+1) ; h_demand_r(k) = 0.0 ; h_used_r(k) = 0.0 ;
enddo
979 if (rho_srt(i,1,j) < rho_srt(i,1,j+1))
then
981 do kl=2,num_srt(i,j) ;
if (rho_srt(i,kl,j) >= rho_srt(i,1,j+1))
exit ;
enddo
982 elseif (rho_srt(i,1,j+1) < rho_srt(i,1,j))
then
984 do kr=2,num_srt(i,j+1) ;
if (rho_srt(i,kr,j+1) >= rho_srt(i,1,j))
exit ;
enddo
990 if ((kl > num_srt(i,j)) .or. (kr > num_srt(i,j+1)))
exit
992 if (rho_srt(i,kl,j) > rho_srt(i,kr,j+1))
then
995 rho_pair = rho_srt(i,kr,j+1)
997 k0b_lv(j)%p(i,k) = k0_srt(i,kl,j) ; k0b_rv(j)%p(i,k) = k0_srt(i,kr,j+1)
998 k0a_lv(j)%p(i,k) = k0_srt(i,kl-1,j) ; k0a_rv(j)%p(i,k) = k0b_rv(j)%p(i,k)
999 kbs_lp(k) = kl ; kbs_rp(k) = kr
1001 rho_a = rho_srt(i,kl-1,j) ; rho_b = rho_srt(i,kl,j)
1002 wt_b = 1.0 ;
if (abs(rho_a - rho_b) > abs(rho_pair - rho_a)) &
1003 wt_b = (rho_pair - rho_a) / (rho_b - rho_a)
1004 deep_wt_lv(j)%p(i,k) = wt_b ; deep_wt_rv(j)%p(i,k) = 1.0
1006 h_demand_l(kl) = h_demand_l(kl) + 0.5*h_srt(i,kr,j+1) * wt_b
1007 h_demand_l(kl-1) = h_demand_l(kl-1) + 0.5*h_srt(i,kr,j+1) * (1.0-wt_b)
1009 kr = kr+1 ; left_set(k) = .false. ; right_set(k) = .true.
1010 elseif (rho_srt(i,kl,j) < rho_srt(i,kr,j+1))
then
1013 rho_pair = rho_srt(i,kl,j)
1014 k0b_lv(j)%p(i,k) = k0_srt(i,kl,j) ; k0b_rv(j)%p(i,k) = k0_srt(i,kr,j+1)
1015 k0a_lv(j)%p(i,k) = k0b_lv(j)%p(i,k) ; k0a_rv(j)%p(i,k) = k0_srt(i,kr-1,j+1)
1017 kbs_lp(k) = kl ; kbs_rp(k) = kr
1019 rho_a = rho_srt(i,kr-1,j+1) ; rho_b = rho_srt(i,kr,j+1)
1020 wt_b = 1.0 ;
if (abs(rho_a - rho_b) > abs(rho_pair - rho_a)) &
1021 wt_b = (rho_pair - rho_a) / (rho_b - rho_a)
1022 deep_wt_lv(j)%p(i,k) = 1.0 ; deep_wt_rv(j)%p(i,k) = wt_b
1024 h_demand_r(kr) = h_demand_r(kr) + 0.5*h_srt(i,kl,j) * wt_b
1025 h_demand_r(kr-1) = h_demand_r(kr-1) + 0.5*h_srt(i,kl,j) * (1.0-wt_b)
1027 kl = kl+1 ; left_set(k) = .true. ; right_set(k) = .false.
1028 elseif ((k0_srt(i,kl,j) <= nkmb) .or. (k0_srt(i,kr,j+1) <= nkmb))
then
1031 k0b_lv(j)%p(i,k) = k0_srt(i,kl,j) ; k0b_rv(j)%p(i,k) = k0_srt(i,kr,j+1)
1032 k0a_lv(j)%p(i,k) = k0b_lv(j)%p(i,k) ; k0a_rv(j)%p(i,k) = k0b_rv(j)%p(i,k)
1033 kbs_lp(k) = kl ; kbs_rp(k) = kr
1034 deep_wt_lv(j)%p(i,k) = 1.0 ; deep_wt_rv(j)%p(i,k) = 1.0
1036 h_demand_l(kl) = h_demand_l(kl) + 0.5*h_srt(i,kr,j+1)
1037 h_demand_r(kr) = h_demand_r(kr) + 0.5*h_srt(i,kl,j)
1039 kl = kl+1 ; kr = kr+1 ; left_set(k) = .true. ; right_set(k) = .true.
1043 h_demand_l(kl) = h_demand_l(kl) + 0.5*h_srt(i,kr,j+1)
1044 h_demand_r(kr) = h_demand_r(kr) + 0.5*h_srt(i,kl,j)
1046 kl = kl+1 ; kr = kr+1
1052 do k=1,num_srt(i,j+1)
1053 h_supply_frac_r(k) = 1.0
1054 if (h_demand_r(k) > 0.5*h_srt(i,k,j+1)) &
1055 h_supply_frac_r(k) = 0.5*h_srt(i,k,j+1) / h_demand_r(k)
1058 h_supply_frac_l(k) = 1.0
1059 if (h_demand_l(k) > 0.5*h_srt(i,k,j)) &
1060 h_supply_frac_l(k) = 0.5*h_srt(i,k,j) / h_demand_l(k)
1065 kl = kbs_lp(k) ; kr = kbs_rp(k)
1066 hp_lv(j)%p(i,k) = 0.0 ; hp_rv(j)%p(i,k) = 0.0
1067 if (left_set(k))
then
1068 if (deep_wt_rv(j)%p(i,k) < 1.0)
then
1069 hp_rv(j)%p(i,k) = 0.5*h_srt(i,kl,j) * min(h_supply_frac_r(kr), h_supply_frac_r(kr-1))
1070 wt_b = deep_wt_rv(j)%p(i,k)
1071 h_used_r(kr-1) = h_used_r(kr-1) + (1.0 - wt_b) * hp_rv(j)%p(i,k)
1072 h_used_r(kr) = h_used_r(kr) + wt_b * hp_rv(j)%p(i,k)
1074 hp_rv(j)%p(i,k) = 0.5*h_srt(i,kl,j) * h_supply_frac_r(kr)
1075 h_used_r(kr) = h_used_r(kr) + hp_rv(j)%p(i,k)
1078 if (right_set(k))
then
1079 if (deep_wt_lv(j)%p(i,k) < 1.0)
then
1080 hp_lv(j)%p(i,k) = 0.5*h_srt(i,kr,j+1) * min(h_supply_frac_l(kl), h_supply_frac_l(kl-1))
1081 wt_b = deep_wt_lv(j)%p(i,k)
1082 h_used_l(kl-1) = h_used_l(kl-1) + (1.0 - wt_b) * hp_lv(j)%p(i,k)
1083 h_used_l(kl) = h_used_l(kl) + wt_b * hp_lv(j)%p(i,k)
1085 hp_lv(j)%p(i,k) = 0.5*h_srt(i,kr,j+1) * h_supply_frac_l(kl)
1086 h_used_l(kl) = h_used_l(kl) + hp_lv(j)%p(i,k)
1094 if (left_set(k)) hp_lv(j)%p(i,k) = hp_lv(j)%p(i,k) + &
1095 (h_srt(i,kbs_lp(k),j) - h_used_l(kbs_lp(k)))
1096 if (right_set(k)) hp_rv(j)%p(i,k) = hp_rv(j)%p(i,k) + &
1097 (h_srt(i,kbs_rp(k),j+1) - h_used_r(kbs_rp(k)))
1101 endif ;
enddo ;
enddo
1106 do k=1,pemax_krho ;
do j=js-1,je+1 ;
do i=is-1,ie+1
1107 tr_flux_conv(i,j,k) = 0.0
1108 enddo ;
enddo ;
enddo
1113 call do_group_pass(cs%pass_t, g%Domain, clock=id_clock_pass)
1123 do j=js,je ;
do i=is-1,ie ;
if (g%mask2dCu(i,j) > 0.5)
then
1127 if (npu(i,j) >= 1)
then
1128 tr_min_face = min(tr(m)%t(i,j,1), tr(m)%t(i+1,j,1))
1129 tr_max_face = max(tr(m)%t(i,j,1), tr(m)%t(i+1,j,1))
1131 tr_min_face = min(tr_min_face, tr(m)%t(i,j,k), tr(m)%t(i+1,j,k))
1132 tr_max_face = max(tr_max_face, tr(m)%t(i,j,k), tr(m)%t(i+1,j,k))
1136 kla = nkmb+1 ;
if (max_krho(i,j) < nz+1) kla = max_krho(i,j)
1137 klb = kla ;
if (max_krho(i,j) < nz) klb = max_krho(i,j)+1
1138 kra = nkmb+1 ;
if (max_krho(i+1,j) < nz+1) kra = max_krho(i+1,j)
1139 krb = kra ;
if (max_krho(i+1,j) < nz) krb = max_krho(i+1,j)+1
1140 tr_la = tr_min_face ; tr_lb = tr_la ; tr_ra = tr_la ; tr_rb = tr_la
1141 if (h(i,j,kla) > h_exclude) tr_la = tr(m)%t(i,j,kla)
1142 if (h(i,j,klb) > h_exclude) tr_la = tr(m)%t(i,j,klb)
1143 if (h(i+1,j,kra) > h_exclude) tr_ra = tr(m)%t(i+1,j,kra)
1144 if (h(i+1,j,krb) > h_exclude) tr_rb = tr(m)%t(i+1,j,krb)
1145 tr_min_face = min(tr_min_face, tr_la, tr_lb, tr_ra, tr_rb)
1146 tr_max_face = max(tr_max_face, tr_la, tr_lb, tr_ra, tr_rb)
1150 tr_lb = tr(m)%t(i,j,k0b_lu(j)%p(i,k))
1151 tr_rb = tr(m)%t(i+1,j,k0b_ru(j)%p(i,k))
1152 tr_la = tr_lb ; tr_ra = tr_rb
1153 if (deep_wt_lu(j)%p(i,k) < 1.0) tr_la = tr(m)%t(i,j,k0a_lu(j)%p(i,k))
1154 if (deep_wt_ru(j)%p(i,k) < 1.0) tr_ra = tr(m)%t(i+1,j,k0a_ru(j)%p(i,k))
1155 tr_min_face = min(tr_min_face, tr_la, tr_lb, tr_ra, tr_rb)
1156 tr_max_face = max(tr_max_face, tr_la, tr_lb, tr_ra, tr_rb)
1161 klb = k0b_lu(j)%p(i,k) ; tr_lb = tr(m)%t(i,j,klb) ; tr_av_l = tr_lb
1162 if (deep_wt_lu(j)%p(i,k) < 1.0)
then
1163 kla = k0a_lu(j)%p(i,k) ; tr_la = tr(m)%t(i,j,kla)
1164 wt_b = deep_wt_lu(j)%p(i,k)
1165 tr_av_l = wt_b*tr_lb + (1.0-wt_b)*tr_la
1168 krb = k0b_ru(j)%p(i,k) ; tr_rb = tr(m)%t(i+1,j,krb) ; tr_av_r = tr_rb
1169 if (deep_wt_ru(j)%p(i,k) < 1.0)
then
1170 kra = k0a_ru(j)%p(i,k) ; tr_ra = tr(m)%t(i+1,j,kra)
1171 wt_b = deep_wt_ru(j)%p(i,k)
1172 tr_av_r = wt_b*tr_rb + (1.0-wt_b)*tr_ra
1175 h_l = hp_lu(j)%p(i,k) ; h_r = hp_ru(j)%p(i,k)
1176 tr_flux = i_maxitt * khdt_epi_x(i,j) * (tr_av_l - tr_av_r) * &
1177 ((2.0 * h_l * h_r) / (h_l + h_r))
1180 if (deep_wt_lu(j)%p(i,k) >= 1.0)
then
1181 tr_flux_conv(i,j,klb) = tr_flux_conv(i,j,klb) - tr_flux
1184 wt_b = deep_wt_lu(j)%p(i,k) ; wt_a = 1.0 - wt_b
1185 vol = hp_lu(j)%p(i,k) * g%areaT(i,j)
1193 if (tr_flux > 0.0)
then
1194 if (tr_la < tr_lb)
then ;
if (vol*(tr_la-tr_min_face) < tr_flux) &
1195 tr_adj_vert = -wt_a * min(tr_flux - vol * (tr_la-tr_min_face), &
1196 (vol*wt_b) * (tr_lb - tr_la))
1197 else ;
if (vol*(tr_lb-tr_min_face) < tr_flux) &
1198 tr_adj_vert = wt_b * min(tr_flux - vol * (tr_lb-tr_min_face), &
1199 (vol*wt_a) * (tr_la - tr_lb))
1201 elseif (tr_flux < 0.0)
then
1202 if (tr_la > tr_lb)
then ;
if (vol * (tr_max_face-tr_la) < -tr_flux) &
1203 tr_adj_vert = wt_a * min(-tr_flux - vol * (tr_max_face-tr_la), &
1204 (vol*wt_b) * (tr_la - tr_lb))
1205 else ;
if (vol*(tr_max_face-tr_lb) < -tr_flux) &
1206 tr_adj_vert = -wt_b * min(-tr_flux - vol * (tr_max_face-tr_lb), &
1207 (vol*wt_a)*(tr_lb - tr_la))
1211 tr_flux_conv(i,j,kla) = tr_flux_conv(i,j,kla) - (wt_a*tr_flux + tr_adj_vert)
1212 tr_flux_conv(i,j,klb) = tr_flux_conv(i,j,klb) - (wt_b*tr_flux - tr_adj_vert)
1215 if (deep_wt_ru(j)%p(i,k) >= 1.0)
then
1216 tr_flux_conv(i+1,j,krb) = tr_flux_conv(i+1,j,krb) + tr_flux
1219 wt_b = deep_wt_ru(j)%p(i,k) ; wt_a = 1.0 - wt_b
1220 vol = hp_ru(j)%p(i,k) * g%areaT(i+1,j)
1228 if (tr_flux < 0.0)
then
1229 if (tr_ra < tr_rb)
then ;
if (vol * (tr_ra-tr_min_face) < -tr_flux) &
1230 tr_adj_vert = -wt_a * min(-tr_flux - vol * (tr_ra-tr_min_face), &
1231 (vol*wt_b) * (tr_rb - tr_ra))
1232 else ;
if (vol*(tr_rb-tr_min_face) < (-tr_flux)) &
1233 tr_adj_vert = wt_b * min(-tr_flux - vol * (tr_rb-tr_min_face), &
1234 (vol*wt_a) * (tr_ra - tr_rb))
1236 elseif (tr_flux > 0.0)
then
1237 if (tr_ra > tr_rb)
then ;
if (vol * (tr_max_face-tr_ra) < tr_flux) &
1238 tr_adj_vert = wt_a * min(tr_flux - vol * (tr_max_face-tr_ra), &
1239 (vol*wt_b) * (tr_ra - tr_rb))
1240 else ;
if (vol*(tr_max_face-tr_rb) < tr_flux) &
1241 tr_adj_vert = -wt_b * min(tr_flux - vol * (tr_max_face-tr_rb), &
1242 (vol*wt_a)*(tr_rb - tr_ra))
1246 tr_flux_conv(i+1,j,kra) = tr_flux_conv(i+1,j,kra) + &
1247 (wt_a*tr_flux - tr_adj_vert)
1248 tr_flux_conv(i+1,j,krb) = tr_flux_conv(i+1,j,krb) + &
1249 (wt_b*tr_flux + tr_adj_vert)
1251 if (
associated(tr(m)%df2d_x)) &
1252 tr(m)%df2d_x(i,j) = tr(m)%df2d_x(i,j) + tr_flux * idt
1254 endif ;
enddo ;
enddo
1263 do j=js-1,je ;
do i=is,ie ;
if (g%mask2dCv(i,j) > 0.5)
then
1267 if (npv(i,j) >= 1)
then
1268 tr_min_face = min(tr(m)%t(i,j,1), tr(m)%t(i,j+1,1))
1269 tr_max_face = max(tr(m)%t(i,j,1), tr(m)%t(i,j+1,1))
1271 tr_min_face = min(tr_min_face, tr(m)%t(i,j,k), tr(m)%t(i,j+1,k))
1272 tr_max_face = max(tr_max_face, tr(m)%t(i,j,k), tr(m)%t(i,j+1,k))
1276 kla = nkmb+1 ;
if (max_krho(i,j) < nz+1) kla = max_krho(i,j)
1277 klb = kla ;
if (max_krho(i,j) < nz) klb = max_krho(i,j)+1
1278 kra = nkmb+1 ;
if (max_krho(i,j+1) < nz+1) kra = max_krho(i,j+1)
1279 krb = kra ;
if (max_krho(i,j+1) < nz) krb = max_krho(i,j+1)+1
1280 tr_la = tr_min_face ; tr_lb = tr_la ; tr_ra = tr_la ; tr_rb = tr_la
1281 if (h(i,j,kla) > h_exclude) tr_la = tr(m)%t(i,j,kla)
1282 if (h(i,j,klb) > h_exclude) tr_la = tr(m)%t(i,j,klb)
1283 if (h(i,j+1,kra) > h_exclude) tr_ra = tr(m)%t(i,j+1,kra)
1284 if (h(i,j+1,krb) > h_exclude) tr_rb = tr(m)%t(i,j+1,krb)
1285 tr_min_face = min(tr_min_face, tr_la, tr_lb, tr_ra, tr_rb)
1286 tr_max_face = max(tr_max_face, tr_la, tr_lb, tr_ra, tr_rb)
1290 tr_lb = tr(m)%t(i,j,k0b_lv(j)%p(i,k)) ; tr_rb = tr(m)%t(i,j+1,k0b_rv(j)%p(i,k))
1291 tr_la = tr_lb ; tr_ra = tr_rb
1292 if (deep_wt_lv(j)%p(i,k) < 1.0) tr_la = tr(m)%t(i,j,k0a_lv(j)%p(i,k))
1293 if (deep_wt_rv(j)%p(i,k) < 1.0) tr_ra = tr(m)%t(i,j+1,k0a_rv(j)%p(i,k))
1294 tr_min_face = min(tr_min_face, tr_la, tr_lb, tr_ra, tr_rb)
1295 tr_max_face = max(tr_max_face, tr_la, tr_lb, tr_ra, tr_rb)
1300 klb = k0b_lv(j)%p(i,k) ; tr_lb = tr(m)%t(i,j,klb) ; tr_av_l = tr_lb
1301 if (deep_wt_lv(j)%p(i,k) < 1.0)
then
1302 kla = k0a_lv(j)%p(i,k) ; tr_la = tr(m)%t(i,j,kla)
1303 wt_b = deep_wt_lv(j)%p(i,k)
1304 tr_av_l = wt_b * tr_lb + (1.0-wt_b) * tr_la
1307 krb = k0b_rv(j)%p(i,k) ; tr_rb = tr(m)%t(i,j+1,krb) ; tr_av_r = tr_rb
1308 if (deep_wt_rv(j)%p(i,k) < 1.0)
then
1309 kra = k0a_rv(j)%p(i,k) ; tr_ra = tr(m)%t(i,j+1,kra)
1310 wt_b = deep_wt_rv(j)%p(i,k)
1311 tr_av_r = wt_b * tr_rb + (1.0-wt_b) * tr_ra
1314 h_l = hp_lv(j)%p(i,k) ; h_r = hp_rv(j)%p(i,k)
1315 tr_flux = i_maxitt * ((2.0 * h_l * h_r) / (h_l + h_r)) * &
1316 khdt_epi_y(i,j) * (tr_av_l - tr_av_r)
1317 tr_flux_3d(i,j,k) = tr_flux
1319 if (deep_wt_lv(j)%p(i,k) < 1.0)
then
1321 wt_b = deep_wt_lv(j)%p(i,k) ; wt_a = 1.0 - wt_b
1322 vol = hp_lv(j)%p(i,k) * g%areaT(i,j)
1326 if (tr_flux > 0.0)
then
1327 if (tr_la < tr_lb)
then ;
if (vol * (tr_la-tr_min_face) < tr_flux) &
1328 tr_adj_vert = -wt_a * min(tr_flux - vol * (tr_la-tr_min_face), &
1329 (vol*wt_b) * (tr_lb - tr_la))
1330 else ;
if (vol*(tr_lb-tr_min_face) < tr_flux) &
1331 tr_adj_vert = wt_b * min(tr_flux - vol * (tr_lb-tr_min_face), &
1332 (vol*wt_a) * (tr_la - tr_lb))
1334 elseif (tr_flux < 0.0)
then
1335 if (tr_la > tr_lb)
then ;
if (vol * (tr_max_face-tr_la) < -tr_flux) &
1336 tr_adj_vert = wt_a * min(-tr_flux - vol * (tr_max_face-tr_la), &
1337 (vol*wt_b) * (tr_la - tr_lb))
1338 else ;
if (vol*(tr_max_face-tr_lb) < -tr_flux) &
1339 tr_adj_vert = -wt_b * min(-tr_flux - vol * (tr_max_face-tr_lb), &
1340 (vol*wt_a)*(tr_lb - tr_la))
1343 tr_adj_vert_l(i,j,k) = tr_adj_vert
1346 if (deep_wt_rv(j)%p(i,k) < 1.0)
then
1348 wt_b = deep_wt_rv(j)%p(i,k) ; wt_a = 1.0 - wt_b
1349 vol = hp_rv(j)%p(i,k) * g%areaT(i,j+1)
1353 if (tr_flux < 0.0)
then
1354 if (tr_ra < tr_rb)
then ;
if (vol * (tr_ra-tr_min_face) < -tr_flux) &
1355 tr_adj_vert = -wt_a * min(-tr_flux - vol * (tr_ra-tr_min_face), &
1356 (vol*wt_b) * (tr_rb - tr_ra))
1357 else ;
if (vol*(tr_rb-tr_min_face) < (-tr_flux)) &
1358 tr_adj_vert = wt_b * min(-tr_flux - vol * (tr_rb-tr_min_face), &
1359 (vol*wt_a) * (tr_ra - tr_rb))
1361 elseif (tr_flux > 0.0)
then
1362 if (tr_ra > tr_rb)
then ;
if (vol * (tr_max_face-tr_ra) < tr_flux) &
1363 tr_adj_vert = wt_a * min(tr_flux - vol * (tr_max_face-tr_ra), &
1364 (vol*wt_b) * (tr_ra - tr_rb))
1365 else ;
if (vol*(tr_max_face-tr_rb) < tr_flux) &
1366 tr_adj_vert = -wt_b * min(tr_flux - vol * (tr_max_face-tr_rb), &
1367 (vol*wt_a)*(tr_rb - tr_ra))
1370 tr_adj_vert_r(i,j,k) = tr_adj_vert
1372 if (
associated(tr(m)%df2d_y)) &
1373 tr(m)%df2d_y(i,j) = tr(m)%df2d_y(i,j) + tr_flux * idt
1375 endif ;
enddo ;
enddo
1380 do i=is,ie ;
do j=js-1,je ;
if (g%mask2dCv(i,j) > 0.5)
then
1382 klb = k0b_lv(j)%p(i,k); krb = k0b_rv(j)%p(i,k)
1383 if (deep_wt_lv(j)%p(i,k) >= 1.0)
then
1384 tr_flux_conv(i,j,klb) = tr_flux_conv(i,j,klb) - tr_flux_3d(i,j,k)
1386 kla = k0a_lv(j)%p(i,k)
1387 wt_b = deep_wt_lv(j)%p(i,k) ; wt_a = 1.0 - wt_b
1388 tr_flux_conv(i,j,kla) = tr_flux_conv(i,j,kla) - (wt_a*tr_flux_3d(i,j,k) + tr_adj_vert_l(i,j,k))
1389 tr_flux_conv(i,j,klb) = tr_flux_conv(i,j,klb) - (wt_b*tr_flux_3d(i,j,k) - tr_adj_vert_l(i,j,k))
1391 if (deep_wt_rv(j)%p(i,k) >= 1.0)
then
1392 tr_flux_conv(i,j+1,krb) = tr_flux_conv(i,j+1,krb) + tr_flux_3d(i,j,k)
1394 kra = k0a_rv(j)%p(i,k)
1395 wt_b = deep_wt_rv(j)%p(i,k) ; wt_a = 1.0 - wt_b
1396 tr_flux_conv(i,j+1,kra) = tr_flux_conv(i,j+1,kra) + &
1397 (wt_a*tr_flux_3d(i,j,k) - tr_adj_vert_r(i,j,k))
1398 tr_flux_conv(i,j+1,krb) = tr_flux_conv(i,j+1,krb) + &
1399 (wt_b*tr_flux_3d(i,j,k) + tr_adj_vert_r(i,j,k))
1402 endif ;
enddo ;
enddo
1404 do k=1,pemax_krho ;
do j=js,je ;
do i=is,ie
1405 if ((g%mask2dT(i,j) > 0.5) .and. (h(i,j,k) > 0.0))
then
1406 tr(m)%t(i,j,k) = tr(m)%t(i,j,k) + tr_flux_conv(i,j,k) / &
1407 (h(i,j,k)*g%areaT(i,j))
1408 tr_flux_conv(i,j,k) = 0.0
1410 enddo ;
enddo ;
enddo
1416 deallocate(deep_wt_lu(j)%p) ;
deallocate(deep_wt_ru(j)%p)
1417 deallocate(hp_lu(j)%p) ;
deallocate(hp_ru(j)%p)
1418 deallocate(k0a_lu(j)%p) ;
deallocate(k0a_ru(j)%p)
1419 deallocate(k0b_lu(j)%p) ;
deallocate(k0b_ru(j)%p)
1423 deallocate(deep_wt_lv(j)%p) ;
deallocate(deep_wt_rv(j)%p)
1424 deallocate(hp_lv(j)%p) ;
deallocate(hp_rv(j)%p)
1425 deallocate(k0a_lv(j)%p) ;
deallocate(k0a_rv(j)%p)
1426 deallocate(k0b_lv(j)%p) ;
deallocate(k0b_rv(j)%p)