Hermes2D  2.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 int 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 int 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 int 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 int* g_order_table_quad = default_order_table_quad;
41  static int* g_order_table_tri = default_order_table_tri;
42  static bool warned_order = false;
43 
44  HERMES_API int g_max_order;
45  HERMES_API int g_safe_max_order;
46 
47  HERMES_API void set_order_limit_table(int* tri_table, int* quad_table, int n)
48  {
49  if(n < 24) throw Hermes::Exceptions::Exception("Hermes::Order limit tables must have at least 24 entries.");
50  g_order_table_tri = tri_table;
51  g_order_table_quad = quad_table;
52  }
53 
54  HERMES_API void update_limit_table(ElementMode2D mode)
55  {
56  g_max_order = g_quad_2d_std.get_max_order(mode);
57  g_safe_max_order = g_quad_2d_std.get_safe_max_order(mode);
58  }
59 
60  HERMES_API void reset_warn_order()
61  {
62  warned_order = false;
63  }
64 
65  HERMES_API void warn_order()
66  {
67  if(!warned_order)
68  {
69 #pragma omp critical (warn_oder)
70  if(!warned_order)
71  {
72  Global<double> logger;
74  logger.warn("Warning: Not enough integration rules for exact integration.");
75  warned_order = true;
76  }
77  }
78  }
79 
80  HERMES_API void limit_order(int& o, ElementMode2D mode)
81  {
82  if(o > g_quad_2d_std.get_safe_max_order(mode))
83  {
84  o = g_quad_2d_std.get_safe_max_order(mode);
85  warn_order();
86  }
87  if(mode == HERMES_MODE_TRIANGLE)
88  o = g_order_table_tri[o];
89  else
90  o = g_order_table_quad[o];
91  }
92 
93  HERMES_API void limit_order_nowarn(int& o, ElementMode2D mode)
94  {
95  if(o > g_quad_2d_std.get_safe_max_order(mode))
96  o = g_quad_2d_std.get_safe_max_order(mode);
97  if(mode == HERMES_MODE_TRIANGLE)
98  o = g_order_table_tri[o];
99  else
100  o = g_order_table_quad[o];
101  }
102  }
103 }