1#include "build_system_matrix.h"
3#include <lf/assemble/assemble.h>
4#include <lf/base/base.h>
5#include <lf/io/vtk_writer.h>
6#include <lf/mesh/utils/utils.h>
7#include <lf/uscalfe/lagr_fe.h>
11#include "offset_function.h"
12#include "piecewise_const_element_matrix_provider.h"
13#include "piecewise_const_element_vector_provider.h"
14#include "solution_to_mesh_data_set.h"
19std::tuple<lf::assemble::COOMatrix<double>, Eigen::VectorXd>
21 const std::shared_ptr<const lf::mesh::Mesh> &mesh,
23 const std::function<Eigen::Vector2d(
const Eigen::Vector2d &)> &f,
31 for (
const auto *ep : mesh->Entities(1)) {
32 dirichlet(*ep) = dirichlet_data(*ep);
36 const auto elem_mat_builder =
38 sigma, boundary, modified_penalty);
41 Eigen::VectorXd rhs = Eigen::VectorXd::Zero(dofh.
NumDofs());
42 const auto elem_vec_builder =
44 sigma, f, quadrule, boundary, dirichlet);
49 const auto &e = dofh.
Entity(idx);
58std::tuple<lf::assemble::COOMatrix<double>, Eigen::VectorXd, Eigen::VectorXd>
60 const std::shared_ptr<const lf::mesh::Mesh> &mesh,
62 const std::function<Eigen::Vector2d(
const Eigen::Vector2d &)> &f,
70 for (
const auto *ep : mesh->Entities(1)) {
71 dirichlet(*ep) = dirichlet_data(*ep);
75 const auto elem_mat_builder =
77 sigma, boundary, modified_penalty);
80 Eigen::VectorXd rhs = Eigen::VectorXd::Zero(dofh.
NumDofs());
81 const auto elem_vec_builder =
83 sigma, f, quadrule, boundary, dirichlet);
88 mesh, boundary, dofh, dirichlet_data, A.
makeSparse());
92 offset_function.head(mesh->NumEntities(2));
94 const auto &e = dofh.
Entity(idx);
100 return {A, rhs, offset_function};
A temporary data structure for matrix in COO format.
Eigen::SparseMatrix< Scalar > makeSparse() const
Create an Eigen::SparseMatrix out of the COO format.
A general (interface) class for DOF handling, see Lecture Document Paragraph 2.7.4....
virtual const lf::mesh::Entity & Entity(gdof_idx_t dofnum) const =0
retrieve unique entity at which a basis function is located
virtual size_type NumDofs() const =0
total number of dof's handled by the object
Interface class representing a topological entity in a cellular complex
virtual base::RefEl RefEl() const =0
Describes the reference element type of this entity.
A MeshDataSet that attaches data of type T to every entity of a mesh that has a specified codimension...
Represents a Quadrature Rule over one of the Reference Elements.
Element matrix provider for the stokes system.
Element vector provider for the stokes system.
void AssembleMatrixLocally(dim_t codim, const DofHandler &dof_handler_trial, const DofHandler &dof_handler_test, ENTITY_MATRIX_PROVIDER &entity_matrix_provider, TMPMATRIX &matrix)
Assembly function for standard assembly of finite element matrices.
void AssembleVectorLocally(dim_t codim, const DofHandler &dof_handler, ENTITY_VECTOR_PROVIDER &entity_vector_provider, VECTOR &resultvector)
entity-local assembly of (right-hand-side) vectors from element vectors
unsigned int size_type
general type for variables related to size of arrays
void FixFlaggedSolutionComponents(SELECTOR &&selectvals, COOMatrix< SCALAR > &A, RHSVECTOR &b)
enforce prescribed solution components
@ kPoint
Returns the (0-dimensional) reference point.
CodimMeshDataSet< bool > flagEntitiesOnBoundary(const std::shared_ptr< const Mesh > &mesh_p, lf::base::dim_t codim)
flag entities of a specific co-dimension located on the boundary
Eigen::VectorXd createOffsetFunction(const std::shared_ptr< const lf::mesh::Mesh > &mesh, const lf::mesh::utils::MeshDataSet< bool > &boundary, const lf::assemble::DofHandler &dofh, const std::function< Eigen::Vector2d(const lf::mesh::Entity &)> &dirichlet_data, const Eigen::SparseMatrix< double > &A)
Compute the offset function for given boundary conditions.
std::tuple< lf::assemble::COOMatrix< double >, Eigen::VectorXd, Eigen::VectorXd > buildSystemMatrixInOutFlow(const std::shared_ptr< const lf::mesh::Mesh > &mesh, const lf::assemble::DofHandler &dofh, const std::function< Eigen::Vector2d(const Eigen::Vector2d &)> &f, const std::function< Eigen::Vector2d(const lf::mesh::Entity &)> &dirichlet_data, double sigma, const lf::quad::QuadRule &quadrule, bool modified_penalty)
Build the system matrix for the stokes system with in- and out flow boundary conditions.
std::tuple< lf::assemble::COOMatrix< double >, Eigen::VectorXd > buildSystemMatrixNoFlow(const std::shared_ptr< const lf::mesh::Mesh > &mesh, const lf::assemble::DofHandler &dofh, const std::function< Eigen::Vector2d(const Eigen::Vector2d &)> &f, const std::function< Eigen::Vector2d(const lf::mesh::Entity &)> &dirichlet_data, double sigma, const lf::quad::QuadRule &quadrule, bool modified_penalty)
Build the system matrix for the stokes system with no flow boundary conditions.