24 RefMap::RefMap() : ref_map_shapeset(H1ShapesetJacobi()), ref_map_pss(PrecalcShapeset(&ref_map_shapeset))
30 set_quad_2d(&g_quad_2d_std);
33 RefMap::~RefMap() { free(); }
64 return const_jacobian;
71 return &const_inv_ref_map;
79 throw Hermes::Exceptions::Exception(
"Cur_node == NULL in RefMap - inner algorithms failed");
80 if(cur_node->inv_ref_map[order] == NULL)
81 calc_inv_ref_map(order);
82 return cur_node->jacobian[order];
91 throw Hermes::Exceptions::Exception(
"Cur_node == NULL in RefMap - inner algorithms failed");
92 if(cur_node->inv_ref_map[order] == NULL)
93 calc_inv_ref_map(order);
94 return cur_node->inv_ref_map[order];
98 double3x2* RefMap::get_second_ref_map(
int order)
101 throw Hermes::Exceptions::Exception(
"Cur_node == NULL in RefMap - inner algorithms failed");
102 if(cur_node->second_ref_map[order] == NULL) calc_second_ref_map(order);
103 return cur_node->second_ref_map[order];
112 throw Hermes::Exceptions::Exception(
"Cur_node == NULL in RefMap - inner algorithms failed");
113 if(cur_node->phys_x[order] == NULL) calc_phys_x(order);
114 return cur_node->phys_x[order];
123 throw Hermes::Exceptions::Exception(
"Cur_node == NULL in RefMap - inner algorithms failed");
124 if(cur_node->phys_y[order] == NULL) calc_phys_y(order);
125 return cur_node->phys_y[order];
136 throw Hermes::Exceptions::Exception(
"2d quadrature wasn't set.");
138 order = quad_2d->get_edge_points(edge, quad_2d->get_max_order(
element->get_mode()),
element->get_mode());
141 if(cur_node->tan[edge] != NULL)
143 delete [] cur_node->tan[edge];
144 cur_node->tan[edge] = NULL;
146 calc_tangent(edge, order);
148 return cur_node->tan[edge];
154 this->quad_2d = quad_2d;
155 ref_map_pss.set_quad_2d(quad_2d);
163 num_tables = quad_2d->get_num_tables(e->get_mode());
164 assert(num_tables <= H2D_MAX_TABLES);
171 is_const = !
element->is_curved() &&
176 for (
unsigned int i = 0; i < e->get_nvert(); i++)
182 for (
unsigned int i = 0; i < e->get_nvert(); i++)
184 lin_coeffs[i][0] = e->
vn[i]->x;
185 lin_coeffs[i][1] = e->
vn[i]->
y;
192 int o = e->
cm->order;
193 for (
unsigned int i = 0; i < e->get_nvert(); i++)
194 for (j = 2; j <= o; j++)
195 indices[k++] = ref_map_shapeset.
get_edge_index(i, 0, j, e->get_mode());
197 if(e->is_quad()) o = H2D_MAKE_QUAD_ORDER(o, o);
201 coeffs = e->
cm->coeffs;
213 if(is_const) calc_const_inv_ref_map();
else const_jacobian = 0.0;
216 void RefMap::push_transform(
int son)
220 const_jacobian *= 0.25;
223 void RefMap::pop_transform()
230 void RefMap::calc_inv_ref_map(
int order)
232 assert(quad_2d != NULL);
233 int i, j, np = quad_2d->get_num_points(order,
element->get_mode());
237 double2x2* m =
new double2x2[np];
238 memset(m, 0, np *
sizeof(double2x2));
240 for (i = 0; i < nc; i++)
246 for (j = 0; j < np; j++)
248 m[j][0][0] += coeffs[i][0] * dx[j];
249 m[j][0][1] += coeffs[i][0] * dy[j];
250 m[j][1][0] += coeffs[i][1] * dx[j];
251 m[j][1][1] += coeffs[i][1] * dy[j];
257 double2x2* irm = cur_node->inv_ref_map[order] =
new double2x2[np];
258 double* jac = cur_node->jacobian[order] =
new double[np];
259 for (i = 0; i < np; i++)
261 jac[i] = (m[i][0][0] * m[i][1][1] - m[i][0][1] * m[i][1][0]);
262 double ij = 1.0 / jac[i];
266 throw Hermes::Exceptions::Exception(
"1/jac[%d] is infinity when calculating inv. ref. map for order %d (jac = %g)", i, order);
271 throw Hermes::Exceptions::Exception(
"1/jac[%d] is NaN when calculating inv. ref. map for order %d (jac = %g)", i, order);
275 irm[i][0][0] = m[i][1][1] * ij;
276 irm[i][0][1] = -m[i][1][0] * ij;
277 irm[i][1][0] = -m[i][0][1] * ij;
278 irm[i][1][1] = m[i][0][0] * ij;
286 void RefMap::calc_second_ref_map(
int order)
288 assert(quad_2d != NULL);
289 int i, j, np = quad_2d->get_num_points(order,
element->get_mode());
291 double3x2* k =
new double3x2[np];
292 memset(k, 0, np *
sizeof(double3x2));
294 for (i = 0; i < nc; i++)
296 double *dxy, *dxx, *dyy;
302 for (j = 0; j < np; j++)
304 k[j][0][0] += coeffs[i][0] * dxx[j];
305 k[j][0][1] += coeffs[i][1] * dxx[j];
306 k[j][1][0] += coeffs[i][0] * dxy[j];
307 k[j][1][1] += coeffs[i][1] * dxy[j];
308 k[j][2][0] += coeffs[i][0] * dyy[j];
309 k[j][2][1] += coeffs[i][1] * dyy[j];
313 double3x2* mm = cur_node->second_ref_map[order] =
new double3x2[np];
315 for (j = 0; j < np; j++)
319 a = sqr(m[j][0][0])*k[j][0][0] + 2*m[j][0][0]*m[j][0][1]*k[j][1][0] + sqr(m[j][0][1])*k[j][2][0];
320 b = sqr(m[j][0][0])*k[j][0][1] + 2*m[j][0][0]*m[j][0][1]*k[j][1][1] + sqr(m[j][0][1])*k[j][2][1];
321 mm[j][0][0] = -(a * m[j][0][0] + b * m[j][1][0]);
322 mm[j][0][1] = -(a * m[j][0][1] + b * m[j][1][1]);
325 a = m[j][0][0]*m[j][1][0]*k[j][0][0] + (m[j][0][1]*m[j][1][0] + m[j][0][0]*m[j][1][1])*k[j][1][0] + m[j][0][1]*m[j][1][1]*k[j][2][0];
326 b = m[j][0][0]*m[j][1][0]*k[j][0][1] + (m[j][0][1]*m[j][1][0] + m[j][0][0]*m[j][1][1])*k[j][1][1] + m[j][0][1]*m[j][1][1]*k[j][2][1];
327 mm[j][1][0] = -(a * m[j][0][0] + b * m[j][1][0]);
328 mm[j][1][1] = -(a * m[j][0][1] + b * m[j][1][1]);
331 a = sqr(m[j][1][0])*k[j][0][0] + 2*m[j][1][0]*m[j][1][1]*k[j][1][0] + sqr(m[j][1][1])*k[j][2][0];
332 b = sqr(m[j][1][0])*k[j][0][1] + 2*m[j][1][0]*m[j][1][1]*k[j][1][1] + sqr(m[j][1][1])*k[j][2][1];
333 mm[j][2][0] = -(a * m[j][0][0] + b * m[j][1][0]);
334 mm[j][2][1] = -(a * m[j][0][1] + b * m[j][1][1]);
340 bool RefMap::is_parallelogram(Element* e)
342 const double eps = 1e-14;
343 assert(e->is_quad());
344 return fabs(e->vn[2]->x - (e->vn[1]->x + e->vn[3]->x - e->vn[0]->x)) < eps &&
345 fabs(e->vn[2]->y - (e->vn[1]->y + e->vn[3]->y - e->vn[0]->y)) < eps;
348 void RefMap::calc_const_inv_ref_map()
351 throw Hermes::Exceptions::Exception(
"The element variable must not be NULL.");
352 int k =
element->is_triangle() ? 2 : 3;
356 const_jacobian = 0.25 * (m[0][0] * m[1][1] - m[0][1] * m[1][0]);
358 double ij = 0.5 / const_jacobian;
360 const_inv_ref_map[0][0] = m[1][1] * ij;
361 const_inv_ref_map[1][0] = -m[0][1] * ij;
362 const_inv_ref_map[0][1] = -m[1][0] * ij;
363 const_inv_ref_map[1][1] = m[0][0] * ij;
368 void RefMap::calc_phys_x(
int order)
371 int i, j, np = quad_2d->get_num_points(order,
element->get_mode());
372 double* x = cur_node->phys_x[order] =
new double[np];
373 memset(x, 0, np *
sizeof(
double));
375 for (i = 0; i < nc; i++)
380 for (j = 0; j < np; j++)
381 x[j] += coeffs[i][0] * fn[j];
385 void RefMap::calc_phys_y(
int order)
388 int i, j, np = quad_2d->get_num_points(order,
element->get_mode());
389 double* y = cur_node->phys_y[order] =
new double[np];
390 memset(y, 0, np *
sizeof(
double));
392 for (i = 0; i < nc; i++)
397 for (j = 0; j < np; j++)
398 y[j] += coeffs[i][1] * fn[j];
402 void RefMap::calc_tangent(
int edge,
int eo)
405 int np = quad_2d->get_num_points(eo,
element->get_mode());
406 double3* tan = cur_node->tan[edge] =
new double3[np];
414 tan[0][2] = sqrt(sqr(tan[0][0]) + sqr(tan[0][1]));
415 double inorm = 1.0 / tan[0][2];
418 tan[0][2] *= (edge == 0 || edge == 2) ?
ctm->m[0] :
ctm->m[1];
420 for (i = 1; i < np; i++)
421 memcpy(tan + i, tan,
sizeof(double3));
428 memset(m, 0, np*
sizeof(double2x2));
430 for (i = 0; i < nc; i++)
436 for (j = 0; j < np; j++)
438 m[j][0][0] += coeffs[i][0] * dx[j];
439 m[j][0][1] += coeffs[i][0] * dy[j];
440 m[j][1][0] += coeffs[i][1] * dx[j];
441 m[j][1][1] += coeffs[i][1] * dy[j];
449 double ex = (*v2)[0] - (*v1)[0];
450 double ey = (*v2)[1] - (*v1)[1];
451 for (i = 0; i < np; i++)
454 t[0] = m[i][0][0]*ex + m[i][0][1]*ey;
455 t[1] = m[i][1][0]*ex + m[i][1][1]*ey;
456 t[2] = sqrt(sqr(t[0]) + sqr(t[1]));
457 double inorm = 1.0 / t[2];
460 t[2] *= (edge == 0 || edge == 2) ?
ctm->m[0] :
ctm->m[1];
465 int RefMap::calc_inv_ref_order()
468 int i, o, mo = quad->get_max_order(
element->get_mode());
471 double3* pt = quad->get_points(mo,
element->get_mode());
474 for (i = 0; i < quad->get_num_points(mo,
element->get_mode()); i++)
476 throw Hermes::Exceptions::Exception(
"Element #%d is concave or badly oriented.",
element->
id);
482 for (i = 0; i < quad->get_num_points(mo,
element->get_mode()); i++, m++)
484 exact1 += pt[i][2] * jac[i] * (sqr((*m)[0][0] + (*m)[0][1]) + sqr((*m)[1][0] + (*m)[1][1]));
485 exact2 += pt[i][2] / jac[i];
488 for (o = 0; o < mo; o++)
490 pt = quad->get_points(o,
element->get_mode());
493 double result1 = 0.0;
494 double result2 = 0.0;
495 for (i = 0; i < quad->get_num_points(o,
element->get_mode()); i++, m++)
497 result1 += pt[i][2] * jac[i] * (sqr((*m)[0][0] + (*m)[0][1]) + sqr((*m)[1][0] + (*m)[1][1]));
498 result2 += pt[i][2] / jac[i] ;
500 if((fabs((exact1 - result1) / exact1) < 1e-8) &&
501 (fabs((exact2 - result2) / exact2) < 1e-8))
break;
505 this->warn(
"Element #%d is too distorted (iro ~ %d).",
element->
id, o);
510 void RefMap::inv_ref_map_at_point(
double xi1,
double xi2,
double& x,
double& y, double2x2& m)
513 memset(tmp, 0,
sizeof(double2x2));
515 for (
int i = 0; i < nc; i++)
517 double val = ref_map_shapeset.get_fn_value(indices[i], xi1, xi2, 0,
element->get_mode());
518 x += coeffs[i][0] * val;
519 y += coeffs[i][1] * val;
521 double dx = ref_map_shapeset.get_dx_value(indices[i], xi1, xi2, 0,
element->get_mode());
522 double dy = ref_map_shapeset.get_dy_value(indices[i], xi1, xi2, 0,
element->get_mode());
523 tmp[0][0] += coeffs[i][0] * dx;
524 tmp[0][1] += coeffs[i][0] * dy;
525 tmp[1][0] += coeffs[i][1] * dx;
526 tmp[1][1] += coeffs[i][1] * dy;
530 double jac = tmp[0][0] * tmp[1][1] - tmp[0][1] * tmp[1][0];
531 m[0][0] = tmp[1][1] / jac;
532 m[0][1] = -tmp[1][0] / jac;
533 m[1][0] = -tmp[0][1] / jac;
534 m[1][1] = tmp[0][0] / jac;
537 void RefMap::second_ref_map_at_point(
double xi1,
double xi2,
double& x,
double& y, double3x2& mm)
540 memset(k, 0,
sizeof(double3x2));
542 for (
int i = 0; i < nc; i++)
544 double val = ref_map_shapeset.get_fn_value(indices[i], xi1, xi2, 0,
element->get_mode());
545 x += coeffs[i][0] * val;
546 y += coeffs[i][1] * val;
548 double dxy, dxx, dyy;
550 dxx = ref_map_shapeset.get_dxx_value(indices[i], xi1, xi2, 0,
element->get_mode());
551 dxy = ref_map_shapeset.get_dxy_value(indices[i], xi1, xi2, 0,
element->get_mode());
552 dyy = ref_map_shapeset.get_dxy_value(indices[i], xi1, xi2, 0,
element->get_mode());
554 k[0][0] += coeffs[i][0] * dxx;
555 k[0][1] += coeffs[i][1] * dxx;
556 k[1][0] += coeffs[i][0] * dxy;
557 k[1][1] += coeffs[i][1] * dxy;
558 k[2][0] += coeffs[i][0] * dyy;
559 k[2][1] += coeffs[i][1] * dyy;
563 this->inv_ref_map_at_point(xi1, xi2, x, y, m);
567 a = sqr(m[0][0])*k[0][0] + 2*m[0][0]*m[0][1]*k[1][0] + sqr(m[0][1])*k[2][0];
568 b = sqr(m[0][0])*k[0][1] + 2*m[0][0]*m[0][1]*k[1][1] + sqr(m[0][1])*k[2][1];
569 mm[0][0] = -(a * m[0][0] + b * m[1][0]);
570 mm[0][1] = -(a * m[0][1] + b * m[1][1]);
573 a = m[0][0]*m[1][0]*k[0][0] + (m[0][1]*m[1][0] + m[0][0]*m[1][1])*k[1][0] + m[0][1]*m[1][1]*k[2][0];
574 b = m[0][0]*m[1][0]*k[0][1] + (m[0][1]*m[1][0] + m[0][0]*m[1][1])*k[1][1] + m[0][1]*m[1][1]*k[2][1];
575 mm[1][0] = -(a * m[0][0] + b * m[1][0]);
576 mm[1][1] = -(a * m[0][1] + b * m[1][1]);
579 a = sqr(m[1][0])*k[0][0] + 2*m[1][0]*m[1][1]*k[1][0] + sqr(m[1][1])*k[2][0];
580 b = sqr(m[1][0])*k[0][1] + 2*m[1][0]*m[1][1]*k[1][1] + sqr(m[1][1])*k[2][1];
581 mm[2][0] = -(a * m[0][0] + b * m[1][0]);
582 mm[2][1] = -(a * m[0][1] + b * m[1][1]);
587 const double TOL = 1e-12;
591 double2* local_coeffs;
594 int local_indices[70];
598 for (
unsigned int i = 0; i < e->get_nvert(); i++)
604 for (
unsigned int i = 0; i < e->get_nvert(); i++)
606 local_lin_coeffs[i][0] = e->
vn[i]->x;
607 local_lin_coeffs[i][1] = e->
vn[i]->
y;
609 local_coeffs = local_lin_coeffs;
610 local_nc = e->get_nvert();
614 int o = e->
cm->order;
615 for (
unsigned int i = 0; i < e->get_nvert(); i++)
616 for (j = 2; j <= o; j++)
617 local_indices[k++] = shapeset.
get_edge_index(i, 0, j, e->get_mode());
619 if(e->is_quad()) o = H2D_MAKE_QUAD_ORDER(o, o);
623 local_coeffs = e->
cm->coeffs;
624 local_nc = e->
cm->nc;
628 if(!e->is_curved() && (e->is_triangle() || is_parallelogram(e)))
630 double dx = e->
vn[0]->x - x;
631 double dy = e->
vn[0]->
y - y;
632 int k = e->is_triangle() ? 2 : 3;
635 { e->
vn[1]->x - e->
vn[0]->x, e->
vn[k]->x - e->
vn[0]->x },
636 { e->
vn[1]->
y - e->
vn[0]->
y, e->
vn[k]->
y - e->
vn[0]->
y }
639 double const_jacobian = 0.25 * (m[0][0] * m[1][1] - m[0][1] * m[1][0]);
640 double2x2 const_inv_ref_map;
641 if(const_jacobian <= 0.0)
642 throw Hermes::Exceptions::Exception(
"Element #%d is concave or badly oriented in RefMap::untransform().", e->
id);
644 double ij = 0.5 / const_jacobian;
646 const_inv_ref_map[0][0] = m[1][1] * ij;
647 const_inv_ref_map[1][0] = -m[0][1] * ij;
648 const_inv_ref_map[0][1] = -m[1][0] * ij;
649 const_inv_ref_map[1][1] = m[0][0] * ij;
651 xi1 = -1.0 - (const_inv_ref_map[0][0] * dx + const_inv_ref_map[1][0] * dy);
652 xi2 = -1.0 - (const_inv_ref_map[0][1] * dx + const_inv_ref_map[1][1] * dy);
656 double xi1_old = 0.0, xi2_old = 0.0;
663 memset(tmp, 0,
sizeof(double2x2));
665 for (
int i = 0; i < local_nc; i++)
667 double val = shapeset.get_fn_value(local_indices[i], xi1_old, xi2_old, 0, e->get_mode());
668 vx += local_coeffs[i][0] * val;
669 vy += local_coeffs[i][1] * val;
671 double dx = shapeset.get_dx_value(local_indices[i], xi1_old, xi2_old, 0, e->get_mode());
672 double dy = shapeset.get_dy_value(local_indices[i], xi1_old, xi2_old, 0, e->get_mode());
673 tmp[0][0] += local_coeffs[i][0] * dx;
674 tmp[0][1] += local_coeffs[i][0] * dy;
675 tmp[1][0] += local_coeffs[i][1] * dx;
676 tmp[1][1] += local_coeffs[i][1] * dy;
680 double jac = tmp[0][0] * tmp[1][1] - tmp[0][1] * tmp[1][0];
681 m[0][0] = tmp[1][1] / jac;
682 m[0][1] = -tmp[1][0] / jac;
683 m[1][0] = -tmp[0][1] / jac;
684 m[1][1] = tmp[0][0] / jac;
686 xi1 = xi1_old - (m[0][0] * (vx - x) + m[1][0] * (vy - y));
687 xi2 = xi2_old - (m[0][1] * (vx - x) + m[1][1] * (vy - y));
688 if(fabs(xi1 - xi1_old) < TOL && fabs(xi2 - xi2_old) < TOL)
return;
689 if(it > 1 && (xi1 > 1.5 || xi2 > 1.5 || xi1 < -1.5 || xi2 < -1.5))
return;
692 Hermes::Mixins::Loggable::Static::warn(
"Could not find reference coordinates - Newton method did not converge.");
702 static bool is_in_ref_domain(
Element* e,
double xi1,
double xi2)
704 const double TOL = 1e-11;
705 if(e->get_nvert() == 3)
706 return (xi1 + xi2 <= TOL) && (xi1 + 1.0 >= -TOL) && (xi2 + 1.0 >= -TOL);
708 return (xi1 - 1.0 <= TOL) && (xi1 + 1.0 >= -TOL) && (xi2 - 1.0 <= TOL) && (xi2 + 1.0 >= -TOL);
717 Hermes::vector<Element*> improbable_curved_elements;
718 for_all_active_elements(e, mesh)
720 bool is_triangle = e->is_triangle();
721 bool is_curved = e->is_curved();
724 bool is_near_straightened_element =
false;
728 vector[0][0] = e->
vn[1]->x - e->
vn[0]->x;
729 vector[0][1] = e->
vn[1]->
y - e->
vn[0]->
y;
730 vector[1][0] = e->
vn[2]->x - e->
vn[1]->x;
731 vector[1][1] = e->
vn[2]->
y - e->
vn[1]->
y;
734 vector[2][0] = e->
vn[0]->x - e->
vn[2]->x;
735 vector[2][1] = e->
vn[0]->
y - e->
vn[2]->
y;
739 vector[2][0] = e->
vn[3]->x - e->
vn[2]->x;
740 vector[2][1] = e->
vn[3]->
y - e->
vn[2]->
y;
741 vector[3][0] = e->
vn[0]->x - e->
vn[3]->x;
742 vector[3][1] = e->
vn[0]->
y - e->
vn[3]->
y;
748 double cross_product_0 = (x - e->
vn[0]->x) * vector[0][1] - (y - e->
vn[0]->
y) * vector[0][0];
749 double cross_product_1 = (x - e->
vn[1]->x) * vector[1][1] - (y - e->
vn[1]->
y) * vector[1][0];
750 double cross_product_2 = (x - e->
vn[2]->x) * vector[2][1] - (y - e->
vn[2]->
y) * vector[2][0];
753 if ((cross_product_0 * cross_product_1 >= 0) && (cross_product_0 * cross_product_2 >= 0))
758 if(x_reference != NULL)
759 (*x_reference) = xi1;
760 if(y_reference != NULL)
761 (*y_reference) = xi2;
765 is_near_straightened_element =
true;
767 if(is_curved && !is_near_straightened_element)
769 double gravity_center_x = (e->
vn[0]->x + e->
vn[1]->x + e->
vn[2]->x) / 3.;
770 double gravity_center_y = (e->
vn[0]->
y + e->
vn[1]->
y + e->
vn[2]->
y) / 3.;
771 double distance_x = std::abs(x - gravity_center_x);
772 double distance_y = std::abs(y - gravity_center_y);
773 if(distance_x < std::abs(e->
vn[0]->x - gravity_center_x) && distance_x < std::abs(e->
vn[1]->x - gravity_center_x) && distance_x < std::abs(e->
vn[2]->x - gravity_center_x) &&
774 distance_y < std::abs(e->
vn[0]->
y - gravity_center_y) && distance_y < std::abs(e->
vn[1]->
y - gravity_center_y) && distance_y < std::abs(e->
vn[2]->
y - gravity_center_y))
775 is_near_straightened_element =
true;
780 double cross_product_3 = (x - e->
vn[3]->x) * vector[3][1] - (y - e->
vn[3]->
y) * vector[3][0];
781 if ((cross_product_0 * cross_product_1 >= 0) && (cross_product_0 * cross_product_2 >= 0) && (cross_product_0 * cross_product_3 >= 0))
786 if(x_reference != NULL)
787 (*x_reference) = xi1;
788 if(y_reference != NULL)
789 (*y_reference) = xi2;
793 is_near_straightened_element =
true;
795 if(is_curved && !is_near_straightened_element)
797 double gravity_center_x = (e->
vn[0]->x + e->
vn[1]->x + e->
vn[2]->x + e->
vn[3]->x) / 4.;
798 double gravity_center_y = (e->
vn[0]->
y + e->
vn[1]->
y + e->
vn[2]->
y + e->
vn[3]->
y) / 4.;
799 double distance_x = std::abs(x - gravity_center_x);
800 double distance_y = std::abs(y - gravity_center_y);
801 if(distance_x <= std::abs(e->
vn[0]->x - gravity_center_x) && distance_x <= std::abs(e->
vn[1]->x - gravity_center_x) && distance_x <= std::abs(e->
vn[2]->x - gravity_center_x) && distance_x <= std::abs(e->
vn[3]->x - gravity_center_x) &&
802 distance_y <= std::abs(e->
vn[0]->
y - gravity_center_y) && distance_y <= std::abs(e->
vn[1]->
y - gravity_center_y) && distance_y <= std::abs(e->
vn[2]->
y - gravity_center_y) && distance_y <= std::abs(e->
vn[3]->
y - gravity_center_y))
803 is_near_straightened_element =
true;
809 if(is_near_straightened_element)
812 if(is_in_ref_domain(e, xi1, xi2))
814 if(x_reference != NULL)
815 (*x_reference) = xi1;
816 if(y_reference != NULL)
817 (*y_reference) = xi2;
822 improbable_curved_elements.push_back(e);
827 for(
int i = 0; i < improbable_curved_elements.size(); i++)
829 untransform(improbable_curved_elements[i], x, y, xi1, xi2);
830 if(is_in_ref_domain(improbable_curved_elements[i], xi1, xi2))
832 if(x_reference != NULL)
833 (*x_reference) = xi1;
834 if(y_reference != NULL)
835 (*y_reference) = xi2;
836 return improbable_curved_elements[i];
840 Hermes::Mixins::Loggable::Static::warn(
"Point (%g, %g) does not lie in any element.", x, y);
844 void RefMap::init_node(
Node* pp)
846 memset(pp->inv_ref_map, 0, num_tables *
sizeof(double2x2*));
847 memset(pp->second_ref_map, 0, num_tables *
sizeof(double3x2*));
848 memset(pp->phys_x, 0, num_tables *
sizeof(
double*));
849 memset(pp->phys_y, 0, num_tables *
sizeof(
double*));
850 memset(pp->tan, 0,
sizeof(pp->tan));
853 void RefMap::free_node(Node* node)
856 for (
int i = 0; i < num_tables; i++)
858 if(node->inv_ref_map[i] != NULL)
860 delete [] node->inv_ref_map[i];
861 delete [] node->jacobian[i];
863 if(node->second_ref_map[i] != NULL)
delete [] node->second_ref_map[i];
864 if(node->phys_x[i] != NULL)
delete [] node->phys_x[i];
865 if(node->phys_y[i] != NULL)
delete [] node->phys_y[i];
868 for (
int i = 0; i < 4; i++)
869 if(node->tan[i] != NULL)
870 delete [] node->tan[i];
877 std::map<uint64_t, Node*>::iterator it;
879 for (it = nodes.begin(); it != nodes.end(); ++it)
880 free_node(it->second);
884 free_node(overflow);
delete overflow; overflow = NULL;
888 RefMap::Node* RefMap::handle_overflow()