おそらくFortran77固定形式で記述されているソースコードを入手しました。プログラム本体はscatmidp.f
で、*.def
ファイルはscatmidp.f
で用いられる変数を記述したファイル(オブジェクト・ライブラリ?)のようです。
zsh
1$ ls 2 scatcomm.def scatmemo.def scatmidp.f scatothe.f scatuser.def 3 4$ vi scatmidp.f 5 1 c renormalized multiple-scattering theory of photoelectron 6 2 c diffraction 7 3 c main program 8 4 program scat 9 5 > include 'scatcomm.def' 10 6 > integer i,datakind,begrow,linenum,kerror 11 7 > integer error(100) 12 8 > character*20 name 13 9 > character*80 namerror(40) 14 10 15 11 > filenum=1 16 12 > open (unit=10,file='scatin.txt',status='old') 17 13 > read(10,*) datakind,begrow,linenum 18 14 > if ((datakind .lt. 740) .or. (datakind .ge. 760)) goto 310 19 15 > do 220 i=2,begrow-1 20 16 > read(10,*) 21 17 220>continue 22 18 > do 230 i=1,linenum 23 19 > read(10,*) name,stfile(filenum) 24 20 > if ((name(1:1) .eq. 'e') .or. (name(1:1) .eq. 'E')) then 25 21 > totfile=filenum-1 26 22 > goto 240 27 23 > elseif (((name(1:1) .eq. 'p') .or. (name(1:1) .eq. 'P')) 28 24 + .and. (filenum .eq. 1)) then 29 25 > stfile(filenum)='scatin.txt' 30 26 > totfile=filenum 31 27 > goto 240 32 28 > elseif (((name(1:1) .eq. 'i') .or. (name(1:1) .eq. 'I')) 33 29 + .and. (filenum .lt. 100)) then 34 30 > totfile=filenum 35 31 > filenum=filenum+1 36 32 > endif 37 33 230>continue 38 34 240>close(unit=10) 39 35 > if (totfile .lt. 0) goto 310 40 36 > call intadjust(totfile,0,99) 41 37 > call filecheck(kerror) 42 ︙ 43 44$ vi scatothe.f 45 46 1 c This file is for all Fortran compilers without date and time function 47 2 48 3 c get the current date and time (Other Version) 49 4 subroutine askdatime(timenow,timecpu) 50 5 > implicit none 51 6 > character*24 timenow 52 7 > character*80 timecpu 53 8 54 9 > timenow='unknown' 55 10 > timecpu='was made on an unknown computer' 56 11 57 12 > return 58 13 end 59 14 c end of askdatime 60 61$ vi scatcomm.def 62 63 1 > include 'scatuser.def' 64 2 > integer totmem 65 3 > include 'scatmemo.def' 66 4 > integer linitial,natoms,katoms,eatoms,lnum,llnum, 67 5 + nfit,nfollow,mlnum,nlnum,nlfnum,rmnum,cmnum,nphase, 68 6 + nradma,ncurve,nkout,ndtheta,ndphi,ndangle,npoint,neout, 69 7 + netheta,nephi,neangle,npexp,nscatter,nscorse,nmuleven, 70 8 + ndetec,nfchi,nsymm,numsad,rotanum,sphenum,thernum,agenum, 71 9 + elenum,delnum,trynum,filenum,layem,totlayer,totfile, 72 10 + msorder,raorder,dispmode,dispbatch,scanmode,finals, 73 11 + fitmode,fitmath,trymax,normal,nodek,nodet,nodep,baknodes 74 12 > integer sizechar,sizeint,sizereal,sizecomp, 75 13 + lengdash,lengvers,lengroup,lengacom,lengbcom,lengcopy, 76 14 + lengvg 77 ︙
調べてみると現在ではFortranのgoto
文は廃止事項のようですし、どうやらいろいろと現代向けに修正を加える必要がありそうなのでFortran90に変換しようと考えました。Fortran77をFortran90に変換するプログラムとしてfixcon.f90
が以下のページに公開されていましたのでそれを用いました。
zsh
1$ ./a.out scatmidp.f scatmidp.f90 2 31 August 2019 8:31:12.102 PM 4 5FIXCON 6 FORTRAN90 version 7 Read a file with FORTRAN77 style continuation lines; 8 Write the information with FORTRAN90 continuation. 9 10FIXCON 11 Read F77 file: "scatmidp.f". 12 Write F90 file: "scatmidp.f90". 13 14FIXCON - Warning! 15 This file contains TAB characters. 16 They will be replaced by 6 blanks. 17 The results may not be what you want. 18 19FIXCON 20 Normal end of execution. 21 22 1 August 2019 8:31:12.112 PM 23 24$ ./a.out scatothe.f scatothe.f90 251 August 2019 8:32:26.610 PM 26 27FIXCON 28 FORTRAN90 version 29 Read a file with FORTRAN77 style continuation lines; 30 Write the information with FORTRAN90 continuation. 31 32FIXCON 33 Read F77 file: "scatothe.f". 34 Write F90 file: "scatothe.f90". 35 36FIXCON - Warning! 37 This file contains TAB characters. 38 They will be replaced by 6 blanks. 39 The results may not be what you want. 40 41FIXCON 42 Normal end of execution. 43 44 1 August 2019 8:32:26.612 PM
警告が出ましたがとりあえず無視してコンパイルしてみたところ、大量のエラーが出てしまいました。
zsh
1$ gfortran scatmidp.f 2 3︙ 4Error: Symbol 'nscatter' at (1) has no IMPLICIT type; did you mean 'scatpar'? 5scatmidp.f90:6194:30: 6 7 6194 | complex muleven(nmuleven) 8 | 1 9Error: Symbol 'nmuleven' at (1) has no IMPLICIT type; did you mean 'muleven'? 10scatmidp.f90:6196:29: 11 12 6196 | complex muldetec(delnum,natoms,natoms) 13 | 1 14Error: Symbol 'delnum' at (1) has no IMPLICIT type; did you mean 'alnum'? 15scatmidp.f90:6195:26: 16 17 6195 | complex agexp(agenum) 18 | 1 19Error: Symbol 'agenum' at (1) has no IMPLICIT type; did you mean 'alnum'? 20scatmidp.f90:6347:22: 21 22 6347 | if (((finals .eq. 1) .and. (alf .eq. ali-1)) .or. & 23 | 1 24Error: Symbol 'finals' at (1) has no IMPLICIT type; did you mean 'gals'? 25scatmidp.f90:6207:18: 26 27 6207 | ali=linitial 28 | 1 29Error: Symbol 'linitial' at (1) has no IMPLICIT type; did you mean 'linatom'? 30scatmidp.f90:6192:49: 31 32 6192 | integer scatadd(natoms,natoms,natoms,numsad) 33 | 1 34Error: Symbol 'numsad' at (1) has no IMPLICIT type 35
おそらくはscatcomm.def
の中に記述されている変数を、scatmidp.f
が認識できないためだと思われます。どのようにすればコンパイルが出来るのか全くわからずに困り果てております。fortranにお詳しい方、解決策を教えていただけないでしょうか。よろしくお願い致します。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。