非线性求解器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选项可以见到一个完整的列表。
方法 Line search Trust region Test Jacobian SNES Type SNESLS SNESTR SNESTEST 选项名 ls tr test 缺省收敛检验 SNESConverged_LS() SNESConverged_TR() 表5:PETSc非线性解法器
SNES完全支持自由矩阵方法。在Jacobi矩阵求值程序中指定的矩阵不需要是常规矩阵,代之以指向实现一个特殊矩阵自由方法要求的数据。矩阵自由形式仅用于解线性方程组是用迭代法结合非预条件(PCNONE或-pc_typenone)、用户提供的预条件子矩阵,或预条件子壳(PCSHELL),不能用于直接解法器。语句MatCreateSNESMF(SNES snes,Mat *J)可以创建在SNES中使用的矩阵自由环境。
时间步进求解器TS
TS组件为由时间相关PDEs离散化和用拟时间步的稳态问题离散化产生的ODEs可扩展求解提供了一个框架。TS主要求解如下时间依赖问题:
ut?F(u,t)
其中u为有限维解向量,上式通常为运用有限差分或有限元方法离散后的常微分方线性程组。对于非时间演化或稳态方程,PETSc提供了伪时间步进积分器。TS最终依赖线性解法器SLES和非线性解法器SNES来实现。
11
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的接口。
12
其它重要的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)
可以向选项数据库增加自定义内容,然后通过一系列的设置使应用程序也具有运行时选项。
13
阅读器(Viewer)
用户可以通过阅读器(Viewer)来查看PETSc对象,调用命令: XXXView(XXX obj,PetscViewer viewer);
用统一的方案去检测、打印、保存对象XXX至阅读器viewer。这里Obj是类型为XXX的任一PETSc对象,其中XXX是Mat,Vec,SNES等。PETSc中还有许多预定义的阅读器,如PETSC_VIEWER_STDOUT_SELF和PETSC_VIEWER_STDOUT_WORLD 可将对象打印到屏幕上。
为把对象以ASCII格式存储在一个文件中,用户调用命令: PetscViewerASCIIOpen(comm, filename,*viewer) 可打开或创建文本阅读器对象,(若将函数名中ASCII改为Binary则是打开或创建类型为二进制),然后调用语句XXXView(),就可以以二进制格式输出PETSc对象XXX。二进制对象的输入的相应程序形式为xxxload(),特别地,矩阵和向量的二进制输入用以下两个程序处理:
Matload(PetscViewer viewer,MatType outtype,Mat *newmat); Vecload(PetscViewer viewer,Vec newvec);
若阅读器的通信器具有不止一个处理器,这些程序将生成并行矩阵和向量。
图形输出(Draw)
PETSc也拥有自己的图形库来实现与PETSc程序交互使用,但图形分辨率稍低。 为了绘制一个预先定义的PETSc对象,如矩阵和向量,则首先用命令 PetscViewerDrawOpenX(comm, *display, *title, x, w, h, *viewer);
创建一个阅读器。这个阅读器可被传递给任何xxxView()程序。要在阅读器中绘图,必须用命令
PetscViewerDrawGetDraw(viewer, *draw);
获得Draw对象。然后,可在draw对象上调用任一PetscDrawXXX命令进行绘图。预定义阅读器PETSC_VIEWER_DRAW_WORLD和PETSC_VIEWER_DRAW_SELF可随时使用,它们的首次使用可创建适当的窗口。PETSc包括一个处理简单二维图形的程序集,用户使用这画线程序能绘制简单的线图。
PETSc与其它软件的接口
PETSc可扩展性的另一个方面表现在其为非常广泛的一类数值软件和数学库提供了很方便的软件接口。主要包括以下几种类型:1.线性代数求解器,如AMG、BlockSolve95、DSCPACK、hypre、ILUTP、LUSOL、SPAI、SPOOLES、SuperLU、SuperLU_Dist;2.最优化软件,如TAO、Veltisto;3.离散化和网格生成和优化工具包,如Overture、SAMRAI、SUMAA3d;4.常微分方程求解器,如PVODE;5. 其它,如Matlab、ParMETIS。这里我们将简要地介绍PETSc手册中描述的几个软件和库。
1、DMMG
PETSc为DMMG提供了高端访问的接口,并最终通过DA对象(或DMComposite对象)来实现在各处理器间的网格划分。这里DMMG代码建立在MG的PCType中提供的较低层PETSc多重网格接口的顶部,目前DMMG仅提供了分段线性插值方法和线性多重网格预条件子,但在实际应用程序开发中很容易得到扩展。
2、ADIC/ADIFOR
ADIC/ADIFOR是自动微分工具中的典型代表,它用来生成可直接从求解函数值的代码来计算Jacobi矩阵及其它微分的代码。PETSc通过DMMG高端访问接口为引用
14
ADIC/ADIFOR计算稀疏Jacobi矩阵并用它们执行矩阵自由微量乘积。
3、Matlab
PETSc为用户使用Matlab提供了三种方式:PETSc输出一系列文件给Matlab;从正在运行的PETSc程序中传递数据给Matlab;在PETSc和Matlab之间交互传递数据。其中后两种方式需要Matlab提供的实时指令或脚本文件。
15