1 subroutine xlookup(ivec,xvec,nx,xpkg,imode,iv,dxn,hv,hiv,iwarn)
54 real,
dimension(:),
allocatable :: xuse
55 logical,
dimension(:),
allocatable :: iok
56 integer,
dimension(:),
allocatable :: imina,imaxa
63 write(6,*) .lt.
' ?? xlookup: nx2, nx=',nx
68 allocate(xuse(inum),stat=istat)
71 write(6,*)
' ?? xlookup "xuse" vector allocation failure!'
80 if(xpkg(3,4).eq.0.0)
then
84 if(xpkg(3,4).gt.2.5)
then
86 else if(xpkg(3,4).gt.1.5)
then
94 if(xpkg(2,4).ne.0.0)
then
102 if(xpkg(1,4).ge.0.0)
then
110 if(xpkg(4,4).gt.0.0)
then
112 iprev=min((nx-1),max(1,iv(ivec)))
128 if(xvec(i).lt.xpkg(1,1))
then
130 if((xpkg(1,1)-xvec(i)).gt.ztola) iwarn=iwarn+1
131 else if(xvec(i).gt.xpkg(nx,1))
then
133 if((xvec(i)-xpkg(nx,1)).gt.ztola) iwarn=iwarn+1
143 period=xpkg(nx,1)-xpkg(1,1)
145 if((xvec(i).lt.xpkg(1,1)).or.(xvec(i).gt.xpkg(nx,1)))
then
146 xuse(i)=mod(xvec(i)-xpkg(1,1),period)
147 if(xuse(i).lt.0.0) xuse(i)=xuse(i)+period
148 xuse(i)=xuse(i)+xpkg(1,1)
149 xuse(i)=max(xpkg(1,1),min(xpkg(nx,1),xuse(i)))
157 if((imsg.eq.1).and.(iwarn.gt.0))
then
158 write(6,*)
' %xlookup: ',iwarn,
' points not in range: ',
159 > xpkg(1,1),
' to ',xpkg(nx,1)
173 if(init_guess.eq.0)
then
178 iv(i)=1+havi*(xuse(i)-xpkg(1,1))
179 iv(i)=max(1,min((nx-1),iv(i)))
181 dxn(i)=(xuse(i)-xpkg(iv(i),1))
183 dxn(i)=(xuse(i)-xpkg(iv(i),1))*havi
194 if((xpkg(iprev,1).le.xuse(i)).and.
195 > (xuse(i).le.xpkg(iprev+1,1)))
then
198 iv(i)=1+havi*(xuse(i)-xpkg(1,1))
199 iv(i)=max(1,min((nx-1),iv(i)))
203 dxn(i)=(xuse(i)-xpkg(iv(i),1))
205 dxn(i)=(xuse(i)-xpkg(iv(i),1))*havi
220 allocate(iok(inum),stat=istat)
223 write(6,*)
' ?? xlookup "iok" vector allocation failure!'
228 allocate(imina(inum),stat=istat)
231 write(6,*)
' ?? xlookup "imina" vector allocation failure!'
235 allocate(imaxa(inum),stat=istat)
238 write(6,*)
' ?? xlookup "imaxa" vector allocation failure!'
248 if(init_guess.eq.0)
then
249 go to (100,200,300) ialg
251 go to (150,250,350) ialg
268 iv(i)=1+havi*(xuse(i)-xpkg(1,1))
271 iv(i)=max(imina(i),min(imaxa(i),iv(i)))
273 if(xuse(i).lt.xpkg(iv(i),1))
then
276 imaxa(i)=max(1,(iv(i)-1))
277 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
280 imina(i)=min((nx-1),(iv(i)+1))
292 zdelta=(xuse(i)-xpkg(iv(i)+isrch,1))
293 if(i_sign*zdelta.le.hloc)
then
303 iv(i)=max(imina(i),min(imaxa(i),iv(i)))
305 if(xuse(i).lt.xpkg(iv(i),1))
then
308 imaxa(i)=max(1,(iv(i)-1))
309 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
312 imina(i)=min((nx-1),(iv(i)+1))
322 zdelta=(xuse(i)-xpkg(iv(i)+isrch,1))
323 if(i_sign*zdelta.le.hloc)
then
333 iv(i)=max(imina(i),min(imaxa(i),iv(i)))
335 if(xuse(i).lt.xpkg(iv(i),1))
then
338 imaxa(i)=max(1,(iv(i)-1))
339 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
342 imina(i)=min((nx-1),(iv(i)+1))
352 zdelta=(xuse(i)-xpkg(iv(i)+isrch,1))
353 if(i_sign*zdelta.le.hloc)
then
363 iv(i)=max(imina(i),min(imaxa(i),iv(i)))
365 if(xuse(i).lt.xpkg(iv(i),1))
then
368 imaxa(i)=max(1,(iv(i)-1))
369 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
372 imina(i)=min((nx-1),(iv(i)+1))
382 zdelta=(xuse(i)-xpkg(iv(i)+isrch,1))
383 if(i_sign*zdelta.le.hloc)
then
393 iv(i)=max(imina(i),min(imaxa(i),iv(i)))
395 if(xuse(i).lt.xpkg(iv(i),1))
then
398 imaxa(i)=max(1,(iv(i)-1))
399 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
402 imina(i)=min((nx-1),(iv(i)+1))
407 if(.not.iok(i)) iprob=iprob+1
432 if((xpkg(iprev,1).le.xuse(i)).and.
433 > (xuse(i).le.xpkg(iprev+1,1)))
then
441 iv(i)=1+havi*(xuse(i)-xpkg(1,1))
442 iv(i)=max(imina(i),min(imaxa(i),iv(i)))
444 if(xuse(i).lt.xpkg(iv(i),1))
then
447 imaxa(i)=max(1,(iv(i)-1))
448 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
451 imina(i)=min((nx-1),(iv(i)+1))
464 zdelta=(xuse(i)-xpkg(iv(i)+isrch,1))
465 if(i_sign*zdelta.le.hloc)
then
473 iv(i)=max(imina(i),min(imaxa(i),iv(i)))
475 if(xuse(i).lt.xpkg(iv(i),1))
then
478 imaxa(i)=max(1,(iv(i)-1))
479 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
482 imina(i)=min((nx-1),(iv(i)+1))
492 zdelta=(xuse(i)-xpkg(iv(i)+isrch,1))
493 if(i_sign*zdelta.le.hloc)
then
501 iv(i)=max(imina(i),min(imaxa(i),iv(i)))
503 if(xuse(i).lt.xpkg(iv(i),1))
then
506 imaxa(i)=max(1,(iv(i)-1))
507 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
510 imina(i)=min((nx-1),(iv(i)+1))
520 zdelta=(xuse(i)-xpkg(iv(i)+isrch,1))
521 if(i_sign*zdelta.le.hloc)
then
529 iv(i)=max(imina(i),min(imaxa(i),iv(i)))
531 if(xuse(i).lt.xpkg(iv(i),1))
then
534 imaxa(i)=max(1,(iv(i)-1))
535 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
538 imina(i)=min((nx-1),(iv(i)+1))
548 zdelta=(xuse(i)-xpkg(iv(i)+isrch,1))
549 if(i_sign*zdelta.le.hloc)
then
557 iv(i)=max(imina(i),min(imaxa(i),iv(i)))
559 if(xuse(i).lt.xpkg(iv(i),1))
then
562 imaxa(i)=max(1,(iv(i)-1))
563 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
566 imina(i)=min((nx-1),(iv(i)+1))
571 if(.not.iok(i)) iprob=iprob+1
601 if(xuse(i).lt.xpkg(iv(i),1))
then
602 imaxa(i)=max(1,(iv(i)-1))
603 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
604 imina(i)=min((nx-1),(iv(i)+1))
615 iv(i)=(imina(i)+imaxa(i))/2
617 if(xuse(i).lt.xpkg(iv(i),1))
then
618 imaxa(i)=max(1,(iv(i)-1))
619 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
620 imina(i)=min((nx-1),(iv(i)+1))
629 iv(i)=(imina(i)+imaxa(i))/2
631 if(xuse(i).lt.xpkg(iv(i),1))
then
632 imaxa(i)=max(1,(iv(i)-1))
633 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
634 imina(i)=min((nx-1),(iv(i)+1))
643 iv(i)=(imina(i)+imaxa(i))/2
645 if(xuse(i).lt.xpkg(iv(i),1))
then
646 imaxa(i)=max(1,(iv(i)-1))
647 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
648 imina(i)=min((nx-1),(iv(i)+1))
657 iv(i)=(imina(i)+imaxa(i))/2
659 if(xuse(i).lt.xpkg(iv(i),1))
then
660 imaxa(i)=max(1,(iv(i)-1))
661 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
662 imina(i)=min((nx-1),(iv(i)+1))
667 if(.not.iok(i)) iprob=iprob+1
691 if((xpkg(iprev,1).le.xuse(i)).and.
692 > (xuse(i).le.xpkg(iprev+1,1)))
then
702 if(xuse(i).lt.xpkg(iv(i),1))
then
703 imaxa(i)=max(1,(iv(i)-1))
704 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
705 imina(i)=min((nx-1),(iv(i)+1))
717 iv(i)=(imina(i)+imaxa(i))/2
719 if(xuse(i).lt.xpkg(iv(i),1))
then
720 imaxa(i)=max(1,(iv(i)-1))
721 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
722 imina(i)=min((nx-1),(iv(i)+1))
731 iv(i)=(imina(i)+imaxa(i))/2
733 if(xuse(i).lt.xpkg(iv(i),1))
then
734 imaxa(i)=max(1,(iv(i)-1))
735 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
736 imina(i)=min((nx-1),(iv(i)+1))
745 iv(i)=(imina(i)+imaxa(i))/2
747 if(xuse(i).lt.xpkg(iv(i),1))
then
748 imaxa(i)=max(1,(iv(i)-1))
749 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
750 imina(i)=min((nx-1),(iv(i)+1))
759 iv(i)=(imina(i)+imaxa(i))/2
761 if(xuse(i).lt.xpkg(iv(i),1))
then
762 imaxa(i)=max(1,(iv(i)-1))
763 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
764 imina(i)=min((nx-1),(iv(i)+1))
769 if(.not.iok(i)) iprob=iprob+1
798 iv(i)=1+havi*(xuse(i)-xpkg(1,1))
799 iv(i)=max(1,min(nx-1,iv(i)))
800 xfac=(xuse(i)-(xpkg(1,1)+(iv(i)-1)*hav))*havi
802 if(iv(i).lt.nx-1)
then
803 zdindx=xpkg(iv(i)+1,2)-zindx0
807 zindex=zindx0+xfac*zdindx
810 iv(i)=max(1,min(nx-1,iv(i)))
812 if(xuse(i).lt.xpkg(iv(i),1))
then
814 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
826 if(xuse(i).lt.xpkg(iv(i),1))
then
828 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
838 if(xuse(i).lt.xpkg(iv(i),1))
then
840 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
850 if(xuse(i).lt.xpkg(iv(i),1))
then
852 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
862 if(xuse(i).lt.xpkg(iv(i),1))
then
864 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
870 if(.not.iok(i)) iprob=iprob+1
894 if((xpkg(iprev,1).le.xuse(i)).and.
895 > (xuse(i).le.xpkg(iprev+1,1)))
then
904 iv(i)=1+havi*(xuse(i)-xpkg(1,1))
905 iv(i)=max(1,min(nx-1,iv(i)))
906 xfac=(xuse(i)-(xpkg(1,1)+(iv(i)-1)*hav))*havi
908 if(iv(i).lt.nx-1)
then
909 zdindx=xpkg(iv(i)+1,2)-zindx0
913 zindex=zindx0+xfac*zdindx
916 iv(i)=max(1,min(nx-1,iv(i)))
918 if(xuse(i).lt.xpkg(iv(i),1))
then
920 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
933 if(xuse(i).lt.xpkg(iv(i),1))
then
935 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
945 if(xuse(i).lt.xpkg(iv(i),1))
then
947 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
957 if(xuse(i).lt.xpkg(iv(i),1))
then
959 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
969 if(xuse(i).lt.xpkg(iv(i),1))
then
971 else if(xuse(i).gt.xpkg(iv(i)+1,1))
then
977 if(.not.iok(i)) iprob=iprob+1
997 if(iprob.gt.0)
go to 5
1002 dxn=(xuse-xpkg(iv,1))
1003 else if(ialg.ne.3)
then
1004 dxn=(xuse-xpkg(iv,1))*xpkg(iv,3)
1008 dxn=(xuse-xpkg(iv,1))*xpkg(iv,3)
1009 hv=xpkg(iv+1,1)-xpkg(iv,1)