[COLOR=#a020f0]program[/color] measurement_interpolation
[COLOR=#2e8b57][b]implicit[/b][/color] [COLOR=#2e8b57][b]none[/b][/color]
[COLOR=#2e8b57][b]character[/b][/color]([COLOR=#ff00ff]30[/color]) :: fname
[COLOR=#2e8b57][b]integer[/b][/color] :: i, nr_lines, nr_elements, stat
[COLOR=#2e8b57][b]real[/b][/color] :: dummy, x0, y0, linear_interpolation
[COLOR=#2e8b57][b]real[/b][/color], [COLOR=#2e8b57][b]allocatable[/b][/color] :: x(:), y(:)
fname[COLOR=#804040][b]=[/b][/color] [COLOR=#ff00ff]'measurement.dat'[/color]
[COLOR=#804040][b]open[/b][/color]([COLOR=#ff00ff]1[/color],[COLOR=#804040][b]file[/b][/color][COLOR=#804040][b]=[/b][/color]fname,[COLOR=#804040][b]status[/b][/color][COLOR=#804040][b]=[/b][/color][COLOR=#ff00ff]'old'[/color],[COLOR=#804040][b]iostat[/b][/color][COLOR=#804040][b]=[/b][/color]stat)
[COLOR=#804040][b]if[/b][/color] (stat [COLOR=#804040][b].ne.[/b][/color] [COLOR=#ff00ff]0[/color]) [COLOR=#804040][b]then[/b][/color]
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) fname, [COLOR=#ff00ff]' cannot be opened !'[/color]
[COLOR=#804040][b]go to[/b][/color] [COLOR=#ff00ff]20[/color]
[COLOR=#804040][b]end if[/b][/color]
[COLOR=#0000ff]! count number of lines in the file[/color]
nr_lines [COLOR=#804040][b]=[/b][/color] [COLOR=#ff00ff]0[/color]
[COLOR=#804040][b]do[/b][/color]
[COLOR=#804040][b]read[/b][/color]([COLOR=#ff00ff]1[/color],[COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]end[/b][/color][COLOR=#804040][b]=[/b][/color][COLOR=#804040][b]10[/b][/color],[COLOR=#804040][b]err[/b][/color][COLOR=#804040][b]=[/b][/color][COLOR=#804040][b]20[/b][/color]) dummy
nr_lines [COLOR=#804040][b]=[/b][/color] nr_lines [COLOR=#804040][b]+[/b][/color] [COLOR=#ff00ff]1[/color]
[COLOR=#804040][b]end do[/b][/color]
[COLOR=#0000ff]! rewind back to the beginning of the file for unit=1[/color]
[COLOR=#6a5acd]10[/color] [COLOR=#804040][b]rewind[/b][/color]([COLOR=#ff00ff]1[/color])
[COLOR=#0000ff]! number of array elements = number of data lines in the file[/color]
nr_elements[COLOR=#804040][b]=[/b][/color]nr_lines
[COLOR=#0000ff]! allocate the arrays of given size [/color]
[COLOR=#804040][b]allocate[/b][/color] (x(nr_elements))
[COLOR=#804040][b]allocate[/b][/color] (y(nr_elements))
[COLOR=#0000ff]! read array elements from the file[/color]
[COLOR=#804040][b]do[/b][/color] i [COLOR=#804040][b]=[/b][/color] [COLOR=#ff00ff]1[/color], nr_elements
[COLOR=#804040][b]read[/b][/color]([COLOR=#ff00ff]1[/color],[COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]err[/b][/color][COLOR=#804040][b]=[/b][/color][COLOR=#804040][b]20[/b][/color]) x(i),y(i)
[COLOR=#804040][b]end do[/b][/color]
[COLOR=#804040][b]close[/b][/color]([COLOR=#ff00ff]1[/color])
[COLOR=#0000ff]! print reading results [/color]
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'number of data lines in the file ='[/color], nr_lines
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color])
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'x-values: '[/color]
[COLOR=#a020f0]call[/color] print_array([COLOR=#ff00ff]'x'[/color], x, nr_elements)
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color])
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'y-values: '[/color]
[COLOR=#a020f0]call[/color] print_array([COLOR=#ff00ff]'y'[/color], y, nr_elements)
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color])
[COLOR=#0000ff]! compute the interpolated function value[/color]
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'Enter x0 = '[/color]
[COLOR=#804040][b]read[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) x0
[COLOR=#804040][b]if[/b][/color] ((x0 [COLOR=#804040][b].ge.[/b][/color] x([COLOR=#ff00ff]1[/color])) [COLOR=#804040][b].and.[/b][/color] (x0 [COLOR=#804040][b].le.[/b][/color] x(nr_elements))) [COLOR=#804040][b]then[/b][/color]
y0[COLOR=#804040][b]=[/b][/color]linear_interpolation(x, y, nr_elements, x0)
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'The interpolated value f('[/color],x0, [COLOR=#ff00ff]') = '[/color], y0
[COLOR=#804040][b]else[/b][/color]
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'x0 ='[/color],x0, [highlight #ffff00][COLOR=#0000ff]&[/color][/highlight]
[COLOR=#ff00ff]' is out of range <'[/color], x([COLOR=#ff00ff]1[/color]),[COLOR=#ff00ff]','[/color],x(nr_elements),[COLOR=#ff00ff]'>'[/color]
[COLOR=#804040][b]end if[/b][/color]
[COLOR=#0000ff]!!![/color]
[COLOR=#804040][b]stop[/b][/color]
[COLOR=#6a5acd]20[/color] [COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color])[COLOR=#ff00ff]'I/O error reading file !'[/color]
[COLOR=#a020f0]end program[/color] measurement_interpolation
[COLOR=#0000ff]! ************** Functions/Procedures **************[/color]
[COLOR=#a020f0]subroutine[/color] print_array(array_name, array, n)
[COLOR=#2e8b57][b]implicit[/b][/color] [COLOR=#2e8b57][b]none[/b][/color]
[COLOR=#2e8b57][b]integer[/b][/color] :: n, i
[COLOR=#2e8b57][b] real[/b][/color] :: array(n)
[COLOR=#2e8b57][b]character[/b][/color] :: array_name
[COLOR=#804040][b]do[/b][/color] i [COLOR=#804040][b]=[/b][/color] [COLOR=#ff00ff]1[/color], n
[COLOR=#804040][b]write[/b][/color] ([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) array_name, [COLOR=#ff00ff]'['[/color], i, [COLOR=#ff00ff]'] = '[/color], array(i)
[COLOR=#804040][b]end do[/b][/color]
[COLOR=#a020f0]end subroutine[/color] print_array
[COLOR=#2e8b57][b]real[/b][/color] [COLOR=#a020f0]function[/color] linear_interpolation(x, y, n, x0)
[COLOR=#2e8b57][b]implicit[/b][/color] [COLOR=#2e8b57][b]none[/b][/color]
[COLOR=#2e8b57][b]integer[/b][/color] :: n, i, k
[COLOR=#2e8b57][b] real[/b][/color] :: x(n), y(n), x0, y0
k [COLOR=#804040][b]=[/b][/color] [COLOR=#ff00ff]0[/color]
[COLOR=#804040][b]do[/b][/color] i [COLOR=#804040][b]=[/b][/color] [COLOR=#ff00ff]1[/color], n[COLOR=#804040][b]-[/b][/color][COLOR=#ff00ff]1[/color]
[COLOR=#804040][b]if[/b][/color] ((x0 [COLOR=#804040][b]>=[/b][/color] x(i)) [COLOR=#804040][b].and.[/b][/color] (x0 [COLOR=#804040][b]<=[/b][/color] x(i[COLOR=#804040][b]+[/b][/color][COLOR=#ff00ff]1[/color]))) [COLOR=#804040][b]then[/b][/color]
[COLOR=#0000ff]! k is the index where: x(k) <= x <= x(k+1) [/color]
k [COLOR=#804040][b]=[/b][/color] i
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'k ='[/color], k, [COLOR=#ff00ff]': x0 ='[/color],x0, [highlight #ffff00][COLOR=#0000ff]&[/color][/highlight]
[COLOR=#ff00ff]'is from interval <x('[/color],k,[COLOR=#ff00ff]'), x('[/color],k[COLOR=#804040][b]+[/b][/color][COLOR=#ff00ff]1[/color],[COLOR=#ff00ff]')> = <'[/color], [highlight #ffff00][COLOR=#0000ff]&[/color][/highlight]
x(k),[COLOR=#ff00ff]','[/color],x(k[COLOR=#804040][b]+[/b][/color][COLOR=#ff00ff]1[/color]),[COLOR=#ff00ff]'>'[/color]
[COLOR=#804040][b]exit[/b][/color] [COLOR=#0000ff]! exit loop[/color]
[COLOR=#804040][b]end if[/b][/color]
[COLOR=#804040][b]end do[/b][/color]
[COLOR=#804040][b]if[/b][/color] (k [COLOR=#804040][b]>[/b][/color] [COLOR=#ff00ff]0[/color]) [COLOR=#804040][b]then[/b][/color]
[COLOR=#0000ff]! compute the interpolated value[/color]
y0 [COLOR=#804040][b]=[/b][/color] y(k) [COLOR=#804040][b]+[/b][/color] (y(k[COLOR=#804040][b]+[/b][/color][COLOR=#ff00ff]1[/color])[COLOR=#804040][b]-[/b][/color]y(k))[COLOR=#804040][b]/[/b][/color](x(k[COLOR=#804040][b]+[/b][/color][COLOR=#ff00ff]1[/color])[COLOR=#804040][b]-[/b][/color]x(k))[COLOR=#804040][b]*[/b][/color](x0[COLOR=#804040][b]-[/b][/color]x(k))
[COLOR=#804040][b]else[/b][/color]
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color])[COLOR=#ff00ff]'Error computing the interpolation !!!'[/color]
[COLOR=#804040][b]write[/b][/color]([COLOR=#804040][b]*[/b][/color],[COLOR=#804040][b]*[/b][/color]) [COLOR=#ff00ff]'x0 ='[/color],x0, [highlight #ffff00][COLOR=#0000ff]&[/color][/highlight]
[COLOR=#ff00ff]' is out of range <'[/color], x([COLOR=#ff00ff]1[/color]),[COLOR=#ff00ff]','[/color],x(n),[COLOR=#ff00ff]'>'[/color]
[COLOR=#804040][b]end if[/b][/color]
[COLOR=#0000ff]! return value[/color]
linear_interpolation [COLOR=#804040][b]=[/b][/color] y0
[COLOR=#a020f0]end function[/color] linear_interpolation