VTK
dox/Parallel/vtkDistributedDataFilter.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    vtkDistributedDataFilter.h
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 
00091 #ifndef __vtkDistributedDataFilter_h
00092 #define __vtkDistributedDataFilter_h
00093 
00094 #include "vtkDataObjectAlgorithm.h"
00095 
00096 class vtkBSPCuts;
00097 class vtkDataArray;
00098 class vtkDistributedDataFilterSTLCloak;
00099 class vtkFloatArray;
00100 class vtkIdList;
00101 class vtkIdTypeArray;
00102 class vtkIntArray;
00103 class vtkModelMetadata;
00104 class vtkMultiProcessController;
00105 class vtkPKdTree;
00106 class vtkUnstructuredGrid;
00107 
00108 class VTK_PARALLEL_EXPORT vtkDistributedDataFilter: public vtkDataObjectAlgorithm
00109 {
00110   vtkTypeMacro(vtkDistributedDataFilter, vtkDataObjectAlgorithm);
00111 
00112 public:
00113   void PrintSelf(ostream& os, vtkIndent indent);
00114 
00115   static vtkDistributedDataFilter *New();
00116 
00118 
00119   void SetController(vtkMultiProcessController *c);
00120   vtkGetObjectMacro(Controller, vtkMultiProcessController);
00122 
00131   vtkPKdTree *GetKdtree();
00132 
00147   vtkBooleanMacro(RetainKdtree, int);
00148   vtkGetMacro(RetainKdtree, int);
00149   vtkSetMacro(RetainKdtree, int);
00150 
00160   vtkBooleanMacro(IncludeAllIntersectingCells, int);
00161   vtkGetMacro(IncludeAllIntersectingCells, int);
00162   vtkSetMacro(IncludeAllIntersectingCells, int);
00163 
00168   vtkBooleanMacro(ClipCells, int);
00169   vtkGetMacro(ClipCells, int);
00170   vtkSetMacro(ClipCells, int);
00171 
00172 //BTX
00173   enum BoundaryModes {
00174     ASSIGN_TO_ONE_REGION=0,
00175     ASSIGN_TO_ALL_INTERSECTING_REGIONS=1,
00176     SPLIT_BOUNDARY_CELLS=2
00177   };
00178 //ETX
00179 
00181 
00182   void SetBoundaryMode(int mode);
00183   void SetBoundaryModeToAssignToOneRegion()
00184     { this->SetBoundaryMode(vtkDistributedDataFilter::ASSIGN_TO_ONE_REGION); }
00185   void SetBoundaryModeToAssignToAllIntersectingRegions()
00186     { this->SetBoundaryMode(
00187       vtkDistributedDataFilter::ASSIGN_TO_ALL_INTERSECTING_REGIONS);
00188     }
00189   void SetBoundaryModeToSplitBoundaryCells()
00190     { this->SetBoundaryMode(vtkDistributedDataFilter::SPLIT_BOUNDARY_CELLS); }
00191   int GetBoundaryMode();
00193   
00195   virtual int RequestUpdateExtent(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00196 
00204   vtkBooleanMacro(UseMinimalMemory, int);
00205   vtkGetMacro(UseMinimalMemory, int);
00206   vtkSetMacro(UseMinimalMemory, int);
00207 
00208 
00211   vtkBooleanMacro(Timing, int);
00212   vtkSetMacro(Timing, int);
00213   vtkGetMacro(Timing, int);
00214 
00216 
00221   vtkBSPCuts* GetCuts() {return this->UserCuts;}
00222   void SetCuts(vtkBSPCuts* cuts);
00224 
00233   void SetUserRegionAssignments(const int *map, int numRegions);
00234   
00235 protected:
00236   vtkDistributedDataFilter();
00237   ~vtkDistributedDataFilter();
00238 
00244   void AssignBoundaryCellsToOneRegionOn();
00245   void AssignBoundaryCellsToOneRegionOff();
00246   void SetAssignBoundaryCellsToOneRegion(int val);
00247 
00255   void AssignBoundaryCellsToAllIntersectingRegionsOn();
00256   void AssignBoundaryCellsToAllIntersectingRegionsOff();
00257   void SetAssignBoundaryCellsToAllIntersectingRegions(int val);
00258 
00265   void DivideBoundaryCellsOn();
00266   void DivideBoundaryCellsOff();
00267   void SetDivideBoundaryCells(int val);
00268 
00273   virtual int RequestData(vtkInformation *, vtkInformationVector **,
00274     vtkInformationVector *);
00275   void SingleProcessExecute(vtkDataSet *input, vtkUnstructuredGrid *output);
00276   virtual int RequestInformation(vtkInformation *, vtkInformationVector **,
00277     vtkInformationVector *);
00278   virtual int FillInputPortInformation(int port, vtkInformation *info);
00279   
00281 
00284   virtual int RequestDataObject(vtkInformation*,
00285                                 vtkInformationVector**,
00286                                 vtkInformationVector*);
00288   
00290   int RequestDataInternal(vtkDataSet* input, vtkUnstructuredGrid* output);
00291 //BTX
00292 private:
00293 
00294   enum{
00295       DeleteNo = 0,
00296       DeleteYes = 1
00297       };
00298 
00299   enum{
00300       DuplicateCellsNo = 0,
00301       DuplicateCellsYes = 1
00302       };
00303 
00304   enum{
00305       GhostCellsNo = 0,
00306       GhostCellsYes = 1
00307       };
00308 
00309   enum{
00310       UnsetGhostLevel = 99
00311       };
00312 
00314   int PartitionDataAndAssignToProcesses(vtkDataSet *set);
00315 
00317   vtkUnstructuredGrid *RedistributeDataSet(vtkDataSet *set, vtkDataSet *input);
00318 
00320   int ClipGridCells(vtkUnstructuredGrid *grid);
00321 
00323   vtkUnstructuredGrid * AcquireGhostCells(vtkUnstructuredGrid *grid);
00324 
00326   void ComputeMyRegionBounds();
00327  
00329   int CheckFieldArrayTypes(vtkDataSet *set);
00330 
00333   vtkDataSet *TestFixTooFewInputFiles(vtkDataSet *input);
00334 
00336   vtkUnstructuredGrid *MPIRedistribute(vtkDataSet *in, vtkDataSet *input);
00337 
00339   vtkIdList **GetCellIdsForProcess(int proc, int *nlists);
00340 
00343   void SetUpPairWiseExchange();
00344 
00346 
00347   void FreeIntArrays(vtkIdTypeArray **ar);
00348   static void FreeIdLists(vtkIdList**lists, int nlists);
00349   static vtkIdType GetIdListSize(vtkIdList**lists, int nlists);
00351 
00353 
00354   vtkIdTypeArray *ExchangeCounts(vtkIdType myCount, int tag);
00355   vtkIdTypeArray *ExchangeCountsLean(vtkIdType myCount, int tag);
00356   vtkIdTypeArray *ExchangeCountsFast(vtkIdType myCount, int tag);
00358 
00360 
00361   vtkIdTypeArray **ExchangeIdArrays(vtkIdTypeArray **arIn, 
00362                                     int deleteSendArrays, int tag);
00363   vtkIdTypeArray **ExchangeIdArraysLean(vtkIdTypeArray **arIn, 
00364                                         int deleteSendArrays, int tag);
00365   vtkIdTypeArray **ExchangeIdArraysFast(vtkIdTypeArray **arIn, 
00366                                         int deleteSendArrays, int tag);
00368   
00370 
00371   vtkFloatArray **ExchangeFloatArrays(vtkFloatArray **myArray, 
00372                                       int deleteSendArrays, int tag);
00373   vtkFloatArray **ExchangeFloatArraysLean(vtkFloatArray **myArray, 
00374                                       int deleteSendArrays, int tag);
00375   vtkFloatArray **ExchangeFloatArraysFast(vtkFloatArray **myArray, 
00376                                       int deleteSendArrays, int tag);
00378 
00380 
00381   vtkUnstructuredGrid *ExchangeMergeSubGrids(vtkIdList **cellIds, int deleteCellIds,
00382                          vtkDataSet *myGrid, int deleteMyGrid,
00383                          int filterOutDuplicateCells, int ghostCellFlag, int tag);
00384   vtkUnstructuredGrid *ExchangeMergeSubGrids(vtkIdList ***cellIds, int *numLists, 
00385                    int deleteCellIds,
00386                    vtkDataSet *myGrid, int deleteMyGrid,
00387                    int filterOutDuplicateCells, int ghostCellFlag, int tag);
00388   vtkUnstructuredGrid *ExchangeMergeSubGridsLean(
00389                    vtkIdList ***cellIds, int *numLists, 
00390                    int deleteCellIds,
00391                    vtkDataSet *myGrid, int deleteMyGrid,
00392                    int filterOutDuplicateCells, int ghostCellFlag, int tag);
00393   vtkUnstructuredGrid *ExchangeMergeSubGridsFast(
00394                    vtkIdList ***cellIds, int *numLists, 
00395                    int deleteCellIds,
00396                    vtkDataSet *myGrid, int deleteMyGrid,
00397                    int filterOutDuplicateCells, int ghostCellFlag, int tag);
00399 
00400 
00402 
00403   char *MarshallDataSet(vtkUnstructuredGrid *extractedGrid, int &size);
00404   vtkUnstructuredGrid *UnMarshallDataSet(char *buf, int size);
00406 
00408 
00409   void ClipCellsToSpatialRegion(vtkUnstructuredGrid *grid);
00410   void ClipWithVtkClipDataSet(vtkUnstructuredGrid *grid, double *bounds,
00411            vtkUnstructuredGrid **outside, vtkUnstructuredGrid **inside);
00413 
00414   void ClipWithBoxClipDataSet(vtkUnstructuredGrid *grid, double *bounds,
00415            vtkUnstructuredGrid **outside, vtkUnstructuredGrid **inside);
00416 
00418 
00422   vtkIdTypeArray *GetGlobalNodeIdArray(vtkDataSet *set);
00423   vtkIdType *GetGlobalNodeIds(vtkDataSet *set);
00424   vtkIdTypeArray *GetGlobalElementIdArray(vtkDataSet *set);
00425   vtkIdType *GetGlobalElementIds(vtkDataSet *set);
00426   int AssignGlobalNodeIds(vtkUnstructuredGrid *grid);
00427   int AssignGlobalElementIds(vtkDataSet *in);
00428   vtkIdTypeArray **FindGlobalPointIds(vtkFloatArray **ptarray,
00429     vtkIdTypeArray *ids, vtkUnstructuredGrid *grid, vtkIdType &numUniqueMissingPoints);
00431 
00433 
00434   vtkIdTypeArray **MakeProcessLists(vtkIdTypeArray **pointIds,
00435                                  vtkDistributedDataFilterSTLCloak *procs);
00437 
00439 
00440   vtkIdList **BuildRequestedGrids( vtkIdTypeArray **globalPtIds,
00441                         vtkUnstructuredGrid *grid,
00442                         vtkDistributedDataFilterSTLCloak *ptIdMap);
00444 
00446 
00447   int InMySpatialRegion(float x, float y, float z);
00448   int InMySpatialRegion(double x, double y, double z);
00449   int StrictlyInsideMyBounds(float x, float y, float z);
00450   int StrictlyInsideMyBounds(double x, double y, double z);
00452 
00454 
00455   vtkIdTypeArray **GetGhostPointIds(int ghostLevel, vtkUnstructuredGrid *grid,
00456                                     int AddCellsIAlreadyHave);
00457   vtkUnstructuredGrid *AddGhostCellsUniqueCellAssignment(
00458                            vtkUnstructuredGrid *myGrid,
00459                            vtkDistributedDataFilterSTLCloak *globalToLocalMap);
00460   vtkUnstructuredGrid *AddGhostCellsDuplicateCellAssignment(
00461                            vtkUnstructuredGrid *myGrid,
00462                            vtkDistributedDataFilterSTLCloak *globalToLocalMap);
00463   vtkUnstructuredGrid *SetMergeGhostGrid(
00464                        vtkUnstructuredGrid *ghostCellGrid,
00465                        vtkUnstructuredGrid *incomingGhostCells,
00466                        int ghostLevel, vtkDistributedDataFilterSTLCloak *idMap);
00468 
00470 
00471   vtkUnstructuredGrid *ExtractCells(vtkIdList *list, 
00472                   int deleteCellLists, vtkDataSet *in, vtkModelMetadata *mmd);
00473   vtkUnstructuredGrid *ExtractCells(vtkIdList **lists, int nlists, 
00474                   int deleteCellLists, vtkDataSet *in, vtkModelMetadata *mmd);
00475   vtkUnstructuredGrid *ExtractZeroCellGrid(vtkDataSet *in,
00476                   vtkModelMetadata *mmd);
00478 
00480 
00481   static int GlobalPointIdIsUsed(vtkUnstructuredGrid *grid,
00482                int ptId, vtkDistributedDataFilterSTLCloak *globalToLocal);
00483   static int LocalPointIdIsUsed(vtkUnstructuredGrid *grid, int ptId);
00484   static vtkIdType FindId(vtkIdTypeArray *ids, vtkIdType gid, vtkIdType startLoc);
00486 
00488 
00489   static vtkIdTypeArray *AddPointAndCells(vtkIdType gid, 
00490                                        vtkIdType localId, 
00491                                        vtkUnstructuredGrid *grid, 
00492                                        vtkIdType *gidCells, 
00493                                        vtkIdTypeArray *ids);
00495 
00497 
00498   static void AddConstantUnsignedCharPointArray(vtkUnstructuredGrid *grid, 
00499                                  const char *arrayName, unsigned char val);
00500   static void AddConstantUnsignedCharCellArray(vtkUnstructuredGrid *grid, 
00501                                  const char *arrayName, unsigned char val);
00503 
00505 
00506   static void RemoveRemoteCellsFromList(vtkIdList *cellList, 
00507                                         vtkIdType *gidCells, 
00508                                         vtkIdType *remoteCells, 
00509                                         vtkIdType nRemoteCells);
00511 
00513 
00514   static vtkUnstructuredGrid *MergeGrids(vtkDataSet **sets, int nsets,
00515                                          int deleteDataSets,
00516                                          int useGlobalNodeIds, float pointMergeTolerance,
00517                                          int useGlobalCellIds);
00519 
00521 
00522   void AddMetadata(vtkUnstructuredGrid *grid, vtkModelMetadata *mmd);
00523   static int HasMetadata(vtkDataSet *s);
00525 
00526   vtkPKdTree *Kdtree;
00527   vtkMultiProcessController *Controller;
00528 
00529   int NumProcesses;
00530   int MyId;
00531 
00532   int *Target;
00533   int *Source;
00534 
00535   int NumConvexSubRegions;
00536   double *ConvexSubRegionBounds;
00537 
00538   int GhostLevel;
00539 
00540   int RetainKdtree;
00541   int IncludeAllIntersectingCells;
00542   int ClipCells;
00543   int AssignBoundaryCellsToOneRegion;
00544   int AssignBoundaryCellsToAllIntersectingRegions;
00545   int DivideBoundaryCells;
00546 
00547   int Timing;
00548 
00549   int NextProgressStep;
00550   double ProgressIncrement;
00551 
00552   int UseMinimalMemory;
00553 
00554   vtkBSPCuts* UserCuts;
00555 
00556   vtkDistributedDataFilter(const vtkDistributedDataFilter&); // Not implemented
00557   void operator=(const vtkDistributedDataFilter&); // Not implemented
00558 
00559   class vtkInternals;
00560   vtkInternals* Internals;
00561 //ETX
00562 };
00563 #endif