111 #include "../common/mfem-common.hpp" 116 using namespace mfem;
119 int main (
int argc,
char *argv[])
127 const char *mesh_file =
"icf.mesh";
128 int mesh_poly_deg = 1;
134 double lim_const = 0.0;
135 double adapt_lim_const = 0.0;
139 int solver_iter = 20;
140 double solver_rtol = 1e-10;
141 int solver_art_type = 0;
143 int max_lin_iter = 100;
144 bool move_bnd =
true;
146 bool bal_expl_combo =
false;
147 bool hradaptivity =
false;
148 int h_metric_id = -1;
149 bool normalization =
false;
150 bool visualization =
true;
151 int verbosity_level = 0;
152 bool fdscheme =
false;
154 bool exactaction =
false;
155 bool integ_over_targ =
true;
156 const char *devopt =
"cpu";
160 int mesh_node_ordering = 0;
161 int barrier_type = 0;
162 int worst_case_type = 0;
166 args.
AddOption(&mesh_file,
"-m",
"--mesh",
167 "Mesh file to use.");
168 args.
AddOption(&mesh_poly_deg,
"-o",
"--order",
169 "Polynomial degree of mesh finite element space.");
170 args.
AddOption(&rs_levels,
"-rs",
"--refine-serial",
171 "Number of times to refine the mesh uniformly in serial.");
172 args.
AddOption(&rp_levels,
"-rp",
"--refine-parallel",
173 "Number of times to refine the mesh uniformly in parallel.");
174 args.
AddOption(&jitter,
"-ji",
"--jitter",
175 "Random perturbation scaling factor.");
176 args.
AddOption(&metric_id,
"-mid",
"--metric-id",
177 "Mesh optimization metric:\n\t" 179 "1 : |T|^2 -- 2D no type\n\t" 180 "2 : 0.5|T|^2/tau-1 -- 2D shape (condition number)\n\t" 181 "7 : |T-T^-t|^2 -- 2D shape+size\n\t" 182 "9 : tau*|T-T^-t|^2 -- 2D shape+size\n\t" 183 "14 : |T-I|^2 -- 2D shape+size+orientation\n\t" 184 "22 : 0.5(|T|^2-2*tau)/(tau-tau_0) -- 2D untangling\n\t" 185 "50 : 0.5|T^tT|^2/tau^2-1 -- 2D shape\n\t" 186 "55 : (tau-1)^2 -- 2D size\n\t" 187 "56 : 0.5(sqrt(tau)-1/sqrt(tau))^2 -- 2D size\n\t" 188 "58 : |T^tT|^2/(tau^2)-2*|T|^2/tau+2 -- 2D shape\n\t" 189 "77 : 0.5(tau-1/tau)^2 -- 2D size\n\t" 190 "80 : (1-gamma)mu_2 + gamma mu_77 -- 2D shape+size\n\t" 191 "85 : |T-|T|/sqrt(2)I|^2 -- 2D shape+orientation\n\t" 192 "90 : balanced combo mu_50 & mu_77 -- 2D shape+size\n\t" 193 "94 : balanced combo mu_2 & mu_56 -- 2D shape+size\n\t" 194 "98 : (1/tau)|T-I|^2 -- 2D shape+size+orientation\n\t" 197 "301: (|T||T^-1|)/3-1 -- 3D shape\n\t" 198 "302: (|T|^2|T^-1|^2)/9-1 -- 3D shape\n\t" 199 "303: (|T|^2)/3/tau^(2/3)-1 -- 3D shape\n\t" 200 "304: (|T|^3)/3^{3/2}/tau-1 -- 3D shape\n\t" 202 "313: (|T|^2)(tau-tau0)^(-2/3)/3 -- 3D untangling\n\t" 203 "315: (tau-1)^2 -- 3D no type\n\t" 204 "316: 0.5(sqrt(tau)-1/sqrt(tau))^2 -- 3D no type\n\t" 205 "321: |T-T^-t|^2 -- 3D shape+size\n\t" 206 "322: |T-adjT^-t|^2 -- 3D shape+size\n\t" 207 "323: |J|^3-3sqrt(3)ln(det(J))-3sqrt(3) -- 3D shape+size\n\t" 208 "328: balanced combo mu_301 & mu_316 -- 3D shape+size\n\t" 209 "332: (1-gamma) mu_302 + gamma mu_315 -- 3D shape+size\n\t" 210 "333: (1-gamma) mu_302 + gamma mu_316 -- 3D shape+size\n\t" 211 "334: (1-gamma) mu_303 + gamma mu_316 -- 3D shape+size\n\t" 212 "328: balanced combo mu_302 & mu_318 -- 3D shape+size\n\t" 213 "347: (1-gamma) mu_304 + gamma mu_316 -- 3D shape+size\n\t" 215 "360: (|T|^3)/3^{3/2}-tau -- 3D shape\n\t" 217 "11 : (1/4*alpha)|A-(adjA)^T(W^TW)/omega|^2 -- 2D shape\n\t" 218 "36 : (1/alpha)|A-W|^2 -- 2D shape+size+orientation\n\t" 219 "107: (1/2*alpha)|A-|A|/|W|W|^2 -- 2D shape+orientation\n\t" 220 "126: (1-gamma)nu_11 + gamma*nu_14a -- 2D shape+size\n\t" 222 args.
AddOption(&target_id,
"-tid",
"--target-id",
223 "Target (ideal element) type:\n\t" 224 "1: Ideal shape, unit size\n\t" 225 "2: Ideal shape, equal size\n\t" 226 "3: Ideal shape, initial size\n\t" 227 "4: Given full analytic Jacobian (in physical space)\n\t" 228 "5: Ideal shape, given size (in physical space)");
229 args.
AddOption(&lim_const,
"-lc",
"--limit-const",
"Limiting constant.");
230 args.
AddOption(&adapt_lim_const,
"-alc",
"--adapt-limit-const",
231 "Adaptive limiting coefficient constant.");
232 args.
AddOption(&quad_type,
"-qt",
"--quad-type",
233 "Quadrature rule type:\n\t" 234 "1: Gauss-Lobatto\n\t" 235 "2: Gauss-Legendre\n\t" 236 "3: Closed uniform points");
237 args.
AddOption(&quad_order,
"-qo",
"--quad_order",
238 "Order of the quadrature rule.");
239 args.
AddOption(&solver_type,
"-st",
"--solver-type",
240 " Type of solver: (default) 0: Newton, 1: LBFGS");
241 args.
AddOption(&solver_iter,
"-ni",
"--newton-iters",
242 "Maximum number of Newton iterations.");
243 args.
AddOption(&solver_rtol,
"-rtol",
"--newton-rel-tolerance",
244 "Relative tolerance for the Newton solver.");
245 args.
AddOption(&solver_art_type,
"-art",
"--adaptive-rel-tol",
246 "Type of adaptive relative linear solver tolerance:\n\t" 247 "0: None (default)\n\t" 248 "1: Eisenstat-Walker type 1\n\t" 249 "2: Eisenstat-Walker type 2");
250 args.
AddOption(&lin_solver,
"-ls",
"--lin-solver",
255 "3: MINRES + Jacobi preconditioner\n\t" 256 "4: MINRES + l1-Jacobi preconditioner");
257 args.
AddOption(&max_lin_iter,
"-li",
"--lin-iter",
258 "Maximum number of iterations in the linear solve.");
259 args.
AddOption(&move_bnd,
"-bnd",
"--move-boundary",
"-fix-bnd",
261 "Enable motion along horizontal and vertical boundaries.");
262 args.
AddOption(&combomet,
"-cmb",
"--combo-type",
263 "Combination of metrics options:\n\t" 264 "0: Use single metric\n\t" 265 "1: Shape + space-dependent size given analytically\n\t" 266 "2: Shape + adapted size given discretely; shared target");
267 args.
AddOption(&bal_expl_combo,
"-bec",
"--balance-explicit-combo",
268 "-no-bec",
"--balance-explicit-combo",
269 "Automatic balancing of explicit combo metrics.");
270 args.
AddOption(&hradaptivity,
"-hr",
"--hr-adaptivity",
"-no-hr",
271 "--no-hr-adaptivity",
272 "Enable hr-adaptivity.");
273 args.
AddOption(&h_metric_id,
"-hmid",
"--h-metric",
274 "Same options as metric_id. Used to determine refinement" 275 " type for each element if h-adaptivity is enabled.");
276 args.
AddOption(&normalization,
"-nor",
"--normalization",
"-no-nor",
277 "--no-normalization",
278 "Make all terms in the optimization functional unitless.");
279 args.
AddOption(&fdscheme,
"-fd",
"--fd_approximation",
280 "-no-fd",
"--no-fd-approx",
281 "Enable finite difference based derivative computations.");
282 args.
AddOption(&exactaction,
"-ex",
"--exact_action",
283 "-no-ex",
"--no-exact-action",
284 "Enable exact action of TMOP_Integrator.");
285 args.
AddOption(&integ_over_targ,
"-it",
"--integrate-target",
286 "-ir",
"--integrate-reference",
287 "Integrate over target (-it) or reference (-ir) element.");
288 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
289 "--no-visualization",
290 "Enable or disable GLVis visualization.");
291 args.
AddOption(&verbosity_level,
"-vl",
"--verbosity-level",
292 "Verbosity level for the involved iterative solvers:\n\t" 294 "1: Newton iterations\n\t" 295 "2: Newton iterations + linear solver summaries\n\t" 296 "3: newton iterations + linear solver iterations");
297 args.
AddOption(&adapt_eval,
"-ae",
"--adaptivity-evaluator",
298 "0 - Advection based (DEFAULT), 1 - GSLIB.");
299 args.
AddOption(&devopt,
"-d",
"--device",
300 "Device configuration string, see Device::Configure().");
301 args.
AddOption(&pa,
"-pa",
"--partial-assembly",
"-no-pa",
302 "--no-partial-assembly",
"Enable Partial Assembly.");
303 args.
AddOption(&n_hr_iter,
"-nhr",
"--n_hr_iter",
304 "Number of hr-adaptivity iterations.");
305 args.
AddOption(&n_h_iter,
"-nh",
"--n_h_iter",
306 "Number of h-adaptivity iterations per r-adaptivity" 308 args.
AddOption(&mesh_node_ordering,
"-mno",
"--mesh_node_ordering",
309 "Ordering of mesh nodes." 310 "0 (default): byNodes, 1: byVDIM");
311 args.
AddOption(&barrier_type,
"-btype",
"--barrier-type",
313 "1 - Shifted Barrier," 314 "2 - Pseudo Barrier.");
315 args.
AddOption(&worst_case_type,
"-wctype",
"--worst-case-type",
327 if (h_metric_id < 0) { h_metric_id = metric_id; }
331 MFEM_VERIFY(strcmp(devopt,
"cpu")==0,
"HR-adaptivity is currently only" 332 " supported on cpus.");
335 if (myid == 0) { device.
Print();}
338 Mesh *mesh =
new Mesh(mesh_file, 1, 1,
false);
339 for (
int lev = 0; lev < rs_levels; lev++)
348 for (
int lev = 0; lev < rp_levels; lev++)
358 if (mesh_poly_deg <= 0)
385 double vol_loc = 0.0;
387 for (
int i = 0; i < pmesh->
GetNE(); i++)
393 for (
int j = 0; j < dofs.
Size(); j++)
395 h0(dofs[j]) = min(h0(dofs[j]), hi);
400 MPI_Allreduce(&vol_loc, &vol_glb, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
401 const double small_phys_size = pow(vol_glb, 1.0 /
dim) / 100.0;
414 for (
int i = 0; i < pfespace->
GetNDofs(); i++)
416 for (
int d = 0; d <
dim; d++)
422 for (
int i = 0; i < pfespace->
GetNBE(); i++)
427 for (
int j = 0; j < vdofs.
Size(); j++) { rdm(vdofs[j]) = 0.0; }
438 ostringstream mesh_name;
439 mesh_name <<
"perturbed.mesh";
440 ofstream mesh_ofs(mesh_name.str().c_str());
441 mesh_ofs.precision(8);
450 double min_detJ = -0.1;
500 if (myid == 0) { cout <<
"Unknown metric_id: " << metric_id << endl; }
519 default: cout <<
"Metric_id not supported for h-adaptivity: " << h_metric_id <<
526 switch (barrier_type)
534 default: cout <<
"barrier_type not supported: " << barrier_type << endl;
539 switch (worst_case_type)
547 default: cout <<
"worst_case_type not supported: " << worst_case_type << endl;
552 if (barrier_type > 0 || worst_case_type > 0)
554 if (barrier_type > 0)
556 MFEM_VERIFY(metric_id == 4 || metric_id == 14 || metric_id == 66,
557 "Metric not supported for shifted/pseudo barriers.");
568 if (metric_id < 300 || h_metric_id < 300)
570 MFEM_VERIFY(
dim == 2,
"Incompatible metric for 3D meshes");
572 if (metric_id >= 300 || h_metric_id >= 300)
574 MFEM_VERIFY(
dim == 3,
"Incompatible metric for 2D meshes");
614 #ifdef MFEM_USE_GSLIB 617 MFEM_ABORT(
"MFEM is not built with GSLIB.");
632 disc.ProjectCoefficient(mat_coeff);
639 #ifdef MFEM_USE_GSLIB 642 MFEM_ABORT(
"MFEM is not built with GSLIB.");
649 disc.GetDerivative(1,0,d_x);
650 disc.GetDerivative(1,1,d_y);
653 for (
int i = 0; i < size.Size(); i++)
655 size(i) = std::pow(d_x(i),2)+std::pow(d_y(i),2);
657 const double max = size.Max();
659 MPI_Allreduce(&max, &max_all, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);
661 for (
int i = 0; i < d_x.Size(); i++)
663 d_x(i) = std::abs(d_x(i));
664 d_y(i) = std::abs(d_y(i));
666 const double eps = 0.01;
667 const double aspr_ratio = 20.0;
668 const double size_ratio = 40.0;
670 for (
int i = 0; i < size.Size(); i++)
672 size(i) = (size(i)/max_all);
673 aspr(i) = (d_x(i)+eps)/(d_y(i)+eps);
674 aspr(i) = 0.1 + 0.9*(1-size(i))*(1-size(i));
675 if (aspr(i) > aspr_ratio) {aspr(i) = aspr_ratio;}
676 if (aspr(i) < 1.0/aspr_ratio) {aspr(i) = 1.0/aspr_ratio;}
679 const int NE = pmesh->
GetNE();
680 double volume = 0.0, volume_ind = 0.0;
682 for (
int i = 0; i < NE; i++)
687 size.GetValues(i, ir, vals);
696 double volume_all, volume_ind_all;
697 MPI_Allreduce(&volume, &volume_all, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
698 MPI_Allreduce(&volume_ind, &volume_ind_all, 1, MPI_DOUBLE, MPI_SUM,
702 const double avg_zone_size = volume_all / NE_ALL;
704 const double small_avg_ratio =
705 (volume_ind_all + (volume_all - volume_ind_all) / size_ratio)
708 const double small_zone_size = small_avg_ratio * avg_zone_size;
709 const double big_zone_size = size_ratio * small_zone_size;
711 for (
int i = 0; i < size.Size(); i++)
713 const double val = size(i);
714 const double a = (big_zone_size - small_zone_size) / small_zone_size;
715 size(i) = big_zone_size / (1.0+
a*val);
736 #ifdef MFEM_USE_GSLIB 739 MFEM_ABORT(
"MFEM is not built with GSLIB.");
758 #ifdef MFEM_USE_GSLIB 761 MFEM_ABORT(
"MFEM is not built with GSLIB.");
766 size.ProjectCoefficient(size_coeff);
788 if (myid == 0) { cout <<
"Unknown target_id: " << target_id << endl; }
791 if (target_c == NULL)
799 if (metric_combo && bal_expl_combo)
802 metric_combo->ComputeBalancedWeights(x, *target_c, bal_weights);
803 metric_combo->SetWeights(bal_weights);
809 auto tmop_integ =
new TMOP_Integrator(metric_to_use, target_c, h_metric);
810 tmop_integ->IntegrateOverTarget(integ_over_targ);
811 if (barrier_type > 0 || worst_case_type > 0)
813 tmop_integ->ComputeUntangleMetricQuantiles(x, *pfespace);
819 MFEM_VERIFY(pa ==
false,
"PA for finite differences is not implemented.");
820 tmop_integ->EnableFiniteDifferences(x);
822 tmop_integ->SetExactActionFlag(exactaction);
832 if (myid == 0) { cout <<
"Unknown quad_type: " << quad_type << endl; }
835 tmop_integ->SetIntegrationRules(*irules, quad_order);
836 if (myid == 0 &&
dim == 2)
838 cout <<
"Triangle quadrature points: " 840 <<
"\nQuadrilateral quadrature points: " 843 if (myid == 0 &&
dim == 3)
845 cout <<
"Tetrahedron quadrature points: " 847 <<
"\nHexahedron quadrature points: " 849 <<
"\nPrism quadrature points: " 859 if (normalization) { dist = small_phys_size; }
861 if (lim_const != 0.0) { tmop_integ->EnableLimiting(x0, dist, lim_coeff); }
867 if (adapt_lim_const > 0.0)
869 MFEM_VERIFY(pa ==
false,
"PA is not implemented for adaptive limiting");
874 if (adapt_eval == 0) { adapt_lim_eval =
new AdvectorCG(al); }
875 else if (adapt_eval == 1)
877 #ifdef MFEM_USE_GSLIB 880 MFEM_ABORT(
"MFEM is not built with GSLIB support!");
883 else { MFEM_ABORT(
"Bad interpolation option."); }
885 tmop_integ->EnableAdaptiveLimiting(adapt_lim_gf0, adapt_lim_coeff,
897 if (normalization) { tmop_integ->ParEnableNormalization(x0); }
917 tmop_integ->SetCoefficient(*metric_coeff1);
932 else { tmop_integ2 =
new TMOP_Integrator(metric2, target_c, h_metric); }
942 if (lim_const != 0.0) { combo->
EnableLimiting(x0, dist, lim_coeff); }
944 a.AddDomainIntegrator(combo);
948 a.AddDomainIntegrator(tmop_integ);
951 if (pa) {
a.Setup(); }
955 const int NE = pmesh->
GetNE();
956 for (
int i = 0; i < NE; i++)
964 min_detJ = min(min_detJ, transf->
Jacobian().
Det());
968 MPI_Allreduce(&min_detJ, &minJ0, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);
971 { cout <<
"Minimum det(J) of the original mesh is " << min_detJ << endl; }
973 if (min_detJ < 0.0 && barrier_type == 0
974 && metric_id != 22 && metric_id != 211 && metric_id != 252
975 && metric_id != 311 && metric_id != 313 && metric_id != 352)
977 MFEM_ABORT(
"The input mesh is inverted! Try an untangling metric.");
982 "Untangling is supported only for ideal targets.");
986 min_detJ /= Wideal.
Det();
988 double h0min = h0.Min(), h0min_all;
989 MPI_Allreduce(&h0min, &h0min_all, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);
991 min_detJ -= 0.01 * h0min_all;
995 const double init_energy =
a.GetParGridFunctionEnergy(x) /
997 double init_metric_energy = init_energy;
998 if (lim_const > 0.0 || adapt_lim_const > 0.0)
1002 init_metric_energy =
a.GetParGridFunctionEnergy(x) /
1005 adapt_lim_coeff.
constant = adapt_lim_const;
1012 char title[] =
"Initial metric values";
1020 if (move_bnd ==
false)
1024 a.SetEssentialBC(ess_bdr);
1029 for (
int i = 0; i < pmesh->
GetNBE(); i++)
1033 MFEM_VERIFY(!(
dim == 2 && attr == 3),
1034 "Boundary attribute 3 must be used only for 3D meshes. " 1035 "Adjust the attributes (1/2/3/4 for fixed x/y/z/all " 1036 "components, rest for free nodes), or use -fix-bnd.");
1037 if (attr == 1 || attr == 2 || attr == 3) { n += nd; }
1038 if (attr == 4) { n += nd *
dim; }
1042 for (
int i = 0; i < pmesh->
GetNBE(); i++)
1049 for (
int j = 0; j < nd; j++)
1050 { ess_vdofs[n++] = vdofs[j]; }
1054 for (
int j = 0; j < nd; j++)
1055 { ess_vdofs[n++] = vdofs[j+nd]; }
1059 for (
int j = 0; j < nd; j++)
1060 { ess_vdofs[n++] = vdofs[j+2*nd]; }
1064 for (
int j = 0; j < vdofs.
Size(); j++)
1065 { ess_vdofs[n++] = vdofs[j]; }
1068 a.SetEssentialVDofs(ess_vdofs);
1073 Solver *S = NULL, *S_prec = NULL;
1074 const double linsol_rtol = 1e-12;
1077 if (verbosity_level == 2)
1079 if (verbosity_level > 2)
1081 if (lin_solver == 0)
1083 S =
new DSmoother(1, 1.0, max_lin_iter);
1085 else if (lin_solver == 1)
1101 if (lin_solver == 3 || lin_solver == 4)
1105 MFEM_VERIFY(lin_solver != 4,
"PA l1-Jacobi is not implemented");
1115 hs->SetPositiveDiagonal(
true);
1132 if (solver_type == 0) { solver.SetPreconditioner(*S); }
1134 solver.SetMinDetPtr(&min_detJ);
1135 solver.SetMaxIter(solver_iter);
1136 solver.SetRelTol(solver_rtol);
1137 solver.SetAbsTol(0.0);
1138 if (solver_art_type > 0)
1140 solver.SetAdaptiveLinRtol(solver_art_type, 0.5, 0.9);
1144 if (verbosity_level > 0)
1146 solver.SetPrintLevel(newton_print);
1155 x, move_bnd, hradaptivity,
1156 mesh_poly_deg, h_metric_id,
1157 n_hr_iter, n_h_iter);
1159 if (adapt_lim_const > 0.)
1169 ostringstream mesh_name;
1170 mesh_name <<
"optimized.mesh";
1171 ofstream mesh_ofs(mesh_name.str().c_str());
1172 mesh_ofs.precision(8);
1177 const double fin_energy =
a.GetParGridFunctionEnergy(x) /
1179 double fin_metric_energy = fin_energy;
1180 if (lim_const > 0.0 || adapt_lim_const > 0.0)
1184 fin_metric_energy =
a.GetParGridFunctionEnergy(x) /
1187 adapt_lim_coeff.
constant = adapt_lim_const;
1191 std::cout << std::scientific << std::setprecision(4);
1192 cout <<
"Initial strain energy: " << init_energy
1193 <<
" = metrics: " << init_metric_energy
1194 <<
" + extra terms: " << init_energy - init_metric_energy << endl;
1195 cout <<
" Final strain energy: " << fin_energy
1196 <<
" = metrics: " << fin_metric_energy
1197 <<
" + extra terms: " << fin_energy - fin_metric_energy << endl;
1198 cout <<
"The strain energy decreased by: " 1199 << (init_energy - fin_energy) * 100.0 / init_energy <<
" %." << endl;
1205 char title[] =
"Final metric values";
1209 if (adapt_lim_const > 0.0 && visualization)
1213 600, 600, 300, 300);
1223 sock.
open(
"localhost", 19916);
1224 sock <<
"solution\n";
1230 sock <<
"window_title 'Displacements'\n" 1231 <<
"window_geometry " 1232 << 1200 <<
" " << 0 <<
" " << 600 <<
" " << 600 <<
"\n" 1233 <<
"keys jRmclA" << endl;
1241 delete metric_coeff1;
1242 delete adapt_lim_eval;
1244 delete hr_adapt_coeff;
1248 delete untangler_metric;
void vis_tmop_metric_p(int order, TMOP_QualityMetric &qm, const TargetConstructor &tc, ParMesh &pmesh, char *title, int position)
void discrete_aspr_3d(const Vector &x, Vector &v)
virtual void SetParDiscreteTargetSize(const ParGridFunction &tspec_)
static void Init()
Initialize hypre by calling HYPRE_Init() and set default options. After calling Hypre::Init(), hypre will be finalized automatically at program exit.
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.
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
int Dimension() const
Dimension of the reference space used within the elements.
void SaveAsOne(const char *fname, int precision=16) const
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.
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.
Abstract parallel finite element space.
virtual void ProjectCoefficient(Coefficient &coeff)
Project coeff Coefficient to this GridFunction. The projection computation depends on the choice of t...
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_)
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).
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).
long long GetGlobalNE() const
Return the total (global) number of elements.
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.
int main(int argc, char *argv[])
virtual void SetParDiscreteTargetAspectRatio(const ParGridFunction &tspec_)
double discrete_ori_2d(const Vector &x)
Parallel smoothers in hypre.
static void Init()
Singleton creation with Mpi::Init();.
void ParEnableNormalization(const ParGridFunction &x)
2D barrier Shape+Size+Orientation (VOS) metric (polyconvex).
PrintLevel & FirstAndLast()
void AddFESpaceForUpdate(FiniteElementSpace *fes)
2D barrier Shape+Orientation (OS) metric (polyconvex).
virtual DofTransformation * GetElementDofs(int i, Array< int > &dofs) const
Returns indexes of degrees of freedom in array dofs for i'th element.
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 const FiniteElement * GetFE(int i) const
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...
double adapt_lim_fun(const Vector &x)
void PrintAsOne(std::ostream &out=mfem::out) const
int GetDof() const
Returns the number of degrees of freedom in the finite element.
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
int open(const char hostname[], int port)
Open the socket stream on 'port' at 'hostname'.
static int WorldRank()
Return the MPI rank in MPI_COMM_WORLD.
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)
3D barrier Shape+Size (VS) metric, well-posed (polyconvex).
void SetNodalFESpace(FiniteElementSpace *nfes) override
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.
virtual void SetParDiscreteTargetOrientation(const ParGridFunction &tspec_)
Class for parallel grid function.
void SetNodalGridFunction(GridFunction *nodes, bool make_owner=false)
Base class representing target-matrix construction algorithms for mesh optimization via the target-ma...
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).
Class for parallel meshes.
const FiniteElement * GetBE(int i) const
Returns pointer to the FiniteElement in the FiniteElementCollection associated with i'th boundary fac...
void SetType(HypreSmoother::Type type, int relax_times=1)
Set the relaxation type and number of sweeps.
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).