static void precalculate_cholesky_projection_matrices_bubble() { // *** triangles *** ref_map_pss.set_mode(MODE_TRIANGLE); int order = ref_map_shapeset.get_max_order(); // calculate projection matrix of maximum order int nb = ref_map_shapeset.get_num_bubbles(order); int* indices = ref_map_shapeset.get_bubble_indices(order); bubble_proj_matrix_tri = calculate_bubble_projection_matrix(nb, indices); // cholesky factorization of the matrix bubble_tri_p = new double[nb]; choldc(bubble_proj_matrix_tri, nb, bubble_tri_p); // *** quads *** ref_map_pss.set_mode(MODE_QUAD); order = ref_map_shapeset.get_max_order(); order = make_quad_order(order, order); // calculate projection matrix of maximum order nb = ref_map_shapeset.get_num_bubbles(order); indices = ref_map_shapeset.get_bubble_indices(order); bubble_proj_matrix_quad = calculate_bubble_projection_matrix(nb, indices); // cholesky factorization of the matrix bubble_quad_p = new double[nb]; choldc(bubble_proj_matrix_quad, nb, bubble_quad_p); }
int main(int argc, char* argv[]) { hermes2d_initialize(&argc, argv); info("SHAPESET TESTER"); info("num_components = %d", shapeset.get_num_components()); info("max_order = %d", shapeset.get_max_order()); precalc.set_quad_2d(&quad); for (int mode = 0; mode <= 1; mode++) { shapeset.set_mode(mode); quad.set_mode(mode); precalc.set_mode(mode); info(mode ? "\nTESTING QUADS\n" : "\nTESTING TRIANGLES\n"); //test_orders(&shapeset); test_edge_rotation(); //test_edge_orientation(&shapeset); //test_num_bubbles(&shapeset); } //info("\nALL OK!\n"); printf("\n"); hermes2d_finalize(); return 0; }
void CurvMap::update_refmap_coefs(Element* e) { ref_map_pss.set_quad_2d(&quad2d); //ref_map_pss.set_active_element(e); // calculation of projection matrices if (edge_proj_matrix == NULL) precalculate_cholesky_projection_matrix_edge(); if (bubble_proj_matrix_tri == NULL) precalculate_cholesky_projection_matrices_bubble(); ref_map_pss.set_mode(e->get_mode()); ref_map_shapeset.set_mode(e->get_mode()); // allocate projection coefficients int nv = e->nvert; int ne = order - 1; int qo = e->is_quad() ? make_quad_order(order, order) : order; int nb = ref_map_shapeset.get_num_bubbles(qo); nc = nv + nv*ne + nb; if (coefs != NULL) delete [] coefs; coefs = new double2[nc]; // WARNING: do not change the format of the array 'coefs'. If it changes, // RefMap::set_active_element() has to be changed too. Nurbs** nurbs; if (toplevel == false) { ref_map_pss.set_active_element(e); ref_map_pss.set_transform(part); nurbs = parent->cm->nurbs; } else { ref_map_pss.reset_transform(); nurbs = e->cm->nurbs; } ctm = *(ref_map_pss.get_ctm()); ref_map_pss.reset_transform(); // fixme - do we need this? // calculation of new projection coefficients ref_map_projection(e, nurbs, order, coefs); }