Fortran
■ このスレッドは過去ログ倉庫に格納されています
0001パッキー
NGNG0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNG0004パッキー
NGNG0005たかじん
NGNG0006ものすごくやさしい人
NGNGgoogle で free の Fortran90 用のコンパイラを探せば、できますよ。
http://www.google.com/
0007質問???
NGNGもし知っておられるなら教えて欲しいです。
また、計算結果がわかっていない計算をしてるので、確かめようがないので困ってます。
お願いします。
0008デフォルトの名無しさん
NGNG0009デフォルトの名無しさん
NGNG都合のよい方で、良しとしよう
0010デフォルトの名無しさん
NGNG何か考えられる原因はないですかね?
0011デフォルトの名無しさん
NGNG変数を初期化していない。
001210
NGNG初期化していない変数を、そのまま出力したりすれば値は変わると思い
ますが、計算結果を代入すれば初期化していないことは結果には関係
ないですよね?
0013デフォルトの名無しさん
NGNGそうだったとして、
自分のプログラムのバグ
浮動少数値演算で最適化レベルにより計算結果が違ってくる現象
コンパイラのバグ
一般的にはこの順番で怪しい
0014デフォルトの名無しさん
NGNG計算で使用している変数の初期化をしていなかったら?
ロジックが誤っていて変数に代入している部分をスキップしていたら?
001510
NGNG>>13
Windows 上の Visual Fortran のデバッグビルドとリリースビルドですが、
最適化のレベルということになるのだと思います。
で、MSDN を見てみたら、
> コンパイラを最適化すると、予期しなかったようにコードが変化する場合があります。
なんていうのがありました。どうしたら良いのかは書いてないみたいですが。
>>14
なるほど。それはそうですね。それも調べてみないとか。
VC++ なら警告レベルを上げればエラーになりそうですが、Visual Fortran
でもできるのかな。
001613
NGNGゆえに、DEBUG状態の方が安全だと思う。
0017デフォルトの名無しさん
NGNGで・・・
Fortran関係のWeb掲示板ってどっかにある?
探してもあんまり見当たらないんだけど・・・
0018デフォルトの名無しさん
NGNG0019デフォルトの名無しさん
NGNGコンパイルスイッチをチョコチョコ変えて原因を探るべし
キット/O2とかそんなところでかかる
0020デフォルトの名無しさん
NGNG必ず /fltconsistency を使用します。
/fltconsistencyまたは/Opオプションは,Intelシステムでの
浮動小数点演算の一貫性を改善します。
0021初心者
NGNGf77 -o exsamp78.out exsmp78.fとやってもa.outができないのですがどうしてなんですか?
教えてください。
0022Kusakabe Youichi
NGNG> LINUX MLD3 を使っているのですが。XeditでFORTRANプログラムをつくったのですが
> f77 -o exsamp78.out exsmp78.fとやってもa.outができないのですがどうしてなんですか?
man f77
# っていうかふつうratforつかうぞ(って、Linuxのディストリビューションでによ
# ってはratforはいってないのもあるのかなあ)
0023デフォルトの名無しさん
NGNG0024Kusakabe Youichi
NGNG> 連立一次方程式をガウス・ジョルダン消去法で解きたいのですが、対角成分が0になった時のピボット選択の部分はどういう風にプログラムすればいいのですか?
IF文つかえばいいですね。
0025デフォルトの名無しさん
NGNGこの説明で理解できる?
0026デフォルトの名無しさん
NGNG>>23 対角成分が非0になるように列を入れ替える。
>>7 Intel Inside な場合、Intel仕様とIEEE仕様の違いかも。
i8087 (いしにえのIntel系FPU)の場合、
IEEE math と Intel math という二つのモードがあって、
IEEE で決まっている例外割り込み(桁あふれ等)を有効にするには、
精度の低い IEEE math を使う必要があったと思われ。
#って誰の役にもたっていない...
0027デフォルトの名無しさん
NGNGこのスレは間も無く駄スレになります。
0028デフォルトの名無しさん
NGNG0029デフォルトの名無しさん
NGNG0030デフォルトの名無しさん
NGNG0031デフォルトの名無しさん
NGNGSunのf77あたり。PDFのはみっけたんだけど、書籍になってるのが欲しいッス。
根性で印刷するして、製本するしかない?
0032デフォルトの名無しさん
NGNG#昔のSunにはf2cが入ってたけど、それじゃないよね。
0033デフォルトの名無しさん
NGNG0034かじりたてオーとキャド
NGNGユニックス・フォートランー>PCフォートランにコンバート作業中なのですが、
ユニックス上で組まれているフォートラン・プログラムの
各ソースプログラムからのサブルーチン経路がわかるようなモノ(ツリー)を
出力することは可能でしょうか? お願い致します。
0035デフォルトの名無しさん
NGNGちなみに俺はそんなもん知らないヘタレですが。
0036デフォルトの名無しさん
NGNGおいらが前引いた時は、Fortran77 subset対応っぽい奴しか
見当たらなかったけど。
0037デフォルトの名無しさん
NGNG昔ホストプログラムのやつを手打ちでつくったことあるよ。サブルーチン300個ぐらいのやつ(藁
003820
NGNGttp://www.netlib.org/floppy/contents.html
0039デフォルトの名無しさん
NGNG004036
NGNG0041デフォルトの名無しさん
NGNG0042デフォルトの名無しさん
NGNGFortran 2 Java(f2j) Project
0043デフォルトの名無しさん
NGNG0044デフォルトの名無しさん
NGNG教えてください.
0045デフォルトの名無しさん
NGNG配列の次元数上限ならまだしも、サイズ上限って、、、
OSや環境依存でないの?
0046デフォルトの名無しさん
NGNG初心者ですいません.そうです,配列の次元数上限のことです.
いくらぐらいまで正常にプログラム回りますか?
0047デフォルトの名無しさん
NGNG0048デフォルトの名無しさん
NGNGfortranが早いから、使ってます。ところで算術比較で.EQ.とかって
あるけど==とか、<=とかはfortran90から使えるの??
誰かおしえてー。
0049デフォルトの名無しさん
NGNGそういった記号はf90から使えるよ。
自由書式(132桁まで)にも対応してるので
すごく使いやすくなった。
0050デフォルトの名無しさん
NGNG0051デフォルトの名無しさん
NGNGつい最近Fortranを再インストールしたら
fatal error C1007:
というエラーがでてコンパイルできなくなりました。
誰か対策方法教えてください〜。お願いします。
0052デフォルトの名無しさん
NGNG0053デフォルトの名無しさん
NGNG0054デフォルトの名無しさん
NGNG欝山車脳。
0055デフォルトの名無しさん
NGNGとはいえ、鬱だ。
0056デフォルトの名無しさん
NGNGとは言え少々欝だ
0057デフォルトの名無しさん
NGNG0058デフォルトの名無しさん
NGNG構造体もポインタも使えるし。
0059デフォルトの名無しさん
NGNG> 整数型から文字型、文字型から整数型へ簡単に変換する方法はないでしょうか?
READ文、WRITE文を使えばOK。
こんな感じ
READ(INUM, 'I4', CNUM)
でいいと思った。(しばらく、FORTRAN使ってないので、細かいところで
間違っている可能性あり。)
0060デフォルトの名無しさん
NGNG文字型=>整数型 READ(CNUM, '(I4)') INUM
整数型=>文字型 WRITE(CNUM, '(I4)') CNUM
ですかね。
0061デフォルトの名無しさん
NGNGFORTRAN サブルーチンを C(C++) から呼び出すとき、
文字列の配列はどうやって渡せば良いのでしょうか?
ええと、FORTRAN の CHARECTER C(3)*10 みたいな要素に、
C 側から放り込むやり方についてです。一応、自分でも試しました。
C++ で同じ文字列長の char 配列を複数用意し、
ポインタ配列を使って (配列*文字列) を表現したあと、
extern "C" fsub_( int& 配列数, char* 配列, int 文字列長 );
な関数宣言をしておいて、
SUBROUTINE FSUB( arr, cha )
integer arr
character cha(arr)*(*)
といった感じのサブルーチンに渡してみたのですが、
まともに動いてくれません。何故か文字化けします。
単純な一個の文字列ならうまく行ったんですけど…。
これが出来るようになると、ウチの研究室で FORTRAN を使う必要が
なくなって、非常に助かります。誰か偉いひと、ご支援ください。
ちなみに、コンパイラは g77 & g++ (2.96) on linux です。
0062デフォルトの名無しさん
NGNG0063デフォルトの名無しさん
NGNG文字1個で上手くいくならループを回して1文字ずつ送れば良いような。
と思ったが、ちこっと調べてみたら、
最後のNULL文字以降を殺しておくこと(NULL文字以降も一緒に送られてしまうから)
for (i = strlen(<文字列>); i >= <配列長>; i++){
<文字列>[i] = ' ';
}
とやっておく、或いは、fortran側で、
<文字列> = <文字列>(1:<配列長>-1)
とやるか。
> これが出来るようになると、ウチの研究室で FORTRAN を使う必要が
> なくなって、非常に助かります。誰か偉いひと、ご支援ください。
fortran使いがまた減るのか・・・
006461
NGNGポインタ配列×文字列なんぞ使ってたのが悪かったわけで、
素直に char c[3][5]; とか宣言したらすんなり動きました。
>63
Cでメインルーチン組んだ方が応用ききますからねえ。
でも、細々としたところでは、まだ頼る必要があります。
0065のと
NGNG具体的な条件は以下のとおりです。
1.VisualFortran6.6(最新)付属のコマンドプロンプト上では動かない。
2.VisualFortran6.6のデバッカつきのもので動かすとちゃんと走る。
3.VisualFortran(バージョン97)では付属のコマンドプロンプトでも動く。
というものです。ちなみに1の動かないところでは「MATH〜」とエラーメッセージが出ます。
ですので、0割りなどが考えられるのですがそれならば2、3のケースでも動かないはずですよね?
ということで本当によくわかりません。
どなたかわかる方がいましたら教えてください。
抜け落ちている情報がありましたら指摘していただければすぐに書きます。
> 抜け落ちている情報がありましたら指摘していただければすぐに書きます。
「エラーメッセージは正確に」って、さっき言われたでしょ?
0067のと
NGNGrun-time error M6201: MATH
- exp: DOMAIN error
Image PC Routine Line Source
pipe.exe 00430649 Unknown Unknown Unknown
pipe.exe 004304A7 Unknown Unknown Unknown
pipe.exe 00430601 Unknown Unknown Unknown
pipe.exe 00432998 Unknown Unknown Unknown
pipe.exe 0043240E Unknown Unknown Unknown
pipe.exe 00458AEC Unknown Unknown Unknown
pipe.exe 00452BE8 Unknown Unknown Unknown
pipe.exe 0042B919 Unknown Unknown Unknown
pipe.exe 00401672 Unknown Unknown Unknown
pipe.exe 0045C869 Unknown Unknown Unknown
pipe.exe 0044DCC4 Unknown Unknown Unknown
KERNEL32.dll 77E5D326 Unknown Unknown Unknown
0068デフォルトの名無しさん
NGNGおそらくそんなに早くは実のあるレスがつかないと思われるので
気長に待ちなされ。
0069のと
NGNGはい、わかりました。
0070デフォルトの名無しさん
NGNG> run-time error M6201: MATH
> - exp: DOMAIN error
は、exp() のドメイン (引数の有効範囲) を逸脱したってことだから、
exp() の引数がおかしくなってると思う。 (でも、マイナス方向は -∞ まで、
行っても大丈夫だし、プラス方向はオーバーフローエラーになるような気がする
が...。初期か忘れとかで浮動小数点として認識できないような値なんだろう
か ?)
とりあえず、問題の行は 00430649 番地にあるから、それを見直してみれば ?
(MAP ファイルの出し方と見方はわかるかな ?)
0071のと
NGNGレスありがとうございます。
MAPファイルってぜんぜんわからないんですよね。。。
VisualFortran特有のものですか?
007270
NGNGごめんよ、俺は VisualFortran つー奴は使ったこと無いので、ヘルプ
ファイルしか読んでないんだけど、Project Settings の Fortran タブ
のRun Time カテゴリにある Generate Traceback Information を
チェックしてビルドしてみてちょうだい。これで現象が再現したら、
トレースバック情報が...
forrtl: severe (24): end-of-file during read, unit 10, file ...
Image PC Routine Line Source
teof.exe 004011A9 AGAIN 21 teof.for
teof.exe 004010DD GO 15 teof.for
teof.exe 004010A7 WE 11 teof.for
teof.exe 00401071 HERE 7 teof.for
teof.exe 00401035 TEOF 3 teof.for
teof.exe 004013D9 Unknown Unknown Unknown
teof.exe 004012DF Unknown Unknown Unknown
KERNEL32.dll 77F1B304 Unknown Unknown Unknown
と言うようにでるから、エラーメッセージのすぐ下の行の LineNo が問題
の行です。
これで再現しないなら、さっきチェックした Generate Traceback
Information のチェックボックスをクリアして、今度は同じ Fortran
タブの その他 カテゴリにある Generate Link Map チェックボックスを
チェックしてビルドしてね。そうすると、pipe.map (この名前が嫌なら、
Link タブの Debug カテゴリの Mapfile Name テキストボックスに好き
な名前を入れれば変更できます。) って言うファイルが作られます。
それには、関数の名前と開始アドレスが載ってるから問題の関数までは
これでわかる。(念のため再度実行して、エラーのアドレスを再確認のこ
と。) その関数に複数の exp() が使われてるなら、ヘルプで
/MAPINFO:LINENO を調べて、それを指定する。そうすると MAP ファイル
に行番号毎のアドレスが出力される。
> MAPファイルってぜんぜんわからないんですよね。。。
> VisualFortran特有のものですか?
MAP ファイル自体は、一般的な用語。コードとか、グローバル変数なんか
がどの番地に配置されているかの対応表のこと。
0073デフォルトの名無しさん
NGNGC言語で言うところの matherr.h みたく、
浮動小数点例外をハンドリングするルーチンってFortranで書けなかったっけ(処理系依存 or IEEE規格)?
C言語なら、浮動小数点例外の発生したオペレーション名と引数(最大2つ)を構造体で取れるので、
forrtl: DOMAIN error: exp(NaN) (NaN = 0xffffffffffffffff)
みたいな表示をする事も可能だよ。
つうか、デバッガーの上で走らせる...と問題なく動くんだっけ(汗
007473 (横に逸れますが)
NGNG浮動小数点例外(やその他のエラー)を、人間様が判る形で表示する方法が
解説されてると思うよ。
#ちなみにIBM 5550の MS-Fortran 1.0のエラーハンドラーは、関数呼び出しタイプが _pascal だったような(汗
# i80286時代の標準言語って、pascal〜ADAだったんだよねー (遠い目
しかし、>>72の end-of-file during read って懐かしー。
FortranのREADって(Cのと同じく)トラブルのスクツだよねー。
Kernighan & Plauger が RATFORで Cモガキやったのもむべなるかな。
007570
NGNGまあ、どんな言語でもそうだよね。つーか、人間でも言葉喋るより聞く方が難し
いよね。出力は、(大体) 自分の思うとおりできるけど、入力は相手次第だから
ねぇ。
ところで、のと の問題は解決したのかなぁ。
0076のと
NGNGレス遅れてごめんなさい。
ちょっと忙しかったのでまだ言われたとおりにやってみていません。
でも、アドバイスありがとう。
もうすぐやるつもりです。
0077のと
NGNGやってみました。
VisualFortranをさわったことないのに調べていただいて
ありがとうございます。
Generate Traceback Informationをチェックして〜というのは、
はじめにも書きましたがデバッカモードでやらせるとプログラムは
問題なく走るので原因究明にはなりませんでした。
Generate Link Map チェックボックスを チェックして〜というのは
その他のタブ、が見つけられなかった(日本語はないと思うのですが)ので、
やれませんでした。
しかし、いずれにせよこのケースは上のようにプログラムは走ってしまうと
思います。
走らないのは付属のMSDOSプロンプトを使ったときだけなので。
007870
NGNG> デバッカモードでやらせるとプログラムは問題なく走るので原因究明に
> はなりませんでした。
使ってないんでよくわからないけど、「Generate Traceback
Informationをチェックして」作った実行ファイルを「付属のMSDOSプロン
プト」で実行できないの ?
> その他のタブ、が見つけられなかった
う〜〜〜ん、ヘルプファイルにははっきり「その他」って書いてあるんだ
よなァ...。俺も変だとは思ったんだけどね。じゃあ Others とか
Miscellaneous とか言うカテゴリはないの ?
> しかし、いずれにせよこのケースは上のようにプログラムは走ってしま
> うと思います。
基本的にそんなことはない。Generate Link Map と言うのは、あくまでも
MAP ファイルを作るだけで、実行ファイルは同じものができる。
極端な話、他のオプションが変わってないなら、MAP ファイルだけ作って
00430649 がどの関数か当たりをつけると言うこともできるはず。
とりあえず Generate Link Map がわからないであれば、Project
Options: って言う所 (/include "Release" とかいっぱい書いてあると
ころ) の最後に /MAP /MAPINFO:LINES を入れてビルドし直してみて。
0079不器用ですから...
NGNGPowerFortran使った事ありませんが... (MS-Fortranだったもので)
>run-time error M6201: MATH
>- exp: DOMAIN error
>Image PC Routine Line Source
てのが、デバッガーでは出ないつうのは、
デバッガーでは例外検出しないモードか、
あるいは例外検出しても計算続行するモードになってるんじゃないのかなー?
0080のと
NGNGやってみました。
>使ってないんでよくわからないけど、「Generate Traceback
>Informationをチェックして」作った実行ファイルを「付属のMSDOSプロン
>プト」で実行できないの ?
ナイスアイデアですね!
というか当たり前なのでしょうか?
しかし、実際やってみると不思議なことにexeファイルを作らずに
やってしまうみたいです。デバッカモードは。
なので、DOS窓で/tracebackというコンパイルオプションをつけて
やってみました。
すると以下のようになりました。
run-time error M6201: MATH
- exp: DOMAIN error
Image PC Routine Line Source
pipe.exe 00430A69 Unknown Unknown Unknown
pipe.exe 004308C7 Unknown Unknown Unknown
pipe.exe 00430A21 Unknown Unknown Unknown
pipe.exe 00432DB8 Unknown Unknown Unknown
pipe.exe 0043282E Unknown Unknown Unknown
pipe.exe 00458F0C Unknown Unknown Unknown
pipe.exe 00453008 Unknown Unknown Unknown
pipe.exe 0042BD39 Unknown Unknown Unknown
pipe.exe 0040D64E SMGSGS 2966 pipe.f
pipe.exe 00401672 MAIN 139 pipe.f
pipe.exe 0045CC89 Unknown Unknown Unknown
pipe.exe 0044E0E4 Unknown Unknown Unknown
KERNEL32.dll 77E5D326 Unknown Unknown Unknown
この139行目はサブルーチンSMGSGSをCALLしているところで、2966は
CF=1.D0-EXP(-YP/26.5D0)
というコードになっています(すみません、すべては見せられないので)。
たしかにEXPが使われているところで、あやしいのですがEXPは引数が0でも
問題ありませんし、ここでエラーになる要素がないような気がするのですが…。
0081デフォルトの名無しさん
NGNG008270
NGNGとりあえず、その直前で YP (実数型だよね) の値を出力してみたら ?
> ここでエラーになる要素がないような気がするのですが…。
>>70 にも書いたけど、確かに exp() の定義域は -∞〜+∞ だから DOMAIN
error になるのは、YP がおかしいような気がする。
> DOS窓で/tracebackというコンパイルオプションをつけてやってみました。
よくわからんのだけど、DOS 窓でコンパイルしないとだめと言うことか ?
0083デフォルトの名無しさん
NGNG0084デフォルトの名無しさん
NGNG008584
NGNG0086のと
NGNGYPの値はNahでした。
それだとEXPはだめなんですかね。
ただいまどこからNahが出てくるのか探しています。
83さんのコメントが気になるのですが本当ですか?
0087デフォルトの名無しさん
NGNG最高レベルの最適化をするとコードが動かないこと多し。
0088のと
NGNGコンパイルするときにレベル、というのは決定するのですか?
0089デフォルトの名無しさん
NGNG0090デフォルトの名無しさん
NGNGvisualFortranのhelp探してるんだが、それらしきのが出てこない。
同じ定数をいろんな関数の中で使ってるのだが、桁数が多くて
間違いの元になりそうだから、#defineで定義できれば楽になると思ったんですが。
それとFortranって変数に数値ぶち込むときdoubleだったらいちいち
1.d0とかやらないとだめなんですね。cだったら単に1でいいのに。
型チェックがきびしいんでしょうか。
0091デフォルトの名無しさん
NGNGNah ? Nan (Not a Number) じゃなくて ? どういう値なんだろうか...。
まあ、地道に追っていくしかないかな。頑張ってね。
>>87
そうそう、最適化するとお前みたいなへたれの書いたプログラムは動かんことが
多いよね。
>>90
数値定数でいいんなら、PARAMETER 文でいいと思うけど。
0092デフォルトの名無しさん
NGNG>数値定数でいいんなら、PARAMETER 文でいいと思うけど。
んで、複数ファイルに同じパラメータ書くのは冗長だから、
パラメータは共通ファイルに書いといて、
!include ディレクティブとか #include で取り込みたいものですね。
c んで、UNIXのF77で fppとかcppとかm4とかsedとか使ってプリプロセスしてやると、
c F77爺に「処理系依存するソースコード書くなゴラァ」とか怒られる罠。
c F77爺って、一体この25年間ナニやってたのか、25分程問い詰めてみたい気分
0094デフォルトの名無しさん
NGNG0095デフォルトの名無しさん
NGNGFortranでもこんなことできるんですね。
昔のF77fortranに比べたらf90って、いろんなほしいなって思った
ものが実装されてるんですね。
なんだかC,C++のまねのような気もしますけど。
0096素人
NGNGインクルード文も一緒にコンパイルするんですか?
0097デフォルトの名無しさん
NGNGコンパイラへの命令みたいなものじゃないでしょうか。
0098素人
NGNGすんません,展開するってのはプログラムファイルが入っている
フォルダに入れる ってことでいいんでしょうか?
0099のと
NGNG解決、までには至ってないですが、エラーの原因はつきとめました。
結局、アルゴリズムが悪かったようです。
Aという倍精度の実数をIF文で0の場合をはじいておいても、
A=AQRT(A)
とするとどうやらA=0となってしまうことがあるようです。
なので、そのあとでB/Aをすると0割りによりNanになるみたいです。
0割りを防ぐにはどのようにIF文などをつければいいのでしょうか?
案があれば聞かせてください。
0100デフォルトの名無しさん
NGNG0101のと
NGNG打ち間違えました…。
■ このスレッドは過去ログ倉庫に格納されています