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的介紹,放在下一篇翻譯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章