| Class | wt_module |
| In: |
src/wt_module.f90
|
spml/wt_module モジュールは球面上および球殻内での流体運動を スペクトル法によって数値計算するための Fortran90 関数を提供する ものである. 水平方向に球面調和函数変換および上下の境界壁を扱うための チェビシェフ変換を用いる場合のスペクトル計算のためのさまざまな 関数を提供する. 内部で wa_module, at_module を用いている. 最下部では球面調和変換 およびチェビシェフ変換のエンジンとして ISPACK の Fortran77 サブルーチンを用いている.
* 関数名の先頭 (wt_, nmz_, nz_, xyz_, wz_, w_, xy_, x_, y_, z_, a_) は,
返す値の形を示している.
wt_ : スペクトルデータ(球面調和函数・チェビシェフ変換)
nmz_: 水平スペクトルデータ(全波数 n, 帯状波数各成分, 動径)
nz_ : 水平スペクトルデータ(全波数 n, 動径)
xyz_ : 3 次元格子点データ(経度・緯度・動径)
wz_ : 水平スペクトル, 動径格子点データ
* 関数名の間の文字列(DLon, GradLat, GradLat, DivLon, DivLat, Lapla,..)
は, その関数の作用を表している.
* 関数名の最後 (wt_, xyz_, wz_, w_, xy_, x_, y_, z_, a_) は, 入力変数の
形がスペクトルデータおよび格子点データであることを示している.
_wt : スペクトルデータ
_xyz : 3 次元格子点データ
_xyz_xyz : 2 つの3 次元格子点データ, ...
* xyz : 3 次元格子点データ(経度・緯度・動径)
変数の種類と次元は real(8), dimension(im,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).
* wt_ で始まる関数が返す値はスペクトルデータに同じ.
* xyz_ で始まる関数が返す値は 3 次元格子点データに同じ.
* wz_ で始まる関数が返す値は水平スペクトル, 動径格子点データに同じ.
* スペクトルデータに対する微分等の作用とは, 対応する格子点データに
微分などを作用させたデータをスペクトル変換したものことである.
| wt_Initial : | スペクトル変換の格子点数, 波数, 領域の大きさの設定 |
| x_Lon, y_Lat, z_Rad : | 格子点座標(緯度, 経度, 動径座標)を格納した1 次元配列 |
| x_Lon_Weight, y_Lat_Weight, z_Rad_Weight : | 重み座標を格納した 1 次元配列 |
| xyz_Lon, xyz_Lat, xyz_Rad : | 格子点データの経度・緯度・動径座標(X,Y,Z) (格子点データ型 3 次元配列) |
| xyz_wt, wt_xyz : | スペクトルデータと 3 次元格子データの間の変換 (球面調和函数, チェビシェフ変換) |
| xyz_wz, wz_xyz : | 3 次元格子データと水平スペクトル・動径格子データとの間の変換 (球面調和函数) |
| wz_wt, wt_wz : | スペクトルデータと水平スペクトル・動径格子データとの間の変換 (チェビシェフ変換) |
| w_xy, xy_w : | スペクトルデータと 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 ∂/∂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 : | ベクトル場の回転の動径成分を計算する |
| 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 : | トロイダルポロイダルポテンシャルで表される非発散ベクトル場の回転の各成分を計算する |
| wt_VGradV : | ベクトル v から v・▽v を計算する |
| nmz_ToroidalEnergySpectrum_wt, : | トロイダルポテンシャルからエネルギーの |
| nz_ToroidalEnergySpectrum_wt : | 球面調和函数各成分を計算する |
| nmz_PoloidalEnergySpectrum_wt, : | ポロイダルポテンシャルからエネルギーの |
| nz_PoloidalEnergySpectrum_wt : | 球面調和函数各成分を計算する |
| wt_BoundariesTau, : | ディリクレ, ノイマン境界条件を適用する |
wt_BoundariesGrid, ::(タウ法, 選点法) wt_Boundaries ::
| wt_TorBoundariesTau, : | 速度トロイダルポテンシャルの境界条件を |
| wt_TorBoundariesGrid, : | 適用する(タウ法,選点法) │ |
| wz_LaplaPol2Pol_wz, : | 速度ポロイダルポテンシャルΦを▽^2Φから |
| wt_LaplaPol2Pol_wt : | 求める (入出力がそれぞれチェビシェフ格子点, |
:: チェビシェフ係数)
| wt_TorMagBoundariesTau, : | 磁場トロイダルポテンシャルの境界条件を |
| wt_TorMagBoundariesGrid, : | 適用する(タウ法, 選点法) |
| wt_PolMagBoundariesTau, : | 磁場トロイダルポテンシャル境界の境界条件を |
| wt_PolMagBoundariesGrid, : | 適用する(タウ法, 選点法) |
| 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 次元格子点データの動径方向積分および平均 |
| 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)格子点データの動径方向積分および |
:: 平均
| IntLon_x, AvrLon_x : | 1 次元(X)格子点データの経度方向積分および平均 |
| IntLat_y, AvrLat_y : | 1 次元(Y)格子点データの緯度方向積分および平均 |
| IntRad_z, AvrRad_z : | 1 次元(Z)格子点データの動径方向積分および平均 |
| Interpolate_wt : | スペクトルデータから任意の点の値を補間する. |
| Function : | |||
| AvrLatRad_yz : | real(8)
| ||
| yz : | real(8), dimension(jm,0:km), intent(in)
|
緯度動径(子午面)積分
2 次元(YZ)格子点データの緯度動径(子午面)平均
2 次元データ f(φ,r) に対して
∫f(φ,r) r^2cosφ dφdr /(2(r[o]^3-r[i]^3)/3)
を計算する.
function AvrLatRad_yz(yz) ! 緯度動径(子午面)積分
!
! 2 次元(YZ)格子点データの緯度動径(子午面)平均
!
! 2 次元データ f(φ,r) に対して
!
! ∫f(φ,r) r^2cosφ dφdr /(2(r[o]^3-r[i]^3)/3)
!
! を計算する.
!
real(8), dimension(jm,0:km), intent(in) :: yz
!(in) 2 次元緯度動径(子午面)格子点データ
real(8) :: AvrLatRad_yz
!(out) 平均値
AvrLatRad_yz = IntLatRad_yz(yz)/(sum(y_Lat_Weight)*sum(z_Rad_Weight))
end function AvrLatRad_yz
| Function : | |||
| AvrLat_y : | real(8)
| ||
| y_data(jm) : | real(8), intent(in)
|
1 次元(Y)格子点データの緯度(Y)方向平均(1 層用).
実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算し, y_Y_Weight の総和で割ることで平均している.
Original external subprogram is wa_module#AvrLat_y
| Function : | |||
| AvrLonLatRad_xyz : | real(8)
| ||
| xyz : | real(8), dimension(im,jm,0:km), intent(in)
|
緯度経度動径(全球)積分
3 次元格子点データの緯度経度動径(全球)積分
3 次元データ f(λ,φ,r) に対して
∫f(λ,φ,r) r^2cosφ dλdφdr /(4π(r[o]^3-r[i]^3)/3)
を計算する.
function AvrLonLatRad_xyz(xyz) ! 緯度経度動径(全球)積分
!
! 3 次元格子点データの緯度経度動径(全球)積分
!
! 3 次元データ f(λ,φ,r) に対して
!
! ∫f(λ,φ,r) r^2cosφ dλdφdr /(4π(r[o]^3-r[i]^3)/3)
!
! を計算する.
!
real(8), dimension(im,jm,0:km), intent(in) :: xyz
!(in) 3 次元経度緯度動径格子点データ
real(8) :: AvrLonLatRad_xyz
!(out) 全球平均値
AvrLonLatRad_xyz = IntLonLatRad_xyz(xyz) /(sum(x_Lon_Weight)*sum(y_Lat_Weight) * sum(z_Rad_Weight))
end function AvrLonLatRad_xyz
| Function : | |||
| AvrLonLat_xy : | real(8)
| ||
| xy_data(im,jm) : | real(8), intent(in)
|
2 次元緯度経度格子点データの全領域平均(1 層用).
実際には格子点データ各点毎に x_X_Weight, y_Y_Weight をかけた 総和を計算し, x_X_Weight*y_Y_Weight の総和で割ることで平均している.
Original external subprogram is wa_module#AvrLonLat_xy
| Function : | |||
| AvrLonRad_xz : | real(8)
| ||
| xz : | real(8), dimension(im,0:km), intent(in)
|
経度動径(緯度円)積分
2 次元(XZ)格子点データの経度動径平均
2 次元データ f(λ,r) に対して
∫f(λ,r) r^2dλdr /(2π(r[o]^3-r[i]^3)/3)
を計算する.
function AvrLonRad_xz(xz) ! 経度動径(緯度円)積分
!
! 2 次元(XZ)格子点データの経度動径平均
!
! 2 次元データ f(λ,r) に対して
!
! ∫f(λ,r) r^2dλdr /(2π(r[o]^3-r[i]^3)/3)
!
! を計算する.
!
real(8), dimension(im,0:km), intent(in) :: xz ! 2 次元格子点データ
real(8) :: AvrLonRad_xz ! 積分値
AvrLonRad_xz = IntLonRad_xz(xz)/(sum(x_Lon_Weight)*sum(z_Rad_Weight))
end function AvrLonRad_xz
| Function : | |||
| AvrLon_x : | real(8)
| ||
| x_data(jm) : | real(8), intent(in)
|
1 次元(X)格子点データの経度(X)方向平均(1 層用).
実際には格子点データ各点毎に x_X_Weight をかけた総和を計算し, x_X_Weight の総和で割ることで平均している.
Original external subprogram is wa_module#AvrLon_x
| Function : | |||
| AvrRad_z : | real(8)
| ||
| z : | real(8), dimension(im,0:km), intent(in)
|
1 次元(Z)格子点データの動径方向域平均.
1 次元データ f(r) に対して ∫f(r) r^2dr /((r[o]^3-r[i]^3)/3) を 計算する.
function AvrRad_z(z)
!
! 1 次元(Z)格子点データの動径方向域平均.
!
! 1 次元データ f(r) に対して ∫f(r) r^2dr /((r[o]^3-r[i]^3)/3) を
! 計算する.
!
real(8), dimension(im,0:km), intent(in) :: z
!(in) 1 次元動径格子点データ
real(8) :: AvrRad_z
!(out) 平均値
AvrRad_z = IntRad_z(z)/sum(z_Rad_Weight)
end function AvrRad_z
| Function : | |||
| IntLatRad_yz : | real(8)
| ||
| yz : | real(8), dimension(jm,0:km), intent(in)
|
2 次元(YZ)格子点データの緯度動径積分(子午面)および平均
2 次元データ f(φ,r) に対して ∫f(φ,r) r^2cosφ dφdr を計算する.
function IntLatRad_yz(yz)
!
! 2 次元(YZ)格子点データの緯度動径積分(子午面)および平均
!
! 2 次元データ f(φ,r) に対して ∫f(φ,r) r^2cosφ dφdr を計算する.
!
real(8), dimension(jm,0:km), intent(in) :: yz
!(in) 2 次元緯度動径(子午面)格子点データ
real(8) :: IntLatRad_yz
!(out) 積分値
integer :: j, k
IntLatRad_yz = 0
do k=0,km
do j=1,jm
IntLatRad_yz = IntLatRad_yz + yz(j,k) * y_Lat_Weight(j) * z_Rad_Weight(k)
enddo
enddo
end function IntLatRad_yz
| Function : | |||
| IntLat_y : | real(8)
| ||
| y_data(jm) : | real(8), intent(in)
|
1 次元緯度(Y)格子点データの Y 方向積分(1 層用).
実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算している.
Original external subprogram is wa_module#IntLat_y
| Function : | |||
| IntLonLatRad_xyz : | real(8)
| ||
| xyz : | real(8), dimension(im,jm,0:km), intent(in)
|
緯度経度動径(全球)積分
3 次元格子点データの緯度経度動径(全球)積分
3 次元データ f(λ,φ,r) に対して
∫f(λ,φ,r) r^2cosφ dλdφdr
を計算する.
function IntLonLatRad_xyz(xyz) ! 緯度経度動径(全球)積分
!
! 3 次元格子点データの緯度経度動径(全球)積分
!
! 3 次元データ f(λ,φ,r) に対して
!
! ∫f(λ,φ,r) r^2cosφ dλdφdr
!
! を計算する.
!
real(8), dimension(im,jm,0:km), intent(in) :: xyz
!(in) 3 次元経度緯度動径格子点データ
real(8) :: IntLonLatRad_xyz
!(out) 全球積分値
integer :: i, j, k
IntLonLatRad_xyz = 0
do k=0,km
do j=1,jm
do i=1,im
IntLonLatRad_xyz = IntLonLatRad_xyz + xyz(i,j,k) * x_Lon_Weight(i) * y_Lat_Weight(j) * z_Rad_Weight(k)
enddo
enddo
enddo
end function IntLonLatRad_xyz
| Function : | |||
| IntLonLat_xy : | real(8)
| ||
| xy_data(im,jm) : | real(8), intent(in)
|
2 次元緯度経度格子点データの全領域積分(1 層用).
実際には格子点データ各点毎に x_X_Weight, y_Y_Weight をかけた 総和を計算している.
Original external subprogram is wa_module#IntLonLat_xy
| Function : | |||
| IntLonRad_xz : | real(8)
| ||
| xz : | real(8), dimension(im,0:km), intent(in)
|
経度動径(緯度円)積分
2 次元(XZ)格子点データの経度動径積分
2 次元データ f(λ,r) に対して∫f(λ,r) r^2dλdr を計算する.
function IntLonRad_xz(xz) ! 経度動径(緯度円)積分
!
! 2 次元(XZ)格子点データの経度動径積分
!
! 2 次元データ f(λ,r) に対して∫f(λ,r) r^2dλdr を計算する.
!
real(8), dimension(im,0:km), intent(in) :: xz
!(in) 2 次元緯度動径格子点データ
real(8) :: IntLonRad_xz
!(out) 積分値
integer :: i, k
IntLonRad_xz = 0
do k=0,km
do i=1,im
IntLonRad_xz = IntLonRad_xz + xz(i,k) * x_Lon_Weight(i) * z_Rad_Weight(k)
enddo
enddo
end function IntLonRad_xz
| Function : | |||
| IntLon_x : | real(8)
| ||
| x_data(im) : | real(8), intent(in)
|
1 次元経度(X)格子点データの X 方向積分(1 層用).
実際には格子点データ各点毎に x_X_Weight をかけた総和を計算している.
Original external subprogram is wa_module#IntLon_x
| Function : | |||
| IntRad_z : | real(8)
| ||
| z : | real(8), dimension(0:km), intent(in)
|
動径積分
1 次元(Z)格子点データの動径方向域積分.
1 次元データ f(r) に対して ∫f(r) r^2dr を計算する.
function IntRad_z(z) ! 動径積分
!
! 1 次元(Z)格子点データの動径方向域積分.
!
! 1 次元データ f(r) に対して ∫f(r) r^2dr を計算する.
!
real(8), dimension(0:km), intent(in) :: z
!(in) 1 次元動径格子点データ
real(8) :: IntRad_z
!(out) 積分値
integer :: k
IntRad_z = 0.0d0
do k=0,km
IntRad_z = IntRad_z + z(k) * z_Rad_Weight(k)
enddo
end function IntRad_z
| Function : | |||
| Interpolate_array000_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 から補間計算する
function Interpolate_array000_wt(wt_data,alon,alat,arad)
!
! 緯度 alon, 経度 alat 動径 arad における関数値を
! その球面調和変換係数 wa_data から補間計算する
!
real(8), intent(IN) :: wt_data((nm+1)**2,0:km) ! スペクトルデータ
real(8), intent(IN) :: alon ! 補間する位置(経度)
real(8), intent(IN) :: alat ! 補間する位置(緯度)
real(8), intent(IN) :: arad ! 補間する位置(動径)
real(8) :: Interpolate_array000_wt ! 補間した値
Interpolate_array000_wt = Interpolate_w(a_Interpolate_at(wt_data,arad),alon,alat)
end function Interpolate_array000_wt
| Function : | |||
| Interpolate_array111_wt(size(alon)) : | 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 から補間計算する. alon, alat, arad は同じ大きさでなければならない. かえす値の形状は dimension(size(alon))
function Interpolate_array111_wt(wt_data,alon,alat,arad)
!
! 緯度 alon(:), 経度 alat(:) 動径 arad(:) における関数値を
! その球面調和変換係数 wa_data から補間計算する.
! alon, alat, arad は同じ大きさでなければならない.
! かえす値の形状は dimension(size(alon))
!
real(8), intent(IN) :: wt_data((nm+1)**2,0:km) ! スペクトルデータ
real(8), intent(IN) :: alon(:) ! 補間する位置(経度)
real(8), intent(IN) :: alat(:) ! 補間する位置(緯度)
real(8), intent(IN) :: arad(:) ! 補間する位置(動径)
real(8) :: Interpolate_array111_wt(size(alon)) ! 補間した値
integer :: i
if ( size(alon) == size(alat) .AND. size(alon) == size(arad))then
do i=1,size(alon)
Interpolate_array111_wt(i) = Interpolate_array000_wt(wt_data,alon(i),alat(i),arad(i))
enddo
else
call MessageNotify('E','Interpolate_array111_wt', 'Dimensions of lon,lat,rad miss match.')
endif
end function Interpolate_array111_wt
| Function : | |||
| at_Dx_at : | real(8), dimension(size(at_data,1),0:size(at_data,2)-1)
| ||
| at_data : | real(8), dimension(:,0:), intent(in)
|
入力チェビシェフデータに X 微分を作用する(2 次元配列用).
チェビシェフデータの X 微分とは, 対応する格子点データに X 微分を 作用させたデータのチェビシェフ変換のことである.
Original external subprogram is at_module#at_Dx_at
| Function : | |||
| at_ag : | double precision, dimension(size(ag_data,1),0:km)
| ||
| ag_data : | double precision, dimension(:,:), intent(in)
|
格子データからチェビシェフデータへ変換する(2 次元配列用).
Original external subprogram is at_module#at_ag
| Function : | |||
| ag_at : | double precision, dimension(size(at_data,1),0:im)
| ||
| at_data : | double precision, dimension(:,:), intent(in)
|
チェビシェフデータから格子データへ変換する(2 次元配列用).
Original external subprogram is at_module#ag_at
| Function : | |||
| l_nm_array00 : | integer
| ||
| n : | integer, intent(in)
| ||
| m : | integer, intent(in)
|
全波数(n)と東西波数(m)からそのスペクトルデータの格納位置を返す.
引数 n,m がともに整数値の場合, 整数値を返す.
Original external subprogram is wa_module#l_nm
| Function : | |||
| l_nm_array01(size(marray)) : | integer
| ||
| n : | integer, intent(in)
| ||
| marray(:) : | integer, intent(in)
|
スペクトルデータの格納位置
全波数(n)と東西波数(m)からそのスペクトルデータの格納位置を返す.
第 1 引数 n が整数, 第 2 引数 marray が整数 1 次元配列の場合, marray と同じ大きさの 1 次元整数配列を返す.
Original external subprogram is wa_module#l_nm
| Function : | |||
| l_nm_array10(size(narray)) : | integer
| ||
| narray(:) : | integer, intent(in)
| ||
| m : | integer, intent(in)
|
全波数(n)と東西波数(m)からそのスペクトルデータの格納位置を返す.
第 1 引数 narray が整数 1 次元配列, 第 2 引数 m が整数の場合, narray と同じ大きさの 1 次元整数配列を返す.
Original external subprogram is wa_module#l_nm
| Function : | |||
| l_nm_array11(size(narray)) : | integer
| ||
| narray(:) : | integer, intent(in)
| ||
| marray(:) : | integer, intent(in)
|
全波数(n)と東西波数(m)からそのスペクトルデータの格納位置を返す.
第 1,2 引数 narray, marray がともに整数 1 次元配列の場合, narray, marray と同じ大きさの 1 次元整数配列を返す. narray, marray は同じ大きさでなければならない.
Original external subprogram is wa_module#l_nm
| Function : | |||
| nm_l_int(2) : | integer
| ||
| l : | integer, intent(in)
|
スペクトルデータの格納位置(l)から全波数(n)と東西波数(m)を返す.
引数 l が整数値の場合, 対応する全波数と帯状波数を 長さ 2 の 1 次元整数値を返す. nm_l(1) が全波数, nm_l(2) が帯状波数である.
Original external subprogram is wa_module#nm_l
| Function : | |||
| nm_l_array(size(larray),2) : | integer
| ||
| larray(:) : | integer, intent(in)
|
スペクトルデータの格納位置(l)から全波数(n)と東西波数(m)を返す.
引数 larray が整数 1 次元配列の場合, larray に対応する n, m を格納した 2 次元整数配列を返す. nm_l_array(:,1) が全波数, nm_l_array(:,2) が帯状波数である.
Original external subprogram is wa_module#nm_l
| Function : | |||
| nmz_PoloidalEnergySpectrum_wt : | real(8), dimension(0:nm,-nm:nm,0:km)
| ||
| wt_POLPOT : | real(8), dimension((nm+1)*(nm+1),0:lm), intent(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)
function nmz_PoloidalEnergySpectrum_wt(wt_POLPOT)
!
! ポロイダルポテンシャルから, ポロイダルエネルギーの
! 球面調和函数全波数 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)
!
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_POLPOT
!(in) ポロイダルポテンシャル
real(8), dimension(0:nm,-nm:nm,0:km) :: nmz_PoloidalEnergySpectrum_wt
!(out) エネルギースペクトルポロイダル成分
real(8), dimension((nm+1)*(nm+1),0:km) ::wz_DATA1 ! 作業領域
real(8), dimension((nm+1)*(nm+1),0:km) ::wz_DATA2 ! 作業領域
integer :: n, m
nmz_PoloidalEnergySpectrum_wt = wt_VMiss
wz_Data1 = wz_wt(wt_POLPOT)
wz_Data2 = wz_Rad*wz_wt(wt_DRad_wt(wt_POLPOT)) ! d(rφ)/dr + wz_wt(wt_POLPOT) ! = rdφ/dr+φ
do n=0,nm
do m=-n,n
nmz_PoloidalEnergySpectrum_wt(n,m,:) = + 0.5* n*(n+1)* (4*pi) *( wz_Data2(l_nm(n,m),:)**2 + n*(n+1)*wz_Data1(l_nm(n,m),:)**2 )
enddo
enddo
end function nmz_PoloidalEnergySpectrum_wt
| Function : | |||
| nmz_ToroidalEnergySpectrum_wt : | real(8), dimension(0:nm,-nm:nm,0:km)
| ||
| wt_TORPOT : | real(8), dimension((nm+1)*(nm+1),0:lm), intent(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)
function nmz_ToroidalEnergySpectrum_wt(wt_TORPOT)
!
! トロイダルポテンシャルから, トロイダルエネルギーの
! 球面調和函数全波数 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)
!
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_TORPOT
!(in) トロイダルポテンシャル
real(8), dimension(0:nm,-nm:nm,0:km) :: nmz_ToroidalEnergySpectrum_wt
!(out) エネルギースペクトルトロイダル成分
real(8), dimension((nm+1)*(nm+1),0:km) ::wz_DATA ! 作業領域
integer :: n, m
nmz_ToroidalEnergySpectrum_wt = wt_VMiss
wz_DATA = wz_wt(wt_TORPOT)
do n=0,nm
do m=-n,n
nmz_ToroidalEnergySpectrum_wt(n,m,:) = 0.5 * n*(n+1)* (4*pi) * z_Rad**2 * wz_DATA(l_nm(n,m),:)**2
enddo
enddo
end function nmz_ToroidalEnergySpectrum_wt
| Function : | |||
| nz_PoloidalEnergySpectrum_wt : | real(8), dimension(0:nm,0:km)
| ||
| wt_POLPOT : | real(8), dimension((nm+1)*(nm+1),0:lm), intent(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の重み無し)が球殻内での全エネルギーに等しい.
function nz_PoloidalEnergySpectrum_wt(wt_POLPOT)
!
! ポロイダルポテンシャルから, ポロイダルエネルギーの
! 球面調和函数全波数の各成分を計算する
!
! * 全波数 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の重み無し)が球殻内での全エネルギーに等しい.
!
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_POLPOT
!(in) ポロイダルポテンシャル
real(8), dimension(0:nm,0:km) :: nz_PoloidalEnergySpectrum_wt
!(out) エネルギースペクトルポロイダル成分
real(8), dimension((nm+1)*(nm+1),0:km) ::wz_DATA1 ! 作業領域
real(8), dimension((nm+1)*(nm+1),0:km) ::wz_DATA2 ! 作業領域
integer :: n, m
wz_Data1 = wz_wt(wt_POLPOT)
wz_Data2 = wz_Rad*wz_wt(wt_DRad_wt(wt_POLPOT)) ! d(rφ)/dr + wz_wt(wt_POLPOT) ! = rdφ/dr+φ
do n=0,nm
nz_PoloidalEnergySpectrum_wt(n,:) = + 0.5* n*(n+1)* (4*pi) *( sum(wz_Data2(l_nm(n,(/(m,m=-n,n)/)),:)**2,1) + n*(n+1)*sum(wz_Data1(l_nm(n,(/(m,m=-n,n)/)),:)**2,1) )
enddo
end function nz_PoloidalEnergySpectrum_wt
| Function : | |||
| nz_ToroidalEnergySpectrum_wt : | real(8), dimension(0:nm,0:km)
| ||
| wt_TORPOT : | real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
|
トロイダルポテンシャルから, トロイダルエネルギーの 球面調和函数全波数の各成分を計算する.
* 全波数 n, 帯状波数 m のトロイダルポテンシャルのスペクトル成分 ψ(n,m,r)から全波数 n 成分のトロイダルエネルギースペクトルは Σ[m=-n]^n(1/2)n(n+1)4πr^2ψ(n,m,r)^2 と計算される.
が球殻内での全エネルギーに等しい.
function nz_ToroidalEnergySpectrum_wt(wt_TORPOT)
!
! トロイダルポテンシャルから, トロイダルエネルギーの
! 球面調和函数全波数の各成分を計算する.
!
! * 全波数 n, 帯状波数 m のトロイダルポテンシャルのスペクトル成分
! ψ(n,m,r)から全波数 n 成分のトロイダルエネルギースペクトルは
! Σ[m=-n]^n(1/2)n(n+1)4πr^2ψ(n,m,r)^2 と計算される.
!
! * 全てのエネルギースペクトル成分の和を動径積分したもの(r^2の重み無し)
! が球殻内での全エネルギーに等しい.
!
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_TORPOT
!(in) トロイダルポテンシャル
real(8), dimension(0:nm,0:km) :: nz_ToroidalEnergySpectrum_wt
!(out) エネルギースペクトルトロイダル成分
real(8), dimension((nm+1)*(nm+1),0:km) ::wz_DATA ! 作業領域
integer :: n, m
wz_DATA = wz_wt(wt_TORPOT)
do n=0,nm
nz_ToroidalEnergySpectrum_wt(n,:) = 0.5 * n*(n+1)* (4*pi) * z_Rad**2 * sum(wz_Data(l_nm(n,(/(m,m=-n,n)/)),:)**2,1)
enddo
end function nz_ToroidalEnergySpectrum_wt
| Function : | |||
| t_Dx_t : | real(8), dimension(size(t_data))
| ||
| t_data : | real(8), dimension(:), intent(in)
|
入力チェビシェフデータに X 微分を作用する(1 次元配列用).
チェビシェフデータの X 微分とは, 対応する格子点データに X 微分を 作用させたデータのチェビシェフ変換のことである.
Original external subprogram is at_module#t_Dx_t
| Function : | |||
| w_xy((nm+1)*(nm+1)) : | real(8)
| ||
| xy_data(im,jm) : | real(8), intent(in)
| ||
| ipow : | integer, intent(in), optional
| ||
| iflag : | integer, intent(in), optional
|
格子データからスペクトルデータへ(正)変換する(1 層用).
Original external subprogram is wa_module#w_xy
| Subroutine : | |||
| wt : | real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
| ||
| values : | real(8), dimension((nm+1)*(nm+1),2), intent(in), optional
| ||
| cond : | character(len=2), intent(in), optional
|
スペクトルデータにディリクレ・ノイマン境界条件を適用する Chebyshev 空間での境界条件適用(タウ法)
チェビシェフ空間において境界条件を満たすべく高次の係数を 定める方法をとっている(タウ法).
Alias for wt_BoundariesTau
| Subroutine : | |||
| wt : | real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
| ||
| values : | real(8), dimension((nm+1)*(nm+1),2), intent(in), optional
| ||
| cond : | character(len=2), intent(in), optional
|
スペクトルデータにディリクレ・ノイマン境界条件を適用する 実空間での境界条件適用
鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法). このルーチンを用いるためには wt_Initial にて設定するチェビシェフ切断波数(lm)と鉛直格子点数(km)を 等しくしておく必要がある.
subroutine wt_BoundariesGrid(wt,values,cond)
!
! スペクトルデータにディリクレ・ノイマン境界条件を適用する
! 実空間での境界条件適用
!
! 鉛直実格子点空間において内部領域の値と境界条件を満たすように
! 条件を課している(選点法). このルーチンを用いるためには
! wt_Initial にて設定するチェビシェフ切断波数(lm)と鉛直格子点数(km)を
! 等しくしておく必要がある.
!
real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout) :: wt
!(inout) 境界条件を適用するデータ. 修正された値を返す.
real(8), dimension((nm+1)*(nm+1),2), intent(in), optional :: values
!(in) 境界での 値/勾配 分布を水平スペクトル変換したものを与える.
! 省略時は値/勾配 0 となる.
character(len=2), intent(in), optional :: cond
!(in) 境界条件. 省略時は 'DD'
! DD : 両端ディリクレ条件
! DN : 上端ディリクレ, 下端ノイマン条件
! ND : 上端ノイマン, 下端ディリクレ条件
! NN : 両端ノイマン条件
if (.not. present(cond)) then
if (present(values)) then
call at_boundariesGrid_DD(wt,values)
else
call at_boundariesGrid_DD(wt)
endif
return
endif
select case(cond)
case ('NN')
if (present(values)) then
call at_BoundariesGrid_NN(wt,values)
else
call at_BoundariesGrid_NN(wt)
endif
case ('DN')
if (present(values)) then
call at_BoundariesGrid_DN(wt,values)
else
call at_BoundariesGrid_DN(wt)
endif
case ('ND')
if (present(values)) then
call at_BoundariesGrid_ND(wt,values)
else
call at_BoundariesGrid_ND(wt)
endif
case ('DD')
if (present(values)) then
call at_BoundariesGrid_DD(wt,values)
else
call at_BoundariesGrid_DD(wt)
endif
case default
call MessageNotify('E','wt_BoundariesGrid','B.C. not supported')
end select
end subroutine wt_BoundariesGrid
| Subroutine : | |||
| wt : | real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
| ||
| values : | real(8), dimension((nm+1)*(nm+1),2), intent(in), optional
| ||
| cond : | character(len=2), intent(in), optional
|
スペクトルデータにディリクレ・ノイマン境界条件を適用する Chebyshev 空間での境界条件適用(タウ法)
チェビシェフ空間において境界条件を満たすべく高次の係数を 定める方法をとっている(タウ法).
subroutine wt_BoundariesTau(wt,values,cond)
!
! スペクトルデータにディリクレ・ノイマン境界条件を適用する
! Chebyshev 空間での境界条件適用(タウ法)
!
! チェビシェフ空間において境界条件を満たすべく高次の係数を
! 定める方法をとっている(タウ法).
!
real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout) :: wt
!(inout) 境界条件を適用するデータ. 修正された値を返す.
real(8), dimension((nm+1)*(nm+1),2), intent(in), optional :: values
!(in) 境界での 値/勾配 分布を水平スペクトル変換したものを与える.
! 省略時は値/勾配 0 となる.
character(len=2), intent(in), optional :: cond
!(in) 境界条件. 省略時は 'DD'
! DD : 両端ディリクレ条件
! DN : 上端ディリクレ, 下端ノイマン条件
! ND : 上端ノイマン, 下端ディリクレ条件
! NN : 両端ノイマン条件
if (.not. present(cond)) then
if (present(values)) then
call at_BoundariesTau_DD(wt,values)
else
call at_BoundariesTau_DD(wt)
endif
return
endif
select case(cond)
case ('NN')
if (present(values)) then
call at_BoundariesTau_NN(wt,values)
else
call at_BoundariesTau_NN(wt)
endif
case ('DN')
if (present(values)) then
call at_BoundariesTau_DN(wt,values)
else
call at_BoundariesTau_DN(wt)
endif
case ('ND')
if (present(values)) then
call at_BoundariesTau_ND(wt,values)
else
call at_BoundariesTau_ND(wt)
endif
case ('DD')
if (present(values)) then
call at_BoundariesTau_DD(wt,values)
else
call at_BoundariesTau_DD(wt)
endif
case default
call MessageNotify('E','wt_BoundariesTau','B.C. not supported')
end select
end subroutine wt_BoundariesTau
| Function : | |||
| wt_DRad_wt : | real(8), dimension((nm+1)*(nm+1),0:lm)
| ||
| wt : | real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
|
入力スペクトルデータに動径微分 ∂/∂r を作用する.
スペクトルデータの動径微分とは, 対応する格子点データに動径微分を 作用させたデータのスペクトル変換のことである.
function wt_DRad_wt(wt)
!
! 入力スペクトルデータに動径微分 ∂/∂r を作用する.
!
! スペクトルデータの動径微分とは, 対応する格子点データに動径微分を
! 作用させたデータのスペクトル変換のことである.
!
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt
!(in) 2 次元球面調和函数チェビシェフスペクトルデータ
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_DRad_wt
!(in) 動径微分された2 次元球面調和函数チェビシェフスペクトルデータ
wt_DRad_wt = at_Dr_at(wt)
end function wt_DRad_wt
| Function : | |||
| wt_DivLat_xyz : | real(8), dimension((nm+1)*(nm+1),0:lm)
| ||
| xyz : | real(8), dimension(im,jm,0:km), intent(in)
|
格子データに発散型緯度微分 1/rcosφ・∂(f cosφ)/∂φ を 作用させたスペクトルデータを返す.
function wt_DivLat_xyz(xyz)
!
! 格子データに発散型緯度微分 1/rcosφ・∂(f cosφ)/∂φ を
! 作用させたスペクトルデータを返す.
!
real(8), dimension(im,jm,0:km), intent(in) :: xyz
!(in) 3 次元経度緯度動径格子点データ
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_DivLat_xyz
!(out) 発散型緯度微分を作用された 2 次元スペクトルデータ
wt_DivLat_xyz = wt_wz(wa_divlat_xya(xyz/xyz_Rad))
end function wt_DivLat_xyz
| Function : | |||
| wt_DivLon_xyz : | real(8), dimension((nm+1)*(nm+1),0:lm)
| ||
| xyz : | real(8), dimension(im,jm,0:km), intent(in)
|
格子点データに発散型経度微分 1/rcosφ・∂/∂λ を作用させた スペクトルデータを返す.
function wt_DivLon_xyz(xyz)
!
! 格子点データに発散型経度微分 1/rcosφ・∂/∂λ を作用させた
! スペクトルデータを返す.
!
real(8), dimension(im,jm,0:km), intent(in) :: xyz
!(in) 3 次元経度緯度動径格子点データ
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_DivLon_xyz
!(out) 発散型経度微分を作用された 2 次元スペクトルデータ
wt_DivLon_xyz = wt_wz(wa_DivLon_xya(xyz/xyz_Rad))
end function wt_DivLon_xyz
| Function : | |||
| wt_DivRad_wt : | real(8), dimension((nm+1)*(nm+1),0:lm)
| ||
| wt : | real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
|
入力スペクトルデータに発散型動径微分
1/r^2 ∂/∂r (r^2 .)= ∂/∂r + 2/r
を作用する.
スペクトルデータの発散型動径微分とは, 対応する格子点データに 発散型動径微分を作用させたデータのスペクトル変換のことである.
function wt_DivRad_wt(wt)
!
! 入力スペクトルデータに発散型動径微分
!
! 1/r^2 ∂/∂r (r^2 .)= ∂/∂r + 2/r
!
! を作用する.
!
! スペクトルデータの発散型動径微分とは, 対応する格子点データに
! 発散型動径微分を作用させたデータのスペクトル変換のことである.
!
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt
!(in) 2 次元球面調和函数チェビシェフスペクトルデータ
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_DivRad_wt
!(out) 発散型動径微分を作用された 2 次元スペクトルデータ
wt_DivRad_wt = wt_Drad_wt(wt) + wt_wz(2/wz_rad*wz_wt(wt))
end function wt_DivRad_wt
| Function : | |||
| wt_Div_xyz_xyz_xyz : | real(8), dimension((nm+1)*(nm+1),0:lm)
| ||
| 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(im,jm,0:km), intent(in)
|
べクトル成分である 3 つの格子データに発散を作用させた スペクトルデータを返す.
第 1, 2 ,3 引数(u,v,w)がそれぞれベクトルの経度成分, 緯度成分, 動径成分を表し, 発散は
1/rcosφ・∂u/∂λ + 1/rcosφ・∂(v cosφ)/∂φ
+ 1/r^2 ∂/∂r (r^2 w)
と計算される.
function wt_Div_xyz_xyz_xyz(xyz_Vlon,xyz_Vlat,xyz_Vrad)
!
! べクトル成分である 3 つの格子データに発散を作用させた
! スペクトルデータを返す.
!
! 第 1, 2 ,3 引数(u,v,w)がそれぞれベクトルの経度成分, 緯度成分,
! 動径成分を表し, 発散は
!
! 1/rcosφ・∂u/∂λ + 1/rcosφ・∂(v cosφ)/∂φ
! + 1/r^2 ∂/∂r (r^2 w)
!
! と計算される.
!
real(8), dimension(im,jm,0:km), intent(in) :: xyz_Vlon
!(in) ベクトル場の経度成分
real(8), dimension(im,jm,0:km), intent(in) :: xyz_Vlat
!(in) ベクトル場の緯度成分
real(8), dimension(im,jm,0:km), intent(in) :: xyz_Vrad
!(in) ベクトル場の動径成分
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_Div_xyz_xyz_xyz
!(out) ベクトル場の発散
wt_Div_xyz_xyz_xyz = wt_DivLon_xyz(xyz_Vlon) + wt_DivLat_xyz(xyz_Vlat) + wt_DivRad_wt(wt_xyz(xyz_Vrad))
end function wt_Div_xyz_xyz_xyz
| Subroutine : | |||
| i : | integer,intent(in)
| ||
| j : | integer,intent(in)
| ||
| k : | integer,intent(in)
| ||
| n : | integer,intent(in)
| ||
| l : | integer,intent(in)
| ||
| r_in : | real(8),intent(in)
| ||
| r_out : | real(8),intent(in)
| ||
| np : | integer,intent(in), optional
|
スペクトル変換の格子点数, 波数, 動径座標の範囲を設定する.
他の関数を呼ぶ前に, 最初にこのサブルーチンを呼んで初期設定を しなければならない.
np に 1 より大きな値を指定すれば ISPACK の球面調和函数変換 OPENMP 並列計算ルーチンが用いられる. 並列計算を実行するには, 実行時に環境変数 OMP_NUM_THREADS を np 以下の数字に設定する等の システムに応じた準備が必要となる.
np に 1 より大きな値を指定しなければ並列計算ルーチンは呼ばれない.
subroutine wt_Initial(i,j,k,n,l,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) :: k ! 格子点数(動径 r)
integer,intent(in) :: n ! 切断波数(水平全波数)
integer,intent(in) :: l ! 切断波数(動径波数)
real(8),intent(in) :: r_in ! 球殻内半径
real(8),intent(in) :: r_out ! 球殻外半径
integer,intent(in), optional :: np ! OPENMP での最大スレッド数
im = i
jm = j
km = k
nm = n
lm = l
ri = r_in
ro = r_out
if ( present(np) ) then
call wa_Initial(nm,im,jm,km+1,np)
else
call wa_Initial(nm,im,jm,km+1)
endif
call at_Initial(km,lm,r_in,r_out)
allocate(xyz_Lon(im,jm,0:km))
allocate(xyz_Lat(im,jm,0:km))
allocate(xyz_Rad(im,jm,0:km))
allocate(wz_Rad((nm+1)*(nm+1),0:km))
xyz_Lon = spread(xy_Lon,3,km+1)
xyz_Lat = spread(xy_Lat,3,km+1)
xyz_Rad = spread(spread(z_Rad,1,jm),1,im)
wz_Rad = spread(z_Rad,1,(nm+1)*(nm+1))
z_Rad_Weight = z_Rad_Weight * z_Rad**2 ! r^2 dr の積分重み
end subroutine wt_initial
| Function : | |||
| wt_KxRGrad_wt : | real(8), dimension((nm+1)*(nm+1),0:lm)
| ||
| wt : | real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
|
入力スペクトルデータに経度微分 k×r・▽ = ∂/∂λを作用する.
function wt_KxRGrad_wt(wt)
!
! 入力スペクトルデータに経度微分 k×r・▽ = ∂/∂λを作用する.
!
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt
!(in) 2 次元球面調和函数チェビシェフスペクトルデータ
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_KxRGrad_wt
!(out) 経度微分を作用された 2 次元スペクトルデータ
wt_KxRGrad_wt = wa_Dlon_wa(wt)
end function wt_KxRGrad_wt
| Function : | |||
| wt_L2Inv_wt : | real(8), dimension((nm+1)*(nm+1),0:lm)
| ||
| wt : | real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
|
入力スペクトルデータに L^2 演算子の逆演算(-逆水平ラプラシアン)を 作用する.
スペクトルデータに L^2 演算子を作用させる関数 wt_L2_wt の逆計算を 行う関数である.
function wt_L2Inv_wt(wt)
!
! 入力スペクトルデータに L^2 演算子の逆演算(-逆水平ラプラシアン)を
! 作用する.
!
! スペクトルデータに L^2 演算子を作用させる関数 wt_L2_wt の逆計算を
! 行う関数である.
!
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt
!(in) 2 次元球面調和函数チェビシェフスペクトルデータ
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_L2Inv_wt
!(out) L^2 演算子の逆演算を作用された 2 次元スペクトルデータ
wt_L2Inv_wt = -wa_LaplaInv_wa(wt)
end function wt_L2Inv_wt
| Function : | |||
| wt_L2_wt : | real(8), dimension((nm+1)*(nm+1),0:lm)
| ||
| wt : | real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
|
入力スペクトルデータに L^2 演算子(=-水平ラプラシアン)を作用する.
L^2 演算子は単位球面上の水平ラプラシアンの逆符号にあたる.
入力スペクトルデ ータに対応する格子点データに演算子
L^2 = -1/cos^2φ・∂^2/∂λ^2 - 1/cosφ・∂/∂φ(cosφ∂/∂φ)
を作用させたデータのスペクトル変換が返される.
function wt_L2_wt(wt)
!
! 入力スペクトルデータに L^2 演算子(=-水平ラプラシアン)を作用する.
!
! L^2 演算子は単位球面上の水平ラプラシアンの逆符号にあたる.
! 入力スペクトルデ ータに対応する格子点データに演算子
!
! L^2 = -1/cos^2φ・∂^2/∂λ^2 - 1/cosφ・∂/∂φ(cosφ∂/∂φ)
!
! を作用させたデータのスペクトル変換が返される.
!
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt
!(in) 2 次元球面調和函数チェビシェフスペクトルデータ
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_L2_wt
!(out) L^2 演算子を作用された 2 次元スペクトルデータ
wt_L2_wt = -wa_Lapla_wa(wt)
end function wt_L2_wt
| Function : | |||
| wt_LaplaPol2PolGrid_wt : | real(8), dimension((nm+1)*(nm+1),0:lm)
| ||
| wt : | real(8), dimension((nm+1)*(nm+1),0:lm),intent(in)
| ||
| cond : | character(len=2), intent(in), optional
|
速度ポロイダルポテンシャルΦを▽^2Φから計算する. チェビシェフ格子点空間で境界条件を適用している.
この関数を用いるためには wt_Initial にて設定する チェビシェフ切断波数(lm)と鉛直格子点数(km)を等しく しておく必要がある.
速度ポロイダルポテンシャルΦを f = ▽^2Φから定める式は
▽^2Φ = f
Φ = const. at boundaries.
∂Φ/∂r = 0 at boundaries (粘着条件)
or ∂^2Φ/∂r^2 = 0 at boundaries (応力なし条件)
最初に呼ばれるときの境界条件で以後計算される(要仕様変更).
最終的にチェビシェフ係数の解が欲しい場合には, wz_LaplaPol2Pol_wz に 比べてチェビシェフ — 格子点変換が 1 回分少なくて済む.
function wt_LaplaPol2PolGrid_wt(wt,cond)
!
! 速度ポロイダルポテンシャルΦを▽^2Φから計算する.
! チェビシェフ格子点空間で境界条件を適用している.
!
! この関数を用いるためには wt_Initial にて設定する
! チェビシェフ切断波数(lm)と鉛直格子点数(km)を等しく
! しておく必要がある.
!
! 速度ポロイダルポテンシャルΦを f = ▽^2Φから定める式は
!
! ▽^2Φ = f
! Φ = const. at boundaries.
! ∂Φ/∂r = 0 at boundaries (粘着条件)
! or ∂^2Φ/∂r^2 = 0 at boundaries (応力なし条件)
!
! 最初に呼ばれるときの境界条件で以後計算される(要仕様変更).
!
! 最終的にチェビシェフ係数の解が欲しい場合には, wz_LaplaPol2Pol_wz に
! 比べてチェビシェフ -- 格子点変換が 1 回分少なくて済む.
!
real(8), dimension((nm+1)*(nm+1),0:lm),intent(in) :: wt
!(in) 入力▽^2φ分布
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_LaplaPol2PolGrid_wt
!(out) 出力ポロイダルポテンシャル分布
character(len=2), intent(in), optional :: cond
!(in) 境界条件スイッチ. 省略時は 'RR'
! RR : 両端粘着条件
! RF : 上端粘着, 下端応力なし条件
! FR : 上端応力なし, 下端粘着条件
! FF : 両端応力なし条件
real(8), dimension(:,:,:), allocatable :: alu
integer, dimension(:,:), allocatable :: kp
real(8), dimension((nm+1)*(nm+1),0:km) :: wz_work
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_work
real(8), dimension(0:lm,0:lm) :: tt_I
real(8), dimension(0:lm,0:km) :: tz_work
logical :: rigid1, rigid2 ! 境界条件
logical :: first = .true.
integer :: l,n
save :: alu, kp, first
if (.not. present(cond)) then
rigid1=.TRUE.
rigid2=.TRUE.
else
select case (cond)
case ('RR')
rigid1 = .TRUE.
rigid2 = .TRUE.
case ('RF')
rigid1 = .TRUE.
rigid2 = .FALSE.
case ('FR')
rigid1 = .FALSE.
rigid2 = .TRUE.
case ('FF')
rigid1 = .FALSE.
rigid2 = .FALSE.
case default
call MessageNotify('E','wt_LaplaPol2PolGrid_wt','B.C. not supported')
end select
endif
if ( first ) then
first = .false.
if ( lm /= km ) then
call MessageNotify('E','wt_LaplaPol2PolGrid_wt', 'Chebyshev truncation and number of grid points should be same.')
endif
allocate(alu((nm+1)*(nm+1),0:km,0:lm),kp((nm+1)*(nm+1),0:lm))
do l=0,lm
wt_work = 0
wt_work(:,l) = 1
! 各水平波数に関して独立の式
alu(:,:,l) = wz_wt(wt_Lapla_wt(wt_work))
enddo
! 運動学的条件. 流線は境界で一定
tt_I = 0.0
do l=0,lm
tt_I(l,l)=1
enddo
! 非電気伝導体
tz_work = az_at(tt_I)
do n=1,(nm+1)*(nm+1)
alu(n,0,:) = tz_work(:,0)
alu(n,km,:) = tz_work(:,km)
enddo
! 力学的条件粘着条件
if ( rigid1 ) then
tz_work=az_at(at_Dr_at(tt_I))
else
tz_work=az_at(at_Dr_at(at_Dr_at(tt_I)))
endif
do n=1,(nm+1)*(nm+1)
alu(n,1,:) = tz_work(:,0)
enddo
! 力学的条件粘着条件
if ( rigid2 ) then
tz_work=az_at(at_Dr_at(tt_I))
else
tz_work=az_at(at_Dr_at(at_Dr_at(tt_I)))
endif
do n=1,(nm+1)*(nm+1)
alu(n,km-1,:) = tz_work(:,km)
enddo
call ludecomp(alu,kp)
endif
wz_work = wz_wt(wt)
wz_work(:,1) = 0 ! 力学的条件
wz_work(:,km-1) = 0 ! 力学的条件
wz_work(:,0) = 0 ! 運動学的条件
wz_work(:,km) = 0 ! 運動学的条件
wt_LaplaPol2PolGrid_wt = lusolve(alu,kp,wz_work)
end function wt_LaplaPol2PolGrid_wt
| Function : | |||
| wt_Lapla_wt : | real(8), dimension((nm+1)*(nm+1),0:lm)
| ||
| wt : | real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
|
入力スペクトルデータにラプラシアン
▽^2 = 1/r^2 cos^2φ・∂^2/∂λ^2
+ 1/r^2 cosφ・∂/∂φ(cosφ∂/∂φ)
+ 1/r^2 ∂/∂r (r^2 ∂/∂r)
を作用する.
スペクトルデータのラプラシアンとは, 対応する格子点データに ラプラシアンを作用させたデータのスペクトル変換のことである.
function wt_Lapla_wt(wt)
! 入力スペクトルデータにラプラシアン
!
! ▽^2 = 1/r^2 cos^2φ・∂^2/∂λ^2
! + 1/r^2 cosφ・∂/∂φ(cosφ∂/∂φ)
! + 1/r^2 ∂/∂r (r^2 ∂/∂r)
!
! を作用する.
!
! スペクトルデータのラプラシアンとは, 対応する格子点データに
! ラプラシアンを作用させたデータのスペクトル変換のことである.
!
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt
!(in) 2 次元球面調和函数チェビシェフスペクトルデータ
real(8), dimension((nm+1)*(nm+1),0:lm) :: wt_Lapla_wt
!(out) ラプラシアンを作用された 2 次元スペクトルデータ
wt_Lapla_wt = wt_DivRad_wt(wt_Drad_wt(wt)) + wt_wz(wz_wt(wa_Lapla_wa(wt))/wz_Rad**2)
end function wt_Lapla_wt
| Subroutine : | |||
| wt_POL : | real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
|
磁場ポロイダルポテンシャルに対して境界条件を適用する. Chebyshev 空間での境界条件適用
チェビシェフ空間において境界条件を満たすべく高次の係数を定める方法を とっている(タウ法). 現在のところ境界物質が非電気伝導体の場合のみ 対応している. その場合, 磁場ポロイダルポテンシャルの各水平スペクトル 成分 h にたいして境界条件が与えられ,
* 外側境界 : dh/dr + (n+1)h/r = 0 * 内側境界 : dh/dr - nh/r = 0
である. ここで n は h の水平全波数である.
最初に呼ばれるときの境界条件で以後計算される(要仕様変更).
Alias for wt_PolMagBoundariesTau
| Subroutine : | |||
| wt_POL : | real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
|
磁場ポロイダルポテンシャルに対して境界条件を適用する. 鉛直実空間での境界条件適用.
鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法). このルーチンを用いるためには wt_Initial にて設定するチェビシェフ切断波数(lm)と鉛直格子点数(km)を 等しくしておく必要がある.
現在のところ境界物質が非電気伝導体の場合のみ対応している. その場合, 磁場ポロイダルポテンシャルの各水平スペクトル成分 h に たいして境界条件が与えられ,
* 外側境界 : dh/dr + (n+1)h/r = 0 * 内側境界 : dh/dr - nh/r = 0
である. ここで n は h の水平全波数である.
最初に呼ばれるときの境界条件で以後計算される(要仕様変更).
subroutine wt_PolmagBoundariesGrid(wt_POL)
!
! 磁場ポロイダルポテンシャルに対して境界条件を適用する.
! 鉛直実空間での境界条件適用.
!
! 鉛直実格子点空間において内部領域の値と境界条件を満たすように
! 条件を課している(選点法). このルーチンを用いるためには
! wt_Initial にて設定するチェビシェフ切断波数(lm)と鉛直格子点数(km)を
! 等しくしておく必要がある.
!
! 現在のところ境界物質が非電気伝導体の場合のみ対応している.
! その場合, 磁場ポロイダルポテンシャルの各水平スペクトル成分 h に
! たいして境界条件が与えられ,
!
! * 外側境界 : dh/dr + (n+1)h/r = 0
! * 内側境界 : dh/dr - nh/r = 0
!
! である. ここで n は h の水平全波数である.
!
! 最初に呼ばれるときの境界条件で以後計算される(要仕様変更).
!
!
real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout) :: wt_POL
!(inout) 境界条件を適用するデータ. 修正された値を返す.
real(8), dimension(:,:,:), allocatable :: alu
integer, dimension(:,:), allocatable :: kp
real(8), dimension(:,:), allocatable :: tt_I
real(8), dimension(:,:), allocatable :: tz_PSI
real(8), dimension(:,:), allocatable :: tz_DPSIDR
real(8), dimension((nm+1)*(nm+1),0:km) :: wz_POL
logical :: first = .true.
integer :: l, n, nn(2)
save :: alu, kp, first
if ( first ) then
first = .false.
if ( lm /= km ) then
call MessageNotify('E','PolMagBoundariesGrid', 'Chebyshev truncation and number of grid points should be same.')
endif
allocate(alu((nm+1)*(nm+1),0:lm,0:lm),kp((nm+1)*(nm+1),0:lm))
allocate(tt_I(0:lm,0:lm),tz_PSI(0:lm,0:km),tz_DPSIDR(0:lm,0:km))
tt_I = 0.0
do l=0,lm
tt_I(l,l)=1
enddo
do n=1,(nm+1)*(nm+1)
alu(n,:,:) = transpose(az_at(tt_I)) ! 内部領域は値を保存
enddo
! 非電気伝導体
tz_PSI = az_at(tt_I)
tz_DPSIDR = az_at(at_dr_at(tt_I))
do n=1,(nm+1)*(nm+1)
nn=nm_l(n)
alu(n,0,:) = tz_DPSIDR(:,0) + (nn(1)+1) * tz_PSI(:,0)/z_RAD(0)
alu(n,km,:) = tz_DPSIDR(:,km) - nn(1) * tz_PSI(:,km)/z_RAD(km)
enddo
call ludecomp(alu,kp)
deallocate(tt_I,tz_PSI,tz_DPSIDR)
endif
wz_POL = wz_wt(wt_POL)
wz_POL(:,0) = 0.0
wz_POL(:,km) = 0.0
wt_POL = lusolve(alu,kp,wz_POL)
end subroutine wt_PolmagBoundariesGrid
| Subroutine : | |||
| wt_POL : | real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
|
磁場ポロイダルポテンシャルに対して境界条件を適用する. Chebyshev 空間での境界条件適用
チェビシェフ空間において境界条件を満たすべく高次の係数を定める方法を とっている(タウ法). 現在のところ境界物質が非電気伝導体の場合のみ 対応している. その場合, 磁場ポロイダルポテンシャルの各水平スペクトル 成分 h にたいして境界条件が与えられ,
* 外側境界 : dh/dr + (n+1)h/r = 0 * 内側境界 : dh/dr - nh/r = 0
である. ここで n は h の水平全波数である.
最初に呼ばれるときの境界条件で以後計算される(要仕様変更).
subroutine wt_PolmagBoundariesTau(wt_POL)
!
! 磁場ポロイダルポテンシャルに対して境界条件を適用する.
! Chebyshev 空間での境界条件適用
!
! チェビシェフ空間において境界条件を満たすべく高次の係数を定める方法を
! とっている(タウ法). 現在のところ境界物質が非電気伝導体の場合のみ
! 対応している. その場合, 磁場ポロイダルポテンシャルの各水平スペクトル
! 成分 h にたいして境界条件が与えられ,
!
! * 外側境界 : dh/dr + (n+1)h/r = 0
! * 内側境界 : dh/dr - nh/r = 0
!
! である. ここで n は h の水平全波数である.
!
! 最初に呼ばれるときの境界条件で以後計算される(要仕様変更).
!
real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout) :: wt_POL
!(inout) 境界条件を適用するデータ. 修正された値を返す.
real(8), dimension(:,:,:), allocatable :: alu
integer, dimension(:,:), allocatable :: kp
real(8), dimension(:,:), allocatable :: tt_I
real(8), dimension(:,:), allocatable :: tz_PSI
real(8), dimension(:,:), allocatable :: tz_DPSIDR
logical :: first = .true.
integer :: l, n, nn(2)
save :: alu, kp, first
if ( first ) then
first = .false.
allocate(alu((nm+1)*(nm+1),0:lm,0:lm),kp((nm+1)*(nm+1),0:lm))
allocate(tt_I(0:lm,0:lm),tz_PSI(0:lm,0:km),tz_DPSIDR(0:lm,0:km))
tt_I = 0.0
do l=0,lm
tt_I(l,l)=1
enddo
do n=1,(nm+1)*(nm+1)
alu(n,:,:) = tt_I
enddo
! 非電気伝導体
tz_PSI = az_at(tt_I)
tz_DPSIDR = az_at(at_dr_at(tt_I))
do n=1,(nm+1)*(nm+1)
nn=nm_l(n)
alu(n,lm-1,:) = tz_DPSIDR(:,0) + (nn(1)+1) * tz_PSI(:,0)/z_RAD(0)
alu(n,lm,:) = tz_DPSIDR(:,km) - nn(1) * tz_PSI(:,km)/z_RAD(km)
enddo
call ludecomp(alu,kp)
deallocate(tt_I,tz_PSI,tz_DPSIDR)
endif
wt_POL(:,lm-1) = 0.0
wt_POL(:,lm) = 0.0
wt_POL = lusolve(alu,kp,wt_POL)
end subroutine wt_PolmagBoundariesTau
| Subroutine : | |||
| xyz_RotVLON : | real(8), dimension(im,jm,0:km), intent(OUT)
| ||
| xyz_RotVLAT : | real(8), dimension(im,jm,0:km), intent(OUT)
| ||
| xyz_RotVRAD : | real(8), dimension(im,jm,0:km), intent(OUT)
| ||
| wt_TORPOT : | real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
| ||
| wt_POLPOT : | real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
|
トロイダルポロイダルポテンシャルΨ,Φで表される非発散ベクトル場
v = ▽x(Ψr) + ▽x▽x(Φr)
に対して, その回転
▽xv = ▽x▽x(Ψr) + ▽x▽x▽x(Φr) = ▽x▽x(Ψr) - ▽x((▽^2Φ)r)
を計算する.
subroutine wt_Potential2Rotation( xyz_RotVLON,xyz_RotVLAT,xyz_RotVRAD,wt_TORPOT,wt_POLPOT)
!
! トロイダルポロイダルポテンシャルΨ,Φで表される非発散ベクトル場
!
! v = ▽x(Ψr) + ▽x▽x(Φr)
!
! に対して, その回転
!
! ▽xv = ▽x▽x(Ψr) + ▽x▽x▽x(Φr) = ▽x▽x(Ψr) - ▽x((▽^2Φ)r)
!
! を計算する.
! ベクトル場の回転
real(8), dimension(im,jm,0:km), intent(OUT) :: xyz_RotVLON
!(out) 回転の経度成分
real(8), dimension(im,jm,0:km), intent(OUT) :: xyz_RotVLAT
!(out) 回転の緯度成分
real(8), dimension(im,jm,0:km), intent(OUT) :: xyz_RotVRAD
!(out) 回転の動径成分
! 入力ベクトル場を表すポテンシャル
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_TORPOT
!(in) トロイダルポテンシャル
real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wt_POLPOT
!(in) ポロイダルポテンシャル
call wt_Potential2Vector( xyz_RotVLON,xyz_RotVLAT,xyz_RotVRAD, -wt_Lapla_wt(wt_POLPOT), wt_TORPOT)
end subroutine wt_Potential2Rotation