Foam::labelList Foam::manualDecomp::decompose ( const pointField& points, const scalarField& pointWeights ) { const polyMesh& mesh = *meshPtr_; labelIOList finalDecomp ( IOobject ( decompDataFile_, mesh.facesInstance(), mesh, IOobject::MUST_READ, IOobject::AUTO_WRITE, false ) ); // check if the final decomposition is OK if (finalDecomp.size() != points.size()) { FatalErrorIn ( "manualDecomp::decompose(const pointField&, const scalarField&)" ) << "Size of decomposition list does not correspond " << "to the number of points. Size: " << finalDecomp.size() << " Number of points: " << points.size() << ".\n" << "Manual decomposition data read from file " << decompDataFile_ << "." << endl << exit(FatalError); } if (min(finalDecomp) < 0 || max(finalDecomp) > nProcessors_ - 1) { FatalErrorIn ( "manualDecomp::decompose(const pointField&, const scalarField&)" ) << "According to the decomposition, cells assigned to " << "impossible processor numbers. Min processor = " << min(finalDecomp) << " Max processor = " << max(finalDecomp) << ".\n" << "Manual decomposition data read from file " << decompDataFile_ << "." << endl << exit(FatalError); } return finalDecomp; }
Foam::labelList Foam::simpleGeomDecomp::decompose(const pointField& points) { // construct a list for the final result labelList finalDecomp(points.size()); labelList processorGroups(points.size()); labelList pointIndices(points.size()); forAll(pointIndices, i) { pointIndices[i] = i; } pointField rotatedPoints = rotDelta_ & points; // and one to take the processor group id's. For each direction. // we assign the processors to groups of processors labelled // 0..nX to give a banded structure on the mesh. Then we // construct the actual processor number by treating this as // the units part of the processor number. sort ( pointIndices, UList<scalar>::less(rotatedPoints.component(vector::X)) ); assignToProcessorGroup(processorGroups, n_.x()); forAll(points, i) { finalDecomp[pointIndices[i]] = processorGroups[i]; } // now do the same thing in the Y direction. These processor group // numbers add multiples of nX to the proc. number (columns) sort ( pointIndices, UList<scalar>::less(rotatedPoints.component(vector::Y)) ); assignToProcessorGroup(processorGroups, n_.y()); forAll(points, i) { finalDecomp[pointIndices[i]] += n_.x()*processorGroups[i]; }