Adding DisEMBL dependency Tisean executable
[jabaws.git] / binaries / src / disembl / Tisean_3.0.1 / source_f / upo.f
diff --git a/binaries/src/disembl/Tisean_3.0.1/source_f/upo.f b/binaries/src/disembl/Tisean_3.0.1/source_f/upo.f
new file mode 100644 (file)
index 0000000..224f9d0
--- /dev/null
@@ -0,0 +1,268 @@
+c===========================================================================
+c
+c   This file is part of TISEAN
+c 
+c   Copyright (c) 1998-2007 Rainer Hegger, Holger Kantz, Thomas Schreiber
+c 
+c   TISEAN is free software; you can redistribute it and/or modify
+c   it under the terms of the GNU General Public License as published by
+c   the Free Software Foundation; either version 2 of the License, or
+c   (at your option) any later version.
+c
+c   TISEAN is distributed in the hope that it will be useful,
+c   but WITHOUT ANY WARRANTY; without even the implied warranty of
+c   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+c   GNU General Public License for more details.
+c
+c   You should have received a copy of the GNU General Public License
+c   along with TISEAN; if not, write to the Free Software
+c   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+c
+c===========================================================================
+c   locate unstable periodic points
+c   author T. Schreiber (1998)
+c===========================================================================
+      parameter(nx=1000000,mper=20)
+      dimension x(nx)
+      character*72 file, fout
+      common /period/ x, nmax, m, eps
+      data frac/0./, iper/1/, teq/-1./, tdis/-1./, tacc/-1./, h/-1./
+      data iverb/1/
+
+      call whatido("locate unstable periodic points",iverb)
+      m=max(imust("m"),1)
+      eps=fcan("r",0.)
+      frac=fcan("v",frac)
+      teq=fcan("w",teq)
+      tdis=fcan("W",tdis)
+      h=fcan("s",h)
+      tacc=fcan("a",tacc)
+      iper=ican("p",iper)
+      nmaxx=ican("l",nx)
+      nexcl=ican("x",0)
+      jcol=ican("c",0)
+      icen=ican("n",nmaxx)
+      isout=igetout(fout,iverb)
+      if(eps.eq.0.and.frac.eq.0.) call usage()
+
+      do 10 ifi=1,nstrings()
+         call nthstring(ifi,file)
+         nmax=nmaxx
+         call readfile(nmax,x,nexcl,jcol,file,iverb)
+         if(file.eq."-") file="stdin"
+         if(isout.eq.1) call addsuff(fout,file,"_upo_")
+         call rms(nmax,x,sc,sd)
+         if(frac.gt.0) eps=sd*frac
+         if(teq.lt.0.) teq=eps
+         if(tdis.lt.0.) tdis=eps
+         if(tacc.lt.0.) tacc=eps
+         if(h.lt.0.) h=eps
+         if(isout.eq.1) 
+     .      write(fout(index(fout,"_upo_")+5:72),'(i2.2)') iper
+         call outfile(fout,iunit,iverb)
+         call findupo(iper,icen,teq,tdis,tacc,h,iunit,iverb)
+ 10      if(iunit.ne.istdout()) close(iunit)
+      end
+
+      subroutine usage()
+c usage message
+      call whatineed(
+     .   "-m# [-r# | -v#] [-p# -w# -W# -a# -s# -n#"//
+     .   " -o outfile -l# -x# -c# -V# -h] file(s)")
+      call ptext("either -r or -v must be present")
+      call popt("m","embedding dimension")
+      call popt("r","absolute kernel bandwidth")
+      call popt("v","same as fraction of standard deviation")
+      call popt("p","period of orbit (1)")
+      call popt("w","minimal separation of trial points (e)")
+      call popt("W","minimal separation of distinct orbits (e)") 
+      call popt("a",
+     .   "maximal error of orbit to be plotted (all plotted)")
+      call popt("s","initial separation for stability (e)")
+      call popt("n","number of trials (all points)")
+      call popt("l","number of values to be read (all)")
+      call popt("x","number of values to be skipped (0)")
+      call popt("c","column to be read (1 or file,#)")
+      call pout("file_upo_pp")
+      call pall()
+      call ptext("Verbosity levels (add what you want):")
+      call ptext("          1 = input/output" )
+      call ptext("          2 = print orbits found")
+      call ptext("          4 = status after 1000 points")
+      call ptext("          8 = status after 100 points")
+      call ptext("         16 = status after 10 points")
+      stop
+      end
+
+      subroutine findupo(iper,icen,teq,tdis,tacc,h,iunit,iverb)
+      parameter(nx=1000000,mper=20)
+      external peri
+      dimension x(nx),xp(mper),fvec(mper),xor(mper,nx),
+     .   iw(mper),w0(mper,mper),w1(mper),w2(mper),w3(mper),
+     .   w4(mper),w5(mper),w6(mper)
+      common /period/ x, nmax, m, eps
+     
+      if(iper.gt.mper) stop "findupo: make mper larger."
+      tol=sqrt(r1mach(4))
+      itry=0
+      ior=0
+      do 10 n=iper,nmax
+         if(iv_10(iverb).eq.1) then
+            if(mod(n,10).eq.0) write(istderr(),'(i7)') n
+         else if(iv_100(iverb).eq.1) then
+            if(mod(n,100).eq.0) write(istderr(),'(i7)') n
+         else if(iv_1000(iverb).eq.1) then
+            if(mod(n,1000).eq.0) write(istderr(),'(i7)') n
+         endif 
+         if(known(n,iper,teq).eq.1) goto 10
+         itry=itry+1
+         if(itry.gt.icen) return
+         do 20 i=1,iper
+ 20         xp(i)=x(n-iper+i)
+         call snls1(peri,1,iper,iper,xp,fvec,w0,mper,tol,tol,0.,
+     .      20*(iper+1),0.,w1,1,100.,0,info,nfev,ndum,iw,w2,w3,w4,w5,w6)
+         err=enorm(iper,fvec)
+         if(info.eq.-1.or.info.eq.5.or.err.gt.tacc) goto 10   ! unsuccessfull
+         if(isold(iper,xp,ior,xor,tdis).eq.1) goto 10         ! already found
+         ior=ior+1                                            ! a new orbit
+         do 30 i=1,iper
+ 30         xor(i,ior)=xp(i)
+         ipor=iperiod(iper,xp,tdis)
+         sor=ipor*stab(iper,xp,h)/real(iper)
+         call print(iper,xp,ipor,sor,err,iunit,iverb)
+ 10      continue
+      end
+
+      function known(n,iper,tol)
+c return 1 if equivalent starting point has been tried
+      parameter(nx=1000000)
+      dimension x(nx)
+      common /period/ x, nmax, m, eps
+
+      known=1
+      do 10 nn=iper,n-1
+         dis=0
+         do 20 i=1,iper
+ 20         dis=dis+(x(n-iper+i)-x(nn-iper+i))**2
+ 10      if(sqrt(dis).lt.tol) return
+      known=0
+      end
+
+      function isold(iper,xp,ior,xor,toler)
+c determine if orbit is in data base
+      parameter(mper=20)
+      dimension xp(iper), xor(mper,*)
+
+      isold=1
+      do 10 ip=1,iper
+         do 20 io=1,ior
+            dor=0
+            do 30 i=1,iper
+ 30            dor=dor+(xp(i)-xor(i,io))**2
+ 20            if(sqrt(dor).le.toler) return
+ 10      call oshift(iper,xp)
+      isold=0
+      end
+  
+      subroutine oshift(iper,xp)
+c leftshift orbit circularly by one position
+      dimension xp(*)
+
+      h=xp(1)
+      do 10 i=1,iper-1
+ 10      xp(i)=xp(i+1)
+      xp(iper)=h
+      end
+      function iperiod(iper,xp,tol)
+c determine shortest subperiod
+      dimension xp(*)
+
+      do 10 iperiod=1,iper
+         dis=0
+         do 20 i=1,iper
+            il=i-iperiod
+            if(il.le.0) il=il+iper
+ 20         dis=dis+(xp(i)-xp(il))**2
+ 10      if(sqrt(dis).le.tol) return
+      end
+
+      subroutine peri(iflag,mf,iper,xp,fvec,fjac,ldfjac)
+c built discrepancy vector (as called by snls1)
+      dimension xp(*),fvec(*)
+
+      do 10 ip=1,iper
+         fvec(ip)=xp(1)-fc(iper,xp,iflag)
+ 10      call oshift(iper,xp)
+      end
+
+      function fc(iper,xp,iflag)
+c predict (cyclic) point 1, using iper,iper-1...
+      parameter(nx=1000000)
+      dimension  xp(*), x(nx)
+      common /period/ x, nmax, m, eps
+      data cut/20/
+
+      eps2=1./(2*eps*eps)
+      ft=0
+      sw=0
+      fc=0
+      do 10 n=m+1,nmax
+         dis=0
+         do 20 i=1,m
+ 20         dis=dis+(x(n-i)-xp(mod(m*iper-i,iper)+1))**2
+         ddis=dis*eps2
+         w=0
+         if(ddis.lt.cut) w=exp(-ddis)
+         ft=ft+w*x(n)
+ 10      sw=sw+w
+      iflag=-1
+      if(sw.eq.0) return   ! fc undefined, stop minimising
+      fc=ft/sw
+      iflag=1
+      end
+
+      function stab(ilen,xp,h)
+c compute cycle stability by iteration of a tiny perturbation
+      parameter(nx=1000000,mper=20,maxit=1000)
+      dimension xp(*), x(nx), xcop(mper)
+      common /period/ x, nmax, m, eps
+
+      if(mper.lt.ilen) stop "stability: make mper larger."
+      iflag=1
+      stab=0
+      do 10 i=2,m
+ 10      xcop(i)=xp(mod(i-1,ilen)+1)
+      xcop(1)=xp(1)+h
+      do 20 it=1,maxit
+         do 30 itt=1,ilen
+            xx=fc(m,xcop,iflag)
+            if(iflag.eq.-1) goto 1
+            call oshift(m,xcop)
+ 30         xcop(m)=xx
+         dis=0
+         do 40 i=1,m
+ 40         dis=dis+(xcop(i)-xp(mod(i-1,ilen)+1))**2
+         dis=sqrt(dis)
+         stab=stab+log(dis/h)
+         do 20 i=1,m
+ 20         xcop(i)=xp(mod(i-1,ilen)+1)*(1-h/dis) + xcop(i)*h/dis
+ 1    stab=stab/max(it-1,1)
+      end
+
+      subroutine print(iper,xp,ipor,sor,err,iunit,iverb)
+c write orbit to iunit and to stdout
+      dimension xp(*)
+
+      write(iunit,*)
+      write(iunit,*) "period / accuracy / stability"
+      write(iunit,*) ipor, err, exp(sor)
+      do 10 i=1,ipor
+ 10      write(iunit,*) i, xp(i)
+      if(iv_upo(iverb).eq.0) return
+      write(istderr(),*)
+      write(istderr(),*) "period / accuracy / stability"
+      write(istderr(),*) ipor, err, exp(sor)
+      do 20 i=1,ipor
+ 20      write(istderr(),*) i, xp(i)
+      end