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 "vtkUnstructuredGridAlgorithm.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 class vtkUnstructuredGrid;
00108
00109 class VTK_PARALLEL_EXPORT vtkDistributedDataFilter: public vtkUnstructuredGridAlgorithm
00110 {
00111 vtkTypeRevisionMacro(vtkDistributedDataFilter,
00112 vtkUnstructuredGridAlgorithm);
00113
00114 public:
00115 void PrintSelf(ostream& os, vtkIndent indent);
00116
00117 static vtkDistributedDataFilter *New();
00118
00120
00121 void SetController(vtkMultiProcessController *c);
00122 vtkGetObjectMacro(Controller, vtkMultiProcessController);
00124
00133 vtkPKdTree *GetKdtree();
00134
00149 vtkBooleanMacro(RetainKdtree, int);
00150 vtkGetMacro(RetainKdtree, int);
00151 vtkSetMacro(RetainKdtree, int);
00152
00162 vtkBooleanMacro(IncludeAllIntersectingCells, int);
00163 vtkGetMacro(IncludeAllIntersectingCells, int);
00164 vtkSetMacro(IncludeAllIntersectingCells, int);
00165
00170 vtkBooleanMacro(ClipCells, int);
00171 vtkGetMacro(ClipCells, int);
00172 vtkSetMacro(ClipCells, int);
00173
00174
00175 enum BoundaryModes {
00176 ASSIGN_TO_ONE_REGION=0,
00177 ASSIGN_TO_ALL_INTERSECTING_REGIONS=1,
00178 SPLIT_BOUNDARY_CELLS=2
00179 };
00180
00181
00183
00184 void SetBoundaryMode(int mode);
00185 void SetBoundaryModeToAssignToOneRegion()
00186 { this->SetBoundaryMode(vtkDistributedDataFilter::ASSIGN_TO_ONE_REGION); }
00187 void SetBoundaryModeToAssignToAllIntersectingRegions()
00188 { this->SetBoundaryMode(
00189 vtkDistributedDataFilter::ASSIGN_TO_ALL_INTERSECTING_REGIONS);
00190 }
00191 void SetBoundaryModeToSplitBoundaryCells()
00192 { this->SetBoundaryMode(vtkDistributedDataFilter::SPLIT_BOUNDARY_CELLS); }
00193 int GetBoundaryMode();
00195
00197 virtual int RequestUpdateExtent(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00198
00206 vtkBooleanMacro(UseMinimalMemory, int);
00207 vtkGetMacro(UseMinimalMemory, int);
00208 vtkSetMacro(UseMinimalMemory, int);
00209
00210
00213 vtkBooleanMacro(Timing, int);
00214 vtkSetMacro(Timing, int);
00215 vtkGetMacro(Timing, int);
00216
00218
00223 vtkBSPCuts* GetCuts() {return this->UserCuts;}
00224 void SetCuts(vtkBSPCuts* cuts);
00226
00227 protected:
00228 vtkDistributedDataFilter();
00229 ~vtkDistributedDataFilter();
00230
00236 void AssignBoundaryCellsToOneRegionOn();
00237 void AssignBoundaryCellsToOneRegionOff();
00238 void SetAssignBoundaryCellsToOneRegion(int val);
00239
00247 void AssignBoundaryCellsToAllIntersectingRegionsOn();
00248 void AssignBoundaryCellsToAllIntersectingRegionsOff();
00249 void SetAssignBoundaryCellsToAllIntersectingRegions(int val);
00250
00257 void DivideBoundaryCellsOn();
00258 void DivideBoundaryCellsOff();
00259 void SetDivideBoundaryCells(int val);
00260
00265 virtual int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00266 void SingleProcessExecute(vtkDataSet *input, vtkUnstructuredGrid *output);
00267 virtual int RequestInformation(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00268 virtual int FillInputPortInformation(int port, vtkInformation *info);
00269
00270 private:
00271
00272
00273 enum{
00274 DeleteNo = 0,
00275 DeleteYes = 1
00276 };
00277
00278 enum{
00279 DuplicateCellsNo = 0,
00280 DuplicateCellsYes = 1
00281 };
00282
00283 enum{
00284 GhostCellsNo = 0,
00285 GhostCellsYes = 1
00286 };
00287
00288 enum{
00289 UnsetGhostLevel = 99
00290 };
00291
00292
00294 int PartitionDataAndAssignToProcesses(vtkDataSet *set);
00295
00297 vtkUnstructuredGrid *RedistributeDataSet(vtkDataSet *set, vtkDataSet *input);
00298
00300 int ClipGridCells(vtkUnstructuredGrid *grid);
00301
00303 vtkUnstructuredGrid * AcquireGhostCells(vtkUnstructuredGrid *grid);
00304
00306 void ComputeMyRegionBounds();
00307
00309 int CheckFieldArrayTypes(vtkDataSet *set);
00310
00313 vtkDataSet *TestFixTooFewInputFiles(vtkDataSet *input);
00314
00316 vtkUnstructuredGrid *MPIRedistribute(vtkDataSet *in, vtkDataSet *input);
00317
00319 vtkIdList **GetCellIdsForProcess(int proc, int *nlists);
00320
00323 void SetUpPairWiseExchange();
00324
00326
00327 void FreeIntArrays(vtkIdTypeArray **ar);
00328 static void FreeIdLists(vtkIdList**lists, int nlists);
00329 static vtkIdType GetIdListSize(vtkIdList**lists, int nlists);
00331
00333
00334 vtkIdTypeArray *ExchangeCounts(vtkIdType myCount, int tag);
00335 vtkIdTypeArray *ExchangeCountsLean(vtkIdType myCount, int tag);
00336 vtkIdTypeArray *ExchangeCountsFast(vtkIdType myCount, int tag);
00338
00340
00341 vtkIdTypeArray **ExchangeIdArrays(vtkIdTypeArray **arIn,
00342 int deleteSendArrays, int tag);
00343 vtkIdTypeArray **ExchangeIdArraysLean(vtkIdTypeArray **arIn,
00344 int deleteSendArrays, int tag);
00345 vtkIdTypeArray **ExchangeIdArraysFast(vtkIdTypeArray **arIn,
00346 int deleteSendArrays, int tag);
00348
00350
00351 vtkFloatArray **ExchangeFloatArrays(vtkFloatArray **myArray,
00352 int deleteSendArrays, int tag);
00353 vtkFloatArray **ExchangeFloatArraysLean(vtkFloatArray **myArray,
00354 int deleteSendArrays, int tag);
00355 vtkFloatArray **ExchangeFloatArraysFast(vtkFloatArray **myArray,
00356 int deleteSendArrays, int tag);
00358
00360
00361 vtkUnstructuredGrid *ExchangeMergeSubGrids(vtkIdList **cellIds, int deleteCellIds,
00362 vtkDataSet *myGrid, int deleteMyGrid,
00363 int filterOutDuplicateCells, int ghostCellFlag, int tag);
00364 vtkUnstructuredGrid *ExchangeMergeSubGrids(vtkIdList ***cellIds, int *numLists,
00365 int deleteCellIds,
00366 vtkDataSet *myGrid, int deleteMyGrid,
00367 int filterOutDuplicateCells, int ghostCellFlag, int tag);
00368 vtkUnstructuredGrid *ExchangeMergeSubGridsLean(
00369 vtkIdList ***cellIds, int *numLists,
00370 int deleteCellIds,
00371 vtkDataSet *myGrid, int deleteMyGrid,
00372 int filterOutDuplicateCells, int ghostCellFlag, int tag);
00373 vtkUnstructuredGrid *ExchangeMergeSubGridsFast(
00374 vtkIdList ***cellIds, int *numLists,
00375 int deleteCellIds,
00376 vtkDataSet *myGrid, int deleteMyGrid,
00377 int filterOutDuplicateCells, int ghostCellFlag, int tag);
00379
00380
00382
00383 char *MarshallDataSet(vtkUnstructuredGrid *extractedGrid, int &size);
00384 vtkUnstructuredGrid *UnMarshallDataSet(char *buf, int size);
00386
00388
00389 void ClipCellsToSpatialRegion(vtkUnstructuredGrid *grid);
00390 void ClipWithVtkClipDataSet(vtkUnstructuredGrid *grid, double *bounds,
00391 vtkUnstructuredGrid **outside, vtkUnstructuredGrid **inside);
00393
00394 void ClipWithBoxClipDataSet(vtkUnstructuredGrid *grid, double *bounds,
00395 vtkUnstructuredGrid **outside, vtkUnstructuredGrid **inside);
00396
00398
00402 vtkIdTypeArray *GetGlobalNodeIdArray(vtkDataSet *set);
00403 vtkIdType *GetGlobalNodeIds(vtkDataSet *set);
00404 vtkIdTypeArray *GetGlobalElementIdArray(vtkDataSet *set);
00405 vtkIdType *GetGlobalElementIds(vtkDataSet *set);
00406 int AssignGlobalNodeIds(vtkUnstructuredGrid *grid);
00407 int AssignGlobalElementIds(vtkDataSet *in);
00408 vtkIdTypeArray **FindGlobalPointIds(vtkFloatArray **ptarray,
00409 vtkIdTypeArray *ids, vtkUnstructuredGrid *grid, vtkIdType &numUniqueMissingPoints);
00411
00413
00414 vtkIdTypeArray **MakeProcessLists(vtkIdTypeArray **pointIds,
00415 vtkDistributedDataFilterSTLCloak *procs);
00417
00419
00420 vtkIdList **BuildRequestedGrids( vtkIdTypeArray **globalPtIds,
00421 vtkUnstructuredGrid *grid,
00422 vtkDistributedDataFilterSTLCloak *ptIdMap);
00424
00426
00427 int InMySpatialRegion(float x, float y, float z);
00428 int InMySpatialRegion(double x, double y, double z);
00429 int StrictlyInsideMyBounds(float x, float y, float z);
00430 int StrictlyInsideMyBounds(double x, double y, double z);
00432
00434
00435 vtkIdTypeArray **GetGhostPointIds(int ghostLevel, vtkUnstructuredGrid *grid,
00436 int AddCellsIAlreadyHave);
00437 vtkUnstructuredGrid *AddGhostCellsUniqueCellAssignment(
00438 vtkUnstructuredGrid *myGrid,
00439 vtkDistributedDataFilterSTLCloak *globalToLocalMap);
00440 vtkUnstructuredGrid *AddGhostCellsDuplicateCellAssignment(
00441 vtkUnstructuredGrid *myGrid,
00442 vtkDistributedDataFilterSTLCloak *globalToLocalMap);
00443 vtkUnstructuredGrid *SetMergeGhostGrid(
00444 vtkUnstructuredGrid *ghostCellGrid,
00445 vtkUnstructuredGrid *incomingGhostCells,
00446 int ghostLevel, vtkDistributedDataFilterSTLCloak *idMap);
00448
00450
00451 vtkUnstructuredGrid *ExtractCells(vtkIdList *list,
00452 int deleteCellLists, vtkDataSet *in, vtkModelMetadata *mmd);
00453 vtkUnstructuredGrid *ExtractCells(vtkIdList **lists, int nlists,
00454 int deleteCellLists, vtkDataSet *in, vtkModelMetadata *mmd);
00455 vtkUnstructuredGrid *ExtractZeroCellGrid(vtkDataSet *in,
00456 vtkModelMetadata *mmd);
00458
00460
00461 static int GlobalPointIdIsUsed(vtkUnstructuredGrid *grid,
00462 int ptId, vtkDistributedDataFilterSTLCloak *globalToLocal);
00463 static int LocalPointIdIsUsed(vtkUnstructuredGrid *grid, int ptId);
00464 static vtkIdType FindId(vtkIdTypeArray *ids, vtkIdType gid, vtkIdType startLoc);
00466
00468
00469 static vtkIdTypeArray *AddPointAndCells(vtkIdType gid,
00470 vtkIdType localId,
00471 vtkUnstructuredGrid *grid,
00472 vtkIdType *gidCells,
00473 vtkIdTypeArray *ids);
00475
00477
00478 static void AddConstantUnsignedCharPointArray(vtkUnstructuredGrid *grid,
00479 const char *arrayName, unsigned char val);
00480 static void AddConstantUnsignedCharCellArray(vtkUnstructuredGrid *grid,
00481 const char *arrayName, unsigned char val);
00483
00485
00486 static void RemoveRemoteCellsFromList(vtkIdList *cellList,
00487 vtkIdType *gidCells,
00488 vtkIdType *remoteCells,
00489 vtkIdType nRemoteCells);
00491
00493
00494 static vtkUnstructuredGrid *MergeGrids(vtkDataSet **sets, int nsets,
00495 int deleteDataSets,
00496 int useGlobalNodeIds, float pointMergeTolerance,
00497 int useGlobalCellIds);
00499
00501
00502 void AddMetadata(vtkUnstructuredGrid *grid, vtkModelMetadata *mmd);
00503 static int HasMetadata(vtkDataSet *s);
00505
00506 vtkPKdTree *Kdtree;
00507 vtkMultiProcessController *Controller;
00508
00509 int NumProcesses;
00510 int MyId;
00511
00512 int *Target;
00513 int *Source;
00514
00515 int NumConvexSubRegions;
00516 double *ConvexSubRegionBounds;
00517
00518 int GhostLevel;
00519
00520 int RetainKdtree;
00521 int IncludeAllIntersectingCells;
00522 int ClipCells;
00523 int AssignBoundaryCellsToOneRegion;
00524 int AssignBoundaryCellsToAllIntersectingRegions;
00525 int DivideBoundaryCells;
00526
00527 int Timing;
00528
00529 int NextProgressStep;
00530 double ProgressIncrement;
00531
00532 int UseMinimalMemory;
00533
00534 vtkBSPCuts* UserCuts;
00535
00536 vtkDistributedDataFilter(const vtkDistributedDataFilter&);
00537 void operator=(const vtkDistributedDataFilter&);
00538 };
00539 #endif