54 int main(
int argc,
char *argv[])
57 const char *mesh_file =
"../../data/beam-tet.vtk";
60 bool visualization = 1;
63 args.
AddOption(&mesh_file,
"-m",
"--mesh",
66 "Set of attributes to remove from the mesh.");
67 args.
AddOption(&bdr_attr,
"-b",
"--bdr-attr",
68 "Set of attributes to assign to the new boundary elements.");
69 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
71 "Enable or disable GLVis visualization.");
80 Mesh mesh(mesh_file, 0, 0);
85 if (bdr_attr.
Size() == 0)
88 for (
int i=0; i<attr.
Size(); i++)
90 bdr_attr[i] = max_bdr_attr + attr[i];
93 MFEM_VERIFY(attr.
Size() == bdr_attr.
Size(),
94 "Size mismatch in attribute arguments.");
100 for (
int i=0; i<attr.
Size(); i++)
102 marker[attr[i]-1] = 1;
103 attr_inv[attr[i]-1] = i;
107 int num_elements = 0;
108 for (
int e=0; e<mesh.
GetNE(); e++)
111 if (!marker[elem_attr-1]) { num_elements++; }
115 int num_bdr_elements = 0;
118 int e1 = -1, e2 = -1;
125 if (a1 == 0 || a2 == 0)
127 if (a1 == 0 && !marker[a2-1]) { num_bdr_elements++; }
128 else if (a2 == 0 && !marker[a1-1]) { num_bdr_elements++; }
132 if (marker[a1-1] && !marker[a2-1]) { num_bdr_elements++; }
133 else if (!marker[a1-1] && marker[a2-1]) { num_bdr_elements++; }
137 cout <<
"Number of Elements: " << mesh.
GetNE() <<
" -> "
138 << num_elements << endl;
139 cout <<
"Number of Boundary Elements: " << mesh.
GetNBE() <<
" -> "
140 << num_bdr_elements << endl;
146 for (
int v=0; v<mesh.
GetNV(); v++)
152 for (
int e=0; e<mesh.
GetNE(); e++)
156 if (!marker[elem_attr-1])
161 trimmed_mesh.AddElement(nel);
166 for (
int be=0; be<mesh.
GetNBE(); be++)
172 if (!marker[elem_attr-1])
175 trimmed_mesh.AddBdrElement(nbel);
182 int e1 = -1, e2 = -1;
185 int i1 = -1, i2 = -1;
192 if (a1 != 0 && a2 != 0)
194 if (marker[a1-1] && !marker[a2-1])
200 trimmed_mesh.AddBdrElement(bel);
202 else if (!marker[a1-1] && marker[a2-1])
208 trimmed_mesh.AddBdrElement(bel);
213 trimmed_mesh.FinalizeTopology();
214 trimmed_mesh.Finalize();
215 trimmed_mesh.RemoveUnusedVertices();
231 trimmed_mesh.SetCurvature(order, discont, sdim, ordering);
242 for (
int e = 0; e < mesh.
GetNE(); e++)
246 if (!marker[elem_attr-1])
259 ofstream mesh_ofs(
"trimmer.mesh");
260 mesh_ofs.precision(8);
261 trimmed_mesh.Print(mesh_ofs);
269 sol_sock.precision(8);
270 sol_sock <<
"mesh\n" << trimmed_mesh << flush;
Geometry::Type GetGeometryType() const
Ordering::Type GetOrdering() const
Return the ordering method.
int Size() const
Return the logical size of the array.
void SetSubVector(const Array< int > &dofs, const double value)
Set the entries listed in dofs to the given value.
const double * GetVertex(int i) const
Return pointer to vertex i's coordinates.
Class for grid function - Vector with associated FE space.
virtual Element * Duplicate(Mesh *m) const =0
virtual void GetVertices(Array< int > &v) const =0
Returns element's vertices.
int GetNBE() const
Returns number of boundary elements.
void GetElementVDofs(int i, Array< int > &vdofs) const
Returns indexes of degrees of freedom in array dofs for i'th element.
void GetSubVector(const Array< int > &dofs, Vector &elemvect) const
Extract entries listed in dofs to the output Vector elemvect.
int GetNE() const
Returns number of elements.
const Element * GetFace(int i) const
virtual void SetVertices(const int *ind)
Set the indices the element according to the input.
int GetOrder() const
Return the order (polynomial degree) of the FE collection, corresponding to the order/degree returned...
Element * NewElement(int geom)
int GetNumFaces() const
Return the number of faces (3D), edges (2D) or vertices (1D).
int AddVertex(double x, double y=0.0, double z=0.0)
void Parse()
Parse the command-line options. Note that this function expects all the options provided through the ...
T Max() const
Find the maximal element in the array, using the comparison operator < for class T.
int GetAttribute() const
Return element's attribute.
void GetBdrElementAdjacentElement(int bdr_el, int &el, int &info) const
For the given boundary element, bdr_el, return its adjacent element and its info, i...
const Element * GetElement(int i) const
FiniteElementSpace * FESpace()
void PrintUsage(std::ostream &out) const
Print the usage message.
int SpaceDimension() const
void GetFaceElements(int Face, int *Elem1, int *Elem2) const
Array< int > bdr_attributes
A list of all unique boundary attributes used by the Mesh.
void GetFaceInfos(int Face, int *Inf1, int *Inf2) const
Class FiniteElementSpace - responsible for providing FEM view of the mesh, mainly managing the set of...
void AddOption(bool *var, const char *enable_short_name, const char *enable_long_name, const char *disable_short_name, const char *disable_long_name, const char *description, bool required=false)
Add a boolean option and set 'var' to receive the value. Enable/disable tags are used to set the bool...
void SetSize(int nsize)
Change the logical size of the array, keep existing entries.
int GetNV() const
Returns number of vertices. Vertices are only at the corners of elements, where you would expect them...
void PrintOptions(std::ostream &out) const
Print the options.
void SetAttribute(const int attr)
Set element's attribute.
const FiniteElementCollection * FEColl() const
void GetNodes(Vector &node_coord) const
Abstract data type element.
Array< int > attributes
A list of all unique element attributes used by the Mesh.
const Element * GetBdrElement(int i) const
Arbitrary order "L2-conforming" discontinuous finite elements.
double f(const Vector &p)
bool Good() const
Return true if the command line options were parsed successfully.