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