2323
2424#include < geode/inspector/criterion/internal/component_meshes_degeneration.hpp>
2525
26+ #include < async++.h>
27+
2628#include < geode/basic/logger.hpp>
2729
2830#include < geode/mesh/core/surface_mesh.hpp>
@@ -45,33 +47,65 @@ namespace geode
4547 : model_( model )
4648 {
4749 }
50+ template < typename Model >
51+ ComponentMeshesDegeneration< Model >::~ComponentMeshesDegeneration ()
52+ {
53+ for ( const auto & surface_id : enabled_edges_surfaces_ )
54+ {
55+ model_.surface ( surface_id ).mesh ().disable_edges ();
56+ }
57+ }
4858
4959 template < typename Model >
5060 void ComponentMeshesDegeneration< Model >::add_small_edges(
5161 InspectionIssuesMap< index_t >& components_small_edges,
5262 double threshold ) const
5363 {
64+ std::vector<
65+ async::task< std::pair< uuid, InspectionIssues< index_t > > > >
66+ tasks;
67+ tasks.reserve ( model_.nb_lines () );
5468 for ( const auto & line : model_.lines () )
5569 {
56- const EdgedCurveDegeneration< Model::dim > inspector{
57- line.mesh ()
58- };
59- auto issues = inspector.small_edges ( threshold );
60- issues.set_description ( absl::StrCat (
61- " Line " , line.id ().string (), " small edges" ) );
70+ tasks.emplace_back ( async::spawn ( [&threshold, &line] {
71+ const EdgedCurveDegeneration< Model::dim > inspector{
72+ line.mesh ()
73+ };
74+ auto issues = inspector.small_edges ( threshold );
75+ issues.set_description ( absl::StrCat (
76+ " Line " , line.id ().string (), " small edges" ) );
77+ return std::make_pair ( line.id (), std::move ( issues ) );
78+ } ) );
79+ }
80+ for ( auto & task :
81+ async::when_all ( tasks.begin (), tasks.end () ).get () )
82+ {
83+ auto [line_id, issues] = task.get ();
6284 components_small_edges.add_issues_to_map (
63- line. id () , std::move ( issues ) );
85+ line_id , std::move ( issues ) );
6486 }
87+ std::vector<
88+ async::task< std::pair< uuid, InspectionIssues< index_t > > > >
89+ tasks;
90+ tasks.reserve ( model_.nb_surfaces () );
6591 for ( const auto & surface : model_.surfaces () )
6692 {
67- const geode::SurfaceMeshDegeneration< Model::dim > inspector{
68- surface.mesh ()
69- };
70- auto issues = inspector.small_edges ( threshold );
71- issues.set_description ( absl::StrCat (
72- " Surface " , surface.id ().string (), " small edges" ) );
93+ tasks.emplace_back ( async::spawn ( [&threshold, &surface] {
94+ enable_edges_on_surface ( surface );
95+ const geode::SurfaceMeshDegeneration< Model::dim >
96+ inspector{ surface.mesh () };
97+ auto issues = inspector.small_edges ( threshold );
98+ issues.set_description ( absl::StrCat (
99+ " Surface " , surface.id ().string (), " small edges" ) );
100+ return std::make_pair ( surface.id (), std::move ( issues ) );
101+ } ) );
102+ }
103+ for ( auto & task :
104+ async::when_all ( tasks.begin (), tasks.end () ).get () )
105+ {
106+ auto [surface_id, issues] = task.get ();
73107 components_small_edges.add_issues_to_map (
74- surface. id () , std::move ( issues ) );
108+ surface_id , std::move ( issues ) );
75109 }
76110 }
77111
@@ -87,16 +121,27 @@ namespace geode
87121 InspectionIssuesMap< index_t >& components_small_polygons,
88122 double threshold ) const
89123 {
124+ std::vector<
125+ async::task< std::pair< uuid, InspectionIssues< index_t > > > >
126+ tasks;
127+ tasks.reserve ( model_.nb_surfaces () );
90128 for ( const auto & surface : model_.surfaces () )
91129 {
92- const geode::SurfaceMeshDegeneration< Model::dim > inspector{
93- surface.mesh ()
94- };
95- auto issues = inspector.small_height_polygons ( threshold );
96- issues.set_description ( absl::StrCat (
97- " Surface " , surface.id ().string (), " small polygons" ) );
130+ tasks.emplace_back ( async::spawn ( [&threshold, &surface] {
131+ const geode::SurfaceMeshDegeneration< Model::dim >
132+ inspector{ surface.mesh () };
133+ auto issues = inspector.small_height_polygons ( threshold );
134+ issues.set_description ( absl::StrCat ( " Surface " ,
135+ surface.id ().string (), " small polygons" ) );
136+ return std::make_pair ( surface.id (), std::move ( issues ) );
137+ } ) );
138+ }
139+ for ( auto & task :
140+ async::when_all ( tasks.begin (), tasks.end () ).get () )
141+ {
142+ auto [surface_id, issues] = task.get ();
98143 components_small_polygons.add_issues_to_map (
99- surface. id () , std::move ( issues ) );
144+ surface_id , std::move ( issues ) );
100145 }
101146 }
102147
@@ -115,6 +160,18 @@ namespace geode
115160 return model_;
116161 }
117162
163+ template < typename Model >
164+ void ComponentMeshesDegeneration< Model >::enable_edges_on_surface(
165+ const Surface< Model::dim >& surface ) const
166+ {
167+ const auto & mesh = surface.mesh ();
168+ if ( !mesh.are_edges_enabled () )
169+ {
170+ mesh.enable_edges ();
171+ enabled_edges_surfaces_.emplace ( surface.id () );
172+ }
173+ }
174+
118175 template class opengeode_inspector_inspector_api
119176 ComponentMeshesDegeneration< Section >;
120177 template class opengeode_inspector_inspector_api
0 commit comments