From 7694ad7e814587748a39e1506fcfa964fe97067d Mon Sep 17 00:00:00 2001 From: andy Date: Tue, 30 Jul 2013 16:02:50 +0100 Subject: [PATCH 01/20] ENH: fieldAverage - extended to include surface fields --- .../fieldAverage/fieldAverage/fieldAverage.C | 166 ++---- .../fieldAverage/fieldAverage/fieldAverage.H | 92 ++-- .../fieldAverage/fieldAverageTemplates.C | 492 ++++++++++-------- .../fieldAverageItem/fieldAverageItem.C | 12 + .../fieldAverageItem/fieldAverageItem.H | 55 ++ .../fieldAverageItem/fieldAverageItemIO.C | 24 + 6 files changed, 453 insertions(+), 388 deletions(-) diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C index e8f58c370e..b541295c55 100644 --- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C +++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.C @@ -34,114 +34,62 @@ License namespace Foam { defineTypeNameAndDebug(fieldAverage, 0); - -const word fieldAverage::EXT_MEAN = "Mean"; -const word fieldAverage::EXT_PRIME2MEAN = "Prime2Mean"; } // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // -void Foam::fieldAverage::resetFields(wordList& names) +void Foam::fieldAverage::resetFields() { - forAll(names, fieldI) + forAll(faItems_, i) { - if (names[fieldI].size()) + if (faItems_[i].mean()) { - obr_.checkOut(*obr_[names[fieldI]]); + if (obr_.found(faItems_[i].meanFieldName())) + { + obr_.checkOut(*obr_[faItems_[i].meanFieldName()]); + } + } + if (faItems_[i].prime2Mean()) + { + if (obr_.found(faItems_[i].prime2MeanFieldName())) + { + obr_.checkOut(*obr_[faItems_[i].prime2MeanFieldName()]); + } } } - - names.clear(); - names.setSize(faItems_.size()); } void Foam::fieldAverage::initialize() { - resetFields(meanScalarFields_); - resetFields(meanVectorFields_); - resetFields(meanSphericalTensorFields_); - resetFields(meanSymmTensorFields_); - resetFields(meanTensorFields_); - - resetFields(prime2MeanScalarFields_); - resetFields(prime2MeanSymmTensorFields_); + resetFields(); // Add mean fields to the field lists forAll(faItems_, fieldI) { - const word& fieldName = faItems_[fieldI].fieldName(); - if (obr_.foundObject(fieldName)) - { - addMeanField(fieldI, meanScalarFields_); - } - else if (obr_.foundObject(fieldName)) - { - addMeanField(fieldI, meanVectorFields_); - } - else if (obr_.foundObject(fieldName)) - { - addMeanField(fieldI, meanSphericalTensorFields_); - } - else if (obr_.foundObject(fieldName)) - { - addMeanField(fieldI, meanSymmTensorFields_); - } - else if (obr_.foundObject(fieldName)) - { - addMeanField(fieldI, meanTensorFields_); - } - else - { - FatalErrorIn("Foam::fieldAverage::initialize()") - << "Requested field " << faItems_[fieldI].fieldName() - << " does not exist in the database" << nl - << exit(FatalError); - } + addMeanField(fieldI); + addMeanField(fieldI); + addMeanField(fieldI); + addMeanField(fieldI); + addMeanField(fieldI); } // Add prime-squared mean fields to the field lists forAll(faItems_, fieldI) { - if (faItems_[fieldI].prime2Mean()) - { - const word& fieldName = faItems_[fieldI].fieldName(); - if (!faItems_[fieldI].mean()) - { - FatalErrorIn("Foam::fieldAverage::initialize()") - << "To calculate the prime-squared average, the " - << "mean average must also be selected for field " - << fieldName << nl << exit(FatalError); - } + addPrime2MeanField(fieldI); + addPrime2MeanField(fieldI); + } - if (obr_.foundObject(fieldName)) - { - addPrime2MeanField - ( - fieldI, - meanScalarFields_, - prime2MeanScalarFields_ - ); - } - else if (obr_.foundObject(fieldName)) - { - addPrime2MeanField - ( - fieldI, - meanVectorFields_, - prime2MeanSymmTensorFields_ - ); - } - else - { - FatalErrorIn("Foam::fieldAverage::initialize()") - << "prime2Mean average can only be applied to " - << "volScalarFields and volVectorFields" - << nl << " Field: " << fieldName << nl - << exit(FatalError); - } + forAll(faItems_, fieldI) + { + if (!faItems_[fieldI].active()) + { + WarningIn("void Foam::fieldAverage::initialize()") + << "Field " << faItems_[fieldI].fieldName() + << " not found in database for averaging"; } } @@ -173,33 +121,17 @@ void Foam::fieldAverage::calcAverages() Info<< "Calculating averages" << nl << endl; - addMeanSqrToPrime2Mean - ( - meanScalarFields_, - prime2MeanScalarFields_ - ); - addMeanSqrToPrime2Mean - ( - meanVectorFields_, - prime2MeanSymmTensorFields_ - ); + addMeanSqrToPrime2Mean(); + addMeanSqrToPrime2Mean(); - calculateMeanFields(meanScalarFields_); - calculateMeanFields(meanVectorFields_); - calculateMeanFields(meanSphericalTensorFields_); - calculateMeanFields(meanSymmTensorFields_); - calculateMeanFields(meanTensorFields_); + calculateMeanFields(); + calculateMeanFields(); + calculateMeanFields(); + calculateMeanFields(); + calculateMeanFields(); - calculatePrime2MeanFields - ( - meanScalarFields_, - prime2MeanScalarFields_ - ); - calculatePrime2MeanFields - ( - meanVectorFields_, - prime2MeanSymmTensorFields_ - ); + calculatePrime2MeanFields(); + calculatePrime2MeanFields(); forAll(faItems_, fieldI) { @@ -211,14 +143,11 @@ void Foam::fieldAverage::calcAverages() void Foam::fieldAverage::writeAverages() const { - writeFieldList(meanScalarFields_); - writeFieldList(meanVectorFields_); - writeFieldList(meanSphericalTensorFields_); - writeFieldList(meanSymmTensorFields_); - writeFieldList(meanTensorFields_); - - writeFieldList(prime2MeanScalarFields_); - writeFieldList(prime2MeanSymmTensorFields_); + writeFields(); + writeFields(); + writeFields(); + writeFields(); + writeFields(); } @@ -324,13 +253,6 @@ Foam::fieldAverage::fieldAverage resetOnOutput_(false), initialised_(false), faItems_(), - meanScalarFields_(), - meanVectorFields_(), - meanSphericalTensorFields_(), - meanSymmTensorFields_(), - meanTensorFields_(), - prime2MeanScalarFields_(), - prime2MeanSymmTensorFields_(), totalIter_(), totalTime_() { diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.H b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.H index 12cea88cd7..01b2558010 100644 --- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.H +++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverage.H @@ -29,9 +29,9 @@ Group Description This function object calculates average quantities for a user-specified - selection of fields. Fields are entered as a list of sub-dictionaries, - which indicate the type of averages to perform, and can be updated during - the calculation. The current options include: + selection of volumetric and surface fields. Fields are entered as a list + of sub-dictionaries, which indicate the type of averages to perform, and + can be updated during the calculation. The current options include: - \c mean: arithmetic mean: \f[ \overline{x} = \frac{1}{N}\displaystyle\sum\limits_{i=0}^N x_i @@ -142,16 +142,7 @@ class fieldAverage { protected: - // File and field name extensions - - //- Mean average - static const word EXT_MEAN; - - //- Prime-squared average - static const word EXT_PRIME2MEAN; - - - // Private data + // Protected data //- Name of this set of field averages. word name_; @@ -178,22 +169,6 @@ protected: // calculated and output List faItems_; - - // Lists of averages - - // Arithmetic mean fields - wordList meanScalarFields_; - wordList meanVectorFields_; - wordList meanSphericalTensorFields_; - wordList meanSymmTensorFields_; - wordList meanTensorFields_; - - // Prime-squared fields - // Only applicable to volScalarFields / volVectorFields - wordList prime2MeanScalarFields_; - wordList prime2MeanSymmTensorFields_; - - // Counters //- Iteration steps counter @@ -209,24 +184,27 @@ protected: //- Checkout fields (causes deletion) from the database // and reset lists - void resetFields(wordList&); + void resetFields(); //- Reset lists (clear existing values) and initialize averaging. // Check requested field averages are valid, populate field lists void initialize(); - //- Add mean average field to list + //- Add mean average field to database template - void addMeanField(const label, wordList&) const; + void addMeanFieldType(const label fieldI); - //- Add prime-squared average field to list + //- Add mean average field to database + template + void addMeanField(const label fieldI); + + //- Add prime-squared average field to database template - void addPrime2MeanField - ( - const label, - const wordList&, - wordList& - ) const; + void addPrime2MeanFieldType(const label fieldI); + + //- Add prime-squared average field to database + template + void addPrime2MeanField(const label fieldI); // Calculation functions @@ -236,23 +214,27 @@ protected: //- Calculate mean average fields template - void calculateMeanFields(const wordList&) const; + void calculateMeanFieldType(const label fieldI) const; - //- Add mean-squared field value to prime-squared mean field - template - void addMeanSqrToPrime2Mean - ( - const wordList&, - const wordList& - ) const; + //- Calculate mean average fields + template + void calculateMeanFields() const; //- Calculate prime-squared average fields template - void calculatePrime2MeanFields - ( - const wordList&, - const wordList& - ) const; + void calculatePrime2MeanFieldType(const label fieldI) const; + + //- Calculate prime-squared average fields + template + void calculatePrime2MeanFields() const; + + //- Add mean-squared field value to prime-squared mean field + template + void addMeanSqrToPrime2MeanType(const label fieldI) const; + + //- Add mean-squared field value to prime-squared mean field + template + void addMeanSqrToPrime2Mean() const; // I-O @@ -262,7 +244,11 @@ protected: //- Write fields template - void writeFieldList(const wordList&) const; + void writeFieldType(const word& fieldName) const; + + //- Write fields + template + void writeFields() const; //- Write averaging properties - steps and time void writeAveragingProperties() const; diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C index 184df72a9c..996d0073e7 100644 --- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C +++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverage/fieldAverageTemplates.C @@ -25,290 +25,356 @@ License #include "fieldAverageItem.H" #include "volFields.H" +#include "surfaceFields.H" #include "OFstream.H" // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // template -void Foam::fieldAverage::addMeanField -( - const label fieldI, - wordList& meanFieldList -) const +void Foam::fieldAverage::addMeanFieldType(const label fieldI) +{ + faItems_[fieldI].active() = true; + + const word& fieldName = faItems_[fieldI].fieldName(); + const word& meanFieldName = faItems_[fieldI].meanFieldName(); + + Info<< "Reading/calculating field " << meanFieldName << nl << endl; + + if (obr_.foundObject(meanFieldName)) + { + // do nothing + } + else if (obr_.found(meanFieldName)) + { + Info<< "Cannot allocate average field " << meanFieldName + << " since an object with that name already exists." + << " Disabling averaging." << nl << endl; + + faItems_[fieldI].mean() = false; + } + else + { + const Type& baseField = obr_.lookupObject(fieldName); + + // Store on registry + obr_.store + ( + new Type + ( + IOobject + ( + meanFieldName, + obr_.time().timeName(obr_.time().startTime().value()), + obr_, + IOobject::READ_IF_PRESENT, + IOobject::NO_WRITE + ), + 1*baseField + ) + ); + } +} + + +template +void Foam::fieldAverage::addMeanField(const label fieldI) { if (faItems_[fieldI].mean()) { - typedef GeometricField fieldType; + typedef GeometricField volFieldType; + typedef GeometricField surfFieldType; const word& fieldName = faItems_[fieldI].fieldName(); - word meanFieldName = fieldName + EXT_MEAN; - if - ( - (faItems_[fieldI].window() > 0) - && (faItems_[fieldI].windowName() != "") - ) + if (obr_.foundObject(fieldName)) { - meanFieldName = meanFieldName + "_" + faItems_[fieldI].windowName(); + addMeanFieldType(fieldI); } - - Info<< "Reading/calculating field " << meanFieldName << nl << endl; - - if (obr_.foundObject(meanFieldName)) + else if (obr_.foundObject(fieldName)) { - meanFieldList[fieldI] = meanFieldName; - } - else if (obr_.found(meanFieldName)) - { - Info<< "Cannot allocate average field " << meanFieldName - << " since an object with that name already exists." - << " Disabling averaging." << nl << endl; - meanFieldList[fieldI] = word::null; - } - else - { - const fieldType& baseField = - obr_.lookupObject(fieldName); - - // Store on registry - obr_.store - ( - new fieldType - ( - IOobject - ( - meanFieldName, - obr_.time().timeName(obr_.time().startTime().value()), - obr_, - IOobject::READ_IF_PRESENT, - IOobject::NO_WRITE - ), - 1*baseField - ) - ); - - meanFieldList[fieldI] = meanFieldName; + addMeanFieldType(fieldI); } } } template -void Foam::fieldAverage::addPrime2MeanField -( - const label fieldI, - const wordList& meanFieldList, - wordList& prime2MeanFieldList -) const +void Foam::fieldAverage::addPrime2MeanFieldType(const label fieldI) { - if (faItems_[fieldI].mean() && meanFieldList[fieldI].size()) - { - typedef GeometricField fieldType1; - typedef GeometricField fieldType2; + const word& fieldName = faItems_[fieldI].fieldName(); + const word& meanFieldName = faItems_[fieldI].meanFieldName(); + const word& prime2MeanFieldName = faItems_[fieldI].prime2MeanFieldName(); + Info<< "Reading/calculating field " << prime2MeanFieldName << nl << endl; + + if (obr_.foundObject(prime2MeanFieldName)) + { + // do nothing + } + else if (obr_.found(prime2MeanFieldName)) + { + Info<< "Cannot allocate average field " << prime2MeanFieldName + << " since an object with that name already exists." + << " Disabling averaging." << nl << endl; + + faItems_[fieldI].prime2Mean() = false; + } + else + { + const Type1& baseField = obr_.lookupObject(fieldName); + const Type1& meanField = obr_.lookupObject(meanFieldName); + + obr_.store + ( + new Type2 + ( + IOobject + ( + prime2MeanFieldName, + obr_.time().timeName(obr_.time().startTime().value()), + obr_, + IOobject::READ_IF_PRESENT, + IOobject::NO_WRITE + ), + sqr(baseField) - sqr(meanField) + ) + ); + } +} + + +template +void Foam::fieldAverage::addPrime2MeanField(const label fieldI) +{ + typedef GeometricField volFieldType1; + typedef GeometricField surfFieldType1; + + typedef GeometricField volFieldType2; + typedef GeometricField surfFieldType2; + + if (faItems_[fieldI].prime2Mean()) + { const word& fieldName = faItems_[fieldI].fieldName(); - word meanFieldName = fieldName + EXT_PRIME2MEAN; - if - ( - (faItems_[fieldI].window() > 0) - && (faItems_[fieldI].windowName() != "") - ) + if (!faItems_[fieldI].mean()) { - meanFieldName = meanFieldName + "_" + faItems_[fieldI].windowName(); - } - - Info<< "Reading/calculating field " << meanFieldName << nl << endl; - - if (obr_.foundObject(meanFieldName)) - { - prime2MeanFieldList[fieldI] = meanFieldName; - } - else if (obr_.found(meanFieldName)) - { - Info<< "Cannot allocate average field " << meanFieldName - << " since an object with that name already exists." - << " Disabling averaging." << nl << endl; - prime2MeanFieldList[fieldI] = word::null; - } - else - { - const fieldType1& baseField = - obr_.lookupObject(fieldName); - const fieldType1& meanField = - obr_.lookupObject(meanFieldList[fieldI]); - - obr_.store + FatalErrorIn ( - new fieldType2 - ( - IOobject - ( - meanFieldName, - obr_.time().timeName(obr_.time().startTime().value()), - obr_, - IOobject::READ_IF_PRESENT, - IOobject::NO_WRITE - ), - sqr(baseField) - sqr(meanField) - ) - ); + "void Foam::fieldAverage::addPrime2MeanField(const label) const" + ) + << "To calculate the prime-squared average, the " + << "mean average must also be selected for field " + << fieldName << nl << exit(FatalError); + } - prime2MeanFieldList[fieldI] = meanFieldName; + if (obr_.foundObject(fieldName)) + { + addPrime2MeanFieldType(fieldI); + } + else if (obr_.foundObject(fieldName)) + { + addPrime2MeanFieldType(fieldI); } } } template -void Foam::fieldAverage::calculateMeanFields(const wordList& meanFieldList) -const +void Foam::fieldAverage::calculateMeanFieldType(const label fieldI) const { - typedef GeometricField fieldType; + const word& fieldName = faItems_[fieldI].fieldName(); - scalar dt = obr_.time().deltaTValue(); + if (obr_.foundObject(fieldName)) + { + const Type& baseField = obr_.lookupObject(fieldName); + + Type& meanField = const_cast + ( + obr_.lookupObject(faItems_[fieldI].meanFieldName()) + ); + + scalar dt = obr_.time().deltaTValue(); + scalar Dt = totalTime_[fieldI]; + + if (faItems_[fieldI].iterBase()) + { + dt = 1.0; + Dt = scalar(totalIter_[fieldI]); + } + + scalar alpha = (Dt - dt)/Dt; + scalar beta = dt/Dt; + + if (faItems_[fieldI].window() > 0) + { + const scalar w = faItems_[fieldI].window(); + + if (Dt - dt >= w) + { + alpha = (w - dt)/w; + beta = dt/w; + } + } + + meanField = alpha*meanField + beta*baseField; + } +} + + +template +void Foam::fieldAverage::calculateMeanFields() const +{ + typedef GeometricField volFieldType; + typedef GeometricField surfFieldType; forAll(faItems_, i) { - if (faItems_[i].mean() && meanFieldList[i].size()) + if (faItems_[i].mean()) { - const word& fieldName = faItems_[i].fieldName(); - const fieldType& baseField = - obr_.lookupObject(fieldName); - fieldType& meanField = const_cast - ( - obr_.lookupObject(meanFieldList[i]) - ); - - scalar Dt = totalTime_[i]; - if (faItems_[i].iterBase()) - { - dt = 1.0; - Dt = scalar(totalIter_[i]); - } - - scalar alpha = (Dt - dt)/Dt; - scalar beta = dt/Dt; - if (faItems_[i].window() > 0) - { - const scalar w = faItems_[i].window(); - - if (Dt - dt >= w) - { - alpha = (w - dt)/w; - beta = dt/w; - } - } - - meanField = alpha*meanField + beta*baseField; + calculateMeanFieldType(i); + calculateMeanFieldType(i); } } } template -void Foam::fieldAverage::calculatePrime2MeanFields -( - const wordList& meanFieldList, - const wordList& prime2MeanFieldList -) const +void Foam::fieldAverage::calculatePrime2MeanFieldType(const label fieldI) const { - typedef GeometricField fieldType1; - typedef GeometricField fieldType2; + const word& fieldName = faItems_[fieldI].fieldName(); - scalar dt = obr_.time().deltaTValue(); + if (obr_.foundObject(fieldName)) + { + const Type1& baseField = obr_.lookupObject(fieldName); + const Type1& meanField = + obr_.lookupObject(faItems_[fieldI].meanFieldName()); + + Type2& prime2MeanField = const_cast + ( + obr_.lookupObject(faItems_[fieldI].prime2MeanFieldName()) + ); + + scalar dt = obr_.time().deltaTValue(); + scalar Dt = totalTime_[fieldI]; + + if (faItems_[fieldI].iterBase()) + { + dt = 1.0; + Dt = scalar(totalIter_[fieldI]); + } + + scalar alpha = (Dt - dt)/Dt; + scalar beta = dt/Dt; + + if (faItems_[fieldI].window() > 0) + { + const scalar w = faItems_[fieldI].window(); + + if (Dt - dt >= w) + { + alpha = (w - dt)/w; + beta = dt/w; + } + } + + prime2MeanField = + alpha*prime2MeanField + + beta*sqr(baseField) + - sqr(meanField); + } +} + + +template +void Foam::fieldAverage::calculatePrime2MeanFields() const +{ + typedef GeometricField volFieldType1; + typedef GeometricField surfFieldType1; + + typedef GeometricField volFieldType2; + typedef GeometricField surfFieldType2; forAll(faItems_, i) { - if - ( - faItems_[i].prime2Mean() - && meanFieldList[i].size() - && prime2MeanFieldList[i].size() - ) + if (faItems_[i].prime2Mean()) { - const word& fieldName = faItems_[i].fieldName(); - const fieldType1& baseField = - obr_.lookupObject(fieldName); - const fieldType1& meanField = - obr_.lookupObject(meanFieldList[i]); - fieldType2& prime2MeanField = const_cast - ( - obr_.lookupObject(prime2MeanFieldList[i]) - ); - - scalar Dt = totalTime_[i]; - if (faItems_[i].iterBase()) - { - dt = 1.0; - Dt = scalar(totalIter_[i]); - } - - scalar alpha = (Dt - dt)/Dt; - scalar beta = dt/Dt; - if (faItems_[i].window() > 0) - { - const scalar w = faItems_[i].window(); - - if (Dt - dt >= w) - { - alpha = (w - dt)/w; - beta = dt/w; - } - } - - prime2MeanField = - alpha*prime2MeanField - + beta*sqr(baseField) - - sqr(meanField); + calculatePrime2MeanFieldType(i); + calculatePrime2MeanFieldType(i); } } } template -void Foam::fieldAverage::addMeanSqrToPrime2Mean -( - const wordList& meanFieldList, - const wordList& prime2MeanFieldList -) const +void Foam::fieldAverage::addMeanSqrToPrime2MeanType(const label fieldI) const { - typedef GeometricField fieldType1; - typedef GeometricField fieldType2; + const word& fieldName = faItems_[fieldI].fieldName(); + + if (obr_.foundObject(fieldName)) + { + const Type1& meanField = + obr_.lookupObject(faItems_[fieldI].meanFieldName()); + + Type2& prime2MeanField = const_cast + ( + obr_.lookupObject(faItems_[fieldI].prime2MeanFieldName()) + ); + + prime2MeanField += sqr(meanField); + } +} + + +template +void Foam::fieldAverage::addMeanSqrToPrime2Mean() const +{ + typedef GeometricField volFieldType1; + typedef GeometricField surfFieldType1; + + typedef GeometricField volFieldType2; + typedef GeometricField surfFieldType2; forAll(faItems_, i) { - if - ( - faItems_[i].prime2Mean() - && meanFieldList[i].size() - && prime2MeanFieldList[i].size() - ) + if (faItems_[i].prime2Mean()) { - const fieldType1& meanField = - obr_.lookupObject(meanFieldList[i]); - fieldType2& prime2MeanField = const_cast - ( - obr_.lookupObject(prime2MeanFieldList[i]) - ); - - prime2MeanField += sqr(meanField); + addMeanSqrToPrime2MeanType(i); + addMeanSqrToPrime2MeanType(i); } } } template -void Foam::fieldAverage::writeFieldList(const wordList& fieldList) const +void Foam::fieldAverage::writeFieldType(const word& fieldName) const { - typedef GeometricField fieldType; - - forAll(fieldList, i) + if (obr_.foundObject(fieldName)) { - if (fieldList[i].size()) + const Type& f = obr_.lookupObject(fieldName); + f.write(); + } +} + + +template +void Foam::fieldAverage::writeFields() const +{ + typedef GeometricField volFieldType; + typedef GeometricField surfFieldType; + + forAll(faItems_, i) + { + if (faItems_[i].mean()) { - const fieldType& f = obr_.lookupObject(fieldList[i]); - f.write(); + const word& fieldName = faItems_[i].meanFieldName(); + writeFieldType(fieldName); + writeFieldType(fieldName); + } + if (faItems_[i].prime2Mean()) + { + const word& fieldName = faItems_[i].prime2MeanFieldName(); + writeFieldType(fieldName); + writeFieldType(fieldName); } } } diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItem.C b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItem.C index 3b01b21594..9f5334c03a 100644 --- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItem.C +++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItem.C @@ -29,6 +29,9 @@ License namespace Foam { + const word fieldAverageItem::EXT_MEAN = "Mean"; + const word fieldAverageItem::EXT_PRIME2MEAN = "Prime2Mean"; + template<> const char* Foam::NamedEnum < @@ -50,9 +53,12 @@ const Foam::NamedEnum Foam::fieldAverageItem::fieldAverageItem() : + active_(false), fieldName_("unknown"), mean_(0), + meanFieldName_("unknown"), prime2Mean_(0), + prime2MeanFieldName_("unknown"), base_(ITER), window_(-1.0), windowName_("") @@ -61,9 +67,12 @@ Foam::fieldAverageItem::fieldAverageItem() Foam::fieldAverageItem::fieldAverageItem(const fieldAverageItem& faItem) : + active_(faItem.active_), fieldName_(faItem.fieldName_), mean_(faItem.mean_), + meanFieldName_(faItem.meanFieldName_), prime2Mean_(faItem.prime2Mean_), + prime2MeanFieldName_(faItem.prime2MeanFieldName_), base_(faItem.base_), window_(faItem.window_), windowName_(faItem.windowName_) @@ -91,9 +100,12 @@ void Foam::fieldAverageItem::operator=(const fieldAverageItem& rhs) } // Set updated values + active_ = rhs.active_; fieldName_ = rhs.fieldName_; mean_ = rhs.mean_; + meanFieldName_ = rhs.meanFieldName_; prime2Mean_ = rhs.prime2Mean_; + prime2MeanFieldName_ = rhs.prime2MeanFieldName_; base_ = rhs.base_; window_ = rhs.window_; windowName_ = rhs.windowName_; diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItem.H b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItem.H index 7fe21a9aef..0c40bac95a 100644 --- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItem.H +++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItem.H @@ -78,6 +78,14 @@ public: // Public data + // File and field name extensions + + //- Mean average + static const word EXT_MEAN; + + //- Prime-squared average + static const word EXT_PRIME2MEAN; + //- Enumeration defining the averaging base type enum baseType { @@ -90,15 +98,24 @@ private: // Private data + //- Active flag + Switch active_; + //- Field name word fieldName_; //- Compute mean flag Switch mean_; + //- Name of mean field + word meanFieldName_; + //- Compute prime-squared mean flag Switch prime2Mean_; + //- Name of prime-squared mean field + word prime2MeanFieldName_; + //- Averaging base type names static const NamedEnum baseTypeNames_; @@ -134,6 +151,18 @@ public: // Access + //- Return const access to the active flag + const Switch& active() const + { + return active_; + } + + //- Return non-const access to the active flag + Switch& active() + { + return active_; + } + //- Return const access to the field name const word& fieldName() const { @@ -146,12 +175,36 @@ public: return mean_; } + //- Return non-const access to the mean flag + Switch& mean() + { + return mean_; + } + + //- Return const access to the mean field name + const word& meanFieldName() const + { + return meanFieldName_; + } + //- Return const access to the prime-squared mean flag const Switch& prime2Mean() const { return prime2Mean_; } + //- Return non-const access to the prime-squared mean flag + Switch& prime2Mean() + { + return prime2Mean_; + } + + //- Return const access to the prime-squared mean field name + const word& prime2MeanFieldName() const + { + return prime2MeanFieldName_; + } + //- Return averaging base type name const word base() const { @@ -197,7 +250,9 @@ public: return a.fieldName_ == b.fieldName_ && a.mean_ == b.mean_ + && a.meanFieldName_ == b.meanFieldName_ && a.prime2Mean_ == b.prime2Mean_ + && a.prime2MeanFieldName_ == b.prime2MeanFieldName_ && a.base_ == b.base_ && a.window_ == b.window_ && a.windowName_ == b.windowName_; diff --git a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItemIO.C b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItemIO.C index af293ff989..7dfee8646d 100644 --- a/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItemIO.C +++ b/src/postProcessing/functionObjects/field/fieldAverage/fieldAverageItem/fieldAverageItemIO.C @@ -31,9 +31,12 @@ License Foam::fieldAverageItem::fieldAverageItem(Istream& is) : + active_(false), fieldName_("unknown"), mean_(0), + meanFieldName_("unknown"), prime2Mean_(0), + prime2MeanFieldName_("unknown"), base_(ITER), window_(-1.0) { @@ -47,6 +50,14 @@ Foam::fieldAverageItem::fieldAverageItem(Istream& is) base_ = baseTypeNames_[entry.lookup("base")]; window_ = entry.lookupOrDefault("window", -1.0); windowName_ = entry.lookupOrDefault("windowName", ""); + + meanFieldName_ = fieldName_ + EXT_MEAN; + prime2MeanFieldName_ = fieldName_ + EXT_PRIME2MEAN; + if ((window_ > 0) && (windowName_ != "")) + { + meanFieldName_ = meanFieldName_ + "_" + windowName_; + prime2MeanFieldName_ = prime2MeanFieldName_ + "_" + windowName_; + } } @@ -62,6 +73,7 @@ Foam::Istream& Foam::operator>>(Istream& is, fieldAverageItem& faItem) const dictionaryEntry entry(dictionary::null, is); + faItem.active_ = false; faItem.fieldName_ = entry.keyword(); entry.lookup("mean") >> faItem.mean_; entry.lookup("prime2Mean") >> faItem.prime2Mean_; @@ -69,6 +81,18 @@ Foam::Istream& Foam::operator>>(Istream& is, fieldAverageItem& faItem) faItem.window_ = entry.lookupOrDefault("window", -1.0); faItem.windowName_ = entry.lookupOrDefault("windowName", ""); + faItem.meanFieldName_ = faItem.fieldName_ + fieldAverageItem::EXT_MEAN; + faItem.prime2MeanFieldName_ = + faItem.fieldName_ + fieldAverageItem::EXT_PRIME2MEAN; + + if ((faItem.window_ > 0) && (faItem.windowName_ != "")) + { + faItem.meanFieldName_ = + faItem.meanFieldName_ + "_" + faItem.windowName_; + + faItem.prime2MeanFieldName_ = + faItem.prime2MeanFieldName_ + "_" + faItem.windowName_; + } return is; } From 4e91dd46a863fc6bfc0134fcdc00aea484f20230 Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 5 Aug 2013 12:36:10 +0100 Subject: [PATCH 02/20] ENH: Removed unused files --- .../constant/energySourceProperties | 22 ------------------ .../parcelInBox/constant/massSourceProperties | 23 ------------------- .../constant/momentumSourceProperties | 23 ------------------- 3 files changed, 68 deletions(-) delete mode 100644 tutorials/lagrangian/reactingParcelFoam/parcelInBox/constant/energySourceProperties delete mode 100644 tutorials/lagrangian/reactingParcelFoam/parcelInBox/constant/massSourceProperties delete mode 100644 tutorials/lagrangian/reactingParcelFoam/parcelInBox/constant/momentumSourceProperties diff --git a/tutorials/lagrangian/reactingParcelFoam/parcelInBox/constant/energySourceProperties b/tutorials/lagrangian/reactingParcelFoam/parcelInBox/constant/energySourceProperties deleted file mode 100644 index b551f35f22..0000000000 --- a/tutorials/lagrangian/reactingParcelFoam/parcelInBox/constant/energySourceProperties +++ /dev/null @@ -1,22 +0,0 @@ -/*--------------------------------*- C++ -*----------------------------------*\ -| ========= | | -| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | -| \\ / O peration | Version: dev | -| \\ / A nd | Web: www.OpenFOAM.org | -| \\/ M anipulation | | -\*---------------------------------------------------------------------------*/ -FoamFile -{ - version 2.0; - format ascii; - class dictionary; - location "constant"; - object energySourcesProperties; -} -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -( - // none -); - -// ************************************************************************* // diff --git a/tutorials/lagrangian/reactingParcelFoam/parcelInBox/constant/massSourceProperties b/tutorials/lagrangian/reactingParcelFoam/parcelInBox/constant/massSourceProperties deleted file mode 100644 index 11811461db..0000000000 --- a/tutorials/lagrangian/reactingParcelFoam/parcelInBox/constant/massSourceProperties +++ /dev/null @@ -1,23 +0,0 @@ -/*--------------------------------*- C++ -*----------------------------------*\ -| ========= | | -| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | -| \\ / O peration | Version: dev | -| \\ / A nd | Web: www.OpenFOAM.org | -| \\/ M anipulation | | -\*---------------------------------------------------------------------------*/ -FoamFile -{ - version 2.0; - format ascii; - class dictionary; - location "constant"; - object massSourcesProperties; -} -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -( - // none -); - - -// ************************************************************************* // diff --git a/tutorials/lagrangian/reactingParcelFoam/parcelInBox/constant/momentumSourceProperties b/tutorials/lagrangian/reactingParcelFoam/parcelInBox/constant/momentumSourceProperties deleted file mode 100644 index c9cf6ca3fe..0000000000 --- a/tutorials/lagrangian/reactingParcelFoam/parcelInBox/constant/momentumSourceProperties +++ /dev/null @@ -1,23 +0,0 @@ -/*--------------------------------*- C++ -*----------------------------------*\ -| ========= | | -| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | -| \\ / O peration | Version: dev | -| \\ / A nd | Web: www.OpenFOAM.org | -| \\/ M anipulation | | -\*---------------------------------------------------------------------------*/ -FoamFile -{ - version 2.0; - format ascii; - class dictionary; - location "constant"; - object momentumSourcesProperties; -} -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -( - // none -); - - -// ************************************************************************* // From 28297e9d422385229f3041506d47016fbae13755 Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 5 Aug 2013 13:32:47 +0100 Subject: [PATCH 03/20] BUG: Corrected header documentation - mantis #941 --- .../turbulentIntensityKineticEnergyInletFvPatchScalarField.H | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/finiteVolume/fields/fvPatchFields/derived/turbulentIntensityKineticEnergyInlet/turbulentIntensityKineticEnergyInletFvPatchScalarField.H b/src/finiteVolume/fields/fvPatchFields/derived/turbulentIntensityKineticEnergyInlet/turbulentIntensityKineticEnergyInletFvPatchScalarField.H index b2d1f2123e..3534d888a3 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/turbulentIntensityKineticEnergyInlet/turbulentIntensityKineticEnergyInletFvPatchScalarField.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/turbulentIntensityKineticEnergyInlet/turbulentIntensityKineticEnergyInletFvPatchScalarField.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -33,7 +33,7 @@ Description mean velocity: \f[ - k_p = 1.5 I |U|^2 + k_p = 1.5 (I |U|)^2 \f] where From 36fa660f36617f8b97cd1de80aa14715edaaf362 Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 5 Aug 2013 13:42:18 +0100 Subject: [PATCH 04/20] BUG: Lagrangian TMax set using pvInvert function - mantis #939 --- .../LiquidEvaporation/LiquidEvaporation.C | 8 ++------ .../LiquidEvaporation/LiquidEvaporation.H | 2 +- .../LiquidEvaporationBoil/LiquidEvaporationBoil.C | 5 ++--- .../LiquidEvaporationBoil/LiquidEvaporationBoil.H | 2 +- .../PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.C | 6 +----- .../PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H | 2 +- 6 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.C b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.C index b46ea2b5bf..5d7616b158 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.C +++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.C @@ -242,16 +242,12 @@ Foam::scalar Foam::LiquidEvaporation::dh template -Foam::scalar Foam::LiquidEvaporation::TMax -( - const scalar pIn, - const scalar TIn -) const +Foam::scalar Foam::LiquidEvaporation::TMax(const scalar pIn) const { scalar T = -GREAT; forAll(liquids_, i) { - T = max(T, liquids_.properties()[i].pv(pIn, TIn)); + T = max(T, liquids_.properties()[i].pv(pIn)); } return T; diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.H b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.H index 5a97dc7394..fb2e2cdd9c 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.H +++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.H @@ -132,7 +132,7 @@ public: ) const; //- Return maximum/limiting temperature - virtual scalar TMax(const scalar pIn, const scalar TIn) const; + virtual scalar TMax(const scalar pIn) const; }; diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.C b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.C index 8a88620992..468975d179 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.C +++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.C @@ -343,14 +343,13 @@ Foam::scalar Foam::LiquidEvaporationBoil::dh template Foam::scalar Foam::LiquidEvaporationBoil::TMax ( - const scalar pIn, - const scalar TIn + const scalar pIn ) const { scalar T = -GREAT; forAll(liquids_, i) { - T = max(T, liquids_.properties()[i].pv(pIn, TIn)); + T = max(T, liquids_.properties()[i].pv(pIn)); } return T; diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.H b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.H index bf9ca867ce..2d11f55f32 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.H +++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporationBoil/LiquidEvaporationBoil.H @@ -142,7 +142,7 @@ public: ) const; //- Return maximum/limiting temperature - virtual scalar TMax(const scalar pIn, const scalar TIn) const; + virtual scalar TMax(const scalar pIn) const; }; diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.C b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.C index 7141ff9814..3ba13f27e1 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.C +++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.C @@ -179,11 +179,7 @@ Foam::scalar Foam::PhaseChangeModel::dh template -Foam::scalar Foam::PhaseChangeModel::TMax -( - const scalar, - const scalar -) const +Foam::scalar Foam::PhaseChangeModel::TMax(const scalar) const { return GREAT; } diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H index ac6c5c06b3..f61031c758 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H +++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H @@ -185,7 +185,7 @@ public: ) const; //- Return maximum/limiting temperature - virtual scalar TMax(const scalar pIn, const scalar TIn) const; + virtual scalar TMax(const scalar pIn) const; //- Add to phase change mass void addToPhaseChangeMass(const scalar dMass); From 37b33d084ab331a6d8c18321732ec5e6e072de04 Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 5 Aug 2013 15:22:25 +0100 Subject: [PATCH 05/20] ENH: snappy - do not merge patch faces on either side of nelwy created baffles --- .../autoHexMeshDriver/autoLayerDriver.C | 5 +- .../autoHexMeshDriver/autoRefineDriver.C | 5 +- .../autoHexMeshDriver/autoSnapDriver.C | 58 +++++++++++++++++-- .../autoHexMeshDriver/autoSnapDriver.H | 3 +- .../meshRefinement/meshRefinement.H | 3 +- .../meshRefinement/meshRefinementMerge.C | 26 ++++++++- 6 files changed, 88 insertions(+), 12 deletions(-) diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C index 09afd2f1de..1d9ecc0bc7 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C @@ -2470,12 +2470,15 @@ void Foam::autoLayerDriver::mergePatchFacesUndo << " (0=straight, 180=fully concave)" << nl << endl; + const fvMesh& mesh = meshRefiner_.mesh(); + label nChanged = meshRefiner_.mergePatchFacesUndo ( minCos, concaveCos, meshRefiner_.meshedPatches(), - motionDict + motionDict, + labelList(mesh.nFaces() -1) ); nChanged += meshRefiner_.mergeEdgesUndo(minCos, motionDict); diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C index 82bfa13522..1716117f24 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C @@ -1079,12 +1079,15 @@ void Foam::autoRefineDriver::mergePatchFaces << "----------------------------" << nl << endl; + const fvMesh& mesh = meshRefiner_.mesh(); + meshRefiner_.mergePatchFacesUndo ( Foam::cos(degToRad(45.0)), Foam::cos(degToRad(45.0)), meshRefiner_.meshedPatches(), - motionDict + motionDict, + labelList(mesh.nFaces(), -1) ); if (debug) diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C index 3927305177..b3910a26c4 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C @@ -1348,7 +1348,8 @@ bool Foam::autoSnapDriver::scaleMesh Foam::autoPtr Foam::autoSnapDriver::repatchToSurface ( const snapParameters& snapParams, - const labelList& adaptPatchIDs + const labelList& adaptPatchIDs, + const labelList& preserveFaces ) { const fvMesh& mesh = meshRefiner_.mesh(); @@ -1375,7 +1376,16 @@ Foam::autoPtr Foam::autoSnapDriver::repatchToSurface // Faces that do not move PackedBoolList isZonedFace(mesh.nFaces()); { - // 1. All faces on zoned surfaces + // 1. Preserve faces in preserveFaces list + forAll(preserveFaces, faceI) + { + if (preserveFaces[faceI] != -1) + { + isZonedFace.set(faceI, 1); + } + } + + // 2. All faces on zoned surfaces const wordList& faceZoneNames = surfaces.faceZoneNames(); const faceZoneMesh& fZones = mesh.faceZones(); @@ -1531,6 +1541,15 @@ void Foam::autoSnapDriver::doSnap baffles ); + // Keep copy of baffles + labelList origBaffles(mesh.nFaces(), -1); + + forAll(baffles, i) + { + const labelPair& baffle = baffles[i]; + origBaffles[baffle.first()] = baffle.second(); + origBaffles[baffle.second()] = baffle.first(); + } // Selectively 'forget' about the baffles, i.e. not check across them // or merge across them. @@ -1618,6 +1637,19 @@ void Foam::autoSnapDriver::doSnap ); meshRefinement::updateList(mapPtr().faceMap(), -1, filterFace); + const labelList& reverseFaceMap = mapPtr().reverseFaceMap(); + origBaffles.setSize(mesh.nFaces()); + origBaffles = -1; + + forAll(baffles, i) + { + labelPair& baffle = baffles[i]; + baffle.first() = reverseFaceMap[baffle.first()]; + baffle.second() = reverseFaceMap[baffle.second()]; + origBaffles[baffle.first()] = baffle.second(); + origBaffles[baffle.second()] = baffle.first(); + } + if (debug&meshRefinement::MESH) { const_cast(mesh.time())++; @@ -1834,10 +1866,23 @@ void Foam::autoSnapDriver::doSnap } // Merge any introduced baffles. - mergeZoneBaffles(baffles); + { + autoPtr mapPtr = mergeZoneBaffles(baffles); + + if (mapPtr.valid()) + { + forAll(origBaffles, faceI) + { + if (origBaffles[faceI] != -1) + { + origBaffles[faceI] = mapPtr->reverseFaceMap()[faceI]; + } + } + } + } // Repatch faces according to nearest. - repatchToSurface(snapParams, adaptPatchIDs); + repatchToSurface(snapParams, adaptPatchIDs, origBaffles); // Repatching might have caused faces to be on same patch and hence // mergeable so try again to merge coplanar faces @@ -1846,7 +1891,8 @@ void Foam::autoSnapDriver::doSnap featureCos, // minCos featureCos, // concaveCos meshRefiner_.meshedPatches(), - motionDict + motionDict, + origBaffles ); nChanged += meshRefiner_.mergeEdgesUndo @@ -1855,7 +1901,7 @@ void Foam::autoSnapDriver::doSnap motionDict ); - if (nChanged > 0 && debug&meshRefinement::MESH) + if (nChanged > 0 && debug & meshRefinement::MESH) { const_cast(mesh.time())++; Info<< "Writing patchFace merged mesh to time " diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.H b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.H index f93ef62e08..c0a0adcde2 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.H +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.H @@ -474,7 +474,8 @@ public: autoPtr repatchToSurface ( const snapParameters& snapParams, - const labelList& adaptPatchIDs + const labelList& adaptPatchIDs, + const labelList& preserveFaces ); void doSnap diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H index 085f096c72..58b90a2bf2 100644 --- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H +++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H @@ -920,7 +920,8 @@ public: const scalar minCos, const scalar concaveCos, const labelList& patchIDs, - const dictionary& motionDict + const dictionary& motionDict, + const labelList& preserveFaces ); autoPtr doRemovePoints diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementMerge.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementMerge.C index c8ac47b5c5..b9a5aad7de 100644 --- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementMerge.C +++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementMerge.C @@ -249,7 +249,8 @@ Foam::label Foam::meshRefinement::mergePatchFacesUndo const scalar minCos, const scalar concaveCos, const labelList& patchIDs, - const dictionary& motionDict + const dictionary& motionDict, + const labelList& preserveFaces ) { // Patch face merging engine @@ -280,7 +281,7 @@ Foam::label Foam::meshRefinement::mergePatchFacesUndo // Get all sets of faces that can be merged. Since only faces on the same // patch get merged there is no risk of e.g. patchID faces getting merged // with original patches (or even processor patches). There is a risk - // though of original patchfaces getting merged if they make a small + // though of original patch faces getting merged if they make a small // angle. Would be pretty weird starting mesh though. labelListList allFaceSets ( @@ -292,6 +293,27 @@ Foam::label Foam::meshRefinement::mergePatchFacesUndo ) ); + label compactI = 0; + forAll(allFaceSets, i) + { + bool keep = true; + const labelList& set = allFaceSets[i]; + forAll(set, j) + { + if (preserveFaces[set[j]] != -1) + { + keep = false; + break; + } + } + + if (keep && (compactI != i)) + { + allFaceSets[compactI++] = set; + } + } + allFaceSets.setSize(compactI); + label nFaceSets = returnReduce(allFaceSets.size(), sumOp