KmlScaissBicgstabInitStripes?I
Initialize the data structure and associate a user-provided coefficient matrix with the solver system. Each process uses the local matrix in CSR format when the BICGSTAB method for multi-process environments is initialized.
Interface Definition
C interfaces:
int KmlScaissBicgstabInitStripesSI(KmlScasolverTask **handle, int n, int nstripes, const int *stripeWidth,const int *stripeRow, const float * const *a, const int * const *ja, const int * const *ia, MPI_Comm comm);
int KmlScaissBicgstabInitStripesDI(KmlScasolverTask **handle, int n, int nstripes, const int *stripeWidth, const int *stripeRow, const double * const *a, const int * const *ja, const int * const *ia, MPI_Comm comm);
Parameters
Parameter |
Type |
Description |
Input/Output |
|---|---|---|---|
handle |
KmlScasolverTask ** |
Solver handle. handle cannot be a null pointer. |
Input/Output |
n |
int |
Dimension of matrix A. |
Input |
nstripes |
int |
Number of matrices stored in the current MPI process. Currently, the value can only be 1. |
Input |
stripeWidth |
int * |
Number of rows in the matrix in the current MPI process. The lifecycle of this variable is the same as that of handle. |
Input |
stripeRow |
int * |
Global row index of the matrix in the current MPI process, that is, the number of rows corresponding to the first row in the global matrix. The lifecycle of this array is the same as that of handle. |
Input |
a |
|
Array whose dimension is the quantity of non-zero elements. a[i] is the value of the i-th non-zero element. The lifecycle of this array is the same as that of handle. |
Input |
ja |
int * |
Array whose dimension is the quantity of non-zero elements. ja[i] is the column number of the i-th non-zero element. The lifecycle of this array is the same as that of handle. |
Input |
ia |
int * |
(stripeWidth+1)-dimensional array. ia[i] is the index of the first non-zero element in the i-th row in all non-zero elements. ia[0]=0. The lifecycle of this array is the same as that of handle. |
Input |
comm |
MPI_Comm |
Communicator of the MPI process. |
Input |
Return Value
Return Value |
Type |
Description |
|---|---|---|
KMLSS_NO_ERROR |
int |
The execution is successful. |
KMLSS_NULL_ARGUMENT |
int |
A null parameter exists in {handle, stripeWidth, stripeRow, a, ja, ia}. |
KMLSS_BAD_N |
int |
The value of parameter n is not a positive integer. |
KMLSS_NOT_IMPLEMENTED |
int |
The value of nstripes is not 1. |
KMLSS_NO_MEMORY |
int |
The memory is insufficient. |
Dependencies
#include "kml_scaiss.h"
Examples
MPI_Init(NULL, NULL);
int size, rank;
MPI_Comm_size(MPI_COMM_WORLD, &size);// Obtain the total number of processes.
MPI_Comm_rank(MPI_COMM_WORLD, &rank);// Obtain the current process rank.
int mat_size = 8;
int n = mat_size / size;
int n_beg = n * rank;
if (n * size != mat_size && rank == (size - 1)) {
n = mat_size - n * rank;
}
int ja[26] = { 0, 3, 4, 1, 2, 3, 5, 1, 2, 7, 0, 1, 3, 6, 0, 4, 5, 1, 4, 5, 7, 3, 6, 2, 5, 7 };
double a[26] = { 1.0, 1.0, 2.0, 9.0, 2.0, 1.0, -3.0, 2.0, 3.0, 2.0, 1.0, 1.0, 9.0, -5.0, 2.0, 6.0, 1.0, -3.0, 1.0, 4.0, 1.0, -5.0, 7.0, 2.0, 1.0, 2.0 };
int ia[9] = { 0, 3, 7, 10, 14, 17, 21, 23, 26 };
int a_beg = ia[n_beg];
for (int i = n_beg; i < (n_beg + n + 1); i++) {
ia[i] -= a_beg;
}
/* Internal KML_SCAISS structure */
KmlScasolverTask *handle;
/* KML_SCAISS control parameters */
int error; /* Output error handle */
/* Create data structures */
const double *a_holder = &a[a_beg];
const int *ja_holder = &ja[a_beg];
const int *ia_holder = &ia[n_beg];
error = KmlScaissBicgstabInitStripesDI(&handle, mat_size, 1, &n, &n_beg, &a_holder, &ja_holder, &ia_holder, MPI_COMM_WORLD);