12#include "libmesh/system.h"
13#include "libmesh/equation_systems.h"
14#include "libmesh/parallel_sync.h"
15#include "libmesh/parallel_algebra.h"
16#include "libmesh/elem_side_builder.h"
17#include "libmesh/enum_elem_quality.h"
18#include "libmesh/enum_to_string.h"
30 libMesh::ElemQuality::MAX_ANGLE,
31 libMesh::ElemQuality::JACOBIAN};
44 "Report mesh information, such as the number of elements, nodes, and degrees of freedom.");
46 MultiMooseEnum items(
"elems num_dofs num_dofs_nonlinear num_dofs_auxiliary num_dofs_constrained "
47 "num_elements num_nodes num_local_dofs num_local_dofs_nonlinear "
48 "num_local_dofs_auxiliary num_local_elements num_local_nodes local_elems "
49 "local_sidesets local_subdomains sidesets subdomains");
53 "The iteration information to output; if not provided, everything will be output.");
58 MultiMooseEnum items(
"all bounding_box dim elem_mapping_type elem_type hmax hmin "
59 "neighbor_ids node_ids num_sides points processor_id unique_id volume");
61 "elem_items", items,
"Items to include when outputting element information");
76 "Element quality metrics to include when outputting element information");
82 static const std::array<std::string, 2> domain_names{
"sideset",
"subdomain"};
87 "all bounding_box elems elem_types min_volume max_volume num_elems processor_ids volume");
88 for (
const auto &
name : domain_names)
90 name +
"_items", items,
"Items to include when outputting " +
name +
" information");
101 [](
const auto & v) {
return v.itemName(); });
105 for (
const auto &
name : domain_names)
107 name +
"_elem_qualities",
109 "Bounded (min or max) element quality metrics to include when outputting " +
name +
124 _sideset_elem_qualities(getParam<
MultiMooseEnum>(
"sideset_elem_qualities")),
125 _subdomain_elem_qualities(getParam<
MultiMooseEnum>(
"subdomain_elem_qualities")),
130 _num_dofs_constrained(
142 _elem_infos(initCombinedInfos<
ElemInfos>(
"elems", _elem_items, _elem_qualities)),
144 initCombinedInfos<
SidesetInfos>(
"sidesets", _sideset_items, _sideset_elem_qualities)),
146 "subdomains", _subdomain_items, _subdomain_elem_qualities)),
148 _equation_systems(_fe_problem.es()),
149 _nonlinear_system(_fe_problem.es().get_system(
"nl0")),
150 _aux_system(_fe_problem.es().get_system(
"aux0")),
151 _mesh(_fe_problem.
mesh().getMesh())
154 paramError(
"elem_items",
"Should not be provided without an elems item enabled");
156 paramError(
"elem_qualities",
"Should not be provided without an elems item enabled");
159 paramError(
"sideset_items",
"Should not be provided without a sidesets item enabled");
162 paramError(
"sideset_elem_qualities",
"Should not be provided without a sidesets item enabled");
165 paramError(
"subdomain_items",
"Should not be provided without a subdomains item enabled");
169 "Should not be provided without a subdomains item enabled");
181 return (boundType() ==
BoundType::MAX ? std::string(
"max") : std::string(
"min")) +
"_" +
187 const Real value)
const
189 static const Real default_max = 0;
190 static const Real default_min = std::numeric_limits<Real>::max();
192 auto & entry = quality_map.try_emplace(*
this, (is_max ? default_max : default_min)).first->second;
194 entry = std::max(entry, value);
196 entry = std::min(entry, value);
217 std::back_inserter(this->elem_qualities),
238 std::back_inserter(this->elem_qualities),
243template <
typename InfoMapType,
class InfoItemsType>
245 InfoMapType * global,
246 const InfoItemsType & items)
247 : local(local), global(global), items(items)
251template <
class CombinedInfosType>
257 using info_map_type =
typename CombinedInfosType::info_map_type;
258 const typename CombinedInfosType::items_type dii(items, qualities);
259 return CombinedInfosType(
272 if (!local_ptr && !global_ptr)
276 for (
auto value_ptr : {local_ptr, global_ptr})
278 value_ptr->
map.clear();
281 const auto map_insert = [](
auto & map,
const auto id,
const auto subdomain_id) ->
ElemInfo &
283 mooseAssert(!map.count(
id),
"Should not exist in map");
285 .emplace(std::piecewise_construct,
286 std::forward_as_tuple(
id),
287 std::forward_as_tuple(
id, subdomain_id))
293#define set_simple(name, elem_function_name) \
295 entry.name = elem.elem_function_name()
298 std::map<dof_id_type, ElemInfo> local_info;
299 for (
const auto elem_ptr : *
_fe_problem.
mesh().getActiveLocalElementRange())
301 auto & elem = *elem_ptr;
302 auto & entry = map_insert(local_info, elem.id(), elem.subdomain_id());
304 entry.elem_qualities.reserve(items.elem_qualities.size());
305 for (
const auto quality : items.elem_qualities)
306 entry.elem_qualities.emplace_back(quality, elem.quality(quality));
308 set_simple(bounding_box, loose_bounding_box);
309 set_simple(volume, volume);
311 set_simple(elem_mapping_type, mapping_type);
312 set_simple(elem_type,
type);
313 set_simple(hmax, hmax);
314 set_simple(hmin, hmin);
315 if (items.neighbor_ids)
317 entry.neighbor_ids.reserve(elem.n_neighbors());
318 for (
const auto neighbor_ptr : elem.neighbor_ptr_range())
319 entry.neighbor_ids.push_back(neighbor_ptr ? neighbor_ptr->id()
324 entry.node_ids.reserve(elem.n_nodes());
325 for (
const auto & node : elem.node_ref_range())
326 entry.node_ids.push_back(node.id());
328 set_simple(num_sides, n_sides);
331 entry.points.reserve(elem.n_nodes());
332 for (
const auto & node : elem.node_ref_range())
333 entry.points.emplace_back(node);
344 local_ptr->map = local_info;
351 std::vector<std::pair<dof_id_type, subdomain_id_type>> data;
352 data.reserve(local_info.size());
353 for (
auto & [
id, info] : local_info)
354 data.emplace_back(id, info.subdomain_id);
356 for (
const auto & [
id, subdomain_id] : data)
357 map_insert(global_ptr->map, id, subdomain_id);
360 const auto gather = [&](
const auto && get_value,
const auto && set_value)
362 using T = std::remove_reference_t<std::invoke_result_t<
decltype(get_value),
ElemInfo &>>;
363 std::vector<std::pair<dof_id_type, T>> data;
364 data.reserve(local_info.size());
365 for (
auto & [
id, info] : local_info)
366 data.emplace_back(id, get_value(info));
368 for (
const auto & [
id, value] : data)
369 set_value(global_ptr->map.at(id), value);
373 if (items.elem_qualities.size())
375 [](
const auto & info)
377 std::vector<std::pair<std::underlying_type_t<libMesh::ElemQuality>,
Real>>
values;
384 info.elem_qualities.reserve(
value.size());
385 for (
const auto & [elem_quality, quality_value] :
value)
390 if (items.bounding_box)
391 gather([](
const auto & info)
392 {
return static_cast<const std::pair<Point, Point> &
>(
info.bounding_box); },
394 {
static_cast<std::pair<Point, Point> &
>(
info.bounding_box) = value; });
396#define gather_simple(name) \
398 gather([](const auto & info) { return info.name; }, \
399 [](auto & info, const auto & value) { info.name = value; })
400#define gather_enum(name) \
402 gather([](const auto & info) \
403 { return static_cast<std::underlying_type_t<decltype(ElemInfo::name)>>(info.name); }, \
404 [](auto & info, const auto & value) \
405 { info.name = static_cast<decltype(ElemInfo::name)>(value); })
408 gather_simple(volume);
412 gather_enum(elem_mapping_type);
414 gather_enum(elem_type);
420 gather_simple(neighbor_ids);
422 gather_simple(node_ids);
424 gather_simple(num_sides);
426 gather_simple(points);
430 gather_simple(unique_id);
437template <
class CombinedInfosType>
441 constexpr bool is_sidesets = std::is_same_v<CombinedInfosType, SidesetInfos>;
442 using id_type =
typename CombinedInfosType::id_type;
443 using info_type =
typename CombinedInfosType::info_type;
444 using map_type =
typename CombinedInfosType::map_type;
446 auto & local = infos.local;
447 auto & global = infos.global;
450 if (!local && !global)
454 const auto get_or_insert_info = [](map_type & map,
const id_type id) -> info_type &
455 {
return map.try_emplace(
id,
id).first->second; };
458 for (
auto value_ptr : {local, global})
460 value_ptr->map.clear();
462 const auto & items = infos.items;
467 const auto compute_volume = items.max_volume || items.min_volume || items.volume;
470 const auto add = [&](
const auto id,
const libMesh::Elem & elem,
auto && elems_entry)
472 auto & entry = get_or_insert_info(local_info,
id);
473 const Real volume = compute_volume ? elem.volume() : 0;
474 if (items.bounding_box)
475 entry.bounding_box.union_with(elem.loose_bounding_box());
477 entry.volume += volume;
478 for (
const auto & quality : items.elem_qualities)
479 quality.updateValue(entry.elem_qualities, elem.quality(quality.elemQuality()));
481 entry.elems.emplace_back(std::move(elems_entry));
482 if (items.elem_types)
483 entry.elem_types.insert(elem.type());
484 if (items.min_volume)
485 entry.min_volume = std::min(entry.min_volume, volume);
486 if (items.max_volume)
487 entry.max_volume = std::max(entry.max_volume, volume);
490 if (items.processor_ids)
491 entry.processor_ids.insert(elem.processor_id());
496 if constexpr (is_sidesets)
499 for (
const auto & bnd_elem : as_range(
mesh.bndElemsBegin(),
mesh.bndElemsEnd()))
501 const auto & elem = *bnd_elem->_elem;
504 const auto side = bnd_elem->_side;
505 add(bnd_elem->_bnd_id, side_builder(elem, side), std::make_pair(elem.id(), side));
511 for (
const auto & elem : *
mesh.getActiveLocalElementRange())
512 add(elem->subdomain_id(), *elem, elem->id());
518 local->map = local_info;
523 bool did_gather =
false;
524 const auto gather = [&](
const auto && get_value,
const auto && set_value)
526 using T = std::remove_reference_t<std::invoke_result_t<
decltype(get_value), info_type &>>;
527 std::vector<std::pair<id_type, T>> data;
528 data.reserve(local_info.size());
529 for (
auto & [
id, info] : local_info)
530 data.emplace_back(
id, get_value(info));
532 for (
const auto & [
id, value] : data)
533 set_value(get_or_insert_info(global->map,
id), value);
538 if (items.bounding_box)
539 gather([](
const auto & info)
540 {
return std::make_pair(info.bounding_box.min(), info.bounding_box.max()); },
541 [](
auto & info,
const auto & value)
542 { info.bounding_box.union_with(BoundingBox(value.first, value.second)); });
545 gather([](
const auto & info) {
return info.volume; },
546 [](
auto & info,
const auto & value) { info.volume += value; });
548 if (items.elem_qualities.size())
550 [](
const auto & info)
552 std::vector<std::tuple<std::underlying_type_t<
decltype(DomainElemQuality::first)>,
553 std::underlying_type_t<
decltype(DomainElemQuality::second)>,
556 values.reserve(info.elem_qualities.size());
557 for (
const auto & [bounded_quality, value] : info.elem_qualities)
559 bounded_quality.elemQuality(), bounded_quality.boundType(), value);
562 [](
auto & info,
const auto & value)
564 for (
const auto & [elem_quality, bound_type, quality_value] : value)
568 dq.
updateValue(info.elem_qualities, quality_value);
573 gather([](
const auto & info) {
return info.elems; },
574 [](
auto & info,
const auto & value)
575 { info.elems.insert(info.elems.end(), value.begin(), value.end()); });
577 if (items.elem_types)
579 [](
const auto & info)
582 values.reserve(info.elem_types.size());
583 std::transform(info.elem_types.begin(),
584 info.elem_types.end(),
585 std::back_inserter(
values),
586 [](
const auto v) { return static_cast<int>(v); });
589 [](
auto & info,
const auto & value)
591 std::transform(value.begin(),
593 std::inserter(info.elem_types, info.elem_types.end()),
594 [](
const auto v) { return static_cast<libMesh::ElemType>(v); });
597 if (items.max_volume)
598 gather([](
const auto & info) {
return info.max_volume; },
599 [](
auto & info,
const auto & value)
600 { info.max_volume = std::max(info.max_volume, value); });
602 if (items.min_volume)
603 gather([](
const auto & info) {
return info.min_volume; },
604 [](
auto & info,
const auto & value)
605 { info.min_volume = std::min(info.min_volume, value); });
608 gather([](
const auto & info) {
return info.num_elems; },
609 [](
auto & info,
const auto & value) { info.num_elems += value; });
611 if (items.processor_ids)
613 [](
const auto & info)
615 mooseAssert(info.processor_ids.size() == 1,
"Should have exactly one pid");
616 return *info.processor_ids.begin();
618 [](
auto & info,
const auto & value) { info.processor_ids.insert(value); });
624 std::vector<id_type> data;
625 data.reserve(local_info.size());
626 std::transform(local_info.begin(),
628 std::back_inserter(data),
629 [](
const auto v) { return v.first; });
631 for (
const auto id : data)
632 get_or_insert_info(global->map,
id);
639 if constexpr (is_sidesets)
643 for (
const auto id : sideset_ids)
644 get_or_insert_info(global->map,
id);
648 for (
auto to : {local, global})
652 for (
auto & [
id, info] : to->map)
653 if constexpr (is_sidesets)
660 for (
auto & id_info_pair : to->map)
661 std::sort(id_info_pair.second.elems.begin(), id_info_pair.second.elems.end());
668#define set_value(variable, value) \
703 return items.
find(
"all") == items.
items().end();
707#define info_json_simple(name) \
709 info_json[#name] = info.name
710#define info_json_enum(name) \
712 info_json[#name] = libMesh::Utility::enum_to_string(info.name)
713#define info_json_id(name, invalid_value) \
716 if (info.name == invalid_value) \
717 info_json[#name] = nullptr; \
719 info_json[#name] = info.name; \
721#define info_json_ids(name, invalid_value) \
723 for (const auto id : info.name) \
725 if (id == invalid_value) \
726 info_json[#name].push_back(nullptr); \
728 info_json[#name].push_back(id); \
730template <
class InfoType>
734 json[
"id"] = info.id;
736template <
class InfoType,
class InfoItemsType>
739 const InfoType & info,
740 const InfoItemsType & items)
743 info_json_simple(bounding_box);
744 info_json_simple(volume);
749 const auto & items = info_map.
items;
750 for (
const auto & [
id, info] : info_map.
map)
752 mooseAssert(
id == info.id,
"Inconsistent id");
754 nlohmann::json info_json;
756 info_json[
"subdomain_id"] = info.subdomain_id;
759 if (info.elem_qualities.size())
760 for (
const auto & [quality, value] : info.elem_qualities)
763 info_json_simple(
dim);
765 info_json_enum(elem_mapping_type);
767 info_json_enum(elem_type);
769 info_json_simple(hmax);
771 info_json_simple(hmin);
777 info_json_simple(num_sides);
779 info_json_simple(points);
785 json.push_back(std::move(info_json));
788template <
class DomainInfoMapType>
792 constexpr bool is_sideset = std::is_same_v<DomainInfoMapType, MeshInfo::SidesetInfoMap>;
793 const auto & items = info_map.items;
795 for (
const auto & [
id, info] : info_map.map)
797 mooseAssert(
id == info.id,
"Inconsistent id");
799 nlohmann::json info_json;
802 if (info.name.size())
803 info_json[
"name"] = info.name;
805 if (items.elem_qualities.size())
806 for (
const auto & [bounded_quality, value] : info.elem_qualities)
807 info_json[
"elem_qualities"][bounded_quality.itemName()] = value;
811 auto & elems_json = info_json[
"elems"];
812 if constexpr (is_sideset)
814 for (
const auto & elem_entry : info.elems)
815 elems_json.push_back({{
"elem_id", elem_entry.first}, {
"side", elem_entry.second}});
818 elems_json = info.elems;
821 if (items.elem_types)
825 std::transform(
info.elem_types.begin(),
826 info.elem_types.end(),
827 std::back_inserter(elem_types),
828 [](
const auto v) { return libMesh::Utility::enum_to_string(v); });
833 info_json_simple(max_volume);
835 info_json_simple(min_volume);
837 info_json_simple(num_elems);
839 info_json_simple(processor_ids);
841 json.push_back(std::move(info_json));
844#undef info_json_simple
868 value =
static_cast<int>(beq.
boundType());
895 dataStore(stream, info.bounding_box,
nullptr);
902 dataStore(stream, info.elem_qualities,
nullptr);
904 dataStore(stream, info.elem_mapping_type,
nullptr);
905 dataStore(stream, info.elem_type,
nullptr);
908 dataStore(stream, info.neighbor_ids,
nullptr);
909 dataStore(stream, info.node_ids,
nullptr);
910 dataStore(stream, info.num_sides,
nullptr);
912 dataStore(stream, info.processor_id,
nullptr);
913 dataStore(stream, info.subdomain_id,
nullptr);
914 dataStore(stream, info.unique_id,
nullptr);
922 dataStore(stream, info.elem_qualities,
nullptr);
924 dataStore(stream, info.elem_types,
nullptr);
925 dataStore(stream, info.min_volume,
nullptr);
926 dataStore(stream, info.max_volume,
nullptr);
927 dataStore(stream, info.num_elems,
nullptr);
928 dataStore(stream, info.processor_ids,
nullptr);
951 dataLoad(stream, info.bounding_box,
nullptr);
952 dataLoad(stream, info.volume,
nullptr);
958 dataLoad(stream, info.elem_qualities,
nullptr);
959 dataLoad(stream, info.dim,
nullptr);
960 dataLoad(stream, info.elem_mapping_type,
nullptr);
961 dataLoad(stream, info.elem_type,
nullptr);
962 dataLoad(stream, info.hmax,
nullptr);
963 dataLoad(stream, info.hmin,
nullptr);
964 dataLoad(stream, info.neighbor_ids,
nullptr);
965 dataLoad(stream, info.node_ids,
nullptr);
966 dataLoad(stream, info.num_sides,
nullptr);
967 dataLoad(stream, info.points,
nullptr);
968 dataLoad(stream, info.processor_id,
nullptr);
969 dataLoad(stream, info.subdomain_id,
nullptr);
970 dataLoad(stream, info.unique_id,
nullptr);
977 dataLoad(stream, info.name,
nullptr);
978 dataLoad(stream, info.elem_qualities,
nullptr);
979 dataLoad(stream, info.elems,
nullptr);
980 dataLoad(stream, info.elem_types,
nullptr);
981 dataLoad(stream, info.min_volume,
nullptr);
982 dataLoad(stream, info.max_volume,
nullptr);
983 dataLoad(stream, info.num_elems,
nullptr);
984 dataLoad(stream, info.processor_ids,
nullptr);
void dataLoadElemContainingInfo(std::istream &stream, T &info)
void toJSONInfoBase(nlohmann::json &json, const InfoType &info)
void toJSONElemContainingInfo(nlohmann::json &info_json, const InfoType &info, const InfoItemsType &items)
std::string elemQualityToString(const libMesh::ElemQuality eq)
void dataStoreInfoBase(std::ostream &stream, T &info)
Data store and load for node, elem, sideset, subdomain info entries.
void dataLoadDomainInfo(std::istream &stream, T &info)
registerMooseObject("MooseApp", MeshInfo)
void dataStoreDomainInfo(std::ostream &stream, T &info)
void dataStoreElemContainingInfo(std::ostream &stream, T &info)
void dataLoadInfoBase(std::istream &stream, T &info)
void toJSONDomainInfoMap(nlohmann::json &json, const DomainInfoMapType &info_map)
void dataStore(std::ostream &, MeshInfo::DomainElemQuality &, void *)
Data store and load for DomainElemQuality.
void to_json(nlohmann::json &, const MeshInfo::ElemInfoMap &)
JSON serialization for info maps.
void dataLoad(std::istream &, MeshInfo::DomainElemQuality &, void *)
std::array< Real, 2 > values
const ReporterMode REPORTER_MODE_REPLICATED
const ReporterMode REPORTER_MODE_DISTRIBUTED
const ReporterMode REPORTER_MODE_ROOT
void ErrorVector unsigned int
Class used for caching additional information for elements such as the volume and centroid.
virtual MooseMesh & mesh() override
Reporter object that has a single execution of the "execute" method for each execute flag.
static InputParameters validParams()
Report mesh information, such as the number of elements, nodes, and degrees of freedom.
unsigned int *const _num_dofs_constrained
static bool hasItem(const std::string &name, const MultiMooseEnum &items)
unsigned int *const _num_local_dofs_aux
SidesetInfos _sideset_infos
Combined sideset information (reporter values and requested items)
unsigned int *const _num_dofs_aux
const libMesh::System & _aux_system
static InputParameters validParams()
MeshInfo(const InputParameters ¶meters)
const MultiMooseEnum & _sideset_elem_qualities
The requested element quality metrics, bounded over sidesets.
const MultiMooseEnum & _elem_qualities
The requested element quality metrics.
unsigned int *const _num_local_node
BoundType
Type of a bound for DomainElemQuality (min or max).
const MultiMooseEnum & _sideset_items
The requested sideset items.
ElemInfos _elem_infos
Combined element information (reporter values and requested items)
static const std::vector< libMesh::ElemQuality > elem_qualities
The qualities to include for elems.
CombinedInfosType initCombinedInfos(const std::string &name, const MultiMooseEnum &items, const MultiMooseEnum &qualities)
Initializer for SidesetInfos and SubdomainInfos.
const MultiMooseEnum & _subdomain_elem_qualities
The requested element quality metrics, bounded over subdomains.
unsigned int *const _num_dofs
Reporter values to declare.
const libMesh::MeshBase & _mesh
const MultiMooseEnum & _items
The requested items.
unsigned int *const _num_local_dofs_nl
const MultiMooseEnum & _subdomain_items
The requested subdomain items.
const libMesh::EquationSystems & _equation_systems
virtual void execute() override
Execute method.
unsigned int *const _num_node
const libMesh::System & _nonlinear_system
unsigned int *const _num_elem
void possiblyAddElemInfo()
Add elem information if requested.
unsigned int *const _num_local_dofs
void possiblyAddDomainInfo(CombinedInfosType &infos)
Add domain information (sidesets and subdomains) if requested.
static const std::vector< DomainElemQuality > domain_elem_qualities
The qualities (ElemQuality and bound type) to include for domain quantities (subdomains and sidesets)
SubdomainInfos _subdomain_infos
Combined subdomain information (reporter values and requested items)
const MultiMooseEnum & _elem_items
The requested elem items.
unsigned int *const _num_local_elem
unsigned int *const _num_dofs_nl
const std::string & type() const
Get the type of this class.
const std::string & name() const
Get the name of the class.
void paramError(const std::string ¶m, Args... args) const
Emits an error prefixed with the file and line number of the given param (from the input file) along ...
std::set< MooseEnumItem >::const_iterator find(const MooseEnumItem &other) const
Locate an item.
const std::set< MooseEnumItem > & items() const
Return the complete set of available flags.
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type.
bool isValueSet(const std::string &value) const
Methods for seeing if a value is set in the MultiMooseEnum.
virtual bool isValid() const override
IsValid.
void set_union(T &data, const unsigned int root_id) const
void gather(const unsigned int root_id, const T &send_data, std::vector< T, A > &recv) const
FEProblemBase & _fe_problem
Reference to the FEProblemBase for this user object.
const std::string & get_sideset_name(boundary_id_type id) const
const std::set< boundary_id_type > & get_side_boundary_ids() const
static constexpr dof_id_type invalid_id
static constexpr unique_id_type invalid_unique_id
unsigned int n_systems() const
const T_sys & get_system(std::string_view name) const
std::size_t n_dofs() const
const BoundaryInfo & get_boundary_info() const
virtual dof_id_type n_elem() const=0
virtual dof_id_type n_nodes() const=0
dof_id_type n_local_elem() const
dof_id_type n_local_nodes() const
std::string & subdomain_name(subdomain_id_type id)
processor_id_type processor_id() const
const Parallel::Communicator & comm() const
dof_id_type n_dofs() const
dof_id_type n_local_dofs() const
std::string toLower(std::string name)
Convert supplied string to lower case.
std::string stringJoin(const std::vector< std::string > &values, const std::string &separator=" ")
Concatenates value into a single string separated by separator.
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
std::string enum_to_string(const T e)
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const ItemsType items
Which entries are to be output.
CombinedInfos(info_map_type *local, info_map_type *global, const ItemsType &items)
InfoMapType *const global
Global information.
InfoMapType *const local
Local information.
Key for a libMesh::ElemQuality quality type with a bound (min or max) to be used over an entire domai...
void updateValue(std::map< DomainElemQuality, Real > &quality_map, const Real value) const
Update the value in the quality map.
libMesh::ElemQuality & elemQuality()
Get the libMesh::ElemQuality entry.
BoundType & boundType()
Get the type of the bound (min or max)
DomainElemQuality()=default
std::string itemName() const
Get the name for this quality ([min,max]_[quality])
DomainInfoItems()=default
std::vector< DomainElemQuality > elem_qualities
Bounded (min, max) element quality metrics that should be output.
Structure for a single domain entry (sideset or subdomain).
Base struct for defining which items are to be output for a domain that contains elements (elems,...
ElemContainingInfoItems()=default
std::vector< libMesh::ElemQuality > elem_qualities
Element qualities that should be output.
Structure for a single elem entry.
Struct that defines a domain (sideset or subdomain) map (id -> entities) and the items that should be...
ItemsType items
Which items are to be output.
map_type map
The underlying data.