summaryrefslogtreecommitdiff
path: root/Utilib/src/ALDERV.f
blob: 239a396d1cf151cd9215daa862446b8504c0ea23 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
*DECK ALDERV
      SUBROUTINE ALDERV(N,X,Y)
*
*-----------------------------------------------------------------------
*
*Purpose:
* numerical derivation of an array of values using the order 4 Ceschino
* method (compatible with cubic splines).
*
*Copyright:
* Copyright (C) 1981 Ecole Polytechnique de Montreal
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version
*
*Author(s): A. Hebert
*
*Parameters: input
* N       number of points.
* X       abscissas.
* Y       ordinates.
*
*Parameters: output
* Y       derivatives.
*
*-----------------------------------------------------------------------
*
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER N
      REAL X(N),Y(N)
*----
*  ALLOCATABLE ARRAYS
*----
      REAL, DIMENSION(:,:), ALLOCATABLE :: WK
*
      IF(N.LE.1) CALL XABORT('ALDERV: INVALID NUMBER OF POINTS.')
      IF(N.EQ.2) GO TO 40
      ALLOCATE(WK(2,N))
      HP=1.0/(X(2)-X(1))
      WK(1,1)=HP
      WK(2,1)=HP
      YLAST=Y(1)
      Y(1)=2.0*HP*HP*(Y(2)-Y(1))
      DO 10 I=2,N-1
      HM=HP
      HP=1.0/(X(I+1)-X(I))
      WK(1,I)=2.0*(HM+HP)
      WK(2,I)=HP
      PMX=3.0*(HM*HM*(Y(I)-YLAST)+HP*HP*(Y(I+1)-Y(I)))
      YLAST=Y(I)
      Y(I)=PMX
   10 CONTINUE
      HM=HP
      WK(1,N)=HM
      WK(2,N)=HM
      Y(N)=2.0*HM*HM*(Y(N)-YLAST)
*
* FORWARD ELIMINATION.
      PMX=WK(1,1)
      Y(1)=Y(1)/PMX
      DO 20 I=2,N
      GAR=WK(2,I-1)
      WK(2,I-1)=WK(2,I-1)/PMX
      PMX=WK(1,I)-GAR*WK(2,I-1)
      Y(I)=(Y(I)-GAR*Y(I-1))/PMX
   20 CONTINUE
*
* BACK SUBSTITUTION.
      DO 30 I=N-1,1,-1
      Y(I)=Y(I)-WK(2,I)*Y(I+1)
   30 CONTINUE
      DEALLOCATE(WK)
      RETURN
*
   40 Y(1)=(Y(2)-Y(1))/(X(2)-X(1))
      Y(2)=Y(1)
      RETURN
      END