!= Module TimeFilter
!
! Authors::   SUGIYAMA Ko-ichiro
! Version::   $Id: timefilter.f90,v 1.1 2011-04-26 04:08:11 sugiyama Exp $
! Tag Name::  $Name: arare5-20130130-2 $
! Copyright:: Copyright (C) GFD Dennou Club, 2006. All rights reserved.
! License::   See COPYRIGHT[link:../../COPYRIGHT]
!
!== Overview
!
!アッセリンの時間フィルタ. leap-frog の後に適用. 
! 
!== Error Handling
!
!== Bugs
!
!== Note
!
!== Future Plans
!
!

module TimeFilter

  !モジュール読み込み
  use dc_types, only : DP
  use gridset, only: imin,    & !x 方向の配列の下限
    &                imax,    & !x 方向の配列の上限
    &                jmin,    & !y 方向の配列の下限
    &                jmax,    & !y 方向の配列の上限
    &                kmin,    & !z 方向の配列の下限
    &                kmax       !z 方向の配列の上限

  !暗黙の型宣言禁止
  implicit none

  !属性の設定
  private

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

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

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

    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(DP), intent(in)     :: VarA(imin:imax,jmin:jmax,kmin:kmax)
    real(DP), intent(inout)  :: VarN(imin:imax,jmin:jmax,kmin:kmax)  
    real(DP), intent(in)     :: VarB(imin:imax,jmin:jmax,kmin:kmax)
    real(DP)                 :: Var(imin:imax,jmin:jmax,kmin:kmax)


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