// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
// vi: set et ts=4 sw=4 sts=4:
/*!
 * \file
 *
 * \brief This file contains templates for the doxygen documentation
 *        intended to in increasing maintainability to avoid excessive
 *        copy-and-paste of the documentation.
 */
class Doxygen {
public:
    /*
     * \brief The constructor of the problem.
     *
     * The problem is the central decision hub in eWoms. It decides
     * what model to use, how the domain looks like, the boundary and
     * initial conditions, etc.
     *
     * Normally, the problem is instantiated by Ewoms::start, but
     * you for special applications, it might be necessary to do this
     * on your own. Don't be suprised if things explode then, though.
     *
     * \param timeManager The time manager of the simulation
     */
    void defaultProblemConstructor(TimeManager &timeManager);

    /*!
     * \param timeIdx The index used by the time discretization.
     */
    void timeIdxParam(int timeIdx);

    /*!
     * \tparam Context The type of the execution context.
     *
     * \param context The execution context.
     * \param spaceIdx The local index used by the space discretization.
     * \param timeIdx The index used by the time discretization.
     */
    template <class Context>
    void contextParams(const Context &context, int spaceIdx, int timeIdx);

    /*!
     * \param problem The physical problem which ought to be solved.
     */
    void problemParam(Problem &problem);

    /*!
     * \param element The DUNE element (i.e. the codim-0 entity) of interest.
     */
    void elementParam(Element &element);

    /*!
     * \param scvIdx The local sub-control volume index of interest
     *               (equivalent to the local vertex index of the
     *               element).
     */
    void vcfvScvIdxParam(int scvIdx);

    /*!
     * \param scvfIdx The local sub-control volume face index of interest
     *               (equivalent to the local edge index of the
     *               element).
     */
    void vcfvScvfIdxParam(int scvfIdx);

    /*!
     * \param source The values of the source term.
     */
    void sourceParam(RateVector &source);

    /*!
     * \param storage Stores the total amount of each conserved quantity inside the domain.
     */
    void storageParam(EqVector &storage);

    /*!
     * \param flux Area-specific flux over the phase.
     */
    void areaFluxParam(RateVector &flux);

    /*!
     * \param residual Stores the residual  of each conserved quantity.
     */
    void residualParam(EqVector &residual);

    /*!
     * \param elemCtx The element execution context of the vcfv scheme.
     */
    void vcfvElemCtxParam(const ElementContext &elemCtx);

    /*!
     * \copydetails Doxygen::vcfvScvIdxParam
     * \copydetails Doxygen::vcfvElemCtxParam
     * \copydetails Doxygen::timeIdxParam
     */
    void vcfvScvCtxParams(const ElementContext &elemCtx, int scvIdx, int timeIdx);

    /*!
     * \copydetails Doxygen::vcfvElemCtxParam
     * \copydetails Doxygen::vcfvScvfIdxParam
     * \copydetails Doxygen::timeIdxParam
     */
    void vcfvScvfCtxParams(const ElementContext &elemCtx, int scvfIdx, int timeIdx);

    /*!
     * \tparam FluidState The type of the fluid state.
     *
     * \param fluidState The object expressing the termodynamic state of the system.
     * \param paramCache The fluid system's parameter cache
     */
    template <class FluidState>
    void fluidSystemBaseParams(const FluidState &fluidState,
                               const ParameterCache &paramCache);

    /*!
     * \param phaseIdx The index of the fluid phase of interest.
     */
    void phaseIdxParam(int phaseIdx);

    /*!
     * \param compIdx The index of the (pseudo-)component of interest.
     */
    void compIdxParam(int compIdx);

    /*!
     * \param compIIdx The index of the first (pseudo-)component of interest.
     */
    void compIIdxParam(int compIIdx);

    /*!
     * \param compJIdx The index of the second (pseudo-)component of interest.
     */
    void compJIdxParam(int compJIdx);

    /*!
     * \param temperature The temperature of interest [K]
     */
    void temperatureParam(Scalar temperature);

    /*!
     * \param temperature The temperature of interest [K]
     * \param pressure The pressure of interest [Pa]
     */
    void TpParams(Scalar temperature, Scalar pressure);

    /*!
     * \tparam TypeTag The type tag on which all required properties are defined.
     */
    template <class TypeTag>
    void typeTagTParam();
};
