1 名前:デフォルトの名無しさん [2009/01/24(土) 18:32:01 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用)その3 pc11.2ch.net/test/read.cgi/tech/1196384126/ くだすれFORTRAN(超初心者用)その2 pc11.2ch.net/test/read.cgi/tech/1164121236/ くだすれFORTRAN(超初心者用) pc8.2ch.net/test/read.cgi/tech/1138063703/ ●関連スレ FORTRAN W pc11.2ch.net/test/read.cgi/tech/1163319215/
164 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 20:23:47 ] 今後、数百・数千CPU以上の並列計算になると、ファイル数を並列数分だけ分割するのは 管理上煩雑なので何とかしたいところですが、何か良い方法はないでしょうか? 例えば、今まで並列数分だけ分けていたファイルを1個のファイルにまとめ、 Fortran内でデータの場所(アドレス)を指定することで直接アクセスする ようなことができれば、かなり便利だと思うのですが。
165 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 23:37:04 ] >>164 DIRECT ACCESS でだめなのか? サイズが一定でないと困るが
166 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 14:15:43 ] >>164 MPI2にそんな機能があったような
167 名前:164 mailto:sage [2009/04/19(日) 20:21:55 ] >>165 directアクセスの存在を始めて知りました。 レコード長を把握しておく必要はありますが、効率は良さそうですね。 実際の使い方としては、recl指定子の値をデータの最小サイズで与え、 読みたいレコードの位置を逆算してread文のrec指定子に与える、 という方法で合っていますか? >>166 なるほど。ということは、Fortranの実装とは別の機能を用いる方法もある、 つまりやり方は色々ある、ということでしょうか。
168 名前:164 mailto:sage [2009/04/19(日) 20:54:59 ] >>167 の補足ですが >recl指定子の値をデータの最小サイズで与え、 と言うより、そのファイルを作ったときのwrite文のreclと同じ値をread文のreclに与える、 と言ったほうが適切でしょうね。 あと、使っていて気づいたことなのですが、statusを指定せずにopenしてwriteする場合 sequential・・・いったん元のファイルを消した上で書き込み direct・・・ファイルのレコード位置に対する書き込み という違いに気をつけないといけませんね。文法的に正確に書けば sequential・・・強制的にstatus='replace' direct・・・ファイルがあればstatus='old'、なければstatus='new' でしょうか。
169 名前:デフォルトの名無しさん [2009/04/20(月) 17:42:55 ] ちょっと質問というか確認 ディスクがフラグメンテーションしてる場合、データの分断を許すような 実装だと、ディスクへのアクセスはアドレスのテーブルみたいのを参照 しながらじゃないと原理的にできないよね フラグメンテーションしててもデータの分断を許さないような実装なら、 ディスクスペースの使用効率は下がるかもしれないけど、テーブル参照が 不要になるからアクセスが速くなるはず・・・だよね? 速度を要するスパコン用のファイルシステムって、そういう実装なのかなぁと想像・・・
170 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 23:17:11 ] >>167 ダイレクトアクセス知らなかったのか。 >直接アクセスする とか書いているから知ってるかとw 昔の映画のコンピュータで磁気テープがグルグル回っているのはダイレクトアクセス ファイルを読み書きしているんだべなぁ。
171 名前:デフォルトの名無しさん mailto:sage [2009/04/21(火) 03:39:52 ] テープが 今で言う、ディスクとメモリの両方を兼ねてたからね。 ほんのちょっと前にFACOMのやつにテープはめるのをした。 あれ、テープのはしっこを挿入口に近づけると空気で吸い込んでくれるのね。 人間の手で全部とりまわさないといけないのかと思ってたよ。
172 名前:164 mailto:sage [2009/04/22(水) 15:52:56 ] >>170 不勉強故、失礼しました。 ところで、磁気テープというのは今も使われているものなのでしょうか? 今、20半ばの院生ですが、テープというのを見たことがありません。
173 名前:デフォルトの名無しさん [2009/04/23(木) 01:43:48 ] fortranで円やら球を離散化?させたい。 円の場合 function X(a) X=cos(3.14*a/360) end function Y(b) Y=sin(3.14*b/360) end こいつを回せば、円をつくることはできる。でもXは小数点の数字になっているよね。 でもやりたいことは、2次元配列を作成して、F(x,y)のx-yのメッシュの中で 円を作成するには、x−yは整数である必要がある。どうすればいいの? わかる人いますか? この円・球構造について、拡散方程式やら偏微分方程式を解きたいと思っているんだけど、 こういうことってできますか?
174 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 03:11:15 ] すなおに極座標なり円柱座標にするがよろし
175 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 06:57:36 ] >>173 メッシュが正方格子でなければならない理由はあるんかいな? Yesならメッシュを細かくするしかないなぁ・・・ 節点座標値が整数でなければならない理由はないと思うょ
176 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 09:04:46 ] 球や円を特徴的な構造として持つ系にカルテジアンを無理矢理持ち込むのは無理があるにょ ギザギザがでるし、30度とか45度回転させた初期値境界値で同じ計算すると結果が結構違うにょ。 査読受けたら絶対そこを突っ込まれるにょ。 んで満足いく事例を出せなかったらそこで終わりにょ。 学部生より上なら極座標なり175の言う通り非構造格子にしてきちんとするのがいいにょ。 学部生なら、卒研としてならまあ許されると思うにょ。・・・Fortranと関係なかったにょ。
177 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 00:48:54 ] >>173 どうしても直交座標にしたいなら、かなり細かくメッシュを区切って、 計算結果にある値をかけて、整数にするとか。 新しく買ったCorei7で計算させたら、滅茶苦茶速くてびっくりした。 PenMのノートで10分かかる計算が1分で出来て、しかも8個同時に走らせても余裕。 64bitOSを積んだから、というのもあるのかな。
178 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 05:33:49 ] >PenMのノートで10分かかる計算が1分で出来て、 まあ、これはそうだろうなあ。 >しかも8個同時に走らせても余裕 へえ。よさそうだね。 余裕、というのは「一個の時のまあ8割くらいのスピードで8個とも動く」くらいなの?
179 名前:デフォルトの名無しさん [2009/04/24(金) 16:38:50 ] >>175 メッシュが正方格子でなければならない理由はあるんかいな? 教官から貰ったコードが正方格子のだったけど、 変更できない、とかかな? そもそも173のやりたいことがいまいちよくわからない。 Fortranとは関係ないし、ここまでかな
180 名前:デフォルトの名無しさん mailto:sage [2009/04/25(土) 00:30:02 ] >>178 特に並列化をしていない(というよりも、並列化がうまくいかなくて結局諦めた)ものを走らせると 大体16%ぐらいのCPU使用率になるから、 8個ぐらい走らせると100%使い切るようになるからね。 この使用率からすると、たぶんそれぞれ8〜9割で動いているといったところかな。 うまいこともっと最適化できないかな・・・。
181 名前:デフォルトの名無しさん mailto:sage [2009/04/25(土) 00:40:55 ] >>180 物理CPUは4個だろうから、よほど例外的な場合でなければ多分4つより大だと帰って遅くなるだろう。
182 名前:デフォルトの名無しさん mailto:sage [2009/04/25(土) 14:40:15 ] 178です >>180 ありがとう。 少なくともOSが認識する使用可能なリソースはフルに使い切れるんだね。 >>181 Xeonの2コアが4つ乗ったマシンでOpenMPを走らせると きれいに8倍になってくれたけど、これとはまたいろいろ設計が違うんだろうな。
183 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 01:08:12 ] >>181 よく考えたらそうだよなあ… 実際時間を計ってみたら、8個計算の時間 / 2 > 4個計算の時間だし。 ただ、実際には数百から数千個計算するし、それぞれ条件が違うから時間もバラバラで、 その待ち時間を埋めるために、まとめて計算するほうが速かったなあ。 プログラム内でうまく並列化をしてフルに使い切れればいいけれど、なかなかうまくいかないんだよな…。 OpenMPをコマンドを入れたら、かなり遅くなったし。
184 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 11:27:08 ] >>183 なるほど〜。 どちらかというとたくさんある計算をぼんぼん 放り込んでおける、事がメリットなのかもね。 そうなるとqueueの管理の仕方がみそ?
185 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 13:12:42 ] >>183 Corei7は、物理4コアをハイパースレッディングで見かけ8コアにしている。 純粋に計算などが重い場合ハイパースレッディングは足を引っ張るだけ。 そのばあいは4スレッドで動かすほうがいい。 MKLのLinpackのBenchmarkをやってみるとどのくらい遅くなるかわかる。 OpenMPのオプションでスレッド数を物理コア数に合わせるようにすると本来の力を発揮する。 あるいはBIOSでハイパースレッディングを切るとかいう手もある。 ただハイパースレッディングが有効な場合もあるので、個別の事情に依る。 自分で試すしかない。
186 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 15:36:02 ] MPIなりOpenMPで4並列のジョブを放り込んだばあい、 ちゃんと1プロセス/1CPUにふってくれるのかな?
187 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 23:50:26 ] >>186 いや、なんか環境変数にそれなりの指定をしないと、1スレッド1物理プロセッサに 必ず行くとは限らないので遅いまま。 OpenMPのマニュアルの環境変数のところを読めば書いてあったはずだが、 詳しくは忘れたw
188 名前:デフォルトの名無しさん mailto:sage [2009/04/27(月) 12:50:57 ] なるほど・・・。 どちらかというと、dplace や mpirun みたいな並列実行の環境を調えるソフトの とりあつかう領域だね。dplaceだと dplace -c1,3,5,7 かな?実機でもってるわけでもないし、いまマニュアルが見れないからわかんねw HTがあると並列しながら、ふつうの文房具的にPCやWSを使えるわけだから 使い方次第では結構いいかもなあ。
189 名前:デフォルトの名無しさん mailto:sage [2009/05/02(土) 11:50:18 ] 冗長な部分があってもいいから現在使っている配列の全てをバイナリに書き出して計算の中断ファイルを 作りたいんですけど、書き出す配列を全部列記する以外に楽な方法ってないでしょうか?
190 名前:デフォルトの名無しさん mailto:sage [2009/05/02(土) 19:37:29 ] >>189 もう一回計算しなおせ!w データを後生大事に取っておくのは演算コストが高かった時代の名残。 むろん演算量にもよるがw
191 名前:デフォルトの名無しさん mailto:sage [2009/05/02(土) 20:33:05 ] >>189 目的がよく分からないんだけど コード中の全ての配列をはき出すってこと?
192 名前:デフォルトの名無しさん mailto:sage [2009/05/02(土) 22:53:03 ] >>189 行列がスパースなら,非ゼロ項を書き出すことにすれば,ちょっとはマシな気がする。
193 名前:デフォルトの名無しさん mailto:sage [2009/05/03(日) 04:00:14 ] >>189 配列の全ての成分を書き出せば良いのであれば integer a(1:10000) real b(1:100,1:100) write(10)a,b とかではダメか?
194 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 06:16:46 ] >>190 デバッグとかあるし。 大型計算機とかだと、1計算の時間上限があるからね。 再開するのに必要な情報を全部ファイルとして書き出す選択肢は 持っていた方が良いと思うにょ。 >>193 それがいちばんだね。 書式指定無しでファイルにたたき落とす 違うシステムでは役に立たないけど、メモリの内容をそのままファイルに落とすので 書き込みも読み込み+計算再開も速い。 書式付きもできるけど、めちゃくちゃ遅いし。
195 名前:デフォルトの名無しさん mailto:sage [2009/05/08(金) 14:33:24 ] >>194 デバッグ目的以外で、メモリの中身を全部ダンプする必要性が分からないんだが・・・ 今時の計算は反復計算などの単純なループ部が計算のほとんどを占めてて ループ開始前の前処理なんて全体から見れば知れてるわけで、 次回リスタート用のためにわざわざメモリのスナップショットを取る的な発想は今時ないでしょ。 メモリとストレージの速度差が開く一方の今日じゃなおさら・・・・
196 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 04:28:25 ] 理由は194が最初に書いてね? 195はあまり大きな計算はしたことがないんだろうな
197 名前:189 mailto:sage [2009/05/09(土) 15:11:48 ] 遅くなりました。 あー…書き方があいまいですいません、答えてくださった方ありがとうございます。 えと、粒子法的計算なんですけど、191さんがおっしゃっている通りです。 コード中のすべての配列をはきだしたいです。 193さんのやり方は当然わかりますけど、それだとwriteの後に吐き出したい配列を 列記しないといけませんよね。そういうの無しで全配列をばーっと吐き出す方法ないかな、 と思ったわけです。やっぱ使う配列をコツコツ列記するしかないみたいですね。 >>195 非定常計算なんで状況によっては計算途中の段階から少しだけ条件を変えて 計算したいとかあるんですよ。正直にやったら一週間近くかかるので。
198 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 16:24:49 ] >>197 質問がひどすぎw まぁベンダー拡張命令でメモリー全ダンプみたいなことが出来る機種もあった気がするw
199 名前:195 mailto:sage [2009/05/09(土) 16:47:04 ] 自分には>>189 の理由がいまだに分からん・・・(別に分かんなくてもいいけどさ) たしかに、スパコンでは数日〜1週間程度の計算しかしたことない。 大きい計算とは言えんか。 スパコンのジョブってたいてい時間制限が数時間のオーダーだから、 例えば30000ステップ計算したいとしたら3000ステップのジョブを 10回投げるってのが普通だよな。 粒子法はよく知らないけど、格子点はどんくらいなの?
200 名前:195 mailto:sage [2009/05/09(土) 16:49:29 ] あ、粒子法ってメッシュないんだっけか? 粒子数だっけ?
201 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 16:54:07 ] 背景場を途中から変えた計算をしたいのかな? 普通は計算再開に必要な変数の数(配列の大きさではないよ)って知れてるよね。 粒子法なら、粒子の位置・速度と経過時間くらいか。 あとはiterationのプロセス毎に計算する量や座標系のように 再生成に計算量のかからないものがほとんどだろうから、 それをとっておく必要はないし。 ふつうに193のやり方で落とせばいいんじゃね?たいした手間でもなし。 ところで、ダンプして落としたとして、変数の変更はどういう風に再開時に反映させる つもりだったんだろうか?
202 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 16:59:47 ] >>199 同意。細切れ計算するときに継承すべき情報はあるけど、ダンプする理由はないやね。 ふと、189の「配列全部」は別にダンプではないのでは、と思ったけどオイラの勘違いかな?
203 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 17:01:58 ] 読み返すと、「ダンプ」を最初に使ったのは195さんだw
204 名前:195 mailto:sage [2009/05/09(土) 17:17:34 ] ダンプっていうのは大げさでしたなw イメージ的に使ってしまった
205 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 17:55:35 ] 無料のfortran77向けのコンパイラで、高速なものはありますか? 用途はCFDです。 まあ趣味なので大きな計算は必要ないのですが。
206 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 23:52:54 ] fortran歴1週間の質問です 論理型を整数型その他に変換できますか? 例えば、いくつかの言語では (a>b) 等とすると0または1が得られますが これと同等なことをFORTRANでも行いたいのですが方法がわかりません 無理ならすんなり諦めます
207 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 00:55:29 ] >>206 一般的な回答としては、できない。 不可能ではないという意味では、IF THEN ELSE でやれば出来る。 意図しているイメージに一番近いだろうと思われるのは、TRANSFER関数で型変換をすること。 しかし、FORTRANの規格では論理型の内部状態を定義していないので 0/1に投影できるかは運しだい。普通は0/-1が多い(真:ビット全部0と偽:ビット全部1)。
208 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 01:51:22 ] >>207 早速ありがとうございます 何となくですができました
209 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 05:17:13 ] logical lonlon real a, b a=1.0 b=2.0 lonlon = (a .GT. b) write(*,'(i3)') lonlon なるものをつくると、 最後の行で型が合わないと怒られる 0がでてくる 1がでてくる -1がでてくる、 の4パターンあったw 危険だw
210 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 21:13:40 ] g77のよく使う高速化のためのコンパイラオプションを教えてくださいませんか。 それかコンパイラオプションをまとめているサイトないですか? gccのまとめを見ればよいのでしょうか?
211 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 21:18:17 ] >>206 どういう用途? 論理型が用意されてる言語なら、特に理由がない限りそういうマネはやめたほうがいいかと シェルスクリプトレベルならよくやるけどさ
212 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 21:34:28 ] >>210 まずググれ。話はそれからだと思う。
213 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 01:13:00 ] でも、コンパイラのドキュメントしっかり読んで全部の仕様を熟知してる人なんて、ほとんどいないよな こんなオプションあんだ・・・でも何に使うんだろ、ってのばっかだ俺w
214 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 12:22:05 ] 論理型と整数型の混用は、非常に有用な場合もないではないけど、 基本的にはやるべきでない。
215 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 20:00:38 ] ちょっとインチキして logical:: L(1) L = (2.0 < 1.0) write(*,*) count(L) L = (1.0 < 2.0) write(*,*) count(L) とか
216 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 20:37:43 ] >>214 バグの元じゃない?
217 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 20:53:39 ] >>216 3つの条件abcのうち2つ以上が真なら、という場合に、 a = 条件式 b = 条件式 c = 条件式 if (a + b + c >= 2) ... とか。Cの場合だけど。
218 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 21:39:08 ] 後でメンテする時、無駄に手間食うからそういうのやめてくれ〜
219 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 22:35:22 ] 1960年代のおばあちゃんの知恵というかライフハックw風のプログラムだな。
220 名前:デフォルトの名無しさん mailto:sage [2009/05/13(水) 02:46:28 ] >>218 4つの式が近くの行にあればいいけど、すごい離れた所にあるといろいろ嫌だよね
221 名前:デフォルトの名無しさん [2009/05/22(金) 20:21:01 ] LOGON TSS
222 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 22:46:55 ] >>221 READY
223 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:18:35 ] Intel Fortran 10 を使っています。 ifort独自文法のform='binary'でファイルを開いてデータ出力しています。 そのファイルはC言語のファイルフォーマットが公開されているんですが、 unsigned int となっている部分をifortで出力する方法がわかりません。 この部分だけC言語で記述して呼び出す形ならできそうな気がしていますが、 Fortranだけで完結させる方法ってありますか? アドバイスよろしくお願いします。
224 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 01:55:11 ] >>223 32bitのunsighned int? 読み込みのほうはINTEGER*4 でうけて、それをINTEGER*8にTRNASFER関数で 適当な位置にコピーするか、出力サブルーチンを作って負数の場合は INTEGER*8でUINTの場合の数を求めて出すという方法が考えられる。
225 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 12:05:07 ] 倍精度の変数宣言だけど、 real(8) a double precision a どっちやねん、と思ってた。 先日規格を見たら後者だったので、ウヒー! 今後は全部後者で統一する。行が長くなって、チョトいや。
226 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 12:13:09 ] >>225 どっちでもいい。後者は昔風の書き方。 今はむしろ前者が主流だと思う。
227 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 12:40:28 ] >>226 うーん、こんなHPもあるからなぁ・・・ 4.1 Fortranのデータ型 www.nag-j.co.jp/fortran/FI_4.html#AUTOTOC_4_1 コードを見られる可能性がある案件は、規格にならった方が よさそうな気もする。
228 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 17:17:01 ] >>227 それは、規格違反ということを意味しているわけではない。 KIND種が規格で決められていないためにベンダー依存になっていることを 問題視しているのだろう。 kd = SELECTED_REAL_KIND(14) とかで、8などの定数べた書きをやめてkdなどに すれば避けられる。 規格の整合性としては REAL ([KIND =] n) の方が統一的でいいとおもう。 4倍精度が大概のコンパイラでサポートされつつある現状を考えると、REAL(n)の 形式にそろえておいたほうが将来的にものぞましいのではないかと思う。
229 名前:223 mailto:sage [2009/05/23(土) 20:23:06 ] >>224 回答ありがとうございます。 詳しくないですが、32bitです。 各bitにどうデータが並んでいて、、、ってのを学ばないと難しそうですね。 ちょっとがんばってみます。
230 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 20:51:52 ] >>227 むしろreal*8が普通だと思ってた。double precisionはむしろ非推奨って話も聞いたことあるぞ。 >>227 のnagのページは全部鵜呑みにして良いのか甚だ疑問だわ・・・ つーか、この問題の責任は100%規格にあるだろう。規格作ったやつ出てこい!
231 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 22:29:44 ] >>228 module xx integer, parameter :: kd_re = selected_real_kind(16) : programm yy use xx real(kd_re) a みたいな感じかな? 一理あるね。 >>230 JIS X3001-1に 『DOUBLE PRECISION型指定子は、組込みの 倍精度実数型のデータ要素を宣言するのに用いる』 とあるから、非推奨ってこともないだろ。
232 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 22:45:57 ] 詳しくは覚えていないが・・・・ FORTRAN66までは倍精度宣言は DOUBLE PRECISION だけだったのだが、その後の流れで FORTRAN77では REAL*8 Fortran90でREAL([KIND=]8)の形が出てきて、だんだんと REAL([KIND=]8)の形に統一しましょうという流れだと思う。 >>230 Fortran90策定の頃は、ベンダー毎にアーキテクチャーも数値フォーマットも 文字コードもバラバラだったのでこのくらいは許してやってくれ。
233 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:03:22 ] やっぱKIND使った方がお行儀がいいのかなぁ 書き直すのマンドクサイっす ・・・あんま移植性に拘りすぎるのもどうかと思うけどね。どうせみんなインテ(ry
234 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 00:52:40 ] FORTRAN77では、いくつかのサブルーチンの間で共通の定数を使うとき それぞれのサブルーチンで何回も同じ宣言をしなければいけないのですか? このままだと定数の値を変えるのが非常に面倒なので 一回の宣言で済む方法を知りたいです
235 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 01:05:33 ] >>234 定数宣言だけのファイルを1つ作って、各サブルーチンの先頭でINCLUDEする。 FORTRAN77の規格外だが大抵のコンパイラはINCLUDE文に対応している。
236 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 01:08:13 ] >>234 PARAMETER文を用いてなら、標準では無いw COMMON 変数でよければ BLOCK DATA 文で初期化できる。 ベンダー拡張機能を許せば、INCLUDE を使う手もある。 まぁ、横着せずにラインエディターで一括変換すればよろしいw
237 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 01:10:53 ] ありがとうございます とりあえずINCLUDE使ってみます
238 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 01:11:05 ] >>234 モジュールでもいいぞ
239 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 02:04:13 ] >>238 奴はFORTRAN77と縛りを入れている。
240 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 13:47:45 ] >>236 entry文を使えば、何とかならない?
241 名前:デフォルトの名無しさん mailto:sage [2009/05/27(水) 14:16:15 ] とくに理由がない限り、77からはさっさと足を洗った方がよくない?
242 名前:236 mailto:sage [2009/05/27(水) 23:27:51 ] >>240 たしかにENTRY文という手もあったな。 COMMONが嫌で、グローバル変数を実現する代わりに使ったことがあったが、 やっぱ変数全部がグローバルになるせいでデバッグが面倒で よほど特殊な場合意外はやめたほうが良いと思った。
243 名前:デフォルトの名無しさん [2009/05/31(日) 15:35:51 ] みなさまのお力をお借りしたく。 #FAQならすみませんが、ご容赦ください IVF10.1(11でも)動作したソースを、Linux上のintelに持ち込んでコンパイルしました。 すると、以下のケースに分かれました。 1)あえてコード変換をせずにコンパイル コンパイルOKも、当然、表示は滅茶苦茶(要するに2バイト系がだめ) 2)SJIS->UTF8にしてコンパイル FORMAT文の箇所でエラー発生、これがどうしても直らない。 ちなみにエラーメッセージは以下の通りです
244 名前:デフォルトの名無しさん [2009/05/31(日) 15:37:35 ] test.for(14): error #5120: 終了していない文字定数です。 *//' ... ログ出力ファイルを入れて') --------^ test.for(14): error #5082: 構文エラー、END-OF-STATEMENT が見つかりました、 <FORMAT_ELEMENT> <FORMAT_INTEGER> < ) <CHAR_CON_KIND_PARAM> <CHAR_NAM_KIND_PARAM> ... の 1 つを指定してください。 *//' ... ログ出力ファイルを入れて') ----------------------------------------------------------------------------------------^ このソースは、 100 FORMAT(//' *** test を始めます。***', * //' ... ログ出力ファイルを入れて') です。 他にも日本語からの問題なのでしょうか、"認識できないトークンを'?'をスキップしました"というエラーもでます。 なおf77でも同様で、この場合には、 Error on line 14: unbalanced quotes; closing quote supplied Error on line 14: unbalanced parentheses, statement skipped となります。 お気づきの点があれば、すみませんが、ご指摘ください。 よろしくお願いいたします。
245 名前:デフォルトの名無しさん [2009/05/31(日) 16:06:32 ] >>244 a) kterm上でトライ b) 使ってる全角文字の中に ' ) あたりの半角と同じ値が混じっている くらいしか思いつかないや。 少なくともf77のケースでのエラーはb の事を言ってるみたいだけど。 英数字以外は使わないのが一番だけどなあ〜。どうしても使いたかったら character*2 zenkaku read(*,*) zenkaku write(*,*) ichar(zenkaku(1:1)),ichar(zenaku(2:2)) で全角一文字の対応する半角2文字のアスキーコード数がわかるので、強引に出来そうな気もするけどな。 winだと実際上の3行の部分は動くとおもうけど、linuxだとよくわからんね。 linux + fortran+ 2バイト全角文字 の話題はあまりお話を聞かないからうまく行ったらここにも報告してよ。
246 名前:デフォルトの名無しさん [2009/05/31(日) 17:12:19 ] 早速ありがとうございます。ひとつ確認しましたので、ご報告をば。 a)kterm Ubuntu9.04にてktermを入れて、確認。 ・UTF8はコンパイル時、文字化け?でダメ ・同じくSJISもだめ ・eucではifortでのコンパイルメッセージの出力が化けている(どれでも同じ??)状況でしたが、実行時は日本語出力OK でした。 となるとintelFortranのインストールもkterm上から行う方がよかったのか? まだすべての確認はできていませんが、うまくいきそうという報告まで。b)も後日、試してみますので結果を報告致します。
247 名前:デフォルトの名無しさん [2009/05/31(日) 17:36:04 ] あ、追加。 うまく表示できているのは、kterm上で、の場合。通常のconsoleでは(当然っちゃぁ当然ですが)化け化けです。
248 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 08:32:25 ] おつ〜。やっぱりktermがいいのね。 245のbのやつは、対で使われることが多い文字 (ichar()関数の返す値が ' が39、Hexでは27 " が41、Hexでは29 ) が93、Hexでは5D ] は34(これはFortranではあまり意味がないか・・) のようなやつ)が全角に混じってるとダメそうな気がする、という程度の意味で書いてみた。 でも、win版やktermインストだと大丈夫なんだよね。 246さんの意見のとおり、インストール時の設定その他に依存する部分が大きそうな気もするな。
249 名前:デフォルトの名無しさん [2009/06/01(月) 18:51:56 ] 文字化けの件、追試結果(w まだf77は試してませんが、どうやら文字コードは確かに影響してるっぽい。 問題はUTF-8で、どうも旧人なので勝手に2バイトと思い込んでましたが、現在は最大4バイトらしい。 このため、見かけ上、1行内では2バイト換算で70文字程度にしていたものがオバフロしていた模様。 よってifortでは、-FI -132という固定ながら132文字にしたら通りました。 いったい何をしていたんだ…わしorz ちなみにIVFでUTF8形式でソース保存して、それをWin上でコンパイルしたら妙なゴミが出てました。 結構コード問題は奥が深そうです。
250 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 23:28:41 ] >>249 知ってる人のような気がする...... tt
251 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 01:58:37 ] > 問題はUTF-8で、どうも旧人なので勝手に2バイトと思い込んでましたが、現在は最大4バイトらしい。 なか〜まw そっか、UTFだとエディタの見かけより実際のはるかに長いんだね。試しに vi でてきとうにUTF使ったファイル開いたら、たしかに row 数が多い。 気を付けよう。
252 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 10:58:03 ] Intel Fortran の使える KIND を関数呼び出しで見ると、ASCII だけになってたような。 確認してないw
253 名前:デフォルトの名無しさん [2009/06/04(木) 23:06:43 ] モンテカルロ法の計算プログラムを流したら、 FORTRAN I/O ERROR 913: OUT OF FREE SPACE って出てきて途中で計算が止まったっぽいです。 なにやらメモリー不足とのことですが、どう解決すればいいのでしょうか?
254 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 23:47:02 ] >>253 ハードディスクを増設しろ!
255 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:14:43 ] >>253 I/O エラーだから、メモリーではなくディスクが足りないんだろう。 /tmp とかのスクラッチ領域がパンパンになっている可能性もあるが。
256 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 01:44:17 ] うほ
257 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 18:31:50 ] いや、I/O処理の最中に何らかのリソースが足りなくなったというメッセージだと思う。 www.uic.edu/depts/accc/software/compilers/forterr.html 913 OUT OF FREE SPACE Library cannot allocate an I/O block (from an OPEN statement), parse array (for formats assembled at run-time), file name string (from OPEN), characters from list-directed read, ISAM key descriptor, shared COMMON descriptor, variable-format descriptor, or file buffer. The program may be trying to overwrite a shared memory segment defined by another process. Allocate more free space in the heap area (see the beginning of this chapter); open fewer files; use FORMAT statements in place of assembling formats at run time in character arrays; read fewer characters; user fewer ISAM keys; use fewer shared COMMON areas; use fewer variable-format expressions; or reduce the maximum size of file records.
258 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 03:03:47 ] 無書式での読み書きも、そのスペースを食うのかね。
259 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 20:04:27 ] fortranの超絶初心者です。 以下のプログラムをexitを使わないで同様の結果を得るには、 どうすればいいのでしょうか? ご教授願います。fortran90を使っています。 program real :: r,a integer :: io !入力結果の状態を表す変数 ! print *, 'CTRl-D を入力すると終了' ! do while ( .true. ) read(5,*,IOSTAT=io) r if(io /= 0 )then exit endif a = 4 *3.141592* r ** 2 print *, r, a end do ! end program
260 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 20:16:43 ] >>259 1.歴史と伝統のGOTO文で抜ける。 2.READ文で END=nnn で抜ける。 だが元のままEXITで抜けるのがもっとも行儀が良いとされる。
261 名前:259 mailto:sage [2009/06/06(土) 21:28:47 ] >>260 授業の課題で、exitを使わないで書き上げろという事だったんですが・・・ どうも、ありがとうございました。
262 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:37:33 ] >>261 >exitを使わないで書き上げろ exitで抜けるのが一番良いのに、何でこう言ったんでしょ?
263 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 22:28:50 ] 世に蔓延るGOTO使いまくりのプログラムに慣れさせるため・・・ではないよな、多分。 READ文の指定子の使い方の勉強とかかな。
264 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 10:49:22 ] ここはFortranでプログラムを作ってという図々しいお願いはおk?