[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 10/07 02:37 / Filesize : 345 KB / Number-of Response : 920
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



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/


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?

265 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 11:41:39 ]
>>264
大丈夫。ただし、初心者にありがちな「エスパーさん、○○作って!」はやめて。
知っている情報をそのまますべて載せるべし。

266 名前:259 mailto:sage [2009/06/09(火) 16:56:11 ]
>>262さん  >>263さん
どうやら、説明が足りなかったようで、すいません。
今日授業に出たところ、
program
real ::r,a
integer ::io
print *,'CTRL-Dを入力すると終了'
do while (io==0)
if (io==0) then
read (5,*,iostat=io) r
a=4*3.141592*r**2
print *,'半径=',r,'面積=',a
end if
end do
stop
end program
が、答えだそうです。
でもこれを実行すると、CTRL-Dで終了するとき、
前回の計算結果が表示されてしまいます。
またまたすいませんが、何を付け加えればいいのでしょうか?

267 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 17:09:31 ]
なんかアホらしい授業だけど。
program
real ::r,a
integer ::io
print *,'CTRL-Dを入力すると終了'
do while (io==0)
if (io==0) then
read (5,*,iostat=io) r
if (io==0) then
a=4*3.141592*r**2
print *,'半径=',r,'面積=',a
end if
end if
end do
stop
end program
どう考えてもexitを使うほうが素直だ。


268 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 17:11:10 ]
ありゃ、間違えた。
program
real ::r,a
integer ::io
print *,'CTRL-Dを入力すると終了'
do while (io==0)
read (5,*,iostat=io) r
if (io==0) then
a=4*3.141592*r**2
print *,'半径=',r,'面積=',a
end if
end do
stop
end program

readをifの外側に出さないといかん。



269 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 17:20:58 ]
ioの初期化も足りないし。ぐだぐだ。

270 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:24:17 ]
exitの偉大さを実感すると言う狙いなのだろう。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<345KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef