39 int main(
int argc,
char *argv[])
41 const char *new_mesh_file =
"klein-bottle.mesh";
47 bool visualization =
true;
50 args.
AddOption(&new_mesh_file,
"-m",
"--mesh-out-file",
51 "Output Mesh file to write.");
52 args.
AddOption(&nx,
"-nx",
"--num-elements-x",
53 "Number of elements in x-direction.");
54 args.
AddOption(&ny,
"-ny",
"--num-elements-y",
55 "Number of elements in y-direction.");
56 args.
AddOption(&order,
"-o",
"--mesh-order",
57 "Order (polynomial degree) of the mesh elements.");
58 args.
AddOption(&trans_type,
"-t",
"--transformation-type",
59 "Set the transformation type: 0 - \"figure-8\","
60 " 1 - \"bottle\", 2 - \"bottle2\".");
61 args.
AddOption(&dg_mesh,
"-dm",
"--discont-mesh",
"-cm",
"--cont-mesh",
62 "Use discontinuous or continuous space for the mesh nodes.");
63 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
65 "Enable or disable GLVis visualization.");
78 mesh =
new Mesh(nx, ny, el_type, 1, 2*M_PI, 2*M_PI);
84 for (
int i = 0; i < v2v.Size(); i++)
89 for (
int i = 0; i <= nx; i++)
91 int v_old = i + ny * (nx + 1);
96 for (
int j = 0; j <= ny; j++)
98 int v_old = nx + j * (nx + 1);
99 int v_new = (ny - j) * (nx + 1);
100 v2v[v_old] = v2v[v_new];
103 for (
int i = 0; i < mesh->
GetNE(); i++)
108 for (
int j = 0; j < nv; j++)
114 for (
int i = 0; i < mesh->
GetNBE(); i++)
119 for (
int j = 0; j < nv; j++)
142 for (
int i = 0; i < nodes.
Size(); i++)
144 if (std::abs(nodes(i)) < 1e-12)
150 ofstream ofs(new_mesh_file);
157 char vishost[] =
"localhost";
160 sol_sock.precision(8);
161 sol_sock <<
"mesh\n" << *mesh << flush;
169 const double r = 2.5;
170 double a = r + cos(x(0)/2) * sin(x(1)) - sin(x(0)/2) * sin(2*x(1));
173 p(0) = a * cos(x(0));
174 p(1) = a * sin(x(0));
175 p(2) = sin(x(0)/2) * sin(x(1)) + cos(x(0)/2) * sin(2*x(1));
181 double v = x(1) + M_PI_2;
182 double a = 6.*cos(u)*(1.+sin(u));
183 double b = 16.*sin(u);
184 double r = 4.*(1.-cos(u)/2.);
188 p(0) = a+r*cos(u)*cos(v);
189 p(1) = b+r*sin(u)*cos(v);
193 p(0) = a+r*cos(v+M_PI);
201 double u = x(1)-M_PI_2, v = 2*x(0);
202 const double pi = M_PI;
204 p(0) = (v<pi ? (2.5-1.5*cos(v))*cos(u) :
205 (v<2*pi ? (2.5-1.5*cos(v))*cos(u) :
206 (v<3*pi ? -2+(2+cos(u))*cos(v) : -2+2*cos(v)-cos(u))));
207 p(1) = (v<pi ? (2.5-1.5*cos(v))*sin(u) :
208 (v<2*pi ? (2.5-1.5*cos(v))*sin(u) :
209 (v<3*pi ? sin(u) : sin(u))));
210 p(2) = (v<pi ? -2.5*sin(v) :
212 (v<3*pi ? (2+cos(u))*sin(v)+3*pi : -3*v+12*pi)));
void bottle2_trans(const Vector &x, Vector &p)
Class for grid function - Vector with associated FE space.
virtual void GetVertices(Array< int > &v) const =0
Returns element's vertices.
void SetSize(int s)
Resizes the vector if the new size is different.
int GetNBE() const
Returns number of boundary elements.
int Size() const
Returns the size of the vector.
void Transform(void(*f)(const Vector &, Vector &))
int GetNE() const
Returns number of elements.
void RemoveInternalBoundaries()
void figure8_trans(const Vector &x, Vector &p)
void SetCurvature(int order, bool discont=false, int space_dim=-1, int ordering=1)
Type
Constants for the classes derived from Element.
const Element * GetElement(int i) const
void PrintUsage(std::ostream &out) const
virtual void Print(std::ostream &out=std::cout) const
Print the mesh to the given stream using the default MFEM mesh format.
int main(int argc, char *argv[])
void RemoveUnusedVertices()
Remove unused vertices and rebuild mesh connectivity.
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)
void PrintOptions(std::ostream &out) const
virtual int GetNVertices() const =0
void GetNodes(Vector &node_coord) const
void bottle_trans(const Vector &x, Vector &p)
Abstract data type element.
const Element * GetBdrElement(int i) const