Line data Source code
1 : // The libMesh Finite Element Library.
2 : // Copyright (C) 2002-2026 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3 :
4 : // This library is free software; you can redistribute it and/or
5 : // modify it under the terms of the GNU Lesser General Public
6 : // License as published by the Free Software Foundation; either
7 : // version 2.1 of the License, or (at your option) any later version.
8 :
9 : // This library is distributed in the hope that it will be useful,
10 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 : // Lesser General Public License for more details.
13 :
14 : // You should have received a copy of the GNU Lesser General Public
15 : // License along with this library; if not, write to the Free Software
16 : // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 :
18 :
19 : #ifndef LIBMESH_FE_LAGRANGE_SHAPE_1D_H
20 : #define LIBMESH_FE_LAGRANGE_SHAPE_1D_H
21 :
22 : // Local includes
23 : #include "libmesh/enum_order.h" // FIRST, SECOND, etc.
24 : #include "libmesh/point.h"
25 :
26 : // Inline functions useful to inline on tensor elements.
27 :
28 : namespace libMesh
29 : {
30 :
31 : inline
32 411676032 : Real fe_lagrange_1D_linear_shape(const unsigned int i,
33 : const Real xi)
34 : {
35 411676032 : libmesh_assert_less (i, 2);
36 :
37 4126836516 : switch (i)
38 : {
39 2063418258 : case 0:
40 2096369563 : return .5*(1. - xi);
41 :
42 : // case 1
43 2063418258 : default:
44 2096369563 : return .5*(1. + xi);
45 : }
46 : }
47 :
48 :
49 :
50 : inline
51 21842984433 : Real fe_lagrange_1D_quadratic_shape(const unsigned int i,
52 : const Real xi)
53 : {
54 1878153509 : libmesh_assert_less (i, 3);
55 :
56 23642699240 : switch (i)
57 : {
58 7883461712 : case 0:
59 7902780977 : return .5*xi*(xi - 1.);
60 :
61 7883461712 : case 1:
62 7887139256 : return .5*xi*(xi + 1);
63 :
64 : // case 2
65 7875775816 : default:
66 7971153721 : return (1. - xi*xi);
67 : }
68 : }
69 :
70 :
71 :
72 : inline
73 69696 : Real fe_lagrange_1D_cubic_shape(const unsigned int i,
74 : const Real xi)
75 : {
76 2048 : libmesh_assert_less (i, 4);
77 :
78 69696 : switch (i)
79 : {
80 17424 : case 0:
81 17424 : return 9./16.*(1./9.-xi*xi)*(xi-1.);
82 :
83 17424 : case 1:
84 17424 : return -9./16.*(1./9.-xi*xi)*(xi+1.);
85 :
86 17424 : case 2:
87 17424 : return 27./16.*(1.-xi*xi)*(1./3.-xi);
88 :
89 : // case 3
90 17424 : default:
91 17424 : return 27./16.*(1.-xi*xi)*(1./3.+xi);
92 : }
93 : }
94 :
95 :
96 :
97 : inline
98 89920196 : Real fe_lagrange_1D_shape(const Order order,
99 : const unsigned int i,
100 : const Real xi)
101 : {
102 8755177 : libmesh_assert_less_equal(order, THIRD);
103 :
104 89920196 : switch (order)
105 : {
106 : // Lagrange linears
107 1124618 : case FIRST:
108 1124618 : return fe_lagrange_1D_linear_shape(i, xi);
109 :
110 : // Lagrange quadratics
111 74881416 : case SECOND:
112 74881416 : return fe_lagrange_1D_quadratic_shape(i, xi);
113 :
114 : // Lagrange cubics
115 : // case THIRD
116 69696 : default:
117 69696 : return fe_lagrange_1D_cubic_shape(i, xi);
118 : }
119 : }
120 :
121 :
122 :
123 : inline
124 119828898 : Real fe_lagrange_1D_linear_shape_deriv(const unsigned int i,
125 : const unsigned int libmesh_dbg_var(j),
126 : const Real)
127 : {
128 : // only d()/dxi in 1D!
129 119828898 : libmesh_assert_equal_to (j, 0);
130 :
131 119828898 : libmesh_assert_less (i, 2);
132 :
133 1236673534 : switch (i)
134 : {
135 59914449 : case 0:
136 59914449 : return -.5;
137 :
138 : // case 1
139 628722956 : default:
140 571921738 : return .5;
141 : }
142 : }
143 :
144 :
145 : inline
146 859928571 : Real fe_lagrange_1D_quadratic_shape_deriv(const unsigned int i,
147 : const unsigned int libmesh_dbg_var(j),
148 : const Real xi)
149 : {
150 : // only d()/dxi in 1D!
151 859928571 : libmesh_assert_equal_to (j, 0);
152 :
153 859928571 : libmesh_assert_less (i, 3);
154 :
155 11097132623 : switch (i)
156 : {
157 3700053058 : case 0:
158 3711741160 : return xi-.5;
159 :
160 3700053058 : case 1:
161 3702253864 : return xi+.5;
162 :
163 : // case 2
164 3697026507 : default:
165 3741961695 : return -2.*xi;
166 : }
167 : }
168 :
169 :
170 : inline
171 45456 : Real fe_lagrange_1D_cubic_shape_deriv(const unsigned int i,
172 : const unsigned int libmesh_dbg_var(j),
173 : const Real xi)
174 : {
175 : // only d()/dxi in 1D!
176 1344 : libmesh_assert_equal_to (j, 0);
177 :
178 1344 : libmesh_assert_less (i, 4);
179 :
180 45456 : switch (i)
181 : {
182 11364 : case 0:
183 11364 : return -9./16.*(3.*xi*xi-2.*xi-1./9.);
184 :
185 11364 : case 1:
186 11364 : return -9./16.*(-3.*xi*xi-2.*xi+1./9.);
187 :
188 11364 : case 2:
189 11364 : return 27./16.*(3.*xi*xi-2./3.*xi-1.);
190 :
191 : // case 3
192 11364 : default:
193 11364 : return 27./16.*(-3.*xi*xi-2./3.*xi+1.);
194 : }
195 : }
196 :
197 :
198 :
199 : inline
200 358644425 : Real fe_lagrange_1D_shape_deriv(const Order order,
201 : const unsigned int i,
202 : const unsigned int j,
203 : const Real xi)
204 : {
205 28702189 : libmesh_assert_less_equal(order, THIRD);
206 :
207 358644425 : switch (order)
208 : {
209 21785020 : case FIRST:
210 21785020 : return fe_lagrange_1D_linear_shape_deriv(i, j, xi);
211 :
212 6915825 : case SECOND:
213 6915825 : return fe_lagrange_1D_quadratic_shape_deriv(i, j, xi);
214 :
215 : // case THIRD
216 45456 : default:
217 45456 : return fe_lagrange_1D_cubic_shape_deriv(i, j, xi);
218 : }
219 : }
220 :
221 :
222 : #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
223 :
224 : // fe_lagrange_1D_linear_shape_second_deriv is 0
225 :
226 :
227 : inline
228 13920956 : Real fe_lagrange_1D_quadratic_shape_second_deriv(const unsigned int i,
229 : const unsigned int libmesh_dbg_var(j),
230 : const Real)
231 : {
232 : // Don't need to switch on j. 1D shape functions
233 : // depend on xi only!
234 13920956 : libmesh_assert_equal_to (j, 0);
235 13920956 : libmesh_assert_less(i, 3);
236 :
237 161654079 : switch (i)
238 : {
239 4535562 : case 0:
240 4535562 : return 1.;
241 :
242 4535562 : case 1:
243 4535562 : return 1.;
244 :
245 : // case 2
246 53655793 : default:
247 49728019 : return -2.;
248 : }
249 : }
250 :
251 :
252 : inline
253 0 : Real fe_lagrange_1D_cubic_shape_second_deriv(const unsigned int i,
254 : const unsigned int libmesh_dbg_var(j),
255 : const Real xi)
256 : {
257 : // Don't need to switch on j. 1D shape functions
258 : // depend on xi only!
259 0 : libmesh_assert_equal_to (j, 0);
260 0 : libmesh_assert_less(i, 4);
261 :
262 0 : switch (i)
263 : {
264 0 : case 0:
265 0 : return -9./16.*(6.*xi-2);
266 :
267 0 : case 1:
268 0 : return -9./16.*(-6*xi-2.);
269 :
270 0 : case 2:
271 0 : return 27./16.*(6*xi-2./3.);
272 :
273 : // case 2
274 0 : default:
275 0 : return 27./16.*(-6*xi-2./3.);
276 : }
277 : }
278 :
279 :
280 :
281 : inline
282 1483997 : Real fe_lagrange_1D_shape_second_deriv(const Order order,
283 : const unsigned int i,
284 : const unsigned int j,
285 : const Real xi)
286 : {
287 95470 : libmesh_assert_less_equal(order, THIRD);
288 :
289 1578393 : switch (order)
290 : {
291 : // All second derivatives of linears are zero....
292 12388 : case FIRST:
293 12388 : return 0.;
294 :
295 83082 : case SECOND:
296 83082 : return fe_lagrange_1D_quadratic_shape_second_deriv(i, j, xi);
297 :
298 : // case THIRD
299 0 : default:
300 0 : return fe_lagrange_1D_cubic_shape_second_deriv(i, j, xi);
301 : } // end switch (order)
302 : }
303 :
304 : #endif // LIBMESH_ENABLE_SECOND_DERIVATIVES
305 :
306 : }
307 :
308 : #endif // LIBMESH_FE_LAGRANGE_SHAPE_1D_H
|