!----------------------------------------------------------------------
!     Copyright (c) 2002 Shin-ichi Takehiro. All rights reserved.
!----------------------------------------------------------------------
!表題  SNPACK/ISPACK-F90
!
!履歴  2002/02/02  竹広真一  多層用
!
!         ・変換する格子点データ, スペクトルデータの配列の大きさは決めうち
!
module sppack

  use snpack
  use sppack_2D
  use sppack_3D

  interface ep_lapla_ep
     module procedure ep_lapla_ep_2D, ep_lapla_ep_3D
  end interface

  interface ep_laplainv_ep
     module procedure ep_laplainv_ep_2D, ep_laplainv_ep_3D
  end interface

  interface ep_dlon_ep
     module procedure ep_dlon_ep_2D, ep_dlon_ep_3D
  end interface

  interface gg_gradlon_ep
     module procedure gg_gradlon_ep_2D, gg_gradlon_ep_3D
  end interface

  interface gg_gradlat_ep
     module procedure gg_gradlat_ep_2D, gg_gradlat_ep_3D
  end interface

  interface ep_divlon_gg
     module procedure ep_divlon_gg_2D, ep_divlon_gg_3D
  end interface

  interface ep_divlat_gg
     module procedure ep_divlat_gg_2D, ep_divlat_gg_3D
  end interface

  interface ep_div_gg_gg
     module procedure ep_div_gg_gg_2D, ep_div_gg_gg_3D
  end interface

  interface ep_jacobian_ep_ep
     module procedure ep_jacobian_ep_ep_2D, ep_jacobian_ep_ep_3D
  end interface

  private

  public spinitial                            ! 初期化

  public longitude, latitude                  ! 格子座標
  public lon_weight, lat_weight               ! 格子座標重み
  public gg_lon, gg_lat                       ! 格子座標(im,jm)
  public gg_ep, ep_gg, l_nm, nm_l             ! 変換関数
  
  public ep_lapla_ep, ep_laplainv_ep          ! ラプラシアンと逆演算
  public ep_dlon_ep                           ! 経度微分
  public gg_gradlon_ep, gg_gradlat_ep         ! 勾配型微分
  public ep_divlon_gg, ep_divlat_gg           ! 発散型微分
  public ep_div_gg_gg                         ! 発散型微分
  public ep_jacobian_ep_ep                    ! ヤコビアン

contains
  subroutine spinitial(n_in,i_in,j_in,k_in)

    integer,intent(in) :: i_in, j_in          ! 格子点の設定(東西, 南北)
    integer,intent(in) :: n_in                ! 切断波数の設定
    integer,intent(in) :: k_in                ! 最大データ数(層数)を記憶

    call spinitial_2D(n_in,i_in,j_in)
    call spinitial_3D(k_in)

  end subroutine spinitial

end module sppack
