From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=BAYES_00,INVALID_MSGID, REPLYTO_WITHOUT_TO_CC autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,96424a7ea58e8817,start X-Google-Attributes: gid103376,public From: "Paolo M. Pumilia" Subject: help on interfacing with fortran Date: 2000/01/16 Message-ID: <38818E32.FD90616B@cstc.org>#1/1 X-Deja-AN: 573277639 X-Accept-Language: en Content-Type: multipart/mixed; boundary="------------D7E541716D27F3247CF94881" X-Complaints-To: usenet@stargate1.inet.it X-Trace: stargate1.inet.it 948014539 79088 212.239.48.37 (16 Jan 2000 09:22:19 GMT) Organization: CSTC Mime-Version: 1.0 Reply-To: pumilia@est.it NNTP-Posting-Date: 16 Jan 2000 09:22:19 GMT Newsgroups: comp.lang.ada Date: 2000-01-16T09:22:19+00:00 List-Id: This is a multi-part message in MIME format. --------------D7E541716D27F3247CF94881 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit I would like to interface a set of fortran soubroutines and functions to main Ada procedure. Here are enclosed three functions and a subroutine which i am working on, at present. They are all stored in a single file, that i used to compile and link to its fortran main code. The Ada procedure makes one call to the subroutine start_carry(idum), getting an integer number (idum) in return Then the function rnor(idum) will be called, returnig a real*8 random number. How to perform such calls? I took a look at tha ARM, but its contents appears rather cryptic to me. I have been reading a few introductive manuals (Lovelace, Dodrill-tutor, etc) but they don't cover this topic very well. Interfacing is completely new in my experience. Could those four fortran codes be kept within a single file or should they be included into an Ada package or procedure? A procedure for each function or subroutine should be prepared? How do calls between fortran functions (not involving Ada code) will be performed? Here is my guess applied to Ada_Main procedure: with Interfaces.Fortran; use Interfaces.Fortran; procedure Ada_Main; dummy : integer function rnor(dum : integer) : return float; pragma Convention (Fortran, dummy); pragma Convention (Fortran, dum); procedure start_carry (dummy : in out integer) is pragma Import (Fortran, start_carry); ... fortran code ? ....... function rnor(dum : integer) : return float is pragma Import (Fortran, rnor); ... fortran code ? ....... begin Ada_Main .... start_carry(dummy); a := rnor(dum); -- supposing a is a float variable .... end Ada_Main ; Any suggestions and examples are welcome thank you for your help Paolo Pumilia --------------D7E541716D27F3247CF94881 Content-Type: text/plain; charset=us-ascii; name="rnor.f" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="rnor.f" subroutine start_carry(idum) idum=-10231 do iloop=1,1000 j=icarry(idum) enddo return end function icarry(idum) implicit real*8(a-h,q-z) parameter (ib=2**24,b=1.d0/ib) integer*4 xn(-29:30) if(idum.le.0)then if(idum.eq.0)idum=13 do i=1,30 xn(i)=mod(iabs(idum)*i,37) xn(i-30)=xn(i) enddo ic=0 idum=30 endif i1=idum-24 i2=idum-10 idn=xn(i2)-xn(i1)-ic if(idn.lt.0)then idn=idn+ib ic=1 else ic=0 endif idum=idum+1 if(idum.gt.30)idum=1 xn(idum)=idn xn(idum-30)=idn icarry=idn return end function rcarry(idum) implicit real*8(a-h,q-z) parameter (ib=2**24,b=1.d0/ib) rcarry=b*icarry(idum) return end C C MARSAGLIA,G. & TSANG,W.W. ,SIAM J.SCIE. & STAT.COMP.,5,349(1984) C FUNCTION RNOR(SEED) IMPLICIT REAL*8(A-H,M,Q-Z) ! pol 29.jun.1997 ?? real*8 pc INTEGER*4 SEED parameter (i23=2**23,rmax=1.d0/i23) DIMENSION V(65) DATA V /.3409450d0,.4573146d0,.5397792d0,.6062427d0,.6631690d0, 1.7136974d0,.7596124d0,.8020356d0,.8417227d0,.8792102d0,.9148948d0, 2.9490791d0,.9820005d0,1.013848d0,1.044780d0,1.074924d0,1.104391d0, 31.133273d0,1.161653d0,1.189601d0,1.217181d0,1.244452d0,1.271463d0, 41.298265d0,1.324901d0,1.351412d0,1.377839d0,1.404221d0,1.430593d0, 51.456991d0,1.483452d0,1.510012d0,1.536706d0,1.563571d0,1.590645d0, 61.617968d0,1.645579d0,1.673525d0,1.701850d0,1.730604d0,1.759842d0, 71.789622d0,1.820009d0,1.851076d0,1.882904d0,1.915583d0,1.949216d0, 81.983924d0,2.019842d0,2.057135d0,2.095992d0,2.136644d0,2.179371d0, 92.224517d0,2.272518d0,2.323934d0,2.379500d0,2.440222d0,2.507511d0, +2.583466d0,2.671391d0,2.776994d0,2.776994d0,2.776994d0,2.776994d0/ DATA AA,B,C/12.37586d0,.4878992d0,12.67706d0/ 1 C1,C2,PC,XN/.9689279d0,1.301198d0,.1958303d-1,2.776994d0/ I=icarry(seed)-i23 J=MOD(IABS(I),64)+1 RNOR=I*RMAX*V(J+1) IF(DABS(RNOR).LE.V(J))RETURN C X=(DABS(RNOR)-V(J))/(V(J+1)-V(J)) Y=rcarry(seed) S=X+Y IF(S.GT.C2)GOTO 11 IF(S.LE.C1)RETURN IF(Y.GT.C-AA*DEXP(-.5D0*(B-B*X)**2))GOTO 11 IF(DEXP(-.5D0*V(J+1)**2)+Y*PC/V(J+1).LE.DEXP(-.5D0*RNOR**2))RETURN C 22 X=.3601016D0*DLOG(rcarry(seed)) IF(-2.D0*DLOG(rcarry(seed)).LE.X**2)GOTO 22 RNOR=DSIGN(XN-X,RNOR) RETURN 11 RNOR=DSIGN(B-B*X,RNOR) RETURN END --------------D7E541716D27F3247CF94881--