docs: def get_var(self, name):
          """Return an nd array from model library"""
          # How many dimensions.
          rank = self.get_var_rank(name)
          # The shape array is fixed size
          shape = np.empty((MAXDIMS, ), dtype='int32', order='F')
          shape = self.get_var_shape(name)
          # there should be nothing here...
          assert sum(shape[rank:]) == 0
          # variable type name
          type_ = self.get_var_type(name)
  
          is_numpytype = type_ in TYPEMAP
  
          if is_numpytype:
              # Store the data in this type
              arraytype = ndpointer(dtype=TYPEMAP[type_],
                                    ndim=rank,
                                    shape=shape,
                                    flags='F')
          # '' or b''
          elif not type_:
              raise ValueError('type not found for variable {}'.format(name))
          else:
              arraytype = self.make_compound_ctype(name)
          # Create a pointer to the array type
          data = arraytype()
          # The functions get_var_type/_shape/_rank are already wrapped with
          # python function converter, get_var isn't.
          c_name = create_string_buffer(name)
          get_var = self.library.get_var
          get_var.argtypes = [c_char_p, POINTER(arraytype)]
          get_var.restype = None
          # Get the array
          get_var(c_name, byref(data))
          if not data:
              logger.info("NULL pointer returned")
              return None
  
          if is_numpytype:
              # for now always a pointer, see python-subgrid for advanced examples
              array = np.ctypeslib.as_array(data)
          else:
              array = structs2pandas(data.contents)
  
          return array