void MeshFunction::set_active_element(Element *e) { _F_ element = e; mode = e->get_mode(); refmap->set_active_element(e); reset_transform(); }
void RefMap::set_active_element(Element* e) { if (e != element) free(); ref_map_pss.set_active_element(e); quad_2d->set_mode(e->get_mode()); num_tables = quad_2d->get_num_tables(); assert(num_tables <= H2D_MAX_TABLES); if (e == element) return; element = e; reset_transform(); update_cur_node(); is_const = !element->is_curved() && (element->is_triangle() || is_parallelogram()); // prepare the shapes and coefficients of the reference map int j, k = 0; for (unsigned int i = 0; i < e->nvert; i++) indices[k++] = ref_map_shapeset.get_vertex_index(i); // straight-edged element if (e->cm == NULL) { for (unsigned int i = 0; i < e->nvert; i++) { lin_coeffs[i][0] = e->vn[i]->x; lin_coeffs[i][1] = e->vn[i]->y; } coeffs = lin_coeffs; nc = e->nvert; } else // curvilinear element - edge and bubble shapes { int o = e->cm->order; for (unsigned int i = 0; i < e->nvert; i++) for (j = 2; j <= o; j++) indices[k++] = ref_map_shapeset.get_edge_index(i, 0, j); if (e->is_quad()) o = H2D_MAKE_QUAD_ORDER(o, o); memcpy(indices + k, ref_map_shapeset.get_bubble_indices(o), ref_map_shapeset.get_num_bubbles(o) * sizeof(int)); coeffs = e->cm->coeffs; nc = e->cm->nc; } // calculate the order of the inverse reference map if (element->iro_cache == -1 && quad_2d->get_max_order() > 1) { element->iro_cache = is_const ? 0 : calc_inv_ref_order(); } inv_ref_order = element->iro_cache; // constant inverse reference map if (is_const) calc_const_inv_ref_map(); else const_jacobian = 0.0; }
void Transformable::set_transform(uint64_t idx) { int son[25]; int i = 0; while (idx > 0) { son[i++] = (idx - 1) & 7; idx = (idx - 1) >> 3; } reset_transform(); for (int k = i-1; k >= 0; k--) push_transform(son[k]); }
void Transformable::set_transform(uint64 idx) { _F_ int son[25]; int i = 0; while (idx > 0) { son[i++] = (idx - 1) & SUB_ELEMENT_MASK; idx = (idx - 1) >> SUB_ELEMENT_BITS; } reset_transform(); for (int k = i - 1; k >= 0; k--) push_transform(son[k]); }
void RefMap::set_active_element(Element *e) { _F_ assert(e != NULL); ElementMode3D mode = e->get_mode(); pss = ref_map_pss[mode]; pss->set_active_element(e); if (e == element) return; element = e; reset_transform(); is_const_jacobian = mode == MODE_TETRAHEDRON; int nvertices = element->get_num_vertices(); // prepare the shapes and coefficients of the reference map Shapeset *shapeset = this->pss->get_shapeset(); int i, k = 0; for (i = 0; i < nvertices; i++) indices[k++] = shapeset->get_vertex_index(i); // straight element for (int iv = 0; iv < nvertices; iv++) vertex[iv] = *mesh->vertices[e->get_vertex(iv)]; coefs = vertex; n_coefs = nvertices; // calculate the order of the reference map switch (mode) { case MODE_TETRAHEDRON: ref_order = Ord3(0); break; case MODE_HEXAHEDRON: ref_order = Ord3(1, 1, 1); break; case MODE_PRISM: EXIT(HERMES_ERR_NOT_IMPLEMENTED); break; } // calculate the order of the inverse reference map switch (mode) { case MODE_TETRAHEDRON: inv_ref_order = Ord3(0); break; case MODE_HEXAHEDRON: inv_ref_order = Ord3(1, 1, 1); break; case MODE_PRISM: EXIT(HERMES_ERR_NOT_IMPLEMENTED); break; } // constant inverse reference map if (this->is_const_jacobian) calc_const_inv_ref_map(); else const_jacobian = 0.0; }
Transformable::Transformable() { _F_ memset(stack, 0, sizeof(stack)); reset_transform(); element = NULL; }