19 #include "../global.h"
22 #include "../mixins2d.h"
30 HERMES_TYPE_VERTEX = 0,
37 template<
typename Scalar>
class Space;
38 template<
typename Scalar>
class KellyTypeAdapt;
41 extern unsigned g_mesh_seq;
43 namespace RefinementSelectors
45 template<
typename Scalar>
class Selector;
46 template<
typename Scalar>
class POnlySelector;
47 template<
typename Scalar>
class HOnlySelector;
48 template<
typename Scalar>
class OptimumSelector;
49 template<
typename Scalar>
class ProjBasedSelector;
50 template<
typename Scalar>
class H1ProjBasedSelector;
51 template<
typename Scalar>
class L2ProjBasedSelector;
52 template<
typename Scalar>
class HcurlProjBasedSelector;
93 bool is_constrained_vertex()
const;
95 void ref_element(
Element* e = NULL);
136 double get_diameter();
139 void get_center(
double& x,
double& y);
151 int get_edge_orientation(
int ie)
const;
152 ElementMode2D get_mode()
const;
154 bool is_triangle()
const;
155 bool is_quad()
const;
156 bool is_curved()
const;
157 int get_nvert()
const;
179 int next_vert(
int i)
const;
180 int prev_vert(
int i)
const;
184 Element* get_neighbor(
int ie)
const;
187 void ref_all_nodes();
199 template<
typename Scalar>
friend class Space;
200 template<
typename Scalar>
friend class Adapt;
201 template<
typename Scalar>
friend class H1Space;
202 template<
typename Scalar>
friend class HcurlSpace;
203 template<
typename Scalar>
friend class HdivSpace;
204 template<
typename Scalar>
friend class L2Space;
207 template<
typename Scalar>
friend class Solution;
209 template<
typename Scalar>
friend class Filter;
211 template<
typename Scalar>
friend class Global;
228 friend bool is_twin_nurbs(
Element* e,
int i);
229 friend int rtb_criterion(
Element* e);
254 void init(
int size = H2D_DEFAULT_HASH_SIZE);
257 virtual bool isOkay()
const;
261 bool rescale(
double x_ref,
double y_ref);
264 void copy(
const Mesh* mesh);
267 void copy_base(
Mesh* mesh);
270 void copy_converted(
Mesh* mesh);
273 void create(
int nv, double2* verts,
int nt, int3* tris,
std::string* tri_markers,
280 Element* get_element(
int id)
const;
283 int get_num_elements()
const;
286 int get_num_base_elements()
const;
289 int get_num_used_base_elements()
const;
292 int get_num_active_elements()
const;
295 int get_max_element_id()
const;
298 int get_num_vertex_nodes()
const;
301 int get_num_edge_nodes()
const;
309 void refine_element_id(
int id,
int refinement = 0);
313 void refine_all_elements(
int refinement = 0,
bool mark_as_initial =
false);
322 void refine_by_criterion(
int (*criterion)(
Element* e),
int depth = 1,
bool mark_as_initial =
false);
326 void refine_towards_vertex(
int vertex_id,
int depth = 1,
bool mark_as_initial =
false);
332 void refine_towards_boundary(Hermes::vector<std::string> markers,
int depth = 1,
bool aniso =
true,
bool mark_as_initial =
false);
333 void refine_towards_boundary(
std::string marker,
int depth = 1,
bool aniso =
true,
bool mark_as_initial =
false);
336 void refine_in_area(
std::string marker,
int depth = 1,
bool mark_as_initial =
false);
338 void refine_in_areas(Hermes::vector<std::string> markers,
int depth = 1,
bool mark_as_initial =
false);
348 int* regularize(
int n);
352 void unrefine_element_id(
int id);
359 void unrefine_all_elements(
bool keep_initial_refinements =
true);
362 Element* get_element_fast(
int id)
const;
365 unsigned get_seq()
const;
368 void set_seq(
unsigned seq);
384 virtual Mesh* create_ref_mesh();
394 void initial_single_check();
395 static void initial_multimesh_check(Hermes::vector<Mesh*> meshes);
398 int get_edge_sons(
Element* e,
int edge,
int& son1,
int& son2)
const;
403 void convert_quads_to_triangles();
406 void convert_to_base();
408 void refine_element_to_quads_id(
int id);
412 void refine_element_to_triangles_id(
int id);
414 void refine_quad_to_triangles(
Element* e);
420 void refine_quad_to_quads(
Element* e,
int refinement = 0);
422 void convert_element_to_base_id(
int id);
423 void convert_triangles_to_base(
Element* e);
424 void convert_quads_to_base(
Element* e);
426 Array<Element> elements;
433 void unrefine_element_internal(
Element* e);
445 int get_edge_degree(
Node* v1,
Node* v2);
446 void assign_parent(
Element* e,
int i);
447 void regularize_triangle(
Element* e);
448 void regularize_quad(
Element* e);
451 class HERMES_API MarkersConversion
459 int min_marker_unused;
464 void insert_marker(
int internal_marker,
std::string user_marker);
486 StringValid get_user_marker(
int internal_marker)
const;
491 enum MarkersConversionType {
492 HERMES_ELEMENT_MARKERS_CONVERSION = 0,
493 HERMES_BOUNDARY_MARKERS_CONVERSION = 1
496 virtual MarkersConversionType get_type()
const = 0;
501 std::map<int, std::string> conversion_table;
505 std::map<std::string, int> conversion_table_inverse;
507 friend class Space<double>;
508 friend class Space<std::complex<double> >;
514 class HERMES_API CurvedException :
public Hermes::Exceptions::Exception
519 CurvedException(
int elementId);
520 CurvedException(
const CurvedException & e);
522 int getElementId()
const;
527 class ElementMarkersConversion :
public MarkersConversion
530 ElementMarkersConversion();
531 virtual MarkersConversionType get_type()
const;
534 class BoundaryMarkersConversion :
public MarkersConversion
537 BoundaryMarkersConversion();
538 virtual MarkersConversionType get_type()
const;
541 ElementMarkersConversion element_markers_conversion;
542 BoundaryMarkersConversion boundary_markers_conversion;
544 friend class MeshReaderH2D;
545 friend class MeshReaderH2DXML;
546 friend class MeshReaderH1DXML;
547 friend class MeshReaderExodusII;
548 friend class DiscreteProblem<double>;
549 friend class DiscreteProblem<std::complex<double> >;
550 friend class WeakForm<double>;
551 friend class WeakForm<std::complex<double> >;
552 template<typename Scalar> friend class Adapt;
553 friend class KellyTypeAdapt<double>;
554 template<typename Scalar> friend class Global;
555 friend class KellyTypeAdapt<std::complex<double> >;
556 template<typename Scalar> friend class Solution;
557 template<typename Scalar> friend class Filter;
558 template<typename Scalar> friend class MeshFunction;
560 friend class Traverse;
561 friend class Transformable;
563 friend class Views::MeshView;
564 template<typename Scalar> friend class RefinementSelectors::Selector;
565 template<typename Scalar> friend class RefinementSelectors::POnlySelector;
566 template<typename Scalar> friend class RefinementSelectors::HOnlySelector;
567 template<typename Scalar> friend class RefinementSelectors::OptimumSelector;
568 template<typename Scalar> friend class RefinementSelectors::ProjBasedSelector;
569 template<typename Scalar> friend class RefinementSelectors::H1ProjBasedSelector;
570 template<typename Scalar> friend class RefinementSelectors::L2ProjBasedSelector;
571 template<typename Scalar> friend class RefinementSelectors::HcurlProjBasedSelector;
572 friend class PrecalcShapeset;
573 template<typename Scalar> friend class Space;
574 template<typename Scalar> friend class H1Space;
575 template<typename Scalar> friend class HcurlSpace;
576 template<typename Scalar> friend class HdivSpace;
577 template<typename Scalar> friend class L2Space;
578 friend class Views::ScalarView;
579 friend class Views::Orderizer;
581 ElementMarkersConversion &get_element_markers_conversion();
582 BoundaryMarkersConversion &get_boundary_markers_conversion();
675 Element* create_quad(int marker, Node* v0, Node* v1, Node* v2, Node* v3, CurvMap* cm, int id = -1);
676 Element* create_triangle(int marker, Node* v0, Node* v1, Node* v2, CurvMap* cm, int id = -1);
677 void refine_element(Element* e, int refinement);
681 Hermes::vector<std::pair<unsigned int, int> > refinements;
688 void refine_quad(Element* e, int refinement, Element** sons_out = NULL);
689 void refine_triangle_to_triangles(Element* e, Element** sons = NULL);
692 static double vector_length(double a_1, double a_2);
695 static bool same_line(double p_1, double p_2, double q_1, double q_2, double r_1, double r_2);
698 static bool is_convex(double a_1, double a_2, double b_1, double b_2);
699 static void check_triangle(int i, Node *&v0, Node *&v1, Node *&v2);
700 static void check_quad(int i, Node *&v0, Node *&v1, Node *&v2, Node *&v3);
703 static
Node* get_edge_node();
704 static
Node* get_vertex_node(Node* v1, Node* v2);
707 #define for_all_elements(e, mesh) \
708 for (int _id = 0, _max = (mesh)->get_max_element_id(); _id < _max; _id++) \
709 if(((e) = (mesh)->get_element_fast(_id))->used)
711 #define for_all_base_elements(e, mesh) \
712 for (int _id = 0; _id < (mesh)->get_num_base_elements(); _id++) \
713 if(((e) = (mesh)->get_element_fast(_id))->used)
715 #define for_all_base_elements_incl_inactive(e, mesh) \
716 for (int _id = 0; _id < (mesh)->get_num_base_elements(); _id++) \
717 if(((e) = (mesh)->get_element_fast(_id))->used || !((e) = (mesh)->get_element_fast(_id))->used)
719 #define for_all_active_elements(e, mesh) \
720 for (int _id = 0, _max = (mesh)->get_max_element_id(); _id < _max; _id++) \
721 if(((e) = (mesh)->get_element_fast(_id))->used) \
724 #define for_all_inactive_elements(e, mesh) \
725 for (int _id = 0, _max = (mesh)->get_max_element_id(); _id < _max; _id++) \
726 if(((e) = (mesh)->get_element_fast(_id))->used) \
729 #define for_all_nodes(n, mesh) \
730 for (int _id = 0, _max = (mesh)->get_max_node_id(); _id < _max; _id++) \
731 if(((n) = (mesh)->get_node(_id))->used)
733 #define for_all_vertex_nodes(n, mesh) \
734 for (int _id = 0, _max = (mesh)->get_max_node_id(); _id < _max; _id++) \
735 if(((n) = (mesh)->get_node(_id))->used) \
738 #define for_all_edge_nodes(n, mesh) \
739 for (int _id = 0, _max = (mesh)->get_max_node_id(); _id < _max; _id++) \
740 if(((n) = (mesh)->get_node(_id))->used) \
743 const int TOP_LEVEL_REF = 123456;