| 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