LCOV - code coverage report
Current view: top level - include/fe - fe_lagrange_shape_1D.h (source / functions) Hit Total Coverage
Test: libMesh/libmesh: #4475 (55045b) with base a68cc6 Lines: 92 106 86.8 %
Date: 2026-06-03 14:29:06 Functions: 10 11 90.9 %
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   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

Generated by: LCOV version 1.14