[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 01/23 11:34 / Filesize : 200 KB / Number-of Response : 550
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

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



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

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


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

くだすれFORTRAN(超初心者用)その2
pc11.2ch.net/test/read.cgi/tech/1164121236/

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

159 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:52:02 ]
Vistaで使えるフリーのfortran90コンパイラってありますか?

160 名前:デフォルトの名無しさん [2008/02/13(水) 17:24:29 ]
どうやってもこのエラーが消えないけどどうしたらいいんだろう?

assignment between arrays of differing rank

161 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 17:38:11 ]
>>159
Vista + Cygwin + gfortran or g95

162 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 00:50:54 ]
>>159
Silverfrost の FTN95 かな。Vistaで動くかは知らんがw
ttp://www.silverfrost.com/11/ftn95/overview.asp

>>160
配列の次元があっていないと言っているので、そのエラー行をよく見直すしかない。


163 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:44:10 ]
FORTRAN90 を勉強している者ですが構造体を下記のプログラムのように
使いたいのですがエラーがでてしまいます。m と n は、上位ルーチンのみ
で固定させたい(下位ルーチンにはサブルーチンの引数でサイズを渡したい)
のですが上手い方法をお教え頂けますでしょうか?構造体を使わず、
a(n,m) i(n,m) と配列にすればいいのでしょうが構造体を使って
書きたいので質問させて頂きました。よろしくお願い致します。m(_ _)m
program test
implicit none
integer,parameter::m = 1
integer,parameter::n = 1
type kouzou
real(8)::a(n)
integer::l(n)
end type kouzou
type(kouzou)::data(m)
call dataset(data,m)
write(*,*) data(1)%a(1)
write(*,*) data(1)%l(1)
end program
subroutine dataset(data,m,n)
implicit none
integer,intent(in)::m,n
type kouzou
real(8)::a(n)
integer::l(n)
end type kouzou
type(kouzou),intent(out)::data(m)
data(1)%a(1) = 3.0d+00
data(1)%l(1) = 2
return
end

164 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 01:23:42 ]
>>163
記憶が正しければ、それはFortran95以前では出来ない。
TYPEの中の型やサイズを引数にするのは、Fortran2003で導入される機能だ。
Fortran95以前で実現するには、POINTER属性で宣言してメインでALLOCATEするのかな?
ただ、単にTYPEの宣言を1ッ箇所で済ませたいだけならば、独立したMODULEでTYPEを宣言して
あとは残りのルーチンでそれをUSEすればよいと思う。

MODULE m_type
IMPLICIT NONE
integer,parameter::n = 1
type kouzou
real(8)::a(n)
integer::l(n)
end type kouzou
END MODULE m_type
!
MODULE m_subs
USE m_type
CONTAINS
subroutine dataset(data_,m)
implicit none
integer,intent(in)::m
type(kouzou),intent(out)::data_(m)
data_(1)%a(1) = 3.0d+00
data_(1)%l(1) = 2
return
end subroutine dataset
END MODULE m_subs
!
program test
USE m_subs
(以下略  (ここではm_typeをカスケードに呼んだが

165 名前:デフォルトの名無しさん [2008/02/17(日) 11:02:41 ]
スレチと思うけど質問させてください。
計算機によく入っているbsubとかqsubって打ってjobを実行するソフトって
何て言う名前ですか?フリーウェアですか?

166 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:10:40 ]
>>165
それはジョブ管理システムというものだ。
ググレばなんか出てくるだろう。

普通はメーカー毎・OS毎に独自のものがある。
LinuxとかだとLSFというのが主流の気がする。
UNIXはTSS処理を売りにしていたので、むかしJOB管理が糞だった。


167 名前:165 [2008/02/17(日) 14:40:22 ]
>>166

ググって色々調べてみたところ「Generic NQS」ってのが
フリーみたいですね。
自宅で数値計算をして遊んでみようと思いまして(;^_^A
どうも返答有り難うございました。



168 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 17:25:42 ]
Intel Visual Fortran での、Windows用グラフィック・ルーチンを作っています。
プロトタイプができているので、興味がある人は見てみてください。
ttp://d.hatena.ne.jp/fortran66/

やりたいことは、昔のBASICやXYプロッタ時代のようなグラフィックス・ルーチンで、
普通のコンソール用プログラムから簡単に呼び出せて、かつ対話的に絵を描けるものです。

変な何をやっているのかまったく不明なライブラリ集とかをインストールすることなく、軽く実現するのが目標です。
大げさなものにはせず、各人で好きなように拡張できるような、見通しの良い最小構成が出来たら良いかなと
思っています。




169 名前:163 mailto:sage [2008/02/17(日) 23:44:38 ]
>>164 さん
丁寧なご回答どうもありがとうございます!! 返信が遅くなり
申し訳ございません。今、intel fortran compiler 10.1 で
メイン部分を下記にして動くことを確認できました。
Fortran2003で導入される機能ということで驚いています。

program test
use m_subs
implicit none
integer,parameter::m = 1
type(kouzou)::data_(m)
call dataset(data_,m)
write(*,*) data_(1)%a(1)
write(*,*) data_(1)%l(1)
end program


170 名前:163 mailto:sage [2008/02/17(日) 23:45:55 ]
実は、私がやろうとしていたのは、構造体のサイズ m とその中の要素の
サイズ n を下記のように入力データのようなものから動的に取得して
構造体の確保を実現させようと考えておりました。
下記のようなプログラムの構造体バージョンが目標でした。
下記の配列バージョンだと確保した配列全部をサブルーチンの
引数でひきずっていかなければならないと思うのですが構造体で
定義しておけば配列をパックにした構造体 1 つを引数で渡せると
考えました。
164 さんに教えて頂いたプログラムの MODULE m_type での
構造体の中の要素のサイズ n は、動的(データで決定)ではなく
parameter 文で静的にコンパイル時に確定させなければ
ならないんですよね?
長々と書いてしまって申し訳ありません。m(_ _)m

171 名前:163 mailto:sage [2008/02/17(日) 23:46:47 ]
program test
implicit none
integer::m,n
read(5,*) m,n
call test2(m,n)
end program
!
subroutine test2(m,n)
implicit none
integer,intent(in)::m,n
real(8),allocatable::a(:,:)
integer,allocatable::l(:,:)
allocate(a(n,m),l(n,m))
call dataset(a,l,n,m)
write(*,*) a(1,1)
write(*,*) l(1,1)
deallocate(a,l)
return
end
!
subroutine dataset(a,l,n,m)
implicit none
integer,intent(in)::m,n
real(8),intent(out)::a(n,m)
integer,intent(out)::l(n,m)
a(1,1) = 3.0d+00
l(1,1) = 2
return
end

172 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 02:32:34 ]
>>170 そういうことなら、以下のように出来る。
MODULE m_type
IMPLICIT NONE
type kouzou
real(8), POINTER::a(:)
integer, POINTER::l(:)
end type kouzou
END MODULE m_type
!
MODULE m_subs
USE m_type
CONTAINS
subroutine dataset(data_,m)
implicit none
integer,intent(in)::m
type(kouzou),intent(in out)::data_(m) ← INOUTにしないと駄目みたい。
data_(1)%a(1) = 3.0d+00
data_(1)%l(1) = 2
return
end subroutine dataset
END MODULE m_subs
!
program test
USE m_subs
implicit none
integer,parameter::m = 1
INTEGER :: n = 2
type(kouzou)::data_(m)
ALLOCATE(data_(1)%a(n), data_(1)%l(n))
call dataset(data_,m)
(以下略
ただALLOCATEは配列の全要素にいちいちやらないと駄目。解放も面倒。コンパイラによってはPOINTERはALLOCATEでも可。

173 名前:163 mailto:sage [2008/02/18(月) 14:44:48 ]
>>172 さん、本当に感謝です!! 上手くいきました。
ありがとうございます!! m(_ _)m
下記にすることで動的に確保できました。
上手い方法があるもんですね...
ただ、指摘された以下の場所は、私が試したところでは、inout で
なくても OK でした。
type(kouzou),intent(out)::data_(m)
あと、解放ですが deallocate(data_) 一発で OK?

program test
use m_subs
implicit none
type(kouzou),allocatable::data_(:)
integer::i,j,m,n
read(*,*) m,n
allocate(data_(m))
do j = 1,m
do i = 1,n
allocate(data_(j)%a(i),data_(j)%l(i))
end do
end do
call dataset(data_,m)
write(*,*) data_(1)%a(1)
write(*,*) data_(1)%l(1)
deallocate(data_)
end program

174 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 23:15:43 ]
>>173
多分Intelのコンパイラなら、POINTERをALLOCATABLEにしてもよいはず。
Fortran2003で可能になる機能だが実装されている。

>あと、解放ですが deallocate(data_) 一発で OK?
多分、ALLOCATEしたときと同じようにいちいち解放しないと駄目だと思う。
少なくともPOINTERの時は。ALLOCTABLEの時はいいかもしれないが、忘れたw 調べてチョ


175 名前:163 mailto:sage [2008/02/19(火) 00:01:59 ]
>>174
構造体とポインタの使い方が分かって非常にためになりました。
ありがとうございます。色々と変えてみて試してみます。m(_ _)m


176 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:37:08 ]
単精度をコンパイルオプション一発で倍精度にすることってできますか?

177 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:59:45 ]
>>176
> 単精度をコンパイルオプション一発で倍精度にすることってできますか?

コンパイラは何?



178 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 00:01:57 ]
>>176
一般的に、コンパイラには自動で倍精度にするautodblオプションがあることが多いので、マニュアル見ろ。

IMPLICIT REAL*8(A-H,O-Z)を入れるやり方もあるが、定数も倍精度にしないと下の桁にごみが入るので中々
容易い道ではない。


179 名前:490 mailto:sage [2008/02/27(水) 02:25:14 ]
ちょっとずれた質問かもしれませんが、
皆さんプログラムを書く(デバッグ)するときに使っているツールで「これは便利だ」と思うツールを教えていただけませんか?
わたしは大体vimで書いているのですが、tagexplorer.vimというスクリプトを使って、関数などを別のウィンドウに出したりしているのですが...
最近emacsで書いてみたいなあと思うようになって情報を集めているのですが、あまり情報が見つからないんです。
Cだとcscopeとか便利なツールがあるみたいなんですが...

180 名前:デフォルトの名無しさん [2008/02/27(水) 13:43:03 ]
>>176
intel fortran だと、 -r8 で一発、
fujitsu だと -RR8 かなにか、でまぁとにかく一発。
念のためにと、parameter文や sin などの intrinsic な関数を適当に使った、
適当に1000回くらいiterateする短いコードを
最初から倍精度で書いたやつと、
単精度で書いたコードをオプションつけてコンパイルして計算したら、
計算の結果はbinary で一致した。
ほかのコンパイラでも似たようなもんだろう。


181 名前:176 mailto:sage [2008/02/28(木) 20:15:57 ]
>>178
Intelコンパイラでした。マニュアル見たら速攻見つかりました・・すいませんでした。
autodblはHPやIBMのコンパイラでの名前みたいですね。

>>180
さすがにロードモジュールはバイナリ一致じゃないですよね。
わざわざ調べて頂いてありがとうございました。

182 名前:180 mailto:sage [2008/02/29(金) 13:13:23 ]
>>181

べっ、別にあんたのためになんたらかんたら。

昔作ったのをもっかいコンパイル&実行してみただけ。
intel fortranはまめにバージョンを上げてくれてありがたいんだけど、
時々挙動が変わるからね。以前やったときはできあがった実行ファイルも
同一になったよ。バージョンによっては実行ファイル作成時の日時が
格納されるのか(推定)、全く同じファイルを全く同じオプションでコンパイルしても
同一でない実行ファイルが出来ることがあったけど。
今使っている version 9.1 だとサイズは同じで先頭部分の100バイトくらい微妙に違う。


183 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 13:24:30 ]
>>182
うわ、ツンドラだツンドラだ

184 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 21:19:56 ]
>全く同じファイルを全く同じオプションでコンパイルしても
>同一でない実行ファイルが出来ることがあったけど。
「このファイル同じだっけ?」って確認をcmpでやる癖のある自分としては、ちょっと厄介だなぁ

IntelFortranは今10.1だっけ?


185 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 14:27:05 ]
Windowsの実行形式ファイルのヘッダには作成日時が入る箇所があるので、
IVFに限らず仕様通りに実行ファイルを生成するコンパイラ、というかリンカを使えば
同一ソースを同じオプションでコンパイルしても完全に同じ実行ファイルにはならない。

ttp://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/intro.html

まあ、頭の方がちょっと違ってくるだけなので、違っている部分の位置で
同じ内容かどうかは判断できると思うが。

186 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:44:48 ]
Debian+gfortranでやっています。
勉強で、以下のようなプログラムを作ってみたのですが、コンパイルエラーとなってしまいます。

program test
implicit none
real y
y=hoge(3.0)
stop
end

real function hoge(x)
real x
hoge=2.0
return
end

コンパイルするとy=hoge(3.0)のところで、
Function 'hoge' at (1) has no IMPLICIT type
といわれます。どのように対処すればよいのでしょうか。

187 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:39:51 ]
>>186
IMPLICIT NONEなのに関数hoge()の宣言がないから。
対処法としては
・関数hoge()を主プログラムtestの内部手続きにする。
・testの中にhoge()のINTERFACE宣言を書く。
・hoge()を含むMODULEを作る。
など。



188 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:47:26 ]
real hogeをtestで宣言するかimplicit noneを削れ


189 名前:デフォルトの名無しさん [2008/03/07(金) 00:40:07 ]
ここって、Linux環境でのFortranのインストールの仕方って
質問していいんでしょうか?

Linuxの方でも場違いな気がいたしまして。。

190 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 01:18:17 ]
>>189
GCC入ってないのか?

191 名前:デフォルトの名無しさん [2008/03/07(金) 14:40:22 ]
えっと、説明不足ですみません。
ここで質問してもいいかわかりませんが、とりあえず
Intel Fortran を Ubuntuにインストールしようとしたのですが、

まず、Ubuntuにデフォルトで開発環境が入っていないとか
libstdc++.so.5が
libstdc++5 だという話は解決したのですが、

コンパイラ、デバッガのインストールが終わって
Please Enter to Continue

Enter
を押しても、反応がなく、ただ改行する所で止まってます。

いろいろ調べて、Ubuntuのコミュニティで同様の投稿があったのですが、
なんだかよくわからず。(英語のページだからというのもありますが。。)

Intelが発表している内容は、
ifort とかのファイルにある
"/bin/sh"を"/bin/bash"に書き換えろとか書いてあるんですが、
すでに書き換わっていたりして。

もうお手上げです。。。

助けて下さい。。よろしくお願いします。

192 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 16:53:48 ]
>>191
> インストールしようとした

どうやって?

例えばl_fc_p_10.1.011_ia32.tar.gzをダウンロードして、
展開して出来たl_fc_p_10.1.011_ia32に移動して、
install.shを実行したということ?
ubuntuのパッケージはdebだから、それにrpmのパッケージをそのまま
インストール出来るのだろうか。

私はalienでdebに変換してインストールした。

193 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:28:14 ]
HPUX上の fortran90 にて

プログラムコードに”program main”と書かないと実行時に
/usr/lib/hpux64/dld.so: Unsatisfied code symbol 'main' in load module '/usr/lib/hpux64/libc.so.1'.
って表示されるんですが、”program main”を省略出来ないのは何故でしょうか?

何か環境変数で設定すればよきに計らってくれるのでしょうか?

194 名前:デフォルトの名無しさん [2008/03/07(金) 20:25:15 ]
>>192
仰るとおり、install.shからです。

intelのインストーラが起動すると、
ubuntuではg++が入ってないと出来ないとは書いてましたが、
debとかrpmという言葉は出てきませんでした。

宜しければ、どうやってインストールされたか
詳しく教えていただくと有難いです。。

195 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:57:43 ]
>>194
私はDebianは使っているけど、Ubuntuは使ったことがない。
以下はDebian使いの私のインストール方法なので、Ubuntuに
そのまま適用出来るかどうかは知らない。また、あくまで私のやり方なので、
もっと楽なやり方があれば指摘して欲しい。

$ tar zxf l_fc_p_10.1.013_ia32.tar.gz
$ cd l_fc_p_10.1.013_ia32/data
$ fakeroot -u alien intel-ifort101013-10.1.013-1.i386.rpm
$ fakeroot -u alien intel-iidb101013-10.1.013-1.i386.rpm
$ su
# dpkg -i intel-ifort101013_10.1.013-2_i386.deb
# dpkg -i intel-iidb101013_10.1.013-2_i386.deb
# cd /opt/intel/fc/10.1.013/bin
ifort, ifortvars.csh, ifortvars.shを開き、<INSTALLDIR>という
文字列を、全て/opt/intel/fc/10.1.013に置換する。
私の場合、viで開き、
:%s/<INSTALLDIR>/\/opt\/intel\/fc\/10.1.013/g
を実行した。
# cd /opt/intel/idb/10.1.013/bin
idbvars.csh, idbvars.shを開き、<INSTALLDIR>という
文字列を、全て/opt/intel/idb/10.1.013に置換する。
ログイン時に上の*vars.shか*vars.cshファイルを読みこむように、
シェルの設定ファイルを変更する。私の場合はbashを使っているので、
~/.bashrcに
. /opt/intel/fc/10.1.013/bin/ifortvars.sh
. /opt/intel/idb/10.1.013/bin/idbvars.sh
を追加した。


196 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:03:43 ]
>>193
考えにくいな。もっと詳しく。
最小例で。


197 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:28:57 ]
>>195 さん
ありがとうございます。
実は、Linux自体初心者で勉強し始めたばかりでなかなか困ってます。
195さんのように、ファイルをrpmからdebに直してされている方はUbuntuの方でいらっしゃいました。

僕もやってみましたが、こちらはデフォルトのエディタで、optファイル内は書込み禁止になっているらしくて、
その対処法がなくストップしてしまいました。

つまり、<INSTALLDIR>の置換操作が出来なかったところです。

あと、ログイン時に読み込むファイルの設定の仕方がとか、
そういったファイルの場所がわからなくて、困っていました。

やはり普通に実行しては無理っぽいんですね。
ありがとうございました。そのあたりを勉強しなおして、もう一度やってみます。


どうやら、問題はLinuxの操作の知識不足にあるようですから。。。




198 名前:192,195 mailto:sage [2008/03/08(土) 02:08:25 ]
>>197
さようなら。


199 名前:デフォルトの名無しさん [2008/03/08(土) 11:49:08 ]
サブルーチンsabuで計算結果をディスプレイに一行出力するのですが、
open文の後ではその出力がなぜかNANになってしまいます。


program main
implicit real*8 (a-h,o-z)

call sabu(1.0, 2.0)
call sabu(1.0, 2.0)
open(unit=24, file='gomi.txt', status='unknown')
call subu(1.0, 2.0)
call sabu(1.0, 2.0)
close(24)

stop
end


のように呼ぶと、必ずopen文の次から全てNANになります。
sabuの引数を変えたり、open文の装置識別子やファイル名を変えてみてもダメでした。
また、open文前後のsabuをcallする回数を変えてもダメでした。

sabu中では何個かのサブルーチンをcallしていて、その中でopen文は合計1行だけあります。
その装置番号は2で、装置識別子が重複しているわけでは無いようです。


原因は何でしょうか?宜しくお願いします。
cygwinでg77を使っています。
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)

200 名前:デフォルトの名無しさん [2008/03/08(土) 11:59:22 ]
今の時代FORTRAN使うメリットってあるんですか?

201 名前:デフォルトの名無しさん [2008/03/08(土) 12:29:51 ]
TSS

202 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 12:35:40 ]
>>199

sabu() の中で開けたものは、sabu() を出る前にちゃんと閉じてる?

sabu() の中身が分からないので何とも…。

203 名前:199 mailto:sage [2008/03/08(土) 14:30:47 ]
>>202
レス有難うございます。
sabu()中で、

open(2,file='input.dat',status='old')

に続いて、read()した後close()があり、

write(*,*)'debug: close begin'
close(2)
write(*,*)'debug: close end'

とwriteで挟んでみたところ正しく表示されるので、
close文は実行されているのだと思います。

204 名前:199 mailto:sage [2008/03/08(土) 14:31:49 ]
担当の先生によるとsabu以下は公開してだめだそうで、
一部を以下に写してみます(中略が要領を得ないときはご指摘ください)
cccccccccccccccccccccccccccccccccccccccc
subroutine sabu (xvalue,zvalue)
implicit real*8 (a-h,o-z)
< 中略(commonとdimension) >

open(2,file='input.dat',status='old')
< 中略(doとcontinueに挟まれてread) >
write(*,*)'debug: close begin'
close(2)
write(*,*)'debug: close end'
call sub1
<中略(ifとdoに挟まれて変数へ代入)>
call sub2(x,eps)
write(*,2000)(df(i),i=1,10)
2000 format(10e15.3)

return
end

205 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 21:49:47 ]
よくわかりませんが、
mainとsabuでそれぞれにopen文があるので多重openになっていませんか?

206 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 23:50:39 ]
>>204
情報が足りなくて全くのあてずっぽで書くが、昔のプログラムはAUTOMATIC変数がSAVE属性が
あるかのごとく仮定していることがあるので、コンパイラのオプションでSTATIC属性にしてみそ。


207 名前:199 mailto:sage [2008/03/09(日) 11:51:38 ]
>>205
レス有難うございます。
今writeでデバッグした限りですが、同じファイルを2回openはしてないように見えます。

流れとしては、メインprogramから、
open(unit=24, file='gomi.txt', status='unknown')

サブルーチンをcall

open(2,file='input.dat',status='old')

close(2)

サブルーチンからreturn

close(24)
となっています。


>>206
レス有難うございます。
アドバイスの通りg77で'-fno-automatic'を付けてみたらNANが無くなりました!

www-jlc.kek.jp/~fujiik/mklinux/memo/g77/porting3-j.html
>-fno-automatic: を指定すると、変数を static にアロケート します。
>これは、全てのルーチンに SAVE を付けるのと同値です。

大変感謝です。2週間これで詰まってました。
sabu含むすべてのサブルーチンでSAVEはありませんでした。



208 名前:206 mailto:sage [2008/03/09(日) 16:16:07 ]
>>207
解決おめ。
少し補足すると、サブルーチンを呼んで帰った後、もう一回同じサブルーチンを呼んだときに、
サブルーチン内のローカル変数が前回の値を保持するかどうかが問題になっている。

FORTRAN77ではSAVE文ないしオプションが定義されて、明示的に前回の結果を取っておくことが
出来るようになった。規格ではFORTRAN77では前回の値を保障していなかったはず、
FORTRAN66では未定義かな?

しかし慣習的に、FORTRAN66時代から、前回の結果が残っているような処理系の実装が主流だったために、
かつては大抵のFORTRAN77処理系ではSAVEが暗黙にデフォになっていた、と思う。

Fortran90時代になって、動的にメモリーを取ることが普通になって、SAVEを明示的に指定しないと、
毎回任意のメモリーが割り当てられることがデフォになった気がする。ゆえにローカル変数内に
非数値的なビット列(NaN)のごみが入っていたりする。

昔のプログラムではFORTRAN77でもSAVEを仮定していることが多い。大抵はそれで動いていた。
メモリーを動的に確保せず、リンク・ロード時に静的にメモリーを割り付けていた。

というわけでg77が歴史的事情を尊重しないのが悪いと言ってみるw


NaNは配列はみだしか初期値のごみででることが多いのと、77スタイルのサブルーチンを出してきたので
推論した。


209 名前:デフォルトの名無しさん [2008/03/10(月) 21:14:08 ]
初めまして。超初心者なんで宜しくお願いします。
使っている環境はF90 g++ debian です。

以下 ソースです
program dotp4
implicit none
real(8), allocatable :: u(:), v(:) !allocatable属性を付けて割り付け配列を宣言
integer :: n
write(*,'(a\)') 'input n :' !入力を促す表示(改行の抑制)
read (*,*) n
allocate (u(n), v(n)) !nを用いて配列の割り付けを行う
write(*,'(a\)') 'input u(1 : n)'
read(*,*) u(1 : n) !配列uの要素の値を読みとる
write(*,'(a\)') 'input v(1 : n)'
read(*,*) v(1 : n) !配列vの要素の値を読みとる
write(*,*) 'dp = ' , dot_product(u,v) !内積の計算
deallocate (u ,v)
end program dotp4

エラーは (col. 23) remark: LOOP WAS VECTORIZED.
です。
DO 文でベクトルを使うと大抵この文がでて来ます。

どうぞ宜しくお願いします (ちなみにallocateが赤くなりません)

210 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:22:28 ]
>>209

> write(*,'(a\)') 'input n :' !入力を促す表示(改行の抑制)

ここの '(a\)' に対してなら文句を言われた。なので '(a\)' を全て * に変えてコンパイルしたら通った。因みに gfortran でだ。g95 ではもとのママでも何も言われなかった。実行については共に特に問題無さそうだった。

211 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:50:00 ]
>>209
>エラーは (col. 23) remark: LOOP WAS VECTORIZED.
>です。

これはエラーじゃない。リマークであって、警告ですらない。

単にDO-LOOPをベクトル化したという事を念のため教えてくれているに過ぎない。
つまりSSEを用いた最適化をしたという事を教えてくれている。

初心者なら、気にしなくてよい。


212 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 08:32:04 ]
>>211

そのリマークってオプションなしのコンパイルでも出るんでしょうか?

213 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 11:48:37 ]
>>212
処理系によって違うのでマニュアルを読んでもらうのが一番確実。
たとえば Intel Fortran の場合は、SSEによるベクトル化に関しては、
オプションを指定しないと何も言わない。

一般的に言えば、error, warning, info ( ここでは remark ) のような、
おおよそ3分類で、完全なるあやまち、分かってやってるならOK、念のための御注進 
にあたるメッセージをデフォールトで言う。

うざいならオプションで抑止できるのが普通。
まぁコンパイラのオプションの説明嫁。



214 名前:デフォルトの名無しさん [2008/03/11(火) 15:47:45 ]
>>210
>>211
ありがとうございます。
ちゃんと実行できました!
remarkはエラーでは無いんですね。把握しました。
精進します

215 名前:デフォルトの名無しさん [2008/03/13(木) 03:18:38 ]
教えて下さい。
0の二乗が正しく計算できません。
なぜでしょうか?
MacOSXでもg95で同じような計算結果になります。

プログラム hoge.f95
program hoge
write(*,*) 0**2, 0.e0**2, 0.d0**2
end program hoge

以下、コマンド
> g95 hoge.f90

> a.exe
1 1. 1.
> g95 -v
Using built-in specs.
Target:
Configured with: /src/G95/gcc-4.1.2/configure --prefix=/mingw
--enable-languages=c --with-ld=/mingw/bin/ld --with-as=/mingw/bin/as
--host=i386-pc-mingw32 --enable-threads --disable-nls
--disable-win32-registry --enable-sjlj-exceptions --enable-libgcj
--without-x
Thread model: win32
gcc version 4.1.2 (g95 0.91!) Feb 7 2008

環境
Windows XP Professional Service Pack 2

216 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 11:25:15 ]
>>215

> MacOSXでもg95で同じような計算結果になります。

MacOSX の g95 では上手く行っていますが?ちなみに PPC 版 Tiger。なので言っている事の意味ワカラン。

217 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:11:50 ]
>>215
おまい、質問が下手だなw
うまい質問をするとうまい答えが返ってくるし、まずい質問をするとまずい答えしか返ってこないぞよ。

とにかくそれだけでは答えようが無い。



218 名前:215 [2008/03/17(月) 02:47:25 ]
>>216
マカーの友人もTigerだそうです。
コンパイラのバージョンを教えてください。

>>217
他にどういった情報が必要でしょうか?
分かりにくいということですか?
この問題を解決したいので教えてください。

この「0の巾乗が計算出来ない」という問題はあまり有名ではないのでしょうか?
a=0.のときに
a**2が計算できないのは致命的なバグなような気もします。

周りのg95ユーザに聞いても解決しませんでした。
(やはり、他のシステムでも0の巾乗は計算出来ていません。)
ちなみに私は普段はgfortranをvine上で使っていますが、このような結果にはなりませんでした。

219 名前:216 mailto:sage [2008/03/17(月) 05:38:14 ]
>>218
同じソースを g77 でコンパイルしても正しい結果が出た。ln -s hoge.f95 hoge.f で偽装(?)した。

% ./a.out
0 0. 0.

gfortran は試してない。fink でやったら簡単だけど、意義を感じない。
因みに g95 と gfortran のどっちが良さげ?>識者の皆様


> MacOSXでもg95で同じような計算結果になります。
はヲマイがやったんぢゃないのか?自分で確認したことと、他人に聞いた事は切り分けてクレ。


% g95 --version
G95 (GCC 4.0.3 (g95 0.90!) Jul 27 2006)
Copyright (C) 2002-2005 Free Software Foundation, Inc.

----------

% g77 --version
GNU Fortran (GCC) 3.4.4
Copyright (C) 2004 Free Software Foundation, Inc.

220 名前:215 [2008/03/17(月) 14:13:34 ]
>>216
ありがとうございます。
わかりにくくて申し訳ありません。
MacOSXは友人がやりました。

g95(windows),gfortran(vine),ifort(ubuntu)は私がまわしました。
(ifortでも同じプログラムを回してみました。)
gfortran,ifortは正しい結果が得られます。
g95だけ正しく計算できません。
バージョンの問題でしょうか?
友人にバージョンを聞いてみます。

221 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 21:57:57 ]
>>220
The G95 project にバイナリが色々置いてあったので試してみたら

Stable Version (G95 (GCC 4.0.3 (g95 0.90!) Jul 27 2006)) だと
0 0. 0.

になったが、
Current Snapshot (G95 (GCC 4.0.3 (g95 0.91!) Feb 27 2008)) だと
1 1. 1.

になった。

-S オプションでアセンプリ出力を見てみると
いきなり定数の 1 を書き込んでいるようなので
コンパイラのバグだろうな。

まあ、Snapshot なんでバグの1つや2つ有るだろう。
Stable Version の方を使うかバグ報告出して直してもらえ。


>>219
ちょっと前まではg95の方が安定してたような気がする。
でも最近はGCC4に対応してgfortranが標準で付いてくるLinuxが増えたので
こちらの方が一般的になるのだろうな。
#それにたしかg95の方はまだOpenMPに対応してなかったはず。

222 名前:216 mailto:sage [2008/03/18(火) 17:47:26 ]
> >>219
> ちょっと前まではg95の方が安定してたような気がする。
> でも最近はGCC4に対応してgfortranが標準で付いてくるLinuxが増えたので
> こちらの方が一般的になるのだろうな。
> #それにたしかg95の方はまだOpenMPに対応してなかったはず。

有り難うございます。確かに最近導入したLinuxはほぼ gfortran が付いていますね。
g95 は付いて無いですが。私は並列はしないので、OpenMP は対応していなくても
良いのですが、周りから聞かれたら gfortran の方を勧めることにします。

223 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 21:13:10 ]
Windowsで使う分にはg95も手軽でいいんだがな。

224 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 14:46:06 ]
>>222
できるよ。
以上。
はい、次。

225 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 21:02:15 ]
ん?

226 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 00:26:18 ]
$OMP imifu

227 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 01:48:45 ]
本当に初心者なのですが失礼します
分関数定義文について勉強してるんですが、
プログラムが読めても、作れないくらいのレベルです

文関数定義分を使って、関数f(x)=x^2+x+1を  
0≦x≦1の区間について、0,1ごとにxを変化させた場合の
結果を出力するプログラムを作りたいのですが、
わかる方いましたらお願いします



228 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 13:49:39 ]
>>227
ドイツとかフランスで教育を受けた人?小数点がそっち風なんですけど
FTN77で作動確認、間違ってたりナンセンスでも許してね。
      DO 10 I=0,10,1
      X=0.1*I
      Y=F(X)
   10 WRITE (6,20) X,Y
      STOP
   20 FORMAT(1H ,' X = ',F4.1,2X,'Y = ',F6.3)
      END
C
      FUNCTION F(X)
      F=X**2+X+1
      RETURN
      END

229 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 21:00:37 ]
志村ー、文関数!文関数!

230 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 22:13:38 ]
文関数はobsoleteで、今は使えてもいずれ使えなくなる筈。

231 名前:志村228 mailto:sage [2008/04/01(火) 22:26:01 ]
間違えちまっただ〜
      F(X)=X**2+X+1
      DO 10 I=0,10,1
      X=0.1*I
      Y=F(X)
   10 WRITE (6,20) X,Y
      STOP
   20 FORMAT(1H ,' X = ',F4.1,2X,'Y = ',F6.3)
      END

232 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 23:00:00 ]
>>230
心配すんな!
obsolete指定されても大概のコンパイラは機能を残すから。
今までもそうだったし、これからもそうだろうw

Fortranは、地層が積み重なった言語で面白い。直交性の悪さが自然言語っぽいw


233 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 00:01:34 ]
Fortran95の廃止事項もほとんどの処理系で残ってるからなぁ

234 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 01:03:12 ]
とは言え初心者に廃止事項を進めるわけにもいかんだろ
お行儀の良いコーディングした方がバグは減るだろうし

235 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 13:09:47 ]
FORTRAN77で書かれたサブルーチンプログラム(sub.for)を
fortran90のメインプログラムmain.f90で呼び出して使うにはどうすれば良いのでしょうか。
コンパイラはg95/cygwinを使ってます

236 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:17:15 ]
テスト

237 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:34:30 ]
>>235
g95 main.f90 sub.for

ぢゃだめなん?(めんどくさいので、確認はしてない)



238 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 23:00:33 ]
>>237
レスありがとうございまs
私も並べてコンパイルすれば良いと思ってたんですけど駄目でした。
main.f90の中にuse文を作れば良いのでしょうか?

239 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 23:16:59 ]
>>238
1.EXTERNAL文で外部関数であると表明する。
2.INTERFACE BLOCKでINTERFACEをちゃんと書く。
3.MODULEの中に置いて、USE文で引用する。

1から3の順で面倒くさいが、F90的にはこのましく行儀よくなる。

240 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:06:08 ]
>>239
すみません、折角頂いたアドバイスを理解しきれていないのですが
sub.forの中身をfortran90で書き直して、モジュール化するということですか?
77のままでは無理でしょうか?粘着に質問してしまい恐縮でs

241 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:47:43 ]
>>240
1.
PROGRAM f90
IMPLICIT NONE....
EXTERNAL f77noName....
....
CALL f77noName...
...

2.
PROGRAM f90
IMPLICIT NONE
INTERFACE
SUBROUTINE f77... 云々
END INTERFACE

MODULE unko
CONTAINS
subroutine f77(....)
.....
end
END MODULE unko

PROGRAM homosexual
USE unko
IMPLICIT NONE

CALL f77(....)

END


242 名前:241 mailto:sage [2008/04/10(木) 00:49:04 ]
すまん 行Overで肝心の3番を消してしまった。
スレ汚しご容赦。

3.
MODULE unko
CONTAINS
subroutine f77(....)
.....
end
END MODULE unko

PROGRAM homosexual
USE unko
IMPLICIT NONE

CALL f77(....)

END


243 名前:240 mailto:sage [2008/04/10(木) 09:32:50 ]
おお!うまくいきそうです!
ご教授どうもありがとうございます!!

244 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:16:37 ]
質問です。read文で数字の羅列とコメントで構成されたテキストファイルから値を読み取ろうとしています。

OPEN (3,FILE='a.dat',STATUS='OLD')
.....
READ(3,*)
READ(3,*) FNUM
READ(3,*)
READ(3,*) DTM
READ(3,*)
READ(3,*) FTMP
READ(3,*)
......
という感じです。読み込むファイルの方はテキストで
.....
FNUM=
1.5E16
DTM=
0.5E-6
FTMP=
303.
......
というようになっています。ところが、他の値と同じように読み込んでいるのに

FNUM=
1.5E16
DTM=
0.5E-6

のところだけうまく読み込めず、値が0になってしまいます。何度も確認しましたが、ちゃんとその場所を読んでいるはずですし、
別の場所で代入していたりはしません。しょうがないので、テキストの末尾に読み込めなかった値をダブって記入し、
そこから読み込むとうまく読めました。ひとまずこれで問題はないのですが、原因が思い当たらずあまりにも気持ち悪いので、
思い当たる原因があれば教えていただけないでしょうか?よろしくお願いします。

245 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 02:01:04 ]
>>244
これだけでは情報が足りない。
もう少しkwsk


246 名前:244 mailto:sage [2008/04/14(月) 18:09:41 ]
えーと、すみません。普段数式の部分しかいじってないものでFORTRAN自体の
知識があまりないのでどのあたりが必要な情報なのかいまいち分からないのですが、
とりあえず計算用のコードで、パラメータの設定をソースコードと分離したくて

SUBROUTINE PARAMETER
COMMON /COMP / FNUM,DTM....

FNUM=1.5E16
DTM=0.5E-6
....

のような記述を

SUBROUTINE PARAMETER
COMMON /COMP / FNUM,DTM....

OPEN (3,FILE='a.dat',STATUS='OLD')
READ(3,*)
READ(3,*) FNUM
READ(3,*)
READ(3,*) DTM
....

と、以下のようなtxtファイル

FNUM=
1.5E16
DTM=
0.5E-6
....

の組み合わせで行うようにしたいのです。で、問題は前レスに書いたようなことなのですが、他に必要な情報ありますでしょうか?

247 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 16:07:47 ]
245ではないが、やってみた。

$ cat test0415.f90
PROGRAM TEST0415
OPEN (3,FILE='a.dat',STATUS='OLD')
READ(3,*)
READ(3,*) FNUM
READ(3,*)
READ(3,*) DTM
CLOSE(3)
WRITE(*,*) FNUM
WRITE(*,*) DTM
PROGRAM TEST0415

$ cat a.dat
FNUM=
1.5E16
DTM=
0.5E-6
$ gfortran --version
GNU Fortran (Debian 4.3.0-3) 4.3.1 20080401 (prerelease)
Copyright (C) 2008 Free Software Foundation, Inc.

$ gfortran -o test0415 test0415.f90
$ ./test0415
1.50000004E+16
4.99999999E-07
$
ということで、問題無く読めた。




248 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 17:21:33 ]
>>247
> ということで、問題無く読めた。

ということはコンパイラ依存か?
>>244 はそういう情報を出していないし。

249 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 14:35:39 ]
>>247
えーと、すみません、基本的には問題なく読めるのですが、全く同じやりかたを
してるはずの別の行で、何故か値がおかしくなる部分が存在するんです。
ここには書ききれませんでしたが本当はもっと膨大な値を読み込んでます。

>>248
コンパイラはSalfordFTN77ですが、別のコンパイラでやっても同じ結果になります。

250 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 14:52:33 ]
>>249
「値がおかしくなる」ための条件を自分で見付け出して。
サブルーチン内で正しく読めているか確認。そして、呼び出し元の
メインプログラムで同じ値を返すか確認。
問題の提示が曖昧でどうにもできない。


251 名前:244 mailto:sage [2008/04/18(金) 16:50:45 ]
>>250
うーん、多分なんですが自己解決しました。読み込みの都合上、
a.datの中では、読み込みの都合上(DO文で回すためです)
使わない要素にもダミーの数値を入れてたんですが、
COMMON文のがわで、「使わないんだからいいだろ」と思って
ダミーの文まで次元を用意してませんでした。
要するに存在しない配列の要素に数値を代入してました。
つまり

LIM(1,1)=10
LIM(1,2)=10
TEMP(1)=273

LIM(2,1)=20
LIM(2,2)=20
TEMP(2)=0←ダミーの数値

っていう場合に、

COMMON/SURFACE/LIM(2,2),TEMP(1)

としてました。

COMMON/SURFACE/LIM(2,2),TEMP(2)

にしたら直ったようです。ダメだったんですね…

252 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 02:48:59 ]
>>251
その説明ではよく分からんが、COMMONは記憶領域の共有であって、
グローバル変数だと思っていると正しくない。

COMMONの最後の要素の長さが違うだけなら、問題は起きないと思うが
(これは無名COMMONだけだったか?最近COMMONを使わないから細部を忘れた)
途中の要素の長さを変えたらそこから先の番地が全部ずれることになる。

253 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 18:25:11 ]
integer hoge(100)と宣言すると1が始点になり、hoge(1)〜hoge(100)までのメモリが確保されますが、
hoge(0)はどこかを指しているんでしょうか?
hoge(0)=123と代入しても特に怒られなかったのですが、やらないほうがいい行為でしょうか?

254 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 18:49:45 ]
>>253
> hoge(0)=123と代入しても特に怒られなかったのですが、やらないほうがいい行為でしょうか?

そりゃやらん方がえぇ。そもそもソレをする事にどんな意味があるの?
そういうのは C でも怒られないよね。で、メモリ絡みのバグに繋がるんだっけ?

コンパイラによるけど、定義範囲外にアクセスしたときに(プログラムを)強制中断するオプションがある。

255 名前:253 mailto:sage [2008/04/22(火) 22:27:34 ]
>>254
やはりそうですよね、常識で考えれば・・・
pgi6.4です。普通にコンパイルできて、結果も問題なかったんですが、アレって思いまして。

256 名前:254 mailto:sage [2008/04/23(水) 13:20:16 ]
>>255
文法上の違反ではない(はずだ)からコンパイルは出来る。
コンパイルオプションで警告を出すようにでもすれば、何
か言われるかもしれないが、何も付けなければ、文法上の
問題が無いからスルー。実行結果まで保証しない。

257 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 13:25:28 ]
2次元座標(x,y)を(r,theta)に変換する関数って用意されてないですか?
atan(y/x)とyの符号で場合分けしてましたが



258 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 18:01:36 ]
F77の勉強始めて3日目のの初心者なんですが、練習にオセロのプログラムを作ろうとして行き詰まってます。

BAN(8,8)の数列で、オセロのマスを指定してるんですが、あるマスBAN(m,n)に石を置いた時にその周り8方向のマスを調べる方法がわかりません。
だれか教えてください。

259 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 23:54:16 ]
>>255
Fortranはスピード優先なので、配列のはみだしは普通チェックしない。
コンパイラの実行時オプションでチェックするように出来るのが普通だが、あくまでデバッグ用の位置づけ。
今の場合、配列をはみだして他の変数を上書きしている可能性が高い。
MAPオプションでメモリー上に変数がどうアロケートされているかを調べれば、どの変数が壊されているか
見当がつく。

>>257
そういう関数はFortranの標準には無い。
今の場合、ATAN(y/x)よりもATAN2(y、x)を使うほうが適切、X=0.0の場合の0割エラーなどを避けられる。
詳しくはマニュアル味噌。

>>258
素直に前後左右斜めを調べるしかないべ。
DO i=-1,1
DO j = -1,1
CALL check(ix + i, iy + j)
END DO
END DO
枡をはみだす端っこの処理を簡素化するには、配列を0〜9までで宣言して端っこマスは
別途の方法で処理するとかできる。空=0、白=1、l黒=2、マスの外=−999とか。







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

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

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