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