Class | la_module |
In: |
libsrc/la_module/la_module.f90
|
Authors: | Shin-ichi Takehiro, Youhei SASAKI |
Version: | $Id: la_module.f90 590 2013-08-19 08:48:21Z uwabami $ |
Copyright&License: | See COPYRIGHT |
spml/l_module モジュールは球面上での経度方向に一様な帯状的子午面 2 次元 流体運動をルジャンドル多項式を用いたスペクトル法によって数値計算する ための Fortran90 関数を提供する.
内部で ISPACK の LTPACK の Fortran77 サブルーチンを呼んでいる. スペクトルデータおよび格子点データの格納方法や変換の詳しい計算法に ついては ISPACK/LTPACK のマニュアルを参照されたい.
la_ : | スペクトル(ルジャンドル多項式成分)データ(鉛直多層) |
ya_ : | 2 次元緯度鉛直格子点データ |
l_ : | スペクトル(ルジャンドル多項式成分)データ |
y_ : | 1 次元緯度格子点データ |
_la : | スペクト(ルジャンドル多項式成分)ルデータ(鉛直多層) |
_ya : | 緯度鉛直 2 次元格子点データ |
_l : | スペクト(ルジャンドル多項式成分)ルデータ |
_y : | 緯度方向 1 次元格子点データ |
la_Initial : | スペクトル変換の格子点数, 波数, 領域の大きさの設定 |
la_Finalize : | モジュールの終了処理(割り付け配列の解放)をおこなう. |
y_Lat : | 格子点座標(緯度, 経度座標)を格納した 1 次元配列 |
y_Lat_Weight : | 重み座標を格納した 1 次元配列 |
ya_la : | スペクトルデータから格子データへの変換 |
la_ya : | 格子データからスペクトルデータへの変換 |
y_l : | スペクトルデータから格子データへの変換 |
l_y : | 格子データからスペクトルデータへの変換 |
la_Lapla_la : | スペクトルデータにラプラシアンを作用させる |
la_LaplaInv_la : | スペクトルデータにラプラシアンの逆変換を作用させる |
ya_GradLat_la : | スペクトルデータに勾配型緯度微分∂/∂φを作用させる |
la_DivLat_ya : | 格子データに 発散型緯度微分 1/cosφ・∂(g cosφ)/∂φを作用させる |
l_Lapla_l : | スペクトルデータにラプラシアンを作用させる |
l_LaplaInv_l : | スペクトルデータにラプラシアンの逆変換を作用させる |
y_GradLat_l : | スペクトルデータに勾配型緯度微分∂/∂φを作用させる |
l_DivLat_y : | 格子データに 発散型緯度微分 1/cosφ・∂(g cosφ)/∂φを作用させる |
ya_GradMu_la : | スペクトルデータに 勾配型緯度微分 (1-μ^2)∂/∂μを作用させる |
la_DivMu_ya : | 格子データに発散型緯度微分∂/∂μを作用させる |
y_GradMu_l : | スペクトルデータに 勾配型緯度微分 (1-μ^2)∂/∂μを作用させる |
l_DivMu_y : | 格子データに発散型緯度微分∂/∂μを作用させる |
Interpolate_la : | スペクトルデータから任意の点での値を求める. |
Interpolate_l : | スペクトルデータから任意の点での値を求める. |
a_IntLat_ya, a_AvrLat_ya : | 2 次元格子点データの緯度方向積分および平均 |
IntLat_y, AvrLat_y : | 1 次元格子点データの緯度方向積分および平均 |
作成中
Function : | |||
AvrLat_y : | real(8)
| ||
y_data(1:jm) : | real(8), intent(in)
|
1 次元(Y)格子点データの緯度(Y)方向平均.
実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算し, y_Y_Weight の総和で割ることで平均している.
Original external subprogram is l_module#AvrLat_y
Function : | |||
IntLat_y : | real(8)
| ||
y_data(1:jm) : | real(8), intent(in)
|
1 次元緯度(Y)格子点データの Y 方向積分.
実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算している.
Original external subprogram is l_module#IntLat_y
Function : | |||
Interpolate_l : | real(8)
| ||
l_data(0:nn) : | real(8), intent(IN)
| ||
alat : | real(8), intent(IN)
|
緯度 alat における関数値を そのルジャンドル変換係数 l_data から補間計算する
Original external subprogram is l_module#Interpolate_l
Function : | |||
a_AvrLat_ya(size(ya_data,2)) : | real(8)
| ||
ya_data(:,:) : | real(8), intent(in)
|
2 次元緯度鉛直格子点データの緯度(Y)方向平均.
実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算し, y_Y_Weight の総和で割ることで平均している.
function a_AvrLat_ya(ya_data) ! ! 2 次元緯度鉛直格子点データの緯度(Y)方向平均. ! ! 実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算し, ! y_Y_Weight の総和で割ることで平均している. ! real(8), intent(in) :: ya_data(:,:) !(in) 緯度鉛直格子点データ(1:jm,:) real(8) :: a_AvrLat_ya(size(ya_data,2)) !(out) 平均値 a_AvrLat_ya = a_IntLat_ya(ya_data)/sum(y_Lat_weight) end function a_AvrLat_ya
Function : | |||
a_IntLat_ya(size(ya_data,2)) : | real(8)
| ||
ya_data(:,:) : | real(8), intent(in)
|
2 次元緯度鉛直格子点データの緯度方向積分.
実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算している.
function a_IntLat_ya(ya_data) ! ! 2 次元緯度鉛直格子点データの緯度方向積分. ! ! 実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算している. ! real(8), intent(in) :: ya_data(:,:) !(in) 緯度鉛直格子点データ(1:jm,:) real(8) :: a_IntLat_ya(size(ya_data,2)) !(out) 積分値 integer :: k do k=1,size(ya_data,2) a_IntLat_ya(k) = sum(ya_data(:,k) * y_Lat_weight) end do end function a_IntLat_ya
Function : | |||
a_Interpolate_la(size(la_data,2)) : | real(8)
| ||
la_data(:,:) : | real(8), intent(IN)
| ||
alat : | real(8), intent(IN)
|
緯度 alat における関数値を そのルジャンドル変換係数 la_data から補間計算する
function a_Interpolate_la(la_data,alat) ! ! 緯度 alat における関数値を ! そのルジャンドル変換係数 la_data から補間計算する ! real(8), intent(IN) :: la_data(:,:) ! スペクトルデータ(0:nm,:) real(8), intent(IN) :: alat ! 補間する位置(緯度) real(8) :: a_Interpolate_la(size(la_data,2)) ! 補間した値 integer :: k do k=1,size(la_data,2) a_Interpolate_la(k) = Interpolate_l(la_data(:,k),alat) end do end function a_Interpolate_la
Function : | |||
l_DivLat_y(0:nn) : | real(8)
| ||
y_data(1:jm) : | real(8), intent(in)
|
格子点データに発散型緯度微分 1/cosφ・∂(f cosφ)/∂φ を作用させて スペクトルデータに変換して返す.
Original external subprogram is l_module#l_DivLat_y
Function : | |||
l_DivMu_y(0:nn) : | real(8)
| ||
y_data(1:jm) : | real(8), intent(in)
|
格子点データに発散型緯度微分 ∂/∂μ (μ=sinφ)を作用させて スペクトルデータに変換して返す(1 層用).
Original external subprogram is l_module#l_DivMu_y
Function : | |||
l_LaplaInv_l(0:nn) : | real(8)
| ||
l_data(0:nn) : | real(8), intent(in)
|
入力スペクトルデータに逆ラプラシアン
▽^{-2} =[1/cosφ・∂/∂φ(cosφ∂/∂φ)]^{-1}
を作用する.
スペクトルデータの逆ラプラシアンとは, 対応する格子点データに 逆ラプラシアンを作用させたデータのスペクトル変換のことである.
Original external subprogram is l_module#l_LaplaInv_l
Function : | |||
l_Lapla_l(0:nn) : | real(8)
| ||
l_data(0:nn) : | real(8), intent(in)
|
入力スペクトルデータにラプラシアン
▽^2 = 1/cosφ・∂/∂φ(cosφ∂/∂φ)
を作用する.
スペクトルデータのラプラシアンとは, 対応する格子点データに ラプラシアンを作用させたデータのスペクトル変換のことである.
Original external subprogram is l_module#l_Lapla_l
Function : | |||
l_y(0:nn) : | real(8)
| ||
y_data(1:jm) : | real(8), intent(in)
|
スペクトルデータから格子データへ変換する(1 層用).
Original external subprogram is l_module#l_y
Function : | |||
la_DivLat_ya(0:nm,size(ya_data,2)) : | real(8)
| ||
ya_data(:,:) : | real(8), intent(in)
|
格子点データに発散型緯度微分 1/cosφ・∂(f cosφ)/∂φ を作用させて スペクトルデータに変換して返す(多層用)..
function la_DivLat_ya(ya_data) ! ! 格子点データに発散型緯度微分 1/cosφ・∂(f cosφ)/∂φ を作用させて ! スペクトルデータに変換して返す(多層用).. ! real(8), intent(in) :: ya_data(:,:) !(in) 入力格子点データ(1:jm,:) real(8) :: la_DivLat_ya(0:nm,size(ya_data,2)) !(out) 格子点データを発散型緯度微分したスペクトルデータ integer :: k do k=1,size(ya_data,2) la_DivLat_ya(:,k) = l_DivLat_y(ya_data(:,k)) end do end function la_DivLat_ya
Function : | |||
la_DivMu_ya(0:nm,size(ya_data,2)) : | real(8)
| ||
ya_data(:,:) : | real(8), intent(in)
|
格子点データに発散型緯度微分 ∂/∂μ (μ=sinφ)を作用させて スペクトルデータに変換して返す(多層用).
function la_DivMu_ya(ya_data) ! ! 格子点データに発散型緯度微分 ∂/∂μ (μ=sinφ)を作用させて ! スペクトルデータに変換して返す(多層用). ! real(8), intent(in) :: ya_data(:,:) !(in) 入力格子点データ(1:jm,:) real(8) :: la_DivMu_ya(0:nm,size(ya_data,2)) !(out) 格子点データを発散型緯度微分したスペクトルデータ integer :: k do k=1,size(ya_data,2) la_DivMu_ya(:,k) = l_DivMu_y(ya_data(:,k)) end do end function la_DivMu_ya
Subroutine : |
モジュールの終了処理(割り付け配列の解放)をおこなう.
解像度を変更する際にはこのサブルーチンを呼んで終了処理を おこなったのちに再度 l_Initial で初期設定しなければ ならない.
Original external subprogram is l_module#l_Finalize
Function : | |||
la_LaplaInv_la(0:nm,size(la_data,2)) : | real(8)
| ||
la_data(:,:) : | real(8), intent(in)
|
入力スペクトルデータに逆ラプラシアン
▽^{-2} =[1/cosφ・∂/∂φ(cosφ∂/∂φ)]^{-1}
を作用する(多層用).
スペクトルデータの逆ラプラシアンとは, 対応する格子点データに 逆ラプラシアンを作用させたデータのスペクトル変換のことである.
function la_LaplaInv_la(la_data) ! ! 入力スペクトルデータに逆ラプラシアン ! ! ▽^{-2} ! =[1/cosφ・∂/∂φ(cosφ∂/∂φ)]^{-1} ! ! を作用する(多層用). ! ! スペクトルデータの逆ラプラシアンとは, 対応する格子点データに ! 逆ラプラシアンを作用させたデータのスペクトル変換のことである. ! real(8), intent(in) :: la_data(:,:) !(in) 入力スペクトルデータ(0:nm,:) real(8) :: la_LaplaInv_la(0:nm,size(la_data,2)) !(out) スペクトルデータの逆ラプラシアン integer :: k do k=1,size(la_data,2) la_LaplaInv_la(:,k) = l_LaplaInv_l(la_data(:,k)) end do end function la_LaplaInv_la
Function : | |||
la_Lapla_la(0:nm,size(la_data,2)) : | real(8)
| ||
la_data(:,:) : | real(8), intent(in)
|
入力スペクトルデータにラプラシアン
▽^2 = 1/cosφ・∂/∂φ(cosφ∂/∂φ)
を作用する(多層用).
スペクトルデータのラプラシアンとは, 対応する格子点データに ラプラシアンを作用させたデータのスペクトル変換のことである.
function la_Lapla_la(la_data) ! ! 入力スペクトルデータにラプラシアン ! ! ▽^2 = 1/cosφ・∂/∂φ(cosφ∂/∂φ) ! ! を作用する(多層用). ! ! スペクトルデータのラプラシアンとは, 対応する格子点データに ! ラプラシアンを作用させたデータのスペクトル変換のことである. ! real(8), intent(in) :: la_data(:,:) !(in) 入力スペクトルデータ(0:nm,:) real(8) :: la_Lapla_la(0:nm,size(la_data,2)) !(out) 入力スペクトルデータのラプラシアン integer :: k do k=1,size(la_data,2) la_Lapla_la(:,k) = l_Lapla_l(la_data(:,k)) end do end function la_Lapla_la
Subroutine : | |||
n_in : | integer,intent(in)
| ||
j_in : | integer,intent(in)
| ||
l_init : | logical,intent(in),optional
|
スペクトル変換の格子点数, 波数を設定する.
他の関数を呼ぶ前に, 最初にこのサブルーチンを呼んで初期設定を しなければならない.
subroutine la_initial(n_in,j_in,l_init) ! ! スペクトル変換の格子点数, 波数を設定する. ! ! 他の関数を呼ぶ前に, 最初にこのサブルーチンを呼んで初期設定を ! しなければならない. ! integer,intent(in) :: j_in !(in) 格子点数(南北) integer,intent(in) :: n_in !(in) 切断波数の設定 logical,intent(in),optional :: l_init !(in) l_initial の call スイッチ if ( .not. present(l_init) ) then call l_Initial(n_in,j_in) else if ( l_init ) then call l_Initial(n_in,j_in) endif jm = j_in nm = n_in call MessageNotify( 'M','la_initial','la_module (2013/02/24) is initialized') end subroutine la_initial
Function : | |||
la_ya(0:nm,size(ya_data,2)) : | real(8)
| ||
ya_data(:,:) : | real(8), intent(in)
|
格子データからスペクトルデータへ変換する(多層用).
function la_ya(ya_data) ! ! 格子データからスペクトルデータへ変換する(多層用). ! real(8), intent(in) :: ya_data(:,:) !(in) スペクトルデータ(1:jm,:) real(8) :: la_ya(0:nm,size(ya_data,2)) !(out) 格子点データ integer :: k do k=1,size(ya_data,2) la_ya(:,k) = l_y(ya_data(:,k)) end do end function la_ya
Function : | |||
y_GradLat_l(1:jm) : | real(8)
| ||
l_data(0:nn) : | real(8), intent(in)
|
スペクトルデータに勾配型緯度微分 ∂/∂φ を作用させて 格子点データに変換して返す(1 層用).
Original external subprogram is l_module#y_GradLat_l
Function : | |||
y_GradMu_l(1:jm) : | real(8)
| ||
l_data(0:nm) : | real(8), intent(in)
|
スペクトルデータに勾配型緯度微分 (1-μ^2)∂/∂μ (μ=sinφ) を作用させて格子点データに変換して返す.
Original external subprogram is l_module#y_GradMu_l
Variable : | |||
y_Lat(:) : | real(8), allocatable
|
Original external subprogram is l_module#y_Lat
Variable : | |||
y_Lat_Weight(:) : | real(8), allocatable
|
Original external subprogram is l_module#y_Lat_Weight
Function : | |||
y_l(1:jm) : | real(8)
| ||
l_data(0:nn) : | real(8), intent(in)
|
スペクトルデータから格子データへ変換する(1 層用).
Original external subprogram is l_module#y_l
Function : | |||
ya_GradLat_la(1:jm,size(la_data,2)) : | real(8)
| ||
la_data(:,:) : | real(8), intent(in)
|
スペクトルデータに勾配型緯度微分 ∂/∂φ を作用させて 格子点データに変換して返す(多層用).
function ya_GradLat_la(la_data) ! ! スペクトルデータに勾配型緯度微分 ∂/∂φ を作用させて ! 格子点データに変換して返す(多層用). ! real(8), intent(in) :: la_data(:,:) !(in) 入力スペクトルデータ(0:nm,:) real(8) :: ya_GradLat_la(1:jm,size(la_data,2)) !(out) スペクトルデータを勾配型緯度微分した格子点データ integer :: k do k=1,size(la_data,2) ya_GradLat_la(:,k) = y_GradLat_l(la_data(:,k)) end do end function ya_GradLat_la
Function : | |||
ya_GradMu_la(1:jm,size(la_data,2)) : | real(8)
| ||
la_data(:,:) : | real(8), intent(in)
|
スペクトルデータに勾配型緯度微分 (1-μ^2)∂/∂μ (μ=sinφ) を作用させて格子点データに変換して返す(多層用)..
function ya_GradMu_la(la_data) ! ! スペクトルデータに勾配型緯度微分 (1-μ^2)∂/∂μ (μ=sinφ) ! を作用させて格子点データに変換して返す(多層用).. ! real(8), intent(in) :: la_data(:,:) !(in) 入力スペクトルデータ(0:nm,:) real(8) :: ya_GradMu_la(1:jm,size(la_data,2)) !(out) スペクトルデータを勾配型緯度微分した格子点データ integer :: k do k=1,size(la_data,2) ya_GradMu_la(:,k) = y_GradMu_l(la_data(:,k)) end do end function ya_GradMu_la
Function : | |||
ya_la(1:jm,size(la_data,2)) : | real(8)
| ||
la_data(:,:) : | real(8), intent(in)
|
スペクトルデータから格子データへ変換する(多層用).
function ya_la(la_data) ! ! スペクトルデータから格子データへ変換する(多層用). ! real(8), intent(in) :: la_data(:,:) !(in) スペクトルデータ(0:nm,:) real(8) :: ya_la(1:jm,size(la_data,2)) !(out) 格子点データ integer :: k do k=1,size(la_data,2) ya_la(:,k) = y_l(la_data(:,k)) end do end function ya_la