38 #ifndef GETFEM_GLOBAL_FUNCTION_H__
39 #define GETFEM_GLOBAL_FUNCTION_H__
52 dim_type dim()
const {
return dim_; }
55 { GMM_ASSERT1(
false,
"this global_function has no value"); }
57 { GMM_ASSERT1(
false,
"this global_function has no gradient"); }
59 { GMM_ASSERT1(
false,
"this global_function has no hessian"); }
61 virtual bool is_in_support(
const base_node & )
const {
return true; }
62 virtual void bounding_box(base_node &bmin, base_node &bmax)
const {
63 GMM_ASSERT1(bmin.size() == dim_ && bmax.size() == dim_,
65 for (
auto&& xx : bmin) xx = -1e+25;
66 for (
auto&& xx : bmax) xx = 1e+25;
70 { DAL_STORED_OBJECT_DEBUG_CREATED(
this,
"Global function");}
72 { DAL_STORED_OBJECT_DEBUG_DESTROYED(
this,
"Global function"); }
75 typedef std::shared_ptr<const global_function> pglobal_function;
85 virtual scalar_type val(
const base_node &pt)
const = 0;
86 virtual void grad(
const base_node &pt, base_small_vector&)
const = 0;
87 virtual void hess(
const base_node &pt, base_matrix&)
const = 0;
90 { DAL_STORED_OBJECT_DEBUG_CREATED(
this,
"Global function simple"); }
91 virtual ~global_function_simple()
92 { DAL_STORED_OBJECT_DEBUG_DESTROYED(
this,
"Global function simple"); }
95 class global_function_parser :
public global_function_simple {
97 ga_function f_val, f_grad, f_hess;
98 mutable model_real_plain_vector pt_;
100 virtual scalar_type val(
const base_node &pt)
const;
101 virtual const base_tensor &tensor_val(
const base_node &pt)
const;
102 virtual void grad(
const base_node &pt, base_small_vector &g)
const;
103 virtual void hess(
const base_node &pt, base_matrix &h)
const;
105 global_function_parser(dim_type dim_,
106 const std::string &sval,
107 const std::string &sgrad=
"",
108 const std::string &shess=
"");
109 virtual ~global_function_parser()
110 { DAL_STORED_OBJECT_DEBUG_DESTROYED(
this,
"Global function parser"); }
114 class global_function_sum :
public global_function {
115 std::vector<pglobal_function> functions;
117 virtual scalar_type val(
const fem_interpolation_context&)
const;
118 virtual void grad(
const fem_interpolation_context&, base_small_vector&)
const;
119 virtual void hess(
const fem_interpolation_context&, base_matrix&)
const;
120 virtual bool is_in_support(
const base_node &p)
const;
121 virtual void bounding_box(base_node &bmin_, base_node &bmax_)
const;
122 global_function_sum(
const std::vector<pglobal_function> &funcs);
123 global_function_sum(pglobal_function f1, pglobal_function f2);
124 global_function_sum(pglobal_function f1, pglobal_function f2,
125 pglobal_function f3);
126 global_function_sum(pglobal_function f1, pglobal_function f2,
127 pglobal_function f3, pglobal_function f4);
128 virtual ~global_function_sum()
129 { DAL_STORED_OBJECT_DEBUG_DESTROYED(
this,
"Global function sum"); }
132 class global_function_product :
public global_function {
133 pglobal_function f1, f2;
135 virtual scalar_type val(
const fem_interpolation_context&)
const;
136 virtual void grad(
const fem_interpolation_context&, base_small_vector&)
const;
137 virtual void hess(
const fem_interpolation_context&, base_matrix&)
const;
138 virtual bool is_in_support(
const base_node &p)
const;
139 virtual void bounding_box(base_node &bmin_, base_node &bmax_)
const;
140 global_function_product(pglobal_function f1_, pglobal_function f2_);
141 virtual ~global_function_product()
142 { DAL_STORED_OBJECT_DEBUG_DESTROYED(
this,
"Global function product"); }
145 class global_function_bounded :
public global_function {
147 const base_node bmin, bmax;
151 mutable model_real_plain_vector pt_;
153 virtual scalar_type val(
const fem_interpolation_context &c)
const
154 {
return f->val(c); }
155 virtual void grad(
const fem_interpolation_context &c, base_small_vector &g)
const
157 virtual void hess(
const fem_interpolation_context &c, base_matrix &h)
const
160 virtual bool is_in_support(
const base_node &)
const;
161 virtual void bounding_box(base_node &bmin_, base_node &bmax_)
const {
167 global_function_bounded(pglobal_function f_,
168 const base_node &bmin_,
const base_node &bmax_,
169 const std::string &is_in_expr=
"");
170 virtual ~global_function_bounded()
171 { DAL_STORED_OBJECT_DEBUG_DESTROYED(
this,
"Global function bounded"); }
182 std::vector<scalar_type> U;
186 mutable bgeot::rtree::pbox_set boxlst;
191 const std::vector<scalar_type> &U_);
192 bool find_a_point(
const base_node &pt, base_node &ptr,
194 bool eval(
const base_node &pt, base_vector &val, base_matrix &grad)
const;
197 typedef std::shared_ptr<const interpolator_on_mesh_fem>
198 pinterpolator_on_mesh_fem;
206 virtual scalar_type val(scalar_type x, scalar_type y)
const = 0;
207 virtual base_small_vector grad(scalar_type x, scalar_type y)
const = 0;
208 virtual base_matrix hess(scalar_type x, scalar_type y)
const = 0;
212 typedef std::shared_ptr<const abstract_xy_function> pxy_function;
216 ga_function f_val, f_grad, f_hess;
217 mutable model_real_plain_vector ptx, pty, ptr, ptt;
219 virtual scalar_type val(scalar_type x, scalar_type y)
const;
220 virtual base_small_vector grad(scalar_type x, scalar_type y)
const;
221 virtual base_matrix hess(scalar_type x, scalar_type y)
const;
223 parser_xy_function(
const std::string &sval,
224 const std::string &sgrad=
"0;0;",
225 const std::string &shess=
"0;0;0;0;");
226 virtual ~parser_xy_function() {}
229 struct crack_singular_xy_function :
public abstract_xy_function {
231 virtual scalar_type val(scalar_type x, scalar_type y)
const;
232 virtual base_small_vector grad(scalar_type x, scalar_type y)
const;
233 virtual base_matrix hess(scalar_type x, scalar_type y)
const;
234 crack_singular_xy_function(
unsigned l_) : l(l_) {}
235 virtual ~crack_singular_xy_function() {}
238 struct cutoff_xy_function :
public abstract_xy_function {
239 enum { NOCUTOFF = -1,
240 EXPONENTIAL_CUTOFF = 0,
241 POLYNOMIAL_CUTOFF = 1,
242 POLYNOMIAL2_CUTOFF= 2 };
244 scalar_type a4, r1, r0;
245 virtual scalar_type val(scalar_type x, scalar_type y)
const;
246 virtual base_small_vector grad(scalar_type x, scalar_type y)
const;
247 virtual base_matrix hess(scalar_type x, scalar_type y)
const;
248 cutoff_xy_function(
int fun_num, scalar_type r,
249 scalar_type r1, scalar_type r0);
250 virtual ~cutoff_xy_function() {}
253 struct interpolated_xy_function :
public abstract_xy_function {
254 pinterpolator_on_mesh_fem itp;
256 virtual scalar_type val(scalar_type x, scalar_type y)
const {
257 base_vector v; base_matrix g;
258 itp->eval(base_node(x,y), v, g);
261 virtual base_small_vector grad(scalar_type x, scalar_type y)
const {
262 base_vector v; base_matrix g;
263 itp->eval(base_node(x,y), v, g);
264 return base_small_vector(g(component,0), g(component,1));
266 virtual base_matrix hess(scalar_type, scalar_type)
const
267 { GMM_ASSERT1(
false,
"Sorry, to be done ..."); }
268 interpolated_xy_function(
const pinterpolator_on_mesh_fem &itp_,
270 itp(itp_), component(c) {}
271 virtual ~interpolated_xy_function() {}
274 struct product_of_xy_functions :
public abstract_xy_function {
275 pxy_function fn1, fn2;
276 scalar_type val(scalar_type x, scalar_type y)
const {
277 return fn1->val(x,y) * fn2->val(x,y);
279 base_small_vector grad(scalar_type x, scalar_type y)
const {
280 return fn1->grad(x,y)*fn2->val(x,y) + fn1->val(x,y)*fn2->grad(x,y);
282 virtual base_matrix hess(scalar_type x, scalar_type y)
const {
283 base_matrix h = fn1->hess(x,y);
284 gmm::scale(h, fn2->val(x,y));
285 gmm::add(gmm::scaled(fn2->hess(x,y), fn1->val(x,y)), h);
286 gmm::rank_two_update(h, fn1->grad(x,y), fn2->grad(x,y));
289 product_of_xy_functions(pxy_function &fn1_, pxy_function &fn2_)
290 : fn1(fn1_), fn2(fn2_) {}
291 virtual ~product_of_xy_functions() {}
294 struct add_of_xy_functions :
public abstract_xy_function {
295 pxy_function fn1, fn2;
296 scalar_type val(scalar_type x, scalar_type y)
const {
297 return fn1->val(x,y) + fn2->val(x,y);
299 base_small_vector grad(scalar_type x, scalar_type y)
const {
300 return fn1->grad(x,y) + fn2->grad(x,y);
302 virtual base_matrix hess(scalar_type x, scalar_type y)
const {
303 base_matrix h = fn1->hess(x,y);
307 add_of_xy_functions(
const pxy_function &fn1_,
const pxy_function &fn2_)
308 : fn1(fn1_), fn2(fn2_) {}
309 virtual ~add_of_xy_functions() {}
317 global_function_on_level_set(
const level_set &ls,
const pxy_function &fn);
320 global_function_on_level_sets(
const std::vector<level_set> &lsets,
321 const pxy_function &fn);
324 global_function_bspline(
const scalar_type xmin,
const scalar_type xmax,
328 global_function_bspline(
const scalar_type xmin,
const scalar_type xmax,
329 const scalar_type ymin,
const scalar_type ymax,
334 global_function_bspline(
const scalar_type xmin,
const scalar_type xmax,
335 const scalar_type ymin,
const scalar_type ymax,
336 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...