VTK
vtkBlockDistribution.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkBlockDistribution.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
15 /*
16  * Copyright (C) 2008 The Trustees of Indiana University.
17  * Use, modification and distribution is subject to the Boost Software
18  * License, Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt)
19  */
28 #ifndef vtkBlockDistribution_h
29 #define vtkBlockDistribution_h
30 
32 {
33 public:
38 
43  vtkIdType GetNumElements() { return this->NumElements; }
44 
49  vtkIdType GetNumProcessors() { return this->NumProcessors; }
50 
56 
62 
68 
74 
79  vtkIdType GetGlobalIndex(vtkIdType localIndex, vtkIdType rank);
80 
81 private:
82  vtkIdType NumElements;
83  vtkIdType NumProcessors;
84 };
85 
86 // ----------------------------------------------------------------------
87 
89  : NumElements(N), NumProcessors(P)
90 {
91 }
92 
93 // ----------------------------------------------------------------------
94 
96 {
97  return (this->NumElements / this->NumProcessors)
98  + (rank < this->NumElements % this->NumProcessors? 1 : 0);
99 }
100 
101 // ----------------------------------------------------------------------
102 
103 inline vtkIdType
105 {
106  vtkIdType smallBlockSize = this->NumElements / this->NumProcessors;
107  vtkIdType cutoffProcessor = this->NumElements % this->NumProcessors;
108  vtkIdType cutoffIndex = cutoffProcessor * (smallBlockSize + 1);
109 
110  if (globalIndex < cutoffIndex)
111  {
112  return globalIndex / (smallBlockSize + 1);
113  }
114  else
115  {
116  return cutoffProcessor + (globalIndex - cutoffIndex) / smallBlockSize;
117  }
118 }
119 
120 // ----------------------------------------------------------------------
121 
122 inline vtkIdType
124 {
125  vtkIdType rank = this->GetProcessorOfElement(globalIndex);
126  return globalIndex - this->GetFirstGlobalIndexOnProcessor(rank);
127 }
128 
129 // ----------------------------------------------------------------------
130 
131 inline vtkIdType
133 {
134  vtkIdType estimate = rank * (this->NumElements / this->NumProcessors + 1);
135  vtkIdType cutoffProcessor = this->NumElements % this->NumProcessors;
136  if (rank < cutoffProcessor)
137  {
138  return estimate;
139  }
140  else
141  {
142  return estimate - (rank - cutoffProcessor);
143  }
144 }
145 
146 // ----------------------------------------------------------------------
147 
148 inline vtkIdType
150 {
151  return this->GetFirstGlobalIndexOnProcessor(rank) + localIndex;
152 }
153 
154 #endif
155 // VTK-HeaderTest-Exclude: vtkBlockDistribution.h
vtkIdType
int vtkIdType
Definition: vtkType.h:347
vtkBlockDistribution::GetProcessorOfElement
vtkIdType GetProcessorOfElement(vtkIdType globalIndex)
Retrieve the process number in [0, GetNumProcessors()) where the element with the given global index ...
Definition: vtkBlockDistribution.h:104
vtkBlockDistribution::vtkBlockDistribution
vtkBlockDistribution(vtkIdType N, vtkIdType P)
Create a block distribution with N elements on P processors.
Definition: vtkBlockDistribution.h:88
vtkBlockDistribution::GetLocalIndexOfElement
vtkIdType GetLocalIndexOfElement(vtkIdType globalIndex)
Retrieve the local index (offset) on the processor determined by GetProcessorOfElement that refers to...
Definition: vtkBlockDistribution.h:123
vtkBlockDistribution
A helper class that manages a block distribution of N elements of data.
Definition: vtkBlockDistribution.h:31
vtkBlockDistribution::GetBlockSize
vtkIdType GetBlockSize(vtkIdType rank)
Get the block size for the processor with the given rank.
Definition: vtkBlockDistribution.h:95
vtkBlockDistribution::GetNumProcessors
vtkIdType GetNumProcessors()
Retrieves the number of processors for which this block distribution was built.
Definition: vtkBlockDistribution.h:49
vtkBlockDistribution::GetFirstGlobalIndexOnProcessor
vtkIdType GetFirstGlobalIndexOnProcessor(vtkIdType rank)
Retrieve the first global index stored on the processor with the given rank.
Definition: vtkBlockDistribution.h:132
vtkBlockDistribution::GetNumElements
vtkIdType GetNumElements()
Retrieves the number of elements for which this block distribution was built.
Definition: vtkBlockDistribution.h:43
vtkBlockDistribution::GetGlobalIndex
vtkIdType GetGlobalIndex(vtkIdType localIndex, vtkIdType rank)
Retrieve the global index associated with the given local index on the processor with the given rank.
Definition: vtkBlockDistribution.h:149