16 #ifndef __H2D_FUNCTION_H
17 #define __H2D_FUNCTION_H
19 #include "transformable.h"
20 #include "../quadrature/quad.h"
21 #include "exceptions.h"
28 class PrecalcShapeset;
29 namespace RefinementSelectors{
39 template<
typename Scalar>
class Geom;
50 H2D_FN_VAL_0 = 0x0001, H2D_FN_VAL_1 = 0x0040,
51 H2D_FN_DX_0 = 0x0002, H2D_FN_DX_1 = 0x0080,
52 H2D_FN_DY_0 = 0x0004, H2D_FN_DY_1 = 0x0100,
53 H2D_FN_DXX_0 = 0x0008, H2D_FN_DXX_1 = 0x0200,
54 H2D_FN_DYY_0 = 0x0010, H2D_FN_DYY_1 = 0x0400,
55 H2D_FN_DXY_0 = 0x0020, H2D_FN_DXY_1 = 0x0800
60 const int H2D_FN_DX = H2D_FN_DX_0 | H2D_FN_DX_1;
61 const int H2D_FN_DY = H2D_FN_DY_0 | H2D_FN_DY_1;
62 const int H2D_FN_DXX = H2D_FN_DXX_0 | H2D_FN_DXX_1;
63 const int H2D_FN_DYY = H2D_FN_DYY_0 | H2D_FN_DYY_1;
64 const int H2D_FN_DXY = H2D_FN_DXY_0 | H2D_FN_DXY_1;
69 const int H2D_FN_COMPONENT_0 = H2D_FN_VAL_0 | H2D_FN_DX_0 | H2D_FN_DY_0 | H2D_FN_DXX_0 | H2D_FN_DYY_0 | H2D_FN_DXY_0;
70 const int H2D_FN_COMPONENT_1 = H2D_FN_VAL_1 | H2D_FN_DX_1 | H2D_FN_DY_1 | H2D_FN_DXX_1 | H2D_FN_DYY_1 | H2D_FN_DXY_1;
97 template<
typename Scalar>
110 int get_num_components()
const;
115 Scalar* get_fn_values(
int component = 0);
120 Scalar* get_dx_values(
int component = 0);
125 Scalar* get_dy_values(
int component = 0);
132 void get_dx_dy_values(Scalar*& dx, Scalar*& dy,
int component = 0);
137 Scalar* get_dxx_values(
int component = 0);
142 Scalar* get_dyy_values(
int component = 0);
147 Scalar* get_dxy_values(
int component = 0);
150 Quad2D* get_quad_2d()
const;
158 void set_quad_order(
unsigned int order,
int mask =
H2D_FN_DEFAULT);
160 Scalar* get_values(
int a,
int b);
163 int get_fn_order()
const;
171 virtual void set_quad_2d(
Quad2D* quad_2d);
174 virtual void free() = 0;
182 Scalar* values[H2D_MAX_SOLUTION_COMPONENTS][6];
189 Node& operator=(
const Node& other) {
return *
this; };
194 virtual int get_edge_fn_order(
int edge)
const;
197 virtual void precalculate(
int order,
int mask) = 0;
217 void update_nodes_ptr();
220 void force_transform(uint64_t sub_idx,
Trf* ctm);
230 Node* new_node(
int mask,
int num_points);
232 virtual void handle_overflow_idx() = 0;
234 void replace_cur_node(
Node* node);
236 static void check_params(
int component,
Node* cur_node,
int num_components);
238 static void check_table(
int component,
Node* cur_node,
int n,
const char* msg);
240 static int idx2mask[6][2];
245 template<
typename T>
friend class Adapt;
253 template<
typename T>
friend class Global;
256 template<
typename T>
friend class Func;
257 template<
typename T>
friend class Geom;
258 template<
typename T>
friend class Filter;