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/enum_to_string.h"
36 void l2_lagrange_nodal_soln(
const Elem * elem,
38 const std::vector<Number> & elem_soln,
39 std::vector<Number> & nodal_soln)
41 const unsigned int n_nodes = elem->n_nodes();
44 const Order totalorder = static_cast<Order>(order+elem->p_level());
59 libmesh_assert_equal_to (elem_soln.size(), 2);
60 libmesh_assert_equal_to (nodal_soln.size(), 3);
62 nodal_soln[0] = elem_soln[0];
63 nodal_soln[1] = elem_soln[1];
64 nodal_soln[2] = .5*(elem_soln[0] + elem_soln[1]);
71 libmesh_assert_equal_to (elem_soln.size(), 2);
72 libmesh_assert_equal_to (nodal_soln.size(), 4);
74 nodal_soln[0] = elem_soln[0];
75 nodal_soln[1] = elem_soln[1];
76 nodal_soln[2] = (2.*elem_soln[0] + elem_soln[1])/3.;
77 nodal_soln[3] = (elem_soln[0] + 2.*elem_soln[1])/3.;
85 libmesh_assert_equal_to (elem_soln.size(), 3);
86 libmesh_assert_equal_to (nodal_soln.size(), 6);
88 nodal_soln[0] = elem_soln[0];
89 nodal_soln[1] = elem_soln[1];
90 nodal_soln[2] = elem_soln[2];
91 nodal_soln[3] = .5*(elem_soln[0] + elem_soln[1]);
92 nodal_soln[4] = .5*(elem_soln[1] + elem_soln[2]);
93 nodal_soln[5] = .5*(elem_soln[2] + elem_soln[0]);
102 libmesh_assert_equal_to (elem_soln.size(), 4);
105 libmesh_assert_equal_to (nodal_soln.size(), 8);
107 libmesh_assert_equal_to (nodal_soln.size(), 9);
110 nodal_soln[0] = elem_soln[0];
111 nodal_soln[1] = elem_soln[1];
112 nodal_soln[2] = elem_soln[2];
113 nodal_soln[3] = elem_soln[3];
114 nodal_soln[4] = .5*(elem_soln[0] + elem_soln[1]);
115 nodal_soln[5] = .5*(elem_soln[1] + elem_soln[2]);
116 nodal_soln[6] = .5*(elem_soln[2] + elem_soln[3]);
117 nodal_soln[7] = .5*(elem_soln[3] + elem_soln[0]);
120 nodal_soln[8] = .25*(elem_soln[0] + elem_soln[1] + elem_soln[2] + elem_soln[3]);
128 libmesh_assert_equal_to (elem_soln.size(), 4);
129 libmesh_assert_equal_to (nodal_soln.size(), 10);
131 nodal_soln[0] = elem_soln[0];
132 nodal_soln[1] = elem_soln[1];
133 nodal_soln[2] = elem_soln[2];
134 nodal_soln[3] = elem_soln[3];
135 nodal_soln[4] = .5*(elem_soln[0] + elem_soln[1]);
136 nodal_soln[5] = .5*(elem_soln[1] + elem_soln[2]);
137 nodal_soln[6] = .5*(elem_soln[2] + elem_soln[0]);
138 nodal_soln[7] = .5*(elem_soln[3] + elem_soln[0]);
139 nodal_soln[8] = .5*(elem_soln[3] + elem_soln[1]);
140 nodal_soln[9] = .5*(elem_soln[3] + elem_soln[2]);
149 libmesh_assert_equal_to (elem_soln.size(), 8);
152 libmesh_assert_equal_to (nodal_soln.size(), 20);
154 libmesh_assert_equal_to (nodal_soln.size(), 27);
156 nodal_soln[0] = elem_soln[0];
157 nodal_soln[1] = elem_soln[1];
158 nodal_soln[2] = elem_soln[2];
159 nodal_soln[3] = elem_soln[3];
160 nodal_soln[4] = elem_soln[4];
161 nodal_soln[5] = elem_soln[5];
162 nodal_soln[6] = elem_soln[6];
163 nodal_soln[7] = elem_soln[7];
164 nodal_soln[8] = .5*(elem_soln[0] + elem_soln[1]);
165 nodal_soln[9] = .5*(elem_soln[1] + elem_soln[2]);
166 nodal_soln[10] = .5*(elem_soln[2] + elem_soln[3]);
167 nodal_soln[11] = .5*(elem_soln[3] + elem_soln[0]);
168 nodal_soln[12] = .5*(elem_soln[0] + elem_soln[4]);
169 nodal_soln[13] = .5*(elem_soln[1] + elem_soln[5]);
170 nodal_soln[14] = .5*(elem_soln[2] + elem_soln[6]);
171 nodal_soln[15] = .5*(elem_soln[3] + elem_soln[7]);
172 nodal_soln[16] = .5*(elem_soln[4] + elem_soln[5]);
173 nodal_soln[17] = .5*(elem_soln[5] + elem_soln[6]);
174 nodal_soln[18] = .5*(elem_soln[6] + elem_soln[7]);
175 nodal_soln[19] = .5*(elem_soln[4] + elem_soln[7]);
179 nodal_soln[20] = .25*(elem_soln[0] + elem_soln[1] + elem_soln[2] + elem_soln[3]);
180 nodal_soln[21] = .25*(elem_soln[0] + elem_soln[1] + elem_soln[4] + elem_soln[5]);
181 nodal_soln[22] = .25*(elem_soln[1] + elem_soln[2] + elem_soln[5] + elem_soln[6]);
182 nodal_soln[23] = .25*(elem_soln[2] + elem_soln[3] + elem_soln[6] + elem_soln[7]);
183 nodal_soln[24] = .25*(elem_soln[3] + elem_soln[0] + elem_soln[7] + elem_soln[4]);
184 nodal_soln[25] = .25*(elem_soln[4] + elem_soln[5] + elem_soln[6] + elem_soln[7]);
186 nodal_soln[26] = .125*(elem_soln[0] + elem_soln[1] + elem_soln[2] + elem_soln[3] +
187 elem_soln[4] + elem_soln[5] + elem_soln[6] + elem_soln[7]);
197 libmesh_assert_equal_to (elem_soln.size(), 6);
200 libmesh_assert_equal_to (nodal_soln.size(), 15);
202 libmesh_assert_equal_to (nodal_soln.size(), 18);
204 nodal_soln[0] = elem_soln[0];
205 nodal_soln[1] = elem_soln[1];
206 nodal_soln[2] = elem_soln[2];
207 nodal_soln[3] = elem_soln[3];
208 nodal_soln[4] = elem_soln[4];
209 nodal_soln[5] = elem_soln[5];
210 nodal_soln[6] = .5*(elem_soln[0] + elem_soln[1]);
211 nodal_soln[7] = .5*(elem_soln[1] + elem_soln[2]);
212 nodal_soln[8] = .5*(elem_soln[0] + elem_soln[2]);
213 nodal_soln[9] = .5*(elem_soln[0] + elem_soln[3]);
214 nodal_soln[10] = .5*(elem_soln[1] + elem_soln[4]);
215 nodal_soln[11] = .5*(elem_soln[2] + elem_soln[5]);
216 nodal_soln[12] = .5*(elem_soln[3] + elem_soln[4]);
217 nodal_soln[13] = .5*(elem_soln[4] + elem_soln[5]);
218 nodal_soln[14] = .5*(elem_soln[3] + elem_soln[5]);
222 nodal_soln[15] = .25*(elem_soln[0] + elem_soln[1] + elem_soln[4] + elem_soln[3]);
223 nodal_soln[16] = .25*(elem_soln[1] + elem_soln[2] + elem_soln[5] + elem_soln[4]);
224 nodal_soln[17] = .25*(elem_soln[2] + elem_soln[0] + elem_soln[3] + elem_soln[5]);
236 nodal_soln = elem_soln;
249 libmesh_assert_equal_to (elem_soln.size(), 3);
250 libmesh_assert_equal_to (nodal_soln.size(), 4);
253 nodal_soln[0] = elem_soln[0];
254 nodal_soln[1] = elem_soln[1];
255 nodal_soln[2] = (2.*elem_soln[0] - elem_soln[1] +
257 nodal_soln[3] = (-elem_soln[0] + 2.*elem_soln[1] +
266 nodal_soln = elem_soln;
280 nodal_soln = elem_soln;
290 unsigned int l2_lagrange_n_dofs(
const ElemType t,
const Order o)
417 libmesh_error_msg(
"ERROR: Invalid Order " <<
Utility::enum_to_string(o) <<
" selected for L2_LAGRANGE FE family!");
430 const std::vector<Number> & elem_soln,
431 std::vector<Number> & nodal_soln)
432 { l2_lagrange_nodal_soln(elem, order, elem_soln, nodal_soln); }
437 const std::vector<Number> & elem_soln,
438 std::vector<Number> & nodal_soln)
439 { l2_lagrange_nodal_soln(elem, order, elem_soln, nodal_soln); }
444 const std::vector<Number> & elem_soln,
445 std::vector<Number> & nodal_soln)
446 { l2_lagrange_nodal_soln(elem, order, elem_soln, nodal_soln); }
451 const std::vector<Number> & elem_soln,
452 std::vector<Number> & nodal_soln)
453 { l2_lagrange_nodal_soln(elem, order, elem_soln, nodal_soln); }
498 #ifdef LIBMESH_ENABLE_AMR
512 #endif // LIBMESH_ENABLE_AMR