Class | dcl_alloc |
In: |
dcl_alloc.f90
|
namelist を読み込んだ後, 配列を割り付ける
Subroutine : | |
stat : | integer,intent(in) |
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 : |
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 にも適用可能.
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)
| ||
valcount : | integer, intent(inout)
|
CReSS の dump ファイルに格納されている 3 次元変数のうち, 呼び出す 必要のある変数の数を計算するルーチン valc に ‘121000021’ などの文字型変数に数字が埋め込まれている形をとる. 1 番目から順に数字を評価し, 何個の変数が必要かを計算する. ‘0’ = 変数としてカウントしない, ‘1’ = 1 つ分として変数をカウントする. ちなみに同様のフォーマットにすると, 2 次元版でも使用可能.
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