From 468da226bbc9077a88f7c5bc5d33a0e8a40dca57 Mon Sep 17 00:00:00 2001 From: andy <andy> Date: Fri, 4 Apr 2014 16:34:44 +0100 Subject: [PATCH] ENH: ACMI updates --- .../cyclicACMI/cyclicACMIFvPatchField.C | 59 +++++++++++++------ .../cyclicACMI/cyclicACMIFvPatchField.H | 25 +++++++- 2 files changed, 63 insertions(+), 21 deletions(-) diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.C index 9fa08201ea4..9cdbff68e2c 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.C +++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2013-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -154,11 +154,11 @@ Foam::cyclicACMIFvPatchField<Type>::patchNeighbourField() const const Field<Type>& iField = this->internalField(); const labelUList& nbrFaceCellsCoupled = cyclicACMIPatch_.cyclicACMIPatch().neighbPatch().faceCells(); - const labelUList& nbrFaceCellsNonOverlap = + const labelUList& faceCellsNonOverlap = cyclicACMIPatch_.cyclicACMIPatch().nonOverlapPatch().faceCells(); Field<Type> pnfCoupled(iField, nbrFaceCellsCoupled); - Field<Type> pnfNonOverlap(iField, nbrFaceCellsNonOverlap); + Field<Type> pfNonOverlap(iField, faceCellsNonOverlap); tmp<Field<Type> > tpnf ( @@ -167,7 +167,7 @@ Foam::cyclicACMIFvPatchField<Type>::patchNeighbourField() const cyclicACMIPatch_.interpolate ( pnfCoupled, - pnfNonOverlap + pfNonOverlap ) ) ); @@ -287,10 +287,14 @@ Foam::tmp<Foam::Field<Type> > Foam::cyclicACMIFvPatchField<Type>::snGrad template<class Type> void Foam::cyclicACMIFvPatchField<Type>::updateCoeffs() { - const scalarField& mask = cyclicACMIPatch_.cyclicACMIPatch().mask(); + // update non-overlap patch - some will implement updateCoeffs, and + // others will implement evaluate + + // scale neighbour field by (1 - mask) + const scalarField& mask = cyclicACMIPatch_.cyclicACMIPatch().mask(); const fvPatchField<Type>& npf = nonOverlapPatchField(); - const_cast<fvPatchField<Type>&>(npf).updateCoeffs(mask); + const_cast<fvPatchField<Type>&>(npf).updateCoeffs(1.0 - mask); } @@ -300,9 +304,21 @@ void Foam::cyclicACMIFvPatchField<Type>::initEvaluate const Pstream::commsTypes comms ) { - // update non-overlap patch - const fvPatchField<Type>& npf = nonOverlapPatchField(); - const_cast<fvPatchField<Type>&>(npf).evaluate(comms); + // update non-overlap patch (if not already updated by updateCoeffs) + + // scale neighbour field by (1 - mask) + + fvPatchField<Type>& npf = + const_cast<fvPatchField<Type>&>(nonOverlapPatchField()); + + if (!npf.updated()) + { + const scalarField& mask = cyclicACMIPatch_.cyclicACMIPatch().mask(); + + npf.evaluate(comms); + + npf *= 1.0 - mask; + } } @@ -313,13 +329,16 @@ void Foam::cyclicACMIFvPatchField<Type>::evaluate ) { // blend contributions from the coupled and non-overlap patches + + // neighbour patch field is updated via updateCoeffs or initEvaluate + // and is already scaled by (1 - mask) const fvPatchField<Type>& npf = nonOverlapPatchField(); coupledFvPatchField<Type>::evaluate(comms); const Field<Type>& cpf = *this; const scalarField& mask = cyclicACMIPatch_.cyclicACMIPatch().mask(); - Field<Type>::operator=(mask*cpf + (1.0 - mask)*npf); + Field<Type>::operator=(mask*cpf + npf); fvPatchField<Type>::evaluate(); } @@ -333,7 +352,7 @@ Foam::cyclicACMIFvPatchField<Type>::valueInternalCoeffs ) const { // note: do not blend based on mask field - // - when applied this is scaled by the areas which area already scaled + // - when applied this is scaled by the areas which are already scaled return coupledFvPatchField<Type>::valueInternalCoeffs(w); } @@ -346,7 +365,7 @@ Foam::cyclicACMIFvPatchField<Type>::valueBoundaryCoeffs ) const { // note: do not blend based on mask field - // - when applied this is scaled by the areas which area already scaled + // - when applied this is scaled by the areas which are already scaled return coupledFvPatchField<Type>::valueBoundaryCoeffs(w); } @@ -359,7 +378,7 @@ Foam::cyclicACMIFvPatchField<Type>::gradientInternalCoeffs ) const { // note: do not blend based on mask field - // - when applied this is scaled by the areas which area already scaled + // - when applied this is scaled by the areas which are already scaled return coupledFvPatchField<Type>::gradientInternalCoeffs(deltaCoeffs); } @@ -369,7 +388,7 @@ Foam::tmp<Foam::Field<Type> > Foam::cyclicACMIFvPatchField<Type>::gradientInternalCoeffs() const { // note: do not blend based on mask field - // - when applied this is scaled by the areas which area already scaled + // - when applied this is scaled by the areas which are already scaled return coupledFvPatchField<Type>::gradientInternalCoeffs(); } @@ -382,7 +401,7 @@ Foam::cyclicACMIFvPatchField<Type>::gradientBoundaryCoeffs ) const { // note: do not blend based on mask field - // - when applied this is scaled by the areas which area already scaled + // - when applied this is scaled by the areas which are already scaled return coupledFvPatchField<Type>::gradientBoundaryCoeffs(deltaCoeffs); } @@ -392,7 +411,7 @@ Foam::tmp<Foam::Field<Type> > Foam::cyclicACMIFvPatchField<Type>::gradientBoundaryCoeffs() const { // note: do not blend based on mask field - // - when applied this is scaled by the areas which area already scaled + // - when applied this is scaled by the areas which are already scaled return coupledFvPatchField<Type>::gradientBoundaryCoeffs(); } @@ -403,11 +422,13 @@ void Foam::cyclicACMIFvPatchField<Type>::manipulateMatrix fvMatrix<Type>& matrix ) { - // blend contributions from the coupled and non-overlap patches + const scalarField& mask = cyclicACMIPatch_.cyclicACMIPatch().mask(); + + // nothing to be done by the AMI, but re-direct to non-overlap patch + // with non-overlap patch weights const fvPatchField<Type>& npf = nonOverlapPatchField(); - const scalarField& mask = cyclicACMIPatch_.cyclicACMIPatch().mask(); - const_cast<fvPatchField<Type>&>(npf).manipulateMatrix(matrix, mask); + const_cast<fvPatchField<Type>&>(npf).manipulateMatrix(matrix, 1.0 - mask); } diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.H index 3a8198a95b2..dd2d8d751b8 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.H +++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclicACMI/cyclicACMIFvPatchField.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2013-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -166,9 +166,30 @@ public: // Evaluation functions //- Return true if coupled. Note that the underlying patch - // is not coupled() - the points don't align. + // is not coupled() - the points don't align virtual bool coupled() const; + //- Return true if this patch field fixes a value + // Needed to check if a level has to be specified while solving + // Poissons equations + virtual bool fixesValue() const + { + const scalarField& mask = + cyclicACMIPatch_.cyclicACMIPatch().mask(); + + if (gMax(mask) > 1e-5) + { + // regions connected + return false; + } + else + { + // fully separated + return nonOverlapPatchField().fixesValue(); + } + } + + //- Return neighbour coupled internal cell data virtual tmp<Field<Type> > patchNeighbourField() const; -- GitLab