DOLFINx 0.12.0.0
DOLFINx C++
Loading...
Searching...
No Matches
sparsitybuild.h
1// Copyright (C) 2007-2026 Garth N. Wells
2//
3// This file is part of DOLFINx (https://www.fenicsproject.org)
4//
5// SPDX-License-Identifier: LGPL-3.0-or-later
6
7#pragma once
8
9#include "DofMap.h"
10#include "ElementDofLayout.h"
11#include <array>
12#include <cstdint>
13#include <dolfinx/la/SparsityPattern.h>
14#include <functional>
15#include <ranges>
16#include <span>
17#include <utility>
18#include <vector>
19
20namespace dolfinx::fem
21{
22class DofMap;
23
26{
39template <std::ranges::input_range R0, std::ranges::input_range R1>
40void cells(la::SparsityPattern& pattern, const std::pair<R0, R1>& cells,
41 std::array<std::reference_wrapper<const DofMap>, 2> dofmaps)
42{
43 assert(cells.first.size() == cells.second.size());
44 const DofMap& map0 = dofmaps[0].get();
45 const DofMap& map1 = dofmaps[1].get();
46
47 // Reserve entries for all cell-wise outer products.
48 if constexpr (std::ranges::sized_range<R0> and std::ranges::sized_range<R1>)
49 {
50 if (std::size_t num_cells = std::ranges::size(cells.first); num_cells > 0)
51 {
52 std::size_t n0 = map0.cell_dofs(*cells.first.begin()).size();
53 std::size_t n1 = map1.cell_dofs(*cells.second.begin()).size();
54 pattern.reserve_blocks(num_cells, num_cells * n0, num_cells * n1);
55 }
56 }
57
58 for (auto cell0 = cells.first.begin(), cell1 = cells.second.begin();
59 cell0 != cells.first.end() and cell1 != cells.second.end();
60 ++cell0, ++cell1)
61 {
62 pattern.insert(map0.cell_dofs(*cell0), map1.cell_dofs(*cell1));
63 }
64}
65
75std::vector<std::pair<std::span<const int>, std::span<const int>>>
77 const ElementDofLayout& layout_cols);
78
101void entity_closure(
102 la::SparsityPattern& pattern, std::span<const std::int32_t> cells,
103 std::array<std::reference_wrapper<const DofMap>, 2> dofmaps);
104
121void interior_facets(
122 la::SparsityPattern& pattern,
123 std::array<std::span<const std::int32_t>, 2> cells,
124 std::array<std::reference_wrapper<const DofMap>, 2> dofmaps);
125
126} // namespace sparsitybuild
127} // namespace dolfinx::fem
Degree-of-freedom map representations and tools.
Degree-of-freedom map.
Definition DofMap.h:73
std::span< const std::int32_t > cell_dofs(std::int32_t c) const
Local-to-global mapping of dofs on a cell.
Definition DofMap.h:127
Definition ElementDofLayout.h:31
Definition SparsityPattern.h:28
void reserve_blocks(std::size_t num_blocks, std::size_t num_rows, std::size_t num_cols)
Reserve storage for additional insert(rows, cols) calls.
Definition SparsityPattern.cpp:370
void insert(std::int32_t row, std::int32_t col)
Insert non-zero locations using local (process-wise) indices.
Definition SparsityPattern.cpp:398
Support for building sparsity patterns from degree-of-freedom maps.
Definition sparsitybuild.h:26
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:101
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:40
void entity_closure(la::SparsityPattern &pattern, std::span< const std::int32_t > cells, std::array< std::reference_wrapper< const DofMap >, 2 > dofmaps)
Iterate over cells and insert the entity-closure blocks into a sparsity pattern.
Definition sparsitybuild.cpp:40
std::vector< std::pair< std::span< const int >, std::span< const int > > > entity_closure_blocks(const ElementDofLayout &layout_rows, const ElementDofLayout &layout_cols)
Element-matrix blocks of an entity-closure stencil.
Definition sparsitybuild.cpp:20
Finite element method functionality.
Definition assemble_expression_impl.h:28