9#ifndef GRIDFORMAT_TRAITS_MFEM_HPP_
10#define GRIDFORMAT_TRAITS_MFEM_HPP_
18#include <mfem/mesh/mesh.hpp>
20#include <gridformat/common/exceptions.hpp>
22#include <gridformat/grid/cell_type.hpp>
23#include <gridformat/grid/traits.hpp>
25namespace GridFormat::MFEM {
29 CellType cell_type(mfem::Element::Type ct) {
31 case mfem::Element::Type::POINT:
return GridFormat::CellType::vertex;
32 case mfem::Element::Type::SEGMENT:
return GridFormat::CellType::segment;
33 case mfem::Element::Type::TRIANGLE:
return GridFormat::CellType::triangle;
34 case mfem::Element::Type::QUADRILATERAL:
return GridFormat::CellType::quadrilateral;
35 case mfem::Element::Type::TETRAHEDRON:
return GridFormat::CellType::tetrahedron;
36 case mfem::Element::Type::WEDGE:
break;
37 case mfem::Element::Type::PYRAMID:
break;
38 case mfem::Element::Type::HEXAHEDRON:
return GridFormat::CellType::hexahedron;
40 throw NotImplemented(
"Support for given mfem cell type");
51namespace GridFormat::Traits {
54struct Points<mfem::Mesh> {
55 static std::ranges::range
auto get(
const mfem::Mesh& mesh) {
56 return std::views::iota(0, mesh.GetNV());
61struct Cells<mfem::Mesh> {
62 static std::ranges::range
auto get(
const mfem::Mesh& mesh) {
63 return std::views::iota(0, mesh.GetNE());
68struct CellType<mfem::Mesh, GridFormat::MFEM::Cell> {
69 static GridFormat::CellType get(
const mfem::Mesh& mesh,
const GridFormat::MFEM::Cell& cell) {
70 return GridFormat::MFEM::Detail::cell_type(mesh.GetElement(cell)->GetType());
75struct CellPoints<mfem::Mesh, GridFormat::MFEM::Cell> {
76 static std::ranges::range
decltype(
auto) get(
const mfem::Mesh& mesh,
const GridFormat::MFEM::Cell& cell) {
77 const auto element = mesh.GetElement(cell);
78 auto begin = element->GetVertices();
79 return std::ranges::subrange(begin, begin + element->GetNVertices());
84struct PointId<mfem::Mesh, GridFormat::MFEM::Point> {
85 static auto get(
const mfem::Mesh&,
const GridFormat::MFEM::Point& point) {
91struct PointCoordinates<mfem::Mesh, GridFormat::MFEM::Point> {
92 static std::ranges::range
decltype(
auto) get(
const mfem::Mesh& mesh,
const GridFormat::MFEM::Point& point) {
93 std::array<double, 3> coords = {};
94 auto begin = mesh.GetVertex(point);
95 std::copy(begin, begin + mesh.SpaceDimension(), coords.begin());
101struct NumberOfPoints<mfem::Mesh> {
102 static std::integral
auto get(
const mfem::Mesh& mesh) {
108struct NumberOfCells<mfem::Mesh> {
109 static std::integral
auto get(
const mfem::Mesh& mesh) {
115struct NumberOfCellPoints<mfem::Mesh, GridFormat::MFEM::Cell> {
116 static std::integral
auto get(
const mfem::Mesh& mesh,
const GridFormat::MFEM::Cell& cell) {
117 return mesh.GetElement(cell)->GetNVertices();