WARPXM v1.10.0
Loading...
Searching...
No Matches
WARPXM: Structure

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.

Structure of a WARPXM Simulation

WARPXM contains a framework for the expression and solution of time-dependent Partial Differential Equations. A simulation usually consists of the following elements:

  • A set of Variables defined on the spatial domain. Variables can be conserved quantities as well as "auxiliary" variables.
  • One or more Applications. An Application can do various things, but the most common kinds are:
  • A Spatial Solver, which computes the right-hand-side of the conservation equation at each time step. WARPXM includes a variety of discontinuous finite element methods.
  • A Temporal Solver, which integrates the conservation equation over time. WARPXM includes both explicit and implicit Runge-Kutta methods.
  • A spatial mesh.

Variables

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.

Important Information about Variables

Time-Integrable vs Algebraic Variables (aka Explodability)

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+1th 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.

Unstructured Framework

Mesh Generation

WARPXM handles both unstructured and structured meshes. An external program can be used to provide a mesh, which must include information on:

  • Nodes (coordinates)
  • Element Connectivities (nodes making up elements)
  • Boundary Names and Nodes associated with them

Arbitrary Mesh

Currently, WARPXM supports meshes of type of file extension .inp generated by the CUBIT mesh generation software.

Block Mesh

For a simple "structured" grids (equal-length elements in 1D, rectangular domains in 2D), WARPXM can create the mesh on its own.

Unstructured Converter Library

This module handles:

  • Conversion of mesh into
    • coordinates
    • elemenent connectivities
    • element orientations
    • element neigborhoods
    • allocation of element boundary faces
    • Patch and subdomain decomposition
    • Layering of elements within patches

Geometric Information

Isoparametric Elements

Types

Lines

Triangles

Tetrahedrons

Jacobians

Discontinuous Finite Elements

For information on our finite element basis definitions, see the writeup.

Spatial Solvers

Discontinuous Galerkin

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*}

Variable Adjusters

Boundary Conditions

Gradient Calculators

Limiters

Time Integration

TODO

Explicit Runge-Kutta

Implicit Runge-Kutta

Applications

TODO

Examples of Applications

TODO

MHD

Divergence Cleaning

5-Moment Multi-fluid

13-Moment Multi-fluid

Maxwell Equations

Parabolic Divergence Cleaning

Hyperbolic Divergence Cleaning

Kinetics

Parallelism

TODO

MPI

Synchronization

WARPy

TODO