From: "Warren W. Gay VE3WWG" <ve3wwg@home.com>
Subject: Re: Help with translation: Fortran77 => Ada95
Date: Wed, 04 Jul 2001 17:04:32 GMT
Date: 2001-07-04T17:04:32+00:00 [thread overview]
Message-ID: <3B434CA0.F874E124@home.com> (raw)
In-Reply-To: 9hun38$t0m$1@ulysses.noc.ntua.gr
Gak... FORTRAN! Quick.. where is my wooden stake? ;-)
Warren.
N&J wrote:
>
> Hi all,
> Is anyone willing to help me translate a FORTRAN77 subroutine to Ada95? I
> just can't understand one of those TERRIBLE and UNACCEPTABLE Fortran "goto"
>
> I attach the FORTRAN subroutine (It calculates the eigenvalues and the first
> components of the eigenvectors of a symmetric tridiagonal matrix)
>
> I can't cope with the loop starting at 105 and the "goto" to it before 240.
>
> Thanks in advance,
> John
>
> -----SubRoutine gauss.f--------
> c
> c Input: n - - the number of points in the Gaussian quadrature
> c formula; type integer
> c alpha,beta - - arrays of dimension n to be filled
> c with the values of alpha(k-1), beta(k-1), k=1,2,
> c ...,n
> c eps - the relative accuracy desired in the nodes
> c and weights
> c
> c Output: zero- array of dimension n containing the Gaussian
> c nodes (in increasing order) zero(k)=x(k), k=1,2,
> c ...,n
> c weight - array of dimension n containing the
> c Gaussian weights weight(k)=w(k), k=1,2,...,n
> c ierr- an error flag equal to 0 on normal return,
> c equal to i if the QR algorithm does not
> c converge within 30 iterations on evaluating the
> c i-th eigenvalue, equal to -1 if n is not in
> c range, and equal to -2 if one of the beta's is
> c negative.
> c
> c The array e is needed for working space.
> c
> dimension alpha(n),beta(n),zero(n),weight(n),e(n)
> if(n.lt.1) then
> ierr=-1
> return
> end if
> ierr=0
> zero(1)=alpha(1)
> if(beta(1).lt.0.) then
> ierr=-2
> return
> end if
> weight(1)=beta(1)
> if (n.eq.1) return
> weight(1)=1.
> e(n)=0.
> do 100 k=2,n
> zero(k)=alpha(k)
> if(beta(k).lt.0.) then
> ierr=-2
> return
> end if
> e(k-1)=sqrt(beta(k))
> weight(k)=0.
> 100 continue
> do 240 l=1,n
> j=0
> c
> c Look for a small subdiagonal element.
> c
> 105 do 110 m=l,n
> if(m.eq.n) goto 120
> if(abs(e(m)).le.eps*(abs(zero(m))+abs(zero(m+1)))) goto 120
> 110 continue
> 120 p=zero(l)
> if(m.eq.l) goto 240
> if(j.eq.30) goto 400
> j=j+1
> c
> c Form shift.
> c
> g=(zero(l+1)-p)/(2.*e(l))
> r=sqrt(g*g+1.)
> g=zero(m)-p+e(l)/(g+sign(r,g))
> s=1.
> c=1.
> p=0.
> mml=m-l
> c
> c For i=m-1 step -1 until l do ...
> c
> do 200 ii=1,mml
> i=m-ii
> f=s*e(i)
> b=c*e(i)
> if(abs(f).lt.abs(g)) goto 150
> c=g/f
> r=sqrt(c*c+1.)
> e(i+1)=f*r
> s=1./r
> c=c*s
> goto 160
> 150 s=f/g
> r=sqrt(s*s+1.)
> e(i+1)=g*r
> c=1./r
> s=s*c
> 160 g=zero(i+1)-p
> r=(zero(i)-g)*s +2.*c*b
> p=s*r
> zero(i+1)=g+p
> g=c*r-b
> c
> c Form first component of vector.
> c
> f=weight(i+1)
> weight(i+1)=s*weight(i)+c*f
> weight(i)=c*weight(i)-s*f
> 200 continue
> zero(l)=zero(l)-p
> e(l)=g
> e(m)=0.
> goto 105
> 240 continue
> c
> c Order eigenvalues and eigenvectors.
> c
> do 300 ii=2,n
> i=ii-1
> k=i
> p=zero(i)
> do 260 j=ii,n
> if(zero(j).ge.p) goto 260
> k=j
> p=zero(j)
> 260 continue
> if(k.eq.i) goto 300
> zero(k)=zero(i)
> zero(i)=p
> p=weight(i)
> weight(i)=weight(k)
> weight(k)=p
> 300 continue
> do 310 k=1,n
> weight(k)=beta(1)*weight(k)*weight(k)
> 310 continue
> return
> c
> c Set error - no convergence to an eigenvalue after 30 iterations.
> c
> 400 ierr=l
> return
> end
--
Warren W. Gay VE3WWG
http://members.home.net/ve3wwg
next prev parent reply other threads:[~2001-07-04 17:04 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-07-04 9:19 Help with translation: Fortran77 => Ada95 N&J
2001-07-04 17:04 ` Warren W. Gay VE3WWG [this message]
2001-07-04 17:17 ` Colin Paul Gloster
2001-07-04 17:55 ` Jeffrey Carter
2001-07-05 1:33 ` Gary Scott
2001-07-05 6:03 ` tmoran
2001-07-06 1:35 ` Gary Scott
2001-07-05 17:36 ` Jeffrey Carter
2001-07-06 1:14 ` Gary Scott
2001-07-04 19:51 ` [SOLVED] " N&J
2001-07-04 23:25 ` GianLuigi Piacentini
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox