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


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

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



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の中で、最大値と最小値をとるものを選別するプログラムを作りなさい。

というものなんですが、例として何か提示していただけませんか?
それを本みながら自分で理解して、妹に説明できるようにしたいんで。






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

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

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