Merge branch 'master' of /home/dm4/OpenFOAM/repositories/OpenFOAM-dev

This commit is contained in:
mattijs
2014-01-16 11:40:38 +00:00
28 changed files with 521 additions and 215 deletions

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -104,13 +104,15 @@ int main(int argc, char *argv[])
Info<< "Setting boundary layer velocity" << nl << endl; Info<< "Setting boundary layer velocity" << nl << endl;
scalar yblv = ybl.value(); scalar yblv = ybl.value();
forAll(U, celli) forAll(U, cellI)
{ {
if (y[celli] <= yblv) if (y[cellI] <= yblv)
{ {
U[celli] *= ::pow(y[celli]/yblv, (1.0/7.0)); mask[cellI] = 1;
U[cellI] *= ::pow(y[cellI]/yblv, (1.0/7.0));
} }
} }
mask.correctBoundaryConditions();
Info<< "Writing U\n" << endl; Info<< "Writing U\n" << endl;
U.write(); U.write();
@ -128,11 +130,15 @@ int main(int argc, char *argv[])
if (isA<incompressible::RASModel>(turbulence())) if (isA<incompressible::RASModel>(turbulence()))
{ {
// Calculate nut // Calculate nut - reference nut is calculated by the turbulence model
// on its construction
tmp<volScalarField> tnut = turbulence->nut(); tmp<volScalarField> tnut = turbulence->nut();
volScalarField& nut = tnut(); volScalarField& nut = tnut();
volScalarField S(mag(dev(symm(fvc::grad(U))))); volScalarField S(mag(dev(symm(fvc::grad(U)))));
nut = sqr(kappa*min(y, ybl))*::sqrt(2)*S; nut = (1 - mask)*nut + mask*sqr(kappa*min(y, ybl))*::sqrt(2)*S;
// do not correct BC - wall functions will 'undo' manipulation above
// by using nut from turbulence model
if (args.optionFound("writenut")) if (args.optionFound("writenut"))
{ {
@ -140,9 +146,6 @@ int main(int argc, char *argv[])
nut.write(); nut.write();
} }
// Create G field - used by RAS wall functions
volScalarField G(turbulence().GName(), nut*2*sqr(S));
//--- Read and modify turbulence fields //--- Read and modify turbulence fields
@ -150,8 +153,11 @@ int main(int argc, char *argv[])
tmp<volScalarField> tk = turbulence->k(); tmp<volScalarField> tk = turbulence->k();
volScalarField& k = tk(); volScalarField& k = tk();
scalar ck0 = pow025(Cmu)*kappa; scalar ck0 = pow025(Cmu)*kappa;
k = sqr(nut/(ck0*min(y, ybl))); k = (1 - mask)*k + mask*sqr(nut/(ck0*min(y, ybl)));
k.correctBoundaryConditions();
// do not correct BC - operation may use inconsistent fields wrt these
// local manipulations
// k.correctBoundaryConditions();
Info<< "Writing k\n" << endl; Info<< "Writing k\n" << endl;
k.write(); k.write();
@ -161,8 +167,11 @@ int main(int argc, char *argv[])
tmp<volScalarField> tepsilon = turbulence->epsilon(); tmp<volScalarField> tepsilon = turbulence->epsilon();
volScalarField& epsilon = tepsilon(); volScalarField& epsilon = tepsilon();
scalar ce0 = ::pow(Cmu, 0.75)/kappa; scalar ce0 = ::pow(Cmu, 0.75)/kappa;
epsilon = ce0*k*sqrt(k)/min(y, ybl); epsilon = (1 - mask)*epsilon + mask*ce0*k*sqrt(k)/min(y, ybl);
epsilon.correctBoundaryConditions();
// do not correct BC - wall functions will use non-updated k from
// turbulence model
// epsilon.correctBoundaryConditions();
Info<< "Writing epsilon\n" << endl; Info<< "Writing epsilon\n" << endl;
epsilon.write(); epsilon.write();
@ -181,12 +190,12 @@ int main(int argc, char *argv[])
if (omegaHeader.headerOk()) if (omegaHeader.headerOk())
{ {
volScalarField omega(omegaHeader, mesh); volScalarField omega(omegaHeader, mesh);
omega = dimensionedScalar k0("VSMALL", k.dimensions(), VSMALL);
epsilon omega = (1 - mask)*omega + mask*epsilon/(Cmu*k + k0);
/(
Cmu*k+dimensionedScalar("VSMALL", k.dimensions(), VSMALL) // do not correct BC - wall functions will use non-updated k from
); // turbulence model
omega.correctBoundaryConditions(); // omega.correctBoundaryConditions();
Info<< "Writing omega\n" << endl; Info<< "Writing omega\n" << endl;
omega.write(); omega.write();
@ -207,7 +216,9 @@ int main(int argc, char *argv[])
{ {
volScalarField nuTilda(nuTildaHeader, mesh); volScalarField nuTilda(nuTildaHeader, mesh);
nuTilda = nut; nuTilda = nut;
nuTilda.correctBoundaryConditions();
// do not correct BC
// nuTilda.correctBoundaryConditions();
Info<< "Writing nuTilda\n" << endl; Info<< "Writing nuTilda\n" << endl;
nuTilda.write(); nuTilda.write();

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -57,5 +57,21 @@ License
Info<< "\nCreating boundary-layer for U of thickness " Info<< "\nCreating boundary-layer for U of thickness "
<< ybl.value() << " m" << nl << endl; << ybl.value() << " m" << nl << endl;
Info<< "Creating mask field" << endl;
volScalarField mask
(
IOobject
(
"mask",
runTime.timeName(),
mesh,
IOobject::NO_READ,
IOobject::NO_WRITE
),
mesh,
dimensionedScalar("zero", dimless, 0.0),
zeroGradientFvPatchScalarField::typeName
);
// ************************************************************************* // // ************************************************************************* //

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -23,9 +23,6 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "cyclicAMIFvPatchField.H"
#include "transformField.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class Type> template<class Type>
@ -157,7 +154,15 @@ Foam::cyclicAMIFvPatchField<Type>::patchNeighbourField() const
Field<Type> pnf(iField, nbrFaceCells); Field<Type> pnf(iField, nbrFaceCells);
tmp<Field<Type> > tpnf(new Field<Type>(cyclicAMIPatch_.interpolate(pnf))); tmp<Field<Type> > tpnf;
if (cyclicAMIPatch_.applyLowWeightCorrection())
{
tpnf = cyclicAMIPatch_.interpolate(pnf, this->patchInternalField()());
}
else
{
tpnf = cyclicAMIPatch_.interpolate(pnf);
}
if (doTransform()) if (doTransform())
{ {
@ -203,7 +208,15 @@ void Foam::cyclicAMIFvPatchField<Type>::updateInterfaceMatrix
// Transform according to the transformation tensors // Transform according to the transformation tensors
transformCoupleField(pnf, cmpt); transformCoupleField(pnf, cmpt);
if (cyclicAMIPatch_.applyLowWeightCorrection())
{
scalarField pif(psiInternal, cyclicAMIPatch_.faceCells());
pnf = cyclicAMIPatch_.interpolate(pnf, pif);
}
else
{
pnf = cyclicAMIPatch_.interpolate(pnf); pnf = cyclicAMIPatch_.interpolate(pnf);
}
// Multiply the field by coefficients and add into the result // Multiply the field by coefficients and add into the result
const labelUList& faceCells = cyclicAMIPatch_.faceCells(); const labelUList& faceCells = cyclicAMIPatch_.faceCells();
@ -232,7 +245,15 @@ void Foam::cyclicAMIFvPatchField<Type>::updateInterfaceMatrix
// Transform according to the transformation tensors // Transform according to the transformation tensors
transformCoupleField(pnf); transformCoupleField(pnf);
if (cyclicAMIPatch_.applyLowWeightCorrection())
{
Field<Type> pif(psiInternal, cyclicAMIPatch_.faceCells());
pnf = cyclicAMIPatch_.interpolate(pnf, pif);
}
else
{
pnf = cyclicAMIPatch_.interpolate(pnf); pnf = cyclicAMIPatch_.interpolate(pnf);
}
// Multiply the field by coefficients and add into the result // Multiply the field by coefficients and add into the result
const labelUList& faceCells = cyclicAMIPatch_.faceCells(); const labelUList& faceCells = cyclicAMIPatch_.faceCells();

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -55,7 +55,11 @@ void Foam::cyclicAMIFvPatch::makeWeights(scalarField& w) const
const scalarField nbrDeltas const scalarField nbrDeltas
( (
interpolate(nbrPatch.nf() & nbrPatch.fvPatch::delta()) interpolate
(
nbrPatch.nf() & nbrPatch.fvPatch::delta(),
scalarField(this->size(), 1.0)
)
); );
forAll(deltas, faceI) forAll(deltas, faceI)
@ -82,7 +86,14 @@ Foam::tmp<Foam::vectorField> Foam::cyclicAMIFvPatch::delta() const
{ {
const vectorField patchD(fvPatch::delta()); 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<vectorField> tpdv(new vectorField(patchD.size())); tmp<vectorField> tpdv(new vectorField(patchD.size()));
vectorField& pdv = tpdv(); vectorField& pdv = tpdv();

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -154,16 +154,29 @@ public:
//- Return delta (P to N) vectors across coupled patch //- Return delta (P to N) vectors across coupled patch
virtual tmp<vectorField> delta() const; virtual tmp<vectorField> delta() const;
template<class Type> bool applyLowWeightCorrection() const
tmp<Field<Type> > interpolate(const Field<Type>& fld) const
{ {
return cyclicAMIPolyPatch_.interpolate(fld); return cyclicAMIPolyPatch_.applyLowWeightCorrection();
} }
template<class Type> template<class Type>
tmp<Field<Type> > interpolate(const tmp<Field<Type> >& tFld) const tmp<Field<Type> > interpolate
(
const Field<Type>& fld,
const UList<Type>& defaultValues = UList<Type>()
) const
{ {
return cyclicAMIPolyPatch_.interpolate(tFld); return cyclicAMIPolyPatch_.interpolate(fld, defaultValues);
}
template<class Type>
tmp<Field<Type> > interpolate
(
const tmp<Field<Type> >& tFld,
const UList<Type>& defaultValues = UList<Type>()
) const
{
return cyclicAMIPolyPatch_.interpolate(tFld, defaultValues);
} }

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -201,11 +201,14 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::normaliseWeights
scalarListList& wght, scalarListList& wght,
scalarField& wghtSum, scalarField& wghtSum,
const bool conformal, const bool conformal,
const bool output const bool output,
const scalar lowWeightTol
) )
{ {
// Normalise the weights // Normalise the weights
wghtSum.setSize(wght.size()); wghtSum.setSize(wght.size());
label nLowWeight = 0;
forAll(wght, faceI) forAll(wght, faceI)
{ {
scalarList& w = wght[faceI]; scalarList& w = wght[faceI];
@ -225,6 +228,11 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::normaliseWeights
} }
wghtSum[faceI] = t; wghtSum[faceI] = t;
if (t < lowWeightTol)
{
nLowWeight++;
}
} }
@ -241,6 +249,13 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::normaliseWeights
<< gAverage(wghtSum) << endl; << gAverage(wghtSum) << endl;
} }
} }
if (debug && nLowWeight)
{
Pout<< "AMI: Identified " << nLowWeight
<< " faces with weights less than " << lowWeightTol
<< endl;
}
} }
@ -502,7 +517,8 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::agglomerate
srcWeights, srcWeights,
srcWeightsSum, srcWeightsSum,
true, true,
false false,
-1
); );
} }
@ -516,12 +532,14 @@ Foam::AMIInterpolation<SourcePatch, TargetPatch>::AMIInterpolation
const TargetPatch& tgtPatch, const TargetPatch& tgtPatch,
const faceAreaIntersect::triangulationMode& triMode, const faceAreaIntersect::triangulationMode& triMode,
const interpolationMethod& method, const interpolationMethod& method,
const scalar lowWeightCorrection,
const bool reverseTarget const bool reverseTarget
) )
: :
method_(method), method_(method),
reverseTarget_(reverseTarget), reverseTarget_(reverseTarget),
singlePatchProc_(-999), singlePatchProc_(-999),
lowWeightCorrection_(lowWeightCorrection),
srcAddress_(), srcAddress_(),
srcWeights_(), srcWeights_(),
srcWeightsSum_(), srcWeightsSum_(),
@ -544,12 +562,14 @@ Foam::AMIInterpolation<SourcePatch, TargetPatch>::AMIInterpolation
const autoPtr<searchableSurface>& surfPtr, const autoPtr<searchableSurface>& surfPtr,
const faceAreaIntersect::triangulationMode& triMode, const faceAreaIntersect::triangulationMode& triMode,
const interpolationMethod& method, const interpolationMethod& method,
const scalar lowWeightCorrection,
const bool reverseTarget const bool reverseTarget
) )
: :
method_(method), method_(method),
reverseTarget_(reverseTarget), reverseTarget_(reverseTarget),
singlePatchProc_(-999), singlePatchProc_(-999),
lowWeightCorrection_(lowWeightCorrection),
srcAddress_(), srcAddress_(),
srcWeights_(), srcWeights_(),
srcWeightsSum_(), srcWeightsSum_(),
@ -632,6 +652,7 @@ Foam::AMIInterpolation<SourcePatch, TargetPatch>::AMIInterpolation
method_(fineAMI.method_), method_(fineAMI.method_),
reverseTarget_(fineAMI.reverseTarget_), reverseTarget_(fineAMI.reverseTarget_),
singlePatchProc_(fineAMI.singlePatchProc_), singlePatchProc_(fineAMI.singlePatchProc_),
lowWeightCorrection_(-1.0),
srcAddress_(), srcAddress_(),
srcWeights_(), srcWeights_(),
srcWeightsSum_(), srcWeightsSum_(),
@ -908,7 +929,8 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::update
srcWeights_, srcWeights_,
srcWeightsSum_, srcWeightsSum_,
AMIPtr->conformal(), AMIPtr->conformal(),
true true,
lowWeightCorrection_
); );
normaliseWeights normaliseWeights
( (
@ -918,7 +940,8 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::update
tgtWeights_, tgtWeights_,
tgtWeightsSum_, tgtWeightsSum_,
AMIPtr->conformal(), AMIPtr->conformal(),
true true,
lowWeightCorrection_
); );
// cache maps and reset addresses // cache maps and reset addresses
@ -965,7 +988,8 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::update
srcWeights_, srcWeights_,
srcWeightsSum_, srcWeightsSum_,
AMIPtr->conformal(), AMIPtr->conformal(),
true true,
lowWeightCorrection_
); );
normaliseWeights normaliseWeights
( (
@ -975,7 +999,8 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::update
tgtWeights_, tgtWeights_,
tgtWeightsSum_, tgtWeightsSum_,
AMIPtr->conformal(), AMIPtr->conformal(),
true true,
lowWeightCorrection_
); );
} }
@ -998,7 +1023,8 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToTarget
( (
const UList<Type>& fld, const UList<Type>& fld,
const CombineOp& cop, const CombineOp& cop,
List<Type>& result List<Type>& result,
const UList<Type>& defaultValues
) const ) const
{ {
if (fld.size() != srcAddress_.size()) if (fld.size() != srcAddress_.size())
@ -1009,7 +1035,8 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToTarget
"(" "("
"const UList<Type>&, " "const UList<Type>&, "
"const CombineOp&, " "const CombineOp&, "
"List<Type>&" "List<Type>&, "
"const UList<Type>&"
") const" ") const"
) << "Supplied field size is not equal to source patch size" << nl ) << "Supplied field size is not equal to source patch size" << nl
<< " source patch = " << srcAddress_.size() << nl << " source patch = " << srcAddress_.size() << nl
@ -1018,6 +1045,29 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToTarget
<< abort(FatalError); << abort(FatalError);
} }
if (lowWeightCorrection_ > 0)
{
if (defaultValues.size() != tgtAddress_.size())
{
FatalErrorIn
(
"AMIInterpolation::interpolateToTarget"
"("
"const UList<Type>&, "
"const CombineOp&, "
"List<Type>&, "
"const UList<Type>&"
") 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()); result.setSize(tgtAddress_.size());
if (singlePatchProc_ == -1) if (singlePatchProc_ == -1)
@ -1028,6 +1078,12 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToTarget
map.distribute(work); map.distribute(work);
forAll(result, faceI) forAll(result, faceI)
{
if (tgtWeightsSum_[faceI] < lowWeightCorrection_)
{
result[faceI] = defaultValues[faceI];
}
else
{ {
const labelList& faces = tgtAddress_[faceI]; const labelList& faces = tgtAddress_[faceI];
const scalarList& weights = tgtWeights_[faceI]; const scalarList& weights = tgtWeights_[faceI];
@ -1038,9 +1094,16 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToTarget
} }
} }
} }
}
else else
{ {
forAll(result, faceI) forAll(result, faceI)
{
if (tgtWeightsSum_[faceI] < lowWeightCorrection_)
{
result[faceI] = defaultValues[faceI];
}
else
{ {
const labelList& faces = tgtAddress_[faceI]; const labelList& faces = tgtAddress_[faceI];
const scalarList& weights = tgtWeights_[faceI]; const scalarList& weights = tgtWeights_[faceI];
@ -1052,6 +1115,7 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToTarget
} }
} }
} }
}
template<class SourcePatch, class TargetPatch> template<class SourcePatch, class TargetPatch>
@ -1060,7 +1124,8 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToSource
( (
const UList<Type>& fld, const UList<Type>& fld,
const CombineOp& cop, const CombineOp& cop,
List<Type>& result List<Type>& result,
const UList<Type>& defaultValues
) const ) const
{ {
if (fld.size() != tgtAddress_.size()) if (fld.size() != tgtAddress_.size())
@ -1071,7 +1136,8 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToSource
"(" "("
"const UList<Type>&, " "const UList<Type>&, "
"const CombineOp&, " "const CombineOp&, "
"List<Type>&" "List<Type>&, "
"const UList<Type>&"
") const" ") const"
) << "Supplied field size is not equal to target patch size" << nl ) << "Supplied field size is not equal to target patch size" << nl
<< " source patch = " << srcAddress_.size() << nl << " source patch = " << srcAddress_.size() << nl
@ -1080,6 +1146,29 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToSource
<< abort(FatalError); << abort(FatalError);
} }
if (lowWeightCorrection_ > 0)
{
if (defaultValues.size() != srcAddress_.size())
{
FatalErrorIn
(
"AMIInterpolation::interpolateToSource"
"("
"const UList<Type>&, "
"const CombineOp&, "
"List<Type>&, "
"const UList<Type>&"
") 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()); result.setSize(srcAddress_.size());
if (singlePatchProc_ == -1) if (singlePatchProc_ == -1)
@ -1090,6 +1179,12 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToSource
map.distribute(work); map.distribute(work);
forAll(result, faceI) forAll(result, faceI)
{
if (srcWeightsSum_[faceI] < lowWeightCorrection_)
{
result[faceI] = defaultValues[faceI];
}
else
{ {
const labelList& faces = srcAddress_[faceI]; const labelList& faces = srcAddress_[faceI];
const scalarList& weights = srcWeights_[faceI]; const scalarList& weights = srcWeights_[faceI];
@ -1100,9 +1195,16 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToSource
} }
} }
} }
}
else else
{ {
forAll(result, faceI) forAll(result, faceI)
{
if (srcWeightsSum_[faceI] < lowWeightCorrection_)
{
result[faceI] = defaultValues[faceI];
}
else
{ {
const labelList& faces = srcAddress_[faceI]; const labelList& faces = srcAddress_[faceI];
const scalarList& weights = srcWeights_[faceI]; const scalarList& weights = srcWeights_[faceI];
@ -1114,6 +1216,7 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToSource
} }
} }
} }
}
template<class SourcePatch, class TargetPatch> template<class SourcePatch, class TargetPatch>
@ -1122,7 +1225,8 @@ Foam::tmp<Foam::Field<Type> >
Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToSource Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToSource
( (
const Field<Type>& fld, const Field<Type>& fld,
const CombineOp& cop const CombineOp& cop,
const UList<Type>& defaultValues
) const ) const
{ {
tmp<Field<Type> > tresult tmp<Field<Type> > tresult
@ -1138,7 +1242,8 @@ Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToSource
( (
fld, fld,
multiplyWeightedOp<Type, CombineOp>(cop), multiplyWeightedOp<Type, CombineOp>(cop),
tresult() tresult(),
defaultValues
); );
return tresult; return tresult;
@ -1151,10 +1256,11 @@ Foam::tmp<Foam::Field<Type> >
Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToSource Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToSource
( (
const tmp<Field<Type> >& tFld, const tmp<Field<Type> >& tFld,
const CombineOp& cop const CombineOp& cop,
const UList<Type>& defaultValues
) const ) const
{ {
return interpolateToSource(tFld(), cop); return interpolateToSource(tFld(), cop, defaultValues);
} }
@ -1164,7 +1270,8 @@ Foam::tmp<Foam::Field<Type> >
Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToTarget Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToTarget
( (
const Field<Type>& fld, const Field<Type>& fld,
const CombineOp& cop const CombineOp& cop,
const UList<Type>& defaultValues
) const ) const
{ {
tmp<Field<Type> > tresult tmp<Field<Type> > tresult
@ -1180,7 +1287,8 @@ Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToTarget
( (
fld, fld,
multiplyWeightedOp<Type, CombineOp>(cop), multiplyWeightedOp<Type, CombineOp>(cop),
tresult() tresult(),
defaultValues
); );
return tresult; return tresult;
@ -1193,10 +1301,11 @@ Foam::tmp<Foam::Field<Type> >
Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToTarget Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToTarget
( (
const tmp<Field<Type> >& tFld, const tmp<Field<Type> >& tFld,
const CombineOp& cop const CombineOp& cop,
const UList<Type>& defaultValues
) const ) const
{ {
return interpolateToTarget(tFld(), cop); return interpolateToTarget(tFld(), cop, defaultValues);
} }
@ -1205,10 +1314,11 @@ template<class Type>
Foam::tmp<Foam::Field<Type> > Foam::tmp<Foam::Field<Type> >
Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToSource Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToSource
( (
const Field<Type>& fld const Field<Type>& fld,
const UList<Type>& defaultValues
) const ) const
{ {
return interpolateToSource(fld, plusEqOp<Type>()); return interpolateToSource(fld, plusEqOp<Type>(), defaultValues);
} }
@ -1217,10 +1327,11 @@ template<class Type>
Foam::tmp<Foam::Field<Type> > Foam::tmp<Foam::Field<Type> >
Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToSource Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToSource
( (
const tmp<Field<Type> >& tFld const tmp<Field<Type> >& tFld,
const UList<Type>& defaultValues
) const ) const
{ {
return interpolateToSource(tFld(), plusEqOp<Type>()); return interpolateToSource(tFld(), plusEqOp<Type>(), defaultValues);
} }
@ -1229,10 +1340,11 @@ template<class Type>
Foam::tmp<Foam::Field<Type> > Foam::tmp<Foam::Field<Type> >
Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToTarget Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToTarget
( (
const Field<Type>& fld const Field<Type>& fld,
const UList<Type>& defaultValues
) const ) const
{ {
return interpolateToTarget(fld, plusEqOp<Type>()); return interpolateToTarget(fld, plusEqOp<Type>(), defaultValues);
} }
@ -1241,10 +1353,11 @@ template<class Type>
Foam::tmp<Foam::Field<Type> > Foam::tmp<Foam::Field<Type> >
Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToTarget Foam::AMIInterpolation<SourcePatch, TargetPatch>::interpolateToTarget
( (
const tmp<Field<Type> >& tFld const tmp<Field<Type> >& tFld,
const UList<Type>& defaultValues
) const ) const
{ {
return interpolateToTarget(tFld(), plusEqOp<Type>()); return interpolateToTarget(tFld(), plusEqOp<Type>(), defaultValues);
} }

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -120,6 +120,9 @@ private:
// cases // cases
label singlePatchProc_; label singlePatchProc_;
//- Threshold weight below which interpolation is deactivated
scalar lowWeightCorrection_;
// Source patch // Source patch
@ -238,7 +241,8 @@ private:
scalarListList& wght, scalarListList& wght,
scalarField& wghtSum, scalarField& wghtSum,
const bool conformal, const bool conformal,
const bool output const bool output,
const scalar lowWeightTol
); );
@ -273,6 +277,7 @@ public:
const TargetPatch& tgtPatch, const TargetPatch& tgtPatch,
const faceAreaIntersect::triangulationMode& triMode, const faceAreaIntersect::triangulationMode& triMode,
const interpolationMethod& method = imFaceAreaWeight, const interpolationMethod& method = imFaceAreaWeight,
const scalar lowWeightCorrection = -1,
const bool reverseTarget = false const bool reverseTarget = false
); );
@ -284,6 +289,7 @@ public:
const autoPtr<searchableSurface>& surf, const autoPtr<searchableSurface>& surf,
const faceAreaIntersect::triangulationMode& triMode, const faceAreaIntersect::triangulationMode& triMode,
const interpolationMethod& method = imFaceAreaWeight, const interpolationMethod& method = imFaceAreaWeight,
const scalar lowWeightCorrection = -1,
const bool reverseTarget = false const bool reverseTarget = false
); );
@ -313,7 +319,13 @@ public:
//- Set to -1, or the processor holding all faces (both sides) of //- Set to -1, or the processor holding all faces (both sides) of
// the AMI // 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 // Source patch
@ -379,7 +391,8 @@ public:
( (
const UList<Type>& fld, const UList<Type>& fld,
const CombineOp& cop, const CombineOp& cop,
List<Type>& result List<Type>& result,
const UList<Type>& defaultValues = UList<Type>::null()
) const; ) const;
//- Interpolate from source to target with supplied op //- Interpolate from source to target with supplied op
@ -389,7 +402,8 @@ public:
( (
const UList<Type>& fld, const UList<Type>& fld,
const CombineOp& cop, const CombineOp& cop,
List<Type>& result List<Type>& result,
const UList<Type>& defaultValues = UList<Type>::null()
) const; ) const;
@ -398,7 +412,8 @@ public:
tmp<Field<Type> > interpolateToSource tmp<Field<Type> > interpolateToSource
( (
const Field<Type>& fld, const Field<Type>& fld,
const CombineOp& cop const CombineOp& cop,
const UList<Type>& defaultValues = UList<Type>::null()
) const; ) const;
//- Interpolate from target tmp field to source with supplied op //- Interpolate from target tmp field to source with supplied op
@ -406,7 +421,8 @@ public:
tmp<Field<Type> > interpolateToSource tmp<Field<Type> > interpolateToSource
( (
const tmp<Field<Type> >& tFld, const tmp<Field<Type> >& tFld,
const CombineOp& cop const CombineOp& cop,
const UList<Type>& defaultValues = UList<Type>::null()
) const; ) const;
//- Interpolate from source to target with supplied op //- Interpolate from source to target with supplied op
@ -414,7 +430,8 @@ public:
tmp<Field<Type> > interpolateToTarget tmp<Field<Type> > interpolateToTarget
( (
const Field<Type>& fld, const Field<Type>& fld,
const CombineOp& cop const CombineOp& cop,
const UList<Type>& defaultValues = UList<Type>::null()
) const; ) const;
//- Interpolate from source tmp field to target with supplied op //- Interpolate from source tmp field to target with supplied op
@ -422,35 +439,40 @@ public:
tmp<Field<Type> > interpolateToTarget tmp<Field<Type> > interpolateToTarget
( (
const tmp<Field<Type> >& tFld, const tmp<Field<Type> >& tFld,
const CombineOp& cop const CombineOp& cop,
const UList<Type>& defaultValues = UList<Type>::null()
) const; ) const;
//- Interpolate from target to source //- Interpolate from target to source
template<class Type> template<class Type>
tmp<Field<Type> > interpolateToSource tmp<Field<Type> > interpolateToSource
( (
const Field<Type>& fld const Field<Type>& fld,
const UList<Type>& defaultValues = UList<Type>::null()
) const; ) const;
//- Interpolate from target tmp field //- Interpolate from target tmp field
template<class Type> template<class Type>
tmp<Field<Type> > interpolateToSource tmp<Field<Type> > interpolateToSource
( (
const tmp<Field<Type> >& tFld const tmp<Field<Type> >& tFld,
const UList<Type>& defaultValues = UList<Type>::null()
) const; ) const;
//- Interpolate from source to target //- Interpolate from source to target
template<class Type> template<class Type>
tmp<Field<Type> > interpolateToTarget tmp<Field<Type> > interpolateToTarget
( (
const Field<Type>& fld const Field<Type>& fld,
const UList<Type>& defaultValues = UList<Type>::null()
) const; ) const;
//- Interpolate from source tmp field //- Interpolate from source tmp field
template<class Type> template<class Type>
tmp<Field<Type> > interpolateToTarget tmp<Field<Type> > interpolateToTarget
( (
const tmp<Field<Type> >& tFld const tmp<Field<Type> >& tFld,
const UList<Type>& defaultValues = UList<Type>::null()
) const; ) const;

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -31,6 +31,23 @@ Foam::AMIInterpolation<SourcePatch, TargetPatch>::singlePatchProc() const
} }
template<class SourcePatch, class TargetPatch>
inline Foam::scalar
Foam::AMIInterpolation<SourcePatch, TargetPatch>::lowWeightCorrection() const
{
return lowWeightCorrection_;
}
template<class SourcePatch, class TargetPatch>
inline bool
Foam::AMIInterpolation<SourcePatch, TargetPatch>::
applyLowWeightCorrection() const
{
return lowWeightCorrection_ > 0;
}
template<class SourcePatch, class TargetPatch> template<class SourcePatch, class TargetPatch>
inline const Foam::scalarField& inline const Foam::scalarField&
Foam::AMIInterpolation<SourcePatch, TargetPatch>::srcMagSf() const Foam::AMIInterpolation<SourcePatch, TargetPatch>::srcMagSf() const

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2013 OpenFOAM Foundation \\ / A nd | Copyright (C) 2013-2014 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -310,6 +310,8 @@ Foam::scalar Foam::faceAreaWeightAMI<SourcePatch, TargetPatch>::interArea
const label tgtFaceI const label tgtFaceI
) const ) const
{ {
scalar area = 0;
const pointField& srcPoints = this->srcPatch_.points(); const pointField& srcPoints = this->srcPatch_.points();
const pointField& tgtPoints = this->tgtPatch_.points(); const pointField& tgtPoints = this->tgtPatch_.points();
@ -322,7 +324,7 @@ Foam::scalar Foam::faceAreaWeightAMI<SourcePatch, TargetPatch>::interArea
const scalar tgtMag = tgt.mag(tgtPoints); const scalar tgtMag = tgt.mag(tgtPoints);
if ((this->srcMagSf_[srcFaceI] < ROOTVSMALL) || (tgtMag < ROOTVSMALL)) if ((this->srcMagSf_[srcFaceI] < ROOTVSMALL) || (tgtMag < ROOTVSMALL))
{ {
return 0.0; return area;
} }
// create intersection object // create intersection object
@ -338,12 +340,11 @@ Foam::scalar Foam::faceAreaWeightAMI<SourcePatch, TargetPatch>::interArea
{ {
n += this->tgtPatch_.faceNormals()[tgtFaceI]; n += this->tgtPatch_.faceNormals()[tgtFaceI];
} }
n *= 0.5; scalar magN = mag(n);
scalar area = 0; if (magN > ROOTVSMALL)
if (mag(n) > ROOTVSMALL)
{ {
area = inter.calc(src, tgt, n, this->triMode_); area = inter.calc(src, tgt, n/magN, this->triMode_);
} }
else else
{ {
@ -549,7 +550,7 @@ void Foam::faceAreaWeightAMI<SourcePatch, TargetPatch>::calculate
tgtFaceI tgtFaceI
); );
if (this->srcNonOverlap_.size() != 0) if (debug && !this->srcNonOverlap_.empty())
{ {
Pout<< " AMI: " << this->srcNonOverlap_.size() Pout<< " AMI: " << this->srcNonOverlap_.size()
<< " non-overlap faces identified" << " non-overlap faces identified"

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -175,7 +175,22 @@ void Foam::cyclicAMIPointPatchField<Type>::swapAddSeparated
Field<Type> nbrFcFld(nbrPpi().pointToFaceInterpolate(nbrPtFld)); Field<Type> nbrFcFld(nbrPpi().pointToFaceInterpolate(nbrPtFld));
// interpolate to owner // interpolate to owner
nbrFcFld = cyclicAMIPatch_.cyclicAMIPatch().interpolate(nbrFcFld); if (cyclicAMIPatch_.cyclicAMIPatch().applyLowWeightCorrection())
{
Field<Type> fcFld(ppi().pointToFaceInterpolate(ptFld));
nbrFcFld =
cyclicAMIPatch_.cyclicAMIPatch().interpolate
(
nbrFcFld,
fcFld
);
}
else
{
nbrFcFld =
cyclicAMIPatch_.cyclicAMIPatch().interpolate(nbrFcFld);
}
// add to internal field // add to internal field
this->addToInternalField this->addToInternalField
@ -190,11 +205,25 @@ void Foam::cyclicAMIPointPatchField<Type>::swapAddSeparated
Field<Type> fcFld(ppi().pointToFaceInterpolate(ptFld)); Field<Type> fcFld(ppi().pointToFaceInterpolate(ptFld));
// interpolate to neighbour // interpolate to neighbour
if (cyclicAMIPatch_.cyclicAMIPatch().applyLowWeightCorrection())
{
Field<Type> nbrFcFld(nbrPpi().pointToFaceInterpolate(nbrPtFld));
fcFld =
cyclicAMIPatch_.cyclicAMIPatch().neighbPatch().interpolate
(
fcFld,
nbrFcFld
);
}
else
{
fcFld = fcFld =
cyclicAMIPatch_.cyclicAMIPatch().neighbPatch().interpolate cyclicAMIPatch_.cyclicAMIPatch().neighbPatch().interpolate
( (
fcFld fcFld
); );
}
// add to internal field // add to internal field
nbr.addToInternalField nbr.addToInternalField

View File

@ -359,6 +359,7 @@ void Foam::cyclicAMIPolyPatch::resetAMI
surfPtr(), surfPtr(),
faceAreaIntersect::tmMesh, faceAreaIntersect::tmMesh,
AMIMethod, AMIMethod,
AMILowWeightCorrection_,
AMIReverse_ AMIReverse_
) )
); );
@ -470,6 +471,7 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
separationVector_(vector::zero), separationVector_(vector::zero),
AMIPtr_(NULL), AMIPtr_(NULL),
AMIReverse_(false), AMIReverse_(false),
AMILowWeightCorrection_(-1.0),
surfPtr_(NULL), surfPtr_(NULL),
surfDict_(fileName("surface")) surfDict_(fileName("surface"))
{ {
@ -498,6 +500,7 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
separationVector_(vector::zero), separationVector_(vector::zero),
AMIPtr_(NULL), AMIPtr_(NULL),
AMIReverse_(dict.lookupOrDefault<bool>("flipNormals", false)), AMIReverse_(dict.lookupOrDefault<bool>("flipNormals", false)),
AMILowWeightCorrection_(dict.lookupOrDefault("lowWeightCorrection", -1.0)),
surfPtr_(NULL), surfPtr_(NULL),
surfDict_(dict.subOrEmptyDict("surface")) surfDict_(dict.subOrEmptyDict("surface"))
{ {
@ -606,6 +609,7 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
separationVector_(pp.separationVector_), separationVector_(pp.separationVector_),
AMIPtr_(NULL), AMIPtr_(NULL),
AMIReverse_(pp.AMIReverse_), AMIReverse_(pp.AMIReverse_),
AMILowWeightCorrection_(pp.AMILowWeightCorrection_),
surfPtr_(NULL), surfPtr_(NULL),
surfDict_(pp.surfDict_) surfDict_(pp.surfDict_)
{ {
@ -635,6 +639,7 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
separationVector_(pp.separationVector_), separationVector_(pp.separationVector_),
AMIPtr_(NULL), AMIPtr_(NULL),
AMIReverse_(pp.AMIReverse_), AMIReverse_(pp.AMIReverse_),
AMILowWeightCorrection_(pp.AMILowWeightCorrection_),
surfPtr_(NULL), surfPtr_(NULL),
surfDict_(pp.surfDict_) surfDict_(pp.surfDict_)
{ {
@ -678,6 +683,7 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
separationVector_(pp.separationVector_), separationVector_(pp.separationVector_),
AMIPtr_(NULL), AMIPtr_(NULL),
AMIReverse_(pp.AMIReverse_), AMIReverse_(pp.AMIReverse_),
AMILowWeightCorrection_(pp.AMILowWeightCorrection_),
surfPtr_(NULL), surfPtr_(NULL),
surfDict_(pp.surfDict_) 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 void Foam::cyclicAMIPolyPatch::transformPosition(pointField& l) const
{ {
if (!parallel()) if (!parallel())
@ -970,7 +989,6 @@ void Foam::cyclicAMIPolyPatch::write(Ostream& os) const
{ {
os.writeKeyword("rotationAngle") << radToDeg(rotationAngle_) os.writeKeyword("rotationAngle") << radToDeg(rotationAngle_)
<< token::END_STATEMENT << nl; << token::END_STATEMENT << nl;
} }
break; break;
@ -997,6 +1015,12 @@ void Foam::cyclicAMIPolyPatch::write(Ostream& os) const
<< token::END_STATEMENT << nl; << token::END_STATEMENT << nl;
} }
if (AMILowWeightCorrection_ > 0)
{
os.writeKeyword("lowWeightCorrection") << AMILowWeightCorrection_
<< token::END_STATEMENT << nl;
}
if (!surfDict_.empty()) if (!surfDict_.empty())
{ {
os.writeKeyword(surfDict_.dictName()); os.writeKeyword(surfDict_.dictName());

View File

@ -97,6 +97,9 @@ private:
//- Flag to indicate that slave patch should be reversed for AMI //- Flag to indicate that slave patch should be reversed for AMI
const bool AMIReverse_; const bool AMIReverse_;
//- Low weight correction threshold for AMI
const scalar AMILowWeightCorrection_;
//- Projection surface //- Projection surface
mutable autoPtr<searchableSurface> surfPtr_; mutable autoPtr<searchableSurface> surfPtr_;
@ -298,6 +301,9 @@ public:
//- Return a reference to the AMI interpolator //- Return a reference to the AMI interpolator
const AMIPatchToPatchInterpolation& AMI() const; const AMIPatchToPatchInterpolation& AMI() const;
//- Return true if applying the low weight correction
bool applyLowWeightCorrection() const;
// Transformations // Transformations
@ -325,13 +331,18 @@ public:
//- Interpolate field //- Interpolate field
template<class Type> template<class Type>
tmp<Field<Type> > interpolate(const Field<Type>& fld) const; tmp<Field<Type> > interpolate
(
const Field<Type>& fld,
const UList<Type>& defaultValues = UList<Type>()
) const;
//- Interpolate tmp field //- Interpolate tmp field
template<class Type> template<class Type>
tmp<Field<Type> > interpolate tmp<Field<Type> > interpolate
( (
const tmp<Field<Type> >& tFld const tmp<Field<Type> >& tFld,
const UList<Type>& defaultValues = UList<Type>()
) const; ) const;
//- Low-level interpolate List //- Low-level interpolate List
@ -340,7 +351,8 @@ public:
( (
const UList<Type>& fld, const UList<Type>& fld,
const CombineOp& cop, const CombineOp& cop,
List<Type>& result List<Type>& result,
const UList<Type>& defaultValues = UList<Type>()
) const; ) const;

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -28,16 +28,17 @@ License
template<class Type> template<class Type>
Foam::tmp<Foam::Field<Type> > Foam::cyclicAMIPolyPatch::interpolate Foam::tmp<Foam::Field<Type> > Foam::cyclicAMIPolyPatch::interpolate
( (
const Field<Type>& fld const Field<Type>& fld,
const UList<Type>& defaultValues
) const ) const
{ {
if (owner()) if (owner())
{ {
return AMI().interpolateToSource(fld); return AMI().interpolateToSource(fld, defaultValues);
} }
else else
{ {
return neighbPatch().AMI().interpolateToTarget(fld); return neighbPatch().AMI().interpolateToTarget(fld, defaultValues);
} }
} }
@ -45,17 +46,11 @@ Foam::tmp<Foam::Field<Type> > Foam::cyclicAMIPolyPatch::interpolate
template<class Type> template<class Type>
Foam::tmp<Foam::Field<Type> > Foam::cyclicAMIPolyPatch::interpolate Foam::tmp<Foam::Field<Type> > Foam::cyclicAMIPolyPatch::interpolate
( (
const tmp<Field<Type> >& tFld const tmp<Field<Type> >& tFld,
const UList<Type>& defaultValues
) const ) const
{ {
if (owner()) return interpolate(tFld(), defaultValues);
{
return AMI().interpolateToSource(tFld);
}
else
{
return neighbPatch().AMI().interpolateToTarget(tFld);
}
} }
@ -64,16 +59,29 @@ void Foam::cyclicAMIPolyPatch::interpolate
( (
const UList<Type>& fld, const UList<Type>& fld,
const CombineOp& cop, const CombineOp& cop,
List<Type>& result List<Type>& result,
const UList<Type>& defaultValues
) const ) const
{ {
if (owner()) if (owner())
{ {
AMI().interpolateToSource(fld, cop, result); AMI().interpolateToSource
(
fld,
cop,
result,
defaultValues
);
} }
else else
{ {
neighbPatch().AMI().interpolateToTarget(fld, cop, result); neighbPatch().AMI().interpolateToTarget
(
fld,
cop,
result,
defaultValues
);
} }
} }

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -837,6 +837,7 @@ void Foam::mappedPatchBase::calcAMI() const
surfPtr(), surfPtr(),
faceAreaIntersect::tmMesh, faceAreaIntersect::tmMesh,
AMIPatchToPatchInterpolation::imFaceAreaWeight, AMIPatchToPatchInterpolation::imFaceAreaWeight,
-1,
AMIReverse_ AMIReverse_
) )
); );

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -92,6 +92,7 @@ void Foam::regionCoupledBase::resetAMI() const
surfPtr(), surfPtr(),
faceAreaIntersect::tmMesh, faceAreaIntersect::tmMesh,
AMIPatchToPatchInterpolation::imFaceAreaWeight, AMIPatchToPatchInterpolation::imFaceAreaWeight,
-1,
AMIReverse_ AMIReverse_
) )
); );

View File

@ -100,7 +100,7 @@ void Foam::forceCoeffs::writeFileHeader(const label i)
for (label j = 0; j < nBin_; j++) for (label j = 0; j < nBin_; j++)
{ {
const word jn('[' + Foam::name(j) + ']'); const word jn('(' + Foam::name(j) + ')');
writeTabbed(file(i), "Cm" + jn); writeTabbed(file(i), "Cm" + jn);
writeTabbed(file(i), "Cd" + jn); writeTabbed(file(i), "Cd" + jn);
writeTabbed(file(i), "Cl" + jn); writeTabbed(file(i), "Cl" + jn);

View File

@ -78,8 +78,8 @@ void Foam::forces::writeFileHeader(const label i)
writeCommented(file(i), "Time"); writeCommented(file(i), "Time");
file(i) file(i)
<< "forces[pressure,viscous,porous] " << "forces(pressure viscous porous) "
<< "moment[pressure,viscous,porous]"; << "moment(pressure viscous porous)";
if (localSystem_) if (localSystem_)
{ {
@ -126,7 +126,7 @@ void Foam::forces::writeFileHeader(const label i)
for (label j = 0; j < nBin_; j++) for (label j = 0; j < nBin_; j++)
{ {
const word jn('[' + Foam::name(j) + ']'); const word jn('(' + Foam::name(j) + ')');
const word f("forces" + jn + "[pressure,viscous,porous]"); const word f("forces" + jn + "[pressure,viscous,porous]");
const word m("moments" + jn + "[pressure,viscous,porous]"); const word m("moments" + jn + "[pressure,viscous,porous]");
@ -136,7 +136,7 @@ void Foam::forces::writeFileHeader(const label i)
{ {
for (label j = 0; j < nBin_; j++) for (label j = 0; j < nBin_; j++)
{ {
const word jn('[' + Foam::name(j) + ']'); const word jn('(' + Foam::name(j) + ')');
const word f("localForces" + jn + "[pressure,viscous,porous]"); const word f("localForces" + jn + "[pressure,viscous,porous]");
const word m("localMoments" + jn + "[pressure,viscous,porous]"); const word m("localMoments" + jn + "[pressure,viscous,porous]");
@ -403,13 +403,13 @@ void Foam::forces::writeForces()
<< " porous : " << sum(moment_[2]) << " porous : " << sum(moment_[2])
<< endl; << endl;
file(0) << obr_.time().value() << tab << setw(1) << '[' file(0) << obr_.time().value() << tab << setw(1) << '('
<< sum(force_[0]) << setw(1) << ',' << sum(force_[0]) << setw(1) << ' '
<< sum(force_[1]) << setw(1) << "," << sum(force_[1]) << setw(1) << ' '
<< sum(force_[2]) << setw(3) << "] [" << sum(force_[2]) << setw(3) << ") ("
<< sum(moment_[0]) << setw(1) << "," << sum(moment_[0]) << setw(1) << ' '
<< sum(moment_[1]) << setw(1) << "," << sum(moment_[1]) << setw(1) << ' '
<< sum(moment_[2]) << setw(1) << "]" << sum(moment_[2]) << setw(1) << ')'
<< endl; << endl;
if (localSystem_) if (localSystem_)
@ -421,13 +421,13 @@ void Foam::forces::writeForces()
vectorField localMomentT(coordSys_.localVector(moment_[1])); vectorField localMomentT(coordSys_.localVector(moment_[1]));
vectorField localMomentP(coordSys_.localVector(moment_[2])); vectorField localMomentP(coordSys_.localVector(moment_[2]));
file(0) << obr_.time().value() << tab << setw(1) << "[" file(0) << obr_.time().value() << tab << setw(1) << '('
<< sum(localForceN) << setw(1) << "," << sum(localForceN) << setw(1) << ' '
<< sum(localForceT) << setw(1) << "," << sum(localForceT) << setw(1) << ' '
<< sum(localForceP) << setw(3) << "] [" << sum(localForceP) << setw(3) << ") ("
<< sum(localMomentN) << setw(1) << "," << sum(localMomentN) << setw(1) << ' '
<< sum(localMomentT) << setw(1) << "," << sum(localMomentT) << setw(1) << ' '
<< sum(localMomentP) << setw(1) << "]" << sum(localMomentP) << setw(1) << ')'
<< endl; << endl;
} }
} }
@ -462,13 +462,13 @@ void Foam::forces::writeBins()
forAll(f[0], i) forAll(f[0], i)
{ {
file(1) file(1)
<< tab << setw(1) << "[" << tab << setw(1) << '('
<< f[0][i] << setw(1) << "," << f[0][i] << setw(1) << ' '
<< f[1][i] << setw(1) << "," << f[1][i] << setw(1) << ' '
<< f[2][i] << setw(3) << "] [" << f[2][i] << setw(3) << ") ("
<< m[0][i] << setw(1) << "," << m[0][i] << setw(1) << ' '
<< m[1][i] << setw(1) << "," << m[1][i] << setw(1) << ' '
<< m[2][i] << setw(1) << "]"; << m[2][i] << setw(1) << ')';
} }
if (localSystem_) if (localSystem_)
@ -498,13 +498,13 @@ void Foam::forces::writeBins()
forAll(lf[0], i) forAll(lf[0], i)
{ {
file(1) file(1)
<< tab << setw(1) << "[" << tab << setw(1) << '('
<< lf[0][i] << setw(1) << "," << lf[0][i] << setw(1) << ' '
<< lf[1][i] << setw(1) << "," << lf[1][i] << setw(1) << ' '
<< lf[2][i] << setw(3) << "] [" << lf[2][i] << setw(3) << ") ("
<< lm[0][i] << setw(1) << "," << lm[0][i] << setw(1) << ' '
<< lm[1][i] << setw(1) << "," << lm[1][i] << setw(1) << ' '
<< lm[2][i] << setw(1) << "]"; << lm[2][i] << setw(1) << ')';
} }
} }

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -243,6 +243,7 @@ Foam::regionModels::regionModel::interRegionAMI
nbrP, nbrP,
faceAreaIntersect::tmMesh, faceAreaIntersect::tmMesh,
AMIPatchToPatchInterpolation::imFaceAreaWeight, AMIPatchToPatchInterpolation::imFaceAreaWeight,
-1,
flip flip
) )
); );
@ -284,6 +285,7 @@ Foam::regionModels::regionModel::interRegionAMI
nbrP, nbrP,
faceAreaIntersect::tmMesh, faceAreaIntersect::tmMesh,
AMIPatchToPatchInterpolation::imFaceAreaWeight, AMIPatchToPatchInterpolation::imFaceAreaWeight,
-1,
flip flip
) )
); );

View File

@ -420,6 +420,7 @@ Foam::meshToMesh::patchAMIs() const
tgtPP, tgtPP,
faceAreaIntersect::tmMesh, faceAreaIntersect::tmMesh,
interpolationMethodAMI(method_), interpolationMethodAMI(method_),
-1,
true // flip target patch since patch normals are aligned true // flip target patch since patch normals are aligned
) )
); );

View File

@ -354,7 +354,8 @@ void Foam::meshToMesh::mapSrcToTgt
( (
srcField, srcField,
multiplyWeightedOp<Type, CombineOp>(cop), multiplyWeightedOp<Type, CombineOp>(cop),
tgtField tgtField,
UList<Type>::null()
); );
} }
@ -385,7 +386,7 @@ Foam::meshToMesh::mapSrcToTgt
( (
IOobject IOobject
( (
type() + ".interpolate(" + field.name() + ")", type() + ":interpolate(" + field.name() + ")",
tgtMesh.time().timeName(), tgtMesh.time().timeName(),
tgtMesh, tgtMesh,
IOobject::NO_READ, IOobject::NO_READ,
@ -498,7 +499,7 @@ Foam::meshToMesh::mapTgtToSrc
( (
IOobject IOobject
( (
type() + ".interpolate(" + field.name() + ")", type() + ":interpolate(" + field.name() + ")",
srcMesh.time().timeName(), srcMesh.time().timeName(),
srcMesh, srcMesh,
IOobject::NO_READ, IOobject::NO_READ,

View File

@ -10,7 +10,7 @@ FoamFile
version 2.0; version 2.0;
format ascii; format ascii;
class volScalarField; class volScalarField;
object alpha.water; object alpha.phase1;
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -8,6 +8,6 @@ cd ${0%/*} || exit 1 # run from this directory
./Allrun-pre ./Allrun-pre
## Run simulation ## Run simulation
#./Allrun-simulation ./Allrun-simulation
# ----------------------------------------------------------------- end-of-file # ----------------------------------------------------------------- end-of-file

View File

@ -93,17 +93,17 @@ runParallel foamyHexMesh $nProcs
runParallel collapseEdges $nProcs -collapseFaces -latestTime runParallel collapseEdges $nProcs -collapseFaces -latestTime
mv log.collapseEdges log.collapseFaces mv log.collapseEdges log.collapseFaces
\cp system/collapseDict.indirectPatchFaces system/collapseDict #\cp system/collapseDict.indirectPatchFaces system/collapseDict
runParallel collapseEdges $nProcs -collapseFaceSet indirectPatchFaces -latestTime #runParallel collapseEdges $nProcs -collapseFaceSet indirectPatchFaces -latestTime
mv log.collapseEdges log.collapseFaceSet #mv log.collapseEdges log.collapseFaceSet
runParallel checkMesh $nProcs -allTopology -allGeometry -latestTime runParallel checkMesh $nProcs -allTopology -allGeometry -latestTime
runApplication reconstructParMesh -latestTime runApplication reconstructParMesh -latestTime
# Copy the mesh into polyMesh and delete the 102 directory # Copy the mesh into polyMesh and delete the 102 directory
\cp -r 102/polyMesh constant \cp -r 101/polyMesh constant
\rm -rf 102 \rm -rf 101
# ----------------------------------------------------------------- end-of-file # ----------------------------------------------------------------- end-of-file

View File

@ -31,7 +31,7 @@ runApplication setFields
runApplication decomposePar -force runApplication decomposePar -force
# Run # Run
runParallel $application 8 runParallel $application $nProcs
# Reconstruct # Reconstruct
runApplication reconstructPar -noFunctionObjects runApplication reconstructPar -noFunctionObjects

View File

@ -15,16 +15,16 @@ FoamFile
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
phases (water air); phases (phase1 phase2);
water phase1
{ {
transportModel Newtonian; transportModel Newtonian;
nu nu [ 0 2 -1 0 0 0 0 ] 1e-06; nu nu [ 0 2 -1 0 0 0 0 ] 1e-06;
rho rho [ 1 -3 0 0 0 0 0 ] 300; rho rho [ 1 -3 0 0 0 0 0 ] 300;
} }
air phase2
{ {
transportModel Newtonian; transportModel Newtonian;
nu nu [ 0 2 -1 0 0 0 0 ] 1e-6; nu nu [ 0 2 -1 0 0 0 0 ] 1e-6;

View File

@ -81,6 +81,7 @@ baffles
matchTolerance 0.0001; matchTolerance 0.0001;
neighbourPatch AMI2; neighbourPatch AMI2;
transform noOrdering; transform noOrdering;
lowWeightCorrection 0.2;
// Note: since imperfect meshing around feature edge make // Note: since imperfect meshing around feature edge make
// sure to project both sides onto 'proper' geometry to // sure to project both sides onto 'proper' geometry to
// avoid errors leading to zero weights // avoid errors leading to zero weights
@ -99,6 +100,7 @@ baffles
matchTolerance 0.0001; matchTolerance 0.0001;
neighbourPatch AMI1; neighbourPatch AMI1;
transform noOrdering; transform noOrdering;
lowWeightCorrection 0.2;
surface surface
{ {
type triSurfaceMesh; type triSurfaceMesh;

View File

@ -17,7 +17,7 @@ FoamFile
solvers solvers
{ {
alpha.water alpha.phase1
{ {
nAlphaCorr 1; nAlphaCorr 1;
nAlphaSubCycles 2; nAlphaSubCycles 2;

View File

@ -17,7 +17,7 @@ FoamFile
defaultFieldValues defaultFieldValues
( (
volScalarFieldValue alpha.water 1 volScalarFieldValue alpha.phase1 1
); );
regions regions
@ -27,7 +27,7 @@ regions
box (-4 -4 -1) (4 4 0.74); box (-4 -4 -1) (4 4 0.74);
fieldValues fieldValues
( (
volScalarFieldValue alpha.water 0 volScalarFieldValue alpha.phase1 0
); );
} }
); );