Hermes2D  3.0
thread_linearizer.h
Go to the documentation of this file.
1 // This file is part of Hermes2D.
2 //
3 // Hermes2D is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 2 of the License, or
6 // (at your option) any later version.
7 //
8 // Hermes2D is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with Hermes2D. If not, see <http://www.gnu.org/licenses/>.
19 #ifndef __H2D_THREAD_LINEARIZER_H
20 #define __H2D_THREAD_LINEARIZER_H
21 
22 #include "linearizer.h"
23 #include "linearizer_utils.h"
24 #include <pthread.h>
25 #include "../function/mesh_function.h"
26 
27 namespace Hermes
28 {
29  namespace Hermes2D
30  {
31  namespace Views
32  {
33  template<typename LinearizerDataDimensions>
34  class HERMES_API LinearizerMultidimensional;
35 
39  template<typename LinearizerDataDimensions>
41  {
42  public:
44  void free();
45 
46  private:
51 
53  void init_linearizer_data(LinearizerMultidimensional<LinearizerDataDimensions>* linearizer);
54 
58  void deinit_processing();
59 
61  void process_state(Traverse::State* current_state);
62 
64  int hash(int p1, int p2);
66  int peek_vertex(int p1, int p2);
67 
69  void process_edge(int iv1, int iv2, int marker);
71  void add_edge(int iv1, int iv2, int marker);
73  void add_triangle(int iv0, int iv1, int iv2, int marker);
74 
76  int add_vertex();
78  int get_vertex(int p1, int p2, double x, double y, double* value);
79 
83  void process_triangle(int iv0, int iv1, int iv2, int level);
87  void process_quad(int iv0, int iv1, int iv2, int iv3, int level);
88 
96  void split_decision(int& split, int iv0, int iv1, int iv2, int iv3, ElementMode2D mode, const double** val, double* phx, double* phy, unsigned short* indices) const;
97 
99  bool quad_flip(int iv0, int iv1, int iv2, int iv3) const;
100 
102  double get_max_value(Traverse::State* current_state);
103  double max_value_approx;
104 
106  void push_transforms(int transform);
107 
109  void pop_transforms();
110 
113  void reallocate(MeshSharedPtr mesh);
114 
116  MeshFunction<double>* fns[LinearizerDataDimensions::dimension + 2];
117 
121  LinearizerCriterion criterion;
122 
124  typename LinearizerDataDimensions::triangle_t* triangles;
125  typename LinearizerDataDimensions::edge_t* edges;
127  int* edge_markers;
128 
132  triangle_indices_t* triangle_indices;
133 
135  typename LinearizerDataDimensions::vertex_t* vertices;
137  int* triangle_markers;
139  int* hash_table;
142 
144  int vertex_count, triangle_count, edges_count;
146  int vertex_size, triangle_size, edges_size;
147 
149  double midval[LinearizerDataDimensions::dimension + 2][5];
151  const double* val[LinearizerDataDimensions::dimension];
153  Element* rep_element;
155  bool curved;
156 
158  LinearizerOutputType linearizerOutputType;
159 
161  int item[LinearizerDataDimensions::dimension], component[LinearizerDataDimensions::dimension], value_type[LinearizerDataDimensions::dimension];
163  bool user_xdisp, user_ydisp;
165  double dmult;
167  double curvature_epsilon;
168 
169  friend class LinearizerMultidimensional < LinearizerDataDimensions > ;
170  };
171  }
172  }
173 }
174 #endif
Definition: adapt.h:24
Stores one element of a mesh.
Definition: element.h:107
int3 internal_vertex_info_t
Typedefs used throughout the Linearizer functionality.
File containing LinearizerMultidimensional class.
File containing utilities for class.
int3 triangle_indices_t
Typedefs used throughout the Linearizer functionality.
Abstract class for criterion according to which the linearizer stops dividing elements at some point ...