トップページ⇒tech
991コメント434KB

FORTRAN �W

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん2006/11/12(日) 17:13:35
FORTRAN総合スレッドです。
FORTRAN77/90/95/2003, HPF等、FORTRAN全般に関する話題を書き込んで下さい。

・FORTRAN関連情報
お約束だが、まずは自分で調べよう
http://www.google.co.jp/

x86で動作するFortranコンパイラ
http://www.nminoru.jp/~nminoru/programming/x86-fortran.html

The Fortran Company
http://www.fortran.com/
Polyhedron Software
http://www.polyhedron.co.uk/
Google Directory - Fortran
http://directory.google.com/Top/Computers/Programming/Languages/Fortran/

・前スレ
FORTRAN III
http://pc8.2ch.net/test/read.cgi/tech/1104724162/
FORTRAN II
http://pc5.2ch.net/test/read.cgi/tech/1068351911/
Fortran
http://pc2.2ch.net/test/read.cgi/tech/1003214738/
0855デフォルトの名無しさん2011/01/08(土) 02:07:10
>>854
DOUBLE PRECISION はFORTRAN66時代に導入された倍精度の正規の宣言法でこちらが本家。
REAL*8などはFORTRAN77時代に使われるようになった記法。
またKINDはFortran90で導入された記法。
あと4倍精度はFORTRAN77までは規格外の拡張。90以降でも必須ではない。
よってKINDの一つとして存在していてもかまわないが、quadruple precisionのような
新たな命令を期待するのはお門違いとなる。
なお現在ではKIND方式で統一するのがよろしいとされている。

とにかく50年分くらい時代をごっちゃにしている。古文・漢文のノリで66、77を学ぶが吉。



AUTODBLの件だが、歴史的にFORTRANではINTEGERと単精度REALのワード長が一致することが
(暗黙に?)要求されてきたので、上品ならざる振る舞いをしていることになっていることを指摘しておきたい。

私個人は好みの問題で使うも使わぬも勝手だと思うが、しばらく前に
gfortranだったかg95だかのデフォールトREALが倍精度8byteで、デフォールトINTEGERの
4バイトと一致していなかったために、外人のおっさんたちがBizzare野郎呼ばわりで糞味噌に罵しっていたw
非常識かつ破廉恥な猥褻物陳列レベルの振る舞いとさみなされたようだ。
たしかにCOMMON、EQUIVALENCE、ホレリス使いまくりの昔のプログラムには不都合極まりない。
0856デフォルトの名無しさん2011/01/10(月) 17:25:06
>>855
レスどうもです。つか、詳しすぎる・・・

そういえば、real(8)やreal*8の数字の意味(精度なのかバイト数なのかそれ以外か)が
きちんと規格で統一されていないという話を聞いたことが。
たとえばcomplexだと、普通はcomplex*8で単精度だけど実装によっては倍精度の場合もあるとか。
その辺の解決策としてkindが導入されたんだと思うんだけど、苦肉の策というか
あんまスマートじゃないような・・・。つーか、complex(kind(0d0)) とか長ったらしいよw
0857デフォルトの名無しさん2011/01/17(月) 19:56:03
Fortran90〜2003の和書がろくにないので洋書を買おうかと思うんですが、何かオススメないでしょうか?
基本的なことは知ってますが、あまり深くは使ってないレベルの人間です。
これ一冊ありゃOKっていうのが理想ですが・・・

Amazon.comで以下を見つけました。お持ちの方いますか?

Fortran 95/2003 Explained, Michael Metcalf (2004年)
http://www.amazon.com/Explained-Numerical-Mathematics-Scientific-Computation/dp/0198526938

Fortran 95/2003 for Scientists & Engineers, Stephen Chapman (2007年)
http://www.amazon.com/Fortran-95-2003-Scientists-Engineers/dp/0073191574/ref=pd_sim_b_3

The Fortran 2003 Handbook, Jeanne C. Adams (2008年)
http://www.amazon.com/Fortran-2003-Handbook-Complete-Procedures/dp/1846283787
0858デフォルトの名無しさん2011/01/19(水) 00:48:47
>>857
まあ概ねアマゾンの書評と同じような感想ですが

「Fortran 95/2003 Explained」
言語リファレンス代わりに使うならこれが最適。
さすがMichael Metcalfさん。その代わりサンプルコードが少なめ。

「Fortran 95/2003 for Scientists & Engineers」
サンプルコードや演習問題が多いので具体的な使い方が理解しやすい。
ただしFortran 2003で追加された機能については解説が少なめ。
ISO_C_BINDING や IEEE_* の説明が見当たらないんですが・・・
分厚いのでリファレンス代わりにするのは少々不向き。

「The Fortran 2003 Handbook」は読んだことないのでわかりません。


「〜 Explained」はF2008に対応した新しい版がもうすぐ出る・・・と思ってたら
いつの間にか発売日が7月になってるのね・・・
08598572011/01/19(水) 12:37:23
>>858
ありがとうございます。結局全部買ってしまいそうだ・・・w

>「〜 Explained」はF2008に対応した新しい版
これですね。
Modern Fortran Explained
http://www.amazon.com/Explained-Numerical-Mathematics-Scientific-Computation/dp/0199601410

というか今知ったのですが、Michael MetcalfはISOの規格メンバーなんですね。
こりゃ信頼性という意味でこの上ないですね。
0860デフォルトの名無しさん2011/01/20(木) 08:59:54
>>857
Google Booksなんかでわりと中身がのぞけたりする。

Guide to Fortran 2003 Programming, Walter S. Brainerd が割と入門者むけの古典的な教科書に近いと思う。
OOPとか2003固有の部分はそれほど多くなく、Fortran全般に書かれている。

Introduction to Programming with Fortran: with coverage of Fortran 90, 95, 2003 and 77,
Ian Chivers & Jane Sleightholme
これは、Fortran77あたりから拡張していった本なのですっきりしていない。あんま良くない。

Fortran 95/2003 for Scientists & Engineers, Stephen Chapman (2007年)
もってない。が上のIan Chiversの本と同じく、温泉旅館式の肥大化本だと思う。


Fortran 95/2003 Explained, Michael Metcalf (2004年)
1冊買うならこれかな?大概この本しか見ない。
ただ、入門者向きではない。>>858の書いているようにリファレンスに近い。
しかし、肝となる部分をがっちり書いているので便利。

The Fortran 2003 Handbook, Jeanne C. Adams (2008年)
FortranXX Explained よりもさらに言語規格書よりに書かれている。
これも入門者向きでない。辞書っぽい感じ。
08618572011/01/21(金) 22:22:14
>>860
色々とありがとうございます。まずはExplainedを買ってみます。
0862デフォルトの名無しさん2011/01/28(金) 22:24:29
はい
0863デフォルトの名無しさん2011/01/30(日) 10:16:20
いいえ
0864デフォルトの名無しさん2011/01/30(日) 12:05:30
どっちだよw
0865デフォルトの名無しさん2011/02/15(火) 13:15:27
FORTRANというとcommonブロックという言葉がセットで出てくるけど
なんだろう
0866デフォルトの名無しさん2011/02/16(水) 23:21:39
Cでガーベジコレクションが出てくるのと同じだべ?
COMMONは大域変数ではなく、自由に思いのままにガーベジコレクションのできる共有地だぜ!
0867デフォルトの名無しさん2011/02/18(金) 15:02:30
以下を、
ifort -c -warn all test.f90
でコンパイルすると、Ver.10.1だとエラーが出ないが、Ver.11.1だと
test.f90(9): error #7137: Any procedure referenced in a PURE procedure, including one referenced via a defined operation or assignmnent, must be explicitly declared PURE. [PURE_FF]
xxx = pure_ff()
というエラーが出る。規格上は、(C,F77で書かれた)外部関数はpureにできない?

!test.f90
module A
interface
elemental real(8) function pure_ff()
end function
end interface
contains
pure real(8) function xxx ()
xxx = pure_ff()
xxx = pure_ff()
end function
end module

0868デフォルトの名無しさん2011/05/02(月) 15:18:06.31
macにgfortranいれて、
ターミナルから
$ gfortran hoge.for
しました。それから$ ./a.outしてみましたが、
At line 22 of file hoge.f
Fortran runtime error: No such file or directory
22行目がおかしいってことみたいです。
本来であれば、ファイル名の入力を求められるらしいです。

しらべてみたら、.forって相当古いみたいですね。固定形式だとか。
もとはwindows用に書いたらしいのですが、OSやコンパイラの仕様に依存していたりするのでしょうか?

アドバイスよろしくお願いします。割り込みすいません。
0869デフォルトの名無しさん2011/05/02(月) 23:44:21.50
コンパイラ依存は確かにある。コンパイラを変えたらコンパイルエラーとか。
OS依存も、依存するようなコードの書き方をすれば依存する。

エラーメッセージの内容は理解できているかな?hoge.fの22行目は見てみた?
分からなければ、取り合えず22行目の前後数行をここにコピペしてみたらどうだろう。
0870デフォルトの名無しさん2011/05/03(火) 12:07:16.39
ありがとうございます。書き方によっては依存するんですね。
お言葉に甘え、hoge.fの19~26行目を張らせていただきます。

19 c
20 open(7,file='con')
21 write(7,'('' input filename'')')
22 open(8,file=' ')
23 write(7,'('' output file or devicename'')')
24 open(6,file=' ')
25 call input(ipro)
26 c

エラーに関しては、そんなファイルやディレクトリは無い!って怒ってるってことでいいんでしょうか。
取り合えず、cってのが昔のコメント行であること、openとwriteがファイル操作をしようとしてるってこと、7とか8とかが装置番号と呼ばれているってことは分かります。
0871デフォルトの名無しさん2011/05/03(火) 15:37:42.14
なんじゃこりゃ?!

ファイル名の入力を求めるメッセージを、なぜ標準出力ではなくconに書き出しているのか?
標準出力として予約されている装置番号6番が、なぜファイルとしてopenされるのか?
なぜファイル名が' 'なのか?(自分で適宜書き換えろってことなのか?
それとも、file=' 'とすると、自動的にファイル名を尋ねてくれるコンパイラがあるのか?)

22、24行目のfile=' 'を自分で書き直す必要があると思う。
おそらく8番が入力データが入ったファイルで、6番が出力を書き出すファイルだろうから、適宜じぶんで書き直して。

自分なら念のため、装置番号の使われ方を調べるために"read.*8"とか"write.*6"がコード内で使われているところを検索する。
grep -ine"read.*8" ./*.for
それを頼りに、プログラムの挙動を追跡する。macでgrepって使えるのかな?
0872デフォルトの名無しさん2011/05/03(火) 15:52:24.94
>>871
>それとも、file=' 'とすると、自動的にファイル名を尋ねてくれるコンパイラがあるのか?
良く分かんないですけど多分そうだと思います。

人のPCで実行した.exeは、

マイクロソフトかな漢字変換 バージョン2.51
(C)Copyright Microsoft Corp. 1992-1993
input filename
File name missing or blank - please enter file name
UNIT 8?

ってでます。input filenameはhoge.fにありますよね。

>適宣自分で書き直して
とありますが、ファイル名だけを指定した場合、a.outのあるディレクトリにあるファイルとして読み込まれるのでしょうか?
ま、とにかくやってみます。

どうもありがとうございます!
0873デフォルトの名無しさん2011/05/03(火) 16:13:07.68
>>871
grepなるものは分かりませんが、とりあえずエディタで検索かけてみました。

現在、hoge.fはディスクトップ上にあり、コンパイル後のファイルa.outと読み込ませたいデータB1.txtもディスクトップ上にあります。

19c
20 open(7,file='con')
21 write(7,'('' input filename'')')
22 open(8,file='B1.txt')
23 write(7,'('' output file or devicename'')')
24 open(6,file='b1.out')
25 call input(ipro)
26c

に変更してみました。
結局のところ、
At line 22 of file fem3.f
Fortran runtime error: No such file or directory
とのことです。22行目から進みません。
ていうか、なぜ、input filenameってメッセージすら出ないのか。

お手上げです。
0874デフォルトの名無しさん2011/05/03(火) 17:33:23.22
そんなときは、エラーメッセージとは関係ないところが問題になっているのかも知れない。
試しにソースコードの拡張子.fを.f90にしてコンパイルしてみて。
0875デフォルトの名無しさん2011/05/03(火) 17:36:12.73
>ていうか、なぜ、input filenameってメッセージすら出ないのか。
これは、conっていうファイルに書き込まれていないかな?
デスクトップにconっていうファイルができていると思う。
0876デフォルトの名無しさん2011/05/03(火) 17:56:02.74
>>874
.f90にしてコンパイルしてみました。結局エラーメッセージの嵐。
.fではcとすると、c言語でいう//になるみたいですが、.f90ではならないみたいです。fixcomという.fを.f90に変換するプログラムを見つけたので変換し、コンパイルしてみましたが、結果は変わらず。
At line 22 of file hoge.f90
Fortran runtime error: No such file or directory
ちなみに、変換後のコードは、ぱっと見、cを!に置き換えているだけみたいでした。

>>875
おっしゃるとおり、conってファイルができてました。
装置番号を6にかえてみましたが、ターミナルには出力されず、conってファイルができます。
0877デフォルトの名無しさん2011/05/04(水) 10:14:28.68
>>876
プログラムが極端に長くないならここに貼り付けちゃった方が早いかもよ
1行目から30行目ぐらいまででもいいけど
長文貼っても誰も怒らないしね

多分、22行目以外もバグってそう

他のモジュール(変数とかを書いておく所)を使ってグローバル変数があると面倒かな
0878デフォルトの名無しさん2011/05/04(水) 12:20:54.73
>>877
お言葉に甘えて、、、って全部で870行ぐらいあるので、、、
取り合えず、Cでいう、mainっぽいとこだけ張ります。必要があるようなら適宜。7~53行目です。

7 c main program
8 common/a/ ym1,ym2,pois1,pois2,thick,ntj,nte,npar,nst,nbc,nlc,
9 1 eqstx(5),eqsty(5),eqsts(5),mdir(5),mkind(5),jemk(600),
10 2 mtj(600,3),road(500),lc(500),mbc(500),p(800),lank(800),
11 3 disp(800),ddisp(800),foce(800),focem(800),ifail(600)
12 common/b/ ex(600),ey(600),ez(600),gxy(600),th(600),eqst(600),
13 1 sigmax(600),sigmay(600),sigmal(600),sigmat(600),
14 2 sigmaz(600),tauxy(600),tault(600),fract(600),
15 3 dela(3,3),com(3,6),elk(6,6)
16 common/c/ syk1(15000),index1(800)
17 common/d/ index2(800)
18c************************************************************************
19c
20 open(7,file='con')
21 write(7,'('' input filename'')')
22 open(18,file=' ')
23 write(7,'('' output file or devicename'')')
24 open(6,file=' ')
25 call input(ipro)
0879デフォルトの名無しさん2011/05/04(水) 12:22:57.32
続きです。
26c
27 do 1000 inc=1,nst
28c
29 write(7,50) inc
30 50 format(' **** No.',i4,' *****'/)
31c
32 call alloc
33 call clasfy
34 write(7,'('' calsyk running'')')
35 call calsyk
36c
37 do 40 i=1,2*ntj
38 foce(i)=focem(i)/nst
39 40 continue
40c
41 write(7,'('' solver running '')')
42 call solver
43 write(7,'('' result running '')')
44 call result
45 write(7,'(/)')
46c
47 if (ipro.eq.0) goto 1000
48 call output
49 1000 continue
50 if (ipro.eq.0) call output
51c
52 stop
53 end
0880デフォルトの名無しさん2011/05/05(木) 13:47:34.37
>>878
すでに、871さんが書かれているとおりです。
Fortranでは、C言語の標準入力は5番、標準出力は6番に割り当てられています。
openする必要はありません。これらは、'*'で書くことができます。
したがって、878,979の
write(7,
を、すべて、
write(*,
にすれば、画面に表示されます。

22行目、24行目のopen文でfile名を指定していないのはよくないので、
きちんとファイル名を指定して下さい。24行目についてはさらに番号を
6以外に変更して下さい。

その他、気になる点は:
47行目:この様な目的でgoto文を使用しないほうがいいでしょう。
goto文は、よっぽどのことがない限り使用しないでください。
文番号の使用も止めましょう。doループの終わりはend do文としましょう。
common文はなるべく使わないようにしましょう。

基本的に、日本でFortranと言えば、Fortran2003なので(JISでそのように
決まっている)、FORTRAN77ではなく、新しめの文法で書くのがいいと思います。

環境がmacのようですが、unix系のOSの場合には、特にファイルをopen文で
開く必要はありません。デフォルトで、例えば7番の場合はfort.7、
8番の場合はfort.8から読み書きしようとしています(コンパイラによりますが)。
プログラム実行前に、シェルスクリプトで、シンボリックリンクを使って
'fort.番号'のファイルを作っておけば問題ありません。
0881デフォルトの名無しさん2011/05/05(木) 18:20:02.26
>>880
どうもありがとうございます。
やってみます。
やはりこれはFortran77なのですね。平成元年に作成されたようです。
Fortranについて調べても、しょっぱなから違っているので途方に暮れていました。
0882デフォルトの名無しさん2011/05/05(木) 18:40:30.37
尻拭いさせられてるのか
0883デフォルトの名無しさん2011/05/05(木) 18:59:28.16
>>882
軽く説明すると、
「このソフトつかって課題やってきてね。つhoge.exe」
「(macなんですけど、、、)コードあります?」
「つhoge.f」
「gfortran hoge.fっと。コンパイルできたー。実行できないorz えーっと?Fortranなんて分からん、、、」
と、まあ、こんな感じで。
Fortranを調べてみても、明らかに違うしで困ったいた訳です。

個人的な結論は
コード自体がめっちゃ古い。
しかも環境依存くさい。
です。

みなさん、どうもありがとうございます。
0884デフォルトの名無しさん2011/05/05(木) 19:40:21.87
>>880
無事に動きました。
どうもありがとうございます。

やったあ!やったよぉ!
0885デフォルトの名無しさん2011/05/10(火) 04:05:10.32
>>884

あーあぁあ〜はじめての〜ちゅ〜
君とちゅ〜I need you for my love〜
0886デフォルトの名無しさん2011/05/10(火) 15:33:36.57
大文字じゃないのだね
0887デフォルトの名無しさん2011/05/21(土) 09:53:33.09
5 名前:名無しさん@十一周年[sage] 投稿日:2011/05/21(土) 07:37:55.67 ID:55711cMv0
(人類の歴史として語り継がれるべき事実)

【 利用基準(年間20ミリシーベルト)の責任者一覧 】
 原子力災害対策本部本部長:菅直人(最高責任者)
 原子力安全委員会委員長:斑目春樹(実質的な判断の最高責任者)
 文部科学大臣:高木義明(当該通知に関する最高責任者)
 文部科学省生涯学習政策局長:板東久美子(当該通知に関する責任者)
 文部科学省初等中等教育局長:山中伸一(当該通知に関する責任者)
 文部科学省科学技術・学術政策局長:合田隆史(当該通知に関する責任者)
 文部科学省スポーツ・青少年局長:布村幸彦(当該通知に関する責任者)

※ 後で大問題になるから、このリストはみんなで共有しよう。全世界に拡散しよう。
0888デフォルトの名無しさん2011/07/22(金) 17:06:33.14
数値計算の得意な方助言をお願いします.
微分方程式をルンゲクッタを使って解こうと考えているのですが,
通常はt→∞方向に解くところを,今回t→0方向に解きたいのです.
刻み幅h等の符号を反転しただけでは,正しい答えがでません.
ざっくり書いたので,分からないところがあればコメントをお願いします.
0889デフォルトの名無しさん2011/07/23(土) 01:33:06.53
方程式系によっては、時間を負の方向に
とると本質的に発散するよ。
物理方程式は特に。時間に関して情報量が
単調減少(非増大)なので、
遡る、という事が無理ぽな事多々。
チェックしる
0890デフォルトの名無しさん2011/07/23(土) 07:42:53.84
スレ違いかもしれませんが、ご存じの方がおりましたら教えていただけないでしょうか

http://www.ffte.jp/
上記のサイトにあるFFTのサブルーチンをMPIとOpenMPのHybridで使おうと思っています。

tarをダウンロードして、解凍し、"ffte-4.1\mpi\tests\" にあるMakefileの
FFLAGS = -O3 -fomit-frame-pointer -I../.. を
FFLAGS = -O3 -fomit-frame-pointer -I../.. -openmp -openmp-report2
と書き換えてコンパイルをしました。

実行するとセグメンテーション違反と表示されてうまくいきません
-openmp -openmp-report2 を付け加えなければうまくいきます。

どうすれ、いいか教えていただけないでしょうか
よろしくお願いします。
0891デフォルトの名無しさん2011/07/23(土) 11:43:50.25
>>889
レスありがとうございます.
そうですか...別の方向からアプローチしてみます.
0892デフォルトの名無しさん2011/07/28(木) 14:58:20.15
3年ぶりあげ
0893デフォルトの名無しさん2011/08/06(土) 16:33:15.49
LinuxでFORTRANを使う際テキストエディタでプログラムを書き
\(ユーザー名)/FORTRANに保存し端末(コマンドライン端末)を使用し
そのプログラムへの入力と実行結果を生成する
ファイルのコマンドを忘れてしまいました
どなたかわかる方はいらっしゃいますでしょうか
0894デフォルトの名無しさん2011/08/08(月) 13:33:55.54
それはemacsでしょうか。
0895デフォルトの名無しさん2011/08/10(水) 00:07:13.86
>>893
日本語でおk
0896デフォルトの名無しさん2011/08/14(日) 17:20:24.31
FORTRAN77でスタック変更ってどうやるんだ?
でっかい配列定義するとエラる
0897デフォルトの名無しさん2011/08/14(日) 17:23:40.72
>>896
コンパイラの問題だから、一般解はない。マニュアルを見るしかない。
0898デフォルトの名無しさん2011/08/15(月) 07:44:26.69
unlimit
ulimit
ためすか、何か環境変数いじれば動くことがある、アル
0899デフォルトの名無しさん2011/08/16(火) 19:32:51.42
allocate文で動的に確保した変数っていつまで生き残りますか?

allocatable属性を指定した変数を宣言したプログラム単位の終わりまで来たら
自動的にdeallocateされるものですか?
0900デフォルトの名無しさん2011/08/16(火) 20:37:08.77
ALLOCATABLE 属性の配列でF95以降ならそうかな。F90の場合はそうではなかったような気がする。
F90からF95へのマイナー改訂で不便が無くなった記憶がある・・・
POINTERの時は解放されなかったと思う。

間違ってたらゴメンwww謝罪はしても賠償はしない
0901デフォルトの名無しさん2011/08/16(火) 20:51:47.70
ありがとうございます

さらにいくつか質問させてください

リスト構造を作ってなんらかの処理をするsubroutineを作り、
そのsubroutineをdoループで何度も呼び出すようなプログラムを考えています

allocateした変数が自動的に解放されないと仮定すると、

�@subroutine呼び出すたびに使用しているメモリが増えて最終的にプログラムがストップすることになりますか?
�Aもしそうならsubroutineの最後でリスト構造を辿りながら手動でdeallocateしないといけないことになりますか?

�B「allocatable属性を指定した変数を宣言したプログラム単位の終わりまで来たら自動的にdeallocateされるのかどうか」
を確かめる簡単な方法はありませんか?


よろしくお願いします。
0902デフォルトの名無しさん2011/08/16(火) 22:03:42.77
>>901
1.そういうことになる。いわゆる memory leak と呼ばれる状況。
2.そうなる。
3.1回試すだけなら、でっかい配列を allocate して、システムモニターやpsコマンドなどでメモリー使用量の変化を
  見てみればいい。

たぶん、最近の Fortran コンパイラは皆 F95 だから、ローカルに確保された ALLOCATABLE は自動解放されると思う。
0903デフォルトの名無しさん2011/08/16(火) 22:06:17.75
ただ同じ SUBROUTINE を何度も呼び出すつもりなら、もし前回解放されていなければ、
二回目は ALLOCATE できないと思う。
そういう場合配列の STATUS が不定なので、動作が処理系に依存しそうで断言できないが。
0904デフォルトの名無しさん2011/08/16(火) 22:38:39.47
ありがとうございます

使っているコンパイラはintelです

確認してみます。
ありがとうございました
0905デフォルトの名無しさん2011/08/18(木) 23:57:28.90
integer*4 gen(10)

の( )の中の数字ってなんですか?

初心者用参考書だと使ってなくて解説ないし
難しい参考書だと当たり前のように使ってるし

fortranって両極端ですね
0906デフォルトの名無しさん2011/08/19(金) 00:23:14.76
配列の要素数
09079042011/08/19(金) 10:43:45.35
どうやらallocatable属性だとdeallocateされて
pointer属性だとdeallocateされないみたいです
0908デフォルトの名無しさん2011/08/19(金) 11:50:36.72
>>907
Fortran95の動作だとそうなると思います。
0909デフォルトの名無しさん2011/11/15(火) 01:30:19.44
gfortran, バージョン4:4.4.5-1 に関する質問です。

モジュールのバージョンが違うとかで下記のエラーメッセージが出てきます。
Fatal Error: Parse error when checking module version for file 'functions.mod'

これってどう解決すればいいですか?
0910デフォルトの名無しさん2011/11/15(火) 02:02:21.33
くだらない質問のようなのでくだ質に移動します
0911デフォルトの名無しさん2011/11/19(土) 16:31:55.93
いう
0912デフォルトの名無しさん2011/11/19(土) 18:35:25.27
>>911
http://hibari.2ch.net/test/read.cgi/tech/1261676778/213
http://hibari.2ch.net/test/read.cgi/tech/1272358443/83
http://hibari.2ch.net/test/read.cgi/tech/1321350331/22
http://hibari.2ch.net/test/read.cgi/tech/1318935200/82
http://hibari.2ch.net/test/read.cgi/tech/1290415962/444
http://hibari.2ch.net/test/read.cgi/tech/1314133332/444
http://hibari.2ch.net/test/read.cgi/tech/1315141054/25
http://hibari.2ch.net/test/read.cgi/tech/1321282584/4
http://hibari.2ch.net/test/read.cgi/tech/1156332916/186
http://hibari.2ch.net/test/read.cgi/tech/1177431417/279
http://hibari.2ch.net/test/read.cgi/tech/1295493964/744
http://hibari.2ch.net/test/read.cgi/tech/1300000513/237
http://hibari.2ch.net/test/read.cgi/tech/1163319215/911
0913デフォルトの名無しさん2011/12/31(土) 11:50:50.12
任意のリスト構造に対して
そのリストの内容を表示したり、リストを消したりするsubroutineを作るには
どうすればいいですか?


単方向リストを取り扱っています

subroutineにリストのrootを渡して
そのリストの内容を表示したり、リストを消したりしたいと思っています

しかし、リスト構造のtypeをあらかじめ知っていないと
subroutine側で仮引数を宣言できません

そうなるとtype毎にsubroutineを作らなければいけなくなります


そこで質問なのですが

任意のリスト構造に対して
そのリストの内容を表示したり、リストを消したりするsubroutineを作るには
どうすればいいですか?
0914デフォルトの名無しさん2011/12/31(土) 12:33:24.54
Fortran2003のclass(*)を使え。
0915デフォルトの名無しさん2011/12/31(土) 12:44:27.73
ぐぬぬ・・・
Fortran90がええのです・・・

とりあえず90じゃできないってことで理解します
お早い回答ありがとうございました
0916デフォルトの名無しさん2011/12/31(土) 17:40:16.11
>>915
どうしてもというなら、こういう論文がある。
A generic linked list implementation in Fortran 95
http://dl.acm.org/citation.cfm?id=1667141&CFID=75955509&CFTOKEN=91048213
内容はよく覚えていないが、確かTRANSFER関数で、ポインターを整数かなんかにいれて誤魔化してたと思う。

Fortran90/95はALGOL的になって、静的型チェックを厳しくしたから、任意構造を扱うには邪道をゆくしか無いと思う。
というわけでEQUIVALENCE的な意味でTRANSFER関数を使うしか無いんだと思う。
0917デフォルトの名無しさん2012/01/02(月) 18:59:30.43
ポインタを配列で用意したいんですけど、できませんか?

ポインタ配列ってのはあるみたいなんですけど
これは部分配列を作るのに使うみたいです

単純にポインタを整数で添字付けて
一度にたくさん用意したいだけなんですが
0918デフォルトの名無しさん2012/01/02(月) 21:31:26.40
>>917
出来ない。
ポインターを要素に持つ構造体を定義して、その構造体の配列を作るのが定石。
0919デフォルトの名無しさん2012/01/02(月) 22:09:01.22
なるほど、ありがとうございます

さらに質問したいのですが、

サブルーチンにポインタを渡す際に、直接渡すとエラーが出てしまいます

一時的に作ったポインタで、渡したいポインタの指している実体を指して
その一時的に作ったポインタをサブルーチンに渡すと上手く行きます。

要するに、下のコメントアウトしてるのだと上手く行くけれど
コメントアウトしていないものだとglibc detected とかいうエラーが出ます。

これはなんででしょうか?

implicit none
type(particle),pointer :: dumwork
type(particle),pointer :: tmpwork,aaa

! aaa=>dumwork
! call PrintParticleList(aaa,6)
call PrintParticleList(dumwork,6)

ソースファイルを以下のアップローダーに一週間ほど上げて起きますので
どなたかよろしくお願いします。
pmod.f90 の92行目と93行目です。
ttp://www1.axfc.net/uploader/Sc/so/306203
0920デフォルトの名無しさん2012/01/02(月) 22:51:02.65
すいません、上の質問を取り下げます

まだよく分かってないのですが
どうにも別のところに原因があって、エラーが出てるようです
0921デフォルトの名無しさん2012/01/02(月) 23:00:47.79
>>919
コンパイルは出来たぞ。Intel ifort 12.0.5.221
互換性チェックでもf95規格違反は見当たらない。
実行時エラーが問題なら、簡単なメインプログラムも頼む。
09229212012/01/02(月) 23:04:41.86
ごめ、行き違いになったwww
0923デフォルトの名無しさん2012/01/02(月) 23:29:25.71
やっぱり、サブルーチンにポインタを渡す際に

直接渡すのと、別のポインタを使って間接的に渡すのことで違いが出ます。
なんでかは分かりません。

現在、以下の作業をしています。

2次元の粒子の座標を10個用意する
それを単方向リストにする  subroutine AddParticleList
リストを表示する        subroutine PrintParticleList
リストを解放する        subroutine FreeParticleList

これらを10回繰り返します

二つのparticle typeのポインタを用意して
type(particle),pointer :: proot, pwork

prootをallocateしました。

上に書いた3つのサブルーチンにポインタを渡す際に
pwork=>prootととして、pworkを渡した時と
prootを直接渡した時で異なる3つの結果がでます
0924デフォルトの名無しさん2012/01/02(月) 23:40:42.13
3つの結果は
�@一回目は上手くいくが、二回目はリストが解放されず、三回目で止まる
�Aうまくいく
�B十回全てで、リストは表示されるが、解放はされない

Add、Print、Freeに対するworkとrootの組み合わせをまとめると
(A, P, F)=
�@(w, w, w)、(r , w, w)
�A(w, w, r )、(r , w, r )
�B(w, r , r )、(r , r , w)、(r , r , r)
です

ソースファイルは以下のURLです
どなたかよろしくお願いします

ttp://www1.axfc.net/uploader/Sc/so/306237
パスはfortranです

コンパイルするのは source comp です。
問題の箇所はtmod.f90の36行目あたりです。
0925デフォルトの名無しさん2012/01/03(火) 00:44:19.78
>>924
組み合わせというのがいまいちよく分からんのだが、
subroutine PrintParticleList(dumwork,filenum) で引数 dumwork が書き換えられて、リストの最後まで行ったまま返されるので、
解放しようにもできないように見える。
subroutine AddParticleList(dumwork,dumi,dumrr) でのように一旦テンポラリに入れないと駄目なのではないか?

あと、module tmod で、 np が real(dp),parameter :: np=10 と実数になってるが INTEGER の間違いじゃないか?
まぁ動くが規格からは外れている。
0926デフォルトの名無しさん2012/01/03(火) 01:30:34.90
fortranは値渡しじゃなくてアドレス渡しだから

ポインタをサブルーチンに渡して、
サブルーチンの中で指してる実体が変わると
サブルーチンを出たあとでも変わったまま

という理解でいいんでしょうか


組み合わせというのはsubroutineに渡す引数の組み合わせのことで

例えば
call AddParticleList(pwork, tmpnum, tmprr )
call PrintParticleList(proot, 6)
call FreeParticleList(proot)
と書いた時は

(A, P ,F)=(w, r , r )で
結果は�Bの
十回全てで、リストは表示されるが、解放はされない
となる。
というつもりです。

また、指摘された通り
subroutine PrintParticleList(dumwork,filenum)
でdumworkをtmpworkに入れるように書き換えて見ましたが
引数の組み合わせによっては>>924に書いた�@と�Aの
どちらかの結果になります。
0927デフォルトの名無しさん2012/01/03(火) 02:02:18.49
>>926
そうFORTRANは参照渡し。F2003なら値渡しにもできるが・・(ポインタはできないかな)。

組み合わせを変えたときに、最後のdeallocateの名前も変えるとか(サブルーチンで尻までポインタが移動しているため)、
きっちり整合していないからエラーが出るのでは?見た感じ問題なく動いているぞよ。内容を問わずに見た目だけだがwww

サブルーチンごとに、引数のポインターが変更されては困るものと、変更されないと困るものが混じっている。
その辺で混乱しているのでは?

例(w,w,w)の時

pwork => proot
do i=1,np
tmpnum=i
tmprr(1:2)=rr(1:2,i)
call AddParticleList(pwork,tmpnum,tmprr)
end do

! pwork=>proot
call PrintParticleList(pwork,6)

! pwork=>proot
call FreeParticleList(pwork)

! deallocate(proot,stat=i)
deallocate(pwork,stat=i)
0928デフォルトの名無しさん2012/01/03(火) 04:51:51.85
>>927
解決できました!
ありがとうございます
0929デフォルトの名無しさん2012/01/03(火) 13:41:00.19
コード全く見てないけど、大きめに配列切っとけばいいんじゃないかしら?
メモリがかつかつと言うのなら仕方ないけど。
0930デフォルトの名無しさん2012/02/19(日) 02:02:25.68
てst
0931デフォルトの名無しさん2012/03/01(木) 07:57:57.88
スレ違いで大変申し訳ないのですが,このFortranスレなら
知ってる人がいるかもと思い,書きこませていただきます。

Fortran の後継言語として SUN が開発していた Fortress って,
今どうなっているのでしょうか?
ググっても2008年3月31日現在の仕様書(Ver.1.0) より新しい情報が
見つかりません。

開発中止?
0932デフォルトの名無しさん2012/03/01(木) 16:11:28.68
とりあえずここが現在のプロジェクトサイトのようなんだが、
ここは確認した? ttp://projectfortress.java.net/
0933デフォルトの名無しさん2012/03/01(木) 17:55:53.39
>>932
見たのは多分初めてです。ありがとうございました。

# それにしても,英単語をそのまま言語名にされると,
   うまく検索できないですね。" Fortran " みたいに
   造語にしてくれると検索しやすいのに‥‥     σ(-_-;)
09349332012/03/01(木) 18:05:23.12
「見たのは多分初めて」と書きましたが,英語版の Wikipedia の
Fortress (programming language) ページからリンクが張られていましたね。
きっと,見たんだけど,よく見てなかったというパターンです。
お騒がせして,すみませんでした。
0935デフォルトの名無しさん2012/03/01(木) 18:30:12.25
下手に幅広く探さず、この例の場合なら site:sun.com か site:oracle.com を付けて、
有用度の高そうな情報を重点的に探すとかするとうまくいく(こともある)。
0936デフォルトの名無しさん2012/03/01(木) 22:20:28.28
おぼろげな記憶だから、細部は正確ではないが・・・
Fortress は、IBM,SUN,CRAYがそれぞれ米政府の次世代並列言語として
開発していたものの一つで、SUNはコンペに負けた。
X10とかChapelとかが競っていたような。これらもどうなったのかよく知らん。
UPC(Cの系統だが)とCAF(これはF2008に規格として入った)は地道に進んでいる

コンペに負けた頃に大々的に公開されてニュースになった。
SUNがコンペに負けた時点でもう開発中止に近いのでは。
SUN自体もオラクルに買収されたし。

Fortranの後継などと言われるが、それは(コンペ用の?)煽り文句で
JAVAの上にテスト実装されている状態では物好き言語マニア以外触らんだろう。

GuySteeleJr.も外の世界ではカリスマかもしれんが、Fortranの世界では
せいぜいイマイチだったHPFの規格をつくった人、くらいのイメージだし。
09379332012/03/02(金) 08:48:59.25
>>935
なるほど,そうすればいいのですね (^ ^)

>>936
詳しい情報,ありがとうございます。
昨日,Amazon で見つけたんですが,去年の8月に
”Fortress (Programming Language) ”という洋書が出版されていました。
もしかして巻き返しを図っているんでしょうか (・_・)?
0938デフォルトの名無しさん2012/03/03(土) 10:40:15.77
テスト
0939デフォルトの名無しさん2012/03/03(土) 11:03:36.44
>>937
その本だけど、wikipediaとかをプリントしただけの本みたいよ。
なんかしらんけど、最近wikipediaとかネット情報丸コピーの100~200ページの妙に値段の高いオンデマンド出版本が山のように出ている。
詐欺なのか何なのか知らんがw
0940デフォルトの名無しさん2012/03/03(土) 12:10:42.33
とりあえず出版社名でググるように注意したほうがいいな。
ていうか、その本、「(Programming Language)」ってウィキペディアの記事名まんまじゃねぇかw

あと Fortress は日本語の本が俺の知ってる限りで 1 冊出てる。一応それなりの内容。
0941デフォルトの名無しさん2012/03/03(土) 13:36:41.17
前に、FORTRAN本探していた時に山のように出会ったのがこのネット丸写しオンデマンド詐欺本w
電子出版はせずサンプル立ち読みもさせないし値段が妙に高いから、プリント+バインドサービスとも思われぬ。
表紙絵を見ればとりあえず区別がつく。
Germain Adriaan 編集 
Brev Publishing 出版
ぐぐっても情報でない。

しかし、アマゾンが結構在庫を持っている所を見ると、こういうインチキ本を作って、機械的に在庫を買う
アマゾンとか大手小売に売りつける手口は、新世代詐欺のビジネススキームとしてありかもしれないw
ソフトバン○とかが始めそうw
09429332012/03/03(土) 17:59:25.10
>>939-941
重要な情報,ありがとうございました。
昨日,Amazonで注文したのですが,今,慌ててキャンセルしました。
言われてみれば確かに,表紙には

High Quarity Content by WIKIPEDIA articles!

と書いてあるし,裏表紙にも

Please note that the content of this book primarily consists of
articles available from Wikipedia or other free sources online.

と書いてありました。まったく大損するところでした。
自分のメディア・リテラシーの低さを自覚しました‥‥。
ともあれ,アドバイスして下さり,本当にありがとうございました!
0943デフォルトの名無しさん2012/03/06(火) 20:11:36.89
Windows用の HPFってないんでしょうか?
0944デフォルトの名無しさん2012/03/06(火) 22:28:46.61
はい
0945デフォルトの名無しさん2012/03/06(火) 22:48:57.51
>>943
富士通だったかがHPFをMPIに変換するトランスレータをフリーで供給していた記憶がある。
もしかしたらLinuxだったかもしれない。

あとPGIのFortranCompilerの古いヴァージョンはHPFに対応していた。今のもしているかも。
09469432012/03/07(水) 17:23:19.93
>>944-945
お答え,ありがとうございました m(_ _)m"
0947デフォルトの名無しさん2012/03/08(木) 00:08:02.12
∬dxdy[0:pi][0:pi]f(x)f(y)*(erf(a|x-y|)/|x-y|)
f(x) = x^2+1
f(y) = sin(x)
の積分をするにはどのようにプログラムすればいいでしょうか?

1, 変数を変換して積分 x-y = r
2, そのまま積分

どちらでやればいいでしょうか?
もしかしてどちらでもできますか?
0948デフォルトの名無しさん2012/03/14(水) 12:35:28.45
フォートラン in 原発?
0949デフォルトの名無しさん2012/03/14(水) 22:46:09.43
電力はFORTRAN。
社会保険庁の年金システムもFORTRAN。 
何年か前にANAがシステム入れ替えで発券機トラブルを起こしたけど、元の問題なく動いていたのはFORTRANだお。
0950デフォルトの名無しさん2012/03/14(水) 23:09:55.88
フォートラン光
0951デフォルトの名無しさん2012/03/14(水) 23:32:06.21
なぜか東八郎がおもいうかんだ
0952デフォルトの名無しさん2012/03/28(水) 23:46:43.47
「n個のデータを大きさの順番に並び替えたときに、同じ値が連続して出現する個数とその組数を出力」したいのですが
並び替えの後、エラトステネスのふるいの要領で求める値を出すプログラムを作ろうとしたところで頭がごちゃごちゃになって挫折しました

初心者が、求める結果の出せるプログラムを書くにはやはり参考書やネットの入門編を1から読んでFORTRANの体系のようなものから学ぶしかないのでしょうか。
自分の今まで作ったものとは全く異なる文章をプログラミングの上級者がプログラムにどうやって変換しているのか、そのプロセスというかコツをもしよければ教えてください。

息抜きがてらの愚痴ですみませんがお願いします
0953営利利用に関するLR審議中@詳細は自治スレへ2012/03/29(木) 00:55:31.20
> 初心者が、求める結果の出せるプログラムを書くにはやはり参考書やネットの入門編を1から読んで
> FORTRANの体系のようなものから学ぶしかないのでしょうか。

全然何もしてないなら、それはやるべきだが。
アルゴリズムの勉強と、それをFORTRANで書く勉強とは別だからねー
前者ができていれば、極端な話、後者は泥縄でもいいんだけど
09549522012/03/29(木) 01:36:02.22
>>953
やはりアルゴリズムの勉強がやや不足してたようで、
そこをはっきりさせてから書くようにしたら何とか出来そうです。

プログラミングに触れるのはFORTRANが初めてでアルゴリズムを勉強する、という意識がそもそもありませんでした…
(ifやdo文を覚えるだけで後は皆さん自力で何とかしてるものとorz
初歩の初歩ですが自分の躓いている所がはっきりしました、大変助かりました
レス数が950を超えています。1000を超えると書き込みができなくなります。