!--
!----------------------------------------------------------------------
! Copyright (c) 2008--2013 SPMODEL Development Group. All rights reserved.
!----------------------------------------------------------------------
!表題  l_module
!
!   spml/l_module モジュールは球面上での経度方向に一様な帯状的 1 次元
!   流体運動をルジャンドル多項式を用いたスペクトル法によって数値計算する
!   ための Fortran90 関数を提供する. 
!
!   内部で ISPACK の LTPACK の Fortran77 サブルーチンを呼んでいる.
!   スペクトルデータおよび格子点データの格納方法や変換の詳しい計算法に
!   ついては ISPACK/LTPACK のマニュアルを参照されたい.
!
!履歴  2008/12/24  竹広真一  1 層用
!      2009/01/09  竹広真一  l_Initial メッセージに日付を追加
!      2009/01/29  佐々木洋平 コメントを RDoc 用に微修正
!      2009/10/04  竹広真一  作業用配列 p をローカル変数に変更
!      2013/02/24  竹広真一  l_Finalize 導入
!      2013/02/24  竹広真一  ISPACK で LTPACK 削除のため, 
!                            l_module_sjpack にフォワード
!
!++
module l_module
  !
  != l_module
  !
  ! Authors:: Shin-ichi Takehiro, Youhei SASAKI
  ! Version:: $Id$
  ! Copyright&License:: See COPYRIGHT[link:../COPYRIGHT]
  !
  !== 概要
  !
  ! spml/l_module モジュールは球面上での経度方向に一様な帯状的 1 次元
  ! 流体運動をルジャンドル多項式を用いたスペクトル法によって数値計算する
  ! ための Fortran90 関数を提供する. 
  !
  ! 内部で ISPACK の SJPACK の Fortran77 サブルーチンを呼んでいる.
  ! スペクトルデータおよび格子点データの格納方法や変換の詳しい計算法に
  ! ついては ISPACK/SJPACK のマニュアルを参照されたい.
  !
  !== 関数・変数の名前と型について
  !
  !=== 命名法
  !
  ! * 関数名の先頭 (l_, y_) は, 返す値の形を示している.
  !   l_ :: スペクトル(ルジャンドル多項式成分)データ
  !   y_ :: 1 次元緯度格子点データ
  !
  ! * 関数名の間の文字列(GradLat, DivLat, Lapla, LaplaInv)は, 
  !   その関数の作用を表している.
  !
  ! * 関数名の最後 (_l, _y) は, 入力変数の形スペクトルデータ
  !   および格子点データであることを示している.
  !   _l :: スペクト(ルジャンドル多項式成分)ルデータ
  !   _y :: 緯度方向 1 次元格子点データ
  !
  !=== 各データの種類の説明
  !
  ! * p : スペクトルデータ.
  !   * 変数の種類と次元は real(8), dimension(0:nm). 
  !   * nm はルジャンドル多項式の最大次数であり, サブルーチン l_Initial にて
  !     あらかじめ設定しておく. 
  !
  ! * y : 緯度方向 1 次元格子点データ.
  !   * 変数の種類と次元は real(8), dimension(1:jm).
  !
  ! * l_ で始まる関数が返す値はスペクトルデータに同じ.
  !
  ! * y_ で始まる関数が返す値は 1 次元格子点データに同じ.
  !
  ! * スペクトルデータに対する微分等の作用とは, 対応する格子点データに
  !   微分などを作用させたデータをスペクトル変換したものことである.
  !
  !
  !== 変数・手続き群の要約
  !
  !==== 初期化 
  !
  ! l_Initial :: スペクトル変換の格子点数, 波数, 領域の大きさの設定
  ! 
  !==== 終了処理 
  !
  ! l_Finalize :: モジュールの終了処理(割り付け配列の解放)をおこなう. 
  ! 
  !==== 座標変数
  !
  ! y_Lat        ::  格子点座標(緯度, 経度座標)を格納した 1 次元配列
  ! y_Lat_Weight ::  重み座標を格納した 1 次元配列
  !
  !==== 基本変換
  !
  ! y_l :: スペクトルデータから格子データへの変換
  ! l_y :: 格子データからスペクトルデータへの変換
  !
  !==== 微分
  !
  ! l_Lapla_l       :: スペクトルデータにラプラシアンを作用させる
  ! l_LaplaInv_l    :: スペクトルデータにラプラシアンの逆変換を作用させる
  ! y_GradLat_l     :: スペクトルデータに勾配型緯度微分∂/∂φを作用させる
  ! l_DivLat_y      :: 格子データに発散型緯度微分
  !                    1 /cosφ・∂(g cosφ)/∂φを作用させる
  !
  !==== 微分(λ,μ=sinφ 座標)
  !
  ! y_GradMu_l     :: スペクトルデータに
  !                   勾配型緯度微分 (1-μ^2)∂/∂μを作用させる
  ! l_DivMu_y      :: 格子データに発散型緯度微分∂/∂μを作用させる
  !
  !==== 補間
  !
  ! Interpolate_l  :: スペクトルデータから任意の点での値を求める. 
  !
  !==== 積分・平均
  !
  ! IntLat_y, AvrLat_y :: 1 次元(Y)格子点データの緯度方向積分および平均
  !
  !==== スペクトル解析
  !
  ! 作成中
  !
  use dc_message, only : MessageNotify
  use l_module_sjpack

  implicit none

  private

  public l_Initial                            ! 初期化
  public l_Finalize                           ! 終了処理

  public y_Lat                                ! 格子座標
  public y_Lat_Weight                         ! 格子座標重み

  public y_l, l_y                             ! 変換関数
  public l_Lapla_l, l_LaplaInv_l              ! ラプラシアンと逆演算
  public y_GradLat_l                          ! 勾配型微分
  public l_DivLat_y                           ! 発散型微分

  public y_GradMu_l                           ! 勾配型微分
  public l_DivMu_y                            ! 発散型微分

  public IntLat_y, AvrLat_y                   ! 緯度平均

  public Interpolate_l                        ! 補間計算

end module l_module
