From ccefe8bb902133160f28c53190e58da90ad2b563 Mon Sep 17 00:00:00 2001
From: mattijs <mattijs>
Date: Wed, 9 Nov 2011 12:31:57 +0000
Subject: [PATCH] ENH: fvMatrix: debug printing of diagonal dominance

---
 .../fvMatrices/fvMatrix/fvMatrix.C            | 34 +++++++++++++++++++
 .../fvMatrices/fvMatrix/fvMatrix.H            |  1 +
 2 files changed, 35 insertions(+)

diff --git a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.C b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.C
index 33922b5019b..fd78acb546c 100644
--- a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.C
+++ b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.C
@@ -587,7 +587,41 @@ void Foam::fvMatrix<Type>::relax(const scalar alpha)
         }
     }
 
+
+    if (debug)
+    {
+        // Calculate amount of non-dominance.
+        label nNon = 0;
+        scalar maxNon = 0.0;
+        scalar sumNon = 0.0;
+        forAll(D, celli)
+        {
+            scalar d = (sumOff[celli] - D[celli])/D[celli];
+
+            if (d > 0)
+            {
+                nNon++;
+                maxNon = max(maxNon, d);
+                sumNon += d;
+            }
+        }
+
+        reduce(nNon, sumOp<label>());
+        reduce(maxNon, maxOp<scalar>());
+        reduce(sumNon, sumOp<scalar>());
+        sumNon /= returnReduce(D.size(), sumOp<label>());
+
+        InfoIn("fvMatrix<Type>::relax(const scalar alpha)")
+            << "Matrix dominance test for " << psi_.name() << nl
+            << "    number of non-dominant cells   : " << nNon << nl
+            << "    maximum relative non-dominance : " << maxNon << nl
+            << "    average relative non-dominance : " << sumNon << nl
+            << endl;
+    }
+
+
     // Ensure the matrix is diagonally dominant...
+    // (assumes that the central coefficient is positive)
     max(D, D, sumOff);
 
     // ... then relax
diff --git a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.H b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.H
index 196a48285e9..25021653f3a 100644
--- a/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.H
+++ b/src/finiteVolume/fvMatrices/fvMatrix/fvMatrix.H
@@ -364,6 +364,7 @@ public:
             //  alpha = 1 : diagonally equal
             //  alpha < 1 : diagonally dominant
             //  alpha = 0 : do nothing
+            //  Note: Requires positive diagonal.
             void relax(const scalar alpha);
 
             //- Relax matrix (for steady-state solution).
-- 
GitLab