Skip to content
Snippets Groups Projects
LocalAssemblerInterface.h 5.6 KiB
Newer Older
  • Learn to ignore specific revisions
  •  * Copyright (c) 2012-2020, OpenGeoSys Community (http://www.opengeosys.org)
    
     *            Distributed under a Modified BSD License.
     *              See accompanying file LICENSE.txt or
     *              http://www.opengeosys.org/project/license
     *
     */
    
    
    #include "NumLib/NumericsConfig.h"
    
    #include "MathLib/Point3d.h"
    
    namespace NumLib
    {
    class LocalToGlobalIndexMap;
    }  // NumLib
    
    
    namespace ProcessLib
    {
    
    struct CoupledSolutionsForStaggeredScheme;
    struct LocalCoupledSolutions;
    
    
    /*! Common interface for local assemblers
     * NumLib::ODESystemTag::FirstOrderImplicitQuasilinear ODE systems.
     *
     * \todo Generalize to other NumLib::ODESystemTag's.
     */
    class LocalAssemblerInterface
    {
    public:
        virtual ~LocalAssemblerInterface() = default;
    
    
        virtual void setInitialConditions(
            std::size_t const mesh_item_id,
    
            NumLib::LocalToGlobalIndexMap const& dof_table, GlobalVector const& x,
            double const t);
    
        virtual void initialize(std::size_t const mesh_item_id,
                                NumLib::LocalToGlobalIndexMap const& dof_table);
    
    
        virtual void preAssemble(double const /*t*/, double const /*dt*/,
    
                                 std::vector<double> const& /*local_x*/){};
    
    
        virtual void assemble(double const t, double const dt,
                              std::vector<double> const& local_x,
    
                              std::vector<double>& local_M_data,
                              std::vector<double>& local_K_data,
    
                              std::vector<double>& local_b_data);
    
        virtual void assembleForStaggeredScheme(
    
            double const t, double const dt, Eigen::VectorXd const& local_x,
            int const process_id, std::vector<double>& local_M_data,
            std::vector<double>& local_K_data, std::vector<double>& local_b_data,
    
            LocalCoupledSolutions const& coupled_solutions);
    
        virtual void assembleWithJacobian(double const t, double const dt,
    
                                          std::vector<double> const& local_x,
                                          std::vector<double> const& local_xdot,
                                          const double dxdot_dx, const double dx_dx,
                                          std::vector<double>& local_M_data,
                                          std::vector<double>& local_K_data,
                                          std::vector<double>& local_b_data,
                                          std::vector<double>& local_Jac_data);
    
        virtual void assembleWithJacobianForStaggeredScheme(
    
            double const t, double const dt, Eigen::VectorXd const& local_x,
            std::vector<double> const& local_xdot, const double dxdot_dx,
            const double dx_dx, int const process_id,
    
            std::vector<double>& local_M_data, std::vector<double>& local_K_data,
            std::vector<double>& local_b_data, std::vector<double>& local_Jac_data,
            LocalCoupledSolutions const& local_coupled_solutions);
    
        virtual void computeSecondaryVariable(
            std::size_t const mesh_item_id,
            NumLib::LocalToGlobalIndexMap const& dof_table, const double t,
            GlobalVector const& x,
    
            CoupledSolutionsForStaggeredScheme const* coupled_xs);
    
        virtual void preTimestep(std::size_t const mesh_item_id,
                                 NumLib::LocalToGlobalIndexMap const& dof_table,
                                 GlobalVector const& x, double const t,
                                 double const delta_t);
    
        virtual void postTimestep(std::size_t const mesh_item_id,
                                  NumLib::LocalToGlobalIndexMap const& dof_table,
    
                                  GlobalVector const& x, double const t,
                                  double const dt);
    
        void postNonLinearSolver(std::size_t const mesh_item_id,
                                 NumLib::LocalToGlobalIndexMap const& dof_table,
                                 GlobalVector const& x, double const t,
    
                                 double const dt, bool const use_monolithic_scheme);
    
        /// Computes the flux in the point \c p_local_coords that is given in local
        /// coordinates using the values from \c local_x.
    
        /// Fits to monolithic scheme.
    
        virtual Eigen::Vector3d getFlux(
    
            MathLib::Point3d const& /*p_local_coords*/,
    
            double const /*t*/,
    
            std::vector<double> const& /*local_x*/) const
    
            return Eigen::Vector3d{};
    
        /// Fits to staggered scheme.
        virtual Eigen::Vector3d getFlux(
            MathLib::Point3d const& /*p_local_coords*/,
            double const /*t*/,
            std::vector<std::vector<double>> const& /*local_xs*/) const
        {
            return Eigen::Vector3d{};
        }
    
    
        virtual void setInitialConditionsConcrete(
    
            std::vector<double> const& /*local_x*/, double const /*t*/)
    
        virtual void initializeConcrete() {}
    
    
        virtual void preTimestepConcrete(std::vector<double> const& /*local_x*/,
                                         double const /*t*/, double const /*dt*/)
        {
        }
    
    
        virtual void postTimestepConcrete(std::vector<double> const& /*local_x*/,
                                          double const /*t*/, double const /*dt*/)
        {
        }
    
    
        virtual void postNonLinearSolverConcrete(
            std::vector<double> const& /*local_x*/, double const /*t*/,
    
            double const /*dt*/, bool const /*use_monolithic_scheme*/)
    
        virtual void computeSecondaryVariableConcrete(
            double const /*t*/, std::vector<double> const& /*local_x*/)
        {
        }
    
        virtual void computeSecondaryVariableWithCoupledProcessConcrete(
    
            double const /*t*/, std::vector<std::vector<double>> const&