#pragma once #include #include #include namespace mshio { struct MeshFormat { std::string version = "4.1"; int file_type = 0; int data_size = sizeof(size_t); }; struct NodeBlock { int entity_dim = 0; int entity_tag = 0; int parametric = 0; size_t num_nodes_in_block = 0; std::vector tags; std::vector data; }; struct Nodes { size_t num_entity_blocks = 0; size_t num_nodes = 0; size_t min_node_tag = 0; size_t max_node_tag = 0; std::vector entity_blocks; }; struct ElementBlock { int entity_dim = 0; int entity_tag = 0; int element_type = 0; size_t num_elements_in_block = 0; std::vector data; }; struct Elements { size_t num_entity_blocks = 0; size_t num_elements = 0; size_t min_element_tag = 0; size_t max_element_tag = 0; std::vector entity_blocks; }; struct DataHeader { std::vector string_tags; // [view name, ] std::vector real_tags; // [time value] std::vector int_tags; // [time step, num fields, num entries, partition id] }; struct DataEntry { size_t tag = 0; int num_nodes_per_element = 0; // Only used by ElementNodeData. std::vector data; }; struct Data { DataHeader header; std::vector entries; }; struct PointEntity { int tag = 0; double x = 0.0; double y = 0.0; double z = 0.0; std::vector physical_group_tags; }; struct CurveEntity { int tag = 0; double min_x = 0.0; double min_y = 0.0; double min_z = 0.0; double max_x = 0.0; double max_y = 0.0; double max_z = 0.0; std::vector physical_group_tags; std::vector boundary_point_tags; }; struct SurfaceEntity { int tag = 0; double min_x = 0.0; double min_y = 0.0; double min_z = 0.0; double max_x = 0.0; double max_y = 0.0; double max_z = 0.0; std::vector physical_group_tags; std::vector boundary_curve_tags; }; struct VolumeEntity { int tag = 0; double min_x = 0.0; double min_y = 0.0; double min_z = 0.0; double max_x = 0.0; double max_y = 0.0; double max_z = 0.0; std::vector physical_group_tags; std::vector boundary_surface_tags; }; struct Entities { std::vector points; std::vector curves; std::vector surfaces; std::vector volumes; bool empty() const { return points.size() == 0 && curves.size() == 0 && surfaces.size() == 0 && volumes.size() == 0; } }; struct PhysicalGroup { int dim = 0; int tag = 0; std::string name; }; struct MshSpec { MeshFormat mesh_format; Nodes nodes; Elements elements; Entities entities; std::vector physical_groups; std::vector node_data; std::vector element_data; std::vector element_node_data; // Custom sections NanoSplineFormat nanospline_format; std::vector curves; std::vector patches; }; } // namespace mshio