115int main(
int argc,
char *argv[])
118 const char *mesh_file =
"icf.mesh";
119 int mesh_poly_deg = 1;
125 real_t adapt_lim_const = 0.0;
129 int solver_iter = 20;
130#ifdef MFEM_USE_SINGLE
131 real_t solver_rtol = 1e-4;
133 real_t solver_rtol = 1e-10;
135 int solver_art_type = 0;
137 int max_lin_iter = 100;
138 bool move_bnd =
true;
140 bool bal_expl_combo =
false;
141 bool hradaptivity =
false;
142 int h_metric_id = -1;
143 bool normalization =
false;
144 bool visualization =
true;
145 int verbosity_level = 0;
146 bool fdscheme =
false;
148 bool exactaction =
false;
149 bool integ_over_targ =
true;
150 const char *devopt =
"cpu";
154 int mesh_node_ordering = 0;
155 int barrier_type = 0;
156 int worst_case_type = 0;
160 args.
AddOption(&mesh_file,
"-m",
"--mesh",
161 "Mesh file to use.");
162 args.
AddOption(&mesh_poly_deg,
"-o",
"--order",
163 "Polynomial degree of mesh finite element space.");
164 args.
AddOption(&rs_levels,
"-rs",
"--refine-serial",
165 "Number of times to refine the mesh uniformly in serial.");
166 args.
AddOption(&jitter,
"-ji",
"--jitter",
167 "Random perturbation scaling factor.");
168 args.
AddOption(&metric_id,
"-mid",
"--metric-id",
169 "Mesh optimization metric:\n\t"
171 "1 : |T|^2 -- 2D no type\n\t"
172 "2 : 0.5|T|^2/tau-1 -- 2D shape (condition number)\n\t"
173 "7 : |T-T^-t|^2 -- 2D shape+size\n\t"
174 "9 : tau*|T-T^-t|^2 -- 2D shape+size\n\t"
175 "14 : |T-I|^2 -- 2D shape+size+orientation\n\t"
176 "22 : 0.5(|T|^2-2*tau)/(tau-tau_0) -- 2D untangling\n\t"
177 "50 : 0.5|T^tT|^2/tau^2-1 -- 2D shape\n\t"
178 "55 : (tau-1)^2 -- 2D size\n\t"
179 "56 : 0.5(sqrt(tau)-1/sqrt(tau))^2 -- 2D size\n\t"
180 "58 : |T^tT|^2/(tau^2)-2*|T|^2/tau+2 -- 2D shape\n\t"
181 "77 : 0.5(tau-1/tau)^2 -- 2D size\n\t"
182 "80 : (1-gamma)mu_2 + gamma mu_77 -- 2D shape+size\n\t"
183 "85 : |T-|T|/sqrt(2)I|^2 -- 2D shape+orientation\n\t"
184 "90 : balanced combo mu_50 & mu_77 -- 2D shape+size\n\t"
185 "94 : balanced combo mu_2 & mu_56 -- 2D shape+size\n\t"
186 "98 : (1/tau)|T-I|^2 -- 2D shape+size+orientation\n\t"
190 "301: (|T||T^-1|)/3-1 -- 3D shape\n\t"
191 "302: (|T|^2|T^-1|^2)/9-1 -- 3D shape\n\t"
192 "303: (|T|^2)/3/tau^(2/3)-1 -- 3D shape\n\t"
193 "304: (|T|^3)/3^{3/2}/tau-1 -- 3D shape\n\t"
195 "313: (|T|^2)(tau-tau0)^(-2/3)/3 -- 3D untangling\n\t"
196 "315: (tau-1)^2 -- 3D no type\n\t"
197 "316: 0.5(sqrt(tau)-1/sqrt(tau))^2 -- 3D no type\n\t"
198 "321: |T-T^-t|^2 -- 3D shape+size\n\t"
199 "322: |T-adjT^-t|^2 -- 3D shape+size\n\t"
200 "323: |J|^3-3sqrt(3)ln(det(J))-3sqrt(3) -- 3D shape+size\n\t"
201 "328: balanced combo mu_301 & mu_316 -- 3D shape+size\n\t"
202 "332: (1-gamma) mu_302 + gamma mu_315 -- 3D shape+size\n\t"
203 "333: (1-gamma) mu_302 + gamma mu_316 -- 3D shape+size\n\t"
204 "334: (1-gamma) mu_303 + gamma mu_316 -- 3D shape+size\n\t"
205 "328: balanced combo mu_302 & mu_318 -- 3D shape+size\n\t"
206 "347: (1-gamma) mu_304 + gamma mu_316 -- 3D shape+size\n\t"
208 "360: (|T|^3)/3^{3/2}-tau -- 3D shape\n\t"
210 "11 : (1/4*alpha)|A-(adjA)^T(W^TW)/omega|^2 -- 2D shape\n\t"
211 "36 : (1/alpha)|A-W|^2 -- 2D shape+size+orientation\n\t"
212 "107: (1/2*alpha)|A-|A|/|W|W|^2 -- 2D shape+orientation\n\t"
213 "126: (1-gamma)nu_11 + gamma*nu_14a -- 2D shape+size\n\t"
215 args.
AddOption(&target_id,
"-tid",
"--target-id",
216 "Target (ideal element) type:\n\t"
217 "1: Ideal shape, unit size\n\t"
218 "2: Ideal shape, equal size\n\t"
219 "3: Ideal shape, initial size\n\t"
220 "4: Given full analytic Jacobian (in physical space)\n\t"
221 "5: Ideal shape, given size (in physical space)");
222 args.
AddOption(&lim_const,
"-lc",
"--limit-const",
"Limiting constant.");
223 args.
AddOption(&adapt_lim_const,
"-alc",
"--adapt-limit-const",
224 "Adaptive limiting coefficient constant.");
225 args.
AddOption(&quad_type,
"-qt",
"--quad-type",
226 "Quadrature rule type:\n\t"
227 "1: Gauss-Lobatto\n\t"
228 "2: Gauss-Legendre\n\t"
229 "3: Closed uniform points");
230 args.
AddOption(&quad_order,
"-qo",
"--quad_order",
231 "Order of the quadrature rule.");
232 args.
AddOption(&solver_type,
"-st",
"--solver-type",
233 " Type of solver: (default) 0: Newton, 1: LBFGS");
234 args.
AddOption(&solver_iter,
"-ni",
"--newton-iters",
235 "Maximum number of Newton iterations.");
236 args.
AddOption(&solver_rtol,
"-rtol",
"--newton-rel-tolerance",
237 "Relative tolerance for the Newton solver.");
238 args.
AddOption(&solver_art_type,
"-art",
"--adaptive-rel-tol",
239 "Type of adaptive relative linear solver tolerance:\n\t"
240 "0: None (default)\n\t"
241 "1: Eisenstat-Walker type 1\n\t"
242 "2: Eisenstat-Walker type 2");
243 args.
AddOption(&lin_solver,
"-ls",
"--lin-solver",
248 "3: MINRES + Jacobi preconditioner\n\t"
249 "4: MINRES + l1-Jacobi preconditioner");
250 args.
AddOption(&max_lin_iter,
"-li",
"--lin-iter",
251 "Maximum number of iterations in the linear solve.");
252 args.
AddOption(&move_bnd,
"-bnd",
"--move-boundary",
"-fix-bnd",
254 "Enable motion along horizontal and vertical boundaries.");
255 args.
AddOption(&combomet,
"-cmb",
"--combo-type",
256 "Combination of metrics options:\n\t"
257 "0: Use single metric\n\t"
258 "1: Shape + space-dependent size given analytically\n\t"
259 "2: Shape + adapted size given discretely; shared target");
260 args.
AddOption(&bal_expl_combo,
"-bec",
"--balance-explicit-combo",
261 "-no-bec",
"--balance-explicit-combo",
262 "Automatic balancing of explicit combo metrics.");
263 args.
AddOption(&hradaptivity,
"-hr",
"--hr-adaptivity",
"-no-hr",
264 "--no-hr-adaptivity",
265 "Enable hr-adaptivity.");
266 args.
AddOption(&h_metric_id,
"-hmid",
"--h-metric",
267 "Same options as metric_id. Used to determine refinement"
268 " type for each element if h-adaptivity is enabled.");
269 args.
AddOption(&normalization,
"-nor",
"--normalization",
"-no-nor",
270 "--no-normalization",
271 "Make all terms in the optimization functional unitless.");
272 args.
AddOption(&fdscheme,
"-fd",
"--fd_approximation",
273 "-no-fd",
"--no-fd-approx",
274 "Enable finite difference based derivative computations.");
275 args.
AddOption(&exactaction,
"-ex",
"--exact_action",
276 "-no-ex",
"--no-exact-action",
277 "Enable exact action of TMOP_Integrator.");
278 args.
AddOption(&integ_over_targ,
"-it",
"--integrate-target",
279 "-ir",
"--integrate-reference",
280 "Integrate over target (-it) or reference (-ir) element.");
281 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
282 "--no-visualization",
283 "Enable or disable GLVis visualization.");
284 args.
AddOption(&verbosity_level,
"-vl",
"--verbosity-level",
285 "Verbosity level for the involved iterative solvers:\n\t"
287 "1: Newton iterations\n\t"
288 "2: Newton iterations + linear solver summaries\n\t"
289 "3: newton iterations + linear solver iterations");
290 args.
AddOption(&adapt_eval,
"-ae",
"--adaptivity-evaluator",
291 "0 - Advection based (DEFAULT), 1 - GSLIB.");
292 args.
AddOption(&devopt,
"-d",
"--device",
293 "Device configuration string, see Device::Configure().");
294 args.
AddOption(&pa,
"-pa",
"--partial-assembly",
"-no-pa",
295 "--no-partial-assembly",
"Enable Partial Assembly.");
296 args.
AddOption(&n_hr_iter,
"-nhr",
"--n_hr_iter",
297 "Number of hr-adaptivity iterations.");
298 args.
AddOption(&n_h_iter,
"-nh",
"--n_h_iter",
299 "Number of h-adaptivity iterations per r-adaptivity"
301 args.
AddOption(&mesh_node_ordering,
"-mno",
"--mesh_node_ordering",
302 "Ordering of mesh nodes."
303 "0 (default): byNodes, 1: byVDIM");
304 args.
AddOption(&barrier_type,
"-btype",
"--barrier-type",
306 "1 - Shifted Barrier,"
307 "2 - Pseudo Barrier.");
308 args.
AddOption(&worst_case_type,
"-wctype",
"--worst-case-type",
320 if (h_metric_id < 0) { h_metric_id = metric_id; }
324 MFEM_VERIFY(strcmp(devopt,
"cpu")==0,
"HR-adaptivity is currently only"
325 " supported on cpus.");
331 Mesh *mesh =
new Mesh(mesh_file, 1, 1,
false);
342 if (mesh_poly_deg <= 0)
374 for (
int i = 0; i < mesh->
GetNE(); i++)
380 for (
int j = 0; j < dofs.
Size(); j++)
382 h0(dofs[j]) = min(h0(dofs[j]), hi);
386 const real_t small_phys_size = pow(mesh_volume, 1.0 /
dim) / 100.0;
399 for (
int i = 0; i < fespace->
GetNDofs(); i++)
401 for (
int d = 0; d <
dim; d++)
407 for (
int i = 0; i < fespace->
GetNBE(); i++)
412 for (
int j = 0; j < vdofs.
Size(); j++) { rdm(vdofs[j]) = 0.0; }
421 ofstream mesh_ofs(
"perturbed.mesh");
422 mesh->
Print(mesh_ofs);
480 cout <<
"Unknown metric_id: " << metric_id << endl;
499 default: cout <<
"Metric_id not supported for h-adaptivity: " << h_metric_id <<
506 switch (barrier_type)
508 case 0: btype = TMOP_WorstCaseUntangleOptimizer_Metric::BarrierType::None;
510 case 1: btype = TMOP_WorstCaseUntangleOptimizer_Metric::BarrierType::Shifted;
512 case 2: btype = TMOP_WorstCaseUntangleOptimizer_Metric::BarrierType::Pseudo;
514 default: cout <<
"barrier_type not supported: " << barrier_type << endl;
519 switch (worst_case_type)
521 case 0: wctype = TMOP_WorstCaseUntangleOptimizer_Metric::WorstCaseType::None;
523 case 1: wctype = TMOP_WorstCaseUntangleOptimizer_Metric::WorstCaseType::Beta;
525 case 2: wctype = TMOP_WorstCaseUntangleOptimizer_Metric::WorstCaseType::PMean;
527 default: cout <<
"worst_case_type not supported: " << worst_case_type << endl;
532 if (barrier_type > 0 || worst_case_type > 0)
534 if (barrier_type > 0)
536 MFEM_VERIFY(metric_id == 4 || metric_id == 14 || metric_id == 66,
537 "Metric not supported for shifted/pseudo barriers.");
548 if (metric_id < 300 || h_metric_id < 300)
550 MFEM_VERIFY(
dim == 2,
"Incompatible metric for 3D meshes");
552 if (metric_id >= 300 || h_metric_id >= 300)
554 MFEM_VERIFY(
dim == 3,
"Incompatible metric for 2D meshes");
564 GridFunction size(&ind_fes), aspr(&ind_fes), ori(&ind_fes);
568 pa ? AssemblyLevel::PARTIAL : AssemblyLevel::LEGACY;
597 MFEM_ABORT(
"MFEM is not built with GSLIB.");
612 disc.ProjectCoefficient(mat_coeff);
622 MFEM_ABORT(
"MFEM is not built with GSLIB.");
630 disc.GetDerivative(1,0,d_x);
631 disc.GetDerivative(1,1,d_y);
634 for (
int i = 0; i < size.Size(); i++)
636 size(i) = std::pow(d_x(i),2)+std::pow(d_y(i),2);
638 const real_t max = size.Max();
640 for (
int i = 0; i < d_x.Size(); i++)
642 d_x(i) = std::abs(d_x(i));
643 d_y(i) = std::abs(d_y(i));
646 const real_t aspr_ratio = 20.0;
647 const real_t size_ratio = 40.0;
649 for (
int i = 0; i < size.Size(); i++)
651 size(i) = (size(i)/max);
652 aspr(i) = (d_x(i)+eps)/(d_y(i)+eps);
653 aspr(i) = 0.1 + 0.9*(1-size(i))*(1-size(i));
654 if (aspr(i) > aspr_ratio) {aspr(i) = aspr_ratio;}
655 if (aspr(i) < 1.0/aspr_ratio) {aspr(i) = 1.0/aspr_ratio;}
658 const int NE = mesh->
GetNE();
659 real_t volume = 0.0, volume_ind = 0.0;
661 for (
int i = 0; i < NE; i++)
666 size.GetValues(i, ir, vals);
676 const real_t avg_zone_size = volume / NE;
678 const real_t small_avg_ratio = (volume_ind + (volume - volume_ind) /
682 const real_t small_zone_size = small_avg_ratio * avg_zone_size;
683 const real_t big_zone_size = size_ratio * small_zone_size;
685 for (
int i = 0; i < size.Size(); i++)
687 const real_t val = size(i);
688 const real_t a = (big_zone_size - small_zone_size) / small_zone_size;
689 size(i) = big_zone_size / (1.0+
a*val);
713 MFEM_ABORT(
"MFEM is not built with GSLIB.");
736 MFEM_ABORT(
"MFEM is not built with GSLIB.");
741 size.ProjectCoefficient(size_coeff);
762 default: cout <<
"Unknown target_id: " << target_id << endl;
return 3;
764 if (target_c == NULL)
772 if (metric_combo && bal_expl_combo)
775 metric_combo->ComputeBalancedWeights(x, *target_c, bal_weights);
776 metric_combo->SetWeights(bal_weights);
782 auto tmop_integ =
new TMOP_Integrator(metric_to_use, target_c, h_metric);
783 tmop_integ->IntegrateOverTarget(integ_over_targ);
784 if (barrier_type > 0 || worst_case_type > 0)
786 tmop_integ->ComputeUntangleMetricQuantiles(x, *fespace);
792 MFEM_VERIFY(pa ==
false,
"PA for finite differences is not implemented.");
793 tmop_integ->EnableFiniteDifferences(x);
795 tmop_integ->SetExactActionFlag(exactaction);
804 default: cout <<
"Unknown quad_type: " << quad_type << endl;
return 3;
806 tmop_integ->SetIntegrationRules(*irules, quad_order);
809 cout <<
"Triangle quadrature points: "
811 <<
"\nQuadrilateral quadrature points: "
816 cout <<
"Tetrahedron quadrature points: "
818 <<
"\nHexahedron quadrature points: "
820 <<
"\nPrism quadrature points: "
830 if (normalization) { dist = small_phys_size; }
832 if (lim_const != 0.0) { tmop_integ->EnableLimiting(x0, dist, lim_coeff); }
838 if (adapt_lim_const > 0.0)
840 MFEM_VERIFY(pa ==
false,
"PA is not implemented for adaptive limiting");
845 if (adapt_eval == 0) { adapt_lim_eval =
new AdvectorCG(al); }
846 else if (adapt_eval == 1)
851 MFEM_ABORT(
"MFEM is not built with GSLIB support!");
854 else { MFEM_ABORT(
"Bad interpolation option."); }
856 tmop_integ->EnableAdaptiveLimiting(adapt_lim_gf0, adapt_lim_coeff,
868 if (normalization) { tmop_integ->EnableNormalization(x0); }
877 if (pa) {
a.SetAssemblyLevel(AssemblyLevel::PARTIAL); }
888 tmop_integ->SetCoefficient(*metric_coeff1);
903 else { tmop_integ2 =
new TMOP_Integrator(metric2, target_c, h_metric); }
913 if (lim_const != 0.0) { combo->
EnableLimiting(x0, dist, lim_coeff); }
915 a.AddDomainIntegrator(combo);
919 a.AddDomainIntegrator(tmop_integ);
922 if (pa) {
a.Setup(); }
926 const int NE = mesh->
GetNE();
927 for (
int i = 0; i < NE; i++)
935 min_detJ = min(min_detJ, transf->
Jacobian().
Det());
938 cout <<
"Minimum det(J) of the original mesh is " << min_detJ << endl;
940 if (min_detJ < 0.0 && barrier_type == 0
941 && metric_id != 22 && metric_id != 211 && metric_id != 252
942 && metric_id != 311 && metric_id != 313 && metric_id != 352)
944 MFEM_ABORT(
"The input mesh is inverted! Try an untangling metric.");
949 "Untangling is supported only for ideal targets.");
953 min_detJ /= Wideal.
Det();
956 min_detJ -= 0.01 * h0.
Min();
960 const real_t init_energy =
a.GetGridFunctionEnergy(x) /
961 (hradaptivity ? mesh->
GetNE() : 1);
962 real_t init_metric_energy = init_energy;
963 if (lim_const > 0.0 || adapt_lim_const > 0.0)
967 init_metric_energy =
a.GetGridFunctionEnergy(x) /
968 (hradaptivity ? mesh->
GetNE() : 1);
970 adapt_lim_coeff.
constant = adapt_lim_const;
977 char title[] =
"Initial metric values";
986 if (move_bnd ==
false)
990 a.SetEssentialBC(ess_bdr);
995 for (
int i = 0; i < mesh->
GetNBE(); i++)
999 MFEM_VERIFY(!(
dim == 2 && attr == 3),
1000 "Boundary attribute 3 must be used only for 3D meshes. "
1001 "Adjust the attributes (1/2/3/4 for fixed x/y/z/all "
1002 "components, rest for free nodes), or use -fix-bnd.");
1003 if (attr == 1 || attr == 2 || attr == 3) { n += nd; }
1004 if (attr == 4) { n += nd *
dim; }
1008 for (
int i = 0; i < mesh->
GetNBE(); i++)
1015 for (
int j = 0; j < nd; j++)
1016 { ess_vdofs[n++] = vdofs[j]; }
1020 for (
int j = 0; j < nd; j++)
1021 { ess_vdofs[n++] = vdofs[j+nd]; }
1025 for (
int j = 0; j < nd; j++)
1026 { ess_vdofs[n++] = vdofs[j+2*nd]; }
1030 for (
int j = 0; j < vdofs.
Size(); j++)
1031 { ess_vdofs[n++] = vdofs[j]; }
1034 a.SetEssentialVDofs(ess_vdofs);
1039 Solver *S = NULL, *S_prec = NULL;
1040#ifdef MFEM_USE_SINGLE
1041 const real_t linsol_rtol = 1e-5;
1043 const real_t linsol_rtol = 1e-12;
1047 if (verbosity_level == 2)
1049 if (verbosity_level > 2)
1051 if (lin_solver == 0)
1053 S =
new DSmoother(1, 1.0, max_lin_iter);
1055 else if (lin_solver == 1)
1071 if (lin_solver == 3 || lin_solver == 4)
1075 MFEM_VERIFY(lin_solver != 4,
"PA l1-Jacobi is not implemented");
1082 auto ds =
new DSmoother((lin_solver == 3) ? 0 : 1, 1.0, 1);
1106 if (solver_art_type > 0)
1112 if (verbosity_level > 0)
1123 x, move_bnd, hradaptivity,
1124 mesh_poly_deg, h_metric_id,
1125 n_hr_iter, n_h_iter);
1127 if (adapt_lim_const > 0.)
1137 ofstream mesh_ofs(
"optimized.mesh");
1138 mesh_ofs.precision(14);
1139 mesh->
Print(mesh_ofs);
1143 const real_t fin_energy =
a.GetGridFunctionEnergy(x) /
1144 (hradaptivity ? mesh->
GetNE() : 1);
1145 real_t fin_metric_energy = fin_energy;
1146 if (lim_const > 0.0 || adapt_lim_const > 0.0)
1150 fin_metric_energy =
a.GetGridFunctionEnergy(x) /
1151 (hradaptivity ? mesh->
GetNE() : 1);
1153 adapt_lim_coeff.
constant = adapt_lim_const;
1155 std::cout << std::scientific << std::setprecision(4);
1156 cout <<
"Initial strain energy: " << init_energy
1157 <<
" = metrics: " << init_metric_energy
1158 <<
" + extra terms: " << init_energy - init_metric_energy << endl;
1159 cout <<
" Final strain energy: " << fin_energy
1160 <<
" = metrics: " << fin_metric_energy
1161 <<
" + extra terms: " << fin_energy - fin_metric_energy << endl;
1162 cout <<
"The strain energy decreased by: "
1163 << (init_energy - fin_energy) * 100.0 / init_energy <<
" %." << endl;
1168 char title[] =
"Final metric values";
1172 if (adapt_lim_const > 0.0 && visualization)
1176 600, 600, 300, 300);
1183 sock <<
"solution\n";
1188 sock <<
"window_title 'Displacements'\n"
1189 <<
"window_geometry "
1190 << 1200 <<
" " << 0 <<
" " << 600 <<
" " << 600 <<
"\n"
1191 <<
"keys jRmclA" << endl;
1198 delete metric_coeff1;
1199 delete adapt_lim_eval;
1201 delete hr_adapt_coeff;
1205 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.
Conjugate gradient method.
A coefficient that is constant across space and time.
Data type for scaled Jacobi-type smoother of sparse matrix.
void SetPositiveDiagonal(bool pos_diag=true)
Replace diag entries with their abs values. Relevant only when type = 0.
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 &out=mfem::out)
Print the configuration of the MFEM virtual device object.
virtual void SetSerialDiscreteTargetAspectRatio(const GridFunction &tspec_)
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.
virtual const FiniteElement * GetFE(int i) const
Returns pointer to the FiniteElement in the FiniteElementCollection associated with i'th element in t...
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.
Geometry::Type GetGeomType() const
Returns the Geometry::Type of the reference element.
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.
void SetTrueVector()
Shortcut for calling GetTrueDofs() with GetTrueVector() as argument.
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)
Project coeff Coefficient to this GridFunction. The projection computation depends on the choice of t...
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)
virtual void SetPreconditioner(Solver &pr)
This should be called before SetOperator.
Array< int > bdr_attributes
A list of all unique boundary attributes used by the Mesh.
virtual void Print(std::ostream &os=mfem::out, const std::string &comments="") const
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.
Version of QuadraticFECollection with positive basis functions.
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 SetIntegrationRules(IntegrationRules &irules, int order)
Prescribe a set of integration rules; relevant for mixed meshes.
void SetMinDetPtr(real_t *md_ptr)
virtual void SetPreconditioner(Solver &pr)
This should be called before SetOperator.
2D barrier Shape+Size+Orientation (VOS) metric (polyconvex).
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 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 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)
real_t infinity()
Define a shortcut for std::numeric_limits<double>::infinity()
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)
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()