00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
00173 enum BoundaryModes {
00174 ASSIGN_TO_ONE_REGION=0,
00175 ASSIGN_TO_ALL_INTERSECTING_REGIONS=1,
00176 SPLIT_BOUNDARY_CELLS=2
00177 };
00178
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
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&);
00557 void operator=(const vtkDistributedDataFilter&);
00558
00559 class vtkInternals;
00560 vtkInternals* Internals;
00561
00562 };
00563 #endif