くだすれFORTRAN(超初心者用)その6

■ このスレッドは過去ログ倉庫に格納されています
2012/08/16(木) 20:58:00.31
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
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/
2012/10/16(火) 23:35:22.01
>>82
うむ。
i0ってF2003からの機能だと思っていたが、F95から入ってたんだな。
勘違いしてたわ。
一応F95標準縛りをかけていたつもりだったので避けたが、i0 で楽勝だな。
2012/10/17(水) 00:21:39.81
>>78
思いつくものを挙げてみると...

write(filenumber, '(a, i0, a)') 'plot "output[', i, '].txt" u 1:2'
write(filenumber, '(a, i0, a)') "plot ""output[", i, "].txt"" u 1:2"
write(filenumber, '(a, i0, a)') "plot " // char(34) // "output[", i, "].txt" // char(34) // " u 1:2"
write(filenumber, '(a, a1, a, i0, a, a1, a)') "plot ", 34, "output[", i, "].txt", 34, " u 1:2"
write(filenumber, '(13hplot "output[, i0, 12h].txt" u 1:2)') i
2012/11/18(日) 12:45:02.25
バッチファイルをそのまま生成させるって頭いいな
86デフォルトの名無しさん
垢版 |
2012/11/23(金) 13:59:34.03
質問です。
配列を引数にする関数を定義したいのですが、
やり方がよくわかりません。

function FD(w)
implicit none
integer :: i
integer,parameter :: n = 10
real(8) :: w(0:n),FD(0:n)
do i = 0, n
FD(i) = exp( - w(i))
enddo

end function FD

が関数で、これをメインプログラムで使いたいのですが、
x = FD(w)
のような省略形だとちゃんと計算できるんですけど、
do i = 0, m
x(i) = FD(w(i))
enddo
みたいに配列を明示しようとすると
配列の形状が準拠していません。
とエラーが出ます。

()を省略しないで書く方法はないですか?
2012/11/23(金) 16:37:12.25
>>86
w(i)は配列ではなく配列の要素(1個の変数)ですので
当然エラーとなります。
do i = 0, m
x(i) = FD(w(i))
enddo
の3行を、
x(:) = FD(w(:))
にすれば()付きの書き方にはなります。
2012/11/23(金) 18:30:14.20
>>87
回答ありがとうございます。
まだ、違いがよくわからないのですが
例えば、

do i = 0, m
x(i) = FD(w(i)) + y(i+1)
enddo

とか

do i = 0, m/2
x(i) = FD(w(i))
enddo
do i = m/2, m
y(i) = FD(w(i))
enddo

のようなことは関数の場合、出来ないのですか?
(:)だと出来ることが制限されてしまうような気がするんです。
2012/11/23(金) 19:46:12.45
>88

x(0:m) = FD(w(0:m)) + y(1:m+1)

とか

x(0:m/2) = FD(w(0:m/2))
y(m/2:m) = FD(w(m/2:m))

となるかな
2012/11/24(土) 14:54:58.79
それか関数の方を 配列じゃなくて 数値を引数とするように変更するかだな
2012/11/26(月) 19:24:40.40
fortran95 以降になるが、ELEMENTAL属性を使えばできる。
これはスカラーに対して定義しておくと、配列も受け付けるというもの。
ただし副作用のない PURE な副プログラムな必要がある。

elemental pure real(8) function FD(w)
implicit none
integer :: i
real(8), intent(in) :: w
FD = exp( - w )
end function FD

これでメインルーチン側で
x = FD( w )
と呼んでも
do i = 1, 10
x(i) = FD( w(i) )
end do
と呼んでもよろしい。
PURE が何かはマニュアルを見るか、鋼鉄天使くるみPUREを見る事。
シスタープリンセスREPUREでもいい。
2012/12/01(土) 20:48:26.42
ELEMENTAL属性ってのは初めて聞いた 勉強になります
兄ぃありがとう
2012/12/02(日) 15:08:21.56
(ELEMENTALはPUREでもあるから強調しなくてもいいんだけどな…
94デフォルトの名無しさん
垢版 |
2012/12/02(日) 16:57:51.30
x(:)=fd(w(:))
x=fd(w)

って同じ?
: つけとかないと配列であることを
忘れちゃうので
つける習慣にしているけど。
2012/12/02(日) 17:13:25.97
同じだけど、括弧をつけて配列であることを明示したほうがいいね
2012/12/03(月) 19:08:16.44
>>93
どっこい、それがF2008でELEMENTALだがI/Oを許すという風になったので、
ELEMENTALだからと言ってPUREとは言えなくなったのだよ。
妹たちの未来を考えて、ここはPURE。

>>95
これもF2003からは同じではなくなったのだよ。
RAEL,ALLOCATABLE :: a(:)
REAL :: x(100)
a = x
F2003では代入時に割り付け配列は、(再)割り付けされる。
a = x(1:10)
とすると、a はサイズ100から10に再割り付けされる。
a(:) = x(1:10)
の時は、元のサイズ100のまま代入される。

抽象度の高い記法の方が良いのだから、括弧をつけない方が正しいと思う。
F77からの移行期には、括弧を書いて置く方がわかり易かったのは理解できるが
数学だって行列を記号1個で書いて間違わないのだからだいじょぶDEATH
2012/12/03(月) 23:06:44.99
(キリッ
2012/12/04(火) 13:45:46.84
>>96
2003使ったことないけど、うーんと、
要は allocatable な変数は
allocate() 使わなくても、
: 無しで左辺において、
固定サイズ(か既に大きさの確定した配列)が右辺に来る代入式で
随時 deallocate して再び allocate した事にする、
ということなのかな?

・・・・すくなくともワシには危険な香りがするw
2012/12/04(火) 13:48:18.15
ふとおもったけど、文字列で
mojiretsu='abcdefg'
write(*,*) mojiretu(2:4)
で bcd が表示できる例のように
文字列の番地管理の表記法って77からある(とおもうw)けど
これってかなり時代先取りだよね。偶然なのか
規格策定の時にすでにベクトル表現の思考が始まっていたのか
しらないけど。
2012/12/04(火) 17:50:34.81
>>98
2003ではおっしゃる通り、サイズの違う配列が右辺に来ると、勝手にDEALLOCTAEして
右辺のサイズにALLOCATEし直して代入する。
Intel Fortranではデフォルトのオプションでこの機能が切られている。

最近の言語は動的なんちゃらで、みんなそんな感じだから流行り?
危ないけど便利。

>>99
90からはwrite(*,*) 'abcdefg'(2:4)と定文字列?でもできるぞ。
2012/12/05(水) 13:45:40.15
へえ、しらんかった。
でも、どういう場面でつかうんだろう?

i=2
write(*,*) 'shit'(i:4)

とか、・・・英語複数形 s をだしたり隠したり、かな?
でも正直なところ、なくても困らんな。
10288
垢版 |
2012/12/05(水) 18:22:09.77
88です。みなさんありがとうございます。
お礼が遅くなってすみませんでした。
まだ難しくてよくわからないので、素直に括弧つけます。
2012/12/06(木) 14:46:49.96
>>100 最近の言語は動的なんちゃらで、みんなそんな感じだから流行り
だろうね・・・でも量が多いと遅くなりそう。
そういう動的なことは Interactive な言語処理系でやればいいことで、
やることの量がだいたい前もって決まっていることを
なるべく早くたくさんがーっと処理したい、というのが Fortran 人wなので
・・・でもこのままでは老害って言われるし・・・うーん、むつかしいね。
2012/12/06(木) 15:58:43.84
ヤングの諸君を引き寄せるには、ある程度流行りの機能を入れないとまずいんだろう。

それに動的自動割り付けは、FUNCTIONで不定個数を返せるようになったので、
それを受け取るには無いと困るというのがあると思う。

REAL :: x(10)
REAL, ALLOCATABLE :: y(:)
CALL RANDOM_NUMBER(x)
! f90
ALLOCATE( y( COUNT(x > 0.5) ) )
y = f(x, 0.5)
PRINT *, y
! f2003
y = f(x, 0.5)
PRINT *, y

CONTAINS

FUNCTION f(x, a)
REAL, ALLOCATABLE :: f(:)
REAL, INTENT(IN) :: x(:), a
f = PACK(x, x > a)
END FUNCTION

END
この例はあらかじめ必要な配列の大きさが分かるが、計算してみないと
必要な配列の大きさが分からない場合は、大きめに取っておくか
二回計算する必要がある。
2012/12/06(木) 17:15:11.18
可変長文字列も動的割り付けで可能になった。
program varchar
implicit none
character(len = :), allocatable :: text
text = 'automatic allocation'
print *, text
text = 'variable length text'
print *, text
stop
end program varchar
2012/12/06(木) 17:49:33.18
長さ同じだぞw
2012/12/08(土) 17:47:52.98
モジュール内で定義したグローバル変数を
プログラム内で変更しないようにするにはどうしたらよいでしょうか?
(変更があったらエラーを吐くようにしたい)

parameter属性を付けるのが近いと思いますが、
そのグローバル変数はファイルからreadで読み込みます。
つまり、最初に一回だけファイルで読み込んで、
その後は変更せずに、各サブルーチンで参照できるようにしたいです。
2012/12/08(土) 23:34:47.37
>>107
ttp://www.nag-j.co.jp/fortran/fortran2003/Fortran2003_4_3.html
2012/12/10(月) 21:50:33.71
F2003でいいならprotected属性だな。
F90だったら、privateで隠匿して、値を使うところでは関数・サブルーチンで
値を取ってくるかな。
2012/12/11(火) 12:57:04.37
protected つかわない、つかいたくない、つかえない
という時には他には intent(in) をあちこちに配置して
いちどどこかプログラム内で初期値設定した後は変えないようにする、って
手もあるけどこれは107さんの要望とはマッチしないなぁ。

protected がいちばん素直だとおもう。
2012/12/15(土) 21:23:37.92
もりあがってますね
2012/12/16(日) 16:37:19.87
月に一個くらい質問というかお題投下があって
2週間くらいで20スレいく程度で
まったりと
2012/12/18(火) 04:20:26.48
f90から外部モジュールでf77を呼べますか? つまり固定形式で書かれたコードを外部モジュールで呼べるかってことなんですけど
2012/12/18(火) 14:41:34.63
ん、コンパイル別々にしてリンクすればいいとおもうよん。

f77の継続行記号(6ケタ目の空白以外の任意文字)を継続前の行の最後の & に置き換える
だけで、原則f77はf90で解釈できるので、
そこだけいじって同じファイルに追加しちゃうという手もあるけどね。
2012/12/18(火) 14:41:50.10
呼べる。
module f77module

contains
.....
 ここにサブルーチン、関数ならべる。
....
end module f77module

固定フォーマットの独立したファイルにして分割コンパイルすればよし。
2012/12/19(水) 01:27:05.28
旧形式のコードて今でも普通に書かれてるの?
仕方なく再利用してるだけで、新しいコードは全部新しい文法で書くべき?
2012/12/19(水) 13:23:10.08
> 旧形式のコードて今でも普通に書かれてるの?
わしゃバリバリ固定書式で書いている。
左7つ開けとかないとムズムズするのでw
> 新しいコードは全部新しい文法で書くべき?
書くべきだとおもう!
思うが・・・・
2012/12/19(水) 17:31:47.38
>>115
おおー、ありがとーございます。
119デフォルトの名無しさん
垢版 |
2012/12/20(木) 00:16:24.69
>>114
ということは、その処理をすれば固定形式と自由形式の混在したソースコードも
コンパイルできるということですか?
2012/12/20(木) 00:56:53.25
新しい文法使ってもそれはそれで保守できるかという

自由形式として解釈できない固定形式の文法が継続行の扱いくらいかと
2012/12/20(木) 18:26:13.33
素直に固定形式のファイルと自由形式のファイルと分けた方が良いと思うズラ

f77時代は1個のファイルにまとめた方が、引数チェックや最適化のメリットが
あったが、f90以降は、MODULEとか使えば、分割コンパイルにそれほど害はないズラ
2012/12/21(金) 15:22:10.79
インテルだと
ifort -ipo
でファイルがバラバラでも最適処理してくれるよね。
2012/12/22(土) 20:57:03.97
コンパイラが偉い
2012/12/23(日) 16:26:05.54
>>122 ifort -ipo
インテルの中に
はじめの一歩の
母ちゃんのファンがいるに違いない
2012/12/25(火) 20:09:46.90
年内にインテルFortranの更新来ないのかな?二か月に一回の周期来てんだが。
block..end block を早く入れて欲しいわ。
たまに loop index を局所的に確保したい。頭部の宣言部が重くなりがち。
126デフォルトの名無しさん
垢版 |
2013/01/04(金) 12:57:56.98
下記のようなループの外でopenしてループの中で書き足していくプログラムを書いているのですが,
ifortでコンパイルした場合,実行の途中でもファイルが更新されていくのですがpgiでコンパイルした場合はプログラム終了まではファイルが更新されず,
プログラム終了時に全部書き込まれます.pgiでコンパイルした場合でもプログラムの途中で適宜ファイルが更新されるようにできるのでしょうか
open(1000, file='data.dat')
do j = 1, N
write(1000, *), j
enddo
close(1000)
2013/01/04(金) 16:35:30.00
fortran2003のFLUSH命令を使え。
128デフォルトの名無しさん
垢版 |
2013/01/04(金) 17:18:02.62
>>127
うぉー!ありがとうございます
2013/01/09(水) 11:54:21.56
linuxでfortran 77のコンパイラってありますか?
gfortranというのを使うらしいのでそれをインストールして試したのですが知人に貰ったfortran 77のコードがコンパイルできませんでした
2013/01/09(水) 12:25:08.67
>>129
gfortranは77に対応していません。

フリーってことでおk?
fortran77対応のフリーのコンパイラはg77が有名かな。
linuxならintel fortranもnon commercial版になるけどフリーであったはず。
研究や企業での利用はできないから注意。

個人的にはfortran77をいつまでも使っていないで、
90に書き換えて、折角インストールしたgfortranを使った方が良いと思う。
書き換え方は拡張子を変えるのと、改行の&ぐらいでとりあえずは動くでしょ
2013/01/09(水) 12:36:06.11
>>130
g77でコンパイルできました
ありがとうございます
2013/01/09(水) 17:25:39.34
gfortran って f77 コンパイルできないの?
f90 は f77 完全包括しているし、廃止事項をホントに廃止している
処理系はめったにないからオプション変えれば行けるんでね?
誰かおしへて。
133デフォルトの名無しさん
垢版 |
2013/01/10(木) 00:32:04.71
はじめからコードを倍精度で書くのと、コードは単精度でかいて倍精度はコンパイラのオプションに任せるのってどっちがやってる人多いのかな。
後者のメリットはコードがすっきりすることくらいか。
2013/01/10(木) 18:29:17.78
AUTODBLは、べた書きの定数の桁がどう扱われるのかよく分からんとか
微妙な精度の問題が気になってIMPLICIT DOUBLE(A-H,O-Z)に乗り換えたわ。

あと、昔のプログラムだと整数とからんだCOMMONやEQUIVALENCEの整合が狂って
謎な挙動をしたりするから困る。
2013/01/11(金) 01:47:02.97
>>132
g77の拡張機能つかってるコードをそうと知らずにgfortranでコンパイルしようとして互換性ないと勘違いした
136デフォルトの名無しさん
垢版 |
2013/01/12(土) 13:32:51.48
>>133
以前、同じことが気になったので、
中くらいの長さ200行ぐらいの単精度コードを手でw 倍精度化したのと、
コンパイルオプションで倍精度化したのを比べたことがある。
gfortran と ifort ではそれぞれで
実行バイナリが冒頭の一部分(コンパイル時刻?)以外は同一だった。
なので自作コードだけなら、違いはないか気にならない程度だとおもう。

third party library で
単精度と倍精度でサブルーチン名が違う場合があるので
その場合にどうなるか、はしらない。
137デフォルトの名無しさん
垢版 |
2013/01/12(土) 13:34:36.19
あと、OpenMP で並列化したやつもまったく同じだった。

MPI で並列したやつはまるで駄目だったので
これは泣く泣く手で倍精度に揃えたw
2013/01/12(土) 14:57:23.92
third party というかソースのない、かつ組み込みでない関数/サブルーチンは
変換できないし、規定されていない方の値を渡すと意味不明な挙動になるぞ。

なお対応する interface 定義が提供される module を use して総称名で呼ぶと
コンパイル時に型にあった引数定義のサブルーチンが選ばれるようになる。

MPI はこういうトリックとは関係なく、1要素の大きさを渡すあたりに工夫が要るかと。
139デフォルトの名無しさん
垢版 |
2013/01/14(月) 23:43:04.50
知り合いのMPIのコードは倍精度はコンパイルオプションに任せてたな
2013/01/15(火) 12:54:37.70
mpi_float を mpi_double に置き換えてくれるのかな?
MPI で単精度か倍精度が気になるのはその点くらいだよね
2013/02/09(土) 03:59:15.05
emacsのfortranモードについてなのですが、
変数宣言のあとに「::」をつけると、変数名に色がつくのが気に入っています。
ですが、改行すると色わけされません。
解決方法はありますでしょうか?

例、
integer :: i& ←色がつく
  ,j ←色がつかない
2013/02/09(土) 04:25:01.37
>>141
継続行を使わずに2行に分けて書くのはダメなの?
integer :: i
integer :: j
2013/02/09(土) 04:40:54.90
>>142
今はそれで対応しているのですが
なんとなく、同じグループの変数はまとめておきたいなと思いまして・・・
2013/02/09(土) 08:39:18.75
>>141
emacsの事は良く知らないけれど、f90.el内の
;; Variable declarations (avoid the real function call)
の次の行を編集すれば良いのでは?
あとemacsスレの方がレスが付き易いかも知れないね
2013/02/15(金) 04:06:55.05
>>144
返信遅くなってすみません。ありがとうございました。
146デフォルトの名無しさん
垢版 |
2013/02/15(金) 11:05:49.33
ずっと、fortran90メインで書いてたけど、Javaを触ってみようと奮闘したら、
訳わからん。書籍も分厚いのに、全部書いてある本ってあるの?少し違う事を
しようとしたら、必ずネットで調べらなあかん。fortranなら簡単に書けるのに。
Javaって新しい言語だから素人にもある程度優しいもんだと思ってたのは間違い
なの?自分がアホなんだろうなあ。プロの人ってすごいなあと、自らのアホさ
加減にへこむ日々。fortranで簡単にGUI使えたらJavaなんて要らないのに。
アホな書き込みすいません。
ああああああああ、だめだw。いらつかない。いらつかない。
2013/02/15(金) 20:00:07.57
Fortranとかいうアホ言語使ってるからそうなるんだ
C++を使いなさい
C++が使えるようになればJavaなんか簡単
2013/02/16(土) 12:55:18.74
GUI 書くのはどの言語でも(記述量はともかく仕様の理解に)手間だろ…。

>>147 ベターCじゃなくて真面目にC++ならな
2013/02/17(日) 23:13:36.88
>>146
なんでやねん
俺にすればJavaの方がFORTRANよりずっと簡単に思えるぞ
C#もだいたい似てる

使うコンピュータがメインフレームならJava、WindowsならC#がGUIが一番楽
というかメインフレームにはMonoすらない事が多いし

C#はDelphiの流れを受け継いでいるのとJavaやC++の良いとこ取りしている
ある意味卑怯な(?)言語なのでGUIはこれが一番早く完成する
2013/02/21(木) 10:17:06.63
ファイルを読み込んでcharacter型の変数に代入しようとしています。

一行の文字数が不定なときはどうすればいいですか?
あらかじめ要素数をおおきめに用意する以外でおねがいします。
151150
垢版 |
2013/02/21(木) 10:35:58.49
コンパイラーはintelの9.0です

あと、intelの非商用のコンパイラってもう配布されてないんですか?
2013/02/21(木) 23:40:21.69
>>150
//www.nag-j.co.jp/fortran/FI_18.html#AUTOTOC_18_4

>>151
linux用ならnon-commercial板があると思うが
2013/02/22(金) 01:40:20.99
1文字づつ読んで改行まで貯めこむしか無いんでないかな。

IVF9.0では無理だと思うがF2003なら、可変長文字列ではなく文字配列ならIVF9でも可かな。
program test
implicit none
character :: ch
character(:), allocatable :: buf
buf = ''
do
read(9, '(a)', end = 999, advance = 'no', eor = 8) ch
buf = buf // ch
cycle
8 print *, buf
buf = ''
end do
999 stop
end program test
154150
垢版 |
2013/02/22(金) 15:25:21.78
>>152
non commerical で検索したら見つかりました
ありがとうございます

>>153
buf=buf//ch
は代入するたびにallocateしなおしてるやつですか

intel の最新版はF2003に対応しているみたいなので
そっちを使ってみます
2013/02/22(金) 17:32:58.14
>>154
>は代入するたびにallocateしなおしてるやつですか
そう。大量で負荷が重いなら大きなbufferを取るしかない。

IntelFortranの場合F2003文法はデフォではOFFになっているので
standard-semantics をONにする必要があるかも。
配列の場合
buff = [buff, ch]
で配列要素数を拡張していけるが、この場合はオプション必要。
2013/02/25(月) 11:52:14.65
実行時間を計測することはできると思いますが

使用したメモリの最大値を計測することはできませんか?

コンパイラはintelです
2013/02/25(月) 15:41:26.94
Linux なら ps をじっと眺めているw
Windows なら task manager のグラフを眺める。
2013/02/28(木) 02:15:09.70
include文やuse文で読み込むインクルードファイル、モジュールファイルを
別ディレクトリにおいてコンパイルしたいのですが、
インクルードパスの設定方法がわかりません。
コンパイラはifortです。

ifort -I***
***に絶対パスを入れたり、相対パスを入れたりしたのですがダメです。
そもそも、-I/でタブ補完しようとすると
-I/ is not found.と出てきます。
何か別の設定が必要なのでしょうか?
インクルードファイルがあるディレクトリは、カレントディレクトリの中にあります。
2013/02/28(木) 11:49:02.22
fortranの出力指定子でマニアックなものまで全部のってるサイトを教えてもらえないでしょうか

例えば0.005を↓のように出力する指定子を探しています
5.000000000000000-3
2013/03/01(金) 01:51:15.14
>>159
EN(工学用)なら3乗おきに出力できたはず
0.005なら単純に科学系のES記述子でもできる
いつから在るか知らないけど、最近の本(自分が買ったのは5年前)には普通に載ってたよ
Webサイトなら"Fortran 編集記述子"で検索すれば色々出てくるけど、
自分の環境で使える記述子を全部知りたいならコンパイラのリファレンスが一番確実
2013/03/01(金) 17:51:51.58
少しはマニュアル読めよwww
2013/03/02(土) 17:11:35.24
さっき始めたんですがわからないので教えてください
あるモジュールにサブルーチンが二つある時にこの二つのサブルーチンを違うファイルに記述することは出来ますか?
C++でいう名前空間のように分離できるか?ということです
2013/03/04(月) 19:17:12.36
名前空間を分けたいなら、まぁmoduleを二個使え。
USEでエイリアスをつけろ。

どうしてもというなら、一個のモジュールを二個のファイルに書くことは、
includeを使えば出来ることはできる。

またFortran2008で導入されるsubmoduleを使う手も考えられる。が、実装している
処理系はまだないと思う。
2013/03/06(水) 03:56:33.28
Fortranのcharacterって文字コード決まってたりする?環境依存?
2013/03/06(水) 15:22:28.31
内部コードは環境依存。
というか昔はIBMのEBCDICこそが本物コードでASCIIは安物ミニコンとかのパチモン文字コードだった。
ANSI FORTRAN77の時に内部コードの他にASCIIコードに対応させる関数が導入されてる。
2013/03/07(木) 16:59:58.06
スレチかもしれないけど

リスト構造を無限ループで回してるところを
openmpで並列化したいんだけどできます?
2013/03/07(木) 18:31:50.73
リスト構造といっても色々あるから答えようもないぜw

Fortranはデータパラレルには強いがタスク・パラレルは弱いけど、
OpenMPの新しい版ではタスク・パラレルできるから
リスト構造で枝分かれするところでタスク分割すればいいんでね?

順序入れ替えが無い線形リスト構造なら、配列に直せば元々高速になるし、
並列化の余地も大いにあると思う。
168デフォルトの名無しさん
垢版 |
2013/04/03(水) 15:36:38.02
print '(g20.12)', 1.d-100
とすると
0.100000000000E-99
と返してくれるのですが,

print '(g20.12)', 1.d-101
とすると
0.100000000000-100
のようにEが消えてしまいます.
これだとプロットのソフトによっては0.100000000000-100を-99.9と解釈してしまい困ってます.
どうすれば3桁以上の指数部分も正しく書けますか.
コンパイラはifortです.
2013/04/03(水) 18:33:16.72
>>168
こんなかんじかな。

program p
implicit none
integer :: i1,i2
real(8) :: d1,d2
character(10) :: s1
d1=-1d-105
i1=log10(abs(d1))
d2=d1*10d0**(-i1)
write(*,"(g25.16,f25.15,a)")d1,d2,"E"//i2s(i1)
contains
function i2s(ival)
integer, intent(in) :: ival
character(int(log10(dble(abs(ival))))+2) :: i2s
character(12) :: s1
write(s1,"(i12)")abs(ival)
if(ival.ge.0)then
i2s="+"//s1(12-int(log10(dble(abs(ival)))):12)
else
i2s="-"//s1(12-int(log10(dble(abs(ival)))):12)
end if
end function
end program
2013/04/03(水) 19:16:56.67
>>168
'(g20.12e3)'で指数部の桁数を指定するとか
171168
垢版 |
2013/04/03(水) 20:10:49.50
>>170
そんな仕様があったのか。知らんかった。
172169
垢版 |
2013/04/03(水) 20:12:16.82
ごめんミス。171は169です。
2013/04/22(月) 08:17:30.46
知らない仕様っていっぱいありそう
2013/05/05(日) 23:04:55.44
f90って継続記号は行頭ではなく行末でないといけないんですよね?
例えば、
equation = A&
     + B&
     + C
みたいな式があってCの寄与をみるためにコメントアウトするとき
たまにBの後ろの&をコメントアウトしわすれて面倒だったりしませんか?
絶対文頭につける仕様のほうが便利だと思うんですが・・・。
2013/05/06(月) 08:39:40.01
セミコロンで文末にできた気がする

equation = A&
     + B&
   ; ! + C  B から継続→文末、C の除外
2013/05/08(水) 18:56:23.29
10.000
100.00
1000.0
100000
浮動小数点を上記のように書き出したいのですが
どのように書式を指定すればよろしいでしょうか
177デフォルトの名無しさん
垢版 |
2013/05/15(水) 05:10:28.17
>>176
f?.* を使ってください。
?は全体の桁数、*は小数点以下の桁数。
2013/05/15(水) 05:16:35.51
私も質問です。

サブルーチンの引数に配列を使ったときに、実引数と仮引数でサイズのチェックが行われるような書き方、
あるいはコンパイルオプションはありますでしょうか?
例えば、実引数がa(0:imax)で仮引数がb(1:imax)のとき、エラーが出ずにコンパイルが通ってしまうことがあります。
その場合、実行結果がめちゃくちゃになるのにエラーが出ないのでデバッグに苦労しています。
内部サブルーチンのときはコンパイルエラーが出ますよね?
外部サブルーチン、あるいはモジュールでもエラーが出るようにできますでしょうか?
2013/05/15(水) 23:02:48.29
あるプログラム単位は、外部サブルーチンがどんな引数を取るかは知らん。
だから引数の整合性を確認するのは、プログラマの責任だった…のが FORTRAN77

Fortran90 から、interface ブロックで、外部サブルーチンがどんな引数を取るつもりか
定義をプログラムに書けるようになり、コンパイラのチェックを受けられるようになってる。
これだけではあまり意味はないが、module で定義を書き、その内容を use 文で
取り込むことで、複数ファイル間での一貫性が取れる構造となる。また、モジュール内
サブルーチンはわざわざ interface を書かんでも use されたプログラム単位からの
参照に対してチェックがかかるはず。

ちなみにインテル Fortran なら /warn:interface でうるさく言ってくるようだ。
2013/05/16(木) 03:39:55.72
>>179
ありがとうございます。具体例をあげます。
module_Aのなかに、サブルーチン1とサブルーチン2がcontainsされています。
module_Bのなかに、サブルーチン3がcontainsされています。

ケース1、
サブルーチン1でuse module_Bとして、サブルーチン3を呼び出します。
実引数はmodule_Aで宣言しており、x(0:imax)です。
仮引数はサブルーチン3で宣言しており、intent(out)属性をつけてx(1:imax)です。
この場合、コンパイルしてもエラーが出ませんでした。
2013/05/16(木) 03:42:38.83
つづき、

ケース2,
サブルーチン1でサブルーチン2を呼び出します。
実引数はintent(inout) :: y(1:imax)で仮引数はintent(in) :: y(0:imax)です。
この場合もエラーが出ません。

コンパイラはifortです。
できれば、これらのケースでのinterfaceの使い方を教えていただきたいです。
2013/05/17(金) 10:56:33.57
ftn95 で、以下のエラーメッセージの原因がわかりません。
(メッセージの意味ではありません)

Error 29, Call to missing rotine : _EXSUB at 0x00******.

主プログラム(main.f90)
program main
use interface_mod
implicit none
integer :: a,b
a=3; b=5
call exsub1(a)
call exsub2(b)
end program

外部サブルーチン(exsub.f90)
subroutine exsub1(r)
implicit none
integer, intent(in) :: r
real(8),dimension(r):: w
print *,w
end subroutine

subroutine exsub2(s)
implicit none
integer, intent(in) :: s
real(8),dimension(s):: x
print *,x
end subroutine
183182
垢版 |
2013/05/17(金) 10:57:14.45
(うえのつづきです)

インターフェイスモジュール(ifmod.f90)
module interface_mod
interface
subroutine exsub1(r)
integer,intent(in)::r
end subroutine

subroutine exsub2(s)
integer, intent(in) :: s
end subroutine
end interface
endmodule interface_mod
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況