Line data Source code
1 : // The libMesh Finite Element Library.
2 : // Copyright (C) 2002-2025 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 411697340 : Real fe_lagrange_1D_linear_shape(const unsigned int i,
33 : const Real xi)
34 : {
35 411697340 : libmesh_assert_less (i, 2);
36 :
37 4130135634 : switch (i)
38 : {
39 2065067817 : case 0:
40 2098165338 : return .5*(1. - xi);
41 :
42 : // case 1
43 2065067817 : default:
44 2098165338 : return .5*(1. + xi);
45 : }
46 : }
47 :
48 :
49 :
50 : inline
51 21103209855 : Real fe_lagrange_1D_quadratic_shape(const unsigned int i,
52 : const Real xi)
53 : {
54 1809048735 : libmesh_assert_less (i, 3);
55 :
56 22838939475 : switch (i)
57 : {
58 7615413573 : case 0:
59 7636120956 : return .5*xi*(xi - 1.);
60 :
61 7615413573 : case 1:
62 7620105348 : return .5*xi*(xi + 1);
63 :
64 : // case 2
65 7608112329 : default:
66 7704645821 : return (1. - xi*xi);
67 : }
68 : }
69 :
70 :
71 :
72 : inline
73 24256 : Real fe_lagrange_1D_cubic_shape(const unsigned int i,
74 : const Real xi)
75 : {
76 768 : libmesh_assert_less (i, 4);
77 :
78 24256 : switch (i)
79 : {
80 6064 : case 0:
81 6064 : return 9./16.*(1./9.-xi*xi)*(xi-1.);
82 :
83 6064 : case 1:
84 6064 : return -9./16.*(1./9.-xi*xi)*(xi+1.);
85 :
86 6064 : case 2:
87 6064 : return 27./16.*(1.-xi*xi)*(1./3.-xi);
88 :
89 : // case 3
90 6064 : default:
91 6064 : return 27./16.*(1.-xi*xi)*(1./3.+xi);
92 : }
93 : }
94 :
95 :
96 :
97 : inline
98 78268410 : Real fe_lagrange_1D_shape(const Order order,
99 : const unsigned int i,
100 : const Real xi)
101 : {
102 7323027 : libmesh_assert_less_equal(order, THIRD);
103 :
104 78268410 : switch (order)
105 : {
106 : // Lagrange linears
107 1124292 : case FIRST:
108 1124292 : return fe_lagrange_1D_linear_shape(i, xi);
109 :
110 : // Lagrange quadratics
111 64570074 : case SECOND:
112 64570074 : return fe_lagrange_1D_quadratic_shape(i, xi);
113 :
114 : // Lagrange cubics
115 : // case THIRD
116 24256 : default:
117 24256 : return fe_lagrange_1D_cubic_shape(i, xi);
118 : }
119 : }
120 :
121 :
122 :
123 : inline
124 119891572 : 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 119891572 : libmesh_assert_equal_to (j, 0);
130 :
131 119891572 : libmesh_assert_less (i, 2);
132 :
133 1238795682 : switch (i)
134 : {
135 59945786 : case 0:
136 59945786 : return -.5;
137 :
138 : // case 1
139 629784030 : default:
140 572954193 : return .5;
141 : }
142 : }
143 :
144 :
145 : inline
146 832748695 : 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 832748695 : libmesh_assert_equal_to (j, 0);
152 :
153 832748695 : libmesh_assert_less (i, 3);
154 :
155 10746540033 : switch (i)
156 : {
157 3583170507 : case 0:
158 3595743427 : return xi-.5;
159 :
160 3583170507 : case 1:
161 3586018272 : return xi+.5;
162 :
163 : // case 2
164 3580199019 : default:
165 3626952307 : return -2.*xi;
166 : }
167 : }
168 :
169 :
170 : inline
171 15920 : 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 512 : libmesh_assert_equal_to (j, 0);
177 :
178 512 : libmesh_assert_less (i, 4);
179 :
180 15920 : switch (i)
181 : {
182 3980 : case 0:
183 3980 : return -9./16.*(3.*xi*xi-2.*xi-1./9.);
184 :
185 3980 : case 1:
186 3980 : return -9./16.*(-3.*xi*xi-2.*xi+1./9.);
187 :
188 3980 : case 2:
189 3980 : return 27./16.*(3.*xi*xi-2./3.*xi-1.);
190 :
191 : // case 3
192 3980 : default:
193 3980 : return 27./16.*(-3.*xi*xi-2./3.*xi+1.);
194 : }
195 : }
196 :
197 :
198 :
199 : inline
200 347468617 : 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 27533329 : libmesh_assert_less_equal(order, THIRD);
206 :
207 347468617 : switch (order)
208 : {
209 21784856 : case FIRST:
210 21784856 : return fe_lagrange_1D_linear_shape_deriv(i, j, xi);
211 :
212 5747961 : case SECOND:
213 5747961 : return fe_lagrange_1D_quadratic_shape_deriv(i, j, xi);
214 :
215 : // case THIRD
216 15920 : default:
217 15920 : 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 13920485 : 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 13920485 : libmesh_assert_equal_to (j, 0);
235 13920485 : libmesh_assert_less(i, 3);
236 :
237 161652516 : switch (i)
238 : {
239 4535405 : case 0:
240 4535405 : return 1.;
241 :
242 4535405 : case 1:
243 4535405 : return 1.;
244 :
245 : // case 2
246 53655272 : default:
247 49727415 : 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 1483967 : 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 95107 : libmesh_assert_less_equal(order, THIRD);
288 :
289 1578612 : switch (order)
290 : {
291 : // All second derivatives of linears are zero....
292 12388 : case FIRST:
293 12388 : return 0.;
294 :
295 82719 : case SECOND:
296 82719 : 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
|