3
3
use stdlib_functions, only: legendre, dlegendre
4
4
implicit none
5
5
6
- real (dp), parameter :: PI = acos (- 1._dp )
6
+ real (dp), parameter :: pi = acos (- 1._dp )
7
7
real (dp), parameter :: tolerance = 4._dp * epsilon (1._dp )
8
8
integer , parameter :: newton_iters = 100
9
9
@@ -13,49 +13,52 @@ pure module subroutine gauss_legendre_fp64 (x, w, interval)
13
13
real (dp), intent (out ) :: x(:), w(:)
14
14
real (dp), intent (in ), optional :: interval(2 )
15
15
16
- associate (N = > size (x)- 1 )
17
- select case (N )
16
+ associate (n = > size (x)- 1 )
17
+ select case (n )
18
18
case (0 )
19
- x = 0._dp
20
- w = 2._dp
19
+ x = 0
20
+ w = 2
21
21
case (1 )
22
- x = [- sqrt (1._dp / 3._dp ), sqrt (1._dp / 3._dp )]
23
- w = [1._dp , 1._dp ]
22
+ x(1 ) = - sqrt (1._dp / 3._dp )
23
+ x(2 ) = - x(1 )
24
+ w = 1
24
25
case default
25
26
block
26
27
integer :: i,j
27
28
real (dp) :: leg, dleg, delta
28
29
29
- do i = 0 , int ( floor ((N +1 )/ 2._dp ) - 1 )
30
- x(i+1 ) = - cos ((2 * i+1 )/ (2._dp * N +2._dp ) * PI )
30
+ do i = 0 , (n +1 )/ 2 - 1
31
+ x(i+1 ) = - cos ((2 * i+1 )/ (2._dp * n +2._dp ) * pi )
31
32
do j = 0 , newton_iters-1
32
- leg = legendre(N +1 ,x(i+1 ))
33
- dleg = dlegendre(N +1 ,x(i+1 ))
33
+ leg = legendre(n +1 ,x(i+1 ))
34
+ dleg = dlegendre(n +1 ,x(i+1 ))
34
35
delta = - leg/ dleg
35
36
x(i+1 ) = x(i+1 ) + delta
36
37
if ( abs (delta) <= tolerance * abs (x(i+1 )) ) exit
37
38
end do
38
- x(N - i+1 ) = - x(i+1 )
39
+ x(n - i+1 ) = - x(i+1 )
39
40
40
- dleg = dlegendre(N +1 ,x(i+1 ))
41
+ dleg = dlegendre(n +1 ,x(i+1 ))
41
42
w(i+1 ) = 2._dp / ((1 - x(i+1 )** 2 )* dleg** 2 )
42
- w(N - i+1 ) = w(i+1 )
43
+ w(n - i+1 ) = w(i+1 )
43
44
end do
44
45
45
- if (mod (N ,2 ) == 0 ) then
46
- x(N / 2+1 ) = 0. 0
46
+ if (mod (n ,2 ) == 0 ) then
47
+ x(n / 2+1 ) = 0
47
48
48
- dleg = dlegendre(N +1 , 0.0_dp )
49
- w(N / 2+1 ) = 2._dp / (dleg** 2 )
49
+ dleg = dlegendre(n +1 , 0.0_dp )
50
+ w(n / 2+1 ) = 2._dp / (dleg** 2 )
50
51
end if
51
52
end block
52
53
end select
53
54
end associate
54
55
55
56
if (present (interval)) then
56
57
associate ( a = > interval(1 ) , b = > interval(2 ) )
57
- x = 0.5 * (b- a)* x+0.5 * (b+ a)
58
- w = 0.5 * (b- a)* w
58
+ x = 0.5_dp * (b- a)* x+0.5_dp * (b+ a)
59
+ x(1 ) = interval(1 )
60
+ x(size (x)) = interval(2 )
61
+ w = 0.5_dp * (b- a)* w
59
62
end associate
60
63
end if
61
64
end subroutine
@@ -64,51 +67,54 @@ pure module subroutine gauss_legendre_lobatto_fp64 (x, w, interval)
64
67
real (dp), intent (out ) :: x(:), w(:)
65
68
real (dp), intent (in ), optional :: interval(2 )
66
69
67
- associate (N = > size (x)- 1 )
68
- select case (N )
70
+ associate (n = > size (x)- 1 )
71
+ select case (n )
69
72
case (1 )
70
- x = [- 1._dp , 1._dp ]
71
- w = [ 1._dp , 1._dp ]
73
+ x(1 ) = - 1
74
+ x(2 ) = 1
75
+ w = 1
72
76
case default
73
77
block
74
78
integer :: i,j
75
79
real (dp) :: leg, dleg, delta
76
80
77
81
x(1 ) = - 1._dp
78
- x(N +1 ) = 1._dp
79
- w(1 ) = 2._dp / (N * (N +1._dp ))
80
- w(N +1 ) = 2._dp / (N * (N +1._dp ))
82
+ x(n +1 ) = 1._dp
83
+ w(1 ) = 2._dp / (n * (n +1._dp ))
84
+ w(n +1 ) = 2._dp / (n * (n +1._dp ))
81
85
82
- do i = 1 , int ( floor ((N +1 )/ 2._dp ) - 1 )
83
- x(i+1 ) = - cos ( (i+0.25_dp )* PI / N - 3 / (8 * N * PI * (i+0.25_dp )))
86
+ do i = 1 , (n +1 )/ 2 - 1
87
+ x(i+1 ) = - cos ( (i+0.25_dp )* pi / n - 3 / (8 * n * pi * (i+0.25_dp )))
84
88
do j = 0 , newton_iters-1
85
- leg = legendre(N +1 ,x(i+1 )) - legendre(N -1 ,x(i+1 ))
86
- dleg = dlegendre(N +1 ,x(i+1 )) - dlegendre(N -1 ,x(i+1 ))
89
+ leg = legendre(n +1 ,x(i+1 )) - legendre(n -1 ,x(i+1 ))
90
+ dleg = dlegendre(n +1 ,x(i+1 )) - dlegendre(n -1 ,x(i+1 ))
87
91
delta = - leg/ dleg
88
92
x(i+1 ) = x(i+1 ) + delta
89
93
if ( abs (delta) <= tolerance * abs (x(i+1 )) ) exit
90
94
end do
91
- x(N - i+1 ) = - x(i+1 )
95
+ x(n - i+1 ) = - x(i+1 )
92
96
93
- leg = legendre(N , x(i+1 ))
94
- w(i+1 ) = 2._dp / (N * (N +1._dp )* leg** 2 )
95
- w(N - i+1 ) = w(i+1 )
97
+ leg = legendre(n , x(i+1 ))
98
+ w(i+1 ) = 2._dp / (n * (n +1._dp )* leg** 2 )
99
+ w(n - i+1 ) = w(i+1 )
96
100
end do
97
101
98
- if (mod (N ,2 ) == 0 ) then
99
- x(N / 2+1 ) = 0. 0
102
+ if (mod (n ,2 ) == 0 ) then
103
+ x(n / 2+1 ) = 0
100
104
101
- leg = legendre(N , 0.0_dp )
102
- w(N / 2+1 ) = 2._dp / (N * (N +1._dp )* leg** 2 )
105
+ leg = legendre(n , 0.0_dp )
106
+ w(n / 2+1 ) = 2._dp / (n * (n +1._dp )* leg** 2 )
103
107
end if
104
108
end block
105
109
end select
106
110
end associate
107
111
108
112
if (present (interval)) then
109
113
associate ( a = > interval(1 ) , b = > interval(2 ) )
110
- x = 0.5 * (b- a)* x+0.5 * (b+ a)
111
- w = 0.5 * (b- a)* w
114
+ x = 0.5_dp * (b- a)* x+0.5_dp * (b+ a)
115
+ x(1 ) = interval(1 )
116
+ x(size (x)) = interval(2 )
117
+ w = 0.5_dp * (b- a)* w
112
118
end associate
113
119
end if
114
120
end subroutine
0 commit comments