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.
This commit is contained in:
Mark Olesen
2023-07-17 18:27:55 +02:00
parent d65e2d89b5
commit db16d80840
70 changed files with 1300 additions and 1758 deletions

View File

@ -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<class Type>
void subsetVolFields
PtrList<GeometricField<Type, fvPatchField, volMesh>> subsetVolFields
(
const fvMeshSubset& subsetter,
const IOobjectList& objects,
const label patchi,
const Type& exposedValue,
PtrList<GeometricField<Type, fvPatchField, volMesh>>& subFields
const Type& exposedValue
)
{
typedef GeometricField<Type, fvPatchField, volMesh> GeoField;
const fvMesh& baseMesh = subsetter.baseMesh();
const UPtrList<const IOobject> fieldObjects
(
objects.csorted<GeoField>()
);
PtrList<GeoField> subFields(fieldObjects.size());
label nFields = 0;
for (const word& fieldName : objects.sortedNames<GeoField>())
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<Type>& fld =
subFields[nFields].boundaryFieldRef()[patchi];
fvPatchField<Type>& 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<class Type>
void subsetSurfaceFields
PtrList<GeometricField<Type, fvsPatchField, surfaceMesh>> subsetSurfaceFields
(
const fvMeshSubset& subsetter,
const IOobjectList& objects,
const label patchi,
const Type& exposedValue,
PtrList<GeometricField<Type, fvsPatchField, surfaceMesh>>& subFields
const Type& exposedValue
)
{
typedef GeometricField<Type, fvsPatchField, surfaceMesh> GeoField;
const fvMesh& baseMesh = subsetter.baseMesh();
const UPtrList<const IOobject> fieldObjects
(
objects.csorted<GeoField>()
);
PtrList<GeoField> subFields(fieldObjects.size());
label nFields = 0;
for (const word& fieldName : objects.sortedNames<GeoField>())
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<Type>& fld =
subFields[nFields].boundaryFieldRef()[patchi];
fvsPatchField<Type>& 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<const GeoField*> fields
(
mesh.objectRegistry::lookupClass<GeoField>()
);
forAllIters(fields, fieldIter)
for (const GeoField& field : mesh.objectRegistry::csorted<GeoField>())
{
GeoField& field = const_cast<GeoField&>(*fieldIter());
auto& fieldBf = field.boundaryFieldRef();
auto& fieldBf = const_cast<GeoField&>(field).boundaryFieldRef();
forAll(fieldBf, patchi)
{
@ -326,43 +360,36 @@ void subsetTopoSets
PtrList<TopoSet> sets;
ReadFields<TopoSet>(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<volScalarField>());
PtrList<volScalarField> scalarFlds(scalarNames.size());
subsetVolFields
PtrList<volScalarField> scalarFlds
(
subsetter,
objects,
defaultPatchi,
scalar(Zero),
scalarFlds
subsetVolFields<scalar>
(
subsetter,
objects,
defaultPatchi,
scalar(Zero)
)
);
wordList vectorNames(objects.sortedNames<volVectorField>());
PtrList<volVectorField> vectorFlds(vectorNames.size());
subsetVolFields
PtrList<volVectorField> vectorFlds
(
subsetter,
objects,
defaultPatchi,
vector(Zero),
vectorFlds
subsetVolFields<vector>
(
subsetter,
objects,
defaultPatchi,
vector(Zero)
)
);
wordList sphTensorNames
(
objects.sortedNames<volSphericalTensorField>()
);
PtrList<volSphericalTensorField> sphTensorFlds
(
sphTensorNames.size()
);
subsetVolFields
(
subsetter,
objects,
defaultPatchi,
sphericalTensor(Zero),
sphTensorFlds
subsetVolFields<sphericalTensor>
(
subsetter,
objects,
defaultPatchi,
sphericalTensor(Zero)
)
);
wordList symmTensorNames(objects.sortedNames<volSymmTensorField>());
PtrList<volSymmTensorField> symmTensorFlds(symmTensorNames.size());
subsetVolFields
PtrList<volSymmTensorField> symmTensorFlds
(
subsetter,
objects,
defaultPatchi,
symmTensor(Zero),
symmTensorFlds
subsetVolFields<symmTensor>
(
subsetter,
objects,
defaultPatchi,
symmTensor(Zero)
)
);
wordList tensorNames(objects.sortedNames<volTensorField>());
PtrList<volTensorField> tensorFlds(tensorNames.size());
subsetVolFields
PtrList<volTensorField> tensorFlds
(
subsetter,
objects,
defaultPatchi,
tensor(Zero),
tensorFlds
subsetVolFields<tensor>
(
subsetter,
objects,
defaultPatchi,
tensor(Zero)
)
);
// Read surface fields and subset.
wordList surfScalarNames(objects.sortedNames<surfaceScalarField>());
PtrList<surfaceScalarField> surfScalarFlds(surfScalarNames.size());
subsetSurfaceFields
PtrList<surfaceScalarField> surfScalarFlds
(
subsetter,
objects,
defaultPatchi,
scalar(Zero),
surfScalarFlds
subsetSurfaceFields<scalar>
(
subsetter,
objects,
defaultPatchi,
scalar(Zero)
)
);
wordList surfVectorNames(objects.sortedNames<surfaceVectorField>());
PtrList<surfaceVectorField> surfVectorFlds(surfVectorNames.size());
subsetSurfaceFields
PtrList<surfaceVectorField> surfVectorFlds
(
subsetter,
objects,
defaultPatchi,
vector(Zero),
surfVectorFlds
subsetSurfaceFields<vector>
(
subsetter,
objects,
defaultPatchi,
vector(Zero)
)
);
wordList surfSphTensorNames
(
objects.sortedNames<surfaceSphericalTensorField>()
);
PtrList<surfaceSphericalTensorField> surfSphericalTensorFlds
(
surfSphTensorNames.size()
);
subsetSurfaceFields
(
subsetter,
objects,
defaultPatchi,
sphericalTensor(Zero),
surfSphericalTensorFlds
);
wordList surfSymmTensorNames
(
objects.sortedNames<surfaceSymmTensorField>()
subsetSurfaceFields<sphericalTensor>
(
subsetter,
objects,
defaultPatchi,
sphericalTensor(Zero)
)
);
PtrList<surfaceSymmTensorField> surfSymmTensorFlds
(
surfSymmTensorNames.size()
subsetSurfaceFields<symmTensor>
(
subsetter,
objects,
defaultPatchi,
symmTensor(Zero)
)
);
subsetSurfaceFields
PtrList<surfaceTensorField> surfTensorFlds
(
subsetter,
objects,
defaultPatchi,
symmTensor(Zero),
surfSymmTensorFlds
);
wordList surfTensorNames(objects.sortedNames<surfaceTensorField>());
PtrList<surfaceTensorField> surfTensorFlds(surfTensorNames.size());
subsetSurfaceFields
(
subsetter,
objects,
defaultPatchi,
tensor(Zero),
surfTensorFlds
subsetSurfaceFields<tensor>
(
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();

View File

@ -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<GeoField>());
forAllConstIters(fields, fieldIter)
for (const IOobject& io : objects.csorted<GeoField>())
{
GeoField fld(*fieldIter(), mesh);
GeoField fld(io, mesh);
Info<< " Rotating " << fld.name() << endl;
transform(fld, rotT, fld);
fld.write();

View File

@ -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<const GeoField*> fields
(
mesh.objectRegistry::lookupClass<GeoField>()
);
forAllConstIters(fields, iter)
for (const GeoField& fld : mesh.objectRegistry::csorted<GeoField>())
{
const GeoField& fld = *iter.val();
Info<< "Mapping field " << fld.name() << endl;
tmp<GeoField> 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<const GeoField*> fields
(
mesh.objectRegistry::lookupClass<GeoField>()
);
forAllConstIters(fields, iter)
for (const GeoField& fld : mesh.objectRegistry::csorted<GeoField>())
{
const GeoField& fld = *iter.val();
Info<< "Mapping field " << fld.name() << endl;
tmp<GeoField> 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;
}
}

View File

@ -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 Type, template<class> class PatchField, class GeoMesh>
void subsetFields
template<class FieldType>
PtrList<FieldType> subsetFields
(
const fvMeshSubset& subsetter,
HashTable<wordHashSet>& availableFields,
PtrList<GeometricField<Type, PatchField, GeoMesh>>& subFields
const IOobjectList& objects
)
{
typedef GeometricField<Type, PatchField, GeoMesh> FieldType;
const word fieldType = FieldType::typeName;
const wordList fieldNames = availableFields(fieldType).sortedToc();
subFields.setSize(fieldNames.size());
const fvMesh& baseMesh = subsetter.baseMesh();
const UPtrList<const IOobject> fieldObjects
(
objects.csorted<FieldType>()
);
PtrList<FieldType> 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<class Type>
void subsetPointFields
// Subset point fields
template<class FieldType>
PtrList<FieldType> subsetFields
(
const fvMeshSubset& subsetter,
const pointMesh& pMesh,
HashTable<wordHashSet>& availableFields,
PtrList<GeometricField<Type, pointPatchField, pointMesh>>& subFields
const IOobjectList& objects,
const pointMesh& pMesh
)
{
typedef GeometricField<Type, pointPatchField, pointMesh> FieldType;
const word fieldType = FieldType::typeName;
const wordList fieldNames = availableFields(fieldType).sortedToc();
subFields.setSize(fieldNames.size());
const fvMesh& baseMesh = subsetter.baseMesh();
const UPtrList<const IOobject> fieldObjects
(
objects.csorted<FieldType>()
);
PtrList<FieldType> 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<class Type>
void subsetDimensionedFields
(
const fvMeshSubset& subsetter,
HashTable<wordHashSet>& availableFields,
PtrList<DimensionedField<Type, volMesh>>& subFields
)
{
typedef DimensionedField<Type, volMesh> 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<TopoSet> sets;
ReadFields<TopoSet>(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<label>())
<< " of "
<< returnReduce(mesh.nCells(), sumOp<label>())
FixedList<label, 2> cellCount;
cellCount[0] = subsetter.subMesh().nCells();
cellCount[1] = mesh.nCells();
reduce(cellCount, sumOp<label>());
Info<< "Subset " << cellCount[0] << " of " << cellCount[1]
<< " cells" << nl << nl;
}
IOobjectList objects(mesh, runTime.timeName());
HashTable<wordHashSet> availableFields = objects.classes();
// Read fields and subset
#undef createSubsetFields
#define createSubsetFields(FieldType, Variable) \
PtrList<FieldType> Variable \
( \
subsetFields<FieldType>(subsetter, objects) \
);
// Read vol fields and subset
// ~~~~~~~~~~~~~~~~~~~~~~~~~~
PtrList<volScalarField> vScalarFlds;
subsetFields(subsetter, availableFields, vScalarFlds);
PtrList<volVectorField> vVectorFlds;
subsetFields(subsetter, availableFields, vVectorFlds);
PtrList<volSphericalTensorField> vSphTensorFlds;
subsetFields(subsetter, availableFields, vSphTensorFlds);
PtrList<volSymmTensorField> vSymmTensorFlds;
subsetFields(subsetter, availableFields, vSymmTensorFlds);
PtrList<volTensorField> vTensorFlds;
subsetFields(subsetter, availableFields, vTensorFlds);
createSubsetFields(volScalarField, vScalarFlds);
createSubsetFields(volVectorField, vVectorFlds);
createSubsetFields(volSphericalTensorField, vSphTensorFlds);
createSubsetFields(volSymmTensorField, vSymmTensorFlds);
createSubsetFields(volTensorField, vTensorFlds);
// Read surface fields and subset
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
createSubsetFields(surfaceScalarField, sScalarFlds);
createSubsetFields(surfaceVectorField, sVectorFlds);
createSubsetFields(surfaceSphericalTensorField, sSphTensorFlds);
createSubsetFields(surfaceSymmTensorField, sSymmTensorFlds);
createSubsetFields(surfaceTensorField, sTensorFlds);
PtrList<surfaceScalarField> sScalarFlds;
subsetFields(subsetter, availableFields, sScalarFlds);
PtrList<surfaceVectorField> sVectorFlds;
subsetFields(subsetter, availableFields, sVectorFlds);
PtrList<surfaceSphericalTensorField> sSphTensorFlds;
subsetFields(subsetter, availableFields, sSphTensorFlds);
PtrList<surfaceSymmTensorField> sSymmTensorFlds;
subsetFields(subsetter, availableFields, sSymmTensorFlds);
PtrList<surfaceTensorField> sTensorFlds;
subsetFields(subsetter, availableFields, sTensorFlds);
// Read dimensioned fields and subset
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
createSubsetFields(volScalarField::Internal, dScalarFlds);
createSubsetFields(volVectorField::Internal, dVectorFlds);
createSubsetFields(volSphericalTensorField::Internal, dSphTensorFlds);
createSubsetFields(volSymmTensorField::Internal, dSymmTensorFlds);
createSubsetFields(volTensorField::Internal, dTensorFlds);
// Read point fields and subset
@ -623,39 +572,20 @@ int main(int argc, char *argv[])
const pointMesh& pMesh = pointMesh::New(mesh);
PtrList<pointScalarField> pScalarFlds;
subsetPointFields(subsetter, pMesh, availableFields, pScalarFlds);
#undef createSubsetFields
#define createSubsetFields(FieldType, Variable) \
PtrList<FieldType> Variable \
( \
subsetFields<FieldType>(subsetter, objects, pMesh) \
);
PtrList<pointVectorField> pVectorFlds;
subsetPointFields(subsetter, pMesh, availableFields, pVectorFlds);
createSubsetFields(pointScalarField, pScalarFlds);
createSubsetFields(pointVectorField, pVectorFlds);
createSubsetFields(pointSphericalTensorField, pSphTensorFlds);
createSubsetFields(pointSymmTensorField, pSymmTensorFlds);
createSubsetFields(pointTensorField, pTensorFlds);
PtrList<pointSphericalTensorField> pSphTensorFlds;
subsetPointFields(subsetter, pMesh, availableFields, pSphTensorFlds);
PtrList<pointSymmTensorField> pSymmTensorFlds;
subsetPointFields(subsetter, pMesh, availableFields, pSymmTensorFlds);
PtrList<pointTensorField> pTensorFlds;
subsetPointFields(subsetter, pMesh, availableFields, pTensorFlds);
// Read dimensioned fields and subset
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PtrList<volScalarField::Internal> dScalarFlds;
subsetDimensionedFields(subsetter, availableFields, dScalarFlds);
PtrList<volVectorField::Internal> dVectorFlds;
subsetDimensionedFields(subsetter, availableFields, dVectorFlds);
PtrList<volSphericalTensorField::Internal> dSphTensorFlds;
subsetDimensionedFields(subsetter, availableFields, dSphTensorFlds);
PtrList<volSymmTensorField::Internal> dSymmTensorFlds;
subsetDimensionedFields(subsetter, availableFields, dSymmTensorFlds);
PtrList<volTensorField::Internal> dTensorFlds;
subsetDimensionedFields(subsetter, availableFields, dTensorFlds);
#undef createSubsetFields
// Read topoSets and subset
@ -735,13 +665,6 @@ int main(int argc, char *argv[])
for (const auto& fld : sSymmTensorFlds) { fld.write(); }
for (const auto& fld : sTensorFlds) { fld.write(); }
// Point fields
for (const auto& fld : pScalarFlds) { fld.write(); }
for (const auto& fld : pVectorFlds) { fld.write(); }
for (const auto& fld : pSphTensorFlds) { fld.write(); }
for (const auto& fld : pSymmTensorFlds) { fld.write(); }
for (const auto& fld : pTensorFlds) { fld.write(); }
// Dimensioned fields
for (const auto& fld : dScalarFlds) { fld.write(); }
for (const auto& fld : dVectorFlds) { fld.write(); }
@ -749,6 +672,13 @@ int main(int argc, char *argv[])
for (const auto& fld : dSymmTensorFlds) { fld.write(); }
for (const auto& fld : dTensorFlds) { fld.write(); }
// Point fields
for (const auto& fld : pScalarFlds) { fld.write(); }
for (const auto& fld : pVectorFlds) { fld.write(); }
for (const auto& fld : pSphTensorFlds) { fld.write(); }
for (const auto& fld : pSymmTensorFlds) { fld.write(); }
for (const auto& fld : pTensorFlds) { fld.write(); }
Info<< "\nEnd\n" << endl;
return 0;