Class auxiliary
In: util/auxiliary.f90

補助的な変数を計算するサブルーチン・関数群

Subroutines and functions for calculating auxiliary variables

Note that Japanese and English are described in parallel.

このモジュールでは, 補助的な変数を計算するサブルーチンや関数を提供します.

This module provides subroutines and functions for calculating auxiliary variables.

Procedures List

AuxVars :温度の半整数 $ sigma $ レベルの補間と 気圧と高度の算出

AuxVarsInit ::

AuxVarsFinalize :終了処理 (モジュール内部の変数の割り付け解除)
————— :—————
AuxVars :Interpolate temperature on half $ sigma $ level, and calculate pressure and height

AuxVarsInit ::

AuxVarsFinalize :Termination (deallocate variables in this module)

Methods

Included Modules

gridset dc_types dc_message axesset constants timeset namelist_util dc_iounit dc_string

Public Instance methods

Subroutine :recursive
xy_Ps(0:imax-1, 1:jmax) :real(DP), intent(in)
: $ p_s (t-\Delta t) $ . 地表面気圧. Surface pressure
xyz_Temp(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(in)
: $ T $ . 温度. Temperature
xyz_QVap(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(in)
: $ q $ . 比湿. Specific humidity
xyr_Temp(0:imax-1, 1:jmax, 0:kmax) :real(DP), intent(out), optional
: $ hat{T} $ . 温度 (半整数レベル). Temperature (half level)
xyz_VirTemp(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(out), optional
: $ hat{T} $ . 仮温度 Virtual temperature
xyr_VirTemp(0:imax-1, 1:jmax, 0:kmax) :real(DP), intent(out), optional
: $ hat{T} $ . 仮温度 (半整数レベル). Virtual temperature (half level)
xyz_Press(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(out), optional
: $ p $ . 気圧 (整数レベル). Air pressure (full level)
xyr_Press(0:imax-1, 1:jmax, 0:kmax) :real(DP), intent(out), optional
: $ hat{p} $ . 気圧 (半整数レベル). Air pressure (half level)
xy_SurfHeight(0:imax-1,1:jmax) :real(DP), intent(in ), optional
: $ z_s $ . 地表面高度. Surface height.
xyz_Height(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(out), optional
: 高度 (整数レベル). Height (full level)
xyr_Height(0:imax-1, 1:jmax, 0:kmax) :real(DP), intent(out), optional
: 高度 (半整数レベル). Height (half level)
xyz_Exner(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(out), optional
: Exner 関数 (整数レベル). Exner function (full level)
xyr_Exner(0:imax-1, 1:jmax, 0:kmax) :real(DP), intent(out), optional
: Exner 関数 (半整数レベル). Exner function (half level)

温度の半整数σレベルの補間, 気圧と高度の算出, エクスナー関数の計算を行います.

Interpolate temperature on half sigma level, and calculate pressure and height, and calculate exner function.

[Source]

  recursive subroutine AuxVars( xy_Ps, xyz_Temp, xyz_QVap, xyr_Temp, xyz_VirTemp, xyr_VirTemp, xyz_Press,  xyr_Press, xy_SurfHeight, xyz_Height, xyr_Height, xyz_Exner,  xyr_Exner )
    !
    ! 温度の半整数σレベルの補間, 気圧と高度の算出, 
    ! エクスナー関数の計算を行います. 
    !
    ! Interpolate temperature on half sigma level, 
    ! and calculate pressure and height, 
    ! and calculate exner function. 

    ! モジュール引用 ; USE statements
    !

    ! 座標データ設定
    ! Axes data settings
    !
    use axesset, only: z_Sigma, r_Sigma, z_DelSigma, r_DelSigma
                              ! $ \Delta \sigma $ (半整数). 
                              ! $ \Delta \sigma $ (Half)

    ! 物理定数設定
    ! Physical constants settings
    !
    use constants, only: Grav, GasRDry, CpDry, EpsV
                              ! $ \epsilon_v $ .
                              ! 水蒸気分子量比.
                              ! Molecular weight of water vapor

    ! 時刻管理
    ! Time control
    !
    use timeset, only: TimesetClockStart, TimesetClockStop

    ! 宣言文 ; Declaration statements
    !
    implicit none

    real(DP), intent(in):: xy_Ps       (0:imax-1, 1:jmax)
                              ! $ p_s (t-\Delta t) $ . 地表面気圧. Surface pressure
    real(DP), intent(in):: xyz_Temp    (0:imax-1, 1:jmax, 1:kmax)
                              ! $ T $ .     温度. Temperature
    real(DP), intent(in):: xyz_QVap    (0:imax-1, 1:jmax, 1:kmax)
                              ! $ q $ .     比湿. Specific humidity
    real(DP), intent(out), optional:: xyr_Temp   (0:imax-1, 1:jmax, 0:kmax)
                              ! $ \hat{T} $ . 温度 (半整数レベル). 
                              ! Temperature (half level)
    real(DP), intent(out), optional:: xyz_VirTemp(0:imax-1, 1:jmax, 1:kmax)
                              ! $ \hat{T} $ . 仮温度
                              ! Virtual temperature
    real(DP), intent(out), optional:: xyr_VirTemp(0:imax-1, 1:jmax, 0:kmax)
                              ! $ \hat{T} $ . 仮温度 (半整数レベル). 
                              ! Virtual temperature (half level)
    real(DP), intent(out), optional:: xyz_Press  (0:imax-1, 1:jmax, 1:kmax)
                              ! $ p $ . 気圧 (整数レベル). 
                              ! Air pressure (full level)
    real(DP), intent(out), optional:: xyr_Press  (0:imax-1, 1:jmax, 0:kmax)
                              ! $ \hat{p} $ . 気圧 (半整数レベル). 
                              ! Air pressure (half level)
    real(DP), intent(in ), optional:: xy_SurfHeight(0:imax-1,1:jmax)
                              ! $ z_s $ . 地表面高度. 
                              ! Surface height. 
    real(DP), intent(out), optional:: xyz_Height (0:imax-1, 1:jmax, 1:kmax)
                              ! 高度 (整数レベル). 
                              ! Height (full level)
    real(DP), intent(out), optional:: xyr_Height (0:imax-1, 1:jmax, 0:kmax)
                              ! 高度 (半整数レベル). 
                              ! Height (half level)
    real(DP), intent(out), optional:: xyz_Exner (0:imax-1, 1:jmax, 1:kmax)
                              ! Exner 関数 (整数レベル). 
                              ! Exner function (full level)
    real(DP), intent(out), optional:: xyr_Exner (0:imax-1, 1:jmax, 0:kmax)
                              ! Exner 関数 (半整数レベル). 
                              ! Exner function (half level)


    ! 作業変数
    ! Work variables
    !
    real(DP):: xyz_PressWork  (0:imax-1, 1:jmax, 1:kmax)
                              ! $ p $ . 気圧 (整数レベル). 
                              ! Air pressure (full level)
    real(DP):: xyr_PressWork  (0:imax-1, 1:jmax, 0:kmax)
                              ! $ \hat{p} $ . 気圧 (半整数レベル). 
                              ! Air pressure (half level)
    real(DP):: xyr_TempWork   (0:imax-1, 1:jmax, 0:kmax)
                              ! $ \hat{T} $ . 温度 (半整数レベル). 
                              ! Temperature (half level)
    real(DP):: xyz_VirTempWork(0:imax-1, 1:jmax, 1:kmax)
                              ! $ T_v $ . 仮温度.
                              ! Virtual temperature
    real(DP):: xyr_VirTempWork(0:imax-1, 1:jmax, 0:kmax)
                              ! $ \hat{T}_v $ . 仮温度 (半整数レベル). 
                              ! Virtual temperature (half level)

    integer:: k               ! 鉛直方向に回る DO ループ用作業変数
                              ! Work variables for DO loop in vertical direction

    ! 実行文 ; Executable statement
    !

    ! 初期化確認
    ! Initialization check
    !
    if ( .not. auxiliary_inited ) then
      call MessageNotify( 'E', module_name, 'This module has not been initialized.' )
    end if


    ! 計算時間計測開始
    ! Start measurement of computation time
    !
    call TimesetClockStart( module_name )


    ! 温度の補間
    ! Interpolate temperature
    !
    if ( present( xyr_Temp ) ) then
      call AuxVarsInternalRoutine( xy_Ps,      xyz_Temp, xyr_Temp = xyr_Temp )
    end if

    ! 仮温度の計算
    ! Calculate virtual temperature
    !
    if ( present( xyz_VirTemp ) ) then
      xyz_VirTemp = xyz_Temp * ( 1.0_DP + ((( 1.0_DP / EpsV ) - 1.0_DP ) * xyz_QVap) )
    end if

    ! 仮温度の補間
    ! Interpolate virtual temperature
    !
    if ( present( xyr_VirTemp ) ) then
      if ( present( xyz_VirTemp ) ) then
        xyz_VirTempWork = xyz_VirTemp
      else
        xyz_VirTempWork = xyz_Temp * ( 1.0_DP + ((( 1.0_DP / EpsV ) - 1.0_DP ) * xyz_QVap) )
      end if
      call AuxVarsInternalRoutine( xy_Ps, xyz_VirTempWork, xyr_Temp = xyr_VirTemp )
    end if

    ! 気圧の計算
    ! Calculate pressure
    !
    if ( present( xyz_Press ) ) then
      call AuxVarsInternalRoutine( xy_Ps,      xyz_Temp, xyz_Press = xyz_Press )
    end if

    if ( present( xyr_Press ) ) then
      call AuxVarsInternalRoutine( xy_Ps,      xyz_Temp, xyr_Press = xyr_Press )
    end if

    ! 高度の計算
    ! Calculate height
    !
    if ( present( xyz_Height ) .and. present( xy_SurfHeight ) ) then

!!$      if ( present( xyr_Temp ) ) then
!!$        xyr_TempWork = xyr_Temp
!!$      else
!!$        call AuxVarsInternalRoutine( &
!!$          & xy_Ps, xyz_Temp,         &  ! (in )
!!$          & xyr_Temp = xyr_TempWork  &  ! (out) optional
!!$          & )
!!$      end if
      if ( present( xyz_VirTemp ) .and. present( xyr_VirTemp ) ) then
        xyz_VirTempWork = xyz_VirTemp
        xyr_VirTempWork = xyr_VirTemp
      else
        ! 計算時間計測一時停止
        ! Pause measurement of computation time
        call TimesetClockStop( module_name )
        call AuxVars( xy_Ps, xyz_Temp, xyz_QVap, xyz_VirTemp = xyz_VirTempWork, xyr_VirTemp = xyr_VirTempWork )
        ! 計算時間計測開始
        ! Start measurement of computation time
        call TimesetClockStart( module_name )
      end if

!!$      xyz_Height(:,:,1) = &
!!$        & xy_SurfHeight(:,:) &
!!$        & + GasRDry / Grav * xyz_Temp(:,:,1) * ( 1. - z_Sigma(1) )
!!$      do k = 2, kmax
!!$        xyz_Height(:,:,k) = &
!!$          &   xyz_Height(:,:,k-1) &
!!$          & + GasRDry / Grav * xyr_TempWork(:,:,k-1) &
!!$          &   * r_DelSigma(k-1) / r_Sigma(k-1)
!!$      end do

      xyz_Height(:,:,1) = xy_SurfHeight + GasRDry / Grav * xyz_VirTempWork(:,:,1) * ( 1.0_DP - z_Sigma(1) )
      do k = 2, kmax
        xyz_Height(:,:,k) = xyz_Height(:,:,k-1) + GasRDry / Grav * xyr_VirTempWork(:,:,k-1) * r_DelSigma(k-1) / r_Sigma(k-1)
      end do
    end if

    if ( present( xyr_Height ) .and. present( xy_SurfHeight ) ) then

      if ( present( xyz_VirTemp ) ) then
        xyz_VirTempWork = xyz_VirTemp
      else
        ! 計算時間計測一時停止
        ! Pause measurement of computation time
        call TimesetClockStop( module_name )
        call AuxVars( xy_Ps, xyz_Temp, xyz_QVap, xyz_VirTemp = xyz_VirTempWork )
        ! 計算時間計測開始
        ! Start measurement of computation time
        call TimesetClockStart( module_name )
      end if

      xyr_Height(:,:,0) = xy_SurfHeight
      do k = 1, kmax
!!$        xyr_Height(:,:,k) = xyr_Height(:,:,k-1)        &
!!$          & + GasRDry / Grav * xyz_Temp(:,:,k)     &
!!$          &   * z_DelSigma(k) / z_Sigma(k)
        xyr_Height(:,:,k) = xyr_Height(:,:,k-1) + GasRDry / Grav * xyz_VirTempWork(:,:,k) * z_DelSigma(k) / z_Sigma(k)
      end do
    end if

    ! エクスナー関数の計算
    ! Calculate exner function
    !
    if ( present( xyz_Exner ) ) then
      if ( present( xyz_Press ) ) then
        xyz_PressWork = xyz_Press
      else
        call AuxVarsInternalRoutine( xy_Ps,      xyz_Temp, xyz_Press = xyz_PressWork )
      end if

      xyz_Exner = ( xyz_PressWork / RefPress ) ** ( GasRDry / CpDry )
    end if


    if ( present( xyr_Exner ) ) then
      if ( present( xyr_Press ) ) then
        xyr_PressWork = xyr_Press
      else
        call AuxVarsInternalRoutine( xy_Ps,      xyz_Temp, xyr_Press = xyr_PressWork )
      end if

      xyr_Exner = ( xyr_PressWork / RefPress ) ** ( GasRDry / CpDry )
    end if

    ! 計算時間計測一時停止
    ! Pause measurement of computation time
    !
    call TimesetClockStop( module_name )

  end subroutine AuxVars
Subroutine :

モジュール内部の変数の割り付け解除を行います.

Deallocate variables in this module.

[Source]

  subroutine AuxVarsFinalize
    !
    ! モジュール内部の変数の割り付け解除を行います. 
    !
    ! Deallocate variables in this module. 
    !

    ! 宣言文 ; Declaration statements
    !
    implicit none

    ! 実行文 ; Executable statement
    !

    if ( .not. auxiliary_inited ) return

    ! 割り付け解除
    ! Deallocation
    !
    if ( allocated( z_TempInpolM ) ) deallocate( z_TempInpolM )
    if ( allocated( z_TempInpol  ) ) deallocate( z_TempInpol  )

    auxiliary_inited = .false.

  end subroutine AuxVarsFinalize
Subroutine :

auxiliary モジュールの初期化を行います. NAMELIST#auxiliary_nml の読み込みはこの手続きで行われます.

"auxiliary" module is initialized. "NAMELIST#auxiliary_nml" is loaded in this procedure.

This procedure input/output NAMELIST#auxiliary_nml .

[Source]

  subroutine AuxVarsInit
    !
    ! auxiliary モジュールの初期化を行います. 
    ! NAMELIST#auxiliary_nml の読み込みはこの手続きで行われます. 
    !
    ! "auxiliary" module is initialized. 
    ! "NAMELIST#auxiliary_nml" is loaded in this procedure. 
    !

    ! モジュール引用 ; USE statements
    !

    ! 座標データ設定
    ! Axes data settings
    !
    use axesset, only: z_Sigma, r_Sigma
                              ! $ \sigma $ レベル (半整数). 
                              ! Half $ \sigma $ level

    ! NAMELIST ファイル入力に関するユーティリティ
    ! Utilities for NAMELIST file input
    !
    use namelist_util, only: namelist_filename, NmlutilMsg

    ! ファイル入出力補助
    ! 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

    ! 宣言文 ; Declaration statements
    !
    implicit none

    integer:: unit_nml        ! NAMELIST ファイルオープン用装置番号. 
                              ! Unit number for NAMELIST file open
    integer:: iostat_nml      ! NAMELIST 読み込み時の IOSTAT. 
                              ! IOSTAT of NAMELIST read

    integer:: k               ! 鉛直方向に回る DO ループ用作業変数
                              ! Work variables for DO loop in vertical direction

    ! NAMELIST 変数群
    ! NAMELIST group name
    !
    namelist /auxiliary_nml/ RefPress
          !
          ! デフォルト値については初期化手続 "auxiliary#AuxVarsInit" 
          ! のソースコードを参照のこと. 
          !
          ! Refer to source codes in the initialization procedure
          ! "auxiliary#AuxVarsInit" for the default values. 
          !

    ! 実行文 ; Executable statement
    !

    if ( auxiliary_inited ) return


    ! デフォルト値の設定
    ! Default values settings
    !
    RefPress        =   1.0d5

    ! 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 = auxiliary_nml, iostat = iostat_nml )   ! (out)
      close( unit_nml )

      call NmlutilMsg( iostat_nml, module_name ) ! (in)
    end if

    !  補間用の係数の計算
    !  Calculate coefficient for interpolation
    !
    allocate( z_TempInpolM(1:kmax) )
    allocate( z_TempInpol(1:kmax) )

    z_TempInpolM(1) = 0.
    z_TempInpol (1) = 0.

    do k = 2, kmax
      z_TempInpolM(k) = ( log( r_Sigma( k-1 ) ) - log( z_Sigma( k ) ) ) / ( log( z_Sigma( k-1 ) ) - log( z_Sigma( k ) ) )
      z_TempInpol(k) = ( log( z_Sigma( k-1 ) ) - log( r_Sigma( k-1 ) ) ) / ( log( z_Sigma( k-1 ) ) - log( z_Sigma( k )   ) )
    end  do

    ! 印字 ; Print
    !
    call MessageNotify( 'M', module_name, '----- Initialization Messages -----' )
    call MessageNotify( 'M', module_name, '  z_TempInpolM = %*r', r = real( z_TempInpolM ), n = (/ kmax /) )
    call MessageNotify( 'M', module_name, '  z_TempInpol  = %*r', r = real( z_TempInpol  ), n = (/ kmax /) )
    call MessageNotify( 'M', module_name, '  RefPress     = %f', d = (/ RefPress /) )
    call MessageNotify( 'M', module_name, '-- version = %c', c1 = trim(version) )

    auxiliary_inited = .true.

  end subroutine AuxVarsInit

Private Instance methods

Subroutine :
xy_Ps(0:imax-1, 1:jmax) :real(DP), intent(in)
: $ p_s (t-\Delta t) $ . 地表面気圧. Surface pressure
xyz_Temp(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(in)
: $ T $ . 温度. Temperature
xyr_Temp(0:imax-1, 1:jmax, 0:kmax) :real(DP), intent(out), optional
: $ hat{T} $ . 温度 (半整数レベル). Temperature (half level)
xyz_Press(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(out), optional
: $ p $ . 気圧 (整数レベル). Air pressure (full level)
xyr_Press(0:imax-1, 1:jmax, 0:kmax) :real(DP), intent(out), optional
: $ hat{p} $ . 気圧 (半整数レベル). Air pressure (half level)

温度の半整数σレベルの補間, 気圧の算出, エクスナー関数の計算を行います.

Interpolate temperature on half sigma level, and calculate pressure, and calculate exner function.

[Source]

  subroutine AuxVarsInternalRoutine( xy_Ps,      xyz_Temp, xyr_Temp, xyz_Press,  xyr_Press )
    !
    ! 温度の半整数σレベルの補間, 気圧の算出, 
    ! エクスナー関数の計算を行います. 
    !
    ! Interpolate temperature on half sigma level, 
    ! and calculate pressure, 
    ! and calculate exner function. 

    ! モジュール引用 ; USE statements
    !

    ! 座標データ設定
    ! Axes data settings
    !
    use axesset, only: z_Sigma, r_Sigma
                              ! $ \sigma $ レベル (半整数). 
                              ! Half $ \sigma $ level

    ! 宣言文 ; Declaration statements
    !
    implicit none

    real(DP), intent(in):: xy_Ps       (0:imax-1, 1:jmax)
                              ! $ p_s (t-\Delta t) $ . 地表面気圧. Surface pressure
    real(DP), intent(in):: xyz_Temp    (0:imax-1, 1:jmax, 1:kmax)
                              ! $ T $ .     温度. Temperature
    real(DP), intent(out), optional:: xyr_Temp   (0:imax-1, 1:jmax, 0:kmax)
                              ! $ \hat{T} $ . 温度 (半整数レベル). 
                              ! Temperature (half level)
    real(DP), intent(out), optional:: xyz_Press  (0:imax-1, 1:jmax, 1:kmax)
                              ! $ p $ . 気圧 (整数レベル). 
                              ! Air pressure (full level)
    real(DP), intent(out), optional:: xyr_Press  (0:imax-1, 1:jmax, 0:kmax)
                              ! $ \hat{p} $ . 気圧 (半整数レベル). 
                              ! Air pressure (half level)


    ! 作業変数
    ! Work variables
    !
    integer:: k               ! 鉛直方向に回る DO ループ用作業変数
                              ! Work variables for DO loop in vertical direction

    ! 実行文 ; Executable statement
    !


    ! 初期化確認
    ! Initialization check
    !
    if ( .not. auxiliary_inited ) then
      call MessageNotify( 'E', module_name, 'This module has not been initialized.' )
    end if


    ! 温度の補間
    ! Interpolate temperature
    !
    if ( present( xyr_Temp ) ) then
      do k = 2, kmax
        xyr_Temp(:,:,k-1) =   z_TempInpolM(k) * xyz_Temp(:,:,k-1) + z_TempInpol (k) * xyz_Temp(:,:,k)
      end do

      xyr_Temp(:,:,kmax) = xyz_Temp(:,:,kmax)
      xyr_Temp(:,:,0)    = xyz_Temp(:,:,1)

    end if

    ! 気圧の計算
    ! Calculate pressure
    !
    if ( present( xyz_Press ) ) then
      do k = 1, kmax
        xyz_Press(:,:,k) = xy_Ps * z_Sigma(k)
      end do
    end if

    if ( present( xyr_Press ) ) then
      do k = 0, kmax
        xyr_Press(:,:,k) = xy_Ps * r_Sigma(k)
      end do
    end if


  end subroutine AuxVarsInternalRoutine
RefPress
Variable :
RefPress :real(DP), save
: 基準気圧. Reference air pressure
auxiliary_inited
Variable :
auxiliary_inited = .false. :logical, save
: 初期設定フラグ. Initialization flag
module_name
Constant :
module_name = ‘auxiliary :character(*), parameter
: モジュールの名称. Module name
version
Constant :
version = ’$Name: dcpam5-20120921 $’ // ’$Id: auxiliary.f90,v 1.14 2012-02-20 08:09:17 yot Exp $’ :character(*), parameter
: モジュールのバージョン Module version
z_TempInpol
Variable :
z_TempInpol(:) :real(DP), save, allocatable
: 温度の補間用の係数. Coefficient for interpolation of temperature
z_TempInpolM
Variable :
z_TempInpolM(:) :real(DP), save, allocatable
: 温度の補間用の係数. Coefficient for interpolation of temperature