From db16d8084019b787560a9229e4ee82713697919c Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Mon, 17 Jul 2023 18:27:55 +0200 Subject: [PATCH] ENH: use objectRegistry/IOobjectList sorted instead of lookupClass - in most cases a parallel-consistent order is required. Even when the order is not important, it will generally require fewer allocations to create a UPtrList of entries instead of a HashTable or even a wordList. --- .../localDensityAbsorptionEmission.C | 6 +- .../utilities/mesh/advanced/PDRMesh/PDRMesh.C | 385 ++++++++---------- .../mesh/manipulation/rotateMesh/rotateMesh.C | 9 +- .../splitMeshRegions/splitMeshRegions.C | 24 +- .../mesh/manipulation/subsetMesh/subsetMesh.C | 274 +++++-------- .../miscellaneous/patchSummary/patchSummary.C | 111 +++-- .../patchSummary/patchSummaryTemplates.C | 46 ++- .../patchSummary/patchSummaryTemplates.H | 49 +-- .../decomposePar/domainDecomposition.C | 29 +- .../reconstructPar/reconstructPar.C | 12 +- .../parFvFieldDistributorTemplates.C | 73 ++-- .../parLagrangianDistributor.C | 2 +- .../parLagrangianDistributorTemplates.C | 13 +- .../foamDataToFluent/foamDataToFluent.C | 57 +-- .../foamDataToFluent/writeFluentFields.H | 42 +- .../foamDataToFluent/writeFluentScalarField.C | 30 +- .../foamDataToFluent/writeFluentVectorField.C | 30 +- .../foamToEnsight/checkFieldAvailability.H | 6 +- .../dataConversion/foamToEnsight/readFields.H | 20 +- .../foamToEnsight/writeAreaFields.H | 8 +- .../foamToEnsight/writeDimFields.H | 8 +- .../foamToEnsight/writePointFields.H | 10 +- .../foamToEnsight/writeVolFields.H | 8 +- .../foamToTetDualMesh/foamToTetDualMesh.C | 22 +- .../dataConversion/foamToVTK/readFields.C | 4 +- .../steadyParticleTracksTemplates.C | 22 +- .../temporalInterpolate/temporalInterpolate.C | 35 +- .../foamUpgradeCyclics/foamUpgradeCyclics.C | 181 ++------ .../mapFields/MapConsistentVolFields.H | 19 +- .../mapFields/MapLagrangianFields.H | 208 +++++----- .../preProcessing/mapFields/MapVolFields.H | 15 +- .../preProcessing/mapFields/UnMapped.H | 6 +- .../mapFieldsPar/MapLagrangianFields.H | 237 +++++------ .../preProcessing/mapFieldsPar/MapVolFields.H | 25 +- .../preProcessing/mapFieldsPar/UnMapped.H | 6 +- .../DimensionedField/MapDimensionedFields.H | 20 +- .../GeometricField/MapGeometricFields.H | 33 +- .../fields/ReadFields/ReadFieldsTemplates.C | 86 ++-- src/OpenFOAM/fields/cloud/mapClouds.H | 12 +- .../Identifiers/patch/coupleGroupIdentifier.C | 15 +- .../fieldsDistributorTemplates.C | 16 +- .../dynamicRefineFvMesh/dynamicRefineFvMesh.C | 54 ++- .../dynamicRefineFvMeshTemplates.C | 38 +- .../fvMeshAdder/fvMeshAdderTemplates.C | 189 ++++----- .../fvMeshDistributeTemplates.C | 132 +++--- .../polyMeshFilter/polyMeshFilter.H | 5 +- .../polyMeshFilter/polyMeshFilterTemplates.C | 33 +- src/dynamicMesh/setUpdater/setUpdater.H | 6 +- .../setUpdater/setUpdaterTemplates.C | 49 ++- .../vtk/read/vtkUnstructuredReaderTemplates.C | 14 +- .../solutionControl/loopControl/loopControl.C | 10 +- .../solutionControlTemplates.C | 6 +- .../fvMesh/fvMeshTools/fvMeshToolsTemplates.C | 46 +-- .../field/externalCoupled/externalCoupled.C | 2 +- .../field/mapFields/mapFieldsTemplates.C | 20 +- .../nearWallFields/nearWallFieldsTemplates.C | 25 +- .../particleDistribution.C | 8 +- .../regionSizeDistribution.C | 25 +- src/functionObjects/field/setFlow/setFlow.C | 2 +- .../surfaceInterpolateTemplates.C | 10 +- src/functionObjects/forces/forces/forces.C | 9 +- .../forces/propellerInfo/propellerInfo.C | 2 +- .../meshRefinement/meshRefinementTemplates.C | 36 +- .../cellCellStencilTemplates.C | 14 +- .../distributedTriSurfaceMeshTemplates.C | 11 +- .../setTimeStepFaRegionsFunctionObject.C | 23 +- ...sRadiativeCoupledMixedFvPatchScalarField.C | 46 ++- ...sRadiativeCoupledMixedFvPatchScalarField.H | 9 +- .../sampledSet/sampledSets/sampledSets.C | 3 +- .../basic/basicThermo/basicThermo.C | 17 +- 70 files changed, 1300 insertions(+), 1758 deletions(-) diff --git a/applications/solvers/multiphase/icoReactingMultiphaseInterFoam/laserDTRM/localDensityAbsorptionEmission/localDensityAbsorptionEmission.C b/applications/solvers/multiphase/icoReactingMultiphaseInterFoam/laserDTRM/localDensityAbsorptionEmission/localDensityAbsorptionEmission.C index 11225dc2a1..72e3d08d90 100644 --- a/applications/solvers/multiphase/icoReactingMultiphaseInterFoam/laserDTRM/localDensityAbsorptionEmission/localDensityAbsorptionEmission.C +++ b/applications/solvers/multiphase/icoReactingMultiphaseInterFoam/laserDTRM/localDensityAbsorptionEmission/localDensityAbsorptionEmission.C @@ -52,7 +52,9 @@ namespace Foam const Foam::volScalarField& Foam::radiation::localDensityAbsorptionEmission::alpha(word alphaName) const { - if (!mesh_.foundObject(alphaName)) + const volScalarField* ptr = mesh_.cfindObject(alphaName); + + if (!ptr) { FatalErrorInFunction << "Unable to retrieve density field " << alphaName << " from " @@ -60,7 +62,7 @@ Foam::radiation::localDensityAbsorptionEmission::alpha(word alphaName) const << exit(FatalError); } - return mesh_.lookupObject(alphaName); + return *ptr; } diff --git a/applications/utilities/mesh/advanced/PDRMesh/PDRMesh.C b/applications/utilities/mesh/advanced/PDRMesh/PDRMesh.C index b3ec7e2fd7..645a5073d1 100644 --- a/applications/utilities/mesh/advanced/PDRMesh/PDRMesh.C +++ b/applications/utilities/mesh/advanced/PDRMesh/PDRMesh.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation - Copyright (C) 2016-2022 OpenCFD Ltd. + Copyright (C) 2016-2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -131,40 +131,56 @@ void modifyOrAddFace template -void subsetVolFields +PtrList> subsetVolFields ( const fvMeshSubset& subsetter, const IOobjectList& objects, const label patchi, - const Type& exposedValue, - PtrList>& subFields + const Type& exposedValue ) { typedef GeometricField GeoField; const fvMesh& baseMesh = subsetter.baseMesh(); + const UPtrList fieldObjects + ( + objects.csorted() + ); + + PtrList subFields(fieldObjects.size()); + label nFields = 0; - - for (const word& fieldName : objects.sortedNames()) + for (const IOobject& io : fieldObjects) { - const IOobject* ioptr = objects.findObject(fieldName); - if (!nFields) { - Info<< "Subsetting " << GeoField::typeName << nl; + Info<< "Subsetting " << GeoField::typeName << " ("; } - Info<< " " << fieldName << endl; + else + { + Info<< ' '; + } + Info<< " " << io.name() << endl; - GeoField origField(*ioptr, baseMesh); + // Read unregistered + IOobject rio(io, IOobjectOption::NO_REGISTER); + GeoField origField(rio, baseMesh); subFields.set(nFields, subsetter.interpolate(origField)); + auto& subField = subFields[nFields]; + ++nFields; + + + // Subsetting adds 'subset' prefix. Rename field to be like original. + subField.rename(io.name()); + subField.writeOpt(IOobjectOption::AUTO_WRITE); + // Explicitly set exposed faces (in patchi) to exposedValue. if (patchi >= 0) { - fvPatchField& fld = - subFields[nFields].boundaryFieldRef()[patchi]; + fvPatchField& fld = subField.boundaryFieldRef()[patchi]; const label newStart = fld.patch().patch().start(); const label oldPatchi = subsetter.patchMap()[patchi]; @@ -195,48 +211,68 @@ void subsetVolFields } } } - - ++nFields; } } + + if (nFields) + { + Info<< ')' << nl; + } + + return subFields; } template -void subsetSurfaceFields +PtrList> subsetSurfaceFields ( const fvMeshSubset& subsetter, const IOobjectList& objects, const label patchi, - const Type& exposedValue, - PtrList>& subFields + const Type& exposedValue ) { typedef GeometricField GeoField; const fvMesh& baseMesh = subsetter.baseMesh(); + const UPtrList fieldObjects + ( + objects.csorted() + ); + + PtrList subFields(fieldObjects.size()); + label nFields = 0; - - for (const word& fieldName : objects.sortedNames()) + for (const IOobject& io : fieldObjects) { - const IOobject* ioptr = objects.findObject(fieldName); - if (!nFields) { - Info<< "Subsetting " << GeoField::typeName << nl; + Info<< "Subsetting " << GeoField::typeName << " ("; } - Info<< " " << fieldName << endl; + else + { + Info<< ' '; + } + Info<< io.name(); - GeoField origField(*ioptr, baseMesh); + // Read unregistered + IOobject rio(io, IOobjectOption::NO_REGISTER); + GeoField origField(rio, baseMesh); subFields.set(nFields, subsetter.interpolate(origField)); + auto& subField = subFields[nFields]; + ++nFields; + + // Subsetting adds 'subset' prefix. Rename field to be like original. + subField.rename(io.name()); + subField.writeOpt(IOobjectOption::AUTO_WRITE); + // Explicitly set exposed faces (in patchi) to exposedValue. if (patchi >= 0) { - fvsPatchField& fld = - subFields[nFields].boundaryFieldRef()[patchi]; + fvsPatchField& fld = subField.boundaryFieldRef()[patchi]; const label newStart = fld.patch().patch().start(); const label oldPatchi = subsetter.patchMap()[patchi]; @@ -268,9 +304,14 @@ void subsetSurfaceFields } } } - - ++nFields; } + + if (nFields) + { + Info<< ')' << nl; + } + + return subFields; } @@ -284,16 +325,9 @@ void initCreatedPatches const typename GeoField::value_type initValue ) { - HashTable fields - ( - mesh.objectRegistry::lookupClass() - ); - - forAllIters(fields, fieldIter) + for (const GeoField& field : mesh.objectRegistry::csorted()) { - GeoField& field = const_cast(*fieldIter()); - - auto& fieldBf = field.boundaryFieldRef(); + auto& fieldBf = const_cast(field).boundaryFieldRef(); forAll(fieldBf, patchi) { @@ -326,43 +360,36 @@ void subsetTopoSets PtrList sets; ReadFields(objects, sets); - subSets.resize(sets.size()); + subSets.resize_null(sets.size()); + forAll(sets, seti) { - TopoSet& set = sets[seti]; + const TopoSet& set = sets[seti]; - Info<< "Subsetting " << set.type() << " " << set.name() << endl; + Info<< "Subsetting " << set.type() << ' ' << set.name() << endl; + + labelHashSet subset(2*min(set.size(), map.size())); // Map the data - bitSet isSet(set.maxSize(mesh)); - for (const label id : set) + forAll(map, i) { - isSet.set(id); - } - - label nSet = 0; - for (const label id : map) - { - if (isSet.test(id)) + if (set.contains(map[i])) { - ++nSet; + subset.insert(i); } } subSets.set ( seti, - new TopoSet(subMesh, set.name(), nSet, IOobject::AUTO_WRITE) + new TopoSet + ( + subMesh, + set.name(), + std::move(subset), + IOobjectOption::AUTO_WRITE + ) ); - TopoSet& subSet = subSets[seti]; - - forAll(map, i) - { - if (isSet.test(map[i])) - { - subSet.insert(i); - } - } } } @@ -613,6 +640,7 @@ label findPatch(const polyBoundaryMesh& patches, const word& patchName) } +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // int main(int argc, char *argv[]) { @@ -844,138 +872,117 @@ int main(int argc, char *argv[]) } } } + // Read vol fields and subset. - - wordList scalarNames(objects.sortedNames()); - PtrList scalarFlds(scalarNames.size()); - subsetVolFields + PtrList scalarFlds ( - subsetter, - objects, - defaultPatchi, - scalar(Zero), - scalarFlds + subsetVolFields + ( + subsetter, + objects, + defaultPatchi, + scalar(Zero) + ) ); - wordList vectorNames(objects.sortedNames()); - PtrList vectorFlds(vectorNames.size()); - subsetVolFields + PtrList vectorFlds ( - subsetter, - objects, - defaultPatchi, - vector(Zero), - vectorFlds + subsetVolFields + ( + subsetter, + objects, + defaultPatchi, + vector(Zero) + ) ); - wordList sphTensorNames - ( - objects.sortedNames() - ); PtrList sphTensorFlds ( - sphTensorNames.size() - ); - subsetVolFields - ( - subsetter, - objects, - defaultPatchi, - sphericalTensor(Zero), - sphTensorFlds + subsetVolFields + ( + subsetter, + objects, + defaultPatchi, + sphericalTensor(Zero) + ) ); - wordList symmTensorNames(objects.sortedNames()); - PtrList symmTensorFlds(symmTensorNames.size()); - subsetVolFields + PtrList symmTensorFlds ( - subsetter, - objects, - defaultPatchi, - symmTensor(Zero), - symmTensorFlds + subsetVolFields + ( + subsetter, + objects, + defaultPatchi, + symmTensor(Zero) + ) ); - wordList tensorNames(objects.sortedNames()); - PtrList tensorFlds(tensorNames.size()); - subsetVolFields + PtrList tensorFlds ( - subsetter, - objects, - defaultPatchi, - tensor(Zero), - tensorFlds + subsetVolFields + ( + subsetter, + objects, + defaultPatchi, + tensor(Zero) + ) ); // Read surface fields and subset. - - wordList surfScalarNames(objects.sortedNames()); - PtrList surfScalarFlds(surfScalarNames.size()); - subsetSurfaceFields + PtrList surfScalarFlds ( - subsetter, - objects, - defaultPatchi, - scalar(Zero), - surfScalarFlds + subsetSurfaceFields + ( + subsetter, + objects, + defaultPatchi, + scalar(Zero) + ) ); - wordList surfVectorNames(objects.sortedNames()); - PtrList surfVectorFlds(surfVectorNames.size()); - subsetSurfaceFields + PtrList surfVectorFlds ( - subsetter, - objects, - defaultPatchi, - vector(Zero), - surfVectorFlds + subsetSurfaceFields + ( + subsetter, + objects, + defaultPatchi, + vector(Zero) + ) ); - wordList surfSphTensorNames - ( - objects.sortedNames() - ); PtrList surfSphericalTensorFlds ( - surfSphTensorNames.size() - ); - subsetSurfaceFields - ( - subsetter, - objects, - defaultPatchi, - sphericalTensor(Zero), - surfSphericalTensorFlds - ); - - wordList surfSymmTensorNames - ( - objects.sortedNames() + subsetSurfaceFields + ( + subsetter, + objects, + defaultPatchi, + sphericalTensor(Zero) + ) ); PtrList surfSymmTensorFlds ( - surfSymmTensorNames.size() + subsetSurfaceFields + ( + subsetter, + objects, + defaultPatchi, + symmTensor(Zero) + ) ); - subsetSurfaceFields + PtrList surfTensorFlds ( - subsetter, - objects, - defaultPatchi, - symmTensor(Zero), - surfSymmTensorFlds - ); - - wordList surfTensorNames(objects.sortedNames()); - PtrList surfTensorFlds(surfTensorNames.size()); - subsetSurfaceFields - ( - subsetter, - objects, - defaultPatchi, - tensor(Zero), - surfTensorFlds + subsetSurfaceFields + ( + subsetter, + objects, + defaultPatchi, + tensor(Zero) + ) ); @@ -1017,62 +1024,8 @@ int main(int argc, char *argv[]) ++runTime; } - Info<< "Writing mesh without blockedCells to time " << runTime.value() - << endl; - - // Subsetting adds 'subset' prefix. Rename field to be like original. - forAll(scalarFlds, i) - { - scalarFlds[i].rename(scalarNames[i]); - scalarFlds[i].writeOpt(IOobject::AUTO_WRITE); - } - forAll(vectorFlds, i) - { - vectorFlds[i].rename(vectorNames[i]); - vectorFlds[i].writeOpt(IOobject::AUTO_WRITE); - } - forAll(sphTensorFlds, i) - { - sphTensorFlds[i].rename(sphTensorNames[i]); - sphTensorFlds[i].writeOpt(IOobject::AUTO_WRITE); - } - forAll(symmTensorFlds, i) - { - symmTensorFlds[i].rename(symmTensorNames[i]); - symmTensorFlds[i].writeOpt(IOobject::AUTO_WRITE); - } - forAll(tensorFlds, i) - { - tensorFlds[i].rename(tensorNames[i]); - tensorFlds[i].writeOpt(IOobject::AUTO_WRITE); - } - - // Surface ones. - forAll(surfScalarFlds, i) - { - surfScalarFlds[i].rename(surfScalarNames[i]); - surfScalarFlds[i].writeOpt(IOobject::AUTO_WRITE); - } - forAll(surfVectorFlds, i) - { - surfVectorFlds[i].rename(surfVectorNames[i]); - surfVectorFlds[i].writeOpt(IOobject::AUTO_WRITE); - } - forAll(surfSphericalTensorFlds, i) - { - surfSphericalTensorFlds[i].rename(surfSphTensorNames[i]); - surfSphericalTensorFlds[i].writeOpt(IOobject::AUTO_WRITE); - } - forAll(surfSymmTensorFlds, i) - { - surfSymmTensorFlds[i].rename(surfSymmTensorNames[i]); - surfSymmTensorFlds[i].writeOpt(IOobject::AUTO_WRITE); - } - forAll(surfTensorNames, i) - { - surfTensorFlds[i].rename(surfTensorNames[i]); - surfTensorFlds[i].writeOpt(IOobject::AUTO_WRITE); - } + Info<< "Writing mesh without blockedCells to time " + << runTime.value() << endl; subsetter.subMesh().write(); diff --git a/applications/utilities/mesh/manipulation/rotateMesh/rotateMesh.C b/applications/utilities/mesh/manipulation/rotateMesh/rotateMesh.C index 19405995ef..c798553561 100644 --- a/applications/utilities/mesh/manipulation/rotateMesh/rotateMesh.C +++ b/applications/utilities/mesh/manipulation/rotateMesh/rotateMesh.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation - Copyright (C) 2019-2022 OpenCFD Ltd. + Copyright (C) 2019-2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -55,12 +55,9 @@ void ReadAndRotateFields const dimensionedTensor& rotT ) { - // Objects of field type - IOobjectList fields(objects.lookupClass()); - - forAllConstIters(fields, fieldIter) + for (const IOobject& io : objects.csorted()) { - GeoField fld(*fieldIter(), mesh); + GeoField fld(io, mesh); Info<< " Rotating " << fld.name() << endl; transform(fld, rotT, fld); fld.write(); diff --git a/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C b/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C index 6dcd2f1199..fcb6469181 100644 --- a/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C +++ b/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2017 OpenFOAM Foundation - Copyright (C) 2015-2022 OpenCFD Ltd. + Copyright (C) 2015-2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -164,14 +164,8 @@ void subsetVolFields { const labelList patchMap(identity(mesh.boundaryMesh().size())); - HashTable fields - ( - mesh.objectRegistry::lookupClass() - ); - forAllConstIters(fields, iter) + for (const GeoField& fld : mesh.objectRegistry::csorted()) { - const GeoField& fld = *iter.val(); - Info<< "Mapping field " << fld.name() << endl; tmp tSubFld @@ -192,8 +186,7 @@ void subsetVolFields { if (addedPatches.found(patchi)) { - tSubFld.ref().boundaryFieldRef()[patchi] == - typename GeoField::value_type(Zero); + tSubFld.ref().boundaryFieldRef()[patchi] == Zero; } } @@ -218,14 +211,8 @@ void subsetSurfaceFields { const labelList patchMap(identity(mesh.boundaryMesh().size())); - HashTable fields - ( - mesh.objectRegistry::lookupClass() - ); - forAllConstIters(fields, iter) + for (const GeoField& fld : mesh.objectRegistry::csorted()) { - const GeoField& fld = *iter.val(); - Info<< "Mapping field " << fld.name() << endl; tmp tSubFld @@ -246,8 +233,7 @@ void subsetSurfaceFields { if (addedPatches.found(patchi)) { - tSubFld.ref().boundaryFieldRef()[patchi] == - typename GeoField::value_type(Zero); + tSubFld.ref().boundaryFieldRef()[patchi] == Zero; } } diff --git a/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C b/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C index ee0fe7cfae..3add00384d 100644 --- a/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C +++ b/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C @@ -149,178 +149,127 @@ labelList nearestPatch(const polyMesh& mesh, const labelList& patchIDs) // -// Subset field-type, availability information cached -// in the availableFields hashtable. +// Subset DimensionedField/GeometricField // -template class PatchField, class GeoMesh> -void subsetFields +template +PtrList subsetFields ( const fvMeshSubset& subsetter, - HashTable& availableFields, - PtrList>& subFields + const IOobjectList& objects ) { - typedef GeometricField FieldType; - const word fieldType = FieldType::typeName; - - const wordList fieldNames = availableFields(fieldType).sortedToc(); - subFields.setSize(fieldNames.size()); - const fvMesh& baseMesh = subsetter.baseMesh(); + const UPtrList fieldObjects + ( + objects.csorted() + ); + + PtrList subFields(fieldObjects.size()); + label nFields = 0; - for (const word& fieldName : fieldNames) + for (const IOobject& io : fieldObjects) { if (!nFields) { - Info<< "Subsetting " << fieldType << " ("; + Info<< "Subsetting " << FieldType::typeName << " ("; } else { Info<< ' '; } - Info<< fieldName; + Info<< io.name(); FieldType fld ( IOobject ( - fieldName, + io.name(), baseMesh.time().timeName(), baseMesh, - IOobject::MUST_READ, - IOobject::NO_WRITE + IOobjectOption::MUST_READ, + IOobjectOption::NO_WRITE, + IOobjectOption::NO_REGISTER ), baseMesh ); subFields.set(nFields, subsetter.interpolate(fld)); + auto& subField = subFields[nFields]; + ++nFields; // Subsetting adds 'subset' prefix - rename to match original. - subFields[nFields].rename(fieldName); - - ++nFields; + subField.rename(io.name()); } if (nFields) { Info<< ')' << nl; } + + return subFields; } -template -void subsetPointFields +// Subset point fields +template +PtrList subsetFields ( const fvMeshSubset& subsetter, - const pointMesh& pMesh, - HashTable& availableFields, - PtrList>& subFields + const IOobjectList& objects, + const pointMesh& pMesh ) { - typedef GeometricField FieldType; - const word fieldType = FieldType::typeName; - - const wordList fieldNames = availableFields(fieldType).sortedToc(); - subFields.setSize(fieldNames.size()); - const fvMesh& baseMesh = subsetter.baseMesh(); + const UPtrList fieldObjects + ( + objects.csorted() + ); + + PtrList subFields(fieldObjects.size()); + label nFields = 0; - for (const word& fieldName : fieldNames) + for (const IOobject& io : fieldObjects) { if (!nFields) { - Info<< "Subsetting " << fieldType << " ("; + Info<< "Subsetting " << FieldType::typeName << " ("; } else { Info<< ' '; } - Info<< fieldName; + Info<< io.name(); FieldType fld ( IOobject ( - fieldName, + io.name(), baseMesh.time().timeName(), baseMesh, - IOobject::MUST_READ, - IOobject::NO_WRITE + IOobjectOption::MUST_READ, + IOobjectOption::NO_WRITE, + IOobjectOption::NO_REGISTER ), pMesh ); subFields.set(nFields, subsetter.interpolate(fld)); + auto& subField = subFields[nFields]; + ++nFields; // Subsetting adds 'subset' prefix - rename to match original. - subFields[nFields].rename(fieldName); - - ++nFields; + subField.rename(io.name()); } if (nFields) { Info<< ')' << nl; } -} - -template -void subsetDimensionedFields -( - const fvMeshSubset& subsetter, - HashTable& availableFields, - PtrList>& subFields -) -{ - typedef DimensionedField FieldType; - const word fieldType = FieldType::typeName; - - const wordList fieldNames = availableFields(fieldType).sortedToc(); - subFields.setSize(fieldNames.size()); - - const fvMesh& baseMesh = subsetter.baseMesh(); - - label nFields = 0; - for (const word& fieldName : fieldNames) - { - if (!nFields) - { - Info<< "Subsetting " << fieldType << " ("; - } - else - { - Info<< ' '; - } - Info<< fieldName; - - FieldType fld - ( - IOobject - ( - fieldName, - baseMesh.time().timeName(), - baseMesh, - IOobject::MUST_READ, - IOobject::NO_WRITE - ), - baseMesh - ); - - subFields.set(nFields, subsetter.interpolate(fld)); - - // Subsetting adds 'subset' prefix - rename to match original. - subFields[nFields].rename(fieldName); - - ++nFields; - } - - if (nFields) - { - Info<< ')' << nl; - } + return subFields; } @@ -338,7 +287,8 @@ void subsetTopoSets PtrList sets; ReadFields(objects, sets); - subSets.setSize(sets.size()); + subSets.resize_null(sets.size()); + forAll(sets, seti) { const TopoSet& set = sets[seti]; @@ -347,6 +297,7 @@ void subsetTopoSets labelHashSet subset(2*min(set.size(), map.size())); + // Map the data forAll(map, i) { if (set.found(map[i])) @@ -363,13 +314,14 @@ void subsetTopoSets subMesh, set.name(), std::move(subset), - IOobject::AUTO_WRITE + IOobjectOption::AUTO_WRITE ) ); } } +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // int main(int argc, char *argv[]) { @@ -568,54 +520,51 @@ int main(int argc, char *argv[]) ); } - Info<< "Subset " - << returnReduce(subsetter.subMesh().nCells(), sumOp