From b31f8894aa95e4c1d9820eb142eaf0fba2008cf9 Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 15 Oct 2010 15:41:32 +0100 Subject: [PATCH] ENH: setFields : all face sets to set patch values --- .../preProcessing/setFields/setFields.C | 260 +++++++++++++++--- .../preProcessing/setFields/setFieldsDict | 13 + .../sets/cellSources/boxToCell/boxToCell.H | 5 + .../sets/cellSources/cellToCell/cellToCell.H | 5 + .../cylinderToCell/cylinderToCell.H | 5 + .../sets/cellSources/faceToCell/faceToCell.H | 5 + .../faceZoneToCell/faceZoneToCell.H | 5 + .../cellSources/fieldToCell/fieldToCell.H | 5 + .../cellSources/labelToCell/labelToCell.H | 5 + .../sets/cellSources/nbrToCell/nbrToCell.H | 5 + .../cellSources/nearestToCell/nearestToCell.H | 5 + .../cellSources/pointToCell/pointToCell.H | 5 + .../cellSources/regionToCell/regionToCell.H | 5 + .../rotatedBoxToCell/rotatedBoxToCell.H | 5 + .../cellSources/shapeToCell/shapeToCell.H | 5 + .../cellSources/sphereToCell/sphereToCell.H | 5 + .../cellSources/surfaceToCell/surfaceToCell.H | 5 + .../sets/cellSources/zoneToCell/zoneToCell.H | 5 + .../setToCellZone/setToCellZone.H | 5 + .../boundaryToFace/boundaryToFace.H | 5 + .../sets/faceSources/boxToFace/boxToFace.H | 5 + .../sets/faceSources/cellToFace/cellToFace.H | 5 + .../sets/faceSources/faceToFace/faceToFace.H | 5 + .../faceSources/labelToFace/labelToFace.H | 5 + .../faceSources/normalToFace/normalToFace.H | 5 + .../faceSources/patchToFace/patchToFace.H | 5 + .../faceSources/pointToFace/pointToFace.H | 5 + .../sets/faceSources/zoneToFace/zoneToFace.H | 5 + .../faceZoneToFaceZone/faceZoneToFaceZone.H | 5 + .../setToFaceZone/setToFaceZone.H | 5 + .../setsToFaceZone/setsToFaceZone.H | 5 + .../sets/pointSources/boxToPoint/boxToPoint.H | 5 + .../pointSources/cellToPoint/cellToPoint.H | 5 + .../pointSources/faceToPoint/faceToPoint.H | 5 + .../pointSources/labelToPoint/labelToPoint.H | 5 + .../nearestToPoint/nearestToPoint.H | 5 + .../pointSources/pointToPoint/pointToPoint.H | 5 + .../surfaceToPoint/surfaceToPoint.H | 5 + .../pointSources/zoneToPoint/zoneToPoint.H | 5 + .../setToPointZone/setToPointZone.H | 5 + .../sets/topoSetSource/topoSetSource.H | 14 + .../hotRoom/Allrun | 3 +- .../hotRoom/Allrun | 3 +- .../buoyantPimpleFoam/hotRoom/Allclean | 1 - .../buoyantPimpleFoam/hotRoom/Allrun | 3 +- .../buoyantSimpleFoam/hotRoom/Allrun | 3 +- 46 files changed, 446 insertions(+), 44 deletions(-) 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