55 static double p = 2.0;
58 for (
int i = 0; i < x.
Size(); i++)
60 x(i) = (2*x(i)-xmin(i)-xmax(i))/(xmax(i)-xmin(i));
64 if (x.
Normlp(p) > 0.4 && x.
Normlp(p) < 0.6) {
return 1; }
65 if (x.
Normlp(p) < 0.4 || x.
Normlp(p) > 0.6) {
return 2; }
69 int main(
int argc,
char *argv[])
73 const char *mesh_file =
"../../data/inline-quad.mesh";
78 args.
AddOption(&mesh_file,
"-m",
"--mesh",
79 "Input mesh file to shape materials in.");
80 args.
AddOption(&sd,
"-sd",
"--sub-divisions",
81 "Number of element subdivisions for interface detection.");
82 args.
AddOption(&nclimit,
"-ncl",
"--nc-limit",
83 "Level of hanging nodes allowed (-1 = unlimited).");
84 args.
AddOption(&aniso,
"-a",
"--aniso",
"-i",
"--iso",
85 "Enable anisotropic refinement of quads and hexes.");
91 Mesh mesh(mesh_file, 1, 1);
112 sol_sock.precision(8);
115 for (
int iter = 0; 1; iter++)
118 for (
int i = 0; i < mesh.
GetNE(); i++)
140 if ((
int)matsum != m*(j+1))
157 int dx = 0, dy = 0, dz = 0;
161 for (
int j = 0; j <= sd; j++)
162 for (
int i = 0; i < sd; i++)
164 dx += abs(mat[j*s + i+1] - mat[j*s + i]);
165 dy += abs(mat[(i+1)*s + j] - mat[i*s + j]);
170 for (
int k = 0; k <= sd; k++)
171 for (
int j = 0; j <= sd; j++)
172 for (
int i = 0; i < sd; i++)
174 dx += abs(mat[(k*s + j)*s + i+1] - mat[(k*s + j)*s + i]);
175 dy += abs(mat[(k*s + i+1)*s + j] - mat[(k*s + i)*s + j]);
176 dz += abs(mat[((i+1)*s + j)*s + k] - mat[(i*s + j)*s + k]);
180 const int tol = mat.Size() / 10;
181 if (dx > tol) { type |= 1; }
182 if (dy > tol) { type |= 2; }
183 if (dz > tol) { type |= 4; }
184 if (!type) { type = 7; }
192 sol_sock <<
"solution\n" << mesh << attr;
193 if (iter == 0 && sdim == 2)
195 sol_sock <<
"keys 'RjlmpppppppppppppA*************'\n";
197 if (iter == 0 && sdim == 3)
199 sol_sock <<
"keys 'YYYYYYYYYXXXXXXXmA********8888888pppttt";
200 if (dim == 3) { sol_sock <<
"iiM"; }
207 cout <<
"Mesh has " << mesh.
GetNE() <<
" elements. \n"
208 <<
"Continue shaping? --> ";
210 if (yn ==
'n' || yn ==
'q') {
break; }
219 for (
int i = 0; i < mesh.
GetNE(); i++)
226 ofstream mesh_ofs(
"shaper.mesh");
227 mesh_ofs.precision(8);
228 mesh.
Print(mesh_ofs);
int GetNPoints() const
Returns the number of the points in the integration rule.
virtual void Print(std::ostream &out=mfem::out) const
Class for an integration rule - an Array of IntegrationPoint.
Class for grid function - Vector with associated FE space.
virtual void Update(bool want_transform=true)
Reflect changes in the mesh: update number of DOFs, etc. Also, calculate GridFunction transformation ...
void GetBoundingBox(Vector &min, Vector &max, int ref=2)
Returns the minimum and maximum corners of the mesh bounding box.
int Size() const
Returns the size of the vector.
int GetNE() const
Returns number of elements.
Geometry::Type GetElementBaseGeometry(int i) const
IntegrationPoint & IntPoint(int i)
Returns a reference to the i-th integration point.
int material(Vector &x, Vector &xmin, Vector &xmax)
double Normlp(double p) const
Returns the l_p norm of the vector.
void Parse()
Parse the command-line options. Note that this function expects all the options provided through the ...
virtual void SetAttributes()
int Append(const T &el)
Append element 'el' to array, resize if necessary.
virtual void SetCurvature(int order, bool discont=false, int space_dim=-1, int ordering=1)
int MeshGenerator()
Get the mesh generator/type.
GeometryRefiner GlobGeometryRefiner
RefinedGeometry * Refine(Geometry::Type Geom, int Times, int ETimes=1)
void PrintUsage(std::ostream &out) const
Print the usage message.
int SpaceDimension() const
double p(const Vector &x, double t)
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...
NURBSExtension * NURBSext
Optional NURBS mesh extension.
void GetElementTransformation(int i, IsoparametricTransformation *ElTr)
void PrintOptions(std::ostream &out) const
Print the options.
void SetAttribute(int i, int attr)
Set the attribute of element i.
void GeneralRefinement(const Array< Refinement > &refinements, int nonconforming=-1, int nc_limit=0)
Arbitrary order "L2-conforming" discontinuous finite elements.
bool Good() const
Return true if the command line options were parsed successfully.