我要评分
获取效率
正确性
完整性
易理解

KmlScaissCgInitStripes?I

Initialize the data structure and associate a provided coefficient matrix with the solution system. The complete matrix in CSR format is used when the CG method for clusters is initialized.

Interface Definition

C interface:

int KmlScaissCgInitStripesSI(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 KmlScaissCgInitStripesDI(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 band matrices stored in the related MPI process. Currently, the value can only be 1.

Input

stripeWidth

int

Array containing the number of rows in a band matrix, with a length of nstripes stripeWidth[i] indicates the number of rows in the i-th band matrix. The lifecycle of this array is the same as that of handle.

Input

stripeRow

int

Array containing the global coordinates of specific row numbers in a band matrix, with a length of nstripes. stripeRow[i] indicates the row number in the global matrix that corresponds to the first row of the i-th band matrix. The lifecycle of this array is the same as that of handle.

Input

a

  • float * in KmlScaissCgInitStripesSI
  • double * in KmlScaissCgInitStripesDI

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

(n+1)-dimensional array. ia[i] is the index of the first non-zero element in the i-th row in all non-zero elements. The lifecycle of this array is the same as that of handle.

Input

comm

MPI_Comm

Communicator of the MPI process.

Input

Return Values

Return Value

Type

Description

KMLSS_NO_ERROR

int

The execution is successful.

KMLSS_NULL_ARGUMENT

int

A null argument exists in {handle, stripeWidth, stripeRow, a, ja, ia}.

KMLSS_BAD_N

int

The value of parameter n is not an integer.

KMLSS_NOT_IMPLEMENTED

int

The value of nstripes is not 1.

KMLSS_NO_MEMORY

int

The memory is insufficient.

Dependency

#include "kml_scaiss.h"

Example

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 ID.

int n = 8 / size;
int n_beg = n * rank;
if (n * size != 8 && rank == (size - 1)) {
    n = 8 - 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, 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 < 9; 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 = KmlScaissCgInitStripesDI(&handle, 8, 1, &n, &n_beg, &a_holder, &ja_holder, &ia_holder, MPI_COMM_WORLD);
if (error != 0) {
    printf("\nERROR in KmlScaissCgInitStripesDI: %d", error);
    return 1;
    }