static void derivatives_at_mid_elem( NodeSet nodeset, size_t* vertices, MsqVector<2>* derivs, size_t& num_vtx ) { // fast linear case // This is provided as an optimization for linear elements. // If this block of code were removed, the general-case code // below should produce the same result. if (!nodeset.have_any_mid_node()) { num_vtx = 4; vertices[0] = 0; derivs[0][0] = -0.5; derivs[0][1] = -0.5; vertices[1] = 1; derivs[1][0] = 0.5; derivs[1][1] = -0.5; vertices[2] = 2; derivs[2][0] = 0.5; derivs[2][1] = 0.5; vertices[3] = 3; derivs[3][0] = -0.5; derivs[3][1] = 0.5; return; } num_vtx = 0; // N_0 if (!nodeset.both_edge_nodes(0,3)) { // if eiter adjacent mid-edge node is missing vertices[num_vtx] = 0; derivs[num_vtx][0] = nodeset.mid_edge_node(3) ? 0.0 : -0.5; derivs[num_vtx][1] = nodeset.mid_edge_node(0) ? 0.0 : -0.5; ++num_vtx; } // N_1 if (!nodeset.both_edge_nodes(0,1)) { // if eiter adjacent mid-edge node is missing vertices[num_vtx] = 1; derivs[num_vtx][0] = nodeset.mid_edge_node(1) ? 0.0 : 0.5; derivs[num_vtx][1] = nodeset.mid_edge_node(0) ? 0.0 : -0.5; ++num_vtx; } // N_2 if (!nodeset.both_edge_nodes(1,2)) { // if eiter adjacent mid-edge node is missing vertices[num_vtx] = 2; derivs[num_vtx][0] = nodeset.mid_edge_node(1) ? 0.0 : 0.5; derivs[num_vtx][1] = nodeset.mid_edge_node(2) ? 0.0 : 0.5; ++num_vtx; } // N_3 if (!nodeset.both_edge_nodes(2,3)) { // if eiter adjacent mid-edge node is missing vertices[num_vtx] = 3; derivs[num_vtx][0] = nodeset.mid_edge_node(3) ? 0.0 : -0.5; derivs[num_vtx][1] = nodeset.mid_edge_node(2) ? 0.0 : 0.5; ++num_vtx; } // N_4 if (nodeset.mid_edge_node(0)) { vertices[num_vtx] = 4; derivs[num_vtx][0] = 0.0; derivs[num_vtx][1] = -1.0; ++num_vtx; } // N_5 if (nodeset.mid_edge_node(1)) { vertices[num_vtx] = 5; derivs[num_vtx][0] = 1.0; derivs[num_vtx][1] = 0.0; ++num_vtx; } // N_6 if (nodeset.mid_edge_node(2)) { vertices[num_vtx] = 6; derivs[num_vtx][0] = 0.0; derivs[num_vtx][1] = 1.0; ++num_vtx; } // N_7 if (nodeset.mid_edge_node(3)) { vertices[num_vtx] = 7; derivs[num_vtx][0] = -1.0; derivs[num_vtx][1] = 0.0; ++num_vtx; } // N_8 (mid-quad node) never contributes to Jacobian at element center!!! }