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)