VTK
|
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