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