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/
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。なので言っている事の意味ワカラン。
217 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:11:50 ] >>215 おまい、質問が下手だなw うまい質問をするとうまい答えが返ってくるし、まずい質問をするとまずい答えしか返ってこないぞよ。 とにかくそれだけでは答えようが無い。
218 名前:215 [2008/03/17(月) 02:47:25 ] >>216 マカーの友人もTigerだそうです。 コンパイラのバージョンを教えてください。 >>217 他にどういった情報が必要でしょうか? 分かりにくいということですか? この問題を解決したいので教えてください。 この「0の巾乗が計算出来ない」という問題はあまり有名ではないのでしょうか? a=0.のときに a**2が計算できないのは致命的なバグなような気もします。 周りのg95ユーザに聞いても解決しませんでした。 (やはり、他のシステムでも0の巾乗は計算出来ていません。) ちなみに私は普段はgfortranをvine上で使っていますが、このような結果にはなりませんでした。
219 名前:216 mailto:sage [2008/03/17(月) 05:38:14 ] >>218 同じソースを g77 でコンパイルしても正しい結果が出た。ln -s hoge.f95 hoge.f で偽装(?)した。 % ./a.out 0 0. 0. gfortran は試してない。fink でやったら簡単だけど、意義を感じない。 因みに g95 と gfortran のどっちが良さげ?>識者の皆様 > MacOSXでもg95で同じような計算結果になります。 はヲマイがやったんぢゃないのか?自分で確認したことと、他人に聞いた事は切り分けてクレ。 % g95 --version G95 (GCC 4.0.3 (g95 0.90!) Jul 27 2006) Copyright (C) 2002-2005 Free Software Foundation, Inc. ---------- % g77 --version GNU Fortran (GCC) 3.4.4 Copyright (C) 2004 Free Software Foundation, Inc.
220 名前:215 [2008/03/17(月) 14:13:34 ] >>216 ありがとうございます。 わかりにくくて申し訳ありません。 MacOSXは友人がやりました。 g95(windows),gfortran(vine),ifort(ubuntu)は私がまわしました。 (ifortでも同じプログラムを回してみました。) gfortran,ifortは正しい結果が得られます。 g95だけ正しく計算できません。 バージョンの問題でしょうか? 友人にバージョンを聞いてみます。
221 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 21:57:57 ] >>220 The G95 project にバイナリが色々置いてあったので試してみたら Stable Version (G95 (GCC 4.0.3 (g95 0.90!) Jul 27 2006)) だと 0 0. 0. になったが、 Current Snapshot (G95 (GCC 4.0.3 (g95 0.91!) Feb 27 2008)) だと 1 1. 1. になった。 -S オプションでアセンプリ出力を見てみると いきなり定数の 1 を書き込んでいるようなので コンパイラのバグだろうな。 まあ、Snapshot なんでバグの1つや2つ有るだろう。 Stable Version の方を使うかバグ報告出して直してもらえ。 >>219 ちょっと前まではg95の方が安定してたような気がする。 でも最近はGCC4に対応してgfortranが標準で付いてくるLinuxが増えたので こちらの方が一般的になるのだろうな。 #それにたしかg95の方はまだOpenMPに対応してなかったはず。
222 名前:216 mailto:sage [2008/03/18(火) 17:47:26 ] > >>219 > ちょっと前まではg95の方が安定してたような気がする。 > でも最近はGCC4に対応してgfortranが標準で付いてくるLinuxが増えたので > こちらの方が一般的になるのだろうな。 > #それにたしかg95の方はまだOpenMPに対応してなかったはず。 有り難うございます。確かに最近導入したLinuxはほぼ gfortran が付いていますね。 g95 は付いて無いですが。私は並列はしないので、OpenMP は対応していなくても 良いのですが、周りから聞かれたら gfortran の方を勧めることにします。
223 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 21:13:10 ] Windowsで使う分にはg95も手軽でいいんだがな。
224 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 14:46:06 ] >>222 できるよ。 以上。 はい、次。
225 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 21:02:15 ] ん?
226 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 00:26:18 ] $OMP imifu
227 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 01:48:45 ] 本当に初心者なのですが失礼します 分関数定義文について勉強してるんですが、 プログラムが読めても、作れないくらいのレベルです 文関数定義分を使って、関数f(x)=x^2+x+1を 0≦x≦1の区間について、0,1ごとにxを変化させた場合の 結果を出力するプログラムを作りたいのですが、 わかる方いましたらお願いします
228 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 13:49:39 ] >>227 ドイツとかフランスで教育を受けた人?小数点がそっち風なんですけど FTN77で作動確認、間違ってたりナンセンスでも許してね。 DO 10 I=0,10,1 X=0.1*I Y=F(X) 10 WRITE (6,20) X,Y STOP 20 FORMAT(1H ,' X = ',F4.1,2X,'Y = ',F6.3) END C FUNCTION F(X) F=X**2+X+1 RETURN END
229 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 21:00:37 ] 志村ー、文関数!文関数!
230 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 22:13:38 ] 文関数はobsoleteで、今は使えてもいずれ使えなくなる筈。
231 名前:志村228 mailto:sage [2008/04/01(火) 22:26:01 ] 間違えちまっただ〜 F(X)=X**2+X+1 DO 10 I=0,10,1 X=0.1*I Y=F(X) 10 WRITE (6,20) X,Y STOP 20 FORMAT(1H ,' X = ',F4.1,2X,'Y = ',F6.3) END
232 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 23:00:00 ] >>230 心配すんな! obsolete指定されても大概のコンパイラは機能を残すから。 今までもそうだったし、これからもそうだろうw Fortranは、地層が積み重なった言語で面白い。直交性の悪さが自然言語っぽいw
233 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 00:01:34 ] Fortran95の廃止事項もほとんどの処理系で残ってるからなぁ
234 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 01:03:12 ] とは言え初心者に廃止事項を進めるわけにもいかんだろ お行儀の良いコーディングした方がバグは減るだろうし
235 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 13:09:47 ] FORTRAN77で書かれたサブルーチンプログラム(sub.for)を fortran90のメインプログラムmain.f90で呼び出して使うにはどうすれば良いのでしょうか。 コンパイラはg95/cygwinを使ってます
236 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:17:15 ] テスト
237 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:34:30 ] >>235 g95 main.f90 sub.for ぢゃだめなん?(めんどくさいので、確認はしてない)
238 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 23:00:33 ] >>237 レスありがとうございまs 私も並べてコンパイルすれば良いと思ってたんですけど駄目でした。 main.f90の中にuse文を作れば良いのでしょうか?
239 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 23:16:59 ] >>238 1.EXTERNAL文で外部関数であると表明する。 2.INTERFACE BLOCKでINTERFACEをちゃんと書く。 3.MODULEの中に置いて、USE文で引用する。 1から3の順で面倒くさいが、F90的にはこのましく行儀よくなる。
240 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:06:08 ] >>239 すみません、折角頂いたアドバイスを理解しきれていないのですが sub.forの中身をfortran90で書き直して、モジュール化するということですか? 77のままでは無理でしょうか?粘着に質問してしまい恐縮でs
241 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:47:43 ] >>240 1. PROGRAM f90 IMPLICIT NONE.... EXTERNAL f77noName.... .... CALL f77noName... ... 2. PROGRAM f90 IMPLICIT NONE INTERFACE SUBROUTINE f77... 云々 END INTERFACE MODULE unko CONTAINS subroutine f77(....) ..... end END MODULE unko PROGRAM homosexual USE unko IMPLICIT NONE CALL f77(....) END
242 名前:241 mailto:sage [2008/04/10(木) 00:49:04 ] すまん 行Overで肝心の3番を消してしまった。 スレ汚しご容赦。 3. MODULE unko CONTAINS subroutine f77(....) ..... end END MODULE unko PROGRAM homosexual USE unko IMPLICIT NONE CALL f77(....) END
243 名前:240 mailto:sage [2008/04/10(木) 09:32:50 ] おお!うまくいきそうです! ご教授どうもありがとうございます!!
244 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:16:37 ] 質問です。read文で数字の羅列とコメントで構成されたテキストファイルから値を読み取ろうとしています。 OPEN (3,FILE='a.dat',STATUS='OLD') ..... READ(3,*) READ(3,*) FNUM READ(3,*) READ(3,*) DTM READ(3,*) READ(3,*) FTMP READ(3,*) ...... という感じです。読み込むファイルの方はテキストで ..... FNUM= 1.5E16 DTM= 0.5E-6 FTMP= 303. ...... というようになっています。ところが、他の値と同じように読み込んでいるのに FNUM= 1.5E16 DTM= 0.5E-6 のところだけうまく読み込めず、値が0になってしまいます。何度も確認しましたが、ちゃんとその場所を読んでいるはずですし、 別の場所で代入していたりはしません。しょうがないので、テキストの末尾に読み込めなかった値をダブって記入し、 そこから読み込むとうまく読めました。ひとまずこれで問題はないのですが、原因が思い当たらずあまりにも気持ち悪いので、 思い当たる原因があれば教えていただけないでしょうか?よろしくお願いします。
245 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 02:01:04 ] >>244 これだけでは情報が足りない。 もう少しkwsk
246 名前:244 mailto:sage [2008/04/14(月) 18:09:41 ] えーと、すみません。普段数式の部分しかいじってないものでFORTRAN自体の 知識があまりないのでどのあたりが必要な情報なのかいまいち分からないのですが、 とりあえず計算用のコードで、パラメータの設定をソースコードと分離したくて SUBROUTINE PARAMETER COMMON /COMP / FNUM,DTM.... FNUM=1.5E16 DTM=0.5E-6 .... のような記述を SUBROUTINE PARAMETER COMMON /COMP / FNUM,DTM.... OPEN (3,FILE='a.dat',STATUS='OLD') READ(3,*) READ(3,*) FNUM READ(3,*) READ(3,*) DTM .... と、以下のようなtxtファイル FNUM= 1.5E16 DTM= 0.5E-6 .... の組み合わせで行うようにしたいのです。で、問題は前レスに書いたようなことなのですが、他に必要な情報ありますでしょうか?
247 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 16:07:47 ] 245ではないが、やってみた。 $ cat test0415.f90 PROGRAM TEST0415 OPEN (3,FILE='a.dat',STATUS='OLD') READ(3,*) READ(3,*) FNUM READ(3,*) READ(3,*) DTM CLOSE(3) WRITE(*,*) FNUM WRITE(*,*) DTM PROGRAM TEST0415 $ cat a.dat FNUM= 1.5E16 DTM= 0.5E-6 $ gfortran --version GNU Fortran (Debian 4.3.0-3) 4.3.1 20080401 (prerelease) Copyright (C) 2008 Free Software Foundation, Inc. $ gfortran -o test0415 test0415.f90 $ ./test0415 1.50000004E+16 4.99999999E-07 $ ということで、問題無く読めた。
248 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 17:21:33 ] >>247 > ということで、問題無く読めた。 ということはコンパイラ依存か? >>244 はそういう情報を出していないし。
249 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 14:35:39 ] >>247 えーと、すみません、基本的には問題なく読めるのですが、全く同じやりかたを してるはずの別の行で、何故か値がおかしくなる部分が存在するんです。 ここには書ききれませんでしたが本当はもっと膨大な値を読み込んでます。 >>248 コンパイラはSalfordFTN77ですが、別のコンパイラでやっても同じ結果になります。
250 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 14:52:33 ] >>249 「値がおかしくなる」ための条件を自分で見付け出して。 サブルーチン内で正しく読めているか確認。そして、呼び出し元の メインプログラムで同じ値を返すか確認。 問題の提示が曖昧でどうにもできない。
251 名前:244 mailto:sage [2008/04/18(金) 16:50:45 ] >>250 うーん、多分なんですが自己解決しました。読み込みの都合上、 a.datの中では、読み込みの都合上(DO文で回すためです) 使わない要素にもダミーの数値を入れてたんですが、 COMMON文のがわで、「使わないんだからいいだろ」と思って ダミーの文まで次元を用意してませんでした。 要するに存在しない配列の要素に数値を代入してました。 つまり LIM(1,1)=10 LIM(1,2)=10 TEMP(1)=273 LIM(2,1)=20 LIM(2,2)=20 TEMP(2)=0←ダミーの数値 っていう場合に、 COMMON/SURFACE/LIM(2,2),TEMP(1) としてました。 COMMON/SURFACE/LIM(2,2),TEMP(2) にしたら直ったようです。ダメだったんですね…
252 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 02:48:59 ] >>251 その説明ではよく分からんが、COMMONは記憶領域の共有であって、 グローバル変数だと思っていると正しくない。 COMMONの最後の要素の長さが違うだけなら、問題は起きないと思うが (これは無名COMMONだけだったか?最近COMMONを使わないから細部を忘れた) 途中の要素の長さを変えたらそこから先の番地が全部ずれることになる。
253 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 18:25:11 ] integer hoge(100)と宣言すると1が始点になり、hoge(1)〜hoge(100)までのメモリが確保されますが、 hoge(0)はどこかを指しているんでしょうか? hoge(0)=123と代入しても特に怒られなかったのですが、やらないほうがいい行為でしょうか?
254 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 18:49:45 ] >>253 > hoge(0)=123と代入しても特に怒られなかったのですが、やらないほうがいい行為でしょうか? そりゃやらん方がえぇ。そもそもソレをする事にどんな意味があるの? そういうのは C でも怒られないよね。で、メモリ絡みのバグに繋がるんだっけ? コンパイラによるけど、定義範囲外にアクセスしたときに(プログラムを)強制中断するオプションがある。
255 名前:253 mailto:sage [2008/04/22(火) 22:27:34 ] >>254 やはりそうですよね、常識で考えれば・・・ pgi6.4です。普通にコンパイルできて、結果も問題なかったんですが、アレって思いまして。
256 名前:254 mailto:sage [2008/04/23(水) 13:20:16 ] >>255 文法上の違反ではない(はずだ)からコンパイルは出来る。 コンパイルオプションで警告を出すようにでもすれば、何 か言われるかもしれないが、何も付けなければ、文法上の 問題が無いからスルー。実行結果まで保証しない。
257 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 13:25:28 ] 2次元座標(x,y)を(r,theta)に変換する関数って用意されてないですか? atan(y/x)とyの符号で場合分けしてましたが
258 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 18:01:36 ] F77の勉強始めて3日目のの初心者なんですが、練習にオセロのプログラムを作ろうとして行き詰まってます。 BAN(8,8)の数列で、オセロのマスを指定してるんですが、あるマスBAN(m,n)に石を置いた時にその周り8方向のマスを調べる方法がわかりません。 だれか教えてください。
259 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 23:54:16 ] >>255 Fortranはスピード優先なので、配列のはみだしは普通チェックしない。 コンパイラの実行時オプションでチェックするように出来るのが普通だが、あくまでデバッグ用の位置づけ。 今の場合、配列をはみだして他の変数を上書きしている可能性が高い。 MAPオプションでメモリー上に変数がどうアロケートされているかを調べれば、どの変数が壊されているか 見当がつく。 >>257 そういう関数はFortranの標準には無い。 今の場合、ATAN(y/x)よりもATAN2(y、x)を使うほうが適切、X=0.0の場合の0割エラーなどを避けられる。 詳しくはマニュアル味噌。 >>258 素直に前後左右斜めを調べるしかないべ。 DO i=-1,1 DO j = -1,1 CALL check(ix + i, iy + j) END DO END DO 枡をはみだす端っこの処理を簡素化するには、配列を0〜9までで宣言して端っこマスは 別途の方法で処理するとかできる。空=0、白=1、l黒=2、マスの外=−999とか。
260 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 09:51:47 ] >>259 atan2なんてあったんですね!ありがとうございました。
261 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 17:00:17 ] form指定子のunformattedとbinaryはどちらが推奨とかあるんですか? unformattedは機種依存みたいだから、やっぱりbinary? 「Fortranのunformatted=バイナリ」と勘違いしてる人もたまに見かけますが 確かに紛らわしいところだと思いますが、どういう経緯でそういう仕様になったのだろう・・・
262 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:52:06 ] >>261 普通に数値ファイルなどをシーケンシャルに読み書きするなら UNFORMATTED のほうがいいと思う。 ここでUNFORMATTED の SEQUENTIAL FILE は、改行コードが入っている。 DIRECT ACCESS の場合はベンダー依存だが、トランスパレントにべた書きされていることが多いと思う。 本来はランダムアクセスのためのファイル形式だが、レコード長を1BYTEに指定して順繰りに読んでゆく ことで binary の代用に出来ることが多い。 昔のマンガや映画でコンピュータがガタガタ磁気テープをアクセスしているのは、DIRECT ACCESS で ランダムアクセスしてデータを読み出しているところと思われる。 binary は、本当に改行コードなども含めてトランスパレントな生のデータが欲しいときに使うものなので UNFORMATTED と直接比較されるものではないと思う。 ついでにいうと binary は Fortran2003 で導入される規格で、Fortran95までではコンパイラー側の拡張になっているはず。 歴史的には、文字コードも、数値フォーマットも、1ワードのビット数も機種依存だったので、 UNFORMATTED を機種依存と責めるのは可哀想です。 たとえていうなら、『僕の肛門もEBCDIC(K)をぶち込まれそうです(><;』といった感じ。
263 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 10:39:23 ] 改行コードって、一行のバイト数合計値を一行の前後にサンドイッチするやつだよね? od -t x4で覗いたら、この値って4バイトだけど、これだと一行4Gバイトまでしか書けないことにならない?
264 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 11:14:27 ] >>263 処理系依存だろうけど、今まで一語4バイトが主流だったから、そのくらいなんじゃない。 10年位前まではスパコンでも1配列のMaxが4Gだったし。
265 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 15:07:14 ] >>264 そっか でもそろそろ拡張してもいいような
266 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 23:34:36 ] アナル拡張
267 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 13:05:57 ] *
268 名前:助けてください [2008/04/29(火) 14:17:32 ] あの〜私FORTRAN90初心者なんですが、ガウスの消去法のプログラムを作りたいのですが、 どなたか簡単に作っていただけないでしょうか? ちなみに格子点の間隔は0.25で格子点9個です。 時間が無いので本当にお願いします。
269 名前:助けてください [2008/04/29(火) 14:51:02 ] マルチポストしています。
270 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 16:05:54 ] >>268 ググレカスでございます www.tnb.sd.kanagawa-it.ac.jp/home/lec/FEM/fortran.html
271 名前:デフォルトの名無しさん [2008/04/29(火) 19:02:53 ] 複素数のべき乗の計算はどのようにすればいいのでしょうか
272 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:52:00 ] >>271 複素数の実数べきか?実数の複素数べきか?
273 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 10:28:55 ] いえ10の100乗のタンジェントです
274 名前:デフォルトの名無しさん [2008/05/06(火) 01:05:31 ] 行列を作って対角化するプログラムを作っています。 行列を作るプログラムが動いたので それをサブルーチンに入れると コンパイルできるのですが、実行すると Segmentation fault (core dumped)のエラーが出ます。 行列の大きさは1000×1000です。 試しに行列のサイズを小さくすると350×350では動きました。 使ってるOSはvistaでcygwin上でg77でコンパイルしています。 メモリは2Gです。 行列サイズを大きいままで動かすことはできないでしょうか?
275 名前:274 [2008/05/06(火) 01:07:44 ] 行列を作るプログラムは 1000×1000でもちゃんと動きます。
276 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 03:06:32 ] >>274 これだけでは、なんとも言えんなw g77だから動的にメモリー取ったりはしていないんだろうし? とりあえず、 -fbounds-check -ffortran-bounds-check この辺のオプションで配列はみだしチェックを。 もう少しヒントを呉。 たとえば行列は実対称の単精度の密行列で、ライブラリはLAPACK、呼んでるルーチンは、某。 呼び出し行は CALL xxxxx(xxxxxx) 使用変数の宣言行は、カクカクしかじか REAL H(1000, 1000), xxxxxxxxxxxx ぐらいあるとありがたい。
277 名前:274 mailto:sage [2008/05/06(火) 04:16:04 ] >>276 -fbounds-check をオプションにしてコンパイルしたらエラーは出ませんでした コンパイルしてできたexeを実行したら Segmentation fault (core dumped)のエラーが出ました 配列のはみ出しチェックのしかたがよくわからないのですが これでいいんですかね? あと行列は実対称の倍精度です。 今は対角化する以前の段階でプログラムは以下のような感じで作っています。 implicit none integer m parameter (m=1000) real*8 a(m,m) ・・・ call matrix(a,m,mm ・・・) write(*,*) mm (mmは実際に行列が書かれている行数) stop end subroutine matrix(a,m,mm ・・・) implicit none integer m, mm, ・・・ real*8 a(m,m), b(m,m), ・・・ ・・・ (行列を作る) return end
278 名前:274 mailto:sage [2008/05/06(火) 04:22:23 ] 上のようなプログラムです。 subroutineに入れなければm=2000でもきちんと動いたのですが 入れるとコンパイルはとおりますが 実行するとSegmentation fault (core dumped)のエラーが出ます(上に書いたとうりです) このくらいの情報でよろしいでしょうか? 足りないのなら付け足します。 よろしくお願いします。
279 名前:274 mailto:sage [2008/05/06(火) 17:18:06 ] 自己解決しました。 subroutine の中の大きい行列(>>277 のa(m,m)、b(m,m)など)全部を メインプログラムので定義してやるとm=1000でも動きました。 subroutineの中にだけでかい行列を何個も定義したらダメなんですね。 知らなかった。
280 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 18:48:57 ] >>279 それは多分スタックオーバーフローだな。 g77エラーメッセージは不親切だな。
281 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 19:02:33 ] >>277 よく分からないのだけど mm はメインで定義しなくてイイの?
282 名前:274 mailto:sage [2008/05/06(火) 21:25:45 ] >>280 スタックオーバーフローと思います。 今まででかい行列はメインで定義しないと スタックからあふれるということを知らなかったです。 >>281 すいません、メインでmmは定義してます。
283 名前:281 mailto:sage [2008/05/06(火) 22:25:27 ] 下のコードを g77 でオプション無しでコンパイルした時も -ffortran-bounds-check を付けてコンパイルした時も 正常に動作したけど。もぅワカリマセン。 program call_matrix implicit none integer m ,i ,j parameter (m=1000) real*8 a(m,m) call matrix( a, m ) do i = 1, m , 1 do j = 1, m , 1 write(*,*)"a(",i,",",j,")=",a(i,j) end do end do stop end program call_matrix subroutine matrix( a, m ) implicit none integer m, i,j real*8 a(1:m,1:m), b(1:m,1:m) do i = 1, m , 1 do j = 1, m , 1 a(i,j) = dble( i+j ) b(i,j) = dble( i*j ) end do end do return end subroutine matrix
284 名前:274 mailto:sage [2008/05/07(水) 04:21:21 ] >>283 さんのプログラムをg77でオプション無しでコンパイルして実行したところ Segmentation fault (core dumped)のエラーが出ました。 mの値を変えてコンパイルして実行を繰り返したところ m=509以上だとSegmentation fault (core dumped)のエラーがでます。 何か異常があるんですかね? 関係あるかどうかわかりませんがcygwinで ulimit -a を実行した結果を下に書きます。 core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited open files (-n) 256 pipe size (512 bytes, -p) 8 stack size (kbytes, -s) 2033 cpu time (seconds, -t) unlimited max user processes (-u) 63 virtual memory (kbytes, -v) 2097152
285 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 09:54:02 ] >>284 509 * 509 * 8byte(倍精度) = 2,072,648 なので virtual memory の MAX超えてるのかもしれんな。Cygwin はよく知らんが、こんな小さい初期値なのか?
286 名前:285 mailto:sage [2008/05/07(水) 09:55:53 ] ごめんw よく見たら単位が kbytes だったw だからメモリーはまだ余裕だwwwwww
287 名前:281 mailto:sage [2008/05/07(水) 12:09:31 ] コンパイラを変えてみたらどうでしょうか? g95 と gfortran くらいしか思いつきませんが。
288 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 16:16:23 ] 配列サイズを引数で渡さずにサブルーチン内で定義すれば? んで、common 文をつかって、コンパイラに 「いちいちallocateしなくてもいいよ」と教えてあげる。 「common文は使っちゃだめ教」があるのは知ってるけど 試してみてちょ。
289 名前:288 mailto:sage [2008/05/07(水) 16:16:54 ] program call_matrix implicit none integer m ,i ,j parameter (m=1000) real*8 a(m,m) common /gyouretu/ a ! <-- ここ加えた call matrix( ) ! <-- ここ変えた do i = 1, m , 1 do j = 1, m , 1 write(*,*)"a(",i,",",j,")=",a(i,j) end do end do stop end program call_matrix subroutine matrix( ) ! <-- ここ変えた implicit none integer m parameter (m=1000) ! <-- ここ加えた integer m, i,j real*8 a(1:m,1:m), b(1:m,1:m) common /gyouretu/ a ! <-- ここ加えた do i = 1, m , 1 do j = 1, m , 1 a(i,j) = dble( i+j ) b(i,j) = dble( i*j ) end do end do return end subroutine matrix
290 名前:288 mailto:sage [2008/05/07(水) 16:19:57 ] あと、関係なとは思うけど多重ループはこの例の場合、 ループ制御のincrementalの整数は 内側をi 外側をj にする習慣を付けていた方が良いよ。知ってたらごめん。
291 名前:288 mailto:sage [2008/05/07(水) 16:25:02 ] コンパイル通らなかったw サブルーチンの中でmを2回定義しているから後のはとってね。 自分の所の g77 on linux (バージョン不明) だと動いたよ。 がんばってね。
292 名前:288 [2008/05/07(水) 16:48:44 ] 更にお節介。 parameter文で定義した変数を subroutineの引数に使うのはよした方が良いよ。 ・・・・ cygwin 最近使ってないなぁ。 274さんはhostのOSは何?もうvistaに対応してる?
293 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 18:10:04 ] OS :Windows Vista gfortranをインストールしてコンパイルしようとしたのですが、 下記のようなメッセージが出てコンパイルできません。 ld: crtbegin.o: No such file: No such file or directory どうすれば、コンパイルできるようになりますか?
294 名前:293 mailto:sage [2008/05/07(水) 18:20:36 ] 下記のページを参考にして、コンパイルを行いました。 ttp://www.esst.kyushu-u.ac.jp/~space/kumashiro/fortran.html
295 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 18:41:31 ] >>293 可能性は3つある。 インストールしたバイナリに問題がある。 インストール方法に問題がある。 コンパイルしようとしたプログラムソースに問題がある。 あとは任せた。君なら出来る。
296 名前:281 mailto:sage [2008/05/07(水) 19:11:08 ] >>292 > 更にお節介。 > parameter文で定義した変数を > subroutineの引数に使うのはよした方が良いよ。 ココ詳しく。実はよくやってます。
297 名前:293 mailto:sage [2008/05/07(水) 19:35:54 ] >>295 g95をインストールしてコンパイルしたら、できました。 ありがとうございました。
298 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 11:51:23 ] >>296 281さんが例として出したプログラムだと問題ないんだけど、 何かの拍子にサブルーチン内でmの値を変更してしまう場合にややこしい。 おおざっぱに言って、メインレベルで定義された固定変数はコンパイラによって m = 1000 の代入処理+メインレベルでmが変更されていないかを監視するだけか、 前処理の段階でメインレベルでの変数mを1000に置き換えるかのどちらかをするんだけど 前者の場合、副プログラムで値が変わる場合までチェックしないので面倒。たとえば parameter(m=1000) call foo(m) write(*,*) m で副プログラムfoo中でm=1という代入文があるばあいに結果が保証されなくなっちゃう。 出力はコンパイラによって1000だったり1だったり、浮動小数点なら値がエンディアンレベルで壊れていたりする。 ぜったいmを副プログラムで変えない(intent文でチェックするとか)ならいいけど、 習慣として引数渡しせずに副プログラムでも parameter(m=1000)と定義してやった方が安全。 mの値の変更はたいていのエディタなら一括置換で出来るしね。 あるいはm2=mとかして非固定変数に値を移してからそれを引数にするとかすると良いと思う。 似た理由で do i = 1, 100 call foo(i) enddo みたいにループ制御の(整数)変数も引数に使わない方が安心。 あくまで「安心と安全」という気分の問題だけどね。コードが大きくなるとデバッグするときに こういう部分ががボディブローよろしく効いてくるので。老婆心。
299 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 18:09:15 ] 100×100くらいの大きな対称行列の逆行列を求める方法を探しています。 どのような方法が一番精度が良いでしょうか?お知恵をお貸し頂ければ幸いです。
300 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:46:45 ] >>299 対象の行列に因ると思う。実対称とか色々。 私は考えるのがメンドーなので lapack に丸投げしてるが。
301 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:59:38 ] lapack 丸投げでいいと思う。 lapack は誤差減らす工夫してたと思うし。 対称行列なら対角化を経由する方法がいいかと。 数値誤差で対称性がくずれるなんてこともないし。 三角行列で扱うから。
302 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 22:23:14 ] やっぱ極力ライブラリ使うべきだよね 大抵のはあるし
303 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:02:12 ] Fortranでは何次元配列で何要素数あつかえるのでしょうか。 メモリとCPUによる? ちなみにFloatの4次元で、130559044000個(1ファイルで50GBのデータサイズ)を処理したい。
304 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:16:18 ] 確実にメモリには載らない。 1. 小出しに処理する 2. 圧縮する のどちらかになるな。
305 名前:299 mailto:sage [2008/05/12(月) 04:37:39 ] 300,301,302さん、レスどうもありがとうございます。 自分の素人っぷりが恥ずかしい限りなのですが 扱う行列が倍精度でもLAPACKで大丈夫でしょうか? 何はともあれ、試行錯誤してみます
306 名前:助けてください [2008/05/13(火) 13:59:50 ] 今FORTRANで「ガウスの消去法のプログラムを作れ」とのことなのですが、サブルーチンを 使ったプログラムが作れません。ALLOCATABLEを使ったプログラムなら作れたのですが、誰か ひとつ例として作って頂けませんか?お願いします。
307 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 16:29:56 ] >>306 宿題スレではないぞよ。
308 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 16:48:18 ] では宿題スレを紹介してください