Class wt_galerkin_module
In: libsrc/wt_galerkin_module/wt_galerkin_module.f90

wt_galerkin_module

Authors:Youhei SASAKI
Version:$Id: wt_galerkin_module.f90 609 2013-08-24 11:49:51Z takepiro $
Copyright&License:See COPYRIGHT

概要

     3 次元球殻領域
     球面調和函数展開 + チェビシェフ−ガラーキン法
  • まだ作成中です.

Methods

AvrLatRad_yz   AvrLonLatRad_xyz   AvrLonRad_xz   AvrRad_z   IntLatRad_yz   IntLonLatRad_xyz   IntLonRad_xz   IntRad_z   b_DRad_b   b_t   b_z   d_DRad_d   d_t   d_z   f_DRad_f   f_t   f_z   nmz_PoloidalEnergySpectrum_wt   nmz_ToroidalEnergySpectrum_wt   nz_PoloidalEnergySpectrum_wt   nz_ToroidalEnergySpectrum_wt   p_DRad_p   p_t   p_z   q_DRad_q   q_t   q_z   t_b   t_d   t_f   t_p   t_q   t_v   v_DRad_v   v_t   v_z   wb_DRad_wb   wb_wt   wb_wz   wd_DRad_wd   wd_wt   wd_wz   wf_DRad_wf   wf_wt   wf_wz   wh_DRad_wh   wh_wt   wh_wz   wp_DRad_wp   wp_wt   wp_wz   wq_DRad_wq   wq_LaplaPol2Pol_wt   wq_wt   wq_wz   wt_Boundaries   wt_BoundariesGrid   wt_BoundariesTau   wt_DRad_wt   wt_DivLat_xyz   wt_DivLon_xyz   wt_DivRad_wt   wt_Div_xyz_xyz_xyz   wt_KxRGrad_wt   wt_L2Inv_wt   wt_L2_wt   wt_LaplaPol2PolGrid_wt   wt_Lapla_wt   wt_PolMagBoundaries   wt_PolmagBoundariesGrid   wt_PolmagBoundariesTau   wt_Potential2Rotation   wt_Potential2Vector   wt_QOperator_wt   wt_RadRotRot_xyz_xyz_xyz   wt_RadRot_xyz_xyz   wt_RotRad_wt   wt_RotRad_xyz_xyz   wt_TorBoundaries   wt_TorBoundariesGrid   wt_TorBoundariesTau   wt_TorMagBoundaries   wt_TormagBoundariesGrid   wt_TormagBoundariesTau   wt_VGradV   wt_VMiss   wt_galerkin_Initial   wt_wb   wt_wd   wt_wf   wt_wh   wt_wp   wt_wq   wt_wv   wt_wz   wt_xyz   wv_DRad_wv   wv_wt   wv_wz   wz_LaplaPol2Pol_wz   wz_RAD   wz_wb   wz_wd   wz_wf   wz_wh   wz_wp   wz_wq   wz_wt   wz_wv   wz_xyz   x_AvrLatRad_xyz   x_AvrRad_xz   x_IntLatRad_xyz   x_IntRad_xz   xy_AvrRad_xyz   xy_IntRad_xyz   xyz_Div_xyz_xyz_xyz   xyz_GradLat_wt   xyz_GradLon_wt   xyz_KGrad_wt   xyz_LAT   xyz_LON   xyz_RAD   xyz_RotLat_wt_wt   xyz_RotLon_wt_wt   xyz_wt   xyz_wz   xz_AvrLat_xyz   xz_IntLat_xyz   y_AvrLonRad_xyz   y_AvrRad_yz   y_IntLonRad_xyz   y_IntRad_yz   yz_AvrLon_xyz   yz_IntLon_xyz   z_AvrLat_yz   z_AvrLonLat_xyz   z_AvrLon_xz   z_IntLat_yz   z_IntLonLat_xyz   z_IntLon_xz   z_b   z_d   z_f   z_p   z_q   z_v  

Included Modules

dc_message lumatrix wt_module at_ad_galerkin_DD at_av_galerkin_NN at_ab_galerkin_ND at_ap_galerkin_DN at_af_galerkin_MM at_ah_galerkin_MMex at_aq_galerkin_RRFF

Public Instance methods

AvrLatRad_yz( yz ) result(AvrLatRad_yz)
Function :
AvrLatRad_yz :real(8)
: (out) 平均値
yz :real(8), dimension(1:jm,0:km), intent(in)
: (in) 2 次元緯度動径(子午面)格子点データ

緯度動径(子午面)積分

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

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

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

を計算する.

Original external subprogram is wt_module#AvrLatRad_yz

AvrLonLatRad_xyz( xyz ) result(AvrLonLatRad_xyz)
Function :
AvrLonLatRad_xyz :real(8)
: (out) 全球平均値
xyz :real(8), dimension(0:im-1,1:jm,0: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 wt_module#AvrLonLatRad_xyz

AvrLonRad_xz( xz ) result(AvrLonRad_xz)
Function :
AvrLonRad_xz :real(8)
: 積分値
xz :real(8), dimension(0:im-1,0:km), intent(in)
: (in) 2 次元格子点データ

経度動径(緯度円)積分

2 次元(XZ)格子点データの経度動径平均

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

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

を計算する.

Original external subprogram is wt_module#AvrLonRad_xz

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

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

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

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

Original external subprogram is wt_module#IntLatRad_yz

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

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

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

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

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

を計算する.

Original external subprogram is wt_module#IntLonLatRad_xyz

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

経度動径(緯度円)積分

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

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

Original external subprogram is wt_module#IntLonRad_xz

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

動径積分

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

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

Original external subprogram is wt_module#IntRad_z

b_DRad_b( b_data ) result(b_Dx_b)
Function :
b_Dx_b(ks:km) :real(8)
b_data(ks:km) :real(8), intent(IN)

チェビシェフ−ガラーキン法 片端ノイマン片端ディリクレ境界条件

X 微分計算(1 次元)

Original external subprogram is at_ab_galerkin_ND#b_Dx_b

b_t( t_data ) result(b_t)
Function :
b_t(ks:km) :real(8)
: (out) ガラーキン係数
t_data(0:km) :real(8), intent(IN)
: (in) チェビシェフ係数

チェビシェフ−ガラーキン法 片端ノイマン片端ディリクレ境界条件

チェビシェフ係数 -> ガラーキン係数変換(1次元データ)

Original external subprogram is at_ab_galerkin_ND#b_t

b_z( g_data ) result(b_g)
Function :
b_g(ks:km) :real(8)
: (out) ガラーキン係数
g_data(0:im) :real(8), intent(IN)
: (in) 格子点データ

チェビシェフ−ガラーキン法 片端ノイマン片端ディリクレ境界条件

格子点データ -> ガラーキン係数変換(1次元データ)

Original external subprogram is at_ab_galerkin_ND#b_g

d_DRad_d( d_data ) result(d_Dx_d)
Function :
d_Dx_d(ks:km) :real(8)
d_data(ks:km) :real(8), intent(IN)

チェビシェフ−ガラーキン法 両端ディリクレ境界条件

X 微分計算(1 次元データ)

Original external subprogram is at_ad_galerkin_DD#d_Dx_d

d_t( t_data ) result(d_t)
Function :
d_t(ks:km) :real(8)
: (out) ガラーキン係数
t_data(0:km) :real(8), intent(IN)
: (in) チェビシェフ係数

チェビシェフ−ガラーキン法 両端ディリクレ境界条件

チェビシェフ係数 -> ガラーキン係数変換(1次元データ)

Original external subprogram is at_ad_galerkin_DD#d_t

d_z( g_data ) result(d_g)
Function :
d_g(ks:km) :real(8)
: (out) ガラーキン係数
g_data(0:im) :real(8), intent(IN)
: (in) 格子点データ

チェビシェフ−ガラーキン法 両端ディリクレ境界条件

格子点データ -> ガラーキン係数変換(1次元データ)

Original external subprogram is at_ad_galerkin_DD#d_g

f_DRad_f( f_data ) result(f_Dx_f)
Function :
f_Dx_f(ks:km) :real(8)
f_data(ks:km) :real(8), intent(IN)

チェビシェフ−ガラーキン法 ディリクレ・ノイマン混合境界条件

X 微分計算(1 次元)

Original external subprogram is at_af_galerkin_MM#f_Dx_f

f_t( t_data ) result(f_t)
Function :
f_t(ks:km) :real(8)
: (out) ガラーキン係数
t_data(0:km) :real(8), intent(IN)
: (in) チェビシェフ係数

チェビシェフ−ガラーキン法 ディリクレ・ノイマン混合境界条件

チェビシェフ係数 -> ガラーキン係数変換(1次元データ)

Original external subprogram is at_af_galerkin_MM#f_t

f_z( g_data ) result(f_g)
Function :
f_g(ks:km) :real(8)
: (out) ガラーキン係数
g_data(0:im) :real(8), intent(IN)
: (in) 格子点データ

チェビシェフ−ガラーキン法 ディリクレ・ノイマン混合境界条件

格子点データ -> ガラーキン係数変換(1次元データ)

Original external subprogram is at_af_galerkin_MM#f_g

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

   と計算される.

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

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

Original external subprogram is wt_module#nmz_PoloidalEnergySpectrum_wt

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

Original external subprogram is wt_module#nmz_ToroidalEnergySpectrum_wt

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

   と計算される.

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

Original external subprogram is wt_module#nz_PoloidalEnergySpectrum_wt

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

p_DRad_p( p_data ) result(p_Dx_p)
Function :
p_Dx_p(ks:km) :real(8)
p_data(ks:km) :real(8), intent(IN)

チェビシェフ−ガラーキン法 片端ディリクレ片端ノイマン境界条件

X 微分計算(1 次元)

Original external subprogram is at_ap_galerkin_DN#p_Dx_p

p_t( t_data ) result(p_t)
Function :
p_t(ks:km) :real(8)
: (out) ガラーキン係数
t_data(0:km) :real(8), intent(IN)
: (in) チェビシェフ係数

チェビシェフ−ガラーキン法 片端ディリクレ片端ノイマン境界条件

チェビシェフ係数 -> ガラーキン係数変換(1次元データ)

Original external subprogram is at_ap_galerkin_DN#p_t

p_z( g_data ) result(p_g)
Function :
p_g(ks:km) :real(8)
: (out) ガラーキン係数
g_data(0:im) :real(8), intent(IN)
: (in) 格子点データ

チェビシェフ−ガラーキン法 片端ディリクレ片端ノイマン境界条件

格子点データ -> ガラーキン係数変換(1次元データ)

Original external subprogram is at_ap_galerkin_DN#p_g

q_DRad_q( q_data ) result(q_Dx_q)
Function :
q_Dx_q(ks:km) :real(8)
q_data(ks:km) :real(8), intent(in)

チェビシェフ−ガラーキン法 非圧縮流体の流線関数・流れポテンシャル用

X 微分計算(1 次元)

Original external subprogram is at_aq_galerkin_RRFF#q_Dx_q

q_t( t_data ) result(q_t)
Function :
q_t(ks:km) :real(8)
: (out) ガラーキン係数
t_data(0:km) :real(8), intent(in)
: (in) チェビシェフ係数

チェビシェフ−ガラーキン法 非圧縮流体の流線関数・流れポテンシャル用

チェビシェフ係数 -> ガラーキン係数変換(1次元データ)

Original external subprogram is at_aq_galerkin_RRFF#q_t

q_z( g_data ) result(q_g)
Function :
q_g(ks:km) :real(8)
: (out) ガラーキン係数
g_data(0:im) :real(8), intent(in)
: (in) 格子点データ

チェビシェフ−ガラーキン法 非圧縮流体の流線関数・流れポテンシャル用

格子点データ -> ガラーキン係数変換(1次元データ)

Original external subprogram is at_aq_galerkin_RRFF#q_g

t_b( b_data ) result(t_b)
Function :
t_b(0:km) :real(8)
: (out) チェビシェフ係数
b_data(ks:km) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 片端ノイマン片端ディリクレ境界条件

ガラーキン係数 -> チェビシェフ係数変換(1次元データ)

Original external subprogram is at_ab_galerkin_ND#t_b

t_d( d_data ) result(t_d)
Function :
t_d(0:km) :real(8)
: (out) チェビシェフ係数
d_data(ks:km) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 両端ディリクレ境界条件

ガラーキン係数 -> チェビシェフ係数変換(1次元データ)

Original external subprogram is at_ad_galerkin_DD#t_d

t_f( f_data ) result(t_f)
Function :
t_f(0:km) :real(8)
: (out) チェビシェフ係数
f_data(ks:km) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 ディリクレ・ノイマン混合境界条件

ガラーキン係数 -> チェビシェフ係数変換(1次元データ)

Original external subprogram is at_af_galerkin_MM#t_f

t_p( p_data ) result(t_p)
Function :
t_p(0:km) :real(8)
: (out) チェビシェフ係数
p_data(ks:km) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 片端ディリクレ片端ノイマン境界条件

ガラーキン係数 -> チェビシェフ係数変換(1次元データ)

Original external subprogram is at_ap_galerkin_DN#t_p

t_q( q_data ) result(t_q)
Function :
t_q(0:km) :real(8)
: (out) チェビシェフ係数
q_data(ks:km) :real(8), intent(in)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 非圧縮流体の流線関数・流れポテンシャル用

ガラーキン係数 -> チェビシェフ係数変換(1次元データ)

Original external subprogram is at_aq_galerkin_RRFF#t_q

t_v( v_data ) result(t_v)
Function :
t_v(0:km) :real(8)
: (out) チェビシェフ係数
v_data(ks:km) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 両端ノイマン境界条件

ガラーキン係数 -> チェビシェフ係数変換(1次元データ)

Original external subprogram is at_av_galerkin_NN#t_v

v_DRad_v( v_data ) result(v_Dx_v)
Function :
v_Dx_v(ks:km) :real(8)
v_data(ks:km) :real(8), intent(IN)

チェビシェフ−ガラーキン法 両端ノイマン境界条件

X 微分計算(1 次元)

Original external subprogram is at_av_galerkin_NN#v_Dx_v

v_t( t_data ) result(v_t)
Function :
v_t(ks:km) :real(8)
: (out) ガラーキン係数
t_data(0:km) :real(8), intent(IN)
: (in) チェビシェフ係数

チェビシェフ−ガラーキン法 両端ノイマン境界条件

チェビシェフ係数 -> ガラーキン係数変換(1次元データ)

Original external subprogram is at_av_galerkin_NN#v_t

v_z( g_data ) result(v_g)
Function :
v_g(ks:km) :real(8)
: (out) ガラーキン係数
g_data(0:im) :real(8), intent(IN)
: (in) 格子点データ

チェビシェフ−ガラーキン法 両端ノイマン境界条件

格子点データ -> ガラーキン係数変換(1次元データ)

Original external subprogram is at_av_galerkin_NN#v_g

Function :
wb_DRad_wb((nm+1)**2,2:lm) :real(8)
: (out) 微分ガラーキン
wb((nm+1)**2,2:lm) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 上端ノイマン下端ディリクレ境界条件

動径微分計算(2 次元データ)

[Source]

    function wb_DRad_wb(wb)
      !
      ! チェビシェフ−ガラーキン法
      ! 上端ノイマン下端ディリクレ境界条件
      !
      ! 動径微分計算(2 次元データ)
      !
      real(8), intent(IN) :: wb((nm+1)**2,2:lm)         !(in) ガラーキン係数
      real(8)             :: wb_DRad_wb((nm+1)**2,2:lm) !(out) 微分ガラーキン

      wb_DRad_wb = wb_wt(wt_DRad_wt(wt_wb(wb)))

    end function wb_DRad_wb
Function :
wb_wt((nm+1)**2,2:lm) :real(8)
: (out) ガラーキン係数
wt((nm+1)**2,0:lm) :real(8), intent(IN)
: (in) チェビシェフデータ

チェビシェフ−ガラーキン法 上端ノイマン下端ディリクレ境界条件

動径チェビシェフ係数 -> 動径ガラーキン係数変換

[Source]

    function wb_wt(wt)
      !
      ! チェビシェフ−ガラーキン法
      ! 上端ノイマン下端ディリクレ境界条件
      !
      ! 動径チェビシェフ係数 -> 動径ガラーキン係数変換
      !
      real(8), intent(IN) :: wt((nm+1)**2,0:lm)       !(in)  チェビシェフデータ
      real(8)             :: wb_wt((nm+1)**2,2:lm)    !(out) ガラーキン係数

      wb_wt = ab_at(wt)

    end function wb_wt
Function :
wb_wz((nm+1)**2,2:lm) :real(8)
: (out) ガラーキン係数
wz((nm+1)**2,0:km) :real(8), intent(IN)
: (in) 格子点データ

チェビシェフ−ガラーキン法 上端ノイマン下端ディリクレ境界条件

動径格子点データ -> 動径ガラーキン係数変換

[Source]

    function wb_wz(wz)
      !
      ! チェビシェフ−ガラーキン法
      ! 上端ノイマン下端ディリクレ境界条件
      !
      ! 動径格子点データ -> 動径ガラーキン係数変換
      !

      real(8), intent(IN)  :: wz((nm+1)**2,0:km)       !(in)  格子点データ
      real(8)              :: wb_wz((nm+1)**2,2:lm)    !(out) ガラーキン係数

      wb_wz = ab_ag(wz)

    end function wb_wz
Function :
wd_DRad_wd((nm+1)**2,2:lm) :real(8)
: (out) 微分ガラーキン
wd((nm+1)**2,2:lm) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 両端ディリクレ境界条件

動径微分計算(2 次元データ)

[Source]

    function wd_DRad_wd(wd)
      !
      ! チェビシェフ−ガラーキン法
      ! 両端ディリクレ境界条件
      !
      ! 動径微分計算(2 次元データ)
      !
      real(8), intent(IN) :: wd((nm+1)**2,2:lm)         !(in) ガラーキン係数
      real(8)             :: wd_DRad_wd((nm+1)**2,2:lm) !(out) 微分ガラーキン

      wd_DRad_wd = wd_wt(wt_DRad_wt(wt_wd(wd)))

    end function wd_DRad_wd
Function :
wd_wt((nm+1)**2,2:lm) :real(8)
: (out) ガラーキン係数
wt((nm+1)**2,0:lm) :real(8), intent(IN)
: (in) チェビシェフデータ

チェビシェフ−ガラーキン法 両端ディリクレ境界条件

動径チェビシェフ係数 -> 動径ガラーキン係数変換

[Source]

    function wd_wt(wt)
      !
      ! チェビシェフ−ガラーキン法
      ! 両端ディリクレ境界条件
      !
      ! 動径チェビシェフ係数 -> 動径ガラーキン係数変換
      !
      real(8), intent(IN) :: wt((nm+1)**2,0:lm)       !(in)  チェビシェフデータ
      real(8)             :: wd_wt((nm+1)**2,2:lm)    !(out) ガラーキン係数

      wd_wt = ad_at(wt)

    end function wd_wt
Function :
wd_wz((nm+1)**2,2:lm) :real(8)
: (out) ガラーキン係数
wz((nm+1)**2,0:km) :real(8), intent(IN)
: (in) 格子点データ

チェビシェフ−ガラーキン法 両端ディリクレ境界条件

動径格子点データ -> 動径ガラーキン係数変換

[Source]

    function wd_wz(wz)
      !
      ! チェビシェフ−ガラーキン法
      ! 両端ディリクレ境界条件
      !
      ! 動径格子点データ -> 動径ガラーキン係数変換
      !

      real(8), intent(IN)  :: wz((nm+1)**2,0:km)       !(in)  格子点データ
      real(8)              :: wd_wz((nm+1)**2,2:lm)    !(out) ガラーキン係数

      wd_wz = ad_ag(wz)

    end function wd_wz
Function :
wf_DRad_wf((nm+1)**2,2:lm) :real(8)
: (out) 微分ガラーキン
wf((nm+1)**2,2:lm) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 ディリクレノイマン混合型境界条件

動径微分計算(2 次元データ)

[Source]

    function wf_DRad_wf(wf)
      !
      ! チェビシェフ−ガラーキン法
      ! ディリクレノイマン混合型境界条件
      !
      ! 動径微分計算(2 次元データ)
      !
      real(8), intent(IN) :: wf((nm+1)**2,2:lm)         !(in) ガラーキン係数
      real(8)             :: wf_DRad_wf((nm+1)**2,2:lm) !(out) 微分ガラーキン

      wf_DRad_wf = wf_wt(wt_DRad_wt(wt_wf(wf)))

    end function wf_DRad_wf
Function :
wf_wt((nm+1)**2,2:lm) :real(8)
: (out) ガラーキン係数
wt((nm+1)**2,0:lm) :real(8), intent(IN)
: (in) チェビシェフデータ

チェビシェフ−ガラーキン法 ディリクレノイマン混合型境界条件

動径チェビシェフ係数 -> 動径ガラーキン係数変換

[Source]

    function wf_wt(wt)
      !
      ! チェビシェフ−ガラーキン法
      ! ディリクレノイマン混合型境界条件
      !
      ! 動径チェビシェフ係数 -> 動径ガラーキン係数変換
      !
      real(8), intent(IN) :: wt((nm+1)**2,0:lm)       !(in)  チェビシェフデータ
      real(8)             :: wf_wt((nm+1)**2,2:lm)    !(out) ガラーキン係数

      wf_wt = af_at(wt)

    end function wf_wt
Function :
wf_wz((nm+1)**2,2:lm) :real(8)
: (out) ガラーキン係数
wz((nm+1)**2,0:km) :real(8), intent(IN)
: (in) 格子点データ

チェビシェフ−ガラーキン法 ディリクレノイマン混合型境界条件

動径格子点データ -> 動径ガラーキン係数変換

[Source]

    function wf_wz(wz)
      !
      ! チェビシェフ−ガラーキン法
      ! ディリクレノイマン混合型境界条件
      !
      ! 動径格子点データ -> 動径ガラーキン係数変換
      !

      real(8), intent(IN)  :: wz((nm+1)**2,0:km)       !(in)  格子点データ
      real(8)              :: wf_wz((nm+1)**2,2:lm)    !(out) ガラーキン係数

      wf_wz = af_ag(wz)

    end function wf_wz
Function :
wh_DRad_wh((nm+1)**2,2:lm) :real(8)
: (out) 微分ガラーキン
wh((nm+1)**2,2:lm) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 ディリクレ・ノイマン混合境界条件(可変係数)

動径微分計算

[Source]

    function wh_DRad_wh(wh)
      !
      ! チェビシェフ−ガラーキン法
      ! ディリクレ・ノイマン混合境界条件(可変係数)
      !
      ! 動径微分計算
      !
      real(8), intent(IN) :: wh((nm+1)**2,2:lm)         !(in) ガラーキン係数
      real(8)             :: wh_DRad_wh((nm+1)**2,2:lm) !(out) 微分ガラーキン

      wh_DRad_wh = wh_wt(wt_DRad_wt(wt_wh(wh)))

    end function wh_DRad_wh
Function :
wh_wt((nm+1)**2,2:lm) :real(8)
: (out) ガラーキン係数
wt((nm+1)**2,0:lm) :real(8), intent(IN)
: (in) チェビシェフデータ

チェビシェフ−ガラーキン法 ディリクレ・ノイマン混合境界条件(可変係数)境界条件

動径チェビシェフ係数 -> 動径ガラーキン係数変換

[Source]

    function wh_wt(wt)
      !
      ! チェビシェフ−ガラーキン法
      ! ディリクレ・ノイマン混合境界条件(可変係数)境界条件
      !
      ! 動径チェビシェフ係数 -> 動径ガラーキン係数変換
      !
      real(8), intent(IN) :: wt((nm+1)**2,0:lm)       !(in)  チェビシェフデータ
      real(8)             :: wh_wt((nm+1)**2,2:lm)    !(out) ガラーキン係数

      wh_wt = ah_at(wt)

    end function wh_wt
Function :
wh_wz((nm+1)**2,2:lm) :real(8)
: (out) ガラーキン係数
wz((nm+1)**2,0:km) :real(8), intent(IN)
: (in) 格子点データ

チェビシェフ−ガラーキン法 ディリクレ・ノイマン混合境界条件(可変係数)

動径格子点データ -> 動径ガラーキン係数変換

[Source]

    function wh_wz(wz)
      !
      ! チェビシェフ−ガラーキン法
      ! ディリクレ・ノイマン混合境界条件(可変係数)
      !
      ! 動径格子点データ -> 動径ガラーキン係数変換
      !

      real(8), intent(IN)  :: wz((nm+1)**2,0:km)       !(in)  格子点データ
      real(8)              :: wh_wz((nm+1)**2,2:lm)    !(out) ガラーキン係数

      wh_wz = ah_ag(wz)

    end function wh_wz
Function :
wp_DRad_wp((nm+1)**2,2:lm) :real(8)
: (out) 微分ガラーキン
wp((nm+1)**2,2:lm) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 上端ディリクレ下端ノイマン境界条件

動径微分計算(2 次元データ)

[Source]

    function wp_DRad_wp(wp)
      !
      ! チェビシェフ−ガラーキン法
      ! 上端ディリクレ下端ノイマン境界条件
      !
      ! 動径微分計算(2 次元データ)
      !
      real(8), intent(IN) :: wp((nm+1)**2,2:lm)         !(in) ガラーキン係数
      real(8)             :: wp_DRad_wp((nm+1)**2,2:lm) !(out) 微分ガラーキン

      wp_DRad_wp = wp_wt(wt_DRad_wt(wt_wp(wp)))

    end function wp_DRad_wp
Function :
wp_wt((nm+1)**2,2:lm) :real(8)
: (out) ガラーキン係数
wt((nm+1)**2,0:lm) :real(8), intent(IN)
: (in) チェビシェフデータ

チェビシェフ−ガラーキン法 上端ディリクレ下端ノイマン境界条件

動径チェビシェフ係数 -> 動径ガラーキン係数変換

[Source]

    function wp_wt(wt)
      !
      ! チェビシェフ−ガラーキン法
      ! 上端ディリクレ下端ノイマン境界条件
      !
      ! 動径チェビシェフ係数 -> 動径ガラーキン係数変換
      !
      real(8), intent(IN) :: wt((nm+1)**2,0:lm)       !(in)  チェビシェフデータ
      real(8)             :: wp_wt((nm+1)**2,2:lm)    !(out) ガラーキン係数

      wp_wt = ap_at(wt)

    end function wp_wt
Function :
wp_wz((nm+1)**2,2:lm) :real(8)
: (out) ガラーキン係数
wz((nm+1)**2,0:km) :real(8), intent(IN)
: (in) 格子点データ

チェビシェフ−ガラーキン法 上端ディリクレ下端ノイマン境界条件

動径格子点データ -> 動径ガラーキン係数変換

[Source]

    function wp_wz(wz)
      !
      ! チェビシェフ−ガラーキン法
      ! 上端ディリクレ下端ノイマン境界条件
      !
      ! 動径格子点データ -> 動径ガラーキン係数変換
      !

      real(8), intent(IN)  :: wz((nm+1)**2,0:km)       !(in)  格子点データ
      real(8)              :: wp_wz((nm+1)**2,2:lm)    !(out) ガラーキン係数

      wp_wz = ap_ag(wz)

    end function wp_wz
Function :
wq_DRad_wq((nm+1)**2,4:lm) :real(8)
: (out) 微分ガラーキン
wq((nm+1)**2,4:lm) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 非圧縮流体の流線関数・流れポテンシャル用境界条件

X 微分計算(2 次元データ)

[Source]

    function wq_DRad_wq(wq)
      !
      ! チェビシェフ−ガラーキン法
      ! 非圧縮流体の流線関数・流れポテンシャル用境界条件
      !
      ! X 微分計算(2 次元データ)
      !
      real(8), intent(IN) :: wq((nm+1)**2,4:lm)         !(in) ガラーキン係数
      real(8)             :: wq_DRad_wq((nm+1)**2,4:lm) !(out) 微分ガラーキン

      wq_DRad_wq = wq_wt(wt_DRad_wt(wt_wq(wq)))

    end function wq_DRad_wq
Function :
wq_LaplaPol2Pol_wt((nm+1)*(nm+1),4:lm) :real(8)
: (out) ポロイダル速度場ポテンシャル φ
wt_LaplaPolvel((nm+1)*(nm+1),0:lm) :real(8), intent(IN)
: (in) ポロイダル速度場ポテンシャルのラプラシアン ▽^2φ
 3 次元球殻領域
 球面調和函数展開 + チェビシェフ−ガラーキン法

 ポロイダル速度場ポテンシャル φを ▽^2φ から求める

[Source]

    function wq_LaplaPol2Pol_wt(wt_LaplaPolvel)
      !
      !  3 次元球殻領域
      !  球面調和函数展開 + チェビシェフ−ガラーキン法
      !
      !  ポロイダル速度場ポテンシャル φを ▽^2φ から求める
      !
      real(8), intent(IN) :: wt_LaplaPolvel((nm+1)*(nm+1),0:lm)
        !(in) ポロイダル速度場ポテンシャルのラプラシアン ▽^2φ
      real(8)             :: wq_LaplaPol2Pol_wt((nm+1)*(nm+1),4:lm) 
        !(out) ポロイダル速度場ポテンシャル φ

      real(8), allocatable :: LaplaMT(:,:,:)
      real(8), allocatable :: LaplaInvMT(:,:,:)
      integer, allocatable :: kpvot(:,:)

      integer, parameter :: ls=4

      real(8) :: wq_work((nm+1)*(nm+1),ls:lm)
      real(8) :: wt_work((nm+1)*(nm+1),0:lm)

      integer :: k, m, n, l, p
      logical :: first = .true.
      save LaplaInvMT, kpvot, first

      if ( .not. Set_RRFF ) call MessageNotify('E','wq_LaplaPol2Pol_wt', 'at_aq_galerkin_RRFF_module not initialized.')

      if ( first ) then
         first = .false.
         allocate(LaplaMT((nm+1)*(nm+1),0:lm,0:lm))
         allocate(LaplaInvMT((nm+1)*(nm+1),ls:lm,ls:lm))
         allocate(kpvot((nm+1)*(nm+1),ls:lm))

         LaplaMT=0.0D0
         do l=0,lm
            wt_work = 0.0D0 
             wt_work(:,l) = 1.0D0
            wt_work = wt_Lapla_wt(wt_work)
            LaplaMT(:,:,l) = wt_work
         enddo

         LaplaInvMT=0.0D0
         do n=ls,lm
            do m=ls,lm
               do l=0,lm
                  do p=0,lm
                     LaplaInvMT(:,n,m)=LaplaInvMT(:,n,m) +TQ(l,n)*LaplaMT(:,l,p)*alpha(p)*TQ(p,m)
                  enddo
               enddo
            enddo
         enddo

         call LUDecomp(LaplaInvMT,kpvot)
         deallocate(LaplaMT)
      endif

      wq_work=0.0D0
      do m=ls,lm
         do k=0,lm
            wq_work(:,m)=wq_work(:,m) + alpha(k) * beta(k) * wt_LaplaPolvel(:,k)* TQ(k,m) 
         enddo
      enddo

      wq_LaplaPol2Pol_wt = LUSolve(LaplaInvMT,kpvot,wq_work)

    end function wq_LaplaPol2Pol_wt
Function :
wq_wt((nm+1)**2,4:lm) :real(8)
: (out) ガラーキン係数
wt((nm+1)**2,0:lm) :real(8), intent(IN)
: (in) チェビシェフデータ

チェビシェフ−ガラーキン法 非圧縮流体の流線関数・流れポテンシャル用境界条件

動径チェビシェフ係数 -> 動径ガラーキン係数変換

[Source]

    function wq_wt(wt)
      !
      ! チェビシェフ−ガラーキン法
      ! 非圧縮流体の流線関数・流れポテンシャル用境界条件
      !
      ! 動径チェビシェフ係数 -> 動径ガラーキン係数変換
      !
      real(8), intent(IN) :: wt((nm+1)**2,0:lm)       !(in)  チェビシェフデータ
      real(8)             :: wq_wt((nm+1)**2,4:lm)    !(out) ガラーキン係数

      wq_wt = aq_at(wt)

    end function wq_wt
Function :
wq_wz((nm+1)**2,4:lm) :real(8)
: (out) ガラーキン係数
wz((nm+1)**2,0:km) :real(8), intent(IN)
: (in) 格子点データ

チェビシェフ−ガラーキン法 非圧縮流体の流線関数・流れポテンシャル用境界条件

動径格子点データ -> 動径ガラーキン係数変換

[Source]

    function wq_wz(wz)
      !
      ! チェビシェフ−ガラーキン法
      ! 非圧縮流体の流線関数・流れポテンシャル用境界条件
      !
      ! 動径格子点データ -> 動径ガラーキン係数変換
      !

      real(8), intent(IN)  :: wz((nm+1)**2,0:km)       !(in)  格子点データ
      real(8)              :: wq_wz((nm+1)**2,4:lm)    !(out) ガラーキン係数

      wq_wz = aq_ag(wz)

    end function wq_wz
wt_Boundaries( wt, [values], [cond] )
Subroutine :
wt :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
values :real(8), dimension((nm+1)*(nm+1),2), intent(in), optional
: (in) 境界での 値/勾配 分布を水平スペクトル変換したものを与える.
    省略時は値/勾配 0 となる.
cond :character(len=2), intent(in), optional
: (in) 境界条件. 省略時は ‘DD‘
       DD : 両端ディリクレ条件
       DN : 上端ディリクレ, 下端ノイマン条件
       ND : 上端ノイマン, 下端ディリクレ条件
       NN : 両端ノイマン条件

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

チェビシェフ空間において境界条件を満たすべく高次の係数を 定める方法をとっている(タウ法).

Original external subprogram is wt_module#wt_Boundaries

wt_BoundariesGrid( wt, [values], [cond] )
Subroutine :
wt :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
values :real(8), dimension((nm+1)*(nm+1),2), intent(in), optional
: (in) 境界での 値/勾配 分布を水平スペクトル変換したものを与える.
   省略時は値/勾配 0 となる.
cond :character(len=2), intent(in), optional
: (in) 境界条件. 省略時は ‘DD‘
       DD : 両端ディリクレ条件
       DN : 上端ディリクレ, 下端ノイマン条件
       ND : 上端ノイマン, 下端ディリクレ条件
       NN : 両端ノイマン条件

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

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法). このルーチンを用いるためには wt_Initial にて設定するチェビシェフ切断波数(lm)と鉛直格子点数(km)を 等しくしておく必要がある.

Original external subprogram is wt_module#wt_BoundariesGrid

wt_BoundariesTau( wt, [values], [cond] )
Subroutine :
wt :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
values :real(8), dimension((nm+1)*(nm+1),2), intent(in), optional
: (in) 境界での 値/勾配 分布を水平スペクトル変換したものを与える.
    省略時は値/勾配 0 となる.
cond :character(len=2), intent(in), optional
: (in) 境界条件. 省略時は ‘DD‘
       DD : 両端ディリクレ条件
       DN : 上端ディリクレ, 下端ノイマン条件
       ND : 上端ノイマン, 下端ディリクレ条件
       NN : 両端ノイマン条件

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

チェビシェフ空間において境界条件を満たすべく高次の係数を 定める方法をとっている(タウ法).

Original external subprogram is wt_module#wt_BoundariesTau

wt_DRad_wt( wt ) result(wt_DRad_wt)
Function :
wt_DRad_wt :real(8), dimension((nm+1)*(nm+1),0:lm)
: (in) 動径微分された2 次元球面調和函数チェビシェフスペクトルデータ
wt :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) 2 次元球面調和函数チェビシェフスペクトルデータ

入力スペクトルデータに動径微分 ∂/∂r を作用する.

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

Original external subprogram is wt_module#wt_DRad_wt

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

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

Original external subprogram is wt_module#wt_DivLat_xyz

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

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

Original external subprogram is wt_module#wt_DivLon_xyz

wt_DivRad_wt( wt ) result(wt_DivRad_wt)
Function :
wt_DivRad_wt :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) 発散型動径微分を作用された 2 次元スペクトルデータ
wt :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 wt_module#wt_DivRad_wt

wt_Div_xyz_xyz_xyz( xyz_Vlon, xyz_Vlat, xyz_Vrad ) result(wt_Div_xyz_xyz_xyz)
Function :
wt_Div_xyz_xyz_xyz :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) ベクトル場の発散
xyz_Vlon :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の経度成分
xyz_Vlat :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の緯度成分
xyz_Vrad :real(8), dimension(0:im-1,1:jm,0: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 wt_module#wt_Div_xyz_xyz_xyz

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

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

Original external subprogram is wt_module#wt_KxRGrad_wt

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

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

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

Original external subprogram is wt_module#wt_L2Inv_wt

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

wt_LaplaPol2PolGrid_wt( wt, [cond], [new] ) result(wt_LaplaPol2PolGrid_wt)
Function :
wt_LaplaPol2PolGrid_wt :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) 出力ポロイダルポテンシャル分布
wt :real(8), dimension((nm+1)*(nm+1),0:lm),intent(in)
: (in) 入力▽^2φ分布
cond :character(len=2), intent(in), optional
: (in) 境界条件スイッチ. 省略時は ‘RR‘
    RR    : 両端粘着条件
    RF    : 上端粘着, 下端応力なし条件
    FR    : 上端応力なし, 下端粘着条件
    FF    : 両端応力なし条件
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

速度ポロイダルポテンシャルΦを▽^2Φから計算する. チェビシェフ格子点空間で境界条件を適用している.

この関数を用いるためには wt_Initial にて設定する チェビシェフ切断波数(lm)と鉛直格子点数(km)を等しく しておく必要がある.

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

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

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

最終的にチェビシェフ係数の解が欲しい場合には, wz_LaplaPol2Pol_wz に 比べてチェビシェフ — 格子点変換が 1 回分少なくて済む.

Original external subprogram is wt_module#wt_LaplaPol2PolGrid_wt

wt_Lapla_wt( wt ) result(wt_Lapla_wt)
Function :
wt_Lapla_wt :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) ラプラシアンを作用された 2 次元スペクトルデータ
wt :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)

を作用する.

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

Original external subprogram is wt_module#wt_Lapla_wt

wt_PolMagBoundaries( wt_POL, [new] )
Subroutine :
wt_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
 * 内側境界 : dh/dr - nh/r = 0

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

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

Original external subprogram is wt_module#wt_PolMagBoundaries

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

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

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法). このルーチンを用いるためには wt_Initial にて設定するチェビシェフ切断波数(lm)と鉛直格子点数(km)を 等しくしておく必要がある.

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

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

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

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

Original external subprogram is wt_module#wt_PolmagBoundariesGrid

wt_PolmagBoundariesTau( wt_POL, [new] )
Subroutine :
wt_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
 * 内側境界 : dh/dr - nh/r = 0

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

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

Original external subprogram is wt_module#wt_PolmagBoundariesTau

wt_Potential2Rotation( xyz_RotVLON, xyz_RotVLAT, xyz_RotVRAD, wt_TORPOT, wt_POLPOT )
Subroutine :
xyz_RotVLON :real(8), dimension(0:im-1,1:jm,0:km), intent(OUT)
: (out) 回転の経度成分
xyz_RotVLAT :real(8), dimension(0:im-1,1:jm,0:km), intent(OUT)
: (out) 回転の緯度成分
xyz_RotVRAD :real(8), dimension(0:im-1,1:jm,0:km), intent(OUT)
: (out) 回転の動径成分
wt_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) トロイダルポテンシャル
wt_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 wt_module#wt_Potential2Rotation

wt_Potential2Vector( xyz_VLON, xyz_VLAT, xyz_VRAD, wt_TORPOT, wt_POLPOT )
Subroutine :
xyz_VLON :real(8), dimension(0:im-1,1:jm,0:km)
: (out) ベクトル場の経度成分
xyz_VLAT :real(8), dimension(0:im-1,1:jm,0:km)
: (out) ベクトル場の緯度成分
xyz_VRAD :real(8), dimension(0:im-1,1:jm,0:km)
: (out) ベクトル場の動径成分
wt_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) トロイダルポテンシャル
wt_POLPOT :real(8), dimension((nm+1)*(nm+1),0:lm), intent(in)
: (in) ポロイダルポテンシャル

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

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

の各成分を計算する

Original external subprogram is wt_module#wt_Potential2Vector

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

wt_RadRotRot_xyz_xyz_xyz( xyz_VLON, xyz_VLAT, xyz_VRAD ) result(wt_RadRotRot_xyz_xyz_xyz)
Function :
wt_RadRotRot_xyz_xyz_xyz :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) ベクトル v の r・(▽×▽×v)
xyz_VLON :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトルの経度成分
xyz_VLAT :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトルの緯度成分
xyz_VRAD :real(8), dimension(0:im-1,1:jm,0: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 wt_module#wt_RadRotRot_xyz_xyz_xyz

wt_RadRot_xyz_xyz( xyz_VLON, xyz_VLAT ) result(wt_RadRot_xyz_xyz)
Function :
wt_RadRot_xyz_xyz :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) ベクトルの渦度と動径ベクトルの内積
xyz_VLON :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトルの経度成分
xyz_VLAT :real(8), dimension(0:im-1,1:jm,0: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 wt_module#wt_RadRot_xyz_xyz

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

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

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

を作用する.

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

Original external subprogram is wt_module#wt_RotRad_wt

wt_RotRad_xyz_xyz( xyz_Vlat, xyz_Vlon ) result(wt_RotRad_xyz_xyz)
Function :
wt_RotRad_xyz_xyz :real(8), dimension((nm+1)*(nm+1),0:lm)
: (out) ベクトル場の回転の動径成分
xyz_Vlat :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の緯度成分
xyz_Vlon :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の経度成分

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

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

を計算する.

Original external subprogram is wt_module#wt_RotRad_xyz_xyz

wt_TorBoundaries( wt_TORPOT, [values], [cond], [new] )
Subroutine :
wt_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
values :real(8), dimension((nm+1)*(nm+1),2), intent(in), optional
: (in) 両端境界でのトロイダルポテンシャル
    粘着条件の時のみ有効
cond :character(len=2), intent(in), optional
: (in) 境界条件スイッチ. 省略時は ‘RR‘
    RR    : 両端粘着条件
    RF    : 上端粘着, 下端応力なし条件
    FR    : 上端応力なし, 下端粘着条件
    FF    : 両端応力なし条件
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

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

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

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

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

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

Original external subprogram is wt_module#wt_TorBoundaries

wt_TorBoundariesGrid( wt_TORPOT, [values], [cond], [new] )
Subroutine :
wt_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
values :real(8), dimension((nm+1)*(nm+1),2), intent(in), optional
: (in) 両端境界でのトロイダルポテンシャル
    粘着条件の時のみ有効
cond :character(len=2), intent(in), optional
: (in) 境界条件スイッチ. 省略時は ‘RR‘
    RR    : 両端粘着条件
    RF    : 上端粘着, 下端応力なし条件
    FR    : 上端応力なし, 下端粘着条件
    FF    : 両端応力なし条件
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

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

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法). このルーチンを用いるためには wt_Initial にて設定するチェビシェフ切断波数(lm)と鉛直格子点数(km)を 等しくしておく必要がある.

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

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

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

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

Original external subprogram is wt_module#wt_TorBoundariesGrid

wt_TorBoundariesTau( wt_TORPOT, [values], [cond], [new] )
Subroutine :
wt_TORPOT :real(8), dimension((nm+1)*(nm+1),0:lm),intent(inout)
: (inout) 境界条件を適用するデータ. 修正された値を返す.
values :real(8), dimension((nm+1)*(nm+1),2), intent(in), optional
: (in) 両端境界でのトロイダルポテンシャル
    粘着条件の時のみ有効
cond :character(len=2), intent(in), optional
: (in) 境界条件スイッチ. 省略時は ‘RR‘
    RR    : 両端粘着条件
    RF    : 上端粘着, 下端応力なし条件
    FR    : 上端応力なし, 下端粘着条件
    FF    : 両端応力なし条件
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

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

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

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

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

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

Original external subprogram is wt_module#wt_TorBoundariesTau

wt_TorMagBoundaries( wt_TOR, [new] )
Subroutine :
wt_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 wt_module#wt_TorMagBoundaries

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

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

鉛直実格子点空間において内部領域の値と境界条件を満たすように 条件を課している(選点法). このルーチンを用いるためには wt_Initial にて設定するチェビシェフ切断波数(lm)と鉛直格子点数(km)を 等しくしておく必要がある.

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

外側

   wt_psi = 0   at the outer boundary

内側

   wt_psi = 0       at the inner boundary

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

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

Original external subprogram is wt_module#wt_TormagBoundariesGrid

wt_TormagBoundariesTau( wt_TOR, [new] )
Subroutine :
wt_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 wt_module#wt_TormagBoundariesTau

wt_VGradV( xyz_VGRADV_LON, xyz_VGRADV_LAT, xyz_VGRADV_RAD, xyz_VLON, xyz_VLAT, xyz_VRAD )
Subroutine :
xyz_VGRADV_LON :real(8), dimension(0:im-1,1:jm,0:km),intent(out)
: (out) (v・▽v) 経度成分
xyz_VGRADV_LAT :real(8), dimension(0:im-1,1:jm,0:km),intent(out)
: (out) (v・▽v) 緯度成分
xyz_VGRADV_RAD :real(8), dimension(0:im-1,1:jm,0:km),intent(out)
: (out) (v・▽v) 動径成分
xyz_VLON :real(8), dimension(0:im-1,1:jm,0:km),intent(in)
: (in) ベクトル場 v の経度成分
xyz_VLAT :real(8), dimension(0:im-1,1:jm,0:km),intent(in)
: (in) ベクトル場 v の緯度成分
xyz_VRAD :real(8), dimension(0:im-1,1:jm,0:km),intent(in)
: (in) ベクトル場 v の動径成分

ベクトル場の v・▽v を計算する.

ベクトル場 v=(v[λ],v[φ],v[r]) に対するv・▽vの各成分は 次のように計算される.

  (v・▽v)[λ] = ▽・(v[λ]v) + v[λ]v[r]/r - v[λ]v[φ]tan(φ)/r
  (v・▽v)[φ] = ▽・(v[φ]v) + v[φ]v[r]/r - v[λ]^2tan(φ)/r
  (v・▽v)[r] = ▽・(v[r]v) + (v[λ]^2+v[φ]^2)/r

非発散速度場に対してはポテンシャルから wt_Potential2Rotation を 用いて回転を計算し, 恒等式 v・▽v = ▽(v[2^/2) - vx▽xv を 用いる方がよいだろう.

Original external subprogram is wt_module#wt_VGradV

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

Original external subprogram is wt_module#wt_VMiss

Subroutine :
i :integer,intent(in)
: 格子点の設定(経度, 緯度, 動径)
j :integer,intent(in)
: 格子点の設定(経度, 緯度, 動径)
k :integer,intent(in)
: 格子点の設定(経度, 緯度, 動径)
n :integer,intent(in)
: 切断波数の設定(水平, 動径)
l :integer,intent(in)
: 切断波数の設定(水平, 動径)
r_in :real(8),intent(in)
: 球殻内外半径
r_out :real(8),intent(in)
: 球殻内外半径
DD :logical,intent(in),optional
: モジュール読み込みスイッチ
NN :logical,intent(in),optional
: モジュール読み込みスイッチ
DN :logical,intent(in),optional
: モジュール読み込みスイッチ
ND :logical,intent(in),optional
: モジュール読み込みスイッチ
velBC :character(LEN=2),intent(in),optional
: 境界条件(RR/FF/RF/FR)
MM_cfdx0_ri :real(8),intent(in),optional
: (0階微分@x=xmin)
MM_cfdx1_ri :real(8),intent(In),optional
: (1階微分@x=xmin)
MM_cfdx0_ro :real(8),intent(in),optional
: (0階微分@x=xmax)
MM_cfdx1_ro :real(8),intent(in),optional
: (1階微分@x=xmax)
MMex_cfdx0_ri((n+1)*(n+1)) :real(8),intent(in),optional
: (0階微分@r=ri)
MMex_cfdx1_ri((n+1)*(n+1)) :real(8),intent(in),optional
: (1階微分@r=ri)
MMex_cfdx0_ro((n+1)*(n+1)) :real(8),intent(in),optional
: (0階微分@r=ro)
MMex_cfdx1_ro((n+1)*(n+1)) :real(8),intent(in),optional
: (1階微分@r=ro)
np :integer,intent(in),optional
: OPENMP での最大スレッド数
 3 次元球殻領域
 球面調和函数展開 + チェビシェフ−ガラーキン法

 初期化サブルーチン

[Source]

    subroutine wt_galerkin_Initial(i,j,k,n,l,r_in,r_out, DD,NN,DN,ND,velBC, MM_cfdx0_ri, MM_cfdx1_ri, MM_cfdx0_ro, MM_cfdx1_ro, MMex_cfdx0_ri, MMex_cfdx1_ri, MMex_cfdx0_ro, MMex_cfdx1_ro, np)
      !
      !  3 次元球殻領域
      !  球面調和函数展開 + チェビシェフ−ガラーキン法
      !
      !  初期化サブルーチン
      !
      integer,intent(in) :: i, j, k        ! 格子点の設定(経度, 緯度, 動径)
      integer,intent(in) :: n, l           ! 切断波数の設定(水平, 動径)
      integer,intent(in),optional :: np    ! OPENMP での最大スレッド数

      real(8),intent(in) :: r_in, r_out    ! 球殻内外半径

      logical,intent(in),optional :: DD  ! モジュール読み込みスイッチ
      logical,intent(in),optional :: NN  ! モジュール読み込みスイッチ
      logical,intent(in),optional :: DN  ! モジュール読み込みスイッチ
      logical,intent(in),optional :: ND  ! モジュール読み込みスイッチ

      ! at_af_galerkin_MM_module 境界条件係数
      real(8),intent(in),optional :: MM_cfdx0_ri ! (0階微分@x=xmin)
      real(8),intent(In),optional :: MM_cfdx1_ri ! (1階微分@x=xmin)
      real(8),intent(in),optional :: MM_cfdx0_ro ! (0階微分@x=xmax)
      real(8),intent(in),optional :: MM_cfdx1_ro ! (1階微分@x=xmax)

      ! at_ah_galerkin_MMex_module 境界条件係数
      real(8),intent(in),optional :: MMex_cfdx0_ri((n+1)*(n+1)) ! (0階微分@r=ri)
      real(8),intent(in),optional :: MMex_cfdx1_ri((n+1)*(n+1)) ! (1階微分@r=ri)
      real(8),intent(in),optional :: MMex_cfdx0_ro((n+1)*(n+1)) ! (0階微分@r=ro)
      real(8),intent(in),optional :: MMex_cfdx1_ro((n+1)*(n+1)) ! (1階微分@r=ro)

      ! at_aq_galerkin_RRFF_module 速度場境界条件
      character(LEN=2),intent(in),optional :: velBC  ! 境界条件(RR/FF/RF/FR)

      !--------------- 引数処理 -----------------
      im=i 
       jm = j 
       km=k 
       nm=n 
       lm=l

      if ( present(DD) ) Set_DD = DD
      if ( present(NN) ) Set_NN = NN
      if ( present(DN) ) Set_DN = DN
      if ( present(ND) ) Set_ND = ND

      if ( present(MM_cfdx0_ri) .AND.present(MM_cfdx1_ri) .AND. present(MM_cfdx0_ro) .AND.present(MM_cfdx1_ro) ) Set_MM=.true.

      if ( present(MMex_cfdx0_ri) .AND.present(MMex_cfdx1_ri) .AND. present(MMex_cfdx0_ro) .AND.present(MMex_cfdx1_ro) ) Set_MMex=.true.

      if ( present(velBC) ) Set_RRFF = .true.

      !--------------- モジュール初期化 -----------------
      if ( present(np) ) then
        call wt_Initial(i,j,k,n,l,r_in,r_out, np)
      else
        call wt_Initial(i,j,k,n,l,r_in,r_out)
      endif

      if ( Set_DD ) call at_ad_galerkin_DD_Initial(km,lm)
      if ( Set_NN ) call at_av_galerkin_NN_Initial(km,lm)
      if ( Set_DN ) call at_ap_galerkin_DN_Initial(km,lm)
      if ( Set_ND ) call at_ab_galerkin_ND_Initial(km,lm)
      if ( Set_MM ) call at_af_galerkin_MM_Initial (km,lm, MM_cfdx0_ro, MM_cfdx1_ro, MM_cfdx0_ri, MM_cfdx1_ri   )
      if ( Set_MMex ) call at_ah_galerkin_MMex_Initial (km,lm,(nm+1)*(nm+1), MMex_cfdx0_ro, MMex_cfdx1_ro, MMex_cfdx0_ri, MMex_cfdx1_ri   )

      if ( Set_RRFF ) call at_aq_galerkin_RRFF_Initial(km,lm,velBC)

      call MessageNotify('M','wt_galerkin_initial','wt_galerkin_module (2013/08/24) is initialized')
    end subroutine wt_galerkin_initial
Function :
wt_wb((nm+1)**2,0:lm) :real(8)
wb((nm+1)**2,2:lm) :real(8), intent(IN)

チェビシェフ−ガラーキン法 上端ノイマン下端ディリクレ境界条件

動径ガラーキン係数変換 -> 動径チェビシェフ係数

[Source]

    function wt_wb(wb)
      !
      ! チェビシェフ−ガラーキン法
      ! 上端ノイマン下端ディリクレ境界条件
      !
      ! 動径ガラーキン係数変換 -> 動径チェビシェフ係数
      !
      real(8), intent(IN) :: wb((nm+1)**2,2:lm)
      real(8)             :: wt_wb((nm+1)**2,0:lm)

      wt_wb = at_ab(wb)

    end function wt_wb
Function :
wt_wd((nm+1)**2,0:lm) :real(8)
wd((nm+1)**2,2:lm) :real(8), intent(IN)

チェビシェフ−ガラーキン法 両端ディリクレ境界条件

動径ガラーキン係数変換 -> 動径チェビシェフ係数

[Source]

    function wt_wd(wd)
      !
      ! チェビシェフ−ガラーキン法
      ! 両端ディリクレ境界条件
      !
      ! 動径ガラーキン係数変換 -> 動径チェビシェフ係数
      !
      real(8), intent(IN) :: wd((nm+1)**2,2:lm)
      real(8)             :: wt_wd((nm+1)**2,0:lm)

      wt_wd = at_ad(wd)

    end function wt_wd
Function :
wt_wf((nm+1)**2,0:lm) :real(8)
wf((nm+1)**2,2:lm) :real(8), intent(IN)

チェビシェフ−ガラーキン法 ディリクレノイマン混合型境界条件

動径ガラーキン係数変換 -> 動径チェビシェフ係数

[Source]

    function wt_wf(wf)
      !
      ! チェビシェフ−ガラーキン法
      ! ディリクレノイマン混合型境界条件
      !
      ! 動径ガラーキン係数変換 -> 動径チェビシェフ係数
      !
      real(8), intent(IN) :: wf((nm+1)**2,2:lm)
      real(8)             :: wt_wf((nm+1)**2,0:lm)

      wt_wf = at_af(wf)

    end function wt_wf
Function :
wt_wh((nm+1)**2,0:lm) :real(8)
wh((nm+1)**2,2:lm) :real(8), intent(IN)

チェビシェフ−ガラーキン法 ディリクレ・ノイマン混合境界条件(可変係数)

動径ガラーキン係数変換 -> 動径チェビシェフ係数

[Source]

    function wt_wh(wh)
      !
      ! チェビシェフ−ガラーキン法
      ! ディリクレ・ノイマン混合境界条件(可変係数)
      !
      ! 動径ガラーキン係数変換 -> 動径チェビシェフ係数
      !
      real(8), intent(IN) :: wh((nm+1)**2,2:lm)
      real(8)             :: wt_wh((nm+1)**2,0:lm)

      wt_wh = at_ah(wh)

    end function wt_wh
Function :
wt_wp((nm+1)**2,0:lm) :real(8)
wp((nm+1)**2,2:lm) :real(8), intent(IN)

チェビシェフ−ガラーキン法 上端ディリクレ下端ノイマン境界条件

動径ガラーキン係数変換 -> 動径チェビシェフ係数

[Source]

    function wt_wp(wp)
      !
      ! チェビシェフ−ガラーキン法
      ! 上端ディリクレ下端ノイマン境界条件
      !
      ! 動径ガラーキン係数変換 -> 動径チェビシェフ係数
      !
      real(8), intent(IN) :: wp((nm+1)**2,2:lm)
      real(8)             :: wt_wp((nm+1)**2,0:lm)

      wt_wp = at_ap(wp)

    end function wt_wp
Function :
wt_wq((nm+1)**2,0:lm) :real(8)
wq((nm+1)**2,4:lm) :real(8), intent(IN)

チェビシェフ−ガラーキン法 非圧縮流体の流線関数・流れポテンシャル用境界条件

動径ガラーキン係数変換 -> 動径チェビシェフ係数

[Source]

    function wt_wq(wq)
      !
      ! チェビシェフ−ガラーキン法
      ! 非圧縮流体の流線関数・流れポテンシャル用境界条件
      !
      ! 動径ガラーキン係数変換 -> 動径チェビシェフ係数
      !
      real(8), intent(IN) :: wq((nm+1)**2,4:lm)
      real(8)             :: wt_wq((nm+1)**2,0:lm)

      wt_wq = at_aq(wq)

    end function wt_wq
Function :
wt_wv((nm+1)**2,0:lm) :real(8)
wv((nm+1)**2,2:lm) :real(8), intent(IN)

チェビシェフ−ガラーキン法 両端ノイマン境界条件

動径ガラーキン係数変換 -> 動径チェビシェフ係数

[Source]

    function wt_wv(wv)
      !
      ! チェビシェフ−ガラーキン法
      ! 両端ノイマン境界条件
      !
      ! 動径ガラーキン係数変換 -> 動径チェビシェフ係数
      !
      real(8), intent(IN) :: wv((nm+1)**2,2:lm)
      real(8)             :: wt_wv((nm+1)**2,0:lm)

      wt_wv = at_av(wv)

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

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

Original external subprogram is wt_module#wt_wz

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

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

Original external subprogram is wt_module#wt_xyz

Function :
wv_DRad_wv((nm+1)**2,2:lm) :real(8)
: (out) 微分ガラーキン
wv((nm+1)**2,2:lm) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 両端ノイマン境界条件

動径微分計算(2 次元データ)

[Source]

    function wv_DRad_wv(wv)
      !
      ! チェビシェフ−ガラーキン法
      ! 両端ノイマン境界条件
      !
      ! 動径微分計算(2 次元データ)
      !
      real(8), intent(IN) :: wv((nm+1)**2,2:lm)         !(in) ガラーキン係数
      real(8)             :: wv_DRad_wv((nm+1)**2,2:lm) !(out) 微分ガラーキン

      wv_DRad_wv = wv_wt(wt_DRad_wt(wt_wv(wv)))

    end function wv_DRad_wv
Function :
wv_wt((nm+1)**2,2:lm) :real(8)
: (out) ガラーキン係数
wt((nm+1)**2,0:lm) :real(8), intent(IN)
: (in) チェビシェフデータ

チェビシェフ−ガラーキン法 両端ノイマン境界条件

動径チェビシェフ係数 -> 動径ガラーキン係数変換

[Source]

    function wv_wt(wt)
      !
      ! チェビシェフ−ガラーキン法
      ! 両端ノイマン境界条件
      !
      ! 動径チェビシェフ係数 -> 動径ガラーキン係数変換
      !
      real(8), intent(IN) :: wt((nm+1)**2,0:lm)       !(in)  チェビシェフデータ
      real(8)             :: wv_wt((nm+1)**2,2:lm)    !(out) ガラーキン係数

      wv_wt = av_at(wt)

    end function wv_wt
Function :
wv_wz((nm+1)**2,2:lm) :real(8)
: (out) ガラーキン係数
wz((nm+1)**2,0:km) :real(8), intent(IN)
: (in) 格子点データ

チェビシェフ−ガラーキン法 両端ノイマン境界条件

動径格子点データ -> 動径ガラーキン係数変換

[Source]

    function wv_wz(wz)
      !
      ! チェビシェフ−ガラーキン法
      ! 両端ノイマン境界条件
      !
      ! 動径格子点データ -> 動径ガラーキン係数変換
      !

      real(8), intent(IN)  :: wz((nm+1)**2,0:km)       !(in)  格子点データ
      real(8)              :: wv_wz((nm+1)**2,2:lm)    !(out) ガラーキン係数

      wv_wz = av_ag(wz)

    end function wv_wz
wz_LaplaPol2Pol_wz( wz, [cond], [new] ) result(wz_LaplaPol2Pol_wz)
Function :
wz_LaplaPol2Pol_wz :real(8), dimension((nm+1)*(nm+1),0:km)
: (out) 出力ポロイダルポテンシャル分布
wz :real(8), dimension((nm+1)*(nm+1),0:km),intent(in)
: (in) 入力▽^2φ分布
cond :character(len=2), intent(in), optional
: (in) 境界条件スイッチ. 省略時は ‘RR‘
    RR    : 両端粘着条件
    RF    : 上端粘着, 下端応力なし条件
    FR    : 上端応力なし, 下端粘着条件
    FF    : 両端応力なし条件
new :logical, intent(IN), optional
: (in) true だと境界条件計算用行列を強制的に新たに作る.
    default は false.

速度ポロイダルポテンシャルΦを▽^2Φから計算する.

チェビシェフ格子点空間で境界条件を適用している. この関数を用いるためには wt_Initial にて設定する チェビシェフ切断波数(lm)と鉛直格子点数(km)を等しく しておく必要がある.

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

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

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

Original external subprogram is wt_module#wz_LaplaPol2Pol_wz

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

Original external subprogram is wt_module#wz_RAD

Function :
wz_wb((nm+1)**2,0:km) :real(8)
: (out) 格子点データ
wb((nm+1)**2,2:lm) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 上端ノイマン下端ディリクレ境界条件

動径ガラーキン係数変換 -> 動径格子点データ

[Source]

    function wz_wb(wb)
      !
      ! チェビシェフ−ガラーキン法
      ! 上端ノイマン下端ディリクレ境界条件
      !
      ! 動径ガラーキン係数変換 -> 動径格子点データ
      !

      real(8), intent(IN) :: wb((nm+1)**2,2:lm)        !(in) ガラーキン係数
      real(8)             :: wz_wb((nm+1)**2,0:km)     !(out)  格子点データ

      wz_wb = ag_ab(wb)

    end function wz_wb
Function :
wz_wd((nm+1)**2,0:km) :real(8)
: (out) 格子点データ
wd((nm+1)**2,2:lm) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 両端ディリクレ境界条件

動径ガラーキン係数変換 -> 動径格子点データ

[Source]

    function wz_wd(wd)
      !
      ! チェビシェフ−ガラーキン法
      ! 両端ディリクレ境界条件
      !
      ! 動径ガラーキン係数変換 -> 動径格子点データ
      !

      real(8), intent(IN) :: wd((nm+1)**2,2:lm)        !(in) ガラーキン係数
      real(8)             :: wz_wd((nm+1)**2,0:km)     !(out)  格子点データ

      wz_wd = ag_ad(wd)

    end function wz_wd
Function :
wz_wf((nm+1)**2,0:km) :real(8)
: (out) 格子点データ
wf((nm+1)**2,2:lm) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 ディリクレノイマン混合型境界条件

動径ガラーキン係数変換 -> 動径格子点データ

[Source]

    function wz_wf(wf)
      !
      ! チェビシェフ−ガラーキン法
      ! ディリクレノイマン混合型境界条件
      !
      ! 動径ガラーキン係数変換 -> 動径格子点データ
      !

      real(8), intent(IN) :: wf((nm+1)**2,2:lm)        !(in) ガラーキン係数
      real(8)             :: wz_wf((nm+1)**2,0:km)     !(out)  格子点データ

      wz_wf = ag_af(wf)

    end function wz_wf
Function :
wz_wh((nm+1)**2,0:km) :real(8)
: (out) 格子点データ
wh((nm+1)**2,2:lm) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 ディリクレ・ノイマン混合境界条件(可変係数)

動径ガラーキン係数変換 -> 動径格子点データ

[Source]

    function wz_wh(wh)
      !
      ! チェビシェフ−ガラーキン法
      ! ディリクレ・ノイマン混合境界条件(可変係数)
      !
      ! 動径ガラーキン係数変換 -> 動径格子点データ
      !

      real(8), intent(IN) :: wh((nm+1)**2,2:lm)        !(in) ガラーキン係数
      real(8)             :: wz_wh((nm+1)**2,0:km)     !(out)  格子点データ

      wz_wh = ag_ah(wh)

    end function wz_wh
Function :
wz_wp((nm+1)**2,0:km) :real(8)
: (out) 格子点データ
wp((nm+1)**2,2:lm) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 上端ディリクレ下端ノイマン境界条件

動径ガラーキン係数変換 -> 動径格子点データ

[Source]

    function wz_wp(wp)
      !
      ! チェビシェフ−ガラーキン法
      ! 上端ディリクレ下端ノイマン境界条件
      !
      ! 動径ガラーキン係数変換 -> 動径格子点データ
      !

      real(8), intent(IN) :: wp((nm+1)**2,2:lm)        !(in) ガラーキン係数
      real(8)             :: wz_wp((nm+1)**2,0:km)     !(out)  格子点データ

      wz_wp = ag_ap(wp)

    end function wz_wp
Function :
wz_wq((nm+1)**2,0:km) :real(8)
: (out) 格子点データ
wq((nm+1)**2,4:lm) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 非圧縮流体の流線関数・流れポテンシャル用境界条件

動径ガラーキン係数変換 -> 動径格子点データ

[Source]

    function wz_wq(wq)
      !
      ! チェビシェフ−ガラーキン法
      ! 非圧縮流体の流線関数・流れポテンシャル用境界条件
      !
      ! 動径ガラーキン係数変換 -> 動径格子点データ
      !

      real(8), intent(IN) :: wq((nm+1)**2,4:lm)        !(in) ガラーキン係数
      real(8)             :: wz_wq((nm+1)**2,0:km)     !(out)  格子点データ

      wz_wq = ag_aq(wq)

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

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

Original external subprogram is wt_module#wz_wt

Function :
wz_wv((nm+1)**2,0:km) :real(8)
: (out) 格子点データ
wv((nm+1)**2,2:lm) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 両端ノイマン境界条件

動径ガラーキン係数変換 -> 動径格子点データ

[Source]

    function wz_wv(wv)
      !
      ! チェビシェフ−ガラーキン法
      ! 両端ノイマン境界条件
      !
      ! 動径ガラーキン係数変換 -> 動径格子点データ
      !

      real(8), intent(IN) :: wv((nm+1)**2,2:lm)        !(in) ガラーキン係数
      real(8)             :: wz_wv((nm+1)**2,0:km)     !(out)  格子点データ

      wz_wv = ag_av(wv)

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

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

Original external subprogram is wt_module#wz_xyz

x_AvrLatRad_xyz( xyz ) result(x_AvrLatRad_xyz)
Function :
x_AvrLatRad_xyz :real(8), dimension(0:im-1)
: (out) 緯度動径(子午面)平均された 1 次元経度格子点データ
xyz :real(8), dimension(0:im-1,1:jm,0: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 wt_module#x_AvrLatRad_xyz

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

動径積分

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

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

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

を計算する.

Original external subprogram is wt_module#x_AvrRad_xz

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

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

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

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

を計算する.

Original external subprogram is wt_module#x_IntLatRad_xyz

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

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

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

Original external subprogram is wt_module#x_IntRad_xz

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

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

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

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

を計算する.

Original external subprogram is wt_module#xy_AvrRad_xyz

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

動径積分

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

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

Original external subprogram is wt_module#xy_IntRad_xyz

xyz_Div_xyz_xyz_xyz( xyz_Vlon, xyz_Vlat, xyz_Vrad ) result(xyz_Div_xyz_xyz_xyz)
Function :
xyz_Div_xyz_xyz_xyz :real(8), dimension(0:im-1,1:jm,0:km)
: (out) ベクトル場の発散
xyz_Vlon :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の経度成分
xyz_Vlat :real(8), dimension(0:im-1,1:jm,0:km), intent(in)
: (in) ベクトル場の緯度成分
xyz_Vrad :real(8), dimension(0:im-1,1:jm,0: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 wt_module#xyz_Div_xyz_xyz_xyz

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

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

Original external subprogram is wt_module#xyz_GradLat_wt

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

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

Original external subprogram is wt_module#xyz_GradLon_wt

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

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

Original external subprogram is wt_module#xyz_LAT

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

Original external subprogram is wt_module#xyz_LON

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

Original external subprogram is wt_module#xyz_RAD

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

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

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

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

Original external subprogram is wt_module#xyz_wt

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

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

Original external subprogram is wt_module#xyz_wz

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

緯度積分

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

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

Original external subprogram is wt_module#xz_AvrLat_xyz

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

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

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

Original external subprogram is wt_module#xz_IntLat_xyz

y_AvrLonRad_xyz( xyz ) result(y_AvrLonRad_xyz)
Function :
y_AvrLonRad_xyz :real(8), dimension(1:jm)
: (out) 経度動径(緯度円)平均された 1 次元緯度格子点データ
xyz :real(8), dimension(0:im-1,1:jm,0: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 wt_module#y_AvrLonRad_xyz

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

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

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

Original external subprogram is wt_module#y_AvrRad_yz

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

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

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

Original external subprogram is wt_module#y_IntLonRad_xyz

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

動径積分

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

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

Original external subprogram is wt_module#y_IntRad_yz

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

経度(帯状)積分

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

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

Original external subprogram is wt_module#yz_AvrLon_xyz

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

経度(帯状)積分

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

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

Original external subprogram is wt_module#yz_IntLon_xyz

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

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

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

Original external subprogram is wt_module#z_AvrLat_yz

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

緯度経度(水平)積分

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

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

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

を計算する.

Original external subprogram is wt_module#z_AvrLonLat_xyz

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

経度(帯状)積分

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

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

Original external subprogram is wt_module#z_AvrLon_xz

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

緯度積分

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

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

Original external subprogram is wt_module#z_IntLat_yz

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

緯度経度(水平)積分

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

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

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

を計算する.

Original external subprogram is wt_module#z_IntLonLat_xyz

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

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

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

Original external subprogram is wt_module#z_IntLon_xz

z_b( b_data ) result(g_b)
Function :
g_b(0:im) :real(8)
: (out) 格子点データ
b_data(ks:km) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 片端ノイマン片端ディリクレ境界条件

ガラーキン係数 -> 格子点データ変換(1次元データ)

Original external subprogram is at_ab_galerkin_ND#g_b

z_d( d_data ) result(g_d)
Function :
g_d(0:im) :real(8)
: (out) 格子点データ
d_data(ks:km) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 両端ディリクレ境界条件

ガラーキン係数 -> 格子点データ変換(1次元データ)

Original external subprogram is at_ad_galerkin_DD#g_d

z_f( f_data ) result(g_f)
Function :
g_f(0:im) :real(8)
: (out) 格子点データ
f_data(ks:km) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 ディリクレ・ノイマン混合境界条件

ガラーキン係数 -> 格子点データ変換(1次元データ)

Original external subprogram is at_af_galerkin_MM#g_f

z_p( p_data ) result(g_p)
Function :
g_p(0:im) :real(8)
: (out) 格子点データ
p_data(ks:km) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 片端ディリクレ片端ノイマン境界条件

ガラーキン係数 -> 格子点データ変換(1次元データ)

Original external subprogram is at_ap_galerkin_DN#g_p

z_q( q_data ) result(g_q)
Function :
g_q(0:im) :real(8)
: (out) 格子点データ
q_data(ks:km) :real(8), intent(in)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 非圧縮流体の流線関数・流れポテンシャル用

ガラーキン係数 -> 格子点データ変換(1次元データ)

Original external subprogram is at_aq_galerkin_RRFF#g_q

z_v( v_data ) result(g_v)
Function :
g_v(0:im) :real(8)
: (out) 格子点データ
v_data(ks:km) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 両端ノイマン境界条件

ガラーキン係数 -> 格子点データ変換(1次元データ)

Original external subprogram is at_av_galerkin_NN#g_v