本文基本上是官方手冊的翻譯,原文戳這裏。
從哪兒下手
符號鏈接pyfr
指向腳本_main_.py
,一切開始於此。具體地說,函數process_run
調用_process_common
,進而調用get_solver
,返回一個Integrator,即Controller和Stepper的複合體。Integrator包含一個方法run
,調用它來運行仿真。
Controller
Controller負責沿時間推進仿真。具體地說,Controller包含一個方法advance_to
,把仿真推進到一個特定的時間。PyFR 1.9.0提供三種物理時間Controller:
pyfr.integrators.std.controllers.StdNoneController
pyfr.integrators.std.controllers.StdPIController
pyfr.integrators.dual.phys.controllers.DualNoneController
各種物理時間Controller的繼承關係如圖:
除了物理時間,還有兩種僞時間Controller:
pyfr.integrators.dual.pseudo.pseudocontrollers.DualNonePseudoController
pyfr.integrators.dual.pseudo.pseudocontrollers.DualPIPseudoController
繼承關係爲:
Stepper
Stepper負責把仿真推進一個時間步。具體地說,Stepper包含一個方法step
,把System推進一個時間步。有八種Stepper:
-
pyfr.integrators.std.steppers.StdEulerStepper
-
pyfr.integrators.std.steppers.StdRK4Stepper
-
pyfr.integrators.std.steppers.StdRK34Stepper
-
pyfr.integrators.std.steppers.StdRK45Stepper
-
pyfr.integrators.std.steppers.StdTVDRK3Stepper
-
pyfr.integrators.dual.phys.steppers.DualBDF2Stepper
-
pyfr.integrators.dual.phys.steppers.DualBDF3Stepper
-
pyfr.integrators.dual.phys.steppers.DualBackwardEulerStepper
繼承關係爲:
同樣也有僞Stepper,把仿真推進一個僞時間步。通過一個雙時間步形式,可以用它們使隱式Stepper時間步收斂。有六種僞Stepper:
-
pyfr.integrators.dual.pseudo.pseudosteppers.DualDenseRKPseudoStepper[source]
-
pyfr.integrators.dual.pseudo.pseudosteppers.DualRK4PseudoStepper[source]
-
pyfr.integrators.dual.pseudo.pseudosteppers.DualTVDRK3PseudoStepper[source]
-
pyfr.integrators.dual.pseudo.pseudosteppers.DualEulerPseudoStepper[source]
-
pyfr.integrators.dual.pseudo.pseudosteppers.DualRK34PseudoStepper[source]
-
pyfr.integrators.dual.pseudo.pseudosteppers.DualRK45PseudoStepper
注意其中的DualDenseRKPseudoStepper
包含一類僞Stepper,其係數讀取自遵循如下命名規範的.txt
文件:
{scheme name}-s{stage count}-p{temporal order}-sp{optimal spatial polynomial order}.txt
繼承關係爲:
System
System包含系統的各種信息,包括Elements, Interfaces和後端Backend。System包含一個方法rhs
(right-hand-side縮寫),用於獲取每個solution point上的通量散度(即方程的右端項)。rhs
啓動預先生成並加載到隊列裏的各種kernel。System還包含一個方法_gen_kernels
,用於生成System需要的所有kernel。kernel是一個"一次性"類的實例,包含一個方法run
用於實現需要的功能。每個kernel都由一個kernel提供者生成。PyFR有許多類型的kernel提供者。一個Pointwise Kernel Provider(逐點kernel提供者)生成逐點kernel,比如黎曼求解器和通量函數等。這些逐點kernel是用一種修改版本的Mako,即PyFR-Mako實現的。下文有介紹,更多請參閱Mako官網。有四種System供選擇:
pyfr.solvers.aceuler.system.ACEulerSystem
pyfr.solvers.acnavstokes.system.ACNavierStokesSystem
pyfr.solvers.euler.system.EulerSystem
pyfr.solvers.navstokes.system.NavierStokesSystem
繼承關係爲:
Elements
Elements(注意s)包含一組單元信息。有四種Elements:
pyfr.solvers.aceuler.elements.ACEulerElements
pyfr.solvers.acnavstokes.elements.ACNavierStokesElements
pyfr.solvers.euler.elements.EulerElements
pyfr.solvers.navstokes.elements.NavierStokesElements
繼承關係爲:
Interfaces
Interfaces(注意s)包含一組界面信息。有八種(非邊界)界面:
-
pyfr.solvers.aceuler.inters.ACEulerIntInters
-
pyfr.solvers.aceuler.inters.ACEulerMPIInters
-
pyfr.solvers.acnavstokes.inters.ACNavierStokesIntInters
-
pyfr.solvers.acnavstokes.inters.ACNavierStokesMPIInters
-
pyfr.solvers.euler.inters.EulerIntInters
-
pyfr.solvers.euler.inters.EulerMPIInters
-
pyfr.solvers.navstokes.inters.NavierStokesIntInters
-
pyfr.solvers.navstokes.inters.NavierStokesMPIInters
繼承關係爲:
Backend
Backend包含了後端信息。有三種(原文是四種,疑似筆誤)後端可選:
pyfr.backends.cuda.base.CUDABackend
pyfr.backends.opencl.base.OpenCLBackend
pyfr.backends.openmp.base.OpenMPBackend
繼承關係爲:
逐點kernel提供者
逐點kernel提供者(簡寫爲PKP)負責逐點生成kernel。具體地說,PKP包含一個方法register
,負責把一個新方法添加到一個PKP實例裏。這個新方法被調用時會返回一個kernel。所謂的kernel,是一個“一次性”類的實例,其包含的方法run
用於實現需要的功能。kernel的功能由PyFR-Mako實現,因此PKP還包含一個方法_render_kernel
,用於把PyFR-Mako渲染爲底層代碼。_render_kernel
首先爲Mako設定上下文(例如Backend細節等),然後使用Mako渲染PyFR-Mako內容。當Mako遇到一個pyfr:kernel
時,會創建一個kernel生成器的實例,用於渲染pyfr:kernel
的主體內容。有三種(原文寫作四種,疑似筆誤)PKP可選:
pyfr.backends.cuda.provider.CUDAPointwiseKernelProvider
pyfr.backends.opencl.provider.OpenCLPointwiseKernelProvider
pyfr.backends.openmp.provider.OpenMPPointwiseKernelProvider
繼承關係爲:
Kernel生成器
Kernel生成器把pyfr:kernel
中的PyFR-Mako渲染爲底層代碼。具體地說,kernel生成器包含一個方法render
。有三種(原文寫作四種,疑似筆誤)kernel生成器:
pyfr.backends.cuda.generator.CUDAKernelGenerator
yfr.backends.opencl.generator.OpenCLKernelGenerator
pyfr.backends.openmp.generator.OpenMPKernelGenerator
繼承關係爲:
後記
該網頁最後有關於PyFR-Mako的介紹,放在下一篇翻譯。