1 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 09:55:26 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用) pc8.2ch.net/test/read.cgi/tech/1138063703/ くだすれFORTRAN(超初心者用)その2 pc11.2ch.net/test/read.cgi/tech/1164121236/ ●関連スレ FORTRAN W pc8.2ch.net/test/read.cgi/tech/1163319215/
116 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:06:06 ] 俺の方法は character(len=50):: fmt integer:: line write(fmt,*) "A7,", line, "F8.2" do i = 1, ii read(40,fmt) dummy3,(a(i,j),j=1,jj) enddo てやると思う。 数字書き出すときに1桁、2桁、3桁それぞれ別書式にする場合に使ってる。
117 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 01:45:46 ] しかし、FORMAT文の動的変更は200レス毎に1回くらいは必ず来るなw これが教科書に載っていないという点で、一体教科書執筆者は何をやっているのかと問いつめたい。 漏れ自身の場合も、この方法を知ったのはFORTRANやり始めて5年目くらいだったか。 他人のソースを読んでいて、意味不な変なことやっているなと、最初は思ったw 改めて文法書を読めば、確かに内部ファイルの項目はあったのだが、読み飛ばしていた。 文字変数が無くて整数変数に文字をつっこんでいたFORTRAN66のホレリス時代の聖遺物かと思っていたw
118 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:36:12 ] 良くも悪くも数値計算用言語ですから、 数値を上手く取り扱う方法に目がいって その辺の所は教科書書く人も勉強する人も興味ない。
119 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:25:45 ] >>115 >>116 無事にいけました☆本当にありがとうございました!
120 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:55:37 ] >>118 読者は興味ありまくりんぐじゃないの。この質問ばっかりで無限ループしているジャン。 まぁ、 1.フォーマット文が文字列や文字変数で与えられる。 2.内部ファイルによって、文字列⇔数値変換が出来る。 という、あまり知られていない2点を同時に使うので、教育の威力が如実に現れる項目であるはずなのだが。
121 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:23:33 ] 執筆者予備軍としての一言 ・VB やJAVA のようにさまざまな発刊企画があれば、 上級者向け書籍が作れるが、Fortran では無理。 ・初心者向け書籍では、内容を厳選するよう要請される。 頁数を少なく、文字数を少なく、挿し絵を充実、などなど。 common や内部ファイルは真っ先に削除対象となる。
122 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:27:04 ] COMMON文の説明なんて要らないから 純粋なFortran95の解説書出してよー F2003でもいいけど
123 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:55:12 ] COMMON 文は F77 では必要悪だが F95 だとバグを産む素でしかない。
124 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:35:44 ] >>121 コラムとか付録のサンプルとかで、何とか突っ込んでくれ。
125 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:53:35 ] 動的の説明を書かないにせよ character(len=20):: fmt fmt = 'A5,2X,I10' 100 format(fmt) って例が載っているだけでも、 あーこんな使い方できるんだ〜 って思えるよなあ。
126 名前:118 mailto:sage [2008/02/04(月) 01:00:23 ] >>120 質問してくるのは、勉強中の人じゃなくて一通り基礎を勉強して、 より実用的、応用的なプログラムを組んでる人だと思うんだよね。 Fortranは数値計算とセットでやる事が多いだろうから 優秀な大学じゃないと内部ファイルまでやれないよ。 無理してそこまでやっちゃったら、大切な部分が疎かになったり 数%しか単位取れませんでしたとか言う事態になっちまう。
127 名前:デフォルトの名無しさん [2008/02/04(月) 16:50:31 ] symbol A is not an array こんなエラーが出るんですが何がいけないんでしょう?
128 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 18:59:12 ] シンボルAは配列ではありません
129 名前:デフォルトの名無しさん [2008/02/04(月) 19:58:45 ] Statement function statement cannot occur here invalid forward reference to label 117 >>128 ありがとうございます ちなみにこれはどうすればいいんでしょう?
130 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 21:17:37 ] >Statement function statement cannot occur here 文関数はここに存在することが出来ません 実行文の後ろなど、文関数の定義を置けないところに文関数の定義がある。 配列や関数の引用の書き方が間違っている可能性もある。 >invalid forward reference to label 117 ラベル117の無効な前方参照 文番号117が参照されているが見つからない。 どれも簡単な英文で、読めば全てではないにしろ大まかに察しが付くような文なので エラーメッセージは自分でよく読むように習慣づけよう。
131 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:17:27 ] >>129 >>130 氏を補足しよう。 >Statement function statement cannot occur here これは未宣言の配列を用いるとよく出てくるメッセージだ。 配列を宣言し忘れていたり、綴りを間違い、かつ添え字に変数を使っていると出てくる。 FORTRAN77では文関数なるものが導入された。 これは一行で書ける関数を宣言文のところで宣言しておくと、実行文のところで利用できるというものなのだか 大して役に立たないのでほとんど使われない。それだけならよかったのだが、とんでもない副作用が生じてしまった。 実行文のところに、たまたま変数を添え字とする宣言し忘れの配列を使ったとする。 すると見かけ上は文関数の定義のように見えるので、(そういうパターンにマッチしてしまうので) 上のようなエラーメッセージが現れることになる。 例 f(i) = 5 * i + 1 これが宣言文のとこに現れば、f(x) = 5 x + 1 という関数を文関数で宣言したことになるし、 DIMENSION f(10) i = 1 f(i) = 5 * i + 1 .... のような形で現れれば、配列fのi番目の要素に、5i + 1を入れる代入式と解釈される。 この文関数がらみのエラーは、だされるメッセージと実際のエラーの内容が食い違っているので、 FORTRAN77初心者を惑わす罠になっている。 これは必ず通る道なので、まぁ文句言わずにあるがまま受け入れろw
132 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 07:36:18 ] >こんなエラーが出るんですが何がいけないんでしょう? 俺なら「おまえの頭」っていうところだけどな
133 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 11:07:31 ] >>132 うっせー おまえこそ すっこんでろ!w ここはくだスレだからFORTRAN振興のために、宿題も解く甘やかしスレだ!
134 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 02:24:45 ] FORTRANってなんですか? アプリケーションを作れたりするプログラミング言語なんですか?
135 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 10:59:57 ] 科学研究をするログラミング言語です
136 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 15:48:50 ] Linuxでの実行モジュールを作るには、Linuxで開発・コンパイルするしかないんでしょうか? WindowsのVisualStudioに慣れてしまったので、この上で全部できればいいなと思うんですが・・・
137 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 20:42:45 ] Linuxでやるしかないかな。 だけど、コーディングをLinuxでやる必要はないので、 そんなに大変じゃないと思う。 コンパイルオプションをLinux版に変えるだけで 頑張ってMakefile書くくらいで終わりっしょ。 特にVisual Studio + Intel fortran から Intel fortran Linux に行くだけなら つまづくこともかなり少ないと思われ。
138 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 21:12:16 ] gcc をクロスコンパイル用にコンパイルしてしまえば 別に Windows 上でも Linux 用のバイナリを作ることはできるが、 Visual Studio 上となると・・・。 自分で makefile 書けば一応いけるのか? まあ、一番の問題はデバッグが大変ってことか。
139 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 22:58:55 ] ./a.out
140 名前:136 mailto:sage [2008/02/08(金) 00:16:57 ] >>137 ということはWindowsとLinux両方買わないといけない、ってことですよね? コンパイラスイート買う予定ですが、Academicでも10万超えは堅いですね・・・ >>138 gccはGNUなだけにその辺偉いのですが、速度が・・・ 数値計算だとどうしてもLinuxが主流なので、色々と悩ましいところではありますね。
141 名前:136 mailto:sage [2008/02/08(金) 00:21:06 ] 今気づいたのですが、Intel FortranコンパイラをVisual Stuido上で使った場合 出てくるロードモジュールはもしかしてマネージコードになるんでしょうか?
142 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 01:52:57 ] >>140 学術目的ならLinux版は無期限ライセンス版が落とせる。 >>141 普通のEXEバイナリを吐く。
143 名前:136 mailto:sage [2008/02/08(金) 10:07:16 ] >>142 >学術目的ならLinux版は無期限ライセンス版が落とせる。 ↓ですね。 ttp://www.intel.com/cd/software/products/ijkk/jpn/224378.htm コンパイラ以外も可とは、気前いいですね。 ただ、いくつかはPage Not Foundになってたりしますが・・・ >普通のEXEバイナリを吐く。 そうですよね、安心しました。 そういえばLinuxにはmonoがあるから、いちおうマネージコードでも動くことは動くのかなぁ どうもありがとうございました。勉強になりました。
144 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 19:45:07 ] VisualStudioがあるのにIntel C++コンパイラ必要? Intelのほうが速いから?
145 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 23:58:28 ] >>144 FORTRANと組み合わせるならIntelC++の方が楽。 BLASの類のライブラリのこともあるし。SSE、並列化等のCPUの最適化もIntelのほうが対応が早い。 またLINUXとWinとで同じにやろうとするなら条件がそろうのでIntelの方がいい。 無論C++でWin32API叩いたりするならMSの方が有利だろう。
146 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 01:56:22 ] >>145 なるほど thxです
147 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:58:08 ] かなりどうでも良いことなんですが、 vimで.f90のソースを書いていると、 勝手にインデントをスペースに置き換えられるんですよね。 まあnoexpandtabすればタブ文字で書けるんですが、 syntaxの設定上タブ文字が赤く表示されてなんだか不安な気分に。 これもsyntaxファイルを改変すれば変えられるのでしょうけど。 fortranの世界ではソースにタブ文字を使わない事が常識なんでしょうか?
148 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 20:12:21 ] 常識 1行72文字とか132文字とか制限があるのに 何文字にカウントされるか分からないタブ文字を使うなんて プラットフォーム依存性を無駄に招いているとしか思えない
149 名前:147 mailto:sage [2008/02/11(月) 20:42:23 ] >148 なるほど。文字数の制限があるからですね。 fortran90から入ったので、 ほとんど文字制限を気にした事が無かったから気づきませんでした。 ありがとうございました。
150 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:25:04 ] >>148 > 常識 > 1行72文字とか132文字とか制限があるのに f90 は自由形式だからその制限は無いはず。 f77 は制限アリ。
151 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:50:24 ] >>150 文法書をもう一度読め。 Fortran90は132カラムだ。 Fortran2003ではもう少し増やす。機械生成のコードだと、変数名などが長くなりやすいから。 それにしてもインデントでタブが入るエディターは本当にむかつく。
152 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:55:05 ] 行頭のスペースを勝手にタブ文字に変えられると「タブ形式」と間違えられちゃうよー
153 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 00:05:18 ] 少なくとも Intel Fortran は1行の文字制限はないよ。 他のコンパイラも大概独自で対応しているんじゃないかな。
154 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 10:37:30 ] NagのFortran Builder という開発環境を使ってる方いましたら、どんなものか教えてくれますか? ttp://www.nag-j.co.jp/FortranBuilder.htm 他社A他社Bってどこでしょうかね?
155 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 12:19:44 ] >>153 まぁFortranの規格はISOが決めているから。 各ベンダーの拡張は拡張として。 Intelは確かに原則制限無し、7200文字のようだ。 >Free Source Form >In free source form, statements are not limited to specific positions on a source line. >In Fortran 95/90, a free form source line can contain from 0 to 132 characters. >Intel Fortran allows the line to be of any length. >Fortran source line length > fixed form: 72 (or 132 if /extend_source is in effect) characters; >free form: 7200 characters
156 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 13:54:10 ] 目が悪くて文字解像度をあげられず、 エディターの一行表示上限が94文字しかないオレ様にしてみれば、 132文字も7200文字も無限と同じ。
157 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 17:17:43 ] makedepf90、Windowsでビルドできないかなぁ。 みなさんオブジェクトの依存関係とか、どうやって調べてますか? 基本的に1ファイルに1個モジュールで書いてるから use文を抽出さえすれば簡単にできそうか
158 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 00:40:42 ] うほっ! 前スレに自己出力プログラムが出ていたが、俺も作ってみた。 IntelFortranで確認した。 一応F90の規約にのっとっている。以前上げられていた奴より分かりやすいのではと思うが如何? ここでCHR(39)は『'』。 CHARACTER(LEN=68)::f f='("CHARACTER(LEN=68)::f"/"f=",3a/"PRINT f,CHAR(39),f,CHAR(39)"/"END")' PRINT f,CHAR(39),f,CHAR(39) END
159 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:52:02 ] Vistaで使えるフリーのfortran90コンパイラってありますか?
160 名前:デフォルトの名無しさん [2008/02/13(水) 17:24:29 ] どうやってもこのエラーが消えないけどどうしたらいいんだろう? assignment between arrays of differing rank
161 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 17:38:11 ] >>159 Vista + Cygwin + gfortran or g95
162 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 00:50:54 ] >>159 Silverfrost の FTN95 かな。Vistaで動くかは知らんがw ttp://www.silverfrost.com/11/ftn95/overview.asp >>160 配列の次元があっていないと言っているので、そのエラー行をよく見直すしかない。
163 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:44:10 ] FORTRAN90 を勉強している者ですが構造体を下記のプログラムのように 使いたいのですがエラーがでてしまいます。m と n は、上位ルーチンのみ で固定させたい(下位ルーチンにはサブルーチンの引数でサイズを渡したい) のですが上手い方法をお教え頂けますでしょうか?構造体を使わず、 a(n,m) i(n,m) と配列にすればいいのでしょうが構造体を使って 書きたいので質問させて頂きました。よろしくお願い致します。m(_ _)m program test implicit none integer,parameter::m = 1 integer,parameter::n = 1 type kouzou real(8)::a(n) integer::l(n) end type kouzou type(kouzou)::data(m) call dataset(data,m) write(*,*) data(1)%a(1) write(*,*) data(1)%l(1) end program subroutine dataset(data,m,n) implicit none integer,intent(in)::m,n type kouzou real(8)::a(n) integer::l(n) end type kouzou type(kouzou),intent(out)::data(m) data(1)%a(1) = 3.0d+00 data(1)%l(1) = 2 return end
164 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 01:23:42 ] >>163 記憶が正しければ、それはFortran95以前では出来ない。 TYPEの中の型やサイズを引数にするのは、Fortran2003で導入される機能だ。 Fortran95以前で実現するには、POINTER属性で宣言してメインでALLOCATEするのかな? ただ、単にTYPEの宣言を1ッ箇所で済ませたいだけならば、独立したMODULEでTYPEを宣言して あとは残りのルーチンでそれをUSEすればよいと思う。 MODULE m_type IMPLICIT NONE integer,parameter::n = 1 type kouzou real(8)::a(n) integer::l(n) end type kouzou END MODULE m_type ! MODULE m_subs USE m_type CONTAINS subroutine dataset(data_,m) implicit none integer,intent(in)::m type(kouzou),intent(out)::data_(m) data_(1)%a(1) = 3.0d+00 data_(1)%l(1) = 2 return end subroutine dataset END MODULE m_subs ! program test USE m_subs (以下略 (ここではm_typeをカスケードに呼んだが
165 名前:デフォルトの名無しさん [2008/02/17(日) 11:02:41 ] スレチと思うけど質問させてください。 計算機によく入っているbsubとかqsubって打ってjobを実行するソフトって 何て言う名前ですか?フリーウェアですか?
166 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:10:40 ] >>165 それはジョブ管理システムというものだ。 ググレばなんか出てくるだろう。 普通はメーカー毎・OS毎に独自のものがある。 LinuxとかだとLSFというのが主流の気がする。 UNIXはTSS処理を売りにしていたので、むかしJOB管理が糞だった。
167 名前:165 [2008/02/17(日) 14:40:22 ] >>166 ググって色々調べてみたところ「Generic NQS」ってのが フリーみたいですね。 自宅で数値計算をして遊んでみようと思いまして(;^_^A どうも返答有り難うございました。
168 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 17:25:42 ] Intel Visual Fortran での、Windows用グラフィック・ルーチンを作っています。 プロトタイプができているので、興味がある人は見てみてください。 ttp://d.hatena.ne.jp/fortran66/ やりたいことは、昔のBASICやXYプロッタ時代のようなグラフィックス・ルーチンで、 普通のコンソール用プログラムから簡単に呼び出せて、かつ対話的に絵を描けるものです。 変な何をやっているのかまったく不明なライブラリ集とかをインストールすることなく、軽く実現するのが目標です。 大げさなものにはせず、各人で好きなように拡張できるような、見通しの良い最小構成が出来たら良いかなと 思っています。
169 名前:163 mailto:sage [2008/02/17(日) 23:44:38 ] >>164 さん 丁寧なご回答どうもありがとうございます!! 返信が遅くなり 申し訳ございません。今、intel fortran compiler 10.1 で メイン部分を下記にして動くことを確認できました。 Fortran2003で導入される機能ということで驚いています。 program test use m_subs implicit none integer,parameter::m = 1 type(kouzou)::data_(m) call dataset(data_,m) write(*,*) data_(1)%a(1) write(*,*) data_(1)%l(1) end program
170 名前:163 mailto:sage [2008/02/17(日) 23:45:55 ] 実は、私がやろうとしていたのは、構造体のサイズ m とその中の要素の サイズ n を下記のように入力データのようなものから動的に取得して 構造体の確保を実現させようと考えておりました。 下記のようなプログラムの構造体バージョンが目標でした。 下記の配列バージョンだと確保した配列全部をサブルーチンの 引数でひきずっていかなければならないと思うのですが構造体で 定義しておけば配列をパックにした構造体 1 つを引数で渡せると 考えました。 164 さんに教えて頂いたプログラムの MODULE m_type での 構造体の中の要素のサイズ n は、動的(データで決定)ではなく parameter 文で静的にコンパイル時に確定させなければ ならないんですよね? 長々と書いてしまって申し訳ありません。m(_ _)m
171 名前:163 mailto:sage [2008/02/17(日) 23:46:47 ] program test implicit none integer::m,n read(5,*) m,n call test2(m,n) end program ! subroutine test2(m,n) implicit none integer,intent(in)::m,n real(8),allocatable::a(:,:) integer,allocatable::l(:,:) allocate(a(n,m),l(n,m)) call dataset(a,l,n,m) write(*,*) a(1,1) write(*,*) l(1,1) deallocate(a,l) return end ! subroutine dataset(a,l,n,m) implicit none integer,intent(in)::m,n real(8),intent(out)::a(n,m) integer,intent(out)::l(n,m) a(1,1) = 3.0d+00 l(1,1) = 2 return end
172 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 02:32:34 ] >>170 そういうことなら、以下のように出来る。 MODULE m_type IMPLICIT NONE type kouzou real(8), POINTER::a(:) integer, POINTER::l(:) end type kouzou END MODULE m_type ! MODULE m_subs USE m_type CONTAINS subroutine dataset(data_,m) implicit none integer,intent(in)::m type(kouzou),intent(in out)::data_(m) ← INOUTにしないと駄目みたい。 data_(1)%a(1) = 3.0d+00 data_(1)%l(1) = 2 return end subroutine dataset END MODULE m_subs ! program test USE m_subs implicit none integer,parameter::m = 1 INTEGER :: n = 2 type(kouzou)::data_(m) ALLOCATE(data_(1)%a(n), data_(1)%l(n)) call dataset(data_,m) (以下略 ただALLOCATEは配列の全要素にいちいちやらないと駄目。解放も面倒。コンパイラによってはPOINTERはALLOCATEでも可。
173 名前:163 mailto:sage [2008/02/18(月) 14:44:48 ] >>172 さん、本当に感謝です!! 上手くいきました。 ありがとうございます!! m(_ _)m 下記にすることで動的に確保できました。 上手い方法があるもんですね... ただ、指摘された以下の場所は、私が試したところでは、inout で なくても OK でした。 type(kouzou),intent(out)::data_(m) あと、解放ですが deallocate(data_) 一発で OK? program test use m_subs implicit none type(kouzou),allocatable::data_(:) integer::i,j,m,n read(*,*) m,n allocate(data_(m)) do j = 1,m do i = 1,n allocate(data_(j)%a(i),data_(j)%l(i)) end do end do call dataset(data_,m) write(*,*) data_(1)%a(1) write(*,*) data_(1)%l(1) deallocate(data_) end program
174 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 23:15:43 ] >>173 多分Intelのコンパイラなら、POINTERをALLOCATABLEにしてもよいはず。 Fortran2003で可能になる機能だが実装されている。 >あと、解放ですが deallocate(data_) 一発で OK? 多分、ALLOCATEしたときと同じようにいちいち解放しないと駄目だと思う。 少なくともPOINTERの時は。ALLOCTABLEの時はいいかもしれないが、忘れたw 調べてチョ
175 名前:163 mailto:sage [2008/02/19(火) 00:01:59 ] >>174 構造体とポインタの使い方が分かって非常にためになりました。 ありがとうございます。色々と変えてみて試してみます。m(_ _)m
176 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:37:08 ] 単精度をコンパイルオプション一発で倍精度にすることってできますか?
177 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:59:45 ] >>176 > 単精度をコンパイルオプション一発で倍精度にすることってできますか? コンパイラは何?
178 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 00:01:57 ] >>176 一般的に、コンパイラには自動で倍精度にするautodblオプションがあることが多いので、マニュアル見ろ。 IMPLICIT REAL*8(A-H,O-Z)を入れるやり方もあるが、定数も倍精度にしないと下の桁にごみが入るので中々 容易い道ではない。
179 名前:490 mailto:sage [2008/02/27(水) 02:25:14 ] ちょっとずれた質問かもしれませんが、 皆さんプログラムを書く(デバッグ)するときに使っているツールで「これは便利だ」と思うツールを教えていただけませんか? わたしは大体vimで書いているのですが、tagexplorer.vimというスクリプトを使って、関数などを別のウィンドウに出したりしているのですが... 最近emacsで書いてみたいなあと思うようになって情報を集めているのですが、あまり情報が見つからないんです。 Cだとcscopeとか便利なツールがあるみたいなんですが...
180 名前:デフォルトの名無しさん [2008/02/27(水) 13:43:03 ] >>176 intel fortran だと、 -r8 で一発、 fujitsu だと -RR8 かなにか、でまぁとにかく一発。 念のためにと、parameter文や sin などの intrinsic な関数を適当に使った、 適当に1000回くらいiterateする短いコードを 最初から倍精度で書いたやつと、 単精度で書いたコードをオプションつけてコンパイルして計算したら、 計算の結果はbinary で一致した。 ほかのコンパイラでも似たようなもんだろう。
181 名前:176 mailto:sage [2008/02/28(木) 20:15:57 ] >>178 Intelコンパイラでした。マニュアル見たら速攻見つかりました・・すいませんでした。 autodblはHPやIBMのコンパイラでの名前みたいですね。 >>180 さすがにロードモジュールはバイナリ一致じゃないですよね。 わざわざ調べて頂いてありがとうございました。
182 名前:180 mailto:sage [2008/02/29(金) 13:13:23 ] >>181 べっ、別にあんたのためになんたらかんたら。 昔作ったのをもっかいコンパイル&実行してみただけ。 intel fortranはまめにバージョンを上げてくれてありがたいんだけど、 時々挙動が変わるからね。以前やったときはできあがった実行ファイルも 同一になったよ。バージョンによっては実行ファイル作成時の日時が 格納されるのか(推定)、全く同じファイルを全く同じオプションでコンパイルしても 同一でない実行ファイルが出来ることがあったけど。 今使っている version 9.1 だとサイズは同じで先頭部分の100バイトくらい微妙に違う。
183 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 13:24:30 ] >>182 うわ、ツンドラだツンドラだ
184 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 21:19:56 ] >全く同じファイルを全く同じオプションでコンパイルしても >同一でない実行ファイルが出来ることがあったけど。 「このファイル同じだっけ?」って確認をcmpでやる癖のある自分としては、ちょっと厄介だなぁ IntelFortranは今10.1だっけ?
185 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 14:27:05 ] Windowsの実行形式ファイルのヘッダには作成日時が入る箇所があるので、 IVFに限らず仕様通りに実行ファイルを生成するコンパイラ、というかリンカを使えば 同一ソースを同じオプションでコンパイルしても完全に同じ実行ファイルにはならない。 ttp://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/intro.html まあ、頭の方がちょっと違ってくるだけなので、違っている部分の位置で 同じ内容かどうかは判断できると思うが。
186 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:44:48 ] Debian+gfortranでやっています。 勉強で、以下のようなプログラムを作ってみたのですが、コンパイルエラーとなってしまいます。 program test implicit none real y y=hoge(3.0) stop end real function hoge(x) real x hoge=2.0 return end コンパイルするとy=hoge(3.0)のところで、 Function 'hoge' at (1) has no IMPLICIT type といわれます。どのように対処すればよいのでしょうか。
187 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:39:51 ] >>186 IMPLICIT NONEなのに関数hoge()の宣言がないから。 対処法としては ・関数hoge()を主プログラムtestの内部手続きにする。 ・testの中にhoge()のINTERFACE宣言を書く。 ・hoge()を含むMODULEを作る。 など。
188 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:47:26 ] real hogeをtestで宣言するかimplicit noneを削れ
189 名前:デフォルトの名無しさん [2008/03/07(金) 00:40:07 ] ここって、Linux環境でのFortranのインストールの仕方って 質問していいんでしょうか? Linuxの方でも場違いな気がいたしまして。。
190 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 01:18:17 ] >>189 GCC入ってないのか?
191 名前:デフォルトの名無しさん [2008/03/07(金) 14:40:22 ] えっと、説明不足ですみません。 ここで質問してもいいかわかりませんが、とりあえず Intel Fortran を Ubuntuにインストールしようとしたのですが、 まず、Ubuntuにデフォルトで開発環境が入っていないとか libstdc++.so.5が libstdc++5 だという話は解決したのですが、 コンパイラ、デバッガのインストールが終わって Please Enter to Continue で Enter を押しても、反応がなく、ただ改行する所で止まってます。 いろいろ調べて、Ubuntuのコミュニティで同様の投稿があったのですが、 なんだかよくわからず。(英語のページだからというのもありますが。。) Intelが発表している内容は、 ifort とかのファイルにある "/bin/sh"を"/bin/bash"に書き換えろとか書いてあるんですが、 すでに書き換わっていたりして。 もうお手上げです。。。 助けて下さい。。よろしくお願いします。
192 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 16:53:48 ] >>191 > インストールしようとした どうやって? 例えばl_fc_p_10.1.011_ia32.tar.gzをダウンロードして、 展開して出来たl_fc_p_10.1.011_ia32に移動して、 install.shを実行したということ? ubuntuのパッケージはdebだから、それにrpmのパッケージをそのまま インストール出来るのだろうか。 私はalienでdebに変換してインストールした。
193 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:28:14 ] HPUX上の fortran90 にて プログラムコードに”program main”と書かないと実行時に /usr/lib/hpux64/dld.so: Unsatisfied code symbol 'main' in load module '/usr/lib/hpux64/libc.so.1'. って表示されるんですが、”program main”を省略出来ないのは何故でしょうか? 何か環境変数で設定すればよきに計らってくれるのでしょうか?
194 名前:デフォルトの名無しさん [2008/03/07(金) 20:25:15 ] >>192 仰るとおり、install.shからです。 intelのインストーラが起動すると、 ubuntuではg++が入ってないと出来ないとは書いてましたが、 debとかrpmという言葉は出てきませんでした。 宜しければ、どうやってインストールされたか 詳しく教えていただくと有難いです。。
195 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:57:43 ] >>194 私はDebianは使っているけど、Ubuntuは使ったことがない。 以下はDebian使いの私のインストール方法なので、Ubuntuに そのまま適用出来るかどうかは知らない。また、あくまで私のやり方なので、 もっと楽なやり方があれば指摘して欲しい。 $ tar zxf l_fc_p_10.1.013_ia32.tar.gz $ cd l_fc_p_10.1.013_ia32/data $ fakeroot -u alien intel-ifort101013-10.1.013-1.i386.rpm $ fakeroot -u alien intel-iidb101013-10.1.013-1.i386.rpm $ su # dpkg -i intel-ifort101013_10.1.013-2_i386.deb # dpkg -i intel-iidb101013_10.1.013-2_i386.deb # cd /opt/intel/fc/10.1.013/bin ifort, ifortvars.csh, ifortvars.shを開き、<INSTALLDIR>という 文字列を、全て/opt/intel/fc/10.1.013に置換する。 私の場合、viで開き、 :%s/<INSTALLDIR>/\/opt\/intel\/fc\/10.1.013/g を実行した。 # cd /opt/intel/idb/10.1.013/bin idbvars.csh, idbvars.shを開き、<INSTALLDIR>という 文字列を、全て/opt/intel/idb/10.1.013に置換する。 ログイン時に上の*vars.shか*vars.cshファイルを読みこむように、 シェルの設定ファイルを変更する。私の場合はbashを使っているので、 ~/.bashrcに . /opt/intel/fc/10.1.013/bin/ifortvars.sh . /opt/intel/idb/10.1.013/bin/idbvars.sh を追加した。
196 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:03:43 ] >>193 考えにくいな。もっと詳しく。 最小例で。
197 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:28:57 ] >>195 さん ありがとうございます。 実は、Linux自体初心者で勉強し始めたばかりでなかなか困ってます。 195さんのように、ファイルをrpmからdebに直してされている方はUbuntuの方でいらっしゃいました。 僕もやってみましたが、こちらはデフォルトのエディタで、optファイル内は書込み禁止になっているらしくて、 その対処法がなくストップしてしまいました。 つまり、<INSTALLDIR>の置換操作が出来なかったところです。 あと、ログイン時に読み込むファイルの設定の仕方がとか、 そういったファイルの場所がわからなくて、困っていました。 やはり普通に実行しては無理っぽいんですね。 ありがとうございました。そのあたりを勉強しなおして、もう一度やってみます。 どうやら、問題はLinuxの操作の知識不足にあるようですから。。。
198 名前:192,195 mailto:sage [2008/03/08(土) 02:08:25 ] >>197 さようなら。
199 名前:デフォルトの名無しさん [2008/03/08(土) 11:49:08 ] サブルーチンsabuで計算結果をディスプレイに一行出力するのですが、 open文の後ではその出力がなぜかNANになってしまいます。 program main implicit real*8 (a-h,o-z) call sabu(1.0, 2.0) call sabu(1.0, 2.0) open(unit=24, file='gomi.txt', status='unknown') call subu(1.0, 2.0) call sabu(1.0, 2.0) close(24) stop end のように呼ぶと、必ずopen文の次から全てNANになります。 sabuの引数を変えたり、open文の装置識別子やファイル名を変えてみてもダメでした。 また、open文前後のsabuをcallする回数を変えてもダメでした。 sabu中では何個かのサブルーチンをcallしていて、その中でopen文は合計1行だけあります。 その装置番号は2で、装置識別子が重複しているわけでは無いようです。 原因は何でしょうか?宜しくお願いします。 cygwinでg77を使っています。 gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
200 名前:デフォルトの名無しさん [2008/03/08(土) 11:59:22 ] 今の時代FORTRAN使うメリットってあるんですか?
201 名前:デフォルトの名無しさん [2008/03/08(土) 12:29:51 ] TSS
202 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 12:35:40 ] >>199 sabu() の中で開けたものは、sabu() を出る前にちゃんと閉じてる? sabu() の中身が分からないので何とも…。
203 名前:199 mailto:sage [2008/03/08(土) 14:30:47 ] >>202 レス有難うございます。 sabu()中で、 open(2,file='input.dat',status='old') に続いて、read()した後close()があり、 write(*,*)'debug: close begin' close(2) write(*,*)'debug: close end' とwriteで挟んでみたところ正しく表示されるので、 close文は実行されているのだと思います。
204 名前:199 mailto:sage [2008/03/08(土) 14:31:49 ] 担当の先生によるとsabu以下は公開してだめだそうで、 一部を以下に写してみます(中略が要領を得ないときはご指摘ください) cccccccccccccccccccccccccccccccccccccccc subroutine sabu (xvalue,zvalue) implicit real*8 (a-h,o-z) < 中略(commonとdimension) > open(2,file='input.dat',status='old') < 中略(doとcontinueに挟まれてread) > write(*,*)'debug: close begin' close(2) write(*,*)'debug: close end' call sub1 <中略(ifとdoに挟まれて変数へ代入)> call sub2(x,eps) write(*,2000)(df(i),i=1,10) 2000 format(10e15.3) return end
205 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 21:49:47 ] よくわかりませんが、 mainとsabuでそれぞれにopen文があるので多重openになっていませんか?
206 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 23:50:39 ] >>204 情報が足りなくて全くのあてずっぽで書くが、昔のプログラムはAUTOMATIC変数がSAVE属性が あるかのごとく仮定していることがあるので、コンパイラのオプションでSTATIC属性にしてみそ。
207 名前:199 mailto:sage [2008/03/09(日) 11:51:38 ] >>205 レス有難うございます。 今writeでデバッグした限りですが、同じファイルを2回openはしてないように見えます。 流れとしては、メインprogramから、 open(unit=24, file='gomi.txt', status='unknown') ↓ サブルーチンをcall ↓ open(2,file='input.dat',status='old') ↓ close(2) ↓ サブルーチンからreturn ↓ close(24) となっています。 >>206 レス有難うございます。 アドバイスの通りg77で'-fno-automatic'を付けてみたらNANが無くなりました! www-jlc.kek.jp/~fujiik/mklinux/memo/g77/porting3-j.html >-fno-automatic: を指定すると、変数を static にアロケート します。 >これは、全てのルーチンに SAVE を付けるのと同値です。 大変感謝です。2週間これで詰まってました。 sabu含むすべてのサブルーチンでSAVEはありませんでした。
208 名前:206 mailto:sage [2008/03/09(日) 16:16:07 ] >>207 解決おめ。 少し補足すると、サブルーチンを呼んで帰った後、もう一回同じサブルーチンを呼んだときに、 サブルーチン内のローカル変数が前回の値を保持するかどうかが問題になっている。 FORTRAN77ではSAVE文ないしオプションが定義されて、明示的に前回の結果を取っておくことが 出来るようになった。規格ではFORTRAN77では前回の値を保障していなかったはず、 FORTRAN66では未定義かな? しかし慣習的に、FORTRAN66時代から、前回の結果が残っているような処理系の実装が主流だったために、 かつては大抵のFORTRAN77処理系ではSAVEが暗黙にデフォになっていた、と思う。 Fortran90時代になって、動的にメモリーを取ることが普通になって、SAVEを明示的に指定しないと、 毎回任意のメモリーが割り当てられることがデフォになった気がする。ゆえにローカル変数内に 非数値的なビット列(NaN)のごみが入っていたりする。 昔のプログラムではFORTRAN77でもSAVEを仮定していることが多い。大抵はそれで動いていた。 メモリーを動的に確保せず、リンク・ロード時に静的にメモリーを割り付けていた。 というわけでg77が歴史的事情を尊重しないのが悪いと言ってみるw NaNは配列はみだしか初期値のごみででることが多いのと、77スタイルのサブルーチンを出してきたので 推論した。
209 名前:デフォルトの名無しさん [2008/03/10(月) 21:14:08 ] 初めまして。超初心者なんで宜しくお願いします。 使っている環境はF90 g++ debian です。 以下 ソースです program dotp4 implicit none real(8), allocatable :: u(:), v(:) !allocatable属性を付けて割り付け配列を宣言 integer :: n write(*,'(a\)') 'input n :' !入力を促す表示(改行の抑制) read (*,*) n allocate (u(n), v(n)) !nを用いて配列の割り付けを行う write(*,'(a\)') 'input u(1 : n)' read(*,*) u(1 : n) !配列uの要素の値を読みとる write(*,'(a\)') 'input v(1 : n)' read(*,*) v(1 : n) !配列vの要素の値を読みとる write(*,*) 'dp = ' , dot_product(u,v) !内積の計算 deallocate (u ,v) end program dotp4 エラーは (col. 23) remark: LOOP WAS VECTORIZED. です。 DO 文でベクトルを使うと大抵この文がでて来ます。 どうぞ宜しくお願いします (ちなみにallocateが赤くなりません)
210 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:22:28 ] >>209 > write(*,'(a\)') 'input n :' !入力を促す表示(改行の抑制) ここの '(a\)' に対してなら文句を言われた。なので '(a\)' を全て * に変えてコンパイルしたら通った。因みに gfortran でだ。g95 ではもとのママでも何も言われなかった。実行については共に特に問題無さそうだった。
211 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:50:00 ] >>209 >エラーは (col. 23) remark: LOOP WAS VECTORIZED. >です。 これはエラーじゃない。リマークであって、警告ですらない。 単にDO-LOOPをベクトル化したという事を念のため教えてくれているに過ぎない。 つまりSSEを用いた最適化をしたという事を教えてくれている。 初心者なら、気にしなくてよい。
212 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 08:32:04 ] >>211 そのリマークってオプションなしのコンパイルでも出るんでしょうか?
213 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 11:48:37 ] >>212 処理系によって違うのでマニュアルを読んでもらうのが一番確実。 たとえば Intel Fortran の場合は、SSEによるベクトル化に関しては、 オプションを指定しないと何も言わない。 一般的に言えば、error, warning, info ( ここでは remark ) のような、 おおよそ3分類で、完全なるあやまち、分かってやってるならOK、念のための御注進 にあたるメッセージをデフォールトで言う。 うざいならオプションで抑止できるのが普通。 まぁコンパイラのオプションの説明嫁。
214 名前:デフォルトの名無しさん [2008/03/11(火) 15:47:45 ] >>210 >>211 ありがとうございます。 ちゃんと実行できました! remarkはエラーでは無いんですね。把握しました。 精進します
215 名前:デフォルトの名無しさん [2008/03/13(木) 03:18:38 ] 教えて下さい。 0の二乗が正しく計算できません。 なぜでしょうか? MacOSXでもg95で同じような計算結果になります。 プログラム hoge.f95 program hoge write(*,*) 0**2, 0.e0**2, 0.d0**2 end program hoge 以下、コマンド > g95 hoge.f90 > a.exe 1 1. 1. > g95 -v Using built-in specs. Target: Configured with: /src/G95/gcc-4.1.2/configure --prefix=/mingw --enable-languages=c --with-ld=/mingw/bin/ld --with-as=/mingw/bin/as --host=i386-pc-mingw32 --enable-threads --disable-nls --disable-win32-registry --enable-sjlj-exceptions --enable-libgcj --without-x Thread model: win32 gcc version 4.1.2 (g95 0.91!) Feb 7 2008 環境 Windows XP Professional Service Pack 2
216 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 11:25:15 ] >>215 > MacOSXでもg95で同じような計算結果になります。 MacOSX の g95 では上手く行っていますが?ちなみに PPC 版 Tiger。なので言っている事の意味ワカラン。