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 401066960 : Real fe_lagrange_1D_linear_shape(const unsigned int i,
33 : const Real xi)
34 : {
35 401066960 : libmesh_assert_less (i, 2);
36 :
37 1304558656 : switch (i)
38 : {
39 652279328 : case 0:
40 664517812 : return .5*(1. - xi);
41 :
42 : // case 1
43 652279328 : default:
44 664517812 : return .5*(1. + xi);
45 : }
46 : }
47 :
48 :
49 :
50 : inline
51 5292269315 : Real fe_lagrange_1D_quadratic_shape(const unsigned int i,
52 : const Real xi)
53 : {
54 1874329025 : libmesh_assert_less (i, 3);
55 :
56 7089930880 : switch (i)
57 : {
58 2362237796 : case 0:
59 2368615447 : return .5*xi*(xi - 1.);
60 :
61 2362237796 : case 1:
62 2365887104 : return .5*xi*(xi + 1);
63 :
64 : // case 2
65 2365455288 : default:
66 2390311807 : return (1. - xi*xi);
67 : }
68 : }
69 :
70 :
71 :
72 : inline
73 7232 : Real fe_lagrange_1D_cubic_shape(const unsigned int i,
74 : const Real xi)
75 : {
76 2048 : libmesh_assert_less (i, 4);
77 :
78 7232 : switch (i)
79 : {
80 1808 : case 0:
81 1808 : return 9./16.*(1./9.-xi*xi)*(xi-1.);
82 :
83 1808 : case 1:
84 1808 : return -9./16.*(1./9.-xi*xi)*(xi+1.);
85 :
86 1808 : case 2:
87 1808 : return 27./16.*(1.-xi*xi)*(1./3.-xi);
88 :
89 : // case 3
90 1808 : default:
91 1808 : return 27./16.*(1.-xi*xi)*(1./3.+xi);
92 : }
93 : }
94 :
95 :
96 :
97 : inline
98 29523148 : Real fe_lagrange_1D_shape(const Order order,
99 : const unsigned int i,
100 : const Real xi)
101 : {
102 8728459 : libmesh_assert_less_equal(order, THIRD);
103 :
104 29523148 : switch (order)
105 : {
106 : // Lagrange linears
107 1121420 : case FIRST:
108 1121420 : return fe_lagrange_1D_linear_shape(i, xi);
109 :
110 : // Lagrange quadratics
111 19052760 : case SECOND:
112 19052760 : return fe_lagrange_1D_quadratic_shape(i, xi);
113 :
114 : // Lagrange cubics
115 : // case THIRD
116 7232 : default:
117 7232 : return fe_lagrange_1D_cubic_shape(i, xi);
118 : }
119 : }
120 :
121 :
122 :
123 : inline
124 112746344 : 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 112746344 : libmesh_assert_equal_to (j, 0);
130 :
131 112746344 : libmesh_assert_less (i, 2);
132 :
133 382665494 : switch (i)
134 : {
135 56373172 : case 0:
136 56373172 : return -.5;
137 :
138 : // case 1
139 194123028 : default:
140 140861051 : return .5;
141 : }
142 : }
143 :
144 :
145 : inline
146 858239556 : 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 858239556 : libmesh_assert_equal_to (j, 0);
152 :
153 858239556 : libmesh_assert_less (i, 3);
154 :
155 3323357690 : switch (i)
156 : {
157 1107388771 : case 0:
158 1111217177 : return xi-.5;
159 :
160 1107388771 : case 1:
161 1109570437 : return xi+.5;
162 :
163 : // case 2
164 1108580148 : default:
165 1120348072 : return -2.*xi;
166 : }
167 : }
168 :
169 :
170 : inline
171 4752 : 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 4752 : switch (i)
181 : {
182 1188 : case 0:
183 1188 : return -9./16.*(3.*xi*xi-2.*xi-1./9.);
184 :
185 1188 : case 1:
186 1188 : return -9./16.*(-3.*xi*xi-2.*xi+1./9.);
187 :
188 1188 : case 2:
189 1188 : return 27./16.*(3.*xi*xi-2./3.*xi-1.);
190 :
191 : // case 3
192 1188 : default:
193 1188 : return 27./16.*(-3.*xi*xi-2./3.*xi+1.);
194 : }
195 : }
196 :
197 :
198 :
199 : inline
200 90881924 : 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 28664541 : libmesh_assert_less_equal(order, THIRD);
206 :
207 90881924 : switch (order)
208 : {
209 21783576 : case FIRST:
210 21783576 : return fe_lagrange_1D_linear_shape_deriv(i, j, xi);
211 :
212 6879621 : case SECOND:
213 6879621 : return fe_lagrange_1D_quadratic_shape_deriv(i, j, xi);
214 :
215 : // case THIRD
216 4752 : default:
217 4752 : 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 13920911 : 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 13920911 : libmesh_assert_equal_to (j, 0);
235 13920911 : libmesh_assert_less(i, 3);
236 :
237 51272636 : switch (i)
238 : {
239 4535547 : case 0:
240 4535547 : return 1.;
241 :
242 4535547 : case 1:
243 4535547 : return 1.;
244 :
245 : // case 2
246 17185942 : default:
247 13258097 : 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 283340 : 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 95425 : libmesh_assert_less_equal(order, THIRD);
288 :
289 377949 : switch (order)
290 : {
291 : // All second derivatives of linears are zero....
292 12388 : case FIRST:
293 12388 : return 0.;
294 :
295 83037 : case SECOND:
296 83037 : 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
|