1
+ ! *****************************************************************************************
2
+ ! > author: Jacob Williams
3
+ ! date: 10/5/2015
4
+ !
5
+ ! 2D data regridding using the bspline module.
6
+
7
+ program bspline_regridding_test
8
+
9
+ use bspline_module
10
+ use ,intrinsic :: iso_fortran_env, only: wp = > real64
11
+
12
+ implicit none
13
+
14
+ integer ,parameter :: kx = 4 ! ! x bspline order
15
+ integer ,parameter :: ky = 4 ! ! y bspline order
16
+ integer ,parameter :: idx = 0 ! ! [[db2val]] input
17
+ integer ,parameter :: idy = 0 ! ! [[db2val]] input
18
+ integer ,parameter :: nx = 6 ! ! number of points in x dimension in original grid
19
+ integer ,parameter :: ny = 5 ! ! number of points in y dimension in original grid
20
+ real (wp),dimension (nx),parameter :: x = [0.0_wp ,2.0_wp ,4.0_wp ,6.0_wp ,8.0_wp ,10.0_wp ] ! ! x points in original grid
21
+ real (wp),dimension (ny),parameter :: y = [0.0_wp ,2.0_wp ,4.0_wp ,6.0_wp ,8.0_wp ] ! ! y points in original grid
22
+ integer ,parameter :: nx_new = 11 ! ! number of points in x dimension for new grid
23
+ integer ,parameter :: ny_new = 9 ! ! number of points in y dimension for new grid
24
+
25
+ real (wp),dimension (nx_new) :: x_new ! ! new grid x points
26
+ real (wp),dimension (ny_new) :: y_new ! ! new grid y points
27
+ real (wp),dimension (nx_new,ny_new) :: fcn_new ! ! new grid function evaluations
28
+ real (wp),dimension (nx+ kx) :: tx ! ! x knots
29
+ real (wp),dimension (ny+ ky) :: ty ! ! y knots
30
+ real (wp),dimension (nx,ny) :: fcn_2d ! ! original grid function evaluations
31
+ real (wp) :: val,tru,err,errmax
32
+ integer :: i,j
33
+ integer :: iflag ! ! status flag
34
+
35
+ ! function evaluations for original grid:
36
+ do i= 1 ,nx
37
+ do j= 1 ,ny
38
+ fcn_2d(i,j) = test_func(x(i),y(j))
39
+ end do
40
+ end do
41
+
42
+ ! display original data:
43
+ write (* ,* ) ' -----------------'
44
+ write (* ,* ) ' INITIAL DATA:'
45
+ write (* ,* ) ' -----------------'
46
+ write (* ,' (A/,*(F12.6,1X))' ) ' x:' , x
47
+ write (* ,* ) ' '
48
+ write (* ,' (A/,*(F12.6,1X))' ) ' y:' , y
49
+ write (* ,* ) ' '
50
+ write (* ,' (A)' ) ' fcn(x,y):'
51
+ do i= 1 ,nx
52
+ write (* ,' (5F12.6)' ) fcn_2d(i,:)
53
+ end do
54
+ write (* ,* ) ' '
55
+
56
+ ! regrid:
57
+
58
+ iflag = 0
59
+ call db2ink(x,nx,y,ny,fcn_2d,kx,ky,tx,ty,fcn_2d,iflag)
60
+ if (iflag/= 1 ) error stop ' error calling db2ink'
61
+ errmax = 0.0_wp
62
+ do i= 1 ,nx_new
63
+ x_new(i) = real (i-1 ,wp)
64
+ do j= 1 ,ny_new
65
+ y_new(j) = real (j-1 ,wp)
66
+ call db2val(x_new(i),y_new(j),idx,idy,tx,ty,nx,ny,kx,ky,fcn_2d,val,iflag)
67
+ if (iflag/= 0 ) error stop ' error calling db2val'
68
+ fcn_new(i,j) = val
69
+ tru = test_func(x_new(i),y_new(j)) ! truth value
70
+ err = abs (tru- val)
71
+ errmax = max (err,errmax)
72
+ end do
73
+ end do
74
+
75
+ ! display new grid:
76
+ write (* ,* ) ' -----------------'
77
+ write (* ,* ) ' NEW GRID:'
78
+ write (* ,* ) ' -----------------'
79
+ write (* ,' (A/,*(F12.6,1X))' ) ' x:' , x_new
80
+ write (* ,* ) ' '
81
+ write (* ,' (A/,*(F12.6,1X))' ) ' y:' , y_new
82
+ write (* ,* ) ' '
83
+ write (* ,' (A)' ) ' fcn(x,y):'
84
+ do i= 1 ,nx_new
85
+ write (* ,' (11F12.6)' ) fcn_new(i,:)
86
+ end do
87
+ write (* ,* ) ' '
88
+ write (* ,* ) ' max error:' , errmax
89
+ write (* ,* ) ' '
90
+
91
+ contains
92
+
93
+ function test_func (x ,y ) result(f)
94
+ ! ! 2d test function
95
+
96
+ implicit none
97
+
98
+ real (wp) :: f
99
+ real (wp),intent (in ) :: x,y
100
+
101
+ real (wp),parameter :: deg2rad = acos (- 1.0_wp )/ 180.0_wp ! ! degrees to radians conversion factor
102
+
103
+ f = sin (deg2rad* (x+ y))
104
+
105
+ end function test_func
106
+
107
+ end program bspline_regridding_test
0 commit comments