Class dcl_alloc
In: dcl_alloc.f90

namelist を読み込んだ後, 配列を割り付ける

Methods

Included Modules

dcl_defval dcl_arrayval m_stretch

Public Instance methods

Subroutine :
stat :integer,intent(in)

[Source]

subroutine dcl_alloc_val( stat )

  use dcl_defval
  use dcl_arrayval
  implicit none
  integer,intent(in) :: stat
  integer :: tmp_num1  ! 仮配列数 1
  integer :: tmp_num2  ! 仮配列数 2

  call val_counter( d2valc, val2d )
  call val_counter( ad2valc, val2ad )
  if(val2d+val2ad==0)then
     tmp_num1=1
  else
     tmp_num1=val2d+val2ad
  end if
  call val_counter( d3valc, val3d )
  call val_counter( ad3valc, val3ad )
  if(val3d+val3ad==0)then
     tmp_num2=1
  else
     tmp_num2=val3d+val3ad
  end if

  allocate(x(nx))
  allocate(y(ny))
  allocate(z(nz))
  allocate(lon(nx))
  allocate(lat(ny))
  allocate(val2(nx,ny,tmp_num1))
  allocate(val3(nx,ny,nz,tmp_num2))

end subroutine
Subroutine :

[Source]

subroutine dcl_dealloc_val

  use dcl_defval
  use dcl_arrayval
  deallocate(x)
  deallocate(y)
  deallocate(z)
  deallocate(lon)
  deallocate(lat)
  deallocate(val2)
  deallocate(val3)

end subroutine
Subroutine :
stat :integer, intent(inout)
 格子数と始点, 格子間隔から位置座標配列に値を代入するルーチン
 nx, ny 等を調整すると, lon, lat にも適用可能.

[Source]

subroutine dcl_pointdef( stat )
!  格子数と始点, 格子間隔から位置座標配列に値を代入するルーチン
!  nx, ny 等を調整すると, lon, lat にも適用可能.
  use dcl_defval
  use dcl_arrayval
!  use m_stretch
  implicit none
  integer, intent(inout) :: stat
  integer :: i
  real, allocatable :: tmpz(:), tmpdz(:)
  real :: ztop1, ztop2, zsfc

  allocate(tmpz(nz+3))  !  stretch array
  allocate(tmpdz(nz+3))  !  stretch array

  zsfc=0.0
  ztop1=zsfc+dz*real(nz)
  ztop2=ztop1-dz

  x=(/((xmin+dx*(i-1)),i=1,nx)/)
  y=(/((ymin+dy*(i-1)),i=1,ny)/)

  if(layer1/=0.0.or.layer2/=0.0)then
     call stretch( sthopt, 0.0, dzmin, layer1, layer2, ztop2, ztop1, nz+3, tmpz, tmpdz )
     do i=1,nz
        z(i)=tmpz(i+1)
     end do
  else
     z=(/((zmin+dz*(i-1)),i=1,nz)/)
  end if

  lon=(/((lon_min+dlon*(i-1)),i=1,nx)/)
  lat=(/((lat_min+dlat*(i-1)),i=1,ny)/)

  deallocate(tmpz)
  deallocate(tmpdz)

end subroutine
Subroutine :
valc :character(*), intent(in)
: dump されているかの確認変数
valcount :integer, intent(inout)
: 用意する必要のある変数の数

CReSS の dump ファイルに格納されている 3 次元変数のうち, 呼び出す 必要のある変数の数を計算するルーチン valc に ‘121000021’ などの文字型変数に数字が埋め込まれている形をとる. 1 番目から順に数字を評価し, 何個の変数が必要かを計算する. ‘0’ = 変数としてカウントしない, ‘1’ = 1 つ分として変数をカウントする. ちなみに同様のフォーマットにすると, 2 次元版でも使用可能.

[Source]

subroutine val_counter( valc, valcount )
  ! CReSS の dump ファイルに格納されている 3 次元変数のうち, 呼び出す
  ! 必要のある変数の数を計算するルーチン
  ! valc に '121000021' などの文字型変数に数字が埋め込まれている形をとる.
  ! 1 番目から順に数字を評価し, 何個の変数が必要かを計算する.
  ! '0' = 変数としてカウントしない, '1' = 1 つ分として変数をカウントする.
  ! ちなみに同様のフォーマットにすると, 2 次元版でも使用可能.
  use dcl_defval
  use dcl_arrayval
  implicit none
  character(*), intent(in) :: valc  ! dump されているかの確認変数
  integer, intent(inout) :: valcount  ! 用意する必要のある変数の数
  integer :: i, chan

  valcount=0
  chan=len_trim(valc)
write(*,*) "len=", chan
  do i=1,chan
     select case (valc(i:i))
     case ('0')
        valcount=valcount
     case ('1')
        valcount=valcount+1
     end select
  end do

end subroutine