From 34a40f0ead6e371914c7d0b6a3646fe51034c37f Mon Sep 17 00:00:00 2001
From: Mathieu Faverge <mathieu.faverge@inria.fr>
Date: Mon, 14 Nov 2016 16:46:37 -0500
Subject: [PATCH] Trying to fix an issue in convert test with 0 becoming -0 in
 imaginary part of diagonal-elements but does not work

---
 z_spm_2dense.c         | 20 ++++++++++++++++----
 z_spm_convert_to_csc.c |  4 +++-
 z_spm_convert_to_csr.c |  4 +++-
 3 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/z_spm_2dense.c b/z_spm_2dense.c
index 03f06c3d..ad9933ff 100644
--- a/z_spm_2dense.c
+++ b/z_spm_2dense.c
@@ -117,8 +117,14 @@ z_spmCSC2dense( const pastix_spm_t *spm )
                     {
                         for(ii=0; ii<dofi; ii++, valptr++)
                         {
-                            A[ (col + jj) * lda + (row + ii) ] = *valptr;
-                            A[ (row + ii) * lda + (col + jj) ] = conj(*valptr);
+                            if( col+jj == row+ii ) {
+                                /* Make sure the matrix is hermitian */
+                                A[ (col + jj) * lda + (row + ii) ] = creal(*valptr) + I * 0.;
+                            }
+                            else {
+                                A[ (col + jj) * lda + (row + ii) ] = *valptr;
+                                A[ (row + ii) * lda + (col + jj) ] = conj(*valptr);
+                            }
                         }
                     }
                 }
@@ -268,8 +274,14 @@ z_spmCSR2dense( const pastix_spm_t *spm )
                     {
                         for(ii=0; ii<dofi; ii++, valptr++)
                         {
-                            A[ (col + jj) * lda + (row + ii) ] = *valptr;
-                            A[ (row + ii) * lda + (col + jj) ] = conj(*valptr);
+                            if( col+jj == row+ii ) {
+                                /* Make sure the matrix is hermitian */
+                                A[ (col + jj) * lda + (row + ii) ] = creal(*valptr) + I * 0.;
+                            }
+                            else {
+                                A[ (col + jj) * lda + (row + ii) ] = *valptr;
+                                A[ (row + ii) * lda + (col + jj) ] = conj(*valptr);
+                            }
                         }
                     }
                 }
diff --git a/z_spm_convert_to_csc.c b/z_spm_convert_to_csc.c
index bd76019c..ed0db67d 100644
--- a/z_spm_convert_to_csc.c
+++ b/z_spm_convert_to_csc.c
@@ -161,7 +161,9 @@ z_spmConvertCSR2CSC( pastix_spm_t *spm )
         pastix_int_t i;
 
         for(i=0; i<spm->nnz; i++, valptr++){
-            *valptr = conj( *valptr );
+            if (spm->rowptr[i] != spm->colptr[i]) {
+                *valptr = conj( *valptr );
+            }
         }
     }
 #endif
diff --git a/z_spm_convert_to_csr.c b/z_spm_convert_to_csr.c
index c1d0d458..026df262 100644
--- a/z_spm_convert_to_csr.c
+++ b/z_spm_convert_to_csr.c
@@ -53,7 +53,9 @@ z_spmConvertCSC2CSR( pastix_spm_t *spm )
         pastix_int_t i;
 
         for(i=0; i<spm->nnz; i++, valptr++){
-            *valptr = conj( *valptr );
+            if (spm->rowptr[i] != spm->colptr[i]) {
+                *valptr = conj( *valptr );
+            }
         }
     }
 #endif
-- 
GitLab