!= Module Average
!
! Authors::   SUGIYAMA Ko-ichiro
! Version::   $Id: average.f90,v 1.5 2007/04/11 11:59:58 sugiyama Exp $ 
! Tag Name::  $Name: arare4-20071012 $
! Copyright:: Copyright (C) GFD Dennou Club, 2006. All rights reserved.
! License::   See COPYRIGHT[link:../../COPYRIGHT]
!
!== Overview 
!
!物理量の平均操作を行うための一連の関数をまとめたパッケージ型モジュール. 
!水平 Arakawa-C, 鉛直 Lorentz グリッドとする. 
!
!== Error Handling
!
!== Known Bugs
!
!== Note
!
!== Future Plans
!

module average
  !
  !2 次精度の平均操作を行うための関数を束ねたパッケージ型モジュール. 
  !水平 Arakawa-C, 鉛直 Lorentz グリッドとする. 
  !

  !モジュール読み込み
  use gridset,    only: DimXMin,  &! 配列の X 方向の下限
    &                   DimXMax,  &! 配列の X 方向の上限
    &                   DimZMin,  &! 配列の Z 方向の下限
    &                   DimZMax    ! 配列の Z 方向の上限
  
  !暗黙の型宣言禁止
  implicit none

  !属性の指定
  private

  !関数を public にする
  public xz_avr_pz
  public xz_avr_xr
  public xz_avr_pr
  public pz_avr_xz
  public pz_avr_xr
  public pz_avr_pr
  public xr_avr_xz
  public xr_avr_pz
  public xr_avr_pr
  public pr_avr_xz
  public pr_avr_xr
  public pr_avr_pz

contains

!!!---------------------------------------------------------------------  
  function xz_avr_pz( pz_var ) 
    !
    ! z 方向に半格子ずれた点の, x, z 方向に半格子ずれた点での平均値
    !
    
    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in)  :: pz_var(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均演算の対象となる変数
    real(8)              :: xz_avr_pz(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均値
    
    xz_avr_pz = pz_var    
    xz_avr_pz(DimXMin+1 : DimXMax, DimZMin : DimZMax) =          &
      &  (                                                       &
      &     pz_var(DimXMin+1 : DimXMax,   DimZMin : DimZMax)     &
      &   + pz_var(DimXMin   : DimXMax-1, DimZMin : DimZMax)     &
      &   ) * 5.0d-1

  end function xz_avr_pz
  

!!!---------------------------------------------------------------------    
  function xz_avr_xr( xr_var )
    !
    ! x 方向に半格子ずれた点の, x, z 方向に半格子ずれた点での平均値
    !
    
    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in)  :: xr_var(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均演算の対象となる変数
    real(8)              :: xz_avr_xr(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均値
    
    xz_avr_xr = xr_var 
    xz_avr_xr(DimXMin : DimXMax, DimZMin+1 : DimZMax) =          &
      &  (                                                       &
      &     xr_var(DimXMin : DimXMax, DimZMin+1 : DimZMax   )    &
      &   + xr_var(DimXMin : DimXMax, DimZMin   : DimZMax-1 )    &
      &   ) * 5.0d-1

  end function xz_avr_xr
  
  
!!!---------------------------------------------------------------------  
  function xz_avr_pr( pr_var )
    !
    ! 格子上の点の, x, z 方向に半格子ずれた点での平均値
    !
    
    !暗黙の型宣言禁止
    implicit none

    !変数定義
    real(8), intent(in)  :: pr_var(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均演算の対象となる変数
    real(8)              :: xz_avr_pr(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均値

    xz_avr_pr = pr_var
    xz_avr_pr(DimXMin+1 : DimXMax, DimZMin+1 : DimZMax) =           &
      &  (                                                          & 
      &     pr_var(DimXMin+1 : DimXMax,   DimZMin+1 : DimZMax   )   &
      &   + pr_var(DimXMin+1 : DimXMax,   DimZMin   : DimZMax-1 )   &
      &   + pr_var(DimXMin   : DimXMax-1, DimZMin+1 : DimZMax   )   &
      &   + pr_var(DimXMin   : DimXMax-1, DimZMin   : DimZMax-1 )   &
      &   ) * 2.5d-1

  end function xz_avr_pr
  

!!!---------------------------------------------------------------------  
  function pz_avr_xz( xz_var ) 
    !
    ! x, z 方向に半格子ずれた点の, z 方向に半格子ずれた点での平均値
    !
    
    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in)  :: xz_var(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均演算の対象となる変数
    real(8)              :: pz_avr_xz(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均値
    
    pz_avr_xz = xz_var
    pz_avr_xz(DimXMin : DimXMax-1, DimZMin : DimZMax) =         &
      &  (                                                      &
      &     xz_var(DimXMin+1 : DimXMax   , DimZMin : DimZMax)   &
      &   + xz_var(DimXMin   : DimXMax-1 , DimZMin : DimZMax)   &
      &   ) * 5.0d-1

  end function pz_avr_xz


!!!---------------------------------------------------------------------  
  function pz_avr_xr( xr_var ) 
    !
    ! x 方向に半格子ずれた点の, z 方向に半格子ずれた点での平均値
    !
    
    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in)  :: xr_var(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均演算の対象となる変数
    real(8)              :: pz_avr_xr(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均値    

    pz_avr_xr = xr_var
    pz_avr_xr(DimXMin : DimXMax-1, DimZMin+1 : DimZMax) =         &
      &  (                                                        &
      &     xr_var(DimXMin+1 : DimXMax,   DimZMin+1 : DimZMax  )  &
      &   + xr_var(DimXMin+1 : DimXMax,   DimZMin   : DimZMax-1)  &
      &   + xr_var(DimXMin   : DimXMax-1, DimZMin+1 : DimZMax  )  &
      &   + xr_var(DimXMin   : DimXMax-1, DimZMin   : DimZMax-1)  &
      &   ) * 2.5d-1

  end function pz_avr_xr
  

!!!---------------------------------------------------------------------  
  function pz_avr_pr( pr_var ) 
    !
    ! 格子上の点の, z 方向に半格子ずれた点での平均値
    !
    
    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in)  :: pr_var(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均演算の対象となる変数
    real(8)              :: pz_avr_pr(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均値    

    pz_avr_pr = pr_var
    pz_avr_pr(DimXMin : DimXMax, DimZMin+1 : DimZMax) =       &
      &  (                                                    &
      &     pr_var(DimXMin : DimXMax, DimZMin+1 : DimZMax  )  &
      &   + pr_var(DimXMin : DimXMax, DimZMin   : DimZMax-1)  &
      &   ) * 5.0d-1

  end function pz_avr_pr

  
!!!---------------------------------------------------------------------    
  function xr_avr_xz( xz_var ) 
    !
    ! x, z 方向に半格子ずれた点の, x 方向に半格子ずれた点での平均値
    !

    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in)  :: xz_var(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均演算の対象となる変数
    real(8)              :: xr_avr_xz(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均値    

    xr_avr_xz = xz_var
    xr_avr_xz(DimXMin : DimXMax, DimZMin : DimZMax-1) =          &
      &  (                                                       &
      &     xz_var( DimXMin : DimXMax, DimZMin+1 :DimZMax   )    &
      &   + xz_var( DimXMin : DimXMax, DimZMin   :DimZMax-1 )    &
      &   ) * 5.0d-1

  end function xr_avr_xz

  
!!!---------------------------------------------------------------------  
  function xr_avr_pz( pz_var ) 
    !
    ! z 方向に半格子ずれた点の, x 方向に半格子ずれた点での平均値
    !
    
    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in)  :: pz_var(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均演算の対象となる変数
    real(8)              :: xr_avr_pz(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均値
    
    xr_avr_pz = pz_var
    xr_avr_pz(DimXMin+1 : DimXMax, DimZMin : DimZMax-1 ) =       &
      &  (                                                       &
      &     pz_var(DimXMin+1 :DimXMax,   DimZMin+1 : DimZMax  )  &
      &   + pz_var(DimXMin+1 :DimXMax,   DimZMin   : DimZMax-1)  &
      &   + pz_var(DimXMin   :DimXMax-1, DimZMin+1 : DimZMax  )  &
      &   + pz_var(DimXMin   :DimXMax-1, DimZMin   : DimZMax-1)  &
      &  ) * 2.5d-1

  end function xr_avr_pz


!!!---------------------------------------------------------------------  
  function xr_avr_pr( pr_var ) 
    !
    ! 格子上の点の, x 方向に半格子ずれた点での平均値
    !
    
    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in)  :: pr_var(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均演算の対象となる変数
    real(8)              :: xr_avr_pr(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均値    

    xr_avr_pr = pr_var
    xr_avr_pr(DimXMin+1 : DimXMax, DimZMin : DimZMax) =       &
      &  (                                                    &
      &     pr_var(DimXMin+1 : DimXMax,   DimZMin : DimZMax)  &
      &   + pr_var(DimXMin   : DimXMax-1, DimZMin : DimZMax)  &
      &  ) * 5.0d-1

  end function xr_avr_pr


!!!---------------------------------------------------------------------  
  function pr_avr_xz( xz_var ) 
    !
    ! x, z 方向に半格子ずれた点の, 格子上の点での平均値
    !
    
    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in)  :: xz_var(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均演算の対象となる変数
    real(8)              :: pr_avr_xz(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均値
    
    pr_avr_xz = xz_var
    pr_avr_xz(DimXMin : DimXMax-1, DimZMin : DimZMax-1) =          &
      &  (                                                         &
      &     xz_var(DimXMin+1 : DimXMax,   DimZMin+1 : DimZMax   )  &
      &   + xz_var(DimXMin+1 : DimXMax,   DimZMin   : DimZMax-1 )  &
      &   + xz_var(DimXMin   : DimXMax-1, DimZMin+1 : DimZMax   )  &
      &   + xz_var(DimXMin   : DimXMax-1, DimZMin   : DimZMax-1 )  &
      &  ) * 2.5d-1

  end function pr_avr_xz
  

!!!---------------------------------------------------------------------  
  function pr_avr_pz( pz_var ) 
    !
    ! z 方向に半格子ずれた点の, 格子上の点での平均値
    !
    
    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in)  :: pz_var(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均演算の対象となる変数
    real(8)              :: pr_avr_pz(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均値
    
    pr_avr_pz = pz_var
    pr_avr_pz(DimXMin : DimXMax, DimZMin : DimZMax-1) =       &
      &  (                                                    &
      &     pz_var(DimXMin : DimXMax, DimZMin+1 : DimZMax)    &
      &   + pz_var(DimXMin : DimXMax, DimZMin   : DimZMax-1)  &
      &   ) * 5.0d-1

  end function pr_avr_pz


!!!---------------------------------------------------------------------  
  function pr_avr_xr( xr_var ) 
    !
    ! x 方向に半格子ずれた点の, 格子上の点での平均値
    !
    
    !暗黙の型宣言禁止
    implicit none
    
    !変数定義
    real(8), intent(in)  :: xr_var(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均演算の対象となる変数
    real(8)              :: pr_avr_xr(DimXMin:DimXMax, DimZMin:DimZMax)
                                     !平均値
    
    pr_avr_xr = xr_var
    pr_avr_xr(DimXMin : DimXMax-1 , DimZMin : DimZMax) =      &
      &  (                                                    &
      &     xr_var(DimXMin+1 : DimXMax,   DimZMin : DimZMax)  &
      &   + xr_var(DimXMin   : DimXMax-1, DimZMin : DimZMax)  &
      &   ) * 5.0d-1

  end function pr_avr_xr


end module average
