Hermes2D  2.0
selector.cpp
1 #include "global.h"
2 #include "solution.h"
3 #include "element_to_refine.h"
4 #include "selector.h"
5 namespace Hermes
6 {
7  namespace Hermes2D
8  {
9  namespace RefinementSelectors
10  {
11  template<typename Scalar>
13  {
14  return new HOnlySelector();
15  }
16 
17  template<typename Scalar>
18  bool HOnlySelector<Scalar>::select_refinement(Element* element, int quad_order, Solution<Scalar>* rsln, ElementToRefine& refinement)
19  {
20  refinement.split = H2D_REFINEMENT_H;
21  refinement.p[0] = refinement.p[1] = refinement.p[2] = refinement.p[3] = quad_order;
22  refinement.q[0] = refinement.q[1] = refinement.q[2] = refinement.q[3] = quad_order;
23  return true;
24  }
25 
26  template<typename Scalar>
27  void HOnlySelector<Scalar>::generate_shared_mesh_orders(const Element* element, const int orig_quad_order, const int refinement, int tgt_quad_orders[H2D_MAX_ELEMENT_SONS], const int* suggested_quad_orders)
28  {
29  if(suggested_quad_orders != NULL)
30  for(int i = 0; i < H2D_MAX_ELEMENT_SONS; i++)
31  tgt_quad_orders[i] = suggested_quad_orders[i];
32  else
33  for(int i = 0; i < H2D_MAX_ELEMENT_SONS; i++)
34  tgt_quad_orders[i] = orig_quad_order;
35  }
36 
37  template<typename Scalar>
39  {
40  return new POnlySelector(this->max_order, this->order_h_inc, this->order_v_inc);
41  }
42 
43  template<typename Scalar>
44  POnlySelector<Scalar>::POnlySelector(int max_order, int order_h_inc, int order_v_inc)
45  : Selector<Scalar>(max_order), order_h_inc(order_h_inc), order_v_inc(order_v_inc)
46  {
47  if(order_h_inc < 0)
48  throw Hermes::Exceptions::ValueException("horizontal increase", order_h_inc, 0);
49  if(order_v_inc < 0)
50  throw Hermes::Exceptions::ValueException("vertical increase", order_v_inc, 0);
51  }
52 
53  template<typename Scalar>
54  bool POnlySelector<Scalar>::select_refinement(Element* element, int quad_order, Solution<Scalar>* rsln, ElementToRefine& refinement)
55  {
56  refinement.split = H2D_REFINEMENT_P;
57 
58  //determin max. order
59  int max_allowed_order = this->max_order;
60  if(this->max_order == H2DRS_DEFAULT_ORDER)
61  max_allowed_order = H2DRS_MAX_ORDER;
62 
63  //calculate new order
64  int order_h = H2D_GET_H_ORDER(quad_order), order_v = H2D_GET_V_ORDER(quad_order);
65  int new_order_h = std::min(max_allowed_order, order_h + order_h_inc);
66  int new_order_v = std::min(max_allowed_order, order_v + order_v_inc);
67  if(element->is_triangle())
68  refinement.p[0] = refinement.q[0] = new_order_h;
69  else
70  refinement.p[0] = refinement.q[0] = H2D_MAKE_QUAD_ORDER(new_order_h, new_order_v);
71 
72  //decide if successful
73  if(new_order_h > order_h || new_order_v > order_v)
74  return true;
75  else
76  return false;
77  }
78 
79  template<typename Scalar>
80  void POnlySelector<Scalar>::generate_shared_mesh_orders(const Element* element, const int orig_quad_order, const int refinement, int tgt_quad_orders[H2D_MAX_ELEMENT_SONS], const int* suggested_quad_orders)
81  {
82  if(suggested_quad_orders != NULL)
83  tgt_quad_orders[0] = suggested_quad_orders[0];
84  else
85  tgt_quad_orders[0] = orig_quad_order;
86 #ifdef _DEBUG
87  for(int i = 1; i < H2D_MAX_ELEMENT_SONS; i++)
88  tgt_quad_orders[i] = 0;
89 #endif
90  }
91 
92  template class HERMES_API Selector<double>;
93  template class HERMES_API Selector<std::complex<double> >;
94  template class HERMES_API HOnlySelector<double>;
95  template class HERMES_API HOnlySelector<std::complex<double> >;
96  template class HERMES_API POnlySelector<double>;
97  template class HERMES_API POnlySelector<std::complex<double> >;
98  }
99  }
100 }