spml/wa_module モジュールは球面上での流体運動を 球面調和函数を用いたスペクトル法によって数値計算するための 基本的な Fortran90 関数を提供するものである. 球面上の 1 層モデル用 w_module モジュールを多層モデル用に 拡張したものであり, 同時に複数個のスペクトルデータ, 格子点データに 対する変換や微分計算が行える. 内部で ISPACK の SPPACK と SNPACK の Fortran77 サブルーチンを呼んでいる. スペクトルデータおよび格子点データの格納方法や 変換の詳しい計算法については ISPACK/SNPACK,SPPACK のマニュアルを参照されたい.
wa_module は実際には基本変換, 微分計算, 積分・平均計算をそれぞれ担っている 下部モジュール wa_base_module, wa_deriv_module, wa_integral_module, およびそれらの 1 層用モジュールである w_base_module, w_deriv_module, w_integral_module から構成されている.
初期化 | 機能 |
---|---|
wa_Initial | スペクトル変換の格子点数, 波数, 領域の大きさ, 同時に計算するデータの個数の最大値の設定 |
座標変数 | 機能 |
x_Lon, y_Lat | 格子点座標(経度・緯度座標)を格納した 1 次元配列. |
x_Lon_weight, y_Lat_Weight | 重み座標を格納した 1 次元配列. |
xy_Lon, xy_Lat | 格子点データの経度・緯度座標(X,Y)(格子点データ型 2 次元配列) |
基本変換 | 機能 |
xya_wa, xy_w | スペクトルデータから格子データへの変換(多層, 1 層用) |
wa_xya, w_xy | 格子データからスペクトルデータへの変換(多層, 1 層用) |
l_nm, nm_l | スペクトルデータの格納位置と全波数・帯状波数の変換 |
微分 | 機能 |
wa_Lapla_wa, w_Lapla_w | スペクトルデータにラプラシアンを作用させる(多層, 1 層用) |
wa_LaplaInv_wa, w_LaplaInv_w | スペクトルデータにラプラシアンの逆変換を作用させる(多層, 1 層用) |
wa_DLon_wa, w_DLon_w | スペクトルデータに経度微分 ∂/∂λ を作用させる(多層, 1 層用) |
xya_GradLon_wa, xy_GradLon_w | スペクトルデータに勾配型経度微分 1/cosφ・∂/∂λ を作用させる(多層, 1 層用) |
xya_GradLat_wa, xy_GradLat_w | スペクトルデータに勾配型緯度微分 ∂/∂φ を作用させる(多層, 1 層用) |
wa_DivLon_xya, w_DivLon_xy | 格子データに発散型経度微分 1/cosφ・∂/∂λ を作用させる(多層, 1 層用) |
wa_DivLat_xya, w_DivLat_xy | 格子データに発散型緯度微分 1/cosφ・∂(g cosφ)/∂φ を作用させる(多層, 1 層用) |
wa_Div_xya_xya, w_Div_xy_xy | ベクトル成分である 2 つの格子データに発散を作用させる(多層, 1 層用) |
wa_Jacobian_wa_wa, w_Jacobian_w_w | 2 つのスペクトルデータからヤコビアンを計算する(多層, 1 層用). |
xya_GradLambda_wa, xy_GradLambda_w | スペクトルデータに勾配型経度微分 ∂/∂λ を作用させる(多層, 1 層用) |
xya_GradMu_wa, xy_GradMu_w | スペクトルデータに勾配型緯度微分 (1-μ2)∂/∂μ を作用させる(μ=sinφ, 多層, 1 層用) |
wa_DivLambda_xya, w_DivLambda_xy | 格子データに発散型経度微分 1/(1-μ2)・∂/∂λ を作用させる(μ=sinφ, 多層, 1 層用) |
wa_DivMu_xya, w_DivMu_xy | 格子データに発散型緯度微分 ∂/∂μ を作用させる(μ=sinφ, 多層, 1 層用) |
積分・平均 | 機能 |
a_IntLonLat_xya, a_AvrLonLat_xya, IntLonLat_xy, AvrLonLat_xy | 2 次元格子点データの球面全積分および平均(多層, 1 層用). |
ya_IntLon_xya, ya_AvrLon_xya, y_IntLon_xy, y_AvrLon_xy | 2 次元格子点データの経度方向積分および平均(多層, 1 層用). |
a_IntLon_xa, a_AvrLon_xa, IntLon_x, AvrLon_x | 1 次元(X)格子点データの経度方向積分および平均(多層, 1 層用). |
xa_IntLat_xya, xa_AvrLat_xya, x_IntLat_xy, x_AvrLat_xy | 2 次元格子点データの緯度方向積分および平均(多層, 1 層用). |
a_IntLat_ya, a_AvrLat_ya, IntLat_y, AvrLat_y | 1 次元(Y)格子点データの緯度方向積分および平均(多層, 1 層用). |
スペクトル解析 | 機能 |
nma_EnergyFromStreamfunc_wa, nm_EnergyFromStreamfunc_w | 流線関数のスペクトルデータからエネルギーの球面調和函数成分(スペクトル)を計算する(多層, 1 層用). |
na_EnergyFromStreamfunc_wa, n_EnergyFromStreamfunc_w | 流線関数のスペクトルデータから各全波数のエネルギー成分(スペクトル)を計算する(多層, 1 層用). |
nma_EnstrophyFromStreamfunc_wa, nm_EnstrophyFromStreamfunc_w | 流線関数のスペクトルデータからエンストロフィーの球面調和函数成分(スペクトル)を計算する(多層, 1 層用). |
na_EnstrophyFromStreamfunc_wa, n_EnstrophyFromStreamfunc_w | 流線関数のスペクトルデータから各全波数のエンストロフィー成分(スペクトル)を計算する(多層, 1 層用). |
integer,intent(in) :: nm ! 切断全波数 integer,intent(in) :: im, jm ! 格子点数(経度λ, 緯度φ) integer,intent(in) :: km ! 最大データ数(層数)
real(8), intent(in) :: wa_data(im,jm) ! スペクトル real(8) :: xya_wa(im,jm,size(wa_data,2)) ! 格子点 integer, intent(in), optional :: ipow ! 作用させる 1/cosφ の次数 integer, intent(in), optional :: iflag ! 変換の種類
real(8), intent(in) :: xya_data(im,jm,:) ! 格子点(im,jm,*) real(8) :: wa_xya((nm+1)*(nm+1),size(xya_data,3)) ! スペクトル integer, intent(in), optional :: ipow ! 作用させる 1/cosφ の次数 integer, intent(in), optional :: iflag ! 変換の種類
real(8) :: wa_Lapla_wa((nm+1)*(nm+1),size(wa_data,2)) real(8), intent(in) :: wa_data((nm+1)*(nm+1),:)
real(8) :: wa_LaplaInv_wa((nm+1)*(nm+1),size(wa_data,2)) real(8), intent(in) :: wa_data((nm+1)*(nm+1),:)
real(8) :: wa_DLon_wa((nm+1)*(nm+1),size(wa_data,2)) real(8), intent(in) :: wa_data((nm+1)*(nm+1),:)
real(8) :: xya_GradLat_wa(im,jm,size(wa_data,2)) real(8), intent(in) :: wa_data((nm+1)*(nm+1),:)
real(8) :: xya_GradLat_wa(im,jm,size(wa_data,2)) real(8), intent(in) :: wa_data((nm+1)*(nm+1),:)
real(8) :: wa_DivLon_xya((nm+1)*(nm+1),,size(xya_data,3)) real(8), intent(in) :: xya_data(im,jm,:)
real(8) :: wa_DivLat_xya((nm+1)*(nm+1),size(xya_data,3)) real(8), intent(in) :: xya_data(im,jm,:)
real(8) :: wa_Div_xya_xya((nm+1)*(nm+1),size(xya_u,3)) real(8), intent(in) :: xya_u(im,jm,:) ! ベクトル経度成分 real(8), intent(in) :: xya_v(im,jm,:) ! ベクトル緯度成分
real(8) :: wa_Jacobian_wa_wa((nm+1)*(nm+1),size(wa_a,2)) real(8), intent(in) :: wa_a((nm+1)*(nm+1),:) real(8), intent(in) :: wa_b((nm+1)*(nm+1),:)
real(8) :: xya_GradLambda_wa(im,jm,size(wa_data,2)) real(8), intent(in) :: wa_data((nm+1)*(nm+1),:)
real(8) :: xya_GradMu_wa(im,jm,size(wa_data,2)) real(8), intent(in) :: wa_data((nm+1)*(nm+1),:)
real(8) :: wa_DivLambda_xya((nm+1)*(nm+1),,size(xya_data,3)) real(8), intent(in) :: xya_data(im,jm,:)
real(8) :: wa_DivMu_xya((nm+1)*(nm+1),size(xya_data,3)) real(8), intent(in) :: xya_data(im,jm,:)
real(8), dimension(im,jm,:) :: xya_data ! 2 次元格子点 real(8), dimension(size(xya_data,3)) :: IntLonLat_xya ! 積分値 real(8), dimension(im,jm,:) :: xya_data ! 2 次元格子点 real(8), dimension(size(xya_data,3)) :: AvrLonLat_xya ! 平均値
real(8), dimension(im,jm,:) :: xya_data ! 2 次元格子点 real(8), dimension(jm,size(xya_data,3)) :: ya_IntLon_xya ! 1 次元(緯度)格子点 real(8), dimension(im,jm,:) :: xya_data ! 2 次元格子点 real(8), dimension(jm,size(xya_data,3)) :: ya_AvrLon_xya ! 1 次元(緯度)格子点
real(8), dimension(im,:) :: xa_data ! 1 次元格子点 real(8), dimension(size(xa,2) :: a_IntLon_xa ! 積分値 real(8), dimension(im,:) :: xa_data ! 1 次元格子点 real(8), dimension(size(xa,2) :: a_AvrLon_xa ! 平均値
real(8), dimension(im,jm,:) :: xya_data ! 2 次元格子点 real(8), dimension(im,size(xya,3)) :: xa_IntLat_xya ! 1 次元(経度)格子点 real(8), dimension(im,jm,:) :: xya_data ! 2 次元格子点 real(8), dimension(im,size(xya(3)) :: xa_AvrLat_xya ! 1 次元(経度)格子点
real(8), dimension(jm,:) :: ya_data ! 1 次元格子点 real(8), dimension(ya,2) :: a_IntLat_ya ! 積分値 real(8), dimension(jm,:) :: ya_data ! 1 次元格子点 real(8), dimension(ya,2) :: a_AvrLat_ya ! 平均値
real(8), intent(in) :: wa_Strfunc(:,:) ! 流線関数(スペクトルデータ) real(8), dimension(0:nm,-nm:nm,size(wa_Strfunc,2)) & :: nma_EnergyFromStreamfunc_wa ! エネルギースペクトル
real(8), intent(in) :: wa_Strfunc(:,:) ! 流線関数(スペクトルデータ) real(8), dimension(0:nm,size(wa_Strfunc,2)) & :: na_EnergyFromStreamfunc_wa ! エネルギースペクトル
real(8), intent(in) :: wa_Strfunc(:,:) ! 流線関数(スペクトルデータ) real(8), dimension(0:nm,-nm:nm,size(wa_Strfunc,2)) & :: nma_EnstrophyFromStreamfunc_wa ! エンストロフィースペクトル
real(8), intent(in) :: wa_Strfunc(:,:) ! 流線関数(スペクトルデータ) real(8), dimension(0:nm,size(wa_Strfunc,2)) & :: na_EnstrophyFromStreamfunc_wa ! エンストロフィースペクトル