SUBROUTINE SPLIN2(X1A,X2A,YA,Y2A,M,N,X1,X2,Y) C C Module Number: C C Module Name: SPLIN2 C C Keyphrase: C ---------- C Compute bicubic spine interpolation C C Description: C ------------ C Given an M by N tabulated function YA, and tabulated independent C variables X1A (M values) and X2A (N values) and the second-derivatives C of the rows of YA in the array Y2A, this routine returns an interpolated C function value Y by bicubic interpoaltion at the interpolating point C X1, X2.. C C (From Press, William H. et al, NUMERICAL RECIPES, 1986, First Edition) C C FORTRAN Name: splin2.f C C Keywords of Accessed Files : C -------------------------- C none C C Modules Called: C --------------- C C History: C -------- C Version Date Author Description C 1.0 Sep 91 S. Hulbert Copied from NUMERICAL RECIPES C 1.2.3 Apr 93 H. Bushouse Declare and define STDOUT, STDERR C------------------------------------------------------------------------ C C INPUT: C INTEGER N,M DOUBLE PRECISION X1A(M),X2A(N),YA(M,N) C ----> two independent and one dependent C arrays DOUBLE PRECISION X1,X2 C ----> interpolating coordinates C C OUTPUT: C DOUBLE PRECISION Y2A(M,N) C ----> second derivatives DOUBLE PRECISION Y C ----> interpolated function value C------------------------------------------------------------------------------ C IRAF MEM common block C LOGICAL MEMB(1) INTEGER*2 MEMS(1) INTEGER*4 MEMI(1) INTEGER*4 MEML(1) REAL MEMR(1) DOUBLE PRECISION MEMD(1) COMPLEX MEMX(1) EQUIVALENCE (MEMB, MEMS, MEMI, MEML, MEMR, MEMD, MEMX) COMMON /MEM/ MEMD C------------------------------------------------------------------------------ INTEGER STDOUT PARAMETER (STDOUT = 1) INTEGER STDERR PARAMETER (STDERR = 2) INTEGER TYDOUB PARAMETER (TYDOUB = 7) C C LOCAL VARIABLES C INTEGER ISTATS(3) INTEGER YTMP,Y2TMP,YYTMP,I,J,K,ISTAT CHARACTER*80 CONTXT C C--------------------------------------------------------------------------- C DO 500 I = 1, 3 ISTATS(I) = 0 500 CONTINUE CALL UDMGET (M*N, TYDOUB, YTMP, ISTATS(1)) CALL UDMGET (M*N, TYDOUB, Y2TMP, ISTATS(2)) CALL UDMGET (M*N, TYDOUB, YYTMP, ISTATS(3)) DO 510 I = 1, 3 IF (ISTATS(I) .NE. 0) THEN CONTXT = 'ERROR allocating dynamic memory' GO TO 999 ENDIF 510 CONTINUE C C main C DO 100 J=1,M DO 200 K=1,N MEMD(YTMP+K-1)=YA(J,K) MEMD(Y2TMP+K-1)=Y2A(J,K) 200 CONTINUE CALL SPLINT(X2A,MEMD(YTMP),MEMD(Y2TMP),N,X2,MEMD(YYTMP+J-1)) 100 CONTINUE CALL SPLINE(X1A,MEMD(YYTMP),M,1.D30,1.D30,MEMD(Y2TMP)) CALL SPLINT(X1A,MEMD(YYTMP),MEMD(Y2TMP),M,X1,Y) C CALL UDMFRE (YTMP, TYDOUB, ISTATS(1)) CALL UDMFRE (Y2TMP, TYDOUB, ISTATS(2)) CALL UDMFRE (YYTMP, TYDOUB, ISTATS(3)) DO 520 I = 1, 3 IF (ISTATS(I) .NE. 0) THEN CONTXT = 'ERROR deallocating dynamic memory' GO TO 999 ENDIF 520 CONTINUE GO TO 1000 C 999 CALL ZMSPUT(CONTXT,STDOUT+STDERR,0,ISTAT) 1000 RETURN END