16int main(
int argc,
char *argv[]) {
24 int surface_side_set = 200;
25 PetscBool flg_vol_block_set;
26 int vol_block_set = 1;
30 double shift[] = {0, 0, 0};
32 int fraction_level = 2;
33 PetscBool squash_bits = PETSC_TRUE;
34 PetscBool set_coords = PETSC_TRUE;
36 int create_surface_side_set = 201;
37 PetscBool flg_create_surface_side_set;
41 double tol[] = {1e-2, 2e-1, 2e-1};
43 PetscBool
debug = PETSC_FALSE;
45 PetscOptionsBegin(PETSC_COMM_WORLD,
"",
"Mesh cut options",
"none");
46 CHKERR PetscOptionsString(
"-my_file",
"mesh file name",
"",
"mesh.h5m",
48 CHKERR PetscOptionsInt(
"-surface_side_set",
"surface side set",
"",
49 surface_side_set, &surface_side_set, PETSC_NULLPTR);
50 CHKERR PetscOptionsInt(
"-vol_block_set",
"volume side set",
"",
51 vol_block_set, &vol_block_set, &flg_vol_block_set);
52 CHKERR PetscOptionsInt(
"-edges_block_set",
"edges block set",
"",
54 CHKERR PetscOptionsInt(
"-vertex_block_set",
"vertex block set",
"",
56 CHKERR PetscOptionsRealArray(
"-shift",
"shift surface by vector",
"", shift,
58 CHKERR PetscOptionsInt(
"-fraction_level",
"fraction of merges merged",
"",
59 fraction_level, &fraction_level, PETSC_NULLPTR);
60 CHKERR PetscOptionsBool(
"-squash_bits",
"true to squash bits at the end",
61 "", squash_bits, &squash_bits, PETSC_NULLPTR);
62 CHKERR PetscOptionsBool(
"-set_coords",
"true to set coords at the end",
"",
63 set_coords, &set_coords, PETSC_NULLPTR);
64 CHKERR PetscOptionsBool(
"-output_vtk",
"if true outout vtk file",
"",
66 CHKERR PetscOptionsInt(
"-create_side_set",
"crete side set",
"",
67 create_surface_side_set, &create_surface_side_set,
68 &flg_create_surface_side_set);
69 CHKERR PetscOptionsInt(
"-nb_ref_cut",
"nb refinements befor cut",
"",
70 nb_ref_cut, &nb_ref_cut, PETSC_NULLPTR);
71 CHKERR PetscOptionsInt(
"-nb_ref_trim",
"nb refinements befor trim",
"",
72 nb_ref_trim, &nb_ref_trim, PETSC_NULLPTR);
73 CHKERR PetscOptionsRealArray(
74 "-tol",
"tolerances tolCut, tolCutClose, tolTrim, tolTrimClose",
"",
75 tol, &nmax_tol, &flg_tol);
76 CHKERR PetscOptionsBool(
"-debug",
"debug (produces many VTK files)",
"",
82 "*** ERROR -my_file (MESH FILE NEEDED)");
84 if (flg_shift && nmax != 3) {
88 if (flg_tol && nmax_tol != 3)
91 moab::Core mb_instance;
92 moab::Interface &moab = mb_instance;
93 ParallelComm *pcomm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
95 pcomm =
new ParallelComm(&moab, PETSC_COMM_WORLD);
139 "Side set not found %d", surface_side_set);
142 Range fixed_edges, corner_nodes;
145 1, fixed_edges,
true);
148 1, fixed_edges,
true);
155 if (flg_vol_block_set) {
161 "Block set %d not found", vol_block_set);
163 CHKERR moab.get_entities_by_dimension(0, 3, tets,
false);
175 auto shift_after_ref = [&]() {
179 for (
int ll = 1; ll != nb_ref_cut + nb_ref_trim + 1; ++ll)
182 nb_ref_cut + nb_ref_trim, mask,
VERBOSE);
188 double def_position[] = {0, 0, 0};
190 CHKERR moab.tag_get_handle(
"POSITION", 3, MB_TYPE_DOUBLE,
th,
191 MB_TAG_CREAT | MB_TAG_SPARSE, def_position);
198 tol[1],
tol[2], fixed_edges, corner_nodes,
206 if (flg_vol_block_set) {
216 for (
int ll = 0; ll != first_bit; ++ll)
219 first_bit - 1, shift_mask,
VERBOSE);
225 CHKERR moab.get_adjacencies(cut_mesh->
getSurface(), 1,
false, surface_edges,
226 moab::Interface::UNION);
228 CHKERR moab.delete_entities(surface_edges);
229 CHKERR moab.delete_entities(surface_verts);
231 if (flg_create_surface_side_set) {
234 create_surface_side_set,
SIDESET))
238 "Warring >>> sideset %d is on the mesh",
239 create_surface_side_set);
245 CHKERR moab.write_file(
"out.h5m");
249 CHKERR moab.create_meshset(MESHSET_SET, meshset);
250 if (flg_vol_block_set) {
254 CHKERR moab.add_entities(meshset, ents);
261 CHKERR moab.write_file(
"out.vtk",
"VTK",
"", &meshset, 1);
262 CHKERR moab.delete_entities(&meshset, 1);
MoFEMErrorCode cutTrimAndMerge(int &first_bit, const int fraction_level, Tag th, const double tol_geometry, const double tol_cut_close, const double tol_trim_close, Range &fixed_edges, Range &corner_nodes, const bool update_meshsets=false, const bool debug=false)
Cut, trim and merge.