くだすれ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/ そんなに端数が気になるならもうひと桁増やして丸めればよかろうに むしろ、簡単に実装できるのにわざわざ関数がある言語のが珍しいかと >>584 0.4999999999を小数点以下3桁で切り捨て表示するために4桁で文字列化しても内部処理が丸めだと0.500になってしまうかもしれんぞ 素直に1000倍して切り捨てて1000で割るがよろしい >>580 なぬ?途中の計算の話じゃなくて、I/O 時の話か? それならあるぞ。F2003もしくはF2008の機能だと思うが。 write(*, '(rd, f15.1)') 1.45 ! 1.4 write(*, '(ru, f15.1)') 1.45 ! 1.5 このほか rz, rn, rc もある。 それぞれ round up, round down, round to zero, round to nearest, round to compatible 最後の二つは最近接への丸めだが、等距離の時に、偶数への丸めかゼロから遠い方への丸めかだと思う まぁ詳しくはマニュアルとIEEE754-2008の仕様をよく読んでくれ。 昼休みに調べたら rd ru の類はF2003だった。 あと rp processor dependent という処理系依存型もあるようだ。 あとOPEN文で指定する方法もある。 しかし、正直いって>>580 の基本的発想が間違っている。 他の人達のアドバイスにあるように、そもそも内部二進表現を十進表現に 直すときに丸めなどが入ってしまう。そのうえでさらに十進表現を 丸めようとするのが Fortran 的センスではおかしい。 だからみんな当惑した反応しか返さない。 とはいえ自然科学ではない商習慣等での丸め等もあるようだから 別にそれがいけないわけでなく、それに合った言語例えば BCD演算できるCOBOLなどで計算すべきのみ。 Fortran コンパイラメーカ Intel PGI Pathscale (Intel NVidia AMD/ATI) アクセレレータ御三家 Absoft NAG 独自色 Lahey/Fujitsu Silverfrost 斜陽族 GFortran g95 GNU Free系 こんなとこか? Free系にOpen64と(一応)dragoneggがあるぞ dragoneggはgcc4.8.3以降はサポートしてないしflangは開発止まってるし この辺が活発化すれば若い人がたくさん来ると思うんだけどな GNUでFortranやAdaが熱心にサポートされているのは、米国防総省あたりからの 金が流れているからなのかな? 意識高いw進歩的wCS学科若年層には人気は全くないのに。 それともおっさん層しかやってないからなのか? そのわりにGNU COBOLとかPL/IとかALGOL、PASCAL、Modula-2とかやらないし。 >>587 でもfortran95でしょ、ほとんどサポしてるのは Cray, IBM, PGI, Intel が F2003 完全対応したな。 NAGはあと一歩。 GFortranは進捗どうですか? スパコンだと SXは90 Hitachiも90? Fujitsuは95? それぞれつまみ食い的に拡張してあるが。 日立のはコンパイルオプション-hf95で問題なく使えてたがあれ完全準拠じゃなかったのかな まあ完全準拠だったらわざわざfortran90コンパイラとは名乗らないか そういや、fortranのデータの取り扱い方について詳しくかいせつしてる本てあまりないね。 fortranのデータってなんじゃい?ファイルのことか? >>596 format read writeのことなら、コンパイラーの取扱説明書が(独自仕様拡張部分も含めて)もっとも詳しいよね。 intel fortranはIMSLも非商用は無償にしてくれないかな・・ IMSLは会社が違うから無理だべ。 IntelはCPU売るためにソフトのコンパイラを撒き餌としてばら撒いてもペイするが、 IMSLの方としては特に得しないし。 富士通がLaheyにOEM供給した時にコンパイラにSSL2とかただでバンドルしていたが。 NECがASLをちょー高値で売っていたことを考えれば、ちょー太っ腹だった。 それはそうと日本の大学の大型計算機センターにたまっていたライブラリも、 NETLIBみたいにネットに公開して吐き出せばいいのに。 >>598 Gfortran なんやけど…(´・_・`) もうやめようかな。 Gfortran で書いたプログラムをIntel fortran でもコンパイルすること出来ますか? >>538 ですが、いまだに解決しません。 >>543 の「数値が指定カラムからはみだしてないか」という意味がよくわかりません。 指定カラムというのはどこで見ることができるのでしょうか。 9.0と11.0ではビルドのUIが大きく変わっており、ビルドの条件が同じなのかどうか自信がありませんが、ほぼデフォルト状態でビルドしています。 >>603 当該 READ 文の FORMAT 文を見ると分かる。 たぶん昔のプログラムだから READ(99, 1000) N,B,C... みたいになっているだろう。 その場合行番号付で 1000 FORMAT(1H , 云々) となっている FORMAT文を見ればいい。 その行と引用しているREAD文を2chにコピペすればいい。 どの行かわからんというならDEBUGオプションでtracebackをオンにしてやれば エラーで死んだところで行番号が出るはず。 Fortranってどの程度配列メモリに記憶出来てるのかな? 例えば do i = 1, 100 Read(20,*) (a(i,j),j=1,20 End do で write(*,*) a(99,15)とかどこまで記憶出来てるもんなんやろ? eclipseである程度長いサブルーチンも何十個か呼び出しているプログラムで call systemが通らくなるのですがなにか原因ありますか? ブラウザソフト立ち上げながらでもダメだったのでメモリがらみと思うのですが ざっくりしすぎですいませんがなにかヒントあればおねがいします・・ >>605 質問の意味が分からんよ??? Fortranじゃ宣言分はがっつり確保されとるよ。 >>606 タスクマネージャーとか ps コマンドとかでメモリーの使用状況を見てみたら? call system が通らないのはメモリー満杯くさい。 >>607 ありがとうございました ps alxで見るとrssがまさに満杯でいっぱいのようでした cat /proc/meminfoで見るとフリーが10Gぐらい残っていて 大丈夫と思っていたのですが違いが分かっておらず 違いを勉強しようと思います もしご存知でしたらまた教えていただけると幸いです >>610 ありがとうございます。べんきょうになりました。 メモリ節約のために可能な限りallocatableに変更したら余裕ができて解決しました。 個人利用のプログラムには必要ないと思っていましたが大事でした ありがとうございました 配列a=/2,3,4,5,8,5,4......./みないなのがあったとして, 最大値の8すなわち,a(5)までをファイルに書き込みたいんだけど… do i = 1, maxloc(a) write(20,*) a(i) Enddo ではエラーになるよね。おそらくmaxloc(a)がrank 1 でdo loop にはrank 0 (スカラー値)じゃなきゃいかんってことなんだろう 配列をスカラー値に戻す関数ってないのかね? >>612 次元を指定すればおk。1次元でもあえて1を指定すればスカラーで返してくれる。 do i = 1, maxloc(a, 1) 1要素配列を返す奴らに使える、基本的なテクニックですぞい。 改行要らなければ write(20,*) a(:maxloc(a, 1)) で1行で済む。 >>614 いやぁ助かります。 ここは参考書に載ってないテクを知ってる方がたくさんいるからやめられない… このようなテクって自分で見出すもの?それとも何か参考書みたいのってあるのですか? あと、科学数値計算やってる方に聞きたいのですが、最適な刻み幅ってどう決定してますか? 対数刻みやらなんやらありますが、結局自己流やらなんやらでしっくりしたものに出会えず時間を無駄にしてる感たっぷりなんです >>615 maxloc とかに dim 引数が入ったのは F95 以降で、 F90 時代は要素1個の配列を返されて誰もが窮していた。 Numerical Recipes の F90 版では、SUM(MAXLOC(a)) みたいな形でこの問題を 避けていたが、俺的にはこれは無いなって感じだった。(元々あんまいい本じゃなかったし) 仕方ないから律儀に要素1個の配列を宣言して使っていて、もう解決策はないと諦めていた。 なので f95 が出てからも、この方法に全く気付かずにいた。 ある日、他人のソース眺めていて、1次元配列なのに maxloc の類で dim 引数指定していたのがあって、こいつ馬鹿じゃねーのwwwと思ってよく見たら このスカラー返しのテクニックだった。馬鹿なのは私でした。 たぶん10年以上無駄な1要素配列のプログラム書いていたwww 誰か>>612 >>614 の解説をしてもらえないでしょうか まったく意味がわからない >>617 配列 a(7) = (/ 2,3,4,5,8,5,4 )/ があるとする。 最大値の位置を返す組み込み関数 maxloc に a を渡すと maxloc(a) は 1次元で1要素の配列 (/5/) を返す。 これを左辺で取るには integer :: m(1) が必要。スカラー変数では受け取れない。 m = maxloc( a ) !ok ; integer :: n ; n = maxloc(a) !error 要するに do i = 1, maxloc(a) は、do i = 1, m(:) と同じ意味になり文法エラーが出る。 >>612 の質問は、do i = 1, m(1) に当たる事を実行したいので、 配列をスカラー値に戻す方法はないか?と質問している。 それに対する>>614 の答えは、maxloc( a, dim = 1 ) を使えと言っている。 これは配列の要素を返す。普通は多次元配列に対して用いて、行や列の成分を 取りだすのに使う。 >>618 1次元配列の特定の1つの値を返すのに、それは1次元の1要素の「配列」として返されるからdo文では使えないということですね。それが配列の次元(dimension)を1と言うと解決するあたりがしっくりきませんね・・・。 >>619 多次元配列を maxloc に渡すと、最大値の座標を (/ 1, 2, 3 /) みたいな感じで 一次元配列で返す。 この成分を取り出すのが dim 引数。 1要素配列でも成分取り出せる。 まぁしっくりくるまで文法書を舐めるように読んでくれprpr x(100)があるとして、計算しているのになぜか例えばx(40)から値が0になってしまいます 考えられる原因ないでしょうか 無茶ぶりですいません >>622-623 ありがとうございます 確かにひどかったです・・すいません ただ、症状がなんとも表現できていないので もう少しうまく表現できるよう考えてみようと思います >>624 そんなこと言ったら今時fortran なんかねーよと言われるぞ。 そんなことないだろ?つまり逝ってよしもそんなことないのだ。 >>625 xが途中で変わってしまうなら xの代入文や計算式が間違ってないか探す(特に範囲指定) 途中で変数を書き出し、変数の変化を追う デバッガを使って変数に代入されるタイミングを調べる くらいしか思い付かない 実は0になる計算をしていたなんてことはないよね まぁ大方書き込んだつもりになっているが、ループが39までしか回ってないという パターンだろう。 初期値に1e38とかNaNとか書いておけばいい。 >逝ってよし 逝ってよし ってフレーズ最後に見たの何年前だろう?10年くらい前? ちょっとクスッと来てしまった。 悪くないよ〜 >>627 >>628 ありがとうございました 基本的なミスだろう、というご教示を参考に見なおしたところ解決しました x(40)以降を計算するのに地味にyを使っていたのですが、 yを計算するサブルーチンをcallする前にxを計算するサブルーチンをcallしてしまっていただけでした・・ ズコーって感じかもしれませんが私としてはレスいただき大変助かりました gfortranで call system(cd ..) とやっても上のディレクトリに移動できません。 他のコマンドは動くのですが… これは仕様なのでしょうか? >>631 systemからのcd実行なら仕様。 別のshellが起動してcdを実行して処理を終了するので、呼び出しもとのshellとは無関係。 GNUならディレクトリを変更したい場合はCHDIRが使える。 >>632 ありがとうございます。 if文でCHDIRに置き換えれば良さそうですね。 仕組みもわかりました。 とか言って失敗しましたw CHDIRをつかうとshからpremission deniedと怒られます。 if (IPTCMD(1:3).eq.'cd ') then DSTDIR=IPTCMD(4:) call CHDIR(DSTDIR) end if のようなコードです。SELinuxのせいかと思いましたが違いました。 ご教示いただければ幸いです。 追加すると、cdコマンドは成功しています。でも、 sh: 1: ..: Permission denied と怒られますw 素朴な疑問なんですが write( *,101) n write(10,101) n こういう式って一行にまとめられないんですか >>636 write ... ; write ,,, 言い換えます write( *,101) a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z write( 10,101) a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z write( 11,101) a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z みたいな文を一行でまとめたいのです write(10,101) n 10,11だと外部ファイルか それだと複数の装置番号に同時に出力する方法はない(0以上のスカラーでなければならない) 変数をまとめたいなら配列nにa-zを代入すればできる >>638 出力するユニットが同じならサブルーチンでまとめれば良いんじゃない? fortranからRを呼び出すようなことはできないでしょうか? system call?からRを呼び出すぐらいしかないでしょうかね? gnuplotでもそうだが Rのソースをfortranで生成するようにして system callから実行させればいいだろ >>638 こんなのかな iu(1:3) = (/6,10,11/) do i=1,size(iu); write(iu(i),101) ... enddo たしか coarray を使うとプロセスが複数走って、それぞれのプロセスで 別々にI/Oできるから形式上は1行でできるぞ。 まぁこれがやりたいことではないのは重々承知だがwww >>642 サンクスです ライブラリみたいのはないのかもしれませんね 配列内の最大最小を、区間指定でできませんか? maxだとできなかったんですが 区間指定ってなんだよw maxlocのことか?それともmaxval(a(20:20))のことか? 他人に理解できる表現で頼むぜw >>647 部分配列に代入して、maxを使うという意味? >615 亀レスですが、最適な刻み幅については、 森口繁一『数値計算術』に 「題4章 刻み幅の自動調節」 という記述があります。 ご参考までに >>648 >>649 a(1:20)があったとして、10から20の間だけのaのmaxという意味で書きました わかりづらくてすいません >>650 ありがとうございますm(__)m さっそく買わせて頂きました。 まだ手元に届いてないですが、その章は結構ページ割かれてますか? >652 p.195〜206 なおプログラムはpascalで書かれています >>655 お安い御用さ。 おじさんに何でも聞いて呉れ玉へ! >>652 ぼうず。 積分の自動刻み幅調節なら森正武の本に載ってるのがあるぞ。 岩波の77本にプログラムもある。 >>654 ありがとうございますm(__)m >>656 有益な情報ありがとうございますm(__)m お叱りを受けるかも知れませんが、指数関数が入った数値計算で手を焼いております 具体的には exp(x)/(exp(x)-1) といった関数を考え, 1から20000くらいまでの数値を出力したいのですが, 桁落ちしてNan やら Inf やら出て困っております. 定石としてはx を何かに規格化するのかな?とは思うのですが, x の範囲が1から20000と幅広くなかなか思いつきません. 何か妙案はございますでしょうか? >>657 xが大きい方で計算したいなら通分して 1/(1-exp(-x)) の形で計算するのが定石だが、 どっちにしろ x=20〜30くらいでもう 1/1=1 でその先は無理に計算しなくてもいい。 この辺は数値計算術にいっぱい書いてある。 森口繁一の本は古いけど結構面白い。 数値計算術〜計算数学夜話<<数値計算工学の感じで真面目になる。 それにつけても蔵王のお釜が白濁液まみれというニュースが興味深いよね。 Fortran で realloc に相当することをやりたんだけど、どうしたらいいでしょうぁ。 >>659 宣言でallocatable 使う前にallocateで割り当て 大きさ変える前にdeallocateしてallocateで再割り当て 中身を確実に保存したかったらdeallocate前に別の変数にコピー これで一応配列の大きさを変えれる Fortran2003なら move_alloc を使う。 alloctae(tmp(new_size)) new_size(1:size(array)) = array call move_alloc(tmp, array) move_alloc は番地(ポインタ)を写すだけなのでメモリー内容のコピーは1回で済む。 modern fortran explained 15.5.3 Transferring an allocation 参照 ちょっとスレチかもしれませんが… 無限級数の和が1になるものうち、\Sigma^{\infty}_{0} (1/2)^n よりも収束速度がゆっくりなものって何かありますか? 刻み幅に使いたいんですが中々思いつかないですm(__)m 質問がおかしいので、たぶん刻み幅っていうより問題設定が間違っている。 >>663 つまりは足し上げて1に収束するような数列を知りたいんです。 (1/2)+(1/2)^2+(1/2)^3+(1/2)^4+.....+(1/2)^n->1 ですよね? これだと収束スピードが速すぎるので、もう少し緩めに収束する数列を知りたいんです intel fortran compilerが、非商用版があると聞いたんですけど ホームページに行ってもありませんでした もう非商用版は終了したんでしょうか >>666 自分の探し不足ですかね よければURLおしえていただけませんか? >>667 ttp://pen.agbi.tsukuba.ac.jp/~RStiger/hiki2/?Fortran+(Intel+Parallel+Studio+XE)+%A4%CE%A5%A4%A5%F3%A5%B9%A5%C8 この辺参考にしましたよ(^^) 非商用ページにたどり着く方法, 頻繁に変わって不便だよなあ ライセンス登録して.licファイルなりシリアルコードなり持ってるなら直接DLするって手もあるが ttp://registrationcenter-download.intel.com/akdlm/irc_nas/4584/parallel_studio_xe_2015.tgz >>668 >>669 無事ダウンロードできました。ご親切にありがとうございました。 >669 御呈示のアドレスはLinux版ですが、Windows版 について情報をおもちではないでしょうか >>672 無償版ってこと?Linuxのみ無償なんだよ よく読めよ、カス 2つの実測値の相関係数を出したいのですが、 fortranでできないでしょうか 実測値は単純な直線傾向ではないです エクセルで手動でやることも考えたのですが、 実測値が100ケースほどあって、 今後も増えることを考えるとプログラムで作りたいと思いました もしよければアドバイスいただけないでしょうか >>677 Rを使用するのが一番手っ取り早いと思います。 Rを調べてみてあなたのやりたいことができそうなら、あえてプログラムを作る必要もないのでは。 >>678 ,679 いろいろソフトがあるのですね。 調べて試してみようと思います。ありがとうございました。 Fortranで書かれている遺伝的アルゴリズムのライブラリが 手に入るところはないでしょうか MPICH または OPENMPI で Fortran2008 bindings を使う方法を教えろ下さい。 ドキュメントにはサポートと書いてあるが、インストールしても MPI_F08.MOD が 生成されない@Ubuntu どうか助けろ下さい。こっちのスレへ行けという指示でもおk ランダム生成のコードのについて質問です。 ifortではコンパイルできたのですが、gfortranではエラーが出ました。 以下がエラーメッセージです。 ""$ gfortran routine.f90 routine.f90:32.25: call random_seed( put = (/c * 999/) ) Error: Size of 'put' argument of 'random_seed' intrinsic at (1) too small (1/12)"" putの大きさが本質的に小さすぎる、や(=c とした時)本質的に配列である。といったメッセージだと思い、いじってみたのですが解決方法が分かりません。よろしくお願いします。 あと / ~ / のスラッシュの意味もよろしければお願いします。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる