From 015d94a4bfb42614ec6ab7e5693fc3383fd3954f Mon Sep 17 00:00:00 2001
From: Mathieu Faverge <mathieu.faverge@inria.fr>
Date: Wed, 16 Nov 2016 09:42:49 -0700
Subject: [PATCH] Fix matvec with multiple dof spms

---
 spm.c | 24 ++++++++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

diff --git a/spm.c b/spm.c
index 483aea24..129b2cc5 100644
--- a/spm.c
+++ b/spm.c
@@ -736,6 +736,7 @@ spmCopy( const pastix_spm_t *spm )
         dofsize = spm->n + 1;
         break;
     case PastixIJV:
+    default:
         colsize = spm->nnz;
         rowsize = spm->nnz;
         valsize = spm->nnzexp;
@@ -904,21 +905,36 @@ spmMatVec(const pastix_trans_t trans,
           const void          *beta,
                 void          *y )
 {
+    pastix_spm_t *espm = (pastix_spm_t*)spm;
+    int rc = PASTIX_SUCCESS;
+
     if ( spm->fmttype != PastixCSC ) {
         return PASTIX_ERR_BADPARAMETER;
     }
 
+    if ( spm->dof != 1 ) {
+        espm = spmExpand( spm );
+    }
     switch (spm->flttype) {
     case PastixFloat:
-        return s_spmCSCMatVec( trans, alpha, spm, x, beta, y );
+        rc = s_spmCSCMatVec( trans, alpha, espm, x, beta, y );
+        break;
     case PastixComplex32:
-        return c_spmCSCMatVec( trans, alpha, spm, x, beta, y );
+        rc = c_spmCSCMatVec( trans, alpha, espm, x, beta, y );
+        break;
     case PastixComplex64:
-        return z_spmCSCMatVec( trans, alpha, spm, x, beta, y );
+        rc = z_spmCSCMatVec( trans, alpha, espm, x, beta, y );
+        break;
     case PastixDouble:
     default:
-        return d_spmCSCMatVec( trans, alpha, spm, x, beta, y );
+        rc = d_spmCSCMatVec( trans, alpha, espm, x, beta, y );
+    }
+
+    if ( spm != espm ) {
+        spmExit( espm );
+        free(espm);
     }
+    return rc;
 }
 
 /**
-- 
GitLab