diff --git a/applications/utilities/preProcessing/setFields/setFields.C b/applications/utilities/preProcessing/setFields/setFields.C index 55b58e16b4..797b44437e 100644 --- a/applications/utilities/preProcessing/setFields/setFields.C +++ b/applications/utilities/preProcessing/setFields/setFields.C @@ -22,7 +22,7 @@ License along with OpenFOAM. If not, see . Description - Selects a cell set through a dictionary. + Set values on a selected set of cells/patchfaces through a dictionary. \*---------------------------------------------------------------------------*/ @@ -32,12 +32,13 @@ Description #include "fvMesh.H" #include "topoSetSource.H" #include "cellSet.H" +#include "faceSet.H" #include "volFields.H" using namespace Foam; template -bool setFieldType +bool setCellFieldType ( const word& fieldTypeDesc, const fvMesh& mesh, @@ -65,7 +66,8 @@ bool setFieldType // Check field exists if (fieldHeader.headerOk()) { - Info<< " Setting " << fieldHeader.headerClassName() + Info<< " Setting internal values of " + << fieldHeader.headerClassName() << " " << fieldName << endl; fieldType field(fieldHeader, mesh); @@ -96,7 +98,7 @@ bool setFieldType { WarningIn ( - "void setFieldType" + "void setCellFieldType" "(const fvMesh& mesh, const labelList& selectedCells," "Istream& fieldValueStream)" ) << "Field " << fieldName << " not found" << endl; @@ -106,17 +108,17 @@ bool setFieldType } -class setField +class setCellField { public: - setField() + setCellField() {} - autoPtr clone() const + autoPtr clone() const { - return autoPtr(new setField()); + return autoPtr(new setCellField()); } class iNew @@ -132,37 +134,200 @@ public: selectedCells_(selectedCells) {} - autoPtr operator()(Istream& fieldValues) const + autoPtr operator()(Istream& fieldValues) const { word fieldType(fieldValues); if ( !( - setFieldType + setCellFieldType (fieldType, mesh_, selectedCells_, fieldValues) - || setFieldType + || setCellFieldType (fieldType, mesh_, selectedCells_, fieldValues) - || setFieldType + || setCellFieldType (fieldType, mesh_, selectedCells_, fieldValues) - || setFieldType + || setCellFieldType (fieldType, mesh_, selectedCells_, fieldValues) - || setFieldType + || setCellFieldType (fieldType, mesh_, selectedCells_, fieldValues) ) ) { - WarningIn("setField::iNew::operator()(Istream& is)") + WarningIn("setCellField::iNew::operator()(Istream& is)") << "field type " << fieldType << " not currently supported" << endl; } - return autoPtr(new setField()); + return autoPtr(new setCellField()); } }; }; +template +bool setFaceFieldType +( + const word& fieldTypeDesc, + const fvMesh& mesh, + const labelList& selectedFaces, + Istream& fieldValueStream +) +{ + typedef GeometricField fieldType; + + if (fieldTypeDesc != fieldType::typeName + "Value") + { + return false; + } + + word fieldName(fieldValueStream); + + IOobject fieldHeader + ( + fieldName, + mesh.time().timeName(), + mesh, + IOobject::MUST_READ + ); + + // Check field exists + if (fieldHeader.headerOk()) + { + Info<< " Setting patchField values of " + << fieldHeader.headerClassName() + << " " << fieldName << endl; + + fieldType field(fieldHeader, mesh); + + const Type& value = pTraits(fieldValueStream); + + // Create flat list of selected faces and their value. + Field allBoundaryValues(mesh.nFaces()-mesh.nInternalFaces()); + forAll(field.boundaryField(), patchi) + { + SubField + ( + allBoundaryValues, + field.boundaryField()[patchi].size(), + field.boundaryField()[patchi].patch().start() + - mesh.nInternalFaces() + ).assign(field.boundaryField()[patchi]); + } + + // Override + labelList nChanged(field.boundaryField().size(), 0); + forAll(selectedFaces, i) + { + label facei = selectedFaces[i]; + if (mesh.isInternalFace(facei)) + { + WarningIn("setFaceFieldType(..)") + << "Ignoring internal face " << facei << endl; + } + else + { + label bFaceI = facei-mesh.nInternalFaces(); + allBoundaryValues[bFaceI] = value; + nChanged[mesh.boundaryMesh().patchID()[bFaceI]]++; + } + } + + Pstream::listCombineGather(nChanged, plusEqOp