/PDESolver.jl

A Julia-based solver for partial-differential equations.

Primary LanguageJuliaOtherNOASSERTION

PDESolver

PDESolver is a multi-physics solver primarily focused on Computational Fluid Dynamics. It has been designed from ground up to support optimization, robust simulation, and parallel scalability.

Installation

The obtain this package, do Pkg.clone(url), then Pkg.build("PDESolver"). This will install all dependences, including those not listed in Metadata.

The dependencies not listed in Metadata are:

ODLCommonTools

SummationByParts

PumiInterface

Petsc

PumiInterface and Petsc are the only packages with non-trivial installation requirements, although for most cases the defaults will work just fine.

See those packages for details.

Developer Guide

The abstraction hierarchy of the code is described in two documents. doc/interfaces.md describes the required implementation and rationale for the AbstractMesh and AbstractSolutionData types, as well as how different parts of the code interact (ie. how the NonlinearSolvers interact with the physics modules etc.). src/Readme.md describes the user-facing interface for the physics modules as well as what functions each physics module must implement in order to be usable.

The code is organized as follows:

The code for evaluating the residual for an equation is in the src/solver directory.
There are subdirectories for each physics. Currently src/solver/euler is the most well developed physics.

The NonlinarSolvers module (src/NonlinearSolvers) implements both time stepping methods for unsteady equations and non-linear root finding methods for steady problems.

The Utils module (src/Utils) contains auxiliary functions used by all physics modules.

The Input module (src/input) parses input files, provides default values, and checks for unrecognized keys. src/input/input_vals.txt lists all possible user-supplied keys. src/input/input_vals_internal.txt list keys used internally by the solver. Users should never specify these keys in an input file.

The src/mesh_files contains meshes used by the tests. Please use the smallest meshes possible for tests.

The directory src/simple_mesh contains the files to create simple structured meshes.

The file src/estimateMem.jl reads the file counts.txt, which is written by the mesh initialization, and estimates the steady state memory usage of the solver. While this is not an upper bounds, it has proven to be quite accurate. It does not include memory used by any factorizations the linear solver might do.

Visualization

Paraview is used for visualization. High order elements (p>2) are automatically interpolated onto either a linear or quadratic mesh for visualization. Empirically, this has been shown to produce better images than sub-triangulating each element and doing an exact projection onto the finer mesh.

Version History

  • v0.1: the old master version (DG supported, I think)

  • v0.2: the work branch after the test system/frontend rewrite

  • v0.3: curvilinear entropy stable works (requires PumiInterface v0.3, SBP tag ticon_broken)

  • v0.4: curvilinear works (both entropy stable and Roe scheme) introduced AbstractLinearOperator, AbstractPreconditioner, LinearSolver abstractions, Changed MPI initialization/finalization (PETSc too)

  • v0.5: add checkpointing, Linear solver/operator/preconditioner abstraction, explicit jacobian calculation, more reliable MPI/PETSc initialization and finalization

  • v0.6: upgrade from Julia 0.4 to 0.6

  • v0.7: functional and residual reverse mode, serial and parallel

  • v0.8: add shock capturing, adjoint based error estimation, preliminary h-adaptation, Local Projection stabilization, p-homotopy method for solving high order shock problems, several steady examples

Master branch: Build Status

Work branch: Build Status

#codecov