diff --git a/src/finiteVolume/fields/fvPatchFields/derived/mappedField/mappedFieldFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/mappedField/mappedFieldFvPatchField.C index ae597b4bfc..bd15d4764a 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/mappedField/mappedFieldFvPatchField.C +++ b/src/finiteVolume/fields/fvPatchFields/derived/mappedField/mappedFieldFvPatchField.C @@ -27,7 +27,6 @@ License #include "volFields.H" #include "interpolationCell.H" -#include "mapDistribute.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -47,7 +46,8 @@ mappedFieldFvPatchField::mappedFieldFvPatchField fixedValueFvPatchField(p, iF), fieldName_(iF.name()), setAverage_(false), - average_(pTraits::zero) + average_(pTraits::zero), + interpolationScheme_(interpolationCell::typeName) {} @@ -64,7 +64,8 @@ mappedFieldFvPatchField::mappedFieldFvPatchField fixedValueFvPatchField(ptf, p, iF, mapper), fieldName_(ptf.fieldName_), setAverage_(ptf.setAverage_), - average_(ptf.average_) + average_(ptf.average_), + interpolationScheme_(ptf.interpolationScheme_) {} @@ -80,8 +81,14 @@ mappedFieldFvPatchField::mappedFieldFvPatchField fixedValueFvPatchField(p, iF, dict), fieldName_(dict.template lookupOrDefault("fieldName", iF.name())), setAverage_(readBool(dict.lookup("setAverage"))), - average_(pTraits(dict.lookup("average"))) -{} + average_(pTraits(dict.lookup("average"))), + interpolationScheme_(interpolationCell::typeName) +{ + if (mode() == mappedPatchBase::NEARESTCELL) + { + dict.lookup("interpolationScheme") >> interpolationScheme_; + } +} template @@ -99,7 +106,8 @@ mappedFieldFvPatchField::mappedFieldFvPatchField // My settings const word& fieldName, const bool setAverage, - const Type average + const Type average, + const word& interpolationScheme ) : mappedPatchBase @@ -113,7 +121,8 @@ mappedFieldFvPatchField::mappedFieldFvPatchField fixedValueFvPatchField(p, iF), fieldName_(fieldName), setAverage_(setAverage), - average_(average) + average_(average), + interpolationScheme_(interpolationScheme) {} @@ -127,7 +136,8 @@ mappedFieldFvPatchField::mappedFieldFvPatchField fixedValueFvPatchField(ptf), fieldName_(ptf.fieldName_), setAverage_(ptf.setAverage_), - average_(ptf.average_) + average_(ptf.average_), + interpolationScheme_(ptf.interpolationScheme_) {} @@ -142,7 +152,8 @@ mappedFieldFvPatchField::mappedFieldFvPatchField fixedValueFvPatchField(ptf, iF), fieldName_(ptf.fieldName_), setAverage_(ptf.setAverage_), - average_(ptf.average_) + average_(ptf.average_), + interpolationScheme_(ptf.interpolationScheme_) {} @@ -180,6 +191,22 @@ mappedFieldFvPatchField::sampleField() const } +template +const interpolation& +mappedFieldFvPatchField::interpolator() const +{ + if (!interpolator_.valid()) + { + interpolator_ = interpolation::New + ( + interpolationScheme_, + sampleField() + ); + } + return interpolator_(); +} + + template void mappedFieldFvPatchField::updateCoeffs() { @@ -195,6 +222,7 @@ void mappedFieldFvPatchField::updateCoeffs() int oldTag = UPstream::msgType(); UPstream::msgType() = oldTag + 1; + const fvMesh& thisMesh = this->patch().boundaryMesh().mesh(); const fvMesh& nbrMesh = refCast(sampleMesh()); // Result of obtaining remote values @@ -204,9 +232,42 @@ void mappedFieldFvPatchField::updateCoeffs() { case NEARESTCELL: { - newValues = sampleField(); + const mapDistribute& mapDist = this->mappedPatchBase::map(); - this->distribute(newValues); + if (interpolationScheme_ != interpolationCell::typeName) + { + // Need to do interpolation so need cells to sample + + // Send back sample points to the processor that holds the cell + vectorField samples(samplePoints()); + mapDist.reverseDistribute + ( + (sameRegion() ? thisMesh.nCells() : nbrMesh.nCells()), + point::max, + samples + ); + + const interpolation& interp = interpolator(); + + newValues.setSize(samples.size(), pTraits::max); + forAll(samples, cellI) + { + if (samples[cellI] != point::max) + { + newValues[cellI] = interp.interpolate + ( + samples[cellI], + cellI + ); + } + } + } + else + { + newValues = sampleField(); + } + + mapDist.distribute(newValues); break; } @@ -306,6 +367,8 @@ void mappedFieldFvPatchField::write(Ostream& os) const os.writeKeyword("fieldName") << fieldName_ << token::END_STATEMENT << nl; os.writeKeyword("setAverage") << setAverage_ << token::END_STATEMENT << nl; os.writeKeyword("average") << average_ << token::END_STATEMENT << nl; + os.writeKeyword("interpolationScheme") << interpolationScheme_ + << token::END_STATEMENT << nl; this->writeEntry("value", os); } diff --git a/src/finiteVolume/fields/fvPatchFields/derived/mappedField/mappedFieldFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/derived/mappedField/mappedFieldFvPatchField.H index cc75b17361..11c0425bed 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/mappedField/mappedFieldFvPatchField.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/mappedField/mappedFieldFvPatchField.H @@ -40,6 +40,7 @@ SourceFiles #include "mappedPatchBase.H" #include "fixedValueFvPatchFields.H" +#include "interpolation.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -69,12 +70,21 @@ class mappedFieldFvPatchField // setAverage_ is set true const Type average_; + //- Interpolation scheme to use for nearestCell mode + word interpolationScheme_; + + //- Pointer to the cell interpolator + mutable autoPtr > interpolator_; + // Private Member Functions //- Field to sample. Either on my or nbr mesh const GeometricField& sampleField() const; + //- Access the interpolation method + const interpolation& interpolator() const; + public: @@ -115,7 +125,8 @@ public: // My settings const word& fieldName, const bool setAverage, - const Type average + const Type average, + const word& interpolationScheme ); //- Construct by mapping given