diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C index ba1e110c05ffd4a54604f1d2cc1019b0cee43a69..5a862378484a3f1fb95b711cf6aeaf8ac2dd9eb5 100644 --- a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C +++ b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C @@ -99,11 +99,10 @@ void Foam::fieldValues::faceSource::setFaceZoneFaces() const faceZone& fZone = mesh().faceZones()[zoneId]; - faceId_.setSize(fZone.size()); - facePatchId_.setSize(fZone.size()); - faceSign_.setSize(fZone.size()); + DynamicList<label> faceIds(fZone.size()); + DynamicList<label> facePatchIds(fZone.size()); + DynamicList<label> faceSigns(fZone.size()); - label count = 0; forAll(fZone, i) { label faceI = fZone[i]; @@ -145,27 +144,26 @@ void Foam::fieldValues::faceSource::setFaceZoneFaces() { if (fZone.flipMap()[i]) { - faceSign_[count] = -1; + faceSigns.append(-1); } else { - faceSign_[count] = 1; + faceSigns.append(1); } - faceId_[count] = faceId; - facePatchId_[count] = facePatchId; - count++; + faceIds.append(faceId); + facePatchIds.append(facePatchId); } } - faceId_.setSize(count); - facePatchId_.setSize(count); - faceSign_.setSize(count); + faceId_.transfer(faceIds); + facePatchId_.transfer(facePatchIds); + faceSign_.transfer(faceSigns); nFaces_ = returnReduce(faceId_.size(), sumOp<label>()); if (debug) { Pout<< "Original face zone size = " << fZone.size() - << ", new size = " << count << endl; + << ", new size = " << faceId_.size() << endl; } } @@ -445,12 +443,43 @@ void Foam::fieldValues::faceSource::initialise(const dictionary& dict) if (dict.readIfPresent("weightField", weightFieldName_)) { - Info<< " weight field = " << weightFieldName_; + Info<< " weight field = " << weightFieldName_ << nl; + } + + if (dict.found("orientedWeightField")) + { + if (weightFieldName_ == "none") + { + dict.lookup("orientedWeightField") >> weightFieldName_; + Info<< " weight field = " << weightFieldName_ << nl; + orientWeightField_ = true; + } + else + { + FatalIOErrorIn + ( + "void Foam::fieldValues::faceSource::initialise" + "(" + "const dictionary&" + ")", + dict + ) + << "Either weightField or orientedWeightField can be supplied, " + << "but not both" + << exit(FatalIOError); + } + } + + List<word> orientedFields; + if (dict.readIfPresent("orientedFields", orientedFields)) + { + orientedFieldsStart_ = fields_.size(); + fields_.append(orientedFields); } if (dict.readIfPresent("scaleFactor", scaleFactor_)) { - Info<< " scale factor = " << scaleFactor_; + Info<< " scale factor = " << scaleFactor_ << nl; } Info<< nl << endl; @@ -581,6 +610,8 @@ Foam::fieldValues::faceSource::faceSource source_(sourceTypeNames_.read(dict.lookup("source"))), operation_(operationTypeNames_.read(dict.lookup("operation"))), weightFieldName_("none"), + orientWeightField_(false), + orientedFieldsStart_(labelMax), scaleFactor_(1.0), nFaces_(0), faceId_(), @@ -628,24 +659,42 @@ void Foam::fieldValues::faceSource::write() totalArea = gSum(filterField(mesh().magSf(), false)); } - if (Pstream::master()) { file() << obr_.time().value() << tab << totalArea; } + // construct weight field + scalarField weightField(faceId_.size(), 1.0); + if (weightFieldName_ != "none") + { + weightField = + getFieldValues<scalar> + ( + weightFieldName_, + true, + orientWeightField_ + ); + } + + // Combine onto master + combineFields(weightField); + + // process the fields forAll(fields_, i) { const word& fieldName = fields_[i]; - bool processed = false; + bool ok = false; - processed = processed || writeValues<scalar>(fieldName); - processed = processed || writeValues<vector>(fieldName); - processed = processed || writeValues<sphericalTensor>(fieldName); - processed = processed || writeValues<symmTensor>(fieldName); - processed = processed || writeValues<tensor>(fieldName); + bool orient = i >= orientedFieldsStart_; + ok = ok || writeValues<scalar>(fieldName, weightField, orient); + ok = ok || writeValues<vector>(fieldName, weightField, orient); + ok = ok + || writeValues<sphericalTensor>(fieldName, weightField, orient); + ok = ok || writeValues<symmTensor>(fieldName, weightField, orient); + ok = ok || writeValues<tensor>(fieldName, weightField, orient); - if (!processed) + if (!ok) { WarningIn("void Foam::fieldValues::faceSource::write()") << "Requested field " << fieldName diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H index d58f1d9a571cc874de9ebde0756e23b93cae3c1a..9589304cf3159bccb052162d52f278c30a18e136 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-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -71,8 +71,10 @@ Description sourceName | name of face source if required | no | operation | operation to perform | yes | weightField | name of field to apply weighting | no | + orientedWeightField | name of oriented field to apply weighting | no | scaleFactor | scale factor | no | 1 fields | list of fields to operate on | yes | + orientedFields | list of oriented fields to operate on | no | \endtable \linebreak @@ -109,8 +111,8 @@ Note - faces on empty patches get ignored - if the field is a volField the \c faceZone can only consist of boundary faces - - all fields are oriented according to the \c faceZone (so you might - e.g. see negative pressure) + - the `oriented' entries relate to mesh-oriented fields, such as the + flux, phi. These fields will be oriented according to the face normals. - using \c sampledSurfaces: - not available for surface fields - if interpolate=true they use \c interpolationCellPoint @@ -128,6 +130,7 @@ SeeAlso SourceFiles faceSource.C + faceSourceTemplates.C \*---------------------------------------------------------------------------*/ @@ -242,6 +245,12 @@ protected: //- Weight field name - optional word weightFieldName_; + //- Flag to indicate if flipMap should be applied to the weight field + bool orientWeightField_; + + //- Start index of fields that require application of flipMap + label orientedFieldsStart_; + //- Scale factor - optional scalar scaleFactor_; @@ -282,7 +291,8 @@ protected: tmp<Field<Type> > getFieldValues ( const word& fieldName, - const bool mustGet = false + const bool mustGet = false, + const bool applyOrientation = false ) const; //- Apply the 'operation' to the values. Operation has to @@ -356,7 +366,12 @@ public: //- Templated helper function to output field values template<class Type> - bool writeValues(const word& fieldName); + bool writeValues + ( + const word& fieldName, + const scalarField& weightField, + const bool orient + ); //- Filter a surface field according to faceIds template<class Type> diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C index 6def30c520f992ec55aae58fbbcf8b7db2718b84..c9e69771ffb693f7a6deaec98bb356b5023048d9 100644 --- a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C +++ b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C @@ -54,7 +54,8 @@ template<class Type> Foam::tmp<Foam::Field<Type> > Foam::fieldValues::faceSource::getFieldValues ( const word& fieldName, - const bool mustGet + const bool mustGet, + const bool applyOrientation ) const { typedef GeometricField<Type, fvsPatchField, surfaceMesh> sf; @@ -62,7 +63,7 @@ Foam::tmp<Foam::Field<Type> > Foam::fieldValues::faceSource::getFieldValues if (source_ != stSampledSurface && obr_.foundObject<sf>(fieldName)) { - return filterField(obr_.lookupObject<sf>(fieldName), true); + return filterField(obr_.lookupObject<sf>(fieldName), applyOrientation); } else if (obr_.foundObject<vf>(fieldName)) { @@ -103,7 +104,7 @@ Foam::tmp<Foam::Field<Type> > Foam::fieldValues::faceSource::getFieldValues } else { - return filterField(fld, true); + return filterField(fld, applyOrientation); } } @@ -115,6 +116,7 @@ Foam::tmp<Foam::Field<Type> > Foam::fieldValues::faceSource::getFieldValues "Foam::fieldValues::faceSource::getFieldValues" "(" "const word&, " + "const bool, " "const bool" ") const" ) << "Field " << fieldName << " not found in database" @@ -267,22 +269,20 @@ Type Foam::fieldValues::faceSource::processValues // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // template<class Type> -bool Foam::fieldValues::faceSource::writeValues(const word& fieldName) +bool Foam::fieldValues::faceSource::writeValues +( + const word& fieldName, + const scalarField& weightField, + const bool orient +) { const bool ok = validField<Type>(fieldName); if (ok) { - Field<Type> values(getFieldValues<Type>(fieldName)); - scalarField weightField(values.size(), 1.0); - - if (weightFieldName_ != "none") - { - weightField = getFieldValues<scalar>(weightFieldName_, true); - } + Field<Type> values(getFieldValues<Type>(fieldName, true, orient)); vectorField Sf; - if (surfacePtr_.valid()) { // Get oriented Sf @@ -291,13 +291,12 @@ bool Foam::fieldValues::faceSource::writeValues(const word& fieldName) else { // Get oriented Sf - Sf = filterField(mesh().Sf(), false); + Sf = filterField(mesh().Sf(), true); } // Combine onto master combineFields(values); combineFields(Sf); - combineFields(weightField); // Write raw values on surface if specified if (surfaceWriterPtr_.valid()) @@ -378,7 +377,8 @@ Foam::tmp<Foam::Field<Type> > Foam::fieldValues::faceSource::filterField ( "fieldValues::faceSource::filterField" "(" - "const GeometricField<Type, fvPatchField, volMesh>&" + "const GeometricField<Type, fvPatchField, volMesh>&, " + "const bool" ") const" ) << type() << " " << name_ << ": " << sourceTypeNames_[source_] << "(" << sourceName_ << "):"