void RefMap::force_transform(uint64 sub_idx, Trf *ctm) { _F_ this->sub_idx = sub_idx; stack[top] = *ctm; ctm = stack + top; if (is_const_jacobian) calc_const_inv_ref_map(); }
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 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; }