Class w_wave_deriv_module_sjpack
In: libsrc/w_wave_module_sjpack/w_wave_deriv_module_sjpack.f90

w_wave_deriv_module_sjpack

Authors:Shin-ichi Takehiro, Youhei SASAKI
Version:$Id: w_deriv_module_sjpack.f90 586 2013-05-23 17:42:12Z uwabami $
Copyright&License:See COPYRIGHT

概要

 spml/w_wave_deriv_module_sjpack モジュールは球面上での 2 次元
 流体運動を球面調和函数を用いたスペクトル法によって数値計算する
 ための モジュール w_module_sjpack の下部モジュールであり,
 スペクトル法の微分計算のための Fortran90 関数を提供する.

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

 このモジュールを使うためには前もって w_base_initial を呼んで
 切断波数, 格子点数の設定をしておく必要がある.

Methods

Included Modules

dc_message w_wave_base_module_sjpack

Public Instance methods

rn
Variable :
rn(:,:) :real(8), allocatable
: ラプラシアン演算用配列(w_module と互換性を保つため)

スペクトルデータのラプラシアンを計算するための係数 配列のサイズは(2*(nm-m+1), 2)

r(L,1) には L 番目の格納位置のスペクトルに対するラプラシアン計算の 係数 -n(n+1) の値が格納されている.

Function :
w_DivLat_xy(2*(nm-m+1)) :real(8)
: (out) 格子点データを発散型緯度微分したスペクトルデータ
xy_data(0:im-1,1:jm) :real(8), intent(in)
: (in) 入力格子点データ

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

[Source]

    function w_DivLat_xy(xy_data)
      !
      ! 格子点データに発散型緯度微分 1/cosφ・∂(f cosφ)/∂φ を作用させて
      ! スペクトルデータに変換して返す(1 層用).
      !
      real(8)              :: w_DivLat_xy(2*(nm-m+1))
      !(out) 格子点データを発散型緯度微分したスペクトルデータ

      real(8), intent(in)  :: xy_data(0:im-1,1:jm)
      !(in) 入力格子点データ

      w_DivLat_xy = w_xy(xy_data,ipow=1,iflag=1)

    end function w_DivLat_xy
Function :
w_DivLon_xy(2*(nm-m+1)) :real(8)
: (out) 格子点データを発散型経度微分したスペクトルデータ
xy_data(0:im-1,1:jm) :real(8), intent(in)
: (in) 入力格子点データ

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

[Source]

    function w_DivLon_xy(xy_data)
      !
      ! 格子点データに発散型経度微分 1/cosφ・∂/∂λ を作用させて
      ! スペクトルデータに変換して返す(1 層用).
      !
      real(8)              :: w_DivLon_xy(2*(nm-m+1))
      !(out) 格子点データを発散型経度微分したスペクトルデータ
      real(8), intent(in)  :: xy_data(0:im-1,1:jm)
      !(in) 入力格子点データ

      w_DivLon_xy = w_xy(xy_data,ipow=1,iflag=-1)

    end function w_DivLon_xy
Function :
w_Div_xy_xy(2*(nm-m+1)) :real(8)
: (out) 2 つの入力格子点データをベクトル成分とする発散のスペクトルデータ
xy_u(0:im-1,1:jm) :real(8), intent(in)
: (in) ベクトル経度成分の格子点データ
xy_v(0:im-1,1:jm) :real(8), intent(in)
: (in) ベクトル緯度成分の格子点データ

2 つの入力格子点データをベクトル成分とする発散を計算し, スペクトルデータとして返す(1 層用).

[Source]

    function w_Div_xy_xy(xy_u,xy_v)
      !
      ! 2 つの入力格子点データをベクトル成分とする発散を計算し, 
      ! スペクトルデータとして返す(1 層用).
      !
      real(8)              :: w_Div_xy_xy(2*(nm-m+1))
      !(out) 2 つの入力格子点データをベクトル成分とする発散のスペクトルデータ

      real(8), intent(in)  :: xy_u(0:im-1,1:jm)
      !(in) ベクトル経度成分の格子点データ

      real(8), intent(in)  :: xy_v(0:im-1,1:jm)
      !(in) ベクトル緯度成分の格子点データ

      w_Div_xy_xy = w_Divlon_xy(xy_u) + w_Divlat_xy(xy_v)

    end function w_Div_xy_xy
Function :
w_LaplaInv_w(2*(nm-m+1)) :real(8)
: (out) スペクトルデータの逆ラプラシアン
w_data(2*(nm-m+1)) :real(8), intent(in)
: (in) 入力スペクトルデータ

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

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

を作用する(1 層用).

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

[Source]

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

      real(8), intent(in)  :: w_data(2*(nm-m+1))
      !(in) 入力スペクトルデータ

      w_LaplaInv_w = w_data/D

    end function w_LaplaInv_w
Function :
w_Lapla_w(2*(nm-m+1)) :real(8)
: (out) 入力スペクトルデータのラプラシアン
w_data(2*(nm-m+1)) :real(8), intent(in)
: (in) 入力スペクトルデータ

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

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

を作用する(1 層用).

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

[Source]

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

      real(8), intent(in)  :: w_data(2*(nm-m+1))
      !(in) 入力スペクトルデータ

      w_Lapla_w = D*w_Data

    end function w_Lapla_w
Subroutine :

スペクトル微分計算に必要となる作業領域を設定する.

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

このサブルーチンを単独で用いるのでなく, 上位サブルーチン w_Initial を使用すること.

[Source]

    subroutine w_deriv_initial
      !
      ! スペクトル微分計算に必要となる作業領域を設定する. 
      !
      ! 他の関数を呼ぶ前に, 最初にこのサブルーチンを呼んで
      ! 初期設定をしなければならない. 
      !
      ! このサブルーチンを単独で用いるのでなく, 
      ! 上位サブルーチン w_Initial を使用すること.
      !
      integer :: n

      w_wave_deriv_initialize=.true.

      allocate(D(2*(nm-m+1)))
      allocate(rn(2*(nm-m+1),2))

      do n=m,nm
         D(2*(n-m+1)-1) = -n*(n+1)
         D(2*(n-m+1))   = -n*(n+1)
         rn(2*(n-m+1)-1,1) = -n*(n+1)
         rn(2*(n-m+1),1)   = -n*(n+1)
         rn(2*(n-m+1)-1,2) = -1/(n*(n+1))
         rn(2*(n-m+1),2)   = -1/(n*(n+1))
      end do

      call MessageNotify('M','w_deriv_initial', 'w_wave_deriv_module_sjpack (2013/07/02) is initialized')

    end subroutine w_deriv_initial
Function :
xy_GradLat_w(0:im-1,1:jm) :real(8)
: (out) スペクトルデータを勾配型緯度微分した格子点データ
w_data(2*(nm-m+1)) :real(8), intent(in)
: (in) 入力スペクトルデータ

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

[Source]

    function xy_GradLat_w(w_data)
      !
      ! スペクトルデータに勾配型緯度微分 ∂/∂φ を作用させて
      ! 格子点データに変換して返す(1 層用).
      !
      real(8)              :: xy_GradLat_w(0:im-1,1:jm)
      !(out) スペクトルデータを勾配型緯度微分した格子点データ

      real(8), intent(in)  :: w_data(2*(nm-m+1))
      !(in) 入力スペクトルデータ

      xy_GradLat_w = xy_w(w_data,ipow=1,iflag=1)

    end function xy_GradLat_w
Function :
xy_GradLon_w(0:im-1,1:jm) :real(8)
: (out) スペクトルデータを勾配型経度微分した格子点データ
w_data(2*(nm-m+1)) :real(8), intent(in)
: (in) 入力スペクトルデータ

スペクトルデータに勾配型経度微分 1/cosφ・∂/∂λ を 作用させた格子点データを返す(1 層用).

[Source]

    function xy_GradLon_w(w_data)
      !
      ! スペクトルデータに勾配型経度微分 1/cosφ・∂/∂λ を
      ! 作用させた格子点データを返す(1 層用).
      !
      real(8)              :: xy_GradLon_w(0:im-1,1:jm)
      !(out) スペクトルデータを勾配型経度微分した格子点データ

      real(8), intent(in)  :: w_data(2*(nm-m+1))
      !(in) 入力スペクトルデータ

      xy_GradLon_w = xy_w(w_data,ipow=1,iflag=-1)

    end function xy_GradLon_w