Class wq_mpi_module_sjpack
In: libsrc/wq_mpi_module_sjpack/wq_mpi_module_sjpack.f90

wq_mpi_module_sjpack

Authors:Shin-ichi Takehiro, Youhei SASAKI
Version:$Id: wq_mpi_module_sjpack.f90 598 2013-08-20 03:23:44Z takepiro $
Copyright&License:See COPYRIGHT

概要

spml/wq_mpi_module_sjpack モジュールは球内での流体運動をスペクトル法と MPI 並列化によって数値計算するための Fortran90 関数を提供する ものである.

水平方向に球面調和函数変換および動径方向に Matsushima and Marcus (1994) で提唱された多項式を用いた スペクトル計算のためのさまざまな関数を提供する.

内部で wa_mpi_module_sjpack, aq_module を用いている. 最下部では球面調和変換のエンジンとして ISPACK の Fortran77 サブルーチンを用いている.

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

命名法

  • 関数名の先頭 (wq_, nmr_, nr_, xyr_, wr_, w_, xy_, xv_, yr_, vr_, xr_, x_, y_, v_, r_, a_) は, 返す値の形を示している.
    wq_ :スペクトルデータ(球面調和函数・チェビシェフ変換)
    nmr_ :水平スペクトルデータ(全波数 n, 帯状波数各成分, 動径)
    nr_ :水平スペクトルデータ(全波数 n, 動径)
    xyr_ :3 次元格子点データ(経度・緯度・動径)
    xvr_ :3 次元分散格子点データ(経度・緯度・動径)
    wr_ :水平スペクトル, 動径格子点データ
    xy_ :2 次元格子点データ(経度・緯度)
    xv_ :2 次元分散格子点データ(経度・緯度)
    yr_ :2 次元格子点データ(緯度・動径)
    vr_ :2 次元分散格子点データ(緯度・動径)
    xr_ :2 次元格子点データ(経度・動径)
    x_ :1 次元格子点データ(経度)
    y_ :1 次元格子点データ(緯度)
    v_ :1 次元分散格子点データ(緯度)
    r_ :1 次元格子点データ(動径)
    a_ :任意の次元
  • 関数名の間の文字列(DLon, GradLat, GradLat, DivLon, DivLat, Lapla,..) は, その関数の作用を表している.
  • 関数名の最後 (_wq, _nmr, _nr, _xyr, _wr, _w, _xy, _xv, _yr, _vr, _xr, _x, _y, _v, _r, _a) は, 入力変数の形がスペクトルデータおよび 格子点データであることを示している.
    _wq :スペクトルデータ
    _xyr :3 次元格子点データ
    _xyr_xyr :2 つの3 次元格子点データ, …
    _xvr :3 次元分散格子点データ
    _xvr_xvr :2 つの3 次元分散格子点データ, …

各データの種類の説明

  • xyr : 3 次元格子点データ(経度・緯度・動径)
    • 変数の種類と次元は real(8), dimension(0:im-1,1:jm,km).
    • im, jm, km はそれぞれ経度, 緯度, 動径座標の格子点数であり, サブルーチン wq_mpi_Initial にてあらかじめ設定しておく.
  • xvr : 3 次元分散格子点データ(経度・緯度・動径)
    • 変数の種類と次元は real(8), dimension(0:im-1,jc,km).
    • im, km はそれぞれ経度, 動径座標の格子点数であり,
    • jc はこのプロセスで保有する緯度格子点数である. サブルーチン wq_mpi_Initial を呼ぶと jc が設定される.
  • wq : スペクトルデータ
    • 変数の種類と次元は real(8), dimension((nm+1)*(nm+1),0:lm).
    • nm は球面調和函数の最大全波数, lm はチェビシェフ多項式の最大次数 であり, サブルーチン wq_mpi_Initial にてあらかじめ設定しておく.
    • 水平スペクトルデータの格納のされ方は関数 l_nm, nm_l によって調べる ことができる.
    • 動径スペクトルデータの格納方法については aq_module.f90 を 参照のこと. km < 2*im でなければならない.
  • nmr : 水平スペクトルデータの並んだ 3 次元配列.
    • 変数の種類と次元は real(8), dimension(0:nm,-nm:nm,km).
    • 第 1 次元が水平全波数, 第 2 次元が帯状波数, 第 3 次元が動径座標を表す.
    • nm は球面調和函数の最大全波数であり, サブルーチン wq_Initial にて あらかじめ設定しておく.
  • nr : スペクトルデータの並んだ 2 次元配列.
    • 変数の種類と次元は real(8), dimension(0:nm,km).
    • 第 1 次元が水平全波数を表す. nm は球面調和函数の最大全波数であり, サブルーチン wq_Initial にてあらかじめ設定しておく.
  • wr : 水平スペクトル, 動径格子点データ.
    • 変数の種類と次元は real(8), dimension((nm+1)*(nm+1),km).
  • wq_ で始まる関数が返す値はスペクトルデータに同じ.
  • xyr_ で始まる関数が返す値は 3 次元格子点データに同じ.
  • xvr_ で始まる関数が返す値は 3 次元分散格子点データに同じ.
  • wr_ で始まる関数が返す値は水平スペクトル, 動径格子点データに同じ.
  • スペクトルデータに対する微分等の作用とは, 対応する格子点データに 微分などを作用させたデータをスペクトル変換したものことである.

変数・手続き群の要約

初期化

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

座標変数

x_Lon, x_Lon_Weight, :格子点座標(経度)と重みを格納した 1 次元配列
y_Lat, y_Lat_Weight :格子点座標(緯度)と重みを格納した 1 次元配列
v_Lat, v_Lat_Weight :分散格子点座標(緯度)と重みを格納した 1 次元配列
r_Rad, r_Rad_Weight :格子点座標(同形)と重みを格納した 1 次元配列
xyr_Lon, xyr_Lat, xyr_Rad :格子点データの経度・緯度・動径座標(X,Y,Z) (格子点データ型 3 次元配列)
xvr_Lon, xvr_Lat, xvr_Rad :格子点データの経度・緯度・動径座標(X,Y,Z) (分散格子点データ型 3 次元配列)

基本変換

xyr_wq, wq_xyr :スペクトルデータと 3 次元格子データの間の変換 (球面調和函数, チェビシェフ変換)
xvr_wq, wq_xvr :スペクトルデータと 3 次元分散格子データの間の変換 (球面調和函数, チェビシェフ変換)
xyr_wr, wr_xyr :3 次元格子データと水平スペクトル・動径格子データとの 間の変換 (球面調和函数)
xvr_wr, wr_xvr :3 次元分散格子データと水平スペクトル・動径格子データとの 間の変換 (球面調和函数)
wr_wq, wq_wr :スペクトルデータと水平スペクトル・動径格子データとの 間の変換 (チェビシェフ変換)
w_xy, xy_w :スペクトルデータと 2 次元水平格子データの 間の変換(球面調和函数変換)
w_xv, xv_w :スペクトルデータと 2 次元水平分散格子データの 間の変換(球面調和函数変換)
l_nm, nm_l :スペクトルデータの格納位置と全波数・帯状波数の変換

微分

wq_RadDRad_wq :スペクトルデータに動径微分 r∂/∂r を作用させる
wr_DivRad_wq :スペクトルデータに発散型動径微分 1/r^2 ∂/∂r r^2 = ∂/∂r + 2/r を作用させる
wr_DivRad_xyr :格子点データに発散型動径微分 1/r^2 ∂/∂r r^2 = ∂/∂r + 2/r を作用させる
wr_DivRad_xvr :格子点データに発散型動径微分 1/r^2 ∂/∂r r^2 = ∂/∂r + 2/r を作用させる
wr_RotDRad_wq :スペクトルデータに回転型動径微分 1/r ∂/∂rr = ∂/∂r + 1/r を作用させる
wr_RotDRad_wr :スペクトルデータに回転型動径微分 1/r ∂/∂rr = ∂/∂r + 1/r を作用させる
wq_RotDRad_wr :スペクトルデータに回転型動径微分 1/r ∂/∂rr = ∂/∂r + 1/r を作用させる
wq_Lapla_wq :スペクトルデータにラプラシアンを作用させる
xyr_GradLon_wq :スペクトルデータに勾配型経度微分 1/rcosφ・∂/∂λを作用させる
xvr_GradLon_wq :スペクトルデータに勾配型経度微分 1/rcosφ・∂/∂λを作用させる
xyr_GradLat_wq :スペクトルデータに勾配型緯度微分 1/r・∂/∂φを作用させる
xvr_GradLat_wq :スペクトルデータに勾配型緯度微分 1/r・∂/∂φを作用させる
wr_DivLon_xyr :格子データに発散型経度微分 1/rcosφ・∂/∂λを作用させる
wr_DivLon_xvr :格子データに発散型経度微分 1/rcosφ・∂/∂λを作用させる
wr_DivLat_xyr :格子データに発散型緯度微分 1/rcosφ・∂(g cosφ)/∂φを作用させる
wr_DivLat_xvr :格子データに発散型緯度微分 1/rcosφ・∂(g cosφ)/∂φを作用させる
wr_Div_xyr_xyr_xyr :ベクトル成分である 3 つの格子データに 発散を作用させる
xyr_Div_xyr_xyr_xyr :ベクトル成分である 3 つの格子データに 発散を作用させる
xyr_RotLon_wq_wq :ベクトル場の回転の経度成分を計算する
xvr_RotLon_wq_wq :ベクトル場の回転の経度成分を計算する
xyr_RotLat_wq_wq :ベクトル場の回転の緯度成分を計算する
xvr_RotLat_wq_wq :ベクトル場の回転の緯度成分を計算する
wr_RotRad_xyr_xyr :ベクトル場の回転の動径成分を計算する
wr_RotRad_xvr_xvr :ベクトル場の回転の動径成分を計算する

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

wq_KxRGrad_wq :スペクトルデータに経度微分 k×r・▽ = ∂/∂λを作用させる
xyr_KGrad_wq :スペクトルデータに軸方向微分 k・▽ = cosφ/r ∂/∂φ + sinφ∂/∂r を作用させる
xvr_KGrad_wq :スペクトルデータに軸方向微分 k・▽ = cosφ/r ∂/∂φ + sinφ∂/∂r を作用させる
wq_L2_wq :スペクトルデータに L2 演算子 = -水平ラプラシアンを 作用させる
wq_L2Inv_wq :スペクトルデータに L2 演算子の逆 = -逆水平ラプラシアン を作用させる
wq_QOperator_wq :スペクトルデータに演算子 Q=(k・▽-1/2(L2 k・▽+ k・▽L2)) を作用させる
wq_QOperatorMPI_wq:スペクトルデータに演算子 Q=(k・▽-1/2(L2 k・▽+ k・▽L2)) を作用させる
wr_RadRot_xyr_xyr :ベクトル v の渦度と動径ベクトル r の内積 r・(▽×v) を 計算する
wr_RadRot_xvr_xvr :ベクトル v の渦度と動径ベクトル r の内積 r・(▽×v) を 計算する
wr_RadRotRot_xyr_xyr_xyr :ベクトルの v の r・(▽×▽×v) を計算する
wr_RadRotRot_xvr_xvr_xvr :ベクトルの v の r・(▽×▽×v) を計算する
wq_RadRotRot_xyr_xyr_xyr :ベクトルの v の r・(▽×▽×v) を計算する
wq_RadRotRot_xvr_xvr_xvr :ベクトルの v の r・(▽×▽×v) を計算する
wq_Potential2Vector :トロイダルポロイダルポテンシャルから ベクトル場を計算する
wq_Potential2VectorMPI :トロイダルポロイダルポテンシャルから ベクトル場を計算する
wq_Potential2Rotation :トロイダルポロイダルポテンシャルで表される 非発散ベクトル場の回転の各成分を計算する
wq_Potential2RotationMPI :トロイダルポロイダルポテンシャルで表される 非発散ベクトル場の回転の各成分を計算する

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

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

境界値問題

wq_BoundaryTau, wr_BoundaryGrid, wq_Boundary :ディリクレ, ノイマン境界条件を適用する(タウ法, 選点法)
wq_TorBoundaryTau, wr_TorBoundaryGrid, wq_TorBoundary :速度トロイダルポテンシャルの境界条件を適用する(タウ法,選点法)
wq_LaplaPol2Pol_wq, wq_LaplaPol2PolTau_wq :速度ポロイダルポテンシャルΦを▽^2Φから求める (入出力がそれぞれ格子点およびスペクトル係数)
wq_TorMagBoundaryTau, wr_TorMagBoundaryGrid, wq_TorMagBoundary :磁場トロイダルポテンシャルの境界条件を適用する(タウ法, 選点法)
wq_PolMagBoundaryTau, wr_PolMagBoundaryGrid, wq_PolMagBoundary :磁場トロイダルポテンシャル境界の境界条件を適用する(タウ法, 選点法)

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

IntLonLatRad_xyr, AvrLonLatRad_xyr :3 次元格子点データの 全領域積分および平均
IntLonLatRad_xvr, AvrLonLatRad_xvr :3 次元格子点データの 全領域積分および平均
r_IntLonLat_xyr, r_AvrLonLat_xyr :3 次元格子点データの 緯度経度(水平・球面)積分および平均
r_IntLonLat_xvr, r_AvrLonLat_xvr :3 次元格子点データの 緯度経度(水平・球面)積分および平均
y_IntLonRad_xyr, y_AvrLonRad_xyr :3 次元格子点データの 緯度動径積分および平均
v_IntLonRad_xvr, v_AvrLonRad_xvr :3 次元格子点データの 緯度動径積分および平均
x_IntLatRad_xyr,xr_AvrLatRad_xyr :3 次元格子点データの 経度動径(子午面)積分および平均
x_IntLatRad_xvr,xr_AvrLatRad_xvr :3 次元格子点データの 経度動径(子午面)積分および平均
yr_IntLon_xyr, yr_AvrLon_xyr :3 次元格子点データの 経度方向積分および平均
vr_IntLon_xvr, vr_AvrLon_xvr :3 次元格子点データの 経度方向積分および平均
xr_IntLat_xyr, xr_AvrLat_xyr :3 次元格子点データの 緯度方向積分および平均
xr_IntLat_xvr, xr_AvrLat_xvr :3 次元格子点データの 緯度方向積分および平均
xr_IntRad_xyr, xr_AvrRad_xyr :3 次元格子点データの 動径方向積分および平均
xr_IntRad_xvr, xr_AvrRad_xvr :3 次元格子点データの 動径方向積分および平均

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

IntLonLat_xy, AvrLonLat_xy :2 次元格子点データの水平(球面)積分および平均
IntLonLat_xv, AvrLonLat_xv :2 次元格子点データの水平(球面)積分および平均
IntLonRad_xr, AvrLonRad_xr :2 次元(XZ)格子点データの経度動径積分 および平均
IntLatRad_yr, AvrLatRad_yr :2 次元(YZ)格子点データの緯度動径(子午面) 積分および平均
IntLatRad_vr, AvrLatRad_vr :2 次元(YZ)格子点データの緯度動径(子午面) 積分および平均
y_IntLon_xy, y_AvrLon_xy :水平 2 次元(球面)格子点データの経度方向 積分および平均
v_IntLon_xv, v_AvrLon_xv :水平 2 次元(球面)格子点データの経度方向 積分および平均
x_IntLat_xy, x_AvrLat_xy :水平2 次元(球面)格子点データの緯度方向積分 および平均
x_IntLat_xv, x_AvrLat_xv :水平2 次元(球面)格子点データの緯度方向積分 および平均
r_IntLon_xr, r_AvrLon_xr :2 次元(XZ)格子点データの経度方向積分および 平均
x_IntRad_xr, x_AvrRad_xr :2 次元(XZ)格子点データの動径方向積分および 平均
r_IntLat_yr, r_AvrLat_yr :2 次元(YZ)格子点データの緯度方向積分および 平均
r_IntLat_vr, r_AvrLat_vr :2 次元(YZ)格子点データの緯度方向積分および 平均
y_IntRad_yr, y_AvrRad_yr :2 次元(YZ)格子点データの動径方向積分および 平均
v_IntRad_vr, v_AvrRad_vr :2 次元(YZ)格子点データの動径方向積分および 平均

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

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

Methods

AvrLatRad_vr   AvrLatRad_yr   AvrLat_v   AvrLat_y   AvrLat_y   AvrLonLatRad_xvr   AvrLonLatRad_xyr   AvrLonLat_xv   AvrLonLat_xy   AvrLonLat_xy   AvrLonRad_xr   AvrLon_x   AvrLon_x   AvrRad_r   IntLatRad_vr   IntLatRad_yr   IntLat_v   IntLat_y   IntLat_y   IntLonLatRad_xvr   IntLonLatRad_xyr   IntLonLat_xv   IntLonLat_xy   IntLonLat_xy   IntLonRad_xr   IntLon_x   IntLon_x   IntRad_r   jc   l_nm   l_nm   l_nm   l_nm   l_nm   l_nm   l_nm   l_nm   nm_l   nm_l   nm_l   nm_l   nmr_PoloidalEnergySpectrum_wq   nmr_ToroidalEnergySpectrum_wq   nr_PoloidalEnergySpectrum_wq   nr_ToroidalEnergySpectrum_wq   q_Rad2Inv_q   q_Rad2_q   q_RadDRad_q   r_AvrLat_vr   r_AvrLat_yr   r_AvrLonLat_xvr   r_AvrLonLat_xyr   r_AvrLon_xr   r_IntLat_vr   r_IntLat_yr   r_IntLonLat_xvr   r_IntLonLat_xyr   r_IntLon_xr   r_RAD_WEIGHT   r_Rad   v_AvrLonRad_xvr   v_AvrLon_xv   v_AvrRad_vr   v_IntLonRad_xvr   v_IntLon_xv   v_IntRad_vr   v_Lat   v_Lat_Weight   vr_AvrLon_xvr   vr_IntLon_xvr   w_xv   w_xy   w_xy   wq_Boundary   wq_BoundaryTau   wq_KxRGrad_wq   wq_L2Inv_wq   wq_L2_wq   wq_LaplaPol2PolTau_wq   wq_LaplaPol2Pol_wq   wq_Lapla_wq   wq_PolMagBoundary   wq_PolmagBoundaryTau   wq_Potential2Rotation   wq_Potential2RotationMPI   wq_Potential2Vector   wq_Potential2VectorMPI   wq_QOperatorMPI_wq   wq_QOperator_wq   wq_Rad2Inv_wq   wq_Rad2_wq   wq_RadDRad_wq   wq_RadRotRot_xvr_xvr_xvr   wq_RadRotRot_xyr_xyr_xyr   wq_RotDRad_wr   wq_TorBoundary   wq_TorBoundaryTau   wq_TorMagBoundary   wq_TormagBoundaryTau   wq_VMiss   wq_mpi_Initial   wq_wr   wq_xvr   wq_xyr   wr_BoundaryGrid   wr_DivLat_xvr   wr_DivLat_xyr   wr_DivLon_xvr   wr_DivLon_xyr   wr_DivRad_wq   wr_DivRad_xvr   wr_DivRad_xyr   wr_Div_xvr_xvr_xvr   wr_Div_xyr_xyr_xyr   wr_PolmagBoundaryGrid   wr_RAD   wr_RadRotRot_xvr_xvr_xvr   wr_RadRotRot_xyr_xyr_xyr   wr_RadRot_xvr_xvr   wr_RadRot_xyr_xyr   wr_RotDRad_wq   wr_RotDRad_wr   wr_RotRad_xvr_xvr   wr_RotRad_xyr_xyr   wr_TorBoundaryGrid   wr_TormagBoundaryGrid   wr_wq   wr_xvr   wr_xyr   x_AvrLatRad_xvr   x_AvrLatRad_xyr   x_AvrLat_xv   x_AvrLat_xy   x_AvrLat_xy   x_AvrRad_xr   x_IntLatRad_xvr   x_IntLatRad_xyr   x_IntLat_xv   x_IntLat_xy   x_IntLat_xy   x_IntRad_xr   x_Lon   x_Lon   x_Lon_Weight   x_Lon_Weight   xr_AvrLat_xvr   xr_AvrLat_xyr   xr_IntLat_xvr   xr_IntLat_xyr   xv_AvrRad_xvr   xv_IntRad_xvr   xv_Lat   xv_Lon   xv_w   xvr_Div_xvr_xvr_xvr   xvr_GradLat_wq   xvr_GradLon_wq   xvr_KGrad_wq   xvr_LAT   xvr_LON   xvr_RAD   xvr_RotLat_wq_wq   xvr_RotLon_wq_wq   xvr_wq   xvr_wr   xy_AvrRad_xyr   xy_IntRad_xyr   xy_Lat   xy_Lat   xy_Lon   xy_Lon   xy_w   xy_w   xyr_Div_xyr_xyr_xyr   xyr_GradLat_wq   xyr_GradLon_wq   xyr_KGrad_wq   xyr_LAT   xyr_LON   xyr_RAD   xyr_RotLat_wq_wq   xyr_RotLon_wq_wq   xyr_wq   xyr_wr   y_AvrLonRad_xyr   y_AvrLon_xy   y_AvrLon_xy   y_AvrRad_yr   y_IntLonRad_xyr   y_IntLon_xy   y_IntLon_xy   y_IntRad_yr   y_Lat   y_Lat   y_Lat_Weight   y_Lat_Weight   yr_AvrLon_xyr   yr_IntLon_xyr  

Included Modules

dc_message lumatrix w_base_mpi_module_sjpack w_deriv_mpi_module_sjpack w_integral_mpi_module_sjpack wa_base_mpi_module_sjpack wa_deriv_mpi_module_sjpack wq_module_sjpack wa_module_sjpack mpi

Public Instance methods

Function :
AvrLatRad_vr :real(8)
: (out) 平均値
vr :real(8), dimension(1:jc,km), intent(in)
: (in) 2 次元緯度動径(子午面)格子点データ

緯度動径(子午面)積分

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

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

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

を計算する.

[Source]

    function AvrLatRad_vr(vr)  ! 緯度動径(子午面)積分
      !
      ! 2 次元(VR)格子点データの緯度動径(子午面)平均
      !
      ! 2 次元データ f(φ,r) に対して
      !
      !    ∫f(φ,r) r^2cosφ dφdr /(2(r[o]^3-r[i]^3)/3) 
      !
      ! を計算する.
      !
      real(8), dimension(1:jc,km), intent(in) :: vr
      !(in) 2 次元緯度動径(子午面)格子点データ

      real(8)                   :: AvrLatRad_vr
      !(out) 平均値

      AvrLatRad_vr = IntLatRad_vr(vr)/(sum(y_Lat_Weight)*sum(r_Rad_Weight))

    end function AvrLatRad_vr
AvrLatRad_yr( yr ) result(AvrLatRad_yr)
Function :
AvrLatRad_yr :real(8)
: (out) 平均値
yr :real(8), dimension(1:jm,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 wq_module_sjpack#AvrLatRad_yr

AvrLat_v( v_data ) result(AvrLat_v)
Function :
AvrLat_v :real(8)
: (out) 平均値
v_data(jc) :real(8), intent(in)
: (in) 1 次元緯度格子点データ

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

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

Original external subprogram is w_integral_mpi_module_sjpack#AvrLat_v

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 wq_module_sjpack#AvrLat_y

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 wa_module_sjpack#AvrLat_y

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

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

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

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

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

を計算する.

[Source]

    function AvrLonLatRad_xvr(xvr) ! 緯度経度動径(全球)積分
      !
      ! 3 次元格子点データの緯度経度動径(全球)積分
      !
      ! 3 次元データ f(λ,φ,r) に対して
      !
      !    ∫f(λ,φ,r) r^2cosφ dλdφdr /(4π(r[o]^3-r[i]^3)/3) 
      !
      ! を計算する.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr
      !(in) 3 次元経度緯度動径格子点データ

      real(8)                     :: AvrLonLatRad_xvr
      !(out) 全球平均値

      AvrLonLatRad_xvr = IntLonLatRad_xvr(xvr) /(sum(x_Lon_Weight)*sum(y_Lat_Weight) * sum(r_Rad_Weight))

    end function AvrLonLatRad_xvr
AvrLonLatRad_xyr( xyr ) result(AvrLonLatRad_xyr)
Function :
AvrLonLatRad_xyr :real(8)
: (out) 全球平均値
xyr :real(8), dimension(0:im-1,1:jm,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 wq_module_sjpack#AvrLonLatRad_xyr

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

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

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

Original external subprogram is w_integral_mpi_module_sjpack#AvrLonLat_xv

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 wq_module_sjpack#AvrLonLat_xy

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 wa_module_sjpack#AvrLonLat_xy

AvrLonRad_xr( xr ) result(AvrLonRad_xr)
Function :
AvrLonRad_xr :real(8)
: 積分値
xr :real(8), dimension(0:im-1,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 wq_module_sjpack#AvrLonRad_xr

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 wq_module_sjpack#AvrLon_x

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 wa_module_sjpack#AvrLon_x

AvrRad_r( z ) result(AvrRad_r)
Function :
AvrRad_r :real(8)
: (out) 平均値
z :real(8), dimension(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 wq_module_sjpack#AvrRad_r

Function :
IntLatRad_vr :real(8)
: (out) 積分値
vr :real(8), dimension(1:jc,km), intent(in)
: (in) 2 次元緯度動径(子午面)格子点データ

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

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

[Source]

    function IntLatRad_vr(vr)
      !
      ! 2 次元(VR)格子点データの緯度動径積分(子午面)および平均
      !
      ! 2 次元データ f(φ,r) に対して ∫f(φ,r) r^2cosφ dφdr を計算する.
      !
      real(8), dimension(1:jc,km), intent(in) :: vr
      !(in) 2 次元緯度動径(子午面)格子点データ

      real(8)                   :: IntLatRad_vr
      !(out) 積分値

      real(8)                   :: IntLatRadTMP
      integer :: j, k

      IntLatRad_vr = 0.0D0
      do k=1,km
         do j=1,jc
            IntLatRad_vr = IntLatRad_vr + vr(j,k) * v_Lat_Weight(j) * r_Rad_Weight(k)
         enddo
      enddo

      IntLatRadTmp=IntLatRad_vr
      CALL MPI_ALLREDUCE(IntLatRadTMP,IntLatRad_vr,1,MPI_REAL8, MPI_SUM,MPI_COMM_WORLD,IERR)

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

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

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

Original external subprogram is wq_module_sjpack#IntLatRad_yr

IntLat_v( v_data ) result(IntLat_v)
Function :
IntLat_v :real(8)
: (out) 積分値
v_data(jc) :real(8), intent(in)
: (in) 1 次元緯度(Y)格子点データ

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

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

Original external subprogram is w_integral_mpi_module_sjpack#IntLat_v

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 wq_module_sjpack#IntLat_y

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 wa_module_sjpack#IntLat_y

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

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

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

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

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

を計算する.

[Source]

    function IntLonLatRad_xvr(xvr) ! 緯度経度動径(全球)積分
      !
      ! 3 次元格子点データの緯度経度動径(全球)積分
      !
      ! 3 次元データ f(λ,φ,r) に対して
      !
      !     ∫f(λ,φ,r) r^2cosφ dλdφdr 
      !
      ! を計算する.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr 
      !(in) 3 次元経度緯度動径格子点データ

      real(8)                     :: IntLonLatRad_xvr 
      !(out) 全球積分値

      real(8)                     :: IntLonLatRadTMP
      integer :: i, j, k

      IntLonLatRad_xvr = 0.0D0
      do k=1,km
         do j=1,jc
            do i=0,im-1
               IntLonLatRad_xvr = IntLonLatRad_xvr + xvr(i,j,k) * x_Lon_Weight(i) * v_Lat_Weight(j) * r_Rad_Weight(k)
            enddo
         enddo
      enddo

      IntLonLatRadTmp=IntLonLatRad_xvr
      CALL MPI_ALLREDUCE(IntLonLatRadTMP,IntLonLatRad_xvr,1,MPI_REAL8, MPI_SUM,MPI_COMM_WORLD,IERR)

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

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

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

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

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

を計算する.

Original external subprogram is wq_module_sjpack#IntLonLatRad_xyr

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

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

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

Original external subprogram is w_integral_mpi_module_sjpack#IntLonLat_xv

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 wq_module_sjpack#IntLonLat_xy

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 wa_module_sjpack#IntLonLat_xy

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

経度動径(緯度円)積分

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

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

Original external subprogram is wq_module_sjpack#IntLonRad_xr

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 wq_module_sjpack#IntLon_x

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 wa_module_sjpack#IntLon_x

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

動径積分

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

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

Original external subprogram is wq_module_sjpack#IntRad_r

jc
Variable :
jc :integer
: 分散配置用変数

Original external subprogram is w_base_mpi_module_sjpack#jc

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 wq_module_sjpack#l_nm

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 wa_module_sjpack#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 wq_module_sjpack#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 wa_module_sjpack#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 wq_module_sjpack#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 wa_module_sjpack#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 wq_module_sjpack#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 wa_module_sjpack#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 wq_module_sjpack#nm_l

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 wa_module_sjpack#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 wq_module_sjpack#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 wa_module_sjpack#nm_l

nmr_PoloidalEnergySpectrum_wq( wq_POLPOT ) result(nmr_PoloidalEnergySpectrum_wq)
Function :
nmr_PoloidalEnergySpectrum_wq :real(8), dimension(0:nm,-nm:nm,km)
: (out) エネルギースペクトルポロイダル成分
wq_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π{|d(rφ(n,m,r))/dr|^2 + n(n+1)|φ(n,m,r)|^2}

   と計算される.

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

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

Original external subprogram is wq_module_sjpack#nmr_PoloidalEnergySpectrum_wq

nmr_ToroidalEnergySpectrum_wq( wq_TORPOT ) result(nmr_ToroidalEnergySpectrum_wq)
Function :
nmr_ToroidalEnergySpectrum_wq :real(8), dimension(0:nm,-nm:nm,km)
: (out) エネルギースペクトルトロイダル成分
wq_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 の配列には欠損値が格納される.
   wq_VMiss によって設定できる (初期値は -999.0)

Original external subprogram is wq_module_sjpack#nmr_ToroidalEnergySpectrum_wq

nr_PoloidalEnergySpectrum_wq( wq_POLPOT ) result(nr_PoloidalEnergySpectrum_wq)
Function :
nr_PoloidalEnergySpectrum_wq :real(8), dimension(0:nm,km)
: (out) エネルギースペクトルポロイダル成分
wq_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π{|d(rφ(n,m,r))/dr|^2
                + n(n+1)|φ(n,m,r)|^2}

   と計算される.

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

Original external subprogram is wq_module_sjpack#nr_PoloidalEnergySpectrum_wq

nr_ToroidalEnergySpectrum_wq( wq_TORPOT ) result(nr_ToroidalEnergySpectrum_wq)
Function :
nr_ToroidalEnergySpectrum_wq :real(8), dimension(0:nm,km)
: (out) エネルギースペクトルトロイダル成分
wq_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 wq_module_sjpack#nr_ToroidalEnergySpectrum_wq

q_Rad2Inv_q( q_data ) result(q_r2Inv_q)
Function :
q_r2Inv_q :real(8), dimension(0:km)
: (out) チェビシェフデータの R 微分
q_data :real(8), dimension(:), intent(in)
: (in) 入力チェビシェフデータ

入力スペクトルデータに対して積 r^2 のスペクトル係数 を計算する(1 次元配列用).

Original external subprogram is wq_module_sjpack#q_Rad2Inv_q

q_Rad2_q( q_data ) result(q_r2_q)
Function :
q_r2_q :real(8), dimension(0:km)
: (out) チェビシェフデータの R 微分
q_data :real(8), dimension(:), intent(in)
: (in) 入力チェビシェフデータ

入力スペクトルデータに対して積 r^2 のスペクトル係数 を計算する(1 次元配列用).

Original external subprogram is wq_module_sjpack#q_Rad2_q

q_RadDRad_q( q_data ) result(q_rDr_q)
Function :
q_rDr_q :real(8), dimension(0:km)
: (out) チェビシェフデータの R 微分
q_data :real(8), dimension(:), intent(in)
: (in) 入力チェビシェフデータ

入力スペクトルデータに r(d/dR) 微分を作用する(1 次元配列用).

スペクトルデータの r(d/dR) 微分とは, 対応する格子点データに R 微分を 作用させたデータのスペクトル変換のことである.

Original external subprogram is wq_module_sjpack#q_RadDRad_q

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

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

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

[Source]

    function r_AvrLat_vr(vr)
      !
      ! 2 次元(VR)格子点データの緯度方向域平均.
      !
      ! 2 次元データ f(φ,r) に対して ∫f(φ,r) cosφ dφ/2 を計算する.
      !
      real(8), dimension(1:jc,km), intent(in) :: vr
      !(in) 2 次元緯度動径(子午面)格子点データ

      real(8), dimension(km)  :: r_AvrLat_vr
      !(out) 緯度平均された 1 次元動径格子点データ

      r_AvrLat_vr = r_IntLat_vr(vr)/sum(y_Lat_Weight)

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

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

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

Original external subprogram is wq_module_sjpack#r_AvrLat_yr

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

緯度経度(水平)積分

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

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

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

を計算する.

[Source]

    function r_AvrLonLat_xvr(xvr)  ! 緯度経度(水平)積分
      !
      ! 3 次元格子点データの緯度経度(水平, 球面)積分
      ! 
      ! 3 次元データ f(λ,φ,r) に対して
      !
      !    ∫f(λ,φ,r) cosφ dλdφ /4π 
      !
      ! を計算する.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr
      !(in) 3 次元経度緯度動径格子点データ

      real(8), dimension(km)     :: r_AvrLonLat_xvr
      !(out) 緯度経度(水平, 球面)平均された 1 次元動径格子点データ

      r_AvrLonLat_xvr = r_IntLonLat_xvr(xvr) /(sum(x_Lon_Weight)*sum(y_Lat_Weight))

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

緯度経度(水平)積分

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

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

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

を計算する.

Original external subprogram is wq_module_sjpack#r_AvrLonLat_xyr

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

経度(帯状)積分

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

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

Original external subprogram is wq_module_sjpack#r_AvrLon_xr

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

緯度積分

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

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

[Source]

    function r_IntLat_vr(vr)  ! 緯度積分
      !
      ! 2 次元(VR)格子点データの緯度方向域積分.
      !
      ! 2 次元データ f(φ,r) に対して∫f(φ,r) cosφ dφ を計算する.
      !
      real(8), dimension(1:jc,km), intent(in) :: vr
      !(in) 2 次元緯度動径(子午面)格子点データ

      real(8), dimension(km)  :: r_IntLat_vr
      !(out) 緯度積分された 1 次元動径格子点データ

      real(8), dimension(km)  :: r_IntLatTMP
      integer :: j

      r_IntLat_vr = 0.0d0
      do j=1,jc
         r_IntLat_vr(:) = r_IntLat_vr(:) + vr(j,:) * v_Lat_Weight(j)
      enddo
      r_IntLatTmp=r_IntLat_vr
      CALL MPI_ALLREDUCE(r_IntLatTMP,r_IntLat_vr,km,MPI_REAL8, MPI_SUM,MPI_COMM_WORLD,IERR)

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

緯度積分

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

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

Original external subprogram is wq_module_sjpack#r_IntLat_yr

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

緯度経度(水平)積分

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

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

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

を計算する.

[Source]

    function r_IntLonLat_xvr(xvr)  ! 緯度経度(水平)積分
      !
      ! 3 次元格子点データの緯度経度(水平, 球面)積分
      ! 
      ! 3 次元データ f(λ,φ,r) に対して
      !
      !    ∫f(λ,φ,r) cosφ dλdφ 
      !
      ! を計算する.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr
      !(in) 3 次元経度緯度動径格子点データ

      real(8), dimension(km)     :: r_IntLonLat_xvr
      !(out) 緯度経度(水平, 球面)積分された 1 次元動径格子点データ

      real(8), dimension(km)     :: r_IntLonLatTMP
      integer :: i, j

      r_IntLonLat_xvr = 0.0D0
      do j=1,jc
         do i=0,im-1
            r_IntLonLat_xvr = r_IntLonLat_xvr + xvr(i,j,:) * x_Lon_Weight(i) * v_Lat_Weight(j)
         enddo
      enddo

      r_IntLonLatTmp=r_IntLonLat_xvr
      CALL MPI_ALLREDUCE(r_IntLonLatTMP,r_IntLonLat_xvr,km,MPI_REAL8, MPI_SUM,MPI_COMM_WORLD,IERR)

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

緯度経度(水平)積分

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

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

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

を計算する.

Original external subprogram is wq_module_sjpack#r_IntLonLat_xyr

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

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

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

Original external subprogram is wq_module_sjpack#r_IntLon_xr

r_RAD_WEIGHT
Variable :
g_R_Weight(:) :real(8), allocatable
: ガウス重み

Original external subprogram is wq_module_sjpack#r_RAD_WEIGHT

r_Rad
Variable :
g_R(:) :real(8), allocatable
: ガウス—ラダウ格子点

Original external subprogram is wq_module_sjpack#r_Rad

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

経度動径(緯度円)積分

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

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

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

を計算する.

[Source]

    function v_AvrLonRad_xvr(xvr)  ! 経度動径(緯度円)積分
      !
      ! 3 次元格子点データの経度動径(緯度円)平均.
      !
      ! 3 次元データ f(λ,φ,r) に対して
      !
      !     ∫f(λ,φ,r) r^2dλdr /(2π(r[o]^3-r[i]^3)/3) 
      !
      ! を計算する.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr
      !(in) 3 次元経度緯度動径格子点データ

      real(8), dimension(1:jc)       :: v_AvrLonRad_xvr
      !(out) 経度動径(緯度円)平均された 1 次元緯度格子点データ

      v_AvrLonRad_xvr = v_IntLonRad_xvr(xvr) /(sum(x_Lon_Weight)*sum(r_Rad_Weight))

    end function v_AvrLonRad_xvr
v_AvrLon_xv( xv_data ) result(v_AvrLon_xv)
Function :
v_AvrLon_xv(jc) :real(8)
: (out) 平均された 1 次元緯度(Y)格子点
xv_data(0:im-1,jc) :real(8), intent(in)
: (in) 2 次元経度緯度格子点データ(0:im-1,jc)

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

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

Original external subprogram is w_integral_mpi_module_sjpack#v_AvrLon_xv

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

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

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

[Source]

    function v_AvrRad_vr(vr)
      !
      ! 2 次元(VR)格子点データの動径方向域平均.
      !
      ! 2 次元データ f(φ,r) に対して ∫f(φ,r) r^2dr /((r[o]^3-r[i]^3)/3) 
      ! を計算する.
      !
      real(8), dimension(1:jc,km), intent(in) :: vr
      !(in) 2 次元緯度動径(子午面)格子点データ

      real(8), dimension(1:jc)  :: v_AvrRad_vr
      !(out) 動径平均された 1 次元緯度格子点データ

      v_AvrRad_vr = v_IntRad_vr(vr)/sum(r_Rad_Weight)

    end function v_AvrRad_vr
Function :
v_IntLonRad_xvr :real(8), dimension(1:jc)
: (out) 経度動径(緯度円)積分された 1 次元緯度格子点データ
xvr :real(8), dimension(0:im-1,1:jc,km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

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

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

[Source]

    function v_IntLonRad_xvr(xvr)
      !
      ! 3 次元格子点データの経度動径(緯度円)積分.
      !
      ! 3 次元データ f(λ,φ,r) に対して∫f(λ,φ,r) r^2dλdr を計算する.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr
      !(in) 3 次元経度緯度動径格子点データ

      real(8), dimension(1:jc)       :: v_IntLonRad_xvr
      !(out) 経度動径(緯度円)積分された 1 次元緯度格子点データ

      integer :: i, k

      v_IntLonRad_xvr = 0.0D0
      do k=1,km
         do i=0,im-1
            v_IntLonRad_xvr = v_IntLonRad_xvr + xvr(i,:,k) * x_Lon_Weight(i) * r_Rad_Weight(k)
         enddo
      enddo

    end function v_IntLonRad_xvr
v_IntLon_xv( xv_data ) result(v_IntLon_xv)
Function :
v_IntLon_xv(jc) :real(8)
: (out) 積分された 1 次元緯度(Y)格子点データ
xv_data(0:im-1,jc) :real(8), intent(in)
: (in) 2 次元経度緯度格子点データ(0:im-1,jc)

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

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

Original external subprogram is w_integral_mpi_module_sjpack#v_IntLon_xv

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

動径積分

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

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

[Source]

    function v_IntRad_vr(vr)  ! 動径積分
      !
      ! 2 次元(VR)格子点データの動径方向域積分.
      !
      ! 2 次元データ f(φ,r) に対して∫f(φ,r) r^2dr を計算する.
      !
      real(8), dimension(1:jc,km), intent(in) :: vr
      !(in) 2 次元緯度動径(子午面)格子点データ

      real(8), dimension(1:jc)  :: v_IntRad_vr
      !(out) 動径積分された 1 次元緯度格子点データ

      integer :: k

      v_IntRad_vr = 0.0d0
      do k=1,km
         v_IntRad_vr(:) = v_IntRad_vr(:) + vr(:,k) * r_Rad_Weight(k) 
      enddo

    end function v_IntRad_vr
v_Lat
Variable :
v_Lat(:) :real(8), allocatable
: 緯度経度

Original external subprogram is w_base_mpi_module_sjpack#v_Lat

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

Original external subprogram is w_base_mpi_module_sjpack#v_Lat_Weight

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

経度(帯状)積分

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

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

[Source]

    function vr_AvrLon_xvr(xvr)  ! 経度(帯状)積分
      !
      ! 3 次元格子点データの経度方向(帯状)平均.
      !
      ! 3 次元データ f(λ,φ,r) に対して ∫f(λ,φ,r)dλ/2π を計算する.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr
      !(in) 3 次元経度緯度動径格子点データ

      real(8), dimension(1:jc,km)  :: vr_AvrLon_xvr
      !(out) 経度方向(帯状)平均された 2 次元子午面格子点データ

      vr_AvrLon_xvr = vr_IntLon_xvr(xvr)/sum(x_Lon_Weight)

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

経度(帯状)積分

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

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

[Source]

    function vr_IntLon_xvr(xvr)  ! 経度(帯状)積分
      !
      ! 3 次元格子点データの経度方向(帯状)積分.
      !
      ! 3 次元データ f(λ,φ,r) に対して ∫f(λ,φ,r)dλ を計算する.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr
      !(in) 3 次元経度緯度動径格子点データ

      real(8), dimension(1:jc,km)  :: vr_IntLon_xvr
      !(out) 経度方向(帯状)積分された 2 次元子午面格子点データ

      integer :: i

      vr_IntLon_xvr = 0.0d0
      do i=0,im-1
         vr_IntLon_xvr(:,:) = vr_IntLon_xvr(:,:) + xvr(i,:,:) * x_Lon_Weight(i)
      enddo
    end function vr_IntLon_xvr
w_xv( xv_data, [ipow], [iflag] ) result(w_xv)
Function :
w_xv((mm+1)*(mm+1)) :real(8)
: (out) スペクトルデータ
xv_data(0:im-1,1:jc) :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 w_base_mpi_module_sjpack#w_xv

w_xy( xy_data, [ipow], [iflag] ) result(w_xy)
Function :
w_xy((mm+1)*(mm+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 wq_module_sjpack#w_xy

w_xy( xy_data, [ipow], [iflag] ) result(w_xy)
Function :
w_xy((mm+1)*(mm+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 wa_module_sjpack#w_xy

wq_Boundary( wq, [value], [cond] )
Subroutine :
wq :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 wq_module_sjpack#wq_Boundary

wq_BoundaryTau( wq, [value], [cond] )
Subroutine :
wq :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 wq_module_sjpack#wq_BoundaryTau

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

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

Original external subprogram is wq_module_sjpack#wq_KxRGrad_wq

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

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

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

Original external subprogram is wq_module_sjpack#wq_L2Inv_wq

wq_L2_wq( wq ) result(wq_L2_wq)
Function :
wq_L2_wq :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) L^2 演算子を作用された 2 次元スペクトルデータ
wq :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 wq_module_sjpack#wq_L2_wq

wq_LaplaPol2PolTau_wq( wq, [cond], [new] ) result(wq_LaplaPol2PolTau_wq)
Function :
wq_LaplaPol2PolTau_wq :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) 出力ポロイダルポテンシャル分布
wq :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Φから計算する.

スペクトル空間で境界条件を適用している(タウ法).

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

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

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

Original external subprogram is wq_module_sjpack#wq_LaplaPol2PolTau_wq

wq_LaplaPol2Pol_wq( wq, [cond], [new] ) result(wq_LaplaPol2PolTau_wq)
Function :
wq_LaplaPol2PolTau_wq :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) 出力ポロイダルポテンシャル分布
wq :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Φから計算する.

スペクトル空間で境界条件を適用している(タウ法).

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

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

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

Original external subprogram is wq_module_sjpack#wq_LaplaPol2Pol_wq

wq_Lapla_wq( wq ) result(wq_Lapla_wq)
Function :
wq_Lapla_wq :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) ラプラシアンを作用された水平スペクトルデータ
wq :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)
             [1/r^2 (r∂/∂r)(r∂/∂r) + 1/r^2(r∂/∂r)]

を作用する.

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

Original external subprogram is wq_module_sjpack#wq_Lapla_wq

wq_PolMagBoundary( wq_POL, [new] )
Subroutine :
wq_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 wq_module_sjpack#wq_PolMagBoundary

wq_PolmagBoundaryTau( wq_POL, [new] )
Subroutine :
wq_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 wq_module_sjpack#wq_PolmagBoundaryTau

wq_Potential2Rotation( xyr_RotVLON, xyr_RotVLAT, xyr_RotVRAD, wq_TORPOT, wq_POLPOT )
Subroutine :
xyr_RotVLON :real(8), dimension(0:im-1,1:jm,km), intent(OUT)
: (out) 回転の経度成分
xyr_RotVLAT :real(8), dimension(0:im-1,1:jm,km), intent(OUT)
: (out) 回転の緯度成分
xyr_RotVRAD :real(8), dimension(0:im-1,1:jm,km), intent(OUT)
: (out) 回転の動径成分
wq_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) トロイダルポテンシャル
wq_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 wq_module_sjpack#wq_Potential2Rotation

Subroutine :
xvr_RotVLON :real(8), dimension(0:im-1,1:jc,km), intent(OUT)
: (out) 回転の経度成分
xvr_RotVLAT :real(8), dimension(0:im-1,1:jc,km), intent(OUT)
: (out) 回転の緯度成分
xvr_RotVRAD :real(8), dimension(0:im-1,1:jc,km), intent(OUT)
: (out) 回転の動径成分
wq_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) トロイダルポテンシャル
wq_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)

を計算する.

[Source]

    subroutine wq_Potential2RotationMPI( xvr_RotVLON,xvr_RotVLAT,xvr_RotVRAD,wq_TORPOT,wq_POLPOT)
      !
      ! トロイダルポロイダルポテンシャルΨ,Φで表される非発散ベクトル場
      !
      !     v = ▽x(Ψr) + ▽x▽x(Φr) 
      !
      ! に対して, その回転
      !
      !     ▽xv = ▽x▽x(Ψr) + ▽x▽x▽x(Φr) = ▽x▽x(Ψr) - ▽x((▽^2Φ)r)
      !
      ! を計算する. 
      
      ! ベクトル場の回転
      real(8), dimension(0:im-1,1:jc,km), intent(OUT) :: xvr_RotVLON
      !(out) 回転の経度成分

      real(8), dimension(0:im-1,1:jc,km), intent(OUT) :: xvr_RotVLAT
      !(out) 回転の緯度成分

      real(8), dimension(0:im-1,1:jc,km), intent(OUT) :: xvr_RotVRAD
      !(out) 回転の動径成分

      ! 入力ベクトル場を表すポテンシャル
      real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wq_TORPOT
      !(in) トロイダルポテンシャル

      real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wq_POLPOT
      !(in) ポロイダルポテンシャル

      call wq_Potential2VectorMPI( xvr_RotVLON,xvr_RotVLAT,xvr_RotVRAD, -wq_Lapla_wq(wq_POLPOT), wq_TORPOT)

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

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

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

の各成分を計算する

Original external subprogram is wq_module_sjpack#wq_Potential2Vector

Subroutine :
xvr_VLON :real(8), dimension(0:im-1,1:jc,km)
: (out) ベクトル場の経度成分
xvr_VLAT :real(8), dimension(0:im-1,1:jc,km)
: (out) ベクトル場の緯度成分
xvr_VRAD :real(8), dimension(0:im-1,1:jc,km)
: (out) ベクトル場の動径成分
wq_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) トロイダルポテンシャル
wq_POLPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ポロイダルポテンシャル

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

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

の各成分を計算する

[Source]

    subroutine wq_Potential2VectorMPI( xvr_VLON,xvr_VLAT,xvr_VRAD,wq_TORPOT,wq_POLPOT)
      !
      ! トロイダルポロイダルポテンシャルΨ,Φで表される非発散ベクトル場
      !
      !     v = ▽x(Ψr) + ▽x▽x(Φr) 
      !
      ! の各成分を計算する
      !
      real(8), dimension(0:im-1,1:jc,km)     :: xvr_VLON
      !(out) ベクトル場の経度成分

      real(8), dimension(0:im-1,1:jc,km)     :: xvr_VLAT
      !(out) ベクトル場の緯度成分

      real(8), dimension(0:im-1,1:jc,km)     :: xvr_VRAD
      !(out) ベクトル場の動径成分

      real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wq_TORPOT
      !(in) トロイダルポテンシャル

      real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wq_POLPOT
      !(in) ポロイダルポテンシャル

      xvr_VLON =   xvr_RAD * xvr_GradLat_wq(wq_TORPOT) + xva_GradLon_wa(wr_RotDRad_wq(wq_POLPOT))
      xvr_VLAT = - xvr_RAD * xvr_GradLon_wq(wq_TORPOT) + xva_GradLat_wa(wr_RotDRad_wq(wq_POLPOT))
      xvr_VRAD = xvr_wq(wq_L2_wq(wq_POLPOT))/xvr_RAD

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

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

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

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

[Source]

    function wq_QOperatorMPI_wq(wq)
      !
      ! 入力スペクトルデータに対応する格子点データに演算子
      !
      !    Q=(k・▽-1/2(L2 k・▽+ k・▽L2))
      !
      ! を作用させたデータのスペクトル変換が返される.
      !
      real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wq
      !(in) 2 次元球面調和函数チェビシェフスペクトルデータ

      real(8), dimension((nm+1)*(nm+1),0:lm)             :: wq_QOperatorMPI_wq
      !(out) Q 演算子を作用された 2 次元スペクトルデータ

      wq_QOperatorMPI_wq = wq_xvr(xvr_KGrad_wq(wq) - xvr_KGrad_wq(wq_L2_wq(wq))/2) - wq_L2_wq(wq_xvr(xvr_KGrad_wq(wq)))/2

    end function wq_QOperatorMPI_wq
wq_QOperator_wq( wq ) result(wq_QOperator_wq)
Function :
wq_QOperator_wq :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) Q 演算子を作用された 2 次元スペクトルデータ
wq :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 wq_module_sjpack#wq_QOperator_wq

wq_Rad2Inv_wq( aq_data ) result(aq_r2Inv_aq)
Function :
aq_r2Inv_aq :real(8), dimension(size(aq_data,1),0:size(aq_data,2)-1)
: (out) 出力スペクトルデータ
aq_data :real(8), dimension(:,0:), intent(in)
: (in) 入力スペクトルデータ

入力スペクトルデータに対して積 r^-2 のスペクトル係数 を計算する(2 次元配列用).

  a_n^m = aq_r2Inv_aq/sqrt(Inm),  b_n^m = aq_data/sqrt(Inm)

  b_n^m = (n-|m|)(n+|m|+beta-1)/((2n+gamma-5)(2n+gamma-3)) a_n-2^m
      + (2n(n+gamma-1) + 2|m|(|m|+beta-1)+(gamma-3)(beta+1)
           /((2n+gamma+1)(2n+gamma-3)) a_n^m
      + (n-|m|+gamma-beta)(n+|m|+gamma-1)
           /((2n+gamma+3)(2n+gamma+1)) a_n+2^m

Original external subprogram is wq_module_sjpack#wq_Rad2Inv_wq

wq_Rad2_wq( aq_data ) result(aq_r2_aq)
Function :
aq_r2_aq :real(8), dimension(size(aq_data,1),0:size(aq_data,2)-1)
: (out) 出力スペクトルデータ
aq_data :real(8), dimension(:,0:), intent(in)
: (in) 入力スペクトルデータ

入力スペクトルデータに対して積 r^2 のスペクトル係数 を計算する(2 次元配列用).

  a_n^m = aq_data/sqrt(Inm),  b_n^m = aq_rDr_aq/sqrt(Inm)

  b_n^m = (n-|m|)(n+|m|+beta-1)/((2n+gamma-5)(2n+gamma-3)) a_n-2^m
      + (2n(n+gamma-1) + 2|m|(|m|+beta-1)+(gamma-3)(beta+1)
           /((2n+gamma+1)(2n+gamma-3)) a_n^m
      + (n-|m|+gamma-beta)(n+|m|+gamma-1)
           /((2n+gamma+3)(2n+gamma+1)) a_n+2^m

Original external subprogram is wq_module_sjpack#wq_Rad2_wq

wq_RadDRad_wq( aq_data ) result(aq_rDr_aq)
Function :
aq_rDr_aq :real(8), dimension(size(aq_data,1),0:size(aq_data,2)-1)
: (out) 出力スペクトルデータ
aq_data :real(8), dimension(:,0:), intent(in)
: (in) 入力スペクトルデータ

入力スペクトルデータに対して微分 r(d/dr) のスペクトル係数 を計算する(2 次元配列用).

  a_n = aq_data/sqrt(Inm),  b_n = aq_rDr_aq/sqrt(Inm)

  b_n = (2n+gamma-1)/(2n+gamma+3)b_n+2
      + (2n+gamma-1)(n+gamma+1)/(2n+gamma+3)a_n+2 + n a_n

Original external subprogram is wq_module_sjpack#wq_RadDRad_wq

Function :
wq_RadRotRot_xvr_xvr_xvr :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) ベクトル v の r・(▽×▽×v)
xvr_VLON :real(8), dimension(0:im-1,1:jc,km), intent(in)
: (in) ベクトルの経度成分
xvr_VLAT :real(8), dimension(0:im-1,1:jc,km), intent(in)
: (in) ベクトルの緯度成分
xvr_VRAD :real(8), dimension(0:im-1,1:jc,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

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

[Source]

    function wq_RadRotRot_xvr_xvr_xvr(xvr_VLON,xvr_VLAT,xvr_VRAD) 
      ! 
      ! ベクトル 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 
      !
      ! のスペクトルデータが返される.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr_VLON
      !(in) ベクトルの経度成分

      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr_VLAT
      !(in) ベクトルの緯度成分

      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr_VRAD
      !(in) ベクトルの動径成分

      real(8), dimension((nm+1)*(nm+1),0:lm)     :: wq_RadRotRot_xvr_xvr_xvr
      !(out) ベクトル v の r・(▽×▽×v) 

      wq_RadRotRot_xvr_xvr_xvr = wq_RotDRad_wr( wa_DivLon_xva(xvr_VLON)+ wa_DivLat_xva(xvr_VLAT)) - wa_Lapla_wa(wq_xvr(xvr_VRAD/xvr_RAD))

    end function wq_RadRotRot_xvr_xvr_xvr
wq_RadRotRot_xyr_xyr_xyr( xyr_VLON, xyr_VLAT, xyr_VRAD ) result(wq_RadRotRot_xyr_xyr_xyr)
Function :
wq_RadRotRot_xyr_xyr_xyr :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) ベクトル v の r・(▽×▽×v)
xyr_VLON :real(8), dimension(0:im-1,1:jm,km), intent(in)
: (in) ベクトルの経度成分
xyr_VLAT :real(8), dimension(0:im-1,1:jm,km), intent(in)
: (in) ベクトルの緯度成分
xyr_VRAD :real(8), dimension(0:im-1,1:jm,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 wq_module_sjpack#wq_RadRotRot_xyr_xyr_xyr

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

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

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

を作用する.

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

Original external subprogram is wq_module_sjpack#wq_RotDRad_wr

wq_TorBoundary( wq_TORPOT, [value], [cond], [new] )
Subroutine :
wq_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 wq_module_sjpack#wq_TorBoundary

wq_TorBoundaryTau( wq_TORPOT, [value], [cond], [new] )
Subroutine :
wq_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 wq_module_sjpack#wq_TorBoundaryTau

wq_TorMagBoundary( wq_TOR, [new] )
Subroutine :
wq_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 wq_module_sjpack#wq_TorMagBoundary

wq_TormagBoundaryTau( wq_TOR, [new] )
Subroutine :
wq_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 wq_module_sjpack#wq_TormagBoundaryTau

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

Original external subprogram is wq_module_sjpack#wq_VMiss

Subroutine :
i :integer,intent(in)
: 格子点数(経度λ)
j :integer,intent(in)
: 格子点数(緯度φ)
k :integer,intent(in)
: 格子点数(動径 r)
n :integer,intent(in)
: 切断波数(水平全波数)
l :integer,intent(in)
: 切断波数(動径波数)
r :real(8),intent(in)
: 球半径
np :integer,intent(in), optional
: OPENMP での最大スレッド数
wa_init :logical,intent(in), optional
: wa_initial スイッチ

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

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

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

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

[Source]

   subroutine wq_mpi_Initial(i,j,k,n,l,r,np,wa_init)
     !
     ! スペクトル変換の格子点数, 波数, 動径座標の範囲を設定する.
     !
     ! 他の関数を呼ぶ前に, 最初にこのサブルーチンを呼んで初期設定を
     ! しなければならない. 
     !
     ! 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              ! 球半径

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

     logical    :: wa_initialize=.true.   ! wa_initial スイッチ

     im = i  
      jm = j 
      km = k
     nm = n  
      lm = l
     ra = r

     if ( present(wa_init) ) then
        wa_initialize = wa_init
     else
        wa_initialize = .true.
     endif

     if ( present(np) ) then
        call wq_Initial(im,jm,km,nm,lm,ra,np,wa_initialize)
     else
        call wq_Initial(im,jm,km,nm,lm,ra,wa_init=wa_initialize)
     endif
     if ( wa_initialize ) then
        call w_base_mpi_Initial
        call w_deriv_mpi_Initial
        call wa_base_mpi_Initial
     endif

     allocate(xvr_Lon(0:im-1,jc,km))
     allocate(xvr_Lat(0:im-1,jc,km))
     allocate(xvr_Rad(0:im-1,jc,km))

     xvr_Lon = spread(xv_Lon,3,km)
     xvr_Lat = spread(xv_Lat,3,km)
     xvr_Rad = spread(spread(r_Rad,1,jc),1,im)

     call MessageNotify('M','wq_mpi_initial','wq_mpi_module_sjpack (2012/04/02) is initialized')

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

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

Original external subprogram is wq_module_sjpack#wq_wr

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

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

[Source]

    function wq_xvr(xvr)
      !
      ! 3 次元格子点データからスペクトルデータへ(正)変換する.
      !
      real(8), dimension((nm+1)*(nm+1),0:lm)             :: wq_xvr
      !(out) 2 次元球面調和函数チェビシェフスペクトルデータ

      real(8), dimension(0:im-1,1:jc,km), intent(in)           :: xvr
      !(in) 3 次元経度緯度動径格子点データ

      wq_xvr = wq_wr(wa_xva(xvr))

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

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

Original external subprogram is wq_module_sjpack#wq_xyr

wr_BoundaryGrid( wr, [value], [cond] )
Subroutine :
wr :real(8), dimension((nm+1)*(nm+1),km),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 : 外側ノイマン条件

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

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法).

Original external subprogram is wq_module_sjpack#wr_BoundaryGrid

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

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

[Source]

    function wr_DivLat_xvr(xvr)
      !
      ! 格子データに発散型緯度微分 1/rcosφ・∂(f cosφ)/∂φ を
      ! 作用させたスペクトルデータを返す.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in)     :: xvr
      !(in) 3 次元経度緯度動径格子点データ

      real(8), dimension((nm+1)*(nm+1),km)         :: wr_DivLat_xvr
      !(out) 発散型緯度微分を作用された水平スペクトル動径格子点データ

      wr_DivLat_xvr = wa_DivLat_xva(xvr/xvr_Rad)

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

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

Original external subprogram is wq_module_sjpack#wr_DivLat_xyr

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

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

[Source]

    function wr_DivLon_xvr(xvr)
      ! 
      ! 格子点データに発散型経度微分 1/rcosφ・∂/∂λ を作用させた
      ! スペクトルデータを返す.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in)     :: xvr
      !(in) 3 次元経度緯度動径格子点データ

      real(8), dimension((nm+1)*(nm+1),km)         :: wr_DivLon_xvr
      !(out) 発散型経度微分を作用された水平スペクトル動径格子点データ

      wr_DivLon_xvr = wa_DivLon_xva(xvr/xvr_Rad)

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

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

Original external subprogram is wq_module_sjpack#wr_DivLon_xyr

wr_DivRad_wq( wq ) result(wr_DivRad_wq)
Function :
wr_DivRad_wq :real(8), dimension((nm+1)*(nm+1),km)
: (out) 発散型動径微分を作用された水平スペクトル動径格子点データ
wq :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 wq_module_sjpack#wr_DivRad_wq

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

格子点データに発散型動径微分

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

を作用する.

この関数の入力は動径次数と水平全波数の偶奇性が異なっていることを 仮定している. 偶奇性が一致している場合には wr_DigRad_wq を使用すること.

[Source]

    function wr_DivRad_xvr(xvr)
      ! 
      ! 格子点データに発散型動径微分
      !
      !       1/r^2 ∂/∂r (r^2  = ∂/∂r + 2/= 1/r∂/∂(r.) + 1/r
      !
      ! を作用する.
      !
      ! この関数の入力は動径次数と水平全波数の偶奇性が異なっていることを
      ! 仮定している. 偶奇性が一致している場合には wr_DigRad_wq を使用すること.
      !
      real(8), dimension(0:im-1,jc,km), intent(in) :: xvr
      !(in) 2 次元球面調和函数チェビシェフスペクトルデータ

      real(8), dimension((nm+1)*(nm+1),km)             :: wr_DivRad_xvr
      !(out) 発散型動径微分を作用された水平スペクトル動径格子点データ

      wr_DivRad_xvr = wr_wq(wq_RadDRad_wq(wq_xvr(xvr_Rad*xvr)))/wr_Rad**2 + 1/wr_Rad * wr_xvr(xvr)

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

格子点データに発散型動径微分

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

を作用する.

この関数の入力は動径次数と水平全波数の偶奇性が異なっていることを 仮定している. 偶奇性が一致している場合には wr_DigRad_wq を使用すること.

Original external subprogram is wq_module_sjpack#wr_DivRad_xyr

Function :
wr_Div_xvr_xvr_xvr :real(8), dimension((nm+1)*(nm+1),km)
: (out) ベクトル場の発散
xvr_Vlon :real(8), dimension(0:im-1,1:jc,km), intent(in)
: (in) ベクトル場の経度成分
xvr_Vlat :real(8), dimension(0:im-1,1:jc,km), intent(in)
: (in) ベクトル場の緯度成分
xvr_Vrad :real(8), dimension(0:im-1,1:jc,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)

と計算される.

第3成分の動径次数と水平全波数の偶奇性がずれていることを仮定している.

[Source]

    function wr_Div_xvr_xvr_xvr(xvr_Vlon,xvr_Vlat,xvr_Vrad)
      !
      ! べクトル成分である 3 つの格子データに発散を作用させた
      ! スペクトルデータを返す.
      !
      ! 第 1, 2 ,3 引数(u,v,w)がそれぞれベクトルの経度成分, 緯度成分, 
      ! 動径成分を表し, 発散は 
      !
      !      1/rcosφ・∂u/∂λ + 1/rcosφ・∂(v cosφ)/∂φ 
      !    + 1/r^2 ∂/∂r (r^2 w)
      !
      ! と計算される.
      !
      ! 第3成分の動径次数と水平全波数の偶奇性がずれていることを仮定している.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr_Vlon
      !(in) ベクトル場の経度成分

      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr_Vlat
      !(in) ベクトル場の緯度成分

      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr_Vrad
      !(in) ベクトル場の動径成分

      real(8), dimension((nm+1)*(nm+1),km)     :: wr_Div_xvr_xvr_xvr
      !(out) ベクトル場の発散

      wr_Div_xvr_xvr_xvr =   wr_DivLon_xvr(xvr_Vlon) + wr_DivLat_xvr(xvr_Vlat) + wr_DivRad_xvr(xvr_Vrad)

    end function wr_Div_xvr_xvr_xvr
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),km)
: (out) ベクトル場の発散
xyr_Vlon :real(8), dimension(0:im-1,1:jm,km), intent(in)
: (in) ベクトル場の経度成分
xyr_Vlat :real(8), dimension(0:im-1,1:jm,km), intent(in)
: (in) ベクトル場の緯度成分
xyr_Vrad :real(8), dimension(0:im-1,1:jm,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 wq_module_sjpack#wr_Div_xyr_xyr_xyr

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

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

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法).

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

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

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

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

Original external subprogram is wq_module_sjpack#wr_PolmagBoundaryGrid

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

Original external subprogram is wq_module_sjpack#wr_RAD

Function :
wr_RadRotRot_xvr_xvr_xvr :real(8), dimension((nm+1)*(nm+1),km)
: (out) ベクトル v の r・(▽×▽×v)
xvr_VLON :real(8), dimension(0:im-1,1:jc,km), intent(in)
: (in) ベクトルの経度成分
xvr_VLAT :real(8), dimension(0:im-1,1:jc,km), intent(in)
: (in) ベクトルの緯度成分
xvr_VRAD :real(8), dimension(0:im-1,1:jc,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

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

[Source]

    function wr_RadRotRot_xvr_xvr_xvr(xvr_VLON,xvr_VLAT,xvr_VRAD) 
      ! 
      ! ベクトル 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 
      !
      ! のスペクトルデータが返される.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr_VLON
      !(in) ベクトルの経度成分

      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr_VLAT
      !(in) ベクトルの緯度成分

      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr_VRAD
      !(in) ベクトルの動径成分

      real(8), dimension((nm+1)*(nm+1),km)     :: wr_RadRotRot_xvr_xvr_xvr
      !(out) ベクトル v の r・(▽×▽×v) 

      wr_RadRotRot_xvr_xvr_xvr = wr_RotDRad_wr( wa_DivLon_xva(xvr_VLON)+ wa_DivLat_xva(xvr_VLAT)) - wa_Lapla_wa(wr_xvr(xvr_VRAD/xvr_RAD))

    end function wr_RadRotRot_xvr_xvr_xvr
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),km)
: (out) ベクトル v の r・(▽×▽×v)
xyr_VLON :real(8), dimension(0:im-1,1:jm,km), intent(in)
: (in) ベクトルの経度成分
xyr_VLAT :real(8), dimension(0:im-1,1:jm,km), intent(in)
: (in) ベクトルの緯度成分
xyr_VRAD :real(8), dimension(0:im-1,1:jm,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 wq_module_sjpack#wr_RadRotRot_xyr_xyr_xyr

Function :
wr_RadRot_xvr_xvr :real(8), dimension((nm+1)*(nm+1),km)
: (out) ベクトルの渦度と動径ベクトルの内積
xvr_VLON :real(8), dimension(0:im-1,1:jc,km), intent(in)
: (in) ベクトルの経度成分
xvr_VLAT :real(8), dimension(0:im-1,1:jc,km), intent(in)
: (in) ベクトルの緯度成分

r・(▽×v)

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

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

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

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

[Source]

    function wr_RadRot_xvr_xvr(xvr_VLON,xvr_VLAT)  ! r・(▽×v)
      !
      ! ベクトルの渦度と動径ベクトルの内積 r・(▽×v) を計算する.
      !
      ! 第 1, 2 引数(v[λ], v[φ])がそれぞれベクトルの経度成分, 緯度成分を表す.
      !
      !    r・(▽×v) = 1/cosφ・∂v[φ]/∂λ - 1/cosφ・∂(v[λ] cosφ)/∂φ
      !
      ! のスペクトル データが返される.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr_VLON
      !(in) ベクトルの経度成分

      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr_VLAT
      !(in) ベクトルの緯度成分

      real(8), dimension((nm+1)*(nm+1),km)     :: wr_RadRot_xvr_xvr
      !(out) ベクトルの渦度と動径ベクトルの内積

      wr_RadRot_xvr_xvr = wa_DivLon_xva(xvr_VLAT) - wa_DivLat_xva(xvr_VLON)
      
    end function wr_RadRot_xvr_xvr
wr_RadRot_xyr_xyr( xyr_VLON, xyr_VLAT ) result(wr_RadRot_xyr_xyr)
Function :
wr_RadRot_xyr_xyr :real(8), dimension((nm+1)*(nm+1),km)
: (out) ベクトルの渦度と動径ベクトルの内積
xyr_VLON :real(8), dimension(0:im-1,1:jm,km), intent(in)
: (in) ベクトルの経度成分
xyr_VLAT :real(8), dimension(0:im-1,1:jm,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 wq_module_sjpack#wr_RadRot_xyr_xyr

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

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

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

を作用する.

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

Original external subprogram is wq_module_sjpack#wr_RotDRad_wq

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

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

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

を作用する.

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

Original external subprogram is wq_module_sjpack#wr_RotDRad_wr

Function :
wr_RotRad_xvr_xvr :real(8), dimension((nm+1)*(nm+1),km)
: (out) ベクトル場の回転の動径成分
xvr_Vlat :real(8), dimension(0:im-1,1:jc,km), intent(in)
: (in) ベクトル場の緯度成分
xvr_Vlon :real(8), dimension(0:im-1,1:jc,km), intent(in)
: (in) ベクトル場の経度成分

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

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

を計算する.

[Source]

    function wr_RotRad_xvr_xvr(xvr_Vlat,xvr_Vlon) 
      !
      ! ベクトルの緯度成分, 経度成分である第 1, 2 引数 Vlat, Vlon に対して
      ! ベクトル場の回転の動径成分 
      !
      !    1/rcosφ・∂Vlat/∂λ - 1/rcosφ・∂(Vlon cosφ)/∂φ
      !
      ! を計算する.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr_Vlat
      !(in) ベクトル場の緯度成分

      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr_Vlon
      !(in) ベクトル場の経度成分

      real(8), dimension((nm+1)*(nm+1),km)       :: wr_RotRad_xvr_xvr
      !(out) ベクトル場の回転の動径成分

      wr_RotRad_xvr_xvr =   wr_DivLon_xvr(xvr_Vlat) - wr_DivLat_xvr(xvr_Vlon)

    end function wr_RotRad_xvr_xvr
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),km)
: (out) ベクトル場の回転の動径成分
xyr_Vlat :real(8), dimension(0:im-1,1:jm,km), intent(in)
: (in) ベクトル場の緯度成分
xyr_Vlon :real(8), dimension(0:im-1,1:jm,km), intent(in)
: (in) ベクトル場の経度成分

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

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

を計算する.

Original external subprogram is wq_module_sjpack#wr_RotRad_xyr_xyr

wr_TorBoundaryGrid( wr_TORPOT, [value], [cond], [new] )
Subroutine :
wr_TORPOT :real(8), dimension((nm+1)*(nm+1),km),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.

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

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法).

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

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

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

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

Original external subprogram is wq_module_sjpack#wr_TorBoundaryGrid

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

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

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法).

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

外側

   wq_psi = 0   at the outer boundary

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

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

Original external subprogram is wq_module_sjpack#wr_TormagBoundaryGrid

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

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

Original external subprogram is wq_module_sjpack#wr_wq

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

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

[Source]

    function wr_xvr(xvr)
      !
      ! 3 次元格子データから水平スペクトル・動径格子点データへ(正)変換する.
      !
      real(8), dimension((nm+1)*(nm+1),km)               :: wr_xvr
      !(out) 2 次元球面調和函数スペクトル・動径格子点データ

      real(8), dimension(0:im-1,1:jc,km), intent(in)         :: xvr
      !(in) 3 次元経度緯度動径格子点データ

      wr_xvr = wa_xva(xvr)

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

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

Original external subprogram is wq_module_sjpack#wr_xyr

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

緯度動径(子午面)積分

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

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

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

を計算する.

[Source]

    function x_AvrLatRad_xvr(xvr)  ! 緯度動径(子午面)積分
      !
      ! 3 次元格子点データの緯度動径(子午面)平均
      !
      ! 3 次元データ f(λ,φ,r) に対して
      !
      !    ∫f(λ,,r) r^2cosφ dφdr /(2(r[o]^3-r[i]^3)/3) 
      !
      ! を計算する.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr
      !(in) 3 次元経度緯度動径格子点データ

      real(8), dimension(0:im-1)     :: x_AvrLatRad_xvr
      !(out) 緯度動径(子午面)平均された 1 次元経度格子点データ

      x_AvrLatRad_xvr = x_IntLatRad_xvr(xvr) /( sum(y_Lat_Weight)*sum(r_Rad_Weight) )

    end function x_AvrLatRad_xvr
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,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 wq_module_sjpack#x_AvrLatRad_xyr

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

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

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

Original external subprogram is w_integral_mpi_module_sjpack#x_AvrLat_xv

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 wq_module_sjpack#x_AvrLat_xy

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 wa_module_sjpack#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,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 wq_module_sjpack#x_AvrRad_xr

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

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

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

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

を計算する.

[Source]

    function x_IntLatRad_xvr(xvr)
      !
      ! 3 次元格子点データの緯度動径(子午面)積分
      !
      ! 3 次元データ f(λ,φ,r) に対して
      !
      !    ∫f(λ,φ,r) r^2cosφ dφdr 
      !
      ! を計算する.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr
      !(in) 3 次元経度緯度動径格子点データ

      real(8), dimension(0:im-1)     :: x_IntLatRad_xvr
      !(out) 緯度動径(子午面)積分された 1 次元経度格子点データ

      real(8), dimension(0:im-1)     :: x_IntLatRadTMP
      integer :: j, k

      x_IntLatRad_xvr = 0.0D0
      do k=1,km
         do j=1,jc
            x_IntLatRad_xvr = x_IntLatRad_xvr + xvr(:,j,k) * v_Lat_Weight(j) * r_Rad_Weight(k)
         enddo
      enddo

      x_IntLatRadTmp=x_IntLatRad_xvr
      CALL MPI_ALLREDUCE(x_IntLatRadTMP,x_IntLatRad_xvr,im,MPI_REAL8, MPI_SUM,MPI_COMM_WORLD,IERR)

    end function x_IntLatRad_xvr
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,km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

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

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

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

を計算する.

Original external subprogram is wq_module_sjpack#x_IntLatRad_xyr

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

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

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

Original external subprogram is w_integral_mpi_module_sjpack#x_IntLat_xv

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 wq_module_sjpack#x_IntLat_xy

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 wa_module_sjpack#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,km), intent(in)
: (in) 2 次元緯度動径格子点データ

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

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

Original external subprogram is wq_module_sjpack#x_IntRad_xr

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

Original external subprogram is wq_module_sjpack#x_Lon

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

Original external subprogram is wa_module_sjpack#x_Lon

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

Original external subprogram is wq_module_sjpack#x_Lon_Weight

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

Original external subprogram is wa_module_sjpack#x_Lon_Weight

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

緯度積分

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

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

[Source]

    function xr_AvrLat_xvr(xvr)  ! 緯度積分
      !
      ! 3 次元格子点データの緯度方向域平均.
      !
      ! 3 次元データ f(λ,φ,r) に対して ∫f(λ,φ,r)cosφ dφ/2 を計算する.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr
      !(in) 3 次元経度緯度動径格子点データ

      real(8), dimension(0:im-1,km)  :: xr_AvrLat_xvr
      !(out) 緯度平均された 2 次元緯度動径格子点データ

      xr_AvrLat_xvr = xr_IntLat_xvr(xvr)/sum(y_Lat_Weight)

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

緯度積分

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

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

Original external subprogram is wq_module_sjpack#xr_AvrLat_xyr

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

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

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

[Source]

    function xr_IntLat_xvr(xvr)
      !
      ! 3 次元格子点データの緯度方向域積分.
      !
      ! 3 次元データ f(λ,φ,r) に対して∫f(λ,φ,r) cosφ dφ を計算する.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr
      !(in) 3 次元経度緯度動径格子点データ

      real(8), dimension(0:im-1,km)  :: xr_IntLat_xvr   
      !(out) 緯度積分された 2 次元緯度動径格子点データ
      ! 緯度円格子点データ

      real(8), dimension(0:im-1,km)  :: xr_IntLatTMP
      integer :: j

      xr_IntLat_xvr = 0.0d0
      do j=1,jc
         xr_IntLat_xvr(:,:) = xr_IntLat_xvr(:,:) + xvr(:,j,:) * v_Lat_Weight(j)
      enddo
      xr_IntLatTmp=xr_IntLat_xvr
      CALL MPI_ALLREDUCE(xr_IntLatTMP,xr_IntLat_xvr,im*km,MPI_REAL8, MPI_SUM,MPI_COMM_WORLD,IERR)

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

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

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

Original external subprogram is wq_module_sjpack#xr_IntLat_xyr

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

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

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

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

を計算する.

[Source]

    function xv_AvrRad_xvr(xvr)
      !
      ! 3 次元格子点データの動径方向域平均.
      !
      ! 3 次元データ f(λ,φ,r) に対して 
      !
      !    ∫f(λ,φ,r) r^2dr/((r[o]^3-r[i]^3)/3) 
      !
      ! を計算する.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr
      !(in) 3 次元経度緯度動径格子点データ

      real(8), dimension(0:im-1,1:jc)  :: xv_AvrRad_xvr
      !(out) 動径平均された 2 次元経度緯度(水平, 球面)格子点データ
      ! 水平格子点データ

      xv_AvrRad_xvr = xv_IntRad_xvr(xvr)/sum(r_Rad_Weight)

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

動径積分

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

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

[Source]

    function xv_IntRad_xvr(xvr)  ! 動径積分
      !
      ! 3 次元格子点データの動径方向域積分.
      !
      ! 3 次元データ f(λ,φ,r) に対して∫f(λ,φ,r) r^2dr を計算する.
      !
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr
      !(in) 3 次元経度緯度動径格子点データ

      real(8), dimension(0:im-1,1:jc)  :: xv_IntRad_xvr
      !(out) 動径積分された 2 次元経度緯度(水平, 球面)格子点データ

      integer :: k

      xv_IntRad_xvr = 0.0d0
      do k=1,km
         xv_IntRad_xvr(:,:) = xv_IntRad_xvr(:,:) + xvr(:,:,k) * r_Rad_Weight(k) 
      enddo

    end function xv_IntRad_xvr
xv_Lat
Variable :
xv_Lat(:,:) :real(8), allocatable

Original external subprogram is w_base_mpi_module_sjpack#xv_Lat

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

Original external subprogram is w_base_mpi_module_sjpack#xv_Lon

xv_w( w_data, [ipow], [iflag] ) result(xv_w)
Function :
xv_w(0:im-1,1:jc) :real(8)
: (out) 格子点データ
w_data((mm+1)*(mm+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 w_base_mpi_module_sjpack#xv_w

Function :
xvr_Div_xvr_xvr_xvr :real(8), dimension(0:im-1,1:jc,km)
: (out) ベクトル場の発散
xvr_Vlon :real(8), dimension(0:im-1,1:jc,km), intent(in)
: (in) ベクトル場の経度成分
xvr_Vlat :real(8), dimension(0:im-1,1:jc,km), intent(in)
: (in) ベクトル場の緯度成分
xvr_Vrad :real(8), dimension(0:im-1,1:jc,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

[Source]

    function xvr_Div_xvr_xvr_xvr(xvr_Vlon,xvr_Vlat,xvr_Vrad)
      !
      ! ベクトル成分である 3 つの格子データに発散を作用させる.
      !
      ! 第 1, 2 ,3 引数(u,v,w)がそれぞれベクトルの経度成分, 緯度成分, 
      ! 動径成分を表す.
      !
      ! 極の特異性を回避するためにベクトル場に cosφ/r の重みをかけて
      ! 計算している. 
      !
      !      div V = (r/cosφ)・div (Vcosφ/r) + V_φtanφ/r + V_r/r
      ! 
      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr_Vlon
      !(in) ベクトル場の経度成分

      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr_Vlat
      !(in) ベクトル場の緯度成分

      real(8), dimension(0:im-1,1:jc,km), intent(in) :: xvr_Vrad
      !(in) ベクトル場の動径成分

      real(8), dimension(0:im-1,1:jc,km)             :: xvr_Div_xvr_xvr_xvr
      !(out) ベクトル場の発散

      xvr_Div_xvr_xvr_xvr = xvr_Rad/cos(xvr_Lat) * xvr_wr(wr_Div_xvr_xvr_xvr(xvr_VLon*cos(xvr_Lat)/xvr_Rad, xvr_VLat*cos(xvr_Lat)/xvr_Rad, xvr_VRad*cos(xvr_Lat)/xvr_Rad )) + xvr_VLat*tan(xvr_Lat)/xvr_Rad + xvr_VRad/xvr_Rad

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

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

[Source]

    function xvr_GradLat_wq(wq) 
      !
      ! スペクトルデータに勾配型経度微分 1/r ∂/∂φ を作用させる.
      !
      real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wq
      !(in) 2 次元球面調和函数チェビシェフスペクトルデータ

      real(8), dimension(0:im-1,1:jc,km)    :: xvr_GradLat_wq
      !(out) 勾配型緯度微分を作用された 2 次元スペクトルデータ

      xvr_GradLat_wq = xva_GradLat_wa(wr_wq(wq))/xvr_Rad

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

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

[Source]

    function xvr_GradLon_wq(wq)
      !
      ! スペクトルデータに勾配型経度微分 1/rcosφ・∂/∂λ
      ! を作用させる.
      !
      real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wq
      !(in) 2 次元球面調和函数チェビシェフスペクトルデータ

      real(8), dimension(0:im-1,1:jc,km)    :: xvr_GradLon_wq
      !(out) 勾配型経度微分を作用された 2 次元スペクトルデータ

      xvr_GradLon_wq = xva_GradLon_wa(wr_wq(wq))/xvr_Rad

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

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

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

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

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

[Source]

    function xvr_KGrad_wq(wq)    ! k・▽ = cosφ/r ∂/∂φ + sinφ∂/∂r
      !
      ! 入力スペクトルデータに対応する格子データに軸方向微分 
      !
      !    k・▽ = cosφ/r ∂/∂φ + sinφ∂/∂r 
      !
      ! を作用させた格子データが返される. 
      ! ここでベクトル k は球の中心から北極向きの単位ベクトルである.
      !
      real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wq
      !(in) 2 次元球面調和函数チェビシェフスペクトルデータ

      real(8), dimension(0:im-1,1:jc,km)                 :: xvr_KGrad_wq
      !(out) 軸方向微分を作用された 2 次元スペクトルデータ

      xvr_KGrad_wq =  cos(xvr_Lat)*xvr_GradLat_wq(wq) + sin(xvr_Lat)*xvr_wq(wq_RadDRad_wq(wq))/xvr_Rad

    end function xvr_KGrad_wq
xvr_LAT
Variable :
xvr_LAT :real(8), dimension(:,:,:), allocatable
: 座標
xvr_LON
Variable :
xvr_LON :real(8), dimension(:,:,:), allocatable
: 座標
xvr_RAD
Variable :
xvr_RAD :real(8), dimension(:,:,:), allocatable
: 座標
Function :
xvr_RotLat_wq_wq :real(8), dimension(0:im-1,1:jc,km)
: (out) ベクトル場の回転の緯度成分
wq_Vlon :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ベクトル場の経度成分
wq_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/∂λ

を計算する.

[Source]

    function xvr_RotLat_wq_wq(wq_Vlon,wq_Vrad) 
      !
      ! ベクトル場の経度成分, 動径成分である第 1, 2 引数 Vlon, Vrad から
      ! 回転の緯度成分 
      !
      !    1/r ∂(r Vlon)/∂r - 1/rcosφ・∂Vrad/∂λ
      !
      ! を計算する.
      !
      real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wq_Vlon
      !(in) ベクトル場の経度成分

      real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wq_Vrad
      !(in) ベクトル場の動径成分

      real(8), dimension(0:im-1,1:jc,km)                 :: xvr_RotLat_wq_wq
      !(out) ベクトル場の回転の緯度成分

      xvr_RotLat_wq_wq =   xvr_wr(wr_RotDRad_wq(wq_Vlon)) - xvr_GradLon_wq(wq_Vrad) 

    end function xvr_RotLat_wq_wq
Function :
xvr_RotLon_wq_wq :real(8), dimension(0:im-1,1:jc,km)
: (out) ベクトル場の回転の経度成分
wq_Vrad :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ベクトル場の動径成分
wq_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 を計算する.

を計算する

[Source]

    function xvr_RotLon_wq_wq(wq_Vrad,wq_Vlat) 
      !
      ! ベクトル場の動径成分, 緯度成分である第 1, 2 引数 Vrad, Vlat から
      ! 回転の経度成分 
      !
      !    1/r ∂Vrad/∂φ-1/r ∂(r Vlat)/∂r を計算する.
      !
      ! を計算する
      !
      real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wq_Vrad
      !(in) ベクトル場の動径成分

      real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wq_Vlat
      !(in) ベクトル場の緯度成分

      real(8), dimension(0:im-1,1:jc,km)                 :: xvr_RotLon_wq_wq
      !(out) ベクトル場の回転の経度成分

      xvr_RotLon_wq_wq =   xvr_GradLat_wq(wq_Vrad) - xvr_wr(wr_RotDRad_wq(wq_Vlat))

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

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

[Source]

    function xvr_wq(wq)
      !
      ! スペクトルデータから 3 次元分散格子点データへ(逆)変換する.
      !
      real(8), dimension(0:im-1,1:jc,km)                       :: xvr_wq
      !(out) 3 次元経度緯度動径格子点データ

      real(8), dimension((nm+1)*(nm+1),0:lm), intent(in) :: wq
      !(in) 2 次元球面調和函数チェビシェフスペクトルデータ

      xvr_wq = xva_wa(wr_wq(wq))

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

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

[Source]

    function xvr_wr(wr)
      !
      ! 水平スペクトル・動径格子点データから 3 次元分散格子点データへ(逆)変換する.
      !
      real(8), dimension(0:im-1,1:jc,km)                     :: xvr_wr
      !(out) 3 次元経度緯度動径格子点データ

      real(8), dimension((nm+1)*(nm+1),km), intent(in) :: wr
      !(in) 2 次元球面調和函数スペクトル・動径格子点データ

      xvr_wr = xva_wa(wr)

    end function xvr_wr
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,km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

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

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

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

を計算する.

Original external subprogram is wq_module_sjpack#xy_AvrRad_xyr

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,km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

動径積分

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

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

Original external subprogram is wq_module_sjpack#xy_IntRad_xyr

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

Original external subprogram is wq_module_sjpack#xy_Lat

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

Original external subprogram is wa_module_sjpack#xy_Lat

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

Original external subprogram is wq_module_sjpack#xy_Lon

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

Original external subprogram is wa_module_sjpack#xy_Lon

xy_w( w_data, [ipow], [iflag] ) result(xy_w)
Function :
xy_w(0:im-1,1:jm) :real(8)
: (out) 格子点データ
w_data((mm+1)*(mm+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 wq_module_sjpack#xy_w

xy_w( w_data, [ipow], [iflag] ) result(xy_w)
Function :
xy_w(0:im-1,1:jm) :real(8)
: (out) 格子点データ
w_data((mm+1)*(mm+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 wa_module_sjpack#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,km)
: (out) ベクトル場の発散
xyr_Vlon :real(8), dimension(0:im-1,1:jm,km), intent(in)
: (in) ベクトル場の経度成分
xyr_Vlat :real(8), dimension(0:im-1,1:jm,km), intent(in)
: (in) ベクトル場の緯度成分
xyr_Vrad :real(8), dimension(0:im-1,1:jm,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 wq_module_sjpack#xyr_Div_xyr_xyr_xyr

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

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

Original external subprogram is wq_module_sjpack#xyr_GradLat_wq

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

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

Original external subprogram is wq_module_sjpack#xyr_GradLon_wq

xyr_KGrad_wq( wq ) result(xyr_KGrad_wq)
Function :
xyr_KGrad_wq :real(8), dimension(0:im-1,1:jm,km)
: (out) 軸方向微分を作用された 2 次元スペクトルデータ
wq :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 wq_module_sjpack#xyr_KGrad_wq

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

Original external subprogram is wq_module_sjpack#xyr_LAT

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

Original external subprogram is wq_module_sjpack#xyr_LON

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

Original external subprogram is wq_module_sjpack#xyr_RAD

xyr_RotLat_wq_wq( wq_Vlon, wq_Vrad ) result(xyr_RotLat_wq_wq)
Function :
xyr_RotLat_wq_wq :real(8), dimension(0:im-1,1:jm,km)
: (out) ベクトル場の回転の緯度成分
wq_Vlon :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ベクトル場の経度成分
wq_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 wq_module_sjpack#xyr_RotLat_wq_wq

xyr_RotLon_wq_wq( wq_Vrad, wq_Vlat ) result(xyr_RotLon_wq_wq)
Function :
xyr_RotLon_wq_wq :real(8), dimension(0:im-1,1:jm,km)
: (out) ベクトル場の回転の経度成分
wq_Vrad :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ベクトル場の動径成分
wq_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 wq_module_sjpack#xyr_RotLon_wq_wq

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

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

Original external subprogram is wq_module_sjpack#xyr_wq

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

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

Original external subprogram is wq_module_sjpack#xyr_wr

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,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 wq_module_sjpack#y_AvrLonRad_xyr

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 wq_module_sjpack#y_AvrLon_xy

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 wa_module_sjpack#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,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 wq_module_sjpack#y_AvrRad_yr

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,km), intent(in)
: (in) 3 次元経度緯度動径格子点データ

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

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

Original external subprogram is wq_module_sjpack#y_IntLonRad_xyr

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 wq_module_sjpack#y_IntLon_xy

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 wa_module_sjpack#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,km), intent(in)
: (in) 2 次元緯度動径(子午面)格子点データ

動径積分

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

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

Original external subprogram is wq_module_sjpack#y_IntRad_yr

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

Original external subprogram is wq_module_sjpack#y_Lat

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

Original external subprogram is wa_module_sjpack#y_Lat

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

Original external subprogram is wq_module_sjpack#y_Lat_Weight

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

Original external subprogram is wa_module_sjpack#y_Lat_Weight

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

経度(帯状)積分

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

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

Original external subprogram is wq_module_sjpack#yr_AvrLon_xyr

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

経度(帯状)積分

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

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

Original external subprogram is wq_module_sjpack#yr_IntLon_xyr