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