00001 /*---------------------------------------------------------------------------*\ 00002 ========= | 00003 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox 00004 \\ / O peration | 00005 \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. 00006 \\/ M anipulation | 00007 ------------------------------------------------------------------------------- 00008 License 00009 This file is part of OpenFOAM. 00010 00011 OpenFOAM is free software: you can redistribute it and/or modify it 00012 under the terms of the GNU General Public License as published by 00013 the Free Software Foundation, either version 3 of the License, or 00014 (at your option) any later version. 00015 00016 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT 00017 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 00018 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 00019 for more details. 00020 00021 You should have received a copy of the GNU General Public License 00022 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. 00023 00024 Description 00025 The function renumbers the addressing such that the band of the 00026 matrix is reduced. The algorithm uses a simple search through the 00027 neighbour list 00028 00029 00030 \*---------------------------------------------------------------------------*/ 00031 00032 #include "bandCompression.H" 00033 #include <OpenFOAM/SLList.H> 00034 00035 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 00036 00037 // Constructor from components 00038 Foam::labelList Foam::bandCompression(const labelListList& cellCellAddressing) 00039 { 00040 labelList newOrder(cellCellAddressing.size()); 00041 00042 // the business bit of the renumbering 00043 SLList<label> nextCell; 00044 00045 labelList visited(cellCellAddressing.size()); 00046 00047 label currentCell; 00048 label cellInOrder = 0; 00049 00050 // reset the visited cells list 00051 forAll (visited, cellI) 00052 { 00053 visited[cellI] = 0; 00054 } 00055 00056 // loop over the cells 00057 forAll (visited, cellI) 00058 { 00059 // find the first cell that has not been visited yet 00060 if (visited[cellI] == 0) 00061 { 00062 currentCell = cellI; 00063 00064 // use this cell as a start 00065 nextCell.append(currentCell); 00066 00067 // loop through the nextCell list. Add the first cell into the 00068 // cell order if it has not already been visited and ask for its 00069 // neighbours. If the neighbour in question has not been visited, 00070 // add it to the end of the nextCell list 00071 00072 while (nextCell.size()) 00073 { 00074 currentCell = nextCell.removeHead(); 00075 00076 if (visited[currentCell] == 0) 00077 { 00078 visited[currentCell] = 1; 00079 00080 // add into cellOrder 00081 newOrder[cellInOrder] = currentCell; 00082 cellInOrder++; 00083 00084 // find if the neighbours have been visited 00085 const labelList& neighbours = 00086 cellCellAddressing[currentCell]; 00087 00088 forAll (neighbours, nI) 00089 { 00090 if (visited[neighbours[nI]] == 0) 00091 { 00092 // not visited, add to the list 00093 nextCell.append(neighbours[nI]); 00094 } 00095 } 00096 } 00097 } 00098 } 00099 } 00100 00101 return newOrder; 00102 } 00103 00104 00105 // ************************ vim: set sw=4 sts=4 et: ************************ //