39 #ifndef GETFEM_GLOBAL_FUNCTION_H__ 
   40 #define GETFEM_GLOBAL_FUNCTION_H__ 
   53     dim_type dim()
 const { 
return dim_; }
 
   56     { GMM_ASSERT1(
false, 
"this global_function has no value"); }
 
   58     { GMM_ASSERT1(
false, 
"this global_function has no gradient"); }
 
   60     { GMM_ASSERT1(
false, 
"this global_function has no hessian"); }
 
   62     virtual bool is_in_support(
const base_node &  )
 const { 
return true; }
 
   63     virtual void bounding_box(base_node &bmin, base_node &bmax)
 const {
 
   64       GMM_ASSERT1(bmin.size() == dim_ && bmax.size() == dim_,
 
   66       for (
auto&& xx : bmin) xx = -1e+25;
 
   67       for (
auto&& xx : bmax) xx = 1e+25;
 
   71     { DAL_STORED_OBJECT_DEBUG_CREATED(
this, 
"Global function");}
 
   73     { DAL_STORED_OBJECT_DEBUG_DESTROYED(
this, 
"Global function"); }
 
   76   typedef std::shared_ptr<const global_function> pglobal_function;
 
   86     virtual scalar_type val(
const base_node &pt) 
const = 0;
 
   87     virtual void grad(
const base_node &pt, base_small_vector&) 
const = 0;
 
   88     virtual void hess(
const base_node &pt, base_matrix&) 
const = 0;
 
   91     { DAL_STORED_OBJECT_DEBUG_CREATED(
this, 
"Global function simple"); }
 
   92     virtual ~global_function_simple()
 
   93     { DAL_STORED_OBJECT_DEBUG_DESTROYED(
this, 
"Global function simple"); }
 
   96   class global_function_parser : 
public global_function_simple {
 
   98     ga_function f_val, f_grad, f_hess;
 
   99     mutable model_real_plain_vector pt_;
 
  101     virtual scalar_type val(
const base_node &pt) 
const;
 
  102     virtual const base_tensor &tensor_val(
const base_node &pt) 
const;
 
  103     virtual void grad(
const base_node &pt, base_small_vector &g) 
const;
 
  104     virtual void hess(
const base_node &pt, base_matrix &h) 
const;
 
  106     global_function_parser(dim_type dim_,
 
  107                            const std::string &sval,
 
  108                            const std::string &sgrad=
"",
 
  109                            const std::string &shess=
"");
 
  110     virtual ~global_function_parser()
 
  111     { DAL_STORED_OBJECT_DEBUG_DESTROYED(
this, 
"Global function parser"); }
 
  115   class global_function_sum : 
public global_function {
 
  116     std::vector<pglobal_function> functions;
 
  118     virtual scalar_type val(
const fem_interpolation_context&) 
const;
 
  119     virtual void grad(
const fem_interpolation_context&, base_small_vector&) 
const;
 
  120     virtual void hess(
const fem_interpolation_context&, base_matrix&) 
const;
 
  121     virtual bool is_in_support(
const base_node &p) 
const;
 
  122     virtual void bounding_box(base_node &bmin_, base_node &bmax_) 
const;
 
  123     global_function_sum(
const std::vector<pglobal_function> &funcs);
 
  124     global_function_sum(pglobal_function f1, pglobal_function f2);
 
  125     global_function_sum(pglobal_function f1, pglobal_function f2,
 
  126                         pglobal_function f3);
 
  127     global_function_sum(pglobal_function f1, pglobal_function f2,
 
  128                         pglobal_function f3, pglobal_function f4);
 
  129     virtual ~global_function_sum()
 
  130     { DAL_STORED_OBJECT_DEBUG_DESTROYED(
this, 
"Global function sum"); }
 
  133   class global_function_product : 
public global_function {
 
  134     pglobal_function f1, f2;
 
  136     virtual scalar_type val(
const fem_interpolation_context&) 
const;
 
  137     virtual void grad(
const fem_interpolation_context&, base_small_vector&) 
const;
 
  138     virtual void hess(
const fem_interpolation_context&, base_matrix&) 
const;
 
  139     virtual bool is_in_support(
const base_node &p) 
const;
 
  140     virtual void bounding_box(base_node &bmin_, base_node &bmax_) 
const;
 
  141     global_function_product(pglobal_function f1_, pglobal_function f2_);
 
  142     virtual ~global_function_product()
 
  143     { DAL_STORED_OBJECT_DEBUG_DESTROYED(
this, 
"Global function product"); }
 
  146   class global_function_bounded : 
public global_function {
 
  148     const base_node bmin, bmax;
 
  152     mutable model_real_plain_vector pt_;
 
  154     virtual scalar_type val(
const fem_interpolation_context &c)
 const 
  155     { 
return f->val(c); }
 
  156     virtual void grad(
const fem_interpolation_context &c, base_small_vector &g)
 const 
  158     virtual void hess(
const fem_interpolation_context &c, base_matrix &h)
 const 
  161     virtual bool is_in_support(
const base_node &) 
const;
 
  162     virtual void bounding_box(base_node &bmin_, base_node &bmax_)
 const {
 
  168     global_function_bounded(pglobal_function f_,
 
  169                             const base_node &bmin_, 
const base_node &bmax_,
 
  170                             const std::string &is_in_expr=
"");
 
  171     virtual ~global_function_bounded()
 
  172     { DAL_STORED_OBJECT_DEBUG_DESTROYED(
this, 
"Global function bounded"); }
 
  183     std::vector<scalar_type> U;
 
  187     mutable bgeot::rtree::pbox_set boxlst;
 
  192                              const std::vector<scalar_type> &U_);
 
  193     bool find_a_point(
const base_node &pt, base_node &ptr,
 
  195     bool eval(
const base_node &pt, base_vector &val, base_matrix &grad) 
const;
 
  198   typedef std::shared_ptr<const interpolator_on_mesh_fem>
 
  199     pinterpolator_on_mesh_fem;
 
  207     virtual scalar_type val(scalar_type x, scalar_type y) 
const = 0;
 
  208     virtual base_small_vector grad(scalar_type x, scalar_type y) 
const = 0;
 
  209     virtual base_matrix hess(scalar_type x, scalar_type y) 
const = 0;
 
  213   typedef std::shared_ptr<const abstract_xy_function> pxy_function;
 
  217     ga_function f_val, f_grad, f_hess;
 
  218     mutable model_real_plain_vector ptx, pty, ptr, ptt;
 
  220     virtual scalar_type val(scalar_type x, scalar_type y) 
const;
 
  221     virtual base_small_vector grad(scalar_type x, scalar_type y) 
const;
 
  222     virtual base_matrix hess(scalar_type x, scalar_type y) 
const;
 
  224     parser_xy_function(
const std::string &sval,
 
  225                        const std::string &sgrad=
"0;0;",
 
  226                        const std::string &shess=
"0;0;0;0;");
 
  227     virtual ~parser_xy_function() {}
 
  230   struct crack_singular_xy_function : 
public abstract_xy_function {
 
  232     virtual scalar_type val(scalar_type x, scalar_type y) 
const;
 
  233     virtual base_small_vector grad(scalar_type x, scalar_type y) 
const;
 
  234     virtual base_matrix hess(scalar_type x, scalar_type y) 
const;
 
  235     crack_singular_xy_function(
unsigned l_) : l(l_) {}
 
  236     virtual ~crack_singular_xy_function() {}
 
  239   struct cutoff_xy_function : 
public abstract_xy_function {
 
  240     enum { NOCUTOFF = -1,
 
  241            EXPONENTIAL_CUTOFF = 0,
 
  242            POLYNOMIAL_CUTOFF = 1,
 
  243            POLYNOMIAL2_CUTOFF= 2 };
 
  245     scalar_type a4, r1, r0;
 
  246     virtual scalar_type val(scalar_type x, scalar_type y) 
const;
 
  247     virtual base_small_vector grad(scalar_type x, scalar_type y) 
const;
 
  248     virtual base_matrix hess(scalar_type x, scalar_type y) 
const;
 
  249     cutoff_xy_function(
int fun_num, scalar_type r,
 
  250                        scalar_type r1, scalar_type r0);
 
  251     virtual ~cutoff_xy_function() {}
 
  254   struct interpolated_xy_function : 
public abstract_xy_function {
 
  255     pinterpolator_on_mesh_fem itp;
 
  257     virtual scalar_type val(scalar_type x, scalar_type y)
 const {
 
  258       base_vector v; base_matrix g;
 
  259       itp->eval(base_node(x,y), v, g);
 
  262     virtual base_small_vector grad(scalar_type x, scalar_type y)
 const {
 
  263       base_vector v; base_matrix g;
 
  264       itp->eval(base_node(x,y), v, g);
 
  265       return base_small_vector(g(component,0), g(component,1));
 
  267     virtual base_matrix hess(scalar_type, scalar_type)
 const 
  268     { GMM_ASSERT1(
false, 
"Sorry, to be done ..."); }
 
  269     interpolated_xy_function(
const pinterpolator_on_mesh_fem &itp_,
 
  271       itp(itp_), component(c) {}
 
  272     virtual ~interpolated_xy_function() {}
 
  275   struct product_of_xy_functions : 
public abstract_xy_function {
 
  276     pxy_function fn1, fn2;
 
  277     scalar_type val(scalar_type x, scalar_type y)
 const {
 
  278       return fn1->val(x,y) * fn2->val(x,y);
 
  280     base_small_vector grad(scalar_type x, scalar_type y)
 const {
 
  281       return fn1->grad(x,y)*fn2->val(x,y) + fn1->val(x,y)*fn2->grad(x,y);
 
  283     virtual base_matrix hess(scalar_type x, scalar_type y)
 const {
 
  284       base_matrix h = fn1->hess(x,y);
 
  285       gmm::scale(h, fn2->val(x,y));
 
  286       gmm::add(gmm::scaled(fn2->hess(x,y), fn1->val(x,y)), h);
 
  287       gmm::rank_two_update(h, fn1->grad(x,y), fn2->grad(x,y));
 
  290     product_of_xy_functions(pxy_function &fn1_, pxy_function &fn2_)
 
  291       : fn1(fn1_), fn2(fn2_) {}
 
  292     virtual ~product_of_xy_functions() {}
 
  295   struct add_of_xy_functions : 
public abstract_xy_function {
 
  296     pxy_function fn1, fn2;
 
  297     scalar_type val(scalar_type x, scalar_type y)
 const {
 
  298       return fn1->val(x,y) + fn2->val(x,y);
 
  300     base_small_vector grad(scalar_type x, scalar_type y)
 const {
 
  301       return fn1->grad(x,y) + fn2->grad(x,y);
 
  303     virtual base_matrix hess(scalar_type x, scalar_type y)
 const {
 
  304       base_matrix h = fn1->hess(x,y);
 
  308     add_of_xy_functions(
const pxy_function &fn1_, 
const pxy_function &fn2_)
 
  309       : fn1(fn1_), fn2(fn2_) {}
 
  310     virtual ~add_of_xy_functions() {}
 
  318   global_function_on_level_set(
const level_set &ls, 
const pxy_function &fn);
 
  321   global_function_on_level_sets(
const std::vector<level_set> &lsets,
 
  322                                 const pxy_function &fn);
 
  325   global_function_bspline(
const scalar_type xmin, 
const scalar_type xmax,
 
  329   global_function_bspline(
const scalar_type xmin, 
const scalar_type xmax,
 
  330                           const scalar_type ymin, 
const scalar_type ymax,
 
  335   global_function_bspline(
const scalar_type xmin, 
const scalar_type xmax,
 
  336                           const scalar_type ymin, 
const scalar_type ymax,
 
  337                           const scalar_type zmin, 
const scalar_type zmax,
 
region-tree for window/point search on a set of rectangles.
does the inversion of the geometric transformation for a given convex
Balanced tree of n-dimensional rectangles.
base class for static stored objects
below a list of simple functions of (x,y) used for building the crack singular functions
structure passed as the argument of fem interpolation functions.
inherit from this class to define new global functions.
Describe a finite element method linked to a mesh.
A language for generic assembly of pde boundary value problems.
Define the getfem::mesh_fem class.
void add(const L1 &l1, L2 &l2)
*/
size_t size_type
used as the common size type in the library
GEneric Tool for Finite Element Methods.
a general structure for interpolation of a function defined by a mesh_fem and a vector U at any point...