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{
33public:
38
43 vtkIdType GetNumElements() { return this->NumElements; }
44
49 vtkIdType GetNumProcessors() { return this->NumProcessors; }
50
56
62
68
74
80
81private:
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
103inline 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
122inline vtkIdType
124{
125 vtkIdType rank = this->GetProcessorOfElement(globalIndex);
126 return globalIndex - this->GetFirstGlobalIndexOnProcessor(rank);
127}
128
129// ----------------------------------------------------------------------
130
131inline 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
148inline vtkIdType
150{
151 return this->GetFirstGlobalIndexOnProcessor(rank) + localIndex;
152}
153
154#endif
155// VTK-HeaderTest-Exclude: vtkBlockDistribution.h
A helper class that manages a block distribution of N elements of data.
vtkIdType GetGlobalIndex(vtkIdType localIndex, vtkIdType rank)
Retrieve the global index associated with the given local index on the processor with the given rank.
vtkIdType GetNumElements()
Retrieves the number of elements for which this block distribution was built.
vtkIdType GetLocalIndexOfElement(vtkIdType globalIndex)
Retrieve the local index (offset) on the processor determined by GetProcessorOfElement that refers to...
vtkIdType GetProcessorOfElement(vtkIdType globalIndex)
Retrieve the process number in [0, GetNumProcessors()) where the element with the given global index ...
vtkIdType GetNumProcessors()
Retrieves the number of processors for which this block distribution was built.
vtkIdType GetFirstGlobalIndexOnProcessor(vtkIdType rank)
Retrieve the first global index stored on the processor with the given rank.
vtkBlockDistribution(vtkIdType N, vtkIdType P)
Create a block distribution with N elements on P processors.
vtkIdType GetBlockSize(vtkIdType rank)
Get the block size for the processor with the given rank.
int vtkIdType
Definition: vtkType.h:287