FORTRAN �W
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/12(日) 17:13:35FORTRAN77/90/95/2003, HPF等、FORTRAN全般に関する話題を書き込んで下さい。
・FORTRAN関連情報
お約束だが、まずは自分で調べよう
http://www.google.co.jp/
x86で動作するFortranコンパイラ
http://www.nminoru.jp/~nminoru/programming/x86-fortran.html
The Fortran Company
http://www.fortran.com/
Polyhedron Software
http://www.polyhedron.co.uk/
Google Directory - Fortran
http://directory.google.com/Top/Computers/Programming/Languages/Fortran/
・前スレ
FORTRAN III
http://pc8.2ch.net/test/read.cgi/tech/1104724162/
FORTRAN II
http://pc5.2ch.net/test/read.cgi/tech/1068351911/
Fortran
http://pc2.2ch.net/test/read.cgi/tech/1003214738/
0558デフォルトの名無しさん
2009/05/15(金) 01:22:11>新しい規格ではかなり自動で調整してくれる
へーそうなんだ
いちいちallocateしなくてすむのは嬉しい
0559548
2009/05/17(日) 22:24:17フォロー、ありがとうございます。
allocateでintel fortranでも無事動くようになりました。
てか、2003いいね。期待大。
0560デフォルトの名無しさん
2009/05/21(木) 00:38:15FORTRANで他からデータを読み込むのに、そのデータの最初にデータ概要が書いてあるので
読み飛ばす方法があったら教えてください
初心者なので分かりにくくてすみません
0561デフォルトの名無しさん
2009/05/21(木) 01:30:02適当な変数を定義して、読み込みだけさせて、その中身を
使わなければいいぢゃない。嘘データで良いから実例だし
てくれ。
# リアルなのを晒すとマズいかもしれんし。
0562デフォルトの名無しさん
2009/05/21(木) 01:54:07読み込むデータが
○月×日
気象データ
東京都日黒区
0.0001
0.0025
0.0025
0.0105
0.1568
1.5385
1.4657
12.368
こんな感じで数字の部分のみ読み込みをしたいです
0563デフォルトの名無しさん
2009/05/21(木) 02:05:29レコード長が分かってれば指定のレコード部を直接読みに行ける、はず
もっと良い方法あったらフォローよろ
0564563
2009/05/21(木) 02:08:22自信なくなってきた><;
0565デフォルトの名無しさん
2009/05/21(木) 02:15:570566デフォルトの名無しさん
2009/05/21(木) 09:45:54いくつか方法はある。
最初のデータ概要の行数が決まっていて一定ならば簡単で、
CHARACTER TEXT*256
DO i = 1, 4
READ(7, *) TEXT
END DO
的に読み飛ばせばいい。
手抜きな方法としては、数値変数に文字列を読み込むとエラーが出ることを利用して、
10 CONTINUE
READ(7, *, ERR= 10) dat
で無理に読み飛ばすことも出来る。
本物のエラーのときや、データ概要が数値として読めてしまうと困るw
やや高度な方法としては、いったん文字列に読み込んで、その文字列の中身をしらべて
文字列を内部ファイルとして入力に使って数値を読むという方法もある。
データ開始地点まで適当にすすんで、BACKSPACEで適切なところまで戻る手もある。
0567デフォルトの名無しさん
2009/05/21(木) 12:20:072つ目の手抜き法はオイラもよく使う。
念のため、
icount = 1
20 continue
read(7,fmt=*) string
read(string,fmt=*,err=10,end=999) dat(icount)
icount = icount + 1
goto 20
10 write(*,*) string
goto 20
continue 999
みたいに文字列を一度かまして
読み込みは内部ファイルで処理して、
飛ばされたケースは表示させて目でチェックするとか。
あまりほめられないスパゲッチ〜だけど。
0568デフォルトの名無しさん
2009/05/23(土) 20:59:00本気でスピード求めるならdirectアクセスがベストだが
多分あなたの使い方じゃそうじゃなさそうだから、普通に次々読んでいって
使わないデータは破棄しちゃえばいいじゃん
>>562がASCIIデータだとすると、5行目からの数字が欲しいなら、
do i=1,5
read(unit) tmp
enddo
とやって捨てちゃえばいい
0569デフォルトの名無しさん
2009/05/23(土) 21:16:21DO I = 1, 5
READ(NUNIT, *)
END DO
でおk
0570デフォルトの名無しさん
2009/05/23(土) 23:01:200571デフォルトの名無しさん
2009/06/09(火) 12:40:21変数のポインタ値を知る方法はありますか?
0572デフォルトの名無しさん
2009/06/09(火) 12:49:09無いが、サブルーチンに送ればわかる。
つまり、2次元配列を、サブルーチンの1次元形式引数の配列に渡せばよい。
0573デフォルトの名無しさん
2009/06/09(火) 13:18:41順番を知ることはできるのですが、メモリ上の位置を知ることは
できないのですね
0574デフォルトの名無しさん
2009/06/09(火) 13:32:54標準文法ではないが、LOC 関数などがベンダー拡張として用意されていることが多い。
またリンカーでマップを出力させると静的な変数ならばアドレスが分からなくも無い。
配列のならびに関しては、そのままでは分からないが、さらに EQUIVALENCE でも
かければ分かるのかもしれない。
0575デフォルトの名無しさん
2009/06/20(土) 14:16:58OPENMPで並列化してるんだけど、
デュアルコア環境でトータルCPU使用率が50%から上がらない理由わかる?
1コアしか使ってなくて2コア目がアイドルになっちゃう
0576デフォルトの名無しさん
2009/06/20(土) 14:21:55setenv なんたら、
をちゃんとしてる?
0577575
2009/06/21(日) 16:49:20環境はOSがXPProSP3で、Core2DuoE8500
0578デフォルトの名無しさん
2009/06/21(日) 18:23:29自動並列も同じだっけかな?
誰か詳しい人の降臨を待つしかないなw
0579デフォルトの名無しさん
2009/06/22(月) 09:45:02なぜ最初からWinXPだとかけないのだろうか?
自分が使ってるlinux+ifort9.1では、
setenv OMP_NUM_THREADS 8 (最後の8は適当なCPU数に置き換え)
で環境変数で並列数を指定することになってるけどな。Linuxでもシェルごとに違うはずだが。
実機がないのでWinXPだとどの程度違うのかわからんが、Intel提供の例では
setenv を set に換えるだけのようだ。
全体の監視&同期とり用のあまり忙しくないスレッドが1個走るはずだけど、
全部で5つはなんか多い気もするがそんなものかもしれない気もする。
>>578
CPUの位置のバインドは自動並列やらOpenMPの場合、Linuxでは dplace や taskset を使うな。
指定しないとふらふら移動することがあるからややこしい。
まあ詳しいWin機でいじくりまくってる神の降臨を待とう。Winでの並列に興味あるし。
0580575
2009/06/22(月) 17:58:29ProcessExplorerでスレッドの状況を調べてたら、メインスレッド以外無負荷だた
並列化を見直して負荷をかけるようにしたら100%まで掛けられるようになった
迷惑掛けてスマソ
0581デフォルトの名無しさん
2009/06/22(月) 23:05:58WinでのCPUバインドは環境変数でできた。
マニュアルに載っているはず。
イ7でハイパースレッディングの8コア運用していると、ちゃんとバインドしないと
性能が全く出ない。デフォで8スレッド運行してバッティングするし、4スレッドにしても
物理コアに割り当たるとは限らないようで放置プレイでは性能でない。
0582デフォルトの名無しさん
2009/06/23(火) 16:54:00環境変数でCPUバインドっていうのは、別にWindowsに限らず他も同じだと思う。
Intel FortranだとKMP_AFFINITY、PGI FortranだとMP_BLISTかな。
というか、いい加減環境変数の設定とかをユーザにやらせるんじゃないくて、
コンパイラがシステム構成を見ながら勝手に使うCPUを指定してくれればいいのに…。
どういうスレッドの配置が効率がいいかなんて、予想できそうなもんなのに。
0583556
2009/07/09(木) 23:41:32最近になって、Intel掲示板を見ていてようやく分かったが、オプションをつけないと
駄目らしい。
/assume:realloc_lhs
これをつけるとFortran2003解釈、つけないとFortran90/95解釈になるらしい。
0584デフォルトの名無しさん
2009/09/07(月) 13:50:420585デフォルトの名無しさん
2009/09/08(火) 07:43:50お、参考にしよう。
おまけ・・・になるのか知らないけどw
メインがCでFortranコードをサブルーチンとして呼び出してリンクするときは
締めの実行ファイル生成時には icc でリンクして実行ファイルつくってもいいけど、ifort で
ifort -nofor_main -no-ipo
ってやると振る舞いが礼儀正しい事が多い、気がする。
-no-ipo はリンクするときだけね。これがないとifortは無茶をするようだw
0586デフォルトの名無しさん
2009/09/27(日) 01:29:320587デフォルトの名無しさん
2009/09/27(日) 05:35:56gfortranで例えば自己完結している共有オブジェクト(.soファイル)って
作れるもんなの?
一々$(cernlib -G Motif mathlib)をつけてコンパイルするの
面倒くさい。
ライブラリ作ったこと無いんでアレゲな文章だが、もし誰かわかるのなら。
ちなみに、OSはUbuntu8.04な。
0588デフォルトの名無しさん
2009/09/27(日) 07:43:50http://wwwasdoc.web.cern.ch/wwwasdoc/shortwrupsdir/b100/top.html
のラッパーとして
http://gist.github.com/194480
というのを書いて
program main
use FunctionBinom
implicit none
integer::x,y
x=5
y=2
print *,binom(x,y)
end program
でコンパイルしてみると(もち、$(cernlib mathlib)はつけて)
/tmp/ccdsgC3z.o: In function `__functionbinom__binom_integer':
binom.f95:(.text+0x14): undefined reference to `kbinom_'
/tmp/ccdsgC3z.o: In function `__functionbinom__binom_double':
binom.f95:(.text+0x34): undefined reference to `dbinom_'
/tmp/ccdsgC3z.o: In function `__functionbinom__binom_real':
binom.f95:(.text+0x54): undefined reference to `rbinom_'
collect2: ld returned 1 exit status
というエラー出る。何で参照先が無いのかさっぱりわからない。
0589デフォルトの名無しさん
2009/09/29(火) 00:00:44よく知らんが、関数呼び出しの名前規約が食い違っているとか。
エラーメッセージを見る限り、小文字でアンダースコア末尾付与の形式で
オブジェクトを探しに行っているが、確かに存在しているのかね?
名前一覧とか出力させるとか、バイナリエディターで直接のぞいてい見るとか。
0590デフォルトの名無しさん
2009/09/29(火) 03:11:28つけとく、とか
interface 文で前もって引数部を教えてあげるとか、
_binom みたく下付線つけとくとか、かなあ・・・違うな。う〜ん。
0591デフォルトの名無しさん
2009/09/29(火) 22:56:52>関数呼び出しの名前規約が食い違っているとか。
他の関数(例えば、票にもあるATGという関数)だとエラー無くできるし、
自分がマニュアル読む限り名前規約の話もないのよね。
>名前一覧とか出力させるとか、バイナリエディターで直接のぞいてい見るとか。
バイナリエディタは避けたい。名前一覧どうやって出力させればいい?
>>590
モジュラー性上げたいのでexternalを使いたくないのよ。
引用仕様記述は書いてあるよ。
0592デフォルトの名無しさん
2009/09/29(火) 23:04:23CERNLIBとかは使わず、何のライブラリ使っているの?NAG?
フリーであるならそのライブラリのラッパに鞍替えするわ。
0593デフォルトの名無しさん
2009/09/30(水) 10:40:07他人のライブラリなんか遅くて使えないし
0594デフォルトの名無しさん
2009/09/30(水) 12:41:03なぬ。それスパコン業界の一般論?>>593が自作好きというわけじゃなく?
新しいアルゴリズムで作る、というのならわかるのだけれど、
それ以外の速度的にもう上げられないだろう、上げる必要も無いだろう的
関数も自作かい。
0595デフォルトの名無しさん
2009/09/30(水) 15:42:43スパコンのアーキテクチャによって最適なアルゴリズムは違うだろうし。
x86なスパコン(クラスタというべきか?w)なら適当な余所様のライブラリでいいかもしれないけど。
0596デフォルトの名無しさん
2009/10/01(木) 02:38:44>バイナリエディタは避けたい。名前一覧どうやって出力させればいい?
ライブラリアン用のコマンドを使えば、一覧出せると思う。
メインフレームなら出来たw
>>594
ライブラリはその性質からどうしても汎用だから、自分の問題に合わせた
特殊条件を使って早くすることはあるな。
0597デフォルトの名無しさん
2009/10/01(木) 12:47:41ライブラリは確かに汎用的じゃないといけないわな。
行列ソルバ、つーか固有値計算は興味深い。
アルゴリズム色々調べているけど、最新のアルゴリズムってなによ?
まぁ特許とられて普通に使えないんだろうけど。
よく知らないけれど、アルゴリズムに特許はかけられるよね?
アルゴリズムを実装したアプリケーションに対してのみ特許かけられるんだけっけ?
0598デフォルトの名無しさん
2009/10/01(木) 12:48:45>ライブラリアン用のコマンドを使えば、一覧出せると思う。
お礼言うの忘れてた。トンクス!
0599デフォルトの名無しさん
2009/10/01(木) 13:13:45そんなふうに考えていた時期が(ry
0600デフォルトの名無しさん
2009/10/06(火) 10:10:52write(*,*) '600 get'
600 continue
0601デフォルトの名無しさん
2009/10/10(土) 13:11:05interface iface
integer function func(i, j)
integer :: i, j
end function func
end interface iface
end module mod
integer function func(i, j)
use mod
integer :: i, j
func = i * j
return
end function func
program main
use mod
print *, iface(10, 20)
end program main
-------------------------------------------------------
func = i * j
1
Error: Name 'func' at (1) is an ambiguous reference to 'func' from current program unit
上記のようなエラーがでてコンパイルできません
moduleを使わない、あるいはfunctionではなくsubroutineならコンパイルできました
ひょっとして総称名はfunctionには使えないんでしょうか?
0602デフォルトの名無しさん
2009/10/10(土) 14:29:25integer function func(i, j)
の中の
use mod
が不要なのでは
0603デフォルトの名無しさん
2009/10/10(土) 15:44:58できました。ありがとうございます
参考にしたサイトが間違っていたようですね
0604デフォルトの名無しさん
2009/10/10(土) 16:32:590605デフォルトの名無しさん
2009/10/10(土) 22:01:30だったらそのサイトのURLを教えて欲しい
0606デフォルトの名無しさん
2009/10/10(土) 22:03:420607デフォルトの名無しさん
2009/10/10(土) 22:14:02ttp://www.geocities.jp/eyeofeconomyandhealth/homepage/module2.html#t
ここなんだけど副プログラムのほうにもuseしろって書いてありました
0608デフォルトの名無しさん
2009/10/13(火) 03:37:160609デフォルトの名無しさん
2009/10/14(水) 00:33:47module mod
contains
real function call_func(func, arg)
interface
real function func(arg)
real, intent(in) :: arg(2)
end function func
end interface
real, intent(in) :: arg(2)
call_func = func(arg)
return
end function call_func
end module mod
real function func(arg)
real, intent(in) :: arg(2)
func = arg(1) * arg(2)
return
end function func
program main
use mod
external func
real :: arg(2) = (/ 2.0, 3.0 /)
! dummy = func(arg)
print *, call_func(func, arg)
stop
end program main
0610デフォルトの名無しさん
2009/10/14(水) 00:36:31コメントアウトするとなぜかコンパイルすらできません
理由がさっぱりわからないんですが、なにが問題なんでしょうか?
コンパイラはgcc 4.2.4
エラーメッセージは↓です
print *, call_func(func, arg)
1
Error: Type/rank mismatch in argument 'func' at (1)
0611デフォルトの名無しさん
2009/10/14(水) 00:43:12Intel VF 11.046 なら通る。
0612デフォルトの名無しさん
2009/10/14(水) 01:54:59gccコンパイラのバグということでしょうかね
汎関数を引数にもってる関数の総称名をつけようとするとコンパイルできなかったり(これは仕様?)
0613デフォルトの名無しさん
2009/10/14(水) 03:35:23PRINT文のバグ臭いな。
FUNCTIONの返り値が、VALUEなのかADDRESSなのか今一不明なので
77時代からFUNCTIONの返り値を代入を経ずに使うと、機種依存の振る舞いを
することが良くあった。
最近は大丈夫なことが多いが。
関数引数の総称名は、IVFでは出来た。多分、仕様上では出来ておかしくないと思う。
MODULE m_unko
INTEGER, PARAMETER :: kd = SELECTED_REAL_KIND(14)
INTERFACE gen
MODULE PROCEDURE sub1, sub2
END INTERFACE
ABSTRACT INTERFACE
REAL FUNCTION x_f(a)
REAL, INTENT(IN) :: a
END FUNCTION x_f
REAL(kd) FUNCTION d_f(a)
IMPORT
REAL(kd), INTENT(IN) :: a
END FUNCTION d_f
END INTERFACE
0614556
2009/10/14(水) 03:36:04REAL FUNCTION sub1(f, x)
REAL, INTENT(IN) :: x
PROCEDURE (x_f) :: f
sub1 = f(x)
RETURN
END FUNCTION sub1
REAL(kd) FUNCTION sub2(f, d)
REAL(kd), INTENT(IN) :: d
PROCEDURE(d_f) :: f
sub2 = f(d)
RETURN
END FUNCTION sub2
END MODULE m_unko
!
PROGRAM unko
USE m_unko
REAL :: x
REAL(kd) :: d
PROCEDURE (x_f), POINTER :: f
PROCEDURE (d_f), POINTER :: g
x = 4.0 * ATAN(1.0)
d = 4.0_kd * ATAN(1.0_kd)
f => SIN
g => DSIN
PRINT *, gen(f, x)
PRINT *, gen(g, d)
STOP
END PROGRAM unko
0615デフォルトの名無しさん
2009/10/14(水) 21:01:13サンプルコードありがたいんですが、コンパイルできませんでした
abstract interfaceのところで最初のエラーがでるので原因を調べたんですが
hpとintelのマニュアルを検索してもabstract interfaceの項目が見つからりませんでした・・・
0616デフォルトの名無しさん
2009/10/15(木) 01:08:20ABSTRACT INTERFACE はF2003の機能で、まだIntelのHelpに載ってないが、実装されている。
Crayとか(多分)IBMのマニュアルなら載っていると思う。まぁ素直にFortran95/2003 Explainedを
見るのがいいと思うが。GoogleBooksでもページが飛ばされてなければ見られる。
しかし、これは本質ではない。二度Interfaceを書くのが面倒だったから使ったまで。
これならどうだべ?
MODULE m_unko
INTERFACE gen
MODULE PROCEDURE sub1, sub2
END INTERFACE
CONTAINS
REAL FUNCTION sub1(f, x)
REAL, INTENT(IN) :: x
INTERFACE
REAL FUNCTION f(x)
REAL, INTENT(IN) :: x
END FUNCTION f
END INTERFACE
sub1 = f(x)
RETURN
END FUNCTION sub1
0617デフォルトの名無しさん
2009/10/15(木) 01:09:15REAL, INTENT(IN) :: x
INTERFACE
INTEGER FUNCTION f(x)
REAL, INTENT(IN) :: x
END FUNCTION f
END INTERFACE
sub2 = f(x)
RETURN
END FUNCTION sub2
!
REAL FUNCTION rmult2(x)
REAL, INTENT(IN) :: x
rmult2 = 2.0 * x
RETURN
END FUNCTION rmult2
!
INTEGER FUNCTION imult2(x)
REAL, INTENT(IN) :: x
imult2 = INT( 2.0 * x )
RETURN
END FUNCTION imult2
END MODULE m_unko
!
PROGRAM unko
USE m_unko
REAL :: x
x = 4.0
PRINT *, gen(rmult2, x)
PRINT *, gen(imult2, x)
STOP
END PROGRAM unko
0618デフォルトの名無しさん
2009/10/15(木) 18:46:55有難うございます。コンパイルできました。完璧です
主プログラムにinterfaceを書く方法は見つけたんですが
moduleにくくってしまえばinterfaceを書かなくてもできるんですね
0619デフォルトの名無しさん
2009/10/16(金) 08:07:090620デフォルトの名無しさん
2009/10/16(金) 08:50:160621デフォルトの名無しさん
2009/10/16(金) 23:00:56実行ファイルの設定をg77.exeからgfortran.exeに変えるだけでok?
もし、そのほかに設定事項等あれば教えて欲しい
0622デフォルトの名無しさん
2009/10/17(土) 20:44:18c++とかでいうインスタンスを作ることはできないんでしょうか?
0623デフォルトの名無しさん
2009/10/17(土) 22:43:57F2003なら出来る。F95以前では出来ない。
0624デフォルトの名無しさん
2009/10/17(土) 23:13:19とりあえず、IVF 11.1 では通った
誰か Fortran 95/2003 Explained の日本語訳作って
module mod1
implicit none
type Circle
real :: d
contains
procedure :: area => func1
end type Circle
contains
real function func1(this)
class(Circle) :: this
func1 = (this%d ** 2) * 3.14 / 4.0
end function func1
end module mod1
program main
use mod1
implicit none
type(Circle) :: c
c%d = 10.0
print *, c%area()
end program main
0625デフォルトの名無しさん
2009/10/18(日) 16:52:26ありがとうございます
残念ながらgfortranでは2003が使えないようなので試せませんが・・・
0626デフォルトの名無しさん
2009/10/19(月) 14:40:01イラネって意見も散見するが・・・
0627デフォルトの名無しさん
2009/10/19(月) 16:11:220628デフォルトの名無しさん
2009/10/19(月) 17:25:58それで速度が落ちるならイラネ。落ちそうな気しかしないけど。
中田育男『基礎FORTRAN』(岩波書店)のコラムに
FORTRANでもCOMMON文とENTRY文を使って、オブジェクト指向設計に
従ったプログラムを書くことができる。
とあったけど、具体的なことは何も書いていなかった。
0629デフォルトの名無しさん
2009/10/19(月) 17:54:29「オブジェクト指向入門」34章にあるようだ
http://www.seshop.com/detail.asp?pid=9505&mode=spec
俺は初版しか読んでないけど、今でも事情は変わらんでしょ
0630デフォルトの名無しさん
2009/10/19(月) 20:01:44読んでみたいけど、ちょっとお値段が・・・
そういやまともなオブジェクト指向の本を読んだことは一度もないや
良い機会だから買ちゃおうかしら
0631デフォルトの名無しさん
2009/10/19(月) 20:18:28> COMMON文とENTRY文を使って、オブジェクト指向設計に
なぜかはわかりませんが、イヤな予感しかしません・・・
0632デフォルトの名無しさん
2009/10/19(月) 20:42:47安全でないOOPなんてOOPのメリットないに等しいし・・・
素人は大人しくJavaやC#使うほうが幸せになれる
0633デフォルトの名無しさん
2009/10/19(月) 21:13:30初版のはFORTRAN77でトリッキーなカプセル化をする話だけだったから
たぶん>>631>>632の言う通り
今実際どうなのか
俺は2003とか不勉強なんでわからん
0634デフォルトの名無しさん
2009/10/20(火) 00:37:24そういわず、2003を勉強しようぜ!
ばりばりOOPでなくても
TYPE の拡張とかが、入れ子じゃなくて、同じ深さで構造体のメンバーを増やせるし。
OOPでない部分でも結構拡張があって便利。
日本語 パワポ
ttp://www.itscj.ipsj.or.jp/forum/forum2008SC22fortran/Fortran20032008.pdf
英語
ftp://ftp.nag.co.uk/sc22wg5/N1551-N1600/N1579.pdf
0635デフォルトの名無しさん
2009/10/20(火) 01:07:43暴力的な書き方だけど、「因果関係が一意」という点では同じだし。
C++しか扱ったことないしあまり深く触らなかったからだけど、
OOPの深淵に辿り着かないと判らない機微もあるのだろうけどな。
0636デフォルトの名無しさん
2009/10/20(火) 02:20:34どんな感じのことを言ってんすか?
簡単に教えてくだしあ
0637デフォルトの名無しさん
2009/10/20(火) 05:21:22たいした話じゃなくて
ENTRY文をメソッドの代わりにしてカプセル化をまねるだけ。
継承とかそういう話はないし、動的にオブジェクトを作れるわけでもない。
本来の使い方でもないから危なっかしい。
ただ、それでも素のPascalよりは気がきいてるってことなんだなw
今じゃ2003もあるし
第二版はどうなってるか知らないよ。
0638デフォルトの名無しさん
2009/10/20(火) 05:43:47自分で書く分にはOOPは邪魔なだけだよ
OOPが真価を発揮するのは他人のライブラリを使うとき。
0639デフォルトの名無しさん
2009/10/20(火) 12:58:28COMMONの代わりに、共有変数を実現するのに、77でENTRY使ったが、かえってめんどかったw
0640デフォルトの名無しさん
2009/10/21(水) 10:41:26thx
2003でOOPを謳ってるってことは、ある程度まともには作られてんだろうね多分。
アドレス指定で偶然にそのインスタンスを破壊しちゃう、なんてリスクはないように
出来てるんだろう・・・(どうやって実現してんのかさっぱり想像できないけど)
0641デフォルトの名無しさん
2009/10/21(水) 21:31:44簡単なシミュレートで
open(10,file='testout.out',status='unknown',form='formatted')
do n=0,nmax
計算略
write(10,30) t, a(1),a(2),a(3)
30 format(1H ,4(1pe12.4))
enddo
こんな感じで配列の値を表示しようと思うのですが
なぜか出力ファイルが改行されません><
g77でコンパイルしています。コンパイルはできるのですが・・・
どなたかファイルに出力するときの改行の仕方をご教授していただきたいのです
お願いします
0642デフォルトの名無しさん
2009/10/22(木) 18:39:19出力ファイルをdosに直してませんでした
自己解決しますた
フォートランはフォーマット文がわかりにくいなぁ
0643デフォルトの名無しさん
2009/10/24(土) 00:54:54FORMATの書き方が古い。
まぁg77だから仕方ないのか。
f90で学びなおせばFORMATもそれほどつらくない。
0644デフォルトの名無しさん
2009/10/24(土) 03:17:580645デフォルトの名無しさん
2009/10/24(土) 03:48:06使えない。
0646デフォルトの名無しさん
2009/10/25(日) 00:06:12大きくCOMMONを取って、必要に応じて自分で切り出して使うんだ。
0647デフォルトの名無しさん
2009/10/25(日) 00:56:39大きくCOMMONがとれない環境なのです。
allocateしないと最大メモリまで使えない。
0648デフォルトの名無しさん
2009/10/25(日) 16:16:54むかし過渡期の技術としてダイナミックコモンというのがあった。
ひょっとしたらコンパイラのオプションにあるかもしれない。
その場合、普通のスタティックなコモンより大きく領域が取れるかもしれない。
0649デフォルトの名無しさん
2009/10/27(火) 14:20:53そんなこと教えちゃらめ〜
0650デフォルトの名無しさん
2009/10/28(水) 20:57:22実際に使われるサイズに関わらず?
0651デフォルトの名無しさん
2009/10/29(木) 00:56:45多分誤解。
静的配列と比べるならば、それは実行時にアロケート処理するのだから余計な時間はかかるだろう。
しかし、それは計算時間に比べれば瑣末なはず。
POINTERで配列をとった場合は、メモリーの割付が連続したメモリー領域になるとは限らないので
最適化がバリバリなされず、ALLLOCATEでとった場合(連続にメモリーを取る)とくらべて
パフォーマンスが落ちる可能性があるとは言われている。
0652651
2009/10/29(木) 02:15:09POINTERにALLOCATEしたときは連続にメモリーを取るだろうが、
POINTERには、ストライド付きのとびとびメモリーを指示させることもできるので、
最適化には制限が係ることがあるようである。
0653デフォルトの名無しさん
2009/10/29(木) 10:15:13なる〜。Fortran77で
i=10000
call hairetu(i)
subroutine hairetu(i)
integer i
real data(i)
みたいな使い方で任意の大きさの配列data()をサブルーチン内で扱えるけど、
これがメモリ上でキチンと並んでいるとは限らない(とんだ部分
の取り扱いはOSがするのか?)からね。
77より後のallocatable属性は、出来るだけ連続して確保してね、の
おなじないというか願掛けと思えばいいのだろうな。
0654デフォルトの名無しさん
2009/10/29(木) 10:49:44moduleが使う変数や関数、サブルーチンを外部から指定したいのですが可能でしょうか?上のコードは間違ってますが雰囲気を掴んでもらえたらいいかなと思い載せました
0655デフォルトの名無しさん
2009/10/29(木) 21:41:04じゃあもうallocate使わない理由はないな
コードも綺麗になるしな
0656デフォルトの名無しさん
2009/11/02(月) 01:28:57まだ2003も碌にコンパイラが無い時点で言っても鬼も大笑いだが。
0657デフォルトの名無しさん
2009/11/02(月) 01:52:59FORTRAN95/2003 Explained 20.2.1 p.331
"A non-pointer array occupies a sequence of contiguous storage sequences 云々"
とあるので、ALLOCATABLE 配列や AUTOMATIC 配列は、連続メモリーが保障されているんじゃないかな。
■ このスレッドは過去ログ倉庫に格納されています