108 #include "../common/mfem-common.hpp"
113 using namespace mfem;
116 int main (
int argc,
char *argv[])
124 const char *mesh_file =
"icf.mesh";
125 int mesh_poly_deg = 1;
131 double lim_const = 0.0;
132 double adapt_lim_const = 0.0;
133 double surface_fit_const = 0.0;
137 int solver_iter = 20;
138 double solver_rtol = 1e-10;
139 int solver_art_type = 0;
141 int max_lin_iter = 100;
142 bool move_bnd =
true;
144 bool hradaptivity =
false;
145 int h_metric_id = -1;
146 bool normalization =
false;
147 bool visualization =
true;
148 int verbosity_level = 0;
149 bool fdscheme =
false;
151 bool exactaction =
false;
152 const char *devopt =
"cpu";
156 bool surface_fit_adapt =
false;
157 double surface_fit_threshold = -10;
161 args.
AddOption(&mesh_file,
"-m",
"--mesh",
162 "Mesh file to use.");
163 args.
AddOption(&mesh_poly_deg,
"-o",
"--order",
164 "Polynomial degree of mesh finite element space.");
165 args.
AddOption(&rs_levels,
"-rs",
"--refine-serial",
166 "Number of times to refine the mesh uniformly in serial.");
167 args.
AddOption(&rp_levels,
"-rp",
"--refine-parallel",
168 "Number of times to refine the mesh uniformly in parallel.");
169 args.
AddOption(&jitter,
"-ji",
"--jitter",
170 "Random perturbation scaling factor.");
171 args.
AddOption(&metric_id,
"-mid",
"--metric-id",
172 "Mesh optimization metric:\n\t"
174 "1 : |T|^2 -- 2D shape\n\t"
175 "2 : 0.5|T|^2/tau-1 -- 2D shape (condition number)\n\t"
176 "7 : |T-T^-t|^2 -- 2D shape+size\n\t"
177 "9 : tau*|T-T^-t|^2 -- 2D shape+size\n\t"
178 "14 : |T-I|^2 -- 2D shape+size+orientation\n\t"
179 "22 : 0.5(|T|^2-2*tau)/(tau-tau_0) -- 2D untangling\n\t"
180 "50 : 0.5|T^tT|^2/tau^2-1 -- 2D shape\n\t"
181 "55 : (tau-1)^2 -- 2D size\n\t"
182 "56 : 0.5(sqrt(tau)-1/sqrt(tau))^2 -- 2D size\n\t"
183 "58 : |T^tT|^2/(tau^2)-2*|T|^2/tau+2 -- 2D shape\n\t"
184 "77 : 0.5(tau-1/tau)^2 -- 2D size\n\t"
185 "80 : (1-gamma)mu_2 + gamma mu_77 -- 2D shape+size\n\t"
186 "85 : |T-|T|/sqrt(2)I|^2 -- 2D shape+orientation\n\t"
187 "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"
194 "313: (|T|^2)(tau-tau0)^(-2/3)/3 -- 3D untangling\n\t"
195 "315: (tau-1)^2 -- 3D size\n\t"
196 "316: 0.5(sqrt(tau)-1/sqrt(tau))^2 -- 3D size\n\t"
197 "321: |T-T^-t|^2 -- 3D shape+size\n\t"
200 "11 : (1/4*alpha)|A-(adjA)^T(W^TW)/omega|^2 -- 2D shape\n\t"
201 "36 : (1/alpha)|A-W|^2 -- 2D shape+size+orientation\n\t"
202 "107: (1/2*alpha)|A-|A|/|W|W|^2 -- 2D shape+orientation\n\t"
203 "126: (1-gamma)nu_11 + gamma*nu_14a -- 2D shape+size\n\t"
205 args.
AddOption(&target_id,
"-tid",
"--target-id",
206 "Target (ideal element) type:\n\t"
207 "1: Ideal shape, unit size\n\t"
208 "2: Ideal shape, equal size\n\t"
209 "3: Ideal shape, initial size\n\t"
210 "4: Given full analytic Jacobian (in physical space)\n\t"
211 "5: Ideal shape, given size (in physical space)");
212 args.
AddOption(&lim_const,
"-lc",
"--limit-const",
"Limiting constant.");
213 args.
AddOption(&adapt_lim_const,
"-alc",
"--adapt-limit-const",
214 "Adaptive limiting coefficient constant.");
215 args.
AddOption(&surface_fit_const,
"-sfc",
"--surface-fit-const",
216 "Surface preservation constant.");
217 args.
AddOption(&quad_type,
"-qt",
"--quad-type",
218 "Quadrature rule type:\n\t"
219 "1: Gauss-Lobatto\n\t"
220 "2: Gauss-Legendre\n\t"
221 "3: Closed uniform points");
222 args.
AddOption(&quad_order,
"-qo",
"--quad_order",
223 "Order of the quadrature rule.");
224 args.
AddOption(&solver_type,
"-st",
"--solver-type",
225 " Type of solver: (default) 0: Newton, 1: LBFGS");
226 args.
AddOption(&solver_iter,
"-ni",
"--newton-iters",
227 "Maximum number of Newton iterations.");
228 args.
AddOption(&solver_rtol,
"-rtol",
"--newton-rel-tolerance",
229 "Relative tolerance for the Newton solver.");
230 args.
AddOption(&solver_art_type,
"-art",
"--adaptive-rel-tol",
231 "Type of adaptive relative linear solver tolerance:\n\t"
232 "0: None (default)\n\t"
233 "1: Eisenstat-Walker type 1\n\t"
234 "2: Eisenstat-Walker type 2");
235 args.
AddOption(&lin_solver,
"-ls",
"--lin-solver",
240 "3: MINRES + Jacobi preconditioner\n\t"
241 "4: MINRES + l1-Jacobi preconditioner");
242 args.
AddOption(&max_lin_iter,
"-li",
"--lin-iter",
243 "Maximum number of iterations in the linear solve.");
244 args.
AddOption(&move_bnd,
"-bnd",
"--move-boundary",
"-fix-bnd",
246 "Enable motion along horizontal and vertical boundaries.");
247 args.
AddOption(&combomet,
"-cmb",
"--combo-type",
248 "Combination of metrics options:\n\t"
249 "0: Use single metric\n\t"
250 "1: Shape + space-dependent size given analytically\n\t"
251 "2: Shape + adapted size given discretely; shared target");
252 args.
AddOption(&hradaptivity,
"-hr",
"--hr-adaptivity",
"-no-hr",
253 "--no-hr-adaptivity",
254 "Enable hr-adaptivity.");
255 args.
AddOption(&h_metric_id,
"-hmid",
"--h-metric",
256 "Same options as metric_id. Used to determine refinement"
257 " type for each element if h-adaptivity is enabled.");
258 args.
AddOption(&normalization,
"-nor",
"--normalization",
"-no-nor",
259 "--no-normalization",
260 "Make all terms in the optimization functional unitless.");
261 args.
AddOption(&fdscheme,
"-fd",
"--fd_approximation",
262 "-no-fd",
"--no-fd-approx",
263 "Enable finite difference based derivative computations.");
264 args.
AddOption(&exactaction,
"-ex",
"--exact_action",
265 "-no-ex",
"--no-exact-action",
266 "Enable exact action of TMOP_Integrator.");
267 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
268 "--no-visualization",
269 "Enable or disable GLVis visualization.");
270 args.
AddOption(&verbosity_level,
"-vl",
"--verbosity-level",
271 "Set the verbosity level - 0, 1, or 2.");
272 args.
AddOption(&adapt_eval,
"-ae",
"--adaptivity-evaluator",
273 "0 - Advection based (DEFAULT), 1 - GSLIB.");
274 args.
AddOption(&devopt,
"-d",
"--device",
275 "Device configuration string, see Device::Configure().");
276 args.
AddOption(&pa,
"-pa",
"--partial-assembly",
"-no-pa",
277 "--no-partial-assembly",
"Enable Partial Assembly.");
278 args.
AddOption(&n_hr_iter,
"-nhr",
"--n_hr_iter",
279 "Number of hr-adaptivity iterations.");
280 args.
AddOption(&n_h_iter,
"-nh",
"--n_h_iter",
281 "Number of h-adaptivity iterations per r-adaptivity"
283 args.
AddOption(&surface_fit_adapt,
"-sfa",
"--adaptive-surface-fit",
"-no-sfa",
284 "--no-adaptive-surface-fit",
285 "Enable or disable adaptive surface fitting.");
286 args.
AddOption(&surface_fit_threshold,
"-sft",
"--surf-fit-threshold",
287 "Set threshold for surface fitting. TMOP solver will"
288 "terminate when max surface fitting error is below this limit");
296 if (h_metric_id < 0) { h_metric_id = metric_id; }
300 MFEM_VERIFY(strcmp(devopt,
"cpu")==0,
"HR-adaptivity is currently only"
301 " supported on cpus.");
304 if (myid == 0) { device.
Print();}
307 Mesh *mesh =
new Mesh(mesh_file, 1, 1,
false);
308 for (
int lev = 0; lev < rs_levels; lev++)
318 for (
int lev = 0; lev < rp_levels; lev++)
328 if (mesh_poly_deg <= 0)
357 double vol_loc = 0.0;
359 for (
int i = 0; i < pmesh->
GetNE(); i++)
365 for (
int j = 0; j < dofs.
Size(); j++)
367 h0(dofs[j]) = min(h0(dofs[j]), hi);
372 MPI_Allreduce(&vol_loc, &vol_glb, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
373 const double small_phys_size =
pow(vol_glb, 1.0 / dim) / 100.0;
386 for (
int i = 0; i < pfespace->
GetNDofs(); i++)
388 for (
int d = 0; d <
dim; d++)
394 for (
int i = 0; i < pfespace->
GetNBE(); i++)
399 for (
int j = 0; j < vdofs.
Size(); j++) { rdm(vdofs[j]) = 0.0; }
410 ostringstream mesh_name;
411 mesh_name <<
"perturbed.mesh";
412 ofstream mesh_ofs(mesh_name.str().c_str());
413 mesh_ofs.precision(8);
422 double tauval = -0.1;
462 if (myid == 0) { cout <<
"Unknown metric_id: " << metric_id << endl; }
481 default: cout <<
"Metric_id not supported for h-adaptivity: " << h_metric_id <<
487 if (metric_id < 300 || h_metric_id < 300)
489 MFEM_VERIFY(dim == 2,
"Incompatible metric for 3D meshes");
491 if (metric_id >= 300 || h_metric_id >= 300)
493 MFEM_VERIFY(dim == 3,
"Incompatible metric for 2D meshes");
533 #ifdef MFEM_USE_GSLIB
536 MFEM_ABORT(
"MFEM is not built with GSLIB.");
542 size.ProjectCoefficient(size_coeff);
547 size.ProjectCoefficient(size_coeff);
567 #ifdef MFEM_USE_GSLIB
570 MFEM_ABORT(
"MFEM is not built with GSLIB.");
581 for (
int i = 0; i < size.Size(); i++)
585 const double max = size.Max();
587 MPI_Allreduce(&max, &max_all, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);
589 for (
int i = 0; i < d_x.Size(); i++)
591 d_x(i) = std::abs(d_x(i));
592 d_y(i) = std::abs(d_y(i));
594 const double eps = 0.01;
595 const double aspr_ratio = 20.0;
596 const double size_ratio = 40.0;
598 for (
int i = 0; i < size.Size(); i++)
600 size(i) = (size(i)/max_all);
601 aspr(i) = (d_x(i)+eps)/(d_y(i)+eps);
602 aspr(i) = 0.1 + 0.9*(1-size(i))*(1-size(i));
603 if (aspr(i) > aspr_ratio) {aspr(i) = aspr_ratio;}
604 if (aspr(i) < 1.0/aspr_ratio) {aspr(i) = 1.0/aspr_ratio;}
607 const int NE = pmesh->
GetNE();
608 double volume = 0.0, volume_ind = 0.0;
610 for (
int i = 0; i < NE; i++)
615 size.GetValues(i, ir, vals);
624 double volume_all, volume_ind_all;
625 MPI_Allreduce(&volume, &volume_all, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
626 MPI_Allreduce(&volume_ind, &volume_ind_all, 1, MPI_DOUBLE, MPI_SUM,
630 const double avg_zone_size = volume_all / NE_ALL;
632 const double small_avg_ratio =
633 (volume_ind_all + (volume_all - volume_ind_all) / size_ratio)
636 const double small_zone_size = small_avg_ratio * avg_zone_size;
637 const double big_zone_size = size_ratio * small_zone_size;
639 for (
int i = 0; i < size.Size(); i++)
641 const double val = size(i);
642 const double a = (big_zone_size - small_zone_size) / small_zone_size;
643 size(i) = big_zone_size / (1.0+a*val);
664 #ifdef MFEM_USE_GSLIB
667 MFEM_ABORT(
"MFEM is not built with GSLIB.");
686 #ifdef MFEM_USE_GSLIB
689 MFEM_ABORT(
"MFEM is not built with GSLIB.");
693 if (metric_id == 14 || metric_id == 36)
696 size.ProjectCoefficient(size_coeff);
703 aspr.ProjectCoefficient(aspr_coeff);
727 if (myid == 0) { cout <<
"Unknown target_id: " << target_id << endl; }
731 if (target_c == NULL)
742 MFEM_VERIFY(pa ==
false,
"PA for finite differences is not implemented.");
755 if (myid == 0) { cout <<
"Unknown quad_type: " << quad_type << endl; }
759 if (myid == 0 && dim == 2)
761 cout <<
"Triangle quadrature points: "
763 <<
"\nQuadrilateral quadrature points: "
766 if (myid == 0 && dim == 3)
768 cout <<
"Tetrahedron quadrature points: "
770 <<
"\nHexahedron quadrature points: "
772 <<
"\nPrism quadrature points: "
782 if (normalization) { dist = small_phys_size; }
784 if (lim_const != 0.0) { tmop_integ->
EnableLimiting(x0, dist, lim_coeff); }
790 if (adapt_lim_const > 0.0)
792 MFEM_VERIFY(pa ==
false,
"PA is not implemented for adaptive limiting");
797 if (adapt_eval == 0) { adapt_lim_eval =
new AdvectorCG(al); }
798 else if (adapt_eval == 1)
800 #ifdef MFEM_USE_GSLIB
803 MFEM_ABORT(
"MFEM is not built with GSLIB support!");
806 else { MFEM_ABORT(
"Bad interpolation option."); }
829 if (surface_fit_const > 0.0)
831 MFEM_VERIFY(hradaptivity ==
false,
832 "Surface fitting with HR is not implemented yet.");
833 MFEM_VERIFY(pa ==
false,
834 "Surface fitting with PA is not implemented yet.");
839 for (
int i = 0; i < pmesh->
GetNE(); i++)
847 for (
int j = 0; j < surf_fit_marker.Size(); j++)
849 if (surf_fit_mat_gf(j) > 0.1 && surf_fit_mat_gf(j) < 0.9)
851 surf_fit_marker[j] =
true;
852 surf_fit_mat_gf(j) = 1.0;
856 surf_fit_marker[j] =
false;
857 surf_fit_mat_gf(j) = 0.0;
861 if (adapt_eval == 0) { adapt_surface =
new AdvectorCG; }
862 else if (adapt_eval == 1)
864 #ifdef MFEM_USE_GSLIB
867 MFEM_ABORT(
"MFEM is not built with GSLIB support!");
870 else { MFEM_ABORT(
"Bad interpolation option."); }
924 else { tmop_integ2 =
new TMOP_Integrator(metric2, target_c, h_metric); }
933 if (lim_const != 0.0) { combo->
EnableLimiting(x0, dist, lim_coeff); }
942 if (pa) { a.
Setup(); }
946 const int NE = pmesh->
GetNE();
947 for (
int i = 0; i < NE; i++)
959 MPI_Allreduce(&tauval, &minJ0, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);
962 { cout <<
"Minimum det(J) of the original mesh is " << tauval << endl; }
964 if (tauval < 0.0 && metric_id != 22 && metric_id != 211 && metric_id != 252
965 && metric_id != 311 && metric_id != 313 && metric_id != 352)
967 MFEM_ABORT(
"The input mesh is inverted! Try an untangling metric.");
972 "Untangling is supported only for ideal targets.");
976 tauval /= Wideal.
Det();
978 double h0min = h0.Min(), h0min_all;
979 MPI_Allreduce(&h0min, &h0min_all, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);
981 tauval -= 0.01 * h0min_all;
987 double init_metric_energy = init_energy;
988 if (lim_const > 0.0 || adapt_lim_const > 0.0 || surface_fit_const > 0.0)
992 surf_fit_coeff.constant = 0.0;
996 adapt_lim_coeff.
constant = adapt_lim_const;
997 surf_fit_coeff.constant = surface_fit_const;
1004 char title[] =
"Initial metric values";
1012 if (move_bnd ==
false)
1021 for (
int i = 0; i < pmesh->
GetNBE(); i++)
1025 MFEM_VERIFY(!(dim == 2 && attr == 3),
1026 "Boundary attribute 3 must be used only for 3D meshes. "
1027 "Adjust the attributes (1/2/3/4 for fixed x/y/z/all "
1028 "components, rest for free nodes), or use -fix-bnd.");
1029 if (attr == 1 || attr == 2 || attr == 3) { n += nd; }
1030 if (attr == 4) { n += nd *
dim; }
1034 for (
int i = 0; i < pmesh->
GetNBE(); i++)
1041 for (
int j = 0; j < nd; j++)
1042 { ess_vdofs[n++] = vdofs[j]; }
1046 for (
int j = 0; j < nd; j++)
1047 { ess_vdofs[n++] = vdofs[j+nd]; }
1051 for (
int j = 0; j < nd; j++)
1052 { ess_vdofs[n++] = vdofs[j+2*nd]; }
1056 for (
int j = 0; j < vdofs.
Size(); j++)
1057 { ess_vdofs[n++] = vdofs[j]; }
1065 Solver *S = NULL, *S_prec = NULL;
1066 const double linsol_rtol = 1e-12;
1067 if (lin_solver == 0)
1069 S =
new DSmoother(1, 1.0, max_lin_iter);
1071 else if (lin_solver == 1)
1087 else { minres->
SetPrintLevel(verbosity_level == 2 ? 3 : -1); }
1088 if (lin_solver == 3 || lin_solver == 4)
1092 MFEM_VERIFY(lin_solver != 4,
"PA l1-Jacobi is not implemented");
1102 hs->SetPositiveDiagonal(
true);
1115 if (surface_fit_threshold > 0)
1117 solver.SetTerminationWithMaxSurfaceFittingError(surface_fit_threshold);
1120 solver.SetIntegrationRules(*irules, quad_order);
1121 if (solver_type == 0)
1124 solver.SetPreconditioner(*S);
1127 if (tauval < 0.0) { solver.SetMinDetPtr(&tauval); }
1128 solver.SetMaxIter(solver_iter);
1129 solver.SetRelTol(solver_rtol);
1130 solver.SetAbsTol(0.0);
1131 if (solver_art_type > 0)
1133 solver.SetAdaptiveLinRtol(solver_art_type, 0.5, 0.9);
1135 solver.SetPrintLevel(verbosity_level >= 1 ? 1 : -1);
1145 x, move_bnd, hradaptivity,
1146 mesh_poly_deg, h_metric_id,
1147 n_hr_iter, n_h_iter);
1149 if (adapt_lim_const > 0.)
1159 ostringstream mesh_name;
1160 mesh_name <<
"optimized.mesh";
1161 ofstream mesh_ofs(mesh_name.str().c_str());
1162 mesh_ofs.precision(8);
1169 double fin_metric_energy = fin_energy;
1170 if (lim_const > 0.0 || adapt_lim_const > 0.0 || surface_fit_const > 0.0)
1174 surf_fit_coeff.constant = 0.0;
1178 adapt_lim_coeff.
constant = adapt_lim_const;
1179 surf_fit_coeff.constant = surface_fit_const;
1183 std::cout << std::scientific << std::setprecision(4);
1184 cout <<
"Initial strain energy: " << init_energy
1185 <<
" = metrics: " << init_metric_energy
1186 <<
" + extra terms: " << init_energy - init_metric_energy << endl;
1187 cout <<
" Final strain energy: " << fin_energy
1188 <<
" = metrics: " << fin_metric_energy
1189 <<
" + extra terms: " << fin_energy - fin_metric_energy << endl;
1190 cout <<
"The strain energy decreased by: "
1191 << (init_energy - fin_energy) * 100.0 / init_energy <<
" %." << endl;
1197 char title[] =
"Final metric values";
1201 if (adapt_lim_const > 0.0 && visualization)
1205 600, 600, 300, 300);
1208 if (surface_fit_const > 0.0)
1214 "Materials", 600, 900, 300, 300);
1216 "Surface dof", 900, 900, 300, 300);
1218 double err_avg, err_max;
1222 std::cout <<
"Avg fitting error: " << err_avg << std::endl
1223 <<
"Max fitting error: " << err_max << std::endl;
1234 sock.
open(
"localhost", 19916);
1235 sock <<
"solution\n";
1241 sock <<
"window_title 'Displacements'\n"
1242 <<
"window_geometry "
1243 << 1200 <<
" " << 0 <<
" " << 600 <<
" " << 600 <<
"\n"
1244 <<
"keys jRmclA" << endl;
1253 delete metric_coeff1;
1254 delete adapt_lim_eval;
1255 delete adapt_surface;
1257 delete hr_adapt_coeff;
int GetNPoints() const
Returns the number of the points in the integration rule.
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_)
int Size() const
Return the logical size of the array.
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 GetNDofs() const
Returns number of degrees of freedom.
AssemblyLevel
Enumeration defining the assembly level for bilinear and nonlinear form classes derived from Operator...
Class for an integration rule - an Array of IntegrationPoint.
void EnableFiniteDifferences(const GridFunction &x)
Enables FD-based approximation and computes dx.
int DofToVDof(int dof, int vd, int ndofs=-1) const
void GetDerivative(int comp, int der_comp, ParGridFunction &der)
Parallel version of GridFunction::GetDerivative(); see its documentation.
double discrete_size_2d(const Vector &x)
3D barrier Shape+Size (VS) metric.
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 SetFromTrueVector()
Shortcut for calling SetFromTrueDofs() with GetTrueVector() as argument.
3D barrier Shape+Size (VS) metric (polyconvex).
A coefficient that is constant across space and time.
long GetGlobalNE() const
Return the total (global) number of elements.
int GetNBE() const
Returns number of boundary elements.
3D barrier Shape (S) metric.
void SetAdaptivityEvaluator(AdaptivityEvaluator *ae)
2D barrier Shape+Size (VS) metric (polyconvex).
double surface_level_set(const Vector &x)
Coefficient defined by a GridFunction. This coefficient is mesh dependent.
Container class for integration rules.
Data type dense matrix using column-major storage.
3D barrier Shape (S) metric.
void GetSurfaceFittingErrors(double &err_avg, double &err_max)
int Size() const
Returns the size of the vector.
void SetVolumeScale(double vol_scale)
Used by target type IDEAL_SHAPE_EQUAL_SIZE. The default volume scale is 1.
2D barrier shape (S) metric (polyconvex).
void EnableAdaptiveLimiting(const GridFunction &z0, Coefficient &coeff, AdaptivityEvaluator &ae)
Restriction of the node positions to certain regions.
3D non-barrier Size (V) metric.
2D barrier size (V) metric (polyconvex).
void SetIntegrationRules(IntegrationRules &irules, int order)
Prescribe a set of integration rules; relevant for mixed meshes.
int GetNE() const
Returns number of elements.
2D barrier Shape+Size (VS) metric (polyconvex).
void Print(std::ostream &out=mfem::out)
Print the configuration of the MFEM virtual device object.
virtual void ProjectDiscCoefficient(VectorCoefficient &coeff)
Project a discontinuous vector coefficient as a grid function on a continuous finite element space...
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.
2D barrier Shape+Size (VS) metric (not polyconvex).
Geometry::Type GetElementBaseGeometry(int i) const
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).
const DenseMatrix & GetGeomToPerfGeomJac(int GeomType) const
DofTransformation * GetBdrElementVDofs(int i, Array< int > &vdofs) const
Returns indexes of degrees of freedom for i'th boundary element.
2D barrier shape (S) metric (not polyconvex).
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.
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)
virtual const FiniteElement * GetFE(int i) const
void EnableLimiting(const GridFunction &n0, const GridFunction &dist, Coefficient &w0, TMOP_LimiterFunction *lfunc=NULL)
Limiting of the mesh displacements (general version).
int GetNBE() const
Returns number of boundary elements in the mesh.
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.
2D non-barrier size (V) metric (not polyconvex).
void EnsureNCMesh(bool simplices_nonconforming=false)
3D barrier Size (V) metric.
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)
T Max() const
Find the maximal element in the array, using the comparison operator < for class T.
Version of QuadraticFECollection with positive basis functions.
virtual void SetParDiscreteTargetAspectRatio(const ParGridFunction &tspec_)
int GetAttribute() const
Return element's attribute.
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).
void SetNodalFESpace(FiniteElementSpace *nfes)
void AddFESpaceForUpdate(FiniteElementSpace *fes)
void PrintUsage(std::ostream &out) const
Print the usage message.
void DiffuseField(ParGridFunction &field, int smooth_steps)
void EnableAdaptiveSurfaceFitting()
virtual DofTransformation * GetElementDofs(int i, Array< int > &dofs) const
Returns indexes of degrees of freedom in array dofs for i'th element.
2D barrier Shape+Orientation (OS) metric (polyconvex).
FDualNumber< tbase > pow(const FDualNumber< tbase > &a, const FDualNumber< tbase > &b)
pow([dual number],[dual number])
A general vector function coefficient.
3D barrier Shape+Size (VS) metric (polyconvex).
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)
2D barrier (not a shape) metric (polyconvex).
int GetDof() const
Returns the number of degrees of freedom in the finite element.
double weight_fun(const Vector &x)
2D barrier size (V) metric (polyconvex).
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 AddTMOPIntegrator(TMOP_Integrator *ti)
Adds a new TMOP_Integrator to the combination.
void SaveAsOne(const char *fname, int precision=16) const
double material_indicator_2d(const Vector &x)
2D barrier Shape+Size (VS) metric (not polyconvex).
double discrete_size_3d(const Vector &x)
double discrete_aspr_2d(const Vector &x)
Class for integration point with weight.
void GetElementTransformation(int i, IsoparametricTransformation *ElTr)
2D barrier Shape+Size+Orientation (VOS) metric (polyconvex).
3D Shape (S) metric, untangling version of 303.
IntegrationRules IntRulesCU(0, Quadrature1D::ClosedUniform)
void PrintOptions(std::ostream &out) const
Print the options.
double infinity()
Define a shortcut for std::numeric_limits<double>::infinity()
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.
A general function coefficient.
void SetAttribute(int i, int attr)
Set the attribute of element i.
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 (polyconvex).
void PrintAsOne(std::ostream &out=mfem::out) const
Arbitrary order H1-conforming (continuous) finite elements.
TargetType
Target-matrix construction algorithms supported by this class.
void EnableSurfaceFitting(const GridFunction &s0, const Array< bool > &smarker, Coefficient &coeff, AdaptivityEvaluator &ae)
Fitting of certain DOFs to the zero level set of a function.
virtual void SetParDiscreteTargetOrientation(const ParGridFunction &tspec_)
Class for parallel grid function.
const FiniteElement * GetBE(int i) const
Returns pointer to the FiniteElement in the FiniteElementCollection associated with i'th boundary fac...
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 barrier Shape+Size (VS) metric (polyconvex).
int material_id(int el_id, const GridFunction &g)
Class for parallel meshes.
IntegrationRules IntRules(0, Quadrature1D::GaussLegendre)
A global object with all integration rules (defined in intrules.cpp)
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).
void ParEnableNormalization(const ParGridFunction &x)
double GetElementVolume(int i)
const Element * GetBdrElement(int i) const
3D barrier Shape (S) metric.
2D non-barrier metric without a type.
Arbitrary order "L2-conforming" discontinuous finite elements.
bool Good() const
Return true if the command line options were parsed successfully.
A TMOP integrator class based on any given TMOP_QualityMetric and TargetConstructor.
2D non-barrier Shape+Size+Orientation (VOS) metric (polyconvex).