Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Development
openfoam
Commits
61466672
Commit
61466672
authored
Apr 29, 2019
by
Andrew Heather
Committed by
Andrew Heather
Apr 29, 2019
Browse files
Merge branch 'feature-indirect-lists' into 'develop'
Feature indirect lists See merge request
OpenFOAM-plus!253
parents
ca2b94d1
bf30779b
Changes
41
Hide whitespace changes
Inline
Side-by-side
applications/test/IndirectList/Test-IndirectList.C
View file @
61466672
...
...
@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2017
-2019
OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2011 OpenFOAM Foundation
...
...
@@ -27,19 +27,21 @@ Description
\*---------------------------------------------------------------------------*/
#include
"IndirectList.H"
#include
"IOstreams.H"
#include
"argList.H"
#include
"Fstream.H"
#include
"ListOps.H"
#include
"IndirectList.H"
#include
"labelIndList.H"
#include
"argList.H"
#include
"SortList.H"
#include
"Random.H"
#include
<functional>
using
namespace
Foam
;
template
<
class
ListType
>
void
printInfo
(
const
ListType
&
lst
)
{
Info
<<
"full: "
<<
flatOutput
(
lst
.
completeList
())
<<
nl
Info
<<
"full: "
<<
flatOutput
(
lst
.
values
())
<<
nl
<<
"addr: "
<<
flatOutput
(
lst
.
addressing
())
<<
nl
<<
"list: "
<<
flatOutput
(
lst
)
<<
nl
<<
endl
;
...
...
@@ -103,7 +105,7 @@ int main(int argc, char *argv[])
inplaceReverseList
(
addresses
);
idl1
.
resetA
ddressing
(
std
::
move
(
addresses
)
)
;
idl1
.
a
ddressing
(
)
=
std
::
move
(
addresses
);
printInfo
(
idl1
);
...
...
@@ -114,10 +116,10 @@ int main(int argc, char *argv[])
printInfo
(
uidl1
);
idl1
.
resetA
ddressing
(
List
<
label
>
()
);
//
idl2.
resetA
ddressing(
List<label>()
);
idl1
.
a
ddressing
(
).
clear
(
);
//
idl2.
a
ddressing(
).clear(
);
Info
<<
"after reset
A
ddressing:"
<<
nl
<<
endl
;
Info
<<
"after reset
a
ddressing:"
<<
nl
<<
endl
;
printInfo
(
uidl1
);
printInfo
(
idl1
);
...
...
@@ -140,7 +142,7 @@ int main(int argc, char *argv[])
{
if
(
Pstream
::
master
())
{
Pout
<<
"full: "
<<
flatOutput
(
idl3
.
completeList
())
<<
nl
Pout
<<
"full: "
<<
flatOutput
(
idl3
.
values
())
<<
nl
<<
"send: "
<<
flatOutput
(
idl3
)
<<
endl
;
for
...
...
@@ -173,6 +175,61 @@ int main(int argc, char *argv[])
Pstream
::
scatter
(
barrier
);
}
// SortList
{
List
<
scalar
>
list1
(
20
);
Random
rnd
(
1234
);
for
(
scalar
&
val
:
list1
)
{
val
=
100
*
rnd
.
sample01
<
scalar
>
();
}
// Pick out 1/2 the values and make the negative
for
(
label
i
=
0
;
i
<
list1
.
size
()
/
2
;
++
i
)
{
label
pos
=
rnd
.
position
(
0
,
list1
.
size
()
-
1
);
list1
[
pos
]
=
-
list1
[
pos
];
}
Info
<<
nl
<<
"Random list: "
<<
flatOutput
(
list1
)
<<
nl
;
SortList
<
scalar
>
sorter1
(
list1
);
Info
<<
nl
<<
"Sort indices: "
<<
flatOutput
(
sorter1
.
indices
())
<<
nl
;
Info
<<
nl
<<
"Reverse indices: "
<<
flatOutput
(
sorter1
.
indices
())
<<
nl
;
sorter1
.
reverse
();
Info
<<
nl
<<
"Again indices: "
<<
flatOutput
(
sorter1
.
indices
())
<<
nl
;
sorter1
.
reverseSort
();
Info
<<
nl
<<
"Reverse indices: "
<<
flatOutput
(
sorter1
.
indices
())
<<
nl
;
Info
<<
nl
<<
"Sorted : "
<<
flatOutput
(
sorter1
)
<<
nl
;
sorter1
.
sort
(
std
::
greater
<
scalar
>
());
SortList
<
scalar
>
sorter2
(
list1
,
std
::
greater
<
scalar
>
());
sorter2
.
reverse
();
Info
<<
"sorted: "
;
for
(
const
auto
&
val
:
sorter2
)
{
Info
<<
' '
<<
val
;
}
Info
<<
nl
;
sorter2
.
sort
([](
scalar
a
,
scalar
b
)
{
return
mag
(
a
)
<
mag
(
b
);
});
Info
<<
nl
<<
"Mag sorted: "
<<
flatOutput
(
sorter2
)
<<
nl
;
}
Info
<<
"End
\n
"
<<
endl
;
return
0
;
...
...
applications/test/sliceRange/Test-sliceRange.C
View file @
61466672
...
...
@@ -29,6 +29,9 @@ Description
#include
"labelList.H"
#include
"FixedList.H"
#include
"sliceRange.H"
#include
"SliceList.H"
#include
"IndirectList.H"
#include
"Random.H"
using
namespace
Foam
;
...
...
@@ -128,9 +131,60 @@ int main(int argc, char *argv[])
}
}
// Sliced lists
{
List
<
scalar
>
list1
(
100
);
Random
rnd
(
1234
);
for
(
scalar
&
val
:
list1
)
{
val
=
100
*
rnd
.
sample01
<
scalar
>
();
}
Info
<<
nl
<<
"Random list: "
<<
flatOutput
(
list1
)
<<
nl
;
SliceList
<
scalar
>
slice1
(
list1
,
sliceRange
(
0
,
15
,
3
));
Info
<<
nl
<<
"slicing with: "
<<
slice1
.
addressing
()
<<
nl
;
Info
<<
nl
<<
"Sliced list: "
<<
flatOutput
(
slice1
)
<<
nl
;
for
(
scalar
&
val
:
slice1
)
{
val
=
-
val
;
}
// Changed list via slice:
Info
<<
nl
<<
"Changed via slice: "
<<
flatOutput
(
list1
)
<<
nl
;
// Some indirect list
IndirectList
<
scalar
>
indlist
(
list1
,
identity
(
slice1
.
size
(),
list1
.
size
()
-
slice1
.
size
())
);
Info
<<
nl
<<
"Indirect slice: "
<<
flatOutput
(
indlist
)
<<
nl
;
indlist
=
1000
;
Info
<<
nl
<<
"zeroed slice: "
<<
flatOutput
(
indlist
)
<<
nl
;
slice1
=
indlist
;
Info
<<
nl
<<
"self-copy: "
<<
flatOutput
(
list1
)
<<
nl
;
slice1
=
100000
;
Info
<<
nl
<<
"set values: "
<<
flatOutput
(
slice1
)
<<
nl
<<
" = "
<<
flatOutput
(
list1
)
<<
nl
;
}
Info
<<
"
\n
End
\n
"
<<
endl
;
return
0
;
}
// ************************************************************************* //
applications/test/sort/Test-sortList.C
View file @
61466672
...
...
@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2017
-2019
OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2011 OpenFOAM Foundation
...
...
@@ -67,6 +67,10 @@ int main(int argc, char *argv[])
Info
<<
"reverse ..."
<<
nl
;
printInfo
(
list1r
);
list1r
.
partialSort
(
list1r
.
size
()
/
2
);
Info
<<
"partial sorted ..."
<<
nl
;
printInfo
(
list1r
);
SortableList
<
label
>
list2
(
orig
);
Info
<<
"unsorted: "
<<
orig
<<
nl
;
printInfo
(
list2
);
...
...
src/OpenFOAM/containers/Bits/PackedList/PackedList.C
View file @
61466672
...
...
@@ -47,10 +47,11 @@ Foam::PackedList<Width>::PackedList
template
<
unsigned
Width
>
template
<
class
Addr
>
Foam
::
PackedList
<
Width
>::
PackedList
(
const
PackedList
<
Width
>&
list
,
const
labelUIndList
&
addr
const
IndirectListBase
<
label
,
Addr
>
&
addr
)
:
PackedList
<
Width
>
(
addr
.
size
())
...
...
src/OpenFOAM/containers/Bits/PackedList/PackedList.H
View file @
61466672
...
...
@@ -93,7 +93,7 @@ SourceFiles
#include
"BitOps.H"
#include
"labelList.H"
#include
"
U
IndirectList.H"
#include
"IndirectList
Base
.H"
#include
"InfoProxy.H"
#include
"PackedListCore.H"
...
...
@@ -252,7 +252,12 @@ public:
PackedList
(
const
PackedList
<
Width
>&
list
,
const
labelUList
&
addr
);
//- Copy construct a subset
PackedList
(
const
PackedList
<
Width
>&
list
,
const
labelUIndList
&
addr
);
template
<
class
Addr
>
PackedList
(
const
PackedList
<
Width
>&
list
,
const
IndirectListBase
<
label
,
Addr
>&
addr
);
//- Copy construct a subset range
PackedList
(
const
PackedList
<
Width
>&
list
,
const
labelRange
&
range
);
...
...
@@ -260,8 +265,9 @@ public:
//- Construct from a list of values
inline
explicit
PackedList
(
const
labelUList
&
values
);
//- Construct from a list of values
inline
explicit
PackedList
(
const
labelUIndList
&
values
);
//- Construct from a indirect list of values
template
<
class
Addr
>
inline
explicit
PackedList
(
const
IndirectListBase
<
label
,
Addr
>&
values
);
//- Clone
inline
autoPtr
<
PackedList
<
Width
>>
clone
()
const
;
...
...
src/OpenFOAM/containers/Bits/PackedList/PackedListI.H
View file @
61466672
...
...
@@ -242,7 +242,11 @@ inline Foam::PackedList<Width>::PackedList(const labelUList& values)
template
<
unsigned
Width
>
inline
Foam
::
PackedList
<
Width
>::
PackedList
(
const
labelUIndList
&
values
)
template
<
class
Addr
>
inline
Foam
::
PackedList
<
Width
>::
PackedList
(
const
IndirectListBase
<
label
,
Addr
>&
values
)
:
blocks_
(
num_blocks
(
values
.
size
()),
0u
),
size_
(
values
.
size
())
...
...
src/OpenFOAM/containers/Bits/bitSet/bitSet.C
View file @
61466672
...
...
@@ -306,19 +306,6 @@ Foam::bitSet::bitSet(const bitSet& bitset, const labelUList& addr)
}
Foam
::
bitSet
::
bitSet
(
const
bitSet
&
bitset
,
const
labelUIndList
&
addr
)
:
bitSet
(
addr
.
size
())
{
const
label
len
=
addr
.
size
();
for
(
label
i
=
0
;
i
<
len
;
++
i
)
{
set
(
i
,
bitset
.
get
(
addr
[
i
]));
}
}
Foam
::
bitSet
::
bitSet
(
const
bitSet
&
bitset
,
const
labelRange
&
range
)
:
bitSet
(
range
.
size
())
...
...
src/OpenFOAM/containers/Bits/bitSet/bitSet.H
View file @
61466672
...
...
@@ -157,7 +157,12 @@ public:
bitSet
(
const
bitSet
&
bitset
,
const
labelUList
&
addr
);
//- Copy construct a subset
bitSet
(
const
bitSet
&
bitset
,
const
labelUIndList
&
addr
);
template
<
class
Addr
>
bitSet
(
const
bitSet
&
bitset
,
const
IndirectListBase
<
label
,
Addr
>&
addr
);
//- Copy construct a subset range
bitSet
(
const
bitSet
&
bitset
,
const
labelRange
&
range
);
...
...
@@ -171,7 +176,12 @@ public:
//- Construct with given size with all bits set to 0,
//- subsequently add specified locations as 1.
inline
bitSet
(
const
label
n
,
const
labelUIndList
&
locations
);
template
<
class
Addr
>
bitSet
(
const
label
n
,
const
IndirectListBase
<
label
,
Addr
>&
locations
);
//- Construct with given size with all bits set to 0,
//- subsequently add specified locations as 1.
...
...
@@ -188,7 +198,8 @@ public:
//- Construct with automatic sizing (filled with 0),
//- and populate with specified locations as 1.
inline
explicit
bitSet
(
const
labelUIndList
&
locations
);
template
<
class
Addr
>
inline
explicit
bitSet
(
const
IndirectListBase
<
label
,
Addr
>&
locations
);
//- Construct with automatic sizing (filled with 0),
//- and populate with specified locations as 1.
...
...
@@ -382,7 +393,8 @@ public:
// Does auto-vivify for non-existent entries.
//
// \return number of locations changed
inline
label
set
(
const
labelUIndList
&
locations
);
template
<
class
Addr
>
inline
label
set
(
const
IndirectListBase
<
label
,
Addr
>&
locations
);
//- Set the listed locations to true.
// Does auto-vivify for non-existent entries.
...
...
@@ -406,7 +418,8 @@ public:
//- Unset the listed locations, never auto-vivifies.
//
// \return number of locations changed
inline
label
unset
(
const
labelUIndList
&
locations
);
template
<
class
Addr
>
inline
label
unset
(
const
IndirectListBase
<
label
,
Addr
>&
locations
);
//- Unset the listed locations, never auto-vivifies.
//
...
...
src/OpenFOAM/containers/Bits/bitSet/bitSetI.H
View file @
61466672
...
...
@@ -120,7 +120,12 @@ inline Foam::bitSet::bitSet(const label n, const labelUList& locations)
}
inline
Foam
::
bitSet
::
bitSet
(
const
label
n
,
const
labelUIndList
&
locations
)
template
<
class
Addr
>
inline
Foam
::
bitSet
::
bitSet
(
const
label
n
,
const
IndirectListBase
<
label
,
Addr
>&
locations
)
:
bitSet
(
n
)
{
...
...
@@ -148,7 +153,11 @@ inline Foam::bitSet::bitSet(const labelUList& locations)
}
inline
Foam
::
bitSet
::
bitSet
(
const
labelUIndList
&
locations
)
template
<
class
Addr
>
inline
Foam
::
bitSet
::
bitSet
(
const
IndirectListBase
<
label
,
Addr
>&
locations
)
:
bitSet
()
{
...
...
@@ -537,7 +546,11 @@ inline Foam::label Foam::bitSet::set(const labelUList& locations)
}
inline
Foam
::
label
Foam
::
bitSet
::
set
(
const
labelUIndList
&
locations
)
template
<
class
Addr
>
inline
Foam
::
label
Foam
::
bitSet
::
set
(
const
IndirectListBase
<
label
,
Addr
>&
locations
)
{
return
setMany
(
locations
.
begin
(),
locations
.
end
());
}
...
...
@@ -549,7 +562,11 @@ inline Foam::label Foam::bitSet::unset(const labelUList& locations)
}
inline
Foam
::
label
Foam
::
bitSet
::
unset
(
const
labelUIndList
&
locations
)
template
<
class
Addr
>
inline
Foam
::
label
Foam
::
bitSet
::
unset
(
const
IndirectListBase
<
label
,
Addr
>&
locations
)
{
return
unset
(
locations
.
begin
(),
locations
.
end
());
}
...
...
src/OpenFOAM/containers/Bits/bitSet/bitSetTemplates.C
View file @
61466672
...
...
@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2018
-2019
OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
...
...
@@ -48,6 +48,25 @@ Foam::bitSet::bitSet(const FixedList<label, N>& locations)
}
template
<
class
Addr
>
Foam
::
bitSet
::
bitSet
(
const
bitSet
&
bitset
,
const
IndirectListBase
<
label
,
Addr
>&
addr
)
:
bitSet
(
addr
.
size
())
{
const
label
len
=
addr
.
size
();
for
(
label
i
=
0
;
i
<
len
;
++
i
)
{
set
(
i
,
bitset
.
get
(
addr
[
i
]));
}
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template
<
class
InputIter
>
...
...
src/OpenFOAM/containers/HashTables/HashSet/HashSet.C
View file @
61466672
...
...
@@ -84,7 +84,8 @@ Foam::HashSet<Key, Hash>::HashSet(const UList<Key>& list)
template
<
class
Key
,
class
Hash
>
Foam
::
HashSet
<
Key
,
Hash
>::
HashSet
(
const
UIndirectList
<
Key
>&
list
)
template
<
class
Addr
>
Foam
::
HashSet
<
Key
,
Hash
>::
HashSet
(
const
IndirectListBase
<
Key
,
Addr
>&
list
)
:
parent_type
(
2
*
list
.
size
())
{
...
...
@@ -177,9 +178,10 @@ inline Foam::label Foam::HashSet<Key, Hash>::insert
template
<
class
Key
,
class
Hash
>
template
<
class
Addr
>
inline
Foam
::
label
Foam
::
HashSet
<
Key
,
Hash
>::
insert
(
const
U
IndirectList
<
Key
>&
list
const
IndirectList
Base
<
Key
,
Addr
>&
list
)
{
return
insert
(
list
.
begin
(),
list
.
end
());
...
...
@@ -230,9 +232,10 @@ inline Foam::label Foam::HashSet<Key, Hash>::unset
template
<
class
Key
,
class
Hash
>
template
<
class
Addr
>
inline
Foam
::
label
Foam
::
HashSet
<
Key
,
Hash
>::
unset
(
const
U
IndirectList
<
Key
>&
list
const
IndirectList
Base
<
Key
,
Addr
>&
list
)
{
return
unset
(
list
.
begin
(),
list
.
end
());
...
...
src/OpenFOAM/containers/HashTables/HashSet/HashSet.H
View file @
61466672
...
...
@@ -65,7 +65,7 @@ Description
#define HashSet_H
#include
"HashTable.H"
#include
"
U
IndirectList.H"
#include
"IndirectList.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
...
...
@@ -143,7 +143,8 @@ public:
explicit
HashSet
(
const
UList
<
Key
>&
list
);
//- Construct from an indirect list
explicit
HashSet
(
const
UIndirectList
<
Key
>&
list
);
template
<
class
Addr
>
explicit
HashSet
(
const
IndirectListBase
<
Key
,
Addr
>&
list
);
//- Construct from an initializer list of Key
HashSet
(
std
::
initializer_list
<
Key
>
list
);
...
...
@@ -222,7 +223,8 @@ public:
//- Insert keys from the list of Key
// \return The number of new elements inserted
inline
label
insert
(
const
UIndirectList
<
Key
>&
list
);
template
<
class
Addr
>
inline
label
insert
(
const
IndirectListBase
<
Key
,
Addr
>&
list
);
//- Same as insert (no value to overwrite)
template
<
class
InputIter
>
...
...
@@ -251,7 +253,8 @@ public:
}
//- Same as insert (no value to overwrite)
inline
label
set
(
const
UIndirectList
<
Key
>&
list
)
template
<
class
Addr
>
inline
label
set
(
const
IndirectListBase
<
Key
,
Addr
>&
list
)
{
return
insert
(
list
);
}
...
...
@@ -284,7 +287,8 @@ public:
//- Unset the listed keys - same as erase
// \return The number of items removed
inline
label
unset
(
const
UIndirectList
<
Key
>&
list
);
template
<
class
Addr
>
inline
label
unset
(
const
IndirectListBase
<
Key
,
Addr
>&
list
);
// STL iterators
...
...
src/OpenFOAM/containers/Lists/BiIndirectList/BiIndirectList.H
→
src/OpenFOAM/containers/
Indirect
Lists/BiIndirectList/BiIndirectList.H
View file @
61466672
File moved
src/OpenFOAM/containers/Lists/BiIndirectList/BiIndirectListI.H
→
src/OpenFOAM/containers/
Indirect
Lists/BiIndirectList/BiIndirectListI.H
View file @
61466672
File moved
src/OpenFOAM/containers/Lists/IndirectList/IndirectList.H
→
src/OpenFOAM/containers/
Indirect
Lists/IndirectList/IndirectList.H
View file @
61466672
...
...
@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2017
-2019
OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2011-2016 OpenFOAM Foundation
...
...
@@ -30,8 +30,7 @@ Description
A List with indirect addressing.
See also
Foam::UIndirectList for a version without any allocation for the
addressing.
Foam::UIndirectList for a version without any addressing allocation.
SourceFiles
IndirectListI.H
...
...
@@ -41,6 +40,7 @@ SourceFiles
#ifndef IndirectList_H
#define IndirectList_H
#include
"IndirectListAddressing.H"
#include
"UIndirectList.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
...
...
@@ -48,53 +48,6 @@ SourceFiles
namespace
Foam
{
/*---------------------------------------------------------------------------*\
Class IndirectListAddressing Declaration
\*---------------------------------------------------------------------------*/
//- A helper class for storing addresses.
class
IndirectListAddressing
{
// Private data
//- Storage for the list addressing
List
<
label
>
addressing_
;
// Private Member Functions
//- No copy construct
IndirectListAddressing
(
const
IndirectListAddressing
&
)
=
delete
;
//- No copy assignment
void
operator
=
(
const
IndirectListAddressing
&
)
=
delete
;
protected:
// Constructors
//- Copy construct from addressing array
inline
explicit
IndirectListAddressing
(
const
labelUList
&
addr
);
//- Move construct from addressing array
inline
explicit
IndirectListAddressing
(
List
<
label
>&&
addr
);
// Member Functions
//- Return the list addressing
inline
const
List
<
label
>&
addressing
()
const
;
//- Copy reset addressing
inline
void
resetAddressing
(
const
labelUList
&
addr
);
//- Move reset addressing
inline
void
resetAddressing
(
List
<
label
>&&
addr
);
};