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 vtkTypeRevisionMacro(vtkDistributedDataFilter,
00111 vtkDataObjectAlgorithm);
00112
00113 public:
00114 void PrintSelf(ostream& os, vtkIndent indent);
00115
00116 static vtkDistributedDataFilter *New();
00117
00119
00120 void SetController(vtkMultiProcessController *c);
00121 vtkGetObjectMacro(Controller, vtkMultiProcessController);
00123
00132 vtkPKdTree *GetKdtree();
00133
00148 vtkBooleanMacro(RetainKdtree, int);
00149 vtkGetMacro(RetainKdtree, int);
00150 vtkSetMacro(RetainKdtree, int);
00151
00161 vtkBooleanMacro(IncludeAllIntersectingCells, int);
00162 vtkGetMacro(IncludeAllIntersectingCells, int);
00163 vtkSetMacro(IncludeAllIntersectingCells, int);
00164
00169 vtkBooleanMacro(ClipCells, int);
00170 vtkGetMacro(ClipCells, int);
00171 vtkSetMacro(ClipCells, int);
00172
00173
00174 enum BoundaryModes {
00175 ASSIGN_TO_ONE_REGION=0,
00176 ASSIGN_TO_ALL_INTERSECTING_REGIONS=1,
00177 SPLIT_BOUNDARY_CELLS=2
00178 };
00179
00180
00182
00183 void SetBoundaryMode(int mode);
00184 void SetBoundaryModeToAssignToOneRegion()
00185 { this->SetBoundaryMode(vtkDistributedDataFilter::ASSIGN_TO_ONE_REGION); }
00186 void SetBoundaryModeToAssignToAllIntersectingRegions()
00187 { this->SetBoundaryMode(
00188 vtkDistributedDataFilter::ASSIGN_TO_ALL_INTERSECTING_REGIONS);
00189 }
00190 void SetBoundaryModeToSplitBoundaryCells()
00191 { this->SetBoundaryMode(vtkDistributedDataFilter::SPLIT_BOUNDARY_CELLS); }
00192 int GetBoundaryMode();
00194
00196 virtual int RequestUpdateExtent(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00197
00205 vtkBooleanMacro(UseMinimalMemory, int);
00206 vtkGetMacro(UseMinimalMemory, int);
00207 vtkSetMacro(UseMinimalMemory, int);
00208
00209
00212 vtkBooleanMacro(Timing, int);
00213 vtkSetMacro(Timing, int);
00214 vtkGetMacro(Timing, int);
00215
00217
00222 vtkBSPCuts* GetCuts() {return this->UserCuts;}
00223 void SetCuts(vtkBSPCuts* cuts);
00225
00226 protected:
00227 vtkDistributedDataFilter();
00228 ~vtkDistributedDataFilter();
00229
00235 void AssignBoundaryCellsToOneRegionOn();
00236 void AssignBoundaryCellsToOneRegionOff();
00237 void SetAssignBoundaryCellsToOneRegion(int val);
00238
00246 void AssignBoundaryCellsToAllIntersectingRegionsOn();
00247 void AssignBoundaryCellsToAllIntersectingRegionsOff();
00248 void SetAssignBoundaryCellsToAllIntersectingRegions(int val);
00249
00256 void DivideBoundaryCellsOn();
00257 void DivideBoundaryCellsOff();
00258 void SetDivideBoundaryCells(int val);
00259
00264 virtual int RequestData(vtkInformation *, vtkInformationVector **,
00265 vtkInformationVector *);
00266 void SingleProcessExecute(vtkDataSet *input, vtkUnstructuredGrid *output);
00267 virtual int RequestInformation(vtkInformation *, vtkInformationVector **,
00268 vtkInformationVector *);
00269 virtual int FillInputPortInformation(int port, vtkInformation *info);
00270
00272
00275 virtual int RequestDataObject(vtkInformation*,
00276 vtkInformationVector**,
00277 vtkInformationVector*);
00279
00281 int RequestDataInternal(vtkDataSet* input, vtkUnstructuredGrid* output);
00282 private:
00283
00284
00285 enum{
00286 DeleteNo = 0,
00287 DeleteYes = 1
00288 };
00289
00290 enum{
00291 DuplicateCellsNo = 0,
00292 DuplicateCellsYes = 1
00293 };
00294
00295 enum{
00296 GhostCellsNo = 0,
00297 GhostCellsYes = 1
00298 };
00299
00300 enum{
00301 UnsetGhostLevel = 99
00302 };
00303
00304
00306 int PartitionDataAndAssignToProcesses(vtkDataSet *set);
00307
00309 vtkUnstructuredGrid *RedistributeDataSet(vtkDataSet *set, vtkDataSet *input);
00310
00312 int ClipGridCells(vtkUnstructuredGrid *grid);
00313
00315 vtkUnstructuredGrid * AcquireGhostCells(vtkUnstructuredGrid *grid);
00316
00318 void ComputeMyRegionBounds();
00319
00321 int CheckFieldArrayTypes(vtkDataSet *set);
00322
00325 vtkDataSet *TestFixTooFewInputFiles(vtkDataSet *input);
00326
00328 vtkUnstructuredGrid *MPIRedistribute(vtkDataSet *in, vtkDataSet *input);
00329
00331 vtkIdList **GetCellIdsForProcess(int proc, int *nlists);
00332
00335 void SetUpPairWiseExchange();
00336
00338
00339 void FreeIntArrays(vtkIdTypeArray **ar);
00340 static void FreeIdLists(vtkIdList**lists, int nlists);
00341 static vtkIdType GetIdListSize(vtkIdList**lists, int nlists);
00343
00345
00346 vtkIdTypeArray *ExchangeCounts(vtkIdType myCount, int tag);
00347 vtkIdTypeArray *ExchangeCountsLean(vtkIdType myCount, int tag);
00348 vtkIdTypeArray *ExchangeCountsFast(vtkIdType myCount, int tag);
00350
00352
00353 vtkIdTypeArray **ExchangeIdArrays(vtkIdTypeArray **arIn,
00354 int deleteSendArrays, int tag);
00355 vtkIdTypeArray **ExchangeIdArraysLean(vtkIdTypeArray **arIn,
00356 int deleteSendArrays, int tag);
00357 vtkIdTypeArray **ExchangeIdArraysFast(vtkIdTypeArray **arIn,
00358 int deleteSendArrays, int tag);
00360
00362
00363 vtkFloatArray **ExchangeFloatArrays(vtkFloatArray **myArray,
00364 int deleteSendArrays, int tag);
00365 vtkFloatArray **ExchangeFloatArraysLean(vtkFloatArray **myArray,
00366 int deleteSendArrays, int tag);
00367 vtkFloatArray **ExchangeFloatArraysFast(vtkFloatArray **myArray,
00368 int deleteSendArrays, int tag);
00370
00372
00373 vtkUnstructuredGrid *ExchangeMergeSubGrids(vtkIdList **cellIds, int deleteCellIds,
00374 vtkDataSet *myGrid, int deleteMyGrid,
00375 int filterOutDuplicateCells, int ghostCellFlag, int tag);
00376 vtkUnstructuredGrid *ExchangeMergeSubGrids(vtkIdList ***cellIds, int *numLists,
00377 int deleteCellIds,
00378 vtkDataSet *myGrid, int deleteMyGrid,
00379 int filterOutDuplicateCells, int ghostCellFlag, int tag);
00380 vtkUnstructuredGrid *ExchangeMergeSubGridsLean(
00381 vtkIdList ***cellIds, int *numLists,
00382 int deleteCellIds,
00383 vtkDataSet *myGrid, int deleteMyGrid,
00384 int filterOutDuplicateCells, int ghostCellFlag, int tag);
00385 vtkUnstructuredGrid *ExchangeMergeSubGridsFast(
00386 vtkIdList ***cellIds, int *numLists,
00387 int deleteCellIds,
00388 vtkDataSet *myGrid, int deleteMyGrid,
00389 int filterOutDuplicateCells, int ghostCellFlag, int tag);
00391
00392
00394
00395 char *MarshallDataSet(vtkUnstructuredGrid *extractedGrid, int &size);
00396 vtkUnstructuredGrid *UnMarshallDataSet(char *buf, int size);
00398
00400
00401 void ClipCellsToSpatialRegion(vtkUnstructuredGrid *grid);
00402 void ClipWithVtkClipDataSet(vtkUnstructuredGrid *grid, double *bounds,
00403 vtkUnstructuredGrid **outside, vtkUnstructuredGrid **inside);
00405
00406 void ClipWithBoxClipDataSet(vtkUnstructuredGrid *grid, double *bounds,
00407 vtkUnstructuredGrid **outside, vtkUnstructuredGrid **inside);
00408
00410
00414 vtkIdTypeArray *GetGlobalNodeIdArray(vtkDataSet *set);
00415 vtkIdType *GetGlobalNodeIds(vtkDataSet *set);
00416 vtkIdTypeArray *GetGlobalElementIdArray(vtkDataSet *set);
00417 vtkIdType *GetGlobalElementIds(vtkDataSet *set);
00418 int AssignGlobalNodeIds(vtkUnstructuredGrid *grid);
00419 int AssignGlobalElementIds(vtkDataSet *in);
00420 vtkIdTypeArray **FindGlobalPointIds(vtkFloatArray **ptarray,
00421 vtkIdTypeArray *ids, vtkUnstructuredGrid *grid, vtkIdType &numUniqueMissingPoints);
00423
00425
00426 vtkIdTypeArray **MakeProcessLists(vtkIdTypeArray **pointIds,
00427 vtkDistributedDataFilterSTLCloak *procs);
00429
00431
00432 vtkIdList **BuildRequestedGrids( vtkIdTypeArray **globalPtIds,
00433 vtkUnstructuredGrid *grid,
00434 vtkDistributedDataFilterSTLCloak *ptIdMap);
00436
00438
00439 int InMySpatialRegion(float x, float y, float z);
00440 int InMySpatialRegion(double x, double y, double z);
00441 int StrictlyInsideMyBounds(float x, float y, float z);
00442 int StrictlyInsideMyBounds(double x, double y, double z);
00444
00446
00447 vtkIdTypeArray **GetGhostPointIds(int ghostLevel, vtkUnstructuredGrid *grid,
00448 int AddCellsIAlreadyHave);
00449 vtkUnstructuredGrid *AddGhostCellsUniqueCellAssignment(
00450 vtkUnstructuredGrid *myGrid,
00451 vtkDistributedDataFilterSTLCloak *globalToLocalMap);
00452 vtkUnstructuredGrid *AddGhostCellsDuplicateCellAssignment(
00453 vtkUnstructuredGrid *myGrid,
00454 vtkDistributedDataFilterSTLCloak *globalToLocalMap);
00455 vtkUnstructuredGrid *SetMergeGhostGrid(
00456 vtkUnstructuredGrid *ghostCellGrid,
00457 vtkUnstructuredGrid *incomingGhostCells,
00458 int ghostLevel, vtkDistributedDataFilterSTLCloak *idMap);
00460
00462
00463 vtkUnstructuredGrid *ExtractCells(vtkIdList *list,
00464 int deleteCellLists, vtkDataSet *in, vtkModelMetadata *mmd);
00465 vtkUnstructuredGrid *ExtractCells(vtkIdList **lists, int nlists,
00466 int deleteCellLists, vtkDataSet *in, vtkModelMetadata *mmd);
00467 vtkUnstructuredGrid *ExtractZeroCellGrid(vtkDataSet *in,
00468 vtkModelMetadata *mmd);
00470
00472
00473 static int GlobalPointIdIsUsed(vtkUnstructuredGrid *grid,
00474 int ptId, vtkDistributedDataFilterSTLCloak *globalToLocal);
00475 static int LocalPointIdIsUsed(vtkUnstructuredGrid *grid, int ptId);
00476 static vtkIdType FindId(vtkIdTypeArray *ids, vtkIdType gid, vtkIdType startLoc);
00478
00480
00481 static vtkIdTypeArray *AddPointAndCells(vtkIdType gid,
00482 vtkIdType localId,
00483 vtkUnstructuredGrid *grid,
00484 vtkIdType *gidCells,
00485 vtkIdTypeArray *ids);
00487
00489
00490 static void AddConstantUnsignedCharPointArray(vtkUnstructuredGrid *grid,
00491 const char *arrayName, unsigned char val);
00492 static void AddConstantUnsignedCharCellArray(vtkUnstructuredGrid *grid,
00493 const char *arrayName, unsigned char val);
00495
00497
00498 static void RemoveRemoteCellsFromList(vtkIdList *cellList,
00499 vtkIdType *gidCells,
00500 vtkIdType *remoteCells,
00501 vtkIdType nRemoteCells);
00503
00505
00506 static vtkUnstructuredGrid *MergeGrids(vtkDataSet **sets, int nsets,
00507 int deleteDataSets,
00508 int useGlobalNodeIds, float pointMergeTolerance,
00509 int useGlobalCellIds);
00511
00513
00514 void AddMetadata(vtkUnstructuredGrid *grid, vtkModelMetadata *mmd);
00515 static int HasMetadata(vtkDataSet *s);
00517
00518 vtkPKdTree *Kdtree;
00519 vtkMultiProcessController *Controller;
00520
00521 int NumProcesses;
00522 int MyId;
00523
00524 int *Target;
00525 int *Source;
00526
00527 int NumConvexSubRegions;
00528 double *ConvexSubRegionBounds;
00529
00530 int GhostLevel;
00531
00532 int RetainKdtree;
00533 int IncludeAllIntersectingCells;
00534 int ClipCells;
00535 int AssignBoundaryCellsToOneRegion;
00536 int AssignBoundaryCellsToAllIntersectingRegions;
00537 int DivideBoundaryCells;
00538
00539 int Timing;
00540
00541 int NextProgressStep;
00542 double ProgressIncrement;
00543
00544 int UseMinimalMemory;
00545
00546 vtkBSPCuts* UserCuts;
00547
00548 vtkDistributedDataFilter(const vtkDistributedDataFilter&);
00549 void operator=(const vtkDistributedDataFilter&);
00550 };
00551 #endif