2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2006/11/22(水) 00:00:36
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。

●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ)、エラーメッセージも詳しく書きましょう。


●前スレ
くだすれFORTRAN(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1138063703/

●関連スレ
FORTRAN W
http://pc8.2ch.net/test/read.cgi/tech/1163319215/


2 :デフォルトの名無しさん:2006/11/22(水) 09:55:50
質問募集中age

3 :デフォルトの名無しさん:2006/11/22(水) 16:06:37
関連スレFORTRAN Wの>>64,65,66お願いします。

4 :デフォルトの名無しさん:2006/11/23(木) 03:07:59
>>3
情報が足り無すぎる。
うまく回らないとは、どのようにうまく回らないのだ?

ランタイムエラーが出るのか?
エラーも出ずに実行は終了するが結果がおかしいというのか?

5 :3:2006/11/23(木) 14:25:34
>4
すいません。
エラーも出ずに実行は終了するが結果がおかしいという感じですね。
ディバック機能でしょうか?使ったら3/3のDO 40〜40CONTINUEあたりが
悪いらしいのですが

6 :デフォルトの名無しさん:2006/11/23(木) 16:10:46
>>5
正直その質問はスレの趣旨をはみ出している。
それは結果の意味まで理解していないと駄目なので、ここで聞くより周りの人に聞いたほうがいい。



7 :デフォルトの名無しさん:2006/11/24(金) 12:36:38
f(x)=sinx-sin2x/2+sin3x/3-sin4x/4・・・+(-1)^(n-1)sinnx/n
の値をx=0,0.1,0.2,0.3,0.4,0.5,0.6・・・・0.9,2.0に対して計算し表示するプログラムを作成する
なお,n=8 として計算すること

program report6
implicit none
integer :: n,i
real :: s,a,x

write (*,*) ' n= '
read (*,*) n
do x=0,2.0,0.1
a=(-1)**(n-1)*sin(n*x)
s=0.0
do i=1,n
a=a/i
s=s+a
end do
end do
write (*,*) n,s
stop
end program report6
計算が上手くいきません


8 :デフォルトの名無しさん:2006/11/24(金) 13:32:41
program report6
implicit none
integer :: i,n
real :: s,a,x

write (*,*) ' n= '
read (*,*) n

s=0.0

do x=0.0, 2.1, 0.1

do i=1,n
a=(-1)**(i-1)*sin(i*x)
s=s+a/real(i)
end do
write (*,*) x, s

end do
stop
end program report6

改良しましたが、駄目でした計算結果は

9 :デフォルトの名無しさん:2006/11/24(金) 13:33:35
0. 0.
0.100000001 0.00579053164
0.200000003 0.0474120378
0.300000012 0.164783984
0.400000006 0.380745053
0.5 0.685271919
0.600000024 1.04163218
0.700000048 1.41077828
0.800000072 1.77801299
0.900000095 2.16398764
1.00000012 2.61202049
1.10000014 3.15931892
1.20000017 3.81087661
1.30000019 4.53395605
1.40000021 5.27820969
1.50000024 6.00946999
1.60000026 6.73514318
1.70000029 7.50308847
1.80000031 8.37220001
1.90000033 9.37193203
2.00000024 10.4772806
になりました・・・・

10 :デフォルトの名無しさん:2006/11/24(金) 13:34:08
ちなみに正しい答は
X F
0.00000000 0.00000000
0.10000000 0.00579053
0.20000000 0.04162151
0.30000001 0.11737194
0.40000001 0.21596113
0.50000000 0.30452693
0.60000002 0.35636017
0.70000005 0.36914620
0.80000007 0.36723456
0.90000010 0.38597476
1.00000012 0.44803283
1.10000014 0.54729855
1.20000017 0.65155733
1.30000019 0.72307980
1.40000021 0.74425435
1.50000024 0.73125988
1.60000026 0.72567332
1.70000029 0.76794499
1.80000031 0.86911219
1.90000033 0.99973196
2.00000024 1.10534859

これです

11 :デフォルトの名無しさん:2006/11/24(金) 13:53:55
自己解決しました
program report6
implicit none
integer :: i,n
real :: s,a,x

write (*,*) ' n= '
read (*,*) n

do x=0.0, 2.1, 0.1

s=0.0
do i=1,n
a=(-1)**(i-1)*sin(i*x)/real(i)
s=s+a
end do
write (*,*) x, s

end do
stop
end program report6


12 :デフォルトの名無しさん:2006/11/24(金) 23:17:07
>>11
おめ♪

13 :お願い:2006/11/26(日) 02:00:57
お願いします。
三次元の法線ベクトルを求めたいのですが、上手くいかないのです。
どうすればいいでしょうか??
とりあえず、今僕が作ったのを貼り付けるので検討してください。

C HOUSEN VECTOR
DO K=1,KMX
DO J=2,JMX-1
   DO I=2,IMX-1

U=(Z(I+1,J+1,K)-Z(I,J,K))*(Y(I+1,J,K)-Y(I,J+1,K))-
& (Y(I+1,J+1,K)-Y(I,J,K))*(Z(I+1,J,K)-Z(I,J+1,K))

V=(X(I+1,J+1,K)-X(I,J,K))*(Z(I+1,J,K)-Z(I,J+1,K))-
& (Z(I+1,J+1,K)-Z(I,J,K))*(X(I+1,J,K)-X(I,J+1,K))

W=(Y(I+1,J+1,K)-Y(I,J,K))*(X(I+1,J,K)-X(I,J+1,K))-
& (X(I+1,J+1,K)-X(I,J,K))*(Y(I+1,J,K)-Y(I,J+1,K))

AK(I,J,K)=U/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)

BK(I,J,K)=V/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)

CK(I,J,K)=W/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)


END DO
END DO
END DO


14 :お願い:2006/11/26(日) 02:03:42
DO K=2,KMX-1
DO J=1,JMX
DO I=2,IMX-1
    U=(Z(I+1,J,K+1)-Z(I,J,K))*(Y(I+1,J,K)-Y(I,J,K+1))-
& (Y(I+1,J,K+1)-Y(I,J,K))*(Z(I+1,J,K)-Z(I,J,K+1))
    V=(X(I+1,J,K+1)-X(I,J,K))*(Z(I+1,J,K)-Z(I,J,K+1))-
& (Z(I+1,J,K+1)-Z(I,J,K))*(X(I+1,J,K)-X(I,J,K+1))
    W=(Y(I+1,J,K+1)-Y(I,J,K))*(X(I+1,J,K)-X(I,J,K+1))-
& (X(I+1,J,K+1)-X(I,J,K))*(Y(I+1,J,K)-Y(I,J,K+1))

AJ(I,J,K)=U/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)
      BJ(I,J,K)=V/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)
      CJ(I,J,K)=W/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)
    END DO
END DO
END DO


15 :続き2:2006/11/26(日) 02:04:13
DO K=2,KMX-1
DO J=2,JMX-1
DO I=1,IMX

U=(Z(I,J+1,K+1)-Z(I,J,K))*(Y(I,J+1,K)-Y(I,J,K+1))-
& (Y(I,J+1,K+1)-Y(I,J,K))*(Z(I,J+1,K)-Z(I,J,K+1))
     V=(X(I,J+1,K+1)-X(I,J,K))*(Z(I,J+1,K)-Z(I,J,K+1))-
& (Z(I,J+1,K+1)-Z(I,J,K))*(X(I,J+1,K)-X(I,J,K+1))
     W=(Y(I,J+1,K+1)-Y(I,J,K))*(X(I,J+1,K)-X(I,J,K+1))-
& (X(I,J+1,K+1)-X(I,J,K))*(Y(I,J+1,K)-Y(I,J,K+1))

AI(I,J,K)=U/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)
      BI(I,J,K)=V/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)
      CI(I,J,K)=W/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)

WRITE (*,*) I,J,K,DSQRT(U*U+V*V+W*W)*0.5D0

END DO
END DO
END DO

16 :デフォルトの名無しさん:2006/11/26(日) 02:21:17
反応工学の課題を解くためにシンプソン法を使って積分する必要があるのですが
プログラミングがサッパリわからないのでプログラムが作れません!
プログラム例を貼り付けていただければそれを改変しあとは自分で何とかします
誰か私めに救いの手を差し伸べていただけないでしょうか?
よろしくお願いします!

fortran77でお願いします


17 :デフォルトの名無しさん:2006/11/26(日) 02:25:39
上の人と同じですが、
三次元の法線ベクトルの書き方ってどんなのですか??
正立方体だとどんな風に書けばいいですか?

fortran77でお願いします

18 :デフォルトの名無しさん:2006/11/26(日) 08:32:39
>>16
program integral
implicit none
integer :: N = 36 ! 分割数
integer :: i
real :: x,h,a,b,sum ! x,区間幅、下限、上限、積分値
real,external :: f !被積分関数
real :: PI = 3.1415926
a = 0
b = 1
sum = 0
h = (b-a)/N
x = a
sum = sum + 1.0/3 * f(a)
do i = 1,N-1
x = a + h * i
if(mod(i,2)== 0) then
sum = sum + 2.0/3 * f(x)
else
sum = sum + 4.0/3 * f(x)
end if
end do
sum = sum + 1.0/3 * f(b)
sum = sum * h
print *,sum
end program integral

function f(x)
real :: x
f = x**2
return
end function f

19 :18:2006/11/26(日) 08:33:13
>>16
fの中を変えて、求めたい積分にしてください。

20 :デフォルトの名無しさん:2006/11/27(月) 09:11:39
>18
f90で書いたのは何か意味があるの?

21 :デフォルトの名無しさん:2006/11/27(月) 20:38:19
>>6
すいません、スレチ失礼しました。

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 :デフォルトの名無しさん:2006/11/28(火) 23:52:07
>>21
あやまる必要はないべ

大学なら周りに聞いたほうが早いと思う。

24 :デフォルトの名無しさん:2006/11/28(火) 23:57:35
>>22
その程度のは見出しではセグメンテーションエラーまでは行かない。
もっと大きく、10**30くらいに書き込んで味噌。


配列はみだしを実行時に検出するオプションは、Subscript Check(添え字チェック) subchk
という名前で知られている。

これはマトモなコンパイラなら必ず付いている。しかし、個々のコンパイラによって違うので
マニュアルやヘルプをみて調べるしかない。

これは、実行が極端に遅くなるので普通debugの時だけ使う。

25 :22: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 :デフォルトの名無しさん:2006/11/29(水) 22:23:00
windows上で ifort 使ってるんですが
makefileを自動でサクッと作ってくれるツールないでしょか..
csmkmkっていうよさげなアプリを見つけたんですが挙動が変です.

皆さんは手動で書いてるんでしょうか?


31 :デフォルトの名無しさん:2006/11/30(木) 00:31:46
>>30
インテルのサポート掲示板にも似たような要望が出ていた。
automakeのようなツールを用意することに前向きな姿勢を見せていた。

漏れはモジュールの依存関係が複雑になってから面倒だから統合環境を使っている。


32 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2006/12/01(金) 14:24:37
>>36,37
超能力者を呼べ

39 :デフォルトの名無しさん:2006/12/01(金) 15:11:32
Fortran90です。
mainルーチンでallocateした配列をサブルーチンに渡して、その中で
サイズを変えて再アロケート(deallocate->allocate)することは出来る
のでしょうか?


40 :デフォルトの名無しさん:2006/12/01(金) 15:31:09
randomという数値ルーチンはwindows上で動かすと
問題なく動作しているようなのですが、
unix環境になるとまったく動かなくなります。
どうすればいいでしょうか?
Fortran90です。


41 :デフォルトの名無しさん:2006/12/01(金) 22:49:19
>>40
マニュアル嫁!!

Fortran90固有の乱数サブルーチンはRANDOM_NUMBER()だろ。
RANDOMはベンダー拡張のルーチンだ。

エラーが出たら文法書を嫁! 法律書と同じだ。トラブッたら文法書を開け!

42 :デフォルトの名無しさん:2006/12/01(金) 22:52:53
>>37
どういうエラーが出るか書け。答えようがない。

ざっと見たところプログラムはおかしくない。
コンパイルして動かしてみたが、ちゃんと動いているように見える。
データ数3個でしか試してないがwww


43 :デフォルトの名無しさん:2006/12/01(金) 23:03:09
>>39
確か出来たはず・・・・・ 最悪でもポインターで送ればできる。

コンパイラでやってみたらできた。一応F90厳格オプションを掛けたのでおkだろ。

44 :デフォルトの名無しさん:2006/12/01(金) 23:06:41
>>35
サブルーチンに戻り値を持たせたければ、引数を1こ増やせばいいだろ。

それが嫌ならFUNCTIONを使え。

しかしFORTRANの伝統では、FUNCTIONは返す値が1個で、引数はINTENT(IN)で
副作用なし、と取ることに不文律でなっている。数学のFunctionを連想するので、
これが自然に思える。

Cのような何でもFunctionにするのは愚かな浅知恵だと思う。

45 :デフォルトの名無しさん:2006/12/02(土) 08:01:34
>>41
マニュアルって、どこにあるんでしょうか?

46 :デフォルトの名無しさん: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 :デフォルトの名無しさん: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:2006/12/02(土) 13:01:36
>>43
どうも。
出来るのですか。とするとやり方が間違っていたのですね。
fortran90のポインタは使ったことありませんが調べてみます。


51 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2006/12/02(土) 16:52:25
windows上で使えるフリーのコンパイラはありますか?

55 :デフォルトの名無しさん:2006/12/02(土) 18:02:24
>>52
はじめっからエラーメッセージを書くべし。

それはメインルーチンが複数あるということだから、メインルーチンと勘違いされるような
行があるということだ。

g77についてはよく知らんが、136や299がエラー行を表しているんじゃないか?
その辺の行を見て味噌。
一見空行でもみょうな制御コードが混じっていたりするとこういう事が起こる。

たとえば2バイトの日本語文字とか。
そもそもg77は2バイト文字に対応しているのかね?

>>54
本スレの>>1をみろ!
FORTRAN W
http://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:2006/12/03(日) 09:36:44
>>58

で き ま し た 。

なんか単純常識的なことを知らなかったようで・・
即レスありがとうございました。

60 :デフォルトの名無しさん:2006/12/03(日) 11:15:26
>>59
いいのよ〜♪

61 :デフォルトの名無しさん:2006/12/03(日) 12:12:39
>>57,59

CPad for Salford FTN77もいいけど FTN95付属のPlato3 IDEも使ってやれよー。
日本語が使えなかったりプラトン先生の顔が怖かったりするけど
ちゃんと自由形式で色分けしてくれてデバッガもついとるでよー。

62 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2006/12/03(日) 20:00:45
>>62
解説乙。
本当は出題者が地球半径を与えている筈ですね。
もし地球を楕円体として考えた場合、かなり面倒そうですね。

67 :デフォルトの名無しさん:2006/12/04(月) 02:54:16
>>66
それは強烈に難しいw

68 :39:2006/12/04(月) 10:07:52
>>51
ありがとうございます。出来ました。
subroutineをmoduleで包まないといけないのですね。
最近77から移ってきたのでどうもmoduleの使い方がいまいち
分かりません。

69 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2006/12/05(火) 14:55:10
>>73
エクスプローラで"ftn95.exe"を検索したら?

75 :デフォルトの名無しさん:2006/12/05(火) 22:57:15
>>73
つーかお前の使いたいコンパイラはFTN77かFTN95かどっちなんだ?
FTN77しか入れてないのにftn95.exeを探しても見つかりっこないぞw

76 :デフォルトの名無しさん:2006/12/06(水) 15:06:43
FTN77です

77 :デフォルトの名無しさん:2006/12/06(水) 15:10:42
もぅ、ぉにぃちゃんしっかりしてよ〜

78 :デフォルトの名無しさん:2006/12/06(水) 15:29:18
>>71
なんとかできました

79 :デフォルトの名無しさん:2006/12/06(水) 15:42:22
>>78
どうやったら「なんとかでき」たの?

80 :デフォルトの名無しさん:2006/12/07(木) 13:24:39
FTN77peをダウンロードして,コンパイラのパスに
FTN77pe〜exeと入力してら、できました



81 :デフォルトの名無しさん:2006/12/10(日) 00:22:42
FTN95ってどうよ?


82 :デフォルトの名無しさん: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 :デフォルトの名無しさん: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: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: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:2006/12/10(日) 20:42:38
netnumpacからのソースはプログラム名だけにしました
変数の定義があったりなかったりで非常にみづらいとは思いますがよろしくお願いします。

90 :デフォルトの名無しさん: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

http://softwareforums.intel.com/ISN/Community/en-US/forums/thread/106764.aspx

91 :デフォルトの名無しさん:2006/12/10(日) 21:21:02
>>83
SilverfrostのホームページからForumを見に行くと
ここのAnnouncementsにパッチの情報も載っている。

92 :84:2006/12/10(日) 21:41:42
>>90
英語をよみくだくと /arch:hostのコンパイラオプションをしろ ですよね
やってみましたが変化なしでした。
環境はpen4 2.4BGHz 1024MB 845Echipset winxp sp2なんですがね

93 :デフォルトの名無しさん:2006/12/10(日) 22:03:23
>>92
debugモードでtracebackもonにしてどのソース行でおかしくなってるか調べてみたら?


94 :デフォルトの名無しさん:2006/12/11(月) 01:23:37
>>92
Pentium 4の2.4BGHzだと拡張命令はSSE2までだから、
どこかにSSE3等を使ったコードが紛れ込んでるんですかね。

別のPCでコンパイルしたライブラリをリンクしているのなら
そのライブラリがSSE3命令を使っている可能性も考えられます。

95 :84,92:2006/12/11(月) 03:06:49
>>93
debugモードは使ったことがないけどやってみます
>>94
ライブラリはもってきていないはずなので
SSE3をつかったコードが紛れ込んでるんですかね


96 :デフォルトの名無しさん: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 :デフォルトの名無しさん: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: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 :デフォルトの名無しさん:2006/12/14(木) 00:25:28
最適化オプションを無効にすればSSE/2/3は使われないはずだが。

101 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2006/12/14(木) 10:13:55
>>102
その質問の仕方じゃ 答えようがない。
もう少し何をやっているのか、根本から家

106 :97:2006/12/14(木) 13:14:13
>>98
出来ました。ありがとうございます!

107 :デフォルトの名無しさん:2006/12/14(木) 16:39:03
fortran90です。
いまwindows上で動かしてたプログラムを
Linuxに移そうとしてるんですが

Unable to open MODULE file dflib.mod

とエラーが出てきます。
どうすればいいでしょうか?

108 :デフォルトの名無しさん: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:2006/12/14(木) 23:36:52
>>110
やはりそうですかー。気が遠くなりそうですが、やってみます。
ありがとうがざいました。

112 :デフォルトの名無しさん: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 :デフォルトの名無しさん:2006/12/15(金) 01:55:18
>>113
見た感じ非線形だから1回は無理で、はさみうち法とかでイターレションするしかナインでないの?
というかもし1回で求まるなら、はじめっからdaについての式を逆関数的に定式化してあるのでは?


115 :デフォルトの名無しさん: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 :デフォルトの名無しさん: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の中で、最大値と最小値をとるものを選別するプログラムを作りなさい。

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

123 :デフォルトの名無しさん:2006/12/21(木) 20:01:24
program main
a=rand()
b=rand()
c=rand()
d=rand()
e=rand()
f=rand()
g=rand()
write(6,*) 'MAX ',max(a,b,c,d,e,f,g)
write(6,*) 'MIN ',min(a,b,c,d,e,f,g)
stop
end


124 :122:2006/12/21(木) 21:05:49
>>123

この

write(6,*) 'MAX ',max(a,b,c,d,e,f,g)
write(6,*) 'MIN ',min(a,b,c,d,e,f,g)

の、

maxとminっていうのは最初に宣言しなくても機能するんですか?

125 :デフォルトの名無しさん:2006/12/21(木) 21:34:43
>>124
機能する。 最大値/最小値を返す関数の総称名として規格で規定されている。
RAND() の方は使えない可能性がある。

126 :122:2006/12/21(木) 23:31:03
>>125

ありがとうございました。

127 :デフォルトの名無しさん:2006/12/22(金) 00:35:10
>>122 Fortran90風には国府田。

PROGRAM chinpoko
IMPLICIT NONE
REAL :: a(7)
CALL RANDOM_NUMBER(a)
WRITE(*, *) 'MAX=', MAXVAL(a)
WRITE(*, *) 'MIN=', MINVAL(a)
STOP
END PROGRAM chinpoko

128 :デフォルトの名無しさん:2006/12/23(土) 00:01:40
ちょっと122番と若干かぶる要素があるんだけど、

0から1までの乱数@〜Dまで存在すると仮定する。

問1.乱数をそれぞれ、@*A、@*B、@*C、@*D…C*Dとすべてのパターンの積を求める問題。

問2.問1で得られた結果に100を掛けて、小数点以下を切り捨てる。

問3.問2で得られた全ての結果に対して50より小さい場合残し、そうでない場合は残さない。残すもの、残さないものを分けろ。

問4.問3で得られた結果(残った数値)を以下のような形でまとめるようにせよ。

yi(y1,y2,y3…yn)

問5.問4で得られた結果からその中で最大値を求めよ。


という5つの問題がある。元は一個の問題なんだが、問題文が無駄に長いので俺が解釈して5つに分割してみた。


質問1.問1を俺なりにやってみたんだが、いまいちプログラムがわからないので自力で全て値を@*Aというように入力していったのだが、もっといい方法はないかな?
質問2.50以下のものとそうでないものを分けるとき、使う分は「if」でいいのか?
質問3.yi(y1,y2,y3…yn)とあるけど、これはdimension?使えばいいのか?


わかりにくいけど質問の回答よろしくお願いします。

129 :128:2006/12/23(土) 00:03:53
できたら、問ごとにプログラムの例文作ってくださると理解しやすいのでありがたいです。

130 :デフォルトの名無しさん:2006/12/23(土) 01:12:30
>>129
FORTRAN77かFortran90か指定はあるか?


131 :129:2006/12/23(土) 16:36:07
特にないです。今使ってるのは、visual fortranってやつなんでたぶん新しい方だと思う。

132 :デフォルトの名無しさん:2006/12/23(土) 18:27:45
>>128
PROGRAM q1
IMPLICIT NONE
INTEGER, PARAMETER :: n = 5
INTEGER :: i, j, k
REAL :: x(n), y(n * (n - 1) / 2)
CALL RANDOM_NUMBER(x)
k = 0
DO i = 1, n
DO j = i + 1, n
k = k + 1
y(k) = x(i) * x(j)
END DO
END DO
PRINT *, x
PRINT *
PRINT *, y
STOP
END PROGRAM q1

大文字はFortranに存在する命令。小文字は自分の定義する変数名など。
RANDOM_NUMBER()は0以上1未満の数を返す。
>>132 インデント

133 :デフォルトの名無しさん:2006/12/23(土) 19:13:04
>>128
PROGRAM q2
IMPLICIT NONE
INTEGER, PARAMETER :: n = 5
INTEGER :: i, j, k
REAL :: x(n), w(n * (n - 1) / 2)
REAL, ALLOCATABLE :: y(:)
CALL RANDOM_NUMBER(x)
k = 0
DO i = 1, n
DO j = i + 1, n
k = k + 1
w(k) = x(i) * x(j)
END DO
END DO
w = AINT(w * 100.0)
PRINT *, x
PRINT *
PRINT *, w
STOP
END PROGRAM q2

問2
INT()は切り捨て整数化。AINTは切り捨て整数化を実数で返す。
>>133


134 :デフォルトの名無しさん:2006/12/23(土) 22:44:21
PROGRAM q3
IMPLICIT NONE
INTEGER, PARAMETER :: n = 5
INTEGER :: i, j, k
REAL :: x(n), w(n * (n - 1) / 2), y((n * (n - 1) / 2))
CALL RANDOM_NUMBER(x)
k = 0
DO i = 1, n
DO j = i + 1, n
k = k + 1
w(k) = x(i) * x(j)
END DO
END DO
w = AINT(w * 100.0)
k = 0
DO i = 1, n * (n - 1) / 2
IF (w(i) < 50.0) THEN
k = k + 1
y(k) = w(i)
END IF
END DO
print *, 'no. of less than 50 =', k
PRINT *, y(1:k)
STOP
END PROGRAM q3

135 :デフォルトの名無しさん:2006/12/24(日) 19:37:56
すいません。FORTRANについての質問かどうかわからないのですが…。
2次元配列DDDD(512,512)に物理量、1次元配列X(512),Y(512)に座標値が
格納されている場合で、Text column形式で出力するならば
OPEN(10,FILE='TXTCOL.D')
DO L = 1, 512
DO K = 1, 512
WRITE(10,*) X(K),Y(L),DDDD(K,L)
END DO
END DO
というのは理解しているのですが、Binary Columns形式ですとどのように
書けば良いのでしょうか?
Binary Matrix形式ですと
OPEN(20,FILE='BINMAT.D',ACCESS='direct',FORM='unformatted',recl=8*512*512)
WRITE(20,rec=1) ((DDDD(K,L),K=1,512),L=1,512)
とすれば良いと勝手に思っています(※これだと座標値が入ってません)。
そもそもバイナリ書き出しを全然、理解しておりません。
どなたかお教えいただけないでしょうか?

136 :デフォルトの名無しさん:2006/12/24(日) 20:01:14
>>135
いまいち何をしようとしているのか理解できないが、単にバイナリー形式で配列を
書き出したいなら書式なし形式で出せばいい。
WRITE(10) DDDD
でおk
WRITE(10) X,Y,DDD
なら、Xのすべて、Yのすべて、DDDのすべて
の順で書き出される。

直接アクセス方式は、要素をランダムにアクセスしたいときの形式。
OPEN文のRECLは単一要素の大きさなので512*512はいらない。
あと、処理系によってバイトかワードか単位要素か単位が違うのでマニュアルで
確かめる必要がある。
WRITE文でのRECは位置を指定するので、要素ごとに1づつ増やしてゆかねばならない。

直接アクセス方式はしばらく使ってないから細部を忘れたw
マニュアルを穴があくまでにらんで読んでくれ。

137 :デフォルトの名無しさん:2006/12/28(木) 04:22:27
fortran77を使用して、cos(pi*x)を初期値とした熱方程式の時間発展を計算したいと思います。
範囲は0≦x≦1です。
これで作られたdatファイル('C:\out.dat')が(exp((-(pi)**2)*0.05))*cos(pi*x)
とぴったり重なる様な結果を得たいのですが、ずれてしまいます。
改善点をご指摘いただければ幸いです。よろしくお願いします。
program heat equation
implicit none
integer i,j,nstep,n,ndim
parameter (ndim=5001)
double precision flam,f,h,u,c1,c2,fi,t,tmax,dt
double precision a,b,c
dimension a(ndim),b(ndim),c(ndim),u(ndim)
n=10
dt=0.005d0
tmax=0.05d0
h=1.0d0/float(n)
flam=dt/(h**2.0d0)
c1=1.0d0-2.0d0*flam
c2=flam
do 1 i=1,n-1
a(i)=c2
b(i)=c1
c(i)=c2
1 continue
do 2 i=1,n+1
fi=i-1
u(i)=f(fi*h)
2 continue
OPEN(11,FILE='C:\out.dat')
nstep=0.0

138 :デフォルトの名無しさん:2006/12/28(木) 04:23:45
3 continue
do 4 i=1,n-1
4 u(i)=b(i)*u(i+1)+a(i)*u(i)+c(i)*u(i+2)
do 5 i=n,1,-1
5 u(i+1)=u(i)
a(1)=0.0d0
b(1)=c1
c(1)=2.0d0*c2
a(n+1)=2.0d0*c2
b(n+1)=c1
c(n+1)=0.0d0
nstep=nstep+1.0
t=dt*float(nstep)
do j=1,n+1
if(mod(nstep,5).eq.0)then
write(11,*) j*h-1.0d0/n,u(j)
end if
end do
write(11,*)' '
if(t+dt.lt.tmax+0.10d0*dt) go to 3
end

function f(x)
implicit none
double precision x,f,pi
pi=3.14159265358979323846264338327950288
f=dcos(pi*x)
end


139 :デフォルトの名無しさん:2006/12/28(木) 05:40:21
>>137
ぴったり重なるといっても、どの程度の重なりを求めているのか?
そもそも積分方程式を差分化して数値積分している時点で誤差が溜まってゆくので
相応の誤差はある。見積もり以上の誤差が出ていると言いたいのか?

中身を全く見ていないが、表面だけを見た感じでは
floatは単精度を返すので、DBLEにしてみそとか、
『fi=i-1』も単精度に変換されているだろうといえる。

*昔のコンパイラは倍精度に単精度の数を入れると、あまった桁数にはゴミが入るので
結局数値誤差は単精度と変わりないレベルまで汚染されてしまう。



140 :137:2006/12/28(木) 06:08:19
>>137
ご指摘の点、早速改善させて頂きました。
ありがとうございました。
ずれは、x=1付近ではほとんどありませんがx=0では誤差では済まない程あります。
グラフにすると形もcos関数ではなくなってしまっているのですが、
改善する手立てが見つけられないでいます。

141 :デフォルトの名無しさん:2006/12/28(木) 12:22:48
>>137
なんでFORTRAN77のプログラムを1カラム目から書いてるの?
整形めんどい。

142 :デフォルトの名無しさん:2006/12/28(木) 13:17:56
>>141
s/^/ /

FORTRANネタじゃないけど、まいっか

143 :141:2006/12/28(木) 14:16:16
どうも。
質問者がこれを暗黙に要求するのはどうかと思いまして。

viを起動して137-138をコピーペーストして、
:%s/^/ /
を実行した後数字のラベルの前の空白を手動で2カラム削除しました。
スレ違いで済みませんが、
「7カラム目が数字の行の先頭を2カラム削除する」というのもsedかviで
自動で処理出来るのでしょうか?

144 :デフォルトの名無しさん:2006/12/28(木) 15:03:05
/^......[0-9]/s/^..//

145 :141:2006/12/28(木) 17:33:24
>>144
ありがとうございます。

62 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)