!= Subroutine TimeFilter
!
! Authors::   SUGIYAMA Ko-ichiro
! Version::   $Id: timefilter.f90,v 1.3 2006/09/21 02:35:16 odakker Exp $
! Tag Name::  $Name:  $
! 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 GridSet,  only: DimXMin,     & !x 方向の配列の下限
    &                 DimXMax,     & !x 方向の配列の上限
    &                 DimZMin,     & !z 方向の配列の下限
    &                 DimZMax,     & !z 方向の配列の上限
    &                 SpcNum         !化学種の数

  !暗黙の型宣言禁止
  implicit none

  !属性の設定
  private

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

  !変数定義
  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
  

  function xza_AsselinFilter_xza_xza_xza( xza_VarA, xza_VarN, xza_VarB )
    !
    ! 時間フィルター; Asselin のタイムフィルターを利用
    !

    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in)     :: xza_VarA(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum)
    real(8), intent(in)     :: xza_VarN(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum)
    real(8), intent(inout)  :: xza_VarB(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum)
    real(8)                 :: xza_AsselinFilter_xza_xza_xza(DimXMin:DimXMax, DimZMin:DimZMax, SpcNum)

    !時間フィルタ
    xza_AsselinFilter_xza_xza_xza &
      & = xza_VarN + tfil * ( xza_VarB  - 2.0d0 * xza_VarN + xza_VarA ) 
    
  end function xza_AsselinFilter_xza_xza_xza
  
end module TimeFilter
