BUG: inconsistent field ordering in PDRMesh (fixes #1069)

This commit is contained in:
Mark Olesen 2018-11-12 12:59:03 +01:00
parent b016b1664e
commit 2ac5df6f93

View File

@ -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));
subFields.set(i, subsetter.interpolate(volField));
// Explicitly set exposed faces (in patchi) to exposedValue.
if (patchi >= 0)
{
fvPatchField<Type>& fld =
subFields[nFields].boundaryFieldRef()[patchi];
// Explicitly set exposed faces (in patchi) to exposedValue.
if (patchi >= 0)
const label newStart = fld.patch().patch().start();
const label oldPatchi = subsetter.patchMap()[patchi];
if (oldPatchi == -1)
{
fvPatchField<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 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)
forAll(fld, j)
{
// New patch. Reset whole value.
fld = exposedValue;
}
else
{
// 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();
const label oldFacei = subsetter.faceMap()[newStart+j];
forAll(fld, j)
if (oldFacei < oldStart || oldFacei >= oldStart+oldSize)
{
label oldFacei = subsetter.faceMap()[newStart+j];
if (oldFacei < oldStart || oldFacei >= oldStart+oldSize)
{
fld[j] = exposedValue;
}
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)
forAll(fld, j)
{
// New patch. Reset whole value.
fld = exposedValue;
}
else
{
// 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();
const label oldFacei = subsetter.faceMap()[newStart+j];
forAll(fld, j)
if (oldFacei < oldStart || oldFacei >= oldStart+oldSize)
{
label oldFacei = subsetter.faceMap()[newStart+j];
if (oldFacei < oldStart || oldFacei >= oldStart+oldSize)
{
fld[j] = exposedValue;
}
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>
(