.TH "adapt" 3rheolef "Version 7.2" "rheolef" \" -*- nroff -*- .ad l .nh .SH NAME adapt \- adaptive mesh generation (rheolef-7\&.2) .PP .SH "SYNOPSIS" .PP .PP .nf geo adapt (const field& criterion); geo adapt (const field& criterion, const adapt_option& aopt); .fi .PP .SH "DESCRIPTION" .PP The \fCadapt\fP function implements an adaptive mesh procedure, based either on the \fCgmsh\fP (isotropic) or \fBbamg(1)\fP (anisotropic) mesh generators\&. The \fBbamg(1)\fP mesh generator is the default in two dimension\&. For dimension one or three, \fCgmsh\fP is the only generator supported yet\&. In the two dimensional case, the \fCgmsh\fP correspond to the option \fCaopt\&.generator='gmsh'\fP, where \fCaopt\fP is an \fCadap_option\fP variable (see \fBadapt(3)\fP)\&. .SH "CRITERION AND METRIC" .PP The strategy bases on a metric determined by the Hessian of a scalar criterion field, denoted here as \fCphi\fP, and that is supplied by the user as the first argument of the \fCadapt\fP function\&. .PP Let us denote by \fCH=Hessian(phi)\fP the Hessian tensor field of the scalar field \fCphi\fP\&. Then, \fC|H|\fP denotes the tensor that has the same eigenvector as \fCH\fP, but with absolute value of its eigenvalues: .PP .nf |H| = Q*diag(|lambda_i|)*Qt .fi .PP The metric \fCM\fP is determined from \fC|H|\fP\&. Recall that an isotropic metric is such that \fCM(x)=hloc(x)^(-2)*Id\fP where \fChloc(x)\fP is the element size field and \fCId\fP is the identity \fCd*d\fP matrix, and \fCd=1,2,3\fP is the physical space dimension\&. .SH "GMSH ISOTROPIC METRIC" .PP .PP .nf max_(i=0\&.\&.d-1)(|lambda_i(x)|)*Id M(x) = ----------------------------------------- err*hcoef^2*(sup_y(phi(y))-inf_y(phi(y))) .fi .PP Notice that the denominator involves a global (absolute) normalization \fCsup_y(phi(y))-inf_y(phi(y))\fP of the criterion field \fCphi\fP and the two parameters \fCaopt\&.err\fP, the target error, and \fCaopt\&.hcoef\fP, a secondary normalization parameter (defaults to 1)\&. .SH "BAMG ANISOTROPIC METRIC" .PP There are two approach for the normalization of the metric\&. The first one involves a global (absolute) normalization: .PP .nf |H(x))| M(x) = ----------------------------------------- err*hcoef^2*(sup_y(phi(y))-inf_y(phi(y))) .fi .PP The first one involves a local (relative) normalization: .PP .nf |H(x))| M(x) = ----------------------------------------- err*hcoef^2*(|phi(x)|, cutoff*max_y|phi(y)|) .fi .PP Notice that the denominator involves a local value \fCphi(x)\fP\&. The parameter is provided by the optional variable \fCaopt\&.cutoff\fP; its default value is \fC1e-7\fP\&. The default strategy is the local normalization\&. The global normalization can be enforced by setting \fCaopt\&.additional='-AbsError'\fP\&. .PP When choosing global or local normalization ? .PP When the governing field \fCphi\fP is bounded, i\&.e\&. when \fCerr*hcoef^2*(sup_y(phi(y))-inf_y(phi(y)))\fP will converge versus mesh refinement to a bounded value, the global normalization defines a metric that is mesh-independent and thus the adaptation loop will converge\&. .PP .PP Otherwise, when \fCphi\fP presents singularities, with unbounded values (such as corner singularity, i\&.e\&. presents picks when represented in elevation view), then the mesh adaptation procedure is more difficult\&. The global normalization divides by quantities that can be very large and the mesh adaptation can diverges when focusing on the singularities\&. In that case, the local normalization is preferable\&. Moreover, the focus on singularities can also be controlled by setting \fCaopt\&.hmin\fP not too small\&. .PP The local normalization has been chosen as the default since it is more robust\&. When your field \fCphi\fP does not present singularities, then you can switch to the global numbering that leads to a best equirepartition of the error over the domain\&. .SH "OPTIONS" .PP .PP .nf struct adapt_option { typedef std::vector::size_type size_type; std::string generator; bool isotropic; Float err; Float errg; Float hcoef; Float hmin; Float hmax; Float ratio; Float cutoff; size_type n_vertices_max; size_type n_smooth_metric; bool splitpbedge; Float thetaquad; Float anisomax; bool clean; std::string additional; bool double_precision; Float anglecorner; // angle below which bamg considers 2 consecutive edge to be part of // the same spline adapt_option() : generator(""), isotropic(true), err(1e\-2), errg(1e\-1), hcoef(1), hmin(0\&.0001), hmax(0\&.3), ratio(0), cutoff(1e\-7), n_vertices_max(50000), n_smooth_metric(1), splitpbedge(true), thetaquad(std::numeric_limits::max()), anisomax(1e6), clean(false), additional("\-RelError"), double_precision(false), anglecorner(0) {} }; .fi .PP .SH "IMPLEMENTATION" .PP This documentation has been generated from file main/lib/adapt\&.h .SH AUTHOR Pierre Saramito .SH COPYRIGHT Copyright (C) 2000-2018 Pierre Saramito GPLv3+: GNU GPL version 3 or later . This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.