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