BUGFIX: Seg-fault in multiphaseInterFoam. Author: Henrik Rusche. Merge: Hrvoje Jasak
[foam-extend-3.2.git] / src / lduSolvers / crMatrix / crAddressing.C
blobf457a9b9bf61ca47aceefb2e3ec3a043677c7db5
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation, either version 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 Class
25     crAddressing
27 Description
28     Compressed row addressing class
30 Author
31     Hrvoje Jasak, Wikki Ltd.  All rights reserved
33 \*---------------------------------------------------------------------------*/
35 #include "crAddressing.H"
37 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
39 void Foam::crAddressing::setRowCount(const labelList& count)
41     if (count.size() != nRows_)
42     {
43         FatalErrorIn("void crAddressing::setRowCount(const labelList& count)")
44             << "Incorrect size of count: nRows =" << nRows_
45             << " count = " << count.size()
46             << abort(FatalError);
48     }
50     // Accumulate count
51     row_[0] = 0;
53     forAll (count, i)
54     {
55         row_[i + 1] = row_[i] + count[i];
56     }
58     // Resize and clear column array
59     col_.setSize(row_[nRows_]);
60     col_ = 0;
64 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
66 // Construct from given size
67 Foam::crAddressing::crAddressing
69     const label nRows,
70     const label nCols,
71     const labelList& count
74     refCount(),
75     nRows_(nRows),
76     nCols_(nCols),
77     row_(nRows + 1),
78     col_(0)
80     setRowCount(count);
84 // Construct from components
85 Foam::crAddressing::crAddressing
87     const label nRows,
88     const label nCols,
89     const labelList& row,
90     const labelList& col
93     refCount(),
94     nRows_(nRows),
95     nCols_(nCols),
96     row_(row),
97     col_(col)
101 // Construct as copy
102 Foam::crAddressing::crAddressing(const crAddressing& a)
104     refCount(),
105     nRows_(a.nRows_),
106     nCols_(a.nCols_),
107     row_(a.row_),
108     col_(a.col_)
112 // Construct from Istream
113 Foam::crAddressing::crAddressing(Istream& is)
115     refCount(),
116     nRows_(readLabel(is)),
117     nCols_(readLabel(is)),
118     row_(is),
119     col_(is)
123 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
125 Foam::tmp<Foam::crAddressing> Foam::crAddressing::T() const
127     const labelList& myRow = row();
128     const labelList& myCol = col();
130     labelList trCount(nCols(), 0);
132     // Count number of entries in a row
133     for (label i = 0; i < nRows(); i++)
134     {
135         for (label ip = myRow[i]; ip < myRow[i + 1]; ip++)
136         {
137             trCount[myCol[ip]]++;
138         }
139     }
141     // Create transpose addressing
142     tmp<crAddressing> ttranspose(new crAddressing(nCols(), nRows(), trCount));
143     crAddressing& transpose = ttranspose();
145     // Set coefficients
146     const labelList& trRow = transpose.row();
147     labelList& trCol = transpose.col();
148     trCol = 0;
150     // Reset count to use as counter
151     trCount = 0;
153     label j;
155     for (label i = 0; i < nRows(); i++)
156     {
157         for (label ip = myRow[i]; ip < myRow[i + 1]; ip++)
158         {
159             j = myCol[ip];
161             trCol[trRow[j] + trCount[j]] = i;
163             trCount[j]++;
164         }
165     }
167     return ttranspose;
171 // * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
173 void Foam::crAddressing::operator=(const crAddressing& rhs)
175     // Check for assignment to self
176     if (this == &rhs)
177     {
178         FatalErrorIn
179         (
180             "Foam::crAddressing::operator=(const Foam::crAddressing&)"
181         )   << "Attempted assignment to self"
182             << abort(FatalError);
183     }
185     nRows_ = rhs.nRows_;
186     nCols_ = rhs.nCols_;
187     row_ = rhs.row_;
188     col_ = rhs.col_;
192 // * * * * * * * * * * * * * * * Friend Operators  * * * * * * * * * * * * * //
194 Foam::Ostream& Foam::operator<<(Ostream& os, const crAddressing& a)
196     os  << a.nRows_ << tab << a.nCols_ << nl
197         << a.row_ << nl
198         << a.col_ << endl;
200     return os;
204 // ************************************************************************* //