1 SUBROUTINE svdfit(nfitin,nlo,cutin,a0,x,y,m,b)
4 REAL(rprec) b(*), cutin
5 REAL(rprec) ,
DIMENSION(*)::a0
6 REAL(rprec) ,
POINTER :: yvals
7 REAL(rprec) ,
DIMENSION(m) :: x,y,w
8 REAL(rprec) ,
DIMENSION(:,:),
ALLOCATABLE ::
10 REAL(rprec) ,
DIMENSION(:,:),
ALLOCATABLE :: asave
11 REAL(rprec) ,
DIMENSION(:) ,
ALLOCATABLE :: ww
12 REAL(rprec) ,
DIMENSION(:) ,
ALLOCATABLE :: ys,xs
13 REAL(rprec) ,
DIMENSION(:),
ALLOCATABLE,
SAVE :: apar,apar2
14 INTEGER ,
DIMENSION(:) ,
ALLOCATABLE :: pwr
15 INTEGER :: m, n=8, mp=9, ipos=0
16 INTEGER :: nmax, nmin, i, j, nlo, nfitin
17 LOGICAL :: first=.true.
18 REAL(rprec) :: cutoff=3e-8
27 IF(nfitin.eq.0)nfitin=nmax-2
28 IF(cutin.eq.0.)cutin=cutoff
30 IF(.not.
ALLOCATED(amatrix))
ALLOCATE(amatrix(m,n-nlo))
31 IF(.not.
ALLOCATED(uu))
ALLOCATE(uu(m,n-nlo))
32 IF(.not.
ALLOCATED(pwr))
ALLOCATE(pwr(n-nlo))
33 IF(.not.
ALLOCATED(apar))
ALLOCATE(apar(n))
34 IF(.not.
ALLOCATED(apar2))
ALLOCATE(apar2(n-nlo))
35 IF(.not.
ALLOCATED(wwd))
ALLOCATE(wwd(n-nlo,n-nlo))
36 IF(.not.
ALLOCATED(ww))
ALLOCATE(ww(n-nlo))
37 IF(.not.
ALLOCATED(vv))
ALLOCATE(vv(n-nlo,n-nlo))
41 IF(nlo.ge.1)y(1:
SIZE(y))=y(1:
SIZE(y))-a0(1)
48 amatrix(i,j)=x(i)**pwr(j)
53 CALL svdcmp(uu,m,n-nlo,m,n-nlo,ww,vv)
63 IF(ww(i)/maxval(ww) .lt. cutoff) wwd(i,i)=0
66 apar2=matmul(vv,matmul(wwd,matmul(transpose(uu),y)))
67 apar(nlo+1:n)=apar2(1:n-nlo)
68 IF(nlo.ne.0)apar(1:nlo)=a0(1:nlo)
69 IF(nlo.ge.1)y(1:
SIZE(y))=y(1:
SIZE(y))+a0(1)