Class dyn_spectral
In: dynamics/dyn_spectral.f90

力学コア (スペクトル法)

Dynamical Core (Spectral method)

Note that Japanese and English are described in parallel.

力学コアモジュールです. 水平離散化には以下の手法を用いています.

  • スペクトル法
    • 三角形切断
    • 変換法

This is a dynamical core module. Used horizontal discretization method is as follows.

  • Spectral Method
    • Triangle Truncation
    • Transform Method

Procedures List

Create :DYNSP 型変数の初期設定
Close :DYNSP 型変数の終了処理
PutLine :DYNSP 型変数に格納されている情報の印字
initialized :DYNSP 型変数が初期設定されているか否か
GetAxes :DYNSP 型変数に格納されている座標値の取得
GetCoriolis :コリオリパラメータの取得
GetSpectralCoeff :スペクトルの添字順序とラプラシアンの係数の取得
GetDiffCoeff :運動量水平拡散係数と熱, 水水平拡散係数の取得
GetPhis :地形データ (地表 Φ ) のスペクトル値を取得
GradPi :地表面気圧の空間変化の計算
VorDiv2UV :渦度と発散から東西風速と南北風速を計算
UV2VorDiv :東西風速と南北風速から渦度と発散を計算
Tendency :渦度や発散などの予報変数のスペクトル時間変化項の計算
Grid2Spectral :格子点値からスペクトル値を計算
Spectral2Grid :スペクトル値から格子点値を計算
DiffusionVorDiv :運動量水平拡散による渦度発散の時間変化の計算
DiffusionCorrectTemp :運動量水平拡散による摩擦熱補正の計算
———— :————
Create :Constructor of "DYNSP"
Close :Deconstructor of "DYNSP"
PutLine :Print information of "DYNSP"
initialized :Check initialization of "DYNSP"
GetAxes :Get data of axes in "DYNSP"
GetCoriolis :Get Coriolis parameter
GetSpectralCoeff :Get spectral subscript expression, and
 Laplacian coefficient
GetDiffCoeff :Get coefficient of horizontal momentum diffusion, and coefficient of horizontal thermal and water diffusion.
GetPhis :Get spectral geography data (surface Φ )
GradPi :Calculate spatial variations of surface pressure
VorDiv2UV :Calculate zonal and meridional wind from given vorticity and divergence
UV2VorDiv :Calculate vorticity and divergence from given zonal and meridional wind.
Tendency :Calculate spectral tendency of predictive variables like vorticity and divergence
Grid2Spectral :Calculate spectral values from given grid values
Spectral2Grid :Calculate grid values from given spectral values
DiffusionVorDiv :Caluculate vorticity and divergence tendency by horizontal diffusion of momentum
DiffusionCorrectTemp :Caluculate frictional thermal correction by
 horizontal momentum diffusion

Usage

始めに, DYNSP 型の変数を定義し, Create で初期化します. このモジュールではスペクトル変換による計算を行うための サブルーチン群が用意されています. 上記から選んで使用してください. DYNSP 型の変数の終了処理には Close を用います.

First, initialize "DYNSP" by Create. This module provides subroutines that calculate by spectral transform. Select from above list. In order to terminate "DYNSP", use Close.

Methods

Included Modules

dc_types wa_module w_module dc_present dc_message dc_trace dc_error dcpam_error dc_date dc_string dc_iounit

Attributes

Derived_Types  []  DYNSP

Public Instance methods

Close( dyn_sp, [err] )
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

引数 dyn_sp に設定された内容を空にします. DYNSP 型の 変数に関して再利用する際に使用します. この手続きによって 空となった変数は再度 Create によって初期化して使用します. なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Deconstructor of "DYNSP". Note that if dyn_sp is not initialized by Create yet, error is occurred.

Alias for DynSpectralClose

Create( dyn_sp, nmax, imax, jmax, kmax, PI, RPlanet, Grav, Omega, Cp, RAir, VisOrder, EFoldTime, DelTime, [xy_Phis], [openmp_threads], [nmlfile], [err] )
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
nmax :integer, intent(in)
: 最大全波数. Maximum truncated wavenumber
imax :integer, intent(in)
: 経度格子点数. Number of grid points in longitude
jmax :integer, intent(in)
: 緯度格子点数. Number of grid points in latitude
kmax :integer, intent(in)
: 鉛直層数. Number of vertical level
PI :real(DP), intent(in)
: π . 円周率. Circular constant
RPlanet :real(DP), intent(in)
: a . 惑星半径. Radius of planet
Grav :real(DP), intent(in)
: g . 重力加速度. Gravitational acceleration
Omega :real(DP), intent(in)
: Ω . 回転角速度. Angular velocity
Cp :real(DP), intent(in)
: Cp . 大気定圧比熱. Specific heat of air at constant pressure
RAir :real(DP), intent(in)
: R . 大気気体定数. Gas constant of air
VisOrder :integer, intent(in)
: 超粘性の次数. Order of hyper-viscosity
EFoldTime :real(DP), intent(in)
: 最大波数に対する e-folding time. E-folding time for maximum wavenumber
DelTime :real(DP), intent(in)
: Δt . タイムステップ. Time step
xy_Phis(0:imax-1, 0:jmax-1) :real(DP), intent(in), optional
: Φs . 地表ジオポテンシャル. Surface geo-potential
openmp_threads :integer, intent(in), optional
: OPENMP での最大スレッド数. openmp_threads に 1 より大きな値を指定すれば ISPACK の球面調和函数変換 OPENMP 並列計算 ルーチンが用いられる. 並列計算を実行するには, 実行時に環境変数 OMP_NUM_THREADS を openmp_threads 以下の数字に設定する 等のシステムに応じた準備が必要となる.

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

nmlfile :character(*), intent(in), optional
: NAMELIST ファイルの名称. この引数に空文字以外を与えた場合, 指定されたファイルから NAMELIST 変数群を読み込みます. ファイルを読み込めない場合にはエラーを 生じます.

NAMELIST file name. If nonnull character is specified to this argument, NAMELIST group name is loaded from the file. If the file can not be read, an error occurs.

err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

引数 dyn_sp にスペクトル法を用いた演算の設定を行います. 他のサブルーチンを使用する前に必ずこのサブルーチンによって DYNSP 型の変数を初期設定してください. なお, 与えられた dyn_sp が既に初期設定されている場合, プログラムはエラーを発生させます.

NAMELIST を利用する場合には引数 nmlfileNAMELIST ファイル名 を与えてください.

Configure the settings for spectral method to dyn_sp. Initialize dyn_sp by this subroutine, before other procedures are used, Note that if dyn_sp is already initialized by this procedure, error is occurred.

In order to use NAMELIST, specify a NAMELIST filename to argument nmlfile.

Alias for DynSpectralCreate

DYNSP
Derived Type :
initialized = .false. :logical
: 初期設定フラグ. Initialization flag
nmax :integer
: 最大全波数. Maximum truncated wavenumber
imax :integer
: 経度格子点数. Number of grid points in longitude
jmax :integer
: 緯度格子点数. Number of grid points in latitude
kmax :integer
: 鉛直層数. Number of vertical level
PI :real(DP)
: π . 円周率. Circular constant
RPlanet :real(DP)
: a . 惑星半径. Radius of planet
Omega :real(DP)
: Ω . 回転角速度. Angular velocity
Grav :real(DP)
: g . 重力加速度. Gravitational acceleration
Cp :real(DP)
: Cp . 大気定圧比熱. Specific heat of air at constant pressure
RAir :real(DP)
: R . 大気気体定数. Gas constant of air
VisOrder :integer
: 超粘性の次数. Order of hyper-viscosity
EFoldTime :real(DP)
: 最大波数に対する e-folding time. E-folding time for maximum wavenumber
DelTime :real(DP)
: Δt . タイムステップ. Time step
Kappa :real(DP)
: κ=R/Cp . 気体定数の定圧比熱に対する比. Ratio of gas constant to specific heat
xy_Cori(:,:) =>null() :real(DP), pointer
: f2Ωsinϕ . コリオリパラメータ. Coriolis parameter
xy_UVFact(:,:) =>null() :real(DP), pointer
: cosϕ . uU,vV の係数. Coefficient for uU,vV
wz_DiffVorDiv(:,:) =>null() :real(DP), pointer
: -KHD[(-1)ND/2ND-(2/a2)ND/2] . 運動量水平拡散係数. Coefficient of horizontal momentum diffusion
wz_DiffTherm(:,:) =>null() :real(DP), pointer
: -(-1)ND/2KHDND . 熱, 水水平拡散係数. Coefficient of horizontal thermal and water diffusion
xy_Phis(:,:) =>null() :real(DP), pointer
: Φs . 地表ジオポテンシャル. Surface geo-potential
openmp_threads = 0 :integer
: OPENMP での最大スレッド数. Maximum number of threads in OPENMP

DYNSP 型の変数を使用する際には必ず Create によって初期設定を 行ってください. 一度 Create で初期化された変数を別途再利用 する際は, Close によって終了処理を行ってください.

DiffusionCorrectTemp( dyn_sp, wz_VorDiff, wz_DivDiff, xyz_U, xyz_V, xyz_Temp, [err] )
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
wz_VorDiff((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: 𝒟(ζ) . 運動量水平拡散による渦度変化 (スペクトル). Vorticity tendency by horizontal momentum diffusion (spectral)
wz_DivDiff((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: 𝒟(D) . 運動量水平拡散による発散変化 (スペクトル). Divergence tendency by horizontal momentum diffusion (spectral)
xyz_U(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: U . 東西風速. Zonal wind.
xyz_V(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: V . 南北風速. Meridional wind.
xyz_Temp(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(inout)
: T . 温度. Temperature
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

運動量水平拡散による摩擦熱補正を計算します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Caluculate frictional thermal correction by horizontal momentum diffusion

If dyn_sp is not initialized by Create yet, error is occurred.

Alias for DynSpectralDiffusionCorrectTemp

DiffusionVorDiv( dyn_sp, wz_Vor, wz_Div, wz_VorDiff, wz_DivDiff, [err] )
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
wz_Vor((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: ζ . 渦度 (スペクトル). Vorticity (spectral)
wz_Div((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: D . 発散 (スペクトル). Divergence (spectral)
wz_VorDiff((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: 𝒟(ζ) . 運動量水平拡散による渦度変化 (スペクトル). Vorticity tendency by horizontal momentum diffusion (spectral)
wz_DivDiff((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: 𝒟(D) . 運動量水平拡散による発散変化 (スペクトル). Divergence tendency by horizontal momentum diffusion (spectral)
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

運動量水平拡散による渦度発散の時間変化を計算します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Caluculate vorticity and divergence tendency by horizontal diffusion of momentum

If dyn_sp is not initialized by Create yet, error is occurred.

Alias for DynSpectralDiffusionVorDiv

GetAxes( dyn_sp, x_Lon, y_Lat, [err] )
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
x_Lon(0:dyn_sp%imax-1) :real(DP), intent(out)
: 経度. Longitude
y_Lat(0:dyn_sp%jmax-1) :real(DP), intent(out)
: 緯度. Latitude
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

dyn_sp に格納されている座標値を返します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Return data of axes stored in dyn_sp.

If dyn_sp is not initialized by Create yet, error is occurred.

Alias for DynSpectralGetAxes

GetCoriolis( dyn_sp, xy_Cori, [err] )
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
xy_Cori(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1) :real(DP), intent(out)
: f2Ωsinϕ . コリオリパラメータ. Coriolis parameter
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

コリオリパラメータ f2Ωsinϕ を返します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Return Coriolis parameter f2Ωsinϕ .

If dyn_sp is not initialized by Create yet, error is occurred.

Alias for DynSpectralGetCoriolis

GetDiffCoeff( dyn_sp, wz_DiffVorDiv, wz_DiffTherm, [err] )
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
wz_DiffVorDiv((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: -KHD[(-1)ND/2ND-(2/a2)ND/2] . 運動量水平拡散係数. Coefficient of horizontal momentum diffusion
wz_DiffTherm((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: -(-1)ND/2KHDND . 熱, 水水平拡散係数. Coefficient of horizontal thermal and water diffusion
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

運動量水平拡散係数と熱, 水水平拡散係数を返します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Return coefficient of horizontal momentum diffusion, and coefficient of horizontal thermal and water diffusion.

If dyn_sp is not initialized by Create yet, error is occurred.

Alias for DynSpectralGetDiffCoeff

GetPhis( dyn_sp, w_Phis, [err] )
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
w_Phis((dyn_sp%nmax+1)**2) :real(DP), intent(out)
: Φs . 地表ジオポテンシャル. Surface geo-potential
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

地形データ (地表 Φ ) のスペクトル値を返します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Return spectral geography data (surface Φ ).

If dyn_sp is not initialized by Create yet, error is occurred.

Alias for DynSpectralGetPhis

GetSpectralCoeff( dyn_sp, nmo, wz_rn, [err] )
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
nmo(1:2, 0:dyn_sp%nmax, 0:dyn_sp%nmax) :integer, intent(out)
: スペクトルの添字順番. Spectral subscript expression
wz_rn((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: -n×(n+1) . ラプラシアンの係数. Laplacian coefficient
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

スペクトルの添字順序とラプラシアンの係数を返します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Return spectral subscript expression, and Laplacian coefficient.

If dyn_sp is not initialized by Create yet, error is occurred.

Alias for DynSpectralGetSpectralCoeff

GradPi( dyn_sp, xy_Ps, xy_GradLonPi, xy_GradLatPi, [err] )
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
xy_Ps(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1) :real(DP), intent(in)
: Ps 地表面気圧. Surface pressure
xy_GradLonPi(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1) :real(DP), intent(out)
: dπdx
xy_GradLatPi(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1) :real(DP), intent(out)
: dπdy
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

与えられた地表面気圧 Ps から, 地表面気圧の空間変化 dπdx および dπdy を返す. なお, π=lnPs である.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

From given surface presure Ps, spatial variations of surface pressure dπdx and dπdy are returned, where π=lnPs.

If dyn_sp is not initialized by Create yet, error is occurred.

Alias for DynSpectralGradPi

Grid2Spectral( dyn_sp, xyz_Vor, xyz_Div, xyz_Temp, xy_Ps, xyz_QVap, wz_Vor, wz_Div, wz_Temp, w_Pi, wz_QVap, [err] )
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
xyz_Vor(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: ζ . 渦度. Vorticity
xyz_Div(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: D . 発散. Divergence
xyz_Temp(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: T . 温度. Temperature
xy_Ps(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1) :real(DP), intent(in)
: Ps . 地表面気圧. Surface pressure
xyz_QVap(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: q . 比湿. Specific humidity
wz_Vor((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: ζ . 渦度 (スペクトル). Vorticity (spectral)
wz_Div((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: D . 発散 (スペクトル). Divergence (spectral)
wz_Temp((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: T . 温度 (スペクトル). Temperature (spectral)
w_Pi((dyn_sp%nmax+1)**2) :real(DP), intent(out)
: π=lnPs . 地表面気圧 (スペクトル). Surface pressure (spectral)
wz_QVap((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: q . 比湿 (スペクトル). Specific humidity (spectral)
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

与えられた格子点値からスペクトル値を計算します. 地表面気圧 Ps のみ, π=lnPs の値を 返します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Calculate spectral values from given grid values. Only surface pressure Ps , π=lnPs is returned.

If dyn_sp is not initialized by Create yet, error is occurred.

Alias for DynSpectralGrid2Spectral

PutLine( dyn_sp, [unit], [indent], [err] )
Subroutine :
dyn_sp :type(DYNSP), intent(in)
unit :integer, intent(in), optional
: 出力先の装置番号. デフォルトの出力先は標準出力.

Unit number for output. Default value is standard output.

indent :character(*), intent(in), optional
: 表示されるメッセージの字下げ.

Indent of displayed messages.

err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

引数 dyn_sp に設定されている情報を印字します. デフォルトではメッセージは標準出力に出力されます. unit に装置番号を指定することで, 出力先を変更することが可能です.

Print information of dyn_sp. By default messages are output to standard output. Unit number for output can be changed by unit argument.

Alias for DynSpectralPutLine

Spectral2Grid( dyn_sp, wz_Vor, wz_Div, wz_Temp, w_Pi, wz_QVap, xyz_Vor, xyz_Div, xyz_Temp, xy_Ps, xyz_QVap, [xyz_U], [xyz_V], [err] )
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
wz_Vor((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: ζ . 渦度 (スペクトル). Vorticity (spectral)
wz_Div((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: D . 発散 (スペクトル). Divergence (spectral)
wz_Temp((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: T . 温度 (スペクトル). Temperature (spectral)
w_Pi((dyn_sp%nmax+1)**2) :real(DP), intent(in)
: π=lnPs . 地表面気圧 (スペクトル). Surface pressure (spectral)
wz_QVap((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: q . 比湿 (スペクトル). Specific humidity (spectral)
xyz_Vor(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: ζ . 渦度. Vorticity
xyz_Div(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: D . 発散. Divergence
xyz_Temp(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: T . 温度. Temperature
xy_Ps(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1) :real(DP), intent(out)
: Ps . 地表面気圧. Surface pressure
xyz_QVap(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: q . 比湿. Specific humidity
xyz_U(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out), optional
: U . 東西風速. Zonal wind
xyz_V(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out), optional
: V . 南北風速. Meridional wind
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

与えられたスペクトル値から格子点値を計算します. 地表面気圧 Ps のみ, π=lnPs のスペクトル値を 受け取り, Ps の格子点値を返します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Calculate grid values from given spectral values. Only surface pressure Ps , spectral π=lnPs is recipient, and Ps on grids is returned.

If dyn_sp is not initialized by Create yet, error is occurred.

Alias for DynSpectralSpectral2Grid

Tendency( dyn_sp, xyz_UAdv, xyz_VAdv, xyz_KE, xyz_TempUAdv, xyz_TempVAdv, xyz_DTempDt, xy_DPiDt, xyz_QVapUAdv, xyz_QVapVAdv, xyz_DQVapDt, wz_DVorDt, wz_DDivDt, wz_DTempDt, w_DPiDt, wz_DQVapDt, [err] )
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
xyz_UAdv(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: UA . 東西運動量移流項. Zonal advection of momentum
xyz_VAdv(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: VA . 南北運動量移流項. Meridional advection of momentum
xyz_KE(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: E . 運動エネルギー項. Kinematic energy
xyz_TempUAdv(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: UT . 温度東西移流項. Zonal advection of temperature
xyz_TempVAdv(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: VT . 温度南北移流項. Meridional advection of temperature
xyz_DTempDt(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: H . 温度時間変化項. Temperature tendency
xy_DPiDt(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1) :real(DP), intent(in)
: Z . 地表面気圧時間変化項. Surface pressure tendency
xyz_QVapUAdv(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: Uq . 比湿東西移流項. Zonal advection of specific humidity
xyz_QVapVAdv(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: Vq . 比湿南北移流項. Meridional advection of specific humidity
xyz_DQVapDt(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: R . 比湿時間変化項. Specific humidity tendency
wz_DVorDt((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: dζdt . 渦度変化 (スペクトル). Vorticity tendency (spectral)
wz_DDivDt((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: dDdt . 発散変化 (スペクトル). Divergence tendency (spectral)
wz_DTempDt((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: dTdt . 温度変化 (スペクトル). Temperature tendency (spectral)
w_DPiDt((dyn_sp%nmax+1)**2) :real(DP), intent(out)
: dPsdt . 地表面気圧変化 (スペクトル). Surface pressure tendency (spectral)
wz_DQVapDt((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: dqdt . 比湿変化 (スペクトル). Specific humidity tendency (spectral)
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

与えられた格子点値 (移流項, 運動エネルギー項, 温度変化項 H , 比湿変化項 R ) から, スペクトルの時間変化項 (渦度, 発散, 温度, 地表面気圧, 比湿) を計算します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Calculate spectral tendency terms (vorticity, divergence, temperature, surface pressure, specific humidity) from grid points values (advection, kinetic energy, and temperature tendency H , specific humidity tendency R ).

If dyn_sp is not initialized by Create yet, error is occurred.

Alias for DynSpectralTendency

UV2VorDiv( dyn_sp, xyz_U, xyz_V, xyz_Vor, xyz_Div, [err] )
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
xyz_U(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: U . 東西風速. Zonal wind
xyz_V(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: V . 南北風速. Meridional wind
xyz_Vor(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: ζ . 渦度. Vorticity
xyz_Div(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: D . 発散. Divergence
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

与えられた東西風速と南北風速から渦度と発散を計算します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Calculate vorticity and divergence from given zonal and meridional wind.

If dyn_sp is not initialized by Create yet, error is occurred.

Alias for DynSpectralUV2VorDiv

VorDiv2UV( dyn_sp, xyz_Vor, xyz_Div, xyz_U, xyz_V, [err] )
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
xyz_Vor(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: ζ . 渦度. Vorticity
xyz_Div(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: D . 発散. Divergence
xyz_U(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: U . 東西風速. Zonal wind
xyz_V(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: V . 南北風速. Meridional wind
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

与えられた渦度と発散から東西風速と南北風速を計算します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Calculate zonal and meridional wind from given vorticity and divergence.

If dyn_sp is not initialized by Create yet, error is occurred.

Alias for DynSpectralVorDiv2UV

initialized( dyn_sp ) result(result)
Function :
result :logical
dyn_sp :type(DYNSP), intent(in)

dyn_sp が初期設定されている場合には .true. が, 初期設定されていない場合には .false. が返ります.

If dyn_sp is initialized, .true. is returned. If dyn_sp is not initialized, .false. is returned.

Alias for DynSpectralInitialized

Private Instance methods

Subroutine :
dyn_sp :type(DYNSP), intent(inout)
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

引数 dyn_sp に設定された内容を空にします. DYNSP 型の 変数に関して再利用する際に使用します. この手続きによって 空となった変数は再度 Create によって初期化して使用します. なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Deconstructor of "DYNSP". Note that if dyn_sp is not initialized by Create yet, error is occurred.

[Source]

  subroutine DynSpectralClose( dyn_sp, err )
    !
    ! 引数 *dyn_sp* に設定された内容を空にします. DYNSP 型の
    ! 変数に関して再利用する際に使用します. この手続きによって
    ! 空となった変数は再度 Create によって初期化して使用します.
    ! なお, 与えられた *dyn_sp* が Create によって初期設定
    ! されていない場合, プログラムはエラーを発生させます.
    !
    ! Deconstructor of "DYNSP".
    ! Note that if *dyn_sp* is not initialized by Create yet,
    ! error is occurred.
    !
    use dc_trace, only: BeginSub, EndSub
    use dc_types, only: STRING, STDOUT
    use dcpam_error, only: StoreError, DC_NOERR, DCPAM_ENOTINIT
    implicit none
    type(DYNSP), intent(inout):: dyn_sp
    logical, intent(out), optional:: err
                              ! 例外処理用フラグ.
                              ! デフォルトでは, この手続き内でエラーが
                              ! 生じた場合, プログラムは強制終了します.
                              ! 引数 *err* が与えられる場合,
                              ! プログラムは強制終了せず, 代わりに
                              ! *err* に .true. が代入されます.
                              !
                              ! Exception handling flag. 
                              ! By default, when error occur in 
                              ! this procedure, the program aborts. 
                              ! If this *err* argument is given, 
                              ! .true. is substituted to *err* and 
                              ! the program does not abort. 
    integer:: stat
    character(STRING):: cause_c
    character(*), parameter:: subname = 'DynSpectralClose'
  continue
    call BeginSub(subname)
    stat = DC_NOERR
    cause_c = ''

    !-----------------------------------------------------------------
    !  初期設定のチェック
    !  Check initialization
    !-----------------------------------------------------------------
    if (.not. dyn_sp % initialized) then
      stat = DCPAM_ENOTINIT
      cause_c = 'DYNSP'
      goto 999
    end if

    !-----------------------------------------------------------------
    !  "DYNSP" の設定の消去
    !  Clear the settings for "DYNSP"
    !-----------------------------------------------------------------
    deallocate( dyn_sp % xy_Cori )
    deallocate( dyn_sp % xy_UVFact )
    deallocate( dyn_sp % wz_DiffVorDiv )
    deallocate( dyn_sp % wz_DiffTherm )
    deallocate( dyn_sp % xy_Phis )

    !-----------------------------------------------------------------
    !  終了処理, 例外処理
    !  Termination and Exception handling
    !-----------------------------------------------------------------
    dyn_sp % initialized = .false.
999 continue
    call StoreError(stat, subname, err, cause_c)
    call EndSub(subname)
  end subroutine DynSpectralClose
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
nmax :integer, intent(in)
: 最大全波数. Maximum truncated wavenumber
imax :integer, intent(in)
: 経度格子点数. Number of grid points in longitude
jmax :integer, intent(in)
: 緯度格子点数. Number of grid points in latitude
kmax :integer, intent(in)
: 鉛直層数. Number of vertical level
PI :real(DP), intent(in)
: π . 円周率. Circular constant
RPlanet :real(DP), intent(in)
: a . 惑星半径. Radius of planet
Grav :real(DP), intent(in)
: g . 重力加速度. Gravitational acceleration
Omega :real(DP), intent(in)
: Ω . 回転角速度. Angular velocity
Cp :real(DP), intent(in)
: Cp . 大気定圧比熱. Specific heat of air at constant pressure
RAir :real(DP), intent(in)
: R . 大気気体定数. Gas constant of air
VisOrder :integer, intent(in)
: 超粘性の次数. Order of hyper-viscosity
EFoldTime :real(DP), intent(in)
: 最大波数に対する e-folding time. E-folding time for maximum wavenumber
DelTime :real(DP), intent(in)
: Δt . タイムステップ. Time step
xy_Phis(0:imax-1, 0:jmax-1) :real(DP), intent(in), optional
: Φs . 地表ジオポテンシャル. Surface geo-potential
openmp_threads :integer, intent(in), optional
: OPENMP での最大スレッド数. openmp_threads に 1 より大きな値を指定すれば ISPACK の球面調和函数変換 OPENMP 並列計算 ルーチンが用いられる. 並列計算を実行するには, 実行時に環境変数 OMP_NUM_THREADS を openmp_threads 以下の数字に設定する 等のシステムに応じた準備が必要となる.

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

nmlfile :character(*), intent(in), optional
: NAMELIST ファイルの名称. この引数に空文字以外を与えた場合, 指定されたファイルから NAMELIST 変数群を読み込みます. ファイルを読み込めない場合にはエラーを 生じます.

NAMELIST file name. If nonnull character is specified to this argument, NAMELIST group name is loaded from the file. If the file can not be read, an error occurs.

err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

引数 dyn_sp にスペクトル法を用いた演算の設定を行います. 他のサブルーチンを使用する前に必ずこのサブルーチンによって DYNSP 型の変数を初期設定してください. なお, 与えられた dyn_sp が既に初期設定されている場合, プログラムはエラーを発生させます.

NAMELIST を利用する場合には引数 nmlfileNAMELIST ファイル名 を与えてください.

Configure the settings for spectral method to dyn_sp. Initialize dyn_sp by this subroutine, before other procedures are used, Note that if dyn_sp is already initialized by this procedure, error is occurred.

In order to use NAMELIST, specify a NAMELIST filename to argument nmlfile.

[Source]

  subroutine DynSpectralCreate( dyn_sp, nmax, imax, jmax, kmax, PI, RPlanet, Grav, Omega, Cp, RAir, VisOrder, EFoldTime, DelTime, xy_Phis, openmp_threads, nmlfile, err )
    !
    ! 引数 *dyn_sp* にスペクトル法を用いた演算の設定を行います.
    ! 他のサブルーチンを使用する前に必ずこのサブルーチンによって
    ! DYNSP 型の変数を初期設定してください.
    ! なお, 与えられた *dyn_sp* が既に初期設定されている場合,
    ! プログラムはエラーを発生させます.
    !
    ! NAMELIST を利用する場合には引数 *nmlfile* に NAMELIST ファイル名
    ! を与えてください.
    !
    ! Configure the settings for spectral method to *dyn_sp*.
    ! Initialize *dyn_sp* by this subroutine, 
    ! before other procedures are used, 
    ! Note that if *dyn_sp* is already initialized 
    ! by this procedure, error is occurred.
    !
    ! In order to use NAMELIST, specify a NAMELIST filename to 
    ! argument *nmlfile*.
    !
    use wa_module, only: wa_Initial, xy_Lat
    use w_module, only: rn
    use dc_types, only: DP, STRING
    use dc_present, only: present_and_not_empty, present_and_true
    use dc_message, only: MessageNotify
    use dc_trace, only: BeginSub, EndSub, DbgMessage
    use dc_error, only: DC_ENOFILEREAD
    use dcpam_error, only: StoreError, DC_NOERR, DCPAM_EALREADYINIT, DCPAM_ENEGATIVE
    implicit none
    type(DYNSP), intent(inout):: dyn_sp
    integer, intent(in):: nmax ! 最大全波数. 
                               ! Maximum truncated wavenumber
    integer, intent(in):: imax ! 経度格子点数. 
                               ! Number of grid points in longitude
    integer, intent(in):: jmax ! 緯度格子点数. 
                               ! Number of grid points in latitude
    integer, intent(in):: kmax ! 鉛直層数. 
                               ! Number of vertical level
    real(DP), intent(in):: PI         ! $ \pi $ .    円周率.         Circular constant
    real(DP), intent(in):: RPlanet    ! $ a $ .      惑星半径.       Radius of planet
    real(DP), intent(in):: Omega      ! $ \Omega $ . 回転角速度.     Angular velocity
    real(DP), intent(in):: Grav       ! $ g $ .      重力加速度.     Gravitational acceleration
    real(DP), intent(in):: Cp         ! $ C_p $ .    大気定圧比熱.   Specific heat of air at constant pressure
    real(DP), intent(in):: RAir       ! $ R $ .      大気気体定数.   Gas constant of air
    integer, intent(in):: VisOrder    ! 超粘性の次数.  Order of hyper-viscosity
    real(DP), intent(in):: EFoldTime  ! 最大波数に対する e-folding time. E-folding time for maximum wavenumber
    real(DP), intent(in):: DelTime    ! $ \Delta t $ . タイムステップ. Time step
    real(DP), intent(in), optional:: xy_Phis (0:imax-1, 0:jmax-1)
                              ! $ \Phi_s $ . 地表ジオポテンシャル. 
                              ! Surface geo-potential
    integer, intent(in), optional:: openmp_threads
                              ! OPENMP での最大スレッド数.
                              ! openmp_threads に 1 より大きな値を指定すれば 
                              ! ISPACK[http://www.gfd-dennou.org/library/ispack/] 
                              ! の球面調和函数変換 OPENMP 並列計算
                              ! ルーチンが用いられる. 並列計算を実行するには,
                              ! 実行時に環境変数 OMP_NUM_THREADS 
                              ! を openmp_threads 以下の数字に設定する
                              ! 等のシステムに応じた準備が必要となる.
                              !
                              ! openmp_threads に 1 より大きな値を
                              ! 指定しなければ並列計算ルーチンは呼ばれない.

    character(*), intent(in), optional :: nmlfile
                              ! NAMELIST ファイルの名称. 
                              ! この引数に空文字以外を与えた場合, 
                              ! 指定されたファイルから 
                              ! NAMELIST 変数群を読み込みます. 
                              ! ファイルを読み込めない場合にはエラーを
                              ! 生じます.
                              !
                              ! NAMELIST file name. 
                              ! If nonnull character is specified to
                              ! this argument, 
                              ! NAMELIST group name is loaded from the 
                              ! file. 
                              ! If the file can not be read, 
                              ! an error occurs.
                              ! 
    logical, intent(out), optional:: err
                              ! 例外処理用フラグ.
                              ! デフォルトでは, この手続き内でエラーが
                              ! 生じた場合, プログラムは強制終了します.
                              ! 引数 *err* が与えられる場合,
                              ! プログラムは強制終了せず, 代わりに
                              ! *err* に .true. が代入されます.
                              !
                              ! Exception handling flag. 
                              ! By default, when error occur in 
                              ! this procedure, the program aborts. 
                              ! If this *err* argument is given, 
                              ! .true. is substituted to *err* and 
                              ! the program does not abort. 

    integer:: k               ! DO ループ用作業変数
                              ! Work variables for DO loop
    integer:: stat
    character(STRING):: cause_c
    real(DP):: wz_rn ((nmax+1)**2, 0:kmax-1)
                              ! $ -n \times (n+1) $ . ラプラシアンの係数. 
                              ! Laplacian coefficient
    real(DP):: VisCoef        ! 超粘性係数. Hyper-viscosity coefficient
    character(*), parameter:: subname = 'DynSpectralCreate'
  continue
    call BeginSub(subname, version)
    stat = DC_NOERR
    cause_c = ''

    !-----------------------------------------------------------------
    !  初期設定のチェック
    !  Check initialization
    !-----------------------------------------------------------------
    if (dyn_sp % initialized) then
      stat = DCPAM_EALREADYINIT
      cause_c = 'DYNSP'
      goto 999
    end if

    !-----------------------------------------------------------------
    !  引数の正当性のチェック
    !  Validation of arguments
    !-----------------------------------------------------------------
    if (nmax < 1) then
      stat = DCPAM_ENEGATIVE
      cause_c = 'nmax'
      goto 999
    end if
    if (imax < 1) then
      stat = DCPAM_ENEGATIVE
      cause_c = 'imax'
      goto 999
    end if
    if (jmax < 1) then
      stat = DCPAM_ENEGATIVE
      cause_c = 'jmax'
      goto 999
    end if
    if (kmax < 1) then
      stat = DCPAM_ENEGATIVE
      cause_c = 'kmax'
      goto 999
    end if

    !-----------------------------------------------------------------
    !  spml ライブラリ wa_module の初期設定
    !  Initialization of "wa_module" of "spml" library
    !-----------------------------------------------------------------
    if (present(openmp_threads)) then
      if (openmp_threads > 1) then
        dyn_sp % openmp_threads = openmp_threads
      end if
    end if

    !-------------------------
    !  NAMELIST からの値
    !  Values from NAMELIST

    if ( present_and_not_empty(nmlfile) ) then
      call MessageNotify( 'M', subname, 'Loading NAMELIST file "%c" ...', c1=trim(nmlfile) )
      call NmlRead ( nmlfile = nmlfile, openmp_threads = dyn_sp % openmp_threads, err = err )                          ! (out)
      if ( present_and_true(err) ) then
        call MessageNotify( 'W', subname, '"%c" can not be read.', c1=trim(nmlfile) )
        stat = DC_ENOFILEREAD
        cause_c = nmlfile
        goto 999
      end if
    end if

    if (wa_module_initialized) then
      call MessageNotify('W', subname, 'spml library wa_module can not be initialized more than once.' // ' Object (DYNSP) was not initialized.')
      goto 999
    else
      if (dyn_sp % openmp_threads < 2) then
        call wa_Initial(nmax, imax, jmax, kmax)
      else
        call wa_Initial(nmax, imax, jmax, kmax, openmp_threads)
      end if
      wa_module_initialized = .true.
    end if

    !-----------------------------------------------------------------
    !  波数・格子点の設定
    !  Configure wave number and grid point
    !-----------------------------------------------------------------
    dyn_sp % nmax = nmax
    dyn_sp % imax = imax
    dyn_sp % jmax = jmax
    dyn_sp % kmax = kmax

    !-----------------------------------------------------------------
    !  物理定数の設定
    !  Configure physical constants
    !-----------------------------------------------------------------
    dyn_sp % PI = PI
    dyn_sp % RPlanet = RPlanet
    dyn_sp % Omega = Omega
    dyn_sp % Grav = Grav
    dyn_sp % Cp = Cp
    dyn_sp % RAir = RAir
    dyn_sp % VisOrder = VisOrder
    dyn_sp % EFoldTime = EFoldTime
    dyn_sp % DelTime = DelTime

    dyn_sp % Kappa = RAir / Cp

    !-----------------------------------------------------------------
    !  コリオリ力, $ u \rightarrow U, v \rightarrow V $ 係数の計算
    !  Calculate Coriolis force, coefficients for 
    !  $ u \rightarrow U, v \rightarrow V $
    !-----------------------------------------------------------------
    allocate( dyn_sp % xy_Cori (0:imax-1, 0:jmax-1) )
    dyn_sp % xy_Cori = 2.0_DP * Omega * sin(xy_Lat)

    allocate( dyn_sp % xy_UVFact (0:imax-1, 0:jmax-1) )
    dyn_sp % xy_UVFact = cos( xy_Lat )

    !-----------------------------------------------------------------
    !  スペクトル演算用係数の設定
    !  Calculate coefficients for spectral calculation
    !-----------------------------------------------------------------
    allocate( dyn_sp % wz_DiffVorDiv ((nmax+1)**2, 0:kmax-1) )
    allocate( dyn_sp % wz_DiffTherm ((nmax+1)**2, 0:kmax-1) )
    do k = 0, kmax-1
      wz_rn(:,k) = rn(:,1)
    enddo

    ! 粘性係数の計算 (最大波数の e-folding time が EFoldTime となるように)
    ! Calculate viscosity coefficient
    VisCoef = (real((nmax*(nmax+1)), DP) / RPlanet**2 )**(-VisOrder / 2) / EFoldTime

    call DbgMessage('VisCoef=<%f>', d=(/VisCoef/))

    dyn_sp % wz_DiffTherm = VisCoef * ( (-wz_rn / RPlanet**2)**(VisOrder / 2) )

    dyn_sp % wz_DiffVorDiv = dyn_sp % wz_DiffTherm + VisCoef * ( - (2.0_DP / RPlanet**2)**(VisOrder / 2))

    !-------------------------------------------------------------------
    !  地形データ (地表 $ \Phi $ ) の設定
    !  Configure geography data (surface $ \Phi $ )
    !-------------------------------------------------------------------
    allocate( dyn_sp % xy_Phis (0:imax-1, 0:jmax-1) )
    if (present(xy_Phis)) then
      dyn_sp % xy_Phis = xy_Phis
    else
      dyn_sp % xy_Phis = 0.0_DP
    end if

    !-----------------------------------------------------------------
    !  終了処理, 例外処理
    !  Termination and Exception handling
    !-----------------------------------------------------------------
    dyn_sp % initialized = .true.
999 continue
    call StoreError(stat, subname, err, cause_c)
    call EndSub(subname)
  end subroutine DynSpectralCreate
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
wz_VorDiff((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: 𝒟(ζ) . 運動量水平拡散による渦度変化 (スペクトル). Vorticity tendency by horizontal momentum diffusion (spectral)
wz_DivDiff((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: 𝒟(D) . 運動量水平拡散による発散変化 (スペクトル). Divergence tendency by horizontal momentum diffusion (spectral)
xyz_U(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: U . 東西風速. Zonal wind.
xyz_V(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: V . 南北風速. Meridional wind.
xyz_Temp(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(inout)
: T . 温度. Temperature
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

運動量水平拡散による摩擦熱補正を計算します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Caluculate frictional thermal correction by horizontal momentum diffusion

If dyn_sp is not initialized by Create yet, error is occurred.

[Source]

  subroutine DynSpectralDiffusionCorrectTemp( dyn_sp, wz_VorDiff, wz_DivDiff, xyz_U, xyz_V, xyz_Temp, err )
    !
    ! 運動量水平拡散による摩擦熱補正を計算します.
    !
    ! なお, 与えられた *dyn_sp* が Create によって初期設定
    ! されていない場合, プログラムはエラーを発生させます.
    !
    ! Caluculate frictional thermal correction by horizontal 
    ! momentum diffusion
    !
    ! If *dyn_sp* is not initialized by Create yet,
    ! error is occurred.
    !
    use dc_trace, only: BeginSub, EndSub
    use dc_types, only: STRING, STDOUT
    use dcpam_error, only: StoreError, DC_NOERR, DCPAM_ENOTINIT
    use wa_module, only: xya_wa
    implicit none
    type(DYNSP), intent(inout):: dyn_sp
    real(DP), intent(in):: wz_VorDiff ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ \mathscr{D}(\zeta) $ . 
                              ! 運動量水平拡散による渦度変化 (スペクトル). 
                              ! Vorticity tendency by 
                              ! horizontal momentum diffusion (spectral)
    real(DP), intent(in):: wz_DivDiff ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ \mathscr{D}(D) $ . 
                              ! 運動量水平拡散による発散変化 (スペクトル). 
                              ! Divergence tendency by 
                              ! horizontal momentum diffusion (spectral)
    real(DP), intent(in):: xyz_U (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ U $ . 東西風速. Zonal wind.
    real(DP), intent(in):: xyz_V (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ V $ . 南北風速. Meridional wind.
    real(DP), intent(inout):: xyz_Temp (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ T $ . 温度. Temperature
    logical, intent(out), optional:: err
                              ! 例外処理用フラグ.
                              ! デフォルトでは, この手続き内でエラーが
                              ! 生じた場合, プログラムは強制終了します.
                              ! 引数 *err* が与えられる場合,
                              ! プログラムは強制終了せず, 代わりに
                              ! *err* に .true. が代入されます.
                              !
                              ! Exception handling flag. 
                              ! By default, when error occur in 
                              ! this procedure, the program aborts. 
                              ! If this *err* argument is given, 
                              ! .true. is substituted to *err* and 
                              ! the program does not abort. 

    !-----------------------------------
    !  作業変数
    !  Work variables
    real(DP):: xyz_UDiff (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! 運動量水平拡散による東西風変化. 
                              ! Zonal wind tendency by 
                              ! horizontal momentum diffusion
    real(DP):: xyz_VDiff (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! 運動量水平拡散による南北風変化. 
                              ! Meridional wind tendency by 
                              ! horizontal momentum diffusion
    real(DP):: Cp      ! $ C_p $ .    大気定圧比熱.   Specific heat of air at constant pressure
    real(DP):: DelTime ! $ \Delta t $ . タイムステップ. Time step

    integer:: stat
    character(STRING):: cause_c
    character(*), parameter:: subname = 'DynSpectralDiffusionCorrectTemp'
  continue
    call BeginSub(subname)
    stat = DC_NOERR
    cause_c = ''

    !-----------------------------------------------------------------
    !  初期設定のチェック
    !  Check initialization
    !-----------------------------------------------------------------
    if (.not. dyn_sp % initialized) then
      stat = DCPAM_ENOTINIT
      cause_c = 'DYNSP'
      goto 999
    end if

    !-----------------------------------------------------------------
    !  *dyn_sp* に格納される物理定数, $ \Delta t $ の取り出し
    !  Fetch physical constant, $ \Delta t $ from *dyn_sp*
    !-----------------------------------------------------------------
    Cp = dyn_sp % Cp
    DelTime = dyn_sp % DelTime

    !-----------------------------------------------------------------
    !  運動量水平拡散による東西風速, 南北風速の時間変化の計算
    !  Caluculate zonal and meridional wind tendency by 
    !  horizontal diffusion of momentum
    !-----------------------------------------------------------------
    call VorDiv2UV( dyn_sp, xya_wa( wz_VorDiff ), xya_wa( wz_DivDiff ), xyz_UDiff, xyz_VDiff ) ! (out)

    !-----------------------------------------------------------------
    !  運動量水平拡散による摩擦熱補正の計算
    !  Caluculate frictional thermal correction by 
    !  horizontal diffusion of momentum
    !-----------------------------------------------------------------
    xyz_Temp = xyz_Temp - (   xyz_U * xyz_UDiff + xyz_V * xyz_VDiff ) / Cp * 2.0_DP * DelTime

    !-----------------------------------------------------------------
    !  終了処理, 例外処理
    !  Termination and Exception handling
    !-----------------------------------------------------------------
999 continue
    call StoreError(stat, subname, err, cause_c)
    call EndSub(subname)
  end subroutine DynSpectralDiffusionCorrectTemp
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
wz_Vor((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: ζ . 渦度 (スペクトル). Vorticity (spectral)
wz_Div((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: D . 発散 (スペクトル). Divergence (spectral)
wz_VorDiff((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: 𝒟(ζ) . 運動量水平拡散による渦度変化 (スペクトル). Vorticity tendency by horizontal momentum diffusion (spectral)
wz_DivDiff((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: 𝒟(D) . 運動量水平拡散による発散変化 (スペクトル). Divergence tendency by horizontal momentum diffusion (spectral)
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

運動量水平拡散による渦度発散の時間変化を計算します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Caluculate vorticity and divergence tendency by horizontal diffusion of momentum

If dyn_sp is not initialized by Create yet, error is occurred.

[Source]

  subroutine DynSpectralDiffusionVorDiv( dyn_sp, wz_Vor, wz_Div, wz_VorDiff, wz_DivDiff, err )
    !
    ! 運動量水平拡散による渦度発散の時間変化を計算します.
    !
    ! なお, 与えられた *dyn_sp* が Create によって初期設定
    ! されていない場合, プログラムはエラーを発生させます.
    !
    ! Caluculate vorticity and divergence tendency by 
    ! horizontal diffusion of momentum
    !
    ! If *dyn_sp* is not initialized by Create yet,
    ! error is occurred.
    !
    use dc_trace, only: BeginSub, EndSub
    use dc_types, only: STRING, STDOUT
    use dcpam_error, only: StoreError, DC_NOERR, DCPAM_ENOTINIT
    implicit none
    type(DYNSP), intent(inout):: dyn_sp
    real(DP), intent(in):: wz_Vor ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ \zeta $ . 渦度 (スペクトル). 
                              ! Vorticity (spectral)
    real(DP), intent(in):: wz_Div ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ D $ . 発散 (スペクトル). 
                              ! Divergence (spectral)
    real(DP), intent(out):: wz_VorDiff ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ \mathscr{D}(\zeta) $ . 
                              ! 運動量水平拡散による渦度変化 (スペクトル). 
                              ! Vorticity tendency by 
                              ! horizontal momentum diffusion (spectral)
    real(DP), intent(out):: wz_DivDiff ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ \mathscr{D}(D) $ . 
                              ! 運動量水平拡散による発散変化 (スペクトル). 
                              ! Divergence tendency by 
                              ! horizontal momentum diffusion (spectral)
    logical, intent(out), optional:: err
                              ! 例外処理用フラグ.
                              ! デフォルトでは, この手続き内でエラーが
                              ! 生じた場合, プログラムは強制終了します.
                              ! 引数 *err* が与えられる場合,
                              ! プログラムは強制終了せず, 代わりに
                              ! *err* に .true. が代入されます.
                              !
                              ! Exception handling flag. 
                              ! By default, when error occur in 
                              ! this procedure, the program aborts. 
                              ! If this *err* argument is given, 
                              ! .true. is substituted to *err* and 
                              ! the program does not abort. 

    !-----------------------------------
    !  作業変数
    !  Work variables
    real(DP):: wz_DiffVorDiv((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ -K_{HD} [(-1)^{N_D/2}\nabla^{N_D}- (2/a^2)^{N_D/2}] $ . 
                              ! 運動量水平拡散係数. 
                              ! Coefficient of horizontal momentum diffusion

    integer:: stat
    character(STRING):: cause_c
    character(*), parameter:: subname = 'DynSpectralDiffusionVorDiv'
  continue
    call BeginSub(subname)
    stat = DC_NOERR
    cause_c = ''

    !-----------------------------------------------------------------
    !  初期設定のチェック
    !  Check initialization
    !-----------------------------------------------------------------
    if (.not. dyn_sp % initialized) then
      stat = DCPAM_ENOTINIT
      cause_c = 'DYNSP'
      goto 999
    end if

    !-----------------------------------------------------------------
    !  *dyn_sp* に格納される拡散係数の取り出し
    !  Fetch diffusion coefficients from *dyn_sp*
    !-----------------------------------------------------------------
    wz_DiffVorDiv = dyn_sp % wz_DiffVorDiv

    !-----------------------------------------------------------------
    !  運動量水平拡散による渦度発散の時間変化の計算
    !  Caluculate vorticity and divergence tendency by 
    !  horizontal diffusion of momentum
    !-----------------------------------------------------------------
    wz_VorDiff = - wz_Vor * wz_DiffVorDiv
    wz_DivDiff = - wz_Div * wz_DiffVorDiv

    !-----------------------------------------------------------------
    !  終了処理, 例外処理
    !  Termination and Exception handling
    !-----------------------------------------------------------------
999 continue
    call StoreError(stat, subname, err, cause_c)
    call EndSub(subname)
  end subroutine DynSpectralDiffusionVorDiv
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
x_Lon(0:dyn_sp%imax-1) :real(DP), intent(out)
: 経度. Longitude
y_Lat(0:dyn_sp%jmax-1) :real(DP), intent(out)
: 緯度. Latitude
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

dyn_sp に格納されている座標値を返します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Return data of axes stored in dyn_sp.

If dyn_sp is not initialized by Create yet, error is occurred.

[Source]

  subroutine DynSpectralGetAxes( dyn_sp, x_Lon, y_Lat, err )
    !
    ! *dyn_sp* に格納されている座標値を返します.
    !
    ! なお, 与えられた *dyn_sp* が Create によって初期設定
    ! されていない場合, プログラムはエラーを発生させます.
    !
    ! Return data of axes stored in *dyn_sp*.
    !
    ! If *dyn_sp* is not initialized by Create yet,
    ! error is occurred.
    !
    use dc_trace, only: BeginSub, EndSub
    use dc_types, only: STRING, STDOUT
    use dcpam_error, only: StoreError, DC_NOERR, DCPAM_ENOTINIT
    use wa_module, only: x_Lon_spml => x_Lon, y_Lat_spml => y_Lat
    implicit none
    type(DYNSP), intent(inout):: dyn_sp
    real(DP), intent(out):: x_Lon (0:dyn_sp%imax-1)
                              ! 経度. Longitude
    real(DP), intent(out):: y_Lat (0:dyn_sp%jmax-1)
                              ! 緯度. Latitude
    logical, intent(out), optional:: err
                              ! 例外処理用フラグ.
                              ! デフォルトでは, この手続き内でエラーが
                              ! 生じた場合, プログラムは強制終了します.
                              ! 引数 *err* が与えられる場合,
                              ! プログラムは強制終了せず, 代わりに
                              ! *err* に .true. が代入されます.
                              !
                              ! Exception handling flag. 
                              ! By default, when error occur in 
                              ! this procedure, the program aborts. 
                              ! If this *err* argument is given, 
                              ! .true. is substituted to *err* and 
                              ! the program does not abort. 
    integer:: stat
    character(STRING):: cause_c
    character(*), parameter:: subname = 'DynSpectralGetAxes'
  continue
    call BeginSub(subname)
    stat = DC_NOERR
    cause_c = ''

    !-----------------------------------------------------------------
    !  初期設定のチェック
    !  Check initialization
    !-----------------------------------------------------------------
    if (.not. dyn_sp % initialized) then
      stat = DCPAM_ENOTINIT
      cause_c = 'DYNSP'
      goto 999
    end if

    !-----------------------------------------------------------------
    !  緯度経度座標値の設定
    !  Configure data of latitude and longitude
    !-----------------------------------------------------------------
    x_Lon = x_Lon_spml
    y_Lat = y_Lat_spml

    !-----------------------------------------------------------------
    !  終了処理, 例外処理
    !  Termination and Exception handling
    !-----------------------------------------------------------------
999 continue
    call StoreError(stat, subname, err, cause_c)
    call EndSub(subname)
  end subroutine DynSpectralGetAxes
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
xy_Cori(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1) :real(DP), intent(out)
: f2Ωsinϕ . コリオリパラメータ. Coriolis parameter
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

コリオリパラメータ f2Ωsinϕ を返します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Return Coriolis parameter f2Ωsinϕ .

If dyn_sp is not initialized by Create yet, error is occurred.

[Source]

  subroutine DynSpectralGetCoriolis( dyn_sp, xy_Cori, err )
    !
    ! コリオリパラメータ $ f\equiv 2\Omega\sin\varphi $ を返します.
    !
    ! なお, 与えられた *dyn_sp* が Create によって初期設定
    ! されていない場合, プログラムはエラーを発生させます.
    !
    ! Return Coriolis parameter $ f\equiv 2\Omega\sin\varphi $ .
    !
    ! If *dyn_sp* is not initialized by Create yet,
    ! error is occurred.
    !
    use dc_trace, only: BeginSub, EndSub
    use dc_types, only: STRING, STDOUT
    use dcpam_error, only: StoreError, DC_NOERR, DCPAM_ENOTINIT
    implicit none
    type(DYNSP), intent(inout):: dyn_sp
    real(DP), intent(out):: xy_Cori (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1)
                              ! $ f\equiv 2\Omega\sin\varphi $ . 
                              ! コリオリパラメータ. Coriolis parameter
    logical, intent(out), optional:: err
                              ! 例外処理用フラグ.
                              ! デフォルトでは, この手続き内でエラーが
                              ! 生じた場合, プログラムは強制終了します.
                              ! 引数 *err* が与えられる場合,
                              ! プログラムは強制終了せず, 代わりに
                              ! *err* に .true. が代入されます.
                              !
                              ! Exception handling flag. 
                              ! By default, when error occur in 
                              ! this procedure, the program aborts. 
                              ! If this *err* argument is given, 
                              ! .true. is substituted to *err* and 
                              ! the program does not abort. 
    integer:: stat
    character(STRING):: cause_c
    character(*), parameter:: subname = 'DynSpectralGetCoriolis'
  continue
    call BeginSub(subname)
    stat = DC_NOERR
    cause_c = ''

    !-----------------------------------------------------------------
    !  初期設定のチェック
    !  Check initialization
    !-----------------------------------------------------------------
    if (.not. dyn_sp % initialized) then
      stat = DCPAM_ENOTINIT
      cause_c = 'DYNSP'
      goto 999
    end if

    !-----------------------------------------------------------------
    !  *dyn_sp* に格納されるコリオリパラメータの取り出し
    !  Fetch Coriolis parameter from *dyn_sp*
    !-----------------------------------------------------------------
    xy_Cori = dyn_sp % xy_Cori

    !-----------------------------------------------------------------
    !  終了処理, 例外処理
    !  Termination and Exception handling
    !-----------------------------------------------------------------
999 continue
    call StoreError(stat, subname, err, cause_c)
    call EndSub(subname)
  end subroutine DynSpectralGetCoriolis
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
wz_DiffVorDiv((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: -KHD[(-1)ND/2ND-(2/a2)ND/2] . 運動量水平拡散係数. Coefficient of horizontal momentum diffusion
wz_DiffTherm((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: -(-1)ND/2KHDND . 熱, 水水平拡散係数. Coefficient of horizontal thermal and water diffusion
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

運動量水平拡散係数と熱, 水水平拡散係数を返します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Return coefficient of horizontal momentum diffusion, and coefficient of horizontal thermal and water diffusion.

If dyn_sp is not initialized by Create yet, error is occurred.

[Source]

  subroutine DynSpectralGetDiffCoeff( dyn_sp, wz_DiffVorDiv, wz_DiffTherm, err )
    !
    ! 運動量水平拡散係数と熱, 水水平拡散係数を返します.
    !
    ! なお, 与えられた *dyn_sp* が Create によって初期設定
    ! されていない場合, プログラムはエラーを発生させます.
    !
    ! Return coefficient of horizontal momentum diffusion, 
    ! and coefficient of horizontal thermal and water diffusion.
    !
    ! If *dyn_sp* is not initialized by Create yet,
    ! error is occurred.
    !
    use dc_trace, only: BeginSub, EndSub
    use dc_types, only: STRING, STDOUT
    use dcpam_error, only: StoreError, DC_NOERR, DCPAM_ENOTINIT
    implicit none
    type(DYNSP), intent(inout):: dyn_sp
    real(DP), intent(out):: wz_DiffVorDiv ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ -K_{HD} [(-1)^{N_D/2}\nabla^{N_D}- (2/a^2)^{N_D/2}] $ . 
                              ! 運動量水平拡散係数. 
                              ! Coefficient of horizontal momentum diffusion
    real(DP), intent(out):: wz_DiffTherm ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ -(-1)^{N_D/2}K_{HD}\nabla^{N_D} $ . 
                              ! 熱, 水水平拡散係数. 
                              ! Coefficient of horizontal thermal and water diffusion

    logical, intent(out), optional:: err
                              ! 例外処理用フラグ.
                              ! デフォルトでは, この手続き内でエラーが
                              ! 生じた場合, プログラムは強制終了します.
                              ! 引数 *err* が与えられる場合,
                              ! プログラムは強制終了せず, 代わりに
                              ! *err* に .true. が代入されます.
                              !
                              ! Exception handling flag. 
                              ! By default, when error occur in 
                              ! this procedure, the program aborts. 
                              ! If this *err* argument is given, 
                              ! .true. is substituted to *err* and 
                              ! the program does not abort. 
    integer:: stat
    character(STRING):: cause_c
    character(*), parameter:: subname = 'DynSpectralGetDiffCoeff'
  continue
    call BeginSub(subname)
    stat = DC_NOERR
    cause_c = ''

    !-----------------------------------------------------------------
    !  初期設定のチェック
    !  Check initialization
    !-----------------------------------------------------------------
    if (.not. dyn_sp % initialized) then
      stat = DCPAM_ENOTINIT
      cause_c = 'DYNSP'
      goto 999
    end if

    !-----------------------------------------------------------------
    !  *dyn_sp* に格納される拡散係数の取り出し
    !  Fetch diffusion coefficients from *dyn_sp*
    !-----------------------------------------------------------------
    wz_DiffVorDiv = dyn_sp % wz_DiffVorDiv
    wz_DiffTherm = dyn_sp % wz_DiffTherm

    !-----------------------------------------------------------------
    !  終了処理, 例外処理
    !  Termination and Exception handling
    !-----------------------------------------------------------------
999 continue
    call StoreError(stat, subname, err, cause_c)
    call EndSub(subname)
  end subroutine DynSpectralGetDiffCoeff
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
w_Phis((dyn_sp%nmax+1)**2) :real(DP), intent(out)
: Φs . 地表ジオポテンシャル. Surface geo-potential
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

地形データ (地表 Φ ) のスペクトル値を返します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Return spectral geography data (surface Φ ).

If dyn_sp is not initialized by Create yet, error is occurred.

[Source]

  subroutine DynSpectralGetPhis( dyn_sp, w_Phis, err )
    !
    ! 地形データ (地表 $ \Phi $ ) のスペクトル値を返します.
    !
    ! なお, 与えられた *dyn_sp* が Create によって初期設定
    ! されていない場合, プログラムはエラーを発生させます.
    !
    ! Return spectral geography data (surface $ \Phi $ ).
    !
    ! If *dyn_sp* is not initialized by Create yet,
    ! error is occurred.
    !
    use dc_trace, only: BeginSub, EndSub
    use dc_types, only: STRING, STDOUT
    use dcpam_error, only: StoreError, DC_NOERR, DCPAM_ENOTINIT
    use wa_module, only: w_xy
    implicit none
    type(DYNSP), intent(inout):: dyn_sp
    real(DP), intent(out):: w_Phis ((dyn_sp%nmax+1)**2)
                              ! $ \Phi_s $ . 地表ジオポテンシャル. 
                              ! Surface geo-potential
    logical, intent(out), optional:: err
                              ! 例外処理用フラグ.
                              ! デフォルトでは, この手続き内でエラーが
                              ! 生じた場合, プログラムは強制終了します.
                              ! 引数 *err* が与えられる場合,
                              ! プログラムは強制終了せず, 代わりに
                              ! *err* に .true. が代入されます.
                              !
                              ! Exception handling flag. 
                              ! By default, when error occur in 
                              ! this procedure, the program aborts. 
                              ! If this *err* argument is given, 
                              ! .true. is substituted to *err* and 
                              ! the program does not abort. 
    integer:: stat
    character(STRING):: cause_c
    character(*), parameter:: subname = 'DynSpectralGetPhis'
  continue
    call BeginSub(subname)
    stat = DC_NOERR
    cause_c = ''

    !-----------------------------------------------------------------
    !  初期設定のチェック
    !  Check initialization
    !-----------------------------------------------------------------
    if (.not. dyn_sp % initialized) then
      stat = DCPAM_ENOTINIT
      cause_c = 'DYNSP'
      goto 999
    end if

    !-------------------------------------------------------------------
    !  地形データ (地表 $ \Phi $ ) のスペクトル値の計算
    !  Calculate spectral geography data (surface $ \Phi $ )
    !-------------------------------------------------------------------
    w_Phis = w_xy( dyn_sp % xy_Phis )

    !-----------------------------------------------------------------
    !  終了処理, 例外処理
    !  Termination and Exception handling
    !-----------------------------------------------------------------
999 continue
    call StoreError(stat, subname, err, cause_c)
    call EndSub(subname)
  end subroutine DynSpectralGetPhis
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
nmo(1:2, 0:dyn_sp%nmax, 0:dyn_sp%nmax) :integer, intent(out)
: スペクトルの添字順番. Spectral subscript expression
wz_rn((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: -n×(n+1) . ラプラシアンの係数. Laplacian coefficient
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

スペクトルの添字順序とラプラシアンの係数を返します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Return spectral subscript expression, and Laplacian coefficient.

If dyn_sp is not initialized by Create yet, error is occurred.

[Source]

  subroutine DynSpectralGetSpectralCoeff( dyn_sp, nmo, wz_rn, err )
    !
    ! スペクトルの添字順序とラプラシアンの係数を返します.
    !
    ! なお, 与えられた *dyn_sp* が Create によって初期設定
    ! されていない場合, プログラムはエラーを発生させます.
    !
    ! Return spectral subscript expression, and 
    ! Laplacian coefficient.
    !
    ! If *dyn_sp* is not initialized by Create yet,
    ! error is occurred.
    !
    use dc_trace, only: BeginSub, EndSub
    use dc_types, only: STRING, STDOUT
    use dcpam_error, only: StoreError, DC_NOERR, DCPAM_ENOTINIT
    use wa_module, only: l_nm
    use w_module, only: rn
    implicit none
    type(DYNSP), intent(inout):: dyn_sp
    integer, intent(out):: nmo (1:2, 0:dyn_sp%nmax, 0:dyn_sp%nmax)
                              ! スペクトルの添字順番. 
                              ! Spectral subscript expression
    real(DP), intent(out):: wz_rn ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ -n \times (n+1) $ . ラプラシアンの係数. 
                              ! Laplacian coefficient
    logical, intent(out), optional:: err
                              ! 例外処理用フラグ.
                              ! デフォルトでは, この手続き内でエラーが
                              ! 生じた場合, プログラムは強制終了します.
                              ! 引数 *err* が与えられる場合,
                              ! プログラムは強制終了せず, 代わりに
                              ! *err* に .true. が代入されます.
                              !
                              ! Exception handling flag. 
                              ! By default, when error occur in 
                              ! this procedure, the program aborts. 
                              ! If this *err* argument is given, 
                              ! .true. is substituted to *err* and 
                              ! the program does not abort. 

    !-----------------------------------
    !  作業変数
    !  Work variables
    integer:: kmax            ! 鉛直層数. 
                              ! Number of vertical level
    integer:: nmax            ! 最大全波数. 
                              ! Maximum truncated wavenumber
    integer:: mmax            ! 最大東西波数. 
                              ! Maximum truncated zonal wavenumber
    integer:: lmax            ! 最大南北波数. 
                              ! Maximum truncated meridional wavenumber
    integer:: k, l, m         ! DO ループ用作業変数
                              ! Work variables for DO loop

    integer:: stat
    character(STRING):: cause_c
    character(*), parameter:: subname = 'DynSpectralGetSpectralCoeff'
  continue
    call BeginSub(subname)
    stat = DC_NOERR
    cause_c = ''

    !-----------------------------------------------------------------
    !  初期設定のチェック
    !  Check initialization
    !-----------------------------------------------------------------
    if (.not. dyn_sp % initialized) then
      stat = DCPAM_ENOTINIT
      cause_c = 'DYNSP'
      goto 999
    end if

    !-----------------------------------------------------------------
    !  スペクトルの添字順番の取り出し
    !  Fetch spectral subscript expression
    !-----------------------------------------------------------------
    nmax = dyn_sp % nmax
    mmax = dyn_sp % nmax
    lmax = dyn_sp % nmax

    nmo = 0
    do l = 0, lmax
      do m = 0, min(mmax, nmax-l)
        nmo(1,m,l) = l_nm(m+l,  m)
        nmo(2,m,l) = l_nm(m+l, -m)
      enddo
    enddo

    !-----------------------------------------------------------------
    !  ラプラシアンの係数 $ -n \times (n+1) $ の取り出し
    !  Fetch Laplacian coefficient $ -n \times (n+1) $
    !-----------------------------------------------------------------
    kmax = dyn_sp % kmax
    do k = 0, kmax-1
      wz_rn(:,k) = rn(:,1)
    enddo

    !-----------------------------------------------------------------
    !  終了処理, 例外処理
    !  Termination and Exception handling
    !-----------------------------------------------------------------
999 continue
    call StoreError(stat, subname, err, cause_c)
    call EndSub(subname)
  end subroutine DynSpectralGetSpectralCoeff
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
xy_Ps(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1) :real(DP), intent(in)
: Ps 地表面気圧. Surface pressure
xy_GradLonPi(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1) :real(DP), intent(out)
: dπdx
xy_GradLatPi(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1) :real(DP), intent(out)
: dπdy
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

与えられた地表面気圧 Ps から, 地表面気圧の空間変化 dπdx および dπdy を返す. なお, π=lnPs である.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

From given surface presure Ps, spatial variations of surface pressure dπdx and dπdy are returned, where π=lnPs.

If dyn_sp is not initialized by Create yet, error is occurred.

[Source]

  subroutine DynSpectralGradPi( dyn_sp, xy_Ps, xy_GradLonPi, xy_GradLatPi, err )
    !
    ! 与えられた地表面気圧 $ P_s $ から, 
    ! 地表面気圧の空間変化 $ \DD{\pi}{x} $ および $ \DD{\pi}{y} $ を返す. 
    ! なお, $ \pi = \ln P_s $ である.
    !
    ! なお, 与えられた *dyn_sp* が Create によって初期設定
    ! されていない場合, プログラムはエラーを発生させます.
    !
    ! From given surface presure $ P_s $, 
    ! spatial variations of surface pressure 
    ! $ \DD{\pi}{x} $ and $ \DD{\pi}{y} $ are returned, where
    ! $ \pi = \ln P_s $.
    !
    ! If *dyn_sp* is not initialized by Create yet,
    ! error is occurred.
    !
    use dc_trace, only: BeginSub, EndSub
    use dc_types, only: STRING, STDOUT
    use dcpam_error, only: StoreError, DC_NOERR, DCPAM_ENOTINIT
    use wa_module, only: xy_GradLon_w, xy_GradLat_w, w_xy
    implicit none
    type(DYNSP), intent(inout):: dyn_sp
    real(DP), intent(in):: xy_Ps (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1)
                              ! $ P_s $ 地表面気圧. 
                              ! Surface pressure
    real(DP), intent(out):: xy_GradLonPi (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1)
                              ! $ \DD{\pi}{x} $
    real(DP), intent(out):: xy_GradLatPi (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1)
                              ! $ \DD{\pi}{y} $
    logical, intent(out), optional:: err
                              ! 例外処理用フラグ.
                              ! デフォルトでは, この手続き内でエラーが
                              ! 生じた場合, プログラムは強制終了します.
                              ! 引数 *err* が与えられる場合,
                              ! プログラムは強制終了せず, 代わりに
                              ! *err* に .true. が代入されます.
                              !
                              ! Exception handling flag. 
                              ! By default, when error occur in 
                              ! this procedure, the program aborts. 
                              ! If this *err* argument is given, 
                              ! .true. is substituted to *err* and 
                              ! the program does not abort. 

    real(DP):: xy_Pi (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1)
                              ! $ \pi = \ln P_s $
    real(DP):: w_Pi ((dyn_sp%nmax+1)**2)
                              ! $ \pi $ スペクトル

    integer:: stat
    character(STRING):: cause_c
    character(*), parameter:: subname = 'DynSpectralGradPi'
  continue
    call BeginSub(subname)
    stat = DC_NOERR
    cause_c = ''

    !-----------------------------------------------------------------
    !  初期設定のチェック
    !  Check initialization
    !-----------------------------------------------------------------
    if (.not. dyn_sp % initialized) then
      stat = DCPAM_ENOTINIT
      cause_c = 'DYNSP'
      goto 999
    end if

    !-----------------------------------------------------------------
    !  地表面気圧の空間変化の計算
    !  Calculate spatial surface pressure tendency
    !-----------------------------------------------------------------
    xy_Pi = log( xy_Ps )
    w_Pi = w_xy( xy_Pi )
    xy_GradLonPi = xy_GradLon_w( w_Pi )
    xy_GradLatPi = xy_GradLat_w( w_Pi )

    !-----------------------------------------------------------------
    !  終了処理, 例外処理
    !  Termination and Exception handling
    !-----------------------------------------------------------------
999 continue
    call StoreError(stat, subname, err, cause_c)
    call EndSub(subname)
  end subroutine DynSpectralGradPi
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
xyz_Vor(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: ζ . 渦度. Vorticity
xyz_Div(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: D . 発散. Divergence
xyz_Temp(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: T . 温度. Temperature
xy_Ps(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1) :real(DP), intent(in)
: Ps . 地表面気圧. Surface pressure
xyz_QVap(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: q . 比湿. Specific humidity
wz_Vor((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: ζ . 渦度 (スペクトル). Vorticity (spectral)
wz_Div((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: D . 発散 (スペクトル). Divergence (spectral)
wz_Temp((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: T . 温度 (スペクトル). Temperature (spectral)
w_Pi((dyn_sp%nmax+1)**2) :real(DP), intent(out)
: π=lnPs . 地表面気圧 (スペクトル). Surface pressure (spectral)
wz_QVap((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: q . 比湿 (スペクトル). Specific humidity (spectral)
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

与えられた格子点値からスペクトル値を計算します. 地表面気圧 Ps のみ, π=lnPs の値を 返します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Calculate spectral values from given grid values. Only surface pressure Ps , π=lnPs is returned.

If dyn_sp is not initialized by Create yet, error is occurred.

[Source]

  subroutine DynSpectralGrid2Spectral( dyn_sp, xyz_Vor, xyz_Div, xyz_Temp, xy_Ps, xyz_QVap, wz_Vor, wz_Div, wz_Temp, w_Pi, wz_QVap, err )
    !
    ! 与えられた格子点値からスペクトル値を計算します.
    ! 地表面気圧 $ P_s $ のみ, $ \pi = \ln P_s $ の値を
    ! 返します.
    !
    ! なお, 与えられた *dyn_sp* が Create によって初期設定
    ! されていない場合, プログラムはエラーを発生させます.
    !
    ! Calculate spectral values from given grid values.
    ! Only surface pressure $ P_s $ , $ \pi = \ln P_s $ is returned.
    !
    ! If *dyn_sp* is not initialized by Create yet,
    ! error is occurred.
    !
    use dc_trace, only: BeginSub, EndSub
    use dc_types, only: STRING, STDOUT
    use dcpam_error, only: StoreError, DC_NOERR, DCPAM_ENOTINIT
    use wa_module, only: wa_xya, w_xy
    implicit none
    type(DYNSP), intent(inout):: dyn_sp
    real(DP), intent(in):: xyz_Vor (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ \zeta $ . 渦度. Vorticity
    real(DP), intent(in):: xyz_Div (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ D $ .     発散. Divergence
    real(DP), intent(in):: xyz_Temp (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ T $ .     温度. Temperature
    real(DP), intent(in):: xyz_QVap (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ q $ .     比湿. Specific humidity
    real(DP), intent(in):: xy_Ps (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1)
                              ! $ P_s $ .   地表面気圧. Surface pressure
    real(DP), intent(out):: wz_Vor ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ \zeta $ . 渦度 (スペクトル). 
                              ! Vorticity (spectral)
    real(DP), intent(out):: wz_Div ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ D $ . 発散 (スペクトル). 
                              ! Divergence (spectral)
    real(DP), intent(out):: wz_Temp ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ T $ . 温度 (スペクトル). 
                              ! Temperature (spectral)
    real(DP), intent(out):: w_Pi ((dyn_sp%nmax+1)**2)
                              ! $ \pi = \ln P_s $ . 地表面気圧 (スペクトル). 
                              ! Surface pressure (spectral)
    real(DP), intent(out):: wz_QVap ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ q $ . 比湿 (スペクトル). 
                              ! Specific humidity (spectral)

    logical, intent(out), optional:: err
                              ! 例外処理用フラグ.
                              ! デフォルトでは, この手続き内でエラーが
                              ! 生じた場合, プログラムは強制終了します.
                              ! 引数 *err* が与えられる場合,
                              ! プログラムは強制終了せず, 代わりに
                              ! *err* に .true. が代入されます.
                              !
                              ! Exception handling flag. 
                              ! By default, when error occur in 
                              ! this procedure, the program aborts. 
                              ! If this *err* argument is given, 
                              ! .true. is substituted to *err* and 
                              ! the program does not abort. 
    integer:: stat
    character(STRING):: cause_c
    character(*), parameter:: subname = 'DynSpectralGrid2Spectral'
  continue
    call BeginSub(subname)
    stat = DC_NOERR
    cause_c = ''

    !-----------------------------------------------------------------
    !  初期設定のチェック
    !  Check initialization
    !-----------------------------------------------------------------
    if (.not. dyn_sp % initialized) then
      stat = DCPAM_ENOTINIT
      cause_c = 'DYNSP'
      goto 999
    end if

    !-------------------------------------------------------------------
    !  渦度のスペクトル正変換
    !  Forward spectral transformation of vorticity
    !-------------------------------------------------------------------
    wz_Vor = wa_xya( xyz_Vor )

    !-------------------------------------------------------------------
    !  発散のスペクトル正変換
    !  Forward spectral transformation of divergence
    !-------------------------------------------------------------------
    wz_Div = wa_xya( xyz_Div )

    !-------------------------------------------------------------------
    !  温度のスペクトル正変換
    !  Forward spectral transformation of temperature
    !-------------------------------------------------------------------
    wz_Temp = wa_xya( xyz_Temp )

    !-------------------------------------------------------------------
    !  地表面気圧のスペクトル正変換
    !  Forward spectral transformation of surface pressure
    !-------------------------------------------------------------------
    w_Pi = w_xy( log( xy_Ps ) )

    !-------------------------------------------------------------------
    !  比湿のスペクトル正変換
    !  Forward spectral transformation of specific humidity
    !-------------------------------------------------------------------
    wz_QVap = wa_xya( xyz_QVap )

    !-----------------------------------------------------------------
    !  終了処理, 例外処理
    !  Termination and Exception handling
    !-----------------------------------------------------------------
999 continue
    call StoreError(stat, subname, err, cause_c)
    call EndSub(subname)
  end subroutine DynSpectralGrid2Spectral
Function :
result :logical
dyn_sp :type(DYNSP), intent(in)

dyn_sp が初期設定されている場合には .true. が, 初期設定されていない場合には .false. が返ります.

If dyn_sp is initialized, .true. is returned. If dyn_sp is not initialized, .false. is returned.

[Source]

  logical function DynSpectralInitialized( dyn_sp ) result(result)
    !
    ! *dyn_sp* が初期設定されている場合には .true. が,
    ! 初期設定されていない場合には .false. が返ります.
    !
    ! If *dyn_sp* is initialized, .true. is returned.
    ! If *dyn_sp* is not initialized, .false. is returned.
    !
    implicit none
    type(DYNSP), intent(in):: dyn_sp
  continue
    result = dyn_sp % initialized
  end function DynSpectralInitialized
Subroutine :
nmlfile :character(*), intent(in)
: NAMELIST ファイルの名称. NAMELIST file name
openmp_threads :integer, intent(inout)
: OPENMP での最大スレッド数. openmp_threads に 1 より大きな値を指定すれば ISPACK の球面調和函数変換 OPENMP 並列計算 ルーチンが用いられる. 並列計算を実行するには, 実行時に環境変数 OMP_NUM_THREADS を openmp_threads 以下の数字に設定する 等のシステムに応じた準備が必要となる.

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

err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

NAMELIST ファイル nmlfile から値を入力するための 内部サブルーチンです. Create 内で呼び出されることを 想定しています.

値が NAMELIST ファイル内で指定されていない場合には, 入力された値がそのまま返ります.

なお, nmlfile に空文字が与えられた場合, または 与えられた nmlfile を読み込むことができない場合, プログラムはエラーを発生させます.

This is an internal subroutine to input values from NAMELIST file nmlfile. This subroutine is expected to be called by "Create".

A value not specified in NAMELIST file is returned without change.

If nmlfile is empty, or nmlfile can not be read, error is occurred.

This procedure input/output NAMELIST#dyn_spectral_nml .

[Source]

  subroutine DynSpectralNmlRead( nmlfile, openmp_threads, err )
    !
    ! NAMELIST ファイル *nmlfile* から値を入力するための
    ! 内部サブルーチンです. Create 内で呼び出されることを
    ! 想定しています.
    !
    ! 値が NAMELIST ファイル内で指定されていない場合には,
    ! 入力された値がそのまま返ります.
    !
    ! なお, *nmlfile* に空文字が与えられた場合, または
    ! 与えられた *nmlfile* を読み込むことができない場合, 
    ! プログラムはエラーを発生させます.
    !
    ! This is an internal subroutine to input values from 
    ! NAMELIST file *nmlfile*. This subroutine is expected to be
    ! called by "Create".
    !
    ! A value not specified in NAMELIST file is returned
    ! without change.
    !
    ! If *nmlfile* is empty, or *nmlfile* can not be read, 
    ! error is occurred.
    !
    use dc_trace, only: BeginSub, EndSub
    use dc_types, only: DP, STRING, TOKEN, STDOUT
    use dc_iounit, only: FileOpen
    use dc_message, only: MessageNotify
    use dc_present, only: present_and_true
    use dc_error, only: StoreError, DC_NOERR, DC_ENOFILEREAD
    implicit none
    character(*), intent(in):: nmlfile
                              ! NAMELIST ファイルの名称. 
                              ! NAMELIST file name
    integer, intent(inout):: openmp_threads
                              ! OPENMP での最大スレッド数.
                              ! openmp_threads に 1 より大きな値を指定すれば 
                              ! ISPACK[http://www.gfd-dennou.org/library/ispack/] 
                              ! の球面調和函数変換 OPENMP 並列計算
                              ! ルーチンが用いられる. 並列計算を実行するには,
                              ! 実行時に環境変数 OMP_NUM_THREADS 
                              ! を openmp_threads 以下の数字に設定する
                              ! 等のシステムに応じた準備が必要となる.
                              !
                              ! openmp_threads に 1 より大きな値を
                              ! 指定しなければ並列計算ルーチンは呼ばれない.

    logical, intent(out), optional:: err
                              ! 例外処理用フラグ.
                              ! デフォルトでは, この手続き内でエラーが
                              ! 生じた場合, プログラムは強制終了します.
                              ! 引数 *err* が与えられる場合,
                              ! プログラムは強制終了せず, 代わりに
                              ! *err* に .true. が代入されます.
                              !
                              ! Exception handling flag. 
                              ! By default, when error occur in 
                              ! this procedure, the program aborts. 
                              ! If this *err* argument is given, 
                              ! .true. is substituted to *err* and 
                              ! the program does not abort. 

    namelist /dyn_spectral_nml/ openmp_threads
                              ! dyn_spectral モジュール用
                              ! NAMELIST 変数群名.
                              !
                              ! NAMELIST group name for
                              ! 'dyn_spectral' module.

    !-----------------------------------
    !  作業変数
    !  Work variables
    integer:: stat
    character(STRING):: cause_c
    integer:: unit_nml        ! NAMELIST ファイルオープン用装置番号. 
                              ! Unit number for NAMELIST file open
    integer:: iostat_nml      ! NAMELIST 読み込み時の IOSTAT. 
                              ! IOSTAT of NAMELIST read
    character(*), parameter:: subname = 'DynSpectralNmlRead'
  continue
    call BeginSub( subname )
    stat = DC_NOERR
    cause_c = ''



    !-----------------------------------------------------------------
    !  文字型引数を NAMELIST 変数群へ代入
    !  Substitute character arguments to NAMELIST group
    !-----------------------------------------------------------------
!!$    param_c = param_c_

    !----------------------------------------------------------------
    !  NAMELIST ファイルのオープン
    !  Open NAMELIST file
    !----------------------------------------------------------------
    call FileOpen( unit = unit_nml, file = nmlfile, mode = 'r', err = err )                   ! (out)
    if ( present_and_true(err) ) then
      stat = DC_ENOFILEREAD
      cause_c = nmlfile
      goto 999
    end if


    !-----------------------------------------------------------------
    !  NAMELIST 変数群の取得
    !  Get NAMELIST group
    !-----------------------------------------------------------------
    read( unit = unit_nml, nml = dyn_spectral_nml, iostat = iostat_nml ) ! (out)
    if ( iostat_nml == 0 ) then
      call MessageNotify( 'M', subname, 'NAMELIST group "%c" is loaded from "%c".', c1='dyn_spectral_nml', c2=trim(nmlfile) )
      write(STDOUT, nml = dyn_spectral_nml)
    else
      call MessageNotify( 'W', subname, 'NAMELIST group "%c" is not found in "%c" (iostat=%d).', c1='dyn_spectral_nml', c2=trim(nmlfile), i=(/iostat_nml/) )
    end if

    close( unit_nml )

    !-----------------------------------------------------------------
    !  NAMELIST 変数群を文字型引数へ代入
    !  Substitute NAMELIST group to character arguments
    !-----------------------------------------------------------------
!!$    param_c_ = param_c

    !-----------------------------------------------------------------
    !  終了処理, 例外処理
    !  Termination and Exception handling
    !-----------------------------------------------------------------
999 continue
    call StoreError( stat, subname, err, cause_c )
    call EndSub( subname )
  end subroutine DynSpectralNmlRead
Subroutine :
dyn_sp :type(DYNSP), intent(in)
unit :integer, intent(in), optional
: 出力先の装置番号. デフォルトの出力先は標準出力.

Unit number for output. Default value is standard output.

indent :character(*), intent(in), optional
: 表示されるメッセージの字下げ.

Indent of displayed messages.

err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

引数 dyn_sp に設定されている情報を印字します. デフォルトではメッセージは標準出力に出力されます. unit に装置番号を指定することで, 出力先を変更することが可能です.

Print information of dyn_sp. By default messages are output to standard output. Unit number for output can be changed by unit argument.

[Source]

  subroutine DynSpectralPutLine( dyn_sp, unit, indent, err )
    !
    ! 引数 *dyn_sp* に設定されている情報を印字します.
    ! デフォルトではメッセージは標準出力に出力されます. 
    ! *unit* に装置番号を指定することで, 出力先を変更することが可能です.
    !
    ! Print information of *dyn_sp*.
    ! By default messages are output to standard output.
    ! Unit number for output can be changed by *unit* argument.
    !
    use dc_types, only: STRING, STDOUT
    use dc_date, only: toChar
    use dc_trace, only: BeginSub, EndSub
    use dcpam_error, only: StoreError, DC_NOERR, DCPAM_ENOTINIT
    use dc_string, only: Printf
    implicit none
    type(DYNSP), intent(in):: dyn_sp
    integer, intent(in), optional:: unit
                              ! 出力先の装置番号.
                              ! デフォルトの出力先は標準出力.
                              !
                              ! Unit number for output.
                              ! Default value is standard output.
    character(*), intent(in), optional:: indent
                              ! 表示されるメッセージの字下げ.
                              !
                              ! Indent of displayed messages.
    logical, intent(out), optional:: err
                              ! 例外処理用フラグ.
                              ! デフォルトでは, この手続き内でエラーが
                              ! 生じた場合, プログラムは強制終了します.
                              ! 引数 *err* が与えられる場合,
                              ! プログラムは強制終了せず, 代わりに
                              ! *err* に .true. が代入されます.
                              !
                              ! Exception handling flag. 
                              ! By default, when error occur in 
                              ! this procedure, the program aborts. 
                              ! If this *err* argument is given, 
                              ! .true. is substituted to *err* and 
                              ! the program does not abort. 

    integer:: stat
    character(STRING):: cause_c
    integer:: out_unit
    integer:: indent_len
    character(STRING):: indent_str
    integer:: xy_minpos(1:2), xy_maxpos(1:2)
    integer:: xy_lbound(1:2), xy_ubound(1:2)
    integer:: wz_minpos(1:2), wz_maxpos(1:2)
    integer:: wz_lbound(1:2), wz_ubound(1:2)
    character(len = *), parameter:: subname = 'DynSpectralPutLine'
  continue
    call BeginSub(subname)
    stat = DC_NOERR
    cause_c = ''

    !-----------------------------------------------------------------
    !  初期設定のチェック
    !  Check initialization
    !-----------------------------------------------------------------
    if (present(unit)) then
      out_unit = unit
    else
      out_unit = STDOUT
    end if

    indent_len = 0
    indent_str = ''
    if (present(indent)) then
      if (len(indent) /= 0) then
        indent_len = len(indent)
        indent_str(1:indent_len) = indent
      end if
    end if

    !-----------------------------------------------------------------
    !  "DYNSP" の設定の印字
    !  Print the settings for "DYNSP"
    !-----------------------------------------------------------------
    if (dyn_sp % initialized) then
      call Printf(out_unit, indent_str(1:indent_len) // '#<DYNSP:: @initialized=%y @nmax=%d @imax=%d @jmax=%d @kmax=%d', i=(/dyn_sp % nmax, dyn_sp % imax, dyn_sp % jmax, dyn_sp % kmax/), l=(/dyn_sp % initialized/))

      call Printf(out_unit, indent_str(1:indent_len) // ' @PI=%f @RPlanet=%f @Omega=%f @Grav=%f', d=(/dyn_sp % PI, dyn_sp % RPlanet, dyn_sp % Omega, dyn_sp % Grav/))

      call Printf(out_unit, indent_str(1:indent_len) // ' @Cp=%f @RAir=%f @Kappa=%f ', d=(/dyn_sp % Cp, dyn_sp % RAir, dyn_sp % Kappa/))

      call Printf(out_unit, indent_str(1:indent_len) // ' @VisOrder=%d @EFoldTime=%f @DelTime=%f', i=(/dyn_sp % VisOrder/), d=(/dyn_sp % EFoldTime, dyn_sp % DelTime/))

      call Printf(out_unit, indent_str(1:indent_len) // ' @openmp_threads=%d', i=(/dyn_sp % openmp_threads/))

      xy_lbound = lbound(dyn_sp % xy_Cori)
      xy_ubound = ubound(dyn_sp % xy_Cori)
      xy_minpos = minloc(dyn_sp % xy_Cori)
      xy_maxpos = maxloc(dyn_sp % xy_Cori)

      xy_minpos(1) = xy_minpos(1) + xy_lbound(1) - 1
      xy_minpos(2) = xy_minpos(2) + xy_lbound(2) - 1
      xy_maxpos(1) = xy_maxpos(1) + xy_lbound(1) - 1
      xy_maxpos(2) = xy_maxpos(2) + xy_lbound(2) - 1

      call Printf(out_unit, indent_str(1:indent_len) // ' @xy_Cori(%d:%d,%d:%d)=' // '[min:%f, max:%f]', i=(/xy_lbound(1), xy_ubound(1), xy_lbound(2), xy_ubound(2)/), d=(/dyn_sp % xy_Cori(xy_minpos(1), xy_minpos(2)), dyn_sp % xy_Cori(xy_maxpos(1), xy_maxpos(2))/))

      xy_lbound = lbound(dyn_sp % xy_UVFact)
      xy_ubound = ubound(dyn_sp % xy_UVFact)
      xy_minpos = minloc(dyn_sp % xy_UVFact)
      xy_maxpos = maxloc(dyn_sp % xy_UVFact)

      xy_minpos(1) = xy_minpos(1) + xy_lbound(1) - 1
      xy_minpos(2) = xy_minpos(2) + xy_lbound(2) - 1
      xy_maxpos(1) = xy_maxpos(1) + xy_lbound(1) - 1
      xy_maxpos(2) = xy_maxpos(2) + xy_lbound(2) - 1

      call Printf(out_unit, indent_str(1:indent_len) // ' @xy_UVFact(%d:%d,%d:%d)=' // '[min:%f, max:%f]', i=(/xy_lbound(1), xy_ubound(1), xy_lbound(2), xy_ubound(2)/), d=(/dyn_sp % xy_UVFact(xy_minpos(1), xy_minpos(2)), dyn_sp % xy_UVFact(xy_maxpos(1), xy_maxpos(2))/))


      wz_lbound = lbound(dyn_sp % wz_DiffVorDiv)
      wz_ubound = ubound(dyn_sp % wz_DiffVorDiv)
      wz_minpos = minloc(dyn_sp % wz_DiffVorDiv)
      wz_maxpos = maxloc(dyn_sp % wz_DiffVorDiv)

      wz_minpos(1) = wz_minpos(1) + wz_lbound(1) - 1
      wz_minpos(2) = wz_minpos(2) + wz_lbound(2) - 1
      wz_maxpos(1) = wz_maxpos(1) + wz_lbound(1) - 1
      wz_maxpos(2) = wz_maxpos(2) + wz_lbound(2) - 1

      call Printf(out_unit, indent_str(1:indent_len) // ' @wz_DiffVorDiv(%d:%d,%d:%d)=' // '[min:%f, max:%f]', i=(/wz_lbound(1), wz_ubound(1), wz_lbound(2), wz_ubound(2)/), d=(/dyn_sp % wz_DiffVorDiv(wz_lbound(1), wz_lbound(2)), dyn_sp % wz_DiffVorDiv(wz_ubound(1), wz_ubound(2))/))


      wz_lbound = lbound(dyn_sp % wz_DiffTherm)
      wz_ubound = ubound(dyn_sp % wz_DiffTherm)
      wz_minpos = minloc(dyn_sp % wz_DiffTherm)
      wz_maxpos = maxloc(dyn_sp % wz_DiffTherm)

      wz_minpos(1) = wz_minpos(1) + wz_lbound(1) - 1
      wz_minpos(2) = wz_minpos(2) + wz_lbound(2) - 1
      wz_maxpos(1) = wz_maxpos(1) + wz_lbound(1) - 1
      wz_maxpos(2) = wz_maxpos(2) + wz_lbound(2) - 1

      call Printf(out_unit, indent_str(1:indent_len) // ' @wz_DiffTherm(%d:%d,%d:%d)=' // '[min:%f, max:%f]', i=(/wz_lbound(1), wz_ubound(1), wz_lbound(2), wz_ubound(2)/), d=(/dyn_sp % wz_DiffTherm(wz_lbound(1), wz_lbound(2)), dyn_sp % wz_DiffTherm(wz_ubound(1), wz_ubound(2))/))

      call Printf(out_unit, indent_str(1:indent_len) // '>')

    else
      call Printf(out_unit, indent_str(1:indent_len) // '#<DYNSP:: @initialized=%y>', l=(/dyn_sp % initialized/))
    end if

    !-----------------------------------------------------------------
    !  終了処理, 例外処理
    !  Termination and Exception handling
    !-----------------------------------------------------------------
999 continue
    call StoreError(stat, subname, err, cause_c)
    call EndSub(subname)
  end subroutine DynSpectralPutLine
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
wz_Vor((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: ζ . 渦度 (スペクトル). Vorticity (spectral)
wz_Div((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: D . 発散 (スペクトル). Divergence (spectral)
wz_Temp((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: T . 温度 (スペクトル). Temperature (spectral)
w_Pi((dyn_sp%nmax+1)**2) :real(DP), intent(in)
: π=lnPs . 地表面気圧 (スペクトル). Surface pressure (spectral)
wz_QVap((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: q . 比湿 (スペクトル). Specific humidity (spectral)
xyz_Vor(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: ζ . 渦度. Vorticity
xyz_Div(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: D . 発散. Divergence
xyz_Temp(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: T . 温度. Temperature
xy_Ps(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1) :real(DP), intent(out)
: Ps . 地表面気圧. Surface pressure
xyz_QVap(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: q . 比湿. Specific humidity
xyz_U(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out), optional
: U . 東西風速. Zonal wind
xyz_V(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out), optional
: V . 南北風速. Meridional wind
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

与えられたスペクトル値から格子点値を計算します. 地表面気圧 Ps のみ, π=lnPs のスペクトル値を 受け取り, Ps の格子点値を返します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Calculate grid values from given spectral values. Only surface pressure Ps , spectral π=lnPs is recipient, and Ps on grids is returned.

If dyn_sp is not initialized by Create yet, error is occurred.

[Source]

  subroutine DynSpectralSpectral2Grid( dyn_sp, wz_Vor, wz_Div, wz_Temp, w_Pi, wz_QVap, xyz_Vor, xyz_Div, xyz_Temp, xy_Ps, xyz_QVap, xyz_U, xyz_V, err )
    !
    ! 与えられたスペクトル値から格子点値を計算します. 
    ! 地表面気圧 $ P_s $ のみ, $ \pi = \ln P_s $ のスペクトル値を
    ! 受け取り, $ P_s $ の格子点値を返します.
    !
    ! なお, 与えられた *dyn_sp* が Create によって初期設定
    ! されていない場合, プログラムはエラーを発生させます.
    !
    ! Calculate grid values from given spectral values. 
    ! Only surface pressure $ P_s $ , spectral $ \pi = \ln P_s $ 
    ! is recipient, and $ P_s $ on grids is returned.
    !
    ! If *dyn_sp* is not initialized by Create yet,
    ! error is occurred.
    !
    use dc_trace, only: BeginSub, EndSub
    use dc_types, only: STRING, STDOUT
    use dcpam_error, only: StoreError, DC_NOERR, DCPAM_ENOTINIT
    use wa_module, only: xya_wa, xy_w
    implicit none
    type(DYNSP), intent(inout):: dyn_sp
    real(DP), intent(in):: wz_Vor ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ \zeta $ . 渦度 (スペクトル). 
                              ! Vorticity (spectral)
    real(DP), intent(in):: wz_Div ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ D $ . 発散 (スペクトル). 
                              ! Divergence (spectral)
    real(DP), intent(in):: wz_Temp ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ T $ . 温度 (スペクトル). 
                              ! Temperature (spectral)
    real(DP), intent(in):: w_Pi ((dyn_sp%nmax+1)**2)
                              ! $ \pi = \ln P_s $ . 地表面気圧 (スペクトル). 
                              ! Surface pressure (spectral)
    real(DP), intent(in):: wz_QVap ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ q $ . 比湿 (スペクトル). 
                              ! Specific humidity (spectral)
    real(DP), intent(out):: xyz_Vor (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ \zeta $ . 渦度. Vorticity
    real(DP), intent(out):: xyz_Div (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ D $ .     発散. Divergence
    real(DP), intent(out):: xyz_Temp (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ T $ .     温度. Temperature
    real(DP), intent(out):: xyz_QVap (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ q $ .     比湿. Specific humidity
    real(DP), intent(out):: xy_Ps (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1)
                              ! $ P_s $ .   地表面気圧. Surface pressure
    real(DP), intent(out), optional:: xyz_U (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ U $ .     東西風速. Zonal wind
    real(DP), intent(out), optional:: xyz_V (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ V $ .     南北風速. Meridional wind
    logical, intent(out), optional:: err
                              ! 例外処理用フラグ.
                              ! デフォルトでは, この手続き内でエラーが
                              ! 生じた場合, プログラムは強制終了します.
                              ! 引数 *err* が与えられる場合,
                              ! プログラムは強制終了せず, 代わりに
                              ! *err* に .true. が代入されます.
                              !
                              ! Exception handling flag. 
                              ! By default, when error occur in 
                              ! this procedure, the program aborts. 
                              ! If this *err* argument is given, 
                              ! .true. is substituted to *err* and 
                              ! the program does not abort. 

    !-----------------------------------
    !  作業変数
    !  Work variables
    real(DP):: xyz_UW (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ U $ .     東西風速 . Zonal wind
    real(DP):: xyz_VW (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ V $ .     南北風速. Meridional wind

    integer:: stat
    character(STRING):: cause_c
    character(*), parameter:: subname = 'DynSpectralSpectral2Grid'
  continue
    call BeginSub(subname)
    stat = DC_NOERR
    cause_c = ''

    !-----------------------------------------------------------------
    !  初期設定のチェック
    !  Check initialization
    !-----------------------------------------------------------------
    if (.not. dyn_sp % initialized) then
      stat = DCPAM_ENOTINIT
      cause_c = 'DYNSP'
      goto 999
    end if

    !-------------------------------------------------------------------
    !  渦度のスペクトル逆変換
    !  Backward spectral transformation of vorticity
    !-------------------------------------------------------------------
    xyz_Vor = xya_wa( wz_Vor )

    !-------------------------------------------------------------------
    !  発散のスペクトル逆変換
    !  Backward spectral transformation of divergence
    !-------------------------------------------------------------------
    xyz_Div = xya_wa( wz_Div )

    !-------------------------------------------------------------------
    !  温度のスペクトル逆変換
    !  Backward spectral transformation of temperature
    !-------------------------------------------------------------------
    xyz_Temp = xya_wa( wz_Temp )

    !-------------------------------------------------------------------
    !  地表面気圧のスペクトル逆変換
    !  Backward spectral transformation of surface pressure
    !-------------------------------------------------------------------
    xy_Ps = exp( xy_w( w_Pi ) )

    !-------------------------------------------------------------------
    !  比湿のスペクトル逆変換
    !  Backward spectral transformation of specific humidity
    !-------------------------------------------------------------------
    xyz_QVap = xya_wa( wz_QVap )

    !-------------------------------------------------------------------
    !  東西風速と南北風速の計算
    !  Caluculate zonal wind and meridional wind
    !-------------------------------------------------------------------
    if (present(xyz_U) .or. present(xyz_V)) then
      call VorDiv2UV( dyn_sp, xyz_Vor, xyz_Div, xyz_UW, xyz_VW ) ! (out)
    end if
    if (present(xyz_U)) xyz_U = xyz_UW
    if (present(xyz_V)) xyz_V = xyz_VW

    !-----------------------------------------------------------------
    !  終了処理, 例外処理
    !  Termination and Exception handling
    !-----------------------------------------------------------------
999 continue
    call StoreError(stat, subname, err, cause_c)
    call EndSub(subname)
  end subroutine DynSpectralSpectral2Grid
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
xyz_UAdv(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: UA . 東西運動量移流項. Zonal advection of momentum
xyz_VAdv(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: VA . 南北運動量移流項. Meridional advection of momentum
xyz_KE(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: E . 運動エネルギー項. Kinematic energy
xyz_TempUAdv(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: UT . 温度東西移流項. Zonal advection of temperature
xyz_TempVAdv(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: VT . 温度南北移流項. Meridional advection of temperature
xyz_DTempDt(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: H . 温度時間変化項. Temperature tendency
xy_DPiDt(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1) :real(DP), intent(in)
: Z . 地表面気圧時間変化項. Surface pressure tendency
xyz_QVapUAdv(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: Uq . 比湿東西移流項. Zonal advection of specific humidity
xyz_QVapVAdv(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: Vq . 比湿南北移流項. Meridional advection of specific humidity
xyz_DQVapDt(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: R . 比湿時間変化項. Specific humidity tendency
wz_DVorDt((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: dζdt . 渦度変化 (スペクトル). Vorticity tendency (spectral)
wz_DDivDt((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: dDdt . 発散変化 (スペクトル). Divergence tendency (spectral)
wz_DTempDt((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: dTdt . 温度変化 (スペクトル). Temperature tendency (spectral)
w_DPiDt((dyn_sp%nmax+1)**2) :real(DP), intent(out)
: dPsdt . 地表面気圧変化 (スペクトル). Surface pressure tendency (spectral)
wz_DQVapDt((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: dqdt . 比湿変化 (スペクトル). Specific humidity tendency (spectral)
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

与えられた格子点値 (移流項, 運動エネルギー項, 温度変化項 H , 比湿変化項 R ) から, スペクトルの時間変化項 (渦度, 発散, 温度, 地表面気圧, 比湿) を計算します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Calculate spectral tendency terms (vorticity, divergence, temperature, surface pressure, specific humidity) from grid points values (advection, kinetic energy, and temperature tendency H , specific humidity tendency R ).

If dyn_sp is not initialized by Create yet, error is occurred.

[Source]

  subroutine DynSpectralTendency( dyn_sp, xyz_UAdv, xyz_VAdv, xyz_KE, xyz_TempUAdv, xyz_TempVAdv, xyz_DTempDt, xy_DPiDt, xyz_QVapUAdv, xyz_QVapVAdv, xyz_DQVapDt, wz_DVorDt, wz_DDivDt, wz_DTempDt, w_DPiDt, wz_DQVapDt, err )
    !
    ! 与えられた格子点値 (移流項, 運動エネルギー項, 
    ! 温度変化項 $ H $ , 比湿変化項 $ R $ ) から, 
    ! スペクトルの時間変化項 (渦度, 発散, 温度, 地表面気圧, 比湿) 
    ! を計算します.
    !
    ! なお, 与えられた *dyn_sp* が Create によって初期設定
    ! されていない場合, プログラムはエラーを発生させます.
    !
    ! Calculate spectral tendency terms (vorticity, divergence, 
    ! temperature, surface pressure, specific humidity) from 
    ! grid points values (advection, kinetic energy, and 
    ! temperature tendency $ H $ , specific humidity tendency $ R $ ).
    !
    ! If *dyn_sp* is not initialized by Create yet,
    ! error is occurred.
    !
    use dc_trace, only: BeginSub, EndSub
    use dc_types, only: STRING, STDOUT
    use dcpam_error, only: StoreError, DC_NOERR, DCPAM_ENOTINIT
    use wa_module, only: wa_Div_xya_xya, wa_Lapla_wa, wa_xya, w_xy
    implicit none
    type(DYNSP), intent(inout):: dyn_sp
    logical, intent(out), optional:: err
                              ! 例外処理用フラグ.
                              ! デフォルトでは, この手続き内でエラーが
                              ! 生じた場合, プログラムは強制終了します.
                              ! 引数 *err* が与えられる場合,
                              ! プログラムは強制終了せず, 代わりに
                              ! *err* に .true. が代入されます.
                              !
                              ! Exception handling flag. 
                              ! By default, when error occur in 
                              ! this procedure, the program aborts. 
                              ! If this *err* argument is given, 
                              ! .true. is substituted to *err* and 
                              ! the program does not abort. 

    real(DP), intent(in):: xyz_UAdv (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ UA $ . 東西運動量移流項. 
                              ! Zonal advection of momentum
    real(DP), intent(in):: xyz_VAdv (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ VA $ . 南北運動量移流項. 
                              ! Meridional advection of momentum
    real(DP), intent(in):: xyz_KE (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ E $ . 運動エネルギー項. 
                              ! Kinematic energy
    real(DP), intent(in):: xyz_TempUAdv (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ UT $ . 温度東西移流項. 
                              ! Zonal advection of temperature
    real(DP), intent(in):: xyz_TempVAdv (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ VT $ . 温度南北移流項. 
                              ! Meridional advection of temperature
    real(DP), intent(in):: xyz_DTempDt (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ H $ . 温度時間変化項. 
                              ! Temperature tendency
    real(DP), intent(in):: xy_DPiDt (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1)
                              ! $ Z $ . 地表面気圧時間変化項. 
                              ! Surface pressure tendency
    real(DP), intent(in):: xyz_QVapUAdv (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ Uq $ . 比湿東西移流項. 
                              ! Zonal advection of specific humidity
    real(DP), intent(in):: xyz_QVapVAdv (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ Vq $ . 比湿南北移流項. 
                              ! Meridional advection of specific humidity
    real(DP), intent(in):: xyz_DQVapDt (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ R $ . 比湿時間変化項. 
                              ! Specific humidity tendency
    real(DP), intent(out):: wz_DVorDt ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ \DD{\zeta}{t} $ . 渦度変化 (スペクトル). 
                              ! Vorticity tendency (spectral)
    real(DP), intent(out):: wz_DDivDt ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ \DD{D}{t} $ . 発散変化 (スペクトル). 
                              ! Divergence tendency (spectral)
    real(DP), intent(out):: wz_DTempDt ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ \DD{T}{t} $ . 温度変化 (スペクトル). 
                              ! Temperature tendency (spectral)
    real(DP), intent(out):: w_DPiDt ((dyn_sp%nmax+1)**2)
                              ! $ \DD{Ps}{t} $ . 地表面気圧変化 (スペクトル). 
                              ! Surface pressure tendency (spectral)
    real(DP), intent(out):: wz_DQVapDt ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! $ \DD{q}{t} $ . 比湿変化 (スペクトル). 
                              ! Specific humidity tendency (spectral)

    real(DP):: RPlanet        ! $ a $ . 惑星半径. Radius of planet
    integer:: stat
    character(STRING):: cause_c
    character(*), parameter:: subname = 'DynSpectralTendency'
  continue
    call BeginSub(subname)
    stat = DC_NOERR
    cause_c = ''

    !-----------------------------------------------------------------
    !  初期設定のチェック
    !  Check initialization
    !-----------------------------------------------------------------
    if (.not. dyn_sp % initialized) then
      stat = DCPAM_ENOTINIT
      cause_c = 'DYNSP'
      goto 999
    end if

    !-----------------------------------------------------------------
    !  *dyn_sp* に格納される物理定数の取り出し
    !  Fetch physical constants from *dyn_sp*
    !-----------------------------------------------------------------
    RPlanet = dyn_sp % RPlanet

    !-------------------------------------------------------------------
    !  渦度の時間変化 (スペクトル) の計算
    !  Calculate vorticity tendency (spectral)
    !-------------------------------------------------------------------
    wz_DVorDt = wa_Div_xya_xya( xyz_VAdv, - xyz_UAdv ) / RPlanet

    !-------------------------------------------------------------------
    !  発散の時間変化 (スペクトル) の計算
    !  Calculate divergence tendency (spectral)
    !-------------------------------------------------------------------
    wz_DDivDt = wa_Div_xya_xya( xyz_UAdv, xyz_VAdv ) / RPlanet - wa_Lapla_wa( wa_xya(xyz_KE) ) / RPlanet**2

    !-------------------------------------------------------------------
    !  温度の時間変化 (スペクトル) の計算
    !  Calculate temperature tendency (spectral)
    !-------------------------------------------------------------------
    wz_DTempDt = - wa_Div_xya_xya( xyz_TempUAdv, xyz_TempVAdv ) / RPlanet + wa_xya( xyz_DTempDt )

    !-------------------------------------------------------------------
    !  地表面気圧の時間変化 (スペクトル) の計算
    !  Calculate surface pressure tendency (spectral)
    !-------------------------------------------------------------------
    w_DPiDt = w_xy( xy_DPiDt )

    !-------------------------------------------------------------------
    !  比湿の時間変化 (スペクトル) の計算
    !  Calculate specific humidity tendency (spectral)
    !-------------------------------------------------------------------
    wz_DQVapDt = - wa_Div_xya_xya( xyz_QVapUAdv, xyz_QVapVAdv ) / RPlanet + wa_xya( xyz_DQVapDt )

    !-----------------------------------------------------------------
    !  終了処理, 例外処理
    !  Termination and Exception handling
    !-----------------------------------------------------------------
999 continue
    call StoreError(stat, subname, err, cause_c)
    call EndSub(subname)
  end subroutine DynSpectralTendency
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
xyz_U(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: U . 東西風速. Zonal wind
xyz_V(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: V . 南北風速. Meridional wind
xyz_Vor(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: ζ . 渦度. Vorticity
xyz_Div(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: D . 発散. Divergence
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

与えられた東西風速と南北風速から渦度と発散を計算します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Calculate vorticity and divergence from given zonal and meridional wind.

If dyn_sp is not initialized by Create yet, error is occurred.

[Source]

  subroutine DynSpectralUV2VorDiv( dyn_sp, xyz_U, xyz_V, xyz_Vor, xyz_Div, err )
    !
    ! 与えられた東西風速と南北風速から渦度と発散を計算します.
    !
    ! なお, 与えられた *dyn_sp* が Create によって初期設定
    ! されていない場合, プログラムはエラーを発生させます.
    !
    ! Calculate vorticity and divergence
    ! from given zonal and meridional wind.
    !
    ! If *dyn_sp* is not initialized by Create yet,
    ! error is occurred.
    !
    use dc_trace, only: BeginSub, EndSub
    use dc_types, only: STRING, STDOUT
    use dcpam_error, only: StoreError, DC_NOERR, DCPAM_ENOTINIT
    use wa_module, only: xya_wa, wa_Div_xya_xya
    implicit none
    type(DYNSP), intent(inout):: dyn_sp
    real(DP), intent(in):: xyz_U (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ U $ . 東西風速. 
                              ! Zonal wind
    real(DP), intent(in):: xyz_V (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ V $ . 南北風速. 
                              ! Meridional wind
    real(DP), intent(out):: xyz_Vor (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ \zeta $ . 渦度. 
                              ! Vorticity
    real(DP), intent(out):: xyz_Div (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ D $ . 発散. 
                              ! Divergence
    logical, intent(out), optional:: err
                              ! 例外処理用フラグ.
                              ! デフォルトでは, この手続き内でエラーが
                              ! 生じた場合, プログラムは強制終了します.
                              ! 引数 *err* が与えられる場合,
                              ! プログラムは強制終了せず, 代わりに
                              ! *err* に .true. が代入されます.
                              !
                              ! Exception handling flag. 
                              ! By default, when error occur in 
                              ! this procedure, the program aborts. 
                              ! If this *err* argument is given, 
                              ! .true. is substituted to *err* and 
                              ! the program does not abort. 

    real(DP):: RPlanet        ! 惑星半径
    integer:: stat
    character(STRING):: cause_c
    character(*), parameter:: subname = 'DynSpectralUV2VorDiv'
  continue
    call BeginSub(subname)
    stat = DC_NOERR
    cause_c = ''

    !-----------------------------------------------------------------
    !  初期設定のチェック
    !  Check initialization
    !-----------------------------------------------------------------
    if (.not. dyn_sp % initialized) then
      stat = DCPAM_ENOTINIT
      cause_c = 'DYNSP'
      goto 999
    end if

    !-----------------------------------------------------------------
    !  *dyn_sp* に格納される物理定数の取り出し
    !  Fetch physical constants from *dyn_sp*
    !-----------------------------------------------------------------
    RPlanet = dyn_sp % RPlanet

    !-----------------------------------------------------------------
    !  渦度 $ \zeta $ と発散 $ D $ の計算
    !  Caluculate vorticity $ \zeta $ and divergence $ D $
    !-----------------------------------------------------------------
    xyz_Vor = xya_wa( wa_Div_xya_xya( xyz_V , - xyz_U ) / RPlanet )

    xyz_Div = xya_wa( wa_Div_xya_xya( xyz_U ,   xyz_V ) / RPlanet )

    !-----------------------------------------------------------------
    !  終了処理, 例外処理
    !  Termination and Exception handling
    !-----------------------------------------------------------------
999 continue
    call StoreError(stat, subname, err, cause_c)
    call EndSub(subname)
  end subroutine DynSpectralUV2VorDiv
Subroutine :
dyn_sp :type(DYNSP), intent(inout)
xyz_Vor(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: ζ . 渦度. Vorticity
xyz_Div(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(in)
: D . 発散. Divergence
xyz_U(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: U . 東西風速. Zonal wind
xyz_V(0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1) :real(DP), intent(out)
: V . 南北風速. Meridional wind
err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

与えられた渦度と発散から東西風速と南北風速を計算します.

なお, 与えられた dyn_spCreate によって初期設定 されていない場合, プログラムはエラーを発生させます.

Calculate zonal and meridional wind from given vorticity and divergence.

If dyn_sp is not initialized by Create yet, error is occurred.

[Source]

  subroutine DynSpectralVorDiv2UV( dyn_sp, xyz_Vor, xyz_Div, xyz_U, xyz_V, err )
    !
    ! 与えられた渦度と発散から東西風速と南北風速を計算します.
    !
    ! なお, 与えられた *dyn_sp* が Create によって初期設定
    ! されていない場合, プログラムはエラーを発生させます.
    !
    ! Calculate zonal and meridional wind from given 
    ! vorticity and divergence.
    !
    ! If *dyn_sp* is not initialized by Create yet,
    ! error is occurred.
    !
    use dc_trace, only: BeginSub, EndSub
    use dc_types, only: STRING, STDOUT
    use dcpam_error, only: StoreError, DC_NOERR, DCPAM_ENOTINIT
    use wa_module, only: wa_xya, wa_LaplaInv_wa, xya_GradLon_wa, xya_GradLat_wa
    implicit none
    type(DYNSP), intent(inout):: dyn_sp
    real(DP), intent(in):: xyz_Vor (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ \zeta $ . 渦度. 
                              ! Vorticity
    real(DP), intent(in):: xyz_Div (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ D $ . 発散. 
                              ! Divergence
    real(DP), intent(out):: xyz_U (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ U $ . 東西風速. 
                              ! Zonal wind
    real(DP), intent(out):: xyz_V (0:dyn_sp%imax-1, 0:dyn_sp%jmax-1, 0:dyn_sp%kmax-1)
                              ! $ V $ . 南北風速. 
                              ! Meridional wind
    logical, intent(out), optional:: err
                              ! 例外処理用フラグ.
                              ! デフォルトでは, この手続き内でエラーが
                              ! 生じた場合, プログラムは強制終了します.
                              ! 引数 *err* が与えられる場合,
                              ! プログラムは強制終了せず, 代わりに
                              ! *err* に .true. が代入されます.
                              !
                              ! Exception handling flag. 
                              ! By default, when error occur in 
                              ! this procedure, the program aborts. 
                              ! If this *err* argument is given, 
                              ! .true. is substituted to *err* and 
                              ! the program does not abort. 

    real(DP):: RPlanet        ! $ a $ . 惑星半径. Radius of planet
    real(DP):: wz_Psi ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! 流線関数 $ \psi $ スペクトル
    real(DP):: wz_Chi ((dyn_sp%nmax+1)**2, 0:dyn_sp%kmax-1)
                              ! ポテンシャル $ \chi $ スペクトル
    integer:: stat
    character(STRING):: cause_c
    character(*), parameter:: subname = 'DynSpectralVorDiv2UV'
  continue
    call BeginSub(subname)
    stat = DC_NOERR
    cause_c = ''

    !-----------------------------------------------------------------
    !  初期設定のチェック
    !  Check initialization
    !-----------------------------------------------------------------
    if (.not. dyn_sp % initialized) then
      stat = DCPAM_ENOTINIT
      cause_c = 'DYNSP'
      goto 999
    end if

    !-----------------------------------------------------------------
    !  *dyn_sp* に格納される物理定数の取り出し
    !  Fetch physical constants from *dyn_sp*
    !-----------------------------------------------------------------
    RPlanet = dyn_sp % RPlanet

    !-----------------------------------------------------------------
    !  東西風速 $ U $ と南北風速 $ V $ の計算
    !  Caluculate zonal wind $ U $ and meridional wind $ V $
    !-----------------------------------------------------------------
    wz_Psi = wa_LaplaInv_wa(  wa_xya( xyz_Vor )  ) * RPlanet**2
    wz_Chi = wa_LaplaInv_wa(  wa_xya( xyz_Div )  ) * RPlanet**2

    xyz_U = ( xya_GradLon_wa( wz_Chi ) - xya_GradLat_wa( wz_Psi )  ) / RPlanet

    xyz_V = ( xya_GradLon_wa( wz_Psi ) + xya_GradLat_wa( wz_Chi )  ) / RPlanet

    !-----------------------------------------------------------------
    !  終了処理, 例外処理
    !  Termination and Exception handling
    !-----------------------------------------------------------------
999 continue
    call StoreError(stat, subname, err, cause_c)
    call EndSub(subname)
  end subroutine DynSpectralVorDiv2UV
NmlRead( nmlfile, openmp_threads, [err] )
Subroutine :
nmlfile :character(*), intent(in)
: NAMELIST ファイルの名称. NAMELIST file name
openmp_threads :integer, intent(inout)
: OPENMP での最大スレッド数. openmp_threads に 1 より大きな値を指定すれば ISPACK の球面調和函数変換 OPENMP 並列計算 ルーチンが用いられる. 並列計算を実行するには, 実行時に環境変数 OMP_NUM_THREADS を openmp_threads 以下の数字に設定する 等のシステムに応じた準備が必要となる.

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

err :logical, intent(out), optional
: 例外処理用フラグ. デフォルトでは, この手続き内でエラーが 生じた場合, プログラムは強制終了します. 引数 err が与えられる場合, プログラムは強制終了せず, 代わりに err に .true. が代入されます.

Exception handling flag. By default, when error occur in this procedure, the program aborts. If this err argument is given, .true. is substituted to err and the program does not abort.

NAMELIST ファイル nmlfile から値を入力するための 内部サブルーチンです. Create 内で呼び出されることを 想定しています.

値が NAMELIST ファイル内で指定されていない場合には, 入力された値がそのまま返ります.

なお, nmlfile に空文字が与えられた場合, または 与えられた nmlfile を読み込むことができない場合, プログラムはエラーを発生させます.

This is an internal subroutine to input values from NAMELIST file nmlfile. This subroutine is expected to be called by "Create".

A value not specified in NAMELIST file is returned without change.

If nmlfile is empty, or nmlfile can not be read, error is occurred.

This procedure input/output NAMELIST#dyn_spectral_nml .

Alias for DynSpectralNmlRead

version
Constant :
version = ‘$Name: dcpam4-20070731 $’ // ‘$Id: dyn_spectral.f90,v 1.7 2007/07/30 13:42:16 morikawa Exp $‘ :character(*), parameter
wa_module_initialized
Variable :
wa_module_initialized = .false. :logical, save

[Validate]