00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00061 #ifndef __vtkDistributedDataFilter_h
00062 #define __vtkDistributedDataFilter_h
00063
00064 #include "vtkUnstructuredGridAlgorithm.h"
00065
00066 class vtkUnstructuredGrid;
00067 class vtkPKdTree;
00068 class vtkMultiProcessController;
00069 class vtkDataArray;
00070 class vtkIntArray;
00071 class vtkFloatArray;
00072 class vtkIdList;
00073 class vtkUnstructuredGrid;
00074 class vtkModelMetadata;
00075 class vtkDistributedDataFilterSTLCloak;
00076
00077 class VTK_PARALLEL_EXPORT vtkDistributedDataFilter: public vtkUnstructuredGridAlgorithm
00078 {
00079 vtkTypeRevisionMacro(vtkDistributedDataFilter,
00080 vtkUnstructuredGridAlgorithm);
00081
00082 public:
00083 void PrintSelf(ostream& os, vtkIndent indent);
00084
00085 static vtkDistributedDataFilter *New();
00086
00088
00089 void SetController(vtkMultiProcessController *c);
00090 vtkGetObjectMacro(Controller, vtkMultiProcessController);
00092
00109 vtkSetStringMacro(GlobalNodeIdArrayName);
00110
00117 vtkSetStringMacro(GlobalElementIdArrayName);
00118
00133 vtkBooleanMacro(RetainKdtree, int);
00134 vtkGetMacro(RetainKdtree, int);
00135 vtkSetMacro(RetainKdtree, int);
00136
00142 vtkPKdTree *GetKdtree();
00143
00153 vtkBooleanMacro(IncludeAllIntersectingCells, int);
00154 vtkGetMacro(IncludeAllIntersectingCells, int);
00155 vtkSetMacro(IncludeAllIntersectingCells, int);
00156
00161 vtkBooleanMacro(ClipCells, int);
00162 vtkGetMacro(ClipCells, int);
00163 vtkSetMacro(ClipCells, int);
00164
00165
00166 enum BoundaryModes {
00167 ASSIGN_TO_ONE_REGION=0,
00168 ASSIGN_TO_ALL_INTERSECTING_REGIONS=1,
00169 SPLIT_BOUNDARY_CELLS=2
00170 };
00171
00172
00174
00175 void SetBoundaryMode(int mode);
00176 void SetBoundaryModeToAssignToOneRegion()
00177 { this->SetBoundaryMode(vtkDistributedDataFilter::ASSIGN_TO_ONE_REGION); }
00178 void SetBoundaryModeToAssignToAllIntersectingRegions()
00179 { this->SetBoundaryMode(
00180 vtkDistributedDataFilter::ASSIGN_TO_ALL_INTERSECTING_REGIONS);
00181 }
00182 void SetBoundaryModeToSplitBoundaryCells()
00183 { this->SetBoundaryMode(vtkDistributedDataFilter::SPLIT_BOUNDARY_CELLS); }
00184 int GetBoundaryMode();
00186
00188 virtual int RequestUpdateExtent(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00189
00197 vtkBooleanMacro(UseMinimalMemory, int);
00198 vtkGetMacro(UseMinimalMemory, int);
00199 vtkSetMacro(UseMinimalMemory, int);
00200
00201
00204 vtkBooleanMacro(Timing, int);
00205 vtkSetMacro(Timing, int);
00206 vtkGetMacro(Timing, int);
00207
00209 unsigned long GetMTime();
00210
00211 protected:
00212 vtkDistributedDataFilter();
00213 ~vtkDistributedDataFilter();
00214
00220 void AssignBoundaryCellsToOneRegionOn();
00221 void AssignBoundaryCellsToOneRegionOff();
00222 void SetAssignBoundaryCellsToOneRegion(int val);
00223
00231 void AssignBoundaryCellsToAllIntersectingRegionsOn();
00232 void AssignBoundaryCellsToAllIntersectingRegionsOff();
00233 void SetAssignBoundaryCellsToAllIntersectingRegions(int val);
00234
00241 void DivideBoundaryCellsOn();
00242 void DivideBoundaryCellsOff();
00243 void SetDivideBoundaryCells(int val);
00244
00249 virtual int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00250 void SingleProcessExecute(vtkDataSet *input, vtkUnstructuredGrid *output);
00251 virtual int RequestInformation(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00252 virtual int FillInputPortInformation(int port, vtkInformation *info);
00253
00254 private:
00255
00256
00257 enum{
00258 DeleteNo = 0,
00259 DeleteYes = 1
00260 };
00261
00262 enum{
00263 DuplicateCellsNo = 0,
00264 DuplicateCellsYes = 1
00265 };
00266
00267 enum{
00268 GhostCellsNo = 0,
00269 GhostCellsYes = 1
00270 };
00271
00272 enum{
00273 UnsetGhostLevel = 99
00274 };
00275
00276 int PartitionDataAndAssignToProcesses(vtkDataSet *set);
00277 vtkUnstructuredGrid *RedistributeDataSet(vtkDataSet *set, vtkDataSet *input);
00278 int ClipGridCells(vtkUnstructuredGrid *grid);
00279 vtkUnstructuredGrid * AcquireGhostCells(vtkUnstructuredGrid *grid);
00280
00281 void ComputeMyRegionBounds();
00282
00283 int CheckFieldArrayTypes(vtkDataSet *set);
00284
00285 vtkDataSet *TestFixTooFewInputFiles(vtkDataSet *input);
00286
00287 vtkUnstructuredGrid *MPIRedistribute(vtkDataSet *in, vtkDataSet *input);
00288
00289 vtkIdList **GetCellIdsForProcess(int proc, int *nlists);
00290
00291 void SetUpPairWiseExchange();
00292 void FreeIntArrays(vtkIntArray **ar);
00293 vtkIntArray *ExchangeCounts(int myCount, int tag);
00294 vtkIntArray **ExchangeIntArrays(vtkIntArray **arIn,
00295 int deleteSendArrays, int tag);
00296 vtkFloatArray **ExchangeFloatArrays(vtkFloatArray **myArray,
00297 int deleteSendArrays, int tag);
00298 vtkUnstructuredGrid *ExchangeMergeSubGrids(vtkIdList **cellIds, int deleteCellIds,
00299 vtkDataSet *myGrid, int deleteMyGrid,
00300 int filterOutDuplicateCells, int ghostCellFlag, int tag);
00301 vtkUnstructuredGrid *ExchangeMergeSubGrids(vtkIdList ***cellIds, int *numLists,
00302 int deleteCellIds,
00303 vtkDataSet *myGrid, int deleteMyGrid,
00304 int filterOutDuplicateCells, int ghostCellFlag, int tag);
00305 vtkIntArray *ExchangeCountsLean(int myCount, int tag);
00306 vtkIntArray **ExchangeIntArraysLean(vtkIntArray **arIn,
00307 int deleteSendArrays, int tag);
00308 vtkFloatArray **ExchangeFloatArraysLean(vtkFloatArray **myArray,
00309 int deleteSendArrays, int tag);
00310 vtkUnstructuredGrid *ExchangeMergeSubGridsLean(
00311 vtkIdList ***cellIds, int *numLists,
00312 int deleteCellIds,
00313 vtkDataSet *myGrid, int deleteMyGrid,
00314 int filterOutDuplicateCells, int ghostCellFlag, int tag);
00315 vtkIntArray *ExchangeCountsFast(int myCount, int tag);
00316 vtkIntArray **ExchangeIntArraysFast(vtkIntArray **arIn,
00317 int deleteSendArrays, int tag);
00318 vtkFloatArray **ExchangeFloatArraysFast(vtkFloatArray **myArray,
00319 int deleteSendArrays, int tag);
00320 vtkUnstructuredGrid *ExchangeMergeSubGridsFast(
00321 vtkIdList ***cellIds, int *numLists,
00322 int deleteCellIds,
00323 vtkDataSet *myGrid, int deleteMyGrid,
00324 int filterOutDuplicateCells, int ghostCellFlag, int tag);
00325
00326
00327 char *MarshallDataSet(vtkUnstructuredGrid *extractedGrid, int &size);
00328 vtkUnstructuredGrid *UnMarshallDataSet(char *buf, int size);
00329
00330 void ClipCellsToSpatialRegion(vtkUnstructuredGrid *grid);
00331
00332 void ClipWithVtkClipDataSet(vtkUnstructuredGrid *grid, double *bounds,
00333 vtkUnstructuredGrid **outside, vtkUnstructuredGrid **inside);
00334 void ClipWithBoxClipDataSet(vtkUnstructuredGrid *grid, double *bounds,
00335 vtkUnstructuredGrid **outside, vtkUnstructuredGrid **inside);
00336
00337 const char *GetGlobalNodeIdArrayName(vtkDataSet *set);
00338 int *GetGlobalNodeIds(vtkDataSet *set);
00339
00340 const char *GetGlobalElementIdArrayName(vtkDataSet *set);
00341 int *GetGlobalElementIds(vtkDataSet *set);
00342
00343 int AssignGlobalNodeIds(vtkUnstructuredGrid *grid);
00344 int AssignGlobalElementIds(vtkDataSet *in);
00345
00346 vtkIntArray **FindGlobalPointIds(vtkFloatArray **ptarray,
00347 vtkIntArray *ids, vtkUnstructuredGrid *grid, int &numUniqueMissingPoints);
00348
00349 int InMySpatialRegion(float x, float y, float z);
00350 int InMySpatialRegion(double x, double y, double z);
00351 int StrictlyInsideMyBounds(float x, float y, float z);
00352 int StrictlyInsideMyBounds(double x, double y, double z);
00353
00354 vtkIntArray **GetGhostPointIds(int ghostLevel, vtkUnstructuredGrid *grid,
00355 int AddCellsIAlreadyHave);
00356 vtkIntArray **MakeProcessLists(vtkIntArray **pointIds,
00357 vtkDistributedDataFilterSTLCloak *procs);
00358 vtkUnstructuredGrid *AddGhostCellsUniqueCellAssignment(
00359 vtkUnstructuredGrid *myGrid,
00360 vtkDistributedDataFilterSTLCloak *globalToLocalMap);
00361 vtkUnstructuredGrid *AddGhostCellsDuplicateCellAssignment(
00362 vtkUnstructuredGrid *myGrid,
00363 vtkDistributedDataFilterSTLCloak *globalToLocalMap);
00364 vtkIdList **BuildRequestedGrids( vtkIntArray **globalPtIds,
00365 vtkUnstructuredGrid *grid,
00366 vtkDistributedDataFilterSTLCloak *ptIdMap);
00367 vtkUnstructuredGrid *SetMergeGhostGrid(
00368 vtkUnstructuredGrid *ghostCellGrid,
00369 vtkUnstructuredGrid *incomingGhostCells,
00370 int ghostLevel, vtkDistributedDataFilterSTLCloak *idMap);
00371
00372 vtkUnstructuredGrid *ExtractCells(vtkIdList *list,
00373 int deleteCellLists, vtkDataSet *in, vtkModelMetadata *mmd);
00374 vtkUnstructuredGrid *ExtractCells(vtkIdList **lists, int nlists,
00375 int deleteCellLists, vtkDataSet *in, vtkModelMetadata *mmd);
00376 vtkUnstructuredGrid *ExtractZeroCellGrid(vtkDataSet *in,
00377 vtkModelMetadata *mmd);
00378
00379 void AddMetadata(vtkUnstructuredGrid *grid, vtkModelMetadata *mmd);
00380
00381 static int GlobalPointIdIsUsed(vtkUnstructuredGrid *grid,
00382 int ptId, vtkDistributedDataFilterSTLCloak *globalToLocal);
00383
00384 static int LocalPointIdIsUsed(vtkUnstructuredGrid *grid, int ptId);
00385 static int FindId(vtkIntArray *ids, int gid, int startLoc);
00386 static vtkIntArray *AddPointAndCells(int gid, int localId,
00387 vtkUnstructuredGrid *grid, int *gidCells, vtkIntArray *ids);
00388
00389 static void AddConstantUnsignedCharPointArray(vtkUnstructuredGrid *grid,
00390 const char *arrayName, unsigned char val);
00391 static void AddConstantUnsignedCharCellArray(vtkUnstructuredGrid *grid,
00392 const char *arrayName, unsigned char val);
00393 static void RemoveRemoteCellsFromList(vtkIdList *cellList, int *gidCells,
00394 int *remoteCells, int nRemoteCells);
00395 static vtkUnstructuredGrid *MergeGrids(vtkDataSet **sets, int nsets,
00396 int deleteDataSets,
00397 const char *globalNodeIdArrayName, float pointMergeTolerance,
00398 const char *globalCellIdArrayName);
00399
00400 static void FreeIdLists(vtkIdList**lists, int nlists);
00401 static vtkIdType GetIdListSize(vtkIdList**lists, int nlists);
00402 static int HasMetadata(vtkDataSet *s);
00403
00404 vtkPKdTree *Kdtree;
00405 vtkMultiProcessController *Controller;
00406
00407 int NumProcesses;
00408 int MyId;
00409
00410 int *Target;
00411 int *Source;
00412
00413 int NumConvexSubRegions;
00414 double *ConvexSubRegionBounds;
00415
00416 int GhostLevel;
00417
00418 char *GlobalElementIdArrayName;
00419 char *GlobalNodeIdArrayName;
00420
00421 int RetainKdtree;
00422 int IncludeAllIntersectingCells;
00423 int ClipCells;
00424 int AssignBoundaryCellsToOneRegion;
00425 int AssignBoundaryCellsToAllIntersectingRegions;
00426 int DivideBoundaryCells;
00427
00428 int Timing;
00429
00430 int NextProgressStep;
00431 double ProgressIncrement;
00432
00433 int UseMinimalMemory;
00434
00435 vtkDistributedDataFilter(const vtkDistributedDataFilter&);
00436 void operator=(const vtkDistributedDataFilter&);
00437 };
00438 #endif