可移植可扩展科学计算工具箱-PETSc简介_第1页
可移植可扩展科学计算工具箱-PETSc简介_第2页
可移植可扩展科学计算工具箱-PETSc简介_第3页
可移植可扩展科学计算工具箱-PETSc简介_第4页
可移植可扩展科学计算工具箱-PETSc简介_第5页
已阅读5页,还剩15页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEPAGE14可移植可扩展科学计算工具箱PETSc可移植可扩展科学计算工具箱PETSc(Portable,ExtensibleToolkitforScientificComputation)是美国能源部ODE2000支持开发的20多个ACTS(AdvancedComputationalTestingandSimulation)工具箱之一,由Argonne国家实验室承担开发并获得成功,主要用于在分布式存储环境高效求解偏微分方程组及相关问题。PETSc在软件实现上采用ANSIC和消息传递标准接口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向量的使用中,一个具体向量对象的应用要经过创建、赋值、使用(访问、运算等)、注销等一系列操作过程,一个基本的应用示范如下Vecx;申明x的类型为向量VecCreate(comm,*x);创建向量xVecSetType(vec,VecType);设置向量类型,有串行与并行两种。VecSetSizes(v,n,N);设置向量的分量个数(n为局部个数,N全体为个数)VecSetFromOptions(x);预置置运行时选项,应用程序运行时能修改参数。VecSetValues(x,row,value,InsertMode);赋值VecDestroy(x);释放内存空间。对于向量的创建,在comm中的所有处理机都必须调用创建程序,因为这些程序在通讯器中的所有处理机上是集体性的。对于赋值语句VecSetValues()完成后必须调用VecAssemblyBegin(x)和VecAssemblyEnd(x)来执行任意非局部分量所需的消息传递。PETSc向量所提供的的基本运算有下表所示:函数名运算VecAXPY(Vecy,PetscScalara,Vecx);VecAYPX(Vecy,PetscScalara,Vecx);VecWAXPY(Vecw,PetscScalara,Vecx,Vecy);VecAXPBY(Vecy,PetscScalara,PetscScalarb,Vecx,);VecScale(Vecx,PetscScalara);VecDot(Vecx,Vecy,PetscScalar*r);VecTDot(Vecx,Vecy,PetscScalar*r);VecNorm(Vecx,NormTypetype,double*r);VecSum(Vecx,PetscScalar*r);VecCopy(Vecx,Vecy);VecSwap(Vecx,Vecy);VecPointwiseMult(Vecw,Vecx,Vecy);VecPointwiseDivide(Vecw,Vecx,Vecy);VecMDot(Vecx,intn,Vecy[],PetscScalar*r);VecMTDot(Vecx,intn,Vecy[],PetscScalar*r);VecMAXPY(Vecy,intn,PetscScalar*a,Vecx[]);VecMax(Vecx,int*idx,double*r);VecMin(Vecx,int*idx,double*r);VecAbs(Vecx);VecReciprocal(Vecx);VecShift(Vecx,PetscScalars);y=y+a*xy=x+a*yw=a*x+yy=a*x+b*yx=a*xr=*yr=*yr=||x||typer=∑xiy=xy=xwhilex=ywi=xi*yiwi=xi/yir[i]=*y[i]r[i]=*y[i]y=y+∑iai*x[i]r=maxxir=minxixi=|xi|xi=1/xixi=s+xi表1PETSc向量运算

索引与排序在许多应用中希望用自由度、单元、节点等的一种或多种“排序”(或编号)。在并行环境中做这些更为复杂,因为每一台处理机不能保持不同排序之间映射的完整列表。另外,PETSc线性代数程序中所使用的排序(常是连续范围)可能不对应于应用的“自然”排序。PETSc提供一些实用程序允许你清晰并有效地处理不同排序,即AO对象。用户通过AOCreateBasic()创立AO对象后,可用如下命令之一AOPetscToApplication(AOao,intn,int*indices);AOApplicarionToPetsc(AOao,intn,int*indices);就可以通过在“PETSc”和“应用”两种排序之间映射来得到所需要的排序。而对于局部编号方案到PETSc整体编号方案映射索引,PETSc提供ISLocalToGlobalMapping语句实现。这通过下面的程序完成:ISLocalToGlobalMappingCreate(MPI_Comm,N,*globalnum,*ctx);ISLocalToGlobalMappingApply(ctx,n,*in,*out);ISLocalToGlobalMappingApplyIS(ctx,ISisin,isout);ISLocalToGlobalMappingDestroy(ctx);这里N表示局部索引的个数,globalnum包含每个局部编号的整体编号,ISLocalToGlobalMapping是所得的PETSc对象,它包含需要用ISLocalToGlobalMappingApply()或ISLocalToGlobalMappingApplyIS()应用映射所需的信息。分布阵列DA分布阵列(DA)组件的设计是PETSc的一大特色,它是专门用于逻辑正规矩形网格的网格管理工具。DA的主要设计目的是为了获得软件包对矩形网格区域分裂(必须按行列划分)问题的自适应能力,对相关方程的并行求解过程完成数据通信的自动处理。DA的设计实现得益于矩形网格的逻辑正规性,即一旦确定了区域的划分以及网格上的微分方程离散格式,则计算过程中所需要的全部通信信息是能够统一定位的,考虑到矩形网格使用的普遍性,这种高度集成的型板使用模式具有很高的应用价值。有了DA对象,用户处理基于矩形网格区域分裂的并行计算问题变得相对简单。一开始,用户可以基于网格规模和处理机个数创建一个DA对象,这个对象将为各当前进程记录下整体和局部网格的丰富信息,其后即可以通过使用DA对象直观的创建与网格分布对应的全局向量和本地局部向量,而不必重新关注向量的存储分布与排序,也可以通过DA对象方便的获取向量信息和网格信息等。特别的,当局部计算需要用到非局部信息的时候,用户可以通过调用DA操作隐式实现数据通信的自动完成,而不必显式的定位通信的操作地址,有些情况下PETSc甚至可以主动管理通信,让用户彻底的摆脱对通信的安排。无结构网格管理与ISPETSc利用一个索引集(IS)的概念来简化定义在非结构化网格问题的映象点校正的向量分散与聚集。一个索引集是一个整数索引集合的推广,用于分散、聚集及在向量和矩阵上类似的运算。对几乎所有的非结构网格来说,通过处理机操作调入进行网格的部分分配和存储器在性能方面有较大的冲突。在大多数PDE计算中,在数值计算之前处理机通过一种“预处理”的方法来完成网格划分和分配。但这并不意味着它需要用一种单独的、串行的程序来完成,在实际的程序中在建立并行网格数据结构之前就已经完成。PETSc为ParMETIS提供了接口,允许用并行的方式去划分。PETSc不能为动态再划分提供正确地支持,通过在两台处理机间移动数据来进行调入平衡。对需要网格精确加细的问题,PETSc需用重建数据结构来逼近。2.2.2矩阵Mat与向量相同,矩阵结构(Mat)也是微分方程数值计算的基本概念之一,但相比而言,矩阵在具体设计内容上比向量要复杂得多,这源于矩阵结构在实际应用中具有更丰富的应用策略。由于没有单一的矩阵格式能对所有问题保持最佳,PETSc提供了多种矩阵实现方式,支持多种稀疏存储方式(包括稠密存储)、多种分布存储处理方式、多种矩阵索引和装配方式等。PETSc所采用面向对象技术所带来的功能函数的多态特质在矩阵这种数据结构上得到了非常明显的体现,即在统一的矩阵类型定义下,对各种不同格式矩阵的不同操作细节,实现一种外部接口一致、内部执行各异。矩阵对象只要在创建初期按照当前需求正确设置矩阵的内部状态,此后对矩阵的使用是非常一般化的,PETSc会根据相应的矩阵信息自动实现对底层执行路径的判断,而无须用户关心更多的调用细节。这种接口与执行分离的函数多态思想贯穿于PETSc的各个组件,对于简化软件使用模式具有非常重要的意义。一个典型的例子是矩阵乘法:MatMatMult(MatA,MatB,MatReusescall,PetscRealfill,Mat*C)这一操作接口无论对稀疏矩阵、稠密矩阵,还是对串行矩阵、并行矩阵,在形式上始终如一,只要相关矩阵规模与分布是协调的,相应的操作总能被正确执行,这与用户关心概念、不关心细节的应用期望完全相符。在编程过程中,矩阵对象的使用与向量类似,也需要一个创建、赋值、使用、注销的过程,矩阵对象一经创建,它就具备了若干基础状态,如存储格式、并行划分方式等,这些基本状态与运行过程中随时被加入的其它特殊状态,是在多态函数中寻找唯一确定的执行路径的关键。由于矩阵状态类型对程序性能的影响依赖于具体问题的具体情况,因此要想获得最佳性能,用户必须主动选择最合理的矩阵状态类型,PETSc并不试图让默认的选择方案总是最优,而是致力于提供一个简便的选择接口。PETSc矩阵提供的运算函数如下表所示:函数名运算MatAXPY(MatY,Scalar*a,MatX,MatStructure);MatMult(MatA,Vecx,Vecy);MatMultAdd(MatA,Vecx,Vecy,Vecz);MatMultTrans(MatA,Vecx,Vecy,Vecz);MatMultTransAdd(MatA,Vecx,Vecy,Vecz);MatNorm(MatA,NormTypetype,double*r);MatDiagonalScale(MatA,Vecl,Vecr);MatScale(MatA,Scalara);MatConvert(MatA,MatTypetype,Mat*B);MatCopy(MatA,MatB,MatStructure);MatGetDiagonal(MatA,Vecx);MatTranspose(MatA,MatReuseMat*B);MatZeroEntries(MatA);MatShift(MatY,Scalara);Y=Y+a*Xy=A*xz=y+A*xy=AT*xz=yATxr=||A||typeA=diag(l)*A*diag(r)A=a*AB=AB=Ax=diag(A)B=ATA=0Y=Y+a*I表2:PETSc矩阵运算PETSc也支持不通过显示存储整个矩阵而是通过向量运算来实现矩阵的各种操作和运算的方法,即“无矩阵”运算(Matrix-FreeMatrices),用户在这个环境下可以自由开发矩阵运算程序: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_typeksptype进行修改。Krylov子空间法对象缺省的收敛检验是基于剩余的l2-范数。命令:KSPSetTolerances(ksp,rtol,atol,dtol,maxits);可以设置收敛条件。运行时选项-ksp_monitor或其它监视器则显示剩余的范数。表3总结了目前KSP所提供的迭代方法,对应数据库选项名和缺省收敛监控器。

方法KSPType选项数据库名缺省收敛监控器+RichardsonChebychevConjugateGradientBiConjugateGradientGeneralizedMinimalResidualBiCGSTABConjugateGradientSquaredTranspose-FreeQuasi-MinimalResidual(1)Transpose-FreeQuasi-MinimalResidual(2)ConjugateResidualLeastSquaresMethodShellfornoKSPmethodKSPRICHARDSONKSPCHEBYCHEVKSPCGKSPBICGKSPGMRESKSPBCGSKSPCGSKSPTFQMRKSPTFCQMRKSPCRKSPLSQRKSPPREONLYrichardsonchebychevcgbicggmresbcgscgstfqmrtcqmrcrlsqrpreonlytruetruetruetrueprecondprecondprecondprecondprecondprecondprecondprecond+true–表示真实剩余范数,precond–表示预条件剩余范数表3:KSP方法.缺省时所有方法使用左预条件Krylov空间方法常与一个预条件子结合使用,表4中总结了PETSc支持的基本预条件方法,详细的使用可查阅相关资料。方法PCType选项数据库名JacobiBlockJacobiSOR(andSSOR)SORwithEisenstattrickIncomleteCholeskyIncompleteLUAdditiveSchwarzLinearSolverCombinationofPreconditionersPCJACOBIPCBJACOBIPCSORPCEISENSTATPCICCPCILUPCASMPCSLESPCCOMPOSITEjacobibjacobisoreisenstaticciluasmslescompositeLUCholeskyNopreconditioningShellforuser-definedPCPCLUPCCholesyPCNONEPCSHELLlucholeskynoneshell表4:PETSc预条件子对于奇异线性方程组,即系数矩阵具有零空间,例如离散具有Neumann边界条件的Laplace算子,PETSc也提供工具来帮助求解这些方程组。用户需用PETSc的Vecs的阵列形式的正交基来存储它,然后通过MatNullSpaceCreate()创建一个MatNullSpace对象,再通过语句PCNullSpaceAttach()然后将零空间传递给PC对象。非线性求解器SNESPETSc的非线性求解器建立在线性解法器和数据结构之上,它能够使用户轻松地根据实际应用来定制非线性解法器。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选项可以见到一个完整的列表。方法SNESType选项名缺省收敛检验LinesearchTrustregionTestJacobianSNESLSSNESTRSNESTESTlstrtestSNESConverged_LS()SNESConverged_TR()表5:PETSc非线性解法器SNES完全支持自由矩阵方法。在Jacobi矩阵求值程序中指定的矩阵不需要是常规矩阵,代之以指向实现一个特殊矩阵自由方法要求的数据。矩阵自由形式仅用于解线性方程组是用迭代法结合非预条件(PCNONE或-pc_typenone)、用户提供的预条件子矩阵,或预条件子壳(PCSHELL),不能用于直接解法器。语句MatCreateSNESMF(SNESsnes,Mat*J)可以创建在SNES中使用的矩阵自由环境。时间步进求解器TSTS组件为由时间相关PDEs离散化和用拟时间步的稳态问题离散化产生的ODEs可扩展求解提供了一个框架。TS主要求解如下时间依赖问题:其中为有限维解向量,上式通常为运用有限差分或有限元方法离散后的常微分方线性程组。对于非时间演化或稳态方程,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联合使用。运行时选项(Runtimeoption)PETSc提供了一个简单的机制允许用户在运行时可以修改程序的参数和选项。例如,当解一个线性方程组时,通过调用语句:KSPSetType(ksp,KSPCG);可以明确地指定使用Krylov子空间方法为共轭梯度法CG。然后,可以在运行时使用选项-ksp_typegmres来选择广义最小残量法GMRES算法来覆盖上述选择,这种参数的改变只需要在程序中预置KSPSetFromOptions(KSPksp)即可实现。事实上每一个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)可以向选项数据库增加自定义内容,然后通过一系列的设置使应用程序也具有运行时选项。阅读器(Viewer)用户可以通过阅读器(Viewer)来查看PETSc对象,调用命令:XXXView(XXXobj,PetscViewerviewer);用统一的方案去检测、打印、保存对象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(PetscViewerviewer,MatTypeouttype,Mat*newmat);Vecload(PetscViewerviewer,Vecnewvec);若阅读器的通信器具有不止一个处理器,这些程序将生成并行矩阵和向量。图形输出(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、DMMGPETSc为DMMG提供了高端访问的接口,并最终通过DA对象(或DMComposite对象)来实现在各处理器间的网格划分。这里DMMG代码建立在MG的PCType中提供的较低层PETSc多重网格接口的顶部,目前DMMG仅提供了分段线性插值方法和线性多重网格预条件子,但在实际应用程序开发中很容易得到扩展。2、ADIC/ADIFORADIC/ADIFOR是自动微分工具中的典型代表,它用来生成可直接从求解函数值的代码来计算Jacobi矩阵及其它微分的代码。PETSc通过DMMG高端访问接口为引用ADIC/ADIFOR计算稀疏Jacobi矩阵并用它们执行矩阵自由微量乘积。3、MatlabPETSc为用户使用Matlab提供了三种方式:PETSc输出一系列文件给Matlab;从正在运行的PETSc程序中传递数据给Matlab;在PETSc和Matlab之间交互传递数据。其中后两种方式需要Matlab提供的实时指令或脚本文件。

PETSc的程序结构在使用PETSc之前,用户必须首先设置环境变量PETSC_DIR,指出PETSc主目录的完全路径。另外,环境变量PETSC_ARCH来说明将在其上使用PETSc的编译选项和机器结构(如linux-gnu-debug、cygwin-c-debug等),用户可以指定不同的PETSC_ARCH来编译不同选项的PETSc库。对消息传递通讯,所有PETSc程序都使用MPI(MessagePassingInterface)标准。因此,为执行PETSc程序,用户必须知道在其所用计算机系统上开始MPI工作的过程。所有PETSc允许的程序都支持选项–h或-help以及选项–v或–version的使用。大多数基于PETSc的程序开始于一个调用:PetscInitialize(int*argc,char***argv,char*file,char*help);它初始化PETSc和MPI。参数argc和argv是所有C和C++程序中传送的命令行参数。参数file任意代表PETSc选项文件一个可选的名.petscrc,它缺省驻留在用户的主目录。最后的参数help,是一个可选的字符串,如果程序带有–help选项地运行,则将打印此字符串。若在此之前MPI尚未被初始化,则PetscInitialize()自动调用MPI_Init()。所有PETSc程序都返回一个整数以表明调用期间是否出错。如果探测到错误,则错误代码被置为非零,否则置为零。对C/C++接口,错误变量是程序的返回值,而对Fortran,每个PETSc程序都有一个整数错误变量作为最后一个参数。语句PetscFinalize()则作为所有PETSc程序最后(或几乎最后)调用,这个程序处理程序结尾处在调用的选项,如果MPI是由PetscInitialize()开始的,则它也调用MPI_Finalize()。一般来说,非线性求解器SNES会调用KSP来解线性方程组,而时间步进求解器则会最终依赖于线性求解器KSP和非线性求解器SNES实现。

PETSc的Fortran编程虽然PETSc建议用户通过C/C++来使用工具箱,但纯粹用Fortran77或Fortran90编程的用户能得到PETSc的大多数功能。C和Fortran的PETSc接口之间只有一点区别,而这些都是由于Fortran77语法中的区别。所有Fortran的PETSc程序与相应的C版本的相同的名字,且完全由PETSc命令行选项所支持。程序的参数遵循通常Fortran惯例,用户无需担心传送指针或值。除了错误检测变量和一些特殊情况外,Fortran版本的调用序列在大多数情形中与C版本相同。以下为PETSc的Fortran编程中应注意的两点:1、Fortran的PETSc包含文件位于目录${PETSC_DIR}/include/finclude之中且通过如下语句被使用:#include“include/finclude/includefile.h”由于用户必须细致地在Fortran程序中包含每个文件不超过一次,应用程序员必须手工地在其程序中包含PETSc库所需的每个文件。这里与PETScC/C++接口不同,C/C++接口用户只需包含最高层文件,例如,petscsnes.h,然后自动包含所有较低层文件。2、在Fortran版本中,每个PETSc程序以一个整型错误变量作为其最后一个参数,这与提供错误变量作为程序的返回值的C惯例不同。如果探测到错误,错误代码被置为非零,否则,它被置为0。例如,下面分别给出求解线性方程组语句KSPSSolve()的Fortran和C形式,其中ierr代表错误变量:callKSPSolve(KSPksp,Vecb,Vecx,PetscErrorCodeierr)KSPSolve(KSPksp,Vecb,Vecx);Fortran程序员可用CHKERRQ(ierr)检测这些错误代码,当遇到错误时,它终止所有进程。类似地,可用SETERRQ(ierr,p,’’)在Fortran程序中设置错误代码,它也依赖于一个错误的探测来终止所有进程。由于完整的错误返馈需要用到CHKERRQ()和SETERRQ()来完成,这对Fortran程序是不能直接被支持的,但Fortran程序员可容易地使用错误代码编写自己的返馈。例如,可用如下代码:callKSPSolve(ksp,b,x,ierr)if(ierr.ne.0)thenprint*,’Errorinroutine…’returnendif而且PETSc的Fortran代码失败的最常见的原因是忘了最后的ierr参数。另外,由于Fortran77不提供输入/输出参数类型检测,许多PETSc的Fortran程序中遇到的错误是由于偶然错误地使用调用序列。这些错误当使用C/C++编译期间立即能被探测到。因此,对期望在其应用程序中用Fortran作为核心数值程序的程序员来说,用C/C++与Fortran混合编程常工作很好。特别地,可用C/C++编写PETSc驱动程序,从而保持程序中的灵活性,并对将在进行的数值计算仍用Fortran。其他一些由于Fortran编程而产生的差异可以阅读用户手册。PETSc编译和使用PETSc的开发者提供了源码,用户需要现将其编译成库的形式后再在此基础上编写基于PETSc的程序。目前PETSc支持Linux/Unix和Windows两类系统的编译,前者较为简单,本节着重介绍PETSc在Windows系统下的编译和使用。2.7.1在Linux/Unix上编译PETSc用户可从/petsc/免费下载到PETSc的最新版本,当前的版本为2011年9月发布的petsc-3.2。在安装PETSc之前,用户首先要配置MPI(只使用PETSc串行功能的用户除外),并且需要BLAS、LAPACK的静态库的支持。以下为petsc-3.2-p6.tar在LINUX/UNIX环境下的安装:解压文件:$tar-zxfpetsc-3.2-p6.tar;设置环境变量:$cdpetsc-3.2-p6;PETSC_DIR=$PWD;PETSC_ARCH=linux-gnu-c-debug;其中PETSC_DIR指出PETSc主目录的完全路径,PETSC_ARCH来说明将在其上使用PETSc的机器结构和编译选项(如,linux-gnu-c-debug、cygwin-c-debug等),用户可以自己命名。配置系统:$./configure;编译:$makeall;测试:$maketest;编译成功后在PETSC_DIR/PETSC_ARCH/lib文件夹下就可以得到一个90M左右的libpetsc.a文件,该文件即PETSc静态链接库。若用户在配置时选项加上--with-shared还可以将其编译成相应的共享库libpetsc.so,其余的配置选项可使用./configure–help查看或者阅读PETSc安装说明。在Windows上编译PETSc以下为在Windows系统上编译PETSc的一种途径:编译准备:1、PETSc的一个版本同上述Linus下安装文件一样,从/petsc/上免费下载petsc-3.2-p6.tar.gz。2、MPI的实现作为PETSc的底层结构之一,用户系统需要安装MPICH的一个版本(只使用PETSc串行功能的除外),一般从/mpi/mpich上可以下载其Windows下安装文件mpich2-1.3-win-ia32.msi,直接点击安装即可。安装完毕后需要将用户注册至MPICH2。3、MS编译器,由于最终需要将PETSc编译成Windows系统下的库文件,故需要Windows的C编译器和Fortran编译器,本文安装使用VisualStudio2005中的cl.exe编译器和IntelFortranCompiler10.1中的ifort.exe编译器,安装时注意需要将Inter的Fortran编译器集成到VisualStudio中去(Intel的Fortran能自动集成)。4、Linux环境的模拟为了得到Linux风格的环境,PETSc推荐使用Cygwin。Cygwin是一个用于Windows环境下的模拟UNIXshell环境,它由两个组件组成:一个UNIXAPI库,它模拟UNIX操作系统提供的许多特性。另一部分为Bashshell的改写版本和许多UNIX实用程序,它们提供大家熟悉的UNIX命令行界面。前一个组件是一个Windows动态链接库(DLL)。后一个组件是一组基于CygwinDLL的程序,其中许多是用未经修改的UNIX源代码编译的。它们合在一起提供大家熟悉的UNIX环境。Cygwin具体操作如下:Ⅰ用户可以到主页上下载Cygwin的安装向导setup.exe。该setup.exe文件可以用于安装软件,添加、修改或升级Cygwin配置的组件。Ⅱ运行setup.exe引导安装,由于Cygwin的完整安装版本很大,往往先将其下载至本地再安装,然后指定下载目录和下载链接。国内也有网站能提供镜像下载。Ⅲ下载完毕后再运行setup.exe,选择上本地安装,指定安装文件目录和安装目录后即可安装,建议完整版本的安装。整个安装过程将会持续1-2个小时。编译阶段1、从编译器的命令提示

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论