https://gitlab.opengeosys.org/ogs/ogs.git
Raw File
Tip revision: 1dc27da5e1f95e35ae26f180bd60dadc0be69209 authored by Wenqing Wang on 04 March 2021, 08:31:20 UTC
[THM] Removed the double declared VariableArray
Tip revision: 1dc27da
CVodeSolver.h
/**
 * \file
 * \copyright
 * Copyright (c) 2012-2021, OpenGeoSys Community (http://www.opengeosys.org)
 *            Distributed under a Modified BSD License.
 *              See accompanying file LICENSE.txt or
 *              http://www.opengeosys.org/project/license
 *
 */

#pragma once

#include <memory>

#include "ODESolverTypes.h"
#include "FunctionHandles.h"

namespace BaseLib
{
class ConfigTree;
}

namespace MathLib
{
namespace ODE
{
//! \addtogroup ExternalODESolverInterface
//! @{

class CVodeSolverImpl;

/*! ODE solver interfacing with Sundials' CVode.
 *
 * All methods of this class have the same semantics as methods from the
 * ODESolver interface with the same name.
 *
 * There is no implicit information about vector and matrix sizes in this class
 * anymore, rather this class only handles raw pointers. But this is exactly
 * what is necessary when using C libraries like Sundials.
 *
 * \note
 * This class is for internal use only. Therefore all members of this class are
 * protected, namely because ConcreteODESolver derives from this class.
 */
class CVodeSolver
{
protected:
    //! Construct from the given \c config with storage allocated for the given
    //! \c num_equations.
    CVodeSolver(BaseLib::ConfigTree const& config,
                unsigned const num_equations);

    void setTolerance(double const* const abstol, const double reltol);
    void setTolerance(const double abstol, const double reltol);

    void setFunction(std::unique_ptr<detail::FunctionHandles>&& f);

    void setIC(const double t0, double const* const y0);

    void preSolve();
    bool solve(const double t_end);

    double const* getSolution() const;
    double getTime() const;
    void getYDot(const double t,
                 double const* const y,
                 double* const y_dot) const;

    ~CVodeSolver();

private:
    //! pimpl idiom.
    std::unique_ptr<CVodeSolverImpl> _impl;
};

//! @}}

}  // namespace ODE
}  // namespace MathLib
back to top