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 $ レベルの補間と 気圧と高度の算出
AuxFinalize :終了処理 (モジュール内部の変数の割り付け解除)
————— :—————
AuxVars :Interpolate temperature on half $ sigma $ level, and calculate pressure and height
AuxFinalize :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 :

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

Deallocate variables in this module.

[Source]

  subroutine AuxFinalize
    !
    ! モジュール内部の変数の割り付け解除を行います. 
    !
    ! 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 AuxFinalize
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)
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]

  subroutine AuxVars( xy_Ps,      xyz_Temp, xyr_Temp, 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
                              ! $ C_p $ [J kg-1 K-1]. 
                              ! 乾燥大気の定圧比熱. 
                              ! Specific heat of air at constant pressure

    ! 時刻管理
    ! 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(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)
    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)

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

    ! 実行文 ; Executable statement
    !

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

    ! 初期化
    ! Initialization
    !
    if ( .not. auxiliary_inited ) call AuxInit

    ! 温度の補間
    ! Interpolate temperature
    !
    if ( present( xyr_Temp ) ) then
      call AuxVarsInternalRoutine( xy_Ps,      xyz_Temp, xyr_Temp = xyr_Temp )
    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
      xyz_Height(:,:,1) = xy_SurfHeight(:,:) + GasRDry / Grav * xyz_Temp(:,:,1) * ( 1. - z_Sigma(1) )

      if ( present( xyr_Temp ) ) then
        xyr_TempWork = xyr_Temp
      else
        call AuxVarsInternalRoutine( xy_Ps,      xyz_Temp, xyr_Temp = xyr_TempWork )
      end if

      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
    end if

    if ( present( xyr_Height ) .and. present( xy_SurfHeight ) ) then
      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)
      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
auxiliary_inited
Variable :
auxiliary_inited = .false. :logical, save, public
: 初期設定フラグ. Initialization flag

Private Instance methods

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 AuxInit
    !
    ! 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#AuxInit" 
          ! のソースコードを参照のこと. 
          !
          ! Refer to source codes in the initialization procedure
          ! "auxiliary#AuxInit" for the default values. 
          !

    ! 実行文 ; Executable statement
    !

    if ( auxiliary_inited ) return
    call InitCheck

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

    ! 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 AuxInit
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
    !
    if ( .not. auxiliary_inited ) call AuxInit

    ! 温度の補間
    ! 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
Subroutine :

依存モジュールの初期化チェック

Check initialization of dependency modules

[Source]

  subroutine InitCheck
    !
    ! 依存モジュールの初期化チェック
    !
    ! Check initialization of dependency modules

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

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

    ! 格子点設定
    ! Grid points settings
    !
    use gridset, only: gridset_inited

    ! 物理定数設定
    ! Physical constants settings
    !
    use constants, only: constants_inited

    ! 座標データ設定
    ! Axes data settings
    !
    use axesset, only: axesset_inited

    ! 実行文 ; Executable statement
    !

    if ( .not. namelist_util_inited ) call MessageNotify( 'E', module_name, '"namelist_util" module is not initialized.' )

    if ( .not. gridset_inited ) call MessageNotify( 'E', module_name, '"gridset" module is not initialized.' )

    if ( .not. constants_inited ) call MessageNotify( 'E', module_name, '"constants" module is not initialized.' )

    if ( .not. axesset_inited ) call MessageNotify( 'E', module_name, '"axesset" module is not initialized.' )

  end subroutine InitCheck
RefPress
Variable :
RefPress :real(DP), save
: 基準気圧. Reference air pressure
module_name
Constant :
module_name = ‘auxiliary :character(*), parameter
: モジュールの名称. Module name
version
Constant :
version = ’$Name: dcpam5-20101015 $’ // ’$Id: auxiliary.f90,v 1.8 2010-03-07 14:51:05 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