#ifndef FINITEDIFFERENCE2D_HPP #define FINITEDIFFERENCE2D_HPP #include #include #include #include "BoundaryCondition.hpp" #include "SpatialDiscretization2D.hpp" #include "StructuredMesh2D.hpp" namespace spatial { class FiniteDifference2D: public SpatialDiscretization2D { private: // Structured mesh required for finite differences const StructuredMesh2D& mesh_; public: FiniteDifference2D(std::function, const StructuredMesh2D&, BoundaryConditions, std::function); void buildMappings() override; void discretize() override; void addDiagonalTerm(int); void addOffDiagonalTerm(int, DomainSide, double = 1.0); void applyLaplacian() override; void applyBoundaryConditions() override; void applyNeumannBoundaryCondition(const BoundaryNode2D&); void updateRHS(double t=0.0) override; void updateDirichletBoundaryCondition(const BoundaryNode2D&, double t); void updateNeumannBoundaryCondition(const BoundaryNode2D&, double t); Eigen::VectorXd solveSteadyState() override; Eigen::VectorXd reduce(std::function) override; Eigen::VectorXd fillDirichletNodes(const Eigen::Ref&, double) const override; Eigen::VectorXd solve_reduced(); }; } // namespace #endif // ifndef FINITEDIFFERENCE2D_HPP