diff --git a/bld/namelist_files/namelist_defaults_ctsm.xml b/bld/namelist_files/namelist_defaults_ctsm.xml
index 68e38117be..61b81989c0 100644
--- a/bld/namelist_files/namelist_defaults_ctsm.xml
+++ b/bld/namelist_files/namelist_defaults_ctsm.xml
@@ -772,6 +772,11 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
>hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false.
+hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false.
+
+
hgrid=0.9x1.25 maxpft=79 mask=gx1v7 use_cn=.true. use_crop=.true. irrigate=.true. glc_nec=10 do_transient_pfts=.false.
@@ -1166,6 +1171,8 @@ lnd/clm2/surfdata_map/ctsm5.1.dev052/surfdata_mpasa30_hist_78pfts_CMIP6_simyr200
lnd/clm2/surfdata_map/ctsm5.1.dev052/surfdata_mpasa15_hist_78pfts_CMIP6_simyr2000_c211111.nc
+
+lnd/clm2/surfdata_map/ctsm5.1.dev120/surfdata_ne3np4_hist_78pfts_CMIP6_simyr2000_c230718.nc
lnd/clm2/surfdata_map/ctsm5.1.dev120//surfdata_ne3np4.pg3_hist_78pfts_CMIP6_simyr2000_c230405.nc
@@ -1395,7 +1402,7 @@ use_crop=".true.">lnd/clm2/surfdata_map/ctsm5.1.dev052/landuse.timeseries_mpasa1
>lnd/clm2/surfdata_map/ctsm5.1.dev120/landuse.timeseries_ne5np4.pg3_SSP5-8.5_78pfts_CMIP6_simyr1850-2100_c230405.nc
lnd/clm2/surfdata_map/ctsm5.1.dev120/landuse.timeseries_ne16np4.pg3_SSP5-8.5_78pfts_CMIP6_simyr1850-2100_c230405.nc
-lnd/clm2/surfdata_map/release-clm5.0.30/landuse.timeseries_ne30np4_SSP5-8.5_78pfts_CMIP6_simyr1850-2100_c200426.nc
lnd/clm2/surfdata_map/release-clm5.0.30/landuse.timeseries_ne30np4.pg2_SSP5-8.5_78pfts_CMIP6_simyr1850-2100_c200426.nc
diff --git a/src/init_interp/initInterp.F90 b/src/init_interp/initInterp.F90
index f6027fe632..40df6eb82c 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,25 @@ 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., use the 'glob' form of ncd_io
+
+ ! local
+ character(16) :: readflag
+
+ if (allow_scm) then
+ readflag='read'
+ else
+ 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 +977,21 @@ 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 scm data slice
+
+ ! local
+ character(16) :: readflag
+
+ if (allow_scm) then
+ readflag='read'
+ else
+ 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 +1059,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 +1101,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 c72117b090..78c897c287 100644
--- a/src/main/histFileMod.F90
+++ b/src/main/histFileMod.F90
@@ -4987,9 +4987,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)
@@ -4998,9 +4998,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..8df427ec90 100644
--- a/src/main/ncdio_pio.F90.in
+++ b/src/main/ncdio_pio.F90.in
@@ -541,13 +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
@@ -589,6 +582,12 @@ contains
ns = ni*nj
+ if (single_column) then
+ ni = 1
+ nj = 1
+ ns = 1
+ end if
+
end subroutine ncd_inqfdims
!-----------------------------------------------------------------------
@@ -1353,7 +1352,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 +1381,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 +1477,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 +1498,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 +1647,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 +1661,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 +1676,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,18 +1706,30 @@ 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
- n=2
- if (present(nt)) then
- start(3) = nt ; count(3) = 1
- n=3
+ call scam_field_offsets(ncid,subgrid_level_name,vardesc,start,count, &
+ found=found, posNOTonfile=posNOTonfile)
+ status = pio_inq_varndims(ncid, vardesc, ndims)
+ n=ndims
+ call ncd_inqfdims(ncid, isgrid2d, ni, nj, ns)
+ if (isgrid2d) then
+ if (trim(subgrid_level_name) == grlnd) then
+ n=2
+ if (present(nt)) then
+ start(3) = nt ; count(3) = 1
+ n=3
+ end if
+ else
+ n=1
+ if (present(nt)) then
+ n=2
+ start(2) = nt ; count(2) = 1
+ end if
end if
else
n=1
@@ -1823,7 +1838,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 +1854,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 +1877,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,37 +1916,82 @@ 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
- count(3) = size(data,dim=2)
- n=3
- if (present(nt)) then
- start(4) = nt; count(4) = 1
- n=4
+ call scam_field_offsets(ncid, subgrid_level_name, vardesc, start, count, &
+ found=found, posNOTonfile=posNOTonfile)
+ status = pio_inq_varndims(ncid, vardesc, ndims)
+ n=ndims
+ call ncd_inqfdims(ncid, isgrid2d, ni, nj, ns)
+ if (isgrid2d) then
+ if (trim(subgrid_level_name) == grlnd) then
+ n=3
+ if (present(switchdim)) then
+ if (switchdim) then
+ count(3) = size(temp,dim=2)
+ else
+ count(3) = size(data,dim=2)
+ end if
+ else
+ count(3) = size(data,dim=2)
+ end if
+ if (present(nt)) then
+ start(4) = nt; count(4) = 1
+ n=4
+ end if
+ else
+ n=2
+ if (present(switchdim)) then
+ if (switchdim) then
+ count(2) = size(temp,dim=2)
+ else
+ count(2) = size(data,dim=2)
+ end if
+ else
+ count(2) = size(data,dim=2)
+ end if
+ if (present(nt)) then
+ n=3
+ start(3) = nt ; count(3) = 1
+ end if
end if
else
- count(2) = size(data,dim=2)
n=2
+ if (present(switchdim)) then
+ if (switchdim) then
+ count(2) = size(temp,dim=2)
+ else
+ count(2) = size(data,dim=2)
+ end if
+ else
+ count(2) = size(data,dim=2)
+ end if
if (present(nt)) then
- start(3) = nt ; count(3) = 1
n=3
+ start(3) = nt; count(3) = 1
end if
end if
if (present(switchdim)) then
- status = pio_get_var(ncid, vardesc, start(1:n), count(1:n), temp)
- do j = lb2,ub2
- do i = lb1,ub1
- data(i,j) = temp(j,i)
+ if (switchdim) then
+ if (ndims == 1) then
+ write(iulog,*) trim(subname),' ERROR: dont know how to handle for switchdim'
+ call shr_sys_abort(errMsg(sourcefile, __LINE__))
+ end if
+ status = pio_get_var(ncid, vardesc, start(1:n), count(1:n), temp)
+ do j = lb2,ub2
+ do i = lb1,ub1
+ data(i,j) = temp(j,i)
+ end do
end do
- end do
+ else
+ status = pio_get_var(ncid, vardesc, start(1:ndims), count(1:ndims), data)
+ endif
else
- status = pio_get_var(ncid, vardesc, start(1:n), count(1:n), data)
+ status = pio_get_var(ncid, vardesc, start(1:ndims), count(1:ndims), data)
endif
else
status = pio_inq_varndims(ncid, vardesc, ndims)
@@ -2067,7 +2130,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 +2143,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 +2162,8 @@ 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
character(len=*),parameter :: subname='ncd_io_3d_{TYPE}' ! subroutine name
!-----------------------------------------------------------------------
@@ -2108,31 +2173,43 @@ 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
- count(3) = size(data,dim=2);
- count(4) = size(data,dim=3)
- n=4
- if (present(nt)) then
- start(5) = nt
- count(5) = 1
- n=5
+ status = pio_inq_varndims(ncid, vardesc, ndims)
+ n=ndims
+ call ncd_inqfdims(ncid, isgrid2d, ni, nj, ns)
+ if (isgrid2d) then
+ if (trim(subgrid_level_name) == grlnd) then
+ n=4
+ count(3) = size(data,dim=2);
+ count(4) = size(data,dim=3)
+ if (present(nt)) then
+ start(5) = nt
+ count(5) = 1
+ n=5
+ end if
+ else
+ n=3
+ count(2) = size(data,dim=2)
+ count(3) = size(data,dim=3)
+ if (present(nt)) then
+ n=4
+ start(4) = nt
+ count(4) = 1
+ end if
end if
else
- count(2) = size(data,dim=2)
- count(3) = size(data,dim=3)
n=3
if (present(nt)) then
+ n=4
start(4) = nt
count(4) = 1
- n=4
end if
end if
status = pio_get_var(ncid, vardesc, start(1:n), count(1:n), data)
@@ -2438,6 +2515,9 @@ contains
else if ( trim(dimname)=='ni'.or. trim(dimname)=='lon'.or. trim(dimname)=='lsmlon') 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
allocate (cols1dlon(dimlen))
diff --git a/src/main/surfrdMod.F90 b/src/main/surfrdMod.F90
index 78c9d8492e..d01c18c83d 100644
--- a/src/main/surfrdMod.F90
+++ b/src/main/surfrdMod.F90
@@ -271,8 +271,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
!-----------------------------------------------------------------------
@@ -304,9 +306,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