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

■ このスレッドは過去ログ倉庫に格納されています
2012/08/16(木) 20:58:00.31
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。

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

●前スレ
くだすれFORTRAN(超初心者用)その5
http://toro.2ch.net/test/read.cgi/tech/1269704830/

●過去スレ
くだすれFORTRAN(超初心者用)その4
http://pc12.2ch.net/test/read.cgi/tech/1232789521/
くだすれ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/
2013/05/23(木) 17:36:14.83
>>196
一応ifortのhelpでは,"整数"で検索かけてみたんですが,使える物はとくにありませんでした.
目視で全文確認してみます.
ありがとうございました.
2013/05/24(金) 03:07:21.20
貰い物の古いコードが、グローバル変数をCOMMON文でインクルードしている形式なのですが、
そこのCOMMON文に新しく変数を付け足したところ、
>COMMON のために、オブジェクトのアライメントが型と一致していません
>パフォーマンスに影響を与える可能性があります。
という警告が出ました。
変数の付け足す位置を変えたら出なくなったのですが、どういう意味かわかる方いらっしゃいますか?
2013/05/24(金) 16:05:35.20
>>198
32bitコンピュータとか64bitコンピュータと呼ばれるように、コンピュータは
ビットの塊を一括して処理する。メモリーアクセスは、0番地から32や64bit
の区切りで一括でなされる。この境界をまたぐと、本来1回で読み書き
できるデータに2回読み書きにいかなければならない。

そういうわけで、最近のFortranコンパイラは、自動的に境界合せをするようになっている。

ところがCOMMON文は、同じメモリー領域の割り付けだから、
コンパイラが変数の位置を勝手にずらすと、対応がずれてしまう可能性が出る。
それでアクセスが遅くなるよと警告している。


COMMON文はグローバル変数というよりも、メモリー割り付けの手動制御と
理解した方が良い。COMMONにあるのがREALとINTEGERだけの場合は、
ズレが起きることは(例外的な場合以外)ないが、文字列などがあると
すぐずれて色々警告される。文字変数は後ろの方に置くのが吉。


FORTRANコンパイラではREALとINTEGERのデフォサイズが共通であるという
(暗黙の?)約束がある。COMMON文での共有があるためだと思うが。
AUTODBLEをつかったりするとずれる可能性が出る。
以前GFORTRANだったかg95だったかが、この約束を破ってド顰蹙を買っていた。
2013/05/28(火) 02:56:21.83
はじめまして、こんにちは
現在、フォートランで数値計算をするプログラムを作っています。
今日、プログラム内で使っている配列のサイズを極端に大きくしたところ、スタックオーバーフローというエラーになりました。

解決策としては、コンパイルオプションでスタックを初めから大きくするというものがあるそうなのですが、この方法にデメリットはないのでしょうか?

また、これ以外の方法で、皆さんならどのようにオーバーフローを回避しますか?
2013/05/28(火) 14:05:42.30
>>200
サブルーチンとか関数で大きく確保しようとしたんだろ?

allocatableで確保すれば、ヒープ領域に取られるのでだいじょぶ。
202デフォルトの名無しさん
垢版 |
2013/05/30(木) 12:08:48.19
次のようなデータをファイルから読み込みたいのですが,read文と書式をどう書けばよいか教えてください.

データの並びは
(親核種)(娘核種)(娘核種の比率)(孫核種)(孫核種の比率)(ひ孫核種)(ひ孫核種の比率)…
となっており,何世代まで子孫の核種があるかはファイルを読むまで分からないとします.
203202
垢版 |
2013/05/30(木) 12:11:04.67
---------データの例(はじまり)-------------
Pb-202 Tl-202 1
Pb-210 Bi-210 1 Po-210 1
Pb-212 Bi-212 1 Tl-208 0.40 Po-212 0.71
Bi-210m Ti-206 1
Bi-212 Tl-208 0.36 Po-212 0.65
At-211 Po-211 0.58
Rn-222 Po-218 1 Pb-214 1 Bi-214 1 Po-214 1
---------データの例(おわり)-------------
204202
垢版 |
2013/05/30(木) 12:13:11.61
read(unit=10,fmt='(A,100(:,A,E))') parent, ( progeny(i), progeny_ratio(i), i = 1, 100 )
このように書きましたが,Eに長さの指定がない,とエラーが出ます.

自分が分からない点は以下の二つだと思っています.
1. 任意の桁数の小数を読み込む方法がわからない
2. 一行に任意の個数だけデータが並ぶ場合のreadの仕方がわからない

コンパイラはgfortranを使っています.
2013/05/30(木) 19:01:21.13
>>204
結構めんどい。
1.任意の桁数の小数を読む最も楽な方法は、自由形式を使うことで、
空白とかコンマが区切りに入っていれば自動で切り分けてくれる。

自由形式を使わない場合は、動的にFORMAT生成する方法がある。

2.任意個のデータを読むのは、エラー上等で読み込んで、iostatで
エラーコードを調べて、END OF RECORD ならおkとか。


しかし、今の場合文字列処理の方が問題。固定長ならまだやりようがあるが、
Bi-210m みたいに長さの違うのが混じると苦しい。

結局、1行ごと文字列として読み込んで、空白をトークンとして自分でパース
していくのが素朴。

Fortran2003/08なら、もう少し柔軟なIOできるかもしれない。
2013/05/30(木) 19:03:15.49
program twochan
implicit none
integer, parameter :: nmax = 100
character (len = 136) :: buff
character (len = 10) :: parent, progeny(nmax)
real :: progeny_ratio(nmax)
integer :: i, k
do
read(10, '(a)', end = 999) buff
buff = adjustl(buff)
k = index(buff, ' ')
parent = buff(1:k - 1)
buff = adjustl(buff(k:))
i = 0
do while(trim(buff) /= '')
i = i + 1
k = index(buff, ' ')
progeny(i) = adjustl(buff(1: k - 1))
buff = adjustl(buff(k:))
k = index(buff, ' ')
read(buff(:k - 1), *) progeny_ratio(i)
buff = adjustl(buff(k:))
end do
print *, parent, (progeny(k), progeny_ratio(k), k = 1, i)
end do
999 stop
end program twochan

>>206 専ブラインデント用引用符
2013/05/30(木) 19:04:54.82
実行結果

Pb-202 Tl-202 1.000000
Pb-210 Bi-210 1.000000 Po-210 1.000000
Pb-212 Bi-212 1.000000 Tl-208 0.4000000 Po-212
0.7100000
Bi-210m Ti-206 1.000000
Bi-212 Tl-208 0.3600000 Po-212 0.6500000
At-211 Po-211 0.5800000
Rn-222 Po-218 1.000000 Pb-214 1.000000 Bi-214
1.000000 Po-214 1.000000
208202
垢版 |
2013/05/31(金) 21:54:18.32
すばらしいです!ありがとうございました.

実は,自分もほぼ丸一日試行錯誤した末にできたのですが,
なぜ自分のプログラムがうまく動くのか説明できません.
教えてもらった方法をこれから読んで勉強しようと思います.
209デフォルトの名無しさん
垢版 |
2013/06/11(火) 09:28:34.46
gfortranで通常の宣言型を超えて桁数の上限なしの計算をしたいのですが、

質問1)GMPというのを使えば良いのですか?
(既にPCに入っているとしたら、Ubuntuの場合は、どこのなんてファイル群?)

質問2)GMPを使うとして、どのようにソースを書けば良いですか?
(FMLIBの場合は、最初にuse FMZMとして、型宣言の時にtype(IM)とか)

質問2)他にもっと多倍数演算に向いたツールはありますか? 
2013/06/11(火) 19:54:51.69
質問です学校で COMMAND入力に「XX<YY.dat」という操作をしたのですがどういう意味でしょうか?
2013/06/11(火) 20:48:28.96
>210

XXというプログラムにYY.datというデータを入力したと
いうことです。
XX>YY.datとすると、XXというプログラムの出力を
YY.datというファイルに出力することを意味します。
2013/06/12(水) 15:25:51.17
>>209
FMLIBかMPFUNでいいんでね?
Fortranで書かれてるし。
213デフォルトの名無しさん
垢版 |
2013/06/15(土) 12:45:05.08
>>212
FMLIBにて成功しました。ありがとう。
今までintegerしか多倍数演算できなかったんだけど、FMLIBのほうがいい。
214デフォルトの名無しさん
垢版 |
2013/06/17(月) 11:48:46.18
C program main
implicit real*8 (a-h, o-z)
real*8 aa
parameter (c=1.0D0, aa=1.0D0, nmax=200, dx=aa/nmax)
integer n
real*8 x(0:1000)
real*8 y(0:1000)
real*8 k1,k2,k3,k4
open(11, file='0606-1.4data', status='unknown')
C * initial value of y
y(0)=1.0D0
x(0)=0.0D0
n=0

C * solution at x(n)=(n+1)*dx
1 q=1.0d0
p=1.0d0-q
a=q*0.50d0
b=q*0.50d0
215デフォルトの名無しさん
垢版 |
2013/06/17(月) 11:56:31.99
k1 = func(x(n),y(n))
k2 = func(x(n)+b*dx,y(n)+a*k1*dx)
g = p*k1 + q*k2
y(n+1) = y(n) + g*dx

x(n)=(n+1)*dx
ERR=abs(exp(x(n))-y(n+1))
if (mod(n+1,10).eq.0) then
write(6,200) x(n+1), y(n+1), ERR
write(11,200) x(n+1), y(n+1), ERR
end if

if(n==nmax) then
stop 'ended'
end if
n=n+1
go to 1

close(11)
200 format('x=', E13.6, ' result y=', E13.6, ' error ERR=', E13.6)
stop
end
216デフォルトの名無しさん
垢版 |
2013/06/17(月) 11:59:42.72
real*8 function func(x(n),y(n))
implicit real*8 x,y
integer n
real*8 x(0:1000)
real*8 y(0:1000)
func = y(n)
return
end function func


214-216はつながっています。
関数の副プログラムを利用したいのですが、認識してくれません。
どうすればよいでしょうか?
エラー箇所は、Two Main Programsというやつのみでした。
2013/06/18(火) 14:40:19.36
>>216
関数の定義の所がおかしい。x(n),y(n)→x,y
IMPLICIT文の文法がおかしい。括弧で変数をくくる必要あり。
real*8 function func(x,y)
implicit real*8 (x,y)

今のコンパイラは多少のエラーがあっても、適宜仮定してコンパイルを
続行するが、いまfunction定義の頭部が無視されてコンパイル続行されたため
end文が2回出てきて二個メインプログラムがあるように解釈されたと思われ。

F77的な古典的な書き方をしていて、77本を真面目に勉強しているのだと思うが、
(それはそれで大変結構だが)
副プログラムをMODULEに入れるとかF90以降の現代風にすると、
もっとエラーが容易に見つかる確率が上がると思う。
2013/07/01(月) NY:AN:NY.AN
最近の大学では数値計算+Fortranの教科書は何を使ってるんだい?
コンピュータの数値計算一切やらないまま入ってくる学生がいて自習してほしいんだが
ヤングに嫌がられないお勧めあるかね?
2013/07/05(金) NY:AN:NY.AN
ナウいヤング向けの言語はJavaとかか
220デフォルトの名無しさん
垢版 |
2013/07/11(木) NY:AN:NY.AN
自由端反射のプログラムで質問です。
program wave
implicit none
real,dimension(5,0:30)::f
integer::i,n,p,q,r,s,t,u,k
do s=0,30
do q=1,5
f(q,s)=0
end do
end do
do n=1,300
f(3,30)=0
f(3,0)=exp(-((n-30.)/10.)**2)
do k=0,28
f(3,k+1)=2*f(4,k)-f(5,k)+(f(4,k+1)-2*f(4,k)+f(4,k-1))/4.
end do
221デフォルトの名無しさん
垢版 |
2013/07/11(木) NY:AN:NY.AN
do p=0,30
f(1,p)=n
f(2,p)=p
write(*,*)f(1,p),f(2,p),f(3,p)
end do
write(*,*)
do t=0,30
f(5,t)=f(4,t)
f(4,t)=f(3,t)
end do
end do
end program wave
222デフォルトの名無しさん
垢版 |
2013/07/11(木) NY:AN:NY.AN
というプログラムを出力した結果たしか
1. 0. 0.00223
1. 1. 1.4848
ってなって最初fを全部0にしたのにf(3.2)が1.4848となります、何が悪いでしょうか?
2013/07/12(金) NY:AN:NY.AN
>>222
do k=0,28
f(3,k+1)=2*f(4,k)-f(5,k)+(f(4,k+1)-2*f(4,k)+f(4,k-1))/4.
end do

これでk=0の時、f(4,k-1)→f(4,-1)で配列はみだしだからじゃないか?
まずdebug mode サブスクリプト・チェックをかけて実行しろ!
2013/08/02(金) NY:AN:NY.ANID:Kz7Qk8/h!
openmp を使って並列化しようと思ってるんですが、スレッドセーフな副プログラムを作るのに気をつけるのってどういう点ですか?
save と common を使わなければいいだけでしょうか。
save を避けなければならないばあい、擬似乱数のように前の状態を保存しておかなければならないような副プログラムはどうやって作ったらいいでしょうか。
2013/08/04(日) NY:AN:NY.AN
引数で前の状態を渡し、引数に次の状態を戻す
呼び出し元スレッドと内容を共有するので、実引数は
private なのか share なのか明らかにすること
2013/08/04(日) NY:AN:NY.ANID:zEmYUazP!
なるほど。ありがとうございます。
2013/08/05(月) NY:AN:NY.AN
OpenMPとの整合はよく分からんが、F95以降では
pure接頭子で依存性の無さを保証できる。
というかコンパイラがチェックしてくれる。
228デフォルトの名無しさん
垢版 |
2013/08/06(火) NY:AN:NY.AN
Visual Basicで下記のバイナリ出力したグリッドをfortranで読み込ませようとしてますが,
できません.input statement requires too much data, unit 10
とでます.
229デフォルトの名無しさん
垢版 |
2013/08/06(火) NY:AN:NY.AN
Dim doutpgrid As New System.IO.BinaryWriter(New System.IO.FileStream(Outputfile, IO.FileMode.Create, IO.FileAccess.Write))
For i = 1 To nz
For k = 1 To ny
For j = 1 To nx
doutpgrid.Write(nheader)
doutpgrid.Write(dblX(j, k, i)) : doutpgrid.Write(dbly(j, k, i)) : doutpgrid.Write(dblz(j, k, i))
doutpgrid.Write(nfooter)
Next j
Next k
Next l
230デフォルトの名無しさん
垢版 |
2013/08/06(火) NY:AN:NY.AN
open(10,file='grid.dat',form='unformatted')
do 115 k=1,kmax1
do 115 j=1,jmax1
do 115 i=1,imax1
read(10) xd(i,j,k),yd(i,j,k),zd(i,j,k)
115 continue
close(10)
です.誰か教えてくださいnheaderなどはinteger, dblXはdoubleです.
2013/08/06(火) NY:AN:NY.AN
VBの事は、よく分からんが、少なくともFortran側でnheaderとnfooterを読むか
読み飛ばすかしないと、つじつまが合わないだろう。

いきなりエラーが出るなら、nheaderのintegerを三個の倍精度で読もうとして
要素が足りないと叱られたと思われる。
バイナリだとずれたまま読みそうな気もするが・・・
2013/08/06(火) NY:AN:NY.AN
unformatted で sequential なファイルは次のレコード(記録)の組を飛ばすのに
何バイト読み進めればいいかを各レコードの前後に整数値として記録しているらしい
レコードは1文の read/write で扱われる単位とみていいはず
(このせいで妙にファイルサイズが膨らんだりする)

>>229 nheader と nfooter の値を確認
2013/08/07(水) NY:AN:NY.AN
シーケンシャルなUnformattedなら、Fortran独自の形式だからVBの出力は
読めない気もする。
>>232の言うとおり、Fortranでは読みとばしとBACKSPACEでの逆行のために、
各レコードの前後にレコード長が記録されている。

F2003からの機能だが、STREAMモードで読むか、あるいはF77にこだわるなら
DIRECT形式で無理やり読む方法がある。どちらも読み込み単位が処理系によって
BYTEだったりWORDだったり依存性がるので調べる必要がある。
またDIRECT形式は大抵は普通にべた書きだが、処理系によってはヘッダが付いたりするので
これも調べる必要がある。

よく分かんないんだったら、素直に書式付とかCVS形式とかで出して
読むのが吉。
234デフォルトの名無しさん
垢版 |
2013/08/09(金) NY:AN:NY.AN
gfortranでポインタの初期値をnullにするコンパイルオプションをおしえていただけないでしょうか。


Linux上でintel fortran compilerでコンパイルしていたものを
windows上で動作させるために、g95とgfortranでコンパイルしようとしました。

ifortではデフォルトでポインタはallocateされていないのですが
g95やgfortranではそうではないようです。


g95では-fpointer=nullで初期値をnullにできるのですが
私のソースコードをコンパイルすると、コンパイラの内部エラーと言われます。

gfortranでは上記に対応するコンパイルオプションはないでしょうか
2013/08/10(土) NY:AN:NY.AN
internal compilation error って要するにコンパイラーのバグなんじゃ…
2013/08/28(水) NY:AN:NY.AN
初心者というか入り口にすら立ってないため質問させていただきます。

MUMPSっていうライブラリをMinGW環境で使いたいため
g95ってコンパイラをダウンロードしようとしているのですが
公式ページでもファイルが見つかりません。となって困ってます

みなさん、g95はどこから入手されているのでしょうか?
それともg95-MingW.exeが消されたのには何か理由があるのでしょうか?
2013/08/29(木) NY:AN:NY.AN
g95は最近メンテされてないから、gFortranでいけ。
たぶん大丈夫。
2013/09/10(火) 14:58:43.49
do 1100 III=1,400
*
if(QQP(III).eq.0.) go to 1100
NP=ifix(QPP*QQP(III))
*
do 1000 I=1,NP
*
E0=float(III)*50.-25. !
* Incident point 4mmφ
60 do IJK=1,2
IY(KR)=mod(IY(KR)+IY(JR),mmd)
X(IJK)=float(IY(KR)+1)/dmd
JR=JR-1
if(JR.eq.0) JR=55
KR=KR-1
if(KR.eq.0) KR=55
end do
2013/09/10(火) 15:00:46.05
CX00=(1.-X(1))*0.4
CY00=(1.-X(2))*0.4
*
CX0=25.+CX00 !
CY0=25.+CY00 !
CZ0=0. !
*
CA2=1.
SA2=0.
CB2=1.
SB2=0.
*
JJJ=1
JJJJ=0
*
* --------------------------------------------------------------
*
70 JJJJJ=0
*
if(E0.lt.10.) go to 880
*
XE0=log(E0)
ka=2
72 if(E0.lt.ATTEN(5,ka)) then
XAT11=log(ATTEN(1,ka))
2013/09/20(金) 09:08:24.47
なんだどうした?
241デフォルトの名無しさん
垢版 |
2013/09/26(木) 12:57:51.56
pointer(pvar,var(*))
これってどういう意図ですか?
2013/09/26(木) 13:30:22.80
メモリポインタ
2013/09/26(木) 22:50:44.43
それはクレイ・ポインタと呼ばれるもので、クレイのFortranにあった非標準命令。
だがクレイが普及していたアメリカでは準標準みたいになったので、いまでも結構多くのFortranで使える。

まぁFortran2003の命令で、(工夫すれば)置き換え可能なので、もうあまり使われない。
POINTER (pointer, pointee)
ポインタ(整数変数)にはポイントされるもの(pointee)の番地が入るようになる。
2013/10/01(火) 12:17:05.23
>>243
ありがとうございます。

Fortran77では
pointer()もmalloc()も非標準ということですか?
2013/10/02(水) 00:38:14.04
>>244
両方非標準。

FORTRAN77以前では動的にメモリーを確保するための拡張命令があったり、
あるいはCのルーチンをリンクしていた。
Fotran90以降ではallocate命令が入った。

そのプログラムが書かれた対象マシンが分かるなら、ググればそれ用のFORTRAN77のリファレンス・マニュアルが落ちていると思う。
2013/10/08(火) 10:10:31.65
>>245
遅くなりましたが、
ありがとうございます
2013/10/13(日) 00:13:41.19
77で書いてあるプログラムが今のコンパイラで動くようにデバックしているのですが
common文で宣言している変数をmoduleでグローバル変数に変えたら、equivalence文でエラーが出てしまいます。
そこでこのequivalence文のところを変えようと思うのですが、90/95ので代わりとなる構文ってありますか?
2013/10/13(日) 01:48:53.15
>>247
直接の代替はない。
Fortran90/95で推奨されているEQUIVALENCEの代替は、TRANSFER関数でメモリー内容を別メモリーに
移せというもの。EQUIVALENCEのメモリー共有とは違い、二つの変数間の型変換を伴わない内容の代入にあたる。

古い時代にCOMMONやEQUIVALENCEがあったのはメモリーが少なくて、同じ領域を使いまわしたかったから。
COMMONやEQUIVALENCEによるメモリー共用が、コンパイラの最適化を妨げるから廃止に向かった。

COMMONを単なるグローバル変数とみなすと、移植で非常にめんどくさいことになることがままある。


なおFORTRAN77はFortran90に完全に含まれているので、今のコンパイラでも多少のオプション変更で書き直さなくても動くはず。
2013/10/13(日) 13:51:31.72
>>248
ありがとうございます!
コード書き換えすのは止めてもう少しオプションいじくってみます。
2013/10/15(火) 22:40:32.54
初期値も何も与えてない変数の値って0ですよね?
それが0ではなくとてつもなくおおきな値になることってありますか?
2013/10/15(火) 22:51:06.34
いいえ
はい
2013/10/15(火) 23:17:41.03
>>251
まじっすか
2013/10/16(水) 01:37:15.62
変数がゼロになってるなんて思ってたのかよw
コップや皿を洗わないで飲み食いするタイプか?
2013/10/16(水) 01:42:01.37
規格上は不定らしいよ。
ttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14106144349
ttp://ruby.gfd-dennou.org/products/ruby-dcl/ruby-dcl-doc/math1/node9.html

超初心者用スレなのに、みんな厳しいね…
2013/10/16(水) 02:01:47.72
初心者スレだったか、めんごめんご、すまんこ、おまんこ。

昔の日本の大型計算機のFORTRANは0クリアしていることが多かった。
IBMはごみだらけの状態でよこしてた。

今もリンカのオプションでゼロクリアできるものが多い。
2013/10/16(水) 23:48:35.58
なるほろ〜不定なんですね。

いや実は昔のプログラムを今のコンパイラで動かしているところなんですが
通常なら0であるぺき変数が変な値になってしまいうまく動かなかったんです。

オプションで0クリアにしたらうごくかもしれません。ありがとうございました。
2013/11/07(木) 23:56:00.54
2013/11/08(金) 11:47:40.89
デバッグしているのですが
THDFEというサブルーチンで仮引数(x)を動的割付け配列で宣言し直したところ

”THDFEにおいて存在しないもしくは誤った引数仕様ブロックです。ー仮引数x(第三番目)は割付け配列です。”

とエラーが出たんですが。意味がわかりません。詳しく教えて下さいm(__)m
2013/11/09(土) 00:08:06.89
この質問じゃ情報少なすぎ。
せめてエラーメッセージそのものを貼るべき。

まぁ呼び出し側の配列が、割り付け属性を持っていないという程度の誤りだろう。
2013/11/09(土) 10:26:20.66
>>259
”THDFEにおいて存在しないもしくは誤った引数仕様ブロックです。ー仮引数x(第三番目)は割付け配列です。”
一応これがエラーメッセージそのものなんです。

>>まぁ呼び出し側の配列が、割り付け属性を持っていないという程度の誤りだろう。
THDFEは外部副プログラムなんですが。このブロックでの仮引数は割付属性を持たないってことでいいんでしょうか?
2013/11/09(土) 13:01:13.70
それはエラーメッセージそのものじゃないだろ。
エラー番号とか全部込々で貼れよ。
質問の仕方が悪いといつまでも答えが出ないぞ。

大体、サブルーチン側で文句を言われているのか、呼び出し側で文句を言われているのか
それすら判然としないだろ。
2013/11/09(土) 16:41:00.84
>>261
すみません・・・

これがエラーメッセージです。

実行時エラー: ../sorcefile(先生)/HTHDFE.f90(1): THDFEにおいて存在しないもしくは誤った引用仕様ブロックです - 仮引数X(第3番目)は割付け配列です
致命的なエラーでプログラムが終了しました

サブルーチン(THDFE)側のほうでエラーメッセージがでます。
2013/11/09(土) 19:18:40.37
>>262
interface文を書いてないとか?
それと仮引数に割り付け配列を指定できるのはFortran2003以降のはず。
Fortran95の拡張仕様TR15581をコンパイラがサポートしていれば問題ないけど。
2013/11/09(土) 19:54:41.21
>>263
コンパイラはfortranbuilder5.3.1でfortran2003にも対応しています。
integerface文を加えれば問題ないでしょうか?
2013/11/09(土) 20:33:20.29
integerfaceじゃなくてinterfaceなw
2013/11/09(土) 21:14:09.73
>>264
手元にあるFortran2003の言語仕様(draft)の257頁から抜粋すると

"A procedure shall have an explicit interface if it is referenced and
The procedure has a dummy argument that has the ALLOCATABLE attribute"

となっている。"explicit interface"が必須だからinterface文を書けばいいと思う。
それと、紛らわしいのでFortran2003ならファイルの拡張子も変えたら?
2013/11/10(日) 00:04:40.45
>>265
ほんとだww interfaceってうったつもりだったのにww
>>266
そうします。ありがとうございました!
2013/11/10(日) 00:04:41.77
interface 書くより、サブルーチンをmoduleに入れたほうが楽でいいぞ。
2013/11/10(日) 00:13:46.52
スレ違いかもしれないけど、とあるf77プログラムのクローンを作りたいのだけど、
どこまでやれば別のプログラムと認められるんだろう?
入出力仕様や数式まで立ち帰って、スクラッチから書けば完璧なんだろうけど、
作業量的に厳しいというのが本音。
固定形式から自由形式に書き換えた程度じゃダメかな。
参考になるようなサイトとか有れば教えてください。
2013/11/10(日) 00:23:01.23
引用とか数行とかの範疇を超えて、見ながら書いたのなら原型を留めてなくても派生物じゃね?
極端な話他言語に移植しても、ロジックが同じなら派生物
2013/11/10(日) 00:28:13.72
横からすまんが、Intel Fortranではソース・ファイルの拡張子は、
固定形式が.fないし.forで、自由形式は.f90になっていて、
.f95とか.f03とかは、存在が間違っているとされているんだが、
ホントのとこはどうなの?
2013/11/10(日) 00:35:04.17
>>271
Intel Fortran compiler 14.0のリファレンスではそうなっている。
2013/11/10(日) 02:11:25.87
>>272
intel がそうなっているのは知っているが、実際はどうなのか?
他のベンダーはどうなのかね?
274デフォルトの名無しさん
垢版 |
2013/11/10(日) 07:18:49.19
>>273
言語仕様では拡張子は規定していないのでコンパイラ依存。
275デフォルトの名無しさん
垢版 |
2013/11/10(日) 19:10:31.00
すみません、equivalence が理解できず、もしご存じの方が
いらっしゃいましたら、アドバイスを頂けないでしょうか。

勉強のために下記のテストコードを書いてみました。
まず、整数型配列 a1 と a2、実数型配列 a3 に適当な値を代入し、
その後 equivalence文によって a1(1) と a(1) のアドレスを一致させ
配列 a に配列 a1 〜 a3 の値をコピーしてみました。

最後に write 文で配列 a と、配列 a1 〜 a3 までの値を
それぞれ出力させて比較したのですが、両者では実数型配列
a3 の値だけ異なっています。

私のつたない理解では、おそらく equivalence で実数型配列
a3 の値を整数型配列 a にコピーしたのが原因なのではないかと
思っているのですが、配列 a3 を用いずに 配列 a から実数型を
出力させるにはどのようにしたらよろしいのでしょうか?  
(dble(a(i)) i=201〜300 としても駄目でした。)

お教え頂けますと大変ありがたいです。
どうぞよろしくお願い致します。
276275
垢版 |
2013/11/10(日) 19:11:25.56
なお、コードは以下になります。
どうぞよろしくお願い致します。

program test
implicit none

integer(kind = 4), dimension(300) :: a
integer(kind = 4), dimension(100) :: a1, a2
real(kind = 8), dimension(100) :: a3

equivalence ( a1(1), a(1) )
common /array/ a1, a2, a3
integer(kind = 4) :: i

do i = 1, 100
a1(i) = i*1
a2(i) = i*2
a3(i) = i*3.0d0
end do

do i = 1, 300
write(10, *) a(i)
end do

do i = 1, 100
write(11, *) a1(i), a2(i), a3(i)
end do

end
277269
垢版 |
2013/11/10(日) 23:00:46.41
>>270
やっぱり肝はロジックかぁ。かと言って、違う答えが帰ってきても困るしなぁ。
まぁ、元のソース見れる奴が、クローン作りました、でもこっちのソースは非公開。
なんて言っても、周りから見たら限りなく黒に近いグレーだわな。
割に合わなさそうだし、諦めるかな。

>>275
実数型と整数型だと、メモリの使い方が違うから、
実数型は入っている領域(の一部)を整数型で解釈しても、
実数型で入れた値にはなりません。という説明で良いのかな。
2013/11/10(日) 23:29:50.05
>>275
イマイチ何がしたのか分からんが、こうすれば一応望みの結果は得られる。

do i = 1, 300,2
write(10, *) transfer([a(i),a(i+1)], 0.0d0)
end do

これは、x86のようなリトル・エンディアンCPU向けの場合。
PowerPCとかビッグ・エンディアンの場合は、[a(i+1),a(i)]
2013/11/10(日) 23:56:18.99
[ ]はFortran2003、F90/95なら(/ /)で。配列構成子(array constructor)

倍精度実数と整数をEquivalenceで同じ番地を共有させているから、
整数2個毎が倍精度実数1個に対応している。
(KINDの数字は必ずしもバイト数に対応すると限らないが、慣習から仮定して)

エンディアンによって、メモリー上の倍精度実数の上位と下位が入れ替わるので
適宜対応する必要がある。

それをF90以降のTRANSFER関数で、メモリー内容を第二引数の型で解釈している。

単精度実数なら他に単にFORMATを実数用にして強行突破する方法も考えられる。
倍精度の時は難しいかな??
2013/11/14(木) 00:03:06.56
Fortran2015に関するまとめサイトとかないかね?
今度は何を付け加えるのさ?
2013/11/19(火) 00:19:07.21
すんません。
数値計算する際、expとかの値が大きすぎたり、小さすぎたりしてオーバーフローしたり、exp(x)のx が限りなくゼロに近い時とか、欲しい値が得られません。
みんなはどうやって回避してますか?

よくよく考えたらexp1000 とかオーバーフローしますよね。
2013/11/19(火) 10:23:13.29
ここの人はフォートランはわからないから他いけ
2013/11/19(火) 18:58:29.45
>>281
精度の問題がないなら対数を取って計算すればいいじゃない
というか、それは浮動小数点演算の本質的な問題だから
まず数値計算の基礎を勉強することをお勧めする
2013/11/19(火) 19:01:27.99
書き込んでから気付いたが、もしexp(1000)の値を実際に表示したいのなら
多倍長計算とかしかないな
2013/11/19(火) 23:54:23.18
>>283
何がオススメですか?参考書的なもので。
ちなみにプランク関数とか値がどでかい物やらプランク定数のようなちっこいものまぜまぜして計算することが多いので困ってます。やはり対数でやるべき?
2013/11/21(木) 22:58:26.48
プランク常数とか絡むなら、それを1に規格化して計算するのが常識だろ。
まず少し基礎的な本から読め。
2013/11/23(土) 22:34:38.75
みんなどんな環境でやってるんだろ
Cygwin+Emacs?
2013/11/24(日) 13:01:18.20
コマンドプロンプト+メモ帳 まじで
2013/11/24(日) 17:24:01.41
>>286
え?そうなんですか?
だからその基本的な本というのを紹介してくれませんか?

フォートランの本
2013/11/24(日) 17:42:02.66
>>289
言語の本より数値計算(数学)の本のがいいんでないか?
2013/11/26(火) 01:02:17.85
>>289
伊理正夫の「数値計算の常識」の中に無次元化の章があったはず。
大した事書いてないが常識として程度は知っておくべき。
大体、無次元化していないと、素人・非常識・DQN・支那チョン・ごみ・カス・クズ扱いされる。

この本の前半は面白いし為になるので買って損はない。


シュレディンガー方程式を解きたいんだったら、原子スペクトルの本なら大抵、原子単位系(atomic unit)への変換の章が
頭の方にある(エネルギーをハートリー、長さをボーア半径にする)。この辺は少し詳しい量子力学の本にもある。

まぁ今ではエネルギーの単位をハートリーでなくてリードベルグに取ることが多い気もするが。
クーロン項の分子が1になるか2になるかの違いだ。
2013/11/27(水) 07:09:22.09
>>291
うぉぉ。。。ありがとうございます。
かなり貴重なお話しです。
まずは「数値計算の常識」買ってみます。
293デフォルトの名無しさん
垢版 |
2013/12/31(火) 13:22:54.27
データから近似式を出すソフトみたいのないですかね?できればフリーで。
Fitykではなんだかできなかった…
2014/01/01(水) 00:01:57.16
それはFORTRANスレで聞く内容じゃない
2014/01/01(水) 02:29:24.68
>>294
どこで聞けばいいの?
わからないならレスしないであげれば?、
2014/01/01(水) 12:29:00.04
>>295
何でそう思ったの?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況