Class moist_conv_adjust
In: cumulus/moist_conv_adjust.f90

湿潤対æ�調ç�

Moist convective adjustment

Note that Japanese and English are described in parallel.

湿潤対æ�調ç��¹ã�­ã�¼ã��������, æ¸�º¦���湿ã��調ç�.

Moist convective adjustment was originally proposed by Manabe et al. (1965). But, the algorithm used in this routine seems to be different from that described by Manabe et al. (1965).

Adjust temperature and specific humidity by convective adjustment scheme.

Procedures List

MoistConvAdjust :æ¸�º¦���湿ã���ç¯�
————— :————
MoistConvAdjust :Adjust temperature and specific humidity

NAMELIST

NAMELIST#moist_conv_adjust_nml

Methods

Included Modules

gridset dc_types namelist_util dc_message constants timeset gtool_historyauto saturate dc_iounit dc_string

Public Instance methods

Subroutine :
xyz_Temp(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(inout)
: $ T $ . æ¸�º¦. Temperature
xyz_QVap(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(inout)
: $ q $ . ��. Specific humidity
!$ real(DP), intent(inout):xy_Rain (0:imax-1, 1:jmax)

!$ ! ��水�. !$ ! Precipitation

xyz_Press(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(in)
: $ p $ . æ°��� (�´æ�°ã������). Air pressure (full level)
xyr_Press(0:imax-1, 1:jmax, 0:kmax) :real(DP), intent(in)
: $ hat{p} $ . æ°��� (���´æ�°ã������). Air pressure (half level)
xyz_DQH2OLiqDt(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(out)

湿潤対æ�調ç��¹ã�­ã�¼ã��������, æ¸�º¦���湿ã��調ç�.

Adjust temperature and specific humidity by moist convective adjustment

[Source]

  subroutine MoistConvAdjust( xyz_Temp, xyz_QVap, xyz_Press, xyr_Press, xyz_DQH2OLiqDt )
    !
    ! 湿潤対æ�調ç��¹ã�­ã�¼ã��������, æ¸�º¦���湿ã��調ç�. 
    !
    ! Adjust temperature and specific humidity by moist convective adjustment
    !

    ! �¢ã�¸ã�¥ã�¼ã����� ; USE statements
    !

    ! ����å®��°è¨­å®�
    ! Physical constants settings
    !
    use constants, only: Grav, GasRDry, CpDry, LatentHeat
                              ! $ L $ [J kg-1] . 
                              ! ��������. 
                              ! Latent heat of condensation

    ! ���»ç���
    ! Time control
    !
    use timeset, only: DelTime, TimeN, TimesetClockStart, TimesetClockStop

    ! ���¹ã�������¼ã�¿å�ºå��
    ! History data output
    !
    use gtool_historyauto, only: HistoryAutoPut

    ! 飽��湿����
    ! Evaluate saturation specific humidity
    !
    use saturate, only: xyz_CalcQVapSat, xy_CalcDQVapSatDTemp


    ! 宣�� ; Declaration statements
    !
    implicit none

    real(DP), intent(inout):: xyz_Temp (0:imax-1, 1:jmax, 1:kmax)
                              ! $ T $ .     æ¸�º¦. Temperature
    real(DP), intent(inout):: xyz_QVap (0:imax-1, 1:jmax, 1:kmax)
                              ! $ q $ .     ��. Specific humidity
!!$    real(DP), intent(inout):: xy_Rain (0:imax-1, 1:jmax)
!!$                              ! ��水�. 
!!$                              ! Precipitation

    real(DP), intent(in):: xyz_Press (0:imax-1, 1:jmax, 1:kmax)
                              ! $ p $ . æ°��� (�´æ�°ã������). 
                              ! Air pressure (full level)
    real(DP), intent(in):: xyr_Press (0:imax-1, 1:jmax, 0:kmax)
                              ! $ \hat{p} $ . æ°��� (���´æ�°ã������). 
                              ! Air pressure (half level)
    real(DP), intent(out):: xyz_DQH2OLiqDt(0:imax-1, 1:jmax, 1:kmax)

    ! �業��
    ! Work variables
    !
    real(DP):: xy_RainCumulus (0:imax-1, 1:jmax)
                              ! ��水�. 
                              ! Precipitation
    real(DP):: xyz_DTempDtCumulus (0:imax-1, 1:jmax, 1:kmax)
                              ! æ¸�º¦å¤�����. 
                              ! Temperature tendency
    real(DP):: xyz_DQVapDtCumulus (0:imax-1, 1:jmax, 1:kmax)
                              ! �湿����. 
                              ! Specific humidity tendency

    real(DP):: xyz_QVapB (0:imax-1, 1:jmax, 1:kmax)
                              ! 調������. 
                              ! Specific humidity before adjustment
    real(DP):: xyz_TempB (0:imax-1, 1:jmax, 1:kmax)
                              ! 調ç�����¸©åº�. 
                              ! Temperature before adjustment
    logical:: xy_Adjust (0:imax-1, 1:jmax)
                              ! ���調������������?. 
                              ! Whether it was adjusted this time or not?
    logical:: xy_AdjustB (0:imax-1, 1:jmax)
                              ! ����調������������?. 
                              ! Whether it was adjusted last time or not?
    real(DP):: xyz_DelPress(0:imax-1, 1:jmax, 1:kmax)
                              ! $ \Delta p $
                              !
    real(DP):: xyz_DelMass  (0:imax-1, 1:jmax, 1:kmax)
                              ! $ \Delta m $
                              !
    real(DP):: xyz_QVapSat (0:imax-1, 1:jmax, 1:kmax)
                              ! 飽���. 
                              ! Saturation specific humidity. 
    real(DP):: xyr_ConvAdjustFactor(0:imax-1, 1:jmax, 0:kmax)
                              ! $ \frac{1}{2} \frac{ R }{Cp} 
                              !   \frac{ p_{k} - p_{k+1} }{ p_{k+1/2} } $

    real(DP):: TempEquivToExcEne
                              ! Temperature equivalent to the excess moist static energy
                              ! (Moist static energy difference devided by specific heat)

    real(DP):: DelQ
    real(DP):: DelTempUppLev
                              ! k+1 ������±¤��������調ç�������æ¸�º¦�������. 
                              ! Temperature variation by adjustment at k+1 level
    real(DP):: DelTempLowLev
                              ! k ������±¤��������調ç�������æ¸�º¦�������. 
                              ! Temperature variation by adjustment at k level
    real(DP):: DQVapSatDTempUppLev
                              ! $ \DD{q^{*}} (k+1)}{T} $
    real(DP):: DQVapSatDTempLowLev
                              ! $ \DD{q^{*}} (k)}{T} $
    real(DP):: GamUppLev
                              ! $ \gamma_{k+1} = \frac{L}{C_p} \DP{q^{*}}{T}_{k+1} $
    real(DP):: GamLowLev
                              ! $ \gamma_{k}   = \frac{L}{C_p} \DP{q^{*}}{T}_{k} $
    logical:: Adjust
                              ! ä»������������������åº��§ã��調ç�������������?. 
                              ! Whether it was adjusted even once in global 
                              ! this time or not?

    real(DP):: TempLowLevBefAdj ! Variables for check routine
    real(DP):: TempUppLevBefAdj
    real(DP):: QVapLowLevBefAdj
    real(DP):: QVapUppLevBefAdj

    integer:: i               ! çµ�åº��¹å�������� DO ���¼ã�����業å���
                              ! Work variables for DO loop in longitude
    integer:: j               ! ç·�º¦�¹å�������� DO ���¼ã�����業å���
                              ! Work variables for DO loop in latitude
    integer:: k               ! ���´æ�¹å�������� DO ���¼ã�����業å���
                              ! Work variables for DO loop in vertical direction
    integer:: itr             ! �¤ã�����¼ã�·ã�§ã�³æ�¹å�������� DO ���¼ã�����業å���
                              ! Work variables for DO loop in iteration direction

    real(DP):: xy_DQVapSatDTempUppLev(0:imax-1, 1:jmax)
    real(DP):: xy_DQVapSatDTempLowLev(0:imax-1, 1:jmax)

    real(DP):: ExchangeMass
                              !
                              ! Mass transport
    real(DP):: ExchangeMassDenom
                              !
                              ! Variable for mass transport calculation
    real(DP):: ExchangeMassLowLim
                              !
                              ! Lower limit of mass transport calculation
    real(DP), parameter :: ExchangeMassLowLimTempDiff = 1.0d-5
                              !
                              ! Lower limit of temperature difference
                              ! between two layers for mass transport
                              ! calculation

    real(DP):: xyz_DelQVapCond(0:imax-1, 1:jmax, 1:kmax)
    real(DP):: DelQVapCondLowLev
    real(DP):: DelQVapCondUppLev
    real(DP):: DelQVapCond2Levs
    real(DP):: MassCor

    real(DP):: xyz_RainCumulus (0:imax-1, 1:jmax, 1:kmax)

    real(DP) :: xy_NegDDelLWDt   (0:imax-1, 1:jmax)
    real(DP) :: xyz_DDelLWDtCCPLV(0:imax-1, 1:jmax, 1:kmax)


    ! ���� ; Executable statement
    !

    ! ������確è�
    ! Initialization check
    !
    if ( .not. moist_conv_adjust_inited ) then
      call MessageNotify( 'E', module_name, 'This module has not been initialized.' )
    end if

!!$    if ( .not. FlagUse ) return


    ! �����������
    ! Start measurement of computation time
    !
    call TimesetClockStart( module_name )


    ! 調�� "QVap", "Temp" ����
    ! Store "QVap", "Temp" before adjustment
    !
    xyz_QVapB = xyz_QVap
    xyz_TempB = xyz_Temp

    ! 飽å��æ¯�湿è�ç®�
    ! Calculate saturation specific humidity
    !
    xyz_QVapSat = xyz_CalcQVapSat( xyz_Temp, xyz_Press )

    ! Calculate some values used for moist convective adjustment
    !

    do k = 1, kmax
      xyz_DelPress(:,:,k) = xyr_Press(:,:,k-1) - xyr_Press(:,:,k)
    end do
    xyz_DelMass = xyz_DelPress / Grav

    ! \frac{1}{2} \frac{ R }{Cp} \frac{ p_{k} - p_{k+1} }{ p_{k+1/2} }
    !
    !   The value at k = 0 is not used.
    k = 0
    xyr_ConvAdjustFactor(:,:,k) = 0.0_DP
    !
    do k = 1, kmax-1
      xyr_ConvAdjustFactor(:,:,k) = GasRDry / CpDry * ( xyz_Press(:,:,k) - xyz_Press(:,:,k+1) ) / xyr_Press(:,:,k) / 2.0_DP
    end do
    !   The value at k = kmax is not used.
    k = kmax
    xyr_ConvAdjustFactor(:,:,k) = 0.0_DP


    !
    ! Initialization
    !
    xyz_DelQVapCond = 0.0_DP

    ! 調ç�
    ! Adjustment
    !
    xy_AdjustB = .true.

    ! 繰����
    ! Iteration
    !
    do itr = 1, ItrtMax
      xy_Adjust = .false.

      do k = 1, kmax-1

        xy_DQVapSatDTempUppLev = xy_CalcDQVapSatDTemp( xyz_Temp(:,:,k+1), xyz_QVapSat(:,:,k+1) )
        xy_DQVapSatDTempLowLev = xy_CalcDQVapSatDTemp( xyz_Temp(:,:,k  ), xyz_QVapSat(:,:,k  ) )

        do j = 1, jmax
          do i = 0, imax-1
            if ( xy_AdjustB(i,j) ) then

              ! Temperature equivalent to the excess moist static energy
              ! (Moist static energy difference devided by specific heat)
              !
              TempEquivToExcEne = xyz_Temp(i,j,k) - xyz_Temp(i,j,k+1) + LatentHeat / CpDry * ( xyz_QVapSat(i,j,k) - xyz_QVapSat(i,j,k+1) ) - xyr_ConvAdjustFactor(i,j,k) * ( xyz_Temp(i,j,k) + xyz_Temp(i,j,k+1) )

              ! Check vertical gradient of moist static energy
              !
              if ( TempEquivToExcEne > AdjustCriterion(itr) ) then

                ! Check relative humidity
                !
                if ( ( xyz_QVap(i,j,k+1) / xyz_QVapSat(i,j,k+1) >= CrtlRH ) .and. ( xyz_QVap(i,j,k  ) / xyz_QVapSat(i,j,k  ) >= CrtlRH ) ) then

                  DelQ = xyz_DelPress(i,j,k  ) * ( xyz_QVap(i,j,k  ) - xyz_QVapSat(i,j,k  ) ) + xyz_DelPress(i,j,k+1) * ( xyz_QVap(i,j,k+1) - xyz_QVapSat(i,j,k+1) )

                  DQVapSatDTempUppLev = xy_DQVapSatDTempUppLev(i,j)
                  DQVapSatDTempLowLev = xy_DQVapSatDTempLowLev(i,j)

                  GamUppLev = LatentHeat / CpDry * DQVapSatDTempUppLev
                  GamLowLev = LatentHeat / CpDry * DQVapSatDTempLowLev

                  DelTempUppLev = ( xyz_DelPress(i,j,k) * ( 1.0_DP + GamLowLev ) * TempEquivToExcEne + ( 1.0_DP + GamLowLev - xyr_ConvAdjustFactor(i,j,k) ) * LatentHeat / CpDry * DelQ ) / ( xyr_ConvAdjustFactor(i,j,k) * ( xyz_DelPress(i,j,k  ) * ( 1.0_DP + GamLowLev ) - xyz_DelPress(i,j,k+1) * ( 1.0_DP + GamUppLev ) ) + ( 1.0_DP + GamLowLev ) * ( 1.0_DP + GamUppLev ) * ( xyz_DelPress(i,j,k) + xyz_DelPress(i,j,k+1) ) )

                  DelTempLowLev = ( LatentHeat / CpDry * DelQ - xyz_DelPress(i,j,k+1) * ( 1.0_DP + GamUppLev ) * DelTempUppLev ) / ( ( 1.0_DP + GamLowLev ) * xyz_DelPress(i,j,k) )


                  !=========
                  TempLowLevBefAdj = xyz_Temp(i,j,k  )
                  TempUppLevBefAdj = xyz_Temp(i,j,k+1)
                  QVapLowLevBefAdj = xyz_QVap(i,j,k  )
                  QVapUppLevBefAdj = xyz_QVap(i,j,k+1)
                  !=========


                  ! æ¸�º¦���ç¯�
                  ! Adjust temperature
                  !
                  xyz_Temp(i,j,k  ) = xyz_Temp(i,j,k  ) + DelTempLowLev
                  xyz_Temp(i,j,k+1) = xyz_Temp(i,j,k+1) + DelTempUppLev

                  ! �湿���
                  ! Adjust specific humidity
                  !
                  xyz_QVap(i,j,k  ) = xyz_QVapSat(i,j,k  ) + DQVapSatDTempLowLev * DelTempLowLev
                  xyz_QVap(i,j,k+1) = xyz_QVapSat(i,j,k+1) + DQVapSatDTempUppLev * DelTempUppLev


                  !
                  ! Mass exchange
                  !   Denominator
                  ExchangeMassDenom = CpDry * ( TempLowLevBefAdj - TempUppLevBefAdj ) - GasRDry * ( TempLowLevBefAdj + TempUppLevBefAdj ) / 2.0_DP / xyr_Press(i,j,k) * ( xyz_Press(i,j,k) - xyz_Press(i,j,k+1) ) + LatentHeat * ( QVapLowLevBefAdj - QVapUppLevBefAdj )
                  ExchangeMassLowLim = CpDry * ExchangeMassLowLimTempDiff
                  ! If a static energy difference between two layers is smaller
                  ! than a specified lower limit, momentum and mixing ratio are
                  ! not mixed to ensure numerical stability.
                  ! If the lower limit is zero, some calculations are unstable.
                  ! (yot, 2013/10/02)
                  if ( ExchangeMassDenom > ExchangeMassLowLim ) then
                    ExchangeMass = - (   CpDry * DelTempLowLev + LatentHeat * ( xyz_QVap(i,j,k) - QVapLowLevBefAdj ) ) / ExchangeMassDenom * xyz_DelMass(i,j,k)
                  else
                    ExchangeMass = 0.0_DP
                  end if
                  !   Limitation of amount of mass exchange not to
                  !   reverse a gradient
                  ExchangeMass = min( ExchangeMass, xyz_DelMass(i,j,k) * xyz_DelMass(i,j,k+1) / ( xyz_DelMass(i,j,k) + xyz_DelMass(i,j,k+1) ) )

                  DelQVapCondLowLev = ( QVapUppLevBefAdj - QVapLowLevBefAdj ) * ExchangeMass / xyz_DelMass(i,j,k  ) - ( xyz_QVap(i,j,k  ) - QVapLowLevBefAdj )
                  DelQVapCondUppLev = - ( QVapUppLevBefAdj - QVapLowLevBefAdj ) * ExchangeMass / xyz_DelMass(i,j,k+1) - ( xyz_QVap(i,j,k+1) - QVapUppLevBefAdj )

                  ! Check
                  DelQVapCond2Levs = DelQVapCondLowLev * xyz_DelMass(i,j,k  ) + DelQVapCondUppLev * xyz_DelMass(i,j,k+1)
                  if ( DelQVapCond2Levs < 0.0_DP ) then
!!$                    call MessageNotify( 'M', module_name, &
!!$                      & 'Condensation amount is negative, %f.', &
!!$                      & d = (/ DelQVapCond2Levs /) )
                  else
                    if ( DelQVapCondLowLev < 0.0_DP ) then
                      MassCor = - DelQVapCondLowLev * xyz_DelMass(i,j,k  )
                      DelQVapCondLowLev = 0.0_DP
                      DelQVapCondUppLev = ( DelQVapCondUppLev * xyz_DelMass(i,j,k+1) - MassCor ) / xyz_DelMass(i,j,k+1)
                    end if
                    if ( DelQVapCondUppLev < 0.0_DP ) then
                      MassCor = - DelQVapCondUppLev * xyz_DelMass(i,j,k+1)
                      DelQVapCondLowLev = ( DelQVapCondLowLev * xyz_DelMass(i,j,k  ) - MassCor ) / xyz_DelMass(i,j,k  )
                      DelQVapCondUppLev = 0.0_DP
                    end if
                  end if

                  xyz_DelQVapCond(i,j,k  ) = xyz_DelQVapCond(i,j,k  ) + DelQVapCondLowLev
                  xyz_DelQVapCond(i,j,k+1) = xyz_DelQVapCond(i,j,k+1) + DelQVapCondUppLev


                  !=========
                  ! check routine
                  !---------
!!$                  write( 6, * ) '====='
!!$                  write( 6, * ) xyz_Temp(i,j,k), xyz_Temp(i,j,k+1), xyz_QVap(i,j,k), xyz_QVap(i,j,k+1)
!!$                  write( 6, * ) DelTempLowLev, DelTempUppLev
!!$                  write( 6, * ) 'Energy difference before and after adjustment and each energy'
!!$                  write( 6, * ) &
!!$                    &   ( CpDry * TempLowLevBefAdj  + LatentHeat * QVapLowLevBefAdj )  &
!!$                    &     * xyz_DelPress(i,j,k  ) / Grav                               &
!!$                    & + ( CpDry * TempUppLevBefAdj  + LatentHeat * QVapUppLevBefAdj )  &
!!$                    &     * xyz_DelPress(i,j,k+1) / Grav                               &
!!$                    & - ( CpDry * xyz_Temp(i,j,k  ) + LatentHeat * xyz_QVap(i,j,k  ) ) &
!!$                    &     * xyz_DelPress(i,j,k  ) / Grav                               &
!!$                    & - ( CpDry * xyz_Temp(i,j,k+1) + LatentHeat * xyz_QVap(i,j,k+1) ) &
!!$                    &     * xyz_DelPress(i,j,k+1) / Grav,                              &
!!$                    &   ( CpDry * TempLowLevBefAdj  + LatentHeat * QVapLowLevBefAdj )  &
!!$                    &     * xyz_DelPress(i,j,k  ) / Grav,                              &
!!$                    &   ( CpDry * TempUppLevBefAdj  + LatentHeat * QVapUppLevBefAdj )  &
!!$                    &     * xyz_DelPress(i,j,k+1) / Grav,                              &
!!$                    &   ( CpDry * xyz_Temp(i,j,k  ) + LatentHeat * xyz_QVap(i,j,k  ) ) &
!!$                    &     * xyz_DelPress(i,j,k  ) / Grav,                              &
!!$                    &   ( CpDry * xyz_Temp(i,j,k+1) + LatentHeat * xyz_QVap(i,j,k+1) ) &
!!$                    &     * xyz_DelPress(i,j,k+1) / Grav
!!$                  write( 6, * ) 'Difference of moist static energy after adjustment'
!!$                  write( 6, * ) &
!!$                    &   ( CpDry * xyz_Temp(i,j,k  ) + LatentHeat * xyz_QVap(i,j,k  ) )  &
!!$                    & - ( CpDry * xyz_Temp(i,j,k+1) + LatentHeat * xyz_QVap(i,j,k+1) )  &
!!$                    & - CpDry * xyr_ConvAdjustFactor(i,j,k)                             &
!!$                    &   * ( xyz_Temp(i,j,k) + xyz_Temp(i,j,k+1) ),                      &
!!$                    &   ( CpDry * xyz_Temp(i,j,k  ) + LatentHeat * xyz_QVap(i,j,k  ) ), &
!!$                    &   ( CpDry * xyz_Temp(i,j,k+1) + LatentHeat * xyz_QVap(i,j,k+1) ), &
!!$                    & - CpDry * xyr_ConvAdjustFactor(i,j,k)                             &
!!$                    &   * ( xyz_Temp(i,j,k) + xyz_Temp(i,j,k+1) )
!!$                  write( 6, * ) 'Difference of water vapor amount before and after adjustment'
!!$                  write( 6, * ) &
!!$                    & - LatentHeat * ( xyz_QVap(i,j,k  ) - QVapLowLevBefAdj ) &
!!$                    & * xyz_DelPress(i,j,k  ) / Grav,                       &
!!$                    & - LatentHeat * ( xyz_QVap(i,j,k+1) - QVapUppLevBefAdj ) &
!!$                    & * xyz_DelPress(i,j,k+1) / Grav
                  !=========


                  xyz_QVapSat(i,j,k  ) = xyz_QVap(i,j,k  )
                  xyz_QVapSat(i,j,k+1) = xyz_QVap(i,j,k+1)

                  ! 調����������?
                  ! Whether it was adjusted or not?
                  !
                  xy_Adjust(i,j) = .true.
                end if

              end if

            end if
          end do
        end do
      end do

      Adjust = .false.
      do i = 0, imax-1
        do j = 1, jmax
          xy_AdjustB(i,j) = xy_Adjust(i,j)
          Adjust          = Adjust .or. xy_Adjust(i,j)
        end do
      end do

      if ( .not. Adjust ) exit

    end do


    call MoistConvAdjustChkCons( xyz_TempB, xyz_Temp, xyz_QVapB, xyz_QVap, xyz_DelQVapCond, xyz_DelMass )


    ! æ¯�湿å�����, æ¸�º¦å¤�����, ��æ°´é������
    ! Calculate specific humidity tendency, temperature tendency, precipitation
    !
    xyz_DQVapDtCumulus = ( xyz_QVap - xyz_QVapB ) / ( 2.0_DP * DelTime )

    xyz_DTempDtCumulus = ( xyz_Temp - xyz_TempB ) / ( 2.0_DP * DelTime )

    ! old
!!$    xyz_DQH2OLiqDt = ( xyz_QVapB - xyz_QVap ) / ( 2.0_DP * DelTime )
    ! new (2014/12/04)
    xyz_DQH2OLiqDt = xyz_DelQVapCond / ( 2.0_DP * DelTime )
    !   avoid negative cloud amount
    xyz_DQH2OLiqDt = max( xyz_DQH2OLiqDt, 0.0_DP )

!!$    xyz_RainCumulus = xyz_DQH2OLiqDt * xyz_DelPress / Grav
!!$    xy_RainCumulus = 0.0d0
!!$    do k = kmax, 1, -1
!!$      xy_RainCumulus = xy_RainCumulus + xyz_RainCumulus(:,:,k)
!!$    end do


!!$    j = jmax/2+1
!!$    do i = 0, imax-1
!!$      if ( xy_RainCumulus(i,j) /= 0.0d0 ) then
!!$        write( 6, * ) xy_RainCumulus(i,j)
!!$      end if
!!$    end do
!!$    write( 6, * ) '---'


!!$    xy_Rain     = xy_Rain     + xy_RainCumulus


    ! calculation for output (tentative)
    xyz_RainCumulus = xyz_DQH2OLiqDt * xyz_DelPress / Grav
    xy_RainCumulus = 0.0_DP
    do k = kmax, 1, -1
      xy_RainCumulus = xy_RainCumulus + xyz_RainCumulus(:,:,k)
    end do


    ! ���¹ã�������¼ã�¿å�ºå��
    ! History data output
    !
    call HistoryAutoPut( TimeN, 'RainCumulus',    xy_RainCumulus * LatentHeat )
    call HistoryAutoPut( TimeN, 'DTempDtCumulus', xyz_DTempDtCumulus )
    call HistoryAutoPut( TimeN, 'DQVapDtCumulus', xyz_DQVapDtCumulus )



!!$    if ( present( xyz_DQH2OLiqDt ) ) then
!!$
!!$      xyz_DDelLWDtCCPLV = &
!!$        & + ( xyz_QVapB - xyz_QVap ) &
!!$        &       * xyz_DelPress / Grav / ( 2.0d0 * DelTime )
!!$
!!$      ! Negative cloud production rate is filled with values in lower layers.
!!$      !
!!$      xy_NegDDelLWDt = 0.0d0
!!$      do k = kmax, 1, -1
!!$        do j = 1, jmax
!!$          do i = 0, imax-1
!!$            xyz_DDelLWDtCCPLV(i,j,k) = xyz_DDelLWDtCCPLV(i,j,k) + xy_NegDDelLWDt(i,j)
!!$            if ( xyz_DDelLWDtCCPLV(i,j,k) < 0.0d0 ) then
!!$              xy_NegDDelLWDt(i,j) = xyz_DDelLWDtCCPLV(i,j,k) 
!!$              xyz_DDelLWDtCCPLV(i,j,k) = 0.0d0
!!$            end if
!!$          end do
!!$        end do
!!$      end do
!!$
!!$      xyz_DQH2OLiqDt = xyz_DDelLWDtCCPLV / ( xyz_DelPress / Grav )
!!$
!!$    end if


    ! ��������������
    ! Pause measurement of computation time
    !
    call TimesetClockStop( module_name )

  end subroutine MoistConvAdjust
Subroutine :

moist_conv_adjust �¢ã�¸ã�¥ã�¼ã������������è¡����¾ã��. NAMELIST#moist_conv_adjust_nml ����¿è¾¼�¿ã��������ç¶����§è�����¾ã��.

"moist_conv_adjust" module is initialized. "NAMELIST#moist_conv_adjust_nml" is loaded in this procedure.

This procedure input/output NAMELIST#moist_conv_adjust_nml .

[Source]

  subroutine MoistConvAdjustInit
    !
    ! moist_conv_adjust �¢ã�¸ã�¥ã�¼ã������������è¡����¾ã��. 
    ! NAMELIST#moist_conv_adjust_nml ����¿è¾¼�¿ã��������ç¶����§è�����¾ã��. 
    !
    ! "moist_conv_adjust" module is initialized. 
    ! "NAMELIST#moist_conv_adjust_nml" is loaded in this procedure. 
    !

    ! �¢ã�¸ã�¥ã�¼ã����� ; USE statements
    !

    ! NAMELIST ���¡ã�¤ã���¥å�����¢ã�������¼ã���£ã������
    ! Utilities for NAMELIST file input
    !
    use namelist_util, only: namelist_filename, NmlutilMsg, NmlutilAryValid

    ! ���¡ã�¤ã���¥å�ºå��è£���
    ! File I/O support
    !
    use dc_iounit, only: FileOpen

    ! ç¨��¥å�������¡ã��
    ! Kind type parameter
    !
    use dc_types, only: STDOUT ! æ¨�æº��ºå�����ç½����. Unit number of standard output

    ! ��������
    ! Character handling
    !
    use dc_string, only: StoA

    ! ���¹ã�������¼ã�¿å�ºå��
    ! History data output
    !
    use gtool_historyauto, only: HistoryAutoAddVariable

    ! 飽��湿����
    ! Evaluate saturation specific humidity
    !
    use saturate, only: SaturateInit


    ! 宣�� ; Declaration statements
    !
    implicit none

    integer:: unit_nml        ! NAMELIST ���¡ã�¤ã�����¼ã���³ç���ç½����. 
                              ! Unit number for NAMELIST file open
    integer:: iostat_nml      ! NAMELIST 読ã�¿è¾¼�¿æ���� IOSTAT. 
                              ! IOSTAT of NAMELIST read

    ! NAMELIST å¤��°ç¾¤
    ! NAMELIST group name
    !
    namelist /moist_conv_adjust_nml/ CrtlRH, ItrtMax, AdjustCriterion !, FlagUse

          ! �����������¤ã���¤ã��������������ç¶� "moist_conv_adjust#CumAdjInit" 
          ! ���½ã�¼ã�¹ã�³ã�¼ã�������§ã������. 
          !
          ! Refer to source codes in the initialization procedure
          ! "moist_conv_adjust#MoistConvAdjustInit" for the default values. 
          !

    ! ���� ; Executable statement
    !

    if ( moist_conv_adjust_inited ) return


    ! �����������¤ã��¨­å®�
    ! Default values settings
    !
    ! default values used in AGCM5
!!$    CrtlRH  = 0.990_DP
!!$    ItrtMax = 10
!!$    AdjustCriterion(1:ItrtMax) = &
!!$      & (/ 0.01_DP, 0.02_DP, 0.02_DP, 0.05_DP, 0.05_DP, &
!!$      &    0.10_DP, 0.10_DP, 0.20_DP, 0.20_DP, 0.40_DP  /)
    !
    CrtlRH  = 1.0_DP
    ItrtMax = 10
    AdjustCriterion(1:ItrtMax) = 0.0_DP
    !
!!$    FlagUse = .true.

    ! NAMELIST ����¿è¾¼��
    ! NAMELIST is input
    !
    if ( trim(namelist_filename) /= '' ) then
      call FileOpen( unit_nml, namelist_filename, mode = 'r' ) ! (in)

      rewind( unit_nml )
      read( unit_nml, nml = moist_conv_adjust_nml, iostat = iostat_nml )           ! (out)
      close( unit_nml )

      call NmlutilMsg( iostat_nml, module_name ) ! (in)
!!$      if ( iostat_nml == 0 ) write( STDOUT, nml = cumulus_adjust_nml )
    end if

    ! �¤ã�����¼ã�·ã�§ã�³å����, ä¸�å®�å®���¨±å®¹è�å·������§ã����
    ! Check number of iteration, admissible error of unstability
    !
    call NmlutilAryValid( module_name, AdjustCriterion, 'AdjustCriterion', ItrtMax,    'ItrtMax' )          ! (in)


    ! ���¹ã�������¼ã�¿å�ºå�����������¸ã����°ç�»é��
    ! Register of variables for history data output
    !
    call HistoryAutoAddVariable( 'RainCumulus', (/ 'lon ', 'lat ', 'time' /), 'precipitation by cumulus scheme', 'W m-2' )
    call HistoryAutoAddVariable( 'DTempDtCumulus', (/ 'lon ', 'lat ', 'sig ', 'time' /), 'cumulus condensation heating', 'K s-1' )
    call HistoryAutoAddVariable( 'DQVapDtCumulus', (/ 'lon ', 'lat ', 'sig ', 'time' /), 'cumulus condensation moistening', 'kg kg-1 s-1' )


    ! Initialization of modules used in this module
    !
    call SaturateInit


    ! �°å� ; Print
    !
    call MessageNotify( 'M', module_name, '----- Initialization Messages -----' )
!!$    call MessageNotify( 'M', module_name, '  FlagUse              = %b', l = (/ FlagUse /) )
    call MessageNotify( 'M', module_name, '  CrtlRH               = %f', d = (/ CrtlRH /) )
    call MessageNotify( 'M', module_name, '  ItrtMax              = %d', i = (/ ItrtMax /) )
    call MessageNotify( 'M', module_name, '  AdjustCriterion      = (/ %*r /)', r = real( AdjustCriterion(1:ItrtMax) ), n = (/ ItrtMax /) )
    call MessageNotify( 'M', module_name, '' )
    call MessageNotify( 'M', module_name, '-- version = %c', c1 = trim(version) )

    moist_conv_adjust_inited = .true.

  end subroutine MoistConvAdjustInit

Private Instance methods

AdjustCriterion
Variable :
AdjustCriterion(1:MaxNmlArySize) :real(DP), save
: 調ç���è¡����ºæ� (湿潤�������������¼ã��·®��¸©åº��ç®���) Criterion of adjustment (temperature difference equivalent to difference of moist static energy)
CrtlRH
Variable :
CrtlRH :real(DP), save
: �����¸å�湿度. Critical relative humidity
ItrtMax
Variable :
ItrtMax :integer, save
: �¤ã�����¼ã�·ã�§ã�³å����. Number of iteration
Subroutine :
xyz_TempB(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(in)
xyz_TempA(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(in)
xyz_QVapB(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(in)
xyz_QVapA(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(in)
xyz_DelQVapCond(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(in)
xyz_DelMass(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(in)

[Source]

  subroutine MoistConvAdjustChkCons( xyz_TempB, xyz_TempA, xyz_QVapB, xyz_QVapA, xyz_DelQVapCond, xyz_DelMass )
    !
    !
    !
    !
    !

    ! �¢ã�¸ã�¥ã�¼ã����� ; USE statements
    !

    ! ����å®��°è¨­å®�
    ! Physical constants settings
    !
    use constants, only: CpDry, LatentHeat
                              ! $ L $ [J kg-1] . 
                              ! ��������. 
                              ! Latent heat of condensation

    ! 宣�� ; Declaration statements
    !
    implicit none

    real(DP), intent(in):: xyz_TempB(0:imax-1, 1:jmax, 1:kmax)
    real(DP), intent(in):: xyz_TempA(0:imax-1, 1:jmax, 1:kmax)
    real(DP), intent(in):: xyz_QVapB(0:imax-1, 1:jmax, 1:kmax)
    real(DP), intent(in):: xyz_QVapA(0:imax-1, 1:jmax, 1:kmax)
    real(DP), intent(in):: xyz_DelQVapCond(0:imax-1, 1:jmax, 1:kmax)
    real(DP), intent(in):: xyz_DelMass    (0:imax-1, 1:jmax, 1:kmax)

    ! �業��
    ! Work variables
    !
    real(DP) :: xy_SumB (0:imax-1, 1:jmax)
    real(DP) :: xy_SumA (0:imax-1, 1:jmax)
    real(DP) :: xy_Ratio(0:imax-1, 1:jmax)

    integer:: i               ! çµ�åº��¹å�������� DO ���¼ã�����業å���
                              ! Work variables for DO loop in longitude
    integer:: j               ! ç·�º¦�¹å�������� DO ���¼ã�����業å���
                              ! Work variables for DO loop in latitude
    integer:: k               ! ���´æ�¹å�������� DO ���¼ã�����業å���
                              ! Work variables for DO loop in vertical direction

    ! ���� ; Executable statement
    !

    ! ������確è�
    ! Initialization check
    !
    if ( .not. moist_conv_adjust_inited ) then
      call MessageNotify( 'E', module_name, 'This module has not been initialized.' )
    end if


    ! Check conservation of moist static energy
    !
!!$    xy_SumB = 0.0_DP
!!$    xy_SumA = 0.0_DP
!!$    do k = kmax, 1, -1
!!$      xy_SumB = xy_SumB + CpDry * xyz_TempB(:,:,k) * xyz_DelMass(:,:,k)
!!$      xy_SumA = xy_SumA + CpDry * xyz_TempA(:,:,k) * xyz_DelMass(:,:,k)
!!$    end do


    ! Check conservation of water
    !
    xy_SumB = 0.0_DP
    xy_SumA = 0.0_DP
    do k = kmax, 1, -1
      xy_SumB = xy_SumB + xyz_QVapB(:,:,k) * xyz_DelMass(:,:,k)
      xy_SumA = xy_SumA + xyz_QVapA(:,:,k) * xyz_DelMass(:,:,k)
      xy_SumA = xy_SumA + xyz_DelQVapCond(:,:,k) * xyz_DelMass(:,:,k)
    end do
    !
    xy_Ratio = ( xy_SumA - xy_SumB ) / ( xy_SumA + 1.0e-100_DP )
    do j = 1, jmax
      do i = 0, imax-1
        if ( abs( xy_Ratio(i,j) ) > 1.0e-10_DP ) then
          call MessageNotify( 'M', module_name, 'Water is not conserved, %f.', d = (/ xy_Ratio(i,j) /) )
        end if
      end do
    end do


  end subroutine MoistConvAdjustChkCons
module_name
Constant :
module_name = ‘moist_conv_adjust :character(*), parameter
: �¢ã�¸ã�¥ã�¼ã������ç§�. Module name
moist_conv_adjust_inited
Variable :
moist_conv_adjust_inited = .false. :logical, save
: ����設������. Initialization flag
version
Constant :
version = ’$Name: $’ // ’$Id: moist_conv_adjust.f90,v 1.10 2015/01/29 12:00:21 yot Exp $’ :character(*), parameter
: �¢ã�¸ã�¥ã�¼ã�������¼ã�¸ã�§ã�� Module version