Skip to content
This repository was archived by the owner on Jul 14, 2022. It is now read-only.

Commit 62a923e

Browse files
mclarsencyrush
andauthored
adding mesh quality (#218)
* adding mesh quality * make it explicit Co-authored-by: Cyrus Harrison <cyrush@llnl.gov>
1 parent 5535b28 commit 62a923e

File tree

10 files changed

+253
-0
lines changed

10 files changed

+253
-0
lines changed

src/tests/vtkh/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ set(BASIC_TESTS t_vtk-h_smoke
6868
t_vtk-h_threshold
6969
t_vtk-h_point_transform
7070
t_vtk-h_mesh_renderer
71+
t_vtk-h_mesh_quality
7172
t_vtk-h_multi_render
7273
t_vtk-h_point_renderer
7374
t_vtk-h_raytracer
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
//-----------------------------------------------------------------------------
2+
///
3+
/// file: t_vtk-h_dataset.cpp
4+
///
5+
//-----------------------------------------------------------------------------
6+
7+
#include "gtest/gtest.h"
8+
9+
#include <vtkh/vtkh.hpp>
10+
#include <vtkh/DataSet.hpp>
11+
#include <vtkh/filters/MeshQuality.hpp>
12+
#include <vtkh/rendering/RayTracer.hpp>
13+
#include <vtkh/rendering/Scene.hpp>
14+
#include <vtkm/cont/testing/MakeTestDataSet.h>
15+
16+
17+
#include <iostream>
18+
19+
20+
21+
//----------------------------------------------------------------------------
22+
TEST(vtkh_mesh_quality, vtkh_volume)
23+
{
24+
vtkh::DataSet data_set;
25+
26+
const int base_size = 32;
27+
const int num_blocks = 2;
28+
29+
vtkm::cont::testing::MakeTestDataSet maker;
30+
data_set.AddDomain(maker.Make3DExplicitDataSet5(),0);
31+
32+
vtkh::MeshQuality quali;
33+
quali.SetInput(&data_set);
34+
quali.AddMapField("point_data_Float64");
35+
quali.AddMapField("cell_data_Float64");
36+
quali.Update();
37+
38+
vtkh::DataSet *q_output = quali.GetOutput();
39+
40+
vtkm::Bounds bounds = q_output->GetGlobalBounds();
41+
float bg_color[4] = { 0.f, 0.f, 0.f, 1.f};
42+
vtkm::rendering::Camera camera;
43+
camera.ResetToBounds(bounds);
44+
vtkh::Render render = vtkh::MakeRender(512,
45+
512,
46+
camera,
47+
*q_output,
48+
"mesh_volume",
49+
bg_color);
50+
vtkh::RayTracer tracer;
51+
tracer.SetInput(q_output);
52+
tracer.SetField("volume");
53+
54+
vtkh::Scene scene;
55+
scene.AddRenderer(&tracer);
56+
scene.AddRender(render);
57+
scene.Render();
58+
59+
delete q_output;
60+
}
61+
62+
//----------------------------------------------------------------------------
63+
TEST(vtkh_mesh_quality, vtkh_not_supported)
64+
{
65+
vtkh::DataSet data_set;
66+
67+
const int base_size = 32;
68+
const int num_blocks = 2;
69+
70+
vtkm::cont::testing::MakeTestDataSet maker;
71+
data_set.AddDomain(maker.Make3DExplicitDataSet5(),0);
72+
data_set.AddDomain(maker.Make3DUniformDataSet0(),1);
73+
74+
vtkh::MeshQuality quali;
75+
quali.SetInput(&data_set);
76+
quali.AddMapField("point_data_Float64");
77+
quali.AddMapField("cell_data_Float64");
78+
bool threw = false;
79+
try
80+
{
81+
quali.Update();
82+
}
83+
catch(...)
84+
{
85+
threw = true;
86+
}
87+
EXPECT_TRUE(threw);
88+
}

src/vtkh/DataSet.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,30 @@ DataSet::IsPointMesh() const
560560
return is_points;
561561
}
562562

563+
bool
564+
DataSet::IsUnstructured() const
565+
{
566+
bool is_unstructured = true;
567+
const size_t num_domains = m_domains.size();
568+
for(size_t i = 0; i < num_domains; ++i)
569+
{
570+
const vtkm::cont::DataSet &dom = m_domains[i];
571+
int dims;
572+
is_unstructured = !VTKMDataSetInfo::IsStructured(dom, dims) && is_unstructured;
573+
574+
(void) dims;
575+
576+
if(!is_unstructured)
577+
{
578+
break;
579+
}
580+
}
581+
582+
is_unstructured = detail::GlobalAgreement(is_unstructured);
583+
584+
return is_unstructured;
585+
}
586+
563587
bool
564588
DataSet::IsStructured(int &topological_dims) const
565589
{

src/vtkh/DataSet.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,9 @@ class VTKH_API DataSet
100100
*/
101101
bool IsStructured(int &topological_dims) const;
102102

103+
// returns true if every single domain is unstructrued
104+
bool IsUnstructured() const;
105+
103106
bool IsPointMesh() const;
104107

105108
void PrintSummary(std::ostream &stream) const;

src/vtkh/filters/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ set(vtkh_filters_headers
1818
NoOp.hpp
1919
Lagrangian.hpp
2020
MarchingCubes.hpp
21+
MeshQuality.hpp
2122
ParticleAdvection.hpp
2223
ParticleMerging.hpp
2324
PointAverage.hpp
@@ -53,6 +54,7 @@ set(vtkh_filters_sources
5354
NoOp.cpp
5455
Lagrangian.cpp
5556
MarchingCubes.cpp
57+
MeshQuality.cpp
5658
ParticleAdvection.cpp
5759
ParticleMerging.cpp
5860
PointAverage.cpp

src/vtkh/filters/MeshQuality.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#include <vtkh/filters/MeshQuality.hpp>
2+
#include <vtkh/vtkm_filters/vtkmMeshQuality.hpp>
3+
#include <vtkh/vtkm_filters/vtkmCleanGrid.hpp>
4+
#include <vtkh/Error.hpp>
5+
6+
namespace vtkh
7+
{
8+
9+
MeshQuality::MeshQuality()
10+
: m_metric(vtkm::filter::CellMetric::VOLUME)
11+
{
12+
13+
}
14+
15+
MeshQuality::~MeshQuality()
16+
{
17+
18+
}
19+
20+
void MeshQuality::cell_metric(vtkm::filter::CellMetric metric)
21+
{
22+
m_metric = metric;
23+
}
24+
25+
void MeshQuality::PreExecute()
26+
{
27+
Filter::PreExecute();
28+
if(!m_input->IsUnstructured())
29+
{
30+
throw Error("Mesh quality requires that meshes be completely unstructured");
31+
}
32+
}
33+
34+
void MeshQuality::PostExecute()
35+
{
36+
Filter::PostExecute();
37+
}
38+
39+
void MeshQuality::DoExecute()
40+
{
41+
this->m_output = new DataSet();
42+
const int num_domains = this->m_input->GetNumberOfDomains();
43+
44+
for(int i = 0; i < num_domains; ++i)
45+
{
46+
vtkm::Id domain_id;
47+
vtkm::cont::DataSet dom;
48+
this->m_input->GetDomain(i, dom, domain_id);
49+
50+
// force this to an fully explicit data set because
51+
// old vtkm was not handling this
52+
vtkh::vtkmCleanGrid cleaner;
53+
auto dataset = cleaner.Run(dom, this->GetFieldSelection());
54+
55+
vtkmMeshQuality quali;
56+
vtkm::cont::DataSet res = quali.Run(dataset, m_metric, this->GetFieldSelection());
57+
m_output->AddDomain(res, domain_id);
58+
}
59+
}
60+
61+
std::string
62+
MeshQuality::GetName() const
63+
{
64+
return "vtkh::MeshQuality";
65+
}
66+
67+
} // namespace vtkh

src/vtkh/filters/MeshQuality.hpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#ifndef VTK_H_MESH_QUALITY_HPP
2+
#define VTK_H_MESH_QUALITY_HPP
3+
4+
#include <vtkh/vtkh_exports.h>
5+
#include <vtkh/vtkh.hpp>
6+
#include <vtkh/filters/Filter.hpp>
7+
#include <vtkh/DataSet.hpp>
8+
#include <vtkm/filter/MeshQuality.h>
9+
10+
namespace vtkh
11+
{
12+
13+
class VTKH_API MeshQuality: public Filter
14+
{
15+
public:
16+
MeshQuality();
17+
virtual ~MeshQuality();
18+
std::string GetName() const override;
19+
20+
void cell_metric(vtkm::filter::CellMetric metric);
21+
22+
protected:
23+
void PreExecute() override;
24+
void PostExecute() override;
25+
void DoExecute() override;
26+
vtkm::filter::CellMetric m_metric;
27+
};
28+
29+
} //namespace vtkh
30+
#endif

src/vtkh/vtkm_filters/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ set(vtkm_filters_headers
1111
vtkmGradient.hpp
1212
vtkmLagrangian.hpp
1313
vtkmMarchingCubes.hpp
14+
vtkmMeshQuality.hpp
1415
vtkmPointAverage.hpp
1516
vtkmPointTransform.hpp
1617
vtkmTetrahedralize.hpp
@@ -29,6 +30,7 @@ set(vtkm_filters_sources
2930
vtkmGradient.cpp
3031
vtkmLagrangian.cpp
3132
vtkmMarchingCubes.cpp
33+
vtkmMeshQuality.cpp
3234
vtkmPointAverage.cpp
3335
vtkmPointTransform.cpp
3436
vtkmTetrahedralize.cpp
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#include "vtkmMeshQuality.hpp"
2+
3+
namespace vtkh
4+
{
5+
6+
vtkm::cont::DataSet vtkmMeshQuality::Run(vtkm::cont::DataSet &input,
7+
vtkm::filter::CellMetric metric,
8+
vtkm::filter::FieldSelection map_fields)
9+
10+
{
11+
vtkm::filter::MeshQuality quali(metric);
12+
quali.SetFieldsToPass(map_fields);
13+
auto output = quali.Execute(input);
14+
return output;
15+
}
16+
17+
} // namespace vtkh
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#ifndef VTK_H_VTKM_MESH_QUALITY_HPP
2+
#define VTK_H_VTKM_MESH_QUALITY_HPP
3+
4+
#include <vtkm/cont/DataSet.h>
5+
#include <vtkm/filter/FieldSelection.h>
6+
#include <vtkm/filter/MeshQuality.h>
7+
8+
namespace vtkh
9+
{
10+
11+
class vtkmMeshQuality
12+
{
13+
public:
14+
vtkm::cont::DataSet Run(vtkm::cont::DataSet &input,
15+
vtkm::filter::CellMetric metric,
16+
vtkm::filter::FieldSelection map_fields);
17+
};
18+
}
19+
#endif

0 commit comments

Comments
 (0)