在 PETSC 中使用 BiCGStab 而不是 GMRES 求解线性系统

计算科学 线性代数 宠物
2021-11-28 01:07:01

下面显示了一段代码来解决线性系统。

ierr = KSPCreate(PETSC_COMM_WORLD,&ksp); CHKERRQ(ierr);
ierr = KSPSetOperators(ksp,A,A,DIFFERENT_NONZERO_PATTERN); CHKERRQ(ierr);
KSPSetType(ksp,KSPBCGS);
ierr = KSPSetTolerances(ksp,1.e-2/((m+1)*(n+1)),1.e-50,PETSC_DEFAULT, PETSC_DEFAULT); CHKERRQ(ierr);
ierr = KSPSetFromOptions(ksp);CHKERRQ(ierr);
ierr = PCSetType(pc,PCSOR);CHKERRQ(ierr);
ierr = KSPSolve(ksp,b,x);CHKERRQ(ierr);

根据 PETSC 手册,PETSC 使用带有 ILU(0) 预处理器的 GMRES 来求解 SLE。我想修改代码以使用带有 SSOR 预处理器的 BiCGStab 方法来解决系统问题。

有人可以帮忙吗?

2个回答

您可以通过以下方式从代码中执行此操作:

KSP  my_solver ;  // define the KSP method
PC   my_prec   ;  // define the preconditioner 

/* Define the matrices to be used ... */ 

KSPCreate(comm,&my_solver);
KSPSetType(my_solver,KSPBCGS);  // Sets BiCGStab as the krylov method

KSPGetPC(my_solver,&my_prec);
PCSetType(my_prec,PCSOR);     // Sets SSOR as the preconditioner method

/* then continue with the SetType and Solve and other stuff ... */

或者像之前一样初始化 KSP 方法和 Preconditioner,然后使用命令行添加:

KSPSetFromOptions(my_solver);
KSPSetUp(my_solver);

第二种方式当然更灵活,因为无论代码定义什么,您都可以指定您的 KSP 方法和 PC。检查此链接以了解有关如何从数据库设置值的更多信息

http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/KSP/KSPSetFromOptions.html#KSPSetFromOptions

PETSc 团队始终建议他们的用户从命令行控制求解器选项。整个包的构建是在组合求解器和预处理器时具有极大的灵活性,实现这一点的唯一方法是使用命令行方案。您可以摆脱在代码中设置 KSP 和 PC 类型并使用

ierr = KSPCreate(PETSC_COMM_WORLD,&ksp);
ierr = KSPSetOperators(ksp,A,A,DIFFERENT_NONZERO_PATTERN);
ierr = KSPSetTolerances(ksp,1.e-2/((m+1)*(n+1)),1.e-50,PETSC_DEFAULT, 
                        PETSC_DEFAULT);
ierr = KSPSetFromOptions(ksp);
ierr = KSPSolve(ksp,b,x);

并运行

-ksp_type bcgsl -pc_type sor -pc_sor_its 10 

KSPSetFromOptions(ksp)将使用您在此处提供的选项覆盖默认选项。因此,它将使用带有 SSOR 的 BiCGStab(l),而不是带有 ILU 的 GMRES。可以在 PETSc 手册页上找到控制 SSOR 的其他选项:

http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/PC/PCSOR.html

如果您坚持从代码中设置选项,请使用KSPBCGS几乎所有 PETSc 运行时选项都具有等效的功能接口,但仅在您的应用程序正在积极决定使用哪种方法时才建议使用它。KSPSetType(ksp,)