10/05/23 19:59:51
前半は納得した.
後半「読み込んだデータを延々と配列にため込んでいるので、」というのは違うと思う.
どちらも0:MPの配列を使い回してる.
>>107の抜粋
READ(10,*) X(0),Y(0)
do N=1,NW,MP
DO I=1,MP
READ(10,*,err=99) X(I),Y(I)
end do
CALL SUB1(X,Y,G,H,N,MP)
...(略)...
X(0) = X(MP)
Y(0) = Y(MP)
end do
>>132の抜粋
READ(10,*) X(0),Y(0)
DO N = 1, 999999
DO I = 1,MP
READ(10,*,err=99) X(I),Y(I)
END DO
CALL SUB1(X,Y,G,H,MP)
...(略)...
X(0) = X(MP)
Y(0) = Y(MP)
END DO
どちらにしてもサブルーチンの中身が分からないと,X,Yの配列を使い回すのが正しいのかすら推測の域を出ないな.
質問者のレベルから考えると,引数の意味を把握しているか自体が心配.
(このスレ,勉強になるなぁ)
150:142
10/05/23 22:24:25
>>149
おk把握した。
古い方のプログラムと混乱していた。
古い方は、データをため込んでいるので、現在位置をサブルーチンに渡す必要があるから、
Nを渡していると理解していた。
とすると>>107では、Nの値が狂っているなw N=1で固定しなきゃないかな?w
151:141
10/05/24 02:20:17
>>144->>150
今理解するのにちょっと時間が掛かっています(>_<)皆様有り難うございますm(_ _)m
>>146さんの言う通りサブルーチンの中身はスプライン補間になっていました。
SUB1で行列を解いていて、SUB2で間隔1毎の値を計算している?感じです。
引数の意味はまだ良く理解出来ていません、SUB1のNがおかしいのでしょうか?
もう少しいぢくってみます。。。
152:デフォルトの名無しさん
10/05/24 12:47:55
>>151
メール欄に sage と書き込んで、スレが上のほうに上がらないようにした方がいいですよ。
スレが上に上がると、通りすがりの冷かしが面白半分なレスを書き込んでくる確率が上がるので(^^
153:デフォルトの名無しさん
10/06/06 02:50:01
i==2 ? x = 0 : x = 2
みたいなのは無理なんですか?
154:デフォルトの名無しさん
10/06/06 03:15:10
>>153
x=2; IF (i==2) x=0
155:デフォルトの名無しさん
10/06/06 22:26:58
>>154
なるほどサンクスです
でもやっぱ?使えた方が見やすいですね
156:デフォルトの名無しさん
10/06/07 13:55:06
>>153
これって何の言語ですか?
157:デフォルトの名無しさん
10/06/07 18:05:16
>>156
Ruby java
158:デフォルトの名無しさん
10/06/08 00:01:45
>>156
おしっこC言語。3項演算子。
しかし、昔風の書き方の気が・・・
最近はFortranでもCでも、もっとわかりやすく書くように指導されているはずだが・・・
159:デフォルトの名無しさん
10/06/08 02:05:16
配列の仮引数に、スカラーの実変数をsize=1の配列として渡すのって、
どうやればいいの?
下の例だと、rank mismatchでcompile通んないし、
reshape(s,1)もダメって言われた。
一回、別の配列に値をコピーするしかないのかな?
Program test
integer s
s = 1
call inc(1,s)
print *, s
Contains
Subroutine inc(n, a)
implicit none
integer, intent(in) :: n
integer, intent(inout) :: a(n)
integer i
do i = 1,n
a(i) = a(i) + 1
end do
End subroutine inc
End program test
160:デフォルトの名無しさん
10/06/08 03:16:01
>>159
INTENT(IN) 属性なら、
call inc(1,[s]) ないし call inc(1, (/s/))
でいけるが、INTENT(OUT)で値が返る場合はダメだなあ。
161:デフォルトの名無しさん
10/06/08 11:42:43
integer s(1)
とサイズが1を明示すれば通るけど(intel のやつ)・・・それじゃダメなんだよねぇ・・・・
思いつきで(邪道とされるw)equivalence 使って
Program test
integer sdummy(1)
integer s
equivalence(sdummy, s)
s = 1
call inc(1,sdummy)
・・・・・
でも通るけど・・・意味ねぇなw
162:デフォルトの名無しさん
10/06/08 11:44:40
あ、始めて気づいたけど、
integer s(1)
s=1
って通るんだね。コンパイラにも寄るんだろうけど。
163:デフォルトの名無しさん
10/06/08 12:46:57
>>162
たぶんそれ、F90の配列初期化の一括代入になってるだとおもう。
164:デフォルトの名無しさん
10/06/08 12:50:56
ありがとう。
そっか普段77で書いてるから不慣れというかまったく気付かなかった。
たまに90で書くし初期化で使うのに・・・
Intel (たぶん余所のも) のはF77固定書式で書いても、
その事をコンパイルオプションで明示しないと、
F90の機能をちょっとなら混ぜても
文法が干渉しない限りは有効とみなすんだよね。
・・・危ないような気もする。
165:159
10/06/08 19:06:53
>>160
その場合でも結局、一時的な配列に値をコピーしてから渡すって意味になってるんだよ。
>>164
FORTRAN77なら型チェックなんかないし、
配列にスカラー変数を渡すのは正しい操作なんだよね。
内部的にはメモリアドレスを渡してるだけなんだから。
>>161のequivalenceは、今回のprogram文では意味ないけど、
変数sがサブルーチンの仮引数のときに、
無用なコピーを作らず渡せる唯一の方法かもしれない。
166:デフォルトの名無しさん
10/06/08 23:43:04
>>165
素直にテンポラリを間にかますのが一番いいと思うけどさw
EQUIVALENCE ありなら、なんでもアリだなw
POINTERという手はどうだ?
Cとの互換POINTERを使えば、RANKとかのチェックは逃れられる。
Program test
USE, INTRINSIC :: iso_c_binding
IMPLICIT NONE
integer :: s
s = 1
call inc(1, c_loc(s))
Contains
Subroutine inc(n, p)
implicit none
integer, intent(in) :: n
TYPE(C_PTR), intent(in) :: p
integer :: a(n)
integer i
CALL C_F_POINTER(p, a)
do i = 1,n
a(i) = a(i) + 1
end do
End subroutine inc
End program test
167:デフォルトの名無しさん
10/06/09 13:23:31
>>159みたいなことは御法度なんじゃないの?
そのために90以降いろいろと拡張されたわけでしょ?
168:デフォルトの名無しさん
10/06/09 22:00:59
質問です。
LAPACKを使うプログラムなんですが、
Intelのコンパイラだとコンパイル出来るのですが、
gfortranだとSyntax errorが出てしまいます。
こういうことってプログラムに間違いが無くても起こりますか?
169:デフォルトの名無しさん
10/06/09 22:23:27
>>168
起こる。
170:デフォルトの名無しさん
10/06/09 22:49:25
>>167
そうなんだけど、その辺は70年代的Pascalマンセー的な発想で、型チェックギチギチにしたら
確かにエラーは減ったが、窮屈で困ってしまったというのが、80年代以降というか。
実際、Fortran的にはF95でELEMENTAL型の副プログラムが定義出来るようになって、
スカラーで副プログラムを定義しておけばRANKによらずに配列引数が取れるようになっている。
アルゴリズム部分とデータ構造を、もっと独立したユルユルの関係にしたいというか。
171:デフォルトの名無しさん
10/06/09 22:57:12
>>169
そうですかー…
ありがとうございます
172:デフォルトの名無しさん
10/06/10 04:24:29
>>168
その LAPACK はだれがどのコンパイラでコンパイルしたの?
173:デフォルトの名無しさん
10/06/10 13:10:28
>>170
気持ちは分かるなぁ・・・
この辺の善し悪しは開発の規模にもよるんだろうな
174:デフォルトの名無しさん
10/06/10 14:47:46
>>172
LAPACKはLinuxのパッケージ管理ソフトで入れたんですが、
だからたぶんgccでコンパイルされたものだと思います。
175:デフォルトの名無しさん
10/06/14 19:39:21
Fortranerの中には数値計算な業界の人も多いと思うけど、ぶっちゃけ聞きますが飯食えてますか?
ニッチでそこそこやっていけてるのか、それとも潰しのきかない悲しい境遇なのか
176:デフォルトの名無しさん
10/06/14 21:57:26
受験者数と受験者の受験番号と点数が分かっている。
10
17 73
5 64
22 67
6 66
7 90
42 88
9 74
11 79
2 63
13 72
(1行目は受験者数、2行目以降の左は受験番号、右は点数)
以上のデータdata.txtを読み込み、以下に示す結果をresult.txtに出力するようなプログラムを作成せよなお、この試験では59点以下はD、60点以上69点以下はC、70点以上79点以下はB、80点以上はAと判定することにする。
----------------------------------------------
受験者 x人
A x人
B x人
C x人
D x人
平均点 x
標準偏差 x
中央値 x
順位 受験番号 点数 成績
1 25 85 A
2 41 82 A
(以下省略)
----------------------------------------------
・xには数字が入る。
・中央値はMOD関数を用いること。
以上の問題が分かりません。誰かよろしくお願いします。
177:デフォルトの名無しさん
10/06/15 19:18:06
e^x,sinx,logxのテーラー展開を求めるプログラムを教えてもらいたいのですが…
e^xはできたので、これを参考に教えてください!
subroutine expotn (x)
c
real Tn, ans, err
integer n
c
EPS = 1.0e-6
n = 0
Tn = 1.0
ans = Tn
write(6,10) x
10 format('EXP(', f10.5, ') ')
50 if( abs(Tn) .gt. EPS) then
n = n + 1
Tn = Tn * x / n
ans = ans + Tn
err = ans - exp(x)
write(6,11) n, ans, err
11 format(I3,' exp(X) = ',f12.7,' err = ',f15.10)
go to 50
end if
write(6,*) ' Exp( ',x,' )= ',ans
return
end
c
178:デフォルトの名無しさん
10/06/19 00:40:28
MinGWにくっついていたG95コンパイラを用いて、
Fortran77のソースコードをコンパイルしようとすると
以下のようなエラーが出ます。
コンパイルするときのコマンドは以下のとおりです。
>g95 F:\Direct_vs_Ewald.f -freal-loops
問題のソースコードは以下の部分です。
volume=a(1)*(b(2)*c(3)-b(3)*c(2))-a(2)*(b(1)*c(3)-b(3)*c(1))
& +a(3)*(b(1)*c(2)-b(2)*c(1))
この処理の部分で&の下に1が出現します。
Error: Unclassifiable statement at (1)
なぜ、このようなエラーが出るのかわかりませんでした。
()の閉じ忘れは確認したところありませんでした。
&記号が二つの文をひとつにする働きがあることは調べたら出てきましたが、
G95コンパイラにはこのような機能は無いということでしょうか?
179:178
10/06/19 02:02:52
すみません。いったん寝ます
180:デフォルトの名無しさん
10/06/19 02:19:08
>>177
SIN(x) = x - x^3 / 3! + x^5 / 5! - x^7 / 7! +.....
subroutine sinetn(x)
c
real Tn, ans, err
integer n
c
EPS = 1.0e-6
n = 0
Tn = x
ans = Tn
write(6,10) x
10 format('SIN(', f10.5, ') ')
50 if( abs(Tn) .gt. EPS) then
n = n + 1
Tn = - Tn * x**2 / ( (2 * n + 1) * 2 * n )
ans = ans + Tn
err = ans - sin(x)
write(6,11) n, ans, err
11 format(I3,' Sin(X) = ',f12.7,' err = ',f15.10)
go to 50
end if
write(6,*) ' Sin( ',x,' )= ',ans
return
end
c
181:デフォルトの名無しさん
10/06/19 02:24:33
>>177
LOG(1 + x) = x - x^2 / 2 + x^3 / 3 - x^4 / 4 +......
収束半径が小さいので注意。一般の範囲でやりたいなら、LOGの性質を使って範囲を調整汁。
subroutine logtn(x)
c
real Tn, ans, err
integer n
c
EPS = 1.0e-6
n = 1
Tn = x - 1.0
ans = Tn
write(6,10) x
10 format('Log(', f10.5, ') ')
50 if( abs(Tn) .gt. EPS) then
n = n + 1
Tn = - Tn * ( x - 1.0 )
ans = ans + Tn / n
err = ans - log(x)
write(6,11) n, ans, err
11 format(I3,' Log(X) = ',f12.7,' err = ',f15.10)
go to 50
end if
write(6,*) ' Log(',x,' )= ',ans
return
end
c
182:デフォルトの名無しさん
10/06/19 03:07:25
>>178
g95で試してみたが、6カラム目に&がくれば問題なくコンパイルできた。
FORTRAN77の継続行指定は6カラム目に無いと駄目。
ずれると、
Error: Unclassifiable statement at (1)
が出る。
エラー行と数字の1が出ているはずで、それがエラー位置を指しているので、よく見よ。
ちなみに、Fortran90では&は継続行を意味するが、1行目の尻に書く。
詳しくはマニュアルを読んでくれ。
純粋なFORTRAN77では&は規格外の文字なので本来は使っていけない。
(今となっては余り気にしないが。)
183:178
10/06/19 08:06:20
>182
ありがとうございます。
Tabでインデントしていたので気づきませんでした。
半角スペース5個をつけた後、&をつけるようにしたら、そのエラーは消えました。
Warning (121): COMMON block 'coor' is 1600004 bytes at (1) and 160004 bytes at (
2)
というエラーは出ましたが、-wオプションをつけることでなんとかコンパイルはできるようになりました
184:デフォルトの名無しさん
10/06/19 14:10:25
ファイルをdirect accessで読む場合、
open (10,file='hoge.dat',access='direct',recl=4)
read(10,rec=10000) j
みたいに欲しい場所をすぐ読めますが、sequentialで同じようなことは可能でしょうか?
今まではこんな風に不要な部分は破棄していたんですが、効率が悪いと思いまして。
open (10,file='hoge.dat',access='sequential')
do i=1,9999
read(10) jtmp
enddo
read(10) j
185:デフォルトの名無しさん
10/06/19 16:37:37
>>184
末尾だったらOPEN時に指定出来るが、任意位置には行けない。
というか行きようが無い。
直接型はレコード長が全要素で共通だから特定の位置までのバイト数がわかるが、
レコード長が不定長の逐次型では原理的に知り得ない。
ところで読み飛ばすときjtmpに読み込まなくても空READだけでおk。
あと後ろに近いなら、尻から始めてBACKSPACEで逆行する技もある。
それが負荷を減らすかどうか知らんwwwww
186:デフォルトの名無しさん
10/06/19 18:14:42
>>185
やっぱり不可能ですか。
将来ウンTBのデータを扱う時代になったら、データハンドリングはどうなるんでしょうね。
ファイルはダイレクトアクセス、データ構造はレコード長まで完全に把握するというのが
一般的になるんでしょうかね・・・
187:デフォルトの名無しさん
10/06/19 23:07:40
>>176
受験者 10 人
A 2 人
B 3 人
C 4 人
D 1 人
平均点 68.00000
標準偏差 19.24578
中央値 69.50000
順位 受験番号 点数 成績
1 7 90 A
2 42 88 A
3 11 79 B
4 9 74 B
5 13 72 B
6 22 67 C
7 6 66 C
8 5 64 C
9 2 63 C
10 10 17 D
188:1/3
10/06/19 23:08:59
PROGRAM test
PARAMETER(nmax = 999)
INTEGER id(nmax, 2), idistr(4)
CHARACTER grade
OPEN(10, FILE = 'data.txt' , STATUS = 'old' )
OPEN( 9, FILE = 'result.txt', STATUS = 'unknown')
DO 10 i = 1, nmax
READ(10, *, END = 99) id(i, 1), id(i, 2)
10 CONTINUE
STOP 'error: too many data! increase nmax'
99 ndata = i - 1
sum = 0.0
DO 20 i = 1, ndata
sum = sum + id(i, 2)
20 CONTINUE
ave = sum / ndata
sum = 0.0
DO 30 i = 1, ndata
sum = sum + (id(i, 2) - ave)**2
30 CONTINUE
rms = SQRT(sum / ndata)
CALL sort(nmax, ndata, id)
DO 40 i = 1, 4
idistr(i) = 0
40 CONTINUE
189:2/3
10/06/19 23:09:40
DO 50 i = 1, ndata
IF ( grade( id(i, 2) ) .EQ. 'A') idistr(1) = idistr(1) + 1
IF ( grade( id(i, 2) ) .EQ. 'B') idistr(2) = idistr(2) + 1
IF ( grade( id(i, 2) ) .EQ. 'C') idistr(3) = idistr(3) + 1
IF ( grade( id(i, 2) ) .EQ. 'D') idistr(4) = idistr(4) + 1
50 CONTINUE
IF (MOD(ndata, 2) .EQ. 1) THEN
xmean = id(ndata / 2 + 1, 2)
ELSE
xmean = ( id(ndata / 2, 2) + id(ndata / 2 + 1, 2) ) / 2.0
ENDIF
WRITE(9, *) '受験者 ', ndata, '人'
WRITE(9, *) 'A ', idistr(1), '人'
WRITE(9, *) 'B ', idistr(2), '人'
WRITE(9, *) 'C ', idistr(3), '人'
WRITE(9, *) 'D ', idistr(4), '人'
WRITE(9, *) '平均点 ', ave
WRITE(9, *) '標準偏差', rms
WRITE(9, *) '中央値', xmean
WRITE(9, *) '順位 受験番号 点数 成績'
DO i = 1, ndata
WRITE(9, '(i5, 2i11, a5)') i, id(i, 1), id(i, 2), grade(id(i, 2))
END DO
STOP
END
C
190:3/3
10/06/19 23:12:50
SUBROUTINE sort(nmax, n, in)
INTEGER in(nmax, 2)
DO 10 i = 1, n
DO 20 j = 1, n
IF ( in(j, 2) .LT. in(i, 2) ) THEN
itmp1 = in(i, 1)
itmp2 = in(i, 2)
in(i, 1) = in(j, 1)
in(i, 2) = in(j, 2)
in(j, 1) = itmp1
in(j, 2) = itmp2
END IF
20 CONTINUE
10 CONTINUE
RETURN
END
FUNCTION grade(k)
CHARACTER grade
IF (k .GE. 80) THEN
grade = 'A'
ELSE IF (k .GE. 70) THEN
grade = 'B'
ELSE IF (k .GE. 60) THEN
grade = 'C'
ELSE
grade = 'D'
END IF
RETURN
END
考えなしに書いた。なんなん(・∀・)!?
191:デフォルトの名無しさん
10/06/20 02:12:48
残差の二乗和を計算するときの精度と実行速度について悩んでます。
速度よりは精度の方を優先したいのですが、
以下の3つのソースで、最もバランスの良いものはどれでしょう?
xとaはそれぞれ倍精度実数として、
1.
(x-a)**2
2.
(x-a)*(x-a)
3.
(x-a)*(x+a)
よろしくお願いします。
192:デフォルトの名無しさん
10/06/20 06:21:47
指数部が整数の時は同じ掛け算をする(はず)。というわけで精度&実行速度の点で、ぼほ1=2と思ってよろし。
でもたとえば、a=1.0 でデータxを3要素で値が(1e-6,1,1e6)とすると、
第3要素のおかげで他の2項の寄与が消えちゃう。
ので、x^2 + 2ax + a^2
の3項にわけで個別に和をとって最後に足す、という事をすると
2ax の部分が残る分マシ。参照値 a とデータ x の分布次第だね。
x が a と同じオーダーなら気にすることは無い。
3は、 x*x - a*a の方が一般には精度という点で推奨される
同じく参照値 a と比べたときの x の値の分布次第、でもあるが
速度については積の演算はCPU毎にコストが違うので、どちらが良いかは一概にはいえない。
193:デフォルトの名無しさん
10/06/20 17:31:29
>>181
ちょっとまた質問です。
例えば、x-1.0=tと自分で置いたら
Tn = x - 1.0 → Tn = t
write(6,10) x → write(6,10) t
Tn = - Tn * ( x - 1.0 ) ← Tn = - Tn * t
とおいて、より簡単なプログラムにしてもいいですか?
なるべくなら、式が簡単なほうが分かりやすいですし。
194:デフォルトの名無しさん
10/06/20 23:29:03
>>193
それでもよい。
なお、そのテイラー展開の収束半径は、|x|<1のはずなので、その範囲から外れるような値も
計算できるようにしたいなら、LOG(X*10^N)=LOG(X)+N*LOG(10) などの公式を使って
スケールしてやる必要がある。
195:デフォルトの名無しさん
10/06/21 00:13:24
仮にt=1.5の計算をするときには範囲のプログラムとして>>194のようなプログラムを施すということでよろしいのでしょうか?
196:デフォルトの名無しさん
10/06/21 00:16:37
>>195
もう一個スケール処理するサブルーチンを書いて、それがテイラー展開のサブルーチンを呼べばいいんでないかい?
サブルーチンからサブルーチンを呼ぶ。
197:デフォルトの名無しさん
10/06/21 00:30:26
>>196
つまりは例として出ているLOG(X*10^N)=LOG(X)+N*LOG(10)という関数のサブルーチンをlog(x)の範囲のところに呼ぶというわけですか?
198:デフォルトの名無しさん
10/06/23 16:56:50
こんにちは。sinxのテーラーのプログラムを以下のように書きましたが、うまくいきません…
おそらく、何か足りないのでしょうが…教えてください。
プログラム(1/2)
program sinTelor
c
real x
integer which
c
c begin
c EPS = 1.0e-5
write(6,*) 'Taylor Expansion of mathematical function'
write(6,*) ' .Sine function'
read (5,*) which
end
199:デフォルトの名無しさん
10/06/23 16:57:33
プログラム(2/2)
c
subroutine sine (x)
c begin
real Tn, ans, err
integer n, nstop
c
nstop=30
EPS = 1.0e-6
n =1
Tn = x
ans = Tn
write(6,10) x
write(6,*) ' sin(x)= ',sin(x)
10 format('SIN(', f10.5, ') ')
50 if( abs(Tn) .gt. EPS .and. n .lt. nstop) then
n = n + 1
Tn = - Tn * x **2 / ( (2 * n -1) *( 2 * n-2 ))
ans = ans + Tn
err = ans - sin(x)
write(6,11) n, ans, err
11 format(I3,' sin(X) = ',f12.7,' err = ',f15.10)
go to 50
end if
write(6,*) ' sin( ',x,' )= ',ans
return
end
return
end
200:デフォルトの名無しさん
10/06/23 18:28:09
>>198>>199
それは君が馬鹿だからです
201:デフォルトの名無しさん
10/06/24 02:44:17
>>198
まずこの 綴りの間違いを何とかしろ!w
program sinTelor
CALL sine( which )
を書け。サブルーチンを呼び出さずに何をする気だw
兄貴がサブを呼ぶと覚エロ!
202:デフォルトの名無しさん
10/06/24 09:49:15
>兄貴がサブを呼ぶ
解説プリーズ
203:デフォルトの名無しさん
10/06/25 10:09:02
すみません(汗)
FORTRAN77で、Gauss-Jordan法のプログラムを
「READ」「WRITE」「GO TO]「IF]「SUBROUTINE」
「DIMENSION」を使って作りたいんですが・・・
全く分りません。誰か教えてください!
204:デフォルトの名無しさん
10/06/25 23:49:59
>>203
図書館行ってアルゴリズム集から完コピ。マジオススメ
205:デフォルトの名無しさん
10/06/26 00:03:12
>>203
誰か、F77で掃き出し法のサブルーチン作ってテンプレに書いておけよ。
206:デフォルトの名無しさん
10/06/26 00:58:47
>>203
goto は使うな!
207:デフォルトの名無しさん
10/06/26 02:12:04
>>206
それ70年代の話www
208:デフォルトの名無しさん
10/06/26 12:17:22
>>207
え!?
209:デフォルトの名無しさん
10/06/26 14:07:24
>>203
dimensionも使うな!
210:デフォルトの名無しさん
10/06/26 23:12:28
微笑ましいよね。
きっと課題に「xxx」「yyy」を使え、と明示してあるんだろうね。
211:デフォルトの名無しさん
10/06/27 10:00:36
77でgotoを使わないのは、結構苦しいと思うが。
212:デフォルトの名無しさん
10/06/27 11:19:38
全く無しはしんどいよね。最小限にはすべきだけど。
do while
があれば goto を使う機会が激減する・・・と書こうとしたけど、
お題の203さんの課題では do は入ってないね・・。
if goto の組み合わせで何とかしろ、ということなのか。
これはこれでしんどいw
213:デフォルトの名無しさん
10/06/27 12:44:34
>>203
まじめにアドバイス
Fortranがわからないの?Gauss-Jordan法がわからないの?
「知らない数値解法」で「知らない言語」で書け、
という課題が悩ましいのは自分もそうだったのでわかるけど
丸投げだとあまり回答もらえないですよ。
前者なら、どの程度の基礎的なプログラムなら書けるのかを提示して
どの部分を調べたらよいかをアドバイスもらい、
後者なら、ネットで調べたり、その解法のどの部分のプログラム化が?なのかを提示
したほうがいいと思います。
正直、その解法で、何を解きたいのかよくわからないし。
214:デフォルトの名無しさん
10/06/27 14:11:37
>>213
放っておいてあげれば良いと思うよ。
215:デフォルトの名無しさん
10/07/02 13:45:32
A~Zまでの文字のデータを1つ1つファイルにしておき
小文字で入力された文字列をファイルから読み込んで
大文字で表示するにはどのようにすれば良いのでしょうか?
入力された文字をそれぞれのファイルから
読み込む方法がよくわかりません。お願いします。 F90
216:デフォルトの名無しさん
10/07/02 16:33:26
質問があいまい&意味不明...
ファイル内に記述された特定の文字だけを大文字に変換したいのかな?
もしそうなら、Fortranではなくawkやperlを使った方が断然楽だよ。
いちおう、ファイルを読み込むのも、入力文字を読み込むのもREADを使う。
217:デフォルトの名無しさん
10/07/03 00:07:10
>>215
完全イミフ。
日本語でおk
218:デフォルトの名無しさん
10/07/03 00:08:49
表示ができるようになったのですが、ファイルの行数を明示しないと
End Of Line になってしまうのですが、そこで
integer io を宣言して行末を発見して読み込みを止めさせようとしたが
うまくできないのです
なお data614.txt は株価のデータで
価格(整数),年,月,日
にしてあります。
program hyoujisurudake2
implicit none
integer :: i
integer :: io=0
integer :: xprice,xyear,xmonth,xday
!*4を*8にしたりして試していたけどできなくて、こうしたらできた
open(10,file='data614.txt',status='old')
i = 0
do
!だめだ read(10,iostat=io) ,xprice, xyear, xmonth, xday
read(10,*) ,xprice, xyear, xmonth, xday
! if(io <= -1 ) exit
if(i>=3406) exit
i=i+1
!2 print* , i,xprice
print* , i, xprice, xyear, xmonth, xday
end do
close(10)
stop
end
219:デフォルトの名無しさん
10/07/03 00:34:57
多分続けて投稿です
上記の株価データですが本当はこうなっているんです
これ
年/月/日,株価
具体的には
1999/12/31,12345
2000/1/1,23456
2000/1/2,23456
てな具合ですがここで大きな問題がある それは
読み込むときに「,」切りはいいとして
「/」での切り方がわからない・・・
fortran だと何文字をどこそこに格納して とかいうのはとくいですが
パーサーが無い? ので「,」で切ってから「/」で切るという処理は
どうやるのでしょうか
220:デフォルトの名無しさん
10/07/03 01:10:19
>>218
IOSTATがうまくいかないのは、Fortmat書式を抜いているから。
>>219
INDEX関数使えば出来る。
221:デフォルトの名無しさん
10/07/03 01:44:30
>>219
program hyoujisurudake2
implicit none
integer :: i, io, ip1, ip2, ip3
CHARACTER(LEN = 80) :: text
integer :: iprice, iyear, imonth, iday
open(10,file='data614.txt',status='old')
i = 0
do
read(10, '(a)', iostat = io) text
if(io <= -1 ) exit
i=i+1
ip1 = INDEX(text, '/')
ip2 = INDEX(text, '/', BACK = .TRUE.)
ip3 = INDEX(text, ',')
READ(text( 1:ip1 - 1), *) iyear
READ(text(ip1 + 1:ip2 - 1), *) imonth
READ(text(ip2 + 1:ip3 - 1), *) iday
READ(text(ip3 + 1: ), *) iprice
print * , i, iprice, iyear, imonth, iday
end do
close(10)
stop
end
1 12345 1999 12 31
2 23456 2000 1 1
3 23456 2000 1 2
続行するには何かキーを押してください . . .
この入力データで問題となるのは、FORTRANの書式指定無しの場合、スラッシュ『/』は改行を意味する制御文字に
なっている点だ。これを知らないと、何故か入力がなされなくて、地獄へ落ちる!
222:デフォルトの名無しさん
10/07/03 16:10:31
>>203
gotoは1関数に1ラベルなら使ってOKだよ!
ソースが見やすくなるからね
223:デフォルトの名無しさん
10/07/04 00:50:08
>>203
PIVOT処理するのが面倒なのでしてないw
SUBROUTINE GJ(a, b, n) ! Gauss-Jordan method
DIMENSION a(n, n), b(n)
DO 10 irow = 1, n
pivot = a(irow, irow)
IF (pivot .EQ. 0.0) STOP 'pivot is 0.0!'
DO 5 icol = 1, n
a(irow, icol) = a(irow, icol) / pivot
5 CONTINUE
b(irow) = b(irow) / pivot
DO 20 jrow = 1, n
IF (irow .NE. jrow) THEN
q = a(jrow, irow)
DO 30 icol = 1, n
a(jrow, icol) = a(jrow, icol) - q * a(irow, icol)
30 CONTINUE
b(jrow) = b(jrow) - q * b(irow)
END IF
20 CONTINUE
10 CONTINUE
RETURN
END
224:デフォルトの名無しさん
10/07/04 06:34:23
>>219
2000年元旦に市場で何があったんだ・・・w
>>221
/ , を空白に置き換えてから内部入力で、というやりかたもできそうだけど、どうかな?
text(ip1:ip1) = ' '
(略)
READ(text,*) iyear, imonth, iday, iprice
手元にコンパイラがないから・・これで勘弁
225:デフォルトの名無しさん
10/07/04 07:24:53
>>222
俺もそうだよw
224だけど、どうかな?
226:221
10/07/04 14:20:20
>>224
>/ , を空白に置き換えてから内部入力で、というやりかたもできそうだけど、どうかな?
その方がいいな。 ↓コンマは区切り文字になっているから残してもいいのだが、INDEXの代わりにSCAN関数使ってみたかったので消した。
program hyoujisurudake2
implicit none
integer :: i, io, ip1, ip2, ip3
CHARACTER(LEN = 80) :: text
integer :: iprice, iyear, imonth, iday
open(10,file='data614.txt',status='old')
i = 0
do
read(10, '(a)', iostat = io) text
if (io <= -1 ) exit
i = i + 1
CALL cutslash(text)
READ(text, *) iyear, imonth, iday, iprice
print * , i, iprice, iyear, imonth, iday
end do
close(10)
stop
CONTAINS
SUBROUTINE cutslash(text)
CHARACTER(LEN = *), INTENT(IN OUT) :: text
INTEGER :: k
DO
k = SCAN(text, '/,')
IF (k == 0) EXIT
text(k:k) = ' '
END DO
RETURN
END SUBROUTINE cutslash
end program hyoujisurudake2
227:デフォルトの名無しさん
10/07/05 04:43:04
>>226 コンマは区切り文字になっているから残してもいい
本当だ!
いまの今まで知らんかった・・・。 CSV みたいに','が区切り記号で使われてる
ファイルもらったときも御丁寧に置き換えてた・・。
228:デフォルトの名無しさん
10/07/05 18:03:28
write文での制御編集記述子についての質問です。
100e18.10
と指定してファイルに書いていたのですが、
これを
100es18.10e2
と指定すると、一部がアスタリスクになってしまいます。
マニュアルを読むかぎり
100が書式の繰り返し数
18が小数点上の桁、小数点以下の桁、指数を含めたすべての桁数
10が小数点以下の桁数
2が指数の桁数
と理解したのですが、どこか誤りがあるでしょうか。
教えていただけないでしょうか。
229:デフォルトの名無しさん
10/07/05 20:56:57
218 219 です
>220
さん ありがとう
>221
さんコードまで書いてもらってありがとうございます。
うちのPCだとコンパイルがうまくいかないようですが、
それは多分調整のレベルなのでしょう。
ほんとにこんなに早くレスがくるとは思ってもみず 返事が遅くなりました
230:デフォルトの名無しさん
10/07/05 21:01:23
>>224
> 224 名前:デフォルトの名無しさん [sage]: 2010/07/04(日) 06:34:23
> >>219
> 2000年元旦に市場で何があったんだ・・・w
すみません、これ分かりやすくするためのものでして・・・。
「文字の数が変わっちゃうのでこまっていた」ということでした。
> >>221
> / , を空白に置き換えてから内部入力で、というやりかたもできそうだけど、どうかな?
> text(ip1:ip1) = ' '
> (略)
> READ(text,*) iyear, imonth, iday, iprice
> 手元にコンパイラがないから・・これで勘弁
いろいろ工夫が必要なのが分かって着ました。
高級言語の割には今時のRubyとかよりずっとマニュアル車っぽくていいようなかんじも・・
ありがとうございました。
これで本題の数値解析に移れます
231:デフォルトの名無しさん
10/07/05 21:04:51
>>226
> 226 名前:221 [sage]: 2010/07/04(日) 14:20:20
> >>224
> >/ , を空白に置き換えてから内部入力で、というやりかたもできそうだけど、どうかな?
> その方がいいな。 ↓コンマは区切り文字になっているから残してもいいのだが、INDEXの代わりにSCAN関数使ってみたかったので消した。
> program hyoujisurudake2
218 です いろんなやり方があるんですね。
それだけ皆さんは苦労してきたと想像します
232:デフォルトの名無しさん
10/07/05 21:06:49
>>227
> 227 名前:デフォルトの名無しさん [sage]: 2010/07/05(月) 04:43:04
> >>226 コンマは区切り文字になっているから残してもいい
>
> 本当だ!
> いまの今まで知らんかった・・・。 CSV みたいに','が区切り記号で使われてる
> ファイルもらったときも御丁寧に置き換えてた・・。
219 です
すると "," は標準で区切り文字になっているが、それを解除?することは
難しそうですね。きっとできるでしょうが、とっても深い世界
233:デフォルトの名無しさん
10/07/05 22:00:36
はい
234:デフォルトの名無しさん
10/07/05 23:46:10
>>228
Fortranの場合、Formatで指定した桁数からあふれると、アスタリスクが出力される。
今の場合、多分指数部分が溢れているんじゃないかと思う。
E-10とかが出ると、ヤバイ。E2の2には符号の分も含まれる。
>>232
>すると "," は標準で区切り文字になっているが、それを解除?することは
>難しそうですね。きっとできるでしょうが、とっても深い世界
それはFORMATをあらわに指定すれば出来る。
上の例でも、ファイルの1行を丸々文字列として読み込んでいる。
read(10, '(a)', iostat = io) text
この場合は、スラッシュもコンマもただの文字として読み込まれる。
235:デフォルトの名無しさん
10/07/06 00:17:16
読み込まれる。
236:デフォルトの名無しさん
10/07/06 00:22:20
>>235
ひがむなって。百姓・町人みたいだぞ。
237:デフォルトの名無しさん
10/07/06 01:27:54
>>234
ありがとうございます。
>>228
にある18を25などの大きな値にしてみたのですが、それでも一部でアスタリスクになってしまうことがありました。
一行にかける文字数などなにか別の制約があるのでしょうか。
238:デフォルトの名無しさん
10/07/06 02:02:43
>>237
全体の幅を増やせば仮数部は大丈夫になるが、その場合でも指数部の幅は変わらないので、指数部が問題なのでは?
239:デフォルトの名無しさん
10/07/06 20:13:16
>>237
いいよいいよ。
240:デフォルトの名無しさん
10/07/06 23:54:42
部分ピボッティング付きのガウス-ジョルダン法。これで対角要素が0でもダイジョブのはず?
SUBROUTINE GJ(a, b, n) ! Gauss-Jordan method with partial pivoting
DIMENSION a(n, n), b(n), temp(n)
DO 10 idiag = 1, n
CALL pivoting(a, b, n, idiag)
pivot = a(idiag, idiag)
DO 5 icol = 1, n
a(idiag, icol) = a(idiag, icol) / pivot
5 CONTINUE
b(idiag) = b(idiag) / pivot
DO 20 jrow = 1, n
IF (idiag .NE. jrow) THEN
q = a(jrow, idiag)
DO 30 icol = 1, n
a(jrow, icol) = a(jrow, icol) - q * a(idiag, icol)
30 CONTINUE
b(jrow) = b(jrow) - q * b(idiag)
END IF
20 CONTINUE
10 CONTINUE
RETURN
END
241:デフォルトの名無しさん
10/07/06 23:56:18
SUBROUTINE pivoting(a, b, n, k)
DIMENSION a(n, n), b(n)
temp = 0.0
ipiv = k
DO 10 i = k, n
IF (ABS(a(i, k)) .GT. temp) THEN
temp = ABS(a(i, k))
ipiv = i
END IF
10 CONTINUE
DO 20 i = k, n
temp = a(ipiv, i)
a(ipiv, i) = a(k, i)
a(k, i) = temp
20 CONTINUE
temp = b(ipiv)
b(ipiv) = b(k)
b(k) = temp
RETURN
END
メインルーチン:ただしf90機能を使用w
PROGRAM test
PARAMETER( n = 5 )
REAL a0(n, n), a(n, n), b0(n), b(n)
CALL RANDOM_SEED()
CALL RANDOM_NUMBER(a0)
CALL RANDOM_NUMBER(b0)
a = a0
b = b0
CALL GJ(a, b, n)
PRINT *, SQRT( SUM( (MATMUL(a0, b) - b0)**2 ) / N )
END
242:デフォルトの名無しさん
10/07/07 00:40:13
>>238
ありがとうございました。ようやくおっしゃる意味がわかりました。
指数の部分を2桁にしてことが原因ということですね。
納得しました。明日試してみます。
243:デフォルトの名無しさん
10/07/07 03:23:33
>>221
> 221 名前:デフォルトの名無しさん [sage]: 2010/07/03(土) 01:44:30
> >>219
> program hyoujisurudake2
> implicit none
> integer :: i, io, ip1, ip2, ip3
> CHARACTER(LEN = 80) :: text
> integer :: iprice, iyear, imonth, iday
> open(10,file='data614.txt',status='old')
> i = 0
> do
> read(10, '(a)', iostat = io) text
> if(io <= -1 ) exit !★ここです
> i=i+1
> ip1 = INDEX(text, '/')
> 中略
> end do
> close(10)
> stop
> end
-----
> 3 23456 2000 1 2
16行目の if(io <= -1 ) exit !★ここですが「-1」を「0」とか他の値にしても出ないかEnd of File のエラーになるのですが、これはUbuntu910 + gfortran だからでしょうか?
いくつを入れてもうまくいかないです
244:デフォルトの名無しさん
10/07/07 03:42:24
>>243
自己レスです
すみません データーの最後の行に「 / / , 」という空白でータ行が入っていた!
だから最後まで読むけど 終わりを過ぎてしまう というエラーが出ていた おろかしー
245:デフォルトの名無しさん
10/07/08 15:45:51
3元以上、9元までの連立一次方程式を解くプログラムをg77で作成しているんですが、なかなかエラーなしにすんなりとソースプログラムを作ることができません。
ガウス・ジョルダン法を利用して作れと指示があり、一応作ってみたのですが、エラーがいたるところに出て、エラーの内容もわからないため、訂正をお願いしたいです。
なにせFORTRANを使い始めて間もないため、超初心者でもここまでひどいソースは書かないとおもわれるほどのひどいソースかもしれませんが、どうかお願いします。
Cygwin 1.7.5-1 の fortranコンパイラを使用しています。以下、作った未完成ソースプログラムです。
real i,j,N,k,aij,bij
read(5,*) N
DO 100 i=1,N
DO 110 j=1,N
read(5,*) aij
110 continue
100 continue
DO 120 i=1,N
read(5,*) bi
120 continue
call GJ(aij,bi)
130 write(6,*) bi
end
subroutine GJ(aij,bi)
DO 130 k=1,N
akj=akj/akk
if(i=k)
aij=aij
else
aij=aij-akj*ajk
if(i=k)
bk=bk/akk
else
120 bi=bi-bk*aik
DO 130 i=1,N
return
end
246:デフォルトの名無しさん
10/07/08 20:04:08
GJのアルゴリズムは確認していないけど、とりあえず配列の作り方を確認してみ。
配列変数には()が必要。
あと、エラー内容をコピペしてみて。
247:デフォルトの名無しさん
10/07/08 20:54:40
エラーをがんばって見て作りなおしてみましたがエラーがでます。
以下、GJのサブルーチンを抜かしたソースです
implicit none
integer s,t,n,k
real a,b
read(5,*) n
dimension a(n,n),b(n)
DO 100 s=1,n
DO 110 t=1,n
read(5,*) a(s,t)
110 continue
100 continue
DO 120 s=1,n
read(5,*) b(s)
120 continue
連投になって申し訳ないですが、次にエラーのコピペします。
248:デフォルトの名無しさん
10/07/08 21:01:06
>>246
先ほど言い忘れましたが、レスありがとうございます。
全部コピペは入りきらないので最初のエラーかつ一番多い文の一つをコピペしました。
内容は、辞書で調べながらやったのですが、宣言が間違っていると言ってるように思います。
114.for: In program `MAIN__':
114.for:2:
integer s,t,n,k
1
114.for:5: (continued):
dimension a(n,n),b(n)
2
Invalid declaration of or reference to symbol `n' at (2) [initially seen at (1)]
お願いします。
249:デフォルトの名無しさん
10/07/08 22:42:33
> implicit none
> integer s,t,n,k
> real a,b
> read(5,*) n
> dimension a(n,n),b(n)
ここの部分が間違っている。
implicit none
real a(n,n),b(n)
integer s,t,n,k
read(5,*) n
と書くのが正しい配列の定義の仕方。このばあい、属性を意味する"dimension"は書かなくてok
あと注意点だけど、変数定義の途中に実行可能な文を入れてはダメ。
>>247の場合dimensionの前にreadがはいってるけど、readは変数をすべて定義した後にやる。
250:249
10/07/08 22:50:07
あ、間違えた。
配列は定義する時点でサイズが決定していないとだめなんだ。
配列サイズをreadする場合には、動的なメモリの割付けが必要で、allocatable属性を指定しなければならない。
readでnを呼んだ後、allocate文で実際にメモリを割り当てる。
implicit none
integer s,t,n,k
real,allocatable a(:,:),b(:)
read(5,*) n
allocate( a(n,n), b(n) )
251:デフォルトの名無しさん
10/07/09 00:30:22
>>250
多分質問者は、F77でかつDIMENSIONとGOTOを使えと言われている人なので、その辺を察してあげないと・・・
252:古い質問者
10/07/09 09:53:09
>>251さんの言う通りで…質問してるのに申し訳ないです。
allocatableというのは聞いたことがないので、使わずにやれということなんだと思います。
>>248,>>249を参考に最初の5行を訂正してみました。
implicit none
integer s,t,n,k
real a(n,n),b(n)
dimension a(n,n),b(n)
read(5,*) n
エラーは>>248と全く同様に出力されました。
ちなみにa,b,n,iに関して全く同様のエラーが何回も出力されています。
日をまたいでレス遅れてしまって申し訳ないです。
よろしくお願いします。
253:古い質問者
10/07/09 10:25:09
>>252
訂正:a,b,n,iに関して→a,b,iに関して
連投失礼します。
254:デフォルトの名無しさん
10/07/09 11:31:04
宣言部は全て最初にやらないといけないんだよなぁ
コード真ん中のスコープ内でローカルに宣言できたら便利なのにといつも思う
あ、でも次のFortranで実装するって話を聞いたことがあるような
次の次だっけかも
255:デフォルトの名無しさん
10/07/09 15:20:01
allocatableがつかえないと、余分にメモリを食っちゃうね。
まず、配列変数の定義の時点で
real, dimension(100,100) :: a
real, dimension(100) :: b
と、ある程度大きいメモリ容量を割り付けておいて、すべての変数に0を代入して初期化。
a(:,:) = 0.0
b(:) = 0.0
そのあとnやa,bの要素をreadすればokかな?
ここで、nは単なる繰り返し制御のための変数になるけど、まぁ仕方ないか。
256:古い質問者
10/07/09 18:29:02
>>255
real, dimension(100,100) :: a
real, dimension(100) :: b
をそのまま利用すると、Fortran 90 feature at (^) unsupported (対応してない?)といわれ、
realとdimensionを分けてa,bを定義すると
Invalid form for DIMENSION statement at (^) (dimensionの宣言形式が違う?)
とdimensionを定義する箇所にエラー
a(:,:) = 0.0
1 2
Unrecognized statement name at (1) and invalid form for assignment or statement-
function definition at (2)
a,bに関して同様のエラーがでます。。。
もはやcygwinのfortranコンパイラがダメなきがしてきました。。
何度も申し訳ないです。
257:255
10/07/09 18:49:54
いやいや、fortran90形式の方法を教えてしまった。
90形式と77形式を混ぜてコンパイルしても問題にならないことが多いから、
いいかと思ったけどだめだったみたいだね。ごめん
implicit none
integer i, j
integer s,t,n,k
real, dimension(100,100) a
real, dimension(100) b
do i = 1, 100
do j = 1, 100
a(i,j) = 0.0
end do
b(i) = 0.0
end do
read(5,*) n
Fortran77形式で書いてみた。古い書き方は全然使わないから、間違っているかも。
258:デフォルトの名無しさん
10/07/09 20:23:07
変数宣言の仕方って何が推奨なんですか?
URLリンク(www.nag-j.co.jp) を見ると、数に関しては
整数型 integer
実数型 real
倍精度実数型 double precision
複素数型 complex
倍精度複素数型 complex(kind(0d0))
となっていますが、実数型はreal*4とすべしと言ってるサイトもありますね。
double precisionなんて長ったらしいし、*で済むのならそれがスマートだと
思うんですが、どうですか?
259:デフォルトの名無しさん
10/07/10 00:09:34
>>258
そのページのすぐ下に書いてあるが、REAL*4とかREAK*8とかは、FORTRANの規格の規定にはない書き方。
ただし、事実上通用する書き方に成っている。
だから規格に厳格に乗っ取りたいという流派なら、使わないという選択になる。
またFortran90以降では、REAL(KIND=4)や省略形REAL(4)などがあるので、そちらを使うのがよりスマート。
そういう文脈を踏まえて、77時代の慣用的な書きかたをしようというなら、REAL*8とかで書くのが主流派だと思う。
>>257
77にはIMPLICIT NONEは無い。
またreal, dimension(100,100) a この書き方もない。
REAL A
DIMENSION A(100,100)
と分けて書かねばならんはず。
260:名無しさん@そうだ選挙に行こう
10/07/10 14:40:48
*の数字は変数が占めるトータルのバイト長らしいから、複素数の場合は注意だな
やはりkind指定が無難かな
以下、intel fortran 11.0
complex :: c1
complex*8 :: c2
complex(4) :: c3
complex(kind=4) :: c4
complex(kind(0.0)) :: c5
print *, c1
print *, c2
print *, c3
print *, c4
print *, c5
end
<出力>
(0.0000000E+00,0.0000000E+00)
(0.0000000E+00,0.0000000E+00)
(0.0000000E+00,0.0000000E+00)
(0.0000000E+00,0.0000000E+00)
(0.0000000E+00,0.0000000E+00)
261:名無しさん@そうだ選挙に行こう
10/07/10 18:14:54
Fortranの命名規約って何か習慣的なものはあるんでしょうか?
例えばJavaなどではキャメルケースが一般的ですが
262:名無しさん@そうだ選挙に行こう
10/07/10 23:04:40
ない
263:名無しさん@そうだ選挙に行こう
10/07/11 02:16:41
>>261
キャメルケースってボーランド記法のことか。
Fortranは昔は大文字しか使えなかったし、今も大文字小文字の区別がないので、そういう工夫はあまりしない。
また1行の長さに制限があるので、余り冗長な名前も使わない。
77時代までは極めて明快だった。
暗黙の型は厳守。型を守ってないものは、文法的に許されてもエラーの元だし、社会的に誰からも相手にされないので。
名前は6文字までなので(IBMがこだわったので)単語の母音を抜いた子音並べが基本。
この手の命名法は、LAPACKなどライブラリに厳然と残っているので、知っておくと便利。
頭文字がAとかRは単精度実数、Dは倍精度実数、Cは単精度複素数、Zは倍精度複素数(本来は規格外だが)。
F90になってから混迷を深めているが、いちいち変数の型を調べるのに、宣言部分を見る気もしないので、
捨て変数に関してはIMPLICIT NONEを掛けても暗黙型の頭文字をつかっているのでは。
LOOP変数のi,jとか。
264:名無しさん@そうだ選挙に行こう
10/07/11 15:21:40
変数の命名規則は、開発の仕方や規模によるところが多いんじゃないかな。
他人のコードを頻繁に見るような場合は、パッと見で分かるようなのにしてくれないと死ぬ・・・。
265:デフォルトの名無しさん
10/07/12 18:20:39
構造型(体?)を使ってみたいのですが、良い参考書等あるでしょうか?
FORTRANは本自体少ない上、FORTRAN90以降の新機能について
詳しく言及している本は少ない気がしますが。
266:デフォルトの名無しさん
10/07/13 02:40:12
>>265
ない!手持ちの本で十分だ。がんばれ。
267:デフォルトの名無しさん
10/07/13 06:42:16
>>266
その手持ちの本に構造体書いてりゃな。
書名は何?
268:デフォルトの名無しさん
10/07/13 11:04:54
>>265
(構造体は必要)ない!手持ちの本で十分だ。がんばれ。
269:デフォルトの名無しさん
10/07/13 23:22:36
>>267
F90の本で構造体が書いてないものなんかあるのか?
戸川隼人のしょぼいザ・Fortran90/95にも1章費やして書いてあるぞ。
と思ったら、パラパラと見た感じ牛島省の本には無いな。京大土建屋の英単語つづりデタラメ本だから仕方ないかw
同じ京大の富田の本には2ページくらいおざなりに書いてある。
しかし、富田本は昔の大型計算センターのテキストみたいな分かりにくさの本だな。
イラストとしてキャラクター・グラフィックスで書いた3Dの山とリサージュ図形があれば完璧だったろう。
薄くていいが定価で買う気はしない。京都の古本屋で百円で売ってそう。
構造体で注意すべきなのは、Fortran90ではALLOCATABLE属性は使えなかったので、POINTERを使うしかなかったが
Fortran95ではALLOCATABLE属性のメンバーを持てることくらいか。
>>268
マジレスするとwww
Fortran2003でのオブジェクト指向は、構造体の中に副プログラムをCONTAINする形になるので、避けられない。
270:デフォルトの名無しさん
10/07/14 01:01:58
使ったことないからよくわからないけど、Fortran の構造型の命名って制限ある?
ピリオドで区切るから・・ .EQ. とかの比較演算子とかぶりそうな気がふとしたので。
271:デフォルトの名無しさん
10/07/14 02:49:45
>>270
区切りは%だぜ。
272:デフォルトの名無しさん
10/07/14 10:54:03
. % のどちらでも実質、両方正しいよ。
. 区切りはDECのだった気がするけど、まあ実質業界標準。
273:デフォルトの名無しさん
10/07/14 11:55:17
>>272
ねーよw
Fortran90以降の構造体とDECの構造体は別物だぞ。
. が使えるわけがない。
274:デフォルトの名無しさん
10/07/14 13:16:16
>>269
>構造体で注意すべきなのは、Fortran90ではALLOCATABLE属性は使えなかったので、
Fortran90では構造体の中のメンバはALLOCATABLE属性に出来ないって意味だよね?
それともALLOCATABLE自体がFortran95以降なんだっけ?
275:デフォルトの名無しさん
10/07/14 14:16:28
F90でも普通にallocatable出来る
276:デフォルトの名無しさん
10/07/15 00:49:50
>>274
F90では構造体のメンバーがALLOCATABLE属性を取れなかった。
これが大変不評でF95で取れるようになった。
277:デフォルトの名無しさん
10/07/15 20:25:16
なったね
278:デフォルトの名無しさん
10/07/16 00:53:55
たね
279:デフォルトの名無しさん
10/07/16 02:53:03
ね
280:デフォルトの名無しさん
10/07/19 15:06:54
すみません
初歩的な質問だと思うのですが、
以下のように、行を一つのベクトルと考え、自分の入力したベクトル間の距離を出そうとしたのですが、上手くいきません
どこがいけないのかアドバイスお願いします
最初に定義している文字が多いのは気にしないでください
program aaa
implicit none
integer :: i,j,m,k,o,p,q,zenntai
real :: c1x,c1y,c2x,c2y
integer,parameter :: n=5
real,dimension (n,2) :: a
real,dimension (n) :: b,c
do m=1,n
write(*,*)'a='
read(*,*) (a(m,k),k=1,2)
end do
write(*,*) 'a='
do i=1,n
write(*,'(1x,2F7.3)') (a(i,j),j=1,2)
end do
c1x=a(1,1)
c1y=a(1,2)
c2x=a(2,1)
c2y=a(2,2)
つづく
281:デフォルトの名無しさん
10/07/19 15:07:36
つづき
do o=1,n
call kyori(b(o),c1x,c1y,a(o,1),a(o,2))
write(*,*) b(o)
end do
do p=1,n
call kyori(c(p),c2x,c2y,a(p,1),a(p,2))
write(*,*) c(p)
end do
stop
contains
subroutine kyori(d,s,t,u,v)
implicit none
real,intent(in) :: s,t
real,intent(in),dimension(n) :: u,v
real,intent(out),dimension(n) :: d
d=((abs(s-u))**2.0)+((abs(t-v))**2.0)
return
end subroutine kyori
end program aaa
282:デフォルトの名無しさん
10/07/19 15:46:51
>>280
どう上手くいかんのかもう少し分かりやすく言えよと
subroutineにしないでやっても同じなわけ?
283:デフォルトの名無しさん
10/07/19 16:06:25
すみません
サブルーチンにしないでやっても結果は同じでした。
a=1 2
1 3
1 4
1 5
1 6
とすると、とりあえずb(o)だけ書きます
b(o)=0.
1.
1.
394825
2.4050422E+22
c(p)もb(o)と同様にpが上がると凄い勢いでその値が増えていきました
284:デフォルトの名無しさん
10/07/21 03:31:59
>>283
2点ばかり考えられることを。
1。
入力がフォーマット付きなので、空白を区切りとして数値を二つ与えることはできない。
コンマでしきれば大丈夫だったか?
a=1 2 =>1,2 もしくは 1 2
2。
サブルーチン中のここがおかしい。
real,intent(in),dimension(n) :: u,v
real,intent(out),dimension(n) :: d
スカラーを渡しているのだろうから
real,intent(in) :: u,v
real,intent(out) :: d
のはず。
285:デフォルトの名無しさん
10/07/21 20:12:07
sqrtはなくてもいいの?
286:デフォルトの名無しさん
10/07/22 00:42:56
>>285
そういう内容に踏み込む場合、REALなんだから二乗する前にABSはとらなくてもいいはずとか、
突っ込みどころいっぱいありすぎ。
そもそもループ変数にoとかpとか使ってる時点で、こいつラリッてるのか、酔っ払ってんのか的気持ちw
287:デフォルトの名無しさん
10/08/25 14:55:56
質問です。
数値計算をしようとfortranでプログラムを書いて、実行してみたんですが
古いPen4のPCだとCPU使用率が100%までいくのに、新しいi7のPCだとCPU使用率が13%以上になりません。
とりあえず、元のプログラムを6個のプログラムに分けて実行してますがいい方法とは思えません・・
どうしたら1つのプログラムでCPUを有効に使えるようになりますか?
コンパイラはg95です
288:デフォルトの名無しさん
10/08/25 14:57:19
っ OpenMP & gfortran
289:デフォルトの名無しさん
10/08/25 16:03:06
>>288
ありがとうございます。やってみます
290:デフォルトの名無しさん
10/09/08 15:28:57
はじめまして。
少々悩んでいることがありまして質問させて頂きます。
行列積のプログラミングを組もうと思っているのですが、
入力部分に数字のみならず記号も含まれている場合どうすればよいかわかりません。
色々試してはみたのですが、結局無理でした。
例えば、
1 2
3 4
という係数行列と
a
b
というベクトルをかけて
a+2*b
3*a+4*b
というふうに出力したいと思っています。
どなたか心ある方、ほんの少しのアドバイスでもよろしいのでお願いいたします。
291:デフォルトの名無しさん
10/09/08 16:59:43
関数とサブルーチンってどっちが有利?
たとえば
function hoge(a,b) result(c)
c=a+b
return
end function
subroutine hoge(a,b,c)
c=a+b
return
end subroutine
と書いた場合、どっちがメモリ的に
あるいはスピード的に
あるいは可読性的に有利?
292:デフォルトの名無しさん
10/09/08 17:01:43
>>290
fortranに文字計算させるの?
数値計算ってそういう物じゃないと思うんだけどなあ
293:デフォルトの名無しさん
10/09/09 02:04:02
subroutine matvec(inmat,invec,outvec)
implicit none
intent(in):: inmat, invec
intent(out):: outvec
real mat(2,2), invec(2), outvec(2)
inteter i,j
outvec(1) = mat(1,1)*invec(1)+mat(2,1)*invec(2)
outvec(2) = mat(1,2)*invec(1)+mat(2,2)*invec(2)
return
end subroutine
・・・・なにか質問の答えとはずれてるな・・・w
294:デフォルトの名無しさん
10/09/09 02:06:21
function と subroutine の違いって戻り値があるか無いかじゃないのか?
295:デフォルトの名無しさん
10/09/09 14:58:40
>>294
そうなんだけど結果的には同じように扱えるよね?
上の例で言うと変数cがそれになると思うんだけど
可読性という点から見ると関数は、Fortranだと
配列と区別しにくいから少し解りづらいかも
296:デフォルトの名無しさん
10/09/11 18:56:47
質問です。
現在、ファイル名が
11016.csv
11151.csv
:
24141.csv
というものが、97個ほどあります。そのファイルを順にOPENして読み込み、作業したいのですが、下のようにopen文を書いたのですが、初めの11016の地点が、何度も出力されてしまいます。連番でないファイルの場合、
この書き方は適当ではないのでしょうか?それとも全体のプログラムを示していないですが、enddoを書く場所が間違っているなどのミスでしょうか?
また、read文なのですが、色々詮索した結果、このように行変更してしまいますと、2行以降の変数は読めていませんでした。ファイル内のデータを削除し、プログラムの変数を減らして一行に収めると、正しく出力されました。
なぜなのでしょうか?どうかアドバイスください。もし、より全体のプログラム内容だったり、読み込んでいるファイル内の形式が必要でしたら、
再度載せます。
----------------------------------------------------------------------
INTEGER :: year, mon, day, data,sum, no,id,pre,wind,winddirection,hightemplowtemp,maxrain,maxwind,code,tmpsunlight
CHARACTER(10) :: name
REAL :: lon, lat
CHARACTER*5 sssss
do ispot = 11016,24141
write(sssss,"(i5)") ispot
open(50, file=''//sssss//'.csv', status='old',iostat=io)
if (io < 0) cycle
do i = 1,12000
read(50,*,iostat=io) year,mon,day,id,lon,lat,code,&
name,pre,wind,winddirection,temp,hightemp,lowtemp,&
tmpsunlight,maxrain,maxwind
----------------------------------------------------------------------
297:デフォルトの名無しさん
10/09/12 03:25:54
マルチポスト?...ではないか。向こうの質問内容は意味不明だ。
URLリンク(oshiete1.watch.impress.co.jp)
cycle文を使う場所が間違っている気がする。
あとは、装置番号を50ではなくispotにして、readしたあとはclose(ispot)するとかかな。
この手のFortranのIOは面倒で、真面目に考える気になれない...
298:デフォルトの名無しさん
10/09/12 05:54:09
うん、変だよね・・・Cycle は使わんでもよさそうだし・・。
いろいろ副作用やら曖昧さをさけた流儀にすると・・
character*9 sssss
logical lexist
do ispot=11016,24141
write(sssss,'(i5.5,''.csv'')') ispot
inquire(file=sssss,exist=lexist)
if (lexist) then
write(*,*) 'now handling a file : ', sssss
open(unit=50,file=sssss,status='old')
do ..
read(50,*) ....
enddo
close(50)
endif
enddo
かな・・・。コンパイラ無しな状況で書いてるから自信はないね。
299:デフォルトの名無しさん
10/09/13 22:30:27
教えていただいたOPENファイルの書き方でうまくいきました!
すごいです。こんな方法あるんですね。 勉強になります。
助かりました。ありがとうございました。
300:デフォルトの名無しさん
10/09/14 10:57:09
えがったえがった
301:デフォルトの名無しさん
10/09/15 17:22:00
2GBを超えるunformattedなファイルを read(num) (itmp(i),i=1,n) という感じで(nは既知)
読むとエラーになったんですが、 readにオプション iostat=io を加えると大丈夫でした。
2GB以上はiostatが必要ということでしょうか?
なお、エラーメッセージは以下の具合です。
Intel Fortran・・・「input statement requires too much data」
PGI Fortran・・・「attempt to read/write past end of record」
302:デフォルトの名無しさん
10/09/15 19:22:28
iostat無しだとエラーを受けて終了してしまい、
iostatありだとエラーをエラーコードとしてioに保存してそのまま読み込みつづけただけじゃないの?
303:301
10/09/15 20:35:31
>>302
よく考えたら2GB以上だと仕様が変わるなんてあるわけないですよね。
ファイルにはn個データが入っているはずなんですが、もしかしたらデータがおかしいのかもしれません。
もう一度調べてみます。ありがとうございました。
304:デフォルトの名無しさん
10/09/16 00:56:05
>>301
書式無し、でサイズ既知、なら・・・
integer itmp(n)
で宣言した後、
read(num) itmp
と、添字なし表現で読めない?
305:301
10/09/16 01:37:56
>>304
read(num) itmp
read(num) itmp(1:n)
などと試しましたが同じでした。やはりデータが疑わしいようです。
306:デフォルトの名無しさん
10/09/16 03:51:31
・・あと思いつくのは・・
無書式だとメモリ上の0・1の値をそのままファイルにぶち込むだけ(な事がほとんど)だから
CPU や OS や コンパイラがファイルを生成したものと違う組み合わせで読み込むと
失敗することがあるよ。
人からもらったデータなら、元にお願いしてプレーンテキストにしてらうのが吉。
情報量は変わらないのだから適当な圧縮をかけるとファイルサイズはそう変わらないはずだ。
307:304=306
10/09/16 03:53:19
Endian とか Padding とかをキーワードにして、いろいろ試してね
308:デフォルトの名無しさん
10/09/18 00:15:55
文字列として読み込んでみるとか、
何かの値で初期化して
IOSTATつきで読みこんでどこでエラーが出ているか確認し、
そのデータ部をバイナリエディタで見てみるとか
309:デフォルトの名無しさん
10/09/18 00:33:04
プレーンってformattedで出すってことだよね
バイナリより数倍大きくなるよね
そういえばunfortmattedとバイナリって同じ意味なの?
310:デフォルトの名無しさん
10/09/18 00:53:53
>>309
今時2ギガが10ギガになったくらいで騒ぐこともあるまい・・。
とりまわしが面倒なら分割すりゃいいんだし。
311:デフォルトの名無しさん
10/09/18 00:55:10
binary つかったことない・・
Unformatted は306みたいにメモリ上のならびを
そのままぶち込む・・と思ってたけど違うのかな?
312:デフォルトの名無しさん
10/09/18 18:54:43
>>310
最近の数値計算じゃテラのオーダーっすよ。
つーかこのスレにいる奴らもそっち系の人ばっかでしょ?
313:デフォルトの名無しさん
10/09/19 10:09:31
>>311
unformattedってデータとデータの間に区切りとしてなぜか8byte(?)ぐらい
埋め込まなかったっけ??asciiで書き出すよりファイル容量でかくなって
ビビったような
314:デフォルトの名無しさん
10/09/19 10:58:46
Padding はありそう・・・とうわけでチェック!
単精度・倍精度・文字列・整数・理論、を100要素のものを無書式で書き落とすと
サイズは(バイトで)、
800,400,100,400,400+8(intel fortran)または+16(gfortran)
だった。OSはLinux、こまかいDistriは知らんw
おまけがつくのはそれぞれのコンパイラの仕様かな?
ともあれ、整数・実数・文字列はなんとなく想像のうちだけど、論理(logical)は
本来1ビットだけど、8ビット単位にPadding しているようだ(まあ、その方がメモリ内での
とりまわしが効率的なんだろうね)・・・即興の実験終わり。
313さんのはどの種類の変数だったの?
315:デフォルトの名無しさん
10/09/19 11:03:09
>本来1ビットだけど、8ビット単位にPadding しているようだ
ああ、おお間違い。4バイトね。
中身をみたら当然だけど0パディングばかりでスカスカだった。
316:デフォルトの名無しさん
10/09/19 11:09:15
ああ、もしかすると、301 さんのは
データを書き出したコードのコンパイラと読み込みのが別、とか・・かな。
CPU OS コンパイラ の3つ次第でどうにでも変わるのが無書式だし。
単純に同じシステム内で処理をする分には(コーディングも実行速度も)
一番速いけど、他人とのデータのやりとりではやっぱり危険だね。
自分はなるべくプレーンなテキストでやりとりするけど・・・みんなはどうしているんだろう?
HDF とかなの?
317:デフォルトの名無しさん
10/09/19 15:09:39
>>313
例えば、1行の read 文で書き出すデータの総バイト数を表す数字を
データの両側に付けるのは仕様だった筈。ここが C と違う。
integer a
real*8 b
read(unit=9)a,b
とすると、12バイトのデータ(aとb)の両側に余計にデータがつく。
open 文でエンディアンの指定も出来たように記憶しているが、最後
に触ったのが3年くらい前なので忘却の彼方。
318:デフォルトの名無しさん
10/09/19 15:55:08
>データの両側に付ける
direct accessのためにそういう仕様になってるんだっけか
ただ、その数字自体のバイト数がコンパイラ依存なんだよな
なんで規格でちゃんと決めなかったんだろ
>open 文でエンディアンの指定
まじ?聞いたことないけど
319:デフォルトの名無しさん
10/09/19 19:26:07
>>318
> >open 文でエンディアンの指定
> まじ?聞いたことないけど
URLリンク(gcc.gnu.org)
規格の事は知らんけど、こんなのがあったぞ。
コンパイラ依存だったりして。
320:314
10/09/20 04:16:07
>317 データの両側に付ける
ためになった。
経験上たいていの無書式書き出ししたファイルサイズが
ちょびっとだけ大きかったから
何か付帯情報がくっついているんだろうな、くらいには思ってたけど
「両側」に「総バイト数」というのは知らなかったでした。
自分のつくったファイルをみるとたしかにそうなってます!
・・・問題は >>318 さんのとおりコンパイラごとに違うという事か。めんど~
321:デフォルトの名無しさん
10/09/21 19:33:02
なんか扱いにくいね>unformat
結局binaryが一番ってことか
322:デフォルトの名無しさん
10/10/05 20:49:12
ACCESS="STREAM"
323:デフォルトの名無しさん
10/10/11 00:11:11
fortran90 を使って、n 行の文字列データが格納されている
test.dat というファイルの1行1行を読み込んで、
標準出力に出力しようと思っています。
そこで、(抜粋ですが)
------------------------------------------
character(len = 50) :: chara
open(1, file='test.dat', status='old')
do i = 1, n
read(1, *) chara
write(*, *) chara
end do
------------------------------------------
と書いてみたのですが、文字列データに/や*などが含まれると
文字化けしてしまいます。また、空白が出力されません。
一体、何が原因と考えられますでしょうか。
なお、OSはubuntuで、コンパイラは、gfortranです。
お分かりの方がいらっしゃいましたらお教えいただけると嬉しいです。
よろしくお願いします。
324:デフォルトの名無しさん
10/10/11 04:58:37
手元にコンパイラ無いから検証なしw
read(1,'(a)') chara
write(*,'(a)') chara
で試してちょ。たぶんうまくいくとおもうけど。
長さ指定無しのA は便利。
325:323
10/10/11 14:34:43
>> 324 さん
早速お答え頂きありがとうございました!
試してみたところ、文字化けせず上手く出力されました!
お教え頂きありがとうございます!!
326:デフォルトの名無しさん
10/10/11 17:56:08
みんなラクダ記法とアンダーバー記法どっちで書いてる?
327:デフォルトの名無しさん
10/10/11 18:03:07
現在、30年分の日別のデータがずらっとあります。
その生のデータを初めに、5日ごとの半旬平均したあとに30年平均したい場合、
どう書いていいのか想像つかないのですが。5日ごとの半旬平均する場合、
欠損値があれば、数えずに平均したいんです。
1半旬(1~5日間の平均)、2半旬(6~10日間の平均)、3半旬(11~15日間の平均)、4半旬(16~20日間の平均)、
5半旬(21~25日間の平均)、6半旬(26~30日間の平均)が12カ月分で、まず1年を72半旬にしたいのです。
6半旬は、月によっては、(26~28日間の平均)や(26~31日間の平均)の場合もあります。
例えば、
1/1 10
1/2 8
1/4 6
1/5 2
1/6 1
1/9 2
1/10 9
: :
とあった場合、
1月1半旬 (10+8+6+2)/4 = 6.5
1月2半旬 (1+2+9)/3 = 4
: :
といったような感じなのですが。わかりにくいかもしれませんよね。わからにくいところが
ありましたら、ご連絡ください。どうかよろしくお願いします。
328:デフォルトの名無しさん
10/10/11 18:17:51
>>326
正直悩み所だわそれ
ごちゃ混ぜになってるw
329:デフォルトの名無しさん
10/10/11 18:26:32
>>328
そっかー.最近はjavaっぽく変数名はラクダ,サブルーチン名はパスカルにしてるんだよねー
330:デフォルトの名無しさん
10/10/12 02:03:50
たびたびすみません・・・。
323 ですが、Fortran90 で、文字列や数字がごちゃまぜになっている
ファイルから数字だけを抜き出したいのですが、どうすればよろしい
のでしょうか?
例えば、(1234567890)という行から、1234567890だけを抜き出したいと
思っています。
試しに、(1234567890 が書いてある行を対象に
character(len = 1) :: chara
real(kind = 8) :: x
read(1, '(a)') chara, x
とやってもエラーになり駄目でした。
(chara で左括弧だけを取り除きたかったのですが・・・。)
ご存知の方がいらっしゃいましたらお教えいただけるとありがたいです。
よろしくお願いします。
331:デフォルトの名無しさん
10/10/12 02:17:58
324
数字だけ見つけるには・・・
ichar(x) (長さ1の文字列をアスキー表の整数に変換する奴)で
ichar(x) 48 から 57 の範囲をとるからそれで見分けはつくので、
一度、
read(1, '(a)') chara
do j = 1, 50
x = chara(j:j)
idummy = ichar(x)
if ((idummy .LT. 48) .OR. (idummy .GT. 59)) chara(j:j) = ' '
enddo
な感じで数字以外を空白に置き換えてから・・・かな?
上の例だと指数部のE (やD)とか小数点(.)や正負(+-)も空白に置き換えるので
必要に応じて変えてちょ。
あと、
write(x,'(i1)',ERR=199) idummy
みたいにI/O エラーで判別するやりかたもあるけど、
これは分岐が汚くからichar使うのが無難かなぁ
332:デフォルトの名無しさん
10/10/12 02:23:08
>>327
エクセルでやった方が幸せになりそう。
333:デフォルトの名無しさん
10/10/12 12:16:14
>>327
yy/mm/dd みたいにせめて桁はそろえてほしい・・・
331 的やりかたで年月日の3つの数字を取り出して
・・・先は長いw
334:デフォルトの名無しさん
10/10/13 12:29:20
Intel Fortranでコンパイル時にOpenMPを指定するだけでオーバーフローになってしまうのですが
何が原因でしょうか?
F77のプログラムで、普通にコンパイルすれば問題なく作動します。
335:デフォルトの名無しさん
10/10/14 10:12:22
コンパイルにしくじるんだよね?
unlimit か ulimit して制限取っぱらっても変わらないだろうなぁ。
というかOS なに?
あとは・・・Private 属性でアホみたいに大きいサイズの配列があると・・・とか、かなぁ。
336:デフォルトの名無しさん
10/10/16 20:37:47
構造体のメンバを一覧でとってくる方法ってありますか?
type(member)
integer id
integer age
real(8) height
end type member
type(member) person
person%id = 1
person%age = 26
person%height = 171.d0
などと宣言して
do ???????????????
print *, @@@@@@@
enddo
のようにすると
1
26
171.00000
のなるようにメンバ変数でループをまわしたいのです
337:デフォルトの名無しさん
10/10/19 00:37:23
>>335
/AUTO_ALLOCATEでうまくいきますた。
338:デフォルトの名無しさん
10/10/20 15:11:36
はじめまして。
T検定を書いているんですが、
disperは、不偏分散で、valueは、分散の推定値です。
value(doy) = ((ndata(doy)-1)*disper(doy)+(ndata2(doy)-1)*disper2(doy))/&
(ndata(doy)+ndata2(doy)-2)
t(doy) = abs(sunlight(doy)-sunlight2(doy))/sqrt(value(doy)*((1/ndata(doy))&
+(1/ndata2(doy))))
これのt(doy)の出力が、+inf,時々NaNになります。
直後に
write(6,*) doy,lon,lat,ndata(doy),ndata2(doy),value(doy),t(doy),&
sunlight(doy),sunlight2(doy)
で出力した際の一部は
1 141.678 45.4147 7 10 3.97499 +Inf 1.025 0.82
2 141.678 45.4147 7 10 3.57839 +Inf 0.42 0.46000004
3 141.678 45.4147 7 10 5.2759204 +Inf 2.48 0.24000001
です。エクセルで計算した場合、Tの値はでると思うんですが、何が原因の可能性として
考えられるのでしょうか?
宣言文は、全てREAL,dimension(72)です。
339:デフォルトの名無しさん
10/10/20 15:56:17
338
解決しました。すみません。
340:デフォルトの名無しさん
10/10/24 19:58:54
みんな構造体使ってないのかな
341:デフォルトの名無しさん
10/10/25 22:45:04
使ってるよ
342:デフォルトの名無しさん
10/10/28 00:42:15
収束しねーよ・・・。(´;ω;`)
343:デフォルトの名無しさん
10/10/28 02:52:36
発散しないのなら、変なattracter に
はまった•••となると
それが系の本質かもしれないから
頑張れ!
ただのタイプミスの可能性も残るけどね
344:デフォルトの名無しさん
10/10/31 20:08:29
Fortran90/95の構文色分けが一番見やすいエディタって何ですか?
345:!omikuji
10/11/01 01:45:22
vim
真面目な答え
346:デフォルトの名無しさん
10/11/01 11:40:41
emacs
347:デフォルトの名無しさん
10/11/01 22:38:20
>>345-346
ありがとうございます。
ははー。90以上だと、やっぱりそこらへんですか。
色々試してるんですけど、Fortran対応ってなってるものでも
実質77対応のが多いんですよね…
秀丸+定義ファイルとかもやってみようかな
348:デフォルトの名無しさん
10/11/01 22:47:27
誰かFortran開発という観点でのエディタ・IDEを評してくれ
メジャーな言語だとそういった話題が豊富なんだが、Fortranは寂しい限り
349:デフォルトの名無しさん
10/11/04 01:11:34
The first argument (X) to the intrinsic SQRT must be of REAL or COMPLEX type, not INTEGER(KIND=3)
平方根計算しようとしたらこんなのでるの
350:デフォルトの名無しさん
10/11/04 02:42:02
>>349
SQRT関数の引数は実数か複素数でないといけません。整数はダメです。
351:デフォルトの名無しさん
10/11/04 14:19:07
はじめまして。
前からなぜうまくいかないのか、わからず、違う強引な方法で行っていたのですが、
今回はそうはいかなく、質問させていただきます。
if文なのですが、今、データのなかの日にちを1~365としています。
それを1~59、335~365を冬。60~151を春、152~243を夏、244~334を秋と、if文で
場合分けしたいのですが、うまくいきません。どう書けばよいのでしょうか?
do doy = 1,365
if( 60 <= doy <= 151) then
ave1 = ave1 + sunlight(iyear,doy)
ndatax_sp = ndatax_sp + ndata(iyear,doy)
else if(152 <= doy <= 243) then
ave5 = ave1 + sunlight(iyear,doy)
ndatax_su = ndatax_su + ndata(iyear,doy)
else if(244 <= doy <= 334) then
ave9 = ave1 + sunlight(iyear,doy)
ndatax_au = ndatax_au + ndata(iyear,doy)
else
ave13 = ave1 + sunlight(iyear,doy)
ndatax_wi = ndatax_wi + ndata(iyear,doy)
endif
end do
352:デフォルトの名無しさん
10/11/04 19:43:40
>>351
とりあえず教科書か↓のページを開いて IF文と論理式について復習するんだ。
URLリンク(www.str.ce.akita-u.ac.jp)
Fortran90以降が使えるのなら IF文ではなく、SELECT CASE文で書いた方が
きれいに書けるかも。
353:デフォルトの名無しさん
10/11/05 14:38:18
if…else if…else ifって何個も分岐するならselect case文のほうがいいに決まってるけど、
分岐が2、3個の場合でもselect case文でやるべきか結構迷う。
2、3個程度ならパッと見はifのほうがすっきり見えるからねぇ。
354:デフォルトの名無しさん
10/11/05 15:05:00
>>352,353
ありがとうございました。case文で書きました。
もう一度復習してみます。
355:デフォルトの名無しさん
10/11/06 07:33:17
エディタ色々試し中です。
Win版geditを使ってみました。
Fortran95に対応してますが、
拡張子見て勝手にFortranモードになってくれるわけではなくて
一々手動でモード切り替えしないといけないこと以外は
結構良いですね
356:デフォルトの名無しさん
10/11/07 20:52:22
知恵を貸してください。
3次メッシュコード、年齢層、要素の値の3列
で構成されるファイルが要素別に10ファイルあって、
こいつらを1つのファイルにまとめようとしています。
(メッシュコード、年齢層、要素1、…、要素10)
10ファイルに出てくるメッシュコードと年齢層の組み合わせは
ファイルごとに異なっていて、重複する場合もあれば1ファイルのみで出現することもあります。
また、あるファイルでは数百行しか格納していないのに対して、
一方では数十万行分のデータを格納しているものもあります。
素人考えで12次元の配列にぶちこんで出力すれば良いかなとも思ったのだが、
3次メッシュコードだけで60万行になってしまうし、
要素1~10の値がまったく含まれないコードも多々ある訳で。
効率的に要素1~10の値が1つでも含まれるメッシュコードと年齢層の組み合わせだけを
出力できる良い方法はないでしょうか。
357:デフォルトの名無しさん
10/11/11 23:58:58
教えてください!
関数 idate に関してですが、
gfortran -c -fdefault-integer-8 -O2 -std=legacy Libtad.f
In file Libtad.f:1339
call idate (month,day,year)
Error: Too many arguments in call to 'idate' at (1)
となり、エラーになってしまいました。
ググったら idate はinteger 3 個でいいと書いてあって
なぜエラーになるのか解かりません・・・。
もともとのソースコード(tinker/Libtad.f)は
integer year,month,day
(略)
call idate (month,day,year)
と書いてあります。
gamess というソフトをインストールしようとして、コンパイルしたら、
何故かそのライブラリだけがError を起こして上手くインストールできないのです・・・。
(コンパイルは入っていたスクリプトで行っています。)
OS:Scientific Linux 5.5
gfortran: gcc4.1.2
358:デフォルトの名無しさん
10/11/12 04:04:39
>>357
URLリンク(gcc.gnu.org)
IDATE - Get current local time subroutine (day/month/year)
IDATE(VALUES) Fills VALUES with the numerical values at the current local time.
359:デフォルトの名無しさん
10/11/17 00:16:08
>>358
ありがとうございます。
idate の部分上手く解決しました。
360:デフォルトの名無しさん
10/11/17 20:08:20
教えてください
あるtxtファイルから必要なとこだけを抽出したいんです。例として、
120 30
121 30
121 31
120 31
120 30
123 32
124 32
124 33
123 33
123 32
↓から
120 30
121 30
121 31
120 31
120 30
123 32
123 32
のように、ある範囲(ここではX=123以下かつY=32以下)以外のものをはじきたいのですが、
空行をそのまま残す方法がわかりません。
どなたかご教授願います。
361:デフォルトの名無しさん
10/11/17 21:41:36
5個ずつのブロックで入ってるのなら,
5個読みこんだら空行を書き出すようにしたら?
たとえば
do i = 1, n
read(10,*) a(i, 1), a(i, 2)
if ( a(i, 1) > 132 .or. a(i, 2) > 32) write(20,*) a(i,1 ), a(i, 2)
if (mod(i, 5) == 0) write(20,*)
enddo
とか.
362:デフォルトの名無しさん
10/11/17 22:18:11
モジュールを外部ファイル化して
メインファイルとモジュール用のファイルをコンパイルするのって
f90 main.f90 mod.f90
でいいの?
363:360
10/11/18 15:16:58
>>361
お答え頂きありがとうございます。
私の書き方が悪かったのですが、1つのブロックの中の数はバラバラです。
条件によっては書き出し後でそのブロックの中の数が変わることもあります。
>>361さんのおっしゃる通り、空行まで読むといったん条件を通して
新たなブロックと空行を書くようにすればできそうな感じはするのですが、
「空行まで読むと」という部分はどのようにすればいいのでしょうか?
364:デフォルトの名無しさん
10/11/18 21:40:58
ichar() で空行を読み込むと "32" が返されるから,
character(1) :: a(100)
open(10, file='hoge.txt')
do i = 1, foo
read(10,'(a)') a(i)
enddo
close(10)
でもう一回同じファイルを開いて do loop を回して範囲外のものをはじきつつ
if( ichar(a(i) == 32) で空行を書き込むとかどうかな?
違ってたらごめん. 正直Fortran で完結させないでシェルスクリプトなり
使った方がラク.
365:デフォルトの名無しさん
10/11/18 23:42:02
>>360
こんな感じで良いの?
program extraction
implicit none
integer::i,j,k,m,is,large_number=10000
character(len=32) c
open(10,file='hoge.dat')
do i=1,large_number
read(10,'(a)',iostat=is) c
if(is>0) stop "error"
if(is<0) exit
m=index(c,' ')
if(m/=1) then
read(c(1:m-1),*) j
read(c(m+1:),*) k
if(j<=123.and.k<=32) then
write(*,*) j,k
end if
else
write(*,*)
end if
end do
close(10)
end program extraction
366:デフォルトの名無しさん
10/11/18 23:43:57
>>362
モジュール先に作るべきなんじゃなかったっけ?
f90 -c mod.f90
f90 -c main.f90
f90 mod.o main.o
となるのが無難な気がする.
367:デフォルトの名無しさん
10/11/19 01:23:27
program hoge
implicit none
integer :: x, y, ios
character(len=100) :: str
open(unit=11, file="input.txt", status="OLD")
open(unit=12, file="output.txt", status="UNKNOWN")
do
read(11, "(A)", iostat=ios) str
if (ios /= 0) exit
read(str, *, iostat=ios) x, y
if ((ios /= 0) .or. ((x <= 123) .and. (y <= 32))) then
write(12, "(A)") trim(str)
end if
end do
close(11)
close(12)
end program hoge
368:365
10/11/19 01:33:23
index使わなくてよいのか。
勉強になった。
ありがとん。
369:360
10/11/20 00:28:16
>>364>>365>>367
皆様ありがとうございます。
残念ながら、本日はFORTRANを使える環境におらず、
月曜日にもう一度皆様からご教授いただきましたように
プログラムを見直し、計算してみようと思います。
また月曜日にご報告させていただきます。
本当にありがとうございます。それではよい週末を~
370:デフォルトの名無しさん
10/11/22 15:53:46
結果をご報告いたします
>>367様のプログラムで計算し、出力ファイルを見ると
全データの中から、すべての空行が出力されておりました。
数値は入っておりませんでした。
>>365様のプログラムでは、
同じように空行のみが出力されておりましたが、数がかなり少なかったので、
範囲内(j<=123.and.k<=32)にある空行が出力されたのではないかと思います。
もう一度じっくり考えてみたいと思いますが、無理そうなら諦めます;;
お二方ともありがとうございました。
371:デフォルトの名無しさん
10/11/22 21:00:33
>>366
それでできなかった
モジュールのほうはコンパイルできるんだけどメインがモジュール読み込んでなくてコンパイルできない
モジュールのほうをコンパイルしたときにoファイルだけ生成されてmodファイルが生成されないことと何か関係あるのかな?
372:デフォルトの名無しさん
10/11/22 21:25:01
>モジュールのほうをコンパイルしたときにoファイルだけ生成されてmodファイルが生成されない
これはおかしいね
modファイルを作らないコンパイルオプションになっているとか?(そんなオプションあるのか知らないけどw
373:デフォルトの名無しさん
10/11/22 21:55:39
Fortran が複雑になって行っている気しかしない。
77 の頃に戻ってくれんかな。まぁ幾らなんでも
77 ではヒド過ぎるから、90 程度の拡張で。
一体何処に向って行っているのだろう。学習のコ
ストが上がるのは良い事ではないと思うのだが。
374:デフォルトの名無しさん
10/11/22 22:37:57
>>372
コンパイルソフトが何か分からないんだけど
コンパイルソフト何使ってるか調べるコマンドってある?
375:デフォルトの名無しさん
10/11/22 22:42:05
学習コスト<学習による恩恵 であれば肯定されるべきだと思うが
言語策定者は「こう使えばシアワセになれるんよ!」ってところを広くアピールしてほしいね
まぁそういうことするのは物書きの仕事かもしれないけど
でもFortranは少ないからなぁ
376:デフォルトの名無しさん
10/11/22 22:43:26
test
377:デフォルトの名無しさん
10/11/22 23:03:00
>>373
そうは言っても、もはや世界がFortranだけで閉じていないから、インターフェース周りを強化しないと
ライブラリのラッパーすらかけない。
伝統的数値計算ライブラリならともかく、MPIとかOSのAPとかIは同じ引数が色々な型を取ったりするから
そういうのに対応しようと思うと、多態型とかOOPっぽい機能が必要になるし、Cの呼び出し規格との
共通化も必要になる。
数値FormatがIEEE745に統一された以上、数値計算主役のFortranでは、その代数系を操作する
命令も欲しくなる。組み込み関数ももっと色々欲しくなる。
CPUも並列が当たり前になりつつある今、それに向いた命令も欲しい。
とはいえ他の言語のように、F90を削ったコア部分と標準Moduleみたいな形に分割したほうがいい気はするけど。
過去互換性をかなり保ったまま肥大化したから、命令の直交性なんかが悪くて、新規学習者に負担が
重すぎる気がする。
378:デフォルトの名無しさん
10/11/22 23:13:55
>>377
学習負担そんなに重いかな?
Fortran使う分野は特殊なんだし、ユーザもそれなりのレベルを前提としていいと思うけど
あと、
>MPIとかOSのAPとかI
は
>MPIとかOSのAPIとか
だよね?
379:デフォルトの名無しさん
10/11/23 01:53:59
>>378
>>MPIとかOSのAPIとか
>だよね?
んだ。すづれい。
>学習負担そんなに重いかな?
90/95を77を横目に見つつ66以前を無視する形で学ぶ分にはいいかもしれんが、
これに2003が加わるときついような。やや95と挙動が変わっている。
CLASSの作り方とかも不細工だしww
380:デフォルトの名無しさん
10/11/23 18:06:40
計算時間長いプログラムをデーモンとして走らせたいんですけどどうやったらいいんでしょうか.
コンパイラはpgiです.
381:デフォルトの名無しさん
10/11/23 20:31:46
>>380
まあこの場合、コンパイラはPGIでもIntelでも何でもいいんだが
URLリンク(www.codereading.com)
382:デフォルトの名無しさん
10/11/25 16:00:26
Fortranで用意されている関数やサブルーチンを詳しく網羅しているサイトってないですか?
やはり本家を見るべきですか?(その本家がどこかも知りませんが・・・)
383:デフォルトの名無しさん
10/11/25 22:01:10
サブルーチンは自分で組み込むもんじゃないのか
384:デフォルトの名無しさん
10/11/25 22:26:19
内蔵してるサブルーチンでしょ
system_clockとか
385:デフォルトの名無しさん
10/11/25 22:46:02
intel fortranは拡張機能で、内部手続きを別の手続き
に渡すことを許している。他のコンパイラでは、もし
2003に対応していたら、手続きポインタでさして、わ
たせば、一応機能しているように見える。が、偶然の
可能性もある。2003の手続きポインタがさせる先は仕様
でどうなっているかを教えていただけないだろうか。
386:デフォルトの名無しさん
10/11/26 11:36:12
Fortranである変数や配列のアドレスを知る演算子はありますでしょうか?
387:デフォルトの名無しさん
10/11/26 19:02:26
非標準だが、LOCまたは%LOC関数が使えることがある。
388:デフォルトの名無しさん
10/11/26 19:09:57
>>387
ありがとうございます
非常に助かりました!!
ちゅっちゅっ
389:デフォルトの名無しさん
10/11/27 15:57:44
>>372
富士通だとデフォルトでは生成されない
frt -c -Am -M./ (なんとか.f90)
でいけるのではなかろうか。いずれにせよ、
frt -help | less
とかやって、"module"で検索を掛けるのが吉。
390:デフォルトの名無しさん
10/11/27 22:07:56
>>389
そのレスを見る前に昔の先輩が書いてたプログラムを見てたらmakeファイルに使用コンパイラがfrtってなってたから
ググってもしやと思ったらなんというタイミング・・・
多分そのとおりだと思う
月曜に試してみてまた報告しにくるわ
391:デフォルトの名無しさん
10/11/28 16:23:24
1990 4 2 401 45.2448 141.41 稚内 65 27 0 0 0
1990 4 2 402 44.5618 142.3524 北見枝幸 67 18 0 0 0
1990 4 2 404 44.2142 141.4218 羽幌 55 41 0 0 0
1990 4 2 405 44.3442 142.5806 雄武 95 36 0 0 0
1990 4 2 407 43.4612 142.2224 旭川 55 24 0 0 0
1990 4 2 409 44.01 144.17 網走 25 66 0 0 0
1990 4 2 412 43.0324 141.1954 札幌 53 36 0 0 0
1990 4 2 413 43.1236 141.4718 岩見沢 83 29 0 0 0
1990 4 2 418 42.583 144.233 釧路 83 31 0 0 0
1990 4 2 426 42.093 142.4648 浦河 55 60 0 0 0
1990 4 2 428 41.5154 140.0742 江差 53 65 0 0 0
1990 4 2 433 42.5354 140.4542 倶知安 67 34 0 0 0
1990 4 2 435 44.2036 143.2136 紋別 57 49 0 0 0
という形式のデータを読んだ場合(1961~2008年あります)、
do i = 1,137000
read(50,*,iostat=io) year,mon,day,ID,lat,lon,name,aveavecloud,sunsunlight,&
prepre,maxmaxhourpre,maxmax10minpre
if ( io < 0 ) exit
pre(ID,year,mon,day) = prepre / 10.0
sunlight(ID,year,mon,day) = sunsunlight/10.0
avecloud(ID,year,mon,day) = aveavecloud
maxhourpre(ID,year,mon,day) = maxmaxhourpre/10.0
max10minpre(ID,year,mon,day) = maxmax10minpre/10.0
ndata(ID,year,mon,day) = ndata(ID,year,mon,day) + 1
write(6,*) year,mon,day,ID,ndata(ID,year,mon,day)
end do
とし出力させると、ndata(ID,year,mon,day)がIDが402と409だけが2となります。
この原因はなんでしょうか?
392:デフォルトの名無しさん
10/11/28 16:31:58
すみません。
391での説明で追加です。
ndata(ID,year,mon,day)がIDが402と409だけが2となります。と書きましたが
毎回ではないと思います。402と409ではないときもあるかもしれません。この下に2となると止める
プログラムを書いているので、1990年の4月にとまり確認できたはじめのケースです。
以下どうなっているのかはまだ確認中です。
393:デフォルトの名無しさん
10/11/28 20:17:30
1つのソースファイル内で固定形式と自由形式を混ぜるとコンパイルがエラーになりますが、
「この行からこの行までは自由形式で」みたいな指定をしてコンパイルさせる方法が
あったりしませんかね?
394:デフォルトの名無しさん
10/11/29 01:22:16
大学の授業で「エラトステネスのふるい」で3桁の素数を求める問題が出たのですがその解答例で
index=1
do n=2,int(max**0.5)
if(index(n)==0)cycle
index(n**2:max:n)=0
end do
↑のようなものだったのですが(回答の一部抜粋です)indexとcycleの役割がいまいち
わからないので教えてください。maxには書いてませんが上で=999と定義しています。
あと別の質問ですが大学では初めに「g77 -o ~ ~」でコンパイルするように教わり
別の教授からは「intel -o ~ ~」と教わったのですが具体的に何が違うのですか?
質問長くなってすいません。回答お願いします
395:デフォルトの名無しさん
10/11/29 21:44:27
>>390だけど
今日試したら無事コンパイルできて実行できた
プログラム書くのがだいぶ楽になったわ レスくれた人たちありがとう
396:デフォルトの名無しさん
10/11/29 23:46:20
>>394
> indexとcycleの役割
index は(おそらく整数の)配列だろう。
「ふるい」にかけた後 index(n) == 1となる n が素数。
cycleはDOループの中で次の行からend doまでをスキップする。
397:デフォルトの名無しさん
10/11/30 00:46:36
>393
ないんじゃない?
ファイル分けてコンパイルするのが一般的じゃないかしら.
>394
エラトステネスのふるい自体はwikipediaにあるので説明なしで.
index=1 ! 配列index(999)に整数値1を代入,最初は全部素数だとしておく.
do n=2,int(max**0.5)
if(index(n)==0)cycle ! index(n)=0のとき(すなわち素数でない場合)enddoまでスキップ.
!この場合はこの1行↓をスキップするだけ
index(n**2:max:n)=0 !n**2からmaxまでnおきにindexの値を0とする.
! do i=n**2,max,n
! index(i)=0
! enddo !と同義
end do
このプログラムは,既に組み込み関数として用意されているindexとmaxを整数型として利用しているので,あんまり良くない回答例だと思います.
g77とintelの違いはコンパイラの違い.
398:デフォルトの名無しさん
10/11/30 22:01:01
indexやmaxどころかINTEGERやIF、THENまで変数等に使えるのがFORTRANの良いところじゃないかwww
399:デフォルトの名無しさん
10/12/01 01:15:45
>>396,>>397
ありがとうございます
indexってネットで検索したら関数として乗っていたのでてっきりそっちかと思ったら
ただの配列だったんですかw
おかげで謎が解けました。すっきり
400:デフォルトの名無しさん
10/12/01 03:57:06
interfaceブロックの中には、型定義だけでなく、implicit noneも
及ばないのな。なんで、こんな仕様にしたんだろう。
Fotran2003からimportで取りこめるようになったが、2003完全サポート
なコンパイラは少ない。
401:デフォルトの名無しさん
10/12/01 14:06:37
完全サポートって完全準拠って意味?
もうすぐ2011になろうってのに
402:デフォルトの名無しさん
10/12/01 22:19:38
コンパイルすると「do文にパックド命令が出てきます」って表示されるんだけどどういう意味?
コンパイラは富士通で一応ちゃんと実行できるんだけどなんか怖い
403:デフォルトの名無しさん
10/12/02 23:01:00
infoseekのweb終了で「フォートランナーのためのFortranあれこれ」っていうサイトが見れなくなってしまいました。
かなり好きなサイトだったのですが・・・ここ見てらしたら是非復活お願いします>作者さん
404:デフォルトの名無しさん
10/12/06 22:06:18
.not. と .and. と .or. の優先順位ってどうでしたっけ?
405:デフォルトの名無しさん
10/12/06 22:19:57
優先順位: (高) .NOT., .AND., .OR. (低)
406:デフォルトの名無しさん
10/12/06 22:37:41
>>405
thx!
407:デフォルトの名無しさん
10/12/07 03:35:33
自分は怖いから
くどい位に括弧付けてる
408:デフォルトの名無しさん
10/12/07 05:59:47
>>407
オレも。
409:デフォルトの名無しさん
10/12/08 16:01:22
Cの i++ みたいなインクリメント演算って i=i+1 とするより早い(専用の処理をするから)と聞いたのですが
Fortranではそういうのないんですか?