| Class | intpol_half |
| In: |
util/intpol_half.f90
|
Note that Japanese and English are described in parallel.
このモジュールでは, 温度の半整数 $ sigma $ レベルの補間や 気圧と高度の算出のためのサブルーチンを提供します.
This module provides subroutines that interpolate temperature on half $ sigma $ level, or calculate pressure and height.
| IntpolHalfLevel : | 温度の半整数 $ sigma $ レベルの補間と 気圧と高度の算出 |
| ————— : | ————— |
| IntpolHalfLevel : | Interpolate temperature on half $ sigma $ level, and calculate pressure and height |
| Subroutine : | |||
| xy_Ps(0:imax-1, 1:jmax) : | real(DP), intent(in)
| ||
| xyz_Temp(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(in)
| ||
| xyr_Temp(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(out)
| ||
| xyz_Press(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(out)
| ||
| xyr_Press(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(out)
| ||
| xyz_Height(0:imax-1, 1:jmax, 1:kmax) : | real(DP), intent(out)
| ||
| xyr_Height(0:imax-1, 1:jmax, 0:kmax) : | real(DP), intent(out)
|
温度の半整数σレベルの補間, 気圧と高度の算出を行います.
Interpolate temperature on half sigma level, and calculate pressure and height.
subroutine IntpolHalfLevel( xy_Ps, xyz_Temp, xyr_Temp, xyz_Press, xyr_Press, xyz_Height, xyr_Height )
!
! 温度の半整数σレベルの補間, 気圧と高度の算出を行います.
!
! Interpolate temperature on half sigma level,
! and calculate pressure and height.
!
! モジュール引用 ; 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 ! $ R $ [J kg-1 K-1].
! 乾燥大気の気体定数.
! Gas constant of air
! 時刻管理
! 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):: xyr_Temp (0:imax-1, 1:jmax, 0:kmax)
! $ \hat{T} $ . 温度 (半整数レベル).
! Temperature (half level)
real(DP), intent(out):: xyz_Press (0:imax-1, 1:jmax, 1:kmax)
! $ p $ . 気圧 (整数レベル).
! Air pressure (full level)
real(DP), intent(out):: xyr_Press (0:imax-1, 1:jmax, 0:kmax)
! $ \hat{p} $ . 気圧 (半整数レベル).
! Air pressure (half level)
real(DP), intent(out):: xyz_Height (0:imax-1, 1:jmax, 1:kmax)
! 高度 (整数レベル).
! Height (full level)
real(DP), intent(out):: xyr_Height (0:imax-1, 1:jmax, 0:kmax)
! 高度 (半整数レベル).
! Height (half level)
! 作業変数
! Work variables
!
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. intpol_half_inited ) call IntpolHalfInit
! 温度の補間
! Interpolate temperature
!
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)
! 気圧の計算
! Calculate pressure
!
do k = 1, kmax
xyz_Press(:,:,k) = xy_Ps * z_Sigma(k)
end do
do k = 0, kmax
xyr_Press(:,:,k) = xy_Ps * r_Sigma(k)
end do
! 高度の計算
! Calculate height
!
xyz_Height(:,:,1) = GasRDry / Grav * xyz_Temp(:,:,1) * ( 1.0_DP - z_Sigma(1) )
do k = 2, kmax
xyz_Height(:,:,k) = xyz_Height(:,:,k-1) + GasRDry / Grav * xyr_Temp(:,:,k-1) * r_DelSigma(k-1) / r_Sigma(k-1)
end do
xyr_Height = 0.0_DP
do k = 1, kmax
xyr_Height(:,:,k) = xyr_Height(:,:,k-1) + GasRDry / Grav * xyz_Temp(:,:,k) * z_DelSigma(k) / z_Sigma(k)
end do
! 計算時間計測一時停止
! Pause measurement of computation time
!
call TimesetClockStop( module_name )
end subroutine IntpolHalfLevel
| Variable : | |||
| intpol_half_inited = .false. : | logical, save, public
|
| Subroutine : |
依存モジュールの初期化チェック
Check initialization of dependency modules
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
| Subroutine : |
intpol_half モジュールの初期化を行います. NAMELIST#intpol_half_nml の読み込みはこの手続きで行われます.
"intpol_half" module is initialized. "NAMELIST#intpol_half_nml" is loaded in this procedure.
subroutine IntpolHalfInit
!
! intpol_half モジュールの初期化を行います.
! NAMELIST#intpol_half_nml の読み込みはこの手続きで行われます.
!
! "intpol_half" module is initialized.
! "NAMELIST#intpol_half_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 /intpol_half_nml/
!
! デフォルト値については初期化手続 "intpol_half#IntpolHalfInit"
! のソースコードを参照のこと.
!
! Refer to source codes in the initialization procedure
! "intpol_half#IntpolHalfInit" for the default values.
!
! 実行文 ; Executable statement
!
if ( intpol_half_inited ) return
call InitCheck
! デフォルト値の設定
! Default values settings
!
!!$ ! NAMELIST の読み込み
!!$ ! NAMELIST is input
!!$ !
!!$ if ( trim(namelist_filename) /= '' ) then
!!$ call FileOpen( unit_nml, & ! (out)
!!$ & namelist_filename, mode = 'r' ) ! (in)
!!$
!!$ rewind( unit_nml )
!!$ read( unit_nml, & ! (in)
!!$ & nml = intpol_half_nml, & ! (out)
!!$ & 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 = 0.0_DP
z_TempInpol = 0.0_DP
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, '-- version = %c', c1 = trim(version) )
intpol_half_inited = .true.
end subroutine IntpolHalfInit
| Constant : | |||
| version = ’$Name: dcpam5-20090126 $’ // ’$Id: intpol_half.f90,v 1.3 2009-01-06 10:38:44 morikawa Exp $’ : | character(*), parameter
|
| Variable : | |||
| z_TempInpol(:) : | real(DP), allocatable
|
| Variable : | |||
| z_TempInpolM(:) : | real(DP), allocatable
|