X



くだすれFORTRAN(超初心者用)その6

■ このスレッドは過去ログ倉庫に格納されています
2012/08/16(木) 20:58:00.31
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。

●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。

●前スレ
くだすれFORTRAN(超初心者用)その5
http://toro.2ch.net/test/read.cgi/tech/1269704830/

●過去スレ
くだすれFORTRAN(超初心者用)その4
http://pc12.2ch.net/test/read.cgi/tech/1232789521/
くだすれFORTRAN(超初心者用)その3
http://pc11.2ch.net/test/read.cgi/tech/1196384126/
くだすれFORTRAN(超初心者用)その2
http://pc11.2ch.net/test/read.cgi/tech/1164121236/
くだすれFORTRAN(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1138063703/
2014/06/02(月) 01:57:55.06ID:GuhykFKN
プログラム作成者が存在するなら、現状どういう処理をしているのかを
コードと向き合いながら作成者に聞いて理解する。
200に増やせばなんとかなると結論つける根拠をプログラム作成者に確認する。
ソースを変更するのはそれからだと思うけど。
読み込める文字数に制限があると疑うなら、現在読み込めてるデータの文字列長の
範囲内で10から14に入力データ数を変更したコードでテストしてみる。
入力文字列長の制限なのかコードの変更ミスなのか切り分けができてない。
2014/06/02(月) 08:47:31.90ID:xxg6z98O
card と云うと、FORTRAN IV時代の1枚80コラムのIBMカー
を思い出す。
最初の5コラムがラベル番号6コラム目がコメント用7コラム
から72コラムまでにステートメントを書く(打つ)
というものだった。
もしかして、
read card 100
というのは、データカードを100枚読み込むということ
でしょうか。
character 100
というのはデータカードが2枚ひと組になっていて、
2枚合わせて100文字をひと固まりとして処理する
ということかなとも思いますが、いずれにしても
FORTRAN IVの正規の文法には、このようなステートメント
はなかったと思います。
ある機種特有の方言かもしれません
2014/06/02(月) 09:19:02.24ID:/Y6F3YHx
>>439
1万行超えるのでいったいどこを抜き出せばよいのかわかりません。全てを貼ることはできませんし、各サブルーチンに出てきているread文はこれです。

ご指摘の通りインプットファイルから取り込んだものを各変数へ分配していっています。
アウトプットファイルから、入力した値と読み込んだ値が一致しているかどうかは確認済です。
ただ、問題となっている入力部分における一行が長いと、そこを読み込めずにプログラムがそこで止まってしまうのです。入力する変数の個数の問題ではなく一行の長さに問題があるのではないかと考えているのです。



>>440
10→14に変えても読むことはためしてわかりました。有効桁数を減らして、一行の長さを短くすれば読むのです。


>>441
7マス目からプログラムを打ち始めていた頃に作られたものです。read cardというのはインプットファイルを読むという意味だそうです。いくら調べてもcardという命令分はないのでよくわかりませんが、read文といえばこれぐらいなのです
データカードというのはインプットファイルのことですよね?
今はabsoft11.0,fortran95でやっているのでそのようなことは気にしなくてよくなっています
2014/06/02(月) 10:21:47.52ID:yv/nHUfZ
昔は
_______read 6 100
とか書いてたな
2014/06/02(月) 23:06:26.34ID:Ij4SzyXz
1つ言えるのは card とはそのプログラム内で定義された何らかの名前
そして今のところの常識的にその文法は Fortran とは異なるように見える

100 はその数字のラベルが付けられた行であるようにも考えられるが
その場合は 200 など別に変えられた場合にコンパイルエラーか
実行時の動作がぶっ壊れるだろうから、おそらく数値とみるべきか
2014/06/03(火) 07:56:10.35ID:Bql6ya1H
2014/06/04(水) 08:41:52.08ID:cjdS4ahW
447デフォルトの名無しさん
垢版 |
2014/06/04(水) 21:26:40.68ID:bCq7kX8R
common/mat/a(20)
common/mat/a1,a2,…a25
と記述してもプログラムが動くのですがなぜでしょうか
matには20個の変数しか入れないから、a1〜a20までしか読み込まないと思ったのですが、なぜか読みます
2014/06/04(水) 23:26:31.63ID:OlqsO7Ca
文法上では、大きさの違う COMMON ブロックは、無名 COMMON ブロックでしか
許されていないのだが、まぁ昔はよくやられていた。

66時代は静的にメモリー領域が確保されるので、問題は少ない。
77時代には、文法上は COMMON ブロックも SAVE 指定しないと、
解放されるのでまずいのだが、過去との互換性から普通は静的に
確保されていたのでまぁ大丈夫だった。

COMMON 文はメモリー上の番地の共有になっている。それは先頭で位置合わせが
なされるので、より大きい方でメモリーが確保されていれば、一方が小さくても
問題ない。ただ、小さい大きさで確保されていると、エラーが出なくても
はみ出して読み書きしているだけなので、ファンタスティックな予期せぬ出来事
が起きる。
449デフォルトの名無しさん
垢版 |
2014/06/04(水) 23:52:50.09ID:lml6F2RD
>>448
すみません、あまり理解できず、いくつか教えてほしいことがあります。
common文はプログラム中に出てくる共通の変数を定義するために使うものだと考えています。
最初に定義する時に
common/mat/a(20)
としていれば20個の要素を入れる事ができます。その後別のサブルーチンで
common/mat/a1,a2,…a25
とすればa(20)に具体的に値を格納していっているものだと考えています。
プログラムでは共通してすべて、最大で20個の値を初期化したり記憶したり格納したりするよう記述されています。
しかしあるサブルーチンでmatを呼び出して25個の値を定義して放り込んで操作していても普通に使えているのです。
「先頭で一合わせがなされるので(どこの先頭でしょうか)、より大きい方(どこより大きいのでしょうか)でメモリーが確保されていれば」
のメモリーとははじめにglobal defineで定義する最大記憶容量のことでしょうか?
じつはこれもこの20を使って上限を決めており、ある程度は余裕をもたせているのですが、
条件を変えたりすれば、すりきりいっぱいになるかもしれないです。


「ただ、小さい大きさで確保されていると、エラーが出なくても はみ出して読み書きしているだけなので、ファンタスティックな予期せぬ出来事
が起きる。 」というのは小さい大きさというのはどこより小さいのでしょうか。はみ出して読み書きしているだけというのは今現在読み書きできていることとどうなのでしょうか。
2014/06/04(水) 23:54:33.80ID:OlqsO7Ca
character 命令があるということは FORTRAN77 だな。

文法的に成り立つ解釈としては、FORTRAN77では空白は無視されるから、
CHARACTER card 100 とは今でいうcharacter(len=1) :: card100
read card 100 は、read card100 だが、この時 card100 には Format文が
入らないとだめなので、1文字では無理w

CHARACTER CARD*100 の間違いかとも思ったが、READ CARD 100が成り立たず
終了w
2014/06/05(木) 00:08:43.48ID:m2ykd6YT
同じプログラム単位に書いたなら
common/mat/a(20)
common/mat/a1,a2,…a25

common/mat/a(20),a1,a2,…a25
と同じだったかと

違うプログラム単位に書いたなら多分未定義だが
重なるメモリはそれっぽく読めて、多い分はそのまま使えるっぽい
2014/06/05(木) 00:38:07.03ID:a9B4CiIQ
>>451のいう通り、同じプログラム単位に書かれたら、後ろに追加になる。

COMMONはグローバル変数とは違う。メモリー領域の共有。
COMMON/mat/a(20)とCOMMON/mat/a1,a2,....,a25が別々のプログラム単位に
あらわれたら、それはa(1)とa1の番地が等しくて、メモリー領域を共有している。
(ポインター風にいえば同じ番地を差している。)同様にa(2)はa2、a(3)はa3...
a(20)はa20とメモリー領域を共有している。
さてa21に対応する配列要素はないのだが、メモリー上では配列をはみ出した
a(21)にあたる番地を差すことになる。(配列はメモリー上で連続に確保される。
COMMON変数は、普通は、宣言順に詰めてメモリー上に配置される)

だから、コンパイラが気を利かせて、名前付きCOMMONであっても、
最大サイズのCOMMONブロックの大きさを確保してくれていれば、
なんら問題は生じない。しかし、昔のHITACとか気の利かない堅物は、
最初に出会ったCOMMONブロックの大きさで領域確保するので、ちとまずい。
(ACOS>FACOM>HITACの順でけつの穴が小さい。)


COMMONブロックの大きさが違っていいのは、名前付きCOMMONのみ。
今の質問者の場合はmatという名前がついているので、本来はサイズが違う
のは許されていない。が、昔はよく使われていた。
だから別に驚くことでも何でもない。

ちなみに無名COMMONとは(COMMON //a(20) とか COMMON a(20)とか)
2014/06/05(木) 01:27:46.66ID:a9B4CiIQ
コンパイラのオプションでMAPファイルを書かせれば確かめられる。
Intel Fortranの場合、/MAPでいく。gfortran はちょっと見た感じ見つからんw
昔のコンパイラなら必ずあった。

MAPファイル内を探すと
0004:00000aa0 _MAT 00406aa0 <common>
0004:00000b20 ___native_startup_state 00406b20 <common>
0004:00000b24 ___native_startup_lock 00406b24 <common>
0004:00000b28 ___onexitend 00406b28 <common>
0004:00000b2c ___onexitbegin 00406b2c <common>
0004:00000b30 __NoHeapEnableTerminationOnCorruption 00406b30 <common>
0004:00000b34 ___dyn_tls_init_callback 00406b34 <common>

こんな感じの出力がある。
ここで実験した感じでは、単精度4バイト*8個=32バイトづつ、
領域を確保していっている。COMMONでa1..a25 の場合、本来は4*25バイト
あれば十分だが、8の倍数ごと確保しているようなので、
番地 00406aa0 から 00406b20 まで4*32バイト確保している。

COMMMONの現れる順番に関わらず、最大のサイズをとってくれている模様。
Intel子は気が利くなw 心ぴょんぴょん待ち〜
454453
垢版 |
2014/06/05(木) 01:28:36.28ID:a9B4CiIQ
テストプログラム
subroutine sub()
common/mat/a(20)
a = 1.0
print *, a
end


program Console1
real a
common/mat/a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,&
a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,&
a21,a22,a23,a24,a25
a = 0.0
print *, (Z'b20'-Z'aa0') / 4
end program Console1
2014/06/05(木) 01:40:20.97ID:ivUEXHmG
Emacsでfortran のコマンド自動補完できるのかな?
456デフォルトの名無しさん
垢版 |
2014/06/05(木) 11:54:05.31ID:qVumrB9V
>>451,>>452,>>453
詳しくありがとうございます。
>>452で[最大サイズのCOMMONブロックの大きさを確保してくれていれば]というのは、
>>453で[単精度4バイト*8個=32バイトづつ、 領域を確保していっている]ということから、大丈夫ということでしょうか
もともと20個が上限なので、8の倍数なら24個まで勝手に確保してくれているので、25個では動かないように感じます。
しかしそれは>>451のように「多い分はそのまま使えるっぽい」ということで、今回は大丈夫だということでしょうか。
2014/06/05(木) 22:09:23.11ID:m2ykd6YT
common/mat/a(20)
→ real * 20個 = 80 byte → 32 byte 単位で3つ分 (96 byte)

common/mat/a1,a2,…a25
→ real * 25個 = 100 byte → 32 byte 単位で4つ分 (128 byte)

Intelの場合は、プログラムのつじつま合わせに /mat/ には4つ分のメモリが必要だと判断した、ということ

32byte単位なのは、そうしたほうが「自分とこの最適化に有利」だから
気を利かせて余分に取ってるわけではない
458453
垢版 |
2014/06/05(木) 23:04:15.60ID:a9B4CiIQ
>>456
虚心に読めよw

1.名前付きCOMMONで長さがそろわないのは文法違反。
2.ゆえにそれがどう扱われるかは、処理系依存。
3.したがって、自分の利用しているコンパイラがどう扱っているか調べる必要あり。
4.調べる方法の一例はMAPファイルを書かせること。実例をIntelCompilerで示した。

結論:そなたの使っているコンパイラがわからなければここでは答えようがない。
 大抵の処理系では適当に慮ってやってくれるが、昔のHITACのような凡例も
あるので何とも言えない。NAGとか文法にうるさいのを売りにしている処理系では
期待薄。

>>457
うむ。DECのαとか、64bit時代になってから、COMMON文の中までPaddingして
メモリー・アラインメントをそろえてくるので、昔のプログラムを動かそうとすると
やっかい。
Intelが32バイトづつ増やしているのは、AVXとかベクトル化の単位に合わせている
可能性が高いと思う。
459デフォルトの名無しさん
垢版 |
2014/06/05(木) 23:32:23.89ID:ivUEXHmG
誰かいまっくすでフォートランのコマンド自動補完する方法しらんかいの?
2014/06/06(金) 03:54:07.35ID:jaKSg6aA
みんな Stallman のデブが嫌いだからな
それにスクリーンエディターに頼るのは甘え





俺は甘えん坊だがw
2014/06/06(金) 16:41:53.21ID:J0jnFElL
甘いと言うより古いな
462デフォルトの名無しさん
垢版 |
2014/06/06(金) 22:53:03.99ID:Bx53wjCJ
メモ帳からデータを読み込む際、TABキーによる空白や全角による空白、半角による空白で違いはあるのですか?
数値を1 2 3 4と1行に入力したとき勝手に1、2、3、4と区別して読んでくれるのでどうやって判断しているのだろうと疑問に思いました。
試しにすべてのTABキースベースを半角1スペースに置換して読み込ませたところ、エラーで読みませんでした。
2014/06/08(日) 11:12:25.46ID:dwjjMbeb
>>460
みんななに使ってるのかな?
464デフォルトの名無しさん
垢版 |
2014/06/09(月) 23:14:56.35ID:p2A2eKRk
>>429ですが、解決しました。
CHARACTER*120という部分だけを変えていて、FORMAT文まで変えていなかったりときちんとすべて変えていなかったのが原因でした。
そこここにローカルな記述方法が多く困りましたが、とても助かりました。ありがとうございました。
2014/06/10(火) 00:00:20.47ID:uCkYRtw5
みんなずっこけるよ…
2014/06/11(水) 22:05:12.93ID:HeH2upb6
プログラムが長くなってきて、
いくつかのファイルに分けてサブルーチンを書いているのですが、
わかりやすい整理方法、命名方法などないでしょうか
同じ機能群のサブルーチンは
同じファイルにまとめるぐらいはしているのですが
だんだん分からなくなってきて
多分このまま続けたら発散するんだろうな・・と思います
スレ違いかもしれませんがもしコツなどありましたらお願いします
467デフォルトの名無しさん
垢版 |
2014/06/12(木) 00:49:36.30ID:iuJue+V7
あるプログラムの一部を修正している途中なのですが、触っていないところでエラーが起きるようになり、困っています。
build自体は問題がなくて、build後のプログラムを実行すると以下のエラーメッセージが出て止まります

illegal character in numeric input
read(unit=1,...)

修正前のプログラムでは滞りなく回るのですが修正中のプログラムでは回らなくなっています。
触っていないところなのでどこから手をつけて良いかわかりません。
2014/06/12(木) 01:11:55.34ID:37CEZRmy
>>467に追記です。
修正前のプログラムは
absoft fortran 9.0(windows7)
修正後のプログラムは
absoft fortran11.0(windows8)で作られています

修正前のバージョンに自信がないですが、バージョンが異なるのは確かです

もともと、修正後のプログラムはビルドできるのに、そのプログラムをwindws7、9.0のパソコンでビルドしようとするとなぜかビルドできないという状況です

そこがエラーを起こす原因なのかもしれません

プログラムが止まるところはインプットファイル中にある、ある数を0にしておけば回るようになり、0じゃなくて数を与えるとエラーを吐きます。
2014/06/12(木) 02:49:22.16ID:KPlz8uhx
おおかた、全角文字でも入っているのだろう。
2014/06/12(木) 07:38:50.36ID:IkGTnMqV
>>469
どうすればそこを見つけられるのでしょうか
471デフォルトの名無しさん
垢版 |
2014/06/12(木) 22:00:13.35ID:1yO42ooY
>>468ですが、修正は関係ないことがわかりました。
もともとの渡されたソースファイルをabsoft fortran 11.0でbuildするとbuild自体はうまくいきますが、同じ箇所でruntime errorとなりました
コピーして新規ファイルを作ってbuildしても同様の結果となりました。.f95.f77.fの3パターンで新規ファイルを作ってbuildしましたが、同じ結果でした
verはおそらく9.0で拡張子は.fで渡されています。
.fファイルだけでなくguiやgviという拡張しのついたファイルも一緒に渡されているのですが、それを11.0では必要としていないので使っていません。
これが何か悪さをしているのでしょうか?
472デフォルトの名無しさん
垢版 |
2014/06/13(金) 08:46:16.45ID:YPxIZA8y
もともとのファイルは9.0でビルドすると正しく動くということ?
環境を変えるときコンパイラが生成したものを運んだりしてないか

ある数が0の時回るとあるけど、その変数周りを調べていくしかないと思う
なんの数字か知らないが、例えばその数が読み込むデータの数を表してて、その数字と実際のデータ数があってない
そして型の合わない次のデータを読もうとしてとまるとか
473デフォルトの名無しさん
垢版 |
2014/06/13(金) 08:59:26.44ID:XnqRfLRO
>>472
はい。同じ読み込みデータでも正しく動きます。
runtime error
illegal character in numeric input
ある数というのは出力してほしいデータを指定する数です。
データの種類が5種類ほどあって、ある1種のデータを出力するよう指示をすると止まってしまいます。
一行中に
300 400 200 0 0
というように出力してほしいデータの数を指定しますが、みぎから2番目のデータを変えるとダメです
正しいアウトプットでは
<< 出力するデータの情報 >>
出力データ
...
というように進むのですが、ある数字では
>>
だけが延々と繰り返されたり、別の数字では上記の通りruntime error illegal character in numeric inputと出て止まったり
というような感じです
474デフォルトの名無しさん
垢版 |
2014/06/13(金) 09:10:39.79ID:YPxIZA8y
>>473
入力はこの5つの数字だけ?
それぞれのでーたに対して個別に入力があったりしないの
2014/06/15(日) 17:47:40.77ID:QZWVyVFy
>>473
この記事関係ではない?
Http://jp.i-planet.me
2014/06/16(月) 04:00:13.60ID:fWvfMn7M
>>474
すみませんよく意味がわかりません
>>475
拝見しましたが違うような気がします。

11でビルドしたらうまくいかないものを9.0でビルドすればうまくいくようになりました。11と9の間でうまくいかないものがあるようです。

11でビルドは諦めてビルドだけ9が良いのかもしれません

なぜか今まで使えていた9がinvalid licenseと突然出るようになってビルドが今はできないので、まずはそこをなんとかしなければなりませんが…。
2014/06/16(月) 10:00:44.78ID:juShtlay
cuda fortranについて初歩的な質問なのですが、
PGI workstationで、-cublasとオプションを付けてコンパイルしようとすると、
『fatal error LNK1104: cannnot open file 'libcublas.lib'』とエラーが出てしまいます。
この場合、どうしたら良いですかね?
どなたか教えてくださると助かります。
478デフォルトの名無しさん
垢版 |
2014/06/16(月) 10:13:18.23ID:3pyBJ4C4
>>477
パスが通ってないんだろ

そのエラーにあるファイルがあるか探す
ファイルがあるパスをLオプションで追加でとりあえず通るはず
例えば-L/usr/local/cuda/lib -cublas
2014/06/16(月) 15:38:44.47ID:juShtlay
>>478
探して見たところ、'libcublas.ipl'、'libcublasemu.lib'という名前のファイルしか見つかりませでした。
そこで、これらのファイルが保存されているフォルダのパスを追加してコンパイルしたところ、
『error lnk2019: unresolved external symbol referenced in function』
というようなエラーが出てきてしまったのですが、
どうすれば良いか教えていただけませんか?
480デフォルトの名無しさん
垢版 |
2014/06/16(月) 15:50:37.89ID:Q+b6M39D
>>479
試しにcublasをcublasemuに変えてみて
libcublas.libがなかったのならもしかしてパスはすでに通っていたかもしれません
2014/06/16(月) 16:27:09.31ID:juShtlay
コード中の'cublas'を'cublasemu'に変更し、
'-lcublas'を'-lcublasemu'に変更してコンパイルしたところ、
『unable to open MODULE file cublasemu.mod
compilation aborted』
と出てしまいました。。。
482デフォルトの名無しさん
垢版 |
2014/06/16(月) 16:43:59.97ID:vxzjg7XS
>>481
コードは元のままでいいです
申し訳ない
2014/06/16(月) 16:54:43.67ID:juShtlay
>>482
元のコードでやってもやはり出てしまいますね。
484デフォルトの名無しさん
垢版 |
2014/06/16(月) 17:46:47.99ID:vxzjg7XS
>>483
use cublasemuになっていませんか?
2014/06/17(火) 09:43:20.11ID:W5zFtzyB
>>484
いえ、ちゃんとuse cublasってなっています。
486デフォルトの名無しさん
垢版 |
2014/06/17(火) 13:19:25.73ID:gUXRuUGZ
use cudafor
use cublas
が指定されている

-Mcudaまたは-Mcuda:4.0あるいは-Mcuda=emu

unresolved external symbolと言われたら
libが足りないので-lで追加
*.libがないと言われたら
-Lなどでパス追加
*.modがないと言われたら
-Iでパス追加

参考
http://www.softek.co.jp/SPG/Pgi/TIPS/opt_cudaF.html
http://www.softek.co.jp/SPG/Pgi/TIPS/public/accel/cublas40.html
2014/06/17(火) 16:58:12.46ID:W5zFtzyB
>>486
-Lパスでディレクトリを指定して、-cublasemuをつけてコンパイルしたところ、
"libcublasemu.lib : error lnk2019: unresolved external symbol referenced in function"
が、ものすごい数のが出てきたのですが、どうしたらいいですかね?
一個ずつ-lで追加していくしか無いのでしょうか。
488デフォルトの名無しさん
垢版 |
2014/06/17(火) 17:24:37.11ID:AhgC7kyl
cublas使わなければ普通に動くの?
2014/06/18(水) 11:22:33.36ID:nvOujYC+
>>488
はい。cublasが関わるところを全てコメントアウトしたところ、動きました。
490デフォルトの名無しさん
垢版 |
2014/06/18(水) 18:11:03.14ID:s+RQ8hIL
>>489
可能な限り少しずつコメントアウトを外していき
その都度コンパイルが通るようにオプションを調整してみてください
最初はuse cublasだけなど
大量のエラーが少しずつ出ることを期待します

cublasは呼び出し方法が旧いものや新しいもので3種あるようですが
呼び出し方と CUDA toolkit のバージョン指定はあっていますか?

pgi cuda Fortranはデバッグ用にGPUを使わないエミュレートモードが用意されています
コンパイルオプションとリンクするライブラリの両方で切替えるようです
どちらを使用していますか?
cublasemuはエミュレートモード用で
オプションに-Mcuda=emuを併せて指定します
2014/06/20(金) 16:00:17.10ID:utkwlJ0p
Cのatoiとかatofのように,文字列としての数字の列を
integerなりrealの値に変換してくれる函数はあるでしょうか。
当方は,MinGWのgfortran95を使っています。
2014/06/20(金) 19:25:02.85ID:bxod4dQ6
>>491
内部ファイルを使うのがセオリー
NAG Fortran入門 19.5 数値と文字の変換を行う方法
ttp://www.nag-j.co.jp/fortran/FI_18.html#ConvertingBetweenNumbersAndStrings
2014/06/20(金) 21:53:29.14ID:utkwlJ0p
>492
ありがとうございます。
こういう裏ワザがあったのですね。
さっそく使わせていただきます。
2014/06/21(土) 17:36:05.91ID:L2qICpES
裏ワザというかFORTRAN77の頃からあったし、
66時代にはENCODE/DECODE関数が用意されていたんだがな。

マニュアルをよく読めば、内部ファイルの項目が昔から書いてある。
2014/06/21(土) 20:05:31.04ID:6Ae9RUEd
>464
そうでしたか。なにしろわたしが FORTRANを学生時代に始めた
ころはFORTRAN IVのころで80桁のパンチカードにパンチした
カードデックを窓口の届けると2日程で,棚にカードとラインプリ
ンタで打ち出した結果がおいてあるという時代(東大の計算センター
にあったHITAC 5020)のころで,FORTRAN77の出る前
ダイクストラの構造化プログラミングが騒がれ始めて,
カーニハンとリッチーの『ソフトウエア作法』をよんで,
構造化出来るRATFORを大学にあった小さなコンピュータで
実験しているころからの進歩を知りませんでした。
その後,CおよびC++に興味が移りFROTRANをご無沙汰してい
たのですが,最近のFORTRANで128bit処理ができることを
知り,まいもどってきた次第です。
市販のfortran90,95の入門書を見てみたのですが,見当ら
なかったので,質問したしだいです。
2014/06/21(土) 22:49:19.55ID:jwjy0CXq
はろけくも来つるものかなフォートラン

あっ季語がない
2014/06/24(火) 20:49:58.43ID:vNnfb12N
Gfortran 使ってるんだが、データを読み込ませる際、2行ごとにデータを読み込ませることって可能?
2014/06/25(水) 01:47:13.51ID:2uAyyXu5
素直に全部読みなさい
変数に入った値は、必ず使えとも使うなとも言われてないだろう
2014/06/26(木) 00:45:30.86ID:oXHKxD2l
まぁ空のread文で1行飛ばせるけどな。
Fortmatの/でも行けたっけかな?曖昧みー
2014/06/26(木) 01:01:48.05ID:pqUjp/UA
awkなりsedなりで一行飛ばしの中間ファイル作って、それをデータファイルにするとかじゃだめなの?
入力関係でつまづくなら、fortranにあわせたファイルを作成する方が早いのではと思ってしまう。

バイナリデータだとテキストみたいにいかないのか。バイナリデータだったらごめん。
2014/06/26(木) 08:16:37.95ID:MILdybit
>>498->>500
レスどもです。直接n行ごとに読み込むという作業はできないみたいですね。
私も中間ファイルを作って…と思いましたが、読み込みデータをいじってはいけないらしく断念しました。
解決案は以下の通り、(n行ごとに読みたい場合)
If(mod(i,n) .eq. 0) then
Read(20,*) hoge(i)
Else
Read(20, *)
Endif
2014/06/26(木) 21:08:20.99ID:2skFYUOi
詰めないと使いにくくない?

i=1
do m=1, linenum
if(mod(m,n) .eq. 1) then
read(20,*) hoge(i)
i = i +1
else
read(20,*)
endif
enddo
2014/06/27(金) 00:10:25.56ID:kJEq6I8z
>>499の言うとおり、formatを'(i,5/)'とかにすれば良いのでは?
2014/06/27(金) 00:38:41.62ID:iFH1F/Cx
>>502
あっ、もしかして>>501のやり方って途中空白行入ってることになるのかな???

>>503
それについて少し調べる必要があるかも。
具体的にどゆこと?
2014/06/27(金) 00:42:32.62ID:P3Dz9sSW
formatのスラッシュでskipできるぞ。

program test
implicit none
character(len = 132) :: text
open(10, file = 'test.f90')
1 read(10, '(a, /)', end = 999) text
print *, trim(text)
goto 1
999 stop
end program test
2014/06/27(金) 01:05:20.13ID:iFH1F/Cx
>>505
おお!スラがスキップすると言う指示内容なんですね。
2014/06/27(金) 02:12:24.88ID:P3Dz9sSW
>>506
んだ。
writeの時は出力1行改行、readのときも入力改行で結局1行読み飛ばすことになる。
508デフォルトの名無しさん
垢版 |
2014/06/27(金) 09:18:57.76ID:F3h4qtWf
久しぶりにfortranのプログラム見たが、FORTRAN77の時代と違って気持ち悪い。
これならC++の方がまだいい。テンプレート関係を除けば。

でも、fortranは4倍精度計算ができるからなあ。
並列処理やGPGPUに対応したライブラリも出ているし。

まあ、年寄はfortranからMatlabに移行しているみたいだが。
2014/06/28(土) 00:46:11.64ID:PIVLw57u
おじいちゃん。
あんま結論を急がない方がいい。
配列演算気持ちいい。PUREでELEMENTALなら最高。

4倍精度は精度は4倍だが計算時間は10倍超だから、
10倍の時間の合間にアルゴリズム見直した方が吉。
2014/06/28(土) 02:59:17.00ID:EHQFW5QP
gccにもquadmathがあるんだからあまりFORTRANを高く評価しない方がいいよ
2014/06/28(土) 13:41:05.28ID:1f0E4KM2
並列計算させてdoループの中でwrite文でファイル書き込みしたら中身の順番めちゃくちゃで泣きました。
どーにもなんないんですかね?
2014/06/28(土) 15:42:05.65ID:cJj78OR7
>>510
そもそもlibquadmathはFortranのために追加されたんだが
2014/06/28(土) 16:56:46.35ID:DtEJ1AXR
>>511
write文だけ逐次処理させるか、ループの外に出すしかないと思う。
514デフォルトの名無しさん
垢版 |
2014/06/28(土) 22:06:02.07ID:mzWdk+zj
>>509

はぁ。。。

配列演算気持ちいい、って何? それ。
C**なら行列演算クラスライブラリ作って、演算子オーバーロード使えば終わりじゃん。

まさか、行列積が「・」でできると言うんじゃないだろな?

>4倍精度は精度は4倍だが計算時間は10倍超だから、
>10倍の時間の合間にアルゴリズム見直した方が吉。

何言ってんだ?この馬鹿。
物理計算によっては4倍精度の計算が必要なの。計算時間やアルゴリズム
の問題じゃない。人の言ってることをそのまま受け売りするな。阿呆
515デフォルトの名無しさん
垢版 |
2014/06/28(土) 22:07:05.28ID:mzWdk+zj
>>514

C** → C++
2014/06/29(日) 00:26:55.37ID:S1guW8MB
懐かしい単語を見かけたからって
いい大人が質問スレに何しに来てんだろね

それとも>>508は質問なのか?
2014/06/29(日) 10:07:26.16ID:zjmbmtCs
libquadmathの中を覗いてみたら、x86版はFPU使ってるけどx64版はSSE2使ってるな
2014/06/29(日) 12:17:10.06ID:eLJ+YA5h
ポインタが表に出ない(もちろん POINTER は除く)、
配列長と次元が暗黙的に持てることは評価できると思うんよ
matlab/octave に勝るかというと微妙だけど(移植性くらい?

>>511
ソースコード> このループは順番ぐちゃっても大丈夫です
処理系> なら並列実行しても同じだよね!
という発想なので、そういう副作用も考慮しなきゃダメ

>>517
確か x86_64 は SSE の存在を仮定していいはず
まぁ x86 も SSE/AVX も quad precision floating-point の直接演算は無い
2014/06/29(日) 12:46:18.15ID:eLJ+YA5h
> C++なら行列演算クラスライブラリ作って、演算子オーバーロード使えば終わりじゃん。
> まさか、行列積が「・」でできると言うんじゃないだろな?

冗長だけど、〜すれば終わり、程度には書けますぜセンセー。

function dotp_r8(A, x) result(y)
double precision, intent(in) :: A(:,:), x(:,:)
double precision :: y( size(A,1), size(A,2) )

y = matmul(A, x)
end function
!----====----====----====----====----====----====----====
program test

interface operator(.dot.)
function dotp_r8(A, x) result(y)
double precision, intent(in) :: A(:,:), x(:,:)
double precision :: y( size(A,1), size(A,2) )
end function
end interface
double precision :: A(2,2), x(2,2), y(2,2)

A = reshape( (/1.D0, 1.D0, 1.D0, 1.D0/), (/2,2/) )
x = reshape( (/1.D0, 3.D0, 2.D0, 4.D0/), (/2,2/) )

y = A .dot. x

write (*, '(2F8.3)'), transpose(A); print *
write (*, '(2F8.3)'), transpose(x); print *
write (*, '(2F8.3)'), transpose(y)
end
2014/06/29(日) 13:09:54.23ID:RUBiLoi5
クラスライブラリで演算子オーバーロードって・・・遅そう。
素人が書いたマクロじゃ最適化効かないでしょ。
ソースの見かけで書けたって意味ないの。

大体、高速行列演算ライブラリを自分で作れるくらいなら、四倍精度のライブラリ
も自作すればいい。昔の爺さん世代はよく倍精度・四倍精度自作ライブラリを自慢していたw


まぁC++のBlitzなんて10年以上前から夢を語ってノロノロ開発して
ようやく最近なんですけどね。
2014/06/29(日) 14:46:16.10ID:qF+KN0J6
>>513>>518
なるほど、順番がどうなっても良いような時にしか使っちゃいけないポイですね。

どういった場面で並列化使えるのかな…
自分はある物理の数値計算に使ってるんだけども、順番が変わったらダメ。

それにしてもここにいる住人は凄い人が多くて、泣ける
2014/06/29(日) 15:59:56.49ID:l4jNLVEs
並列化は普通に物理の数値計算につかうけど、、、
523デフォルトの名無しさん
垢版 |
2014/06/29(日) 17:26:15.54ID:rvrpBbGm
>>519

あ、そう。matlabみたいに糞な「:」が好きなのね。もういいから、死んでね
お爺ちゃんからこんな言葉を言われたお前はすでに終わっている。

>>520

その通り。面倒くさかったから書かなかったけど。
とにかく、一時オブジェクトの生成と.消滅、データのコピーが頻繁におきる。

それを避けるために右辺値参照が使えるかどうか。でも行列乗算や線形連立代数方程式
を解く場合には使えないかも。まだ、やってみてないからわからんが。

作業用行列のポインタ値を管理するグローバルオブジェクトを使うと
上の問題は回避できるが、残念ながらマルチスレッドには対応できてない。

これをどのようにグローバルスレッド対応にしたらいいか、戦略が
立たない状態です。
524デフォルトの名無しさん
垢版 |
2014/06/29(日) 17:29:17.08ID:rvrpBbGm
>>519

しかし、ほんとコードが糞だよな。こんなの覚えるくらいなら
C++の方がましだわ
2014/06/29(日) 17:34:36.24ID:qF+KN0J6
>>522
いや、そうでしょうけど、出力の順番とか気にする場合が私の研究分野だとほとんどなので…
なにか勉強になるものがあればいいのですが
2014/06/29(日) 17:57:50.26ID:RUBiLoi5
David BaileyがFortran用とC++用の4倍、8倍、多倍精度ルーチン公開してた気がする。
http://crd-legacy.lbl.gov/~dhbailey/
527デフォルトの名無しさん
垢版 |
2014/06/29(日) 17:59:34.52ID:rvrpBbGm
間違えた

グローバルスレッド対応→スレッド対応
2014/06/29(日) 21:18:38.95ID:UItnk67i
>>525
プロセス(OpenMPならスレッド)ごとに別ファイルに出力して、
後で適当なスクリプトでマージするとか。

でも普通はそんなことしないで、>>513 が書いてるように、
doループを計算部と出力部の2つのループに分けて、
計算部のみ並列化して出力部分は逐次処理だと思う。
2014/06/29(日) 21:46:47.56ID:eLJ+YA5h
はいはいソーデスネーでっかい一時領域作ってなにしてんでしょーねorz

pure で elemental とゆーと配列を引数に放り込むとその全要素に
関数定義された処理が適用される、各処理は独立なのでまとめるなり
並列化なりをコンパイラーに期待、かな。演算子全然関係ないしorz

過去のシサンガーとかもう辛いだけ。
どこまでも未来に生きてください、Fortran スレになんか戻らないでください。

>>521
出力の順序だけ重要ならバッファして後から並べ替えるとか
浮動小数点演算的に結果を変えられないなら仕方ないかもだが

だって人口少ないし交流少ないし機会もないし意味すらないかもしれない、
たまに発言すれば馬鹿にされるから凄い人しか残らないわけで。
2014/06/30(月) 00:33:26.64ID:8S3fud89
>>518
それは分かる
でもエミュレーションしたら1/10程度じゃ済まないだろうから一応ハードウェアが
有効に働いてるんだな
double-double演算でもないみたいだし

>>526
面白そうだね

4倍精度が必要になるのは例えば反復法などの収束を加速する時などで、
単なる倍精度だと桁落ちのために誤差が生じてなかなか収束しない時に
有効だったりするね
2014/06/30(月) 02:26:19.67ID:fawqTnic
Fortranの強みは常に時代の最先端ハードウェアに対応していることじゃないかな。

最近でもIntelはDECのFortran買ったし、NvidiaはPGIを買収したし。
両社ともGPUアクセレレータを含む自分らの最新ハードとセットで、
同じタイミングで対応したコンパイラを出してきている。

本来ハードウェアとソフトウェアは表裏一体、精神と肉体のような
不可分の関係にあるはず。そしてFortranは未だその密接さを保っている。

ソフトウェアの人たちは、ソフトウェア単体での独立価値を信じたいようだけど
現実は違っている。

この現実認識の歪が過剰なFortranディスカウントキャンペーンとして噴出して
いるのではないだろうか・・・と新聞並に論理を飛躍させて終わるw
532デフォルトの名無しさん
垢版 |
2014/06/30(月) 13:21:06.69ID:V1UUNHQo
>>529

そういうのに向かない計算アルゴリズム(隣のセルの計算結果を使う。つまり独立ではない。
そうなると同期の問題も発生する)もあるんだ。

>過去のシサンガーとかもう辛いだけ。
>どこまでも未来に生きてください、Fortran スレになんか戻らないでください。

で、お前何が言いたいんや?日本語大丈夫か?
2014/07/01(火) 01:36:55.46ID:DMO1kVAm
1 :デフォルトの名無しさん:2012/08/16(木) 20:58:00.31
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。
2014/07/03(木) 20:06:28.12ID:Ct9dkTzH
つかぬことをお聞きしますが
皆さんのfortranの本の勉強履歴はどんな流れですか?
私は冨田さんfortran90の本→辞書的にfortran90入門をかいつまむぐらいしか
やっておらずとりあえず拙いなりに読み書きはするのですが
なにか良い本あればおしえていただけないでしょうか
2014/07/04(金) 01:38:26.65ID:41RxNfGp
故岡村先生の授業テキスト
やーっふぉ、やっふぉ、ふぉーとらんらんらん
2014/07/04(金) 01:45:11.81ID:cNJNO1xN
Fortran95/2003 Explained --> Modern Fortran Explained
2014/07/05(土) 07:04:30.09ID:sNpoyHpR
emacsでコメントアウトに使う関数fortran-comment-regionのデフォルトの動作が
行頭にCを挿入するのではなく,C$$(自由形式では!!$)を挿入するのは何か理由があるのでしょうか?
$つけたほうがメリットとかあるの?
538デフォルトの名無しさん
垢版 |
2014/07/07(月) 01:06:30.37ID:1zKRZTH9
absoft 9.0でf77fileをコンパイル成功、プログラム自体も上手く行く
absoft11.0でコンパイル成功、プログラム自体もインプットファイルのある部分の記述次第で上手く行く
ある記述部というのはアウトプットするデータ個数を指定するところです。20個程度なら上手くいくのですが数百個と増やすとうまくいきません。
エラーメッセージは
illegal character in numeric input
で、インプットファイルにおかしい部分があると言っています。しかし9.0でコンパイルしたものはきちんとうまくいくのです
何かアドバイスいただけないでしょうか。プログラム自体は3万行程度あるというのと内容だけに書き写すのは難しいです。
2014/07/07(月) 01:25:39.47ID:VWd7ewX/
>>538
よく分からないけど、正常に動くなら9.0のままじゃ駄目なの?
出力するときフォーマットは指定してる?
してるなら*で指定なしにしてみたら
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況