LCOV - code coverage report
Current view: top level - include/fe - fe_lagrange_shape_1D.h (source / functions) Hit Total Coverage
Test: libMesh/libmesh: #4583 (689827) with base 9e5b0b Lines: 106 106 100.0 %
Date: 2026-10-16 15:05:09 Functions: 11 11 100.0 %
Legend: Lines: hit not hit

          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   407309818 : Real fe_lagrange_1D_linear_shape(const unsigned int i,
      33             :                                  const Real xi)
      34             : {
      35   407309818 :   libmesh_assert_less (i, 2);
      36             : 
      37  4164568280 :   switch (i)
      38             :     {
      39  2082284140 :     case 0:
      40  2115580993 :       return .5*(1. - xi);
      41             : 
      42             :     // case 1
      43  2082284140 :     default:
      44  2115580993 :       return .5*(1. + xi);
      45             :     }
      46             : }
      47             : 
      48             : 
      49             : 
      50             : inline
      51 24052195431 : Real fe_lagrange_1D_quadratic_shape(const unsigned int i,
      52             :                                     const Real xi)
      53             : {
      54  2059652670 :   libmesh_assert_less (i, 3);
      55             : 
      56 26029295733 :   switch (i)
      57             :     {
      58  8679080287 :     case 0:
      59  8699015004 :       return .5*xi*(xi - 1.);
      60             : 
      61  8679080287 :     case 1:
      62  8682879223 :       return .5*xi*(xi + 1);
      63             : 
      64             :     // case 2
      65  8671135159 :     default:
      66  8769803336 :       return (1. - xi*xi);
      67             :     }
      68             : }
      69             : 
      70             : 
      71             : 
      72             : inline
      73      127424 : Real fe_lagrange_1D_cubic_shape(const unsigned int i,
      74             :                                 const Real xi)
      75             : {
      76        7592 :   libmesh_assert_less (i, 4);
      77             : 
      78      127424 :   switch (i)
      79             :     {
      80       31856 :     case 0:
      81       31856 :       return 9./16.*(1./9.-xi*xi)*(xi-1.);
      82             : 
      83       31856 :     case 1:
      84       31856 :       return -9./16.*(1./9.-xi*xi)*(xi+1.);
      85             : 
      86       31856 :     case 2:
      87       31856 :       return 27./16.*(1.-xi*xi)*(1./3.-xi);
      88             : 
      89             :     // case 3
      90       31856 :     default:
      91       31856 :       return 27./16.*(1.-xi*xi)*(1./3.+xi);
      92             :     }
      93             : }
      94             : 
      95             : 
      96             : 
      97             : inline
      98    90449637 : Real fe_lagrange_1D_shape(const Order order,
      99             :                           const unsigned int i,
     100             :                           const Real xi)
     101             : {
     102     8776754 :   libmesh_assert_less_equal(order, THIRD);
     103             : 
     104    90449637 :   switch (order)
     105             :     {
     106             :       // Lagrange linears
     107     1125750 :     case FIRST:
     108     1125750 :       return fe_lagrange_1D_linear_shape(i, xi);
     109             : 
     110             :       // Lagrange quadratics
     111    75297300 :     case SECOND:
     112    75297300 :       return fe_lagrange_1D_quadratic_shape(i, xi);
     113             : 
     114             :       // Lagrange cubics
     115             :       // case THIRD
     116      127424 :     default:
     117      127424 :       return fe_lagrange_1D_cubic_shape(i, xi);
     118             :     }
     119             : }
     120             : 
     121             : 
     122             : 
     123             : inline
     124   115660068 : 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   115660068 :   libmesh_assert_equal_to (j, 0);
     130             : 
     131   115660068 :   libmesh_assert_less (i, 2);
     132             : 
     133  1247046286 :   switch (i)
     134             :     {
     135    57830034 :     case 0:
     136    57830034 :       return -.5;
     137             : 
     138             :     // case 1
     139   634813016 :     default:
     140   580176565 :       return .5;
     141             :     }
     142             : }
     143             : 
     144             : 
     145             : inline
     146   956036201 : 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   956036201 :   libmesh_assert_equal_to (j, 0);
     152             : 
     153   956036201 :   libmesh_assert_less (i, 3);
     154             : 
     155 12425449164 :   switch (i)
     156             :     {
     157  4142862377 :     case 0:
     158  4154997567 :       return xi-.5;
     159             : 
     160  4142862377 :     case 1:
     161  4145152019 :       return xi+.5;
     162             : 
     163             :     // case 2
     164  4139724410 :     default:
     165  4186418622 :       return -2.*xi;
     166             :     }
     167             : }
     168             : 
     169             : 
     170             : inline
     171      103824 : 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        6208 :   libmesh_assert_equal_to (j, 0);
     177             : 
     178        6208 :   libmesh_assert_less (i, 4);
     179             : 
     180      103824 :   switch (i)
     181             :     {
     182       25956 :     case 0:
     183       25956 :       return -9./16.*(3.*xi*xi-2.*xi-1./9.);
     184             : 
     185       25956 :     case 1:
     186       25956 :       return -9./16.*(-3.*xi*xi-2.*xi+1./9.);
     187             : 
     188       25956 :     case 2:
     189       25956 :       return 27./16.*(3.*xi*xi-2./3.*xi-1.);
     190             : 
     191             :     // case 3
     192       25956 :     default:
     193       25956 :       return 27./16.*(-3.*xi*xi-2./3.*xi+1.);
     194             :     }
     195             : }
     196             : 
     197             : 
     198             : 
     199             : inline
     200   359179663 : 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    28710939 :   libmesh_assert_less_equal(order, THIRD);
     206             : 
     207   359179663 :   switch (order)
     208             :     {
     209    21786284 :     case FIRST:
     210    21786284 :       return fe_lagrange_1D_linear_shape_deriv(i, j, xi);
     211             : 
     212     6918447 :     case SECOND:
     213     6918447 :       return fe_lagrange_1D_quadratic_shape_deriv(i, j, xi);
     214             : 
     215             :     // case THIRD
     216      103824 :     default:
     217      103824 :       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    35561225 : 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    35561225 :   libmesh_assert_equal_to (j, 0);
     235    35561225 :   libmesh_assert_less(i, 3);
     236             : 
     237   503512755 :   switch (i)
     238             :     {
     239    11740345 :     case 0:
     240    11740345 :       return 1.;
     241             : 
     242    11740345 :     case 1:
     243    11740345 :       return 1.;
     244             : 
     245             :     // case 2
     246   167591405 :     default:
     247   156627110 :       return -2.;
     248             :     }
     249             : }
     250             : 
     251             : 
     252             : inline
     253       12056 : 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        1096 :   libmesh_assert_equal_to (j, 0);
     260        1096 :   libmesh_assert_less(i, 4);
     261             : 
     262       12056 :   switch (i)
     263             :     {
     264        3014 :     case 0:
     265        3014 :       return -9./16.*(6.*xi-2);
     266             : 
     267        3014 :     case 1:
     268        3014 :       return -9./16.*(-6*xi-2.);
     269             : 
     270        3014 :     case 2:
     271        3014 :       return 27./16.*(6*xi-2./3.);
     272             : 
     273             :     // case 2
     274        3014 :     default:
     275        3014 :       return 27./16.*(-6*xi-2./3.);
     276             :     }
     277             : }
     278             : 
     279             : 
     280             : 
     281             : inline
     282     1519214 : 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       98599 :   libmesh_assert_less_equal(order, THIRD);
     288             : 
     289     1616997 :   switch (order)
     290             :     {
     291             :     // All second derivatives of linears are zero....
     292       13068 :     case FIRST:
     293       13068 :       return 0.;
     294             : 
     295       84435 :     case SECOND:
     296       84435 :       return fe_lagrange_1D_quadratic_shape_second_deriv(i, j, xi);
     297             : 
     298             :     // case THIRD
     299       13152 :     default:
     300       13152 :       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

Generated by: LCOV version 1.14