From 45db2cf0baa3a5b64081d522ae0b08cd63a16cac Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Thu, 11 Apr 2019 15:24:33 +0200 Subject: [PATCH 1/3] ENH: generalize indirect lists and support new types - use an IndirectListBase class for various indirect list types. - new SortList type In some places the SortList can be used as a lightweight alternative to SortableList to have the convenience of bundling data and sort indices together, but while operating on existing data lists. In other situations, it can be useful as an alternative to sortedOrder. For example, pointField points = ...; labelList order; sortedOrder(points, order); forAll(order, i) { points[order[i]] = ...; } Can be replaced with the following (with the same memory overhead) pointField points = ...; SortList sortedPoints(points); for (point& pt : sortedPoints) { pt = ...; } - new SliceList type (#1220), which can be used for stride-based addressing into existing lists --- .../test/IndirectList/Test-IndirectList.C | 77 ++++++- .../test/sliceRange/Test-sliceRange.C | 54 +++++ .../containers/Bits/PackedList/PackedList.C | 3 +- .../containers/Bits/PackedList/PackedList.H | 14 +- .../containers/Bits/PackedList/PackedListI.H | 8 +- src/OpenFOAM/containers/Bits/bitSet/bitSet.C | 13 -- src/OpenFOAM/containers/Bits/bitSet/bitSet.H | 23 +- src/OpenFOAM/containers/Bits/bitSet/bitSetI.H | 25 +- .../containers/Bits/bitSet/bitSetTemplates.C | 21 +- .../containers/HashTables/HashSet/HashSet.C | 9 +- .../containers/HashTables/HashSet/HashSet.H | 14 +- .../BiIndirectList/BiIndirectList.H | 0 .../BiIndirectList/BiIndirectListI.H | 0 .../IndirectList/IndirectList.H | 87 ++----- .../IndirectList/IndirectListI.H | 81 ++----- .../IndirectListBase/IndirectListAddressing.H | 101 +++++++++ .../IndirectListBase/IndirectListBase.C} | 37 ++- .../IndirectListBase/IndirectListBase.H} | 208 ++++++++++------- .../IndirectListBase/IndirectListBaseI.H} | 214 ++++++++---------- .../IndirectListBase/IndirectListBaseIO.C} | 8 +- .../IndirectLists/SliceList/SliceList.H | 95 ++++++++ .../IndirectLists/SortList/SortList.H | 118 ++++++++++ .../IndirectLists/SortList/SortListI.H | 149 ++++++++++++ .../UIndirectList/UIndirectList.H | 109 +++++++++ .../Lists/DynamicList/DynamicList.H | 17 +- .../Lists/DynamicList/DynamicListI.H | 11 +- src/OpenFOAM/containers/Lists/List/List.C | 8 +- src/OpenFOAM/containers/Lists/List/List.H | 18 +- src/OpenFOAM/containers/Lists/List/ListI.H | 5 +- .../Lists/SortableList/SortableList.C | 10 +- .../Lists/SortableList/SortableList.H | 11 +- .../fields/Fields/DynamicField/DynamicField.H | 7 +- .../Fields/DynamicField/DynamicFieldI.H | 5 +- src/OpenFOAM/fields/Fields/Field/Field.H | 7 +- src/OpenFOAM/fields/Fields/Field/FieldI.H | 5 +- src/conversion/ccm/reader/ccmReaderMesh.C | 2 +- .../output/foamVtkWriteCellSetFaces.C | 4 +- src/meshTools/output/foamVtkWriteFaceSet.C | 4 +- 38 files changed, 1124 insertions(+), 458 deletions(-) rename src/OpenFOAM/containers/{Lists => IndirectLists}/BiIndirectList/BiIndirectList.H (100%) rename src/OpenFOAM/containers/{Lists => IndirectLists}/BiIndirectList/BiIndirectListI.H (100%) rename src/OpenFOAM/containers/{Lists => IndirectLists}/IndirectList/IndirectList.H (58%) rename src/OpenFOAM/containers/{Lists => IndirectLists}/IndirectList/IndirectListI.H (57%) create mode 100644 src/OpenFOAM/containers/IndirectLists/IndirectListBase/IndirectListAddressing.H rename src/OpenFOAM/containers/{Lists/UIndirectList/UIndirectList.C => IndirectLists/IndirectListBase/IndirectListBase.C} (72%) rename src/OpenFOAM/containers/{Lists/UIndirectList/UIndirectList.H => IndirectLists/IndirectListBase/IndirectListBase.H} (61%) rename src/OpenFOAM/containers/{Lists/UIndirectList/UIndirectListI.H => IndirectLists/IndirectListBase/IndirectListBaseI.H} (53%) rename src/OpenFOAM/containers/{Lists/UIndirectList/UIndirectListIO.C => IndirectLists/IndirectListBase/IndirectListBaseIO.C} (95%) create mode 100644 src/OpenFOAM/containers/IndirectLists/SliceList/SliceList.H create mode 100644 src/OpenFOAM/containers/IndirectLists/SortList/SortList.H create mode 100644 src/OpenFOAM/containers/IndirectLists/SortList/SortListI.H create mode 100644 src/OpenFOAM/containers/IndirectLists/UIndirectList/UIndirectList.H diff --git a/applications/test/IndirectList/Test-IndirectList.C b/applications/test/IndirectList/Test-IndirectList.C index b06df501b5..bbe8b00f29 100644 --- a/applications/test/IndirectList/Test-IndirectList.C +++ b/applications/test/IndirectList/Test-IndirectList.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2010-2010, 2017 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2010-2010, 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 using namespace Foam; template 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.resetAddressing(std::move(addresses)); + idl1.addressing() = std::move(addresses); printInfo(idl1); @@ -114,10 +116,10 @@ int main(int argc, char *argv[]) printInfo(uidl1); - idl1.resetAddressing(List