I was working on one geophysical software, when I found one of the libraries to compute Love and Rayleigh waves is still from the times of punch cards and tapes. Its source fits the standard of fortran pads (here you may take a look on the original release of this utility in the year 1978, including "a translation of a Russian article" to "help understand the theory used").
And yes, this piece of code is still used. I tried to look for another library, but haven't found any (at least, in public domain). All the other source codes I've seen use the same tool. That's actually why do I appreciate Fortran so much: please, show me any other programming language, so that both widely used compilers (GCC and ifort) can assemble a working program from a file consisting a mixture of standards and codes written with 40 years difference! And also having a native datatype of complex variable and functions of is, which is very needed by any wave theory math.
However, it's difficult to manage this code and improve it (for example, to add seismic wave attenuation corrections etc). Therefore, I decided to rewrite it to modern day standard. 80 kilobytes is not so lot.
This code was written when jumps between code pieces was very cheap relatively to the actual computations of some value. Eigenfunctions in this code have up to 200 variables to store sines and cosines. However, there no conditional cases or cycles in our modern-day meaning. There are jumps to certain labels of positions in code. For example:
if (number) 401,402,403
if (number1.lt.number2) goto 505
If number is less than zero, code goes to label 401, if it is zero, it goes to 402, and to 403 in the rest of values. The second expression jumps to label 505 is number1 is less than number2. And also:
10 CONTINUE
Means to continue execution (go to the next line). In the case of cycle it return to the first line of it:
DO 10 I=1,20
Do it for all the i-s in between 1 and 20, and the last statement is on the line with label 10.
Now I'd like to all the people, as well as linguistics/literature necrophiliacs, who want to feel the spirit of the good old days to translate this code to any modern language:
C******************************************************************** C---------------start of loop for Period k--------------------------S do 9998 k=1,kmax call flat1(d,rho,a,b,mmax,kind) C--------------------loop for modes---------------------------------S do 9997 iq=1,kmode if(k-1) 605,605,599 599 if(iq-2) 600,601,601 600 c1=0.90*c(k-1,1) goto 605 601 if(dc*(c(k-1,iq)-c(k,iq-1))) 602,603,604 602 c1=c(k,iq-1)+0.01*dc goto 605 603 c1=c(k,iq-1)+0.01*dc goto 605 604 c1=c(k-1,iq) 605 continue idrop=0 999 del1=dltar(c1,t1,ifunc) 80 c2=c1+dc idrop=0 del2=dltar(c2,t1,ifunc) if(sign(1.,del1).ne.sign(1.,del2)) goto 54 81 c1=c2 del1=del2 qbq=0.8*b(1) if(c1-0.8*b(1)) 250,251,251 251 if(c1-(b(mmax)+0.3)) 252,250,250 252 goto 80 54 continue call nevill (t1,c1,c2,del1,del2,ifunc,cn) if(lstop.eq.0) go to 3006 lstop=0 if(k.eq.1.and.iq.eq.1) go to 3005 if(k.eq.1) go to 3004 do 3003 i=1,k-1 do 3000 j=1,mode if(i.gt.imax(j)) go to 3001 3000 continue jmax=mode go to 3002 3001 jmax=j-1 3002 continue 3003 continue 3004 if(iq.eq.1) go to 3005 jmax=iq-1 3005 continue go to 9999 ! to the end of the subroutine 3006 c1=cn if(c1-b(mmax)) 121,121,250 121 c(k,iq)=c1 C----------------ifunc=kind : Rayleigh if =2 or Love if =1----------- goto (6001,6002),ifunc 6002 continue ratio(k,iq)=dltar(c1,t1,3) goto 6003 6001 continue 6003 continue c1=c1+0.01*dc imax(iq)=k goto 9997 250 if(k*iq-1) 256,256,255 256 continue write(*,*) ncount if(ncount.eq.1)then PRINT 258 do i=1,mmax print *, b(i), a(i) ,rho(i), d(i), qs_ref(i) enddo 258 format(1x,/22x,'Improper initial value. No zero found.') endif goto 9999 ! this goes to the end of the subroutine 9997 continue C-----------------end of loop for mode------------------------------E C--------------------search of root is finished---------------------- goto 9998 255 kmode=iq-1 if(kmode) 9996,9996,9998 9998 continue C-----------------end of loop for period k--------------------------E 9996 continue C********************************************************************
That's a pretty interesting exercise which gives a very good feeling of the long way made by computers from Turing's machine to the modern day gadgets. Persons who have coded in assembly language may also see how close is this code to it. You may also notice the concept of re-use: they tried to reuse any single piece of code. That makes sense: while one can make typos in one of the lines, leading to a hard-to-find bugs (like -0.001 instead of +0.001), usage of a wrong block will be clearly seen because of weird results.
For the aforementioned piece of code I go this listing (a bit optimised for the routine is uses):
For the aforementioned piece of code I go this listing (a bit optimised for the routine is uses):
! start of loop for Period k do k=1,kmax ! kmode is = mode = 1 in our case (fundamental modes) do iq=1,kmode if (k-1 > 0) then if (iq-2 < 0) then c1=0.90*cc(k-1,1) else if(dc*(cc(k-1,iq)-cc(k,iq-1)) <= 0.) then c1=cc(k,iq-1)+0.01*dc else c1=cc(k-1,iq) endif endif endif idrop=0 ; del1=dltar(c1,t1,ifunc) goin = .false. do c2=c1+dc idrop=0 ; del2=dltar(c2,t1,ifunc) if (sign(1., real(del1))*sign(1., real(del2)) < 0.) then call nevill (t1,c1,c2,del1,del2,ifunc,cn) goin = .true. exit endif c1=c2 del1=del2 qbq=0.8*b(1) if (c1-0.8*b(1) < 0. .and. c1-(b(mmax)+0.3) >= 0.) exit enddo if (goin) then if (lstop /= 0) then lstop=0 if(k /= 1) then do i=1,k-1 jmax=mode do j=1,mode if(i > imax(j)) then jmax=j-1 exit endif enddo enddo endif if(iq.eq.1) return jmax=iq-1 endif c1 = cn if(c1-b(mmax) <= 0) then cc(k,iq)=c1 if (ifunc == 2) ratio(k,iq)=dltar(c1,t1,3) ! 2 = Ray, 1 = Love c1=c1+0.01*dc imax(iq)=k cycle endif endif if(k*iq-1>0) exit write(*,*) ncount if(ncount == 1)then PRINT *, 'Improper initial value. No zero found in calcul.f' do i=1,mmax print *, b(i), a(i) ,rho(i), d(i), qs_ref(i) enddo endif return enddo enddo ! end of loop for k
I think humankind needs a new wave of epic poetry. A programmer will bring to the Machine a list of code captured in a fight with with hordes of wild punch cards - similar to a knight bringing a head of defeated dragon. The hero will be also a necromancer and practice sorcery.
And yeah, have a nice Saturday evening!
Ч.Л.: Fortran From Punch Card Era >>>>> Download Now
ОтветитьУдалить>>>>> Download Full
Ч.Л.: Fortran From Punch Card Era >>>>> Download LINK
>>>>> Download Now
Ч.Л.: Fortran From Punch Card Era >>>>> Download Full
>>>>> Download LINK Hk