1 名前:デフォルトの名無しさん [2006/11/22(水) 00:00:36 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用) pc8.2ch.net/test/read.cgi/tech/1138063703/ ●関連スレ FORTRAN W pc8.2ch.net/test/read.cgi/tech/1163319215/
22 名前:デフォルトの名無しさん [2006/11/28(火) 06:35:16 ] 以下のようなプログラムでは、サブルーチン(sub) で配列Aに対して segmentation errorが出るはずなのですが出ません。 このようなサブルーチンでもちゃんとエラーを出してくれるようなコンパイルオプションってあるんですか? program main implicit none integer,parameter :: N=10 integer :: A(1:N) call sub(N,A) end program subroutine sub(N,A) implicit none integer :: i,N,A(1:N) do i=1,2*N ! segmentation error?? A(i)=i enddo return end subroutine sub
23 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 23:52:07 ] >>21 あやまる必要はないべ 大学なら周りに聞いたほうが早いと思う。
24 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 23:57:35 ] >>22 その程度のは見出しではセグメンテーションエラーまでは行かない。 もっと大きく、10**30くらいに書き込んで味噌。 配列はみだしを実行時に検出するオプションは、Subscript Check(添え字チェック) subchk という名前で知られている。 これはマトモなコンパイラなら必ず付いている。しかし、個々のコンパイラによって違うので マニュアルやヘルプをみて調べるしかない。 これは、実行が極端に遅くなるので普通debugの時だけ使う。
25 名前:22 mailto:sage [2006/11/29(水) 00:38:25 ] >>24 レスサンクスコ! ifort (ver9.1) 使ってるんですが, とりあえず/check:allとつけとけば色々検出してくれるようです. このはみ出しもチェックしてくれました.
26 名前:デフォルトの名無しさん [2006/11/29(水) 00:48:57 ] 波数kの関数phik(k)から、xの関数phi(x)へと逆フーリエ変換をする プログラムを作るのにてこずっています。 phi(x) = sum phik(k)*exp(i*k*x)だと思うのですが、どうもうまく作れません。 xは位置座標、kは波数で、それぞれ-5〜5、-1〜1の間でとっています。 試しに、phi(x)=2cos(0.1x)の波を作るため、k=-0.1と0.1以外は重み (amp)を0にとりました。 何かがおかしいとは思って考えているのですが、わかりません。 どうかアドバイスを頂けたら幸いです。よろしくお願いします。 integer nx, imax, nk, jmax, i, j real*8 xmax, dx, kmax, dk, x, k complex*16 phi(500), phik(500), sumphik parameter (xmax = 5.0d0, nx = 50, kmax = 1.0d0, nk = 10) dx = xmax/nx ; imax = 2*nx + 1 dk = kmax/nk ; jmax = 2*nk + 1 do i = 1, imax x = -xmax + (i-1)*dx do j = 1, jmax k = -kmax + (j-1)*dk if (((k-0.1d0).lt.1.0d-3).or.((k+0.1d0).lt.1.0d-3)) then amp = 1.0d0 else amp = 0.0d0 end if phik(j) = amp*cdexp((0.0d0, 1.0d0)*k*x) sumphik = sumphik + phik(j) end do phi(i) = sumphik write(*, *) x, dble(phi(i)) sumphik = 0.0d0 end do end
27 名前:デフォルトの名無しさん [2006/11/29(水) 03:27:07 ] >>26 if (((k-0.1d0).lt.1.0d-3).or.((k+0.1d0).lt.1.0d-3)) then これが原因だ。ABSをつければ解決する。 IF ( (ABS(k-0.1d0).lt.1.0d-3) .OR. & (ABS(k+0.1d0).lt.1.0d-3) ) THEN ABSが無いと、kが0.1ないし-0.1以下のときは必ず条件を満たしてしまう。 あとsumphik = 0.0d0 の位置が悪い。入れるべき位置はここだ。 あと複素変数なんだから複素でクリアすべし。 do i = 1, imax sumphik = (0.0d0, 0.0d0) x = -xmax + (i-1)*dx FORTRANでは変数の初期値は不定であって0になっているとは限らない。 変数は誰が使ったか分からないコップや茶碗だと思って、必ず洗ってから使うべし。 ======== ところで一般的なアドバイスだが、FORTRAN77で行くのなら、暗黙の型を絶対守るべきだ。 そうすることによりいちいち宣言部を見なくても型が分かる。 FORTRAN77で暗黙の型を守っていない場合、もうそれは素人が書いたものとして 普通相手にされない。 普通のFORTRAN使いが、このプログラムを見た場合k,kmaxがreal*8になっているのを見た時点で、 もう問題外としてその先を見るのをやめる。 変数を全部宣言すればいいじゃないかと思うかもしれないが、FORTRAN77は暗黙の型があるため 宣言忘れがエラーにならないのでヤヴァイ。たとえば、このプログラムではampの宣言を忘れている。 Fortran90にはIMPLICIT NONEがあるので暗黙の型宣言を無効化できるが、 それでも暗黙の型を守ったほうがいい。
28 名前:26 [2006/11/29(水) 03:55:33 ] 26様、お答え下さりありがとうございました。 今までわからず、まだうなっておりました。絶対値を取っていないとは、 本当に馬鹿です。 FORTRANの一般的なアドバイスまでご教授頂き、本当に恐縮です。 変数はなるべく暗黙の型を使うと言うことは、今後は肝に銘じようと思います。 ampの宣言を忘れていることは、全く気づきませんでした。エラーの原因になる 可能性があり、大変危険ですね。 このたびはご助言頂き、本当にありがとう存じました。
29 名前:26 [2006/11/29(水) 03:58:50 ] 1行目は27様の間違いです。 27様、返す返すこのたびは有り難うございました。
30 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 22:23:00 ] windows上で ifort 使ってるんですが makefileを自動でサクッと作ってくれるツールないでしょか.. csmkmkっていうよさげなアプリを見つけたんですが挙動が変です. 皆さんは手動で書いてるんでしょうか?
31 名前:デフォルトの名無しさん mailto:sage [2006/11/30(木) 00:31:46 ] >>30 インテルのサポート掲示板にも似たような要望が出ていた。 automakeのようなツールを用意することに前向きな姿勢を見せていた。 漏れはモジュールの依存関係が複雑になってから面倒だから統合環境を使っている。
32 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 07:56:25 ] fortranにはCのようなインライン関数は無いんですか?
33 名前:デフォルトの名無しさん [2006/12/01(金) 10:29:33 ] >>32 あるが、コンパイラによる自動最適化として行われる。 ベンダー依存のコンパイル指示行をいじれば、制御できる。
34 名前:デフォルトの名無しさん [2006/12/01(金) 10:31:58 ] >>32 あるが、コンパイラによる自動最適化として行われる。 ベンダー依存のコンパイル指示行をいじれば、制御できる。
35 名前:デフォルトの名無しさん [2006/12/01(金) 13:14:21 ] subroutineで戻り値もたせるにはどうしたらいいの? うまいやり方あるんだよね?おしえて☆
36 名前:デフォルトの名無しさん [2006/12/01(金) 13:53:30 ] PROGRAM REIDAI4_3 IMPLICIT NONE INTEGER :: I,N REAL :: S,SS,HEIKIN,SIGMA,BUNSAN REAL :: A(100) WRITE(*,*) 'N=' READ(*,*) N DO I=1,N WRITE(*,'(1X,A2,I2,A2)') 'A(',I,')=' READ (*,*) A(I) END DO S=0.0 DO I=1,N S=S+A(I) END DO HEIKIN=S/N SS=0.0 DO I=1,N SS=SS+(A(I)-HEIKIN)**2 END DO BUNSAN=SS/REAL(N) SIGMA=SQRT(BUNSAN) WRITE(*,*) 'ヘイキンチ ハ',HEIKIN WRITE(*,*) 'ブンサン ハ',BUNSAN WRITE(*,*) 'ヒョウジュンヘンサ ハ',SIGMA STOP END PROGRAM REIDAI4_3
37 名前:36 [2006/12/01(金) 14:20:58 ] 何故かエラーが出ます・・・・・
38 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 14:24:37 ] >>36 ,37 超能力者を呼べ
39 名前:デフォルトの名無しさん [2006/12/01(金) 15:11:32 ] Fortran90です。 mainルーチンでallocateした配列をサブルーチンに渡して、その中で サイズを変えて再アロケート(deallocate->allocate)することは出来る のでしょうか?
40 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 15:31:09 ] randomという数値ルーチンはwindows上で動かすと 問題なく動作しているようなのですが、 unix環境になるとまったく動かなくなります。 どうすればいいでしょうか? Fortran90です。
41 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 22:49:19 ] >>40 マニュアル嫁!! Fortran90固有の乱数サブルーチンはRANDOM_NUMBER()だろ。 RANDOMはベンダー拡張のルーチンだ。 エラーが出たら文法書を嫁! 法律書と同じだ。トラブッたら文法書を開け!
42 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 22:52:53 ] >>37 どういうエラーが出るか書け。答えようがない。 ざっと見たところプログラムはおかしくない。 コンパイルして動かしてみたが、ちゃんと動いているように見える。 データ数3個でしか試してないがwww
43 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 23:03:09 ] >>39 確か出来たはず・・・・・ 最悪でもポインターで送ればできる。 コンパイラでやってみたらできた。一応F90厳格オプションを掛けたのでおkだろ。
44 名前:デフォルトの名無しさん mailto:sage [2006/12/01(金) 23:06:41 ] >>35 サブルーチンに戻り値を持たせたければ、引数を1こ増やせばいいだろ。 それが嫌ならFUNCTIONを使え。 しかしFORTRANの伝統では、FUNCTIONは返す値が1個で、引数はINTENT(IN)で 副作用なし、と取ることに不文律でなっている。数学のFunctionを連想するので、 これが自然に思える。 Cのような何でもFunctionにするのは愚かな浅知恵だと思う。
45 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 08:01:34 ] >>41 マニュアルって、どこにあるんでしょうか?
46 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 08:49:05 ] >>45 見つかるまで探せ! 幸せの青い鳥は足元にいるんだ!
47 名前:デフォルトの名無しさん [2006/12/02(土) 11:43:15 ] 下記のfortran90のプログラムをfortran77にするとどういうふうになるのか 教えていただけませんか? PROGRAM vipper IMPLICIT NONE REAL :: theta1, theta2, phi1, phi2, alpha, anu, pi REAL :: rot_z(3, 3), rot_y(3, 3), vec1(3), vec2(3) CHARACTER :: ns, ew pi = 4.0 * ATAN(1.0) alpha = 6242.2 / 6370.0 anu = ( 180.0 - 86.6 ) * pi / 180.0 theta1 = ( 90.0 - ( 35.0 + 40.0 / 60.0 ) ) * pi / 180.0 phi1 = ( 139.0 + 12.0 / 60.0 ) * pi / 180.0 ! rot_z(1, :) = (/ COS(phi1), -SIN(phi1), 0.0 /) rot_z(2, :) = (/ SIN(phi1), COS(phi1), 0.0 /) rot_z(3, :) = (/ 0.0, 0.0, 1.0 /) ! rot_y(1, :) = (/ COS(theta1), 0.0, SIN(theta1) /) rot_y(2, :) = (/ 0.0, 1.0, 0.0 /) rot_y(3, :) = (/ -SIN(theta1), 0.0, COS(theta1) /) ! vec1(1) = SIN(alpha) * COS(anu) vec1(2) = SIN(alpha) * SIN(anu) vec1(3) = COS(alpha) ! vec2 = MATMUL(rot_z, MATMUL(rot_y, vec1)) !
48 名前:デフォルトの名無しさん [2006/12/02(土) 11:43:46 ] theta2 = ASIN(vec2(3)) * 180.0 / pi phi2 = ATAN2(vec2(2), vec2(1)) * 180.0 / pi ! PRINT *, theta2, phi2 ns = 'N' IF (theta2 < 0.0) ns = 'S' ew = 'E' IF ( phi2 < 0.0) ew = 'W' PRINT '(i4, a, i2, 1x, a)', INT(ABS(theta2)), ' ', NINT(( ABS(theta2) - INT(ABS(theta2)) ) * 60.0), ns PRINT '(i4, a, i2, 1x, a)', INT(ABS( phi2)), ' ', NINT(( ABS( phi2) - INT(ABS( phi2)) ) * 60.0), ew STOP END PROGRAM vipper よろしくおねがいします。
49 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 12:09:05 ] >>47 (1) ソースを自由形式→固定形式に変更する (2) 変数の宣言をF77式に変更する(REAL :: hoge → REAL hoge) (3) コメント( ! ) をF77式に変更する (4) rot_z(1, :) = (/ ... /) 等配列に代入している部分は各要素毎に1つずつ代入する (5) MATMULに相当する手続きを自作する (6) 関係演算子( < ) をF77式( .LT. )に変更する まだあるかも知れんが、とりあえずこんなところか。
50 名前:39 mailto:sage [2006/12/02(土) 13:01:36 ] >>43 どうも。 出来るのですか。とするとやり方が間違っていたのですね。 fortran90のポインタは使ったことありませんが調べてみます。
51 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 13:54:41 ] >>50 こんな感じでできた。IntelFortran MODULE m_test IMPLICIT NONE CONTAINS ! SUBROUTINE chinpo(kk) IMPLICIT NONE INTEGER, ALLOCATABLE, INTENT(IN OUT) :: kk(:) ALLOCATE (kk(10)) kk = 999 RETURN END SUBROUTINE chinpo ! END MODULE m_test !============================================================= PROGRAM unko USE m_test IMPLICIT NONE INTEGER, ALLOCATABLE :: n(:) CALL chinpo(n) PRINT *, n STOP END PROGRAM unko
52 名前:デフォルトの名無しさん [2006/12/02(土) 15:22:54 ] [7] g77 -o r7 r7.f /tmp/cc9A4yij.s: Assembler messages: /tmp/cc9A4yij.s:136: Error: symbol `MAIN__' is already defined /tmp/cc9A4yij.s:299: Error: symbol `MAIN__' is already defined こういうエラーが出ます・・・・
53 名前:デフォルトの名無しさん [2006/12/02(土) 15:23:29 ] >>52 は>>37 です。
54 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 16:52:25 ] windows上で使えるフリーのコンパイラはありますか?
55 名前:デフォルトの名無しさん mailto:sage [2006/12/02(土) 18:02:24 ] >>52 はじめっからエラーメッセージを書くべし。 それはメインルーチンが複数あるということだから、メインルーチンと勘違いされるような 行があるということだ。 g77についてはよく知らんが、136や299がエラー行を表しているんじゃないか? その辺の行を見て味噌。 一見空行でもみょうな制御コードが混じっていたりするとこういう事が起こる。 たとえば2バイトの日本語文字とか。 そもそもg77は2バイト文字に対応しているのかね? >>54 本スレの>>1 をみろ! FORTRAN W pc8.2ch.net/test/read.cgi/tech/1163319215/
56 名前:デフォルトの名無しさん [2006/12/03(日) 01:14:01 ] 三次元のポアソン方程式を解きたいのですが、どんなプログラムにしていったらいいでしょうか?? fortran77で書いているのですが、なかなか上手くいかなくて… お願いします。教えてください。
57 名前:デフォルトの名無しさん [2006/12/03(日) 09:04:58 ] もーーどーーしてもうまくいかないので質問させてください。 自宅のwinXPでfortran95を使いたくて、本スレにリンクしてある「FTN77/95のインストール方法」を参照していたのですが・・ まず、リンク先から「Salford FTN95 Personal Edition」をデスクトップにDLしました。 次に、インストーラを起動させてC:\Program Files\Salford Software\FTN95にinstallしました。 で、参照ページを見ると.NETを持ってない場合はDOSでテストしてみると書いてあったので、 DOSでcd C:\Program Files〜に移動して、ftn95とコマンド入力。 そしたら「Ver4.9 copyright 云々」と出たので多分OK。 次に、installしたフォルダに一緒に入っていたfcpad.exeを起動すると書いてあるので、起動。 するとコンパイラのパスを求められたので、C:\Program Files\Salford Software\FTN95と入れてOKを押しました。 そしたら、「コンパイラのパスが正しくありません」と言われてしまいます。 コンパイラftn95.exeを右クリック→プロパティで「場所」をコピーしてやってみてもやっぱりだめでした。 長文ごめんなさい、自分のやり方はどこが間違ってるのでしょうか?
58 名前:デフォルトの名無しさん [2006/12/03(日) 09:13:18 ] >>57 >するとコンパイラのパスを求められたので、 >プロパティで「場所」をコピーしてやってみても C:\Program Files\Salford Software\FTN95\ftn95.exe でもダメ?
59 名前:57 mailto:sage [2006/12/03(日) 09:36:44 ] >>58 で き ま し た 。 なんか単純常識的なことを知らなかったようで・・ 即レスありがとうございました。
60 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 11:15:26 ] >>59 いいのよ〜♪
61 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 12:12:39 ] >>57 ,59 CPad for Salford FTN77もいいけど FTN95付属のPlato3 IDEも使ってやれよー。 日本語が使えなかったりプラトン先生の顔が怖かったりするけど ちゃんと自由形式で色分けしてくれてデバッガもついとるでよー。
62 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 15:22:42 ] >>47 世話が焼けるなー PROGRAM vip77 REAL rotz(3, 3), roty(3, 3), vec1(3), vec2(3), tmp(3) pi = 4.0 * ATAN(1.0) degrad = pi / 180.0 alpha = 6242.2 / 6370.0 anu = ( 180.0 - 86.6 ) * degrad theta1 = ( 90.0 - ( 35.0 + 40.0 / 60.0 ) ) * degrad phi1 = ( 139.0 + 12.0 / 60.0 ) * degrad C rotz(1, 1) = COS(phi1) rotz(1, 2) = -SIN(phi1) rotz(1, 3) = 0.0 rotz(2, 1) = SIN(phi1) rotz(2, 2) = COS(phi1) rotz(2, 3) = 0.0 rotz(3, 1) = 0.0 rotz(3, 2) = 0.0 rotz(3, 3) = 1.0 C roty(1, 1) = COS(theta1) roty(1, 2) = 0.0 roty(1, 3) = SIN(theta1) roty(2, 1) = 0.0 roty(2, 2) = 1.0 roty(2, 3) = 0.0 roty(3, 1) = -SIN(theta1) roty(3, 2) = 0.0 roty(3, 3) = COS(theta1)
63 名前:デフォルトの名無しさん [2006/12/03(日) 15:23:37 ] C vec1(1) = SIN(alpha) * COS(anu) vec1(2) = SIN(alpha) * SIN(anu) vec1(3) = COS(alpha) C CALL mulmat(3, roty, vec1, tmp) CALL mulmat(3, rotz, tmp, vec2) theta2 = ASIN(vec2(3)) / degrad phi2 = ATAN2(vec2(2), vec2(1)) / degrad PRINT *, theta2, phi2 STOP END ! SUBROUTINE mulmat(n, a, b, c) REAL a(n, n), b(n), c(n) DO 10 i = 1, n c(i) = 0.0 DO 20 j = 1, n c(i) = c(i) + a(i, j) * b(j) 20 CONTINUE 10 CONTINUE RETURN END
64 名前:62 [2006/12/03(日) 16:12:00 ] 使っているのは高校でも習う座標の回転だけだ。 高校では2次元、ここでは3次元だが、y軸とz軸に関して廻すだけだから 高校のものと本質的には変わりはない。COS、SINが湧いて来るのはそれが理由だ。 あと、FORTRANの三角関数はラジアンで与えることになっているから、 度表示をラジアンに直さなければならない。π/180はそこから湧いてくる。 また、角度表示は古代メソポタミア文明以来の60進法が使われているので、 度、分、秒を度の小数点表示にしてから、さらにラジアンにしている。 それが60で割ったりしている部分だ。 あと、座標としては極座標をとるが、北緯、東経などを極座標に直す必要がある。 座標系は右手系を取るのがふつう。(右手系とは右手のお父さん指がx軸、 お母さん指がy軸、のっぽのお兄さん指がz軸だ。) 考え方はこうだ。まず八王子が北極にあるとする。北極からミサイルをぶっ放した 到着点をしるのはたやすい。その地点をvec1に入れている。 ここで北極点を本来の八王子の位置に持っていくように座標軸を回転させる。 このときvec1にも同じ回転をかければ求める地点が分かる。それがvec2だ。 その他、問題文にもあるが、弧の長さと半径が分かれば角度が出る。 方位角ν(読み方はニュー速のニューだぞ)は、本来の八王子から見て真北から 時計回りにとると考える。(問題文からは判然としないが、常識的にはこう取るのが普通) 北極点から考える場合は南極向きで時計回りになる。
65 名前:62 [2006/12/03(日) 16:14:05 ] 訂正 >あと、座標としては極座標をとるが、北緯、東経などを極座標に直す必要がある。 角度の取り方は極座標の取り方をとって、x、y、zの直交座標系を右手系でとった。
66 名前:デフォルトの名無しさん mailto:sage [2006/12/03(日) 20:00:45 ] >>62 解説乙。 本当は出題者が地球半径を与えている筈ですね。 もし地球を楕円体として考えた場合、かなり面倒そうですね。
67 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 02:54:16 ] >>66 それは強烈に難しいw
68 名前:39 mailto:sage [2006/12/04(月) 10:07:52 ] >>51 ありがとうございます。出来ました。 subroutineをmoduleで包まないといけないのですね。 最近77から移ってきたのでどうもmoduleの使い方がいまいち 分かりません。
69 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 13:54:10 ] subroutineのなかにsubroutineとかfunction定義できるの? 自分で実験したほうが早いって?www
70 名前:デフォルトの名無しさん [2006/12/04(月) 23:50:42 ] >>69 できる・・・・が、それは普通のサブルーチンやファンクションとは違っている。 親ルーチンの変数をプチ・グローバルに共有している。 うっかりiとかjとかローカルに宣言しわすれたまま使ってしまうと、 親ルーチンのほうのiやjが書き換わってとんでもないことになる。 好みの問題だが、漏れはあまり好きくない。
71 名前:デフォルトの名無しさん [2006/12/05(火) 14:31:45 ] CPad for Salford FTN77 のコンパイラのパスが分かりません。 教えて下さい
72 名前:デフォルトの名無しさん [2006/12/05(火) 14:43:44 ] >>71 >>57 のへん見れ
73 名前:デフォルトの名無しさん [2006/12/05(火) 14:51:02 ] >>72 C:\Program Files\Salford Software\FTN95\ftn95.exe と入力しても ”コンパイラのパスが正しくありません”と表示されます ちなみにOSはXPです
74 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 14:55:10 ] >>73 エクスプローラで"ftn95.exe"を検索したら?
75 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 22:57:15 ] >>73 つーかお前の使いたいコンパイラはFTN77かFTN95かどっちなんだ? FTN77しか入れてないのにftn95.exeを探しても見つかりっこないぞw
76 名前:デフォルトの名無しさん [2006/12/06(水) 15:06:43 ] FTN77です
77 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 15:10:42 ] もぅ、ぉにぃちゃんしっかりしてよ〜
78 名前:デフォルトの名無しさん [2006/12/06(水) 15:29:18 ] >>71 なんとかできました
79 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 15:42:22 ] >>78 どうやったら「なんとかでき」たの?
80 名前:デフォルトの名無しさん [2006/12/07(木) 13:24:39 ] FTN77peをダウンロードして,コンパイラのパスに FTN77pe〜exeと入力してら、できました
81 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 00:22:42 ] FTN95ってどうよ?
82 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 02:43:06 ] >>81 コンパイル時/実行時のエラーチェックがけっこう強力で デフォルトで未使用変数の警告なんかも出してくれるので、 入門用やエラーチェック用にイイ感じ。 Personal版がフリーで使えるし。 その他の特徴としては ・Visual Studio 2003/2005上で使える(もちろんVSは別途購入する必要がある) ・VSがなくても独自のIDEが付属する(日本語は使えないが) ・(今時のFortranに必要かどうかはともかく)インラインアセンブラが使える ・(これも実用性のほどはともかく).NETなプログラムも作れる ・GET_COMMAND_ARGUMENT()、[...] 等Fortran2003の一部に対応(他のコンパイラでも大抵使えるレベルだが)
83 名前:デフォルトの名無しさん [2006/12/10(日) 17:07:02 ] >>82 dクス。 意外に高機能だな。 サポートとかはどうなんだろう?パッチとか結構でてるんだろうか?
84 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 20:23:17 ] intel fortran ver 9.0 for winを使っております。 自分でプログラムを組んでコンパイルできるところまでは到達したのですか実行すると forrtl: severe (168):Program Exception - illegal instruction Image PC Routine Line Source Stack trace terminated adnormally. と実行してくれません。なにがおかしいのでしょうか? ソースをのせるべきなんでしょうがnetnumpacから主に引っ張ってきている分権利がややこしそうです。 よろしくお願いします。
85 名前:84 mailto:sage [2006/12/10(日) 20:35:24 ] program main common/ numbb / nnn,lll,dz,ameson integer :: nnn, lll real*8 :: dz, ameson, dr(251),scr,hx open (unit=10, file='functest0.txt', status='unknown') open (unit=11, file='functest1.txt', status='unknown') open (unit=12, file='functest2.txt', status='unknown') open (unit=13, file='functest3.txt', status='unknown') open (unit=14, file='functest4.txt', status='unknown') open (unit=15, file='functest5.txt', status='unknown') nnn = 6 lll = 5 dz = 60.0d00 ameson = 413.536d00 dr(1)=exp(-8.8)*dz hx=5.d-2
86 名前:デフォルトの名無しさん [2006/12/10(日) 20:37:23 ] do l=2, 251 dr(l)=dr(1)* exp(hx*(l-1)) end do zero = 0.0 y = 0.0 do i = 1, 251 call GASND (zero, dr(i), screen, 40, Y, ICON) scr = y write(10,'("i="i2," dr(i)="e15.8," scr="e20.10)')i,dr(i),scr end do close (unit = 10) close (unit = 11) close (unit = 12) close (unit = 13) close (unit = 14) close (unit = 15) end
87 名前:84 [2006/12/10(日) 20:38:49 ] function screen(ddr) ! it's the Dnl(r) common/ numbb / nnn,lll,dz,ameson real*8 :: a1, a2, a3, al1, arn integer :: nnn, lll, l5 real, external :: DPLAGG integer, external :: factorial real, intent(in) :: ddr a0 = ameson arn = - a0 * ddr aa1 = 2.0d00*dz/(nnn*a0) nl = nnn-lll - 1 nll = nnn + lll a2 = factorial(nl) a3 = factorial(nll) a4 = 2.0d00*dble(nnn)*a3*a3*a3 a5 = aa1*(a2/a4) l5 = 2*lll + 1 l6 = 2*lll a6 = (arn)**(l6) al6 = dble(l5) al7 = DPLAGG(nll,al6, arn) al8 = al7*al7 ss = a5*exp(arn)*al8*a6 screen = ss write(11, '("nnn="i2," ss="e20.10)') nnn, ss end function screen
88 名前:84 mailto:sage [2006/12/10(日) 20:40:33 ] function factorial(n) integer :: fact integer, intent(in):: n fact = 1 do i = 1, n ,1 fact = fact*n end do factorial = fact write (12, '("n="i1," fact="i10)') n, fact end function factorial FUNCTION DPLAGG (N, A, X) IMPLICIT REAL (8)(A - H, O - Z) END FUNCTION DPLAGG SUBROUTINE GASND (A, B, FUN, N, Y, ICON) IMPLICIT REAL (8)(A - H, O - Z) EXTERNAL FUN DIMENSION X (50), W (50) SUBROUTINE WGLEGD (NP, PT, WT, ICON) ! LEGENDRE-GAUSS FORMULA IMPLICIT REAL (8)(A - H, O - Z) DIMENSION X (25, 50), W (25, 50), PT (NP), WT (NP)
89 名前:84 mailto:sage [2006/12/10(日) 20:42:38 ] netnumpacからのソースはプログラム名だけにしました 変数の定義があったりなかったりで非常にみづらいとは思いますがよろしくお願いします。
90 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 21:08:10 ] >>84 これは試したかい? Re: forrtl: severe (168) Program Exception - Illegal instructiom Reply Quote Turns out that the problem was caused by an older-generation processor not understanding newer instructions. The application had been compiled with the "Generate most optimized code" (/fast) setting, which implies /arch:host. Unfortunately, the project settings box display doesn't reveal the implied switches, leading to this sort of problem. Steve softwareforums.intel.com/ISN/Community/en-US/forums/thread/106764.aspx
91 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 21:21:02 ] >>83 SilverfrostのホームページからForumを見に行くと ここのAnnouncementsにパッチの情報も載っている。
92 名前:84 mailto:sage [2006/12/10(日) 21:41:42 ] >>90 英語をよみくだくと /arch:hostのコンパイラオプションをしろ ですよね やってみましたが変化なしでした。 環境はpen4 2.4BGHz 1024MB 845Echipset winxp sp2なんですがね
93 名前:デフォルトの名無しさん mailto:sage [2006/12/10(日) 22:03:23 ] >>92 debugモードでtracebackもonにしてどのソース行でおかしくなってるか調べてみたら?
94 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 01:23:37 ] >>92 Pentium 4の2.4BGHzだと拡張命令はSSE2までだから、 どこかにSSE3等を使ったコードが紛れ込んでるんですかね。 別のPCでコンパイルしたライブラリをリンクしているのなら そのライブラリがSSE3命令を使っている可能性も考えられます。
95 名前:84,92 mailto:sage [2006/12/11(月) 03:06:49 ] >>93 debugモードは使ったことがないけどやってみます >>94 ライブラリはもってきていないはずなので SSE3をつかったコードが紛れ込んでるんですかね
96 名前:デフォルトの名無しさん mailto:sage [2006/12/11(月) 08:32:14 ] >>95 つーかVisualStudio使わないでコマンドラインでやってるの?デフォはdebugのはずだが。 debugモードを使わないという神経が分からんぞい! まずは警告オプションも全部onにしてやりんしゃい!
97 名前:デフォルトの名無しさん [2006/12/13(水) 20:37:45 ] fortran77でファイルに書き込みをするときに open(2,file='filename.txt') とかけばfilename.txtに結果が書けるのですが、 ひとつのプログラムでa=1〜100まで変化したときに (do a=1,100 〜continueを利用) a=1のときの結果はfilename1.txtに記録 ・・・ a=100のときの結果はfilename100.txtに記録 するにはどのようにすればいいのでしょうか? 可能であればa=i,b=j(i,jに自然数が入る)のときに filename_a=i_b=j.txt に書き込めるように、お願いします。
98 名前:デフォルトの名無しさん mailto:sage [2006/12/13(水) 21:58:54 ] >>97 前スレでも出てたと思うが、FORTRAN77の場合だと fmt, fname は適当な長さの文字列変数として write(fmt,100) int(log10(real(i)))+1, int(log10(real(j)))+1 100 format('(''fname_'',I',I1,',''_'',I',I1,',''.txt'')') write(fname, fmt) i, j open(10, file=fname, ... 書式に 'I0' を指定すると「その数値を表現するのに最小の欄幅」を取ってくれる処理系なら write(fname,'(''filename_'',I0,''_'',I0,''.txt'')') i,j open(10, file=fname, ... 個人的には数値は適当な桁数にそろえて filename_001_001.txt, ..., filename_010_010.txt, ..., filename_100_100.txt, ... としたほうが後でデータファイルをいじったりする時に都合がよいように思う。 write(fname,'(''filename_'',I3.3,''_'',I3.3,''.txt'')') i,j open(10, file=fname, ...
99 名前:84,92 mailto:sage [2006/12/13(水) 23:06:12 ] >>96 コンパイラマシンは混んでいていつもコンパイルのみに使っていたのでdebugモードは未経験でした debugしてみたとこと dr(1)=exp(-8.8)*dz がひっかかっており sub = -8.8 dr(1) = dz *exp(sub) としたら動くようになりました。 exp(-8.8)がSSE3なりを使用しているんでしょうか
100 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 00:25:28 ] 最適化オプションを無効にすればSSE/2/3は使われないはずだが。
101 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 01:14:45 ] >>99 ReleaseでSSE抑止命令(CPUを旧型に指定)すれば、SSEが原因なのかどうか分かる。 定数式だから変な最適化でバグったのかね?
102 名前:デフォルトの名無しさん [2006/12/14(木) 03:12:02 ] 求めるP3の値がちょうど3(限りなく近い)値になるときのdaの値 を小数点6桁ぐらいまで求めたいのですが、どうすれば次のプログラムを 効率よくdaの値が一回で出せるプログラムにできるか知恵をお貸しください。 DIMENSION E22(2),oo(2) REAL k,pi,a,o,z,Kf,kf1 pi=3.1415926 DO 30 da= 1.000 , 0.800 , -0.002 DO 30 n4= 8 , 8 k=5.319 a=k/0.529177 o=(a**3)/2.0*da oo(1)=o z=1.0
103 名前:デフォルトの名無しさん [2006/12/14(木) 03:12:51 ] rs=(3.0*o/(z*4.0*pi))**(1.0/3.0) Kf=(9.0*pi/4.0)**(1.0/3.0)/rs Ef=Kf**2 c=2.0*1.0/(1.0+0.0155*pi/Kf) Ei=1.79186*z**(5.0/3.0)/(3.0*o*rs) P=-Ei*1.4703*10**4 E0=-4.42*z/(3.0*o*rs**2)+0.916/(3.0*o*rs)+0.031/(3.0*o) P0=-E0*1.4703*10**4 Rmk=3.182 q0=0.89*2*0.3947587 uk=q0*Rmk*cos(q0*Rmk)/(sin(q0*Rmk)-q0*Rmk*cos(q0*Rmk)) E1=-2.0*pi*z*2.0/o**2*(z*Rmk**2*(1.0+2.0/3.0*uk)) P1=-E1*1.4703*10**4 DO 20 L= 1 , 2 E2=0.0 IF(L.EQ.1) GO TO 100 o=o*0.996 oo(L)=o a=(o*2.0)**(1.0/3.0) rs=(3.0*o/(z*4.0*pi))**(1.0/3.0) Kf=(9.0*pi/4.0)**(1.0/3.0)/rs Ef=Kf**2 c=2.0*1.0/(1.0+(0.0155*pi)/Kf)
104 名前:デフォルトの名無しさん [2006/12/14(木) 03:13:27 ] 100 DO 10 n1= -n4 , n4 DO 10 n2= -n4 , n4 DO 10 n3= -n4 , n4 IF(n1==0.and.n2==0.and.n3==0)GO TO 10 IF(MOD(n1+n2+n3,2)/=0)GO TO 10 G=2.0*pi/a*SQRT(FLOAT(n1*n1+n2*n2+n3*n3)) f=G**2/(2.0*(G**2+c*Kf**2)) ae=1.0+(1.0-f)*4.0*pi*z*2/(o*G**2)*3.0/(2.0*Ef)* &(1.0/2.0+((4.0*Kf**2-G**2)/(8.0*Kf*G))*ALOG(ABS((2.0*Kf+G)/(2*Kf-G)))) V=(-4.0*pi*Z*2.0/(o*G**2))*((1.0+uk)*cos(G*Rmk)-uk*sin(G*Rmk)/(G*Rmk)) E3=1.0/(4.0*pi*2.0/(o*G**2))*V**2*(1.0/(1.0-f))*(1.0/ae-1.0) E2 = E2 + E3 10 CONTINUE E22(L)=E2/2.0 20 CONTINUE E8=(E22(2)-E22(1))/(oo(2)-oo(1)) P2=-E8*1.4703*10**4 P3=P+P0+P1+P2 WRITE(6,50)P3 50 FORMAT(F15.8) 30 CONTINUE WRITE(*,*)P,P0,P1,P2 WRITE(6,601) P3 601 FORMAT(1H , F15.8) STOP END
105 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 10:13:55 ] >>102 その質問の仕方じゃ 答えようがない。 もう少し何をやっているのか、根本から家
106 名前:97 mailto:sage [2006/12/14(木) 13:14:13 ] >>98 出来ました。ありがとうございます!
107 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 16:39:03 ] fortran90です。 いまwindows上で動かしてたプログラムを Linuxに移そうとしてるんですが Unable to open MODULE file dflib.mod とエラーが出てきます。 どうすればいいでしょうか?
108 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 20:00:26 ] Unable to open MODULE file dflib.mod ↓ エキサイト翻訳 ↓ MODULEファイルdflib.modを開くことができません。
109 名前:デフォルトの名無しさん [2006/12/14(木) 20:12:39 ] >>107 ほかの人にやってもらう
110 名前:デフォルトの名無しさん [2006/12/14(木) 22:50:01 ] >>107 dflib.mod はDECの拡張モジュールだから、そのままではLinuxでは動かない。 DECの拡張ルーチン中で用いているものがPOSIX互換のルーチンだったら LINUX上に移植できるだろう。 そうでないなら、自分で回避策を考えねばならない。 とりあえず、USE DFLIB となっている行を全部つぶすべし。 そうして出てきた未定義ルーチン・エラーをひとつひとつ調べるべし。
111 名前:107 mailto:sage [2006/12/14(木) 23:36:52 ] >>110 やはりそうですかー。気が遠くなりそうですが、やってみます。 ありがとうがざいました。
112 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 00:48:58 ] >>111 あぁ、もしLinux上のIntelFortranを使っているなら、DFORTをIFORTに変えて試してみるといい。 今のWin上のIntelfortranではDFORTはIFORTになっている。 Intelが移植用に互換モジュールを用意してくれているかもしれない。 とりあえず一応マニュアルを検索してみるといい。 どっちにしろコマンドライン引数を取るために使っている程度なら、g77でも移植可能だ。
113 名前:102 [2006/12/15(金) 01:26:40 ] このプログラムだとわざわざDOループのdaの値を何回も変えてよりP3の値が3に近い値のda を求めなければいけないのですが、それを実行一回で求めたいのですがどうしたら よいでしょうか?
114 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 01:55:18 ] >>113 見た感じ非線形だから1回は無理で、はさみうち法とかでイターレションするしかナインでないの? というかもし1回で求まるなら、はじめっからdaについての式を逆関数的に定式化してあるのでは?
115 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 10:24:04 ] >>112 なるほど。試してみます。 ありがとうございました!!
116 名前:デフォルトの名無しさん [2006/12/17(日) 09:35:52 ] 下記のプログラムについて、fortran77で行うと実行できないのです>< 何がおかしいですかね>< よければ、教えていただけませんか? dimension ia(100),vw(12),ivw(12),vw2(100) data am,ix,n/1.0 ,0 ,100/ call poiss(am,ix,ia,n,vw,ivw,vw2) write(*,*) (ia(i),i=1,n) stop end subroutine poiss(am,ix,ia,n,vw,ivw,vw2) dimension ia(*),vw(*),ivw(*),vw2(*) real*8 x,y data bm/-1.0/ if (am.ne.bm) then bm=am vw(1)=exp(-am) vw(2)=vw(1)*am m=2.0*am+10.0 do 10 k=2,m-1 vw(k+1)=vw(k)*am/k 10 continue
117 名前:デフォルトの名無しさん [2006/12/17(日) 09:38:41 ] do 30 k=1,m-1 if (vw(k).ne.0.0) then x=vw(k) do 20 j=k+1,m y=x+vw(j) if (y.eq.x) go to 50 x=y vw(j)=x 20 continue go to 40 end if 30 continue k=m 40 j=m 50 do 70 i=j,m vw(i)=1.0 continue mm=j-k+1 ai=mm
118 名前:デフォルトの名無しさん [2006/12/17(日) 09:39:33 ] do 70 i=1,mm af=(i-1)/ai do 60 while(af.gt.vw(k)) k=k+1 60 continue ivw(i)=k 70 continue end if call unfm2(ix,vw2,n) do 90 i=1,n k=vw2(i)*ai+1.0 if(k.eq.mm+1) k=mm j=ivw(k) do 80 while(vw2(i).gt.vw(j)) j=j+1 80 continue ia(i)=j-1 90 continue return end
119 名前:デフォルトの名無しさん [2006/12/17(日) 09:40:24 ] subroutine unfm2(ix,vw2,n) implicit real*8 (a-h,o-z) dimension vw2(*) real*8 aa/32771.d0/,b/1234567891.d0/,x real*8 c/2147483648.d0/,ci/4.6566128730773925d-10/ x=ix do 10 i=1,n x=dmod(aa*x+b,c) vw2(i)=x*ci 10 continue ix=x return end
120 名前:デフォルトの名無しさん [2006/12/17(日) 12:11:06 ] >>116 質問の仕方がなっちょらん。 本文からコンパイルエラーなのか実行時エラーなのかすら読み取れない。 エラーメッセージを出すくらいの知恵も無いのか!www と叱られるよ
121 名前:デフォルトの名無しさん mailto:sage [2006/12/17(日) 14:34:44 ] >>116 一応DEGITAL Visual Fortranでコンパイルしてみた。 do 70のループが原因でコンパイルが通らない。 後ろの70を170にして、その前のcontinueしかなかったところを70にした。 コンパイルはできるが実行中にArray Bounds Exceededが起こる。 プログラムの中身を追いかけるのは面倒だからやらない。
122 名前:デフォルトの名無しさん [2006/12/21(木) 18:06:44 ] 高校の課題なんですが、妹に教えられなくて兄としての威厳がかかっていますw 正直、プログラムはさっぱりなんですが、シスアド初級持っているために安請け合いしてしまったのが間違いですたw 以下の問いなんですがよろしくお願いします。 乱数(0〜1までの範囲)を7個発生させなさい。 その発生させた7個の乱数はそれぞれa,b,c,d,e,f,gと定義する。 このa〜gの中で、最大値と最小値をとるものを選別するプログラムを作りなさい。 というものなんですが、例として何か提示していただけませんか? それを本みながら自分で理解して、妹に説明できるようにしたいんで。