/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | foam-extend: Open Source CFD \\ / O peration | Version: 3.2 \\ / A nd | Web: http://www.foam-extend.org \\/ M anipulation | For copyright notice see file Copyright ------------------------------------------------------------------------------- License This file is part of foam-extend. foam-extend is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. foam-extend is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with foam-extend. If not, see . InClass domainDecomposition Description Private member of domainDecomposition. Decomposes the mesh into bits \*---------------------------------------------------------------------------*/ #include "domainDecomposition.H" #include "IOstreams.H" #include "SLPtrList.H" #include "boolList.H" #include "cellList.H" #include "primitiveMesh.H" #include "cyclicPolyPatch.H" // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // void domainDecomposition::decomposeMesh(const bool filterEmptyPatches) { // Decide which cell goes to which processor distributeCells(); // Distribute the cells according to the given processor label // calculate the addressing information for the original mesh Info<< "\nCalculating original mesh data" << endl; // set references to the original mesh const polyBoundaryMesh& patches = boundaryMesh(); // Access all faces to grab the zones const faceList& fcs = allFaces(); const labelList& owner = faceOwner(); const labelList& neighbour = faceNeighbour(); // loop through the list of processor labels for the cell and add the // cell shape to the list of cells for the appropriate processor Info<< "\nDistributing cells to processors" << endl; // Memory management { List > procCellList(nProcs_); forAll (cellToProc_, celli) { if (cellToProc_[celli] >= nProcs_) { FatalErrorIn("domainDecomposition::decomposeMesh()") << "Impossible processor label " << cellToProc_[celli] << "for cell " << celli << abort(FatalError); } else { procCellList[cellToProc_[celli]].append(celli); } } // Convert linked lists into normal lists forAll (procCellList, procI) { procCellAddressing_[procI] = procCellList[procI]; } } Info << "\nDistributing faces to processors" << endl; // Loop through internal faces and decide which processor they belong to // First visit all internal faces. If cells at both sides belong to the // same processor, the face is an internal face. If they are different, // it belongs to both processors. // Memory management { List > procFaceList(nProcs_); forAll (neighbour, facei) { if (cellToProc_[owner[facei]] == cellToProc_[neighbour[facei]]) { // Face internal to processor procFaceList[cellToProc_[owner[facei]]].append(facei); } } // Record number of internal faces on each processor forAll (procFaceList, procI) { nInternalProcFaces_[procI] = procFaceList[procI].size(); } // Detect inter-processor boundaries // Neighbour processor for each subdomain List > interProcBoundaries(nProcs_); // Face labels belonging to each inter-processor boundary List > > interProcBFaces(nProcs_); List > procPatchIndex(nProcs_); forAll (neighbour, facei) { if (cellToProc_[owner[facei]] != cellToProc_[neighbour[facei]]) { // inter - processor patch face found. Go through the list of // inside boundaries for the owner processor and try to find // this inter-processor patch. label ownerProc = cellToProc_[owner[facei]]; label neighbourProc = cellToProc_[neighbour[facei]]; SLList