function make_esmf_info(num_levels, vloc, num_ungridded, names, units_array, coordinates, rc) &
result(info)
type(ESMF_Info) :: info
integer, optional, intent(in) :: num_levels
character(len=*), optional, intent(in) :: vloc
integer, optional, intent(in) :: num_ungridded
character(len=*), optional, intent(in) :: names(:)
character(len=*), optional, intent(in) :: units_array(:)
real, optional, intent(in) :: coordinates(:, :)
integer, optional, intent(out) :: rc
integer :: status
integer :: num_levels_, num_ungridded_
character(len=:), allocatable :: vloc_
num_ungridded_ = -1
num_levels_ = NUM_LEVELS_DEFAULT
if(present(num_levels)) num_levels_ = num_levels
vloc_ = VLOC_DEFAULT
if(present(vloc)) vloc_ = vloc
info = ESMF_InfoCreate(_RC)
call make_vertical_dim(info, vloc_, _RC)
call make_vertical_geom(info, num_levels_, _RC)
SET_RC(status)
if(present(names) .and. present(units_array)) then
if(size(names) /= size(units_array)) return
num_ungridded_ = size(names)
end if
if(present(num_ungridded)) then
if((num_ungridded_ >= 0) .and. (num_ungridded /= num_ungridded)) return
num_ungridded_ = num_ungridded
end if
call make_ungridded_dims_info(info, num_ungridded_, names, units_array, coordinates, _RC)
SET_RC(status)
end function make_esmf_info