1 名前:デフォルトの名無しさん [2006/11/22(水) 00:00:36 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 FORTRAN使いが優しくコメントを返しますが、 お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。 ●注意事項 ・質問する前にGoogle等の検索サイトで検索しましょう。 ・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。 ・エラーの場合は起きた状況、環境(OS・コンパイラ)、エラーメッセージも詳しく書きましょう。 ●前スレ くだすれFORTRAN(超初心者用) pc8.2ch.net/test/read.cgi/tech/1138063703/ ●関連スレ FORTRAN W pc8.2ch.net/test/read.cgi/tech/1163319215/
321 名前:デフォルトの名無しさん [2007/03/05(月) 00:06:07 ] >>317 一桁目は歴史的な理由から予約されていることが多い。 処理系によっては90番台も予約されていたりする。 特に理由が無ければ避けるのがよろし。 >>320 たしか、77の規格には無かったはず。 EXPを使って解け。
322 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 00:44:52 ] >>320 こんなとき(だけ)役に立つ、岩波FORTRAN辞典〜♪ によるとFORTRAN77でもSQRTの引数複素数時の個別名はCSQRTだ。よかったな。 だが、総称名使え。
323 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 06:01:36 ] >>321 一桁目ってunit=1から9のことdふぇすか? 複素数のはびっくりした。ああなるほどっておもた。オイラーの公式だね exp(iθ)=cosθ+i sinθ >>322 ということは、たとえばD=B**2-4*A*Cという式があって、REAL Dとしているとき、 sqrt(D)を計算しようとしますよね。BとAの与え方によってはD<0となり複素数と なりますよね。そのときCSQRT(D)とすればいいのですか?
324 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 06:13:49 ] ま、あれですかね。複素数ってプログラムで扱うもんじゃないんですかね
325 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 06:51:59 ] >>323 CSQRTの引数は複素数型。 そしてFORTRANではC言語などの様に引数の型を(関数宣言に合わせて)自動変換したりはしない。
326 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 07:51:42 ] ということは あらかじめ変数宣言でCOMPLEX Dとしていて CSQRT(D)ならばありってことですか?
327 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 22:05:32 ] >>326 文法的にはあり だがまあその場合、SQRT(D)としとけば内部的にCSQRTを呼んでくれるので わざわざCSQRT(D)とする必要はないけどな。
328 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 11:59:22 ] >まぁクイズとか解いてりゃいい新型言語とは違うし かっこいいな
329 名前:デフォルトの名無しさん [2007/03/09(金) 19:51:16 ] ちょっとしつもんです。 txtファイルで 0 0.1 3.2 6.3 1 2.1 5.6 5.9 ・・・ のようにちょっとずれたテーブルがあるんすけどこれを次のようにグラフ化できるように 整理できるプログラムって作れますか? 0, 0.1 ,3. ,6.3 1, 2.1, 5.6, 5.9 ・・・ 条件は入力がtxtファイルで出力もtxtファイルかcvsファイルにするものです。
330 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 20:14:07 ] 作れるけど、わざわざ FORTRAN で作るもんでもないと思われ。
331 名前:デフォルトの名無しさん [2007/03/09(金) 20:54:43 ] >>330 おしえてくださいませんか?また、フォトラン使わないならば何を使うのか教えてください。 お願いします先生
332 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 21:29:25 ] awk がちょうどいいんでない?
333 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:38:15 ] じゃあawkで #! /bin/gawk -f BEGIN { NMAX = 4; n = 0 } { for(i=1; i<=NF; i++) { a[n++] = $i; if (n >= NMAX) { putn(a, n); n = 0; } } } END { if (n>0) printn(a, n) } function putn(a, n, i) { for(i=0; i<n-1; i++) printf("%4.1f, ", a[i]) printf("%4.1f\n", a[i]) } もっと簡単に書けるかもしれないけど、こんな感じで。
334 名前:デフォルトの名無しさん [2007/03/10(土) 11:17:50 ] awkってなんですか
335 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:35:44 ] awkは語るまい。
336 名前:デフォルトの名無しさん [2007/03/10(土) 11:56:57 ] awk というのは、加齢臭の漂うおっさんスクリプト言語。 パソコンの処理能力が上がって、データ後処理がパソコンで実用的にできるようになった頃に 流行っていたスクリプト言語がawkだった。あの頃はperlも何も無かった。 大型計算機のFORTRAN出力をパソコンに落として、awkで整形処理、xyプロットソフトで描く。 という流れが80年代末から90年代初頭に流行った。 そういうわけでロートルはawkが使える。
337 名前:デフォルトの名無しさん [2007/03/10(土) 13:10:53 ] じゃぴったりなわけだ。 awkってコマンドプロンプトさえあればできるんですよね?
338 名前:デフォルトの名無しさん [2007/03/10(土) 14:16:18 ] "フォトラン"ってなんかカワイイ
339 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 16:11:24 ] フォトラン20 平成20年バジョン
340 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 17:24:56 ] >>337 基本的にコマンドラインでスクリプト・ファイルを指定したり、直接コマンドを書き込んだりして使う。 Linuxには大抵、最初から入ってる。 Windows用のもググれば色々見つかる。
341 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 17:54:03 ] にゃるほどシグウィンにするかな。いろいろありがとうごzぁいましゅ
342 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 18:12:56 ] すげーすげーすげー オークすげー ここの人のおかげで先ほどのデータ並べ替えができるようになりました。 ありがとうございました。 オークの勉強もフォトランと一緒にしようとおもいます
343 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 22:35:19 ] >>329 もしFORTRANでやるならどうしますか
344 名前:@がばい佐賀 mailto:sage [2007/03/10(土) 23:17:15 ] 先ほどからしつこくてすみません。テキストデータの並べ替えを質問してAWKに感動したものです。 実はフォートランでもプログラムを組んでみました。 REAL A,B,C,D C 読み込みファイル指定(既存) OPEN(UNIT=3,FILE='data.TXT',STATUS='OLD') DO 20 I=1,4 READ(3,*) A,B,C,D WRITE(*,100) A,B,C,D C 書き出しのフォーマットを指定 100 FORMAT(F6.3,',',F6.3,',',F6.3,',',F6.3) 20 CONTINUE C 開けたファイルは閉じましょう CLOSE(UNIT=3) END こんなぐあいでやったらコンパイルはちゃんと通ってデータも並びなおしてました。 でも、ちょっと腑に落ちないところがあります。 DO文のところです。俺は、なんとなくI=1,4として「これで1行から4行まで勝手に読み込んでくれるだろ」 という乗りでやったのですが実際のどげんですか? このI=1,4はA,B,C,Dを読み込むのを4回やれということになりますか? それとも1行目から4行目までA,B,C,Dを読むのを繰り返せというような行数を表すのですか? 普通、DO文でI=なんとかとしたら 処理のところにA=A+IとかIの入った式を書いたりするじゃないですか。でもこの問題の場合 Iを処理の回数として勝手に認識してくれているのであれば私のプログラムに間違いはない ですよね
345 名前:デフォルトの名無しさん [2007/03/10(土) 23:51:46 ] >>343 AWKは最近流行らないから、本とかも無いだろ。 今更感が無きにしも非ずだがFORTRAN界では大丈夫かw PROGRAM test IMPLICIT NONE REAL :: a(4) INTEGER :: i, ip DO READ(9, *, END = 999) a WRITE(*, '(3(f10.4, ","), f10.4)') a END DO 999 STOP END PROGRAM test >>344 あぁ、もう自作したかw FORTRANでは歴史的な事情により、指定しない限りフォーマット付きI/Oでは、 入力データの空白は0として扱われる。(FORMAT文のNB/NZオプションあたりの説明嫁) しかし*での自由書式だと空白が区切り記号として解釈される。 また今の場合のようにデータが足りないと改行して読んでくれる。 大昔は容量を節約するため出力データは空白を開けないで続けて書いたりしていたw 質問の解答は『A,B,C,Dを読み込むのを4回やれ』ということになる。 ところがFORMATを指定した場合はこうはならない。 /などで明示的に改行してやらないといかん。 細部は漏れも忘れたので文法書でFortmatのところ嫁。
346 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 23:58:03 ] うわーありがとうございます!
347 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 01:04:48 ] ところでおすすめの書ありますか?
348 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 05:38:38 ] >>345 。・゚・(ノд`)・゚・。 そりゃあ流行じゃないし、数もそれほどじゃないけど絶版になってないのもあるよ オライリーのとか。
349 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 11:08:55 ] >>336 うちの研究室では awk を教えられたぞ。
350 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 13:00:33 ] ホムペじゃあまだオークを語ってるところもあるね
351 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 16:39:20 ] FORTRAN よりは若い言語だよな。
352 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 17:32:57 ] >>351 そりゃFORTRANと比べたら……
353 名前:デフォルトの名無しさん [2007/03/11(日) 18:52:48 ] どなたかご教授下さい!! FTN95とfcpadの組み合わせで使いたいのですが、 fcpadでコンパイラのパスを「C:\Program Files\Silverfrost\FTN95\ftn95.exe」 として、いざf95のソースファイルをコンパイルすると [FTN95/Win32 Ver. 5.01.0 Copyright (c) Silverfrost Ltd 1993-2006] *** Invalid executable file suffix - only .EXE is permitted と出てコンパイルできません。ファイルの拡張子を.fにしても駄目でした。 どうしたらFTN95+fcpadでコンパイルできるのでしょうか!? おとなしくplato3を使うしかないのでしょうか・・・
354 名前:デフォルトの名無しさん [2007/03/11(日) 19:26:27 ] >>353 前にも誰かが聞いていたような・・・・ まぁあのキモイ顔のプラトン使ってやれよ!
355 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 19:40:25 ] >>353 FTN95のコマンドラインの書式は > ftn95 <filename> [option [option] ...] 一方、CPad (for FTN77)がコンパイラに渡すコマンドラインの書式は > ftn95 [option [option] ...] <filename> 書式が違うのでそのままではエラーになる。 解決策としては例えば、↓の様な内容のバッチファイルを @REM --- ここから --- @shift ftn95.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 %0 @REM --- ここまで --- ftn95.exe と同じディレクトリに作成し、fcpadの「基本設定」の「コンパイラのパス(W)」に このバッチファイルを指定する。 しかし自由書式のプログラム作成とか考えるとCPad for FTN77を使うよりも 付属のplato3か他のエディタを使うことをお勧めする。
356 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 19:44:46 ] >>353 このスレの57のあたりを見直せば
357 名前:353 mailto:sage [2007/03/11(日) 23:32:50 ] >>355 さん ありがとうございます! 早速バッチファイルを作ってみましたが、結局うまくいきませんでした。 たしかにfcpadにこだわる必要はなさそうなので、vimを使ってみようと思います。 >>354 さん >>356 さん ご意見ありがとうございます! 前述の通り結局vimを使うことにしました^^;
358 名前:デフォルトの名無しさん [2007/03/16(金) 18:37:39 ] こんにちは。現在Fortranでプログラムをしているのですが、難しくててこずっています。 そこで、知恵を貸していただきたいと思い、書き込んでいます。 A=x*exp(-u*B)+y*exp(-v*B)+z*B^(-(w+1)) という関数があり、x,y,z,u,v,wは未知数で AとBはExcelのA列とB列にそれぞれデータが600与えられていて、 test.csvとして保存しています。 このx,y,z,u,v,wの未知数6個を上式の関数とA,Bの配列(?)を用いて, 収束させることによって求めたいと思っています。 ご教授お願いします。 dimension、open、write、read、doなどを使うのはなんとなく分かるのですが、 、難しくてよく分かりません。 どうぞよろしくお願いします。
359 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 20:56:50 ] salford FTN90 とPLATO3のダウンロードできる場所をおしえてくださいお
360 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 03:57:05 ] >>358 まずは問題点を切り分けよう。 ファイルの読み込みと実際の計算部分だ。 どちらならできる? 両方とも難しいかい?
361 名前:デフォルトの名無しさん [2007/03/20(火) 16:53:44 ] 質問させてください DO i=1,10 DO j=1,10 DO k=1,10 dt_den(i,j,k) = den(i,j,k) * div_vel END DO END DO END DO というコードを書いたのですが、『ランクが違うので計算できない』という旨のエラーが出ました。 「配列の一つの要素を取り出し、計算して、別の配列の要素へ代入する」 ということをやりたいのですが、どのように書けばいいのですか?
362 名前:デフォルトの名無しさん [2007/03/20(火) 21:37:08 ] Fortran77のコンパイラの選択に関する質問です。 私はこれからFortran77を学ぼうとしているところです。 利用の目的は学術的な数値の計算です。 有償、無償の様々なコンパイラがあることは調べているうちにわかりました。 しかしなにぶん右も左もわからないもので、どれが良いか決めかねています。 信頼性を重視した場合、やはり有償のものを購入する方がよいのでしょうか。 また、お勧めのコンパイラがありましたら教えていただけますと幸いです。 当方Windowsを使用しており、主な環境は以下の通りです。 OS:WindowsXP Professional CPU:Pentium D(4?) 2.8GHz Mem:1GB なお、購入の場合は5〜10万円程度の予算を考えております。 どうぞよろしくお願い致します。
363 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 21:49:54 ] !これから学ぶのに、いきなり5-10マソも出すなんてすごい!しかも77だなんて。 !どこかの研究者さんでしょうか。メモリ1GBということは、大規模な計算では !なさそうなので、無料のG95かgfortranでいい気がするのですが、どうなんでしょう? !学生の私には判断できません・・・。
364 名前:デフォルトの名無しさん mailto:sage [2007/03/20(火) 22:20:08 ] 上に同じ。 安い/無償の環境と高い環境の違いは ・開発のしやすさ ・ライブラリの有無(例:高速な数値演算ライブラリ) ・最適化の性能(=計算速度) あたりにあるので、まずはフリーのコンパイラを使ってみたらどうか。
365 名前:361 mailto:sage [2007/03/20(火) 22:37:36 ] すみません。自分で解決しました。原因は REAL(8),ALLOCATABLE :: div_vel(:,:,:) としていたことでした。正しくは REAL(8) :: div_vel でした。
366 名前:デフォルトの名無しさん [2007/03/21(水) 17:29:05 ] >>358 その式を解くとなると、 非線形の最小二乗法(または、自乗法)が 必要になります。 もちろん、FORTRANで計算可能ですが、 一からプログラムを書くとなるととっても大変だよ。
367 名前:362 mailto:sage [2007/03/21(水) 17:40:00 ] ご返信ありがとうございます。 研究に用いるため信頼性をなによりも重視しており、 予算も高めに覚悟しておりました。 有償無償の間にバグに関して差がないのであれば、 最初は無償のものを使おうと思います。 Salfordのものを使うつもりです。 相談に乗っていただきありがとうございました。
368 名前:デフォルトの名無しさん mailto:sage [2007/03/24(土) 02:02:25 ] >>367 大規模計算はスパコンで、解析は自分のPCでフリーのコンパイラだけど、 特に問題は出ていない。 少なくとも、今のところ、バグで酷い目にあったことは無いかな。 知り合いは、その昔、スパコンのコンパイラのバグで酷い目にあったそうだから、 有償/無償の差よりは、運/不運のファクターの方が大きいかも。 多くの人が使っているものを選べば、まぁ、大丈夫だと思う。 コンパイラのバグに出会ったことは無いけれど、 大規模な新型スパコンが導入されると、設定ミスが発覚したり、 ジョブ管理のシステムの挙動がおかしかったり、トラブルが続いて 落ち着いて使えるまでに少し時間がかかることもある。 数が多く出ているようなシステムは、こういうことは少ないと思うけど。
369 名前:デフォルトの名無しさん [2007/03/25(日) 13:03:53 ] >>367 金があるなら、Intel Fortran + MSVisualStudio の組み合わせでいいんじゃないの? ソフトは利用者が多い物が勝利するので、寄らば大樹の陰。 VisualStudioはアカデミックなら5,000円なので無問題。 IntelFortranは、やや高いし、毎年$200のお布施でライセンス更新をしないといけないが。 (再インストール出来なくなるだけで、使えなくなるわけではない) Linux版でよければただで使える。 バックエンドが富士通なら、富士通/Laheyのコンパイラを使うという手もある。 Fortranは未だコンパイラ市場が存在できてい牙城なので、フリーソフトを排撃してこれを守ってゆこうw
370 名前:デフォルトの名無しさん [2007/03/25(日) 15:33:39 ] すいません、初心者です。 ↓のようなデータを画面に出したいのですが 参考プログラムを教えていただけませんか? 1964/1/1 115 89 80 81 104 154 209 256 287 298 285 260 229 199 176 170 189 1964/1/2 155 111 89 81 91 124 171 227 266 293 292 274 252 221 190 174 181 1964/1/3 191 147 112 92 94 113 151 194 241 271 290 283 267 241 214 189 176 1964/1/4 222 185 147 117 101 107 134 168 208 248 274 284 274 256 233 208 185 1964/1/5 238 213 184 156 134 127 139 164 193 227 259 276 274 267 249 226 204 1964/1/6 248 234 214 190 165 151 149 161 181 206 234 257 267 266 257 243 222 1964/1/7 234 236 229 215 199 184 175 175 184 203 224 241 256 264 259 248 233 1964/1/8 216 228 234 229 221 213 203 192 190 197 210 225 239 252 258 254 243 1964/1/9 193 212 227 237 238 231 220 209 199 194 195 205 217 232 243 250 246 1964/1/10 163 181 203 226 238 243 240 229 217 205 195 196 202 215 232 245 251
371 名前:デフォルトの名無しさん mailto:sage [2007/03/25(日) 16:33:21 ] >>370 write(6,'(A)') '1964/1/1 115 89 80 81 104 154 209 256 287 298 285 &260 229 199 176 170 189' write(6,'(A)') '1964/1/2 155 111 89 81 91 124 171 227 266 293 292 &274 252 221 190 174 181' write(6,'(A)') '1964/1/3 191 147 112 92 94 113 151 194 241 271 290 & 283 267 241 214 189 176' write(6,'(A)') '1964/1/4 222 185 147 117 101 107 134 168 208 248 2 &74 284 274 256 233 208 185' write(6,'(A)') '1964/1/5 238 213 184 156 134 127 139 164 193 227 2 &59 276 274 267 249 226 204' write(6,'(A)') '1964/1/6 248 234 214 190 165 151 149 161 181 206 2 &34 257 267 266 257 243 222' write(6,'(A)') '1964/1/7 234 236 229 215 199 184 175 175 184 203 2 &24 241 256 264 259 248 233' write(6,'(A)') '1964/1/8 216 228 234 229 221 213 203 192 190 197 2 &10 225 239 252 258 254 243' write(6,'(A)') '1964/1/9 193 212 227 237 238 231 220 209 199 194 1 &95 205 217 232 243 250 246' write(6,'(A)') '1964/1/10 163 181 203 226 238 243 240 229 217 205 &195 196 202 215 232 245 251' end
372 名前:デフォルトの名無しさん [2007/03/25(日) 20:01:53 ] PROGRAM omanko IMPLICIT NONE CHARACTER (LEN = 80):: fmt INTEGER :: iy, im, id, idat(17) fmt = '(i4, 2("/", i2.0), 17i4 )' iy = 1964 im = 3 id = 24 idat = (/115, 89, 80, 81, 104, 154, 209, 256, 287, 298, 285, 260, 229, 199, 176, 170, 189/) WRITE(*, fmt) iy, im, id, idat STOP END PROGRAM omanko
373 名前:370 [2007/03/26(月) 12:12:59 ] >>371 それはDO文でやった方がいいですねw >>372 年月日のところが上手く表示できなかったので 参考にしてみます。 >>371 ,372 感謝です。
374 名前:デフォルトの名無しさん [2007/03/26(月) 20:58:14 ] plato3で作成したプログラムのエグゼファイルのアイコンをアイコンエディターでつくった アイコンに変えるにはどうしたらいいですか?
375 名前:デフォルトの名無しさん mailto:sage [2007/03/29(木) 22:11:04 ] >>374 プラトン先生はよく知らんが、リソースファイル書いてアイコン指定すれば?
376 名前:デフォルトの名無しさん [2007/04/02(月) 21:07:05 ] Fortranで何ができるのかも良くわかっていないのですが, データを出力したときにメモリーの状態はどうなっているのか? ということを教えて下さい. その内容は 「Fortranでエクセル形式データを出力させた場合,データは一度 メモリーに格納され,エクセルへ出力するのだと思っているのですが, 出力した後,メモリーは開放されるのでしょうか?」ということです. 当方の環境は, コンパイラ : fujitsu fortran77 OS : WindowsXP Professional 以上,よろしくお願いします.
377 名前:デフォルトの名無しさん [2007/04/02(月) 22:07:34 ] 死にたい
378 名前:デフォルトの名無しさん mailto:sage [2007/04/02(月) 23:09:26 ] >>376 質問の意味が不明瞭だ。 原則としては、プログラムが終了するなら、メモリーは解放される。 実行中は、静的に確保した部分は確保されたままだし、動的に確保されたものはDEALLOCATE すれば開放される。 ただしOSやコンパイラにバグがなければ。 昔のMS-PowerStationにはメモリーリーク・エラーがあって実行中にI/Oがあると、 徐々に使用メモリーが増えていった。
379 名前:デフォルトの名無しさん [2007/04/03(火) 02:15:04 ] >>377 死ぬなら中国大使館に爆弾持って特攻だ!!
380 名前:デフォルトの名無しさん mailto:sage [2007/04/03(火) 14:14:52 ] >>379 FXって言う為替取引で倍率を200倍でやると良いって、死ぬきあるなら博打をしてから詩ねってことだな
381 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 10:24:58 ] r'::::::::,:::::::::::::::::::::::\ 【USBオナホを実現させる会】に入会しませんか^^^ \::/::;;;:::::::::::::::::::::::::\ , ─ -v_;;. -─ ─ ── ─-、このオナホが実現すれば、パソコンにUSB接続して | , f-‐ ''_ .二 二二二 二._t 対応エロゲを立ち上げてペニスを挿入するだけで Y__,rYニニ -- ‐─ ──‐‐─`ー─‐-- 、画面のキャラクターが喘ぐんだよぉ♪ ,..‐Kノ,h;;::.,-rェ;ェエf7fv!Tl TiTit.、--':::::::::ノ キミの腰の動きに合わせて (:::::::::l::::ヽ.|l.|/,|l.1,!H、ト|` H┼I、l|l |l ト.-‐ ''´ わたしたちがアニメーションするの。 `,ニl:::::::::レl/!|lイh_ l|`` ,イrマ,イ| |l |レノ とっても素敵なアイテムでしょっ☆ く /|:::::::::レl.ィ!ll.l. ー‐' , kノハト,イレ:::::l / / !:::::::::|1l_l.|l.|ゝ"" (.ア ,仆!|::´:::::::| ゆっくり動かすと・・・じわじわと感じて、 └t. l l:::::::::N'::: N´ヽ`,,ーr t1リ::レ::::::::::: ! はげしく動かすと・・・失神とかもするんだよ☆ `ー弋:::::::`:::::::::ゝ ニァ@'ノ::、:::::::::::::::: ノ `ー、::::::: /:::::::,イ !ト`ヽ::ヽ:::::, ‐'´ わたしたちとバーチャルで繋がるから `ー1::::::└Ll_rー'::::::〉´ もう、即射精しちゃうよねっ☆ でも・・・USBオナホールは、まだ実現していないの・・・。 はやくみんなとエッチなことしたいなぁ・・・。 USBオナホールを実現させて次元を超えたSEXをしましょうねっ☆ 入会方法はとっても簡単。毎週1回どこかのスレに↑をコピペするだけでいいヨ♪
382 名前:デフォルトの名無しさん [2007/04/05(木) 09:23:54 ] Intel Visual Fortran9.1を使っています. Fortran90形式でプログラムを書いており, マトリックスを表示させたいのですが,これに関して質問があります. 現在,2次元配列に格納されたマトリックスを表示するために, integer :: i,j,N integer,allocatable :: A(:,:) 〜〜〜 N=10 allocate(A(1:N,1:N)) A = 123 do i=1,N,1 write(6,'(100I3)') (A(i,j),j=1,N,1) enddo という風にしています. つまり,横に並べて表示するformatとして 100I3 という風に反復回数を十分大きくとって 対応しています. この反復回数100の部分を変数にしたいのですが不可能なのでしょうか?
383 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 17:45:17 ] >>382 文字型変数で書式を作って渡す。 character(len=20) :: fmt ... write(fmt, "('(', I5, 'I3)')") N do i=1,N,1 write(6, fmt) (A(i,j), j=1,N,1) end do または、Visual Fortran限定で良ければ書式中の <> 内に整数式を書き込む。 do i=1,N,1 write(6, '(<N>I3)') (A(i,j), j=1,N,1) end do
384 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 23:17:58 ] >>382 これは実はFAQ。このスレでもすでに何回も出てきている。 教科書も少しはこういう事を書けw
385 名前:382 mailto:sage [2007/04/06(金) 06:49:35 ] >>383 ありがとうございます. 助かりました.
386 名前:デフォルトの名無しさん [2007/04/09(月) 07:37:06 ] 式の前に入れる空白の数によってコンパイルエラーが出たりでなかったりするのですが、 これはどのように決まっているのでしょうか?
387 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 08:30:56 ] >>386 ソースやエラーメッセージも貼らずに(ry 空白を追加したら1行が73桁以上になった、に10エスパー
388 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 10:26:38 ] 73行以上っていつの時代のコンパイラだよw
389 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 20:02:39 ] gfortran やIntel Fortran 9.1 でも固定形式ではしっかり73桁目以降を無視してくれますよ。
390 名前:デフォルトの名無しさん [2007/04/09(月) 23:45:40 ] >>388-389 そうじゃないぞ諸君。 一般的なコンパイラでは拡張子によって、デフォの挙動が変わる。 拡張子が.fや.forの場合は、固定書式になって72カラムモードとなる。 .f90などの場合は自由書式になる。 あと、ワークステーションなどでは、よく同じコンパイラが、コマンドとしてf77とf90呼び出される設定に なっていて、デフォの挙動を変えて作動する。この場合も、固定書式と自由書式にそれぞれなっている。 まぁFORTRANを使うなら固定書式の爽やかさを味わってみるのもいいだろう。
391 名前:デフォルトの名無しさん [2007/04/13(金) 19:22:44 ] n(nx,ny) という配列をバイナリ形式で write(8)n という風に書き出した場合、格納順序はどのようになるのでしょうか? n(1,1),n(1,2).... でしょうかそれとも n(1,1),n(2,1).... あるいは処理系に依存なのでしょうか?
392 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 19:30:32 ] >>391 n(1,1),n(2,1).... ただし格納されたデータ形式は処理系依存
393 名前:デフォルトの名無しさん mailto:sage [2007/04/14(土) 00:40:47 ] >>391 FORTRANでは規格でn(1,1),n(2,1)....の順にメモリー上に入っている。 さすがにこれは教科書にも書いてある。 というか、これを知らないと整合配列がらみでF77などでは実用的なサブルーチンとか書けない。 またライブラリを呼ぶにしても引数の意味が理解できないだろう。 まぁマニュアル嫁。
394 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 05:11:11 ] 合同乗積法による乱数生成プログラムを作成しなければならないのですが どこか参考になるページなどはありませんでしょうか。 かれこれ2、3時間探しているのですが見つかりません。
395 名前:デフォルトの名無しさん [2007/04/17(火) 16:42:15 ] 配列の初期化について質問があります. 以下のプログラム (Fortran90です) のように, 変数宣言部で初期化すると,data文が効かずににMatrixの要素がすべて0になってしまいます. もちろん変数宣言部を integer :: Matrix(1:3) に書き換えるとMatrixの要素はそれぞれ 1, 2, 3 と入ってくれます. これは一体どういうことなんでしょうか? 最適化を外しても同じです・・ 頭が変になりそうです. !---プログラム----- program MATRIX_TEST implicit none integer :: Matrix(1:3) = 0 data Matrix/1,2,3/ write(6,*) Matrix end program MATRIX_TEST
396 名前:395 mailto:sage [2007/04/17(火) 17:09:51 ] 色々やった結果,以下のようにしたら期待通りになりました. 変数宣言部で初期化するとsave属性が付くという仕様に気づきませんでした. data文はsave属性の変数に値を入れることができない(?). 何がなにやら・・ もうdata文を使うのはやめます. !---プログラム----- program MATRIX_TEST implicit none integer :: Matrix(1:3) = 0 !data Matrix/1,2,3/ ←やめて,下のようにした. Matrix = (/1,2,3/) write(6,*) Matrix end program MATRIX_TEST
397 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 17:48:06 ] そういえばfortran90ではdata文を使うのはやめましょうっていう記述結構見かけるんだけど、 多次元配列にデータ入れたい場合どうやってます? たとえば2×2のマトリックスを3個用意する場合。 1次元目がマトリックスを区別し、2次元目が行、3次元目が列を表すものとして、 integer :: A(1:3,1:2,1:2) data A(1,:,:) /1,2,3,4/ data A(2,:,:) /5,6,7,8/ data A(3,:,:) /9,10,11,12/ に相当するコードをdata文なしでどうやって書きます? >>396 みたく A(1,:,:) = (/1,2,3,4/) と書ければいいんだけど、これはコンパイルエラーになる… 変数宣言部で一気に integer :: A(1:3,1:2,1:2) = (/1,2,3,4,5,6,7,8,9,10,11,12/) ってやるしかない?? これだと目的の要素に値入れるのにメモリ上の並びを考えないと いけないので4次元5次元となると、きついっす。
398 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 23:51:49 ] >>394 合同乗積法による乱数 でググルとトップにFortranのプログラムが出てくるぞ! しょんべんで顔洗って出直して来い! >>395-397 DATA文は実行文ではなく初期化文だ。 F90では初期化が直接出来るので、わざわざDATA文を使う理由がない。 宣言文での初期化とDATA文での初期化のどちらが優先されるのかは、規格書を見ないと分からんが そんな使い方は想定していないので、たぶんメーカーの実装に依存していると思われる。 A(1,:,:) = (/1,2,3,4/) がうまく行かないのは、次元があっていないから。 RESHAPE関数を使って次元をあわせればおk。これはよく教科書にも載っているので調べそ。
399 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 02:24:37 ] 二項分布のプログラムについてなのですが(硬貨の表裏)、表を0、裏を1とした場合 それぞれが1/2の確率で現す書き方がわかりません。 超初心者ですみません。
400 名前:397 mailto:sage [2007/04/18(水) 06:26:52 ] >>398 サンクス! 調べてくるお
401 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 07:00:39 ] すいません、質問させてください。 コンパイル時どうしても /opt/intel/fc/9.0/lib/for_main.o(.text+0x41): In function `main': : undefined reference to `MAIN__' と出てしまうのですが、これはどういう事なのでしょうか。
402 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 09:56:11 ] >>399 0以上1未満を返す乱数のサブルーチンは用意してあるとする。 このとき0以上0.5未満だったら表、0.5以上1未満だったら裏とすればよい。 >>401 確認していないので想像で書くw メインルーチンが無いだけじゃない?プログラム文が無いとか。 昔のHITACのFORTRANだと、サブルーチン名をMAINにすると、 それをスタートアップルーチンと勘違いしていきなりそこから実行が始まるウンコ仕様だったがw
403 名前:399 mailto:sage [2007/04/18(水) 14:43:32 ] なるほど。。 やってみます。ありがとうございました。
404 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 16:08:05 ] NaNを検出するような関数ないですか・・
405 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 16:16:14 ] すみません自己解決しました isnan(real)でした
406 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 22:32:46 ] >>404-405 IEEEのフラグがらみの関数はFortran2003で導入される予定なので、それはコンパイラ独自の拡張。 コンパイラの種類などを書かないと、誰も答えられないし、何の情報にもならん。 おまんこ。
407 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:18:38 ] g77はFortran90の機能も内包しているのですか?
408 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 14:44:17 ] YES おまんこ。
409 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 16:08:24 ] >>407 ちょっとだけだけどな。
410 名前:デフォルトの名無しさん [2007/04/23(月) 14:23:26 ] 実行時間を計ろうと思って色々検索したら,dtimeというサブルーチンが 用意されていると知り,使ってみたのですが,よくわからないエラーが発生してしまいました. >>410 のプログラムをコンパイル&実行すると,なぜか出力がNaNになってしまいます. call dtimeを削除すると期待した値が出るのですが,なんでこんなことになるのかわかりません… どなたか助けて下さい (´;ω;`) ただdtimeがfortran標準でないという記述も見かけたので,使わない方がいいのでしょうか… コンパイラはIntel Visual Fortran 9.1で,コマンドは f90 /check:all /Od test.f90 でした.
411 名前:410 [2007/04/23(月) 14:24:32 ] すみません>>410 ではなくて>>411 です orz !-- test.f90-- program test implicit none real(8) :: x,y call SUB x = 11.d0 y = Func(X) write(6,*) y contains subroutine SUB implicit none real tarray(2),result call dtime(tarray,result) call dtime(tarray,result) return end subroutine SUB complex(8) function Func(x) implicit none complex(8),parameter :: IU=(0.d0,1.d0) real(8),intent(in) :: x Func = exp(IU*x)/sqrt(2.d0) return end function Func end program test
412 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 14:56:37 ] >>410 Intel Visual Fortranの DTIME は引数が1つの関数だ。サブルーチンじゃない。 SUB の先頭に USE IFPORT をつければちゃんとコンパイル時にチェックしてエラーを出してくれる。
413 名前:410 mailto:sage [2007/04/23(月) 16:33:19 ] >>412 アッー!たしかにそうです! ライブラリ・リファレンスに書いてました・・・・・ ありがとうございました!
414 名前:デフォルトの名無しさん [2007/04/24(火) 15:35:00 ] (1) 2×2の行列A,B の要素を入力し,A+B とAB およびA−1 計算する部分をそれぞれサブル ーチンとするプログラムを作成せよ.
415 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 15:40:12 ] A-1ってA-I(もしくはE)のことか?
416 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 15:41:13 ] ああ、逆行列のことか。スマン。
417 名前:1/2 mailto:sage [2007/04/24(火) 18:53:50 ] >>414 program main use la_precision, only: WP => DP implicit none integer, parameter :: N = 2 real(WP), dimension(N,N) :: A, B, C, D, E print *, "input A:" call sub_read(A) print *, "input B:" call sub_read(B) call sub_add(A, B, C) print *, "A + B =" call sub_write(C) call sub_mul(A, B, D) print *, "AB =" call sub_write(D) call sub_inv(A, E) print *, "inv(A) =" call sub_write(E)
418 名前:2/2 mailto:sage [2007/04/24(火) 18:55:08 ] contains subroutine sub_read(X) real(WP), intent(out) :: X(N,N) integer :: i, j do i = 1, n; read *, (X(i,j), j=1,N); end do end subroutine sub_read subroutine sub_write(X) real(WP), intent(in) :: X(N,N) integer :: i, j do i = 1, n; print *, (X(i,j), j=1,N); end do end subroutine sub_write subroutine sub_add(X, Y, Z) real(WP), intent(in) :: X(N,N), Y(N,N) real(WP), intent(out) :: Z(N,N) Z = X + Y end subroutine sub_add subroutine sub_mul(X, Y, Z) real(WP), intent(in) :: X(N,N), Y(N,N) real(WP), intent(out) :: Z(N,N) Z = matmul(X, Y) end subroutine sub_mul subroutine sub_inv(X, Y) use f95_lapack, only: la_getrf, la_getri real(WP), intent(in) :: X(N,N) real(WP), intent(inout) :: Y(N,N) integer :: ipiv(N) Y = X call la_getrf(Y, ipiv) call la_getri(Y, ipiv) end subroutine sub_inv end program main
419 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 00:54:13 ] >>417-418 正直なところ、たかがこれしきの行列演算をサブルーチンにする意味が分からん。 おまけに逆行列はLAPACK使ってるし。2*2限定なら高校で習う公式で十分だろ。 すべてがjokeなのかもしれないが
420 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 02:18:40 ] 宿題か何かなんじゃないか? っていうか超初心者用スレなんだから サブルーチンにする意味なんか問うな。 Hello worldなんか意味がないとか言っているのと同じだ。
421 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 00:00:42 ] >>421 たぶんFORTRAN77での宿題なんでね? Fortran90では意味を成さない希ガス。