VTK
|
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: $RCSfile: vtkDistributedDataFilter.h,v $ 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 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 //BTX 00174 enum BoundaryModes { 00175 ASSIGN_TO_ONE_REGION=0, 00176 ASSIGN_TO_ALL_INTERSECTING_REGIONS=1, 00177 SPLIT_BOUNDARY_CELLS=2 00178 }; 00179 //ETX 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 //BTX 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 //ETX 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&); // Not implemented 00549 void operator=(const vtkDistributedDataFilter&); // Not implemented 00550 }; 00551 #endif