くだすれFORTRAN(超初心者用)その4
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/01/24(土) 18:32:01もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。
●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。
●前スレ
くだすれFORTRAN(超初心者用)その3
http://pc11.2ch.net/test/read.cgi/tech/1196384126/
くだすれFORTRAN(超初心者用)その2
http://pc11.2ch.net/test/read.cgi/tech/1164121236/
くだすれFORTRAN(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1138063703/
●関連スレ
FORTRAN �W
http://pc11.2ch.net/test/read.cgi/tech/1163319215/
0322296です。
2009/06/17(水) 01:16:14real imax
を宣言文のところに追加です。
FORTRANの慣習ではI〜Nから始まる変数名は整数変数に使うことになっているので、
imaxのままだと動くけどちょっと減点かな?
imax->xmaxにするほうがいいかも。この場合real xmaxは不要。
>>320
ご指摘ありがとうですです。
さっそく試してみますです!
0323デフォルトの名無しさん
2009/06/17(水) 01:21:31うまくいきました! なんとなくfortranがわかりはじめてきました!
ありがとうございます
0324デフォルトの名無しさん
2009/06/17(水) 01:30:040325309
2009/06/17(水) 01:39:38こんな感じでした。時間はreal timeです
Corei7 920、ifort 11.0
real(8)::x(25,25),y(50,50)・・・0m0.799s
real(8)::x(25,25),y(25,25)・・・0m0.255s
Xeon5472、ifort 10.1
real(8)::x(25,25),y(50,50)・・・0m0.922s
real(8)::x(25,25),y(25,25)・・・0m0.280s
Opteron2218、pgf90 6.2
real(8)::x(25,25),y(50,50)・・・0m9.821s
real(8)::x(25,25),y(25,25)・・・0m4.372s
>>300さんの指摘通りってことですかね
Opteronが糞遅いのが気になりますが・・・(;^ω^)
0326296です。
2009/06/17(水) 01:56:29ありがとうございます!!お手数掛けました。
COREi7万歳というところですか。
320様のご指摘も含めていろいろ検討したいのですが、
今晩はこの辺で失礼します。
(いろいろありがとうございました。また明日頑張ります。)
0327デフォルトの名無しさん
2009/06/17(水) 03:05:28opteronを完全に引き離した
0328デフォルトの名無しさん
2009/06/17(水) 03:11:03OpteronというよりPGIのコンパイラのせいのような気がする。
オプションがどうなってるのかわからんし。
最新版は8.0だし。
でもたしかにi7はなかなかいい。
0329309
2009/06/17(水) 13:56:34>OpteronというよりPGIのコンパイラのせいのような気がする。
その通りでしたw
>>325のコンパイルは全てオプション指定なしでして、調べたところ
ifortはデフォルトで-O2が、pgf90は-O1がかかるようです。
-O2を付けた場合↓
real(8)::x(25,25),y(50,50)・・・0m1.306s
real(8)::x(25,25),y(25,25)・・・0m0.784s
0330デフォルトの名無しさん
2009/06/17(水) 20:36:22>1:25とか俺的にはあり得ないw
Cみたいに0から開始ってこと?
Fortranだと1から始めるのが一般的だと思うけど
0331デフォルトの名無しさん
2009/06/17(水) 23:16:26いや、:だけで済ますとか、それすら書かないと言うこと。
0332デフォルトの名無しさん
2009/06/18(木) 18:02:57そういうことね
で、実際どれがいいんだろうか。例えば↓の3つでは
�@ x(1:n) = y(1:n)
�A x(:) = y(:)
�B x = y
自分は�Aが良いと思ってる。�@は冗長だし、�Bは簡潔だけど配列であることが自明じゃないので。
問題はどれが一番速いかなんだけど・・・
↓のサイトでは「並列最適化コンパイラの動作を助け、バグを少なくするため」�@が推奨されてるし
ttp://www.mri-jma.go.jp/Project/mrinpd/coderule.html
でも、これって>>300氏の言ってることとは反対だよね。
0333デフォルトの名無しさん
2009/06/18(木) 19:19:25例えば、配列 data1 から data4 があって、次々にsubroutine に引き渡したい場合ですが、
call hoge(data1)
call hoge(data2)
call hoge(data3)
call hoge(data4)
しないで、
do i=1,4
call hoge( )
end do
の様にまとめる事って加能ですか? もし可能ならやり方教えてください。
0334デフォルトの名無しさん
2009/06/18(木) 19:22:10data1 から data4 は既に7次元配列なので、それらをまとめる事はできないです。
0335デフォルトの名無しさん
2009/06/18(木) 19:22:23普通は配列をdata(n,4)と2次元にして
do i=1,4
call hoge(data(:,i))
enddo
0336デフォルトの名無しさん
2009/06/18(木) 19:25:497次元配列ってすごいなw
Fortranの配列って7が限界だったっけ?それなら無理じゃないかな
あきらめれ
0337デフォルトの名無しさん
2009/06/18(木) 23:01:17新しいコンパイラでは、どれを書いても最適化で同じになるらしいが、
初期のFortran90コンパイラでは、n:nnみたいな指定子が入ると、
テンポラリをとることが多かったみたい。
それは多分一般的には、n:nn:mみたいな不連続の番地をとる可能性があるためだと思う。
>>333
ポインターの配列を、TYPEによって定義しておいて、それに配列を割り付けておいて、
それを引数に置けばいいんじゃないかな?
まぁポインターに割り当てるときに、だらだらとdata1~4を並べないと駄目なので
ゴミの位置が移動するだけだがw
0338337
2009/06/19(金) 01:27:21IMPLICIT NONE
INTEGER, PARAMETER :: nmax = 2
TYPE :: t_billy
INTEGER, POINTER :: mm(:, :, :, :, :, :, :)
END TYPE t_billy
CONTAINS
SUBROUTINE anal(mm)
INTEGER, INTENT(OUT) :: mm(:, :, :, :, :, :, :)
INTEGER :: i1, i2, i3, i4, i5, i6, i7
DO i1 = 1, nmax
DO i2 = 1, nmax
DO i3 = 1, nmax
DO i4 = 1, nmax
DO i5 = 1, nmax
DO i6 = 1, nmax
DO i7 = 1, nmax
mm(i1, i2, i3, i4, i5, i6, i7) = i1 + 10 * (i2 + 10 * (i3 + 10 * (i4 + 10 * (i5 + 10 * (i6 + 10 * i7)))))
END DO
END DO
END DO
END DO
END DO
END DO
END DO
RETURN
END SUBROUTINE anal
END MODULE m_billy
0339337
2009/06/19(金) 01:28:03PROGRAM herrington
USE m_billy
IMPLICIT NONE
INTEGER, TARGET :: data1(nmax, nmax, nmax, nmax, nmax, nmax, nmax), data2(nmax, nmax, nmax, nmax, nmax, nmax, nmax)
INTEGER, TARGET :: data3(nmax, nmax, nmax, nmax, nmax, nmax, nmax), data4(nmax, nmax, nmax, nmax, nmax, nmax, nmax)
TYPE (t_billy) :: kazuya(4)
INTEGER :: i
kazuya(1)%mm => data1
kazuya(2)%mm => data2
kazuya(3)%mm => data3
kazuya(4)%mm => data4
DO i = 1, 4
CALL anal( kazuya(i)%mm )
END DO
print *, data1
STOP
END PROGRAM herrington
0340333
2009/06/19(金) 01:58:08サンクス。でも結構大掛かりだな。。。
real*8 data1(n,n,n,n,n,n,n), data2(n,n,n,n,n,n,n),.......
char*1 cnum
char*5 target
do i = 1, 4
write( cnum, '(i1)' ) i
target = "data" // cnum
call hoge( target )
end do
みたいにできんもんかね。。。 target と data$ は型が違うがな。
0341337
2009/06/19(金) 02:24:4677の掟破りでよければ、
real*8 data1(n,n,n,n,n,n,n), data2(n,n,n,n,n,n,n), data3(n,n,n,n,n,n,n), data4(n,n,n,n,n,n,n)
real*8 tmp(n**7, 4)
equivalence (tmp(1, 1), data1), (tmp(1, 2), data2), (tmp(1, 3), data3), (tmp(1, 4), data4)
do i = 1, 4
call hoge( tmp(i) )
end do
こんな感じでEUIVALENCEでいけるかな?
0342デフォルトの名無しさん
2009/06/19(金) 03:00:32call hoge( tmp(1, i) )
の過ち。
ハルヒ新OP糞杉www
0343デフォルトの名無しさん
2009/06/19(金) 10:22:30本当に7次元いるの? 変数設計を再検討した方がいいんじゃない?
座標3次元+時間で、4次元はざらにあるが。
0344デフォルトの名無しさん
2009/06/19(金) 14:06:33変数設計は、アルゴリズム的な自然さ(人間にとっての見やすさ)と速度の
両方の観点から決めるべき。
0345デフォルトの名無しさん
2009/06/20(土) 20:01:440346デフォルトの名無しさん
2009/06/20(土) 21:51:11n×n 次元行列 M と n 次元ベクトルa の積 b = Ma を計算するプログラムを
作っていたのですが、詰まってしまいました。
どこが、おかしいか教えていただけないでしょうか?
program
integer ::i,k,n
integer,parameter ::limit=5
real ::M(1:limit,1:limit),a(1:limit),b(1:limit)
do
print *,'nの値は?'
read *,n
if ((n<=limit).and.(n>=1)) then
exit
end if
end do
!
print *,'行列Mの成分'
do i=1,n
print *,i,'行目?'
read *,(M(i,k),k=1,n)
end do
print *,'ベクトルaの成分'
do k=1,n
read *,a(k)
end do
0347346
2009/06/20(土) 21:52:41do i=1,n
do k=1,n
b(0)=0
b(k)=b(k)+M(i,k)*a(k)
end do
end do
print *,'b:'
do k=1,n
print *,b(k)
end do
stop
end program
よろしくお願いします
0348346
2009/06/20(土) 21:57:18上のプログラムはfortran90を使っています。
コンパイルする際は、ifort (プログラム名).f90 -o (プログラム名)
としています。
0349デフォルトの名無しさん
2009/06/20(土) 21:59:30全く見ていないが、b(0)=0 がおかしい。
b(k)=0.0 でかつ一個DOLOOPの外。
0350デフォルトの名無しさん
2009/06/21(日) 10:45:18do i=1, n
b(i) = 0
do k=1,n
b(i) = b(i) +M(i, k) * a(k)
end do
end do
直接関係ないけど、Mの行と列を入れかえたほうがいいかも。
0352デフォルトの名無しさん
2009/06/23(火) 11:08:29IMPLICIT NONE
REAL,DIMENSION(100,100)::A !行列A(最大100元まで解ける)
REAL,DIMENSION(100)::B,X !右辺Bと解Xのベクトル
INTEGER::N !元数
INTEGER::I,J,K !制御変数
WRITE(*,*)'このプログラムは連立一次方程式AX=Bのい解Xを求めます'
WRITE(*,*)'AandB.TXTの入力フォーマットは次のようです'
WRITE(*,*)'たとえば,3元の連立方程式の場合'
WRITE(*,*)'3 (元数を与えてください)'
WRITE(*,*)'A11 A12 A13 B1 (データは空白やタブで別けてください)'
WRITE(*,*)'A21 A22 A23 B2 (AIJとBIには実数を与えてください)'
WRITE(*,*)'A31 A32 A33 B3'
WRITE(*,*)'解XはX.TXTに出力されます'
OPEN(1,FILE='AandB.TXT')
READ(1,*) N
DO I=1,N
READ(1,*) (A(I,J),J=1,N),B(I)
END DO
CLOSE(1)
DO I=1,N-1
DO J=I+1,N
DO K=I+1,N
A(J,K)=A(J,K)-A(J,I)*A(I,K)/A(I,I)
END DO
B(J)=B(J)-B(I)*A(J,I)/A(I,I)
END DO
END DO
0353デフォルトの名無しさん
2009/06/23(火) 11:10:04X(I)=B(I)/A(I,I)
DO J=I+1,N
X(I)=X(I)-A(I,J)*X(J)/A(I,I)
END DO
END DO
OPEN(1,FILE='X.TXT')
DO I=1,N
WRITE(1,*) 'X(',I,')=',X(I)
END DO
CLOSE(1)
STOP
END PROGRAM GAUSS_SOLVER
0354デフォルトの名無しさん
2009/06/23(火) 11:20:09どうしたらいいかわかりません。教えてくださると助かります。。
0355デフォルトの名無しさん
2009/06/24(水) 00:59:41ちなみに逆行列を求める時は元の配列に逆行列を
入れる事が出来て効率が良い
0356デフォルトの名無しさん
2009/06/24(水) 22:19:20implicit none
integer,parameter::N=3
double precision ::a(N,N),b(N)
integer ipv,i,j
double precision :: inv_pivot,temp
double precision :: big
integer pivot_row,row(N)
integer flag
do ipv=1,N
!コヌツ酖ヘテオコ・ big=0.0
do i=ipv,N
if(abs(a(ipv,i)) > big) then
big = abs(a(ipv,i))
pivot_row = i
endif
enddo
if(abs(big) < 0.0001) then
write(6,*) "A is singular matrix"
flag = 0
return
endif
0357デフォルトの名無しさん
2009/06/24(水) 22:20:34row(ipv) = pivot_row
!ケヤ、ホニ、・リ、ィ
if(ipv .ne. pivot_row) then
do i=1,N
temp = a(i,ipv)
a(i,ipv) = a(i,pivot_row)
a(i,pivot_row) = temp
enddo
temp = b(ipv)
b(ipv) = b(pivot_row)
b(pivot_row) = temp
endif
! ツミウムタョハャ=1(・ヤ・ワ・テ・ネケヤ、ホス靉)
inv_pivot = 1.0/a(ipv,ipv)
a(ipv,ipv) = 1.0
0358デフォルトの名無しさん
2009/06/24(水) 22:21:30a(j,ipv) = a(j,ipv) * inv_pivot
enddo
b(ipv) = b(ipv) * inv_pivot
! ・ヤ・ワ・テ・ネホ・0(・ヤ・ワ・テ・ネケヤーハウー、ホス靉)
do i=1,N
if(i .ne. ipv) then
temp = a(ipv,i)
a(ipv,i) = 0.0
do j=1,N
a(j,i) = a(j,i) - temp*a(j,ipv)
enddo
b(i) = b(i) - temp*b(ipv)
endif
enddo
0359デフォルトの名無しさん
2009/06/24(水) 22:23:23enddo
! ホホニ、・リ、ィ(オユケヤホ・
do j=N,1,-1
if(j .ne. row(j)) then
do i=1,N
temp = a(j,i)
a(j,i) = a(row(j),i)
a(row(j),i) = temp
enddo
endif
enddo
flag = 1
return
end subroutine
!### TEST MAIN ######
! program MAIN
! implicit none
! integer,parameter::N=3
! double precision :: a(N,N),b(N)
! integer :: flag
0360デフォルトの名無しさん
2009/06/24(水) 22:25:41! a(1,1) = 0.0
! a(2,1) = 1.0
! a(3,1) = 0.0
! a(1,2) = 1.0
! a(2,2) = 0.0
! a(3,2) = 0.0
! a(1,3) = 0.0
! a(2,3) = 0.0
! a(3,3) = 1.0
!
! b(1) = 3.0
! b(2) = 4.0
! b(3) = 5.0
! call gauss_jordan(a,b,flag)
! write(6,*) b(1),b(2),b(3)
! stop
! end program
0361デフォルトの名無しさん
2009/06/24(水) 22:27:01文字化けしてて日本語部分読めないぞ
0362デフォルトの名無しさん
2009/06/24(水) 22:27:210363デフォルトの名無しさん
2009/06/24(水) 22:29:240364デフォルトの名無しさん
2009/06/24(水) 22:33:53求められるという事が
もちろん行列式が零だと潰れてしまうが
0365デフォルトの名無しさん
2009/06/24(水) 22:40:140366デフォルトの名無しさん
2009/06/24(水) 22:42:15http://nyan11.ciao.jp/B/NA/EWSNA/linkANNA.html
のINV1.Cが逆行列を実際にガウスジョルダン消去法で解くプログラムだ
これを参考にFORTRANに移植するとよい
0367デフォルトの名無しさん
2009/06/24(水) 22:45:03まだ完全ではないようだが、ようやくF2003時代がやってきたw
0368デフォルトの名無しさん
2009/06/24(水) 22:49:38http://www.sic.shibaura-it.ac.jp/~i020201/programming_a/lecture_2005/lecture_09.pdf
ここのPDFをじっくり眺めてくれ
さすがに理解できるだろ
0369デフォルトの名無しさん
2009/06/24(水) 22:58:35今年はがんばれ。
質問でうまくおだてて解答ゲットしろw
0370デフォルトの名無しさん
2009/06/24(水) 23:05:27そして線形代数の本を買え
掃き出し法という名前で載っているかもしれないがとにかくそれだ
手で一回3×3程度の行列の逆行列を求めてみればおのずと
プログラムでやっている事も理解できる
0371デフォルトの名無しさん
2009/06/24(水) 23:08:37これとかな
いくらでもネット上にも情報はあるんだけどな
0372デフォルトの名無しさん
2009/06/24(水) 23:25:05ただプログラムできないです・・・ちなみにその去年の人じゃないよ
0373デフォルトの名無しさん
2009/06/24(水) 23:33:18おk。
疑問点を具体的に書いてくれれば、具体的に答えられるが、
漠然と聞かれると、漠然としか答えられない。
まぁがんばれw
0374デフォルトの名無しさん
2009/06/25(木) 04:52:56まあがんばれw
0375デフォルトの名無しさん
2009/06/25(木) 14:49:13というか、質問の仕方というものがあるだろう・・・。
いきなりソースコースばしばし貼りまくってから質問内容を言うのは、分かりにくいというか
それ以前のマナーの問題。せめて要点をまとめろよ。
0376デフォルトの名無しさん
2009/06/25(木) 15:24:15こっちも動くソースをばしばし貼って、それで終わりにして
質問は一切受け付けませんよという態度を取れば
0377デフォルトの名無しさん
2009/06/25(木) 15:52:01・ソース丸ごとではなく、最小限の部位に留める
・変数名を見やすい、もしくは一般的なものに変える
ぐらいはやってくれよと。こんなの常識じゃないかと思うんだが。
0378デフォルトの名無しさん
2009/06/25(木) 20:32:260379デフォルトの名無しさん
2009/06/25(木) 22:27:34ぐだぐだとプログラムを貼り付けてすいませんでした。。
あと、教えてくれた皆さんありがとうございます
0380デフォルトの名無しさん
2009/06/25(木) 23:03:19そうかそれはよかったな
君のした努力は決して無駄にならないと思うよ
これから線形代数・微積分学・複素関数論とかいろんな
数学をプログラミングする機会があると思うが、今した努力は
必ず生きてくる
特にFFTのプログラムなんか芸術的だぞ
バタフライ演算って言ってな
0381デフォルトの名無しさん
2009/06/25(木) 23:07:12ありがとうございます
読んでる内にどんどん楽しくなってきて、一気に今やってるところまで
読み進めれました。
これからもっとがんばります(`・ω・´)
0382デフォルトの名無しさん
2009/06/25(木) 23:20:350383デフォルトの名無しさん
2009/06/25(木) 23:44:58おまえの常識なんか初心者はしったこっちゃねーんだよw
0384デフォルトの名無しさん
2009/06/27(土) 15:04:27IMPLICIT REAL(A-H,O-Z)
REAL T(100),XZ(100,2)
DATA GRAV,V0,ANGLE/9.8,30.0,45.0/
DATA T0,VINT,TMAX/0.0,0.5,7.5/
PI=ATAN(1.0)*4.0
R=ANGLE*PI/180.0
C
DO 10 I=1,50,1
T(I)=REAL(I-1)*VINT
IF(T(I).GT.TMAX)THEN
STOP
END IF
XZ(I,1)=V0*COS(R)*T(I)
XZ(I,2)=-0.5*GRAV*T(I)**2+V0*SIN(R)*T(I)
10 CONTINUE
S=AREA(T,X,Z,T0,TMAX,R,GRAV)
CALL OUTPUT(T,X,Z,S)
STOP
END
0385デフォルトの名無しさん
2009/06/27(土) 15:06:47FUNCTION AREA (T,X,Z,T0,TMAX,R,GRAV)
IMPLICIT REAL(A-H,O-Z)
XMAX=V0*0.5*COS(R)*TMAX
X0=V0*0.5*COS(R)*T0
DO 20 I=1,16
AREA=0.0
DX=(XMAX-X0)/REAL(I)
T=REAL(I-1)*VINT
X1=V0*COS(R)*T
X2=X1+DX
Z1=TAN(R)*X1-0.5*(GRAV/(V0*(COS(R))**2))*X1**2
Z2=TAN(R)*X2-0.5*(GRAV/(V0*(COS(R))**2))*X2**2
AREA=AREA+(Z1+Z2)*DX*0.5
20 CONTINUE
RETURN
END
0386デフォルトの名無しさん
2009/06/27(土) 15:09:07SUBROUTINE OUTPUT(T,X,Z,S)
IMPLICIT REAL(A-H,O-Z)
INTEGER NO(100)
REAL T(100),XZ(100,2)
C
OPEN(16,FILE='menseki2.res')
WRITE(16,'(A)')' TIME CX CZ SPACE'
DO 30 I=1,16
WRITE(16,'(F5.1,2F10.2)') T(I),(XZ(I,J),J=1,2)
WRITE(16,'(F10.2)') S
30 CONTINUE
CLOSE(16,STATUS='KEEP')
RETURN
END
物体の投げあげの時間、X座標とZ座標、台形積分の計算をファイルに出力したいのですが、コンパイルしてもファイルが作られません。
ファイルは時間が1次元配列、X座標とZ座標が2次元配列です。
どう改善すればよいのでしょうか
0387デフォルトの名無しさん
2009/06/27(土) 15:45:54T(I) が TMAX (=7.5) を超えたところでSTOPするようになってるから。
てゆーかぱっと見、変数の使われ方が変だ。
XZ は宣言されてるが X とか Z が突然出てきてるぞ。
IMPLICIT NONEで動くところまで書き直せ。
0388デフォルトの名無しさん
2009/06/27(土) 17:50:39あんた>>352-354か?
ソースを貼るなとは言わんが、まず「○○で困っています。××はどうすればいいでしょうか?ソースは以下の通りです」とか書いてから貼れよ
0389デフォルトの名無しさん
2009/06/27(土) 17:57:120390デフォルトの名無しさん
2009/06/27(土) 22:05:47それ以前に、コンパイルが通らないんだろ。
AREAの引数のTが、スカラー定義なのに配列を渡している。
書き方は古いが、非常にオーソドックスで正当な書き方をしている。
しかし、実際の論理というか中身はかなり??
簡単には直らんw
03911/2
2009/06/27(土) 22:59:57IMPLICIT REAL(A-H,O-Z)
REAL T(100),XZ(100,2)
DATA GRAV,V0,ANGLE/9.8,30.0,45.0/
DATA T0,TINT,TMAX/0.0,0.5,7.5/
PI=ATAN(1.0)*4.0
R=ANGLE*PI/180.0
C
C ! IMAX <= 100 no check www
IMAX = INT((TMAX - T0) / TINT) + 1
DO 10 I=1,IMAX
T(I)=T0 + REAL(I-1)*TINT
XZ(I,1)=V0*COS(R)*T(I)
XZ(I,2)=-0.5*GRAV*T(I)**2+V0*SIN(R)*T(I)
10 CONTINUE
S=AREA(IMAX, XZ)
CALL OUTPUT(IMAX, T,XZ,S)
STOP
END
C
FUNCTION AREA(IMAX, XZ)
IMPLICIT REAL(A-H,O-Z)
REAL XZ(100, 2)
AREA=0.0
DO 20 I=1, IMAX - 1
AREA=AREA+( XZ(I,2)+XZ(I+1,2) )*( XZ(I+1,1)-XZ(I,1) )*0.5
20 CONTINUE
RETURN
END
03922/2
2009/06/27(土) 23:02:17SUBROUTINE OUTPUT(IMAX,T,XZ,S)
IMPLICIT REAL(A-H,O-Z)
INTEGER NO(100)
REAL T(100), XZ(100,2)
C
OPEN(16,FILE='menseki2.res')
WRITE(16,'(A)')' TIME CX CZ SPACE'
DO 30 I=1,IMAX
WRITE(16,'(F5.1,2F10.2)') T(I),(XZ(I,J),J=1,2)
30 CONTINUE
WRITE(16,'(A, F10.2)') 'AREA=', S
CLOSE(16,STATUS='KEEP')
RETURN
END
イマイチよく分からんが、こうかな?
とりあえず放物線のようなものは描く。
しかし、地面をつきぬけていくので全積分面積は負になる。
この辺は適宜修正してくれ。
0393名無し
2009/07/01(水) 17:03:04あるデータを読みこんで画面に表示させるプログラムなのですがうまくいきません。よろしくお願いします。
implicit none
integer MM,K,X,Y
parameter (MM=500,K=100)
integer year(MM),month(MM),day(MM),sl(K,MM)
character cdummy,CFNAME
X=0
CFNAME='/home/maekawa/numeric/kure.txt/'
open(1,file=CFNAME,status='old')
1010 X=X+1
read(1,10,END=1020)cdummy,year(MM),cdummy,month(MM),
@ cdummy,day(MM),(sl(Y,MM),Y=1,24)
10 format(A5,I2,A1,I2,A1,I2,24(a1,I3))
write(6,*)year(MM),month(MM),day(MM),sl(Y,MM)
goto 1010
1020 close(1)
X=X-1
end
0394名無し
2009/07/01(水) 17:03:54コンパイルはできるのですが実行すると
forrtl: Is a directory
forrtl: severe (30): open failure, unit 1, file /
Image PC Routine Line Source
a.out 0809916D Unknown Unknown Unknown
a.out 080986E5 Unknown Unknown Unknown
a.out 0806B758 Unknown Unknown Unknown
a.out 0804C153 Unknown Unknown Unknown
a.out 0804BAB0 Unknown Unknown Unknown
a.out 08052838 Unknown Unknown Unknown
a.out 08049D6C Unknown Unknown Unknown
a.out 08049CC1 Unknown Unknown Unknown
libc.so.6 B7E7A3B0 Unknown Unknown Unknown
a.out 08049C01 Unknown Unknown Unknown
というエラーになります。
質問の仕方も上手ではないので分かりにくい点があるようでしたら申し訳ないのですがその点もご指摘いただけたらと思います。
よろしくお願いします。
0395デフォルトの名無しさん
2009/07/01(水) 17:04:57最後の / が余計なのでは?
CFNAME='/home/maekawa/numeric/kure.txt'
0396名無し
2009/07/01(水) 17:10:56しかし直して見ましたがエラーは直りませんでした。
どうすればよろしいのでしょうか?
0397デフォルトの名無しさん
2009/07/01(水) 17:24:49character cdummy,CFNAME
を
character cdummy,CFNAME*80
にしてみて。
0398名無し
2009/07/01(水) 17:33:100399デフォルトの名無しさん
2009/07/01(水) 17:40:46forrtl: severe (30): open failure, unit 1, file /
このメッセージは、open(1,file=CFNAME,status='old')の行で出力されていると思います。
メッセージの最後が "file /" となっていることから、
CFNAMEに格納されているファイル名が、"/" 一文字だけであると判断できます。
メッセージの"Is a Directory" は、 ファイル名として渡された "/"が、
ディレクトリなのでオープンできないことを意味します。
0400名無し
2009/07/01(水) 17:49:00write(6,*)year(MM),month(MM),day(MM),sl(Y,MM) の「sl(Y,MM)」の部分がずっとゼロで表示されます。
3けたの数字が24個よこに表示されるはずなのですが…
0401デフォルトの名無しさん
2009/07/01(水) 17:56:17を
write(6,*)year(MM),month(MM),day(MM),(sl(Y,MM),Y=1,24)
に変えたらどうなりますか?
0402名無し
2009/07/01(水) 18:11:57自分でも調べてみたのですがそのような数字はデータに見当りませんでした。
作った私がいうのもなんですが配列の型宣言あたりでKやYや使っているのが間違いではないかと思うのですが…ここは大丈夫なのでしょうか?
0403デフォルトの名無しさん
2009/07/01(水) 18:17:02@ cdummy,day(MM),(sl(Y,MM),Y=1,24)
を
@ cdummy,day(MM),(cdummy,sl(Y,MM),Y=1,24)
に変えます。
0404名無し
2009/07/01(水) 18:36:59表示する量が多すぎて最初の方のデータが表示されないのですが、すべて表示するにはどうすればよいでしょうか?
細かいところまで大変お手数お掛けします…本当に助かります。
0405デフォルトの名無しさん
2009/07/01(水) 18:38:52まったくわかりません。
少ない行数でできるらしいのですが、どうか教えてくれませんか?
fortran77を学校では使ってます。
0406デフォルトの名無しさん
2009/07/02(木) 01:35:33まず、ちみが用いようとしている行列式の公式ないしアルゴリズムを指定してくれ。
いろいろやり方はある。
0407デフォルトの名無しさん
2009/07/03(金) 21:13:100408デフォルトの名無しさん
2009/07/03(金) 22:25:02131 'Ashikaga' 65 31 54
101 'Miyoshi' 64 43 62
156 'Chousokabe' 82 58 48
86 'Imagawa' 55 60 72
53 'Houjou' 88 64 73
といったようなデータを読み込んで、
番号 名前 国語 理科 数学 合計 平均
〜何らかの値〜
国語平均 理科平均 数学平均 標準偏差
〜何らかの値〜
といった、表を出力したいのですが
おそらく、最後のprint文がミソだと思うのですがどうしたらいいかわかりません。
以下のプログラムに何を付け加えればいいのでしょうか?
また、どこか間違っている箇所があればご指摘ください。
fortran90を使っています。
0409デフォルトの名無しさん
2009/07/03(金) 22:26:38integer::n,ten(1:3)
real(8)::sum(1:3),sum2(1:3)
real(4)::mean(1:3),sd(1:3),heikin
integer::io
integer::bango,gokei
character*14::kamoku(1:3),namae
!
kamoku(1)='国語'
kamoku(2)='数学'
kamoku(3)='理科'
n=0
do i=1,3
sum(i)=0.0D0
sum2(i)=0.0D0
end do
!
0410デフォルトの名無しさん
2009/07/03(金) 22:29:07read(5,*,iostat=io)bango,namae,(kamoku(i),i=1,3)
if(io/=0)then
exit
end if
n=n+1
do i=1,3
sum(i)=sum(i)+ten(i)
sum2(i)=sum2(i)+ten(i)**2
end do
end do
gokei=ten(1)+ten(2)+ten(3)
heikin=gokei/3.0
do i=1,3
mean(i)=sum(i)/n
sd(i)=sqrt((sum2(i)-(sum(i)**2)/n)/n)
end do
print *,'人数=',n
do i=1,3
print *,'科目',kamoku(i),mean(i),sd(i)
end do
stop
end program ex8_1a
よろしくお願いします。
0411デフォルトの名無しさん
2009/07/03(金) 23:36:09足りない分は、ゴミが入る。
倍精度に定数を与えるときなども注意しなければならない。
0412デフォルトの名無しさん
2009/07/03(金) 23:38:29thx
0413デフォルトの名無しさん
2009/07/04(土) 10:00:10ゴミが入るのは、
real(8) a
a=1.0
みたいに倍精度で定義したのに倍精度で代入しなかった場合だね。
宣言の精度が違う場合には407のいう「足りない桁」の部分は
そもそもメモリ上に存在しない。仮にあるとして説明すると、
足りない桁の直前の桁がランダムに切り上げられたり切り下げられたりする、といったところか。
>>408
三好君はもっと出来る子・・・・。
read文でkamoku(1:3)に点数が入ってるけどそのあと使われてないね。
おそらく、
sum(i) = sum(i)+kamoku(i) に変更。
sum2(i) = .... も同様。
goukei=sum(1)+sum(2)+sum(3) に変更。
配列 ten(1:3) はいらなくね?
0414408
2009/07/04(土) 11:58:35ありがとうございます。プログラムがすっきりしました。
ところで、>>408に書いたように、表みたいに出力したいのですが
以下のプログラムでは読み込んだデータの最後のものが繰り返されてしまいます。
どこがおかしいのでしょうか?
0415デフォルトの名無しさん
2009/07/04(土) 11:59:42integer(8)::n,kamoku(1:3)
real(8)::sum(1:3),sum2(1:3)
real(4)::mean(1:3),sd(1:3),heikin
integer::io
integer::bango,gokei
character*14::namae
!
n=0
do i=1,3
sum(i)=0.0D0
sum2(i)=0.0D0
end do
0416デフォルトの名無しさん
2009/07/04(土) 12:01:37read(5,*,iostat=io)bango,namae,(kamoku(i),i=1,3)
if(io/=0)then
exit
end if
n=n+1
do i=1,3
sum(i)=sum(i)+kamoku(i)
sum2(i)=sum2(i)+kamoku(i)**2
end do
end do
gokei=kamoku(1)+kamoku(2)+kamoku(3)
heikin=gokei/3.0
do i=1,3
mean(i)=sum(i)/n
sd(i)=sqrt((sum2(i)-(sum(i)**2)/n)/n)
end do
print *,'人数=',n
do i=1,n
print *,'名前',namae,'国語',kamoku(1),'数学',kamoku(2),'理科',kamoku(3),'平均',heikin,'合計',gokei
enddo
do i=1,3
print *,'科目平均',mean(i),'標準偏差',sd(i)
enddo
stop
end program
0417デフォルトの名無しさん
2009/07/04(土) 12:29:05データを読み込む時に毎回kamoku(1)〜(3)を上書きしてるから
0418デフォルトの名無しさん
2009/07/04(土) 12:34:33namae, kamoku(1),kamoku(2),kamoku(3),heikin,gokeiの出力は
最初のDOループの内側でやらないとだめでしょ。
0419デフォルトの名無しさん
2009/07/04(土) 12:57:31character*6::kamokumei(1:3)=(/'国語','数学','理科'/)
データを1行読むごとに、すぐに出力してしまう。
gokei=kamoku(1)+kamoku(2)+kamoku(3)
heikin=gokei/3.0
print *,'名前',namae,(kamokumei(i),kamoku(i),i=1,3),'平均',heikin,'合計',gokei
最後に、科目ごとの平均と標準偏差を出力する。
print *,'人数=',n
do i=1,3
mean(i)=sum(i)/n
sd(i)=sqrt((sum2(i)-(sum(i)**2)/n)/n)
print *,kamokumei(i)//'平均',mean(i),'標準偏差',sd(i)
end do
0420414
2009/07/04(土) 15:51:27アドバイス、ありがとうございました。
>>418さん
なるほど、do文の中にprint文を入れるんですね!
おかげさまでうまくいきました。
>>419さん
別にprint文は最後にまとめなくて良いんですね!
細やかなご指摘、ありがとうございました。
みなさん、本当にありがとうございました!
0421デフォルトの名無しさん
2009/07/04(土) 16:43:36FORTRAN使いの方の中にはCとの連携をしている人も
多いと思うのでアドバイス下さい。
FORTRANで作成したサブルーチンを活用し、C++からコール
する形でコードを再利用しようと考えています。
C++からFORTRANを呼び出すのはすぐに出来たのですが、
データの引渡しで困っています。
FORTRAN側ではグローバルな変数を多数(100個以上)宣言
しており、引数としては渡せないのでC++側でも同名の
変数を宣言して共用し、データのアクセスをしようと
目論んでいます。
しかし、FORTRANでexternに相当する宣言の仕方が分からず、
うまく同じ領域を共用できるようになっていません。
具体的にどんなことをすれば良いのかご存知の方がいらっ
しゃいましたら、ぜひご教授願います。
環境は、WindowsでVisualC++とVisual FORTRANを使って
います。
宜しくお願いします。
■ このスレッドは過去ログ倉庫に格納されています