くだすれFORTRAN(超初心者用)その6
■ このスレッドは過去ログ倉庫に格納されています
このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用)その5 http://toro.2ch.net/test/read.cgi/tech/1269704830/ ●過去スレ くだすれFORTRAN(超初心者用)その4 http://pc12.2ch.net/test/read.cgi/tech/1232789521/ くだすれFORTRAN(超初心者用)その3 http://pc11.2ch.net/test/read.cgi/tech/1196384126/ くだすれFORTRAN(超初心者用)その2 http://pc11.2ch.net/test/read.cgi/tech/1164121236/ くだすれFORTRAN(超初心者用) http://pc8.2ch.net/test/read.cgi/tech/1138063703/ 試しにgfortran4.9でrandom_seed(size=i)(iはinteger)を実行したらi=12だった つまりgfortranの場合はputの引数が大きさ12以上の1次元整数配列でなければならない (/c*999/)は大きさ1の1次元配列で、その値がc*999という意味だからエラーになる >>682 ありがとうございます ググれと言いながら教えていただいた優しさに感謝します 使わせていただきます >>685 丁寧な説明ありがとうございます。 cを配列にすると上あるシステムクロックのcountの取得のところでエラーが出てと堂々めぐりをしてましたが、シードが12の配列でも要素一つ変えれば乱数にはなるということなんですね。 スラッシュが配列を表しているとは気づきませんでした。勉強になります。 LU分解のサブルーチンが作れません(ToT) サンプルがあったらください… >>688 検索して、それっぽいのが出てきたんですがメインプログラムに噛ませてもうまくいきませんでした… MacOSX10.10.1, gfortran4.9にてコンパイル後、実行時に発生する下記のエラーの解決策はあるのでしょうか? At line 68 of file test.f90 (unit = 1, file = 'parameter.txt') Fortran runtime error: Cannot match namelist object name 44 namelistの不一致は見当たらず、Windows7, g95では正常に動作しました。 計算流体力学を習い初めの学生なんですが、Radeonでfortranの計算をする場合にはどのソフトをインストールすればいいのでしょうか? MinGW Command PromptとTDM-GCC-64というのを使っています。 出来ればインストール方法が書かれたページも一緒に知りたいです。 open文で開いたcsvファイルをread(51,*)〜〜などで 読み込む操作が何回かある場合、 並列化はできたりしないでしょうか 読み書きはやっぱり並列化は無理でしょうか 『if … else if … end if』と『select case …』はどっちが速いのか,ふと思って計測してみた. cygwin gcc 4.8.3@core-i5で繰り返し計測してみたけど,時間差はばらつきの範囲内で有意な差はなさそうな感じ. 二つの構文ともCPU時間同じ,機能も同じで,いまいち,使い分け方が分からないんだよねぇ... 使ったコードはこれ↓ module mod_util implicit none integer(kind=4) :: t1, t2, t_rate, t_max, t_diff contains real(8) function elapsedTime() implicit none call SYSTEM_CLOCK(t2, t_rate, t_max) if ( t2 < t1 ) then t_diff = t_max - t1 + t2 else t_diff = t2 - t1 endif elapsedTime = t_diff/real(t_rate) end function elapsedTime end module mod_util program testSelectIf use mod_util, only : t1, elapsedTime implicit none real (kind=8) :: randX integer(kind=4) :: i, j, randI #ifdef ifelse write(*,'("# if ... else if ... ")') #else write(*,'("# select case")') #endif call init_randomSeed(972384) call SYSTEM_CLOCK(t1) do i = 1, 100000000 call random_number(randX) randI = int( randX * 10, kind=4 ) #ifdef ifelse if ( randI == 1 ) then; j = j + 1 else if ( randI == 2 ) then; j = j - 2 else if ( randI == 3 ) then; j = j + 3 else if ( randI == 4 ) then; j = j - 4 else if ( randI == 5 ) then; j = j + 5 else if ( randI == 6 ) then; j = j - 6 else if ( randI == 7 ) then; j = j + 7 else if ( randI == 8 ) then; j = j - 8 else if ( randI == 9 ) then; j = j + 9 else if ( randI ==10 ) then; j = j - 10 end if #else select case (randI) case ( 1 ); j = j + 1 case ( 2 ); j = j - 2 case ( 3 ); j = j + 3 case ( 4 ); j = j - 4 case ( 5 ); j = j + 5 case ( 6 ); j = j - 6 case ( 7 ); j = j + 7 case ( 8 ); j = j - 8 case ( 9 ); j = j + 9 case ( 10 ); j = j - 10 end select #endif end do write(*,'("j=",I0)') j write(*,'("#time:", F10.3)') elapsedTime() end program testSelectIf >>693 I/O中に計算とかしたいという意味での並列化なら、F2003でasynchronous I/Oが出来る ようになった。同じファイルの別々の位置のデータを並列に読み出したいという意味なら そもそもハードウェア的に無理だろう。 >>694 最適化の問題というより、計算型GOTOの後継機能といったものではないか? 構造化プログラミングがホットだった時代は、GOTO 文を追放するための基本構造 のひとつとされていた気がする。 CASE文の中に入るのが、整数型、文字型、論理型のように離散値をとる場合に 限られるので、IF..ELSE IFの連鎖との使い分けは、比較で=が意味を持つ型か 或いは実数型などのように=があったとしても基本的に<、>的な大小比較しか 意味を持たない場合を、意識して明示的に区別していますよというアピールではないか。 >>697 明快なお答えありがとうございます. これまでうっすらと使い分けルールの必要性を感じながらも, 「きっとこれで良いよね?良いんだよね?」と恐る恐る使い分けていました.少し安心しました. >>697 ありがとうございます やりたかったことはcsvファイルがいくつかあり、 それを順番に読み込みreadするdoループを並列化できないかなということでした 教えていただいた後者の方にあたりそうな気がしまして、 勉強になりました。 永らくFORTRAN77で飯を食ってたのですが,より新しいFORTRANへ移行してみたくなりました なにか良書はありましょうか? 職業プログラマで社内で請負で流体や構造体のメッシャーを組んでます まあ,ベースのプログラムも77,新規も77縛りの事が多いので特に困ってはないのです しかし,昔,汎用機世代の6しか書けないような先輩方を古臭いと笑っていたのですが自分もそんな年になってしまい 後輩らに笑われたくないので,ちょっと勉強しておきたいと考えています 世の90の初心本(それ以降は書店でも見ないなー)等は基本的な制御構文等が厚く書かれており ホントに身に着けたい新たな概念のintent等がおざなりになってしまっています 古臭い77書きに光を...... #C++もやってるのでクラスの概念なんかも問題はありません 日本語の書籍に関しては仰る通りで、特に2003以降は全くないはず まずはnagのサイトにあるFortran入門とFortran 2003入門が無難かと ただ、これらは規格を網羅してるわけではないので 完全な仕様を知りたい場合はコンパイラのマニュアルや JIS規格(JIS X 3001-1:2009)も参照する必要あり >694 selectは単一の変数でしか使えないよ selectはどうかするとジャンプテーブルで一発の比較で処理してくれる可能性が高い 最近のコンパイラはelseifでもそうするとか聞くけど,どうだろうね? elseifは良く引っかかるのを前に持って来て早めに引っ掛ける事ができるとかも聞くねー 個人的には,読みやすさを優先するなー #Cのswitchの議論と同じなので探してみると良いよ ありがとうございます まずはサイトのそれらを読んでみます その後は......JISかー,読みやすさを優先してくれないからなー コンパイラのマニュアルは殆ど英語になるのが悲しい >700,703 Fortran90の日本語の解説本で良いなら、 bit別冊 詳解Fortran90 1993年12月号別冊 共立出版 という本があります。これは『Fortran90 Explained』の日本語訳です。 但し、雑誌の別冊ということもあり入手は極めて困難でしょう。 あるとすれば、理工系の大学図書館が一番可能性が高いと思います。 参考までにどうぞ。 Fortranを使われている方は他にはどんな言語を扱っているのですか? pythonとかでしょうか >>700 おいらもFORTRAN77使いなんで、小文字のプログラムに違和感ありまくり >>707 こっちはfortran90からの新参なんで、77のソース見ると大文字、goto文ありでなかなか新鮮です。 ところでfortran2003の機能すべてカバーしてるコンパイラは商用しかないのかな。 gfortran使いなんでカナピー(´・_・`) 商用だけですな しかし商用Fortranコンパイラは趣味で買うには高すぎるので gfortranが対応してる範囲で書いてます >>708 Linuxならifortのnon-commercial板、MacならFreePGIがあるけど Windowsは無いみたいだね。 >>710 変換ミス (誤)non-commercial板 (正)non-commercial版 gfortranの2003フルサポートは何時になるのやら。 >>710 勉強用なら VirtualBox(個人使用は無料だったハズ) + Ubuntu日本語Remix仮想ハードディスクイメージ で、とりあえずLinux環境作っちゃうのも手なんかね …もちろん、LinuxやBSDに詳しい人にはこの構成では不満が出てくるだろうが (特にUbuntuの標準GUI、嫌いな人結構多いしな) 知らん人がサクッとUnix系の環境作るには楽だと思った >>712 >VirtualBox(個人使用は無料だったハズ) + Ubuntu日本語Remix仮想ハードディスクイメージ >で、とりあえずLinux環境作っちゃうのも手なんかね Fortranの勉強のためならこれが正解だと思う。わざわざLinux用の領域をハードディスク上に 確保して…というのは面倒だしね。自分も次は仮想マシンを使うと思う。 UbuntuのGUIが気に入らない場合は、VirtualBoxにインストールできるか知らないけれど、 RHELクローンやOpenSUSEもあることだし。 VirtualBoxに入れるLinuxなんて、GUI抜きで容量減らしてインストールして sshでもっと使い易い端末エミュレーターから操作するのが普通じゃないか >>714 もちろんそれが理想的だし、解ってりゃ大したことないんだけどね でも最近の Linux intel fortran も windows と同じ GUI でインストールできる ようになってるし〜 楽ちんしたいのよ〜 ifortやgfortranのオプションについて教えてください. Makefileを書くとき,コンパイルオプションやリンクオプションをCFLAGSとLDFLAGSに分けて書くのが一般的みたいですが, Intel Fortranコンパイラのユーザー・リファレンス・ガイドやgfortran/gccのマニュアルを読んでも, どのオプションがコンパイルオプションで,どれがリンクオプションか明記されていませんよね? コンパイラとリンカに与えるべきオプションは,それぞれ,どうやって見分けたら良いんでしょうか? intel fortranの非商用版終了したっぽいな >>722 確かに研究用途で無償版使われているって書いてるな すみません。本読んだりGoogle等で調べましたが、いまいちわからなかったので質問させてください。 result.datというデータの中にある本来17行21列で表示するデータが #(A,B) (1,0) ・ ・ ・ (17,0) (0,1) ・ ・ ・ (17,1) (0,2) ・ ・ ・ (17,2) ・ ・ ・ (17,20) というように1列で表示されているデータがあります。 openを使ってこれを読み込んで本来の17行21列の形にして別のデータとして出力したいのですが、 どなたか知恵をお貸しいただけませんか?またできればデータの(A,B)のAの部分だけ、Bの部分だけを取り出したいのですが、 どうすればよいのでしょうか? >>725 すみません。過去すれにあるのですか? ざっとしか見てなかったので気づいてませんでした。 もう一度探してみます。 cosやexpとかの組み込み関数が学校のifortだと通るんだけど家のgfortranだと通らない助けて no implicit typeって言われる >>728 その関数に渡す実引数の宣言で処理系依存の型パラメータを使っているとか? ソースを晒せば適切な助言を受けられると思う。 4倍精度から倍精度にしたら実行できました gcc4.6以降は4倍もサポートしてるそうなんですがおかしいですね… ありがとうございました >728 fortran 4.8.1 で program test real(16) :: D2R D2R = 0.0174532925199432957692369076848861271344_16 write(*, *) '1/e= ',1/exp(1.0_16) write(*,*) 'cos(30)= ',cos(30.0*D2R) end program test を実行すると 1/e= 0.367879441171442321595523770161460873 cos(30)= 0.866025403784438646763723170752936161 という答えが得られます 少なくとも30桁以上の精度がでているとおもいますが、 >731 >fortran 4.8.1 は gfortran 4.8.1 のtypoです。しつれいしました。 >>730 もう解決しているかも知れないけれど、処理系がFortran2008と4倍精度をサポートしていれば iso_fortran_envモジュールのreal128という定数を使う言語仕様に準拠した方法がある。 program qfloat use iso_fortran_env implicit none real(kind = real128) :: q q = 1 / exp(1.0_real128) print *, q end program qfloat 超初心者です。質問させていただきます。 forrtl:severe(24): end-of-file during read,unit 110,file C:tkshmd\www01.dat というエラーが出たのですがどうすれば解決できますか? 教授から卒業研究用に渡されたもので、自分で書いたものではありません 11年前に卒業した先輩が書いたものらしいのです fortranに関する知識は一切ございません。すみません >>734 どんな環境なのか、OSとコンパイラくらい書こうよ。 エラーメッセージによるとwww01.datの途中に ファイルの終端を表すend-of-fileが挿入されているっぽいが。 >>734 データの読み込み中にEOFが来た つまり、読み込む変数に対してファイルのデータ数が足りない 先ずは実行できるデータファイルを貰って 自分の環境でプログラムが動くことを確認したら? 自分の計算はその実行できるファイルをいじってする 何より教授に聞けよ >>734 736で解決すると思ったけど フォルダアドレス名、もしかして名前の母音抜き? 違ったらごめんね もしそうだったとしたら、今後フォルダ名の投稿の時とか気をつけてね 私、昔似たようなことやっちゃったので。 関係ないが気になったのでつい ちょいとみなさんのお知恵拝借させてもらえたら幸い。 二分法かなんか使ってイテレーションさせようかと思ってるんだけど、ある解に収束するまでの途中のデータが出力ファイルに書き込まれて困ってる。 収束した時のみの結果を出力させたいんだけどどうしたもんだろ? すごく簡略化した例だけど do i = 1, imax .... ! F(x(i),y(i),z(i)) は非線形で数値計算でその都度計算するしかない F(x(i),y(i),z(i))= ......... write(15,*) x(i),y(i),z(i) ! イテレーションする部分 If(s(x(i),y(i),z(i)) < 1.0d-5) then Exit Else .... Endif Enddo 連投すんません S(x(i),y(i),z(i))は新しい関数ですm(__)m よろしくお願い申し上げます。 求めた解はどこかで使うんでしょ?なら,使う直前にwrite文を書けばいいのではないか? というか, >二分法かなんか 『なんか』ってなんだ?そんなきき方でどう答えろというんだろうか? その例の書き方だと,そもそも二分法の使い方を理解しているのかと,そっちの方が心配になる. >>741 すまん!書き方悪かった。 「なんか」と書いたのは二分法等イテレーションする場合と言いたかった。 debugをしたら user breakpoint called from code at 0x7c94120e と出てきたのですが、どういった意味なんでしょうか 環境書こうよ…… まず、>>1 の注意事項を読んでくれ >>743 デバッガがプログラムを呼び出して実行してブレークポイントに到達して止まった つまり意図通り ブレークポイントを誰がどうやって設置したかは環境次第 Rの関数(cor(x,y)など)をFortranプログラム上で使えるようにできないでしょうか Rに入っている関数のsoファイルを利用してなどできたりしないでしょうか >>749 あなたは Fortran ではなく R を使うべきなのではないのでしょうか Rがコマンドから使えるなら普通にSYSTEMすればいいんじゃないの >>750-751 事情がありFortranで組む必要があったので仕方なく・・ ありがとうざいました そもそもFORTRANにはRなんか手も足もでないような統計ライブラリが存在するはずだが >>753 IMSLかMKLの統計サマリーですかね? 使いたいのは比較的新しめの統計量で、 そこには用意されていないけどRにはあったので・・ 相関係数求めるだけだろ? http://tama.green.gifu-u.ac.jp/ ~tama/soft/sample_prog/correlation/ 今更ながらなんだがフォートランとオクターブの組み合わせ最高だよな。 今まではfortran とgnuplot だったけど オクターブってMATLABのパチモンだっけ? 最近もメンテされてるの? >>757 余裕でお絵描きできるよ。 お絵描き機能は gnuplot のを踏襲してるぽ >>758 まだまだ現役 お絵かきとは2chのお絵かき機能のこと。 この板はできないのか? 3/3から2chのapi始動するけど移住しなくても大丈夫かね とりあえずdat廃止されるまではここはNavi2chで巡回するけど とりあえずおーぷん2chにたてるだけたてといた http://toro.open ☆2ch.net/test/read.cgi/tech/1425031440/ (☆はNGワード対策) 何事もないことが一番だけどそんときは避難所代わりに使ってください 現に今人多杉状態だけど ここ質問スレだけど他にfortranスレないしfortran全般に関する喋り場ならおーぷんでいいよね?転載嫌いとかアフィリエイト嫌いとかのひとがいたらすまんが 純粋な質問に関してはstackoverflow日本語版も始まったしそっちも賑わってほしいなあと思ってる(現在3件しかない) 本家stackoverflowの方はfortranに関してもかなりお世話になってるし お若い方。 この世間に疎い爺に何が起きているのか3行くらいで教えてくれんかね? カチュ〜シャが使えなくなってから専ブラともお別れじゃよアッハッハ 2chがたらこのものでなくなったらしい話は風のうわさに聞いたども、 移住とは何のことじゃね? >>763 おーぷん2chは知らなかった。何かあればそちらを使わせてもらいます。 stackoverflowの方はgoogleでの検索がヒットした時ぐらいしか行かなかったけれど、 日本語版はありがたいね。こちらも覗きに行きます。 >>764 私もよく知らないが、現在の専ブラが使っているdatが廃止される。2chを専ブラで利用するためには 2chが提供するAPIが必須となるが、このAPIは2chから使用許諾を受ける必要がある。 よって今のようなオープンソースの専ブラの開発、提供は難しいようだ。 >>492 私も見たいと思ったのですが… 該当章はなくなってしまったようですね. (もう8か月以上だから仕方ないか) おいおいTip集に分離されただけで記事は残ってるぞ nagのトップページから見てみ Hey!Yo!Brother! Fortran2003でOOPを勉強してみたいんだが、NAGしか入門する門は無いのかい? ジーザスは狭き門より入れと言ったが、おじちゃんは滅びの道でもいいから 広き門から入って太い道を通りたいんだYo! できればジーザスの言葉と同じアラム語かおじちゃんと同じ言葉の日本語で頼むよ! 敵性語はノンノン! >>784 ああ、それは腹立つな Fortran Graphic、Fortran OpenGLで検索するとそこそこ出てくる けど、まともにメンテナンスされてるのが無さげでもある…… プログラム中のx行目?y行目のソースコードを出力させるwrite文の書き方はないでしょうか >>771 プログラム単体では無理 単純に任意のファイルのx行目を表示するプログラムなら簡単 指定行まで読み飛ばして、指定行を十分長い文字列で読み込めば良い それでソースファイルを読んで表示するならできるけど ソースファイルは常に必要 >>773 なるほどopenして目的行寸前まで空readしてread×行数すればいいということですね 解決できそうです。ありがとうございました >>774 初めて聞きました。勉強になりました 3次元のスカラーデータを吐く、x,y,zのdoループをompにしようとしたんだけど、スタックオーバーフローだなんて怒られた どーすんべ? 安直にはコンパイラ、リンカのオプションでスタック増やせ。 MinGWのGCC4.9.2ののFORTRANで, -fcase-upperのようなオプションってありますかね? 昔のバージョンにはあったみたいなんですが, 現在のは削除されたようで. Gfortran とIntel fortran のそれぞれの利点って何かね( ´ ▽ ` )ノ え、gfortranに利点なんかあるの? ああ、うん、gccツールチェインの一部なのは便利だよね ハードウェアで二倍の性能出す金払うくらいだったら、Intelのコンパイラ買えよ。 ソフトには金出せないってどんだけ唯物論のアカなんだよw >>784 10年くらい前は差は歴然としてました。 最近はどうなのでしょうね? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる