spml/wt_module モジュールは球面上での流体運動を スペクトル法によって数値計算するための Fortran90 関数を提供するものである. 水平方向に球面調和函数変換および 上下の境界壁を扱うためのチェビシェフ変換を用いる場合の スペクトル計算のためのさまざまな関数を提供する. 内部で wa_module, at_module を用いている. 最下部では球面調和変換およびチェビシェフ変換のエンジンとして ISPACK の Fortran77 サブルーチンを用いている.
| 初期化 | 機能 |
|---|---|
| wt_Initial | スペクトル変換の格子点数, 波数, 領域の大きさの設定 |
| 座標変数 | 機能 |
| x_Lon, y_Lat, z_Rad | 格子点座標(経度, 緯度, 動径座標)を格納した 1 次元配列. |
| x_Lon_weight, y_Lat_Weight x_Rad_Weight | 重み座標を格納した 1 次元配列. |
| xyz_Lon, xyz_Lat, xyz_Rad | 格子点データの経度・緯度・動径座標(X,Y,Z)(格子点データ型 3 次元配列) |
| wz_Rad | 格子点データの動径座標(水平スペクトル・動径格子点データ型 2 次元配列) |
| 基本変換 | 機能 |
| xyz_wt, wt_xyz | スペクトルデータと 3 次元格子データの間の変換 (球面調和函数, チェビシェフ変換) |
| xyz_wz, wz_xyz | 3 次元格子データと水平スペクトル・動径格子データとの間の変換 (球面調和変換) |
| wz_wt, wt_wz | 水平スペクトル・動径格子データとスペクトルデータとの間の変換 (チェビシェフ変換) |
| xy_w, w_xy | スペクトルデータと 2 次元水平格子データの間の変換 (球面調和函数変換) |
| az_at, at_az | 格子データとチェビシェフデータの間の変換を同時に複数個行う (チェビシェフ変換) |
| 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 ∂/∂r r = ∂/∂r + 1/r を作用させる |
| wt_Lapla_wt | スペクトルデータにラプラシアンを作用させる |
| xyz_GradLon_wt | スペクトルデータに勾配型経度微分 1/cosφ・∂/∂λ を作用させる |
| xyz_GradLat_wt | スペクトルデータに勾配型緯度微分 ∂/∂φ を作用させる |
| wt_DivLon_xyz | 格子データに発散型経度微分 1/cosφ・∂/∂λ を作用させる |
| wt_DivLat_xyz | 格子データに発散型緯度微分 1/cosφ・∂(g cosφ)/∂φ を作用させる |
| wt_Div_xyt_xyt_xyz | ベクトル成分である 3 つの格子データに発散を作用させる |
| トロイダルポロイダル計算用微分 | 機能 |
| 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・(▽×v) を計算する |
| wt_RadRotRot_xyz_xyz_xyz | ベクトルの v の r・(▽×▽×v) を計算する |
| wt_Potential2Vector | トロイダルポロイダルポテンシャルからベクトル場を計算する |
| 非線形計算 | 機能 |
| wt_VGradV | ベクトル v から v・▽v を計算する |
| 境界値問題 | 機能 |
| 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 | 磁場トロイダルポテンシャル境界の境界条件を適用する(タウ法, 選点法) |
| 積分・平均 | 機能 |
| 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 次元格子点データの動径方向積分および平均 |
integer,intent(in) :: im, jm, km ! 格子点数(経度λ, 緯度φ, 動径 r)
integer,intent(in) :: nm, lm ! 切断波数(水平, 動径)
real(8) :: rmin, rmax ! 動径座標の範囲(球殻内外半径)
real(8), dimension(im,jm,0:km) :: xyz_VLon ! ベクトル場(経度成分)
real(8), dimension(im,jm,0:km) :: xyz_VLat ! ベクトル場(緯度成分)
real(8), dimension(im,jm,0:km) :: xyz_VRad ! ベクトル場(動径成分)
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_TorPot ! トロイダルポテンシャル
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_PorPot ! ポロイダルポテンシャル
real(8), dimension(im,jm,0:km),intent(out) :: xyz_VGradV_Lon ! v・▽v の経度成分(出力)
real(8), dimension(im,jm,0:km),intent(out) :: xyz_VGradV_Lat ! v・▽v の緯度成分(出力)
real(8), dimension(im,jm,0:km),intent(out) :: xyz_VGradV_Rad ! v・▽v の動径成分(出力)
real(8), dimension(im,jm,0:km),intent(in) :: xyz_VLon ! ベクトル場経度成分(入力)
real(8), dimension(im,jm,0:km),intent(in) :: xyz_VLat ! ベクトル場緯度成分(入力)
real(8), dimension(im,jm,0:km),intent(in) :: xyz_VRad ! ベクトル場動径成分(入力)
real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout) :: wt
! 境界条件を適用するデータ. 修正された値を返す.
real(8), dimension((nm+1)*(nm+1),2), intent(in), optional :: values
! 境界での 値/勾配 分布を水平スペクトル変換したものを与える.
! 省略時は値/勾配 0 となる.
character(len=2), intent(in), optional :: cond
! 境界条件. 省略時は 'DD'
! DD : 両端ディリクレ
! DN,ND : ディリクレ/ノイマン条件
! NN : 両端ノイマン
real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout) :: wt
! 境界条件を適用するデータ. 修正された値を返す.
real(8), dimension((nm+1)*(nm+1),2), intent(in), optional :: values
! 境界での 値/勾配 分布を水平スペクトル変換したものを与える.
! 省略時は値/勾配 0 となる.
character(len=2), intent(in), optional :: cond
! 境界条件. 省略時は 'DD'
! DD : 両端ディリクレ
! DN,ND : ディリクレ/ノイマン条件
! NN : 両端ノイマン
real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout) :: wt_TorPot
! 境界条件を適用するデータ. 修正された値を返す.
character(len=2), intent(in), optional :: cond
! 境界条件スイッチ. 省略時は 'RR'
! RR : 両端粘着条件
! RF,FR : 粘着/応力なし条件
! FF : 両端応力なし条件
real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout) :: wt_TorPot
! 境界条件を適用するデータ. 修正された値を返す.
character(len=2), intent(in), optional :: cond
! 境界条件スイッチ. 省略時は 'RR'
! RR : 両端粘着条件
! RF,FR : 粘着/応力なし条件
! FF : 両端応力なし条件
real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout) :: wt_TorMag
! 境界条件を適用するデータ. 修正された値を返す.
real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout) :: wt_TorMag
! 境界条件を適用するデータ. 修正された値を返す.
real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout) :: wt_PolMag
! 境界条件を適用するデータ. 修正された値を返す.
real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout) :: wt_PolMag
! 境界条件を適用するデータ. 修正された値を返す.
real(8), dimension(0:km) :: z_Rad
real(8), dimension(0:km) :: z_Rad_Weigtht
real(8), dimension(im,jm,0:km) :: xyz_Lon, xyz_Lat, xyz_Rad
real(8), dimension((nm+1)*(nm+1),0:km) :: wz_Rad
real(8), dimension(im,jm,0:km) :: xyz_wt
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_xyz
real(8), dimension(im,jm,0:km), intent(in) :: xyz
real(8), dimension(im,jm,0:km) :: xyz_wz
real(8), dimension((nm+1)*(nm+1),0:km), intent(in) :: wz_data
real(8), dimension((nm+1)*(nm+1),0:km) :: wz_xyz
real(8), dimension(im,jm,0:km), intent(in) :: xyz
real(8), dimension((nm+1)*(nm+1),0:km) :: wt_wz
real(8), dimension((nm+1)*(nm+1),0:km), intent(in) :: wz
real(8), dimension((nm+1)*(nm+1),0:km) :: wz_wt
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_data
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_data
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_DRad_wt
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_data
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_DivRad_wt
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_data
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_RotRad_wt
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_Lapla_wt
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_data
real(8), dimension(im,jm,0:km) :: xyz_GradLon_wt
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_data
real(8), dimension(im,jm,0:km) :: xyz_GradLat_wt
real(8), dimension(im,jm,0:km), intent(in) :: xyz
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_DivLon_xyz
real(8), dimension(im,jm,0:km), intent(in) :: xyz_data
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_DivLat_xyz
real(8), dimension(im,jm,0:km), intent(in) :: xyz_Vlon ! 経度成分
real(8), dimension(im,jm,0:km), intent(in) :: xyz_Vlat ! 緯度成分
real(8), dimension(im,jm,0:km), intent(in) :: xyz_Vrad ! 動径成分
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_Div_xyz_xyz_xyz
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_data
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_KxRGrad_wt
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_data
real(8), dimension(im,jm,0:km) :: xyz_KGrad_wt
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_data
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_L2_wt
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_data
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_L2Inv_wt
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_data
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_QOperator_wt
real(8), dimension(im,jm,0:km), intent(in) :: xyz_VLon
real(8), dimension(im,jm,0:km), intent(in) :: xyz_VLat
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_RadRot_xyz_xyz
real(8), dimension(im,jm,0:km), intent(in) :: xyz_VLon
real(8), dimension(im,jm,0:km), intent(in) :: xyz_VLat
real(8), dimension(im,jm,0:km), intent(in) :: xyz_VRad
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_RadRotRot_xyz_xyz_xyz
real(8), dimension((nm+1)*(nm+1),0:km),intent(in) :: wz_data
! 入力▽^2Φ分布
real(8), dimension((nm+1)*(nm+1),0:km) :: wz_LaplaPol2Pol_wz
! 出力ポロイダルポテンシャル分布
character(len=2), intent(in), optional :: cond
! 境界条件スイッチ. 省略時は 'RR'
! RR : 両端粘着条件
! RF,FR : 粘着/応力なし条件
! FF : 両端応力なし条件
real(8), dimension((nm+1)*(nm+1),0:lm),intent(in) :: wt_data
! 入力▽^2Φ分布
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_LaplaPol2Pol_wt
! 出力ポロイダルポテンシャル分布
character(len=2), intent(in), optional :: cond
! 境界条件スイッチ. 省略時は 'RR'
! RR : 両端粘着条件
! RF,FR : 粘着/応力なし条件
! FF : 両端応力なし条件
real(8), dimension(im,jm,0:km), intent(in) :: xyz_data ! 3 次元格子点データ
real(8) :: IntLonLatRad_xyz ! 全球積分値
real(8), dimension(im,jm,0:km), intent(in) :: xyz_data ! 3 次元格子点データ
real(8) :: AvrLonLatRad_xyz ! 全球平均値
real(8), dimension(im,jm,0:km), intent(in) :: xyz_data ! 3 次元格子点データ
real(8), dimension(0:km) :: z_IntLonLat_xyz ! 動径格子点データ
real(8), dimension(im,jm,0:km), intent(in) :: xyz_data ! 3 次元格子点データ
real(8), dimension(0:km) :: z_AvrLonLat_xyz ! 動径格子点データ
real(8), dimension(im,jm,0:km), intent(in) :: xyz_data ! 3 次元格子点データ
real(8), dimension(jm) :: y_IntLonRad_xyz ! 緯度格子点データ
real(8), dimension(im,jm,0:km), intent(in) :: xyz_daa ! 3 次元格子点データ
real(8), dimension(jm) :: y_AvrLonRad_xyz ! 緯度格子点データ
real(8), dimension(im,jm,0:km), intent(in) :: xyz_data ! 3 次元格子点データ
real(8), dimension(im) :: x_IntLatRad_xyz ! 経度格子点データ
real(8), dimension(im,jm,0:km), intent(in) :: xyz_data ! 3 次元格子点データ
real(8), dimension(im) :: x_AvrLatRad_xyz ! 経度格子点データ
real(8), dimension(im,jm,0:km), intent(in) :: xyz_data ! 3 次元格子点データ
real(8), dimension(jm,0:km) :: yz_IntLon_xyz ! 子午面格子点データ
real(8), dimension(im,jm,0:km), intent(in) :: xyz_data ! 3 次元格子点データ
real(8), dimension(jm,0:km) :: yz_AvrLon_xyz ! 子午面格子点データ
real(8), dimension(im,jm,0:km), intent(in) :: xyz_data ! 3 次元格子点データ
real(8), dimension(im,0:km) :: xz_IntLat_xyz ! 緯度円格子点データ
real(8), dimension(im,jm,0:km), intent(in) :: xyz_data ! 3 次元格子点データ
real(8), dimension(im,0:km) :: xz_AvrLat_xyz ! 緯度円格子点データ
real(8), dimension(im,jm,0:km), intent(in) :: xyz_data ! 3 次元格子点データ
real(8), dimension(im,jm) :: xy_IntRad_xyz ! 水平格子点データ
real(8), dimension(im,jm,0:km), intent(in) :: xyz_data ! 3 次元格子点データ
real(8), dimension(im,jm) :: xy_AvrRad_xyz ! 水平格子点データ