1 :
デフォルトの名無しさん :
05/01/03 12:49:22
2 :
デフォルトの名無しさん :05/01/03 12:50:01
3 :
デフォルトの名無しさん :05/01/03 12:50:32
4 :
デフォルトの名無しさん :05/01/03 12:51:04
5 :
デフォルトの名無しさん :05/01/03 12:51:35
6 :
デフォルトの名無しさん :05/01/03 12:51:57
前スレが落ちたようなので、立ててみました。 というわけで、後は任せた。 オレはもう寝る。
10 :
デフォルトの名無しさん :05/01/13 13:20:51
配列変数の宣言なんですが、引数の範囲を実数で指定すればうまくいく。 引数の範囲を同じ値の変数で指定すれば範囲が大きいときにstackoverflowがでる。 という現象が起こっています。 なぜでしょうか?
11 :
デフォルトの名無しさん :05/01/14 04:20:26
>>10 >配列変数の宣言なんですが、引数の範囲を実数で指定すればうまくいく。
>引数の範囲を同じ値の変数で指定すれば範囲が大きいときにstackoverflowがでる。
いまいちよく解らないんだが。
SUBROUTINE FOO(A, N)
REAL A(N)
・・・
とかやってるってこと?
どうも失礼します・・・ fortran77使ってます。 temp = v(im,jm,km)*(x(number)-r(1))*(z(number)-r(2))*(y(number)-r(3)) & +v(im,jm,kp)*(x(number)-r(1))*(z(number)-r(2))*(r(3)-y(number-1)) & +v(ip,jm,km)*(r(1)-x(number-1))*(z(number)-r(2))*(y(number)-r(3)) & +v(ip,jm,kp)*(r(1)-x(number-1))*(z(number)-r(2))*(r(3)-y(number-1)) & +v(ip,jp,km)*(r(1)-x(number-1))*(r(2)-z(number-1))*(y(number)-r(3)) & +v(ip,jp,kp)*(r(1)-x(number-1))*(r(2)-z(number-1))*(r(3)-y(number-1)) & +v(im,jp,km)*(x(number)-r(1))*(r(2)-z(number-1))*(y(number)-r(3)) & +v(im,jp,kp)*(x(number)-r(1))*(r(2)-z(number-1))*(r(3)-y(number-1)) この括弧の数はあってると思うんですが、最後の行で、 Syntax error, found END-OF-STATEMENT when expecting one of: , ) & +v(im,jp,kp)*(x(number)-r(1))*(r(2)-z(number-1))*(r(3)-y(number-1)) -----------------------------------------------------------------------------------^ というエラーが。。。括弧以外に原因があるのでしょうか??
13 :
デフォルトの名無しさん :05/01/15 08:20:16
>>11 全くそのとおりです。説明が不足でした。
サブルーチン呼び出し時に値を渡し、
サブルーチン内でその変数を使って配列を宣言しているのです。
想像するに 10 は
「配列変数の宣言なんですが、添え字の範囲を定数で指定すればうまくいく。
添え字の範囲を、引数で渡される変数で指定すれば範囲が大きいときにstackoverflowがでる。
という現象が起こっています。
なぜでしょうか? 」
といいたいのでは?
であれば、
・前半は、配列は、ふつーの配列であり、ヒープからメモリが割り当てられる
・後半は、配列は、自動割付配列となり、スタックからメモリが割り当てられる
対処法は
・
>>15 にあるように、スタックサイズをあげる
・F90で書き、配列をALLOCATEによって確保する
あたりか?
ここの過去ログはどこかに置いていませんか?
20 :
デフォルトの名無しさん :05/01/27 08:36:09
3次関数の最小自乗法による係数決定のやり方はどこかにありませんか?
unformattedなファイル読み込みルーチン作製中です。 unformattedで書き込んだファイルのreadは全く問題ないのですが、 openの際に、うっかりそうでないファイルを指定した時の振舞で悩んでます。 やりたいことは「ファイル先頭をチラっと見る。意図してないファイル形式なら その旨のエラー出して終了」です。ですが、ウチの環境で不適切なファイルを unformattedでopenすると、readの段で強制的にプログラムが停止してしまいます。 これではエラー出すヒマが無く、一方で(私の知識の範囲内では)ファイルの判断には readをするしかないため、どうにもジレンマに陥ってしまいました。 何かイイ方法御存知の方いらっしゃいますでしょうか? 当方 RHEL3(amd64) + Intel Fortran 8.1 であります。
25 :
デフォルトの名無しさん :05/01/29 20:10:08
データファイルから読み込むのに、一行に一つのデータでファイルを作ると 読み込むのに、一行に "," 区切りで複数のデータを与えたら一つ目のデータ しか正しく読めず、あとのデータが????に成ります。 どうしたらいいのでしょうか。 Salford FTN77です。
Fortranで ・Cの仕様書工房 ・Cppunit みたいなツールってないでしょうか?
27 :
デフォルトの名無しさん :05/02/07 13:19:58
変数 / 関数の型を表示したり、変数の共有のされ具合が分かる emacs lisp を探しています。 fortran はハンパじゃないので etags だけではちょっと無理です。。。
>>25 データの数かFORMATの指定が間違ってない?
うちの環境では","で区切っても正しく読み込めたけど。
29 :
デフォルトの名無しさん :05/02/14 17:13:31
基礎的なことなんですがx^nを求める関数は何でしょうか?
x**n
Fortranの規格名称のことでちょっと教えてください。 『Fortran 95』というふうに95の前にスペースを入れるのと, 『Fortran95』というふうにスペースを入れないのと, どちらが正しいのでしょうか?
どちらも正しくない。それは通称だ。
特に決まりは無いと思うよ。ぐぐる君の意見だと『Fortran 95』の勝ちだね。 "Fortran 95" の検索結果 約 107,000 件 "Fortran95" の検索結果 約 12,800 件
35 :
デフォルトの名無しさん :05/02/15 21:55:33
>>31 ちなみに Fortran 95 の規格は
ANSI X3J3/96-007
JIS X 3001:1998
ISO/IEC 1539-1:1997
内容は全部同じ。
>>35 わ,そうだったんですか!
詳しいフォロー,ありがとうございました。
WinXP のパソコンで Fortran 90 のコーディングをしたいのですが, Salford FTN95 を使うか,それとも,うちの職場にあった唯一の PC用Fortranコンパイラである Fortran PowerStation 4.0 を使うか, 迷っています。 (他の商品版を買うのは高くて,今のところは躊躇しています) Win95の頃に発売された Fortran PowerStation 4.0 は Win XP に インストールしてもコンパイルなどは正常に行われるのでしょうか?
>>37 WindowsXP上で、FORTRAN77のソースをコンパイル、正常実行できた記憶があるよ
39 :
デフォルトの名無しさん :05/02/20 09:27:24
> 37 cygwin上でgcc-4.0(CVS版ですが)をmakeしてみる. gfortranができるが これがf90. 簡単なやつでテストしてみましたが, よっぽどf90の機能を 使ってない限り, 大丈夫そうでした.
g95 の linux バイナリがあるということは, cygwin か coLinux を入れればフォートランランランってことなんじゃないかな.
g95なら
>>3 にWindows用のバイナリも置いてあるわけだが。
Windows XP をサポートしている商用版の Fortran 90 或いは Fortran 95 コンパイラで お薦めのものがあったら教えてください。
↑ できれば日本語マニュアルがあって,便利なライブラリも付属しているものが良いですが‥‥。 ご存じのかた,よろしくお願いします m(_ _)m"
>>43 Intel の Visual Fortran
何をするのに「便利な」ライブラリが欲しいのか知らないが
Windows上でグラフィックが使える QuickWin や
Pro版にはIMSLも付いている。
また付属ではないが、Windows上の事実上の標準なので
MKL や Lapack(95) 、 f90gl 等、有名どころのライブラリは
大抵使える。
>>45 さん,ありがとうございました。
ライブラリの件ですが,目指しているのは地球のダイナモの成因となる
外核のMHDシミュレーションなので,その数値計算に便利なライブラリが
あればと考えています(地球流体電脳ライブラリが既に存在してはいますが)。
g95って,ホームページには There are still bugs buried here and there. (あちらこちらに バグがまだ埋まっている)と書いてありますが,どういうバグなのでしょうか? コンパイルや計算が正しく行われなかったりするのでしょうか?
48 :
デフォルトの名無しさん :05/02/23 09:47:51
>>48 情報ありがとうございました。
早速見てみます。
50 :
デフォルトの名無しさん :05/02/25 08:41:43
あるsubroutineの中からその属するsubroutineと同じsubroutineを呼び出したのですが どうすればいいでしょう? 下記のようなプログラムを書きたいのですが コンパイルできません。 program main call hoge end subroutine hoge write(6,*) "hello world" call hoge return end
>>50 f90の場合だと再帰的呼び出しにすれば大丈夫でしょう。サブルーチン宣言の頭に recursive をつけるだけでいいんじゃないでしょうか?
recursive subroutine hoge
>>50 ちゃんと再帰から抜けるようにしとけよ。
無限ループやるなよ。
ちょっとお聞きしたいのですが,write文でcsv形式を書くにはどうしたらいいでしょう? write (10,'(50d15.7)') TT,(U(j)/K(j), j=1,NMax) 上のようなwrite文を書くとします.その際,csv形式で出力したいのですが,'(50d15.7)'というような書き方をするときに「カンマ」をどうやって紛れこませるか?--ということをお聞きしたいのです. write(10,1000) TT,(U(j)/K(j), j=1,NMax) 1000 format(d15.7,',',d15.7,','d15.7) というような形式で書くのならわかるのですが...何十回も繰りかえすのはメンドイもので.御存じの方よろしくお願いします.
>>53 自己レスです.
write (10,"(49(d15.7,','),d15.7)") TT,(U(j)/K(j),j=1,NMax)
と書けばうまく逝きました.
失礼しました.
55 :
名無しさん :05/03/03 14:57:29
57 :
名無しさん :05/03/03 15:26:46
>>56 すんません。
昔、同じプログラムをNEC98(5インチ時代)に使ったことあってそん時は問題なかったんですよね。
DOSプロンプトのあとにexeファイル名(TWINSPAN)を入れて実行させると、inputデータファイルを尋ねてくるのでそのファイル名を入れてリターンすると
「Cannot Open Error file "F90.EER", error #151」
てのが出て終わってしまいます。
中身はそのまま触ってないので、これ以上のことはわからないのですが・・・
>>57 > 「Cannot Open Error file "F90.EER", error #151」
"F90.EER" ではなく "LF90.EER" では?
Run time error messages from LF90
ttp://agbu.une.edu.au/~kmeyer/errmsg.html > 151 File specified STATUS= "OLD" doesn't exist (see "Input/Output" in the Essential Lahey Fortran 90 Reference).
ようするに、入力ファイルが無い or 名前が違う。
59 :
名無しさん :05/03/03 18:10:54
>>58 ありがとうございます。
そうです「LF90.EER」でした。済みません。
入力ファイルがないとは、inputデータファイルが読めていないということでしょうか。
データ行の1文目は読んでいるんですが。
それか、もはや元のファイルがないのかな。
済みませんあまりに素人で。
gfortran(GCC4.0)でnamelist読みこませた人います? &abc de=5 fg=3.1 &end だと読み込まず &abc de=5 fg=3.1/ でもだめでした。 方言があるんですかね。
↑です。 使っているプログラムでうまくいかなかったのでテストプログラムを作ってみました。 その結果、結果が異なりましたので訂正します。 以下のプログラムコンパイルして実行するとエラーになります。 FC3 gcc4-gfortran-4.0.0.29.x86_64.rpm programe main integer i,j,k dimension j(10) character*20 c namelist /n1/i,j,k,c read(5,nml=n1) write(6,n1) end ./hoge &n1 i=20 k=3 j=1,2,3,4,5,6,7,8,9,0 c='test' &end cannot match a namelist variable g77だとコンパイルして実行すると、正常に動きます。 いろいろ探したらg95に行き当たりました。これだと正常にコンパイル,実行できました。 g95(gcc 4.0.0 20050124 (g95) Mar 12 2005) gcc4.1コレクションも試しましたが、このバグは、直っていませんでした。
ずいぶん前のことですみませんが,ご存じのかた教えて下さい。 MS-FORTRAN Ver.5.1 は Fortran 90 に似て非なる物だったという記憶があるのですが, ふと思い立って,8年くらい前に買った森北出版の 「FORTRAN 77 と Fortran 90」 の 「2部:Fortran 90編 Fortran 90とMS・FORTRAN」を見て 自分で確かめようとしたら,本棚から行方不明になってて 確かめることができませんでした。 MS-FORTRAN Ver.5.1 は Fortran 90 と同一のものだったのか, あるいは Fortran 90 に独自拡張を加えただったのか, それとも,似ているけど違うものだったのか ご存じのかた,教えて下さい。
63 :
デフォルトの名無しさん :05/03/20 08:30:04
>>62 実際にMS-FORTRANを使ったことはないですのが
手元に「FORTRAN 77 と Fortran 90」があったので
確認してみたところ、MS-FORTRANは
"Fortran 90 の一部機能を含む独自拡張仕様"
のようです。
F90との主な違いは
・継続行の指示記号は "&" ではなく "-"
・構造体の宣言は TYPE ではなく SURUCTURE
・ポインタ、WHERE文、モジュール等がない
などだそうです。
>>63 解説情報をアップして下さって,本当にありがとうございました。助かりました。
日曜の朝早くから妙な話題につきあわせてしまい,すみませんでした。
再度すみません。 もうひとつ教えていただきたいことがあるのですが,「FORTRAN 77 と Fortran 90」 の本で 扱われている MS-FORTRAN について,本の中でバージョン番号は書かれていますでしょうか?
>>65 書籍では「Microsoft FORTRAN V5.1」を用いたということで、巻末の参考図書に
マイクロソフトの「Microsoft FORTRAN - Reference -」(1991)
が挙げられています。
ちなみに Fortran 90 の方は「NAGWare f90 Compiler」でテストしたということです。
(2003年5月20日発行の第1版第7刷で確認)
>>66 詳細な情報をいただき,感謝申し上げます。
二度もお答え下さり,本当にありがとうございました。
68 :
デフォルトの名無しさん :2005/03/27(日) 01:22:58
GUI WindowsアプリにFORTRANのソースを組み込みたいのだけれど、どうしたらいい?
69 :
デフォルトの名無しさん :2005/03/27(日) 15:29:34
>>68 @VFで、GUI WIN32アプリをFortranで組む。
AC/C++でGUI組んで、C/C++からFortranの関数を呼ぶ。
>>68 CVFならCOM DLLをつくるという手もある。
>>68 ほとんどのコンパイラが DLL を作れます.
あとはシンボルを調べれば好きな言語から呼べます.
73 :
デフォルトの名無しさん :2005/03/31(木) 23:09:58
Intel fortran compiler 8.0 for linuxを使っています。 プログラムの中でサイズの大きいファイルを開こうとすると、 forrtl: File too large forrtl: severe (30); open failure , unit 10, file 〜 というエラーが出て止まってしまいます。 このような場合はどう対処すればいいのでしょうか。 どなたかご存知の方がおられましたら、どうかよろしくお願いします。
>>73 100Gのファイルでも開こうとしたのか?
75 :
73 :2005/04/03(日) 01:07:16
約4Gです。
2G以下のファイルに分ける
77 :
分かんにゃいからHELP。 :2005/04/03(日) 11:02:57
例えば、「Input No.:」と出力させた直後に改行せず入力したい場合には どのようなコードにすればいいのでしょうか? いろんなテキストを見たけど載ってない…。
78 :
分かんにゃいからHELP。 :2005/04/03(日) 11:06:24
あと、もう一つあります。 「write(*,*) 'へろー,わーるど?'」と 「print*, 'へろー,わーるど?'」とでは本質的にどう違うんですか?
write(*,*) 顔に見える print*, 顔に見えない
81 :
分かんにゃいからHELP。 :2005/04/03(日) 19:03:17
>>79 ヒント、アリガトウございました。使っているのは 90 の方です。
「character NO」を宣言しなければならないんですね。
あと、「advance」ですよね。
「write(*,'(A)',advance='NO')」のように使っていますが、「'(A)'」は
文字列の指定を意味しているんですか?
例えば「'(I)'」の時なんかは整数かな、と推測できるのですが「'(A)'」に
ついては馴染みがないんで教えて欲しいです。
82 :
73 :2005/04/03(日) 21:36:34
2GB以上のファイルを読むためのオプションみたいなものはないものでしょうか。
>>82 一般的な32 ビットプラットフォームのLinuxでは,最大ファイルサイズが2Gバイトに制限されているので、
@64 ビット環境でコンパイルする。
A32 ビットアーキテクチャなら、LinuxのカーネルをLarge File Supportが有効な新しいものに変える。
84 :
73 :2005/04/04(月) 17:54:48
アドバイスありがとうございます。 こちらでも調べてみましたが、Large File Supportはカーネル2.4から組み込まれているみたいです。 今私が使っているlinuxのカーネルは2.6なのですが、Large File Supportは有効にはなっていないのでしょうか。 それとも他に何か原因があるのでしょうか。
85 :
デフォルトの名無しさん :2005/04/04(月) 17:58:18
86 :
デフォルトの名無しさん :2005/04/08(金) 18:26:56
87 :
デフォルトの名無しさん :2005/04/12(火) 10:09:32
>>87 ダウンロード画面にベトナム料理屋が表示されるね。
フォーのレストランてことか。
90 :
89 :2005/04/20(水) 01:07:42
91 :
ega :2005/04/20(水) 03:43:26
課題で、適当な数字をキーボードから入力して、 文字列に変換して出力するサブルーチンを作れ といわれたんですが、だれか教えてくらさい。
94 :
89 :2005/04/20(水) 18:45:03
>>91 VAX FORTRAN という Fortranコンパイラの文法を解説した Webページの
http://www3.jpn.hp.com/upassist/ktree/cr/vms/v030/v030-04-08.html で,「メモリ内部入出力」という方法で行う 数値型 ⇔ 文字型 の型変換が
紹介されていました。
要するに,WRITE文を使って「メモリ内部入出力」というのを行うことで
数値型から文字型へ変換しています。すなわち,
WRITE(文字型変数名,FORMAT文番号) 数値型変数名
というようにコーディングすると,数値型変数の値が文字型に変換できるというものです。
以下にプログラム例を示します。
(WindowsXP上の Cygwin の g77 で動作確認しました。
ただし,他のどんな Fortranコンパイラでも動く普遍的な Fortran文法なのか
どうかは知りません。ご存知の方,フォローして下さると助かります。)
95 :
89 :2005/04/20(水) 18:46:23
● 整数の場合 例えばマイナス符号を含めて5文字以内の整数なら WRITE(moji,100) seisuu 100 FORMAT(I5) とコーディングして型変換します。 【プログラム例1】 PROGRAM main INTEGER seisuu CHARACTER*5 moji CALL int2char(seisuu,moji) STOP END SUBROUTINE int2char(seisuu,moji) INTEGER seisuu CHARACTER*5 moji WRITE(*,*) 'マイナス符号を含めて5文字以内の整数をキー入力せよ' READ(*,*) seisuu WRITE(moji,100) seisuu 100 FORMAT(I5) WRITE(*,*) 'あなたが入力した整数は',moji,'です' RETURN END
96 :
89 :2005/04/20(水) 18:47:26
● 実数の場合 例えばマイナス記号を含めて整数部が4文字以内,小数部が3桁以内の実数なら WRITE(moji,100) jissuu 100 FORMAT(F8.3) とコーディングして型変換します。 【プログラム例2】 PROGRAM main REAL jissuu CHARACTER*8 moji CALL real2char(jisuu,moji) STOP END SUBROUTINE real2char(jisuu,moji) REAL jissuu CHARACTER*8 moji WRITE(*,*) 'マイナス記号を含めて整数部が4文字以内で' WRITE(*,*) '小数部が3桁以内の実数をキー入力せよ' READ(*,*) jissuu WRITE(moji,100) jissuu 100 FORMAT(F8.3) WRITE(*,*) 'あなたが入力した実数は',moji,'です' RETURN END
文字に変換してなんか意味あるのかな?
98 :
89 :2005/04/20(水) 19:31:48
訂正というか補足というか蛇足というか。
>>94 での
WRITE(文字型変数名,FORMAT文番号) 数値型変数名
の「FORMAT文番号」の部分は正しくは,
WRITE(文字型変数名,FMT=書式識別子) 数値型変数名
ですね。FMT= を省略してコンマのあとにすぐ書式識別子を置いても可。
なので,
>>95 のプログラム例1での
WRITE(moji,100) seisuu
100 FORMAT(I5)
の二行は
WRITE(moji,'(I5)') seisuu
また,
>>96 のプログラム例2での
WRITE(moji,100) jissuu
100 FORMAT(F8.3)
の二行は
WRITE(moji,'(F8.3)') jissuu
というように一行にまとめてもOKです。
むしろ 文番号を使わないで済むので,特に Fortran 90 以降なら
こちらのほうがすっきりして良いかもしれません。
99 :
89 :2005/04/20(水) 19:41:47
100 :
89 :2005/04/20(水) 20:11:57
>>94 > ただし,他のどんな Fortranコンパイラでも動く普遍的な Fortran文法なのか
> どうかは知りません。ご存知の方,フォローして下さると助かります。
‥‥に対する自己レス (うざくてすみません)。
WRITE文とREAD文の装置番号のところに文字変数を置くやり方は,
培風館から出版されている「Fortran90プログラミング」の
著者・冨田博之先生の同名サイトの中の
http://www.ip.media.kyoto-u.ac.jp/htomita/sec7.html#7.2. で,「内部ファイルの方法」として紹介されていました。
↓
(装置番号が)文字変数:プログラム中で使われている文字変数に読み書きできる。
「内部ファイルの方法」といい,必ず書式を指定すること。
101 :
ega :2005/04/20(水) 20:32:26
>>89さん サンクスです。助かりました。課題は、fortranを覚えるために出された数問のなかにありました。 何に使うかはわからないのですが、私がc言語を知っているという背景を配慮して、 cとfortranを関連付けるためなのかとも思いました。私自身もまだよくプログラムに関しては よく理解してないのでわかりませんが、研究とかにはまず使わないと思います。 本当になんでこんな変な問題がでたんでしょうね。 とにかくありがとうございました。
102 :
89 :2005/04/20(水) 21:15:51
>>101 egaさん
いえいえ,お役に立てたようで何よりです。
こちらこそ,今まで知らなかった WRITE 文と READ 文の使い方が判って勉強になりました。
僕は Fortran と VB がメインなので C のことはよく判らないのですが,
VB なら Str 関数で一発だから,Fortran にも似たのがあるんだろうと思って
軽い気持ちで調べ始めたら,これが見つからない見つからない (^ ^;
やっぱり Fortran は科学技術計算用の言語なんだなと改めて思いました(笑)
でも、write文で文字列変数をファイルに見立ててカキコするなんてヘンなん仕様だな。 全角で数字入れたらどうなるんだろう?
>>103 WRITE(moji,100) seisuu
100 FORMAT(I5)
に行く前にすぐ前の
READ(*,*) seisuu
のところでエラーになるんじゃないの?
105 :
デフォルトの名無しさん :2005/04/20(水) 22:47:57
>>90 の Fortranが好きだ演説、笑ったw
そういや意外と今まで無かったんだな。C言語が好きだバージョンなら見たことあるが。
ところでF言語って初めて知ったが、拡張子は何なん?
106 :
デフォルトの名無しさん :2005/04/21(木) 10:01:30
ちなみに、内部ファイルはFORTRAN77でもある。 それ以前でもあるかどうかは知らない。 文字から数値への変換はたまに使った。 CSV読む時とか。
107 :
デフォルトの名無しさん :2005/04/23(土) 17:56:04
ちょっと質問、 複数の実数型多次元配列(a, b, c,...)を1つの1次元配列にパックしたり、 アンパックしたいのだけど、できれば、元の多次元配列の形も一緒にパックして { aの次元数, size(a,1), size(a,2), ... , a(1,1,...), a(2,1,...), ... bの次元数, size(b,1), size(b,2), ... , b(1,1,...), b(2,1,...),... cの次元数, size(c,1), size(c,2), ... , c(1,1,...), c(2,1,...), ....} みたいにしたい。 Fortran90では無理?
108 :
デフォルトの名無しさん :2005/04/24(日) 01:28:23
win上で動く早いコンパイラで無料のってなんですか? cygwinは遅いと聞いたので不安になって・・・・
111 :
108 :2005/04/24(日) 13:44:59
もちろんそれらのサイトは見ました。 質問がわかりにくくてごめんなさい。 現在数値計算をしているんですがcygwinは FORTRANコードをF2Cみたいなもので一度C言語に書き換えて それをコンパイルするみたいなこと(よって遅い)を聞いたので、 無料の中でも早いもの。。はなんですか?という質問です。 ごめんなさい。
>>111 PolyhedronのベンチマークではFTN77/95ともにg77より良好な結果が出ている。
OpenWatcomもほとんどの場合、g77よりも速いようだ。
実際にどの位速くなるかは自分の環境で試してみないとわからない。
#物によってはほとんど変わらない/かえって遅くなるということもなきにしもあらず。
とにかく速い物が欲しいのであれば財布と相談して商用の物を購入するか
Linuxを入れてIntel Fortranの非商用版を使う方がいい。
113 :
108 :2005/04/24(日) 16:47:27
>>112 ありがとうございます。
FTN95入れてみます。
>>112 すみません,Linux版 Intel Fortran の非商用版(無期限フリー?)はどこで入手できるのでしょうか?
Intel(日本)とエクセルソフトのサイトを見ても情報が見つからなかったので‥‥。
116 :
114 :2005/04/24(日) 22:39:30
>>115 アクセスできました。情報ありがとうございました m(_ _)m"
117 :
デフォルトの名無しさん :2005/04/25(月) 01:03:19
ftn77やftn95を使ってMS-DOS上のコマンドプロンプトでプログラムを コンパイル、実行したいのですが「ftn77(ftn95) 〜〜.f」 とうつだけでは〜.exeの実行ファイルができません。〜.obj というファイルはできるようなのですが。どのようにしたら コマンドプロンプト上でコンパイル・実行できるのかどなたか 教えていただけますか?
119 :
デフォルトの名無しさん :2005/04/25(月) 02:49:21
>>118 この方法でftn77のみでなくftn95に関しても実行ファイルを
作成してプログラムをまわすことができました。
問題も解決して気持ち良く寝れそうです。大変ありがとうございました。
120 :
118 :2005/04/25(月) 03:06:29
>>119 FTN95 については先ほど
http://www.silverfrost.com/23/ftn95/ftn95_documentation.asp から
Salford FTN95 User Guide (Including Clearwin+ and Plato3 documentation) をダウンロードして
ざっと見てみたんですが,
・The /LINK compiler option
・Compiler options on a command line
という2つのオンラインヘルプによると,
FTN95 <pathname> /LINK
としてやれば,コンパイラが <pathname>.F95 (or .F90) という名前のファイルを探してコンパイルした後に
リンカが自動的に起動して,<pathname>.EXE を生成するらしいです (この場合は .OBJファイルは保存されないらしい)。
例えば,MYPROG.F95 から MYPROG.EXE を生成したいなら
FTN95 MYPROG /LINK
但し,こちらの手元では試していないので間違ってたらすみません。
また,僕の訳も間違っているかもしれないので,念のためにご自身で上述のユーザ・ガイドをダウンロードして
・The /LINK compiler option
・Compiler options on a command line
その他,コンパイルに関係しそうなヘルプを検索して,一読されることを強くお薦めします。
121 :
117 :2005/04/25(月) 23:57:36
>>120 確かにftn95 〜〜.f /link とすると直接実行ファイルが生成されました。
まだ、プログラムを始めたばかりでまだまだ分からないことだらけで。。。
ご丁寧に説明して頂きありがとうございました。
ヘルプを一読してみたいと思います。
122 :
sage :2005/04/27(水) 19:42:23
FORTRAN90で、 INTEGER :: ARRAY(5) ARRAY(1) = 1 ARRAY(2) = 2 ARRAY(4) = 4 DO I = 1,5 WRITE(*,*) ARRAY(I) END DO END のように、ところどころ値のない配列をDOループで出力 (値の無いときは空行)したいのですが、値のないところで Reference to undefined character のエラーを出さないように対処するにはどうしたらよいかどなたかご教授下さい。 コンパイラはSalfordのFTN95です。
-999とかですべてを初期化して、-999なら空行を書けばいいだけでは -NaNが入ってるともかぎらんしね。
>>122 write文の引数に「err=行番号orラベル」を追加して、
そこでエラー処理(今の場合は空行出力)。
125 :
デフォルトの名無しさん :2005/04/28(木) 16:53:33
>>122 INTEGER,PARAMETER :: IUNDEF = HUGE(1)
INTEGER :: ARRAY(5) = IUNDEF
ARRAY(1) = 1
ARRAY(2) = 2
ARRAY(4) = 4
DO I = 1,5
IF (ARRAY(I) /= IUNDEF) WRITE(*,*) ARRAY(I)
END DO
END
コンパイラの未定義チェックの多くは、へんてこな値を未定義に予約して
それを参照したりすると、警告を出す仕組み。上記のように、自前でやってもいい。
126 :
デフォルトの名無しさん :2005/04/28(木) 21:33:32
普通、不定値があるような配列を操作しないだろ。データ構造から勉強したほうがいいかと。
127 :
122 :2005/04/29(金) 08:59:58
初心者質問に答えてくださりありがとうございました。たすかりました。
128 :
デフォルトの名無しさん :2005/04/29(金) 15:28:21
Opteronつかってるのですがインテルのfortranコンパイラでも最適化は適切な物になるのでしょうか?
>>128 あまり速くならない。
最新のAMD64ならよいかも。
それよか、gfortranかg95をつかったら。
gfortran(gcc 4.1)は、g77の1.5倍位速い。
gfortranは、バグがある。 ひとつは、namelistで配列を使うと正しく読めない。 もうひとつは、清水氏の作った、column-row読み込み速度プログラムが g77 col 254MB/s row 641MB/s g95 col 227MB/s row 612MB/s なのに gfotran col 37MB/s row 35MB/s col 65MB/s row 58MB/s などばらつくし、桁が違う。 どっかおかしい。
手許のプログラムはgfortran-4.0ではコンパイル出来なくて, g95だと出来る.g95のサイトから,毎日のようにコンパイル 済みバイナリをダウンロードしている.
自作PGの精度をH/W、コンパイラ両面でいろいろ評価しています。 CompaqコンパイラやIntelコンパイラの場合、 実数や整数を0で(勝手に)初期化してくれてるんですが PGIやXL Fortranだと初期化してくれない場合があって 精度があいません。 もちろん初期化処理を入れてないのが悪いっちゃあ悪いんですが、 このようなコンパイラの細かい仕様についての情報がある サイトご存じの方おりましたら教えてください。 ヨロシクお願いします。
130だけど 5月1日版のgcc-4.1のgfortranでは、namelistのバグは、なおっていた。 2つめの、配列のアクセス速度のほうは、まだなおっていない。
134 :
デフォルトの名無しさん :2005/05/08(日) 22:49:02
>>132 初期化しないおまえが悪い。
Fortran90なら宣言文で初期化できるので、修正は簡単だよ。
integer :: i=0, j=0
とかね。
>PGIやXL Fortranだと初期化してくれない場合があって >精度があいません。 それは変数初期化ではなく、 使用する浮動小数点フォーマットとか、ライブラリの違い に起因するものだと思った。
FORTRANのよい入門書を教えてください
137 :
デフォルトの名無しさん :2005/05/11(水) 06:37:42
138 :
デフォルトの名無しさん :2005/05/11(水) 17:56:03
はじめまして、教えていただきたいことがあり書き込みします。 計算が途中でおかしくなりデータが NaN になった場合,プログラムが終了するようにしたいのですが、良い方法はないでしょうか? データの上限下限を設定し, その値からはずれた場合に止まるようにプログラムを書き直すことも考えましたが、 NaNが現れた場合に強制終了するための、もっと簡単な方法がありましたら教えていただけると助かります。 よろしくおねがいします(ノД`)
139 :
デフォルトの名無しさん :2005/05/11(水) 18:42:38
>>138 コンパイルオプションで一発。
どういうオプションかは、コンパイラのマニュアルに書いてある。
140 :
138 :2005/05/11(水) 19:08:10
>139さん -fpe0 で良いのでしょうか 最適化の後ろにオプションをつけてみたのですが、何かうまくいかなくて すみません、よく分かってませんで・゚・(ノД`)・゚・。
141 :
138 :2005/05/11(水) 20:17:59
すみません、また138です。もう少し勉強してみました・゚・(ノД`)・゚・。 -qflttrap で終了させることができることまでわかったのですが、 最適化と同時に使った場合、0/0では終了するのですが、1/0で素通りしてしまいます。 最適化と同時に使う場合、どうすればよいのでしょうか。 なんども申し訳ありませんがよろしくお願いします(⊃д⊂)
142 :
デフォルトの名無しさん :2005/05/11(水) 20:22:56
>>141 1/0はNaNじゃなくて、Infじゃないのかな?
っていうか、もまえがどこのコンパイラ使ってるかわからんし、
俺の家に、お前が使っているコンパイラのマニュアルがあるわけじゃない。
がんばって、マニュアル読んでくれ。
>>138 つ IF (ISNAN(x)) STOP
144 :
138 :2005/05/11(水) 21:03:38
>>142 がんばって読んでみてます・゚・(ノД`)・゚・。
コンパイルオプションでできることがわかっただけで大収穫です。
ありがとーー
>>143 それをやると、すべての変数に対して全部書いていかないといけなくなるので・゚・(ノД`)・゚・。
145 :
デフォルトの名無しさん :2005/05/12(木) 13:23:28
質問です。 intel Visual Fortran ver.8をインストール後 ハロープロジェクトで試そうとしたのですが、 以下のようなメッセージが出て終了してしまいます。 誰か詳しい人お願いします。 -out:hello.exe -subsystem:console -entry:mainCRTStartup hello.obj LINK : final error LNK1104: コンパイラは、ファイル'ifconsol.lib'を開くことができません。 LNK1104というのはどうもVisual C++のiostream関連のエラーであるらしいのですが、よく判りません…
ソースコードは以下のものです。 PROGRAM HELLO INTEGER I DO I=1,3 WRITE (*,*) 'HELLO WORLD!' END DO END PROGRAM
ifconsol.libはIntel付属のコンソールライブラリ。 LNK1104とは単にライブラリファイルが開けないと VCが言っているだけ。ライブラリのパスが通っていない とかVCとFortranのバージョンが違うとか。
>>145 つ 「インストールと入門」 ガイド 3-8〜3-9
149 :
デフォルトの名無しさん :2005/05/19(木) 08:24:51
簡単にマルチスレッド化する方法を教えてください
研究者、大学院生、プロのプログラマのいずれかの方にお聞きします。 興味本位の質問ですが、貴方の職業(ご身分)もあわせて教えていただ けるとうれしいです。 1)いま仮に何かの物理現象を扱っている1000行ぐらいのフォートラン プログラムを「ホイ」と渡されたとき、このプログラムの中で実際 何がどういう風に処理されているか、読み解き、必要に応じて 中身をいじれるくらいになるまで、どのくらいの時間がかかりますか? 数時間?数日?数週間?数ヶ月?永遠に無理? 2)上記の作業を効率よくするのにどのようなツールを使っておられ ますか?例えば、印刷したものをじっくり見るとか、テキストエディタ で画面を見ながらとか、デバッガーみたいなのとか、その他いい方法が あったら教えてください。 3)こういったプログラミングの業界は世界と比べて日本は進んでいる と感じますか? ちなみに自分は学生なのですが、ある程度フォートランの文法の基礎は 分かってるつもりです。でも、1000行の見ただけで、もうついてけない、 と思ってしまう根性なしで最近落ち込み気味です。
hpfの良書を教えてください
ファイルの読み柿がよくわかりません。 どこかによい解説はないでしょうか?
自由形式でかけるFORTRANはありませんか?
千行の道も一行から。
155 :
デフォルトの名無しさん :2005/05/19(木) 12:59:39
FTN77 Personal Edition Compilerをダウンロードしたいんですが download FTN77 Personal Editionをクリックしても 名前やメールアドレス,住所などを入力するフォームが表示されないんですが どうすればいいんでしょうか?
157 :
デフォルトの名無しさん :2005/05/19(木) 23:09:27
教えて君ウザイ
159 :
デフォルトの名無しさん :2005/05/20(金) 23:34:24
intel fortran (Linux版)の質問です。 ランタイムオプション -check をつけてコンパイルして、実行すると、 forrtl: warning (402): fort: (1): In call to [サブルーチン名], an array temporary was created for argument #1 という警告がでます。マニュアルによると、 『ルーチンが呼び出される前に、実引数が一時的な記憶域にコピーされる場合、ランタイム情報を含むメッセージを発行します。』 ということらしいのですが、何故引数がコピーされるのでしょうか?Fortranって call by reference (call by value の対義語)じゃないの?また、コピーされることの弊害として、どのような事が考えられるでしょうか?
>150 まあ似たような立場のモンです。 あっしもいくつかプログラム渡されて数週間解読しましたでつ。 やったこととしては印刷してじっくり読むのは基本として 文法が分かるのなら ・似たような処理をしてるところがあったら吐き出す結果が違わないように 注意しつつ出来る限りサブルーチンや関数にまとめる。 まあ、これはあっしが渡されたプログラムは結構スパゲッティだったから通用したのかも 知れませんが… あと、 ・研究で使ったプログラムならその結果を元に論文が書かれてると思うのでその論文や そこに上げられた参考文献も読んでみる。 というのも重要かも。あっしはこれで転送行列法なるものを知ったです。
ついでに質問です。 …… real(8),dimension(1:3)::bar …… call foo(…,bar) …… end program subroutine foo(…,bar) real(8),dimension(:),intent(INOUT)::bar …… end subroutine という感じにプログラムを組んだんですが、実行してみるとbarの値や形状が 正常に受け渡しされてないことが判明しました。原因がさっぱり分かりません。 何か分かる方がいらっしゃいましたらご教授お願いします。 使用コンパイラはIntel Fortran Compiler8.1 for Windowsです。
>>161 interface文書いてやらんと、整合配列は通らないんじゃないの?
>>159 >何故引数がコピーされるのでしょうか?
サブルーチン側が連続した配列を想定しているのに
連続していない(可能性がある)配列が渡されたから。
program test
integer, dimension(5,4) :: a = 1
integer, dimension(3,2) :: b = 2
call foo(a(2:4,2:3))
call foo(b)
print *, a
print *, b
contains
subroutine foo(x)
integer, dimension(3,2), intent(inout) :: x
x = 3
end subroutine foo
end program test
>Fortranって call by reference (call by value の対義語)じゃないの?
この場合、ちゃんと「一時的な配列の先頭アドレス」が渡されます。
>また、コピーされることの弊害として、どのような事が考えられるでしょうか?
配列のコピー・書き戻しによるオーバーヘッドの増加、使用メモリ量の増加等。
165 :
159 :2005/05/21(土) 14:55:33
>>164 わかりやすい例示をありがとうございます。
具体的には、以下のコードで困っています。
ちなみに、character型配列ではなく、integer型にすると、一時配列は作られません。
また、以下の例では、b は2次元配列ですが、1次元配列に変更しても一時配列は作られます。
--------------------------------------------------------
program test
character,dimension(:,:),pointer :: b
allocate(b(3,2:3))
call foo(b, size(b))
print *, b
end program test
subroutine foo(x,nmax)
integer,intent(in) :: nmax
character, dimension(nmax),intent(inout) :: x
x = '3'
end subroutine foo
--------------------------------------------------------
実行すると以下のようになります。
$ ifort -check test2.F90
fortcom: Info: Feature not yet implemented: check pointer
fortcom: Info: Feature not yet implemented: check shape
$ ./a.out
forrtl: warning (402): fort: (1): In call to FOO, an array temporary was created for argument #1
333333
x = '3' のとこが x(:) = '3' と解釈され実行されたんじゃないの? つまり、2*3の配列すべてに’3’が書き込まれたと。 character,dimension(:,:),pointer :: b って明示的に書くと character(len=1), dimension(:,:),pointer :: b なんだけど、これでいいんですか?
>>165 character型は特殊なんだよ。とても変な仕様になってる。
gcc4.0.0で同じようなコードをコンパイルしてもfortranの方がC++より高速に感じるのだが
厳しいフォートラン講座はどこかにありませんか?
>>170 たしかに厳しい。何かいてあるのかまったくわからん。
>162 この件についてはご教授の通りで解決いたしました。 どうもありがとうございます。
174 :
デフォルトの名無しさん :2005/05/24(火) 08:07:22
alphaプロセッサを使っている場合、速度の最適化を最高にするオプションは何ですか
>>174 -fast -arch host -O5
ただ、これが最速とは限らない。
fortranはO5まであるのね。C++はO3までしかないね
C++は-O5まであるよ。 ただマニュアルには -O4 and -O5 have the same effect. ってあるので、実質-O4まで。
178 :
デフォルトの名無しさん :2005/05/24(火) 19:22:55
LINUXでFORTRAN77のコンパイル〜実行ができません。 [k@localhost k]$ gedit test.f [k@localhost k]$ g77 test.f となって何もなりません。 a.outは作成されるのですが、クリックしてもなにもなりません。 よろしくお願いしします。
$ ./a.out
>>179 出来ました!
学校のだと ./ 必要ないので分かりませんでした。
ありがとうございました。
>>180 おやおや。その学校のマシンって結構危ないのではなかろうか。
なんで./が必要なのかを知ってれば別にいいんじゃね。 しかし、、「クリック」なのかぁ、、。
183 :
デフォルトの名無しさん :2005/05/25(水) 20:33:06
カレントディレクトリはコマンドパスに入れてはいけない。
変数を NaN で初期化するには、どうしたら良い?
187 :
185 :2005/05/26(木) 20:01:44
>>186 いや、つい出来心でつ。
NaNをフラッグにして、条件分岐できるかなっと。
フラッグを -1 とか 999999 とかにすると、
いわゆる2000年問題的な問題がおきるしね。
フラッグの変数(boolean)をわざわざ作るのも面倒だし。
>>167 character型は腐ってるということで、良いですかね。
>>188 Cだとchar型の配列と変数は整合性があるけど、fortranの場合はそれが無い。
つまり、
character(len=10) choge
と
character(len=1) choge(10)
は全く違う内部構造になってるんだよね。
ファイルの読み書きがよくわかりません。誰か教えてくだすれ
f77で動的にメモリ領域を割り当てるにはどうしたらよいのでしょうか?
>>190 open, read, write を勉強しる。
>>191 できない。f90からできる。
HP FORTRANだと構造体を使ったプログラムがf77でもコンパイル 出来たっけな。あくまでHPの独自拡張だけど。
>>189 FortranのCHARACTERは長さの属性を持っている。
「文字型」と言っても実質的には文字列型になる。
高級言語という観点からすれば整数型 charの配列を文字列とする
Cの方が手抜きである、とも言える。
195 :
デフォルトの名無しさん :2005/05/30(月) 17:18:15
Fortranのsubroutineをc言語から呼び出すプログラムをWINDOWS XP用のフリーのコンパイラを 使用してコンパイルしたいです。 どのコンパイラを使ったらよいですか?
197 :
sage :2005/06/01(水) 18:42:46
OPEN文でファイル名を指定すれば、新しいファイルを作ることはできますが、 ディレクトリを作成するにはどうしたらよいのでしょうか。 どなたかお教えくだされたまえ。
198 :
デフォルトの名無しさん :2005/06/01(水) 20:21:47
>>197 call system('mkdir AAA')
めちゃくちゃ処理系に依存しそうだな
組み込み関数としてRAND()が認識されないのですがなんでなんでしょうか? ヘルプを参照したりググッてみたけどわかりませんでした。 使っているのは Microsoft Developer Studio 97 Visual Fortran Professional Edition5.0A というやつです。
203 :
197 :2005/06/02(木) 17:56:17
198さん。できました。どうもありがとうございました。
>>198 call systemを使わないやり方はありますか?
初心者の質問です. LAPACK95を入れてテストしたらこんなエラーが出るんですけど 詳しい人おしえて >g95 sample01.f90 -llapack95 In file sample01.f90:2 use la_precision, only: WP => SP 1 Fatal Error: Can't open module file 'la_precision.mod' at (1) for reading: No such file or directory ファイル la_precision.mod は c:\g95\lib にちゃんと存在するんですけど
206 :
デフォルトの名無しさん :2005/06/03(金) 20:55:43
>>204 おそらくないと思うよ。
でも、たいがいのコンパイラで
call system('mkdir AAA')
または
ii=system('mkdir AAA')
のどちらかはサポートしてると思う(mkdirがない場合は知らんが)
>>204 処理系依存のサブルーチンを使う。
Visual Fortran なら MAKEDIRQQ とか。
208 :
204 :2005/06/03(金) 23:39:55
>>206 ,207
どうもです。以前、中身の不明なディレクトリ内のファイルを全て読む
プログラムを作った時も、命令を見付けられなかったので仕方なく
call system("ls hoge/ > list")
open(io,file="list")
とかやっていました。lsが無いMS-DOSプロンプトだったら実行出来ない
ですね。
209 :
デフォルトの名無しさん :2005/06/04(土) 17:16:08
処理系依存性を吸収するためには、プリプロセッサを使う。
おれなら、ディレクトリ操作なんかはPythonスクリプトなんかでやって、本質的なところでFortranを呼び出す形で解決するけどな
211 :
デフォルトの名無しさん :2005/06/10(金) 04:34:35
Python つかうと、逆にポータビリティーが下がらないか? 基本は sh だろう。
212 :
デフォルトの名無しさん :2005/06/10(金) 22:54:19
>>205 モジュールファイルのパスはライブラリとは別に指定します。
>g95 -Ic:\g95\lib sample01.f90 -llapack95
または
set G95_INCLUDE_PATH=c:\g95\lib
としてから
>g95 sample01.f90 -llapack95
>>211 じゃあ、ディレクトリツリーを全て巡回しながらデータファイルを探し出し、それを読み込んでfortranで処理させるのshで作れよ。
#!/bin/sh ~/bin/getfilelist ~/dat > filelist.txt ~/bin/hoge filelist.txt
shの機能以外を使ってるから×
Pythonっての知らないんだけどさ、 例えばどんなスクリプトになるか 見せてちょ。
217 :
デフォルトの名無しさん :2005/06/11(土) 23:50:39
210=213ですか? 211が言っているのはshのみを使うというよりは sh+一般的にどこでも使えそうなコマンド(ls等)で作るという意味では。
外部プログラム呼ぶのがオケーなら、Pythonスクリプト呼ぶのと大差ないでしょ? つまり、sh自体にディレクトリ巡回機能が付いてるのかどうかなんですが
シェルスクリプトは複数のプログラムを組み合わせてバッチ処理を行うための ものだと思うんだが。 ようは目的に合わせて自分の環境で使える道具を選択すればそれで良いんだよ。
結論を急ぐと、 Fortran単体では柔軟な処理は不可能 ということです
一昔前ならともかくFortran単体で全てやる必要性もないし。 Fortranに限らず何でもかんでも単一の言語でやろうと余計な策を弄するのは本末転倒だし。
222 :
デフォルトの名無しさん :2005/06/12(日) 12:51:35
それがFortranクオリティ
223 :
デフォルトの名無しさん :2005/06/12(日) 15:52:16
フォートラン (・∀・)カックイイ
Fortranは真の高級言語だな。
225 :
デフォルトの名無しさん :2005/06/12(日) 22:17:59
Fortranは真の高級言語だな。
226 :
デフォルトの名無しさん :2005/06/12(日) 22:21:11
Fortranは真の高級言語だな。
227 :
デフォルトの名無しさん :2005/06/12(日) 22:26:18
Fortranは真の高級言語だな。
228 :
デフォルトの名無しさん :2005/06/12(日) 22:30:19
Fortranは真の高級言語だな。
229 :
デフォルトの名無しさん :2005/06/12(日) 22:57:28
Fortranは真の高級言語だな。
そうですが何か?
231 :
デフォルトの名無しさん :2005/06/12(日) 23:41:47
Fortranは真の硬旧言語だな。
232 :
デフォルトの名無しさん :2005/06/13(月) 01:48:11
SUBROUTINEに二次元配列が渡せないよ。なぜ。
>>221 だな。
ポータビリティーのことも考えると、
なるべく使いそうな計算環境にありふれた言語を使うことかな?
以前、Cで書いたコードをFortranからリンクしたら、
共同研究者から怒られた。Cが読めないんだって(笑)
そいうのは、例外的事例ってことで。
複数の人間でつくる時はどんな言語を使うかも含めて 事前にルールを決めとかないと…
これからFortranをやろうとするのは無謀ですか? C言語はコンソールアプリケーション程度、しかもあまりできない。 Basicはアプリケーション開発をしばらくやってたけど理解できてるのかどうかわからなくてやめた。 何故やりたいのか ちょいと興味があった。さわり程度に使ってみたい。 後はMs−Dosのシンプルな画面に惚れている。
>>235 無謀じゃないよ。古臭い手続き型言語だから、本やWebでいくつか例題やればすぐ習得できる。
でも、あんまり面白い言語じゃないし、エレガントでもない。
237 :
デフォルトの名無しさん :2005/06/14(火) 20:29:50
formatなどを使って、2×2の行列を表示させるにはどうしたらいい のでしょうか?ほぼ初心者です。
FORMAT文の勉強をするといいと思います
239 :
237 :2005/06/14(火) 22:42:45
勉強してもわからんとです。
宿題は自分でやろうね
241 :
デフォルトの名無しさん :2005/06/14(火) 23:14:27
何かよくなったんやろか、、。
243 :
デフォルトの名無しさん :2005/06/15(水) 03:08:56
Linux超初心者です 大学の卒研でFortran(今のところ77で十分)が必要になったんですが、インストールの段階で早くもつまづき、どうにも前へ進めません gccが何のことかすらよくわかりません Linuxユーザの方HELP ME
Linuxのインストールがうまくいかないという話ならLinux板で質問したほうが いいと思うよ。
>>241 ヒロシです。
9.0 のリリースの件,ダイレクト電子メールで勤務中に知ったとです。
3月に 8.1 を買ったばかりだったので,ちかっぱショックだったとです。
ヒロシです‥‥
安値でアップグレードできるんだろうか?
今まではどうだったか,ご存じのかた教えて下さい。
247 :
デフォルトの名無しさん :2005/06/15(水) 20:08:44
>>247 あっ Σ( ̄□ ̄ ;
そういえばそうでした! そのことをすっかり忘れていました。
情報ありがとうございました。大感謝 m(_ _)m"
249 :
デフォルトの名無しさん :2005/06/16(木) 01:37:06
Fortranで作ったプログラムの中に外部ソフトを組み込むことって可能ですか? exeでしか存在していない外部ソフトです。 自分で作ったプログラムならソースがあるから、include出来ました。 ソースが無くても可能なのでしょうか?
251 :
249 :2005/06/16(木) 02:00:08
>>250 返信ありがとうございます。でも、その方法がわかりません。
状況としては、
A(自作Fortranプログラム)とB(外部)があって、
Aで計算した結果を用いて、Bで計算をする。そしてBでの結果をまたAに返して計算。
Aは起動させたまま、ということを考えています。
dllはどうやればリンク出来るのか教えていただけますか?
>>251 >Aで計算した結果を用いて、Bで計算をする。そしてBでの結果をまたAに返して計算。
>Aは起動させたまま、ということを考えています。
大抵の処理系では外部コマンドを起動するためのサブルーチンが用意されているので
それを使えば良い。
253 :
251 :2005/06/16(木) 18:35:50
>>252 ごめんなさい。VF6.6でオンラインヘルプとか見たのですが、わかりません。
普通のサブルーチンみたいに、
call (B.exe)
は無理ですよね?
どう記述するのですか?またコンパイル時に何かやるのですか?
VFならこんな感じ↓ program test use DFPORT integer :: ios integer(kind=4) :: r character(len=80) :: str r = system("dir > flist.txt") print *, "終了コード = ", r open(unit=1, file="flist.txt", status="OLD") do read(unit=1, fmt="(A)", iostat=ios) str if (ios /= 0) exit if (str(1:1) /= " ") print *, trim(str) end do close(1) end program test 詳細はオンラインヘルプ等で「SYSTEM」または「SYSTEMQQ」を参照のこと。
255 :
デフォルトの名無しさん :2005/06/18(土) 05:25:02
g77で乱数の発生のさせ方を教えてください! real x integer l do=1,5 call rand(x) write(*,*) x enddo end とすると、サブルーチンの使い方がおかしい!みたいなことを言われてしまいます。 よろしくお願いします!
256 :
デフォルトの名無しさん :2005/06/18(土) 05:45:06
自己解決しました! real x integer l call srand(1234) do=1,5 call rand(x) write(*,*) x enddo end こんな感じであってますよね? 失礼しました
257 :
デフォルトの名無しさん :2005/06/18(土) 05:51:50
あれ?コンパイルできない・・・。 real x integer l call srand(1234) do=1,5 x= rand() write(*,*) x enddo end とするとできるのですが、普通のサブルーチンと扱いが違うのですかね? あたふたしてすみません。
258 :
235 :2005/06/18(土) 10:31:23
今現在CPadで一人で勉強中。 このコンパイルの瞬間がC言語でも味わったけど、好きだ。 無機質にDos画面で表示されている瞬間なぜか技術者気分だ。 コード自体は入門サイトからのだからそんな難しいものではない。 だけどいつかは大学の言語解析ソフトくらいはつくれるようになりたい。 ・・・というかプログラムか。 なんか英語辞書が組み込まれててテキストの中に入っている文書から英単語を読み出して、それの個数を読み出すソフト。 そしたらメモ帳に出力させてた。 一定のスペースをつけて読み出してるからエクセルでも処理可能。 それくらいは作ってみたい。 ただそのソフト、日本語はサポートされてないからひとつの文書にある文字ベースのエントロピーが求められん・・。 日本語入れた瞬間バグ起こしたもんで教授から大目玉とはこれいかに・・。
古いフォートランのコードで、Cに直したいのですがコードが読めません。
もし分かる方いらっしゃったら確認お願いします。
以下コード
FUNCTION RAND(K)
INTEGER K, M, CONST1
REAL RAND, CONST2
PARAMETER (CONST1 = 2147483647, CONST2 = .4656613E-9)
SAVE
DATA M /0/
IF(M .EQ.0) M = K
M = M * 65539
IF(M .LT. 0) M = (M + 1) + CONST1
RAND = M*CONST2
END
以下私の理解している事: 参考にしたページ:
http://www.g.dendai.ac.jp/lecture/fortran/fort12.html 任意のKが関数に渡される。
関数は K*65539*CONST2をいつも返す。
でもいくつか疑問点があります。
どうして型宣言が行われていないのでしょうか?
どうして関数は特定の値をいつも返すのに、IFの分岐が必要なのでしょうか?
困ってます。アドバイスをよろしくお願いしますm(__;)m
「暗黙の型宣言」てやつで、RAND自体は単精度実数になってる。 関数が持ってるMという変数の値はSAVE宣言されてるから、関数から抜けても値が保存される。 呼び出されるごとに関数が返す値は違う。IF文は乱数発生アルゴリズムを理解すれば意味がわかる。
>>260 ・DATA 文による初期化は、プログラムの実行前(?)に1度しか実行されない
・SAVE 文があるので、関数内の変数はすべて static
(例外はあるが、FORTRANのローカル変数はSAVEがあろうが無かろうが
すべて static と考えたほうがよい)
263 :
デフォルトの名無しさん :2005/06/22(水) 16:09:12
> (例外はあるが、FORTRANのローカル変数はSAVEがあろうが無かろうが > すべて static と考えたほうがよい) > え−っ! すごい昔の話じゃないの?
264 :
デフォルトの名無しさん :2005/06/22(水) 17:32:08
address errorがでるときの原因を教えてください! お願いします。
>>264 OSやコンパイラの種類を教えてくれないと分らん。
それでもエスパーなら、エスパーなら何とかしてくれる
配列の範囲外をアクセスしようとしたとか
268 :
デフォルトの名無しさん :2005/06/22(水) 19:04:57
>>265 ウィンドウズです。
コンパイラは77だと思います。
それはコンパイラとは言わない
270 :
デフォルトの名無しさん :2005/06/22(水) 19:20:06
>>264 ,268
これらの情報から考えられる原因:
お前のプログラムがカスだから
address errorというのはコンパイル時に出るものなのか、 実行時に出るものなのか。address errorというだけで自明の ことなのだろうか。
>>263 たしかに、保証はされてないですね。
そのための save 属性だし。
>>261 >>262 ありがとうございました!!周りに知ってる人がいなくて困ってました。
m(_ _)m 重ね重ねお礼申し上げます。。
質問なんですが、Windows で動くフリーの Fortran9x コンパイラ(FTN95など) で Lapack をライブラリにして使用することってできるんでしょうか? 現在はcygwinでg77+Lapackっていう組み合わせで使ってますが、 もともとはC/C++使いだったんで、Fortran77が使いにくく感じて仕方ないです…。
Intel Fortran Compiler買えばいいのに…
277 :
275 :2005/06/26(日) 01:24:54
>>276 Intelのコンパイラは速いらしいですね。
Math Kernel Library なんていうありがたいものまで販売されてるし。
しかし、私の所属する研究室(私は大学院生です)では
行列演算をするのは自分だけだし、他の人はFortran77で満足してるみたいなので微妙です。
一人でFortran77派の先生を説得できそうにはないですね・・・。
>>275 MinGW版のg95でBLAS/Lapack/Lapack95のコンパイルは一応エラーなしで通った。
(ライブラリのみ)
ただ、テストはしてないので正常に機能するかどうかまではわからん。
>>277 Linux使えば?compilerもMKLも学生ならただで使えるよ。
280 :
275 :2005/06/27(月) 13:13:06
レスありがとうございます。
>>278 g95プロジェクトって遅々として進んでないような印象があるんですけど、
いつになったら完成するんでしょうね。
完成or完成間近で、バグがほとんどないようなら使いたいと思ってるんですが・・・。
>>279 MKLもタダでしたか!
これを機にLinuxとWinのデュアルブートにしちゃおうかな…。
ttp://www.g95.org/ を見ると毎日のように更新されているね。
Linux上で動かしている手元のプログラムは、gfortran-4.0では
コンパイル出来なくて、g95では大丈夫。実行するとAlphaの
Compaq Fortranとほぼ同じ結果を返してくれる。Intel Fortran
でもコンパイル出来たけど、実行すると異常終了して、デバッグを
諦めた。
Intel Fortran9 買った。Visual Studio .NET上で使うと訳分らん。今までCVF6.5使ってたから。
俺もVF6.6使ってたけど、まだ慣れないよ。 IntelというかVC.NETで 6列目と73列目以降の色分けがしたいんだけど、 できるのかな・・
284 :
デフォルトの名無しさん :2005/06/30(木) 22:25:24
>>283 固定フォーマット(*.for, *.f)ならVS.NETで桁の色分けしてくれてますが。
285 :
デフォルトの名無しさん :2005/07/02(土) 19:09:00
WindowsでプログラミングをしてみようとSalford FTN95 Personal Editionをインストールしたのですが、 コマンドラインでコンパイルしようとして「ftn95 test.f」のように入力してもEXEなどの実行ファイルが作成できないんですがこのやり方ってなんかまずいのでしょうか? なんか画面みると問題ないようなのですが肝心の実行ファイルがないんです。 しかも「/Lgo」というコンパイル成功時に一度実行させるコマンドラインオプションをつけるときちんとプログラムは実行されているんです。 なんかものすごく初歩的な質問のような気がするのですが、調べても逆に初歩過ぎるのか解決方法が見つかりません。 すみませんが解決方法を教えてください。お願いします。
287 :
285 :2005/07/02(土) 19:20:18
>>286 解決しました。ありがとうございます。
意外と簡単なところに限って躓くものですね…。
いままでunixで使っていてそのコンパイラーがオプション無しで実行ファイルa.outを作ってくれてたので盲点でした。
288 :
デフォルトの名無しさん :2005/07/02(土) 23:01:28
コンパイルして./a.outで出力すると「セグメンテーション違反です。」とか出るんですけど、解決策は無いですかね?
290 :
デフォルトの名無しさん :2005/07/03(日) 19:11:41
逆にCをFortranへ変換するソフトってあるんですかね?
292 :
デフォルトの名無しさん :2005/07/05(火) 00:18:41
Salford FTN95で実行ファイルを作ろうとしてCommand Promptで、 「ftn95 "main.f90" "sub.f90" /link」 と打ったら、 more than one source file specified 1 error [main.f90] compilation failed とかいうエラーメッセージが出たんですが、 複数のファイルに分かれた場合のコンパイル法ってこれじゃまずいんですか? とりあえず、Salford以外じゃ問題ないんで、ファイル自体には問題なくて 単純にSalfordの操作ミスのようなのですが。
293 :
デフォルトの名無しさん :2005/07/05(火) 01:34:44
>>292 個別にコンパイルして最後にリンク
ftn95 main.f90
ftn95 sub.f90
slink main.obj sub.obj -FILE:prog.exe
面倒くさかったら mk32やバッチファイルで処理。
294 :
デフォルトの名無しさん :2005/07/05(火) 18:46:46
OPEN文を使って次のプログラムを実行してみたのですが、うまくいきません。 (「中断しました。」とでます) どなたかよろしくおねがいします OPEN(1,FILE='701') READ(1,*)X,Y S=0.0 DO 100 I=1,15 READ(1,*)U,V S=S+(U-X)*(Y+V)/2.0 X=U Y=V 100 CONTINUE WRITE(*,*)S CLOSE(1) END
295 :
デフォルトの名無しさん :2005/07/05(火) 18:55:31
>>294 見た目間違ってなさそう。
それだけ短いプログラムだったら
計算過程を全部writeで出力したら?
変数の計算式やreadの式の直後に全部writeで
write(*,*)"S=",S
みたいに出力すればいいんじゃん?
297 :
デフォルトの名無しさん :2005/07/05(火) 21:39:11
>>296 さん
返信ありがとうございます。
大学でしかフォートランできない状態なのでまた明日確認してみます
ひょっとしたらOPEN対称ファイルがダメなのかもしれないですよね。
別テキストで数字だけを羅列していったのですが。。。
↓みたく。
0,10.5
125,8.2
307,7.5
420
以下同様
298 :
デフォルトの名無しさん :2005/07/05(火) 23:59:25
>>294 READ(1,*,END=200)U,V
.
.
.
100 CONTINUE
200 CONTINUE
299 :
292 :2005/07/06(水) 00:30:10
300 :
デフォルトの名無しさん :2005/07/06(水) 01:14:31
>>298 さん
返信頂きありがとうございます。
READ(1,END=200)ですよね?
明日さっそく試してみたいと思いますが、見てみた感じ
READ文の中にこのような命令が入っているのは初めてで、
本やウェブでいろいろ見てみたのですが、どういう処理をしているのかよくわかりません。
あるところで、READ文とCLOSE文の間にWRITE文があるとうまくいかないことがある。とあったのですが、
それと関係あるのでしょうか?
302 :
300 :2005/07/06(水) 19:46:30
どうもありがとうございます。 今日学校でやってみたところ、解決しました。
303 :
デフォルトの名無しさん :2005/07/06(水) 20:25:41
>>302 >>298 の方法で実行時エラーが出なくなったと言うことは
データの個数が足りないか、正しく読み込まれていない
可能性があるのでは?
304 :
300 :2005/07/07(木) 00:19:37
>>303 実はOPEN(1,FILE='701')
の部分ですが、保存していたのが701.TXTだったので、
それがアボートの原因だったのかも知れません。
そこを変更して、教えていただいたやり方でやっても、元の形でやっても
うまくいきました。
305 :
デフォルトの名無しさん :2005/07/07(木) 20:15:29
すいません。 自分でなんとか書いてみたんですが、合ってるかどうか見てもらえますか? 本当ならこれを学校のFortranでやってみて、確かめて、gnuplotでグラフ。 とまでやりたかったんですが、学校のが使えませんでした。(家も使えません。) どなたか数値計算していただけない・・ですよね。。 もし計算結果がでたらエクセルでグラフを書けばなんとかできるかなと思っているんですが、 ↓こんなんです
306 :
デフォルトの名無しさん :2005/07/07(木) 20:16:11
program prog036 implicit real*8 write(*,*) 'a, b, n, dt = ?' read(*,*) a, b, n, dt write(*,*) 'a, b, n, dt = ',a,b,n,dt c x1 = a x2 = b y1 = 0 y2 = 0 c do k = 0,n call subroutine bibunkoshiki(x,y,z,dt) end do end c *********************************************************** subroutine bibunkoshiki(x,y,z,dt) c *********************************************************** x1 = x1 + y1*dt x2 = x2 + y2*dt y1 = y1 + z1*dt y2 = y2 + z2*dt c write(*,*) x1,x2 end c *********************************************************** function z(x) c *********************************************************** implicit real*8(a-h,o-z) z1 = (-11*x1 + x2)/10 z2 = ( x1 - 11*x2)/10 end
307 :
だめだめやがな :2005/07/07(木) 20:46:56
>>305 [Salford FTN77/Win32 v4.03, Copyright (c) Salford Software Ltd. 1988-1998]
Licensed to: FTN77 Personal Edition
Department: Non-commercial use only
0002) implicit real*8
*** Invalid list
1 ERRORS [<PROG036>FTN77 Ver 4.03]
0025) end
WARNING - Z2 has not been given an initial value (see -undef and
-only_undef options)
WARNING - Y2 has not been given an initial value (see -undef and
-only_undef options)
WARNING - X2 has not been given an initial value (see -undef and
-only_undef options)
WARNING - Z1 has not been given an initial value (see -undef and
-only_undef options)
WARNING - Y1 has not been given an initial value (see -undef and
-only_undef options)
WARNING - X1 has not been given an initial value (see -undef and
-only_undef options)
NO ERRORS,6 WARNINGS [<BIBUNKOSHIKI>FTN77 Ver 4.03]
0032) end
0033)
WARNING - X1 has not been given an initial value (see -undef and
-only_undef options)
WARNING - X2 has not been given an initial value (see -undef and
-only_undef options)
WARNING - Z has not been given an initial value (see -undef and -only_undef
options)
NO ERRORS,3 WARNINGS [<Z>FTN77 Ver 4.03]
*** Compilation failed
308 :
305 :2005/07/07(木) 20:52:11
うはwひどいなw
>>307 さんありがとうございますw
なおそなおそ(ソソクサ..
309 :
305 :2005/07/07(木) 21:08:33
(´・ω・`)サッパリ
311 :
デフォルトの名無しさん :2005/07/09(土) 19:31:32
積分を行うときに区分数を大きくしすぎると、逆に誤差がでてきてしまうのは どうしてですか?
312 :
デフォルトの名無しさん :2005/07/09(土) 19:46:12
サブルーチンの並びはこんな感じでいいですか? IMPLICIT REAL*8(X,Y) REAL*8 FUNCTION FUNC(X,Y) FUNC=SIN(X)+COS(X) RETURN END
314 :
デフォルトの名無しさん :2005/07/09(土) 23:37:06
>>313 さん
ありがとうございましたが、
REAL*8 FUNCTION FUNC(X,Y)
IMPLICIT REAL*8(X,Y)
FUNC=SIN(X)+COS(X)
RETURN
END
となるんですね?
てか関数の場合サブルーチンいいませんね。
315 :
デフォルトの名無しさん :2005/07/10(日) 11:50:04
ケタ落ちは整数同士の割り算のとき、あまりが切り捨てられること。→×割り算だけでない ケタ溢れはおもに掛け算で発生するが、加減や割り算で発生することもある。→○ 整数の加減ではケタ溢れが起こらない限りは正しい結果である。→○ ですよね?
ふつう、実数として浮動小数点演算を使うとき、気をつけるものだと思うが・・・
独学で初心者ですが,「外部関数を用いてeuler法により微分方程式を解く」 といったプログラムを作ってみましたが,エラーがでてしまいます. エラーを見たのですが,どうしてエラーなのかいまいちわかりません. 使用しているコンパイラはvisualfortranです.どうしてエラーが出るのかわかる方,回答よろしくお願いします.
318 :
317 :2005/07/11(月) 22:26:17
program euler implicit none integer :: i real :: h interface function f(x,y) implicit none real :: f real,dimension(1:1000),intent (in) :: x,y end function f end interface x(1)=0.0 y(1)=1.0 h=0.1 do i=1,1000 y(i+1)=y(i)+h*f(x(i),y(i)) x(i+1)=x(i)+h write(*,*) 'i=',i write(*,*) 'x=',x(i) write(*,*) 'y=',y(i) end do end program euler
319 :
317 :2005/07/11(月) 22:26:47
function f(x,y) implicit none real :: f integer,dimension(1:1000),intent(in) :: x,y f=0.5*(1.0+x)*y*y return end function f
320 :
317 :2005/07/11(月) 22:27:19
長くてごめんなさい.エラーはこんな感じです. C:\Program Files\Microsoft Visual Studio\MyProjects\7_11_2\7_11_2\euler.f90(14) : Error: This name does not have a type, and must have an explicit type. [X] x(1)=0.0 --------^ C:\Program Files\Microsoft Visual Studio\MyProjects\7_11_2\7_11_2\euler.f90(15) : Error: This name does not have a type, and must have an explicit type. [Y] y(1)=1.0 --------^ C:\Program Files\Microsoft Visual Studio\MyProjects\7_11_2\7_11_2\euler.f90(19) : Error: This name has not been declared as an array. [Y] y(i+1)=y(i)+h*f(x(i),y(i)) --------^ C:\Program Files\Microsoft Visual Studio\MyProjects\7_11_2\7_11_2\euler.f90(20) : Error: This name has not been declared as an array. [X] x(i+1)=x(i)+h --------^ C:\Program Files\Microsoft Visual Studio\MyProjects\7_11_2\7_11_2\euler.f90(32) : Error: The shapes of the array expressions do not conform. f=0.5*(1.0+x)*y*y --------^ Error executing df.exe. 7_11_2.exe - 5 error(s), 0 warning(s)
>>317 ・・・エラー見たら英語分からなくても、変数XとYがおかしいことくらいわかるでしょ?
参考までにexciteでエラーを翻訳しといたよ。
This name does not have a type, and must have an explicit type
→ この名前には、タイプを持たないで、明白なタイプがなければなりません。
This name has not been declared as an array.
→ この名前は配列として宣言されていません。
The shapes of the array expressions do not conform.
→ 配列式の形は従いません。
2番目の訳がexciteにしてはうまく訳せてるよね。
これを参考にXとYの何がおかしいか考えてみて。
頑張れ!
322 :
317 :2005/07/11(月) 23:11:11
>>321 ありがとうございます.
確かに変数xとyに問題があることはエラーからわかるのですが,
配列や型は宣言しているのに,なぜエラーなんだろうと思ってしまいまして・・・
もう少し粘って考えてみます.
>>322 そういう疑問だったのか。
じゃあ function f(x,y) の2つの引数x,yを、 function f(a,b) のように別の文字a,bを使って
書き換えてみればエラーの原因が分かるかもね。
ちなみにこれ、iを1000まで回してるけど、i=20程度でy(i)が発散するよ。
324 :
317 :2005/07/12(火) 01:45:33
>>323 ありがとうございます.
色々チャレンジしましたがだめでした・・・
このような簡単なプログラムが組めないようでは
まだまだ勉強不足ですね.
また明日から頑張ります.
325 :
デフォルトの名無しさん :2005/07/12(火) 20:01:17
>>315 あってますか?
過去問にあったので教えてください。
>>315 ,325
○×はあってるが、1問目の理由が違う。
1問目は「丸め誤差」、桁落ちではない。
tp://e-words.jp/w/E6A181E890BDE381A1.html
327 :
デフォルトの名無しさん :2005/07/12(火) 21:04:57
>>326 ありがとうございました。
ややこしいですが、大分とわかってきた気がします。
328 :
デフォルトの名無しさん :2005/07/14(木) 12:11:52
最初にキーボードからintegerを読み込ませて(例えば100とします)、 保存対象のファイルをこのintegerによって変えたいのですが(この場合'100.dat'に保存したい)、 下のようにするとうまくいきません。どこがおかしいのでしょうか? 教えてくださいお願いします。 implicit none integer :: i character*16 :: name read(*,*) i name = (char(i))//'.dat' open(11,file = name) write(11,*) 'ここに書き込む内容をかく' close(11) stop end
329 :
デフォルトの名無しさん :2005/07/14(木) 18:31:04
非対称行列の固有値と固有ベクトルを求めるprogramを 作りたいのですが、どこかにプログラム例などありませんか? ありましたら、教えてください。
>>328 Fortranには整数型や実数型の変数を文字型変数に変換する関数はありません(多分)。
代わりに「内部ファイルの方法」というのを使います。
こういうのです
↓
WRITE(文字型変数名,書式識別子) 数値型変数名
例えば整数型変数 i ( = 100 とする) を,3文字の文字型変数 kazu に変換するとしたら,
implicit none
integer :: i
character*7 :: name
character*3 :: kazu
read(*,*) i
write(kazu,'(i3)') = i
name=kazu//'.dat'
open(11,file = name)
write(11,*) 'ここに書き込む内容をかく'
close(11)
stop
end
ただ,こちらの手元に今,Fortranコンパイラがないので,試せていません。
ダメだったらごめんなさい。
【参考】
http://www.ip.media.kyoto-u.ac.jp/htomita/sec7.html#7.2.
>>328 char()って、「文字コード→文字(≠文字列)」な変換関数じゃない?
ASCIIコードなら、100→「d」。
>>331 内部ファイルを使うなら
>>328 のプログラムで
> name = (char(i))//'.dat'
の部分を
WRITE(name,'(I3,A)') i, '.dat'
または
WRITE(name,'(I3,''.dat'')') i
とすればOK
335 :
デフォルトの名無しさん :2005/07/15(金) 12:44:20
>>329 です。
LAPACKをインストールするまでに時間を使ってしまいそうですが、やってみます。
336 :
328 :2005/07/15(金) 23:26:39
337 :
デフォルトの名無しさん :2005/07/21(木) 01:23:08
メモリの動的割り当てと解放について、初心者でもわかるようにわかりやすく説明されたサイト はないか教えて下さい。 テストがあるんで急ぎです
339 :
デフォルトの名無しさん :2005/07/23(土) 09:16:56
サブルーチンの並びを考える問題なのですが、これで問題ないですよね? REAL*8 FUNCTION FUNC(X,Y) IMPLICIT REAL*8(X,Y) FUNC=SIN(X)+COS(X) RETURN END よろしくおねがいします
試してから書き込めばいいじゃん
341 :
デフォルトの名無しさん :2005/07/23(土) 19:49:44
IMPLICIT は NONE 以外使うな。 変数宣言使え。
implicit none 以外の implicit の使い方初めて見た希ガス
343 :
age :2005/08/06(土) 18:51:34
age
344 :
デフォルトの名無しさん :2005/08/15(月) 13:44:47
プログラムを動かすと、REAL*8 FUNC(A,A)のAの値を変えるごとにプログラムの速度が違う様なんです。 配列数を変えることによってプログラム実行速度はかわってくるのでしょうか? 6000>10秒 5800>5秒 5600>10秒 5400>4.8秒 もう何が何やらorz 環境はWindows pen4 メモリ1Gの環境です。
>>344 配列各要素に操作をしているなら実行速度に正の相関関係が生じるのは当然ですが、
秒数を見るとそれに起因したものではなさそうですね
気になるのは「その秒数はどうやって/何を計ったか」なのですが。
マルチプロセスのOSで応答時間を測定する事はあまり意味がない ということをご存知か?
秒数は目安としてdtimeで計測しています。 繰り返し計算で一回の計算が終わるたびに値をDos窓に表示させているのですが それを見ていても明らかに遅いのが判るので・・・・・。
同じ配列数場合、いつも実行しても、時間は変わらないのでしょうか?
はい、変わってないですね。6000で10秒くらい、5400で5秒付近です。 dtimeなので信用はできませんが 明らかに時間差があるため・・・謎ですね。 サブルーチンの時間計測してるのですがやはり一から書き直したほうが良さそうですねorz 解はまちがってないんだけどなぁー。
349 :
344 :2005/08/16(火) 13:37:38
解決しました!
サブルーチンのプログラムの中にある配列数を曖昧に今まで取ってたんですが
一番余分に配列組んでそうなところを少なくしてあげたら6000にしようが5100にしようが
4秒代で回るようになりましたorz
きちんとした原因がそこかは判らないのですがコンパイルの種類、f77,f90にしたりといろいろ
変化させた結果、それで安定したので・・・。
>>345 、347 ありがとう。
350 :
デフォルトの名無しさん :2005/08/19(金) 15:39:49
キャッシュのせい?
351 :
デフォルトの名無しさん :2005/08/27(土) 14:40:29
夏休みも残りわずか。 皆さん、宿題は終わりましたか?
>351 宿題っつうか学会発表のためのプログラム(fortran製)の ぶん回し中ですが何か?
すみませんがちょっと教えて下さい。 学生向けだと無料になる Linux 用 Fortran コンパイラがあった気が するんですが‥‥ありませんでしたっけ? Intel だったかなと思ったのですが,9.0 のアカデミック価格は \46,725 (税込)でしたし‥‥
355 :
352 :2005/08/30(火) 00:23:53
>353 応物 >354 >3
研究で、Fortran IVで書かれた古いプログラムを使う必要が有ります。 プログラムといえば、関数電卓のBASICくらいしかやったこと無いので、 自分でそのプログラムを書き換えることは無理だと思います。 Fortran IVのプログラムが動くソフトって有りますか?
357 :
356 :2005/09/03(土) 08:40:04
Windows XPか、Linux上で
コンパイルできればどんなOS上でも動くんじゃないの?
>>356 >Fortran IVのプログラムが動くソフト
それは、通常コンパイラと呼ばれるソフトです。
私があなたなら、該当プラットフォーム(OS)上で動くFortranコンパイラを販売している会社を調べ、
その会社に問い合せる。
360 :
デフォルトの名無しさん :2005/09/06(火) 20:52:23
ファイルの中身を全部コピーしたいんですけど、 read文を使う場合、読み込ませる変数を細かく設定しなければいけませんよね? 例えば、 "do i=1,10" を読ませたかったら、 read(1,*)a1,a2となりますよね? 毎回ファイルの中身が変わるので、それは面倒なんですよ。 とにかく、そのままコピーしたいんですけど、いい手ありませんか?
>>360 call system("cp hoge fuga")
>>360 ファイルの中身をコピーしてから「何をしたい」のかを
示さないと、
>>361 のような恐らく望んでいない回答を
されて、再度質問をすることになりはしないか?
363 :
360 :2005/09/07(水) 14:22:24
>361,362 申し訳ありませんでした。 ファイルに、新たな内容を追加したいということです。 A.datというファイルがあり、そのファイルの最下部にフォートランで計算 した値を追加したいのです。 ですから、新たなファイルをopen文で作成して、A.datファイル全体をコピーして 、そして追加内容をwrite文で書き込もうかと考えています。そのコピーの方法 を教えていただきたかったということです。 もし他にわかりやすい方法があれば、是非教えていただきたいです。
364 :
360 :2005/09/07(水) 17:54:05
ちなみに、コンパイラはCompaq Visual Fortran 6.6.0使用してます。
>>363 単純に A.datに追加書き込みするだけで良いのなら
open(UNIT=1, FILE='A.dat', POSITION='APPEND')
:
write(1, *) hoge
:
close(UNIT=1)
>>360 別のファイル名で作成して、call systemを使わないなら
FORTRAN90で
character(len=100) :: buf
open(io1,file='hoge',status='old')
open(io2,file='fuga',status='new')
do
read(io1,'(a)',iostat=iostat) buf
if(iostat/=0) exit
write(io2,'(a)') trim(buf)
enddo
close(io1)
write(io2,'("tekito")')
....
close(io2)
368 :
デフォルトの名無しさん :2005/09/10(土) 01:23:52
配列の大きさを求めた後で配列宣言したいのですが、 プログラムの途中で real::配列 としてもエラーになります。 どうすればよいですか?
自己解決しました
>>368 エスパー募集をやめる。
エラーと言っても様々なエラーがある訳で。
371 :
デフォルトの名無しさん :2005/09/14(水) 20:05:19
work_dir に a.out と 01,02…,099,100というディレクトリが既にある として下さい。その時に、 do j=1,100 i = system("./a.out > memo") i = system("mv memo ./j") end do のような事をしたいのですが、何か上手い方法を御存知の方はいないでしょうか? system=("")の中で変数を使えないかという事なのですが、どうでしょうか? ちなみに訳合ってshell scriptで、というのは無理なんです。
372 :
デフォルトの名無しさん :2005/09/14(水) 20:21:41
>371 内部WRITEで文字列を生成してsystemにわたせば?
373 :
371 :2005/09/14(水) 20:52:12
372さん、書き込みありがとう御座います。 仰ってるのってこんな感じですか? character ccc*3 do j=1,9 write(ccc,10)j i = system("./a.out > memo") i = system("mv memo ./ccc") end do 10 format('00',i1) でもこれでは普通に ccc ってファイルができてしまいます・・・。 変数であることをどう認識させるのですか?? $ccc でも @ccc でもうまくいってません。 基本的な質問ですいません。。
system("mv memo ./"//ccc) か character*100 cbuf cbuf = "mv memo ./"//ccc call system(cbuf) とかでいけるかな 自信はないけど、こんな感じでいけるんじゃね
375 :
371 :2005/09/15(木) 00:07:02
374様 Thanks a lot !! これで納期に間に合いそうです!w m(__)m
VBからFortranのdllを呼び出すサンプルプログラムをうpしていただけませんでしょうか? 変数(配列になっているやつも)の引渡しの部分も書かれているやつで。 ネットでサンプルプログラムを探しているのですが、なかなか見つからなくて困っております。
378 :
デフォルトの名無しさん :2005/09/16(金) 17:17:32
fortran で表形式のデータに対して SQLの sort やjoin みたいなことが出来るライブラリ等は無いでしょうか? 行列演算と、データベース的な処理の両方が必要なのですが、fortranは行列に偏っているように思われます。 (科学技術分野では当然か)
379 :
デフォルトの名無しさん :2005/09/16(金) 19:36:47
380 :
デフォルトの名無しさん :2005/09/22(木) 15:33:19
>>379 ありがとうございます。しかしDB操作で無くて、プログラム中でSQL的なデータの加工がしたいので、
それは使えません。自作するしかないかもしれません。
381 :
デフォルトの名無しさん :2005/09/25(日) 12:02:40
Intel FORTRAN9を購入した。 自動で並列化してくれつという宣伝につられた。 確かにタスクマネージャーをみると2個とも計算しているっぽい。 しかし、COMPAQのCVF8でコンパイルしたものと比べて(これは1つのCPUが動いている) 全然変わらない。 試したのはCAVITY流れの非定常計算(自作)で、同じマシンで両者を比較。 PentiumD 820を残った少ない予算で購入したのに・・・。 これまで使っていたPentium4 560のほうが速い。意味がなかった。 FORTRAN77形式で書いたのがまずいのかな。 (でも並列化してくれているし)
自動並列化がうまくいく確率なんて相当低そう。 PenDを無駄にしたくないならOpenMPで並列化してみ。 たいして難しくないはず。
>>381 自動並列化は全然役に立たない。多分、非常にシンプルなプログラムに限ってその効果が現れると思われ。
382の言うようにOpenMPで自分で並列化していくしかない。
>>383 多分、並列化の技術の使いかたをイメージできてないんじゃない?
自動並列化は役に立たないんじゃなくて、上手く並列化されるようにプログラムを変える
数式を解きやすいように変形するのと一緒
>>384 それでうまくいけば誰もOpenMPやpthread使わない。
数百行のソースなら簡単だけど。
386 :
381 :2005/09/26(月) 09:40:25
並列化計算は概要を読んだだけでほとんど勉強していない。 インテルのホームページを読むとこれまでのプログラムのままでも 多少の効果は期待できそうなことが書いてあったので。 自動並列化: インテルVisual Fortran コンパイラには、 ループを自動的にスレッド化する自動並列化機能が搭載されています。 このため、並列化によるマルチプロセッサ上でのアプリケーション・パフォーマンスの改善を 手軽に実現できます。自動並列化機能は安全に並列実行できるループを検出し、 これらのループに関してマルチスレッド・コードを自動的に生成するため、 イタレーションのパーティショニング、データの共有、スレッドのスケジューリング、 同期化といった低レベルの細かい作業をユーザが行わなくても並列化が可能となり、 マルチプロセッサ・システムやハイパー・スレッディング・テクノロジ対応システムの強力な パフォーマンスを活かすことができます。並列実行ループのベクトル化機能や、 ソフトウェア・ベースのスペキュレーティブ・プリコンピュテーション新機能など、 ハイパー・スレッディング・テクノロジ対応インテルプロセッサでのパフォーマンスの 向上につながる最適化の改良が行われました。 それにしても一応デュアルで動いているのに効果が全くないのは どういうこと?思ったほど高速化しなかったな、というのは よくあることだけど、計算が振り分けられれば多少は高速化すると 思うのだが。 タスクマネージャーをみる限りでは2個ともフルに動いていそうなのだが。
次のような単純ループのプログラムを自動並列化オプション付きでコンパイルしても、 CPU占有率は75パーセントがいいとこだったよ orz... program Console1 implicit none integer i, j, k integer, parameter :: NLOOP=1000 real(8) :: dum dum=0.0d0 do i=1, NLOOP do j=1, NLOOP do k=1, NLOOP dum=dum+sin(k*1.0d0) enddo enddo enddo write(*,*) dum end program Console1
sinなんて関数呼んだら、ループが並列化していいかどうか 判断できないんじゃ?
389 :
381 :2005/09/26(月) 14:08:23
行列の積だと100%になったよ。 ただし、行列×ベクトルだとコンパイルした時点で並列化してくれない。 もっとも多い計算が行列×ベクトルなのに・・・。 たとえば、これだと100%になった。 PROGRAM REI IMPLICIT NONE INTEGER ::I,J REAL(8),DIMENSION (5000,5000) :: A,B,C DO I=1,5000 DO J=1,5000 A(I,J) = 1.1d0 B(I,J) = 2.1d0 END DO END DO C = MATMUL(A,B) STOP END PROGRAM REI
>>389 MKLに入ってるblasだったら並列化されてるから、それ使えばいいんじゃない?
コンパイラに金を出したみたいだし、タスクマネージャとかいってるから Winユーザでしょ? てことはMKLも有償じゃぁ…
>>389 って事はベクトルは行列にしてから計算しろってことじゃね?
393 :
381 :2005/09/27(火) 00:05:57
>>391 お察しの通りWindows版です。
Linuxは扱い方がよくわからず、いろいろ不便なので
(インストールしてネットワークの基本的な設定ができる程度)
軟派ですがWindowsを使っています。
>>392 B(5000,1)にしろということでしょうか?(単純すぎ?)
この方法では並列化しませんでした。
うまいアルゴリズムを考えなくては。
並列化とOpenMP勉強します。
皆様、アドバイスありがとうございました。
>>393 なんとなくだがB(5000,5000)のB(x,x)だけ使えばいいんじゃね?
>>388 自動並列化がそんなにバカなら使い物にならないな。
ご教授おねがいします. module variables real(8),dimension(:,:),allocatable :: x integer :: i,j end module としてモジュールをつくり, program main use variables implicit none read(*,*) i,j allocate( x(i,j) ) !ここで配列xに値を代入する操作を行う call test() end program subroutine test() use variables implicit none !配列xに対する操作・演算を行う end subroutine というプログラムを実行した場合, 配列xに代入された値は,サブルーチン内から確実に参照できるのでしょうか? (正確な値が参照できる保障はあるのでしょうか) また,モジュール内でallocatable属性の変数を宣言し, プログラム内で動的確保,サブルーチン等で共有することは プログラミングの作法として許されているものなのでしょうか? なお,コンパイラはCompaq Visual Fortran 6.1を使用しています. よろしくお願いします.
>>396 普通はmodule内に、allocateするためのルーチンを作っておいて、それを呼びます。例えば
module variables
implicit none
real(8),dimension(:,:),allocatable :: x
contains
subroutine alloc_x(n1,n2)
implicit none
integer, intent(IN) :: n1, n2
allocate(x(n1,n2))
end subroutine
end module
みたいな感じで作っておいて、呼び出し側では
use variables
read(i,j)
call alloc_x(i,j)
で配列確保します。メリットはC++ライクなカプセル化ですかね。
398 :
396 :2005/09/29(木) 23:35:56
>>397 ありがとうございました.
Fortran90で,とりあえず動くプログラムを作ることばかりを考えてやってきてたので,
一度プログラミング作法やFortran90の仕様などをきっちり勉強したいと思います.
>>399 そういえば、Fortran2000だったか2005だったかで、OOP支援機能がなんか入るんじゃなかったっけ?
401 :
デフォルトの名無しさん :2005/10/01(土) 12:38:09
>>396 module variables
real(8),dimension(:,:),allocatable :: x
integer :: i,j
CONTAINS
subroutine test()
use variables
implicit none
!配列xに対する操作・演算を行う
end subroutine
end module
とするのがこの場合の本来的な型。
402 :
デフォルトの名無しさん :2005/10/02(日) 10:32:07
>>396 module variables
real(8),dimension(:,:),allocatable :: x
integer :: i,j
!
CONTAINS
subroutine test()
use variables
implicit none
!配列xに対する操作・演算を行う
end subroutine
!
end module
とするべし。
allocateに関しては問題なし。
>>402 subroutine test() 内の use文は不要じゃない?
後、配列の大きさは size() で調べられるから
モジュール内の i, j は不要な気もするけど
そこら辺は好みの問題か。
variable::test() みたいに呼べればいいのにな。
質問 学生時代ずっとf77ばっかりで 会社に入ってようやくf90をやりました。 配列式、メモリの動的確保、do-enddoとか 便利なところは感じますが疑問もあります。 moduleってどんなメリットがあるのでしょう? 使い方も難しくて利点がよくわかりません。
commonとincludeを使わないで良くなるからmoduleのほうが好きだ。 コードもきれいに書けるし。
研究でVAX FORTRANという言語を使わないといけないんですが 開発環境はどこでダウンロードできますか? 探したんですが見当たらなくて 誰か教えてください。。。
409 :
405 :2005/10/04(火) 21:26:05
>>406 >>407 ありがとう。
理解したとは言えないけど、なんとなくわかった気がします。
学生時代、研究でドイツ人の書いたf90ソースを改良しなくてはならないのに
f77しか知らずに、moduleとかすごい嫌いになったんですよね、、。
勉強してみようかな、、。
410 :
405 :2005/10/04(火) 21:27:35
>>407 すいません、追加で質問です。
commonはなぜ危険なのでしょうか?
どこで変更しているかが明示されないから
commonとequivalenceはgoto文と同じくらい凶悪です。
Microsoftがfortranに手を出さないのは何故でしょうか?
>>414 つ 【Microsoft Fortran PowerStation】
売れないからでしょ
姫野ベンチってさ、FortranのよりCの方が30パーセントくらい速いんだけど、そんなもんなの?
どのFortranやねん
intel visual Fortranの購入を考えているんですが、これのマニュアルにはネット接続環境でないと アップデートができないとありますが、インストールしたあとでアップデートを受けたい場合には ネットに接続し、手動でオンライン認証を受ける必要があるんでしょうか?
Visual FortranオンリーでGUIなプログラムつくっている人っているのかな?
>>421 アップデート方法は基本的に
インテルのプレミアサポートから新しいバージョンを丸ごとダウンロードして
古いバージョンをアンインストール→新しいバージョンをインストール
プレミアサポートにログインするためには予め登録しておいたIDとパスワードが必要。
c2fはどこにあるんでしょうか? >6のリンク先のリンク先は切れているし c2f.zipでググってもリンク切ればっかりで見当たりませんでした
>425 ありがとうございます
簡単な質問ですいませんが、正の実数Xを入力して その小数部を出力するにはどうすればいいんですか?
簡単な質問ですいませんが、正の実数Xを入力して その小数部を出力するにはどうすればいいんですか?
(Xの小数部) = (実数X) - (Xの小数部を切り捨てた値)
x = x - real(int(x))
431 :
デフォルトの名無しさん :2005/10/10(月) 21:41:12
文字処理でcharacter型変数に格納されている文字数を取得したい場合 どうすればよいでしょうか? C言語ではヌル文字があって比較的簡単だったのですが,Fortranでは無いようなので…
WRITE(*,*) LEN_TRIM(' Hello, World! ')
433 :
431 :2005/10/10(月) 22:00:38
>>432 即レスありがとうございます.
できました!
435 :
デフォルトの名無しさん :2005/10/13(木) 08:25:31
IntelのMKLって試用期間過ぎてもスタティックライブラリをリンクして使えてるんだが、こんなもんなの?
438 :
435 :2005/10/13(木) 22:47:23
>>437 おおありがとう.
リンク先も参考にさせて頂きます.
エラーが出てしまい、自力での解決が難解なので、皆さんの知恵を貸してください。 プログラムの一部に E(I)=1.0D00/DSQRT(DREAL(X(I,I))) という行があるのですが、新型のPC&コンパイラにしたところ、今までは出てこなかったエラーが出てきてしまいました。 エラー表示は fortcom: Warning: ファイル名.f line 2401: This argument's data type is incompatible with this intrinsic procedure; procedure assumed EXTERNAL. [DREAL] E(I)=1.0D00/DSQRT(DREAL(X(I,I))) ------------------------------^ /tmp/ifortIC65Ir.o(.text+0x18f5d): In function `secula_': : undefined reference to `dreal_' /tmp/ifortIC65Ir.o(.text+0x19264): In function `secula_': : undefined reference to `dreal_' といった感じです。dreal、dsqrtの両方のdを外せば解決はしますが、精度が低くなりすぎて使えません。 dをつけた状態でコンパイル時にエラーが出なくなるにはどうしたらよろしいでしょうか。 PC構成は、OSがsuse9.1、コンパイラが無料版のintel fortran 9.0です。 古いPCですと、OSがredhat6.2、コンパイラがabsoftのpro fortranです。 よろしくお願いします。
dをつけた状態と書きましたが、精度が失われなければ問題ありません。 あるいはより高い精度になる分にも一向に構いません。 ただ、これよりも精度が劣ることがないようにしていただきたいのです。
>>439 種別型パラメタがあってないのかも。
・E(I)=1.0D00/DSQRT(DREAL(X(I,I),KIND=8))
・E(I)=1.0D00/DSQRT(DBLE(X(I,I)))
のどっちかでコンパイル通ったりしない?
種別型パラメタって、
REAL*8の"*8"とかREAL(8)の"(8)"ってやつね。
442 :
439 :2005/10/18(火) 18:27:56
>>441 ありがとうございます。
下の方法にてコンパイルが成功いたしました。
現在実際に計算しています。
精度については結果待ちなので明日にならなければ分かりませんが、
いい結果が出ることを祈ってます。
443 :
439 :2005/10/19(水) 12:05:12
精度に関しても特に問題ありませんでした。 本当にありがとうございました。
E・∇・ヨノシ <444ゲット♫
form='binary' で open して読み書きしたいんだけど g95 だとコンパイルエラーになる・・・ 何か対策無い?
>>445 form='binary' のかわりに access='stream' を使うとか。
普通、 unformatted使わないか?
>>446 ありがとー。
access='stream' で望んだ結果が得られました。
449 :
デフォルトの名無しさん :2005/10/24(月) 13:01:06
450 :
デフォルトの名無しさん :2005/10/28(金) 00:21:02
WinXPユーザーなんですが、 Salford FTN95でコンパイルしたものと g95でコンパイルしたexeのサイズがぜんぜん違うんです。(10倍ぐらい) (30行くらいのものです) Salford FTN95はいちいち最初にメッセージが出るんでコンパイラーを変えたいんですが g95をこのまま使い続けてもいいんでしょうか。
>>450 どっちかがスタティックリンクをしているから大きくなる?
452 :
450 :2005/10/28(金) 00:47:24
>>451 そうなんですか。気にしないでおきます。たいしたプログラムは組みませんし。
ありがとうございました。
ところで、gfortranとg95はどちらが優れているのでしょうか。
とにかく早く計算したいんです。
別にこの二つに限らないのでWinXPで動くフリーのFortran90コンパイラーを紹介してください。
453 :
451 :2005/10/28(金) 00:52:20
「早く」ということは、実行速度はともかく短期間で 実行可能なプログラムを作りたいということと考えれば g95でないかな。gfortranではコンパイル出来なかった プログラムがg95では出来たことがある。 フリーのコンパイラの件は知らん。
>>452 貧乏なら無償のIntel FortranをLinuxにインストール。
金があるなら、Windows版Intel Fortranを買え。アカデミック版なら大した金額じゃない。
お遊び程度なら、Linux上でgfortranかな。
>>454 Linux上で、っていう要件を満たせるなら、遊びでも素直にIntel Fortran使ったほうが吉かと。
>>456 IFCってIntel Fortran のバージョン7までだよね?
8からはifort。7系列をダウンロード出来る場所を
見付けられなかったよ。premierサポートに登録して
いて8と9はダウンロード出来た。
いやバージョン関係なくIntel Fortran Compilerの略でIFCって使ったんだけど。 8以降はifortって言わないといけないのか。
459 :
450 :2005/10/29(土) 02:06:35
みなさん、ありがとうございます。 LinuxのIntel製コンパイラーが優秀なのは知っているのですが、 なぜかインストールに失敗してしまいます。 Linuxに関してはかなり初心者なのでインストール方法があっているかも 自信はありません。 Vine Linux3.2はとっつきやすそうなので挑戦したいと考えてはいます。 LinuxになれたらIntelコンパイラーを入れてみようと思います。
すいません、わからないので教えてください。 使ってるのは「fortran90」です。 「0度から90度まで5度刻みで、小数点以下5桁の精度の 三角関数sinとcosとtanの表を作れ。ただし、tan90°の 値には・・・・(中点4つ)を表示させること。」 途中まで作ったんですが…、最後の「tan90°の 値には・・・・(中点4つ)を表示させる」がわかりません…。 real, parameter :: rad=3.1415926/180.0 real :: r,s,c,t integer :: k print*, "角度 sin cos tan" do k=0,90,5 r=k*rad s=sin(r) c=cos(r) t=tan(r) print'(1x,i3,2x,3f10.5)',k,s,c,t end do end
IF文使えば?
FORTRANというより数学の問題じゃないか。 なんで90度のtanだけ特別扱いになるか分かってるか?
こんなの宿題か何かだろ?いちいち助言してたらキリがないよ。
>>460 も自分で考えな。
プログラムを書くことからじゃなくて、アルゴリズムを先に考えるんだぞ。
そういえばFortran 2003 には Floating-point exception handling が有るそうだが どんな感じになるの? 調べてもようわからんかった・・・
intelのサイトしか見てないけど intelのwindows版コンパイラはvisual fortran版しかないの? linux経験がないので非商用版を使う前に評価版で性能とかを win上で確かめたかったけど
>>465 どういう意味?
Windows版でもコマンドライン環境で使えるよ。
467 :
465 :2005/11/05(土) 01:12:52
質問です。 今までCompaq Visual Fortran 6.6(以降CVF)を使っていましたが 最近Intel Visual Fortran(以降IVF)に乗り換えました。 ところがデバッグの仕方がわからず四苦八苦しています。 例えば real*4 x(100) に対して do i = 1, 101 x(i) = 0.0 enddo と書きます。 CVFを使って、この状態でデバッグ実行すると、配列オーバーで止まり その時点での変数iの値などを見れました。 ですが、IVFだと止まることは止まるのですが 変数の中身が見れません。 Visual Studio関連のソースだと思うのですが Cのソースコードが表示された状態からどうしたらよいかわかりません。 IVFでこの問題解決する方法ってありますか? マニュアル読むにしてもキーワードもわからないので 何かアドバイス頂けたら、、と思います。
469 :
デフォルトの名無しさん :2005/11/10(木) 22:17:41
>>468 Intel Visual Fortranでよくありますね。
エラーが出てプログラムが止まった時にDOS窓に戻ったら、
どこでエラーが出たかメッセージが書いてませんか?
サブルーチン名みたいなのと行番号みたいなのがあわせて書いてあると思うのですが。
それがないようなら、PAUSE文をたくさん挿入するなり、
「カーソルの行まで実行」で順に見ていくなりして、
様子を見るしかないと思います。
cvfも残しておいたほうがデバッグがしやすいよな
472 :
468 :2005/11/12(土) 10:27:22
>>470 >>471 レスありがとうございます。
機能的に無理なのですかね〜。
上位互換ということでCVFでできたことは全部できるかと予想していたのですが。
行番号などは確かにプロンプトに出ていますね。
それがループの中とかじゃなければ、その情報でも作業できるんですけどね〜。
g77のときには無事コンパイルできていたのですが、gfortranになってからコンパイルエラーになります。 INTEGER MASKA DATA MASKA/'377'0/ END 某プロフラムのソースで見かけたのですが、勉強不足なのか、このDATA行の意図することが分かりません。 MASKA はINTEGERで、DATAにある '377' は「377というCHARACTER」を入れようとしているように読めるのですが…。 「377*0」でもなさそうですし、「3770」なら、そのまま書けばいいように思うのですが、どういった意味になるのでしょうか。
>>473 自己レス
「'377'0」ではなく「'377'O」でした。
で、これは8進定数 (octal constant) というものでした。
gfortranでは「O"377"」と書いてやらないとコンパイルエラーを起こします。
ちょっとお聞きしたいです。fortran77です。 format文でデータを5個横に羅列し、 改行してまた5個、以後繰り返しというプログラムのはずなんですが、4個目で改行、 5個目がひとつ書いてあって改行、以後繰り返し、という感じになってしまいます。 format文なしでやっても一緒でした。 一行あたりの文字量の問題かとも思ったのですが・・ なにかヒントいただけたら幸いです。
>>475 WRITE(*,*) 0.1, 0.2, 0.3, 0.4, 0.5
と、書式を指定しない場合は、(コンパイラ依存かもしれないけど)
1行72文字 or 80文字で自動的に改行が入る。
(ファイルへの出力、標準出力いずれでも結果は同じ。)
WRITE(*,'(4F12.6)') 0.1, 0.2, 0.3, 0.4, 0.5
と、Format文で4つ分の書式しか指定していなければ
5つ目のデータ(ここでは0.5)が改行されてから出力される。
WRITE(*,'(5F12.6)') 0.1, 0.2, 0.3, 0.4, 0.5
と、ちゃんと5つ分の書式をしていれば、必ず改行なしで出力される。
80桁を超えてももちろんOK。
なんで、Format文でデータ5つ分の書式を指定していることをチェックしてみれば?
>>476 ありがとうございました!5つ分の式が書いていませんでした。。
というか、出力6個あったのに5個と勘違いしていました。。
非常に助かりました。ご丁寧にありがとうございました。
>>478 お、すげー!x86でSolaris試したかったんだけど、CコンパイラはともかくFortranコンパイラがないのがネックだったんだよね。
480 :
デフォルトの名無しさん :2005/11/21(月) 17:31:03
rand() を使わずに乱数を作りたいのですが、 誰かわかるかた教えていただけませんか?お願いします。
481 :
デフォルトの名無しさん :2005/11/21(月) 18:07:45
>>480 「乱数」伏見正則,東京大学出版会がいいと思う。
乱数発生するPCIカードとかあるよ。
483 :
デフォルトの名無しさん :2005/11/21(月) 18:21:28
>>481 ありがとうございます!調べてみます
>>482 できればプログラムの書き換えだけで済ませたいのです、、、。
でも書き込みありがとうございます!
>>481 Numerical Recipe に解説+プログラムが
数パターン載ってる。
485 :
デフォルトの名無しさん :2005/11/22(火) 10:52:26
なんとか解決できそうです。 みなさんありがとうございました!!
487 :
デフォルトの名無しさん :2005/11/23(水) 01:19:40
学校でFortranを習っているのですが、レポートがわかりません。 ..以下のプログラムを作成しメールで提出 ..「級数展開によりsin(xπ) を求め、表示する」 .. x とn は実行時にキーボードから入力 .. 実数の計算はすべて倍精度で行う という内容です。級数展開の内容は次の通りです。 sin(xπ) ≒ xπ - ((xπ)^3)/3! + ((xπ)^5)/5! - ((xπ)^7)/7! + ((xπ)^9)/9! - ・・・・ ((xπ)^(2n-1))/(2n-1)!
488 :
487 :2005/11/23(水) 01:21:00
授業で習った文法(?)で使えそうなものは、doとifぐらいです。 作ってみたのですが、これで合っているかどうかわかりません。 御指導お願いします。 program taylor_expansion implicit none interger :: i, j, n, kai real(8) :: pi, x, result intrinsic atan, sin pi = 4.0D0 * atan(1.0D0) write(*,*) "input x" read(*,*) x write(*,*) "input n" read(*,*) n
489 :
487 :2005/11/23(水) 01:21:46
if (n<=0.0D0) then write(*,*) "error! n must be natural number!" else kai = 1 result = 0 do i = 1, n do j = 1, 2*i-1 kai = kai*j end do result = result + (-1.0D0)**(i+1.0D0) * (x*pi)**(2.0D0*i-1.0D0) / kai end do write(*,*) "sin(x*pi) is about",result write(*,*) "sin(x*pi) is",sin(x*pi) end if stop end program
>>487-489 kaiの初期化の位置がおかしい。
このままでは i のループの2回目以降で前回の値が持ち越されてしまう。
それから n を大きくすると階乗の値がオーバーフローする恐れがあるので
kai は倍精度実数の方がいいかも。
491 :
487 :2005/11/23(水) 18:38:10
>>490 考えてくださって本当にありがとうございます!
「kai」の初期化の位置については全く気がついていませんでした。
result = 0
do i = 1, n
kai = 1
do j= 1, 2*i-1
と書くべきですよね。
明日学校でコンパイル・実行して試してみます。
ありがとうございました。
級数展開でsin関数を計算する意図が良く分からない。手計算しかできないときは役立つけどさ。 その先生、頭悪いんだろうな。 ご愁傷様。
>>492 ただの練習問題なんだろう。
そんなのの内容にまで一々ツッコミ入れてたらきりがないよ。
>>487 それよりも、ここに書き込み出来る環境があるなら
机上だけで悩んでないでフリーのコンパイラでも入れて
自分でも試すようにした方がいいよ。
494 :
デフォルトの名無しさん :2005/11/23(水) 23:26:28
>>492 287を積んでない286マシンで極座標とか円筒座標の座標計算するときには役に立つと思う。
今はありがたみを感じないかも知れないけど。
たぶんセンセはその時代の人なんでしょう。
つか、その世代だとテーブルに格納してたと思うけど。
497 :
487 :2005/11/24(木) 22:18:26
>>490 今日学校でコンパイルして実行してみると、うまく動いてくれました。
まだプログラミングを始めて間もなく、自分で作ったプログラムの中ではいちばん難しかったのでとてもうれしかったです。
アドバイスしていただきありがとうございました。
>>492-493 ただの練習問題です。
フリーのコンパイラを入れて自分のパソコンでもコンパイルできるようにしようと思って試したのですが、
コンパイラの設定がうまくいってないのか、挫折してしまいました。
また今度やってみます。
sage
499 :
デフォルトの名無しさん :2005/11/25(金) 17:04:17
500 :
デフォルトの名無しさん :2005/11/26(土) 22:48:00
real A( 5, 2 ) call s( A ) subroutine s( A ) real A( 4, 2) ・・・ end 上のようなプログラムを作った場合、例えばメインプログラムのA(1,2)と サブルーチンのA(1,2)は違うものになってしまいます。C言語と配列の メモリ上配置が違うためというのは分かったのですが、これに対処するために どうすればよいでしょうか? ・配列の添え字を逆にする。 ・最後の添え字の次元をサブルーチンに渡す。 この2つしか思いつかないのですがどちらもわずらわしいです。 なにかいい方法は無いですか?
>>500 最初の次元の長さが固定なら、
PARAMETER (N=5)
とか書いたヘッダファイルparm.hを用意して、
PROGRAM MAIN
INCLUDE 'param.h'
REAL A(N,2)
...
END
SUBROUTINE S(A)
INCLUDE 'parm.h'
REAL A(N,*)
...
END
とか書けば?
Cから書き直してるなら添え字を逆にしないと性能が大きく変わる
可能性があることは知っておくべし。
502 :
デフォルトの名無しさん :2005/11/27(日) 00:40:52
>>499 ライブラリがつながっていないのではないかな?
HELPのUNIXでのコンパイルとリンクないしWindowsでのコンパイルとリンクのところをみて
ライブラリのリンクするための環境変数の設定を確かめてみれば?
>>500 FORTRAN90以降ならサブルーチン側での宣言を
real A(;,;)
で次元だけ合わせる形にしておけばとりあえず呼び出し側と同じサイズに自動的になる。
FORTRAN77なら整合配列を使う。呼び出し側で配列の大きさも渡す。
call(n1, n2, a)
...
sub(a)
real a(n1, n2)
...
ただし、FORTRAN77はサイズのチェックをしないから、サブルーチン側で擬寸法仮配列として
宣言しておけば、添え字の最後の大きさを明示的に渡さなくてもいい。
real(5,4)
...
call(5, a)
...
sub(n1, a)
real a(n1, *)
...
さらにいえば、FORTRAN66時代に書かれている既存のプログラムの場合、最後の次元を
擬寸法で与えることも無く、任意の整数値を入れてあることがある。(1とか10のことが多い。)
503 :
500 :2005/11/29(火) 20:52:43
>502 解決しました。どうもありがとうございました。
504 :
デフォルトの名無しさん :2005/11/29(火) 20:55:37
プログラム全体を通してのパラメータの定義をする方法というのは ありますか? サブルーチン、関数ごとに parameter ( a=10, b=20 ) という風に何回も書いているのですが、バグの元になっています。
use か include を使う。
506 :
499 :2005/11/30(水) 22:23:09
>>502 遅くなりましたが、ありがとうございます。
調べてみます・・・。
507 :
デフォルトの名無しさん :2005/12/11(日) 11:20:44
999 CONTINUE
508 :
デフォルトの名無しさん :2005/12/11(日) 11:56:42
条件分岐で 例えば 変数 i,j,k,l が1から10までそれぞれとりうるとき その各々について 分岐させたいんだけど なにかいい命令文ない? それぞれで内容がおおきく異なったり、おなじになったりするから if,select case,do,where どれも適当なものにならない (書く量が莫大になる) なにかいい命令文ない?
509 :
508 :2005/12/11(日) 11:58:00
ちなみにfortran90 です
>>508 いまいち状況がよく分からないけど、
num=(i-1)*1000+(j-1)*100+(k-1)*10+(l-1)
ってな感じでひとつの変数にまとめてから、
select caseを使って分岐するってのはだめ?
if文だらけの状態でここにサンプル書いてみれば? 効率的にできるアドバイスもらえるんじゃね?
512 :
デフォルトの名無しさん :2005/12/12(月) 18:23:59
Microsoft Visual .NET でFortranコンパイラを使っているのですが, 実行すると ifort: Command line warning: ignoring option '-extfor'; argument required ifort: Command line warning: unrecognized source type 'C:\Documents and Settings\aoyama\My Documents\Visual Studio Projects\yabai\shallowgtemp3d8_new'; object file assumed ifort: Command line warning: no action performed for specified object file(s) というエラーメッセージが表示されてしまいます。 これはどういう意味なのでしょうか? またその解決法があれば教えていただきたいです。 お願いします。
>>512 ソースのファイル名が「-extfor」になってない?
ファイル名と拡張子(固定形式なら .for か .f、自由形式なら .f90)を確認してみて下さい。
514 :
デフォルトの名無しさん :2005/12/13(火) 13:23:04
>>513 ファイル名を.f90にしたところ上のようなエラーメッセージがなくなりました。
ありがとうございます!
515 :
デフォルトの名無しさん :2005/12/14(水) 10:30:50
10個の数字を大きい順に並べる方法を教えてくれい
>>515 「ソートアルゴリズム」とGoogle先生に聞けば即答してくれるよ。
しかも何通りも出てくる。
f2cを使ってfortranのソースをc言語のソースに変換したいんだが、redumeが英語で 使い方が良く分からん!f2cってどうやって使うの?
>>519 せめて自分の環境と何をどこまでやったのかくらい書いてくれや。
>>517 だけじゃ回答する方もよくわかんないッス
521 :
デフォルトの名無しさん :2005/12/20(火) 14:42:34
プログラム終了時にsendmail等を使ってメールを送信することは出来ますか? (fortran77)
シェルスクリプト組めば何でもできるでしょ。
523 :
521 :2005/12/20(火) 14:59:40
>>522 具体的にソースにどのように書けばいいのかを教えて欲しいのですが。
#! /bin/sh (fortranの実行ファイル名) cat finish.txt | mail -s 'pugaaa' someone@somewhere とでも書いておけ。つか、Unix勉強汁
525 :
521 :2005/12/20(火) 16:15:33
>>524 出来ました!
どうもありがとうございます!
526 :
デフォルトの名無しさん :2005/12/20(火) 21:48:13
intel visual fortran 9.0と visual c++ .net 2003の連携って どうやったらできるのでしょうか? いきなりの質問ですいません 教えてくださいm(__)m
IVFに連携用のインストーラあるから、それ入れると自動的にできるよ。
× Fortranがタダで手に入りますよ ○ 商用Fortranがタダで手に入りますよ
>>528-529 Solaris版ね。
Linux版の方にはコンパイラは含まれていない。
531 :
デフォルトの名無しさん :2005/12/22(木) 13:10:27
電気工学の研究をしている者です。 非常に基本的な質問で恐縮なのですが、 誰かご存知の方がいましたら教えてください。 ある数値データファイルおいて、 数値データファイルの1行目から20行目まで、 そのデータの測定情報が記載されていて(つまり文字データ)、 22行目から数値データの羅列が始まっている数値データファイルがあります。 この数値データファイルを読み込ませて処理をする場合、 21行目までを無視して、22行目から読み込むようにする方法はあるでしょうか? 自分でも色々やってみましたが、結局同じファイルをコピーして、 文字データ部分を削除したファイルを作成し、使用しています。 これは面倒だし、ファイル数も多くなるので、 直接元のデータファイルを処理できれば便利なのです。
>>531 行頭から、ASCII文字が21文字詰まっているものとして読み込み&無視
534 :
デフォルトの名無しさん :2005/12/22(木) 15:11:37
>ASCII文字がつまっているものとして処理 すいません。具体的にどうやればよいのでしょうか。 これを応用すれば、1行目から21行目まで、 IF文で「数値データでないとき、次の行にうつる」 といったことができそうですね。
>>531 WRITE文で後ろに変数を書かなければ
自動的に1行スキップしてくれる。
> OPEN(10,FILE='hoge.dat')
> DO i=1,21
> WRITE(10,*)
> END DO
> (…このあとデータ読み込み)
> CLOSE(10)
あと、
>>532 が言っているように行頭の20文字を無視したい場合は
CHARACTER型の変数を用意して
> CHARACTER*20 chr
> WRITE(10,*) chr, (データを格納する変数)
って感じに書けばOK。
>>535 writeでやると、ファイルに空白行書き込んじゃうことにならない?
>>535 >> WRITE(10,*) chr, (データを格納する変数)
WRITE→READの間違いだとして
書式指定なしでやると途中でスペースやカンマが出てきた場合
そこで文字列の読み込みを止めて変な値を読んじゃうよ。
READ(10, '(A20,3G8.0)') chr, x, y, z
または
READ(10, '(20X,3G8.0)') x, y, z
538 :
535 :2005/12/22(木) 20:19:09
間違いだらけだし…。すまん。
>>536 WRITE→READの間違いです。
>>537 それは知らなかった。指摘ありがと。
539 :
デフォルトの名無しさん :2005/12/23(金) 01:38:19
みなさん。ありがとうございました。 みなさんの意見を参考に、以下のようなプラグラムをつくり、解決できました。 OPEN(10.FILE='file.csv',STATUS='OLD') DO 100 K=1,LEN+21,1 IF(K.LE.21) THEN READ(10,*) ELSE READ(10,*) T,C HAIRETSU(K-21)=C END IF 100 CONTINUE … CLOSE(10) LENというのは、数値データの個数です。 読み込むデータファイル「file.csv」は、 一列目が空白で、2列目に数値データファイルが入ってるので、 一列目にTというダミーの変数を用い、2列目のCの値を配列に格納するプログラムです。 ここでまた質問なのですが、このプログラムだと、1列目の空白をTという変数に読み込むという 無駄な操作をしていることになり、効率が悪いと思われます。 この操作をなくして、直接2列目の数値データだけを読み込ませる方法というのはあるのでしょうか?
>>539 データが馬鹿でかくて読み込みにものすごい時間がかかってるのでないなら気にすんな。
データが馬鹿でかくて読み込みにものすごい時間がかかってるとしても、
そのプログラムを何回も実行しないなら気にするな。
そのプログラムを何回も実行するなら素直にデータ変換しる。
>>539 書式指定して読み込め。効率はほとんど変わらないけど。
542 :
デフォルトの名無しさん :2005/12/23(金) 21:47:31
この場合の書式指定のやり方がよくわからないです。 でもたしかにこの部分は一瞬で終わるので、気にしないことにします。 ありがとうございました。
543 :
デフォルトの名無しさん :2005/12/29(木) 23:33:17
100 CONTINUE
GOTO 543
/******************* ここへは絶対来ないw ********************/
失敗
! ここへは絶対来ないとか c ここへは絶対来ないと書くべきでは?
548 :
デフォルトの名無しさん :2006/01/01(日) 01:03:46
STOP 'ERROR'
549 :
デフォルトの名無しさん :2006/01/06(金) 00:08:23
>>539 単にこれで良いのではないか?
OPEN(10.FILE='file.csv',STATUS='OLD')
DO 100 K=1,LEN+21,1
READ(10,*) HAIRETSU(K-21)
100 CONTINUE
CLOSE(10)
HALT
551 :
デフォルトの名無しさん :2006/01/07(土) 16:42:28
マックを買おうと思うんですが、マックで使えるフリーの95コンパイラってありますか?
g95とか gfortranとか
553 :
デフォルトの名無しさん :2006/01/08(日) 11:21:05
>549 駄目です。1列目を考慮する部分が抜けているからだと思います。 そのプログラムだと、1列目(空白)が配列に読み込まれるから、 配列にはすべて「0 もしくは0.000…0E+00」が読み込まれます。 ところで、21行目までを無視する部分は無くても 正しい結果は出力するみたいですが、 私の使用している富士通のコンパイラだと実行時に、 英語の文章がずらずらと表示されて不快なので、 (よく読んでないですが、どうも入力装置10や、文番号100に関係するようです) やはり21行目までを無視する部分は必要だと思います。
554 :
デフォルトの名無しさん :2006/01/08(日) 18:32:05
すいません、どなたか教えていただきたいのですが Fortranでf(x)の積分グラフの面積を台形公式により求め、 さらにその誤差を求めるプログラムなのですが・・・ どのようにしたらよいのでしょうか。 わかる人どなたか、お願いします。 m(._.)m
そんな典型的な例題も探せないのか?人生やりなおせ
どなたか教えてください 例えば INTEGER A,B,S,P DO 4 A=2,7 DO 4 B=2,7 DO 3 S=-2,2 DO 3 P=-2,2 WRITE(6,*) A,B WRITE(6,*) S,P 3 CONTINUE 4 CONTINUE STOP END を実行してA,B,S,Pを表示させてみると、Aが6から始まったり、Pが−1から始まったりしてしまいます。 何がまずいのでしょうか?
>>549 配列はみだしてるw
>>556 多分問題は全然違うところにあるw
ところでFORTRAN77で行くなら、暗黙の型宣言は死んでも守ったほうがいい。バグの元。
悪いことは言わないから A,B,S,P はそれぞれ IA,IB,IS,IP にしておけ。
>>556 宣言してあってもAやBが整数なのは気持ちが悪い。
…問題の本質とは関係ないが。
ところでコンパイラは何?
>>558 REAL*8 HAIRETSU(-20:LEN)
とかしとけば大丈夫!
…文字列読み込んだとたんにruntime errorになりそうだが
561 :
デフォルトの名無しさん :2006/01/09(月) 01:11:27
>>560 10 READ(10, *, err = 10) HAIRETSU(K-21)
これで乗り切る手もあるがw ホンモノのエラーが出ると無限ループへwww
素人ばっかだな
>>562 玄人さまwwww なんか芸を見せてみろw
print *, 'Pugyaaaaa!'
565 :
デフォルトの名無しさん :2006/01/10(火) 16:49:50
どなたかintelのコンパイラでintelのmklのLAPACKについておしえてください.
自前のテスト用プログラムや,exampleのファイルをコンパイルしようとすると,'Error in opening the Library module file'というエラーが出ます.
対処方法がわかりません.それどころかライブラリのインストールや設定に問題がありそうなのか,プログラムのコードに問題がありそうなのか,どのあたりが怪しいのかも判断できません.
ちなみにライブラリを利用しないコンパイルは問題ないです.どのあたりを確認していけばよさそうでしょうか.
環境:
Linux fedora 2.6.11-1.27_FC3 i686 athlon i386 GNU/Linux
http://www.xlsoft.com/jp/products/intel/perflib/mkl/lin/Getting_Started.htm#Linking_Your_Application_with_Intel_MKL を参考に、
$ifort gesvd.f90 -L/opt/intel/mkl/8.0/lib/32/ -lmkl_lapack95 -lmkl_lapack -lmkl_ia32 -lguide -lpthread -o ~/f/a.out
とやってみました.
fortcom: Error: gesvd.f90, line 27: Error in opening the Library module file. [MKL95_PRECISION]
USE mkl95_PRECISION, ONLY: WP => SP
----------^
fortcom: Error: gesvd.f90, line 28: Error in opening the Library module file. [MKL95_LAPACK]
USE mkl95_LAPACK, ONLY: GESVD
…(略)…
compilation aborted for gesvd.f90 (code 1)
intel_mklのマニュアルに書いてあった設定は済ませています.といっても環境変数だけです.
$echo $PATH
/opt/intel/idb/9.0/bin:/opt/intel/fc/9.0/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/user/bin:/usr/java/jdk1.5.0_01/bin
$echo $LD_LIBRARY_PATH
/opt/intel/mkl/8.0/lib/32:/opt/intel/fc/9.0/lib
$echo $INCLUDE
/opt/intel/mkl/8.0/include
566 :
デフォルトの名無しさん :2006/01/10(火) 22:17:18
>>565 F95用のインターフェース定義Moduleがみつかんねーと言っているので、
F77のサンプルを試してみれば、ライブラリの設定に問題があるのかどうか分かるのでは?
と無責任に言ってみるw
貧乏人はマニュアルとにらめっこしてろ
金持ちのオレもマニュアルとにらめっこするぞw
古くからある他人の作ったプログラムを改良する作業をしているのですが common使いまくりでmoduleに変更しようとしています。 使い方そのものはわかりますが、 commonのメモリの使い方とmoduleにした場合でどう違うか?など 内部的な話を知りたいのです。 それらを知ることができるようなサイトご存じであれば教えてください。
571 :
デフォルトの名無しさん :2006/01/11(水) 22:37:59
>>570 COMMONはメモリー領域の共有割付なので、EQUIAVENCEをかけているのと
同じようになっている。
たちのいいプログラムなら、COMMON文が共通の名前になっていてModule化は楽だが、
変数名がサブルーチン毎に違っていると、それ相応の手当てが必要になる。
また昔のプログラムは、メモリー領域の節約の為にCOMMONを違ったサイズに切って
再利用したりしているので、機械的な修正ができないこともある。
COMMONの割り当て法に関してマニュアルで調べれば必要なことは分かると思う。
>>572 ● .● ● ●● ●● . ..●
● ● ● ● ● ● ● ●
● ● ● ● ● ● ● ●
● ●●●●●●●● ●
● ● ● ●
● ● ● ●
● ● ● ●
● ● ● ● ● ●
● ● ● ● ● .●
● ● ● ● ● ..● ●
● .● ● ● ●● ● ●
● ●●●●●●●● ● ● ● ● ●
● ..● ● ● ● ● ● ●
● .● ● ● ● . ●
>>573 ● .● ● ●● ●● . ..●
● ● ● ● ● ● ● ●
● ● ● ● ● ● ● ●
● ●●●●●●●● ●
● ● ● ●
● ● ● ●
● ● ● ●
● ● ● ● ● ●
● ● ● ● ● .●
● ● ● ● ● ..● ●
● .● ● ● ●● ● ●
● ●●●●●●●● ● ● ● ● ●
● ..● ● ● ● ● ● ●
● .● ● ● ● . ●
>>574 ● .● ● ●● ●● . ..●
● ● ● ● ● ● ● ●
● ● ● ● ● ● ● ●
● ●●●●●●●●●● ●
● ● ● ●
● ● ● ●
● ● ● ●
● ● ● ● ● ●
● ● ● ● ● .●
● ● ● ● ● ..● ●
● .● ● ● ●● ● ●
● ●●●●●●●●● ● ● ● ● ●
● ..● ● ● ● ● ● ●
● .● ● ● ● . ●
>>575 ● .● ● ●● ●● ●
● ● ● ● ● ● ● ●
● ● ● ● ● ● ● ●
● ●●●●●●●●●● ●
● ● ● ●
● ● ● ●
● ● ● ●
● ● ● ● ● ●
● ● ● ● ● ●
● ● ● ● ● .● ●
● .● ● ● ●● ● ●
● ●●●●●●●●● ● ● ● ● ●
● .● ● ● ● ● ● ●
● .● ● ● ● ●
>>576 ● .● ● ●● ●● ●
● ● ● ● ● ● ● ●
● ● ● ● ● ● ● ●
● ●●●●●●●●●● ●
● ● ● ●
● ● ● ●
● ● ● ●
● ● ● ● ● ●
● ● ● ● ● ●
● ● ● ● ● .● ●
● .● ● ● ●● ● ●
● ●●●●●●●●● ● ● ● ● ●
● .● ● ● ● ● ● ●
● .● ● ● ● ●
577 :
デフォルトの名無しさん :2006/01/12(木) 18:03:09
プログラミングに関して全くの初心者なのですが、 大学でfortranを使った計算をすることになりました。 Compac Visual Fortran Pro.Edit V6.6 で計算していたプログラミングファイルを、そのまま absoft Pro Fortran 8 で計算することは可能なのでしょうか?
578 :
デフォルトの名無しさん :2006/01/12(木) 18:31:00
>>577 基本的には可能。
だが実際にはなんともいえない。
元のプログラムがどれぐらいベンダー依存性を持つかによる。
579 :
577 :2006/01/12(木) 19:03:07
ベンダー依存性・・・ですか。 すみません、初めて聞く言葉でよくわからないのです。 コンパイルするまでの手順も違うので、戸惑っています。 とりあえず、マニュアルに従ってコンパイルしたら、 local variable mx never referenced. local variable my never referenced. というエラーメッセージが出ました。
>>579 それは宣言された変数がプログラムの中で
使われていないことに対する「警告」では?
581 :
デフォルトの名無しさん :2006/01/12(木) 22:10:48
>>579 ベンダー依存とは、コンパイラー製造メーカーごとの独自仕様のこと。
元のプログラムを書いた人が、標準の範囲内で書いていれば基本的には問題なし。
しかし、最近は浮動小数点もIEEE形式に統一されたからいいが、
ちょっと前まではハードごとメーカーごとに仮数部と指数部のBit数が違うので
収束やオーバーフローの範囲が異なり色々面倒が起きた。
MacとWinだとEndianの違いがある。バイナリーのファイルをやり取りしようとすると
問題になる。でもまあコンパイラーのオプションで対応できるだろう。
582 :
デフォルトの名無しさん :2006/01/13(金) 00:14:17
秒単位で表された時間tを読み込み、何日何時間何分何秒になるかを表示するプログラムって どうやってやればいいですか?本当初心者です。。。
>>582 考え方が解らないのか、コーディングが解らないのか?
ともかく単なるわり算の問題だぞ。
584 :
デフォルトの名無しさん :2006/01/13(金) 00:32:21
>>582 1日=24時間
1時間=60分
1分=60秒
です。
>>582 時間や日付を取得する関数はプラットフォームに依存するからなあ…。
コンパイラ何使ってるかくらい書かないと
586 :
582 :2006/01/13(金) 00:41:32
本当初心者なんでコーディング?プラットフォーム?って感じです・・・ 学校の課題で出てるんですが・・・s=int(x/y)とr=amod(x,y)を組み合わせて 考えろって書いてあるんですがどうやってもうまくいかなくて。
書いたところまで貼ってみな
>>582 あー、なんか分かってきた。秒の単位の変数tを日にちと時間に分解するやつだろ?
紀元0年からの秒数かな?うるう年とか絡んでるだろな。
amod()使うのはうるう年の検出のためかな?
589 :
デフォルトの名無しさん :2006/01/13(金) 01:32:22
>>588 ちがうだろw
分と秒 時間と分 日と時間にわけるためだろ
Fairfield公式 でググると幸せになれるかもしれない。
591 :
デフォルトの名無しさん :2006/01/13(金) 02:13:49
>>588 ,590
ユリウス日とかそんな高級な問題ではないと思います。
単に切り捨ての割り算(整数の割り算)と余りの問題だと思います。
592 :
デフォルトの名無しさん :2006/01/13(金) 03:44:25
PROGRAM test IMPLICIT NONE INTEGER :: ntime, isec, imin, ihour, iday READ(*, *) ntime isec = MOD(ntime, 60) ntime = INT(ntime / 60) imin = MOD(ntime, 60) ........ STOP END PROGRAM test 残りは繰り返しだから自分で完成させろw 秒が整数で与えられると仮定したので、amodでなくてmodにした。 その辺は自分でハッテンさせてくれ。 ま、宿題は自分でやれよw
>>583 〜
>>592 みんな凄く親切だな・・・。
卒論生を指導したことがあるが,
「次の作業を指示してください。」という依頼に対して,
「自分で試行錯誤してみるのも,研究だよ。
いろいろ試してみて,わからなければ聞いてね」
と門前払いしたことがある。
作業内容が明確にわかる指示に対してしか反応できない学生が
多すぎるのかな・・・。
>>582 教科書や補助プリントが全くないとは思えないから,
参考になりそうなプログラムを調べてみるということは,
思いつかないか?
「教科書例題13(入出力)と例題25(関数)を組み合わせれば,
できそうだが,組合せ方がよくわからない。」
とか,
「こんなエラーがでて,バグが発見できない。」
という質問なら,可愛げもあるのだが。
594 :
577 :2006/01/13(金) 12:15:17
>>580 ,581
ありがとうございます。やはり素人には難しいです・・。
重ねて質問してもいいでしょうか。
mx と my が使われていないということは、
それらをプログラムファイル上で書き換えないといけないということでしょうか。
mx と my はなぜ使われないのでしょう。
プログラムファイルは先生が書いたものなのですが、
ここに来る以前にエラー文を見せた際『分からない』と言われました。
先生がfortranを学んだのは20年近く前になると思います、
『標準の範囲内』を超えている可能性もあるのでしょうか。
Winを使っています。
自然数 N が与えられたとき、 1 から N までの数字を N 個並べる組み合わせをすべて 列挙するプログラムは FORTRAN で書くとどうなりますか? 例えば N = 3 のとき 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 となるようにです。 よろしくおながいします。
>>595 の質問は Pascal スレでもみたんだけど、最近流行ってるの?
>>594 > mx と my はなぜ使われないのでしょう?
変数名のタイプミスの可能性もある。
または,(動作確認用などで)とりあえず変数宣言したが,
動くようになってからは,コメントアウトしてしまった。
も考えられる。
「警告」は,エラーではなく,「動くけど,間違いてないか?」
という,(時にはお節介だが)ありがたい注意だ。
impicit none
をプログラムの最初に書くと,吉かもしれない。
# 未宣言エラーが大量にでるかもしれないけど。
>>597 正 implicit none
誤 impicit none
俺がタイプミスをしている。
599 :
577 :2006/01/13(金) 15:01:36
>>597 Compac Visual Fortran v6.6では計算ができるファイルなのですが、
タイプミス等と考えられるのでしょうか。
エラーではないのですね。
本当に基本的なことばかりですみません。
implicit none
書いて試してみます!未宣言エラーって予想もできないので怖いですけど。
600 :
デフォルトの名無しさん :2006/01/13(金) 16:55:03
>>599 20年前に書いたとするとFORTRAN77だから、暗黙の型宣言を使っているはず。
IMPLICIT NONEはかえって大混乱を及ぼしかねないw
昔のプログラムの書き方では変数を使わないことは結構あるので気にするな。
たぶんmx,myはサブルーチンの仮引数だろう。
601 :
577 :2006/01/13(金) 17:27:31
>>600 大正解です。
implicit none を書いたら、
シンタックスエラーチェックをした際にエラーが100個出てきました。
軽くパニックです。
なので、mxとmyを何とかしようと、意味も重要性も分からないまま
思い切ってmx→xm,my→ymに全部書き換えてみたところ
同じ箇所で警告がでました。
real mx(mm,2),my(mm,2),ox(mo,2),oy(mo,2),oz(mo,2),refc(4)
^
このmxとmyが駄目みたいです。
でも、気にしないで良い程度のことだと分かり
それだけでとても安心しました。ありがとうございます。
602 :
デフォルトの名無しさん :2006/01/13(金) 17:29:30
>>595 余りエレガントでないw
判定条件を簡素化出来ればいいのだが、2乗和を比較するとか。
でも一意だと証明できないw
PROGRAM vip
IMPLICIT NONE
INTEGER, PARAMETER :: n = 3
INTEGER :: i, k(n)
LOGICAL :: qpr
k = 1
DO
IF ( ALL(k == n) ) EXIT
DO i = 1, n
IF ( k(i) > n ) THEN
k(i) = 1
k(i + 1) = k(i + 1) + 1
END IF
END DO
!
qpr = .TRUE.
DO i = 1, n
IF ( ANY(k(i) == k(i + 1:)) ) qpr = .FALSE.
END DO
IF (qpr) PRINT *, k(n:1:-1)
k(1) = k(1) + 1
END DO
STOP
END PROGRAM vip
すいませんフォートランとは直接関係ないかもしれませんがアイディアをいただければ。。 三角形が無秩序に並んでる(各点の座標は分かってます)なかに任意の点(これも座標は分かってる) をおいたらその点はどの三角形に入っているかということなんですが何かアイディアはないでしょうか? 三角形の最小x最大x最小y最大y出してその範囲内にあるやつってやってたんですが途中でダメなことに 気づきまして、ちょっとしたヒントないでしょうか。
605 :
デフォルトの名無しさん :2006/01/14(土) 16:43:40
>>603 各頂点から、極座標表示で残りの2頂点と判定すべき点をあらわして、
判定すべき点の位相角がすべての頂点から見て、2頂点の角の間に
入ってればいいんでね?
>>603 検証してないので間違ってたらすまんが
既知の三角形ABCと点Pがあるとして
∠ABC<∠APC
∠ACB<∠APB
∠BAC<∠BPC
が全部成り立てばいいのでは?
607 :
603 :2006/01/14(土) 17:35:05
>>604-606 さん
ありがとうございます。すぐに3つも候補をいただけるとは感謝です。
全然思いつきませんでした。
みなさんの考えを参考にさせて頂きましたが結構簡単で計算負荷も軽そうな
>>605 さんのやり方で作ってみることにします。できなかったら604さんや606さんのもやってみます。
微妙にスレ違いでしたがみなさんご親切にありがとうございました。
608 :
デフォルトの名無しさん :2006/01/15(日) 21:41:04
すみません。
エロ動画をダウンロードするための連番リストを作成しようとしています
do i=1,10
write(6,*) "
http://www4.xtokyo.com/jpmo/j171/jpmo_1 ",i,".mpg"
end do
これでループを回すとリダイレクトで連番ファイルが作成されるのですが、
jpmo_ 1 .mpg
のように、切れ目で空白がひと文字分はいってしまいます。
jpmo_1.mpg
のように連続的に文字列をつなげるにはどうすればよいのでしょうか?
よろしくお願いします。
609 :
デフォルトの名無しさん :2006/01/15(日) 21:51:07
>>608 PROGRAM ero_list
IMPLICIT NONE
CHARACTER (LEN=50) :: fmt
INTEGER :: i
DO i = 1, 10
WRITE(fmt, '(a, i1, a)') '(a, i', INT( LOG10(REAL(i)) ) + 1, ', a)'
WRITE(6, fmt) "
http://www4.xtokyo.com/jpmo/j171/jpmo_ ",i,".mpg"
END DO
STOP
END PROGRAM ero_list
出力結果
http://www4.xtokyo.com/jpmo/j171/jpmo_1.mpg http://www4.xtokyo.com/jpmo/j171/jpmo_2.mpg http://www4.xtokyo.com/jpmo/j171/jpmo_3.mpg http://www4.xtokyo.com/jpmo/j171/jpmo_4.mpg http://www4.xtokyo.com/jpmo/j171/jpmo_5.mpg http://www4.xtokyo.com/jpmo/j171/jpmo_6.mpg http://www4.xtokyo.com/jpmo/j171/jpmo_7.mpg http://www4.xtokyo.com/jpmo/j171/jpmo_8.mpg http://www4.xtokyo.com/jpmo/j171/jpmo_9.mpg http://www4.xtokyo.com/jpmo/j171/jpmo_10.mpg
610 :
609 :2006/01/15(日) 22:02:08
解説 スペースが入ってしまうのは、フォーマットを指定せずに自由形式を使っているから。 フォーマットは、隙間が開かないように文字列、数字の長さ、文字列を指定すればいい。 文字列は長さを指定しなければ自動的に与えた文字列長になる。すなわち a 。 問題は数字で、今回の場合1桁の場合と2桁の場合が混じっているのであらかじめ 決まらない。したがって動的にFormat文を生成しなければならない。 (IF 文で場合分けしてもいいが) 生成したいFormatは、数字が1桁のとき '(a, i1, a)' 2桁の時 '(a, i2, a)' 動的にFormatを作りたい場合は普通、内部ファイルという物を使って作り上げる。 それが最初のWRITE文。10の対数をとって1を足しているのは変数iの桁数を求めている。 fmtという文字列の中に、'(a, i1, a)' ないし '(a, i2, a)' を書き出している。 Format文はWRITE文の中に文字列として直接書いてもいいし、文字変数でもいい。 FORTRANの教科書などでは行番号を用いる形式を良く使うが、情報を局所に展開 させるほうが好ましいいので避けるべし。
611 :
デフォルトの名無しさん :2006/01/15(日) 22:02:44
>>609 あ、すごい。早速ためしてみます。
ありがとうございましたm(_ _)m
612 :
デフォルトの名無しさん :2006/01/15(日) 22:13:51
WRITE(fmt, '(a, i1, a)') '(a, i', INT( LOG10(REAL(i)) ) + 1, ', a)'
なんてものがあるんですね…
今まで出力形式に付いてはあまり拘らずに、データをログファイルに記述できれば
それでことたりてたので、こういうのは初めて見ました…
出力形式についても
>>610 の解説を参考に勉強してみようと思います。
613 :
デフォルトの名無しさん :2006/01/15(日) 22:22:34
内部ファイルについてはレスの
>>89-106 あたりでも触れられている。
FORTRAN66時代は、ENCODE、DECODEというのを使っていたので、
FORTRAN77以降の機能だと思う。
614 :
デフォルトの名無しさん :2006/01/16(月) 00:04:06
いろいろいじくって遊んでみました。 WRITE(fmt, '(f7.5)') REAL( LOG10(REAL(i_count)) ) + 1 WRITE(6,*) fmt こんな感じで実数形式でまわして書き出してみると 1.00000 1.30103 1.47712 1.60206 1.69897 1.77815 1.84510 1.90309 1.95424 2.00000 ってなりました。 対数と頭のINTをつけて形式を変換することによる 小数点以下切り捨てによってi1とかi2とか区別していたんですね。 勉強になりました。
615 :
デフォルトの名無しさん :2006/01/16(月) 00:36:37
あと、ifのベンチもとってみました。
Iを1000000でまわして
if (i < 10) then
WRITE(fmt, '(a, i1, a)') '(a, i', INT( LOG10(REAL(i)) ) + 1, ', a)'
WRITE(6, fmt) "
http://www4.xtokyo.com/jpmo/j171/jpmo_00 ",i,".mpg"
else
WRITE(fmt, '(a, i1, a)') '(a, i', INT( LOG10(REAL(i)) ) + 1, ', a)'
WRITE(6, fmt) "
http://www4.xtokyo.com/jpmo/j171/jpmo_ ",i,".mpg"
end if
のときと
WRITE(fmt, '(a, i1, a)') '(a, i', INT( LOG10(REAL(i)) ) + 1, ', a)'
if (i < 10) then
WRITE(6, fmt) "
http://www4.xtokyo.com/jpmo/j171/jpmo_00 ",i,".mpg"
else
WRITE(6, fmt) "
http://www4.xtokyo.com/jpmo/j171/jpmo_ ",i,".mpg"
end if
で比較すると
前者4.169u 0.225s 0:04.52 96.9% 0+0k 0+0io 0pf+0w
後者6.366u 0.239s 0:07.01 94.0% 0+0k 0+0io 0pf+0w
となりました。ifの前で読み込むよりも、それぞれのif文のなかで読み込ませる方が速いようです。
616 :
デフォルトの名無しさん :2006/01/16(月) 02:35:12
617 :
デフォルトの名無しさん :2006/01/16(月) 11:51:16
iを001〜075とかでまわしても、頭の0が無視されてたのでifでやるべきなのかなと思ったのですが ifなくてもできるんですね… 上と同じような条件のベンチは 3.176u 0.333s 0:03.62 96.6% 0+0k 0+0io 0pf+0w if文はできるだけ使わない方が良いみたいですね。 エロ動画も落とせてfortran力もついて一石二鳥。 すごいおいしいです。
618 :
デフォルトの名無しさん :2006/01/16(月) 21:51:47
>>593 大学教育としては問題があるが、より広い意味での問題解決力としては、
頭を下げて人に教えてもらって解決するというのも一つの重要なテクニック。
分からないなりに理解しようと努力しているのであれば 手助けしてやろうという気も起こるだろう。 何も考えずに丸投げするような奴は論外。
620 :
デフォルトの名無しさん :2006/01/17(火) 01:01:46
erolist インリン 受けたw 今日はおもろいねた無いのか?
621 :
デフォルトの名無しさん :2006/01/17(火) 05:47:53
この流れで抽象的な質問をするのはもうしわけないのですが、 Salford FTN95で、よそからもってきた固定形式(.for)のプログラムを コンパイルしたところ、 Attempt to call a routine with argument number twenty containing too few array elements というエラーが出て困っています。 このエラーが出る場合、どういう問題が起きているのでしょうか。 問題となっているサブルーチンは、引数を23個もっているので、 その内の20個が問題あり?どういったことを試せばよいかも わからず途方にくれています。どうかアドバイスをお願いします。
622 :
デフォルトの名無しさん :2006/01/17(火) 07:05:35
×コンパイルしたところ、 ○コンパイルして実行したところ、 でした。
623 :
デフォルトの名無しさん :2006/01/17(火) 10:51:01
>>621 20番目の引数の配列の大きさが小さすぎると言っている。
ソースが古いプログラムなら、意図的にやっている可能性もある。
FORTRANは参照渡しだから、配列を引数としても先頭要素のアドレスを
渡しているだけなので、昔風のプログラミングではサブルーチン側の配列の引数を
A(10)とかと適当な数で宣言して、ルーチン内でははみ出して使っていた。
624 :
デフォルトの名無しさん :2006/01/17(火) 10:56:30
>>621 20番目の引数の配列の大きさが小さすぎると言っている。
今の情報ではこのくらいしかいえない。
ちなみにソースが古いプログラムなら、意図的にやっている可能性もある。
FORTRANは参照渡しだから、配列を引数としても先頭要素のアドレスを
渡しているだけなので、昔風のプログラミングではサブルーチン側の配列の引数を
A(10)とかと適当な数で宣言して、ルーチン内でははみ出して使っていた。
もっと詳しく知りたければ、CALLしている文と、CALLされているサブルーチンの
頭から引数の宣言文までを見せてくれないとなんともいえない。
625 :
621 :2006/01/17(火) 12:08:40
>>624 さま
レス本当にありがとうございます。試しに20番目の配列の大きさを小さめに
して実行してみたら、その部分はエラー無く動きました。
しかし、同じルーチンの他のいくつかの引数についても同様のエラーが
出たので、次々に配列を小さくしていったのですが、今度はそれらの
引数をwriteするところで、format/data mismatchが出てしまいました。
これらの次数とformatの指定を丹念に調節する以外になにか方法は
ありますでしょうか。古いルーチンに合うコンパイラが必要?
以下は、call文とサブルーチンの頭です。サブルーチンは、
インプットファイルからデータを読む働きをするものです。
CALL READT(TVA,RAR1,RAR2,ASA,INVECT,TVB,IDEG,NL,V,VL,JJS,TST,
& TSTS,THETA,FI,LMMAX,NPSI,ES,PHSS,PHSS2,L1,IPR,NEL)
SUBROUTINE READT(TVA,RAR1,RAR2,ASA,INVECT,TVB,IDEG,NL,V,VL,JJS,
& TST,TSTS,THETA,FI,LMMAX,NPSI,ES,PHSS,PHSS2,L1,IPR,NEL)
COMPLEX VL(NL,2)
DIMENSION ARA1(2),ARA2(2),RAR1(2),RAR2(2),ASA(10,3),ARB1(2)
DIMENSION ARB2(2),RBR1(2),RBR2(2)
DIMENSION CPARB1(2),CPARB2(2),PHSS2(NPSI,80)
DIMENSION V(NL,2),JJS(NL,IDEG),ES(NPSI),PHSS(NPSI,80)
DIMENSION IT1(5),THDB(5),AM1(5),FPER1(5),FPAR1(5),DR01(5)
DIMENSION DRPER1(5),DRPAR1(5)
626 :
デフォルトの名無しさん :2006/01/17(火) 13:24:25
>>625 FTN95コンパイラの仕様と、ソースプログラムの信用度にもよるのだが、
動くんだったら下手にソースをいじらず動かしたほうがいい。
元のソースが正しいと仮定しての話だが・・・・
単にFTN95のチェックが厳しすぎるだけで、オプションで実行時チェックを切れば動くはず。
配列の最後の要素の大きさはFORTRANでは気にしないのが伝統だった。
理由は参照呼出しと多次元配列のメモリー上での取り方の性質による。
詳しい説明はメンドイので誰かに聞いてくれw
627 :
625 :2006/01/17(火) 13:47:25
オプションで実行時のチェックが切れるのですか。 恥ずかしながらそんなことも知りませんでした。 今日は用事があるので明日また調べてやってみます。 本当に有り難う御座いました。
628 :
デフォルトの名無しさん :2006/01/17(火) 21:05:06
>>627 どういう環境で実行しているのか知らないが、統合環境を使っていていると
デフォールトではDebugモードでBuildされるとおもう。その場合はチェックが
効いているだろう。
コマンドラインでコンパイルしているなら、自分でオプションをつけない限りは
チェックは入らない。したがって、この場合はコンパイラがきつい仕様になっていると
いうことで諦めて、他のコンパイラで試してみるべし。f77なら昔のWATCOMとか
g77とか色々ただの奴がある。FTN77も個人使用はFreeになっているようだ。
・記憶領域上の多次元配列に関して。〜特に2次元の場合〜
FORTRANでの多次元配列は記憶領域上では連続して1次元に展開されている。
このとき、第1列、第2列、・・・、第N列、・・・、最終列というように列ごとに展開される。
つまり配列A(10,80)の場合、A(1,1)の次はA(2,1)であり、A(10,1)の両隣は
A(9,1)−A(10,1)−A(1,2)とA(9,1)とA(1,2)である。
サブルーチンに配列を含む変数を渡すとき、FORTRANは参照渡し(アドレス渡し)
なので、実際は先頭要素のA(1,1)の記憶領域上のアドレスを渡しているだけである。
それがどこまで続いているかは、実行時にはFORTRANは気にしていない。したがって、
はみ出しさえしなければ、プログラマーの責任でサブルーチン側の宣言サイズに必ずしも
囚われる必要は無い。(が、普通はそれなりに敬意を払う。)
FORTRANの数値計算ライブラリなどを見れば分かるが、行列の列の大きさは
引数として要求されるが、行の大きさは要求されないのはこの事情による。
629 :
名無しさん :2006/01/17(火) 23:56:06
vine linux 3.2 でgcc-3.3.2 を使ってます. fortranプログラムのコンパイル時に -r8 のオプションを使いたいのですが, そんなオプションはないと怒られます. 何かかわりのオプションはあるでしょうか?
630 :
デフォルトの名無しさん :2006/01/18(水) 00:26:34
>>629 マニュアル嫁
GNUとかじゃなく、まともなコンパイラ使え
631 :
名無しさん :2006/01/18(水) 00:39:04
Intel fortranのLinux版タダじゃん。
633 :
名無しさん :2006/01/18(水) 01:20:03
>632 サンクス ちょっとためしたみました エラー: 依存性の欠如: libsvml.so は matfor_f-3.2-0 に必要とされています libscml.soなるものが必要だそうだ. 探してみます.
>>629 g77にはなさげ。
Increasing Precision/Range
Some compilers, such as f2c, have an option (-r8 or similar) that provides
automatic treatment of REAL entities such that they have twice the storage
size, (中略)
g77 does not yet offer any option that performs these kinds of transformations.
Part of the problem is the lack of detailed specifications regarding exactly how
these options affect the interpretation of constants, intrinsics, and so on.
ttp://programming.ccp14.ac.uk/g77-fortran/~michael/os2/g77/g77.htm#hd_670 f2c+gccという昔風にやるか、IMPLICIT REAL*8 (A-H, O-Z)を各サブルーチンごとに
いれるか・・・でも定数がrealのままなだと解決にならんかも。
■
g95はいつまでたっても完成しねな。もうFORTRAN2003の規格も決まったんだが。
GNUのfortranもどっかの商用メーカーが倒産してそのフロントエンドでも
貰わないとまともに動かないんでね?
Mac,OpenSource系は信者様の調子のいい話が多くて判断つかねぇ。
連中はすぐ頭に血が上るからうっかりした冗談もいえねえしキモス。
>634 親切にどうも f2c+gccでなんとかなりそうです。
636 :
けい :2006/01/19(木) 21:36:14
FORTRAN素人で困っています。 intel visual fortran を初めて使ってみているのですが、 libm.lib を利用しようとして座礁しています。 use libm とすると、ファイルが見つからない!と怒られます。 多分、libm.modを探しに行っているのかなと思うのですが・・・。 もちろん libm.modはありません。 さて、どうしたらいいのでしょう? 助けてください。
637 :
デフォルトの名無しさん :2006/01/19(木) 22:06:55
>>636 いまいち状況が分からんが、多分勘違いをしていると思う。
本来の付属ライブラリならその行は要らないはず。
もしくは・・・
USE で用いる .MODファイルというのは、C言語でいう .H ファイルのようなもので
サブルーチン等のインターフェース情報が入っている。
それはソースから自動生成されるのもなので、ソース(インターフェースのソース)があって
自分でコンパイルするか、はじめから提供されているかしなければどうしようもない。
それでも、やる必要があるなら USEのかわりに 各個のサブルーチンを external 文で
並べておけば、コンパイル時のインターフェースのチェックは無しで、LINKERがLINKしてくれる。
まぁ77時代のようなもの。
638 :
けい :2006/01/20(金) 00:30:08
>637 早速のアドバイス、ありがとうございます。 明日、再トライしてみて、結果をご報告します。
639 :
603 :2006/01/20(金) 02:02:37
以前質問した603です。 いろいろやってみたんですが604さんの三角形内部判定というやつでできました。 正直こういう数学屋っぽい証明がいるような物は実用性ないだろうと思ってたんですがやってみて あまりのシンプルさにびっくりしました。教えていただいてありがとうございました。
640 :
デフォルトの名無しさん :2006/01/20(金) 02:31:48
90が77用のコードを実行できたように、95も90や77で作ったコードを実行できますか?
641 :
デフォルトの名無しさん :2006/01/20(金) 03:03:08
>>640 95は90を含んでいるので出来る。
わずかだが77の一部の機能は廃止になっている。
なので規格に完全に忠実だと動かない物も出るはず。
しかしながら大抵のコンパイラーメーカーは過去との互換性の為に規格から削除された機能を
サポートし続けているのでまず大丈夫だろうw ウォーニングぐらいは出るかもしれんが。
>>642 この本には,「Other Features 使わない方がよい機能」という,
お節介な(でも有益だと思う)章がある。
「bit 別冊 詳解 Fortran 90」の改訂復刊を希望する。
644 :
デフォルトの名無しさん :2006/01/20(金) 23:49:24
Solaris(UNIX)でFortran(コンパイラ f77:SC3.0.1)プログラムを作成しています。 このFortranからC言語(コンパイラ cc:SC3.0.1)の関数を呼び出しています。 これらをWindows XPに移植しようと思っているのですが,UNIX/PCの Fortranの互換性や違いを教えていただけないでしょうか。 また,移植が簡単に行えるFortran/C言語のコンパイラの組み合わせ があれば教えていただけないでしょうか。移行ツールでも良い。 例えば,インテル Visual Fortran + Microsoft VC++ .NET とか。 以上,よろしくお願いします。
全然問題なし。マニュアルに書いてあるし。
646 :
デフォルトの名無しさん :2006/01/21(土) 00:05:38
>>644 Lahey-FujitsuやABSOFTのFORTRANはprofessional versionを買えば
Cコンパイラが付いてくる。
Compaq(DEC)のVisualFortranは、MS VisualC++V6とVisualStudio環境で統合される。
日本語版と英語版が入り混じったりするが・・・・
IntelVisualFortranは、IntelC++とVisualStudio2003/.NETで連携するが、
MSのC++との関係はワカンネw
g77はgccと組めたはず。
現段階ではこの手の機能はベンダー依存だが、FORTRAN2003ではCとの相互呼び出し
機能が規格として規定されているので気長に待つという手もあるw
FortranにはCで言うところの終端文字というのが無いから、文字列渡すときだけめんどくさいな
648 :
デフォルトの名無しさん :2006/01/21(土) 01:49:04
FORTRAN2003のオブジェクト指向用の拡張がうんこ過ぎる。 あれを考えた奴は出てきて、どういう使用状況を考えて用意したのか説明しなさい。
ISOの偉い人達が集まって 「どーせFortranでOOPなんてロクに使われないんだから、適当でいーんじゃねーの?(鼻ホジホジ」 って決めますた。
650 :
デフォルトの名無しさん :2006/01/21(土) 08:01:17
いろいろありがとうございます。 647さんの情報のようにUNIX/PCのFortranの互換性や違いが書いてある サイトはあるのでしょうか。
651 :
デフォルトの名無しさん :2006/01/21(土) 11:25:19
>>650 FORTRAN Explained 2003にFORTRANとCでの違いのまとめがある。
データ型の互換性や文字列の終端記号、構造体、call by value, call by reference
などの問題。
それ以外はコンパイラーのベンダー毎に独自の解決をしているので、個別の問題点を
まとめていることはあっても、一般的なまとめは無いのではないかな。マニュアルの相応の
ページを読むしかないと思う。
大文字・小文字を区別するCとしないFORTRANでは、LINK時のサブルーチンの内部
表現名をどうするかなど、細かい落とし穴がいっぱいある。
>>639 役に立てたようで,とてもうれしい。
ただ,誤差対策をちゃんとしているかな?
行列式の0割防止,隣接三角形との所属判定など,
面倒な例外処理が必要だと思うのだが。
>>652 ご指摘ありがとうございます。
調べた感じ正直そこが一番大事そうでしたがとばしてしまいました。。
ただ僕がやろうとしていることの性質では一応線分上にはほぼ来ないはずと踏んでいたし、
使う目的がその点の三角形の各点の変数からその点の参照値を出すということだったので、
近いところが分かればある程度いいやと考えていたので
大丈夫かなと思っていました。
実際に全部でやるべき1125点をやるべき三角形全部に判定させてループさせましたが
線上判定かぶりの点はなくどこかの三角形1つに入ってくれました(ちゃんと入るべきところに入ってるかはやってませんので
意味ないかも。。)
線上でかぶってたら
ただ言われてみれば判定する点が三角形の各点に近いのでそのあたりがとても不安です。
(ちょっと勉強不足なのですがやっぱり点に近いと誤差どうこうでおかしくなるのでしょうか?)
なんか書いてるうちに不安になってきました。。(笑)教えてくださった参考書をちょっと明日でも借りてきます。
>>653 簡潔に説明できないが,
EPSL(微少量),s,t(ベクトルの係数)として,
すべての点が
EPSL < s < 1-EPSL
EPSL < t < 1-EPSL
EPSL < s+t < 1-EPSL
に入っているということかな?
だったら,問題ない。
嫌らしいのは,-EPSL < t < EPSL などの境界上にあり,
隣接三角形との取り合いがある場合。
みかんのへたのような,複数三角形が密集する頂点近傍に,
判定すべき点があると,とても神経質になりそう。
領域判定の理論は、ゲーム関係のサイトに載ってるよ。
657 :
デフォルトの名無しさん :2006/01/23(月) 23:26:05
LU分解のプログラムを誰か… ピボッティングはなしで,LとUに分解するだけでいいんで…
>>657 LAPACKやMKLに入ってるやつ使えば?
>>657 精度比較用に「無しでなければならない」ということか?
ピボッティングありのプログラムは,
宮崎大などですぐに見つかるから,
ピボットの意味を考えて,がんばれ。
余談だが,f77 の3重do文をf90 化すると,
配列操作の練習になるかもしれない。
660 :
デフォルトの名無しさん :2006/01/23(月) 23:44:43
open(10,File='test.txt') write(10,*) 'Hello,world!' close(10) stop end これでカレントディレクトリにtest.txtが作成され,中にHello,world!が書き込まれるのは分かるのですが, プログラムからカレントディレクトリに新しくディレクトリを作成するにはどうすればよいでしょうか? 言語はFortran90です..
661 :
デフォルトの名無しさん :2006/01/24(火) 00:03:50
>>660 FORTRAN90/95ではそれは規格に無い。
ベンダー依存の機能なのでマニュアルの当該部分をみるべし。
FORTRAN2003ではPOSIX互換のルーチンを標準化するようになっていたと
思うので、共通のやり方ができるようになるだろう。
>>657 すまない。嘘をついた。
宮崎大は,ピボッティングなしだった。
「学外の方には有用ではない」という注釈を忘れていた。
663 :
デフォルトの名無しさん :2006/01/24(火) 00:15:45
暗黙の型宣言は使うなとか,common文は使うなとか, 変数名はこう命名しろとかいうような,より良いコードを書くために必須な知識が纏められている書籍 って無いですかね? C++で言えば,Effective C++に相当するような・・・
665 :
660 :2006/01/24(火) 00:31:20
>>661 レスありがとうございます.
マニュアルを参照してみます.
必死さから、一瞬卒研やってる学生かと思ったが、 さすがに今の時期にLU分解を組み込んでるようなら違うかな。
668 :
665 :2006/01/24(火) 07:01:35
>>667 今月から本腰入れるっていうところも多いから強ちはずれでもないかもよ
670 :
デフォルトの名無しさん :2006/01/24(火) 20:27:44
お聞きしたいのですが サブルーチン文を2回別の変数を持って呼び出すときに、1つ目の変数をAと したとき二つ目の変数を-Aにしたいのですがこのとき call ****(-A,B,.....) としていいのでしょうか? やっぱりコールする前にA=-Aとしないといけないのでしょうか
672 :
デフォルトの名無しさん :2006/01/24(火) 22:04:08
>>670 FORTRAN90の場合、INTENT(IN)属性をつけたものならマイナスをつけてもOK
INTENT(OUT)、INTENT(INOUT)の場合は駄目だとおもう。
それはFORTRANはアドレス渡しで変数を渡しているので、マイナスが付いたときの
変数の戻し方に任意性が生じるから。
FORTRAN77時代はどうだったか・・・・
あるいはINTENT属性をつけない場合は・・・・
まぁ昔のFORTRANでは何事も気にしないことが多いので、多分そのまま通るだろうw
そして結果はコンパイラーに依存するだろうw
673 :
デフォルトの名無しさん :2006/01/25(水) 22:36:56
すいません質問です Windows用 Intel Fortran EM64T対応のを使ってます。 諸事情でメモリ2G制限を越えるプログラムを作らなくてはならなくなったのですが、 これって静的領域に確保することは可能なのでしょうか? どうも2G以上の領域を確保しようとするとリンカでハネられてしまうのですが…
675 :
デフォルトの名無しさん :2006/01/26(木) 17:08:56
>>674 単一の配列で2G超えですか?複数で合計2G超えですか?
OSはWindows64ですか?32bitWindowsでターゲットがwin64用ですか?
でも、ここで聞くよりマニュアルを調べた方が早いと思う希ガスw
676 :
デフォルトの名無しさん :2006/01/26(木) 18:15:01
フォートランをマスターするとどんな幸せな事にめぐり会えますか?
>>672 ありがとうございました。つけて走らせてみたらできました。おかげでめんどくさいことせずにすみました。
678 :
デフォルトの名無しさん :2006/01/26(木) 21:29:16
>>676 FORTRANはいいぞ〜
最古の高級言語であって、コンピューター界のヒエログリフといってもよい。
地層のように積みあがった言語構造は、神聖文字、神官文字、民衆文字、コプト文字
を思わせて美しい。
' 「 ´ {ハi′ } l
| | | |
| ! | |
| │ 〈 !
| |/ノ二__‐──ァ ヽニニ二二二ヾ } ,'⌒ヽ
/⌒!| =彳o。ト ̄ヽ '´ !o_シ`ヾ | i/ ヽ ! や ら な い か ?
! ハ!| ー─ ' i ! `' '' " ||ヽ l |
| | /ヽ! | |ヽ i !
ヽ { | ! |ノ /
ヽ | _ ,、 ! , ′
\ ! '-゙ ‐ ゙ レ'
`! /
ヽ ゙  ̄  ̄ ` / |
|\ ー ─‐ , ′ !
| \ / |
ウホッ! いいスパゲティ! orz
>>676 彼女ができる・・・(と,いいな)。
よく言われるが,計算ライブラリーなど過去遺産が豊富。
また,1980年以前に隆盛があった学術分野(気象,機械,土木など)や,
電気回路など複素数変数が便利な分野では,
Fortran が未だに主流ではないかな?
話題はずれるが,>> 90 の演説も面白い。
>>675 えっと、結論から言うと動的に確保することで上手くいってしまいました。
で、実は気になるのは速度の問題なんです。
以前動的に確保することで速度が遅くなったんで動的に確保するのを躊躇ってたのですが
今回はそれほど遅くなってませんでした。
恐らく前回はポインタを使ったために
最適化が上手くいかなかったんだと思うのですけど
もしかしてpointer属性とallocatable属性って違うんですかね?
任意の生年月日と今日の日付を入力すれば、 産まれてから今日まで生きてきた日数を出力するプログラムを作れ。 さらに、任意の整数nを入力して、産まれてからn日目が、 いつかを出力させるプログラムを作れ。 ちなみに、閏年は以下のようにして決められる。 1)基本的に西暦が4で割り切れたら閏年。 2)しかし、西暦が100で割り切れたら閏年ではない。 3)しかし、西暦が400で割り切れたら閏年とする。 レポート作成 予備的考察、プログラム、プログラムの説明、計算結果、考察 フォートラン使用・・・
>>681 ALLOCATABLEの方が最適化が効きやすくていいと思う。
POINTERの場合、実際のメモリーが割り当てられているのか、TARGETを指しているのか
コンパイラが判断するのが難しいが、ALLOCATABLEは実際にメモリーが割り当てられて
いると仮定できるから最適化をかけやすい、と何かに書いてあったが思い出せないw
まぁ、話半分情報ということで・・・
684 :
デフォルトの名無しさん :2006/01/27(金) 00:04:45
>>682 まず正月からある日までの日数を数えるプログラムを組め。
うるう年は無視していいぞ。
これが出来たら、残りを教えてやるw
>>684 すみません
まったくわかりません・・・わかろうとしてないかも・・・
意味不明なんです・・・
UNIXが、フォートランが・・・
教えないほうが本人の為になりそう。自分で考えない馬鹿は学校行かなければいいのに
頼む! 金が無いんだよ・・・ 留年するための・・・
688 :
デフォルトの名無しさん :2006/01/27(金) 00:32:40
とりあえず大学へ・・・ の流れですorz ごめんなさい、卒業したいです;;
こんな問題も解けない奴に学士号を与えて世間に出されてはこちらが迷惑です。 お願いですからもう一年がんばって下さい。
板汚してすみませんでした。
>>690 マジレスすると、今すぐ大学やめて違う専門に入り直した方がいい
進路の修正は早い方がいいからな
>>690 大学では壁にぶつかった後、立ち止まって進みも退きもせずに
引きこもりになるより2chで答えを得るほうがよっぽどいい。
カンコー学生服は丸洗いOK! VIPPERなら丸写しOKwwww
Fortran Source Code Converter ってどうよ?
698 :
デフォルトの名無しさん :2006/01/30(月) 23:11:42
program Calculation of Response implicit none integer i,j,n1,n2,neq,hnda,nda,odd,st,p1,p2,p3 real*8 h parameter(n1=4096,n2=8,neq=2,h=4.d-3) real*8 x(n2),y(n2),yd(n2),a(n1,n2),b(n1,n2),k1(n2),k2(n2), &k3(n2),k4(n2),f(n2),m,c,k character*20 infile,outfile c write(6,*)'input >> input file name' read(5,*) infile write(6,*)'input >> output file name' read(5,*) outfile write(6,*)'input m,c,k' read(5,*) m,c,k open(1,file=infile,status='unknown') read(1,*) nda read(1,*) p1,p2,p3 do 10 i=1,nda read(1,*) (a(i,j),j=1,2) 10 continue close(1) で始まるプログラムをコンパイルしようとすると下のようなエラーが出てしまいます。 Undefined first referenced symbol in file rk4_ /var/tmp//ccMMIE6P.o ld: fatal: Symbol referencing errors. No output written to shuuron2.exe collect2: ld returned 1 exit status infileの名前はちゃんとcharacterで定義しているので何が悪いのか分かりません。 どなたか宜しくお願いいたします。
>>698 ローダーのエラーなので、ファイル名の問題ではないだろう。
>symbol in file
これが正しいならinfilefはない。エラーメッセージがこれ全部なのだろうか?
未定義変数でも使っているんだろう。
こまぎれでわかんねが rk4 か first の問題でね?
shuuron2 って・・・ 今頃プログラムつくってて大丈夫なのか?
>>700 なかなかチェックが厳しい。
中間報告(春の学会発表とか)でがんばっているM1 だろう。
>>698 F77形式の上に、暗黙の型宣言を守っていないので、bugは中々とれず
周囲の経験者やプログラム相談員からは相手にされず、苦労するだろう。
要約すれば・・・・・・
『地獄に落ちる!』
,,. -‐―- 、
/ _..-‐―- 、 .ヽ
/ /-‐―-..__..ヽ _..、ヽ
.!三三三´ `´ : i
|.!三三 __  ̄ _,. .;. i 暗黙の型宣言を守らない
|ii i!" ´ ェェ` l´rェ、 i..!
>>698 は地獄へ逝く
!i、 i!:::..... - ̄r ヽ .!
!ii!.|::::::: / `−´ヽ /
_,,.. ===="/%;;;::::. '∠ニニ」 /、 _ -‐‐-、
/´ | .% :::;;;;: ,,,.,,,:. ⌒: ./´  ̄==-- _,,.. -‐‐'"´ _,..-‐ ´
| % ::::::;;;;;;;;;:.""%./ r" (<二 ̄ ̄>
.| %。゚+。 。+% / `ヽiノ<二. ̄ ̄>
| %+*゚+。*゚%/ ( <二 ̄ ̄>
704 :
デフォルトの名無しさん :2006/01/31(火) 07:03:17
>>702 デジャブかな?どっかで同じような光景が…
>702 implicit none をつけたとしても、暗黙の型宣言は守ったほうがいいな。 FORTRANの場合、型の宣言がルーチンの頭部に限定されているので、 いちいちそこを参照するのが面倒くさい。つまりローカルに解決しない。 C言語みたいに捨て変数を{}の単位内でローカルに宣言できるなら、 まあいいかもしれないが・・・
706 :
デフォルトの名無しさん :2006/01/31(火) 19:00:21
本物のプログラマはフォートランを使うと聞いてとんできました。
リスパー>コボラー>Fortranコーダー
709 :
デフォルトの名無しさん :2006/01/31(火) 22:02:19
リスプとコボルが上にいるの? フォートランはブロンズセイントなの?
歴史と伝統ではFORTRANが一番に決まってる。 が、その使用者は向上心がないからな。 ももしきや 古き軒端にしのぶれど なほあまりある 昔なりけりw
711 :
621 :2006/02/02(木) 11:50:44
エスパー様。お助けください。 Salford FTN77のコンパイラでInvalid character in field というエラーが出ます。原因はなんでしょうか。 少し状況をいうと、READ文でINTEGERの数値をテキストから読むときに、 入力値を1〜7の数値にするとエラーになり、8以上だと普通に動きます。
>>711 ファイルからのデータ読み込みで、実行時エラーが起きている状況でおk?
たぶんデータの並びと、FORMAT文がずれている。
もしくは1〜7の数字が全角になっているかwww または空白が実はTabとか00hとかwww
そのread文のformatとエラーのでるファイルの行を見せてくれ。
713 :
711 :2006/02/02(木) 13:34:09
>ファイルからのデータ読み込みで、実行時エラーが起きている状況でおk? そのとおりです。問題となるREAD文は READ (4,112) NSYM,NSYMS,ASTEP,VSTEP で、この文のフォーマットは、 112 FORMAT (2I3,2F7.4) で、読みこみファイルは 1 5 0.02 0.20 NSYM NSYMS STEP VSTEP です。2番目のNSYMSを7以下の数値にすると 実行時にRUN−TIME ERRORとなります。 はじめ、ウインドウズのワードパッドで入力をつくっていたのですが、 空白がタブの可能性を疑ってメモ帳で保存しなおしたりもしましたが。 うまくいきませんでしたorz。
>>713 2chの特性で空白が飛ばされているせいかもしれないが、入力のフォ-マットおかしくね?
3桁整数 3桁整数 7桁実数 7桁実数になってないとヤヴァス
..1..5...0.02...0.02
( . はスペースのつもり)
のようにしないとマズス
715 :
714 :2006/02/02(木) 13:43:51
>>713 ごめwwカラムはだいじょぶそうかなwww
READ文の次に
PRINT *, NSYM,NSYMS,ASTEP,VSTEP
を入れて何が読み込まれているか見て味噌
716 :
711 :2006/02/02(木) 13:59:58
>READ文の次に >PRINT *, NSYM,NSYMS,ASTEP,VSTEP やってみましたところ、入力した通りの数値が そのとおりDOS窓に表示されました。 1 5 2.000000E-02 0.200000 等 しかし、数字が7より小さい場合に限り、そのあとやはり同じエラーがでます。 エラーのダイアログには、 00424588 READPL [+0799] 00401000 (プログラム名) [+1244] と表示されます。READPLは今問題になっているのとは別のサブルーチンです。
717 :
711 :2006/02/02(木) 14:09:41
NSYMSはたぶん、場合分けを指定する数字で、READPLもファイルを 読むルーチンなので、そこでINVALID CHARACTERがあるのかも と思いつきました。READ文を教わった方法で一つづつ調べてみようと思います。 おかげさまで解決のとっかかりができました。ありがとうございます。
718 :
714 :2006/02/02(木) 14:10:22
>>716 それはエラーの場所がそのREAD文では無いということだw
トレースバックの行番号799行をミロ!
719 :
711 :2006/02/02(木) 14:23:19
799行はCで始まるコメント行でした。1244行もです。orz. READPLは9000行くらいに本体があり、呼び出しは517行めでした。
全角で数字打ち込んでるんだろ
721 :
714 :2006/02/02(木) 14:25:01
>>717 00424588 READPL [+0799]
00401000 (プログラム名) [+1244]
(これが普通のトレースバック情報だとしたらの話だが)
これの意味は1244行にあるメインルーチンのCALL文で呼ばれた
サブルーチンREADPLの中の799行にある文でエラーが起きているということだ。
多分そこのREAD文のデータとフォーマットが合っていないのだろう。
722 :
714 :2006/02/02(木) 14:27:41
>>719 うは、ごめw 機械語のアドレスだったかw
ただ、コンパイラーのオプションでソース行を表示させることが出来るかもしれない。
たとえばCompaqのVisualFORTRANではオプションつけないと
トレースバック情報でソース行を吐き出さない。
723 :
711 :2006/02/02(木) 14:33:18
少し進展したので報告します。 問題のREADPLをcallしている前と後で PRINT*,'行番号' をしたら、前は出力されましたが後ろは出ませんでした。 やはりREADPLの中のようです。もう少し調べてみます。ありがとうございます。
724 :
711 :2006/02/02(木) 14:38:01
>>720 見なおしましたが数字はすべて半角のはずです。
しかし、ワードパッドで打ったので空白などが
へんなのかもと思っています。
725 :
711 :2006/02/02(木) 15:46:18
解決しました。 NSYMSによって、READPLの中でREADする行数が変化する部分が あったため、FORMATが一致したりしなかったりするのが原因でした。 ありがとうございました。m(_ _)m
>>725 乙!
中々バグが取れないときは、発生箇所や原因を勘違いして決め付けているときだからなw
犬や猫と心が通じるように、エラーメッセージの読み方を学ぶとFORTRANとも心が通じる。
相手(コンパイラー)を理解する気持ちが大切だw
727 :
711 :2006/02/03(金) 06:45:13
エスパー様。また来てしまいました。orz バグとりの質問ばかりですがどうか許してください。 上で尋ねたのとは別のプログラムを実行するときに、 まったく同じエラー「Invalid character in field」 が出て困っています。コンパイラはFTN77で、エラーダイアログは、 00436b78 READE [+0552] 0042d818 EXPAN [+0273] 00401000 (プログラム名) [+1345] です。READEはファイル読みこみのサブルーチン。 EXPANは計算のサブルーチンです。 教わったように、PRINT*,'(行番号)'などをDOSに 出力すると、プログラムのごく最初の方にあるOPEN文の前まで しかPRINTの出力ができません。そのOPEN文は OPEN (UNIT=2,FILE='search.s') というものです。このserch.sというファイルは入力値を入れるものではなく、 プログラム自身が生成し、値を書き込むためのものです。 この文の前にはREAD文はないため、原因個所がわかりませんでした。 そこで、OPTIONのことを教えてもらいましたので、マニュアルをみて、 /check というオプションをつけてみたところ、こんどは、 Integer arithmetic overflow というエラー表示に変わり、 LOOKUP2 - in file tleed2.for at line 2307 [+0203] (プログラム名) - in file tleed2.for at line 376 [+13f7] と表示されました。LOOKUP2は計算サブルーチンです。 2307行は、そのLOOKUP2の前に記述してある別のサブルーチンのEND行 (そのENDのあと、コメントがあり、そのあとLOOKUP2の記述が始まる) です。行376は、そのLOOKUP2のCALL行で CALL LOOKUP2(CPVPOS,ILOOK,ILKBD,NLAY2,NST1,NSTEF,NSYM, & NLTOT2,NSHIFT,NCL,NLMAX,IROT,IMIR,1,FPOS,POSS,POSS2) というものです。 原因個所を探がすのに、どのようなことを試みるとよいでしょうか。
728 :
711 :2006/02/03(金) 06:48:15
あ、プログラム名伏せてたのにばれてしもたOTL。。
>>727 難しいな。コンパイラは奇妙な反応を返しているし。
FTN95に慣れていないと、コンパイラの息遣いを感じることも出来ないw
風の息づかいを感じていればのガイドライン
http://ex13.2ch.net/test/read.cgi/gline/1135748314/ 配列のはみ出しか、引数の不整合が、起きている。もしくは配列のはみ出しで
引数の不整合が起きているw
check で argment check や subscript check も見ていると思うが、option調べて味噌。
inputが間違っているので配列のはみだしが起きているのだと思うがw
CALLの直前直後、および呼ばれたサブルーチンの先頭で、大きな配列でない引数の値を
printしてみるくらいしかないかな。このパターンではCALLの直前しか書かないと思うが。
730 :
711 :2006/02/03(金) 09:45:33
>>729 周りに頼れる人がいないため、レスが大変ありがたいです。
未解決ですが過程を報告します。
あれから、マニュアルでオプションをもう少し調べて
/UNDEFと/BREAKというのをためしてみました。
/UNDEFでは初期値が与えられていない部分を指摘されました。
しかしこの部分は、オプションをつけなければそのままでも初期値0として
動いてくれるようでした。(言い忘れてましたが、サンプルのインプットがあって、
それでは問題なく動く)
/BREAKでは、デバッガが起動してびっくりしました。無手勝流ですが、
今、これを使って変数に入ってる数値を調べているところです。
>CALLの直前直後、および呼ばれたサブルーチンの先頭で、大きな配列でない引数の値を
print
なぜか始めの方のOPEN文より後の部分に、print文を書いても出力が出ないんですorz.
>inputが間違っているので配列のはみだしが起きているのだと思うがw
まったくその通りです。ルーチンは動く保証は一応あって、
INPUTで四苦八苦してるんです。
バグとりの質問などは面白くないと思いますが、また進展があれば報告させて
いただきます。
731 :
711 :2006/02/03(金) 12:02:23
報告。 デバッガで入力変数をまえから順に調べていったところ、 前述のREADEというルーチンの中のあるところから先が値が入ってなかった ので、そのFORMATをしらべたところ、入力とのズレを修正することができました。 それで、現在、プログラム動差中(たぶん)なのですか、前述の通り、 なぜか、プログラム中のあちこちに書いたはずのPRINT文が、 途中から出力されません。(そのため、本当に動いてるのか不安です) 数十分動かしてプログラムも終了する気配が無いし、なんだか悪い予感がします。 PRINTが出力されないのはいったいなぜなんだろう。。
>>731 反応が返ってこないのは暴走。
最後にprintされたところと、次のprint文の間でどっかへ行っている。
print文の範囲を縮めていって、問題箇所を特定する。
OPEN文に関しては、status=unknownを入れておくといいかも。
あと、暴走を途中で止めた場合ゴミファイルが残っているかもしれないので
消して置くといいかもしれない。
>>732 レスありがとうございます。
>最後にprintされたところと、次のprint文の間でどっかへ行っている。
>print文の範囲を縮めていって、問題箇所を特定する。
ご指摘で、どうやら不具合がわかったっぽいです。PRINTが無効になる
境目だけを別プログラムとして実行してみました(以下)
PRINT*,'263'
OPEN (UNIT=2,FILE='search.s')
OPEN (UNIT=15,FILE='prdir.d')
PRINT*,'265'
OPEN (UNIT=10,FILE='restart.d')
PRINT*,'267'
END
すると、263だけがDOSに出力され、なぜかsearch.sの中に265 267が書かれていましたOTL....
もしかして、UNIT「2」と「*」って重複なんでしょうか。
ともかく、PRINTは使いたいので、UNIT番号を書きかえてやってみます。
今日は午後は予定があるのでしばらく2ちゃんを離れます。
重ね重ねご助言ありがとうございます。
>>733 思いがけない展開だが、たまにあるパターンだw
>>もしかして、UNIT「2」と「*」って重複なんでしょうか。
*は普通は6番だと思うのだが、STDOUTとSTDERRで分けていたりするのかもしれない。
1桁や90番台のUNITはコンパイラーによって予約されていたりする。
これは、コンパイラーの息遣いを感じる以外ないwww
安直には2番を22番とかに書き換えることだろう。
FTN77 User’s Guide (UserGuide.pdf) 102ページ > by preconnection; the standard input and output are preconnected to units 1 and 2 > respectively (units 5 and 6 are respective alternatives). 息遣いを感じるのも悪くはないが、処理系の取説もよく読んだ方がいい。
736 :
デフォルトの名無しさん :2006/02/03(金) 20:38:20
だれかこのプログラミングを教えてください。お願いします。 x=0.1 , 0.2 , 0.3 , 0.4 , 0.5 y=1.228 , 1.005 , 0.823 , 0.674 , 0.552 近似式 y=a*exp(bx) 上の関数とデータで最小自乗法で近似した式を求めよ。 この問題のプログラムがわかりません・・・。お願いします。
737 :
デフォルトの名無しさん :2006/02/03(金) 20:42:06
Fortranで一度動的に確保した配列のサイズを途中で大きくしたい場合 どのような方法を使うのが一般的? 自分は、ベタに 1. 配列A(N)を確保 2. 同じ大きさの配列B(N)を確保 3. B(1:N) =A(1:N) 4. A解放 5. Aを新規に大きめに確保 くらいしか思いつかないのですが。 できればポインタ使わない方法が嬉しいのですが。
>>736 オマエが考えなきゃいけない問題なんでは?
ここで宿題しても身にならんだろ。
>>736 どうすればaとbを求められると考えているの?プログラムを作るのはそれから
>>738 基本的にはそれしかないだろう。
ただし、ちょっと増えるたびにその操作をすると時間がかかるから、あらかじめ増やす単位を大目に取っておく。
その単位は問題によるけど
そうですか〜、残念。 確保&解放繰り返すと、断片化が起きそうで怖いんですよね・・。
>>738 FORTRAN2003では、その辺がやや改良されていたはず。
1. 大きめの配列B(M)を確保 (M>N)
2. B=A
3. A=B
4. B解放
少なくともこれでいけるようになった。
サブルーチンでやればBは自動解放できるので4は略できる。
どっちにしろ断片化は避けられないがw
744 :
736 :2006/02/04(土) 00:45:01
>>737 さん
ありがとうございます。
行ってみます♪
746 :
711 :2006/02/04(土) 17:42:11
なんとか無事プログラムを動かすことができました。 助言を下さった方々、本当にありがとうございました。
748 :
デフォルトの名無しさん :2006/02/05(日) 06:52:31
たいていの事はフォートランでする。 それでできなきゃ、アセンブリ言語でする。 それでもできなきゃ、それはやる価値が無いのだ。
ハンマーを持つとすべてが釘に見えてくる
本物のプログラマは Fortran を使わない。 Fortran は白靴下を履いた臆病者のエンジニアや、パイプ圧フリークや、 結晶解析のチビどもが使うものだ。 奴らは有限要素解析と核反応炉シミュレーションで喜ぶ。
視野が狭いですね
IF文が構造化されてないって
GNUのF95はどんな感じですか?まともに動きますか?
Intel fortranにしたほうがいい。
世の中インテルのプロセッサだけではあるまい
とはいえIntelが増えているわなー。 計算センターも汎用機はItaniumだし。 IBM信者はハードからソフトまでIBMで固めないと気がすまないがw
GNU fortran使う人で非Intel系ってどういう人?
759 :
デフォルトの名無しさん :2006/02/09(木) 15:18:01
バグを発見する典型的なやり方ってありますか?
>>759 バグの種類にもよる。
結果が何故かNaNになってしまうようなバグなら、どこでNaNが発生するかデバッガで探せばいい。
NaNではなく、結果がちょっと変だというようなバグは特定が一番難しい。その場合は、人間の手でも解けるような
トリビアルな問題を解かせてみるか、コードを単純化するのが効果的だと思う。
暗黙の型宣言とcommon(もし使ってるなら)を無くすだけでも効果的だよ。
divide and conquerっすね
>>759 ・subchk argchk をかける。
・数値パラメータを巨大にする。
(誤差が有効桁の誤差か、バグによるものか区別できることがある。)
・長引くとき、必ず頭を切り替えるような休息を入れる。
(長引くのは勘違いして無関係なところを探していることが多いから。)
>>759 配列まわりを疑う。
バグの過半数は配列まわり。
配列まわりなんてほとんど全部になるなじゃ
765 :
デフォルトの名無しさん :2006/02/14(火) 17:49:04
複数のソースファイルで変数を共有させたいのですが、ちょっとつまづいてます。 メインのプログラムで common /abc/ abc とし、別のソースファイルのサブルーチンで !DEC$ ATTRIBUTES EXTERN :: abc 呼び出してるんですけど、大体の変数はうまく行くのですが、 integer, dimension(:), allocatable::abc; このような動的に割り付けられる配列の場合、以下のようなエラーとなります。 Error: Conflicting attributes or multiple declaration of name. [ABC] どうやったら、回避できるでしょうか? 環境は、WindowsXP, Visual Studio, Intel Fortran Compiler Version 7.0 です。よろしくお願いします。
common使わないでモジュールで宣言してuseで共有すればいいじゃん。
767 :
765 :2006/02/14(火) 18:02:15
>>766 すいません、できました。ありがとうございます!
昨日から始めたので、なかなか頭が回りませんでした。
768 :
デフォルトの名無しさん :2006/02/15(水) 20:13:19
すべての配列をALLOCATEで割り付けばあい、 計算速度は速くなるかおそくなるかどっち?
頻繁にやらなければ体感できないでしょう
770 :
デフォルトの名無しさん :2006/02/15(水) 20:17:31
それらの配列は、常に使用しているんだけど。。
771 :
デフォルトの名無しさん :2006/02/15(水) 20:23:49
dimensionで配列を宣言したときに、メモリのどこかが確保されると聞きました。 メモリには、記憶する領域と計算するための領域があるとも聞きました. そこで、教えて欲しいんですが、ALLOCATEした場合に、メモリのどこに確保されるのかって ことです。 ALLOCATEで確保されるメモリ領域は、静的に割り付けたものを確保する領域なのか あるいは、計算するための領域なのか、はたまた別の領域なのか。。どこ?
772 :
デフォルトの名無しさん :2006/02/15(水) 20:27:50
簡単にいうと、配列の大きさがプログラムを実行する段階で分かっていたら、 あえてALLOCATEする必要はないのか。あるいは、ALLOCATEした方が DIMENNSIONで宣言するよりも計算スピードは速くなるのか?ということです.
聞いてないで自分で試せよ。 環境によりけりだろうから。
774 :
デフォルトの名無しさん :2006/02/15(水) 22:05:13
知らないのならよし
775 :
デフォルトの名無しさん :2006/02/15(水) 22:45:12
動的変数はAUTOMATIC型はスタック領域に、ALLOCATE型はヒープ領域に とられたような気がする。AUTOMATICの法は確実にヒープ領域。 静的に宣言されたものとALLOCATE型で宣言されたもので違いが有るとしたら、 コンパイル時の、配列サイズに基づく最適化が静的に宣言されたほうが効きやすい 事くらいか? POINTER型よりはALLOCATE型のほうが自由度が少ない分最適化は効きやすい はずでは有るが。 ま調べたらここで報告してくれw
776 :
デフォルトの名無しさん :2006/02/15(水) 23:24:11
なるほど。。thanks
性能が変わるのは、ページサイズが領域によって変わるか、 他の配列との相対位置よっては、バンク競合や キャッシュラインの競合が起こりやすくなったりとかかな。 昔のスパコンじゃ無ければ領域によってページサイズを 変えてない気がする。 バンク競合が気になるなら、配列を大きめにとって 先頭をずらして計測してみれば、変化がみられる場合も。
779 :
778 :2006/02/17(金) 19:42:26
連カキコすみません.. あと,みなさんはどちらのコンパイラを使用していますか? よかったら教えてください m(..)m
781 :
デフォルトの名無しさん :2006/02/18(土) 00:22:42
>>780 GNUのFORTRANってどうなの?
糞だと思ってるから使ったことないんだけど。
g77が出来る前にf2c+gccは試したことがあるけど、gccが糞で動かなかった。
gccもその後倒産企業からフロントエンドもらったりしてようやくまともになったようだけど。
Gnu fortran使うくらいなら、Linuxで無料のIVF使うほうがいい
783 :
デフォルトの名無しさん :2006/02/18(土) 01:25:19
Fortranにはいくつものすんばらしい数値計算のライブラリあるのは知ってるが、 インターフェースが複雑すぎて使いこなせず、挫折してFortran嫌いになって、 結局しょうがないのでC++で毎度のように車輪の再発明を繰り返している私が懺悔に参りましたよ。
GFORTRANは知らんがG95の方はF2003のstream I/Oが使えたり 環境変数でエンディアンが変えられたりするのでなかなか便利だ。 まあ、どっちも中身がGCCなんで最適化は期待できんが。
>>784 STREAM I/Oはベンダー拡張でCVFとか結構色々なFORTRANで対応している。
また、DIRECT ACCESSでファイルを開いてレコード長を1Byteにすれば、
FORTRAN2003以前の標準文法内でも同等のことが出来る。
(ただし、レコード長がバイトではなくワード単位になっていると出来ないが)
エンディアンをコンパイラーオプションで変えるのは最近の商用コンパイラーでは結構
対応されている。浮動小数点もIEEE形式に天下が統一されたので、せいぜい
エンディアンさえ考えればいいのだから便利な世の中になった。
IBM形式は仮数部が多いので桁落ちしにくいとかCRAY形式は指数部が多いので
OVERFLOWしにくいとかつまらないことで争っていた人たちがいたもんだがw
>>783 インターフェースってなんだべ? WRITE(6,*) と READ(5,*) だけだべ?w
786 :
デフォルトの名無しさん :2006/02/18(土) 12:07:17
ライブラリで提供されてる サブルーチン副プログラムなんかの引数のことっす。(なして副プログラムってつくん?) 利用者に計算用領域を用意させてそれを引数で渡すなんざ まともなライブラリのやる事じゃねえ!と・・・
787 :
デフォルトの名無しさん :2006/02/18(土) 12:08:47
GSLなんかでもそんなんばっかだからべつにFORTRANが悪いわけじゃ ないんすけど
LAPACK95なら良かったのにね。
789 :
デフォルトの名無しさん :2006/02/18(土) 12:31:51
>>786 ああ、そういうことか。
あのへんは確かに初心者泣かせだわな。
昔のFORTRANを考えてみれば、
ソフトウェア的な制約として言語仕様的にどうしようもないと言うこともあるのだが、
ハードウェア的な制約としてメモリーの少なかった時代には仕方のない面もある。
FORTRAN90以降では動的にメモリー割付は出来るとはいうものの、
FORTRANでのワーク領域はばかでかい配列だったりするので、AUTOMATIC
変数にしてサブルーチン側で割り付けようとすると、スタック領域をたちまち食い尽
くしたりして、あまり合理的でなかったりする。
FORTRANは他の言語と違ってソフトウェア概念の発達というより、ハードウェアの
発達のほうにより強く束縛されているから、(その時代の最高速機ではFORTRAN
が動いている)バカらしい仕様に見えても時代時代ではそれなりに理にかなっている
気がする。
>>786 副プログラムとつくのは、FORTRANには副プログラムは2種類あって、
サブルーチン副プログラムと、関数副プログラムに分類されているため
それを区別するからだと思います。
791 :
デフォルトの名無しさん :2006/02/20(月) 15:19:13
fortranにはtime()関数みたいなのはないのですか? 乱数を初期化させる時に、実行させる度に違う乱数を生成させたいのですが、 どうしたらいいですか?
>>791 90だったら標準でsystem_clock()てのがある。
77でもベンダー拡張があるはず。
g77だとtime()もsecond()も使える。
>>791 FORTRAN77以前には時間を測る関数・サブルーチンは規格には存在しない。
ベンダーの独自拡張機能を使うしかない。
Fortran90ならば、DATE_AND_TIME と SYSTEM_CLOCK が、
Fortran95には更にCPU_TIMEというものがある。詳しくはマニュアルを味噌。
乱数に関してもFORTRAN77以前は存在しないが、Fortran90以降には
規格によってFortranの命令として存在している。
ただシミュレーションとか真面目な目的で乱数を使うなら、
自分で適切な乱数ルーチンを用意しないと後から偉い人に怒られる。
乱数といっても擬似乱数なので目的ごとにふさわしい乱数があるらしい。
大型計算機の場合にはハードウェアの乱数発生器をもっていたりするので
そういう場合にはそれを使えばいいと思うがw
すいませんちょっとお聞きしたいのですが visual fortranで数学ライブラリ(固有値解析)を使いたいのですが どうやって使えばいいのか分かりません どこか使い方書いてあるところありませんでしょうか
795 :
794 :2006/02/21(火) 21:55:52
すいません自己解決しました
796 :
デフォルトの名無しさん :2006/02/21(火) 23:19:40
>>796 すいません嘘つきました
できませんでした
lapackいれてdgeevのサブルーチン呼んでごちゃごちゃやればいいみたいです
けどめんどくさいのでやめました
MKL入れたらいいぢゃん
799 :
デフォルトの名無しさん :2006/02/21(火) 23:47:02
801 :
デフォルトの名無しさん :2006/02/22(水) 00:48:33
>>795 DEC(Compaq)のVisualFortranなら、DXML(CXML)がデフォで入っているから、 ビルドオプションでチェック入れればLAPACKはすぐ使えたはず。 Intel版はなまじっかMKLがあるばっかりに、DXMLの添付が打ち切られたw
802 :
デフォルトの名無しさん :2006/02/22(水) 00:50:58
>>800 ラッパーでいいならF90のは10年位前からあるぞw
803 :
デフォルトの名無しさん :2006/03/02(木) 13:49:06
804 :
デフォルトの名無しさん :2006/03/03(金) 10:54:44
805 :
デフォルトの名無しさん :2006/03/03(金) 22:15:40
>>803 複素数と実数が混同しているので自分で宣言しているのを
よく見直すべし
806 :
デフォルトの名無しさん :2006/03/09(木) 23:37:27
Mac G5 で gfortran を gfortran.pkg からインスコしてみたのですが、 -m64 つけてコンパイルすると、 ld64 warning: in /usr/local/lib/libgfortran.dylib, file does not contain requested architecture ld64 warning: in /usr/local/lib/libgcc_s.dylib, file does not contain requested architecture ld64 failed: in /usr/local/lib/libgfortranbegin.a(fmain.o), not a valid ppc64 mach-o file となり、ライブラリが 64 ビットに対応してないと文句を言われます。 仕方がないので自分で gfortran をコンパイルしてみたところ、 やはり同様のエラーが出てしまいます。 GMP と MPFR が 64 ビット用にコンパイルされなかったことが非常に気にかかっていますが、 ここが問題なのでしょうか? それとも、configure で特殊なフラグを立てる必要があるのでしょうか? 64 ビット環境用に gfortran をコンパイルしたことのある人がいましたら、 御教授いただければ幸いです。
807 :
デフォルトの名無しさん :2006/03/09(木) 23:52:36
メルセンヌツイスター法のコードから乱数を持ってくる方法が分かりません。 知ってる方、教えていただけないでしょうか?
>>806 このスレでは答えられない可能性が高い。
このスレではgfortranの人気も低いしw
810 :
デフォルトの名無しさん :2006/03/10(金) 04:39:42
メルセンヌツイスタはより一様ですか?
811 :
デフォルトの名無しさん :2006/03/10(金) 05:55:28
昔よくラインプリンタでASCII ARTのカレンダーとか出してたけど、 それ様のプログラムどっかにない?
Salford FTN77 についてなんですが,slinkの仕様についてご存知の方いらっしゃいませんでしょうか? オブジェクトファイルをちゃんと指定しているのに C:\>C:\win32app\salford\slink.exe C:\foo.obj *** Could not open C:\Program.obj ~C といった感じです.. ドキュメントを見てみましたが,該当するものが見つからず(?.?)といった感じです. ftn77 foo.f /link ftn77 foo.f /lgo も同じエラーメッセージが出るようです. 何かの環境変数が未定義なのか,ぅーん..
>>812 FTN95も一緒にインストールしてる?
FTN77の有るディレクトリにPATHが通ってなくて、PATHの中に
"C:\Program Files\Salford\ftn95"
など、間にスペースが有ってその中に salflibc.lib が有る
ディレクトリが含まれている場合はそうなる。
この場合は、FTN77を使うときにはFTN77の方を先にPATHに設定するか
FTN95のslinkを使うかすればよい。
814 :
812 :2006/03/11(土) 14:36:29
>>813 解決しました :−)
*** Could not open C:\Program( Files).obj
ということですね..納得です.
FTN95のslinkを使っても問題は無いようですね..当面はこれを使ってみることにします.どうもありがとうございましたm(..)m
g95のホームページのprebuilt binariesをcygwinで使おうと思うのですが, 将来バージョンアップしたものを導入するときは,インストール同じ手順でcygwinのルートディレクトリで tar -xvzf g95-x86-cygwin.tgz とするだけでいいんでしょうか?tar -xzfは解凍したファイル上書きしてくれるんでしょうか?
>>674 ,
>>681 2GBytes越えの、static配列の件だけど、
http://www.softek.co.jp/SPG/Pgi/win64/index.html Windows x64 (Win64) は、64ビットのアドレス空間は使用できるものの、
そのプログラミングモデルにおいては、上記のとおり 単一の静的データ
あるいはデータセクションのサイズが、2GB 以内に制限されております
ので、従来の静的宣言された配列の多いプログラムでは大きな制約となり、
2GB 以上使用するプログラムではリンケージでエラーとなるケースが
出てきます。この制約は、コンパイラの問題ではなく、Win64 上の共通の
制限ですので、フルに 2GB 以上のデータ領域を使用するプログラムを
コンパイル・実行したい場合は、「Linux」でのコンパイル・実行環境を
強く推奨します。
と書いてあった。
本当なのだろうか?
gcc-4.1のgfortranはどんな感じ?
salford ftn77のグラフィックに関することでお聞きしたいことがあります。 contour図かそれに似た図を描きたいんですがやり方がわかりません。 今はある範囲の値に対してこの色を使うというような感じで、 IF文をたくさん並べ、SET_PALETTE@、SET_PIXEL@を使っています。 この方法でもいいんですがプログラムとして格好も悪いし、色が少ないです。 PDFを見ると256色くらい使えそうな感じなんですけど、 英語でプログラム例も少なく使い方がよく分かりません。 何かいいcontour図の描き方がないでしょうか。 それとも他のfortranの方がいいでしょうか。
819 :
デフォルトの名無しさん :2006/03/16(木) 23:48:41
>>818 疑問点がよく分からん。
1.色の変え方が分からないのか?
2.contour図ルーチンを自作していて苦労しているのか?
1.の場合がんばってマニュアルを読めとしか言いようがない。
SalfordF77固有のグラフィック命令で色付き図を書いている人間は
現在の日本には少ないだろうから、答えてくれる人がいるか・・・・
ひょっとしてSalford77のグラフィックスはDOS用窓とかでないか?
2.の場合地球物理関係で使われているらしいPGPLOTでも使ってみたら
良いかもしれない。grwin PGPLOTあたりで検索してくれ。
もしくは計算データを独立したプロットプログラムに渡すほうがいいかもしれない。
FORTRANのグラフィックスも80年代末にGKSでようやく天下が統一されるかと
思っていたら、突然XYプロッターの時代が終了してWIMPの時代が来てしまい
結局混沌のまま進化が終わったので、まぁ我慢強く不便に耐え抜くしかないw
820 :
819 :2006/03/17(金) 00:04:39
821 :
818 :2006/03/17(金) 03:55:30
回答ありがとうございます 疑問点はどちらかと言うと1の方ですかね ルーチンを作った方が見た目もすっきりすると思いますが。 SET_PIXEL@では16色しか使えないみたいですけど、SET_PALETTE@で64色まで増やすことはできました。 とりあえず、もう少しライブラリを眺めつつ、PGPLOT、GKSを参考にしてみます。 ありがとうございました。
ちょっとマニュアルを見た限りではこんな感じかな。 integer*2 ix, iy, ierr, ireg, ir, ig, ib call VGA@ call GRAPHICS_MODE_SET@(640, 480, 256, ierr) do ix = 0, 15 do iy = 0, 15 ireg = ix*16 + iy ir = iy*4 + 3 ib = ix*4 + 3 ig = iy*2 + ix*2 + 3 call SET_VIDEO_DAC@(ireg, ir, ig, ib) end do end do do ix = 0, 15 do iy= 0, 15 call FILL_RECTANGLE@(ix*30,iy*30,ix*30+29, iy*30+29,ix*16+iy) end do end do end
823 :
http://www.vector.co.jp/soft/win95/util/se072729.html :2006/03/18(土) 19:35:35
TextSS のWindowsXP(Professional)64bit化おながいします もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
824 :
818 :2006/03/19(日) 01:19:50
わざわざすいません、おかげで助かりました。 一つ気になったんですがGRAPHICS_MODE_SET@の256って何を表しているんでしょうか。 16以下では描画がCALLしてないときと同じで、257以上では黒から赤のグラデーションに。 まあ一応やりたかったことはできそうなのであまり気にしないでおこう。 下のプログラムが私がやりたかったことの一部です。 INTEGER*4 IREG,IR,IG,IB,ERR IR=57 IG=6 IB=6 CALL VGA@ CALL GRAPHICS_MODE_SET@(640,480,256,ERR) DO IREG=0,255 CALL SET_VIDEO_DAC@(IREG,IR,IG,IB) IF (IREG.LT.51) THEN IG=IG+1 ELSE IF (IREG.LT.102) THEN IR=IR-1 ELSE IF (IREG.LT.153) THEN IB=IB+1 ELSE IF (IREG.LT.204) THEN IG=IG-1 ELSE IR=IR+1 END IF END DO DO IREG=0,255 CALL FILL_RECTANGLE@(IREG*2,0,IREG*2+1,479,IREG) END DO END
>>824 Library Reference によると GRAPHICS_MODE_SET@ の引数は順に
横方向の解像度、縦方向の解像度、色数、エラーコード
厳密にやろうとするなら、まず GET_GRAPHICS_MODES@ を呼んで
使用できる解像度と色数を調べてから、その値を使うべきなんだろうけど
Windows版の場合は解像度640*480、16/256色しか使えないっぽい?
でたらめな値を入れても ERROR_CODE に 0 が返ってくるし…
解説ありがとうございます。大変勉強になります。 データを視覚化できるとなんだか楽しいですね。 卒研でFORTRAN使っていて、もう卒論提出したのでプログラムいじる必要ないんですけどね。 最近VGA@、SET_PIXEL@で絵が描けること知って、プログラムいじってました。 もっと早く知ってれば研究もう少し進んだんだろうなぁ。 他のFORTRAN関連のスレ見てると大学や研究所ではまだまだ現役のようですね。 うちの教授も言ってましたが複素数が扱えるのが大きいのかな。
>>824 詳しくは分からないが、VGAとあるので昔のビデオモードの制約をうけて
画面サイズ640*480、8bit=256色になっているのだろう。
DOSからWindowsに切り替わる時期のコンパイラでは、Windows機能は
DOSエキステンダー替りに32Bitプログラムを動かすために使い、
独自グラフィックスは16bitのDOSモードを引きずっているということがよくあった。
256以上の数で赤に戻るのは、9bitより上が無視されて、下の方の桁だけが
有効になっているせいかと推測される。
828 :
デフォルトの名無しさん :2006/04/03(月) 14:41:54
初心者ですみません。質問があります。 write文で書き出すとき、1行に例えば200列データを書き出すように 指定しても、マシンによってはwindow幅に合わせるようにデータが 出力されてしまいます。 おそらくインストールしているFORTRANのデフォルトの何かを書き換え なければいけないと思うのですが、どのようにしたらよいか わかりません。どなたか教えてください。
829 :
デフォルトの名無しさん :2006/04/03(月) 23:08:58
>>828 OPEN文のRECL指定子で増やせると思う。
画面出力の場合は分からんw
RECLとはRECORD LENGTH(レコード長)。
単位がバイトだったりワードだったり処理系によって一定していないので
マニュアルを注意深く読む必要があると思う。
>>828 それって、Fortranでもコンパイラの問題でもなく
DOSプロンプトの問題ってことはないの?
本当は200列データが出てるけど、表示するアプリ側の問題で
折り返し表示になっちゃってるってことは?
変数をimplicit real*8(a-h,o-z)として読んでください。 nを数千万と想定 do i = 1, n j = mmm(i) if( j.lt.0 ) then vc = a*vn else vc = vn endif (中略) enddo というような処理があるのですがnが大きいため、if文を省けないか検討しています。 要約すると、ループ内で条件にあうものはaを乗算し、あわないものは何もかけない、という処理です。 何かよい方法はないでしょうか? real*8 b(n)を用意して条件にあうときはb(i)=a、あわないときはb(i)=1.0d0という配列をあらかじめ準備して、 vc=b(i)*vnとすればif文は省けるのですが これだけのために大量のメモリを使いたくありません。 整数1byte*nの参照配列を作る程度で何かいい方法はないでしょうか?無論メモリを使わない方法があれば、そのほうがよりうれしいです。 読みにくくてすいません。
832 :
デフォルトの名無しさん :2006/04/09(日) 23:41:42
>>831 最近のCPUとコンパイラなら、その程度のif文なら投機的実行でほとんどロスはないんでね?
一応仮にvc=a*vnだけにして速さに大きな差が出ると分かってから出ないと労力無駄の希ガス。
あと数千万なら〜8*10M byte〜100MByteだから、それほどメモリーを食うわけでもないべ?
>>831 x86ならSSE2の比較命令、PowerPCならfselを使えば速くなる。
IA64のプレディケートならコンパイラがやるはず。
ただ、はたしてプラットフォーム依存のコードを加える気が
あるのかどうか。
834 :
デフォルトの名無しさん :2006/04/21(金) 20:34:55
Fortran 2003 完全準拠のコンパイラマダー?
835 :
デフォルトの名無しさん :2006/04/22(土) 02:38:27
ぶっちゃけfortranってこれからどうなんの?
過去のソースをコンパイルするのに使い続けられるでしょう。
838 :
デフォルトの名無しさん :2006/04/23(日) 02:16:55
>>836 最大の敵のC言語が、C99、C++、D言語などに分裂したのでFORTRAN有利でね?
おまけに最近の言語は、言語としての記述の抽象度を上げる方向がスピードよりも
セキュリティーや安全面重視に向かっている。本来の電子計算機としての原点を忘れている。
FORTRANはなんだかんだいって、その時代時代ごとの最新ハードウェアで性能を出すように
かなりのリソースが振り向けられていて(その分の経費はハードの売り上げの中に押し込まれている
80年代のスパコンや90年代のRISC、2000年代のIntel)言語仕様は古いが、
最適化コンパイラとしては常に時代の先端を切っている。
最近のトレンドはマルチコア並列化だが、FORTRANは最近微妙に並列化に向けて仕様をいじっている。
たとえば配列のメモリー上の連続性を要請しなくなっている。
こういう点を見るとFortran2003が順調に出荷され、OSのAPI呼び出し等が楽になり、
かつ並列コンパイラの最適化技術の恩恵がうまく花開けば、FORTRANはニッチに留まらず
一気にメインストリームに躍り出てわが世の華を謳歌することも不可能ではない!!
マルチコアに対する並列化に対して、スパコンで培った自動並列化技術がうまく対応できれば
覇をとなえることが出来る!www
>>831 >real*8 b(n)を用意して条件にあうときはb(i)=a、あわないときはb(i)=1.0d0という配列をあらかじめ準備して、
>vc=b(i)*vnとすればif文は省けるのですが
>これだけのために大量のメモリを使いたくありません。
この配列を準備するのに結局はifを使うんじゃないの?
それだったらifに要するコストは同じなのではないの?
まぁ、
j = mmm(i)
k = ishft(j, bit_size(j)-1)
vc = ((a - 1.0d0) * k + 1.0d0) * vn
のようにすればifは無くせるけれど
可読性が極めて悪いので使うのなら注意して使え。
ただし、最新のCPU&最新のコンパイラを使ってるなら
素直なコードと速度はさほど変わらないだろうな。
841 :
デフォルトの名無しさん :2006/04/23(日) 18:18:03
>>839 FORTRANが再び覇を取って、天下に号令するんだ!w
>>841 ムリ
でも当分の間は生き続けるんだろうな
homepage.mac.com/galois21/fortran/lesson/lesson0.htmlにある問題0-4.で、 int.dの中身はどのように書けばいいのですか? a=1 b=10 と書いたらbad real number in item 1 of list input というエラーになりました。(各行の前には半角スペース6コ) あと、この問題の解答はfortran95でも使えますか?
844 :
デフォルトの名無しさん :2006/04/25(火) 03:54:10
845 :
843 :2006/04/26(水) 03:32:40
できました!ありがとうございました
F77の開発者様が極東スレで雑談してた・・・ ぐおお、参加したかった
極東スレってどこ?
848 :
デフォルトの名無しさん :2006/05/16(火) 23:45:54
Intel Visual Fortran 9.1も出たことだし、ageとくか
849 :
デフォルトの名無しさん :2006/05/17(水) 19:38:09
>>848 Intel Visual FortranをVisualStudioに統合すると,インストールの度にカスタマイズが
元に戻ってしまって困っているのだが,回避する方法を誰かしらないか?
カスタマイズを保存する・・・でもいいのだが
おすえてサミアドン
850 :
デフォルトの名無しさん :2006/05/18(木) 14:36:07
Intel Fortran9.1をインストールしようとしたらライセンスファイルがはねられた。 プレミアサポートはまだ一月以上残ってるのにな。 みんなは大丈夫なの?
ごめん。 間違ってプロフェッショナルバージョンをダウンロードしてたことに気づいた。 スタンダード版だったらインストールできた。
>>849 サミアドンは梅雨が明けるまでお休みです。
853 :
デフォルトの名無しさん :2006/05/18(木) 23:30:36
>>851 いやメールを受け取っていると思うが、それはIntelの間違い。
漏れも初日に困ったぜw
854 :
デフォルトの名無しさん :2006/05/19(金) 16:22:05
>>853 サミアドンは水に濡れるのが嫌いだったなw
だれかNAGのFortranBuilderを試してみた人いる?
感想を書いてちょ!
855 :
851 :2006/05/19(金) 16:52:08
>>853 そうだったんだ。Intel間違ってるだったんだね。
856 :
デフォルトの名無しさん :2006/05/22(月) 22:08:48
NAGのFortranBuilderの試用版が無料セミナーで配布されるらしい
【日時】 5月31日(水)13時30分〜(13時開場)
【場所】 英国大使館 (東京都千代田区一番町1)
【地図】
http://www.nag-j.co.jp/fbreleasemap.htm 【内容】
1:Fortran Builderのご紹介(Fortran Builder開発者 中野 剛)
Fortran Builderの機能、製品コンセプト、事例ご紹介.デモンストレーションなど
2:プログラミング学習とe-Learning
(法政大学情報メディア教育研究センター所長 竹内 則雄 教授)
プログラミング言語学習用電子ブックと開発環境が連動した体験的なFortran
プログラミング学習環境の概要と、対面授業やe-Learningでのその効用について
3: NAGWare f95 and reliable, portable programming
(英国NAG NAGWare Fortranコンパイラ開発者、マルコム・コーエン)
How to detect errors using NAGWare f95,and how to write portable,
reliable programs.Support for features from the latest Fortran standard
and plans for future releases.
4: Fortran Builder を使った数値計算 (筑波大学 長谷川 秀彦 助教授)
行列計算パッケージ LAPACK の紹介と Fortran Builder を利用したLAPACK の手軽な使い方について
5:Fortran Builder 体験コーナー・30日トライアル試用版配布・
ノベリティ配布など もちろん無料です。
英国大使館の警備都合上事前にご登録をお願いしております。
下記URLフォームにて参加登録ができます。
http://www.nag-j.co.jp/fbSeminarApply.htm
30日間の体験版ですか。 うーむ… ていうか、なんで今頃になってリリース発表会?
NAG社員乙!
859 :
デフォルトの名無しさん :2006/05/23(火) 00:55:42
NAGがFortran2003にいち早く対応しそうだから興味はあるのだが。 文法にきつくて速度はうんこというデバッグ向きの定評もあるし、 FortranBuilderで安く手に入るなら、チェック用にいいかなとも思うのだが。 NAG利用者の意見を求むw
860 :
デフォルトの名無しさん :2006/05/24(水) 23:07:53
コンパイラが10万くらいだったから安いかも
861 :
デフォルトの名無しさん :2006/05/27(土) 21:37:28
FTN77 Personal Edition ってもうダウンロードできないの? SalfordのHPやSilverfrostのHPからもリンクが消えてるんだけど…
862 :
デフォルトの名無しさん :2006/05/29(月) 01:52:14
>>861 FTN95がFreeになったから消したんでないのかな?
863 :
デフォルトの名無しさん :2006/06/03(土) 02:31:53
もうどこでもダウンロードできないんですかね?
864 :
デフォルトの名無しさん :2006/06/04(日) 00:35:52
>>863 ロシアか中国あたりにうpられていそうな気もするがw
漏れは使ったこと無いけど、FTN77はそんなにいいものなのかい?
フリーのFTN95はバナーがでてウザかった気はするが使えたよ。
F77だったらOPEN WATFORやg77などがあるので代替手段が無いわけではない。
WATFORもDOS EXTENDER時代に本来の開発が止まったものなので、昔懐かしい
感じを保っているはずだが・・・w
「FTN77PE.EXE」でぐぐるとそれらしきものがいくつか見つかるが
どれもなんか怪しい雰囲気がw
>>864 単体で使う分には取り立ててよいというほどではないと思うけど
CPad for Salford FTN77と一緒に使うとお手軽にプログラムの
作成・実行が出来るので重宝しています。
このセットで紹介しているHPも結構あるみたいだし。
866 :
デフォルトの名無しさん :2006/06/06(火) 00:54:17
すいません。わかる方がいたら教えてください。 FORTRAN77です。 たとえば、10行2列の数値データがあったとして、 これを「csvファイル」にファイル出力したとき、 1列目と2列目を、エクセルでいうA列、B列の各セルに 自動的に格納させる方法はありますでしょうか? C言語だと自動的に各セルに数値が収まってくれるプログラムを作成できますが、 私の使っている Salford FTN77 で作成したプログラムでは、 出力データがすべてA列に表示されてしまって都合が悪いです。 ちゃんと隣のB列の各セルに数値が収まるようなプログラムは作成できるでしょうか?
>>866 CとFORTRAN、双方でどんな出力をしたかは知らんが
csvなら値をカンマで区切ってやるだけでうまくいくはずだぞ。
open(10, file='abc.csv', status='UNKNOWN')
do i = 1, 10
write(10, '(F12.3, '','', F12.3)') data(i, 1), data(i, 2)
end do
close(10)
FORMAT文使え、ってことじゃなくて?
869 :
デフォルトの名無しさん :2006/06/06(火) 01:55:27
>867 こんな感じでカンマで区切っただけです。 Cでは特に何も考えなくてもうまくいったのですが…。 open(10, file='abc.csv', status='UNKNOWN') do 100 i = 1, 10 m=2i write(10, *) i,m x=x+1 100 CONTINUE close(10) >868 FORMAT文をどのように使えばよいですかね?
870 :
869 :2006/06/06(火) 01:59:07
x=x+1 ではなくi=i+1です。
>>869 いやそれ、カンマで区切れてないから。
出来たファイルをテキストエディタで開いて見てごらん。
872 :
デフォルトの名無しさん :2006/06/06(火) 15:29:32
>>869 FORMAT嫌いなら,
write(10, *) i, " , ", m
とするアルよろし!
再チェーン
873 :
869 :2006/06/08(木) 00:28:04
みなさんのおかげでできました。 ようするにカンマを打てばよいのですね。 ただ一つ気になったので教えてください。 867氏や872氏は、 write(10, *) i, " , ", m という風にダブルクォーテーションでカンマを打ってますが 私のコンパイラではエラーとなったので、 普通に文字を出力するように、 シングルクォーテーションでやったらうまくいきました。 ダブルクォーテーションでもできるのですかね。できないのは私だけ? 同様の理屈で、 write(10, '(F12.3, '','', F12.3)') data(i, 1), data(i, 2) も、 write(10, '(F12.3,A,F12.3)') data(i, 1), data(i, 2) という風に直したらうまくいきました。
>>873 文字列にダブルクォーテーション(")が使えるのはFortran90以降。
FORTRAN77のコンパイラでも独自の拡張仕様で対応しているものもある。
>>867 の
write(10, '(F12.3, '','', F12.3)') data(i, 1), data(i, 2)
はダブルクォーテーションではなくシングルクォーテーション2つだ。
文字列中の2つの連続した「'」は1つの文字「'」と解釈される。
H形編集記述子を使って
write(10, '(F12.3, 1H,, F12.3)') data(i, 1), data(i, 2)
とする手もあるが、今となってはお勧めできない。
875 :
デフォルトの名無しさん :2006/06/20(火) 00:32:22
>>856 の斜陽国家エベントにいってきた奴いないの?
なんか報告頼むぜ!いつごろF2003のコンパイラができそうだとかさ。
876 :
デフォルトの名無しさん :2006/06/21(水) 01:51:00
だれかINTEL Fortran のVer.8系列とVer.9系列の違いを教えてください。
877 :
デフォルトの名無しさん :2006/06/21(水) 02:08:47
インテルのホームページか、Intel(R) Fortran Complier販売代理店のホームページからリリースノートが見れます。
878 :
デフォルトの名無しさん :2006/06/21(水) 14:40:08
>>877 リリースノートをみても、根本的な違いがよく分かりません。
Intel8.x系列は未だに開発が続けられているのはなぜなんですか?
9.xに統合されないのは何か違いが理由があるのですか?
> Intel8.x系列は未だに開発が続けられている 違いが分からないのに開発されてると思った理由が知りたい。
880 :
デフォルトの名無しさん :2006/06/22(木) 12:26:34
>>879 intelからのversion upがVer.8系列とVer.9系列と両方なされているんだが、
どうして開発されていないといえないのか理由が知りたい。
>>881 挙動が変わった経験はないが、9.xで作ったバイナリの方が遅いことはしょっちゅうある。
開発とサポートって同義じゃないのに。
885 :
デフォルトの名無しさん :2006/07/13(木) 21:05:19
たまにはageとくか
886 :
デフォルトの名無しさん :2006/07/18(火) 20:15:58
HITのサイトが消滅して、プロサイドとの合弁会社のページが出てくるんだが、 詳しい情報きぼんぬ
887 :
デフォルトの名無しさん :2006/07/20(木) 03:45:40
フォートランは落ちぶれましたか?
888 :
困ってます :2006/07/20(木) 13:27:37
2次元のポアソン方程式 方程式 d2f/dx2 + d2f/dy2 = c 境界値 f = 0 範囲 x= -1 〜 1 , y= 0 〜 1 定数 c= -1 (x<0) , c = 0 (x=0) , c = 1 (x>0) 離散式 -4*f(i,j)+f(i-1,j)+f(i+1,j)+f(i,j-1)+f(i,j+1)= dx*dx*c これをvisual Fortranを使ってやるのですが全くわかりません。。。 誰か出来る人いませんか???? あとDOSで開いた後立体的に見たいんですが、可能ですか???? よかったら貼り付けてください!!!
890 :
デフォルトの名無しさん :2006/07/20(木) 15:23:35
>>888 PROGRAM unko
IMPLICIT NONE
INTEGER, PARAMETER :: nx = 50, ny = 50
REAL :: f(-nx - 1:nx + 1, 0:ny + 1), ff(-nx:nx, ny), c(-nx:nx, ny), dx, dy
INTEGER :: i, ix, iy
dx = 1.0 / REAL(nx)
dy = 1.0 / REAL(ny)
c(-nx:-1, :) = -1.0
c( 0, :) = 0.0
c( 1:nx , :) = 1.0
f(-nx - 1, :) = 0.0
f( nx + 1, :) = 0.0
f(:, 0) = 0.0
f(:, ny + 1) = 0.0
ff = 0.0
DO i = 1, 100
f(-nx:nx, 1:ny) = ff
DO ix = -nx, nx
DO iy = 1, ny
ff(ix, iy) = -c(ix, iy) * dx * dy &
+ ( f(ix - 1, iy - 1) + f(ix - 1, iy + 1) &
+ f(ix + 1, iy - 1) + f(ix + 1, iy + 1) ) / 4.0
END DO
END DO
END DO
STOP
END PROGRAM unko
収束条件をまじめに考えたほうがいい。ここでは無批判に100回イタレーション。
図はArrayVisualizerでも使え。漏れは使い方しらん。
WindowsでFortranからGraphicやりたいなら考えてもいい。
891 :
デフォルトの名無しさん :2006/08/09(水) 13:17:07
あげる
892 :
デフォルトの名無しさん :2006/08/09(水) 22:11:42
デバッグ作業を行っておりまして、 指定回数目の呼び出しでプログラムが止まるようにしたいと思っています。 非常に簡単なことで、例えば以下のように書けば問題なく目的が達成できると思っていたのですが・・・ subroutine xxx common /debug/ counter integer counter ------処理内容------ write(*,*) counter counter = counter+1 if(counter .eq. 2) stop end うまくいきません。コンソールには、 0 0 0 0 0 1 と書き出され、8行目のwrite文は認識されているのに 次の行のcounterのインクリメントは無視されているように見えます。 もちろんcounterは他の処理で書換えたりしてはいません。 また、親プログラムで最初にcounter=0に初期化してあります。 何かお気づきの点など無いでしょうか?
初期化部分が何度も実行されてるってことはないよね? とりあえず、デフォルトで 0 が入ってる筈だから、 初期化のところをコメントアウトしてみたらどうかな。
>>892 配列はみ出しで、commonのcounterが上書きされているとかw
-O0でこむぱいるしてね
全部載せてみなよ。あと使用してるコンパイラ。
897 :
デフォルトの名無しさん :2006/08/12(土) 00:43:16
g95でlapackとlapack95をインストールしようとして g95 projectに書いてあるようにmake.incを書き換えたけど lapackのコンパイルができなかったんだができた人いる?
899 :
デフォルトの名無しさん :2006/08/12(土) 19:20:52
>>898 OSはWinXPです。lapackはWin用のものです。
make install を行うと
makefile:7 *** missing separator. Stop.
というメッセージがでます。
>>899 Win用っていうと lapack-pc.zip ?
lapack-pc.zipに入っているMakefileはDigital Fortran (Visual Fortran) + nmake用なので
そのままでは g95 + GNU make では使えない。
lapack.tgz (LAPACK, version 3.0 + UPDATES) を取ってきて INSTALL/make.inc.LINUX を参考に
make.inc を作ればおk
901 :
デフォルトの名無しさん :2006/08/14(月) 05:46:07
>>900 ありがとうございます。
やってみます。
902 :
デフォルトの名無しさん :2006/08/20(日) 21:14:33
age
903 :
デフォルトの名無しさん :2006/08/23(水) 22:37:10
EclipseでIntel fortran (Linux)使いたくて調べた結果、photranていうEclipseのプラングインがあることが判明。 でもロクな能書きもなく、使いかたがわからないんです。 それか、Eclipseで直接Intel Fortranを使う方法、どなたか知りませんか?
904 :
番組の途中ですが名無しです :2006/08/30(水) 13:52:21
ちょい聞きたいんだけど、fortranってCみたいに/* 〜 */でブロックごとコメントアウトみたいなの出来ないかな。 仕方なくEmacsでcommet-regionとかしてるけど、やっぱり面倒だ。 何かいい解決策知ってる人いないかのう
今どきのfortranは#if使えないか?
>>905 前やったときに使えなくて,そのレスみて本当は使えるのか?と思ってマジメに探したらあったあった.
ifortで -fppオプションか,サンクス.
と思ったらオプションつけなくても拡張子を".f90"でなく大文字で ".F90"にすればいいのか. これは知らなかった.
908 :
デフォルトの名無しさん :2006/08/31(木) 00:07:10
FORTRANは行センシティブなので、素直に1行ごとにコメント印をつけるほうが自然。 終端記号センシティブな言語の慣習を持ち込むのはよくないw
プリプロセッサに頼るのはよくないとです 理由は・・・適当にググってくれぃ
coco (Condiditonal Compilation) の事もたまには思い出してあげて下さい
911 :
デフォルトの名無しさん :2006/09/05(火) 19:55:49
Visual Studio 2005でFTN95って使えないんですか?
913 :
911 :2006/09/06(水) 00:44:23
>>912 情報有難うございます。
Visual Studio 2003を持っていればFTN95をインストールしたときのレジストリの変化等を見て
Visual Studio 2005に対応させる方法が類推できそうなんだけど...。
だれかやってくれないかなぁ。
>>913 SilverfrostのForumを探してみるとVS2005に対応させる予定はあるようで
we are still aiming for a release "this summer". と言っているので、もうすぐ対応版が出るかも?
#もう夏も終わりだが
ちなみにVS2005 Express Editionは他のコンパイラを追加することが出来ないようなので
無償でVS上でFortranプログラミングとは行かないようだ。
915 :
911 :2006/09/06(水) 02:55:18
>>914 おぉ!!有益な情報有難うございます。
VSのエディタだとオートコンプリートが使えて便利そうなので対応予定があって良かったです。
XlsoftからLinux用の非商用版は入手できるのでしょうか? 日本語マニュアルあるといいんですが。
>>916 日本語のマニュアルなら購入しなくてもゲットできますよ。
ただ、xlsoftにメールアドレスを登録する必要があります。それだけで、そのメールアドレスにパスワードが送られてくるかと。
918 :
916 :2006/09/07(木) 11:59:58
>>917 ありがとうございます。
xlsoftからアーカイブを入手してドキュメントだけ取り出しました。
しかしメインの部分は英語なんですね。まあ困ったらちゃんと読む
ことにします。
919 :
デフォルトの名無しさん :2006/10/10(火) 10:53:44
920 :
デフォルトの名無しさん :2006/10/12(木) 00:57:18
>>919 多分そうなんだろうが、CPUがPen3でやっていることからも分かるように、その情報はものすごく古い。
Intel FortranはVer.7から系列が変わっているので、Ver.5とは別の製品だと思ったほうがいい。
今はVer.8とVer.9の系列が並行してBugFixが出されている。
速いのはIntelかPGといわれている。CPUやプログラムとの相性もあるので場合によって異なる。
GNUは独立ベンダーを倒産させるので、うんこコンパイラのままとどめておくべきw
921 :
919 :2006/10/12(木) 10:06:23
>>920 有り難うございます。
Intel Fortranのバージョンがあがっているのに計算時間が遅くなっているので
疑問に思っていたのですが、別の製品と思えば納得です。
922 :
デフォルトの名無しさん :2006/10/18(水) 14:53:17
Fortranのフリーのコンパイラが使えません。 XP使ってて、ftn77.exe等のコンパイラを試してみたんですが、 このコンパイラがXPに対応していないせいか、 使おうとすると、毎回ダウンロードが始まるだけで使えません。 簡単にコンパイルできる方法があれば、 それでもいいので教えてくださいませ。
924 :
デフォルトの名無しさん :2006/10/20(金) 21:45:52
Virtual PCが無料で配布されているらしいので、Fortran使うために Sunのソラリス入れる敷居が下がったぞいw
>>924 solarisのコンパイラはgccとあんま変わりません
今までCVF使ってたんだけど,Intel Fortran Compiler9.1でコンパイルしたら 実行時間が40%以上縮まったお すげーお
>>926 CPUはなんだ?つーかSSEとかかけてる?
インテルはCPU対応の最適化が進んでいるから、最新CPUだと差がでやすい。
しかしCXMLのライブラリが無くなったのがめんどい。
まぁLAPACKだから拾ってくればいいんだが、INTELもMathKernelの
BLAS−LAPACKぐらいはただでよこせw
928 :
デフォルトの名無しさん :2006/10/26(木) 09:40:16
929 :
929 :2006/11/05(日) 11:57:48
今、ワードのようなテキストデータの中に1961年から2005年までの乱雑した年 数だけわかっていて、そこから連続した数を抽出し、発生頻度と見なしてその 発生確率からポアソン分布による乱数を行なえるようなプログラムを知りたい のですが、 詳しく述べますと、 データ例として、初めてでよくわからないのですけど、'nenpow.txt'というよ うなワードの文章の中に112行1列(要は縦に一つずつの年報が並んでいる)に なっています。ちょっと描いてみると 1行目:1961 2行目:1961 3行目:1962 … 112行目:2005 というようになっており、ここからそれぞれの年報をまとめて発生個数として ポアソン分布を作成し、それによる確率的な乱数を発生させるようにしたいの ですけど・・・。 Fortran77か90で行ないたいのですけど^^;
>>929 >Fortran77か90で行ないたいのですけど^^;
Fortran90はFORTRAN77の上位互換だ。
つまり、FORTRAN77でプログラムを書けば、それはFortran90のプログラムであるとも言える。
931 :
929 :2006/11/05(日) 14:04:51
では、FORTRAN77で知りたいのですけど・・・。 プログラムの仕方がわからないのですけど、わかりますか?
932 :
デフォルトの名無しさん :2006/11/05(日) 19:58:30
Intel fortran compiler 9.1を使っているのですが,モジュールの扱いについて教えてください モジュールのみを記述したファイルtest_mod.f90と, それを呼び出して使うメインルーチンが記述されているcall_mod.f90があったとします. そして ifort -c test_mod.f90 (1) とコンパイルしておき, ifort call_mod.f90 (2) として実行ファイルを作ろうとしても外部参照が未解決であるという旨 を表示させると共にリンクエラーとなります.もちろん, ifort call_mod.f90 test_mod.obj (3) と入力すると実行ファイルを作ってくれるのですが,(2)のコマンドだけでリンクを通す方法はないでしょうか?
933 :
932 :2006/11/05(日) 19:59:29
[test_mod.f90]の内容 -------------------------- module test_mod implicit none contains real(8) function func(a,b) real(8) a,b func=a+b return end function func end module test_mod -------------------------- [call_mod.f90]の内容 -------------------------- program main use test_mod implicit none real(8) a,b a=1.d0 b=2.d0 write(6,*) func(a,b) stop end program main ---------------------------
>>932 (3)の方法でコンパイルするのが一般的だと思います。
どうしても(2)の方法でコンパイルしたい、というのであれば !DEC$ OBJCOMMENT と
ライブラリを使う方法があります。
1. test_mod.f90の先頭に
!DEC$ OBJCOMMENT LIB: "test_lib.lib"
を追加する。
2. test_lib.libをつくる
ifort -c test_mod.f90
lib -out:test_mod.lib test_mod.obj
3. call_mod をコンパイルする
ifort call_mod.f90
この場合、test_mod.obj の替わりにtest_lib.libを使用するので
call_mod.f90 コンパイル時に test_mod.objは不要です。
935 :
932 :2006/11/05(日) 21:04:37
>>934 >2. test_lib.libをつくる
>ifort -c test_mod.f90
>lib -out:test_mod.lib test_mod.obj
の部分は
lib -out:test_lib.lib test_mod.obj
ですよね?これでできました!
!DEC$ OBJCOMMENTというのは初めて知りました.
調べてみるとなかなか使い易そうです.
ありがとうございました.
936 :
フォートランまだまだ初心者 :2006/11/05(日) 21:08:08
よくわからないのですけど、'PARAMETA.txt'のデータの中が150行6列になって いて、そこから一つずつの列の値に対して対数正規分布を行い、それぞれを一 つずつにまとめていきたいのですけど… どなたかわかる人はいませんか? Fortran77で行ないたいのですけど^^; データ内容 4.84E+01 3.70E+01 3.04E+01 2.38E+01 3.15E+02 -7.25E+01 3.95E+01 4.16E+01 1.59E+01 3.90E+01 6.62E+01 6.06E+01 3.18E+01 8.20E+01 4.05E+00 3.92E+01 4.37E+02 -6.41E+01 4.93E+01 5.93E+01 4.01E+00 3.93E+01 2.23E+02 6.10E+01 3.78E+01 2.92E+01 9.60E+00 -1.52E+01 3.30E+02 -7.95E+01 … … … … … … よろしくお願いします><
937 :
デフォルトの名無しさん :2006/11/05(日) 23:20:34
>>935 MODULEを使うと、引数の型のチェックなどをしてくれる。
LIB形式にしてしまうと(昔の77の頃と同じならば)引数の型などをチェックせずにLINKすることに
なるんじゃないかな?
ついでだから確かめて報告してくれ。
>>936 もう少し内容を整理してもらわないと、誰も答えられない。
一体、西暦はどこに消えたんだ?
6列のデータを、列ごとにまとめるのは簡単だ。
対数正規化を行うのは、列毎のデータが得られてから考えることで、
味噌糞ごっちゃりにすべきでないべ。
938 :
932 :2006/11/06(月) 01:20:57
>>937 引数の型はチェックしてくれるようです.
ただ,!DEC$ OBJCOMMENT LIB:を使うと,その名前のライブラリファイルがないと
リンクできなくなるようです.例えば,
メインルーチン main.f90 内部で
use module_1 (この内部では!DEC$ OBJCOMMENT LIB:"module_1.lib"と記述されている)
use module_2 (この内部では!DEC$ OBJCOMMENT LIB:"module_2.lib"と記述されている)
use module_3 (この内部では!DEC$ OBJCOMMENT LIB:"module_3.lib"と記述されている)
としている場合,リンクするときに必ずこれら3つのライブラリファイル(module_1.lib,module_2.lib,module_3.lib)
が必要になります.そのかわりコマンドは楽で,
ifort main.f90
だけで通ります.
もし,!DEC(略) 宣言なしの場合は,
lib -out:all.lib module_1.obj module_2.obj module_3obj
という風に統合したall.libをひとつ用意しておけば,
ifort main.f90 all.lib
で通ります.
!DEC(略)宣言ありの場合は,モジュールがモジュールをuseする
場合等に必要となるlibファイルとmodファイルが増えまくるということになりそうです.
(宣言無しの場合全てを統括したlibを一つ置けばよい)
結局どっちが楽かって話になりますね.まだ色々試してる段階なので何とも言えないですが.
939 :
932 :2006/11/06(月) 01:33:18
>場合等に必要となるlibファイルとmodファイルが増えまくるということになりそうです. modファイルは当たり前でした.libファイルだけですorz 結局何が言いたかったかというと,libファイルを一つのlibファイルに することができなくなるということでした.
940 :
デフォルトの名無しさん :2006/11/06(月) 02:53:25
N次正方行列A(N,N)の行列式の値を求める とき、IMSLを使った書き方を教えてくだされ。
MKLとIMSLどっちがいいのかな
944 :
フォートランまだまだ初心者 :2006/11/06(月) 13:55:33
そうですね>< できれは、年報のデータを一行目に持ってきて112(150)行7列やっていきた いのですけど、大丈夫ですかね^^; なんか、内容とかを考えていく内にこんがらがってきたのですけど><
945 :
デフォルトの名無しさん :2006/11/06(月) 20:19:50
program syukudai integer i,j,k real*8 A(3,3) , B(3,3) , C(3,3) A(1,1)=1.0 A(2,1)=1.0 A(3,1)=1.0 A(1,2)=1.0 A(2,2)=1.0 A(3,2)=1.0 A(1,3)=1.0 A(2,3)=1.0 A(3,3)=1.0 B(1,1)=2.0 B(2,1)=2.0 B(3,1)=2.0 B(1,2)=2.0 B(2,2)=2.0 B(3,2)=2.0 B(1,3)=2.0 B(2,3)=2.0 B(3,3)=2.0 do 10 i=1,3 do 10 j=1,3 C(i,j)=(0.0) do 10 k=1,3 C(i,j)=A(i,k)*B(k,j)+C(i,j) 10 continue do 20 i=1,3 write(*,*) (C(i,j) , j=1,3) 20 continue stop end jwd8211i-i "syukudai.f", line 25: ループを入れ換えました.(行:26) jwd8211i-i "syukudai.f", line 25: ループを入れ換えました.(行:28) jwd8331i-i "syukudai.f", line 25: このループはライブラリ呼出し(matmul)に変換されました. 3行3列の積なんですが、上記のようなエラーが出て困っています。2行2列ではうまくいったんですが…どなたか助けてください(泣)
946 :
デフォルトの名無しさん :2006/11/07(火) 12:02:01
>>945 富士通臭いメッセージだな。末尾の i の文字に注意すべし。(たしか富士通はそうだったはず)
それはエラーではない。ウォーニングですらない。インフォメーションだ。 (e,w,i の違いあり)
メッセージは最適化の結果だ。
ループ入れ替えをして、かつ行列積であることをコンパイラが認識して、専用の最適化ルーチンに
おきかえたと知らせているだけだ。ふつうに動くはず。
学習のためにやるなら、デバッグ用のオプションをつけて最適化を抑止するといい。
947 :
デフォルトの名無しさん :2006/11/07(火) 19:50:47
>>946 そうだったんですか…
動かしてみたら確かに動きました。
お騒がせしました。
948 :
デフォルトの名無しさん :2006/11/08(水) 00:59:23
>>944 それなら楽勝。
ちみの考えるべきは、単に年毎に対応した1列分のデータがまとめられた場合の処理だ。
あとはそれを6列相当分6回繰り返せばいいのだから。
949 :
フォートランまだまだ初心者 :2006/11/08(水) 03:32:02
>948さんありがとうございます もう一つ知りたい事があるのですけど載せていはいないのですけど、一列目の 年数の値をポアソン分布に従って発生させて、その事象について他のバラメー タをいて乱数で確率的な数値から値を求めていき、その値をdatファイルにいれ ていくにはどうしたらいいですか? (乱数には2行から7行までのデータによる確率分布によるものとする)
950 :
デフォルトの名無しさん :2006/11/08(水) 17:50:32
訳があって、fortran のソースを C に変換してから実行ファイルを作りたいのです。 以下の makefile で make calc とやっても目的の事が出来ない、 .c を経由しないで.f から .o を作ろうとするのですが、 どこが間違ってるのでしょうか? 気づく点があったら教えて下さい。 ------------------------------------------------------------------------- CC = cc CFLAGS = -c LDFLAGS = -L/usr/local/lib -lf2c -lm INCLUDES= -I/usr/local/include F2C = f2c F2CFLAGS= -Nc40 PRG1 = calc OBJ1 = main.o subr.o .f.c: $(F2C) $(F2CFLAGS) $< .c.o: $(CC) $(INCLUDES) $(CFLAGS) $< $(PRG1) : $(OBJ1) $(CC) $(LDFLAGS) $(OBJ1) -o $(PRG1) clean: rm -f *.o *.c ----------------------------------------------------------------------------------
951 :
950 :2006/11/08(水) 17:51:39
タブは見えなくなってますが、入っております。
.SUFFIXES: .SUFFIXES:.f .c .o を頭のほうにいれてみるとかどう?
953 :
950 :2006/11/08(水) 20:14:06
>>952 どうもありがとう。やってみましたが、うまくいきませんでした。
main.o:main.c
main.c:main.f
subr.o:subr.c
subr.c:subr.f
を加えればうまくいくのですが、実際に全部加えるのは大変。。。
>>950 のだと*.oと*.f間に依存関係が記述されてないからなんじゃない?
>>953 みたいに依存関係を記述するのが正解だと思うけど。
そうしないとすると*.fから*.oをつくるようにするとか。
確認していないけど、こんなイメージ。
.f.o:
$(F2C) $(F2CFLAGS) $< -o hoge.c
$(CC) $(INCLUDES) $(CFLAGS) hoge.c -o $@
多分もっといいやり方があると思う。
955 :
デフォルトの名無しさん :2006/11/09(木) 02:17:20
newmann条件の熱方程式を差分法を使って解きたいんですけど、うまくできません。 (du/dt) = (d^2u)/ (dx^2) (0≦x≦1) du/dx=0 in x=0,1 u=cos(pi*x) in t=0 どなたかご教授お願いします。 program sabunhou parameter (ndim=101) dimension u(ndim) write(*,*) 'INPUT : nfunc=' read(*,*) nfunc write(*,*) 'INPUT : n=' read(*,*) n write(*,*) 'INPUT : dt=' read(*,*) dt write(*,*) 'INPUT : tmax=' read(*,*) tmax h=1.0/float(n) flam=dt/h**2 do 1 i=1,n+1 fi=i-1 u(i)=f(fi*h,nfunc) 1 continue write(*,100) 0.0,(i,u(i),i=1,n+1)
956 :
デフォルトの名無しさん :2006/11/09(木) 02:17:55
100 format(1h ,'t=',1pe12.41h ,5(2x,'i',5x,'U(i)',4x)(1h ,5(i3,1pe12.4,1x))) nstep=0 2 continue uleft=u(-1) do 3 i=2,n unew=(1.0-2.0*flam)*u(i)+flam*(u(i-1)+u(i+1)) u(i-1)=uleft uleft=unew 3 continue u(n)=uleft u(n+1)=u(n-1) nstep=nstep+1 t=dt*float(nstep) write(*,100) t,(i,u(i),i=1,n+1) if(t+dt.lt.tmax+0.1*dt) go to 2 end function f(x,nfunc) pi=3.1415927 f=cos(pi*x) end
>>952 %.o:%.f
をいれると.fと.oの間のデフォルトルールが消されて
うまくいくっぽい。
958 :
デフォルトの名無しさん :2006/11/09(木) 08:42:20
>>955 何がうまく行かないのか、もう少し具体的に書いてくれないと答えられない。
世間的には、いきなりソース見せて、『おかしいの教えて!』と言ったら。
『おかしいのはお前の態度だ!』といわれちゃうw
>>949 いまいち理解できないのだが、データそのものを乱数で生成したいということか?
年号に関してはポアソン分布をなすように、それに対応する6個の値は別の分布ということ?
それならば、それぞれの分布をなす関数が用意してあればDO LOOPをまわすだけだ。
それらをサブルーチンかファンクションで作ればいい。
959 :
デフォルトの名無しさん :2006/11/09(木) 09:24:21
>>955 境界の位置のuの値が固定されてしまっていました。
なんとか解決することができました。
ありがとうございました。
煮詰まった余りおかしな態度だったことをお詫びします。
960 :
デフォルトの名無しさん :2006/11/09(木) 09:55:13
>>959 OKwwwwww
頼りになる人は気難しいし、気さくな人は頼りにならん。
奴らの操縦法は下手に出ておだてる事と、適切な質問を与えることだ。
961 :
デフォルトの名無しさん :2006/11/10(金) 00:34:19
g95 と gfortran の関係について教えてください (>< できれば3行で!
無 関 係
963 :
デフォルトの名無しさん :2006/11/10(金) 01:01:47
>>926 いや、先祖はg95で同じだろw
g95の中の人がGCCと一緒になるのを嫌ったのかな?
詳しいことしらん。
965 :
デフォルトの名無しさん :2006/11/10(金) 19:02:47
966 :
デフォルトの名無しさん :2006/11/11(土) 00:42:39
>>965 メルセンヌ・ツイスターの本家ページにC版の半区間を見た記憶があるが、幻かもしれない。
968 :
デフォルトの名無しさん :2006/11/11(土) 14:10:20
mt19937ar.fは全部入り
969 :
965 :2006/11/11(土) 16:54:27
>>966-968 ありがとうございます。
mt19937ar.fを使ったらうまくいきました。
そろそろ次スレが要るな。
ちゃんと最後まできっちり使えよ! FORTRANIVはすなわちFORTRAN66だなw
978 :
デフォルトの名無しさん :2006/11/12(日) 17:56:17
979 :
デフォルトの名無しさん :2006/11/12(日) 17:57:19
981 :
デフォルトの名無しさん :2006/11/12(日) 17:58:38
982 :
デフォルトの名無しさん :2006/11/12(日) 17:59:49
CONTINUE
984 :
デフォルトの名無しさん :2006/11/12(日) 18:33:13
985 :
デフォルトの名無しさん :2006/11/12(日) 18:33:48
986 :
デフォルトの名無しさん :2006/11/12(日) 18:37:34
987 :
デフォルトの名無しさん :2006/11/12(日) 18:38:28
988 :
デフォルトの名無しさん :2006/11/12(日) 18:39:04
989 :
◆SHiMA//5DA :2006/11/12(日) 18:48:52
990 :
デフォルトの名無しさん :2006/11/12(日) 18:49:27
do 1000 i =1 ,n
STOP
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。