1!-------------------------------------------------------------------------------
2! Copyright (c) 2019 FrontISTR Commons
3! This software is released under the MIT License, see LICENSE.txt
4!-------------------------------------------------------------------------------
5!> \brief  This module contains functions for interpolation in 4 node
6!!   qudrilateral element (Langrange  interpolation)
7module shape_quad4n
8  integer, parameter, private :: kreal = kind(0.0d0)
9
10contains
11  subroutine ShapeFunc_quad4n(lcoord,func)
12    real(kind=kreal), intent(in) :: lcoord(2)
13    real(kind=kreal) :: func(4)
14    func(1) = 0.25d0*(1.d0-lcoord(1))*(1.d0-lcoord(2))
15    func(2) = 0.25d0*(1.d0+lcoord(1))*(1.d0-lcoord(2))
16    func(3) = 0.25d0*(1.d0+lcoord(1))*(1.d0+lcoord(2))
17    func(4) = 0.25d0*(1.d0-lcoord(1))*(1.d0+lcoord(2))
18  end subroutine
19
20  subroutine ShapeDeriv_quad4n(lcoord,func)
21    real(kind=kreal), intent(in) :: lcoord(2)
22    real(kind=kreal) :: func(4,2)
23    func(1,1) = -0.25d0*(1.d0-lcoord(2))
24    func(2,1) =  0.25d0*(1.d0-lcoord(2))
25    func(3,1) =  0.25d0*(1.d0+lcoord(2))
26    func(4,1) = -0.25d0*(1.d0+lcoord(2))
27
28    func(1,2) = -0.25d0*(1.d0-lcoord(1))
29    func(2,2) = -0.25d0*(1.d0+lcoord(1))
30    func(3,2) =  0.25d0*(1.d0+lcoord(1))
31    func(4,2) =  0.25d0*(1.d0-lcoord(1))
32  end subroutine
33
34  subroutine Shape2ndDeriv_quad4n(func)
35    real(kind=kreal) :: func(4,2,2)
36    func(:,1,1) = 0.d0
37    func(1,1,2) = 0.25d0
38    func(2,1,2) = -0.25d0
39    func(3,1,2) = 0.25d0
40    func(4,1,2) = -0.25d0
41
42    func(1,2,1) = 0.25d0
43    func(2,2,1) = -0.25d0
44    func(3,2,1) = 0.25d0
45    func(4,2,1) = -0.25d0
46    func(:,2,2) = 0.d0
47  end subroutine
48
49
50  ! (Gaku Hashimoto, The University of Tokyo, 2012/11/15) <
51  !####################################################################
52  subroutine NodalNaturalCoord_quad4n(nncoord)
53    !####################################################################
54
55    implicit none
56
57    !--------------------------------------------------------------------
58
59    real(kind = kreal), intent(out) :: nncoord(4, 2)
60
61    !--------------------------------------------------------------------
62
63    ! xi-coordinate at a node in a local element
64    nncoord(1, 1) = -1.0D0
65    nncoord(2, 1) =  1.0D0
66    nncoord(3, 1) =  1.0D0
67    nncoord(4, 1) = -1.0D0
68    ! eta-coordinate at a node in a local element
69    nncoord(1, 2) = -1.0D0
70    nncoord(2, 2) = -1.0D0
71    nncoord(3, 2) =  1.0D0
72    nncoord(4, 2) =  1.0D0
73
74    !--------------------------------------------------------------------
75
76    return
77
78    !####################################################################
79  end subroutine NodalNaturalCoord_quad4n
80  !####################################################################
81  ! > (Gaku Hashimoto, The University of Tokyo, 2012/11/15)
82
83
84end module
85