static char help[] =
"mesh cutting\n\n";
int main(
int argc,
char *argv[]) {
try {
int surface_side_set = 200;
PetscBool flg_vol_block_set;
int vol_block_set = 1;
PetscBool flg_shift;
double shift[] = {0, 0, 0};
int nmax = 3;
int fraction_level = 2;
PetscBool squash_bits = PETSC_TRUE;
PetscBool set_coords = PETSC_TRUE;
int create_surface_side_set = 201;
PetscBool flg_create_surface_side_set;
int nb_ref_cut = 0;
int nb_ref_trim = 0;
PetscBool flg_tol;
double tol[] = {1e-2, 2e-1, 2e-1};
int nmax_tol = 3;
PetscBool
debug = PETSC_FALSE;
CHKERR PetscOptionsBegin(PETSC_COMM_WORLD,
"",
"Mesh cut options",
"none");
CHKERR PetscOptionsString(
"-my_file",
"mesh file name",
"",
"mesh.h5m",
CHKERR PetscOptionsInt(
"-surface_side_set",
"surface side set",
"",
surface_side_set, &surface_side_set, PETSC_NULL);
CHKERR PetscOptionsInt(
"-vol_block_set",
"volume side set",
"",
vol_block_set, &vol_block_set, &flg_vol_block_set);
CHKERR PetscOptionsInt(
"-edges_block_set",
"edges block set",
"",
CHKERR PetscOptionsInt(
"-vertex_block_set",
"vertex block set",
"",
CHKERR PetscOptionsRealArray(
"-shift",
"shift surface by vector",
"", shift,
&nmax, &flg_shift);
CHKERR PetscOptionsInt(
"-fraction_level",
"fraction of merges merged",
"",
fraction_level, &fraction_level, PETSC_NULL);
CHKERR PetscOptionsBool(
"-squash_bits",
"true to squash bits at the end",
"", squash_bits, &squash_bits, PETSC_NULL);
CHKERR PetscOptionsBool(
"-set_coords",
"true to set coords at the end",
"",
set_coords, &set_coords, PETSC_NULL);
CHKERR PetscOptionsBool(
"-output_vtk",
"if true outout vtk file",
"",
CHKERR PetscOptionsInt(
"-create_side_set",
"crete side set",
"",
create_surface_side_set, &create_surface_side_set,
&flg_create_surface_side_set);
CHKERR PetscOptionsInt(
"-nb_ref_cut",
"nb refinements befor cut",
"",
nb_ref_cut, &nb_ref_cut, PETSC_NULL);
CHKERR PetscOptionsInt(
"-nb_ref_trim",
"nb refinements befor trim",
"",
nb_ref_trim, &nb_ref_trim, PETSC_NULL);
"-tol", "tolerances tolCut, tolCutClose, tolTrim, tolTrimClose", "",
tol, &nmax_tol, &flg_tol);
CHKERR PetscOptionsBool(
"-debug",
"debug (produces many VTK files)",
"",
ierr = PetscOptionsEnd();
"*** ERROR -my_file (MESH FILE NEEDED)");
}
if (flg_shift && nmax != 3) {
}
if (flg_tol && nmax_tol != 3)
moab::Core mb_instance;
moab::Interface &moab = mb_instance;
ParallelComm *pcomm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
if (pcomm == NULL)
pcomm = new ParallelComm(&moab, PETSC_COMM_WORLD);
const char *option;
option = "";
cout << *it << endl;
}
else
"Side set not found %d", surface_side_set);
Range fixed_edges, corner_nodes;
1, fixed_edges, true);
1, fixed_edges, true);
if (flg_vol_block_set) {
3, tets, true);
else
"Block set %d not found", vol_block_set);
} else
CHKERR moab.get_entities_by_dimension(0, 3, tets,
false);
auto shift_after_ref = [&]() {
mask.set(0);
for (int ll = 1; ll != nb_ref_cut + nb_ref_trim + 1; ++ll)
mask.set(ll);
nb_ref_cut + nb_ref_trim, mask,
VERBOSE);
};
double def_position[] = {0, 0, 0};
Tag th;
CHKERR moab.tag_get_handle(
"POSITION", 3, MB_TYPE_DOUBLE, th,
MB_TAG_CREAT | MB_TAG_SPARSE, def_position);
int first_bit = 1;
tol[1],
tol[2], fixed_edges, corner_nodes,
true, false);
if (set_coords)
if (flg_vol_block_set) {
}
if (squash_bits) {
for (int ll = 0; ll != first_bit; ++ll)
shift_mask.set(ll);
first_bit - 1, shift_mask,
VERBOSE);
}
moab::Interface::UNION);
CHKERR moab.delete_entities(surface_edges);
CHKERR moab.delete_entities(surface_verts);
if (flg_create_surface_side_set) {
else
"Warring >>> sideset %d is on the mesh",
create_surface_side_set);
}
CHKERR moab.write_file(
"out.h5m");
CHKERR moab.create_meshset(MESHSET_SET, meshset);
if (flg_vol_block_set) {
ents, true);
CHKERR moab.add_entities(meshset, ents);
} else {
}
CHKERR moab.write_file(
"out.vtk",
"VTK",
"", &meshset, 1);
CHKERR moab.delete_entities(&meshset, 1);
}
}
return 0;
}
#define MOFEM_LOG_C(channel, severity, format,...)
static PetscErrorCode ierr
#define CATCH_ERRORS
Catch errors.
#define MYPCOMM_INDEX
default communicator number PCOMM
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
@ MOFEM_ATOM_TEST_INVALID
@ MOFEM_DATA_INCONSISTENCY
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
MoFEMErrorCode setBitRefLevelByType(const EntityHandle meshset, const EntityType type, const BitRefLevel bit, int verb=QUIET) const
Set the Bit Ref Level By Type object.
MoFEMErrorCode getEntitiesByTypeAndRefLevel(const BitRefLevel bit, const BitRefLevel mask, const EntityType type, const EntityHandle meshset, int verb=0) const
add all ents from ref level given by bit to meshset
MoFEMErrorCode getMeshset(const int ms_id, const unsigned int cubit_bc_type, EntityHandle &meshset) const
get meshset from CUBIT Id and CUBIT type
bool checkMeshset(const int ms_id, const CubitBCType cubit_bc_type) const
check for CUBIT Id and CUBIT type
MoFEMErrorCode addMeshset(const CubitBCType cubit_bc_type, const int ms_id, const std::string name="")
add cubit meshset
MoFEMErrorCode getEntitiesByDimension(const int ms_id, const unsigned int cubit_bc_type, const int dimension, Range &entities, const bool recursive=true) const
get entities from CUBIT/meshset of a particular entity dimension
#define _IT_CUBITMESHSETS_BY_SET_TYPE_FOR_LOOP_(MESHSET_MANAGER, CUBITBCTYPE, IT)
Iterator that loops over a specific Cubit MeshSet having a particular BC meshset in a moFEM field.
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
implementation of Data Operators for Forces and Sources
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
MoFEMErrorCode copySurface(const Range surface, Tag th=NULL, double *shift=NULL, double *origin=NULL, double *transform=NULL, const std::string save_mesh="")
copy surface entities
MoFEMErrorCode setCoords(Tag th, const BitRefLevel bit=BitRefLevel(), const BitRefLevel mask=BitRefLevel().set())
set coords from tag
const Range & getMergedSurfaces() const
MoFEMErrorCode buildTree()
build tree
const Range & getSurface() const
MoFEMErrorCode setVolume(const Range volume)
set volume entities
MoFEMErrorCode setTagData(Tag th, const BitRefLevel bit=BitRefLevel())
set coords to tag
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.
MoFEMErrorCode makeFront(const bool debug=false)
Create front from the surface.
MoFEMErrorCode refineMesh(const int init_bit_level, const int surf_levels, const int front_levels, Range *fixed_edges=nullptr, int verb=QUIET, const bool debug=false)
Refine and set level sets.
Interface for managing meshsets containing materials and boundary conditions.
MoFEMErrorCode addEntitiesToMeshset(const CubitBCType cubit_bc_type, const int ms_id, const Range &ents)
add entities to cubit meshset
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface refernce to pointer of interface.