36 if (
mesh().top_simplex_type() ==
PT) {
41 auto target_edge_length_accessor =
44 const double current_length = edge_length_accessor.const_scalar_attribute(s.
tuple());
45 const double target_length = target_edge_length_accessor.const_scalar_attribute(s.
tuple());
46 const bool mini_edge = current_length <= target_length *
m_eps;
48 double old_energy_max = std::numeric_limits<double>::lowest();
49 double new_energy_max = std::numeric_limits<double>::lowest();
55 const auto v1_pos = position_accessor.const_vector_attribute(v1);
58 const auto& v0_incident_tets =
60 const auto& v1_incident_tets =
64 for (
const auto& t : v1_incident_tets) {
65 const std::array<Tuple, 4> lv = {
73 std::max(old_energy_max, amips_accessor.const_scalar_attribute(t.tuple()));
95 const std::array<Eigen::Vector<Rational, 3>, 4> lv_pos = {
96 {position_accessor.const_vector_attribute(v0),
97 position_accessor.const_vector_attribute(lv[1]),
98 position_accessor.const_vector_attribute(lv[2]),
99 position_accessor.const_vector_attribute(lv[3])}};
118 {{lv_pos[3][0].to_double(),
119 lv_pos[3][1].to_double(),
120 lv_pos[3][2].to_double(),
121 lv_pos[0][0].to_double(),
122 lv_pos[0][1].to_double(),
123 lv_pos[0][2].to_double(),
124 lv_pos[1][0].to_double(),
125 lv_pos[1][1].to_double(),
126 lv_pos[1][2].to_double(),
127 lv_pos[2][0].to_double(),
128 lv_pos[2][1].to_double(),
129 lv_pos[2][2].to_double()}});
132 {{lv_pos[3][0].to_double(),
133 lv_pos[3][1].to_double(),
134 lv_pos[3][2].to_double(),
135 lv_pos[0][0].to_double(),
136 lv_pos[0][1].to_double(),
137 lv_pos[0][2].to_double(),
138 lv_pos[2][0].to_double(),
139 lv_pos[2][1].to_double(),
140 lv_pos[2][2].to_double(),
141 lv_pos[1][0].to_double(),
142 lv_pos[1][1].to_double(),
143 lv_pos[1][2].to_double()}});
145 new_energy_max = std::max(new_energy_max, new_energy);
149 for (int64_t i = 0; i < 3; ++i) {
151 if (!v1_pos[i].is_rounded())
return true;
160 for (
const auto& t : v0_incident_tets) {
161 const std::array<Tuple, 4> lv = {
186 const double energy = amips_accessor.const_scalar_attribute(t.tuple());
187 old_energy_max = std::max(old_energy_max, energy);
190 new_energy_max = std::max(new_energy_max, energy);
198 const auto v0_pos = position_accessor.const_vector_attribute(v0);
201 const auto& v0_incident_tets =
203 const auto& v1_incident_tets =
207 for (
const auto& t : v0_incident_tets) {
208 const std::array<Tuple, 4> lv = {
216 std::max(old_energy_max, amips_accessor.const_scalar_attribute(t.tuple()));
237 const std::array<Eigen::Vector<Rational, 3>, 4> lv_pos = {
238 {position_accessor.const_vector_attribute(v1),
239 position_accessor.const_vector_attribute(lv[1]),
240 position_accessor.const_vector_attribute(lv[2]),
241 position_accessor.const_vector_attribute(lv[3])}};
260 {{lv_pos[3][0].to_double(),
261 lv_pos[3][1].to_double(),
262 lv_pos[3][2].to_double(),
263 lv_pos[0][0].to_double(),
264 lv_pos[0][1].to_double(),
265 lv_pos[0][2].to_double(),
266 lv_pos[1][0].to_double(),
267 lv_pos[1][1].to_double(),
268 lv_pos[1][2].to_double(),
269 lv_pos[2][0].to_double(),
270 lv_pos[2][1].to_double(),
271 lv_pos[2][2].to_double()}});
274 {{lv_pos[3][0].to_double(),
275 lv_pos[3][1].to_double(),
276 lv_pos[3][2].to_double(),
277 lv_pos[0][0].to_double(),
278 lv_pos[0][1].to_double(),
279 lv_pos[0][2].to_double(),
280 lv_pos[2][0].to_double(),
281 lv_pos[2][1].to_double(),
282 lv_pos[2][2].to_double(),
283 lv_pos[1][0].to_double(),
284 lv_pos[1][1].to_double(),
285 lv_pos[1][2].to_double()}});
287 new_energy_max = std::max(new_energy_max, new_energy);
291 for (int64_t i = 0; i < 3; ++i) {
293 if (!v0_pos[i].is_rounded())
return true;
302 for (
const auto& t : v1_incident_tets) {
303 const std::array<Tuple, 4> lv = {
328 const double energy = amips_accessor.const_scalar_attribute(t.tuple());
329 old_energy_max = std::max(old_energy_max, energy);
332 new_energy_max = std::max(new_energy_max, energy);
339 throw std::runtime_error(
"not implemented");
342 default:
throw std::runtime_error(
"Invalid collapse type");
345 return new_energy_max <= old_energy_max;
347 }
else if (
mesh().top_simplex_type() ==
PF) {