可移植可扩展科学计算工具箱 PETSc简介
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可移植可扩展科学计算工具箱PETSc
可移植可扩展科学计算工具箱PETSc (Portable, Extensible Toolkit for Scientific Computation)是美国能源部ODE2000支持开发的20多个ACTS(Advanced Computational Testing and Simulation)工具箱之一,由Argonne国家实验室承担开发并获得成功,主要用于在分布式存储环境高效求解偏微分方程组及相关问题。
PETSc在软件实现上采用ANSI C 和消息传递标准接口MPI,遵循面向对象设计的基本特征,同时也为使用者提供基于FORTRAN语言的调用接口。
PETSc工具箱概况
PETSc是系列数据结构和功能子程序的集合,三个基本组件KSP、SNES和TS本身基于BLAS、LAPACK、MPI 等库实现,同时为TAO、ADIC/ADIFOR、Matlab等工具提供数据接口和互操作功能,并具有极好的可扩展性能。
PETSc为用户提供了丰富的Krylov子空间迭代方法和预条件子,并提供错误检测、性能统计和图形打印等功能。
目前PETSc不支持网格生成与精细技术、图形的划分与负载平衡方法、完整的科学计算可视化等,因为这些问题不是PETSc考虑的重点。
PETSc对这类解题需求的主要应对办法是,针对不同的功能要求,找到其它若干合适、出色的数值软件,通过实现PETSc对这些专门软件的访问操作接口,使得用户能够在PETSc的解题环境下也能方便的调用相关软件的特定功能,从而避免无谓的重复性劳动。
作为一个不断发展更新的工具箱,PETSc的最初的开发工作始于1991年,期间随着对软件包设计理解的深入而经历了较大的发展,开发人员仍一直致力于软件包的局部内容改进与功能完善工作,保持着平均每年做两次版本更新的发展速度,迄今为止己有二十多个历史版本。
目前最新的免费版本为2010年3月发布的3.1版,源代码公开(不包含用户自己加入的核心计算子程序)。
如今PETSc己成为国际流行的成熟并行数值软件包,受到大量工程计算人员的青睐。
体系结构
不同于其它微分/代数方程解法器,PETSc为用户提供了一个通用的高层应用程序开发平台。
基于PETSc提供的大量对象和解法库,用户可以灵活地开发自己的应用程序,还可随意添加和完善某些功能,如为线性方程求解提供预条件子、为非线性问题的牛顿迭代求解提供雅可比矩阵、为许多数值应用软件和数学库提供接口等。
图1表示了PETSc在实现层次上的抽象,图2具体列举了PETSc的基本数值部件。
这里做简要说明:应用程序:用户在PETSc环境下基于PETSc对象和算法库编写的串行或并行应用程序,PETSc程序具有固定的框架结构,即有初始化、空间释放和运行结束等环境运行语句。
PDE解法器:用户基于PETSc的三个基本算法库(TS、SNES和KSP)构建的偏微方程求解器。
TS:时间步进积分器,用于求解依赖时间或时间演化的ODE方程,或依赖时间的离散化后的PDE方程。
TS积分器最终依赖线性解法器SLES和非线性解法器SNES来实现。
PETSc 还为PVODE库提供了接口。
SNES:非线性解法器,为大规模的非线性问题提供高效的非精确或拟牛顿迭代解法。
SNES 依赖于线性解法器,Newton 型方法是软件包的核心,并采用线性搜索和信赖域方法实现。
KSP :线性解法器,它是PETSc 的核心部分。
PETSc 几乎提供了各种高效求解线性方程的解法器,包括直接解法和各种迭代解法。
对于大规模的线性方程,PETSc 提供了大量基于Krylov 子空间方法和预条件子的各种成熟而有效的迭代方法,以及其它通用程序和用户程序的接口。
线性解法器由Krylov 子空间方法对象KSP 和预条件对象PC 组成,统一由KSP 库实现。
层次
图1:PETSc 实现的层次结构
矩阵:PETSc 的基本数据对象,支持稠密存储和压缩稀疏行存储(串行和并行两种形式)格式,并通过多台为这些方式提供了统一的外部访问。
向量:PETSc 的基本数据对象。
还包括索引与排序,结构化网格的分布列阵,支持分段存于不同的内存中。
索引集:它是一系列数据操作对象的集合,专门用来管理无结构网格向量的分发、聚集、局部和全局之间的映像、边界点的通信等基本操作。
图2:PETSc的数值组件
基本特色
作为一个求解偏微分方程的高效工具箱,PETSc具有很多独有的优点:
计算能力:PETSc为用户提供了丰富的算法和库资源。
三个求解器(KSP、SNES和TS)构成了PETSc的核心组件。
PETSc不仅为中小规模线性方程组的求解提供了高效的直接方法,还为大规模(稀疏)线性方程组的迭代求解提供了多种Krylov子空间方法和多种预条件子。
可兼容性:一方面,PETSc具有很强的兼容能力,可在不同体系结构和不同操作系统环境高效运行。
另一方面,PETSc本身基于高性能的线性代数库(BLAS和LAPACK)和MPI 消息传递环境实现,同时又充分吸收和融入了其它优秀软件的优点,如无结构网格区域分解和雅可比矩阵求解等方面的功能。
可扩展性:PETSc的可扩展性功能主要包括三个方面:计算性能的并行可扩展性、功能的可扩展性和计算能力的可扩展性。
无论是在计算时间还是在浮点性能方面,PETSc提供的范例程序都有良好的线性加速比性能。
面向对象的良好设计风格使得PETSc具有良好的功能扩展能力。
作为一个高级应用程序开发平台,PETSc特别适合于用来开发大型应用程序。
抽象数据类型:PETSc基于面向对象技术实现,具有所有面向对象软件的可移植性、可
继承性和可扩展性等基本程序特征。
PETSc 的向量、矩阵等基本数据对象完全采用抽象数据类型实现,尽量对用户屏蔽数据对象的区域分解和存储等细节。
所有PETSc格点数据对象的划分、初始化和存取等基本操作都由DA对象来管理和相应PETSc库函数实现。
用户基于PETSc对象可以灵活开发其应用程序。
输出能力:PETSc具有良好的性能分析功能。
同时,PETSc还具有高可用性,并具有很强的错误诊断能力。
消息传递:PETSc所有对象和库都是在MP工消息传递环境下开发。
一个标准的PETSC 程序本身就是一个标准MPI并行程序。
唯一不同的是初始化和结束一个程序的运行需要PETSc来管理。
求解步骤:PETSc三个核心解法器的使用都包括创建、初始化、执行和空间释放几个阶段,思路清晰明确。
以KSP解法器为例,PETSC程序一般分四个必要阶段:1.创建解算子、解向量和右端向量,并填充解算子(矩阵)、设置初始解和右端向量;2.创建KSP环境,设置Krylov子空间方法和预条件子;3.启动KSP解法器;4.释放所有存储空间。
但PETSC同时也具有不少缺点。
尽管PETSC不需要用户懂得面向对象技术,但要求用户必须基于它所提供的数据结构来组织并行程序的开发。
而最重要的是PETSC由于兼顾串行和并行应用程序,许多线性解法器都没有针对并行计算做相应的优化,这对程序的并行求解性能有着很大的影响。
PETSc数据结构组件
针对于求解PDE方程的几个关键的数学对象,PETSc设计了相应的数据结构,并为其定义了抽象数据类型。
此外,PETSc还在充分考虑这些数据结构类型的使用需求及相互关联性的基础上,给出并实现了各种类型运算和处理的功能操作接口,包括单类型的自身操作和跨类型的协同操作,既供用户编程时做自由的选择调用,也为上层的软件模块(方程求解器)实现提供足够的基础支持。
这些复杂、高级数据结构类型的设计与实现,是PETSc优于许多简单数值库的一个直接原因。
PETSc的数据结构包括向量Vec,矩阵Mat以及网格管理对象:索引与排序,结构网格DA以及无结构网格的IS对象。
向量Vec
向量(由Vec表示)是一种最简单的PETSc对象,用于存储离散PDE的解、线性方程组的右端项等。
PETSc向量的内涵要比我们编程常用的数组丰富得多,它可以分段存储在不同的内存空间中以适应并行计算的需求,同时抽象与封装的特性又使得它可以包含更全面的数据信息。
用户在编写数值程序时,往往需要用到各种不同的向量操作,如信息获取、赋值、数据通信等访问操作,以及内积、求模、取最值等运算操作。
PETSc在充分考虑各类应用需求的基础上,为用户提供了大量直观方便、串并行使用几乎完全一致的功能调用接口,使得用户在编程过程中可以更多的关注于向量对象的宏观调度,而抛开过多的具体实现细节。
在PETSc向量的使用中,一个具体向量对象的应用要经过创建、赋值、使用(访问、运算等)、注销等一系列操作过程,一个基本的应用示范如下
Vec x; 申明x的类型为向量
VecCreate(comm, *x) ; 创建向量x
VecSetType(vec,VecType) ; 设置向量类型,有串行与并行两种。
VecSetSizes(v, n, N) ; 设置向量的分量个数(n为局部个数,N全体为个数)
VecSetFromOptions(x); 预置置运行时选项,应用程序运行时能修改参数。
VecSetValues(x, row, value,InsertMode) ; 赋值
VecDestroy(x) ; 释放内存空间。
对于向量的创建,在comm中的所有处理机都必须调用创建程序,因为这些程序在通讯器中的所有处理机上是集体性的。
对于赋值语句VecSetValues() 完成后必须调用VecAssemblyBegin(x)和VecAssemblyEnd(x)来执行任意非局部分量所需的消息传递。
索引与排序
在许多应用中希望用自由度、单元、节点等的一种或多种“排序”(或编号)。
在并行环境中做这些更为复杂,因为每一台处理机不能保持不同排序之间映射的完整列表。
另外,PETSc线性代数程序中所使用的排序(常是连续范围)可能不对应于应用的“自然”排序。
PETSc提供一些实用程序允许你清晰并有效地处理不同排序,即AO对象。
用户通过AOCreateBasic()创立AO对象后,可用如下命令之一AOPetscToApplication(AO ao,int n,int *indices);
AOApplicarionToPetsc(AO ao,int n,int *indices);
就可以通过在“PETSc”和“应用”两种排序之间映射来得到所需要的排序。
而对于局部编号方案到PETSc整体编号方案映射索引,PETSc提供ISLocalToGlobalMapping语句实现。
这通过下面的程序完成: ISLocalToGlobalMappingCreate(MPI_Comm,N,*globalnum, * ctx); ISLocalToGlobalMappingApply(ctx, n, *in, *out);
ISLocalToGlobalMappingApplyIS(ctx,IS isin,isout);
ISLocalToGlobalMappingDestroy(ctx);
这里N表示局部索引的个数,globalnum包含每个局部编号的整体编号,ISLocalToGlobalMapping是所得的PETSc对象,它包含需要用ISLocalToGlobalMappingApply()或ISLocalToGlobalMappingApplyIS()应用映射所需的信息。
分布阵列DA
分布阵列(DA)组件的设计是PETSc的一大特色,它是专门用于逻辑正规矩形网格的网格管理工具。
DA的主要设计目的是为了获得软件包对矩形网格区域分裂(必须按行列划分)问题的自适应能力,对相关方程的并行求解过程完成数据通信的自动处理。
DA的设计实现得益于矩形网格的逻辑正规性,即一旦确定了区域的划分以及网格上的微分方程离散格式,则计算过程中所需要的全部通信信息是能够统一定位的,考虑到矩形网格使用的普遍性,这种高度集成的型板使用模式具有很高的应用价值。
有了DA对象,用户处理基于矩形网格区域分裂的并行计算问题变得相对简单。
一开始,用户可以基于网格规模和处理机个数创建一个DA对象,这个对象将为各当前进程记录下整体和局部网格的丰富信息,其后即可以通过使用DA对象直观的创建与网格分布对应的全局向量和本地局部向量,而不必重新关注向量的存储分布与排序,也可以通过DA对象方便的获取向量信息和网格信息等。
特别的,当局部计算需要用到非局部信息的时候,用户可以通过调用DA操作隐式实现数据通信的自动完成,而不必显式的定位通信的操作地址,有些情况下PETSc甚至可以主动管理通信,让用户彻底的摆脱对通信的安排。
无结构网格管理与IS
PETSc利用一个索引集(IS)的概念来简化定义在非结构化网格问题的映象点校正的向量分散与聚集。
一个索引集是一个整数索引集合的推广,用于分散、聚集及在向量和矩阵上类似的运算。
对几乎所有的非结构网格来说,通过处理机操作调入进行网格的部分分配和存储器在性能方面有较大的冲突。
在大多数PDE计算中,在数值计算之前处理机通过一种“预处理”的方法来完成网格划分和分配。
但这并不意味着它需要用一种单独的、串行的程序来完成,在实际的程序中在建立并行网格数据结构之前就已经完成。
PETSc为ParMETIS提供了接口,允许用并行的方式去划分。
PETSc不能为动态再划分提供正确地支持,通过在两台处理机间移动数据来进行调入平衡。
对需要网格精确加细的问题,PETSc需用重建数据结构来逼近。
2.2.2矩阵Mat
与向量相同,矩阵结构(Mat)也是微分方程数值计算的基本概念之一,但相比而言,矩阵在具体设计内容上比向量要复杂得多,这源于矩阵结构在实际应用中具有更丰富的应用策略。
由于没有单一的矩阵格式能对所有问题保持最佳,PETSc提供了多种矩阵实现方式,支持多种稀疏存储方式(包括稠密存储)、多种分布存储处理方式、多种矩阵索引和装配方式等。
PETSc所采用面向对象技术所带来的功能函数的多态特质在矩阵这种数据结构上得到了非常明显的体现,即在统一的矩阵类型定义下,对各种不同格式矩阵的不同操作细节,实现一种外部接口一致、内部执行各异。
矩阵对象只要在创建初期按照当前需求正确设置矩阵的内部状态,此后对矩阵的使用是非常一般化的,PETSc会根据相应的矩阵信息自动实现对底层执行路径的判断,而无须用户关心更多的调用细节。
这种接口与执行分离的函数多态思想贯穿于PETSc的各个组件,对于简化软件使用模式具有非常重要的意义。
一个典型的例子是矩阵乘法:
MatMatMult(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
这一操作接口无论对稀疏矩阵、稠密矩阵,还是对串行矩阵、并行矩阵,在形式上始终如一,只要相关矩阵规模与分布是协调的,相应的操作总能被正确执行,这与用户关心概念、不关心细节的应用期望完全相符。
在编程过程中,矩阵对象的使用与向量类似,也需要一个创建、赋值、使用、注销的过程,矩阵对象一经创建,它就具备了若干基础状态,如存储格式、并行划分方式等,这些基本状态与运行过程中随时被加入的其它特殊状态,是在多态函数中寻找唯一确定的执行路径的关键。
由于矩阵状态类型对程序性能的影响依赖于具体问题的具体情况,因此要想获得最佳性能,用户必须主动选择最合理的矩阵状态类型,PETSc并不试图让默认的选择方案总是最优,而是致力于提供一个简便的选择接口。
PETSc矩阵提供的运算函数如下表所示:
表2:PETSc矩阵运算
PETSc也支持不通过显示存储整个矩阵而是通过向量运算来实现矩阵的各种操作和运
算的方法,即“无矩阵”运算(Matrix-Free Matrices),用户在这个环境下可以自由开发矩阵运算程序:
MatCreateShell():创建一个虚拟的矩阵对象
UserMult():用户编写的矩阵向量乘积程序
MatShellSetOperation():将一个用户程序封装到一个虚拟的矩阵对象中。
PETSc方程求解器
PETSc工具箱的方程组求解器组件定义在各种数据结构组件之上,包括线性方程组求解器KSP,非线性方程组求解器SNES,时间依赖方程解法器TS,其中线性方程组求解器是实现关键的第一步,后两者都是以此为基础的。
基于这三个求解器用户可以开发自己的应用程序。
线性求解器KSP
线性求解器KSP是PETSc的核心部分,它对软件包的所有线性方程组解法器,包括串行和并行,直接法和迭代法,提供了统一和高效的访问。
对于线性方程组Ax = b ,只要给出定义该方程组的数据结构A与b,线性求解器KSP都可以通过一条简单的函数调用KSPSolve()来获得求解。
Krylov子空间方法与一个预条件子结合是大多数迭代求解线性方程组之现代数值代码的核心。
PETSc的线性求解器模块就是由子空间法模块KSP与预条件子PC模块构成。
在版本2.20之前PETSc提供SLES对象作为最高功能的集成体,线性求解器均调用SLES接口,后该对象被移除,直接由对象KSP完成该功能。
特别地,KSP对象对直接解法也提供和迭代解法相同的调用序列。
一个典型的求解线性方程组的求解代码如下:
KSPCreate(comm, *ksp); 创建一个KSP求解器的对象。
KSPSetOperators(ksp, Amat, Pmat, flag) ; 设置线性方程组的矩阵。
KSPSetFromOptions(ksp) ; 设置运行时选项,主要是KSP和PC选项。
KSPSolve(ksp, b, x) ; 运行求解器求解。
KSPDestroy(ksp) ; 销毁对象。
对KSP软件包的一般使用来说,上面的过程就足够了。
求解器缺省的解法器是重启动GMRES,单机情形预条件是ILU(0),多机情形预条件是块Jacobi方法(每个处理机一块,每个块用ILU(0)求解)。
用户可通过KSPGetPC(ksp,*pc)来提取PC预条件子的环境上下文,再调用任意一个PC或KSP程序去修改相应的缺省选项。
PETSc的Krylov子空间方法KSP对象提供了丰富的迭代方法供用户选择,为设置将要使用的Krylov子空间方法,你需要调用命令:
KSPSetType(ksp,KSPTypemethod);
或在程序运行时使用-ksp_type ksptype进行修改。
Krylov子空间法对象缺省的收敛检验是基于剩余的l2-范数。
命令:
KSPSetTolerances(ksp, rtol, atol, dtol,maxits);
可以设置收敛条件。
运行时选项-ksp_monitor或其它监视器则显示剩余的范数。
表3总结了目前KSP所提供的迭代方法,对应数据库选项名和缺省收敛监控器。
Krylov空间方法常与一个预条件子结合使用,表4中总结了PETSc支持的基本预条件方法,详细的使用可查阅相关资料。
表4:PETSc预条件子
对于奇异线性方程组,即系数矩阵具有零空间,例如离散具有Neumann边界条件的Laplace算子,PETSc也提供工具来帮助求解这些方程组。
用户需用PETSc的Vecs的阵列形式的正交基来存储它,然后通过MatNullSpaceCreate()创建一个MatNullSpace对象,再通过语句PCNullSpaceAttach()然后将零空间传递给PC对象。
非线性求解器SNES
PETSc的非线性求解器建立在线性解法器和数据结构之上,它能够使用户轻松地根据实际应用来定制非线性解法器。
SNES对象求解形如F(x)=0 非线性方程的方法,其中F:Rn→Rn。
Newton型方法是软件包的核心,包括线搜索和信赖域技术。
依据PETSc的设计原则,各种求解器的接口实际上是一致的,唯一的区别是并行版本里每台处理机特有地形成对各种矩阵和向量局部贡献。
另外,SNES软件完全灵活地使用户可以在运行时修改求解过程的任何方面。
在非线性解法器最简单的用法中,用户只需提供一个求方程之非线性函数的C、C++或Fortran程序,相应的Jacobi矩阵可用有限差分来近似。
对典型更有效和更精确的代码,用户可以提供程序来计算Jacobi矩阵。
一般使用SNES可依次调用以下语句来实现,其中SNESSetFunction(),SNESSetJacobian()两语句的具体参数没有给出。
SNESCreate(comm, *snes) ; 创建SNES环境,得到非线性求解器snes。
SNESSetFunction(); 设置函数求值程序。
SNESSetJacobian() ; 设置jacobi矩阵求值程序。
SNESSetFromOptions(snes); 预置运行时选项。
SNESSetTolerances(snes, abstol, rtol, stol, maxit, maxf); 迭代终止设置。
SNESDestroy(snes); 注销SNES对象。
如表5列出了SNES包含基于线搜索技术和信赖域方法的几个Newton型非线性解法器以及收敛性的检测方法。
每个解法器也许都有与其相关的一组选项,这些选项可以用专门为此目的所提供的程序和选项库命令来设定。
查询手册页或者在运行程序时用-help选项可以见到一个完整的列表。
表5:PETSc非线性解法器
SNES完全支持自由矩阵方法。
在Jacobi矩阵求值程序中指定的矩阵不需要是常规矩阵,代之以指向实现一个特殊矩阵自由方法要求的数据。
矩阵自由形式仅用于解线性方程组是用迭代法结合非预条件(PCNONE或-pc_typenone)、用户提供的预条件子矩阵,或预条件子壳(PCSHELL),不能用于直接解法器。
语句MatCreateSNESMF(SNES snes,Mat *J)可以创建在SNES中使用的矩阵自由环境。
时间步进求解器TS
TS组件为由时间相关PDEs离散化和用拟时间步的稳态问题离散化产生的ODEs可扩展求解提供了一个框架。
TS主要求解如下时间依赖问题:
),
F
u
u
(t
t
其中u为有限维解向量,上式通常为运用有限差分或有限元方法离散后的常微分方线性程组。
对于非时间演化或稳态方程,PETSc提供了伪时间步进积分器。
TS最终依赖线性解法器SLES和非线性解法器SNES来实现。
TS的一般使用步骤如下:
TSCreate(comm, problemtype, *ts); 创建一个TS对象ts。
TSProblemType是TS_LINEAR或TS_NONLINEAR其中之一,用来表明是否F(u,t)是由矩阵A,或A(t),或一个函数F(u,t)给出的。
TSSetType(ts, type); 来设置求解方法。
目前所支持的类型是TS_EULER、TS_BEULER 和TS_PSEUDO。
TSSetInitialTimeStep(ts, time, dt); 设置初始时间和时间步。
TSSetTimeStep(ts, dt); 改变时间步。
TSSetDuration(ts, maxsteps, maxtime); 设置运行的时间步的总数或者运行的总时间。
TSSetUp(ts); 建立时间步关系。
TSDestroy(ts); 释放空间。
TS对于解时间相关问题和具有拟时间步的稳态问题有略微不同的设置处理,可详查用户手册。
另外,TS组件提供一个直接从PETSc使用由Hindmarsh等在LLNL开发的并行ODE解法器PVODE的接口。
其它重要的PETSc功能
PETSc工具箱还提供了性能分析、图形打印、错误检测等方面的功能。
PETSc不仅能为应用程序提供完整的计算时间、存储代价和浮点性能方面的信息,还能为计算的每个阶段和每个程序对象提供详细的信息。
另外,PETSc在软件接口方面的功能也将在这一节介绍。
2.4.1 性能分析(Profiling)
PETSc包含一个允许对应用程序进行预置的方案,该方案既一致又简便。
如果在运行时指定某些选项,PETSc程序自动记录性能数据。
用户也可用一个完整的性能图记录应用程序代码的信息。
如果应用程序代码和PETSc库已经用--with-debugging=1标志编译过,则在PetscInitialize()和PetscFinalize()调用之间代码的多种性能分析预置的代码可被激活。
PETSc 的性能分析功能主要包括计算时间、浮点性能、存储开销和通信性能几个方面的评价。
PETSc 提供了以下三个运行选项:
1、-log_summary 在程序结束时打印一个ASCII形式的性能数据。
这些统计数据是综合的、简洁的且基本上不需要开销,因此,-log_summary已作为PETSc代码性能监控的首选方式。
除了PETSc库组织的每个程序的性能数据,用户也可以通过该选项得到自定义事件的性能数据。
在程序内调用PetscLogPrintSummary()函数也可以达到这样的效果。
2、-info [infofile] 在屏幕上打印代码的详细信息或输出到文件。
该选项提供关于算法、数据结构等的细节,由于打印这些输出信息的开销降低了代码的速度,在评价一个程序的性能时不要使用本选项。
同样在程序中使用PetscInfoAllow(PETSC_TRUE)也可以得到这些数据
3、-log_trace [logfile] 跟踪所有PETSc事件的开始和结束。
该选项对程序不在调试器中运行而检查到程序在何处挂起是有用的,它可与-log_info联合使用。
运行时选项(Runtime option)
PETSc提供了一个简单的机制允许用户在运行时可以修改程序的参数和选项。
例如,当解一个线性方程组时,通过调用语句:
KSPSetType(ksp, KSPCG);
可以明确地指定使用Krylov子空间方法为共轭梯度法CG。
然后,可以在运行时使用选项-ksp_type gmres
来选择广义最小残量法GMRES算法来覆盖上述选择,这种参数的改变只需要在程序中预置KSPSetFromOptions(KSP ksp)即可实现。
事实上每一个PETSc进程都维护一个选项名和值的数据库(以文本字符串的方式存储)。
代码PetscInitialize(int *argc,char ***args,char *file,char *help)即可生成该库,其中参数argc,args(仅仅在C/C++中)是通常的命令行参数,而file是能够包括附加选项的文件名。
在这之后若预置了XXXSetFromOption就可以在运行时使用-package_option来改变该选项,其中XXX是Petsc对象,如Vec,KSP等。
在运行PETSc程序时使用-h或-help可以查看所有可用选项。
通过语句
PetscOptionsSetValue(char *name,char *value)
可以向选项数据库增加自定义内容,然后通过一系列的设置使应用程序也具有运行时选项。