中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
鲲鹏小智

示例

/*******************************************************************************
    KML_EigenSolver example codes for solving eigenvalues problem AX = BXD 
*******************************************************************************/

#include "kes.h"

void MyMatVec4A(void *kesA, void *kesX, void *kesAX, int nRows, int nCols, int ld)
{
    // user-defined mat-vec routine for matrix A ......
}

void MyMatVec4B(void *kesB, void *kesX, void *kesBX, int nRows, int nCols, int ld)
{
    // user-defined mat-vec routine for matrix B ......
}

void MyMatVec4P(void *kesP, void *kesX, void *kesPX, int nRows, int nCols, int ld)
{
    // user-defined mat-vec routine for preconditioner P ......
}

int main (int argc, char **argv) {
    MPI_Init(&argc, &argv);
    int rank, size;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

/*
    set parameters
*/
    int nRows = 1000, nCols = 100;
    MPI_Comm rowComm = MPI_COMM_WORLD;
    MPI_Comm colComm = MPI_COMM_SELF;

/*
    create matrix, vector, and solver
*/
    KesMatrix A, P, B;
    KesVector X, D;
    KesSolver solver;

    KesScalarType scalarType = KES_SCALAR_FP64;
    KesSolverAlgorithm solverAlgorithm = KES_LOBPCG;
    KesMatrixFormat matrixFormat = KES_SHELL;
    KesVectorFormat vectorFormat = KES_DENSE;

    KesMatrixCreate(&A, scalarType, matrixFormat);
    KesMatrixCreate(&B, scalarType, matrixFormat);
    KesMatrixCreate(&P, scalarType, matrixFormat);
    KesVectorCreate(&X, scalarType, vectorFormat);
    KesVectorCreate(&D, scalarType, vectorFormat);
    KesSolverCreate(&solver, scalarType, solverAlgorithm);

    KesMatrixSetDim(A, nRows * size, nRows * size);
    KesMatrixSetDim(B, nRows * size, nRows * size);

    KesVectorSetDim(X, nRows, nCols);
    KesVectorSetComm(X, KES_ROW, rowComm);
    KesVectorSetComm(X, KES_COL, colComm);

    KesVectorSetDim(D, nCols, 1);
    KesVectorSetComm(D, KES_ROW, rowComm);
    KesVectorSetComm(D, KES_COL, colComm);

    double *X_vals = new double[nRows * nCols];
    double *D_vals = new double[nCols];
    KesVectorDenseSetValues(X, X_vals, nRows);
    KesVectorDenseSetValues(D, D_vals, nCols);

    double *A_vals = new double[nRows * nRows];
    double *B_vals = new double[nRows * nRows];
    double *P_vals = new double[nRows];
    KesMatrixSetShellMatVec(A, A_vals, MyMatVec4A);
    KesMatrixSetShellMatVec(B, B_vals, MyMatVec4B);
    KesMatrixSetShellMatVec(P, P_vals, MyMatVec4P);

/*
    set solver-related parameters
*/
    int maxIter = 100000;
    int maxOrthoIter = 2;
    double threshold = 1e-6;
    KesProblemType problemType = KES_STANDARD;
    KesDenseEigenSolverType denseEigenSolverType = KES_SCALAPACK;
    KesOrthoProjectorType orthoProjectorType = KES_GRAM_SCHMIDT;
    KesOrthogonalizerType orthogonalizerType = KES_CHOLESKY_QR;
    KesConvergeDetectorType convergeDetectorType = KES_RESIDUALS;

    KesSolverSetThreshold(solver, threshold);
    KesSolverSetMaxIter(solver, maxIter);
    KesSolverSetMaxOrthoIter(solver, maxOrthoIter);
    KesSolverSetProblemType(solver, problemType);
    KesSetDenseEigenSolverType(solver, denseEigenSolverType);
    KesSetConvergeDetectorType(solver, convergeDetectorType);
    KesSetOrthogonalizerType(solver, orthogonalizerType);
    KesSetOrthoProjectorType(solver, orthoProjectorType);

/*
    run the solver
*/
    KesRunSolver(solver, A, B, P, X, D);

/*
    get solver information
*/
    int nIter;
    int nConv;
    KesGetSolverConv(solver, &nConv);
    KesGetSolverIter(solver, &nIter);
    if (rank == 0) {
        printf(" Number of iteration steps = %d\n", nIter);
        printf(" Number of converged eigenvalues = %d\n", nConv);
    }

/*
    compute residuals
*/
    KesVector R;
    KesVectorReplicate(X, &R, true, true);
    KesVector normR;
    KesVectorReplicate(D, &normR, true, true);
    KesEigResidual(A, B, X, D, R);
    KesVectorNorm(R, normR);

/*
    clean up
*/
    delete[] A_vals;
    delete[] B_vals;
    delete[] P_vals;
    delete[] X_vals;
    delete[] D_vals;

/*
    clean up internal object
*/
    KesMatrixDestroy(A);
    KesMatrixDestroy(B);
    KesMatrixDestroy(P);
    KesVectorDestroy(X);
    KesVectorDestroy(D);
    KesVectorDestroy(R);
    KesVectorDestroy(normR);
    KesSolverDestroy(solver);

    MPI_Finalize();
    return 0;
}
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词