spml/wa_module レファレンスマニュアル

spml/wa_module モジュールは球面上での流体運動を 球面調和函数を用いたスペクトル法によって数値計算するための 基本的な Fortran90 関数を提供するものである. 球面上の 1 層モデル用 w_module モジュールを多層モデル用に 拡張したものであり, 同時に複数個のスペクトルデータ, 格子点データに 対する変換や微分計算が行える. 内部で ISPACK の SPPACK と SNPACK の Fortran77 サブルーチンを呼んでいる. スペクトルデータおよび格子点データの格納方法や 変換の詳しい計算法については ISPACK/SNPACK,SPPACK のマニュアルを参照されたい.

wa_module は実際には基本変換, 微分計算, 積分・平均計算をそれぞれ担っている 下部モジュール wa_base_module, wa_deriv_module, wa_integral_module, およびそれらの 1 層用モジュールである w_base_module, w_deriv_module, w_integral_module から構成されている.

目次


サブルーチン・関数一覧(機能別)

初期化 機能
wa_Initial スペクトル変換の格子点数, 波数, 領域の大きさ, 同時に計算するデータの個数の最大値の設定
座標変数 機能
x_Lon, y_Lat 格子点座標(経度・緯度座標)を格納した 1 次元配列.
x_Lon_weight, y_Lat_Weight 重み座標を格納した 1 次元配列.
xy_Lon, xy_Lat 格子点データの経度・緯度座標(X,Y)(格子点データ型 2 次元配列)
基本変換 機能
xya_wa, xy_w スペクトルデータから格子データへの変換(多層, 1 層用)
wa_xya, w_xy 格子データからスペクトルデータへの変換(多層, 1 層用)
l_nm, nm_l スペクトルデータの格納位置と全波数・帯状波数の変換
微分 機能
wa_Lapla_wa, w_Lapla_w スペクトルデータにラプラシアンを作用させる(多層, 1 層用)
wa_LaplaInv_wa, w_LaplaInv_w スペクトルデータにラプラシアンの逆変換を作用させる(多層, 1 層用)
wa_DLon_wa, w_DLon_w スペクトルデータに経度微分 ∂/∂λ を作用させる(多層, 1 層用)
xya_GradLon_wa, xy_GradLon_w スペクトルデータに勾配型経度微分 1/cosφ・∂/∂λ を作用させる(多層, 1 層用)
xya_GradLat_wa, xy_GradLat_w スペクトルデータに勾配型緯度微分 ∂/∂φ を作用させる(多層, 1 層用)
wa_DivLon_xya, w_DivLon_xy 格子データに発散型経度微分 1/cosφ・∂/∂λ を作用させる(多層, 1 層用)
wa_DivLat_xya, w_DivLat_xy 格子データに発散型緯度微分 1/cosφ・∂(g cosφ)/∂φ を作用させる(多層, 1 層用)
wa_Div_xya_xya, w_Div_xy_xy ベクトル成分である 2 つの格子データに発散を作用させる(多層, 1 層用)
wa_Jacobian_wa_wa, w_Jacobian_w_w 2 つのスペクトルデータからヤコビアンを計算する(多層, 1 層用).
xya_GradLambda_wa, xy_GradLambda_w スペクトルデータに勾配型経度微分 ∂/∂λ を作用させる(多層, 1 層用)
xya_GradMu_wa, xy_GradMu_w スペクトルデータに勾配型緯度微分 (1-μ2)∂/∂μ を作用させる(μ=sinφ, 多層, 1 層用)
wa_DivLambda_xya, w_DivLambda_xy 格子データに発散型経度微分 1/(1-μ2)・∂/∂λ を作用させる(μ=sinφ, 多層, 1 層用)
wa_DivMu_xya, w_DivMu_xy 格子データに発散型緯度微分 ∂/∂μ を作用させる(μ=sinφ, 多層, 1 層用)
積分・平均 機能
a_IntLonLat_xya, a_AvrLonLat_xya, IntLonLat_xy, AvrLonLat_xy 2 次元格子点データの球面全積分および平均(多層, 1 層用).
ya_IntLon_xya, ya_AvrLon_xya, y_IntLon_xy, y_AvrLon_xy 2 次元格子点データの経度方向積分および平均(多層, 1 層用).
a_IntLon_xa, a_AvrLon_xa, IntLon_x, AvrLon_x 1 次元(X)格子点データの経度方向積分および平均(多層, 1 層用).
xa_IntLat_xya, xa_AvrLat_xya, x_IntLat_xy, x_AvrLat_xy 2 次元格子点データの緯度方向積分および平均(多層, 1 層用).
a_IntLat_ya, a_AvrLat_ya, IntLat_y, AvrLat_y 1 次元(Y)格子点データの緯度方向積分および平均(多層, 1 層用).
スペクトル解析 機能
nma_EnergyFromStreamfunc_wa, nm_EnergyFromStreamfunc_w 流線関数のスペクトルデータからエネルギーの球面調和函数成分(スペクトル)を計算する(多層, 1 層用).
na_EnergyFromStreamfunc_wa, n_EnergyFromStreamfunc_w 流線関数のスペクトルデータから各全波数のエネルギー成分(スペクトル)を計算する(多層, 1 層用).
nma_EnstrophyFromStreamfunc_wa, nm_EnstrophyFromStreamfunc_w 流線関数のスペクトルデータからエンストロフィーの球面調和函数成分(スペクトル)を計算する(多層, 1 層用).
na_EnstrophyFromStreamfunc_wa, n_EnstrophyFromStreamfunc_w 流線関数のスペクトルデータから各全波数のエンストロフィー成分(スペクトル)を計算する(多層, 1 層用).


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

w_module でのものに追加される関数・変数の名前と型についてのみ 説明する. w_module での関数・変数の名前と型については w_module の該当項を参照されたい.

命名法

各データの種類の説明


サブルーチンの説明

subroutine wa_Initial(nm,im,jm,km,np)

  1. 機能 : スペクトル変換の格子点数, 波数, 最大データ数(層数)および OPENMP 使用時の最大スレッド数を設定する.
  2. 引数の説明
        integer,intent(in)           :: nm          ! 切断全波数
        integer,intent(in)           :: im, jm      ! 格子点数(経度λ, 緯度φ)
        integer,intent(in)           :: km          ! 最大データ数(層数)
        integer,intent(in), optional :: np          ! OPENMP での最大スレッド数
        
  3. 備考
    他の関数を呼ぶ前に, 最初にこのサブルーチンを呼んで初期設定を しなければならない. np に 1 より大きな値を指定すれば ISPACK の球面調和函数変換 OPENMP 並列計算ルーチンが用いられる. 並列計算を実行するには, 実行時に環境変数 OMP_NUM_THREADS を np 以下の 数字に設定する等のシステムに応じた準備が必要となる. np に 1 より大きな値を指定しなければ並列計算ルーチンは呼ばれない.


変数の説明

w_module と共通なので省略. w_module の変数の説明の項を参照されたい.


各関数の説明

以下では w_module.htm と共通でない関数のみ説明してある. w_module と共通な関数は w_module の関数の説明の項を参照されたい.

function xya_wa(wa_data,ipow,iflag)

  1. 機能 : スペクトルデータから格子データへ変換する(多層用).
  2. 変数の型
          real(8), intent(in)   :: wa_data(im,jm)                    ! スペクトル
          real(8)               :: xya_wa(im,jm,size(wa_data,2))   ! 格子点
          integer, intent(in), optional  :: ipow      ! 作用させる 1/cosφ の次数
          integer, intent(in), optional  :: iflag     ! 変換の種類
        
  3. 引数の説明
  4. 備考

function wa_xya(xya_data,ipow,iflag)

  1. 機能 : 格子データからスペクトルデータへ(正)変換する(多層用).
  2. 変数の型
          real(8), intent(in)   :: xya_data(im,jm,:)      ! 格子点(im,jm,*)
          real(8)               :: wa_xya((nm+1)*(nm+1),size(xya_data,3))  ! スペクトル
          integer, intent(in), optional  :: ipow        ! 作用させる 1/cosφ の次数
          integer, intent(in), optional  :: iflag       ! 変換の種類
        
  3. 引数の説明
  4. 備考

function wa_Lapla_wa(wa_data)

  1. 機能 : 入力スペクトルデータにラプラシアンを作用する(多層用).
  2. 変数の型
          real(8)              :: wa_Lapla_wa((nm+1)*(nm+1),size(wa_data,2))
          real(8), intent(in)  :: wa_data((nm+1)*(nm+1),:)
        
  3. 備考
    スペクトルデータのラプラシアンとは, 対応する格子点データにラプラシアンを作用させたデータのスペクトル変換のことである. ラプラシアンは ▽^2 = 1/cos^2φ・∂^2/∂λ^2 + 1/cosφ・∂/∂φ(cosφ∂/∂φ) と計算される.

function wa_LaplaInv_wa(wa_data)

  1. 機能 : 入力スペクトルデータに逆ラプラシアンを作用する(多層用).
  2. 変数の型
          real(8)              :: wa_LaplaInv_wa((nm+1)*(nm+1),size(wa_data,2))
          real(8), intent(in)  :: wa_data((nm+1)*(nm+1),:)
        
  3. 備考
    スペクトルデータの逆ラプラシアンとは, 対応する格子点データに逆ラプラシアンを作用させたデータのスペクトル変換のことである.

function wa_DLon_wa(wa_data)

  1. 機能 : 入力スペクトルデータに経度微分を作用する(多層用).
  2. 変数の型
          real(8)              :: wa_DLon_wa((nm+1)*(nm+1),size(wa_data,2))
          real(8), intent(in)  :: wa_data((nm+1)*(nm+1),:)
        
  3. 備考
    スペクトルデータの経度微分とは, 対応する格子点データに経度微分 ∂/∂λ を 作用させたデータのスペクトル変換のことである.

function xya_GradLon_wa(wa_data)

  1. 機能 : スペクトルデータに勾配型経度微分を作用させる(多層用).
  2. 変数の型
          real(8)              :: xya_GradLat_wa(im,jm,size(wa_data,2))
          real(8), intent(in)  :: wa_data((nm+1)*(nm+1),:)
        
  3. 備考
    スペクトルデータに対応する格子点データに 勾配型経度微分 1/cosφ・∂/∂λ を作用させた格子データが返される

function xya_GradLat_wa(wa_data)

  1. 機能 : スペクトルデータに勾配型経度微分を作用させる(多層用).
  2. 変数の型
          real(8)              :: xya_GradLat_wa(im,jm,size(wa_data,2))
          real(8), intent(in)  :: wa_data((nm+1)*(nm+1),:)
        
  3. 備考
    入力スペクトルデータに対応する格子データに 勾配型緯度微分 ∂/∂φ を作用させた格子データが返される

function wa_DivLon_xya(xya_data)

  1. 機能 : 格子データに発散型経度微分を作用させる(多層用).
  2. 変数の型
          real(8)              :: wa_DivLon_xya((nm+1)*(nm+1),,size(xya_data,3))
          real(8), intent(in)  :: xya_data(im,jm,:)
        
  3. 備考
    入力格子データに発散型経度微分 1/cosφ・∂/∂λ を作用させた スペクトルデータが返される

function wa_DivLat_xya(xya_data)

  1. 機能 : 格子データに発散型緯度微分を作用させる(多層用).
  2. 変数の型
          real(8)              :: wa_DivLat_xya((nm+1)*(nm+1),size(xya_data,3))
          real(8), intent(in)  :: xya_data(im,jm,:)
        
  3. 備考
    入力格子データに発散型経度微分 1/cosφ・∂(g cosφ)/∂φ を作用させた スペクトルデータが返される

function wa_Div_xya_xya(xya_u,xya_v)

  1. 機能 : ベクトル成分である 2 つの格子データに発散を作用させる(多層用).
  2. 変数の型
          real(8)              :: wa_Div_xya_xya((nm+1)*(nm+1),size(xya_u,3))
          real(8), intent(in)  :: xya_u(im,jm,:)   ! ベクトル経度成分
          real(8), intent(in)  :: xya_v(im,jm,:)   ! ベクトル緯度成分
        
  3. 備考
    第 1, 2 引数(u,v)がそれぞれベクトルの経度成分と緯度成分を表し, 発散は 1/cosφ・∂u/∂λ + 1/cosφ・∂(v cosφ)/∂φ と計算される.

function wa_Jacobian_wa_wa(wa_a,wa_b)

  1. 機能 : 2 つのスペクトルデータからヤコビアンを計算する(多層用).
  2. 変数の型
          real(8)             :: wa_Jacobian_wa_wa((nm+1)*(nm+1),size(wa_a,2))
          real(8), intent(in) :: wa_a((nm+1)*(nm+1),:)
          real(8), intent(in) :: wa_b((nm+1)*(nm+1),:)
        
  3. 備考
    2 つのスペクトルデータのヤコビアンとは, 対応する 2 つの格子点データのヤコビアンのスペクトル変換のことである.
    2 つのデータ f, g のヤコビアンは J(f,g) = ∂f/∂λ・∂g/∂μ - ∂g/∂λ・∂f/∂μ = ∂f/∂λ・1/cosφ・∂g/∂φ - ∂g/∂λ・1/cosφ・∂f/∂φ と計算される.

function xya_GradLambda_wa(wa_data)

  1. 機能 : スペクトルデータに勾配型経度微分を作用させる(多層, λ-μ座標用).
  2. 変数の型
          real(8)              :: xya_GradLambda_wa(im,jm,size(wa_data,2))
          real(8), intent(in)  :: wa_data((nm+1)*(nm+1),:)
        
  3. 備考
    スペクトルデータに対応する格子点データに 勾配型経度微分 ∂/∂λ を作用させた格子データが返される

function xya_GradMu_wa(wa_data)

  1. 機能 : スペクトルデータに勾配型経度微分を作用させる(多層, λ-μ座標用).
  2. 変数の型
          real(8)              :: xya_GradMu_wa(im,jm,size(wa_data,2))
          real(8), intent(in)  :: wa_data((nm+1)*(nm+1),:)
        
  3. 備考
    入力スペクトルデータに対応する格子データに 勾配型緯度微分 (1-μ2)∂/∂μ を作用させた格子データが返される. ただし μ=sinφ である.

function wa_DivLambda_xya(xya_data)

  1. 機能 : 格子データに発散型経度微分を作用させる(多層, λ-μ座標用).
  2. 変数の型
          real(8)              :: wa_DivLambda_xya((nm+1)*(nm+1),,size(xya_data,3))
          real(8), intent(in)  :: xya_data(im,jm,:)
        
  3. 備考
    入力格子データに発散型経度微分 1/(1-μ2)・∂/∂λ を作用させた スペクトルデータが返される. ただし μ=sinφ である.

function wa_DivMu_xya(xya_data)

  1. 機能 : 格子データに発散型緯度微分を作用させる(多層, λ-μ座標用).
  2. 変数の型
          real(8)              :: wa_DivMu_xya((nm+1)*(nm+1),size(xya_data,3))
          real(8), intent(in)  :: xya_data(im,jm,:)
        
  3. 備考
    入力格子データに発散型経度微分 ∂/∂μ を作用させた スペクトルデータが返される. ただし μ=sinφ である.

function a_IntLonLat_xya(xya_data), function a_AvrLonLat_xya(xya_data)

  1. 機能 : 2 次元格子点データの全領域積分および平均(多層用).
  2. 変数の型
          real(8), dimension(im,jm,:)          :: xya_data        ! 2 次元格子点
          real(8), dimension(size(xya_data,3)) :: IntLonLat_xya   ! 積分値
    
          real(8), dimension(im,jm,:)          :: xya_data        ! 2 次元格子点
          real(8), dimension(size(xya_data,3)) :: AvrLonLat_xya   ! 平均値
        
  3. 備考

function ya_IntLon_xya(xya_data), function ya_AvrLon_xya(xya_data)

  1. 機能 : 2 次元格子点データの経度方向積分および平均(多層用).
  2. 変数の型
          real(8), dimension(im,jm,:)              :: xya_data       ! 2 次元格子点
          real(8), dimension(jm,size(xya_data,3))  :: ya_IntLon_xya  ! 1 次元(緯度)格子点
    
          real(8), dimension(im,jm,:)              :: xya_data       ! 2 次元格子点
          real(8), dimension(jm,size(xya_data,3))  :: ya_AvrLon_xya  ! 1 次元(緯度)格子点
        
  3. 備考

function a_IntLon_xa(xa_data), function a_AvrLon_xa(xa_data)

  1. 機能 : 1 次元(Lon)格子点データの経度方向積分および平均(多層用).
  2. 変数の型
          real(8), dimension(im,:)      :: xa_data         ! 1 次元格子点
          real(8), dimension(size(xa,2) :: a_IntLon_xa     ! 積分値
    
          real(8), dimension(im,:)      :: xa_data         ! 1 次元格子点
          real(8), dimension(size(xa,2) :: a_AvrLon_xa     ! 平均値
        
  3. 備考

function xa_IntLat_xya(xya_data), function xa_AvrLat_xya(xya_data)

  1. 機能 : 2 次元格子点データの緯度方向域積分および平均(多層用).
  2. 変数の型
          real(8), dimension(im,jm,:)         :: xya_data        ! 2 次元格子点
          real(8), dimension(im,size(xya,3))  :: xa_IntLat_xya   ! 1 次元(経度)格子点
    
          real(8), dimension(im,jm,:)         :: xya_data        ! 2 次元格子点
          real(8), dimension(im,size(xya(3))  :: xa_AvrLat_xya   ! 1 次元(経度)格子点
        
  3. 備考

function a_IntLat_ya(ya_data), function a_AvrLat_ya(ya_data)

  1. 機能 : 1 次元(Lat)格子点データの緯度方向域積分および平均(多層用).
  2. 変数の型
          real(8), dimension(jm,:)   :: ya_data         ! 1 次元格子点
          real(8), dimension(ya,2)   :: a_IntLat_ya     ! 積分値
    
          real(8), dimension(jm,:)   :: ya_data         ! 1 次元格子点
          real(8), dimension(ya,2)   :: a_AvrLat_ya     ! 平均値
        
  3. 備考

function nma_EnergyFromStreamfunc_wa(wa_Strfunc),

  1. 機能 : 流線関数のスペクトルデータからエネルギーの球面調和函数成分(スペクトル)を計算する(多層用).
  2. 変数の型
          real(8), intent(in)   :: wa_Strfunc(:,:)    ! 流線関数(スペクトルデータ)
          real(8), dimension(0:nm,-nm:nm,size(wa_Strfunc,2)) &
               :: nma_EnergyFromStreamfunc_wa         ! エネルギースペクトル
        
  3. 備考

function na_EnergyFromStreamfunc_wa(wa_Strfunc),

  1. 機能 : 流線関数のスペクトルデータから各全波数のエネルギー成分(スペクトル)を計算する(多層用).
  2. 変数の型
          real(8), intent(in)   :: wa_Strfunc(:,:)   ! 流線関数(スペクトルデータ)
          real(8), dimension(0:nm,size(wa_Strfunc,2)) &
               :: na_EnergyFromStreamfunc_wa         ! エネルギースペクトル
    
        
  3. 備考

function nma_EnstrophyFromStreamfunc_wa(wa_Strfunc),

  1. 機能 : 流線関数のスペクトルデータからエネルギーの球面調和函数成分(スペクトル)を計算する(多層用).
  2. 変数の型
          real(8), intent(in)   :: wa_Strfunc(:,:)     ! 流線関数(スペクトルデータ)
          real(8), dimension(0:nm,-nm:nm,size(wa_Strfunc,2)) &
               :: nma_EnstrophyFromStreamfunc_wa       ! エンストロフィースペクトル
        
  3. 備考
  4. 備考

function na_EnstrophyFromStreamfunc_wa(wa_Strfunc),

  1. 機能 : 流線関数のスペクトルデータから各全波数のエネルギー成分(スペクトル)を計算する(多層用).
  2. 変数の型
          real(8), intent(in)   :: wa_Strfunc(:,:)   ! 流線関数(スペクトルデータ)
          real(8), dimension(0:nm,size(wa_Strfunc,2)) &
               :: na_EnstrophyFromStreamfunc_wa      ! エンストロフィースペクトル
        
  3. 備考


地球流体電脳倶楽部 SPMODEL プロジェクト
spmodel@gfd-dennou.org

2002/08/22 作成 (竹広真一)
2005/07/09 更新 (竹広真一)