From 05e0749d0e493a6cf94697e5468d264bf6593afc Mon Sep 17 00:00:00 2001
From: Andrew Heather <>
Date: Thu, 13 May 2021 09:28:19 +0100
Subject: [PATCH] ENH: Added under-relaxation to jump conditions

Currently only applied to the fanFvPatchField, e.g.

    plane
    {
        type            fan;
        patchType       cyclic;
        jump            uniform 0;
        value           uniform 0;
        uniformJump     false;

        // Optional under-relaxation
        relax           0.2;

        ...
    }
---
 .../derived/fan/fanFvPatchFields.C            |  6 +-
 .../derived/fixedJump/fixedJumpFvPatchField.C | 96 +++++++++++++++++--
 .../derived/fixedJump/fixedJumpFvPatchField.H | 20 ++++
 .../uniformJump/uniformJumpFvPatchField.C     |  2 +-
 4 files changed, 111 insertions(+), 13 deletions(-)

diff --git a/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchFields.C b/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchFields.C
index c404004e312..c1d7c100544 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchFields.C
+++ b/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchFields.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
-    Copyright (C) 2017-2020 OpenCFD Ltd.
+    Copyright (C) 2017-2021 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -80,6 +80,8 @@ void Foam::fanFvPatchField<Foam::scalar>::calcFanJump()
         {
             this->jump_ = this->jumpTable_->value(Un);
         }
+
+        this->relax();
     }
 }
 
@@ -94,7 +96,7 @@ Foam::fanFvPatchField<Foam::scalar>::fanFvPatchField
     const dictionary& dict
 )
 :
-    uniformJumpFvPatchField<scalar>(p, iF),
+    uniformJumpFvPatchField<scalar>(p, iF, dict),
     phiName_(dict.getOrDefault<word>("phi", "phi")),
     rhoName_(dict.getOrDefault<word>("rho", "rho")),
     uniformJump_(dict.getOrDefault("uniformJump", false)),
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/fixedJump/fixedJumpFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/fixedJump/fixedJumpFvPatchField.C
index 1b23bef4348..49fdedd3be4 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/fixedJump/fixedJumpFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/derived/fixedJump/fixedJumpFvPatchField.C
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2021 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -37,7 +38,10 @@ Foam::fixedJumpFvPatchField<Type>::fixedJumpFvPatchField
 )
 :
     jumpCyclicFvPatchField<Type>(p, iF),
-    jump_(this->size(), Zero)
+    jump_(this->size(), Zero),
+    jump0_(this->size(), Zero),
+    relaxFactor_(-1),
+    timeIndex_(-1)
 {}
 
 
@@ -51,7 +55,10 @@ Foam::fixedJumpFvPatchField<Type>::fixedJumpFvPatchField
 )
 :
     jumpCyclicFvPatchField<Type>(ptf, p, iF, mapper),
-    jump_(ptf.jump_, mapper)
+    jump_(ptf.jump_, mapper),
+    jump0_(ptf.jump0_, mapper),
+    relaxFactor_(ptf.relaxFactor_),
+    timeIndex_(ptf.timeIndex_)
 {}
 
 
@@ -63,12 +70,20 @@ Foam::fixedJumpFvPatchField<Type>::fixedJumpFvPatchField
     const dictionary& dict
 )
 :
-    jumpCyclicFvPatchField<Type>(p, iF),
-    jump_(p.size(), Zero)
+    jumpCyclicFvPatchField<Type>(p, iF, dict),
+    jump_(p.size(), Zero),
+    jump0_(p.size(), Zero),
+    relaxFactor_(dict.getOrDefault<scalar>("relax", -1)),
+    timeIndex_(this->db().time().timeIndex())
 {
     if (this->cyclicPatch().owner())
     {
         jump_ = Field<Type>("jump", dict, p.size());
+
+        if (dict.found("jump0"))
+        {
+            jump0_ = Field<Type>("jump0", dict, p.size());
+        }
     }
 
     if (dict.found("value"))
@@ -92,7 +107,10 @@ Foam::fixedJumpFvPatchField<Type>::fixedJumpFvPatchField
 )
 :
     jumpCyclicFvPatchField<Type>(ptf),
-    jump_(ptf.jump_)
+    jump_(ptf.jump_),
+    jump0_(ptf.jump0_),
+    relaxFactor_(ptf.relaxFactor_),
+    timeIndex_(ptf.timeIndex_)
 {}
 
 
@@ -104,7 +122,10 @@ Foam::fixedJumpFvPatchField<Type>::fixedJumpFvPatchField
 )
 :
     jumpCyclicFvPatchField<Type>(ptf, iF),
-    jump_(ptf.jump_)
+    jump_(ptf.jump_),
+    jump0_(ptf.jump0_),
+    relaxFactor_(ptf.relaxFactor_),
+    timeIndex_(ptf.timeIndex_)
 {}
 
 
@@ -127,6 +148,49 @@ Foam::tmp<Foam::Field<Type>> Foam::fixedJumpFvPatchField<Type>::jump() const
 }
 
 
+template<class Type>
+Foam::tmp<Foam::Field<Type>> Foam::fixedJumpFvPatchField<Type>::jump0() const
+{
+    if (this->cyclicPatch().owner())
+    {
+        return jump0_;
+    }
+    else
+    {
+        return refCast<const fixedJumpFvPatchField<Type>>
+        (
+            this->neighbourPatchField()
+        ).jump0();
+    }
+}
+
+
+template<class Type>
+Foam::scalar Foam::fixedJumpFvPatchField<Type>::relaxFactor() const
+{
+    return relaxFactor_;
+}
+
+
+template<class Type>
+void Foam::fixedJumpFvPatchField<Type>::relax()
+{
+    if (!this->cyclicPatch().owner() || relaxFactor_ < 0)
+    {
+        return;
+    }
+
+    jump_ = relaxFactor_*jump_ + (1 - relaxFactor_)*jump0_;
+
+    if (timeIndex_ != this->db().time().timeIndex())
+    {
+        jump0_ = jump_;
+
+        timeIndex_ = this->db().time().timeIndex();
+    }
+}
+
+
 template<class Type>
 void Foam::fixedJumpFvPatchField<Type>::autoMap
 (
@@ -135,6 +199,7 @@ void Foam::fixedJumpFvPatchField<Type>::autoMap
 {
     jumpCyclicFvPatchField<Type>::autoMap(m);
     jump_.autoMap(m);
+    jump0_.autoMap(m);
 }
 
 
@@ -147,9 +212,9 @@ void Foam::fixedJumpFvPatchField<Type>::rmap
 {
     jumpCyclicFvPatchField<Type>::rmap(ptf, addr);
 
-    const fixedJumpFvPatchField<Type>& tiptf =
-        refCast<const fixedJumpFvPatchField<Type>>(ptf);
-    jump_.rmap(tiptf.jump_, addr);
+    const auto& fjptf = refCast<const fixedJumpFvPatchField<Type>>(ptf);
+    jump_.rmap(fjptf.jump_, addr);
+    jump0_.rmap(fjptf.jump0_, addr);
 }
 
 
@@ -157,11 +222,22 @@ template<class Type>
 void Foam::fixedJumpFvPatchField<Type>::write(Ostream& os) const
 {
     fvPatchField<Type>::write(os);
-    os.writeEntry("patchType", this->interfaceFieldType());
+
+    // Write patchType if not done already by fvPatchField
+    if (!this->patchType().size())
+    {
+        os.writeEntry("patchType", this->interfaceFieldType());
+    }
 
     if (this->cyclicPatch().owner())
     {
         jump_.writeEntry("jump", os);
+
+        if (relaxFactor_ > 0)
+        {
+            os.writeEntry("relax", relaxFactor_);
+            jump0_.writeEntry("jump0", os);
+        }
     }
 
     this->writeEntry("value", os);
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/fixedJump/fixedJumpFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/derived/fixedJump/fixedJumpFvPatchField.H
index db10041f524..baef3236e66 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/fixedJump/fixedJumpFvPatchField.H
+++ b/src/finiteVolume/fields/fvPatchFields/derived/fixedJump/fixedJumpFvPatchField.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
+    Copyright (C) 2021 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -41,6 +42,7 @@ Usage
         Property     | Description             | Required    | Default value
         patchType    | underlying patch type should be \c cyclic| yes |
         jump         | current jump value      | yes         |
+        relax        | under-relaxation factor | no          |
     \endtable
 
     Example of the boundary condition specification:
@@ -93,6 +95,15 @@ protected:
         //- "jump" field
         Field<Type> jump_;
 
+        //- "jump" field at old time level
+        Field<Type> jump0_;
+
+        //- Under-relaxation factor
+        scalar relaxFactor_;
+
+        //- Time index
+        label timeIndex_;
+
 
 public:
 
@@ -168,6 +179,15 @@ public:
             //- Return the "jump" across the patch
             virtual tmp<Field<Type>> jump() const;
 
+            //- Return the old time "jump" across the patch
+            virtual tmp<Field<Type>> jump0() const;
+
+            //- Return the under-relaxation factor
+            virtual scalar relaxFactor() const;
+
+            //- Return the relaxed "jump" across the patch
+            virtual void relax();
+
 
         // Mapping functions
 
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/uniformJump/uniformJumpFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/uniformJump/uniformJumpFvPatchField.C
index 94bdd0c9acf..74ae08f31b8 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/uniformJump/uniformJumpFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/derived/uniformJump/uniformJumpFvPatchField.C
@@ -63,7 +63,7 @@ Foam::uniformJumpFvPatchField<Type>::uniformJumpFvPatchField
     const dictionary& dict
 )
 :
-    fixedJumpFvPatchField<Type>(p, iF),
+    fixedJumpFvPatchField<Type>(p, iF, dict),
     jumpTable_()
 {
     if (this->cyclicPatch().owner())
-- 
GitLab