Class wtu_module
In: src/wtu_module.f90

wtu_module

Authors:Shin-ichi Takehiro, Youhei SASAKI
Version:$Id: wtu_module.f90,v 1.5 2009-02-28 21:33:48 uwabami Exp $
Copyright&License:See COPYRIGHT

概要

spml/wtu_module モジュールは球とその外側の球殻領域での流体運動を スペクトル法によって数値計算するための Fortran90 関数を提供する ものである.

水平方向に球面調和函数変換および動径方向にチェビシェフ変換を用いる 場合のスペクトル計算のためのさまざまな関数を提供する.

内部で wt_module, wu_module を用いている. 最下部では球面調和変換 およびチェビシェフ変換のエンジンとして ISPACK の Fortran77 サブルーチンを用いている.

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

命名法

  • 関数名の先頭 (wu_, nmr_, nr_, xyr_, wr_, w_, xy_, x_, y_, r_, a_, wt_, nmz_, nz_, xyz_, wz_, w_, xy_, x_, y_, z_, a_) は, 返す値の形を示している.
    wt_ :スペクトルデータ(球面調和函数・チェビシェフ変換-球殻)
    nmz_ :水平スペクトルデータ(全波数 n, 帯状波数各成分, 動径-球殻)
    nz_ :水平スペクトルデータ(全波数 n, 動径-球殻)
    xyz_ :3 次元格子点データ(経度・緯度・動径-球殻)
    wz_ :水平スペクトル, 動径格子点データ, 球殻
    wu_ :スペクトルデータ(球面調和函数・チェビシェフ変換-球)
    nmr_ :水平スペクトルデータ(全波数 n, 帯状波数各成分, 動径-球)
    nr_ :水平スペクトルデータ(全波数 n, 動径-球)
    xyr_ :3 次元格子点データ(経度・緯度・動径-球)
    wr_ :水平スペクトル, 動径格子点データ, 球
  • 関数名の間の文字列(DLon, GradLat, GradLat, DivLon, DivLat, Lapla,..) は, その関数の作用を表している.
  • 関数名の最後 (wt_, xyz_, wz_, w_, xy_, x_, y_, z_, a_, wu_, xyz_, wr_, w_, xy_, x_, y_, r_, a_) は, 入力変数の形が スペクトルデータおよび格子点データであることを示している.
    _wt :スペクトルデータ
    _xyz :3 次元格子点データ
    _xyz_xyz :2 つの3 次元格子点データ, …
    _wu :スペクトルデータ
    _xyr :3 次元格子点データ
    _xyr_xyr :2 つの3 次元格子点データ, …

各データの種類の説明

  • xyz : 3 次元格子点データ(経度・緯度・動径-球殻)
    • 変数の種類と次元は real(8), dimension(0:im-1,1:jm,0:km).
    • im, jm, km はそれぞれ経度, 緯度, 動径座標の格子点数であり, サブルーチン wt_Initial にてあらかじめ設定しておく.
  • wt : スペクトルデータ-球殻
    • 変数の種類と次元は real(8), dimension((nm+1)*(nm+1),0:lm).
    • nm は球面調和函数の最大全波数, lm はチェビシェフ多項式の最大次数 であり, サブルーチン wt_Initial にてあらかじめ設定しておく.
    • 水平スペクトルデータの格納のされ方は関数 l_nm, nm_l によって調べる ことができる.
  • nmz : 水平スペクトルデータの並んだ 3 次元配列(球殻).
    • 変数の種類と次元は real(8), dimension(0:nm,-nm:nm,0:km).
    • 第 1 次元が水平全波数, 第 2 次元が帯状波数, 第 3 次元が動径座標を表す.
    • nm は球面調和函数の最大全波数であり, サブルーチン wt_Initial にて あらかじめ設定しておく.
  • nz : スペクトルデータの並んだ 2 次元配列(球殻).
    • 変数の種類と次元は real(8), dimension(0:nm,0:km).
    • 第 1 次元が水平全波数を表す. nm は球面調和函数の最大全波数であり, サブルーチン wt_Initial にてあらかじめ設定しておく.
  • wz : 水平スペクトル, 動径格子点データ(球殻).
    • 変数の種類と次元は real(8), dimension((nm+1)*(nm+1),0:km).
  • xyr : 3 次元格子点データ(経度・緯度・動径-球)
    • 変数の種類と次元は real(8), dimension(0:im-1,1:jm,0:km).
    • im, jm, km はそれぞれ経度, 緯度, 動径座標の格子点数であり, サブルーチン wt_Initial にてあらかじめ設定しておく.
  • wu : スペクトルデータ(球)
    • 変数の種類と次元は real(8), dimension((nm+1)*(nm+1),0:lm).
    • nm は球面調和函数の最大全波数, lm はチェビシェフ多項式の最大次数 であり, サブルーチン wt_Initial にてあらかじめ設定しておく.
    • 水平スペクトルデータの格納のされ方は関数 l_nm, nm_l によって調べる ことができる.
  • nmr : 水平スペクトルデータの並んだ 3 次元配列(球).
    • 変数の種類と次元は real(8), dimension(0:nm,-nm:nm,0:km).
    • 第 1 次元が水平全波数, 第 2 次元が帯状波数, 第 3 次元が動径座標を表す.
    • nm は球面調和函数の最大全波数であり, サブルーチン wt_Initial にて あらかじめ設定しておく.
  • nr : スペクトルデータの並んだ 2 次元配列(球).
    • 変数の種類と次元は real(8), dimension(0:nm,0:km).
    • 第 1 次元が水平全波数を表す. nm は球面調和函数の最大全波数であり, サブルーチン wt_Initial にてあらかじめ設定しておく.
  • wr : 水平スペクトル, 動径格子点データ(球).
    • 変数の種類と次元は real(8), dimension((nm+1)*(nm+1),0:km).
  • wt_ で始まる関数が返す値はスペクトルデータに同じ.
  • xyz_ で始まる関数が返す値は 3 次元格子点データに同じ.
  • wz_ で始まる関数が返す値は水平スペクトル, 動径格子点データに同じ.
  • wu_ で始まる関数が返す値はスペクトルデータに同じ.
  • xyr_ で始まる関数が返す値は 3 次元格子点データに同じ.
  • wr_ で始まる関数が返す値は水平スペクトル, 動径格子点データに同じ.
  • スペクトルデータに対する微分等の作用とは, 対応する格子点データに 微分などを作用させたデータをスペクトル変換したものことである.

変数・手続き群の要約

初期化

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

座標変数

x_Lon, y_Lat :格子点座標(緯度, 経度)を格納した1 次元配列
z_Rad :格子点座標(動径, 球殻)を格納した1 次元配列
r_Rad :格子点座標(動径, 球)を格納した1 次元配列
x_Lon_Weight, y_Lat_Weight :重み座標を格納した 1 次元配列
z_Rad_Weight :重み座標を格納した 1 次元配列
r_Rad_Weight :重み座標を格納した 1 次元配列
xyz_Lon, xyz_Lat :格子点データの経度・緯度(X,Y) (格子点データ型 3 次元配列)
xyz_Rad :格子点データの動径(球殻)(Z) (格子点データ型 3 次元配列)
xyr_Lon, xyr_Lat :格子点データの経度・緯度(X,Y) (格子点データ型 3 次元配列)
xyr_Rad :格子点データの動径(球) (格子点データ型 3 次元配列)

基本変換

xyz_wt, wt_xyz :スペクトルデータと 3 次元格子データの間の変換 (球面調和函数, チェビシェフ変換)
xyz_wz, wz_xyz :3 次元格子データと水平スペクトル・動径格子データとの 間の変換 (球面調和函数)
wz_wt, wt_wz :スペクトルデータと水平スペクトル・動径格子データとの 間の変換 (チェビシェフ変換)
xyr_wu, wu_xyr :スペクトルデータと 3 次元格子データの 間の変換 (球面調和函数, チェビシェフ変換)
xyr_wr, wr_xyr :3 次元格子データと水平スペクトル・動径格子データとの 間の変換 (球面調和函数)
wr_wu, wu_wr :スペクトルデータと水平スペクトル・動径格子データとの 間の変換 (チェビシェフ変換)
w_xy, xy_w :スペクトルデータと 2 次元水平格子データの 間の変換(球面調和函数変換)
l_nm, nm_l :スペクトルデータの格納位置と全波数・帯状波数の変換

微分

wt_DRad_wt :スペクトルデータに動径微分 ∂/∂r を作用させる
wt_DivRad_wt :スペクトルデータに発散型動径微分 1/r^2 ∂/∂r r^2 = ∂/∂r + 2/r を作用させる
wt_RotRad_wt :スペクトルデータに回転型動径微分 1/r ∂/∂rr = ∂/∂r + 1/r を作用させる
wt_Lapla_wt :スペクトルデータにラプラシアンを作用させる
xyz_GradLon_wt :スペクトルデータに勾配型経度微分 1/rcosφ・∂/∂λを作用させる
xyz_GradLat_wt :スペクトルデータに勾配型緯度微分 1/r・∂/∂φを作用させる
wt_DivLon_xyz :格子データに発散型経度微分 1/rcosφ・∂/∂λを作用させる
wt_DivLat_xyz :格子データに発散型緯度微分 1/rcosφ・∂(g cosφ)/∂φを作用させる
wt_Div_xyz_xyz_xyz :ベクトル成分である 3 つの格子データに 発散を作用させる
xyz_Div_xyz_xyz_xyz :ベクトル成分である 3 つの格子データに 発散を作用させる
xyz_RotLon_wt_wt :ベクトル場の回転の経度成分を計算する
xyz_RotLat_wt_wt :ベクトル場の回転の緯度成分を計算する
wt_RotRad_xyz_xyz :ベクトル場の回転の動径成分を計算する
wr_DRad_wu :スペクトルデータに動径微分 ∂/∂r を作用させる
wr_DRad2_wu :スペクトルデータに動径微分 ∂^2/∂r^2 を作用させる
wr_DivRad_wu :スペクトルデータに発散型動径微分 1/r^2 ∂/∂r r^2 = ∂/∂r + 2/r を作用させる
wr_RotRad_wu :スペクトルデータに回転型動径微分 1/r ∂/∂rr = ∂/∂r + 1/r を作用させる
wr_Lapla_wu :スペクトルデータにラプラシアンを作用させる
xyr_GradLon_wu :スペクトルデータに勾配型経度微分 1/rcosφ・∂/∂λを作用させる
xyr_GradLat_wu :スペクトルデータに勾配型緯度微分 1/r・∂/∂φを作用させる
wr_DivLon_xyr :格子データに発散型経度微分 1/rcosφ・∂/∂λを作用させる
wr_DivLat_xyr :格子データに発散型緯度微分 1/rcosφ・∂(g cosφ)/∂φを作用させる
wr_Div_xyr_xyr_xyr :ベクトル成分である 3 つの格子データに 発散を作用させる
xyr_Div_xyr_xyr_xyr :ベクトル成分である 3 つの格子データに 発散を作用させる
xyr_RotLon_wu_wu :ベクトル場の回転の経度成分を計算する
xyr_RotLat_wu_wu :ベクトル場の回転の緯度成分を計算する
wr_RotRad_xyr_xyr :ベクトル場の回転の動径成分を計算する

トロイダルポロイダル計算用微分

wt_KxRGrad_wt :スペクトルデータに経度微分 k×r・▽ = ∂/∂λを作用させる
xyz_KGrad_wt :スペクトルデータに軸方向微分 k・▽ = cosφ/r ∂/∂φ + sinφ∂/∂r を 作用させる
wt_L2_wt :スペクトルデータに L2 演算子 = -水平ラプラシアンを 作用させる
wt_L2Inv_wt :スペクトルデータに L2 演算子の逆 = -逆水平ラプラシアンを 作用させる
wt_QOperator_wt :スペクトルデータに演算子 Q=(k・▽-1/2(L2 k・▽+ k・▽L2)) を 作用させる
wt_RadRot_xyz_xyz :ベクトル v の渦度と動径ベクトル r の内積 r・(▽×v) を計算する
wt_RadRotRot_xyz_xyz_xyz :ベクトルの v の r・(▽×▽×v) を計算する
wt_Potential2Vector :トロイダルポロイダルポテンシャルから ベクトル場を計算する
wt_Potential2Rotation :トロイダルポロイダルポテンシャルで表される 非発散ベクトル場の回転の各成分を計算する
wu_L2_wu :スペクトルデータに L2 演算子 = -水平ラプラシアンを作用させる
wu_L2Inv_wu :スペクトルデータに L2 演算子の逆 = -逆水平ラプラシアンを 作用させる
wu_QOperator_wu :スペクトルデータに演算子 Q=(k・▽-1/2(L2 k・▽+ k・▽L2)) を 作用させる
wu_RadRot_xyr_xyr :ベクトル v の渦度と動径ベクトル r の内積 r・(▽×v) を計算する
wr_RadRotRot_xyr_xyr_xyr :ベクトルの v の r・(▽×▽×v) を計算する
wu_Potential2Vector :トロイダルポロイダルポテンシャルから ベクトル場を計算する
wu_Potential2Rotation :トロイダルポロイダルポテンシャルで表される 非発散ベクトル場の回転の各成分を計算する

ポロイダル/トロイダルモデル用スペクトル解析

nmz_ToroidalEnergySpectrum_wt, nz_ToroidalEnergySpectrum_wt :トロイダルポテンシャルからエネルギーの球面調和函数各成分を計算する
nmz_PoloidalEnergySpectrum_wt, nz_PoloidalEnergySpectrum_wt :ポロイダルポテンシャルからエネルギーの球面調和函数各成分を計算する
nmr_ToroidalEnergySpectrum_wu, nr_ToroidalEnergySpectrum_wu :トロイダルポテンシャルからエネルギーの球面調和函数各成分を計算する
nmr_PoloidalEnergySpectrum_wu, nr_PoloidalEnergySpectrum_wu :ポロイダルポテンシャルからエネルギーの球面調和函数各成分を計算する

境界値問題

wt_BoundariesTau, wt_BoundariesGrid, wt_Boundaries :タウ法, 選点法
wt_TorBoundariesTau, wt_TorBoundariesGrid, wt_TorBoundaries :速度トロイダルポテンシャルの境界条件を球殻領域に適用する (タウ法,選点法)
wz_LaplaPol2Pol_wz, wt_LaplaPol2Pol_wt :球殻領域の速度ポロイダルポテンシャルΦを▽^2Φから求める (入出力がそれぞれチェビシェフ格子点,チェビシェフ係数)
wt_TorMagBoundariesTau, wt_TorMagBoundariesGrid, wt_TorMagBoundaries :磁場トロイダルポテンシャルの境界条件を球殻領域に適用する (タウ法, 選点法)
wt_PolMagBoundariesTau, wt_PolMagBoundariesGrid, wt_PolMagBoundaries :磁場トロイダルポテンシャル境界の境界条件を球殻領域に適用する (タウ法, 選点法)
wu_BoundaryTau, wu_BoundaryGrid, wu_Boundary :球領域にディリクレ, ノイマン境界条件を適用する (タウ法, 選点法)
wu_TorBoundaryTau, wu_TorBoundaryGrid, wu_TorBoundary :球領域の速度トロイダルポテンシャルの境界条件を適用する(タウ法,選点法)
wr_LaplaPol2Pol_wr, wu_LaplaPol2Pol_wu :球領域の速度ポロイダルポテンシャルΦを▽^2Φから求める (入出力がそれぞれチェビシェフ格子点,チェビシェフ係数)
wu_TorMagBoundaryTau, wu_TorMagBoundaryGrid, wu_TorMagBoundary :磁場トロイダルポテンシャルの境界条件を球領域に適用する(タウ法, 選点法)
wu_PolMagBoundaryTau, wu_PolMagBoundaryGrid, wu_PolMagBoundary :磁場トロイダルポテンシャル境界の境界条件を球領域に適用する (タウ法, 選点法)
wtu_TormagBoundariesTau, wtu_TormagBoundariesGrid :磁場トロイダルポテンシャル境界の境界条件を球および球殻領域全体に 適用する(タウ法, 選点法)

積分・平均(3 次元データ)

IntLonLatRad_xyz, AvrLonLatRad_xyz :3 次元格子点データの 全領域積分および平均
z_IntLonLat_xyz, z_AvrLonLat_xyz :3 次元格子点データの 緯度経度(水平・球面)積分および平均
y_IntLonRad_xyz, y_AvrLonRad_xyz :3 次元格子点データの 緯度動径積分および平均
z_IntLatRad_xyz, z_AvrLatRad_xyz :3 次元格子点データの 経度動径(子午面)積分および平均
yz_IntLon_xyz, yz_AvrLon_xyz :3 次元格子点データの 経度方向積分および平均
xz_IntLat_xyz, xz_AvrLat_xyz :3 次元格子点データの 緯度方向積分および平均
xz_IntRad_xyz, xz_AvrRad_xyz :3 次元格子点データの 動径方向積分および平均
IntLonLatRad_xyr, AvrLonLatRad_xyr :3 次元格子点データの 全領域積分および平均
z_IntLonLat_xyr, z_AvrLonLat_xyr :3 次元格子点データの 緯度経度(水平・球面)積分および平均
y_IntLonRad_xyr, y_AvrLonRad_xyr :3 次元格子点データの 緯度動径積分および平均
z_IntLatRad_xyr, z_AvrLatRad_xyr :3 次元格子点データの 経度動径(子午面)積分および平均
yz_IntLon_xyr, yz_AvrLon_xyr :3 次元格子点データの 経度方向積分および平均
xz_IntLat_xyr, xz_AvrLat_xyr :3 次元格子点データの 緯度方向積分および平均
xz_IntRad_xyr, xz_AvrRad_xyr :3 次元格子点データの 動径方向積分および平均

積分・平均(2 次元データ)

IntLonLat_xy, AvrLonLat_xy :2 次元格子点データの水平(球面)積分および平均
IntLonRad_xz, AvrLonRad_xz :2 次元(XZ)格子点データの経度動径積分 および平均
IntLatRad_yz, AvrLatRad_yz :2 次元(YZ)格子点データの緯度動径(子午面) 積分および平均
y_IntLon_xy, y_AvrLon_xy :水平 2 次元(球面)格子点データの経度方向 積分および平均
x_IntLat_xy, x_AvrLat_xy :水平2 次元(球面)格子点データの緯度方向積分 および平均
z_IntLon_xz, z_AvrLon_xz :2 次元(XZ)格子点データの経度方向積分および 平均
x_IntRad_xz, x_AvrRad_xz :2 次元(XZ)格子点データの動径方向積分および 平均
z_IntLat_yz, z_AvrLat_yz :2 次元(YZ)格子点データの緯度方向積分および 平均
y_IntRad_yz, y_AvrRad_yz :2 次元(YZ)格子点データの動径方向積分および 平均
IntLonRad_xr, AvrLonRad_xr :2 次元(XZ)格子点データの経度動径積分 および平均
IntLatRad_yr, AvrLatRad_yr :2 次元(YZ)格子点データの緯度動径(子午面) 積分および平均
r_IntLon_xr, r_AvrLon_xr :2 次元(XZ)格子点データの経度方向積分および 平均
x_IntRad_xr, x_AvrRad_xr :2 次元(XZ)格子点データの動径方向積分および 平均
r_IntLat_yr, r_AvrLat_yr :2 次元(YZ)格子点データの緯度方向積分および 平均
y_IntRad_yr, y_AvrRad_yr :2 次元(YZ)格子点データの動径方向積分および 平均

積分・平均(1 次元データ)

IntLon_x, AvrLon_x :1 次元(X)格子点データの経度方向積分および平均
IntLat_y, AvrLat_y :1 次元(Y)格子点データの緯度方向積分および平均
IntRad_z, AvrRad_z :1 次元(Z)格子点データの動径方向積分および平均
IntRad_r, AvrRad_r :1 次元(Z)格子点データの動径方向積分および平均

Methods

AvrLatRad_yr   AvrLatRad_yz   AvrLat_y   AvrLonLatRad_xyr   AvrLonLatRad_xyz   AvrLonLat_xy   AvrLonRad_xr   AvrLonRad_xz   AvrLon_x   AvrRad_r   AvrRad_z   IntLatRad_yr   IntLatRad_yz   IntLat_y   IntLonLatRad_xyr   IntLonLatRad_xyz   IntLonLat_xy   IntLonRad_xr   IntLonRad_xz   IntLon_x   IntRad_r   IntRad_z   Interpolate_wt   at_Dr_at   at_az   az_at   l_nm   l_nm   l_nm   l_nm   nm_l   nm_l   nmr_PoloidalEnergySpectrum_wu   nmr_ToroidalEnergySpectrum_wu   nmz_PoloidalEnergySpectrum_wt   nmz_ToroidalEnergySpectrum_wt   nr_PoloidalEnergySpectrum_wu   nr_ToroidalEnergySpectrum_wu   nz_PoloidalEnergySpectrum_wt   nz_ToroidalEnergySpectrum_wt   r_AvrLat_yr   r_AvrLonLat_xyr   r_AvrLon_xr   r_IntLat_yr   r_IntLonLat_xyr   r_IntLon_xr   t_Dr_t   w_xy   wr_DivLat_xyr   wr_DivLon_xyr   wr_DivRad_wu   wr_Div_xyr_xyr_xyr   wr_LaplaPol2Pol_wr   wr_Lapla_wu   wr_RAD   wr_RadRotRot_xyr_xyr_xyr   wr_RotRad_wu   wr_RotRad_xyr_xyr   wr_xyr   wt_Boundaries   wt_BoundariesGrid   wt_BoundariesTau   wt_DRad_wt   wt_DivLat_xyz   wt_DivLon_xyz   wt_DivRad_wt   wt_Div_xyz_xyz_xyz   wt_KxRGrad_wt   wt_L2Inv_wt   wt_L2_wt   wt_LaplaPol2PolGrid_wt   wt_Lapla_wt   wt_PolMagBoundaries   wt_PolmagBoundariesGrid   wt_PolmagBoundariesTau   wt_Potential2Rotation   wt_Potential2Vector   wt_QOperator_wt   wt_RadRotRot_xyz_xyz_xyz   wt_RadRot_xyz_xyz   wt_RotRad_wt   wt_RotRad_xyz_xyz   wt_TorBoundaries   wt_TorBoundariesGrid   wt_TorBoundariesTau   wt_TorMagBoundaries   wt_TormagBoundariesGrid   wt_TormagBoundariesTau   wt_VGradV   wt_VMiss   wt_wz   wt_xyz   wtu_Initial   wtu_PolMagBoundaries   wtu_PolmagBoundariesGrid   wtu_PolmagBoundariesTau   wtu_TorMagBoundaries   wtu_TormagBoundariesGrid   wtu_TormagBoundariesTau   wu_Boundary   wu_BoundaryGrid   wu_BoundaryTau   wu_KxRGrad_wu   wu_L2Inv_wu   wu_L2_wu   wu_LaplaPol2PolGrid_wu   wu_PolMagBoundary   wu_PolmagBoundaryGrid   wu_PolmagBoundaryTau   wu_Potential2Rotation   wu_Potential2Vector   wu_QOperator_wu   wu_RadRot_xyr_xyr   wu_TorBoundary   wu_TorBoundaryGrid   wu_TorBoundaryTau   wu_TorMagBoundary   wu_TormagBoundaryGrid   wu_TormagBoundaryTau   wu_VMiss   wu_xyr   wz_LaplaPol2Pol_wz   wz_RAD   wz_wt   wz_xyz   x_AvrLatRad_xyr   x_AvrLatRad_xyz   x_AvrLat_xy   x_AvrRad_xr   x_AvrRad_xz   x_IntLatRad_xyr   x_IntLatRad_xyz   x_IntLat_xy   x_IntRad_xr   x_IntRad_xz   x_Lon   x_Lon_Weight   xr_AvrLat_xyr   xr_IntLat_xyr   xy_AvrRad_xyr   xy_AvrRad_xyz   xy_IntRad_xyr   xy_IntRad_xyz   xy_Lat   xy_Lon   xy_w   xyr_Div_xyr_xyr_xyr   xyr_GradLat_wu   xyr_GradLon_wu   xyr_KGrad_wu   xyr_LAT   xyr_LON   xyr_RAD   xyr_RotLat_wu_wu   xyr_RotLon_wu_wu   xyr_wr   xyr_wu   xyz_Div_xyz_xyz_xyz   xyz_GradLat_wt   xyz_GradLon_wt   xyz_KGrad_wt   xyz_LAT   xyz_LON   xyz_RAD   xyz_RotLat_wt_wt   xyz_RotLon_wt_wt   xyz_wt   xyz_wz   xz_AvrLat_xyz   xz_IntLat_xyz   y_AvrLonRad_xyr   y_AvrLonRad_xyz   y_AvrLon_xy   y_AvrRad_yr   y_AvrRad_yz   y_IntLonRad_xyr   y_IntLonRad_xyz   y_IntLon_xy   y_IntRad_yr   y_IntRad_yz   y_Lat   y_Lat_Weight   yr_AvrLon_xyr   yr_IntLon_xyr   yz_AvrLon_xyz   yz_IntLon_xyz   z_AvrLat_yz   z_AvrLonLat_xyz   z_AvrLon_xz   z_IntLat_yz   z_IntLonLat_xyz   z_IntLon_xz   z_RAD   z_RAD_WEIGHT  

Included Modules

dc_message lumatrix wt_module wu_module

Public Instance methods

AvrLatRad_yr( yr ) result(AvrLatRad_yr)
Function :
AvrLatRad_yr :real(8)
: (out) 平均値
yr :real(8), dimension(1:jm,0:km), intent(in)
: (in) 2 次元緯度動径(子午面)格子点データ

緯度動径(子午面)積分

2 次元(YR)格子点データの緯度動径(子午面)平均

2 次元データ f(φ,r) に対して

   ∫f(φ,r) r^2cosφ dφdr /(2(r[o]^3-r[i]^3)/3)

を計算する.

Original external subprogram is wu_module#AvrLatRad_yr

AvrLatRad_yz( yz ) result(AvrLatRad_yz)
Function :
AvrLatRad_yz :real(8)
: (out) 平均値
yz :real(8), dimension(1:jm,0:km), intent(in)
: (in) 2 次元緯度動径(子午面)格子点データ

緯度動径(子午面)積分

2 次元(YZ)格子点データの緯度動径(子午面)平均

2 次元データ f(φ,r) に対して

   ∫f(φ,r) r^2cosφ dφdr /(2(r[o]^3-r[i]^3)/3)

を計算する.

Original external subprogram is wt_module#AvrLatRad_yz

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)方向平均(1 層用).

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

Original external subprogram is wt_module#AvrLat_y

AvrLonLatRad_xyr( xyr ) result(AvrLonLatRad_xyr)
Function :
AvrLonLatRad_xyr :real(8)
: (out) 全球平均値
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

緯度経度動径(全球)積分

3 次元格子点データの緯度経度動径(全球)積分

3 次元データ f(λ,φ,r) に対して

   ∫f(λ,φ,r) r^2cosφ dλdφdr /(4π(r[o]^3-r[i]^3)/3)

を計算する.

Original external subprogram is wu_module#AvrLonLatRad_xyr

AvrLonLatRad_xyz( xyz ) result(AvrLonLatRad_xyz)
Function :
AvrLonLatRad_xyz :real(8)
: (out) 全球平均値
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

緯度経度動径(全球)積分

3 次元格子点データの緯度経度動径(全球)積分

3 次元データ f(λ,φ,r) に対して

   ∫f(λ,φ,r) r^2cosφ dλdφdr /(4π(r[o]^3-r[i]^3)/3)

を計算する.

Original external subprogram is wt_module#AvrLonLatRad_xyz

AvrLonLat_xy( xy_data ) result(AvrLonLat_xy)
Function :
AvrLonLat_xy :real(8)
: (out) 平均値
xy_data(0:im-1,1:jm) :real(8), intent(in)
: (in) 2 次元経度緯度格子点データ

2 次元緯度経度格子点データの全領域平均(1 層用).

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

Original external subprogram is wt_module#AvrLonLat_xy

AvrLonRad_xr( xr ) result(AvrLonRad_xr)
Function :
AvrLonRad_xr :real(8)
: 積分値
xr :real(8), dimension(0:im-1,0:km), intent(in)
: (in)2 次元格子点データ

経度動径(緯度円)積分

2 次元(XR)格子点データの経度動径平均

2 次元データ f(λ,r) に対して

   ∫f(λ,r) r^2dλdr /(2π(r[o]^3-r[i]^3)/3)

を計算する.

Original external subprogram is wu_module#AvrLonRad_xr

AvrLonRad_xz( xz ) result(AvrLonRad_xz)
Function :
AvrLonRad_xz :real(8)
: 積分値
xz :real(8), dimension(0:im-1,0:km), intent(in)
: (in) 2 次元格子点データ

経度動径(緯度円)積分

2 次元(XZ)格子点データの経度動径平均

2 次元データ f(λ,r) に対して

   ∫f(λ,r) r^2dλdr /(2π(r[o]^3-r[i]^3)/3)

を計算する.

Original external subprogram is wt_module#AvrLonRad_xz

AvrLon_x( x_data ) result(AvrLon_x)
Function :
AvrLon_x :real(8)
: (out) 平均値
x_data(0:im-1) :real(8), intent(in)
: (in) 1 次元経度(X)格子点データ

1 次元(X)格子点データの経度(X)方向平均(1 層用).

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

Original external subprogram is wt_module#AvrLon_x

AvrRad_r( z ) result(AvrRad_r)
Function :
AvrRad_r :real(8)
: (out) 平均値
z :real(8), dimension(0:im-1,0:km), intent(in)
: (in) 1 次元動径格子点データ

1 次元(Z)格子点データの動径方向域平均.

1 次元データ f(r) に対して ∫f(r) r^2dr /((r[o]^3-r[i]^3)/3) を 計算する.

Original external subprogram is wu_module#AvrRad_r

AvrRad_z( z ) result(AvrRad_z)
Function :
AvrRad_z :real(8)
: (out) 平均値
z :real(8), dimension(0:km), intent(in)
: (in) 1 次元動径格子点データ

1 次元(Z)格子点データの動径方向域平均.

1 次元データ f(r) に対して ∫f(r) r^2dr /((r[o]^3-r[i]^3)/3) を 計算する.

Original external subprogram is wt_module#AvrRad_z

IntLatRad_yr( yr ) result(IntLatRad_yr)
Function :
IntLatRad_yr :real(8)
: (out) 積分値
yr :real(8), dimension(1:jm,0:km), intent(in)
: (in) 2 次元緯度動径(子午面)格子点データ

2 次元(YR)格子点データの緯度動径積分(子午面)および平均

2 次元データ f(φ,r) に対して ∫f(φ,r) r^2cosφ dφdr を計算する.

Original external subprogram is wu_module#IntLatRad_yr

IntLatRad_yz( yz ) result(IntLatRad_yz)
Function :
IntLatRad_yz :real(8)
: (out) 積分値
yz :real(8), dimension(1:jm,0:km), intent(in)
: (in) 2 次元緯度動径(子午面)格子点データ

2 次元(YZ)格子点データの緯度動径積分(子午面)および平均

2 次元データ f(φ,r) に対して ∫f(φ,r) r^2cosφ dφdr を計算する.

Original external subprogram is wt_module#IntLatRad_yz

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 方向積分(1 層用).

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

Original external subprogram is wt_module#IntLat_y

IntLonLatRad_xyr( xyr ) result(IntLonLatRad_xyr)
Function :
IntLonLatRad_xyr :real(8)
: (out) 全球積分値
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

緯度経度動径(全球)積分

3 次元格子点データの緯度経度動径(全球)積分

3 次元データ f(λ,φ,r) に対して

    ∫f(λ,φ,r) r^2cosφ dλdφdr

を計算する.

Original external subprogram is wu_module#IntLonLatRad_xyr

IntLonLatRad_xyz( xyz ) result(IntLonLatRad_xyz)
Function :
IntLonLatRad_xyz :real(8)
: (out) 全球積分値
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

緯度経度動径(全球)積分

3 次元格子点データの緯度経度動径(全球)積分

3 次元データ f(λ,φ,r) に対して

    ∫f(λ,φ,r) r^2cosφ dλdφdr

を計算する.

Original external subprogram is wt_module#IntLonLatRad_xyz

IntLonLat_xy( xy_data ) result(IntLonLat_xy)
Function :
IntLonLat_xy :real(8)
: (out) 積分値
xy_data(0:im-1,1:jm) :real(8), intent(in)
: (in) 2 次元経度緯度格子点データ(0:im-1,1:jm)

2 次元緯度経度格子点データの全領域積分(1 層用).

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

Original external subprogram is wt_module#IntLonLat_xy

IntLonRad_xr( xr ) result(IntLonRad_xr)
Function :
IntLonRad_xr :real(8)
: (out) 積分値
xr :real(8), dimension(0:im-1,0:km), intent(in)
: (in) 2 次元緯度動径格子点データ

経度動径(緯度円)積分

2 次元(XR)格子点データの経度動径積分

2 次元データ f(λ,r) に対して∫f(λ,r) r^2dλdr を計算する.

Original external subprogram is wu_module#IntLonRad_xr

IntLonRad_xz( xz ) result(IntLonRad_xz)
Function :
IntLonRad_xz :real(8)
: (out) 積分値
xz :real(8), dimension(0:im-1,0:km), intent(in)
: (in) 2 次元緯度動径格子点データ

経度動径(緯度円)積分

2 次元(XZ)格子点データの経度動径積分

2 次元データ f(λ,r) に対して∫f(λ,r) r^2dλdr を計算する.

Original external subprogram is wt_module#IntLonRad_xz

IntLon_x( x_data ) result(IntLon_x)
Function :
IntLon_x :real(8)
: (out) 積分値
x_data(0:im-1) :real(8), intent(in)
: (in) 1 次元経度(X)格子点データ

1 次元経度(X)格子点データの X 方向積分(1 層用).

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

Original external subprogram is wt_module#IntLon_x

IntRad_r( z ) result(IntRad_r)
Function :
IntRad_r :real(8)
: (out) 積分値
z :real(8), dimension(0:km), intent(in)
: (in) 1 次元動径格子点データ

動径積分

1 次元(Z)格子点データの動径方向域積分.

1 次元データ f(r) に対して ∫f(r) r^2dr を計算する.

Original external subprogram is wu_module#IntRad_r

IntRad_z( z ) result(IntRad_z)
Function :
IntRad_z :real(8)
: (out) 積分値
z :real(8), dimension(0:km), intent(in)
: (in) 1 次元動径格子点データ

動径積分

1 次元(Z)格子点データの動径方向域積分.

1 次元データ f(r) に対して ∫f(r) r^2dr を計算する.

Original external subprogram is wt_module#IntRad_z

Interpolate_wt( wt_data, alon, alat, arad ) result(Interpolate_wt)
Function :
Interpolate_wt :real(8)
: 補間した値
wt_data((nm+1)**2,0:km) :real(8), intent(IN)
: スペクトルデータ
alon :real(8), intent(IN)
: 補間する位置(経度)
alat :real(8), intent(IN)
: 補間する位置(緯度)
arad :real(8), intent(IN)
: 補間する位置(動径)

緯度 alon, 経度 alat 動径 arad における関数値を その球面調和変換係数 wa_data から補間計算する

Original external subprogram is wt_module#Interpolate_wt

at_Dr_at( at_data ) result(at_Dx_at)
Function :
at_Dx_at :real(8), dimension(size(at_data,1),0:size(at_data,2)-1)
: (out) チェビシェフデータの X 微分
at_data :real(8), dimension(:,0:), intent(in)
: (in) 入力チェビシェフデータ

入力チェビシェフデータに X 微分を作用する(2 次元配列用).

チェビシェフデータの X 微分とは, 対応する格子点データに X 微分を 作用させたデータのチェビシェフ変換のことである.

Original external subprogram is wt_module#at_Dr_at

at_az( ag_data ) result(at_ag)
Function :
at_ag :real(8), dimension(size(ag_data,1),0:km)
: (out) チェビシェフデータ
ag_data :real(8), dimension(:,:), intent(in)
: (in) 格子点データ

格子データからチェビシェフデータへ変換する(2 次元配列用).

Original external subprogram is wt_module#at_az

az_at( at_data ) result(ag_at)
Function :
ag_at :real(8), dimension(size(at_data,1),0:im)
: (out) 格子点データ
at_data :real(8), dimension(:,:), intent(in)
: (in) チェビシェフデータ

チェビシェフデータから格子データへ変換する(2 次元配列用).

Original external subprogram is wt_module#az_at

l_nm( n, m ) result(l_nm_array00)
Function :
l_nm_array00 :integer
: (out) スペクトルデータの格納位置
n :integer, intent(in)
: (in) 全波数
m :integer, intent(in)
: (in) 帯状波数

全波数(n)と東西波数(m)からそのスペクトルデータの格納位置を返す.

引数 n,m がともに整数値の場合, 整数値を返す.

Original external subprogram is wt_module#l_nm

l_nm( n, marray ) result(l_nm_array01)
Function :
l_nm_array01(size(marray)) :integer
: (out) スペクトルデータ位置
n :integer, intent(in)
: (in) 全波数
marray(:) :integer, intent(in)
: (in) 帯状波数

スペクトルデータの格納位置

全波数(n)と東西波数(m)からそのスペクトルデータの格納位置を返す.

第 1 引数 n が整数, 第 2 引数 marray が整数 1 次元配列の場合, marray と同じ大きさの 1 次元整数配列を返す.

Original external subprogram is wt_module#l_nm

l_nm( narray, m ) result(l_nm_array10)
Function :
l_nm_array10(size(narray)) :integer
: (out) スペクトルデータ位置
narray(:) :integer, intent(in)
: (in) 全波数
m :integer, intent(in)
: (in) 帯状波数

全波数(n)と東西波数(m)からそのスペクトルデータの格納位置を返す.

第 1 引数 narray が整数 1 次元配列, 第 2 引数 m が整数の場合, narray と同じ大きさの 1 次元整数配列を返す.

Original external subprogram is wt_module#l_nm

l_nm( narray, marray ) result(l_nm_array11)
Function :
l_nm_array11(size(narray)) :integer
: (out) スペクトルデータ位置
narray(:) :integer, intent(in)
: (in) 全波数
marray(:) :integer, intent(in)
: (in) 帯状波数

全波数(n)と東西波数(m)からそのスペクトルデータの格納位置を返す.

第 1,2 引数 narray, marray がともに整数 1 次元配列の場合, narray, marray と同じ大きさの 1 次元整数配列を返す. narray, marray は同じ大きさでなければならない.

Original external subprogram is wt_module#l_nm

nm_l( l ) result(nm_l_int)
Function :
nm_l_int(2) :integer
: (out) 全波数, 帯状波数
l :integer, intent(in)
: (in) スペクトルデータの格納位置

スペクトルデータの格納位置(l)から全波数(n)と東西波数(m)を返す.

引数 l が整数値の場合, 対応する全波数と帯状波数を 長さ 2 の 1 次元整数値を返す. nm_l(1) が全波数, nm_l(2) が帯状波数である.

Original external subprogram is wt_module#nm_l

nm_l( larray ) result(nm_l_array)
Function :
nm_l_array(size(larray),2) :integer
: (in) スペクトルデータの格納位置
larray(:) :integer, intent(in)
: (out) 全波数, 帯状波数

スペクトルデータの格納位置(l)から全波数(n)と東西波数(m)を返す.

引数 larray が整数 1 次元配列の場合, larray に対応する n, m を格納した 2 次元整数配列を返す. nm_l_array(:,1) が全波数, nm_l_array(:,2) が帯状波数である.

Original external subprogram is wt_module#nm_l

nmr_PoloidalEnergySpectrum_wu( wu_POLPOT ) result(nmr_PoloidalEnergySpectrum_wu)
Function :
nmr_PoloidalEnergySpectrum_wu :real(8), dimension(0:nm,-nm:nm,0:km)
: (out) エネルギースペクトルポロイダル成分
wu_POLPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ポロイダルポテンシャル

ポロイダルポテンシャルから, ポロイダルエネルギーの 球面調和函数全波数 n, 帯状波数 m の各成分を計算する.

 * 全波数 n, 帯状波数 m のポロイダルポテンシャルのスペクトル成分
   φ(n,m,r)から全波数 n, 帯状波数 m 成分のポロイダルエネルギー
   スペクトルは

     (1/2)n(n+1)4πr^2{[d(rφ(n,m,r))/dr]^2 + n(n+1)φ(n,m,r)^2}

   と計算される.

 * 全てのエネルギースペクトル成分の和を動径積分したもの(r^2の重み無し)
   が球殻内での全エネルギーに等しい.

 * データの存在しない全波数 n, 帯状波数 m の配列には欠損値が格納される.
   欠損値の値はモジュール変数 wu_VMiss によって設定できる
   (初期値は -999.0)

Original external subprogram is wu_module#nmr_PoloidalEnergySpectrum_wu

nmr_ToroidalEnergySpectrum_wu( wu_TORPOT ) result(nmr_ToroidalEnergySpectrum_wu)
Function :
nmr_ToroidalEnergySpectrum_wu :real(8), dimension(0:nm,-nm:nm,0:km)
: (out) エネルギースペクトルトロイダル成分
wu_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) トロイダルポテンシャル

トロイダルポテンシャルから, トロイダルエネルギーの 球面調和函数全波数 n, 帯状波数 m の各成分を計算する

 * 全波数 n, 帯状波数 m のトロイダルポテンシャルのスペクトル成分
   ψ(n,m,r)から全波数 n, 帯状波数 m 成分のトロイダルエネルギー
   スペクトルは  (1/2)n(n+1)4πr^2ψ(n,m,r)^2  と計算される.

 * 全てのエネルギースペクトル成分の和を動径積分したもの(r^2の重み無し)
   が球殻内での全エネルギーに等しい.

 * データの存在しない全波数 n, 帯状波数 m の配列には欠損値が格納される.
   wu_VMiss によって設定できる (初期値は -999.0)

Original external subprogram is wu_module#nmr_ToroidalEnergySpectrum_wu

nmz_PoloidalEnergySpectrum_wt( wt_POLPOT ) result(nmz_PoloidalEnergySpectrum_wt)
Function :
nmz_PoloidalEnergySpectrum_wt :real(8), dimension(0:nm,-nm:nm,0:km)
: (out) エネルギースペクトルポロイダル成分
wt_POLPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ポロイダルポテンシャル

ポロイダルポテンシャルから, ポロイダルエネルギーの 球面調和函数全波数 n, 帯状波数 m の各成分を計算する.

 * 全波数 n, 帯状波数 m のポロイダルポテンシャルのスペクトル成分
   φ(n,m,r)から全波数 n, 帯状波数 m 成分のポロイダルエネルギー
   スペクトルは

     (1/2)n(n+1)4πr^2{[d(rφ(n,m,r))/dr]^2 + n(n+1)φ(n,m,r)^2}

   と計算される.

 * 全てのエネルギースペクトル成分の和を動径積分したもの(r^2の重み無し)
   が球殻内での全エネルギーに等しい.

 * データの存在しない全波数 n, 帯状波数 m の配列には欠損値が格納される.
   欠損値の値はモジュール変数 wt_VMiss によって設定できる
   (初期値は -999.0)

Original external subprogram is wt_module#nmz_PoloidalEnergySpectrum_wt

nmz_ToroidalEnergySpectrum_wt( wt_TORPOT ) result(nmz_ToroidalEnergySpectrum_wt)
Function :
nmz_ToroidalEnergySpectrum_wt :real(8), dimension(0:nm,-nm:nm,0:km)
: (out) エネルギースペクトルトロイダル成分
wt_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) トロイダルポテンシャル

トロイダルポテンシャルから, トロイダルエネルギーの 球面調和函数全波数 n, 帯状波数 m の各成分を計算する

 * 全波数 n, 帯状波数 m のトロイダルポテンシャルのスペクトル成分
   ψ(n,m,r)から全波数 n, 帯状波数 m 成分のトロイダルエネルギー
   スペクトルは  (1/2)n(n+1)4πr^2ψ(n,m,r)^2  と計算される.

 * 全てのエネルギースペクトル成分の和を動径積分したもの(r^2の重み無し)
   が球殻内での全エネルギーに等しい.

 * データの存在しない全波数 n, 帯状波数 m の配列には欠損値が格納される.
   wt_VMiss によって設定できる (初期値は -999.0)

Original external subprogram is wt_module#nmz_ToroidalEnergySpectrum_wt

nr_PoloidalEnergySpectrum_wu( wu_POLPOT ) result(nr_PoloidalEnergySpectrum_wu)
Function :
nr_PoloidalEnergySpectrum_wu :real(8), dimension(0:nm,0:km)
: (out) エネルギースペクトルポロイダル成分
wu_POLPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ポロイダルポテンシャル

ポロイダルポテンシャルから, ポロイダルエネルギーの 球面調和函数全波数の各成分を計算する

 * 全波数 n, 帯状波数 m のポロイダルポテンシャルのスペクトル成分
   φ(n,m,r)から全波数 n 成分のポロイダルエネルギースペクトルは

     Σ[m=-n]^n ((1/2)n(n+1)4πr^2{[d(rφ(n,m,r))/dr]^2
                + n(n+1)φ(n,m,r)^2}

   と計算される.

 * 全ての全波数に対してのエネルギースペクトル成分の和を動径積分したもの
   (r^2の重み無し)が球殻内での全エネルギーに等しい.

Original external subprogram is wu_module#nr_PoloidalEnergySpectrum_wu

nr_ToroidalEnergySpectrum_wu( wu_TORPOT ) result(nr_ToroidalEnergySpectrum_wu)
Function :
nr_ToroidalEnergySpectrum_wu :real(8), dimension(0:nm,0:km)
: (out) エネルギースペクトルトロイダル成分
wu_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) トロイダルポテンシャル

トロイダルポテンシャルから, トロイダルエネルギーの 球面調和函数全波数の各成分を計算する.

 * 全波数 n, 帯状波数 m のトロイダルポテンシャルのスペクトル成分
   ψ(n,m,r)から全波数 n 成分のトロイダルエネルギースペクトルは
   Σ[m=-n]^n(1/2)n(n+1)4πr^2ψ(n,m,r)^2 と計算される.
  • 全てのエネルギースペクトル成分の和を動径積分したもの(r^2の重み無し)
     が球殻内での全エネルギーに等しい.
    

Original external subprogram is wu_module#nr_ToroidalEnergySpectrum_wu

nz_PoloidalEnergySpectrum_wt( wt_POLPOT ) result(nz_PoloidalEnergySpectrum_wt)
Function :
nz_PoloidalEnergySpectrum_wt :real(8), dimension(0:nm,0:km)
: (out) エネルギースペクトルポロイダル成分
wt_POLPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ポロイダルポテンシャル

ポロイダルポテンシャルから, ポロイダルエネルギーの 球面調和函数全波数の各成分を計算する

 * 全波数 n, 帯状波数 m のポロイダルポテンシャルのスペクトル成分
   φ(n,m,r)から全波数 n 成分のポロイダルエネルギースペクトルは

     Σ[m=-n]^n ((1/2)n(n+1)4πr^2{[d(rφ(n,m,r))/dr]^2
                + n(n+1)φ(n,m,r)^2}

   と計算される.

 * 全ての全波数に対してのエネルギースペクトル成分の和を動径積分したもの
   (r^2の重み無し)が球殻内での全エネルギーに等しい.

Original external subprogram is wt_module#nz_PoloidalEnergySpectrum_wt

nz_ToroidalEnergySpectrum_wt( wt_TORPOT ) result(nz_ToroidalEnergySpectrum_wt)
Function :
nz_ToroidalEnergySpectrum_wt :real(8), dimension(0:nm,0:km)
: (out) エネルギースペクトルトロイダル成分
wt_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) トロイダルポテンシャル

トロイダルポテンシャルから, トロイダルエネルギーの 球面調和函数全波数の各成分を計算する.

 * 全波数 n, 帯状波数 m のトロイダルポテンシャルのスペクトル成分
   ψ(n,m,r)から全波数 n 成分のトロイダルエネルギースペクトルは
   Σ[m=-n]^n(1/2)n(n+1)4πr^2ψ(n,m,r)^2 と計算される.
  • 全てのエネルギースペクトル成分の和を動径積分したもの(r^2の重み無し)
     が球殻内での全エネルギーに等しい.
    

Original external subprogram is wt_module#nz_ToroidalEnergySpectrum_wt

r_AvrLat_yr( yr ) result(r_AvrLat_yr)
Function :
r_AvrLat_yr :real(8), dimension(0:km)
: (out) 緯度平均された 1 次元動径格子点データ
yr :real(8), dimension(1:jm,0:km), intent(in)
: (in) 2 次元緯度動径(子午面)格子点データ

2 次元(YR)格子点データの緯度方向域平均.

2 次元データ f(φ,r) に対して ∫f(φ,r) cosφ dφ/2 を計算する.

Original external subprogram is wu_module#r_AvrLat_yr

r_AvrLonLat_xyr( xyr ) result(r_AvrLonLat_xyr)
Function :
r_AvrLonLat_xyr :real(8), dimension(0:km)
: (out) 緯度経度(水平, 球面)平均された 1 次元動径格子点データ
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

緯度経度(水平)積分

3 次元格子点データの緯度経度(水平, 球面)積分

3 次元データ f(λ,φ,r) に対して

   ∫f(λ,φ,r) cosφ dλdφ /4π

を計算する.

Original external subprogram is wu_module#r_AvrLonLat_xyr

r_AvrLon_xr( xr ) result(r_AvrLon_xr)
Function :
r_AvrLon_xr :real(8), dimension(0:km)
: (out) 経度平均された 1 次元動径格子点データ
xr :real(8), dimension(0:im-1,0:km), intent(in)
: (in) 2 次元緯度動径格子点データ

経度(帯状)積分

2 次元(XR)格子点データの経度方向平均.

2 次元データ f(λ,r) に対して ∫f(λ,r)dλ/2π を計算する.

Original external subprogram is wu_module#r_AvrLon_xr

r_IntLat_yr( yr ) result(r_IntLat_yr)
Function :
r_IntLat_yr :real(8), dimension(0:km)
: (out) 緯度積分された 1 次元動径格子点データ
yr :real(8), dimension(jm,0:km), intent(in)
: (in) 2 次元緯度動径(子午面)格子点データ

緯度積分

2 次元(YR)格子点データの緯度方向域積分.

2 次元データ f(φ,r) に対して∫f(φ,r) cosφ dφ を計算する.

Original external subprogram is wu_module#r_IntLat_yr

r_IntLonLat_xyr( xyr ) result(r_IntLonLat_xyr)
Function :
r_IntLonLat_xyr :real(8), dimension(0:km)
: (out) 緯度経度(水平, 球面)積分された 1 次元動径格子点データ
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

緯度経度(水平)積分

3 次元格子点データの緯度経度(水平, 球面)積分

3 次元データ f(λ,φ,r) に対して

   ∫f(λ,φ,r) cosφ dλdφ

を計算する.

Original external subprogram is wu_module#r_IntLonLat_xyr

r_IntLon_xr( xr ) result(r_IntLon_xr)
Function :
r_IntLon_xr :real(8), dimension(0:km)
: (out) 経度積分された 1 次元動径格子点データ
xr :real(8), dimension(0:im-1,0:km), intent(in)
: (in) 2 次元緯度動径格子点データ

2 次元(XR)格子点データの経度方向積分.

2 次元データ f(λ,r) に対して ∫f(λ,r)dλ を計算する.

Original external subprogram is wu_module#r_IntLon_xr

t_Dr_t( t_data ) result(t_Dx_t)
Function :
t_Dx_t :real(8), dimension(size(t_data))
: (out) チェビシェフデータの X 微分
t_data :real(8), dimension(:), intent(in)
: (in) 入力チェビシェフデータ

入力チェビシェフデータに X 微分を作用する(1 次元配列用).

チェビシェフデータの X 微分とは, 対応する格子点データに X 微分を 作用させたデータのチェビシェフ変換のことである.

Original external subprogram is wt_module#t_Dr_t

w_xy( xy_data, [ipow], [iflag] ) result(w_xy)
Function :
w_xy((nm+1)*(nm+1)) :real(8)
: (out) スペクトルデータ
xy_data(0:im-1,1:jm) :real(8), intent(in)
: (in) 格子点データ
ipow :integer, intent(in), optional
: (in) 変換時に同時に作用させる 1/cosφ の次数. 省略時は 0.
iflag :integer, intent(in), optional
: 変換の種類
   0 : 通常の正変換
  -1 : 経度微分を作用させた正変換
   1 : 緯度微分 1/cosφ・∂(f cos^2φ)/∂φ を作用させた正変換
   2 : sinφを作用させた正変換
 省略時は 0.

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

Original external subprogram is wt_module#w_xy

wr_DivLat_xyr( xyr ) result(wr_DivLat_xyr)
Function :
wr_DivLat_xyr :real(8), dimension((nm+1)*(nm+1),0:km)
: (out) 発散型緯度微分を作用された水平スペクトル動径格子点データ
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

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

Original external subprogram is wu_module#wr_DivLat_xyr

wr_DivLon_xyr( xyr ) result(wr_DivLon_xyr)
Function :
wr_DivLon_xyr :real(8), dimension((nm+1)*(nm+1),0:km)
: (out) 発散型経度微分を作用された水平スペクトル動径格子点データ
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

格子点データに発散型経度微分 1/rcosφ・∂/∂λ を作用させた スペクトルデータを返す.

Original external subprogram is wu_module#wr_DivLon_xyr

wr_DivRad_wu( wu ) result(wr_DivRad_wu)
Function :
wr_DivRad_wu :real(8), dimension((nm+1)*(nm+1),0:km)
: (out) 発散型動径微分を作用された水平スペクトル動径格子点データ
wu :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

入力スペクトルデータに発散型動径微分

      1/r^2 ∂/∂r (r^2 .)= ∂/∂r + 2/r

を作用する.

スペクトルデータの発散型動径微分とは, 対応する格子点データに 発散型動径微分を作用させたデータのスペクトル変換のことである.

Original external subprogram is wu_module#wr_DivRad_wu

wr_Div_xyr_xyr_xyr( xyr_Vlon, xyr_Vlat, xyr_Vrad ) result(wr_Div_xyr_xyr_xyr)
Function :
wr_Div_xyr_xyr_xyr :real(8), dimension((nm+1)*(nm+1),0:km)
: (out) ベクトル場の発散
xyr_Vlon :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の経度成分
xyr_Vlat :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の緯度成分
xyr_Vrad :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の動径成分

べクトル成分である 3 つの格子データに発散を作用させた スペクトルデータを返す.

第 1, 2 ,3 引数(u,v,w)がそれぞれベクトルの経度成分, 緯度成分, 動径成分を表し, 発散は

     1/rcosφ・∂u/∂λ + 1/rcosφ・∂(v cosφ)/∂φ
   + 1/r^2 ∂/∂r (r^2 w)

と計算される.

Original external subprogram is wu_module#wr_Div_xyr_xyr_xyr

wr_LaplaPol2Pol_wr( wr, [cond], [new] ) result(wr_LaplaPol2Pol_wr)
Function :
wr_LaplaPol2Pol_wr :real(8), dimension((nm+1)*(nm+1),0:km)
: (out) 出力ポロイダルポテンシャル分布
wr :real(8), dimension((nm+1)*(nm+1),0:km),intent(in)
: (in) 入力▽^2φ分布
cond :character(len=1), intent(in), optional
: (in) 境界条件スイッチ. 省略時は ‘R‘
    R    : 上側粘着条件
    F    : 上側応力なし条件
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

速度ポロイダルポテンシャルΦを▽^2Φから計算する.

チェビシェフ格子点空間で境界条件を適用している. この関数を用いるためには wu_Initial にて設定する チェビシェフ切断波数(lm)と鉛直格子点数(km)を等しく しておく必要がある.

速度ポロイダルポテンシャルΦを f = ▽^2Φから定める式は

  ▽^2Φ = f
    Φ = const. at Boundary.
    ∂Φ/∂r = 0 at Boundary           (粘着条件)
    or ∂^2Φ/∂r^2 = 0 at Boundary    (応力なし条件)

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Original external subprogram is wu_module#wr_LaplaPol2Pol_wr

wr_Lapla_wu( wu ) result(wr_Lapla_wu)
Function :
wr_Lapla_wu :real(8), dimension((nm+1)*(nm+1),0:km)
: (out) ラプラシアンを作用された水平スペクトル動径格子点データ
wu :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

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

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

を作用する.

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

Original external subprogram is wu_module#wr_Lapla_wu

wr_RAD
Variable :
wr_RAD :real(8), dimension(:,:), allocatable
: 座標

Original external subprogram is wu_module#wr_RAD

wr_RadRotRot_xyr_xyr_xyr( xyr_VLON, xyr_VLAT, xyr_VRAD ) result(wr_RadRotRot_xyr_xyr_xyr)
Function :
wr_RadRotRot_xyr_xyr_xyr :real(8), dimension((nm+1)*(nm+1),0:km)
: (out) ベクトル v の r・(▽×▽×v)
xyr_VLON :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトルの経度成分
xyr_VLAT :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトルの緯度成分
xyr_VRAD :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトルの動径成分

ベクトル v に対して r・(▽×▽×v) を計算する.

第 1, 2, 3 引数(v[λ], v[φ], v[r])がそれぞれベクトルの経度成分, 緯度成分, 動径成分を表す.

   r・(▽×▽×v)  = 1/r ∂/∂r (r・( 1/cosφ・∂v[λ]/∂λ
                                 + 1/cosφ・∂(v[φ] cosφ)/∂φ ) )
                    + L^2 v[r]/r

のスペクトルデータが返される.

Original external subprogram is wu_module#wr_RadRotRot_xyr_xyr_xyr

wr_RotRad_wu( wu ) result(wr_RotRad_wu)
Function :
wr_RotRad_wu :real(8), dimension((nm+1)*(nm+1),0:km)
: (out) 回転型動径微分を作用された水平スペクトル動径格子点データ
wu :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

入力スペクトルデータに回転型動径微分

     1/r ∂(r.)/∂r = ∂(.)/∂r + (.)/r

を作用する.

スペクトルデータの回転型動径微分とは, 対応する格子点データに 回転型動径微分を作用させたデータのスペクトル変換のことである.

Original external subprogram is wu_module#wr_RotRad_wu

wr_RotRad_xyr_xyr( xyr_Vlat, xyr_Vlon ) result(wr_RotRad_xyr_xyr)
Function :
wr_RotRad_xyr_xyr :real(8), dimension((nm+1)*(nm+1),0:km)
: (out) ベクトル場の回転の動径成分
xyr_Vlat :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の緯度成分
xyr_Vlon :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の経度成分

ベクトルの緯度成分, 経度成分である第 1, 2 引数 Vlat, Vlon に対して ベクトル場の回転の動径成分

   1/rcosφ・∂Vlat/∂λ - 1/rcosφ・∂(Vlon cosφ)/∂φ

を計算する.

Original external subprogram is wu_module#wr_RotRad_xyr_xyr

wr_xyr( xyr ) result(wr_xyr)
Function :
wr_xyr :real(8), dimension((nm+1)*(nm+1),0:km)
: (out) 2 次元球面調和函数スペクトル・動径格子点データ
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

3 次元格子データから水平スペクトル・動径格子点データへ(正)変換する.

Original external subprogram is wu_module#wr_xyr

wt_Boundaries( wt, [values], [cond] )
Subroutine :
wt :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
values :real(8), dimension((nm+1)*(nm+1),2), intent(in), optional
: (in) 境界での 値/勾配 分布を水平スペクトル変換したものを与える.
    省略時は値/勾配 0 となる.
cond :character(len=2), intent(in), optional
: (in) 境界条件. 省略時は ‘DD‘
       DD : 両端ディリクレ条件
       DN : 上端ディリクレ, 下端ノイマン条件
       ND : 上端ノイマン, 下端ディリクレ条件
       NN : 両端ノイマン条件

スペクトルデータにディリクレ・ノイマン境界条件を適用する Chebyshev 空間での境界条件適用(タウ法)

チェビシェフ空間において境界条件を満たすべく高次の係数を 定める方法をとっている(タウ法).

Original external subprogram is wt_module#wt_Boundaries

wt_BoundariesGrid( wt, [values], [cond] )
Subroutine :
wt :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
values :real(8), dimension((nm+1)*(nm+1),2), intent(in), optional
: (in) 境界での 値/勾配 分布を水平スペクトル変換したものを与える.
   省略時は値/勾配 0 となる.
cond :character(len=2), intent(in), optional
: (in) 境界条件. 省略時は ‘DD‘
       DD : 両端ディリクレ条件
       DN : 上端ディリクレ, 下端ノイマン条件
       ND : 上端ノイマン, 下端ディリクレ条件
       NN : 両端ノイマン条件

スペクトルデータにディリクレ・ノイマン境界条件を適用する 実空間での境界条件適用

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法). このルーチンを用いるためには wt_Initial にて設定するチェビシェフ切断波数(lm)と鉛直格子点数(km)を 等しくしておく必要がある.

Original external subprogram is wt_module#wt_BoundariesGrid

wt_BoundariesTau( wt, [values], [cond] )
Subroutine :
wt :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
values :real(8), dimension((nm+1)*(nm+1),2), intent(in), optional
: (in) 境界での 値/勾配 分布を水平スペクトル変換したものを与える.
    省略時は値/勾配 0 となる.
cond :character(len=2), intent(in), optional
: (in) 境界条件. 省略時は ‘DD‘
       DD : 両端ディリクレ条件
       DN : 上端ディリクレ, 下端ノイマン条件
       ND : 上端ノイマン, 下端ディリクレ条件
       NN : 両端ノイマン条件

スペクトルデータにディリクレ・ノイマン境界条件を適用する Chebyshev 空間での境界条件適用(タウ法)

チェビシェフ空間において境界条件を満たすべく高次の係数を 定める方法をとっている(タウ法).

Original external subprogram is wt_module#wt_BoundariesTau

wt_DRad_wt( wt ) result(wt_DRad_wt)
Function :
wt_DRad_wt :real(8), dimension((nm+1)*(nm+1),0:lm)
: (in) 動径微分された2 次元球面調和函数チェビシェフスペクトルデータ
wt :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

入力スペクトルデータに動径微分 ∂/∂r を作用する.

スペクトルデータの動径微分とは, 対応する格子点データに動径微分を 作用させたデータのスペクトル変換のことである.

Original external subprogram is wt_module#wt_DRad_wt

wt_DivLat_xyz( xyz ) result(wt_DivLat_xyz)
Function :
wt_DivLat_xyz :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) 発散型緯度微分を作用された 2 次元スペクトルデータ
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

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

Original external subprogram is wt_module#wt_DivLat_xyz

wt_DivLon_xyz( xyz ) result(wt_DivLon_xyz)
Function :
wt_DivLon_xyz :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) 発散型経度微分を作用された 2 次元スペクトルデータ
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

格子点データに発散型経度微分 1/rcosφ・∂/∂λ を作用させた スペクトルデータを返す.

Original external subprogram is wt_module#wt_DivLon_xyz

wt_DivRad_wt( wt ) result(wt_DivRad_wt)
Function :
wt_DivRad_wt :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) 発散型動径微分を作用された 2 次元スペクトルデータ
wt :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

入力スペクトルデータに発散型動径微分

      1/r^2 ∂/∂r (r^2 .)= ∂/∂r + 2/r

を作用する.

スペクトルデータの発散型動径微分とは, 対応する格子点データに 発散型動径微分を作用させたデータのスペクトル変換のことである.

Original external subprogram is wt_module#wt_DivRad_wt

wt_Div_xyz_xyz_xyz( xyz_Vlon, xyz_Vlat, xyz_Vrad ) result(wt_Div_xyz_xyz_xyz)
Function :
wt_Div_xyz_xyz_xyz :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) ベクトル場の発散
xyz_Vlon :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の経度成分
xyz_Vlat :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の緯度成分
xyz_Vrad :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の動径成分

べクトル成分である 3 つの格子データに発散を作用させた スペクトルデータを返す.

第 1, 2 ,3 引数(u,v,w)がそれぞれベクトルの経度成分, 緯度成分, 動径成分を表し, 発散は

     1/rcosφ・∂u/∂λ + 1/rcosφ・∂(v cosφ)/∂φ
   + 1/r^2 ∂/∂r (r^2 w)

と計算される.

Original external subprogram is wt_module#wt_Div_xyz_xyz_xyz

wt_KxRGrad_wt( wt ) result(wt_KxRGrad_wt)
Function :
wt_KxRGrad_wt :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) 経度微分を作用された 2 次元スペクトルデータ
wt :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

入力スペクトルデータに経度微分 k×r・▽ = ∂/∂λを作用する.

Original external subprogram is wt_module#wt_KxRGrad_wt

wt_L2Inv_wt( wt ) result(wt_L2Inv_wt)
Function :
wt_L2Inv_wt :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) L^2 演算子の逆演算を作用された 2 次元スペクトルデータ
wt :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

入力スペクトルデータに L^2 演算子の逆演算(-逆水平ラプラシアン)を 作用する.

スペクトルデータに L^2 演算子を作用させる関数 wt_L2_wt の逆計算を 行う関数である.

Original external subprogram is wt_module#wt_L2Inv_wt

wt_L2_wt( wt ) result(wt_L2_wt)
Function :
wt_L2_wt :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) L^2 演算子を作用された 2 次元スペクトルデータ
wt :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

入力スペクトルデータに L^2 演算子(=-水平ラプラシアン)を作用する.

L^2 演算子は単位球面上の水平ラプラシアンの逆符号にあたる.

 入力スペクトルデ ータに対応する格子点データに演算子

    L^2 = -1/cos^2φ・∂^2/∂λ^2 - 1/cosφ・∂/∂φ(cosφ∂/∂φ)

を作用させたデータのスペクトル変換が返される.

Original external subprogram is wt_module#wt_L2_wt

wt_LaplaPol2PolGrid_wt( wt, [cond], [new] ) result(wt_LaplaPol2PolGrid_wt)
Function :
wt_LaplaPol2PolGrid_wt :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) 出力ポロイダルポテンシャル分布
wt :real(8), dimension((nm+1)*(nm+1),0:lm),intent(in)
: (in) 入力▽^2φ分布
cond :character(len=2), intent(in), optional
: (in) 境界条件スイッチ. 省略時は ‘RR‘
    RR    : 両端粘着条件
    RF    : 上端粘着, 下端応力なし条件
    FR    : 上端応力なし, 下端粘着条件
    FF    : 両端応力なし条件
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

速度ポロイダルポテンシャルΦを▽^2Φから計算する. チェビシェフ格子点空間で境界条件を適用している.

この関数を用いるためには wt_Initial にて設定する チェビシェフ切断波数(lm)と鉛直格子点数(km)を等しく しておく必要がある.

速度ポロイダルポテンシャルΦを f = ▽^2Φから定める式は

   ▽^2Φ = f
     Φ = const. at boundaries.
     ∂Φ/∂r = 0 at boundaries          (粘着条件)
     or ∂^2Φ/∂r^2 = 0 at boundaries   (応力なし条件)

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

最終的にチェビシェフ係数の解が欲しい場合には, wz_LaplaPol2Pol_wz に 比べてチェビシェフ — 格子点変換が 1 回分少なくて済む.

Original external subprogram is wt_module#wt_LaplaPol2PolGrid_wt

wt_Lapla_wt( wt ) result(wt_Lapla_wt)
Function :
wt_Lapla_wt :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) ラプラシアンを作用された 2 次元スペクトルデータ
wt :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

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

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

を作用する.

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

Original external subprogram is wt_module#wt_Lapla_wt

wt_PolMagBoundaries( wt_POL, [new] )
Subroutine :
wt_POL :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

磁場ポロイダルポテンシャルに対して境界条件を適用する. Chebyshev 空間での境界条件適用

チェビシェフ空間において境界条件を満たすべく高次の係数を定める方法を とっている(タウ法). 現在のところ境界物質が非電気伝導体の場合のみ 対応している. その場合, 磁場ポロイダルポテンシャルの各水平スペクトル 成分 h にたいして境界条件が与えられ,

 * 外側境界 : dh/dr + (n+1)h/r = 0
 * 内側境界 : dh/dr - nh/r = 0

である. ここで n は h の水平全波数である.

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Original external subprogram is wt_module#wt_PolMagBoundaries

wt_PolmagBoundariesGrid( wt_POL, [new] )
Subroutine :
wt_POL :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

磁場ポロイダルポテンシャルに対して境界条件を適用する. 鉛直実空間での境界条件適用.

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法). このルーチンを用いるためには wt_Initial にて設定するチェビシェフ切断波数(lm)と鉛直格子点数(km)を 等しくしておく必要がある.

現在のところ境界物質が非電気伝導体の場合のみ対応している. その場合, 磁場ポロイダルポテンシャルの各水平スペクトル成分 h に たいして境界条件が与えられ,

 * 外側境界 : dh/dr + (n+1)h/r = 0
 * 内側境界 : dh/dr - nh/r = 0

である. ここで n は h の水平全波数である.

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Original external subprogram is wt_module#wt_PolmagBoundariesGrid

wt_PolmagBoundariesTau( wt_POL, [new] )
Subroutine :
wt_POL :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

磁場ポロイダルポテンシャルに対して境界条件を適用する. Chebyshev 空間での境界条件適用

チェビシェフ空間において境界条件を満たすべく高次の係数を定める方法を とっている(タウ法). 現在のところ境界物質が非電気伝導体の場合のみ 対応している. その場合, 磁場ポロイダルポテンシャルの各水平スペクトル 成分 h にたいして境界条件が与えられ,

 * 外側境界 : dh/dr + (n+1)h/r = 0
 * 内側境界 : dh/dr - nh/r = 0

である. ここで n は h の水平全波数である.

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Original external subprogram is wt_module#wt_PolmagBoundariesTau

wt_Potential2Rotation( xyz_RotVLON, xyz_RotVLAT, xyz_RotVRAD, wt_TORPOT, wt_POLPOT )
Subroutine :
xyz_RotVLON :real(8), dimension(0:im-1,1:jm,0:km), intent(OUT)
: (out) 回転の経度成分
xyz_RotVLAT :real(8), dimension(0:im-1,1:jm,0:km), intent(OUT)
: (out) 回転の緯度成分
xyz_RotVRAD :real(8), dimension(0:im-1,1:jm,0:km), intent(OUT)
: (out) 回転の動径成分
wt_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) トロイダルポテンシャル
wt_POLPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ポロイダルポテンシャル

トロイダルポロイダルポテンシャルΨ,Φで表される非発散ベクトル場

    v = ▽x(Ψr) + ▽x▽x(Φr)

に対して, その回転

    ▽xv = ▽x▽x(Ψr) + ▽x▽x▽x(Φr) = ▽x▽x(Ψr) - ▽x((▽^2Φ)r)

を計算する.

Original external subprogram is wt_module#wt_Potential2Rotation

wt_Potential2Vector( xyz_VLON, xyz_VLAT, xyz_VRAD, wt_TORPOT, wt_POLPOT )
Subroutine :
xyz_VLON :real(8), dimension(0:im-1,1:jm,0:km)
: (out) ベクトル場の経度成分
xyz_VLAT :real(8), dimension(0:im-1,1:jm,0:km)
: (out) ベクトル場の緯度成分
xyz_VRAD :real(8), dimension(0:im-1,1:jm,0:km)
: (out) ベクトル場の動径成分
wt_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) トロイダルポテンシャル
wt_POLPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ポロイダルポテンシャル

トロイダルポロイダルポテンシャルΨ,Φで表される非発散ベクトル場

    v = ▽x(Ψr) + ▽x▽x(Φr)

の各成分を計算する

Original external subprogram is wt_module#wt_Potential2Vector

wt_QOperator_wt( wt ) result(wt_QOperator_wt)
Function :
wt_QOperator_wt :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) Q 演算子を作用された 2 次元スペクトルデータ
wt :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

入力スペクトルデータに対応する格子点データに演算子

   Q=(k・▽-1/2(L2 k・▽+ k・▽L2))

を作用させたデータのスペクトル変換が返される.

Original external subprogram is wt_module#wt_QOperator_wt

wt_RadRotRot_xyz_xyz_xyz( xyz_VLON, xyz_VLAT, xyz_VRAD ) result(wt_RadRotRot_xyz_xyz_xyz)
Function :
wt_RadRotRot_xyz_xyz_xyz :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) ベクトル v の r・(▽×▽×v)
xyz_VLON :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトルの経度成分
xyz_VLAT :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトルの緯度成分
xyz_VRAD :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトルの動径成分

ベクトル v に対して r・(▽×▽×v) を計算する.

第 1, 2, 3 引数(v[λ], v[φ], v[r])がそれぞれベクトルの経度成分, 緯度成分, 動径成分を表す.

   r・(▽×▽×v)  = 1/r ∂/∂r (r・( 1/cosφ・∂v[λ]/∂λ
                                 + 1/cosφ・∂(v[φ] cosφ)/∂φ ) )
                    + L^2 v[r]/r

のスペクトルデータが返される.

Original external subprogram is wt_module#wt_RadRotRot_xyz_xyz_xyz

wt_RadRot_xyz_xyz( xyz_VLON, xyz_VLAT ) result(wt_RadRot_xyz_xyz)
Function :
wt_RadRot_xyz_xyz :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) ベクトルの渦度と動径ベクトルの内積
xyz_VLON :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトルの経度成分
xyz_VLAT :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトルの緯度成分

r・(▽×v)

ベクトルの渦度と動径ベクトルの内積 r・(▽×v) を計算する.

第 1, 2 引数(v[λ], v[φ])がそれぞれベクトルの経度成分, 緯度成分を表す.

   r・(▽×v) = 1/cosφ・∂v[φ]/∂λ - 1/cosφ・∂(v[λ] cosφ)/∂φ

のスペクトル データが返される.

Original external subprogram is wt_module#wt_RadRot_xyz_xyz

wt_RotRad_wt( wt ) result(wt_RotRad_wt)
Function :
wt_RotRad_wt :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) 回転型動径微分を作用された 2 次元スペクトルデータ
wt :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

入力スペクトルデータに回転型動径微分

     1/r ∂(r.)/∂r = ∂(.)/∂r + (.)/r

を作用する.

スペクトルデータの回転型動径微分とは, 対応する格子点データに 回転型動径微分を作用させたデータのスペクトル変換のことである.

Original external subprogram is wt_module#wt_RotRad_wt

wt_RotRad_xyz_xyz( xyz_Vlat, xyz_Vlon ) result(wt_RotRad_xyz_xyz)
Function :
wt_RotRad_xyz_xyz :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) ベクトル場の回転の動径成分
xyz_Vlat :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の緯度成分
xyz_Vlon :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の経度成分

ベクトルの緯度成分, 経度成分である第 1, 2 引数 Vlat, Vlon に対して ベクトル場の回転の動径成分

   1/rcosφ・∂Vlat/∂λ - 1/rcosφ・∂(Vlon cosφ)/∂φ

を計算する.

Original external subprogram is wt_module#wt_RotRad_xyz_xyz

wt_TorBoundaries( wt_TORPOT, [values], [cond], [new] )
Subroutine :
wt_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
values :real(8), dimension((nm+1)*(nm+1),2), intent(in), optional
: (in) 両端境界でのトロイダルポテンシャル
    粘着条件の時のみ有効
cond :character(len=2), intent(in), optional
: (in) 境界条件スイッチ. 省略時は ‘RR‘
    RR    : 両端粘着条件
    RF    : 上端粘着, 下端応力なし条件
    FR    : 上端応力なし, 下端粘着条件
    FF    : 両端応力なし条件
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

速度トロイダルポテンシャルに対して境界条件を適用する. Chebyshev 空間での境界条件適用.

速度トロイダルポテンシャルΨに対して与えられる境界条件は

  * 粘着条件 : Ψ = Ψb(lon,lat). Ψb は境界球面での速度分布.
                                  default は 0(静止状態).

  * 応力なし条件 : ∂(Ψ/r)/∂r = 0.

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Original external subprogram is wt_module#wt_TorBoundaries

wt_TorBoundariesGrid( wt_TORPOT, [values], [cond], [new] )
Subroutine :
wt_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
values :real(8), dimension((nm+1)*(nm+1),2), intent(in), optional
: (in) 両端境界でのトロイダルポテンシャル
    粘着条件の時のみ有効
cond :character(len=2), intent(in), optional
: (in) 境界条件スイッチ. 省略時は ‘RR‘
    RR    : 両端粘着条件
    RF    : 上端粘着, 下端応力なし条件
    FR    : 上端応力なし, 下端粘着条件
    FF    : 両端応力なし条件
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

速度トロイダルポテンシャルに対して境界条件を適用する. 実空間での境界条件適用

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法). このルーチンを用いるためには wt_Initial にて設定するチェビシェフ切断波数(lm)と鉛直格子点数(km)を 等しくしておく必要がある.

速度トロイダルポテンシャルΨに対して与えられる境界条件は

  * 粘着条件 : Ψ = Ψb(lon,lat). Ψb は境界球面での速度分布.
                                  default は 0 (静止状態).

  * 応力なし条件 : ∂(Ψ/r)/∂r = 0.

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Original external subprogram is wt_module#wt_TorBoundariesGrid

wt_TorBoundariesTau( wt_TORPOT, [values], [cond], [new] )
Subroutine :
wt_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
values :real(8), dimension((nm+1)*(nm+1),2), intent(in), optional
: (in) 両端境界でのトロイダルポテンシャル
    粘着条件の時のみ有効
cond :character(len=2), intent(in), optional
: (in) 境界条件スイッチ. 省略時は ‘RR‘
    RR    : 両端粘着条件
    RF    : 上端粘着, 下端応力なし条件
    FR    : 上端応力なし, 下端粘着条件
    FF    : 両端応力なし条件
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

速度トロイダルポテンシャルに対して境界条件を適用する. Chebyshev 空間での境界条件適用.

速度トロイダルポテンシャルΨに対して与えられる境界条件は

  * 粘着条件 : Ψ = Ψb(lon,lat). Ψb は境界球面での速度分布.
                                  default は 0(静止状態).

  * 応力なし条件 : ∂(Ψ/r)/∂r = 0.

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Original external subprogram is wt_module#wt_TorBoundariesTau

wt_TorMagBoundaries( wt_TOR, [new] )
Subroutine :
wt_TOR :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

Original external subprogram is wt_module#wt_TorMagBoundaries

wt_TormagBoundariesGrid( wt_TOR, [new] )
Subroutine :
wt_TOR :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

磁場トロイダルポテンシャルに対して境界条件を適用する. 鉛直実空間での境界条件適用.

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法). このルーチンを用いるためには wt_Initial にて設定するチェビシェフ切断波数(lm)と鉛直格子点数(km)を 等しくしておく必要がある.

現在のところ境界物質が非電気伝導体の場合のみ対応している. その場合, 磁場トロイダルポテンシャルの境界条件は

外側

   wt_psi = 0   at the outer boundary

内側

   wt_psi = 0       at the inner boundary

であるので wt_Boundaries で対応可能だが, 将来のため別途作成しておく

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Original external subprogram is wt_module#wt_TormagBoundariesGrid

wt_TormagBoundariesTau( wt_TOR, [new] )
Subroutine :
wt_TOR :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

Original external subprogram is wt_module#wt_TormagBoundariesTau

wt_VGradV( xyz_VGRADV_LON, xyz_VGRADV_LAT, xyz_VGRADV_RAD, xyz_VLON, xyz_VLAT, xyz_VRAD )
Subroutine :
xyz_VGRADV_LON :real(8), dimension(0:im-1,1:jm,0:km),intent(out)
: (out) (v・▽v) 経度成分
xyz_VGRADV_LAT :real(8), dimension(0:im-1,1:jm,0:km),intent(out)
: (out) (v・▽v) 緯度成分
xyz_VGRADV_RAD :real(8), dimension(0:im-1,1:jm,0:km),intent(out)
: (out) (v・▽v) 動径成分
xyz_VLON :real(8), dimension(0:im-1,1:jm,0:km),intent(in)
: (in) ベクトル場 v の経度成分
xyz_VLAT :real(8), dimension(0:im-1,1:jm,0:km),intent(in)
: (in) ベクトル場 v の緯度成分
xyz_VRAD :real(8), dimension(0:im-1,1:jm,0:km),intent(in)
: (in) ベクトル場 v の動径成分

ベクトル場の v・▽v を計算する.

ベクトル場 v=(v[λ],v[φ],v[r]) に対するv・▽vの各成分は 次のように計算される.

  (v・▽v)[λ] = ▽・(v[λ]v) + v[λ]v[r]/r - v[λ]v[φ]tan(φ)/r
  (v・▽v)[φ] = ▽・(v[φ]v) + v[φ]v[r]/r - v[λ]^2tan(φ)/r
  (v・▽v)[r] = ▽・(v[r]v) + (v[λ]^2+v[φ]^2)/r

非発散速度場に対してはポテンシャルから wt_Potential2Rotation を 用いて回転を計算し, 恒等式 v・▽v = ▽(v[2^/2) - vx▽xv を 用いる方がよいだろう.

Original external subprogram is wt_module#wt_VGradV

wt_VMiss
Variable :
wt_VMiss = -999.0 :real(8)
: 欠損値

Original external subprogram is wt_module#wt_VMiss

wt_wz( wz ) result(wt_wz)
Function :
wt_wz :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) 2 次元球面調和函数チェビシェフスペクトルデータ
wz :real(8), dimension((nm+1)*(nm+1),0:km), intent(in)
: (in) 2 次元球面調和函数スペクトル・動径格子点データ

水平スペクトル・動径格子点データからスペクトルデータへ(正)変換する.

Original external subprogram is wt_module#wt_wz

wt_xyz( xyz ) result(wt_xyz)
Function :
wt_xyz :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) 2 次元球面調和函数チェビシェフスペクトルデータ
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

3 次元格子点データからスペクトルデータへ(正)変換する.

Original external subprogram is wt_module#wt_xyz

Subroutine :
i :integer,intent(in)
: 格子点数(経度λ)
j :integer,intent(in)
: 格子点数(緯度φ)
ki :integer,intent(in)
: 格子点数(動径 r)
ko :integer,intent(in)
: 格子点数(動径 z)
n :integer,intent(in)
: 切断波数(水平全波数)
li :integer,intent(in)
: 切断波数(球動径波数)
lo :integer,intent(in)
: 切断波数(球殻動径波数)
r_in :real(8),intent(in)
: 球半径
r_out :real(8),intent(in)
: 球半径
np :integer,intent(in), optional
: OPENMP での最大スレッド数

スペクトル変換の格子点数, 波数, 球および球殻動径座標の範囲を設定する.

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

np に 1 より大きな値を指定すれば ISPACK の球面調和函数変換 OPENMP 並列計算ルーチンが用いられる. 並列計算を実行するには, 実行時に環境変数 OMP_NUM_THREADS を np 以下の数字に設定する等の システムに応じた準備が必要となる.

np に 1 より大きな値を指定しなければ並列計算ルーチンは呼ばれない.

[Source]

   subroutine wtu_Initial(i,j,ki,ko,n,li,lo,r_in,r_out,np)
     !
     ! スペクトル変換の格子点数, 波数, 球および球殻動径座標の範囲を設定する.
     !
     ! 他の関数を呼ぶ前に, 最初にこのサブルーチンを呼んで初期設定を
     ! しなければならない. 
     !
     ! np に 1 より大きな値を指定すれば ISPACK の球面調和函数変換 
     ! OPENMP 並列計算ルーチンが用いられる. 並列計算を実行するには, 
     ! 実行時に環境変数 OMP_NUM_THREADS を np 以下の数字に設定する等の
     ! システムに応じた準備が必要となる. 
     !
     ! np に 1 より大きな値を指定しなければ並列計算ルーチンは呼ばれない.
     !
     !
     integer,intent(in) :: i              ! 格子点数(経度λ)
     integer,intent(in) :: j              ! 格子点数(緯度φ)
     integer,intent(in) :: ki             ! 格子点数(動径 r)
     integer,intent(in) :: ko             ! 格子点数(動径 z)
     integer,intent(in) :: n              ! 切断波数(水平全波数)
     integer,intent(in) :: li             ! 切断波数(球動径波数)
     integer,intent(in) :: lo             ! 切断波数(球殻動径波数)

     real(8),intent(in) :: r_in, r_out    ! 球半径

     integer,intent(in), optional :: np   ! OPENMP での最大スレッド数

     im = i  
      jm = j 
      kmo = ko 
      kmi = ki
     nm = n  
      lmo = lo 
      lmi=li
     ri = r_in 
      ro = r_out

     if ( present(np) ) then
        if ( kmo > kmi ) then
           call wt_Initial(im,jm,kmo,nm,lmo,ri,ro,np)
           call wu_Initial(im,jm,kmi,nm,lmi,ri,np,wa_init=.false.)
        else
           call wu_Initial(im,jm,kmi,nm,lmi,ri,np)
           call wt_Initial(im,jm,kmo,nm,lmo,ri,ro,np,wa_init=.false.)
        endif
     else
        if ( kmo > kmi ) then
           call wt_Initial(im,jm,kmo,nm,lmo,ri,ro)
           call wu_Initial(im,jm,kmi,nm,lmi,ri,wa_init=.false.)
        else
           call wu_Initial(im,jm,kmi,nm,lmi,ri)
           call wt_Initial(im,jm,kmo,nm,lmo,ri,ro,wa_init=.false.)
        endif
     endif

     call MessageNotify('M','wtu_initial','wtu_module (2009/01/09) is initialized')

   end subroutine wtu_Initial
wtu_PolMagBoundaries( wt_Pol, wu_Pol, [new] )
Subroutine :
wt_Pol :real(8), dimension((nm+1)*(nm+1),0:lmo),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
wu_Pol :real(8), dimension((nm+1)*(nm+1),0:lmi),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

磁場ポロイダルポテンシャルに対して境界条件を適用する. Chebyshev 空間での境界条件適用

チェビシェフ空間において境界条件を満たすべく高次の係数を定める方法を とっている(タウ法). 現在のところ外側境界物質が非電気伝導体の場合のみ 対応している. その場合, 磁場トロイダルポテンシャルの境界条件は

現在のところ外側境界物質が非電気伝導体の場合のみ対応している. その場合, 磁場トロイダルポテンシャルの境界条件は

外側

   dPol_o/dr +(n+1)/r Pol_o= 0   at the outer boundary

球—球殻境界

   Pol_o = Phi_i, DrDPol_o = DrDPol_i    at the boundary

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Alias for wtu_PolMagBoundariesTau

Subroutine :
wt_Pol :real(8), dimension((nm+1)*(nm+1),0:lmo),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
wu_Pol :real(8), dimension((nm+1)*(nm+1),0:lmi),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

磁場ポロイダルポテンシャルに対して境界条件を適用する. 鉛直実空間での境界条件適用.

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法). このルーチンを用いるためには wtu_Initial にて設定するチェビシェフ切断波数(lmo,lmi)と 鉛直格子点数(kmo,kmi)を等しくしておく必要がある.

現在のところ境界物質が非電気伝導体の場合のみ対応している. その場合, 磁場トロイダルポテンシャルの境界条件は

外側

   dPol_o/dr +(n+1)/r Pol_o= 0   at the outer boundary

球—球殻境界

   Pol_o = Phi_i, DrDPol_o = DrDPol_i    at the boundary

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

[Source]

    subroutine wtu_PolmagBoundariesGrid(wt_Pol,wu_Pol,new)
      !
      ! 磁場ポロイダルポテンシャルに対して境界条件を適用する.
      ! 鉛直実空間での境界条件適用.
      !
      ! 鉛直実格子点空間において内部領域の値と境界条件を満たすように
      ! 条件を課している(選点法). このルーチンを用いるためには 
      ! wtu_Initial にて設定するチェビシェフ切断波数(lmo,lmi)と
      ! 鉛直格子点数(kmo,kmi)を等しくしておく必要がある. 
      !
      ! 現在のところ境界物質が非電気伝導体の場合のみ対応している. 
      ! その場合, 磁場トロイダルポテンシャルの境界条件は
      !
      ! 外側
      !    dPol_o/dr +(n+1)/r Pol_o= 0   at the outer boundary
      ! 球--球殻境界
      !    Pol_o = Phi_i, DrDPol_o = DrDPol_i    at the boundary
      ! 
      ! 最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.
      !
      real(8), dimension((nm+1)*(nm+1),0:lmo),intent(inout)   :: wt_Pol
              !(inout) 境界条件を適用するデータ. 修正された値を返す. 

      real(8), dimension((nm+1)*(nm+1),0:lmi),intent(inout)   :: wu_Pol
              !(inout) 境界条件を適用するデータ. 修正された値を返す. 

      logical, intent(IN), optional :: new
              !(in) true だと境界条件計算用行列を強制的に新たに作る.
              !     default は false.

      real(8), dimension(:,:,:), allocatable  :: alu
      integer, dimension(:,:), allocatable    :: kp

      real(8), dimension(:,:), allocatable    :: wt_I
      real(8), dimension(:,:), allocatable    :: wz_PSI
      real(8), dimension(:,:), allocatable    :: wz_DPSIDR
      real(8), dimension(:,:), allocatable    :: wu_I
      real(8), dimension(:,:), allocatable    :: wr_PSI
      real(8), dimension(:,:), allocatable    :: wr_DPSIDR

      real(8), dimension((nm+1)*(nm+1),0:lmo+lmi+1) :: wtu_Pol
      real(8), dimension((nm+1)*(nm+1),0:kmo+kmi+1) :: wzr_Pol

      logical :: first = .true.
      logical :: new_matrix = .false.
      integer  :: n,l,nn(2)
      save     :: alu, kp, first

      if (.not. present(new)) then
         new_matrix=.false.
      else 
         new_matrix=new
      endif

      if ( first .OR. new_matrix ) then
         first = .false.

         if ( lmo /= kmo .OR. lmi /= kmi ) then
            call MessageNotify('E','wtu_TorMagBoundariesGrid', 'Chebyshev truncation and number of grid points should be same.')
         endif

         if ( allocated(alu) ) deallocate(alu)
         if ( allocated(kp) ) deallocate(kp)
         if ( allocated(wt_I) ) deallocate(wt_I)
         if ( allocated(wz_PSI) ) deallocate(wz_PSI)
         if ( allocated(wu_I) ) deallocate(wu_I)
         if ( allocated(wr_PSI) ) deallocate(wr_PSI)
         allocate(alu((nm+1)*(nm+1),0:kmo+kmi+1,0:lmo+lmi+1))
         allocate(kp((nm+1)*(nm+1),0:lmo+lmi+1))
         allocate(wt_I((nm+1)*(nm+1),0:lmo),wz_PSI((nm+1)*(nm+1),0:kmo))
         allocate(wu_I((nm+1)*(nm+1),0:lmi),wr_PSI((nm+1)*(nm+1),0:kmi))
         allocate(wz_DPSIDR((nm+1)*(nm+1),0:kmo))
         allocate(wr_DPSIDR((nm+1)*(nm+1),0:kmi))

         alu = 0.0D0
         do l=0,lmo
            wt_I = 0.0D0
            wt_I(:,l)=1.0D0
            alu(:,0:kmo,l) = wz_wt(wt_I)              ! 内部領域は値そのまま.
         enddo
         do l=0,lmi
            wu_I = 0.0D0
            wu_I(:,l)=1.0D0
            alu(:,kmo+1:kmo+kmi+1,lmo+1+l) = wr_wu(wu_I)! 内部領域は値そのまま.
         enddo

         ! 球殻外側境界
         do l=0,lmo
            wt_I = 0.0D0
            wt_I(:,l) = 1.0D0
            wz_PSI = wz_wt(wt_I)
            wz_DPSIDR = wz_wt(wt_DRad_wt(wt_I))

            do n=1,(nm+1)*(nm+1)
               nn=nm_l(n)
               alu(n,0,l) = wz_DPSIDR(n,0) + (nn(1)+1) * wz_PSI(n,0)/z_RAD(0)
            enddo
         enddo

         ! 球--球殻境界
         do l=0,lmo
            wt_I = 0.0D0
            wt_I(:,l) = 1.0D0
            wz_PSI = wz_wt(wt_I)
            wz_DPSIDR = wz_wt(wt_DRad_wt(wt_I))

            alu(:,kmo,l)   = wz_DPSIDR(:,kmo) 
            alu(:,kmo+1,l) = wz_PSI(:,kmo)
         enddo
         do l=0,lmi
            wu_I = 0.0D0
            wu_I(:,l) = 1.0D0
            wr_PSI = wr_wu(wu_I)
            wr_DPSIDR = wr_DRad_wu(wu_I)

            alu(:,kmo,lmo+1+l)   = - wr_DPSIDR(:,0) 
            alu(:,kmo+1,lmo+1+l) = - wr_PSI(:,0)
         enddo

         call ludecomp(alu,kp)

         deallocate(wt_I,wz_PSI,wz_DPSIDR,wu_I,wr_PSI,wr_DPSIDR)

         call MessageNotify('M','PolmagBoundaryGrid', 'Matrix to apply  b.c. newly produced.')
      endif
      
      wzr_Pol(:,0:kmo)            = wz_wt(wt_Pol)
      wzr_Pol(:,kmo+1:kmo+kmi+1)  = wr_wu(wu_Pol)
      wzr_Pol(:,0)      = 0.0D0
      wzr_Pol(:,kmo)    = 0.0D0
      wzr_Pol(:,kmo+1)  = 0.0D0
      wtu_Pol = lusolve(alu,kp,wzr_Pol)

      wt_Pol = wtu_Pol(:,0:lmo)
      wu_Pol = wtu_Pol(:,lmo+1:lmo+lmi+1)  

    end subroutine wtu_PolmagBoundariesGrid
Subroutine :
wt_Pol :real(8), dimension((nm+1)*(nm+1),0:lmo),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
wu_Pol :real(8), dimension((nm+1)*(nm+1),0:lmi),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

磁場ポロイダルポテンシャルに対して境界条件を適用する. Chebyshev 空間での境界条件適用

チェビシェフ空間において境界条件を満たすべく高次の係数を定める方法を とっている(タウ法). 現在のところ外側境界物質が非電気伝導体の場合のみ 対応している. その場合, 磁場トロイダルポテンシャルの境界条件は

現在のところ外側境界物質が非電気伝導体の場合のみ対応している. その場合, 磁場トロイダルポテンシャルの境界条件は

外側

   dPol_o/dr +(n+1)/r Pol_o= 0   at the outer boundary

球—球殻境界

   Pol_o = Phi_i, DrDPol_o = DrDPol_i    at the boundary

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

[Source]

    subroutine wtu_PolmagBoundariesTau(wt_Pol,wu_Pol,new)
      !
      ! 磁場ポロイダルポテンシャルに対して境界条件を適用する.
      ! Chebyshev 空間での境界条件適用
      !
      ! チェビシェフ空間において境界条件を満たすべく高次の係数を定める方法を
      ! とっている(タウ法). 現在のところ外側境界物質が非電気伝導体の場合のみ
      ! 対応している. その場合, 磁場トロイダルポテンシャルの境界条件は
      !
      ! 現在のところ外側境界物質が非電気伝導体の場合のみ対応している. 
      ! その場合, 磁場トロイダルポテンシャルの境界条件は
      !
      ! 外側
      !    dPol_o/dr +(n+1)/r Pol_o= 0   at the outer boundary
      ! 球--球殻境界
      !    Pol_o = Phi_i, DrDPol_o = DrDPol_i    at the boundary
      ! 
      ! 最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.
      !
      real(8), dimension((nm+1)*(nm+1),0:lmo),intent(inout)   :: wt_Pol
              !(inout) 境界条件を適用するデータ. 修正された値を返す. 

      real(8), dimension((nm+1)*(nm+1),0:lmi),intent(inout)   :: wu_Pol
              !(inout) 境界条件を適用するデータ. 修正された値を返す. 

      logical, intent(IN), optional :: new
              !(in) true だと境界条件計算用行列を強制的に新たに作る.
              !     default は false.

      real(8), dimension(:,:,:), allocatable  :: alu
      integer, dimension(:,:), allocatable    :: kp

      real(8), dimension(:,:), allocatable    :: wt_I
      real(8), dimension(:,:), allocatable    :: wz_PSI
      real(8), dimension(:,:), allocatable    :: wz_DPSIDR
      real(8), dimension(:,:), allocatable    :: wu_I
      real(8), dimension(:,:), allocatable    :: wr_PSI
      real(8), dimension(:,:), allocatable    :: wr_DPSIDR

      real(8), dimension((nm+1)*(nm+1),0:lmo+lmi+1) :: wtu_Pol

      logical :: first = .true.
      logical :: new_matrix = .false.
      integer  :: n,l,nn(2)
      save     :: alu, kp, first

      if (.not. present(new)) then
         new_matrix=.false.
      else 
         new_matrix=new
      endif

      if ( first .OR. new_matrix ) then
         first = .false.

         if ( allocated(alu) ) deallocate(alu)
         if ( allocated(kp) ) deallocate(kp)
         if ( allocated(wt_I) ) deallocate(wt_I)
         if ( allocated(wz_PSI) ) deallocate(wz_PSI)
         if ( allocated(wu_I) ) deallocate(wu_I)
         if ( allocated(wr_PSI) ) deallocate(wr_PSI)
         allocate(alu((nm+1)*(nm+1),0:lmo+lmi+1,0:lmo+lmi+1))
         allocate(kp((nm+1)*(nm+1),0:lmo+lmi+1))
         allocate(wt_I((nm+1)*(nm+1),0:lmo),wz_PSI((nm+1)*(nm+1),0:kmo))
         allocate(wu_I((nm+1)*(nm+1),0:lmi),wr_PSI((nm+1)*(nm+1),0:kmi))
         allocate(wz_DPSIDR((nm+1)*(nm+1),0:kmo))
         allocate(wr_DPSIDR((nm+1)*(nm+1),0:kmi))

         alu = 0.0D0
         do l=0,lmo+lmi+1
            alu(:,l,l) = 1.0d0   ! 低波数はそのまま.
         enddo

         ! 球殻外側境界
         do l=0,lmo
            wt_I = 0.0D0
            wt_I(:,l) = 1.0D0
            wz_PSI = wz_wt(wt_I)
            wz_DPSIDR = wz_wt(wt_DRad_wt(wt_I))

            do n=1,(nm+1)*(nm+1)
               nn=nm_l(n)
               alu(n,lmo-1,l) = wz_DPSIDR(n,0) + (nn(1)+1)*wz_PSI(n,0)/z_RAD(0)
            enddo
         enddo

         ! 球--球殻境界
         do l=0,lmo
            wt_I = 0.0D0
            wt_I(:,l) = 1.0D0
            wz_PSI = wz_wt(wt_I)
            wz_DPSIDR = wz_wt(wt_DRad_wt(wt_I))

            alu(:,lmo,l)       = wz_DPSIDR(:,kmo) 
            alu(:,lmo+lmi+1,l) = wz_PSI(:,kmo)
         enddo
         do l=0,lmi
            wu_I = 0.0D0
            wu_I(:,l) = 1.0D0
            wr_PSI = wr_wu(wu_I)
            wr_DPSIDR = wr_DRad_wu(wu_I)

            alu(:,lmo,lmo+1+l)   = - wr_DPSIDR(:,0) 
            alu(:,lmo+lmi+1,lmo+1+l) = - wr_PSI(:,0)
         enddo

         call ludecomp(alu,kp)

         deallocate(wt_I,wz_PSI,wz_DPSIDR,wu_I,wr_PSI,wr_DPSIDR)

         call MessageNotify('M','PolmagBoundaryTau', 'Matrix to apply  b.c. newly produced.')
      endif
      
      wtu_Pol(:,0:lmo)            = wt_Pol
      wtu_Pol(:,lmo+1:lmo+lmi+1)  = wu_Pol
      wtu_Pol(:,lmo-1)  = 0.0D0
      wtu_Pol(:,lmo)    = 0.0D0
      wtu_Pol(:,lmo+1)  = 0.0D0
      wtu_Pol = lusolve(alu,kp,wtu_Pol)

      wt_Pol = wtu_Pol(:,0:lmo)
      wu_Pol = wtu_Pol(:,lmo+1:lmo+lmi+1)  

    end subroutine wtu_PolmagBoundariesTau
wtu_TorMagBoundaries( wt_TOR, wu_TOR, Pmo, Pmi, [new] )
Subroutine :
wt_TOR :real(8), dimension((nm+1)*(nm+1),0:lmo),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
wu_TOR :real(8), dimension((nm+1)*(nm+1),0:lmi),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
Pmo :real(8),intent(in)
: (in) 球殻の磁気プランドル数
Pmi :real(8),intent(in)
: (in) 内球の磁気プランドル数
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

磁場トロイダルポテンシャルに対して境界条件を適用する. Chebyshev 空間での境界条件適用

チェビシェフ空間において境界条件を満たすべく高次の係数を定める方法を とっている(タウ法). 現在のところ外側境界物質が非電気伝導体の場合のみ 対応している. その場合, 磁場トロイダルポテンシャルの境界条件は

外側

   Psi_o = 0   at the outer boundary

球—球殻境界

   Psi_o = Psi_i, Pm_o DrDPsi_o = Pm_i DrDPsi_i    at the boundary

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Alias for wtu_TorMagBoundariesTau

Subroutine :
wt_TOR :real(8), dimension((nm+1)*(nm+1),0:lmo),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
wu_TOR :real(8), dimension((nm+1)*(nm+1),0:lmi),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
Pmo :real(8),intent(in)
: (in) 球殻の磁気プランドル数
Pmi :real(8),intent(in)
: (in) 内球の磁気プランドル数
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

磁場トロイダルポテンシャルに対して境界条件を適用する. 鉛直実空間での境界条件適用.

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法). このルーチンを用いるためには wtu_Initial にて設定するチェビシェフ切断波数(lmo,lmi)と 鉛直格子点数(kmo,kmi)を等しくしておく必要がある.

現在のところ境界物質が非電気伝導体の場合のみ対応している. その場合, 磁場トロイダルポテンシャルの境界条件は

外側

   Psi_o = 0   at the outer boundary

球—球殻境界

   Psi_o = Psi_i, Pm_o DrDPsi_o = Pm_i DrDPsi_i    at the boundary

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

[Source]

    subroutine wtu_TormagBoundariesGrid(wt_TOR,wu_TOR,Pmo,Pmi,new)
      !
      ! 磁場トロイダルポテンシャルに対して境界条件を適用する.
      ! 鉛直実空間での境界条件適用.
      !
      ! 鉛直実格子点空間において内部領域の値と境界条件を満たすように
      ! 条件を課している(選点法). このルーチンを用いるためには 
      ! wtu_Initial にて設定するチェビシェフ切断波数(lmo,lmi)と
      ! 鉛直格子点数(kmo,kmi)を等しくしておく必要がある. 
      !
      ! 現在のところ境界物質が非電気伝導体の場合のみ対応している. 
      ! その場合, 磁場トロイダルポテンシャルの境界条件は
      !
      ! 外側
      !    Psi_o = 0   at the outer boundary
      ! 球--球殻境界
      !    Psi_o = Psi_i, Pm_o DrDPsi_o = Pm_i DrDPsi_i    at the boundary
      ! 
      ! 最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.
      !
      real(8), dimension((nm+1)*(nm+1),0:lmo),intent(inout)   :: wt_TOR
              !(inout) 境界条件を適用するデータ. 修正された値を返す. 

      real(8), dimension((nm+1)*(nm+1),0:lmi),intent(inout)   :: wu_TOR
              !(inout) 境界条件を適用するデータ. 修正された値を返す. 

      real(8),intent(in)           :: Pmo
              !(in) 球殻の磁気プランドル数

      real(8),intent(in)           :: Pmi
              !(in) 内球の磁気プランドル数

      logical, intent(IN), optional :: new
              !(in) true だと境界条件計算用行列を強制的に新たに作る.
              !     default は false.

      real(8), dimension(:,:,:), allocatable  :: alu
      integer, dimension(:,:), allocatable    :: kp

      real(8), dimension(:,:), allocatable    :: wt_I
      real(8), dimension(:,:), allocatable    :: wz_PSI
      real(8), dimension(:,:), allocatable    :: wz_DPSIDR
      real(8), dimension(:,:), allocatable    :: wu_I
      real(8), dimension(:,:), allocatable    :: wr_PSI
      real(8), dimension(:,:), allocatable    :: wr_DPSIDR

      real(8), dimension((nm+1)*(nm+1),0:lmo+lmi+1) :: wtu_PSI
      real(8), dimension((nm+1)*(nm+1),0:kmo+kmi+1) :: wzr_PSI

      logical :: first = .true.
      logical :: new_matrix = .false.
      integer  :: l
      save     :: alu, kp, first

      if (.not. present(new)) then
         new_matrix=.false.
      else 
         new_matrix=new
      endif

      if ( first .OR. new_matrix ) then
         first = .false.

         if ( lmo /= kmo .OR. lmi /= kmi ) then
            call MessageNotify('E','wtu_TorMagBoundariesGrid', 'Chebyshev truncation and number of grid points should be same.')
         endif

         if ( allocated(alu) ) deallocate(alu)
         if ( allocated(kp) ) deallocate(kp)
         if ( allocated(wt_I) ) deallocate(wt_I)
         if ( allocated(wz_PSI) ) deallocate(wz_PSI)
         if ( allocated(wu_I) ) deallocate(wu_I)
         if ( allocated(wr_PSI) ) deallocate(wr_PSI)
         allocate(alu((nm+1)*(nm+1),0:kmo+kmi+1,0:lmo+lmi+1))
         allocate(kp((nm+1)*(nm+1),0:lmo+lmi+1))
         allocate(wt_I((nm+1)*(nm+1),0:lmo),wz_PSI((nm+1)*(nm+1),0:kmo))
         allocate(wu_I((nm+1)*(nm+1),0:lmi),wr_PSI((nm+1)*(nm+1),0:kmi))
         allocate(wz_DPSIDR((nm+1)*(nm+1),0:kmo))
         allocate(wr_DPSIDR((nm+1)*(nm+1),0:kmi))

         alu = 0.0D0
         do l=0,lmo
            wt_I = 0.0D0
            wt_I(:,l)=1.0D0
            alu(:,0:kmo,l) = wz_wt(wt_I)              ! 内部領域は値そのまま.
         enddo
         do l=0,lmi
            wu_I = 0.0D0
            wu_I(:,l)=1.0D0
            alu(:,kmo+1:kmo+kmi+1,lmo+1+l) = wr_wu(wu_I)! 内部領域は値そのまま.
         enddo

         ! 球--球殻境界
         do l=0,lmo
            wt_I = 0.0D0
            wt_I(:,l) = 1.0D0
            wz_PSI = wz_wt(wt_I)
            wz_DPSIDR = wz_wt(wt_DRad_wt(wt_I))

            alu(:,kmo,l)   = Pmo * wz_DPSIDR(:,kmo) 
            alu(:,kmo+1,l) = wz_PSI(:,kmo)
         enddo
         do l=0,lmi
            wu_I = 0.0D0
            wu_I(:,l) = 1.0D0
            wr_PSI = wr_wu(wu_I)
            wr_DPSIDR = wr_DRad_wu(wu_I)

            alu(:,kmo,lmo+1+l)   = -Pmi * wr_DPSIDR(:,0) 
            alu(:,kmo+1,lmo+1+l) = - wr_PSI(:,0)
         enddo

         call ludecomp(alu,kp)

         deallocate(wt_I,wz_PSI,wz_DPSIDR,wu_I,wr_PSI,wr_DPSIDR)

         call MessageNotify('M','TormagBoundaryGrid', 'Matrix to apply  b.c. newly produced.')
      endif
      
      wzr_PSI(:,0:kmo)            = wz_wt(wt_TOR)
      wzr_PSI(:,kmo+1:kmo+kmi+1)  = wr_wu(wu_TOR)
      wzr_PSI(:,0)      = 0.0D0
      wzr_PSI(:,kmo)    = 0.0D0
      wzr_PSI(:,kmo+1)  = 0.0D0
      wtu_PSI = lusolve(alu,kp,wzr_PSI)

      wt_TOR = wtu_PSI(:,0:lmo)
      wu_TOR = wtu_PSI(:,lmo+1:lmo+lmi+1)  

    end subroutine wtu_TormagBoundariesGrid
Subroutine :
wt_TOR :real(8), dimension((nm+1)*(nm+1),0:lmo),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
wu_TOR :real(8), dimension((nm+1)*(nm+1),0:lmi),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
Pmo :real(8),intent(in)
: (in) 球殻の磁気プランドル数
Pmi :real(8),intent(in)
: (in) 内球の磁気プランドル数
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

磁場トロイダルポテンシャルに対して境界条件を適用する. Chebyshev 空間での境界条件適用

チェビシェフ空間において境界条件を満たすべく高次の係数を定める方法を とっている(タウ法). 現在のところ外側境界物質が非電気伝導体の場合のみ 対応している. その場合, 磁場トロイダルポテンシャルの境界条件は

外側

   Psi_o = 0   at the outer boundary

球—球殻境界

   Psi_o = Psi_i, Pm_o DrDPsi_o = Pm_i DrDPsi_i    at the boundary

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

[Source]

    subroutine wtu_TormagBoundariesTau(wt_TOR,wu_TOR,Pmo,Pmi,new)
      !
      ! 磁場トロイダルポテンシャルに対して境界条件を適用する.
      ! Chebyshev 空間での境界条件適用
      !
      ! チェビシェフ空間において境界条件を満たすべく高次の係数を定める方法を
      ! とっている(タウ法). 現在のところ外側境界物質が非電気伝導体の場合のみ
      ! 対応している. その場合, 磁場トロイダルポテンシャルの境界条件は
      !
      ! 外側
      !    Psi_o = 0   at the outer boundary
      ! 球--球殻境界
      !    Psi_o = Psi_i, Pm_o DrDPsi_o = Pm_i DrDPsi_i    at the boundary
      ! 
      ! 最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.
      !
      real(8), dimension((nm+1)*(nm+1),0:lmo),intent(inout)   :: wt_TOR
              !(inout) 境界条件を適用するデータ. 修正された値を返す. 

      real(8), dimension((nm+1)*(nm+1),0:lmi),intent(inout)   :: wu_TOR
              !(inout) 境界条件を適用するデータ. 修正された値を返す. 

      real(8),intent(in)           :: Pmo
              !(in) 球殻の磁気プランドル数

      real(8),intent(in)           :: Pmi
              !(in) 内球の磁気プランドル数

      logical, intent(IN), optional :: new
              !(in) true だと境界条件計算用行列を強制的に新たに作る.
              !     default は false.

      real(8), dimension(:,:,:), allocatable  :: alu
      integer, dimension(:,:), allocatable    :: kp

      real(8), dimension(:,:), allocatable    :: wt_I
      real(8), dimension(:,:), allocatable    :: wz_PSI
      real(8), dimension(:,:), allocatable    :: wz_DPSIDR
      real(8), dimension(:,:), allocatable    :: wu_I
      real(8), dimension(:,:), allocatable    :: wr_PSI
      real(8), dimension(:,:), allocatable    :: wr_DPSIDR

      real(8), dimension((nm+1)*(nm+1),0:lmo+lmi+1) :: wtu_PSI

      logical :: first = .true.
      logical :: new_matrix = .false.
      integer  :: l
      save     :: alu, kp, first

      if (.not. present(new)) then
         new_matrix=.false.
      else 
         new_matrix=new
      endif

      if ( first .OR. new_matrix ) then
         first = .false.

         if ( allocated(alu) ) deallocate(alu)
         if ( allocated(kp) ) deallocate(kp)
         if ( allocated(wt_I) ) deallocate(wt_I)
         if ( allocated(wz_PSI) ) deallocate(wz_PSI)
         if ( allocated(wu_I) ) deallocate(wu_I)
         if ( allocated(wr_PSI) ) deallocate(wr_PSI)
         allocate(alu((nm+1)*(nm+1),0:lmo+lmi+1,0:lmo+lmi+1))
         allocate(kp((nm+1)*(nm+1),0:lmo+lmi+1))
         allocate(wt_I((nm+1)*(nm+1),0:lmo),wz_PSI((nm+1)*(nm+1),0:kmo))
         allocate(wu_I((nm+1)*(nm+1),0:lmi),wr_PSI((nm+1)*(nm+1),0:kmi))
         allocate(wz_DPSIDR((nm+1)*(nm+1),0:kmo))
         allocate(wr_DPSIDR((nm+1)*(nm+1),0:kmi))

         alu = 0.0D0
         do l=0,lmo+lmi+1
            wt_I = 0.0D0
            alu(:,l,l) = 1.0D0      ! 低波数はそのまま
         enddo

         ! 球--球殻境界
         do l=0,lmo
            wt_I = 0.0D0
            wt_I(:,l) = 1.0D0
            wz_PSI = wz_wt(wt_I)
            wz_DPSIDR = wz_wt(wt_DRad_wt(wt_I))

            alu(:,lmo-1,l)   = wz_PSI(:,0)
            alu(:,lmo,l)   = Pmo * wz_DPSIDR(:,kmo) 
            alu(:,lmo+lmi+1,l) = wz_PSI(:,kmo)
         enddo
         do l=0,lmi
            wu_I = 0.0D0
            wu_I(:,l) = 1.0D0
            wr_PSI = wr_wu(wu_I)
            wr_DPSIDR = wr_DRad_wu(wu_I)

            alu(:,lmo,lmo+1+l)   = -Pmi * wr_DPSIDR(:,0) 
            alu(:,lmo+lmi+1,lmo+1+l) = - wr_PSI(:,0)
         enddo

         call ludecomp(alu,kp)

         deallocate(wt_I,wz_PSI,wz_DPSIDR,wu_I,wr_PSI,wr_DPSIDR)

         call MessageNotify('M','TormagBoundaryTau', 'Matrix to apply  b.c. newly produced.')
      endif
      
      wtu_PSI(:,0:lmo)            = wt_TOR
      wtu_PSI(:,lmo+1:lmo+lmi+1)  = wu_TOR
      wtu_PSI(:,lmo-1)      = 0.0D0
      wtu_PSI(:,lmo)        = 0.0D0
      wtu_PSI(:,lmo+lmi+1)  = 0.0D0
      wtu_PSI = lusolve(alu,kp,wtu_PSI)

      wt_TOR = wtu_PSI(:,0:lmo)
      wu_TOR = wtu_PSI(:,lmo+1:lmo+lmi+1)  

    end subroutine wtu_TormagBoundariesTau
wu_Boundary( wu, [value], [cond] )
Subroutine :
wu :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
value :real(8), dimension((nm+1)*(nm+1)), intent(in), optional
: (in) 境界での 値/勾配 分布を水平スペクトル変換したものを与える.
    省略時は値/勾配 0 となる.
cond :character(len=1), intent(in), optional
: (in) 境界条件. 省略時は ‘D‘
       D : 外側ディリクレ条件
       N : 外側ノイマン条件

スペクトルデータにディリクレ・ノイマン境界条件を適用する Chebyshev 空間での境界条件適用(タウ法)

チェビシェフ空間において境界条件を満たすべく高次の係数を 定める方法をとっている(タウ法).

Original external subprogram is wu_module#wu_Boundary

wu_BoundaryGrid( wu, [value], [cond] )
Subroutine :
wu :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
value :real(8), dimension((nm+1)*(nm+1)), intent(in), optional
: (in) 境界での 値/勾配 分布を水平スペクトル変換したものを与える.
   省略時は値/勾配 0 となる.
cond :character(len=1), intent(in), optional
: (in) 境界条件. 省略時は ‘D‘
       D : 外側ディリクレ条件
       N : 外側ノイマン条件

スペクトルデータにディリクレ・ノイマン境界条件を適用する 実空間での境界条件適用

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法). このルーチンを用いるためには wu_Initial にて設定するチェビシェフ切断波数(lm)と鉛直格子点数(km)を 等しくしておく必要がある.

Original external subprogram is wu_module#wu_BoundaryGrid

wu_BoundaryTau( wu, [value], [cond] )
Subroutine :
wu :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
value :real(8), dimension((nm+1)*(nm+1)), intent(in), optional
: (in) 境界での 値/勾配 分布を水平スペクトル変換したものを与える.
    省略時は値/勾配 0 となる.
cond :character(len=1), intent(in), optional
: (in) 境界条件. 省略時は ‘D‘
       D : 外側ディリクレ条件
       N : 外側ノイマン条件

スペクトルデータにディリクレ・ノイマン境界条件を適用する Chebyshev 空間での境界条件適用(タウ法)

チェビシェフ空間において境界条件を満たすべく高次の係数を 定める方法をとっている(タウ法).

Original external subprogram is wu_module#wu_BoundaryTau

wu_KxRGrad_wu( wu ) result(wu_KxRGrad_wu)
Function :
wu_KxRGrad_wu :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) 経度微分を作用された 2 次元スペクトルデータ
wu :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

入力スペクトルデータに経度微分 k×r・▽ = ∂/∂λを作用する.

Original external subprogram is wu_module#wu_KxRGrad_wu

wu_L2Inv_wu( wu ) result(wu_L2Inv_wu)
Function :
wu_L2Inv_wu :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) L^2 演算子の逆演算を作用された 2 次元スペクトルデータ
wu :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

入力スペクトルデータに L^2 演算子の逆演算(-逆水平ラプラシアン)を 作用する.

スペクトルデータに L^2 演算子を作用させる関数 wu_L2_wu の逆計算を 行う関数である.

Original external subprogram is wu_module#wu_L2Inv_wu

wu_L2_wu( wu ) result(wu_L2_wu)
Function :
wu_L2_wu :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) L^2 演算子を作用された 2 次元スペクトルデータ
wu :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

入力スペクトルデータに L^2 演算子(=-水平ラプラシアン)を作用する.

L^2 演算子は単位球面上の水平ラプラシアンの逆符号にあたる.

 入力スペクトルデ ータに対応する格子点データに演算子

    L^2 = -1/cos^2φ・∂^2/∂λ^2 - 1/cosφ・∂/∂φ(cosφ∂/∂φ)

を作用させたデータのスペクトル変換が返される.

Original external subprogram is wu_module#wu_L2_wu

wu_LaplaPol2PolGrid_wu( wu, [cond], [new] ) result(wu_LaplaPol2PolGrid_wu)
Function :
wu_LaplaPol2PolGrid_wu :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) 出力ポロイダルポテンシャル分布
wu :real(8), dimension((nm+1)*(nm+1),0:lm),intent(in)
: (in) 入力▽^2φ分布
cond :character(len=1), intent(in), optional
: (in) 境界条件スイッチ. 省略時は ‘R‘
    R    : 上側粘着条件
    F    : 上側応力なし条件
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

速度ポロイダルポテンシャルΦを▽^2Φから計算する. チェビシェフ格子点空間で境界条件を適用している.

この関数を用いるためには wu_Initial にて設定する チェビシェフ切断波数(lm)と鉛直格子点数(km)を等しく しておく必要がある.

速度ポロイダルポテンシャルΦを f = ▽^2Φから定める式は

   ▽^2Φ = f
     Φ = const. at Boundary.
     ∂Φ/∂r = 0 at Boundary          (粘着条件)
     or ∂^2Φ/∂r^2 = 0 at Boundary   (応力なし条件)

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

最終的にチェビシェフ係数の解が欲しい場合には, wr_LaplaPol2Pol_wr に 比べてチェビシェフ — 格子点変換が 1 回分少なくて済む.

Original external subprogram is wu_module#wu_LaplaPol2PolGrid_wu

wu_PolMagBoundary( wu_POL, [new] )
Subroutine :
wu_POL :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

磁場ポロイダルポテンシャルに対して境界条件を適用する. Chebyshev 空間での境界条件適用

チェビシェフ空間において境界条件を満たすべく高次の係数を定める方法を とっている(タウ法). 現在のところ境界物質が非電気伝導体の場合のみ 対応している. その場合, 磁場ポロイダルポテンシャルの各水平スペクトル 成分 h にたいして境界条件が与えられ,

 * 外側境界 : dh/dr + (n+1)h/r = 0

である. ここで n は h の水平全波数である.

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Original external subprogram is wu_module#wu_PolMagBoundary

wu_PolmagBoundaryGrid( wu_POL, [new] )
Subroutine :
wu_POL :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

磁場ポロイダルポテンシャルに対して境界条件を適用する. 鉛直実空間での境界条件適用.

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法). このルーチンを用いるためには wu_Initial にて設定するチェビシェフ切断波数(lm)と鉛直格子点数(km)を 等しくしておく必要がある.

現在のところ境界物質が非電気伝導体の場合のみ対応している. その場合, 磁場ポロイダルポテンシャルの各水平スペクトル成分 h に たいして境界条件が与えられ,

 * 外側境界 : dh/dr + (n+1)h/r = 0

である. ここで n は h の水平全波数である.

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Original external subprogram is wu_module#wu_PolmagBoundaryGrid

wu_PolmagBoundaryTau( wu_POL, [new] )
Subroutine :
wu_POL :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

磁場ポロイダルポテンシャルに対して境界条件を適用する. Chebyshev 空間での境界条件適用

チェビシェフ空間において境界条件を満たすべく高次の係数を定める方法を とっている(タウ法). 現在のところ境界物質が非電気伝導体の場合のみ 対応している. その場合, 磁場ポロイダルポテンシャルの各水平スペクトル 成分 h にたいして境界条件が与えられ,

 * 外側境界 : dh/dr + (n+1)h/r = 0

である. ここで n は h の水平全波数である.

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Original external subprogram is wu_module#wu_PolmagBoundaryTau

wu_Potential2Rotation( xyr_RotVLON, xyr_RotVLAT, xyr_RotVRAD, wu_TORPOT, wu_POLPOT )
Subroutine :
xyr_RotVLON :real(8), dimension(0:im-1,1:jm,0:km), intent(OUT)
: (out) 回転の経度成分
xyr_RotVLAT :real(8), dimension(0:im-1,1:jm,0:km), intent(OUT)
: (out) 回転の緯度成分
xyr_RotVRAD :real(8), dimension(0:im-1,1:jm,0:km), intent(OUT)
: (out) 回転の動径成分
wu_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) トロイダルポテンシャル
wu_POLPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ポロイダルポテンシャル

トロイダルポロイダルポテンシャルΨ,Φで表される非発散ベクトル場

    v = ▽x(Ψr) + ▽x▽x(Φr)

に対して, その回転

    ▽xv = ▽x▽x(Ψr) + ▽x▽x▽x(Φr) = ▽x▽x(Ψr) - ▽x((▽^2Φ)r)

を計算する.

Original external subprogram is wu_module#wu_Potential2Rotation

wu_Potential2Vector( xyr_VLON, xyr_VLAT, xyr_VRAD, wu_TORPOT, wu_POLPOT )
Subroutine :
xyr_VLON :real(8), dimension(0:im-1,1:jm,0:km)
: (out) ベクトル場の経度成分
xyr_VLAT :real(8), dimension(0:im-1,1:jm,0:km)
: (out) ベクトル場の緯度成分
xyr_VRAD :real(8), dimension(0:im-1,1:jm,0:km)
: (out) ベクトル場の動径成分
wu_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) トロイダルポテンシャル
wu_POLPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ポロイダルポテンシャル

トロイダルポロイダルポテンシャルΨ,Φで表される非発散ベクトル場

    v = ▽x(Ψr) + ▽x▽x(Φr)

の各成分を計算する

Original external subprogram is wu_module#wu_Potential2Vector

wu_QOperator_wu( wu ) result(wu_QOperator_wu)
Function :
wu_QOperator_wu :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) Q 演算子を作用された 2 次元スペクトルデータ
wu :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

入力スペクトルデータに対応する格子点データに演算子

   Q=(k・▽-1/2(L2 k・▽+ k・▽L2))

を作用させたデータのスペクトル変換が返される.

Original external subprogram is wu_module#wu_QOperator_wu

wu_RadRot_xyr_xyr( xyr_VLON, xyr_VLAT ) result(wu_RadRot_xyr_xyr)
Function :
wu_RadRot_xyr_xyr :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) ベクトルの渦度と動径ベクトルの内積
xyr_VLON :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトルの経度成分
xyr_VLAT :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトルの緯度成分

r・(▽×v)

ベクトルの渦度と動径ベクトルの内積 r・(▽×v) を計算する.

第 1, 2 引数(v[λ], v[φ])がそれぞれベクトルの経度成分, 緯度成分を表す.

   r・(▽×v) = 1/cosφ・∂v[φ]/∂λ - 1/cosφ・∂(v[λ] cosφ)/∂φ

のスペクトル データが返される.

Original external subprogram is wu_module#wu_RadRot_xyr_xyr

wu_TorBoundary( wu_TORPOT, [value], [cond], [new] )
Subroutine :
wu_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
value :real(8), dimension((nm+1)*(nm+1)), intent(in), optional
: (in) 両端境界でのトロイダルポテンシャル
    粘着条件の時のみ有効
cond :character(len=1), intent(in), optional
: (in) 境界条件スイッチ. 省略時は ‘R‘
    R    : 上側粘着条件
    F    : 上側応力なし条件
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

速度トロイダルポテンシャルに対して境界条件を適用する. Chebyshev 空間での境界条件適用.

速度トロイダルポテンシャルΨに対して与えられる境界条件は

  * 粘着条件 : Ψ = Ψb(lon,lat). Ψb は境界球面での速度分布.
                                  default は 0(静止状態).

  * 応力なし条件 : ∂(Ψ/r)/∂r = 0.

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Original external subprogram is wu_module#wu_TorBoundary

wu_TorBoundaryGrid( wu_TORPOT, [value], [cond], [new] )
Subroutine :
wu_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
value :real(8), dimension((nm+1)*(nm+1)), intent(in), optional
: (in) 両端境界でのトロイダルポテンシャル
    粘着条件の時のみ有効
cond :character(len=1), intent(in), optional
: (in) 境界条件スイッチ. 省略時は ‘R‘
    R    : 上側粘着条件
    F    : 上側応力なし条件
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

速度トロイダルポテンシャルに対して境界条件を適用する. 実空間での境界条件適用

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法). このルーチンを用いるためには wu_Initial にて設定するチェビシェフ切断波数(lm)と鉛直格子点数(km)を 等しくしておく必要がある.

速度トロイダルポテンシャルΨに対して与えられる境界条件は

  * 粘着条件 : Ψ = Ψb(lon,lat). Ψb は境界球面での速度分布.
                                  default は 0 (静止状態).

  * 応力なし条件 : ∂(Ψ/r)/∂r = 0.

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Original external subprogram is wu_module#wu_TorBoundaryGrid

wu_TorBoundaryTau( wu_TORPOT, [value], [cond], [new] )
Subroutine :
wu_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
value :real(8), dimension((nm+1)*(nm+1)), intent(in), optional
: (in) 両端境界でのトロイダルポテンシャル
    粘着条件の時のみ有効
cond :character(len=1), intent(in), optional
: (in) 境界条件スイッチ. 省略時は ‘R‘
    R    : 上側粘着条件
    F    : 上側応力なし条件
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

速度トロイダルポテンシャルに対して境界条件を適用する. Chebyshev 空間での境界条件適用.

速度トロイダルポテンシャルΨに対して与えられる境界条件は

  * 粘着条件 : Ψ = Ψb(lon,lat). Ψb は境界球面での速度分布.
                                  default は 0(静止状態).

  * 応力なし条件 : ∂(Ψ/r)/∂r = 0.

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Original external subprogram is wu_module#wu_TorBoundaryTau

wu_TorMagBoundary( wu_TOR, [new] )
Subroutine :
wu_TOR :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

Original external subprogram is wu_module#wu_TorMagBoundary

wu_TormagBoundaryGrid( wu_TOR, [new] )
Subroutine :
wu_TOR :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

磁場トロイダルポテンシャルに対して境界条件を適用する. 鉛直実空間での境界条件適用.

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法). このルーチンを用いるためには wu_Initial にて設定するチェビシェフ切断波数(lm)と鉛直格子点数(km)を 等しくしておく必要がある.

現在のところ境界物質が非電気伝導体の場合のみ対応している. その場合, 磁場トロイダルポテンシャルの境界条件は

外側

   wu_psi = 0   at the outer boundary

であるので wu_Boundary で対応可能だが, 将来のため別途作成しておく

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Original external subprogram is wu_module#wu_TormagBoundaryGrid

wu_TormagBoundaryTau( wu_TOR, [new] )
Subroutine :
wu_TOR :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

Original external subprogram is wu_module#wu_TormagBoundaryTau

wu_VMiss
Variable :
wu_VMiss = -999.0 :real(8)
: 欠損値

Original external subprogram is wu_module#wu_VMiss

wu_xyr( xyr ) result(wu_xyr)
Function :
wu_xyr :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) 2 次元球面調和函数チェビシェフスペクトルデータ
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

3 次元格子点データからスペクトルデータへ(正)変換する.

Original external subprogram is wu_module#wu_xyr

wz_LaplaPol2Pol_wz( wz, [cond], [new] ) result(wz_LaplaPol2Pol_wz)
Function :
wz_LaplaPol2Pol_wz :real(8), dimension((nm+1)*(nm+1),0:km)
: (out) 出力ポロイダルポテンシャル分布
wz :real(8), dimension((nm+1)*(nm+1),0:km),intent(in)
: (in) 入力▽^2φ分布
cond :character(len=2), intent(in), optional
: (in) 境界条件スイッチ. 省略時は ‘RR‘
    RR    : 両端粘着条件
    RF    : 上端粘着, 下端応力なし条件
    FR    : 上端応力なし, 下端粘着条件
    FF    : 両端応力なし条件
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

速度ポロイダルポテンシャルΦを▽^2Φから計算する.

チェビシェフ格子点空間で境界条件を適用している. この関数を用いるためには wt_Initial にて設定する チェビシェフ切断波数(lm)と鉛直格子点数(km)を等しく しておく必要がある.

速度ポロイダルポテンシャルΦを f = ▽^2Φから定める式は

  ▽^2Φ = f
    Φ = const. at boundaries.
    ∂Φ/∂r = 0 at boundaries           (粘着条件)
    or ∂^2Φ/∂r^2 = 0 at boundaries    (応力なし条件)

最初に呼ばれるときはオプショナル引数 new に関係なく行列が設定される.

Original external subprogram is wt_module#wz_LaplaPol2Pol_wz

wz_RAD
Variable :
wz_RAD :real(8), dimension(:,:), allocatable
: 座標

Original external subprogram is wt_module#wz_RAD

wz_wt( wt ) result(wz_wt)
Function :
wz_wt :real(8), dimension((nm+1)*(nm+1),0:km)
: (out) 2 次元球面調和函数スペクトル・動径格子点データ
wt :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

スペクトルデータから水平スペクトル・動径格子点データへ(正)変換する.

Original external subprogram is wt_module#wz_wt

wz_xyz( xyz ) result(wz_xyz)
Function :
wz_xyz :real(8), dimension((nm+1)*(nm+1),0:km)
: (out) 2 次元球面調和函数スペクトル・動径格子点データ
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

3 次元格子データから水平スペクトル・動径格子点データへ(正)変換する.

Original external subprogram is wt_module#wz_xyz

x_AvrLatRad_xyr( xyr ) result(x_AvrLatRad_xyr)
Function :
x_AvrLatRad_xyr :real(8), dimension(0:im-1)
: (out) 緯度動径(子午面)平均された 1 次元経度格子点データ
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

緯度動径(子午面)積分

3 次元格子点データの緯度動径(子午面)平均

3 次元データ f(λ,φ,r) に対して

   ∫f(λ,,r) r^2cosφ dφdr /(2(r[o]^3-r[i]^3)/3)

を計算する.

Original external subprogram is wu_module#x_AvrLatRad_xyr

x_AvrLatRad_xyz( xyz ) result(x_AvrLatRad_xyz)
Function :
x_AvrLatRad_xyz :real(8), dimension(0:im-1)
: (out) 緯度動径(子午面)平均された 1 次元経度格子点データ
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

緯度動径(子午面)積分

3 次元格子点データの緯度動径(子午面)平均

3 次元データ f(λ,φ,r) に対して

   ∫f(λ,,r) r^2cosφ dφdr /(2(r[o]^3-r[i]^3)/3)

を計算する.

Original external subprogram is wt_module#x_AvrLatRad_xyz

x_AvrLat_xy( xy_data ) result(x_AvrLat_xy)
Function :
x_AvrLat_xy(im) :real(8)
: (out) 平均された 1 次元経度(X)格子点データ
xy_data(0:im-1,1:jm) :real(8), intent(in)
: (in) 2 次元経度緯度格子点データ(0:im-1,1:jm)

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

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

Original external subprogram is wt_module#x_AvrLat_xy

x_AvrRad_xr( xr ) result(x_AvrRad_xr)
Function :
x_AvrRad_xr :real(8), dimension(0:im-1)
: (out) 動径平均された 1 次元経度格子点データ
xr :real(8), dimension(0:im-1,0:km), intent(in)
: (in) 2 次元緯度動径格子点データ

動径積分

2 次元(XR)格子点データの動径方向域平均.

2 次元データ f(λ,r) に対して

  ∫f(λ,r) r^2dr /((r[o]^3-r[i]^3)/3)

を計算する.

Original external subprogram is wu_module#x_AvrRad_xr

x_AvrRad_xz( xz ) result(x_AvrRad_xz)
Function :
x_AvrRad_xz :real(8), dimension(0:im-1)
: (out) 動径平均された 1 次元経度格子点データ
xz :real(8), dimension(0:im-1,0:km), intent(in)
: (in) 2 次元緯度動径格子点データ

動径積分

2 次元(XZ)格子点データの動径方向域平均.

2 次元データ f(λ,r) に対して

  ∫f(λ,r) r^2dr /((r[o]^3-r[i]^3)/3)

を計算する.

Original external subprogram is wt_module#x_AvrRad_xz

x_IntLatRad_xyr( xyr ) result(x_IntLatRad_xyr)
Function :
x_IntLatRad_xyr :real(8), dimension(0:im-1)
: (out) 緯度動径(子午面)積分された 1 次元経度格子点データ
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

3 次元格子点データの緯度動径(子午面)積分

3 次元データ f(λ,φ,r) に対して

   ∫f(λ,φ,r) r^2cosφ dφdr

を計算する.

Original external subprogram is wu_module#x_IntLatRad_xyr

x_IntLatRad_xyz( xyz ) result(x_IntLatRad_xyz)
Function :
x_IntLatRad_xyz :real(8), dimension(0:im-1)
: (out) 緯度動径(子午面)積分された 1 次元経度格子点データ
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

3 次元格子点データの緯度動径(子午面)積分

3 次元データ f(λ,φ,r) に対して

   ∫f(λ,φ,r) r^2cosφ dφdr

を計算する.

Original external subprogram is wt_module#x_IntLatRad_xyz

x_IntLat_xy( xy_data ) result(x_IntLat_xy)
Function :
x_IntLat_xy(0:im-1) :real(8)
: (out) 積分された 1 次元経度(X)格子点データ
xy_data(0:im-1,1:jm) :real(8), intent(in)
: (in) 2 次元経度緯度格子点データ(0:im-1,1:jm)

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

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

Original external subprogram is wt_module#x_IntLat_xy

x_IntRad_xr( xr ) result(x_IntRad_xr)
Function :
x_IntRad_xr :real(8), dimension(0:im-1)
: (out) 動径積分された 1 次元経度格子点データ
xr :real(8), dimension(0:im-1,0:km), intent(in)
: (in) 2 次元緯度動径格子点データ

2 次元(XR)格子点データの動径方向域積分.

2 次元データ f(λ,r) に対して ∫f(λ,r) r^2dr を計算する.

Original external subprogram is wu_module#x_IntRad_xr

x_IntRad_xz( xz ) result(x_IntRad_xz)
Function :
x_IntRad_xz :real(8), dimension(0:im-1)
: (out) 動径積分された 1 次元経度格子点データ
xz :real(8), dimension(0:im-1,0:km), intent(in)
: (in) 2 次元緯度動径格子点データ

2 次元(XZ)格子点データの動径方向域積分.

2 次元データ f(λ,r) に対して ∫f(λ,r) r^2dr を計算する.

Original external subprogram is wt_module#x_IntRad_xz

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

Original external subprogram is wt_module#x_Lon

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

Original external subprogram is wt_module#x_Lon_Weight

xr_AvrLat_xyr( xyr ) result(xr_AvrLat_xyr)
Function :
xr_AvrLat_xyr :real(8), dimension(0:im-1,0:km)
: (out) 緯度平均された 2 次元緯度動径格子点データ
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

緯度積分

3 次元格子点データの緯度方向域平均.

3 次元データ f(λ,φ,r) に対して ∫f(λ,φ,r)cosφ dφ/2 を計算する.

Original external subprogram is wu_module#xr_AvrLat_xyr

xr_IntLat_xyr( xyr ) result(xr_IntLat_xyr)
Function :
xr_IntLat_xyr :real(8), dimension(0:im-1,0:km)
: (out) 緯度積分された 2 次元緯度動径格子点データ 緯度円格子点データ
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

3 次元格子点データの緯度方向域積分.

3 次元データ f(λ,φ,r) に対して∫f(λ,φ,r) cosφ dφ を計算する.

Original external subprogram is wu_module#xr_IntLat_xyr

xy_AvrRad_xyr( xyr ) result(xy_AvrRad_xyr)
Function :
xy_AvrRad_xyr :real(8), dimension(0:im-1,1:jm)
: 水平格子点データ (out) 動径平均された 2 次元経度緯度(水平, 球面)格子点データ
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

3 次元格子点データの動径方向域平均.

3 次元データ f(λ,φ,r) に対して

   ∫f(λ,φ,r) r^2dr/((r[o]^3-r[i]^3)/3)

を計算する.

Original external subprogram is wu_module#xy_AvrRad_xyr

xy_AvrRad_xyz( xyz ) result(xy_AvrRad_xyz)
Function :
xy_AvrRad_xyz :real(8), dimension(0:im-1,1:jm)
: (out) 動径平均された 2 次元経度緯度(水平, 球面)格子点データ 水平格子点データ
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

3 次元格子点データの動径方向域平均.

3 次元データ f(λ,φ,r) に対して

   ∫f(λ,φ,r) r^2dr/((r[o]^3-r[i]^3)/3)

を計算する.

Original external subprogram is wt_module#xy_AvrRad_xyz

xy_IntRad_xyr( xyr ) result(xy_IntRad_xyr)
Function :
xy_IntRad_xyr :real(8), dimension(0:im-1,1:jm)
: (out) 動径積分された 2 次元経度緯度(水平, 球面)格子点データ
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

動径積分

3 次元格子点データの動径方向域積分.

3 次元データ f(λ,φ,r) に対して∫f(λ,φ,r) r^2dr を計算する.

Original external subprogram is wu_module#xy_IntRad_xyr

xy_IntRad_xyz( xyz ) result(xy_IntRad_xyz)
Function :
xy_IntRad_xyz :real(8), dimension(0:im-1,1:jm)
: (out) 動径積分された 2 次元経度緯度(水平, 球面)格子点データ
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

動径積分

3 次元格子点データの動径方向域積分.

3 次元データ f(λ,φ,r) に対して∫f(λ,φ,r) r^2dr を計算する.

Original external subprogram is wt_module#xy_IntRad_xyz

xy_Lat
Variable :
xy_Lat(:,:) :real(8), allocatable

Original external subprogram is wt_module#xy_Lat

xy_Lon
Variable :
xy_Lon(:,:) :real(8), allocatable

Original external subprogram is wt_module#xy_Lon

xy_w( w_data, [ipow], [iflag] ) result(xy_w)
Function :
xy_w(0:im-1,1:jm) :real(8)
: (out) 格子点データ
w_data((nm+1)*(nm+1)) :real(8), intent(in)
: (in) スペクトルデータ
ipow :integer, intent(in), optional
: (in) 作用させる 1/cosφ の次数. 省略時は 0.
iflag :integer, intent(in), optional
: (in) 変換の種類
   0 : 通常の正変換
  -1 : 経度微分を作用させた逆変換
   1 : 緯度微分 cosφ・∂/∂φ を作用させた逆変換
   2 : sinφを作用させた逆変換
   省略時は 0.

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

Original external subprogram is wt_module#xy_w

xyr_Div_xyr_xyr_xyr( xyr_Vlon, xyr_Vlat, xyr_Vrad ) result(xyr_Div_xyr_xyr_xyr)
Function :
xyr_Div_xyr_xyr_xyr :real(8), dimension(0:im-1,1:jm,0:km)
: (out) ベクトル場の発散
xyr_Vlon :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の経度成分
xyr_Vlat :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の緯度成分
xyr_Vrad :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の動径成分

ベクトル成分である 3 つの格子データに発散を作用させる.

第 1, 2 ,3 引数(u,v,w)がそれぞれベクトルの経度成分, 緯度成分, 動径成分を表す.

極の特異性を回避するためにベクトル場に cosφ/r の重みをかけて 計算している.

     div V = (r/cosφ)・div (Vcosφ/r) + V_φtanφ/r + V_r/r

Original external subprogram is wu_module#xyr_Div_xyr_xyr_xyr

xyr_GradLat_wu( wu ) result(xyr_GradLat_wu)
Function :
xyr_GradLat_wu :real(8), dimension(0:im-1,1:jm,0:km)
: (out) 勾配型緯度微分を作用された 2 次元スペクトルデータ
wu :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

スペクトルデータに勾配型経度微分 1/r ∂/∂φ を作用させる.

Original external subprogram is wu_module#xyr_GradLat_wu

xyr_GradLon_wu( wu ) result(xyr_GradLon_wu)
Function :
xyr_GradLon_wu :real(8), dimension(0:im-1,1:jm,0:km)
: (out) 勾配型経度微分を作用された 2 次元スペクトルデータ
wu :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

スペクトルデータに勾配型経度微分 1/rcosφ・∂/∂λ を作用させる.

Original external subprogram is wu_module#xyr_GradLon_wu

xyr_KGrad_wu( wu ) result(xyr_KGrad_wu)
Function :
xyr_KGrad_wu :real(8), dimension(0:im-1,1:jm,0:km)
: (out) 軸方向微分を作用された 2 次元スペクトルデータ
wu :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

k・▽ = cosφ/r ∂/∂φ + sinφ∂/∂r

入力スペクトルデータに対応する格子データに軸方向微分

   k・▽ = cosφ/r ∂/∂φ + sinφ∂/∂r

を作用させた格子データが返される. ここでベクトル k は球の中心から北極向きの単位ベクトルである.

Original external subprogram is wu_module#xyr_KGrad_wu

xyr_LAT
Variable :
xyr_LAT :real(8), dimension(:,:,:), allocatable
: 座標

Original external subprogram is wu_module#xyr_LAT

xyr_LON
Variable :
xyr_LON :real(8), dimension(:,:,:), allocatable
: 座標

Original external subprogram is wu_module#xyr_LON

xyr_RAD
Variable :
xyr_RAD :real(8), dimension(:,:,:), allocatable
: 座標

Original external subprogram is wu_module#xyr_RAD

xyr_RotLat_wu_wu( wu_Vlon, wu_Vrad ) result(xyr_RotLat_wu_wu)
Function :
xyr_RotLat_wu_wu :real(8), dimension(0:im-1,1:jm,0:km)
: (out) ベクトル場の回転の緯度成分
wu_Vlon :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ベクトル場の経度成分
wu_Vrad :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ベクトル場の動径成分

ベクトル場の経度成分, 動径成分である第 1, 2 引数 Vlon, Vrad から 回転の緯度成分

   1/r ∂(r Vlon)/∂r - 1/rcosφ・∂Vrad/∂λ

を計算する.

Original external subprogram is wu_module#xyr_RotLat_wu_wu

xyr_RotLon_wu_wu( wu_Vrad, wu_Vlat ) result(xyr_RotLon_wu_wu)
Function :
xyr_RotLon_wu_wu :real(8), dimension(0:im-1,1:jm,0:km)
: (out) ベクトル場の回転の経度成分
wu_Vrad :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ベクトル場の動径成分
wu_Vlat :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ベクトル場の緯度成分

ベクトル場の動径成分, 緯度成分である第 1, 2 引数 Vrad, Vlat から 回転の経度成分

   1/r ∂Vrad/∂φ-1/r ∂(r Vlat)/∂r を計算する.

を計算する

Original external subprogram is wu_module#xyr_RotLon_wu_wu

xyr_wr( wr ) result(xyr_wr)
Function :
xyr_wr :real(8), dimension(0:im-1,1:jm,0:km)
: (out) 3 次元経度緯度動径格子点データ
wr :real(8), dimension((nm+1)*(nm+1),0:km), intent(in)
: (in) 2 次元球面調和函数スペクトル・動径格子点データ

水平スペクトル・動径格子点データから 3 次元格子点データへ(逆)変換する.

Original external subprogram is wu_module#xyr_wr

xyr_wu( wu ) result(xyr_wu)
Function :
xyr_wu :real(8), dimension(0:im-1,1:jm,0:km)
: (out) 3 次元経度緯度動径格子点データ
wu :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

スペクトルデータから 3 次元格子点データへ(逆)変換する.

Original external subprogram is wu_module#xyr_wu

xyz_Div_xyz_xyz_xyz( xyz_Vlon, xyz_Vlat, xyz_Vrad ) result(xyz_Div_xyz_xyz_xyz)
Function :
xyz_Div_xyz_xyz_xyz :real(8), dimension(0:im-1,1:jm,0:km)
: (out) ベクトル場の発散
xyz_Vlon :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の経度成分
xyz_Vlat :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の緯度成分
xyz_Vrad :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の動径成分

ベクトル成分である 3 つの格子データに発散を作用させる.

第 1, 2 ,3 引数(u,v,w)がそれぞれベクトルの経度成分, 緯度成分, 動径成分を表す.

極の特異性を回避するためにベクトル場に cosφ/r の重みをかけて 計算している.

     div V = (r/cosφ)・div (Vcosφ/r) + V_φtanφ/r + V_r/r

Original external subprogram is wt_module#xyz_Div_xyz_xyz_xyz

xyz_GradLat_wt( wt ) result(xyz_GradLat_wt)
Function :
xyz_GradLat_wt :real(8), dimension(0:im-1,1:jm,0:km)
: (out) 勾配型緯度微分を作用された 2 次元スペクトルデータ
wt :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

スペクトルデータに勾配型経度微分 1/r ∂/∂φ を作用させる.

Original external subprogram is wt_module#xyz_GradLat_wt

xyz_GradLon_wt( wt ) result(xyz_GradLon_wt)
Function :
xyz_GradLon_wt :real(8), dimension(0:im-1,1:jm,0:km)
: (out) 勾配型経度微分を作用された 2 次元スペクトルデータ
wt :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

スペクトルデータに勾配型経度微分 1/rcosφ・∂/∂λ を作用させる.

Original external subprogram is wt_module#xyz_GradLon_wt

xyz_KGrad_wt( wt ) result(xyz_KGrad_wt)
Function :
xyz_KGrad_wt :real(8), dimension(0:im-1,1:jm,0:km)
: (out) 軸方向微分を作用された 2 次元スペクトルデータ
wt :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

k・▽ = cosφ/r ∂/∂φ + sinφ∂/∂r

入力スペクトルデータに対応する格子データに軸方向微分

   k・▽ = cosφ/r ∂/∂φ + sinφ∂/∂r

を作用させた格子データが返される. ここでベクトル k は球の中心から北極向きの単位ベクトルである.

Original external subprogram is wt_module#xyz_KGrad_wt

xyz_LAT
Variable :
xyz_LAT :real(8), dimension(:,:,:), allocatable
: 座標

Original external subprogram is wt_module#xyz_LAT

xyz_LON
Variable :
xyz_LON :real(8), dimension(:,:,:), allocatable
: 座標

Original external subprogram is wt_module#xyz_LON

xyz_RAD
Variable :
xyz_RAD :real(8), dimension(:,:,:), allocatable
: 座標

Original external subprogram is wt_module#xyz_RAD

xyz_RotLat_wt_wt( wt_Vlon, wt_Vrad ) result(xyz_RotLat_wt_wt)
Function :
xyz_RotLat_wt_wt :real(8), dimension(0:im-1,1:jm,0:km)
: (out) ベクトル場の回転の緯度成分
wt_Vlon :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ベクトル場の経度成分
wt_Vrad :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ベクトル場の動径成分

ベクトル場の経度成分, 動径成分である第 1, 2 引数 Vlon, Vrad から 回転の緯度成分

   1/r ∂(r Vlon)/∂r - 1/rcosφ・∂Vrad/∂λ

を計算する.

Original external subprogram is wt_module#xyz_RotLat_wt_wt

xyz_RotLon_wt_wt( wt_Vrad, wt_Vlat ) result(xyz_RotLon_wt_wt)
Function :
xyz_RotLon_wt_wt :real(8), dimension(0:im-1,1:jm,0:km)
: (out) ベクトル場の回転の経度成分
wt_Vrad :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ベクトル場の動径成分
wt_Vlat :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ベクトル場の緯度成分

ベクトル場の動径成分, 緯度成分である第 1, 2 引数 Vrad, Vlat から 回転の経度成分

   1/r ∂Vrad/∂φ-1/r ∂(r Vlat)/∂r を計算する.

を計算する

Original external subprogram is wt_module#xyz_RotLon_wt_wt

xyz_wt( wt ) result(xyz_wt)
Function :
xyz_wt :real(8), dimension(0:im-1,1:jm,0:km)
: (out) 3 次元経度緯度動径格子点データ
wt :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

スペクトルデータから 3 次元格子点データへ(逆)変換する.

Original external subprogram is wt_module#xyz_wt

xyz_wz( wz ) result(xyz_wz)
Function :
xyz_wz :real(8), dimension(0:im-1,1:jm,0:km)
: (out) 3 次元経度緯度動径格子点データ
wz :real(8), dimension((nm+1)*(nm+1),0:km), intent(in)
: (in) 2 次元球面調和函数スペクトル・動径格子点データ

水平スペクトル・動径格子点データから 3 次元格子点データへ(逆)変換する.

Original external subprogram is wt_module#xyz_wz

xz_AvrLat_xyz( xyz ) result(xz_AvrLat_xyz)
Function :
xz_AvrLat_xyz :real(8), dimension(0:im-1,0:km)
: (out) 緯度平均された 2 次元緯度動径格子点データ
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

緯度積分

3 次元格子点データの緯度方向域平均.

3 次元データ f(λ,φ,r) に対して ∫f(λ,φ,r)cosφ dφ/2 を計算する.

Original external subprogram is wt_module#xz_AvrLat_xyz

xz_IntLat_xyz( xyz ) result(xz_IntLat_xyz)
Function :
xz_IntLat_xyz :real(8), dimension(0:im-1,0:km)
: (out) 緯度積分された 2 次元緯度動径格子点データ. 緯度円格子点データ
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

3 次元格子点データの緯度方向域積分.

3 次元データ f(λ,φ,r) に対して∫f(λ,φ,r) cosφ dφ を計算する.

Original external subprogram is wt_module#xz_IntLat_xyz

y_AvrLonRad_xyr( xyr ) result(y_AvrLonRad_xyr)
Function :
y_AvrLonRad_xyr :real(8), dimension(1:jm)
: (out) 経度動径(緯度円)平均された 1 次元緯度格子点データ
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

経度動径(緯度円)積分

3 次元格子点データの経度動径(緯度円)平均.

3 次元データ f(λ,φ,r) に対して

    ∫f(λ,φ,r) r^2dλdr /(2π(r[o]^3-r[i]^3)/3)

を計算する.

Original external subprogram is wu_module#y_AvrLonRad_xyr

y_AvrLonRad_xyz( xyz ) result(y_AvrLonRad_xyz)
Function :
y_AvrLonRad_xyz :real(8), dimension(1:jm)
: (out) 経度動径(緯度円)平均された 1 次元緯度格子点データ
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

経度動径(緯度円)積分

3 次元格子点データの経度動径(緯度円)平均.

3 次元データ f(λ,φ,r) に対して

    ∫f(λ,φ,r) r^2dλdr /(2π(r[o]^3-r[i]^3)/3)

を計算する.

Original external subprogram is wt_module#y_AvrLonRad_xyz

y_AvrLon_xy( xy_data ) result(y_AvrLon_xy)
Function :
y_AvrLon_xy(1:jm) :real(8)
: (out) 平均された 1 次元緯度(Y)格子点
xy_data(0:im-1,1:jm) :real(8), intent(in)
: (in) 2 次元経度緯度格子点データ(0:im-1,1:jm)

2 次元緯度経度格子点データの経度(X)方向平均(1 層用).

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

Original external subprogram is wt_module#y_AvrLon_xy

y_AvrRad_yr( yr ) result(y_AvrRad_yr)
Function :
y_AvrRad_yr :real(8), dimension(1:jm)
: (out) 動径平均された 1 次元緯度格子点データ
yr :real(8), dimension(1:jm,0:km), intent(in)
: (in) 2 次元緯度動径(子午面)格子点データ

2 次元(YR)格子点データの動径方向域平均.

2 次元データ f(φ,r) に対して ∫f(φ,r) r^2dr /((r[o]^3-r[i]^3)/3) を計算する.

Original external subprogram is wu_module#y_AvrRad_yr

y_AvrRad_yz( yz ) result(y_AvrRad_yz)
Function :
y_AvrRad_yz :real(8), dimension(1:jm)
: (out) 動径平均された 1 次元緯度格子点データ
yz :real(8), dimension(1:jm,0:km), intent(in)
: (in) 2 次元緯度動径(子午面)格子点データ

2 次元(YZ)格子点データの動径方向域平均.

2 次元データ f(φ,r) に対して ∫f(φ,r) r^2dr /((r[o]^3-r[i]^3)/3) を計算する.

Original external subprogram is wt_module#y_AvrRad_yz

y_IntLonRad_xyr( xyr ) result(y_IntLonRad_xyr)
Function :
y_IntLonRad_xyr :real(8), dimension(1:jm)
: (out) 経度動径(緯度円)積分された 1 次元緯度格子点データ
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

3 次元格子点データの経度動径(緯度円)積分.

3 次元データ f(λ,φ,r) に対して∫f(λ,φ,r) r^2dλdr を計算する.

Original external subprogram is wu_module#y_IntLonRad_xyr

y_IntLonRad_xyz( xyz ) result(y_IntLonRad_xyz)
Function :
y_IntLonRad_xyz :real(8), dimension(1:jm)
: (out) 経度動径(緯度円)積分された 1 次元緯度格子点データ
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

3 次元格子点データの経度動径(緯度円)積分.

3 次元データ f(λ,φ,r) に対して∫f(λ,φ,r) r^2dλdr を計算する.

Original external subprogram is wt_module#y_IntLonRad_xyz

y_IntLon_xy( xy_data ) result(y_IntLon_xy)
Function :
y_IntLon_xy(1:jm) :real(8)
: (out) 積分された 1 次元緯度(Y)格子点データ
xy_data(0:im-1,1:jm) :real(8), intent(in)
: (in) 2 次元経度緯度格子点データ(0:im-1,1:jm)

2 次元緯度経度格子点データの経度(X)方向積分(1 層用).

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

Original external subprogram is wt_module#y_IntLon_xy

y_IntRad_yr( yr ) result(y_IntRad_yr)
Function :
y_IntRad_yr :real(8), dimension(1:jm)
: (out) 動径積分された 1 次元緯度格子点データ
yr :real(8), dimension(1:jm,0:km), intent(in)
: (in) 2 次元緯度動径(子午面)格子点データ

動径積分

2 次元(YR)格子点データの動径方向域積分.

2 次元データ f(φ,r) に対して∫f(φ,r) r^2dr を計算する.

Original external subprogram is wu_module#y_IntRad_yr

y_IntRad_yz( yz ) result(y_IntRad_yz)
Function :
y_IntRad_yz :real(8), dimension(1:jm)
: (out) 動径積分された 1 次元緯度格子点データ
yz :real(8), dimension(1:jm,0:km), intent(in)
: (in) 2 次元緯度動径(子午面)格子点データ

動径積分

2 次元(YZ)格子点データの動径方向域積分.

2 次元データ f(φ,r) に対して∫f(φ,r) r^2dr を計算する.

Original external subprogram is wt_module#y_IntRad_yz

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

Original external subprogram is wt_module#y_Lat

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

Original external subprogram is wt_module#y_Lat_Weight

yr_AvrLon_xyr( xyr ) result(yr_AvrLon_xyr)
Function :
yr_AvrLon_xyr :real(8), dimension(1:jm,0:km)
: (out) 経度方向(帯状)平均された 2 次元子午面格子点データ
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

経度(帯状)積分

3 次元格子点データの経度方向(帯状)平均.

3 次元データ f(λ,φ,r) に対して ∫f(λ,φ,r)dλ/2π を計算する.

Original external subprogram is wu_module#yr_AvrLon_xyr

yr_IntLon_xyr( xyr ) result(yr_IntLon_xyr)
Function :
yr_IntLon_xyr :real(8), dimension(1:jm,0:km)
: (out) 経度方向(帯状)積分された 2 次元子午面格子点データ
xyr :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

経度(帯状)積分

3 次元格子点データの経度方向(帯状)積分.

3 次元データ f(λ,φ,r) に対して ∫f(λ,φ,r)dλ を計算する.

Original external subprogram is wu_module#yr_IntLon_xyr

yz_AvrLon_xyz( xyz ) result(yz_AvrLon_xyz)
Function :
yz_AvrLon_xyz :real(8), dimension(1:jm,0:km)
: (out) 経度方向(帯状)平均された 2 次元子午面格子点データ
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

経度(帯状)積分

3 次元格子点データの経度方向(帯状)平均.

3 次元データ f(λ,φ,r) に対して ∫f(λ,φ,r)dλ/2π を計算する.

Original external subprogram is wt_module#yz_AvrLon_xyz

yz_IntLon_xyz( xyz ) result(yz_IntLon_xyz)
Function :
yz_IntLon_xyz :real(8), dimension(1:jm,0:km)
: (out) 経度方向(帯状)積分された 2 次元子午面格子点データ
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

経度(帯状)積分

3 次元格子点データの経度方向(帯状)積分.

3 次元データ f(λ,φ,r) に対して ∫f(λ,φ,r)dλ を計算する.

Original external subprogram is wt_module#yz_IntLon_xyz

z_AvrLat_yz( yz ) result(z_AvrLat_yz)
Function :
z_AvrLat_yz :real(8), dimension(0:km)
: (out) 緯度平均された 1 次元動径格子点データ
yz :real(8), dimension(1:jm,0:km), intent(in)
: (in) 2 次元緯度動径(子午面)格子点データ

2 次元(YZ)格子点データの緯度方向域平均.

2 次元データ f(φ,r) に対して ∫f(φ,r) cosφ dφ/2 を計算する.

Original external subprogram is wt_module#z_AvrLat_yz

z_AvrLonLat_xyz( xyz ) result(z_AvrLonLat_xyz)
Function :
z_AvrLonLat_xyz :real(8), dimension(0:km)
: (out) 緯度経度(水平, 球面)平均された 1 次元動径格子点データ
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

緯度経度(水平)積分

3 次元格子点データの緯度経度(水平, 球面)積分

3 次元データ f(λ,φ,r) に対して

   ∫f(λ,φ,r) cosφ dλdφ /4π

を計算する.

Original external subprogram is wt_module#z_AvrLonLat_xyz

z_AvrLon_xz( xz ) result(z_AvrLon_xz)
Function :
z_AvrLon_xz :real(8), dimension(0:km)
: (out) 経度平均された 1 次元動径格子点データ
xz :real(8), dimension(0:im-1,0:km), intent(in)
: (in) 2 次元緯度動径格子点データ

経度(帯状)積分

2 次元(XZ)格子点データの経度方向平均.

2 次元データ f(λ,r) に対して ∫f(λ,r)dλ/2π を計算する.

Original external subprogram is wt_module#z_AvrLon_xz

z_IntLat_yz( yz ) result(z_IntLat_yz)
Function :
z_IntLat_yz :real(8), dimension(0:km)
: (out) 緯度積分された 1 次元動径格子点データ
yz :real(8), dimension(jm,0:km), intent(in)
: (in) 2 次元緯度動径(子午面)格子点データ

緯度積分

2 次元(YZ)格子点データの緯度方向域積分.

2 次元データ f(φ,r) に対して∫f(φ,r) cosφ dφ を計算する.

Original external subprogram is wt_module#z_IntLat_yz

z_IntLonLat_xyz( xyz ) result(z_IntLonLat_xyz)
Function :
z_IntLonLat_xyz :real(8), dimension(0:km)
: (out) 緯度経度(水平, 球面)積分された 1 次元動径格子点データ
xyz :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

緯度経度(水平)積分

3 次元格子点データの緯度経度(水平, 球面)積分

3 次元データ f(λ,φ,r) に対して

   ∫f(λ,φ,r) cosφ dλdφ

を計算する.

Original external subprogram is wt_module#z_IntLonLat_xyz

z_IntLon_xz( xz ) result(z_IntLon_xz)
Function :
z_IntLon_xz :real(8), dimension(0:km)
: (out) 経度積分された 1 次元動径格子点データ
xz :real(8), dimension(0:im-1,0:km), intent(in)
: (in) 2 次元緯度動径格子点データ

2 次元(XZ)格子点データの経度方向積分.

2 次元データ f(λ,r) に対して ∫f(λ,r)dλ を計算する.

Original external subprogram is wt_module#z_IntLon_xz

z_RAD
Variable :
g_X(:) :real(8), allocatable
: 格子点座標 km 次のチェビシェフ多項式の零点から定まる格子点

Original external subprogram is wt_module#z_RAD

z_RAD_WEIGHT
Variable :
g_X_Weight(:) :real(8), allocatable
: 格子点重み座標 各格子点における積分のための重みが格納してある

Original external subprogram is wt_module#z_RAD_WEIGHT

[Validate]