107 #include "../common/mfem-common.hpp" 112 using namespace mfem;
115 int main(
int argc,
char *argv[])
118 const char *mesh_file =
"icf.mesh";
119 int mesh_poly_deg = 1;
124 double lim_const = 0.0;
125 double adapt_lim_const = 0.0;
129 int solver_iter = 20;
130 double solver_rtol = 1e-10;
131 int solver_art_type = 0;
133 int max_lin_iter = 100;
134 bool move_bnd =
true;
136 bool bal_expl_combo =
false;
137 bool hradaptivity =
false;
138 int h_metric_id = -1;
139 bool normalization =
false;
140 bool visualization =
true;
141 int verbosity_level = 0;
142 bool fdscheme =
false;
144 bool exactaction =
false;
145 bool integ_over_targ =
true;
146 const char *devopt =
"cpu";
150 int mesh_node_ordering = 0;
151 int barrier_type = 0;
152 int worst_case_type = 0;
156 args.
AddOption(&mesh_file,
"-m",
"--mesh",
157 "Mesh file to use.");
158 args.
AddOption(&mesh_poly_deg,
"-o",
"--order",
159 "Polynomial degree of mesh finite element space.");
160 args.
AddOption(&rs_levels,
"-rs",
"--refine-serial",
161 "Number of times to refine the mesh uniformly in serial.");
162 args.
AddOption(&jitter,
"-ji",
"--jitter",
163 "Random perturbation scaling factor.");
164 args.
AddOption(&metric_id,
"-mid",
"--metric-id",
165 "Mesh optimization metric:\n\t" 167 "1 : |T|^2 -- 2D no type\n\t" 168 "2 : 0.5|T|^2/tau-1 -- 2D shape (condition number)\n\t" 169 "7 : |T-T^-t|^2 -- 2D shape+size\n\t" 170 "9 : tau*|T-T^-t|^2 -- 2D shape+size\n\t" 171 "14 : |T-I|^2 -- 2D shape+size+orientation\n\t" 172 "22 : 0.5(|T|^2-2*tau)/(tau-tau_0) -- 2D untangling\n\t" 173 "50 : 0.5|T^tT|^2/tau^2-1 -- 2D shape\n\t" 174 "55 : (tau-1)^2 -- 2D size\n\t" 175 "56 : 0.5(sqrt(tau)-1/sqrt(tau))^2 -- 2D size\n\t" 176 "58 : |T^tT|^2/(tau^2)-2*|T|^2/tau+2 -- 2D shape\n\t" 177 "77 : 0.5(tau-1/tau)^2 -- 2D size\n\t" 178 "80 : (1-gamma)mu_2 + gamma mu_77 -- 2D shape+size\n\t" 179 "85 : |T-|T|/sqrt(2)I|^2 -- 2D shape+orientation\n\t" 180 "90 : balanced combo mu_50 & mu_77 -- 2D shape+size\n\t" 181 "94 : balanced combo mu_2 & mu_56 -- 2D shape+size\n\t" 182 "98 : (1/tau)|T-I|^2 -- 2D shape+size+orientation\n\t" 186 "301: (|T||T^-1|)/3-1 -- 3D shape\n\t" 187 "302: (|T|^2|T^-1|^2)/9-1 -- 3D shape\n\t" 188 "303: (|T|^2)/3/tau^(2/3)-1 -- 3D shape\n\t" 189 "304: (|T|^3)/3^{3/2}/tau-1 -- 3D shape\n\t" 191 "313: (|T|^2)(tau-tau0)^(-2/3)/3 -- 3D untangling\n\t" 192 "315: (tau-1)^2 -- 3D no type\n\t" 193 "316: 0.5(sqrt(tau)-1/sqrt(tau))^2 -- 3D no type\n\t" 194 "321: |T-T^-t|^2 -- 3D shape+size\n\t" 195 "322: |T-adjT^-t|^2 -- 3D shape+size\n\t" 196 "323: |J|^3-3sqrt(3)ln(det(J))-3sqrt(3) -- 3D shape+size\n\t" 197 "328: balanced combo mu_301 & mu_316 -- 3D shape+size\n\t" 198 "332: (1-gamma) mu_302 + gamma mu_315 -- 3D shape+size\n\t" 199 "333: (1-gamma) mu_302 + gamma mu_316 -- 3D shape+size\n\t" 200 "334: (1-gamma) mu_303 + gamma mu_316 -- 3D shape+size\n\t" 201 "328: balanced combo mu_302 & mu_318 -- 3D shape+size\n\t" 202 "347: (1-gamma) mu_304 + gamma mu_316 -- 3D shape+size\n\t" 204 "360: (|T|^3)/3^{3/2}-tau -- 3D shape\n\t" 206 "11 : (1/4*alpha)|A-(adjA)^T(W^TW)/omega|^2 -- 2D shape\n\t" 207 "36 : (1/alpha)|A-W|^2 -- 2D shape+size+orientation\n\t" 208 "107: (1/2*alpha)|A-|A|/|W|W|^2 -- 2D shape+orientation\n\t" 209 "126: (1-gamma)nu_11 + gamma*nu_14a -- 2D shape+size\n\t" 211 args.
AddOption(&target_id,
"-tid",
"--target-id",
212 "Target (ideal element) type:\n\t" 213 "1: Ideal shape, unit size\n\t" 214 "2: Ideal shape, equal size\n\t" 215 "3: Ideal shape, initial size\n\t" 216 "4: Given full analytic Jacobian (in physical space)\n\t" 217 "5: Ideal shape, given size (in physical space)");
218 args.
AddOption(&lim_const,
"-lc",
"--limit-const",
"Limiting constant.");
219 args.
AddOption(&adapt_lim_const,
"-alc",
"--adapt-limit-const",
220 "Adaptive limiting coefficient constant.");
221 args.
AddOption(&quad_type,
"-qt",
"--quad-type",
222 "Quadrature rule type:\n\t" 223 "1: Gauss-Lobatto\n\t" 224 "2: Gauss-Legendre\n\t" 225 "3: Closed uniform points");
226 args.
AddOption(&quad_order,
"-qo",
"--quad_order",
227 "Order of the quadrature rule.");
228 args.
AddOption(&solver_type,
"-st",
"--solver-type",
229 " Type of solver: (default) 0: Newton, 1: LBFGS");
230 args.
AddOption(&solver_iter,
"-ni",
"--newton-iters",
231 "Maximum number of Newton iterations.");
232 args.
AddOption(&solver_rtol,
"-rtol",
"--newton-rel-tolerance",
233 "Relative tolerance for the Newton solver.");
234 args.
AddOption(&solver_art_type,
"-art",
"--adaptive-rel-tol",
235 "Type of adaptive relative linear solver tolerance:\n\t" 236 "0: None (default)\n\t" 237 "1: Eisenstat-Walker type 1\n\t" 238 "2: Eisenstat-Walker type 2");
239 args.
AddOption(&lin_solver,
"-ls",
"--lin-solver",
244 "3: MINRES + Jacobi preconditioner\n\t" 245 "4: MINRES + l1-Jacobi preconditioner");
246 args.
AddOption(&max_lin_iter,
"-li",
"--lin-iter",
247 "Maximum number of iterations in the linear solve.");
248 args.
AddOption(&move_bnd,
"-bnd",
"--move-boundary",
"-fix-bnd",
250 "Enable motion along horizontal and vertical boundaries.");
251 args.
AddOption(&combomet,
"-cmb",
"--combo-type",
252 "Combination of metrics options:\n\t" 253 "0: Use single metric\n\t" 254 "1: Shape + space-dependent size given analytically\n\t" 255 "2: Shape + adapted size given discretely; shared target");
256 args.
AddOption(&bal_expl_combo,
"-bec",
"--balance-explicit-combo",
257 "-no-bec",
"--balance-explicit-combo",
258 "Automatic balancing of explicit combo metrics.");
259 args.
AddOption(&hradaptivity,
"-hr",
"--hr-adaptivity",
"-no-hr",
260 "--no-hr-adaptivity",
261 "Enable hr-adaptivity.");
262 args.
AddOption(&h_metric_id,
"-hmid",
"--h-metric",
263 "Same options as metric_id. Used to determine refinement" 264 " type for each element if h-adaptivity is enabled.");
265 args.
AddOption(&normalization,
"-nor",
"--normalization",
"-no-nor",
266 "--no-normalization",
267 "Make all terms in the optimization functional unitless.");
268 args.
AddOption(&fdscheme,
"-fd",
"--fd_approximation",
269 "-no-fd",
"--no-fd-approx",
270 "Enable finite difference based derivative computations.");
271 args.
AddOption(&exactaction,
"-ex",
"--exact_action",
272 "-no-ex",
"--no-exact-action",
273 "Enable exact action of TMOP_Integrator.");
274 args.
AddOption(&integ_over_targ,
"-it",
"--integrate-target",
275 "-ir",
"--integrate-reference",
276 "Integrate over target (-it) or reference (-ir) element.");
277 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
278 "--no-visualization",
279 "Enable or disable GLVis visualization.");
280 args.
AddOption(&verbosity_level,
"-vl",
"--verbosity-level",
281 "Verbosity level for the involved iterative solvers:\n\t" 283 "1: Newton iterations\n\t" 284 "2: Newton iterations + linear solver summaries\n\t" 285 "3: newton iterations + linear solver iterations");
286 args.
AddOption(&adapt_eval,
"-ae",
"--adaptivity-evaluator",
287 "0 - Advection based (DEFAULT), 1 - GSLIB.");
288 args.
AddOption(&devopt,
"-d",
"--device",
289 "Device configuration string, see Device::Configure().");
290 args.
AddOption(&pa,
"-pa",
"--partial-assembly",
"-no-pa",
291 "--no-partial-assembly",
"Enable Partial Assembly.");
292 args.
AddOption(&n_hr_iter,
"-nhr",
"--n_hr_iter",
293 "Number of hr-adaptivity iterations.");
294 args.
AddOption(&n_h_iter,
"-nh",
"--n_h_iter",
295 "Number of h-adaptivity iterations per r-adaptivity" 297 args.
AddOption(&mesh_node_ordering,
"-mno",
"--mesh_node_ordering",
298 "Ordering of mesh nodes." 299 "0 (default): byNodes, 1: byVDIM");
300 args.
AddOption(&barrier_type,
"-btype",
"--barrier-type",
302 "1 - Shifted Barrier," 303 "2 - Pseudo Barrier.");
304 args.
AddOption(&worst_case_type,
"-wctype",
"--worst-case-type",
316 if (h_metric_id < 0) { h_metric_id = metric_id; }
320 MFEM_VERIFY(strcmp(devopt,
"cpu")==0,
"HR-adaptivity is currently only" 321 " supported on cpus.");
327 Mesh *mesh =
new Mesh(mesh_file, 1, 1,
false);
338 if (mesh_poly_deg <= 0)
368 double mesh_volume = 0.0;
370 for (
int i = 0; i < mesh->
GetNE(); i++)
376 for (
int j = 0; j < dofs.
Size(); j++)
378 h0(dofs[j]) = min(h0(dofs[j]), hi);
382 const double small_phys_size = pow(mesh_volume, 1.0 /
dim) / 100.0;
395 for (
int i = 0; i < fespace->
GetNDofs(); i++)
397 for (
int d = 0; d <
dim; d++)
403 for (
int i = 0; i < fespace->
GetNBE(); i++)
408 for (
int j = 0; j < vdofs.
Size(); j++) { rdm(vdofs[j]) = 0.0; }
417 ofstream mesh_ofs(
"perturbed.mesh");
418 mesh->
Print(mesh_ofs);
426 double min_detJ = -0.1;
476 cout <<
"Unknown metric_id: " << metric_id << endl;
495 default: cout <<
"Metric_id not supported for h-adaptivity: " << h_metric_id <<
502 switch (barrier_type)
510 default: cout <<
"barrier_type not supported: " << barrier_type << endl;
515 switch (worst_case_type)
523 default: cout <<
"worst_case_type not supported: " << worst_case_type << endl;
528 if (barrier_type > 0 || worst_case_type > 0)
530 if (barrier_type > 0)
532 MFEM_VERIFY(metric_id == 4 || metric_id == 14 || metric_id == 66,
533 "Metric not supported for shifted/pseudo barriers.");
544 if (metric_id < 300 || h_metric_id < 300)
546 MFEM_VERIFY(
dim == 2,
"Incompatible metric for 3D meshes");
548 if (metric_id >= 300 || h_metric_id >= 300)
550 MFEM_VERIFY(
dim == 3,
"Incompatible metric for 2D meshes");
560 GridFunction size(&ind_fes), aspr(&ind_fes), ori(&ind_fes);
590 #ifdef MFEM_USE_GSLIB 593 MFEM_ABORT(
"MFEM is not built with GSLIB.");
608 disc.ProjectCoefficient(mat_coeff);
615 #ifdef MFEM_USE_GSLIB 618 MFEM_ABORT(
"MFEM is not built with GSLIB.");
626 disc.GetDerivative(1,0,d_x);
627 disc.GetDerivative(1,1,d_y);
630 for (
int i = 0; i < size.Size(); i++)
632 size(i) = std::pow(d_x(i),2)+std::pow(d_y(i),2);
634 const double max = size.Max();
636 for (
int i = 0; i < d_x.Size(); i++)
638 d_x(i) = std::abs(d_x(i));
639 d_y(i) = std::abs(d_y(i));
641 const double eps = 0.01;
642 const double aspr_ratio = 20.0;
643 const double size_ratio = 40.0;
645 for (
int i = 0; i < size.Size(); i++)
647 size(i) = (size(i)/max);
648 aspr(i) = (d_x(i)+eps)/(d_y(i)+eps);
649 aspr(i) = 0.1 + 0.9*(1-size(i))*(1-size(i));
650 if (aspr(i) > aspr_ratio) {aspr(i) = aspr_ratio;}
651 if (aspr(i) < 1.0/aspr_ratio) {aspr(i) = 1.0/aspr_ratio;}
654 const int NE = mesh->
GetNE();
655 double volume = 0.0, volume_ind = 0.0;
657 for (
int i = 0; i < NE; i++)
662 size.GetValues(i, ir, vals);
672 const double avg_zone_size = volume / NE;
674 const double small_avg_ratio = (volume_ind + (volume - volume_ind) /
678 const double small_zone_size = small_avg_ratio * avg_zone_size;
679 const double big_zone_size = size_ratio * small_zone_size;
681 for (
int i = 0; i < size.Size(); i++)
683 const double val = size(i);
684 const double a = (big_zone_size - small_zone_size) / small_zone_size;
685 size(i) = big_zone_size / (1.0+
a*val);
706 #ifdef MFEM_USE_GSLIB 709 MFEM_ABORT(
"MFEM is not built with GSLIB.");
729 #ifdef MFEM_USE_GSLIB 732 MFEM_ABORT(
"MFEM is not built with GSLIB.");
737 size.ProjectCoefficient(size_coeff);
758 default: cout <<
"Unknown target_id: " << target_id << endl;
return 3;
760 if (target_c == NULL)
768 if (metric_combo && bal_expl_combo)
771 metric_combo->ComputeBalancedWeights(x, *target_c, bal_weights);
772 metric_combo->SetWeights(bal_weights);
778 auto tmop_integ =
new TMOP_Integrator(metric_to_use, target_c, h_metric);
779 tmop_integ->IntegrateOverTarget(integ_over_targ);
780 if (barrier_type > 0 || worst_case_type > 0)
782 tmop_integ->ComputeUntangleMetricQuantiles(x, *fespace);
788 MFEM_VERIFY(pa ==
false,
"PA for finite differences is not implemented.");
789 tmop_integ->EnableFiniteDifferences(x);
791 tmop_integ->SetExactActionFlag(exactaction);
800 default: cout <<
"Unknown quad_type: " << quad_type << endl;
return 3;
802 tmop_integ->SetIntegrationRules(*irules, quad_order);
805 cout <<
"Triangle quadrature points: " 807 <<
"\nQuadrilateral quadrature points: " 812 cout <<
"Tetrahedron quadrature points: " 814 <<
"\nHexahedron quadrature points: " 816 <<
"\nPrism quadrature points: " 826 if (normalization) { dist = small_phys_size; }
828 if (lim_const != 0.0) { tmop_integ->EnableLimiting(x0, dist, lim_coeff); }
834 if (adapt_lim_const > 0.0)
836 MFEM_VERIFY(pa ==
false,
"PA is not implemented for adaptive limiting");
841 if (adapt_eval == 0) { adapt_lim_eval =
new AdvectorCG(al); }
842 else if (adapt_eval == 1)
844 #ifdef MFEM_USE_GSLIB 847 MFEM_ABORT(
"MFEM is not built with GSLIB support!");
850 else { MFEM_ABORT(
"Bad interpolation option."); }
852 tmop_integ->EnableAdaptiveLimiting(adapt_lim_gf0, adapt_lim_coeff,
864 if (normalization) { tmop_integ->EnableNormalization(x0); }
884 tmop_integ->SetCoefficient(*metric_coeff1);
899 else { tmop_integ2 =
new TMOP_Integrator(metric2, target_c, h_metric); }
909 if (lim_const != 0.0) { combo->
EnableLimiting(x0, dist, lim_coeff); }
911 a.AddDomainIntegrator(combo);
915 a.AddDomainIntegrator(tmop_integ);
918 if (pa) {
a.Setup(); }
922 const int NE = mesh->
GetNE();
923 for (
int i = 0; i < NE; i++)
931 min_detJ = min(min_detJ, transf->
Jacobian().
Det());
934 cout <<
"Minimum det(J) of the original mesh is " << min_detJ << endl;
936 if (min_detJ < 0.0 && barrier_type == 0
937 && metric_id != 22 && metric_id != 211 && metric_id != 252
938 && metric_id != 311 && metric_id != 313 && metric_id != 352)
940 MFEM_ABORT(
"The input mesh is inverted! Try an untangling metric.");
945 "Untangling is supported only for ideal targets.");
949 min_detJ /= Wideal.
Det();
952 min_detJ -= 0.01 * h0.Min();
956 const double init_energy =
a.GetGridFunctionEnergy(x) /
957 (hradaptivity ? mesh->
GetNE() : 1);
958 double init_metric_energy = init_energy;
959 if (lim_const > 0.0 || adapt_lim_const > 0.0)
963 init_metric_energy =
a.GetGridFunctionEnergy(x) /
964 (hradaptivity ? mesh->
GetNE() : 1);
966 adapt_lim_coeff.
constant = adapt_lim_const;
973 char title[] =
"Initial metric values";
982 if (move_bnd ==
false)
986 a.SetEssentialBC(ess_bdr);
991 for (
int i = 0; i < mesh->
GetNBE(); i++)
995 MFEM_VERIFY(!(
dim == 2 && attr == 3),
996 "Boundary attribute 3 must be used only for 3D meshes. " 997 "Adjust the attributes (1/2/3/4 for fixed x/y/z/all " 998 "components, rest for free nodes), or use -fix-bnd.");
999 if (attr == 1 || attr == 2 || attr == 3) { n += nd; }
1000 if (attr == 4) { n += nd *
dim; }
1004 for (
int i = 0; i < mesh->
GetNBE(); i++)
1011 for (
int j = 0; j < nd; j++)
1012 { ess_vdofs[n++] = vdofs[j]; }
1016 for (
int j = 0; j < nd; j++)
1017 { ess_vdofs[n++] = vdofs[j+nd]; }
1021 for (
int j = 0; j < nd; j++)
1022 { ess_vdofs[n++] = vdofs[j+2*nd]; }
1026 for (
int j = 0; j < vdofs.
Size(); j++)
1027 { ess_vdofs[n++] = vdofs[j]; }
1030 a.SetEssentialVDofs(ess_vdofs);
1035 Solver *S = NULL, *S_prec = NULL;
1036 const double linsol_rtol = 1e-12;
1039 if (verbosity_level == 2)
1041 if (verbosity_level > 2)
1043 if (lin_solver == 0)
1045 S =
new DSmoother(1, 1.0, max_lin_iter);
1047 else if (lin_solver == 1)
1063 if (lin_solver == 3 || lin_solver == 4)
1067 MFEM_VERIFY(lin_solver != 4,
"PA l1-Jacobi is not implemented");
1074 auto ds =
new DSmoother((lin_solver == 3) ? 0 : 1, 1.0, 1);
1075 ds->SetPositiveDiagonal(
true);
1098 if (solver_art_type > 0)
1104 if (verbosity_level > 0)
1115 x, move_bnd, hradaptivity,
1116 mesh_poly_deg, h_metric_id,
1117 n_hr_iter, n_h_iter);
1119 if (adapt_lim_const > 0.)
1129 ofstream mesh_ofs(
"optimized.mesh");
1130 mesh_ofs.precision(14);
1131 mesh->
Print(mesh_ofs);
1135 const double fin_energy =
a.GetGridFunctionEnergy(x) /
1136 (hradaptivity ? mesh->
GetNE() : 1);
1137 double fin_metric_energy = fin_energy;
1138 if (lim_const > 0.0 || adapt_lim_const > 0.0)
1142 fin_metric_energy =
a.GetGridFunctionEnergy(x) /
1143 (hradaptivity ? mesh->
GetNE() : 1);
1145 adapt_lim_coeff.
constant = adapt_lim_const;
1147 std::cout << std::scientific << std::setprecision(4);
1148 cout <<
"Initial strain energy: " << init_energy
1149 <<
" = metrics: " << init_metric_energy
1150 <<
" + extra terms: " << init_energy - init_metric_energy << endl;
1151 cout <<
" Final strain energy: " << fin_energy
1152 <<
" = metrics: " << fin_metric_energy
1153 <<
" + extra terms: " << fin_energy - fin_metric_energy << endl;
1154 cout <<
"The strain energy decreased by: " 1155 << (init_energy - fin_energy) * 100.0 / init_energy <<
" %." << endl;
1160 char title[] =
"Final metric values";
1164 if (adapt_lim_const > 0.0 && visualization)
1168 600, 600, 300, 300);
1175 sock <<
"solution\n";
1180 sock <<
"window_title 'Displacements'\n" 1181 <<
"window_geometry " 1182 << 1200 <<
" " << 0 <<
" " << 600 <<
" " << 600 <<
"\n" 1183 <<
"keys jRmclA" << endl;
1190 delete metric_coeff1;
1191 delete adapt_lim_eval;
1193 delete hr_adapt_coeff;
1197 delete untangler_metric;
void discrete_aspr_3d(const Vector &x, Vector &v)
Conjugate gradient method.
int GetNPoints() const
Returns the number of the points in the integration rule.
AssemblyLevel
Enumeration defining the assembly level for bilinear and nonlinear form classes derived from Operator...
Class for an integration rule - an Array of IntegrationPoint.
3D non-barrier Shape (S) metric.
void EnableFiniteDifferences(const GridFunction &x)
Enables FD-based approximation and computes dx.
Class for grid function - Vector with associated FE space.
3D barrier Shape+Size (VS) metric, well-posed (invex).
Data type for scaled Jacobi-type smoother of sparse matrix.
const IntegrationRule & Get(int GeomType, int Order)
Returns an integration rule for given GeomType and Order.
IntegrationRules IntRulesLo(0, Quadrature1D::GaussLobatto)
void SetPositiveDiagonal(bool pos_diag=true)
Replace diagonal entries with their absolute values.
void SetIntegrationRules(IntegrationRules &irules, int order)
Prescribe a set of integration rules; relevant for mixed meshes.
void SetFromTrueVector()
Shortcut for calling SetFromTrueDofs() with GetTrueVector() as argument.
3D barrier Shape+Size (VS) metric, well-posed (polyconvex).
A coefficient that is constant across space and time.
void PrintOptions(std::ostream &out) const
Print the options.
Geometry::Type GetElementBaseGeometry(int i) const
virtual void SetSerialDiscreteTargetOrientation(const GridFunction &tspec_)
int main(int argc, char *argv[])
int Dimension() const
Dimension of the reference space used within the elements.
3D barrier Shape (S) metric, well-posed (polyconvex & invex).
void SetAdaptivityEvaluator(AdaptivityEvaluator *ae)
void PrintUsage(std::ostream &out) const
Print the usage message.
int GetAttribute() const
Return element's attribute.
void ConstructSizeGF(GridFunction &size)
T Max() const
Find the maximal element in the array, using the comparison operator < for class T.
Container class for integration rules.
Data type dense matrix using column-major storage.
3D barrier Shape (S) metric, well-posed (polyconvex & invex).
void SetVolumeScale(double vol_scale)
Used by target type IDEAL_SHAPE_EQUAL_SIZE. The default volume scale is 1.
int GetNDofs() const
Returns number of degrees of freedom. This is the number of Local Degrees of Freedom.
void SetIntegrationRules(IntegrationRules &irules, int order)
Prescribe a set of integration rules; relevant for mixed meshes.
void EnableNormalization(const GridFunction &x)
Normalization factor that considers all integrators in the combination.
3D compound barrier Shape+Size (VS) metric (polyconvex, balanced).
2D barrier Shape+Size (VS) metric (polyconvex).
void Print(std::ostream &out=mfem::out)
Print the configuration of the MFEM virtual device object.
3D barrier Shape+Size (VS) metric, well-posed (invex).
bool Good() const
Return true if the command line options were parsed successfully.
void vis_tmop_metric_s(int order, TMOP_QualityMetric &qm, const TargetConstructor &tc, Mesh &mesh, char *title, int position)
void SetExactActionFlag(bool flag_)
Flag to control if exact action of Integration is effected.
void Randomize(int seed=0)
Set random values in the vector.
void IntegrateOverTarget(bool integ_over_target_)
void SetMinDetPtr(double *md_ptr)
2D barrier Shape+Size (VS) metric (not polyconvex).
3D barrier Shape+Size (VS) metric, well-posed (invex).
int GetNBE() const
Returns number of boundary elements.
void EnableLimiting(const GridFunction &n0, const GridFunction &dist, Coefficient &w0, TMOP_LimiterFunction *lfunc=NULL)
Adds the limiting term to the first integrator. Disables it for the rest.
2D Shifted barrier form of shape metric (mu_2).
virtual const FiniteElement * GetFE(int i) const
Returns pointer to the FiniteElement in the FiniteElementCollection associated with i'th element in t...
virtual void SetSerialDiscreteTargetAspectRatio(const GridFunction &tspec_)
IntegrationRules IntRules(0, Quadrature1D::GaussLegendre)
A global object with all integration rules (defined in intrules.cpp)
2D barrier shape (S) metric (not polyconvex).
3D barrier Shape (S) metric, well-posed (polyconvex & invex).
Geometry::Type GetGeomType() const
Returns the Geometry::Type of the reference element.
Abstract class for local mesh quality metrics in the target-matrix optimization paradigm (TMOP) by P...
IntegrationPoint & IntPoint(int i)
Returns a reference to the i-th integration point.
void SetTrueVector()
Shortcut for calling GetTrueDofs() with GetTrueVector() as argument.
2D compound barrier Shape+Size (VS) metric (balanced).
virtual void SetPreconditioner(Solver &pr)
This should be called before SetOperator.
virtual void SetPrintLevel(int print_lvl)
Legacy method to set the level of verbosity of the solver output.
double GetElementSize(ElementTransformation *T, int type=0)
void Parse()
Parse the command-line options. Note that this function expects all the options provided through the ...
void SetCoefficient(Coefficient &w1)
Sets a scaling Coefficient for the quality metric term of the integrator.
void EnsureNCMesh(bool simplices_nonconforming=false)
Jacobi smoothing for a given bilinear form (no matrix necessary).
void UniformRefinement(int i, const DSTable &, int *, int *, int *)
void SetNodes(const GridFunction &n)
Set the nodes to be used in the target-matrix construction.
void SetMaxIter(int max_it)
3D barrier Shape+Size (VS) metric, well-posed (polyconvex).
PrintLevel & Iterations()
Version of QuadraticFECollection with positive basis functions.
double discrete_ori_2d(const Vector &x)
2D barrier Shape+Size+Orientation (VOS) metric (polyconvex).
virtual void SetNodalFESpace(FiniteElementSpace *nfes)
PrintLevel & FirstAndLast()
void AddFESpaceForUpdate(FiniteElementSpace *fes)
2D barrier Shape+Orientation (OS) metric (polyconvex).
A general vector function coefficient.
3D compound barrier Shape+Size (VS) metric (polyconvex, balanced).
void SetAbsTol(double atol)
Array< int > bdr_attributes
A list of all unique boundary attributes used by the Mesh.
void AddGridFunctionForUpdate(GridFunction *gf)
void SetRelTol(double rtol)
virtual void SetPreconditioner(Solver &pr)
This should be called before SetOperator.
Class FiniteElementSpace - responsible for providing FEM view of the mesh, mainly managing the set of...
double weight_fun(const Vector &x)
Collection of finite elements from the same family in multiple dimensions. This class is used to matc...
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 SetAdaptiveLinRtol(const int type=2, const double rtol0=0.5, const double rtol_max=0.9, const double alpha=0.5 *(1.0+sqrt(5.0)), const double gamma=1.0)
Enable adaptive linear solver relative tolerance algorithm.
double adapt_lim_fun(const Vector &x)
int GetDof() const
Returns the number of degrees of freedom in the finite element.
virtual DofTransformation * GetElementDofs(int elem, Array< int > &dofs) const
Returns indices of degrees of freedom of element 'elem'. The returned indices are offsets into an ldo...
void AddTMOPIntegrator(TMOP_Integrator *ti)
Adds a new TMOP_Integrator to the combination.
double material_indicator_2d(const Vector &x)
2D barrier Shape+Size (VS) metric (not polyconvex).
int GetNE() const
Returns number of elements.
Class for integration point with weight.
void GetElementTransformation(int i, IsoparametricTransformation *ElTr)
void DiffuseField(ParGridFunction &field, int smooth_steps)
DofTransformation * GetBdrElementVDofs(int i, Array< int > &vdofs) const
Returns indices of degrees of freedom for i'th boundary element. The returned indices are offsets int...
2D barrier Shape+Size+Orientation (VOS) metric (polyconvex).
3D Shape (S) metric, untangling version of 303.
IntegrationRules IntRulesCU(0, Quadrature1D::ClosedUniform)
2D compound barrier Shape+Size (VS) metric (balanced).
int GetNBE() const
Returns number of boundary elements in the mesh.
double infinity()
Define a shortcut for std::numeric_limits<double>::infinity()
const DenseMatrix & GetGeomToPerfGeomJac(int GeomType) const
virtual void ProjectCoefficient(Coefficient &coeff)
Project coeff Coefficient to this GridFunction. The projection computation depends on the choice of t...
int Size() const
Return the logical size of the array.
A general function coefficient.
int DofToVDof(int dof, int vd, int ndofs=-1) const
Compute a single vdof corresponding to the index dof and the vector index vd.
void VisualizeField(socketstream &sock, const char *vishost, int visport, GridFunction &gf, const char *title, int x, int y, int w, int h, const char *keys, bool vec)
virtual void Print(std::ostream &os=mfem::out) const
3D barrier Shape+Size (VS) metric, well-posed (polyconvex).
Arbitrary order H1-conforming (continuous) finite elements.
TargetType
Target-matrix construction algorithms supported by this class.
const Element * GetBdrElement(int i) const
Return pointer to the i'th boundary element object.
void SetNodalGridFunction(GridFunction *nodes, bool make_owner=false)
Base class representing target-matrix construction algorithms for mesh optimization via the target-ma...
virtual void Save(std::ostream &out) const
Save the GridFunction to an output stream.
The MFEM Device class abstracts hardware devices such as GPUs, as well as programming models such as ...
virtual void SetAnalyticTargetSpec(Coefficient *sspec, VectorCoefficient *vspec, TMOPMatrixCoefficient *mspec)
3D compound barrier Shape+Size (VS) metric (polyconvex).
virtual void SetSerialDiscreteTargetSize(const GridFunction &tspec_)
const FiniteElement * GetBE(int i) const
Returns pointer to the FiniteElement in the FiniteElementCollection associated with i'th boundary fac...
2D barrier Shape+Orientation (OS) metric (polyconvex).
virtual double * HostReadWrite()
Shortcut for mfem::ReadWrite(vec.GetMemory(), vec.Size(), false).
double GetElementVolume(int i)
Settings for the output behavior of the IterativeSolver.
3D barrier Shape (S) metric, well-posed (polyconvex & invex).
2D non-barrier metric without a type.
A TMOP integrator class based on any given TMOP_QualityMetric and TargetConstructor.
2D non-barrier Shape+Size+Orientation (VOS) metric (polyconvex).