Example demonstrating how to define a distributed sparse matrix out of a matrix allocated by the user in IJV format without requiring to call the expensive spmCheckAndCorrect function, and then solve a linear system with it.
/
#include <mpi.h>
#include <spm.h>
#include <string.h>
double dparm[DPARM_SIZE];
MPI_Init( &argc, &argv );
MPI_Comm_size( MPI_COMM_WORLD, &nmpi );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
if ( (nmpi < 1) || (nmpi > 2) ) {
fprintf(stderr, "This example is designed to run with 1 or 2 MPI processes.\n");
return -1;
}
spm->flttype = SpmDouble;
spm->fmttype = SpmIJV;
spm->baseval = 0;
spm->dof = 1;
if ( nmpi > 1 ) {
rowptr[ 0] = 0; colptr[ 0] = 0; values[ 0] = 2.0;
rowptr[ 1] = 0; colptr[ 1] = 1; values[ 1] = 3.0;
rowptr[ 2] = 0; colptr[ 2] = 2; values[ 2] = 0.0;
rowptr[ 3] = 1; colptr[ 3] = 0; values[ 3] = 0.0;
rowptr[ 4] = 1; colptr[ 4] = 1; values[ 4] = 4.0;
rowptr[ 5] = 1; colptr[ 5] = 2; values[ 5] = 5.0;
rowptr[ 6] = 2; colptr[ 6] = 0; values[ 6] = 1.0;
rowptr[ 7] = 2; colptr[ 7] = 1; values[ 7] = 0.0;
rowptr[ 8] = 2; colptr[ 8] = 2; values[ 8] = 6.0;
rowptr[ 9] = 2; colptr[ 9] = 3; values[ 9] = 7.0;
rowptr[10] = 3; colptr[10] = 2; values[10] = 8.0;
rowptr[11] = 3; colptr[11] = 3; values[11] = 9.0;
}
else if ( nmpi == 2 ) {
loc2glob[1] = 1;
rowptr = (spm_int_t *)malloc(sizeof(spm_int_t) * (spm->nnz));
colptr = (spm_int_t *)malloc(sizeof(spm_int_t) * (spm->nnz));
values = (double *) malloc(sizeof(double) * (spm->nnz));
rowptr[0] = 0; colptr[0] = 0; values[0] = 2.0;
rowptr[1] = 1; colptr[1] = 0; values[1] = 0.0;
rowptr[2] = 2; colptr[2] = 0; values[2] = 1.0;
rowptr[3] = 0; colptr[3] = 1; values[3] = 3.0;
rowptr[4] = 1; colptr[4] = 1; values[4] = 4.0;
rowptr[5] = 2; colptr[5] = 1; values[5] = 0.0;
}
else {
loc2glob[1] = 3;
rowptr = (spm_int_t *)malloc(sizeof(spm_int_t) * (spm->nnz));
colptr = (spm_int_t *)malloc(sizeof(spm_int_t) * (spm->nnz));
values = (double *) malloc(sizeof(double) * (spm->nnz));
rowptr[0] = 0; colptr[0] = 2; values[0] = 0.0;
rowptr[1] = 1; colptr[1] = 2; values[1] = 5.0;
rowptr[2] = 2; colptr[2] = 2; values[2] = 6.0;
rowptr[3] = 3; colptr[3] = 2; values[3] = 8.0;
rowptr[4] = 2; colptr[4] = 3; values[4] = 7.0;
rowptr[5] = 3; colptr[5] = 3; values[5] = 9.0;
}
}
spm->rowptr = rowptr;
spm->colptr = colptr;
spm->values = values;
spm->loc2glob = loc2glob;
spmPrintInfo( spm, stdout );
spmPrint( spm, NULL );
b[0] = 5.0;
b[1] = 9.0;
b[2] = 14.0;
b[3] = 17.0;
}
else {
if ( rank == 0 ) {
b[0] = 5.0;
b[1] = 9.0;
} else {
b[0] = 14.0;
b[1] = 17.0;
}
}
spmExit( spm );
free( spm );
free( x );
free( b );
MPI_Finalize();
(void)argc;
(void)argv;
return rc;
}
BEGIN_C_DECLS typedef int pastix_int_t
void pastixFinalize(pastix_data_t **pastix_data)
Finalize the solver instance.