




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PAGEPAGE14可移植可擴(kuò)展科學(xué)計(jì)算工具箱PETSc可移植可擴(kuò)展科學(xué)計(jì)算工具箱PETSc(Portable,ExtensibleToolkitforScientificComputation)是美國能源部ODE2000支持開發(fā)的20多個(gè)ACTS(AdvancedComputationalTestingandSimulation)工具箱之一,由Argonne國家實(shí)驗(yàn)室承擔(dān)開發(fā)并獲得成功,主要用于在分布式存儲(chǔ)環(huán)境高效求解偏微分方程組及相關(guān)問題。PETSc在軟件實(shí)現(xiàn)上采用ANSIC和消息傳遞標(biāo)準(zhǔn)接口MPI,遵循面向?qū)ο笤O(shè)計(jì)的基本特征,同時(shí)也為使用者提供基于FORTRAN語言的調(diào)用接口。PETSc工具箱概況PETSc是系列數(shù)據(jù)結(jié)構(gòu)和功能子程序的集合,三個(gè)基本組件KSP、SNES和TS本身基于BLAS、LAPACK、MPI等庫實(shí)現(xiàn),同時(shí)為TAO、ADIC/ADIFOR、Matlab等工具提供數(shù)據(jù)接口和互操作功能,并具有極好的可擴(kuò)展性能。PETSc為用戶提供了豐富的Krylov子空間迭代方法和預(yù)條件子,并提供錯(cuò)誤檢測(cè)、性能統(tǒng)計(jì)和圖形打印等功能。目前PETSc不支持網(wǎng)格生成與精細(xì)技術(shù)、圖形的劃分與負(fù)載平衡方法、完整的科學(xué)計(jì)算可視化等,因?yàn)檫@些問題不是PETSc考慮的重點(diǎn)。PETSc對(duì)這類解題需求的主要應(yīng)對(duì)辦法是,針對(duì)不同的功能要求,找到其它若干合適、出色的數(shù)值軟件,通過實(shí)現(xiàn)PETSc對(duì)這些專門軟件的訪問操作接口,使得用戶能夠在PETSc的解題環(huán)境下也能方便的調(diào)用相關(guān)軟件的特定功能,從而避免無謂的重復(fù)性勞動(dòng)。作為一個(gè)不斷發(fā)展更新的工具箱,PETSc的最初的開發(fā)工作始于1991年,期間隨著對(duì)軟件包設(shè)計(jì)理解的深入而經(jīng)歷了較大的發(fā)展,開發(fā)人員仍一直致力于軟件包的局部?jī)?nèi)容改進(jìn)與功能完善工作,保持著平均每年做兩次版本更新的發(fā)展速度,迄今為止己有二十多個(gè)歷史版本。目前最新的免費(fèi)版本為2010年3月發(fā)布的3.1版,源代碼公開(不包含用戶自己加入的核心計(jì)算子程序)。如今PETSc己成為國際流行的成熟并行數(shù)值軟件包,受到大量工程計(jì)算人員的青睞。體系結(jié)構(gòu)不同于其它微分/代數(shù)方程解法器,PETSc為用戶提供了一個(gè)通用的高層應(yīng)用程序開發(fā)平臺(tái)?;赑ETSc提供的大量對(duì)象和解法庫,用戶可以靈活地開發(fā)自己的應(yīng)用程序,還可隨意添加和完善某些功能,如為線性方程求解提供預(yù)條件子、為非線性問題的牛頓迭代求解提供雅可比矩陣、為許多數(shù)值應(yīng)用軟件和數(shù)學(xué)庫提供接口等。圖1表示了PETSc在實(shí)現(xiàn)層次上的抽象,圖2具體列舉了PETSc的基本數(shù)值部件。這里做簡(jiǎn)要說明:應(yīng)用程序:用戶在PETSc環(huán)境下基于PETSc對(duì)象和算法庫編寫的串行或并行應(yīng)用程序,PETSc程序具有固定的框架結(jié)構(gòu),即有初始化、空間釋放和運(yùn)行結(jié)束等環(huán)境運(yùn)行語句。PDE解法器:用戶基于PETSc的三個(gè)基本算法庫(TS、SNES和KSP)構(gòu)建的偏微方程求解器。TS:時(shí)間步進(jìn)積分器,用于求解依賴時(shí)間或時(shí)間演化的ODE方程,或依賴時(shí)間的離散化后的PDE方程。TS積分器最終依賴線性解法器SLES和非線性解法器SNES來實(shí)現(xiàn)。PETSc還為PVODE庫提供了接口。SNES:非線性解法器,為大規(guī)模的非線性問題提供高效的非精確或擬牛頓迭代解法。SNES依賴于線性解法器,Newton型方法是軟件包的核心,并采用線性搜索和信賴域方法實(shí)現(xiàn)。KSP:線性解法器,它是PETSc的核心部分。PETSc幾乎提供了各種高效求解線性方程的解法器,包括直接解法和各種迭代解法。對(duì)于大規(guī)模的線性方程,PETSc提供了大量基于Krylov子空間方法和預(yù)條件子的各種成熟而有效的迭代方法,以及其它通用程序和用戶程序的接口。線性解法器由Krylov子空間方法對(duì)象KSP和預(yù)條件對(duì)象PC組成,統(tǒng)一由KSP庫實(shí)現(xiàn)。圖1:PETSc實(shí)現(xiàn)的層次結(jié)構(gòu)矩陣:PETSc的基本數(shù)據(jù)對(duì)象,支持稠密存儲(chǔ)和壓縮稀疏行存儲(chǔ)(串行和并行兩種形式)格式,并通過多臺(tái)為這些方式提供了統(tǒng)一的外部訪問。向量:PETSc的基本數(shù)據(jù)對(duì)象。還包括索引與排序,結(jié)構(gòu)化網(wǎng)格的分布列陣,支持分段存于不同的內(nèi)存中。索引集:它是一系列數(shù)據(jù)操作對(duì)象的集合,專門用來管理無結(jié)構(gòu)網(wǎng)格向量的分發(fā)、聚集、局部和全局之間的映像、邊界點(diǎn)的通信等基本操作。圖2:PETSc的數(shù)值組件基本特色作為一個(gè)求解偏微分方程的高效工具箱,PETSc具有很多獨(dú)有的優(yōu)點(diǎn):計(jì)算能力:PETSc為用戶提供了豐富的算法和庫資源。三個(gè)求解器(KSP、SNES和TS)構(gòu)成了PETSc的核心組件。PETSc不僅為中小規(guī)模線性方程組的求解提供了高效的直接方法,還為大規(guī)模(稀疏)線性方程組的迭代求解提供了多種Krylov子空間方法和多種預(yù)條件子??杉嫒菪裕阂环矫?,PETSc具有很強(qiáng)的兼容能力,可在不同體系結(jié)構(gòu)和不同操作系統(tǒng)環(huán)境高效運(yùn)行。另一方面,PETSc本身基于高性能的線性代數(shù)庫(BLAS和LAPACK)和MPI消息傳遞環(huán)境實(shí)現(xiàn),同時(shí)又充分吸收和融入了其它優(yōu)秀軟件的優(yōu)點(diǎn),如無結(jié)構(gòu)網(wǎng)格區(qū)域分解和雅可比矩陣求解等方面的功能??蓴U(kuò)展性:PETSc的可擴(kuò)展性功能主要包括三個(gè)方面:計(jì)算性能的并行可擴(kuò)展性、功能的可擴(kuò)展性和計(jì)算能力的可擴(kuò)展性。無論是在計(jì)算時(shí)間還是在浮點(diǎn)性能方面,PETSc提供的范例程序都有良好的線性加速比性能。面向?qū)ο蟮牧己迷O(shè)計(jì)風(fēng)格使得PETSc具有良好的功能擴(kuò)展能力。作為一個(gè)高級(jí)應(yīng)用程序開發(fā)平臺(tái),PETSc特別適合于用來開發(fā)大型應(yīng)用程序。抽象數(shù)據(jù)類型:PETSc基于面向?qū)ο蠹夹g(shù)實(shí)現(xiàn),具有所有面向?qū)ο筌浖目梢浦残?、可繼承性和可擴(kuò)展性等基本程序特征。PETSc的向量、矩陣等基本數(shù)據(jù)對(duì)象完全采用抽象數(shù)據(jù)類型實(shí)現(xiàn),盡量對(duì)用戶屏蔽數(shù)據(jù)對(duì)象的區(qū)域分解和存儲(chǔ)等細(xì)節(jié)。所有PETSc格點(diǎn)數(shù)據(jù)對(duì)象的劃分、初始化和存取等基本操作都由DA對(duì)象來管理和相應(yīng)PETSc庫函數(shù)實(shí)現(xiàn)。用戶基于PETSc對(duì)象可以靈活開發(fā)其應(yīng)用程序。輸出能力:PETSc具有良好的性能分析功能。同時(shí),PETSc還具有高可用性,并具有很強(qiáng)的錯(cuò)誤診斷能力。消息傳遞:PETSc所有對(duì)象和庫都是在MP工消息傳遞環(huán)境下開發(fā)。一個(gè)標(biāo)準(zhǔn)的PETSC程序本身就是一個(gè)標(biāo)準(zhǔn)MPI并行程序。唯一不同的是初始化和結(jié)束一個(gè)程序的運(yùn)行需要PETSc來管理。求解步驟:PETSc三個(gè)核心解法器的使用都包括創(chuàng)建、初始化、執(zhí)行和空間釋放幾個(gè)階段,思路清晰明確。以KSP解法器為例,PETSC程序一般分四個(gè)必要階段:1.創(chuàng)建解算子、解向量和右端向量,并填充解算子(矩陣)、設(shè)置初始解和右端向量;2.創(chuàng)建KSP環(huán)境,設(shè)置Krylov子空間方法和預(yù)條件子;3.啟動(dòng)KSP解法器;4.釋放所有存儲(chǔ)空間。但PETSC同時(shí)也具有不少缺點(diǎn)。盡管PETSC不需要用戶懂得面向?qū)ο蠹夹g(shù),但要求用戶必須基于它所提供的數(shù)據(jù)結(jié)構(gòu)來組織并行程序的開發(fā)。而最重要的是PETSC由于兼顧串行和并行應(yīng)用程序,許多線性解法器都沒有針對(duì)并行計(jì)算做相應(yīng)的優(yōu)化,這對(duì)程序的并行求解性能有著很大的影響。PETSc數(shù)據(jù)結(jié)構(gòu)組件針對(duì)于求解PDE方程的幾個(gè)關(guān)鍵的數(shù)學(xué)對(duì)象,PETSc設(shè)計(jì)了相應(yīng)的數(shù)據(jù)結(jié)構(gòu),并為其定義了抽象數(shù)據(jù)類型。此外,PETSc還在充分考慮這些數(shù)據(jù)結(jié)構(gòu)類型的使用需求及相互關(guān)聯(lián)性的基礎(chǔ)上,給出并實(shí)現(xiàn)了各種類型運(yùn)算和處理的功能操作接口,包括單類型的自身操作和跨類型的協(xié)同操作,既供用戶編程時(shí)做自由的選擇調(diào)用,也為上層的軟件模塊(方程求解器)實(shí)現(xiàn)提供足夠的基礎(chǔ)支持。這些復(fù)雜、高級(jí)數(shù)據(jù)結(jié)構(gòu)類型的設(shè)計(jì)與實(shí)現(xiàn),是PETSc優(yōu)于許多簡(jiǎn)單數(shù)值庫的一個(gè)直接原因。PETSc的數(shù)據(jù)結(jié)構(gòu)包括向量Vec,矩陣Mat以及網(wǎng)格管理對(duì)象:索引與排序,結(jié)構(gòu)網(wǎng)格DA以及無結(jié)構(gòu)網(wǎng)格的IS對(duì)象。向量Vec向量(由Vec表示)是一種最簡(jiǎn)單的PETSc對(duì)象,用于存儲(chǔ)離散PDE的解、線性方程組的右端項(xiàng)等。PETSc向量的內(nèi)涵要比我們編程常用的數(shù)組豐富得多,它可以分段存儲(chǔ)在不同的內(nèi)存空間中以適應(yīng)并行計(jì)算的需求,同時(shí)抽象與封裝的特性又使得它可以包含更全面的數(shù)據(jù)信息。用戶在編寫數(shù)值程序時(shí),往往需要用到各種不同的向量操作,如信息獲取、賦值、數(shù)據(jù)通信等訪問操作,以及內(nèi)積、求模、取最值等運(yùn)算操作。PETSc在充分考慮各類應(yīng)用需求的基礎(chǔ)上,為用戶提供了大量直觀方便、串并行使用幾乎完全一致的功能調(diào)用接口,使得用戶在編程過程中可以更多的關(guān)注于向量對(duì)象的宏觀調(diào)度,而拋開過多的具體實(shí)現(xiàn)細(xì)節(jié)。在PETSc向量的使用中,一個(gè)具體向量對(duì)象的應(yīng)用要經(jīng)過創(chuàng)建、賦值、使用(訪問、運(yùn)算等)、注銷等一系列操作過程,一個(gè)基本的應(yīng)用示范如下Vecx;申明x的類型為向量VecCreate(comm,*x);創(chuàng)建向量xVecSetType(vec,VecType);設(shè)置向量類型,有串行與并行兩種。VecSetSizes(v,n,N);設(shè)置向量的分量個(gè)數(shù)(n為局部個(gè)數(shù),N全體為個(gè)數(shù))VecSetFromOptions(x);預(yù)置置運(yùn)行時(shí)選項(xiàng),應(yīng)用程序運(yùn)行時(shí)能修改參數(shù)。VecSetValues(x,row,value,InsertMode);賦值VecDestroy(x);釋放內(nèi)存空間。對(duì)于向量的創(chuàng)建,在comm中的所有處理機(jī)都必須調(diào)用創(chuàng)建程序,因?yàn)檫@些程序在通訊器中的所有處理機(jī)上是集體性的。對(duì)于賦值語句VecSetValues()完成后必須調(diào)用VecAssemblyBegin(x)和VecAssemblyEnd(x)來執(zhí)行任意非局部分量所需的消息傳遞。PETSc向量所提供的的基本運(yùn)算有下表所示:函數(shù)名運(yùn)算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向量運(yùn)算
索引與排序在許多應(yīng)用中希望用自由度、單元、節(jié)點(diǎn)等的一種或多種“排序”(或編號(hào))。在并行環(huán)境中做這些更為復(fù)雜,因?yàn)槊恳慌_(tái)處理機(jī)不能保持不同排序之間映射的完整列表。另外,PETSc線性代數(shù)程序中所使用的排序(常是連續(xù)范圍)可能不對(duì)應(yīng)于應(yīng)用的“自然”排序。PETSc提供一些實(shí)用程序允許你清晰并有效地處理不同排序,即AO對(duì)象。用戶通過AOCreateBasic()創(chuàng)立AO對(duì)象后,可用如下命令之一AOPetscToApplication(AOao,intn,int*indices);AOApplicarionToPetsc(AOao,intn,int*indices);就可以通過在“PETSc”和“應(yīng)用”兩種排序之間映射來得到所需要的排序。而對(duì)于局部編號(hào)方案到PETSc整體編號(hào)方案映射索引,PETSc提供ISLocalToGlobalMapping語句實(shí)現(xiàn)。這通過下面的程序完成:ISLocalToGlobalMappingCreate(MPI_Comm,N,*globalnum,*ctx);ISLocalToGlobalMappingApply(ctx,n,*in,*out);ISLocalToGlobalMappingApplyIS(ctx,ISisin,isout);ISLocalToGlobalMappingDestroy(ctx);這里N表示局部索引的個(gè)數(shù),globalnum包含每個(gè)局部編號(hào)的整體編號(hào),ISLocalToGlobalMapping是所得的PETSc對(duì)象,它包含需要用ISLocalToGlobalMappingApply()或ISLocalToGlobalMappingApplyIS()應(yīng)用映射所需的信息。分布陣列DA分布陣列(DA)組件的設(shè)計(jì)是PETSc的一大特色,它是專門用于邏輯正規(guī)矩形網(wǎng)格的網(wǎng)格管理工具。DA的主要設(shè)計(jì)目的是為了獲得軟件包對(duì)矩形網(wǎng)格區(qū)域分裂(必須按行列劃分)問題的自適應(yīng)能力,對(duì)相關(guān)方程的并行求解過程完成數(shù)據(jù)通信的自動(dòng)處理。DA的設(shè)計(jì)實(shí)現(xiàn)得益于矩形網(wǎng)格的邏輯正規(guī)性,即一旦確定了區(qū)域的劃分以及網(wǎng)格上的微分方程離散格式,則計(jì)算過程中所需要的全部通信信息是能夠統(tǒng)一定位的,考慮到矩形網(wǎng)格使用的普遍性,這種高度集成的型板使用模式具有很高的應(yīng)用價(jià)值。有了DA對(duì)象,用戶處理基于矩形網(wǎng)格區(qū)域分裂的并行計(jì)算問題變得相對(duì)簡(jiǎn)單。一開始,用戶可以基于網(wǎng)格規(guī)模和處理機(jī)個(gè)數(shù)創(chuàng)建一個(gè)DA對(duì)象,這個(gè)對(duì)象將為各當(dāng)前進(jìn)程記錄下整體和局部網(wǎng)格的豐富信息,其后即可以通過使用DA對(duì)象直觀的創(chuàng)建與網(wǎng)格分布對(duì)應(yīng)的全局向量和本地局部向量,而不必重新關(guān)注向量的存儲(chǔ)分布與排序,也可以通過DA對(duì)象方便的獲取向量信息和網(wǎng)格信息等。特別的,當(dāng)局部計(jì)算需要用到非局部信息的時(shí)候,用戶可以通過調(diào)用DA操作隱式實(shí)現(xiàn)數(shù)據(jù)通信的自動(dòng)完成,而不必顯式的定位通信的操作地址,有些情況下PETSc甚至可以主動(dòng)管理通信,讓用戶徹底的擺脫對(duì)通信的安排。無結(jié)構(gòu)網(wǎng)格管理與ISPETSc利用一個(gè)索引集(IS)的概念來簡(jiǎn)化定義在非結(jié)構(gòu)化網(wǎng)格問題的映象點(diǎn)校正的向量分散與聚集。一個(gè)索引集是一個(gè)整數(shù)索引集合的推廣,用于分散、聚集及在向量和矩陣上類似的運(yùn)算。對(duì)幾乎所有的非結(jié)構(gòu)網(wǎng)格來說,通過處理機(jī)操作調(diào)入進(jìn)行網(wǎng)格的部分分配和存儲(chǔ)器在性能方面有較大的沖突。在大多數(shù)PDE計(jì)算中,在數(shù)值計(jì)算之前處理機(jī)通過一種“預(yù)處理”的方法來完成網(wǎng)格劃分和分配。但這并不意味著它需要用一種單獨(dú)的、串行的程序來完成,在實(shí)際的程序中在建立并行網(wǎng)格數(shù)據(jù)結(jié)構(gòu)之前就已經(jīng)完成。PETSc為ParMETIS提供了接口,允許用并行的方式去劃分。PETSc不能為動(dòng)態(tài)再劃分提供正確地支持,通過在兩臺(tái)處理機(jī)間移動(dòng)數(shù)據(jù)來進(jìn)行調(diào)入平衡。對(duì)需要網(wǎng)格精確加細(xì)的問題,PETSc需用重建數(shù)據(jù)結(jié)構(gòu)來逼近。2.2.2矩陣Mat與向量相同,矩陣結(jié)構(gòu)(Mat)也是微分方程數(shù)值計(jì)算的基本概念之一,但相比而言,矩陣在具體設(shè)計(jì)內(nèi)容上比向量要復(fù)雜得多,這源于矩陣結(jié)構(gòu)在實(shí)際應(yīng)用中具有更豐富的應(yīng)用策略。由于沒有單一的矩陣格式能對(duì)所有問題保持最佳,PETSc提供了多種矩陣實(shí)現(xiàn)方式,支持多種稀疏存儲(chǔ)方式(包括稠密存儲(chǔ))、多種分布存儲(chǔ)處理方式、多種矩陣索引和裝配方式等。PETSc所采用面向?qū)ο蠹夹g(shù)所帶來的功能函數(shù)的多態(tài)特質(zhì)在矩陣這種數(shù)據(jù)結(jié)構(gòu)上得到了非常明顯的體現(xiàn),即在統(tǒng)一的矩陣類型定義下,對(duì)各種不同格式矩陣的不同操作細(xì)節(jié),實(shí)現(xiàn)一種外部接口一致、內(nèi)部執(zhí)行各異。矩陣對(duì)象只要在創(chuàng)建初期按照當(dāng)前需求正確設(shè)置矩陣的內(nèi)部狀態(tài),此后對(duì)矩陣的使用是非常一般化的,PETSc會(huì)根據(jù)相應(yīng)的矩陣信息自動(dòng)實(shí)現(xiàn)對(duì)底層執(zhí)行路徑的判斷,而無須用戶關(guān)心更多的調(diào)用細(xì)節(jié)。這種接口與執(zhí)行分離的函數(shù)多態(tài)思想貫穿于PETSc的各個(gè)組件,對(duì)于簡(jiǎn)化軟件使用模式具有非常重要的意義。一個(gè)典型的例子是矩陣乘法:MatMatMult(MatA,MatB,MatReusescall,PetscRealfill,Mat*C)這一操作接口無論對(duì)稀疏矩陣、稠密矩陣,還是對(duì)串行矩陣、并行矩陣,在形式上始終如一,只要相關(guān)矩陣規(guī)模與分布是協(xié)調(diào)的,相應(yīng)的操作總能被正確執(zhí)行,這與用戶關(guān)心概念、不關(guān)心細(xì)節(jié)的應(yīng)用期望完全相符。在編程過程中,矩陣對(duì)象的使用與向量類似,也需要一個(gè)創(chuàng)建、賦值、使用、注銷的過程,矩陣對(duì)象一經(jīng)創(chuàng)建,它就具備了若干基礎(chǔ)狀態(tài),如存儲(chǔ)格式、并行劃分方式等,這些基本狀態(tài)與運(yùn)行過程中隨時(shí)被加入的其它特殊狀態(tài),是在多態(tài)函數(shù)中尋找唯一確定的執(zhí)行路徑的關(guān)鍵。由于矩陣狀態(tài)類型對(duì)程序性能的影響依賴于具體問題的具體情況,因此要想獲得最佳性能,用戶必須主動(dòng)選擇最合理的矩陣狀態(tài)類型,PETSc并不試圖讓默認(rèn)的選擇方案總是最優(yōu),而是致力于提供一個(gè)簡(jiǎn)便的選擇接口。PETSc矩陣提供的運(yùn)算函數(shù)如下表所示:函數(shù)名運(yùn)算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矩陣運(yùn)算PETSc也支持不通過顯示存儲(chǔ)整個(gè)矩陣而是通過向量運(yùn)算來實(shí)現(xiàn)矩陣的各種操作和運(yùn)算的方法,即“無矩陣”運(yùn)算(Matrix-FreeMatrices),用戶在這個(gè)環(huán)境下可以自由開發(fā)矩陣運(yùn)算程序:MatCreateShell():創(chuàng)建一個(gè)虛擬的矩陣對(duì)象UserMult():用戶編寫的矩陣向量乘積程序MatShellSetOperation():將一個(gè)用戶程序封裝到一個(gè)虛擬的矩陣對(duì)象中。
PETSc方程求解器PETSc工具箱的方程組求解器組件定義在各種數(shù)據(jù)結(jié)構(gòu)組件之上,包括線性方程組求解器KSP,非線性方程組求解器SNES,時(shí)間依賴方程解法器TS,其中線性方程組求解器是實(shí)現(xiàn)關(guān)鍵的第一步,后兩者都是以此為基礎(chǔ)的?;谶@三個(gè)求解器用戶可以開發(fā)自己的應(yīng)用程序。線性求解器KSP線性求解器KSP是PETSc的核心部分,它對(duì)軟件包的所有線性方程組解法器,包括串行和并行,直接法和迭代法,提供了統(tǒng)一和高效的訪問。對(duì)于線性方程組Ax=b,只要給出定義該方程組的數(shù)據(jù)結(jié)構(gòu)A與b,線性求解器KSP都可以通過一條簡(jiǎn)單的函數(shù)調(diào)用KSPSolve()來獲得求解。Krylov子空間方法與一個(gè)預(yù)條件子結(jié)合是大多數(shù)迭代求解線性方程組之現(xiàn)代數(shù)值代碼的核心。PETSc的線性求解器模塊就是由子空間法模塊KSP與預(yù)條件子PC模塊構(gòu)成。在版本2.20之前PETSc提供SLES對(duì)象作為最高功能的集成體,線性求解器均調(diào)用SLES接口,后該對(duì)象被移除,直接由對(duì)象KSP完成該功能。特別地,KSP對(duì)象對(duì)直接解法也提供和迭代解法相同的調(diào)用序列。一個(gè)典型的求解線性方程組的求解代碼如下:KSPCreate(comm,*ksp);創(chuàng)建一個(gè)KSP求解器的對(duì)象。KSPSetOperators(ksp,Amat,Pmat,flag);設(shè)置線性方程組的矩陣。KSPSetFromOptions(ksp);設(shè)置運(yùn)行時(shí)選項(xiàng),主要是KSP和PC選項(xiàng)。KSPSolve(ksp,b,x);運(yùn)行求解器求解。KSPDestroy(ksp);銷毀對(duì)象。對(duì)KSP軟件包的一般使用來說,上面的過程就足夠了。求解器缺省的解法器是重啟動(dòng)GMRES,單機(jī)情形預(yù)條件是ILU(0),多機(jī)情形預(yù)條件是塊Jacobi方法(每個(gè)處理機(jī)一塊,每個(gè)塊用ILU(0)求解)。用戶可通過KSPGetPC(ksp,*pc)來提取PC預(yù)條件子的環(huán)境上下文,再調(diào)用任意一個(gè)PC或KSP程序去修改相應(yīng)的缺省選項(xiàng)。PETSc的Krylov子空間方法KSP對(duì)象提供了豐富的迭代方法供用戶選擇,為設(shè)置將要使用的Krylov子空間方法,你需要調(diào)用命令:KSPSetType(ksp,KSPTypemethod);或在程序運(yùn)行時(shí)使用-ksp_typeksptype進(jìn)行修改。Krylov子空間法對(duì)象缺省的收斂檢驗(yàn)是基于剩余的l2-范數(shù)。命令:KSPSetTolerances(ksp,rtol,atol,dtol,maxits);可以設(shè)置收斂條件。運(yùn)行時(shí)選項(xiàng)-ksp_monitor或其它監(jiān)視器則顯示剩余的范數(shù)。表3總結(jié)了目前KSP所提供的迭代方法,對(duì)應(yīng)數(shù)據(jù)庫選項(xiàng)名和缺省收斂監(jiān)控器。
方法KSPType選項(xiàng)數(shù)據(jù)庫名缺省收斂監(jiān)控器+RichardsonChebychevConjugateGradientBiConjugateGradientGeneralizedMinimalResidualBiCGSTABConjugateGradientSquaredTranspose-FreeQuasi-MinimalResidual(1)Transpose-FreeQuasi-MinimalResidual(2)ConjugateResidualLeastSquaresMethodShellfornoKSPmethodKSPRICHARDSONKSPCHEBYCHEVKSPCGKSPBICGKSPGMRESKSPBCGSKSPCGSKSPTFQMRKSPTFCQMRKSPCRKSPLSQRKSPPREONLYrichardsonchebychevcgbicggmresbcgscgstfqmrtcqmrcrlsqrpreonlytruetruetruetrueprecondprecondprecondprecondprecondprecondprecondprecond+true–表示真實(shí)剩余范數(shù),precond–表示預(yù)條件剩余范數(shù)表3:KSP方法.缺省時(shí)所有方法使用左預(yù)條件Krylov空間方法常與一個(gè)預(yù)條件子結(jié)合使用,表4中總結(jié)了PETSc支持的基本預(yù)條件方法,詳細(xì)的使用可查閱相關(guān)資料。方法PCType選項(xiàng)數(shù)據(jù)庫名JacobiBlockJacobiSOR(andSSOR)SORwithEisenstattrickIncomleteCholeskyIncompleteLUAdditiveSchwarzLinearSolverCombinationofPreconditionersPCJACOBIPCBJACOBIPCSORPCEISENSTATPCICCPCILUPCASMPCSLESPCCOMPOSITEjacobibjacobisoreisenstaticciluasmslescompositeLUCholeskyNopreconditioningShellforuser-definedPCPCLUPCCholesyPCNONEPCSHELLlucholeskynoneshell表4:PETSc預(yù)條件子對(duì)于奇異線性方程組,即系數(shù)矩陣具有零空間,例如離散具有Neumann邊界條件的Laplace算子,PETSc也提供工具來幫助求解這些方程組。用戶需用PETSc的Vecs的陣列形式的正交基來存儲(chǔ)它,然后通過MatNullSpaceCreate()創(chuàng)建一個(gè)MatNullSpace對(duì)象,再通過語句PCNullSpaceAttach()然后將零空間傳遞給PC對(duì)象。非線性求解器SNESPETSc的非線性求解器建立在線性解法器和數(shù)據(jù)結(jié)構(gòu)之上,它能夠使用戶輕松地根據(jù)實(shí)際應(yīng)用來定制非線性解法器。SNES對(duì)象求解形如F(x)=0非線性方程的方法,其中F:Rn→Rn。Newton型方法是軟件包的核心,包括線搜索和信賴域技術(shù)。依據(jù)PETSc的設(shè)計(jì)原則,各種求解器的接口實(shí)際上是一致的,唯一的區(qū)別是并行版本里每臺(tái)處理機(jī)特有地形成對(duì)各種矩陣和向量局部貢獻(xiàn)。另外,SNES軟件完全靈活地使用戶可以在運(yùn)行時(shí)修改求解過程的任何方面。在非線性解法器最簡(jiǎn)單的用法中,用戶只需提供一個(gè)求方程之非線性函數(shù)的C、C++或Fortran程序,相應(yīng)的Jacobi矩陣可用有限差分來近似。對(duì)典型更有效和更精確的代碼,用戶可以提供程序來計(jì)算Jacobi矩陣。一般使用SNES可依次調(diào)用以下語句來實(shí)現(xiàn),其中SNESSetFunction(),SNESSetJacobian()兩語句的具體參數(shù)沒有給出。SNESCreate(comm,*snes);創(chuàng)建SNES環(huán)境,得到非線性求解器snes。SNESSetFunction();設(shè)置函數(shù)求值程序。SNESSetJacobian();設(shè)置jacobi矩陣求值程序。SNESSetFromOptions(snes);預(yù)置運(yùn)行時(shí)選項(xiàng)。SNESSetTolerances(snes,abstol,rtol,stol,maxit,maxf);迭代終止設(shè)置。SNESDestroy(snes);注銷SNES對(duì)象。如表5列出了SNES包含基于線搜索技術(shù)和信賴域方法的幾個(gè)Newton型非線性解法器以及收斂性的檢測(cè)方法。每個(gè)解法器也許都有與其相關(guān)的一組選項(xiàng),這些選項(xiàng)可以用專門為此目的所提供的程序和選項(xiàng)庫命令來設(shè)定。查詢手冊(cè)頁或者在運(yùn)行程序時(shí)用-help選項(xiàng)可以見到一個(gè)完整的列表。方法SNESType選項(xiàng)名缺省收斂檢驗(yàn)LinesearchTrustregionTestJacobianSNESLSSNESTRSNESTESTlstrtestSNESConverged_LS()SNESConverged_TR()表5:PETSc非線性解法器SNES完全支持自由矩陣方法。在Jacobi矩陣求值程序中指定的矩陣不需要是常規(guī)矩陣,代之以指向?qū)崿F(xiàn)一個(gè)特殊矩陣自由方法要求的數(shù)據(jù)。矩陣自由形式僅用于解線性方程組是用迭代法結(jié)合非預(yù)條件(PCNONE或-pc_typenone)、用戶提供的預(yù)條件子矩陣,或預(yù)條件子殼(PCSHELL),不能用于直接解法器。語句MatCreateSNESMF(SNESsnes,Mat*J)可以創(chuàng)建在SNES中使用的矩陣自由環(huán)境。時(shí)間步進(jìn)求解器TSTS組件為由時(shí)間相關(guān)PDEs離散化和用擬時(shí)間步的穩(wěn)態(tài)問題離散化產(chǎn)生的ODEs可擴(kuò)展求解提供了一個(gè)框架。TS主要求解如下時(shí)間依賴問題:其中為有限維解向量,上式通常為運(yùn)用有限差分或有限元方法離散后的常微分方線性程組。對(duì)于非時(shí)間演化或穩(wěn)態(tài)方程,PETSc提供了偽時(shí)間步進(jìn)積分器。TS最終依賴線性解法器SLES和非線性解法器SNES來實(shí)現(xiàn)。TS的一般使用步驟如下:TSCreate(comm,problemtype,*ts);創(chuàng)建一個(gè)TS對(duì)象ts。TSProblemType是TS_LINEAR或TS_NONLINEAR其中之一,用來表明是否F(u,t)是由矩陣A,或A(t),或一個(gè)函數(shù)F(u,t)給出的。TSSetType(ts,type);來設(shè)置求解方法。目前所支持的類型是TS_EULER、TS_BEULER和TS_PSEUDO。TSSetInitialTimeStep(ts,time,dt);設(shè)置初始時(shí)間和時(shí)間步。TSSetTimeStep(ts,dt);改變時(shí)間步。TSSetDuration(ts,maxsteps,maxtime);設(shè)置運(yùn)行的時(shí)間步的總數(shù)或者運(yùn)行的總時(shí)間。TSSetUp(ts);建立時(shí)間步關(guān)系。TSDestroy(ts);釋放空間。TS對(duì)于解時(shí)間相關(guān)問題和具有擬時(shí)間步的穩(wěn)態(tài)問題有略微不同的設(shè)置處理,可詳查用戶手冊(cè)。另外,TS組件提供一個(gè)直接從PETSc使用由Hindmarsh等在LLNL開發(fā)的并行ODE解法器PVODE的接口。
其它重要的PETSc功能PETSc工具箱還提供了性能分析、圖形打印、錯(cuò)誤檢測(cè)等方面的功能。PETSc不僅能為應(yīng)用程序提供完整的計(jì)算時(shí)間、存儲(chǔ)代價(jià)和浮點(diǎn)性能方面的信息,還能為計(jì)算的每個(gè)階段和每個(gè)程序?qū)ο筇峁┰敿?xì)的信息。另外,PETSc在軟件接口方面的功能也將在這一節(jié)介紹。2.4.1性能分析(Profiling)PETSc包含一個(gè)允許對(duì)應(yīng)用程序進(jìn)行預(yù)置的方案,該方案既一致又簡(jiǎn)便。如果在運(yùn)行時(shí)指定某些選項(xiàng),PETSc程序自動(dòng)記錄性能數(shù)據(jù)。用戶也可用一個(gè)完整的性能圖記錄應(yīng)用程序代碼的信息。如果應(yīng)用程序代碼和PETSc庫已經(jīng)用--with-debugging=1標(biāo)志編譯過,則在PetscInitialize()和PetscFinalize()調(diào)用之間代碼的多種性能分析預(yù)置的代碼可被激活。PETSc的性能分析功能主要包括計(jì)算時(shí)間、浮點(diǎn)性能、存儲(chǔ)開銷和通信性能幾個(gè)方面的評(píng)價(jià)。PETSc提供了以下三個(gè)運(yùn)行選項(xiàng):1、-log_summary在程序結(jié)束時(shí)打印一個(gè)ASCII形式的性能數(shù)據(jù)。這些統(tǒng)計(jì)數(shù)據(jù)是綜合的、簡(jiǎn)潔的且基本上不需要開銷,因此,-log_summary已作為PETSc代碼性能監(jiān)控的首選方式。除了PETSc庫組織的每個(gè)程序的性能數(shù)據(jù),用戶也可以通過該選項(xiàng)得到自定義事件的性能數(shù)據(jù)。在程序內(nèi)調(diào)用PetscLogPrintSummary()函數(shù)也可以達(dá)到這樣的效果。2、-info[infofile]在屏幕上打印代碼的詳細(xì)信息或輸出到文件。該選項(xiàng)提供關(guān)于算法、數(shù)據(jù)結(jié)構(gòu)等的細(xì)節(jié),由于打印這些輸出信息的開銷降低了代碼的速度,在評(píng)價(jià)一個(gè)程序的性能時(shí)不要使用本選項(xiàng)。同樣在程序中使用PetscInfoAllow(PETSC_TRUE)也可以得到這些數(shù)據(jù)3、-log_trace[logfile]跟蹤所有PETSc事件的開始和結(jié)束。該選項(xiàng)對(duì)程序不在調(diào)試器中運(yùn)行而檢查到程序在何處掛起是有用的,它可與-log_info聯(lián)合使用。運(yùn)行時(shí)選項(xiàng)(Runtimeoption)PETSc提供了一個(gè)簡(jiǎn)單的機(jī)制允許用戶在運(yùn)行時(shí)可以修改程序的參數(shù)和選項(xiàng)。例如,當(dāng)解一個(gè)線性方程組時(shí),通過調(diào)用語句:KSPSetType(ksp,KSPCG);可以明確地指定使用Krylov子空間方法為共軛梯度法CG。然后,可以在運(yùn)行時(shí)使用選項(xiàng)-ksp_typegmres來選擇廣義最小殘量法GMRES算法來覆蓋上述選擇,這種參數(shù)的改變只需要在程序中預(yù)置KSPSetFromOptions(KSPksp)即可實(shí)現(xiàn)。事實(shí)上每一個(gè)PETSc進(jìn)程都維護(hù)一個(gè)選項(xiàng)名和值的數(shù)據(jù)庫(以文本字符串的方式存儲(chǔ))。代碼PetscInitialize(int*argc,char***args,char*file,char*help)即可生成該庫,其中參數(shù)argc,args(僅僅在C/C++中)是通常的命令行參數(shù),而file是能夠包括附加選項(xiàng)的文件名。在這之后若預(yù)置了XXXSetFromOption就可以在運(yùn)行時(shí)使用-package_option來改變?cè)撨x項(xiàng),其中XXX是Petsc對(duì)象,如Vec,KSP等。在運(yùn)行PETSc程序時(shí)使用-h或-help可以查看所有可用選項(xiàng)。通過語句PetscOptionsSetValue(char*name,char*value)可以向選項(xiàng)數(shù)據(jù)庫增加自定義內(nèi)容,然后通過一系列的設(shè)置使應(yīng)用程序也具有運(yùn)行時(shí)選項(xiàng)。閱讀器(Viewer)用戶可以通過閱讀器(Viewer)來查看PETSc對(duì)象,調(diào)用命令:XXXView(XXXobj,PetscViewerviewer);用統(tǒng)一的方案去檢測(cè)、打印、保存對(duì)象XXX至閱讀器viewer。這里Obj是類型為XXX的任一PETSc對(duì)象,其中XXX是Mat,Vec,SNES等。PETSc中還有許多預(yù)定義的閱讀器,如PETSC_VIEWER_STDOUT_SELF和PETSC_VIEWER_STDOUT_WORLD可將對(duì)象打印到屏幕上。為把對(duì)象以ASCII格式存儲(chǔ)在一個(gè)文件中,用戶調(diào)用命令:PetscViewerASCIIOpen(comm,filename,*viewer)可打開或創(chuàng)建文本閱讀器對(duì)象,(若將函數(shù)名中ASCII改為Binary則是打開或創(chuàng)建類型為二進(jìn)制),然后調(diào)用語句XXXView(),就可以以二進(jìn)制格式輸出PETSc對(duì)象XXX。二進(jìn)制對(duì)象的輸入的相應(yīng)程序形式為xxxload(),特別地,矩陣和向量的二進(jìn)制輸入用以下兩個(gè)程序處理:Matload(PetscViewerviewer,MatTypeouttype,Mat*newmat);Vecload(PetscViewerviewer,Vecnewvec);若閱讀器的通信器具有不止一個(gè)處理器,這些程序?qū)⑸刹⑿芯仃嚭拖蛄?。圖形輸出(Draw)PETSc也擁有自己的圖形庫來實(shí)現(xiàn)與PETSc程序交互使用,但圖形分辨率稍低。為了繪制一個(gè)預(yù)先定義的PETSc對(duì)象,如矩陣和向量,則首先用命令PetscViewerDrawOpenX(comm,*display,*title,x,w,h,*viewer);創(chuàng)建一個(gè)閱讀器。這個(gè)閱讀器可被傳遞給任何xxxView()程序。要在閱讀器中繪圖,必須用命令PetscViewerDrawGetDraw(viewer,*draw);獲得Draw對(duì)象。然后,可在draw對(duì)象上調(diào)用任一PetscDrawXXX命令進(jìn)行繪圖。預(yù)定義閱讀器PETSC_VIEWER_DRAW_WORLD和PETSC_VIEWER_DRAW_SELF可隨時(shí)使用,它們的首次使用可創(chuàng)建適當(dāng)?shù)拇翱凇ETSc包括一個(gè)處理簡(jiǎn)單二維圖形的程序集,用戶使用這畫線程序能繪制簡(jiǎn)單的線圖。PETSc與其它軟件的接口PETSc可擴(kuò)展性的另一個(gè)方面表現(xiàn)在其為非常廣泛的一類數(shù)值軟件和數(shù)學(xué)庫提供了很方便的軟件接口。主要包括以下幾種類型:1.線性代數(shù)求解器,如AMG、BlockSolve95、DSCPACK、hypre、ILUTP、LUSOL、SPAI、SPOOLES、SuperLU、SuperLU_Dist;2.最優(yōu)化軟件,如TAO、Veltisto;3.離散化和網(wǎng)格生成和優(yōu)化工具包,如Overture、SAMRAI、SUMAA3d;4.常微分方程求解器,如PVODE;5.其它,如Matlab、ParMETIS。這里我們將簡(jiǎn)要地介紹PETSc手冊(cè)中描述的幾個(gè)軟件和庫。1、DMMGPETSc為DMMG提供了高端訪問的接口,并最終通過DA對(duì)象(或DMComposite對(duì)象)來實(shí)現(xiàn)在各處理器間的網(wǎng)格劃分。這里DMMG代碼建立在MG的PCType中提供的較低層PETSc多重網(wǎng)格接口的頂部,目前DMMG僅提供了分段線性插值方法和線性多重網(wǎng)格預(yù)條件子,但在實(shí)際應(yīng)用程序開發(fā)中很容易得到擴(kuò)展。2、ADIC/ADIFORADIC/ADIFOR是自動(dòng)微分工具中的典型代表,它用來生成可直接從求解函數(shù)值的代碼來計(jì)算Jacobi矩陣及其它微分的代碼。PETSc通過DMMG高端訪問接口為引用ADIC/ADIFOR計(jì)算稀疏Jacobi矩陣并用它們執(zhí)行矩陣自由微量乘積。3、MatlabPETSc為用戶使用Matlab提供了三種方式:PETSc輸出一系列文件給Matlab;從正在運(yùn)行的PETSc程序中傳遞數(shù)據(jù)給Matlab;在PETSc和Matlab之間交互傳遞數(shù)據(jù)。其中后兩種方式需要Matlab提供的實(shí)時(shí)指令或腳本文件。
PETSc的程序結(jié)構(gòu)在使用PETSc之前,用戶必須首先設(shè)置環(huán)境變量PETSC_DIR,指出PETSc主目錄的完全路徑。另外,環(huán)境變量PETSC_ARCH來說明將在其上使用PETSc的編譯選項(xiàng)和機(jī)器結(jié)構(gòu)(如linux-gnu-debug、cygwin-c-debug等),用戶可以指定不同的PETSC_ARCH來編譯不同選項(xiàng)的PETSc庫。對(duì)消息傳遞通訊,所有PETSc程序都使用MPI(MessagePassingInterface)標(biāo)準(zhǔn)。因此,為執(zhí)行PETSc程序,用戶必須知道在其所用計(jì)算機(jī)系統(tǒng)上開始MPI工作的過程。所有PETSc允許的程序都支持選項(xiàng)–h或-help以及選項(xiàng)–v或–version的使用。大多數(shù)基于PETSc的程序開始于一個(gè)調(diào)用:PetscInitialize(int*argc,char***argv,char*file,char*help);它初始化PETSc和MPI。參數(shù)argc和argv是所有C和C++程序中傳送的命令行參數(shù)。參數(shù)file任意代表PETSc選項(xiàng)文件一個(gè)可選的名.petscrc,它缺省駐留在用戶的主目錄。最后的參數(shù)help,是一個(gè)可選的字符串,如果程序帶有–help選項(xiàng)地運(yùn)行,則將打印此字符串。若在此之前MPI尚未被初始化,則PetscInitialize()自動(dòng)調(diào)用MPI_Init()。所有PETSc程序都返回一個(gè)整數(shù)以表明調(diào)用期間是否出錯(cuò)。如果探測(cè)到錯(cuò)誤,則錯(cuò)誤代碼被置為非零,否則置為零。對(duì)C/C++接口,錯(cuò)誤變量是程序的返回值,而對(duì)Fortran,每個(gè)PETSc程序都有一個(gè)整數(shù)錯(cuò)誤變量作為最后一個(gè)參數(shù)。語句PetscFinalize()則作為所有PETSc程序最后(或幾乎最后)調(diào)用,這個(gè)程序處理程序結(jié)尾處在調(diào)用的選項(xiàng),如果MPI是由PetscInitialize()開始的,則它也調(diào)用MPI_Finalize()。一般來說,非線性求解器SNES會(huì)調(diào)用KSP來解線性方程組,而時(shí)間步進(jìn)求解器則會(huì)最終依賴于線性求解器KSP和非線性求解器SNES實(shí)現(xiàn)。
PETSc的Fortran編程雖然PETSc建議用戶通過C/C++來使用工具箱,但純粹用Fortran77或Fortran90編程的用戶能得到PETSc的大多數(shù)功能。C和Fortran的PETSc接口之間只有一點(diǎn)區(qū)別,而這些都是由于Fortran77語法中的區(qū)別。所有Fortran的PETSc程序與相應(yīng)的C版本的相同的名字,且完全由PETSc命令行選項(xiàng)所支持。程序的參數(shù)遵循通常Fortran慣例,用戶無需擔(dān)心傳送指針或值。除了錯(cuò)誤檢測(cè)變量和一些特殊情況外,F(xiàn)ortran版本的調(diào)用序列在大多數(shù)情形中與C版本相同。以下為PETSc的Fortran編程中應(yīng)注意的兩點(diǎn):1、Fortran的PETSc包含文件位于目錄${PETSC_DIR}/include/finclude之中且通過如下語句被使用:#include“include/finclude/includefile.h”由于用戶必須細(xì)致地在Fortran程序中包含每個(gè)文件不超過一次,應(yīng)用程序員必須手工地在其程序中包含PETSc庫所需的每個(gè)文件。這里與PETScC/C++接口不同,C/C++接口用戶只需包含最高層文件,例如,petscsnes.h,然后自動(dòng)包含所有較低層文件。2、在Fortran版本中,每個(gè)PETSc程序以一個(gè)整型錯(cuò)誤變量作為其最后一個(gè)參數(shù),這與提供錯(cuò)誤變量作為程序的返回值的C慣例不同。如果探測(cè)到錯(cuò)誤,錯(cuò)誤代碼被置為非零,否則,它被置為0。例如,下面分別給出求解線性方程組語句KSPSSolve()的Fortran和C形式,其中ierr代表錯(cuò)誤變量:callKSPSolve(KSPksp,Vecb,Vecx,PetscErrorCodeierr)KSPSolve(KSPksp,Vecb,Vecx);Fortran程序員可用CHKERRQ(ierr)檢測(cè)這些錯(cuò)誤代碼,當(dāng)遇到錯(cuò)誤時(shí),它終止所有進(jìn)程。類似地,可用SETERRQ(ierr,p,’’)在Fortran程序中設(shè)置錯(cuò)誤代碼,它也依賴于一個(gè)錯(cuò)誤的探測(cè)來終止所有進(jìn)程。由于完整的錯(cuò)誤返饋需要用到CHKERRQ()和SETERRQ()來完成,這對(duì)Fortran程序是不能直接被支持的,但Fortran程序員可容易地使用錯(cuò)誤代碼編寫自己的返饋。例如,可用如下代碼:callKSPSolve(ksp,b,x,ierr)if(ierr.ne.0)thenprint*,’Errorinroutine…’returnendif而且PETSc的Fortran代碼失敗的最常見的原因是忘了最后的ierr參數(shù)。另外,由于Fortran77不提供輸入/輸出參數(shù)類型檢測(cè),許多PETSc的Fortran程序中遇到的錯(cuò)誤是由于偶然錯(cuò)誤地使用調(diào)用序列。這些錯(cuò)誤當(dāng)使用C/C++編譯期間立即能被探測(cè)到。因此,對(duì)期望在其應(yīng)用程序中用Fortran作為核心數(shù)值程序的程序員來說,用C/C++與Fortran混合編程常工作很好。特別地,可用C/C++編寫PETSc驅(qū)動(dòng)程序,從而保持程序中的靈活性,并對(duì)將在進(jìn)行的數(shù)值計(jì)算仍用Fortran。其他一些由于Fortran編程而產(chǎn)生的差異可以閱讀用戶手冊(cè)。PETSc編譯和使用PETSc的開發(fā)者提供了源碼,用戶需要現(xiàn)將其編譯成庫的形式后再在此基礎(chǔ)上編寫基于PETSc的程序。目前PETSc支持Linux/Unix和Windows兩類系統(tǒng)的編譯,前者較為簡(jiǎn)單,本節(jié)著重介紹PETSc在Windows系統(tǒng)下的編譯和使用。2.7.1在Linux/Unix上編譯PETSc用戶可從/petsc/免費(fèi)下載到PETSc的最新版本,當(dāng)前的版本為2011年9月發(fā)布的petsc-3.2。在安裝PETSc之前,用戶首先要配置MPI(只使用PETSc串行功能的用戶除外),并且需要BLAS、LAPACK的靜態(tài)庫的支持。以下為petsc-3.2-p6.tar在LINUX/UNIX環(huán)境下的安裝:解壓文件:$tar-zxfpetsc-3.2-p6.tar;設(shè)置環(huán)境變量:$cdpetsc-3.2-p6;PETSC_DIR=$PWD;PETSC_ARCH=linux-gnu-c-debug;其中PETSC_DIR指出PETSc主目錄的完全路徑,PETSC_ARCH來說明將在其上使用PETSc的機(jī)器結(jié)構(gòu)和編譯選項(xiàng)(如,linux-gnu-c-debug、cygwin-c-debug等),用戶可以自己命名。配置系統(tǒng):$./configure;編譯:$makeall;測(cè)試:$maketest;編譯成功后在PETSC_DIR/PETSC_ARCH/lib文件夾下就可以得到一個(gè)90M左右的libpetsc.a文件,該文件即PETSc靜態(tài)鏈接庫。若用戶在配置時(shí)選項(xiàng)加上--with-shared還可以將其編譯成相應(yīng)的共享庫libpetsc.so,其余的配置選項(xiàng)可使用./configure–help查看或者閱讀PETSc安裝說明。在Windows上編譯PETSc以下為在Windows系統(tǒng)上編譯PETSc的一種途徑:編譯準(zhǔn)備:1、PETSc的一個(gè)版本同上述Linus下安裝文件一樣,從/petsc/上免費(fèi)下載petsc-3.2-p6.tar.gz。2、MPI的實(shí)現(xiàn)作為PETSc的底層結(jié)構(gòu)之一,用戶系統(tǒng)需要安裝MPICH的一個(gè)版本(只使用PETSc串行功能的除外),一般從/mpi/mpich上可以下載其Windows下安裝文件mpich2-1.3-win-ia32.msi,直接點(diǎn)擊安裝即可。安裝完畢后需要將用戶注冊(cè)至MPICH2。3、MS編譯器,由于最終需要將PETSc編譯成Windows系統(tǒng)下的庫文件,故需要Windows的C編譯器和Fortran編譯器,本文安裝使用VisualStudio2005中的cl.exe編譯器和IntelFortranCompiler10.1中的ifort.exe編譯器,安裝時(shí)注意需要將Inter的Fortran編譯器集成到VisualStudio中去(Intel的Fortran能自動(dòng)集成)。4、Linux環(huán)境的模擬為了得到Linux風(fēng)格的環(huán)境,PETSc推薦使用Cygwin。Cygwin是一個(gè)用于Windows環(huán)境下的模擬UNIXshell環(huán)境,它由兩個(gè)組件組成:一個(gè)UNIXAPI庫,它模擬UNIX操作系統(tǒng)提供的許多特性。另一部分為Bashshell的改寫版本和許多UNIX實(shí)用程序,它們提供大家熟悉的UNIX命令行界面。前一個(gè)組件是一個(gè)Windows動(dòng)態(tài)鏈接庫(DLL)。后一個(gè)組件是一組基于CygwinDLL的程序,其中許多是用未經(jīng)修改的UNIX源代碼編譯的。它們合在一起提供大家熟悉的UNIX環(huán)境。Cygwin具體操作如下:Ⅰ用戶可以到主頁上下載Cygwin的安裝向?qū)etup.exe。該setup.exe文件可以用于安裝軟件,添加、修改或升級(jí)Cygwin配置的組件。Ⅱ運(yùn)行setup.exe引導(dǎo)安裝,由于Cygwin的完整安裝版本很大,往往先將其下載至本地再安裝,然后指定下載目錄和下載鏈接。國內(nèi)也有網(wǎng)站能提供鏡像下載。Ⅲ下載完畢后再運(yùn)行setup.exe,選擇上本地安裝,指定安裝文件目錄和安裝目錄后即可安裝,建議完整版本的安裝。整個(gè)安裝過程將會(huì)持續(xù)1-2個(gè)小時(shí)。編譯階段1、從編譯器的命令提示
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國三相可控硅直流調(diào)速裝置數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國HIPS塑膠料數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 勞動(dòng)合同(20XX年完整版)
- 遺產(chǎn)繼承金融資產(chǎn)管理合同(2篇)
- 采購與分包管理合同(2篇)
- 高等教育自學(xué)考試《00074中央銀行概論》模擬試卷三
- 新浪樂居萬達(dá)中央旅游城歲末營銷方案
- 《人工智能應(yīng)用與發(fā)展:高中人工智能學(xué)習(xí)指南》
- 商業(yè)推廣項(xiàng)目合作協(xié)議書
- 環(huán)保技術(shù)研發(fā)與推廣戰(zhàn)略合作協(xié)議
- 控制計(jì)劃課件教材-2024年
- 川教版2024-2025學(xué)年六年級(jí)下冊(cè)信息技術(shù)全冊(cè)教案
- 第45屆世界技能大賽移動(dòng)機(jī)器人項(xiàng)目福建省選拔賽技術(shù)文件(定稿)
- 招標(biāo)代理機(jī)構(gòu)遴選投標(biāo)方案(技術(shù)標(biāo))
- 彩鋼瓦雨棚施工技術(shù)標(biāo)準(zhǔn)方案
- 2024年新疆(兵團(tuán))公務(wù)員考試《行測(cè)》真題及答案解析
- 吊車施工專項(xiàng)方案
- 三級(jí)安全教育試題(公司級(jí)、部門級(jí)、班組級(jí))
- 罐區(qū)安全培訓(xùn)教程
- 副總經(jīng)理招聘面試題與參考回答(某大型央企)2025年
- 2024新能源風(fēng)電場(chǎng)消防系統(tǒng)檢修規(guī)程
評(píng)論
0/150
提交評(píng)論