Class w_mpi_module
In: libsrc/w_mpi_module/w_mpi_module.f90

w_mpi_module

Authors:Shin-ichi Takehiro, Youhei SASAKI
Version:$Id: w_mpi_module.f90 590 2013-08-19 08:48:21Z uwabami $
Copyright&License:See COPYRIGHT

概要

spml/w_module モジュールは球面上での 2 次元流体運動を 球面調和函数を用いたスペクトル法と MPI によって数値計算するための Fortran90 関数を提供する.

w_module は実際には基本変換, 微分計算, 積分・平均計算, スペクトル解析 をそれぞれ担っている下部モジュール w_base_mpi_module, w_deriv_mpi_module, w_module からなっている.

内部で ISPACK の SPPACK と SNPACK の Fortran77 サブルーチンを呼んでいる. スペクトルデータおよび格子点データの格納方法や変換の詳しい計算法に ついては ISPACK/SNPACK,SPPACK のマニュアルを参照されたい.

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

命名法

  • 関数名の先頭 (w_, nm_, n_, xy_, xv_, x_, y_, v_) は, 返す値の形を示している.
      w_ :: スペクトルデータ
     xy_ :: 2 次元格子点データ
     xv_ :: 2 次元分散格子点データ
     nm_ :: スペクトルデータの並んだ 3 次元配列(スペクトルデータの並びは
            全波数 n, 帯状波数 m で指定される 2 次元配列)
      n_ :: スペクトルデータの並んだ 2 次元配列 (スペクトルデータの並びは
            全波数 n で指定される 1 次元配列)
      x_ :: 経度方向 1 次元格子点データ
      y_ :: 緯度方向 1 次元格子点データ
      v_ :: 緯度方向 1 次元分散格子点データ
    
  • 関数名の間の文字列(DLon, GradLat, GradLat, DivLon, DivLat, Lapla, LaplaInv, Jacobian)は, その関数の作用を表している.
  • 関数名の最後 (_w_w, _w, _xy, _x, _y) は, 入力変数の形スペクトルデータ および格子点データであることを示している.
      _w :: スペクトルデータ
    
    _w_w :2 つのスペクトルデータ
     _xy :: 2 次元格子点データ
     _xv :: 2 次元分散格子点データ
      _x :: 経度方向 1 次元格子点データ
      _y :: 緯度方向 1 次元格子点データ
      _v :: 緯度方向 1 次元分散格子点データ
    

各データの種類の説明

  • xy : 2 次元格子点データ.
    • 変数の種類と次元は real(8), dimension(im,jm).
    • im, jm はそれぞれ経度, 緯度座標の格子点数であり, サブルーチン w_mpi_Initial にてあらかじめ設定しておく.
  • xv : 2 次元分散格子点データ.
    • 変数の種類と次元は real(8), dimension(im,jc).
    • im, jc はそれぞれ経度の格子点数および プロセスで保有する緯度方向の格子点数である. jc はサブルーチン w_mpi_Initial にて設定して おくことにより設定される public 変数である.
  • w : スペクトルデータ.
    • 変数の種類と次元は real(8), dimension((nm+1)*(nm+1)). nm は球面調和函数の最大全波数であり, サブルーチン w_Initial にて あらかじめ設定しておく.
    • スペクトルデータの格納のされ方は 関数 l_nm, nm_l によって調べることができる.
  • nm : スペクトルデータの並んだ 2 次元配列.
    • 変数の種類と次元は real(8), dimension(0:nm,-nm:nm). 第 1 次元が水平全波数, 第 2 次元が帯状波数を表す.
    • nm は球面調和函数の最大全波数であり, サブルーチン w_Initial にて あらかじめ設定しておく.
  • n : スペクトルデータの並んだ 1 次元配列.
    • 変数の種類と次元は real(8), dimension(0:nm).
    • 第 1 次元が水平全波数を表す. nm は球面調和函数の最大全波数であり, サブルーチン w_Initial にてあらかじめ設定しておく.
  • x, y : 経度, 緯度方向 1 次元格子点データ.
    • 変数の種類と次元はそれぞれ real(8), dimension(im) および real(8), dimension(jm).
  • w_ で始まる関数が返す値はスペクトルデータに同じ.
  • xy_ で始まる関数が返す値は 2 次元格子点データに同じ.
  • xv_ で始まる関数が返す値は 2 次元分散格子点データに同じ.
  • x_, y_, v_ で始まる関数が返す値は 1 次元格子点データに同じ.
  • スペクトルデータに対する微分等の作用とは, 対応する格子点データに 微分などを作用させたデータをスペクトル変換したものことである.

変数・手続き群の要約

初期化

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

終了処理

w_mpi_Finalize :モジュールの終了処理(割り付け配列の解放)をおこなう.

座標変数

x_Lon, x_Lon_Weight, :格子点座標(経度)と重みを格納した 1 次元配列
y_Lat, y_Lat_Weight :格子点座標(緯度)と重みを格納した 1 次元配列
v_Lat, v_Lat_Weight :分散格子点座標(緯度)と重みを格納した 1 次元配列
xy_Lon, xy_Lat :格子点データの経度・緯度座標(X,Y) (格子点データ型 2 次元配列)
xv_Lon, xv_Lat :分散格子点データの経度・緯度座標(X,Y) (格子点データ型 2 次元配列)

基本変換

xy_w :スペクトルデータから格子データへの変換
w_xy :格子データからスペクトルデータへの変換
xv_w :スペクトルデータから分散格子データへの変換
w_xv :分散格子データからスペクトルデータへの変換
l_nm, nm_l :スペクトルデータの格納位置と全波数・帯状波数の変換
w_StreamPotential2Vector :流線ポテンシャルから速度場計算
w_Vector2VorDiv :速度場から渦度発散を計算
w_VectorCosLat2VorDiv :速度場から渦度発散を計算
w_StreamPotential2VectorMPI :流線ポテンシャルから速度場計算
w_Vector2VorDivMPI :速度場から渦度発散を計算
w_VectorCosLat2VorDivMPI :速度場から渦度発散を計算

微分

w_Lapla_w :スペクトルデータにラプラシアンを作用させる
rn :スペクトルデータのラプラシアンを計算するための係数.
irm :経度微分演算用配列
w_LaplaInv_w :スペクトルデータにラプラシアンの逆変換を作用させる
w_DLon_w :スペクトルデータに経度微分∂/∂λを作用させる
xy_GradLon_w :スペクトルデータに勾配型経度微分 1/cosφ・∂/∂λを作用させる
xy_GradLat_w :スペクトルデータに勾配型緯度微分∂/∂φを作用させる
w_DivLon_xy :格子データに発散型経度微分 1/cosφ・∂/∂λを作用させる
w_DivLat_xy :格子データに発散型緯度微分 1/cosφ・∂(g cosφ)/∂φを作用させる
w_Div_xy_xy :ベクトル成分である 2 つの格子データに発散を作用させる
w_Jacobian_w_w :2 つのスペクトルデータからヤコビアンを計算する
xv_GradLon_w :スペクトルデータに勾配型経度微分 1/cosφ・∂/∂λを作用させる
xv_GradLat_w :スペクトルデータに勾配型緯度微分∂/∂φを作用させる
w_DivLon_xv :格子データに発散型経度微分 1/cosφ・∂/∂λを作用させる
w_DivLat_xv :格子データに発散型緯度微分 1/cosφ・∂(g cosφ)/∂φを作用させる
w_Div_xv_xv :ベクトル成分である 2 つの格子データに発散を作用させる
w_JacobianMPI_w_w :2 つのスペクトルデータからヤコビアンを計算する

微分(λ,μ=sinφ 座標)

xy_GradLambda_w :スペクトルデータに勾配型経度微分∂/∂λを作用させる
xy_GradMu_w :スペクトルデータに勾配型緯度微分 (1-μ^2)∂/∂μを作用させる
w_DivLambda_xy :格子データに発散型経度微分 1/(1-μ^2)・∂/∂λを作用させる
w_DivMu_xy :格子データに発散型緯度微分∂/∂μを作用させる
xv_GradLambda_w :スペクトルデータに勾配型経度微分∂/∂λを作用させる
xv_GradMu_w :スペクトルデータに勾配型緯度微分 (1-μ^2)∂/∂μを作用させる
w_DivLambda_xv :格子データに発散型経度微分 1/(1-μ^2)・∂/∂λを作用させる
w_DivMu_xv :格子データに発散型緯度微分∂/∂μを作用させる

補間

Interpolate_w :スペクトルデータから任意の点での値を求める.

積分・平均

IntLonLat_xy, AvrLonLat_xy :2 次元格子点データの全領域積分および平均
y_IntLon_xy, y_AvrLon_xy :2 次元格子点データの経度方向積分および平均
IntLon_x, AvrLon_x :1 次元(X)格子点データの経度方向積分および平均
x_IntLat_xy, x_AvrLat_xy :2 次元格子点データの緯度方向積分および平均
IntLat_y, AvrLat_y :1 次元(Y)格子点データの緯度方向積分および平均

スペクトル解析

nm_EnergyFromStreamfunc_w :流線関数からエネルギースペクトルを計算する (水平全波数 n, 帯状波数 m 空間)
n_EnergyFromStreamfunc_w :流線関数からエネルギースペクトルを計算する (水平全波数 n 空間)
nm_EnstrophyFromStreamfunc_w :流線関数からエンストロフィースペクトルを 計算する (水平全波数 n, 帯状波数 m 空間)
n_EnstrophyFromStreamfunc_w :流線関数からエンストロフィースペクトルを 計算する (水平全波数 n 空間)
w_spectrum_VMiss :欠損値

Methods

Included Modules

dc_message w_module w_base_mpi_module w_deriv_mpi_module w_integral_mpi_module

Public Instance methods

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

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

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

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

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

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

Interpolate_w( w_data, alon, alat ) result(Interpolate_array00_w)
Function :
Interpolate_array00_w :real(8)
: 補間した値
w_data((nm+1)*(nm+1)) :real(8), intent(IN)
: スペクトルデータ
alon :real(8), intent(IN)
: 補間する位置(経度)
alat :real(8), intent(IN)
: 補間する位置(緯度)

緯度 alat, 経度 alon における関数値を その球面調和変換係数 w_data から補間計算する

Original external subprogram is w_module#Interpolate_w

irm
Variable :
irm(:,:) :integer, allocatable
: 経度微分演算用配列

スペクトルデータの経度微分を計算するための係数. 配列サイズは ( (nm+1)*(nm+1),2 ) である.

L番目の格納位置のスペクトルが実部なら, irm(L,1)には対応する虚部の格納位置が, irm(L,2) には東西波数 m が格納されている. また, L番目の格納位置のスペクトル が虚部なら, irm(L,1)には対応する実部の格納位置が, irm(L,2)には -m が格納され ている.

Original external subprogram is w_module#irm

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

Original external subprogram is w_base_mpi_module#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 w_module#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 w_module#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 w_module#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 w_module#l_nm

n_EnergyFromStreamfunc_w( w_Strfunc ) result(n_EnergyFromStreamfunc_w)
Function :
n_EnergyFromStreamfunc_w :real(8), dimension(0:nm)
: (out) エネルギースペクトル (水平全波数 n 空間)
w_Strfunc(:) :real(8), intent(in)
: (in) 流線関数(スペクトルデータ)

流線関数のスペクトルデータから各全波数のエネルギー成分(スペクトル)を 計算する(1 層用).

 * 全波数 n の流線関数のスペクトル成分ψ(n,m) から
   エネルギースペクトルはΣ[m=-nm]^nm(1/2)n(n+1)ψ(n,m)^2
   と計算される.

 * 全てのエネルギースペクトル成分の和に 4πをかけたものが
   球面上での全エネルギーに等しい.

Original external subprogram is w_module#n_EnergyFromStreamfunc_w

n_EnstrophyFromStreamfunc_w( w_Strfunc ) result(n_EnstrophyFromStreamfunc_w)
Function :
n_EnstrophyFromStreamfunc_w :real(8), dimension(0:nm)
: (out) エンストロフィースペクトル(水平全波数 n 空間)
w_Strfunc(:) :real(8), intent(in)
: (in) 流線関数(スペクトルデータ)

流線関数のスペクトルデータから各全波数のエネルギー成分(スペクトル)を 計算する(1 層用)

  • 全波数 n の流線関数のスペクトル成分ψ(n,m) からエンストロフィー スペクトルはΣ[m=-nm]^nm(1/2)n^2(n+1)^2ψ(n,m)^2 と計算される.
  • 全てのエネルギースペクトル成分の和に 4π/R^2 をかけたものが 球面上での全エンストフィーに等しい.

Original external subprogram is w_module#n_EnstrophyFromStreamfunc_w

nm_EnergyFromStreamfunc_w( w_Strfunc ) result(nm_EnergyFromStreamfunc_w)
Function :
nm_EnergyFromStreamfunc_w :real(8), dimension(0:nm,-nm:nm)
: (out) エネルギースペクトル(水平全波数 n, 帯状波数 m 空間)
w_Strfunc(:) :real(8), intent(in)
: (in) 流線関数(スペクトルデータ)

流線関数のスペクトルデータからエネルギーの球面調和函数成分 (スペクトル)を計算する(1 層用).

 * 全波数 n, 帯状波数 m の流線関数のスペクトル成分ψ(n,m) から
   エネルギースペクトルは (1/2)n(n+1)ψ(n,m)^2 と計算される.

 * 全てのエネルギースペクトル成分の和に4πをかけたものが球面上での
   全エネルギーに等しい.

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

Original external subprogram is w_module#nm_EnergyFromStreamfunc_w

nm_EnstrophyFromStreamfunc_w( w_Strfunc ) result(nm_EnstrophyFromStreamfunc_w)
Function :
nm_EnstrophyFromStreamfunc_w :real(8), dimension(0:nm,-nm:nm)
: エンストロフィースペクトル (水平全波数 n, 帯状波数 m 空間)
w_Strfunc(:) :real(8), intent(in)
: (in) 流線関数(スペクトルデータ)

流線関数のスペクトルデータからエンストロフィーの球面調和函数成分 (スペクトル)を計算する(1 層用).

  • 全波数 n, 帯状波数 m の流線関数のスペクトル成分ψ(n,m) から
     エンストロフィースペクトルは (1/2)n^2(n+1)^2ψ(n,m)^2 と計算される.
    
  • 全てのエンストロフィースペクトル成分の和に4π/R^2をかけたものが 球面上での全エンストロフィーに等しい. ここで R は球面の半径である.
  • データの存在しない全波数 n, 帯状波数 m の配列には欠損値が格納される. 欠損値の値はモジュール変数 w_spectrum_VMiss によって設定できる (初期値は -999.0)

Original external subprogram is w_module#nm_EnstrophyFromStreamfunc_w

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 w_module#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 w_module#nm_l

rn
Variable :
rn(:,:) :real(8), allocatable
: ラプラシアン演算用配列

スペクトルデータのラプラシアンを計算するための係数 配列のサイズは((nm+1)*(nm+1), 2)

r(L,1) には L 番目の格納位置のスペクトルに対するラプラシアン計算の 係数 -n(n+1) の値が格納されている.

Original external subprogram is w_module#rn

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#v_AvrLon_xv

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#v_IntLon_xv

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

Original external subprogram is w_base_mpi_module#v_Lat

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

Original external subprogram is w_base_mpi_module#v_Lat_Weight

w_DLon_w( w_data ) result(w_DLon_w)
Function :
w_DLon_w((nm+1)*(nm+1)) :real(8)
: (out) スペクトルデータの経度微分
w_data((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 入力スペクトルデータ

スペクトルデータに経度微分 ∂/∂λ を作用させる(1 層用).

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

Original external subprogram is w_module#w_DLon_w

w_DivLambda_xv( xv_data ) result(w_DivLambda_xv)
Function :
w_DivLambda_xv((nm+1)*(nm+1)) :real(8)
: (out) 格子点データを発散型経度微分したスペクトルデータ
xv_data(0:im-1,jc) :real(8), intent(in)
: (in) 入力格子点データ

格子点データに発散型経度微分 1/(1-μ^2)・∂/∂λ (μ=sinφ) を作用させてスペクトルデータに変換して返す(1 層用).

Original external subprogram is w_deriv_mpi_module#w_DivLambda_xv

w_DivLambda_xy( xy_data ) result(w_DivLambda_xy)
Function :
w_DivLambda_xy((nm+1)*(nm+1)) :real(8)
: (out) 格子点データを発散型経度微分したスペクトルデータ
xy_data(0:im-1,1:jm) :real(8), intent(in)
: (in) 入力格子点データ

格子点データに発散型経度微分 1/(1-μ^2)・∂/∂λ (μ=sinφ) を作用させてスペクトルデータに変換して返す(1 層用).

Original external subprogram is w_module#w_DivLambda_xy

w_DivLat_xv( xv_data ) result(w_DivLat_xv)
Function :
w_DivLat_xv((nm+1)*(nm+1)) :real(8)
: (out) 格子点データを発散型緯度微分したスペクトルデータ
xv_data(0:im-1,jc) :real(8), intent(in)
: (in) 入力格子点データ

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

Original external subprogram is w_deriv_mpi_module#w_DivLat_xv

w_DivLat_xy( xy_data ) result(w_DivLat_xy)
Function :
w_DivLat_xy((nm+1)*(nm+1)) :real(8)
: (out) 格子点データを発散型緯度微分したスペクトルデータ
xy_data(0:im-1,1:jm) :real(8), intent(in)
: (in) 入力格子点データ

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

Original external subprogram is w_module#w_DivLat_xy

w_DivLon_xv( xv_data ) result(w_DivLon_xv)
Function :
w_DivLon_xv((nm+1)*(nm+1)) :real(8)
: (out) 格子点データを発散型経度微分したスペクトルデータ
xv_data(0:im-1,jc) :real(8), intent(in)
: (in) 入力格子点データ

格子点データに発散型経度微分 1/cosφ・∂/∂λ を作用させて スペクトルデータに変換して返す(1 層用).

Original external subprogram is w_deriv_mpi_module#w_DivLon_xv

w_DivLon_xy( xy_data ) result(w_DivLon_xy)
Function :
w_DivLon_xy((nm+1)*(nm+1)) :real(8)
: (out) 格子点データを発散型経度微分したスペクトルデータ
xy_data(0:im-1,1:jm) :real(8), intent(in)
: (in) 入力格子点データ

格子点データに発散型経度微分 1/cosφ・∂/∂λ を作用させて スペクトルデータに変換して返す(1 層用).

Original external subprogram is w_module#w_DivLon_xy

w_DivMu_xv( xv_data ) result(w_DivMu_xv)
Function :
w_DivMu_xv((nm+1)*(nm+1)) :real(8)
: (out) 格子点データを発散型緯度微分したスペクトルデータ
xv_data(0:im-1,jc) :real(8), intent(in)
: (in) 入力格子点データ

格子点データに発散型緯度微分 ∂/∂μ (μ=sinφ)を作用させて スペクトルデータに変換して返す(1 層用).

Original external subprogram is w_deriv_mpi_module#w_DivMu_xv

w_DivMu_xy( xy_data ) result(w_DivMu_xy)
Function :
w_DivMu_xy((nm+1)*(nm+1)) :real(8)
: (out) 格子点データを発散型緯度微分したスペクトルデータ
xy_data(0:im-1,1:jm) :real(8), intent(in)
: (in) 入力格子点データ

格子点データに発散型緯度微分 ∂/∂μ (μ=sinφ)を作用させて スペクトルデータに変換して返す(1 層用).

Original external subprogram is w_module#w_DivMu_xy

w_Div_xv_xv( xv_u, xv_v ) result(w_Div_xv_xv)
Function :
w_Div_xv_xv((nm+1)*(nm+1)) :real(8)
: (out) 2 つの入力格子点データをベクトル成分とする発散のスペクトルデータ
xv_u(0:im-1,jc) :real(8), intent(in)
: (in) ベクトル経度成分の格子点データ
xv_v(0:im-1,jc) :real(8), intent(in)
: (in) ベクトル緯度成分の格子点データ

2 つの入力格子点データをベクトル成分とする発散を計算し, スペクトルデータとして返す(1 層用).

Original external subprogram is w_deriv_mpi_module#w_Div_xv_xv

w_Div_xy_xy( xy_u, xy_v ) result(w_Div_xy_xy)
Function :
w_Div_xy_xy((nm+1)*(nm+1)) :real(8)
: (out) 2 つの入力格子点データをベクトル成分とする発散のスペクトルデータ
xy_u(0:im-1,1:jm) :real(8), intent(in)
: (in) ベクトル経度成分の格子点データ
xy_v(0:im-1,1:jm) :real(8), intent(in)
: (in) ベクトル緯度成分の格子点データ

2 つの入力格子点データをベクトル成分とする発散を計算し, スペクトルデータとして返す(1 層用).

Original external subprogram is w_module#w_Div_xy_xy

w_JacobianMPI_w_w( w_a, w_b ) result(w_JacobianMPI_w_w)
Function :
w_JacobianMPI_w_w((nm+1)*(nm+1)) :real(8)
: (out) 2 つのスペクトルデータのヤコビアン
w_a((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 1つ目の入力スペクトルデータ
w_b((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 2つ目の入力スペクトルデータ

2 つのスペクトルデータにヤコビアン

  J(f,g) = ∂f/∂λ・∂g/∂μ - ∂g/∂λ・∂f/∂μ
         = ∂f/∂λ・1/cosφ・∂g/∂φ
            - ∂g/∂λ・1/cosφ・∂f/∂φ

を作用させる(1 層用).

Original external subprogram is w_deriv_mpi_module#w_JacobianMPI_w_w

w_Jacobian_w_w( w_a, w_b ) result(w_Jacobian_w_w)
Function :
w_Jacobian_w_w((nm+1)*(nm+1)) :real(8)
: (out) 2 つのスペクトルデータのヤコビアン
w_a((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 1つ目の入力スペクトルデータ
w_b((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 2つ目の入力スペクトルデータ

2 つのスペクトルデータにヤコビアン

  J(f,g) = ∂f/∂λ・∂g/∂μ - ∂g/∂λ・∂f/∂μ
         = ∂f/∂λ・1/cosφ・∂g/∂φ
            - ∂g/∂λ・1/cosφ・∂f/∂φ

を作用させる(1 層用).

Original external subprogram is w_module#w_Jacobian_w_w

w_LaplaInv_w( w_data ) result(w_LaplaInv_w)
Function :
w_LaplaInv_w((nm+1)*(nm+1)) :real(8)
: (out) スペクトルデータの逆ラプラシアン
w_data((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 入力スペクトルデータ

入力スペクトルデータに逆ラプラシアン

   ▽^{-2}
     =[1/cos^2φ・∂^2/∂λ^2 + 1/cosφ・∂/∂φ(cosφ∂/∂φ)]^{-1}

を作用する(1 層用).

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

Original external subprogram is w_module#w_LaplaInv_w

w_Lapla_w( w_data ) result(w_Lapla_w)
Function :
w_Lapla_w((nm+1)*(nm+1)) :real(8)
: (out) 入力スペクトルデータのラプラシアン
w_data((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 入力スペクトルデータ

入力スペクトルデータにラプラシアン

   ▽^2 = 1/cos^2φ・∂^2/∂λ^2 + 1/cosφ・∂/∂φ(cosφ∂/∂φ)

を作用する(1 層用).

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

Original external subprogram is w_module#w_Lapla_w

w_StreamPotential2Vector( w_Psi, w_Chi, xy_U, xy_V )
Subroutine :
w_Psi((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 流線関数
w_Chi((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 速度ポテンシャル
xy_U(0:im-1,1:jm) :real(8), intent(out)
: (out) 速度経度成分
xy_V(0:im-1,1:jm) :real(8), intent(out)
: (out) 速度緯度成分

流線・ポテンシャル(スペクトルデータ)から速度場(格子データ)に (逆)変換する(1 層用)

スペクトル変換を用いず微分を計算するために, 変換回数が 2 回ですむ.

  u cosφ =      ∂χ/∂λ - cosφ∂ψ/∂φ,
  v cosφ = cosφ∂χ/∂φ +      ∂ψ/∂λ

Original external subprogram is w_module#w_StreamPotential2Vector

w_StreamPotential2VectorMPI( w_Psi, w_Chi, xv_U, xv_V )
Subroutine :
w_Psi((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 流線関数
w_Chi((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 速度ポテンシャル
xv_U(0:im-1,1:jc) :real(8), intent(out)
: (out) 速度経度成分
xv_V(0:im-1,1:jc) :real(8), intent(out)
: (out) 速度緯度成分

流線・ポテンシャル(スペクトルデータ)から速度場(格子データ)に (逆)変換する(1 層用, MPI)

スペクトル変換を用いず微分を計算するために, 変換回数が 2 回ですむ.

  u cosφ =      ∂χ/∂λ - cosφ∂ψ/∂φ,
  v cosφ = cosφ∂χ/∂φ +      ∂ψ/∂λ

Original external subprogram is w_base_mpi_module#w_StreamPotential2VectorMPI

w_Vector2VorDiv( xy_U, xy_V, w_Vor, w_Div )
Subroutine :
xy_U(0:im-1,1:jm) :real(8), intent(in)
: (in) 速度経度成分
xy_V(0:im-1,1:jm) :real(8), intent(in)
: (in) 速度緯度成分
w_Vor((nm+1)*(nm+1)) :real(8), intent(out)
: (out) 流線関数
w_Div((nm+1)*(nm+1)) :real(8), intent(out)
: (out) 速度ポテンシャル

速度場(格子データ)から渦度・発散(スペクトルデータ)に (正)変換する(1 層用)

スペクトル変換を用いず微分を計算するために, 変換回数が 2 回ですむ.

  ζ = 1/cosφ∂v/∂λ - 1/cosφ ∂(u cosφ)/∂φ
   D = 1/cosφ∂u/∂λ + 1/cosφ ∂(v cosφ)/∂φ

Original external subprogram is w_module#w_Vector2VorDiv

w_Vector2VorDivMPI( xv_U, xv_V, w_Vor, w_Div )
Subroutine :
xv_U(0:im-1,1:jm) :real(8), intent(in)
: (in) 速度経度成分
xv_V(0:im-1,1:jm) :real(8), intent(in)
: (in) 速度緯度成分
w_Vor((nm+1)*(nm+1)) :real(8), intent(out)
: (out) 流線関数
w_Div((nm+1)*(nm+1)) :real(8), intent(out)
: (out) 速度ポテンシャル

速度場(格子データ)から渦度・発散(スペクトルデータ)に (正)変換する(1 層用, MPI)

スペクトル変換を用いず微分を計算するために, 変換回数が 2 回ですむ.

  ζ = 1/cosφ∂v/∂λ - 1/cosφ ∂(u cosφ)/∂φ
   D = 1/cosφ∂u/∂λ + 1/cosφ ∂(v cosφ)/∂φ

Original external subprogram is w_base_mpi_module#w_Vector2VorDivMPI

w_VectorCosLat2VorDiv( xy_UCosLat, xy_VCosLat, w_Vor, w_Div )
Subroutine :
xy_UCosLat(0:im-1,1:jm) :real(8), intent(in)
: (in) 速度経度成分 * cos(lat)
xy_VCosLat(0:im-1,1:jm) :real(8), intent(in)
: (in) 速度緯度成分 * cos(lat)
w_Vor((nm+1)*(nm+1)) :real(8), intent(out)
: (out) 流線関数
w_Div((nm+1)*(nm+1)) :real(8), intent(out)
: (out) 速度ポテンシャル

速度場(格子データ)から渦度・発散(スペクトルデータ)に (正)変換する(1 層用)

スペクトル変換を用いず微分を計算するために, 変換回数が 2 回ですむ.

  ζ = 1/cosφ∂v/∂λ - 1/cosφ ∂(u cosφ)/∂φ
   D = 1/cosφ∂u/∂λ + 1/cosφ ∂(v cosφ)/∂φ

Original external subprogram is w_module#w_VectorCosLat2VorDiv

w_VectorCosLat2VorDivMPI( xv_UCosLat, xv_VCosLat, w_Vor, w_Div )
Subroutine :
xv_UCosLat(0:im-1,1:jm) :real(8), intent(in)
: (in) 速度経度成分 * cos(lat)
xv_VCosLat(0:im-1,1:jm) :real(8), intent(in)
: (in) 速度緯度成分 * cos(lat)
w_Vor((nm+1)*(nm+1)) :real(8), intent(out)
: (out) 流線関数
w_Div((nm+1)*(nm+1)) :real(8), intent(out)
: (out) 速度ポテンシャル

速度場(格子データ)から渦度・発散(スペクトルデータ)に (正)変換する(1 層用, MPI)

スペクトル変換を用いず微分を計算するために, 変換回数が 2 回ですむ.

  ζ = 1/cosφ∂v/∂λ - 1/cosφ ∂(u cosφ)/∂φ
   D = 1/cosφ∂u/∂λ + 1/cosφ ∂(v cosφ)/∂φ

Original external subprogram is w_base_mpi_module#w_VectorCosLat2VorDivMPI

Subroutine :

モジュールの終了処理(割り付け配列の解放)をおこなう.

解像度を変更する際にはこのサブルーチンを呼んで終了処理を おこなったのちに再度 w_mpi_Initial で初期設定しなければ ならない.

[Source]

    subroutine w_mpi_Finalize
      !
      ! モジュールの終了処理(割り付け配列の解放)をおこなう. 
      !
      ! 解像度を変更する際にはこのサブルーチンを呼んで終了処理を
      ! おこなったのちに再度 w_mpi_Initial で初期設定しなければ
      ! ならない. 
      !
      call w_Finalize
      call w_base_mpi_Finalize
      call w_deriv_mpi_Finalize

      call MessageNotify('M','w_mpi_Finalize', 'w_mpi_module (2013/02/23) is finalized')

    end subroutine w_mpi_Finalize
Subroutine :
n_in :integer,intent(in)
: (in) 切断波数の設定
i_in :integer,intent(in)
: (in) 格子点数(東西)
j_in :integer,intent(in)
: (in) 格子点数(南北)
np_in :integer,intent(in), optional
: (in) ダミー変数

スペクトル変換の格子点数, 波数を設定する.

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

np_in は w_mpi_module_sjpack との互換性を保つためのダミー変数である.

[Source]

    subroutine w_mpi_initial(n_in,i_in,j_in,np_in)
      !
      ! スペクトル変換の格子点数, 波数を設定する. 
      !
      ! 他の関数を呼ぶ前に, 最初にこのサブルーチンを呼んで初期設定を
      ! しなければならない. 
      !
      ! np_in は w_mpi_module_sjpack との互換性を保つためのダミー変数である.
      !
      integer,intent(in) :: i_in              !(in) 格子点数(東西)
      integer,intent(in) :: j_in              !(in) 格子点数(南北)
      integer,intent(in) :: n_in              !(in) 切断波数の設定
      integer,intent(in), optional :: np_in   !(in) ダミー変数

      if ( present (np_in) )then
         call MessageNotify('W','w_mpi_initial', 'OpenMP calculation not supported with w_mpi_module.')
      endif

      call w_initial(n_in,i_in,j_in)
      call w_base_mpi_initial
      call w_deriv_mpi_initial

      call MessageNotify('M','w_mpi_initial', 'w_mpi_module (2013/02/15) is initialized')

    end subroutine w_mpi_initial
w_spectrum_VMiss
Variable :
w_spectrum_VMiss = -999.000 :real(8)
: 欠損値初期値

Original external subprogram is w_module#w_spectrum_VMiss

w_xv( xv_data, [ipow], [iflag] ) result(w_xv)
Function :
w_xv((nm+1)*(nm+1)) :real(8)
: (out) スペクトルデータ
xv_data(0:im-1,jc) :real(8), intent(in)
: (in) 格子点データ
ipow :integer, intent(in), optional
: (in) 変換時に同時に作用させる 1/cosφ の次数. 省略時は 0.
iflag :integer, intent(in), optional
: 変換の種類
    0 : 通常の正変換
    1 : 経度微分を作用させた正変換
   -1 : 緯度微分を作用させた正変換
    2 : sinφを作用させた正変換
  省略時は 0.

格子データからスペクトルデータへ(正)変換する(1 層用).

Original external subprogram is w_base_mpi_module#w_xv

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

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

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

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

Original external subprogram is w_module#x_Lon

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

Original external subprogram is w_module#x_Lon_Weight

xv_GradLambda_w( w_data ) result(xv_GradLambda_w)
Function :
xv_GradLambda_w(0:im-1,jc) :real(8)
: (out) スペクトルデータを勾配型経度微分した格子点データ
w_data((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 入力スペクトルデータ

スペクトルデータに勾配型経度微分 ∂/∂λ を作用する(1 層用).

Original external subprogram is w_deriv_mpi_module#xv_GradLambda_w

xv_GradLat_w( w_data ) result(xv_GradLat_w)
Function :
xv_GradLat_w(0:im-1,jc) :real(8)
: (out) スペクトルデータを勾配型緯度微分した格子点データ
w_data((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 入力スペクトルデータ

スペクトルデータに勾配型緯度微分 ∂/∂φ を作用させて 格子点データに変換して返す(1 層用).

Original external subprogram is w_deriv_mpi_module#xv_GradLat_w

xv_GradLon_w( w_data ) result(xv_GradLon_w)
Function :
xv_GradLon_w(0:im-1,jc) :real(8)
: (out) スペクトルデータを勾配型経度微分した格子点データ
w_data((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 入力スペクトルデータ

スペクトルデータに勾配型経度微分 1/cosφ・∂/∂λ を 作用させた格子点データを返す(1 層用).

Original external subprogram is w_deriv_mpi_module#xv_GradLon_w

xv_GradMu_w( w_data ) result(xv_GradMu_w)
Function :
xv_GradMu_w(0:im-1,jc) :real(8)
: (out) スペクトルデータを勾配型緯度微分した格子点データ
w_data((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 入力スペクトルデータ

スペクトルデータに勾配型緯度微分 (1-μ^2)∂/∂μ (μ=sinφ) を作用させて格子点データに変換して返す(1 層用).

Original external subprogram is w_deriv_mpi_module#xv_GradMu_w

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

Original external subprogram is w_base_mpi_module#xv_Lat

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

Original external subprogram is w_base_mpi_module#xv_Lon

xv_w( w_data, [ipow], [iflag] ) result(xv_w)
Function :
xv_w(0:im-1,jc) :real(8)
: (out) 格子点データ
w_data((nm+1)*(nm+1)) :real(8), intent(in)
: (in) スペクトルデータ
ipow :integer, intent(in), optional
: (in) 作用させる 1/cosφ の次数. 省略時は 0.
iflag :integer, intent(in), optional
: (in) 変換の種類
    0 : 通常の正変換
    1 : 経度微分を作用させた正変換
   -1 : 緯度微分を作用させた正変換
    2 : sinφを作用させた正変換
    省略時は 0.

スペクトルデータから分散格子データへ変換する(1 層用).

Original external subprogram is w_base_mpi_module#xv_w

xy_GradLambda_w( w_data ) result(xy_GradLambda_w)
Function :
xy_GradLambda_w(0:im-1,1:jm) :real(8)
: (out) スペクトルデータを勾配型経度微分した格子点データ
w_data((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 入力スペクトルデータ

スペクトルデータに勾配型経度微分 ∂/∂λ を作用する(1 層用).

Original external subprogram is w_module#xy_GradLambda_w

xy_GradLat_w( w_data ) result(xy_GradLat_w)
Function :
xy_GradLat_w(0:im-1,1:jm) :real(8)
: (out) スペクトルデータを勾配型緯度微分した格子点データ
w_data((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 入力スペクトルデータ

スペクトルデータに勾配型緯度微分 ∂/∂φ を作用させて 格子点データに変換して返す(1 層用).

Original external subprogram is w_module#xy_GradLat_w

xy_GradLon_w( w_data ) result(xy_GradLon_w)
Function :
xy_GradLon_w(0:im-1,1:jm) :real(8)
: (out) スペクトルデータを勾配型経度微分した格子点データ
w_data((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 入力スペクトルデータ

スペクトルデータに勾配型経度微分 1/cosφ・∂/∂λ を 作用させた格子点データを返す(1 層用).

Original external subprogram is w_module#xy_GradLon_w

xy_GradMu_w( w_data ) result(xy_GradMu_w)
Function :
xy_GradMu_w(0:im-1,1:jm) :real(8)
: (out) スペクトルデータを勾配型緯度微分した格子点データ
w_data((nm+1)*(nm+1)) :real(8), intent(in)
: (in) 入力スペクトルデータ

スペクトルデータに勾配型緯度微分 (1-μ^2)∂/∂μ (μ=sinφ) を作用させて格子点データに変換して返す(1 層用).

Original external subprogram is w_module#xy_GradMu_w

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

Original external subprogram is w_module#xy_Lat

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

Original external subprogram is w_module#xy_Lon

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

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 w_module#y_AvrLon_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 w_module#y_IntLon_xy

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

Original external subprogram is w_module#y_Lat

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

Original external subprogram is w_module#y_Lat_Weight