diff --git a/bld/namelist_files/namelist_defaults_ctsm.xml b/bld/namelist_files/namelist_defaults_ctsm.xml
index cee72ca5cf..21b92ba472 100644
--- a/bld/namelist_files/namelist_defaults_ctsm.xml
+++ b/bld/namelist_files/namelist_defaults_ctsm.xml
@@ -1103,6 +1103,12 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
>hgrid=ne0np4.ARCTICGRIS.ne30x8 maxpft=17 mask=tx0.1v2 use_cn=.false. use_crop=.false. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false.
+
+hgrid=ne0np4CONUS.ne30x8 maxpft=17 mask=tx0.1v2 use_cn=.false. use_crop=.false. irrigate=.true. glc_nec=10 do_transient_pfts=.false. use_excess_ice=.false.
+
+
lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_mpasa120_hist_2000_78pfts_c240908.nc
+
+lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne3np4_hist_2000_78pfts_c240925.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne3np4.pg3_hist_2000_78pfts_c240908.nc
@@ -1705,6 +1713,8 @@ lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne30np4.pg2_hist_1850_78pfts_c240908.n
lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne30np4.pg3_hist_1850_78pfts_c240908.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne3np4.pg3_hist_1850_78pfts_c240908.nc
+
+lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne3np4_hist_1850_78pfts_c240925.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_C96_hist_1850_78pfts_c240908.nc
@@ -1715,8 +1725,6 @@ lnd/clm2/surfdata_esmf/ctsm5.3.0/synthetic/surfdata_1x1_cidadinhoBR_synth_hist_2
lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_1x1_brazil_hist_1850_78pfts_c240912.nc
-
-lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne3np4.pg3_hist_1850_78pfts_c240908.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/surfdata_ne16np4.pg3_hist_1850_78pfts_c240908.nc
@@ -1787,6 +1795,8 @@ lnd/clm2/surfdata_esmf/NEON/ctsm5.3.0/surfdata_1x1_NEON_TOOL_hist_2000_78pfts_c2
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_mpasa120_SSP2-4.5_1850-2100_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne3np4_SSP2-4.5_1850-2100_78pfts_c240926.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne3np4.pg3_SSP2-4.5_1850-2100_78pfts_c240908.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_mpasa120_SSP2-4.5_1850-2100_78pfts_c240908.nc
+lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne3np4_SSP2-4.5_1850-2100_78pfts_c240926.nc
lnd/clm2/surfdata_esmf/ctsm5.3.0/landuse.timeseries_ne3np4.pg3_SSP2-4.5_1850-2100_78pfts_c240908.nc
Also --nofireemis because this is a SP compset
+
+
+
+
+
+
+
+
+
+
@@ -2120,6 +2130,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -2141,6 +2162,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -2171,6 +2203,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -2280,7 +2322,7 @@
-
+
@@ -2557,7 +2599,7 @@
-
+
diff --git a/python/ctsm/toolchain/gen_mksurfdata_jobscript_multi.py b/python/ctsm/toolchain/gen_mksurfdata_jobscript_multi.py
index fdf9466763..bde92fcf18 100755
--- a/python/ctsm/toolchain/gen_mksurfdata_jobscript_multi.py
+++ b/python/ctsm/toolchain/gen_mksurfdata_jobscript_multi.py
@@ -202,11 +202,11 @@ def main():
"ultra_hi_res_no_crop": ["mpasa15", "mpasa3p75"],
"standard_res": ["360x720cru", "0.9x1.25", "1.9x2.5", "C96", "mpasa120"],
"standard_res_no_f09": ["360x720cru", "1.9x2.5", "C96", "mpasa120"],
- "low_res": ["4x5", "10x15", "ne3np4.pg3"],
+ "low_res": ["4x5", "10x15", "ne3np4.pg3", "ne3np4"],
"mpasa480": ["mpasa480"],
"nldas_res": ["0.125nldas2"],
"5x5_amazon": ["5x5_amazon"],
- "ne3": ["ne3np4.pg3"],
+ "ne3": ["ne3np4", "ne3np4.pg3"],
"ne16": ["ne16np4.pg3"],
"ne30": ["ne30np4.pg3", "ne30np4.pg2", "ne30np4"],
"ne0np4": [
diff --git a/src/biogeochem/SatellitePhenologyMod.F90 b/src/biogeochem/SatellitePhenologyMod.F90
index 3e9341f430..9412d34586 100644
--- a/src/biogeochem/SatellitePhenologyMod.F90
+++ b/src/biogeochem/SatellitePhenologyMod.F90
@@ -13,7 +13,7 @@ module SatellitePhenologyMod
use shr_log_mod , only : errMsg => shr_log_errMsg
use decompMod , only : bounds_type
use abortutils , only : endrun
- use clm_varctl , only : iulog, use_lai_streams
+ use clm_varctl , only : iulog, use_lai_streams, single_column
use perf_mod , only : t_startf, t_stopf
use spmdMod , only : masterproc, mpicom, iam
use laiStreamMod , only : lai_init, lai_advance, lai_interp
@@ -311,7 +311,7 @@ subroutine readAnnualVegetation (bounds, canopystate_inst)
call ncd_pio_openfile (ncid, trim(locfn), 0)
call ncd_inqfdims (ncid, isgrid2d, ni, nj, ns)
- if (ldomain%ns /= ns .or. ldomain%ni /= ni .or. ldomain%nj /= nj) then
+ if (.not. single_column .and. (ldomain%ns /= ns .or. ldomain%ni /= ni .or. ldomain%nj /= nj)) then
write(iulog,*)trim(subname), 'ldomain and input file do not match dims '
write(iulog,*)trim(subname), 'ldomain%ni,ni,= ',ldomain%ni,ni
write(iulog,*)trim(subname), 'ldomain%nj,nj,= ',ldomain%nj,nj
diff --git a/src/biogeophys/UrbanParamsType.F90 b/src/biogeophys/UrbanParamsType.F90
index 4b7b80e4fe..c6443897fe 100644
--- a/src/biogeophys/UrbanParamsType.F90
+++ b/src/biogeophys/UrbanParamsType.F90
@@ -9,9 +9,9 @@ module UrbanParamsType
use shr_log_mod , only : errMsg => shr_log_errMsg
use abortutils , only : endrun
use decompMod , only : bounds_type, subgrid_level_gridcell, subgrid_level_landunit
- use clm_varctl , only : iulog, fsurdat
+ use clm_varctl , only : iulog, fsurdat, single_column
use clm_varcon , only : grlnd, spval
- use LandunitType , only : lun
+ use LandunitType , only : lun
!
implicit none
save
@@ -26,21 +26,21 @@ module UrbanParamsType
!
! !PRIVATE TYPE
type urbinp_type
- 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 :: 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 (:,:,:)
@@ -92,14 +92,14 @@ module UrbanParamsType
real(r8), pointer :: eflx_traffic_factor (:) ! lun multiplicative traffic factor for sensible heat flux from urban traffic (-)
contains
- procedure, public :: Init
-
+ procedure, public :: Init
+
end type urbanparams_type
!
! !Urban control variables
- character(len= *), parameter, public :: urban_hac_off = 'OFF'
- character(len= *), parameter, public :: urban_hac_on = 'ON'
- character(len= *), parameter, public :: urban_wasteheat_on = 'ON_WASTEHEAT'
+ character(len= *), parameter, public :: urban_hac_off = 'OFF'
+ character(len= *), parameter, public :: urban_hac_on = 'ON'
+ character(len= *), parameter, public :: urban_wasteheat_on = 'ON_WASTEHEAT'
character(len= 16), public :: urban_hac = urban_hac_off
logical, public :: urban_explicit_ac = .true. ! whether to use explicit, time-varying AC adoption rate
logical, public :: urban_traffic = .false. ! urban traffic fluxes
@@ -112,7 +112,7 @@ module UrbanParamsType
character(len=*), parameter, private :: sourcefile = &
__FILE__
- !-----------------------------------------------------------------------
+ !-----------------------------------------------------------------------
contains
@@ -132,11 +132,11 @@ subroutine Init(this, bounds)
!
! !ARGUMENTS:
class(urbanparams_type) :: this
- type(bounds_type) , intent(in) :: bounds
+ type(bounds_type) , intent(in) :: bounds
!
! !LOCAL VARIABLES:
integer :: j,l,c,p,g ! indices
- integer :: nc,fl,ib ! indices
+ integer :: nc,fl,ib ! indices
integer :: dindx ! urban density type index
integer :: ier ! error status
real(r8) :: sumvf ! sum of view factors for wall or road
@@ -182,12 +182,12 @@ subroutine Init(this, bounds)
allocate(this%em_perroad (begl:endl)) ; this%em_perroad (:) = nan
allocate(this%em_wall (begl:endl)) ; this%em_wall (:) = nan
allocate(this%alb_roof_dir (begl:endl,numrad)) ; this%alb_roof_dir (:,:) = nan
- allocate(this%alb_roof_dif (begl:endl,numrad)) ; this%alb_roof_dif (:,:) = nan
- allocate(this%alb_improad_dir (begl:endl,numrad)) ; this%alb_improad_dir (:,:) = nan
- allocate(this%alb_perroad_dir (begl:endl,numrad)) ; this%alb_perroad_dir (:,:) = nan
- allocate(this%alb_improad_dif (begl:endl,numrad)) ; this%alb_improad_dif (:,:) = nan
- allocate(this%alb_perroad_dif (begl:endl,numrad)) ; this%alb_perroad_dif (:,:) = nan
- allocate(this%alb_wall_dir (begl:endl,numrad)) ; this%alb_wall_dir (:,:) = nan
+ allocate(this%alb_roof_dif (begl:endl,numrad)) ; this%alb_roof_dif (:,:) = nan
+ allocate(this%alb_improad_dir (begl:endl,numrad)) ; this%alb_improad_dir (:,:) = nan
+ allocate(this%alb_perroad_dir (begl:endl,numrad)) ; this%alb_perroad_dir (:,:) = nan
+ allocate(this%alb_improad_dif (begl:endl,numrad)) ; this%alb_improad_dif (:,:) = nan
+ allocate(this%alb_perroad_dif (begl:endl,numrad)) ; this%alb_perroad_dif (:,:) = nan
+ allocate(this%alb_wall_dir (begl:endl,numrad)) ; this%alb_wall_dir (:,:) = nan
allocate(this%alb_wall_dif (begl:endl,numrad)) ; this%alb_wall_dif (:,:) = nan
allocate(this%eflx_traffic_factor (begl:endl)) ; this%eflx_traffic_factor (:) = nan
@@ -261,7 +261,7 @@ subroutine Init(this, bounds)
! | \ vsr / | | r | | \ vww / s
! | \ / | h o w | \ / k
! wall | \ / | wall | a | | \ / y
- ! |vwr \ / vwr| | d | |vrw \ / vsw
+ ! |vwr \ / vwr| | d | |vrw \ / vsw
! ------\/------ - - |-----\/-----
! road wall |
! <----- w ----> |
@@ -272,20 +272,20 @@ subroutine Init(this, bounds)
! vsw = view factor of sky for wall
! vsr + vwr + vwr = 1 vrw + vww + vsw = 1
!
- ! Source: Masson, V. (2000) A physically-based scheme for the urban energy budget in
+ ! Source: Masson, V. (2000) A physically-based scheme for the urban energy budget in
! atmospheric models. Boundary-Layer Meteorology 94:357-397
!
! - Calculate urban land unit aerodynamic constants using Macdonald (1998) as used in
! Grimmond and Oke (1999)
! ---------------------------------------------------------------------------------------
-
- ! road -- sky view factor -> 1 as building height -> 0
+
+ ! road -- sky view factor -> 1 as building height -> 0
! and -> 0 as building height -> infinity
this%vf_sr(l) = sqrt(lun%canyon_hwr(l)**2 + 1._r8) - lun%canyon_hwr(l)
this%vf_wr(l) = 0.5_r8 * (1._r8 - this%vf_sr(l))
- ! one wall -- sky view factor -> 0.5 as building height -> 0
+ ! one wall -- sky view factor -> 0.5 as building height -> 0
! and -> 0 as building height -> infinity
this%vf_sw(l) = 0.5_r8 * (lun%canyon_hwr(l) + 1._r8 - sqrt(lun%canyon_hwr(l)**2+1._r8)) / lun%canyon_hwr(l)
@@ -311,7 +311,7 @@ subroutine Init(this, bounds)
! Grimmond and Oke (1999)
!----------------------------------------------------------------------------------
- ! Calculate plan area index
+ ! Calculate plan area index
plan_ai = lun%canyon_hwr(l)/(lun%canyon_hwr(l) + 1._r8)
! Building shape shortside/longside ratio (e.g. 1 = square )
@@ -344,7 +344,7 @@ subroutine Init(this, bounds)
(1 - lun%z_d_town(l) / lun%ht_roof(l)) * frontal_ai)**(-0.5_r8))
end if
- else ! Not urban point
+ else ! Not urban point
this%eflx_traffic_factor(l) = spval
this%t_building_min(l) = spval
@@ -366,7 +366,7 @@ end subroutine Init
!-----------------------------------------------------------------------
subroutine UrbanInput(begg, endg, mode)
!
- ! !DESCRIPTION:
+ ! !DESCRIPTION:
! Allocate memory and read in urban input data
!
! !USES:
@@ -375,7 +375,7 @@ subroutine UrbanInput(begg, endg, mode)
use fileutils , only : getavu, relavu, getfil, opnfil
use spmdMod , only : masterproc
use domainMod , only : ldomain
- use ncdio_pio , only : file_desc_t, ncd_io, ncd_inqvdlen, ncd_inqfdims
+ use ncdio_pio , only : file_desc_t, ncd_io, ncd_inqvdlen, ncd_inqfdims
use ncdio_pio , only : ncd_pio_openfile, ncd_pio_closefile, ncd_inqdid, ncd_inqdlen
!
! !ARGUMENTS:
@@ -392,7 +392,7 @@ subroutine UrbanInput(begg, endg, mode)
integer :: numrad_i ! input grid: number of solar bands (VIS/NIR)
integer :: numurbl_i ! input grid: number of urban landunits
integer :: ier,ret ! error status
- logical :: isgrid2d ! true => file is 2d
+ logical :: isgrid2d ! true => file is 2d
logical :: readvar ! true => variable is on dataset
logical :: has_numurbl ! true => numurbl dimension is on dataset
character(len=32) :: subname = 'UrbanInput' ! subroutine name
@@ -403,11 +403,11 @@ subroutine UrbanInput(begg, endg, mode)
if (mode == 'initialize') then
! Read urban data
-
+
if (masterproc) then
write(iulog,*)' Reading in urban input data from fsurdat file ...'
end if
-
+
call getfil (fsurdat, locfn, 0)
call ncd_pio_openfile (ncid, locfn, 0)
@@ -428,20 +428,20 @@ subroutine UrbanInput(begg, endg, mode)
if ( nlevurb == 0 ) return
! Allocate dynamic memory
- allocate(urbinp%canyon_hwr(begg:endg, numurbl), &
- urbinp%wtlunit_roof(begg:endg, numurbl), &
+ allocate(urbinp%canyon_hwr(begg:endg, numurbl), &
+ urbinp%wtlunit_roof(begg:endg, numurbl), &
urbinp%wtroad_perv(begg:endg, numurbl), &
- urbinp%em_roof(begg:endg, numurbl), &
- urbinp%em_improad(begg:endg, numurbl), &
- urbinp%em_perroad(begg:endg, numurbl), &
- urbinp%em_wall(begg:endg, numurbl), &
- urbinp%alb_roof_dir(begg:endg, numurbl, numrad), &
- urbinp%alb_roof_dif(begg:endg, numurbl, numrad), &
- urbinp%alb_improad_dir(begg:endg, numurbl, numrad), &
- urbinp%alb_perroad_dir(begg:endg, numurbl, numrad), &
- urbinp%alb_improad_dif(begg:endg, numurbl, numrad), &
- urbinp%alb_perroad_dif(begg:endg, numurbl, numrad), &
- urbinp%alb_wall_dir(begg:endg, numurbl, numrad), &
+ urbinp%em_roof(begg:endg, numurbl), &
+ urbinp%em_improad(begg:endg, numurbl), &
+ urbinp%em_perroad(begg:endg, numurbl), &
+ urbinp%em_wall(begg:endg, numurbl), &
+ urbinp%alb_roof_dir(begg:endg, numurbl, numrad), &
+ urbinp%alb_roof_dif(begg:endg, numurbl, numrad), &
+ urbinp%alb_improad_dir(begg:endg, numurbl, numrad), &
+ urbinp%alb_perroad_dir(begg:endg, numurbl, numrad), &
+ urbinp%alb_improad_dif(begg:endg, numurbl, numrad), &
+ urbinp%alb_perroad_dif(begg:endg, numurbl, numrad), &
+ urbinp%alb_wall_dir(begg:endg, numurbl, numrad), &
urbinp%alb_wall_dif(begg:endg, numurbl, numrad), &
urbinp%ht_roof(begg:endg, numurbl), &
urbinp%wind_hgt_canyon(begg:endg, numurbl), &
@@ -461,7 +461,7 @@ subroutine UrbanInput(begg, endg, mode)
endif
call ncd_inqfdims (ncid, isgrid2d, ni, nj, ns)
- if (ldomain%ns /= ns .or. ldomain%ni /= ni .or. ldomain%nj /= nj) then
+ if (.not. single_column .and. (ldomain%ns /= ns .or. ldomain%ni /= ni .or. ldomain%nj /= nj)) then
write(iulog,*)trim(subname), 'ldomain and input file do not match dims '
write(iulog,*)trim(subname), 'ldomain%ni,ni,= ',ldomain%ni,ni
write(iulog,*)trim(subname), 'ldomain%nj,nj,= ',ldomain%nj,nj
@@ -655,7 +655,7 @@ subroutine UrbanInput(begg, endg, mode)
call ncd_pio_closefile(ncid)
if (masterproc) then
- write(iulog,*)' Sucessfully read urban input data'
+ write(iulog,*)' Sucessfully read urban input data'
write(iulog,*)
end if
@@ -955,7 +955,3 @@ end function IsProgBuildTemp
!-----------------------------------------------------------------------
end module UrbanParamsType
-
-
-
-
diff --git a/src/init_interp/initInterp.F90 b/src/init_interp/initInterp.F90
index f6027fe632..468c3207cd 100644
--- a/src/init_interp/initInterp.F90
+++ b/src/init_interp/initInterp.F90
@@ -820,13 +820,13 @@ subroutine findMinDist( dimname, begi, endi, bego, endo, ncidi, ncido, &
write(iulog,*)'calling set_subgrid_info for ',trim(dimname), ' for input'
end if
call set_subgrid_info(beg=begi, end=endi, dimname=dimname, use_glob=.true., &
- ncid=ncidi, active=activei, subgrid=subgridi)
+ ncid=ncidi, active=activei, subgrid=subgridi, allow_scm=.false.)
if (masterproc) then
write(iulog,*)'calling set_subgrid_info for ',trim(dimname), ' for output'
end if
call set_subgrid_info(beg=bego, end=endo, dimname=dimname, use_glob=.false., &
- ncid=ncido, active=activeo, subgrid=subgrido)
+ ncid=ncido, active=activeo, subgrid=subgrido, allow_scm=.true.)
select case (interp_method)
case (interp_method_general)
@@ -859,7 +859,7 @@ end subroutine findMinDist
!=======================================================================
- subroutine set_subgrid_info(beg, end, dimname, use_glob, ncid, active, subgrid)
+ subroutine set_subgrid_info(beg, end, dimname, use_glob, ncid, active, subgrid, allow_scm)
! --------------------------------------------------------------------
! arguments
@@ -869,6 +869,7 @@ subroutine set_subgrid_info(beg, end, dimname, use_glob, ncid, active, subgrid)
logical , intent(in) :: use_glob ! if .true., use the 'glob' form of ncd_io
logical , intent(out) :: active(beg:end)
type(subgrid_type) , intent(inout) :: subgrid
+ logical , intent(in) :: allow_scm ! if .true., allow single column model subset of data
!
! local variables
integer :: n
@@ -896,32 +897,32 @@ subroutine set_subgrid_info(beg, end, dimname, use_glob, ncid, active, subgrid)
end if
if (dimname == 'pft') then
- call read_var_double(ncid=ncid, varname='pfts1d_lon' , data=subgrid%lon , dim1name='pft', use_glob=use_glob)
- call read_var_double(ncid=ncid, varname='pfts1d_lat' , data=subgrid%lat , dim1name='pft', use_glob=use_glob)
- call read_var_int(ncid=ncid, varname='pfts1d_itypveg', data=subgrid%ptype, dim1name='pft', use_glob=use_glob)
- call read_var_int(ncid=ncid, varname='pfts1d_itypcol', data=subgrid%ctype, dim1name='pft', use_glob=use_glob)
- call read_var_int(ncid=ncid, varname='pfts1d_ityplun', data=subgrid%ltype, dim1name='pft', use_glob=use_glob)
- call read_var_int(ncid=ncid, varname='pfts1d_active' , data=itemp , dim1name='pft', use_glob=use_glob)
+ call read_var_double(ncid=ncid, varname='pfts1d_lon' , data=subgrid%lon , dim1name='pft', use_glob=use_glob, allow_scm=allow_scm)
+ call read_var_double(ncid=ncid, varname='pfts1d_lat' , data=subgrid%lat , dim1name='pft', use_glob=use_glob, allow_scm=allow_scm)
+ call read_var_int(ncid=ncid, varname='pfts1d_itypveg', data=subgrid%ptype, dim1name='pft', use_glob=use_glob, allow_scm=allow_scm)
+ call read_var_int(ncid=ncid, varname='pfts1d_itypcol', data=subgrid%ctype, dim1name='pft', use_glob=use_glob, allow_scm=allow_scm)
+ call read_var_int(ncid=ncid, varname='pfts1d_ityplun', data=subgrid%ltype, dim1name='pft', use_glob=use_glob, allow_scm=allow_scm)
+ call read_var_int(ncid=ncid, varname='pfts1d_active' , data=itemp , dim1name='pft', use_glob=use_glob, allow_scm=allow_scm)
if (associated(subgrid%topoglc)) then
- call read_var_double(ncid=ncid, varname='pfts1d_topoglc', data=subgrid%topoglc, dim1name='pft', use_glob=use_glob)
+ call read_var_double(ncid=ncid, varname='pfts1d_topoglc', data=subgrid%topoglc, dim1name='pft', use_glob=use_glob, allow_scm=allow_scm)
end if
else if (dimname == 'column') then
- call read_var_double(ncid=ncid, varname='cols1d_lon' , data=subgrid%lon , dim1name='column', use_glob=use_glob)
- call read_var_double(ncid=ncid, varname='cols1d_lat' , data=subgrid%lat , dim1name='column', use_glob=use_glob)
- call read_var_int(ncid=ncid, varname='cols1d_ityp' , data=subgrid%ctype, dim1name='column', use_glob=use_glob)
- call read_var_int(ncid=ncid, varname='cols1d_ityplun', data=subgrid%ltype, dim1name='column', use_glob=use_glob)
- call read_var_int(ncid=ncid, varname='cols1d_active' , data=itemp , dim1name='column', use_glob=use_glob)
+ call read_var_double(ncid=ncid, varname='cols1d_lon' , data=subgrid%lon , dim1name='column', use_glob=use_glob, allow_scm=allow_scm)
+ call read_var_double(ncid=ncid, varname='cols1d_lat' , data=subgrid%lat , dim1name='column', use_glob=use_glob, allow_scm=allow_scm)
+ call read_var_int(ncid=ncid, varname='cols1d_ityp' , data=subgrid%ctype, dim1name='column', use_glob=use_glob, allow_scm=allow_scm)
+ call read_var_int(ncid=ncid, varname='cols1d_ityplun', data=subgrid%ltype, dim1name='column', use_glob=use_glob, allow_scm=allow_scm)
+ call read_var_int(ncid=ncid, varname='cols1d_active' , data=itemp , dim1name='column', use_glob=use_glob, allow_scm=allow_scm)
if (associated(subgrid%topoglc)) then
- call read_var_double(ncid=ncid, varname='cols1d_topoglc', data=subgrid%topoglc, dim1name='column', use_glob=use_glob)
+ call read_var_double(ncid=ncid, varname='cols1d_topoglc', data=subgrid%topoglc, dim1name='column', use_glob=use_glob, allow_scm=allow_scm)
end if
else if (dimname == 'landunit') then
- call read_var_double(ncid=ncid, varname='land1d_lon' , data=subgrid%lon , dim1name='landunit', use_glob=use_glob)
- call read_var_double(ncid=ncid, varname='land1d_lat' , data=subgrid%lat , dim1name='landunit', use_glob=use_glob)
- call read_var_int(ncid=ncid, varname='land1d_ityplun', data=subgrid%ltype, dim1name='landunit', use_glob=use_glob)
- call read_var_int(ncid=ncid, varname='land1d_active' , data=itemp , dim1name='landunit', use_glob=use_glob)
+ call read_var_double(ncid=ncid, varname='land1d_lon' , data=subgrid%lon , dim1name='landunit', use_glob=use_glob, allow_scm=allow_scm)
+ call read_var_double(ncid=ncid, varname='land1d_lat' , data=subgrid%lat , dim1name='landunit', use_glob=use_glob, allow_scm=allow_scm)
+ call read_var_int(ncid=ncid, varname='land1d_ityplun', data=subgrid%ltype, dim1name='landunit', use_glob=use_glob, allow_scm=allow_scm)
+ call read_var_int(ncid=ncid, varname='land1d_active' , data=itemp , dim1name='landunit', use_glob=use_glob, allow_scm=allow_scm)
else if (dimname == 'gridcell') then
- call read_var_double(ncid=ncid, varname='grid1d_lon' , data=subgrid%lon , dim1name='gridcell', use_glob=use_glob)
- call read_var_double(ncid=ncid, varname='grid1d_lat' , data=subgrid%lat , dim1name='gridcell', use_glob=use_glob)
+ call read_var_double(ncid=ncid, varname='grid1d_lon' , data=subgrid%lon , dim1name='gridcell', use_glob=use_glob, allow_scm=allow_scm)
+ call read_var_double(ncid=ncid, varname='grid1d_lat' , data=subgrid%lat , dim1name='gridcell', use_glob=use_glob, allow_scm=allow_scm)
! All gridcells in the restart file are active
itemp(beg:end) = 1
@@ -942,7 +943,7 @@ subroutine set_subgrid_info(beg, end, dimname, use_glob, ncid, active, subgrid)
contains
- subroutine read_var_double(ncid, varname, data, dim1name, use_glob)
+ subroutine read_var_double(ncid, varname, data, dim1name, use_glob, allow_scm)
! Wraps the ncd_io call, providing logic related to whether we're using the 'glob'
! form of ncd_io
type(file_desc_t) , intent(inout) :: ncid
@@ -950,15 +951,29 @@ subroutine read_var_double(ncid, varname, data, dim1name, use_glob)
real(r8), pointer , intent(inout) :: data(:)
character(len=*) , intent(in) :: dim1name
logical , intent(in) :: use_glob ! if .true., use the 'glob' form of ncd_io
+ logical , intent(in) :: allow_scm ! if .true., allow single column model subset of data
+
+ ! local
+ character(16) :: readflag
+
+ if (allow_scm) then
+ readflag='read'
+ else
+ ! Flag to distinguish the times during IC interpolation when running in single column mode but
+ ! need to read the full data grid. Normally single_column means
+ ! "read the data grid and extract the closest column" but
+ ! during IC interpolation you need to read in the full grid to be interpolated regardless of the single_column flag.
+ readflag='read_noscm'
+ endif
if (use_glob) then
- call ncd_io(ncid=ncid, varname=varname, flag='read', data=data)
+ call ncd_io(ncid=ncid, varname=varname, flag=trim(readflag), data=data)
else
- call ncd_io(ncid=ncid, varname=varname, flag='read', data=data, dim1name=dim1name)
+ call ncd_io(ncid=ncid, varname=varname, flag=trim(readflag), data=data, dim1name=dim1name)
end if
end subroutine read_var_double
- subroutine read_var_int(ncid, varname, data, dim1name, use_glob)
+ subroutine read_var_int(ncid, varname, data, dim1name, use_glob, allow_scm)
! Wraps the ncd_io call, providing logic related to whether we're using the 'glob'
! form of ncd_io
type(file_desc_t) , intent(inout) :: ncid
@@ -966,11 +981,25 @@ subroutine read_var_int(ncid, varname, data, dim1name, use_glob)
integer, pointer , intent(inout) :: data(:)
character(len=*) , intent(in) :: dim1name
logical , intent(in) :: use_glob ! if .true., use the 'glob' form of ncd_io
+ logical , intent(in) :: allow_scm ! if .true., allow single column model subset of data
+
+ ! local
+ character(16) :: readflag
+
+ if (allow_scm) then
+ readflag='read'
+ else
+ ! Flag to distinguish the times during IC interpolation when running in single column mode but
+ ! need to read the full data grid. Normally single_column means
+ ! "read the data grid and extract the closest column" but
+ ! during IC interpolation you need to read in the full grid to be interpolated regardless of the single_column flag.
+ readflag='read_noscm'
+ endif
if (use_glob) then
- call ncd_io(ncid=ncid, varname=varname, flag='read', data=data)
+ call ncd_io(ncid=ncid, varname=varname, flag=trim(readflag), data=data)
else
- call ncd_io(ncid=ncid, varname=varname, flag='read', data=data, dim1name=dim1name)
+ call ncd_io(ncid=ncid, varname=varname, flag=trim(readflag), data=data, dim1name=dim1name)
end if
end subroutine read_var_int
@@ -1038,7 +1067,7 @@ subroutine interp_1d_double (varname, varname_i, dimname, begi, endi, bego, endo
end if
allocate (rbufsli(begi:endi), rbufslo(bego:endo))
- call ncd_io(ncid=ncidi, varname=trim(varname_i), flag='read', data=rbufsli)
+ call ncd_io(ncid=ncidi, varname=trim(varname_i), flag='read_noscm', data=rbufsli)
call ncd_io(ncid=ncido, varname=trim(varname), flag='read', data=rbufslo, &
dim1name=dimname)
@@ -1080,7 +1109,7 @@ subroutine interp_1d_int (varname, varname_i, dimname, begi, endi, bego, endo, n
allocate (ibufsli(begi:endi), ibufslo(bego:endo))
- call ncd_io(ncid=ncidi, varname=trim(varname_i), flag='read', &
+ call ncd_io(ncid=ncidi, varname=trim(varname_i), flag='read_noscm', &
data=ibufsli)
call ncd_io(ncid=ncido, varname=trim(varname), flag='read', &
data=ibufslo, dim1name=dimname)
diff --git a/src/init_interp/initInterpMultilevelContainer.F90 b/src/init_interp/initInterpMultilevelContainer.F90
index 5a7b14832a..d26e51c71c 100644
--- a/src/init_interp/initInterpMultilevelContainer.F90
+++ b/src/init_interp/initInterpMultilevelContainer.F90
@@ -732,7 +732,7 @@ subroutine create_snow_interpolators(interp_multilevel_levsno, interp_multilevel
! Read snlsno_source_sgrid
allocate(snlsno_source_sgrid(bounds_source%get_begc() : bounds_source%get_endc()))
- call ncd_io(ncid=ncid_source, varname='SNLSNO', flag='read', &
+ call ncd_io(ncid=ncid_source, varname='SNLSNO', flag='read_noscm', &
data=snlsno_source_sgrid)
snlsno_source_sgrid(:) = abs(snlsno_source_sgrid(:))
diff --git a/src/main/histFileMod.F90 b/src/main/histFileMod.F90
index cbb6e268f7..3c16a2b30f 100644
--- a/src/main/histFileMod.F90
+++ b/src/main/histFileMod.F90
@@ -5093,9 +5093,9 @@ subroutine hist_restart_ncd (bounds, ncid, flag, rdate)
end if
call ncd_io(ncid=ncid_hist(t), flag='read', varname=trim(name), &
- dim1name=type1d_out, data=hbuf1d)
+ dim1name=type1d_out, data=hbuf1d, posNOTonfile=.true.)
call ncd_io(ncid=ncid_hist(t), flag='read', varname=trim(name_acc), &
- dim1name=type1d_out, data=nacs1d)
+ dim1name=type1d_out, data=nacs1d, posNOTonfile=.true.)
hbuf(beg1d_out:end1d_out,1) = hbuf1d(beg1d_out:end1d_out)
nacs(beg1d_out:end1d_out,1) = nacs1d(beg1d_out:end1d_out)
@@ -5104,9 +5104,9 @@ subroutine hist_restart_ncd (bounds, ncid, flag, rdate)
deallocate(nacs1d)
else
call ncd_io(ncid=ncid_hist(t), flag='read', varname=trim(name), &
- dim1name=type1d_out, data=hbuf)
+ dim1name=type1d_out, data=hbuf, posNOTonfile=.true.)
call ncd_io(ncid=ncid_hist(t), flag='read', varname=trim(name_acc), &
- dim1name=type1d_out, data=nacs)
+ dim1name=type1d_out, data=nacs, posNOTonfile=.true.)
end if
end do
diff --git a/src/main/ncdio_pio.F90.in b/src/main/ncdio_pio.F90.in
index 6d58ded872..04ed90a6cd 100644
--- a/src/main/ncdio_pio.F90.in
+++ b/src/main/ncdio_pio.F90.in
@@ -541,14 +541,6 @@ contains
character(len=32) :: subname = 'ncd_inqfdims' ! subroutine name
!-----------------------------------------------------------------------
- if (single_column) then
- ni = 1
- nj = 1
- ns = 1
- isgrid2d = .true.
- RETURN
- end if
-
ni = 0
nj = 0
@@ -1353,7 +1345,7 @@ contains
start(:) = 0
count(:) = 0
- if (flag == 'read') then
+ if (flag == 'read' .or. flag == 'read_noscm') then
call ncd_inqvid(ncid, varname, varid, vardesc, readvar=varpresent)
@@ -1382,7 +1374,7 @@ contains
#else
if (varpresent) then
allocate(idata1d(size(data)))
- if (single_column) then
+ if (single_column .and. flag == 'read') then
call scam_field_offsets(ncid,'undefined', vardesc,&
start, count, found=found, posNOTonfile=posNOTonfile)
if ( found )then
@@ -1478,7 +1470,7 @@ contains
start(:) = 0
count(:) = 0
- if (flag == 'read') then
+ if (flag == 'read' .or. flag == 'read_noscm') then
call ncd_inqvid(ncid, varname, varid, vardesc, readvar=varpresent)
@@ -1499,7 +1491,7 @@ contains
end if
#else
if (varpresent) then
- if (single_column) then
+ if (single_column .and. flag == 'read') then
call scam_field_offsets(ncid,'undefined', vardesc,&
start, count, found=found, posNOTonfile=posNOTonfile)
if ( found )then
@@ -1648,7 +1640,7 @@ contains
!-----------------------------------------------------------------------
!TYPE int,double,logical
- subroutine ncd_io_1d_{TYPE}(varname, data, dim1name, flag, ncid, nt, readvar, cnvrtnan2fill)
+ subroutine ncd_io_1d_{TYPE}(varname, data, dim1name, flag, ncid, nt, readvar, cnvrtnan2fill, posNOTonfile)
!
! !DESCRIPTION:
! netcdf I/O for 1d
@@ -1662,6 +1654,7 @@ contains
integer , optional, intent(in) :: nt ! time sample index
logical , optional, intent(out) :: readvar ! true => variable is on initial dataset (read only)
logical , optional, intent(in) :: cnvrtnan2fill ! true => convert any NaN's to _FillValue (spval)
+ logical , optional, intent(in) :: posNOTonfile ! Position is NOT on this file
!
! Local Variables
character(len=8) :: subgrid_level_name ! nameg, namel, etc.
@@ -1676,12 +1669,15 @@ contains
integer :: start(3) ! netcdf start index
integer :: count(3) ! netcdf count index
integer :: status ! error code
+ logical :: found ! if true, found lat/lon dims on file
logical :: varpresent ! if true, variable is on tape
integer :: xtype ! type of var in file
integer , pointer :: idata(:) ! Temporary integer data to send to file
type(iodesc_plus_type) , pointer :: iodesc_plus
type(var_desc_t) :: vardesc
integer :: oldhandle ! previous value of pio_error_handle
+ integer :: ni,nj,ns ! lat/lon indicies
+ logical :: isgrid2d ! if true, latlon grid
character(len=*),parameter :: subname='ncd_io_1d_{TYPE}' ! subroutine name
!-----------------------------------------------------------------------
@@ -1703,14 +1699,15 @@ contains
end if
#endif
- if (flag == 'read') then
+ if (flag == 'read' .or. flag == 'read_noscm') then
call ncd_inqvid(ncid, varname, varid, vardesc, readvar=varpresent)
if (varpresent) then
if (single_column) then
start(:) = 1 ; count(:) = 1
- call scam_field_offsets(ncid,subgrid_level_name,vardesc,start,count)
- if (trim(subgrid_level_name) == grlnd) then
+ call scam_field_offsets(ncid,subgrid_level_name,vardesc,start,count,found=found,posNOTonfile=posNOTonfile)
+ call ncd_inqfdims(ncid, isgrid2d, ni, nj, ns)
+ if (isgrid2d) then
n=2
if (present(nt)) then
start(3) = nt ; count(3) = 1
@@ -1823,7 +1820,7 @@ contains
!TYPE int,double
subroutine ncd_io_2d_{TYPE}(varname, data, dim1name, lowerb2, upperb2, &
- flag, ncid, nt, readvar, switchdim, cnvrtnan2fill)
+ flag, ncid, nt, readvar, switchdim, cnvrtnan2fill, posNOTonfile )
!
! !DESCRIPTION:
! Netcdf i/o of 2d
@@ -1839,7 +1836,7 @@ contains
logical, optional, intent(out) :: readvar ! true => variable is on initial dataset (read only)
logical, optional, intent(in) :: switchdim ! true=> permute dim1 and dim2 for output
logical, optional, intent(in) :: cnvrtnan2fill ! true => convert any NaN's to _FillValue (spval)
- !
+ logical, optional, intent(in) :: posNOTonfile ! Position is NOT on this file !
! !LOCAL VARIABLES:
#if ({ITYPE}==TYPEINT)
integer , pointer :: temp(:,:)
@@ -1862,7 +1859,10 @@ contains
logical :: varpresent ! if true, variable is on tape
integer :: lb1,lb2
integer :: ub1,ub2
+ integer :: ni,nj,ns
+ logical :: isgrid2d ! if true, latlon grid
integer :: xtype ! netcdf type of variable on file
+ logical :: found ! if true, found lat/lon dims on file
type(iodesc_plus_type) , pointer :: iodesc_plus
type(var_desc_t) :: vardesc
@@ -1898,14 +1898,16 @@ contains
allocate(temp(lb2:ub2,lb1:ub1))
end if
- if (flag == 'read') then
+ if (flag == 'read' .or. flag == 'read_noscm') then
call ncd_inqvid(ncid, varname, varid, vardesc, readvar=varpresent)
if (varpresent) then
- if (single_column) then
+ if (single_column .and. flag == 'read') then
start(:) = 1 ; count(:) = 1
- call scam_field_offsets(ncid, subgrid_level_name, vardesc, start, count)
- if (trim(subgrid_level_name) == grlnd) then
+ call scam_field_offsets(ncid, subgrid_level_name, vardesc, start, count,found=found,posNOTonfile=posNOTonfile)
+ call ncd_inqfdims(ncid, isgrid2d, ni, nj, ns)
+ call ncd_inqvdims(ncid, ndims, vardesc)
+ if (isgrid2d) then
count(3) = size(data,dim=2)
n=3
if (present(nt)) then
@@ -1913,11 +1915,9 @@ contains
n=4
end if
else
- count(2) = size(data,dim=2)
- n=2
+ n=ndims
if (present(nt)) then
- start(3) = nt ; count(3) = 1
- n=3
+ start(n) = nt ; count(n) = 1
end if
end if
if (present(switchdim)) then
@@ -2067,7 +2067,7 @@ contains
!-----------------------------------------------------------------------
!TYPE int,double
- subroutine ncd_io_3d_{TYPE}(varname, data, dim1name, flag, ncid, nt, readvar)
+ subroutine ncd_io_3d_{TYPE}(varname, data, dim1name, flag, ncid, nt, readvar, posNOTonfile)
!
! !DESCRIPTION:
! Netcdf i/o of 3d
@@ -2080,7 +2080,7 @@ contains
character(len=*) , intent(in) :: dim1name ! dimension 1 name
integer, optional, intent(in) :: nt ! time sample index
logical, optional, intent(out) :: readvar ! true => variable is on initial dataset (read only)
- !
+ logical, optional, intent(in) :: posNOTonfile ! Position is NOT on this file !
! !LOCAL VARIABLES:
integer :: ndim1,ndim2
character(len=8) :: subgrid_level_name ! nameg, namel, etc.
@@ -2099,6 +2099,9 @@ contains
logical :: varpresent ! if true, variable is on tape
type(iodesc_plus_type) , pointer :: iodesc_plus
type(var_desc_t) :: vardesc
+ integer :: ni,nj,ns
+ logical :: isgrid2d ! if true, latlon grid
+ logical :: found ! if true, found lat/lon dims on file
character(len=*),parameter :: subname='ncd_io_3d_{TYPE}' ! subroutine name
!-----------------------------------------------------------------------
@@ -2108,15 +2111,16 @@ contains
write(iulog,*) trim(subname),' ',trim(flag),' ',trim(varname),' ',trim(subgrid_level_name)
end if
- if (flag == 'read') then
+ if (flag == 'read' .or. flag == 'read_noscm') then
call ncd_inqvid(ncid, varname, varid, vardesc, readvar=varpresent)
if (varpresent) then
- if (single_column) then
+ if (single_column .and. flag == 'read') then
start(:) = 1
count(:) = 1
- call scam_field_offsets(ncid, subgrid_level_name, vardesc, start, count)
- if (trim(subgrid_level_name) == grlnd) then
+ call scam_field_offsets(ncid, subgrid_level_name, vardesc, start, count,found=found,posNOTonfile=posNOTonfile)
+ call ncd_inqfdims(ncid, isgrid2d, ni, nj, ns)
+ if (isgrid2d) then
count(3) = size(data,dim=2);
count(4) = size(data,dim=3)
n=4
@@ -2435,7 +2439,10 @@ contains
if ( trim(dimname)=='nj'.or. trim(dimname)=='lat'.or. trim(dimname)=='lsmlat') then
start(i)=latidx
count(i)=1
- else if ( trim(dimname)=='ni'.or. trim(dimname)=='lon'.or. trim(dimname)=='lsmlon') then
+ else if ( trim(dimname)=='ni'.or. trim(dimname)=='lon'.or. trim(dimname)=='lsmlon'.or. trim(dimname)=='gridcell') then
+ start(i)=lonidx
+ count(i)=1
+ else if ( trim(dimname)=='gridcell') then
start(i)=lonidx
count(i)=1
else if ( trim(dimname)=='column') then
diff --git a/src/main/organicFileMod.F90 b/src/main/organicFileMod.F90
index 3adbd5b6f1..5b61a8c0db 100644
--- a/src/main/organicFileMod.F90
+++ b/src/main/organicFileMod.F90
@@ -6,8 +6,8 @@ module organicFileMod
! !MODULE: organicFileMod
!
! !DESCRIPTION:
-! Contains methods for reading in organic matter data file which has
-! organic matter density for each grid point and soil level
+! Contains methods for reading in organic matter data file which has
+! organic matter density for each grid point and soil level
!
! !USES
use abortutils , only : endrun
@@ -30,7 +30,7 @@ module organicFileMod
!
!EOP
!
-!-----------------------------------------------------------------------
+!-----------------------------------------------------------------------
contains
@@ -42,7 +42,7 @@ module organicFileMod
! !INTERFACE:
subroutine organicrd(organic)
!
-! !DESCRIPTION:
+! !DESCRIPTION:
! Read the organic matter dataset.
!
! !USES:
@@ -68,7 +68,7 @@ subroutine organicrd(organic)
!EOP
character(len=256) :: locfn ! local file name
type(file_desc_t) :: ncid ! netcdf id
- integer :: ni,nj,ns ! dimension sizes
+ integer :: ni,nj,ns ! dimension sizes
logical :: isgrid2d ! true => file is 2d
logical :: readvar ! true => variable is on dataset
character(len=32) :: subname = 'organicrd' ! subroutine name
@@ -77,9 +77,9 @@ subroutine organicrd(organic)
! Initialize data to zero - no organic matter dataset
organic(:,:) = 0._r8
-
+
! Read data if file was specified in namelist
-
+
if (fsurdat /= ' ') then
if (masterproc) then
write(iulog,*) 'Attempting to read organic matter data .....'
@@ -90,14 +90,14 @@ subroutine organicrd(organic)
call ncd_pio_openfile (ncid, locfn, 0)
call ncd_inqfdims (ncid, isgrid2d, ni, nj, ns)
- if (ldomain%ns /= ns .or. ldomain%ni /= ni .or. ldomain%nj /= nj) then
+ if (.not. single_column .and. (ldomain%ns /= ns .or. ldomain%ni /= ni .or. ldomain%nj /= nj)) then
write(iulog,*)trim(subname), 'ldomain and input file do not match dims '
write(iulog,*)trim(subname), 'ldomain%ni,ni,= ',ldomain%ni,ni
write(iulog,*)trim(subname), 'ldomain%nj,nj,= ',ldomain%nj,nj
write(iulog,*)trim(subname), 'ldomain%ns,ns,= ',ldomain%ns,ns
call endrun()
end if
-
+
call ncd_io(ncid=ncid, varname='ORGANIC', flag='read', data=organic, &
dim1name=grlnd, readvar=readvar)
if (.not. readvar) call endrun('organicrd: errror reading ORGANIC')
diff --git a/src/main/surfrdMod.F90 b/src/main/surfrdMod.F90
index 4005ec7845..c70ec28fa0 100644
--- a/src/main/surfrdMod.F90
+++ b/src/main/surfrdMod.F90
@@ -363,8 +363,10 @@ subroutine surfrd_get_num_patches (lfsurdat, actual_maxsoil_patches, actual_nump
type(file_desc_t) :: ncid ! netcdf file id
integer :: dimid ! netCDF dimension id
logical :: cft_dim_exists ! dimension exists on dataset
+ logical :: natpft_dim_exists ! dimension exists on dataset
integer :: check_numpft ! Surface dataset count of numpft, should
! match maxsoil_patches - actual_numcft
+ integer :: actual_numnatpft ! natpft value from sfc dataset
character(len=32) :: subname = 'surfrd_get_num_patches' ! subroutine name
!-----------------------------------------------------------------------
@@ -396,9 +398,17 @@ subroutine surfrd_get_num_patches (lfsurdat, actual_maxsoil_patches, actual_nump
call ncd_inqdlen(ncid, dimid, actual_maxsoil_patches, 'lsmpft')
actual_numpft = actual_maxsoil_patches - actual_numcft
- call ncd_inqdlen(ncid, dimid, check_numpft, 'natpft')
+ ! Read numpft
+ call ncd_inqdid(ncid, 'natpft', dimid, natpft_dim_exists)
+ if ( natpft_dim_exists ) then
+ call ncd_inqdlen(ncid, dimid, actual_numnatpft, 'natpft')
+ call ncd_inqdlen(ncid, dimid, check_numpft, 'natpft')
+ else
+ actual_numnatpft = 0
+ end if
- if(check_numpft.ne.actual_numpft)then
+!jt if(check_numpft.ne.actual_numpft)then
+ if(actual_numcft+actual_numnatpft.ne.actual_maxsoil_patches)then
write(iulog,*)'the sum of the cftdim and the natpft dim should match the lsmpft dim in the surface file'
write(iulog,*)'natpft: ',check_numpft
write(iulog,*)'lsmpft: ',actual_maxsoil_patches