FreeFOAM The Cross-Platform CFD Toolkit
ListListOps.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9  This file is part of OpenFOAM.
10 
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
13  the Free Software Foundation, either version 3 of the License, or
14  (at your option) any later version.
15 
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.
20 
21  You should have received a copy of the GNU General Public License
22  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
23 
24 \*---------------------------------------------------------------------------*/
25 
26 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
27 
28 namespace Foam
29 {
30 
31 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
32 
33 template <class AccessType, class T, class AccessOp>
34 AccessType ListListOps::combine(const List<T>& lst, AccessOp aop)
35 {
36  label sum = 0;
37 
38  forAll(lst, lstI)
39  {
40  sum += aop(lst[lstI]).size();
41  }
42 
43  AccessType result(sum);
44 
45  label globalElemI = 0;
46 
47  forAll(lst, lstI)
48  {
49  const T& sub = lst[lstI];
50 
51  forAll(aop(sub), elemI)
52  {
53  result[globalElemI++] = aop(sub)[elemI];
54  }
55  }
56  return result;
57 }
58 
59 
60 template <class T, class AccessOp>
61 labelList ListListOps::subSizes(const List<T>& lst, AccessOp aop)
62 {
63  labelList sizes(lst.size());
64 
65  forAll(lst, lstI)
66  {
67  sizes[lstI] = aop(lst[lstI]).size();
68  }
69  return sizes;
70 }
71 
72 
73 template <class AccessType, class T, class AccessOp, class OffsetOp>
75 (
76  const List<T>& lst,
77  const labelList& sizes,
78  AccessOp aop,
79  OffsetOp oop
80 )
81 {
82  label sum = 0;
83 
84  forAll(lst, lstI)
85  {
86  sum += aop(lst[lstI]).size();
87  }
88 
89  AccessType result(sum);
90 
91  label globalElemI = 0;
92 
93  label offset = 0;
94 
95  forAll(lst, lstI)
96  {
97  const T& sub = lst[lstI];
98 
99  forAll(aop(sub), elemI)
100  {
101  result[globalElemI++] = oop(aop(sub)[elemI], offset);
102  }
103 
104  offset += sizes[lstI];
105  }
106  return result;
107 }
108 
109 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
110 
111 } // End namespace Foam
112 
113 
114 // ************************ vim: set sw=4 sts=4 et: ************************ //