くだすれ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/04/25(金) 19:31:14.66ID:9DVeZXXS
「構造体の1成分だけfunctionで計算する」っていうのがよくわからない。
(1)function の引数として構造体の1成分を使うのか、(2)function の戻り値として構造体の1成分を得たいのか。
いずれにせよ、関数定義では構造体をあらわに使う必要がなさそう。
たとえば構造体の1成分 aaa(i,j)%a が real のばあいなら、関数定義は
function f(x)
real f, x
f = x**2
end function
のようにして、(1)なら呼び出し時に
b = f(aaa(i, j)%a)
のようにすればいいし、(2)なら呼び出し時に
aaa(i, j)%a = f(c)
のようにすればいいのではないでしょうか。
2014/04/25(金) 19:54:42.69ID:nDom0mhY
>>396
早速のレスありがとうございます
まだよくわかっておらずすいません
やりたかったことはおっしゃっていただいたまさに(2)です
教えていただいたやり方でできそうです
とても助かりました。ありがとうございました
また機会がありましたらよろしくおねがいします
2014/05/02(金) 21:33:28.65ID:ZxAJrCZC
>>394
そんなにめんどくさくなかったぞ。非商用利用で登録するときと大して変わらなかった気がした。

ついにfortran2003完全準拠か。国産コンパイラベンダも早く頼むで。
2014/05/08(木) 01:43:46.59ID:akP1EH34
連休を利用してFortran2003用のCheet Sheetを作ってみた。
自分が使っていたメモと、このスレに出たこと等をギリギリ突っ込んでみた。
ttp://www.pdf-archive.com/2014/05/07/f2003quickref/f2003quickref.pdf

一応、プログラム片は、Intel Fortran 2015ベータで動くことを確かめたつもり。
誤り等があったら、やさしく指摘してくれ。

豆本になっているので両面印刷して、以下のサイトを参考にして本にしてくれ。
ttp://k.e-kuchikomi.info/K_140266/
2014/05/08(木) 22:20:11.32ID:GsOSKq7r
intel fortranを使っていて、-parallelが速く使っているのですが、
以下のようなサブルーチンで、依存関係で自動並列化がされていないのですが、
並列化するためになにかヒントをご教授いただけないでしょうか。

(宣言後)

a=0

do k=1,kmax
do j=1,jmax
do i=1,imax
if(logical(j,i,k))then
a(j,k)=a(j,k)+1
endif
enddo
enddo
enddo

logicalはファンクションで別ファイルで書いています

勉強不足で申し訳ありませんがよろしくお願いします
2014/05/08(木) 23:40:27.39ID:akP1EH34
LOGICALをPURE宣言すればいい。
PUREでないならコンパイラは判断できないので自動並列化は無理だろう。
手動でコンパイラ支持行で明示してやれ。

しかし、iは関数内にいれて
forall(j=1:jmax,k=1:kmax) a(j,k)=ifun(j,k)

pure function ifun(j,k)
...
do i = 1, imax
if (...) ifun = ifun + 1
end

みたいにしたほういい。
2014/05/09(金) 22:46:22.53ID:yQPNJst2
>>401
ご教授ありがとうございます
forallやpureなど使ったことがなく、書き方例など大変勉強になりました

ご教示いただいた内容で書いたのですが他との兼ね合いの依存関係なのかまた出てしまいました

(col. 58) remark: 並列依存関係: FLOW の依存関係が var$649 行 343 と var$649 行 91 の間に仮定されました。
などなど

どうも他のサブルーチンの書き方も並列化に悪いようで、教えていただいた並列化方法を頼りにまず勉強しなおして、
他のプログラム部分もいい機会なので見直そうと思います。

ありがとうございました。
2014/05/10(土) 00:07:21.90ID:ZxmW9Mt1
Linux 使いでEclipse + photran のフォートラン統合開発環境を構築しようかと考えているのですが、なかなかうまくいきません。

例えば、今までターミナル上で
Gfortran hoge.f90 main.f90 でコンパイルできたてのに、eclipse だと ant build not found とかででうまくいきません。
ちなみにhoge.f90 はモジュールファイルで、main.f90がメインプログラムです。

エクリプスでもhero.f90 (メインプログラム単体)単体のコンパイルは出来ています。
もしかして複数ファイルを同時に今コンパイルできないとか?
2014/05/10(土) 01:44:31.61ID:X6uqaHXX
プロジェクトにソースファイルを全部入れてビルドするだけだが駄目かい?
2014/05/10(土) 05:24:00.09ID:ZxmW9Mt1
>>404
え?それだけなんですか?
プロジェクトに全部ファイル入れてあります。なのにエラーが。。。
2014/05/11(日) 09:02:09.98ID:4C2ZppHJ
>>405
ここで聞いてもムダだよ。
ここにはエクリプス使ったことない奴しかいないから。
みんなテキストエディタ直打ちだから。
2014/05/11(日) 10:52:57.57ID:wJQWAvOW
>>399
乙。いただいた
2014/05/11(日) 12:54:27.66ID:a5cPk+x+
>>399
GJ!
英語ばかりでびっくりした。参考文献欄があるのが凄いね。
2014/05/11(日) 17:20:58.15ID:cyBk1jZ9
Implementing the Standards...including Fortran 2003
http://www.fortran.bcs.org/2007/jubilee/f50.pdf

Fortran 2003 and Beyond
パワポ
https://cug.org/5-publications/proceedings_attendee_lists/2005CD/S05_Proceedings/pages/Authors/Long-0517-1100/Long-0517-1100_slides.pdf
PDF
https://cug.org/5-publications/proceedings_attendee_lists/2005CD/S05_Proceedings/pages/Authors/Long-0517-1100/Long-0517-1100_paper.pdf

Intel Parallel Universe issue 11 p.22
https://software.intel.com/sites/default/files/parallel_mag_issue11.pdf
2014/05/13(火) 00:50:14.94ID:X5XVCl1f
fortranまとめwikiないよなそういえば
2014/05/13(火) 11:18:46.53ID:Ml4tWcMx
sin波のようななめらかな波形データから尖頭値を抽出するにはどうすればよいでしょうか。
波形データの入っている配列aから抽出したいのですが、sin波のような綺麗な周期を持っておらず、地震の観測波形のように不規則に連続して変化していっています。
2014/05/14(水) 12:56:39.35ID:wOYwf617
こんなの来てた。

MODERN FORTRAN FOR SCIENTISTS AND ENGINEERS
By Damian Rouson

http://jolts.stanford.edu/72/modern_fortran_for_scientists_and_engineers
2014/05/15(木) 01:14:31.34ID:cUF0eH5o
>>406
いえ、そんなことおっしゃらず…

今までエディタ使って作成してたフォートランファイルをエクリプスのプロジェクトフォルダに入れてビルドしようとしてもうんともすんとも言わないです。
で、デバッグできないという…
2014/05/15(木) 02:31:06.49ID:klLDqCtV
Fortran90/95による実践プログラミング [単行本(ソフトカバー)]
安田 清和 (著), 水野 正隆 (著), 小野 英樹 (著)
http://www.amazon.co.jp/gp/product/4872594738


いつの間にかこんなのが出版されているんだが、見たやつ中身はどうよ?
目次からすると、おっおぅ!…ってかんじなんだがw
2014/05/16(金) 01:40:42.79ID:USQ/ZI5B
なんかエクリプスとフォトランの詳しいマニュアルないかな?
本家でもversion古いし
2014/05/16(金) 01:49:02.89ID:pE1PewlD
>>415
Youtubeで外人のおっさんが実演してたぞ。
俺は使ってないからようわからんがw
2014/05/16(金) 02:01:11.54ID:USQ/ZI5B
>>416
おお!YouTubeでですか(´・_・`)

みなさんはエディタからコンパイルしてますか?
デバッグとかどうしてます?gdbとかdddですか?
2014/05/16(金) 02:08:04.34ID:cU3+Idig
fortranで書いたプログラムの出力ファイルを読み込んで、それを元にしたグラフを書かせたいのですが、1)それに適したグラフ描画ソフト2)そういったことを解説してある本はないでしょうか?

現状はExcelVBAで出力csvファイルを呼び出し、所定のExcelシートで編集してグラフにするためのデータを作成し、そのあと手動でグラフを作成しています。

Excelを挟まず、csvファイルをもとにグラフを描画してくれるプログラムがあるととてもありがたいのですが、何かできないでしょうか
2014/05/16(金) 07:25:49.77ID:USQ/ZI5B
>>418
Gnuplot, R とか(´・_・`)
2014/05/16(金) 15:01:20.39ID:GjdBspSJ
現在,windowsで大学の課題でmingwを使用してコードのコンパイルや実行しようとしています。
コンパイル自体は成功したようにみえたのですが実行する際に
「コンピュータにlibquadmath-0.dllがないため,プログラムを開始できません.
この問題を解決するには,プログラムを再インストールしてみてくだい.」
と表示され実行できません。

因みにコンパイルしたコード(hello.f90)は以下のようになります。
program hello
print *, 'Hello World!'
end program hello

またC言語(C++)のコードのコンパイルや実行には成功しています。
2014/05/16(金) 19:43:53.43ID:xH+zzs4U
path
2014/05/16(金) 19:48:37.92ID:xH+zzs4U
http://www.oki-osk.jp/esc/cyg/cygwin-27.html
2014/05/16(金) 21:38:59.32ID:HsLYY/75
>>420
以前、似たような(同じ?)エラーメッセージに遭遇した事があったが
その時は件のライブラリを強制再インストールしたら直ったように思う。
mingw-get update
mingw-get --reinstall upgrade mingw32-libquadmath
これを実行してMinGW(MSYS)のターミナルを再起動すればどうかな。
2014/05/17(土) 06:32:26.00ID:97dT5LKY
>>419
gnuplotですかありがとうございます
2014/05/17(土) 07:18:10.88ID:ScBioaGh
清書にはmatplotlibでね?
2014/05/17(土) 14:11:28.79ID:6t+Gfvcv
>>414
今日日出すなら2003と2008解説してほしい
427420
垢版 |
2014/05/17(土) 19:57:54.60ID:j7anWBLq
>>423
ありがとうございます.
なんとか実行することができました.
2014/05/18(日) 18:58:17.41ID:8yAoHmFE
>>426
ですよねー
2014/05/30(金) 03:00:46.51ID:r0FrxYTY
メモ帳のインプットファイルから一行ずつ読み込んでプログラムを回す時、読み込める一行の長さの限界というのは決まっているのでしょうか

例えば
有効数字8桁の数字を10個、一行に並べて書いた時はエラーで読みませんが、それらの桁を4桁まで減らして並べて書いたらプログラムが回るのです。

Excelで作ったものをメモ帳にはっつけて使っているので、セル間をタブキーによる空白で置き換えられます。
その空白を半角スペースに置き直して一行の長さを短くしても読むようになるので、読み込める一行に限りがあるように感じます。
CHARACTER CARD 100
という部分を200に変えても意味がなかったのでどこを変えれば読み込める一行を長くできるのかがわかりません。
2014/05/30(金) 03:29:52.60ID:thFm9kuD
read文が書かれた行をコピペして.

普通はcharacterなんか使わずにこう書く.
real(8) :: val1, val2, val3, val4, val5, val6, val7, val8, val9, val10
open(10,file='ファイル名')
read(10,*) val1, val2, val3, val4, val5, val6, val7, val8, val9, val10
write(*,*) val1, val2, val3, val4, val5, val6, val7, val8, val9, val10
2014/05/30(金) 08:44:23.58ID:U3Y1cq1n
>>430
20年以上前に書かれたプログラムを少し編集しようとしています。読み込み部分は他の人が書いていて、初心者の私はそれを少し編集したいのですが、自信がないです

とにかくやりたいことはinputファイルのうちあるブロックの読み込み部で1行につき10個読んでいるところを14個読むようにしたいのです

CHARACTER CARD 100という意味もよくわかっていません。調べてもCARDの意味が出ませんでした。

input.txtを読み込むよう指示するのですが、全体としてそのinputは数千行とあります。それでもそのような記述で大丈夫なのでしょうか。
2014/05/30(金) 15:49:55.31ID:dCRThtZs
どのような記述だよ
2014/05/30(金) 19:59:51.61ID:1KLLWRFX
>>431
あなたのすることは数字の大きさをかえるような小手先の対応ではなくて、
昔のプログラムの動作なり、コードを理解することではないでしょうか?
10から14に数を増やすためにすることが読み込み箇所の変更だけですむのかなと心配になります。
10前提で処理がコードとして記述されていないか、計算式があるなら数を増やして大丈夫なのか、
チェックすることはいろいろあると思います。
あなたに指示をされた先輩なり上司のかたが変更方針がわかっておられて、指示をされてればいいのですが。
2014/05/31(土) 00:38:02.07ID:8hxwwbXy
>>433
配列の上限や各プログラムでのループ処理で何個読めるのかを確認しました。その点は修正しても大丈夫でした。
しかしinputファイルから読み込む一行があまりに長いとエラーを起こすのは改善できませんでした。
2014/05/31(土) 01:01:49.98ID:yeEEhfSt
どこからどこへどれだけデータを読み込むか書いてあるのが read 文なので
それが出ないとどうにも。それに input.txt が長くいろいろブロックがあるなら
対応する read 文もいくつもあるうちのどれかってとこだな。
2014/05/31(土) 01:45:38.26ID:3e7Yho2f
最初の質問
>読み込める一行の長さの限界というのは決まっているのでしょうか
に答えるとすれば,
「データをどう読むようにコーディングされているかによります」
かな.

何度もread文を書くように言われているのに書かないってことは,
知的財産の流出とかなんかを気にしているのかな?
ソースコードをほんの一部でも書けないなら,先輩なりに聞いた方がよい.
2014/06/02(月) 00:07:12.28ID:vUSkffdq
2014/06/02(月) 00:13:33.24ID:BIE796Bm
>>435
>>436
プログラムの中でちょくちょくある
read card 100
character 100
という部分で読み込んでいるのではないかと思います

プログラム作成者と話して100→200とかに増やせばなんとかなるんじゃないかとなって変更しましたがなんの効果もありませんでした
500にしても変わらなかったので、そもそも読み込める長さが決まっているのではないかと考えるようになったのです
2014/06/02(月) 01:34:45.52ID:mPD7/eRQ
何度も書けと言われているものを書かないのはなんでだろう
書けば直したりしてくれるかも知れないのに
書かれている文はFortranの文法に合わないし

cardに一度読み込ませて、その後各変数に値を分配しているように思えるけど、これだけでは分からない
読み込みができているかreadの後に変数の値の確認とかしてなさそうだし
単純に1行でどこかまで読めるかテストプログラム組んで確認してなさそうだし
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の入門書を見てみたのですが,見当ら
なかったので,質問したしだいです。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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