1
C...GETISSUD performs an interpolation/extrapolation in 3 dimensions by
2
C...fitting quadratic splines using 4 points in each dimension
3
double precision function getissud(ibeam,kfl,x1,x2,pt2)
10
double precision x1,x2,pt2
11
c Storing values for the interpolation
12
double precision smallgrid(4,4),minigrid(4) ! pt2,x1
14
integer ipt2,ix1,ix2,ilo,ihi,i,j,k,kkfl,ipoints
15
double precision pt2i,x2i,x1i,minpoint,maxpoint,x(3)
26
if(ibeam.lt.0) kkfl=-kkfl
27
if(kkfl.lt.-2) kkfl=iabs(kfl)
28
if(iabs(kkfl).eq.21) kkfl=0
36
$ write(*,*)'GETISSUD Warning: flavor ',kfl,' not supported'
42
if(x(1).lt.points(1,ipoints).or.
43
$ x(1).gt.points(nx2,ipoints).and.nerr.lt.10)
45
write(*,*) 'GETISSUD Warning: extrapolation in x2: ',x2
49
if(x(2).lt.points(nx2+1,ipoints).or.
50
$ x(2).gt.points(nx2+nx1,ipoints)
51
$ .and.nerr.lt.10) then
52
write(*,*) 'GETISSUD Warning: extrapolation in x1: ',x1
56
if(kkfl.eq.5.and.pt2.lt.22.3109)then
61
if(kkfl.eq.5.and.x1.gt.0.6)then
66
if(x(3).lt.points(nx2+nx1+1,ipoints)) then
67
write(*,*) 'GETISSUD Error! pt2 = ',exp(x(3)),' < ',
68
$ exp(points(nx2+nx1+1,ipoints)),' = min(pt2). Not allowed!'
69
write(*,*) 'You need to regenerate grid with new pt2min.'
73
if(x(3).lt.points(nx2+nx1+1,ipoints).or.
74
$ x(3).gt.points(nx2+nx1+npt2,ipoints)
75
$ .and.nerr.lt.10) then
76
write(*,*) 'GETISSUD Warning: extrapolation in pt2: ',pt2
81
c Find nearest points by binary method
85
do while(ihi.gt.ilo+1)
87
if(x(1).gt.points(ix2,ipoints))then
93
if(x(1).lt.points(ix2,ipoints))
95
ix2=max(2,min(ix2,nx2-2))
97
c print *,'x2: ',ix2,x(1),(points(i,ipoints),i=ix2-1,ix2+2)
102
do while(ihi.gt.ilo+1)
104
if(x(2).gt.points(nx2+ix1,ipoints))then
110
if(x(2).lt.points(nx2+ix1,ipoints))
112
ix1=max(2,min(ix1,nx1-2))
114
do while(kkfl.eq.5.and.
115
$ points(nx2+ix1+2,ipoints).gt.0.6)
119
c print *,'x1: ',ix1,x(2),(points(nx2+i,ipoints),i=ix1-1,ix1+2)
124
do while(ihi.gt.ilo+1)
126
if(x(3).gt.points(nx2+nx1+ipt2,ipoints))then
132
if(x(3).lt.points(nx2+nx1+ipt2,ipoints))
134
ipt2=max(2,min(ipt2,npt2-2))
136
do while(kkfl.eq.5.and.
137
$ exp(points(nx2+nx1+ipt2-1,ipoints)).lt.22.3109)
140
c print *,'pt2: ',ipt2,x(3),(points(nx2+nx1+i,ipoints),i=ipt2-1,ipt2+2)
141
c print *,'pt: ',ipt2,exp(x(3)/2),
142
c $ (exp(points(nx2+nx1+i,ipoints)/2),i=ipt2-1,ipt2+2)
144
C Now perform inter-/extra-polation
146
C Start with x2, which should have the flattest distribution
147
C Calculate sud(x2,ax1,apt2) for the 4x4 apt2 and ax1
148
C Then continue with pt2 and calculate sud(x2,ax1,pt2)
150
C Finally calculate sud(x2,x1,pt2)
154
c print *,'x1,pt:',points(nx2+ix1-2+i,ipoints),
155
c $ exp(points(nx2+nx1+ipt2-2+j,ipoints)/2)
156
call splint2(sudgrid(ix2-1,ix1-2+i,ipt2-2+j,kkfl),
157
$ points(ix2-1,ipoints),4,x(1),smallgrid(j,i))
158
smallgrid(j,i)=max(0d0,min(1d0,smallgrid(j,i)))
163
call splint2(smallgrid(1,i),
164
$ points(nx2+nx1+ipt2-1,ipoints),4,x(3),minigrid(i))
165
minigrid(i)=max(0d0,min(1d0,minigrid(i)))
168
call splint2(minigrid,
169
$ points(nx2+ix1-1,ipoints),4,x(2),getissud)
170
getissud=max(0d0,min(1d0,getissud))
172
c print *,'Result: ',getissud
178
subroutine splint2(ypoints,xpoints,npoints,x,ans)
183
double precision ypoints(npoints),xpoints(npoints)
184
double precision x,ans
186
double precision a0,a1,a2,sd
189
CALL DLSQP2(npoints,xpoints,ypoints,a0,a1,a2,sd,ifail)
191
c print *,'Point, interpolation:'
193
c print *,exp(xpoints(i)),ypoints(i),
194
c $ a0+a1*xpoints(i)+a2*xpoints(i)**2