diff --git a/applications/test/HashTable4/Test-HashTable4.cxx b/applications/test/HashTable4/Test-HashTable4.cxx index e474436870d5e94323bbd9616ac15419644b33ef..12b63ae2913bdc8188baff8c6f7499a80eacd24f 100644 --- a/applications/test/HashTable4/Test-HashTable4.cxx +++ b/applications/test/HashTable4/Test-HashTable4.cxx @@ -206,7 +206,7 @@ int main(int argc, char *argv[]) #endif loopInsert(map, nElem); - (void)timer.cpuTimeIncrement(); + timer.resetCpuTimeIncrement(); unsigned long sum = 0; for (label loopi = 0; loopi < nFind*nLoops; ++loopi) @@ -268,7 +268,7 @@ int main(int argc, char *argv[]) HashSet<label, Hash<label>> map(32); loopInsert(map, nElem); - (void)timer.cpuTimeIncrement(); + timer.resetCpuTimeIncrement(); unsigned long sum = 0; for (label loopi = 0; loopi < nFind*nLoops; ++loopi) diff --git a/applications/test/nullObject/Make/files b/applications/test/nullObject/Make/files index dffa06d74712a1c7bf3d4eaa480c6ca82768f622..fdd71c155e11dffcbe6104e17e546288030615a2 100644 --- a/applications/test/nullObject/Make/files +++ b/applications/test/nullObject/Make/files @@ -1,3 +1,3 @@ -Test-nullObject.C +Test-nullObject.cxx EXE = $(FOAM_USER_APPBIN)/Test-nullObject diff --git a/applications/test/nullObject/Test-nullObject.C b/applications/test/nullObject/Test-nullObject.cxx similarity index 92% rename from applications/test/nullObject/Test-nullObject.C rename to applications/test/nullObject/Test-nullObject.cxx index 0f7cd10dad016261bb009043e910116cfe40aab9..475a4e55b00f6cb7d6464bba011186d4e7a21125 100644 --- a/applications/test/nullObject/Test-nullObject.C +++ b/applications/test/nullObject/Test-nullObject.cxx @@ -37,6 +37,7 @@ Description #include "HashSet.H" #include "faceList.H" #include "pointField.H" +#include "globalIndex.H" #include "IOstreams.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -150,6 +151,18 @@ int main() NullObject::nullObject = "hello world"; NullObject::nullObject = Foam::identity(5); + + { + const auto& gi = globalIndex::null(); + Info<< "globalIndex::null() => " + << " empty: " << gi.empty() + << " nProcs: " << gi.nProcs() + << " total-size: " << gi.totalSize() << nl; + + // Even this works + Info<< " offsets: " << gi.offsets() << nl; + } + Info<< nl; return 0; diff --git a/applications/utilities/mesh/manipulation/renumberMesh/renumberMesh.C b/applications/utilities/mesh/manipulation/renumberMesh/renumberMesh.C index 7c08c679a5feb1946951dcb98f1ac377392670ae..64011258c6ae2f67ac49b81ed44f5caaa56ac67f 100644 --- a/applications/utilities/mesh/manipulation/renumberMesh/renumberMesh.C +++ b/applications/utilities/mesh/manipulation/renumberMesh/renumberMesh.C @@ -123,6 +123,7 @@ Usage \*---------------------------------------------------------------------------*/ #include "argList.H" +#include "clockTime.H" #include "timeSelector.H" #include "IOobjectList.H" #include "fvMesh.H" @@ -147,6 +148,24 @@ Usage using namespace Foam; +// Slightly messy way of handling timing, but since the timing points +// are scattered between 'main()' and other local functions... + +clockTime timer; + +// Timing categories +enum TimingType +{ + READ_MESH, // Reading mesh + READ_FIELDS, // Reading fields + DECOMPOSE, // Domain decomposition (if any) + CELL_CELLS, // globalMeshData::calcCellCells + RENUMBER, // The renumberMethod + REORDER, // Mesh reordering (topoChange) + WRITING, // Writing mesh/fields +}; +FixedList<double, 8> timings; + // Create named field from labelList for post-processing tmp<volScalarField> createScalarField @@ -205,8 +224,8 @@ void getBand scalar& sumSqrIntersect // scalar to avoid overflow ) { - labelList cellBandwidth(nCells, Zero); - scalarField nIntersect(nCells, Zero); + labelList cellBandwidth(nCells, Foam::zero{}); + scalarField nIntersect(nCells, Foam::zero{}); forAll(neighbour, facei) { @@ -627,8 +646,33 @@ CompactListList<label> regionRenumber invertOneToManyCompact(nRegions, cellToRegion) ); - if (method.needs_mesh()) + if (method.no_topology()) { + // Special case when renumberMesh is only used for decomposition. + // - can skip generating the connectivity + // - nonetheless calculate the order in case it is non-identity + + timer.resetTimeIncrement(); + + forAll(regionCellOrder, regioni) + { + // Note: cellMap is identical to regionToCells[regioni] + // since it is already sorted + + labelList subCellOrder = + method.renumber(regionCellOrder[regioni].size()); + + // Per region reordering (inplace but with SubList) + regionCellOrder[regioni] = + labelUIndList(regionCellOrder[regioni], subCellOrder)(); + } + + timings[TimingType::RENUMBER] += timer.timeIncrement(); + } + else if (method.needs_mesh()) + { + timer.resetTimeIncrement(); + forAll(regionCellOrder, regioni) { // Info<< " region " << regioni @@ -645,20 +689,20 @@ CompactListList<label> regionRenumber // (assuming they are properly sorted!) const labelList& cellMap = subsetter.cellMap(); - labelList subCellOrder = method.renumber - ( - subsetter.subMesh(), - subsetter.subMesh().cellCentres() - ); + labelList subCellOrder = method.renumber(subsetter.subMesh()); UPstream::parRun(oldParRun); // Restore parallel state // Per region reordering regionCellOrder[regioni] = labelUIndList(cellMap, subCellOrder); } + + timings[TimingType::RENUMBER] += timer.timeIncrement(); } else { + timer.resetTimeIncrement(); + forAll(regionCellOrder, regioni) { // Info<< " region " << regioni @@ -677,17 +721,16 @@ CompactListList<label> regionRenumber cellCells ); - // Note: cellCentres not needed by every renumber method - labelList subCellOrder = method.renumber - ( - cellCells, - pointField(mesh.cellCentres(), cellMap) - ); + timings[TimingType::CELL_CELLS] += timer.timeIncrement(); + + labelList subCellOrder = method.renumber(cellCells); UPstream::parRun(oldParRun); // Restore parallel state // Per region reordering regionCellOrder[regioni] = labelUIndList(cellMap, subCellOrder); + + timings[TimingType::RENUMBER] += timer.timeIncrement(); } } // Info<< endl; @@ -832,8 +875,15 @@ int main(int argc, char *argv[]) runTime.setTime(Times[startTime], startTime); + + // Start/reset all timings + timer.resetTime(); + timings = Foam::zero{}; + #include "createNamedMeshes.H" + timings[TimingType::READ_MESH] += timer.timeIncrement(); + for (fvMesh& mesh : meshes) { @@ -881,6 +931,7 @@ int main(int argc, char *argv[]) bool sortCoupledFaceCells = false; bool writeMaps = args.found("write-maps"); bool orderPoints = false; + bool useRegionFaceOrder = false; label blockSize = 0; // Construct renumberMethod @@ -920,6 +971,12 @@ int main(int argc, char *argv[]) << " and region-external." << nl << endl; } + + if (blockSize > 0) + { + useRegionFaceOrder = + renumberDict.getOrDefault("regionFaceOrder", false); + } } orderPoints = renumberDict.getOrDefault("orderPoints", false); @@ -969,12 +1026,12 @@ int main(int argc, char *argv[]) { renumberPtr.reset(new CuthillMcKeeRenumber(renumberDict)); Info<< "Using renumber-method: " << renumberPtr().type() - << " [default]" << nl << endl; + << " [default]" << endl; } else { Info<< "Using renumber-method: " << renumberPtr().type() - << nl << endl; + << endl; } @@ -1042,6 +1099,10 @@ int main(int argc, char *argv[]) if (!dryrun && doFields) { + Info<< nl << "Reading fields" << nl; + + timer.resetTimeIncrement(); + objects = IOobjectList(mesh, runTime.timeName()); storedObjects.reserve(objects.size()); @@ -1089,6 +1150,8 @@ int main(int argc, char *argv[]) #undef ReadFields #undef ReadPointFields + + timings[TimingType::READ_FIELDS] += timer.timeIncrement(); } @@ -1116,6 +1179,8 @@ int main(int argc, char *argv[]) if (blockSize > 0 && !doDecompose) { + timer.resetTimeIncrement(); + // Renumbering in two phases. Should be done in one so mapping of // fields is done correctly! @@ -1143,6 +1208,7 @@ int main(int argc, char *argv[]) UPstream::parRun(oldParRun); // Restore parallel state + timings[TimingType::DECOMPOSE] += timer.timeIncrement(); // For debugging: write out region createScalarField @@ -1163,12 +1229,14 @@ int main(int argc, char *argv[]) cellOrder = regionCellOrder.values(); // Determine new to old face order with new cell numbering - faceOrder = getRegionFaceOrder - ( - mesh, - cellOrder, - cellToRegion - ); + if (useRegionFaceOrder) + { + faceOrder = getRegionFaceOrder(mesh, cellOrder, cellToRegion); + } + else + { + faceOrder = getFaceOrder(mesh, cellOrder); + } } else { @@ -1178,6 +1246,8 @@ int main(int argc, char *argv[]) // 1. decompose into regions (like decomposePar) // 2. renumber each sub-region + timer.resetTimeIncrement(); + // Read decompositionMethod dictionary IOdictionary decomposeDict ( @@ -1212,6 +1282,8 @@ int main(int argc, char *argv[]) ) ); + timings[TimingType::DECOMPOSE] += timer.timeIncrement(); + UPstream::parRun(oldParRun); // Restore parallel state CompactListList<label> regionCellOrder = @@ -1236,11 +1308,21 @@ int main(int argc, char *argv[]) else { // Determines sorted back to original cell ordering - cellOrder = renumberPtr().renumber - ( - mesh, - mesh.cellCentres() - ); + + const auto& method = renumberPtr(); + + timer.resetTimeIncrement(); + + if (method.no_topology()) + { + cellOrder = method.renumber(mesh.nCells()); + } + else + { + cellOrder = method.renumber(mesh); + } + + timings[TimingType::RENUMBER] += timer.timeIncrement(); } @@ -1321,11 +1403,7 @@ int main(int argc, char *argv[]) // Determine new to old face order with new cell numbering - faceOrder = getFaceOrder - ( - mesh, - cellOrder // New to old cell - ); + faceOrder = getFaceOrder(mesh, cellOrder); } @@ -1681,6 +1759,8 @@ int main(int argc, char *argv[]) } else { + timer.resetTimeIncrement(); + if (overwrite) { mesh.setInstance(oldInstance); @@ -1720,6 +1800,8 @@ int main(int argc, char *argv[]) mesh.write(); + timings[TimingType::WRITING] += timer.timeIncrement(); + if (writeMaps) { // For debugging: write out region @@ -1771,6 +1853,19 @@ int main(int argc, char *argv[]) } } + Info<< nl + << "Timings:" << nl + << " read mesh : " << timings[TimingType::READ_MESH] << nl + << " read fields : " << timings[TimingType::READ_FIELDS] << nl + << " decompose : " << timings[TimingType::DECOMPOSE] << nl + << " cell-cells : " << timings[TimingType::CELL_CELLS] << nl + << " renumber : " << timings[TimingType::RENUMBER] << nl + << " write : " << timings[TimingType::WRITING] << nl + << "TotalTime = " << timer.elapsedTime() << " s" << nl + << nl; + + runTime.printExecutionTime(Info); + Info<< "End\n" << endl; return 0; diff --git a/etc/caseDicts/annotated/renumberMeshDict b/etc/caseDicts/annotated/renumberMeshDict index 80f960d0144e9267b44696346393a853c9ba9569..1bf012a57eff5a811ae1451d8fa9896a46d204b0 100644 --- a/etc/caseDicts/annotated/renumberMeshDict +++ b/etc/caseDicts/annotated/renumberMeshDict @@ -38,6 +38,11 @@ sortCoupledFaceCells false; // Optional entry: sort points into internal and boundary points //orderPoints false; +// Optional entry (experimental) - for block-by-block (blockSize > 0) option: +// - sort intra-region and iter-region faces separately. +// This will likely lead to non-upper triangular ordering between regions. +//regionFaceOrder false; + method CuthillMcKee; //method RCM; // == reverseCuthillMcKee; diff --git a/src/OSspecific/POSIX/cpuTime/cpuTimePosix.C b/src/OSspecific/POSIX/cpuTime/cpuTimePosix.C index 47af1c635c128afb581901b54b05d1aa5a832980..027b29b41a5b487b1f3dbd799a65ce80de082931 100644 --- a/src/OSspecific/POSIX/cpuTime/cpuTimePosix.C +++ b/src/OSspecific/POSIX/cpuTime/cpuTimePosix.C @@ -77,6 +77,12 @@ void Foam::cpuTimePosix::resetCpuTime() } +void Foam::cpuTimePosix::resetCpuTimeIncrement() const +{ + last_.update(); +} + + double Foam::cpuTimePosix::elapsedCpuTime() const { last_.update(); diff --git a/src/OSspecific/POSIX/cpuTime/cpuTimePosix.H b/src/OSspecific/POSIX/cpuTime/cpuTimePosix.H index f657d232f192ef86bfad9b6f08b5a41783b2856e..efb6ada7f127a0931125220d80a0c338fe64c9da 100644 --- a/src/OSspecific/POSIX/cpuTime/cpuTimePosix.H +++ b/src/OSspecific/POSIX/cpuTime/cpuTimePosix.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2014 OpenFOAM Foundation - Copyright (C) 2018 OpenCFD Ltd. + Copyright (C) 2018-2024 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -72,7 +72,8 @@ class cpuTimePosix //- Start time, at the time of construction value_type start_; - //- Last time when elapsedTime or timeIncrement was called + //- Last time when elapsedCpuTime or cpuTimeIncrement was called. + //- Also affected by resetCpuTime and resetCpuTimeIncrement. mutable value_type last_; @@ -95,10 +96,14 @@ public: //- Reset to use the current time for the start time void resetCpuTime(); - //- Return CPU time (in seconds) from the start + //- Reset to use the current time for the increment point + void resetCpuTimeIncrement() const; + + //- Return CPU time [seconds] from the start double elapsedCpuTime() const; - //- Return CPU time (in seconds) since last call to cpuTimeIncrement() + //- Return CPU time [seconds] since last call to cpuTimeIncrement(), + //- resetCpuTimeIncrement(). double cpuTimeIncrement() const; }; diff --git a/src/OpenFOAM/fields/Fields/fieldTypes.C b/src/OpenFOAM/fields/Fields/fieldTypes.C index 943ecdd46feb73abc30d4f6964678369bd76d89e..79ff2e60d934f3d234d193b4456914edbbf2a692 100644 --- a/src/OpenFOAM/fields/Fields/fieldTypes.C +++ b/src/OpenFOAM/fields/Fields/fieldTypes.C @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2018-2023 OpenCFD Ltd. + Copyright (C) 2018-2024 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -59,6 +59,11 @@ const Foam::word Foam::fieldTypes::extrapolatedCalculatedType Foam::fieldTypes::extrapolatedCalculatedTypeName_() ); +const Foam::word Foam::fieldTypes::processorType +( + Foam::fieldTypes::processorTypeName_() +); + const Foam::word Foam::fieldTypes::zeroGradientType ( Foam::fieldTypes::zeroGradientTypeName_() diff --git a/src/OpenFOAM/fields/Fields/fieldTypes.H b/src/OpenFOAM/fields/Fields/fieldTypes.H index 9f279730a142ed717855c84a8d0b328b80ca01ed..55d8e62942268bc7823c313e003b2b92b8dbbd50 100644 --- a/src/OpenFOAM/fields/Fields/fieldTypes.H +++ b/src/OpenFOAM/fields/Fields/fieldTypes.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation - Copyright (C) 2018-2023 OpenCFD Ltd. + Copyright (C) 2018-2024 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -105,6 +105,12 @@ inline const char* extrapolatedCalculatedTypeName_() noexcept //- A combined \c zero-gradient and \c calculated patch field type extern const word extrapolatedCalculatedType; +//- A \c processor patch field type +inline const char* processorTypeName_() noexcept { return "processor"; } + +//- A \c processor patch field type +extern const word processorType; + //- A \c zeroGradient patch field type inline const char* zeroGradientTypeName_() noexcept { return "zeroGradient"; } diff --git a/src/OpenFOAM/global/clockTime/clockTime.H b/src/OpenFOAM/global/clockTime/clockTime.H index 5a82387dc61b4bea654f65f7e41bbf6fc4d993b0..e3e1a15518690f43ad097211b35508cade59c3c3 100644 --- a/src/OpenFOAM/global/clockTime/clockTime.H +++ b/src/OpenFOAM/global/clockTime/clockTime.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011 OpenFOAM Foundation - Copyright (C) 2018-2020 OpenCFD Ltd. + Copyright (C) 2018-2024 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -46,8 +46,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef clockTime_H -#define clockTime_H +#ifndef Foam_clockTime_H +#define Foam_clockTime_H #include "clockValue.H" @@ -67,7 +67,8 @@ class clockTime //- Time point at start, or after resetTime clockValue start_; - //- Time point when elapsedTime or timeIncrement was called + //- Time point when elapsedTime or timeIncrement was called. + //- Also updated by resetTime and resetTimeIncrement. mutable clockValue last_; @@ -84,13 +85,18 @@ public: // Member Functions - //- Reset to use the current clock value for the start point + //- Reset to use the current clock value for the start + //- and increment points inline void resetTime(); + //- Reset to use the current clock value for the increment point + inline void resetTimeIncrement() const; + //- The time [seconds] since the start point inline double elapsedTime() const; - //- The time [seconds] since the last call to timeIncrement() + //- The time [seconds] since the last call to elapsedTime(), + //- timeIncrement() or resetTime(), resetTimeIncrement() inline double timeIncrement() const; }; diff --git a/src/OpenFOAM/global/clockTime/clockTimeI.H b/src/OpenFOAM/global/clockTime/clockTimeI.H index 6ec10f4d25e7fc5af8ac6090e96ef076d34103e0..92d86af60cca6d28ba5e8961f74aa6d374aca502 100644 --- a/src/OpenFOAM/global/clockTime/clockTimeI.H +++ b/src/OpenFOAM/global/clockTime/clockTimeI.H @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2018-2020 OpenCFD Ltd. + Copyright (C) 2018-2024 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -50,6 +50,12 @@ inline void Foam::clockTime::resetTime() } +inline void Foam::clockTime::resetTimeIncrement() const +{ + last_.update(); +} + + inline double Foam::clockTime::elapsedTime() const { last_.update(); diff --git a/src/OpenFOAM/global/clockValue/clockValue.H b/src/OpenFOAM/global/clockValue/clockValue.H index 6d402abd8c1c20b860783e9a527f72ac086835f9..5dfe3303c7d4593f0e4f84dce2bdd30baf7b6c5d 100644 --- a/src/OpenFOAM/global/clockValue/clockValue.H +++ b/src/OpenFOAM/global/clockValue/clockValue.H @@ -36,8 +36,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef clockValue_H -#define clockValue_H +#ifndef Foam_clockValue_H +#define Foam_clockValue_H #include <chrono> #include <string> @@ -93,10 +93,7 @@ public: // Member Functions //- The time duration - inline const value_type& value() const - { - return value_; - } + const value_type& value() const noexcept { return value_; } //- Reset to zero inline void clear(); diff --git a/src/OpenFOAM/global/cpuTime/cpuTimeCxx.C b/src/OpenFOAM/global/cpuTime/cpuTimeCxx.C index fbb8277975df7833dac5dc1bb249fe17b13369c0..d762851bf8175a28668eb0e58d559a9425b6a031 100644 --- a/src/OpenFOAM/global/cpuTime/cpuTimeCxx.C +++ b/src/OpenFOAM/global/cpuTime/cpuTimeCxx.C @@ -65,6 +65,12 @@ void Foam::cpuTimeCxx::resetCpuTime() } +void Foam::cpuTimeCxx::resetCpuTimeIncrement() const +{ + last_.update(); +} + + double Foam::cpuTimeCxx::elapsedCpuTime() const { last_.update(); diff --git a/src/OpenFOAM/global/cpuTime/cpuTimeCxx.H b/src/OpenFOAM/global/cpuTime/cpuTimeCxx.H index 91e5c939c04513237f60ac8f1841a41e7de52d7b..4f0476fa30511de963ae5d1764523aec314ddf14 100644 --- a/src/OpenFOAM/global/cpuTime/cpuTimeCxx.H +++ b/src/OpenFOAM/global/cpuTime/cpuTimeCxx.H @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2018-2019 OpenCFD Ltd. + Copyright (C) 2018-2024 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -37,8 +37,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef cpuTimeCxx_H -#define cpuTimeCxx_H +#ifndef Foam_cpuTimeCxx_H +#define Foam_cpuTimeCxx_H #include <ctime> @@ -71,7 +71,8 @@ class cpuTimeCxx //- Start time, at the time of construction value_type start_; - //- Last time when elapsedTime or timeIncrement was called + //- Last time when elapsedCpuTime or cpuTimeIncrement was called. + //- Also affected by resetCpuTime and resetCpuTimeIncrement. mutable value_type last_; @@ -91,13 +92,17 @@ public: // Member Functions - //- Reset to use the current time for the start time + //- Reset to use the current time for the start and increment points void resetCpuTime(); + //- Reset to use the current time for the increment point + void resetCpuTimeIncrement() const; + //- Return CPU time (in seconds) from the start double elapsedCpuTime() const; - //- Return CPU time (in seconds) since last call to cpuTimeIncrement() + //- Return CPU time [seconds] since last call to cpuTimeIncrement(), + //- resetCpuTimeIncrement(). double cpuTimeIncrement() const; }; diff --git a/src/OpenFOAM/global/profiling/profilingPstream.H b/src/OpenFOAM/global/profiling/profilingPstream.H index 8256fb1418cdcac89e0fae62f6075b27d908f917..37284223afe5e4f05ef7515fd82ffb4b9134ae1b 100644 --- a/src/OpenFOAM/global/profiling/profilingPstream.H +++ b/src/OpenFOAM/global/profiling/profilingPstream.H @@ -158,7 +158,7 @@ public: { if (!suspend_ && timer_) { - (void) timer_->cpuTimeIncrement(); + timer_->resetCpuTimeIncrement(); } } diff --git a/src/OpenFOAM/meshes/bandCompression/bandCompression.C b/src/OpenFOAM/meshes/bandCompression/bandCompression.C index b2f1a977addeedf59b730c55c2d2660c952a6d35..b03596db79718503c36cb51b1eed485bdf0207a2 100644 --- a/src/OpenFOAM/meshes/bandCompression/bandCompression.C +++ b/src/OpenFOAM/meshes/bandCompression/bandCompression.C @@ -159,6 +159,13 @@ Foam::labelList cuthill_mckee_algorithm } } + // Debug: + // - the peak capacity of queuedCells approximates the + // maximum intermediate bandwidth + #if 0 + Pout<< "bandCompression: peak-capacity=" << queuedCells.capacity() << nl; + #endif + // Now we have new-to-old in newOrder. return newOrder; } @@ -306,8 +313,14 @@ Foam::labelList Foam::meshTools::bandCompression } } - // Now we have new-to-old in newOrder. + // Debug: + // - the peak capacity of queuedCells approximates the + // maximum intermediate bandwidth + #if 0 + Pout<< "bandCompression: peak-capacity=" << queuedCells.capacity() << nl; + #endif + // Now we have new-to-old in newOrder. return newOrder; } diff --git a/src/OpenFOAM/meshes/bandCompression/bandCompression.H b/src/OpenFOAM/meshes/bandCompression/bandCompression.H index d90cca8e5868fcc4b011a3b16dd8617552b35416..00553c7a22c8cf1a0f1fbd0706027154ea1a5553 100644 --- a/src/OpenFOAM/meshes/bandCompression/bandCompression.H +++ b/src/OpenFOAM/meshes/bandCompression/bandCompression.H @@ -103,15 +103,17 @@ labelList bandCompression namespace Foam { -//- Forward to meshTools::bandCompression +//- Deprecated - prefer meshTools::bandCompression() // \deprecated(2022-03) prefer meshTools::bandCompression() +FOAM_DEPRECATED_FOR(2022-03, "meshTools::bandCompression()") inline labelList bandCompression(const labelListList& cellCellAddressing) { return meshTools::bandCompression(cellCellAddressing); } -//- Forward to meshTools::bandCompression +//- Deprecated - prefer meshTools::bandCompression() // \deprecated(2022-03) prefer meshTools::bandCompression() +FOAM_DEPRECATED_FOR(2022-03, "meshTools::bandCompression()") inline labelList bandCompression ( const labelUList& cellCells, diff --git a/src/OpenFOAM/parallel/globalIndex/globalIndex.H b/src/OpenFOAM/parallel/globalIndex/globalIndex.H index f5b82a44cf9429c3244cb10244bc3931cdaa66c2..598c82e5521ce4eb01fa6804919b8d23c49d5968 100644 --- a/src/OpenFOAM/parallel/globalIndex/globalIndex.H +++ b/src/OpenFOAM/parallel/globalIndex/globalIndex.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2017 OpenFOAM Foundation - Copyright (C) 2018-2023 OpenCFD Ltd. + Copyright (C) 2018-2024 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -118,6 +118,16 @@ public: struct gatherNonLocal{}; + // Static Member Functions + + //- Return a null globalIndex (reference to a nullObject). + //- Behaves like an empty globalIndex + static const globalIndex& null() noexcept + { + return NullObjectRef<globalIndex>(); + } + + // Constructors //- Default construct (empty) diff --git a/src/renumber/SloanRenumber/SloanRenumber.C b/src/renumber/SloanRenumber/SloanRenumber.C index 9ef6ca08edc21bdf472ae58e33ae7891de75b380..df5c3f624dfd94f990a433225bf175e59d42e295 100644 --- a/src/renumber/SloanRenumber/SloanRenumber.C +++ b/src/renumber/SloanRenumber/SloanRenumber.C @@ -30,7 +30,6 @@ License #include "SloanRenumber.H" #include "addToRunTimeSelectionTable.H" -#include "globalMeshData.H" #include "processorPolyPatch.H" #include "syncTools.H" @@ -165,8 +164,7 @@ Foam::labelList renumberImpl(Graph& G, const bool useReverse) Foam::labelList Foam::SloanRenumber::renumber ( - const polyMesh& mesh, - const pointField& points + const polyMesh& mesh ) const { // Construct graph : faceOwner + connections across cyclics. @@ -186,7 +184,7 @@ Foam::labelList Foam::SloanRenumber::renumber Graph G(mesh.nCells()); // Add internal faces - forAll(mesh.faceNeighbour(), facei) + for (label facei = 0; facei < mesh.nInternalFaces(); ++facei) { add_edge(mesh.faceOwner()[facei], mesh.faceNeighbour()[facei], G); } @@ -226,8 +224,7 @@ Foam::labelList Foam::SloanRenumber::renumber Foam::labelList Foam::SloanRenumber::renumber ( - const CompactListList<label>& cellCells, - const pointField& + const CompactListList<label>& cellCells ) const { Graph G(cellCells.size()); @@ -251,8 +248,7 @@ Foam::labelList Foam::SloanRenumber::renumber Foam::labelList Foam::SloanRenumber::renumber ( - const labelListList& cellCells, - const pointField& + const labelListList& cellCells ) const { Graph G(cellCells.size()); diff --git a/src/renumber/SloanRenumber/SloanRenumber.H b/src/renumber/SloanRenumber/SloanRenumber.H index 46aa18535670e0ce9032e94955d35965f1a75517..a2c42c5cc3da243fee526fb76f854949cac995bb 100644 --- a/src/renumber/SloanRenumber/SloanRenumber.H +++ b/src/renumber/SloanRenumber/SloanRenumber.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2012-2015 OpenFOAM Foundation - Copyright (C) 2022 OpenCFD Ltd. + Copyright (C) 2022-2024 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -83,44 +83,26 @@ public: //- Toggle reverse on/off void reverse(bool on) noexcept { reverse_ = on; } - //- The renumbering method does not require a polyMesh - virtual bool needs_mesh() const { return false; } + // With mesh topology - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // This is only defined for geometric renumberMethods. - virtual labelList renumber(const pointField&) const - { - NotImplemented; - return labelList(); - } + //- Return the cell visit order (from ordered back to original cell id) + //- using the mesh to determine the connectivity. + virtual labelList renumber(const polyMesh& mesh) const; - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // Use the mesh connectivity (if needed) - virtual labelList renumber - ( - const polyMesh& mesh, - const pointField& cc - ) const; - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). + // With explicit topology + + //- Return the cell visit order (from ordered back to original cell id) virtual labelList renumber ( - const CompactListList<label>& cellCells, - const pointField& cellCentres + const CompactListList<label>& cellCells ) const; - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // The connectivity is equal to mesh.cellCells() except - // - the connections are across coupled patches + //- Return the cell visit order (from ordered back to original cell id) virtual labelList renumber ( - const labelListList& cellCells, - const pointField& cc + const labelListList& cellCells ) const; }; diff --git a/src/renumber/renumberMethods/CuthillMcKeeRenumber/CuthillMcKeeRenumber.C b/src/renumber/renumberMethods/CuthillMcKeeRenumber/CuthillMcKeeRenumber.C index 241be2cbe3077ecbbfb3be5924fa1220705cf7d5..4e7827d50343ce549bd055928d59c6134fea5668 100644 --- a/src/renumber/renumberMethods/CuthillMcKeeRenumber/CuthillMcKeeRenumber.C +++ b/src/renumber/renumberMethods/CuthillMcKeeRenumber/CuthillMcKeeRenumber.C @@ -112,8 +112,7 @@ Foam::reverseCuthillMcKeeRenumber::reverseCuthillMcKeeRenumber Foam::labelList Foam::CuthillMcKeeRenumber::renumber ( - const polyMesh& mesh, - const pointField& + const polyMesh& mesh ) const { labelList orderedToOld = meshTools::bandCompression(mesh); @@ -129,12 +128,10 @@ Foam::labelList Foam::CuthillMcKeeRenumber::renumber Foam::labelList Foam::CuthillMcKeeRenumber::renumber ( - const labelList& cellCells, - const labelList& offsets, - const pointField& cc + const CompactListList<label>& cellCells ) const { - labelList orderedToOld = meshTools::bandCompression(cellCells, offsets); + labelList orderedToOld = meshTools::bandCompression(cellCells); if (reverse_) { @@ -147,8 +144,7 @@ Foam::labelList Foam::CuthillMcKeeRenumber::renumber Foam::labelList Foam::CuthillMcKeeRenumber::renumber ( - const CompactListList<label>& cellCells, - const pointField& + const labelListList& cellCells ) const { labelList orderedToOld = meshTools::bandCompression(cellCells); @@ -162,21 +158,21 @@ Foam::labelList Foam::CuthillMcKeeRenumber::renumber } -Foam::labelList Foam::CuthillMcKeeRenumber::renumber -( - const labelListList& cellCells, - const pointField& -) const -{ - labelList orderedToOld = meshTools::bandCompression(cellCells); - - if (reverse_) - { - Foam::reverse(orderedToOld); - } - - return orderedToOld; -} +// Foam::labelList Foam::CuthillMcKeeRenumber::renumber +// ( +// const labelUList& cellCells, +// const labelUList& offsets +// ) const +// { +// labelList orderedToOld = meshTools::bandCompression(cellCells, offsets); +// +// if (reverse_) +// { +// Foam::reverse(orderedToOld); +// } +// +// return orderedToOld; +// } // ************************************************************************* // diff --git a/src/renumber/renumberMethods/CuthillMcKeeRenumber/CuthillMcKeeRenumber.H b/src/renumber/renumberMethods/CuthillMcKeeRenumber/CuthillMcKeeRenumber.H index 45a07be355476d0f67a8d3eb07ce948e0db8825d..506deef95d5d1cbe839f0b3ca73a0b868f4237cf 100644 --- a/src/renumber/renumberMethods/CuthillMcKeeRenumber/CuthillMcKeeRenumber.H +++ b/src/renumber/renumberMethods/CuthillMcKeeRenumber/CuthillMcKeeRenumber.H @@ -30,6 +30,9 @@ Class Description Cuthill-McKee renumbering (CM or RCM) +SeeAlso + Foam::meshTools::bandCompression + SourceFiles CuthillMcKeeRenumber.C @@ -85,62 +88,32 @@ public: //- Toggle reverse on/off void reverse(bool on) noexcept { reverse_ = on; } - //- The renumbering method does not require a polyMesh - virtual bool needs_mesh() const { return false; } - - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // This is only defined for geometric renumberMethods. - virtual labelList renumber(const pointField&) const - { - NotImplemented; - return labelList(); - } + // With mesh topology - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // Use the mesh connectivity (if needed) + //- Return the cell visit order (from ordered back to original cell id) + //- using the mesh to determine the connectivity. virtual labelList renumber ( //! Mesh connectivity (see globalMeshData::calcCellCells) - const polyMesh& mesh, - //! \em ignored - const pointField& cellCentres + const polyMesh& mesh ) const; - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // Connectivity in losort addressing (= neighbour + offsets into - // neighbour) - virtual labelList renumber - ( - const labelList& cellCells, - const labelList& offsets, - //! \em ignored - const pointField& cellCentres - ) const; - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). + // With explicit topology + + //- Return the cell visit order (from ordered back to original cell id). virtual labelList renumber ( //! Mesh connectivity - const CompactListList<label>& cellCells, - //! \em ignored - const pointField& cellCentres + const CompactListList<label>& cellCells ) const; - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // The connectivity is equal to mesh.cellCells() except - // - the connections are across coupled patches + //- Return the cell visit order (from ordered back to original cell id). virtual labelList renumber ( //! Mesh connectivity - const labelListList& cellCells, - //! \em ignored - const pointField& cellCentres + const labelListList& cellCells ) const; }; diff --git a/src/renumber/renumberMethods/manualRenumber/manualRenumber.C b/src/renumber/renumberMethods/manualRenumber/manualRenumber.C index 61dc4972394a589a68322b93109f29426d82c8bc..875ced3af00534cd71f26aa5244f2d5a6c43b152 100644 --- a/src/renumber/renumberMethods/manualRenumber/manualRenumber.C +++ b/src/renumber/renumberMethods/manualRenumber/manualRenumber.C @@ -68,10 +68,11 @@ Foam::manualRenumber::manualRenumber(const dictionary& dict) Foam::labelList Foam::manualRenumber::renumber ( - const polyMesh& mesh, - const pointField& points + const polyMesh& mesh ) const { + const label nCells = mesh.nCells(); + labelList newToOld ( labelIOList::readContents @@ -87,31 +88,27 @@ Foam::labelList Foam::manualRenumber::renumber ); // Check if the final renumbering is OK - if (newToOld.size() != points.size()) + if (newToOld.size() != nCells) { FatalErrorInFunction - << "Size of renumber list does not correspond " - << "to the number of points. Size: " - << newToOld.size() << " Number of points: " - << points.size() - << ".\n" << "Manual renumbering data read from file " - << dataFile_ << "." << endl + << "Size of renumber list: " + << newToOld.size() << " != number of cells: " << nCells << nl + << "Renumbering data read from file " << dataFile_ << endl << exit(FatalError); } // Invert to see if one to one - labelList oldToNew(points.size(), -1); + labelList oldToNew(nCells, -1); forAll(newToOld, i) { const label origCelli = newToOld[i]; - if (origCelli < 0 || origCelli >= points.size()) + if (origCelli < 0 || origCelli >= nCells) { FatalErrorInFunction - << "Renumbering is not one-to-one. Index " - << i << " maps onto original cell " << origCelli - << ".\n" << "Manual renumbering data read from file " - << dataFile_ << nl + << "Renumbering range error. Index " << i + << " maps to cell " << origCelli << " from " << nCells << nl + << "Renumbering data read from file " << dataFile_ << endl << exit(FatalError); } @@ -124,8 +121,7 @@ Foam::labelList Foam::manualRenumber::renumber FatalErrorInFunction << "Renumbering is not one-to-one. Index " << i << " and " << oldToNew[origCelli] << " map onto " << origCelli << nl - << "Manual renumbering data read from file " - << dataFile_ << nl + << "Renumbering data read from file " << dataFile_ << endl << exit(FatalError); } } diff --git a/src/renumber/renumberMethods/manualRenumber/manualRenumber.H b/src/renumber/renumberMethods/manualRenumber/manualRenumber.H index 208a6d959b5bee7b97ca64f9f32f3e77c0612bb2..42cfded2049eadc679bc528c8137ccdc258c9ce7 100644 --- a/src/renumber/renumberMethods/manualRenumber/manualRenumber.H +++ b/src/renumber/renumberMethods/manualRenumber/manualRenumber.H @@ -80,41 +80,31 @@ public: virtual bool needs_mesh() const { return true; } - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - virtual labelList renumber(const pointField&) const - { - NotImplemented; - return labelList(); - } + // With mesh topology - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // Uses mesh for regIOobject - virtual labelList renumber - ( - const polyMesh& mesh, - const pointField& cc - ) const; + //- Return the cell visit order (from ordered back to original cell id) + //- using the mesh for its IOobject and instance. + virtual labelList renumber(const polyMesh& mesh) const; + + + // With explicit topology - Not implemented! - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). + //- Return the cell visit order (from ordered back to original cell id) + //- Not implemented! virtual labelList renumber ( - const CompactListList<label>& cellCells, - const pointField& cellCentres + const CompactListList<label>& cellCells ) const { NotImplemented; return labelList(); } - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). + //- Return the cell visit order (from ordered back to original cell id) + //- Not implemented! virtual labelList renumber ( - const labelListList& cellCells, - const pointField& cellCentres + const labelListList& cellCells ) const { NotImplemented; diff --git a/src/renumber/renumberMethods/noRenumber/noRenumber.C b/src/renumber/renumberMethods/noRenumber/noRenumber.C index 638783039990626343df9bb40f08340037d4cbfc..2e647b0004832b218d15914a60bbe85256270c08 100644 --- a/src/renumber/renumberMethods/noRenumber/noRenumber.C +++ b/src/renumber/renumberMethods/noRenumber/noRenumber.C @@ -60,6 +60,15 @@ Foam::noRenumber::noRenumber(const dictionary& dict) // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // +Foam::labelList Foam::noRenumber::renumber +( + const label nCells +) const +{ + return Foam::identity(nCells); +} + + Foam::labelList Foam::noRenumber::renumber ( const pointField& cellCentres @@ -71,8 +80,7 @@ Foam::labelList Foam::noRenumber::renumber Foam::labelList Foam::noRenumber::renumber ( - const polyMesh& mesh, - const pointField& + const polyMesh& mesh ) const { return Foam::identity(mesh.nCells()); @@ -81,8 +89,7 @@ Foam::labelList Foam::noRenumber::renumber Foam::labelList Foam::noRenumber::renumber ( - const CompactListList<label>& cellCells, - const pointField& + const CompactListList<label>& cellCells ) const { return Foam::identity(cellCells.size()); @@ -91,8 +98,7 @@ Foam::labelList Foam::noRenumber::renumber Foam::labelList Foam::noRenumber::renumber ( - const labelListList& cellCells, - const pointField& + const labelListList& cellCells ) const { return Foam::identity(cellCells.size()); diff --git a/src/renumber/renumberMethods/noRenumber/noRenumber.H b/src/renumber/renumberMethods/noRenumber/noRenumber.H index 98273362da1608c953062f057dd308ac06d6ae0f..03a5c37018cf888082dfcc8df1a5d171a52476b0 100644 --- a/src/renumber/renumberMethods/noRenumber/noRenumber.H +++ b/src/renumber/renumberMethods/noRenumber/noRenumber.H @@ -73,42 +73,48 @@ public: // Member Functions - //- The renumbering method does not require a polyMesh - virtual bool needs_mesh() const { return false; } + //- Renumbering method without mesh or cell-cell topology! + virtual bool no_topology() const { return true; } - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). + // No topology + + //- Return the cell visit order (from ordered back to original cell id) + //- based solely on the number of cells. + virtual labelList renumber(const label nCells) const; + + //- Return the cell visit order (from ordered back to original cell id). + //- based solely on pointField size virtual labelList renumber(const pointField&) const; - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). + + // With mesh topology + + //- Return the cell visit order (from ordered back to original cell id) + //- using the mesh only for the number of cells virtual labelList renumber ( - //! Mesh number of cells - const polyMesh& mesh, - //! \em ignored - const pointField& cellCentres + //! Mesh provides the number of cells + const polyMesh& mesh ) const; - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). + + // With explicit topology + + //- Return the cell visit order (from ordered back to original cell id) + //- using the topology only for the number of cells virtual labelList renumber ( - //! Mesh connectivity for number of cells - const CompactListList<label>& cellCells, - //! \em ignored - const pointField& cellCentres + //! Connectivity provides the number of cells + const CompactListList<label>& cellCells ) const; - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). + //- Return the cell visit order (from ordered back to original cell id) + //- using the topology only for the number of cells virtual labelList renumber ( - //! Mesh connectivity for number of cells - const labelListList& cellCells, - //! \em ignored - const pointField& cellCentres + //! Connectivity provides the number of cells + const labelListList& cellCells ) const; }; diff --git a/src/renumber/renumberMethods/randomRenumber/randomRenumber.C b/src/renumber/renumberMethods/randomRenumber/randomRenumber.C index 4ae111352d71f6036e6897d731445137b8438ae4..2a79a544cb75c500fff3fd0f56a65b899d468f74 100644 --- a/src/renumber/renumberMethods/randomRenumber/randomRenumber.C +++ b/src/renumber/renumberMethods/randomRenumber/randomRenumber.C @@ -86,6 +86,15 @@ Foam::randomRenumber::randomRenumber(const dictionary& dict) // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // +Foam::labelList Foam::randomRenumber::renumber +( + const label nCells +) const +{ + return randomMap(nCells); +} + + Foam::labelList Foam::randomRenumber::renumber ( const pointField& cellCentres @@ -97,8 +106,7 @@ Foam::labelList Foam::randomRenumber::renumber Foam::labelList Foam::randomRenumber::renumber ( - const polyMesh& mesh, - const pointField& + const polyMesh& mesh ) const { return randomMap(mesh.nCells()); @@ -107,8 +115,7 @@ Foam::labelList Foam::randomRenumber::renumber Foam::labelList Foam::randomRenumber::renumber ( - const CompactListList<label>& cellCells, - const pointField& + const CompactListList<label>& cellCells ) const { return randomMap(cellCells.size()); @@ -117,8 +124,7 @@ Foam::labelList Foam::randomRenumber::renumber Foam::labelList Foam::randomRenumber::renumber ( - const labelListList& cellCells, - const pointField& + const labelListList& cellCells ) const { return randomMap(cellCells.size()); diff --git a/src/renumber/renumberMethods/randomRenumber/randomRenumber.H b/src/renumber/renumberMethods/randomRenumber/randomRenumber.H index 5769be0ce7448c50b89ffab162409bf7bf2422c1..8637f2e977b37a55291128c70d80edfd4d90cc5f 100644 --- a/src/renumber/renumberMethods/randomRenumber/randomRenumber.H +++ b/src/renumber/renumberMethods/randomRenumber/randomRenumber.H @@ -72,42 +72,48 @@ public: // Member Functions - //- The renumbering method does not require a polyMesh - virtual bool needs_mesh() const { return false; } + //- Renumbering method without mesh or cell-cell topology! + virtual bool no_topology() const { return true; } - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). + // No topology + + //- Return the cell visit order (from ordered back to original cell id) + //- based solely on the number of cells. + virtual labelList renumber(const label nCells) const; + + //- Return the cell visit order (from ordered back to original cell id). + //- based solely on pointField size virtual labelList renumber(const pointField&) const; - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). + + // With mesh topology + + //- Return the cell visit order (from ordered back to original cell id) + //- using the mesh only for the number of cells virtual labelList renumber ( - //! Mesh number of cells - const polyMesh& mesh, - //! \em ignored - const pointField& cellCentres + //! Mesh provides the number of cells + const polyMesh& mesh ) const; - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). + + // With explicit topology + + //- Return the cell visit order (from ordered back to original cell id) + //- using the topology only for the number of cells virtual labelList renumber ( - //! Mesh connectivity for number of cells - const CompactListList<label>& cellCells, - //! \em ignored - const pointField& cellCentres + //! Connectivity provides the number of cells + const CompactListList<label>& cellCells ) const; - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). + //- Return the cell visit order (from ordered back to original cell id) + //- using the topology only for the number of cells virtual labelList renumber ( - //! Mesh connectivity for number of cells - const labelListList& cellCells, - //! \em ignored - const pointField& cellCentres + //! Connectivity provides the number of cells + const labelListList& cellCells ) const; }; diff --git a/src/renumber/renumberMethods/renumberMethod/renumberMethod.C b/src/renumber/renumberMethods/renumberMethod/renumberMethod.C index 7cb556bd8f2ba1e1aeb30a1bd4d2a168e3fe13cd..cd31aac8326f53eda7a17fe27d780559c8bef86a 100644 --- a/src/renumber/renumberMethods/renumberMethod/renumberMethod.C +++ b/src/renumber/renumberMethods/renumberMethod/renumberMethod.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2015 OpenFOAM Foundation - Copyright (C) 2019-2023 OpenCFD Ltd. + Copyright (C) 2019-2024 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -82,56 +82,37 @@ Foam::autoPtr<Foam::renumberMethod> Foam::renumberMethod::New // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -Foam::labelList Foam::renumberMethod::renumber -( - const pointField& -) const +Foam::labelList Foam::renumberMethod::renumber(const label nCells) const { NotImplemented; return labelList(); } -Foam::labelList Foam::renumberMethod::renumber -( - const polyMesh& mesh, - const pointField& points -) const +Foam::labelList Foam::renumberMethod::renumber(const pointField& cc) const { - // Local mesh connectivity - CompactListList<label> cellCells; - globalMeshData::calcCellCells(mesh, cellCells); - - return renumber(cellCells, points); + NotImplemented; + return labelList(); } Foam::labelList Foam::renumberMethod::renumber ( - const CompactListList<label>& cellCells, - const pointField& points + const polyMesh& mesh ) const { - return renumber(cellCells.unpack(), points); -} - + // Local mesh connectivity + CompactListList<label> cellCells; + globalMeshData::calcCellCells(mesh, cellCells); -Foam::labelList Foam::renumberMethod::renumber -( - const labelList& cellCells, - const labelList& offsets, - const pointField& cc -) const -{ - NotImplemented; - return labelList(); + return renumber(cellCells); } Foam::labelList Foam::renumberMethod::renumber ( const polyMesh& mesh, - const labelList& fineToCoarse, + const labelUList& fineToCoarse, const pointField& coarsePoints ) const { @@ -140,16 +121,13 @@ Foam::labelList Foam::renumberMethod::renumber ( mesh, fineToCoarse, - coarsePoints.size(), + coarsePoints.size(), // nLocalCoarse false, // local only (parallel = false) coarseCellCells ); // Renumber based on agglomerated points - labelList coarseDistribution - ( - renumber(coarseCellCells, coarsePoints) - ); + labelList coarseDistribution = renumber(coarseCellCells); // From coarse back to fine for original mesh return labelList(coarseDistribution, fineToCoarse); diff --git a/src/renumber/renumberMethods/renumberMethod/renumberMethod.H b/src/renumber/renumberMethods/renumberMethod/renumberMethod.H index 9bfa6dd6c5412e3989034600564871ce4117e252..ec751c5eeb672204cd370e0ef3c5585e12a58139 100644 --- a/src/renumber/renumberMethods/renumberMethod/renumberMethod.H +++ b/src/renumber/renumberMethods/renumberMethod/renumberMethod.H @@ -98,72 +98,99 @@ public: // Member Functions - //- Does renumbering method require a polyMesh? + //- Renumbering method without mesh or cell-cell topology + //- (very special case) + virtual bool no_topology() const { return false; } + + //- Renumbering method requires a polyMesh for its topology virtual bool needs_mesh() const { return false; } // No topology - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // This is only defined for geometric renumber methods. + //- Return the cell visit order (from ordered back to original cell id) + //- based solely on the number of cells. + // Only applicable for no_topology() methods. + virtual labelList renumber(const label nCells) const; + + //- Return the cell visit order (from ordered back to original cell id) + //- based solely on the cell centres (or number of cell centres). + // Only applicable for no_topology() methods. virtual labelList renumber(const pointField&) const; - // Topology provided by mesh + // With mesh topology + + //- Return the cell visit order (from ordered back to original cell id) + //- using the mesh to determine the connectivity. + virtual labelList renumber(const polyMesh& mesh) const; + - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // Use the mesh connectivity (if needed) - virtual labelList renumber(const polyMesh&, const pointField&) const; + // With explicit topology - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // Gets passed agglomeration map (from fine to coarse cells) and coarse - // cell - // location. Can be overridden by renumberMethods that provide this - // functionality natively. Coarse cells are local to the processor - // (if in parallel). If you want to have coarse cells spanning - // processors use the globalCellCells instead. + //- Return the cell visit order (from ordered back to original cell id), virtual labelList renumber ( - const polyMesh& mesh, - const labelList& fineToCoarse, - const pointField& coarsePoints - ) const; + //! Mesh connectivity + const CompactListList<label>& cellCells + ) const = 0; + + //- Return the cell visit order (from ordered back to original cell id), + virtual labelList renumber + ( + //! Mesh connectivity + const labelListList& cellCells + ) const = 0; - // Topology provided explicitly + // Housekeeping - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // Addressing in losort addressing (= neighbour + offsets into - // neighbour) + //- Deprecated - the pointField is unused + // \deprecated(2024-03) the pointField is unused + FOAM_DEPRECATED_FOR(2024-03, "renumber(const polyMesh&)") virtual labelList renumber ( - const labelList& cellCells, - const labelList& offsets, + const polyMesh& mesh, const pointField& - ) const; - - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // Uses 'unpack' internally, so should be overloaded when possible + ) const + { + return renumber(mesh); + } + + //- Deprecated - the pointField is unused + // \deprecated(2024-03) the pointField is unused + FOAM_DEPRECATED_FOR(2024-03, "renumber(const CompactListList<label>&)") virtual labelList renumber ( const CompactListList<label>& cellCells, - const pointField& cellCentres - ) const; - - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // The connectivity is equal to mesh.cellCells() except - // - the connections are across coupled patches + const pointField& + ) const + { + return renumber(cellCells); + } + + //- Deprecated - the pointField is unused + // \deprecated(2024-03) the pointField is unused + FOAM_DEPRECATED_FOR(2024-03, "renumber(const labelListList&)") virtual labelList renumber ( const labelListList& cellCells, - const pointField& cellCentres - ) const = 0; + const pointField& + ) const + { + return renumber(cellCells); + } + + //- Deprecated - renumbering with agglomeration map. + //- Calculate globalCellCells directly + // \deprecated(2024-03) calculate globalCellCells directly + FOAM_DEPRECATED_FOR(2024-03, "calcCellCells and renumber separately") + virtual labelList renumber + ( + const polyMesh& mesh, + const labelUList& fineToCoarse, + const pointField& coarsePoints + ) const; }; diff --git a/src/renumber/renumberMethods/springRenumber/springRenumber.C b/src/renumber/renumberMethods/springRenumber/springRenumber.C index b0063d6b59b4af0ade078017297738f8ec2e45fe..c46a8ef5f4ec67ed939560d8bce4e1e4c385dc8b 100644 --- a/src/renumber/renumberMethods/springRenumber/springRenumber.C +++ b/src/renumber/renumberMethods/springRenumber/springRenumber.C @@ -159,8 +159,7 @@ Foam::labelList Foam::springRenumber::renumberImpl Foam::labelList Foam::springRenumber::renumber ( - const polyMesh& mesh, - const pointField& + const polyMesh& mesh ) const { // Local mesh connectivity @@ -173,8 +172,7 @@ Foam::labelList Foam::springRenumber::renumber Foam::labelList Foam::springRenumber::renumber ( - const CompactListList<label>& cellCells, - const pointField& + const CompactListList<label>& cellCells ) const { return renumberImpl(cellCells); @@ -183,8 +181,7 @@ Foam::labelList Foam::springRenumber::renumber Foam::labelList Foam::springRenumber::renumber ( - const labelListList& cellCells, - const pointField& + const labelListList& cellCells ) const { return renumberImpl(cellCells); diff --git a/src/renumber/renumberMethods/springRenumber/springRenumber.H b/src/renumber/renumberMethods/springRenumber/springRenumber.H index bf0d8ac8b5177c14709376139c2dbdee3d30debc..5d95ca1469cf82ed67d39fd42ceda3826c8a7380 100644 --- a/src/renumber/renumberMethods/springRenumber/springRenumber.H +++ b/src/renumber/renumberMethods/springRenumber/springRenumber.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2015 OpenFOAM Foundation - Copyright (C) 2022 OpenCFD Ltd. + Copyright (C) 2022-2024 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -111,40 +111,31 @@ public: // Member Functions - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // This is only defined for geometric renumberMethods. - virtual labelList renumber(const pointField&) const - { - NotImplemented; - return labelList(); - } - - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // Use the mesh connectivity (if needed) + // With mesh topology + + //- Return the cell visit order (from ordered back to original cell id) + //- using the mesh to determine the connectivity. virtual labelList renumber ( - const polyMesh& mesh, - const pointField& + //! Mesh connectivity (see globalMeshData::calcCellCells) + const polyMesh& mesh ) const; - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). + + // With explicit topology + + //- Return the cell visit order (from ordered back to original cell id) virtual labelList renumber ( - const CompactListList<label>& cellCells, - const pointField& cellCentres + //! Mesh connectivity + const CompactListList<label>& cellCells ) const; - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // The connectivity is equal to mesh.cellCells() except - // - the connections are across coupled patches + //- Return the cell visit order (from ordered back to original cell id) virtual labelList renumber ( - const labelListList& cellCells, - const pointField& cellCentres + //! Mesh connectivity + const labelListList& cellCells ) const; }; diff --git a/src/renumber/renumberMethods/structuredRenumber/structuredRenumber.C b/src/renumber/renumberMethods/structuredRenumber/structuredRenumber.C index f5a13168a975a74e95511ae588a85ed1c1130d71..7f250083379d0752fc217e7f2697d45615f4dc9f 100644 --- a/src/renumber/renumberMethods/structuredRenumber/structuredRenumber.C +++ b/src/renumber/renumberMethods/structuredRenumber/structuredRenumber.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2012-2017 OpenFOAM Foundation - Copyright (C) 2018-2020 OpenCFD Ltd. + Copyright (C) 2018-2024 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -137,18 +137,9 @@ bool Foam::structuredRenumber::layerLess::operator() Foam::labelList Foam::structuredRenumber::renumber ( - const polyMesh& mesh, - const pointField& points + const polyMesh& mesh ) const { - if (points.size() != mesh.nCells()) - { - FatalErrorInFunction - << "Number of points " << points.size() - << " should equal the number of cells " << mesh.nCells() - << exit(FatalError); - } - const polyBoundaryMesh& pbm = mesh.boundaryMesh(); const labelHashSet patchIDs(pbm.patchSet(patches_)); @@ -187,21 +178,20 @@ Foam::labelList Foam::structuredRenumber::renumber dynamic_cast<const fvMesh&>(mesh), patchCells ); - const fvMesh& subMesh = subsetter.subMesh(); - pointField subPoints(points, subsetter.cellMap()); + const labelList& cellMap = subsetter.cellMap(); // Locally renumber the layer of cells - labelList subOrder(method_().renumber(subMesh, subPoints)); + labelList subOrder = method_().renumber(subsetter.subMesh()); labelList subOrigToOrdered(invert(subOrder.size(), subOrder)); - globalIndex globalSubCells(subOrder.size()); + const globalIndex globalSubCells(subOrder.size()); // Transfer to final decomposition and convert into global numbering forAll(subOrder, i) { - orderedToOld[subsetter.cellMap()[i]] = + orderedToOld[cellMap[i]] = globalSubCells.toGlobal(subOrigToOrdered[i]); } } @@ -253,11 +243,7 @@ Foam::labelList Foam::structuredRenumber::renumber // by any visited cell so are used only if the number of nLayers is limited. labelList oldToOrdered ( - invert - ( - mesh.nCells(), - method_().renumber(mesh, points) - ) + invert(mesh.nCells(), method_().renumber(mesh)) ); // Use specialised sorting to sorted either layers or columns first diff --git a/src/renumber/renumberMethods/structuredRenumber/structuredRenumber.H b/src/renumber/renumberMethods/structuredRenumber/structuredRenumber.H index f436862832320b7226580b91950894563b63aa79..37477cfe15abdbcf941d0bbf300e02a1e8447e1a 100644 --- a/src/renumber/renumberMethods/structuredRenumber/structuredRenumber.H +++ b/src/renumber/renumberMethods/structuredRenumber/structuredRenumber.H @@ -132,46 +132,38 @@ public: // Member Functions - //- Renumbering method requires a polyMesh + //- Renumbering method requires a polyMesh! virtual bool needs_mesh() const { return true; } - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // This is only defined for geometric renumberMethods. - virtual labelList renumber(const pointField&) const - { - NotImplemented; - return labelList(); - } + // With mesh topology - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // Use the mesh connectivity (if needed) + //- Return the cell visit order (from ordered back to original cell id) + // using the mesh. virtual labelList renumber ( - const polyMesh& mesh, - const pointField& cc + const polyMesh& mesh ) const; - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). + + // With explicit topology - Not implemented! + + //- Return the cell visit order (from ordered back to original cell id). + //- Not implemented! virtual labelList renumber ( - const CompactListList<label>& cellCells, - const pointField& cellCentres + const CompactListList<label>& cellCells ) const { NotImplemented; return labelList(); } - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). + //- Return the cell visit order (from ordered back to original cell id). + //- Not implemented! virtual labelList renumber ( - const labelListList& cellCells, - const pointField& cellCentres + const labelListList& cellCells ) const { NotImplemented; diff --git a/src/renumber/zoltanRenumber/zoltanRenumber.C b/src/renumber/zoltanRenumber/zoltanRenumber.C index 5cd44e11932450fbc3ec902af2c39ad586b90016..58348e8dc9355047f10ad1e2e2087a9600ea323b 100644 --- a/src/renumber/zoltanRenumber/zoltanRenumber.C +++ b/src/renumber/zoltanRenumber/zoltanRenumber.C @@ -24,10 +24,7 @@ License You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. -Class - Foam::zoltanRenumber - -Description +Notes Renumber using Zoltan Zoltan install: @@ -46,9 +43,6 @@ Description --prefix=$ZOLTAN_ARCH_DIR \ --with-ccflags=-fPIC --with-cxxflags=-fPIC --with-ldflags=-shared -SourceFiles - zoltanRenumber.C - \*---------------------------------------------------------------------------*/ #include "zoltanRenumber.H" @@ -365,8 +359,7 @@ Foam::zoltanRenumber::zoltanRenumber(const dictionary& dict) Foam::labelList Foam::zoltanRenumber::renumber ( - const polyMesh& pMesh, - const pointField& points + const polyMesh& pMesh ) const { // Zoltan_Initialize will trigger MPI_Init() if not already done. diff --git a/src/renumber/zoltanRenumber/zoltanRenumber.H b/src/renumber/zoltanRenumber/zoltanRenumber.H index b6f7c625ef23049a2001a6233bb3a0732d342526..c7446ec297a0956ecd645113ff5c127946ebfe23 100644 --- a/src/renumber/zoltanRenumber/zoltanRenumber.H +++ b/src/renumber/zoltanRenumber/zoltanRenumber.H @@ -83,46 +83,38 @@ public: // Member Functions - //- Renumbering method requires a polyMesh + //- Renumbering method requires a polyMesh for its topology virtual bool needs_mesh() const { return true; } - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // This is only defined for geometric renumberMethods. - virtual labelList renumber(const pointField&) const - { - NotImplemented; - return labelList(); - } + // With mesh topology - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). - // Use the mesh connectivity (if needed) + //- Return the cell visit order (from ordered back to original cell id) + //- uses the mesh for connectivity and global exchanges virtual labelList renumber ( - const polyMesh& mesh, - const pointField& cc + const polyMesh& mesh ) const; - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). + + // With explicit topology - Not implemented! + + //- Return the cell visit order (from ordered back to original cell id). + //- Not implemented! virtual labelList renumber ( - const CompactListList<label>& cellCells, - const pointField& cellCentres + const CompactListList<label>& cellCells ) const { NotImplemented; return labelList(); } - //- Return the order in which cells need to be visited - //- (ie. from ordered back to original cell label). + //- Return the cell visit order (from ordered back to original cell id). + //- Not implemented! virtual labelList renumber ( - const labelListList& cellCells, - const pointField& cellCentres + const labelListList& cellCells ) const { NotImplemented;