Back with another question!

I have a pipeline that has 1 input and 4 outputs. The simplest is a 
IntegrateVariables filter hooked up to the input. Another branch of the 
pipeline goes through several PythonCalculator filters and a 
CellDataToPointData filter and then arrives at the three outputs:


1. The CD2PD filter is connected to a Contour filter with a single level, X. 
This is then connected to an IntegrateVariables filter (used to compute the 
area of the Contour) and a Writer.

2. The CD2PD filter is also connected to another Contour filter with a single 
level Y. This is connected to an IntegrateVariables and Writer just as in 1.

3. The CD2PD filter is sliced two times with each slice in a different render 
view to save images.


I have the coprocessor running every delta_t seconds. The initial 
IntegrateVariables filter is updated with UpdatePipeline and then the values 
are saved to disk. This works every step, no issues.


I then call UpdatePipeline on both of the Contour and both of the 
IntegrateVariables filters in 1 and 2. I check if the 'Area' field in the 
IntegrateVariables exceeds a threshold, and if it does, I save the Contour's to 
disk as a VTK file. This is not working correctly.


If I start the simulation from a point where the Contour's exist in the flow 
already, then everything works great and the Area field changes in time and it 
saves the Contour's.


However, if the simulation starts without the Contours already in the flow, the 
Area fields stay zero forever. It's as if the pipeline isn't updating or 
something. I have attached the DoCoProcessing function used. I don't see 
anything immediately obvious that would prevent it from updating or getting the 
correct values for the Area.


Am I missing something about how the pipeline or contour filters update?


Thanks,


Tim
# ------------------------ Processing method ------------------------
def WriteDataFile(comm, object, filename, curTime, CellData=True):
  object.UpdatePipeline()

  if CellData:
    data = object.CellData
  else:
    data = object.PointData

  if comm.Get_rank() == 0:
    with  open(filename, 'a+') as fid:
      # Rewind the file to see if it is empty or not
      fid.seek(0)
      if len(fid.read(1)) == 0:
        # The file is empty, we need to create the header
        outputStr = '# Time     '
        for var in data.keys():
          outputStr += '%s      ' % var
        outputStr += '\n'
        fid.write(outputStr)

      outputStr = '%15.7e     ' % curTime
      for var in data.keys():
        value = data[var].GetRange()[0]
        outputStr += '%15.7e    ' % value
      outputStr += '\n'
      fid.write(outputStr)

def DoCoProcessing(datadescription):
    "Callback to do co-processing for current timestep"
    global coprocessor
    global lastTime
    global deltaT
    global comm
    global paths

    # Update the coprocessor by providing it the newly generated simulation data.
    # If the pipeline hasn't been setup yet, this will setup the pipeline.
    coprocessor.UpdateProducers(datadescription)

    curTime = datadescription.GetTime()
    timestep = datadescription.GetTimeStep()

    if curTime >= lastTime + deltaT:
      lastTime = curTime

      coprocessor.Pipeline.volumeIntegrals.UpdatePipeline()

      WriteDataFile(comm, coprocessor.Pipeline.volumeIntegrals,
                    paths['outdir']+'/post/volumeIntegrals.dat',
                    curTime,
                    CellData = True)

      # Check if we need to write images and the first flameArea datasets to disk
      coprocessor.Pipeline.flameArea.UpdatePipeline()
      area = np.zeros(1)

      if comm.Get_rank() == 0:
        try:
          area[0] = coprocessor.Pipeline.flameArea.CellData['Area'].GetRange()[0]
        except AttributeError:
          area[0] = 0.0
      else:
        area[0] = 0.0

      comm.Bcast(area, root=0)
      if area[0] > 1e-9:
        # Write image capture (Last arg: rescale lookup table), if appropriate.
        coprocessor.WriteImages(datadescription, rescale_lookuptable=False)

        # Write out the surface and the area
        coprocessor.Pipeline.flameSurfaceWriter.FileName = paths['outdir']+'/post/flameSurface_%07i.vtm' % timestep
        coprocessor.Pipeline.flameSurfaceWriter.UpdatePipeline(curTime)

        WriteDataFile(comm, coprocessor.Pipeline.flameArea,
                      paths['outdir']+'/post/flameArea.dat',
                      curTime,
                      CellData = False)


      # Check for the second flame surface
      coprocessor.Pipeline.flameArea2.UpdatePipeline()
      area = np.zeros(1)

      if comm.Get_rank() == 0:
        try:
          area[0] = coprocessor.Pipeline.flameArea2.CellData['Area'].GetRange()[0]
        except AttributeError:
          area[0] = 0.0
      else:
        area[0] = 0.0

      comm.Bcast(area, root=0)
      if area[0] > 1e-9:
        # Write image capture (Last arg: rescale lookup table), if appropriate.
        coprocessor.WriteImages(datadescription, rescale_lookuptable=False)

        coprocessor.Pipeline.flameSurface2Writer.FileName = paths['outdir']+'/post/flameSurface2_%07i.vtm' % timestep
        coprocessor.Pipeline.flameSurface2Writer.UpdatePipeline(curTime)

        WriteDataFile(comm, coprocessor.Pipeline.flameArea2,
                      paths['outdir']+'/post/flameArea2.dat',
                      curTime,
                      CellData = False)
_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the ParaView Wiki at: 
http://paraview.org/Wiki/ParaView

Search the list archives at: http://markmail.org/search/?q=ParaView

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/paraview

Reply via email to