Skip to content

Commit 88a4c49

Browse files
committed
feat: cache output of CenterMeridian, reuse mesh and existing arrays
1 parent aaa3682 commit 88a4c49

File tree

1 file changed

+78
-32
lines changed

1 file changed

+78
-32
lines changed

src/e3sm_quickview/plugins/eam_projection.py

Lines changed: 78 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
vtkPlane,
1212
)
1313
from vtkmodules.vtkCommonTransforms import vtkTransform
14-
from vtkmodules.vtkFiltersCore import vtkAppendFilter
14+
from vtkmodules.vtkFiltersCore import (
15+
vtkAppendFilter,
16+
vtkGenerateIds,
17+
)
1518
from vtkmodules.vtkFiltersGeneral import (
1619
vtkTransformFilter,
1720
vtkTableBasedClipDataSet,
@@ -510,6 +513,7 @@ def __init__(self):
510513
)
511514
# common values:
512515
self._center_meridian = 0
516+
self._cached_output = None
513517

514518
def SetMeridian(self, meridian_):
515519
'''
@@ -521,38 +525,80 @@ def SetMeridian(self, meridian_):
521525
self._center_meridian = meridian_
522526
self.Modified()
523527

528+
def GetMeridian(self):
529+
'''
530+
Returns the central meridian
531+
'''
532+
return self._center_meridian
533+
524534
def RequestData(self, request, inInfo, outInfo):
525535
inData = self.GetInputData(inInfo, 0, 0)
526-
outData = self.GetOutputData(outInfo, 0)
527-
528-
cut_meridian = self._center_meridian + 180
529-
530-
plane = vtkPlane()
531-
plane.SetOrigin([cut_meridian, 0.0, 0.0])
532-
plane.SetNormal([-1, 0, 0])
533-
# vtkClipPolyData hangs
534-
clipL = vtkTableBasedClipDataSet()
535-
clipL.SetClipFunction(plane)
536-
clipL.SetInputData(inData)
537-
clipL.Update()
538-
539-
plane.SetNormal([1, 0, 0])
540-
clipR = vtkTableBasedClipDataSet()
541-
clipR.SetClipFunction(plane)
542-
clipR.SetInputData(inData)
543-
clipR.Update()
544-
545-
transFunc = vtkTransform()
546-
transFunc.Translate(-360, 0, 0)
547-
transform = vtkTransformFilter()
548-
transform.SetInputData(clipR.GetOutput())
549-
transform.SetTransform(transFunc)
550-
transform.Update()
551-
552-
append = vtkAppendFilter()
553-
append.AddInputData(clipL.GetOutput())
554-
append.AddInputData(transform.GetOutput())
555-
append.Update()
556-
outData.ShallowCopy(append.GetOutput())
536+
inPoints = inData.GetPoints()
537+
inCellArray = inData.GetCells()
557538

539+
outData = self.GetOutputData(outInfo, 0)
540+
if self._cached_output and self._cached_output.GetMTime() > inPoints.GetMTime() and \
541+
self._cached_output.GetMTime() > inCellArray.GetMTime():
542+
# only scalars have been added or removed
543+
cached_cell_data = self._cached_output.GetCellData()
544+
545+
in_cell_data = inData.GetCellData()
546+
547+
outData.ShallowCopy(self._cached_output)
548+
out_cell_data = outData.GetCellData()
549+
550+
out_cell_data.Initialize()
551+
for i in range(in_cell_data.GetNumberOfArrays()):
552+
in_array = in_cell_data.GetArray(i)
553+
cached_array = cached_cell_data.GetArray(in_array.GetName())
554+
if cached_array and cached_array.GetMTime() >= in_array.GetMTime():
555+
# this scalar has been seen before
556+
# simply add a reference in the outData
557+
out_cell_data.AddArray(in_array)
558+
else:
559+
# this scalar is new
560+
# we have to fill in the additional cells resulted from the clip
561+
out_array = in_array.NewInstance()
562+
array0 = cached_cell_data.GetArray(0)
563+
out_array.SetNumberOfComponents(array0.GetNumberOfComponents())
564+
out_array.SetNumberOfTuples(array0.GetNumberOfTuples())
565+
out_array.SetName(in_array.GetName())
566+
out_cell_data.AddArray(out_array)
567+
outData.cell_data[out_array.GetName()] = inData.cell_data[i][self._cached_output.cell_data['PedigreeIds']]
568+
else:
569+
generate_ids = vtkGenerateIds()
570+
generate_ids.SetInputData(inData)
571+
generate_ids.PointIdsOff()
572+
generate_ids.SetCellIdsArrayName("PedigreeIds")
573+
574+
cut_meridian = self._center_meridian + 180
575+
plane = vtkPlane()
576+
plane.SetOrigin([cut_meridian, 0.0, 0.0])
577+
plane.SetNormal([-1, 0, 0])
578+
# vtkClipPolyData hangs
579+
clipL = vtkTableBasedClipDataSet()
580+
clipL.SetClipFunction(plane)
581+
clipL.SetInputConnection(generate_ids.GetOutputPort())
582+
clipL.Update()
583+
584+
plane.SetNormal([1, 0, 0])
585+
clipR = vtkTableBasedClipDataSet()
586+
clipR.SetClipFunction(plane)
587+
clipR.SetInputConnection(generate_ids.GetOutputPort())
588+
clipR.Update()
589+
590+
transFunc = vtkTransform()
591+
transFunc.Translate(-360, 0, 0)
592+
transform = vtkTransformFilter()
593+
transform.SetInputData(clipR.GetOutput())
594+
transform.SetTransform(transFunc)
595+
transform.Update()
596+
597+
append = vtkAppendFilter()
598+
append.AddInputData(clipL.GetOutput())
599+
append.AddInputData(transform.GetOutput())
600+
append.Update()
601+
outData.ShallowCopy(append.GetOutput())
602+
self._cached_output = outData.NewInstance()
603+
self._cached_output.ShallowCopy(outData)
558604
return 1

0 commit comments

Comments
 (0)