code: def read_exodus(
      filename,
      animate_mode_shapes=True,
      apply_displacements=True,
      displacement_magnitude=1.0,
      read_point_data=True,
      read_cell_data=True,
      enabled_sidesets=None,
  ):
      """Read an ExodusII file (``'.e'`` or ``'.exo'``).
  
      Parameters
      ----------
      filename : str
          The path to the exodus file to read.
  
      animate_mode_shapes : bool, default: True
          When ``True`` then this reader will report a continuous time
          range [0,1] and animate the displacements in a periodic
          sinusoid.
  
      apply_displacements : bool, default: True
          Geometric locations can include displacements. When ``True``,
          the nodal positions are 'displaced' by the standard exodus
          displacement vector. If displacements are turned off, the user
          can explicitly add them by applying a warp filter.
  
      displacement_magnitude : bool, default: 1.0
          This is a number between 0 and 1 that is used to scale the
          ``DisplacementMagnitude`` in a sinusoidal pattern.
  
      read_point_data : bool, default: True
          Read in data associated with points.
  
      read_cell_data : bool, default: True
          Read in data associated with cells.
  
      enabled_sidesets : str | int, optional
          The name of the array that store the mapping from side set
          cells back to the global id of the elements they bound.
  
      Returns
      -------
      pyvista.DataSet
          Wrapped PyVista dataset.
  
      Examples
      --------
      >>> import pyvista as pv
      >>> data = pv.read_exodus('mymesh.exo')  # doctest:+SKIP
  
      """
      from .helpers import wrap
  
      # lazy import here to avoid loading module on import pyvista
      try:
          from vtkmodules.vtkIOExodus import vtkExodusIIReader
      except ImportError:
          from vtk import vtkExodusIIReader
  
      reader = vtkExodusIIReader()
      reader.SetFileName(filename)
      reader.UpdateInformation()
      reader.SetAnimateModeShapes(animate_mode_shapes)
      reader.SetApplyDisplacements(apply_displacements)
      reader.SetDisplacementMagnitude(displacement_magnitude)
  
      if read_point_data:  # read in all point data variables
          reader.SetAllArrayStatus(vtkExodusIIReader.NODAL, 1)
  
      if read_cell_data:  # read in all cell data variables
          reader.SetAllArrayStatus(vtkExodusIIReader.ELEM_BLOCK, 1)
  
      if enabled_sidesets is None:
          enabled_sidesets = list(
              range(reader.GetNumberOfSideSetArrays())
          )
  
      for sideset in enabled_sidesets:
          if isinstance(sideset, int):
              name = reader.GetSideSetArrayName(sideset)
          elif isinstance(sideset, str):
              name = sideset
          else:
              raise ValueError(
                  f"Could not parse sideset ID/name: {sideset}"
              )
  
          reader.SetSideSetArrayStatus(name, 1)
  
      reader.Update()
      return wrap(reader.GetOutput())
  
imports: import os
  import pathlib
  import warnings
  import numpy
  import pyvista
  from pyvista.core import _vtk_core
  from pyvista.core.errors import PyVistaDeprecationWarning
  from .observers import Observer
label_desc: Use image node_id 8 for calling a global function with example usage: read_exodus(filename, animate_mode_shapes, apply_displacements, displacement_magnitude, read_point_data, read_cell_data, enabled_sidesets) and returns: wrap