Structure of simulation framewok

The key element of DARTS is operator-based linearization (OBL)1. The state-based terms of governing equations are parametrized in the physical space of the problem forming dynamically expanding lookup tables where the supporting points for reconstruction of operators are saved in a special two-level sparse storage designed for efficient lookup and re-use. These tables are used in linearization to approximate operators along with derivatives with respect to governing unknowns using piecewise multilinear interpolation in physical space. It allows to detach fluid and rock properties calculations (now only performed at supporting points) from the main nonlinear loop and to relax the performance requirements for such calculations.

Fig.1: Structure of two main DARTS packages: DARTS-engines and DARTS-physics.

The modular structure of DARTS is demonstrated in Fig.1. On the left, four main components (available physical terms) defining simulation engine are shown. On the right, main five models involved in physical package are listed. Depending on the simulation type, different combination of physical terms in governing partial differential equations and corresponding operators supported by physical package may be required. For example, in geothermal applications, accumulation, convective flux and diffusive (conductive) temperature are required for conservation equations for mass and energy.

Two types of interpolators connect engine and physics. Static iterator pre-computes all supporting points in advance being useful for coarse physical representation and low-dimensional parameter space. Adaptive iterator computes only actually required supporting points along the simulation2. When an engine requires values and derivatives of operators for Jacobian and RHS assembly, the interpolator computes them based on the multi-linear interpolation among existing supporting points. Only when some of the required supporting points are missing, the interpolator requests them from physics module. In this case, operator values computed during simulation can be stored and loaded, which can be extremely beneficial in case of running multiple models with the same physical properties (e.g. in optimization process).