124int main(
int argc,
char *argv[])
127 const char *mesh_file =
"icf.mesh";
128 int mesh_poly_deg = 1;
134 real_t adapt_lim_const = 0.0;
138 int solver_iter = 20;
139#ifdef MFEM_USE_SINGLE
140 real_t solver_rtol = 1e-4;
142 real_t solver_rtol = 1e-10;
144 int solver_art_type = 0;
146 int max_lin_iter = 100;
147 bool move_bnd =
true;
149 bool bal_expl_combo =
false;
150 bool hradaptivity =
false;
151 int h_metric_id = -1;
152 bool normalization =
false;
153 bool visualization =
true;
154 int verbosity_level = 0;
155 bool fdscheme =
false;
157 bool exactaction =
false;
158 bool integ_over_targ =
true;
159 const char *devopt =
"cpu";
163 int mesh_node_order = 0;
164 int barrier_type = 0;
165 int worst_case_type = 0;
166 bool detj_bound =
false;
170 args.
AddOption(&mesh_file,
"-m",
"--mesh",
171 "Mesh file to use.");
172 args.
AddOption(&mesh_poly_deg,
"-o",
"--order",
173 "Polynomial degree of mesh finite element space.");
174 args.
AddOption(&rs_levels,
"-rs",
"--refine-serial",
175 "Number of times to refine the mesh uniformly in serial.");
176 args.
AddOption(&jitter,
"-ji",
"--jitter",
177 "Random perturbation scaling factor.");
178 args.
AddOption(&metric_id,
"-mid",
"--metric-id",
179 "Mesh optimization metric:\n\t"
181 "1 : |T|^2 -- 2D no type\n\t"
182 "2 : 0.5|T|^2/tau-1 -- 2D shape (condition number)\n\t"
183 "7 : |T-T^-t|^2 -- 2D shape+size\n\t"
184 "9 : tau*|T-T^-t|^2 -- 2D shape+size\n\t"
185 "14 : |T-I|^2 -- 2D shape+size+orientation\n\t"
186 "22 : 0.5(|T|^2-2*tau)/(tau-tau_0) -- 2D untangling\n\t"
187 "50 : 0.5|T^tT|^2/tau^2-1 -- 2D shape\n\t"
188 "55 : (tau-1)^2 -- 2D size\n\t"
189 "56 : 0.5(sqrt(tau)-1/sqrt(tau))^2 -- 2D size\n\t"
190 "58 : |T^tT|^2/(tau^2)-2*|T|^2/tau+2 -- 2D shape\n\t"
191 "77 : 0.5(tau-1/tau)^2 -- 2D size\n\t"
192 "80 : (1-gamma)mu_2 + gamma mu_77 -- 2D shape+size\n\t"
193 "85 : |T-|T|/sqrt(2)I|^2 -- 2D shape+orientation\n\t"
194 "90 : balanced combo mu_50 & mu_77 -- 2D shape+size\n\t"
195 "94 : balanced combo mu_2 & mu_56 -- 2D shape+size\n\t"
196 "98 : (1/tau)|T-I|^2 -- 2D shape+size+orientation\n\t"
199 "301: (|T||T^-1|)/3-1 -- 3D shape\n\t"
200 "302: (|T|^2|T^-1|^2)/9-1 -- 3D shape\n\t"
201 "303: (|T|^2)/3/tau^(2/3)-1 -- 3D shape\n\t"
202 "304: (|T|^3)/3^{3/2}/tau-1 -- 3D shape\n\t"
204 "313: (|T|^2)(tau-tau0)^(-2/3)/3 -- 3D untangling\n\t"
205 "315: (tau-1)^2 -- 3D no type\n\t"
206 "316: 0.5(sqrt(tau)-1/sqrt(tau))^2 -- 3D no type\n\t"
207 "321: |T-T^-t|^2 -- 3D shape+size\n\t"
208 "322: |T-adjT^-t|^2 -- 3D shape+size\n\t"
209 "323: |J|^3-3sqrt(3)ln(det(J))-3sqrt(3) -- 3D shape+size\n\t"
210 "328: balanced combo mu_301 & mu_316 -- 3D shape+size\n\t"
211 "332: (1-gamma) mu_302 + gamma mu_315 -- 3D shape+size\n\t"
212 "333: (1-gamma) mu_302 + gamma mu_316 -- 3D shape+size\n\t"
213 "334: (1-gamma) mu_303 + gamma mu_316 -- 3D shape+size\n\t"
214 "328: balanced combo mu_302 & mu_318 -- 3D shape+size\n\t"
215 "347: (1-gamma) mu_304 + gamma mu_316 -- 3D shape+size\n\t"
217 "360: (|T|^3)/3^{3/2}-tau -- 3D shape\n\t"
219 "11 : (1/4*alpha)|A-(adjA)^T(W^TW)/omega|^2 -- 2D shape\n\t"
220 "36 : (1/alpha)|A-W|^2 -- 2D shape+size+orientation\n\t"
221 "49 : (1-gamma) mu_2 + gamma nu_50 -- 2D shape+skew\n\t"
222 "51 : see fem/tmop.hpp -- 2D size+skew\n\t"
223 "107: (1/2*alpha)|A-|A|/|W|W|^2 -- 2D shape+orientation\n\t"
224 "126: (1-gamma)nu_11 + gamma*nu_14a -- 2D shape+size\n\t"
226 args.
AddOption(&target_id,
"-tid",
"--target-id",
227 "Target (ideal element) type:\n\t"
228 "1: Ideal shape, unit size\n\t"
229 "2: Ideal shape, equal size\n\t"
230 "3: Ideal shape, initial size\n\t"
231 "4: Given full analytic Jacobian (in physical space)\n\t"
232 "5: Ideal shape, given size (in physical space)");
233 args.
AddOption(&lim_const,
"-lc",
"--limit-const",
"Limiting constant.");
234 args.
AddOption(&adapt_lim_const,
"-alc",
"--adapt-limit-const",
235 "Adaptive limiting coefficient constant.");
236 args.
AddOption(&quad_type,
"-qt",
"--quad-type",
237 "Quadrature rule type:\n\t"
238 "1: Gauss-Lobatto\n\t"
239 "2: Gauss-Legendre\n\t"
240 "3: Closed uniform points");
241 args.
AddOption(&quad_order,
"-qo",
"--quad_order",
242 "Order of the quadrature rule.");
243 args.
AddOption(&solver_type,
"-st",
"--solver-type",
244 " Type of solver: (default) 0: Newton, 1: LBFGS");
245 args.
AddOption(&solver_iter,
"-ni",
"--newton-iters",
246 "Maximum number of Newton iterations.");
247 args.
AddOption(&solver_rtol,
"-rtol",
"--newton-rel-tolerance",
248 "Relative tolerance for the Newton solver.");
249 args.
AddOption(&solver_art_type,
"-art",
"--adaptive-rel-tol",
250 "Type of adaptive relative linear solver tolerance:\n\t"
251 "0: None (default)\n\t"
252 "1: Eisenstat-Walker type 1\n\t"
253 "2: Eisenstat-Walker type 2");
254 args.
AddOption(&lin_solver,
"-ls",
"--lin-solver",
259 "3: MINRES + Jacobi preconditioner\n\t"
260 "4: MINRES + l1-Jacobi preconditioner");
261 args.
AddOption(&max_lin_iter,
"-li",
"--lin-iter",
262 "Maximum number of iterations in the linear solve.");
263 args.
AddOption(&move_bnd,
"-bnd",
"--move-boundary",
"-fix-bnd",
265 "Enable motion along horizontal and vertical boundaries.");
266 args.
AddOption(&combomet,
"-cmb",
"--combo-type",
267 "Combination of metrics options:\n\t"
268 "0: Use single metric\n\t"
269 "1: Shape + space-dependent size given analytically\n\t"
270 "2: Shape + adapted size given discretely; shared target");
271 args.
AddOption(&bal_expl_combo,
"-bec",
"--balance-explicit-combo",
272 "-no-bec",
"--balance-explicit-combo",
273 "Automatic balancing of explicit combo metrics.");
274 args.
AddOption(&hradaptivity,
"-hr",
"--hr-adaptivity",
"-no-hr",
275 "--no-hr-adaptivity",
276 "Enable hr-adaptivity.");
277 args.
AddOption(&h_metric_id,
"-hmid",
"--h-metric",
278 "Same options as metric_id. Used to determine refinement"
279 " type for each element if h-adaptivity is enabled.");
280 args.
AddOption(&normalization,
"-nor",
"--normalization",
"-no-nor",
281 "--no-normalization",
282 "Make all terms in the optimization functional unitless.");
283 args.
AddOption(&fdscheme,
"-fd",
"--fd_approximation",
284 "-no-fd",
"--no-fd-approx",
285 "Enable finite difference based derivative computations.");
286 args.
AddOption(&exactaction,
"-ex",
"--exact_action",
287 "-no-ex",
"--no-exact-action",
288 "Enable exact action of TMOP_Integrator.");
289 args.
AddOption(&integ_over_targ,
"-it",
"--integrate-target",
290 "-ir",
"--integrate-reference",
291 "Integrate over target (-it) or reference (-ir) element.");
292 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
293 "--no-visualization",
294 "Enable or disable GLVis visualization.");
295 args.
AddOption(&verbosity_level,
"-vl",
"--verbosity-level",
296 "Verbosity level for the involved iterative solvers:\n\t"
298 "1: Newton iterations\n\t"
299 "2: Newton iterations + linear solver summaries\n\t"
300 "3: newton iterations + linear solver iterations");
301 args.
AddOption(&adapt_eval,
"-ae",
"--adaptivity-evaluator",
302 "0 - Advection based (DEFAULT), 1 - GSLIB.");
303 args.
AddOption(&devopt,
"-d",
"--device",
304 "Device configuration string, see Device::Configure().");
305 args.
AddOption(&pa,
"-pa",
"--partial-assembly",
"-no-pa",
306 "--no-partial-assembly",
"Enable Partial Assembly.");
307 args.
AddOption(&n_hr_iter,
"-nhr",
"--n_hr_iter",
308 "Number of hr-adaptivity iterations.");
309 args.
AddOption(&n_h_iter,
"-nh",
"--n_h_iter",
310 "Number of h-adaptivity iterations per r-adaptivity"
312 args.
AddOption(&mesh_node_order,
"-mno",
"--mesh_node_ordering",
313 "Ordering of mesh nodes."
314 "0 (default): byNodes, 1: byVDIM");
315 args.
AddOption(&barrier_type,
"-btype",
"--barrier-type",
317 "1 - Shifted Barrier,"
318 "2 - Pseudo Barrier.");
319 args.
AddOption(&worst_case_type,
"-wctype",
"--worst-case-type",
323 args.
AddOption(&detj_bound,
"-db",
"--detj-bound",
324 "-no-db",
"--no-detj-bound",
325 "Enable or disable strict enforcement of positive Jacobian "
326 "determinants to guarantee mesh validity for tensor-product " "elements.");
335 if (h_metric_id < 0) { h_metric_id = metric_id; }
339 MFEM_VERIFY(strcmp(devopt,
"cpu")==0,
"HR-adaptivity is currently only"
340 " supported on cpus.");
346 Mesh *mesh =
new Mesh(mesh_file, 1, 1,
false);
353 const bool periodic = (s && s->IsDGSpace()) ?
true :
false;
360 if (mesh_poly_deg <= 0) { mesh_poly_deg = 2; }
392 for (
int i = 0; i < mesh->
GetNE(); i++)
398 for (
int j = 0; j < dofs.
Size(); j++)
400 h0(dofs[j]) = min(h0(dofs[j]), hi);
404 const real_t small_phys_size = pow(mesh_volume, 1.0 /
dim) / 100.0;
419 for (
int i = 0; i < fes_h1.
GetNDofs(); i++)
421 for (
int d = 0; d <
dim; d++)
429 for (
int i = 0; i < fes_h1.
GetNBE(); i++)
431 fespace->GetBdrElementVDofs(i, vdofs);
432 for (
int j = 0; j < vdofs.
Size(); j++) { rdm(vdofs[j]) = 0.0; }
461 ofstream mesh_ofs(
"perturbed.mesh");
462 mesh->
Print(mesh_ofs);
521 cout <<
"Unknown metric_id: " << metric_id << endl;
540 default: cout <<
"Metric_id not supported for h-adaptivity: " << h_metric_id <<
547 switch (barrier_type)
549 case 0: btype = TMOP_WorstCaseUntangleOptimizer_Metric::BarrierType::None;
551 case 1: btype = TMOP_WorstCaseUntangleOptimizer_Metric::BarrierType::Shifted;
553 case 2: btype = TMOP_WorstCaseUntangleOptimizer_Metric::BarrierType::Pseudo;
555 default: cout <<
"barrier_type not supported: " << barrier_type << endl;
560 switch (worst_case_type)
562 case 0: wctype = TMOP_WorstCaseUntangleOptimizer_Metric::WorstCaseType::None;
564 case 1: wctype = TMOP_WorstCaseUntangleOptimizer_Metric::WorstCaseType::Beta;
566 case 2: wctype = TMOP_WorstCaseUntangleOptimizer_Metric::WorstCaseType::PMean;
568 default: cout <<
"worst_case_type not supported: " << worst_case_type << endl;
573 if (barrier_type > 0 || worst_case_type > 0)
575 if (barrier_type > 0)
577 MFEM_VERIFY(metric_id == 4 || metric_id == 14 || metric_id == 66,
578 "Metric not supported for shifted/pseudo barriers.");
589 if (metric_id < 300 || h_metric_id < 300)
591 MFEM_VERIFY(
dim == 2,
"Incompatible metric for 3D meshes");
593 if (metric_id >= 300 || h_metric_id >= 300)
595 MFEM_VERIFY(
dim == 3,
"Incompatible metric for 2D meshes");
602 int ind_fec_order = (target_id >= 5 && target_id <= 8 && !fdscheme) ?
607 GridFunction size(&ind_fes), aspr(&ind_fes), ori(&ind_fes);
611 pa ? AssemblyLevel::PARTIAL : AssemblyLevel::LEGACY;
640 MFEM_ABORT(
"MFEM is not built with GSLIB.");
656 disc.ProjectCoefficient(mat_coeff);
666 MFEM_ABORT(
"MFEM is not built with GSLIB.");
674 disc.GetDerivative(1,0,d_x);
675 disc.GetDerivative(1,1,d_y);
678 for (
int i = 0; i < size.Size(); i++)
680 size(i) = std::pow(d_x(i),2)+std::pow(d_y(i),2);
682 const real_t max = size.Max();
684 for (
int i = 0; i < d_x.Size(); i++)
686 d_x(i) = std::abs(d_x(i));
687 d_y(i) = std::abs(d_y(i));
690 const real_t aspr_ratio = 20.0;
691 const real_t size_ratio = 40.0;
693 for (
int i = 0; i < size.Size(); i++)
695 size(i) = (size(i)/max);
696 aspr(i) = (d_x(i)+eps)/(d_y(i)+eps);
697 aspr(i) = 0.1 + 0.9*(1-size(i))*(1-size(i));
698 if (aspr(i) > aspr_ratio) {aspr(i) = aspr_ratio;}
699 if (aspr(i) < 1.0/aspr_ratio) {aspr(i) = 1.0/aspr_ratio;}
702 const int NE = mesh->
GetNE();
703 real_t volume = 0.0, volume_ind = 0.0;
705 for (
int i = 0; i < NE; i++)
710 size.GetValues(i, ir, vals);
720 const real_t avg_zone_size = volume / NE;
722 const real_t small_avg_ratio = (volume_ind + (volume - volume_ind) /
726 const real_t small_zone_size = small_avg_ratio * avg_zone_size;
727 const real_t big_zone_size = size_ratio * small_zone_size;
729 for (
int i = 0; i < size.Size(); i++)
731 const real_t val = size(i);
732 const real_t a = (big_zone_size - small_zone_size) / small_zone_size;
733 size(i) = big_zone_size / (1.0+
a*val);
758 MFEM_ABORT(
"MFEM is not built with GSLIB.");
781 MFEM_ABORT(
"MFEM is not built with GSLIB.");
786 size.ProjectCoefficient(size_coeff);
808 default: cout <<
"Unknown target_id: " << target_id << endl;
return 3;
810 if (target_c == NULL)
819 auto tmop_integ =
new TMOP_Integrator(metric_to_use, target_c, h_metric);
820 tmop_integ->IntegrateOverTarget(integ_over_targ);
821 if (barrier_type > 0 || worst_case_type > 0)
823 tmop_integ->ComputeUntangleMetricQuantiles(x, *fespace);
829 MFEM_VERIFY(pa ==
false,
"PA for finite differences is not implemented.");
830 tmop_integ->EnableFiniteDifferences(x);
832 tmop_integ->SetExactActionFlag(exactaction);
841 default: cout <<
"Unknown quad_type: " << quad_type << endl;
return 3;
843 tmop_integ->SetIntegrationRules(*irules, quad_order);
846 cout <<
"Triangle quadrature points: "
848 <<
"\nQuadrilateral quadrature points: "
853 cout <<
"Tetrahedron quadrature points: "
855 <<
"\nHexahedron quadrature points: "
857 <<
"\nPrism quadrature points: "
863 if (metric_combo && bal_expl_combo)
867 metric_combo->ComputeBalancedWeights(x, *target_c, bal_weights, pa, &ir);
868 metric_combo->SetWeights(bal_weights);
877 if (normalization) { dist = small_phys_size; }
879 if (lim_const != 0.0) { tmop_integ->EnableLimiting(x0, dist, lim_coeff); }
885 const real_t adapt_lim_const_2 = 0.5 * adapt_lim_const;
888 if (adapt_lim_const > 0.0)
895 if (adapt_eval == 0) { adapt_lim_eval =
new AdvectorCG(al); }
896 else if (adapt_eval == 1)
901 MFEM_ABORT(
"MFEM is not built with GSLIB support!");
904 else { MFEM_ABORT(
"Bad interpolation option."); }
909 z0[0] = &adapt_lim_gf0_1;
910 z0[1] = &adapt_lim_gf0_2;
911 coeff[0] = &adapt_lim_coeff_1;
912 coeff[1] = &adapt_lim_coeff_2;
915 tmop_integ->EnableAdaptiveLimiting(z0, coeff, *adapt_lim_eval, delta_max);
920 "Zeta0(1) - initial mesh", 300, 600, 300, 300);
922 "Zeta0(2) - initial mesh", 300, 900, 300, 300);
933 if (pa) {
a.SetAssemblyLevel(AssemblyLevel::PARTIAL); }
947 tmop_integ->SetCoefficient(*metric_coeff1);
962 else { tmop_integ2 =
new TMOP_Integrator(metric2, target_c, h_metric); }
971 if (lim_const != 0.0) { combo->
EnableLimiting(x0, dist, lim_coeff); }
973 a.AddDomainIntegrator(combo);
975 else {
a.AddDomainIntegrator(tmop_integ); }
977 if (pa) {
a.Setup(); }
983 tmop_integ->EnableNormalization(x0);
989 const int NE = mesh->
GetNE();
990 for (
int i = 0; i < NE; i++)
993 irules->
Get(fespace->GetFE(i)->GetGeomType(), quad_order);
998 min_detJ = min(min_detJ, transf->
Jacobian().
Det());
1001 cout <<
"Minimum det(J) of the original mesh is " << min_detJ << endl;
1003 if (min_detJ < 0.0 && barrier_type == 0
1004 && metric_id != 22 && metric_id != 211 && metric_id != 252
1005 && metric_id != 311 && metric_id != 313 && metric_id != 352)
1007 MFEM_ABORT(
"The input mesh is inverted! Try an untangling metric.");
1012 "Untangling is supported only for ideal targets.");
1016 min_detJ /= Wideal.
Det();
1019 min_detJ -= 0.01 * h0.
Min();
1023 if (periodic) { tmop_integ->SetInitialMeshPos(&x0); }
1024 const real_t init_energy =
a.GetGridFunctionEnergy(periodic ? dx : x) /
1025 (hradaptivity ? mesh->
GetNE() : 1);
1026 real_t init_metric_energy = init_energy;
1027 if (lim_const > 0.0 || adapt_lim_const > 0.0)
1032 init_metric_energy =
a.GetGridFunctionEnergy(periodic ? dx : x) /
1033 (hradaptivity ? mesh->
GetNE() : 1);
1035 adapt_lim_coeff_1.
constant = adapt_lim_const;
1036 adapt_lim_coeff_2.
constant = adapt_lim_const_2;
1043 char title[] =
"Initial metric values";
1052 if (move_bnd ==
false)
1056 a.SetEssentialBC(ess_bdr);
1061 for (
int i = 0; i < mesh->
GetNBE(); i++)
1065 MFEM_VERIFY(!(
dim == 2 && attr == 3),
1066 "Boundary attribute 3 must be used only for 3D meshes. "
1067 "Adjust the attributes (1/2/3/4 for fixed x/y/z/all "
1068 "components, rest for free nodes), or use -fix-bnd.");
1069 if (attr == 1 || attr == 2 || attr == 3) { n += nd; }
1070 if (attr == 4) { n += nd *
dim; }
1074 for (
int i = 0; i < mesh->
GetNBE(); i++)
1081 for (
int j = 0; j < nd; j++)
1082 { ess_vdofs[n++] = vdofs[j]; }
1086 for (
int j = 0; j < nd; j++)
1087 { ess_vdofs[n++] = vdofs[j+nd]; }
1091 for (
int j = 0; j < nd; j++)
1092 { ess_vdofs[n++] = vdofs[j+2*nd]; }
1096 for (
int j = 0; j < vdofs.
Size(); j++)
1097 { ess_vdofs[n++] = vdofs[j]; }
1100 a.SetEssentialVDofs(ess_vdofs);
1105 Solver *S = NULL, *S_prec = NULL;
1106#ifdef MFEM_USE_SINGLE
1107 const real_t linsol_rtol = 1e-5;
1109 const real_t linsol_rtol = 1e-12;
1113 if (verbosity_level == 2)
1115 if (verbosity_level > 2)
1117 if (lin_solver == 0)
1119 S =
new DSmoother(1, 1.0, max_lin_iter);
1121 else if (lin_solver == 1)
1124 cg->SetMaxIter(max_lin_iter);
1125 cg->SetRelTol(linsol_rtol);
1127 cg->SetPrintLevel(linsolver_print);
1137 if (lin_solver == 3 || lin_solver == 4)
1141 MFEM_VERIFY(lin_solver != 4,
"PA l1-Jacobi is not implemented");
1148 auto ds =
new DSmoother((lin_solver == 3) ? 0 : 1, 1.0, 1);
1172 if (solver_art_type > 0)
1178 const int bound_refs = 4;
1179 const int bound_recs = 4;
1195 x, move_bnd, hradaptivity,
1196 mesh_poly_deg, h_metric_id,
1197 n_hr_iter, n_h_iter);
1200 if (adapt_lim_const > 0.)
1211 ofstream mesh_ofs(
"optimized.mesh");
1212 mesh_ofs.precision(14);
1213 mesh->
Print(mesh_ofs);
1223 if (periodic) { tmop_integ->SetInitialMeshPos(&x0); }
1224 const real_t fin_energy =
a.GetGridFunctionEnergy(periodic ? dx : x) /
1225 (hradaptivity ? mesh->
GetNE() : 1);
1226 real_t fin_metric_energy = fin_energy;
1227 if (lim_const > 0.0 || adapt_lim_const > 0.0)
1232 fin_metric_energy =
a.GetGridFunctionEnergy(periodic ? dx : x) /
1233 (hradaptivity ? mesh->
GetNE() : 1);
1235 adapt_lim_coeff_1.
constant = adapt_lim_const;
1236 adapt_lim_coeff_2.
constant = adapt_lim_const_2;
1238 std::cout << std::scientific << std::setprecision(4);
1239 cout <<
"Initial strain energy: " << init_energy
1240 <<
" = metrics: " << init_metric_energy
1241 <<
" + extra terms: " << init_energy - init_metric_energy << endl;
1242 cout <<
" Final strain energy: " << fin_energy
1243 <<
" = metrics: " << fin_metric_energy
1244 <<
" + extra terms: " << fin_energy - fin_metric_energy << endl;
1245 cout <<
"The strain energy decreased by: "
1246 << (init_energy - fin_energy) * 100.0 / init_energy <<
" %." << endl;
1251 char title[] =
"Final metric values";
1255 if (adapt_lim_const > 0.0 && visualization)
1259 "Zeta0(1) - final mesh", 600, 600, 300, 300);
1261 "Zeta0(2) - final mesh", 600, 900, 300, 300);
1268 sock <<
"solution\n";
1273 sock <<
"window_title 'Displacements'\n"
1274 <<
"window_geometry "
1275 << 1200 <<
" " << 0 <<
" " << 600 <<
" " << 600 <<
"\n"
1276 <<
"keys jRmclA" << endl;
1283 delete metric_coeff1;
1284 delete adapt_lim_eval;
1286 delete hr_adapt_coeff;
1290 delete untangler_metric;
virtual void SetAnalyticTargetSpec(Coefficient *sspec, VectorCoefficient *vspec, TMOPMatrixCoefficient *mspec)
T Max() const
Find the maximal element in the array, using the comparison operator < for class T.
int Size() const
Return the logical size of the array.
@ GaussLobatto
Closed type.
Conjugate gradient method.
A coefficient that is constant across space and time.
Jacobi-type diagonal smoother of a sparse matrix.
void SetPositiveDiagonal(bool pos_diag=true)
Replace diagonal entries with their absolute values. Relevant only with JacobiType::JACOBI.
Data type dense matrix using column-major storage.
The MFEM Device class abstracts hardware devices such as GPUs, as well as programming models such as ...
void Print(std::ostream &os=mfem::out)
Print the configuration of the MFEM virtual device object.
virtual void SetSerialDiscreteTargetAspectRatio(const GridFunction &tspec_)
void SetMinSizeForTargets(real_t min_size_)
virtual void SetSerialDiscreteTargetSize(const GridFunction &tspec_)
void SetAdaptivityEvaluator(AdaptivityEvaluator *ae)
virtual void SetSerialDiscreteTargetOrientation(const GridFunction &tspec_)
int GetAttribute() const
Return element's attribute.
Collection of finite elements from the same family in multiple dimensions. This class is used to matc...
Class FiniteElementSpace - responsible for providing FEM view of the mesh, mainly managing the set of...
const FiniteElement * GetBE(int i) const
Returns pointer to the FiniteElement in the FiniteElementCollection associated with i'th boundary fac...
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...
int GetNDofs() const
Returns number of degrees of freedom. This is the number of Local Degrees of Freedom.
int GetNBE() const
Returns number of boundary elements in the mesh.
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...
int DofToVDof(int dof, int vd, int ndofs=-1) const
Compute a single vdof corresponding to the index dof and the vector index vd.
int GetDof() const
Returns the number of degrees of freedom in the finite element.
A general function coefficient.
const DenseMatrix & GetGeomToPerfGeomJac(int GeomType) const
Class for grid function - Vector with associated FE space.
virtual void Save(std::ostream &out) const
Save the GridFunction to an output stream.
void SetFromTrueVector()
Shortcut for calling SetFromTrueDofs() with GetTrueVector() as argument.
virtual void ProjectCoefficient(Coefficient &coeff, ProjectType type=ProjectType::DEFAULT)
Project coeff Coefficient to this GridFunction. The projection computation depends on the choice of t...
void ProjectGridFunction(const GridFunction &src)
Project the src GridFunction to this GridFunction, both of which must be on the same mesh.
Arbitrary order H1-conforming (continuous) finite elements.
Class for integration point with weight.
Class for an integration rule - an Array of IntegrationPoint.
int GetNPoints() const
Returns the number of the points in the integration rule.
IntegrationPoint & IntPoint(int i)
Returns a reference to the i-th integration point.
Container class for integration rules.
const IntegrationRule & Get(int GeomType, int Order)
Returns an integration rule for given GeomType and Order.
void SetRelTol(real_t rtol)
virtual void SetPrintLevel(int print_lvl)
Legacy method to set the level of verbosity of the solver output.
void SetMaxIter(int max_it)
void SetAbsTol(real_t atol)
Arbitrary order "L2-conforming" discontinuous finite elements.
void SetPreconditioner(Solver &pr) override
This should be called before SetOperator.
Array< int > bdr_attributes
A list of all unique boundary attributes used by the Mesh.
const FiniteElementSpace * GetNodalFESpace() const
Geometry::Type GetTypicalElementGeometry() const
If the local mesh is not empty, return GetElementGeometry(0); otherwise, return a typical Geometry pr...
virtual void Print(std::ostream &os=mfem::out, const std::string &comments="") const
Print the mesh to the given stream using the default MFEM mesh format.
int GetNE() const
Returns number of elements.
int Dimension() const
Dimension of the reference space used within the elements.
const Element * GetBdrElement(int i) const
Return pointer to the i'th boundary element object.
real_t GetElementSize(int i, int type=0)
Get the size of the i-th element relative to the perfect reference element.
void GetElementTransformation(int i, IsoparametricTransformation *ElTr) const
Builds the transformation defining the i-th element in ElTr. ElTr must be allocated in advance and wi...
void SetNodalGridFunction(GridFunction *nodes, bool make_owner=false)
real_t GetElementVolume(int i)
virtual void SetNodalFESpace(FiniteElementSpace *nfes)
int GetNBE() const
Returns number of boundary elements.
void EnsureNCMesh(bool simplices_nonconforming=false)
void UniformRefinement(int i, const DSTable &, int *, int *, int *)
Geometry::Type GetElementBaseGeometry(int i) const
void SetAdaptiveLinRtol(const int type=2, const real_t rtol0=0.5, const real_t rtol_max=0.9, const real_t alpha=0.5 *(1.0+sqrt(5.0)), const real_t gamma=1.0)
Enable adaptive linear solver relative tolerance algorithm.
Jacobi smoothing for a given bilinear form (no matrix necessary).
void SetPositiveDiagonal(bool pos_diag=true)
Replace diagonal entries with their absolute values.
void Parse()
Parse the command-line options. Note that this function expects all the options provided through the ...
void PrintUsage(std::ostream &out) const
Print the usage message.
void PrintOptions(std::ostream &out) const
Print the options.
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...
bool Good() const
Return true if the command line options were parsed successfully.
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.
void EnableNormalization(const GridFunction &x)
Normalization factor that considers all integrators in the combination.
void AddTMOPIntegrator(TMOP_Integrator *ti)
Adds a new TMOP_Integrator to the combination.
void AddGridFunctionForUpdate(GridFunction *gf)
void AddFESpaceForUpdate(FiniteElementSpace *fes)
void SetPreconditioner(Solver &pr) override
This should be called before SetOperator.
void EnsurePositiveDeterminantBound(Mesh &mesh, int ref_factor, int max_recursion_depth=0)
Ensure a positive lower bound for the Jacobian determinant in tensor-product elements during line-sea...
void SetIntegrationRules(IntegrationRules &irules, int order)
Prescribe a set of integration rules; relevant for mixed meshes.
void SetMinDetPtr(real_t *md_ptr)
2D barrier Shape+Size+Orientation (VOS) metric (polyconvex).
2D barrier Size+Skew (VQ) metric.
2D barrier Shape+Orientation (OS) metric (polyconvex).
2D barrier Shape+Size (VS) metric (polyconvex).
A TMOP integrator class based on any given TMOP_QualityMetric and TargetConstructor.
void SetExactActionFlag(bool flag_)
Flag to control if exact action of Integration is effected.
void SetCoefficient(Coefficient &w1)
Sets a scaling Coefficient for the quality metric term of the integrator.
void EnableFiniteDifferences(const GridFunction &x)
Enables FD-based approximation and computes dx.
void SetIntegrationRules(IntegrationRules &irules, int order)
Prescribe a set of integration rules; relevant for mixed meshes.
void IntegrateOverTarget(bool integ_over_target_)
2D non-barrier metric without a type.
2D barrier Shape+Size (VS) metric (not polyconvex).
2D barrier Shape+Size (VS) metric (not polyconvex).
2D non-barrier Shape+Size+Orientation (VOS) metric (polyconvex).
2D Shifted barrier form of shape metric (mu_2).
2D barrier shape (S) metric (not polyconvex).
2D barrier Shape+Orientation (OS) metric (polyconvex).
2D compound barrier Shape+Size (VS) metric (balanced).
2D compound barrier Shape+Size (VS) metric (balanced).
2D barrier Shape+Size+Orientation (VOS) metric (polyconvex).
3D barrier Shape (S) metric, well-posed (polyconvex & invex).
3D barrier Shape (S) metric, well-posed (polyconvex & invex).
3D barrier Shape (S) metric, well-posed (polyconvex & invex).
3D barrier Shape (S) metric, well-posed (polyconvex & invex).
3D Shape (S) metric, untangling version of 303.
3D barrier Shape+Size (VS) metric, well-posed (invex).
3D barrier Shape+Size (VS) metric, well-posed (invex).
3D barrier Shape+Size (VS) metric, well-posed (invex).
3D compound barrier Shape+Size (VS) metric (polyconvex, balanced).
3D compound barrier Shape+Size (VS) metric (polyconvex).
3D barrier Shape+Size (VS) metric, well-posed (polyconvex).
3D barrier Shape+Size (VS) metric, well-posed (polyconvex).
3D compound barrier Shape+Size (VS) metric (polyconvex, balanced).
3D barrier Shape+Size (VS) metric, well-posed (polyconvex).
3D non-barrier Shape (S) metric.
Abstract class for local mesh quality metrics in the target-matrix optimization paradigm (TMOP) by P....
Base class representing target-matrix construction algorithms for mesh optimization via the target-ma...
void SetVolumeScale(real_t vol_scale)
Used by target type IDEAL_SHAPE_EQUAL_SIZE. The default volume scale is 1.
void SetNodes(const GridFunction &n)
Set the nodes to be used in the target-matrix construction.
TargetType
Target-matrix construction algorithms supported by this class.
A general vector function coefficient.
void Randomize(int seed=0)
Set random values in the vector.
virtual real_t * HostReadWrite()
Shortcut for mfem::ReadWrite(vec.GetMemory(), vec.Size(), false).
real_t Min() const
Returns the minimal element of the vector.
real_t adapt_lim_fun(const Vector &x)
IntegrationRules IntRulesCU(0, Quadrature1D::ClosedUniform)
real_t weight_fun(const Vector &x)
real_t adapt_lim_fun2(const Vector &x)
real_t material_indicator_2d(const Vector &x)
IntegrationRules IntRulesLo(0, Quadrature1D::GaussLobatto)
void ConstructSizeGF(GridFunction &size)
real_t discrete_ori_2d(const Vector &x)
void discrete_aspr_3d(const Vector &x, Vector &v)
void VisualizeMesh(socketstream &sock, const char *vishost, int visport, Mesh &mesh, const char *title, int x, int y, int w, int h, const char *keys)
void DiffuseField(ParGridFunction &field, int smooth_steps)
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)
AssemblyLevel
Enumeration defining the assembly level for bilinear and nonlinear form classes derived from Operator...
void vis_tmop_metric_s(int order, TMOP_QualityMetric &qm, const TargetConstructor &tc, Mesh &mesh, char *title, int position)
constexpr real_t infinity()
Define a shortcut for std::numeric_limits<double>::infinity()
IntegrationRules IntRules(0, Quadrature1D::GaussLegendre)
A global object with all integration rules (defined in intrules.cpp)
Settings for the output behavior of the IterativeSolver.
PrintLevel & Iterations()
PrintLevel & FirstAndLast()