您的位置:首页 > 其它

HYPRE并行库进行稀疏线性方程组求解

2014-07-02 22:28 1026 查看
将矩阵处理成IJ接口形式

HYPRE_IJMatrixCreate(MPI_COMM_WORLD, ilower, iupper, ilower, iupper, &A);

HYPRE_IJMatrixSetObjectType(A, HYPRE_PARCSR);

//设置值之前先初始化

HYPRE_IJMatrixInitialize(A);

for (i = ilower; i <= iupper; i++)

HYPRE_IJMatrixSetValues(A, 1, &nnz, &i, cols, values);

HYPRE_IJMatrixAssemble(A);

//对parcsr_A使用

HYPRE_IJMatrixGetObject(A, (void**) &parcsr_A);

无预处理求解

//建立求解器

HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, &solver);

//设置参数

HYPRE_PCGSetMaxIter(solver, 1000); /* max iterations */

HYPRE_PCGSetTol(solver, 1e-7); /* conv. tolerance */

HYPRE_PCGSetTwoNorm(solver, 1); /* use the two norm as the stopping criteria */

HYPRE_PCGSetPrintLevel(solver, 2); /* prints out the iteration info */

HYPRE_PCGSetLogging(solver, 1); /* needed to get run info later */

/* Now setup and solve! */

HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, par_x);

HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, par_x);

//一些统计数据

HYPRE_PCGGetNumIterations(solver, &num_iterations);

HYPRE_PCGGetFinalRelativeResidualNorm(solver, &final_res_norm);

/* Destroy solver */

HYPRE_ParCSRPCGDestroy(solver);

有预处理求解

/* Create solver */

HYPRE_ParCSRPCGCreate(MPI_COMM_WORLD, &solver);

/* Set some parameters (See Reference Manual for more parameters) */

HYPRE_PCGSetMaxIter(solver, 1000); /* max iterations */

HYPRE_PCGSetTol(solver, 1e-7); /* conv. tolerance */

HYPRE_PCGSetTwoNorm(solver, 1); /* use the two norm as the stopping criteria */

HYPRE_PCGSetPrintLevel(solver, 2); /* print solve info */

HYPRE_PCGSetLogging(solver, 1); /* needed to get run info later */

/* Now set up the ParaSails preconditioner and specify any parameters */

HYPRE_ParaSailsCreate(MPI_COMM_WORLD, &precond);

/* Set some parameters (See Reference Manual for more parameters) */

HYPRE_ParaSailsSetParams(precond, sai_threshold, sai_max_levels);

HYPRE_ParaSailsSetFilter(precond, sai_filter);

HYPRE_ParaSailsSetSym(precond, sai_sym);

HYPRE_ParaSailsSetLogging(precond, 3);

/* Set the PCG preconditioner */

HYPRE_PCGSetPrecond(solver, (HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSolve,

(HYPRE_PtrToSolverFcn) HYPRE_ParaSailsSetup, precond);

/* Now setup and solve! */

HYPRE_ParCSRPCGSetup(solver, parcsr_A, par_b, par_x);

HYPRE_ParCSRPCGSolve(solver, parcsr_A, par_b, par_x);

/* Run info - needed logging turned on */

HYPRE_PCGGetNumIterations(solver, &num_iterations);

HYPRE_PCGGetFinalRelativeResidualNorm(solver, &final_res_norm);

/* Destory solver and preconditioner */

HYPRE_ParCSRPCGDestroy(solver);

HYPRE_ParaSailsDestroy(precond);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: