11#include <basix/mdspan.hpp>
14#include <dolfinx/common/IndexMap.h>
15#include <dolfinx/common/MPI.h>
16#include <dolfinx/common/sort.h>
17#include <dolfinx/fem/CoordinateElement.h>
18#include <dolfinx/fem/ElementDofLayout.h>
19#include <dolfinx/fem/dofmapbuilder.h>
20#include <dolfinx/graph/AdjacencyList.h>
21#include <dolfinx/graph/partition.h>
35template <std::
floating_po
int T>
65 template <
typename U,
typename V,
typename W>
66 requires std::is_convertible_v<std::remove_cvref_t<U>,
67 std::vector<std::vector<std::int32_t>>>
68 and std::is_convertible_v<std::remove_cvref_t<V>,
70 and std::is_convertible_v<std::remove_cvref_t<W>,
71 std::vector<std::int64_t>>
75 typename std::remove_reference_t<typename V::value_type>>>& elements,
77 : _dim(
dim), _dofmaps(std::forward<U>(
dofmaps)),
78 _index_map(std::move(
index_map)), _cmaps(elements),
79 _x(std::forward<V>(
x)),
82 assert(_x.size() % 3 == 0);
83 if (_x.size() / 3 != _input_global_indices.size())
84 throw std::runtime_error(
"Geometry size mismatch.");
86 if (_dofmaps.size() != _cmaps.size())
88 throw std::runtime_error(
"Geometry number of dofmaps not equal to the "
89 "number of coordinate elements.");
111 int dim()
const {
return _dim; }
116 [[deprecated(
"Use dofmaps().front() instead.")]]
117 md::mdspan<const std::int32_t, md::dextents<std::size_t, 2>>
dofmap()
const
119 if (_dofmaps.size() != 1)
120 throw std::runtime_error(
"Multiple dofmaps");
121 std::size_t ndofs = _cmaps.front().dim();
122 return md::mdspan<const std::int32_t, md::dextents<std::size_t, 2>>(
123 _dofmaps.front().data(), _dofmaps.front().size() / ndofs, ndofs);
130 std::vector<md::mdspan<const std::int32_t, md::dextents<std::size_t, 2>>>
133 std::vector<md::mdspan<const std::int32_t, md::dextents<std::size_t, 2>>>
134 dms(_dofmaps.size());
135 for (std::size_t i = 0; i < _dofmaps.size(); ++i)
137 std::size_t ndofs = _cmaps.at(i).dim();
138 dms[i] = md::mdspan<const std::int32_t, md::dextents<std::size_t, 2>>(
139 _dofmaps.at(i).data(), _dofmaps.at(i).size() / ndofs, ndofs);
146 std::shared_ptr<const common::IndexMap>
index_map()
const
155 std::span<const value_type>
x()
const {
return _x; }
162 std::span<value_type>
x() {
return _x; }
166 const std::vector<fem::CoordinateElement<value_type>>&
cmaps()
const
174 return _input_global_indices;
182 std::vector<std::vector<std::int32_t>> _dofmaps;
185 std::shared_ptr<const common::IndexMap> _index_map;
188 std::vector<fem::CoordinateElement<value_type>> _cmaps;
192 std::vector<value_type> _x;
195 std::vector<std::int64_t> _input_global_indices;
200template <
typename U,
typename V,
typename W>
201Geometry(std::shared_ptr<const common::IndexMap>, U&&,
203 typename std::remove_reference_t<typename V::value_type>>>&,
205 -> Geometry<typename std::remove_cvref_t<typename V::value_type>>;
233Geometry<typename std::remove_reference_t<typename U::value_type>>
236 std::remove_reference_t<typename U::value_type>>>& elements,
237 std::span<const std::int64_t> nodes,
238 std::span<const std::int64_t> xdofs,
const U& x,
int dim,
239 const std::function<std::vector<int>(
243 spdlog::info(
"Create Geometry (multiple)");
245 assert(std::ranges::is_sorted(nodes));
246 using T =
typename std::remove_reference_t<typename U::value_type>;
249 const int tdim = topology.
dim();
250 const std::size_t num_cell_types = topology.
entity_types(tdim).size();
251 if (elements.size() != num_cell_types)
252 throw std::runtime_error(
"Mismatch between topology and geometry.");
254 std::vector<fem::ElementDofLayout> dof_layouts;
255 dof_layouts.reserve(elements.size());
256 for (
auto& el : elements)
257 dof_layouts.push_back(el.create_dof_layout());
259 spdlog::info(
"Got {} dof layouts", dof_layouts.size());
262 auto [_dof_index_map, bs, dofmaps]
264 topology, dof_layouts, reorder_fn);
266 = std::make_shared<common::IndexMap>(std::move(_dof_index_map));
269 if (elements.front().needs_dof_permutations())
271 const std::int32_t num_cells
273 const std::vector<std::uint32_t>& cell_info
275 int d = elements.front().dim();
276 for (std::int32_t cell = 0; cell < num_cells; ++cell)
278 std::span dofs(dofmaps.front().data() + cell * d, d);
279 elements.front().permute_inv(dofs, cell_info[cell]);
283 spdlog::info(
"Calling compute_local_to_global");
290 spdlog::info(
"xdofs.size = {}", xdofs.size());
291 std::vector<std::int32_t> all_dofmaps;
293 for (
auto q : dofmaps)
295 std::format_to(std::back_inserter(s),
"{} ", q.size());
296 all_dofmaps.insert(all_dofmaps.end(), q.begin(), q.end());
298 spdlog::info(
"dofmap sizes = {}", s);
299 spdlog::info(
"all_dofmaps.size = {}", all_dofmaps.size());
300 spdlog::info(
"nodes.size = {}", nodes.size());
306 std::vector<std::int64_t> igi(nodes.size());
307 std::ranges::transform(l2l, igi.begin(),
308 [&nodes](
auto index) { return nodes[index]; });
311 assert(x.size() % dim == 0);
312 const std::size_t shape0 = x.size() / dim;
313 const std::size_t shape1 = dim;
314 std::vector<T> xg(3 * shape0, 0);
315 for (std::size_t i = 0; i < shape0; ++i)
317 std::copy_n(std::next(x.begin(), shape1 * l2l[i]), shape1,
318 std::next(xg.begin(), 3 * i));
321 spdlog::info(
"Creating geometry with {} dofmaps", dof_layouts.size());
323 return Geometry(dof_index_map, std::move(dofmaps), elements, std::move(xg),
324 dim, std::move(igi));
Definition CoordinateElement.h:38
This class provides a static adjacency list data structure.
Definition AdjacencyList.h:41
Geometry stores the geometry imposed on a mesh.
Definition Geometry.h:37
~Geometry()=default
Destructor.
std::span< value_type > x()
Access geometry degrees-of-freedom data (non-const version).
Definition Geometry.h:162
Geometry(std::shared_ptr< const common::IndexMap > index_map, U &&dofmaps, const std::vector< fem::CoordinateElement< typename std::remove_reference_t< typename V::value_type > > > &elements, V &&x, int dim, W &&input_global_indices)
Constructor of object that holds mesh geometry data.
Definition Geometry.h:72
std::shared_ptr< const common::IndexMap > index_map() const
Index map for the geometry 'degrees-of-freedom'.
Definition Geometry.h:146
Geometry(Geometry &&)=default
Move constructor.
Geometry(const Geometry &)=default
Copy constructor.
std::vector< md::mdspan< const std::int32_t, md::dextents< std::size_t, 2 > > > dofmaps() const
Degree-of-freedom map associated with each coordinate map element in the geometry.
Definition Geometry.h:131
int dim() const
Return dimension of the Euclidean coordinate system.
Definition Geometry.h:111
Geometry & operator=(Geometry &&)=default
Move assignment.
md::mdspan< const std::int32_t, md::dextents< std::size_t, 2 > > dofmap() const
DofMap for the geometry.
Definition Geometry.h:117
const std::vector< std::int64_t > & input_global_indices() const
Global user indices.
Definition Geometry.h:172
std::span< const value_type > x() const
Access geometry degrees-of-freedom data (const version).
Definition Geometry.h:155
Geometry & operator=(const Geometry &)=delete
Copy assignment.
const std::vector< fem::CoordinateElement< value_type > > & cmaps() const
The elements that describes the geometry map.
Definition Geometry.h:166
T value_type
Value type.
Definition Geometry.h:40
Topology stores the topology of a mesh, consisting of mesh entities and connectivity (incidence relat...
Definition Topology.h:49
const std::vector< std::uint32_t > & get_cell_permutation_info() const
Returns the permutation information.
Definition Topology.cpp:915
std::shared_ptr< const graph::AdjacencyList< std::int32_t > > connectivity(std::array< int, 2 > d0, std::array< int, 2 > d1) const
Get the connectivity from entities of topological dimension d0 to dimension d1.
Definition Topology.cpp:895
const std::vector< CellType > & entity_types(int dim) const
Entity types in the topology for a given dimension.
Definition Topology.cpp:838
int dim() const noexcept
Topological dimension of the mesh.
Definition Topology.cpp:833
std::vector< std::shared_ptr< const common::IndexMap > > index_maps(int dim) const
Get the index maps that described the parallel distribution of the mesh entities of a given topologic...
Definition Topology.cpp:861
std::tuple< common::IndexMap, int, std::vector< std::vector< std::int32_t > > > build_dofmap_data(MPI_Comm comm, const mesh::Topology &topology, const std::vector< ElementDofLayout > &element_dof_layouts, const std::function< std::vector< int >(const graph::AdjacencyList< std::int32_t > &)> &reorder_fn)
Definition dofmapbuilder.cpp:642
std::vector< std::int64_t > compute_local_to_global(std::span< const std::int64_t > global, std::span< const std::int32_t > local)
Definition partition.cpp:543
std::vector< std::int32_t > compute_local_to_local(std::span< const std::int64_t > local0_to_global, std::span< const std::int64_t > local1_to_global)
Compute a local0-to-local1 map from two local-to-global maps with common global indices.
Definition partition.cpp:565
Mesh data structures and algorithms on meshes.
Definition DofMap.h:32
Geometry< typename std::remove_reference_t< typename U::value_type > > create_geometry(const Topology &topology, const std::vector< fem::CoordinateElement< std::remove_reference_t< typename U::value_type > > > &elements, std::span< const std::int64_t > nodes, std::span< const std::int64_t > xdofs, const U &x, int dim, const std::function< std::vector< int >(const graph::AdjacencyList< std::int32_t > &)> &reorder_fn=nullptr)
Build Geometry from input data.
Definition Geometry.h:234