21 #include "libmesh/dof_map.h"
22 #include "libmesh/fe.h"
23 #include "libmesh/fe_interface.h"
24 #include "libmesh/elem.h"
25 #include "libmesh/tensor_value.h"
36 void lagrange_vec_nodal_soln(
const Elem * elem,
38 const std::vector<Number> & elem_soln,
40 std::vector<Number> & nodal_soln)
42 const unsigned int n_nodes = elem->n_nodes();
45 const Order totalorder = static_cast<Order>(order+elem->p_level());
58 libmesh_assert_equal_to (elem_soln.size(), 2*3);
59 libmesh_assert_equal_to (nodal_soln.size(), 2*6);
62 nodal_soln[0] = elem_soln[0];
63 nodal_soln[1] = elem_soln[1];
66 nodal_soln[2] = elem_soln[2];
67 nodal_soln[3] = elem_soln[3];
70 nodal_soln[4] = elem_soln[4];
71 nodal_soln[5] = elem_soln[5];
74 nodal_soln[6] = .5*(elem_soln[0] + elem_soln[2]);
75 nodal_soln[7] = .5*(elem_soln[1] + elem_soln[3]);
78 nodal_soln[8] = .5*(elem_soln[2] + elem_soln[4]);
79 nodal_soln[9] = .5*(elem_soln[3] + elem_soln[5]);
82 nodal_soln[10] = .5*(elem_soln[0] + elem_soln[4]);
83 nodal_soln[11] = .5*(elem_soln[1] + elem_soln[5]);
92 libmesh_assert_equal_to (elem_soln.size(), 2*4);
95 libmesh_assert_equal_to (nodal_soln.size(), 2*8);
97 libmesh_assert_equal_to (nodal_soln.size(), 2*9);
100 nodal_soln[0] = elem_soln[0];
101 nodal_soln[1] = elem_soln[1];
104 nodal_soln[2] = elem_soln[2];
105 nodal_soln[3] = elem_soln[3];
108 nodal_soln[4] = elem_soln[4];
109 nodal_soln[5] = elem_soln[5];
112 nodal_soln[6] = elem_soln[6];
113 nodal_soln[7] = elem_soln[7];
116 nodal_soln[8] = .5*(elem_soln[0] + elem_soln[2]);
117 nodal_soln[9] = .5*(elem_soln[1] + elem_soln[3]);
120 nodal_soln[10] = .5*(elem_soln[2] + elem_soln[4]);
121 nodal_soln[11] = .5*(elem_soln[3] + elem_soln[5]);
124 nodal_soln[12] = .5*(elem_soln[4] + elem_soln[6]);
125 nodal_soln[13] = .5*(elem_soln[5] + elem_soln[7]);
128 nodal_soln[14] = .5*(elem_soln[6] + elem_soln[0]);
129 nodal_soln[15] = .5*(elem_soln[7] + elem_soln[1]);
134 nodal_soln[16] = .25*(elem_soln[0] + elem_soln[2] + elem_soln[4] + elem_soln[6]);
135 nodal_soln[17] = .25*(elem_soln[1] + elem_soln[3] + elem_soln[5] + elem_soln[7]);
144 libmesh_assert_equal_to (elem_soln.size(), 3*4);
145 libmesh_assert_equal_to (nodal_soln.size(), 3*10);
148 nodal_soln[0] = elem_soln[0];
149 nodal_soln[1] = elem_soln[1];
150 nodal_soln[2] = elem_soln[2];
153 nodal_soln[3] = elem_soln[3];
154 nodal_soln[4] = elem_soln[4];
155 nodal_soln[5] = elem_soln[5];
158 nodal_soln[6] = elem_soln[6];
159 nodal_soln[7] = elem_soln[7];
160 nodal_soln[8] = elem_soln[8];
163 nodal_soln[9] = elem_soln[9];
164 nodal_soln[10] = elem_soln[10];
165 nodal_soln[11] = elem_soln[11];
168 nodal_soln[12] = .5*(elem_soln[0] + elem_soln[3]);
169 nodal_soln[13] = .5*(elem_soln[1] + elem_soln[4]);
170 nodal_soln[14] = .5*(elem_soln[2] + elem_soln[5]);
173 nodal_soln[15] = .5*(elem_soln[3] + elem_soln[6]);
174 nodal_soln[16] = .5*(elem_soln[4] + elem_soln[7]);
175 nodal_soln[17] = .5*(elem_soln[5] + elem_soln[8]);
178 nodal_soln[18] = .5*(elem_soln[6] + elem_soln[0]);
179 nodal_soln[19] = .5*(elem_soln[7] + elem_soln[1]);
180 nodal_soln[20] = .5*(elem_soln[8] + elem_soln[2]);
183 nodal_soln[21] = .5*(elem_soln[9] + elem_soln[0]);
184 nodal_soln[22] = .5*(elem_soln[10] + elem_soln[1]);
185 nodal_soln[23] = .5*(elem_soln[11] + elem_soln[2]);
188 nodal_soln[24] = .5*(elem_soln[9] + elem_soln[3]);
189 nodal_soln[25] = .5*(elem_soln[10] + elem_soln[4]);
190 nodal_soln[26] = .5*(elem_soln[11] + elem_soln[5]);
193 nodal_soln[27] = .5*(elem_soln[9] + elem_soln[6]);
194 nodal_soln[28] = .5*(elem_soln[10] + elem_soln[7]);
195 nodal_soln[29] = .5*(elem_soln[11] + elem_soln[8]);
204 libmesh_assert_equal_to (elem_soln.size(), 3*8);
207 libmesh_assert_equal_to (nodal_soln.size(), 3*20);
209 libmesh_assert_equal_to (nodal_soln.size(), 3*27);
212 nodal_soln[0] = elem_soln[0];
213 nodal_soln[1] = elem_soln[1];
214 nodal_soln[2] = elem_soln[2];
217 nodal_soln[3] = elem_soln[3];
218 nodal_soln[4] = elem_soln[4];
219 nodal_soln[5] = elem_soln[5];
222 nodal_soln[6] = elem_soln[6];
223 nodal_soln[7] = elem_soln[7];
224 nodal_soln[8] = elem_soln[8];
227 nodal_soln[9] = elem_soln[9];
228 nodal_soln[10] = elem_soln[10];
229 nodal_soln[11] = elem_soln[11];
232 nodal_soln[12] = elem_soln[12];
233 nodal_soln[13] = elem_soln[13];
234 nodal_soln[14] = elem_soln[14];
237 nodal_soln[15] = elem_soln[15];
238 nodal_soln[16] = elem_soln[16];
239 nodal_soln[17] = elem_soln[17];
242 nodal_soln[18] = elem_soln[18];
243 nodal_soln[19] = elem_soln[19];
244 nodal_soln[20] = elem_soln[20];
247 nodal_soln[21] = elem_soln[21];
248 nodal_soln[22] = elem_soln[22];
249 nodal_soln[23] = elem_soln[23];
252 nodal_soln[24] = .5*(elem_soln[0] + elem_soln[3]);
253 nodal_soln[25] = .5*(elem_soln[1] + elem_soln[4]);
254 nodal_soln[26] = .5*(elem_soln[2] + elem_soln[5]);
257 nodal_soln[27] = .5*(elem_soln[3] + elem_soln[6]);
258 nodal_soln[28] = .5*(elem_soln[4] + elem_soln[7]);
259 nodal_soln[29] = .5*(elem_soln[5] + elem_soln[8]);
262 nodal_soln[30] = .5*(elem_soln[6] + elem_soln[9]);
263 nodal_soln[31] = .5*(elem_soln[7] + elem_soln[10]);
264 nodal_soln[32] = .5*(elem_soln[8] + elem_soln[11]);
267 nodal_soln[33] = .5*(elem_soln[9] + elem_soln[0]);
268 nodal_soln[34] = .5*(elem_soln[10] + elem_soln[1]);
269 nodal_soln[35] = .5*(elem_soln[11] + elem_soln[2]);
272 nodal_soln[36] = .5*(elem_soln[0] + elem_soln[12]);
273 nodal_soln[37] = .5*(elem_soln[1] + elem_soln[13]);
274 nodal_soln[38] = .5*(elem_soln[2] + elem_soln[14]);
277 nodal_soln[39] = .5*(elem_soln[3] + elem_soln[15]);
278 nodal_soln[40] = .5*(elem_soln[4] + elem_soln[16]);
279 nodal_soln[41] = .5*(elem_soln[5] + elem_soln[17]);
282 nodal_soln[42] = .5*(elem_soln[6] + elem_soln[18]);
283 nodal_soln[43] = .5*(elem_soln[7] + elem_soln[19]);
284 nodal_soln[44] = .5*(elem_soln[8] + elem_soln[20]);
287 nodal_soln[45] = .5*(elem_soln[9] + elem_soln[21]);
288 nodal_soln[46] = .5*(elem_soln[10] + elem_soln[22]);
289 nodal_soln[47] = .5*(elem_soln[11] + elem_soln[23]);
292 nodal_soln[48] = .5*(elem_soln[12] + elem_soln[15]);
293 nodal_soln[49] = .5*(elem_soln[13] + elem_soln[16]);
294 nodal_soln[50] = .5*(elem_soln[14] + elem_soln[17]);
297 nodal_soln[51] = .5*(elem_soln[15] + elem_soln[18]);
298 nodal_soln[52] = .5*(elem_soln[16] + elem_soln[19]);
299 nodal_soln[53] = .5*(elem_soln[17] + elem_soln[20]);
302 nodal_soln[54] = .5*(elem_soln[18] + elem_soln[21]);
303 nodal_soln[55] = .5*(elem_soln[19] + elem_soln[22]);
304 nodal_soln[56] = .5*(elem_soln[20] + elem_soln[23]);
307 nodal_soln[57] = .5*(elem_soln[12] + elem_soln[21]);
308 nodal_soln[58] = .5*(elem_soln[13] + elem_soln[22]);
309 nodal_soln[59] = .5*(elem_soln[14] + elem_soln[23]);
314 nodal_soln[60] = .25*(elem_soln[0] + elem_soln[3] + elem_soln[6] + elem_soln[9]);
315 nodal_soln[61] = .25*(elem_soln[1] + elem_soln[4] + elem_soln[7] + elem_soln[10]);
316 nodal_soln[62] = .25*(elem_soln[2] + elem_soln[5] + elem_soln[8] + elem_soln[11]);
319 nodal_soln[63] = .25*(elem_soln[0] + elem_soln[3] + elem_soln[12] + elem_soln[15]);
320 nodal_soln[64] = .25*(elem_soln[1] + elem_soln[4] + elem_soln[13] + elem_soln[16]);
321 nodal_soln[65] = .25*(elem_soln[2] + elem_soln[5] + elem_soln[14] + elem_soln[17]);
324 nodal_soln[66] = .25*(elem_soln[3] + elem_soln[6] + elem_soln[15] + elem_soln[18]);
325 nodal_soln[67] = .25*(elem_soln[4] + elem_soln[7] + elem_soln[16] + elem_soln[19]);
326 nodal_soln[68] = .25*(elem_soln[5] + elem_soln[8] + elem_soln[17] + elem_soln[20]);
329 nodal_soln[69] = .25*(elem_soln[6] + elem_soln[9] + elem_soln[18] + elem_soln[21]);
330 nodal_soln[70] = .25*(elem_soln[7] + elem_soln[10] + elem_soln[19] + elem_soln[22]);
331 nodal_soln[71] = .25*(elem_soln[8] + elem_soln[11] + elem_soln[20] + elem_soln[23]);
334 nodal_soln[72] = .25*(elem_soln[9] + elem_soln[0] + elem_soln[21] + elem_soln[12]);
335 nodal_soln[73] = .25*(elem_soln[10] + elem_soln[1] + elem_soln[22] + elem_soln[13]);
336 nodal_soln[74] = .25*(elem_soln[11] + elem_soln[2] + elem_soln[23] + elem_soln[14]);
339 nodal_soln[75] = .25*(elem_soln[12] + elem_soln[15] + elem_soln[18] + elem_soln[21]);
340 nodal_soln[76] = .25*(elem_soln[13] + elem_soln[16] + elem_soln[19] + elem_soln[22]);
341 nodal_soln[77] = .25*(elem_soln[14] + elem_soln[17] + elem_soln[20] + elem_soln[23]);
344 nodal_soln[78] = .125*(elem_soln[0] + elem_soln[3] + elem_soln[6] + elem_soln[9] +
345 elem_soln[12] + elem_soln[15] + elem_soln[18] + elem_soln[21]);
347 nodal_soln[79] = .125*(elem_soln[1] + elem_soln[4] + elem_soln[7] + elem_soln[10] +
348 elem_soln[13] + elem_soln[16] + elem_soln[19] + elem_soln[22]);
350 nodal_soln[80] = .125*(elem_soln[2] + elem_soln[5] + elem_soln[8] + elem_soln[11] +
351 elem_soln[14] + elem_soln[17] + elem_soln[20] + elem_soln[23]);
361 libmesh_assert_equal_to (elem_soln.size(), 3*6);
364 libmesh_assert_equal_to (nodal_soln.size(), 3*15);
366 libmesh_assert_equal_to (nodal_soln.size(), 3*18);
369 nodal_soln[0] = elem_soln[0];
370 nodal_soln[1] = elem_soln[1];
371 nodal_soln[2] = elem_soln[2];
374 nodal_soln[3] = elem_soln[3];
375 nodal_soln[4] = elem_soln[4];
376 nodal_soln[5] = elem_soln[5];
379 nodal_soln[6] = elem_soln[6];
380 nodal_soln[7] = elem_soln[7];
381 nodal_soln[8] = elem_soln[8];
384 nodal_soln[9] = elem_soln[9];
385 nodal_soln[10] = elem_soln[10];
386 nodal_soln[11] = elem_soln[11];
389 nodal_soln[12] = elem_soln[12];
390 nodal_soln[13] = elem_soln[13];
391 nodal_soln[14] = elem_soln[14];
394 nodal_soln[15] = elem_soln[15];
395 nodal_soln[16] = elem_soln[16];
396 nodal_soln[17] = elem_soln[17];
399 nodal_soln[18] = .5*(elem_soln[0] + elem_soln[3]);
400 nodal_soln[19] = .5*(elem_soln[1] + elem_soln[4]);
401 nodal_soln[20] = .5*(elem_soln[2] + elem_soln[5]);
404 nodal_soln[21] = .5*(elem_soln[3] + elem_soln[6]);
405 nodal_soln[22] = .5*(elem_soln[4] + elem_soln[7]);
406 nodal_soln[23] = .5*(elem_soln[5] + elem_soln[8]);
409 nodal_soln[24] = .5*(elem_soln[0] + elem_soln[6]);
410 nodal_soln[25] = .5*(elem_soln[1] + elem_soln[7]);
411 nodal_soln[26] = .5*(elem_soln[2] + elem_soln[8]);
414 nodal_soln[27] = .5*(elem_soln[0] + elem_soln[9]);
415 nodal_soln[28] = .5*(elem_soln[1] + elem_soln[10]);
416 nodal_soln[29] = .5*(elem_soln[2] + elem_soln[11]);
419 nodal_soln[30] = .5*(elem_soln[3] + elem_soln[12]);
420 nodal_soln[31] = .5*(elem_soln[4] + elem_soln[13]);
421 nodal_soln[32] = .5*(elem_soln[5] + elem_soln[14]);
424 nodal_soln[33] = .5*(elem_soln[6] + elem_soln[15]);
425 nodal_soln[34] = .5*(elem_soln[7] + elem_soln[16]);
426 nodal_soln[35] = .5*(elem_soln[8] + elem_soln[17]);
429 nodal_soln[36] = .5*(elem_soln[9] + elem_soln[12]);
430 nodal_soln[37] = .5*(elem_soln[10] + elem_soln[13]);
431 nodal_soln[38] = .5*(elem_soln[11] + elem_soln[14]);
434 nodal_soln[39] = .5*(elem_soln[12] + elem_soln[15]);
435 nodal_soln[40] = .5*(elem_soln[13] + elem_soln[16]);
436 nodal_soln[41] = .5*(elem_soln[14] + elem_soln[17]);
439 nodal_soln[42] = .5*(elem_soln[12] + elem_soln[15]);
440 nodal_soln[43] = .5*(elem_soln[13] + elem_soln[16]);
441 nodal_soln[44] = .5*(elem_soln[14] + elem_soln[17]);
446 nodal_soln[45] = .25*(elem_soln[0] + elem_soln[3] + elem_soln[12] + elem_soln[9]);
447 nodal_soln[46] = .25*(elem_soln[1] + elem_soln[4] + elem_soln[13] + elem_soln[10]);
448 nodal_soln[47] = .25*(elem_soln[2] + elem_soln[5] + elem_soln[14] + elem_soln[11]);
451 nodal_soln[48] = .25*(elem_soln[3] + elem_soln[6] + elem_soln[15] + elem_soln[12]);
452 nodal_soln[49] = .25*(elem_soln[4] + elem_soln[7] + elem_soln[16] + elem_soln[13]);
453 nodal_soln[50] = .25*(elem_soln[5] + elem_soln[8] + elem_soln[17] + elem_soln[14]);
456 nodal_soln[51] = .25*(elem_soln[6] + elem_soln[0] + elem_soln[9] + elem_soln[15]);
457 nodal_soln[52] = .25*(elem_soln[7] + elem_soln[1] + elem_soln[10] + elem_soln[16]);
458 nodal_soln[53] = .25*(elem_soln[8] + elem_soln[2] + elem_soln[11] + elem_soln[17]);
468 nodal_soln = elem_soln;
483 nodal_soln = elem_soln;
508 const std::vector<Number> & elem_soln,
509 std::vector<Number> & nodal_soln)
515 const std::vector<Number> & elem_soln,
516 std::vector<Number> & nodal_soln)
522 const std::vector<Number> & elem_soln,
523 std::vector<Number> & nodal_soln)
524 { lagrange_vec_nodal_soln(elem, order, elem_soln, 2 , nodal_soln); }
529 const std::vector<Number> & elem_soln,
530 std::vector<Number> & nodal_soln)
531 { lagrange_vec_nodal_soln(elem, order, elem_soln, 3 , nodal_soln); }
538 const unsigned int i,
const Point & p)
544 const unsigned int i,
const unsigned int j,
551 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
554 const unsigned int i,
const unsigned int j,
564 const unsigned int i,
const Point & p)
570 const unsigned int i,
const unsigned int j,
576 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
578 const unsigned int i,
const unsigned int j,
589 const unsigned int i,
const Point & p)
602 libmesh_error_msg(
"i%2 must be either 0 or 1!");
609 const unsigned int i,
const unsigned int j,
623 libmesh_error_msg(
"i%2 must be either 0 or 1!");
630 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
632 const unsigned int i,
const unsigned int j,
646 libmesh_error_msg(
"i%2 must be either 0 or 1!");
658 const unsigned int i,
const Point & p)
674 libmesh_error_msg(
"i%3 must be 0, 1, or 2!");
681 const unsigned int i,
const unsigned int j,
698 libmesh_error_msg(
"i%3 must be 0, 1, or 2!");
705 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
708 const unsigned int i,
const unsigned int j,
725 libmesh_error_msg(
"i%3 must be 0, 1, or 2!");
737 const unsigned int i,
const Point & p,
738 const bool add_p_level)
744 const unsigned int i,
const unsigned int j,
746 const bool add_p_level)
752 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
755 const unsigned int i,
const unsigned int j,
757 const bool add_p_level)
767 const unsigned int i,
const Point & p,
768 const bool add_p_level)
774 const unsigned int i,
const unsigned int j,
776 const bool add_p_level)
782 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
784 const unsigned int i,
const unsigned int j,
786 const bool add_p_level)
796 const unsigned int i,
const Point & p,
797 const bool add_p_level)
810 libmesh_error_msg(
"i%2 must be either 0 or 1!");
817 const unsigned int i,
const unsigned int j,
819 const bool add_p_level)
832 libmesh_error_msg(
"i%2 must be either 0 or 1!");
839 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
841 const unsigned int i,
const unsigned int j,
843 const bool add_p_level)
856 libmesh_error_msg(
"i%2 must be either 0 or 1!");
867 const unsigned int i,
const Point & p,
868 const bool add_p_level)
884 libmesh_error_msg(
"i%3 must be 0, 1, or 2!");
891 const unsigned int i,
const unsigned int j,
893 const bool add_p_level)
909 libmesh_error_msg(
"i%3 must be 0, 1, or 2!");
916 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
919 const unsigned int i,
const unsigned int j,
921 const bool add_p_level)
937 libmesh_error_msg(
"i%3 must be 0, 1, or 2!");
992 #ifdef LIBMESH_ENABLE_AMR
996 const unsigned int variable_number,
1005 const unsigned int variable_number,
1010 #endif // LIBMESH_ENABLE_AMR