initial commit for version 1.6.x patch release
[OpenFOAM-1.6.x.git] / src / OpenFOAM / containers / Lists / Histogram / Histogram.C
blob915eda6921a97a25ffd61aaedd04d21d246e9a59
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 1991-2009 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM 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 2 of the License, or (at your
14     option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM; if not, write to the Free Software Foundation,
23     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 \*---------------------------------------------------------------------------*/
27 #include "Histogram.H"
28 #include "ListOps.H"
31 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
33 template<class List>
34 void Foam::Histogram<List>::count(const List& bins, const List& l)
36     if (bins.size() < 2)
37     {
38         FatalErrorIn("Histogram<List>::count(const List&, const List&)")
39             << "Should have at least two values in bins. Now:" << bins
40             << exit(FatalError);
41     }
43     counts_.setSize(bins.size()-1);
44     counts_ = 0;
46     nLow_ = 0;
47     nHigh_ = 0;
49     forAll(l, i)
50     {
51         label index = findLower(bins, l[i]);
53         if (index == -1)
54         {
55             nLow_++;
56         }
57         else if (index == bins.size()-1)
58         {
59             nHigh_++;
60         }
61         else
62         {
63             counts_[index]++;
64         }
65     }
69 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
71 template<class List>
72 Foam::Histogram<List>::Histogram(const List& bins, const List& l)
74     count(bins, l);
78 template<class List>
79 Foam::Histogram<List>::Histogram
81     const typename List::const_reference min,
82     const typename List::const_reference max,
83     const label nBins,
84     const List& l
87     List bins(nBins+1);
89     typename List::value_type span = (max-min) / nBins;
91     bins[0] = min;
93     for (label i = 1; i < nBins; i++)
94     {
95         bins[i] = bins[i-1] + span;
96     }
98     // Set max directly to avoid truncation errors.
99     bins[nBins] = max;
101     count(bins, l);
105 // ************************************************************************* //