1+ ! *****************************************************************************************
2+ ! >
3+ ! Units test for splpak.
4+ ! Test a linear function
5+
6+ program splpak_test_linesr
7+
8+ use splpak_module, wp = > splpak_wp
9+ use iso_fortran_env
10+ use pyplot_module
11+
12+ implicit none
13+
14+ integer ,parameter :: ndim = 1 ! ! 1d problem
15+ integer ,parameter :: nxdata = 20 ! ! number of points in x
16+ integer ,dimension (ndim),parameter :: nodes = [10 ]
17+ integer ,parameter :: ncol = product (nodes)
18+ integer ,parameter :: nwrk = ncol* (ncol+1 ) + 1 ! is doc wrong? do we need the + 1 (otherwise, it fails)...
19+ integer ,parameter :: ncf = ncol
20+ integer ,parameter :: nxdata_est = 100 ! ! number of points for estimate plot
21+
22+ real (wp),dimension (ndim,nxdata) :: xdata
23+ real (wp),dimension (nxdata) :: ydata
24+ real (wp),dimension (ndim) :: xmin
25+ real (wp),dimension (ndim) :: xmax
26+ real (wp),dimension (nwrk) :: work
27+ real (wp),dimension (ncf) :: coef
28+ real (wp),dimension (nxdata) :: wdata ! ! weights
29+ real (wp),dimension (nxdata_est) :: xdata_est, ydata_est
30+ real (wp),dimension (ndim) :: x
31+
32+ integer :: ierror, istat
33+ integer :: i ! ! counter
34+ real (wp) :: xtrap
35+ real (wp) :: tru, err, errmax, f, fleft, fright
36+ type (pyplot) :: plt
37+ character (len= 10 ) :: nodes_str ! ! string version of `nodes`
38+ type (splpak_type) :: solver, solver2
39+ integer ,dimension (2 ),parameter :: figsize = [20 ,10 ] ! ! figure size for plot
40+
41+ xtrap = 1.0_wp
42+ xmin(1 ) = 0.0_wp
43+ xmax(1 ) = 1.0_wp
44+ do i= 1 ,nxdata
45+ wdata(i) = 1.0_wp ! weight
46+ xdata(1 ,i) = real (i-1 ,wp)/ real (nxdata-1 ,wp)
47+ ydata(i) = f1(xdata(1 ,i))
48+ end do
49+
50+ ! write(*,'(a,*(f8.3,","))') 'xdata = ', xdata
51+ ! write(*,'(a,*(f8.3,","))') 'ydata = ', ydata
52+
53+ ! initialize:
54+ call solver% initialize(1 ,xdata,1 ,ydata,wdata,nxdata,xmin,xmax, &
55+ nodes,xtrap,coef,ncf,work,nwrk,ierror)
56+
57+ write (* ,* ) ' splcw ierror = ' , ierror
58+ if (ierror /= 0 ) error stop ' error calling splcw'
59+
60+ ! compute max error at interpolation points
61+ errmax = 0.0_wp
62+ do i= 1 ,nxdata_est
63+ xdata_est(i) = real (i-1 ,wp)/ nxdata_est
64+ x(1 ) = xdata_est(i)
65+ f = solver% evaluate(ndim,x,coef,xmin,xmax,nodes,ierror)
66+ ydata_est(i) = f
67+ if (ierror /= 0 ) error stop ' error calling splfe'
68+ tru = f1(xdata_est(i))
69+ err = abs (tru- f)
70+ errmax = max (err,errmax)
71+ end do
72+ write (* ,* ) ' splfe errmax [linear] = ' , errmax
73+ if (abs (errmax)>1.0e-1_wp ) error stop ' errmax too large'
74+
75+ ! write(*,'(a,*(f8.3,","))') 'xdata_est = ', xdata_est
76+ ! write(*,'(a,*(f8.3,","))') 'ydata_est = ', ydata_est
77+
78+ ! test the derivatives also:
79+ fleft = solver% evaluate(ndim,[0.0_wp ],[1 ],coef,xmin,xmax,nodes,ierror)
80+ if (ierror /= 0 ) error stop ' error calling splde'
81+ errmax = fleft - 2.0_wp
82+ write (* ,* ) ' splde errmax left [linear] = ' , errmax
83+ if (abs (errmax)>1.0e-12_wp ) error stop ' errmax too large'
84+
85+ fright = solver% evaluate(ndim,[1.0_wp ],[1 ],coef,xmin,xmax,nodes,ierror)
86+ if (ierror /= 0 ) error stop ' error calling splde'
87+ errmax = fleft - 2.0_wp
88+ write (* ,* ) ' splde errmax right [linear] = ' , errmax
89+ if (abs (errmax)>1.0e-12_wp ) error stop ' errmax too large'
90+
91+ write (nodes_str,' (I10)' ) nodes(1 ); nodes_str = adjustl (nodes_str)
92+
93+ call plt% initialize(grid= .true. ,xlabel= ' x' ,ylabel= ' y' ,&
94+ figsize= figsize,font_size= 20 ,axes_labelsize= 20 ,&
95+ xtick_labelsize= 20 , ytick_labelsize= 20 ,&
96+ legend_fontsize= 20 ,&
97+ title= ' splpak_test' ,legend= .true. )
98+ call plt% add_plot(xdata(1 ,:),ydata,&
99+ label= ' Original points' ,&
100+ linestyle= ' ko' ,markersize= 5 ,linewidth= 2 ,istat= istat)
101+ call plt% add_plot(xdata_est,ydata_est,&
102+ label= ' Least squares bspline with ' // trim (nodes_str)// ' nodes' ,&
103+ linestyle= ' r-' ,markersize= 2 ,linewidth= 2 ,istat= istat)
104+ call plt% savefig(pyfile= ' splpak_test.py' , figfile= ' splpak_test_linear.png' ,istat= istat)
105+
106+ contains
107+
108+ real(wp) function f1 (x ) ! ! 1d test function
109+ implicit none
110+ real (wp) :: x
111+ f1 = 2.0_wp * x
112+ end function f1
113+
114+ end program splpak_test_linesr
0 commit comments