12#include "FunctionSpace.h"
13#include "sparsitybuild.h"
17#include <dolfinx/common/Timer.h>
18#include <dolfinx/la/SparsityPattern.h>
39template <dolfinx::scalar T, std::
floating_po
int U>
40std::vector<std::vector<std::array<std::shared_ptr<const FunctionSpace<U>>, 2>>>
44 std::vector<std::array<std::shared_ptr<const FunctionSpace<U>>, 2>>>
49 for (std::size_t i = 0; i < a.size(); ++i)
51 for (std::size_t j = 0; j < a[i].size(); ++j)
54 spaces[i][j] = {form->function_spaces()[0], form->function_spaces()[1]};
65template <dolfinx::scalar T, std::
floating_po
int U>
74 std::array<std::reference_wrapper<const DofMap>, 2> dofmaps{
78 const std::array index_maps{dofmaps[0].get().index_map,
79 dofmaps[1].get().index_map};
81 = {dofmaps[0].get().index_map_bs(), dofmaps[1].get().index_map_bs()};
93template <dolfinx::scalar T, std::
floating_po
int U>
98 throw std::invalid_argument(
99 "Cannot create sparsity pattern. Form is not a bilinear.");
114 int tdim =
mesh->topology()->dim();
115 mesh->topology_mutable()->create_entities(tdim - 1);
116 mesh->topology_mutable()->create_connectivity(tdim - 1, tdim);
121 auto extract_cells = [](std::span<const std::int32_t> facets)
123 assert(facets.size() % 2 == 0);
124 std::vector<std::int32_t> cells;
125 cells.reserve(facets.size() / 2);
126 for (std::size_t i = 0; i < facets.size(); i += 2)
127 cells.push_back(facets[i]);
131 const int num_cell_types =
mesh->topology()->cell_types().size();
132 for (
int cell_type_idx = 0; cell_type_idx < num_cell_types; ++cell_type_idx)
134 std::array<std::reference_wrapper<const DofMap>, 2> dofmaps{
139 for (
auto type : types)
144 for (
int i = 0; i < a.
num_integrals(type, cell_type_idx); ++i)
148 std::pair{a.
domain_arg(type, 0, i, cell_type_idx),
150 {{dofmaps[0], dofmaps[1]}});
154 for (
int i = 0; i < a.
num_integrals(type, cell_type_idx); ++i)
160 {{dofmaps[0], dofmaps[1]}});
166 for (
int i = 0; i < a.
num_integrals(type, cell_type_idx); ++i)
170 std::pair{extract_cells(a.
domain_arg(type, 0, i, 0)),
172 {{dofmaps[0], dofmaps[1]}});
176 throw std::invalid_argument(
"Unsupported integral type");
Degree-of-freedom map representations and tools.
Timer for measuring and logging elapsed time durations.
Definition Timer.h:41
std::chrono::duration< double, Period > stop()
Stop timer and return elapsed time.
Definition Timer.h:128
This class represents a finite element function space defined by a mesh, a finite element,...
Definition FunctionSpace.h:35
Definition SparsityPattern.h:28
void interior_facets(la::SparsityPattern &pattern, std::array< std::span< const std::int32_t >, 2 > cells, std::array< std::reference_wrapper< const DofMap >, 2 > dofmaps)
Iterate over interior facets and insert entries into sparsity pattern.
Definition sparsitybuild.cpp:16
void cells(la::SparsityPattern &pattern, const std::pair< R0, R1 > &cells, std::array< std::reference_wrapper< const DofMap >, 2 > dofmaps)
Iterate over cells and insert entries into sparsity pattern.
Definition sparsitybuild.h:37
Finite element method functionality.
Definition assemble_expression_impl.h:22
std::vector< std::vector< std::array< std::shared_ptr< const FunctionSpace< U > >, 2 > > > extract_function_spaces(const std::vector< std::vector< const Form< T, U > * > > &a)
Extract test (0) and trial (1) function spaces pairs for each bilinear form for a rectangular array o...
Definition sparsitypattern.h:41
@ vertex
Vertex.
Definition Form.h:47
@ interior_facet
Interior facet.
Definition Form.h:46
@ ridge
Ridge.
Definition Form.h:48
@ cell
Cell.
Definition Form.h:44
@ exterior_facet
Exterior facet.
Definition Form.h:45
la::SparsityPattern create_sparsity_pattern(const Form< T, U > &a)
Create a sparsity pattern for a given form.
Definition sparsitypattern.h:66
void build_sparsity_pattern(la::SparsityPattern &pattern, const Form< T, U > &a)
Build a sparsity pattern for a given form.
Definition sparsitypattern.h:94
Mesh data structures and algorithms on meshes.
Definition DofMap.h:32