Hermes2D  3.0
limit_order.cpp
1 #include "global.h"
2 #include "quad_all.h"
3 #include "limit_order.h"
4 
5 namespace Hermes
6 {
7  namespace Hermes2D
8  {
9  static unsigned short default_order_table_tri[] =
10  {
11  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
12  17, 18, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
13  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
14  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
15  20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20
16  };
17 
18 #ifdef EXTREME_QUAD
19  static unsigned short default_order_table_quad[] =
20  {
21  1, 1, 3, 3, 5, 5, 7, 7, 9, 9, 11, 11, 13, 13, 15, 15,
22  17, 17, 19, 19, 21, 21, 23, 23, 25, 25, 27, 27, 29, 29, 31, 31,
23  33, 33, 35, 35, 37, 37, 39, 39, 41, 41, 43, 43, 45, 45, 47, 47,
24  49, 49, 51, 51, 53, 53, 55, 55, 57, 57, 59, 59, 61, 61, 63, 63,
25  65, 65, 67, 67, 69, 69, 71, 71, 73, 73, 75, 75, 77, 77, 79, 79,
26  81, 81, 83, 83, 85, 85, 87, 87, 89, 89, 91, 91, 93, 93, 95, 95,
27  97, 97, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99
28  };
29 #else
30  static unsigned short default_order_table_quad[] =
31  {
32  1, 1, 3, 3, 5, 5, 7, 7, 9, 9, 11, 11, 13, 13, 15, 15, 17,
33  17, 19, 19, 21, 21, 23, 23, 24, 24, 24, 24, 24, 24, 24,
34  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
35  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
36  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24
37  };
38 #endif
39 
40  static unsigned short* g_order_table_quad = default_order_table_quad;
41  static unsigned short* g_order_table_tri = default_order_table_tri;
42  static bool warned_order = false;
43 
44  HERMES_API unsigned short g_max_order;
45  HERMES_API unsigned short g_safe_max_order;
46 
47  HERMES_API void set_order_limit_table(unsigned short* tri_table, unsigned short* quad_table, unsigned short n)
48  {
49  if (n < 24)
50  throw Hermes::Exceptions::Exception("Hermes::Order limit tables must have at least 24 entries.");
51  g_order_table_tri = tri_table;
52  g_order_table_quad = quad_table;
53  }
54 
55  HERMES_API void update_limit_table(ElementMode2D mode)
56  {
57  g_max_order = g_quad_2d_std.get_max_order(mode);
58  g_safe_max_order = g_quad_2d_std.get_safe_max_order(mode);
59  }
60 
61  HERMES_API void reset_warn_order()
62  {
63  warned_order = false;
64  }
65 
66  HERMES_API void warn_order()
67  {
68  if (HermesCommonApi.get_integral_param_value(Hermes::showInternalWarnings))
69  if (!warned_order)
70  {
71 #pragma omp critical (warn_oder)
72  if (!warned_order)
73  {
75  Hermes::Mixins::Loggable::Static::warn("Warning: Not enough integration rules for exact integration.");
76  warned_order = true;
77  }
78  }
79  }
80 
81  HERMES_API void limit_order(int& o, ElementMode2D mode)
82  {
83  if (o >= g_quad_2d_std.get_safe_max_order(mode))
84  {
85  o = g_quad_2d_std.get_safe_max_order(mode);
86  warn_order();
87  }
88  if (mode == HERMES_MODE_TRIANGLE)
89  o = g_order_table_tri[o];
90  else
91  o = g_order_table_quad[o];
92  }
93 
94  HERMES_API void limit_order_nowarn(int& o, ElementMode2D mode)
95  {
96  if (o > g_quad_2d_std.get_safe_max_order(mode))
97  o = g_quad_2d_std.get_safe_max_order(mode);
98  if (mode == HERMES_MODE_TRIANGLE)
99  o = g_order_table_tri[o];
100  else
101  o = g_order_table_quad[o];
102  }
103  }
104 }
Definition: adapt.h:24
HERMES_API void set_order_limit_table(int *tri_table, unsigned short *quad_table, unsigned short n)
can be called to set a custom order limiting table
Common definitions for Hermes2D.
HERMES_API unsigned short g_safe_max_order
limit_order is used in integrals
Definition: limit_order.cpp:45
HERMES_API void warn_order()
Definition: limit_order.cpp:66