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 \*---------------------------------------------------------------------------*/ 00025 00026 #include "scalarRanges.H" 00027 #include <OpenFOAM/DynamicList.H> 00028 #include <OpenFOAM/ListOps.H> 00029 00030 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // 00031 00032 Foam::scalarRanges::scalarRanges() 00033 : 00034 List<scalarRange>(0) 00035 {} 00036 00037 00038 Foam::scalarRanges::scalarRanges(Istream& is) 00039 : 00040 List<scalarRange>(0) 00041 { 00042 DynamicList<scalarRange> lst; 00043 00044 while (is.good()) 00045 { 00046 scalarRange sr(is); 00047 if (sr.isDefined()) 00048 { 00049 lst.append(sr); 00050 } 00051 } 00052 00053 transfer(lst); 00054 } 00055 00056 00057 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // 00058 00059 bool Foam::scalarRanges::selected(const scalar& value) const 00060 { 00061 forAll(*this, i) 00062 { 00063 if (operator[](i).selected(value)) 00064 { 00065 return true; 00066 } 00067 } 00068 00069 return false; 00070 } 00071 00072 00073 Foam::List<bool> Foam::scalarRanges::selected 00074 ( 00075 const List<scalar>& values 00076 ) const 00077 { 00078 List<bool> lst(values.size(), false); 00079 00080 // check ranges 00081 forAll(values, i) 00082 { 00083 if (selected(values[i])) 00084 { 00085 lst[i] = true; 00086 } 00087 } 00088 00089 // check specific values 00090 forAll(*this, rangeI) 00091 { 00092 if (operator[](rangeI).isExact()) 00093 { 00094 scalar target = operator[](rangeI).value(); 00095 00096 int nearestIndex = -1; 00097 scalar nearestDiff = Foam::GREAT; 00098 00099 forAll(values, timeIndex) 00100 { 00101 scalar diff = fabs(values[timeIndex] - target); 00102 if (diff < nearestDiff) 00103 { 00104 nearestDiff = diff; 00105 nearestIndex = timeIndex; 00106 } 00107 } 00108 00109 if (nearestIndex >= 0) 00110 { 00111 lst[nearestIndex] = true; 00112 } 00113 } 00114 } 00115 00116 return lst; 00117 } 00118 00119 00120 Foam::List<Foam::scalar> Foam::scalarRanges::select 00121 ( 00122 const List<scalar>& values 00123 ) const 00124 { 00125 return subset(selected(values), values); 00126 } 00127 00128 00129 void Foam::scalarRanges::inplaceSelect 00130 ( 00131 List<scalar>& values 00132 ) const 00133 { 00134 inplaceSubset(selected(values), values); 00135 } 00136 00137 00138 // ************************ vim: set sw=4 sts=4 et: ************************ //