本文基本上是官方手册的翻译,原文戳这里。
从哪儿下手
符号链接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的介绍,放在下一篇翻译。