#include <misc.h>
#include <preproc.h>
module UrbanInputMod 6,3
!-----------------------------------------------------------------------
!BOP
!
! !MODULE: UrbanInputMod
!
! !DESCRIPTION:
! Read in input urban data - fill in data structure urbinp
!
! !USES:
use shr_kind_mod
, only : r8 => shr_kind_r8
use abortutils
, only : endrun
use shr_sys_mod
, only : shr_sys_flush
!
! !PUBLIC TYPES:
implicit none
save
private
!
! !PUBLIC MEMBER FUNCTIONS:
public :: UrbanInput ! Read in urban input data
type urbinp_t
real(r8), pointer :: canyon_hwr(:)
real(r8), pointer :: wtlunit_roof(:)
real(r8), pointer :: wtroad_perv(:)
real(r8), pointer :: em_roof(:)
real(r8), pointer :: em_improad(:)
real(r8), pointer :: em_perroad(:)
real(r8), pointer :: em_wall(:)
real(r8), pointer :: alb_roof_dir(:,:)
real(r8), pointer :: alb_roof_dif(:,:)
real(r8), pointer :: alb_improad_dir(:,:)
real(r8), pointer :: alb_improad_dif(:,:)
real(r8), pointer :: alb_perroad_dir(:,:)
real(r8), pointer :: alb_perroad_dif(:,:)
real(r8), pointer :: alb_wall_dir(:,:)
real(r8), pointer :: alb_wall_dif(:,:)
real(r8), pointer :: ht_roof(:)
real(r8), pointer :: wind_hgt_canyon(:)
real(r8), pointer :: tk_wall(:,:)
real(r8), pointer :: tk_roof(:,:)
real(r8), pointer :: tk_improad(:,:)
real(r8), pointer :: cv_wall(:,:)
real(r8), pointer :: cv_roof(:,:)
real(r8), pointer :: cv_improad(:,:)
real(r8), pointer :: thick_wall(:)
real(r8), pointer :: thick_roof(:)
integer, pointer :: nlev_improad(:)
real(r8), pointer :: t_building_min(:)
real(r8), pointer :: t_building_max(:)
end type urbinp_t
public urbinp_t
type (urbinp_t) , public :: urbinp ! urban input derived type
!
!EOP
!-----------------------------------------------------------------------
contains
!-----------------------------------------------------------------------
!BOP
!
! !IROUTINE: UrbanInput
!
! !INTERFACE:
subroutine UrbanInput(mode) 2,74
!
! !DESCRIPTION:
! Allocate memory and read in urban input data
!
! !USES:
use clm_varpar
, only : lsmlon, lsmlat, numrad, nlevurb, numsolar
use clm_varctl
, only : iulog, fsurdat, single_column
use fileutils
, only : getavu, relavu, getfil, opnfil
use spmdMod
, only : masterproc
use ncdio
, only : ncd_iolocal, check_dim, check_ret
use clmtype
, only : grlnd
use decompMod
, only : get_proc_bounds
use spmdGathScatMod
!
! !ARGUMENTS:
implicit none
include 'netcdf.inc'
character(len=*), intent(in) :: mode
!
! !CALLED FROM:
! subroutine initialize
!
! !REVISION HISTORY:
! Created by Mariana Vertenstein July 2004
! Revised by Keith Oleson for netcdf input Jan 2008
!
!
! !LOCAL VARIABLES:
!EOP
character(len=256) :: locfn ! local file name
character(len=32) :: desc
integer :: ncid,dimid,varid ! netCDF id's
integer :: begg,endg ! start/stop gridcells
integer :: start4d(4),count4d(4) ! netcdf start/count arrays
integer :: start3d(3),count3d(3) ! netcdf start/count arrays
integer :: nw,n,k,i,j,nn,mm
integer :: ier
integer :: nlevurb_i ! input grid: number of urban vertical levels
integer :: numsolar_i ! input grid: number of solar type (DIR/DIF)
integer :: numrad_i ! input grid: number of solar bands (VIS/NIR)
integer :: ret
real(r8),pointer :: arrayl(:) ! generic global array
character(len=32) :: subname = 'UrbanInput' ! subroutine name
!-----------------------------------------------------------------------
call get_proc_bounds
(begg,endg)
if (mode == 'initialize') then
! Allocate dynamic memory
allocate(urbinp%canyon_hwr(begg:endg), &
urbinp%wtlunit_roof(begg:endg), &
urbinp%wtroad_perv(begg:endg), &
urbinp%em_roof(begg:endg), &
urbinp%em_improad(begg:endg), &
urbinp%em_perroad(begg:endg), &
urbinp%em_wall(begg:endg), &
urbinp%alb_roof_dir(begg:endg,numrad), &
urbinp%alb_roof_dif(begg:endg,numrad), &
urbinp%alb_improad_dir(begg:endg,numrad), &
urbinp%alb_perroad_dir(begg:endg,numrad), &
urbinp%alb_improad_dif(begg:endg,numrad), &
urbinp%alb_perroad_dif(begg:endg,numrad), &
urbinp%alb_wall_dir(begg:endg,numrad), &
urbinp%alb_wall_dif(begg:endg,numrad), &
urbinp%ht_roof(begg:endg), &
urbinp%wind_hgt_canyon(begg:endg), &
urbinp%tk_wall(begg:endg,nlevurb), &
urbinp%tk_roof(begg:endg,nlevurb), &
urbinp%tk_improad(begg:endg,nlevurb), &
urbinp%cv_wall(begg:endg,nlevurb), &
urbinp%cv_roof(begg:endg,nlevurb), &
urbinp%cv_improad(begg:endg,nlevurb), &
urbinp%thick_wall(begg:endg), &
urbinp%thick_roof(begg:endg), &
urbinp%nlev_improad(begg:endg), &
urbinp%t_building_min(begg:endg), &
urbinp%t_building_max(begg:endg), &
stat=ier)
if (ier /= 0) then
write(iulog,*)'initUrbanInput: allocation error '; call endrun
()
endif
! Read urban data
if (masterproc) then
write(iulog,*)' Reading in urban input data from fsurdat file ...'
call getfil
(fsurdat, locfn, 0)
call check_ret
(nf_open(locfn, 0, ncid), subname)
write(iulog,*) subname,trim(fsurdat)
write(iulog,*) " Expected dimensions: lsmlon=",lsmlon," lsmlat=",lsmlat
if (.not. single_column) then
call check_dim
(ncid, 'lsmlon', lsmlon)
call check_dim
(ncid, 'lsmlon', lsmlon)
end if
call check_ret
(nf_inq_dimid(ncid, 'nlevurb', dimid), subname)
call check_ret
(nf_inq_dimlen(ncid, dimid, nlevurb_i), subname)
if (nlevurb_i /= nlevurb) then
write(iulog,*)trim(subname)// ': parameter nlevurb= ',nlevurb, &
'does not equal input dataset nlevurb= ',nlevurb_i
call endrun
endif
call check_ret
(nf_inq_dimid(ncid, 'numsolar', dimid), subname)
call check_ret
(nf_inq_dimlen(ncid, dimid, numsolar_i), subname)
if (numsolar_i /= numsolar) then
write(iulog,*)trim(subname)// ': parameter numsolar= ',numsolar, &
'does not equal input dataset numsolar= ',numsolar_i
call endrun
endif
call check_ret
(nf_inq_dimid(ncid, 'numrad', dimid), subname)
call check_ret
(nf_inq_dimlen(ncid, dimid, numrad_i), subname)
if (numrad_i /= numrad) then
write(iulog,*)trim(subname)// ': parameter numrad= ',numrad, &
'does not equal input dataset numrad= ',numrad_i
call endrun
endif
end if
allocate(arrayl(begg:endg))
call ncd_iolocal
(ncid,'CANYON_HWR','read',urbinp%canyon_hwr,grlnd,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: CANYON_HWR NOT on fsurdat file' )
call ncd_iolocal
(ncid,'WTLUNIT_ROOF','read',urbinp%wtlunit_roof,grlnd,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: WTLUNIT_ROOF NOT on fsurdat file' )
call ncd_iolocal
(ncid,'WTROAD_PERV','read',urbinp%wtroad_perv,grlnd,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: WTROAD_PERV NOT on fsurdat file' )
call ncd_iolocal
(ncid,'EM_ROOF','read',urbinp%em_roof,grlnd,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: EM_ROOF NOT on fsurdat file' )
call ncd_iolocal
(ncid,'EM_IMPROAD','read',urbinp%em_improad,grlnd,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: EM_IMPROAD NOT on fsurdat file' )
call ncd_iolocal
(ncid,'EM_PERROAD','read',urbinp%em_perroad,grlnd,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: EM_PERROAD NOT on fsurdat file' )
call ncd_iolocal
(ncid,'EM_WALL','read',urbinp%em_wall,grlnd,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: EM_WALL NOT on fsurdat file' )
call ncd_iolocal
(ncid,'HT_ROOF','read',urbinp%ht_roof,grlnd,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: HT_ROOF NOT on fsurdat file' )
call ncd_iolocal
(ncid,'WIND_HGT_CANYON','read',urbinp%wind_hgt_canyon,grlnd,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: WIND_HGT_CANYON NOT on fsurdat file' )
call ncd_iolocal
(ncid,'THICK_WALL','read',urbinp%thick_wall,grlnd,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: THICK_WALL NOT on fsurdat file' )
call ncd_iolocal
(ncid,'THICK_ROOF','read',urbinp%thick_roof,grlnd,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: THICK_ROOF NOT on fsurdat file' )
call ncd_iolocal
(ncid,'NLEV_IMPROAD','read',urbinp%nlev_improad,grlnd,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: NLEV_IMPROAD NOT on fsurdat file' )
call ncd_iolocal
(ncid,'T_BUILDING_MIN','read',urbinp%t_building_min,grlnd,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: T_BUILDING_MIN NOT on fsurdat file' )
call ncd_iolocal
(ncid,'T_BUILDING_MAX','read',urbinp%t_building_max,grlnd,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: T_BUILDING_MAX NOT on fsurdat file' )
start4d(1) = 1
count4d(1) = lsmlon
start4d(2) = 1
count4d(2) = lsmlat
start4d(3) = 1
count4d(3) = 1
start4d(4) = 1
count4d(4) = 1
do mm = 1,numsolar
do nn = 1,numrad
start4d(3) = nn
start4d(4) = mm
call ncd_iolocal
(ncid,'ALB_IMPROAD','read',arrayl,grlnd,start4d,count4d,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: ALB_IMPROAD NOT on fsurdat file' )
if (mm .eq. 1) then
urbinp%alb_improad_dir(begg:endg,nn) = arrayl(begg:endg)
else
urbinp%alb_improad_dif(begg:endg,nn) = arrayl(begg:endg)
end if
call ncd_iolocal
(ncid,'ALB_PERROAD','read',arrayl,grlnd,start4d,count4d,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: ALB_PERROAD NOT on fsurdat file' )
if (mm .eq. 1) then
urbinp%alb_perroad_dir(begg:endg,nn) = arrayl(begg:endg)
else
urbinp%alb_perroad_dif(begg:endg,nn) = arrayl(begg:endg)
end if
call ncd_iolocal
(ncid,'ALB_ROOF','read',arrayl,grlnd,start4d,count4d,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: ALB_ROOF NOT on fsurdat file' )
if (mm .eq. 1) then
urbinp%alb_roof_dir(begg:endg,nn) = arrayl(begg:endg)
else
urbinp%alb_roof_dif(begg:endg,nn) = arrayl(begg:endg)
end if
call ncd_iolocal
(ncid,'ALB_WALL','read',arrayl,grlnd,start4d,count4d,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: ALB_WALL NOT on fsurdat file' )
if (mm .eq. 1) then
urbinp%alb_wall_dir(begg:endg,nn) = arrayl(begg:endg)
else
urbinp%alb_wall_dif(begg:endg,nn) = arrayl(begg:endg)
end if
end do
end do
start3d(1) = 1
count3d(1) = lsmlon
start3d(2) = 1
count3d(2) = lsmlat
start3d(3) = 1
count3d(3) = 1
do nn = 1,nlevurb
start3d(3) = nn
call ncd_iolocal
(ncid,'TK_IMPROAD','read',arrayl,grlnd,start3d,count3d,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: TK_IMPROAD NOT on fsurdat file' )
urbinp%tk_improad(begg:endg,nn) = arrayl(begg:endg)
call ncd_iolocal
(ncid,'TK_ROOF','read',arrayl,grlnd,start3d,count3d,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: TK_ROOF NOT on fsurdat file' )
urbinp%tk_roof(begg:endg,nn) = arrayl(begg:endg)
call ncd_iolocal
(ncid,'TK_WALL','read',arrayl,grlnd,start3d,count3d,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: TK_WALL NOT on fsurdat file' )
urbinp%tk_wall(begg:endg,nn) = arrayl(begg:endg)
call ncd_iolocal
(ncid,'CV_IMPROAD','read',arrayl,grlnd,start3d,count3d,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: CV_IMPROAD NOT on fsurdat file' )
urbinp%cv_improad(begg:endg,nn) = arrayl(begg:endg)
call ncd_iolocal
(ncid,'CV_ROOF','read',arrayl,grlnd,start3d,count3d,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: CV_ROOF NOT on fsurdat file' )
urbinp%cv_roof(begg:endg,nn) = arrayl(begg:endg)
call ncd_iolocal
(ncid,'CV_WALL','read',arrayl,grlnd,start3d,count3d,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: CV_WALL NOT on fsurdat file' )
urbinp%cv_wall(begg:endg,nn) = arrayl(begg:endg)
end do
deallocate(arrayl)
if (masterproc) then
call check_ret
(nf_close(ncid), subname)
write(iulog,*)' Sucessfully read urban input data'
write(iulog,*)
end if
else if (mode == 'finalize') then
deallocate(urbinp%canyon_hwr, &
urbinp%wtlunit_roof, &
urbinp%wtroad_perv, &
urbinp%em_roof, &
urbinp%em_improad, &
urbinp%em_perroad, &
urbinp%em_wall, &
urbinp%alb_roof_dir, &
urbinp%alb_roof_dif, &
urbinp%alb_improad_dir, &
urbinp%alb_perroad_dir, &
urbinp%alb_improad_dif, &
urbinp%alb_perroad_dif, &
urbinp%alb_wall_dir, &
urbinp%alb_wall_dif, &
urbinp%ht_roof, &
urbinp%wind_hgt_canyon, &
urbinp%tk_wall, &
urbinp%tk_roof, &
urbinp%tk_improad, &
urbinp%cv_wall, &
urbinp%cv_roof, &
urbinp%cv_improad, &
urbinp%thick_wall, &
urbinp%thick_roof, &
urbinp%nlev_improad, &
urbinp%t_building_min, &
urbinp%t_building_max, &
stat=ier)
if (ier /= 0) then
write(iulog,*)'initUrbanInput: deallocation error '; call endrun
()
endif
else
write(iulog,*)'initUrbanInput error: mode ',trim(mode),' not supported '
call endrun
()
end if
end subroutine UrbanInput
end module UrbanInputMod