V3FIT
jacprod.f
1  SUBROUTINE jacprod(c, h, nots, nb)
2  USE vspline
3  IMPLICIT NONE
4 C-----------------------------------------------
5 C D u m m y A r g u m e n t s
6 C-----------------------------------------------
7  INTEGER nots, nb, jmax
8  REAL(rprec), DIMENSION(*) :: c, h
9 C-----------------------------------------------
10 C L o c a l V a r i a b l e s
11 C-----------------------------------------------
12  REAL(rprec), DIMENSION(nots) ::
13  1 aspline, bspline, dspline, dum1
14 C-----------------------------------------------
15 
16 !
17 ! THIS ROUTINE COMPUTES THE INNER PRODUCT COUT(I) = CIN(J)*JACOBIAN(J,I)
18 ! WHERE JACOBIAN(J,I) = D[G(J)]/D[F(I)]
19 ! HERE, G(J) ARE SECOND-DERIVATIVE KNOTS, F(I) FUNCTION KNOTS
20 !
21 ! COMPUTE COEFFICIENT ARRAY ELEMENTS A*X(I+1) + D*X(I) + B*X(I-1)
22 ! (TO BE SAFE, RECOMPUTE EACH TIME, SINCE IOTA, P SPLINES MAY
23 ! DIFFER FROM CALL TO CALL)
24 !
25  aspline(1) = h(1)
26  dspline(1) = 2.0*h(1)
27  aspline(2:nots-1) = h(2:nots-1)
28  bspline(2:nots-1) = h(:nots-2)
29  dspline(2:nots-1) = 2.0*(h(2:nots-1)+h(:nots-2))
30 
31  jspmin(1) = 2
32  IF (nb .eq. ideriv) jspmin(1) = 1
33  jmax = nots - 1
34  CALL tridslv(aspline,dspline,bspline,c,jspmin,jmax,0,nots,1)
35  dum1(1) = 6.0*(c(2)-c(1))/h(1)
36  dum1(2:nots) = 6.0*(c(:nots-1)-c(2:nots))/h(:nots-1)
37  c(2:nots-1) = dum1(2:nots-1) - dum1(3:nots)
38  c(1) = dum1(1)
39  c(nots) = dum1(nots)
40 
41  END SUBROUTINE jacprod