From 6e87c27f8e1664a82031336016aead66d1e92277 Mon Sep 17 00:00:00 2001 From: mattijs Date: Tue, 14 Jan 2014 17:24:52 +0000 Subject: [PATCH 1/6] ENH: extendedEdgeMesh: size printing --- .../extendedEdgeMesh/extendedEdgeMesh.C | 43 +++++++++++++------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/src/edgeMesh/extendedEdgeMesh/extendedEdgeMesh.C b/src/edgeMesh/extendedEdgeMesh/extendedEdgeMesh.C index 5ac41224e3..e2c7ddb991 100644 --- a/src/edgeMesh/extendedEdgeMesh/extendedEdgeMesh.C +++ b/src/edgeMesh/extendedEdgeMesh/extendedEdgeMesh.C @@ -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 @@ -31,6 +31,7 @@ License #include "OBJstream.H" #include "DynamicField.H" #include "edgeMeshFormatsCore.H" +#include "IOmanip.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -1459,23 +1460,41 @@ void Foam::extendedEdgeMesh::writeStats(Ostream& os) const { edgeMesh::writeStats(os); - os << indent << "point offsets :" << nl; + os << indent << "point classification (size and offset) :" << nl; os << incrIndent; - os << indent << "convex feature points : " << convexStart_ << nl; - os << indent << "concave feature points : " << concaveStart_ << nl; - os << indent << "mixed feature points : " << mixedStart_ << nl; - os << indent << "other (non-feature) points : " << nonFeatureStart_ << nl; + os << indent << "convex feature points : " + << setw(8) << concaveStart_-convexStart_ + << setw(8) << convexStart_ << nl; + os << indent << "concave feature points : " + << setw(8) << mixedStart_-concaveStart_ + << setw(8) << concaveStart_ << nl; + os << indent << "mixed feature points : " + << setw(8) << nonFeatureStart_-mixedStart_ + << setw(8) << mixedStart_ << nl; + os << indent << "other (non-feature) points : " + << setw(8) << points().size()-nonFeatureStart_ + << setw(8) << nonFeatureStart_ << nl; os << decrIndent; - os << indent << "edge offsets :" << nl; + os << indent << "edge classification (size and offset) :" << nl; os << incrIndent; - os << indent << "external (convex angle) edges : " << externalStart_ + os << indent << "external (convex angle) edges : " + << setw(8) << internalStart_-externalStart_ + << setw(8) << externalStart_ << nl; - os << indent << "internal (concave angle) edges : " << internalStart_ + os << indent << "internal (concave angle) edges : " + << setw(8) << flatStart_-internalStart_ + << setw(8) << internalStart_ << nl; - os << indent << "flat region edges : " << flatStart_ << nl; - os << indent << "open edges : " << openStart_ << nl; - os << indent << "multiply connected edges : " << multipleStart_ + os << indent << "flat region edges : " + << setw(8) << openStart_-flatStart_ + << setw(8) << flatStart_ << nl; + os << indent << "open edges : " + << setw(8) << multipleStart_-openStart_ + << setw(8) << openStart_ << nl; + os << indent << "multiply connected edges : " + << setw(8) << edges().size()-multipleStart_ + << setw(8) << multipleStart_ << nl; os << decrIndent; } From d913e1c133558e788534e02c90e3251b557020db Mon Sep 17 00:00:00 2001 From: mattijs Date: Tue, 14 Jan 2014 17:34:06 +0000 Subject: [PATCH 2/6] ENH: coded: allow for NFS skew --- .../db/dynamicLibrary/codedBase/codedBase.C | 80 ++++++++++++++++++- .../db/dynamicLibrary/codedBase/codedBase.H | 6 +- 2 files changed, 83 insertions(+), 3 deletions(-) diff --git a/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C b/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C index c899b97b59..c256333cb8 100644 --- a/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C +++ b/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.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-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -30,6 +30,15 @@ License #include "dlLibraryTable.H" #include "PstreamReduceOps.H" #include "OSspecific.H" +#include "regIOobject.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(codedBase, 0); +} + // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // @@ -169,7 +178,9 @@ void Foam::codedBase::createLibrary const dynamicCodeContext& context ) const { - bool create = Pstream::master(); + bool create = + Pstream::master() + || (regIOobject::fileModificationSkew <= 0); // not NFS if (create) { @@ -206,6 +217,71 @@ void Foam::codedBase::createLibrary // all processes must wait for compile to finish + if (regIOobject::fileModificationSkew > 0) + { + //- Since the library has only been compiled on the master the + // other nodes need to pick this library up through NFS + // We do this by just polling a few times using the + // fileModificationSkew. + + const fileName libPath = dynCode.libPath(); + + off_t mySize = Foam::fileSize(libPath); + off_t masterSize = mySize; + Pstream::scatter(masterSize); + + if (debug) + { + Pout<< endl<< "on processor " << Pstream::myProcNo() + << " have masterSize:" << masterSize + << " and localSize:" << mySize + << endl; + } + + + if (mySize < masterSize) + { + if (debug) + { + Pout<< "Local file " << libPath + << " not of same size (" << mySize + << ") as master (" + << masterSize << "). Waiting for " + << regIOobject::fileModificationSkew + << " seconds." << endl; + } + Foam::sleep(regIOobject::fileModificationSkew); + + // Recheck local size + mySize = Foam::fileSize(libPath); + + if (mySize < masterSize) + { + FatalIOErrorIn + ( + "functionEntries::codeStream::execute(..)", + context.dict() + ) << "Cannot read (NFS mounted) library " << nl + << libPath << nl + << "on processor " << Pstream::myProcNo() + << " detected size " << mySize + << " whereas master size is " << masterSize + << " bytes." << nl + << "If your case is not NFS mounted" + << " (so distributed) set fileModificationSkew" + << " to 0" + << exit(FatalIOError); + } + } + + if (debug) + { + Pout<< endl<< "on processor " << Pstream::myProcNo() + << " after waiting: have masterSize:" << masterSize + << " and localSize:" << mySize + << endl; + } + } reduce(create, orOp()); } diff --git a/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.H b/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.H index a6bce15a25..e0d4db77bf 100644 --- a/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.H +++ b/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.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-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -119,6 +119,10 @@ protected: public: + //- Runtime type information + ClassName("codedBase"); + + // Constructors //- Construct null From 304ae8af3e2c56cf4a14038021e0e2e7ae2e13d2 Mon Sep 17 00:00:00 2001 From: andy Date: Tue, 14 Jan 2014 17:40:16 +0000 Subject: [PATCH 3/6] ENH: AMI - added support/robustness for case where sum of weights falls below threshold --- .../cyclicAMI/cyclicAMIFvPatchField.C | 35 ++- .../constraint/cyclicAMI/cyclicAMIFvPatch.C | 17 +- .../constraint/cyclicAMI/cyclicAMIFvPatch.H | 25 ++- .../AMIInterpolation/AMIInterpolation.C | 207 ++++++++++++++---- .../AMIInterpolation/AMIInterpolation.H | 48 ++-- .../AMIInterpolation/AMIInterpolationI.H | 19 +- .../cyclicAMIPointPatchField.C | 43 +++- .../cyclicAMIPolyPatch/cyclicAMIPolyPatch.C | 26 ++- .../cyclicAMIPolyPatch/cyclicAMIPolyPatch.H | 18 +- .../cyclicAMIPolyPatchTemplates.C | 40 ++-- .../meshToMesh/meshToMeshTemplates.C | 7 +- 11 files changed, 378 insertions(+), 107 deletions(-) diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.C index 197179a115..3fe24cfad8 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.C +++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicAMI/cyclicAMIFvPatchField.C @@ -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-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -23,9 +23,6 @@ License \*---------------------------------------------------------------------------*/ -#include "cyclicAMIFvPatchField.H" -#include "transformField.H" - // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // template @@ -157,7 +154,15 @@ Foam::cyclicAMIFvPatchField::patchNeighbourField() const Field pnf(iField, nbrFaceCells); - tmp > tpnf(new Field(cyclicAMIPatch_.interpolate(pnf))); + tmp > tpnf; + if (cyclicAMIPatch_.applyLowWeightCorrection()) + { + tpnf = cyclicAMIPatch_.interpolate(pnf, this->patchInternalField()()); + } + else + { + tpnf = cyclicAMIPatch_.interpolate(pnf); + } if (doTransform()) { @@ -203,7 +208,15 @@ void Foam::cyclicAMIFvPatchField::updateInterfaceMatrix // Transform according to the transformation tensors transformCoupleField(pnf, cmpt); - pnf = cyclicAMIPatch_.interpolate(pnf); + if (cyclicAMIPatch_.applyLowWeightCorrection()) + { + scalarField pif(psiInternal, cyclicAMIPatch_.faceCells()); + pnf = cyclicAMIPatch_.interpolate(pnf, pif); + } + else + { + pnf = cyclicAMIPatch_.interpolate(pnf); + } // Multiply the field by coefficients and add into the result const labelUList& faceCells = cyclicAMIPatch_.faceCells(); @@ -232,7 +245,15 @@ void Foam::cyclicAMIFvPatchField::updateInterfaceMatrix // Transform according to the transformation tensors transformCoupleField(pnf); - pnf = cyclicAMIPatch_.interpolate(pnf); + if (cyclicAMIPatch_.applyLowWeightCorrection()) + { + Field pif(psiInternal, cyclicAMIPatch_.faceCells()); + pnf = cyclicAMIPatch_.interpolate(pnf, pif); + } + else + { + pnf = cyclicAMIPatch_.interpolate(pnf); + } // Multiply the field by coefficients and add into the result const labelUList& faceCells = cyclicAMIPatch_.faceCells(); diff --git a/src/finiteVolume/fvMesh/fvPatches/constraint/cyclicAMI/cyclicAMIFvPatch.C b/src/finiteVolume/fvMesh/fvPatches/constraint/cyclicAMI/cyclicAMIFvPatch.C index 8d2f1b4cdd..abf1a6b395 100644 --- a/src/finiteVolume/fvMesh/fvPatches/constraint/cyclicAMI/cyclicAMIFvPatch.C +++ b/src/finiteVolume/fvMesh/fvPatches/constraint/cyclicAMI/cyclicAMIFvPatch.C @@ -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-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -55,7 +55,11 @@ void Foam::cyclicAMIFvPatch::makeWeights(scalarField& w) const const scalarField nbrDeltas ( - interpolate(nbrPatch.nf() & nbrPatch.fvPatch::delta()) + interpolate + ( + nbrPatch.nf() & nbrPatch.fvPatch::delta(), + scalarField(this->size(), 1.0) + ) ); forAll(deltas, faceI) @@ -82,7 +86,14 @@ Foam::tmp Foam::cyclicAMIFvPatch::delta() const { const vectorField patchD(fvPatch::delta()); - const vectorField nbrPatchD(interpolate(nbrPatch.fvPatch::delta())); + const vectorField nbrPatchD + ( + interpolate + ( + nbrPatch.fvPatch::delta(), + vectorField(this->size(), vector::zero) + ) + ); tmp tpdv(new vectorField(patchD.size())); vectorField& pdv = tpdv(); diff --git a/src/finiteVolume/fvMesh/fvPatches/constraint/cyclicAMI/cyclicAMIFvPatch.H b/src/finiteVolume/fvMesh/fvPatches/constraint/cyclicAMI/cyclicAMIFvPatch.H index a44049077e..0263fb52df 100644 --- a/src/finiteVolume/fvMesh/fvPatches/constraint/cyclicAMI/cyclicAMIFvPatch.H +++ b/src/finiteVolume/fvMesh/fvPatches/constraint/cyclicAMI/cyclicAMIFvPatch.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-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -154,16 +154,29 @@ public: //- Return delta (P to N) vectors across coupled patch virtual tmp delta() const; - template - tmp > interpolate(const Field& fld) const + bool applyLowWeightCorrection() const { - return cyclicAMIPolyPatch_.interpolate(fld); + return cyclicAMIPolyPatch_.applyLowWeightCorrection(); } template - tmp > interpolate(const tmp >& tFld) const + tmp > interpolate + ( + const Field& fld, + const UList& defaultValues = UList() + ) const { - return cyclicAMIPolyPatch_.interpolate(tFld); + return cyclicAMIPolyPatch_.interpolate(fld, defaultValues); + } + + template + tmp > interpolate + ( + const tmp >& tFld, + const UList& defaultValues = UList() + ) const + { + return cyclicAMIPolyPatch_.interpolate(tFld, defaultValues); } diff --git a/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.C b/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.C index 897e7ec42d..16714be445 100644 --- a/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.C +++ b/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.C @@ -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 @@ -201,11 +201,14 @@ void Foam::AMIInterpolation::normaliseWeights scalarListList& wght, scalarField& wghtSum, const bool conformal, - const bool output + const bool output, + const scalar lowWeightTol ) { // Normalise the weights wghtSum.setSize(wght.size()); + label nLowWeight = 0; + forAll(wght, faceI) { scalarList& w = wght[faceI]; @@ -225,6 +228,11 @@ void Foam::AMIInterpolation::normaliseWeights } wghtSum[faceI] = t; + + if (t < lowWeightTol) + { + nLowWeight++; + } } @@ -241,6 +249,13 @@ void Foam::AMIInterpolation::normaliseWeights << gAverage(wghtSum) << endl; } } + + if (debug && nLowWeight) + { + Pout<< "AMI: Identified " << nLowWeight + << " faces with weights less than " << lowWeightTol + << endl; + } } @@ -502,7 +517,8 @@ void Foam::AMIInterpolation::agglomerate srcWeights, srcWeightsSum, true, - false + false, + -1 ); } @@ -516,12 +532,14 @@ Foam::AMIInterpolation::AMIInterpolation const TargetPatch& tgtPatch, const faceAreaIntersect::triangulationMode& triMode, const interpolationMethod& method, + const scalar lowWeightCorrection, const bool reverseTarget ) : method_(method), reverseTarget_(reverseTarget), singlePatchProc_(-999), + lowWeightCorrection_(lowWeightCorrection), srcAddress_(), srcWeights_(), srcWeightsSum_(), @@ -544,12 +562,14 @@ Foam::AMIInterpolation::AMIInterpolation const autoPtr& surfPtr, const faceAreaIntersect::triangulationMode& triMode, const interpolationMethod& method, + const scalar lowWeightCorrection, const bool reverseTarget ) : method_(method), reverseTarget_(reverseTarget), singlePatchProc_(-999), + lowWeightCorrection_(lowWeightCorrection), srcAddress_(), srcWeights_(), srcWeightsSum_(), @@ -632,6 +652,7 @@ Foam::AMIInterpolation::AMIInterpolation method_(fineAMI.method_), reverseTarget_(fineAMI.reverseTarget_), singlePatchProc_(fineAMI.singlePatchProc_), + lowWeightCorrection_(-1.0), srcAddress_(), srcWeights_(), srcWeightsSum_(), @@ -908,7 +929,8 @@ void Foam::AMIInterpolation::update srcWeights_, srcWeightsSum_, AMIPtr->conformal(), - true + true, + lowWeightCorrection_ ); normaliseWeights ( @@ -918,7 +940,8 @@ void Foam::AMIInterpolation::update tgtWeights_, tgtWeightsSum_, AMIPtr->conformal(), - true + true, + lowWeightCorrection_ ); // cache maps and reset addresses @@ -965,7 +988,8 @@ void Foam::AMIInterpolation::update srcWeights_, srcWeightsSum_, AMIPtr->conformal(), - true + true, + lowWeightCorrection_ ); normaliseWeights ( @@ -975,7 +999,8 @@ void Foam::AMIInterpolation::update tgtWeights_, tgtWeightsSum_, AMIPtr->conformal(), - true + true, + lowWeightCorrection_ ); } @@ -998,7 +1023,8 @@ void Foam::AMIInterpolation::interpolateToTarget ( const UList& fld, const CombineOp& cop, - List& result + List& result, + const UList& defaultValues ) const { if (fld.size() != srcAddress_.size()) @@ -1009,7 +1035,8 @@ void Foam::AMIInterpolation::interpolateToTarget "(" "const UList&, " "const CombineOp&, " - "List&" + "List&, " + "const UList&" ") const" ) << "Supplied field size is not equal to source patch size" << nl << " source patch = " << srcAddress_.size() << nl @@ -1018,6 +1045,29 @@ void Foam::AMIInterpolation::interpolateToTarget << abort(FatalError); } + if (lowWeightCorrection_ > 0) + { + if (defaultValues.size() != tgtAddress_.size()) + { + FatalErrorIn + ( + "AMIInterpolation::interpolateToTarget" + "(" + "const UList&, " + "const CombineOp&, " + "List&, " + "const UList&" + ") const" + ) << "Employing default values when sum of weights falls below " + << lowWeightCorrection_ + << " but supplied default field size is not equal to target " + << "patch size" << nl + << " default values = " << defaultValues.size() << nl + << " target patch = " << tgtAddress_.size() << nl + << abort(FatalError); + } + } + result.setSize(tgtAddress_.size()); if (singlePatchProc_ == -1) @@ -1029,12 +1079,19 @@ void Foam::AMIInterpolation::interpolateToTarget forAll(result, faceI) { - const labelList& faces = tgtAddress_[faceI]; - const scalarList& weights = tgtWeights_[faceI]; - - forAll(faces, i) + if (tgtWeightsSum_[faceI] < lowWeightCorrection_) { - cop(result[faceI], faceI, work[faces[i]], weights[i]); + result[faceI] = defaultValues[faceI]; + } + else + { + const labelList& faces = tgtAddress_[faceI]; + const scalarList& weights = tgtWeights_[faceI]; + + forAll(faces, i) + { + cop(result[faceI], faceI, work[faces[i]], weights[i]); + } } } } @@ -1042,12 +1099,19 @@ void Foam::AMIInterpolation::interpolateToTarget { forAll(result, faceI) { - const labelList& faces = tgtAddress_[faceI]; - const scalarList& weights = tgtWeights_[faceI]; - - forAll(faces, i) + if (tgtWeightsSum_[faceI] < lowWeightCorrection_) { - cop(result[faceI], faceI, fld[faces[i]], weights[i]); + result[faceI] = defaultValues[faceI]; + } + else + { + const labelList& faces = tgtAddress_[faceI]; + const scalarList& weights = tgtWeights_[faceI]; + + forAll(faces, i) + { + cop(result[faceI], faceI, fld[faces[i]], weights[i]); + } } } } @@ -1060,7 +1124,8 @@ void Foam::AMIInterpolation::interpolateToSource ( const UList& fld, const CombineOp& cop, - List& result + List& result, + const UList& defaultValues ) const { if (fld.size() != tgtAddress_.size()) @@ -1071,7 +1136,8 @@ void Foam::AMIInterpolation::interpolateToSource "(" "const UList&, " "const CombineOp&, " - "List&" + "List&, " + "const UList&" ") const" ) << "Supplied field size is not equal to target patch size" << nl << " source patch = " << srcAddress_.size() << nl @@ -1080,6 +1146,29 @@ void Foam::AMIInterpolation::interpolateToSource << abort(FatalError); } + if (lowWeightCorrection_ > 0) + { + if (defaultValues.size() != srcAddress_.size()) + { + FatalErrorIn + ( + "AMIInterpolation::interpolateToSource" + "(" + "const UList&, " + "const CombineOp&, " + "List&, " + "const UList&" + ") const" + ) << "Employing default values when sum of weights falls below " + << lowWeightCorrection_ + << " but supplied default field size is not equal to target " + << "patch size" << nl + << " default values = " << defaultValues.size() << nl + << " source patch = " << srcAddress_.size() << nl + << abort(FatalError); + } + } + result.setSize(srcAddress_.size()); if (singlePatchProc_ == -1) @@ -1091,12 +1180,19 @@ void Foam::AMIInterpolation::interpolateToSource forAll(result, faceI) { - const labelList& faces = srcAddress_[faceI]; - const scalarList& weights = srcWeights_[faceI]; - - forAll(faces, i) + if (srcWeightsSum_[faceI] < lowWeightCorrection_) { - cop(result[faceI], faceI, work[faces[i]], weights[i]); + result[faceI] = defaultValues[faceI]; + } + else + { + const labelList& faces = srcAddress_[faceI]; + const scalarList& weights = srcWeights_[faceI]; + + forAll(faces, i) + { + cop(result[faceI], faceI, work[faces[i]], weights[i]); + } } } } @@ -1104,12 +1200,19 @@ void Foam::AMIInterpolation::interpolateToSource { forAll(result, faceI) { - const labelList& faces = srcAddress_[faceI]; - const scalarList& weights = srcWeights_[faceI]; - - forAll(faces, i) + if (srcWeightsSum_[faceI] < lowWeightCorrection_) { - cop(result[faceI], faceI, fld[faces[i]], weights[i]); + result[faceI] = defaultValues[faceI]; + } + else + { + const labelList& faces = srcAddress_[faceI]; + const scalarList& weights = srcWeights_[faceI]; + + forAll(faces, i) + { + cop(result[faceI], faceI, fld[faces[i]], weights[i]); + } } } } @@ -1122,7 +1225,8 @@ Foam::tmp > Foam::AMIInterpolation::interpolateToSource ( const Field& fld, - const CombineOp& cop + const CombineOp& cop, + const UList& defaultValues ) const { tmp > tresult @@ -1138,7 +1242,8 @@ Foam::AMIInterpolation::interpolateToSource ( fld, multiplyWeightedOp(cop), - tresult() + tresult(), + defaultValues ); return tresult; @@ -1151,10 +1256,11 @@ Foam::tmp > Foam::AMIInterpolation::interpolateToSource ( const tmp >& tFld, - const CombineOp& cop + const CombineOp& cop, + const UList& defaultValues ) const { - return interpolateToSource(tFld(), cop); + return interpolateToSource(tFld(), cop, defaultValues); } @@ -1164,7 +1270,8 @@ Foam::tmp > Foam::AMIInterpolation::interpolateToTarget ( const Field& fld, - const CombineOp& cop + const CombineOp& cop, + const UList& defaultValues ) const { tmp > tresult @@ -1180,7 +1287,8 @@ Foam::AMIInterpolation::interpolateToTarget ( fld, multiplyWeightedOp(cop), - tresult() + tresult(), + defaultValues ); return tresult; @@ -1193,10 +1301,11 @@ Foam::tmp > Foam::AMIInterpolation::interpolateToTarget ( const tmp >& tFld, - const CombineOp& cop + const CombineOp& cop, + const UList& defaultValues ) const { - return interpolateToTarget(tFld(), cop); + return interpolateToTarget(tFld(), cop, defaultValues); } @@ -1205,10 +1314,11 @@ template Foam::tmp > Foam::AMIInterpolation::interpolateToSource ( - const Field& fld + const Field& fld, + const UList& defaultValues ) const { - return interpolateToSource(fld, plusEqOp()); + return interpolateToSource(fld, plusEqOp(), defaultValues); } @@ -1217,10 +1327,11 @@ template Foam::tmp > Foam::AMIInterpolation::interpolateToSource ( - const tmp >& tFld + const tmp >& tFld, + const UList& defaultValues ) const { - return interpolateToSource(tFld(), plusEqOp()); + return interpolateToSource(tFld(), plusEqOp(), defaultValues); } @@ -1229,10 +1340,11 @@ template Foam::tmp > Foam::AMIInterpolation::interpolateToTarget ( - const Field& fld + const Field& fld, + const UList& defaultValues ) const { - return interpolateToTarget(fld, plusEqOp()); + return interpolateToTarget(fld, plusEqOp(), defaultValues); } @@ -1241,10 +1353,11 @@ template Foam::tmp > Foam::AMIInterpolation::interpolateToTarget ( - const tmp >& tFld + const tmp >& tFld, + const UList& defaultValues ) const { - return interpolateToTarget(tFld(), plusEqOp()); + return interpolateToTarget(tFld(), plusEqOp(), defaultValues); } diff --git a/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.H b/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.H index cc30379df1..a8193358c4 100644 --- a/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.H +++ b/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolation.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 @@ -120,6 +120,9 @@ private: // cases label singlePatchProc_; + //- Threshold weight below which interpolation is deactivated + scalar lowWeightCorrection_; + // Source patch @@ -238,7 +241,8 @@ private: scalarListList& wght, scalarField& wghtSum, const bool conformal, - const bool output + const bool output, + const scalar lowWeightTol ); @@ -273,6 +277,7 @@ public: const TargetPatch& tgtPatch, const faceAreaIntersect::triangulationMode& triMode, const interpolationMethod& method = imFaceAreaWeight, + const scalar lowWeightCorrection = -1, const bool reverseTarget = false ); @@ -284,6 +289,7 @@ public: const autoPtr& surf, const faceAreaIntersect::triangulationMode& triMode, const interpolationMethod& method = imFaceAreaWeight, + const scalar lowWeightCorrection = -1, const bool reverseTarget = false ); @@ -313,7 +319,13 @@ public: //- Set to -1, or the processor holding all faces (both sides) of // the AMI - label singlePatchProc() const; + inline label singlePatchProc() const; + + //- Threshold weight below which interpolation is deactivated + inline scalar lowWeightCorrection() const; + + //- Return true if employing a 'lowWeightCorrection' + inline bool applyLowWeightCorrection() const; // Source patch @@ -379,7 +391,8 @@ public: ( const UList& fld, const CombineOp& cop, - List& result + List& result, + const UList& defaultValues = UList::null() ) const; //- Interpolate from source to target with supplied op @@ -389,7 +402,8 @@ public: ( const UList& fld, const CombineOp& cop, - List& result + List& result, + const UList& defaultValues = UList::null() ) const; @@ -398,7 +412,8 @@ public: tmp > interpolateToSource ( const Field& fld, - const CombineOp& cop + const CombineOp& cop, + const UList& defaultValues = UList::null() ) const; //- Interpolate from target tmp field to source with supplied op @@ -406,7 +421,8 @@ public: tmp > interpolateToSource ( const tmp >& tFld, - const CombineOp& cop + const CombineOp& cop, + const UList& defaultValues = UList::null() ) const; //- Interpolate from source to target with supplied op @@ -414,7 +430,8 @@ public: tmp > interpolateToTarget ( const Field& fld, - const CombineOp& cop + const CombineOp& cop, + const UList& defaultValues = UList::null() ) const; //- Interpolate from source tmp field to target with supplied op @@ -422,35 +439,40 @@ public: tmp > interpolateToTarget ( const tmp >& tFld, - const CombineOp& cop + const CombineOp& cop, + const UList& defaultValues = UList::null() ) const; //- Interpolate from target to source template tmp > interpolateToSource ( - const Field& fld + const Field& fld, + const UList& defaultValues = UList::null() ) const; //- Interpolate from target tmp field template tmp > interpolateToSource ( - const tmp >& tFld + const tmp >& tFld, + const UList& defaultValues = UList::null() ) const; //- Interpolate from source to target template tmp > interpolateToTarget ( - const Field& fld + const Field& fld, + const UList& defaultValues = UList::null() ) const; //- Interpolate from source tmp field template tmp > interpolateToTarget ( - const tmp >& tFld + const tmp >& tFld, + const UList& defaultValues = UList::null() ) const; diff --git a/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolationI.H b/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolationI.H index 84291ce326..9c59cb6865 100644 --- a/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolationI.H +++ b/src/meshTools/AMIInterpolation/AMIInterpolation/AMIInterpolationI.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 @@ -31,6 +31,23 @@ Foam::AMIInterpolation::singlePatchProc() const } +template +inline Foam::scalar +Foam::AMIInterpolation::lowWeightCorrection() const +{ + return lowWeightCorrection_; +} + + +template +inline bool +Foam::AMIInterpolation:: +applyLowWeightCorrection() const +{ + return lowWeightCorrection_ > 0; +} + + template inline const Foam::scalarField& Foam::AMIInterpolation::srcMagSf() const diff --git a/src/meshTools/AMIInterpolation/patches/cyclicAMI/cyclicAMIPointPatchField/cyclicAMIPointPatchField.C b/src/meshTools/AMIInterpolation/patches/cyclicAMI/cyclicAMIPointPatchField/cyclicAMIPointPatchField.C index 1bf86bea35..a959b9b3af 100644 --- a/src/meshTools/AMIInterpolation/patches/cyclicAMI/cyclicAMIPointPatchField/cyclicAMIPointPatchField.C +++ b/src/meshTools/AMIInterpolation/patches/cyclicAMI/cyclicAMIPointPatchField/cyclicAMIPointPatchField.C @@ -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 @@ -175,7 +175,22 @@ void Foam::cyclicAMIPointPatchField::swapAddSeparated Field nbrFcFld(nbrPpi().pointToFaceInterpolate(nbrPtFld)); // interpolate to owner - nbrFcFld = cyclicAMIPatch_.cyclicAMIPatch().interpolate(nbrFcFld); + if (cyclicAMIPatch_.cyclicAMIPatch().applyLowWeightCorrection()) + { + Field fcFld(ppi().pointToFaceInterpolate(ptFld)); + + nbrFcFld = + cyclicAMIPatch_.cyclicAMIPatch().interpolate + ( + nbrFcFld, + fcFld + ); + } + else + { + nbrFcFld = + cyclicAMIPatch_.cyclicAMIPatch().interpolate(nbrFcFld); + } // add to internal field this->addToInternalField @@ -190,11 +205,25 @@ void Foam::cyclicAMIPointPatchField::swapAddSeparated Field fcFld(ppi().pointToFaceInterpolate(ptFld)); // interpolate to neighbour - fcFld = - cyclicAMIPatch_.cyclicAMIPatch().neighbPatch().interpolate - ( - fcFld - ); + if (cyclicAMIPatch_.cyclicAMIPatch().applyLowWeightCorrection()) + { + Field nbrFcFld(nbrPpi().pointToFaceInterpolate(nbrPtFld)); + + fcFld = + cyclicAMIPatch_.cyclicAMIPatch().neighbPatch().interpolate + ( + fcFld, + nbrFcFld + ); + } + else + { + fcFld = + cyclicAMIPatch_.cyclicAMIPatch().neighbPatch().interpolate + ( + fcFld + ); + } // add to internal field nbr.addToInternalField diff --git a/src/meshTools/AMIInterpolation/patches/cyclicAMI/cyclicAMIPolyPatch/cyclicAMIPolyPatch.C b/src/meshTools/AMIInterpolation/patches/cyclicAMI/cyclicAMIPolyPatch/cyclicAMIPolyPatch.C index 98ce25d260..e55d5f96a9 100644 --- a/src/meshTools/AMIInterpolation/patches/cyclicAMI/cyclicAMIPolyPatch/cyclicAMIPolyPatch.C +++ b/src/meshTools/AMIInterpolation/patches/cyclicAMI/cyclicAMIPolyPatch/cyclicAMIPolyPatch.C @@ -359,6 +359,7 @@ void Foam::cyclicAMIPolyPatch::resetAMI surfPtr(), faceAreaIntersect::tmMesh, AMIMethod, + AMILowWeightCorrection_, AMIReverse_ ) ); @@ -470,6 +471,7 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch separationVector_(vector::zero), AMIPtr_(NULL), AMIReverse_(false), + AMILowWeightCorrection_(-1.0), surfPtr_(NULL), surfDict_(fileName("surface")) { @@ -498,6 +500,7 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch separationVector_(vector::zero), AMIPtr_(NULL), AMIReverse_(dict.lookupOrDefault("flipNormals", false)), + AMILowWeightCorrection_(dict.lookupOrDefault("lowWeightCorrection", -1.0)), surfPtr_(NULL), surfDict_(dict.subOrEmptyDict("surface")) { @@ -606,6 +609,7 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch separationVector_(pp.separationVector_), AMIPtr_(NULL), AMIReverse_(pp.AMIReverse_), + AMILowWeightCorrection_(pp.AMILowWeightCorrection_), surfPtr_(NULL), surfDict_(pp.surfDict_) { @@ -635,6 +639,7 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch separationVector_(pp.separationVector_), AMIPtr_(NULL), AMIReverse_(pp.AMIReverse_), + AMILowWeightCorrection_(pp.AMILowWeightCorrection_), surfPtr_(NULL), surfDict_(pp.surfDict_) { @@ -678,6 +683,7 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch separationVector_(pp.separationVector_), AMIPtr_(NULL), AMIReverse_(pp.AMIReverse_), + AMILowWeightCorrection_(pp.AMILowWeightCorrection_), surfPtr_(NULL), surfDict_(pp.surfDict_) {} @@ -793,6 +799,19 @@ const Foam::AMIPatchToPatchInterpolation& Foam::cyclicAMIPolyPatch::AMI() const } +bool Foam::cyclicAMIPolyPatch::applyLowWeightCorrection() const +{ + if (owner()) + { + return AMI().applyLowWeightCorrection(); + } + else + { + return neighbPatch().AMI().applyLowWeightCorrection(); + } +} + + void Foam::cyclicAMIPolyPatch::transformPosition(pointField& l) const { if (!parallel()) @@ -970,7 +989,6 @@ void Foam::cyclicAMIPolyPatch::write(Ostream& os) const { os.writeKeyword("rotationAngle") << radToDeg(rotationAngle_) << token::END_STATEMENT << nl; - } break; @@ -997,6 +1015,12 @@ void Foam::cyclicAMIPolyPatch::write(Ostream& os) const << token::END_STATEMENT << nl; } + if (AMILowWeightCorrection_ > 0) + { + os.writeKeyword("lowWeightCorrection") << AMILowWeightCorrection_ + << token::END_STATEMENT << nl; + } + if (!surfDict_.empty()) { os.writeKeyword(surfDict_.dictName()); diff --git a/src/meshTools/AMIInterpolation/patches/cyclicAMI/cyclicAMIPolyPatch/cyclicAMIPolyPatch.H b/src/meshTools/AMIInterpolation/patches/cyclicAMI/cyclicAMIPolyPatch/cyclicAMIPolyPatch.H index fbdffb3dee..c9c0055a47 100644 --- a/src/meshTools/AMIInterpolation/patches/cyclicAMI/cyclicAMIPolyPatch/cyclicAMIPolyPatch.H +++ b/src/meshTools/AMIInterpolation/patches/cyclicAMI/cyclicAMIPolyPatch/cyclicAMIPolyPatch.H @@ -97,6 +97,9 @@ private: //- Flag to indicate that slave patch should be reversed for AMI const bool AMIReverse_; + //- Low weight correction threshold for AMI + const scalar AMILowWeightCorrection_; + //- Projection surface mutable autoPtr surfPtr_; @@ -298,6 +301,9 @@ public: //- Return a reference to the AMI interpolator const AMIPatchToPatchInterpolation& AMI() const; + //- Return true if applying the low weight correction + bool applyLowWeightCorrection() const; + // Transformations @@ -325,13 +331,18 @@ public: //- Interpolate field template - tmp > interpolate(const Field& fld) const; + tmp > interpolate + ( + const Field& fld, + const UList& defaultValues = UList() + ) const; //- Interpolate tmp field template tmp > interpolate ( - const tmp >& tFld + const tmp >& tFld, + const UList& defaultValues = UList() ) const; //- Low-level interpolate List @@ -340,7 +351,8 @@ public: ( const UList& fld, const CombineOp& cop, - List& result + List& result, + const UList& defaultValues = UList() ) const; diff --git a/src/meshTools/AMIInterpolation/patches/cyclicAMI/cyclicAMIPolyPatch/cyclicAMIPolyPatchTemplates.C b/src/meshTools/AMIInterpolation/patches/cyclicAMI/cyclicAMIPolyPatch/cyclicAMIPolyPatchTemplates.C index 3c5fc6e027..50f285a444 100644 --- a/src/meshTools/AMIInterpolation/patches/cyclicAMI/cyclicAMIPolyPatch/cyclicAMIPolyPatchTemplates.C +++ b/src/meshTools/AMIInterpolation/patches/cyclicAMI/cyclicAMIPolyPatch/cyclicAMIPolyPatchTemplates.C @@ -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 @@ -28,16 +28,17 @@ License template Foam::tmp > Foam::cyclicAMIPolyPatch::interpolate ( - const Field& fld + const Field& fld, + const UList& defaultValues ) const { if (owner()) { - return AMI().interpolateToSource(fld); + return AMI().interpolateToSource(fld, defaultValues); } else { - return neighbPatch().AMI().interpolateToTarget(fld); + return neighbPatch().AMI().interpolateToTarget(fld, defaultValues); } } @@ -45,17 +46,11 @@ Foam::tmp > Foam::cyclicAMIPolyPatch::interpolate template Foam::tmp > Foam::cyclicAMIPolyPatch::interpolate ( - const tmp >& tFld + const tmp >& tFld, + const UList& defaultValues ) const { - if (owner()) - { - return AMI().interpolateToSource(tFld); - } - else - { - return neighbPatch().AMI().interpolateToTarget(tFld); - } + return interpolate(tFld(), defaultValues); } @@ -64,16 +59,29 @@ void Foam::cyclicAMIPolyPatch::interpolate ( const UList& fld, const CombineOp& cop, - List& result + List& result, + const UList& defaultValues ) const { if (owner()) { - AMI().interpolateToSource(fld, cop, result); + AMI().interpolateToSource + ( + fld, + cop, + result, + defaultValues + ); } else { - neighbPatch().AMI().interpolateToTarget(fld, cop, result); + neighbPatch().AMI().interpolateToTarget + ( + fld, + cop, + result, + defaultValues + ); } } diff --git a/src/sampling/meshToMeshInterpolation/meshToMesh/meshToMeshTemplates.C b/src/sampling/meshToMeshInterpolation/meshToMesh/meshToMeshTemplates.C index ed848d7522..b5981d522c 100644 --- a/src/sampling/meshToMeshInterpolation/meshToMesh/meshToMeshTemplates.C +++ b/src/sampling/meshToMeshInterpolation/meshToMesh/meshToMeshTemplates.C @@ -354,7 +354,8 @@ void Foam::meshToMesh::mapSrcToTgt ( srcField, multiplyWeightedOp(cop), - tgtField + tgtField, + UList::null() ); } @@ -385,7 +386,7 @@ Foam::meshToMesh::mapSrcToTgt ( IOobject ( - type() + ".interpolate(" + field.name() + ")", + type() + ":interpolate(" + field.name() + ")", tgtMesh.time().timeName(), tgtMesh, IOobject::NO_READ, @@ -498,7 +499,7 @@ Foam::meshToMesh::mapTgtToSrc ( IOobject ( - type() + ".interpolate(" + field.name() + ")", + type() + ":interpolate(" + field.name() + ")", srcMesh.time().timeName(), srcMesh, IOobject::NO_READ, From 14119caa9761d2d44a7c31b129a9bf76b810b710 Mon Sep 17 00:00:00 2001 From: andy Date: Tue, 14 Jan 2014 17:50:31 +0000 Subject: [PATCH 4/6] ENH: script update --- tutorials/mesh/foamyHexMesh/mixerVessel/Allrun-simulation | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/mesh/foamyHexMesh/mixerVessel/Allrun-simulation b/tutorials/mesh/foamyHexMesh/mixerVessel/Allrun-simulation index e789caef9f..f7ad32e474 100755 --- a/tutorials/mesh/foamyHexMesh/mixerVessel/Allrun-simulation +++ b/tutorials/mesh/foamyHexMesh/mixerVessel/Allrun-simulation @@ -31,7 +31,7 @@ runApplication setFields runApplication decomposePar -force # Run -runParallel $application 8 +runParallel $application $nProcs # Reconstruct runApplication reconstructPar -noFunctionObjects From ae114cd9de95c80a9af8b4e855b4c30b41569ba1 Mon Sep 17 00:00:00 2001 From: andy Date: Tue, 14 Jan 2014 17:51:38 +0000 Subject: [PATCH 5/6] ENH: tutorial update --- .../mesh/foamyHexMesh/mixerVessel/system/createBafflesDict | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tutorials/mesh/foamyHexMesh/mixerVessel/system/createBafflesDict b/tutorials/mesh/foamyHexMesh/mixerVessel/system/createBafflesDict index e0c2c43660..877d6154c0 100644 --- a/tutorials/mesh/foamyHexMesh/mixerVessel/system/createBafflesDict +++ b/tutorials/mesh/foamyHexMesh/mixerVessel/system/createBafflesDict @@ -81,6 +81,7 @@ baffles matchTolerance 0.0001; neighbourPatch AMI2; transform noOrdering; + lowWeightCorrection 0.2; // Note: since imperfect meshing around feature edge make // sure to project both sides onto 'proper' geometry to // avoid errors leading to zero weights @@ -99,6 +100,7 @@ baffles matchTolerance 0.0001; neighbourPatch AMI1; transform noOrdering; + lowWeightCorrection 0.2; surface { type triSurfaceMesh; From e18b42c881159e3fd5e88e0902b605e61c898b5b Mon Sep 17 00:00:00 2001 From: andy Date: Tue, 14 Jan 2014 17:55:34 +0000 Subject: [PATCH 6/6] ENH - mixer vessel - Allrun should run complete tutorial --- tutorials/mesh/foamyHexMesh/mixerVessel/Allrun | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/mesh/foamyHexMesh/mixerVessel/Allrun b/tutorials/mesh/foamyHexMesh/mixerVessel/Allrun index 99d75a9906..6f1f804faa 100755 --- a/tutorials/mesh/foamyHexMesh/mixerVessel/Allrun +++ b/tutorials/mesh/foamyHexMesh/mixerVessel/Allrun @@ -8,6 +8,6 @@ cd ${0%/*} || exit 1 # run from this directory ./Allrun-pre ## Run simulation -#./Allrun-simulation +./Allrun-simulation # ----------------------------------------------------------------- end-of-file