22 if (hmi.
type == MeshType::TRI || hmi.
type == MeshType::QUA || hmi.
type == MeshType::H_SUR)
24 std::vector<std::tuple<uint32_t, uint32_t, uint32_t, uint32_t>> temp;
25 temp.reserve(hmi.
faces.size() * 3);
26 for (uint32_t i = 0; i < hmi.
faces.size(); ++i)
28 int vn = hmi.
faces[i].vs.size();
29 for (uint32_t j = 0; j < vn; ++j)
31 uint32_t v0 = hmi.
faces[i].vs[j], v1 = hmi.
faces[i].vs[(j + 1) % vn];
34 temp.push_back(std::make_tuple(v0, v1, i, j));
36 hmi.
faces[i].es.resize(vn);
38 std::sort(temp.begin(), temp.end());
39 hmi.
edges.reserve(temp.size() / 2);
44 for (uint32_t i = 0; i < temp.size(); ++i)
46 if (i == 0 || (i != 0 && (std::get<0>(temp[i]) != std::get<0>(temp[i - 1]) || std::get<1>(temp[i]) != std::get<1>(temp[i - 1]))))
50 e.vs[0] = std::get<0>(temp[i]);
51 e.vs[1] = std::get<1>(temp[i]);
52 hmi.
edges.push_back(e);
54 else if (i != 0 && (std::get<0>(temp[i]) == std::get<0>(temp[i - 1]) && std::get<1>(temp[i]) == std::get<1>(temp[i - 1])))
55 hmi.
edges[E_num - 1].boundary =
false;
57 hmi.
faces[std::get<2>(temp[i])].es[std::get<3>(temp[i])] = E_num - 1;
62 for (uint32_t i = 0; i < hmi.
edges.size(); ++i)
63 if (hmi.
edges[i].boundary)
68 else if (hmi.
type == MeshType::HEX)
71 std::vector<std::vector<uint32_t>> total_fs(hmi.
elements.size() * 6);
72 std::vector<std::tuple<uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t>> tempF(hmi.
elements.size() * 6);
73 std::vector<uint32_t> vs(4);
74 for (uint32_t i = 0; i < hmi.
elements.size(); ++i)
76 for (
short j = 0; j < 6; j++)
78 for (
short k = 0; k < 4; k++)
80 uint32_t
id = 6 * i + j;
82 std::sort(vs.begin(), vs.end());
83 tempF[id] = std::make_tuple(vs[0], vs[1], vs[2], vs[3],
id, i, j);
87 std::sort(tempF.begin(), tempF.end());
88 hmi.
faces.reserve(tempF.size() / 3);
92 for (uint32_t i = 0; i < tempF.size(); ++i)
94 if (i == 0 || (i != 0 && (std::get<0>(tempF[i]) != std::get<0>(tempF[i - 1]) || std::get<1>(tempF[i]) != std::get<1>(tempF[i - 1]) || std::get<2>(tempF[i]) != std::get<2>(tempF[i - 1]) || std::get<3>(tempF[i]) != std::get<3>(tempF[i - 1]))))
98 f.vs = total_fs[std::get<4>(tempF[i])];
99 hmi.
faces.push_back(f);
101 else if (i != 0 && (std::get<0>(tempF[i]) == std::get<0>(tempF[i - 1]) && std::get<1>(tempF[i]) == std::get<1>(tempF[i - 1]) && std::get<2>(tempF[i]) == std::get<2>(tempF[i - 1]) && std::get<3>(tempF[i]) == std::get<3>(tempF[i - 1])))
102 hmi.
faces[F_num - 1].boundary =
false;
104 hmi.
elements[std::get<5>(tempF[i])].fs[std::get<6>(tempF[i])] = F_num - 1;
107 std::vector<std::tuple<uint32_t, uint32_t, uint32_t, uint32_t>> temp(hmi.
faces.size() * 4);
108 for (uint32_t i = 0; i < hmi.
faces.size(); ++i)
110 for (uint32_t j = 0; j < 4; ++j)
112 uint32_t v0 = hmi.
faces[i].vs[j], v1 = hmi.
faces[i].vs[(j + 1) % 4];
115 temp[4 * i + j] = std::make_tuple(v0, v1, i, j);
117 hmi.
faces[i].es.resize(4);
119 std::sort(temp.begin(), temp.end());
120 hmi.
edges.reserve(temp.size() / 2);
125 for (uint32_t i = 0; i < temp.size(); ++i)
127 if (i == 0 || (i != 0 && (std::get<0>(temp[i]) != std::get<0>(temp[i - 1]) || std::get<1>(temp[i]) != std::get<1>(temp[i - 1]))))
131 e.vs[0] = std::get<0>(temp[i]);
132 e.vs[1] = std::get<1>(temp[i]);
133 hmi.
edges.push_back(e);
135 hmi.
faces[std::get<2>(temp[i])].es[std::get<3>(temp[i])] = E_num - 1;
140 for (uint32_t i = 0; i < hmi.
faces.size(); ++i)
141 if (hmi.
faces[i].boundary)
142 for (uint32_t j = 0; j < 4; ++j)
144 uint32_t eid = hmi.
faces[i].es[j];
145 hmi.
edges[eid].boundary =
true;
149 else if (hmi.
type == MeshType::HYB || hmi.
type == MeshType::TET)
151 vector<bool> bf_flag(hmi.
faces.size(),
false);
154 bf_flag[f] = !bf_flag[f];
155 for (
auto &f : hmi.
faces)
156 f.boundary = bf_flag[f.id];
158 std::vector<std::tuple<uint32_t, uint32_t, uint32_t, uint32_t>> temp;
159 for (uint32_t i = 0; i < hmi.
faces.size(); ++i)
161 int fl = hmi.
faces[i].vs.size();
162 for (uint32_t j = 0; j < hmi.
faces[i].vs.size(); ++j)
164 uint32_t v0 = hmi.
faces[i].vs[j], v1 = hmi.
faces[i].vs[(j + 1) % fl];
167 temp.push_back(std::make_tuple(v0, v1, i, j));
169 hmi.
faces[i].es.resize(fl);
171 std::sort(temp.begin(), temp.end());
172 hmi.
edges.reserve(temp.size() / 2);
177 for (uint32_t i = 0; i < temp.size(); ++i)
179 if (i == 0 || (i != 0 && (std::get<0>(temp[i]) != std::get<0>(temp[i - 1]) || std::get<1>(temp[i]) != std::get<1>(temp[i - 1]))))
183 e.vs[0] = std::get<0>(temp[i]);
184 e.vs[1] = std::get<1>(temp[i]);
185 hmi.
edges.push_back(e);
187 hmi.
faces[std::get<2>(temp[i])].es[std::get<3>(temp[i])] = E_num - 1;
192 for (uint32_t i = 0; i < hmi.
faces.size(); ++i)
193 if (hmi.
faces[i].boundary)
194 for (uint32_t j = 0; j < hmi.
faces[i].vs.size(); ++j)
196 uint32_t eid = hmi.
faces[i].es[j];
197 hmi.
edges[eid].boundary =
true;
202 for (
auto &f : hmi.
faces)
203 f.neighbor_hs.clear();
204 for (uint32_t i = 0; i < hmi.
elements.size(); i++)
206 for (uint32_t j = 0; j < hmi.
elements[i].fs.size(); j++)
212 for (
auto &e : hmi.
edges)
213 e.neighbor_fs.clear();
215 v.neighbor_fs.clear();
216 for (uint32_t i = 0; i < hmi.
faces.size(); i++)
218 for (uint32_t j = 0; j < hmi.
faces[i].es.size(); j++)
219 hmi.
edges[hmi.
faces[i].es[j]].neighbor_fs.push_back(i);
220 for (uint32_t j = 0; j < hmi.
faces[i].vs.size(); j++)
226 v.neighbor_es.clear();
227 v.neighbor_vs.clear();
229 for (uint32_t i = 0; i < hmi.
edges.size(); i++)
231 uint32_t v0 = hmi.
edges[i].vs[0], v1 = hmi.
edges[i].vs[1];
232 hmi.
vertices[v0].neighbor_es.push_back(i);
233 hmi.
vertices[v1].neighbor_es.push_back(i);
234 hmi.
vertices[v0].neighbor_vs.push_back(v1);
235 hmi.
vertices[v1].neighbor_vs.push_back(v0);
238 for (
auto &e : hmi.
edges)
239 e.neighbor_hs.clear();
242 for (uint32_t i = 0; i < hmi.
edges.size(); i++)
244 std::vector<uint32_t> nhs;
245 for (uint32_t j = 0; j < hmi.
edges[i].neighbor_fs.size(); j++)
247 uint32_t nfid = hmi.
edges[i].neighbor_fs[j];
248 nhs.insert(nhs.end(), hmi.
faces[nfid].neighbor_hs.begin(), hmi.
faces[nfid].neighbor_hs.end());
250 std::sort(nhs.begin(), nhs.end());
251 nhs.erase(std::unique(nhs.begin(), nhs.end()), nhs.end());
252 hmi.
edges[i].neighbor_hs = nhs;
253 for (
auto nhid : nhs)
257 if (hmi.
type != MeshType::HYB && hmi.
type != MeshType::TET)
261 v.neighbor_hs.clear();
262 for (uint32_t i = 0; i < hmi.
elements.size(); i++)
266 vs.insert(vs.end(), hmi.
faces[fid].vs.begin(), hmi.
faces[fid].vs.end());
267 sort(vs.begin(), vs.end());
268 vs.erase(unique(vs.begin(), vs.end()), vs.end());
274 for (
auto nvid : hmi.
vertices[vid].neighbor_vs)
275 if (
find(vs.begin(), vs.end(), nvid) != vs.end())
284 if (hmi.
elements[i].hex && (vs.size() != 8 || !degree3))
291 int top_fid = hmi.
elements[i].fs[0];
294 std::set<uint32_t> s_model(vs.begin(), vs.end());
295 std::set<uint32_t> s_pattern(hmi.
faces[top_fid].vs.begin(), hmi.
faces[top_fid].vs.end());
296 vector<uint32_t> vs_left;
297 std::set_difference(s_model.begin(), s_model.end(), s_pattern.begin(), s_pattern.end(), std::back_inserter(vs_left));
299 for (
auto vid : hmi.
faces[top_fid].vs)
300 for (
auto nvid : hmi.
vertices[vid].neighbor_vs)
301 if (
find(vs_left.begin(), vs_left.end(), nvid) != vs_left.end())
307 function<int(vector<uint32_t> &,
int &)> WHICH_F = [&](vector<uint32_t> &vs0,
int &f_flag) ->
int {
309 sort(vs0.begin(), vs0.end());
310 bool found_f =
false;
311 for (uint32_t j = 0; j < hmi.
elements[i].fs.size(); j++)
314 vector<uint32_t> vs1 = hmi.
faces[fid].vs;
315 sort(vs1.begin(), vs1.end());
316 if (vs0.size() == vs1.size() && std::equal(vs0.begin(), vs0.end(), vs1.begin()))
318 f_flag = hmi.
elements[i].fs_flag[j];
327 vector<bool> fs_flag;
328 fs_flag.push_back(hmi.
elements[i].fs_flag[0]);
329 fs.push_back(top_fid);
330 vector<uint32_t> vs_temp;
332 vs_temp.insert(vs_temp.end(), hmi.
elements[i].vs.begin() + 4, hmi.
elements[i].vs.end());
334 int bottom_fid = WHICH_F(vs_temp, f_flag);
335 fs_flag.push_back(f_flag);
336 fs.push_back(bottom_fid);
339 vs_temp.push_back(hmi.
elements[i].vs[0]);
340 vs_temp.push_back(hmi.
elements[i].vs[1]);
341 vs_temp.push_back(hmi.
elements[i].vs[4]);
342 vs_temp.push_back(hmi.
elements[i].vs[5]);
344 int front_fid = WHICH_F(vs_temp, f_flag);
345 fs_flag.push_back(f_flag);
346 fs.push_back(front_fid);
349 vs_temp.push_back(hmi.
elements[i].vs[2]);
350 vs_temp.push_back(hmi.
elements[i].vs[3]);
351 vs_temp.push_back(hmi.
elements[i].vs[6]);
352 vs_temp.push_back(hmi.
elements[i].vs[7]);
354 int back_fid = WHICH_F(vs_temp, f_flag);
355 fs_flag.push_back(f_flag);
356 fs.push_back(back_fid);
359 vs_temp.push_back(hmi.
elements[i].vs[1]);
360 vs_temp.push_back(hmi.
elements[i].vs[2]);
361 vs_temp.push_back(hmi.
elements[i].vs[5]);
362 vs_temp.push_back(hmi.
elements[i].vs[6]);
364 int left_fid = WHICH_F(vs_temp, f_flag);
365 fs_flag.push_back(f_flag);
366 fs.push_back(left_fid);
369 vs_temp.push_back(hmi.
elements[i].vs[3]);
370 vs_temp.push_back(hmi.
elements[i].vs[0]);
371 vs_temp.push_back(hmi.
elements[i].vs[7]);
372 vs_temp.push_back(hmi.
elements[i].vs[4]);
374 int right_fid = WHICH_F(vs_temp, f_flag);
375 fs_flag.push_back(f_flag);
376 fs.push_back(right_fid);
383 for (uint32_t j = 0; j < hmi.
elements[i].vs.size(); j++)
387 if (hmi.
type == MeshType::TET)
389 hmi.
EV.resize(2, hmi.
edges.size());
390 for (
const auto &e : hmi.
edges)
392 hmi.
EV(0, e.id) = e.vs[0];
393 hmi.
EV(1, e.id) = e.vs[1];
395 hmi.
FV.resize(3, hmi.
faces.size());
396 hmi.
FE.resize(3, hmi.
faces.size());
397 hmi.
FH.resize(2, hmi.
faces.size());
398 hmi.
FHi.resize(2, hmi.
faces.size());
399 for (
const auto &f : hmi.
faces)
401 hmi.
FV(0, f.id) = f.vs[0];
402 hmi.
FV(1, f.id) = f.vs[1];
403 hmi.
FV(2, f.id) = f.vs[2];
405 hmi.
FE(0, f.id) = f.es[0];
406 hmi.
FE(1, f.id) = f.es[1];
407 hmi.
FE(2, f.id) = f.es[2];
409 hmi.
FH(0, f.id) = f.neighbor_hs[0];
410 for (
int i = 0; i < hmi.
elements[f.neighbor_hs[0]].fs.size(); i++)
411 if (f.id == hmi.
elements[f.neighbor_hs[0]].fs[i])
412 hmi.
FHi(0, f.id) = i;
414 hmi.
FH(1, f.id) = -1;
415 hmi.
FHi(1, f.id) = -1;
416 if (f.neighbor_hs.size() == 2)
418 hmi.
FH(1, f.id) = f.neighbor_hs[1];
419 for (
int i = 0; i < hmi.
elements[f.neighbor_hs[1]].fs.size(); i++)
420 if (f.id == hmi.
elements[f.neighbor_hs[1]].fs[i])
421 hmi.
FHi(1, f.id) = i;
428 hmi.
HV(0, h.id) = h.vs[0];
429 hmi.
HV(1, h.id) = h.vs[1];
430 hmi.
HV(2, h.id) = h.vs[2];
431 hmi.
HV(3, h.id) = h.vs[3];
433 hmi.
HF(0, h.id) = h.fs[0];
434 hmi.
HF(1, h.id) = h.fs[1];
435 hmi.
HF(2, h.id) = h.fs[2];
436 hmi.
HF(3, h.id) = h.fs[3];
441 std::vector<bool> bv_flag(hmi.
vertices.size(),
false), be_flag(hmi.
edges.size(),
false), bf_flag(hmi.
faces.size(),
false);
442 for (
auto f : hmi.
faces)
443 if (f.boundary && hmi.
elements[f.neighbor_hs[0]].hex)
444 bf_flag[f.id] =
true;
445 else if (!f.boundary)
447 int ele0 = f.neighbor_hs[0], ele1 = f.neighbor_hs[1];
449 bf_flag[f.id] =
true;
451 for (uint32_t i = 0; i < hmi.
faces.size(); ++i)
453 for (uint32_t j = 0; j < hmi.
faces[i].vs.size(); ++j)
455 uint32_t eid = hmi.
faces[i].es[j];
457 bv_flag[hmi.
faces[i].vs[j]] =
true;
461 v.boundary_hex =
false;
462 for (
auto &e : hmi.
edges)
463 e.boundary_hex =
false;
464 for (
auto &f : hmi.
faces)
465 f.boundary_hex = bf_flag[f.id];
469 for (
auto vid : ele.vs)
474 for (
auto nfid : hmi.
vertices[vid].neighbor_fs)
475 if (bf_flag[nfid] && std::find(ele.fs.begin(), ele.fs.end(), nfid) != ele.fs.end())
478 hmi.
vertices[vid].boundary_hex =
true;
480 for (
auto eid : ele.es)
485 for (
auto nfid : hmi.
edges[eid].neighbor_fs)
486 if (bf_flag[nfid] && std::find(ele.fs.begin(), ele.fs.end(), nfid) != ele.fs.end())
489 hmi.
edges[eid].boundary_hex =
true;
714 for (
int i = 0; i < iter; i++)
717 std::vector<int> Refinement_Levels;
721 M_.
type = MeshType::HYB;
723 vector<int> E2V(M.edges.size()), F2V(M.faces.size()), Ele2V(M.elements.size());
726 for (
auto v : M.vertices)
731 for (
int j = 0; j < 3; j++)
732 v_.
v[j] = M.points(j, v.id);
736 for (
auto e : M.edges)
744 for (
auto vid : e.vs)
745 center += M.points.col(vid);
746 center /= e.vs.size();
747 for (
int j = 0; j < 3; j++)
753 for (
auto f : M.faces)
761 for (
auto vid : f.vs)
762 center += M.points.col(vid);
763 center /= f.vs.size();
764 for (
int j = 0; j < 3; j++)
770 for (
auto ele : M.elements)
776 v.
v = ele.v_in_Kernel;
779 Ele2V[ele.id] = v.
id;
782 std::vector<std::vector<uint32_t>> total_fs;
783 total_fs.reserve(M.elements.size() * 8 * 6);
784 std::vector<std::tuple<uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t>> tempF;
785 tempF.reserve(M.elements.size() * 8 * 6);
786 std::vector<uint32_t> vs(4);
788 int elen = 0, fn = 0;
789 for (
auto ele : M.elements)
793 for (
auto vid : ele.vs)
796 vector<int> top_vs(4);
799 for (
auto nfid : M.vertices[vid].neighbor_fs)
800 if (
find(ele.fs.begin(), ele.fs.end(), nfid) != ele.fs.end())
806 top_vs[2] = F2V[fid];
808 int v_ind =
find(M.faces[fid].vs.begin(), M.faces[fid].vs.end(), vid) - M.faces[fid].vs.begin();
809 int e_pre = M.faces[fid].es[(v_ind - 1 + 4) % 4];
810 int e_aft = M.faces[fid].es[v_ind];
811 top_vs[1] = E2V[e_pre];
812 top_vs[3] = E2V[e_aft];
814 vector<int> bottom_vs(4);
816 auto nvs = M.vertices[vid].neighbor_vs;
818 for (
auto nvid : nvs)
819 if (
find(ele.vs.begin(), ele.vs.end(), nvid) != ele.vs.end())
821 if (nvid != M.edges[e_pre].vs[0] && nvid != M.edges[e_pre].vs[1] && nvid != M.edges[e_aft].vs[0] && nvid != M.edges[e_aft].vs[1])
823 vector<uint32_t> sharedes, es0 = M.vertices[vid].neighbor_es, es1 = M.vertices[nvid].neighbor_es;
824 sort(es0.begin(), es0.end());
825 sort(es1.begin(), es1.end());
826 set_intersection(es0.begin(), es0.end(), es1.begin(), es1.end(), back_inserter(sharedes));
827 assert(sharedes.size());
834 bottom_vs[0] = E2V[e_per];
835 bottom_vs[2] = Ele2V[ele.id];
838 vector<uint32_t> sharedfs, fs0 = M.edges[e_pre].neighbor_fs, fs1 = M.edges[e_per].neighbor_fs;
839 sort(fs0.begin(), fs0.end());
840 sort(fs1.begin(), fs1.end());
841 set_intersection(fs0.begin(), fs0.end(), fs1.begin(), fs1.end(), back_inserter(sharedfs));
842 for (
auto sfid : sharedfs)
843 if (
find(ele.fs.begin(), ele.fs.end(), sfid) != ele.fs.end())
852 fs0 = M.edges[e_aft].neighbor_fs;
853 fs1 = M.edges[e_per].neighbor_fs;
854 sort(fs0.begin(), fs0.end());
855 sort(fs1.begin(), fs1.end());
856 set_intersection(fs0.begin(), fs0.end(), fs1.begin(), fs1.end(), back_inserter(sharedfs));
857 for (
auto sfid : sharedfs)
858 if (
find(ele.fs.begin(), ele.fs.end(), sfid) != ele.fs.end())
865 bottom_vs[1] = F2V[f_pre];
866 bottom_vs[3] = F2V[f_aft];
868 vector<int> ele_vs = top_vs;
869 ele_vs.insert(ele_vs.end(), bottom_vs.begin(), bottom_vs.end());
871 for (
short j = 0; j < 6; j++)
873 for (
short k = 0; k < 4; k++)
875 total_fs.push_back(vs);
876 std::sort(vs.begin(), vs.end());
877 tempF.push_back(std::make_tuple(vs[0], vs[1], vs[2], vs[3], fn++, elen, j));
882 ele_.
fs.resize(6, -1);
890 for (
auto evid : ele_vs)
891 for (
int j = 0; j < 3; j++)
892 center[j] += M_.
vertices[evid].v[j];
893 center /= ele_vs.size();
894 for (
int j = 0; j < 3; j++)
898 Parents.push_back(ele.id);
903 int level = Refinement_Levels[ele.id];
907 std::vector<std::vector<int>> local_V2Vs;
908 std::map<int, int> local_vi_map;
909 for (
auto vid : ele.vs)
911 std::vector<int> v2v;
913 for (
int r = 0; r < level; r++)
919 for (
int j = 0; j < 3; j++)
920 v_.
v[j] = M_.
vertices[vid].v[j] + (ele.v_in_Kernel[j] - M_.
vertices[vid].v[j]) * (r + 1.0) / (
double)(level + 1);
923 for (
int j = 0; j < 3; j++)
924 v_.
v[j] = M_.
vertices[vid].v[j] + (M_.
vertices[vid].v[j] - ele.v_in_Kernel[j]) * (r + 1.0) / (
double)(level + 1);
927 v2v.push_back(v_.
id);
929 local_vi_map[vid] = local_V2Vs.size();
930 local_V2Vs.push_back(v2v);
934 for (
auto fid : ele.fs)
935 es.insert(es.end(), M.faces[fid].es.begin(), M.faces[fid].es.end());
936 sort(es.begin(), es.end());
937 es.erase(unique(es.begin(), es.end()), es.end());
939 std::vector<std::vector<int>> local_E2Vs;
940 std::map<int, int> local_ei_map;
943 std::vector<int> e2v;
944 e2v.push_back(E2V[eid]);
945 for (
int r = 0; r < level; r++)
953 for (
auto vid : M.edges[eid].vs)
954 for (
int j = 0; j < 3; j++)
955 center[j] += M_.
vertices[local_V2Vs[local_vi_map[vid]][r + 1]].v[j];
956 center /= M.edges[eid].vs.size();
957 for (
int j = 0; j < 3; j++)
961 e2v.push_back(v_.
id);
963 local_ei_map[eid] = local_E2Vs.size();
964 local_E2Vs.push_back(e2v);
967 std::vector<std::vector<int>> local_F2Vs;
968 std::map<int, int> local_fi_map;
969 for (
auto fid : ele.fs)
971 std::vector<int> f2v;
972 f2v.push_back(F2V[fid]);
973 for (
int r = 0; r < level; r++)
981 for (
auto vid : M.faces[fid].vs)
982 for (
int j = 0; j < 3; j++)
983 center[j] += M_.
vertices[local_V2Vs[local_vi_map[vid]][r + 1]].v[j];
984 center /= M.faces[fid].vs.size();
985 for (
int j = 0; j < 3; j++)
989 f2v.push_back(v_.
id);
991 local_fi_map[fid] = local_F2Vs.size();
992 local_F2Vs.push_back(f2v);
996 for (
auto fid : ele.fs)
998 auto &fvs = M.faces[fid].vs;
999 auto &fes = M.faces[fid].es;
1000 int fvn = M.faces[fid].vs.size();
1001 for (uint32_t j = 0; j < fvn; j++)
1003 vs[0] = local_E2Vs[local_ei_map[fes[(j - 1 + fvn) % fvn]]][level];
1004 vs[1] = local_V2Vs[local_vi_map[fvs[j]]][level];
1005 vs[2] = local_E2Vs[local_ei_map[fes[j]]][level];
1006 vs[3] = local_F2Vs[local_fi_map[fid]][level];
1010 vs[0] = local_E2Vs[local_ei_map[fes[(j - 1 + fvn) % fvn]]][0];
1011 vs[1] = local_V2Vs[local_vi_map[fvs[j]]][0];
1012 vs[2] = local_E2Vs[local_ei_map[fes[j]]][0];
1013 vs[3] = local_F2Vs[local_fi_map[fid]][0];
1016 total_fs.push_back(vs);
1017 std::sort(vs.begin(), vs.end());
1018 tempF.push_back(std::make_tuple(vs[0], vs[1], vs[2], vs[3], fn++, elen, local_fn++));
1024 ele_.
fs.resize(local_fn, -1);
1025 ele_.
fs_flag.resize(local_fn, 1);
1030 Parents.push_back(ele.id);
1032 for (
int r = 0; r < level; r++)
1034 for (
auto fid : ele.fs)
1036 auto &fvs = M.faces[fid].vs;
1037 auto &fes = M.faces[fid].es;
1038 int fvn = M.faces[fid].vs.size();
1039 for (uint32_t j = 0; j < fvn; j++)
1041 vector<int> ele_vs(8);
1042 ele_vs[0] = local_E2Vs[local_ei_map[fes[(j - 1 + fvn) % fvn]]][r + 1];
1043 ele_vs[1] = local_V2Vs[local_vi_map[fvs[j]]][r + 1];
1044 ele_vs[2] = local_E2Vs[local_ei_map[fes[j]]][r + 1];
1045 ele_vs[3] = local_F2Vs[local_fi_map[fid]][r + 1];
1047 ele_vs[4] = local_E2Vs[local_ei_map[fes[(j - 1 + fvn) % fvn]]][r];
1048 ele_vs[5] = local_V2Vs[local_vi_map[fvs[j]]][r];
1049 ele_vs[6] = local_E2Vs[local_ei_map[fes[j]]][r];
1050 ele_vs[7] = local_F2Vs[local_fi_map[fid]][r];
1053 for (
short j = 0; j < 6; j++)
1055 for (
short k = 0; k < 4; k++)
1057 total_fs.push_back(vs);
1058 std::sort(vs.begin(), vs.end());
1059 tempF.push_back(std::make_tuple(vs[0], vs[1], vs[2], vs[3], fn++, elen, j));
1064 ele_.
fs.resize(6, -1);
1071 for (
auto vid : ele_vs)
1072 for (
int j = 0; j < 3; j++)
1073 center[j] += M_.
vertices[vid].v[j];
1074 center /= ele_vs.size();
1075 for (
int j = 0; j < 3; j++)
1078 Parents.push_back(ele.id);
1085 std::sort(tempF.begin(), tempF.end());
1086 M_.
faces.reserve(tempF.size() / 3);
1090 for (uint32_t i = 0; i < tempF.size(); ++i)
1092 if (i == 0 || (i != 0 && (std::get<0>(tempF[i]) != std::get<0>(tempF[i - 1]) || std::get<1>(tempF[i]) != std::get<1>(tempF[i - 1]) || std::get<2>(tempF[i]) != std::get<2>(tempF[i - 1]) || std::get<3>(tempF[i]) != std::get<3>(tempF[i - 1]))))
1096 f.vs = total_fs[std::get<4>(tempF[i])];
1097 M_.
faces.push_back(f);
1099 else if (i != 0 && (std::get<0>(tempF[i]) == std::get<0>(tempF[i - 1]) && std::get<1>(tempF[i]) == std::get<1>(tempF[i - 1]) && std::get<2>(tempF[i]) == std::get<2>(tempF[i - 1]) && std::get<3>(tempF[i]) == std::get<3>(tempF[i - 1])))
1100 M_.
faces[F_num - 1].boundary =
false;
1102 M_.
elements[std::get<5>(tempF[i])].fs[std::get<6>(tempF[i])] = F_num - 1;
1107 for (
int j = 0; j < 3; j++)
1108 M_.
points(j, v.id) = v.v[j];
1119 for (
int i = 0; i < iter; i++)
1123 M_.
type = MeshType::TET;
1125 vector<int> E2V(M.edges.size());
1128 for (
const auto &v : M.vertices)
1133 for (
int j = 0; j < 3; j++)
1134 v_.
v[j] = M.points(j, v.id);
1138 for (
const auto &e : M.edges)
1146 for (
auto vid : e.vs)
1147 center += M.points.col(vid);
1148 center /= e.vs.size();
1149 for (
int j = 0; j < 3; j++)
1174 auto shared_edge = [&](
int v0,
int v1,
int &e) ->
bool {
1175 auto &es0 = M.vertices[v0].neighbor_es, &es1 = M.vertices[v1].neighbor_es;
1176 std::sort(es0.begin(), es0.end());
1177 std::sort(es1.begin(), es1.end());
1178 std::vector<uint32_t> es;
1179 std::set_intersection(es0.begin(), es0.end(), es1.begin(), es1.end(), back_inserter(es));
1188 std::vector<bool> e_flag(M.edges.size(),
false);
1190 for (
const auto &ele : M.elements)
1193 for (
short i = 0; i < 4; i++)
1197 ele_.
fs.resize(4, -1);
1203 ele_.
vs.push_back(ele.vs[i]);
1204 for (
short j = 0; j < 4; j++)
1208 int v0 = ele.vs[i], v1 = ele.vs[j];
1210 if (shared_edge(v0, v1, e))
1211 ele_.
vs.push_back(E2V[e]);
1215 for (
const auto &evid : ele_.
vs)
1216 for (
int j = 0; j < 3; j++)
1217 center[j] += M_.
vertices[evid].v[j];
1218 center /= ele_.
vs.size();
1219 for (
int j = 0; j < 3; j++)
1226 std::vector<int> edges(6);
1227 for (
int i = 0; i < 6; i++)
1231 if (shared_edge(v0, v1, e))
1238 double min_length = std::numeric_limits<double>::max();
1239 for (
int k = 0; k < 3; ++k)
1241 const double length = (Map<const Vector3d>(M_.
vertices[E2V[edges[k]]].v.data()) - Map<const Vector3d>(M_.
vertices[E2V[edges[5 - k]]].v.data())).squaredNorm();
1242 if (length < min_length)
1244 min_length = length;
1248 int lv0 = E2V[edges[diag]], lv1 = E2V[edges[5 - diag]];
1249 e_flag[edges[diag]] =
true;
1250 e_flag[edges[5 - diag]] =
true;
1251 for (
short i = 0; i < 4; i++)
1255 ele_.
fs.resize(4, -1);
1261 ele_.
vs.push_back(lv0);
1262 ele_.
vs.push_back(lv1);
1263 for (
short j = 0; j < 3; j++)
1265 int c_e = M.faces[ele.fs[i]].es[j];
1268 ele_.
vs.push_back(E2V[c_e]);
1272 for (
const auto &evid : ele_.
vs)
1273 for (
int j = 0; j < 3; j++)
1274 center[j] += M_.
vertices[evid].v[j];
1275 center /= ele_.
vs.size();
1276 for (
int j = 0; j < 3; j++)
1281 e_flag[edges[diag]] = e_flag[edges[5 - diag]] =
false;
1286 for (
int j = 0; j < 3; j++)
1287 M_.
points(j, v.id) = v.v[j];
1290 const auto &t = M.elements[0].vs;
1291 Vector3d c0 = M.points.col(t[0]);
1292 Vector3d c1 = M.points.col(t[1]);
1293 Vector3d c2 = M.points.col(t[2]);
1294 Vector3d c3 = M.points.col(t[3]);
1299 c0 = M_.
points.col(ele.vs[0]);
1300 c1 = M_.
points.col(ele.vs[1]);
1301 c2 = M_.
points.col(ele.vs[2]);
1302 c3 = M_.
points.col(ele.vs[3]);
1303 bool sign =
a_jacobian(c0, c1, c2, c3) > 0 ? true :
false;
1305 std::swap(ele.vs[1], ele.vs[3]);
1309 std::vector<std::vector<uint32_t>> total_fs;
1310 total_fs.reserve(M.elements.size() * 4);
1311 std::vector<std::tuple<uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t>> tempF;
1312 tempF.reserve(M.elements.size() * 4);
1313 std::vector<uint32_t> vs(3);
1314 for (
const auto &ele : M_.
elements)
1316 for (
int i = 0; i < 4; i++)
1321 total_fs.push_back(vs);
1322 std::sort(vs.begin(), vs.end());
1323 tempF.push_back(std::make_tuple(vs[0], vs[1], vs[2], ele.id * 4 + i, ele.id, i));
1326 std::sort(tempF.begin(), tempF.end());
1327 M_.
faces.reserve(tempF.size() / 3);
1331 for (uint32_t i = 0; i < tempF.size(); ++i)
1333 if (i == 0 || (i != 0 && (std::get<0>(tempF[i]) != std::get<0>(tempF[i - 1]) || std::get<1>(tempF[i]) != std::get<1>(tempF[i - 1]) || std::get<2>(tempF[i]) != std::get<2>(tempF[i - 1]))))
1337 f.vs = total_fs[std::get<3>(tempF[i])];
1338 M_.
faces.push_back(f);
1340 else if (i != 0 && (std::get<0>(tempF[i]) == std::get<0>(tempF[i - 1]) && std::get<1>(tempF[i]) == std::get<1>(tempF[i - 1]) && std::get<2>(tempF[i]) == std::get<2>(tempF[i - 1])))
1341 M_.
faces[F_num - 1].boundary =
false;
1343 M_.
elements[std::get<4>(tempF[i])].fs[std::get<5>(tempF[i])] = F_num - 1;
1352 double hmin = 10000, hmax = 0, havg = 0;
1353 for (
const auto &e : M.edges)
1355 Eigen::Vector3d v0 = M.points.col(e.vs[0]), v1 = M.points.col(e.vs[1]);
1356 double len = (v0 - v1).norm();
1363 havg /= M.edges.size();
1552 M_sur.
type = MeshType::H_SUR;
1557 M_sur.
points.resize(3, bvn);
1559 vector<int> V_map(hmi.
vertices.size(), -1), V_map_reverse;
1568 V_map[v.id] = v_.
id;
1569 V_map_reverse.push_back(v.id);
1571 for (
auto f : hmi.
faces)
1574 for (
int j = 0; j < f.vs.size(); j++)
1576 f.id = M_sur.
faces.size();
1578 f.neighbor_hs.clear();
1579 f.vs[j] = V_map[f.vs[j]];
1580 M_sur.
vertices[f.vs[j]].neighbor_fs.push_back(f.id);
1582 M_sur.
faces.push_back(f);
1588 for (
auto &f : hmi.
faces)
1591 for (
int j = 0; j < f.vs.size(); j++)
1592 f.vs[j] = V_map_reverse[M_sur.
faces[fn_].vs[j]];
1596 vector<bool> F_tag(hmi.
faces.size(),
true);
1597 std::vector<short> F_visit(hmi.
faces.size(), 0);
1598 for (uint32_t j = 0; j < hmi.
faces.size(); j++)
1599 if (hmi.
faces[j].boundary)
1603 std::vector<bool> F_state(hmi.
faces.size(),
false);
1604 std::vector<bool> P_visit(hmi.
elements.size(),
false);
1607 std::vector<uint32_t> candidates;
1608 for (uint32_t j = 0; j < F_visit.size(); j++)
1609 if (F_visit[j] == 1)
1610 candidates.push_back(j);
1611 if (!candidates.size())
1613 for (
auto ca : candidates)
1615 if (F_visit[ca] == 2)
1617 uint32_t pid = hmi.
faces[ca].neighbor_hs[0];
1619 if (hmi.
faces[ca].neighbor_hs.size() == 2)
1620 pid = hmi.
faces[ca].neighbor_hs[1];
1629 uint32_t start_f = ca;
1630 F_tag[start_f] =
true;
1633 F_state[ca] =
false;
1637 std::queue<uint32_t> pf_temp;
1638 pf_temp.push(start_f);
1639 while (!pf_temp.empty())
1641 uint32_t fid = pf_temp.front();
1643 for (
auto eid : hmi.
faces[fid].es)
1644 for (
auto nfid : hmi.
edges[eid].neighbor_fs)
1649 uint32_t v0 = hmi.
edges[eid].vs[0], v1 = hmi.
edges[eid].vs[1];
1650 int32_t v0_pos = std::find(hmi.
faces[fid].vs.begin(), hmi.
faces[fid].vs.end(), v0) - hmi.
faces[fid].vs.begin();
1651 int32_t v1_pos = std::find(hmi.
faces[fid].vs.begin(), hmi.
faces[fid].vs.end(), v1) - hmi.
faces[fid].vs.begin();
1653 if ((v0_pos + 1) % hmi.
faces[fid].vs.size() != v1_pos)
1656 int32_t v0_pos_ = std::find(hmi.
faces[nfid].vs.begin(), hmi.
faces[nfid].vs.end(), v0) - hmi.
faces[nfid].vs.begin();
1657 int32_t v1_pos_ = std::find(hmi.
faces[nfid].vs.begin(), hmi.
faces[nfid].vs.end(), v1) - hmi.
faces[nfid].vs.begin();
1661 if ((v0_pos_ + 1) % hmi.
faces[nfid].vs.size() == v1_pos_)
1662 F_state[nfid] =
false;
1664 F_state[nfid] =
true;
1666 else if (!F_state[fid])
1668 if ((v0_pos_ + 1) % hmi.
faces[nfid].vs.size() == v1_pos_)
1669 F_state[nfid] =
true;
1671 F_state[nfid] =
false;
1680 P_visit[pid] =
true;
1681 for (uint32_t j = 0; j < fs.size(); j++)
1682 hmi.
elements[pid].fs_flag[j] = F_state[fs[j]];