LCOV - code coverage report
Current view: top level - include/fe - fe_lagrange_shape_1D.h (source / functions) Hit Total Coverage
Test: libMesh/libmesh: #4286 (66ff4b) with base 03bcc7 Lines: 92 106 86.8 %
Date: 2025-10-22 02:54:50 Functions: 10 11 90.9 %
Legend: Lines: hit not hit

          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

Generated by: LCOV version 1.14