27namespace dolfinx::fem::impl
71template <dolfinx::scalar T, std::
floating_po
int U>
74 std::array<std::size_t, 2> Xshape, std::size_t value_size,
75 std::size_t num_argument_dofs,
76 md::mdspan<
const std::int32_t, md::dextents<std::size_t, 2>> x_dofmap,
78 md::mdspan<
const T, md::dextents<std::size_t, 2>> coeffs,
79 std::span<const T> constants,
fem::MDSpan2 auto entities,
80 std::span<const std::uint32_t> cell_info,
81 std::span<const std::int32_t> argument_cells,
83 md::mdspan<
const std::uint8_t, md::dextents<std::size_t, 2>> perms)
85 static_assert(entities.rank() == 1 or entities.rank() == 2);
88 std::vector<U> coord_dofs(3 * x_dofmap.extent(1));
91 md::mdspan<const U, md::extents<std::size_t, md::dynamic_extent, 3>>(
92 x.data(), x.size() / 3, 3)};
95 int size0 = Xshape[0] * value_size;
96 std::vector<T> values_local(size0 * num_argument_dofs, 0);
97 std::size_t offset = values_local.size();
99 const T* coeffs_data = coeffs.data_handle();
100 const std::size_t cstride = coeffs.extent(1);
102 for (std::size_t e = 0; e < entities.extent(0); ++e)
104 std::ranges::fill(values_local, T(0));
105 if constexpr (entities.rank() == 1)
107 std::int32_t entity = entities(e);
108 gather_cell_coordinates(
geometry, entity, coord_dofs.data());
109 fn(values_local.data(), coeffs_data + e * cstride, constants.data(),
110 coord_dofs.data(),
nullptr,
nullptr,
nullptr);
112 P0(values_local, cell_info,
113 argument_cells.empty() ? entity : argument_cells[e], size0);
117 std::int32_t entity = entities(e, 0);
118 std::int32_t local_entity = entities(e, 1);
119 std::uint8_t perm = perms.empty() ? 0 : perms(entity, local_entity);
120 gather_cell_coordinates(
geometry, entity, coord_dofs.data());
121 fn(values_local.data(), coeffs_data + e * cstride, constants.data(),
122 coord_dofs.data(), &local_entity, &perm,
nullptr);
123 P0(values_local, cell_info,
124 argument_cells.empty() ? entity : argument_cells[e], size0);
127 for (std::size_t j = 0; j < values_local.size(); ++j)
128 values[e * offset + j] = values_local[j];
170template <dolfinx::scalar T, std::
floating_po
int U>
173 std::array<std::size_t, 2> Xshape, std::size_t value_size,
174 md::mdspan<
const T, md::dextents<std::size_t, 2>> coeffs,
180 std::span<const std::uint32_t> cell_info,
181 std::span<const std::int32_t> argument_cells)
183 assert(argument_cells.empty() or argument_cells.size() == entities.extent(0));
185 std::function<void(std::span<T>, std::span<const std::uint32_t>, std::int32_t,
188 = [](std::span<T>, std::span<const std::uint32_t>, std::int32_t, int)
193 std::size_t num_argument_dofs = 1;
196 num_argument_dofs = element->second;
197 if (element->first.get().needs_dof_transformations())
200 = element->first.get().template dof_transformation_right_fn<T>(
210 md::mdspan<const std::uint8_t, md::dextents<std::size_t, 2>> perms;
211 if constexpr (std::remove_cvref_t<
decltype(entities)>::rank() == 2)
217 mesh.geometry().dofmaps().front(),
mesh.geometry().x(),
218 coeffs, constants, entities, cell_info, argument_cells,
219 post_dof_transform, perms);
void tabulate_expression(std::span< T > values, const fem::Expression< T, U > &e, md::mdspan< const T, md::dextents< std::size_t, 2 > > coeffs, std::span< const T > constants, const mesh::Mesh< U > &mesh, fem::MDSpan2 auto entities, std::optional< std::pair< std::reference_wrapper< const FiniteElement< U > >, std::size_t > > element)
Evaluate an Expression on cells, facets, ridges or peaks.
Definition expression_evaluate.h:169