Guía de desarrollo de PyFR (1): marco del programa

Este artículo es básicamente una traducción del manual oficial Haga clic aquí para ver el texto original .

Donde empezar

El enlace simbólico pyfrapunta al guión _main_.pyy todo comienza aquí. Específicamente, la process_runllamada a la función _process_common, y luego la llamada get_solver, devuelve un integrador, es decir, un compuesto de controlador y paso a paso. Integrator contiene un método run, que se llama para ejecutar la simulación.

Controlador

El controlador es responsable de hacer avanzar la simulación a lo largo del tiempo. Específicamente, el controlador contiene un método advance_topara hacer avanzar la simulación a un tiempo específico. PyFR 1.9.0 proporciona tres controladores de tiempo físicos:

  • pyfr.integrators.std.controllers.StdNoneController
  • pyfr.integrators.std.controllers.StdPIController
  • pyfr.integrators.dual.phys.controllers.DualNoneController

La relación de herencia de varios controladores de tiempo físico se muestra en la figura:
Inserte la descripción de la imagen aquíAdemás del tiempo físico, hay dos controladores de pseudo-tiempo:

  • pyfr.integrators.dual.pseudo.pseudocontrollers.DualNonePseudoController
  • pyfr.integrators.dual.pseudo.pseudocontrollers.DualPIPseudoController

La relación de herencia es:
Inserte la descripción de la imagen aquí

Paso a paso

Stepper es responsable de hacer avanzar la simulación un paso de tiempo. Específicamente, Stepper contiene un método steppara hacer avanzar el sistema a un paso de tiempo. Hay ocho tipos de 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

La relación de herencia es: también
Inserte la descripción de la imagen aquí
hay un pseudo Stepper, que avanza la simulación a un pseudo paso de tiempo. Con un formato de paso de tiempo dual, se pueden utilizar para converger el paso de tiempo paso a paso implícito. Hay seis tipos de pseudo Stepper:

  • pyfr.integrators.dual.pseudo.pseudosteppers.DualDenseRKPseudoStepper [fuente]

  • pyfr.integrators.dual.pseudo.pseudosteppers.DualRK4PseudoStepper [fuente]

  • pyfr.integrators.dual.pseudo.pseudosteppers.DualTVDRK3PseudoStepper [fuente]

  • pyfr.integrators.dual.pseudo.pseudosteppers.DualEulerPseudoStepper [fuente]

  • pyfr.integrators.dual.pseudo.pseudosteppers.DualRK34PseudoStepper [fuente]

  • pyfr.integrators.dual.pseudo.pseudosteppers.DualRK45PseudoStepper

Tenga en cuenta que hay DualDenseRKPseudoStepperun tipo de pseudo Stepper cuyos coeficientes se leen de un .txtarchivo que sigue la siguiente convención de nomenclatura :

{scheme name}-s{stage count}-p{temporal order}-sp{optimal spatial polynomial order}.txt

La relación de herencia es:
Inserte la descripción de la imagen aquí

Sistema

El sistema contiene información diversa del sistema, incluidos elementos, interfaces y backend. El sistema contiene un método rhs(abreviatura del lado derecho) para obtener la divergencia de flujo en cada punto de solución (es decir, el término de la derecha de la ecuación). rhsInicie varios núcleos que están pregenerados y cargados en la cola. El sistema también contiene un método _gen_kernelspara generar todos los núcleos requeridos por el sistema. El kernel es una instancia de una clase "única" que contiene un método runpara implementar la funcionalidad requerida. Cada kernel es generado por un proveedor de kernel. PyFR tiene muchos tipos de proveedores de kernel. Un proveedor de kernel puntual (proveedor de kernel puntual) genera un kernel puntual, como el solucionador de Riemann y la función de flujo. Estos kernels punto por punto se implementan utilizando una versión modificada de Mako, a saber, PyFR-Mako. Hay una introducción a continuación, consulte el sitio web oficial de Mako para obtener más información . Hay cuatro sistemas para elegir:

  • pyfr.solvers.aceuler.system.ACEulerSystem
  • pyfr.solvers.acnavstokes.system.ACNavierStokesSystem
  • pyfr.solvers.euler.system.EulerSystem
  • pyfr.solvers.navstokes.system.NavierStokesSystem

La relación de herencia es:
Inserte la descripción de la imagen aquí

Elementos

Elementos (notas) contiene un conjunto de información de elementos. Hay cuatro tipos de elementos:

  • pyfr.solvers.aceuler.elements.ACEulerElements
  • pyfr.solvers.acnavstokes.elements.ACNavierStokesElements
  • pyfr.solvers.euler.elements.EulerElements
  • pyfr.solvers.navstokes.elements.NavierStokesElements

La relación de herencia es:
Inserte la descripción de la imagen aquí

Interfaces

Interfaces (notas) contiene un conjunto de información de interfaz. Hay ocho interfaces (sin límites):

  • 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

La relación de herencia es:
Inserte la descripción de la imagen aquí

Backend

El backend contiene información del backend. Hay tres tipos de opciones de backend (el texto original es cuatro, presuntos errores tipográficos):

  • pyfr.backends.cuda.base.CUDABackend
  • pyfr.backends.opencl.base.OpenCLBackend
  • pyfr.backends.openmp.base.OpenMPBackend

La relación de herencia es:
Inserte la descripción de la imagen aquí

Proveedor de kernel punto por punto

El proveedor de kernel punto por punto (PKP para abreviar) es responsable de generar el kernel punto por punto. Específicamente, PKP contiene un método registerque es responsable de agregar un nuevo método a una instancia de PKP. Este nuevo método devolverá un kernel cuando se lo llame. El llamado kernel es una instancia de una clase "desechable", que contiene métodos runpara implementar las funciones requeridas. PyFR-Mako implementa la función del kernel, por lo que PKP también contiene un método _render_kernelpara representar PyFR-Mako como código subyacente. _render_kernelPrimero configure el contexto para Mako (como los detalles del backend, etc.) y luego use Mako para renderizar el contenido de PyFR-Mako. Cuando Mako encuentra uno pyfr:kernel, crea una instancia del generador de kernel para representar pyfr:kernelel contenido principal. Hay tres tipos (cuatro tipos de escritura original, presuntos errores tipográficos) PKP es opcional:

  • pyfr.backends.cuda.provider.CUDAPointwiseKernelProvider
  • pyfr.backends.opencl.provider.OpenCLPointwiseKernelProvider
  • pyfr.backends.openmp.provider.OpenMPPointwiseKernelProvider

La relación de herencia es:
Inserte la descripción de la imagen aquí

Generador de granos

El generador de kernel pyfr:kernelmuestra PyFR-Mako como código subyacente. Específicamente, el generador de kernel contiene un método render. Hay tres tipos de generadores de kernel (cuatro tipos de escritura original, presuntos errores tipográficos):

  • pyfr.backends.cuda.generator.CUDAKernelGenerator
  • yfr.backends.opencl.generator.OpenCLKernelGenerator
  • pyfr.backends.openmp.generator.OpenMPKernelGenerator

La relación de herencia es:
Inserte la descripción de la imagen aquí

posdata

Hay una introducción a PyFR-Mako al final de esta página, que se coloca en la siguiente traducción.

Supongo que te gusta

Origin blog.csdn.net/iamzhtr/article/details/103114664
Recomendado
Clasificación