ListListOps.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration | Website: https://openfoam.org
5  \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation
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 
112 } // End namespace Foam
113 
114 
115 // ************************************************************************* //
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:434
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Definition: label.H:59
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
Definition: HashTable.H:59
void size(const label)
Override size to be inconsistent with allocated storage.
Definition: ListI.H:164
AccessType combineOffset(const List< T > &, const labelList &sizes, AccessOp aop, OffsetOp oop=offsetOp< T >())
Like combine but also offsets sublists based on passed sizes.
Definition: ListListOps.C:75
AccessType combine(const List< T > &, AccessOp aop=accessOp< T >())
Combines sublists into one big list.
Definition: ListListOps.C:34
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh > &df)
labelList subSizes(const List< T > &, AccessOp aop=accessOp< T >())
Gets sizes of sublists.
Definition: ListListOps.C:61
void T(FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
Namespace for OpenFOAM.