------------------------------------------------------------------------------
| 1160 | |
| 1161 | //------------------------------------------------------------------------------ |
| 1162 | bool 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; |