23 ((-nodes[0].d_x + nodes[1].d_x + nodes[2].d_x - nodes[3].d_x) *
24 (-nodes[0].d_y - nodes[1].d_y + nodes[2].d_y + nodes[3].d_y) -
25 (-nodes[0].d_x - nodes[1].d_x + nodes[2].d_x + nodes[3].d_x) *
26 (-nodes[0].d_y + nodes[1].d_y + nodes[2].d_y - nodes[3].d_y));
66 const std::vector<util::Point> &nodes,
67 std::vector<std::vector<double>> *J) {
69 auto der_shapes = getDerShapes(p);
72 (*J)[0] = std::vector<double>{
73 der_shapes[0][0] * nodes[0].d_x + der_shapes[1][0] * nodes[1].d_x +
74 der_shapes[2][0] * nodes[2].d_x + der_shapes[3][0] * nodes[3].d_x,
75 der_shapes[0][0] * nodes[0].d_y + der_shapes[1][0] * nodes[1].d_y +
76 der_shapes[2][0] * nodes[2].d_y + der_shapes[3][0] * nodes[3].d_y};
77 (*J)[1] = std::vector<double>{
78 der_shapes[0][1] * nodes[0].d_x + der_shapes[1][1] * nodes[1].d_x +
79 der_shapes[2][1] * nodes[2].d_x + der_shapes[3][1] * nodes[3].d_x,
80 der_shapes[0][1] * nodes[0].d_y + der_shapes[1][1] * nodes[1].d_y +
81 der_shapes[2][1] * nodes[2].d_y + der_shapes[3][1] * nodes[3].d_y};
83 return (*J)[0][0] * (*J)[1][1] - (*J)[0][1] * (*J)[1][0];
86 return (der_shapes[0][0] * nodes[0].d_x + der_shapes[1][0] * nodes[1].d_x +
87 der_shapes[2][0] * nodes[2].d_x + der_shapes[3][0] * nodes[3].d_x) *
88 (der_shapes[0][1] * nodes[0].d_y +
89 der_shapes[1][1] * nodes[1].d_y +
90 der_shapes[2][1] * nodes[2].d_y +
91 der_shapes[3][1] * nodes[3].d_y) -
92 (der_shapes[0][0] * nodes[0].d_y + der_shapes[1][0] * nodes[1].d_y +
93 der_shapes[2][0] * nodes[2].d_y + der_shapes[3][0] * nodes[3].d_y) *
94 (der_shapes[0][1] * nodes[0].d_x +
95 der_shapes[1][1] * nodes[1].d_x +
96 der_shapes[2][1] * nodes[2].d_x +
97 der_shapes[3][1] * nodes[3].d_x);
121 if (!d_quads.empty())
125 if (d_quadOrder == 0)
129 std::vector<std::vector<double>> ident_mat;
130 ident_mat.push_back(std::vector<double>{1., 0.});
131 ident_mat.push_back(std::vector<double>{0., 1.});
136 if (d_quadOrder == 1) {
140 std::vector<double> x = std::vector<double>(1, 0.);
141 std::vector<double> w = std::vector<double>(1, 2.);
142 for (
size_t i = 0; i < npts; i++)
143 for (
size_t j = 0; j < npts; j++) {
146 qd.
d_w = w[i] * w[j];
152 d_quads.push_back(qd);
159 if (d_quadOrder == 2) {
163 std::vector<double> x =
164 std::vector<double>{-1. / std::sqrt(3.), 1. / std::sqrt(3.)};
165 std::vector<double> w = std::vector<double>{1., 1.};
166 for (
size_t i = 0; i < npts; i++)
167 for (
size_t j = 0; j < npts; j++) {
170 qd.
d_w = w[i] * w[j];
176 d_quads.push_back(qd);
183 if (d_quadOrder == 3) {
188 std::vector<double> x = std::vector<double>{
189 -std::sqrt(3.) / std::sqrt(5.), 0., std::sqrt(3.) / std::sqrt(5.)};
190 std::vector<double> w = std::vector<double>{5. / 9., 8. / 9., 5. / 9.};
191 for (
size_t i = 0; i < npts; i++)
192 for (
size_t j = 0; j < npts; j++) {
195 qd.
d_w = w[i] * w[j];
201 d_quads.push_back(qd);
208 if (d_quadOrder == 4) {
211 std::vector<double> x =
212 std::vector<double>{-0.3399810435848563, 0.3399810435848563,
213 -0.8611363115940526, 0.8611363115940526};
214 std::vector<double> w =
215 std::vector<double>{0.6521451548625461, 0.6521451548625461,
216 0.3478548451374538, 0.3478548451374538};
217 for (
size_t i = 0; i < npts; i++)
218 for (
size_t j = 0; j < npts; j++) {
221 qd.
d_w = w[i] * w[j];
227 d_quads.push_back(qd);
234 if (d_quadOrder == 5) {
237 std::vector<double> x =
238 std::vector<double>{0., -0.5384693101056831, 0.5384693101056831,
239 -0.9061798459386640, 0.9061798459386640};
240 std::vector<double> w = std::vector<double>{
241 0.5688888888888889, 0.4786286704993665, 0.4786286704993665,
242 0.2369268850561891, 0.2369268850561891};
243 for (
size_t i = 0; i < npts; i++)
244 for (
size_t j = 0; j < npts; j++) {
247 qd.
d_w = w[i] * w[j];
253 d_quads.push_back(qd);
double getJacobian(const util::Point &p, const std::vector< util::Point > &nodes, std::vector< std::vector< double > > *J) override
Computes the Jacobian of map .