@@ -282,13 +282,16 @@ void build_standard_pattern(dolfinx::la::SparsityPattern& pattern,
282
282
throw std::runtime_error (
283
283
" Cannot create sparsity pattern. Form is not a bilinear." );
284
284
}
285
-
286
285
// Get dof maps and mesh
287
286
std::array<std::reference_wrapper<const dolfinx::fem::DofMap>, 2 > dofmaps{
288
287
*a.function_spaces ().at (0 )->dofmap (),
289
288
*a.function_spaces ().at (1 )->dofmap ()};
290
289
std::shared_ptr mesh = a.mesh ();
291
290
assert (mesh);
291
+ std::shared_ptr mesh0 = a.function_spaces ().at (0 )->mesh ();
292
+ assert (mesh0);
293
+ std::shared_ptr mesh1 = a.function_spaces ().at (1 )->mesh ();
294
+ assert (mesh1);
292
295
293
296
const std::set<dolfinx::fem::IntegralType> types = a.integral_types ();
294
297
if (types.find (dolfinx::fem::IntegralType::interior_facet) != types.end ()
@@ -300,6 +303,16 @@ void build_standard_pattern(dolfinx::la::SparsityPattern& pattern,
300
303
mesh->topology_mutable ()->create_connectivity (tdim - 1 , tdim);
301
304
}
302
305
306
+ auto extract_cells = [](std::span<const std::int32_t > facets)
307
+ {
308
+ assert (facets.size () % 2 == 0 );
309
+ std::vector<std::int32_t > cells;
310
+ cells.reserve (facets.size () / 2 );
311
+ for (std::size_t i = 0 ; i < facets.size (); i += 2 )
312
+ cells.push_back (facets[i]);
313
+ return cells;
314
+ };
315
+
303
316
for (auto type : types)
304
317
{
305
318
std::vector<int > ids = a.integral_ids (type);
@@ -308,33 +321,29 @@ void build_standard_pattern(dolfinx::la::SparsityPattern& pattern,
308
321
case dolfinx::fem::IntegralType::cell:
309
322
for (int id : ids)
310
323
{
311
- std::span< const std:: int32_t > cells = a. domain (type, id);
312
- dolfinx::fem::sparsitybuild::cells ( pattern, cells ,
313
- {{dofmaps[0 ], dofmaps[1 ]}});
324
+ dolfinx::fem::sparsitybuild:: cells(
325
+ pattern, {a. domain (type, id, *mesh0), a. domain (type, id, *mesh1)} ,
326
+ {{dofmaps[0 ], dofmaps[1 ]}});
314
327
}
315
328
break ;
316
329
case dolfinx::fem::IntegralType::interior_facet:
317
330
for (int id : ids)
318
331
{
319
- std::span<const std::int32_t > facets = a.domain (type, id);
320
- std::vector<std::int32_t > f;
321
- f.reserve (facets.size () / 2 );
322
- for (std::size_t i = 0 ; i < facets.size (); i += 4 )
323
- f.insert (f.end (), {facets[i], facets[i + 2 ]});
324
332
dolfinx::fem::sparsitybuild::interior_facets (
325
- pattern, f, {{dofmaps[0 ], dofmaps[1 ]}});
333
+ pattern,
334
+ {extract_cells (a.domain (type, id, *mesh0)),
335
+ extract_cells (a.domain (type, id, *mesh1))},
336
+ {{dofmaps[0 ], dofmaps[1 ]}});
326
337
}
327
338
break ;
328
339
case dolfinx::fem::IntegralType::exterior_facet:
329
340
for (int id : ids)
330
341
{
331
- std::span<const std::int32_t > facets = a.domain (type, id);
332
- std::vector<std::int32_t > cells;
333
- cells.reserve (facets.size () / 2 );
334
- for (std::size_t i = 0 ; i < facets.size (); i += 2 )
335
- cells.push_back (facets[i]);
336
- dolfinx::fem::sparsitybuild::cells (pattern, cells,
337
- {{dofmaps[0 ], dofmaps[1 ]}});
342
+ dolfinx::fem::sparsitybuild::cells (
343
+ pattern,
344
+ {extract_cells (a.domain (type, id, *mesh0)),
345
+ extract_cells (a.domain (type, id, *mesh1))},
346
+ {{dofmaps[0 ], dofmaps[1 ]}});
338
347
}
339
348
break ;
340
349
default :
@@ -985,7 +994,7 @@ evaluate_basis_functions(const dolfinx::fem::FunctionSpace<U>& V,
985
994
auto map = mesh->topology ()->index_map (tdim);
986
995
987
996
// Get geometry data
988
- namespace stdex = std::experimental;
997
+
989
998
MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan<
990
999
const std::int32_t ,
991
1000
MDSPAN_IMPL_STANDARD_NAMESPACE::dextents<std::size_t , 2 >>
@@ -1054,17 +1063,19 @@ evaluate_basis_functions(const dolfinx::fem::FunctionSpace<U>& V,
1054
1063
std::reduce (phi0_shape.begin (), phi0_shape.end (), 1 , std::multiplies{}));
1055
1064
cmdspan4_t phi0 (phi0_b.data (), phi0_shape);
1056
1065
cmap.tabulate (1 , std::vector<U>(tdim, 0 ), {1 , tdim}, phi0_b);
1057
- auto dphi0 = stdex::submdspan (phi0, std::pair (1 , tdim + 1 ), 0 ,
1058
- MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent, 0 );
1066
+ auto dphi0 = MDSPAN_IMPL_STANDARD_NAMESPACE::submdspan (
1067
+ phi0, std::pair (1 , tdim + 1 ), 0 ,
1068
+ MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent, 0 );
1059
1069
1060
1070
// Data structure for evaluating geometry basis at specific points.
1061
1071
// Used in non-affine case.
1062
1072
std::array<std::size_t , 4 > phi_shape = cmap.tabulate_shape (1 , 1 );
1063
1073
std::vector<U> phi_b (
1064
1074
std::reduce (phi_shape.begin (), phi_shape.end (), 1 , std::multiplies{}));
1065
1075
cmdspan4_t phi (phi_b.data (), phi_shape);
1066
- auto dphi = stdex::submdspan (phi, std::pair (1 , tdim + 1 ), 0 ,
1067
- MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent, 0 );
1076
+ auto dphi = MDSPAN_IMPL_STANDARD_NAMESPACE::submdspan (
1077
+ phi, std::pair (1 , tdim + 1 ), 0 ,
1078
+ MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent, 0 );
1068
1079
1069
1080
// Reference coordinates for each point
1070
1081
std::vector<U> Xb (num_points * tdim);
@@ -1088,8 +1099,8 @@ evaluate_basis_functions(const dolfinx::fem::FunctionSpace<U>& V,
1088
1099
continue ;
1089
1100
1090
1101
// Get cell geometry (coordinate dofs)
1091
- auto x_dofs = stdex ::submdspan (x_dofmap, cell_index,
1092
- MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent);
1102
+ auto x_dofs = MDSPAN_IMPL_STANDARD_NAMESPACE ::submdspan (
1103
+ x_dofmap, cell_index, MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent);
1093
1104
for (std::size_t i = 0 ; i < num_dofs_g; ++i)
1094
1105
{
1095
1106
const int pos = 3 * x_dofs[i];
@@ -1100,12 +1111,12 @@ evaluate_basis_functions(const dolfinx::fem::FunctionSpace<U>& V,
1100
1111
for (std::size_t j = 0 ; j < gdim; ++j)
1101
1112
xp (0 , j) = x[3 * p + j];
1102
1113
1103
- auto _J
1104
- = stdex::submdspan ( J, p, MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent,
1105
- MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent);
1106
- auto _K
1107
- = stdex::submdspan ( K, p, MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent,
1108
- MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent);
1114
+ auto _J = MDSPAN_IMPL_STANDARD_NAMESPACE::submdspan (
1115
+ J, p, MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent,
1116
+ MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent);
1117
+ auto _K = MDSPAN_IMPL_STANDARD_NAMESPACE::submdspan (
1118
+ K, p, MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent,
1119
+ MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent);
1109
1120
1110
1121
std::array<U, 3 > Xpb = {0 , 0 , 0 };
1111
1122
MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan<
@@ -1184,15 +1195,15 @@ evaluate_basis_functions(const dolfinx::fem::FunctionSpace<U>& V,
1184
1195
apply_dof_transformation (basis_valuesb, cell_info, cell_index,
1185
1196
(int )reference_value_size);
1186
1197
1187
- auto _U = stdex ::submdspan (full_basis, p,
1188
- MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent,
1189
- MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent);
1190
- auto _J
1191
- = stdex::submdspan ( J, p, MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent,
1192
- MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent);
1193
- auto _K
1194
- = stdex::submdspan ( K, p, MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent,
1195
- MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent);
1198
+ auto _U = MDSPAN_IMPL_STANDARD_NAMESPACE ::submdspan (
1199
+ full_basis, p, MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent,
1200
+ MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent);
1201
+ auto _J = MDSPAN_IMPL_STANDARD_NAMESPACE::submdspan (
1202
+ J, p, MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent,
1203
+ MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent);
1204
+ auto _K = MDSPAN_IMPL_STANDARD_NAMESPACE::submdspan (
1205
+ K, p, MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent,
1206
+ MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent);
1196
1207
push_forward_fn (_U, basis_values, _J, detJ[p], _K);
1197
1208
}
1198
1209
return {output_basis, reference_shape};
@@ -1262,7 +1273,7 @@ std::pair<std::vector<U>, std::array<std::size_t, 2>> tabulate_dof_coordinates(
1262
1273
const std::size_t num_dofs_g = x_dofmap.extent (1 );
1263
1274
1264
1275
// Array to hold coordinates to return
1265
- namespace stdex = std::experimental;
1276
+
1266
1277
std::array<std::size_t , 2 > coord_shape = {dofs.size (), 3 };
1267
1278
if (transposed)
1268
1279
coord_shape = {3 , dofs.size ()};
@@ -1298,9 +1309,9 @@ std::pair<std::vector<U>, std::array<std::size_t, 2>> tabulate_dof_coordinates(
1298
1309
MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan<
1299
1310
const U, MDSPAN_IMPL_STANDARD_NAMESPACE::dextents<std::size_t , 4 >>
1300
1311
phi_full (phi_b.data (), bsize);
1301
- auto phi = stdex ::submdspan (phi_full, 0 ,
1302
- MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent,
1303
- MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent, 0 );
1312
+ auto phi = MDSPAN_IMPL_STANDARD_NAMESPACE ::submdspan (
1313
+ phi_full, 0 , MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent,
1314
+ MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent, 0 );
1304
1315
1305
1316
// Create insertion function
1306
1317
std::function<void (std::size_t , std::size_t , std::ptrdiff_t )> inserter;
@@ -1320,8 +1331,8 @@ std::pair<std::vector<U>, std::array<std::size_t, 2>> tabulate_dof_coordinates(
1320
1331
for (std::size_t c = 0 ; c < cells.size (); ++c)
1321
1332
{
1322
1333
// Fetch the coordinates of the cell
1323
- auto x_dofs = stdex ::submdspan (x_dofmap, cells[c],
1324
- MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent);
1334
+ auto x_dofs = MDSPAN_IMPL_STANDARD_NAMESPACE ::submdspan (
1335
+ x_dofmap, cells[c], MDSPAN_IMPL_STANDARD_NAMESPACE::full_extent);
1325
1336
for (std::size_t i = 0 ; i < num_dofs_g; ++i)
1326
1337
{
1327
1338
const int pos = 3 * x_dofs[i];
0 commit comments