Example demonstrating how to perform analysis on a common pattern matrix of multiple problems, and then solve multiple numerical problems re-using the same analysis.
/
#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 = SpmCSC;
spm->baseval = 0;
spm->dof = 1;
if ( nmpi > 1 ) {
colptr[0] = 0;
colptr[1] = 3;
colptr[2] = 6;
colptr[3] = 10;
colptr[4] = 12;
rowptr[ 0] = 0; values[ 0] = 2.0;
rowptr[ 1] = 1; values[ 1] = 0.0;
rowptr[ 2] = 2; values[ 2] = 1.0;
rowptr[ 3] = 0; values[ 3] = 3.0;
rowptr[ 4] = 1; values[ 4] = 4.0;
rowptr[ 5] = 2; values[ 5] = 0.0;
rowptr[ 6] = 0; values[ 6] = 0.0;
rowptr[ 7] = 1; values[ 7] = 5.0;
rowptr[ 8] = 2; values[ 8] = 6.0;
rowptr[ 9] = 3; values[ 9] = 8.0;
rowptr[10] = 2; values[10] = 7.0;
rowptr[11] = 3; values[11] = 9.0;
}
else if ( nmpi == 2 ) {
loc2glob[1] = 1;
colptr = (spm_int_t *)malloc(sizeof(spm_int_t) * (spm->n+1));
rowptr = (spm_int_t *)malloc(sizeof(spm_int_t) * (spm->nnz));
values = (double *)malloc(sizeof(double) * (spm->nnz));
colptr[0] = 0;
colptr[1] = 3;
colptr[2] = 6;
rowptr[0] = 0; values[0] = 2.0;
rowptr[1] = 1; values[1] = 0.0;
rowptr[2] = 2; values[2] = 1.0;
rowptr[3] = 0; values[3] = 3.0;
rowptr[4] = 1; values[4] = 4.0;
rowptr[5] = 2; values[5] = 0.0;
}
else {
loc2glob[1] = 3;
colptr = (spm_int_t *)malloc(sizeof(spm_int_t) * (spm->n+1));
rowptr = (spm_int_t *)malloc(sizeof(spm_int_t) * (spm->nnz));
values = (double *)malloc(sizeof(double) * (spm->nnz));
colptr[0] = 0;
colptr[1] = 4;
colptr[2] = 6;
rowptr[0] = 0; values[0] = 0.0;
rowptr[1] = 1; values[1] = 5.0;
rowptr[2] = 2; values[2] = 6.0;
rowptr[3] = 3; values[3] = 8.0;
rowptr[4] = 2; values[4] = 7.0;
rowptr[5] = 3; values[5] = 9.0;
}
}
spm->rowptr = rowptr;
spm->colptr = colptr;
spm->values = values;
spm->loc2glob = loc2glob;
spmPrintInfo( spm, stdout );
if (rank == 0) {
fprintf(stdout,
"+-------------------------------------------------+\n"
"+ Solve the first problem +\n"
"+-------------------------------------------------+\n");
}
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;
}
}
values[ 0] = 2.0;
values[ 1] = 1.0;
values[ 2] = 1.0;
values[ 3] = 0.0;
values[ 4] = 4.0;
values[ 5] = 2.0;
values[ 6] = 4.0;
values[ 7] = 0.0;
values[ 8] = 6.0;
values[ 9] = 8.0;
values[10] = 7.0;
values[11] = 9.0;
b[0] = 6.0;
b[1] = 5.0;
b[2] = 16.0;
b[3] = 17.0;
}
else if (nmpi == 2) {
if (rank == 0) {
values[0] = 2.0;
values[1] = 1.0;
values[2] = 1.0;
values[3] = 0.0;
values[4] = 4.0;
values[5] = 2.0;
b[0] = 6.0;
b[1] = 5.0;
}
else {
values[0] = 4.0;
values[1] = 0.0;
values[2] = 6.0;
values[3] = 8.0;
values[4] = 7.0;
values[5] = 9.0;
b[0] = 16.0;
b[1] = 17.0;
}
}
spmPrint(spm, NULL);
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.