Application Drivers

Parthenon provides some basic functionality for coordinating various types of calculation in the form of the Driver class and others that derive from it.

Driver

Driver is an abstract base class that owns pointers to a ParameterInput object, a Mesh object, and an Outputs object. It has a single pure virtual member function called Execute that must be defined by a derived class and is intended to be called from main(). A simple example of defining an application based on inheriting from this class can be found here.

EvolutionDriver

The EvolutionDriver class derives from Driver, defining the Execute function to carry out the

while (t < tmax) {
    // step the solution through time
}

loop, including periodic outputs. It has a single pure virtual member function called Step which a derived class must define and which will be called during each pass of the loop above.

MultiStageDriver

The MultiStageDriver derives from the EvolutionDriver, extending it in two important ways. First, it is templated on an Integrator type and holds a std::unique_ptr<Integrator> object which includes members for the number of stages, the stage weights, and the names of the stages. More details on integrators can be found on the Integrators page. Second, it defines a Step() function, which is reponsible for taking a timestep by looping over stages and calling the ConstructAndExecuteTaskLists function which builds and executes the tasks for each stage. Applications that derive from MultiStageDriver are responsible for defining a MakeTaskCollection function that makes a TaskCollection given a BlockList_t & and an integer stage. The advection example (here) demonstrates the use of this capability.

MultiStageBlockTaskDriver

The MultiStageBlockTaskDriver derives from the MultiStageDriver, providing a slightly different interface to downstream codes. Application drivers that derive from this class must define a MakeTaskList function that builds a task list for a given MeshBlock * and integer stage. This is less flexible than the MultiStageDriver, but does simplify the code necessary to stand up a new capability.

PreExecute/PostExecute

The Driver class defines two virtual void member functions, PreExecute and PostExecute, that provide simple reporting including timing data for the application. Application drivers that derive from Driver are intended to call these functions at the beginning and end of their Execute function if such reporting is desired. In addition, applications can extend these capabilities as desired, as demonstrated in the example here.

The EvolutionDriver, which already defines the Execute function, extends the PostExecute function with additional reporting and calls both methods.