Example demonstrating how to define a distributed sparse symmetric matrix from a matrix allocated by the user in CSR format and 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 = SpmCSR;
spm->baseval = 0;
spm->dof = 1;
if ( nmpi > 1 ) {
colptr[1] = 0; values[1] = 1.0;
colptr[2] = 1; values[2] = 3.0;
colptr[3] = 1; values[3] = 1.0;
colptr[4] = 2; values[4] = 4.0;
colptr[5] = 0; values[5] = 1.0;
colptr[6] = 2; values[6] = 1.0;
colptr[7] = 3; values[7] = 2.0;
}
else if ( nmpi == 2 ) {
loc2glob[1] = 1;
colptr = (spm_int_t *)malloc(sizeof(spm_int_t) * (spm->nnz));
rowptr = (spm_int_t *)malloc(sizeof(spm_int_t) * (spm->n + 1));
values = (double *) malloc(sizeof(double) * (spm->nnz));
colptr[1] = 0; values[1] = 1.0;
colptr[2] = 1; values[2] = 3.0;
}
else {
loc2glob[1] = 3;
rowptr = (spm_int_t *)malloc(sizeof(spm_int_t) * (spm->n + 1));
colptr = (spm_int_t *)malloc(sizeof(spm_int_t) * (spm->nnz));
values = (double *) malloc(sizeof(double) * (spm->nnz));
colptr[1] = 2; values[1] = 4.0;
colptr[2] = 0; values[2] = 1.0;
colptr[3] = 2; values[3] = 1.0;
colptr[4] = 3; values[4] = 2.0;
}
}
spm->rowptr = rowptr;
spm->colptr = colptr;
spm->values = values;
spm->loc2glob = loc2glob;
spmPrintInfo( spm, stdout );
spmPrint( spm, NULL );
b[0] = 4.0;
b[1] = 5.0;
b[2] = 6.0;
b[3] = 4.0;
}
else {
if ( rank == 0 ) {
b[0] = 4.0;
b[1] = 5.0;
} else {
b[0] = 6.0;
b[1] = 4.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.