diff --git a/applications/utilities/mesh/manipulation/topoSet/topoSetDict b/applications/utilities/mesh/manipulation/topoSet/topoSetDict index 5b8a4b73bbe85c562c9e50527fd1b113a8796c3b..4c2180f21d489ff5b916f8bce73628f23443558c 100644 --- a/applications/utilities/mesh/manipulation/topoSet/topoSetDict +++ b/applications/utilities/mesh/manipulation/topoSet/topoSetDict @@ -85,7 +85,7 @@ FoamFile // { // set p0; // option any; // cell with any point in pointSet -// //option all; // cell with all points in pointSet +// //option edge; // cell with an edge with both points in pointSet // } // // // Select based on cellShape @@ -198,6 +198,7 @@ FoamFile // set p0; // option any; // Faces using any point in pointSet // //option all // Faces with all points in pointSet +// //option edge // Faces with two consecutive points in pointSet // } // // // Select by explicitly providing face labels diff --git a/src/meshTools/sets/cellSources/pointToCell/pointToCell.C b/src/meshTools/sets/cellSources/pointToCell/pointToCell.C index 9701431dc41eb045e4e9f4e73c34376b37f1f8a3..0939a2e3bec5142b84c8b3eb25a2d3788234458d 100644 --- a/src/meshTools/sets/cellSources/pointToCell/pointToCell.C +++ b/src/meshTools/sets/cellSources/pointToCell/pointToCell.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -41,10 +41,11 @@ namespace Foam const char* Foam::NamedEnum < Foam::pointToCell::pointAction, - 1 + 2 >::names[] = { - "any" + "any", + "edge" }; } @@ -52,11 +53,12 @@ namespace Foam Foam::topoSetSource::addToUsageTable Foam::pointToCell::usage_ ( pointToCell::typeName, - "\n Usage: pointToCell <pointSet> any\n\n" - " Select all cells with any point in the pointSet\n\n" + "\n Usage: pointToCell <pointSet> any|edge\n\n" + " Select all cells with any point ('any') or any edge ('edge')" + " in the pointSet\n\n" ); -const Foam::NamedEnum<Foam::pointToCell::pointAction, 1> +const Foam::NamedEnum<Foam::pointToCell::pointAction, 2> Foam::pointToCell::pointActionNames_; @@ -82,6 +84,26 @@ void Foam::pointToCell::combine(topoSet& set, const bool add) const } } } + else if (option_ == EDGE) + { + const faceList& faces = mesh_.faces(); + forAll(faces, faceI) + { + const face& f = faces[faceI]; + + forAll(f, fp) + { + if (loadedSet.found(f[fp]) && loadedSet.found(f.nextLabel(fp))) + { + addOrDelete(set, mesh_.faceOwner()[faceI], add); + if (mesh_.isInternalFace(faceI)) + { + addOrDelete(set, mesh_.faceNeighbour()[faceI], add); + } + } + } + } + } } diff --git a/src/meshTools/sets/cellSources/pointToCell/pointToCell.H b/src/meshTools/sets/cellSources/pointToCell/pointToCell.H index 2e8a507640ae01cc54ea01b6369d81e383d8940a..96f02f18bf64c475f8526e82403c45e3b6627ba7 100644 --- a/src/meshTools/sets/cellSources/pointToCell/pointToCell.H +++ b/src/meshTools/sets/cellSources/pointToCell/pointToCell.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -55,7 +55,8 @@ public: //- Enumeration defining the valid options enum pointAction { - ANY // Cells using any point in set + ANY, // Cells using any point in set + EDGE // Cells using an edge with both points in set //ALL // Possible extension: cells whose all points are in set }; @@ -64,7 +65,7 @@ private: //- Add usage string static addToUsageTable usage_; - static const NamedEnum<pointAction, 1> pointActionNames_; + static const NamedEnum<pointAction, 2> pointActionNames_; //- Name of set to use word setName_; diff --git a/src/meshTools/sets/faceSources/pointToFace/pointToFace.C b/src/meshTools/sets/faceSources/pointToFace/pointToFace.C index 81e13e4fc459d26bdd85ee0bd8c0edc00c48f114..7d66aaefe2cd999053f8cca4d2d5209c8e6dd9dd 100644 --- a/src/meshTools/sets/faceSources/pointToFace/pointToFace.C +++ b/src/meshTools/sets/faceSources/pointToFace/pointToFace.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -41,11 +41,12 @@ namespace Foam const char* Foam::NamedEnum < Foam::pointToFace::pointAction, - 2 + 3 >::names[] = { "any", - "all" + "all", + "edge" }; } @@ -53,13 +54,14 @@ namespace Foam Foam::topoSetSource::addToUsageTable Foam::pointToFace::usage_ ( pointToFace::typeName, - "\n Usage: pointToFace <pointSet> any|all\n\n" + "\n Usage: pointToFace <pointSet> any|all|edge\n\n" " Select faces with\n" " -any point in the pointSet\n" " -all points in the pointSet\n\n" + " -two consecutive points (an edge) in the pointSet\n\n" ); -const Foam::NamedEnum<Foam::pointToFace::pointAction, 2> +const Foam::NamedEnum<Foam::pointToFace::pointAction, 3> Foam::pointToFace::pointActionNames_; @@ -126,6 +128,23 @@ void Foam::pointToFace::combine(topoSet& set, const bool add) const } } } + else if (option_ == EDGE) + { + const faceList& faces = mesh_.faces(); + forAll(faces, faceI) + { + const face& f = faces[faceI]; + + forAll(f, fp) + { + if (loadedSet.found(f[fp]) && loadedSet.found(f.nextLabel(fp))) + { + addOrDelete(set, faceI, add); + break; + } + } + } + } } diff --git a/src/meshTools/sets/faceSources/pointToFace/pointToFace.H b/src/meshTools/sets/faceSources/pointToFace/pointToFace.H index 482626f33fc3aa652e893a4a31061648190f2446..e31bc65086f02e96086085e25bfbe57c778d48ca 100644 --- a/src/meshTools/sets/faceSources/pointToFace/pointToFace.H +++ b/src/meshTools/sets/faceSources/pointToFace/pointToFace.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -58,7 +58,8 @@ public: enum pointAction { ANY, - ALL + ALL, + EDGE }; @@ -67,7 +68,7 @@ private: //- Add usage string static addToUsageTable usage_; - static const NamedEnum<pointAction, 2> pointActionNames_; + static const NamedEnum<pointAction, 3> pointActionNames_; //- Name of set to use word setName_; diff --git a/src/postProcessing/functionObjects/field/fieldValues/controlDict b/src/postProcessing/functionObjects/field/fieldValues/controlDict index 24b3ddbad403d1cd99759e861c89aebaf30af9a8..ff5007f18d43eceacbd876c53aeaa9b10d595138 100644 --- a/src/postProcessing/functionObjects/field/fieldValues/controlDict +++ b/src/postProcessing/functionObjects/field/fieldValues/controlDict @@ -67,17 +67,14 @@ functions sourceName movingWall; //// if sampledSurface: dictionary with a sampledSurface - //// Note: the sampledSurfaces will have cell-values, i.e. - //// non-interpolated. Also will not sample surface fields. + //// Note: will not sample surface fields. //sampledSurfaceDict //{ - // type cuttingPlane; - // planeType pointAndNormal; - // pointAndNormalDict - // { - // basePoint (0 0.099 0); - // normalVector (0 1 0); - // } + // // Sampling on triSurface + // type sampledTriSurfaceMesh; + // surface integrationPlane.stl; + // source cells; // sample cells or boundaryFaces + // interpolate true; //} // Operation: areaAverage/sum/weightedAverage ... diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C index 97f244c60b21a0d91d66b1955073434be667720d..6ce7b3350ddb4e5eac90b3bc8338ece4e6504e78 100644 --- a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C +++ b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C @@ -53,7 +53,7 @@ namespace Foam const char* Foam::NamedEnum < Foam::fieldValues::faceSource::operationType, - 9 + 11 >::names[] = { "none", @@ -64,7 +64,9 @@ namespace Foam "areaIntegrate", "min", "max", - "CoV" + "CoV", + "areaNormalAverage", + "areaNormalIntegrate" }; } @@ -73,7 +75,7 @@ namespace Foam const Foam::NamedEnum<Foam::fieldValues::faceSource::sourceType, 3> Foam::fieldValues::faceSource::sourceTypeNames_; -const Foam::NamedEnum<Foam::fieldValues::faceSource::operationType, 9> +const Foam::NamedEnum<Foam::fieldValues::faceSource::operationType, 11> Foam::fieldValues::faceSource::operationTypeNames_; @@ -313,6 +315,35 @@ void Foam::fieldValues::faceSource::writeFileHeader() } +template<> +Foam::vector Foam::fieldValues::faceSource::processValues +( + const Field<vector>& values, + const vectorField& Sf, + const scalarField& weightField +) const +{ + switch (operation_) + { + case opAreaNormalAverage: + { + scalar result = sum(values&Sf)/sum(mag(Sf)); + return vector(result, 0.0, 0.0); + } + case opAreaNormalIntegrate: + { + scalar result = sum(values&Sf); + return vector(result, 0.0, 0.0); + } + default: + { + // Fall through to other operations + return processSameTypeValues(values, Sf, weightField); + } + } +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::fieldValues::faceSource::faceSource diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H index b7a292403593051934bf8c6cf0b57bbef556f9de..fd95788894aa3e9d63ebc083045e422f66d6164c 100644 --- a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H +++ b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -65,7 +65,9 @@ Description - min - max - CoV (Coefficient of variation: standard deviation/mean) - + - areaNormalAverage (vector with first component (average of) inproduct + of value and face area vector) + - areaNormalIntegrate ( ,, ,, (sum of) ,, Notes: - faces on empty patches get ignored @@ -75,7 +77,11 @@ Description negative pressure) - using sampledSurfaces: - they do not do surface fields - - they use cell values - they do not do any interpolation. + - if interpolate=true they use interpolationCellPoint + otherwise they use cell values + - each triangle in sampledSurface is logically only in one cell + so interpolation will be wrong when triangles are larger than + cells. This can only happen for sampling on triSurfaceMesh. - take care when using isoSurfaces - these might have duplicate triangles so integration might be wrong @@ -138,11 +144,13 @@ public: opAreaIntegrate, opMin, opMax, - opCoV + opCoV, + opAreaNormalAverage, + opAreaNormalIntegrate }; //- Operation type names - static const NamedEnum<operationType, 9> operationTypeNames_; + static const NamedEnum<operationType, 11> operationTypeNames_; private: @@ -194,7 +202,6 @@ protected: autoPtr<sampledSurface> surfacePtr_; - // Protected Member Functions //- Initialise, e.g. face addressing @@ -212,12 +219,23 @@ protected: const bool mustGet = false ) const; - //- Apply the 'operation' to the values + //- Apply the 'operation' to the values. Operation has to + // preserve Type. + template<class Type> + Type processSameTypeValues + ( + const Field<Type>& values, + const vectorField& Sf, + const scalarField& weightField + ) const; + + //- Apply the 'operation' to the values. Wrapper around + // processSameTypeValues. See also template specialisation below. template<class Type> Type processValues ( const Field<Type>& values, - const scalarField& magSf, + const vectorField& Sf, const scalarField& weightField ) const; @@ -292,6 +310,17 @@ public: }; +//- Specialisation of processing vectors for opAreaNormalAverage, +// opAreaNormalIntegrate (use inproduct - dimension reducing operation) +template<> +vector faceSource::processValues +( + const Field<vector>& values, + const vectorField& Sf, + const scalarField& weightField +) const; + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace fieldValues diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C index 79c031818fda6824ebf362877ed7bd8bd331bcd4..892593d0360bfe14aafeadc92f2b4820123f653d 100644 --- a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C +++ b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C @@ -27,6 +27,7 @@ License #include "surfaceFields.H" #include "volFields.H" #include "sampledSurface.H" +#include "interpolationCellPoint.H" // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // @@ -65,13 +66,44 @@ Foam::tmp<Foam::Field<Type> > Foam::fieldValues::faceSource::getFieldValues } else if (obr_.foundObject<vf>(fieldName)) { + const vf& fld = obr_.lookupObject<vf>(fieldName); + if (surfacePtr_.valid()) { - return surfacePtr_().sample(obr_.lookupObject<vf>(fieldName)); + if (surfacePtr_().interpolate()) + { + const interpolationCellPoint<Type> interp(fld); + tmp<Field<Type> > tintFld(surfacePtr_().interpolate(interp)); + const Field<Type>& intFld = tintFld(); + + // Average + const faceList& faces = surfacePtr_().faces(); + tmp<Field<Type> > tavg + ( + new Field<Type>(faces.size(), pTraits<Type>::zero) + ); + Field<Type>& avg = tavg(); + + forAll(faces, faceI) + { + const face& f = faces[faceI]; + forAll(f, fp) + { + avg[faceI] += intFld[f[fp]]; + } + avg[faceI] /= f.size(); + } + + return tavg; + } + else + { + return surfacePtr_().sample(fld); + } } else { - return filterField(obr_.lookupObject<vf>(fieldName), true); + return filterField(fld, true); } } @@ -94,12 +126,11 @@ Foam::tmp<Foam::Field<Type> > Foam::fieldValues::faceSource::getFieldValues template<class Type> -Type Foam::fieldValues::faceSource::processValues +Type Foam::fieldValues::faceSource::processSameTypeValues ( const Field<Type>& values, - const scalarField& magSf, + const vectorField& Sf, const scalarField& weightField - ) const { Type result = pTraits<Type>::zero; @@ -122,11 +153,15 @@ Type Foam::fieldValues::faceSource::processValues } case opAreaAverage: { + const scalarField magSf = mag(Sf); + result = sum(values*magSf)/sum(magSf); break; } case opAreaIntegrate: { + const scalarField magSf = mag(Sf); + result = sum(values*magSf); break; } @@ -142,6 +177,8 @@ Type Foam::fieldValues::faceSource::processValues } case opCoV: { + const scalarField magSf = mag(Sf); + Type meanValue = sum(values*magSf)/sum(magSf); const label nComp = pTraits<Type>::nComponents; @@ -169,6 +206,19 @@ Type Foam::fieldValues::faceSource::processValues } +template<class Type> +Type Foam::fieldValues::faceSource::processValues +( + const Field<Type>& values, + const vectorField& Sf, + const scalarField& weightField +) const +{ + return processSameTypeValues(values, Sf, weightField); +} + + + // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // template<class Type> @@ -186,22 +236,22 @@ bool Foam::fieldValues::faceSource::writeValues(const word& fieldName) weightField = getFieldValues<scalar>(weightFieldName_, true); } - scalarField magSf; + vectorField Sf; if (surfacePtr_.valid()) { - // Get unoriented magSf - magSf = surfacePtr_().magSf(); + // Get oriented Sf + Sf = surfacePtr_().Sf(); } else { - // Get unoriented magSf - magSf = filterField(mesh().magSf(), false); + // Get oriented Sf + Sf = filterField(mesh().Sf(), false); } // Combine onto master combineFields(values); - combineFields(magSf); + combineFields(Sf); combineFields(weightField); // apply weight field @@ -210,7 +260,7 @@ bool Foam::fieldValues::faceSource::writeValues(const word& fieldName) if (Pstream::master()) { - Type result = processValues(values, magSf, weightField); + Type result = processValues(values, Sf, weightField); if (valueOutput_) {