subroutine readgrid4d_double_lld_ti_li(ifile, idata)
character(*), intent(in) :: ifile
type(nc4d_double_lld_ti_li) :: idata
integer(kind=intgr) :: ncid, varid, i
call griddims(ifile, idata)
allocate(idata%levels(idata%nlevels))
allocate(idata%times(idata%ntimes))
allocate(idata%longitudes(idata%nlons))
allocate(idata%latitudes(idata%nlats))
allocate(idata%ncdata(idata%dimsize(idata%dims(1)), idata%dimsize(idata%dims(2)), &
idata%dimsize(idata%dims(3)), idata%dimsize(idata%dims(4))))
!Open NetCDF
call check(nf90_open(ifile, nf90_nowrite, ncid))
do i = 1, idata%ndims
if(idata%dimname(i).eq."longitude".or.idata%dimname(i).eq."lon")then
call check(nf90_get_var(ncid, idata%varids(i), idata%longitudes))
idata%lonunits = idata%dimunits(i)
end if
if(idata%dimname(i).eq."latitude".or.idata%dimname(i).eq."lat") then
call check(nf90_get_var(ncid, idata%varids(i), idata%latitudes))
idata%latunits = idata%dimunits(i)
end if
if(idata%dimname(i).eq."time") then
call check(nf90_get_var(ncid, idata%varids(i), idata%times))
idata%timeunits = idata%dimunits(i)
end if
if(idata%dimname(i).eq."level") then
call check(nf90_get_var(ncid, idata%varids(i), idata%levels))
idata%levelunits = idata%dimunits(i)
end if
end do
!Get Variable name
call check(nf90_inq_varid(ncid, idata%varname, varid), idata%varname, ifile)
call check(nf90_get_var(ncid, varid, idata%ncdata), idata%vartype,"DOUBLE", ifile)
call check(nf90_close(ncid))
end subroutine readgrid4d_double_lld_ti_li