!= タイムフィルター (Asselin, 1972)
!
!= Time filter (Asselin, 1972)
!
! Authors:: Yasuhiro MORIKAWA
! Version:: $Id: timefilter_asselin1972.f90,v 1.3 2008-10-06 16:30:12 morikawa Exp $
! Tag Name:: $Name: dcpam5-20090306 $
! Copyright:: Copyright (C) GFD Dennou Club, 2008. All rights reserved.
! License:: See COPYRIGHT[link:../../../COPYRIGHT]
!
module timefilter_asselin1972
!
!= タイムフィルター (Asselin, 1972)
!
!= Time filter (Asselin, 1972)
!
! Note that Japanese and English are described in parallel.
!
! 計算モードを抑えるためのタイムフィルター (Asselin, 1972)
! を適用するためのモジュールです.
!
! すなわち
! \[
! \bar{A}^{t}
! = {A}^{t}
! + \epsilon_f
! \left(
! \bar{A}^{t-\Delta t} - 2{A}^{t} + {A}^{t+\Delta t}
! \right) \] \[
! \qquad
! = ( 1-2 \epsilon_f ) {A}^{t}
! + \epsilon_f
! \left( \bar{A}^{t-\Delta t} + {A}^{t+\Delta t} \right)
! \]
! として $ \bar{A}^{t} $ を求めます. 添え字
! $ t-\Delta t, t, t+\Delta t $ はそれぞれ時間ステップを表し,
! タイムフィルターが適用された項には上線 ( $ \bar{\quad} $ )
! が付いています.
!
! タイムフィルターの係数 $\epsilon_f$ は Create の際に設定します.
!
!--
! \[
! \bar{\mathscr A}^{t}
! = ( 1-2 \epsilon_f ) {\mathscr A}^{t}
! + \epsilon_f
! \left( \bar{\mathscr A}^{t-\Delta t} + {\mathscr A}^{t+\Delta t} \right)
! \]
! として$\bar{\mathscr A}^{t}$を求めます. 添え字
!++
!
! Time filter (Asselin, 1972) for suppression of computational mode
! is applied.
!
! Concretely, $ \bar{A}^{t} $ is derived as follows.
! \[
! \bar{A}^{t}
! = {A}^{t}
! + \epsilon_f
! \left(
! \bar{A}^{t-\Delta t} - 2{A}^{t} + {A}^{t+\Delta t}
! \right) \] \[
! \qquad
! = ( 1-2 \epsilon_f ) {A}^{t}
! + \epsilon_f
! \left( \bar{A}^{t-\Delta t} + {A}^{t+\Delta t} \right),
! \]
! where suffices $ t-\Delta t, t, t+\Delta t $ represent time step,
! and over-bar $ \bar{\quad} $ represents the terms applied
! time filter.
!
! Time filter coefficient $ \epsilon_f $ is specified by "Create".
!
!== Procedures List
!
! TimeFilter :: タイムフィルターの適用
! ------------ :: ------------
! TimeFilter :: Apply time filter
!
!== NAMELIST
!
! NAMELIST#timefilter_asselin1972_nml
!
!== References
!
! * Asselin, R. A., 1972:
! Frequency filter for time integrations.
! Mon. Wea. Rev., 100, 487--490.
!
! モジュール引用 ; USE statements
!
! 格子点設定
! Grid points settings
!
use gridset, only: imax, & ! 経度格子点数.
! Number of grid points in longitude
& jmax, & ! 緯度格子点数.
! Number of grid points in latitude
& kmax ! 鉛直層数.
! Number of vertical level
! 種別型パラメタ
! Kind type parameter
!
use dc_types, only: DP, & ! 倍精度実数型. Double precision.
& STRING ! 文字列. Strings.
! メッセージ出力
! Message output
!
use dc_message, only: MessageNotify
! 宣言文 ; Declaration statements
!
implicit none
private
! 公開手続き
! Public procedure
!
public:: TimeFilter
! 公開変数
! Public variables
!
logical, save, public:: timefilter_asselin1972_inited = .false.
! 初期設定フラグ.
! Initialization flag
! 非公開変数
! Private variables
!
real(DP), save:: FilterParameter
! タイムフィルターの係数.
! Time filter coefficient
integer, save:: IntStep ! タイムフィルターを適用するステップ間隔.
! Step interval of time filter application
integer, save:: CurStep ! TimeFilter が呼ばれた回数.
! Number of times that "TimeFilter" is called
integer, save:: PrevStep ! 前回タイムフィルターを適用したステップ数.
! Step number that is filtered previously
character(*), parameter:: module_name = 'timefilter_asselin1972'
! モジュールの名称.
! Module name
character(*), parameter:: version = &
& '$Name: dcpam5-20090306 $' // &
& '$Id: timefilter_asselin1972.f90,v 1.3 2008-10-06 16:30:12 morikawa Exp $'
! モジュールのバージョン
! Module version
! INTERFACE 文 ; INTERFACE statements
!
interface TimeFilter
module procedure TimeFilter
end interface
contains
subroutine TimeFilter( &
& xyz_UB, xyz_VB, xyz_TempB, xyz_QVapB, xy_PsB, & ! (in)
& xyz_UN, xyz_VN, xyz_TempN, xyz_QVapN, xy_PsN, & ! (inout)
& xyz_UA, xyz_VA, xyz_TempA, xyz_QVapA, xy_PsA & ! (in)
& )
!
! 予報変数にタイムフィルターを適用します.
!
! Time filter is applied to predictional variables.
!
! モジュール引用 ; USE statements
!
! 時刻管理
! Time control
!
use timeset, only: &
& TimesetClockStart, TimesetClockStop
! 宣言文 ; Declaration statements
!
implicit none
real(DP), intent(in):: xyz_UB (0:imax-1, 1:jmax, 1:kmax)
! $ u (t-\Delta t) $ . 東西風速. Eastward wind
real(DP), intent(in):: xyz_VB (0:imax-1, 1:jmax, 1:kmax)
! $ v (t-\Delta t) $ . 南北風速. Northward wind
real(DP), intent(in):: xyz_TempB (0:imax-1, 1:jmax, 1:kmax)
! $ T (t-\Delta t) $ . 温度. Temperature
real(DP), intent(in):: xyz_QVapB (0:imax-1, 1:jmax, 1:kmax)
! $ q (t-\Delta t) $ . 比湿. Specific humidity
real(DP), intent(in):: xy_PsB (0:imax-1, 1:jmax)
! $ p_s (t-\Delta t) $ . 地表面気圧. Surface pressure
real(DP), intent(inout):: xyz_UN (0:imax-1, 1:jmax, 1:kmax)
! $ u (t) $ . 東西風速. Eastward wind
real(DP), intent(inout):: xyz_VN (0:imax-1, 1:jmax, 1:kmax)
! $ v (t) $ . 南北風速. Northward wind
real(DP), intent(inout):: xyz_TempN (0:imax-1, 1:jmax, 1:kmax)
! $ T (t) $ . 温度. Temperature
real(DP), intent(inout):: xyz_QVapN (0:imax-1, 1:jmax, 1:kmax)
! $ q (t) $ . 比湿. Specific humidity
real(DP), intent(inout):: xy_PsN (0:imax-1, 1:jmax)
! $ p_s (t) $ . 地表面気圧. Surface pressure
real(DP), intent(in):: xyz_UA (0:imax-1, 1:jmax, 1:kmax)
! $ u (t+\Delta t) $ . 東西風速. Eastward wind
real(DP), intent(in):: xyz_VA (0:imax-1, 1:jmax, 1:kmax)
! $ v (t+\Delta t) $ . 南北風速. Northward wind
real(DP), intent(in):: xyz_TempA (0:imax-1, 1:jmax, 1:kmax)
! $ T (t+\Delta t) $ . 温度. Temperature
real(DP), intent(in):: xyz_QVapA (0:imax-1, 1:jmax, 1:kmax)
! $ q (t+\Delta t) $ . 比湿. Specific humidity
real(DP), intent(in):: xy_PsA (0:imax-1, 1:jmax)
! $ p_s (t+\Delta t) $ . 地表面気圧. Surface pressure
! 作業変数
! Work variables
!
! 実行文 ; Executable statement
!
! 計算時間計測開始
! Start measurement of computation time
!
call TimesetClockStart( module_name )
! 初期化
! Initialization
!
if ( .not. timefilter_asselin1972_inited ) call TimeFiltInit
! ステップのチェック
! Check Step
!
CurStep = CurStep + 1
if ( CurStep - PrevStep < IntStep ) return
PrevStep = CurStep
! FilterParameter の有効性のチェック
! Check validity of "FilterParameter"
!
if ( FilterParameter == 0.0_DP ) return
! タイムフィルターを適用
! Apply time filter
!
xyz_UN = ( 1.0 - 2.0 * FilterParameter ) * xyz_UN &
& + FilterParameter * ( xyz_UB + xyz_UA )
xyz_VN = ( 1.0 - 2.0 * FilterParameter ) * xyz_VN &
& + FilterParameter * ( xyz_VB + xyz_VA )
xyz_TempN = ( 1.0 - 2.0 * FilterParameter ) * xyz_TempN &
& + FilterParameter * ( xyz_TempB + xyz_TempA )
xyz_QVapN = ( 1.0 - 2.0 * FilterParameter ) * xyz_QVapN &
& + FilterParameter * ( xyz_QVapB + xyz_QVapA )
xy_PsN = ( 1.0 - 2.0 * FilterParameter ) * xy_PsN &
& + FilterParameter * ( xy_PsB + xy_PsA )
! 計算時間計測一時停止
! Pause measurement of computation time
!
call TimesetClockStop( module_name )
end subroutine TimeFilter
!-------------------------------------------------------------------
subroutine TimeFiltInit
!
! timefilter_asselin1972 モジュールの初期化を行います.
! NAMELIST#timefilter_asselin1972_nml の読み込みはこの手続きで行われます.
!
! "timefilter_asselin1972" module is initialized.
! "NAMELIST#timefilter_asselin1972_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
! 宣言文 ; 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 /timefilter_asselin1972_nml/ &
& FilterParameter, IntStep
!
! デフォルト値については初期化手続 "timefilter_asselin1972#Hs94Init"
! のソースコードを参照のこと.
!
! Refer to source codes in the initialization procedure
! "timefilter_asselin1972#Hs94Init" for the default values.
!
! 実行文 ; Executable statement
!
if ( timefilter_asselin1972_inited ) return
call InitCheck
! デフォルト値の設定
! Default values settings
!
FilterParameter = 0.05_DP
IntStep = 1
CurStep = 0
! 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 = timefilter_asselin1972_nml, & ! (out)
& iostat = iostat_nml ) ! (out)
close( unit_nml )
call NmlutilMsg( iostat_nml, module_name ) ! (in)
if ( iostat_nml == 0 ) write( STDOUT, nml = timefilter_asselin1972_nml )
end if
! IntStep のチェック
! Check "IntStep"
!
if ( IntStep < 1 ) then
call MessageNotify( 'E', module_name, &
& 'IntStep=<%d> must be greater than 0', &
& i = (/ IntStep /) )
end if
! PrevStep の設定
! Configure "PrevStep"
!
PrevStep = - IntStep
! 印字 ; Print
!
call MessageNotify( 'M', module_name, '----- Initialization Messages -----' )
call MessageNotify( 'M', module_name, ' FilterParameter = %f', d = (/ FilterParameter /) )
call MessageNotify( 'M', module_name, ' IntStep = %d', i = (/ IntStep /) )
call MessageNotify( 'M', module_name, '-- version = %c', c1 = trim(version) )
timefilter_asselin1972_inited = .true.
end subroutine TimeFiltInit
!-------------------------------------------------------------------
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
! 時刻管理
! Time control
!
use timeset, only: timeset_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.' )
if ( .not. timeset_inited ) &
& call MessageNotify( 'E', module_name, '"timeset" module is not initialized.' )
end subroutine InitCheck
end module timefilter_asselin1972