V3FIT
r8dnherm1.f
1  subroutine r8dnherm1(x,nx,fherm,ilinx,ier)
2 C
3 C create a data set for Hermite interpolation, based on simple
4 C numerical differentiation using the given grid.
5 C
6 C 1d routine
7 C
8 C input:
9 C
10 !============
11 ! idecl: explicitize implicit INTEGER declarations:
12  IMPLICIT NONE
13  INTEGER, PARAMETER :: R8=selected_real_kind(12,100)
14  INTEGER ier,ilinx,ix,ixp,ixm
15 !============
16 ! idecl: explicitize implicit REAL declarations:
17  real*8 ztol,zd
18 !============
19  integer nx ! array dimensions
20  real*8 x(nx) ! x coordinate array
21  real*8 fherm(0:1,nx) ! data/Hermite array
22 C
23 C fherm(0,i) = function value f at x(i) **on input**
24 C
25 C fherm(1,i) = derivative df/dx at x(i) **on output**
26 C
27 C addl output:
28 C ilinx=1 if x is "evenly spaced" ier=0 if no errors
29 C
30 C ** x must be strict ascending **
31 C
32 C----------------------------
33 C
34  ztol=1.0e-3_r8
35  call r8splinck(x,nx,ilinx,ztol,ier)
36  if(ier.ne.0) then
37  write(6,*) '?dnherm1: x axis not strict ascending.'
38  return
39  endif
40 C
41  do ix=1,nx
42 c
43 c x div. diffs in vicinity
44 c
45  ixp=min(nx,ix+1)
46  ixm=max(1,ix-1)
47  zd=(fherm(0,ixp)-fherm(0,ixm))/(x(ixp)-x(ixm))
48 c
49  fherm(1,ix)=zd
50  enddo
51 C
52  return
53  end