ADReal
ADReal is the type underpinning all of MOOSE's automatic differentiation (AD) capabilities.
Overview
ADReal is a MOOSE typedef defined from the MetaPhysicL template class DualNumber. DualNumber takes two template arguments T and D; T represents the "value" type of the DualNumber, e.g. the type of , while D represents the derivative type of the DualNumber, e.g. the type of . MetaPhysicL offers several options for D types, including:
NumberArray- C-array as underlying derivative vector storage for data - Fast because of static storage - Inflexible; no storage of indices so no sparse support. Essentially pick a maximum possible storage size and hope for the best. Doesn't work out for many 3D problems or problems with a lot of variablesDynamicSparseNumberArray-std::vectoras underlying storage for derivative data and indices - Maximum flexibility - Slow because of continual dynamic allocation of memorySemiDynamicSparseNumberArray-std::arrayas underlying storage for derivative data and indices - Fast because of static storage - Indices storage allows sparse operations and hence flexibility - Avoid looping over the whole size of the std::array by maintaining a dynamic size data member
Currently, MOOSE uses SemiDynamicSparseNumberArray for derivative storage because it is much more flexible than NumberArray and more performant than DynamicSparseNumberArray. The underlying derivative storage array size for SemiDynamicSparseNumberArray can be modified by running configure with the option --with-derivative-size=<n> where <n> is the desired size of the container. By default, MOOSE is configured --with-derivative-size=64.
AD-Related Timings
Stabilized Incompressible Navier Stokes
Stabilized Incompressible Navier Stokes
Test specs
Navier-Stokes test directory input file:
ad_lid_driven_stabilized.i200x200 mesh
default backing array size of 50
Computer specs: - MacBook Pro running Mojave 10.14.5 - 2.4 GHz Intel Core i9 - 32 GB 2400 MHz DDR4
SNESComputeJacobian timing
MOOSE non-sparse config: 9.61 seconds (MOOSE's old config, no longer available)
MOOSE sparse config: 9.22 seconds (MOOSE's current config)