質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

Fortran77固定形式で書かれたソースコードをFortran90に変換しコンパイルしたい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,603
退会済みユーザー

退会済みユーザー

おそらくFortran77固定形式で記述されているソースコードを入手しました。プログラム本体はscatmidp.fで、*.defファイルはscatmidp.fで用いられる変数を記述したファイル(オブジェクト・ライブラリ?)のようです。

$ ls
 scatcomm.def scatmemo.def scatmidp.f   scatothe.f   scatuser.def

$ vi scatmidp.f
   1 c     renormalized multiple-scattering theory of photoelectron
   2 c       diffraction
   3 c     main program
   4       program scat
   5 > include 'scatcomm.def'
   6 > integer i,datakind,begrow,linenum,kerror
   7 > integer error(100)
   8 > character*20 name
   9 > character*80 namerror(40)
  10
  11 > filenum=1
  12 > open (unit=10,file='scatin.txt',status='old')
  13 > read(10,*) datakind,begrow,linenum
  14 > if ((datakind .lt. 740) .or. (datakind .ge. 760)) goto 310
  15 > do 220 i=2,begrow-1
  16 >   read(10,*)
  17 220>continue
  18 > do 230 i=1,linenum
  19 >   read(10,*) name,stfile(filenum)
  20 >   if ((name(1:1) .eq. 'e') .or. (name(1:1) .eq. 'E')) then
  21 >     totfile=filenum-1
  22 >     goto 240
  23 >   elseif (((name(1:1) .eq. 'p') .or. (name(1:1) .eq. 'P'))
  24      +      .and. (filenum .eq. 1)) then
  25 >     stfile(filenum)='scatin.txt'
  26 >     totfile=filenum
  27 >     goto 240
  28 >   elseif (((name(1:1) .eq. 'i') .or. (name(1:1) .eq. 'I'))
  29      +      .and. (filenum .lt. 100)) then
  30 >     totfile=filenum
  31 >     filenum=filenum+1
  32 >   endif
  33 230>continue
  34 240>close(unit=10)
  35 > if (totfile .lt. 0) goto 310
  36 > call intadjust(totfile,0,99)
  37 > call filecheck(kerror)
  ︙

$ vi scatothe.f

  1 c     This file is for all Fortran compilers without date and time function
  2
  3 c     get the current date and time (Other Version)
  4       subroutine askdatime(timenow,timecpu)
  5 > implicit none
  6 > character*24 timenow
  7 > character*80 timecpu
  8
  9 > timenow='unknown'
 10 > timecpu='was made on an unknown computer'
 11
 12 > return
 13       end
 14 c     end of askdatime

$ vi scatcomm.def

  1 > include 'scatuser.def'
  2 > integer totmem
  3 > include 'scatmemo.def'
  4 > integer linitial,natoms,katoms,eatoms,lnum,llnum,
  5      +    nfit,nfollow,mlnum,nlnum,nlfnum,rmnum,cmnum,nphase,
  6      +    nradma,ncurve,nkout,ndtheta,ndphi,ndangle,npoint,neout,
  7      +    netheta,nephi,neangle,npexp,nscatter,nscorse,nmuleven,
  8      +    ndetec,nfchi,nsymm,numsad,rotanum,sphenum,thernum,agenum,
  9      +    elenum,delnum,trynum,filenum,layem,totlayer,totfile,
 10      +    msorder,raorder,dispmode,dispbatch,scanmode,finals,
 11      +    fitmode,fitmath,trymax,normal,nodek,nodet,nodep,baknodes
 12 > integer sizechar,sizeint,sizereal,sizecomp,
 13      +    lengdash,lengvers,lengroup,lengacom,lengbcom,lengcopy,
 14      +    lengvg
 ︙

調べてみると現在ではFortranのgoto文は廃止事項のようですし、どうやらいろいろと現代向けに修正を加える必要がありそうなのでFortran90に変換しようと考えました。Fortran77をFortran90に変換するプログラムとしてfixcon.f90が以下のページに公開されていましたのでそれを用いました。

fixcon.f90

$ ./a.out scatmidp.f scatmidp.f90

1 August 2019   8:31:12.102 PM

FIXCON
  FORTRAN90 version
  Read a file with FORTRAN77 style continuation lines;
  Write the information with FORTRAN90 continuation.

FIXCON
  Read F77 file:  "scatmidp.f".
  Write F90 file: "scatmidp.f90".

FIXCON - Warning!
  This file contains TAB characters.
  They will be replaced by 6 blanks.
  The results may not be what you want.

FIXCON
  Normal end of execution.

 1 August 2019   8:31:12.112 PM

$ ./a.out scatothe.f scatothe.f90
1 August 2019   8:32:26.610 PM

FIXCON
  FORTRAN90 version
  Read a file with FORTRAN77 style continuation lines;
  Write the information with FORTRAN90 continuation.

FIXCON
  Read F77 file:  "scatothe.f".
  Write F90 file: "scatothe.f90".

FIXCON - Warning!
  This file contains TAB characters.
  They will be replaced by 6 blanks.
  The results may not be what you want.

FIXCON
  Normal end of execution.

 1 August 2019   8:32:26.612 PM


警告が出ましたがとりあえず無視してコンパイルしてみたところ、大量のエラーが出てしまいました。

$ gfortran scatmidp.f

︙
Error: Symbol 'nscatter' at (1) has no IMPLICIT type; did you mean 'scatpar'?
scatmidp.f90:6194:30:

 6194 |       complex muleven(nmuleven)
      |                              1
Error: Symbol 'nmuleven' at (1) has no IMPLICIT type; did you mean 'muleven'?
scatmidp.f90:6196:29:

 6196 |       complex muldetec(delnum,natoms,natoms)
      |                             1
Error: Symbol 'delnum' at (1) has no IMPLICIT type; did you mean 'alnum'?
scatmidp.f90:6195:26:

 6195 |       complex agexp(agenum)
      |                          1
Error: Symbol 'agenum' at (1) has no IMPLICIT type; did you mean 'alnum'?
scatmidp.f90:6347:22:

 6347 |           if (((finals .eq. 1) .and. (alf .eq. ali-1)) .or. &
      |                      1
Error: Symbol 'finals' at (1) has no IMPLICIT type; did you mean 'gals'?
scatmidp.f90:6207:18:

 6207 |       ali=linitial
      |                  1
Error: Symbol 'linitial' at (1) has no IMPLICIT type; did you mean 'linatom'?
scatmidp.f90:6192:49:

 6192 |       integer scatadd(natoms,natoms,natoms,numsad)
      |                                                 1
Error: Symbol 'numsad' at (1) has no IMPLICIT type

おそらくはscatcomm.defの中に記述されている変数を、scatmidp.fが認識できないためだと思われます。どのようにすればコンパイルが出来るのか全くわからずに困り果てております。fortranにお詳しい方、解決策を教えていただけないでしょうか。よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

FORTRAN77 は Fortran90 に完全に内包されている。
そのまま使えばよい。

今起きているエラーは、include 文で読み込むようになっている変数宣言の問題のようだが、include文はFORTRAN77の規格外のベンダー拡張だ。(まあ事実上すべてのコンパイラが対応してはいるが)変換プログラムが対応していないのだろう。

どうしてもというなら、include しているものを手動で展開する手もあるが、みたところ量も多いのでやめた方がいいだろう。

新しく書き始めるならともかく、無理していじる必要はない。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/02 13:28

    御回答ありがとうございます。
    gfortranでscatmidp.fをコンパイルしようとすると"Undefined symbols for architecture x86_64"のエラーが帰ってくるため、「ソースの形式が古いからエラーが起こるのかもしれない」と素人ながら考え、ソースを90形式に変換すれば解決するかもしれないと思ったためです。
    そもそもコンパイルがうまく行っていないためそこの解決を目指すべきでした。反省しております。

    キャンセル

  • 2019/08/02 17:14

    たぶん、コンパイル時に include ファイルを指定してやる必要があるはずです。MAKEFILE が無いようなので、README とかに書いてあるのではないかと思います。
    gfortran のコマンドラインで include ファイルを指定するのは、めんどくさいらしいので、がんばってください。

    キャンセル

+1

短いので、自分の出来る言語で書き直した方が良いのでは?
Fortran知らなくても読める程度だし。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

検索したらこんなのが出てきましたが。私も学生時代にやって以来なので忘れてます(汗
[FORTRAN 77のコードをFortran 90に自動で変換する方法]
http://fluidmechanics.blog61.fc2.com/blog-entry-52.html

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る