21 #include "linearizer_base.h"
30 Quad2DLin::Quad2DLin()
32 max_order[0] = max_order[1] = 1;
33 num_tables[0] = num_tables[1] = 2;
38 LinearizerBase::LinearizerBase(
bool auto_max) : auto_max(auto_max), del_slot(-1), empty(true)
48 vertex_count = triangle_count =
edges_count = this->vertex_size = this->triangle_size = this->
edges_size = 0;
50 pthread_mutexattr_t attr;
51 pthread_mutexattr_init(&attr);
52 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
53 pthread_mutex_init(&data_mutex, &attr);
54 pthread_mutexattr_destroy(&attr);
81 LinearizerBase::~LinearizerBase()
84 pthread_mutex_destroy(&data_mutex);
87 void LinearizerBase::lock_data()
const
89 pthread_mutex_lock(&data_mutex);
92 void LinearizerBase::unlock_data()
const
94 pthread_mutex_unlock(&data_mutex);
97 void LinearizerBase::process_edge(
int iv1,
int iv2,
int marker)
99 int mid = peek_vertex(iv1, iv2);
102 process_edge(iv1, mid, marker);
103 process_edge(mid, iv2, marker);
106 add_edge(iv1, iv2, marker);
109 void LinearizerBase::regularize_triangle(
int iv0,
int iv1,
int iv2,
int mid0,
int mid1,
int mid2,
int marker)
119 regularize_triangle(iv0, mid0, mid2, peek_vertex(iv0, mid0), -1, peek_vertex(mid2, iv0), marker);
120 regularize_triangle(mid0, iv1, mid1, peek_vertex(mid0, iv1), peek_vertex(iv1, mid1), -1, marker);
121 regularize_triangle(mid2, mid1, iv2, -1, peek_vertex(mid1, iv2), peek_vertex(iv2, mid2), marker);
122 regularize_triangle(mid0, mid1, mid2, -1, -1, -1, marker);
129 regularize_triangle(iv0, iv1, mid1, peek_vertex(iv0, iv1), peek_vertex(iv1, mid1), -1, marker);
130 regularize_triangle(mid2, iv0, mid1, peek_vertex(mid2, iv0), -1, -1, marker);
131 regularize_triangle(mid2, mid1, iv2, -1, peek_vertex(mid1, iv2), peek_vertex(iv2, mid2), marker);
135 regularize_triangle(iv1, iv2, mid2, peek_vertex(iv1, iv2), peek_vertex(iv2, mid2), -1, marker);
136 regularize_triangle(mid0, iv1, mid2, peek_vertex(mid0, iv1), -1, -1, marker);
137 regularize_triangle(mid0, mid2, iv0, -1, peek_vertex(mid2, iv0), peek_vertex(iv0, mid0), marker);
141 regularize_triangle(iv2, iv0, mid0, peek_vertex(iv2, iv0), peek_vertex(iv0, mid0), -1, marker);
142 regularize_triangle(mid1, iv2, mid0, peek_vertex(mid1, iv2), -1, -1, marker);
143 regularize_triangle(mid1, mid0, iv1, -1, peek_vertex(mid0, iv1), peek_vertex(iv1, mid1), marker);
151 regularize_triangle(iv0, mid0, iv2, peek_vertex(iv0, mid0), -1, peek_vertex(iv2, iv0), marker);
152 regularize_triangle(mid0, iv1, iv2, peek_vertex(mid0, iv1), peek_vertex(iv1, iv2), -1, marker);
156 regularize_triangle(iv1, mid1, iv0, peek_vertex(iv1, mid1), -1, peek_vertex(iv0, iv1), marker);
157 regularize_triangle(mid1, iv2, iv0, peek_vertex(mid1, iv2), peek_vertex(iv2, iv0), -1, marker);
161 regularize_triangle(iv2, mid2, iv1, peek_vertex(iv2, mid2), -1, peek_vertex(iv1, iv2), marker);
162 regularize_triangle(mid2, iv0, iv1, peek_vertex(mid2, iv0), peek_vertex(iv0, iv1), -1, marker);
168 add_triangle(iv0, iv1, iv2, marker);
172 void LinearizerBase::add_edge(
int iv1,
int iv2,
int marker)
174 #pragma omp critical(realloc_edges)
187 int LinearizerBase::peek_vertex(
int p1,
int p2)
190 if(p1 > p2) std::swap(p1, p2);
191 int index = hash(p1, p2);
195 if(
info[i][0] == p1 &&
info[i][1] == p2)
return i;
201 void LinearizerBase::add_triangle(
int iv0,
int iv1,
int iv2,
int marker)
204 #pragma omp critical(realloc_triangles)
212 if(triangle_count >= triangle_size)
214 tris = (int3*) realloc(
tris,
sizeof(int3) * (triangle_size * 2));
217 index = triangle_count++;
219 tris[index][0] = iv0;
220 tris[index][1] = iv1;
221 tris[index][2] = iv2;
227 int LinearizerBase::hash(
int p1,
int p2)
229 return (984120265*p1 + 125965121*p2) & (vertex_size - 1);
232 void LinearizerBase::set_max_absolute_value(
double max_abs)
235 this->warn(
"Setting of maximum absolute value in Linearizer with a negative value");
238 this->auto_max =
false;
244 double LinearizerBase::get_min_value()
const
249 double LinearizerBase::get_max_value()
const
256 *min_x = *max_x = *x;
257 *min_y = *max_y = *y;
259 uint8_t* ptr_x = (uint8_t*)x;
260 uint8_t* ptr_y = (uint8_t*)y;
261 for(
int i = 0; i < num; i++, ptr_x += stride, ptr_y += stride)
263 *min_x = std::min(*min_x, *((
double*)ptr_x));
264 *min_y = std::min(*min_y, *((
double*)ptr_y));
265 *max_x = std::max(*max_x, *((
double*)ptr_x));
266 *max_y = std::max(*max_y, *((
double*)ptr_y));
270 int3* LinearizerBase::get_triangles()
274 int* LinearizerBase::get_triangle_markers()
278 int LinearizerBase::get_num_triangles()
280 return this->triangle_count;
282 int2* LinearizerBase::get_edges()
286 int* LinearizerBase::get_edge_markers()
290 int LinearizerBase::get_num_edges()