62 spm_dconj_fct_t conjfct,
69 for(jj=0; jj<dofi; jj++)
72 for(ii=0; ii<jj; ii++) {
77 A[ lda * (row + jj) + (row + ii) ] = *valptr;
80 for(ii=jj+1; ii<dofi; ii++, valptr++)
83 A[ lda * (row + jj) + (row + ii) ] = *valptr;
85 A[ lda * (row + ii) + (row + jj) ] = conjfct(*valptr);
132 const spm_dconj_fct_t conjfct,
133 const double *valptr,
139 for(jj=0; jj<dofj; jj++)
141 for(ii=0; ii<dofi; ii++, valptr++)
143 A[ lda * (col + jj) + (row + ii) ] = conjfct(*valptr);
189 const spm_dconj_fct_t conjfct,
190 const double *valptr,
196 for(ii=0; ii<dofi; ii++)
198 for(jj=0; jj<dofj; jj++, valptr++)
200 A[ lda * (col + jj) + (row + ii) ] = conjfct(*valptr);
251 const spm_dconj_fct_t conjfct,
252 const double *valptr,
311 const spm_dconj_fct_t conjfct,
312 const double *valptr,
381 const double *valptr,
389 spm_dconj_fct_t conjfct;
391#if defined(PRECISION_c) || defined(PRECISION_z)
393 conjfct = __spm_dconj;
402 assert( dofi == dofj );
443 const double *valptr;
449 memset( A, 0, lda * lda *
sizeof(
double));
455 valptr = (
double*)(spm->
values);
459 for(j=0; j<spm->
n; j++, colptr++, loc2glob++)
461 jg = spm->
replicated ? j : (*loc2glob) - baseval;
462 if ( spm->
dof > 0 ) {
467 dofj = dofs[jg+1] - dofs[jg];
468 col = dofs[jg] - baseval;
471 for(k=colptr[0]; k<colptr[1]; k++, rowptr++)
473 ig = (*rowptr - baseval);
474 if ( spm->
dof > 0 ) {
479 dofi = dofs[ig+1] - dofs[ig];
480 row = dofs[ig] - baseval;
484 row, dofi, col, dofj, valptr,
486 valptr += dofi * dofj;
525 const double *valptr;
531 memset( A, 0, lda * lda *
sizeof(
double));
537 valptr = (
double*)(spm->
values);
541 for(i=0; i<spm->
n; i++, rowptr++, loc2glob++)
543 ig = spm->
replicated ? i : (*loc2glob) - baseval;
544 if ( spm->
dof > 0 ) {
549 dofi = dofs[ig+1] - dofs[ig];
550 row = dofs[ig] - baseval;
553 for(k=rowptr[0]; k<rowptr[1]; k++, colptr++)
555 jg = (*colptr - baseval);
556 if ( spm->
dof > 0 ) {
561 dofj = dofs[jg+1] - dofs[jg];
562 col = dofs[jg] - baseval;
566 row, dofi, col, dofj, valptr,
568 valptr += dofi * dofj;
606 const double *valptr;
612 memset( A, 0, lda * lda *
sizeof(
double));
618 valptr = (
double*)(spm->
values);
621 for(k=0; k<spm->
nnz; k++, rowptr++, colptr++)
623 i = *rowptr - baseval;
624 j = *colptr - baseval;
626 if ( spm->
dof > 0 ) {
633 dofi = dofs[i+1] - dofs[i];
634 row = dofs[i] - baseval;
635 dofj = dofs[j+1] - dofs[j];
636 col = dofs[j] - baseval;
640 row, dofi, col, dofj, valptr,
642 valptr += dofi * dofj;
676 fprintf( stderr,
"spm2dense: Conversion to dense matrix with distributed spm is not available\n");
733 if ( fabs( A[ j * lda + i ] ) != 0. ) {
enum spm_layout_e spm_layout_t
Direction of the matrix storage.
enum spm_mtxtype_e spm_mtxtype_t
Matrix symmetry type property.
static void d_spm_2dense_elt_sym_diag(spm_int_t row, spm_int_t dofi, spm_dconj_fct_t conjfct, const double *valptr, double *A, spm_int_t lda)
Convert to dense a diagonal element within a symmetric/symmetric matrix with column/row major storage...
static void d_spmCSR2dense(const spmatrix_t *spm, double *A)
Convert a CSR matrix into a dense matrix.
static void d_spm_2dense_elt(const spm_mtxtype_t mtxtype, const spm_layout_t layout, const spm_int_t row, const spm_int_t dofi, const spm_int_t col, const spm_int_t dofj, const double *valptr, double *A, const spm_int_t lda)
Convert to dense an element matrix.
static void d_spm_2dense_elt_gen(const spm_layout_t layout, const spm_int_t row, const spm_int_t dofi, const spm_int_t col, const spm_int_t dofj, const spm_dconj_fct_t conjfct, const double *valptr, double *A, const spm_int_t lda)
Convert to dense a general element matrix.
static void d_spm_2dense_elt_sym_offd(const spm_layout_t layout, const spm_int_t row, const spm_int_t dofi, const spm_int_t col, const spm_int_t dofj, const spm_dconj_fct_t conjfct, const double *valptr, double *A, const spm_int_t lda)
Convert to dense an off-diagonal element matrix in the symmetric/symmetric case.
static void d_spm_2dense_elt_gen_row(const spm_int_t row, const spm_int_t dofi, const spm_int_t col, const spm_int_t dofj, const spm_dconj_fct_t conjfct, const double *valptr, double *A, const spm_int_t lda)
Convert to dense a general element matrix with row major storage.
static void d_spmIJV2dense(const spmatrix_t *spm, double *A)
Convert a IJV matrix into a dense matrix.
static void d_spm_2dense_elt_gen_col(const spm_int_t row, const spm_int_t dofi, const spm_int_t col, const spm_int_t dofj, const spm_dconj_fct_t conjfct, const double *valptr, double *A, const spm_int_t lda)
Convert to dense a general element matrix with column major storage.
void d_spm2dense(const spmatrix_t *spm, double *A)
Convert a sparse matrix into a dense matrix.
static void d_spmCSC2dense(const spmatrix_t *spm, double *A)
Convert a CSC matrix into a dense matrix.
void d_spmDensePrint(FILE *f, spm_int_t m, spm_int_t n, const double *A, spm_int_t lda)
Print a dense matrix to the given file.
int spm_int_t
The main integer datatype used in spm arrays.
The sparse matrix data structure.
static void d_spmPrintElt(FILE *f, spm_int_t i, spm_int_t j, double A)
Subroutines to print one element of an spm structure.