From 20801634613030c775336dac9a81d3cbe3d9b048 Mon Sep 17 00:00:00 2001
From: Nora Abi Akar <nora.abiakar@gmail.com>
Date: Tue, 7 Jan 2020 15:43:59 +0100
Subject: [PATCH] Choose pivot on the diagonal if possible, otherwise choose
 leftmost element (#933)

* Choose the pivot on the diagonal if possible when performing symbolic Gaussian elimination in modcc-generated mechanisms.
---
 modcc/symge.cpp | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/modcc/symge.cpp b/modcc/symge.cpp
index 704936c3..0968b040 100644
--- a/modcc/symge.cpp
+++ b/modcc/symge.cpp
@@ -94,10 +94,14 @@ std::vector<std::vector<symge::symbol>> gj_reduce(sym_matrix& A, symbol_table& t
             pivot p;
             p.row = r;
             const sym_row &row = A[r];
-            for (unsigned c = 0; c < A.nrow(); ++c) {
-                if (row[c]) {
-                    p.col = c;
-                    break;
+            if (row[r]) {
+                p.col = r;
+            } else {
+                for (unsigned c = 0; c < A.nrow(); ++c) {
+                    if (row[c]) {
+                        p.col = c;
+                        break;
+                    }
                 }
             }
             pivots.push_back(std::move(p));
-- 
GitLab