code: def add_dimension(self, dimension, dim_pos, dim_val, vdim=False, **kwargs):
          
          if isinstance(dimension, (util.basestring, tuple)):
              dimension = Dimension(dimension)
  
          if dimension.name in self.kdims:
              raise Exception('{dim} dimension already defined'.format(dim=dimension.name))
  
          if vdim:
              dims = self.vdims[:]
              dims.insert(dim_pos, dimension)
              dimensions = dict(vdims=dims)
              dim_pos += self.ndims
          else:
              dims = self.kdims[:]
              dims.insert(dim_pos, dimension)
              dimensions = dict(kdims=dims)
  
          if issubclass(self.interface, ArrayInterface) and np.asarray(dim_val).dtype != self.data.dtype:
              element = self.clone(datatype=[default_datatype])
              data = element.interface.add_dimension(element, dimension, dim_pos, dim_val, vdim)
          else:
              data = self.interface.add_dimension(self, dimension, dim_pos, dim_val, vdim)
          return self.clone(data, **dimensions)
docs: Adds a dimension and its values to the Dataset
  
          Requires the dimension name or object, the desired position in
          the key dimensions and a key value scalar or array of values,
          matching the length o shape of the Dataset.
  
          Args:
              dimension: Dimension or dimension spec to add
              dim_pos (int) Integer index to insert dimension at
              dim_val (scalar or ndarray): Dimension value(s) to add
              vdim: Disabled, this type does not have value dimensions
              **kwargs: Keyword arguments passed to the cloned element
  
          Returns:
              Cloned object containing the new dimension