V3FIT
rayatt.f
1  SUBROUTINE rayatt(x,nw,y,nh,cspln,nxd,dx,dy,xaxd,yaxd,psiaxd,
2  $ xmin,xmax,ymin,ymax,psivl,thet,xc,yc,pds,ifail)
3  USE precision
4  IMPLICIT NONE
5  INTEGER :: nw,nh,nxd
6  REAL(rprec) :: x(nw),y(nh),cspln(2,nxd,1),dx,dy,xaxd,yaxd,psiaxd
7  REAL(rprec) :: xmin,xmax,ymin,ymax
8  REAL(rprec) :: psivl,thet,xc,yc,pds(6)
9  INTEGER IFail
10 c...........................................................................
11  INTEGER, PARAMETER :: kmax=129, nmax=20
12  REAL(rprec), PARAMETER :: rndoff0=1.e-9
13  REAL(rprec), PARAMETER :: serrt=1.e-9 ,serrs=10.*serrt
14  INTEGER :: izone,iflag,kountr,newti,ier
15  REAL(rprec) :: pi, COSt, SINt, sgn
16  REAL(rprec) :: a, bincp, x1, y1, x2, y2, psi1, psi2
17  REAL(rprec) :: xn,yn,delx,dely,serr,xnorm,pnorm,dpsi,dpsids,rndoff
18  REAL(rprec) :: rangex,rangey,dum
19  data dum/0./
20 c
21  pi = 4*atan(1._dbl)
22  cost=cos(thet)
23  sint=sin(thet)
24  izone=int(2*thet/pi+sign(0.5_dbl,thet))
25  iflag=mod(izone,2)
26 c
27  IF (iflag .eq. 0)then
28  a=sint/cost
29  bincp=yaxd-a*xaxd
30  sgn=sign(1._dbl,cost)
31  ELSE
32  a=cost/sint
33  bincp=xaxd-a*yaxd
34  sgn=sign(1._dbl,sint)
35  ENDIF
36 c
37 c DO the sliding window search
38  x1=xaxd
39  y1=yaxd
40  psi1=psiaxd
41  DO kountr=1,kmax
42  IF (iflag .eq. 0)then
43  x2=x1+sgn*dx
44  y2=a*x2+bincp
45  ELSE
46  y2=y1+sgn*dy
47  x2=a*y2+bincp
48  ENDIF
49  rangex=(x2-xmin)*(x2-xmax)
50  rangey=(y2-ymin)*(y2-ymax)
51  IF (rangex .gt. 0. .or. rangey .gt. 0.)then
52  ifail=1
53  CALL errray1(1,psivl,thet,x2,y2,dum,dum,dum) ! terminates execution
54  ENDIF
55 c CALL dbcevl2(x,nw,y,nh,cspln,nxd,x2,y2,pds,ier,1)
56 c CALL bcsplINT(x,nw,y,nh,nxd,cspln,x2,y2,pds,1,ier)
57  CALL bcsplint(x,y,cspln,nw,nh,nxd,x2,y2,pds,1,ier)
58  psi2=pds(1)
59  IF ((psivl-psi1)*(psivl-psi2) .le. 0.)go to 10
60  x1=x2
61  y1=y2
62  psi1=psi2
63  ENDdo
64  ifail=2
65  CALL errray1(2,psivl,thet,x2,y2,dum,dum,dum) ! terminates execution
66  10 CONTINUE ! DOne with sliding search
67 c
68  xnorm=sqrt(xmax*xmax+xmin*xmin+ymax*ymax+ymin*ymin)
69  pnorm=abs(psi1)+abs(psi2)
70  rndoff=rndoff0*(pnorm/xnorm)
71  IF (iflag .eq. 0)then
72  xn=x1+0.5*sgn*dx
73  yn=a*xn+bincp
74  ELSE
75  yn=y1+0.5*sgn*dy
76  xn=a*yn+bincp
77  ENDIF
78  DO newti=1,nmax
79 c CALL dbcevl2(x,nw,y,nh,cspln,nxd,xn,yn,pds,ier,3)
80  CALL bcsplint(x,y,cspln,nw,nh,nxd,xn,yn,pds,3,ier)
81  dpsids=pds(2)*cost+pds(3)*sint
82  dpsi=pds(1)-psivl
83  IF (abs(dpsids) .gt. rndoff)then
84  serr=-dpsi/dpsids
85  ELSE
86  serr=-dpsi/rndoff
87  ENDIF
88  IF (abs(serr) .lt. serrt)go to 20
89  delx=serr*cost
90  dely=serr*sint
91  xn=xn+delx
92  yn=yn+dely
93  ENDdo
94  ifail=3
95  CALL errray1(3,psivl,thet,xn,yn,serr,serrt,serrs)
96  20 CONTINUE
97  xc=xn
98  yc=yn
99  ifail=0
100 c WRITE (3,'(2e15.6,2i5)')psivl,thet,kountr,newti
101 c
102  RETURN
103  END