Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

vtkDistributedDataFilter.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    $RCSfile: vtkDistributedDataFilter.h,v $
00005 
00006   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
00007   All rights reserved.
00008   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00009 
00010      This software is distributed WITHOUT ANY WARRANTY; without even
00011      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00012      PURPOSE.  See the above copyright notice for more information.
00013 
00014 =========================================================================*/
00015 /*----------------------------------------------------------------------------
00016  Copyright (c) Sandia Corporation
00017  See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
00018 ----------------------------------------------------------------------------*/
00019 
00061 #ifndef __vtkDistributedDataFilter_h
00062 #define __vtkDistributedDataFilter_h
00063 
00064 #include "vtkUnstructuredGridAlgorithm.h"
00065 
00066 class vtkUnstructuredGrid;
00067 class vtkPKdTree;
00068 class vtkMultiProcessController;
00069 class vtkDataArray;
00070 class vtkIntArray;
00071 class vtkFloatArray;
00072 class vtkIdList;
00073 class vtkUnstructuredGrid;
00074 class vtkModelMetadata;
00075 class vtkDistributedDataFilterSTLCloak;
00076 
00077 class VTK_PARALLEL_EXPORT vtkDistributedDataFilter: public vtkUnstructuredGridAlgorithm
00078 {
00079   vtkTypeRevisionMacro(vtkDistributedDataFilter, 
00080     vtkUnstructuredGridAlgorithm);
00081 
00082 public:
00083   void PrintSelf(ostream& os, vtkIndent indent);
00084 
00085   static vtkDistributedDataFilter *New();
00086 
00088 
00089   void SetController(vtkMultiProcessController *c);
00090   vtkGetObjectMacro(Controller, vtkMultiProcessController);
00092 
00109   vtkSetStringMacro(GlobalNodeIdArrayName);
00110 
00117   vtkSetStringMacro(GlobalElementIdArrayName);
00118   
00133   vtkBooleanMacro(RetainKdtree, int);
00134   vtkGetMacro(RetainKdtree, int);
00135   vtkSetMacro(RetainKdtree, int);
00136 
00142   vtkPKdTree *GetKdtree();
00143 
00153   vtkBooleanMacro(IncludeAllIntersectingCells, int);
00154   vtkGetMacro(IncludeAllIntersectingCells, int);
00155   vtkSetMacro(IncludeAllIntersectingCells, int);
00156 
00161   vtkBooleanMacro(ClipCells, int);
00162   vtkGetMacro(ClipCells, int);
00163   vtkSetMacro(ClipCells, int);
00164 
00165 //BTX
00166   enum BoundaryModes {
00167     ASSIGN_TO_ONE_REGION=0,
00168     ASSIGN_TO_ALL_INTERSECTING_REGIONS=1,
00169     SPLIT_BOUNDARY_CELLS=2
00170   };
00171 //ETX
00172 
00174 
00175   void SetBoundaryMode(int mode);
00176   void SetBoundaryModeToAssignToOneRegion()
00177     { this->SetBoundaryMode(vtkDistributedDataFilter::ASSIGN_TO_ONE_REGION); }
00178   void SetBoundaryModeToAssignToAllIntersectingRegions()
00179     { this->SetBoundaryMode(
00180       vtkDistributedDataFilter::ASSIGN_TO_ALL_INTERSECTING_REGIONS);
00181     }
00182   void SetBoundaryModeToSplitBoundaryCells()
00183     { this->SetBoundaryMode(vtkDistributedDataFilter::SPLIT_BOUNDARY_CELLS); }
00184   int GetBoundaryMode();
00186   
00188   virtual int RequestUpdateExtent(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00189 
00197   vtkBooleanMacro(UseMinimalMemory, int);
00198   vtkGetMacro(UseMinimalMemory, int);
00199   vtkSetMacro(UseMinimalMemory, int);
00200 
00201 
00204   vtkBooleanMacro(Timing, int);
00205   vtkSetMacro(Timing, int);
00206   vtkGetMacro(Timing, int);
00207 
00209   unsigned long GetMTime();
00210 
00211 protected:
00212   vtkDistributedDataFilter();
00213   ~vtkDistributedDataFilter();
00214 
00220   void AssignBoundaryCellsToOneRegionOn();
00221   void AssignBoundaryCellsToOneRegionOff();
00222   void SetAssignBoundaryCellsToOneRegion(int val);
00223 
00231   void AssignBoundaryCellsToAllIntersectingRegionsOn();
00232   void AssignBoundaryCellsToAllIntersectingRegionsOff();
00233   void SetAssignBoundaryCellsToAllIntersectingRegions(int val);
00234 
00241   void DivideBoundaryCellsOn();
00242   void DivideBoundaryCellsOff();
00243   void SetDivideBoundaryCells(int val);
00244 
00249   virtual int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00250   void SingleProcessExecute(vtkDataSet *input, vtkUnstructuredGrid *output);
00251   virtual int RequestInformation(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00252   virtual int FillInputPortInformation(int port, vtkInformation *info);
00253 
00254 private:
00255 
00256 //BTX
00257   enum{
00258       DeleteNo = 0,
00259       DeleteYes = 1
00260       };
00261 
00262   enum{
00263       DuplicateCellsNo = 0,
00264       DuplicateCellsYes = 1
00265       };
00266 
00267   enum{
00268       GhostCellsNo = 0,
00269       GhostCellsYes = 1
00270       };
00271 
00272   enum{
00273       UnsetGhostLevel = 99
00274       };
00275 //ETX
00276   int PartitionDataAndAssignToProcesses(vtkDataSet *set);
00277   vtkUnstructuredGrid *RedistributeDataSet(vtkDataSet *set, vtkDataSet *input);
00278   int ClipGridCells(vtkUnstructuredGrid *grid);
00279   vtkUnstructuredGrid * AcquireGhostCells(vtkUnstructuredGrid *grid);
00280 
00281   void ComputeMyRegionBounds();
00282 
00283   int CheckFieldArrayTypes(vtkDataSet *set);
00284 
00285   vtkDataSet *TestFixTooFewInputFiles(vtkDataSet *input);
00286 
00287   vtkUnstructuredGrid *MPIRedistribute(vtkDataSet *in, vtkDataSet *input);
00288 
00289   vtkIdList **GetCellIdsForProcess(int proc, int *nlists);
00290 
00291   void SetUpPairWiseExchange();
00292   void FreeIntArrays(vtkIntArray **ar);
00293   vtkIntArray *ExchangeCounts(int myCount, int tag);
00294   vtkIntArray **ExchangeIntArrays(vtkIntArray **arIn, 
00295                                   int deleteSendArrays, int tag);
00296   vtkFloatArray **ExchangeFloatArrays(vtkFloatArray **myArray, 
00297                                       int deleteSendArrays, int tag);
00298   vtkUnstructuredGrid *ExchangeMergeSubGrids(vtkIdList **cellIds, int deleteCellIds,
00299                          vtkDataSet *myGrid, int deleteMyGrid,
00300                          int filterOutDuplicateCells, int ghostCellFlag, int tag);
00301   vtkUnstructuredGrid *ExchangeMergeSubGrids(vtkIdList ***cellIds, int *numLists, 
00302                    int deleteCellIds,
00303                    vtkDataSet *myGrid, int deleteMyGrid,
00304                    int filterOutDuplicateCells, int ghostCellFlag, int tag);
00305   vtkIntArray *ExchangeCountsLean(int myCount, int tag);
00306   vtkIntArray **ExchangeIntArraysLean(vtkIntArray **arIn, 
00307                                   int deleteSendArrays, int tag);
00308   vtkFloatArray **ExchangeFloatArraysLean(vtkFloatArray **myArray, 
00309                                       int deleteSendArrays, int tag);
00310   vtkUnstructuredGrid *ExchangeMergeSubGridsLean(
00311                    vtkIdList ***cellIds, int *numLists, 
00312                    int deleteCellIds,
00313                    vtkDataSet *myGrid, int deleteMyGrid,
00314                    int filterOutDuplicateCells, int ghostCellFlag, int tag);
00315   vtkIntArray *ExchangeCountsFast(int myCount, int tag);
00316   vtkIntArray **ExchangeIntArraysFast(vtkIntArray **arIn, 
00317                                   int deleteSendArrays, int tag);
00318   vtkFloatArray **ExchangeFloatArraysFast(vtkFloatArray **myArray, 
00319                                       int deleteSendArrays, int tag);
00320   vtkUnstructuredGrid *ExchangeMergeSubGridsFast(
00321                    vtkIdList ***cellIds, int *numLists, 
00322                    int deleteCellIds,
00323                    vtkDataSet *myGrid, int deleteMyGrid,
00324                    int filterOutDuplicateCells, int ghostCellFlag, int tag);
00325 
00326 
00327   char *MarshallDataSet(vtkUnstructuredGrid *extractedGrid, int &size);
00328   vtkUnstructuredGrid *UnMarshallDataSet(char *buf, int size);
00329 
00330   void ClipCellsToSpatialRegion(vtkUnstructuredGrid *grid);
00331 
00332   void ClipWithVtkClipDataSet(vtkUnstructuredGrid *grid, double *bounds,
00333            vtkUnstructuredGrid **outside, vtkUnstructuredGrid **inside);
00334   void ClipWithBoxClipDataSet(vtkUnstructuredGrid *grid, double *bounds,
00335            vtkUnstructuredGrid **outside, vtkUnstructuredGrid **inside);
00336 
00337   const char *GetGlobalNodeIdArrayName(vtkDataSet *set);
00338   int *GetGlobalNodeIds(vtkDataSet *set);
00339 
00340   const char *GetGlobalElementIdArrayName(vtkDataSet *set);
00341   int *GetGlobalElementIds(vtkDataSet *set);
00342 
00343   int AssignGlobalNodeIds(vtkUnstructuredGrid *grid);
00344   int AssignGlobalElementIds(vtkDataSet *in);
00345 
00346   vtkIntArray **FindGlobalPointIds(vtkFloatArray **ptarray,
00347     vtkIntArray *ids, vtkUnstructuredGrid *grid, int &numUniqueMissingPoints);
00348 
00349   int InMySpatialRegion(float x, float y, float z);
00350   int InMySpatialRegion(double x, double y, double z);
00351   int StrictlyInsideMyBounds(float x, float y, float z);
00352   int StrictlyInsideMyBounds(double x, double y, double z);
00353 
00354   vtkIntArray **GetGhostPointIds(int ghostLevel, vtkUnstructuredGrid *grid,
00355                                  int AddCellsIAlreadyHave);
00356   vtkIntArray **MakeProcessLists(vtkIntArray **pointIds,
00357                                  vtkDistributedDataFilterSTLCloak *procs);
00358   vtkUnstructuredGrid *AddGhostCellsUniqueCellAssignment(
00359                            vtkUnstructuredGrid *myGrid,
00360                            vtkDistributedDataFilterSTLCloak *globalToLocalMap);
00361   vtkUnstructuredGrid *AddGhostCellsDuplicateCellAssignment(
00362                            vtkUnstructuredGrid *myGrid,
00363                            vtkDistributedDataFilterSTLCloak *globalToLocalMap);
00364   vtkIdList **BuildRequestedGrids( vtkIntArray **globalPtIds,
00365                         vtkUnstructuredGrid *grid,
00366                         vtkDistributedDataFilterSTLCloak *ptIdMap);
00367   vtkUnstructuredGrid *SetMergeGhostGrid(
00368                        vtkUnstructuredGrid *ghostCellGrid,
00369                        vtkUnstructuredGrid *incomingGhostCells,
00370                        int ghostLevel, vtkDistributedDataFilterSTLCloak *idMap);
00371 
00372   vtkUnstructuredGrid *ExtractCells(vtkIdList *list, 
00373                   int deleteCellLists, vtkDataSet *in, vtkModelMetadata *mmd);
00374   vtkUnstructuredGrid *ExtractCells(vtkIdList **lists, int nlists, 
00375                   int deleteCellLists, vtkDataSet *in, vtkModelMetadata *mmd);
00376   vtkUnstructuredGrid *ExtractZeroCellGrid(vtkDataSet *in,
00377                   vtkModelMetadata *mmd);
00378 
00379   void AddMetadata(vtkUnstructuredGrid *grid, vtkModelMetadata *mmd);
00380 
00381   static int GlobalPointIdIsUsed(vtkUnstructuredGrid *grid,
00382                int ptId, vtkDistributedDataFilterSTLCloak *globalToLocal);
00383 
00384   static int LocalPointIdIsUsed(vtkUnstructuredGrid *grid, int ptId);
00385   static int FindId(vtkIntArray *ids, int gid, int startLoc);
00386   static vtkIntArray *AddPointAndCells(int gid, int localId, 
00387                         vtkUnstructuredGrid *grid, int *gidCells, vtkIntArray *ids);
00388 
00389   static void AddConstantUnsignedCharPointArray(vtkUnstructuredGrid *grid, 
00390                                  const char *arrayName, unsigned char val);
00391   static void AddConstantUnsignedCharCellArray(vtkUnstructuredGrid *grid, 
00392                                  const char *arrayName, unsigned char val);
00393   static void RemoveRemoteCellsFromList(vtkIdList *cellList, int *gidCells, 
00394                                  int *remoteCells, int nRemoteCells);
00395   static vtkUnstructuredGrid *MergeGrids(vtkDataSet **sets, int nsets,
00396          int deleteDataSets,
00397          const char *globalNodeIdArrayName, float pointMergeTolerance,
00398          const char *globalCellIdArrayName);
00399 
00400   static void FreeIdLists(vtkIdList**lists, int nlists);
00401   static vtkIdType GetIdListSize(vtkIdList**lists, int nlists);
00402   static int HasMetadata(vtkDataSet *s);
00403 
00404   vtkPKdTree *Kdtree;
00405   vtkMultiProcessController *Controller;
00406 
00407   int NumProcesses;
00408   int MyId;
00409 
00410   int *Target;
00411   int *Source;
00412 
00413   int NumConvexSubRegions;
00414   double *ConvexSubRegionBounds;
00415 
00416   int GhostLevel;
00417 
00418   char *GlobalElementIdArrayName;
00419   char *GlobalNodeIdArrayName; 
00420 
00421   int RetainKdtree;
00422   int IncludeAllIntersectingCells;
00423   int ClipCells;
00424   int AssignBoundaryCellsToOneRegion;
00425   int AssignBoundaryCellsToAllIntersectingRegions;
00426   int DivideBoundaryCells;
00427 
00428   int Timing;
00429 
00430   int NextProgressStep;
00431   double ProgressIncrement;
00432 
00433   int UseMinimalMemory;
00434 
00435   vtkDistributedDataFilter(const vtkDistributedDataFilter&); // Not implemented
00436   void operator=(const vtkDistributedDataFilter&); // Not implemented
00437 };
00438 #endif

Generated on Mon Jan 21 23:07:33 2008 for VTK by  doxygen 1.4.3-20050530