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...