vtkMaterialInterfaceFilter.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Kitware Inc.
2 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
3 // SPDX-License-Identifier: BSD-3-Clause
24 #ifndef vtkMaterialInterfaceFilter_h
25 #define vtkMaterialInterfaceFilter_h
26 
28 #include "vtkPVVTKExtensionsFiltersMaterialInterfaceModule.h" //needed for exports
29 #include <string> // needed for string
30 #include <vector> // needed for vector
31 
32 #include "vtkSmartPointer.h" // needed for smart pointer
33 #include "vtkTimerLog.h" // needed for vtkTimerLog.
34 
35 class vtkDataSet;
36 class vtkImageData;
37 class vtkPolyData;
39 class vtkPoints;
40 class vtkDoubleArray;
41 class vtkCellArray;
42 class vtkCellData;
43 class vtkIntArray;
46 class vtkCallbackCommand;
48 
49 // specific to us
50 class vtkMaterialInterfaceLevel;
51 class vtkMaterialInterfaceFilterBlock;
52 class vtkMaterialInterfaceFilterIterator;
53 class vtkMaterialInterfaceEquivalenceSet;
54 class vtkMaterialInterfaceFilterRingBuffer;
57 
60 {
61 public:
64  void PrintSelf(ostream& os, vtkIndent indent) override;
65 
66  // PARAVIEW interface stuff
67 
69 
72  void SelectMaterialArray(const char* name);
76  void UnselectMaterialArray(const char* name);
80  void UnselectAllMaterialArrays();
84  void SetMaterialArrayStatus(const char* name, int status);
86 
89  int GetMaterialArrayStatus(const char* name);
90  int GetMaterialArrayStatus(int index);
92 
95  int GetNumberOfMaterialArrays();
99  const char* GetMaterialArrayName(int index);
100 
102 
105  void SelectMassArray(const char* name);
109  void UnselectMassArray(const char* name);
113  void UnselectAllMassArrays();
117  void SetMassArrayStatus(const char* name, int status);
119 
122  int GetMassArrayStatus(const char* name);
123  int GetMassArrayStatus(int index);
125 
128  int GetNumberOfMassArrays();
132  const char* GetMassArrayName(int index);
133 
135 
138  void SelectVolumeWtdAvgArray(const char* name);
142  void UnselectVolumeWtdAvgArray(const char* name);
146  void UnselectAllVolumeWtdAvgArrays();
147 
151  void SetVolumeWtdAvgArrayStatus(const char* name, int status);
153 
156  int GetVolumeWtdAvgArrayStatus(const char* name);
157  int GetVolumeWtdAvgArrayStatus(int index);
159 
162  int GetNumberOfVolumeWtdAvgArrays();
166  const char* GetVolumeWtdAvgArrayName(int index);
167 
169 
172  void SelectMassWtdAvgArray(const char* name);
176  void UnselectMassWtdAvgArray(const char* name);
180  void UnselectAllMassWtdAvgArrays();
181 
185  void SetMassWtdAvgArrayStatus(const char* name, int status);
187 
190  int GetMassWtdAvgArrayStatus(const char* name);
191  int GetMassWtdAvgArrayStatus(int index);
193 
196  int GetNumberOfMassWtdAvgArrays();
200  const char* GetMassWtdAvgArrayName(int index);
201 
203 
206  void SelectSummationArray(const char* name);
210  void UnselectSummationArray(const char* name);
214  void UnselectAllSummationArrays();
218  void SetSummationArrayStatus(const char* name, int status);
220 
223  int GetSummationArrayStatus(const char* name);
224  int GetSummationArrayStatus(int index);
226 
229  int GetNumberOfSummationArrays();
233  const char* GetSummationArrayName(int index);
234 
237 
240  void SetMaterialFractionThreshold(double fraction);
241  vtkGetMacro(MaterialFractionThreshold, double);
243 
246 
249  vtkSetMacro(ComputeOBB, bool);
250  vtkGetMacro(ComputeOBB, bool);
252 
255 
265  void SetUpperLoadingBound(int nPolys);
266  vtkGetMacro(UpperLoadingBound, int);
268 
271 
274  vtkSetStringMacro(OutputBaseName);
275  vtkGetStringMacro(OutputBaseName);
278 
281  vtkSetMacro(WriteGeometryOutput, bool);
282  vtkGetMacro(WriteGeometryOutput, bool);
283  vtkSetMacro(WriteStatisticsOutput, bool);
284  vtkGetMacro(WriteStatisticsOutput, bool);
286 
288 
293  vtkSetMacro(BlockGhostLevel, unsigned char);
294  vtkGetMacro(BlockGhostLevel, unsigned char);
296 
300  static void SelectionModifiedCallback(vtkObject*, unsigned long, void* clientdata, void*);
301 
303 
306  void SetClipFunction(vtkImplicitFunction* clipFunction);
307  vtkGetObjectMacro(ClipFunction, vtkImplicitFunction);
309 
311 
315  vtkSetMacro(InvertVolumeFraction, int);
316  vtkGetMacro(InvertVolumeFraction, int);
318 
322  vtkMTimeType GetMTime() override;
323 
324 protected:
326  ~vtkMaterialInterfaceFilter() override;
327 
329  int FillInputPortInformation(int port, vtkInformation* info) override;
330  int FillOutputPortInformation(int port, vtkInformation* info) override;
331 
332  // Set up the result arrays for the calculations we are about to
333  // make.
334  void PrepareForPass(vtkNonOverlappingAMR* hbdsInput,
335  std::vector<std::string>& volumeWtdAvgArrayNames,
336  std::vector<std::string>& massWtdAvgArrayNames, std::vector<std::string>& summedArrayNames,
337  std::vector<std::string>& integratedArrayNames);
338  // Create a new fragment/piece.
339  vtkPolyData* NewFragmentMesh();
340  // Process each cell, looking for fragments.
341  int ProcessBlock(int blockId);
342  // Cell has been identified as inside the fragment. Integrate, and
343  // generate fragment surface etc...
344  void ConnectFragment(vtkMaterialInterfaceFilterRingBuffer* iterator);
345  void GetNeighborIterator(vtkMaterialInterfaceFilterIterator* next,
346  vtkMaterialInterfaceFilterIterator* iterator, int axis0, int maxFlag0, int axis1, int maxFlag1,
347  int axis2, int maxFlag2);
348  void GetNeighborIteratorPad(vtkMaterialInterfaceFilterIterator* next,
349  vtkMaterialInterfaceFilterIterator* iterator, int axis0, int maxFlag0, int axis1, int maxFlag1,
350  int axis2, int maxFlag2);
351  void CreateFace(vtkMaterialInterfaceFilterIterator* in, vtkMaterialInterfaceFilterIterator* out,
352  int axis, int outMaxFlag);
353  int ComputeDisplacementFactors(vtkMaterialInterfaceFilterIterator* pointNeighborIterators[8],
354  double displacmentFactors[3], int rootNeighborIdx, int faceAxis);
355  int SubVoxelPositionCorner(double* point,
356  vtkMaterialInterfaceFilterIterator* pointNeighborIterators[8], int rootNeighborIdx,
357  int faceAxis);
358  void FindPointNeighbors(vtkMaterialInterfaceFilterIterator* iteratorMin0,
359  vtkMaterialInterfaceFilterIterator* iteratorMax0, int axis0, int maxFlag1, int maxFlag2,
360  vtkMaterialInterfaceFilterIterator pointNeighborIterators[8], double pt[3]);
361  // Finds a global origin for the data set, and level 0 dx
362  int ComputeOriginAndRootSpacingOld(vtkNonOverlappingAMR* input);
363  void ComputeOriginAndRootSpacing(vtkNonOverlappingAMR* input);
364  // Returns the total number of local(wrt this proc) blocks.
365  int GetNumberOfLocalBlocks(vtkNonOverlappingAMR* input);
366  // Complex ghost layer Handling.
367  std::vector<vtkMaterialInterfaceFilterBlock*> GhostBlocks;
368  void ShareGhostBlocks();
369  void HandleGhostBlockRequests();
370  int ComputeRequiredGhostExtent(int level, int inExt[6], int outExt[6]);
371 
372  void ComputeAndDistributeGhostBlocks(
373  int* numBlocksInProc, int* blockMetaData, int myProc, int numProcs);
374 
376 
377  vtkMaterialInterfaceEquivalenceSet* EquivalenceSet;
378  void AddEquivalence(
379  vtkMaterialInterfaceFilterIterator* neighbor1, vtkMaterialInterfaceFilterIterator* neighbor2);
380  //
381  void PrepareForResolveEquivalences();
382  //
383  void ResolveEquivalences();
384  void GatherEquivalenceSets(vtkMaterialInterfaceEquivalenceSet* set);
385  void ShareGhostEquivalences(vtkMaterialInterfaceEquivalenceSet* globalSet, int* procOffsets);
386  void ReceiveGhostFragmentIds(vtkMaterialInterfaceEquivalenceSet* globalSet, int* procOffset);
387  void MergeGhostEquivalenceSets(vtkMaterialInterfaceEquivalenceSet* globalSet);
388 
389  // Sum/finalize attribute's contribution for those
390  // which are split over multiple processes.
391  int ResolveIntegratedAttributes(int controllingProcId);
392  // Initialize our attribute arrays to ho9ld resolved attributes
393  int PrepareToResolveIntegratedAttributes();
394 
395  // Send my integrated attributes to another process.
396  int SendIntegratedAttributes(int recipientProcId);
397  // Receive integrated attributes from another process.
398  int ReceiveIntegratedAttributes(int sourceProcId);
399  // Size buffers etc...
400  int PrepareToCollectIntegratedAttributes(std::vector<vtkMaterialInterfaceCommBuffer>& buffers,
401  std::vector<vtkDoubleArray*>& volumes, std::vector<vtkDoubleArray*>& clipDepthMaxs,
402  std::vector<vtkDoubleArray*>& clipDepthMins, std::vector<vtkDoubleArray*>& moments,
403  std::vector<std::vector<vtkDoubleArray*>>& volumeWtdAvgs,
404  std::vector<std::vector<vtkDoubleArray*>>& massWtdAvgs,
405  std::vector<std::vector<vtkDoubleArray*>>& sums);
406  // Free resources.
407  int CleanUpAfterCollectIntegratedAttributes(std::vector<vtkMaterialInterfaceCommBuffer>& buffers,
408  std::vector<vtkDoubleArray*>& volumes, std::vector<vtkDoubleArray*>& clipDepthMaxs,
409  std::vector<vtkDoubleArray*>& clipDepthMins, std::vector<vtkDoubleArray*>& moments,
410  std::vector<std::vector<vtkDoubleArray*>>& volumeWtdAvgs,
411  std::vector<std::vector<vtkDoubleArray*>>& massWtdAvgs,
412  std::vector<std::vector<vtkDoubleArray*>>& sums);
413  // Receive all integrated attribute arrays from all other
414  // processes.
415  int CollectIntegratedAttributes(std::vector<vtkMaterialInterfaceCommBuffer>& buffers,
416  std::vector<vtkDoubleArray*>& volumes, std::vector<vtkDoubleArray*>& clipDepthMaxs,
417  std::vector<vtkDoubleArray*>& clipDepthMins, std::vector<vtkDoubleArray*>& moments,
418  std::vector<std::vector<vtkDoubleArray*>>& volumeWtdAvgs,
419  std::vector<std::vector<vtkDoubleArray*>>& massWtdAvgs,
420  std::vector<std::vector<vtkDoubleArray*>>& sums);
421  // Send my integrated attributes to all other processes.
422  int BroadcastIntegratedAttributes(int sourceProcessId);
423  // Send my geometric attribuites to a controller.
424  int SendGeometricAttributes(int controllingProcId);
425  // size buffers & new containers
426  int PrepareToCollectGeometricAttributes(std::vector<vtkMaterialInterfaceCommBuffer>& buffers,
427  std::vector<vtkDoubleArray*>& coaabb, std::vector<vtkDoubleArray*>& obb,
428  std::vector<int*>& ids);
429  // Free resources.
430  int CleanUpAfterCollectGeometricAttributes(std::vector<vtkMaterialInterfaceCommBuffer>& buffers,
431  std::vector<vtkDoubleArray*>& coaabb, std::vector<vtkDoubleArray*>& obb,
432  std::vector<int*>& ids);
433  // Receive all geometric attributes from all other
434  // processes.
435  int CollectGeometricAttributes(std::vector<vtkMaterialInterfaceCommBuffer>& buffers,
436  std::vector<vtkDoubleArray*>& coaabb, std::vector<vtkDoubleArray*>& obb,
437  std::vector<int*>& ids);
438  // size local copy to hold all.
439  int PrepareToMergeGeometricAttributes();
440  // Gather geometric attributes on a single process.
441  int GatherGeometricAttributes(int recipientProcId);
442  // Merge fragment's geometry that are split on this process
443  void ResolveLocalFragmentGeometry();
444  // Merge fragment's geometry that are split across processes
445  void ResolveRemoteFragmentGeometry();
446  // Clean duplicate points from fragment geometry.
447  void CleanLocalFragmentGeometry();
448  //
449  void BuildLoadingArray(std::vector<vtkIdType>& loadingArray);
450  int PackLoadingArray(vtkIdType*& buffer);
451  int UnPackLoadingArray(vtkIdType* buffer, int bufSize, std::vector<vtkIdType>& loadingArray);
452 
453  // copy any integrated attributes (volume, id, weighted averages, sums, etc)
454  // into the fragment polys in the output data sets.
455  void CopyAttributesToOutput0();
456  void CopyAttributesToOutput1();
457  void CopyAttributesToOutput2();
458  // Write a text file containing local fragment attributes.
459  int WriteGeometryOutputToTextFile();
460  int WriteStatisticsOutputToTextFile();
461  // Build the output data
462  int BuildOutputs(vtkMultiBlockDataSet* mbdsOutput0, vtkMultiBlockDataSet* mbdsOutput1,
463  vtkMultiBlockDataSet* mbdsOutput2, int materialId);
464 
465  // integration helper, returns 0 if the source array
466  // type is unsupported.
467  int Accumulate(double* dest, // scalar/vector result
468  vtkDataArray* src, // array to accumulate from
469  int nComps, //
470  int srcCellIndex, // which cell
471  double weight); // weight of contribution
472  int AccumulateMoments(double* moments, // =(Myz, Mxz, Mxy, m)
473  vtkDataArray* massArray, //
474  int srcCellIndex, // from which cell in mass
475  double* X);
476  // Compute the geomteric attributes that have been requested.
477  void ComputeGeometricAttributes();
478  int ComputeLocalFragmentOBB();
479  int ComputeLocalFragmentAABBCenters();
480  // int ComputeFragmentMVBB();
481 
482  // Format input block into an easy to access array with
483  // extra metadata (information) extracted.
485  vtkMaterialInterfaceFilterBlock** InputBlocks;
486  void DeleteAllBlocks();
487  int InitializeBlocks(vtkNonOverlappingAMR* input, std::string& materialFractionArrayName,
488  std::string& massArrayName, std::vector<std::string>& volumeWtdAvgArrayNames,
489  std::vector<std::string>& massWtdAvgArrayNames, std::vector<std::string>& summedArrayNames,
490  std::vector<std::string>& integratedArrayNames);
491  void AddBlock(vtkMaterialInterfaceFilterBlock* block, unsigned char levelOfGhostLayer);
492 
493  // New methods for connecting neighbors.
494  void CheckLevelsForNeighbors(vtkMaterialInterfaceFilterBlock* block);
495  // Returns 1 if there we neighbors found, 0 if not.
496  int FindFaceNeighbors(unsigned int blockLevel, int blockIndex[3], int faceAxis, int faceMaxFlag,
497  std::vector<vtkMaterialInterfaceFilterBlock*>* result);
498 
499  // We need ghost cells for edges and corners as well as faces.
500  // neighborDirection is used to specify a face, edge or corner.
501  // Using a 2x2x2 cube center at origin: (-1,-1,-1), (-1,-1,1) ... are corners.
502  // (1,1,0) is an edge, and (-1,0,0) is a face.
503  // Returns 1 if the neighbor exists.
504  int HasNeighbor(unsigned int blockLevel, int blockIndex[3], int neighborDirection[3]);
505 
506  // Threshold value used to select a cell
507  // as being iniside some fragment, PV uses
508  // a double between 0 and 1, this is stored here
510  // The extraction filter uses a scaled threshold
511  // in the range of 0 to 255
513  //
515  vtkSetStringMacro(MaterialFractionArrayName);
516 
517  // while processing a material array this holds
518  // a pointer to the output poly data
519  // data set
521  // As pieces/fragments are found they are stored here
522  // until resolution.
523  std::vector<vtkPolyData*> FragmentMeshes;
524 
525  // TODO? this could be cleaned up (somewhat) by
526  // adding an integration class which encapsulates
527  // all of the supported operations.
530  // Local id of current fragment
532  // Accumulator for the volume of the current fragment.
534  // Fragment volumes indexed by the fragment id. It's a local
535  // per-process indexing until fragments have been resolved
537 
538  // Min and max depth of crater.
539  // These are only computed when the clip plane is on.
540  double ClipDepthMin;
541  double ClipDepthMax;
544 
545  // Accumulator for moments of the current fragment
546  std::vector<double> FragmentMoment; // =(Myz, Mxz, Mxy, m)
547  // Moments indexed by fragment id
549  // Centers of fragment AABBs, only computed if moments are not
551  // let us know if the user has specified a mass array
553 
554  // Weighted average, where weights correspond to fragment volume.
555  // Accumulators one for each array to average, scalar or vector
556  std::vector<std::vector<double>> FragmentVolumeWtdAvg;
557  // weighted averages indexed by fragment id.
558  std::vector<vtkDoubleArray*> FragmentVolumeWtdAvgs;
559  // number of arrays for which to compute the weighted average
561  // Names of the arrays to average.
562  std::vector<std::string> VolumeWtdAvgArrayNames;
563 
564  // Weighted average, where weights correspond to fragment mass.
565  // Accumulators one for each array to average, scalar or vector
566  std::vector<std::vector<double>> FragmentMassWtdAvg;
567  // weighted averages indexed by fragment id.
568  std::vector<vtkDoubleArray*> FragmentMassWtdAvgs;
569  // number of arrays for which to compute the weighted average
571  // Names of the arrays to average.
572  std::vector<std::string> MassWtdAvgArrayNames;
573 
574  // Unique list of all integrated array names
575  // it's used construct list of arrays that
576  // will be copied into output.
577  std::vector<std::string> IntegratedArrayNames;
578  std::vector<int> IntegratedArrayNComp;
579  // number of integrated arrays
581 
582  // Sum of data over the fragment.
583  // Accumulators, one for each array to sum
584  std::vector<std::vector<double>> FragmentSum;
585  // sums indexed by fragment id.
586  std::vector<vtkDoubleArray*> FragmentSums;
587  // number of arrays for which to compute the weighted average
588  int NToSum;
590 
591  // OBB indexed by fragment id
593  // turn on/off OBB calculation
595 
596  // Upper bound used to exclude heavily loaded procs
597  // from work sharing. Reducing may aliviate oom issues.
599 
600  // This is getting a bit ugly but ...
601  // When we resolve (merge equivalent) fragments we need a mapping
602  // from local ids to global ids.
603  // This array give an offset into the global array for each process.
604  // The array is computed when we resolve ids, and is used
605  // when resoving other attributes like volume
606  int* NumberOfRawFragmentsInProcess; // in each process by proc id for a single material
607  int* LocalToGlobalOffsets; // indexes into a gathered array of local ids by proc id
608  int TotalNumberOfRawFragments; // over all processes for a single material
609  int NumberOfResolvedFragments; // over all processes for a single material
610  // Total number of fragments over all materials, used to
611  // generate a unique id for each fragment.
613  // Material id, each pass involves a different material use this to
614  // tag fragments by material.
616 
617  // For each material an array of resolved fragments. Blocks are multi piece
618  // of poly data. The multipiece is much like a std vector of poly data *.
619  // multi block is indexed by material.
621  // for each material a list of global ids of pieces we own.
622  std::vector<std::vector<int>> ResolvedFragmentIds;
623  // List of split fragments
624  std::vector<std::vector<int>> FragmentSplitMarker;
626 
627  // A polydata with points at fragment centers, same structure
628  // as the resolved fragments.
630  //
631  std::vector<vtkPoints*> ResolvedFragmentPoints;
632 
633  // A polydata representing OBB, same structure as the resolved
634  // fragments.
636 
637  double GlobalOrigin[3];
638  double RootSpacing[3];
639  int StandardBlockDimensions[3];
640 
641  void SaveBlockSurfaces(const char* fileName);
642  void SaveGhostSurfaces(const char* fileName);
643 
644  // Use for the moment to find neighbors.
645  // It could be changed into the primary storage of blocks.
646  std::vector<vtkMaterialInterfaceLevel*> Levels;
647 
648  // Ivars for computing the point on corners and edges of a face.
649  vtkMaterialInterfaceFilterIterator* FaceNeighbors;
650  // Permutation of the neighbors. Axis0 normal to face.
654  double FaceCornerPoints[12];
655  double FaceEdgePoints[12];
656  int FaceEdgeFlags[4];
657  // outMaxFlag implies out is positive direction of axis.
658  void ComputeFacePoints(vtkMaterialInterfaceFilterIterator* in,
659  vtkMaterialInterfaceFilterIterator* out, int axis, int outMaxFlag);
660  void ComputeFaceNeighbors(vtkMaterialInterfaceFilterIterator* in,
661  vtkMaterialInterfaceFilterIterator* out, int axis, int outMaxFlag);
662 
663  long ComputeProximity(const int faceIdx[3], int faceLevel, const int ext[6], int refLevel);
664 
665  void FindNeighbor(int faceIndex[3], int faceLevel, vtkMaterialInterfaceFilterIterator* neighbor,
666  vtkMaterialInterfaceFilterIterator* reference);
667 
668  // PARAVIEW interface data
678  int DrawOBB;
679  double Progress;
683 // Debug
684 #ifdef vtkMaterialInterfaceFilterDEBUG
685  int MyPid;
686 #endif
687 
689 
690  // Variables that setup clipping with a sphere and a plane.
691  double ClipCenter[3];
693  double ClipRadius;
695  double ClipPlaneVector[3];
696  double ClipPlaneNormal[3];
697 
698  // Variable that will invert a material.
700 
701  // Specify the number of Ghost level available in each block.
702  // By default set to 1
703  unsigned char BlockGhostLevel;
704 
705 #ifdef vtkMaterialInterfaceFilterPROFILE
706  // Lets profile to see what takes the most time for large number of processes.
707  vtkSmartPointer<vtkTimerLog> InitializeBlocksTimer;
708  vtkSmartPointer<vtkTimerLog> ShareGhostBlocksTimer;
709  long NumberOfBlocks;
710  long NumberOfGhostBlocks;
711  vtkSmartPointer<vtkTimerLog> ProcessBlocksTimer;
712  vtkSmartPointer<vtkTimerLog> ResolveEquivalencesTimer;
713 #endif
714 
715 private:
717  void operator=(const vtkMaterialInterfaceFilter&) = delete;
718 };
719 
720 #endif
vtkMaterialInterfaceEquivalenceSet * EquivalenceSet
int FragmentId
class vtkMaterialInterfaceFilterIntegrator {
Extract particles and analyse them.
Data structure that describes a fragment&#39;s loading.
vtkDataArraySelection * SummationArraySelection
vtkMultiProcessController * Controller
std::vector< vtkPolyData * > FragmentMeshes
std::vector< std::vector< int > > ResolvedFragmentIds
vtkMaterialInterfaceFilterIterator * FaceNeighbors
#define VTKPVVTKEXTENSIONSFILTERSMATERIALINTERFACE_EXPORT
vtkDataArraySelection * MaterialArraySelection
vtkMultiBlockDataSet * ResolvedFragments
std::vector< vtkDoubleArray * > FragmentSums
int vtkIdType
virtual int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *)
vtkMultiBlockDataSet * ResolvedFragmentOBBs
vtkTypeUInt64 vtkMTimeType
static vtkMultiBlockDataSetAlgorithm * New()
virtual int FillOutputPortInformation(int port, vtkInformation *info)
vtkMultiBlockDataSet * ResolvedFragmentCenters
std::vector< std::vector< double > > FragmentVolumeWtdAvg
vtkMaterialInterfaceFilterBlock ** InputBlocks
std::vector< std::string > VolumeWtdAvgArrayNames
std::vector< std::vector< double > > FragmentSum
virtual vtkMTimeType GetMTime()
std::vector< std::string > MassWtdAvgArrayNames
std::vector< std::vector< int > > FragmentSplitMarker
std::vector< vtkPoints * > ResolvedFragmentPoints
std::vector< vtkDoubleArray * > FragmentMassWtdAvgs
vtkDataArraySelection * MassWtdAvgArraySelection
std::vector< vtkDoubleArray * > FragmentVolumeWtdAvgs
std::vector< std::vector< double > > FragmentMassWtdAvg
std::vector< std::string > IntegratedArrayNames
virtual int FillInputPortInformation(int port, vtkInformation *info)
void PrintSelf(ostream &os, vtkIndent indent) VTK_OVERRIDE
vtkDataArraySelection * VolumeWtdAvgArraySelection
void operator=(const vtkObjectBase &)
std::vector< vtkMaterialInterfaceFilterBlock * > GhostBlocks
vtkDataArraySelection * MassArraySelection
std::vector< vtkMaterialInterfaceLevel * > Levels