void PrecalcShapeset::set_active_element(Element* e) { mode = e->get_mode(); shapeset->set_mode(mode); get_quad_2d()->set_mode(mode); element = e; }
void PrecalcShapeset::set_mode(int mode) // used in curved.cpp { this->mode = mode; shapeset->set_mode(mode); get_quad_2d()->set_mode(mode); element = NULL; }
int RefMap::calc_inv_ref_order() { Quad2D* quad = get_quad_2d(); int i, o, mo = quad->get_max_order(); // check first the positivity of the jacobian double3* pt = quad->get_points(mo); double2x2* m = get_inv_ref_map(mo); double* jac = get_jacobian(mo); for (i = 0; i < quad->get_num_points(mo); i++) if (jac[i] <= 0.0) error("Element #%d is concave or badly oriented.", element->id); // next, estimate the "exact" value of the typical integral int_grad_u_grad_v // (with grad_u == grad_v == (1,1)) using the maximum integration rule double exact1 = 0.0; double exact2 = 0.0; for (i = 0; i < quad->get_num_points(mo); i++, m++) { exact1 += pt[i][2] * jac[i] * (sqr((*m)[0][0] + (*m)[0][1]) + sqr((*m)[1][0] + (*m)[1][1])); exact2 += pt[i][2] / jac[i]; } // find sufficient quadrature degree for (o = 0; o < mo; o++) { pt = quad->get_points(o); m = get_inv_ref_map(o); jac = get_jacobian(o); double result1 = 0.0; double result2 = 0.0; for (i = 0; i < quad->get_num_points(o); i++, m++) { result1 += pt[i][2] * jac[i] * (sqr((*m)[0][0] + (*m)[0][1]) + sqr((*m)[1][0] + (*m)[1][1])); result2 += pt[i][2] / jac[i] ; } if ((fabs((exact1 - result1) / exact1) < 1e-8) && (fabs((exact2 - result2) / exact2) < 1e-8)) break; } if (o >= 10) { warn("Element #%d is too distorted (iro ~ %d).", element->id, o); } return o; }
void PrecalcShapeset::precalculate(int order, int mask) { int i, j, k; // initialization Quad2D* quad = get_quad_2d(); quad->set_mode(mode); H2D_CHECK_ORDER(quad, order); int np = quad->get_num_points(order); double3* pt = quad->get_points(order); int oldmask = (cur_node != NULL) ? cur_node->mask : 0; int newmask = mask | oldmask; Node* node = new_node(newmask, np); // precalculate all required tables for (j = 0; j < num_components; j++) { for (k = 0; k < 6; k++) { if (newmask & idx2mask[k][j]) { if (oldmask & idx2mask[k][j]) memcpy(node->values[j][k], cur_node->values[j][k], np * sizeof(double)); else for (i = 0; i < np; i++) node->values[j][k][i] = shapeset->get_value(k, index, ctm->m[0] * pt[i][0] + ctm->t[0], ctm->m[1] * pt[i][1] + ctm->t[1], j); } } } if(nodes->present(order)) { assert(nodes->get(order) == cur_node); ::free(nodes->get(order)); } nodes->add(node, order); cur_node = node; }