WARPXM v1.10.0
|
WARPXM (Washington Approximate Riemann Plasma eXtended modeling platform - Many-core version) is a parallel code used for solving partial differential equations describing plasma physics models on an unstructured mesh. The discontinuous Galerkin finite element method is used.
WARPXM contains a framework for the expression and solution of time-dependent Partial Differential Equations. A simulation usually consists of the following elements:
\begin{align*} \frac{\partial \mathbf{q}}{\partial t} + \nabla \cdot \mathcal{F}(\mathbf{q}) = \mathbf{S} \end{align*}
within the Discontinuous Finite Element framework. As such, these applications will implement WmApplication::internal_flux(), WmApplication::numerical_flux(), and possibly WmApplication::source(). See Developing New Applications for details.In WARPXM, a variable is a quantity that is defined on the spatial domain. It may be updated by either the spatial solver, or by one or more variable adjusters included in the temporal solver.
Variables are declared in an Input file (or what is equivalent, in a WARPy script), and are given a name which uniquely identifies them to the C++ code. They may be scalars or vectors, in which case they have a known, fixed number of components.
Applications declare which variables they will be accessing by implementing wxm::app_base::getInputVariableIndexes() and wxm::app_base::getOutputVariableIndexes(). The vectors of variable indexes should be read from the .inp
file, at WARPXM startup time, in the WmApplication::setup() method. Thereupon, the methods of the application will be called with the appropriate variables passed as arrays of doubles, indexed according to the convention established by the application in its setup()
method. See Developing new Applications for an example.
WARPXM is designed to solve time-dependent PDEs. Variables which appear with a first-order time derivative are automatically integrated by the simulation's temporal solver. However, not all variables are intended to be integrated with an RK solver. Examples include temporally static variables, exogenously time-varying fields, or scalar potentials from a Poisson update. Such variables are "algebraic", at least from the perspective of the temporal solver.
By default, variables declared in WARPy are treated as time-integrable variables. The flag that controls this behavior is named explodable
(in reference to the fact that the n+1
th stage may be safely "exploded", since it should not be used in the calculation of the flux F(q_n)
). The default in WARPy for a warpy.variable
is explodable=True
. If you would like to use a variable in one of the ways described above, you must pass explodable=False
when initializing the warpy.variable
.
WARPXM handles both unstructured and structured meshes. An external program can be used to provide a mesh, which must include information on:
Currently, WARPXM supports meshes of type of file extension .inp generated by the CUBIT mesh generation software.
For a simple "structured" grids (equal-length elements in 1D, rectangular domains in 2D), WARPXM can create the mesh on its own.
This module handles:
For information on our finite element basis definitions, see the writeup.
The code solves the conservation problem
\begin{align*} \frac{\partial q_{i}}{\partial t} + \frac{\partial \mathcal{F}_{ij}}{\partial x_{j}} =& S_{i} \end{align*}
Upon finite element discretization, we solve
\begin{align*} \frac{\partial \hat{q}_{ij}^{\lambda}}{\partial t} =& {J_{lm}^{\lambda}}^{-1}\Upsilon_{jlk} \hat{\mathcal{F}}_{imk}^{\lambda} - \sum_{\gamma\in\bar{\Gamma}_{\lambda}} G_{\lambda\gamma}^{-1} \Xi_{jk}^{\lambda\gamma}\tilde{\mathcal{F}}_{ik}^{\lambda\gamma} + \hat{S}_{ij}^{\lambda} \end{align*}
TODO
TODO
TODO
TODO
TODO