!---------------------------------------------------------------------
!     Copyright (C) GFD Dennou Club, 2004, 2005. All rights reserved.
!---------------------------------------------------------------------
!= Subroutine TimeFilter
!
!   * Developer: SUGIYAMA Ko-ichiro (sugiyama@gfd-dennou.org)
!   * Version: $Id:  $
!   * Tag Name: $Name:  $
!   * Change History: 
!
!== Overview
!
!アッセリンの時間フィルタ. leap-frog の後に適用. 
! 
!== Error Handling
!
!== Bugs
!
!== Note
!
!== Future Plans
!
!

module TimeFilter

  !モジュール読み込み
  use GridSet,  only: DimXMin,     & !x 方向の配列の下限
    &                 DimXMax,     & !x 方向の配列の上限
    &                 DimZMin,     & !z 方向の配列の下限
    &                 DimZMax        !z 方向の配列の上限

  !暗黙の型宣言禁止
  implicit none

  !属性の設定
  private

  !関数を public 属性に設定
  public AsselinFilter

  !変数定義
  real(8) :: tfil = 1.0d-1  !アッセリンの時間フィルタの係数

  !値を save する
  save tfil
  
contains
  
  function AsselinFilter(VarA, VarN, VarB)
    !
    ! 時間フィルター; Asselin のタイムフィルターを利用
    !

    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in)     :: VarA(DimXMin:DimXMax, DimZMin:DimZMax)
    real(8), intent(in)     :: VarN(DimXMin:DimXMax, DimZMin:DimZMax)
    real(8), intent(inout)  :: VarB(DimXMin:DimXMax, DimZMin:DimZMax)  
    real(8)                 :: AsselinFilter(DimXMin:DimXMax, DimZMin:DimZMax)

    !時間フィルタ
    AsselinFilter = VarN + tfil * ( VarB  - 2.0d0 * VarN + VarA ) 
    
  end function AsselinFilter
  
end module TimeFilter
