diff --git a/Doxyfile b/Doxyfile index abcc940..21fb150 100644 --- a/Doxyfile +++ b/Doxyfile @@ -48,7 +48,7 @@ PROJECT_NAME = stroid # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = v0.5.0 +PROJECT_NUMBER = v0.6.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewers a diff --git a/assets/imgs/ExampleMesh_NC.png b/assets/imgs/ExampleMesh_NC.png new file mode 100644 index 0000000..647a85a Binary files /dev/null and b/assets/imgs/ExampleMesh_NC.png differ diff --git a/assets/imgs/ExampleMesh_multi-block.png b/assets/imgs/ExampleMesh_multi-block.png index 59d523c..b43f65a 100644 Binary files a/assets/imgs/ExampleMesh_multi-block.png and b/assets/imgs/ExampleMesh_multi-block.png differ diff --git a/assets/imgs/ExampleMesh_spherified.png b/assets/imgs/ExampleMesh_spherified.png index d07c0b4..aae633d 100644 Binary files a/assets/imgs/ExampleMesh_spherified.png and b/assets/imgs/ExampleMesh_spherified.png differ diff --git a/configs/nonconforming_vacuum.toml b/configs/nonconforming_vacuum.toml new file mode 100644 index 0000000..0a3f610 --- /dev/null +++ b/configs/nonconforming_vacuum.toml @@ -0,0 +1,17 @@ +[main] +# Absolute minimum depths from the initial block topology. +refinement_levels = 4 +vacuum_refinement_levels = 2 +# Omit to inherit refinement_levels at the vacuum outer boundary. +# vacuum_outer_refinement_levels = 4 +order = 3 +include_external_domain = true +core_mapping = "multi_block" +r_core = 0.25 +r_star = 1.0 +r_infinity = 6.0 +flattening = 0.0 + +[main.optimization_methods] +tmop = false +smoothstep = true diff --git a/docs/html/_logo_8png.html b/docs/html/_logo_8png.html index 87e7fd1..ddde62e 100644 --- a/docs/html/_logo_8png.html +++ b/docs/html/_logo_8png.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
diff --git a/docs/html/annotated.html b/docs/html/annotated.html index af39902..f7f6f23 100644 --- a/docs/html/annotated.html +++ b/docs/html/annotated.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -106,9 +106,39 @@ $(function(){initNavTree('annotated.html',''); initResizable(true); });
Here are the classes, structs, unions and interfaces with brief descriptions:
[detail level 123]
- - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Nstroid
 Nconfig
 CMeshConfigConfiguration parameters for stroid mesh generation
 NstdSTL namespace
 Cformatter< stroid::stats::MeshStats, char >
 NstroidPublic API surface for the stroid mesh generation library
 NconfigConfiguration types and defaults for mesh generation
 CMeshConfigConfiguration parameters for stroid mesh generation
 COptimizationMethods
 Nexceptions
 CStroidContinuityError
 CStroidError
 CStroidMeshError
 CStroidMissingReferenceMesh
 Nstats
 CAxisStats
 CBoundingBox
 CBoundingBoxStats
 CBowingStats
 CCentroidStats
 CConfigMeta
 CConformityStats
 CElementCounts
 CEllipticityStats
 CJacobianStats
 CMeshSizeStats
 CMeshStats
 COuterBoundsStats
 CRadiusStats
 CRefinementStats
 CRegionRefinementStats
 CVolumeAreaStats
 NtopologyTopology construction and curvilinear mapping utilities
 CTMOPProgressBar
 CScalarMeshField
 CStroidMesh
diff --git a/docs/html/annotated_dup.js b/docs/html/annotated_dup.js index ed02b46..419e6eb 100644 --- a/docs/html/annotated_dup.js +++ b/docs/html/annotated_dup.js @@ -1,8 +1,42 @@ var annotated_dup = [ + [ "std", null, [ + [ "formatter< stroid::stats::MeshStats, char >", "structstd_1_1formatter_3_01stroid_1_1stats_1_1_mesh_stats_00_01char_01_4.html", "structstd_1_1formatter_3_01stroid_1_1stats_1_1_mesh_stats_00_01char_01_4" ] + ] ], [ "stroid", "namespacestroid.html", [ [ "config", "namespacestroid_1_1config.html", [ - [ "MeshConfig", "structstroid_1_1config_1_1_mesh_config.html", "structstroid_1_1config_1_1_mesh_config" ] - ] ] + [ "MeshConfig", "structstroid_1_1config_1_1_mesh_config.html", "structstroid_1_1config_1_1_mesh_config" ], + [ "OptimizationMethods", "structstroid_1_1config_1_1_optimization_methods.html", "structstroid_1_1config_1_1_optimization_methods" ] + ] ], + [ "exceptions", "namespacestroid_1_1exceptions.html", [ + [ "StroidContinuityError", "classstroid_1_1exceptions_1_1_stroid_continuity_error.html", "classstroid_1_1exceptions_1_1_stroid_continuity_error" ], + [ "StroidError", "classstroid_1_1exceptions_1_1_stroid_error.html", "classstroid_1_1exceptions_1_1_stroid_error" ], + [ "StroidMeshError", "classstroid_1_1exceptions_1_1_stroid_mesh_error.html", "classstroid_1_1exceptions_1_1_stroid_mesh_error" ], + [ "StroidMissingReferenceMesh", "classstroid_1_1exceptions_1_1_stroid_missing_reference_mesh.html", null ] + ] ], + [ "stats", "namespacestroid_1_1stats.html", [ + [ "AxisStats", "structstroid_1_1stats_1_1_axis_stats.html", "structstroid_1_1stats_1_1_axis_stats" ], + [ "BoundingBox", "structstroid_1_1stats_1_1_bounding_box.html", "structstroid_1_1stats_1_1_bounding_box" ], + [ "BoundingBoxStats", "structstroid_1_1stats_1_1_bounding_box_stats.html", "structstroid_1_1stats_1_1_bounding_box_stats" ], + [ "BowingStats", "structstroid_1_1stats_1_1_bowing_stats.html", "structstroid_1_1stats_1_1_bowing_stats" ], + [ "CentroidStats", "structstroid_1_1stats_1_1_centroid_stats.html", "structstroid_1_1stats_1_1_centroid_stats" ], + [ "ConfigMeta", "structstroid_1_1stats_1_1_config_meta.html", "structstroid_1_1stats_1_1_config_meta" ], + [ "ConformityStats", "structstroid_1_1stats_1_1_conformity_stats.html", "structstroid_1_1stats_1_1_conformity_stats" ], + [ "ElementCounts", "structstroid_1_1stats_1_1_element_counts.html", "structstroid_1_1stats_1_1_element_counts" ], + [ "EllipticityStats", "structstroid_1_1stats_1_1_ellipticity_stats.html", "structstroid_1_1stats_1_1_ellipticity_stats" ], + [ "JacobianStats", "structstroid_1_1stats_1_1_jacobian_stats.html", "structstroid_1_1stats_1_1_jacobian_stats" ], + [ "MeshSizeStats", "structstroid_1_1stats_1_1_mesh_size_stats.html", "structstroid_1_1stats_1_1_mesh_size_stats" ], + [ "MeshStats", "structstroid_1_1stats_1_1_mesh_stats.html", "structstroid_1_1stats_1_1_mesh_stats" ], + [ "OuterBoundsStats", "structstroid_1_1stats_1_1_outer_bounds_stats.html", "structstroid_1_1stats_1_1_outer_bounds_stats" ], + [ "RadiusStats", "structstroid_1_1stats_1_1_radius_stats.html", "structstroid_1_1stats_1_1_radius_stats" ], + [ "RefinementStats", "structstroid_1_1stats_1_1_refinement_stats.html", "structstroid_1_1stats_1_1_refinement_stats" ], + [ "RegionRefinementStats", "structstroid_1_1stats_1_1_region_refinement_stats.html", "structstroid_1_1stats_1_1_region_refinement_stats" ], + [ "VolumeAreaStats", "structstroid_1_1stats_1_1_volume_area_stats.html", "structstroid_1_1stats_1_1_volume_area_stats" ] + ] ], + [ "topology", "namespacestroid_1_1topology.html", [ + [ "TMOPProgressBar", "classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html", "classstroid_1_1topology_1_1_t_m_o_p_progress_bar" ] + ] ], + [ "ScalarMeshField", "structstroid_1_1_scalar_mesh_field.html", "structstroid_1_1_scalar_mesh_field" ], + [ "StroidMesh", "structstroid_1_1_stroid_mesh.html", "structstroid_1_1_stroid_mesh" ] ] ] ]; \ No newline at end of file diff --git a/docs/html/classes.html b/docs/html/classes.html index 340b50a..2e2cc52 100644 --- a/docs/html/classes.html +++ b/docs/html/classes.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -104,11 +104,44 @@ $(function(){initNavTree('classes.html',''); initResizable(true); });
Class Index
diff --git a/docs/html/config_8h.html b/docs/html/config_8h.html index 25ebfcc..45fe864 100644 --- a/docs/html/config_8h.html +++ b/docs/html/config_8h.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -103,18 +103,31 @@ $(function(){initNavTree('config_8h.html',''); initResizable(true); });
config.h File Reference
-
+
#include <cstdint>
+#include <optional>
+#include <string>
+#include <format>
+#include <sstream>
+
+Include dependency graph for config.h:
+
+
+
+
This graph shows which files directly or indirectly include this file:
-
+
+ + @@ -122,9 +135,19 @@ Classes + + +

Classes

struct  stroid::config::OptimizationMethods
 
struct  stroid::config::MeshConfig
 Configuration parameters for stroid mesh generation. More...
 

Namespaces

namespace  stroid
 Public API surface for the stroid mesh generation library.
 
namespace  stroid::config
 Configuration types and defaults for mesh generation.
 
+ + + + + +

+Functions

MeshConfig stroid::config::ResolveDefaults (const MeshConfig &mesh_config)
 Fill omitted configuration values.
 
std::string stroid::config::to_string (const MeshConfig &mesh_config)
 
diff --git a/docs/html/config_8h.js b/docs/html/config_8h.js index e42db01..399b398 100644 --- a/docs/html/config_8h.js +++ b/docs/html/config_8h.js @@ -1,4 +1,7 @@ var config_8h = [ - [ "stroid::config::MeshConfig", "structstroid_1_1config_1_1_mesh_config.html", "structstroid_1_1config_1_1_mesh_config" ] + [ "stroid::config::OptimizationMethods", "structstroid_1_1config_1_1_optimization_methods.html", "structstroid_1_1config_1_1_optimization_methods" ], + [ "stroid::config::MeshConfig", "structstroid_1_1config_1_1_mesh_config.html", "structstroid_1_1config_1_1_mesh_config" ], + [ "stroid::config::ResolveDefaults", "namespacestroid_1_1config.html#a84d2f4618367487820ac818c3c47a39a", null ], + [ "stroid::config::to_string", "namespacestroid_1_1config.html#a4f2409cb05fd572794c115d850502d61", null ] ]; \ No newline at end of file diff --git a/docs/html/config_8h__dep__incl.map b/docs/html/config_8h__dep__incl.map index 1c938c7..c184b8c 100644 --- a/docs/html/config_8h__dep__incl.map +++ b/docs/html/config_8h__dep__incl.map @@ -1,18 +1,71 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/config_8h__dep__incl.md5 b/docs/html/config_8h__dep__incl.md5 index 3d79d0f..6d3c273 100644 --- a/docs/html/config_8h__dep__incl.md5 +++ b/docs/html/config_8h__dep__incl.md5 @@ -1 +1 @@ -1981f677764f42c4b4f0cb2161e8450f \ No newline at end of file +2eeac66c032be21b1039e05b200bea4f \ No newline at end of file diff --git a/docs/html/config_8h__dep__incl.svg b/docs/html/config_8h__dep__incl.svg index 90b65b4..ddf7e8d 100644 --- a/docs/html/config_8h__dep__incl.svg +++ b/docs/html/config_8h__dep__incl.svg @@ -1,10 +1,10 @@ - - + @@ -47,9 +47,9 @@ @@ -59,19 +59,19 @@ var sectionId = 'dynsection-0'; Node1 - -src/include/stroid -/config/config.h + +src/include/stroid +/config/config.h Node2 - - -src/include/stroid -/topology/curvilinear.h + + +src/include/stroid +/stroid.h @@ -79,18 +79,18 @@ var sectionId = 'dynsection-0'; Node1->Node2 - - + + Node4 - - -src/include/stroid -/topology/mapping.h + + +src/include/stroid +/topology/curvilinear.h @@ -98,72 +98,185 @@ var sectionId = 'dynsection-0'; Node1->Node4 - - + + - - -Node6 - - -src/include/stroid -/topology/topology.h + + +Node5 + + +src/lib/IO/mesh.cpp - - -Node1->Node6 - - - + + +Node1->Node5 + + + - - -Node7 - - -src/lib/IO/mesh.cpp + + +Node9 + + +src/include/stroid +/topology/mapping.h - - -Node1->Node7 - - - + + +Node1->Node9 + + + - - -Node8 - - -src/lib/topology/topology.cpp + + +Node11 + + +src/include/stroid +/topology/optimize.h - - -Node1->Node8 - - - + + +Node1->Node11 + + + + + + + + +Node13 + + +src/include/stroid +/topology/topology.h + + + + + +Node1->Node13 + + + + + + + + +Node14 + + +src/include/stroid +/utils/mesh_stats.h + + + + + +Node1->Node14 + + + + + + + + +Node17 + + +src/include/stroid +/utils/mesh_utils.h + + + + + +Node1->Node17 + + + + + + + + +Node18 + + +src/include/stroid +/utils/types.h + + + + + +Node1->Node18 + + + + + + + + +Node23 + + +src/lib/topology/topology.cpp + + + + + +Node1->Node23 + + + + + + + + +Node24 + + +src/python/config/bindings.cpp + + + + + +Node1->Node24 + + + Node3 - - -src/lib/topology/curvilinear.cpp + + +src/python/bindings.cpp @@ -171,26 +284,17 @@ var sectionId = 'dynsection-0'; Node2->Node3 - - + + - - -Node4->Node3 - - - - - - - - -Node5 - - -src/lib/topology/mapping.cpp + + +Node4->Node2 + + + @@ -198,8 +302,392 @@ var sectionId = 'dynsection-0'; Node4->Node5 - - + + + + + + + +Node6 + + +src/lib/refinement +/uniform.cpp + + + + + +Node4->Node6 + + + + + + + + +Node7 + + +src/lib/topology/curvilinear.cpp + + + + + +Node4->Node7 + + + + + + + + +Node8 + + +src/lib/utils/mesh +_utils.cpp + + + + + +Node4->Node8 + + + + + + + + +Node9->Node2 + + + + + + + + +Node9->Node7 + + + + + + + + +Node10 + + +src/lib/topology/mapping.cpp + + + + + +Node9->Node10 + + + + + + + + +Node11->Node2 + + + + + + + + +Node11->Node6 + + + + + + + + +Node12 + + +src/lib/topology/optimize.cpp + + + + + +Node11->Node12 + + + + + + + + +Node13->Node2 + + + + + + + + +Node13->Node6 + + + + + + + + +Node14->Node2 + + + + + + + + +Node15 + + +src/lib/utils/mesh +_stats.cpp + + + + + +Node14->Node15 + + + + + + + + +Node16 + + +src/python/utils/bindings.cpp + + + + + +Node14->Node16 + + + + + + + + +Node17->Node2 + + + + + + + + +Node17->Node6 + + + + + + + + +Node17->Node8 + + + + + + + + +Node17->Node16 + + + + + + + + +Node18->Node2 + + + + + + + + +Node18->Node4 + + + + + + + + +Node18->Node6 + + + + + + + + +Node18->Node14 + + + + + + + + +Node18->Node16 + + + + + + + + +Node19 + + +src/include/stroid +/IO/mesh.h + + + + + +Node18->Node19 + + + + + + + + +Node21 + + +src/include/stroid +/refinement/uniform.h + + + + + +Node18->Node21 + + + + + + + + +Node19->Node2 + + + + + + + + +Node19->Node5 + + + + + + + + +Node20 + + +src/python/IO/bindings.cpp + + + + + +Node19->Node20 + + + + + + + + +Node21->Node2 + + + + + + + + +Node21->Node6 + + + + + + + + +Node22 + + +src/python/refinement +/bindings.cpp + + + + + +Node21->Node22 + + + diff --git a/docs/html/config_8h__dep__incl_org.svg b/docs/html/config_8h__dep__incl_org.svg index e368527..20f35a2 100644 --- a/docs/html/config_8h__dep__incl_org.svg +++ b/docs/html/config_8h__dep__incl_org.svg @@ -1,30 +1,30 @@ - - - + + src/include/stroid/config/config.h Node1 - -src/include/stroid -/config/config.h + +src/include/stroid +/config/config.h Node2 - - -src/include/stroid -/topology/curvilinear.h + + +src/include/stroid +/stroid.h @@ -32,18 +32,18 @@ Node1->Node2 - - + + Node4 - - -src/include/stroid -/topology/mapping.h + + +src/include/stroid +/topology/curvilinear.h @@ -51,72 +51,185 @@ Node1->Node4 - - + + - - -Node6 - - -src/include/stroid -/topology/topology.h + + +Node5 + + +src/lib/IO/mesh.cpp - - -Node1->Node6 - - - + + +Node1->Node5 + + + - - -Node7 - - -src/lib/IO/mesh.cpp + + +Node9 + + +src/include/stroid +/topology/mapping.h - - -Node1->Node7 - - - + + +Node1->Node9 + + + - - -Node8 - - -src/lib/topology/topology.cpp + + +Node11 + + +src/include/stroid +/topology/optimize.h - - -Node1->Node8 - - - + + +Node1->Node11 + + + + + + + + +Node13 + + +src/include/stroid +/topology/topology.h + + + + + +Node1->Node13 + + + + + + + + +Node14 + + +src/include/stroid +/utils/mesh_stats.h + + + + + +Node1->Node14 + + + + + + + + +Node17 + + +src/include/stroid +/utils/mesh_utils.h + + + + + +Node1->Node17 + + + + + + + + +Node18 + + +src/include/stroid +/utils/types.h + + + + + +Node1->Node18 + + + + + + + + +Node23 + + +src/lib/topology/topology.cpp + + + + + +Node1->Node23 + + + + + + + + +Node24 + + +src/python/config/bindings.cpp + + + + + +Node1->Node24 + + + Node3 - - -src/lib/topology/curvilinear.cpp + + +src/python/bindings.cpp @@ -124,26 +237,17 @@ Node2->Node3 - - + + - - -Node4->Node3 - - - - - - - - -Node5 - - -src/lib/topology/mapping.cpp + + +Node4->Node2 + + + @@ -151,8 +255,392 @@ Node4->Node5 - - + + + + + + + +Node6 + + +src/lib/refinement +/uniform.cpp + + + + + +Node4->Node6 + + + + + + + + +Node7 + + +src/lib/topology/curvilinear.cpp + + + + + +Node4->Node7 + + + + + + + + +Node8 + + +src/lib/utils/mesh +_utils.cpp + + + + + +Node4->Node8 + + + + + + + + +Node9->Node2 + + + + + + + + +Node9->Node7 + + + + + + + + +Node10 + + +src/lib/topology/mapping.cpp + + + + + +Node9->Node10 + + + + + + + + +Node11->Node2 + + + + + + + + +Node11->Node6 + + + + + + + + +Node12 + + +src/lib/topology/optimize.cpp + + + + + +Node11->Node12 + + + + + + + + +Node13->Node2 + + + + + + + + +Node13->Node6 + + + + + + + + +Node14->Node2 + + + + + + + + +Node15 + + +src/lib/utils/mesh +_stats.cpp + + + + + +Node14->Node15 + + + + + + + + +Node16 + + +src/python/utils/bindings.cpp + + + + + +Node14->Node16 + + + + + + + + +Node17->Node2 + + + + + + + + +Node17->Node6 + + + + + + + + +Node17->Node8 + + + + + + + + +Node17->Node16 + + + + + + + + +Node18->Node2 + + + + + + + + +Node18->Node4 + + + + + + + + +Node18->Node6 + + + + + + + + +Node18->Node14 + + + + + + + + +Node18->Node16 + + + + + + + + +Node19 + + +src/include/stroid +/IO/mesh.h + + + + + +Node18->Node19 + + + + + + + + +Node21 + + +src/include/stroid +/refinement/uniform.h + + + + + +Node18->Node21 + + + + + + + + +Node19->Node2 + + + + + + + + +Node19->Node5 + + + + + + + + +Node20 + + +src/python/IO/bindings.cpp + + + + + +Node19->Node20 + + + + + + + + +Node21->Node2 + + + + + + + + +Node21->Node6 + + + + + + + + +Node22 + + +src/python/refinement +/bindings.cpp + + + + + +Node21->Node22 + + + diff --git a/docs/html/curvilinear_8cpp.html b/docs/html/curvilinear_8cpp.html index 4a7183d..29f6a52 100644 --- a/docs/html/curvilinear_8cpp.html +++ b/docs/html/curvilinear_8cpp.html @@ -31,7 +31,7 @@
Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -113,14 +113,16 @@ $(function(){initNavTree('curvilinear_8cpp.html',''); initResizable(true); });
Include dependency graph for curvilinear.cpp:
-
+
+ +

Namespaces

namespace  stroid
 Public API surface for the stroid mesh generation library.
 
namespace  stroid::topology
 Topology construction and curvilinear mapping utilities.
 
+ + +

@@ -131,6 +133,9 @@ Functions

void stroid::topology::ProjectMesh (mfem::Mesh &mesh, const fourdst::config::Config< config::MeshConfig > &config)
 Project high-order mesh nodes using the configured curvilinear mapping.
 
std::unique_ptr< ScalarMeshFieldstroid::topology::BuildExteriorCoordinate (mfem::Mesh &mesh, mfem::Mesh &reference_mesh, const fourdst::config::Config< config::MeshConfig > &config)
 Build a scalar grid function representing the compactification coordinate for a mesh. This ranges from 0-1 with 0 at the stellar surface and 1 at the compactified infinity.
 
diff --git a/docs/html/curvilinear_8cpp.js b/docs/html/curvilinear_8cpp.js index 1379c5b..0841d46 100644 --- a/docs/html/curvilinear_8cpp.js +++ b/docs/html/curvilinear_8cpp.js @@ -1,5 +1,6 @@ var curvilinear_8cpp = [ + [ "stroid::topology::BuildExteriorCoordinate", "namespacestroid_1_1topology.html#a5ab92f7fb487c4639042539bf7b86606", null ], [ "stroid::topology::ProjectMesh", "namespacestroid_1_1topology.html#a836ed13e5bac63e7952c3ce4e5532e78", null ], [ "stroid::topology::PromoteToHighOrder", "namespacestroid_1_1topology.html#a5907aa2e639cda703d48d177abc37caf", null ] ]; \ No newline at end of file diff --git a/docs/html/curvilinear_8cpp__incl.map b/docs/html/curvilinear_8cpp__incl.map index 7462081..74a1e36 100644 --- a/docs/html/curvilinear_8cpp__incl.map +++ b/docs/html/curvilinear_8cpp__incl.map @@ -1,18 +1,41 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/curvilinear_8cpp__incl.md5 b/docs/html/curvilinear_8cpp__incl.md5 index 63565a5..857b754 100644 --- a/docs/html/curvilinear_8cpp__incl.md5 +++ b/docs/html/curvilinear_8cpp__incl.md5 @@ -1 +1 @@ -31c392d827608579a7e0e3bf6524e7f9 \ No newline at end of file +d45956378a9ea1ae6c7d8c6291ea6c42 \ No newline at end of file diff --git a/docs/html/curvilinear_8cpp__incl.svg b/docs/html/curvilinear_8cpp__incl.svg index 5ec19ad..d2c2b91 100644 --- a/docs/html/curvilinear_8cpp__incl.svg +++ b/docs/html/curvilinear_8cpp__incl.svg @@ -4,10 +4,9 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + src/lib/topology/curvilinear.cpp Node1 - -src/lib/topology/curvilinear.cpp + +src/lib/topology/curvilinear.cpp @@ -32,8 +68,8 @@ Node2 - -stroid/topology/curvilinear.h + +stroid/topology/curvilinear.h @@ -41,44 +77,44 @@ Node1->Node2 - - + + - - -Node6 - - -stroid/topology/mapping.h + + +Node16 + + +stroid/topology/mapping.h - - -Node1->Node6 - - - + + +Node1->Node16 + + + - - -Node7 - - -iostream + + +Node17 + + +iostream - - -Node1->Node7 - - - + + +Node1->Node17 + + + @@ -86,8 +122,8 @@ Node3 - -mfem.hpp + +mfem.hpp @@ -95,8 +131,8 @@ Node2->Node3 - - + + @@ -104,8 +140,8 @@ Node4 - -stroid/config/config.h + +stroid/config/config.h @@ -113,8 +149,44 @@ Node2->Node4 - - + + + + + + + +Node10 + + +fourdst/config/config.h + + + + + +Node2->Node10 + + + + + + + + +Node11 + + +stroid/utils/types.h + + + + + +Node2->Node11 + + + @@ -122,49 +194,241 @@ Node5 - -fourdst/config/config.h + +cstdint - - -Node2->Node5 - - - + + +Node4->Node5 + + + - - -Node6->Node3 - - - + + +Node6 + + +optional - - -Node6->Node4 - - - + + +Node4->Node6 + + + - - -Node6->Node5 - - - + + +Node7 + + +string + + + + + +Node4->Node7 + + + + + + + + +Node8 + + +format + + + + + +Node4->Node8 + + + + + + + + +Node9 + + +sstream + + + + + +Node4->Node9 + + + + + + + + +Node11->Node3 + + + + + + + + +Node11->Node4 + + + + + + + + +Node11->Node7 + + + + + + + + +Node12 + + +memory + + + + + +Node11->Node12 + + + + + + + + +Node13 + + +expected + + + + + +Node11->Node13 + + + + + + + + +Node14 + + +unordered_map + + + + + +Node11->Node14 + + + + + + + + +Node15 + + +variant + + + + + +Node11->Node15 + + + + + + + + +Node16->Node3 + + + + + + + + +Node16->Node4 + + + + + + + + +Node16->Node10 + + + + + + + + + + + + + + + + + + + + + Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -110,22 +110,25 @@ $(function(){initNavTree('curvilinear_8h.html',''); initResizable(true); });
#include "mfem.hpp"
#include "stroid/config/config.h"
#include "fourdst/config/config.h"
+#include "stroid/utils/types.h"
Include dependency graph for curvilinear.h:
-
+
This graph shows which files directly or indirectly include this file:
-
+
+ +

Namespaces

namespace  stroid
 Public API surface for the stroid mesh generation library.
 
namespace  stroid::topology
 Topology construction and curvilinear mapping utilities.
 
+ + +

@@ -136,6 +139,9 @@ Functions

void stroid::topology::ProjectMesh (mfem::Mesh &mesh, const fourdst::config::Config< config::MeshConfig > &config)
 Project high-order mesh nodes using the configured curvilinear mapping.
 
std::unique_ptr< ScalarMeshFieldstroid::topology::BuildExteriorCoordinate (mfem::Mesh &mesh, mfem::Mesh &reference_mesh, const fourdst::config::Config< config::MeshConfig > &config)
 Build a scalar grid function representing the compactification coordinate for a mesh. This ranges from 0-1 with 0 at the stellar surface and 1 at the compactified infinity.
 
diff --git a/docs/html/curvilinear_8h.js b/docs/html/curvilinear_8h.js index afbb0ab..585bd4d 100644 --- a/docs/html/curvilinear_8h.js +++ b/docs/html/curvilinear_8h.js @@ -1,5 +1,6 @@ var curvilinear_8h = [ + [ "stroid::topology::BuildExteriorCoordinate", "namespacestroid_1_1topology.html#a5ab92f7fb487c4639042539bf7b86606", null ], [ "stroid::topology::ProjectMesh", "namespacestroid_1_1topology.html#a836ed13e5bac63e7952c3ce4e5532e78", null ], [ "stroid::topology::PromoteToHighOrder", "namespacestroid_1_1topology.html#a5907aa2e639cda703d48d177abc37caf", null ] ]; \ No newline at end of file diff --git a/docs/html/curvilinear_8h__dep__incl.map b/docs/html/curvilinear_8h__dep__incl.map index 46308f6..0baba87 100644 --- a/docs/html/curvilinear_8h__dep__incl.map +++ b/docs/html/curvilinear_8h__dep__incl.map @@ -1,5 +1,15 @@ - - - + + + + + + + + + + + + + diff --git a/docs/html/curvilinear_8h__dep__incl.md5 b/docs/html/curvilinear_8h__dep__incl.md5 index 5f4b3af..9578c80 100644 --- a/docs/html/curvilinear_8h__dep__incl.md5 +++ b/docs/html/curvilinear_8h__dep__incl.md5 @@ -1 +1 @@ -1ef7d734bf2c7c23d22f2dc767d814d9 \ No newline at end of file +8ebbe784dcbe0800100b357b2af6d277 \ No newline at end of file diff --git a/docs/html/curvilinear_8h__dep__incl.svg b/docs/html/curvilinear_8h__dep__incl.svg index 6d3283d..b0495ea 100644 --- a/docs/html/curvilinear_8h__dep__incl.svg +++ b/docs/html/curvilinear_8h__dep__incl.svg @@ -1,13 +1,12 @@ - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + src/include/stroid/topology/curvilinear.h Node1 - -src/include/stroid -/topology/curvilinear.h + +src/include/stroid +/topology/curvilinear.h Node2 - - -src/lib/topology/curvilinear.cpp + + +src/include/stroid +/stroid.h @@ -42,13 +79,126 @@ Node1->Node2 - - + + + + + + + +Node4 + + +src/lib/IO/mesh.cpp + + + + + +Node1->Node4 + + + + + + + + +Node5 + + +src/lib/refinement +/uniform.cpp + + + + + +Node1->Node5 + + + + + + + + +Node6 + + +src/lib/topology/curvilinear.cpp + + + + + +Node1->Node6 + + + + + + + + +Node7 + + +src/lib/utils/mesh +_utils.cpp + + + + + +Node1->Node7 + + + + + + + + +Node3 + + +src/python/bindings.cpp + + + + + +Node2->Node3 + + + + + + + + + + + + + + + + + + + + + Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -107,7 +107,7 @@ $(function(){initNavTree('dir_31a6c70da1404d38d1b51e38b19548a1.html',''); initRe
Directory dependency graph for IO:
-
+
@@ -107,19 +107,28 @@ $(function(){initNavTree('dir_3f4f28e99864f6e7d54ad0c93ce0a2a5.html',''); initRe
Directory dependency graph for stroid:
-
+

diff --git a/docs/html/dir_31a6c70da1404d38d1b51e38b19548a1_dep.map b/docs/html/dir_31a6c70da1404d38d1b51e38b19548a1_dep.map index d7f574b..70f15e1 100644 --- a/docs/html/dir_31a6c70da1404d38d1b51e38b19548a1_dep.map +++ b/docs/html/dir_31a6c70da1404d38d1b51e38b19548a1_dep.map @@ -1,4 +1,7 @@ - - + + + + + diff --git a/docs/html/dir_31a6c70da1404d38d1b51e38b19548a1_dep.md5 b/docs/html/dir_31a6c70da1404d38d1b51e38b19548a1_dep.md5 index 87a2367..7c1bef7 100644 --- a/docs/html/dir_31a6c70da1404d38d1b51e38b19548a1_dep.md5 +++ b/docs/html/dir_31a6c70da1404d38d1b51e38b19548a1_dep.md5 @@ -1 +1 @@ -ca552089631a787b46f4183859a8aad9 \ No newline at end of file +cca422376e856b7996b22c55ca903c9e \ No newline at end of file diff --git a/docs/html/dir_31a6c70da1404d38d1b51e38b19548a1_dep.svg b/docs/html/dir_31a6c70da1404d38d1b51e38b19548a1_dep.svg index fe13325..a366b72 100644 --- a/docs/html/dir_31a6c70da1404d38d1b51e38b19548a1_dep.svg +++ b/docs/html/dir_31a6c70da1404d38d1b51e38b19548a1_dep.svg @@ -1,11 +1,11 @@ - - + @@ -17,22 +17,44 @@ ]]> - + src/include/stroid/IO clusterdir_3f4f28e99864f6e7d54ad0c93ce0a2a5 - -stroid + +stroid + + + + + +dir_9d5018b9ddb63a582aa4c6b91bec2f8c + + +utils - + dir_31a6c70da1404d38d1b51e38b19548a1 - - -IO + + +IO + + + + + +dir_31a6c70da1404d38d1b51e38b19548a1->dir_9d5018b9ddb63a582aa4c6b91bec2f8c + + + + + + +1 diff --git a/docs/html/dir_31a6c70da1404d38d1b51e38b19548a1_dep_org.svg b/docs/html/dir_31a6c70da1404d38d1b51e38b19548a1_dep_org.svg index c954b32..850ce45 100644 --- a/docs/html/dir_31a6c70da1404d38d1b51e38b19548a1_dep_org.svg +++ b/docs/html/dir_31a6c70da1404d38d1b51e38b19548a1_dep_org.svg @@ -1,27 +1,49 @@ - - - + + src/include/stroid/IO clusterdir_3f4f28e99864f6e7d54ad0c93ce0a2a5 - -stroid + +stroid + + + + + +dir_9d5018b9ddb63a582aa4c6b91bec2f8c + + +utils - + dir_31a6c70da1404d38d1b51e38b19548a1 - - -IO + + +IO + + + + + +dir_31a6c70da1404d38d1b51e38b19548a1->dir_9d5018b9ddb63a582aa4c6b91bec2f8c + + + + + + +1 diff --git a/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5.html b/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5.html index e5894ab..5331ccb 100644 --- a/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5.html +++ b/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5.html @@ -31,7 +31,7 @@
Logo

-
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
+ + + + +

Directories

 config
 
 exceptions
 
 IO
 
 refinement
 
 topology
 
 utils
 
+ + +

+Files

 stroid.h
 
diff --git a/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5.js b/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5.js index 56c4d38..e854266 100644 --- a/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5.js +++ b/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5.js @@ -1,7 +1,10 @@ var dir_3f4f28e99864f6e7d54ad0c93ce0a2a5 = [ [ "config", "dir_dc36fd7496f87f6989d6d6a9445d600c.html", "dir_dc36fd7496f87f6989d6d6a9445d600c" ], + [ "exceptions", "dir_760124f38acb4ebb9f6d85a2d3ae192f.html", "dir_760124f38acb4ebb9f6d85a2d3ae192f" ], [ "IO", "dir_31a6c70da1404d38d1b51e38b19548a1.html", "dir_31a6c70da1404d38d1b51e38b19548a1" ], + [ "refinement", "dir_23ef0af4381c568078c3c1a0b52a2897.html", "dir_23ef0af4381c568078c3c1a0b52a2897" ], [ "topology", "dir_9da86e8abab39b749c6020360d8e4403.html", "dir_9da86e8abab39b749c6020360d8e4403" ], - [ "utils", "dir_9d5018b9ddb63a582aa4c6b91bec2f8c.html", "dir_9d5018b9ddb63a582aa4c6b91bec2f8c" ] + [ "utils", "dir_9d5018b9ddb63a582aa4c6b91bec2f8c.html", "dir_9d5018b9ddb63a582aa4c6b91bec2f8c" ], + [ "stroid.h", "stroid_8h.html", "stroid_8h" ] ]; \ No newline at end of file diff --git a/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5_dep.map b/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5_dep.map index 7774bd2..ccde09e 100644 --- a/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5_dep.map +++ b/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5_dep.map @@ -1,10 +1,30 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5_dep.md5 b/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5_dep.md5 index d35bafe..3c20a83 100644 --- a/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5_dep.md5 +++ b/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5_dep.md5 @@ -1 +1 @@ -b815693e1badcd6ad0f56a891383b798 \ No newline at end of file +a15c55619a3c29d262782e8125e054f8 \ No newline at end of file diff --git a/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5_dep.svg b/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5_dep.svg index 7cc84be..40d78e9 100644 --- a/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5_dep.svg +++ b/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5_dep.svg @@ -1,11 +1,11 @@ - - + @@ -17,74 +17,209 @@ ]]> - + src/include/stroid clusterdir_b0856f6b0d80ccb263b2f415c91f9e17 - -include + +include clusterdir_3f4f28e99864f6e7d54ad0c93ce0a2a5 - + dir_3f4f28e99864f6e7d54ad0c93ce0a2a5 -stroid +stroid dir_dc36fd7496f87f6989d6d6a9445d600c - -config + +config + + + + + +dir_3f4f28e99864f6e7d54ad0c93ce0a2a5->dir_dc36fd7496f87f6989d6d6a9445d600c + + + + + + +8 - + dir_31a6c70da1404d38d1b51e38b19548a1 - - -IO + + +IO + + + + + +dir_3f4f28e99864f6e7d54ad0c93ce0a2a5->dir_31a6c70da1404d38d1b51e38b19548a1 + + + + + + +1 + + + + + +dir_23ef0af4381c568078c3c1a0b52a2897 + + +refinement + + + + + +dir_3f4f28e99864f6e7d54ad0c93ce0a2a5->dir_23ef0af4381c568078c3c1a0b52a2897 + + + + + + +1 - + dir_9da86e8abab39b749c6020360d8e4403 - - -topology + + +topology - - -dir_9da86e8abab39b749c6020360d8e4403->dir_dc36fd7496f87f6989d6d6a9445d600c - - - + + +dir_3f4f28e99864f6e7d54ad0c93ce0a2a5->dir_9da86e8abab39b749c6020360d8e4403 + + + - -3 + +4 - + dir_9d5018b9ddb63a582aa4c6b91bec2f8c - - -utils + + +utils + + + + + +dir_3f4f28e99864f6e7d54ad0c93ce0a2a5->dir_9d5018b9ddb63a582aa4c6b91bec2f8c + + + + + + +6 + + + + + +dir_760124f38acb4ebb9f6d85a2d3ae192f + + +exceptions + + + + + +dir_31a6c70da1404d38d1b51e38b19548a1->dir_9d5018b9ddb63a582aa4c6b91bec2f8c + + + + + + +1 + + + + + +dir_23ef0af4381c568078c3c1a0b52a2897->dir_9d5018b9ddb63a582aa4c6b91bec2f8c + + + + + + +1 + + + + + +dir_9da86e8abab39b749c6020360d8e4403->dir_dc36fd7496f87f6989d6d6a9445d600c + + + + + + +4 + + + + + +dir_9da86e8abab39b749c6020360d8e4403->dir_9d5018b9ddb63a582aa4c6b91bec2f8c + + + + + + +1 + + + + + +dir_9d5018b9ddb63a582aa4c6b91bec2f8c->dir_dc36fd7496f87f6989d6d6a9445d600c + + + + + + +3 diff --git a/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5_dep_org.svg b/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5_dep_org.svg index 9ab3621..de6b977 100644 --- a/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5_dep_org.svg +++ b/docs/html/dir_3f4f28e99864f6e7d54ad0c93ce0a2a5_dep_org.svg @@ -1,79 +1,214 @@ - - - + + src/include/stroid clusterdir_b0856f6b0d80ccb263b2f415c91f9e17 - -include + +include clusterdir_3f4f28e99864f6e7d54ad0c93ce0a2a5 - + dir_3f4f28e99864f6e7d54ad0c93ce0a2a5 -stroid +stroid dir_dc36fd7496f87f6989d6d6a9445d600c - -config + +config + + + + + +dir_3f4f28e99864f6e7d54ad0c93ce0a2a5->dir_dc36fd7496f87f6989d6d6a9445d600c + + + + + + +8 - + dir_31a6c70da1404d38d1b51e38b19548a1 - - -IO + + +IO + + + + + +dir_3f4f28e99864f6e7d54ad0c93ce0a2a5->dir_31a6c70da1404d38d1b51e38b19548a1 + + + + + + +1 + + + + + +dir_23ef0af4381c568078c3c1a0b52a2897 + + +refinement + + + + + +dir_3f4f28e99864f6e7d54ad0c93ce0a2a5->dir_23ef0af4381c568078c3c1a0b52a2897 + + + + + + +1 - + dir_9da86e8abab39b749c6020360d8e4403 - - -topology + + +topology - - -dir_9da86e8abab39b749c6020360d8e4403->dir_dc36fd7496f87f6989d6d6a9445d600c - - - + + +dir_3f4f28e99864f6e7d54ad0c93ce0a2a5->dir_9da86e8abab39b749c6020360d8e4403 + + + - -3 + +4 - + dir_9d5018b9ddb63a582aa4c6b91bec2f8c - - -utils + + +utils + + + + + +dir_3f4f28e99864f6e7d54ad0c93ce0a2a5->dir_9d5018b9ddb63a582aa4c6b91bec2f8c + + + + + + +6 + + + + + +dir_760124f38acb4ebb9f6d85a2d3ae192f + + +exceptions + + + + + +dir_31a6c70da1404d38d1b51e38b19548a1->dir_9d5018b9ddb63a582aa4c6b91bec2f8c + + + + + + +1 + + + + + +dir_23ef0af4381c568078c3c1a0b52a2897->dir_9d5018b9ddb63a582aa4c6b91bec2f8c + + + + + + +1 + + + + + +dir_9da86e8abab39b749c6020360d8e4403->dir_dc36fd7496f87f6989d6d6a9445d600c + + + + + + +4 + + + + + +dir_9da86e8abab39b749c6020360d8e4403->dir_9d5018b9ddb63a582aa4c6b91bec2f8c + + + + + + +1 + + + + + +dir_9d5018b9ddb63a582aa4c6b91bec2f8c->dir_dc36fd7496f87f6989d6d6a9445d600c + + + + + + +3 diff --git a/docs/html/dir_49e56c817e5e54854c35e136979f97ca.html b/docs/html/dir_49e56c817e5e54854c35e136979f97ca.html index c4899d2..1b476d5 100644 --- a/docs/html/dir_49e56c817e5e54854c35e136979f97ca.html +++ b/docs/html/dir_49e56c817e5e54854c35e136979f97ca.html @@ -31,7 +31,7 @@
Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html index 59c038a..e44d589 100644 --- a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html +++ b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -107,7 +107,7 @@ $(function(){initNavTree('dir_68267d1309a1af8e8297ef4c3efbcdba.html',''); initRe
Directory dependency graph for src:
-
+
+ +

@@ -116,6 +116,8 @@ Directories

 
 lib
 
 python
 
diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.js b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.js index 43391b2..33782d1 100644 --- a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.js +++ b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.js @@ -1,5 +1,6 @@ var dir_68267d1309a1af8e8297ef4c3efbcdba = [ [ "include", "dir_b0856f6b0d80ccb263b2f415c91f9e17.html", "dir_b0856f6b0d80ccb263b2f415c91f9e17" ], - [ "lib", "dir_c85d3e3c5052e9ad9ce18c6863244a25.html", "dir_c85d3e3c5052e9ad9ce18c6863244a25" ] + [ "lib", "dir_c85d3e3c5052e9ad9ce18c6863244a25.html", "dir_c85d3e3c5052e9ad9ce18c6863244a25" ], + [ "python", "dir_5c0d64f70903e893b1efe571a4b8de29.html", "dir_5c0d64f70903e893b1efe571a4b8de29" ] ]; \ No newline at end of file diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.map b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.map index 7781d18..1ce09d1 100644 --- a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.map +++ b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.map @@ -1,7 +1,10 @@ - + - - - + + + + + + diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 index aa33daf..c1c8bac 100644 --- a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 +++ b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 @@ -1 +1 @@ -32f7a5be2d2ff8dc39a2a4b9db9092a6 \ No newline at end of file +02e19dbaf02362b7e506fbcaddd38b33 \ No newline at end of file diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.svg b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.svg index e9d7332..b353201 100644 --- a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.svg +++ b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.svg @@ -1,11 +1,11 @@ - - + @@ -22,7 +22,7 @@ clusterdir_68267d1309a1af8e8297ef4c3efbcdba - + @@ -35,8 +35,8 @@ dir_b0856f6b0d80ccb263b2f415c91f9e17 - -include + +include @@ -52,13 +52,35 @@ dir_c85d3e3c5052e9ad9ce18c6863244a25->dir_b0856f6b0d80ccb263b2f415c91f9e17 - - - + + + - -7 + +19 + + + + + +dir_5c0d64f70903e893b1efe571a4b8de29 + + +python + + + + + +dir_5c0d64f70903e893b1efe571a4b8de29->dir_b0856f6b0d80ccb263b2f415c91f9e17 + + + + + + +9 diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep_org.svg b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep_org.svg index f411c1d..5dbd2cd 100644 --- a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep_org.svg +++ b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba_dep_org.svg @@ -1,17 +1,17 @@ - - + src clusterdir_68267d1309a1af8e8297ef4c3efbcdba - + @@ -24,8 +24,8 @@ dir_b0856f6b0d80ccb263b2f415c91f9e17 - -include + +include @@ -41,13 +41,35 @@ dir_c85d3e3c5052e9ad9ce18c6863244a25->dir_b0856f6b0d80ccb263b2f415c91f9e17 - - - + + + - -7 + +19 + + + + + +dir_5c0d64f70903e893b1efe571a4b8de29 + + +python + + + + + +dir_5c0d64f70903e893b1efe571a4b8de29->dir_b0856f6b0d80ccb263b2f415c91f9e17 + + + + + + +9 diff --git a/docs/html/dir_82887d4f338e92537fa9d809bec8c614.html b/docs/html/dir_82887d4f338e92537fa9d809bec8c614.html index bfa9489..95e9767 100644 --- a/docs/html/dir_82887d4f338e92537fa9d809bec8c614.html +++ b/docs/html/dir_82887d4f338e92537fa9d809bec8c614.html @@ -31,7 +31,7 @@
Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
diff --git a/docs/html/dir_82887d4f338e92537fa9d809bec8c614_dep.map b/docs/html/dir_82887d4f338e92537fa9d809bec8c614_dep.map index 1658d23..7865711 100644 --- a/docs/html/dir_82887d4f338e92537fa9d809bec8c614_dep.map +++ b/docs/html/dir_82887d4f338e92537fa9d809bec8c614_dep.map @@ -1,7 +1,7 @@ - - + + diff --git a/docs/html/dir_82887d4f338e92537fa9d809bec8c614_dep.md5 b/docs/html/dir_82887d4f338e92537fa9d809bec8c614_dep.md5 index 58b4cf5..a14093b 100644 --- a/docs/html/dir_82887d4f338e92537fa9d809bec8c614_dep.md5 +++ b/docs/html/dir_82887d4f338e92537fa9d809bec8c614_dep.md5 @@ -1 +1 @@ -3231d3feafcfb48db197b1ba201573ce \ No newline at end of file +3cccde186a0e6a6a7d1300a70f60b9a3 \ No newline at end of file diff --git a/docs/html/dir_82887d4f338e92537fa9d809bec8c614_dep.svg b/docs/html/dir_82887d4f338e92537fa9d809bec8c614_dep.svg index 846707b..1a5a1b3 100644 --- a/docs/html/dir_82887d4f338e92537fa9d809bec8c614_dep.svg +++ b/docs/html/dir_82887d4f338e92537fa9d809bec8c614_dep.svg @@ -1,7 +1,7 @@ - dir_82887d4f338e92537fa9d809bec8c614->dir_b0856f6b0d80ccb263b2f415c91f9e17 - + - -2 + +3 diff --git a/docs/html/dir_82887d4f338e92537fa9d809bec8c614_dep_org.svg b/docs/html/dir_82887d4f338e92537fa9d809bec8c614_dep_org.svg index fb607cb..2633f6b 100644 --- a/docs/html/dir_82887d4f338e92537fa9d809bec8c614_dep_org.svg +++ b/docs/html/dir_82887d4f338e92537fa9d809bec8c614_dep_org.svg @@ -1,7 +1,7 @@ - dir_82887d4f338e92537fa9d809bec8c614->dir_b0856f6b0d80ccb263b2f415c91f9e17 - + - -2 + +3 diff --git a/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6.html b/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6.html index 6519573..9cd110c 100644 --- a/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6.html +++ b/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6.html @@ -31,7 +31,7 @@
Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -112,6 +112,8 @@ Directory dependency graph for utils:
+ +

Files

 mesh_stats.cpp
 
 mesh_utils.cpp
 
diff --git a/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6.js b/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6.js index 11f97d4..c86be53 100644 --- a/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6.js +++ b/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6.js @@ -1,4 +1,5 @@ var dir_87d18a4dc5174905bfd7d2dc734defe6 = [ + [ "mesh_stats.cpp", "mesh__stats_8cpp.html", "mesh__stats_8cpp" ], [ "mesh_utils.cpp", "mesh__utils_8cpp.html", "mesh__utils_8cpp" ] ]; \ No newline at end of file diff --git a/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6_dep.map b/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6_dep.map index b2eaea4..ea00717 100644 --- a/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6_dep.map +++ b/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6_dep.map @@ -1,7 +1,7 @@ - - + + diff --git a/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6_dep.md5 b/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6_dep.md5 index 7a0f78b..1f8c785 100644 --- a/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6_dep.md5 +++ b/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6_dep.md5 @@ -1 +1 @@ -62ece51f3bfca5aa9f7321dddbaaeed5 \ No newline at end of file +35dcfbf6324b586a55502eb25156f8c8 \ No newline at end of file diff --git a/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6_dep.svg b/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6_dep.svg index 2334ed7..baafea6 100644 --- a/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6_dep.svg +++ b/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6_dep.svg @@ -1,7 +1,7 @@ - dir_87d18a4dc5174905bfd7d2dc734defe6->dir_b0856f6b0d80ccb263b2f415c91f9e17 - + - -1 + +3 diff --git a/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6_dep_org.svg b/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6_dep_org.svg index 495c9e6..639a404 100644 --- a/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6_dep_org.svg +++ b/docs/html/dir_87d18a4dc5174905bfd7d2dc734defe6_dep_org.svg @@ -1,7 +1,7 @@ - dir_87d18a4dc5174905bfd7d2dc734defe6->dir_b0856f6b0d80ccb263b2f415c91f9e17 - + - -1 + +3 diff --git a/docs/html/dir_936721fd6a792737eaef7358bcd49428.html b/docs/html/dir_936721fd6a792737eaef7358bcd49428.html index fb70278..864dabd 100644 --- a/docs/html/dir_936721fd6a792737eaef7358bcd49428.html +++ b/docs/html/dir_936721fd6a792737eaef7358bcd49428.html @@ -31,7 +31,7 @@
Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -116,6 +116,8 @@ Files    mapping.cpp   + optimize.cpp topology.cpp   diff --git a/docs/html/dir_936721fd6a792737eaef7358bcd49428.js b/docs/html/dir_936721fd6a792737eaef7358bcd49428.js index 59601a1..2c9381d 100644 --- a/docs/html/dir_936721fd6a792737eaef7358bcd49428.js +++ b/docs/html/dir_936721fd6a792737eaef7358bcd49428.js @@ -2,5 +2,6 @@ var dir_936721fd6a792737eaef7358bcd49428 = [ [ "curvilinear.cpp", "curvilinear_8cpp.html", "curvilinear_8cpp" ], [ "mapping.cpp", "mapping_8cpp.html", "mapping_8cpp" ], + [ "optimize.cpp", "optimize_8cpp.html", "optimize_8cpp" ], [ "topology.cpp", "topology_8cpp.html", "topology_8cpp" ] ]; \ No newline at end of file diff --git a/docs/html/dir_936721fd6a792737eaef7358bcd49428_dep.map b/docs/html/dir_936721fd6a792737eaef7358bcd49428_dep.map index b40d3bf..8ebaa82 100644 --- a/docs/html/dir_936721fd6a792737eaef7358bcd49428_dep.map +++ b/docs/html/dir_936721fd6a792737eaef7358bcd49428_dep.map @@ -1,7 +1,7 @@ - - + + diff --git a/docs/html/dir_936721fd6a792737eaef7358bcd49428_dep.md5 b/docs/html/dir_936721fd6a792737eaef7358bcd49428_dep.md5 index 73aeee4..c8a569d 100644 --- a/docs/html/dir_936721fd6a792737eaef7358bcd49428_dep.md5 +++ b/docs/html/dir_936721fd6a792737eaef7358bcd49428_dep.md5 @@ -1 +1 @@ -a6827e6f70050682b6d24a1b9d480500 \ No newline at end of file +d1afbfcf5c8f195778cd568bcc291c8f \ No newline at end of file diff --git a/docs/html/dir_936721fd6a792737eaef7358bcd49428_dep.svg b/docs/html/dir_936721fd6a792737eaef7358bcd49428_dep.svg index 58e278f..35648bf 100644 --- a/docs/html/dir_936721fd6a792737eaef7358bcd49428_dep.svg +++ b/docs/html/dir_936721fd6a792737eaef7358bcd49428_dep.svg @@ -1,7 +1,7 @@ - dir_936721fd6a792737eaef7358bcd49428->dir_b0856f6b0d80ccb263b2f415c91f9e17 - + - -4 + +6 diff --git a/docs/html/dir_936721fd6a792737eaef7358bcd49428_dep_org.svg b/docs/html/dir_936721fd6a792737eaef7358bcd49428_dep_org.svg index 638757c..e6481b2 100644 --- a/docs/html/dir_936721fd6a792737eaef7358bcd49428_dep_org.svg +++ b/docs/html/dir_936721fd6a792737eaef7358bcd49428_dep_org.svg @@ -1,7 +1,7 @@ - dir_936721fd6a792737eaef7358bcd49428->dir_b0856f6b0d80ccb263b2f415c91f9e17 - + - -4 + +6 diff --git a/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c.html b/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c.html index 7aaf0e4..3aa925c 100644 --- a/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c.html +++ b/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c.html @@ -31,7 +31,7 @@
Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -107,13 +107,17 @@ $(function(){initNavTree('dir_9d5018b9ddb63a582aa4c6b91bec2f8c.html',''); initRe
Directory dependency graph for utils:
-
+
+ + + +

Files

 mesh_stats.h
 
 mesh_utils.h
 
 types.h
 
diff --git a/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c.js b/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c.js index 5a1ec02..6a08b61 100644 --- a/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c.js +++ b/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c.js @@ -1,4 +1,6 @@ var dir_9d5018b9ddb63a582aa4c6b91bec2f8c = [ - [ "mesh_utils.h", "mesh__utils_8h.html", "mesh__utils_8h" ] + [ "mesh_stats.h", "mesh__stats_8h.html", "mesh__stats_8h" ], + [ "mesh_utils.h", "mesh__utils_8h.html", "mesh__utils_8h" ], + [ "types.h", "types_8h.html", "types_8h" ] ]; \ No newline at end of file diff --git a/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c_dep.map b/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c_dep.map index c2111a6..5805df2 100644 --- a/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c_dep.map +++ b/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c_dep.map @@ -1,4 +1,7 @@ - - + + + + + diff --git a/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c_dep.md5 b/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c_dep.md5 index 6b3b9ed..7c6ebbd 100644 --- a/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c_dep.md5 +++ b/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c_dep.md5 @@ -1 +1 @@ -df55410125b942793bb664278575ee94 \ No newline at end of file +5844954aa4f7a89b3299a9003b4cf928 \ No newline at end of file diff --git a/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c_dep.svg b/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c_dep.svg index e6e614b..0d5e6f3 100644 --- a/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c_dep.svg +++ b/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c_dep.svg @@ -1,11 +1,11 @@ - - + @@ -17,22 +17,44 @@ ]]> - + src/include/stroid/utils clusterdir_3f4f28e99864f6e7d54ad0c93ce0a2a5 - -stroid + +stroid + + + + + +dir_dc36fd7496f87f6989d6d6a9445d600c + + +config - + dir_9d5018b9ddb63a582aa4c6b91bec2f8c - - -utils + + +utils + + + + + +dir_9d5018b9ddb63a582aa4c6b91bec2f8c->dir_dc36fd7496f87f6989d6d6a9445d600c + + + + + + +3 diff --git a/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c_dep_org.svg b/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c_dep_org.svg index 287dfe5..1d1f2aa 100644 --- a/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c_dep_org.svg +++ b/docs/html/dir_9d5018b9ddb63a582aa4c6b91bec2f8c_dep_org.svg @@ -1,27 +1,49 @@ - - - + + src/include/stroid/utils clusterdir_3f4f28e99864f6e7d54ad0c93ce0a2a5 - -stroid + +stroid + + + + + +dir_dc36fd7496f87f6989d6d6a9445d600c + + +config - + dir_9d5018b9ddb63a582aa4c6b91bec2f8c - - -utils + + +utils + + + + + +dir_9d5018b9ddb63a582aa4c6b91bec2f8c->dir_dc36fd7496f87f6989d6d6a9445d600c + + + + + + +3 diff --git a/docs/html/dir_9da86e8abab39b749c6020360d8e4403.html b/docs/html/dir_9da86e8abab39b749c6020360d8e4403.html index e7c7a13..04ee96d 100644 --- a/docs/html/dir_9da86e8abab39b749c6020360d8e4403.html +++ b/docs/html/dir_9da86e8abab39b749c6020360d8e4403.html @@ -31,7 +31,7 @@
Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -107,7 +107,7 @@ $(function(){initNavTree('dir_9da86e8abab39b749c6020360d8e4403.html',''); initRe
Directory dependency graph for topology:
-
+
+ +

@@ -116,6 +116,8 @@ Files

 
 mapping.h
 
 optimize.h
 
 topology.h
 
diff --git a/docs/html/dir_9da86e8abab39b749c6020360d8e4403.js b/docs/html/dir_9da86e8abab39b749c6020360d8e4403.js index 7beae3e..2b61b55 100644 --- a/docs/html/dir_9da86e8abab39b749c6020360d8e4403.js +++ b/docs/html/dir_9da86e8abab39b749c6020360d8e4403.js @@ -2,5 +2,6 @@ var dir_9da86e8abab39b749c6020360d8e4403 = [ [ "curvilinear.h", "curvilinear_8h.html", "curvilinear_8h" ], [ "mapping.h", "mapping_8h.html", "mapping_8h" ], + [ "optimize.h", "optimize_8h.html", "optimize_8h" ], [ "topology.h", "topology_8h.html", "topology_8h" ] ]; \ No newline at end of file diff --git a/docs/html/dir_9da86e8abab39b749c6020360d8e4403_dep.map b/docs/html/dir_9da86e8abab39b749c6020360d8e4403_dep.map index f1e1e42..117f74b 100644 --- a/docs/html/dir_9da86e8abab39b749c6020360d8e4403_dep.map +++ b/docs/html/dir_9da86e8abab39b749c6020360d8e4403_dep.map @@ -1,7 +1,10 @@ - - - - - + + + + + + + + diff --git a/docs/html/dir_9da86e8abab39b749c6020360d8e4403_dep.md5 b/docs/html/dir_9da86e8abab39b749c6020360d8e4403_dep.md5 index 03b264d..82af4ae 100644 --- a/docs/html/dir_9da86e8abab39b749c6020360d8e4403_dep.md5 +++ b/docs/html/dir_9da86e8abab39b749c6020360d8e4403_dep.md5 @@ -1 +1 @@ -19d94e8bef8dac3ca0c5b36cb64c7024 \ No newline at end of file +f5fed5f3256b8c95b6bf5a446e11525a \ No newline at end of file diff --git a/docs/html/dir_9da86e8abab39b749c6020360d8e4403_dep.svg b/docs/html/dir_9da86e8abab39b749c6020360d8e4403_dep.svg index 17637ba..da202c4 100644 --- a/docs/html/dir_9da86e8abab39b749c6020360d8e4403_dep.svg +++ b/docs/html/dir_9da86e8abab39b749c6020360d8e4403_dep.svg @@ -1,11 +1,11 @@ - - + @@ -22,39 +22,61 @@ clusterdir_3f4f28e99864f6e7d54ad0c93ce0a2a5 - -stroid + +stroid + + + + + +dir_9d5018b9ddb63a582aa4c6b91bec2f8c + + +utils - + dir_dc36fd7496f87f6989d6d6a9445d600c - - -config + + +config - + dir_9da86e8abab39b749c6020360d8e4403 - - -topology + + +topology + + + + + +dir_9da86e8abab39b749c6020360d8e4403->dir_9d5018b9ddb63a582aa4c6b91bec2f8c + + + + + + +1 - + dir_9da86e8abab39b749c6020360d8e4403->dir_dc36fd7496f87f6989d6d6a9445d600c - - - + + + - -3 + +4 diff --git a/docs/html/dir_9da86e8abab39b749c6020360d8e4403_dep_org.svg b/docs/html/dir_9da86e8abab39b749c6020360d8e4403_dep_org.svg index 3c6e344..2873b17 100644 --- a/docs/html/dir_9da86e8abab39b749c6020360d8e4403_dep_org.svg +++ b/docs/html/dir_9da86e8abab39b749c6020360d8e4403_dep_org.svg @@ -1,49 +1,71 @@ - - + src/include/stroid/topology clusterdir_3f4f28e99864f6e7d54ad0c93ce0a2a5 - -stroid + +stroid + + + + + +dir_9d5018b9ddb63a582aa4c6b91bec2f8c + + +utils - + dir_dc36fd7496f87f6989d6d6a9445d600c - - -config + + +config - + dir_9da86e8abab39b749c6020360d8e4403 - - -topology + + +topology + + + + + +dir_9da86e8abab39b749c6020360d8e4403->dir_9d5018b9ddb63a582aa4c6b91bec2f8c + + + + + + +1 - + dir_9da86e8abab39b749c6020360d8e4403->dir_dc36fd7496f87f6989d6d6a9445d600c - - - + + + - -3 + +4 diff --git a/docs/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.html b/docs/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.html index 8f61856..3c812df 100644 --- a/docs/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.html +++ b/docs/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.html @@ -31,7 +31,7 @@
Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
diff --git a/docs/html/dir_c34d5e8363cf0aa3fabc4f3fad3412a4.html b/docs/html/dir_c34d5e8363cf0aa3fabc4f3fad3412a4.html index 4c467af..c883871 100644 --- a/docs/html/dir_c34d5e8363cf0aa3fabc4f3fad3412a4.html +++ b/docs/html/dir_c34d5e8363cf0aa3fabc4f3fad3412a4.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
diff --git a/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25.html b/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25.html index 8250efc..47b2be1 100644 --- a/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25.html +++ b/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -107,13 +107,15 @@ $(function(){initNavTree('dir_c85d3e3c5052e9ad9ce18c6863244a25.html',''); initRe
Directory dependency graph for lib:
-
+
+ + diff --git a/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25.js b/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25.js index f04ecbb..086323f 100644 --- a/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25.js +++ b/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25.js @@ -1,6 +1,7 @@ var dir_c85d3e3c5052e9ad9ce18c6863244a25 = [ [ "IO", "dir_82887d4f338e92537fa9d809bec8c614.html", "dir_82887d4f338e92537fa9d809bec8c614" ], + [ "refinement", "dir_fbf157f01b55b8656afa0c9222ffb8e3.html", "dir_fbf157f01b55b8656afa0c9222ffb8e3" ], [ "topology", "dir_936721fd6a792737eaef7358bcd49428.html", "dir_936721fd6a792737eaef7358bcd49428" ], [ "utils", "dir_87d18a4dc5174905bfd7d2dc734defe6.html", "dir_87d18a4dc5174905bfd7d2dc734defe6" ] ]; \ No newline at end of file diff --git a/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25_dep.map b/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25_dep.map index 82a40c0..e8b75c5 100644 --- a/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25_dep.map +++ b/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25_dep.map @@ -1,14 +1,17 @@ - + - - - - - - - - - - + + + + + + + + + + + + + diff --git a/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25_dep.md5 b/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25_dep.md5 index e440e21..21653ad 100644 --- a/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25_dep.md5 +++ b/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25_dep.md5 @@ -1 +1 @@ -5d9ef3125767d08f4f264c156680ff08 \ No newline at end of file +c68bb87b6379572c3ef0a76a0d75a951 \ No newline at end of file diff --git a/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25_dep.svg b/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25_dep.svg index db422b3..c59aa23 100644 --- a/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25_dep.svg +++ b/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25_dep.svg @@ -1,11 +1,11 @@ - - + @@ -22,15 +22,15 @@ clusterdir_68267d1309a1af8e8297ef4c3efbcdba - -src + +src clusterdir_c85d3e3c5052e9ad9ce18c6863244a25 - + @@ -38,8 +38,8 @@ dir_b0856f6b0d80ccb263b2f415c91f9e17 - -include + +include @@ -60,57 +60,79 @@ dir_82887d4f338e92537fa9d809bec8c614->dir_b0856f6b0d80ccb263b2f415c91f9e17 - - - + + + - -2 + +3 + + + + + +dir_fbf157f01b55b8656afa0c9222ffb8e3 + + +refinement + + + + + +dir_fbf157f01b55b8656afa0c9222ffb8e3->dir_b0856f6b0d80ccb263b2f415c91f9e17 + + + + + + +7 - + dir_936721fd6a792737eaef7358bcd49428 - - -topology + + +topology - + dir_936721fd6a792737eaef7358bcd49428->dir_b0856f6b0d80ccb263b2f415c91f9e17 - - - + + + - -4 + +6 - + dir_87d18a4dc5174905bfd7d2dc734defe6 - - -utils + + +utils - + dir_87d18a4dc5174905bfd7d2dc734defe6->dir_b0856f6b0d80ccb263b2f415c91f9e17 - - - + + + - -1 + +3 diff --git a/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25_dep_org.svg b/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25_dep_org.svg index 8e77321..039305e 100644 --- a/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25_dep_org.svg +++ b/docs/html/dir_c85d3e3c5052e9ad9ce18c6863244a25_dep_org.svg @@ -1,25 +1,25 @@ - - + src/lib clusterdir_68267d1309a1af8e8297ef4c3efbcdba - -src + +src clusterdir_c85d3e3c5052e9ad9ce18c6863244a25 - + @@ -27,8 +27,8 @@ dir_b0856f6b0d80ccb263b2f415c91f9e17 - -include + +include @@ -49,57 +49,79 @@ dir_82887d4f338e92537fa9d809bec8c614->dir_b0856f6b0d80ccb263b2f415c91f9e17 - - - + + + - -2 + +3 + + + + + +dir_fbf157f01b55b8656afa0c9222ffb8e3 + + +refinement + + + + + +dir_fbf157f01b55b8656afa0c9222ffb8e3->dir_b0856f6b0d80ccb263b2f415c91f9e17 + + + + + + +7 - + dir_936721fd6a792737eaef7358bcd49428 - - -topology + + +topology - + dir_936721fd6a792737eaef7358bcd49428->dir_b0856f6b0d80ccb263b2f415c91f9e17 - - - + + + - -4 + +6 - + dir_87d18a4dc5174905bfd7d2dc734defe6 - - -utils + + +utils - + dir_87d18a4dc5174905bfd7d2dc734defe6->dir_b0856f6b0d80ccb263b2f415c91f9e17 - - - + + + - -1 + +3 diff --git a/docs/html/dir_dc36fd7496f87f6989d6d6a9445d600c.html b/docs/html/dir_dc36fd7496f87f6989d6d6a9445d600c.html index e2c59b4..b0f814f 100644 --- a/docs/html/dir_dc36fd7496f87f6989d6d6a9445d600c.html +++ b/docs/html/dir_dc36fd7496f87f6989d6d6a9445d600c.html @@ -31,7 +31,7 @@
Logo diff --git a/docs/html/doxygen_crawl.html b/docs/html/doxygen_crawl.html index b1a22fc..adacb7e 100644 --- a/docs/html/doxygen_crawl.html +++ b/docs/html/doxygen_crawl.html @@ -8,37 +8,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -46,57 +129,298 @@ + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/files.html b/docs/html/files.html index 526636e..ad6772c 100644 --- a/docs/html/files.html +++ b/docs/html/files.html @@ -31,7 +31,7 @@ @@ -114,23 +114,55 @@ $(function(){initNavTree('files.html',''); initResizable(true); }); - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Directories

 IO
 
 refinement
 
 topology
 
 utils
-
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
-
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
  stroid
  config
 config.h
  IO
 mesh.h
  topology
 curvilinear.h
 mapping.h
 topology.h
  utils
 mesh_utils.h
  lib
  IO
 mesh.cpp
  topology
 curvilinear.cpp
 mapping.cpp
 topology.cpp
  utils
 mesh_utils.cpp
  exceptions
 exceptions.h
 stroid_error.h
  IO
 mesh.h
  refinement
 uniform.h
  topology
 curvilinear.h
 mapping.h
 optimize.h
 topology.h
  utils
 mesh_stats.h
 mesh_utils.h
 types.h
 stroid.h
  lib
  IO
 mesh.cpp
  refinement
 uniform.cpp
  topology
 curvilinear.cpp
 mapping.cpp
 optimize.cpp
 topology.cpp
  utils
 mesh_stats.cpp
 mesh_utils.cpp
  python
  config
 bindings.cpp
 bindings.h
  exceptions
 bindings.cpp
 bindings.h
  IO
 bindings.cpp
 bindings.h
  refinement
 bindings.cpp
 bindings.h
  stroid
 __init__.py
  utils
 bindings.cpp
 bindings.h
 bindings.cpp
diff --git a/docs/html/functions.html b/docs/html/functions.html index 0553578..b8672ca 100644 --- a/docs/html/functions.html +++ b/docs/html/functions.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -101,21 +101,226 @@ $(function(){initNavTree('functions.html',''); initResizable(true); });
-
Here is a list of all class members with links to the classes they belong to:
diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html index c8757ae..7e8c24e 100644 --- a/docs/html/functions_vars.html +++ b/docs/html/functions_vars.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -101,21 +101,205 @@ $(function(){initNavTree('functions_vars.html',''); initResizable(true); });
-
Here is a list of all variables with links to the classes they belong to:
diff --git a/docs/html/graph_legend.html b/docs/html/graph_legend.html index ecd9f78..bf406ae 100644 --- a/docs/html/graph_legend.html +++ b/docs/html/graph_legend.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
diff --git a/docs/html/index.html b/docs/html/index.html index 8766633..4ba31d4 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -5,7 +5,7 @@ -stroid: Stroid +stroid: stroid @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -101,32 +101,34 @@ $(function(){initNavTree('index.html',''); initResizable(true); });
-
Stroid
+
stroid
-

-

-A multi-block mesh generation tool for stellar modeling

+

stroid logo

+

+Stroid

+

+A multi-block mesh generation tool for stellar modeling

Stroid is a simple multi-block mesh generation tool designed to generate multi-domain meshes for 3D finite element modeling of stellar physics. It uses the MFEM library for mesh generation and manipulation and is capable of generating high-order curvilinear and non-singular meshes.

Note: Stroid is under active development and is not yet stable. Features and interfaces may change in future releases.

-

-Building and Installing

+

+Building and Installing

Stroid uses meson as its build system, specifically we require version 1.3.0 or higher. Further, stroid depends on C++23 standard library features, so both a compatible compiler and standard template library are required. All other dependencies are handled by meson and will be downloaded and built automatically.

-

-Building

+

+Building

git clone https://github.com/4D-STAR/stroid.git
cd stroid
meson setup build
meson compile -C build
meson test -C build
meson install -C build
-

-Uninstalling

+

+Uninstalling

To uninstall stroid, if you built it using meson and the default ninja backend, you can use the following command

sudo ninja uninstall -C build
-

-Running

+

+Running

Stroid can be used either from the command line or from C++. The command line interface is the simplest way to get started. After installation, the stroid generate command should be available in your terminal.

stroid generate --help

The main way to interface with this is through the subcommands (currently only generate and info are available):

@@ -146,8 +148,8 @@ Running

Further, mesh generation options are loaded from a toml file, a default version of this file can be saved by running

stroid info -d

which will save a default config file to default.toml

-

-Configuration File

+

+Configuration File

Stroid uses a TOML configuration file to specify the parameters for mesh generation. An example configuration file is found below

[main]
refinement_levels = 2
@@ -164,19 +166,25 @@ Configuration File
core_id = 1
envelope_id = 2
vacuum_id = 3
+
core_mapping = "multi_block"
+
+
+
[main.optimization_methods]
+
tmop = false
+
smoothstep = true
- + - + - + @@ -194,45 +202,114 @@ Configuration File - + + + + + + +
Parameter Description Default
refinement_levels Number of uniform refinement levels to apply to the mesh after generation 4
refinement_levels Stellar minimum depth, or uniform depth when vacuum overrides are omitted 4
order The polynomial order of the finite elements in the mesh 3
include_external_domain Whether to include an external domain extending to r_infinity true
r_core The radius of the core region of the star 1.5
r_core The radius of the core region of the star 0.25
r_star The radius of the star 5.0
r_star The radius of the star 1.0
flattening The flattening factor of the star (0 for spherical, >0 for oblate) 0
envelope_id The material ID to assign to the envelope region of the star 2
vacuum_id The material ID to assign to the vacuum region of the star (if included) 3
vacuum_id The material ID to assign to the vacuum region of the star (if included) 3
optimization_methods.tmop The tmop flag enables or disables the use of TMOP ideal shape unit size metric optimization during mesh generation. This can help improve the quality of the generated mesh, but will dramatically increase the time required for mesh generation. false
optimization_methods.smoothstep The smoothstep flag enables or disables the use of a smoothstep function to transition between the core and envelope regions of the star. This can help improve the quality of the generated mesh true
core_mapping The core mapping strategy to use for the mesh generation. Options are "spherified" (legacy) or "multi_block" (conditioned). The multi_block strategy is strongly preferred for its improved condition number. "multi_block"
-

If no configuration file is provided, stroid will use the default parameters listed above. Further, configuration files need only include parameters that differ from the defaults, any parameters not specified will use the default values.

-

-C++ Interface

+

If no configuration file is provided, stroid will use the default parameters listed above. Further, configuration files need only include parameters that differ from the defaults. For compatibility with older TOML files, an omitted core_mapping uses "spherified", and omitted TMOP controls leave optimization disabled. Set core_mapping = "multi_block" explicitly to use the conditioned mapping in a TOML file. Default-constructed C++ and Python MeshConfig objects select "multi_block"; other omitted TOML geometry fields use the defaults from MeshConfig.

+

+Conditioned core mapping

+

There are two core mapping strategies, spherified and multi_block. Generally multi_block should be strongly preferred. The core_mapping = "multi_block" strategy avoids the radial rank loss at the eight corners of the spherified core block. It uses a Cartesian center plus six transition blocks inside the core. The inner cube has circumscribed radius r_core / 2; its six faces connect linearly to the existing spherical r_core interface. If enabled, spheroidal flattening is applied afterwards.

+
cfg = stroid.config.MeshConfig(core_mapping="multi_block", refinement_levels=2)
+
cfg.optimization_methods = stroid.config.OptimizationMethods(tmop=False)
+ +
StroidMesh GenerateMesh(const fourdst::config::Config< stroid::config::MeshConfig > &input)
Definition stroid.h:52
+
Configuration parameters for stroid mesh generation.
Definition config.h:25
+ +

The optional, non-installed geometry_quality_experiment target may be used to measure the actual high-order geometry at quadrature points, vertices, edges, and near-corner probes. You may build and run it explicitly:

+
meson compile -C build geometry_quality_experiment
+
build/tools/geometry_quality_experiment --orders 4 --refinements 2 \
+
--contraction-probe --probe-order 3 --output core_comparison.csv
+

+Nonconforming vacuum refinement

+

Stroid can keep the star and both ends of the vacuum well resolved while using coarser elements in the vacuum interior. Refinement is isotropic: each refinement splits a hexahedron into eight children. Note however that only one geometric polynomial order applies to every region.

+
[main]
+
refinement_levels = 4
+
vacuum_refinement_levels = 2
+
# Optional: omitted outer depth inherits refinement_levels (4 here).
+
# vacuum_outer_refinement_levels = 4
+
order = 3
+
include_external_domain = true
+
core_mapping = "multi_block"
+
+
[main.optimization_methods]
+
tmop = false
+
smoothstep = true
+

configs/nonconforming_vacuum.toml provides a complete example. The three depth settings are absolute minimum targets measured from the initial block topology:

+ + + + + + + + + +
Setting Applies to Default
refinement_levels Core and envelope 4
vacuum_refinement_levels Vacuum interior Inherit refinement_levels
vacuum_outer_refinement_levels Cells touching the vacuum outer boundary Inherit refinement_levels
+

Omitting both vacuum overrides preserves uniform generation. Supplying either activates the local refinement policy and requires include_external_domain = true. All levels must be nonnegative integers.

+

Stroid enforces that vacuum cells touching the stellar surface match the stellar face subdivision. That is to say that the inner boundary of the vacuum region is conforming to the outer boundary of the stellar region. Further, the outer-boundary cells receive the outer target, and automatic grading limits neighboring refinement depths to one level. This two layer approach is intended to allow for refinement when using compactification maps.

+
import stroid
+
+ +
refinement_levels=4,
+
vacuum_refinement_levels=2,
+
vacuum_outer_refinement_levels=None, # Inherit stellar depth.
+
order=3,
+
core_mapping="multi_block",
+
optimization_methods=stroid.config.OptimizationMethods(tmop=False),
+
)
+ +
features = stroid.stats.MESH_STAT_DEFAULT | stroid.stats.MeshStatFeatures.ELEMENT_COUNT
+
stats = stroid.stats.ComputeMeshStats(mesh, features)
+
print(stats.element_counts.vacuum)
+
print(stats.refinement.vacuum.min_depth, stats.refinement.vacuum.max_depth)
+
print(stats.refinement.geometry_dofs, stats.refinement.geometry_true_dofs)
+
print(stats.conformity.conforming, stats.conformity.n_nonconforming_faces)
+
+
stroid.IO.SaveStroidMesh(mesh, "graded.stroid")
+
restored = stroid.IO.LoadStroidMesh("graded.stroid")
+ +
std::expected< StroidMesh, std::string > LoadStroidMesh(const std::string &filename)
Definition mesh.cpp:838
+
void SaveStroidMesh(const StroidMesh &mesh, const std::string &filename, const std::string &comment="")
Definition mesh.cpp:681
+
void UniformRefinement(StroidMesh &mesh, size_t levels)
Refine every current leaf, preserving any existing nonconforming hierarchy. Rebuilds constrained geom...
Definition uniform.cpp:14
+
MeshStats ComputeMeshStats(const StroidMesh &sm, MeshStatFeatures features=MESH_STAT_DEFAULT, int sample_order=-1)
Definition mesh_stats.cpp:20
+

The UniformRefinement(mesh, n) function adds n levels to every current leaf while preserving the existing grading, and rebuilds the geometry and exterior coordinate. Note that this means that a non-conforming mesh that has been Uniformly refined will still be non-conforming, but the refinement will be applied to all leaves.

+

+Viewing curved meshes in GLVis

+

It is important to note — and potentially confusing if not understood — that GLVis approximates curved faces with flat triangles. At a hanging interface, the same subdivision count on a coarse face and its finer neighbors samples the curved surface at different locations. This can produce apparent gaps even when the finite-element face transformations agree. These gaps are not indications that the mesh itself is non-conforming; rather, they are a visualization artifact.

+

+C++ Interface

Stroid can be used as a library in C++ projects. After installation, include the stroid header and link against the stroid library.

-

A basic example of using stroid in C++ is shown below (note that you will need a glvis instance running on localhost:19916 to visualize the mesh):

#include <memory>
-
#include "mfem.hpp"
-
- -
#include "stroid/IO/mesh.h"
- - -
-
#include "fourdst/config/config.h"
+

A basic example of using stroid in C++ is shown below (note that you will need a glvis instance running on localhost:19916 to visualize the mesh):

#include "stroid/stroid.h"
int main() {
-
const fourdst::config::Config<stroid::config::MeshConfig> cfg;
+ + + +
-
const std::unique_ptr<mfem::Mesh> mesh = stroid::topology::BuildSkeleton(cfg);
- - - -
-
- +
auto mesh = stroid::GenerateMesh(cfg);
+
stroid::IO::SaveStroidMesh(mesh, "graded.stroid");
+
stroid::IO::ViewMesh(mesh, "Spheroidal Mesh", stroid::IO::VISUALIZATION_MODE::ELEMENT_ID, "localhost", 19916);
}
- - - -
void ViewMesh(mfem::Mesh &mesh, const std::string &title, VISUALIZATION_MODE mode, const std::string &vishost, int visport)
Stream a mesh to a running GLVis server for interactive viewing.
Definition mesh.cpp:25
-
@ BOUNDARY_ELEMENT_ID
Color boundary-adjacent elements by boundary attribute/ID.
Definition mesh.h:15
-
void PromoteToHighOrder(mfem::Mesh &mesh, const fourdst::config::Config< config::MeshConfig > &config)
Promote a mesh to high-order by attaching an H1 nodal finite element space.
Definition curvilinear.cpp:7
-
void Finalize(mfem::Mesh &mesh, const fourdst::config::Config< config::MeshConfig > &config)
Finalize topology, validate orientation, and apply uniform refinement.
Definition topology.cpp:90
-
void ProjectMesh(mfem::Mesh &mesh, const fourdst::config::Config< config::MeshConfig > &config)
Project high-order mesh nodes using the configured curvilinear mapping.
Definition curvilinear.cpp:13
-
std::unique_ptr< mfem::Mesh > BuildSkeleton(const fourdst::config::Config< config::MeshConfig > &config)
Build the initial multi-block mesh topology for the star model.
Definition topology.cpp:10
- -

-Funding

+
void ViewMesh(mfem::Mesh &mesh, const std::string &title, VISUALIZATION_MODE mode, const std::string &vishost, int visport, bool conforming_display=true)
Stream a mesh to a running GLVis server for interactive viewing.
Definition mesh.cpp:727
+
@ ELEMENT_ID
Color elements by their element attribute/ID.
Definition mesh.h:19
+ +
std::optional< int > refinement_levels
Stellar refinement depth, or uniform depth when vacuum overrides are absent.
Definition config.h:31
+
std::optional< int > vacuum_refinement_levels
Minimum refinement depth in the vacuum interior; unset inherits refinement_levels.
Definition config.h:41
+
std::optional< OptimizationMethods > optimization_methods
Definition config.h:145
+

+Example Meshes

+

An example mesh with the default configuration parameters is shown below (coloration indicates attribute IDs of different regions): Example Mesh

+

The legacy spherified core mapping strategy is shown below as well Example Spheried Mesh

+

An example of a non-conforming mesh generated with stroid. Note that the gaps between elements are a visualization artifact rather than true gaps within the mesh. Non Conforming Mesh

+

Note that both of these meshes are shown with 3 levels of refinement and polynomial order 3. Blue shows the core domain, yellow shows the envelope domain, while purple shows the vacuum domain.

+

+Funding

Stroid is developed as part of the 4D-STAR project.

4D-STAR is funded by European Research Council (ERC) under the Horizon Europe programme (Synergy Grant agreement No. 101071505: 4D-STAR) Work for this project is funded by the European Union. Views and opinions expressed are however those of the author(s) only and do not necessarily reflect those of the European Union or the European Research Council.

diff --git a/docs/html/mainpage_8md.html b/docs/html/mainpage_8md.html index cc97d16..3be20f5 100644 --- a/docs/html/mainpage_8md.html +++ b/docs/html/mainpage_8md.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
diff --git a/docs/html/mapping_8cpp.html b/docs/html/mapping_8cpp.html index 14d2b1c..fcc4e28 100644 --- a/docs/html/mapping_8cpp.html +++ b/docs/html/mapping_8cpp.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -108,19 +108,26 @@ $(function(){initNavTree('mapping_8cpp.html',''); initResizable(true); });
#include "stroid/topology/mapping.h"
+#include "stroid/exceptions/exceptions.h"
#include <cmath>
#include <algorithm>
+#include <array>
+#include <utility>
+#include <format>
+#include <string>
Include dependency graph for mapping.cpp:
-
+
+ +

Namespaces

namespace  stroid
 Public API surface for the stroid mesh generation library.
 
namespace  stroid::topology
 Topology construction and curvilinear mapping utilities.
 
+ + +

@@ -134,6 +141,9 @@ Functions

void stroid::topology::TransformPoint (mfem::Vector &pos, const fourdst::config::Config< config::MeshConfig > &config, int attribute_id)
 Map a point from the initial block topology to the curvilinear domain.
 
double stroid::topology::ComputeExteriorCoordinate (const mfem::Vector &logical_position, int attribute, const fourdst::config::Config< config::MeshConfig > &config)
 Compute the compactification coordinate for a point in the curvilinear domain. This ranges from 0-1 with 0 at the stellar surface and 1 at the compactified infinity.
 
diff --git a/docs/html/mapping_8cpp.js b/docs/html/mapping_8cpp.js index cc17306..9506f2f 100644 --- a/docs/html/mapping_8cpp.js +++ b/docs/html/mapping_8cpp.js @@ -2,5 +2,6 @@ var mapping_8cpp = [ [ "stroid::topology::ApplyEquiangular", "namespacestroid_1_1topology.html#a03f0b29ccf7d427a175de9ff75824b7c", null ], [ "stroid::topology::ApplySpheroidal", "namespacestroid_1_1topology.html#a7fbf58c40c03bc751d53f4a3273744fc", null ], + [ "stroid::topology::ComputeExteriorCoordinate", "namespacestroid_1_1topology.html#a11783fac833cd43c7c59d712912795a8", null ], [ "stroid::topology::TransformPoint", "namespacestroid_1_1topology.html#a394e33bdfafdaccd6edfaae0642d3456", null ] ]; \ No newline at end of file diff --git a/docs/html/mapping_8cpp__incl.map b/docs/html/mapping_8cpp__incl.map index b7e5516..d1bc94e 100644 --- a/docs/html/mapping_8cpp__incl.map +++ b/docs/html/mapping_8cpp__incl.map @@ -1,15 +1,38 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/mapping_8cpp__incl.md5 b/docs/html/mapping_8cpp__incl.md5 index 1f62239..568ab13 100644 --- a/docs/html/mapping_8cpp__incl.md5 +++ b/docs/html/mapping_8cpp__incl.md5 @@ -1 +1 @@ -4bdfcf54667cf17336f1a89bd11d9f51 \ No newline at end of file +092087a1dae722af355ed84c57a30031 \ No newline at end of file diff --git a/docs/html/mapping_8cpp__incl.svg b/docs/html/mapping_8cpp__incl.svg index 165eff4..3fed2b1 100644 --- a/docs/html/mapping_8cpp__incl.svg +++ b/docs/html/mapping_8cpp__incl.svg @@ -1,13 +1,12 @@ - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + src/lib/topology/mapping.cpp Node1 - -src/lib/topology/mapping.cpp + +src/lib/topology/mapping.cpp @@ -32,8 +68,8 @@ Node2 - -stroid/topology/mapping.h + +stroid/topology/mapping.h @@ -41,26 +77,8 @@ Node1->Node2 - - - - - - - -Node6 - - -cmath - - - - - -Node1->Node6 - - - + + @@ -68,17 +86,125 @@ Node7 - -algorithm + +string - + Node1->Node7 - - - + + + + + + + + +Node8 + + +format + + + + + +Node1->Node8 + + + + + + + + +Node11 + + +stroid/exceptions/exceptions.h + + + + + +Node1->Node11 + + + + + + + + +Node14 + + +cmath + + + + + +Node1->Node14 + + + + + + + + +Node15 + + +algorithm + + + + + +Node1->Node15 + + + + + + + + +Node16 + + +array + + + + + +Node1->Node16 + + + + + + + + +Node17 + + +utility + + + + + +Node1->Node17 + + + @@ -86,8 +212,8 @@ Node3 - -mfem.hpp + +mfem.hpp @@ -95,8 +221,8 @@ Node2->Node3 - - + + @@ -104,8 +230,8 @@ Node4 - -stroid/config/config.h + +stroid/config/config.h @@ -113,8 +239,26 @@ Node2->Node4 - - + + + + + + + +Node10 + + +fourdst/config/config.h + + + + + +Node2->Node10 + + + @@ -122,22 +266,143 @@ Node5 - -fourdst/config/config.h + +cstdint - - -Node2->Node5 - - - + + +Node4->Node5 + + + + + + + + +Node6 + + +optional + + + + + +Node4->Node6 + + + + + + + + +Node4->Node7 + + + + + + + + +Node4->Node8 + + + + + + + + +Node9 + + +sstream + + + + + +Node4->Node9 + + + + + + + + +Node12 + + +stroid/exceptions/stroid +_error.h + + + + + +Node11->Node12 + + + + + + + + +Node12->Node7 + + + + + + + + +Node13 + + +exception + + + + + +Node12->Node13 + + + + + + + + + + + + + + + + + + + + + Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -113,19 +113,21 @@ $(function(){initNavTree('mapping_8h.html',''); initResizable(true); });
Include dependency graph for mapping.h:
-
+
This graph shows which files directly or indirectly include this file:
-
+
+ +

Namespaces

namespace  stroid
 Public API surface for the stroid mesh generation library.
 
namespace  stroid::topology
 Topology construction and curvilinear mapping utilities.
 
+ + +

@@ -142,6 +144,9 @@ Functions

void stroid::topology::TransformPoint (mfem::Vector &pos, const fourdst::config::Config< config::MeshConfig > &config, int attribute_id)
 Map a point from the initial block topology to the curvilinear domain.
 
double stroid::topology::ComputeExteriorCoordinate (const mfem::Vector &logical_position, int attribute, const fourdst::config::Config< config::MeshConfig > &config)
 Compute the compactification coordinate for a point in the curvilinear domain. This ranges from 0-1 with 0 at the stellar surface and 1 at the compactified infinity.
 
diff --git a/docs/html/mapping_8h.js b/docs/html/mapping_8h.js index b37f73a..195d161 100644 --- a/docs/html/mapping_8h.js +++ b/docs/html/mapping_8h.js @@ -3,5 +3,6 @@ var mapping_8h = [ "stroid::topology::ApplyEquiangular", "namespacestroid_1_1topology.html#a03f0b29ccf7d427a175de9ff75824b7c", null ], [ "stroid::topology::ApplyKelvin", "namespacestroid_1_1topology.html#a59c54a10f726d323f8506b4a2edd7467", null ], [ "stroid::topology::ApplySpheroidal", "namespacestroid_1_1topology.html#a7fbf58c40c03bc751d53f4a3273744fc", null ], + [ "stroid::topology::ComputeExteriorCoordinate", "namespacestroid_1_1topology.html#a11783fac833cd43c7c59d712912795a8", null ], [ "stroid::topology::TransformPoint", "namespacestroid_1_1topology.html#a394e33bdfafdaccd6edfaae0642d3456", null ] ]; \ No newline at end of file diff --git a/docs/html/mapping_8h__dep__incl.map b/docs/html/mapping_8h__dep__incl.map index 0525b5a..6857ff7 100644 --- a/docs/html/mapping_8h__dep__incl.map +++ b/docs/html/mapping_8h__dep__incl.map @@ -1,7 +1,11 @@ - - - - - + + + + + + + + + diff --git a/docs/html/mapping_8h__dep__incl.md5 b/docs/html/mapping_8h__dep__incl.md5 index ff1680f..1854b4f 100644 --- a/docs/html/mapping_8h__dep__incl.md5 +++ b/docs/html/mapping_8h__dep__incl.md5 @@ -1 +1 @@ -f79ba543c56f1aac55d093e48f7a369f \ No newline at end of file +facb1c62b4a65ab75fd179bd1f334a7b \ No newline at end of file diff --git a/docs/html/mapping_8h__dep__incl.svg b/docs/html/mapping_8h__dep__incl.svg index af5d61e..7a5681d 100644 --- a/docs/html/mapping_8h__dep__incl.svg +++ b/docs/html/mapping_8h__dep__incl.svg @@ -1,11 +1,11 @@ - - + @@ -17,24 +17,25 @@ ]]> - + src/include/stroid/topology/mapping.h Node1 - -src/include/stroid -/topology/mapping.h + +src/include/stroid +/topology/mapping.h Node2 - - -src/lib/topology/curvilinear.cpp + + +src/include/stroid +/stroid.h @@ -42,26 +43,62 @@ Node1->Node2 - - + + + + + + + +Node4 + + +src/lib/topology/curvilinear.cpp + + + + + +Node1->Node4 + + + + + + + + +Node5 + + +src/lib/topology/mapping.cpp + + + + + +Node1->Node5 + + + Node3 - - -src/lib/topology/mapping.cpp + + +src/python/bindings.cpp - - -Node1->Node3 - - - + + +Node2->Node3 + + + diff --git a/docs/html/mapping_8h__dep__incl_org.svg b/docs/html/mapping_8h__dep__incl_org.svg index 50d3d12..e051e61 100644 --- a/docs/html/mapping_8h__dep__incl_org.svg +++ b/docs/html/mapping_8h__dep__incl_org.svg @@ -1,29 +1,30 @@ - - - + + src/include/stroid/topology/mapping.h Node1 - -src/include/stroid -/topology/mapping.h + +src/include/stroid +/topology/mapping.h Node2 - - -src/lib/topology/curvilinear.cpp + + +src/include/stroid +/stroid.h @@ -31,26 +32,62 @@ Node1->Node2 - - + + + + + + + +Node4 + + +src/lib/topology/curvilinear.cpp + + + + + +Node1->Node4 + + + + + + + + +Node5 + + +src/lib/topology/mapping.cpp + + + + + +Node1->Node5 + + + Node3 - - -src/lib/topology/mapping.cpp + + +src/python/bindings.cpp - - -Node1->Node3 - - - + + +Node2->Node3 + + + diff --git a/docs/html/mapping_8h__incl.map b/docs/html/mapping_8h__incl.map index 374b151..52f7890 100644 --- a/docs/html/mapping_8h__incl.map +++ b/docs/html/mapping_8h__incl.map @@ -1,9 +1,19 @@ - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/docs/html/mapping_8h__incl.md5 b/docs/html/mapping_8h__incl.md5 index 667d70f..e79a68c 100644 --- a/docs/html/mapping_8h__incl.md5 +++ b/docs/html/mapping_8h__incl.md5 @@ -1 +1 @@ -86a889bd4bc95c54b54525ea6b373586 \ No newline at end of file +553587845cda9842c6a499ea49f844e6 \ No newline at end of file diff --git a/docs/html/mapping_8h__incl.svg b/docs/html/mapping_8h__incl.svg index f2af59e..f87e47e 100644 --- a/docs/html/mapping_8h__incl.svg +++ b/docs/html/mapping_8h__incl.svg @@ -1,11 +1,11 @@ - - + @@ -17,15 +17,15 @@ ]]> - + src/include/stroid/topology/mapping.h Node1 - -src/include/stroid -/topology/mapping.h + +src/include/stroid +/topology/mapping.h @@ -33,8 +33,8 @@ Node2 - -mfem.hpp + +mfem.hpp @@ -42,8 +42,8 @@ Node1->Node2 - - + + @@ -51,8 +51,8 @@ Node3 - -stroid/config/config.h + +stroid/config/config.h @@ -60,8 +60,26 @@ Node1->Node3 - - + + + + + + + +Node9 + + +fourdst/config/config.h + + + + + +Node1->Node9 + + + @@ -69,17 +87,89 @@ Node4 - -fourdst/config/config.h + +cstdint - - -Node1->Node4 - - - + + +Node3->Node4 + + + + + + + + +Node5 + + +optional + + + + + +Node3->Node5 + + + + + + + + +Node6 + + +string + + + + + +Node3->Node6 + + + + + + + + +Node7 + + +format + + + + + +Node3->Node7 + + + + + + + + +Node8 + + +sstream + + + + + +Node3->Node8 + + + diff --git a/docs/html/mapping_8h__incl_org.svg b/docs/html/mapping_8h__incl_org.svg index 64bfccc..ba70926 100644 --- a/docs/html/mapping_8h__incl_org.svg +++ b/docs/html/mapping_8h__incl_org.svg @@ -1,20 +1,20 @@ - - - + + src/include/stroid/topology/mapping.h Node1 - -src/include/stroid -/topology/mapping.h + +src/include/stroid +/topology/mapping.h @@ -22,8 +22,8 @@ Node2 - -mfem.hpp + +mfem.hpp @@ -31,8 +31,8 @@ Node1->Node2 - - + + @@ -40,8 +40,8 @@ Node3 - -stroid/config/config.h + +stroid/config/config.h @@ -49,8 +49,26 @@ Node1->Node3 - - + + + + + + + +Node9 + + +fourdst/config/config.h + + + + + +Node1->Node9 + + + @@ -58,17 +76,89 @@ Node4 - -fourdst/config/config.h + +cstdint - - -Node1->Node4 - - - + + +Node3->Node4 + + + + + + + + +Node5 + + +optional + + + + + +Node3->Node5 + + + + + + + + +Node6 + + +string + + + + + +Node3->Node6 + + + + + + + + +Node7 + + +format + + + + + +Node3->Node7 + + + + + + + + +Node8 + + +sstream + + + + + +Node3->Node8 + + + diff --git a/docs/html/menudata.js b/docs/html/menudata.js index c2de7d0..17f865a 100644 --- a/docs/html/menudata.js +++ b/docs/html/menudata.js @@ -27,14 +27,98 @@ var menudata={children:[ {text:"Namespaces",url:"namespaces.html",children:[ {text:"Namespace List",url:"namespaces.html"}, {text:"Namespace Members",url:"namespacemembers.html",children:[ -{text:"All",url:"namespacemembers.html"}, -{text:"Functions",url:"namespacemembers_func.html"}, +{text:"All",url:"namespacemembers.html",children:[ +{text:"_",url:"namespacemembers.html#index__5F"}, +{text:"a",url:"namespacemembers.html#index_a"}, +{text:"b",url:"namespacemembers.html#index_b"}, +{text:"c",url:"namespacemembers.html#index_c"}, +{text:"e",url:"namespacemembers.html#index_e"}, +{text:"f",url:"namespacemembers.html#index_f"}, +{text:"g",url:"namespacemembers.html#index_g"}, +{text:"h",url:"namespacemembers.html#index_h"}, +{text:"l",url:"namespacemembers.html#index_l"}, +{text:"m",url:"namespacemembers.html#index_m"}, +{text:"o",url:"namespacemembers.html#index_o"}, +{text:"p",url:"namespacemembers.html#index_p"}, +{text:"r",url:"namespacemembers.html#index_r"}, +{text:"s",url:"namespacemembers.html#index_s"}, +{text:"t",url:"namespacemembers.html#index_t"}, +{text:"u",url:"namespacemembers.html#index_u"}, +{text:"v",url:"namespacemembers.html#index_v"}]}, +{text:"Functions",url:"namespacemembers_func.html",children:[ +{text:"a",url:"namespacemembers_func.html#index_a"}, +{text:"b",url:"namespacemembers_func.html#index_b"}, +{text:"c",url:"namespacemembers_func.html#index_c"}, +{text:"e",url:"namespacemembers_func.html#index_e"}, +{text:"f",url:"namespacemembers_func.html#index_f"}, +{text:"g",url:"namespacemembers_func.html#index_g"}, +{text:"h",url:"namespacemembers_func.html#index_h"}, +{text:"l",url:"namespacemembers_func.html#index_l"}, +{text:"m",url:"namespacemembers_func.html#index_m"}, +{text:"o",url:"namespacemembers_func.html#index_o"}, +{text:"p",url:"namespacemembers_func.html#index_p"}, +{text:"r",url:"namespacemembers_func.html#index_r"}, +{text:"s",url:"namespacemembers_func.html#index_s"}, +{text:"t",url:"namespacemembers_func.html#index_t"}, +{text:"u",url:"namespacemembers_func.html#index_u"}, +{text:"v",url:"namespacemembers_func.html#index_v"}]}, +{text:"Variables",url:"namespacemembers_vars.html"}, {text:"Enumerations",url:"namespacemembers_enum.html"}]}]}, {text:"Classes",url:"annotated.html",children:[ {text:"Class List",url:"annotated.html"}, {text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"inherits.html"}, {text:"Class Members",url:"functions.html",children:[ -{text:"All",url:"functions.html"}, -{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"All",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"b",url:"functions.html#index_b"}, +{text:"c",url:"functions.html#index_c"}, +{text:"d",url:"functions.html#index_d"}, +{text:"e",url:"functions.html#index_e"}, +{text:"f",url:"functions.html#index_f"}, +{text:"g",url:"functions.html#index_g"}, +{text:"h",url:"functions.html#index_h"}, +{text:"i",url:"functions.html#index_i"}, +{text:"j",url:"functions.html#index_j"}, +{text:"m",url:"functions.html#index_m"}, +{text:"n",url:"functions.html#index_n"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"v",url:"functions.html#index_v"}, +{text:"w",url:"functions.html#index_w"}, +{text:"x",url:"functions.html#index_x"}, +{text:"y",url:"functions.html#index_y"}, +{text:"z",url:"functions.html#index_z"}, +{text:"~",url:"functions.html#index__7E"}]}, +{text:"Functions",url:"functions_func.html"}, +{text:"Variables",url:"functions_vars.html",children:[ +{text:"a",url:"functions_vars.html#index_a"}, +{text:"b",url:"functions_vars.html#index_b"}, +{text:"c",url:"functions_vars.html#index_c"}, +{text:"d",url:"functions_vars.html#index_d"}, +{text:"e",url:"functions_vars.html#index_e"}, +{text:"f",url:"functions_vars.html#index_f"}, +{text:"g",url:"functions_vars.html#index_g"}, +{text:"h",url:"functions_vars.html#index_h"}, +{text:"i",url:"functions_vars.html#index_i"}, +{text:"j",url:"functions_vars.html#index_j"}, +{text:"m",url:"functions_vars.html#index_m"}, +{text:"n",url:"functions_vars.html#index_n"}, +{text:"o",url:"functions_vars.html#index_o"}, +{text:"p",url:"functions_vars.html#index_p"}, +{text:"r",url:"functions_vars.html#index_r"}, +{text:"s",url:"functions_vars.html#index_s"}, +{text:"t",url:"functions_vars.html#index_t"}, +{text:"v",url:"functions_vars.html#index_v"}, +{text:"w",url:"functions_vars.html#index_w"}, +{text:"x",url:"functions_vars.html#index_x"}, +{text:"y",url:"functions_vars.html#index_y"}, +{text:"z",url:"functions_vars.html#index_z"}]}]}]}, {text:"Files",url:"files.html",children:[ -{text:"File List",url:"files.html"}]}]} +{text:"File List",url:"files.html"}, +{text:"File Members",url:"globals.html",children:[ +{text:"All",url:"globals.html"}, +{text:"Functions",url:"globals_func.html"}]}]}]} diff --git a/docs/html/mesh_8cpp.html b/docs/html/mesh_8cpp.html index ef54686..7f4231e 100644 --- a/docs/html/mesh_8cpp.html +++ b/docs/html/mesh_8cpp.html @@ -31,7 +31,7 @@
Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -110,36 +110,72 @@ $(function(){initNavTree('mesh_8cpp.html',''); initResizable(true); });
#include "mfem.hpp"
#include "stroid/config/config.h"
#include "stroid/IO/mesh.h"
+#include "stroid/topology/curvilinear.h"
+#include <algorithm>
+#include <charconv>
+#include <cmath>
+#include "stroid/version.h"
#include <fstream>
+#include <iomanip>
#include <iostream>
#include <cstdint>
+#include <format>
+#include <chrono>
+#include <string>
+#include <string_view>
+#include <expected>
+#include <stdexcept>
+#include <concepts>
+#include <limits>
+#include <vector>
Include dependency graph for mesh.cpp:
-
+
+ +

Namespaces

namespace  stroid
 Public API surface for the stroid mesh generation library.
 
namespace  stroid::IO
 Mesh serialization and visualization helpers.
 
+ + + + + - - - - - - + + + + + + + + + + + + + + + + + + + +

Functions

void stroid::IO::SaveStroidMesh (const StroidMesh &mesh, const std::string &filename, const std::string &comment="")
 
void stroid::IO::SaveMesh (const mfem::Mesh &mesh, const std::string &filename)
 Save a mesh to MFEM's native .mesh format.
 
void stroid::IO::SaveMesh (const stroid::StroidMesh &mesh, const std::string &filename)
 Overload of SaveMesh which accepts a StroidMesh type and will internally unpack it.
 
void stroid::IO::SaveVTU (mfem::Mesh &mesh, const std::string &exportName)
 Save a mesh as a ParaView VTU dataset.
 
void stroid::IO::ViewMesh (mfem::Mesh &mesh, const std::string &title, VISUALIZATION_MODE mode, const std::string &vishost, int visport)
 Stream a mesh to a running GLVis server for interactive viewing.
 
void stroid::IO::VisualizeFaceValence (mfem::Mesh &mesh)
 Visualize boundary face valence (1=surface, 2=internal).
 
void stroid::IO::SaveVTU (const stroid::StroidMesh &mesh, const std::string &exportName)
 Overload of SaveVTU which accepts a StroidMesh type and will internally unpack it.
 
std::unique_ptr< mfem::Mesh > stroid::IO::MakeConformingVisualizationMesh (const mfem::Mesh &mesh)
 Make a display-only mesh copy with matching face subdivisions. This is purely for visualization and should not be used for any science goals.
 
void stroid::IO::ViewMesh (mfem::Mesh &mesh, const std::string &title, VISUALIZATION_MODE mode, const std::string &vishost, int visport, bool conforming_display=true)
 Stream a mesh to a running GLVis server for interactive viewing.
 
void stroid::IO::ViewMesh (const stroid::StroidMesh &mesh, const std::string &title, VISUALIZATION_MODE mode, const std::string &vishost, int visport, bool conforming_display=true)
 
void stroid::IO::VisualizeFaceValence (mfem::Mesh &mesh, const std::string &vishost, int visport, bool conforming_display=true)
 Color boundary-adjacent elements by face valence (1=surface, 2=internal). Untagged elements are zero; elements touching several tagged faces use the maximum valence. Values are computed before display subdivision.
 
void stroid::IO::VisualizeFaceValence (const stroid::StroidMesh &mesh, const std::string &vishost, int visport, bool conforming_display=true)
 
std::expected< StroidMesh, std::string > stroid::IO::ParseStroidMesh (std::istream &is)
 
std::expected< StroidMesh, std::string > stroid::IO::LoadStroidMesh (const std::string &filename)
 
diff --git a/docs/html/mesh_8cpp.js b/docs/html/mesh_8cpp.js index 988fa2f..4ba166b 100644 --- a/docs/html/mesh_8cpp.js +++ b/docs/html/mesh_8cpp.js @@ -1,7 +1,15 @@ var mesh_8cpp = [ + [ "stroid::IO::LoadStroidMesh", "namespacestroid_1_1_i_o.html#a3f39dc149d5650468b579c76d00f991d", null ], + [ "stroid::IO::MakeConformingVisualizationMesh", "namespacestroid_1_1_i_o.html#a7426b1e664be45cbf791167748d4feb8", null ], + [ "stroid::IO::ParseStroidMesh", "namespacestroid_1_1_i_o.html#a20ae517986b9c27d23ef5f0ab704b247", null ], [ "stroid::IO::SaveMesh", "namespacestroid_1_1_i_o.html#aeb567ddc70ff2d064c139dee87575830", null ], + [ "stroid::IO::SaveMesh", "namespacestroid_1_1_i_o.html#ad7721ff3eda0ad42365955ea33da2b0a", null ], + [ "stroid::IO::SaveStroidMesh", "namespacestroid_1_1_i_o.html#ab854167b428c1a77597d9bb3a972b363", null ], + [ "stroid::IO::SaveVTU", "namespacestroid_1_1_i_o.html#ae0fc8e0663da26ff11be71fb1b5a0b0e", null ], [ "stroid::IO::SaveVTU", "namespacestroid_1_1_i_o.html#ab4c8bda7ab370e34376a7832fbf0951e", null ], - [ "stroid::IO::ViewMesh", "namespacestroid_1_1_i_o.html#a496f5c16eaffda5922a0b96c1f525dab", null ], - [ "stroid::IO::VisualizeFaceValence", "namespacestroid_1_1_i_o.html#a8100e130b3a49fdee48bc3c4d4e63963", null ] + [ "stroid::IO::ViewMesh", "namespacestroid_1_1_i_o.html#a6491a99d6d2859b2c098b94f2f8171d3", null ], + [ "stroid::IO::ViewMesh", "namespacestroid_1_1_i_o.html#a7bc6daa0f9ef8327355022363e1db3fb", null ], + [ "stroid::IO::VisualizeFaceValence", "namespacestroid_1_1_i_o.html#a26155a525b34257a3eb2305e477b6bef", null ], + [ "stroid::IO::VisualizeFaceValence", "namespacestroid_1_1_i_o.html#a516d260163e0b6ac000b301b0b8cf4bb", null ] ]; \ No newline at end of file diff --git a/docs/html/mesh_8cpp__incl.map b/docs/html/mesh_8cpp__incl.map index c24f84f..1a750ac 100644 --- a/docs/html/mesh_8cpp__incl.map +++ b/docs/html/mesh_8cpp__incl.map @@ -1,18 +1,75 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/mesh_8cpp__incl.md5 b/docs/html/mesh_8cpp__incl.md5 index f7498e7..4a41229 100644 --- a/docs/html/mesh_8cpp__incl.md5 +++ b/docs/html/mesh_8cpp__incl.md5 @@ -1 +1 @@ -03de2118e8632a757bd4ee512ec2bd8a \ No newline at end of file +4c8fb452f93258fec2fa9334656fc635 \ No newline at end of file diff --git a/docs/html/mesh_8cpp__incl.svg b/docs/html/mesh_8cpp__incl.svg index db9c517..52ac683 100644 --- a/docs/html/mesh_8cpp__incl.svg +++ b/docs/html/mesh_8cpp__incl.svg @@ -1,13 +1,12 @@ - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + src/lib/IO/mesh.cpp Node1 - -src/lib/IO/mesh.cpp + +src/lib/IO/mesh.cpp @@ -32,8 +68,8 @@ Node2 - -mfem.hpp + +mfem.hpp @@ -41,8 +77,8 @@ Node1->Node2 - - + + @@ -50,8 +86,8 @@ Node3 - -stroid/config/config.h + +stroid/config/config.h @@ -59,26 +95,26 @@ Node1->Node3 - - + + Node4 - - -stroid/IO/mesh.h + + +cstdint - + Node1->Node4 - - - + + + @@ -86,17 +122,17 @@ Node6 - -fstream + +string - + Node1->Node6 - - - + + + @@ -104,44 +140,314 @@ Node7 - -iostream + +format - + Node1->Node7 - - - + + + - - -Node8 - - -cstdint + + +Node9 + + +stroid/IO/mesh.h - - -Node1->Node8 - - - + + +Node1->Node9 + + + - - -Node4->Node2 - - - + + +Node10 + + +expected + + + + + +Node1->Node10 + + + + + + + + +Node16 + + +stroid/topology/curvilinear.h + + + + + +Node1->Node16 + + + + + + + + +Node18 + + +algorithm + + + + + +Node1->Node18 + + + + + + + + +Node19 + + +charconv + + + + + +Node1->Node19 + + + + + + + + +Node20 + + +cmath + + + + + +Node1->Node20 + + + + + + + + +Node21 + + +stroid/version.h + + + + + +Node1->Node21 + + + + + + + + +Node22 + + +fstream + + + + + +Node1->Node22 + + + + + + + + +Node23 + + +iomanip + + + + + +Node1->Node23 + + + + + + + + +Node24 + + +iostream + + + + + +Node1->Node24 + + + + + + + + +Node25 + + +chrono + + + + + +Node1->Node25 + + + + + + + + +Node26 + + +string_view + + + + + +Node1->Node26 + + + + + + + + +Node27 + + +stdexcept + + + + + +Node1->Node27 + + + + + + + + +Node28 + + +concepts + + + + + +Node1->Node28 + + + + + + + + +Node29 + + +limits + + + + + +Node1->Node29 + + + + + + + + +Node30 + + +vector + + + + + +Node1->Node30 + + + + + + + + +Node3->Node4 + + + @@ -149,22 +455,286 @@ Node5 - -string + +optional - - -Node4->Node5 - - - + + +Node3->Node5 + + + + + + + + +Node3->Node6 + + + + + + + + +Node3->Node7 + + + + + + + + +Node8 + + +sstream + + + + + +Node3->Node8 + + + + + + + + +Node9->Node2 + + + + + + + + +Node9->Node6 + + + + + + + + +Node9->Node10 + + + + + + + + +Node11 + + +istream + + + + + +Node9->Node11 + + + + + + + + +Node12 + + +memory + + + + + +Node9->Node12 + + + + + + + + +Node13 + + +stroid/utils/types.h + + + + + +Node9->Node13 + + + + + + + + +Node13->Node2 + + + + + + + + +Node13->Node3 + + + + + + + + +Node13->Node6 + + + + + + + + +Node13->Node10 + + + + + + + + +Node13->Node12 + + + + + + + + +Node14 + + +unordered_map + + + + + +Node13->Node14 + + + + + + + + +Node15 + + +variant + + + + + +Node13->Node15 + + + + + + + + +Node16->Node2 + + + + + + + + +Node16->Node3 + + + + + + + + +Node16->Node13 + + + + + + + + +Node17 + + +fourdst/config/config.h + + + + + +Node16->Node17 + + + + + + + + + + + + + + + + + + + + + Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -109,23 +109,29 @@ $(function(){initNavTree('mesh_8h.html',''); initResizable(true); });
#include <string>
+#include <expected>
+#include <istream>
+#include <memory>
#include "mfem.hpp"
+#include "stroid/utils/types.h"
Include dependency graph for mesh.h:
-
+
This graph shows which files directly or indirectly include this file:
-
+
+ +

Namespaces

namespace  stroid
 Public API surface for the stroid mesh generation library.
 
namespace  stroid::IO
 Mesh serialization and visualization helpers.
 

@@ -139,18 +145,37 @@ Enumerations

+ + + + + - - - - - - + + + + + + + + + + + + + + + + + + + +

Functions

void stroid::IO::SaveStroidMesh (const StroidMesh &mesh, const std::string &filename, const std::string &comment="")
 
void stroid::IO::SaveMesh (const mfem::Mesh &mesh, const std::string &filename)
 Save a mesh to MFEM's native .mesh format.
 
void stroid::IO::SaveMesh (const stroid::StroidMesh &mesh, const std::string &filename)
 Overload of SaveMesh which accepts a StroidMesh type and will internally unpack it.
 
void stroid::IO::SaveVTU (mfem::Mesh &mesh, const std::string &exportName)
 Save a mesh as a ParaView VTU dataset.
 
void stroid::IO::ViewMesh (mfem::Mesh &mesh, const std::string &title, VISUALIZATION_MODE mode, const std::string &vishost, int visport)
 Stream a mesh to a running GLVis server for interactive viewing.
 
void stroid::IO::VisualizeFaceValence (mfem::Mesh &mesh)
 Visualize boundary face valence (1=surface, 2=internal).
 
void stroid::IO::SaveVTU (const stroid::StroidMesh &mesh, const std::string &exportName)
 Overload of SaveVTU which accepts a StroidMesh type and will internally unpack it.
 
std::unique_ptr< mfem::Mesh > stroid::IO::MakeConformingVisualizationMesh (const mfem::Mesh &mesh)
 Make a display-only mesh copy with matching face subdivisions. This is purely for visualization and should not be used for any science goals.
 
void stroid::IO::ViewMesh (mfem::Mesh &mesh, const std::string &title, VISUALIZATION_MODE mode, const std::string &vishost, int visport, bool conforming_display=true)
 Stream a mesh to a running GLVis server for interactive viewing.
 
void stroid::IO::ViewMesh (const stroid::StroidMesh &mesh, const std::string &title, VISUALIZATION_MODE mode, const std::string &vishost, int visport, bool conforming_display=true)
 
void stroid::IO::VisualizeFaceValence (mfem::Mesh &mesh, const std::string &vishost, int visport, bool conforming_display=true)
 Color boundary-adjacent elements by face valence (1=surface, 2=internal). Untagged elements are zero; elements touching several tagged faces use the maximum valence. Values are computed before display subdivision.
 
void stroid::IO::VisualizeFaceValence (const stroid::StroidMesh &mesh, const std::string &vishost, int visport, bool conforming_display=true)
 
std::expected< StroidMesh, std::string > stroid::IO::ParseStroidMesh (std::istream &is)
 
std::expected< StroidMesh, std::string > stroid::IO::LoadStroidMesh (const std::string &filename)
 
diff --git a/docs/html/mesh_8h.js b/docs/html/mesh_8h.js index 753b3a9..f6d5f19 100644 --- a/docs/html/mesh_8h.js +++ b/docs/html/mesh_8h.js @@ -5,8 +5,16 @@ var mesh_8h = [ "stroid::IO::VISUALIZATION_MODE::ELEMENT_ID", "namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eac31a2fe3e97d218a154c1947b43d6bbf", null ], [ "stroid::IO::VISUALIZATION_MODE::BOUNDARY_ELEMENT_ID", "namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eaee96e14c2b71bd59252006289ba464cf", null ] ] ], + [ "stroid::IO::LoadStroidMesh", "namespacestroid_1_1_i_o.html#a3f39dc149d5650468b579c76d00f991d", null ], + [ "stroid::IO::MakeConformingVisualizationMesh", "namespacestroid_1_1_i_o.html#a7426b1e664be45cbf791167748d4feb8", null ], + [ "stroid::IO::ParseStroidMesh", "namespacestroid_1_1_i_o.html#a20ae517986b9c27d23ef5f0ab704b247", null ], [ "stroid::IO::SaveMesh", "namespacestroid_1_1_i_o.html#aeb567ddc70ff2d064c139dee87575830", null ], + [ "stroid::IO::SaveMesh", "namespacestroid_1_1_i_o.html#ad7721ff3eda0ad42365955ea33da2b0a", null ], + [ "stroid::IO::SaveStroidMesh", "namespacestroid_1_1_i_o.html#ab854167b428c1a77597d9bb3a972b363", null ], + [ "stroid::IO::SaveVTU", "namespacestroid_1_1_i_o.html#ae0fc8e0663da26ff11be71fb1b5a0b0e", null ], [ "stroid::IO::SaveVTU", "namespacestroid_1_1_i_o.html#ab4c8bda7ab370e34376a7832fbf0951e", null ], - [ "stroid::IO::ViewMesh", "namespacestroid_1_1_i_o.html#a496f5c16eaffda5922a0b96c1f525dab", null ], - [ "stroid::IO::VisualizeFaceValence", "namespacestroid_1_1_i_o.html#a8100e130b3a49fdee48bc3c4d4e63963", null ] + [ "stroid::IO::ViewMesh", "namespacestroid_1_1_i_o.html#a6491a99d6d2859b2c098b94f2f8171d3", null ], + [ "stroid::IO::ViewMesh", "namespacestroid_1_1_i_o.html#a7bc6daa0f9ef8327355022363e1db3fb", null ], + [ "stroid::IO::VisualizeFaceValence", "namespacestroid_1_1_i_o.html#a26155a525b34257a3eb2305e477b6bef", null ], + [ "stroid::IO::VisualizeFaceValence", "namespacestroid_1_1_i_o.html#a516d260163e0b6ac000b301b0b8cf4bb", null ] ]; \ No newline at end of file diff --git a/docs/html/mesh_8h__dep__incl.map b/docs/html/mesh_8h__dep__incl.map index 7125699..b0499ec 100644 --- a/docs/html/mesh_8h__dep__incl.map +++ b/docs/html/mesh_8h__dep__incl.map @@ -1,5 +1,11 @@ - - - + + + + + + + + + diff --git a/docs/html/mesh_8h__dep__incl.md5 b/docs/html/mesh_8h__dep__incl.md5 index 25a3d37..3164488 100644 --- a/docs/html/mesh_8h__dep__incl.md5 +++ b/docs/html/mesh_8h__dep__incl.md5 @@ -1 +1 @@ -f9dd1f1f0ada45c031664e05baeddedf \ No newline at end of file +5829ce8728a6f5b491dd3d16a51c427e \ No newline at end of file diff --git a/docs/html/mesh_8h__dep__incl.svg b/docs/html/mesh_8h__dep__incl.svg index 7c9d524..937de65 100644 --- a/docs/html/mesh_8h__dep__incl.svg +++ b/docs/html/mesh_8h__dep__incl.svg @@ -1,11 +1,11 @@ - - + @@ -17,24 +17,25 @@ ]]> - + src/include/stroid/IO/mesh.h Node1 - -src/include/stroid -/IO/mesh.h + +src/include/stroid +/IO/mesh.h Node2 - - -src/lib/IO/mesh.cpp + + +src/include/stroid +/stroid.h @@ -42,8 +43,62 @@ Node1->Node2 - - + + + + + + + +Node4 + + +src/lib/IO/mesh.cpp + + + + + +Node1->Node4 + + + + + + + + +Node5 + + +src/python/IO/bindings.cpp + + + + + +Node1->Node5 + + + + + + + + +Node3 + + +src/python/bindings.cpp + + + + + +Node2->Node3 + + + diff --git a/docs/html/mesh_8h__dep__incl_org.svg b/docs/html/mesh_8h__dep__incl_org.svg index dc8b185..0b9574a 100644 --- a/docs/html/mesh_8h__dep__incl_org.svg +++ b/docs/html/mesh_8h__dep__incl_org.svg @@ -1,29 +1,30 @@ - - - + + src/include/stroid/IO/mesh.h Node1 - -src/include/stroid -/IO/mesh.h + +src/include/stroid +/IO/mesh.h Node2 - - -src/lib/IO/mesh.cpp + + +src/include/stroid +/stroid.h @@ -31,8 +32,62 @@ Node1->Node2 - - + + + + + + + +Node4 + + +src/lib/IO/mesh.cpp + + + + + +Node1->Node4 + + + + + + + + +Node5 + + +src/python/IO/bindings.cpp + + + + + +Node1->Node5 + + + + + + + + +Node3 + + +src/python/bindings.cpp + + + + + +Node2->Node3 + + + diff --git a/docs/html/mesh_8h__incl.map b/docs/html/mesh_8h__incl.map index e1680a4..bcd278f 100644 --- a/docs/html/mesh_8h__incl.map +++ b/docs/html/mesh_8h__incl.map @@ -1,7 +1,34 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/mesh_8h__incl.md5 b/docs/html/mesh_8h__incl.md5 index 98ab67d..9d0a1d4 100644 --- a/docs/html/mesh_8h__incl.md5 +++ b/docs/html/mesh_8h__incl.md5 @@ -1 +1 @@ -afe9d66dd2a249678e38f4e7d21fa29a \ No newline at end of file +2510757cb4a4bbfdbb3fee3f69185998 \ No newline at end of file diff --git a/docs/html/mesh_8h__incl.svg b/docs/html/mesh_8h__incl.svg index 1cf7f78..77bf712 100644 --- a/docs/html/mesh_8h__incl.svg +++ b/docs/html/mesh_8h__incl.svg @@ -1,13 +1,12 @@ - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + src/include/stroid/IO/mesh.h Node1 - -src/include/stroid -/IO/mesh.h + +src/include/stroid +/IO/mesh.h @@ -33,8 +69,8 @@ Node2 - -string + +string @@ -42,8 +78,8 @@ Node1->Node2 - - + + @@ -51,8 +87,8 @@ Node3 - -mfem.hpp + +expected @@ -60,13 +96,277 @@ Node1->Node3 - - + + + + + + + +Node4 + + +istream + + + + + +Node1->Node4 + + + + + + + + +Node5 + + +memory + + + + + +Node1->Node5 + + + + + + + + +Node6 + + +mfem.hpp + + + + + +Node1->Node6 + + + + + + + + +Node7 + + +stroid/utils/types.h + + + + + +Node1->Node7 + + + + + + + + +Node7->Node2 + + + + + + + + +Node7->Node3 + + + + + + + + +Node7->Node5 + + + + + + + + +Node7->Node6 + + + + + + + + +Node8 + + +stroid/config/config.h + + + + + +Node7->Node8 + + + + + + + + +Node13 + + +unordered_map + + + + + +Node7->Node13 + + + + + + + + +Node14 + + +variant + + + + + +Node7->Node14 + + + + + + + + +Node8->Node2 + + + + + + + + +Node9 + + +cstdint + + + + + +Node8->Node9 + + + + + + + + +Node10 + + +optional + + + + + +Node8->Node10 + + + + + + + + +Node11 + + +format + + + + + +Node8->Node11 + + + + + + + + +Node12 + + +sstream + + + + + +Node8->Node12 + + + + + + + + + + + + + + + + + + + + + Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -110,17 +110,20 @@ $(function(){initNavTree('mesh__utils_8cpp.html',''); initResizable(true); });
#include "stroid/utils/mesh_utils.h"
#include "mfem.hpp"
#include <print>
+#include "stroid/topology/curvilinear.h"
Include dependency graph for mesh_utils.cpp:
-
+
+ +

Namespaces

namespace  stroid
 Public API surface for the stroid mesh generation library.
 
namespace  stroid::utils
 Mesh inspection and validation utilities.
 
+ + + +

@@ -131,6 +134,10 @@ Functions

void stroid::utils::MarkFlippedBoundaryElements (mfem::Mesh &mesh)
 Mark boundary elements whose outward normal orientation is flipped.
 
void stroid::utils::ExportJacobianRadialProfile (mfem::Mesh &mesh, const std::string &filename)
 
std::unique_ptr< mfem::Mesh > stroid::utils::BuildProjected (const mfem::Mesh &reference, const fourdst::config::Config< config::MeshConfig > &cfg)
 
diff --git a/docs/html/mesh__utils_8cpp.js b/docs/html/mesh__utils_8cpp.js index 186562e..ed28038 100644 --- a/docs/html/mesh__utils_8cpp.js +++ b/docs/html/mesh__utils_8cpp.js @@ -1,5 +1,7 @@ var mesh__utils_8cpp = [ + [ "stroid::utils::BuildProjected", "namespacestroid_1_1utils.html#aa81cc28e65c9208a29a6aa9c51ba5126", null ], + [ "stroid::utils::ExportJacobianRadialProfile", "namespacestroid_1_1utils.html#ad6d849312ba094bda29ab3adf2326435", null ], [ "stroid::utils::MarkFlippedBoundaryElements", "namespacestroid_1_1utils.html#ae047d97d7d5dc12812395909d00f5bbe", null ], [ "stroid::utils::MarkFlippedElements", "namespacestroid_1_1utils.html#a22ab5809195bf85156607790f82b5e2d", null ] ]; \ No newline at end of file diff --git a/docs/html/mesh__utils_8cpp__incl.map b/docs/html/mesh__utils_8cpp__incl.map index 01b61b8..fd185c0 100644 --- a/docs/html/mesh__utils_8cpp__incl.map +++ b/docs/html/mesh__utils_8cpp__incl.map @@ -1,10 +1,42 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/mesh__utils_8cpp__incl.md5 b/docs/html/mesh__utils_8cpp__incl.md5 index 3f3f4cf..80bf544 100644 --- a/docs/html/mesh__utils_8cpp__incl.md5 +++ b/docs/html/mesh__utils_8cpp__incl.md5 @@ -1 +1 @@ -3355a8c256060a80ee8565f88e54695e \ No newline at end of file +f7231ddb4b0d9cab599c490ef9c0c904 \ No newline at end of file diff --git a/docs/html/mesh__utils_8cpp__incl.svg b/docs/html/mesh__utils_8cpp__incl.svg index 7dfb5a9..7581352 100644 --- a/docs/html/mesh__utils_8cpp__incl.svg +++ b/docs/html/mesh__utils_8cpp__incl.svg @@ -1,13 +1,12 @@ - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + src/lib/utils/mesh_utils.cpp Node1 - -src/lib/utils/mesh -_utils.cpp + +src/lib/utils/mesh +_utils.cpp @@ -33,8 +69,8 @@ Node2 - -stroid/utils/mesh_utils.h + +stroid/utils/mesh_utils.h @@ -42,8 +78,8 @@ Node1->Node2 - - + + @@ -51,35 +87,53 @@ Node3 - -mfem.hpp + +mfem.hpp - + Node1->Node3 - - - + + + - - -Node4 - - -print + + +Node11 + + +print - - -Node1->Node4 - - - + + +Node1->Node11 + + + + + + + + +Node12 + + +stroid/topology/curvilinear.h + + + + + +Node1->Node12 + + + @@ -87,13 +141,304 @@ Node2->Node3 - - + + + + + + + +Node4 + + +stroid/config/config.h + + + + + +Node2->Node4 + + + + + + + + +Node10 + + +fourdst/config/config.h + + + + + +Node2->Node10 + + + + + + + + +Node5 + + +cstdint + + + + + +Node4->Node5 + + + + + + + + +Node6 + + +optional + + + + + +Node4->Node6 + + + + + + + + +Node7 + + +string + + + + + +Node4->Node7 + + + + + + + + +Node8 + + +format + + + + + +Node4->Node8 + + + + + + + + +Node9 + + +sstream + + + + + +Node4->Node9 + + + + + + + + +Node12->Node3 + + + + + + + + +Node12->Node4 + + + + + + + + +Node12->Node10 + + + + + + + + +Node13 + + +stroid/utils/types.h + + + + + +Node12->Node13 + + + + + + + + +Node13->Node3 + + + + + + + + +Node13->Node4 + + + + + + + + +Node13->Node7 + + + + + + + + +Node14 + + +memory + + + + + +Node13->Node14 + + + + + + + + +Node15 + + +expected + + + + + +Node13->Node15 + + + + + + + + +Node16 + + +unordered_map + + + + + +Node13->Node16 + + + + + + + + +Node17 + + +variant + + + + + +Node13->Node17 + + + + + + + + + + + + + + + + + + + + + Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -108,22 +108,26 @@ $(function(){initNavTree('mesh__utils_8h.html',''); initResizable(true); });
#include "mfem.hpp"
+#include "stroid/config/config.h"
+#include "fourdst/config/config.h"
Include dependency graph for mesh_utils.h:
-
+
This graph shows which files directly or indirectly include this file:
-
+
+ +

Namespaces

namespace  stroid
 Public API surface for the stroid mesh generation library.
 
namespace  stroid::utils
 Mesh inspection and validation utilities.
 
+ + + +

@@ -134,6 +138,10 @@ Functions

void stroid::utils::MarkFlippedBoundaryElements (mfem::Mesh &mesh)
 Mark boundary elements whose outward normal orientation is flipped.
 
void stroid::utils::ExportJacobianRadialProfile (mfem::Mesh &mesh, const std::string &filename)
 
std::unique_ptr< mfem::Mesh > stroid::utils::BuildProjected (const mfem::Mesh &reference, const fourdst::config::Config< config::MeshConfig > &cfg)
 
diff --git a/docs/html/mesh__utils_8h.js b/docs/html/mesh__utils_8h.js index 6798f3a..ad9b29f 100644 --- a/docs/html/mesh__utils_8h.js +++ b/docs/html/mesh__utils_8h.js @@ -1,5 +1,7 @@ var mesh__utils_8h = [ + [ "stroid::utils::BuildProjected", "namespacestroid_1_1utils.html#aa81cc28e65c9208a29a6aa9c51ba5126", null ], + [ "stroid::utils::ExportJacobianRadialProfile", "namespacestroid_1_1utils.html#ad6d849312ba094bda29ab3adf2326435", null ], [ "stroid::utils::MarkFlippedBoundaryElements", "namespacestroid_1_1utils.html#ae047d97d7d5dc12812395909d00f5bbe", null ], [ "stroid::utils::MarkFlippedElements", "namespacestroid_1_1utils.html#a22ab5809195bf85156607790f82b5e2d", null ] ]; \ No newline at end of file diff --git a/docs/html/mesh__utils_8h__dep__incl.map b/docs/html/mesh__utils_8h__dep__incl.map index 3d3268c..958fc3d 100644 --- a/docs/html/mesh__utils_8h__dep__incl.map +++ b/docs/html/mesh__utils_8h__dep__incl.map @@ -1,5 +1,13 @@ - - - + + + + + + + + + + + diff --git a/docs/html/mesh__utils_8h__dep__incl.md5 b/docs/html/mesh__utils_8h__dep__incl.md5 index 7f3510c..be71e69 100644 --- a/docs/html/mesh__utils_8h__dep__incl.md5 +++ b/docs/html/mesh__utils_8h__dep__incl.md5 @@ -1 +1 @@ -de670fa6b2670745aee89477f345c4fe \ No newline at end of file +5b02785045c4a578e29c4f2fdccb5e16 \ No newline at end of file diff --git a/docs/html/mesh__utils_8h__dep__incl.svg b/docs/html/mesh__utils_8h__dep__incl.svg index 0a4ab07..31a69ac 100644 --- a/docs/html/mesh__utils_8h__dep__incl.svg +++ b/docs/html/mesh__utils_8h__dep__incl.svg @@ -1,11 +1,11 @@ - - + @@ -17,25 +17,25 @@ ]]> - + src/include/stroid/utils/mesh_utils.h Node1 - -src/include/stroid -/utils/mesh_utils.h + +src/include/stroid +/utils/mesh_utils.h Node2 - - -src/lib/utils/mesh -_utils.cpp + + +src/include/stroid +/stroid.h @@ -43,8 +43,82 @@ Node1->Node2 - - + + + + + + + +Node4 + + +src/lib/refinement +/uniform.cpp + + + + + +Node1->Node4 + + + + + + + + +Node5 + + +src/lib/utils/mesh +_utils.cpp + + + + + +Node1->Node5 + + + + + + + + +Node6 + + +src/python/utils/bindings.cpp + + + + + +Node1->Node6 + + + + + + + + +Node3 + + +src/python/bindings.cpp + + + + + +Node2->Node3 + + + diff --git a/docs/html/mesh__utils_8h__dep__incl_org.svg b/docs/html/mesh__utils_8h__dep__incl_org.svg index 4b6ab3f..19a50be 100644 --- a/docs/html/mesh__utils_8h__dep__incl_org.svg +++ b/docs/html/mesh__utils_8h__dep__incl_org.svg @@ -1,30 +1,30 @@ - - - + + src/include/stroid/utils/mesh_utils.h Node1 - -src/include/stroid -/utils/mesh_utils.h + +src/include/stroid +/utils/mesh_utils.h Node2 - - -src/lib/utils/mesh -_utils.cpp + + +src/include/stroid +/stroid.h @@ -32,8 +32,82 @@ Node1->Node2 - - + + + + + + + +Node4 + + +src/lib/refinement +/uniform.cpp + + + + + +Node1->Node4 + + + + + + + + +Node5 + + +src/lib/utils/mesh +_utils.cpp + + + + + +Node1->Node5 + + + + + + + + +Node6 + + +src/python/utils/bindings.cpp + + + + + +Node1->Node6 + + + + + + + + +Node3 + + +src/python/bindings.cpp + + + + + +Node2->Node3 + + + diff --git a/docs/html/mesh__utils_8h__incl.map b/docs/html/mesh__utils_8h__incl.map index 1c9072c..ab5fcf2 100644 --- a/docs/html/mesh__utils_8h__incl.map +++ b/docs/html/mesh__utils_8h__incl.map @@ -1,5 +1,19 @@ - - - + + + + + + + + + + + + + + + + + diff --git a/docs/html/mesh__utils_8h__incl.md5 b/docs/html/mesh__utils_8h__incl.md5 index 485602c..c4acdd5 100644 --- a/docs/html/mesh__utils_8h__incl.md5 +++ b/docs/html/mesh__utils_8h__incl.md5 @@ -1 +1 @@ -9b2d93b00a4338b84ba80d223a34ed2c \ No newline at end of file +93c2497072092c94a6d4ef789a7d4740 \ No newline at end of file diff --git a/docs/html/mesh__utils_8h__incl.svg b/docs/html/mesh__utils_8h__incl.svg index 77753d3..e1e2cfc 100644 --- a/docs/html/mesh__utils_8h__incl.svg +++ b/docs/html/mesh__utils_8h__incl.svg @@ -1,11 +1,11 @@ - - + @@ -17,15 +17,15 @@ ]]> - + src/include/stroid/utils/mesh_utils.h Node1 - -src/include/stroid -/utils/mesh_utils.h + +src/include/stroid +/utils/mesh_utils.h @@ -33,8 +33,8 @@ Node2 - -mfem.hpp + +mfem.hpp @@ -42,8 +42,134 @@ Node1->Node2 - - + + + + + + + +Node3 + + +stroid/config/config.h + + + + + +Node1->Node3 + + + + + + + + +Node9 + + +fourdst/config/config.h + + + + + +Node1->Node9 + + + + + + + + +Node4 + + +cstdint + + + + + +Node3->Node4 + + + + + + + + +Node5 + + +optional + + + + + +Node3->Node5 + + + + + + + + +Node6 + + +string + + + + + +Node3->Node6 + + + + + + + + +Node7 + + +format + + + + + +Node3->Node7 + + + + + + + + +Node8 + + +sstream + + + + + +Node3->Node8 + + + diff --git a/docs/html/mesh__utils_8h__incl_org.svg b/docs/html/mesh__utils_8h__incl_org.svg index 94d93a8..eee6290 100644 --- a/docs/html/mesh__utils_8h__incl_org.svg +++ b/docs/html/mesh__utils_8h__incl_org.svg @@ -1,20 +1,20 @@ - - - + + src/include/stroid/utils/mesh_utils.h Node1 - -src/include/stroid -/utils/mesh_utils.h + +src/include/stroid +/utils/mesh_utils.h @@ -22,8 +22,8 @@ Node2 - -mfem.hpp + +mfem.hpp @@ -31,8 +31,134 @@ Node1->Node2 - - + + + + + + + +Node3 + + +stroid/config/config.h + + + + + +Node1->Node3 + + + + + + + + +Node9 + + +fourdst/config/config.h + + + + + +Node1->Node9 + + + + + + + + +Node4 + + +cstdint + + + + + +Node3->Node4 + + + + + + + + +Node5 + + +optional + + + + + +Node3->Node5 + + + + + + + + +Node6 + + +string + + + + + +Node3->Node6 + + + + + + + + +Node7 + + +format + + + + + +Node3->Node7 + + + + + + + + +Node8 + + +sstream + + + + + +Node3->Node8 + + + diff --git a/docs/html/namespacemembers.html b/docs/html/namespacemembers.html index ad6733a..1313b8f 100644 --- a/docs/html/namespacemembers.html +++ b/docs/html/namespacemembers.html @@ -31,7 +31,7 @@
Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -101,22 +101,122 @@ $(function(){initNavTree('namespacemembers.html',''); initResizable(true); });
-
Here is a list of all namespace members with links to the namespace documentation for each member:
diff --git a/docs/html/namespacemembers_enum.html b/docs/html/namespacemembers_enum.html index c368897..16dce2a 100644 --- a/docs/html/namespacemembers_enum.html +++ b/docs/html/namespacemembers_enum.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -102,6 +102,8 @@ $(function(){initNavTree('namespacemembers_enum.html',''); initResizable(true);
Here is a list of all namespace enums with links to the namespace documentation for each enum:
diff --git a/docs/html/namespacemembers_func.html b/docs/html/namespacemembers_func.html index e13e3c7..ec6af37 100644 --- a/docs/html/namespacemembers_func.html +++ b/docs/html/namespacemembers_func.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -101,21 +101,104 @@ $(function(){initNavTree('namespacemembers_func.html',''); initResizable(true);
-
Here is a list of all namespace functions with links to the namespace documentation for each function:
diff --git a/docs/html/namespaces.html b/docs/html/namespaces.html index b5b39de..e82922b 100644 --- a/docs/html/namespaces.html +++ b/docs/html/namespaces.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -105,12 +105,16 @@ $(function(){initNavTree('namespaces.html',''); initResizable(true); });
Here is a list of all namespaces with brief descriptions:
-
[detail level 12]
- - - - - +
[detail level 123]
 Nstroid
 Nconfig
 NIO
 Ntopology
 Nutils
+ + + + + + + + +
 NstroidPublic API surface for the stroid mesh generation library
 NconfigConfiguration types and defaults for mesh generation
 Nexceptions
 NIOMesh serialization and visualization helpers
 Nrefinement
 Nstats
 NtopologyTopology construction and curvilinear mapping utilities
 NutilsMesh inspection and validation utilities
 Nterm_support
diff --git a/docs/html/namespacestroid.html b/docs/html/namespacestroid.html index 74ff0b6..9aa9a13 100644 --- a/docs/html/namespacestroid.html +++ b/docs/html/namespacestroid.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -102,22 +102,419 @@ $(function(){initNavTree('namespacestroid.html',''); initResizable(true); });
+Namespaces | +Classes | +Enumerations | +Functions | +Variables
stroid Namespace Reference
+ +

Public API surface for the stroid mesh generation library. +More...

+ + + + + + + + + + +

Namespaces

namespace  config
 Configuration types and defaults for mesh generation.
 
namespace  exceptions
 
namespace  IO
 Mesh serialization and visualization helpers.
 
namespace  refinement
 
namespace  stats
 
namespace  topology
 Topology construction and curvilinear mapping utilities.
 
namespace  utils
 Mesh inspection and validation utilities.
 
+ + + + + +

+Classes

struct  ScalarMeshField
 
struct  StroidMesh
 
+ + + +

+Enumerations

enum class  MFEM_MESH_TYPE { SERIAL +, PARALLEL + }
 
+ + + + + + + +

+Functions

StroidMesh GenerateMesh (const fourdst::config::Config< stroid::config::MeshConfig > &input)
 
StroidMesh GenerateMesh (const stroid::config::MeshConfig &config)
 
StroidMesh GenerateMesh (const std::string &filename)
 
+ + + + + + + + + + + + + + + + + + +

+Variables

list __all__ = ['config', 'exceptions', 'IO', 'refinement', 'stats', 'GenerateMesh', 'StroidMesh']
 
 _meta = importlib.metadata.metadata('stroid')
 
 __version__ = _meta['Version']
 
 __license__ = _meta['License']
 
 __description__ = _meta['Summary']
 
str __author__ = 'Emily M. Boudreaux'
 
str __url__ = 'https://github.com/4D-STAR/stroid'
 
str __email__ = 'emily.boudreaux@dartmouth.edu'
 
 _PACKAGE_DIR = Path(__file__).resolve().parent
 
+

Detailed Description

+

Public API surface for the stroid mesh generation library.

+

This namespace aggregates configuration, topology construction, mapping, and mesh utilities for building curvilinear multi-block meshes.

+
Example: build a mesh programmatically
#include <memory>
+
#include "mfem.hpp"
+
#include "fourdst/config/config.h"
+
#include "stroid/stroid.h"
+
+
int main() {
+
fourdst::config::Config<stroid::config::MeshConfig> cfg;
+ + + + +
stroid::IO::SaveVTU(*mesh, "stroid");
+
}
+
void SaveVTU(mfem::Mesh &mesh, const std::string &exportName)
Save a mesh as a ParaView VTU dataset.
Definition mesh.cpp:710
+
void PromoteToHighOrder(mfem::Mesh &mesh, const fourdst::config::Config< config::MeshConfig > &config)
Promote a mesh to high-order by attaching an H1 nodal finite element space.
Definition curvilinear.cpp:43
+
void Finalize(mfem::Mesh &mesh, const fourdst::config::Config< config::MeshConfig > &config)
Finalize topology, validate orientation, and apply the configured refinement policy.
Definition topology.cpp:234
+
void ProjectMesh(mfem::Mesh &mesh, const fourdst::config::Config< config::MeshConfig > &config)
Project high-order mesh nodes using the configured curvilinear mapping.
Definition curvilinear.cpp:47
+
std::unique_ptr< mfem::Mesh > BuildSkeleton(const fourdst::config::Config< config::MeshConfig > &config)
Build the initial multi-block mesh topology for the star model.
Definition topology.cpp:114
+ +
+
Example: tweak config then visualize
fourdst::config::Config<stroid::config::MeshConfig> cfg;
+
cfg->order = 4;
+
cfg->flattening = 0.1;
+ + + + +
stroid::IO::ViewMesh(*mesh, "Stroid Mesh", stroid::IO::VISUALIZATION_MODE::ELEMENT_ID, "localhost", 19916);
+
void ViewMesh(mfem::Mesh &mesh, const std::string &title, VISUALIZATION_MODE mode, const std::string &vishost, int visport, bool conforming_display=true)
Stream a mesh to a running GLVis server for interactive viewing.
Definition mesh.cpp:727
+
@ ELEMENT_ID
Color elements by their element attribute/ID.
Definition mesh.h:19
+
+

Enumeration Type Documentation

+ +

◆ MFEM_MESH_TYPE

+ +
+
+ + + + + +
+ + + + +
enum class stroid::MFEM_MESH_TYPE
+
+strong
+
+ + + +
Enumerator
SERIAL 
PARALLEL 
+ +
+
+

Function Documentation

+ +

◆ GenerateMesh() [1/3]

+ +
+
+ + + + + +
+ + + + + + + +
StroidMesh stroid::GenerateMesh (const fourdst::config::Config< stroid::config::MeshConfig > & input)
+
+inline
+
+ +
+
+ +

◆ GenerateMesh() [2/3]

+ +
+
+ + + + + +
+ + + + + + + +
StroidMesh stroid::GenerateMesh (const std::string & filename)
+
+inline
+
+ +
+
+ +

◆ GenerateMesh() [3/3]

+ +
+
+ + + + + +
+ + + + + + + +
StroidMesh stroid::GenerateMesh (const stroid::config::MeshConfig & config)
+
+inline
+
+ +
+
+

Variable Documentation

+ +

◆ __all__

+ +
+
+ + + + + +
+ + + + +
list stroid.__all__ = ['config', 'exceptions', 'IO', 'refinement', 'stats', 'GenerateMesh', 'StroidMesh']
+
+private
+
+ +
+
+ +

◆ __author__

+ +
+
+ + + + + +
+ + + + +
str stroid.__author__ = 'Emily M. Boudreaux'
+
+private
+
+ +
+
+ +

◆ __description__

+ +
+
+ + + + + +
+ + + + +
stroid.__description__ = _meta['Summary']
+
+private
+
+ +
+
+ +

◆ __email__

+ +
+
+ + + + + +
+ + + + +
str stroid.__email__ = 'emily.boudreaux@dartmouth.edu'
+
+private
+
+ +
+
+ +

◆ __license__

+ +
+
+ + + + + +
+ + + + +
str stroid.__license__ = _meta['License']
+
+private
+
+ +
+
+ +

◆ __url__

+ +
+
+ + + + + +
+ + + + +
str stroid.__url__ = 'https://github.com/4D-STAR/stroid'
+
+private
+
+ +
+
+ +

◆ __version__

+ +
+
+ + + + + +
+ + + + +
str stroid.__version__ = _meta['Version']
+
+private
+
+ +
+
+ +

◆ _meta

+ +
+
+ + + + + +
+ + + + +
stroid._meta = importlib.metadata.metadata('stroid')
+
+protected
+
+ +
+
+ +

◆ _PACKAGE_DIR

+ +
+
+ + + + + +
+ + + + +
stroid._PACKAGE_DIR = Path(__file__).resolve().parent
+
+protected
+
+ +
+
diff --git a/docs/html/namespacestroid.js b/docs/html/namespacestroid.js index c3af8c5..aa85cc8 100644 --- a/docs/html/namespacestroid.js +++ b/docs/html/namespacestroid.js @@ -1,29 +1,48 @@ var namespacestroid = [ [ "config", "namespacestroid_1_1config.html", "namespacestroid_1_1config" ], + [ "exceptions", "namespacestroid_1_1exceptions.html", "namespacestroid_1_1exceptions" ], [ "IO", "namespacestroid_1_1_i_o.html", [ [ "VISUALIZATION_MODE", "namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6e", [ [ "NONE", "namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eab50339a10e1de285ac99d4c3990b8693", null ], [ "ELEMENT_ID", "namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eac31a2fe3e97d218a154c1947b43d6bbf", null ], [ "BOUNDARY_ELEMENT_ID", "namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eaee96e14c2b71bd59252006289ba464cf", null ] ] ], + [ "LoadStroidMesh", "namespacestroid_1_1_i_o.html#a3f39dc149d5650468b579c76d00f991d", null ], + [ "MakeConformingVisualizationMesh", "namespacestroid_1_1_i_o.html#a7426b1e664be45cbf791167748d4feb8", null ], + [ "ParseStroidMesh", "namespacestroid_1_1_i_o.html#a20ae517986b9c27d23ef5f0ab704b247", null ], [ "SaveMesh", "namespacestroid_1_1_i_o.html#aeb567ddc70ff2d064c139dee87575830", null ], + [ "SaveMesh", "namespacestroid_1_1_i_o.html#ad7721ff3eda0ad42365955ea33da2b0a", null ], + [ "SaveStroidMesh", "namespacestroid_1_1_i_o.html#ab854167b428c1a77597d9bb3a972b363", null ], + [ "SaveVTU", "namespacestroid_1_1_i_o.html#ae0fc8e0663da26ff11be71fb1b5a0b0e", null ], [ "SaveVTU", "namespacestroid_1_1_i_o.html#ab4c8bda7ab370e34376a7832fbf0951e", null ], - [ "ViewMesh", "namespacestroid_1_1_i_o.html#a496f5c16eaffda5922a0b96c1f525dab", null ], - [ "VisualizeFaceValence", "namespacestroid_1_1_i_o.html#a8100e130b3a49fdee48bc3c4d4e63963", null ] + [ "ViewMesh", "namespacestroid_1_1_i_o.html#a6491a99d6d2859b2c098b94f2f8171d3", null ], + [ "ViewMesh", "namespacestroid_1_1_i_o.html#a7bc6daa0f9ef8327355022363e1db3fb", null ], + [ "VisualizeFaceValence", "namespacestroid_1_1_i_o.html#a26155a525b34257a3eb2305e477b6bef", null ], + [ "VisualizeFaceValence", "namespacestroid_1_1_i_o.html#a516d260163e0b6ac000b301b0b8cf4bb", null ] ] ], - [ "topology", "namespacestroid_1_1topology.html", [ - [ "ApplyEquiangular", "namespacestroid_1_1topology.html#a03f0b29ccf7d427a175de9ff75824b7c", null ], - [ "ApplyKelvin", "namespacestroid_1_1topology.html#a59c54a10f726d323f8506b4a2edd7467", null ], - [ "ApplySpheroidal", "namespacestroid_1_1topology.html#a7fbf58c40c03bc751d53f4a3273744fc", null ], - [ "BuildSkeleton", "namespacestroid_1_1topology.html#abc0d8a1fb8e9c5ac0e259e4c93db7892", null ], - [ "Finalize", "namespacestroid_1_1topology.html#a62774bcba7ea1a485892dcd4bed6425b", null ], - [ "ProjectMesh", "namespacestroid_1_1topology.html#a836ed13e5bac63e7952c3ce4e5532e78", null ], - [ "PromoteToHighOrder", "namespacestroid_1_1topology.html#a5907aa2e639cda703d48d177abc37caf", null ], - [ "TransformPoint", "namespacestroid_1_1topology.html#a394e33bdfafdaccd6edfaae0642d3456", null ] + [ "refinement", "namespacestroid_1_1refinement.html", [ + [ "UniformRefinement", "namespacestroid_1_1refinement.html#a1f203a99bc3096f62f7584fd4c19122c", null ] ] ], - [ "utils", "namespacestroid_1_1utils.html", [ - [ "MarkFlippedBoundaryElements", "namespacestroid_1_1utils.html#ae047d97d7d5dc12812395909d00f5bbe", null ], - [ "MarkFlippedElements", "namespacestroid_1_1utils.html#a22ab5809195bf85156607790f82b5e2d", null ] - ] ] + [ "stats", "namespacestroid_1_1stats.html", "namespacestroid_1_1stats" ], + [ "topology", "namespacestroid_1_1topology.html", "namespacestroid_1_1topology" ], + [ "utils", "namespacestroid_1_1utils.html", "namespacestroid_1_1utils" ], + [ "ScalarMeshField", "structstroid_1_1_scalar_mesh_field.html", "structstroid_1_1_scalar_mesh_field" ], + [ "StroidMesh", "structstroid_1_1_stroid_mesh.html", "structstroid_1_1_stroid_mesh" ], + [ "MFEM_MESH_TYPE", "namespacestroid.html#a90f6d065df7b5224bbfc04c6d89c467e", [ + [ "SERIAL", "namespacestroid.html#a90f6d065df7b5224bbfc04c6d89c467ea7b804a28d6154ab8007287532037f1d0", null ], + [ "PARALLEL", "namespacestroid.html#a90f6d065df7b5224bbfc04c6d89c467eadf13a99b035d6f0bce4f44ab18eec8eb", null ] + ] ], + [ "GenerateMesh", "namespacestroid.html#a009af3074e8681e87067228deab670d6", null ], + [ "GenerateMesh", "namespacestroid.html#ae9643927d87d14a87970569dd0d8f3ae", null ], + [ "GenerateMesh", "namespacestroid.html#a2e8a90a2a7e9606de8b07cf330c0fd8d", null ], + [ "__all__", "namespacestroid.html#af6ce344ae299e3ad50f4ad30f3e98fb4", null ], + [ "__author__", "namespacestroid.html#a0980d815006142018342badd4a344b75", null ], + [ "__description__", "namespacestroid.html#a46eadd157b4003bbf1df5f46df72ecf6", null ], + [ "__email__", "namespacestroid.html#a7aa709789d28ac6d51079f35b030fb7b", null ], + [ "__license__", "namespacestroid.html#a66665c450e6087c6d5d85fe337229886", null ], + [ "__url__", "namespacestroid.html#a82f32fe152e5f48927bba40b0131c047", null ], + [ "__version__", "namespacestroid.html#a6c6c3bffa4c5eaa2cbfa16072a66ec85", null ], + [ "_meta", "namespacestroid.html#a7515d5089908807b72e300799c8e6d8a", null ], + [ "_PACKAGE_DIR", "namespacestroid.html#a6c93a0ee650df592ef5c32c3e6b110e0", null ] ]; \ No newline at end of file diff --git a/docs/html/namespacestroid_1_1_i_o.html b/docs/html/namespacestroid_1_1_i_o.html index 8d1a8ff..b4540e0 100644 --- a/docs/html/namespacestroid_1_1_i_o.html +++ b/docs/html/namespacestroid_1_1_i_o.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -107,6 +107,9 @@ $(function(){initNavTree('namespacestroid_1_1_i_o.html',''); initResizable(true)
stroid::IO Namespace Reference
+ +

Mesh serialization and visualization helpers. +More...

@@ -119,20 +122,41 @@ Enumerations

Enumerations

+ + + + + - - - - - - + + + + + + + + + + + + + + + + + + + +

Functions

void SaveStroidMesh (const StroidMesh &mesh, const std::string &filename, const std::string &comment="")
 
void SaveMesh (const mfem::Mesh &mesh, const std::string &filename)
 Save a mesh to MFEM's native .mesh format.
 
void SaveMesh (const stroid::StroidMesh &mesh, const std::string &filename)
 Overload of SaveMesh which accepts a StroidMesh type and will internally unpack it.
 
void SaveVTU (mfem::Mesh &mesh, const std::string &exportName)
 Save a mesh as a ParaView VTU dataset.
 
void ViewMesh (mfem::Mesh &mesh, const std::string &title, VISUALIZATION_MODE mode, const std::string &vishost, int visport)
 Stream a mesh to a running GLVis server for interactive viewing.
 
void VisualizeFaceValence (mfem::Mesh &mesh)
 Visualize boundary face valence (1=surface, 2=internal).
 
void SaveVTU (const stroid::StroidMesh &mesh, const std::string &exportName)
 Overload of SaveVTU which accepts a StroidMesh type and will internally unpack it.
 
std::unique_ptr< mfem::Mesh > MakeConformingVisualizationMesh (const mfem::Mesh &mesh)
 Make a display-only mesh copy with matching face subdivisions. This is purely for visualization and should not be used for any science goals.
 
void ViewMesh (mfem::Mesh &mesh, const std::string &title, VISUALIZATION_MODE mode, const std::string &vishost, int visport, bool conforming_display=true)
 Stream a mesh to a running GLVis server for interactive viewing.
 
void ViewMesh (const stroid::StroidMesh &mesh, const std::string &title, VISUALIZATION_MODE mode, const std::string &vishost, int visport, bool conforming_display=true)
 
void VisualizeFaceValence (mfem::Mesh &mesh, const std::string &vishost, int visport, bool conforming_display=true)
 Color boundary-adjacent elements by face valence (1=surface, 2=internal). Untagged elements are zero; elements touching several tagged faces use the maximum valence. Values are computed before display subdivision.
 
void VisualizeFaceValence (const stroid::StroidMesh &mesh, const std::string &vishost, int visport, bool conforming_display=true)
 
std::expected< StroidMesh, std::string > ParseStroidMesh (std::istream &is)
 
std::expected< StroidMesh, std::string > LoadStroidMesh (const std::string &filename)
 
-

Enumeration Type Documentation

+

Detailed Description

+

Mesh serialization and visualization helpers.

+

Enumeration Type Documentation

◆ VISUALIZATION_MODE

@@ -166,8 +190,68 @@ Functions

Function Documentation

+ +

◆ LoadStroidMesh()

+ +
+
+ + + + + + + +
std::expected< StroidMesh, std::string > stroid::IO::LoadStroidMesh (const std::string & filename)
+
+ +
+
+ +

◆ MakeConformingVisualizationMesh()

+ +
+
+ + + + + + + +
std::unique_ptr< mfem::Mesh > stroid::IO::MakeConformingVisualizationMesh (const mfem::Mesh & mesh)
+
+ +

Make a display-only mesh copy with matching face subdivisions. This is purely for visualization and should not be used for any science goals.

+
Parameters
+ + +
meshSource mesh whose geometry is to be displayed.
+
+
+
Returns
Independently owned copy with no hanging faces.
+ +
+
+ +

◆ ParseStroidMesh()

+ +
+
+ + + + + + + +
std::expected< StroidMesh, std::string > stroid::IO::ParseStroidMesh (std::istream & is)
+
+ +
+
-

◆ SaveMesh()

+

◆ SaveMesh() [1/2]

@@ -194,10 +278,98 @@ Functions +
+
+ +

◆ SaveMesh() [2/2]

+ +
+
+ + + + + + + + + + + +
void stroid::IO::SaveMesh (const stroid::StroidMesh & mesh,
const std::string & filename )
+
+ +

Overload of SaveMesh which accepts a StroidMesh type and will internally unpack it.

+
Parameters
+ + + +
meshStroidMesh to serialize.
filenamePath to save to
+
+
+
Note
This function is a utility wrapper to save a StroidMesh object in MFEM's native .mesh format. Data other than the mesh pointer in StroidMesh will not be saved (e.g. the reference mesh, the number of refinement levels, etc..). If you need to serialize an entire StroidMesh then please use the stroid::IO::SaveStroidMesh function
+ +
+
+ +

◆ SaveStroidMesh()

+ +
+
+ + + + + + + + + + + + + + + + +
void stroid::IO::SaveStroidMesh (const StroidMesh & mesh,
const std::string & filename,
const std::string & comment = "" )
+
+ +
+
+ +

◆ SaveVTU() [1/2]

+ +
+
+ + + + + + + + + + + +
void stroid::IO::SaveVTU (const stroid::StroidMesh & mesh,
const std::string & exportName )
+
+ +

Overload of SaveVTU which accepts a StroidMesh type and will internally unpack it.

+
Parameters
+ + + +
meshStroidMesh to serialize.
filenamePath to save to
+
+
+
Note
This function is a utility wrapper to save a StroidMesh object in MFEM's native .mesh format. Data other than the mesh pointer in StroidMesh will not be saved (e.g. the reference mesh, the number of refinement levels, etc..). If you need to serialize an entire StroidMesh then please use the stroid::IO::SaveStroidVTU function
+
-

◆ SaveVTU()

+

◆ SaveVTU() [2/2]

@@ -226,8 +398,49 @@ Functions
- -

◆ ViewMesh()

+ +

◆ ViewMesh() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void stroid::IO::ViewMesh (const stroid::StroidMesh & mesh,
const std::string & title,
VISUALIZATION_MODE mode,
const std::string & vishost,
int visport,
bool conforming_display = true )
+
+ +
+
+ +

◆ ViewMesh() [2/2]

@@ -255,7 +468,12 @@ Functions - int visport ) + int visport, + + + + + bool conforming_display = true )
@@ -268,14 +486,15 @@ Functions modeAttribute visualization mode. vishostGLVis server host. visportGLVis server port. + conforming_displayRefine a display-only copy at hanging interfaces to prevent GLVis tessellation gaps. Set false to inspect the original element layout, which can show rendering gaps on curved interfaces.
- -

◆ VisualizeFaceValence()

+ +

◆ VisualizeFaceValence() [1/2]

@@ -283,16 +502,64 @@ Functions void stroid::IO::VisualizeFaceValence ( - mfem::Mesh & mesh) + const stroid::StroidMesh & mesh, + + + + const std::string & vishost, + + + + + int visport, + + + + + bool conforming_display = true )
-

Visualize boundary face valence (1=surface, 2=internal).

+
+
+ +

◆ VisualizeFaceValence() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
void stroid::IO::VisualizeFaceValence (mfem::Mesh & mesh,
const std::string & vishost,
int visport,
bool conforming_display = true )
+
+ +

Color boundary-adjacent elements by face valence (1=surface, 2=internal). Untagged elements are zero; elements touching several tagged faces use the maximum valence. Values are computed before display subdivision.

Parameters
+ + +
meshMesh whose boundary faces are inspected.
vishostGLVis server host.
visportGLVis server port.
conforming_displayUse the same display-only refinement as ViewMesh.
diff --git a/docs/html/namespacestroid_1_1config.html b/docs/html/namespacestroid_1_1config.html index 580b4f9..834599c 100644 --- a/docs/html/namespacestroid_1_1config.html +++ b/docs/html/namespacestroid_1_1config.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -102,17 +102,86 @@ $(function(){initNavTree('namespacestroid_1_1config.html',''); initResizable(tru
stroid::config Namespace Reference
+ +

Configuration types and defaults for mesh generation. +More...

+ + +

Classes

struct  MeshConfig
 Configuration parameters for stroid mesh generation. More...
 
struct  OptimizationMethods
 
+ + + + + +

+Functions

MeshConfig ResolveDefaults (const MeshConfig &mesh_config)
 Fill omitted configuration values.
 
std::string to_string (const MeshConfig &mesh_config)
 
+

Detailed Description

+

Configuration types and defaults for mesh generation.

+

Function Documentation

+ +

◆ ResolveDefaults()

+ +
+
+ + + + + +
+ + + + + + + +
MeshConfig stroid::config::ResolveDefaults (const MeshConfig & mesh_config)
+
+inline
+
+ +

Fill omitted configuration values.

+ +
+
+ +

◆ to_string()

+ +
+
+ + + + + +
+ + + + + + + +
std::string stroid::config::to_string (const MeshConfig & mesh_config)
+
+inline
+
+ +
+
diff --git a/docs/html/namespacestroid_1_1config.js b/docs/html/namespacestroid_1_1config.js index edb6deb..381fd80 100644 --- a/docs/html/namespacestroid_1_1config.js +++ b/docs/html/namespacestroid_1_1config.js @@ -1,4 +1,7 @@ var namespacestroid_1_1config = [ - [ "MeshConfig", "structstroid_1_1config_1_1_mesh_config.html", "structstroid_1_1config_1_1_mesh_config" ] + [ "MeshConfig", "structstroid_1_1config_1_1_mesh_config.html", "structstroid_1_1config_1_1_mesh_config" ], + [ "OptimizationMethods", "structstroid_1_1config_1_1_optimization_methods.html", "structstroid_1_1config_1_1_optimization_methods" ], + [ "ResolveDefaults", "namespacestroid_1_1config.html#a84d2f4618367487820ac818c3c47a39a", null ], + [ "to_string", "namespacestroid_1_1config.html#a4f2409cb05fd572794c115d850502d61", null ] ]; \ No newline at end of file diff --git a/docs/html/namespacestroid_1_1topology.html b/docs/html/namespacestroid_1_1topology.html index fa5012e..76f4670 100644 --- a/docs/html/namespacestroid_1_1topology.html +++ b/docs/html/namespacestroid_1_1topology.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -102,11 +102,20 @@ $(function(){initNavTree('namespacestroid_1_1topology.html',''); initResizable(t
stroid::topology Namespace Reference
+ +

Topology construction and curvilinear mapping utilities. +More...

+ + + +

+Classes

class  TMOPProgressBar
 
@@ -115,6 +124,9 @@ Functions + + + @@ -127,14 +139,23 @@ Functions + + + + + + + - +

Functions

void PromoteToHighOrder (mfem::Mesh &mesh, const fourdst::config::Config< config::MeshConfig > &config)
void ProjectMesh (mfem::Mesh &mesh, const fourdst::config::Config< config::MeshConfig > &config)
 Project high-order mesh nodes using the configured curvilinear mapping.
 
std::unique_ptr< ScalarMeshFieldBuildExteriorCoordinate (mfem::Mesh &mesh, mfem::Mesh &reference_mesh, const fourdst::config::Config< config::MeshConfig > &config)
 Build a scalar grid function representing the compactification coordinate for a mesh. This ranges from 0-1 with 0 at the stellar surface and 1 at the compactified infinity.
 
void ApplyEquiangular (mfem::Vector &pos)
 Apply an equiangular (gnomonic) projection to a point on a cube.
 
void TransformPoint (mfem::Vector &pos, const fourdst::config::Config< config::MeshConfig > &config, int attribute_id)
 Map a point from the initial block topology to the curvilinear domain.
 
double ComputeExteriorCoordinate (const mfem::Vector &logical_position, int attribute, const fourdst::config::Config< config::MeshConfig > &config)
 Compute the compactification coordinate for a point in the curvilinear domain. This ranges from 0-1 with 0 at the stellar surface and 1 at the compactified infinity.
 
void ApplyTMOP (mfem::Mesh &mesh, const fourdst::config::Config< config::MeshConfig > &config)
 
void OptimizeMesh (mfem::Mesh &mesh, const fourdst::config::Config< config::MeshConfig > &cfg)
 
std::unique_ptr< mfem::Mesh > BuildSkeleton (const fourdst::config::Config< config::MeshConfig > &config)
 Build the initial multi-block mesh topology for the star model.
 
void Finalize (mfem::Mesh &mesh, const fourdst::config::Config< config::MeshConfig > &config)
 Finalize topology, validate orientation, and apply uniform refinement.
 Finalize topology, validate orientation, and apply the configured refinement policy.
 
-

Function Documentation

+

Detailed Description

+

Topology construction and curvilinear mapping utilities.

+

Function Documentation

◆ ApplyEquiangular()

@@ -218,6 +239,65 @@ Functions +
+
+ +

◆ ApplyTMOP()

+ +
+
+ + + + + + + + + + + +
void stroid::topology::ApplyTMOP (mfem::Mesh & mesh,
const fourdst::config::Config< config::MeshConfig > & config )
+
+

@breif Apply target matrix optimization to improve conditioning of the mesh

+ +
+
+ +

◆ BuildExteriorCoordinate()

+ +
+
+ + + + + + + + + + + + + + + + +
std::unique_ptr< ScalarMeshField > stroid::topology::BuildExteriorCoordinate (mfem::Mesh & mesh,
mfem::Mesh & reference_mesh,
const fourdst::config::Config< config::MeshConfig > & config )
+
+ +

Build a scalar grid function representing the compactification coordinate for a mesh. This ranges from 0-1 with 0 at the stellar surface and 1 at the compactified infinity.

+
Parameters
+ + + + +
meshReference to the underlying serial MFEM mesh which has been promoted to high-order and projected into the curvilinear domain.
reference_meshreference to the underlying serial which has not been promoted to high-order or projected into the curvilinear domain. This is used to compute the compactification coordinate.
configConfig file
+
+
+
Returns
Unique pointer to a scalar mesh field representing the compactification coordinate.
+
@@ -238,12 +318,49 @@ Functions

Build the initial multi-block mesh topology for the star model.

Parameters
- +
configMesh configuration (uses radii and domain flags).
configMesh configuration (uses radii, domain flags, and core_mapping). The legacy spherified core uses one block; multi_block uses an inner Cartesian block and six core transition blocks.
Returns
Newly allocated mesh skeleton (not yet refined or curved).
+
+ + +

◆ ComputeExteriorCoordinate()

+ +
+
+ + + + + + + + + + + + + + + + +
double stroid::topology::ComputeExteriorCoordinate (const mfem::Vector & logical_position,
int attribute,
const fourdst::config::Config< config::MeshConfig > & config )
+
+ +

Compute the compactification coordinate for a point in the curvilinear domain. This ranges from 0-1 with 0 at the stellar surface and 1 at the compactified infinity.

+
Parameters
+ + + + +
logical_positionLogical position of the point in the curvilinear domain.
attributeElement attribute ID (used to determine the exterior coordinate).
configMesh configuration (uses radii and flattening).
+
+
+
Returns
Compactification coordinate ranging from 0 (stellar surface) to 1 (compactified infinity).
+
@@ -265,15 +382,37 @@ Functions
-

Finalize topology, validate orientation, and apply uniform refinement.

+

Finalize topology, validate orientation, and apply the configured refinement policy.

Parameters
- +
meshMesh to finalize in-place.
configMesh configuration (uses refinement_levels).
configMesh configuration. Vacuum refinement overrides enable a balanced hierarchy with fine layers at both vacuum boundaries and a conforming stellar interface. Without overrides, refinement is uniform.
+
+ + +

◆ OptimizeMesh()

+ +
+
+ + + + + + + + + + + +
void stroid::topology::OptimizeMesh (mfem::Mesh & mesh,
const fourdst::config::Config< config::MeshConfig > & cfg )
+
+

@breif Helper to call TMOP if the correct flags are set

+
@@ -364,7 +503,7 @@ Functions
Parameters
- +
posPosition vector updated in-place.
configMesh configuration (uses radii, flattening, instability radius, and core steepness).
configMesh configuration (uses radii, flattening, and core_mapping). The multi_block strategy requires the matching skeleton from BuildSkeleton; changing only the mapping on a legacy core element is not supported.
attribute_idElement attribute ID (currently unused).
diff --git a/docs/html/namespacestroid_1_1utils.html b/docs/html/namespacestroid_1_1utils.html index 25e8ff3..9032408 100644 --- a/docs/html/namespacestroid_1_1utils.html +++ b/docs/html/namespacestroid_1_1utils.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -102,11 +102,20 @@ $(function(){initNavTree('namespacestroid_1_1utils.html',''); initResizable(true
stroid::utils Namespace Reference
+ +

Mesh inspection and validation utilities. +More...

+ + + +

+Namespaces

namespace  term_support
 
@@ -115,8 +124,56 @@ Functions + + + +

Functions

void MarkFlippedElements (mfem::Mesh &mesh)
void MarkFlippedBoundaryElements (mfem::Mesh &mesh)
 Mark boundary elements whose outward normal orientation is flipped.
 
void ExportJacobianRadialProfile (mfem::Mesh &mesh, const std::string &filename)
 
std::unique_ptr< mfem::Mesh > BuildProjected (const mfem::Mesh &reference, const fourdst::config::Config< config::MeshConfig > &cfg)
 
-

Function Documentation

+

Detailed Description

+

Mesh inspection and validation utilities.

+

Function Documentation

+ +

◆ BuildProjected()

+ +
+
+ + + + + + + + + + + +
std::unique_ptr< mfem::Mesh > stroid::utils::BuildProjected (const mfem::Mesh & reference,
const fourdst::config::Config< config::MeshConfig > & cfg )
+
+ +
+
+ +

◆ ExportJacobianRadialProfile()

+ +
+
+ + + + + + + + + + + +
void stroid::utils::ExportJacobianRadialProfile (mfem::Mesh & mesh,
const std::string & filename )
+
+ +
+

◆ MarkFlippedBoundaryElements()

diff --git a/docs/html/navtreedata.js b/docs/html/navtreedata.js index 3464aff..0582c25 100644 --- a/docs/html/navtreedata.js +++ b/docs/html/navtreedata.js @@ -25,41 +25,57 @@ var NAVTREE = [ [ "stroid", "index.html", [ - [ "A multi-block mesh generation tool for stellar modeling", "index.html#autotoc_md1", null ], - [ "Building and Installing", "index.html#autotoc_md2", [ - [ "Building", "index.html#autotoc_md3", [ - [ "Uninstalling", "index.html#autotoc_md4", null ] + [ "Stroid", "index.html#autotoc_md0", [ + [ "A multi-block mesh generation tool for stellar modeling", "index.html#autotoc_md1", null ], + [ "Building and Installing", "index.html#autotoc_md2", [ + [ "Building", "index.html#autotoc_md3", [ + [ "Uninstalling", "index.html#autotoc_md4", null ] + ] ], + [ "Running", "index.html#autotoc_md5", null ], + [ "Configuration File", "index.html#autotoc_md6", null ], + [ "Conditioned core mapping", "index.html#autotoc_md7", null ], + [ "Nonconforming vacuum refinement", "index.html#autotoc_md8", [ + [ "Viewing curved meshes in GLVis", "index.html#autotoc_md9", null ] + ] ], + [ "C++ Interface", "index.html#autotoc_md10", null ] ] ], - [ "Running", "index.html#autotoc_md5", null ], - [ "Configuration File", "index.html#autotoc_md6", null ], - [ "C++ Interface", "index.html#autotoc_md7", null ] + [ "Example Meshes", "index.html#autotoc_md11", null ], + [ "Funding", "index.html#autotoc_md12", null ] ] ], - [ "Funding", "index.html#autotoc_md8", null ], [ "Namespaces", "namespaces.html", [ [ "Namespace List", "namespaces.html", "namespaces_dup" ], [ "Namespace Members", "namespacemembers.html", [ [ "All", "namespacemembers.html", null ], [ "Functions", "namespacemembers_func.html", null ], + [ "Variables", "namespacemembers_vars.html", null ], [ "Enumerations", "namespacemembers_enum.html", null ] ] ] ] ], [ "Classes", "annotated.html", [ [ "Class List", "annotated.html", "annotated_dup" ], [ "Class Index", "classes.html", null ], + [ "Class Hierarchy", "hierarchy.html", "hierarchy" ], [ "Class Members", "functions.html", [ [ "All", "functions.html", null ], + [ "Functions", "functions_func.html", null ], [ "Variables", "functions_vars.html", null ] ] ] ] ], [ "Files", "files.html", [ - [ "File List", "files.html", "files_dup" ] + [ "File List", "files.html", "files_dup" ], + [ "File Members", "globals.html", [ + [ "All", "globals.html", null ], + [ "Functions", "globals_func.html", null ] + ] ] ] ] ] ] ]; var NAVTREEINDEX = [ -"_logo_8png.html" +"____init_____8py.html", +"structstroid_1_1config_1_1_mesh_config.html", +"structstroid_1_1stats_1_1_refinement_stats.html#aef469d52ee5d4b95baadfa785bd3e492" ]; var SYNCONMSG = 'click to disable panel synchronization'; diff --git a/docs/html/navtreeindex0.js b/docs/html/navtreeindex0.js index 1918b57..e337321 100644 --- a/docs/html/navtreeindex0.js +++ b/docs/html/navtreeindex0.js @@ -1,100 +1,253 @@ var NAVTREEINDEX0 = { -"_logo_8png.html":[5,0,0,0,0], -"annotated.html":[4,0], -"classes.html":[4,1], -"config_8h.html":[5,0,1,0,0,0,0], -"curvilinear_8cpp.html":[5,0,1,1,1,0], -"curvilinear_8h.html":[5,0,1,0,0,2,0], -"dir_31a6c70da1404d38d1b51e38b19548a1.html":[5,0,1,0,0,1], -"dir_3f4f28e99864f6e7d54ad0c93ce0a2a5.html":[5,0,1,0,0], -"dir_49e56c817e5e54854c35e136979f97ca.html":[5,0,0], -"dir_68267d1309a1af8e8297ef4c3efbcdba.html":[5,0,1], -"dir_82887d4f338e92537fa9d809bec8c614.html":[5,0,1,1,0], -"dir_87d18a4dc5174905bfd7d2dc734defe6.html":[5,0,1,1,2], -"dir_936721fd6a792737eaef7358bcd49428.html":[5,0,1,1,1], -"dir_9d5018b9ddb63a582aa4c6b91bec2f8c.html":[5,0,1,0,0,3], -"dir_9da86e8abab39b749c6020360d8e4403.html":[5,0,1,0,0,2], -"dir_b0856f6b0d80ccb263b2f415c91f9e17.html":[5,0,1,0], -"dir_c34d5e8363cf0aa3fabc4f3fad3412a4.html":[5,0,0,0], -"dir_c85d3e3c5052e9ad9ce18c6863244a25.html":[5,0,1,1], -"dir_dc36fd7496f87f6989d6d6a9445d600c.html":[5,0,1,0,0,0], -"files.html":[5,0], -"functions.html":[4,2,0], -"functions_vars.html":[4,2,1], +"____init_____8py.html":[3,0,1,2,4,0], +"_i_o_2bindings_8cpp.html":[3,0,1,2,2,0], +"_i_o_2bindings_8cpp.html#a62a31f440d644fa1f69dc4742eba7c2f":[3,0,1,2,2,0,0], +"_i_o_2bindings_8h.html":[3,0,1,2,2,1], +"_i_o_2bindings_8h.html#a62a31f440d644fa1f69dc4742eba7c2f":[3,0,1,2,2,1,0], +"_logo_8png.html":[3,0,0,0,0], +"annotated.html":[2,0], +"bindings_8cpp.html":[3,0,1,2,6], +"bindings_8cpp.html#a546f88c544a1d55f72a3f10039822b5e":[3,0,1,2,6,0], +"classes.html":[2,1], +"classstroid_1_1exceptions_1_1_stroid_continuity_error.html":[1,0,0,1,0], +"classstroid_1_1exceptions_1_1_stroid_continuity_error.html":[2,0,1,1,0], +"classstroid_1_1exceptions_1_1_stroid_continuity_error.html#aea7b987d7d523e849efe7afa1c416644":[1,0,0,1,0,0], +"classstroid_1_1exceptions_1_1_stroid_continuity_error.html#aea7b987d7d523e849efe7afa1c416644":[2,0,1,1,0,0], +"classstroid_1_1exceptions_1_1_stroid_error.html":[1,0,0,1,1], +"classstroid_1_1exceptions_1_1_stroid_error.html":[2,0,1,1,1], +"classstroid_1_1exceptions_1_1_stroid_error.html#a72a77d8747707c16f9fc0dafc28d8e68":[1,0,0,1,1,2], +"classstroid_1_1exceptions_1_1_stroid_error.html#a72a77d8747707c16f9fc0dafc28d8e68":[2,0,1,1,1,2], +"classstroid_1_1exceptions_1_1_stroid_error.html#aa072b4589e680957086e3323202e36f5":[1,0,0,1,1,1], +"classstroid_1_1exceptions_1_1_stroid_error.html#aa072b4589e680957086e3323202e36f5":[2,0,1,1,1,1], +"classstroid_1_1exceptions_1_1_stroid_error.html#aea7b987d7d523e849efe7afa1c416644":[1,0,0,1,1,0], +"classstroid_1_1exceptions_1_1_stroid_error.html#aea7b987d7d523e849efe7afa1c416644":[2,0,1,1,1,0], +"classstroid_1_1exceptions_1_1_stroid_mesh_error.html":[1,0,0,1,2], +"classstroid_1_1exceptions_1_1_stroid_mesh_error.html":[2,0,1,1,2], +"classstroid_1_1exceptions_1_1_stroid_mesh_error.html#aea7b987d7d523e849efe7afa1c416644":[1,0,0,1,2,0], +"classstroid_1_1exceptions_1_1_stroid_mesh_error.html#aea7b987d7d523e849efe7afa1c416644":[2,0,1,1,2,0], +"classstroid_1_1exceptions_1_1_stroid_missing_reference_mesh.html":[1,0,0,1,3], +"classstroid_1_1exceptions_1_1_stroid_missing_reference_mesh.html":[2,0,1,1,3], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html":[1,0,0,5,0], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html":[2,0,1,3,0], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a290642ec5c00ffc1f2f79187684e1f5c":[1,0,0,5,0,2], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a290642ec5c00ffc1f2f79187684e1f5c":[2,0,1,3,0,2], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a2c840468351cdb60df1900aec220688b":[1,0,0,5,0,11], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a2c840468351cdb60df1900aec220688b":[2,0,1,3,0,11], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a2dcfbd639a0442e1a105294bb98f8c41":[1,0,0,5,0,1], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a2dcfbd639a0442e1a105294bb98f8c41":[2,0,1,3,0,1], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a3dca19d6e83defa4e20eac9a14d201bf":[1,0,0,5,0,9], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a3dca19d6e83defa4e20eac9a14d201bf":[2,0,1,3,0,9], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a3f92f95c46171f4d85bc1f9cffec48e3":[1,0,0,5,0,5], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a3f92f95c46171f4d85bc1f9cffec48e3":[2,0,1,3,0,5], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a48d38dae8e5f87ddc60a2d37cea8a05f":[1,0,0,5,0,3], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a48d38dae8e5f87ddc60a2d37cea8a05f":[2,0,1,3,0,3], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a55882054f3d6719f9b462ea6087adb19":[1,0,0,5,0,8], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a55882054f3d6719f9b462ea6087adb19":[2,0,1,3,0,8], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a66bd443aefd2ba2e2af74afc7ced6fe4":[1,0,0,5,0,0], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a66bd443aefd2ba2e2af74afc7ced6fe4":[2,0,1,3,0,0], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#ac83ffda524995f9b4bede4f319af3db3":[1,0,0,5,0,12], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#ac83ffda524995f9b4bede4f319af3db3":[2,0,1,3,0,12], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#ac98804b59cff058b94827e50d5afc5e6":[1,0,0,5,0,7], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#ac98804b59cff058b94827e50d5afc5e6":[2,0,1,3,0,7], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#ae34fd82413c5486cf98bfedfb44c6d35":[1,0,0,5,0,10], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#ae34fd82413c5486cf98bfedfb44c6d35":[2,0,1,3,0,10], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#af725077bef78f68ce8f71af3fe3a3dd3":[1,0,0,5,0,4], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#af725077bef78f68ce8f71af3fe3a3dd3":[2,0,1,3,0,4], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#afd3e86deff330cd6f65fdffe29aa7d79":[1,0,0,5,0,6], +"classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#afd3e86deff330cd6f65fdffe29aa7d79":[2,0,1,3,0,6], +"config_2bindings_8cpp.html":[3,0,1,2,0,0], +"config_2bindings_8cpp.html#a0f9c77591a52d878643d84e48410945d":[3,0,1,2,0,0,0], +"config_2bindings_8h.html":[3,0,1,2,0,1], +"config_2bindings_8h.html#a0f9c77591a52d878643d84e48410945d":[3,0,1,2,0,1,0], +"config_8h.html":[3,0,1,0,0,0,0], +"curvilinear_8cpp.html":[3,0,1,1,2,0], +"curvilinear_8h.html":[3,0,1,0,0,4,0], +"dir_23ef0af4381c568078c3c1a0b52a2897.html":[3,0,1,0,0,3], +"dir_2ba025785846180075877401a76930e4.html":[3,0,1,2,2], +"dir_31a6c70da1404d38d1b51e38b19548a1.html":[3,0,1,0,0,2], +"dir_3e6bf0b0f033292acc99bbcb0b1f3121.html":[3,0,1,2,0], +"dir_3f4f28e99864f6e7d54ad0c93ce0a2a5.html":[3,0,1,0,0], +"dir_49e56c817e5e54854c35e136979f97ca.html":[3,0,0], +"dir_5c0d64f70903e893b1efe571a4b8de29.html":[3,0,1,2], +"dir_68267d1309a1af8e8297ef4c3efbcdba.html":[3,0,1], +"dir_6f67cad5a3dd5daef2b4bab22419acbf.html":[3,0,1,2,5], +"dir_760124f38acb4ebb9f6d85a2d3ae192f.html":[3,0,1,0,0,1], +"dir_82887d4f338e92537fa9d809bec8c614.html":[3,0,1,1,0], +"dir_877f53597c92dfd67e2e6115a224a7ed.html":[3,0,1,2,3], +"dir_87d18a4dc5174905bfd7d2dc734defe6.html":[3,0,1,1,3], +"dir_936721fd6a792737eaef7358bcd49428.html":[3,0,1,1,2], +"dir_9d5018b9ddb63a582aa4c6b91bec2f8c.html":[3,0,1,0,0,5], +"dir_9da86e8abab39b749c6020360d8e4403.html":[3,0,1,0,0,4], +"dir_9f5d5384a6cbfa1675f64af43c7163ab.html":[3,0,1,2,4], +"dir_b0856f6b0d80ccb263b2f415c91f9e17.html":[3,0,1,0], +"dir_bf5ef66fceb9aacde9848923f7632729.html":[3,0,1,2,1], +"dir_c34d5e8363cf0aa3fabc4f3fad3412a4.html":[3,0,0,0], +"dir_c85d3e3c5052e9ad9ce18c6863244a25.html":[3,0,1,1], +"dir_dc36fd7496f87f6989d6d6a9445d600c.html":[3,0,1,0,0,0], +"dir_fbf157f01b55b8656afa0c9222ffb8e3.html":[3,0,1,1,1], +"exceptions_2bindings_8cpp.html":[3,0,1,2,1,0], +"exceptions_2bindings_8cpp.html#a0d1724835bd91e4c4a57b8310617e232":[3,0,1,2,1,0,0], +"exceptions_2bindings_8h.html":[3,0,1,2,1,1], +"exceptions_2bindings_8h.html#a07fe69daeed3aff04bd7af1a4e3dbe6b":[3,0,1,2,1,1,0], +"exceptions_8h.html":[3,0,1,0,0,1,0], +"files.html":[3,0], +"functions.html":[2,3,0], +"functions_func.html":[2,3,1], +"functions_vars.html":[2,3,2], +"globals.html":[3,1,0], +"globals_func.html":[3,1,1], +"hierarchy.html":[2,2], "index.html":[], -"index.html#autotoc_md1":[0], -"index.html#autotoc_md2":[1], -"index.html#autotoc_md3":[1,0], -"index.html#autotoc_md4":[1,0,0], -"index.html#autotoc_md5":[1,1], -"index.html#autotoc_md6":[1,2], -"index.html#autotoc_md7":[1,3], -"index.html#autotoc_md8":[2], -"mapping_8cpp.html":[5,0,1,1,1,1], -"mapping_8h.html":[5,0,1,0,0,2,1], -"mesh_8cpp.html":[5,0,1,1,0,0], -"mesh_8h.html":[5,0,1,0,0,1,0], -"mesh__utils_8cpp.html":[5,0,1,1,2,0], -"mesh__utils_8h.html":[5,0,1,0,0,3,0], -"namespacemembers.html":[3,1,0], -"namespacemembers_enum.html":[3,1,2], -"namespacemembers_func.html":[3,1,1], -"namespaces.html":[3,0], -"namespacestroid.html":[3,0,0], -"namespacestroid_1_1_i_o.html":[3,0,0,1], -"namespacestroid_1_1_i_o.html#a496f5c16eaffda5922a0b96c1f525dab":[3,0,0,1,3], -"namespacestroid_1_1_i_o.html#a8100e130b3a49fdee48bc3c4d4e63963":[3,0,0,1,4], -"namespacestroid_1_1_i_o.html#ab4c8bda7ab370e34376a7832fbf0951e":[3,0,0,1,2], -"namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6e":[3,0,0,1,0], -"namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eab50339a10e1de285ac99d4c3990b8693":[3,0,0,1,0,0], -"namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eac31a2fe3e97d218a154c1947b43d6bbf":[3,0,0,1,0,1], -"namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eaee96e14c2b71bd59252006289ba464cf":[3,0,0,1,0,2], -"namespacestroid_1_1_i_o.html#aeb567ddc70ff2d064c139dee87575830":[3,0,0,1,1], -"namespacestroid_1_1config.html":[3,0,0,0], -"namespacestroid_1_1topology.html":[3,0,0,2], -"namespacestroid_1_1topology.html#a03f0b29ccf7d427a175de9ff75824b7c":[3,0,0,2,0], -"namespacestroid_1_1topology.html#a394e33bdfafdaccd6edfaae0642d3456":[3,0,0,2,7], -"namespacestroid_1_1topology.html#a5907aa2e639cda703d48d177abc37caf":[3,0,0,2,6], -"namespacestroid_1_1topology.html#a59c54a10f726d323f8506b4a2edd7467":[3,0,0,2,1], -"namespacestroid_1_1topology.html#a62774bcba7ea1a485892dcd4bed6425b":[3,0,0,2,4], -"namespacestroid_1_1topology.html#a7fbf58c40c03bc751d53f4a3273744fc":[3,0,0,2,2], -"namespacestroid_1_1topology.html#a836ed13e5bac63e7952c3ce4e5532e78":[3,0,0,2,5], -"namespacestroid_1_1topology.html#abc0d8a1fb8e9c5ac0e259e4c93db7892":[3,0,0,2,3], -"namespacestroid_1_1utils.html":[3,0,0,3], -"namespacestroid_1_1utils.html#a22ab5809195bf85156607790f82b5e2d":[3,0,0,3,1], -"namespacestroid_1_1utils.html#ae047d97d7d5dc12812395909d00f5bbe":[3,0,0,3,0], +"index.html#autotoc_md0":[0], +"index.html#autotoc_md1":[0,0], +"index.html#autotoc_md10":[0,1,5], +"index.html#autotoc_md11":[0,2], +"index.html#autotoc_md12":[0,3], +"index.html#autotoc_md2":[0,1], +"index.html#autotoc_md3":[0,1,0], +"index.html#autotoc_md4":[0,1,0,0], +"index.html#autotoc_md5":[0,1,1], +"index.html#autotoc_md6":[0,1,2], +"index.html#autotoc_md7":[0,1,3], +"index.html#autotoc_md8":[0,1,4], +"index.html#autotoc_md9":[0,1,4,0], +"mapping_8cpp.html":[3,0,1,1,2,1], +"mapping_8h.html":[3,0,1,0,0,4,1], +"mesh_8cpp.html":[3,0,1,1,0,0], +"mesh_8h.html":[3,0,1,0,0,2,0], +"mesh__stats_8cpp.html":[3,0,1,1,3,0], +"mesh__stats_8h.html":[3,0,1,0,0,5,0], +"mesh__utils_8cpp.html":[3,0,1,1,3,1], +"mesh__utils_8h.html":[3,0,1,0,0,5,1], +"namespacemembers.html":[1,1,0], +"namespacemembers_enum.html":[1,1,3], +"namespacemembers_func.html":[1,1,1], +"namespacemembers_vars.html":[1,1,2], +"namespaces.html":[1,0], +"namespacestroid.html":[1,0,0], +"namespacestroid.html#a009af3074e8681e87067228deab670d6":[1,0,0,10], +"namespacestroid.html#a0980d815006142018342badd4a344b75":[1,0,0,14], +"namespacestroid.html#a2e8a90a2a7e9606de8b07cf330c0fd8d":[1,0,0,12], +"namespacestroid.html#a46eadd157b4003bbf1df5f46df72ecf6":[1,0,0,15], +"namespacestroid.html#a66665c450e6087c6d5d85fe337229886":[1,0,0,17], +"namespacestroid.html#a6c6c3bffa4c5eaa2cbfa16072a66ec85":[1,0,0,19], +"namespacestroid.html#a6c93a0ee650df592ef5c32c3e6b110e0":[1,0,0,21], +"namespacestroid.html#a7515d5089908807b72e300799c8e6d8a":[1,0,0,20], +"namespacestroid.html#a7aa709789d28ac6d51079f35b030fb7b":[1,0,0,16], +"namespacestroid.html#a82f32fe152e5f48927bba40b0131c047":[1,0,0,18], +"namespacestroid.html#a90f6d065df7b5224bbfc04c6d89c467e":[1,0,0,9], +"namespacestroid.html#a90f6d065df7b5224bbfc04c6d89c467ea7b804a28d6154ab8007287532037f1d0":[1,0,0,9,0], +"namespacestroid.html#a90f6d065df7b5224bbfc04c6d89c467eadf13a99b035d6f0bce4f44ab18eec8eb":[1,0,0,9,1], +"namespacestroid.html#ae9643927d87d14a87970569dd0d8f3ae":[1,0,0,11], +"namespacestroid.html#af6ce344ae299e3ad50f4ad30f3e98fb4":[1,0,0,13], +"namespacestroid_1_1_i_o.html":[1,0,0,2], +"namespacestroid_1_1_i_o.html#a20ae517986b9c27d23ef5f0ab704b247":[1,0,0,2,3], +"namespacestroid_1_1_i_o.html#a26155a525b34257a3eb2305e477b6bef":[1,0,0,2,11], +"namespacestroid_1_1_i_o.html#a3f39dc149d5650468b579c76d00f991d":[1,0,0,2,1], +"namespacestroid_1_1_i_o.html#a516d260163e0b6ac000b301b0b8cf4bb":[1,0,0,2,12], +"namespacestroid_1_1_i_o.html#a6491a99d6d2859b2c098b94f2f8171d3":[1,0,0,2,9], +"namespacestroid_1_1_i_o.html#a7426b1e664be45cbf791167748d4feb8":[1,0,0,2,2], +"namespacestroid_1_1_i_o.html#a7bc6daa0f9ef8327355022363e1db3fb":[1,0,0,2,10], +"namespacestroid_1_1_i_o.html#ab4c8bda7ab370e34376a7832fbf0951e":[1,0,0,2,8], +"namespacestroid_1_1_i_o.html#ab854167b428c1a77597d9bb3a972b363":[1,0,0,2,6], +"namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6e":[1,0,0,2,0], +"namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eab50339a10e1de285ac99d4c3990b8693":[1,0,0,2,0,0], +"namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eac31a2fe3e97d218a154c1947b43d6bbf":[1,0,0,2,0,1], +"namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eaee96e14c2b71bd59252006289ba464cf":[1,0,0,2,0,2], +"namespacestroid_1_1_i_o.html#ad7721ff3eda0ad42365955ea33da2b0a":[1,0,0,2,5], +"namespacestroid_1_1_i_o.html#ae0fc8e0663da26ff11be71fb1b5a0b0e":[1,0,0,2,7], +"namespacestroid_1_1_i_o.html#aeb567ddc70ff2d064c139dee87575830":[1,0,0,2,4], +"namespacestroid_1_1config.html":[1,0,0,0], +"namespacestroid_1_1config.html#a4f2409cb05fd572794c115d850502d61":[1,0,0,0,3], +"namespacestroid_1_1config.html#a84d2f4618367487820ac818c3c47a39a":[1,0,0,0,2], +"namespacestroid_1_1exceptions.html":[1,0,0,1], +"namespacestroid_1_1refinement.html":[1,0,0,3], +"namespacestroid_1_1refinement.html#a1f203a99bc3096f62f7584fd4c19122c":[1,0,0,3,0], +"namespacestroid_1_1stats.html":[1,0,0,4], +"namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0b":[1,0,0,4,17], +"namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0ba02312d94a54441cc7aad47b6b8c7ba8b":[1,0,0,4,17,4], +"namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0ba04597115f4cfe4f00ab913b138f9737c":[1,0,0,4,17,11], +"namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0ba5bdefb03d20a6c116d32b5b93a8864ee":[1,0,0,4,17,10], +"namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0ba5c6d0ec312d680ed011756648c9e96ea":[1,0,0,4,17,1], +"namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0ba70842c6aface1f8fa1b768e1bb3bf838":[1,0,0,4,17,2], +"namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0ba88c0e60987a0d44ef4266f558cb48745":[1,0,0,4,17,14], +"namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0baa0ebc2630ca56b33be79e9cb185c82a8":[1,0,0,4,17,3], +"namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0baa12585f79218cb7ea1a513dc1c199ed3":[1,0,0,4,17,7], +"namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0baa17731be24258d84478f18a2fd8f1375":[1,0,0,4,17,12], +"namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0baad0a4a5de10ac242513fbe1b1ec8bc72":[1,0,0,4,17,8], +"namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0bab3a7fb4a75fcc5a075c381ead228fc30":[1,0,0,4,17,9], +"namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0bab50339a10e1de285ac99d4c3990b8693":[1,0,0,4,17,0], +"namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0bab86901c03c7833ecb978328d373151fb":[1,0,0,4,17,6], +"namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0bad038f7f4555c488a5005db9e2f0443df":[1,0,0,4,17,5], +"namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0bafb2ea1ec7b3bc42e65a0c3969dfe74f2":[1,0,0,4,17,13], +"namespacestroid_1_1stats.html#a21e8241876e1cbc528cee709f689c57d":[1,0,0,4,20], +"namespacestroid_1_1stats.html#a2cf88dcec613ac6cbba6cd50d9ee3030":[1,0,0,4,25], +"namespacestroid_1_1stats.html#a47615fc0593b7a4583d0b7234422352d":[1,0,0,4,23], +"namespacestroid_1_1stats.html#a7f172dcff314b460d3ba69a2550234f0":[1,0,0,4,24], +"namespacestroid_1_1stats.html#ab93ded74aa6cb2bf7b3c11467ee550d5":[1,0,0,4,22], +"namespacestroid_1_1stats.html#ae11c13445f32b7daac1d787114af2eae":[1,0,0,4,19], +"namespacestroid_1_1stats.html#ae340adbe2df53adc3946e8df38dd1acf":[1,0,0,4,18], +"namespacestroid_1_1stats.html#ae58ee763f9a05f52759d74f06d4ebebf":[1,0,0,4,21], +"namespacestroid_1_1topology.html":[1,0,0,5], +"namespacestroid_1_1topology.html#a03f0b29ccf7d427a175de9ff75824b7c":[1,0,0,5,1], +"namespacestroid_1_1topology.html#a11783fac833cd43c7c59d712912795a8":[1,0,0,5,7], +"namespacestroid_1_1topology.html#a394e33bdfafdaccd6edfaae0642d3456":[1,0,0,5,12], +"namespacestroid_1_1topology.html#a4ea968d066cf63e5bb1e68150facdec1":[1,0,0,5,9], +"namespacestroid_1_1topology.html#a5907aa2e639cda703d48d177abc37caf":[1,0,0,5,11], +"namespacestroid_1_1topology.html#a59c54a10f726d323f8506b4a2edd7467":[1,0,0,5,2], +"namespacestroid_1_1topology.html#a5ab92f7fb487c4639042539bf7b86606":[1,0,0,5,5], +"namespacestroid_1_1topology.html#a62774bcba7ea1a485892dcd4bed6425b":[1,0,0,5,8], +"namespacestroid_1_1topology.html#a7fbf58c40c03bc751d53f4a3273744fc":[1,0,0,5,3], +"namespacestroid_1_1topology.html#a836ed13e5bac63e7952c3ce4e5532e78":[1,0,0,5,10], +"namespacestroid_1_1topology.html#abc0d8a1fb8e9c5ac0e259e4c93db7892":[1,0,0,5,6], +"namespacestroid_1_1topology.html#ac52b5393b5f5accf0337c34efca891f0":[1,0,0,5,4], +"namespacestroid_1_1utils.html":[1,0,0,6], +"namespacestroid_1_1utils.html#a22ab5809195bf85156607790f82b5e2d":[1,0,0,6,4], +"namespacestroid_1_1utils.html#aa81cc28e65c9208a29a6aa9c51ba5126":[1,0,0,6,1], +"namespacestroid_1_1utils.html#ad6d849312ba094bda29ab3adf2326435":[1,0,0,6,2], +"namespacestroid_1_1utils.html#ae047d97d7d5dc12812395909d00f5bbe":[1,0,0,6,3], +"namespacestroid_1_1utils_1_1term__support.html":[1,0,0,6,0], +"namespacestroid_1_1utils_1_1term__support.html#a0e871b574a49204ac4fb57b92aeeb573":[1,0,0,6,0,1], +"namespacestroid_1_1utils_1_1term__support.html#a6279f1127697238734116e12a66ea525":[1,0,0,6,0,0], +"optimize_8cpp.html":[3,0,1,1,2,2], +"optimize_8h.html":[3,0,1,0,0,4,2], "pages.html":[], -"structstroid_1_1config_1_1_mesh_config.html":[3,0,0,0,0], -"structstroid_1_1config_1_1_mesh_config.html":[4,0,0,0,0], -"structstroid_1_1config_1_1_mesh_config.html#a062652781f4f3ea0b7ca8764362a7368":[3,0,0,0,0,4], -"structstroid_1_1config_1_1_mesh_config.html#a062652781f4f3ea0b7ca8764362a7368":[4,0,0,0,0,4], -"structstroid_1_1config_1_1_mesh_config.html#a2faa5aa1fef84ebbda30590d3fb2799b":[3,0,0,0,0,0], -"structstroid_1_1config_1_1_mesh_config.html#a2faa5aa1fef84ebbda30590d3fb2799b":[4,0,0,0,0,0], -"structstroid_1_1config_1_1_mesh_config.html#a33f25ff277aa8834065e04ccb9cdbdda":[3,0,0,0,0,12], -"structstroid_1_1config_1_1_mesh_config.html#a33f25ff277aa8834065e04ccb9cdbdda":[4,0,0,0,0,12], -"structstroid_1_1config_1_1_mesh_config.html#a36c7b05405691393d381086a27ea36ad":[3,0,0,0,0,13], -"structstroid_1_1config_1_1_mesh_config.html#a36c7b05405691393d381086a27ea36ad":[4,0,0,0,0,13], -"structstroid_1_1config_1_1_mesh_config.html#a3fe80a30990d484dcc39b6f9a0befc05":[3,0,0,0,0,10], -"structstroid_1_1config_1_1_mesh_config.html#a3fe80a30990d484dcc39b6f9a0befc05":[4,0,0,0,0,10], -"structstroid_1_1config_1_1_mesh_config.html#a4da6d99ff7ba24d2f917e1fd98ddd877":[3,0,0,0,0,9], -"structstroid_1_1config_1_1_mesh_config.html#a4da6d99ff7ba24d2f917e1fd98ddd877":[4,0,0,0,0,9], -"structstroid_1_1config_1_1_mesh_config.html#a5c68a895f73dc82a38a8daac22a83ad7":[3,0,0,0,0,7], -"structstroid_1_1config_1_1_mesh_config.html#a5c68a895f73dc82a38a8daac22a83ad7":[4,0,0,0,0,7], -"structstroid_1_1config_1_1_mesh_config.html#a64cb00c8cba27267279a52207a4b5be0":[3,0,0,0,0,5], -"structstroid_1_1config_1_1_mesh_config.html#a64cb00c8cba27267279a52207a4b5be0":[4,0,0,0,0,5], -"structstroid_1_1config_1_1_mesh_config.html#a860e78f1906acb0c3aa08d55f94de3fd":[3,0,0,0,0,6], -"structstroid_1_1config_1_1_mesh_config.html#a860e78f1906acb0c3aa08d55f94de3fd":[4,0,0,0,0,6], -"structstroid_1_1config_1_1_mesh_config.html#a8cafcbebf64ae251517118eb152de981":[3,0,0,0,0,11], -"structstroid_1_1config_1_1_mesh_config.html#a8cafcbebf64ae251517118eb152de981":[4,0,0,0,0,11], -"structstroid_1_1config_1_1_mesh_config.html#ac7546899ebbfe191ea3a8bf2403b31eb":[3,0,0,0,0,8], -"structstroid_1_1config_1_1_mesh_config.html#ac7546899ebbfe191ea3a8bf2403b31eb":[4,0,0,0,0,8], -"structstroid_1_1config_1_1_mesh_config.html#ac99aa48fe3e71e2ef57b09d48cacfef8":[3,0,0,0,0,2], -"structstroid_1_1config_1_1_mesh_config.html#ac99aa48fe3e71e2ef57b09d48cacfef8":[4,0,0,0,0,2], -"structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d":[3,0,0,0,0,1], -"structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d":[4,0,0,0,0,1], -"structstroid_1_1config_1_1_mesh_config.html#affad4638b0ae7b710f2b2db992f6f584":[3,0,0,0,0,3], -"structstroid_1_1config_1_1_mesh_config.html#affad4638b0ae7b710f2b2db992f6f584":[4,0,0,0,0,3], -"topology_8cpp.html":[5,0,1,1,1,2], -"topology_8h.html":[5,0,1,0,0,2,2] +"refinement_2bindings_8cpp.html":[3,0,1,2,3,0], +"refinement_2bindings_8cpp.html#ab457d5978c9b5107bb7e4801a627e408":[3,0,1,2,3,0,0], +"refinement_2bindings_8h.html":[3,0,1,2,3,1], +"refinement_2bindings_8h.html#ab457d5978c9b5107bb7e4801a627e408":[3,0,1,2,3,1,0], +"stroid_8h.html":[3,0,1,0,0,6], +"stroid__error_8h.html":[3,0,1,0,0,1,1], +"structstd_1_1formatter_3_01stroid_1_1stats_1_1_mesh_stats_00_01char_01_4.html":[2,0,0,0], +"structstd_1_1formatter_3_01stroid_1_1stats_1_1_mesh_stats_00_01char_01_4.html#a5d094b37e1f7fb75a026caa53017a729":[2,0,0,0,0], +"structstd_1_1formatter_3_01stroid_1_1stats_1_1_mesh_stats_00_01char_01_4.html#aa5aff01f1056ee2efe792c2d72c4116f":[2,0,0,0,1], +"structstroid_1_1_scalar_mesh_field.html":[1,0,0,7], +"structstroid_1_1_scalar_mesh_field.html":[2,0,1,4], +"structstroid_1_1_scalar_mesh_field.html#a12cda68a035989b8c8723228c553c4f3":[1,0,0,7,0], +"structstroid_1_1_scalar_mesh_field.html#a12cda68a035989b8c8723228c553c4f3":[2,0,1,4,0], +"structstroid_1_1_scalar_mesh_field.html#a3e499d9153e0476aca7ed1ddd588955a":[1,0,0,7,1], +"structstroid_1_1_scalar_mesh_field.html#a3e499d9153e0476aca7ed1ddd588955a":[2,0,1,4,1], +"structstroid_1_1_stroid_mesh.html":[1,0,0,8], +"structstroid_1_1_stroid_mesh.html":[2,0,1,5], +"structstroid_1_1_stroid_mesh.html#a07a3ec8a5c4c8bace402c9be7a6f507a":[1,0,0,8,7], +"structstroid_1_1_stroid_mesh.html#a07a3ec8a5c4c8bace402c9be7a6f507a":[2,0,1,5,7], +"structstroid_1_1_stroid_mesh.html#a3dd1a14571aa04ca0cc3d26575f59238":[1,0,0,8,4], +"structstroid_1_1_stroid_mesh.html#a3dd1a14571aa04ca0cc3d26575f59238":[2,0,1,5,4], +"structstroid_1_1_stroid_mesh.html#a4694d871553f366fc400789f90e373f4":[1,0,0,8,2], +"structstroid_1_1_stroid_mesh.html#a4694d871553f366fc400789f90e373f4":[2,0,1,5,2], +"structstroid_1_1_stroid_mesh.html#a48164419b9465d536daa0d98067a7f06":[1,0,0,8,0], +"structstroid_1_1_stroid_mesh.html#a48164419b9465d536daa0d98067a7f06":[2,0,1,5,0], +"structstroid_1_1_stroid_mesh.html#a69857c53a09211c3534f02546b3302f3":[1,0,0,8,1], +"structstroid_1_1_stroid_mesh.html#a69857c53a09211c3534f02546b3302f3":[2,0,1,5,1], +"structstroid_1_1_stroid_mesh.html#a6ee2e855b58552ac9204b6b85f5ade1a":[1,0,0,8,5], +"structstroid_1_1_stroid_mesh.html#a6ee2e855b58552ac9204b6b85f5ade1a":[2,0,1,5,5], +"structstroid_1_1_stroid_mesh.html#a9af4e08813eea77876b2b96d8808cc12":[1,0,0,8,3], +"structstroid_1_1_stroid_mesh.html#a9af4e08813eea77876b2b96d8808cc12":[2,0,1,5,3], +"structstroid_1_1_stroid_mesh.html#adf3dbee5d8007eaccce931b173a87c12":[1,0,0,8,8], +"structstroid_1_1_stroid_mesh.html#adf3dbee5d8007eaccce931b173a87c12":[2,0,1,5,8], +"structstroid_1_1_stroid_mesh.html#aeab0bdbed61328156f313289a74296de":[1,0,0,8,9], +"structstroid_1_1_stroid_mesh.html#aeab0bdbed61328156f313289a74296de":[2,0,1,5,9], +"structstroid_1_1_stroid_mesh.html#af7b9694404b23d3134d84b7b8149940d":[1,0,0,8,6], +"structstroid_1_1_stroid_mesh.html#af7b9694404b23d3134d84b7b8149940d":[2,0,1,5,6] }; diff --git a/docs/html/search/all_0.js b/docs/html/search/all_0.js index 041f46c..f104d31 100644 --- a/docs/html/search/all_0.js +++ b/docs/html/search/all_0.js @@ -1,8 +1,13 @@ var searchData= [ - ['a_20multi_20block_20mesh_20generation_20tool_20for_20stellar_20modeling_0',['A multi-block mesh generation tool for stellar modeling',['../index.html#autotoc_md1',1,'']]], - ['and_20installing_1',['Building and Installing',['../index.html#autotoc_md2',1,'']]], - ['applyequiangular_2',['ApplyEquiangular',['../namespacestroid_1_1topology.html#a03f0b29ccf7d427a175de9ff75824b7c',1,'stroid::topology']]], - ['applykelvin_3',['ApplyKelvin',['../namespacestroid_1_1topology.html#a59c54a10f726d323f8506b4a2edd7467',1,'stroid::topology']]], - ['applyspheroidal_4',['ApplySpheroidal',['../namespacestroid_1_1topology.html#a7fbf58c40c03bc751d53f4a3273744fc',1,'stroid::topology']]] + ['_5f_5fall_5f_5f_0',['__all__',['../namespacestroid.html#af6ce344ae299e3ad50f4ad30f3e98fb4',1,'stroid']]], + ['_5f_5fauthor_5f_5f_1',['__author__',['../namespacestroid.html#a0980d815006142018342badd4a344b75',1,'stroid']]], + ['_5f_5fdescription_5f_5f_2',['__description__',['../namespacestroid.html#a46eadd157b4003bbf1df5f46df72ecf6',1,'stroid']]], + ['_5f_5femail_5f_5f_3',['__email__',['../namespacestroid.html#a7aa709789d28ac6d51079f35b030fb7b',1,'stroid']]], + ['_5f_5finit_5f_5f_2epy_4',['__init__.py',['../____init_____8py.html',1,'']]], + ['_5f_5flicense_5f_5f_5',['__license__',['../namespacestroid.html#a66665c450e6087c6d5d85fe337229886',1,'stroid']]], + ['_5f_5furl_5f_5f_6',['__url__',['../namespacestroid.html#a82f32fe152e5f48927bba40b0131c047',1,'stroid']]], + ['_5f_5fversion_5f_5f_7',['__version__',['../namespacestroid.html#a6c6c3bffa4c5eaa2cbfa16072a66ec85',1,'stroid']]], + ['_5fmeta_8',['_meta',['../namespacestroid.html#a7515d5089908807b72e300799c8e6d8a',1,'stroid']]], + ['_5fpackage_5fdir_9',['_PACKAGE_DIR',['../namespacestroid.html#a6c93a0ee650df592ef5c32c3e6b110e0',1,'stroid']]] ]; diff --git a/docs/html/search/all_1.js b/docs/html/search/all_1.js index 6b3970d..3ad4277 100644 --- a/docs/html/search/all_1.js +++ b/docs/html/search/all_1.js @@ -1,8 +1,16 @@ var searchData= [ - ['block_20mesh_20generation_20tool_20for_20stellar_20modeling_0',['A multi-block mesh generation tool for stellar modeling',['../index.html#autotoc_md1',1,'']]], - ['boundary_5felement_5fid_1',['BOUNDARY_ELEMENT_ID',['../namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eaee96e14c2b71bd59252006289ba464cf',1,'stroid::IO']]], - ['building_2',['Building',['../index.html#autotoc_md3',1,'']]], - ['building_20and_20installing_3',['Building and Installing',['../index.html#autotoc_md2',1,'']]], - ['buildskeleton_4',['BuildSkeleton',['../namespacestroid_1_1topology.html#abc0d8a1fb8e9c5ac0e259e4c93db7892',1,'stroid::topology']]] + ['a_20multi_20block_20mesh_20generation_20tool_20for_20stellar_20modeling_0',['A multi-block mesh generation tool for stellar modeling',['../index.html#autotoc_md1',1,'']]], + ['all_1',['all',['../structstroid_1_1stats_1_1_refinement_stats.html#ac21dcc8f06bb0e9d089a463cb8834d61',1,'stroid::stats::RefinementStats']]], + ['analytic_5farea_2',['analytic_area',['../structstroid_1_1stats_1_1_volume_area_stats.html#a3c8025493e76cc6b6e4ec7b14e64b92f',1,'stroid::stats::VolumeAreaStats']]], + ['analytic_5fvolume_3',['analytic_volume',['../structstroid_1_1stats_1_1_volume_area_stats.html#aaad927ad1fc223bb22aaf9ca3b176349',1,'stroid::stats::VolumeAreaStats']]], + ['and_20installing_4',['Building and Installing',['../index.html#autotoc_md2',1,'']]], + ['applyequiangular_5',['ApplyEquiangular',['../namespacestroid_1_1topology.html#a03f0b29ccf7d427a175de9ff75824b7c',1,'stroid::topology']]], + ['applykelvin_6',['ApplyKelvin',['../namespacestroid_1_1topology.html#a59c54a10f726d323f8506b4a2edd7467',1,'stroid::topology']]], + ['applyspheroidal_7',['ApplySpheroidal',['../namespacestroid_1_1topology.html#a7fbf58c40c03bc751d53f4a3273744fc',1,'stroid::topology']]], + ['applytmop_8',['ApplyTMOP',['../namespacestroid_1_1topology.html#ac52b5393b5f5accf0337c34efca891f0',1,'stroid::topology']]], + ['as_5fmesh_9',['as_mesh',['../structstroid_1_1_stroid_mesh.html#a48164419b9465d536daa0d98067a7f06',1,'stroid::StroidMesh']]], + ['axes_10',['AXES',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0ba70842c6aface1f8fa1b768e1bb3bf838',1,'stroid::stats']]], + ['axes_11',['axes',['../structstroid_1_1stats_1_1_mesh_stats.html#a51812afb0c88452c015c353729e54456',1,'stroid::stats::MeshStats']]], + ['axisstats_12',['AxisStats',['../structstroid_1_1stats_1_1_axis_stats.html',1,'stroid::stats']]] ]; diff --git a/docs/html/search/all_10.js b/docs/html/search/all_10.js index 01d80e6..b37f5ac 100644 --- a/docs/html/search/all_10.js +++ b/docs/html/search/all_10.js @@ -1,7 +1,31 @@ var searchData= [ - ['vacuum_5fid_0',['vacuum_id',['../structstroid_1_1config_1_1_mesh_config.html#a36c7b05405691393d381086a27ea36ad',1,'stroid::config::MeshConfig']]], - ['viewmesh_1',['ViewMesh',['../namespacestroid_1_1_i_o.html#a496f5c16eaffda5922a0b96c1f525dab',1,'stroid::IO']]], - ['visualization_5fmode_2',['VISUALIZATION_MODE',['../namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6e',1,'stroid::IO']]], - ['visualizefacevalence_3',['VisualizeFaceValence',['../namespacestroid_1_1_i_o.html#a8100e130b3a49fdee48bc3c4d4e63963',1,'stroid::IO']]] + ['r0_5f_0',['r0_',['../classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a3dca19d6e83defa4e20eac9a14d201bf',1,'stroid::topology::TMOPProgressBar']]], + ['r_5fcore_1',['r_core',['../structstroid_1_1config_1_1_mesh_config.html#a497cda69d9e7a3e9b96960d25d0f37de',1,'stroid::config::MeshConfig::r_core'],['../structstroid_1_1stats_1_1_config_meta.html#a772a5b8e8e5921b77aeccdd26e7519c3',1,'stroid::stats::ConfigMeta::r_core']]], + ['r_5finfinity_2',['r_infinity',['../structstroid_1_1config_1_1_mesh_config.html#af181d2f6285ad8203025453d434e091e',1,'stroid::config::MeshConfig::r_infinity'],['../structstroid_1_1stats_1_1_config_meta.html#aab0ae2768392a6a54ddf2cabcd01bb34',1,'stroid::stats::ConfigMeta::r_infinity']]], + ['r_5finstability_3',['r_instability',['../structstroid_1_1config_1_1_mesh_config.html#a882ce722c90fbd1792425f06577fa361',1,'stroid::config::MeshConfig']]], + ['r_5fstar_4',['r_star',['../structstroid_1_1config_1_1_mesh_config.html#ae54149369309132d3058c21a0556c14f',1,'stroid::config::MeshConfig::r_star'],['../structstroid_1_1stats_1_1_config_meta.html#a33afee8817cbde2bf2c9c05c49c3f52f',1,'stroid::stats::ConfigMeta::r_star']]], + ['radius_5',['RADIUS',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0ba5c6d0ec312d680ed011756648c9e96ea',1,'stroid::stats']]], + ['radius_6',['radius',['../structstroid_1_1stats_1_1_mesh_stats.html#ad8a1ea1e3f75e620d52bd40fe32fb14e',1,'stroid::stats::MeshStats']]], + ['radius_5funiformity_7',['radius_uniformity',['../structstroid_1_1stats_1_1_ellipticity_stats.html#a43532c817c2b906932b753ae7da0f3c9',1,'stroid::stats::EllipticityStats']]], + ['radiusstats_8',['RadiusStats',['../structstroid_1_1stats_1_1_radius_stats.html',1,'stroid::stats']]], + ['ref_5fas_5fmesh_9',['ref_as_mesh',['../structstroid_1_1_stroid_mesh.html#a9af4e08813eea77876b2b96d8808cc12',1,'stroid::StroidMesh']]], + ['reference_5fmesh_10',['reference_mesh',['../structstroid_1_1_stroid_mesh.html#a07a3ec8a5c4c8bace402c9be7a6f507a',1,'stroid::StroidMesh']]], + ['refinement_11',['REFINEMENT',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0ba88c0e60987a0d44ef4266f558cb48745',1,'stroid::stats']]], + ['refinement_12',['refinement',['../index.html#autotoc_md8',1,'Nonconforming vacuum refinement'],['../structstroid_1_1stats_1_1_mesh_stats.html#a0cbee58c3c7f8c0ecff45caf0545249a',1,'stroid::stats::MeshStats::refinement']]], + ['refinement_5flevels_13',['refinement_levels',['../structstroid_1_1config_1_1_mesh_config.html#abb2757a2e4cbd63bb2b878ef5fccb95c',1,'stroid::config::MeshConfig::refinement_levels'],['../structstroid_1_1stats_1_1_config_meta.html#ab2e98d2a4579c3e1d96bb5ac1497ee23',1,'stroid::stats::ConfigMeta::refinement_levels'],['../structstroid_1_1_stroid_mesh.html#adf3dbee5d8007eaccce931b173a87c12',1,'stroid::StroidMesh::refinement_levels']]], + ['refinementstats_14',['RefinementStats',['../structstroid_1_1stats_1_1_refinement_stats.html',1,'stroid::stats']]], + ['regionrefinementstats_15',['RegionRefinementStats',['../structstroid_1_1stats_1_1_region_refinement_stats.html',1,'stroid::stats']]], + ['register_5fconfig_5fbindings_16',['register_config_bindings',['../config_2bindings_8cpp.html#a0f9c77591a52d878643d84e48410945d',1,'register_config_bindings(pybind11::module_ &m): bindings.cpp'],['../config_2bindings_8h.html#a0f9c77591a52d878643d84e48410945d',1,'register_config_bindings(pybind11::module_ &m): bindings.cpp']]], + ['register_5fexceptions_5fbindings_17',['register_exceptions_bindings',['../exceptions_2bindings_8cpp.html#a0d1724835bd91e4c4a57b8310617e232',1,'register_exceptions_bindings(py::module_ &m): bindings.cpp'],['../exceptions_2bindings_8h.html#a07fe69daeed3aff04bd7af1a4e3dbe6b',1,'register_exceptions_bindings(pybind11::module_ &m): bindings.h']]], + ['register_5fio_5fbindings_18',['register_io_bindings',['../_i_o_2bindings_8cpp.html#a62a31f440d644fa1f69dc4742eba7c2f',1,'register_io_bindings(pybind11::module_ &m): bindings.cpp'],['../_i_o_2bindings_8h.html#a62a31f440d644fa1f69dc4742eba7c2f',1,'register_io_bindings(pybind11::module_ &m): bindings.cpp']]], + ['register_5frefinement_5fbindings_19',['register_refinement_bindings',['../refinement_2bindings_8cpp.html#ab457d5978c9b5107bb7e4801a627e408',1,'register_refinement_bindings(pybind11::module_ &m): bindings.cpp'],['../refinement_2bindings_8h.html#ab457d5978c9b5107bb7e4801a627e408',1,'register_refinement_bindings(pybind11::module_ &m): bindings.cpp']]], + ['register_5fstats_5fbindings_20',['register_stats_bindings',['../utils_2bindings_8cpp.html#aa13f29d2de4cb0acf898bdad8b442d16',1,'bindings.cpp']]], + ['register_5ftype_5fbindings_21',['register_type_bindings',['../utils_2bindings_8cpp.html#a11741e6d4fb8ef2ea05c913b79cae916',1,'bindings.cpp']]], + ['register_5futils_5fbindings_22',['register_utils_bindings',['../utils_2bindings_8cpp.html#a400c65a0ad60b176a1857b1ee69d1d71',1,'register_utils_bindings(pybind11::module_ &m): bindings.cpp'],['../utils_2bindings_8h.html#a400c65a0ad60b176a1857b1ee69d1d71',1,'register_utils_bindings(pybind11::module_ &m): bindings.cpp']]], + ['res_5f_23',['res_',['../classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#ae34fd82413c5486cf98bfedfb44c6d35',1,'stroid::topology::TMOPProgressBar']]], + ['resolvedefaults_24',['ResolveDefaults',['../namespacestroid_1_1config.html#a84d2f4618367487820ac818c3c47a39a',1,'stroid::config']]], + ['rms_25',['rms',['../structstroid_1_1stats_1_1_bowing_stats.html#a5de625eedc6c86f9fce5f619b12b5ea0',1,'stroid::stats::BowingStats']]], + ['rtol_5f_26',['rtol_',['../classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a2c840468351cdb60df1900aec220688b',1,'stroid::topology::TMOPProgressBar']]], + ['running_27',['Running',['../index.html#autotoc_md5',1,'']]] ]; diff --git a/docs/html/search/all_2.js b/docs/html/search/all_2.js index 507bf3a..677d6f8 100644 --- a/docs/html/search/all_2.js +++ b/docs/html/search/all_2.js @@ -1,10 +1,20 @@ var searchData= [ - ['c_20interface_0',['C++ Interface',['../index.html#autotoc_md7',1,'']]], - ['config_2eh_1',['config.h',['../config_8h.html',1,'']]], - ['configuration_20file_2',['Configuration File',['../index.html#autotoc_md6',1,'']]], - ['core_5fid_3',['core_id',['../structstroid_1_1config_1_1_mesh_config.html#a2faa5aa1fef84ebbda30590d3fb2799b',1,'stroid::config::MeshConfig']]], - ['core_5fsteepness_4',['core_steepness',['../structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d',1,'stroid::config::MeshConfig']]], - ['curvilinear_2ecpp_5',['curvilinear.cpp',['../curvilinear_8cpp.html',1,'']]], - ['curvilinear_2eh_6',['curvilinear.h',['../curvilinear_8h.html',1,'']]] + ['bar_5fwidth_5f_0',['bar_width_',['../classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a3f92f95c46171f4d85bc1f9cffec48e3',1,'stroid::topology::TMOPProgressBar']]], + ['bindings_2ecpp_1',['bindings.cpp',['../bindings_8cpp.html',1,'(Global Namespace)'],['../config_2bindings_8cpp.html',1,'(Global Namespace)'],['../exceptions_2bindings_8cpp.html',1,'(Global Namespace)'],['../_i_o_2bindings_8cpp.html',1,'(Global Namespace)'],['../refinement_2bindings_8cpp.html',1,'(Global Namespace)'],['../utils_2bindings_8cpp.html',1,'(Global Namespace)']]], + ['bindings_2eh_2',['bindings.h',['../config_2bindings_8h.html',1,'(Global Namespace)'],['../exceptions_2bindings_8h.html',1,'(Global Namespace)'],['../_i_o_2bindings_8h.html',1,'(Global Namespace)'],['../refinement_2bindings_8h.html',1,'(Global Namespace)'],['../utils_2bindings_8h.html',1,'(Global Namespace)']]], + ['block_20mesh_20generation_20tool_20for_20stellar_20modeling_3',['A multi-block mesh generation tool for stellar modeling',['../index.html#autotoc_md1',1,'']]], + ['boundary_5felement_5fid_4',['BOUNDARY_ELEMENT_ID',['../namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eaee96e14c2b71bd59252006289ba464cf',1,'stroid::IO']]], + ['bounding_5fbox_5',['BOUNDING_BOX',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0bafb2ea1ec7b3bc42e65a0c3969dfe74f2',1,'stroid::stats']]], + ['bounding_5fbox_6',['bounding_box',['../structstroid_1_1stats_1_1_mesh_stats.html#ab59ce474426058277b0c5a920915015e',1,'stroid::stats::MeshStats']]], + ['boundingbox_7',['BoundingBox',['../structstroid_1_1stats_1_1_bounding_box.html',1,'stroid::stats']]], + ['boundingboxstats_8',['BoundingBoxStats',['../structstroid_1_1stats_1_1_bounding_box_stats.html',1,'stroid::stats']]], + ['bowing_9',['BOWING',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0ba02312d94a54441cc7aad47b6b8c7ba8b',1,'stroid::stats']]], + ['bowing_10',['bowing',['../structstroid_1_1stats_1_1_mesh_stats.html#a93d000565636a13ef05dd503c0381956',1,'stroid::stats::MeshStats']]], + ['bowingstats_11',['BowingStats',['../structstroid_1_1stats_1_1_bowing_stats.html',1,'stroid::stats']]], + ['buildexteriorcoordinate_12',['BuildExteriorCoordinate',['../namespacestroid_1_1topology.html#a5ab92f7fb487c4639042539bf7b86606',1,'stroid::topology']]], + ['building_13',['Building',['../index.html#autotoc_md3',1,'']]], + ['building_20and_20installing_14',['Building and Installing',['../index.html#autotoc_md2',1,'']]], + ['buildprojected_15',['BuildProjected',['../namespacestroid_1_1utils.html#aa81cc28e65c9208a29a6aa9c51ba5126',1,'stroid::utils']]], + ['buildskeleton_16',['BuildSkeleton',['../namespacestroid_1_1topology.html#abc0d8a1fb8e9c5ac0e259e4c93db7892',1,'stroid::topology']]] ]; diff --git a/docs/html/search/all_3.js b/docs/html/search/all_3.js index fea5a2f..b81673b 100644 --- a/docs/html/search/all_3.js +++ b/docs/html/search/all_3.js @@ -1,5 +1,31 @@ var searchData= [ - ['element_5fid_0',['ELEMENT_ID',['../namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eac31a2fe3e97d218a154c1947b43d6bbf',1,'stroid::IO']]], - ['envelope_5fid_1',['envelope_id',['../structstroid_1_1config_1_1_mesh_config.html#ac99aa48fe3e71e2ef57b09d48cacfef8',1,'stroid::config::MeshConfig']]] + ['c_20interface_0',['C++ Interface',['../index.html#autotoc_md10',1,'']]], + ['centroid_1',['CENTROID',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0ba04597115f4cfe4f00ab913b138f9737c',1,'stroid::stats']]], + ['centroid_2',['centroid',['../structstroid_1_1stats_1_1_mesh_stats.html#acf33442992a504e38b25586c3e07ca28',1,'stroid::stats::MeshStats']]], + ['centroidstats_3',['CentroidStats',['../structstroid_1_1stats_1_1_centroid_stats.html',1,'stroid::stats']]], + ['clone_4',['clone',['../structstroid_1_1_stroid_mesh.html#a69857c53a09211c3534f02546b3302f3',1,'stroid::StroidMesh']]], + ['computed_5',['computed',['../structstroid_1_1stats_1_1_mesh_stats.html#abf86b5cd38826062b0a1a493e7e65da4',1,'stroid::stats::MeshStats']]], + ['computeexteriorcoordinate_6',['ComputeExteriorCoordinate',['../namespacestroid_1_1topology.html#a11783fac833cd43c7c59d712912795a8',1,'stroid::topology']]], + ['computemeshstats_7',['ComputeMeshStats',['../namespacestroid_1_1stats.html#ae340adbe2df53adc3946e8df38dd1acf',1,'stroid::stats']]], + ['conditioned_20core_20mapping_8',['Conditioned core mapping',['../index.html#autotoc_md7',1,'']]], + ['config_9',['config',['../structstroid_1_1_stroid_mesh.html#a3dd1a14571aa04ca0cc3d26575f59238',1,'stroid::StroidMesh']]], + ['config_2eh_10',['config.h',['../config_8h.html',1,'']]], + ['config_5fmeta_11',['CONFIG_META',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0baa17731be24258d84478f18a2fd8f1375',1,'stroid::stats']]], + ['config_5fmeta_12',['config_meta',['../structstroid_1_1stats_1_1_mesh_stats.html#a826463bf69a79deb5f556fda6180c0d7',1,'stroid::stats::MeshStats']]], + ['configmeta_13',['ConfigMeta',['../structstroid_1_1stats_1_1_config_meta.html',1,'stroid::stats']]], + ['configuration_20file_14',['Configuration File',['../index.html#autotoc_md6',1,'']]], + ['conforming_15',['conforming',['../structstroid_1_1stats_1_1_conformity_stats.html#affd2ab3b52411cf4e7d3a3d4f9b331bb',1,'stroid::stats::ConformityStats']]], + ['conformity_16',['CONFORMITY',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0bad038f7f4555c488a5005db9e2f0443df',1,'stroid::stats']]], + ['conformity_17',['conformity',['../structstroid_1_1stats_1_1_mesh_stats.html#ad13cc0c6a5b223ace653825355660bdd',1,'stroid::stats::MeshStats']]], + ['conformitystats_18',['ConformityStats',['../structstroid_1_1stats_1_1_conformity_stats.html',1,'stroid::stats']]], + ['continuity_5forder_19',['continuity_order',['../structstroid_1_1config_1_1_mesh_config.html#ae8bf54f7fd649578d44e46e96f501e34',1,'stroid::config::MeshConfig']]], + ['core_20',['core',['../structstroid_1_1stats_1_1_refinement_stats.html#aa1bd1a7c712813ab7913defe74bc9e13',1,'stroid::stats::RefinementStats::core'],['../structstroid_1_1stats_1_1_element_counts.html#adf8ca94d0323409da0a8e6dd7a09b43d',1,'stroid::stats::ElementCounts::core'],['../structstroid_1_1stats_1_1_bounding_box_stats.html#ae3dcc95d73affc02d81e91f6dcbd5757',1,'stroid::stats::BoundingBoxStats::core']]], + ['core_20mapping_21',['Conditioned core mapping',['../index.html#autotoc_md7',1,'']]], + ['core_5fid_22',['core_id',['../structstroid_1_1config_1_1_mesh_config.html#ad6af127dd2bdcba58dd64eee24378dbe',1,'stroid::config::MeshConfig']]], + ['core_5fmapping_23',['core_mapping',['../structstroid_1_1config_1_1_mesh_config.html#a932e1257cacf5831c216bc3c48d4346d',1,'stroid::config::MeshConfig']]], + ['core_5fsteepness_24',['core_steepness',['../structstroid_1_1config_1_1_mesh_config.html#aae33c48f949858944a6baa6033cebb7b',1,'stroid::config::MeshConfig']]], + ['curved_20meshes_20in_20glvis_25',['Viewing curved meshes in GLVis',['../index.html#autotoc_md9',1,'']]], + ['curvilinear_2ecpp_26',['curvilinear.cpp',['../curvilinear_8cpp.html',1,'']]], + ['curvilinear_2eh_27',['curvilinear.h',['../curvilinear_8h.html',1,'']]] ]; diff --git a/docs/html/search/all_4.js b/docs/html/search/all_4.js index d7f5d4b..05cc60b 100644 --- a/docs/html/search/all_4.js +++ b/docs/html/search/all_4.js @@ -1,8 +1,12 @@ var searchData= [ - ['file_0',['Configuration File',['../index.html#autotoc_md6',1,'']]], - ['finalize_1',['Finalize',['../namespacestroid_1_1topology.html#a62774bcba7ea1a485892dcd4bed6425b',1,'stroid::topology']]], - ['flattening_2',['flattening',['../structstroid_1_1config_1_1_mesh_config.html#affad4638b0ae7b710f2b2db992f6f584',1,'stroid::config::MeshConfig']]], - ['for_20stellar_20modeling_3',['A multi-block mesh generation tool for stellar modeling',['../index.html#autotoc_md1',1,'']]], - ['funding_4',['Funding',['../index.html#autotoc_md8',1,'']]] + ['detj_5fmax_0',['detJ_max',['../structstroid_1_1stats_1_1_jacobian_stats.html#a111e61403f15558c3f18047480851996',1,'stroid::stats::JacobianStats']]], + ['detj_5fmin_1',['detJ_min',['../structstroid_1_1stats_1_1_jacobian_stats.html#a01d0af968bea5acf49ab33ae7120d500',1,'stroid::stats::JacobianStats']]], + ['detj_5fmin_5fat_5fradius_2',['detJ_min_at_radius',['../structstroid_1_1stats_1_1_jacobian_stats.html#ae2e42851b5c866819eadbd761c94248f',1,'stroid::stats::JacobianStats']]], + ['diag_3',['diag',['../structstroid_1_1stats_1_1_bounding_box.html#a20393a20357b339f50471420ac1f55c6',1,'stroid::stats::BoundingBox']]], + ['done_5f_4',['done_',['../classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#afd3e86deff330cd6f65fdffe29aa7d79',1,'stroid::topology::TMOPProgressBar']]], + ['draw_5',['Draw',['../classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a290642ec5c00ffc1f2f79187684e1f5c',1,'stroid::topology::TMOPProgressBar']]], + ['dx_6',['dx',['../structstroid_1_1stats_1_1_bounding_box.html#a64512b188fe9eb8cae05d730aa036729',1,'stroid::stats::BoundingBox']]], + ['dy_7',['dy',['../structstroid_1_1stats_1_1_bounding_box.html#ad1e70dfafca984aaa9fc9868ce6de020',1,'stroid::stats::BoundingBox']]], + ['dz_8',['dz',['../structstroid_1_1stats_1_1_bounding_box.html#a6b1300ee23d6d94e12c3e94c79afd5f3',1,'stroid::stats::BoundingBox']]] ]; diff --git a/docs/html/search/all_5.js b/docs/html/search/all_5.js index f0f8782..74f82e4 100644 --- a/docs/html/search/all_5.js +++ b/docs/html/search/all_5.js @@ -1,4 +1,17 @@ var searchData= [ - ['generation_20tool_20for_20stellar_20modeling_0',['A multi-block mesh generation tool for stellar modeling',['../index.html#autotoc_md1',1,'']]] + ['element_5fcount_0',['ELEMENT_COUNT',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0baad0a4a5de10ac242513fbe1b1ec8bc72',1,'stroid::stats']]], + ['element_5fcounts_1',['element_counts',['../structstroid_1_1stats_1_1_mesh_stats.html#aae74d0872a0b3c0d2dea9529171388fe',1,'stroid::stats::MeshStats']]], + ['element_5fid_2',['ELEMENT_ID',['../namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eac31a2fe3e97d218a154c1947b43d6bbf',1,'stroid::IO']]], + ['elementcounts_3',['ElementCounts',['../structstroid_1_1stats_1_1_element_counts.html',1,'stroid::stats']]], + ['ellipticity_4',['ELLIPTICITY',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0baa0ebc2630ca56b33be79e9cb185c82a8',1,'stroid::stats']]], + ['ellipticity_5',['ellipticity',['../structstroid_1_1stats_1_1_mesh_stats.html#ae9cab419f39d089ba48522385177e6ae',1,'stroid::stats::MeshStats']]], + ['ellipticitystats_6',['EllipticityStats',['../structstroid_1_1stats_1_1_ellipticity_stats.html',1,'stroid::stats']]], + ['envelope_7',['envelope',['../structstroid_1_1stats_1_1_refinement_stats.html#a1c1898450bd29021f9e9ee061932b805',1,'stroid::stats::RefinementStats::envelope'],['../structstroid_1_1stats_1_1_element_counts.html#a5e60266ab6c79811e4e64b09457d2138',1,'stroid::stats::ElementCounts::envelope']]], + ['envelope_5fid_8',['envelope_id',['../structstroid_1_1config_1_1_mesh_config.html#a8d30e307723eba6d964dfbe835532c8e',1,'stroid::config::MeshConfig']]], + ['errors_9',['errors',['../structstroid_1_1stats_1_1_mesh_stats.html#a77dcb0bd9fa7e211c9a14cc6e65da426',1,'stroid::stats::MeshStats']]], + ['example_20meshes_10',['Example Meshes',['../index.html#autotoc_md11',1,'']]], + ['exceptions_2eh_11',['exceptions.h',['../exceptions_8h.html',1,'']]], + ['exportjacobianradialprofile_12',['ExportJacobianRadialProfile',['../namespacestroid_1_1utils.html#ad6d849312ba094bda29ab3adf2326435',1,'stroid::utils']]], + ['exterior_5fcoordinate_13',['exterior_coordinate',['../structstroid_1_1_stroid_mesh.html#a6ee2e855b58552ac9204b6b85f5ade1a',1,'stroid::StroidMesh']]] ]; diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js index 1d61dde..9de50cc 100644 --- a/docs/html/search/all_6.js +++ b/docs/html/search/all_6.js @@ -1,7 +1,10 @@ var searchData= [ - ['include_5fexternal_5fdomain_0',['include_external_domain',['../structstroid_1_1config_1_1_mesh_config.html#a062652781f4f3ea0b7ca8764362a7368',1,'stroid::config::MeshConfig']]], - ['inf_5fbdr_5fid_1',['inf_bdr_id',['../structstroid_1_1config_1_1_mesh_config.html#a64cb00c8cba27267279a52207a4b5be0',1,'stroid::config::MeshConfig']]], - ['installing_2',['Building and Installing',['../index.html#autotoc_md2',1,'']]], - ['interface_3',['C++ Interface',['../index.html#autotoc_md7',1,'']]] + ['file_0',['Configuration File',['../index.html#autotoc_md6',1,'']]], + ['finalize_1',['Finalize',['../namespacestroid_1_1topology.html#a62774bcba7ea1a485892dcd4bed6425b',1,'stroid::topology']]], + ['flattening_2',['flattening',['../structstroid_1_1config_1_1_mesh_config.html#af25094952d1f73e0de4368fe7a5a6f6b',1,'stroid::config::MeshConfig::flattening'],['../structstroid_1_1stats_1_1_ellipticity_stats.html#af7f40620a3fe79497492c59b3a281fc7',1,'stroid::stats::EllipticityStats::flattening'],['../structstroid_1_1stats_1_1_config_meta.html#ae91faf6fc82d7f1b40fbc56a052f3f3b',1,'stroid::stats::ConfigMeta::flattening']]], + ['for_20stellar_20modeling_3',['A multi-block mesh generation tool for stellar modeling',['../index.html#autotoc_md1',1,'']]], + ['format_4',['format',['../structstd_1_1formatter_3_01stroid_1_1stats_1_1_mesh_stats_00_01char_01_4.html#a5d094b37e1f7fb75a026caa53017a729',1,'std::formatter< stroid::stats::MeshStats, char >']]], + ['formatter_3c_20stroid_3a_3astats_3a_3ameshstats_2c_20char_20_3e_5',['formatter< stroid::stats::MeshStats, char >',['../structstd_1_1formatter_3_01stroid_1_1stats_1_1_mesh_stats_00_01char_01_4.html',1,'std']]], + ['funding_6',['Funding',['../index.html#autotoc_md12',1,'']]] ]; diff --git a/docs/html/search/all_7.js b/docs/html/search/all_7.js index 93617ff..37691bc 100644 --- a/docs/html/search/all_7.js +++ b/docs/html/search/all_7.js @@ -1,4 +1,9 @@ var searchData= [ - ['logo_2epng_0',['Logo.png',['../_logo_8png.html',1,'']]] + ['generatemesh_0',['GenerateMesh',['../namespacestroid.html#a009af3074e8681e87067228deab670d6',1,'stroid::GenerateMesh(const fourdst::config::Config< stroid::config::MeshConfig > &input)'],['../namespacestroid.html#a2e8a90a2a7e9606de8b07cf330c0fd8d',1,'stroid::GenerateMesh(const stroid::config::MeshConfig &config)'],['../namespacestroid.html#ae9643927d87d14a87970569dd0d8f3ae',1,'stroid::GenerateMesh(const std::string &filename)']]], + ['generation_20tool_20for_20stellar_20modeling_1',['A multi-block mesh generation tool for stellar modeling',['../index.html#autotoc_md1',1,'']]], + ['geom_5forder_2',['geom_order',['../structstroid_1_1stats_1_1_config_meta.html#ac35acd7f85f35d509cc71cc98c93c4b3',1,'stroid::stats::ConfigMeta']]], + ['geometry_5fdofs_3',['geometry_dofs',['../structstroid_1_1stats_1_1_refinement_stats.html#a12102f92ec997538e42108a941e0f9eb',1,'stroid::stats::RefinementStats']]], + ['geometry_5ftrue_5fdofs_4',['geometry_true_dofs',['../structstroid_1_1stats_1_1_refinement_stats.html#aef469d52ee5d4b95baadfa785bd3e492',1,'stroid::stats::RefinementStats']]], + ['glvis_5',['Viewing curved meshes in GLVis',['../index.html#autotoc_md9',1,'']]] ]; diff --git a/docs/html/search/all_8.js b/docs/html/search/all_8.js index d683c61..4deeb57 100644 --- a/docs/html/search/all_8.js +++ b/docs/html/search/all_8.js @@ -1,16 +1,10 @@ var searchData= [ - ['mainpage_2emd_0',['mainpage.md',['../mainpage_8md.html',1,'']]], - ['mapping_2ecpp_1',['mapping.cpp',['../mapping_8cpp.html',1,'']]], - ['mapping_2eh_2',['mapping.h',['../mapping_8h.html',1,'']]], - ['markflippedboundaryelements_3',['MarkFlippedBoundaryElements',['../namespacestroid_1_1utils.html#ae047d97d7d5dc12812395909d00f5bbe',1,'stroid::utils']]], - ['markflippedelements_4',['MarkFlippedElements',['../namespacestroid_1_1utils.html#a22ab5809195bf85156607790f82b5e2d',1,'stroid::utils']]], - ['mesh_20generation_20tool_20for_20stellar_20modeling_5',['A multi-block mesh generation tool for stellar modeling',['../index.html#autotoc_md1',1,'']]], - ['mesh_2ecpp_6',['mesh.cpp',['../mesh_8cpp.html',1,'']]], - ['mesh_2eh_7',['mesh.h',['../mesh_8h.html',1,'']]], - ['mesh_5futils_2ecpp_8',['mesh_utils.cpp',['../mesh__utils_8cpp.html',1,'']]], - ['mesh_5futils_2eh_9',['mesh_utils.h',['../mesh__utils_8h.html',1,'']]], - ['meshconfig_10',['MeshConfig',['../structstroid_1_1config_1_1_mesh_config.html',1,'stroid::config']]], - ['modeling_11',['A multi-block mesh generation tool for stellar modeling',['../index.html#autotoc_md1',1,'']]], - ['multi_20block_20mesh_20generation_20tool_20for_20stellar_20modeling_12',['A multi-block mesh generation tool for stellar modeling',['../index.html#autotoc_md1',1,'']]] + ['h_5fmax_0',['h_max',['../structstroid_1_1stats_1_1_mesh_size_stats.html#a3b0779500a73ec76fc5ed73b4cd1b1a6',1,'stroid::stats::MeshSizeStats']]], + ['h_5fmean_1',['h_mean',['../structstroid_1_1stats_1_1_mesh_size_stats.html#a5410522df658f2eb224c0d424d90ea9c',1,'stroid::stats::MeshSizeStats']]], + ['h_5fmin_2',['h_min',['../structstroid_1_1stats_1_1_mesh_size_stats.html#ad2962e19a9d72a437108ee971efcf94c',1,'stroid::stats::MeshSizeStats']]], + ['h_5fstddev_3',['h_stddev',['../structstroid_1_1stats_1_1_mesh_size_stats.html#abf51becb7955cdab3a9ff761ffac9802',1,'stroid::stats::MeshSizeStats']]], + ['has_5fexternal_5fdomain_4',['has_external_domain',['../structstroid_1_1stats_1_1_config_meta.html#ae96ed13c82b0d9804c1b361b8df12a27',1,'stroid::stats::ConfigMeta']]], + ['has_5ffeature_5',['has_feature',['../namespacestroid_1_1stats.html#ae11c13445f32b7daac1d787114af2eae',1,'stroid::stats']]], + ['hierarchy_5fenabled_6',['hierarchy_enabled',['../structstroid_1_1stats_1_1_conformity_stats.html#a68d7d7a1eec312c70de354ac23fcefc5',1,'stroid::stats::ConformityStats']]] ]; diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js index bc369c8..4fdca66 100644 --- a/docs/html/search/all_9.js +++ b/docs/html/search/all_9.js @@ -1,4 +1,9 @@ var searchData= [ - ['none_0',['NONE',['../namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eab50339a10e1de285ac99d4c3990b8693',1,'stroid::IO']]] + ['in_20glvis_0',['Viewing curved meshes in GLVis',['../index.html#autotoc_md9',1,'']]], + ['include_5fexternal_5fdomain_1',['include_external_domain',['../structstroid_1_1config_1_1_mesh_config.html#acdb3428f1e33b6826f28334b58023432',1,'stroid::config::MeshConfig']]], + ['inf_5fbdr_5fid_2',['inf_bdr_id',['../structstroid_1_1config_1_1_mesh_config.html#a25dbc70bcd2407ce7deaa0ee61b8886a',1,'stroid::config::MeshConfig']]], + ['installing_3',['Building and Installing',['../index.html#autotoc_md2',1,'']]], + ['interface_4',['C++ Interface',['../index.html#autotoc_md10',1,'']]], + ['iter_5f_5',['iter_',['../classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#ac98804b59cff058b94827e50d5afc5e6',1,'stroid::topology::TMOPProgressBar']]] ]; diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js index 54e4e33..9f75d4f 100644 --- a/docs/html/search/all_a.js +++ b/docs/html/search/all_a.js @@ -1,4 +1,8 @@ var searchData= [ - ['order_0',['order',['../structstroid_1_1config_1_1_mesh_config.html#a860e78f1906acb0c3aa08d55f94de3fd',1,'stroid::config::MeshConfig']]] + ['jacobian_0',['JACOBIAN',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0bab86901c03c7833ecb978328d373151fb',1,'stroid::stats']]], + ['jacobian_1',['jacobian',['../structstroid_1_1stats_1_1_mesh_stats.html#a3570d2d7bd43caadd3b792106539859a',1,'stroid::stats::MeshStats']]], + ['jacobian_5fstellar_2',['jacobian_stellar',['../structstroid_1_1stats_1_1_mesh_stats.html#a82510ea9ff73dda34eed3abfd608f3f9',1,'stroid::stats::MeshStats']]], + ['jacobian_5fvacuum_3',['jacobian_vacuum',['../structstroid_1_1stats_1_1_mesh_stats.html#a693ab0a0303711b46d8652ed3e0957f1',1,'stroid::stats::MeshStats']]], + ['jacobianstats_4',['JacobianStats',['../structstroid_1_1stats_1_1_jacobian_stats.html',1,'stroid::stats']]] ]; diff --git a/docs/html/search/all_b.js b/docs/html/search/all_b.js index 0d4b130..e640888 100644 --- a/docs/html/search/all_b.js +++ b/docs/html/search/all_b.js @@ -1,5 +1,6 @@ var searchData= [ - ['projectmesh_0',['ProjectMesh',['../namespacestroid_1_1topology.html#a836ed13e5bac63e7952c3ce4e5532e78',1,'stroid::topology']]], - ['promotetohighorder_1',['PromoteToHighOrder',['../namespacestroid_1_1topology.html#a5907aa2e639cda703d48d177abc37caf',1,'stroid::topology']]] + ['loadstroidmesh_0',['LoadStroidMesh',['../namespacestroid_1_1_i_o.html#a3f39dc149d5650468b579c76d00f991d',1,'stroid::IO']]], + ['locale_5fname_5flooks_5futf8_1',['locale_name_looks_utf8',['../namespacestroid_1_1utils_1_1term__support.html#a6279f1127697238734116e12a66ea525',1,'stroid::utils::term_support']]], + ['logo_2epng_2',['Logo.png',['../_logo_8png.html',1,'']]] ]; diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js index aa17c56..2fa8698 100644 --- a/docs/html/search/all_c.js +++ b/docs/html/search/all_c.js @@ -1,9 +1,42 @@ var searchData= [ - ['r_5fcore_0',['r_core',['../structstroid_1_1config_1_1_mesh_config.html#a5c68a895f73dc82a38a8daac22a83ad7',1,'stroid::config::MeshConfig']]], - ['r_5finfinity_1',['r_infinity',['../structstroid_1_1config_1_1_mesh_config.html#ac7546899ebbfe191ea3a8bf2403b31eb',1,'stroid::config::MeshConfig']]], - ['r_5finstability_2',['r_instability',['../structstroid_1_1config_1_1_mesh_config.html#a4da6d99ff7ba24d2f917e1fd98ddd877',1,'stroid::config::MeshConfig']]], - ['r_5fstar_3',['r_star',['../structstroid_1_1config_1_1_mesh_config.html#a3fe80a30990d484dcc39b6f9a0befc05',1,'stroid::config::MeshConfig']]], - ['refinement_5flevels_4',['refinement_levels',['../structstroid_1_1config_1_1_mesh_config.html#a8cafcbebf64ae251517118eb152de981',1,'stroid::config::MeshConfig']]], - ['running_5',['Running',['../index.html#autotoc_md5',1,'']]] + ['m_5fmsg_0',['m_msg',['../classstroid_1_1exceptions_1_1_stroid_error.html#a72a77d8747707c16f9fc0dafc28d8e68',1,'stroid::exceptions::StroidError']]], + ['mainpage_2emd_1',['mainpage.md',['../mainpage_8md.html',1,'']]], + ['makeconformingvisualizationmesh_2',['MakeConformingVisualizationMesh',['../namespacestroid_1_1_i_o.html#a7426b1e664be45cbf791167748d4feb8',1,'stroid::IO']]], + ['mapping_3',['Conditioned core mapping',['../index.html#autotoc_md7',1,'']]], + ['mapping_2ecpp_4',['mapping.cpp',['../mapping_8cpp.html',1,'']]], + ['mapping_2eh_5',['mapping.h',['../mapping_8h.html',1,'']]], + ['markflippedboundaryelements_6',['MarkFlippedBoundaryElements',['../namespacestroid_1_1utils.html#ae047d97d7d5dc12812395909d00f5bbe',1,'stroid::utils']]], + ['markflippedelements_7',['MarkFlippedElements',['../namespacestroid_1_1utils.html#a22ab5809195bf85156607790f82b5e2d',1,'stroid::utils']]], + ['max_8',['max',['../structstroid_1_1stats_1_1_radius_stats.html#a5882dc02523bc9286978cc094ad7dd1e',1,'stroid::stats::RadiusStats::max'],['../structstroid_1_1stats_1_1_outer_bounds_stats.html#a9742c345a28c2cd08c53a90409784c18',1,'stroid::stats::OuterBoundsStats::max']]], + ['max_5fdepth_9',['max_depth',['../structstroid_1_1stats_1_1_region_refinement_stats.html#ac60f60e1691d891a0cf251c95db5b1f1',1,'stroid::stats::RegionRefinementStats']]], + ['max_5finward_10',['max_inward',['../structstroid_1_1stats_1_1_bowing_stats.html#a46fbc7270d453feac8b43cb37f9f914b',1,'stroid::stats::BowingStats']]], + ['max_5foutward_11',['max_outward',['../structstroid_1_1stats_1_1_bowing_stats.html#af295a0fb12ac296e7c83ee471684cd49',1,'stroid::stats::BowingStats']]], + ['mean_12',['mean',['../structstroid_1_1stats_1_1_radius_stats.html#a00e43ab1824561bb53414981ffe904c6',1,'stroid::stats::RadiusStats::mean'],['../structstroid_1_1stats_1_1_outer_bounds_stats.html#a398deab3fa723bdccd5cd45f679171a3',1,'stroid::stats::OuterBoundsStats::mean']]], + ['mesh_13',['mesh',['../structstroid_1_1_stroid_mesh.html#af7b9694404b23d3134d84b7b8149940d',1,'stroid::StroidMesh']]], + ['mesh_20generation_20tool_20for_20stellar_20modeling_14',['A multi-block mesh generation tool for stellar modeling',['../index.html#autotoc_md1',1,'']]], + ['mesh_2ecpp_15',['mesh.cpp',['../mesh_8cpp.html',1,'']]], + ['mesh_2eh_16',['mesh.h',['../mesh_8h.html',1,'']]], + ['mesh_5fsize_17',['MESH_SIZE',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0bab3a7fb4a75fcc5a075c381ead228fc30',1,'stroid::stats']]], + ['mesh_5fsize_18',['mesh_size',['../structstroid_1_1stats_1_1_mesh_stats.html#a6a6d113dab3d8063ff001b92787230f1',1,'stroid::stats::MeshStats']]], + ['mesh_5fstat_5fall_19',['MESH_STAT_ALL',['../namespacestroid_1_1stats.html#a7f172dcff314b460d3ba69a2550234f0',1,'stroid::stats']]], + ['mesh_5fstat_5fdefault_20',['MESH_STAT_DEFAULT',['../namespacestroid_1_1stats.html#a2cf88dcec613ac6cbba6cd50d9ee3030',1,'stroid::stats']]], + ['mesh_5fstats_21',['mesh_stats',['../structstroid_1_1_stroid_mesh.html#a4694d871553f366fc400789f90e373f4',1,'stroid::StroidMesh']]], + ['mesh_5fstats_2ecpp_22',['mesh_stats.cpp',['../mesh__stats_8cpp.html',1,'']]], + ['mesh_5fstats_2eh_23',['mesh_stats.h',['../mesh__stats_8h.html',1,'']]], + ['mesh_5futils_2ecpp_24',['mesh_utils.cpp',['../mesh__utils_8cpp.html',1,'']]], + ['mesh_5futils_2eh_25',['mesh_utils.h',['../mesh__utils_8h.html',1,'']]], + ['meshconfig_26',['MeshConfig',['../structstroid_1_1config_1_1_mesh_config.html',1,'stroid::config']]], + ['meshes_27',['Example Meshes',['../index.html#autotoc_md11',1,'']]], + ['meshes_20in_20glvis_28',['Viewing curved meshes in GLVis',['../index.html#autotoc_md9',1,'']]], + ['meshsizestats_29',['MeshSizeStats',['../structstroid_1_1stats_1_1_mesh_size_stats.html',1,'stroid::stats']]], + ['meshstatfeatures_30',['MeshStatFeatures',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0b',1,'stroid::stats']]], + ['meshstats_31',['MeshStats',['../structstroid_1_1stats_1_1_mesh_stats.html',1,'stroid::stats']]], + ['mfem_5fmesh_5ftype_32',['MFEM_MESH_TYPE',['../namespacestroid.html#a90f6d065df7b5224bbfc04c6d89c467e',1,'stroid']]], + ['min_33',['min',['../structstroid_1_1stats_1_1_radius_stats.html#a18903a058a178fd99a68ebe6ffa3454c',1,'stroid::stats::RadiusStats::min'],['../structstroid_1_1stats_1_1_outer_bounds_stats.html#af257e4d5e476d995e7ff8d6338eb31e0',1,'stroid::stats::OuterBoundsStats::min']]], + ['min_5fdepth_34',['min_depth',['../structstroid_1_1stats_1_1_region_refinement_stats.html#aaedeaae1d0039de8c1e8d38859a468e5',1,'stroid::stats::RegionRefinementStats']]], + ['min_5fdetj_5fratio_35',['min_detJ_ratio',['../structstroid_1_1stats_1_1_jacobian_stats.html#a864764d65fbf3216448a84e864014da0',1,'stroid::stats::JacobianStats']]], + ['modeling_36',['A multi-block mesh generation tool for stellar modeling',['../index.html#autotoc_md1',1,'']]], + ['monitorresidual_37',['MonitorResidual',['../classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a48d38dae8e5f87ddc60a2d37cea8a05f',1,'stroid::topology::TMOPProgressBar']]], + ['multi_20block_20mesh_20generation_20tool_20for_20stellar_20modeling_38',['A multi-block mesh generation tool for stellar modeling',['../index.html#autotoc_md1',1,'']]] ]; diff --git a/docs/html/search/all_d.js b/docs/html/search/all_d.js index 727423c..e2c5e3f 100644 --- a/docs/html/search/all_d.js +++ b/docs/html/search/all_d.js @@ -1,13 +1,10 @@ var searchData= [ - ['savemesh_0',['SaveMesh',['../namespacestroid_1_1_i_o.html#aeb567ddc70ff2d064c139dee87575830',1,'stroid::IO']]], - ['savevtu_1',['SaveVTU',['../namespacestroid_1_1_i_o.html#ab4c8bda7ab370e34376a7832fbf0951e',1,'stroid::IO']]], - ['stellar_20modeling_2',['A multi-block mesh generation tool for stellar modeling',['../index.html#autotoc_md1',1,'']]], - ['stroid_3',['Stroid',['../index.html',1,'']]], - ['stroid_4',['stroid',['../namespacestroid.html',1,'']]], - ['stroid_3a_3aconfig_5',['config',['../namespacestroid_1_1config.html',1,'stroid']]], - ['stroid_3a_3aio_6',['IO',['../namespacestroid_1_1_i_o.html',1,'stroid']]], - ['stroid_3a_3atopology_7',['topology',['../namespacestroid_1_1topology.html',1,'stroid']]], - ['stroid_3a_3autils_8',['utils',['../namespacestroid_1_1utils.html',1,'stroid']]], - ['surface_5fbdr_5fid_9',['surface_bdr_id',['../structstroid_1_1config_1_1_mesh_config.html#a33f25ff277aa8834065e04ccb9cdbdda',1,'stroid::config::MeshConfig']]] + ['n_5felements_0',['n_elements',['../structstroid_1_1stats_1_1_jacobian_stats.html#acd5135808abc3d11296a798a8471659c',1,'stroid::stats::JacobianStats']]], + ['n_5fflipped_1',['n_flipped',['../structstroid_1_1stats_1_1_jacobian_stats.html#a757285c1fd7bf0fba5b17295f6744025',1,'stroid::stats::JacobianStats']]], + ['n_5fnonconforming_5ffaces_2',['n_nonconforming_faces',['../structstroid_1_1stats_1_1_conformity_stats.html#abcb9085f636b6a76651db48d4af1da54',1,'stroid::stats::ConformityStats']]], + ['n_5fsamples_3',['n_samples',['../structstroid_1_1stats_1_1_radius_stats.html#abbbe66a0769a06356bd1d49240dd2d8a',1,'stroid::stats::RadiusStats::n_samples'],['../structstroid_1_1stats_1_1_outer_bounds_stats.html#aa9f66142ae15baa4dd7538afa4f7874f',1,'stroid::stats::OuterBoundsStats::n_samples']]], + ['n_5fvertices_4',['n_vertices',['../structstroid_1_1stats_1_1_element_counts.html#acdbac05825297b4932197eaaca7762fd',1,'stroid::stats::ElementCounts']]], + ['nonconforming_20vacuum_20refinement_5',['Nonconforming vacuum refinement',['../index.html#autotoc_md8',1,'']]], + ['none_6',['NONE',['../namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eab50339a10e1de285ac99d4c3990b8693',1,'stroid::IO::NONE'],['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0bab50339a10e1de285ac99d4c3990b8693',1,'stroid::stats::NONE']]] ]; diff --git a/docs/html/search/all_e.js b/docs/html/search/all_e.js index 617c2af..ff3c8f4 100644 --- a/docs/html/search/all_e.js +++ b/docs/html/search/all_e.js @@ -1,7 +1,17 @@ var searchData= [ - ['tool_20for_20stellar_20modeling_0',['A multi-block mesh generation tool for stellar modeling',['../index.html#autotoc_md1',1,'']]], - ['topology_2ecpp_1',['topology.cpp',['../topology_8cpp.html',1,'']]], - ['topology_2eh_2',['topology.h',['../topology_8h.html',1,'']]], - ['transformpoint_3',['TransformPoint',['../namespacestroid_1_1topology.html#a394e33bdfafdaccd6edfaae0642d3456',1,'stroid::topology']]] + ['offset_0',['offset',['../structstroid_1_1stats_1_1_centroid_stats.html#a401a98fd1323f9246e100087f84242a8',1,'stroid::stats::CentroidStats']]], + ['operator_26_1',['operator&',['../namespacestroid_1_1stats.html#a21e8241876e1cbc528cee709f689c57d',1,'stroid::stats']]], + ['operator_3c_3c_2',['operator<<',['../namespacestroid_1_1stats.html#ae58ee763f9a05f52759d74f06d4ebebf',1,'stroid::stats']]], + ['operator_7c_3',['operator|',['../namespacestroid_1_1stats.html#ab93ded74aa6cb2bf7b3c11467ee550d5',1,'stroid::stats']]], + ['optimization_5fmethods_4',['optimization_methods',['../structstroid_1_1config_1_1_mesh_config.html#adf95ea0245d8e864c795e3c594abd19e',1,'stroid::config::MeshConfig']]], + ['optimizationmethods_5',['OptimizationMethods',['../structstroid_1_1config_1_1_optimization_methods.html',1,'stroid::config']]], + ['optimize_2ecpp_6',['optimize.cpp',['../optimize_8cpp.html',1,'']]], + ['optimize_2eh_7',['optimize.h',['../optimize_8h.html',1,'']]], + ['optimizemesh_8',['OptimizeMesh',['../namespacestroid_1_1topology.html#a4ea968d066cf63e5bb1e68150facdec1',1,'stroid::topology']]], + ['order_9',['order',['../structstroid_1_1config_1_1_mesh_config.html#aeb1b7fa26699dfa57e5b39a8cd9042ee',1,'stroid::config::MeshConfig']]], + ['other_10',['other',['../structstroid_1_1stats_1_1_element_counts.html#a6534c5b9664a1fdd317c70af35e5b3b7',1,'stroid::stats::ElementCounts']]], + ['outer_5fbounds_11',['OUTER_BOUNDS',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0ba5bdefb03d20a6c116d32b5b93a8864ee',1,'stroid::stats']]], + ['outer_5fbounds_12',['outer_bounds',['../structstroid_1_1stats_1_1_mesh_stats.html#a6802339afd7446432696bf7ab0d16d4f',1,'stroid::stats::MeshStats']]], + ['outerboundsstats_13',['OuterBoundsStats',['../structstroid_1_1stats_1_1_outer_bounds_stats.html',1,'stroid::stats']]] ]; diff --git a/docs/html/search/all_f.js b/docs/html/search/all_f.js index afad534..240245c 100644 --- a/docs/html/search/all_f.js +++ b/docs/html/search/all_f.js @@ -1,4 +1,11 @@ var searchData= [ - ['uninstalling_0',['Uninstalling',['../index.html#autotoc_md4',1,'']]] + ['parallel_0',['PARALLEL',['../namespacestroid.html#a90f6d065df7b5224bbfc04c6d89c467eadf13a99b035d6f0bce4f44ab18eec8eb',1,'stroid']]], + ['parse_1',['parse',['../structstd_1_1formatter_3_01stroid_1_1stats_1_1_mesh_stats_00_01char_01_4.html#aa5aff01f1056ee2efe792c2d72c4116f',1,'std::formatter< stroid::stats::MeshStats, char >']]], + ['parsestroidmesh_2',['ParseStroidMesh',['../namespacestroid_1_1_i_o.html#a20ae517986b9c27d23ef5f0ab704b247',1,'stroid::IO']]], + ['polar_5fequatorial_3',['polar_equatorial',['../structstroid_1_1stats_1_1_ellipticity_stats.html#afc4ee9567784a3f249abfc3cddc14116',1,'stroid::stats::EllipticityStats']]], + ['progress_5f_4',['progress_',['../classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a55882054f3d6719f9b462ea6087adb19',1,'stroid::topology::TMOPProgressBar']]], + ['projectmesh_5',['ProjectMesh',['../namespacestroid_1_1topology.html#a836ed13e5bac63e7952c3ce4e5532e78',1,'stroid::topology']]], + ['promotetohighorder_6',['PromoteToHighOrder',['../namespacestroid_1_1topology.html#a5907aa2e639cda703d48d177abc37caf',1,'stroid::topology']]], + ['pybind11_5fmodule_7',['PYBIND11_MODULE',['../bindings_8cpp.html#a546f88c544a1d55f72a3f10039822b5e',1,'bindings.cpp']]] ]; diff --git a/docs/html/search/classes_0.js b/docs/html/search/classes_0.js index 34c9671..a8b8871 100644 --- a/docs/html/search/classes_0.js +++ b/docs/html/search/classes_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['meshconfig_0',['MeshConfig',['../structstroid_1_1config_1_1_mesh_config.html',1,'stroid::config']]] + ['axisstats_0',['AxisStats',['../structstroid_1_1stats_1_1_axis_stats.html',1,'stroid::stats']]] ]; diff --git a/docs/html/search/enums_0.js b/docs/html/search/enums_0.js index 1e40e8b..e8831fb 100644 --- a/docs/html/search/enums_0.js +++ b/docs/html/search/enums_0.js @@ -1,4 +1,5 @@ var searchData= [ - ['visualization_5fmode_0',['VISUALIZATION_MODE',['../namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6e',1,'stroid::IO']]] + ['meshstatfeatures_0',['MeshStatFeatures',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0b',1,'stroid::stats']]], + ['mfem_5fmesh_5ftype_1',['MFEM_MESH_TYPE',['../namespacestroid.html#a90f6d065df7b5224bbfc04c6d89c467e',1,'stroid']]] ]; diff --git a/docs/html/search/enumvalues_0.js b/docs/html/search/enumvalues_0.js index cd3c907..acf08cd 100644 --- a/docs/html/search/enumvalues_0.js +++ b/docs/html/search/enumvalues_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['boundary_5felement_5fid_0',['BOUNDARY_ELEMENT_ID',['../namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eaee96e14c2b71bd59252006289ba464cf',1,'stroid::IO']]] + ['axes_0',['AXES',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0ba70842c6aface1f8fa1b768e1bb3bf838',1,'stroid::stats']]] ]; diff --git a/docs/html/search/enumvalues_1.js b/docs/html/search/enumvalues_1.js index 4894a43..1e305a8 100644 --- a/docs/html/search/enumvalues_1.js +++ b/docs/html/search/enumvalues_1.js @@ -1,4 +1,6 @@ var searchData= [ - ['element_5fid_0',['ELEMENT_ID',['../namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eac31a2fe3e97d218a154c1947b43d6bbf',1,'stroid::IO']]] + ['boundary_5felement_5fid_0',['BOUNDARY_ELEMENT_ID',['../namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eaee96e14c2b71bd59252006289ba464cf',1,'stroid::IO']]], + ['bounding_5fbox_1',['BOUNDING_BOX',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0bafb2ea1ec7b3bc42e65a0c3969dfe74f2',1,'stroid::stats']]], + ['bowing_2',['BOWING',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0ba02312d94a54441cc7aad47b6b8c7ba8b',1,'stroid::stats']]] ]; diff --git a/docs/html/search/enumvalues_2.js b/docs/html/search/enumvalues_2.js index bc369c8..dede4c8 100644 --- a/docs/html/search/enumvalues_2.js +++ b/docs/html/search/enumvalues_2.js @@ -1,4 +1,6 @@ var searchData= [ - ['none_0',['NONE',['../namespacestroid_1_1_i_o.html#ad4048304d8a0c7075d2b2a6e465d0b6eab50339a10e1de285ac99d4c3990b8693',1,'stroid::IO']]] + ['centroid_0',['CENTROID',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0ba04597115f4cfe4f00ab913b138f9737c',1,'stroid::stats']]], + ['config_5fmeta_1',['CONFIG_META',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0baa17731be24258d84478f18a2fd8f1375',1,'stroid::stats']]], + ['conformity_2',['CONFORMITY',['../namespacestroid_1_1stats.html#a10596f3f5de79404d640278d55bded0bad038f7f4555c488a5005db9e2f0443df',1,'stroid::stats']]] ]; diff --git a/docs/html/search/files_0.js b/docs/html/search/files_0.js index cce96dc..574bf54 100644 --- a/docs/html/search/files_0.js +++ b/docs/html/search/files_0.js @@ -1,6 +1,4 @@ var searchData= [ - ['config_2eh_0',['config.h',['../config_8h.html',1,'']]], - ['curvilinear_2ecpp_1',['curvilinear.cpp',['../curvilinear_8cpp.html',1,'']]], - ['curvilinear_2eh_2',['curvilinear.h',['../curvilinear_8h.html',1,'']]] + ['_5f_5finit_5f_5f_2epy_0',['__init__.py',['../____init_____8py.html',1,'']]] ]; diff --git a/docs/html/search/files_1.js b/docs/html/search/files_1.js index 93617ff..7d1855a 100644 --- a/docs/html/search/files_1.js +++ b/docs/html/search/files_1.js @@ -1,4 +1,5 @@ var searchData= [ - ['logo_2epng_0',['Logo.png',['../_logo_8png.html',1,'']]] + ['bindings_2ecpp_0',['bindings.cpp',['../bindings_8cpp.html',1,'(Global Namespace)'],['../config_2bindings_8cpp.html',1,'(Global Namespace)'],['../exceptions_2bindings_8cpp.html',1,'(Global Namespace)'],['../_i_o_2bindings_8cpp.html',1,'(Global Namespace)'],['../refinement_2bindings_8cpp.html',1,'(Global Namespace)'],['../utils_2bindings_8cpp.html',1,'(Global Namespace)']]], + ['bindings_2eh_1',['bindings.h',['../config_2bindings_8h.html',1,'(Global Namespace)'],['../exceptions_2bindings_8h.html',1,'(Global Namespace)'],['../_i_o_2bindings_8h.html',1,'(Global Namespace)'],['../refinement_2bindings_8h.html',1,'(Global Namespace)'],['../utils_2bindings_8h.html',1,'(Global Namespace)']]] ]; diff --git a/docs/html/search/files_2.js b/docs/html/search/files_2.js index 162942b..cce96dc 100644 --- a/docs/html/search/files_2.js +++ b/docs/html/search/files_2.js @@ -1,10 +1,6 @@ var searchData= [ - ['mainpage_2emd_0',['mainpage.md',['../mainpage_8md.html',1,'']]], - ['mapping_2ecpp_1',['mapping.cpp',['../mapping_8cpp.html',1,'']]], - ['mapping_2eh_2',['mapping.h',['../mapping_8h.html',1,'']]], - ['mesh_2ecpp_3',['mesh.cpp',['../mesh_8cpp.html',1,'']]], - ['mesh_2eh_4',['mesh.h',['../mesh_8h.html',1,'']]], - ['mesh_5futils_2ecpp_5',['mesh_utils.cpp',['../mesh__utils_8cpp.html',1,'']]], - ['mesh_5futils_2eh_6',['mesh_utils.h',['../mesh__utils_8h.html',1,'']]] + ['config_2eh_0',['config.h',['../config_8h.html',1,'']]], + ['curvilinear_2ecpp_1',['curvilinear.cpp',['../curvilinear_8cpp.html',1,'']]], + ['curvilinear_2eh_2',['curvilinear.h',['../curvilinear_8h.html',1,'']]] ]; diff --git a/docs/html/search/files_3.js b/docs/html/search/files_3.js index 08bbe03..9e60352 100644 --- a/docs/html/search/files_3.js +++ b/docs/html/search/files_3.js @@ -1,5 +1,4 @@ var searchData= [ - ['topology_2ecpp_0',['topology.cpp',['../topology_8cpp.html',1,'']]], - ['topology_2eh_1',['topology.h',['../topology_8h.html',1,'']]] + ['exceptions_2eh_0',['exceptions.h',['../exceptions_8h.html',1,'']]] ]; diff --git a/docs/html/search/functions_0.js b/docs/html/search/functions_0.js index 01799da..6b2bf6c 100644 --- a/docs/html/search/functions_0.js +++ b/docs/html/search/functions_0.js @@ -2,5 +2,7 @@ var searchData= [ ['applyequiangular_0',['ApplyEquiangular',['../namespacestroid_1_1topology.html#a03f0b29ccf7d427a175de9ff75824b7c',1,'stroid::topology']]], ['applykelvin_1',['ApplyKelvin',['../namespacestroid_1_1topology.html#a59c54a10f726d323f8506b4a2edd7467',1,'stroid::topology']]], - ['applyspheroidal_2',['ApplySpheroidal',['../namespacestroid_1_1topology.html#a7fbf58c40c03bc751d53f4a3273744fc',1,'stroid::topology']]] + ['applyspheroidal_2',['ApplySpheroidal',['../namespacestroid_1_1topology.html#a7fbf58c40c03bc751d53f4a3273744fc',1,'stroid::topology']]], + ['applytmop_3',['ApplyTMOP',['../namespacestroid_1_1topology.html#ac52b5393b5f5accf0337c34efca891f0',1,'stroid::topology']]], + ['as_5fmesh_4',['as_mesh',['../structstroid_1_1_stroid_mesh.html#a48164419b9465d536daa0d98067a7f06',1,'stroid::StroidMesh']]] ]; diff --git a/docs/html/search/functions_1.js b/docs/html/search/functions_1.js index f2b7b61..e3b9bdf 100644 --- a/docs/html/search/functions_1.js +++ b/docs/html/search/functions_1.js @@ -1,4 +1,6 @@ var searchData= [ - ['buildskeleton_0',['BuildSkeleton',['../namespacestroid_1_1topology.html#abc0d8a1fb8e9c5ac0e259e4c93db7892',1,'stroid::topology']]] + ['buildexteriorcoordinate_0',['BuildExteriorCoordinate',['../namespacestroid_1_1topology.html#a5ab92f7fb487c4639042539bf7b86606',1,'stroid::topology']]], + ['buildprojected_1',['BuildProjected',['../namespacestroid_1_1utils.html#aa81cc28e65c9208a29a6aa9c51ba5126',1,'stroid::utils']]], + ['buildskeleton_2',['BuildSkeleton',['../namespacestroid_1_1topology.html#abc0d8a1fb8e9c5ac0e259e4c93db7892',1,'stroid::topology']]] ]; diff --git a/docs/html/search/functions_2.js b/docs/html/search/functions_2.js index 580f270..d7107b7 100644 --- a/docs/html/search/functions_2.js +++ b/docs/html/search/functions_2.js @@ -1,4 +1,6 @@ var searchData= [ - ['finalize_0',['Finalize',['../namespacestroid_1_1topology.html#a62774bcba7ea1a485892dcd4bed6425b',1,'stroid::topology']]] + ['clone_0',['clone',['../structstroid_1_1_stroid_mesh.html#a69857c53a09211c3534f02546b3302f3',1,'stroid::StroidMesh']]], + ['computeexteriorcoordinate_1',['ComputeExteriorCoordinate',['../namespacestroid_1_1topology.html#a11783fac833cd43c7c59d712912795a8',1,'stroid::topology']]], + ['computemeshstats_2',['ComputeMeshStats',['../namespacestroid_1_1stats.html#ae340adbe2df53adc3946e8df38dd1acf',1,'stroid::stats']]] ]; diff --git a/docs/html/search/functions_3.js b/docs/html/search/functions_3.js index 9d2a617..90c8b02 100644 --- a/docs/html/search/functions_3.js +++ b/docs/html/search/functions_3.js @@ -1,5 +1,8 @@ var searchData= [ - ['markflippedboundaryelements_0',['MarkFlippedBoundaryElements',['../namespacestroid_1_1utils.html#ae047d97d7d5dc12812395909d00f5bbe',1,'stroid::utils']]], - ['markflippedelements_1',['MarkFlippedElements',['../namespacestroid_1_1utils.html#a22ab5809195bf85156607790f82b5e2d',1,'stroid::utils']]] + ['diag_0',['diag',['../structstroid_1_1stats_1_1_bounding_box.html#a20393a20357b339f50471420ac1f55c6',1,'stroid::stats::BoundingBox']]], + ['draw_1',['Draw',['../classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a290642ec5c00ffc1f2f79187684e1f5c',1,'stroid::topology::TMOPProgressBar']]], + ['dx_2',['dx',['../structstroid_1_1stats_1_1_bounding_box.html#a64512b188fe9eb8cae05d730aa036729',1,'stroid::stats::BoundingBox']]], + ['dy_3',['dy',['../structstroid_1_1stats_1_1_bounding_box.html#ad1e70dfafca984aaa9fc9868ce6de020',1,'stroid::stats::BoundingBox']]], + ['dz_4',['dz',['../structstroid_1_1stats_1_1_bounding_box.html#a6b1300ee23d6d94e12c3e94c79afd5f3',1,'stroid::stats::BoundingBox']]] ]; diff --git a/docs/html/search/functions_4.js b/docs/html/search/functions_4.js index 0d4b130..e60c78c 100644 --- a/docs/html/search/functions_4.js +++ b/docs/html/search/functions_4.js @@ -1,5 +1,4 @@ var searchData= [ - ['projectmesh_0',['ProjectMesh',['../namespacestroid_1_1topology.html#a836ed13e5bac63e7952c3ce4e5532e78',1,'stroid::topology']]], - ['promotetohighorder_1',['PromoteToHighOrder',['../namespacestroid_1_1topology.html#a5907aa2e639cda703d48d177abc37caf',1,'stroid::topology']]] + ['exportjacobianradialprofile_0',['ExportJacobianRadialProfile',['../namespacestroid_1_1utils.html#ad6d849312ba094bda29ab3adf2326435',1,'stroid::utils']]] ]; diff --git a/docs/html/search/functions_5.js b/docs/html/search/functions_5.js index 16e6534..22b0f58 100644 --- a/docs/html/search/functions_5.js +++ b/docs/html/search/functions_5.js @@ -1,5 +1,5 @@ var searchData= [ - ['savemesh_0',['SaveMesh',['../namespacestroid_1_1_i_o.html#aeb567ddc70ff2d064c139dee87575830',1,'stroid::IO']]], - ['savevtu_1',['SaveVTU',['../namespacestroid_1_1_i_o.html#ab4c8bda7ab370e34376a7832fbf0951e',1,'stroid::IO']]] + ['finalize_0',['Finalize',['../namespacestroid_1_1topology.html#a62774bcba7ea1a485892dcd4bed6425b',1,'stroid::topology']]], + ['format_1',['format',['../structstd_1_1formatter_3_01stroid_1_1stats_1_1_mesh_stats_00_01char_01_4.html#a5d094b37e1f7fb75a026caa53017a729',1,'std::formatter< stroid::stats::MeshStats, char >']]] ]; diff --git a/docs/html/search/functions_6.js b/docs/html/search/functions_6.js index c7452b2..3ab5987 100644 --- a/docs/html/search/functions_6.js +++ b/docs/html/search/functions_6.js @@ -1,4 +1,4 @@ var searchData= [ - ['transformpoint_0',['TransformPoint',['../namespacestroid_1_1topology.html#a394e33bdfafdaccd6edfaae0642d3456',1,'stroid::topology']]] + ['generatemesh_0',['GenerateMesh',['../namespacestroid.html#a009af3074e8681e87067228deab670d6',1,'stroid::GenerateMesh(const fourdst::config::Config< stroid::config::MeshConfig > &input)'],['../namespacestroid.html#a2e8a90a2a7e9606de8b07cf330c0fd8d',1,'stroid::GenerateMesh(const stroid::config::MeshConfig &config)'],['../namespacestroid.html#ae9643927d87d14a87970569dd0d8f3ae',1,'stroid::GenerateMesh(const std::string &filename)']]] ]; diff --git a/docs/html/search/functions_7.js b/docs/html/search/functions_7.js index 5a6190d..73fd9d2 100644 --- a/docs/html/search/functions_7.js +++ b/docs/html/search/functions_7.js @@ -1,5 +1,4 @@ var searchData= [ - ['viewmesh_0',['ViewMesh',['../namespacestroid_1_1_i_o.html#a496f5c16eaffda5922a0b96c1f525dab',1,'stroid::IO']]], - ['visualizefacevalence_1',['VisualizeFaceValence',['../namespacestroid_1_1_i_o.html#a8100e130b3a49fdee48bc3c4d4e63963',1,'stroid::IO']]] + ['has_5ffeature_0',['has_feature',['../namespacestroid_1_1stats.html#ae11c13445f32b7daac1d787114af2eae',1,'stroid::stats']]] ]; diff --git a/docs/html/search/namespaces_0.js b/docs/html/search/namespaces_0.js index 6452499..ff0d257 100644 --- a/docs/html/search/namespaces_0.js +++ b/docs/html/search/namespaces_0.js @@ -2,7 +2,11 @@ var searchData= [ ['stroid_0',['stroid',['../namespacestroid.html',1,'']]], ['stroid_3a_3aconfig_1',['config',['../namespacestroid_1_1config.html',1,'stroid']]], - ['stroid_3a_3aio_2',['IO',['../namespacestroid_1_1_i_o.html',1,'stroid']]], - ['stroid_3a_3atopology_3',['topology',['../namespacestroid_1_1topology.html',1,'stroid']]], - ['stroid_3a_3autils_4',['utils',['../namespacestroid_1_1utils.html',1,'stroid']]] + ['stroid_3a_3aexceptions_2',['exceptions',['../namespacestroid_1_1exceptions.html',1,'stroid']]], + ['stroid_3a_3aio_3',['IO',['../namespacestroid_1_1_i_o.html',1,'stroid']]], + ['stroid_3a_3arefinement_4',['refinement',['../namespacestroid_1_1refinement.html',1,'stroid']]], + ['stroid_3a_3astats_5',['stats',['../namespacestroid_1_1stats.html',1,'stroid']]], + ['stroid_3a_3atopology_6',['topology',['../namespacestroid_1_1topology.html',1,'stroid']]], + ['stroid_3a_3autils_7',['utils',['../namespacestroid_1_1utils.html',1,'stroid']]], + ['stroid_3a_3autils_3a_3aterm_5fsupport_8',['term_support',['../namespacestroid_1_1utils_1_1term__support.html',1,'stroid::utils']]] ]; diff --git a/docs/html/search/pages_0.js b/docs/html/search/pages_0.js index 748df49..ae85883 100644 --- a/docs/html/search/pages_0.js +++ b/docs/html/search/pages_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['stroid_0',['Stroid',['../index.html',1,'']]] + ['stroid_0',['stroid',['../index.html',1,'']]] ]; diff --git a/docs/html/search/searchdata.js b/docs/html/search/searchdata.js index f3fcd0b..00641a0 100644 --- a/docs/html/search/searchdata.js +++ b/docs/html/search/searchdata.js @@ -1,13 +1,13 @@ var indexSectionsWithContent = { - 0: "abcefgilmnoprstuv", - 1: "m", + 0: "_abcdefghijlmnoprstuvwxyz~", + 1: "abcefjmorstv", 2: "s", - 3: "clmt", - 4: "abfmpstv", - 5: "cefiorsv", - 6: "v", - 7: "ben", + 3: "_bcelmostu", + 4: "abcdefghlmoprstuvw~", + 5: "_abcdefghijmnoprstvwxyz", + 6: "mv", + 7: "abcejmnoprsv", 8: "s" }; diff --git a/docs/html/search/variables_0.js b/docs/html/search/variables_0.js index fe8dc5f..64c2155 100644 --- a/docs/html/search/variables_0.js +++ b/docs/html/search/variables_0.js @@ -1,5 +1,12 @@ var searchData= [ - ['core_5fid_0',['core_id',['../structstroid_1_1config_1_1_mesh_config.html#a2faa5aa1fef84ebbda30590d3fb2799b',1,'stroid::config::MeshConfig']]], - ['core_5fsteepness_1',['core_steepness',['../structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d',1,'stroid::config::MeshConfig']]] + ['_5f_5fall_5f_5f_0',['__all__',['../namespacestroid.html#af6ce344ae299e3ad50f4ad30f3e98fb4',1,'stroid']]], + ['_5f_5fauthor_5f_5f_1',['__author__',['../namespacestroid.html#a0980d815006142018342badd4a344b75',1,'stroid']]], + ['_5f_5fdescription_5f_5f_2',['__description__',['../namespacestroid.html#a46eadd157b4003bbf1df5f46df72ecf6',1,'stroid']]], + ['_5f_5femail_5f_5f_3',['__email__',['../namespacestroid.html#a7aa709789d28ac6d51079f35b030fb7b',1,'stroid']]], + ['_5f_5flicense_5f_5f_4',['__license__',['../namespacestroid.html#a66665c450e6087c6d5d85fe337229886',1,'stroid']]], + ['_5f_5furl_5f_5f_5',['__url__',['../namespacestroid.html#a82f32fe152e5f48927bba40b0131c047',1,'stroid']]], + ['_5f_5fversion_5f_5f_6',['__version__',['../namespacestroid.html#a6c6c3bffa4c5eaa2cbfa16072a66ec85',1,'stroid']]], + ['_5fmeta_7',['_meta',['../namespacestroid.html#a7515d5089908807b72e300799c8e6d8a',1,'stroid']]], + ['_5fpackage_5fdir_8',['_PACKAGE_DIR',['../namespacestroid.html#a6c93a0ee650df592ef5c32c3e6b110e0',1,'stroid']]] ]; diff --git a/docs/html/search/variables_1.js b/docs/html/search/variables_1.js index 3eb6c41..b92b285 100644 --- a/docs/html/search/variables_1.js +++ b/docs/html/search/variables_1.js @@ -1,4 +1,7 @@ var searchData= [ - ['envelope_5fid_0',['envelope_id',['../structstroid_1_1config_1_1_mesh_config.html#ac99aa48fe3e71e2ef57b09d48cacfef8',1,'stroid::config::MeshConfig']]] + ['all_0',['all',['../structstroid_1_1stats_1_1_refinement_stats.html#ac21dcc8f06bb0e9d089a463cb8834d61',1,'stroid::stats::RefinementStats']]], + ['analytic_5farea_1',['analytic_area',['../structstroid_1_1stats_1_1_volume_area_stats.html#a3c8025493e76cc6b6e4ec7b14e64b92f',1,'stroid::stats::VolumeAreaStats']]], + ['analytic_5fvolume_2',['analytic_volume',['../structstroid_1_1stats_1_1_volume_area_stats.html#aaad927ad1fc223bb22aaf9ca3b176349',1,'stroid::stats::VolumeAreaStats']]], + ['axes_3',['axes',['../structstroid_1_1stats_1_1_mesh_stats.html#a51812afb0c88452c015c353729e54456',1,'stroid::stats::MeshStats']]] ]; diff --git a/docs/html/search/variables_2.js b/docs/html/search/variables_2.js index 13cb414..8d92654 100644 --- a/docs/html/search/variables_2.js +++ b/docs/html/search/variables_2.js @@ -1,4 +1,6 @@ var searchData= [ - ['flattening_0',['flattening',['../structstroid_1_1config_1_1_mesh_config.html#affad4638b0ae7b710f2b2db992f6f584',1,'stroid::config::MeshConfig']]] + ['bar_5fwidth_5f_0',['bar_width_',['../classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#a3f92f95c46171f4d85bc1f9cffec48e3',1,'stroid::topology::TMOPProgressBar']]], + ['bounding_5fbox_1',['bounding_box',['../structstroid_1_1stats_1_1_mesh_stats.html#ab59ce474426058277b0c5a920915015e',1,'stroid::stats::MeshStats']]], + ['bowing_2',['bowing',['../structstroid_1_1stats_1_1_mesh_stats.html#a93d000565636a13ef05dd503c0381956',1,'stroid::stats::MeshStats']]] ]; diff --git a/docs/html/search/variables_3.js b/docs/html/search/variables_3.js index ea892bd..89279bc 100644 --- a/docs/html/search/variables_3.js +++ b/docs/html/search/variables_3.js @@ -1,5 +1,14 @@ var searchData= [ - ['include_5fexternal_5fdomain_0',['include_external_domain',['../structstroid_1_1config_1_1_mesh_config.html#a062652781f4f3ea0b7ca8764362a7368',1,'stroid::config::MeshConfig']]], - ['inf_5fbdr_5fid_1',['inf_bdr_id',['../structstroid_1_1config_1_1_mesh_config.html#a64cb00c8cba27267279a52207a4b5be0',1,'stroid::config::MeshConfig']]] + ['centroid_0',['centroid',['../structstroid_1_1stats_1_1_mesh_stats.html#acf33442992a504e38b25586c3e07ca28',1,'stroid::stats::MeshStats']]], + ['computed_1',['computed',['../structstroid_1_1stats_1_1_mesh_stats.html#abf86b5cd38826062b0a1a493e7e65da4',1,'stroid::stats::MeshStats']]], + ['config_2',['config',['../structstroid_1_1_stroid_mesh.html#a3dd1a14571aa04ca0cc3d26575f59238',1,'stroid::StroidMesh']]], + ['config_5fmeta_3',['config_meta',['../structstroid_1_1stats_1_1_mesh_stats.html#a826463bf69a79deb5f556fda6180c0d7',1,'stroid::stats::MeshStats']]], + ['conforming_4',['conforming',['../structstroid_1_1stats_1_1_conformity_stats.html#affd2ab3b52411cf4e7d3a3d4f9b331bb',1,'stroid::stats::ConformityStats']]], + ['conformity_5',['conformity',['../structstroid_1_1stats_1_1_mesh_stats.html#ad13cc0c6a5b223ace653825355660bdd',1,'stroid::stats::MeshStats']]], + ['continuity_5forder_6',['continuity_order',['../structstroid_1_1config_1_1_mesh_config.html#ae8bf54f7fd649578d44e46e96f501e34',1,'stroid::config::MeshConfig']]], + ['core_7',['core',['../structstroid_1_1stats_1_1_refinement_stats.html#aa1bd1a7c712813ab7913defe74bc9e13',1,'stroid::stats::RefinementStats::core'],['../structstroid_1_1stats_1_1_element_counts.html#adf8ca94d0323409da0a8e6dd7a09b43d',1,'stroid::stats::ElementCounts::core'],['../structstroid_1_1stats_1_1_bounding_box_stats.html#ae3dcc95d73affc02d81e91f6dcbd5757',1,'stroid::stats::BoundingBoxStats::core']]], + ['core_5fid_8',['core_id',['../structstroid_1_1config_1_1_mesh_config.html#ad6af127dd2bdcba58dd64eee24378dbe',1,'stroid::config::MeshConfig']]], + ['core_5fmapping_9',['core_mapping',['../structstroid_1_1config_1_1_mesh_config.html#a932e1257cacf5831c216bc3c48d4346d',1,'stroid::config::MeshConfig']]], + ['core_5fsteepness_10',['core_steepness',['../structstroid_1_1config_1_1_mesh_config.html#aae33c48f949858944a6baa6033cebb7b',1,'stroid::config::MeshConfig']]] ]; diff --git a/docs/html/search/variables_4.js b/docs/html/search/variables_4.js index 54e4e33..73bf964 100644 --- a/docs/html/search/variables_4.js +++ b/docs/html/search/variables_4.js @@ -1,4 +1,7 @@ var searchData= [ - ['order_0',['order',['../structstroid_1_1config_1_1_mesh_config.html#a860e78f1906acb0c3aa08d55f94de3fd',1,'stroid::config::MeshConfig']]] + ['detj_5fmax_0',['detJ_max',['../structstroid_1_1stats_1_1_jacobian_stats.html#a111e61403f15558c3f18047480851996',1,'stroid::stats::JacobianStats']]], + ['detj_5fmin_1',['detJ_min',['../structstroid_1_1stats_1_1_jacobian_stats.html#a01d0af968bea5acf49ab33ae7120d500',1,'stroid::stats::JacobianStats']]], + ['detj_5fmin_5fat_5fradius_2',['detJ_min_at_radius',['../structstroid_1_1stats_1_1_jacobian_stats.html#ae2e42851b5c866819eadbd761c94248f',1,'stroid::stats::JacobianStats']]], + ['done_5f_3',['done_',['../classstroid_1_1topology_1_1_t_m_o_p_progress_bar.html#afd3e86deff330cd6f65fdffe29aa7d79',1,'stroid::topology::TMOPProgressBar']]] ]; diff --git a/docs/html/search/variables_5.js b/docs/html/search/variables_5.js index ca9c138..9585bfe 100644 --- a/docs/html/search/variables_5.js +++ b/docs/html/search/variables_5.js @@ -1,8 +1,9 @@ var searchData= [ - ['r_5fcore_0',['r_core',['../structstroid_1_1config_1_1_mesh_config.html#a5c68a895f73dc82a38a8daac22a83ad7',1,'stroid::config::MeshConfig']]], - ['r_5finfinity_1',['r_infinity',['../structstroid_1_1config_1_1_mesh_config.html#ac7546899ebbfe191ea3a8bf2403b31eb',1,'stroid::config::MeshConfig']]], - ['r_5finstability_2',['r_instability',['../structstroid_1_1config_1_1_mesh_config.html#a4da6d99ff7ba24d2f917e1fd98ddd877',1,'stroid::config::MeshConfig']]], - ['r_5fstar_3',['r_star',['../structstroid_1_1config_1_1_mesh_config.html#a3fe80a30990d484dcc39b6f9a0befc05',1,'stroid::config::MeshConfig']]], - ['refinement_5flevels_4',['refinement_levels',['../structstroid_1_1config_1_1_mesh_config.html#a8cafcbebf64ae251517118eb152de981',1,'stroid::config::MeshConfig']]] + ['element_5fcounts_0',['element_counts',['../structstroid_1_1stats_1_1_mesh_stats.html#aae74d0872a0b3c0d2dea9529171388fe',1,'stroid::stats::MeshStats']]], + ['ellipticity_1',['ellipticity',['../structstroid_1_1stats_1_1_mesh_stats.html#ae9cab419f39d089ba48522385177e6ae',1,'stroid::stats::MeshStats']]], + ['envelope_2',['envelope',['../structstroid_1_1stats_1_1_refinement_stats.html#a1c1898450bd29021f9e9ee061932b805',1,'stroid::stats::RefinementStats::envelope'],['../structstroid_1_1stats_1_1_element_counts.html#a5e60266ab6c79811e4e64b09457d2138',1,'stroid::stats::ElementCounts::envelope']]], + ['envelope_5fid_3',['envelope_id',['../structstroid_1_1config_1_1_mesh_config.html#a8d30e307723eba6d964dfbe835532c8e',1,'stroid::config::MeshConfig']]], + ['errors_4',['errors',['../structstroid_1_1stats_1_1_mesh_stats.html#a77dcb0bd9fa7e211c9a14cc6e65da426',1,'stroid::stats::MeshStats']]], + ['exterior_5fcoordinate_5',['exterior_coordinate',['../structstroid_1_1_stroid_mesh.html#a6ee2e855b58552ac9204b6b85f5ade1a',1,'stroid::StroidMesh']]] ]; diff --git a/docs/html/search/variables_6.js b/docs/html/search/variables_6.js index 15b2f32..6be6cad 100644 --- a/docs/html/search/variables_6.js +++ b/docs/html/search/variables_6.js @@ -1,4 +1,4 @@ var searchData= [ - ['surface_5fbdr_5fid_0',['surface_bdr_id',['../structstroid_1_1config_1_1_mesh_config.html#a33f25ff277aa8834065e04ccb9cdbdda',1,'stroid::config::MeshConfig']]] + ['flattening_0',['flattening',['../structstroid_1_1config_1_1_mesh_config.html#af25094952d1f73e0de4368fe7a5a6f6b',1,'stroid::config::MeshConfig::flattening'],['../structstroid_1_1stats_1_1_ellipticity_stats.html#af7f40620a3fe79497492c59b3a281fc7',1,'stroid::stats::EllipticityStats::flattening'],['../structstroid_1_1stats_1_1_config_meta.html#ae91faf6fc82d7f1b40fbc56a052f3f3b',1,'stroid::stats::ConfigMeta::flattening']]] ]; diff --git a/docs/html/search/variables_7.js b/docs/html/search/variables_7.js index 87b7171..8705d10 100644 --- a/docs/html/search/variables_7.js +++ b/docs/html/search/variables_7.js @@ -1,4 +1,6 @@ var searchData= [ - ['vacuum_5fid_0',['vacuum_id',['../structstroid_1_1config_1_1_mesh_config.html#a36c7b05405691393d381086a27ea36ad',1,'stroid::config::MeshConfig']]] + ['geom_5forder_0',['geom_order',['../structstroid_1_1stats_1_1_config_meta.html#ac35acd7f85f35d509cc71cc98c93c4b3',1,'stroid::stats::ConfigMeta']]], + ['geometry_5fdofs_1',['geometry_dofs',['../structstroid_1_1stats_1_1_refinement_stats.html#a12102f92ec997538e42108a941e0f9eb',1,'stroid::stats::RefinementStats']]], + ['geometry_5ftrue_5fdofs_2',['geometry_true_dofs',['../structstroid_1_1stats_1_1_refinement_stats.html#aef469d52ee5d4b95baadfa785bd3e492',1,'stroid::stats::RefinementStats']]] ]; diff --git a/docs/html/structstroid_1_1config_1_1_mesh_config-members.html b/docs/html/structstroid_1_1config_1_1_mesh_config-members.html index 6c048d9..37c527e 100644 --- a/docs/html/structstroid_1_1config_1_1_mesh_config-members.html +++ b/docs/html/structstroid_1_1config_1_1_mesh_config-members.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -107,20 +107,25 @@ $(function(){initNavTree('structstroid_1_1config_1_1_mesh_config.html',''); init

This is the complete list of members for stroid::config::MeshConfig, including all inherited members.

- - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +
core_idstroid::config::MeshConfig
core_steepnessstroid::config::MeshConfig
envelope_idstroid::config::MeshConfig
flatteningstroid::config::MeshConfig
include_external_domainstroid::config::MeshConfig
inf_bdr_idstroid::config::MeshConfig
orderstroid::config::MeshConfig
r_corestroid::config::MeshConfig
r_infinitystroid::config::MeshConfig
r_instabilitystroid::config::MeshConfig
r_starstroid::config::MeshConfig
refinement_levelsstroid::config::MeshConfig
surface_bdr_idstroid::config::MeshConfig
vacuum_idstroid::config::MeshConfig
continuity_orderstroid::config::MeshConfig
core_idstroid::config::MeshConfig
core_mappingstroid::config::MeshConfig
core_steepnessstroid::config::MeshConfig
envelope_idstroid::config::MeshConfig
flatteningstroid::config::MeshConfig
include_external_domainstroid::config::MeshConfig
inf_bdr_idstroid::config::MeshConfig
optimization_methodsstroid::config::MeshConfig
orderstroid::config::MeshConfig
r_corestroid::config::MeshConfig
r_infinitystroid::config::MeshConfig
r_instabilitystroid::config::MeshConfig
r_starstroid::config::MeshConfig
refinement_levelsstroid::config::MeshConfig
surface_bdr_idstroid::config::MeshConfig
vacuum_idstroid::config::MeshConfig
vacuum_outer_refinement_levelsstroid::config::MeshConfig
vacuum_refinement_levelsstroid::config::MeshConfig
diff --git a/docs/html/structstroid_1_1config_1_1_mesh_config.html b/docs/html/structstroid_1_1config_1_1_mesh_config.html index 9bf1334..5e4b8eb 100644 --- a/docs/html/structstroid_1_1config_1_1_mesh_config.html +++ b/docs/html/structstroid_1_1config_1_1_mesh_config.html @@ -31,7 +31,7 @@ Logo -
stroid v0.2.1 +
stroid v0.6.0
Multi-block curvilinear mesh generation
@@ -115,61 +115,96 @@ $(function(){initNavTree('structstroid_1_1config_1_1_mesh_config.html',''); init - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Attributes

int refinement_levels = 4
 Number of uniform refinement passes applied after topology creation.
 
int order = 3
 Polynomial order for high-order elements.
 
bool include_external_domain = true
 Whether to include an external domain extending to r_infinity.
 
double r_core = 1.5
 Radius of the stellar core region.
 
double r_star = 5.0
 Radius of the stellar surface.
 
double flattening = 0
 Flattening factor for spheroidal shaping (0 = spherical, >0 = oblate).
 
double r_infinity = 6.0
 Outer radius of the external domain when enabled.
 
double r_instability = 1e-14
 Radius inside which transformations are skipped to avoid singularities.
 
double core_steepness = 1.0
 Controls the smoothness/steepness of the core-to-envelope transition.
 
size_t surface_bdr_id = 1
 Boundary attribute id for stellar surface.
 
size_t inf_bdr_id = 2
 Boundary attribute id for infinity in kelvin mapping.
 
size_t core_id = 1
 Material attribute id for the core region.
 
size_t envelope_id = 2
 Material attribute id for the envelope region.
 
size_t vacuum_id = 3
 Material attribute id for the external domain (if enabled)
 
std::optional< int > refinement_levels = 4
 Stellar refinement depth, or uniform depth when vacuum overrides are absent.
 
std::optional< int > vacuum_refinement_levels = std::nullopt
 Minimum refinement depth in the vacuum interior; unset inherits refinement_levels.
 
std::optional< int > vacuum_outer_refinement_levels = std::nullopt
 Minimum refinement depth at the vacuum outer boundary; unset inherits refinement_levels.
 
std::optional< int > order = 3
 Polynomial order for high-order elements.
 
std::optional< bool > include_external_domain = true
 Whether to include an external domain extending to r_infinity.
 
std::optional< double > r_core = 0.25
 Radius of the stellar core region.
 
std::optional< double > r_star = 1.0
 Radius of the stellar surface.
 
std::optional< double > flattening = 0
 Flattening factor for spheroidal shaping (0 = spherical, >0 = oblate).
 
std::optional< double > r_infinity = 6.0
 Outer radius of the external domain when enabled.
 
std::optional< double > r_instability = 1e-14
 Radius inside which transformations are skipped to avoid singularities.
 
std::optional< double > core_steepness = 1.0
 Controls the smoothness/steepness of the core-to-envelope transition.
 
std::optional< size_t > continuity_order = 2
 Continuity order for the core-envelope transition (0 = discontinuous, 1 = C1, 2 = C2).
 
std::optional< size_t > surface_bdr_id = 1
 Boundary attribute id for stellar surface.
 
std::optional< size_t > inf_bdr_id = 2
 Boundary attribute id for infinity in kelvin mapping.
 
std::optional< size_t > core_id = 1
 Material attribute id for the core region.
 
std::optional< size_t > envelope_id = 2
 Material attribute id for the envelope region.
 
std::optional< size_t > vacuum_id = 3
 Material attribute id for the external domain (if enabled)
 
std::optional< OptimizationMethodsoptimization_methods = OptimizationMethods{true, true}
 
std::optional< std::string > core_mapping = "multi_block"
 Core mapping strategy: legacy "spherified" or conditioned "multi_block".
 

Detailed Description

Configuration parameters for stroid mesh generation.

-

These values are typically loaded via fourdst::config::Config<stroid::config::MeshConfig> from a TOML file. The README shows the expected TOML layout under the [main] table. Unspecified keys use the defaults defined here.

+

These values are typically loaded via fourdst::config::Config<stroid::config::MeshConfig> from a TOML file. The README shows the expected TOML layout under the [main] table. Unspecified geometry keys use the defaults defined here. ResolveDefaults preserves the historical fallback for omitted mapping and optimization controls in TOML files.

Member Data Documentation

- -

◆ core_id

+ +

◆ continuity_order

- + + +
size_t stroid::config::MeshConfig::core_id = 1std::optional<size_t> stroid::config::MeshConfig::continuity_order = 2
+
+ +

Continuity order for the core-envelope transition (0 = discontinuous, 1 = C1, 2 = C2).

+

+toml

+
    +
  • [main].continuity_order
  • +
+ +
+
+ +

◆ core_id

+ +
+
+ + +
std::optional<size_t> stroid::config::MeshConfig::core_id = 1
@@ -183,14 +218,37 @@ toml
- -

◆ core_steepness

+ +

◆ core_mapping

- + + +
double stroid::config::MeshConfig::core_steepness = 1.0std::optional<std::string> stroid::config::MeshConfig::core_mapping = "multi_block"
+
+ +

Core mapping strategy: legacy "spherified" or conditioned "multi_block".

+

spherified generates a either two or three inscribed cubes then projects them into spheres. multi_block generates a multi-block topology with a single core block and six envelope blocks, then projects the core block into a sphere and the envelope blocks into a spheroid.

+

multi_block is strongly preferred for its ~1000x improved condition number, Spherified is only provided for legacy compatibility.

+

+toml

+
    +
  • [main].core_mapping
  • +
+ +
+
+ +

◆ core_steepness

+ +
+
+ + +
std::optional<double> stroid::config::MeshConfig::core_steepness = 1.0
@@ -204,14 +262,14 @@ toml
- -

◆ envelope_id

+ +

◆ envelope_id

- +
size_t stroid::config::MeshConfig::envelope_id = 2std::optional<size_t> stroid::config::MeshConfig::envelope_id = 2
@@ -225,14 +283,14 @@ toml
- -

◆ flattening

+ +

◆ flattening

- +
double stroid::config::MeshConfig::flattening = 0std::optional<double> stroid::config::MeshConfig::flattening = 0
@@ -246,14 +304,14 @@ toml
- -

◆ include_external_domain

+ +

◆ include_external_domain

- +
bool stroid::config::MeshConfig::include_external_domain = truestd::optional<bool> stroid::config::MeshConfig::include_external_domain = true
@@ -267,14 +325,14 @@ toml
- -

◆ inf_bdr_id

+ +

◆ inf_bdr_id

- +
size_t stroid::config::MeshConfig::inf_bdr_id = 2std::optional<size_t> stroid::config::MeshConfig::inf_bdr_id = 2
@@ -288,14 +346,28 @@ toml
- -

◆ order

+ +

◆ optimization_methods

- + + +
int stroid::config::MeshConfig::order = 3std::optional<OptimizationMethods> stroid::config::MeshConfig::optimization_methods = OptimizationMethods{true, true}
+
+ +
+
+ +

◆ order

+ +
+
+ + +
std::optional<int> stroid::config::MeshConfig::order = 3
@@ -309,14 +381,14 @@ toml
- -

◆ r_core

+ +

◆ r_core

- +
double stroid::config::MeshConfig::r_core = 1.5std::optional<double> stroid::config::MeshConfig::r_core = 0.25
@@ -330,14 +402,14 @@ toml
- -

◆ r_infinity

+ +

◆ r_infinity

- +
double stroid::config::MeshConfig::r_infinity = 6.0std::optional<double> stroid::config::MeshConfig::r_infinity = 6.0
@@ -351,14 +423,14 @@ toml
- -

◆ r_instability

+ +

◆ r_instability

- +
double stroid::config::MeshConfig::r_instability = 1e-14std::optional<double> stroid::config::MeshConfig::r_instability = 1e-14
@@ -372,14 +444,14 @@ toml
- -

◆ r_star

+ +

◆ r_star

- +
double stroid::config::MeshConfig::r_star = 5.0std::optional<double> stroid::config::MeshConfig::r_star = 1.0
@@ -393,19 +465,19 @@ toml
- -

◆ refinement_levels

+ +

◆ refinement_levels

- +
int stroid::config::MeshConfig::refinement_levels = 4std::optional<int> stroid::config::MeshConfig::refinement_levels = 4
-

Number of uniform refinement passes applied after topology creation.

+

Stellar refinement depth, or uniform depth when vacuum overrides are absent.

toml

    @@ -414,14 +486,14 @@ toml
- -

◆ surface_bdr_id

+ +

◆ surface_bdr_id

- +
size_t stroid::config::MeshConfig::surface_bdr_id = 1std::optional<size_t> stroid::config::MeshConfig::surface_bdr_id = 1
@@ -435,14 +507,14 @@ toml
- -

◆ vacuum_id

+ +

◆ vacuum_id

- +
size_t stroid::config::MeshConfig::vacuum_id = 3std::optional<size_t> stroid::config::MeshConfig::vacuum_id = 3
@@ -454,6 +526,50 @@ toml
  • [main].vacuum_id
  • +
    +
    + +

    ◆ vacuum_outer_refinement_levels

    + +
    +
    + + + + +
    std::optional<int> stroid::config::MeshConfig::vacuum_outer_refinement_levels = std::nullopt
    +
    + +

    Minimum refinement depth at the vacuum outer boundary; unset inherits refinement_levels.

    +

    Boundary-adjacent cells are refined automatically, with grading toward the vacuum interior. Geometry uses the same polynomial order in every region.

    +

    +toml

    +
      +
    • [main].vacuum_outer_refinement_levels
    • +
    + +
    +
    + +

    ◆ vacuum_refinement_levels

    + +
    +
    + + + + +
    std::optional<int> stroid::config::MeshConfig::vacuum_refinement_levels = std::nullopt
    +
    + +

    Minimum refinement depth in the vacuum interior; unset inherits refinement_levels.

    +

    Setting either vacuum override enables local isotropic refinement. Vacuum cells at the stellar surface match the stellar refinement, and automatic one-level grading can raise the interior depth above this minimum. Requires an external domain.

    +

    +toml

    +
      +
    • [main].vacuum_refinement_levels
    • +
    +

    The documentation for this struct was generated from the following file:
      diff --git a/docs/html/structstroid_1_1config_1_1_mesh_config.js b/docs/html/structstroid_1_1config_1_1_mesh_config.js index e08ceff..dfb86a7 100644 --- a/docs/html/structstroid_1_1config_1_1_mesh_config.js +++ b/docs/html/structstroid_1_1config_1_1_mesh_config.js @@ -1,17 +1,22 @@ var structstroid_1_1config_1_1_mesh_config = [ - [ "core_id", "structstroid_1_1config_1_1_mesh_config.html#a2faa5aa1fef84ebbda30590d3fb2799b", null ], - [ "core_steepness", "structstroid_1_1config_1_1_mesh_config.html#aed32864839b149c94842801b6413d94d", null ], - [ "envelope_id", "structstroid_1_1config_1_1_mesh_config.html#ac99aa48fe3e71e2ef57b09d48cacfef8", null ], - [ "flattening", "structstroid_1_1config_1_1_mesh_config.html#affad4638b0ae7b710f2b2db992f6f584", null ], - [ "include_external_domain", "structstroid_1_1config_1_1_mesh_config.html#a062652781f4f3ea0b7ca8764362a7368", null ], - [ "inf_bdr_id", "structstroid_1_1config_1_1_mesh_config.html#a64cb00c8cba27267279a52207a4b5be0", null ], - [ "order", "structstroid_1_1config_1_1_mesh_config.html#a860e78f1906acb0c3aa08d55f94de3fd", null ], - [ "r_core", "structstroid_1_1config_1_1_mesh_config.html#a5c68a895f73dc82a38a8daac22a83ad7", null ], - [ "r_infinity", "structstroid_1_1config_1_1_mesh_config.html#ac7546899ebbfe191ea3a8bf2403b31eb", null ], - [ "r_instability", "structstroid_1_1config_1_1_mesh_config.html#a4da6d99ff7ba24d2f917e1fd98ddd877", null ], - [ "r_star", "structstroid_1_1config_1_1_mesh_config.html#a3fe80a30990d484dcc39b6f9a0befc05", null ], - [ "refinement_levels", "structstroid_1_1config_1_1_mesh_config.html#a8cafcbebf64ae251517118eb152de981", null ], - [ "surface_bdr_id", "structstroid_1_1config_1_1_mesh_config.html#a33f25ff277aa8834065e04ccb9cdbdda", null ], - [ "vacuum_id", "structstroid_1_1config_1_1_mesh_config.html#a36c7b05405691393d381086a27ea36ad", null ] + [ "continuity_order", "structstroid_1_1config_1_1_mesh_config.html#ae8bf54f7fd649578d44e46e96f501e34", null ], + [ "core_id", "structstroid_1_1config_1_1_mesh_config.html#ad6af127dd2bdcba58dd64eee24378dbe", null ], + [ "core_mapping", "structstroid_1_1config_1_1_mesh_config.html#a932e1257cacf5831c216bc3c48d4346d", null ], + [ "core_steepness", "structstroid_1_1config_1_1_mesh_config.html#aae33c48f949858944a6baa6033cebb7b", null ], + [ "envelope_id", "structstroid_1_1config_1_1_mesh_config.html#a8d30e307723eba6d964dfbe835532c8e", null ], + [ "flattening", "structstroid_1_1config_1_1_mesh_config.html#af25094952d1f73e0de4368fe7a5a6f6b", null ], + [ "include_external_domain", "structstroid_1_1config_1_1_mesh_config.html#acdb3428f1e33b6826f28334b58023432", null ], + [ "inf_bdr_id", "structstroid_1_1config_1_1_mesh_config.html#a25dbc70bcd2407ce7deaa0ee61b8886a", null ], + [ "optimization_methods", "structstroid_1_1config_1_1_mesh_config.html#adf95ea0245d8e864c795e3c594abd19e", null ], + [ "order", "structstroid_1_1config_1_1_mesh_config.html#aeb1b7fa26699dfa57e5b39a8cd9042ee", null ], + [ "r_core", "structstroid_1_1config_1_1_mesh_config.html#a497cda69d9e7a3e9b96960d25d0f37de", null ], + [ "r_infinity", "structstroid_1_1config_1_1_mesh_config.html#af181d2f6285ad8203025453d434e091e", null ], + [ "r_instability", "structstroid_1_1config_1_1_mesh_config.html#a882ce722c90fbd1792425f06577fa361", null ], + [ "r_star", "structstroid_1_1config_1_1_mesh_config.html#ae54149369309132d3058c21a0556c14f", null ], + [ "refinement_levels", "structstroid_1_1config_1_1_mesh_config.html#abb2757a2e4cbd63bb2b878ef5fccb95c", null ], + [ "surface_bdr_id", "structstroid_1_1config_1_1_mesh_config.html#a1def8d916aa47fcc1c90576cec7c13bd", null ], + [ "vacuum_id", "structstroid_1_1config_1_1_mesh_config.html#a6f745a2225c5a48256864ba859848ce9", null ], + [ "vacuum_outer_refinement_levels", "structstroid_1_1config_1_1_mesh_config.html#a8cf8a78cb10342afeaaaf55f2ec5f673", null ], + [ "vacuum_refinement_levels", "structstroid_1_1config_1_1_mesh_config.html#adbfd27ab0f86beedb15ecb1a2e8d92c9", null ] ]; \ No newline at end of file diff --git a/docs/html/topology_8cpp.html b/docs/html/topology_8cpp.html index e25fe7b..2341e39 100644 --- a/docs/html/topology_8cpp.html +++ b/docs/html/topology_8cpp.html @@ -31,7 +31,7 @@ Logo -
      stroid v0.2.1 +
      stroid v0.6.0
      Multi-block curvilinear mesh generation
      @@ -110,19 +110,25 @@ $(function(){initNavTree('topology_8cpp.html',''); initResizable(true); });
      #include "mfem.hpp"
      #include <vector>
      #include <memory>
      +#include <cmath>
      +#include <stdexcept>
      +#include <algorithm>
      +#include <limits>
      #include "stroid/config/config.h"
      #include "fourdst/config/config.h"
      Include dependency graph for topology.cpp:
      -
      +
      + +

      Namespaces

      namespace  stroid
       Public API surface for the stroid mesh generation library.
       
      namespace  stroid::topology
       Topology construction and curvilinear mapping utilities.
       
      - +

      @@ -131,7 +137,7 @@ Functions

       Build the initial multi-block mesh topology for the star model.
       
      void stroid::topology::Finalize (mfem::Mesh &mesh, const fourdst::config::Config< config::MeshConfig > &config)
       Finalize topology, validate orientation, and apply uniform refinement.
       Finalize topology, validate orientation, and apply the configured refinement policy.
       
      diff --git a/docs/html/topology_8cpp__incl.map b/docs/html/topology_8cpp__incl.map index 8896ed3..0418aff 100644 --- a/docs/html/topology_8cpp__incl.map +++ b/docs/html/topology_8cpp__incl.map @@ -1,13 +1,31 @@ - + - + - + - - - - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/topology_8cpp__incl.md5 b/docs/html/topology_8cpp__incl.md5 index 05c9694..bb768e1 100644 --- a/docs/html/topology_8cpp__incl.md5 +++ b/docs/html/topology_8cpp__incl.md5 @@ -1 +1 @@ -9579b4c4c61aad1700ed9ec77f8cef0d \ No newline at end of file +35f177306fe399627acb0aa33e7d59c7 \ No newline at end of file diff --git a/docs/html/topology_8cpp__incl.svg b/docs/html/topology_8cpp__incl.svg index 4a9b3df..2998545 100644 --- a/docs/html/topology_8cpp__incl.svg +++ b/docs/html/topology_8cpp__incl.svg @@ -1,13 +1,12 @@ - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + src/lib/topology/topology.cpp Node1 - -src/lib/topology/topology.cpp + +src/lib/topology/topology.cpp @@ -32,8 +68,8 @@ Node2 - -mfem.hpp + +mfem.hpp @@ -41,8 +77,8 @@ Node1->Node2 - - + + @@ -50,8 +86,8 @@ Node3 - -vector + +vector @@ -59,8 +95,8 @@ Node1->Node3 - - + + @@ -68,8 +104,8 @@ Node4 - -memory + +memory @@ -77,17 +113,17 @@ Node1->Node4 - - + + Node5 - - -stroid/config/config.h + + +cmath @@ -95,8 +131,8 @@ Node1->Node5 - - + + @@ -104,8 +140,8 @@ Node6 - -fourdst/config/config.h + +stdexcept @@ -113,13 +149,196 @@ Node1->Node6 - - + + + + + + + +Node7 + + +algorithm + + + + + +Node1->Node7 + + + + + + + + +Node8 + + +limits + + + + + +Node1->Node8 + + + + + + + + +Node9 + + +stroid/config/config.h + + + + + +Node1->Node9 + + + + + + + + +Node15 + + +fourdst/config/config.h + + + + + +Node1->Node15 + + + + + + + + +Node10 + + +cstdint + + + + + +Node9->Node10 + + + + + + + + +Node11 + + +optional + + + + + +Node9->Node11 + + + + + + + + +Node12 + + +string + + + + + +Node9->Node12 + + + + + + + + +Node13 + + +format + + + + + +Node9->Node13 + + + + + + + + +Node14 + + +sstream + + + + + +Node9->Node14 + + + + + + + + + + + + + + + + + + + + + Logo -
      stroid v0.2.1 +
      stroid v0.6.0
      Multi-block curvilinear mesh generation
      @@ -114,14 +114,21 @@ $(function(){initNavTree('topology_8h.html',''); initResizable(true); });
      Include dependency graph for topology.h:
      -
      +
      +
      +
      +This graph shows which files directly or indirectly include this file:
      +
      +
      + +

      Namespaces

      namespace  stroid
       Public API surface for the stroid mesh generation library.
       
      namespace  stroid::topology
       Topology construction and curvilinear mapping utilities.
       
      - +

      @@ -130,7 +137,7 @@ Functions

       Build the initial multi-block mesh topology for the star model.
       
      void stroid::topology::Finalize (mfem::Mesh &mesh, const fourdst::config::Config< config::MeshConfig > &config)
       Finalize topology, validate orientation, and apply uniform refinement.
       Finalize topology, validate orientation, and apply the configured refinement policy.
       
    diff --git a/docs/html/topology_8h__incl.map b/docs/html/topology_8h__incl.map index 878a986..d00b48c 100644 --- a/docs/html/topology_8h__incl.map +++ b/docs/html/topology_8h__incl.map @@ -1,11 +1,21 @@ - - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/topology_8h__incl.md5 b/docs/html/topology_8h__incl.md5 index 1bd48fe..5f8c0e9 100644 --- a/docs/html/topology_8h__incl.md5 +++ b/docs/html/topology_8h__incl.md5 @@ -1 +1 @@ -b2a69d423ae47906416c55db34906c94 \ No newline at end of file +dbeb5f5c67402daa36c503239a843e28 \ No newline at end of file diff --git a/docs/html/topology_8h__incl.svg b/docs/html/topology_8h__incl.svg index 0bae36e..39d73b3 100644 --- a/docs/html/topology_8h__incl.svg +++ b/docs/html/topology_8h__incl.svg @@ -1,11 +1,11 @@ - - + @@ -17,15 +17,15 @@ ]]> - + src/include/stroid/topology/topology.h Node1 - -src/include/stroid -/topology/topology.h + +src/include/stroid +/topology/topology.h @@ -33,8 +33,8 @@ Node2 - -mfem.hpp + +mfem.hpp @@ -42,8 +42,8 @@ Node1->Node2 - - + + @@ -51,8 +51,8 @@ Node3 - -stroid/config/config.h + +stroid/config/config.h @@ -60,8 +60,44 @@ Node1->Node3 - - + + + + + + + +Node9 + + +fourdst/config/config.h + + + + + +Node1->Node9 + + + + + + + + +Node10 + + +memory + + + + + +Node1->Node10 + + + @@ -69,17 +105,17 @@ Node4 - -fourdst/config/config.h + +cstdint - - -Node1->Node4 - - - + + +Node3->Node4 + + + @@ -87,17 +123,71 @@ Node5 - -memory + +optional - - -Node1->Node5 - - - + + +Node3->Node5 + + + + + + + + +Node6 + + +string + + + + + +Node3->Node6 + + + + + + + + +Node7 + + +format + + + + + +Node3->Node7 + + + + + + + + +Node8 + + +sstream + + + + + +Node3->Node8 + + + diff --git a/docs/html/topology_8h__incl_org.svg b/docs/html/topology_8h__incl_org.svg index 39c51a1..af0e70e 100644 --- a/docs/html/topology_8h__incl_org.svg +++ b/docs/html/topology_8h__incl_org.svg @@ -1,20 +1,20 @@ - - - + + src/include/stroid/topology/topology.h Node1 - -src/include/stroid -/topology/topology.h + +src/include/stroid +/topology/topology.h @@ -22,8 +22,8 @@ Node2 - -mfem.hpp + +mfem.hpp @@ -31,8 +31,8 @@ Node1->Node2 - - + + @@ -40,8 +40,8 @@ Node3 - -stroid/config/config.h + +stroid/config/config.h @@ -49,8 +49,44 @@ Node1->Node3 - - + + + + + + + +Node9 + + +fourdst/config/config.h + + + + + +Node1->Node9 + + + + + + + + +Node10 + + +memory + + + + + +Node1->Node10 + + + @@ -58,17 +94,17 @@ Node4 - -fourdst/config/config.h + +cstdint - - -Node1->Node4 - - - + + +Node3->Node4 + + + @@ -76,17 +112,71 @@ Node5 - -memory + +optional - - -Node1->Node5 - - - + + +Node3->Node5 + + + + + + + + +Node6 + + +string + + + + + +Node3->Node6 + + + + + + + + +Node7 + + +format + + + + + +Node3->Node7 + + + + + + + + +Node8 + + +sstream + + + + + +Node3->Node8 + + + diff --git a/docs/static/mainpage.md b/docs/static/mainpage.md index 9f61eaa..0017e0c 100644 --- a/docs/static/mainpage.md +++ b/docs/static/mainpage.md @@ -1,3 +1,4 @@ +![stroid logo](assets/logo/Logo.png) # Stroid ## A multi-block mesh generation tool for stellar modeling @@ -11,7 +12,7 @@ and non-singular meshes. ## Building and Installing Stroid uses meson as its build system, specifically we require version 1.3.0 or higher. Further, stroid depends on C++23 standard library features, so both a compatible compiler and standard template -library are required. All other dependencies are handled by meson and will be downloaded and built +library are required. All other dependencies are handled by meson and will be downloaded and built automatically. ### Building @@ -91,62 +92,180 @@ inf_bdr_id = 2 core_id = 1 envelope_id = 2 vacuum_id = 3 +core_mapping = "multi_block" + + +[main.optimization_methods] +tmop = false +smoothstep = true ``` -| Parameter | Description | Default | -|-------------------------|-----------------------------------------------------------------------------------------------------|---------| -| refinement_levels | Number of uniform refinement levels to apply to the mesh after generation | 4 | -| order | The polynomial order of the finite elements in the mesh | 3 | -| include_external_domain | Whether to include an external domain extending to r_infinity | true | -| r_core | The radius of the core region of the star | 1.5 | -| r_star | The radius of the star | 5.0 | -| flattening | The flattening factor of the star (0 for spherical, >0 for oblate) | 0 | -| r_infinity | The outer radius of the external domain (if included) | 6.0 | -| r_instability | The radius at which no transformations are applied to the initial topology (to avoid singularities) | 1e-14 | -| core_steepness | The steepness of the transition between the core and envelope regions of the star | 1.0 | -| surface_bdr_id | The boundary ID to assign to the surface of the star | 1 | -| inf_bdr_id | The boundary ID to assign to the outer boundary of the external domain (if included) | 2 | -| core_id | The material ID to assign to the core region of the star | 1 | -| envelope_id | The material ID to assign to the envelope region of the star | 2 | -| vacuum_id | The material ID to assign to the vacuum region of the star (if included) | 3 | +| Parameter | Description | Default | +|---------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------| +| refinement_levels | Stellar minimum depth, or uniform depth when vacuum overrides are omitted | 4 | +| order | The polynomial order of the finite elements in the mesh | 3 | +| include_external_domain | Whether to include an external domain extending to r_infinity | true | +| r_core | The radius of the core region of the star | 0.25 | +| r_star | The radius of the star | 1.0 | +| flattening | The flattening factor of the star (0 for spherical, >0 for oblate) | 0 | +| r_infinity | The outer radius of the external domain (if included) | 6.0 | +| r_instability | The radius at which no transformations are applied to the initial topology (to avoid singularities) | 1e-14 | +| core_steepness | The steepness of the transition between the core and envelope regions of the star | 1.0 | +| surface_bdr_id | The boundary ID to assign to the surface of the star | 1 | +| inf_bdr_id | The boundary ID to assign to the outer boundary of the external domain (if included) | 2 | +| core_id | The material ID to assign to the core region of the star | 1 | +| envelope_id | The material ID to assign to the envelope region of the star | 2 | +| vacuum_id | The material ID to assign to the vacuum region of the star (if included) | 3 | +| optimization_methods.tmop | The tmop flag enables or disables the use of TMOP ideal shape unit size metric optimization during mesh generation. This can help improve the quality of the generated mesh, but will dramatically increase the time required for mesh generation. | false | +| optimization_methods.smoothstep | The smoothstep flag enables or disables the use of a smoothstep function to transition between the core and envelope regions of the star. This can help improve the quality of the generated mesh | true | +| core_mapping | The core mapping strategy to use for the mesh generation. Options are "spherified" (legacy) or "multi_block" (conditioned). The multi_block strategy is strongly preferred for its improved condition number. | "multi_block" | If no configuration file is provided, stroid will use the default parameters listed above. Further, configuration files -need only include parameters that differ from the defaults, any parameters not specified will use the default values. +need only include parameters that differ from the defaults. For compatibility with older TOML files, +an omitted `core_mapping` uses `"spherified"`, and omitted TMOP controls leave optimization disabled. +Set `core_mapping = "multi_block"` explicitly to use the conditioned mapping in a TOML file. +Default-constructed C++ and Python `MeshConfig` objects select `"multi_block"`; other omitted TOML +geometry fields use the defaults from `MeshConfig`. + +### Conditioned core mapping + +There are two core mapping strategies, spherified and multi_block. Generally multi_block should be strongly preferred. The +`core_mapping = "multi_block"` strategy avoids the radial rank loss at the eight corners of the spherified core +block. It uses a Cartesian center plus six transition blocks inside the core. The inner cube has circumscribed radius +`r_core / 2`; its six faces connect linearly to the existing spherical `r_core` interface. If enabled, spheroidal flattening is +applied afterwards. + +```python +cfg = stroid.config.MeshConfig(core_mapping="multi_block", refinement_levels=2) +cfg.optimization_methods = stroid.config.OptimizationMethods(tmop=False) +mesh = stroid.GenerateMesh(cfg) +``` + +The optional, non-installed `geometry_quality_experiment` target may be used to measure the actual high-order geometry +at quadrature points, vertices, edges, and near-corner probes. You may build and run it explicitly: + +```bash +meson compile -C build geometry_quality_experiment +build/tools/geometry_quality_experiment --orders 4 --refinements 2 \ + --contraction-probe --probe-order 3 --output core_comparison.csv +``` + +### Nonconforming vacuum refinement + +Stroid can keep the star and both ends of the vacuum well resolved while using +coarser elements in the vacuum interior. Refinement is isotropic: each refinement +splits a hexahedron into eight children. Note however that only one geometric polynomial `order` applies +to every region. + +```toml +[main] +refinement_levels = 4 +vacuum_refinement_levels = 2 +# Optional: omitted outer depth inherits refinement_levels (4 here). +# vacuum_outer_refinement_levels = 4 +order = 3 +include_external_domain = true +core_mapping = "multi_block" + +[main.optimization_methods] +tmop = false +smoothstep = true +``` + +`configs/nonconforming_vacuum.toml` provides a complete example. The three depth +settings are absolute minimum targets measured from the initial block topology: + +| Setting | Applies to | Default | +|----------------------------------|------------------------------------------|-----------------------------| +| `refinement_levels` | Core and envelope | `4` | +| `vacuum_refinement_levels` | Vacuum interior | Inherit `refinement_levels` | +| `vacuum_outer_refinement_levels` | Cells touching the vacuum outer boundary | Inherit `refinement_levels` | + +Omitting both vacuum overrides preserves uniform generation. Supplying either +activates the local refinement policy and requires `include_external_domain = true`. +All levels must be nonnegative integers. + +Stroid enforces that vacuum cells touching the stellar surface match the stellar face subdivision. That is to say that +the inner boundary of the vacuum region is conforming to the outer boundary of the stellar region. Further, the +outer-boundary cells receive the outer target, and automatic grading limits neighboring refinement depths to one level. +This two layer approach is intended to allow for refinement when using compactification maps. + +```python +import stroid + +cfg = stroid.config.MeshConfig( + refinement_levels=4, + vacuum_refinement_levels=2, + vacuum_outer_refinement_levels=None, # Inherit stellar depth. + order=3, + core_mapping="multi_block", + optimization_methods=stroid.config.OptimizationMethods(tmop=False), +) +mesh = stroid.GenerateMesh(cfg) +features = stroid.stats.MESH_STAT_DEFAULT | stroid.stats.MeshStatFeatures.ELEMENT_COUNT +stats = stroid.stats.ComputeMeshStats(mesh, features) +print(stats.element_counts.vacuum) +print(stats.refinement.vacuum.min_depth, stats.refinement.vacuum.max_depth) +print(stats.refinement.geometry_dofs, stats.refinement.geometry_true_dofs) +print(stats.conformity.conforming, stats.conformity.n_nonconforming_faces) + +stroid.IO.SaveStroidMesh(mesh, "graded.stroid") +restored = stroid.IO.LoadStroidMesh("graded.stroid") +stroid.refinement.UniformRefinement(restored, 1) +``` + + +The `UniformRefinement(mesh, n)` function adds `n` levels to every current leaf while preserving the +existing grading, and rebuilds the geometry and exterior coordinate. Note that this means that a non-conforming mesh +that has been Uniformly refined will still be non-conforming, but the refinement will be applied to all leaves. + +#### Viewing curved meshes in GLVis + +It is important to note --- and potentially confusing if not understood --- that GLVis approximates curved faces with +flat triangles. At a hanging interface, the same subdivision count on a coarse face and its finer neighbors samples the +curved surface at different locations. This can produce apparent gaps even when the finite-element face transformations +agree. These gaps are not indications that the mesh itself is non-conforming; rather, they are a visualization artifact. ### C++ Interface Stroid can be used as a library in C++ projects. After installation, include the stroid header and link against the stroid library. A basic example of using stroid in C++ is shown below (note that you will need a glvis instance running on localhost:19916 to visualize the mesh): ```c++ -#include -#include "mfem.hpp" - -#include "stroid/config/config.h" -#include "stroid/IO/mesh.h" -#include "stroid/topology/curvilinear.h" -#include "stroid/topology/topology.h" - -#include "fourdst/config/config.h" +#include "stroid/stroid.h" int main() { - const fourdst::config::Config cfg; + stroid::config::MeshConfig cfg; + cfg.refinement_levels = 4; + cfg.vacuum_refinement_levels = 2; + cfg.optimization_methods = stroid::config::OptimizationMethods{false, true}; - const std::unique_ptr mesh = stroid::topology::BuildSkeleton(cfg); - stroid::topology::Finalize(*mesh, cfg); - stroid::topology::PromoteToHighOrder(*mesh, cfg); - stroid::topology::ProjectMesh(*mesh, cfg); - - - stroid::IO::ViewMesh(*mesh, "Spheroidal Mesh", stroid::IO::VISUALIZATION_MODE::BOUNDARY_ELEMENT_ID); + auto mesh = stroid::GenerateMesh(cfg); + stroid::IO::SaveStroidMesh(mesh, "graded.stroid"); + stroid::IO::ViewMesh(mesh, "Spheroidal Mesh", stroid::IO::VISUALIZATION_MODE::ELEMENT_ID, "localhost", 19916); } ``` +## Example Meshes +An example mesh with the default configuration parameters is shown below (coloration indicates attribute IDs of different regions): +![Example Mesh](assets/imgs/ExampleMesh_multi-block.png) + +The legacy spherified core mapping strategy is shown below as well +![Example Spheried Mesh](assets/imgs/ExampleMesh_spherified.png) + +An example of a non-conforming mesh generated with stroid. Note that the gaps between elements are a visualization artifact +rather than true gaps within the mesh. +![Non Conforming Mesh](assets/imgs/ExampleMesh_NC.png) + +Note that both of these meshes are shown with 3 levels of refinement and polynomial order 3. Blue shows the core +domain, yellow shows the envelope domain, while purple shows the vacuum domain. + + ## Funding Stroid is developed as part of the 4D-STAR project. 4D-STAR is funded by European Research Council (ERC) under the Horizon Europe programme (Synergy Grant agreement No. 101071505: 4D-STAR) Work for this project is funded by the European Union. Views and opinions expressed are however those of the author(s) -only and do not necessarily reflect those of the European Union or the European Research Council. \ No newline at end of file +only and do not necessarily reflect those of the European Union or the European Research Council. diff --git a/meson.build b/meson.build index 0c15932..45580a9 100644 --- a/meson.build +++ b/meson.build @@ -1,4 +1,4 @@ -project('stroid', 'cpp', meson_version : '>= 1.3.0', version : 'v0.5.0', default_options : ['cpp_std=c++23']) +project('stroid', 'cpp', meson_version : '>= 1.3.0', version : 'v0.6.0', default_options : ['cpp_std=c++23']) subdir('build-check') diff --git a/readme.md b/readme.md index 58955fb..8455ef5 100644 --- a/readme.md +++ b/readme.md @@ -103,11 +103,11 @@ smoothstep = true | Parameter | Description | Default | |---------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------| -| refinement_levels | Number of uniform refinement levels to apply to the mesh after generation | 4 | +| refinement_levels | Stellar minimum depth, or uniform depth when vacuum overrides are omitted | 4 | | order | The polynomial order of the finite elements in the mesh | 3 | | include_external_domain | Whether to include an external domain extending to r_infinity | true | -| r_core | The radius of the core region of the star | 1.5 | -| r_star | The radius of the star | 5.0 | +| r_core | The radius of the core region of the star | 0.25 | +| r_star | The radius of the star | 1.0 | | flattening | The flattening factor of the star (0 for spherical, >0 for oblate) | 0 | | r_infinity | The outer radius of the external domain (if included) | 6.0 | | r_instability | The radius at which no transformations are applied to the initial topology (to avoid singularities) | 1e-14 | @@ -123,7 +123,11 @@ smoothstep = true If no configuration file is provided, stroid will use the default parameters listed above. Further, configuration files -need only include parameters that differ from the defaults, any parameters not specified will use the default values. +need only include parameters that differ from the defaults. For compatibility with older TOML files, +an omitted `core_mapping` uses `"spherified"`, and omitted TMOP controls leave optimization disabled. +Set `core_mapping = "multi_block"` explicitly to use the conditioned mapping in a TOML file. +Default-constructed C++ and Python `MeshConfig` objects select `"multi_block"`; other omitted TOML +geometry fields use the defaults from `MeshConfig`. ### Conditioned core mapping @@ -148,32 +152,98 @@ build/tools/geometry_quality_experiment --orders 4 --refinements 2 \ --contraction-probe --probe-order 3 --output core_comparison.csv ``` +### Nonconforming vacuum refinement + +Stroid can keep the star and both ends of the vacuum well resolved while using +coarser elements in the vacuum interior. Refinement is isotropic: each refinement +splits a hexahedron into eight children. Note however that only one geometric polynomial `order` applies +to every region. + +```toml +[main] +refinement_levels = 4 +vacuum_refinement_levels = 2 +# Optional: omitted outer depth inherits refinement_levels (4 here). +# vacuum_outer_refinement_levels = 4 +order = 3 +include_external_domain = true +core_mapping = "multi_block" + +[main.optimization_methods] +tmop = false +smoothstep = true +``` + +`configs/nonconforming_vacuum.toml` provides a complete example. The three depth +settings are absolute minimum targets measured from the initial block topology: + +| Setting | Applies to | Default | +|----------------------------------|------------------------------------------|-----------------------------| +| `refinement_levels` | Core and envelope | `4` | +| `vacuum_refinement_levels` | Vacuum interior | Inherit `refinement_levels` | +| `vacuum_outer_refinement_levels` | Cells touching the vacuum outer boundary | Inherit `refinement_levels` | + +Omitting both vacuum overrides preserves uniform generation. Supplying either +activates the local refinement policy and requires `include_external_domain = true`. +All levels must be nonnegative integers. + +Stroid enforces that vacuum cells touching the stellar surface match the stellar face subdivision. That is to say that +the inner boundary of the vacuum region is conforming to the outer boundary of the stellar region. Further, the +outer-boundary cells receive the outer target, and automatic grading limits neighboring refinement depths to one level. +This two layer approach is intended to allow for refinement when using compactification maps. + +```python +import stroid + +cfg = stroid.config.MeshConfig( + refinement_levels=4, + vacuum_refinement_levels=2, + vacuum_outer_refinement_levels=None, # Inherit stellar depth. + order=3, + core_mapping="multi_block", + optimization_methods=stroid.config.OptimizationMethods(tmop=False), +) +mesh = stroid.GenerateMesh(cfg) +features = stroid.stats.MESH_STAT_DEFAULT | stroid.stats.MeshStatFeatures.ELEMENT_COUNT +stats = stroid.stats.ComputeMeshStats(mesh, features) +print(stats.element_counts.vacuum) +print(stats.refinement.vacuum.min_depth, stats.refinement.vacuum.max_depth) +print(stats.refinement.geometry_dofs, stats.refinement.geometry_true_dofs) +print(stats.conformity.conforming, stats.conformity.n_nonconforming_faces) + +stroid.IO.SaveStroidMesh(mesh, "graded.stroid") +restored = stroid.IO.LoadStroidMesh("graded.stroid") +stroid.refinement.UniformRefinement(restored, 1) +``` + + +The `UniformRefinement(mesh, n)` function adds `n` levels to every current leaf while preserving the +existing grading, and rebuilds the geometry and exterior coordinate. Note that this means that a non-conforming mesh +that has been Uniformly refined will still be non-conforming, but the refinement will be applied to all leaves. + +#### Viewing curved meshes in GLVis + +It is important to note --- and potentially confusing if not understood --- that GLVis approximates curved faces with +flat triangles. At a hanging interface, the same subdivision count on a coarse face and its finer neighbors samples the +curved surface at different locations. This can produce apparent gaps even when the finite-element face transformations +agree. These gaps are not indications that the mesh itself is non-conforming; rather, they are a visualization artifact. + ### C++ Interface Stroid can be used as a library in C++ projects. After installation, include the stroid header and link against the stroid library. A basic example of using stroid in C++ is shown below (note that you will need a glvis instance running on localhost:19916 to visualize the mesh): ```c++ -#include -#include "mfem.hpp" - -#include "stroid/config/config.h" -#include "stroid/IO/mesh.h" -#include "stroid/topology/curvilinear.h" -#include "stroid/topology/topology.h" - -#include "fourdst/config/config.h" +#include "stroid/stroid.h" int main() { - const fourdst::config::Config cfg; + stroid::config::MeshConfig cfg; + cfg.refinement_levels = 4; + cfg.vacuum_refinement_levels = 2; + cfg.optimization_methods = stroid::config::OptimizationMethods{false, true}; - const std::unique_ptr mesh = stroid::topology::BuildSkeleton(cfg); - stroid::topology::Finalize(*mesh, cfg); - stroid::topology::PromoteToHighOrder(*mesh, cfg); - stroid::topology::ProjectMesh(*mesh, cfg); - stroid::topology::OptimizeMesh(*mesh, cfg); - - - stroid::IO::ViewMesh(*mesh, "Spheroidal Mesh", stroid::IO::VISUALIZATION_MODE::BOUNDARY_ELEMENT_ID); + auto mesh = stroid::GenerateMesh(cfg); + stroid::IO::SaveStroidMesh(mesh, "graded.stroid"); + stroid::IO::ViewMesh(mesh, "Spheroidal Mesh", stroid::IO::VISUALIZATION_MODE::ELEMENT_ID, "localhost", 19916); } ``` @@ -184,8 +254,12 @@ An example mesh with the default configuration parameters is shown below (colora The legacy spherified core mapping strategy is shown below as well ![Example Spheried Mesh](assets/imgs/ExampleMesh_spherified.png) -Note that both of these meshes are shown with 3 levels of refinement and polynomial order 3. Blue shows the stellar -domain while purple shows the vacuum domain. +An example of a non-conforming mesh generated with stroid. Note that the gaps between elements are a visualization artifact +rather than true gaps within the mesh. +![Non Conforming Mesh](assets/imgs/ExampleMesh_NC.png) + +Note that both of these meshes are shown with 3 levels of refinement and polynomial order 3. Blue shows the core +domain, yellow shows the envelope domain, while purple shows the vacuum domain. ## Funding diff --git a/src/include/stroid/IO/mesh.h b/src/include/stroid/IO/mesh.h index 0fce639..fb76cbf 100644 --- a/src/include/stroid/IO/mesh.h +++ b/src/include/stroid/IO/mesh.h @@ -2,6 +2,7 @@ #include #include #include +#include #include "mfem.hpp" @@ -57,6 +58,14 @@ namespace stroid::IO { */ void SaveVTU(const stroid::StroidMesh& mesh, const std::string& exportName); + /** + * @brief Make a display-only mesh copy with matching face subdivisions. + * This is purely for visualization and should not be used for any science goals. + * @param mesh Source mesh whose geometry is to be displayed. + * @return Independently owned copy with no hanging faces. + */ + std::unique_ptr MakeConformingVisualizationMesh(const mfem::Mesh& mesh); + /** * @brief Stream a mesh to a running GLVis server for interactive viewing. * @param mesh Mesh to display. @@ -64,18 +73,27 @@ namespace stroid::IO { * @param mode Attribute visualization mode. * @param vishost GLVis server host. * @param visport GLVis server port. + * @param conforming_display Refine a display-only copy at hanging interfaces + * to prevent GLVis tessellation gaps. Set false to inspect the original + * element layout, which can show rendering gaps on curved interfaces. + * */ - void ViewMesh(mfem::Mesh &mesh, const std::string& title, VISUALIZATION_MODE mode, const std::string &vishost, int visport); + void ViewMesh(mfem::Mesh &mesh, const std::string& title, VISUALIZATION_MODE mode, const std::string &vishost, int visport, bool conforming_display=true); - void ViewMesh(const stroid::StroidMesh& mesh, const std::string& title, VISUALIZATION_MODE mode, const std::string &vishost, int visport); + void ViewMesh(const stroid::StroidMesh& mesh, const std::string& title, VISUALIZATION_MODE mode, const std::string &vishost, int visport, bool conforming_display=true); /** - * @brief Visualize boundary face valence (1=surface, 2=internal). + * @brief Color boundary-adjacent elements by face valence (1=surface, 2=internal). + * Untagged elements are zero; elements touching several tagged faces use + * the maximum valence. Values are computed before display subdivision. * @param mesh Mesh whose boundary faces are inspected. + * @param vishost GLVis server host. + * @param visport GLVis server port. + * @param conforming_display Use the same display-only refinement as ViewMesh. */ - void VisualizeFaceValence(mfem::Mesh& mesh, const std::string &vishost, int visport); + void VisualizeFaceValence(mfem::Mesh& mesh, const std::string &vishost, int visport, bool conforming_display=true); - void VisualizeFaceValence(const stroid::StroidMesh& mesh, const std::string &vishost, int visport); + void VisualizeFaceValence(const stroid::StroidMesh& mesh, const std::string &vishost, int visport, bool conforming_display=true); std::expected ParseStroidMesh(std::istream& is); std::expected LoadStroidMesh(const std::string& filename); @@ -84,4 +102,4 @@ namespace stroid::IO { std::expected ParseStroidMesh(std::istream& is, MPI_Comm comm); std::expected LoadStroidMesh(const std::string& filename, MPI_Comm comm); #endif -} \ No newline at end of file +} diff --git a/src/include/stroid/config/config.h b/src/include/stroid/config/config.h index 999576f..1f14ef0 100644 --- a/src/include/stroid/config/config.h +++ b/src/include/stroid/config/config.h @@ -19,15 +19,35 @@ namespace stroid::config { * These values are typically loaded via * `fourdst::config::Config` from a TOML file. * The README shows the expected TOML layout under the `[main]` table. - * Unspecified keys use the defaults defined here. + * Unspecified geometry keys use the defaults defined here. ResolveDefaults preserves + * the historical fallback for omitted mapping and optimization controls in TOML files. */ struct MeshConfig { /** - * @brief Number of uniform refinement passes applied after topology creation. + * @brief Stellar refinement depth, or uniform depth when vacuum overrides are absent. * @section toml * - [main].refinement_levels */ std::optional refinement_levels = 4; + /** + * @brief Minimum refinement depth in the vacuum interior; unset inherits `refinement_levels`. + * + * Setting either vacuum override enables local isotropic refinement. Vacuum cells at the + * stellar surface match the stellar refinement, and automatic one-level grading can + * raise the interior depth above this minimum. Requires an external domain. + * @section toml + * - [main].vacuum_refinement_levels + */ + std::optional vacuum_refinement_levels = std::nullopt; + /** + * @brief Minimum refinement depth at the vacuum outer boundary; unset inherits `refinement_levels`. + * + * Boundary-adjacent cells are refined automatically, with grading toward the vacuum + * interior. Geometry uses the same polynomial order in every region. + * @section toml + * - [main].vacuum_outer_refinement_levels + */ + std::optional vacuum_outer_refinement_levels = std::nullopt; /** * @brief Polynomial order for high-order elements. * @section toml @@ -139,6 +159,39 @@ namespace stroid::config { }; + /** + * @brief Fill omitted configuration values. + */ + inline MeshConfig ResolveDefaults(const MeshConfig& mesh_config) { + const MeshConfig defaults; + MeshConfig resolved = mesh_config; + auto resolve = [](auto& value, const auto& default_value) { + if (!value.has_value()) value = default_value; + }; + + resolve(resolved.refinement_levels, defaults.refinement_levels); + resolve(resolved.order, defaults.order); + resolve(resolved.include_external_domain, defaults.include_external_domain); + resolve(resolved.r_core, defaults.r_core); + resolve(resolved.r_star, defaults.r_star); + resolve(resolved.flattening, defaults.flattening); + resolve(resolved.r_infinity, defaults.r_infinity); + resolve(resolved.r_instability, defaults.r_instability); + resolve(resolved.core_steepness, defaults.core_steepness); + resolve(resolved.continuity_order, defaults.continuity_order); + resolve(resolved.surface_bdr_id, defaults.surface_bdr_id); + resolve(resolved.inf_bdr_id, defaults.inf_bdr_id); + resolve(resolved.core_id, defaults.core_id); + resolve(resolved.envelope_id, defaults.envelope_id); + resolve(resolved.vacuum_id, defaults.vacuum_id); + resolved.core_mapping = resolved.core_mapping.value_or("spherified"); + resolved.optimization_methods = resolved.optimization_methods.value_or(OptimizationMethods{}); + resolved.optimization_methods->tmop = resolved.optimization_methods->tmop.value_or(false); + resolved.optimization_methods->smoothstep = resolved.optimization_methods->smoothstep.value_or(true); + + return resolved; + } + inline std::string to_string(const MeshConfig &mesh_config) { auto opt_2_string = [](const OptimizationMethods& opt) { std::stringstream ss; @@ -160,6 +213,8 @@ namespace stroid::config { ss << "MeshConfig:\n"; ss << std::format(" refinement_levels: {}\n", mesh_config.refinement_levels.value_or(4)); + ss << std::format(" vacuum_refinement_levels: {}\n", mesh_config.vacuum_refinement_levels.has_value() ? std::to_string(*mesh_config.vacuum_refinement_levels) : "inherit"); + ss << std::format(" vacuum_outer_refinement_levels: {}\n", mesh_config.vacuum_outer_refinement_levels.has_value() ? std::to_string(*mesh_config.vacuum_outer_refinement_levels) : "inherit"); ss << std::format(" order: {}\n", mesh_config.order.value_or(3)); ss << std::format(" include_external_domain: {}\n", mesh_config.include_external_domain.value_or(true)); ss << std::format(" r_core: {}\n", mesh_config.r_core.value_or(0.25)); diff --git a/src/include/stroid/refinement/uniform.h b/src/include/stroid/refinement/uniform.h index 6b028dd..e01a5a5 100644 --- a/src/include/stroid/refinement/uniform.h +++ b/src/include/stroid/refinement/uniform.h @@ -3,5 +3,11 @@ #include "stroid/utils/types.h" namespace stroid::refinement { + /** + * @brief Refine every current leaf, preserving any existing nonconforming hierarchy. + * Rebuilds constrained geometry and the exterior coordinate from the refined + * reference mesh. The saved generation configuration is unchanged; the + * refinement counter and actual regional depths increase by @p levels. + */ void UniformRefinement(StroidMesh& mesh, size_t levels); -} \ No newline at end of file +} diff --git a/src/include/stroid/stroid.h b/src/include/stroid/stroid.h index 3864ccc..ce7be45 100644 --- a/src/include/stroid/stroid.h +++ b/src/include/stroid/stroid.h @@ -49,7 +49,11 @@ * @endcode */ namespace stroid { - inline StroidMesh GenerateMesh(const fourdst::config::Config& cfg) { + inline StroidMesh GenerateMesh(const fourdst::config::Config& input) { + fourdst::config::Config cfg; + cfg.mutate([&input](config::MeshConfig& value) { + value = config::ResolveDefaults(*input); + }); StroidMesh sm; sm.type = MFEM_MESH_TYPE::SERIAL; sm.config = *cfg; @@ -59,9 +63,7 @@ namespace stroid { sm.reference_mesh = std::move(reference); sm.mesh = utils::BuildProjected(*sm.reference_mesh, cfg); - if (cfg->optimization_methods.has_value() && cfg->optimization_methods.value().tmop.has_value() && cfg->optimization_methods.value().tmop.value()) { - stroid::topology::ApplyTMOP(*sm.mesh, cfg); - } + stroid::topology::OptimizeMesh(*sm.mesh, cfg); sm.exterior_coordinate = stroid::topology::BuildExteriorCoordinate(*sm.mesh, *sm.reference_mesh, cfg); return sm; } diff --git a/src/include/stroid/topology/topology.h b/src/include/stroid/topology/topology.h index 3327893..a45253d 100644 --- a/src/include/stroid/topology/topology.h +++ b/src/include/stroid/topology/topology.h @@ -15,9 +15,11 @@ namespace stroid::topology { */ std::unique_ptr BuildSkeleton(const fourdst::config::Config & config); /** - * @brief Finalize topology, validate orientation, and apply uniform refinement. + * @brief Finalize topology, validate orientation, and apply the configured refinement policy. * @param mesh Mesh to finalize in-place. - * @param config Mesh configuration (uses `refinement_levels`). + * @param config Mesh configuration. Vacuum refinement overrides enable a + * balanced hierarchy with fine layers at both vacuum boundaries and a + * conforming stellar interface. Without overrides, refinement is uniform. */ void Finalize(mfem::Mesh& mesh, const fourdst::config::Config &config); } diff --git a/src/include/stroid/utils/mesh_stats.h b/src/include/stroid/utils/mesh_stats.h index 32c5f45..2dff3d0 100644 --- a/src/include/stroid/utils/mesh_stats.h +++ b/src/include/stroid/utils/mesh_stats.h @@ -25,6 +25,7 @@ namespace stroid::stats { CENTROID = 1u << 10, CONFIG_META = 1u << 11, BOUNDING_BOX = 1u << 12, + REFINEMENT = 1u << 13, }; constexpr MeshStatFeatures operator|(MeshStatFeatures lhs, MeshStatFeatures rhs) { @@ -41,7 +42,7 @@ namespace stroid::stats { inline constexpr MeshStatFeatures MESH_STAT_DEFAULT = MeshStatFeatures::RADIUS | MeshStatFeatures::AXES | MeshStatFeatures::ELLIPTICITY | - MeshStatFeatures::CONFORMITY | MeshStatFeatures::CONFIG_META; + MeshStatFeatures::CONFORMITY | MeshStatFeatures::CONFIG_META | MeshStatFeatures::REFINEMENT; inline constexpr auto MESH_STAT_ALL = static_cast(0xFFFFFFFFu); @@ -70,9 +71,27 @@ namespace stroid::stats { struct ConformityStats { bool conforming = true; + bool hierarchy_enabled = false; + // Fine patches are counted once; their coarse master faces are excluded. long n_nonconforming_faces = 0; }; + struct RegionRefinementStats { + // An absent region has both depths set to -1. + int min_depth = -1; + int max_depth = -1; + }; + + struct RefinementStats { + RegionRefinementStats all; + RegionRefinementStats core; + RegionRefinementStats envelope; + RegionRefinementStats vacuum; + // Scalar nodal counts, independent of the coordinate vector dimension. + long geometry_dofs = 0; + long geometry_true_dofs = 0; + }; + struct JacobianStats { double detJ_min; double detJ_max; @@ -138,6 +157,7 @@ namespace stroid::stats { std::optional ellipticity; std::optional bowing; std::optional conformity; + std::optional refinement; std::optional jacobian; std::optional jacobian_stellar; std::optional jacobian_vacuum; diff --git a/src/lib/IO/mesh.cpp b/src/lib/IO/mesh.cpp index 285f311..2fd871f 100644 --- a/src/lib/IO/mesh.cpp +++ b/src/lib/IO/mesh.cpp @@ -41,7 +41,7 @@ namespace stroid::IO { # - reference mesh : a reference, linear order mesh, used to ensure that the primary mesh remains well formed # - exterior coordinate : a scalar material coordinate which is zero at the stellar surface and one at infinity # - config : The configuration options initially used to generate the mesh -# - refinement-levels : the total number of refinement levels the primary mesh has been subjected too +# - refinement-levels : stellar baseline depth plus subsequent uniform passes; local depths are stored in the mesh hierarchy # NOTE: EACH BLOCK OF DATA IS STORED BETWEEN "BEGIN BLOCK \n ... \nEND BLOCK # PARSING THE UNDERLYING MFEM NATIVE MESH FORMAT CAN BE DONE WITH MFEM'S STREAM READER # IF YOU EXTRACT THE RAW CONTENTS BETWEEN THOSE LINES @@ -102,6 +102,16 @@ END BLOCK HEADER)", # default: 4 refinement_levels:{} +# vacuum_refinement_levels: Minimum vacuum interior depth; inherit uses refinement_levels +# std::optional +# default: inherit +vacuum_refinement_levels:{} + +# vacuum_outer_refinement_levels: Minimum vacuum outer-boundary depth; inherit uses refinement_levels +# std::optional +# default: inherit +vacuum_outer_refinement_levels:{} + # order: Polynomial / geometric order to use when constructing the mesh # std::optional # default: 3 @@ -183,6 +193,8 @@ optimization_methods-smoothstep:{} core_mapping:{} END BLOCK CONFIG)", format_opt(mesh.config.refinement_levels, d.refinement_levels.value()), + mesh.config.vacuum_refinement_levels.has_value() ? std::to_string(*mesh.config.vacuum_refinement_levels) : "inherit", + mesh.config.vacuum_outer_refinement_levels.has_value() ? std::to_string(*mesh.config.vacuum_outer_refinement_levels) : "inherit", format_opt(mesh.config.order, d.order.value()), format_opt(mesh.config.include_external_domain, d.include_external_domain.value()), format_opt(mesh.config.r_core, d.r_core.value()), @@ -395,12 +407,26 @@ END BLOCK CONFIG)", std::expected parse_config(const std::string& content) { config::MeshConfig cfg; + // Files written before core_mapping was introduced use the single core cube. + cfg.core_mapping = "spherified"; config::OptimizationMethods opt = cfg.optimization_methods.value_or(config::OptimizationMethods{}); using Handler = std::function(std::string_view)>; auto as_int = [](std::optional* f) { return [f](const std::string_view v) -> std::expected { auto r = parse_int(v); if (!r) return std::unexpected(r.error()); *f = *r; return {}; }; }; + auto as_optional_int = [](std::optional* f) { + return [f](const std::string_view v) -> std::expected { + if (trim(v) == "inherit") { + f->reset(); + return {}; + } + auto r = parse_int(v); + if (!r) return std::unexpected(r.error()); + *f = *r; + return {}; + }; + }; auto as_size = [](std::optional* f) { return [f](const std::string_view v) -> std::expected { auto r = parse_int(v); if (!r) return std::unexpected(r.error()); *f = *r; return {}; }; }; auto as_double = [](std::optional* f) { return [f](const std::string_view v) -> std::expected { auto r = parse_double(v); if (!r) return std::unexpected(r.error()); *f = *r; return {}; }; }; auto as_bool = [](std::optional* f) { return [f](const std::string_view v) -> std::expected { auto r = parse_bool(v); if (!r) return std::unexpected(r.error()); *f = *r; return {}; }; }; @@ -408,6 +434,8 @@ END BLOCK CONFIG)", const std::unordered_map handlers = { {"refinement_levels", as_int(&cfg.refinement_levels)}, + {"vacuum_refinement_levels", as_optional_int(&cfg.vacuum_refinement_levels)}, + {"vacuum_outer_refinement_levels", as_optional_int(&cfg.vacuum_outer_refinement_levels)}, {"order", as_int(&cfg.order)}, {"include_external_domain", as_bool(&cfg.include_external_domain)}, {"r_core", as_double(&cfg.r_core)}, @@ -617,6 +645,37 @@ END BLOCK CONFIG)", return pm; } + bool HasHangingFaces(const mfem::Mesh& mesh) { + for (int face = 0; face < mesh.GetNumFaces(); ++face) { + if (mesh.GetFaceInformation(face).IsNonconformingCoarse()) return true; + } + return false; + } + + void RefineVisualizationMesh(mfem::Mesh& mesh, mfem::GridFunction* field = nullptr) { + while (true) { + std::vector marked(static_cast(mesh.GetNE()), false); + for (int face = 0; face < mesh.GetNumFaces(); ++face) { + const auto info = mesh.GetFaceInformation(face); + if (info.IsNonconformingCoarse()) { + marked[static_cast(info.element[0].index)] = true; + } + } + + mfem::Array refinements; + for (int element = 0; element < mesh.GetNE(); ++element) { + if (marked[static_cast(element)]) refinements.Append(element); + } + if (refinements.Size() == 0) break; + + mesh.GeneralRefinement(refinements, 1, 0); + if (field) { + field->FESpace()->Update(); + field->Update(); + } + } + } + } void SaveStroidMesh(const StroidMesh &mesh, const std::string &filename, const std::string &comment) { @@ -659,7 +718,13 @@ END BLOCK CONFIG)", SaveVTU(*mesh.mesh, exportName); } - void ViewMesh(mfem::Mesh &mesh, const std::string& title, const VISUALIZATION_MODE mode, const std::string &vishost, int visport) { + std::unique_ptr MakeConformingVisualizationMesh(const mfem::Mesh& mesh) { + auto display_mesh = std::make_unique(mesh); + RefineVisualizationMesh(*display_mesh); + return display_mesh; + } + + void ViewMesh(mfem::Mesh &mesh, const std::string& title, const VISUALIZATION_MODE mode, const std::string &vishost, int visport, const bool conforming_display) { mfem::socketstream sol_sock(vishost.c_str(), visport); if (!sol_sock.is_open()) { std::cerr << "Unable to connect to GLVis server at " @@ -667,8 +732,13 @@ END BLOCK CONFIG)", return; } - mfem::L2_FECollection fec(0, mesh.Dimension()); - mfem::FiniteElementSpace fes(&mesh, &fec); + std::unique_ptr display_mesh; + if (conforming_display && HasHangingFaces(mesh)) { + display_mesh = std::make_unique(mesh); + } + mfem::Mesh& viewed_mesh = display_mesh ? *display_mesh : mesh; + mfem::L2_FECollection fec(0, viewed_mesh.Dimension()); + mfem::FiniteElementSpace fes(&viewed_mesh, &fec); mfem::GridFunction attr_gf(&fes); attr_gf = 0.0; @@ -692,44 +762,55 @@ END BLOCK CONFIG)", break; } - sol_sock.precision(8); - sol_sock << "solution\n" << mesh << attr_gf; - sol_sock << "window_title '" << title << "'\n"; + // Transfer source coloring so boundary-adjacent regions keep their + // original extent when visualization-only children are introduced. + if (display_mesh) RefineVisualizationMesh(*display_mesh, &attr_gf); + + sol_sock.precision(std::numeric_limits::max_digits10); + sol_sock << "solution\n" << viewed_mesh << attr_gf; + sol_sock << "window_title '" << title + << (display_mesh ? " (display subdivisions)" : "") << "'\n"; sol_sock << "keys iMj\n"; sol_sock << std::flush; } - void ViewMesh(const stroid::StroidMesh &mesh, const std::string &title, VISUALIZATION_MODE mode, const std::string &vishost, int visport) { - ViewMesh(*mesh.mesh, title, mode, vishost, visport); + void ViewMesh(const stroid::StroidMesh &mesh, const std::string &title, VISUALIZATION_MODE mode, const std::string &vishost, int visport, const bool conforming_display) { + ViewMesh(*mesh.mesh, title, mode, vishost, visport, conforming_display); } - void VisualizeFaceValence(mfem::Mesh& mesh, const std::string &vishost, int visport) { - mfem::L2_FECollection fec(0, 3); - mfem::FiniteElementSpace fes(&mesh, &fec); + void VisualizeFaceValence(mfem::Mesh& mesh, const std::string &vishost, int visport, const bool conforming_display) { + mfem::socketstream sol_sock(vishost.c_str(), visport); + if (!sol_sock.is_open()) return; + + std::unique_ptr display_mesh; + if (conforming_display && HasHangingFaces(mesh)) { + display_mesh = std::make_unique(mesh); + } + mfem::Mesh& viewed_mesh = display_mesh ? *display_mesh : mesh; + mfem::L2_FECollection fec(0, viewed_mesh.Dimension()); + mfem::FiniteElementSpace fes(&viewed_mesh, &fec); mfem::GridFunction valence_gf(&fes); + valence_gf = 0.0; for (int i = 0; i < mesh.GetNBE(); i++) { - int f, o; - mesh.GetBdrElementFace(i, &f, &o); - - int e1, e2; - mesh.GetFaceElements(f, &e1, &e2); - - int valence = (e2 >= 0) ? 2 : 1; - valence_gf(i) = static_cast(valence); + const int face = mesh.GetBdrElementFaceIndex(i); + const double valence = mesh.GetFaceInformation(face).IsInterior() ? 2.0 : 1.0; + int element, side; + mesh.GetBdrElementAdjacentElement(i, element, side); + valence_gf(element) = std::max(valence_gf(element), valence); } - // View in GLVis - mfem::socketstream sol_sock(vishost.c_str(), visport); - if (sol_sock.is_open()) { - sol_sock << "solution\n" << mesh << valence_gf; - sol_sock << "window_title 'Boundary Valence: 1=Surface, 2=Internal'\n"; - sol_sock << "keys am\n" << std::flush; - } + if (display_mesh) RefineVisualizationMesh(*display_mesh, &valence_gf); + + sol_sock.precision(std::numeric_limits::max_digits10); + sol_sock << "solution\n" << viewed_mesh << valence_gf; + sol_sock << "window_title 'Boundary Valence: 1=Surface, 2=Internal" + << (display_mesh ? " (display subdivisions)" : "") << "'\n"; + sol_sock << "keys am\n" << std::flush; } - void VisualizeFaceValence(const stroid::StroidMesh &mesh, const std::string &vishost, int visport) { - VisualizeFaceValence(*mesh.mesh, vishost, visport); + void VisualizeFaceValence(const stroid::StroidMesh &mesh, const std::string &vishost, int visport, const bool conforming_display) { + VisualizeFaceValence(*mesh.mesh, vishost, visport, conforming_display); } std::expected ParseStroidMesh(std::istream& is) { diff --git a/src/lib/refinement/uniform.cpp b/src/lib/refinement/uniform.cpp index 26b6d45..736c527 100644 --- a/src/lib/refinement/uniform.cpp +++ b/src/lib/refinement/uniform.cpp @@ -8,6 +8,8 @@ #include "stroid/topology/topology.h" #include "stroid/topology/optimize.h" +#include + namespace stroid::refinement { void UniformRefinement(StroidMesh &mesh, const size_t levels) { if (!mesh.reference_mesh) { @@ -19,14 +21,21 @@ namespace stroid::refinement { } if (!mesh.mesh) { - throw exceptions::StroidMissingReferenceMesh("UniformRefinement requires a primary mesh to be present in the StroidMesh object. This should be present by construction and the fact that it is missing represents a bug. Please report this to the stroid developers on GitHub or by email at emily.boudreaux@dartmouth.edu"); + throw exceptions::StroidMissingReferenceMesh( + "UniformRefinement requires a primary mesh to be present in the StroidMesh object. This should be present by construction and the fact that it is missing represents a bug. Please report this to the stroid developers on GitHub or by email at emily.boudreaux@dartmouth.edu"); } - mesh.exterior_coordinate.reset(); - for (size_t i = 0; i < levels; i++) { - mesh.reference_mesh->UniformRefinement(); + if (levels > std::numeric_limits::max() - mesh.refinement_levels) { + throw std::overflow_error("Uniform refinement level count would overflow."); } - mesh.refinement_levels += levels; + StroidMesh refined; + refined.type = mesh.type; + refined.config = mesh.config; + refined.refinement_levels = mesh.refinement_levels + levels; + refined.reference_mesh = std::make_unique(*mesh.reference_mesh); + for (size_t i = 0; i < levels; i++) { + refined.reference_mesh->UniformRefinement(); + } fourdst::config::Config cfg; auto Mutator = [&mesh](config::MeshConfig& orig) { @@ -35,8 +44,13 @@ namespace stroid::refinement { cfg.mutate(Mutator); - mesh.mesh = utils::BuildProjected(*mesh.reference_mesh, cfg); - topology::OptimizeMesh(*mesh.mesh, cfg); - mesh.exterior_coordinate = topology::BuildExteriorCoordinate(*mesh.mesh, *mesh.reference_mesh, cfg); + refined.mesh = utils::BuildProjected(*refined.reference_mesh, cfg); + topology::OptimizeMesh(*refined.mesh, cfg); + refined.exterior_coordinate = topology::BuildExteriorCoordinate(*refined.mesh, *refined.reference_mesh, cfg); + + mesh.mesh.swap(refined.mesh); + mesh.reference_mesh.swap(refined.reference_mesh); + mesh.exterior_coordinate.swap(refined.exterior_coordinate); + mesh.refinement_levels = refined.refinement_levels; } -} \ No newline at end of file +} diff --git a/src/lib/topology/curvilinear.cpp b/src/lib/topology/curvilinear.cpp index 65c55c2..e954aa2 100644 --- a/src/lib/topology/curvilinear.cpp +++ b/src/lib/topology/curvilinear.cpp @@ -26,7 +26,8 @@ namespace { } double coordinate = (logical_radius - r_star) / radial_extent; - const double tolerance = 1024.0 * std::numeric_limits::epsilon() * std::max({1.0, std::abs(r_star), std::abs(r_infinity)}) / radial_extent; + const double tolerance = std::min(1.0e-8, 1024.0 * std::numeric_limits::epsilon() * + std::max(std::abs(r_star), std::abs(r_infinity)) / radial_extent); if (coordinate < -tolerance || coordinate > 1.0 + tolerance) { throw std::runtime_error(std::format("Logical exterior coordinate {} lies outside [0, 1].", coordinate)); @@ -40,9 +41,7 @@ namespace { namespace stroid::topology { void PromoteToHighOrder(mfem::Mesh &mesh, const fourdst::config::Config &config) { - const auto* fec = new mfem::H1_FECollection(config->order.value(), mesh.Dimension()); - auto* fes = new mfem::FiniteElementSpace(&mesh, fec, mesh.SpaceDimension()); - mesh.SetNodalFESpace(fes); + mesh.SetCurvature(config->order.value(), false, mesh.SpaceDimension(), mfem::Ordering::byNODES); } void ProjectMesh(mfem::Mesh &mesh, const fourdst::config::Config &config) { @@ -59,16 +58,15 @@ namespace stroid::topology { const int nElem = mesh.GetNE(); std::vector processed(nDofs, false); - mfem::Array vdofs; + mfem::Array dofs; mfem::Vector pos(vDim); for (int elemID = 0; elemID < nElem; ++elemID) { const int attrID = mesh.GetAttribute(elemID); - fes->GetElementVDofs(elemID, vdofs); + fes->GetElementDofs(elemID, dofs); - for (int dofID = 0; dofID < vdofs.Size(); ++dofID) { - const int vDof = vdofs[dofID]; - const int scalar_dof = (fes->GetOrdering() == mfem::Ordering::byNODES) ? vDof / vDim : vDof % nDofs; + for (int dofID = 0; dofID < dofs.Size(); ++dofID) { + const int scalar_dof = dofs[dofID] >= 0 ? dofs[dofID] : -1 - dofs[dofID]; if (processed[scalar_dof]) { continue; // Skip already processed dofs. This avoids doing multiple transformations of a node if it was already transformed by a neighbor @@ -88,6 +86,12 @@ namespace stroid::topology { } } + // A mapped hanging node must lie on the coarse polynomial face. Mapping + // every node independently does not preserve this geometric constraint. + mfem::Vector true_nodes; + nodes.GetTrueDofs(true_nodes); + nodes.SetFromTrueDofs(true_nodes); + mesh.NodesUpdated(); } std::unique_ptr BuildExteriorCoordinate( @@ -164,6 +168,10 @@ namespace stroid::topology { } } + mfem::Vector true_values; + field->values->GetTrueDofs(true_values); + field->values->SetFromTrueDofs(true_values); + for (int dof = 0; dof < scalar_dofs; ++dof) { if (!processed[static_cast(dof)]) throw std::runtime_error(std::format("Exterior-coordinate scalar DOF {} was not assigned.", dof)); const double coordinate = (*field->values)(dof); diff --git a/src/lib/topology/optimize.cpp b/src/lib/topology/optimize.cpp index 648376b..c28562c 100644 --- a/src/lib/topology/optimize.cpp +++ b/src/lib/topology/optimize.cpp @@ -181,7 +181,8 @@ class TMOPProgressBar : public mfem::IterativeSolverMonitor { a.SetEssentialTrueDofs(ess_tdof_list); mfem::GridFunction* nodes = mesh.GetNodes(); - mfem::Vector x(*nodes); + mfem::Vector x; + nodes->GetTrueDofs(x); mfem::Vector b(a.Height()); b = 0.0; @@ -222,7 +223,7 @@ class TMOPProgressBar : public mfem::IterativeSolverMonitor { std::cout << "Applying TMOP optimization to mesh. Note this may take a long time. Depending on your mesh resolution expect to wait up to the order of 10s of minutes..." << std::endl; newton.Mult(b, x); - *nodes = x; + nodes->SetFromTrueDofs(x); mesh.NodesUpdated(); diff --git a/src/lib/topology/topology.cpp b/src/lib/topology/topology.cpp index 63cbaa8..9132fcc 100644 --- a/src/lib/topology/topology.cpp +++ b/src/lib/topology/topology.cpp @@ -3,13 +3,116 @@ #include #include #include +#include +#include #include "stroid/config/config.h" #include "fourdst/config/config.h" +namespace { + void ValidateRefinement(const stroid::config::MeshConfig& config) { + if (config.refinement_levels.value_or(4) < 0 || + config.vacuum_refinement_levels.value_or(0) < 0 || + config.vacuum_outer_refinement_levels.value_or(0) < 0) { + throw std::invalid_argument("Refinement levels must be non-negative."); + } + if (config.order.value_or(3) < 1) { + throw std::invalid_argument("Geometry order must be at least one."); + } + + if (!config.vacuum_refinement_levels && !config.vacuum_outer_refinement_levels) return; + if (!config.include_external_domain.value_or(true)) { + throw std::invalid_argument("Vacuum refinement overrides require an external domain."); + } + + const double r_core = config.r_core.value_or(0.25); + const double r_star = config.r_star.value_or(1.0); + const double r_infinity = config.r_infinity.value_or(6.0); + if (!std::isfinite(r_core) || !std::isfinite(r_star) || !std::isfinite(r_infinity) || + r_core <= 0.0 || r_star <= r_core || r_infinity <= r_star) { + throw std::invalid_argument("Vacuum refinement requires finite radii with 0 < r_core < r_star < r_infinity."); + } + if (!std::isfinite(config.flattening.value_or(0.0)) || config.flattening.value_or(0.0) >= 1.0) { + throw std::invalid_argument("Vacuum refinement requires finite flattening < 1."); + } + + const auto core = config.core_id.value_or(1); + const auto envelope = config.envelope_id.value_or(2); + const auto vacuum = config.vacuum_id.value_or(3); + const auto surface = config.surface_bdr_id.value_or(1); + const auto outer = config.inf_bdr_id.value_or(2); + const auto valid_id = [](size_t id) { + return id > 0 && id <= static_cast(std::numeric_limits::max()); + }; + if (!valid_id(core) || !valid_id(envelope) || !valid_id(vacuum) || + !valid_id(surface) || !valid_id(outer) || core == envelope || + core == vacuum || envelope == vacuum || surface == outer) { + throw std::invalid_argument("Vacuum refinement requires distinct positive material IDs and distinct positive boundary IDs representable as int."); + } + } + + void RefineReference(mfem::Mesh& mesh, const stroid::config::MeshConfig& config) { + const int stellar_level = config.refinement_levels.value_or(4); + const int bulk_level = config.vacuum_refinement_levels.value_or(stellar_level); + const int outer_level = config.vacuum_outer_refinement_levels.value_or(stellar_level); + if (!config.include_external_domain.value_or(true) || + (bulk_level == stellar_level && outer_level == stellar_level)) { + for (int level = 0; level < stellar_level; ++level) mesh.UniformRefinement(); + return; + } + + mesh.EnsureNCMesh(); + const int vacuum_id = static_cast(config.vacuum_id.value_or(3)); + const double r_star = config.r_star.value_or(1.0); + const double r_infinity = config.r_infinity.value_or(6.0); + const double tolerance = 128.0 * std::numeric_limits::epsilon() * r_infinity; + + while (true) { + std::vector marked(static_cast(mesh.GetNE()), false); + for (int element = 0; element < mesh.GetNE(); ++element) { + int target = stellar_level; + if (mesh.GetAttribute(element) == vacuum_id) { + target = bulk_level; + double minimum = std::numeric_limits::infinity(); + double maximum = 0.0; + const mfem::Element* hex = mesh.GetElement(element); + for (int vertex = 0; vertex < hex->GetNVertices(); ++vertex) { + const double* position = mesh.GetVertex(hex->GetVertices()[vertex]); + const double radius = std::max({std::abs(position[0]), std::abs(position[1]), std::abs(position[2])}); + minimum = std::min(minimum, radius); + maximum = std::max(maximum, radius); + } + if (std::abs(minimum - r_star) <= tolerance) target = std::max(target, stellar_level); + if (std::abs(maximum - r_infinity) <= tolerance) target = std::max(target, outer_level); + } + marked[static_cast(element)] = mesh.ncmesh->GetElementDepth(element) < target; + } + + for (int face = 0; face < mesh.GetNumFaces(); ++face) { + const auto info = mesh.GetFaceInformation(face); + if (!info.IsNonconformingFine() || !info.IsLocal()) continue; + const int first = info.element[0].index; + const int second = info.element[1].index; + if ((mesh.GetAttribute(first) == vacuum_id) == (mesh.GetAttribute(second) == vacuum_id)) continue; + const int coarse = mesh.ncmesh->GetElementDepth(first) < mesh.ncmesh->GetElementDepth(second) ? first : second; + marked[static_cast(coarse)] = true; + } + + mfem::Array refinements; + for (int element = 0; element < mesh.GetNE(); ++element) { + if (marked[static_cast(element)]) refinements.Append(element); + } + if (refinements.Size() == 0) break; + mesh.GeneralRefinement(refinements, 1, 1); + } + mesh.CheckBdrElementOrientation(true); + } +} + namespace stroid::topology { std::unique_ptr BuildSkeleton(const fourdst::config::Config & config) { + ValidateRefinement(*config); const std::string core_mapping = config->core_mapping.value_or("spherified"); if (core_mapping != "spherified" && core_mapping != "multi_block") { throw std::invalid_argument("Unknown core_mapping: " + core_mapping); @@ -129,19 +232,12 @@ namespace stroid::topology { // ReSharper disable once CppUseInternalLinkage void Finalize(mfem::Mesh& mesh, const fourdst::config::Config &config) { + ValidateRefinement(*config); mesh.FinalizeTopology(); mesh.Finalize(); mesh.CheckElementOrientation(true); mesh.CheckBdrElementOrientation(true); - for (int i = 0; i < config->refinement_levels; ++i) { - mesh.UniformRefinement(); - } - - if (!mesh.Conforming()) { - std::cerr << "WARNING: Mesh has been detected to be non conforming!" << std::endl; - } - - + RefineReference(mesh, *config); } } diff --git a/src/lib/utils/mesh_stats.cpp b/src/lib/utils/mesh_stats.cpp index 3c90b0a..ed97102 100644 --- a/src/lib/utils/mesh_stats.cpp +++ b/src/lib/utils/mesh_stats.cpp @@ -61,11 +61,39 @@ namespace stroid::stats { if (has_feature(features, MeshStatFeatures::CONFORMITY)) { ConformityStats conformity; - conformity.conforming = mesh->Conforming(); - conformity.n_nonconforming_faces = conformity.conforming ? 0 : -99; // TODO: count + conformity.hierarchy_enabled = mesh->ncmesh != nullptr; + for (int f = 0; f < mesh->GetNFaces(); ++f) { + if (mesh->GetFaceInformation(f).IsNonconformingFine()) { + ++conformity.n_nonconforming_faces; + } + } + conformity.conforming = conformity.n_nonconforming_faces == 0; out.conformity = conformity; } + if (has_feature(features, MeshStatFeatures::REFINEMENT)) { + RefinementStats refinement; + auto update_depth = [](RegionRefinementStats& region, const int depth) { + if (region.min_depth < 0) region.min_depth = depth; + region.min_depth = std::min(region.min_depth, depth); + region.max_depth = std::max(region.max_depth, depth); + }; + for (int e = 0; e < mesh->GetNE(); ++e) { + const int depth = mesh->ncmesh ? mesh->ncmesh->GetElementDepth(e) : + static_cast(sm.refinement_levels); + update_depth(refinement.all, depth); + const int attr = mesh->GetAttribute(e); + if (attr == core_id) update_depth(refinement.core, depth); + else if (attr == env_id) update_depth(refinement.envelope, depth); + else if (attr == vac_id) update_depth(refinement.vacuum, depth); + } + if (const auto* fes = mesh->GetNodalFESpace()) { + refinement.geometry_dofs = fes->GetNDofs(); + refinement.geometry_true_dofs = fes->GetNConformingDofs(); + } + out.refinement = refinement; + } + // ============================ SURFACE PASS ============================ const bool needs_surface = has_feature(features, MeshStatFeatures::RADIUS) || @@ -428,7 +456,18 @@ namespace stroid::stats { b.max_inward, b.max_outward, b.rms)); } if (s.conformity) { - line(std::format("conforming: {}", s.conformity->conforming)); + const auto& c = *s.conformity; + line(std::format("conforming: {} (hierarchy={}, hanging face patches={})", + c.conforming, c.hierarchy_enabled, c.n_nonconforming_faces)); + } + if (s.refinement) { + const auto& r = *s.refinement; + line(std::format( + "refinement depth: all=[{},{}] core=[{},{}] env=[{},{}] vac=[{},{}]", + r.all.min_depth, r.all.max_depth, r.core.min_depth, r.core.max_depth, + r.envelope.min_depth, r.envelope.max_depth, r.vacuum.min_depth, r.vacuum.max_depth)); + line(std::format("scalar geometry DOFs: total={} true={}", + r.geometry_dofs, r.geometry_true_dofs)); } auto jac_line = [&](const std::string& label, const JacobianStats& j) { @@ -482,4 +521,4 @@ namespace stroid::stats { for (const auto& e : s.errors) line(std::format("ERROR: {}", e)); return o; } -} \ No newline at end of file +} diff --git a/src/python/IO/bindings.cpp b/src/python/IO/bindings.cpp index 11108bb..b31477c 100644 --- a/src/python/IO/bindings.cpp +++ b/src/python/IO/bindings.cpp @@ -35,20 +35,29 @@ void register_io_bindings(pybind11::module_ &m) { ); m.def( "ViewMesh", - py::overload_cast(&stroid::IO::ViewMesh), + py::overload_cast(&stroid::IO::ViewMesh), py::arg("mesh"), py::arg("title")="", py::arg("mode")=stroid::IO::VISUALIZATION_MODE::ELEMENT_ID, py::arg("host")="localhost", - py::arg("port")=19916 + py::arg("port")=19916, + py::arg("conforming_display")=false, + "Display the mesh in GLVis. By default, subdivide a temporary copy to avoid " + "rendering gaps at curved hanging interfaces, preserving the source geometry " + "and coloring. Extra display edges do not change computational DOFs. Set " + "conforming_display=False to inspect the original element layout." ); m.def( "VisualizeFaceValence", - py::overload_cast(&stroid::IO::VisualizeFaceValence), + py::overload_cast(&stroid::IO::VisualizeFaceValence), py::arg("mesh"), py::arg("host")="localhost", - py::arg("port")=19916 + py::arg("port")=19916, + py::arg("conforming_display")=true, + "Display boundary-adjacent element valence: zero for untagged elements, one " + "for surface faces, and two for internal faces (maximum if several touch an " + "element). Values are preserved through optional display-only subdivision." ); m.def( diff --git a/src/python/config/bindings.cpp b/src/python/config/bindings.cpp index 8b1ba23..6b5b3da 100644 --- a/src/python/config/bindings.cpp +++ b/src/python/config/bindings.cpp @@ -38,6 +38,8 @@ void register_config_bindings(pybind11::module_& m) { return stroid::config::MeshConfig{ .refinement_levels = kwargs.contains("refinement_levels") ? kwargs["refinement_levels"].cast() : ref_level, + .vacuum_refinement_levels = kwargs.contains("vacuum_refinement_levels") ? kwargs["vacuum_refinement_levels"].cast>() : std::nullopt, + .vacuum_outer_refinement_levels = kwargs.contains("vacuum_outer_refinement_levels") ? kwargs["vacuum_outer_refinement_levels"].cast>() : std::nullopt, .order = kwargs.contains("order") ? kwargs["order"].cast() : order, .include_external_domain = kwargs.contains("include_external_domain") ? kwargs["include_external_domain"].cast() : include_external_domain, .r_core = kwargs.contains("r_core") ? kwargs["r_core"].cast() : r_core, @@ -53,7 +55,7 @@ void register_config_bindings(pybind11::module_& m) { .envelope_id = kwargs.contains("envelope_id") ? kwargs["envelope_id"].cast() : envelope_id, .vacuum_id = kwargs.contains("vacuum_id") ? kwargs["vacuum_id"].cast() : vacuum_id, .optimization_methods = kwargs.contains("optimization_methods") ? kwargs["optimization_methods"].cast() : opt_method, - .core_mapping = kwargs.contains("core_mapping") ? kwargs["core_mapping"].cast() : "spherified" + .core_mapping = kwargs.contains("core_mapping") ? kwargs["core_mapping"].cast() : "multi_block" }; })) .def_property( @@ -65,6 +67,26 @@ void register_config_bindings(pybind11::module_& m) { self.refinement_levels = value; } ) + .def_property( + "vacuum_refinement_levels", + [](const stroid::config::MeshConfig& self) { + return self.vacuum_refinement_levels; + }, + [](stroid::config::MeshConfig& self, std::optional value) { + self.vacuum_refinement_levels = value; + }, + "Minimum vacuum interior depth, or None to inherit refinement_levels. Automatic grading may refine further." + ) + .def_property( + "vacuum_outer_refinement_levels", + [](const stroid::config::MeshConfig& self) { + return self.vacuum_outer_refinement_levels; + }, + [](stroid::config::MeshConfig& self, std::optional value) { + self.vacuum_outer_refinement_levels = value; + }, + "Minimum vacuum outer-boundary depth, or None to inherit refinement_levels." + ) .def_property( "order", [](const stroid::config::MeshConfig& self) { @@ -88,8 +110,8 @@ void register_config_bindings(pybind11::module_& m) { [](const stroid::config::MeshConfig& self) { return self.r_core; }, - [](stroid::config::MeshConfig& self, int value) { - self.order = value; + [](stroid::config::MeshConfig& self, double value) { + self.r_core = value; } ) .def_property( diff --git a/src/python/refinement/bindings.cpp b/src/python/refinement/bindings.cpp index 72a0e48..aeac353 100644 --- a/src/python/refinement/bindings.cpp +++ b/src/python/refinement/bindings.cpp @@ -7,5 +7,5 @@ namespace py = pybind11; void register_refinement_bindings(pybind11::module_ &m) { - m.def("UniformRefinement", &stroid::refinement::UniformRefinement, py::arg("mesh"), py::arg("levels"), "Perform uniform refinement without breaking the higher order structure"); + m.def("UniformRefinement", &stroid::refinement::UniformRefinement, py::arg("mesh"), py::arg("levels"), "Refine every current leaf by the requested additional levels, preserving hanging-node constraints and rebuilding high-order geometry. Initial configuration targets remain unchanged."); } diff --git a/src/python/utils/bindings.cpp b/src/python/utils/bindings.cpp index af47d51..a5d5797 100644 --- a/src/python/utils/bindings.cpp +++ b/src/python/utils/bindings.cpp @@ -25,7 +25,14 @@ void register_stats_bindings(pybind11::module_ &m) { .value("CENTROID", stroid::stats::MeshStatFeatures::CENTROID) .value("CONFIG_META", stroid::stats::MeshStatFeatures::CONFIG_META) .value("BOUNDING_BOX", stroid::stats::MeshStatFeatures::BOUNDING_BOX) - .export_values(); + .value("REFINEMENT", stroid::stats::MeshStatFeatures::REFINEMENT) + .export_values() + .def("__or__", [](stroid::stats::MeshStatFeatures lhs, stroid::stats::MeshStatFeatures rhs) { + return lhs | rhs; + }, py::is_operator()) + .def("__and__", [](stroid::stats::MeshStatFeatures lhs, stroid::stats::MeshStatFeatures rhs) { + return lhs & rhs; + }, py::is_operator()); py::class_(statsMod, "RadiusStats") .def_readonly("min", &stroid::stats::RadiusStats::min) @@ -51,8 +58,21 @@ void register_stats_bindings(pybind11::module_ &m) { py::class_(statsMod, "ConformityStats") .def_readonly("conforming", &stroid::stats::ConformityStats::conforming) + .def_readonly("hierarchy_enabled", &stroid::stats::ConformityStats::hierarchy_enabled) .def_readonly("n_nonconforming_faces", &stroid::stats::ConformityStats::n_nonconforming_faces); + py::class_(statsMod, "RegionRefinementStats") + .def_readonly("min_depth", &stroid::stats::RegionRefinementStats::min_depth) + .def_readonly("max_depth", &stroid::stats::RegionRefinementStats::max_depth); + + py::class_(statsMod, "RefinementStats") + .def_readonly("all", &stroid::stats::RefinementStats::all) + .def_readonly("core", &stroid::stats::RefinementStats::core) + .def_readonly("envelope", &stroid::stats::RefinementStats::envelope) + .def_readonly("vacuum", &stroid::stats::RefinementStats::vacuum) + .def_readonly("geometry_dofs", &stroid::stats::RefinementStats::geometry_dofs) + .def_readonly("geometry_true_dofs", &stroid::stats::RefinementStats::geometry_true_dofs); + py::class_(statsMod, "JacobianStats") .def_readonly("detJ_min", &stroid::stats::JacobianStats::detJ_min) .def_readonly("detJ_max", &stroid::stats::JacobianStats::detJ_max) @@ -128,6 +148,7 @@ void register_stats_bindings(pybind11::module_ &m) { .def_readonly("ellipticity", &stroid::stats::MeshStats::ellipticity) .def_readonly("bowing", &stroid::stats::MeshStats::bowing) .def_readonly("conformity", &stroid::stats::MeshStats::conformity) + .def_readonly("refinement", &stroid::stats::MeshStats::refinement) .def_readonly("jacobian", &stroid::stats::MeshStats::jacobian) .def_readonly("jacobian_stellar", &stroid::stats::MeshStats::jacobian_stellar) .def_readonly("jacobian_vacuum", &stroid::stats::MeshStats::jacobian_vacuum) @@ -174,7 +195,13 @@ void register_type_bindings(py::module_ &m) { .def("has_rmesh", [](const stroid::StroidMesh& self) { return self.reference_mesh != nullptr; }) - .def("mesh_stats", &stroid::StroidMesh::mesh_stats) + .def("mesh_stats", [](const stroid::StroidMesh& self, bool use_ref_mesh) { + auto result = self.mesh_stats(use_ref_mesh); + if (!result.has_value()) { + throw std::runtime_error(result.error()); + } + return result.value(); + }, py::arg("use_ref_mesh") = false) .def("__repr__", [](const stroid::StroidMesh& self) { return std::format("", (self.type == stroid::MFEM_MESH_TYPE::SERIAL) ? "SERIAL" : "PARALLEL", self.mesh->GetNE(), self.mesh->GetNV()); }); @@ -184,4 +211,3 @@ void register_utils_bindings(pybind11::module_ &m) { register_type_bindings(m); register_stats_bindings(m); } - diff --git a/tests/meson.build b/tests/meson.build index 95ec39b..aaf4536 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -3,9 +3,10 @@ gtest_main = dependency('gtest_main', required: true) gtest_nomain_dep = dependency('gtest', main: false, required : true) threads_dep = dependency('threads') -# Test files for const test_sources = [ - 'stroidTest.cpp' + 'stroidTest.cpp', + 'nonconformingTest.cpp', + 'visualizationTest.cpp' ] foreach test_file : test_sources diff --git a/tests/nonconformingTest.cpp b/tests/nonconformingTest.cpp new file mode 100644 index 0000000..beadc4c --- /dev/null +++ b/tests/nonconformingTest.cpp @@ -0,0 +1,486 @@ +#include + +#include "stroid/stroid.h" + +#include +#include +#include +#include +#include +#include + +namespace { + constexpr double kPi = 3.14159265358979323846; + + stroid::config::MeshConfig Configuration(int order = 2, int stellar_level = 2, + int bulk_level = 0, int outer_level = 0) { + stroid::config::MeshConfig config; + config.order = order; + config.refinement_levels = stellar_level; + config.vacuum_refinement_levels = bulk_level; + config.vacuum_outer_refinement_levels = outer_level; + config.optimization_methods = stroid::config::OptimizationMethods{false, true}; + return config; + } + + std::map CountAttributes(const mfem::Mesh& mesh, bool boundary = false) { + std::map counts; + for (int element = 0; element < (boundary ? mesh.GetNBE() : mesh.GetNE()); ++element) { + ++counts[boundary ? mesh.GetBdrAttribute(element) : mesh.GetAttribute(element)]; + } + return counts; + } + + void ExpectConstrainedField(mfem::GridFunction& values) { + mfem::Vector independent; + values.GetTrueDofs(independent); + mfem::GridFunction reconstructed(values.FESpace()); + reconstructed.SetFromTrueDofs(independent); + reconstructed -= values; + EXPECT_LT(reconstructed.Normlinf(), 5.0e-12); + } + + void ExpectGeometryAndCoordinateTraces(stroid::StroidMesh& generated, bool require_hanging_faces = true) { + mfem::Mesh& mesh = *generated.mesh; + ASSERT_NE(generated.exterior_coordinate, nullptr); + mfem::GridFunction& coordinate = *generated.exterior_coordinate->values; + ASSERT_EQ(coordinate.FESpace()->GetMesh(), &mesh); + ExpectConstrainedField(*mesh.GetNodes()); + ExpectConstrainedField(coordinate); + const int vacuum = static_cast(generated.config.vacuum_id.value()); + int hanging_faces = 0; + int stellar_faces = 0; + double geometry_error = 0.0; + double coordinate_error = 0.0; + double stellar_trace_error = 0.0; + mfem::Vector first(3), second(3); + + for (int face = 0; face < mesh.GetNumFaces(); ++face) { + const auto info = mesh.GetFaceInformation(face); + if (!info.IsLocal()) continue; + auto* transformation = mesh.GetFaceElementTransformations(face); + ASSERT_NE(transformation->Elem1, nullptr); + ASSERT_NE(transformation->Elem2, nullptr); + const bool first_vacuum = transformation->Elem1->Attribute == vacuum; + const bool second_vacuum = transformation->Elem2->Attribute == vacuum; + const bool stellar_interface = first_vacuum != second_vacuum; + if (info.IsNonconformingFine()) { + ++hanging_faces; + EXPECT_EQ(first_vacuum, second_vacuum); + } + if (stellar_interface) { + ++stellar_faces; + EXPECT_TRUE(info.IsConforming()) << "Stellar interface face " << face; + } + for (int i = 0; i < 4; ++i) { + for (int j = 0; j < 4; ++j) { + mfem::IntegrationPoint point; + point.Set2(i / 3.0, j / 3.0); + transformation->SetAllIntPoints(&point); + const auto& first_point = transformation->Elem1->GetIntPoint(); + const auto& second_point = transformation->Elem2->GetIntPoint(); + transformation->Elem1->Transform(first_point, first); + transformation->Elem2->Transform(second_point, second); + first -= second; + geometry_error = std::max(geometry_error, first.Norml2()); + const double first_value = coordinate.GetValue(transformation->Elem1No, first_point); + const double second_value = coordinate.GetValue(transformation->Elem2No, second_point); + coordinate_error = std::max(coordinate_error, std::abs(first_value - second_value)); + if (stellar_interface) { + stellar_trace_error = std::max({stellar_trace_error, std::abs(first_value), std::abs(second_value)}); + } + } + } + } + if (require_hanging_faces) EXPECT_GT(hanging_faces, 0); + EXPECT_GT(stellar_faces, 0); + EXPECT_LT(geometry_error, 5.0e-12); + EXPECT_LT(coordinate_error, 5.0e-12); + EXPECT_LT(stellar_trace_error, 5.0e-12); + + int outer_faces = 0; + double outer_trace_error = 0.0; + for (int boundary = 0; boundary < mesh.GetNBE(); ++boundary) { + if (mesh.GetBdrAttribute(boundary) != static_cast(generated.config.inf_bdr_id.value())) continue; + ++outer_faces; + auto* transformation = mesh.GetBdrFaceTransformations(boundary); + const auto& quadrature = mfem::IntRules.Get(mfem::Geometry::SQUARE, 6); + for (int q = 0; q < quadrature.GetNPoints(); ++q) { + transformation->SetAllIntPoints(&quadrature.IntPoint(q)); + outer_trace_error = std::max(outer_trace_error, + std::abs(coordinate.GetValue(transformation->Elem1No, transformation->Elem1->GetIntPoint()) - 1.0)); + } + } + EXPECT_GT(outer_faces, 0); + EXPECT_LT(outer_trace_error, 5.0e-12); + + double minimum = 1.0; + double maximum = 0.0; + double interior_error = 0.0; + for (int element = 0; element < mesh.GetNE(); ++element) { + const auto& quadrature = mfem::IntRules.Get(mfem::Geometry::CUBE, 6); + for (int q = 0; q < quadrature.GetNPoints(); ++q) { + const double value = coordinate.GetValue(element, quadrature.IntPoint(q)); + ASSERT_TRUE(std::isfinite(value)); + if (mesh.GetAttribute(element) == vacuum) { + minimum = std::min(minimum, value); + maximum = std::max(maximum, value); + } else { + interior_error = std::max(interior_error, std::abs(value)); + } + } + } + EXPECT_GE(minimum, -5.0e-12); + EXPECT_LE(maximum, 1.0 + 5.0e-12); + EXPECT_LT(interior_error, 5.0e-12); + } + + void ExpectPositiveJacobians(mfem::Mesh& mesh, int excluded_attribute = -1) { + double minimum = std::numeric_limits::infinity(); + int minimum_element = -1; + for (int element = 0; element < mesh.GetNE(); ++element) { + if (mesh.GetAttribute(element) == excluded_attribute) continue; + auto* transformation = mesh.GetElementTransformation(element); + auto inspect = [&](const mfem::IntegrationPoint& point) { + transformation->SetIntPoint(&point); + const double determinant = transformation->Jacobian().Det(); + ASSERT_TRUE(std::isfinite(determinant)); + if (determinant < minimum) { + minimum = determinant; + minimum_element = element; + } + }; + const auto& quadrature = mfem::IntRules.Get(mfem::Geometry::CUBE, 2 * transformation->Order() + 2); + for (int q = 0; q < quadrature.GetNPoints(); ++q) inspect(quadrature.IntPoint(q)); + for (int i = 0; i <= 2; ++i) { + for (int j = 0; j <= 2; ++j) { + for (int k = 0; k <= 2; ++k) { + mfem::IntegrationPoint point; + point.Set3(i / 2.0, j / 2.0, k / 2.0); + inspect(point); + } + } + } + } + EXPECT_GT(minimum, 0.0) << "Element " << minimum_element; + } + + double StellarVolume(stroid::StroidMesh& generated) { + double volume = 0.0; + for (int element = 0; element < generated.mesh->GetNE(); ++element) { + if (generated.mesh->GetAttribute(element) == static_cast(generated.config.vacuum_id.value())) continue; + auto* transformation = generated.mesh->GetElementTransformation(element); + const auto& quadrature = mfem::IntRules.Get(mfem::Geometry::CUBE, 3 * transformation->Order() + 3); + for (int q = 0; q < quadrature.GetNPoints(); ++q) { + const auto& point = quadrature.IntPoint(q); + transformation->SetIntPoint(&point); + volume += point.weight * transformation->Jacobian().Det(); + } + } + return volume; + } + + double SurfaceRadiusError(stroid::StroidMesh& generated) { + double error = 0.0; + mfem::Vector physical(3); + for (int boundary = 0; boundary < generated.mesh->GetNBE(); ++boundary) { + if (generated.mesh->GetBdrAttribute(boundary) != static_cast(generated.config.surface_bdr_id.value())) continue; + auto* transformation = generated.mesh->GetBdrElementTransformation(boundary); + const auto& quadrature = mfem::IntRules.Get(mfem::Geometry::SQUARE, 8); + for (int q = 0; q < quadrature.GetNPoints(); ++q) { + transformation->Transform(quadrature.IntPoint(q), physical); + physical(2) /= 1.0 - generated.config.flattening.value(); + error = std::max(error, std::abs(physical.Norml2() - generated.config.r_star.value())); + } + } + return error; + } +} + +TEST(NonconformingMesh, UnspecifiedVacuumLevelsPreserveUniformGeneration) { + auto config = Configuration(2, 1); + config.vacuum_refinement_levels.reset(); + config.vacuum_outer_refinement_levels.reset(); + auto generated = stroid::GenerateMesh(config); + EXPECT_TRUE(generated.mesh->Conforming()); + EXPECT_EQ(generated.mesh->GetNE(), 19 * 8); + ExpectGeometryAndCoordinateTraces(generated, false); + + config.vacuum_refinement_levels = 1; + config.vacuum_outer_refinement_levels = 1; + auto explicit_levels = stroid::GenerateMesh(config); + EXPECT_EQ(explicit_levels.mesh->GetNE(), generated.mesh->GetNE()); + mfem::H1_FECollection collection(2, 3); + mfem::FiniteElementSpace space(explicit_levels.mesh.get(), &collection); + EXPECT_EQ(space.GetTrueVSize(), space.GetVSize()); + EXPECT_NEAR(StellarVolume(explicit_levels), StellarVolume(generated), 1.0e-12); +} + +TEST(NonconformingMesh, RejectsNegativeRefinementTargets) { + for (int field = 0; field < 3; ++field) { + auto config = Configuration(); + if (field == 0) config.refinement_levels = -1; + if (field == 1) config.vacuum_refinement_levels = -1; + if (field == 2) config.vacuum_outer_refinement_levels = -1; + EXPECT_THROW(stroid::GenerateMesh(config), std::invalid_argument); + } +} + +TEST(NonconformingMesh, DefaultOuterLevelProtectsBothSurfacesAndSavesBulkDofs) { + auto config = Configuration(2, 3); + config.vacuum_outer_refinement_levels.reset(); + auto generated = stroid::GenerateMesh(config); + ASSERT_NE(generated.reference_mesh->ncmesh, nullptr); + const auto attributes = CountAttributes(*generated.mesh); + EXPECT_EQ(attributes.at(1), 7 * 512); + EXPECT_EQ(attributes.at(2), 6 * 512); + EXPECT_LT(attributes.at(3), 6 * 512); + const auto boundaries = CountAttributes(*generated.mesh, true); + EXPECT_EQ(boundaries.at(1), 6 * 64); + EXPECT_EQ(boundaries.at(2), 6 * 64); + int vacuum_minimum = 3; + int vacuum_maximum = 0; + for (int element = 0; element < generated.mesh->GetNE(); ++element) { + ASSERT_EQ(generated.mesh->GetAttribute(element), generated.reference_mesh->GetAttribute(element)); + if (generated.mesh->GetAttribute(element) == 3) { + const int depth = generated.reference_mesh->ncmesh->GetElementDepth(element); + vacuum_minimum = std::min(vacuum_minimum, depth); + vacuum_maximum = std::max(vacuum_maximum, depth); + } + } + EXPECT_LT(vacuum_minimum, 3); + EXPECT_EQ(vacuum_maximum, 3); + for (int face = 0; face < generated.reference_mesh->GetNumFaces(); ++face) { + const auto information = generated.reference_mesh->GetFaceInformation(face); + if (!information.IsLocal()) continue; + const int first = generated.reference_mesh->ncmesh->GetElementDepth(information.element[0].index); + const int second = generated.reference_mesh->ncmesh->GetElementDepth(information.element[1].index); + EXPECT_LE(std::abs(first - second), 1); + } + mfem::H1_FECollection collection(2, 3); + mfem::FiniteElementSpace reduced(generated.mesh.get(), &collection); + EXPECT_LT(reduced.GetTrueVSize(), reduced.GetVSize()); + const auto stats = stroid::stats::ComputeMeshStats(generated, + stroid::stats::MeshStatFeatures::REFINEMENT | stroid::stats::MeshStatFeatures::CONFORMITY | + stroid::stats::MeshStatFeatures::ELEMENT_COUNT); + ASSERT_TRUE(stats.refinement.has_value()); + ASSERT_TRUE(stats.conformity.has_value()); + ASSERT_TRUE(stats.element_counts.has_value()); + EXPECT_EQ(stats.refinement->vacuum.min_depth, vacuum_minimum); + EXPECT_EQ(stats.refinement->vacuum.max_depth, vacuum_maximum); + EXPECT_EQ(stats.refinement->core.min_depth, 3); + EXPECT_EQ(stats.refinement->core.max_depth, 3); + EXPECT_EQ(stats.refinement->geometry_dofs, reduced.GetVSize()); + EXPECT_EQ(stats.refinement->geometry_true_dofs, reduced.GetTrueVSize()); + EXPECT_TRUE(stats.conformity->hierarchy_enabled); + EXPECT_FALSE(stats.conformity->conforming); + EXPECT_GT(stats.conformity->n_nonconforming_faces, 0); + EXPECT_EQ(stats.element_counts->vacuum, attributes.at(3)); + config.vacuum_refinement_levels.reset(); + auto uniform = stroid::GenerateMesh(config); + mfem::FiniteElementSpace full(uniform.mesh.get(), &collection); + EXPECT_LT(reduced.GetTrueVSize(), full.GetTrueVSize()); + EXPECT_NEAR(StellarVolume(generated), StellarVolume(uniform), 2.0e-12); + EXPECT_NEAR(SurfaceRadiusError(generated), SurfaceRadiusError(uniform), 2.0e-13); + ExpectGeometryAndCoordinateTraces(generated); + ExpectPositiveJacobians(*generated.mesh); +} + +TEST(NonconformingMesh, OuterTargetCanExceedStellarTarget) { + auto config = Configuration(2, 1, 0, 3); + auto generated = stroid::GenerateMesh(config); + EXPECT_EQ(CountAttributes(*generated.mesh, true).at(2), 6 * 64); + ExpectGeometryAndCoordinateTraces(generated); + ExpectPositiveJacobians(*generated.mesh); +} + +TEST(NonconformingMesh, InterfaceClosureRaisesCoarseStellarBoundaryToMatchVacuum) { + auto generated = stroid::GenerateMesh(Configuration(2, 0, 0, 3)); + ASSERT_NE(generated.reference_mesh->ncmesh, nullptr); + EXPECT_EQ(CountAttributes(*generated.mesh, true).at(2), 6 * 64); + int envelope_maximum = 0; + for (int element = 0; element < generated.reference_mesh->GetNE(); ++element) { + if (generated.reference_mesh->GetAttribute(element) == static_cast(generated.config.envelope_id.value())) { + envelope_maximum = std::max(envelope_maximum, generated.reference_mesh->ncmesh->GetElementDepth(element)); + } + } + EXPECT_GT(envelope_maximum, 0); + for (int face = 0; face < generated.reference_mesh->GetNumFaces(); ++face) { + const auto information = generated.reference_mesh->GetFaceInformation(face); + if (!information.IsLocal()) continue; + const int first = generated.reference_mesh->ncmesh->GetElementDepth(information.element[0].index); + const int second = generated.reference_mesh->ncmesh->GetElementDepth(information.element[1].index); + EXPECT_LE(std::abs(first - second), 1); + } + ExpectGeometryAndCoordinateTraces(generated); + ExpectPositiveJacobians(*generated.mesh); +} + +TEST(NonconformingMesh, RefinementAndExteriorCoordinateAreInvariantUnderSmallLengthScales) { + auto config = Configuration(2, 1, 0, 3); + auto reference = stroid::GenerateMesh(config); + constexpr double scale = 1.0e-15; + config.r_core = config.r_core.value() * scale; + config.r_star = config.r_star.value() * scale; + config.r_infinity = config.r_infinity.value() * scale; + auto scaled = stroid::GenerateMesh(config); + ASSERT_EQ(scaled.mesh->GetNE(), reference.mesh->GetNE()); + ASSERT_EQ(scaled.mesh->GetNodes()->Size(), reference.mesh->GetNodes()->Size()); + double coordinate_error = 0.0; + for (int dof = 0; dof < scaled.mesh->GetNodes()->Size(); ++dof) { + coordinate_error = std::max(coordinate_error, + std::abs((*scaled.mesh->GetNodes())(dof) / scale - (*reference.mesh->GetNodes())(dof))); + } + EXPECT_LT(coordinate_error, 5.0e-12); + ASSERT_EQ(scaled.exterior_coordinate->values->Size(), reference.exterior_coordinate->values->Size()); + mfem::Vector difference(*scaled.exterior_coordinate->values); + difference -= *reference.exterior_coordinate->values; + EXPECT_LT(difference.Normlinf(), 5.0e-12); + ExpectGeometryAndCoordinateTraces(scaled); + ExpectPositiveJacobians(*scaled.mesh); +} + +TEST(NonconformingMesh, CurvedGeometryAndScalarConstraintsAcrossOrdersAndMappings) { + for (const std::string mapping : {"multi_block", "spherified"}) { + for (const int order : {1, 2, 3, 4}) { + SCOPED_TRACE(mapping + " order=" + std::to_string(order)); + auto config = Configuration(order); + config.core_mapping = mapping; + config.flattening = 0.2; + config.core_id = 11; + config.envelope_id = 17; + config.vacuum_id = 23; + config.surface_bdr_id = 31; + config.inf_bdr_id = 37; + auto generated = stroid::GenerateMesh(config); + EXPECT_EQ(CountAttributes(*generated.mesh).size(), 3); + EXPECT_EQ(CountAttributes(*generated.mesh, true).size(), 2); + ExpectGeometryAndCoordinateTraces(generated); + // The legacy spherified core has known corner degeneracies. Its + // envelope and vacuum must still remain strictly oriented. + ExpectPositiveJacobians(*generated.mesh, mapping == "spherified" ? 11 : -1); + } + } +} + +TEST(NonconformingMesh, NoVacuumLeavesOnlyTheUniformStellarMesh) { + auto config = Configuration(2, 1, 0, 3); + config.include_external_domain = false; + EXPECT_THROW(stroid::GenerateMesh(config), std::invalid_argument); + config.vacuum_refinement_levels.reset(); + config.vacuum_outer_refinement_levels.reset(); + auto generated = stroid::GenerateMesh(config); + EXPECT_EQ(generated.mesh->GetNE(), 13 * 8); + EXPECT_EQ(generated.exterior_coordinate, nullptr); + EXPECT_EQ(CountAttributes(*generated.mesh).size(), 2); + ExpectPositiveJacobians(*generated.mesh); +} + +TEST(NonconformingMesh, SerializationAndSubsequentRefinementPreserveHierarchy) { + auto generated = stroid::GenerateMesh(Configuration()); + const auto path = std::filesystem::temp_directory_path() / "stroid_nonconforming_round_trip.smesh"; + stroid::IO::SaveStroidMesh(generated, path.string(), "Nonconforming hierarchy regression"); + auto result = stroid::IO::LoadStroidMesh(path.string()); + ASSERT_TRUE(result.has_value()) << result.error(); + auto loaded = std::move(*result); + ASSERT_NE(loaded.reference_mesh->ncmesh, nullptr); + ASSERT_NE(loaded.mesh->ncmesh, nullptr); + EXPECT_EQ(loaded.config.vacuum_refinement_levels, generated.config.vacuum_refinement_levels); + EXPECT_EQ(loaded.config.vacuum_outer_refinement_levels, generated.config.vacuum_outer_refinement_levels); + ASSERT_EQ(loaded.mesh->GetNE(), generated.mesh->GetNE()); + for (int element = 0; element < loaded.mesh->GetNE(); ++element) { + EXPECT_EQ(loaded.reference_mesh->ncmesh->GetElementDepth(element), + generated.reference_mesh->ncmesh->GetElementDepth(element)); + } + EXPECT_NEAR(StellarVolume(loaded), StellarVolume(generated), 2.0e-12); + ExpectGeometryAndCoordinateTraces(loaded); + stroid::refinement::UniformRefinement(loaded, 1); + EXPECT_EQ(loaded.mesh->GetNE(), generated.mesh->GetNE() * 8); + EXPECT_EQ(loaded.mesh->GetNE(), loaded.reference_mesh->GetNE()); + ExpectGeometryAndCoordinateTraces(loaded); + ExpectPositiveJacobians(*loaded.mesh); + std::error_code error; + std::filesystem::remove(path, error); + EXPECT_FALSE(error); +} + +TEST(NonconformingMesh, LinearPhysicalPatchSolveUsesIndependentDofs) { + auto generated = stroid::GenerateMesh(Configuration()); + mfem::H1_FECollection collection(2, 3); + mfem::FiniteElementSpace space(generated.mesh.get(), &collection); + ASSERT_LT(space.GetTrueVSize(), space.GetVSize()); + mfem::FunctionCoefficient exact([](const mfem::Vector& point) { + return 1.0 + 0.3 * point(0) - 0.2 * point(1) + 0.1 * point(2); + }); + mfem::Array boundary(generated.mesh->bdr_attributes.Max()); + boundary = 0; + boundary[static_cast(generated.config.inf_bdr_id.value()) - 1] = 1; + mfem::Array essential; + space.GetEssentialTrueDofs(boundary, essential); + mfem::GridFunction solution(&space); + solution = 0.0; + solution.ProjectBdrCoefficient(exact, boundary); + mfem::LinearForm rhs(&space); + rhs = 0.0; + mfem::ConstantCoefficient one(1.0); + mfem::BilinearForm form(&space); + const auto& quadrature = mfem::IntRules.Get(mfem::Geometry::CUBE, 10); + auto* diffusion = new mfem::DiffusionIntegrator(one); + diffusion->SetIntRule(&quadrature); + form.AddDomainIntegrator(diffusion); + form.Assemble(); + mfem::OperatorPtr system; + mfem::Vector independent, forcing; + form.FormLinearSystem(essential, solution, rhs, system, independent, forcing); + EXPECT_EQ(system->Height(), space.GetTrueVSize()); + mfem::GSSmoother preconditioner(static_cast(*system)); + mfem::CGSolver solver; + solver.SetOperator(*system); + solver.SetPreconditioner(preconditioner); + solver.SetRelTol(1.0e-13); + solver.SetAbsTol(1.0e-14); + solver.SetMaxIter(1500); + solver.SetPrintLevel(-1); + solver.Mult(forcing, independent); + ASSERT_TRUE(solver.GetConverged()); + mfem::Vector residual(forcing.Size()); + system->Mult(independent, residual); + residual -= forcing; + EXPECT_LT(residual.Norml2() / forcing.Norml2(), 2.0e-12); + form.RecoverFEMSolution(independent, rhs, solution); + EXPECT_LT(solution.ComputeL2Error(exact), 2.0e-8); + ExpectConstrainedField(solution); +} + +TEST(NonconformingMesh, StellarVolumeAndSurfaceShapeConverge) { + auto coarse_config = Configuration(2, 2); + coarse_config.vacuum_outer_refinement_levels.reset(); + auto coarse = stroid::GenerateMesh(coarse_config); + auto fine_config = coarse_config; + fine_config.refinement_levels = 3; + auto fine = stroid::GenerateMesh(fine_config); + const double exact_volume = 4.0 * kPi / 3.0; + const double coarse_volume_error = std::abs(StellarVolume(coarse) - exact_volume); + const double fine_volume_error = std::abs(StellarVolume(fine) - exact_volume); + EXPECT_GT(coarse_volume_error, 1.0e-10); + EXPECT_LT(fine_volume_error, 0.5 * coarse_volume_error); + EXPECT_LT(SurfaceRadiusError(fine), 0.5 * SurfaceRadiusError(coarse)); +} + +TEST(NonconformingMesh, TMOPPreservesHangingConstraintsAndBoundaryTraces) { + auto config = Configuration(1); + auto initial = stroid::GenerateMesh(config); + config.optimization_methods = stroid::config::OptimizationMethods{true, true}; + auto generated = stroid::GenerateMesh(config); + mfem::Array marker(generated.mesh->bdr_attributes.Max()); + marker = 1; + mfem::Array essential; + generated.mesh->GetNodalFESpace()->GetEssentialTrueDofs(marker, essential); + mfem::Vector initial_nodes, optimized_nodes; + initial.mesh->GetNodes()->GetTrueDofs(initial_nodes); + generated.mesh->GetNodes()->GetTrueDofs(optimized_nodes); + ASSERT_EQ(initial_nodes.Size(), optimized_nodes.Size()); + for (const int dof : essential) EXPECT_NEAR(initial_nodes(dof), optimized_nodes(dof), 2.0e-13); + ExpectGeometryAndCoordinateTraces(generated); + ExpectPositiveJacobians(*generated.mesh); +} diff --git a/tests/stroidTest.cpp b/tests/stroidTest.cpp index c30b265..c79077f 100644 --- a/tests/stroidTest.cpp +++ b/tests/stroidTest.cpp @@ -358,11 +358,11 @@ std::optional EvalGridFunctionAtPoint( class stroidTest : public ::testing::Test {}; /** - * @brief Verifies the baseline block topology cardinalities in the no-vacuum case. + * @brief Verifies the default multi-block topology including the vacuum. * @details * Rationale: this is the fastest canary for accidental edits in block construction order, * vertex indexing, or boundary-face assembly. - * Method: build the default skeleton and assert exact counts (3D, 16 vertices, 7 hexes, 6 bdr quads). + * Method: build the default skeleton and assert exact counts (3D, 32 vertices, 19 hexes, 12 bdr quads). * If this fails: inspect `stroid::topology::BuildSkeleton` in `src/lib/topology/topology.cpp`, * especially `add_box`, `stellar_shells`, and `surface_bdr_quads`, plus ID defaults in * `src/include/stroid/config/config.h`. @@ -373,8 +373,8 @@ TEST_F(stroidTest, BuildSkeleton_DefaultCounts) { ASSERT_NE(mesh, nullptr); EXPECT_EQ(mesh->Dimension(), 3); - EXPECT_EQ(mesh->GetNV(), 24); - EXPECT_EQ(mesh->GetNE(), 13); + EXPECT_EQ(mesh->GetNV(), 32); + EXPECT_EQ(mesh->GetNE(), 19); EXPECT_EQ(mesh->GetNBE(), 12); } @@ -1355,8 +1355,8 @@ void ExpectCoreFaceContinuity(mfem::Mesh& mesh, int coreAttribute) { } // namespace -TEST_F(stroidTest, MultiBlockCore_TopologyCountsAndAttributesAreOptIn) { - EXPECT_EQ(stroid::config::MeshConfig{}.core_mapping.value(), "spherified"); +TEST_F(stroidTest, MultiBlockCore_DefaultTopologyCountsAndAttributes) { + EXPECT_EQ(stroid::config::MeshConfig{}.core_mapping.value(), "multi_block"); for (const bool external : {false, true}) { SCOPED_TRACE(external); auto cfg = MultiBlockConfiguration(2, 0, external); diff --git a/tests/visualizationTest.cpp b/tests/visualizationTest.cpp new file mode 100644 index 0000000..c758d5d --- /dev/null +++ b/tests/visualizationTest.cpp @@ -0,0 +1,182 @@ +#include + +#include "stroid/stroid.h" + +#include +#include +#include +#include + +namespace { + std::string Serialize(const mfem::Mesh& mesh) { + std::ostringstream stream; + stream.precision(std::numeric_limits::max_digits10); + mesh.Print(stream); + return stream.str(); + } + + int HangingFaces(const mfem::Mesh& mesh) { + int count = 0; + for (int face = 0; face < mesh.GetNumFaces(); ++face) { + count += mesh.GetFaceInformation(face).IsNonconformingFine(); + } + return count; + } + + void TessellatedPoint(mfem::ElementTransformation& transformation, + const mfem::IntegrationPoint& point, int subdivisions, + mfem::Vector& value) { + const double coordinates[] = {point.x, point.y, point.z}; + int cell[3]; + double local[3]; + for (int d = 0; d < 3; ++d) { + const double scaled = coordinates[d] * subdivisions; + cell[d] = std::clamp(static_cast(std::floor(scaled)), 0, subdivisions - 1); + local[d] = scaled - cell[d]; + } + value = 0.0; + mfem::Vector corner(3); + for (int i = 0; i < 2; ++i) { + for (int j = 0; j < 2; ++j) { + for (int k = 0; k < 2; ++k) { + mfem::IntegrationPoint sample; + sample.Set3(static_cast(cell[0] + i) / subdivisions, + static_cast(cell[1] + j) / subdivisions, + static_cast(cell[2] + k) / subdivisions); + transformation.Transform(sample, corner); + const double weight = (i ? local[0] : 1.0 - local[0]) * + (j ? local[1] : 1.0 - local[1]) * + (k ? local[2] : 1.0 - local[2]); + value.Add(weight, corner); + } + } + } + } + + double FaceGap(mfem::Mesh& mesh, int subdivisions = 0) { + double maximum = 0.0; + mfem::Vector first(3), second(3); + const auto& quadrature = mfem::IntRules.Get(mfem::Geometry::SQUARE, 6); + for (int face = 0; face < mesh.GetNumFaces(); ++face) { + if (!mesh.GetFaceInformation(face).IsLocal()) continue; + auto* transformation = mesh.GetFaceElementTransformations(face); + for (int q = 0; q < quadrature.GetNPoints(); ++q) { + transformation->SetAllIntPoints(&quadrature.IntPoint(q)); + const auto first_point = transformation->Elem1->GetIntPoint(); + const auto second_point = transformation->Elem2->GetIntPoint(); + if (subdivisions > 0) { + TessellatedPoint(*transformation->Elem1, first_point, subdivisions, first); + TessellatedPoint(*transformation->Elem2, second_point, subdivisions, second); + } else { + transformation->Elem1->Transform(first_point, first); + transformation->Elem2->Transform(second_point, second); + } + first -= second; + maximum = std::max(maximum, first.Norml2()); + } + } + return maximum; + } + + stroid::StroidMesh CurvedVacuumMesh() { + stroid::config::MeshConfig config; + config.order = 3; + config.refinement_levels = 1; + config.vacuum_refinement_levels = 0; + config.vacuum_outer_refinement_levels = 2; + config.flattening = 0.15; + config.optimization_methods = stroid::config::OptimizationMethods{false, true}; + return stroid::GenerateMesh(config); + } +} + +TEST(Visualization, ConformingDisplayEliminatesCurvedTessellationGaps) { + auto generated = CurvedVacuumMesh(); + auto& source = *generated.mesh; + ASSERT_GT(HangingFaces(source), 0); + EXPECT_LT(FaceGap(source), 5.0e-12); + // Reproduce visible cracks even though the finite-element traces coincide. + EXPECT_GT(FaceGap(source, 2), 1.0e-4); + const auto original = Serialize(source); + const auto original_reference = Serialize(*generated.reference_mesh); + + auto display = stroid::IO::MakeConformingVisualizationMesh(source); + ASSERT_NE(display, nullptr); + EXPECT_GT(display->GetNE(), source.GetNE()); + EXPECT_EQ(HangingFaces(*display), 0); + EXPECT_EQ(display->GetNodalFESpace()->GetNDofs(), + display->GetNodalFESpace()->GetTrueVSize() / display->SpaceDimension()); + EXPECT_LT(FaceGap(*display), 5.0e-12); + for (int subdivisions : {1, 2, 3, 4}) { + EXPECT_LT(FaceGap(*display, subdivisions), 5.0e-12) << subdivisions; + } + + std::istringstream stream(Serialize(*display)); + mfem::Mesh reloaded(stream, 1, 1, true); + EXPECT_EQ(HangingFaces(reloaded), 0); + EXPECT_LT(FaceGap(reloaded, 2), 5.0e-12); + EXPECT_EQ(Serialize(source), original); + EXPECT_EQ(Serialize(*generated.reference_mesh), original_reference); +} + +TEST(Visualization, DisplayRefinementRestrictsExistingGeometryAndAttributes) { + auto generated = CurvedVacuumMesh(); + auto display = stroid::IO::MakeConformingVisualizationMesh(*generated.mesh); + auto reference = stroid::IO::MakeConformingVisualizationMesh(*generated.reference_mesh); + ASSERT_EQ(display->GetNE(), reference->GetNE()); + + mfem::DenseMatrix centers(3, reference->GetNE()); + mfem::Vector point(3), expected(3), actual(3); + for (int element = 0; element < reference->GetNE(); ++element) { + reference->GetElementCenter(element, point); + centers.SetCol(element, point); + } + mfem::Array parents; + mfem::Array parent_points; + ASSERT_EQ(generated.reference_mesh->FindPoints(centers, parents, parent_points, false), + reference->GetNE()); + double maximum_error = 0.0; + for (int element = 0; element < display->GetNE(); ++element) { + const int parent = parents[element]; + ASSERT_GE(parent, 0); + EXPECT_EQ(display->GetAttribute(element), generated.mesh->GetAttribute(parent)); + mfem::InverseElementTransformation inverse( + generated.reference_mesh->GetElementTransformation(parent)); + auto* logical = reference->GetElementTransformation(element); + auto* physical = display->GetElementTransformation(element); + auto* original = generated.mesh->GetElementTransformation(parent); + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + for (int k = 0; k < 3; ++k) { + mfem::IntegrationPoint sample, parent_sample; + sample.Set3(i / 2.0, j / 2.0, k / 2.0); + logical->Transform(sample, point); + ASSERT_EQ(inverse.Transform(point, parent_sample), + mfem::InverseElementTransformation::Inside); + original->Transform(parent_sample, expected); + physical->Transform(sample, actual); + actual -= expected; + maximum_error = std::max(maximum_error, actual.Norml2()); + } + } + } + } + EXPECT_LT(maximum_error, 5.0e-12); +} + +TEST(Visualization, AlreadyMatchingFacesNeedNoAdditionalElements) { + stroid::config::MeshConfig config; + config.order = 3; + config.refinement_levels = 1; + config.optimization_methods = stroid::config::OptimizationMethods{false, true}; + for (bool hierarchy : {false, true}) { + config.vacuum_refinement_levels = hierarchy ? std::optional(1) : std::nullopt; + auto generated = stroid::GenerateMesh(config); + if (hierarchy) generated.mesh->EnsureNCMesh(); + const auto original = Serialize(*generated.mesh); + auto display = stroid::IO::MakeConformingVisualizationMesh(*generated.mesh); + EXPECT_EQ(display->GetNE(), generated.mesh->GetNE()); + EXPECT_EQ(Serialize(*display), original); + EXPECT_EQ(Serialize(*generated.mesh), original); + } +} diff --git a/tools/meson.build b/tools/meson.build index 33d5d0c..f98b6ff 100644 --- a/tools/meson.build +++ b/tools/meson.build @@ -1,4 +1,5 @@ -executable('stroid', 'stroid.cpp', dependencies: [stroid_dep, cli11_dep, magic_enum_dep], install: true) +stroid_cli = executable('stroid', 'stroid.cpp', dependencies: [stroid_dep, cli11_dep, magic_enum_dep], install: true) -# Opt-in diagnostic driver; deliberately not part of the installed API/tools. executable('geometry_quality_experiment', 'geometry_quality_experiment.cpp', dependencies: [stroid_dep, cli11_dep], build_by_default: false, install: false) + +executable('vacuum_refinement_experiment', 'vacuum_refinement_experiment.cpp', dependencies: [stroid_dep, cli11_dep], build_by_default: false, install: false) diff --git a/tools/stroid.cpp b/tools/stroid.cpp index 086b010..56d127a 100644 --- a/tools/stroid.cpp +++ b/tools/stroid.cpp @@ -7,6 +7,7 @@ #include #include #include +#include // ReSharper disable once CppUnusedIncludeDirective #include "mfem.hpp" @@ -72,12 +73,14 @@ int main(int argc, char** argv) { std::optional mesh_file; std::string output_filename = "stroid.mesh"; bool view_mesh = false; + bool original_elements = false; bool no_save = false; std::string glvis_host = "localhost"; int glvis_port = 19916; generate->add_option("-c,--config", config_filename, "Path to configuration file")->check(CLI::ExistingFile); generate->add_flag("-v,--view", view_mesh, "View the generated mesh using GLVis"); + generate->add_flag("--original-elements", original_elements, "Display original cells; curved hanging faces may show GLVis tessellation gaps"); generate->add_flag("-n,--no-save", no_save, "Do not save the generated mesh to a file"); generate->add_option("--glvis-host", glvis_host, "GLVis server host")->capture_default_str(); generate->add_option("--glvis-port", glvis_port, "GLVis server port")->capture_default_str(); @@ -85,6 +88,7 @@ int main(int argc, char** argv) { view->add_option("--host", glvis_host, "GLVis server host")->capture_default_str(); view->add_option("--port", glvis_port, "GLVis server port")->capture_default_str(); + view->add_flag("--original-elements", original_elements, "Display original cells; curved hanging faces may show GLVis tessellation gaps"); view->add_option("-f,--file", mesh_file, "Path to .mesh file")->check(CLI::ExistingFile); auto to_lower = [](std::string s) { @@ -167,7 +171,8 @@ int main(int argc, char** argv) { "Mesh Viewer - Colored by Element ID", selected_mode, glvis_host, - glvis_port); + glvis_port, + !original_elements); exit(0); } @@ -178,11 +183,8 @@ int main(int argc, char** argv) { } - const std::unique_ptr mesh = stroid::topology::BuildSkeleton(cfg); - stroid::topology::Finalize(*mesh, cfg); - stroid::topology::PromoteToHighOrder(*mesh, cfg); - stroid::topology::ProjectMesh(*mesh, cfg); - stroid::topology::OptimizeMesh(*mesh, cfg); + auto generated = stroid::GenerateMesh(cfg); + mfem::Mesh* mesh = generated.mesh.get(); if (!no_save) { const std::string& final_path = output_filename; @@ -193,6 +195,7 @@ int main(int argc, char** argv) { std::cerr << "WARNING! Saving to MFEM format without the standard '.mesh' extension. File will be called " << final_path << std::endl; } std::ofstream ofs(final_path); + ofs.precision(std::numeric_limits::max_digits10); mesh->Print(ofs); break; } @@ -201,12 +204,19 @@ int main(int argc, char** argv) { std::cerr << "WARNING! Saving to VTU format without the standard '.vtu' extension. File will be called " << final_path << std::endl; } std::ofstream ofs(final_path); + ofs.precision(std::numeric_limits::max_digits10); + // MFEM's stream overload writes an open Piece, allowing callers + // to append fields. Supply the enclosing document for a mesh export. + ofs << "\n\n"; mesh->PrintVTU(ofs, out_cfg.vtu.ref, out_cfg.vtu.format, out_cfg.vtu.high_order_output, out_cfg.vtu.compression_level, out_cfg.vtu.bdr_elements); + ofs << "\n\n\n"; break; } case MESH_FORMATS::VTK: { @@ -239,11 +249,12 @@ int main(int argc, char** argv) { "Spheroidal Mesh - Colored by Element ID", stroid::IO::VISUALIZATION_MODE::ELEMENT_ID, glvis_host, - glvis_port); + glvis_port, + !original_elements); } } else if (!*info) { std::println("Usage: {} [generate|info|view] --help", argv[0]); } return 0; -} \ No newline at end of file +} diff --git a/tools/vacuum_refinement_experiment.cpp b/tools/vacuum_refinement_experiment.cpp new file mode 100644 index 0000000..bd6dafe --- /dev/null +++ b/tools/vacuum_refinement_experiment.cpp @@ -0,0 +1,337 @@ +#include "stroid/stroid.h" +#include "CLI/CLI.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + constexpr double kPi = 3.14159265358979323846; + + class ScopedOutputRedirect { + std::streambuf* original; + public: + ScopedOutputRedirect() : original(std::cout.rdbuf(std::cerr.rdbuf())) {} + ~ScopedOutputRedirect() { std::cout.rdbuf(original); } + }; + + struct GeometryResults { + int stellar_elements = 0; + int vacuum_elements = 0; + int hanging_faces = 0; + size_t samples = 0; + size_t nonpositive_samples = 0; + double min_signed_det = std::numeric_limits::infinity(); + double max_condition = 0.0; + double max_face_mismatch = 0.0; + double max_coordinate_mismatch = 0.0; + double coordinate_constraint_residual = 0.0; + double stellar_volume = 0.0; + double stellar_volume_error = 0.0; + double surface_radius_error = 0.0; + double outer_radius_error = 0.0; + }; + + GeometryResults InspectGeometry(stroid::StroidMesh& generated, int grid_points) { + GeometryResults result; + auto& mesh = *generated.mesh; + const int vacuum = static_cast(generated.config.vacuum_id.value()); + const auto& coordinate = *generated.exterior_coordinate->values; + mfem::Vector independent; + coordinate.GetTrueDofs(independent); + mfem::GridFunction reconstructed(generated.exterior_coordinate->space.get()); + reconstructed.SetFromTrueDofs(independent); + reconstructed -= coordinate; + result.coordinate_constraint_residual = reconstructed.Normlinf(); + + for (int element = 0; element < mesh.GetNE(); ++element) { + const bool is_vacuum = mesh.GetAttribute(element) == vacuum; + is_vacuum ? ++result.vacuum_elements : ++result.stellar_elements; + auto* transformation = mesh.GetElementTransformation(element); + auto inspect = [&](const mfem::IntegrationPoint& point) { + transformation->SetIntPoint(&point); + const auto& jacobian = transformation->Jacobian(); + const double determinant = jacobian.Det(); + const double smallest = jacobian.CalcSingularvalue(2); + const double largest = jacobian.CalcSingularvalue(0); + ++result.samples; + if (!(determinant > 0.0) || !std::isfinite(determinant)) ++result.nonpositive_samples; + result.min_signed_det = std::min(result.min_signed_det, determinant); + result.max_condition = std::max(result.max_condition, + smallest > 0.0 ? largest / smallest : std::numeric_limits::infinity()); + }; + const auto& quadrature = mfem::IntRules.Get(mfem::Geometry::CUBE, 3 * transformation->Order() + 3); + for (int q = 0; q < quadrature.GetNPoints(); ++q) { + const auto& point = quadrature.IntPoint(q); + inspect(point); + if (!is_vacuum) result.stellar_volume += point.weight * transformation->Jacobian().Det(); + } + for (int i = 0; i < grid_points; ++i) { + for (int j = 0; j < grid_points; ++j) { + for (int k = 0; k < grid_points; ++k) { + mfem::IntegrationPoint point; + point.Set3(static_cast(i) / (grid_points - 1), + static_cast(j) / (grid_points - 1), + static_cast(k) / (grid_points - 1)); + inspect(point); + } + } + } + } + const double stellar_radius = generated.config.r_star.value(); + const double flattening = generated.config.flattening.value(); + const double analytic_volume = 4.0 * kPi * std::pow(stellar_radius, 3) * (1.0 - flattening) / 3.0; + result.stellar_volume_error = std::abs(result.stellar_volume - analytic_volume); + + mfem::Vector first(3), second(3); + for (int face = 0; face < mesh.GetNumFaces(); ++face) { + const auto information = mesh.GetFaceInformation(face); + if (!information.IsLocal()) continue; + if (information.IsNonconformingFine()) ++result.hanging_faces; + auto* transformation = mesh.GetFaceElementTransformations(face); + const bool stellar_interface = (transformation->Elem1->Attribute == vacuum) != + (transformation->Elem2->Attribute == vacuum); + if (stellar_interface && !information.IsConforming()) { + throw std::runtime_error("The stellar-vacuum interface is nonconforming."); + } + for (int i = 0; i < grid_points; ++i) { + for (int j = 0; j < grid_points; ++j) { + mfem::IntegrationPoint point; + point.Set2(static_cast(i) / (grid_points - 1), + static_cast(j) / (grid_points - 1)); + transformation->SetAllIntPoints(&point); + const auto& first_point = transformation->Elem1->GetIntPoint(); + const auto& second_point = transformation->Elem2->GetIntPoint(); + transformation->Elem1->Transform(first_point, first); + transformation->Elem2->Transform(second_point, second); + first -= second; + result.max_face_mismatch = std::max(result.max_face_mismatch, first.Norml2()); + const double difference = coordinate.GetValue(transformation->Elem1No, first_point) - + coordinate.GetValue(transformation->Elem2No, second_point); + result.max_coordinate_mismatch = std::max(result.max_coordinate_mismatch, std::abs(difference)); + } + } + } + + const auto& surface_quadrature = mfem::IntRules.Get(mfem::Geometry::SQUARE, 10); + for (int boundary = 0; boundary < mesh.GetNBE(); ++boundary) { + const bool surface = mesh.GetBdrAttribute(boundary) == static_cast(generated.config.surface_bdr_id.value()); + const bool outer = mesh.GetBdrAttribute(boundary) == static_cast(generated.config.inf_bdr_id.value()); + if (!surface && !outer) continue; + const double radius = surface ? stellar_radius : generated.config.r_infinity.value(); + auto* transformation = mesh.GetBdrElementTransformation(boundary); + for (int q = 0; q < surface_quadrature.GetNPoints(); ++q) { + transformation->Transform(surface_quadrature.IntPoint(q), first); + first(2) /= 1.0 - flattening; + double& error = surface ? result.surface_radius_error : result.outer_radius_error; + error = std::max(error, std::abs(first.Norml2() - radius)); + } + } + return result; + } + + struct SolveResults { + int dofs = 0; + int true_dofs = 0; + int iterations = 0; + bool converged = false; + double relative_residual = 0.0; + double l2_error = 0.0; + double stellar_l2_error = 0.0; + double vacuum_l2_error = 0.0; + double h1_error = 0.0; + }; + + SolveResults SolveManufacturedProblem(stroid::StroidMesh& generated, int solution_order) { + auto& mesh = *generated.mesh; + const double outer_sixth_power = std::pow(generated.config.r_infinity.value(), 6); + mfem::FunctionCoefficient exact([outer_sixth_power](const mfem::Vector& point) { + const double radius_squared = point * point; + return std::exp(-radius_squared) + 0.1 * std::pow(radius_squared, 3) / outer_sixth_power; + }); + mfem::VectorFunctionCoefficient gradient(3, [outer_sixth_power](const mfem::Vector& point, mfem::Vector& value) { + const double radius_squared = point * point; + value = point; + value *= -2.0 * std::exp(-radius_squared) + 0.6 * radius_squared * radius_squared / outer_sixth_power; + }); + mfem::FunctionCoefficient forcing([outer_sixth_power](const mfem::Vector& point) { + const double radius_squared = point * point; + return (6.0 - 4.0 * radius_squared) * std::exp(-radius_squared) + - 4.2 * radius_squared * radius_squared / outer_sixth_power; + }); + mfem::H1_FECollection collection(solution_order, 3); + mfem::FiniteElementSpace space(&mesh, &collection); + SolveResults result; + result.dofs = space.GetVSize(); + result.true_dofs = space.GetTrueVSize(); + mfem::Array boundary(mesh.bdr_attributes.Max()); + boundary = 0; + boundary[static_cast(generated.config.inf_bdr_id.value()) - 1] = 1; + mfem::Array essential; + space.GetEssentialTrueDofs(boundary, essential); + mfem::GridFunction solution(&space); + solution = 0.0; + solution.ProjectBdrCoefficient(exact, boundary); + const int quadrature_order = 2 * solution_order + 3 * generated.config.order.value() + 4; + const auto& quadrature = mfem::IntRules.Get(mfem::Geometry::CUBE, quadrature_order); + mfem::LinearForm rhs(&space); + auto* load = new mfem::DomainLFIntegrator(forcing); + load->SetIntRule(&quadrature); + rhs.AddDomainIntegrator(load); + rhs.Assemble(); + mfem::ConstantCoefficient one(1.0); + mfem::BilinearForm form(&space); + auto* diffusion = new mfem::DiffusionIntegrator(one); + diffusion->SetIntRule(&quadrature); + form.AddDomainIntegrator(diffusion); + form.Assemble(); + mfem::OperatorPtr system; + mfem::Vector independent, system_rhs; + form.FormLinearSystem(essential, solution, rhs, system, independent, system_rhs); + mfem::GSSmoother preconditioner(static_cast(*system)); + mfem::CGSolver solver; + solver.SetOperator(*system); + solver.SetPreconditioner(preconditioner); + solver.SetRelTol(1.0e-11); + solver.SetAbsTol(1.0e-14); + solver.SetMaxIter(2000); + solver.SetPrintLevel(-1); + solver.Mult(system_rhs, independent); + result.converged = solver.GetConverged(); + result.iterations = solver.GetNumIterations(); + mfem::Vector residual(system_rhs.Size()); + system->Mult(independent, residual); + residual -= system_rhs; + result.relative_residual = residual.Norml2() / system_rhs.Norml2(); + form.RecoverFEMSolution(independent, rhs, solution); + const mfem::IntegrationRule* rules[mfem::Geometry::NumGeom]{}; + rules[mfem::Geometry::CUBE] = &quadrature; + result.l2_error = solution.ComputeL2Error(exact, rules); + result.h1_error = solution.ComputeH1Error(&exact, &gradient, rules); + for (int element = 0; element < mesh.GetNE(); ++element) { + auto* transformation = mesh.GetElementTransformation(element); + double element_error = 0.0; + for (int q = 0; q < quadrature.GetNPoints(); ++q) { + const auto& point = quadrature.IntPoint(q); + transformation->SetIntPoint(&point); + const double difference = solution.GetValue(element, point) - exact.Eval(*transformation, point); + element_error += point.weight * transformation->Weight() * difference * difference; + } + if (mesh.GetAttribute(element) == static_cast(generated.config.vacuum_id.value())) { + result.vacuum_l2_error += element_error; + } else { + result.stellar_l2_error += element_error; + } + } + result.stellar_l2_error = std::sqrt(result.stellar_l2_error); + result.vacuum_l2_error = std::sqrt(result.vacuum_l2_error); + return result; + } +} + +int main(int argc, char* argv[]) { + std::vector orders{1, 2}; + std::vector refinements{2, 3}; + std::vector bulk_levels{0}; + int outer_level = -1; + int solution_order = 1; + int grid_points = 3; + double flattening = 0.0; + double infinity_radius = 6.0; + std::string output_path; + CLI::App app{"Compare uniform and graded vacuum meshes, geometry, and an H1 manufactured Poisson solution; TMOP is disabled."}; + app.add_option("--orders", orders, "Geometry orders, comma separated")->delimiter(',')->check(CLI::Range(1, 6)); + app.add_option("--refinements", refinements, "Stellar refinement levels, comma separated")->delimiter(',')->check(CLI::Range(0, 4)); + app.add_option("--bulk-levels", bulk_levels, "Vacuum background target levels, comma separated")->delimiter(',')->check(CLI::Range(0, 4)); + app.add_option("--outer-level", outer_level, "Outer vacuum target; -1 inherits stellar level")->check(CLI::Range(-1, 4)); + app.add_option("--solution-order", solution_order, "H1 polynomial order for the manufactured solve")->check(CLI::Range(1, 4)); + app.add_option("--grid-points", grid_points, "Closed tensor sample grid per coordinate, in addition to quadrature")->check(CLI::Range(2, 9)); + app.add_option("--flattening", flattening, "Spheroidal flattening")->check(CLI::Range(0.0, 0.9)); + app.add_option("--infinity-radius", infinity_radius, "Finite geometric outer radius; stellar radius is one"); + app.add_option("--output", output_path, "New CSV output file; default stdout"); + try { + app.parse(argc, argv); + } catch (const CLI::ParseError& error) { + return app.exit(error); + } + try { + if (!std::isfinite(infinity_radius) || infinity_radius <= 1.0) { + throw std::invalid_argument("Require a finite infinity-radius greater than one."); + } + std::ofstream file; + if (!output_path.empty()) { + if (std::filesystem::exists(output_path)) throw std::runtime_error("Refusing to overwrite existing output: " + output_path); + file.open(output_path); + if (!file) throw std::runtime_error("Could not open output: " + output_path); + } + std::ostream& output = output_path.empty() ? std::cout : file; + output << std::setprecision(17); + output << "policy,geometry_order,stellar_level,bulk_target,outer_target,solution_order,flattening,r_infinity,elements,stellar_elements,vacuum_elements,vacuum_min_depth,vacuum_max_depth,geometry_dofs,geometry_true_dofs,solution_dofs,solution_true_dofs,hanging_faces,samples,nonpositive_samples,min_signed_det,max_condition,max_face_mismatch,max_coordinate_mismatch,coordinate_constraint_residual,stellar_volume,stellar_volume_error,surface_radius_error,outer_radius_error,l2_error,stellar_l2_error,vacuum_l2_error,h1_error,solver_converged,solver_iterations,relative_residual\n"; + std::cerr << "Evaluating actual FE geometry using signed Jacobians at quadrature points and a closed grid.\n" + "Manufactured problem: -Delta u=f, u=exp(-r^2)+0.1*r^6/R^6, exact Dirichlet data only at the outer boundary.\n" + "This finite-domain Poisson diagnostic measures discretization error; it does not implement compactified physics.\n"; + bool verified = true; + for (const int order : orders) { + for (const int refinement : refinements) { + std::vector cases{-1}; + cases.insert(cases.end(), bulk_levels.begin(), bulk_levels.end()); + for (const int bulk : cases) { + const bool uniform = bulk < 0; + const std::string policy = uniform ? "uniform" : "graded"; + stroid::config::MeshConfig config; + config.order = order; + config.refinement_levels = refinement; + config.flattening = flattening; + config.r_infinity = infinity_radius; + config.optimization_methods = stroid::config::OptimizationMethods{false, true}; + if (!uniform) { + config.vacuum_refinement_levels = bulk; + if (outer_level >= 0) config.vacuum_outer_refinement_levels = outer_level; + } + std::cerr << "Inspecting " << policy << ", geometry order " << order << ", stellar level " << refinement + << ", bulk " << (uniform ? refinement : bulk) << '\n'; + stroid::StroidMesh generated; + { + ScopedOutputRedirect redirect; + generated = stroid::GenerateMesh(config); + } + const auto geometry = InspectGeometry(generated, grid_points); + const auto stats = stroid::stats::ComputeMeshStats(generated, stroid::stats::MeshStatFeatures::REFINEMENT); + const auto solve = SolveManufacturedProblem(generated, solution_order); + verified = verified && geometry.nonpositive_samples == 0 && geometry.max_face_mismatch < 1.0e-10 + && geometry.max_coordinate_mismatch < 1.0e-11 && geometry.coordinate_constraint_residual < 1.0e-11 + && solve.converged && solve.relative_residual < 1.0e-9 && std::isfinite(solve.h1_error); + const int outer = uniform ? refinement : outer_level < 0 ? refinement : outer_level; + output << policy << ',' << order << ',' << refinement << ',' << (uniform ? refinement : bulk) << ',' << outer + << ',' << solution_order << ',' << flattening << ',' << infinity_radius << ',' << generated.mesh->GetNE() + << ',' << geometry.stellar_elements << ',' << geometry.vacuum_elements + << ',' << stats.refinement->vacuum.min_depth << ',' << stats.refinement->vacuum.max_depth + << ',' << stats.refinement->geometry_dofs << ',' << stats.refinement->geometry_true_dofs + << ',' << solve.dofs << ',' << solve.true_dofs << ',' << geometry.hanging_faces + << ',' << geometry.samples << ',' << geometry.nonpositive_samples << ',' << geometry.min_signed_det + << ',' << geometry.max_condition << ',' << geometry.max_face_mismatch << ',' << geometry.max_coordinate_mismatch + << ',' << geometry.coordinate_constraint_residual << ',' << geometry.stellar_volume << ',' << geometry.stellar_volume_error + << ',' << geometry.surface_radius_error << ',' << geometry.outer_radius_error << ',' << solve.l2_error + << ',' << solve.stellar_l2_error << ',' << solve.vacuum_l2_error << ',' << solve.h1_error + << ',' << solve.converged << ',' << solve.iterations << ',' << solve.relative_residual << '\n'; + output.flush(); + if (!output) throw std::runtime_error("Failed to write experiment output."); + } + } + } + if (!verified) { + std::cerr << "Numerical verification failed: inspect Jacobian, trace, or solver columns.\n"; + return 1; + } + } catch (const std::exception& error) { + std::cerr << "Vacuum refinement experiment failed: " << error.what() << '\n'; + return 1; + } + return 0; +}