From 2ac5df6f93223935a48af0d9a0422bd2c953dfe8 Mon Sep 17 00:00:00 2001 From: Mark Olesen <Mark.Olesen@esi-group.com> Date: Mon, 12 Nov 2018 12:59:03 +0100 Subject: [PATCH] BUG: inconsistent field ordering in PDRMesh (fixes #1069) --- .../utilities/mesh/advanced/PDRMesh/PDRMesh.C | 239 ++++++++---------- 1 file changed, 110 insertions(+), 129 deletions(-) diff --git a/applications/utilities/mesh/advanced/PDRMesh/PDRMesh.C b/applications/utilities/mesh/advanced/PDRMesh/PDRMesh.C index 7fbeb17389c..b54edbda5b1 100644 --- a/applications/utilities/mesh/advanced/PDRMesh/PDRMesh.C +++ b/applications/utilities/mesh/advanced/PDRMesh/PDRMesh.C @@ -131,69 +131,69 @@ template<class Type> void subsetVolFields ( const fvMeshSubset& subsetter, - const IOobjectList& objectsList, + const IOobjectList& objects, const label patchi, const Type& exposedValue, - const word GeomVolType, PtrList<GeometricField<Type, fvPatchField, volMesh>>& subFields ) { + typedef GeometricField<Type, fvPatchField, volMesh> GeoField; + const fvMesh& baseMesh = subsetter.baseMesh(); - label i = 0; + label nFields = 0; - forAllConstIter(IOobjectList , objectsList, iter) + for (const word& fieldName : objects.sortedNames<GeoField>()) { - if (iter()->headerClassName() == GeomVolType) + const IOobject* ioptr = objects.findObject(fieldName); + + if (!nFields) { - const word fieldName = iter()->name(); + Info<< "Subsetting " << GeoField::typeName << nl; + } + Info<< " " << fieldName << endl; - Info<< "Subsetting field " << fieldName << endl; + GeoField origField(*ioptr, baseMesh); - GeometricField<Type, fvPatchField, volMesh> volField - ( - *iter(), - baseMesh - ); + subFields.set(nFields, subsetter.interpolate(origField)); + + // Explicitly set exposed faces (in patchi) to exposedValue. + if (patchi >= 0) + { + fvPatchField<Type>& fld = + subFields[nFields].boundaryFieldRef()[patchi]; - subFields.set(i, subsetter.interpolate(volField)); + const label newStart = fld.patch().patch().start(); + const label oldPatchi = subsetter.patchMap()[patchi]; - // Explicitly set exposed faces (in patchi) to exposedValue. - if (patchi >= 0) + if (oldPatchi == -1) + { + // New patch. Reset whole value. + fld = exposedValue; + } + else { - fvPatchField<Type>& fld = - subFields[i++].boundaryFieldRef()[patchi]; + // Reset faces that originate from different patch + // or internal faces. - label newStart = fld.patch().patch().start(); + const fvPatchField<Type>& origPfld = + origField.boundaryField()[oldPatchi]; - label oldPatchi = subsetter.patchMap()[patchi]; + const label oldSize = origPfld.size(); + const label oldStart = origPfld.patch().patch().start(); - if (oldPatchi == -1) - { - // New patch. Reset whole value. - fld = exposedValue; - } - else + forAll(fld, j) { - // Reset those faces that originate from different patch - // or internal faces. - label oldSize = volField.boundaryField()[oldPatchi].size(); - label oldStart = volField.boundaryField() - [ - oldPatchi - ].patch().patch().start(); - - forAll(fld, j) - { - label oldFacei = subsetter.faceMap()[newStart+j]; + const label oldFacei = subsetter.faceMap()[newStart+j]; - if (oldFacei < oldStart || oldFacei >= oldStart+oldSize) - { - fld[j] = exposedValue; - } + if (oldFacei < oldStart || oldFacei >= oldStart+oldSize) + { + fld[j] = exposedValue; } } } + + ++nFields; } } } @@ -203,71 +203,70 @@ template<class Type> void subsetSurfaceFields ( const fvMeshSubset& subsetter, - const IOobjectList& objectsList, + const IOobjectList& objects, const label patchi, const Type& exposedValue, - const word GeomSurfType, PtrList<GeometricField<Type, fvsPatchField, surfaceMesh>>& subFields ) { + typedef GeometricField<Type, fvsPatchField, surfaceMesh> GeoField; + const fvMesh& baseMesh = subsetter.baseMesh(); - label i(0); + label nFields = 0; - forAllConstIter(IOobjectList , objectsList, iter) + for (const word& fieldName : objects.sortedNames<GeoField>()) { - if (iter()->headerClassName() == GeomSurfType) + const IOobject* ioptr = objects.findObject(fieldName); + + if (!nFields) { - const word& fieldName = iter.key(); + Info<< "Subsetting " << GeoField::typeName << nl; + } + Info<< " " << fieldName << endl; - Info<< "Subsetting field " << fieldName << endl; + GeoField origField(*ioptr, baseMesh); - GeometricField<Type, fvsPatchField, surfaceMesh> volField - ( - *iter(), - baseMesh - ); + subFields.set(nFields, subsetter.interpolate(origField)); - subFields.set(i, subsetter.interpolate(volField)); + // Explicitly set exposed faces (in patchi) to exposedValue. + if (patchi >= 0) + { + fvsPatchField<Type>& fld = + subFields[nFields].boundaryFieldRef()[patchi]; + const label newStart = fld.patch().patch().start(); + const label oldPatchi = subsetter.patchMap()[patchi]; - // Explicitly set exposed faces (in patchi) to exposedValue. - if (patchi >= 0) + if (oldPatchi == -1) { - fvsPatchField<Type>& fld = - subFields[i++].boundaryFieldRef()[patchi]; + // New patch. Reset whole value. + fld = exposedValue; + } + else + { + // Reset faces that originate from different patch + // or internal faces. - label newStart = fld.patch().patch().start(); + const fvsPatchField<Type>& origPfld = + origField.boundaryField()[oldPatchi]; - label oldPatchi = subsetter.patchMap()[patchi]; + const label oldSize = origPfld.size(); + const label oldStart = origPfld.patch().patch().start(); - if (oldPatchi == -1) - { - // New patch. Reset whole value. - fld = exposedValue; - } - else + forAll(fld, j) { - // Reset those faces that originate from different patch - // or internal faces. - label oldSize = volField.boundaryField()[oldPatchi].size(); - label oldStart = volField.boundaryField() - [ - oldPatchi - ].patch().patch().start(); - - forAll(fld, j) - { - label oldFacei = subsetter.faceMap()[newStart+j]; + const label oldFacei = subsetter.faceMap()[newStart+j]; - if (oldFacei < oldStart || oldFacei >= oldStart+oldSize) - { - fld[j] = exposedValue; - } + if (oldFacei < oldStart || oldFacei >= oldStart+oldSize) + { + fld[j] = exposedValue; } } } } + + ++nFields; } } @@ -287,18 +286,11 @@ void initCreatedPatches mesh.objectRegistry::lookupClass<GeoField>() ); - for - ( - typename HashTable<const GeoField*>:: - iterator fieldIter = fields.begin(); - fieldIter != fields.end(); - ++fieldIter - ) + forAllIters(fields, fieldIter) { GeoField& field = const_cast<GeoField&>(*fieldIter()); - typename GeoField::Boundary& fieldBf = - field.boundaryFieldRef(); + auto& fieldBf = field.boundaryFieldRef(); forAll(fieldBf, patchi) { @@ -321,7 +313,7 @@ template<class TopoSet> void subsetTopoSets ( const fvMesh& mesh, - const IOobjectList& objectsList, + const IOobjectList& objects, const labelList& map, const fvMesh& subMesh, PtrList<TopoSet>& subSets @@ -329,12 +321,12 @@ void subsetTopoSets { // Read original sets PtrList<TopoSet> sets; - ReadFields<TopoSet>(objectsList, sets); + ReadFields<TopoSet>(objects, sets); - subSets.setSize(sets.size()); - forAll(sets, i) + subSets.resize(sets.size()); + forAll(sets, seti) { - TopoSet& set = sets[i]; + TopoSet& set = sets[seti]; Info<< "Subsetting " << set.type() << " " << set.name() << endl; @@ -356,10 +348,10 @@ void subsetTopoSets subSets.set ( - i, + seti, new TopoSet(subMesh, set.name(), nSet, IOobject::AUTO_WRITE) ); - TopoSet& subSet = subSets[i]; + TopoSet& subSet = subSets[seti]; forAll(map, i) { @@ -847,7 +839,7 @@ int main(int argc, char *argv[]) } // Read vol fields and subset. - wordList scalarNames(objects.names(volScalarField::typeName)); + wordList scalarNames(objects.sortedNames<volScalarField>()); PtrList<volScalarField> scalarFlds(scalarNames.size()); subsetVolFields ( @@ -855,11 +847,10 @@ int main(int argc, char *argv[]) objects, defaultPatchi, scalar(Zero), - volScalarField::typeName, scalarFlds ); - wordList vectorNames(objects.names(volVectorField::typeName)); + wordList vectorNames(objects.sortedNames<volVectorField>()); PtrList<volVectorField> vectorFlds(vectorNames.size()); subsetVolFields ( @@ -867,17 +858,16 @@ int main(int argc, char *argv[]) objects, defaultPatchi, vector(Zero), - volVectorField::typeName, vectorFlds ); - wordList sphericalTensorNames + wordList sphTensorNames ( - objects.names(volSphericalTensorField::typeName) + objects.sortedNames<volSphericalTensorField>() ); - PtrList<volSphericalTensorField> sphericalTensorFlds + PtrList<volSphericalTensorField> sphTensorFlds ( - sphericalTensorNames.size() + sphTensorNames.size() ); subsetVolFields ( @@ -885,11 +875,10 @@ int main(int argc, char *argv[]) objects, defaultPatchi, sphericalTensor(Zero), - volSphericalTensorField::typeName, - sphericalTensorFlds + sphTensorFlds ); - wordList symmTensorNames(objects.names(volSymmTensorField::typeName)); + wordList symmTensorNames(objects.sortedNames<volSymmTensorField>()); PtrList<volSymmTensorField> symmTensorFlds(symmTensorNames.size()); subsetVolFields ( @@ -897,11 +886,10 @@ int main(int argc, char *argv[]) objects, defaultPatchi, symmTensor(Zero), - volSymmTensorField::typeName, symmTensorFlds ); - wordList tensorNames(objects.names(volTensorField::typeName)); + wordList tensorNames(objects.sortedNames<volTensorField>()); PtrList<volTensorField> tensorFlds(tensorNames.size()); subsetVolFields ( @@ -909,13 +897,12 @@ int main(int argc, char *argv[]) objects, defaultPatchi, tensor(Zero), - volTensorField::typeName, tensorFlds ); // Read surface fields and subset. - wordList surfScalarNames(objects.names(surfaceScalarField::typeName)); + wordList surfScalarNames(objects.sortedNames<surfaceScalarField>()); PtrList<surfaceScalarField> surfScalarFlds(surfScalarNames.size()); subsetSurfaceFields ( @@ -923,11 +910,10 @@ int main(int argc, char *argv[]) objects, defaultPatchi, scalar(Zero), - surfaceScalarField::typeName, surfScalarFlds ); - wordList surfVectorNames(objects.names(surfaceVectorField::typeName)); + wordList surfVectorNames(objects.sortedNames<surfaceVectorField>()); PtrList<surfaceVectorField> surfVectorFlds(surfVectorNames.size()); subsetSurfaceFields ( @@ -935,17 +921,16 @@ int main(int argc, char *argv[]) objects, defaultPatchi, vector(Zero), - surfaceVectorField::typeName, surfVectorFlds ); - wordList surfSphericalTensorNames + wordList surfSphTensorNames ( - objects.names(surfaceSphericalTensorField::typeName) + objects.sortedNames<surfaceSphericalTensorField>() ); PtrList<surfaceSphericalTensorField> surfSphericalTensorFlds ( - surfSphericalTensorNames.size() + surfSphTensorNames.size() ); subsetSurfaceFields ( @@ -953,13 +938,12 @@ int main(int argc, char *argv[]) objects, defaultPatchi, sphericalTensor(Zero), - surfaceSphericalTensorField::typeName, surfSphericalTensorFlds ); wordList surfSymmTensorNames ( - objects.names(surfaceSymmTensorField::typeName) + objects.sortedNames<surfaceSymmTensorField>() ); PtrList<surfaceSymmTensorField> surfSymmTensorFlds @@ -973,11 +957,10 @@ int main(int argc, char *argv[]) objects, defaultPatchi, symmTensor(Zero), - surfaceSymmTensorField::typeName, surfSymmTensorFlds ); - wordList surfTensorNames(objects.names(surfaceTensorField::typeName)); + wordList surfTensorNames(objects.sortedNames<surfaceTensorField>()); PtrList<surfaceTensorField> surfTensorFlds(surfTensorNames.size()); subsetSurfaceFields ( @@ -985,7 +968,6 @@ int main(int argc, char *argv[]) objects, defaultPatchi, tensor(Zero), - surfaceTensorField::typeName, surfTensorFlds ); @@ -1023,7 +1005,6 @@ int main(int argc, char *argv[]) } - if (!overwrite) { ++runTime; @@ -1043,10 +1024,10 @@ int main(int argc, char *argv[]) vectorFlds[i].rename(vectorNames[i]); vectorFlds[i].writeOpt() = IOobject::AUTO_WRITE; } - forAll(sphericalTensorFlds, i) + forAll(sphTensorFlds, i) { - sphericalTensorFlds[i].rename(sphericalTensorNames[i]); - sphericalTensorFlds[i].writeOpt() = IOobject::AUTO_WRITE; + sphTensorFlds[i].rename(sphTensorNames[i]); + sphTensorFlds[i].writeOpt() = IOobject::AUTO_WRITE; } forAll(symmTensorFlds, i) { @@ -1072,7 +1053,7 @@ int main(int argc, char *argv[]) } forAll(surfSphericalTensorFlds, i) { - surfSphericalTensorFlds[i].rename(surfSphericalTensorNames[i]); + surfSphericalTensorFlds[i].rename(surfSphTensorNames[i]); surfSphericalTensorFlds[i].writeOpt() = IOobject::AUTO_WRITE; } forAll(surfSymmTensorFlds, i) @@ -1179,7 +1160,7 @@ int main(int argc, char *argv[]) ( subsetter.subMesh(), map, - 0.0 + Zero ); initCreatedPatches<volVectorField> ( @@ -1210,7 +1191,7 @@ int main(int argc, char *argv[]) ( subsetter.subMesh(), map, - 0.0 + Zero ); initCreatedPatches<surfaceVectorField> ( -- GitLab