ParaView Visualization

The section ParaView Support describes how to install Ascent with ParaView support and how to run the example integrations using insitu ParaView pipelines. In this section we describe in detail the ParaView visualization pipeline for cloverleaf3d, one of the example integrations, and we provide implementation details for the Ascent ParaView integration.

The ParaView pipeline for cloverleaf3d

First we need to tell Ascent that we are using a Python script to visualize data using ascent-actions.json.

[
  {
    "action": "add_extracts",
    "extracts":
    {
      "e1":
      {
        "type": "python",
         "params":
         {
           "file": "paraview-vis.py"
         }
       }
    }
  }
]

The ParaView pipeline for the cloverleaf3d sample integration is in paraview-vis.py.

We use a variable count to be able to distinguish timestep 0, when we setup the visualization pipeline. For all timesteps including timestep 0, we execute the visualization pipeline we setup at timestep 0.

try:
    count = count + 1
except NameError:
    count = 0

For timestep 0, we initialize ParaView,

if count == 0:
    import paraview
    paraview.options.batch = True
    paraview.options.symmetric = True

then we load the AscentSource plugin and we create the object that presents the simulation data as a VTK dataset. We also create a view of the same size as the image we want to save.

#
    LoadPlugin("@[email protected]", remote=True, ns=globals())
    ascentSource = AscentSource()
    view = CreateRenderView()
    view.ViewSize = [1024, 1024]

From the VTK dataset, we select only the cells that are not ghosts and show them colored by the energy scalar. Note that for a ParaView filter that has no input specified, the output data from the previous command in the program is used. So SelectCells uses the output data from ascentSource.

#
    sel = SelectCells("vtkGhostType < 1")
    e = ExtractSelection(Selection=sel)
    rep = Show()
    ColorBy(rep, ("CELLS", "energy"))

We rescale the transfer function, show a scalar bar, and change the viewing direction

#
    transferFunction = GetColorTransferFunction('energy')
    transferFunction.RescaleTransferFunction(1, 5.5)
    renderView1 = GetActiveView()
    scalarBar = GetScalarBar(transferFunction, renderView1)
    scalarBar.Title = 'energy'
    scalarBar.ComponentTitle = ''
    scalarBar.Visibility = 1
    rep.SetScalarBarVisibility(renderView1, True)
    cam = GetActiveCamera()
    cam.Elevation(30)
    cam.Azimuth(-30)

For all timesteps, UpdateAscentData sets the new Ascent data and marks the VTK source as modified. This insures that a new VTK dataset will be computed when we need to Render. We also call UpdatePropertyInformation which insures that property values are available to the script. There are two properties setup on AscentSource: Time (this represents the simulation time and is the same as state/time in Conduit Blueprint Mesh specification) and Cycle (this represents the simulation time step when the visualization pipeline is called and is the same as state/cycle in Conduit Blueprint Mesh specification). After that, we ResetCamera so that the image fits the screen properly, we render and save the image to a file.

ascentSource.UpdateAscentData()
ascentSource.UpdatePropertyInformation()
cycle = GetProperty(ascentSource, "Cycle").GetElement(0)
imageName = "image_{0:04d}.png".format(int(cycle))
ResetCamera()
Render()
SaveScreenshot(imageName, ImageResolution=(1024, 1024))

This script saves an image for each cycle with the image for cycle 200 shown next.

../_images/paraview_clover_example.png

Fig. 26 CloverLeaf3D visualized with a ParaView pipeline

Implementation details

The Ascent ParaView integration is implemented in the src/examples/paraview-vis directory in the Ascent distribution.

AscentSource class, found in paraview_ascent_source.py, derives from VTKPythonAlgorithmBase and produces one of the following datasets: vtkImageData, vtkRectilinearGrid, vtkStructuredGrid or vtkUnstructuredGrid. AscentSource receives from an instrumented simulation a tree structure (json like) that describes the simulation data using the Conduit Blueprint Mesh specification. This data is converted to a VTK format using zero copy for data arrays.

Global extents are not passed for the existing example integrations so they are computed (using MPI communication) for uniform and rectilinear topologies but they are not computed for a structured topology (lulesh integration example). This means that for lulesh and datasets that have a structured topology we cannot save a correct parallel file that represents the whole dataset, unless the global extents are passed from the simulation.

A ParaView pipeline for each sample simulation is specified in a paraview-vis-XXX.py file where XXX is the name of the simulation. In this file, we load the ParaView plugin and setup the pipeline for timestep 0 and update the pipeline and save a screenshot for each timestep of the simulation.