From 5adac7b6511196cc8f67538c6f3df1114ff3b89d Mon Sep 17 00:00:00 2001
From: Mathieu Faverge <mathieu.faverge@inria.fr>
Date: Sat, 12 Nov 2016 18:03:13 -0500
Subject: [PATCH] Fix Copy, Exit and Base for dof cases

---
 spm.c | 43 +++++++++++++++++++++++++++++++++++--------
 1 file changed, 35 insertions(+), 8 deletions(-)

diff --git a/spm.c b/spm.c
index 36945756..c8cd8df8 100644
--- a/spm.c
+++ b/spm.c
@@ -132,6 +132,8 @@ spmExit( pastix_spm_t *spm )
         memFree_null(spm->loc2glob);
     if(spm->values != NULL)
         memFree_null(spm->values);
+    if(spm->dofs != NULL)
+        memFree_null(spm->dofs);
 }
 
 /**
@@ -220,7 +222,7 @@ spmBase( pastix_spm_t *spm,
         }
     }
     if (spm->dofs != NULL) {
-        for (i = 0; i < n; i++) {
+        for (i = 0; i <= n; i++) {
             spm->dofs[i] += baseadj;
         }
     }
@@ -715,23 +717,48 @@ pastix_spm_t *
 spmCopy( const pastix_spm_t *spm )
 {
     pastix_spm_t *newspm = (pastix_spm_t*)malloc(sizeof(pastix_spm_t));
+    pastix_int_t colsize, rowsize, valsize, dofsize;
 
     memcpy( newspm, spm, sizeof(pastix_spm_t));
 
+    switch(spm->fmttype){
+    case PastixCSC:
+        colsize = spm->n + 1;
+        rowsize = spm->nnz;
+        valsize = spm->nnzexp;
+        dofsize = spm->n + 1;
+        break;
+    case PastixCSR:
+        colsize = spm->nnz;
+        rowsize = spm->n + 1;
+        valsize = spm->nnzexp;
+        dofsize = spm->n + 1;
+        break;
+    case PastixIJV:
+        colsize = spm->nnz;
+        rowsize = spm->nnz;
+        valsize = spm->nnzexp;
+        dofsize = spm->n + 1;
+    }
+
     if(spm->colptr != NULL) {
-        newspm->colptr = (pastix_int_t*)malloc((spm->n+1) * sizeof(pastix_int_t));
-        memcpy( newspm->colptr, spm->colptr, (spm->n+1) * sizeof(pastix_int_t));
+        newspm->colptr = (pastix_int_t*)malloc( colsize * sizeof(pastix_int_t));
+        memcpy( newspm->colptr, spm->colptr, colsize * sizeof(pastix_int_t));
     }
     if(spm->rowptr != NULL) {
-        newspm->rowptr = (pastix_int_t*)malloc(spm->nnz * sizeof(pastix_int_t));
-        memcpy( newspm->rowptr, spm->rowptr, spm->nnz * sizeof(pastix_int_t));
+        newspm->rowptr = (pastix_int_t*)malloc(rowsize * sizeof(pastix_int_t));
+        memcpy( newspm->rowptr, spm->rowptr, rowsize * sizeof(pastix_int_t));
     }
     if(spm->loc2glob != NULL) {
-        newspm->loc2glob = (pastix_int_t*)malloc(spm->n * sizeof(pastix_int_t));
-        memcpy( newspm->loc2glob, spm->loc2glob, spm->n * sizeof(pastix_int_t));
+        newspm->loc2glob = (pastix_int_t*)malloc(dofsize * sizeof(pastix_int_t));
+        memcpy( newspm->loc2glob, spm->loc2glob, dofsize * sizeof(pastix_int_t));
+    }
+    if(spm->dofs != NULL) {
+        newspm->dofs = (pastix_int_t*)malloc(dofsize * sizeof(pastix_int_t));
+        memcpy( newspm->dofs, spm->dofs, dofsize * sizeof(pastix_int_t));
     }
     if(spm->values != NULL) {
-        size_t valsize = spm->nnzexp * pastix_size_of( spm->flttype );
+        valsize = valsize * pastix_size_of( spm->flttype );
         newspm->values = malloc(valsize);
         memcpy( newspm->values, spm->values, valsize);
     }
-- 
GitLab