!--
!----------------------------------------------------------------------
!     Copyright (c) 2019 SPMODEL Development Group.
!----------------------------------------------------------------------
!表題  wa_interpolate_mpi_module_mint
!
!  spml/wa_interpolate_mpi_module モジュールは球面上での 2 次元流体運動を
!  球面調和函数を用いたスペクトル法によって数値計算するための
!  モジュール wa_mpi_module の下部モジュールであり, スペクトル法による
!  補間計算のための Fortran90 関数を提供する.
!
!  補間計算の方法については doc/wa_module.tex を参照のこと.
!  内部で ISPACK3 の SYPACK の Fortran77 サブルーチンを呼んでいる.
!  スペクトルデータおよび格子点データの格納方法や変換の詳しい計算法に
!  ついては ISPACK3/SYPACK のマニュアルを参照されたい.
!
!履歴  2019/05/01  竹広真一
!
!++
module ua_mpi_module_interpolate_mint
  !
  !=  ua_mpi_module_interpolate
  !
  ! Authors:: Shin-ichi Takehiro, Youhei SASAKI
  ! Version:: $Id: ua_mpi_module_interpolate.f90 590 2013-08-19 08:48:21Z uwabami $
  ! Copyright&License:: See COPYRIGHT[link:../COPYRIGHT]
  !
  !== 概要
  !
  !  spml/wa_interpolate_mpi_module モジュールは球面上での 2 次元流体運動を
  !  球面調和函数を用いたスペクトル法によって数値計算するための
  !  モジュール wa_mpi_module の下部モジュールであり, スペクトル法による
  !  補間計算のための Fortran90 関数を提供する.
  !
  !  補間計算の方法については doc/wa_module.tex を参照のこと.
  !  内部で ISPACK3 の SYPACK の Fortran77 サブルーチンを呼んでいる.
  !  スペクトルデータおよび格子点データの格納方法や変換の詳しい計算法に
  !  ついては ISPACK3/SYPACK のマニュアルを参照されたい.
  !
  use dc_message, only : MessageNotify
  use w_mpi_module_interpolate_mint
  use ua_mpi_module_base_mint, only : nc, nmc, km, kc, wb_ua
  implicit none
  private

  public b_Interpolate_ua                        ! 補間関数
  public b_Interpolate_wb                        ! 補間関数

  interface b_Interpolate_ua
     !
     ! 緯度 alon, 経度 alat における関数値を
     ! その球面調和変換係数 ua_data から補間計算する
     !
     ! 入力する緯度経度座標は,
     !       １点, 経度1点緯度複数点, 経度複数点緯度1点, 経度緯度複数点
     ! の 4 種類
     !
     module procedure b_Interpolate_array00_ua
  end interface

  interface b_Interpolate_wb
     !
     ! 緯度 alon, 経度 alat における関数値を
     ! その球面調和変換係数 wb_data から補間計算する
     !
     ! 入力する緯度経度座標は,
     !       １点, 経度1点緯度複数点, 経度複数点緯度1点, 経度緯度複数点
     ! の 4 種類
     !
     module procedure b_Interpolate_array00_wb
  end interface

contains

  !--------------- 補間計算 (ua) -----------------
  function b_Interpolate_array00_ua(ua_data,alon,alat)
    !
    ! 緯度 alat, 経度 alon における関数値を
    ! その球面調和変換係数 ua_data から補間計算する
    !
    real(8), intent(IN) :: ua_data(nmc,km)        ! スペクトルデータ
    real(8), intent(IN) :: alon                   ! 補間する位置(経度)
    real(8), intent(IN) :: alat                   ! 補間する位置(緯度)
    real(8) :: b_Interpolate_array00_ua(kc)       ! 補間した値

    real(8) :: wb_data(nc,kc)
    integer :: k

    wb_data = wb_ua(ua_data)

    do k=1,kc
       b_Interpolate_array00_ua(k) = Interpolate_w(wb_data(:,k),alon,alat)
    end do

  end function b_Interpolate_array00_ua
  
  !--------------- 補間計算 (wb) -----------------
  function b_Interpolate_array00_wb(wb_data,alon,alat)
    !
    ! 緯度 alat, 経度 alon における関数値を
    ! その球面調和変換係数 wb_data から補間計算する
    !
    real(8), intent(IN) :: wb_data(nc,kc)         ! スペクトルデータ
    real(8), intent(IN) :: alon                   ! 補間する位置(経度)
    real(8), intent(IN) :: alat                   ! 補間する位置(緯度)
    real(8) :: b_Interpolate_array00_wb(kc)       ! 補間した値

    integer :: k

    do k=1,kc
       b_Interpolate_array00_wb(k) = Interpolate_w(wb_data(:,k),alon,alat)
    end do

  end function b_Interpolate_array00_wb
    
end module ua_mpi_module_interpolate_mint
