MCPcopy Create free account
hub / github.com/Kitware/VTK / GetPartitioning

Method GetPartitioning

IO/NetCDF/vtkNetCDFCAMReader.cxx:1162–1242  ·  view source on GitHub ↗

------------------------------------------------------------------------------

Source from the content-addressed store, hash-verified

1160
1161//------------------------------------------------------------------------------
1162bool vtkNetCDFCAMReader::GetPartitioning(size_t piece, size_t numPieces, size_t numLevels,
1163 size_t numCellsPerLevel, size_t& beginLevel, size_t& endLevel, size_t& beginCell, size_t& endCell)
1164{
1165 // probably not the best way to partition the data but should
1166 // be sufficient for development.
1167 if (numPieces <= 0 || piece >= numPieces)
1168 {
1169 vtkErrorMacro("Bad piece information for partitioning.");
1170 return false;
1171 }
1172 int inputBeginLevel = 0;
1173 if ((this->VerticalDimension == VERTICAL_DIMENSION_MIDPOINT_LAYERS && this->SingleMidpointLayer))
1174 {
1175 inputBeginLevel = this->MidpointLayerIndex;
1176 }
1177 else if ((this->VerticalDimension == VERTICAL_DIMENSION_INTERFACE_LAYERS &&
1178 this->SingleInterfaceLayer))
1179 {
1180 inputBeginLevel = this->InterfaceLayerIndex;
1181 }
1182
1183 if (numPieces == 1)
1184 {
1185 beginLevel = inputBeginLevel;
1186 endLevel = beginLevel + numLevels - 1;
1187 beginCell = 0;
1188 endCell = numCellsPerLevel;
1189 return true;
1190 }
1191 if (numPieces <= (numLevels - 1))
1192 {
1193 // this cannot happen for numLevels == 1
1194 beginLevel = piece * (numLevels - 1) / numPieces;
1195 endLevel = (piece + 1) * (numLevels - 1) / numPieces;
1196 beginCell = 0;
1197 endCell = numCellsPerLevel;
1198 return true;
1199 }
1200
1201 int levelsPerPiece = vtkMath::Ceil(numLevels / static_cast<double>(numPieces));
1202 int piecesPerLevel = vtkMath::Ceil(numPieces / static_cast<double>(numLevels));
1203 size_t numOverworkedPieces = piecesPerLevel / levelsPerPiece * numLevels - numPieces;
1204 bool evenOverworked = (piecesPerLevel % 2 == 0 || numOverworkedPieces == 0);
1205 if (piece < numOverworkedPieces)
1206 {
1207 if (evenOverworked)
1208 {
1209 beginLevel = inputBeginLevel + 2 * piece / piecesPerLevel;
1210 size_t remainder = piece % (piecesPerLevel / 2);
1211 beginCell = remainder * numCellsPerLevel * 2 / piecesPerLevel;
1212 endCell = (remainder + 1) * numCellsPerLevel * 2 / piecesPerLevel;
1213 }
1214 else
1215 {
1216 beginLevel = inputBeginLevel + 2 * piece / (piecesPerLevel - 1);
1217 size_t remainder = piece % ((piecesPerLevel - 1) / 2);
1218 beginCell = remainder * numCellsPerLevel * 2 / piecesPerLevel;
1219 endCell = (remainder + 1) * numCellsPerLevel * 2 / piecesPerLevel;

Callers 1

RequestDataMethod · 0.95

Calls

no outgoing calls

Tested by

no test coverage detected