INTERPOLATION DEMONSTRATION
This code demonstrates interpolation of pressure coefficient data in a file to specific locations along an airfoil. Different interpolation methods are demonstrated.
PROGRAM Interpolation IMPLICIT NONE REAL, DIMENSION(:), ALLOCATABLE :: x, Cp !Define locations in which we wish to interpolate for !Column 1: x values !Column 2: Linearly interpolated Cp values !Column 3: Newton interpolated Cp values REAL, DIMENSION(14, 3) :: upper REAL, DIMENSION(11, 3) :: lower REAL, DIMENSION(2, 2) :: line REAL, DIMENSION(4, 2) :: poly INTEGER :: i, j, ierr1, ierr2 REAL :: a, b CHARACTER(LEN=50) :: myfile upper(1:14, 1) = (/ .02, .1, .15, .2, .25, .3, .35, .4, .5, .6, .7, .8, .9, .92 /) upper(1:14, 2:3) = 0 lower(1:11, 1) = (/ .04, .075, .125, .2, .32, .44, .5, .6, .75, .85, .92 /) lower(1:11, 2:3) = 0 !Explain program WRITE(*,*) ’This program takes in given data describing position and Cp’ WRITE(*,*) ’on an airfoil and interpolates the remaining data.’ WRITE(*,*) ’The output is separated into upper and lower divisions,’ WRITE(*,*) ’Showing the locations of interpolation, as well as the corresponding’ WRITE(*,*) ’linear and Newton-Raphson Cp values.’ WRITE(*,*) ’’ !Read in filename, later to be changed for user input !WRITE(*,*) ’Please input name of file currently on the server (including extension).’ !READ(*,*) myfile myfile = ’data_cfd.dat’ Call readFile !Read through lower data first DO i=1,SIZE(lower,1),1 !Cycle through each X in the array !For each X, find the appropriate location in the experimental data DO j = 2,(SIZE(x)/2),1 a = lower(i,1) - x(j) b = lower(i,1) - x(j-1) IF (SIGN(a,b) == -a .OR. SIGN(a,b) == 0) THEN !The SIGN checks to see if the x value falls in betweent two line(1:2,1) = x((j-1):j) line(1:2,2) = Cp((j-1):j) Call linearForm(line, i, ’lower’) poly(1:4,1) = x((j):(j+3)) poly(1:4,2) = Cp((j):(j+3)) Call newtonForm(poly, i, ’lower’) EXIT ELSEIF (SIGN(a,b) == 0) THEN !Just in case the point is already in existence lower(i, 2) = Cp(j-1) !j-1 because sign = 0 when b is exact ELSEIF (j == SIZE(x)/2) THEN WRITE (*,*) ’This data point requires extrapolation.’ ENDIF ENDDO ENDDO !Read through upper data DO i=1,SIZE(upper,1),1 !Cycle through each X in the array !For each X, find the appropriate location in the experimental data DO j = (SIZE(x)/2 + 2), SIZE(x), 1 a = upper(i,1) - x(j) b = upper(i,1) - x(j-1) IF (SIGN(a,b) == -a .OR. SIGN(a,b) == 0) THEN !The SIGN checks to see if the x value falls in betweent two line(1:2,1) = x((j-1):j) line(1:2,2) = Cp((j-1):j) Call linearForm(line, i, ’upper’) poly(1:4,1) = x((j):(j+2)) poly(1:4,2) = Cp((j):(j+3)) Call newtonForm(poly, i, ’upper’) EXIT ELSEIF (SIGN(a,b) == 0) THEN !Just in case the point is already in existence upper(i, 2) = Cp(j-1) !j-1 because sign = 0 when b is exact ELSEIF (j == SIZE(x)/2) THEN WRITE (*,*) ’This data point requires extrapolation.’ ENDIF ENDDO ENDDO
Next Page →
Next Page →