spml/w_module モジュールは球面上での 2 次元流体運動を 球面調和函数を用いたスペクトル法によって数値計算するための Fortran90 関数を提供する. 内部で ISPACK の SPPACK と SNPACK の Fortran77 サブルーチンを呼んでいる. スペクトルデータおよび格子点データの格納方法や 変換の詳しい計算法については ISPACK/SNPACK,SPPACK のマニュアルを参照されたい.
w_module は実際には基本変換, 微分計算, 積分・平均計算をそれぞれ担っている 下部モジュール w_base_module, w_deriv_module, w_integral_module からなっている.
初期化 | 機能 |
---|---|
w_Initial | スペクトル変換の格子点数, 波数, 領域の大きさの設定 |
座標変数 | 機能 |
x_Lon, y_Lat | 格子点座標(X,Y座標)を格納した 1 次元配列. |
x_Lon_weight, y_Lat_Weight | 重み座標を格納した 1 次元配列. |
xy_Lon, xy_Lat | 格子点データの XY 座標(X,Y)(格子点データ型 2 次元配列) |
基本変換 | 機能 |
xy_w | スペクトルデータから格子データへの変換 |
w_xy | 格子データからスペクトルデータへの変換 |
l_nm, nm_l | スペクトルデータの格納位置と全波数・帯状波数の変換 |
微分 | 機能 |
w_Lapla_w | スペクトルデータにラプラシアンを作用させる |
rn | スペクトルデータのラプラシアンを計算するための係数. |
irm | 経度微分演算用配列 |
w_LaplaInv_w | スペクトルデータにラプラシアンの逆変換を作用させる |
w_DLon_w | スペクトルデータに経度微分 ∂/∂λ を作用させる |
xy_GradLon_w | スペクトルデータに勾配型経度微分 1/cosφ・∂/∂λ を作用させる |
xy_GradLat_w | スペクトルデータに勾配型緯度微分 ∂/∂φ を作用させる |
w_DivLon_xy | 格子データに発散型経度微分 1/cosφ・∂/∂λ を作用させる |
w_DivLat_xy | 格子データに発散型緯度微分 1/cosφ・∂(g cosφ)/∂φ を作用させる |
w_Div_xy_xy | ベクトル成分である 2 つの格子データに発散を作用させる |
w_Jacobian_w_w | 2 つのスペクトルデータからヤコビアンを計算する. |
積分・平均 | 機能 |
IntLonLat_xy, AvrLonLat_xy | 2 次元格子点データの全領域積分および平均. |
y_IntLon_xy, y_AvrLon_xy | 2 次元格子点データの経度方向積分および平均. |
IntLon_x, AvrLon_x | 1 次元(X)格子点データの経度方向積分および平均. |
x_IntLat_xy, x_AvrLat_xy | 2 次元格子点データの緯度方向積分および平均. |
IntLat_y, AvrLat_y | 1 次元(Y)格子点データの緯度方向積分および平均. |
integer,intent(in) :: nm ! 切断全波数 integer,intent(in) :: im, jm ! 格子点数(経度λ, 緯度φ)
real(8), dimension(im) :: x_Lon real(8), dimension(jm) :: y_Lat
real(8), dimension(im) :: x_X_Weigtht real(8), dimension(jm) :: y_Y_Weigtht
real(8), dimension(im,jm) :: xy_Lon, xy_Lat
real(8), dimension((nm+1)*(nm+1),2)) :: rn ! ラプラシアン演算用配列
integer, dimension((nm+1)*(nm+1),2)) :: irm ! 経度微分演算用配列
integer :: l_nm ! スペクトルデータ位置 integer, intent(in) :: n, m ! 全波数, 帯状波数
integer :: nm_l(2) ! 全波数, 帯状波数 integer, intent(in) :: l ! スペクトルデータの格納位置
real(8) :: xy_w(im,jm) ! 格子点 real(8), intent(in) :: w_data((nm+1)*(nm+1)) ! スペクトル integer, intent(in), optional :: ipow ! 作用させる 1/cosφ の次数 integer, intent(in), optional :: iflag ! 変換の種類
real(8) :: w_xy((nm+1)*(nm+1))! スペクトル real(8), intent(in) :: xy_data(im,jm) ! 格子点 integer, intent(in), optional :: ipow ! 作用させる 1/cosφ の次数 integer, intent(in), optional :: iflag ! 変換の種類
real(8) :: w_Lapla_w((nm+1)*(nm+1)) real(8), intent(in) :: w_data((nm+1)*(nm+1))
real(8) :: w_LaplaInv_w((nm+1)*(nm+1)) real(8), intent(in) :: w_data((nm+1)*(nm+1))
real(8) :: w_DLon_w((nm+1)*(nm+1)) real(8), intent(in) :: w_data((nm+1)*(nm+1))
real(8) :: xy_GradLat_w(im,jm) real(8), intent(in) :: w_data((nm+1)*(nm+1))
real(8) :: xy_GradLat_w(im,jm) real(8), intent(in) :: w_data((nm+1)*(nm+1))
real(8) :: w_DivLon_xy((nm+1)*(nm+1)) real(8), intent(in) :: xy_data(im,jm)
real(8) :: w_DivLat_xy((nm+1)*(nm+1)) real(8), intent(in) :: xy_data(im,jm)
real(8) :: w_Div_xy_xy((nm+1)*(nm+1)) real(8), intent(in) :: xy_u(im,jm) ! ベクトル経度成分 real(8), intent(in) :: xy_v(im,jm) ! ベクトル緯度成分
real(8) :: w_Jacobian_w_w((nm+1)*(nm+1)) real(8), intent(in) :: w_a((nm+1)*(nm+1)) real(8), intent(in) :: w_b((nm+1)*(nm+1))
real(8), dimension(im,jm) :: xy ! 2 次元格子点 real(8) :: IntLonLat_xy ! 積分値 real(8), dimension(im,jm) :: xy ! 2 次元格子点 real(8) :: AvrLonLat_xy ! 平均値
real(8), dimension(im,jm) :: xy ! 2 次元格子点 real(8), dimension(jm) :: y_IntLon_xy ! 1 次元(緯度)格子点 real(8), dimension(im,jm) :: xy ! 2 次元格子点 real(8), dimension(jm) :: y_AvrLon_xy ! 1 次元(緯度)格子点
real(8), dimension(im) :: x ! 1 次元格子点 real(8) :: IntLon_x ! 積分値 real(8), dimension(im) :: x ! 1 次元格子点 real(8) :: AvrLon_x ! 平均値
real(8), dimension(im,jm) :: xy ! 2 次元格子点 real(8), dimension(im) :: x_IntLat_xy ! 1 次元(経度)格子点 real(8), dimension(im,jm) :: xy ! 2 次元格子点 real(8), dimension(im) :: x_AvrLat_xy ! 1 次元(経度)格子点
real(8), dimension(jm) :: y ! 1 次元格子点 real(8) :: IntLat_y ! 積分値 real(8), dimension(jm) :: y ! 1 次元格子点 real(8) :: AvrLat_y ! 平均値