From 3cd939d2a8e2de1a34104501d20f0b9ebd00a58a Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@dune-project.org>
Date: Wed, 22 Aug 2007 09:47:33 +0000
Subject: [PATCH] Use Cramer's rule to solve 3x3 systems.  This can get a lot
 faster, because the code doesn't contain conditionals.

[[Imported from SVN: r4979]]
---
 common/fmatrix.hh | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/common/fmatrix.hh b/common/fmatrix.hh
index 44fb1b74e..23f27f1f2 100644
--- a/common/fmatrix.hh
+++ b/common/fmatrix.hh
@@ -638,7 +638,28 @@ namespace Dune {
       x[0] = detinv*(p[1][1]*b[0]-p[0][1]*b[1]);
       x[1] = detinv*(p[0][0]*b[1]-p[1][0]*b[0]);
 
+    } else if (n==3) {
+
+      K d = determinant();
+#ifdef DUNE_FMatrix_WITH_CHECKING
+      if (fvmeta_absreal(d)<FMatrixPrecision<>::absolute_limit())
+        DUNE_THROW(FMatrixError,"matrix is singular");
+#endif
+
+      x[0] = (b[0]*p[1][1]*p[2][2] - b[0]*p[2][1]*p[1][2]
+              - b[1] *p[0][1]*p[2][2] + b[1]*p[2][1]*p[0][2]
+              + b[2] *p[0][1]*p[1][2] - b[2]*p[1][1]*p[0][2]) / d;
+
+      x[1] = (p[0][0]*b[1]*p[2][2] - p[0][0]*b[2]*p[1][2]
+              - p[1][0] *b[0]*p[2][2] + p[1][0]*b[2]*p[0][2]
+              + p[2][0] *b[0]*p[1][2] - p[2][0]*b[1]*p[0][2]) / d;
+
+      x[2] = (p[0][0]*p[1][1]*b[2] - p[0][0]*p[2][1]*b[1]
+              - p[1][0] *p[0][1]*b[2] + p[1][0]*p[2][1]*b[0]
+              + p[2][0] *p[0][1]*b[1] - p[2][0]*p[1][1]*b[0]) / d;
+
     } else {
+
       V& rhs = x;     // use x to store rhs
       rhs = b;     // copy data
       Elim<V> elim(rhs);
-- 
GitLab