Update to Bicubic Interpolation Code (TOMS 760)
June 21, 2015
Dr. Antony Lewis spotted a typo in the Fortran 90 translation of
TOMS algorithm 760. The file in question (toms760.f90
) is part
of the archive of Alan Miller’s Fortran Software that I host.
Although I do not actively maintain Alan’s collection of algorithms,
in this case I verified that the definition of the matrix idlt
in
the previous Fortran 90 version did not correspond to the original
Fortran 77 implementation. As Dr. Lewis noted in his email to me, this
is a simple Fortran column-major ordering mistake.
That is to say, the following definitions of idlt
are not
equivalent:
integer :: idlt(3,4)
data :: ((idlt(i,j),j=1,4),i=1,3) / -3, -2, -1, 1, -2, -1, 1, 2, -1, 1, 2, 3 /
and
integer :: idlt(3,4) = reshape( (/ -3, -2, -1, 1, -2,-1, 1, 2, -1, 1, 2, 3 /), (/ 3, 4 /) )
The updated version of the file is here. If you’d like to patch your local copy, this is the diff output:
diff --git a/mirror/amiller/toms760.f90 b/mirror/amiller/toms760.f90
index 970f453..24e9d80 100644
--- a/mirror/amiller/toms760.f90
+++ b/mirror/amiller/toms760.f90
@@ -17,6 +17,9 @@ SUBROUTINE rgbi3p(md, nxd, nyd, xd, yd, zd, nip, xi, yi, zi, ier)
! Code converted using TO_F90 by Alan Miller
! Date: 2003-06-11 Time: 10:11:03
+! Typo in definition of IDLT in SUBROUTINE RGPD3P fixed by Jason Blevins
+! Date: 2015-06-21 Time: 00:22:26
+
! Rectangular-grid bivariate interpolation
! (a master subroutine of the RGBI3P/RGSF3P subroutine package)
@@ -472,7 +475,7 @@ REAL :: b00xa(4), b00ya(4), b01a(4), b10a(4), cxa(3,4), cya(3,4), &
! Data statements
! DATA ((idlt(jxy,jpexy),jpexy=1,4),jxy=1,3)/-3,-2,-1,1,-2,-1,1,2,-1,1,2,3/
INTEGER, SAVE :: idlt(3,4) = RESHAPE( &
- (/ -3,-2,-1, 1,-2,-1, 1,2,-1, 1,2,3 /), (/ 3, 4 /) )
+ (/ -3,-2,-1, -2,-1,1, -1,1,2, 1,2,3 /), (/ 3, 4 /) )
! ..
! Calculation