Class | w_base_module |
In: |
src/w_base_module.f90
|
l_nm_array10(size(narray)) : | integer
| ||
narray(:) : | integer, intent(in)
| ||
m : | integer, intent(in)
|
————— 基本変換 ——————
function l_nm_array10(narray,m) ! ! 第 1 引数 narray が整数 1 次元配列, 第 2 引数 m が整数の場合, ! narray と同じ大きさの 1 次元整数配列を返す. ! integer, intent(in) :: narray(:) ! 全波数 integer, intent(in) :: m ! 帯状波数 integer :: l_nm_array10(size(narray)) ! スペクトルデータ位置 integer :: i do i=1, size(narray) l_nm_array10(i) = l_nm_array00(narray(i),m) enddo end function l_nm_array10
l_nm_array11(size(narray)) : | integer
| ||
narray(:) : | integer, intent(in)
| ||
marray(:) : | integer, intent(in)
|
————— 基本変換 ——————
function l_nm_array11(narray,marray) ! ! 第 1,2 引数 narray, marray がともに整数 1 次元配列の場合, ! narray, marray と同じ大きさの 1 次元整数配列を返す. ! narray, marray は同じ大きさでなければならない. ! integer, intent(in) :: narray(:) ! 全波数 integer, intent(in) :: marray(:) ! 帯状波数 integer :: l_nm_array11(size(narray)) ! スペクトルデータ位置 integer :: i if ( size(narray) .ne. size(marray) ) then call MessageNotify('E','l_nm_array11', 'dimensions of input arrays n and m are different.') endif do i=1, size(narray) l_nm_array11(i) = l_nm_array00(narray(i),marray(i)) enddo end function l_nm_array11
l_nm_array01(size(marray)) : | integer
| ||
n : | integer, intent(in)
| ||
marray(:) : | integer, intent(in)
|
————— 基本変換 ——————
function l_nm_array01(n,marray) ! スペクトルデータの格納位置 ! ! 第 1 引数 n が整数, 第 2 引数 marray が整数 1 次元配列の場合, ! marray と同じ大きさの 1 次元整数配列を返す. ! integer, intent(in) :: n ! 全波数 integer, intent(in) :: marray(:) ! 帯状波数 integer :: l_nm_array01(size(marray)) ! スペクトルデータ位置 integer :: i do i=1, size(marray) l_nm_array01(i) = l_nm_array00(n,marray(i)) enddo end function l_nm_array01
l_nm_array00 : | integer
| ||
n : | integer, intent(in)
| ||
m : | integer, intent(in)
|
————— 基本変換 ——————
function l_nm_array00(n,m) ! ! 引数 n,m がともに整数値の場合, 整数値を返す. ! integer :: l_nm_array00 ! スペクトルデータの格納位置 integer, intent(in) :: n, m ! 全波数, 帯状波数 call snnm2l(n,m,l_nm_array00) end function l_nm_array00
nm_l_int(2) : | integer
| ||
l : | integer, intent(in)
|
————— 基本変換 ——————
function nm_l_int(l) ! ! 引数 l が整数値の場合, 対応する全波数と帯状波数を ! 長さ 2 の 1 次元整数値を返す. ! nm_l(1) が全波数, nm_l(2) が帯状波数である. ! integer :: nm_l_int(2) ! 全波数, 帯状波数 integer, intent(in) :: l ! スペクトルデータの格納位置 call snl2nm(l,nm_l_int(1),nm_l_int(2)) end function nm_l_int
nm_l_array(size(larray),2) : | integer | ||
larray(:) : | integer, intent(in)
|
————— 基本変換 ——————
function nm_l_array(larray) ! ! 引数 larray が整数 1 次元配列の場合, ! larray に対応する n, m を格納した 2 次元整数配列を返す. ! nm_l_array(:,1) が全波数, nm_l_array(:,2) が帯状波数である. ! integer, intent(in) :: larray(:) integer :: nm_l_array(size(larray),2) integer :: i do i=1, size(larray) nm_l_array(i,:) = nm_l_int(larray(i)) enddo end function nm_l_array
n_in : | integer,intent(in)
| ||
i_in : | integer,intent(in)
| ||
j_in : | integer,intent(in)
|
————— 初期化 ——————
subroutine w_base_Initial(n_in,i_in,j_in) integer,intent(in) :: i_in, j_in ! 格子点の設定(東西, 南北) integer,intent(in) :: n_in ! 切断波数の設定 integer :: iw, i, j im = i_in jm = j_in nm = n_in allocate(t(im*2)) ! 変換用配列 allocate(ip(((nm+1)/2+nm+1)*2)) ! 変換用配列 allocate(p(((nm+1)/2+nm+1)*jm)) ! 変換用配列 allocate(r(((nm+1)/2*2+3)*(nm/2+1))) ! 変換用配列 allocate(ia((nm+1)*(nm+1)*4)) ! 変換用配列 allocate(a((nm+1)*(nm+1)*6)) ! 変換用配列 allocate(y(jm/2,4)) ! 変換用配列 allocate(q(((nm+1)/2+nm+1)*jm)) ! 作業配列 iw=(im+3*(nm+1))*jm allocate(ws(iw),ww(iw)) ! 作業用配列 allocate(x_Lon(im), y_Lat(jm)) ! 格子点座標格納配列 allocate(x_Lon_Weight(im),y_Lat_Weight(jm)) ! 格子点座標格納配列 allocate(xy_Lon(im,jm),xy_Lat(im,jm)) ! 格子点座標格納配列 call sninit(nm,im,jm,it,t,y,ip,p,r,ia,a) do i=1,im x_Lon(i) = 2*pi/im*(i-1) ! 経度座標 x_Lon_Weight(i) = 2*pi/im ! 経度座標重み enddo do j=1,jm/2 y_Lat(jm/2+j) = asin(y(j,1)) ! 緯度座標 y_Lat(jm/2-j+1) = -asin(y(j,1)) ! 緯度座標 y_Lat_Weight(jm/2+j) = 2*y(j,2) ! 緯度重み(Gauss grid) y_Lat_Weight(jm/2-j+1) = 2*y(j,2) ! 緯度重み(Gauss grid) enddo do j=1,jm xy_Lon(:,j) = x_Lon enddo do i=1,im xy_Lat(i,:) = y_Lat enddo end subroutine w_base_Initial
xy_w(im,jm) : | real(8)
| ||
w_data((nm+1)*(nm+1)) : | real(8), intent(in)
| ||
ipow : | integer, intent(in), optional
| ||
iflag : | integer, intent(in), optional
|
————— 基本変換 ——————
function xy_w(w_data,ipow,iflag) ! 球面調和関数スペクトル -> 格子点 real(8) :: xy_w(im,jm) ! 格子点 real(8), intent(in) :: w_data((nm+1)*(nm+1)) ! スペクトル integer, intent(in), optional :: ipow ! 作用させる 1/cosφ の次数 integer, intent(in), optional :: iflag ! 変換の種類 integer, parameter :: ipow_default = 0 integer, parameter :: iflag_default = 0 integer ipval, ifval if (present(ipow)) then ipval = ipow else ipval = ipow_default endif if (present(iflag)) then ifval = iflag else ifval = iflag_default endif call snts2g(nm,im,im,jm,jm,1,w_data,xy_w, it,t,y,ip,p,r,ia,a,q,ws,ww,ipval,ifval) end function xy_w