!=====================================================================
! $B29EYJ,I[7W;;%b%8%e!<%k(B
!  pending
!   - x = 1 and IMAX $B$N%(%M%k%.!<N.F~NL$O%+%&%s%H$7$F$J$$(B
! 2003/12/16 
! 2004/01/01  energy conservation $B$r9MN8$7$?9M$(J}$KJQ99(B
! 2004/01/13  Ms < 0 $B$H$J$k>l9g$,9MN8$5$l$F$$$J$$$3$H$,$o$+$k$N$G9M$($k(B
!=====================================================================
module T_pack
  
  use prm, only : IMAX, JMAX, KMAX,dt, dx
  
  use prmphys, only: k_ice, gamma, rho, c_p
  use com_var, only: zk, wgt, zk_half
  use Tbound,  only: Ts, Ms


  implicit none
  private
  
  public get_T
  public mk_energy
  public mk_temp1
  public add_energy_Ms
  public add_energy_F
  public adjust_energy_Ms_ver3
  public adjust_energy



contains

!=====================================================================
! $B3F3J;R$N%(%M%k%.!<$N<0(B
!=====================================================================
subroutine mk_energy(Temp1, energy)
  implicit none
  
  real(8), intent(IN)  :: Temp1(1:IMAX, 1:JMAX, 1:KMAX)
  real(8), intent(OUT) :: energy(1:IMAX, 1:JMAX, 1:KMAX)

  energy =  Temp1 * rho  * c_p

end subroutine mk_energy


!=====================================================================
subroutine get_T(Hsfc1,Temp1, Temp2)
  implicit none

  real(8), INTENT(IN)  :: Hsfc1(1:IMAX, 1:JMAX)
  real(8), INTENT(IN)  :: Temp1(1:IMAX, 1:JMAX, 1:KMAX)

  real(8), INTENT(OUT) :: Temp2(1:IMAX, 1:JMAX, 1:KMAX)


  real(8)              :: kappa                           
  real(8)              :: Tbnd(1:IMAX, 1:JMAX)            ! $B:G2<AX$N2<$N29EY(B

  real(8)              :: WORK_aft(1:IMAX, 1:JMAX, 1:KMAX)! $B78?t(B k+1
  real(8)              :: WORK_cnt(1:IMAX, 1:JMAX, 1:KMAX)! $B78?t(B k 
  real(8)              :: WORK_bef(1:IMAX, 1:JMAX, 1:KMAX)! $B78?t(B k-1

  integer              :: i, j, k

  kappa = k_ice/(rho*c_p)


  ! $B>eIt6-3&CM$OI=LL29EY(B
  Temp2(:, :, KMAX) = Ts
  ! $B2<It6-3&CM$OCO3LG.N.NLG.%U%i%C%/%9(B
  Tbnd(:, :) = Temp1(:, :, 1)+wgt(1)/k_ice * gamma



  do j = 1, JMAX
     do i = 1, IMAX
        ! $BI9>2$,$J$$>l9g$OI9>229EY(B
        if(Hsfc1(i, j) == 0.0)then
           Temp2(i, j, :) = Ts(i, j)
           cycle
        end if

        ! $B%l%Y%k(B 1 $B!A(B KMAX-1 $B$^$G$N78?t(B
        do k = 1, KMAX-1
           WORK_aft(i, j, k) =  kappa *dt  &
                &                /Hsfc1(i, j)**2/wgt(k)/(zk(k+1) - zk(k))
        end do
      
        WORK_cnt(i, j, 1) = 1 -  kappa *dt  &
             &                /Hsfc1(i, j)**2/wgt(1) &
             &              *(1/(zk(2) - zk(1)) + 1/wgt(1))
        do k = 2, KMAX-1
           WORK_cnt(i, j, k) = 1 -  kappa *dt  &
                &                /Hsfc1(i, j)**2/wgt(k) &
                &              *(1/(zk(k+1) - zk(k)) + 1/(zk(k) - zk(k-1)))
        end do
        
        WORK_bef(i, j, 1) =  kappa *dt   &
             &                /Hsfc1(i, j)**2/wgt(1)/wgt(1)
        do k=2, KMAX
           WORK_bef(i, j, k) =  kappa *dt   &
                &                /Hsfc1(i, j)**2/wgt(k)/(zk(k) - zk(k-1))
        end do



        ! $B3H;69`$N7W;;(B
        Temp2(i, j, 1) = Temp1(i, j, 1) *WORK_cnt(i, j, 1) &
             &           + Tbnd(i, j)   *WORK_bef(i, j, 1) &
             &           + Temp1(i, j, 2)*WORK_aft(i, j, 1) 
        do k=2, KMAX-1
           Temp2(i, j, k) = Temp1(i, j, k)*WORK_cnt(i, j, k) &
                &           + Temp1(i, j, k-1)*WORK_bef(i, j, k) &
                &           + Temp1(i, j, k+1)*WORK_aft(i, j, k) 
        end do
     end do
  end do

  

end subroutine get_T

!=====================================================================
! $BI=LL<};Y$K$h$k%(%M%k%.!<4sM?(B
!=====================================================================
subroutine add_energy_Ms(energy)
  implicit none

  real(8), intent(INOUT)  :: energy(1:IMAX, 1:JMAX, 1:KMAX)

  integer                :: i, j
  
  do j =1, JMAX
     do i = 1, IMAX
        energy(i, j, KMAX) = energy(i, j, KMAX) &
             &                  + Ts(i, j) * rho *c_p * Ms(i, j) * dx
!        write(6, *) i, j, 'energy(KMAX)=', energy(i, j, KMAX)
     end do
  end do

end subroutine add_energy_Ms

subroutine mk_temp1(Hsfc1, Hsfc2, temp1)
  implicit none

  real(8), intent(IN)   :: Hsfc1(1:IMAX, 1:JMAX)
  real(8), intent(IN)   :: Hsfc2(1:IMAX, 1:JMAX)
  real(8), intent(INOUT) :: temp1(1:IMAX, 1:JMAX, 1:KMAX)
  integer    :: i, j
  
  do i = 1, IMAX
     do j =1, JMAX
        if((Hsfc1(i, j) == 0.0D0 ).and.(Hsfc2(i, j) > 0.0D0))then
           temp1(i, j, :) = Ts(i, j)
        end if
     end do
  end do
        
  

end subroutine mk_temp1

!=====================================================================
! $B?eJ?%(%M%k%.!<4sM?(B
!=====================================================================
subroutine add_energy_F(Temp1, Uflgrd, Hsfc1, Hsfc2, energy)
  implicit none

  real(8), intent(IN)     :: Uflgrd(   0:IMAX, 1:JMAX, 1:KMAX)   ! m^2/s
  real(8), intent(IN)     :: Temp1(1:IMAX, 1:JMAX, 1:KMAX)       ! K

  real(8), intent(IN)     :: Hsfc1(1:IMAX, 1:JMAX)               ! m
  real(8), intent(IN)     :: Hsfc2(1:IMAX, 1:JMAX)               ! m
  real(8), intent(INOUT)  :: energy(1:IMAX, 1:JMAX, 1:KMAX)      ! J/m
  real(8)                 :: energy_fl(1:IMAX, 1:JMAX, 1:KMAX)      ! J/m
  real(8)                 :: energy_tot(1:IMAX, 1:JMAX)      ! J/m

  real(8)                 :: Uflgrdl_pls(0:IMAX, 1:JMAX, 1:KMAX) !m^2/s
  real(8)                 :: Uflgrdl_mns(0:IMAX, 1:JMAX, 1:KMAX) !m^2/s
  real(8)                 :: Uflgrdr_pls(0:IMAX, 1:JMAX, 1:KMAX) !m^2/s
  real(8)                 :: Uflgrdr_mns(0:IMAX, 1:JMAX, 1:KMAX) !m^2/s
  real(8)                 :: mass_fl(1:IMAX, 1:JMAX, 1:KMAX)
  real(8)                 :: ratio(1:KMAX)
  real(8)                 :: wgt_dammy(1:KMAX)
  real(8), parameter      :: non = -9.99E33

  integer                 :: i, j, k
  integer                :: kk_str, kk
!  col_mass = Hsfc2 * dx * rho
  
  ! $B=i4|2=(B
  energy = 0.0D0

  
  do j =1, JMAX
     do i = 2, IMAX-1
        kk_str = 2
        do k = 1, KMAX
           ! $B<ANL%U%i%C%/%9$NId9f$rJ,$1$k(B
           ! $B3J;R(B i $B$N:8B&(B
           if(Uflgrd(i-1, j, k) >= 0.0D0)then ! $B3J;R(B i$B$XN.F~(B
              Uflgrdl_pls(i, j, k) = Uflgrd(i-1, j, k) !* Temp1(i-1, j, k)*c_p
              Uflgrdl_mns(i, j, k) = 0.0D0
           else ! $BN.=P(B
              Uflgrdl_pls(i, j, k) = 0.0D0
              Uflgrdl_mns(i, j, k) = Uflgrd(i-1, j, k) !* Temp1(i, j, k)*c_p
             
           end if

           ! $B3J;R(B i $B$N1&B&(B
           if(Uflgrd(i, j, k) >= 0.0D0)then ! $BN.=P(B
              
              Uflgrdr_pls(i, j, k) = 0.0D0
              Uflgrdr_mns(i, j, k) = - Uflgrd(i, j, k) ! * Temp1(i, j, k)*c_p
           else ! $BN.F~(B
              Uflgrdr_pls(i, j, k) = - Uflgrd(i, j, k) ! * Temp1(i+1, j, k)c_p
              Uflgrdr_mns(i, j, k) = 0.0D0
           end if

           mass_fl(i, j, k) =  &
                &           + (Uflgrdl_pls(i, j, k)+Uflgrdl_mns(i, j, k)   &
                &           + Uflgrdr_pls(i, j, k)+Uflgrdr_mns(i, j, k))   &
                &             * dt * rho 
           energy_fl(i, j, k) = &
                &   + (Uflgrdl_pls(i, j, k) * Temp1(i-1, j, k) &
                &   + (Uflgrdl_mns(i, j, k)+Uflgrdr_mns(i, j, k))*Temp1(i,j,k)&
                &   + Uflgrdr_pls(i, j, k) * Temp1(i+1, j, k)) &
                &   * dt * rho * c_p
           energy_tot(i, j) = energy_tot(i, j) + energy_fl(i, j, k) &
                & + Hsfc1(i, j)*wgt(k)*rho*dx*c_p*Temp1(i,j,k)

        end do
        if(Hsfc2(i, j) > 0.0D0)then
           wgt_dammy(:) = (mass_fl(i, j, :) + Hsfc1(i, j)*wgt(:)*dx*rho)&
                &          /(Hsfc2(i, j)* rho*dx)
           ratio(:)     = mass_fl(i, j, :)/(Hsfc2(i, j)*rho*dx)
        else
           wgt_dammy(:) = non
        end if

        if((i==2).and.(j==2))then
           write(6, *)i, j,  'Uflgrdl_pls', Uflgrdl_pls(i, j, :)
           write(6, *)i, j,  'Uflgrdr_pls', Uflgrdr_pls(i, j, :)
           write(6, *)i, j,  'Uflgrdl_mns', Uflgrdl_mns(i, j, :)
           write(6, *)i, j,  'Uflgrdr_mns', Uflgrdr_mns(i, j, :)
           write(6, *)i, j,  'energy_tot', energy_tot(i, j)
           write(6, *)i, j,  'energy_fl', sum(energy_fl(i, j, :))
           write(6, *)i, j,  'mass', (Hsfc1(i, j)*rho*dx+sum(mass_fl(i, j, :)))/rho/dx
           write(6, *)i, j,  'wgt_dammy', sum(wgt_dammy), wgt_dammy
           write(6, *)i, j,  'Hsfc1', Hsfc1(i, j)
           write(6, *)i, j,  'Hsfc2', Hsfc2(i, j)
           write(6, *)i, j,  'ratio', sum(ratio), ratio
        end if



        do k=1,KMAX-1
           if(wgt_dammy(k) == non)cycle
           ! k $BAX$KF~$k<ANL$,>/$J$$>l9g(B($B$b$i$&(B)
           if(wgt_dammy(k) < wgt(k))then
              ! $B>e$NAX$+$i$b$i$&(B

              do kk = kk_str, KMAX ! $BK\Ev$O(B KMAX -1 $B$^$G$K$7$J$$$H%@%a(B

                 ! kk $BAX$rB-$7$F$b>/$J$$>l9g(B
                 if(wgt_dammy(k)+wgt_dammy(kk) < wgt(k))then
                    wgt_dammy(k)= wgt_dammy(k)+wgt_dammy(kk)
                    ! wgt_dammy(kk)$B$N$&$A$o$1$O(B ratio : 1-ratio
                    ! $B$?$@$7(B mass_fl(raito) < 0 $B$N$H$-$O$9$Y$F85$NI9$+$i(B
                    if(mass_fl(i, j, k)<0.0D0)then
                       energy(i, j, k) = energy(i, j, k) &
                            & +wgt_dammy(kk)*Hsfc1(i,j)*dx*rho         &
                            &                *c_p*Temp1(i,j,kk)

                       if((i==2).and.(j==2)) &
                            & write(6, *)i, j, k, 'ene_1', energy(i, j, k)
                    else
                       energy(i, j, k) = energy(i, j, k) &
                            & +wgt_dammy(kk)*(ratio(k)*energy_fl(i, j, k)&
                            &    +(1-ratio(k))*Hsfc1(i,j)*dx*rho         &
                            &                *c_p*Temp1(i,j,kk))
                       if((i==2).and.(j==2)) &
                            &  write(6, *)i, j, k, 'ene_2',energy(i, j, k)
                    end if
                 ! kk $BAX$rB-$7$?$iB?$$>l9g(B
                 else
                    wgt_dammy(k+1) = &
                         & wgt_dammy(k+1)+wgt_dammy(k)+wgt_dammy(kk)-wgt(k)
                       
                    ! $B85$NI9$N$_(B
                    if(mass_fl(i, j, k) < 0.0D0)then
                       energy(i, j, k)= energy(i, j, k)                  &
                            & + (wgt(k) - wgt_dammy(kk))                  &
                            &  *Hsfc2(i, j)*dx*rho *c_p*Temp1(i, j, kk)
                       energy(i, j, k+1) = energy(i, j, k+1)             &
                            & + (wgt_dammy(k) + wgt_dammy(kk)-wgt(k))    &
                            &  *Hsfc1(i, j)*dx*rho *c_p*Temp1(i, j, kk)
                       if((i==2).and.(j==2))&
                            & write(6, *)i, j, k, 'ene_3',energy(i, j, k)
                    ! $B85$NI9$H0\F0$7$?I9N>J}(B        
                    else
                       energy(i, j, k)= energy(i, j, k)                  &
                            & + (wgt(k) - wgt_dammy(k))                  &
                            &    /(wgt_dammy(kk))                        &  
                            & *(energy_fl(i, j, kk)                      &
                            & +Hsfc1(i, j)*wgt(kk)*dx*rho *c_p*Temp1(i, j, kk))
                       energy(i, j, k+1) = energy(i, j, k+1)             &
                            & + (wgt_dammy(k) + wgt_dammy(kk)-wgt(k))    &
                            &    /(wgt_dammy(kk))                        &  
                            & *(energy_fl(i, j, kk)                     & 
                            & +Hsfc1(i, j)*wgt(kk)*dx*rho *c_p*Temp1(i, j, kk))
!                       if((i==2).and.(j==2))&
!                            & write(6, *)i, j, k, 'ene_4',energy(i, j, k)
                    end if
                    wgt_dammy(k)= wgt(k)

                    kk_str = kk + 1
                    exit
                 end if
              end do
           else !k $BAX$KF~$k<ANL$,B?$$>l9g(B($B$o$?$9(B)
              if((i==2).and.(j==2))then
                 write(6, *)"amari(k)", k,  (wgt_dammy(k) -wgt(k))*Temp1(i, j, k)*c_p*dx*rho*Hsfc2(i, j)
              end if

              wgt_dammy(k+1) = wgt_dammy(k+1) + wgt_dammy(k) - wgt(k)


              ! $B85$NI9$N$_(B


              if(mass_fl(i, j, k)< 0.0D0)then
                 if((i==2).and.(j==2))then
                    write(6, *)"before(k)", k+1, energy(i, j, k+1)
                 end if
                 energy(i, j, k+1) = energy(i, j, k+1) &
                      & + (wgt_dammy(k) - wgt(k))*Hsfc2(i, j)*dx*rho &
                      & * c_p*Temp1(i, j, k)
!                      write(6, *)'mass_fl <0',  energy(i, j, k+1)
                 energy(i, j, k) = wgt(k)*Hsfc2(i, j)*dx*rho*c_p*Temp1(i, j, k)
                       if((i==2).and.(j==2)) &
                            & write(6, *)i, j, k, 'ene_5',energy(i, j, k)
                 if((i==2).and.(j==2))then
                    write(6, *)"after(k)", k+1, energy(i, j, k+1)
                 end if
              ! $B85$NI9$H0\F0$7$?I9N>J}(B
              else
                 energy(i, j,k+1) = energy(i, j, k+1) &
                      & + (1.0D0-wgt(k)/wgt_dammy(k)) *(energy_fl(i, j, k)   &
                      &     + Hsfc1(i, j)*wgt(k)*dx*rho*c_p*Temp1(i, j, k))
                 energy(i,j ,k) = energy(i, j, k)&
                      &   +wgt(k)/wgt_dammy(k)&
                      &   * (energy_fl(i, j, k)+&
                      & Hsfc1(i, j)*wgt(k)*dx*rho*c_p*Temp1(i, j, k))
                 if((i==2).and.(j==2))&
                      & write(6, *)i, j, k, 'ene_6',energy(i, j, k)
              end if
              wgt_dammy(k) = wgt(k)

           end if
        end do
        ! KMAX $B$N$_JL$G7W;;(B
        if(mass_fl(i, j, KMAX)<0.0D0)then
           if((i==2).and.(j==2))&
                write(6, *) 'ene_bef', energy(i, j, KMAX)
!(energy(i, j, KMAX)/Temp1(i, j, KMAX)/c_p+mass_fl(i, j, KMAX)+wgt(KMAX)*Hsfc1(i, j)*dx*rho)/(Hsfc2(i, j)*wgt(KMAX)*dx*rho)
           energy(i, j, KMAX) = energy(i ,j, KMAX) &
                + (wgt(KMAX)*Hsfc1(i, j)*dx*rho+mass_fl(i, j, KMAX))&
                & * c_p*Temp1(i, j, KMAX)
                if((i==2).and.(j==2))&
                      & write(6, *)i, j, k, 'ene_7',energy(i, j, KMAX), (mass_fl(i, j, KMAX)+wgt(KMAX)*Hsfc1(i, j)*dx*rho)/(Hsfc2(i, j)*wgt(KMAX)*dx*rho)
        else
           energy(i, j, KMAX) = energy(i, j, KMAX) + &
                & wgt(KMAX)*Hsfc1(i, j)*dx*rho &
                & * c_p*Temp1(i, j, KMAX) + energy_fl(i, j, KMAX)
        end if
           

        if((i==2).and.(j==2))then
           write(6, *)i, j,  'after energy', sum(energy(i, j,:)), energy(i, j, :)
           energy_tot(i, j) = 0.0D0
           do k = 1, KMAX
              energy_tot(i, j) = Hsfc2(i, j)*dx*wgt(k)*rho*c_p*temp1(i, j, k)
              write(6, *)i, j,  k, 'after energy2', Hsfc2(i, j)*dx*wgt(k)*rho*c_p*temp1(i, j, k)
           end do 
           write(6, *)energy_tot(i, j)
           write(6, *)i, j,  'after wgt_dammy', sum(wgt_dammy), wgt_dammy
        end if





     end do
  end do


end subroutine add_energy_F


subroutine adjust_energy(Temp1, Uflgrd, Hsfc1, Hsfc2, energy)
  implicit none

  real(8), intent(IN)     :: Uflgrd(   0:IMAX, 1:JMAX, 1:KMAX)   ! m^2/s
  real(8), intent(IN)     :: Temp1(1:IMAX, 1:JMAX, 1:KMAX)       ! K

  real(8), intent(IN)     :: Hsfc1(1:IMAX, 1:JMAX)               ! m
  real(8), intent(IN)     :: Hsfc2(1:IMAX, 1:JMAX)               ! m
  real(8), intent(INOUT)  :: energy(1:IMAX, 1:JMAX, 1:KMAX)      ! J/m
  real(8)                 :: energy_fl(1:IMAX, 1:JMAX, 1:KMAX)      ! J/m
  real(8)                 :: energy_org(1:IMAX, 1:JMAX, 1:KMAX)      ! J/m
  real(8)                 :: energy_tot(1:IMAX, 1:JMAX)      ! J/m
  real(8)                 :: energy_Ms(1:IMAX, 1:JMAX)      ! J/m

  real(8)                 :: Uflgrdl_pls(0:IMAX, 1:JMAX, 1:KMAX) !m^2/s
  real(8)                 :: Uflgrdl_mns(0:IMAX, 1:JMAX, 1:KMAX) !m^2/s
  real(8)                 :: Uflgrdr_pls(0:IMAX, 1:JMAX, 1:KMAX) !m^2/s
  real(8)                 :: Uflgrdr_mns(0:IMAX, 1:JMAX, 1:KMAX) !m^2/s
  real(8)                 :: mass_fl(1:IMAX, 1:JMAX, 1:KMAX)
  real(8)                 :: mass_org(1:IMAX, 1:JMAX, 1:KMAX)
  real(8)                 :: mass(1:IMAX, 1:JMAX, 1:KMAX)
  real(8)                 :: mass_Ms(1:IMAX, 1:JMAX)

  real(8)                 :: ratio_Ms(1:IMAX, 1:JMAX)
  real(8)                 :: wgt_dammy(1:KMAX)
  real(8)                 :: wgt_nonMs


  real(8), parameter      :: non = -9.99E33

  integer                 :: i, j, k
  integer                :: kk_str, kk
  energy_tot = 0.0D0
  
  ! x $BJ}8~6-3&(B
  energy(1, :, :)    = 0.0D0
  energy(IMAX, :, :) = 0.0D0


  !$B$+$sM\$K$h$k<ANLJQ2=(B
  mass_Ms   = Ms*dt*dx*rho
  energy_Ms = Ms*dt*dx*rho*c_p*Ts

  do j =1, JMAX
     do i = 2, IMAX-1
        kk_str = KMAX-1

        do k = 1, KMAX
           ! $B<ANL%U%i%C%/%9$NId9f$rJ,$1$k(B
           ! $B3J;R(B i $B$N:8B&(B
           if(Uflgrd(i-1, j, k) >= 0.0D0)then ! $B3J;R(B i$B$XN.F~(B
              Uflgrdl_pls(i, j, k) = Uflgrd(i-1, j, k) !* Temp1(i-1, j, k)*c_p
              Uflgrdl_mns(i, j, k) = 0.0D0
           else ! $BN.=P(B
              Uflgrdl_pls(i, j, k) = 0.0D0
              Uflgrdl_mns(i, j, k) = Uflgrd(i-1, j, k) !* Temp1(i, j, k)*c_p
           end if
           ! $B3J;R(B i $B$N1&B&(B
           if(Uflgrd(i, j, k) >= 0.0D0)then ! $BN.=P(B
              Uflgrdr_pls(i, j, k) = 0.0D0
              Uflgrdr_mns(i, j, k) = - Uflgrd(i, j, k) ! * Temp1(i, j, k)*c_p
           else ! $BN.F~(B
              Uflgrdr_pls(i, j, k) = - Uflgrd(i, j, k) ! * Temp1(i+1, j, k)c_p
              Uflgrdr_mns(i, j, k) = 0.0D0
           end if

           energy_fl(i, j, k) = &
                &   + (Uflgrdl_pls(i, j, k) * Temp1(i-1, j, k) &
                &   + (Uflgrdl_mns(i, j, k)+Uflgrdr_mns(i, j, k))*Temp1(i,j,k)&
                &   + Uflgrdr_pls(i, j, k) * Temp1(i+1, j, k)) &
                &   * dt * rho * c_p
           ! $BN.F0$K$h$k<ANLJQ2=(B
           mass_fl(i, j, k) =  &
                &   + (Uflgrdl_pls(i, j, k)+Uflgrdl_mns(i, j, k)   &
                &   + Uflgrdr_pls(i, j, k)+Uflgrdr_mns(i, j, k))   &
                &      * dt * rho 

           ! $B;~9o(B t $B$N;~$N<ANL(B
           mass_org(i, j, k) = Hsfc1(i, j)*wgt(k)*dx*rho 
           ! $B;~9o(B t $B$N;~$N%(%M%k%.!<(B
           energy_org(i, j, k)= mass_org(i, j, k)*c_p*Temp1(i, j, k)
           ! $B;~9o(B t+1$B$N;~$N<ANL(B
           mass(i, j, k)  = Hsfc2(i, j)*wgt(k)*dx*rho 
           ! $B;~9o(B t+1 $B$N;~$N%(%M%k%.!<(B($B3J;RD4@aA0(B)
           energy_tot(i, j) = energy_tot(i, j)&
                &      +energy_fl(i, j, k)+energy_org(i, j, k)

        end do
        energy_tot(i, j) = energy_tot(i, j) + energy_Ms(i, j)

        
        if(Hsfc2(i, j) > 0.0D0)then
           wgt_dammy(1:KMAX-1)=&
                & (mass_fl(i,j,1:KMAX-1)+mass_org(i, j, 1:KMAX-1))&
                &          /sum(mass(i, j, :))
           ! KMAX $B$O>e$+$i$+$sM\$,2C$o$k(B
           wgt_dammy(KMAX)=(mass_fl(i,j,KMAX)+mass_Ms(i, j)&
                &            +mass_org(i, j, KMAX))&
                &          /sum(mass(i, j, :))
           wgt_nonMs      = mass_fl(i,j,KMAX)+mass_org(i, j, KMAX)&
                &          /sum(mass(i, j, :))
           ratio_Ms(i, j)        = mass_Ms(i, j)/sum(mass(i, j, :))
        else
           wgt_dammy(:) = non
           energy(i, j, :) = 0.0D0
           cycle
        end if

           if((i==2).and.(j==2))then
              write(6, *)i, j,  'wgt_dammy', sum(wgt_dammy), wgt_dammy
              write(6, *)i, j,  'Hsfc1', Hsfc1(i, j)
              write(6, *)i, j,  'Hsfc2', Hsfc2(i, j)
              
              write(6, *)i, j,  'energy_tot', energy_tot(i, j)
           end if


        do k=KMAX, 2,  -1

           ! k $BAX$KF~$k<ANL$,>/$J$$>l9g(B($B$b$i$&(B)
           if(wgt_dammy(k) < wgt(k))then
              ! $B2<$NAX$+$i$b$i$&(B
              do kk = kk_str, 2, -1
                 ! kk $BAX$rB-$7$F$b>/$J$$>l9g(B
                 if(wgt_dammy(k)+wgt_dammy(kk) < wgt(k))then
                    wgt_dammy(k)= wgt_dammy(k)+wgt_dammy(kk)
                    energy(i, j, k) = energy(i, j, k) &
                         & + energy_fl(i, j, kk)+ energy_org(i, j, kk)
                 ! kk $BAX$rB-$7$?$iB?$$>l9g(B
                 else
                    wgt_dammy(k+1) = &
                         & wgt_dammy(k+1)+wgt_dammy(k)+wgt_dammy(kk)-wgt(k)

                    energy(i, j, k)= energy(i, j, k)                  &
                         & + (wgt(k) - wgt_dammy(k))                  &
                         &    /(wgt_dammy(kk))                        &  
                         & *(energy_fl(i, j, kk)                      &
                         & +energy_org(i, j, kk))
                    ! $B;D$j$O$=$N$^$^(B
                    energy(i, j, k-1) = energy(i, j, k-1)             &
                         & + (wgt_dammy(k) + wgt_dammy(kk)-wgt(k))    &
                         &    /(wgt_dammy(kk))                        &  
                         & *(energy_fl(i, j, kk)                     & 
                         & +energy_org(i, j, kk))

                    wgt_dammy(k)= wgt(k)

                    kk_str = kk - 1
                    exit
                 end if
              end do
           else !k $BAX$KF~$k<ANL$,B?$$>l9g(B($B$o$?$9(B)
              wgt_dammy(k-1) = wgt_dammy(k-1) + wgt_dammy(k) - wgt(k)
              ! $B$=$N$&$A$+$sM\$GJd$o$l$k>l9g(B
              if(wgt_dammy(k) <= ratio_Ms(i, j))then

                 energy(i, j, k)=energy_Ms(i, j)*wgt(k)/(1.0D0 - wgt_nonMs)
                 ! $BF~$i$J$+$C$?%(%M%k%.!<$O2<$X<u$1EO$9(B
                 energy_fl(i,j,k-1) = energy_fl(i,j,k-1) + energy_fl(i,j,k)
                 energy_org(i,j,k-1)= energy_org(i,j,k-1) + energy_org(i,j,k)
                 ratio_Ms(i, j) = ratio_Ms(i, j) - wgt(k)
                 if((i==2).and.(j==2))&
                      & write(6, *)i, j, k, 'ene_5',energy(i, j, k)
              else
                 ! ($B$+$sM\(B)+ $B85$N%(%M%k%.!<(B + $B0\F0$K$h$k%(%M%k%.!<(B
                 energy(i, j, k) = energy_Ms(i, j)&
                      & * ratio_Ms(i, j)/(mass_Ms(i, j)/sum(mass(i, j, :)))&
                      & + (energy_fl(i, j, k)+energy_org(i, j,k)) &
                      &  * (wgt(k)-ratio_Ms(i,j))/(wgt_dammy(k)-ratio_Ms(i,j))
                 energy_fl(i, j, k-1) = energy_fl(i, j, k-1) &
                      & +energy_fl(i, j, k)        &
                      &  * (1.0D0- (wgt(k)-ratio_Ms(i,j))/(wgt_dammy(k)-ratio_Ms(i, j)))
                 energy_org(i, j, k-1) = energy_org(i, j, k-1)&
                      & +energy_org(i, j, k) &
                      &  * (1.0D0- (wgt(k)-ratio_Ms(i,j))/(wgt_dammy(k)-ratio_Ms(i, j)))
                 ratio_Ms(i, j) = 0.0D0
                 if((i==2).and.(j==2))&
                      & write(6, *)i, j, k, 'ene_6',energy(i, j, k), Hsfc2(i, j)*wgt(k)*rho*dx*c_p*Temp1(i, j, k), energy_fl(i, j, k-1), energy_org(i, j, k-1)
              end if

           end if

           wgt_dammy(k) = wgt(k)

        
        end do
        ! k=1 $B$N$H$-(B
        if(ratio_Ms(i, j) >0.0D0)then
           energy(i, j, 1) = energy_Ms(i, j)*ratio_Ms(i, j)/(1.0D0-wgt_nonMs) &
                & +energy_fl(i, j, 1)+energy_org(i, j, 1) 
        else
           energy(i, j, 1)= energy_fl(i, j, 1)+energy_org(i, j, 1) 
        end if

        if((i==2).and.(j==2))then
           write(6, *)i, j,  'after energy', sum(energy(i, j,:)), energy(i, j, :)
           write(6, *)i, j,  'after wgt_dammy', sum(wgt_dammy), wgt_dammy
        end if





     end do
  end do


end subroutine adjust_energy



subroutine adjust_energy_Ms_ver3(Temp1, Hsfc1, Hsfc2, energy2)
  implicit none

  real(8), intent(IN)    :: Temp1(1:IMAX, 1:JMAX, 1:KMAX)
  real(8)                :: Temp(1:IMAX, 1:JMAX, 1:KMAX+1)
  real(8), intent(IN)    :: Hsfc1(1:IMAX, 1:JMAX)
  real(8), intent(IN)    :: Hsfc2(1:IMAX, 1:JMAX)
  real(8), intent(INOUT) :: energy2(1:IMAX, 1:JMAX, 1:KMAX)
  real(8)                :: energy(1:IMAX, 1:JMAX, 1:KMAX)

  real(8)                :: ttene(1:IMAX, 1:JMAX)
 
  real(8)                :: comp_Ms(1:IMAX, 1:JMAX)  ! $B$+$sM\$K$h$kI9$N<ANL(B
  real(8)                :: comp_ice(1:IMAX, 1:JMAX, 1:KMAX) ! $B85$NI9$N<ANL(B
  real(8)                :: rest
  real(8)                :: col_mass(1:IMAX, 1:JMAX)  ! $B%+%i%`Cf$N<ANL(B
  real(8)                :: mass_Ms(1:IMAX, 1:JMAX)   ! $B$+$sM\$N<ANL(B
!  real(8)                :: Mass(1:IMAX, 1:JMAX)     ! $B$+$sM\$N<ANL(B

  integer                :: i, j, k , kk
  integer                :: k_str, kk_str
! $B%+%i%`Cf$N<ANL(B
!  col_mass(:, :) = Hsfc1(:, :) * dx + Ms(:, :)*dt*dx 
!  col_mass(:, :) = Hsfc2(:, :) * dx
! $B$+$sM\$N<ANL(B
  col_mass = 0.0D0
  energy2 = 0.0D0
  Temp(:, :, 1:KMAX) =  Temp1(:, :, :)
  Temp(:, :, KMAX+1) = Ts(:, :)
  
  ttene(:, :) = ttene(:, :) + Ms(:, :) * dt * rho * dx * c_p * Ts(:, :)


  do j = 1,JMAX
     do i = 1, IMAX
        ! $B=i4|@_Dj(B
        k_str = KMAX  ! $B;~9o(B t+1 $B$N;~$NAXHV9f(B
        kk_str = KMAX ! $B;~9o(B  t  $B$N;~$NAXHV9f(B
        kk= kk_str
        ! $B$+$sM\NL@_Dj(B
        mass_Ms  = Ms * dt * dx * rho
        comp_ice = 0.0D0
        ! $B;~9o(B t $B$GI9$,$J$$>l9g(B
        if((Hsfc1(i, j) == 0.0D0).and.(Hsfc2(i, j) > 0.0D0))then
           write(6, *) 'growing ice in position', i, j
           comp_ice(i, j, :) = Hsfc2(i, j)*wgt(:) *dx*rho 
           comp_Ms(i, j) = 0.0D0
           energy2(i, j, :) = energy2(i, j, :)&
                & +comp_ice(i, j, :)*c_p*Temp(i, j, KMAX+1)
           energy(i, j, :) = energy(i, j, :)+comp_ice(i, j, :)
           cycle
        end if
        ! $BJQ2=$7$J$$>l9g(B
        if((Hsfc1(i, j) == 0.0D0).and.(Hsfc2(i, j) == 0.0D0))then
           comp_ice(i, j, :) = 0.0D0
           comp_Ms(i, j) = 0.0D0
           energy(i, j, :) = 0.0D0
           energy2(i, j, :) = 0.0D0
           cycle
        end if

        do k = k_str, 1, -1

           ! $B$+$sM\$K$h$kI9$H85$+$i$"$kI9$,$"$k3J;R(B
           if(Hsfc2(i, j) * wgt(k)* rho * dx >= mass_Ms(i, j))then
              k_str = k - 1 ! $B<!$NI9$+$i;O$a$k(B
              ! $B$+$sM\(B, $B;D$j$NI9(B
              comp_Ms(i, j) = mass_Ms(i, j)  
              if((i==2).and.(j ==2))then
                 write(6, *)'k=', k
              end if
              
              energy2(i, j, k) = energy2(i, j, k)&
                   + mass_Ms(i, j) * c_p * temp(i, j, k+1)

              ! k $BAXL\$N;D$j(B
              rest = Hsfc2(i, j)*wgt(k)*rho*dx - mass_Ms(i, j)
              !$B85$+$i$"$kI9$NAm%(%M%k%.!<(B
              do kk = kk_str, 1, -1
                 ! $B;~9o(B t+1 $B$N;~$N(B k $BAXCf$K4^$^$l$k;~9o(B t $B$N;~$NAXHV9f(Bkk
                 if(Hsfc1(i, j)*wgt(kk)*rho*dx > rest)then

                    kk_str = kk-1  ! kk $B$^$GD4$Y$?(B
                    comp_ice(i, j, k)= comp_ice(i, j, k) &
                         &  + rest 
                    energy2(i, j, k) = energy2(i, j, k) &
                         &  + rest * c_p * Temp(i, j, kk)

                    mass_Ms = Hsfc1(i, j)*wgt(kk)*rho*dx - rest 
                    exit
                 else

                    ! $B<ANL$,6hJL$D$+$J$/$J$k$N$GCm0U(B
                    comp_ice(i, j, k)= comp_ice(i, j, k) &
                         & + Hsfc1(i, j)*wgt(kk)*rho*dx 
                    energy2(i, j, k) = energy2(i, j, k) &
                         & + Hsfc1(i, j)*wgt(kk)*rho*dx * c_p * Temp(i, j, kk)
                    rest = rest - Hsfc1(i, j) * wgt(kk)*rho*dx
                 end if
              end do
              energy(i, j, k) =  comp_Ms(i, j) + comp_ice(i, j, k)

           else
              ! $B$+$sM\$K$h$k%(%M%k%.!<$NA}2C(B
              comp_ice(i, j, k) = Hsfc2(i, j)*wgt(k)*rho*dx 
              mass_Ms(i, j) = mass_Ms(i, j) - comp_ice(i, j, k) 

              energy(i, j, k) = energy(i, j, k)+comp_ice(i, j, k) 
              energy2(i, j, k)  = energy2(i, j, k)+comp_ice(i, j, k) * c_p * temp(i, j, kk+1)
              if((i==2).and.(j ==2))then
                 write(6, *)'k=', k , kk, temp(i, j, kk+1)
              end if


           end if
!           if((i==2).and.(j==2))then
!              write(6, *)k, 'energy', energy2(i, j, k)/rho/dx
!              write(6, *)k, 'energy', energy2(i, j, k)/rho/dx/c_p/Ts(i, j)
!           end if


           



        end do
        do k = 1, KMAX
           col_mass(i, j) = col_mass(i,j)+energy(i, j, k) 
        end do
!           if((i==2).and.(j==2))then
!              write(6, *)'total energy', col_mass(i,j)/rho/dx
!              write(6 ,*)'total energy', sum(energy2(i, j, :))/c_p/Ts(i, j)/rho/dx
!              write(6, *)'total energy', ttene(i, j)/c_p/Ts(i, j)/rho/dx
!           end if

        end do
     end do

   end subroutine adjust_energy_Ms_ver3

end module T_pack
