Hermes2D  3.0
selector.cpp
1 #include "global.h"
2 #include "selector.h"
3 #include "candidates.h"
4 
5 namespace Hermes
6 {
7  namespace Hermes2D
8  {
9  namespace RefinementSelectors
10  {
11  template<typename Scalar>
13  {
14  refinement.split = H2D_REFINEMENT_H;
19  order;
21  return true;
22  }
23 
24  template<typename Scalar>
25  POnlySelector<Scalar>::POnlySelector(int max_order, int order_h_inc, int order_v_inc)
26  : Selector<Scalar>(max_order), order_h_inc(order_h_inc), order_v_inc(order_v_inc)
27  {
28  if (order_h_inc < 0)
29  throw Hermes::Exceptions::ValueException("horizontal increase", order_h_inc, 0);
30  if (order_v_inc < 0)
31  throw Hermes::Exceptions::ValueException("vertical increase", order_v_inc, 0);
32  }
33 
34  template<typename Scalar>
36  {
37  refinement.split = H2D_REFINEMENT_P;
38 
39  //determin max. order
40  int max_allowed_order = this->max_order;
41  if (this->max_order == H2DRS_DEFAULT_ORDER)
42  max_allowed_order = H2DRS_MAX_ORDER;
43 
44  //calculate new_ order
45  int order_h = H2D_GET_H_ORDER(order), order_v = H2D_GET_V_ORDER(order);
46  int new_order_h = std::min(max_allowed_order, order_h + order_h_inc);
47  int new_order_v = std::min(max_allowed_order, order_v + order_v_inc);
48  if (element->is_triangle())
49  refinement.refinement_polynomial_order[0] = refinement.best_refinement_polynomial_order_type[H2D_REFINEMENT_P][0] = new_order_h;
50  else
51  refinement.refinement_polynomial_order[0] = refinement.best_refinement_polynomial_order_type[H2D_REFINEMENT_P][0] = H2D_MAKE_QUAD_ORDER(new_order_h, new_order_v);
52 
53  //decide if successful
54  if (new_order_h > order_h || new_order_v > order_v)
55  return true;
56  else
57  return false;
58  }
59 
60  template class HERMES_API Selector < double > ;
61  template class HERMES_API Selector < std::complex<double> > ;
62  template class HERMES_API HOnlySelector < double > ;
63  template class HERMES_API HOnlySelector < std::complex<double> > ;
64  template class HERMES_API POnlySelector < double > ;
65  template class HERMES_API POnlySelector < std::complex<double> > ;
66  }
67  }
68 }
POnlySelector(int max_order=H2DRS_DEFAULT_ORDER, int order_h_inc=1, int order_v_inc=1)
Constructor.
Definition: selector.cpp:25
Definition: adapt.h:24
Stores one element of a mesh.
Definition: element.h:107
#define H2DRS_MAX_ORDER
A maximum order suported by refinement selectors.
Definition: global.h:104
Represents a function defined on a mesh.
Definition: mesh_function.h:56
Common definitions for Hermes2D.
A selector that selects H-refinements only.
Definition: function.h:30
unsigned short refinement_polynomial_order[H2D_MAX_ELEMENT_SONS]
Encoded orders of sons.
static void copy_orders(unsigned short *dest, const unsigned short *src)
Copies array of orders.
RefinementType split
Proposed refinement. Possible values are defined in the enum RefinementType.
#define H2D_GET_H_ORDER(encoded_order)
Macros for combining quad horizontal and vertical encoded_orders.
Definition: global.h:98
A selector that increases order (i.e., it selects P-refinements only).
Definition: function.h:31
virtual bool select_refinement(Element *element, int quad_order, MeshFunction< Scalar > *rsln, ElementToRefine &refinement)
Selects a refinement.
Definition: selector.cpp:35
A parent of all refinement selectors. Abstract class.
Definition: function.h:29
#define H2DRS_DEFAULT_ORDER
A default order. Used to indicate an unkonwn order or a maximum support order.
Definition: global.h:103
unsigned short best_refinement_polynomial_order_type[4][H2D_MAX_ELEMENT_SONS]
virtual bool select_refinement(Element *element, int quad_order, MeshFunction< Scalar > *rsln, ElementToRefine &refinement)
Selects a refinement.
Definition: selector.cpp:12