FORTRAN III
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGFORTRAN77/90/95/2003, HPF等、FORTRAN全般に関する話題を書き込んで下さい。
・前スレ
FORTRAN II
http://pc5.2ch.net/test/read.cgi/tech/1068351911/
Fortran
http://pc2.2ch.net/test/read.cgi/tech/1003214738/
0357356
2005/09/03(土) 08:40:040358デフォルトの名無しさん
2005/09/03(土) 09:41:520359デフォルトの名無しさん
2005/09/03(土) 11:09:09>Fortran IVのプログラムが動くソフト
それは、通常コンパイラと呼ばれるソフトです。
私があなたなら、該当プラットフォーム(OS)上で動くFortranコンパイラを販売している会社を調べ、
その会社に問い合せる。
0360デフォルトの名無しさん
2005/09/06(火) 20:52:23read文を使う場合、読み込ませる変数を細かく設定しなければいけませんよね?
例えば、
"do i=1,10"
を読ませたかったら、
read(1,*)a1,a2となりますよね?
毎回ファイルの中身が変わるので、それは面倒なんですよ。
とにかく、そのままコピーしたいんですけど、いい手ありませんか?
0361デフォルトの名無しさん
2005/09/06(火) 20:56:52call system("cp hoge fuga")
0362デフォルトの名無しさん
2005/09/06(火) 23:06:16ファイルの中身をコピーしてから「何をしたい」のかを
示さないと、>>361のような恐らく望んでいない回答を
されて、再度質問をすることになりはしないか?
0363360
2005/09/07(水) 14:22:24申し訳ありませんでした。
ファイルに、新たな内容を追加したいということです。
A.datというファイルがあり、そのファイルの最下部にフォートランで計算
した値を追加したいのです。
ですから、新たなファイルをopen文で作成して、A.datファイル全体をコピーして
、そして追加内容をwrite文で書き込もうかと考えています。そのコピーの方法
を教えていただきたかったということです。
もし他にわかりやすい方法があれば、是非教えていただきたいです。
0364360
2005/09/07(水) 17:54:050365デフォルトの名無しさん
2005/09/07(水) 18:11:12単純に A.datに追加書き込みするだけで良いのなら
open(UNIT=1, FILE='A.dat', POSITION='APPEND')
:
write(1, *) hoge
:
close(UNIT=1)
0366デフォルトの名無しさん
2005/09/07(水) 21:01:12ttp://www.uopmu.ees.osakafu-u.ac.jp/~yabu/soft/fortran.html
12. 文字型変数に対する read
15. read 文実行時のエラー処理
でどうですか?
0367デフォルトの名無しさん
2005/09/07(水) 21:20:50別のファイル名で作成して、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)
0368デフォルトの名無しさん
2005/09/10(土) 01:23:52プログラムの途中で real::配列 としてもエラーになります。
どうすればよいですか?
0369デフォルトの名無しさん
2005/09/10(土) 02:05:280370デフォルトの名無しさん
2005/09/10(土) 14:34:18エスパー募集をやめる。
エラーと言っても様々なエラーがある訳で。
0371デフォルトの名無しさん
2005/09/14(水) 20:05:19work_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で、というのは無理なんです。
0372デフォルトの名無しさん
2005/09/14(水) 20:21:41内部WRITEで文字列を生成してsystemにわたせば?
0373371
2005/09/14(水) 20:52:12仰ってるのってこんな感じですか?
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 でもうまくいってません。
基本的な質問ですいません。。
0374デフォルトの名無しさん
2005/09/14(水) 23:27:39か
character*100 cbuf
cbuf = "mv memo ./"//ccc
call system(cbuf)
とかでいけるかな
自信はないけど、こんな感じでいけるんじゃね
0375371
2005/09/15(木) 00:07:02Thanks a lot !!
これで納期に間に合いそうです!w
m(__)m
0376デフォルトの名無しさん
2005/09/15(木) 00:48:33変数(配列になっているやつも)の引渡しの部分も書かれているやつで。
ネットでサンプルプログラムを探しているのですが、なかなか見つからなくて困っております。
0377デフォルトの名無しさん
2005/09/15(木) 01:40:16ttp://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg18_05.htm
ttp://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg08.htm
0378デフォルトの名無しさん
2005/09/16(金) 17:17:32行列演算と、データベース的な処理の両方が必要なのですが、fortranは行列に偏っているように思われます。
(科学技術分野では当然か)
0379デフォルトの名無しさん
2005/09/16(金) 19:36:47使用したことはないので目的に合うかどうか判りませんが
Windows用ならODBCデータベースにアクセスするライブラリがあるようです。
f90SQL
ttp://www.canaimasoft.com/f90sql/index.htm
Windows Fortranによるデータベースの利用 (3月2日 5-10)
ttp://platypus.lns.tohoku.ac.jp/Program.htm#5th
0380デフォルトの名無しさん
2005/09/22(木) 15:33:19それは使えません。自作するしかないかもしれません。
0381デフォルトの名無しさん
2005/09/25(日) 12:02:40自動で並列化してくれつという宣伝につられた。
確かにタスクマネージャーをみると2個とも計算しているっぽい。
しかし、COMPAQのCVF8でコンパイルしたものと比べて(これは1つのCPUが動いている)
全然変わらない。
試したのはCAVITY流れの非定常計算(自作)で、同じマシンで両者を比較。
PentiumD 820を残った少ない予算で購入したのに・・・。
これまで使っていたPentium4 560のほうが速い。意味がなかった。
FORTRAN77形式で書いたのがまずいのかな。
(でも並列化してくれているし)
0382デフォルトの名無しさん
2005/09/25(日) 14:19:03PenDを無駄にしたくないならOpenMPで並列化してみ。
たいして難しくないはず。
0383デフォルトの名無しさん
2005/09/25(日) 17:43:00自動並列化は全然役に立たない。多分、非常にシンプルなプログラムに限ってその効果が現れると思われ。
382の言うようにOpenMPで自分で並列化していくしかない。
0384デフォルトの名無しさん
2005/09/25(日) 19:54:51多分、並列化の技術の使いかたをイメージできてないんじゃない?
自動並列化は役に立たないんじゃなくて、上手く並列化されるようにプログラムを変える
数式を解きやすいように変形するのと一緒
0385デフォルトの名無しさん
2005/09/26(月) 00:43:42それでうまくいけば誰もOpenMPやpthread使わない。
数百行のソースなら簡単だけど。
0386381
2005/09/26(月) 09:40:25インテルのホームページを読むとこれまでのプログラムのままでも
多少の効果は期待できそうなことが書いてあったので。
自動並列化: インテルVisual Fortran コンパイラには、
ループを自動的にスレッド化する自動並列化機能が搭載されています。
このため、並列化によるマルチプロセッサ上でのアプリケーション・パフォーマンスの改善を
手軽に実現できます。自動並列化機能は安全に並列実行できるループを検出し、
これらのループに関してマルチスレッド・コードを自動的に生成するため、
イタレーションのパーティショニング、データの共有、スレッドのスケジューリング、
同期化といった低レベルの細かい作業をユーザが行わなくても並列化が可能となり、
マルチプロセッサ・システムやハイパー・スレッディング・テクノロジ対応システムの強力な
パフォーマンスを活かすことができます。並列実行ループのベクトル化機能や、
ソフトウェア・ベースのスペキュレーティブ・プリコンピュテーション新機能など、
ハイパー・スレッディング・テクノロジ対応インテルプロセッサでのパフォーマンスの
向上につながる最適化の改良が行われました。
それにしても一応デュアルで動いているのに効果が全くないのは
どういうこと?思ったほど高速化しなかったな、というのは
よくあることだけど、計算が振り分けられれば多少は高速化すると
思うのだが。
タスクマネージャーをみる限りでは2個ともフルに動いていそうなのだが。
0387デフォルトの名無しさん
2005/09/26(月) 13:01:56CPU占有率は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
0388デフォルトの名無しさん
2005/09/26(月) 13:20:29判断できないんじゃ?
0389381
2005/09/26(月) 14:08:23ただし、行列×ベクトルだとコンパイルした時点で並列化してくれない。
もっとも多い計算が行列×ベクトルなのに・・・。
たとえば、これだと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
0390デフォルトの名無しさん
2005/09/26(月) 14:41:03MKLに入ってるblasだったら並列化されてるから、それ使えばいいんじゃない?
0391デフォルトの名無しさん
2005/09/26(月) 19:31:31Winユーザでしょ?
てことはMKLも有償じゃぁ…
0392デフォルトの名無しさん
2005/09/26(月) 23:44:50って事はベクトルは行列にしてから計算しろってことじゃね?
0393381
2005/09/27(火) 00:05:57お察しの通りWindows版です。
Linuxは扱い方がよくわからず、いろいろ不便なので
(インストールしてネットワークの基本的な設定ができる程度)
軟派ですがWindowsを使っています。
>>392
B(5000,1)にしろということでしょうか?(単純すぎ?)
この方法では並列化しませんでした。
うまいアルゴリズムを考えなくては。
並列化とOpenMP勉強します。
皆様、アドバイスありがとうございました。
0394デフォルトの名無しさん
2005/09/27(火) 00:29:17なんとなくだがB(5000,5000)のB(x,x)だけ使えばいいんじゃね?
0395デフォルトの名無しさん
2005/09/27(火) 15:26:06自動並列化がそんなにバカなら使い物にならないな。
0396デフォルトの名無しさん
2005/09/29(木) 01:31:25module 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を使用しています.
よろしくお願いします.
0397デフォルトの名無しさん
2005/09/29(木) 20:37:20普通は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++ライクなカプセル化ですかね。
0398396
2005/09/29(木) 23:35:56ありがとうございました.
Fortran90で,とりあえず動くプログラムを作ることばかりを考えてやってきてたので,
一度プログラミング作法やFortran90の仕様などをきっちり勉強したいと思います.
0399デフォルトの名無しさん
2005/09/30(金) 00:45:16http://www.cs.rpi.edu/~szymansk/OOF90/F90_Objects.html
http://www.amath.washington.edu/~lf/software/CompCPP_F90SciOOP.html
も読んどいたらいいかもね。
0400デフォルトの名無しさん
2005/09/30(金) 03:57:35そういえば、Fortran2000だったか2005だったかで、OOP支援機能がなんか入るんじゃなかったっけ?
0401デフォルトの名無しさん
2005/10/01(土) 12:38:09module variables
real(8),dimension(:,:),allocatable :: x
integer :: i,j
CONTAINS
subroutine test()
use variables
implicit none
!配列xに対する操作・演算を行う
end subroutine
end module
とするのがこの場合の本来的な型。
0402デフォルトの名無しさん
2005/10/02(日) 10:32:07module variables
real(8),dimension(:,:),allocatable :: x
integer :: i,j
!
CONTAINS
subroutine test()
use variables
implicit none
!配列xに対する操作・演算を行う
end subroutine
!
end module
とするべし。
allocateに関しては問題なし。
0403デフォルトの名無しさん
2005/10/02(日) 11:20:50subroutine test() 内の use文は不要じゃない?
後、配列の大きさは size() で調べられるから
モジュール内の i, j は不要な気もするけど
そこら辺は好みの問題か。
0404デフォルトの名無しさん
2005/10/02(日) 11:47:080405デフォルトの名無しさん
2005/10/02(日) 18:27:28学生時代ずっとf77ばっかりで
会社に入ってようやくf90をやりました。
配列式、メモリの動的確保、do-enddoとか
便利なところは感じますが疑問もあります。
moduleってどんなメリットがあるのでしょう?
使い方も難しくて利点がよくわかりません。
0406デフォルトの名無しさん
2005/10/03(月) 14:12:09コードもきれいに書けるし。
0407デフォルトの名無しさん
2005/10/03(月) 23:05:56メリットとしてはcommonに比べて安全に変数を共有できる、とか
モジュール内のサブルーチンを使う時にコンパイラが引数の型チェックをしてくれる
などかな。
使い方はここらへんを参考にして
ttp://ace.phys.h.kyoto-u.ac.jp/~tomita/education/fortran90/sec9.html#9.3.
ttp://www.mri-jma.go.jp/Project/mrinpd/coderule.html
0408デフォルトの名無しさん
2005/10/04(火) 18:54:50開発環境はどこでダウンロードできますか?
探したんですが見当たらなくて 誰か教えてください。。。
0409405
2005/10/04(火) 21:26:05>>407
ありがとう。
理解したとは言えないけど、なんとなくわかった気がします。
学生時代、研究でドイツ人の書いたf90ソースを改良しなくてはならないのに
f77しか知らずに、moduleとかすごい嫌いになったんですよね、、。
勉強してみようかな、、。
0411デフォルトの名無しさん
2005/10/04(火) 21:40:360412デフォルトの名無しさん
2005/10/04(火) 21:55:130413デフォルトの名無しさん
2005/10/05(水) 00:20:57はい、これ↓。Hobbyistなら非商用に限り無料で使えるOpenVMS
ttp://www.openvmshobbyist.com/
AlphaかVAX用だけどね。
VAX互換で良ければIntel Fortranあたりでも使えば?
(一応、DEC→Compaq→HP→Intelの流れでVAX FORTRANがご先祖様だし)
0414デフォルトの名無しさん
2005/10/05(水) 00:23:190415デフォルトの名無しさん
2005/10/05(水) 00:53:36つ 【Microsoft Fortran PowerStation】
0416デフォルトの名無しさん
2005/10/05(水) 08:05:03ありがとうございます
助かりますっ
0417デフォルトの名無しさん
2005/10/05(水) 13:15:25なんで廃れたのかね?
0418デフォルトの名無しさん
2005/10/05(水) 20:48:450419デフォルトの名無しさん
2005/10/06(木) 00:43:280420デフォルトの名無しさん
2005/10/06(木) 22:53:300421デフォルトの名無しさん
2005/10/07(金) 21:05:19アップデートができないとありますが、インストールしたあとでアップデートを受けたい場合には
ネットに接続し、手動でオンライン認証を受ける必要があるんでしょうか?
0422デフォルトの名無しさん
2005/10/07(金) 21:49:310423デフォルトの名無しさん
2005/10/08(土) 00:39:21アップデート方法は基本的に
インテルのプレミアサポートから新しいバージョンを丸ごとダウンロードして
古いバージョンをアンインストール→新しいバージョンをインストール
プレミアサポートにログインするためには予め登録しておいたIDとパスワードが必要。
0424デフォルトの名無しさん
2005/10/09(日) 10:49:17>6のリンク先のリンク先は切れているし
c2f.zipでググってもリンク切ればっかりで見当たりませんでした
0425デフォルトの名無しさん
2005/10/09(日) 13:39:08ttp://home.earthlink.net/~dave_gemini/c2f.zip
ttp://www.talkaboutprogramming.com/group/comp.lang.fortran/messages/161252.html
> I lost my copy of C2F.ZIP file when I changed computers/ISP in last year,
> and now have a request to make it available again.
・・・(´Д`;)
0426デフォルトの名無しさん
2005/10/10(月) 00:57:00ありがとうございます
0427デフォルトの名無しさん
2005/10/10(月) 17:34:42その小数部を出力するにはどうすればいいんですか?
0428デフォルトの名無しさん
2005/10/10(月) 17:39:46その小数部を出力するにはどうすればいいんですか?
0429デフォルトの名無しさん
2005/10/10(月) 18:17:140430デフォルトの名無しさん
2005/10/10(月) 18:39:240431デフォルトの名無しさん
2005/10/10(月) 21:41:12どうすればよいでしょうか?
C言語ではヌル文字があって比較的簡単だったのですが,Fortranでは無いようなので…
0432デフォルトの名無しさん
2005/10/10(月) 21:56:150434デフォルトの名無しさん
2005/10/11(火) 00:37:49ありがとうございます。
お礼を言うのが遅くなってすいません…。
0435デフォルトの名無しさん
2005/10/13(木) 08:25:31の入門書としてお勧めの書籍があれば教えてください.
http://www.amazon.co.jp/exec/obidos/ASIN/4894713217/
一応これがいいかなって思っているんですが.
0436デフォルトの名無しさん
2005/10/13(木) 12:14:080437デフォルトの名無しさん
2005/10/13(木) 20:15:15俺もその本使ってる。
分かりやすくはないんだけど、本屋で立ち読みした他の本は
もっと分かりにくかったのでその本を買ったよ。
でも、ちょっとFortranに慣れてきたらその本より
ttp://www.rs.kagu.tus.ac.jp/yama/f90/f90-lang.html
の方がよっぽど役に立つよ。
0439デフォルトの名無しさん
2005/10/18(火) 15:29:33プログラムの一部に
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です。
よろしくお願いします。
0440デフォルトの名無しさん
2005/10/18(火) 15:49:49あるいはより高い精度になる分にも一向に構いません。
ただ、これよりも精度が劣ることがないようにしていただきたいのです。
0441デフォルトの名無しさん
2005/10/18(火) 17:39:45種別型パラメタがあってないのかも。
・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)"ってやつね。
0442439
2005/10/18(火) 18:27:56ありがとうございます。
下の方法にてコンパイルが成功いたしました。
現在実際に計算しています。
精度については結果待ちなので明日にならなければ分かりませんが、
いい結果が出ることを祈ってます。
0443439
2005/10/19(水) 12:05:12本当にありがとうございました。
0444ハーピィ
2005/10/20(木) 01:07:500445デフォルトの名無しさん
2005/10/22(土) 04:25:33何か対策無い?
0446デフォルトの名無しさん
2005/10/22(土) 11:35:33form='binary' のかわりに access='stream' を使うとか。
0447デフォルトの名無しさん
2005/10/22(土) 14:46:030448デフォルトの名無しさん
2005/10/22(土) 15:51:40ありがとー。
access='stream' で望んだ結果が得られました。
0449デフォルトの名無しさん
2005/10/24(月) 13:01:06http://www.nag-j.co.jp/FortranBuilder.htm
0450デフォルトの名無しさん
2005/10/28(金) 00:21:02Salford FTN95でコンパイルしたものと
g95でコンパイルしたexeのサイズがぜんぜん違うんです。(10倍ぐらい)
(30行くらいのものです)
Salford FTN95はいちいち最初にメッセージが出るんでコンパイラーを変えたいんですが
g95をこのまま使い続けてもいいんでしょうか。
0451デフォルトの名無しさん
2005/10/28(金) 00:26:13どっちかがスタティックリンクをしているから大きくなる?
0452450
2005/10/28(金) 00:47:24そうなんですか。気にしないでおきます。たいしたプログラムは組みませんし。
ありがとうございました。
ところで、gfortranとg95はどちらが優れているのでしょうか。
とにかく早く計算したいんです。
別にこの二つに限らないのでWinXPで動くフリーのFortran90コンパイラーを紹介してください。
0453451
2005/10/28(金) 00:52:20実行可能なプログラムを作りたいということと考えれば
g95でないかな。gfortranではコンパイル出来なかった
プログラムがg95では出来たことがある。
フリーのコンパイラの件は知らん。
0454デフォルトの名無しさん
2005/10/28(金) 12:06:54貧乏なら無償のIntel FortranをLinuxにインストール。
金があるなら、Windows版Intel Fortranを買え。アカデミック版なら大した金額じゃない。
お遊び程度なら、Linux上でgfortranかな。
0455デフォルトの名無しさん
2005/10/28(金) 16:17:00Linux上で、っていう要件を満たせるなら、遊びでも素直にIntel Fortran使ったほうが吉かと。
0456デフォルトの名無しさん
2005/10/28(金) 17:37:07coLinux上でIFC
■ このスレッドは過去ログ倉庫に格納されています