| Class | w_deriv_module_sjpack_cuda |
| In: |
libsrc/w_module_sjpack_cuda/w_deriv_module_sjpack_cuda.f90
|
| Authors: | Shin-ichi Takehiro, Youhei SASAKI |
| Version: | $Id: w_deriv_module_sjpack_cuda.f90 590 2013-08-19 08:48:21Z uwabami $ |
| Copyright&License: | See COPYRIGHT |
spml/w_deriv_module_sjpack_cuda モジュールは球面上での 2 次元流体運動を 球面調和函数を用いたスペクトル法によって数値計算するための モジュール w_module_sjpack_cuda の下部モジュールであり, スペクトル法の 微分計算のための Fortran90 関数を提供する.
内部で ISPACK の sjpack-cuda の Fortran77 サブルーチンを呼んでいる. スペクトルデータおよび格子点データの格納方法や変換の詳しい計算法に ついては ISPACK/sjpack-cuda のマニュアルを参照されたい.
このモジュールを使うためには前もって w_base_initial を呼んで 切断波数, 格子点数の設定をしておく必要がある.
| Function : | |||
| w_DLon_w((nm+1)*(nm+1)) : | real(8)
| ||
| w_data((nm+1)*(nm+1)) : | real(8), intent(in)
|
スペクトルデータに経度微分 ∂/∂λ を作用させる(1 層用).
スペクトルデータの経度微分とは, 対応する格子点データに 経度微分∂/∂λを作用させたデータのスペクトル変換のことである.
function w_DLon_w(w_data)
!
! スペクトルデータに経度微分 ∂/∂λ を作用させる(1 層用).
!
! スペクトルデータの経度微分とは, 対応する格子点データに
! 経度微分∂/∂λを作用させたデータのスペクトル変換のことである.
!
real(8) :: w_DLon_w((nm+1)*(nm+1))
!(out) スペクトルデータの経度微分
real(8), intent(in) :: w_data((nm+1)*(nm+1))
!(in) 入力スペクトルデータ
call sjcs2x(mm,w_data,w_DLon_w)
end function w_DLon_w
| Function : | |||
| w_DivLambda_xy((nm+1)*(nm+1)) : | real(8)
| ||
| xy_data(0:im-1,1:jm) : | real(8), intent(in)
|
格子点データに発散型経度微分 1/(1-μ^2)・∂/∂λ (μ=sinφ) を作用させてスペクトルデータに変換して返す(1 層用).
function w_DivLambda_xy(xy_data)
!
! 格子点データに発散型経度微分 1/(1-μ^2)・∂/∂λ (μ=sinφ)
! を作用させてスペクトルデータに変換して返す(1 層用).
!
real(8) :: w_DivLambda_xy((nm+1)*(nm+1))
!(out) 格子点データを発散型経度微分したスペクトルデータ
real(8), intent(in) :: xy_data(0:im-1,1:jm)
!(in) 入力格子点データ
w_DivLambda_xy = w_xy(xy_data,ipow=2,iflag=-1)
end function w_DivLambda_xy
| Function : | |||
| w_DivLat_xy((nm+1)*(nm+1)) : | real(8)
| ||
| xy_data(0:im-1,1:jm) : | real(8), intent(in)
|
格子点データに発散型緯度微分 1/cosφ・∂(f cosφ)/∂φ を作用させて スペクトルデータに変換して返す(1 層用).
function w_DivLat_xy(xy_data)
!
! 格子点データに発散型緯度微分 1/cosφ・∂(f cosφ)/∂φ を作用させて
! スペクトルデータに変換して返す(1 層用).
!
real(8) :: w_DivLat_xy((nm+1)*(nm+1))
!(out) 格子点データを発散型緯度微分したスペクトルデータ
real(8), intent(in) :: xy_data(0:im-1,1:jm)
!(in) 入力格子点データ
w_DivLat_xy = w_xy(xy_data,ipow=1,iflag=1)
end function w_DivLat_xy
| Function : | |||
| w_DivLon_xy((nm+1)*(nm+1)) : | real(8)
| ||
| xy_data(0:im-1,1:jm) : | real(8), intent(in)
|
格子点データに発散型経度微分 1/cosφ・∂/∂λ を作用させて スペクトルデータに変換して返す(1 層用).
function w_DivLon_xy(xy_data)
!
! 格子点データに発散型経度微分 1/cosφ・∂/∂λ を作用させて
! スペクトルデータに変換して返す(1 層用).
!
real(8) :: w_DivLon_xy((nm+1)*(nm+1))
!(out) 格子点データを発散型経度微分したスペクトルデータ
real(8), intent(in) :: xy_data(0:im-1,1:jm)
!(in) 入力格子点データ
w_DivLon_xy = w_xy(xy_data,ipow=1,iflag=-1)
end function w_DivLon_xy
| Function : | |||
| w_DivMu_xy((nm+1)*(nm+1)) : | real(8)
| ||
| xy_data(0:im-1,1:jm) : | real(8), intent(in)
|
格子点データに発散型緯度微分 ∂/∂μ (μ=sinφ)を作用させて スペクトルデータに変換して返す(1 層用).
function w_DivMu_xy(xy_data)
!
! 格子点データに発散型緯度微分 ∂/∂μ (μ=sinφ)を作用させて
! スペクトルデータに変換して返す(1 層用).
!
real(8) :: w_DivMu_xy((nm+1)*(nm+1))
!(out) 格子点データを発散型緯度微分したスペクトルデータ
real(8), intent(in) :: xy_data(0:im-1,1:jm)
!(in) 入力格子点データ
w_DivMu_xy = w_xy(xy_data,ipow=2,iflag=1)
end function w_DivMu_xy
| Function : | |||
| w_Div_xy_xy((nm+1)*(nm+1)) : | real(8)
| ||
| xy_u(0:im-1,1:jm) : | real(8), intent(in)
| ||
| xy_v(0:im-1,1:jm) : | real(8), intent(in)
|
2 つの入力格子点データをベクトル成分とする発散を計算し, スペクトルデータとして返す(1 層用).
function w_Div_xy_xy(xy_u,xy_v)
!
! 2 つの入力格子点データをベクトル成分とする発散を計算し,
! スペクトルデータとして返す(1 層用).
!
real(8) :: w_Div_xy_xy((nm+1)*(nm+1))
!(out) 2 つの入力格子点データをベクトル成分とする発散のスペクトルデータ
real(8), intent(in) :: xy_u(0:im-1,1:jm)
!(in) ベクトル経度成分の格子点データ
real(8), intent(in) :: xy_v(0:im-1,1:jm)
!(in) ベクトル緯度成分の格子点データ
w_Div_xy_xy = w_Divlon_xy(xy_u) + w_Divlat_xy(xy_v)
end function w_Div_xy_xy
| Function : | |||
| w_Jacobian_w_w((nm+1)*(nm+1)) : | real(8)
| ||
| w_a((nm+1)*(nm+1)) : | real(8), intent(in)
| ||
| w_b((nm+1)*(nm+1)) : | real(8), intent(in)
|
2 つのスペクトルデータにヤコビアン
J(f,g) = ∂f/∂λ・∂g/∂μ - ∂g/∂λ・∂f/∂μ
= ∂f/∂λ・1/cosφ・∂g/∂φ
- ∂g/∂λ・1/cosφ・∂f/∂φ
を作用させる(1 層用).
function w_Jacobian_w_w(w_a,w_b)
! 2 つのスペクトルデータにヤコビアン
!
! J(f,g) = ∂f/∂λ・∂g/∂μ - ∂g/∂λ・∂f/∂μ
! = ∂f/∂λ・1/cosφ・∂g/∂φ
! - ∂g/∂λ・1/cosφ・∂f/∂φ
!
! を作用させる(1 層用).
real(8) :: w_Jacobian_w_w((nm+1)*(nm+1))
!(out) 2 つのスペクトルデータのヤコビアン
real(8), intent(in) :: w_a((nm+1)*(nm+1))
!(in) 1つ目の入力スペクトルデータ
real(8), intent(in) :: w_b((nm+1)*(nm+1))
!(in) 2つ目の入力スペクトルデータ
w_Jacobian_w_w = w_xy( xy_w(w_DLon_w(w_a))*xy_w(w_b,ipow=2,iflag=1) - xy_w(w_DLon_w(w_b))*xy_w(w_a,ipow=2,iflag=1) )
end function w_Jacobian_w_w
| Function : | |||
| w_LaplaInv_w((nm+1)*(nm+1)) : | real(8)
| ||
| w_data((nm+1)*(nm+1)) : | real(8), intent(in)
|
入力スペクトルデータに逆ラプラシアン
▽^{-2}
=[1/cos^2φ・∂^2/∂λ^2 + 1/cosφ・∂/∂φ(cosφ∂/∂φ)]^{-1}
を作用する(1 層用).
スペクトルデータの逆ラプラシアンとは, 対応する格子点データに 逆ラプラシアンを作用させたデータのスペクトル変換のことである.
function w_LaplaInv_w(w_data)
!
! 入力スペクトルデータに逆ラプラシアン
!
! ▽^{-2}
! =[1/cos^2φ・∂^2/∂λ^2 + 1/cosφ・∂/∂φ(cosφ∂/∂φ)]^{-1}
!
! を作用する(1 層用).
!
! スペクトルデータの逆ラプラシアンとは, 対応する格子点データに
! 逆ラプラシアンを作用させたデータのスペクトル変換のことである.
!
real(8) :: w_LaplaInv_w((nm+1)*(nm+1))
!(out) スペクトルデータの逆ラプラシアン
real(8), intent(in) :: w_data((nm+1)*(nm+1))
!(in) 入力スペクトルデータ
call sjclap(mm,w_data,w_LaplaInv_w,D,2)
end function w_LaplaInv_w
| Function : | |||
| w_Lapla_w((nm+1)*(nm+1)) : | real(8)
| ||
| w_data((nm+1)*(nm+1)) : | real(8), intent(in)
|
入力スペクトルデータにラプラシアン
▽^2 = 1/cos^2φ・∂^2/∂λ^2 + 1/cosφ・∂/∂φ(cosφ∂/∂φ)
を作用する(1 層用).
スペクトルデータのラプラシアンとは, 対応する格子点データに ラプラシアンを作用させたデータのスペクトル変換のことである.
function w_Lapla_w(w_data)
!
! 入力スペクトルデータにラプラシアン
!
! ▽^2 = 1/cos^2φ・∂^2/∂λ^2 + 1/cosφ・∂/∂φ(cosφ∂/∂φ)
!
! を作用する(1 層用).
!
! スペクトルデータのラプラシアンとは, 対応する格子点データに
! ラプラシアンを作用させたデータのスペクトル変換のことである.
!
real(8) :: w_Lapla_w((nm+1)*(nm+1))
!(out) 入力スペクトルデータのラプラシアン
real(8), intent(in) :: w_data((nm+1)*(nm+1))
!(in) 入力スペクトルデータ
call sjclap(mm,w_data,w_Lapla_w,D,1)
end function w_Lapla_w
| Subroutine : |
スペクトル微分計算に必要となる作業領域を設定する.
他の関数を呼ぶ前に, 最初にこのサブルーチンを呼んで 初期設定をしなければならない.
このサブルーチンを単独で用いるのでなく, 上位サブルーチン w_Initial を使用すること.
subroutine w_deriv_initial
!
! スペクトル微分計算に必要となる作業領域を設定する.
!
! 他の関数を呼ぶ前に, 最初にこのサブルーチンを呼んで
! 初期設定をしなければならない.
!
! このサブルーチンを単独で用いるのでなく,
! 上位サブルーチン w_Initial を使用すること.
!
allocate(D((nm+1)*(nm+1)*2)) ! ラプラシアン演算用配列
allocate(rn((nm+1)*(nm+1),2)) ! ラプラシアン演算用配列
call sjinid(mm,D)
rn = reshape(D,(/(nm+1)**2,2/))
call MessageNotify('M','w_deriv_initial', 'w_deriv_module_sjpack_cuda (2011/03/11) is initialized')
end subroutine w_deriv_initial
| Function : | |||
| xy_GradLambda_w(0:im-1,1:jm) : | real(8)
| ||
| w_data((nm+1)*(nm+1)) : | real(8), intent(in)
|
スペクトルデータに勾配型経度微分 ∂/∂λ を作用する(1 層用).
function xy_GradLambda_w(w_data)
!
! スペクトルデータに勾配型経度微分 ∂/∂λ を作用する(1 層用).
!
real(8) :: xy_GradLambda_w(0:im-1,1:jm)
!(out) スペクトルデータを勾配型経度微分した格子点データ
real(8), intent(in) :: w_data((nm+1)*(nm+1))
!(in) 入力スペクトルデータ
xy_GradLambda_w = xy_w(w_data,ipow=0,iflag=-1)
end function xy_GradLambda_w
| Function : | |||
| xy_GradLat_w(0:im-1,1:jm) : | real(8)
| ||
| w_data((nm+1)*(nm+1)) : | real(8), intent(in)
|
スペクトルデータに勾配型緯度微分 ∂/∂φ を作用させて 格子点データに変換して返す(1 層用).
function xy_GradLat_w(w_data)
!
! スペクトルデータに勾配型緯度微分 ∂/∂φ を作用させて
! 格子点データに変換して返す(1 層用).
!
real(8) :: xy_GradLat_w(0:im-1,1:jm)
!(out) スペクトルデータを勾配型緯度微分した格子点データ
real(8), intent(in) :: w_data((nm+1)*(nm+1))
!(in) 入力スペクトルデータ
xy_GradLat_w = xy_w(w_data,ipow=1,iflag=1)
end function xy_GradLat_w
| Function : | |||
| xy_GradLon_w(0:im-1,1:jm) : | real(8)
| ||
| w_data((nm+1)*(nm+1)) : | real(8), intent(in)
|
スペクトルデータに勾配型経度微分 1/cosφ・∂/∂λ を 作用させた格子点データを返す(1 層用).
function xy_GradLon_w(w_data)
!
! スペクトルデータに勾配型経度微分 1/cosφ・∂/∂λ を
! 作用させた格子点データを返す(1 層用).
!
real(8) :: xy_GradLon_w(0:im-1,1:jm)
!(out) スペクトルデータを勾配型経度微分した格子点データ
real(8), intent(in) :: w_data((nm+1)*(nm+1))
!(in) 入力スペクトルデータ
xy_GradLon_w = xy_w(w_data,ipow=1,iflag=-1)
end function xy_GradLon_w
| Function : | |||
| xy_GradMu_w(0:im-1,1:jm) : | real(8)
| ||
| w_data((nm+1)*(nm+1)) : | real(8), intent(in)
|
スペクトルデータに勾配型緯度微分 (1-μ^2)∂/∂μ (μ=sinφ) を作用させて格子点データに変換して返す(1 層用).
function xy_GradMu_w(w_data)
!
! スペクトルデータに勾配型緯度微分 (1-μ^2)∂/∂μ (μ=sinφ)
! を作用させて格子点データに変換して返す(1 層用).
!
real(8) :: xy_GradMu_w(0:im-1,1:jm)
!(out) スペクトルデータを勾配型緯度微分した格子点データ
real(8), intent(in) :: w_data((nm+1)*(nm+1))
!(in) 入力スペクトルデータ
xy_GradMu_w = xy_w(w_data,ipow=0,iflag=1)
end function xy_GradMu_w