PyFR开发指南(一):程序框架

本文基本上是官方手册的翻译,原文戳这里

从哪儿下手

符号链接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的介绍,放在下一篇翻译。

猜你喜欢

转载自blog.csdn.net/iamzhtr/article/details/103114664