Class w_base_module
In: src/w_base_module.f90

Methods

l_nm   l_nm   l_nm   l_nm   nm_l   nm_l   w_base_Initial   xy_w  

Included Modules

dc_message

Public Instance methods

l_nm_array10(size(narray)) :integer
: スペクトルデータ位置
narray(:) :integer, intent(in)
: 第 1 引数 narray が整数 1 次元配列, 第 2 引数 m が整数の場合, narray と同じ大きさの 1 次元整数配列を返す.
 全波数
m :integer, intent(in)
: 帯状波数

————— 基本変換 ——————

[Source]



    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)
: 第 1,2 引数 narray, marray がともに整数 1 次元配列の場合, narray, marray と同じ大きさの 1 次元整数配列を返す. narray, marray は同じ大きさでなければならない.
 全波数
marray(:) :integer, intent(in)
: 帯状波数

————— 基本変換 ——————

[Source]



    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)
: 第 1 引数 n が整数, 第 2 引数 marray が整数 1 次元配列の場合, marray と同じ大きさの 1 次元整数配列を返す.
 全波数
marray(:) :integer, intent(in)
: 帯状波数

————— 基本変換 ——————

[Source]



    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,m がともに整数値の場合, 整数値を返す.
 スペクトルデータの格納位置
n :integer, intent(in)
: 全波数, 帯状波数
m :integer, intent(in)
: 全波数, 帯状波数

————— 基本変換 ——————

[Source]


    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 が整数値の場合, 対応する全波数と帯状波数を 長さ 2 の 1 次元整数値を返す. nm_l(1) が全波数, nm_l(2) が帯状波数である.
 全波数, 帯状波数
l :integer, intent(in)
: スペクトルデータの格納位置

————— 基本変換 ——————

[Source]



    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)
: 引数 larray が整数 1 次元配列の場合, larray に対応する n, m を格納した 2 次元整数配列を返す. nm_l_array(:,1) が全波数, nm_l_array(:,2) が帯状波数である.

————— 基本変換 ——————

[Source]



    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)
: 格子点の設定(東西, 南北)

————— 初期化 ——————

[Source]

    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
: 作用させる 1/cosφ の次数
iflag :integer, intent(in), optional
: 変換の種類

————— 基本変換 ——————

[Source]



    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

[Validate]