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.
498 type(verticalgrid_type),
intent(in) :: gv
499 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: h
500 real,
intent(in) :: dt
501 type(tracer_type),
intent(inout) :: tr(:)
502 integer,
intent(in) :: ntr
503 real,
dimension(SZIB_(G),SZJ_(G)),
intent(in) :: khdt_epi_x
504 real,
dimension(SZI_(G),SZJB_(G)),
intent(in) :: khdt_epi_y
505 type(tracer_hor_diff_cs),
intent(inout) :: cs
506 type(thermo_var_ptrs),
intent(in) :: tv
507 integer,
intent(in) :: num_itts
510 real,
dimension(SZI_(G), SZJ_(G)) :: &
512 real,
dimension(SZI_(G), SZJ_(G), max(1,GV%nk_rho_varies)) :: &
517 type(p2d),
dimension(SZJ_(G)) :: &
518 deep_wt_lu, deep_wt_ru, &
521 type(p2d),
dimension(SZJB_(G)) :: &
522 deep_wt_lv, deep_wt_rv, &
525 type(p2di),
dimension(SZJ_(G)) :: &
528 type(p2di),
dimension(SZJB_(G)) :: &
532 real,
dimension(SZI_(G), SZJ_(G), SZK_(G)) :: &
534 real,
dimension(SZI_(G), SZJ_(G), SZK_(G)) :: tr_flux_3d, tr_adj_vert_l, tr_adj_vert_r
536 real,
dimension(SZI_(G), SZK_(G), SZJ_(G)) :: &
539 integer,
dimension(SZI_(G), SZK_(G), SZJ_(G)) :: &
543 real,
dimension(SZK_(G)) :: &
550 integer,
dimension(SZK_(G)) :: &
554 integer,
dimension(SZI_(G), SZJ_(G)) :: &
560 integer,
dimension(SZJ_(G)) :: &
562 integer,
dimension(SZIB_(G), SZJ_(G)) :: &
564 integer,
dimension(SZI_(G), SZJB_(G)) :: &
570 real :: rho_pair, rho_a, rho_b
583 logical,
dimension(SZK_(G)) :: &
587 real :: p_ref_cv(szi_(g))
589 integer :: k_max, k_min, k_test, itmp
590 integer :: i, j, k, k2, m, is, ie, js, je, nz, nkmb
591 integer :: isd, ied, jsd, jed, isdb, iedb, k_size
592 integer :: kl, kr, kla, klb, kra, krb, np, itt, ns, max_itt
593 integer :: pemax_krho
594 integer :: isv, iev, jsv, jev
596 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = gv%ke
597 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
598 isdb = g%IsdB ; iedb = g%IedB
600 nkmb = gv%nk_rho_varies
602 if (num_itts <= 1)
then 603 max_itt = 1 ; i_maxitt = 1.0
605 max_itt = num_itts ; i_maxitt = 1.0 / (
real(max_itt))
608 do i=is-2,ie+2 ; p_ref_cv(i) = tv%P_Ref ;
enddo 610 call cpu_clock_begin(id_clock_pass)
611 call do_group_pass(cs%pass_t, g%Domain)
612 call cpu_clock_end(id_clock_pass)
617 call calculate_density(tv%T(:,j,k),tv%S(:,j,k), p_ref_cv, &
618 rho_coord(:,j,k), is-2, ie-is+5, tv%eqn_of_state)
622 do j=js-2,je+2 ;
do i=is-2,ie+2
623 rml_max(i,j) = rho_coord(i,j,1)
624 num_srt(i,j) = 0 ; max_krho(i,j) = 0
626 do k=2,nkmb ;
do j=js-2,je+2 ;
do i=is-2,ie+2
627 if (rml_max(i,j) < rho_coord(i,j,k)) rml_max(i,j) = rho_coord(i,j,k)
628 enddo ;
enddo ;
enddo 634 do j=js-2,je+2 ;
do i=is-2,ie+2 ;
if (g%mask2dT(i,j) > 0.5)
then 635 if (rml_max(i,j) > gv%Rlay(nz))
then ; max_krho(i,j) = nz+1
636 elseif (rml_max(i,j) <= gv%Rlay(nkmb+1))
then ; max_krho(i,j) = nkmb+1
638 k_min = nkmb+2 ; k_max = nz
640 k_test = (k_min + k_max) / 2
641 if (rml_max(i,j) <= gv%Rlay(k_test-1))
then ; k_max = k_test-1
642 elseif (gv%Rlay(k_test) < rml_max(i,j))
then ; k_min = k_test+1
643 else ; max_krho(i,j) = k_test ;
exit ;
endif 645 if (k_min == k_max)
then ; max_krho(i,j) = k_max ;
exit ;
endif 648 endif ;
enddo ;
enddo 651 do j=js-1,je+1 ;
do i=is-1,ie+1
652 k_end_srt(i,j) = max(max_krho(i,j), max_krho(i-1,j), max_krho(i+1,j), &
653 max_krho(i,j-1), max_krho(i,j+1))
654 if (pemax_krho < k_end_srt(i,j)) pemax_krho = k_end_srt(i,j)
656 if (pemax_krho > nz) pemax_krho = nz
658 h_exclude = 10.0*(gv%Angstrom + gv%H_subroundoff)
664 do k=1,nkmb ;
do i=is-1,ie+1 ;
if (g%mask2dT(i,j) > 0.5)
then 665 if (h(i,j,k) > h_exclude)
then 666 num_srt(i,j) = num_srt(i,j) + 1 ; ns = num_srt(i,j)
668 rho_srt(i,ns,j) = rho_coord(i,j,k)
669 h_srt(i,ns,j) = h(i,j,k)
671 endif ;
enddo ;
enddo 672 do k=nkmb+1,pemax_krho ;
do i=is-1,ie+1 ;
if (g%mask2dT(i,j) > 0.5)
then 673 if ((k<=k_end_srt(i,j)) .and. (h(i,j,k) > h_exclude))
then 674 num_srt(i,j) = num_srt(i,j) + 1 ; ns = num_srt(i,j)
676 rho_srt(i,ns,j) = gv%Rlay(k)
677 h_srt(i,ns,j) = h(i,j,k)
679 endif ;
enddo ;
enddo 684 do j=js-1,je+1;
do i=is-1,ie+1
685 do k=2,num_srt(i,j) ;
if (rho_srt(i,k,j) < rho_srt(i,k-1,j))
then 687 do k2 = k,2,-1 ;
if (rho_srt(i,k2,j) >= rho_srt(i,k2-1,j))
exit 688 itmp = k0_srt(i,k2-1,j) ; k0_srt(i,k2-1,j) = k0_srt(i,k2,j) ; k0_srt(i,k2,j) = itmp
689 tmp = rho_srt(i,k2-1,j) ; rho_srt(i,k2-1,j) = rho_srt(i,k2,j) ; rho_srt(i,k2,j) = tmp
690 tmp = h_srt(i,k2-1,j) ; h_srt(i,k2-1,j) = h_srt(i,k2,j) ; h_srt(i,k2,j) = tmp
697 do i=is-1,ie+1 ; max_srt(j) = max(max_srt(j), num_srt(i,j)) ;
enddo 702 k_size = max(2*max_srt(j),1)
703 allocate(deep_wt_lu(j)%p(isdb:iedb,k_size))
704 allocate(deep_wt_ru(j)%p(isdb:iedb,k_size))
705 allocate(hp_lu(j)%p(isdb:iedb,k_size))
706 allocate(hp_ru(j)%p(isdb:iedb,k_size))
707 allocate(k0a_lu(j)%p(isdb:iedb,k_size))
708 allocate(k0a_ru(j)%p(isdb:iedb,k_size))
709 allocate(k0b_lu(j)%p(isdb:iedb,k_size))
710 allocate(k0b_ru(j)%p(isdb:iedb,k_size))
720 do j=js,je ;
do i=is-1,ie ;
if (g%mask2dCu(i,j) > 0.5)
then 723 do k=1,num_srt(i,j) ; h_demand_l(k) = 0.0 ; h_used_l(k) = 0.0 ;
enddo 724 do k=1,num_srt(i+1,j) ; h_demand_r(k) = 0.0 ; h_used_r(k) = 0.0 ;
enddo 731 if (rho_srt(i,1,j) < rho_srt(i+1,1,j))
then 733 do kl=2,num_srt(i,j) ;
if (rho_srt(i,kl,j) >= rho_srt(i+1,1,j))
exit ;
enddo 734 elseif (rho_srt(i+1,1,j) < rho_srt(i,1,j))
then 736 do kr=2,num_srt(i+1,j) ;
if (rho_srt(i+1,kr,j) >= rho_srt(i,1,j))
exit ;
enddo 742 if ((kl > num_srt(i,j)) .or. (kr > num_srt(i+1,j)))
exit 744 if (rho_srt(i,kl,j) > rho_srt(i+1,kr,j))
then 747 rho_pair = rho_srt(i+1,kr,j)
749 k0b_lu(j)%p(i,k) = k0_srt(i,kl,j) ; k0b_ru(j)%p(i,k) = k0_srt(i+1,kr,j)
750 k0a_lu(j)%p(i,k) = k0_srt(i,kl-1,j) ; k0a_ru(j)%p(i,k) = k0b_ru(j)%p(i,k)
751 kbs_lp(k) = kl ; kbs_rp(k) = kr
753 rho_a = rho_srt(i,kl-1,j) ; rho_b = rho_srt(i,kl,j)
754 wt_b = 1.0 ;
if (abs(rho_a - rho_b) > abs(rho_pair - rho_a)) &
755 wt_b = (rho_pair - rho_a) / (rho_b - rho_a)
756 deep_wt_lu(j)%p(i,k) = wt_b ; deep_wt_ru(j)%p(i,k) = 1.0
758 h_demand_l(kl) = h_demand_l(kl) + 0.5*h_srt(i+1,kr,j) * wt_b
759 h_demand_l(kl-1) = h_demand_l(kl-1) + 0.5*h_srt(i+1,kr,j) * (1.0-wt_b)
761 kr = kr+1 ; left_set(k) = .false. ; right_set(k) = .true.
762 elseif (rho_srt(i,kl,j) < rho_srt(i+1,kr,j))
then 765 rho_pair = rho_srt(i,kl,j)
766 k0b_lu(j)%p(i,k) = k0_srt(i,kl,j) ; k0b_ru(j)%p(i,k) = k0_srt(i+1,kr,j)
767 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)
769 kbs_lp(k) = kl ; kbs_rp(k) = kr
771 rho_a = rho_srt(i+1,kr-1,j) ; rho_b = rho_srt(i+1,kr,j)
772 wt_b = 1.0 ;
if (abs(rho_a - rho_b) > abs(rho_pair - rho_a)) &
773 wt_b = (rho_pair - rho_a) / (rho_b - rho_a)
774 deep_wt_lu(j)%p(i,k) = 1.0 ; deep_wt_ru(j)%p(i,k) = wt_b
776 h_demand_r(kr) = h_demand_r(kr) + 0.5*h_srt(i,kl,j) * wt_b
777 h_demand_r(kr-1) = h_demand_r(kr-1) + 0.5*h_srt(i,kl,j) * (1.0-wt_b)
779 kl = kl+1 ; left_set(k) = .true. ; right_set(k) = .false.
780 elseif ((k0_srt(i,kl,j) <= nkmb) .or. (k0_srt(i+1,kr,j) <= nkmb))
then 783 k0b_lu(j)%p(i,k) = k0_srt(i,kl,j) ; k0b_ru(j)%p(i,k) = k0_srt(i+1,kr,j)
784 k0a_lu(j)%p(i,k) = k0b_lu(j)%p(i,k) ; k0a_ru(j)%p(i,k) = k0b_ru(j)%p(i,k)
785 kbs_lp(k) = kl ; kbs_rp(k) = kr
786 deep_wt_lu(j)%p(i,k) = 1.0 ; deep_wt_ru(j)%p(i,k) = 1.0
788 h_demand_l(kl) = h_demand_l(kl) + 0.5*h_srt(i+1,kr,j)
789 h_demand_r(kr) = h_demand_r(kr) + 0.5*h_srt(i,kl,j)
791 kl = kl+1 ; kr = kr+1 ; left_set(k) = .true. ; right_set(k) = .true.
795 h_demand_l(kl) = h_demand_l(kl) + 0.5*h_srt(i+1,kr,j)
796 h_demand_r(kr) = h_demand_r(kr) + 0.5*h_srt(i,kl,j)
798 kl = kl+1 ; kr = kr+1
804 do k=1,num_srt(i+1,j)
805 h_supply_frac_r(k) = 1.0
806 if (h_demand_r(k) > 0.5*h_srt(i+1,k,j)) &
807 h_supply_frac_r(k) = 0.5*h_srt(i+1,k,j) / h_demand_r(k)
810 h_supply_frac_l(k) = 1.0
811 if (h_demand_l(k) > 0.5*h_srt(i,k,j)) &
812 h_supply_frac_l(k) = 0.5*h_srt(i,k,j) / h_demand_l(k)
817 kl = kbs_lp(k) ; kr = kbs_rp(k)
818 hp_lu(j)%p(i,k) = 0.0 ; hp_ru(j)%p(i,k) = 0.0
819 if (left_set(k))
then 820 if (deep_wt_ru(j)%p(i,k) < 1.0)
then 821 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))
822 wt_b = deep_wt_ru(j)%p(i,k)
823 h_used_r(kr-1) = h_used_r(kr-1) + (1.0 - wt_b)*hp_ru(j)%p(i,k)
824 h_used_r(kr) = h_used_r(kr) + wt_b*hp_ru(j)%p(i,k)
826 hp_ru(j)%p(i,k) = 0.5*h_srt(i,kl,j) * h_supply_frac_r(kr)
827 h_used_r(kr) = h_used_r(kr) + hp_ru(j)%p(i,k)
830 if (right_set(k))
then 831 if (deep_wt_lu(j)%p(i,k) < 1.0)
then 832 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))
833 wt_b = deep_wt_lu(j)%p(i,k)
834 h_used_l(kl-1) = h_used_l(kl-1) + (1.0 - wt_b)*hp_lu(j)%p(i,k)
835 h_used_l(kl) = h_used_l(kl) + wt_b*hp_lu(j)%p(i,k)
837 hp_lu(j)%p(i,k) = 0.5*h_srt(i+1,kr,j) * h_supply_frac_l(kl)
838 h_used_l(kl) = h_used_l(kl) + hp_lu(j)%p(i,k)
846 if (left_set(k)) hp_lu(j)%p(i,k) = hp_lu(j)%p(i,k) + &
847 (h_srt(i,kbs_lp(k),j) - h_used_l(kbs_lp(k)))
848 if (right_set(k)) hp_ru(j)%p(i,k) = hp_ru(j)%p(i,k) + &
849 (h_srt(i+1,kbs_rp(k),j) - h_used_r(kbs_rp(k)))
852 endif ;
enddo ;
enddo 855 k_size = max(max_srt(j)+max_srt(j+1),1)
856 allocate(deep_wt_lv(j)%p(isd:ied,k_size))
857 allocate(deep_wt_rv(j)%p(isd:ied,k_size))
858 allocate(hp_lv(j)%p(isd:ied,k_size))
859 allocate(hp_rv(j)%p(isd:ied,k_size))
860 allocate(k0a_lv(j)%p(isd:ied,k_size))
861 allocate(k0a_rv(j)%p(isd:ied,k_size))
862 allocate(k0b_lv(j)%p(isd:ied,k_size))
863 allocate(k0b_rv(j)%p(isd:ied,k_size))
873 do j=js-1,je ;
do i=is,ie ;
if (g%mask2dCv(i,j) > 0.5)
then 876 do k=1,num_srt(i,j) ; h_demand_l(k) = 0.0 ; h_used_l(k) = 0.0 ;
enddo 877 do k=1,num_srt(i,j+1) ; h_demand_r(k) = 0.0 ; h_used_r(k) = 0.0 ;
enddo 884 if (rho_srt(i,1,j) < rho_srt(i,1,j+1))
then 886 do kl=2,num_srt(i,j) ;
if (rho_srt(i,kl,j) >= rho_srt(i,1,j+1))
exit ;
enddo 887 elseif (rho_srt(i,1,j+1) < rho_srt(i,1,j))
then 889 do kr=2,num_srt(i,j+1) ;
if (rho_srt(i,kr,j+1) >= rho_srt(i,1,j))
exit ;
enddo 895 if ((kl > num_srt(i,j)) .or. (kr > num_srt(i,j+1)))
exit 897 if (rho_srt(i,kl,j) > rho_srt(i,kr,j+1))
then 900 rho_pair = rho_srt(i,kr,j+1)
902 k0b_lv(j)%p(i,k) = k0_srt(i,kl,j) ; k0b_rv(j)%p(i,k) = k0_srt(i,kr,j+1)
903 k0a_lv(j)%p(i,k) = k0_srt(i,kl-1,j) ; k0a_rv(j)%p(i,k) = k0b_rv(j)%p(i,k)
904 kbs_lp(k) = kl ; kbs_rp(k) = kr
906 rho_a = rho_srt(i,kl-1,j) ; rho_b = rho_srt(i,kl,j)
907 wt_b = 1.0 ;
if (abs(rho_a - rho_b) > abs(rho_pair - rho_a)) &
908 wt_b = (rho_pair - rho_a) / (rho_b - rho_a)
909 deep_wt_lv(j)%p(i,k) = wt_b ; deep_wt_rv(j)%p(i,k) = 1.0
911 h_demand_l(kl) = h_demand_l(kl) + 0.5*h_srt(i,kr,j+1) * wt_b
912 h_demand_l(kl-1) = h_demand_l(kl-1) + 0.5*h_srt(i,kr,j+1) * (1.0-wt_b)
914 kr = kr+1 ; left_set(k) = .false. ; right_set(k) = .true.
915 elseif (rho_srt(i,kl,j) < rho_srt(i,kr,j+1))
then 918 rho_pair = rho_srt(i,kl,j)
919 k0b_lv(j)%p(i,k) = k0_srt(i,kl,j) ; k0b_rv(j)%p(i,k) = k0_srt(i,kr,j+1)
920 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)
922 kbs_lp(k) = kl ; kbs_rp(k) = kr
924 rho_a = rho_srt(i,kr-1,j+1) ; rho_b = rho_srt(i,kr,j+1)
925 wt_b = 1.0 ;
if (abs(rho_a - rho_b) > abs(rho_pair - rho_a)) &
926 wt_b = (rho_pair - rho_a) / (rho_b - rho_a)
927 deep_wt_lv(j)%p(i,k) = 1.0 ; deep_wt_rv(j)%p(i,k) = wt_b
929 h_demand_r(kr) = h_demand_r(kr) + 0.5*h_srt(i,kl,j) * wt_b
930 h_demand_r(kr-1) = h_demand_r(kr-1) + 0.5*h_srt(i,kl,j) * (1.0-wt_b)
932 kl = kl+1 ; left_set(k) = .true. ; right_set(k) = .false.
933 elseif ((k0_srt(i,kl,j) <= nkmb) .or. (k0_srt(i,kr,j+1) <= nkmb))
then 936 k0b_lv(j)%p(i,k) = k0_srt(i,kl,j) ; k0b_rv(j)%p(i,k) = k0_srt(i,kr,j+1)
937 k0a_lv(j)%p(i,k) = k0b_lv(j)%p(i,k) ; k0a_rv(j)%p(i,k) = k0b_rv(j)%p(i,k)
938 kbs_lp(k) = kl ; kbs_rp(k) = kr
939 deep_wt_lv(j)%p(i,k) = 1.0 ; deep_wt_rv(j)%p(i,k) = 1.0
941 h_demand_l(kl) = h_demand_l(kl) + 0.5*h_srt(i,kr,j+1)
942 h_demand_r(kr) = h_demand_r(kr) + 0.5*h_srt(i,kl,j)
944 kl = kl+1 ; kr = kr+1 ; left_set(k) = .true. ; right_set(k) = .true.
948 h_demand_l(kl) = h_demand_l(kl) + 0.5*h_srt(i,kr,j+1)
949 h_demand_r(kr) = h_demand_r(kr) + 0.5*h_srt(i,kl,j)
951 kl = kl+1 ; kr = kr+1
957 do k=1,num_srt(i,j+1)
958 h_supply_frac_r(k) = 1.0
959 if (h_demand_r(k) > 0.5*h_srt(i,k,j+1)) &
960 h_supply_frac_r(k) = 0.5*h_srt(i,k,j+1) / h_demand_r(k)
963 h_supply_frac_l(k) = 1.0
964 if (h_demand_l(k) > 0.5*h_srt(i,k,j)) &
965 h_supply_frac_l(k) = 0.5*h_srt(i,k,j) / h_demand_l(k)
970 kl = kbs_lp(k) ; kr = kbs_rp(k)
971 hp_lv(j)%p(i,k) = 0.0 ; hp_rv(j)%p(i,k) = 0.0
972 if (left_set(k))
then 973 if (deep_wt_rv(j)%p(i,k) < 1.0)
then 974 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))
975 wt_b = deep_wt_rv(j)%p(i,k)
976 h_used_r(kr-1) = h_used_r(kr-1) + (1.0 - wt_b) * hp_rv(j)%p(i,k)
977 h_used_r(kr) = h_used_r(kr) + wt_b * hp_rv(j)%p(i,k)
979 hp_rv(j)%p(i,k) = 0.5*h_srt(i,kl,j) * h_supply_frac_r(kr)
980 h_used_r(kr) = h_used_r(kr) + hp_rv(j)%p(i,k)
983 if (right_set(k))
then 984 if (deep_wt_lv(j)%p(i,k) < 1.0)
then 985 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))
986 wt_b = deep_wt_lv(j)%p(i,k)
987 h_used_l(kl-1) = h_used_l(kl-1) + (1.0 - wt_b) * hp_lv(j)%p(i,k)
988 h_used_l(kl) = h_used_l(kl) + wt_b * hp_lv(j)%p(i,k)
990 hp_lv(j)%p(i,k) = 0.5*h_srt(i,kr,j+1) * h_supply_frac_l(kl)
991 h_used_l(kl) = h_used_l(kl) + hp_lv(j)%p(i,k)
999 if (left_set(k)) hp_lv(j)%p(i,k) = hp_lv(j)%p(i,k) + &
1000 (h_srt(i,kbs_lp(k),j) - h_used_l(kbs_lp(k)))
1001 if (right_set(k)) hp_rv(j)%p(i,k) = hp_rv(j)%p(i,k) + &
1002 (h_srt(i,kbs_rp(k),j+1) - h_used_r(kbs_rp(k)))
1006 endif ;
enddo ;
enddo 1011 do k=1,pemax_krho ;
do j=js-1,je+1 ;
do i=is-1,ie+1
1012 tr_flux_conv(i,j,k) = 0.0
1013 enddo ;
enddo ;
enddo 1018 call cpu_clock_begin(id_clock_pass)
1019 call do_group_pass(cs%pass_t, g%Domain)
1020 call cpu_clock_end(id_clock_pass)
1030 do j=js,je ;
do i=is-1,ie ;
if (g%mask2dCu(i,j) > 0.5)
then 1034 if (npu(i,j) >= 1)
then 1035 tr_min_face = min(tr(m)%t(i,j,1), tr(m)%t(i+1,j,1))
1036 tr_max_face = max(tr(m)%t(i,j,1), tr(m)%t(i+1,j,1))
1038 tr_min_face = min(tr_min_face, tr(m)%t(i,j,k), tr(m)%t(i+1,j,k))
1039 tr_max_face = max(tr_max_face, tr(m)%t(i,j,k), tr(m)%t(i+1,j,k))
1043 kla = nkmb+1 ;
if (max_krho(i,j) < nz+1) kla = max_krho(i,j)
1044 klb = kla ;
if (max_krho(i,j) < nz) klb = max_krho(i,j)+1
1045 kra = nkmb+1 ;
if (max_krho(i+1,j) < nz+1) kra = max_krho(i+1,j)
1046 krb = kra ;
if (max_krho(i+1,j) < nz) krb = max_krho(i+1,j)+1
1047 tr_la = tr_min_face ; tr_lb = tr_la ; tr_ra = tr_la ; tr_rb = tr_la
1048 if (h(i,j,kla) > h_exclude) tr_la = tr(m)%t(i,j,kla)
1049 if (h(i,j,klb) > h_exclude) tr_la = tr(m)%t(i,j,klb)
1050 if (h(i+1,j,kra) > h_exclude) tr_ra = tr(m)%t(i+1,j,kra)
1051 if (h(i+1,j,krb) > h_exclude) tr_rb = tr(m)%t(i+1,j,krb)
1052 tr_min_face = min(tr_min_face, tr_la, tr_lb, tr_ra, tr_rb)
1053 tr_max_face = max(tr_max_face, tr_la, tr_lb, tr_ra, tr_rb)
1057 tr_lb = tr(m)%t(i,j,k0b_lu(j)%p(i,k))
1058 tr_rb = tr(m)%t(i+1,j,k0b_ru(j)%p(i,k))
1059 tr_la = tr_lb ; tr_ra = tr_rb
1060 if (deep_wt_lu(j)%p(i,k) < 1.0) tr_la = tr(m)%t(i,j,k0a_lu(j)%p(i,k))
1061 if (deep_wt_ru(j)%p(i,k) < 1.0) tr_ra = tr(m)%t(i+1,j,k0a_ru(j)%p(i,k))
1062 tr_min_face = min(tr_min_face, tr_la, tr_lb, tr_ra, tr_rb)
1063 tr_max_face = max(tr_max_face, tr_la, tr_lb, tr_ra, tr_rb)
1068 klb = k0b_lu(j)%p(i,k) ; tr_lb = tr(m)%t(i,j,klb) ; tr_av_l = tr_lb
1069 if (deep_wt_lu(j)%p(i,k) < 1.0)
then 1070 kla = k0a_lu(j)%p(i,k) ; tr_la = tr(m)%t(i,j,kla)
1071 wt_b = deep_wt_lu(j)%p(i,k)
1072 tr_av_l = wt_b*tr_lb + (1.0-wt_b)*tr_la
1075 krb = k0b_ru(j)%p(i,k) ; tr_rb = tr(m)%t(i+1,j,krb) ; tr_av_r = tr_rb
1076 if (deep_wt_ru(j)%p(i,k) < 1.0)
then 1077 kra = k0a_ru(j)%p(i,k) ; tr_ra = tr(m)%t(i+1,j,kra)
1078 wt_b = deep_wt_ru(j)%p(i,k)
1079 tr_av_r = wt_b*tr_rb + (1.0-wt_b)*tr_ra
1082 h_l = hp_lu(j)%p(i,k) ; h_r = hp_ru(j)%p(i,k)
1083 tr_flux = i_maxitt * khdt_epi_x(i,j) * (tr_av_l - tr_av_r) * &
1084 ((2.0 * h_l * h_r) / (h_l + h_r))
1087 if (deep_wt_lu(j)%p(i,k) >= 1.0)
then 1088 tr_flux_conv(i,j,klb) = tr_flux_conv(i,j,klb) - tr_flux
1091 wt_b = deep_wt_lu(j)%p(i,k) ; wt_a = 1.0 - wt_b
1092 vol = hp_lu(j)%p(i,k) * g%areaT(i,j)
1100 if (tr_flux > 0.0)
then 1101 if (tr_la < tr_lb)
then ;
if (vol*(tr_la-tr_min_face) < tr_flux) &
1102 tr_adj_vert = -wt_a * min(tr_flux - vol * (tr_la-tr_min_face), &
1103 (vol*wt_b) * (tr_lb - tr_la))
1104 else ;
if (vol*(tr_lb-tr_min_face) < tr_flux) &
1105 tr_adj_vert = wt_b * min(tr_flux - vol * (tr_lb-tr_min_face), &
1106 (vol*wt_a) * (tr_la - tr_lb))
1108 elseif (tr_flux < 0.0)
then 1109 if (tr_la > tr_lb)
then ;
if (vol * (tr_max_face-tr_la) < -tr_flux) &
1110 tr_adj_vert = wt_a * min(-tr_flux - vol * (tr_max_face-tr_la), &
1111 (vol*wt_b) * (tr_la - tr_lb))
1112 else ;
if (vol*(tr_max_face-tr_lb) < -tr_flux) &
1113 tr_adj_vert = -wt_b * min(-tr_flux - vol * (tr_max_face-tr_lb), &
1114 (vol*wt_a)*(tr_lb - tr_la))
1118 tr_flux_conv(i,j,kla) = tr_flux_conv(i,j,kla) - (wt_a*tr_flux + tr_adj_vert)
1119 tr_flux_conv(i,j,klb) = tr_flux_conv(i,j,klb) - (wt_b*tr_flux - tr_adj_vert)
1122 if (deep_wt_ru(j)%p(i,k) >= 1.0)
then 1123 tr_flux_conv(i+1,j,krb) = tr_flux_conv(i+1,j,krb) + tr_flux
1126 wt_b = deep_wt_ru(j)%p(i,k) ; wt_a = 1.0 - wt_b
1127 vol = hp_ru(j)%p(i,k) * g%areaT(i+1,j)
1135 if (tr_flux < 0.0)
then 1136 if (tr_ra < tr_rb)
then ;
if (vol * (tr_ra-tr_min_face) < -tr_flux) &
1137 tr_adj_vert = -wt_a * min(-tr_flux - vol * (tr_ra-tr_min_face), &
1138 (vol*wt_b) * (tr_rb - tr_ra))
1139 else ;
if (vol*(tr_rb-tr_min_face) < (-tr_flux)) &
1140 tr_adj_vert = wt_b * min(-tr_flux - vol * (tr_rb-tr_min_face), &
1141 (vol*wt_a) * (tr_ra - tr_rb))
1143 elseif (tr_flux > 0.0)
then 1144 if (tr_ra > tr_rb)
then ;
if (vol * (tr_max_face-tr_ra) < tr_flux) &
1145 tr_adj_vert = wt_a * min(tr_flux - vol * (tr_max_face-tr_ra), &
1146 (vol*wt_b) * (tr_ra - tr_rb))
1147 else ;
if (vol*(tr_max_face-tr_rb) < tr_flux) &
1148 tr_adj_vert = -wt_b * min(tr_flux - vol * (tr_max_face-tr_rb), &
1149 (vol*wt_a)*(tr_rb - tr_ra))
1153 tr_flux_conv(i+1,j,kra) = tr_flux_conv(i+1,j,kra) + &
1154 (wt_a*tr_flux - tr_adj_vert)
1155 tr_flux_conv(i+1,j,krb) = tr_flux_conv(i+1,j,krb) + &
1156 (wt_b*tr_flux + tr_adj_vert)
1158 if (
associated(tr(m)%df2d_x)) &
1159 tr(m)%df2d_x(i,j) = tr(m)%df2d_x(i,j) + tr_flux * idt
1161 endif ;
enddo ;
enddo 1170 do j=js-1,je ;
do i=is,ie ;
if (g%mask2dCv(i,j) > 0.5)
then 1174 if (npv(i,j) >= 1)
then 1175 tr_min_face = min(tr(m)%t(i,j,1), tr(m)%t(i,j+1,1))
1176 tr_max_face = max(tr(m)%t(i,j,1), tr(m)%t(i,j+1,1))
1178 tr_min_face = min(tr_min_face, tr(m)%t(i,j,k), tr(m)%t(i,j+1,k))
1179 tr_max_face = max(tr_max_face, tr(m)%t(i,j,k), tr(m)%t(i,j+1,k))
1183 kla = nkmb+1 ;
if (max_krho(i,j) < nz+1) kla = max_krho(i,j)
1184 klb = kla ;
if (max_krho(i,j) < nz) klb = max_krho(i,j)+1
1185 kra = nkmb+1 ;
if (max_krho(i,j+1) < nz+1) kra = max_krho(i,j+1)
1186 krb = kra ;
if (max_krho(i,j+1) < nz) krb = max_krho(i,j+1)+1
1187 tr_la = tr_min_face ; tr_lb = tr_la ; tr_ra = tr_la ; tr_rb = tr_la
1188 if (h(i,j,kla) > h_exclude) tr_la = tr(m)%t(i,j,kla)
1189 if (h(i,j,klb) > h_exclude) tr_la = tr(m)%t(i,j,klb)
1190 if (h(i,j+1,kra) > h_exclude) tr_ra = tr(m)%t(i,j+1,kra)
1191 if (h(i,j+1,krb) > h_exclude) tr_rb = tr(m)%t(i,j+1,krb)
1192 tr_min_face = min(tr_min_face, tr_la, tr_lb, tr_ra, tr_rb)
1193 tr_max_face = max(tr_max_face, tr_la, tr_lb, tr_ra, tr_rb)
1197 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))
1198 tr_la = tr_lb ; tr_ra = tr_rb
1199 if (deep_wt_lv(j)%p(i,k) < 1.0) tr_la = tr(m)%t(i,j,k0a_lv(j)%p(i,k))
1200 if (deep_wt_rv(j)%p(i,k) < 1.0) tr_ra = tr(m)%t(i,j+1,k0a_rv(j)%p(i,k))
1201 tr_min_face = min(tr_min_face, tr_la, tr_lb, tr_ra, tr_rb)
1202 tr_max_face = max(tr_max_face, tr_la, tr_lb, tr_ra, tr_rb)
1207 klb = k0b_lv(j)%p(i,k) ; tr_lb = tr(m)%t(i,j,klb) ; tr_av_l = tr_lb
1208 if (deep_wt_lv(j)%p(i,k) < 1.0)
then 1209 kla = k0a_lv(j)%p(i,k) ; tr_la = tr(m)%t(i,j,kla)
1210 wt_b = deep_wt_lv(j)%p(i,k)
1211 tr_av_l = wt_b * tr_lb + (1.0-wt_b) * tr_la
1214 krb = k0b_rv(j)%p(i,k) ; tr_rb = tr(m)%t(i,j+1,krb) ; tr_av_r = tr_rb
1215 if (deep_wt_rv(j)%p(i,k) < 1.0)
then 1216 kra = k0a_rv(j)%p(i,k) ; tr_ra = tr(m)%t(i,j+1,kra)
1217 wt_b = deep_wt_rv(j)%p(i,k)
1218 tr_av_r = wt_b * tr_rb + (1.0-wt_b) * tr_ra
1221 h_l = hp_lv(j)%p(i,k) ; h_r = hp_rv(j)%p(i,k)
1222 tr_flux = i_maxitt * ((2.0 * h_l * h_r) / (h_l + h_r)) * &
1223 khdt_epi_y(i,j) * (tr_av_l - tr_av_r)
1224 tr_flux_3d(i,j,k) = tr_flux
1226 if (deep_wt_lv(j)%p(i,k) < 1.0)
then 1228 wt_b = deep_wt_lv(j)%p(i,k) ; wt_a = 1.0 - wt_b
1229 vol = hp_lv(j)%p(i,k) * g%areaT(i,j)
1233 if (tr_flux > 0.0)
then 1234 if (tr_la < tr_lb)
then ;
if (vol * (tr_la-tr_min_face) < tr_flux) &
1235 tr_adj_vert = -wt_a * min(tr_flux - vol * (tr_la-tr_min_face), &
1236 (vol*wt_b) * (tr_lb - tr_la))
1237 else ;
if (vol*(tr_lb-tr_min_face) < tr_flux) &
1238 tr_adj_vert = wt_b * min(tr_flux - vol * (tr_lb-tr_min_face), &
1239 (vol*wt_a) * (tr_la - tr_lb))
1241 elseif (tr_flux < 0.0)
then 1242 if (tr_la > tr_lb)
then ;
if (vol * (tr_max_face-tr_la) < -tr_flux) &
1243 tr_adj_vert = wt_a * min(-tr_flux - vol * (tr_max_face-tr_la), &
1244 (vol*wt_b) * (tr_la - tr_lb))
1245 else ;
if (vol*(tr_max_face-tr_lb) < -tr_flux) &
1246 tr_adj_vert = -wt_b * min(-tr_flux - vol * (tr_max_face-tr_lb), &
1247 (vol*wt_a)*(tr_lb - tr_la))
1250 tr_adj_vert_l(i,j,k) = tr_adj_vert
1253 if (deep_wt_rv(j)%p(i,k) < 1.0)
then 1255 wt_b = deep_wt_rv(j)%p(i,k) ; wt_a = 1.0 - wt_b
1256 vol = hp_rv(j)%p(i,k) * g%areaT(i,j+1)
1260 if (tr_flux < 0.0)
then 1261 if (tr_ra < tr_rb)
then ;
if (vol * (tr_ra-tr_min_face) < -tr_flux) &
1262 tr_adj_vert = -wt_a * min(-tr_flux - vol * (tr_ra-tr_min_face), &
1263 (vol*wt_b) * (tr_rb - tr_ra))
1264 else ;
if (vol*(tr_rb-tr_min_face) < (-tr_flux)) &
1265 tr_adj_vert = wt_b * min(-tr_flux - vol * (tr_rb-tr_min_face), &
1266 (vol*wt_a) * (tr_ra - tr_rb))
1268 elseif (tr_flux > 0.0)
then 1269 if (tr_ra > tr_rb)
then ;
if (vol * (tr_max_face-tr_ra) < tr_flux) &
1270 tr_adj_vert = wt_a * min(tr_flux - vol * (tr_max_face-tr_ra), &
1271 (vol*wt_b) * (tr_ra - tr_rb))
1272 else ;
if (vol*(tr_max_face-tr_rb) < tr_flux) &
1273 tr_adj_vert = -wt_b * min(tr_flux - vol * (tr_max_face-tr_rb), &
1274 (vol*wt_a)*(tr_rb - tr_ra))
1277 tr_adj_vert_r(i,j,k) = tr_adj_vert
1279 if (
associated(tr(m)%df2d_y)) &
1280 tr(m)%df2d_y(i,j) = tr(m)%df2d_y(i,j) + tr_flux * idt
1282 endif ;
enddo ;
enddo 1287 do i=is,ie ;
do j=js-1,je ;
if (g%mask2dCv(i,j) > 0.5)
then 1289 klb = k0b_lv(j)%p(i,k); krb = k0b_rv(j)%p(i,k)
1290 if (deep_wt_lv(j)%p(i,k) >= 1.0)
then 1291 tr_flux_conv(i,j,klb) = tr_flux_conv(i,j,klb) - tr_flux_3d(i,j,k)
1293 kla = k0a_lv(j)%p(i,k)
1294 wt_b = deep_wt_lv(j)%p(i,k) ; wt_a = 1.0 - wt_b
1295 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))
1296 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))
1298 if (deep_wt_rv(j)%p(i,k) >= 1.0)
then 1299 tr_flux_conv(i,j+1,krb) = tr_flux_conv(i,j+1,krb) + tr_flux_3d(i,j,k)
1301 kra = k0a_rv(j)%p(i,k)
1302 wt_b = deep_wt_rv(j)%p(i,k) ; wt_a = 1.0 - wt_b
1303 tr_flux_conv(i,j+1,kra) = tr_flux_conv(i,j+1,kra) + &
1304 (wt_a*tr_flux_3d(i,j,k) - tr_adj_vert_r(i,j,k))
1305 tr_flux_conv(i,j+1,krb) = tr_flux_conv(i,j+1,krb) + &
1306 (wt_b*tr_flux_3d(i,j,k) + tr_adj_vert_r(i,j,k))
1309 endif ;
enddo ;
enddo 1311 do k=1,pemax_krho ;
do j=js,je ;
do i=is,ie
1312 if ((g%mask2dT(i,j) > 0.5) .and. (h(i,j,k) > 0.0))
then 1313 tr(m)%t(i,j,k) = tr(m)%t(i,j,k) + tr_flux_conv(i,j,k) / &
1314 (h(i,j,k)*g%areaT(i,j))
1315 tr_flux_conv(i,j,k) = 0.0
1317 enddo ;
enddo ;
enddo 1323 deallocate(deep_wt_lu(j)%p) ;
deallocate(deep_wt_ru(j)%p)
1324 deallocate(hp_lu(j)%p) ;
deallocate(hp_ru(j)%p)
1325 deallocate(k0a_lu(j)%p) ;
deallocate(k0a_ru(j)%p)
1326 deallocate(k0b_lu(j)%p) ;
deallocate(k0b_ru(j)%p)
1330 deallocate(deep_wt_lv(j)%p) ;
deallocate(deep_wt_rv(j)%p)
1331 deallocate(hp_lv(j)%p) ;
deallocate(hp_rv(j)%p)
1332 deallocate(k0a_lv(j)%p) ;
deallocate(k0a_rv(j)%p)
1333 deallocate(k0b_lv(j)%p) ;
deallocate(k0b_rv(j)%p)
Ocean grid type. See mom_grid for details.