Rate This Document
Findability
Accuracy
Completeness
Readability

KmlScaissBicgstabSolveDx?I

Solve a system of linear algebra equations. Each process reads and stores its corresponding solution result.

Interface Definition

C interfaces:

int KmlScaissBicgstabSolveDxSI(KmlScasolverTask **handle, int nb, float *x, int ldx, const float *b, int ldb);

int KmlScaissBicgstabSolveDxDI(KmlScasolverTask **handle, int nb, double *x, int ldx, const double *b, int ldb);

Parameters

Parameter

Type

Description

Input/Output

handle

KmlScasolverTask **

Solver handle, which is a variable passed from a previous step.

Input/Output

nb

int

Number of RHS vectors. The value of nb can only be 1.

Input

x

  • float * in KmlScaissBicgstabSolveDxSI
  • double * in KmlScaissBicgstabSolveDxDI

Array that reads and stores the solution result corresponding to the current process. The number of elements is the number of rows in the matrix corresponding to the current process, that is, stripeWidth.

Input/Output

ldx

int

Size of the leading dimension of x. This is a reserved parameter.

Input

b

  • const float * in KmlScaissBicgstabSolveDxSI
  • const double * in KmlScaissBicgstabSolveDxDI

Local RHS array corresponding to the current process. The number of elements is the number of rows in the matrix corresponding to the current process, that is, stripeWidth.

Input

ldb

int

Size of the leading dimension of b. This is a reserved parameter.

Input

Return Value

Return Value

Type

Description

KMLSS_NO_ERROR

int

The execution is successful.

KMLSS_BAD_NB

int

The value of nb is not 1.

KMLSS_NO_MEMORY

int

The memory is insufficient.

KMLSS_NULL_ARGUMENT

int

A null parameter exists in {handle, x, b}.

Dependencies

#include "kml_scaiss.h"

Examples

C interface:
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);

double eps = 1e-4;
error = KmlScaissBicgstabSetDID(&handle, KMLSS_THRESHOLD, &eps, 1); 
if (error != 0) {
    printf("\nERROR in KmlScaissBicgstabSetDID with KMLSS_THRESHOLD: %d", error);
    return 1;
}
int max_iters = 2000;
error = KmlScaissBicgstabSetDII(&handle, KMLSS_MAX_ITERATION_COUNT, &max_iters, 1);
if (error != 0) {
    printf("\nERROR in KmlScaissBicgstabSetDII with KMLSS_MAX_ITERATION_COUNT: %d", error);
    return 1;
}
int precond = KMLSS_BJACOBI;
error = KmlScaissBicgstabSetDII(&handle, KMLSS_PRECONDITIONER_TYPE, &precond, 1);
if (error != 0) {
    printf("\nERROR in KmlScaissBicgstabSetDII with KMLSS_PRECONDITIONER_TYPE: %d", error);
    return 1;
}
int num_blocks = 1;
error = KmlScaissBicgstabPcSetDII(&handle, KMLSS_NUM_BLOCKS, &num_blocks, 1);
if (error != 0) {
    printf("ERROR in KmlScaissBicgstabPcSetDII: %d\n", error);
    return 1;
}
int subprecond = KMLSS_ILU;
error = KmlScaissBicgstabPcSetDII(&handle, KMLSS_BLOCK_METHOD, &subprecond, 1);
if (error != 0) {
    printf("ERROR in KmlScaissBicgstabPcSetDII: %d\n", error);
    return 1;
}
error = KmlScaissBicgstabAnalyzeDI(&handle);
if (error != 0) {
    printf("ERROR in KmlScaissBicgstabAnalyzeDI: %d\n", error);
    return 1;
}
error = KmlScaissBicgstabFactorizeDI(&handle);
if (error != 0) {
    printf("ERROR in KmlScaissBicgstabFactorizeDI: %d\n", error);
    return 1;
}

int nrhs = 1;
int ldx = n, ldb = n;
double b[8] = { 4.0, 9.0, 7.0, 6.0, 9.0, 3.0, 2.0, 5.0 };
double x[8] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
error = KmlScaissBicgstabSolveDxDI(&handle, nrhs, &x[n_beg], ldx, &b[n_beg], ldb);
if (error != 0) {
    printf("ERROR in KmlScaissBicgstabSolveDxDI: %d\n", error);
    return 1;
}