Class la_module
In: libsrc/la_module/la_module.f90

la_module

Authors:Shin-ichi Takehiro, Youhei SASAKI
Version:$Id: la_module.f90 590 2013-08-19 08:48:21Z uwabami $
Copyright&License:See COPYRIGHT

概要

spml/l_module モジュールは球面上での経度方向に一様な帯状的子午面 2 次元 流体運動をルジャンドル多項式を用いたスペクトル法によって数値計算する ための Fortran90 関数を提供する.

内部で ISPACK の LTPACK の Fortran77 サブルーチンを呼んでいる. スペクトルデータおよび格子点データの格納方法や変換の詳しい計算法に ついては ISPACK/LTPACK のマニュアルを参照されたい.

関数・変数の名前と型について

命名法

  • 関数名の先頭 (la_, ya_, l_, y_) は, 返す値の形を示している.
    la_ :スペクトル(ルジャンドル多項式成分)データ(鉛直多層)
    ya_ :2 次元緯度鉛直格子点データ
    l_ :スペクトル(ルジャンドル多項式成分)データ
    y_ :1 次元緯度格子点データ
  • 関数名の間の文字列(GradLat, DivLat, Lapla, LaplaInv)は, その関数の作用を表している.
  • 関数名の最後 (_la, _ya, _l, _y) は, 入力変数の形スペクトルデータ および格子点データであることを示している.
    _la :スペクト(ルジャンドル多項式成分)ルデータ(鉛直多層)
    _ya :緯度鉛直 2 次元格子点データ
    _l :スペクト(ルジャンドル多項式成分)ルデータ
    _y :緯度方向 1 次元格子点データ

各データの種類の説明

  • la : スペクトルデータ.
    • 変数の種類と次元は real(8), dimension(0:nm,:).
    • nm はルジャンドル多項式の最大次数であり, サブルーチン la_Initial にてあらかじめ設定しておく.
  • ya : 緯度方向 1 次元格子点データ.
    • 変数の種類と次元は real(8), dimension(1:jm,:).
  • l : スペクトルデータ.
    • 変数の種類と次元は real(8), dimension(0:nm).
    • nm はルジャンドル多項式の最大次数であり, サブルーチン la_Initial にて あらかじめ設定しておく.
  • y : 緯度方向 1 次元格子点データ.
    • 変数の種類と次元は real(8), dimension(1:jm).
  • la_, l_ で始まる関数が返す値はスペクトルデータに同じ.
  • ya_, y_ で始まる関数が返す値は 2, 1 次元格子点データに同じ.
  • スペクトルデータに対する微分等の作用とは, 対応する格子点データに 微分などを作用させたデータをスペクトル変換したものことである.

変数・手続き群の要約

初期化

la_Initial :スペクトル変換の格子点数, 波数, 領域の大きさの設定

終了処理

la_Finalize :モジュールの終了処理(割り付け配列の解放)をおこなう.

座標変数

y_Lat :格子点座標(緯度, 経度座標)を格納した 1 次元配列
y_Lat_Weight :重み座標を格納した 1 次元配列

基本変換

ya_la :スペクトルデータから格子データへの変換
la_ya :格子データからスペクトルデータへの変換
y_l :スペクトルデータから格子データへの変換
l_y :格子データからスペクトルデータへの変換

微分

la_Lapla_la :スペクトルデータにラプラシアンを作用させる
la_LaplaInv_la :スペクトルデータにラプラシアンの逆変換を作用させる
ya_GradLat_la :スペクトルデータに勾配型緯度微分∂/∂φを作用させる
la_DivLat_ya :格子データに 発散型緯度微分 1/cosφ・∂(g cosφ)/∂φを作用させる
l_Lapla_l :スペクトルデータにラプラシアンを作用させる
l_LaplaInv_l :スペクトルデータにラプラシアンの逆変換を作用させる
y_GradLat_l :スペクトルデータに勾配型緯度微分∂/∂φを作用させる
l_DivLat_y :格子データに 発散型緯度微分 1/cosφ・∂(g cosφ)/∂φを作用させる

微分(λ,μ=sinφ 座標)

ya_GradMu_la :スペクトルデータに 勾配型緯度微分 (1-μ^2)∂/∂μを作用させる
la_DivMu_ya :格子データに発散型緯度微分∂/∂μを作用させる
y_GradMu_l :スペクトルデータに 勾配型緯度微分 (1-μ^2)∂/∂μを作用させる
l_DivMu_y :格子データに発散型緯度微分∂/∂μを作用させる

補間

Interpolate_la :スペクトルデータから任意の点での値を求める.
Interpolate_l :スペクトルデータから任意の点での値を求める.

積分・平均

a_IntLat_ya, a_AvrLat_ya :2 次元格子点データの緯度方向積分および平均
IntLat_y, AvrLat_y :1 次元格子点データの緯度方向積分および平均

スペクトル解析

作成中

Methods

Included Modules

dc_message l_module

Public Instance methods

AvrLat_y( y_data ) result(AvrLat_y)
Function :
AvrLat_y :real(8)
: (out) 平均値
y_data(1:jm) :real(8), intent(in)
: (in) 1 次元緯度格子点データ

1 次元(Y)格子点データの緯度(Y)方向平均.

実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算し, y_Y_Weight の総和で割ることで平均している.

Original external subprogram is l_module#AvrLat_y

IntLat_y( y_data ) result(IntLat_y)
Function :
IntLat_y :real(8)
: (out) 積分値
y_data(1:jm) :real(8), intent(in)
: (in) 1 次元緯度(Y)格子点データ

1 次元緯度(Y)格子点データの Y 方向積分.

実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算している.

Original external subprogram is l_module#IntLat_y

Interpolate_l( l_data, alat ) result(Interpolate_l)
Function :
Interpolate_l :real(8)
: 補間した値
l_data(0:nn) :real(8), intent(IN)
: スペクトルデータ
alat :real(8), intent(IN)
: 補間する位置(緯度)

緯度 alat における関数値を そのルジャンドル変換係数 l_data から補間計算する

Original external subprogram is l_module#Interpolate_l

Function :
a_AvrLat_ya(size(ya_data,2)) :real(8)
: (out) 平均値
ya_data(:,:) :real(8), intent(in)
: (in) 緯度鉛直格子点データ(1:jm,:)

2 次元緯度鉛直格子点データの緯度(Y)方向平均.

実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算し, y_Y_Weight の総和で割ることで平均している.

[Source]

    function a_AvrLat_ya(ya_data)
      !
      ! 2 次元緯度鉛直格子点データの緯度(Y)方向平均.
      !
      ! 実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算し, 
      ! y_Y_Weight の総和で割ることで平均している. 
      !
      real(8), intent(in) :: ya_data(:,:)
      !(in)  緯度鉛直格子点データ(1:jm,:)

      real(8)             :: a_AvrLat_ya(size(ya_data,2))
      !(out) 平均値

      a_AvrLat_ya = a_IntLat_ya(ya_data)/sum(y_Lat_weight)

    end function a_AvrLat_ya
Function :
a_IntLat_ya(size(ya_data,2)) :real(8)
: (out) 積分値
ya_data(:,:) :real(8), intent(in)
: (in) 緯度鉛直格子点データ(1:jm,:)

2 次元緯度鉛直格子点データの緯度方向積分.

実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算している.

[Source]

    function a_IntLat_ya(ya_data)
      !
      ! 2 次元緯度鉛直格子点データの緯度方向積分.
      !
      ! 実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算している. 
      !
      real(8), intent(in) :: ya_data(:,:)
      !(in)  緯度鉛直格子点データ(1:jm,:)

      real(8)             :: a_IntLat_ya(size(ya_data,2))
      !(out) 積分値
      
      integer :: k

      do k=1,size(ya_data,2)
         a_IntLat_ya(k) = sum(ya_data(:,k) * y_Lat_weight)
      end do

    end function a_IntLat_ya
Function :
a_Interpolate_la(size(la_data,2)) :real(8)
: 補間した値
la_data(:,:) :real(8), intent(IN)
: スペクトルデータ(0:nm,:)
alat :real(8), intent(IN)
: 補間する位置(緯度)

緯度 alat における関数値を そのルジャンドル変換係数 la_data から補間計算する

[Source]

    function a_Interpolate_la(la_data,alat)
      !
      ! 緯度 alat における関数値を
      ! そのルジャンドル変換係数 la_data から補間計算する
      !
      real(8), intent(IN) :: la_data(:,:)
      ! スペクトルデータ(0:nm,:)

      real(8), intent(IN) :: alat
      ! 補間する位置(緯度)

      real(8)             :: a_Interpolate_la(size(la_data,2))
      ! 補間した値
      
      integer               :: k

      do k=1,size(la_data,2)
         a_Interpolate_la(k) = Interpolate_l(la_data(:,k),alat)
      end do

    end function a_Interpolate_la
l_DivLat_y( y_data ) result(l_DivLat_y)
Function :
l_DivLat_y(0:nn) :real(8)
: (out) 格子点データを発散型緯度微分したスペクトルデータ
y_data(1:jm) :real(8), intent(in)
: (in) 入力格子点データ

格子点データに発散型緯度微分 1/cosφ・∂(f cosφ)/∂φ を作用させて スペクトルデータに変換して返す.

Original external subprogram is l_module#l_DivLat_y

l_DivMu_y( y_data ) result(l_DivMu_y)
Function :
l_DivMu_y(0:nn) :real(8)
: (out) 格子点データを発散型緯度微分したスペクトルデータ
y_data(1:jm) :real(8), intent(in)
: (in) 入力格子点データ

格子点データに発散型緯度微分 ∂/∂μ (μ=sinφ)を作用させて スペクトルデータに変換して返す(1 層用).

Original external subprogram is l_module#l_DivMu_y

l_LaplaInv_l( l_data ) result(l_LaplaInv_l)
Function :
l_LaplaInv_l(0:nn) :real(8)
: (out) スペクトルデータの逆ラプラシアン
l_data(0:nn) :real(8), intent(in)
: (in) 入力スペクトルデータ

入力スペクトルデータに逆ラプラシアン

   ▽^{-2}
     =[1/cosφ・∂/∂φ(cosφ∂/∂φ)]^{-1}

を作用する.

スペクトルデータの逆ラプラシアンとは, 対応する格子点データに 逆ラプラシアンを作用させたデータのスペクトル変換のことである.

Original external subprogram is l_module#l_LaplaInv_l

l_Lapla_l( l_data ) result(l_Lapla_l)
Function :
l_Lapla_l(0:nn) :real(8)
: (out) 入力スペクトルデータのラプラシアン
l_data(0:nn) :real(8), intent(in)
: (in) 入力スペクトルデータ

入力スペクトルデータにラプラシアン

   ▽^2 = 1/cosφ・∂/∂φ(cosφ∂/∂φ)

を作用する.

スペクトルデータのラプラシアンとは, 対応する格子点データに ラプラシアンを作用させたデータのスペクトル変換のことである.

Original external subprogram is l_module#l_Lapla_l

l_y( y_data ) result(l_y)
Function :
l_y(0:nn) :real(8)
: (in) スペクトルデータ
y_data(1:jm) :real(8), intent(in)
: (in) 格子点データ

スペクトルデータから格子データへ変換する(1 層用).

Original external subprogram is l_module#l_y

Function :
la_DivLat_ya(0:nm,size(ya_data,2)) :real(8)
: (out) 格子点データを発散型緯度微分したスペクトルデータ
ya_data(:,:) :real(8), intent(in)
: (in) 入力格子点データ(1:jm,:)

格子点データに発散型緯度微分 1/cosφ・∂(f cosφ)/∂φ を作用させて スペクトルデータに変換して返す(多層用)..

[Source]

    function la_DivLat_ya(ya_data)
      !
      ! 格子点データに発散型緯度微分 1/cosφ・∂(f cosφ)/∂φ を作用させて
      ! スペクトルデータに変換して返す(多層用).. 
      !
      real(8), intent(in)  :: ya_data(:,:)
      !(in) 入力格子点データ(1:jm,:)

      real(8)              :: la_DivLat_ya(0:nm,size(ya_data,2))
      !(out) 格子点データを発散型緯度微分したスペクトルデータ

      integer              :: k

      do k=1,size(ya_data,2)
         la_DivLat_ya(:,k) = l_DivLat_y(ya_data(:,k))
      end do

    end function la_DivLat_ya
Function :
la_DivMu_ya(0:nm,size(ya_data,2)) :real(8)
: (out) 格子点データを発散型緯度微分したスペクトルデータ
ya_data(:,:) :real(8), intent(in)
: (in) 入力格子点データ(1:jm,:)

格子点データに発散型緯度微分 ∂/∂μ (μ=sinφ)を作用させて スペクトルデータに変換して返す(多層用).

[Source]

    function la_DivMu_ya(ya_data)
      !
      ! 格子点データに発散型緯度微分 ∂/∂μ (μ=sinφ)を作用させて
      ! スペクトルデータに変換して返す(多層用).
      !
      real(8), intent(in)  :: ya_data(:,:)
      !(in) 入力格子点データ(1:jm,:)

      real(8)              :: la_DivMu_ya(0:nm,size(ya_data,2))
      !(out) 格子点データを発散型緯度微分したスペクトルデータ

      integer              :: k

      do k=1,size(ya_data,2)
         la_DivMu_ya(:,k) = l_DivMu_y(ya_data(:,k))
      end do

    end function la_DivMu_ya
la_Finalize( )
Subroutine :

モジュールの終了処理(割り付け配列の解放)をおこなう.

解像度を変更する際にはこのサブルーチンを呼んで終了処理を おこなったのちに再度 l_Initial で初期設定しなければ ならない.

Original external subprogram is l_module#l_Finalize

Function :
la_LaplaInv_la(0:nm,size(la_data,2)) :real(8)
: (out) スペクトルデータの逆ラプラシアン
la_data(:,:) :real(8), intent(in)
: (in) 入力スペクトルデータ(0:nm,:)

入力スペクトルデータに逆ラプラシアン

   ▽^{-2}
     =[1/cosφ・∂/∂φ(cosφ∂/∂φ)]^{-1}

を作用する(多層用).

スペクトルデータの逆ラプラシアンとは, 対応する格子点データに 逆ラプラシアンを作用させたデータのスペクトル変換のことである.

[Source]

    function la_LaplaInv_la(la_data)
      !
      ! 入力スペクトルデータに逆ラプラシアン
      !
      !    ▽^{-2}
      !      =[1/cosφ・∂/∂φ(cosφ∂/∂φ)]^{-1}
      !
      ! を作用する(多層用). 
      !
      ! スペクトルデータの逆ラプラシアンとは, 対応する格子点データに
      ! 逆ラプラシアンを作用させたデータのスペクトル変換のことである. 
      !
      real(8), intent(in)  :: la_data(:,:)
      !(in) 入力スペクトルデータ(0:nm,:)

      real(8)              :: la_LaplaInv_la(0:nm,size(la_data,2))
      !(out) スペクトルデータの逆ラプラシアン

      integer               :: k

      do k=1,size(la_data,2)
         la_LaplaInv_la(:,k) = l_LaplaInv_l(la_data(:,k))
      end do
    end function la_LaplaInv_la
Function :
la_Lapla_la(0:nm,size(la_data,2)) :real(8)
: (out) 入力スペクトルデータのラプラシアン
la_data(:,:) :real(8), intent(in)
: (in) 入力スペクトルデータ(0:nm,:)

入力スペクトルデータにラプラシアン

   ▽^2 = 1/cosφ・∂/∂φ(cosφ∂/∂φ)

を作用する(多層用).

スペクトルデータのラプラシアンとは, 対応する格子点データに ラプラシアンを作用させたデータのスペクトル変換のことである.

[Source]

    function la_Lapla_la(la_data)
      !
      ! 入力スペクトルデータにラプラシアン
      !
      !    ▽^2 = 1/cosφ・∂/∂φ(cosφ∂/∂φ)
      !
      ! を作用する(多層用). 
      !
      ! スペクトルデータのラプラシアンとは, 対応する格子点データに
      ! ラプラシアンを作用させたデータのスペクトル変換のことである. 
      !
      real(8), intent(in)  :: la_data(:,:)
      !(in) 入力スペクトルデータ(0:nm,:)

      real(8)              :: la_Lapla_la(0:nm,size(la_data,2))
      !(out) 入力スペクトルデータのラプラシアン

      integer               :: k

      do k=1,size(la_data,2)
         la_Lapla_la(:,k) = l_Lapla_l(la_data(:,k))
      end do
      
    end function la_Lapla_la
Subroutine :
n_in :integer,intent(in)
: (in) 切断波数の設定
j_in :integer,intent(in)
: (in) 格子点数(南北)
l_init :logical,intent(in),optional
: (in) l_initial の call スイッチ

スペクトル変換の格子点数, 波数を設定する.

他の関数を呼ぶ前に, 最初にこのサブルーチンを呼んで初期設定を しなければならない.

[Source]

    subroutine la_initial(n_in,j_in,l_init)
      !
      ! スペクトル変換の格子点数, 波数を設定する.
      !
      ! 他の関数を呼ぶ前に, 最初にこのサブルーチンを呼んで初期設定を
      ! しなければならない. 
      !
      integer,intent(in) :: j_in              !(in) 格子点数(南北)
      integer,intent(in) :: n_in              !(in) 切断波数の設定
      logical,intent(in),optional :: l_init   !(in) l_initial の call スイッチ

      if ( .not. present(l_init) ) then
         call l_Initial(n_in,j_in)
      else if ( l_init ) then
         call l_Initial(n_in,j_in)
      endif

      jm = j_in 
       nm = n_in

      call MessageNotify( 'M','la_initial','la_module (2013/02/24) is initialized')

    end subroutine la_initial
Function :
la_ya(0:nm,size(ya_data,2)) :real(8)
: (out) 格子点データ
ya_data(:,:) :real(8), intent(in)
: (in) スペクトルデータ(1:jm,:)

格子データからスペクトルデータへ変換する(多層用).

[Source]

    function la_ya(ya_data)
      !
      ! 格子データからスペクトルデータへ変換する(多層用).
      !
      real(8), intent(in)   :: ya_data(:,:)
      !(in) スペクトルデータ(1:jm,:)

      real(8)               :: la_ya(0:nm,size(ya_data,2))
      !(out) 格子点データ

      integer               :: k

      do k=1,size(ya_data,2)
         la_ya(:,k) = l_y(ya_data(:,k))
      end do

    end function la_ya
y_GradLat_l( l_data ) result(y_GradLat_l)
Function :
y_GradLat_l(1:jm) :real(8)
: (out) スペクトルデータを勾配型緯度微分した格子点データ
l_data(0:nn) :real(8), intent(in)
: (in) 入力スペクトルデータ

スペクトルデータに勾配型緯度微分 ∂/∂φ を作用させて 格子点データに変換して返す(1 層用).

Original external subprogram is l_module#y_GradLat_l

y_GradMu_l( l_data ) result(y_GradMu_l)
Function :
y_GradMu_l(1:jm) :real(8)
: (out) スペクトルデータを勾配型緯度微分した格子点データ
l_data(0:nm) :real(8), intent(in)
: (in) 入力スペクトルデータ

スペクトルデータに勾配型緯度微分 (1-μ^2)∂/∂μ (μ=sinφ) を作用させて格子点データに変換して返す.

Original external subprogram is l_module#y_GradMu_l

y_Lat
Variable :
y_Lat(:) :real(8), allocatable
: 緯度経度

Original external subprogram is l_module#y_Lat

y_Lat_Weight
Variable :
y_Lat_Weight(:) :real(8), allocatable
: 座標重み

Original external subprogram is l_module#y_Lat_Weight

y_l( l_data ) result(y_l)
Function :
y_l(1:jm) :real(8)
: (out) 格子点データ
l_data(0:nn) :real(8), intent(in)
: (in) スペクトルデータ

スペクトルデータから格子データへ変換する(1 層用).

Original external subprogram is l_module#y_l

Function :
ya_GradLat_la(1:jm,size(la_data,2)) :real(8)
: (out) スペクトルデータを勾配型緯度微分した格子点データ
la_data(:,:) :real(8), intent(in)
: (in) 入力スペクトルデータ(0:nm,:)

スペクトルデータに勾配型緯度微分 ∂/∂φ を作用させて 格子点データに変換して返す(多層用).

[Source]

    function ya_GradLat_la(la_data)
      !
      ! スペクトルデータに勾配型緯度微分 ∂/∂φ を作用させて
      ! 格子点データに変換して返す(多層用).
      !
      real(8), intent(in)  :: la_data(:,:)
      !(in) 入力スペクトルデータ(0:nm,:)

      real(8)              :: ya_GradLat_la(1:jm,size(la_data,2))
      !(out) スペクトルデータを勾配型緯度微分した格子点データ

      integer               :: k

      do k=1,size(la_data,2)
         ya_GradLat_la(:,k) = y_GradLat_l(la_data(:,k))
      end do

    end function ya_GradLat_la
Function :
ya_GradMu_la(1:jm,size(la_data,2)) :real(8)
: (out) スペクトルデータを勾配型緯度微分した格子点データ
la_data(:,:) :real(8), intent(in)
: (in) 入力スペクトルデータ(0:nm,:)

スペクトルデータに勾配型緯度微分 (1-μ^2)∂/∂μ (μ=sinφ) を作用させて格子点データに変換して返す(多層用)..

[Source]

    function ya_GradMu_la(la_data)
      !
      ! スペクトルデータに勾配型緯度微分 (1-μ^2)∂/∂μ  (μ=sinφ)
      ! を作用させて格子点データに変換して返す(多層用).. 
      !
      real(8), intent(in)  :: la_data(:,:)
      !(in) 入力スペクトルデータ(0:nm,:)

      real(8)              :: ya_GradMu_la(1:jm,size(la_data,2))
      !(out) スペクトルデータを勾配型緯度微分した格子点データ

      integer              :: k

      do k=1,size(la_data,2)
         ya_GradMu_la(:,k) = y_GradMu_l(la_data(:,k))
      end do

    end function ya_GradMu_la
Function :
ya_la(1:jm,size(la_data,2)) :real(8)
: (out) 格子点データ
la_data(:,:) :real(8), intent(in)
: (in) スペクトルデータ(0:nm,:)

スペクトルデータから格子データへ変換する(多層用).

[Source]

    function ya_la(la_data)
      !
      ! スペクトルデータから格子データへ変換する(多層用).
      !
      real(8), intent(in)   :: la_data(:,:)
      !(in) スペクトルデータ(0:nm,:)

      real(8)               :: ya_la(1:jm,size(la_data,2))
      !(out) 格子点データ

      integer               :: k

      do k=1,size(la_data,2)
         ya_la(:,k) = y_l(la_data(:,k))
      end do

    end function ya_la