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.