99 using BoundaryMap = std::map<unsigned int, Polydim::PDETools::DOFs::DOFsManager::MeshDOFsInfo::BoundaryInfo>;
110 std::array<unsigned int, DOFSMANAGER_MAX_DIMENSION + 1>
NumDOFs;
111 std::map<unsigned int, Polydim::PDETools::DOFs::DOFsManager::MeshDOFsInfo::BoundaryInfo>
BoundaryInfo;
165 void ConcatenateGlobalDOFs(
const unsigned int local_cell_dimension,
166 const unsigned int local_cell_index,
167 const std::vector<typename DOFsData::DOF> &local_cell_DOFs,
168 std::vector<typename DOFsData::GlobalCell_DOF> &global_cell_DOFs,
169 unsigned int &globalDOF_counter)
const;
176 void CreateCellDOFs(
const MeshDOFsInfo &meshDOFsInfo,
DOFsData &dofs,
const unsigned int dim)
const;
178 template <
class mesh_connectivity_data_
class>
179 void Create_Constant_DOFsInfo_0D(
const mesh_connectivity_data_class &mesh,
187 mesh_dof_info.CellsNumDOFs[0].resize(mesh.Cell0Ds_number(), boundary_info.NumDOFs[0]);
188 mesh_dof_info.CellsBoundaryInfo[0].resize(mesh.Cell0Ds_number());
190 for (
unsigned int c = 0; c < mesh.Cell0Ds_number(); ++c)
192 mesh_dof_info.CellsBoundaryInfo[0][c] = boundary_info.BoundaryInfo.at(mesh.Cell0D_marker(c));
196 template <
class mesh_connectivity_data_
class>
197 void Create_Constant_DOFsInfo_1D(
const mesh_connectivity_data_class &mesh,
198 const ConstantDOFsInfo &boundary_info,
199 MeshDOFsInfo &mesh_dof_info)
const
202 requires(is_mesh_connectivity_class_1D<mesh_connectivity_data_class>)
205 mesh_dof_info.CellsNumDOFs[1].resize(mesh.Cell1Ds_number(), boundary_info.NumDOFs[1]);
206 mesh_dof_info.CellsBoundaryInfo[1].resize(mesh.Cell1Ds_number());
208 for (
unsigned int c = 0; c < mesh.Cell1Ds_number(); ++c)
210 mesh_dof_info.CellsBoundaryInfo[1][c] = boundary_info.BoundaryInfo.at(mesh.Cell1D_marker(c));
214 template <
class mesh_connectivity_data_
class>
215 void Create_Constant_DOFsInfo_2D(
const mesh_connectivity_data_class &mesh,
216 const ConstantDOFsInfo &boundary_info,
217 MeshDOFsInfo &mesh_dof_info)
const
220 requires(is_mesh_connectivity_class_2D<mesh_connectivity_data_class>)
223 mesh_dof_info.CellsNumDOFs[2].resize(mesh.Cell2Ds_number(), boundary_info.NumDOFs[2]);
224 mesh_dof_info.CellsBoundaryInfo[2].resize(mesh.Cell2Ds_number());
226 for (
unsigned int c = 0; c < mesh.Cell2Ds_number(); ++c)
228 mesh_dof_info.CellsBoundaryInfo[2][c] = boundary_info.BoundaryInfo.at(mesh.Cell2D_marker(c));
232 template <
class mesh_connectivity_data_
class>
233 void Create_Constant_DOFsInfo_3D(
const mesh_connectivity_data_class &mesh,
234 const ConstantDOFsInfo &boundary_info,
235 MeshDOFsInfo &mesh_dof_info)
const
238 requires(is_mesh_connectivity_class_3D<mesh_connectivity_data_class>)
241 mesh_dof_info.CellsNumDOFs[3].resize(mesh.Cell3Ds_number(), boundary_info.NumDOFs[3]);
242 mesh_dof_info.CellsBoundaryInfo[3].resize(mesh.Cell3Ds_number());
244 for (
unsigned int c = 0; c < mesh.Cell3Ds_number(); ++c)
246 mesh_dof_info.CellsBoundaryInfo[3][c] = boundary_info.BoundaryInfo.at(mesh.Cell3D_marker(c));
252 template <
unsigned int dimension>
254 void CreateCell0DDOFs(
const MeshDOFsInfo &meshDOFsInfo, DOFsData &dofs)
const
262 CreateCellDOFs(meshDOFsInfo, dofs, 0);
264 const unsigned int numCells = meshDOFsInfo.CellsNumDOFs.at(0).size();
266 auto &cellsGlobalDOFs = dofs.CellsGlobalDOFs.at(0);
267 auto &cellsGlobalNumberDOFs = dofs.CellsGlobalNumberDOFs.at(0);
268 auto &cellsGlobalNumberStrongs = dofs.CellsGlobalNumberStrongs.at(0);
270 cellsGlobalDOFs.resize(numCells);
271 cellsGlobalNumberDOFs.resize(numCells, 0);
272 cellsGlobalNumberStrongs.resize(numCells, 0);
274 for (
unsigned int cell0DIndex = 0; cell0DIndex < numCells; cell0DIndex++)
276 const auto &cell0D_DOFs = dofs.CellsDOFs.at(0).at(cell0DIndex);
278 const unsigned int cellNumGlobalDOFs = cell0D_DOFs.size();
279 cellsGlobalDOFs[cell0DIndex].resize(cellNumGlobalDOFs);
281 cellsGlobalNumberDOFs[cell0DIndex] += dofs.CellsNumberDOFs.at(0).at(cell0DIndex);
282 cellsGlobalNumberStrongs[cell0DIndex] += dofs.CellsNumberStrongs.at(0).at(cell0DIndex);
284 unsigned int globalDOF_counter = 0;
286 ConcatenateGlobalDOFs(0, cell0DIndex, cell0D_DOFs, cellsGlobalDOFs[cell0DIndex], globalDOF_counter);
291 template <
class mesh_connectivity_data_
class>
293 template <
unsigned int dimension,
class mesh_connectivity_data_
class>
295 void CreateCell1DDOFs(
const MeshDOFsInfo &meshDOFsInfo,
const mesh_connectivity_data_class &mesh, DOFsData &dofs)
const
298 requires(is_mesh_connectivity_class_1D<mesh_connectivity_data_class>)
307 CreateCellDOFs(meshDOFsInfo, dofs, 1);
309 const unsigned int numCells = meshDOFsInfo.CellsNumDOFs.at(1).size();
311 auto &cellsGlobalDOFs = dofs.CellsGlobalDOFs.at(1);
312 auto &cellsGlobalNumberDOFs = dofs.CellsGlobalNumberDOFs.at(1);
313 auto &cellsGlobalNumberStrongs = dofs.CellsGlobalNumberStrongs.at(1);
314 auto &cellsGlobalHasInternalDOFs = dofs.CellsGlobalHasInternalDOFs.at(1);
315 auto &cellsGlobalHasBoundaryDOFs = dofs.CellsGlobalHasBoundaryDOFs.at(1);
317 cellsGlobalDOFs.resize(numCells);
318 cellsGlobalNumberDOFs.resize(numCells, 0);
319 cellsGlobalNumberStrongs.resize(numCells, 0);
320 cellsGlobalHasInternalDOFs.resize(numCells,
false);
321 cellsGlobalHasBoundaryDOFs.resize(numCells,
false);
323 for (
unsigned int cell1DIndex = 0; cell1DIndex < numCells; cell1DIndex++)
325 const auto cell1D_vertices = mesh.Cell1D_vertices(cell1DIndex);
327 const unsigned int cell1D_origin_cell0DIndex = cell1D_vertices.at(0);
328 const unsigned int cell1D_end_cell0DIndex = cell1D_vertices.at(1);
330 const auto &origin_cell0D_DOFs = dofs.CellsDOFs.at(0).at(cell1D_origin_cell0DIndex);
331 const auto &end_cell0D_DOFs = dofs.CellsDOFs.at(0).at(cell1D_end_cell0DIndex);
332 const auto &cell1D_DOFs = dofs.CellsDOFs.at(1).at(cell1DIndex);
334 const unsigned int cellNumGlobalDOFs = origin_cell0D_DOFs.size() + end_cell0D_DOFs.size() + cell1D_DOFs.size();
335 cellsGlobalDOFs[cell1DIndex].resize(cellNumGlobalDOFs);
337 unsigned int globalDOF_counter = 0;
339 cellsGlobalNumberDOFs[cell1DIndex] += dofs.CellsNumberDOFs.at(0).at(cell1D_origin_cell0DIndex);
340 cellsGlobalNumberStrongs[cell1DIndex] += dofs.CellsNumberStrongs.at(0).at(cell1D_origin_cell0DIndex);
342 if (dofs.CellsHasInternalDOFs.at(0).at(cell1D_origin_cell0DIndex))
343 cellsGlobalHasInternalDOFs[cell1DIndex] =
true;
345 if (dofs.CellsHasBoundaryDOFs.at(0).at(cell1D_origin_cell0DIndex))
346 cellsGlobalHasBoundaryDOFs[cell1DIndex] =
true;
348 cellsGlobalNumberDOFs[cell1DIndex] += dofs.CellsNumberDOFs.at(0).at(cell1D_end_cell0DIndex);
349 cellsGlobalNumberStrongs[cell1DIndex] += dofs.CellsNumberStrongs.at(0).at(cell1D_end_cell0DIndex);
351 if (dofs.CellsHasInternalDOFs.at(0).at(cell1D_end_cell0DIndex))
352 cellsGlobalHasInternalDOFs[cell1DIndex] =
true;
354 if (dofs.CellsHasBoundaryDOFs.at(0).at(cell1D_end_cell0DIndex))
355 cellsGlobalHasBoundaryDOFs[cell1DIndex] =
true;
357 cellsGlobalNumberDOFs[cell1DIndex] += dofs.CellsNumberDOFs.at(1).at(cell1DIndex);
358 cellsGlobalNumberStrongs[cell1DIndex] += dofs.CellsNumberStrongs.at(1).at(cell1DIndex);
360 ConcatenateGlobalDOFs(0, cell1D_origin_cell0DIndex, origin_cell0D_DOFs, cellsGlobalDOFs[cell1DIndex], globalDOF_counter);
361 ConcatenateGlobalDOFs(0, cell1D_end_cell0DIndex, end_cell0D_DOFs, cellsGlobalDOFs[cell1DIndex], globalDOF_counter);
362 ConcatenateGlobalDOFs(1, cell1DIndex, cell1D_DOFs, cellsGlobalDOFs[cell1DIndex], globalDOF_counter);
367 template <
class mesh_connectivity_data_
class>
369 template <
unsigned int dimension,
class mesh_connectivity_data_
class>
371 void CreateCell2DDOFs(
const MeshDOFsInfo &meshDOFsInfo,
const mesh_connectivity_data_class &mesh, DOFsData &dofs)
const
374 requires(is_mesh_connectivity_class_2D<mesh_connectivity_data_class>)
383 CreateCellDOFs(meshDOFsInfo, dofs, 2);
385 const unsigned int numCells = meshDOFsInfo.CellsNumDOFs.at(2).size();
387 auto &cellsGlobalDOFs = dofs.CellsGlobalDOFs.at(2);
388 auto &cellsGlobalNumberDOFs = dofs.CellsGlobalNumberDOFs.at(2);
389 auto &cellsGlobalNumberStrongs = dofs.CellsGlobalNumberStrongs.at(2);
390 auto &cellsGlobalHasInternalDOFs = dofs.CellsGlobalHasInternalDOFs.at(2);
391 auto &cellsGlobalHasBoundaryDOFs = dofs.CellsGlobalHasBoundaryDOFs.at(2);
393 cellsGlobalDOFs.resize(numCells);
394 cellsGlobalNumberDOFs.resize(numCells, 0);
395 cellsGlobalNumberStrongs.resize(numCells, 0);
396 cellsGlobalHasInternalDOFs.resize(numCells,
false);
397 cellsGlobalHasBoundaryDOFs.resize(numCells,
false);
399 for (
unsigned int cell2DIndex = 0; cell2DIndex < numCells; cell2DIndex++)
401 unsigned int cellNumGlobalDOFs = dofs.CellsDOFs.at(2).at(cell2DIndex).size();
403 const auto cell2D_vertices = mesh.Cell2D_vertices(cell2DIndex);
405 for (
unsigned int v = 0; v < cell2D_vertices.size(); v++)
407 const unsigned int vertex_cell0DIndex = cell2D_vertices.at(v);
408 cellNumGlobalDOFs += dofs.CellsDOFs.at(0).at(vertex_cell0DIndex).size();
411 const auto cell2D_edges = mesh.Cell2D_edges(cell2DIndex);
413 for (
unsigned int e = 0; e < cell2D_edges.size(); e++)
415 const unsigned int edge_cell1DIndex = cell2D_edges.at(e);
416 cellNumGlobalDOFs += dofs.CellsDOFs.at(1).at(edge_cell1DIndex).size();
419 cellsGlobalDOFs[cell2DIndex].resize(cellNumGlobalDOFs);
421 unsigned int globalDOF_counter = 0;
423 for (
unsigned int v = 0; v < cell2D_vertices.size(); v++)
425 const unsigned int vertex_cell0DIndex = cell2D_vertices.at(v);
426 ConcatenateGlobalDOFs(0, vertex_cell0DIndex, dofs.CellsDOFs.at(0).at(vertex_cell0DIndex), cellsGlobalDOFs[cell2DIndex], globalDOF_counter);
428 cellsGlobalNumberDOFs[cell2DIndex] += dofs.CellsNumberDOFs.at(0).at(vertex_cell0DIndex);
429 cellsGlobalNumberStrongs[cell2DIndex] += dofs.CellsNumberStrongs.at(0).at(vertex_cell0DIndex);
432 for (
unsigned int e = 0; e < cell2D_edges.size(); e++)
434 const unsigned int edge_cell1DIndex = cell2D_edges.at(e);
435 ConcatenateGlobalDOFs(1, edge_cell1DIndex, dofs.CellsDOFs.at(1).at(edge_cell1DIndex), cellsGlobalDOFs[cell2DIndex], globalDOF_counter);
437 cellsGlobalNumberDOFs[cell2DIndex] += dofs.CellsNumberDOFs.at(1).at(edge_cell1DIndex);
438 cellsGlobalNumberStrongs[cell2DIndex] += dofs.CellsNumberStrongs.at(1).at(edge_cell1DIndex);
440 if (dofs.CellsHasInternalDOFs.at(1).at(edge_cell1DIndex))
441 cellsGlobalHasInternalDOFs[cell2DIndex] =
true;
443 if (dofs.CellsHasBoundaryDOFs.at(1).at(edge_cell1DIndex))
444 cellsGlobalHasBoundaryDOFs[cell2DIndex] =
true;
447 ConcatenateGlobalDOFs(2, cell2DIndex, dofs.CellsDOFs.at(2).at(cell2DIndex), cellsGlobalDOFs[cell2DIndex], globalDOF_counter);
449 cellsGlobalNumberDOFs[cell2DIndex] += dofs.CellsNumberDOFs.at(2).at(cell2DIndex);
450 cellsGlobalNumberStrongs[cell2DIndex] += dofs.CellsNumberStrongs.at(2).at(cell2DIndex);
455 template <
class mesh_connectivity_data_
class>
457 template <
unsigned int dimension,
class mesh_connectivity_data_
class>
459 void CreateCell3DDOFs(
const MeshDOFsInfo &meshDOFsInfo,
const mesh_connectivity_data_class &mesh, DOFsData &dofs)
const
462 requires(is_mesh_connectivity_class_3D<mesh_connectivity_data_class>)
471 CreateCellDOFs(meshDOFsInfo, dofs, 3);
473 const unsigned int numCells = meshDOFsInfo.CellsNumDOFs.at(3).size();
475 auto &cellsGlobalDOFs = dofs.CellsGlobalDOFs.at(3);
476 auto &cellsGlobalNumberDOFs = dofs.CellsGlobalNumberDOFs.at(3);
477 auto &cellsGlobalNumberStrongs = dofs.CellsGlobalNumberStrongs.at(3);
478 auto &cellsGlobalHasInternalDOFs = dofs.CellsGlobalHasInternalDOFs.at(3);
479 auto &cellsGlobalHasBoundaryDOFs = dofs.CellsGlobalHasBoundaryDOFs.at(3);
481 cellsGlobalDOFs.resize(numCells);
482 cellsGlobalNumberDOFs.resize(numCells, 0);
483 cellsGlobalNumberStrongs.resize(numCells, 0);
484 cellsGlobalHasInternalDOFs.resize(numCells,
false);
485 cellsGlobalHasBoundaryDOFs.resize(numCells,
false);
487 for (
unsigned int cell3DIndex = 0; cell3DIndex < numCells; cell3DIndex++)
489 unsigned int cellNumGlobalDOFs = dofs.CellsDOFs.at(3).at(cell3DIndex).size();
490 const auto cell3D_vertices = mesh.Cell3D_vertices(cell3DIndex);
491 const auto cell3D_edges = mesh.Cell3D_edges(cell3DIndex);
492 const auto cell3D_faces = mesh.Cell3D_faces(cell3DIndex);
494 for (
unsigned int v = 0; v < cell3D_vertices.size(); v++)
496 const unsigned int vertex_cell0DIndex = cell3D_vertices.at(v);
497 cellNumGlobalDOFs += dofs.CellsDOFs.at(0).at(vertex_cell0DIndex).size();
500 for (
unsigned int e = 0; e < cell3D_edges.size(); e++)
502 const unsigned int edge_cell1DIndex = cell3D_edges.at(e);
503 cellNumGlobalDOFs += dofs.CellsDOFs.at(1).at(edge_cell1DIndex).size();
506 for (
unsigned int f = 0; f < cell3D_faces.size(); f++)
508 const unsigned int face_cell2DIndex = cell3D_faces.at(f);
509 cellNumGlobalDOFs += dofs.CellsDOFs.at(2).at(face_cell2DIndex).size();
512 cellsGlobalDOFs[cell3DIndex].resize(cellNumGlobalDOFs);
514 unsigned int globalDOF_counter = 0;
516 for (
unsigned int v = 0; v < cell3D_vertices.size(); v++)
518 const unsigned int vertex_cell0DIndex = cell3D_vertices.at(v);
519 ConcatenateGlobalDOFs(0, vertex_cell0DIndex, dofs.CellsDOFs.at(0).at(vertex_cell0DIndex), cellsGlobalDOFs[cell3DIndex], globalDOF_counter);
521 cellsGlobalNumberDOFs[cell3DIndex] += dofs.CellsNumberDOFs.at(0).at(vertex_cell0DIndex);
522 cellsGlobalNumberStrongs[cell3DIndex] += dofs.CellsNumberStrongs.at(0).at(vertex_cell0DIndex);
525 for (
unsigned int e = 0; e < cell3D_edges.size(); e++)
527 const unsigned int edge_cell1DIndex = cell3D_edges.at(e);
528 ConcatenateGlobalDOFs(1, edge_cell1DIndex, dofs.CellsDOFs.at(1).at(edge_cell1DIndex), cellsGlobalDOFs[cell3DIndex], globalDOF_counter);
530 cellsGlobalNumberDOFs[cell3DIndex] += dofs.CellsNumberDOFs.at(1).at(edge_cell1DIndex);
531 cellsGlobalNumberStrongs[cell3DIndex] += dofs.CellsNumberStrongs.at(1).at(edge_cell1DIndex);
534 for (
unsigned int f = 0; f < cell3D_faces.size(); f++)
536 const unsigned int face_cell2DIndex = cell3D_faces.at(f);
537 ConcatenateGlobalDOFs(2, face_cell2DIndex, dofs.CellsDOFs.at(2).at(face_cell2DIndex), cellsGlobalDOFs[cell3DIndex], globalDOF_counter);
539 cellsGlobalNumberDOFs[cell3DIndex] += dofs.CellsNumberDOFs.at(2).at(face_cell2DIndex);
540 cellsGlobalNumberStrongs[cell3DIndex] += dofs.CellsNumberStrongs.at(2).at(face_cell2DIndex);
542 if (dofs.CellsHasInternalDOFs.at(2).at(face_cell2DIndex))
543 cellsGlobalHasInternalDOFs[cell3DIndex] =
true;
545 if (dofs.CellsHasBoundaryDOFs.at(2).at(face_cell2DIndex))
546 cellsGlobalHasBoundaryDOFs[cell3DIndex] =
true;
549 ConcatenateGlobalDOFs(3, cell3DIndex, dofs.CellsDOFs.at(3).at(cell3DIndex), cellsGlobalDOFs[cell3DIndex], globalDOF_counter);
551 cellsGlobalNumberDOFs[cell3DIndex] += dofs.CellsNumberDOFs.at(3).at(cell3DIndex);
552 cellsGlobalNumberStrongs[cell3DIndex] += dofs.CellsNumberStrongs.at(3).at(cell3DIndex);
557 template <
class mesh_connectivity_data_
class>
563 Create_Constant_DOFsInfo_0D(mesh, boundary_info, meshDOFsInfo);
565 Create_Constant_DOFsInfo_0D(mesh, boundary_info, meshDOFsInfo);
571 template <
class mesh_connectivity_data_
class>
577 Create_Constant_DOFsInfo_0D(mesh, boundary_info, meshDOFsInfo);
578 Create_Constant_DOFsInfo_1D(mesh, boundary_info, meshDOFsInfo);
580 Create_Constant_DOFsInfo_0D(mesh, boundary_info, meshDOFsInfo);
581 Create_Constant_DOFsInfo_1D(mesh, boundary_info, meshDOFsInfo);
587 template <
class mesh_connectivity_data_
class>
592 Create_Constant_DOFsInfo_0D(mesh, boundary_info, meshDOFsInfo);
593 Create_Constant_DOFsInfo_1D(mesh, boundary_info, meshDOFsInfo);
594 Create_Constant_DOFsInfo_2D(mesh, boundary_info, meshDOFsInfo);
596 Create_Constant_DOFsInfo_0D(mesh, boundary_info, meshDOFsInfo);
597 Create_Constant_DOFsInfo_1D(mesh, boundary_info, meshDOFsInfo);
598 Create_Constant_DOFsInfo_2D(mesh, boundary_info, meshDOFsInfo);
603 template <
class mesh_connectivity_data_
class>
608 Create_Constant_DOFsInfo_0D(mesh, boundary_info, meshDOFsInfo);
609 Create_Constant_DOFsInfo_1D(mesh, boundary_info, meshDOFsInfo);
610 Create_Constant_DOFsInfo_2D(mesh, boundary_info, meshDOFsInfo);
611 Create_Constant_DOFsInfo_3D(mesh, boundary_info, meshDOFsInfo);
613 Create_Constant_DOFsInfo_0D(mesh, boundary_info, meshDOFsInfo);
614 Create_Constant_DOFsInfo_1D(mesh, boundary_info, meshDOFsInfo);
615 Create_Constant_DOFsInfo_2D(mesh, boundary_info, meshDOFsInfo);
616 Create_Constant_DOFsInfo_3D(mesh, boundary_info, meshDOFsInfo);
635 CreateCell0DDOFs(meshDOFsInfo, result);
637 CreateCell0DDOFs<0>(meshDOFsInfo, result);
647 template <
class mesh_connectivity_data_
class>
658 CreateCell0DDOFs(meshDOFsInfo, result);
659 CreateCell1DDOFs(meshDOFsInfo, mesh, result);
661 CreateCell0DDOFs<1>(meshDOFsInfo, result);
662 CreateCell1DDOFs<1>(meshDOFsInfo, mesh, result);
672 template <
class mesh_connectivity_data_
class>
683 CreateCell0DDOFs(meshDOFsInfo, result);
684 CreateCell1DDOFs(meshDOFsInfo, mesh, result);
685 CreateCell2DDOFs(meshDOFsInfo, mesh, result);
687 CreateCell0DDOFs<2>(meshDOFsInfo, result);
688 CreateCell1DDOFs<2>(meshDOFsInfo, mesh, result);
689 CreateCell2DDOFs<2>(meshDOFsInfo, mesh, result);
699 template <
class mesh_connectivity_data_
class>
710 CreateCell0DDOFs(meshDOFsInfo, result);
711 CreateCell1DDOFs(meshDOFsInfo, mesh, result);
712 CreateCell2DDOFs(meshDOFsInfo, mesh, result);
713 CreateCell3DDOFs(meshDOFsInfo, mesh, result);
715 CreateCell0DDOFs<3>(meshDOFsInfo, result);
716 CreateCell1DDOFs<3>(meshDOFsInfo, mesh, result);
717 CreateCell2DDOFs<3>(meshDOFsInfo, mesh, result);
718 CreateCell3DDOFs<3>(meshDOFsInfo, mesh, result);