FORTRAN W ..
[2ch|▼Menu]
751:デフォルトの名無しさん
10/07/08 19:29:00
レスありがとうございます

>>750
対象としている行列は疎行列です。
使ったのはmklの中にある
pardiso(並列化対応直接法スパース ・ ソルバー)と
dss(直接法スパース ソルバー)です。

>>747-750
すべて試してみましたが解決はできませんでした。。。
あと、ソースは複数あります。

752:デフォルトの名無しさん
10/07/09 00:21:22
>>746
元がスパースでも、LU(あるいはコレスキー)分解した時に出る三角行列が余りスパースにならないこともあるが、
その場合paradisoはメモリー上に行列要素を置かないで、Diskに書き出して計算するようだ(Out Of Coreモード)。
この時はシングルスレッドで動くらし。

そういう状況かも?

小さめの行列で試してみるか、OOCにならないようにオプションを変えてみたら(メモリーが足りればだけど
Dual Xeonなら結構積んでんじゃないの?)。

直接法は使ったことないので、外してたらごめんw


753:デフォルトの名無しさん
10/07/09 11:36:21
OOCモードって普通のスワップとは違くて、つまりちゃんとOOC用の処理をしてるんだよね?
でもそれって苦肉の策というか、結局スワップとほとんど変わらんくらい時間がかかる
イメージがあるんだけど、意外とそうでもないのかな?

自分は基本インコアに収まらないようなら素直に諦めてますがw

754:デフォルトの名無しさん
10/07/09 11:57:52
>>753
外部記憶とのI/Oで地獄の遅さだろう。


755:デフォルトの名無しさん
10/07/09 11:59:10
>>746 計算機は Mac OS X 10.4.11 Quad-Core Intel Xeon 3.0GHz x2

いいな。話それちゃうけど、いくらでした?

756:デフォルトの名無しさん
10/07/09 12:18:47
Macはもう終了らしいよな
ジョブズの禿に踊らされた人カワイソス

757:デフォルトの名無しさん
10/07/09 22:53:53
レスありがとうございます。

>>752
URLリンク(www.intel.com)
私が使っているバージョンのmklのマニュアルにはout of coreモードについては書かれていませんでした。
上のサイトでは、デフォルトでin core モードになっているという様に書かれているので違う気がします。すいません


解決方法は分からないのですが、なんとなく原因がつかめてきました。
どうやらmklとは別の部分を、OpenMPを使って並列化をしていることが原因のようです。

mklで求解を行ったすぐ後のdoループをOpenMPで並列化しているのですが、
コンパイルオプションの-openmp -openmp-report2をコメントアウトしてmakeすると
求解の部分が並列化されるのが確認できました。

現状では、求解もその後のループも重いので、どちらも並列化できないとボトルネックになってしまいます。
OpenMPの代わりにMPIを使うことで、mklを騙せるのではと考えていますが、これだと8コアを使いきれなので困ってしまいます。

なにかよい方法があれば、どなたかよろしくお願いします。

758:デフォルトの名無しさん
10/07/09 22:55:05
一応、プログラムの内容をもう少し具体的に書かせてください。

連立方程式をAx=bとして

Aを求めて、因子分解までする(mkl)

bを決める。

do
Aとbを使ってxを求める(mkl)

!$OMP parallel do
do
求めたxを使って新しいbを求める。
enddo
!$omp end parallel do
enddo


>>755
管理者に聞いたら60万くらいだそうです。

759:デフォルトの名無しさん
10/07/10 00:16:30
>>758
2重DO-LOOPに入ってるからでないかい。
外のLOOPをGOTOにして味噌パン。


760:名無しさん@そうだ選挙に行こう
10/07/11 04:23:57
Krylov?

do
!$OMP parallel
求めたxを使って新しいbを求める。
!$omp end parallel
enddo

と、do を抜いた OMP directive を MKL ルーチンの前後において
(do-loop の内側に持ち込んで)みて・・・もあんまり変わらんか、むしろ悪くなるかもしれんが・・。


761:名無しさん@そうだ選挙に行こう
10/07/11 18:42:36
OpenMPと自動並列化の違いがよく分からないんですが、基本同じものですか?

762:デフォルトの名無しさん
10/07/12 02:56:37
自動並列化はベンダごとに違うけど・・まあだいたいはOpenMPと同じようなものとおもっていいよ。
並列能率は一般的には手書きOpenMPより格段に劣るからあまり期待しないように。

763:デフォルトの名無しさん
10/07/14 13:01:32
>>762
ありがとうございます。昨今、OpenMPとMPIのハイブリッドがイイ!って
方々で言われていますが、2つ考えるのは('A`)じゃないですか?
ノード間は自前でMPIを頑張るとしても、ノード内は勝手に
自動で最適化&並列化してほしいなと・・・そんな日は来ないんですかね?

764:デフォルトの名無しさん
10/07/14 14:59:16
>>763
Earth Sim はノード間をMPIでかいて内部は自動並列らしいね
(使ったことないけど・・)。日電頑張った。

ふつうみかける8コアマシンをたくさんつないだ・・とかだと
ハイブリッドよりはMPIで全部書いてもあまりかわらないとも聞くね。
まあ書き方次第でもあるのだろうけど。
できれば最内ループの始まりと終わりを固定変数で
書いておかないとUnrolling が抑制されたりするから、
コンパイラ毎にいろいろ注意ね・・
粒度(一コア担当範囲の幅)にもよるんだろうけど。
ま〜MPI使いこなせるならMPI一本でいいとおもうよ。

765:デフォルトの名無しさん
10/07/14 15:29:04
そろそろprintf "%04d" 1 みたいな感じでゼロパディングするフォーマットを入れてくれ
ニーズあると思うが

766:デフォルトの名無しさん
10/07/14 22:41:52
I6.6とか

767:デフォルトの名無しさん
10/07/14 23:11:28
>>766
それで正解だよね?

768:デフォルトの名無しさん
10/07/15 00:47:41
>>767
うむ。正解。
>>765は20年前の昭和の知識しか持っていない。


769:デフォルトの名無しさん
10/07/15 01:32:20
すいません、FORTRAN90でブラック・ジャックのプログラムを組んでください。

770:デフォルトの名無しさん
10/07/15 01:55:32
>>765
わらた

771:デフォルトの名無しさん
10/07/15 02:35:15
>>769
ルールを定式化して教えろ。


772:デフォルトの名無しさん
10/07/15 09:06:33
>>768
20年前は平成だYO!

773:765
10/07/15 09:32:32
>>766-768
失礼しますた

774:デフォルトの名無しさん
10/07/15 11:11:35
すいません。定式化は僕の頭じゃ無理なのでルールだけ…ルールはお互いがトランプを引いていって、合計点数が21点を越えずにプレイヤーがディーラーより高い点を競うゲームです。ちなみに21点を越えると負け決定です。

775:1
10/07/16 03:36:52
>>774
コンピュータの思考まだ無し。

MODULE m_bj
IMPLICIT NONE
TYPE :: t_shuff
REAL :: x
INTEGER :: i
END TYPE t_shuff
INTEGER, SAVE :: icard(52), ipos, icards_mine(20) = 0, icards_dealer(20) = 0, ip_mine = 0, ip_dealer = 0
CONTAINS
SUBROUTINE shuffle()
TYPE (t_shuff) :: card(SIZE(icard))
INTEGER :: i
CALL RANDOM_SEED()
CALL RANDOM_NUMBER(card(:)%x)
card(:)%i = (/ (i, i = 1, SIZE(icard)) /)
card = qsort(card)
icard = card(:)%i
END SUBROUTINE shuffle

RECURSIVE FUNCTION qsort(c) RESULT(res)
TYPE (t_shuff), INTENT(IN) :: c(:)
TYPE (t_shuff) :: res(SIZE(c))
IF (SIZE(c) > 1) THEN
res = (/ qsort( PACK(c(2:), c(2:)%x < c(1)%x) ), c(1), qsort( PACK(c(2:), c(2:)%x >= c(1)%x) ) /)
ELSE
res = c
END IF
END FUNCTION qsort

776:2
10/07/16 03:38:07
CHARACTER(10) FUNCTION to_card(k)
INTEGER, INTENT(IN) :: k
CHARACTER(5) :: suit( 4) = (/'Spade', 'Heart', 'Club ', 'Diamd'/)
CHARACTER(2) :: rank(13) = (/' A', ' 2', ' 3', ' 4', ' 5', ' 6', ' 7', ' 8', ' 9', '10', ' J', ' Q', ' K'/)
INTEGER :: k1, k2
k1 = (k - 1) / 13 + 1
k2 = MOD(k - 1, 13) + 1
to_card = suit(k1) // ' ' // rank(k2)
END FUNCTION to_card

INTEGER FUNCTION icount_sum(icards)
INTEGER, INTENT(IN) :: icards(:)
INTEGER :: i, k, nace, isum
nace = 0
isum = 0
DO i = 1, SIZE(icards)
isum = isum + num_card(icards(i))
IF (num_card(icards(i)) == 11) nace = nace + 1
END DO
DO i = 1, nace
IF (isum > 21) isum = isum - 10
END DO
icount_sum = isum
END FUNCTION icount_sum

INTEGER FUNCTION num_card(k)
INTEGER, INTENT(IN) :: k
SELECT CASE(MOD(k - 1, 13) + 1)
CASE (1)
num_card = 11
CASE (2:10)
num_card = MOD(k - 1, 13) + 1

777:3
10/07/16 03:38:48
CASE (11:13)
num_card = 10
END SELECT
END FUNCTION num_card

INTEGER FUNCTION idraw(n)
INTEGER, INTENT(IN OUT) :: n
n = n + 1
ipos = ipos + 1
idraw = icard(ipos)
RETURN
END FUNCTION idraw

SUBROUTINE draw(text)
CHARACTER(*), INTENT(IN) :: text
SELECT CASE(text)
CASE('dealer')
icards_dealer(ip_dealer) = idraw(ip_dealer)
CASE('me')
icards_mine (ip_mine ) = idraw(ip_mine )
END SELECT
END SUBROUTINE draw

INTEGER FUNCTION iget_sum(text)
CHARACTER(*), INTENT(IN) :: text
SELECT CASE(text)
CASE('dealer')
iget_sum = icount_sum(icards_dealer(:ip_dealer))
CASE('me')
iget_sum = icount_sum(icards_mine(:ip_mine) )
END SELECT
END FUNCTION iget_sum

778:4
10/07/16 03:39:35
SUBROUTINE pr_cards(text)
CHARACTER(*), INTENT(IN) :: text
INTEGER :: i
SELECT CASE(text)
CASE('dealer')
PRINT *, (to_card(icards_dealer(i)), ' ', i = 1, ip_dealer)
CASE('me')
PRINT *, (to_card(icards_mine(i) ), ' ', i = 1, ip_mine )
END SELECT
END SUBROUTINE pr_cards
END MODULE m_bj
!
PROGRAM Console2
USE m_bj
IMPLICIT NONE
INTEGER :: i, isum_me, isum_dealer
CHARACTER :: input
CALL shuffle()
CALL draw('me')
CALL draw('dealer')
CALL draw('me')
CALL draw('dealer')
DO
isum_me = iget_sum('me')
IF ( isum_me > 21) THEN
PRINT *, 'Fail!'
EXIT
END IF
CALL pr_cards('me')
PRINT *, 'sum =', isum_me
PRINT *

779:5
10/07/16 03:43:46
PRINT *, 'draw or quit? (d or q)'
READ *, input
IF (input == 'q') EXIT
CALL draw('me')
END DO
PRINT *, '+++++++++++++++++++++++++++++++++'
PRINT *, 'Your cards'
CALL pr_cards('me')
PRINT *, 'sum =', isum_me
PRINT *
PRINT *, 'Dealer''s cards'
CALL pr_cards('dealer')
isum_dealer = iget_sum('dealer')
PRINT *, 'sum =', isum_dealer
IF (isum_me > isum_dealer .AND. isum_me <= 21) THEN
PRINT *, 'You win!'
ELSE
PRINT *, 'You lose!'
END IF
END PROGRAM Console2

780:デフォルトの名無しさん
10/07/22 13:04:22
format記述子の実数のうち、ESとENというのがありますが、
これの倍精度版はまだ規格になっていないのでしょうか?

781:デフォルトの名無しさん
10/07/24 04:35:45
>>780
誤解がある。
それらに倍精度も糞もない。
内部表現をそのフォーマットに変換するだけ。
よくマニュアルを読むべし。

例えば、単精度でも小数点以下50桁を指定すれば50桁書く。
有効数字は7〜8桁しか無いが、内部表現を単に変換してなんぼでも書き出す。

782:デフォルトの名無しさん
10/07/24 13:35:27
>>781
誤解してました。ありがとうございます。

783:デフォルトの名無しさん
10/07/26 17:09:11
ハノイの塔のプログラムのソースを探しているんですが、どなたかご存知ですか?

784:デフォルトの名無しさん
10/07/26 22:14:52
知ってるよ

785:デフォルトの名無しさん
10/07/26 22:50:05
教えていただけませんか?

786:デフォルトの名無しさん
10/07/27 01:16:05
>>783
"Guide to Fortran2003 Programming" W.S.Brainerd  (Springer)
の105ページに載ってる。

Google Books で当該ページが見られる。Hanoiで検索しろ。ソースコード自体は107pだ。
見た感じFortran90の範囲で書かれている。

787:デフォルトの名無しさん
10/07/27 01:29:16
そういや再帰って速度的にはよろしくないって聞くなぁ
再帰を使わないアルゴリズムがあるのなら、そっちを使ったほうがいいのかな
ハノイの塔でできるかは知らないけど・・・(無理?

788:デフォルトの名無しさん
10/07/27 06:52:52
> そういや再帰って速度的にはよろしくないって聞くなぁ

ほとんど迷信。
再帰で問題なのはスタックの消費とか。

789:デフォルトの名無しさん
10/07/27 09:33:16
>>786
ありがとうございます。

790:デフォルトの名無しさん
10/07/27 18:09:38
subroutineをcallするのって何秒くらいかかるんですか?

791:デフォルトの名無しさん
10/07/27 19:30:52
誰が作った何をする subroutine なのかによる
おまえがわけも分からず作った subroutine だったら、一生帰ってこない可能性もある


792:デフォルトの名無しさん
10/07/27 21:28:41
callしてから帰ってくるまでじゃなくて
callすること自体にどれくらい時間がかかるのかなぁ・・・と思ったわけです

793:デフォルトの名無しさん
10/07/27 23:31:39
何秒と言われても環境によるし

コンパイラがインライン展開することもある

794:デフォルトの名無しさん
10/07/28 01:06:32
>>792
>>791は文脈から質問の意味が理解出来ないアホ。
知りもしないくせに知っているとほざく>>784レベルのクズ。

>>787
>>788の言うとおり。70年代とかの言い伝えを信じているとバカをみる。

795:デフォルトの名無しさん
10/07/28 01:24:04
>>787,794
recursive は新たに呼ばれるたびにメモリやL1キャッシュにコードを展開するので、
頻度次第では速度にテキメンに出るけど(ループ内で呼ぶとかw)・・
今のマシンでハノイ塔問題くらいなら気にしなくていいよ。

796:デフォルトの名無しさん
10/07/28 06:56:31
> recursive は新たに呼ばれるたびにメモリやL1キャッシュにコードを展開する

そんなコンパイル技法ははつみみです。

797:デフォルトの名無しさん
10/07/28 21:08:56
do i=1,100
z(i)=x(i)+y(i)
enddo
って書くのと
z(1:100)=x(1:100)+y(1:100)
って書くので計算の速さに違いはありますか?

798:デフォルトの名無しさん
10/07/28 21:15:47
しょぼいコンパイラなら後者のように明示的に書く方がいいが
今時そういうのあるかなあ

799:デフォルトの名無しさん
10/07/28 21:19:12
>>797
ない

800:デフォルトの名無しさん
10/07/28 21:40:30
なんにせよ、そういうちょっとした書き方の違いを気にするより
アルゴリズムそのものを考えた方がいい、とか教科書に書いてないかい

801:デフォルトの名無しさん
10/07/28 21:49:19
あるけれどコンパイラがなくしてくれるってことでいいですかね

あと
sum(x**2)

x(1)*x(1)+x(2)*x(2)+x(3)*x(3)
ならどっちが速いですかね

802:デフォルトの名無しさん
10/07/28 21:57:42
xがx(10000)なら後者
x(3)なら同じ

803:デフォルトの名無しさん
10/07/28 22:08:46
ありがとうございます

804:デフォルトの名無しさん
10/07/29 00:03:04
>>801
あんた、なんか大昔の伝説みたいなのを盲信してないかい?
今はコンパイラの最適化で変わるから、環境依存でそういう質問意味ないよ。
本当の最後の最後に最適化するような所を気にしていてセンス悪すぎ。

気になるなら自分でテストプログラム書いて調べたほうが早い。己の質問の無意味さを噛みしめられる。

>>802も信用ならんw つーか今時x(1000)程度では、有意な差が出無い。

結局>>800が書いているように、適切なアルゴリズムを直截にソースコードに直したほうが、
実行時間もデバッグ時間でも結局早くなる。


QuickSortなんかも、再帰を使って素直に書いて実行すると、理論通りにO(NLogN)で動くから
再帰なしのO(N^2)なバブルソートだのよりよっぽど速いわさ。F77時代みたいに再帰無しでQuickSort
書いたら、ソースグチョグチョなイミフでバグ取り大変な上に、結局さして速くもなかろうさ。

QuickSortって再帰使えば10行だぜ。問題になるのはスタックオーバーフローだけ。

RECURSIVE FUNCTION qsort(x) RESULT(res)
REAL, INTENT(IN) :: x(:)
REAL :: res( SIZE(x) )
IF ( SIZE(x) > 1 ) THEN
res = (/ qsort(PACK( x(2:), x(2:) > x(1) )), x(1), qsort(PACK( x(2:), x(2:) <= x(1) )) /)
ELSE
res = x
END IF
RETURN
END FUNCTION qsort

805:デフォルトの名無しさん
10/07/29 04:08:23
大昔だとすぐにStack 溢れたものだけど、今は気にしても。>>788,795 みたいに
Stack 展開のロスもそれほどでもないし。というかここが気になるというのはやりかたがまずい。

>>804 のとおり細かい最適化はベンダ任せでいいと思うよ。
unrolling やらいろいろ今のコンパイラはするもんね。
CPU メーカの作るコンパイラ(Intel とか・・Fujitsu は
SPARC 以外でも良好で好きだけど高けぇ)は特に。

gfortran はどちらかというと違うプラットホームでも同じ結果・使い心地に、に重点があるからか
その点ではだいぶ劣るけど、便利だし・・・タダなのがいい!

806:デフォルトの名無しさん
10/07/29 04:25:19
Intel Fortran だと、9と11でまったく同じコード
(CPU最適化を /QxW あたりで古い世代のCPUに揃えて)とマシンでも
実効速度が2〜3割はふつうに違うので・・・個人が「書き方」でなんとか
最適化しようという努力はあまり意味が無いのが実感できる。

807:デフォルトの名無しさん
10/08/09 16:22:34
FortranとCどちらが良いかってのはある意味永遠のテーマかもしれんけど、
両者の総合的な善し悪しをきちんと整理して理解するには、やっぱ自分で
両方やらなきゃ駄目なんかな…。

研究者とか業界のリーダー的立場の人はこの辺をはっきり明らかにして
くれると助かるんだけどなぁ。もっと言えば、科学技術数値計算コードは
どのように開発すべきか、みたいな指針を示してくれると実にありがたい話
なんだけど、そういう動きってあんまりないような…。

808:デフォルトの名無しさん
10/08/11 01:00:21
めんどうだもん

809:デフォルトの名無しさん
10/08/11 14:53:17
物理系の年配の人達はFORTRANしか知らないし、またFORTRANが最速
と信じているから、Cとかには全然興味ないだろうね。

大学の物理系の研究室の教授はFORTRANしかわからないから、学生が
CやC++で数値計算プログラムを作成すると不機嫌になる。結局、そこの
研究室の学生達はFORTRANでプログラムを作ることになる。

CやC++はプリプロセッサやポストプロセッサの部分でしか出番がない
だろね。

810:デフォルトの名無しさん
10/08/11 15:16:02
嫌だよFORTANなんか

811:デフォルトの名無しさん
10/08/11 23:35:28
でもスパコンを使うならFortranでしょ。
この前も、スパコンの利用者のための講習で富士通やNECの人に言われた。

812:デフォルトの名無しさん
10/08/12 01:30:04
スパコン向けのコンパイラ作る側としてはFortran は楽らしいね。

まあ、C と Fortran は共存しやすいし・・・
両方知ってれば何かと便利だ。面倒でもあるけど。

813:デフォルトの名無しさん
10/08/12 01:45:51
仕方ねえなあFortranも文法は綺麗とは言えないが、長い間使われて来た
事から最適化技術が熟成しており、またライブラリも多数ある事から科学技術
計算にはFortran、その他のユーティリティはCのように棲み分けが出来てしまっている

しかしウィンドゥライブラリはCの方が豊富なので、>>812のいう通り共存しているのが
現実だ
C++は・・・うーん今の所Qt以外ではあまり用途がないんじゃね?

814:デフォルトの名無しさん
10/08/12 12:40:02
ウィンドウライブラリって、要は可視化するってことだと思うが
cのライブラリを呼ぶこともいちおうは可能だし
既存の可視化ツール使う人はファイルをそれにコンバートすればいいし
そもそも可視化なんていらん、って人もいるし

棲み分けが出来てていいんじゃまいかと
というか、進化が完全に止まってるのに負の遺産としていまだに残ってる言語なんてざらにあるし、
発展が続いてるだけでも相当ありがたいことだよな
Fortranは死んだとか言うやついるけど、贅沢すぎるわ

815:デフォルトの名無しさん
10/08/13 00:17:08
C++も右辺値参照が普及すればちょっとは速くなるだろうが、
数値計算の並列処理による高速化はFortranの方が一歩長じているからな。


CやC++はポインタを使うからコンパイラの最適化がやりにくいし。

816:デフォルトの名無しさん
10/08/13 01:42:35
>>812 C と Fortran は共存しやすいし
コンパイラやらで、
副プログラムの名前に _ がついたり付かなかったり、
Case Sensitive だったりなかったり、
整数・実数以外の変数を渡すと悶絶することがあったり・・・
でも、まあそのへんに気をつければ、2言語を混在させるのは
他の組み合わせよりかなり楽だよね。

817:デフォルトの名無しさん
10/08/13 09:36:22
_が一個から二個に変更された時に変えた奴を殺してやろうかと思った。

818:デフォルトの名無しさん
10/08/13 18:08:18
行列反復などの重い処理はFortran、その外側はCって感じか?
でも外側Cにしてホントにやりやすくなるのかな。いまいちピンとこない。

819:デフォルトの名無しさん
10/08/14 00:29:42
入出力はCの方が楽。マトリックス構築するのも、オレにとってはCの方が楽だけど、
こっちは、FORTRANのSTRUCTUREは使用経験が無いからよくわからない。

820:デフォルトの名無しさん
10/08/14 00:51:10
まあ、好きずきでいいんじゃね?
個人的には818さん方式でWrapper をC にして、が多い。
まあ、 Fortran だけで済むならわざわざ包んだりはしないけど。

821:デフォルトの名無しさん
10/08/20 23:53:01
NAGのFortran入門サイトってよくまとまってて好きなんだけど、
↓のFortran2003のページってすげー辿りにくいところにあるのな
URLリンク(www.nag-j.co.jp)
なんか理由があるんだろうかと勘ぐってしまうw

822:デフォルトの名無しさん
10/08/21 19:55:06
変形ベッセル関数を使いたいんですけど
fortranでフリーのものってありますか?

823:デフォルトの名無しさん
10/08/23 12:53:50
ジュリア集合を作りたいんですけど

c julia set
complex z,z0,c
10 read(6,*)x,y
write(6,*)'x=,y='

if(x.gt.2) go to 10
if(y.gt.2) go to 10
read(6,*)a,b
write(6,*)'a=,b='
z0=(x,y)
c=(a,b)
do n=1,100
z=z0
z=z*z+c
abs(z).lt.10
Rez=real(z)
Imz=aimag(z)
write(6,*)Re(z),Im(z)
end do
end

これだとz0=(x,y)
c=(a,b)
の部分とabs(z).lt.10
がエラーになるんですけど、どうすればいいですか?

824:デフォルトの名無しさん
10/08/24 00:35:04
自由形式のfortran90のソースコードから固定形式のCOMMONブロックが入ったFORTRAN77のファイルを"include"するにはどうすればいいのでしょうか?
コンパイラーはgfortran-4.4を使っています。デフォルトで自由形式で解釈させたらコメントの"C"や継続の"&"あたりでエラー出るし、-ffixed-formオプションで固定形式としてコンパイルしても当然ダメでした。

825:デフォルトの名無しさん
10/08/24 09:56:29
>>824
同じ事をいろいろ試したけど・・自分の時はどうにもダメだった。
include って機械的にファイルを挿入するだけだから・・・どうにもならんような。

偉い人の降臨を待とう。

826:824
10/08/24 13:13:26
分子動力学パッケージTinkerに基づいたレプリカ交換MDのプログラムTiReXのソースコードを見てそこそこ使えそうな解決法がありました。
Tinkerは77の固定形式でTiReXは95の自由形式です。

TiReXはTinkerのライブラリとCOMMONの定義が書いてあるインクルードファイルを使います。
インクルードファイルも77の固定形式ですが、TiReXの方で固定形式でModuleを作り(incmodとします)、
自由形式のmainルーチンの中で"use incmod"とすればいけるみたいです。

827:デフォルトの名無しさん
10/08/24 13:37:53
それが正解か
コンパイル時にソースが自由形式固定形式ごっちゃになってなければいいわけで

828:デフォルトの名無しさん
10/08/24 22:16:44
subroutineとfunctionの違いってなんですか?

もしどちらを使っても目的が達成できるならどっちを使うべきですか?
好みで決めていいですかね?

829:デフォルトの名無しさん
10/08/25 07:25:39
お好きな方で。わしは
logical function func(a,b,c...)
みたいに正常終了だったかをわかりやすくするために
教科書的にはSubroutine で書くものも
logical な関数にすることが多いけど、
別にそのスタイルを他人に押し付けるほどは便利ではないし・・。

830:デフォルトの名無しさん
10/08/25 13:51:33
まぁ教科書的にはsubroutine引数にierrとかエラー用変数を入れとくんだよな

>>828
単純にfunctionなら式中に含められる点じゃないか
どちらも副プログラムだし、値を返す以外に違いは“全くない”と思ってるんだけど
もし違うなら誰か指摘してください

831:デフォルトの名無しさん
10/08/25 20:01:11
sin(x)/xを計算してくれるサブルーチンってありませんか?

832:831
10/08/25 21:39:29
言うの忘れてました
sin(x)/xのxが小さいところを正確に計算してくれるサブルーチンです

833:デフォルトの名無しさん
10/08/25 23:39:44
>>832
あるよ。

834:デフォルトの名無しさん
10/08/26 06:19:41
どこにあるか教えてもらえませんか

835:デフォルトの名無しさん
10/08/26 14:58:37
sinc関数だっけそれ
数学ライブラリとかには入ってるんじゃないの?

836:デフォルトの名無しさん
10/08/30 03:58:09
>830 どちらも副プログラムだし、値を返す以外に違いは“全くない”と思ってるんだけど

わしもそう思う。・・なんかあるんかな?

837:デフォルトの名無しさん
10/09/08 00:57:19
>836

838:デフォルトの名無しさん
10/09/08 00:59:56
>>837 ごめん、ミスった。
>>836 function内では write(*,*)ができないのが唯一の違いと思ってたぜ。


839:デフォルトの名無しさん
10/09/08 09:11:11
へえ、そういう違いがあるんだ・・・
でも、自分ところの Intel Fortran (10.??)はコンパイルの時に文句いってこないし、
ちゃんと無書式標準出力がはたらくよ。規格外なんかな?

840:デフォルトの名無しさん
10/09/09 10:17:06
>>839 うーん、勘違いしてました。
write(*,*) "foo",func

function func()
func = 0.d0
write(*,*) "bar"
end function
とするとrecursive I/O errorがでるので駄目。
というのを脳内変換して、function内でwrite文が使えないという脳内ルールにしてました。
すみません。 subroutineではありえないこういうケースもあるよ、ということで...

841:デフォルトの名無しさん
10/09/10 01:41:21
write(*,*) "foo",func
function func()

なるほど!
たしかにこれだと関数内I/O が引っ掛かるね。
おもしろい例だ。

842:デフォルトの名無しさん
10/09/10 17:56:53
あ、ほんとだ。
ついsubroutineと同じ感覚でこの手のエラー用出力をやりがちだけど、気を付けなきゃw
本来ならエラー時も引数で対処すべきかもしれんけど、出力にこだわるならwirte(0,*)でもいいか。
かち合わなければいいわけで。

ちなみに write(*,*) "foo",func は正しくは func() だよね。
というか func のままだとrecursive I/O errorが出ないんだよね。よく分からん・・・

$ cat a.f90
implicit none
real func
write(*,*) "foo",func
end
real function func
func = 0.d0
write(*,*) "bar"
end function

$ ifort a.f90 -warn ; ./a.out
foo 0.0000000E+00

843:デフォルトの名無しさん
10/09/10 19:31:20
>>842
> というか func のままだとrecursive I/O errorが出ないんだよね。

そりゃ、そのプログラムだと"foo"の後に 実数変数のfunc を表示することになるからだがや。

844:842
10/09/10 20:58:29
>>843
ウッハ!こりゃ恥ずかしい・・・死んできます

845:デフォルトの名無しさん
10/09/13 18:10:50
>>807
気象庁のFortran 標準コーディングルール
URLリンク(www.mri-jma.go.jp)

846:デフォルトの名無しさん
10/10/01 20:25:26
はじめまして。
今、FORTRANでF検定後にT検定、等分散ではないT検定を行うものを作ろうかと考えています。
簡単に説明しますと、2つの独立した標本の平均の差の有意さをみるものなのですが、
私はまだまだ未熟者でして、そのような似たようなプログラムソースなどあれば参考にして書きたいのですが、
ないものでしょうか?


847:デフォルトの名無しさん
10/11/01 23:24:50
入出力の装置番号の範囲を教えてください

848:デフォルトの名無しさん
10/11/02 05:39:04
>>847
コンパイラによるんじゃね

849:デフォルトの名無しさん
10/11/06 21:10:17
再現性のないエラーのデバッグとかどうすりゃいいのよ・・・

850:デフォルトの名無しさん
10/11/06 23:11:41
>849
メモリアクセス疑ったら?
配列外参照してるとか

851:デフォルトの名無しさん
10/11/07 17:33:37
>>849
開発するときは-warn系と-check系のオプションを付けることを強く勧める

852:デフォルトの名無しさん
10/12/16 20:39:57
くだすれの方に書いたのですが、こっちの方がふさわしい気がしたので、
教えてください。
---
Windows版のifort (Intel Visual Fortran)でプロファイルを取る方法を教えてください。

検索すると、
ifort -pg hoge.f90
./a.out
gprof ./a.out gmon.out
というのがよく掲載されているのですが、Windows版には、下記のように
-pgの対応物がないようです。

map_opts -tw -lf -opts -pg

Intel(R) Compiler option mapping tool

mapping Linux options to Windows for Fortran

'-pg' Linux option maps to
--> no equivalent Windows option found

853:デフォルトの名無しさん
10/12/16 23:37:20
ーdebug かな?
デバッガはidbじゃないの?Linuxだけなんかな。

854:デフォルトの名無しさん
11/01/07 20:37:23
倍精度はdouble precisionですが、4倍精度はquadruple precisionでいいかというと
そうではないようですね。一部では対応してるそうですが。
real*8や real*16、もしくはkind指定で統一したほうがいいような気がするんですが。
だいいち〜precisionとか書くのは冗長すぎますよね。何でそんなふうに決まったんだか・・・。

というか自分はコンパイルオプションで-real-size 64などとして強制的に統一してます。
式の実数で「d0」などと末尾に付けないで済むし。

質問というわけではないですが、皆様どう思いますかね?

855:デフォルトの名無しさん
11/01/08 02:07:10
>>854
DOUBLE PRECISION はFORTRAN66時代に導入された倍精度の正規の宣言法でこちらが本家。
REAL*8などはFORTRAN77時代に使われるようになった記法。
またKINDはFortran90で導入された記法。
あと4倍精度はFORTRAN77までは規格外の拡張。90以降でも必須ではない。
よってKINDの一つとして存在していてもかまわないが、quadruple precisionのような
新たな命令を期待するのはお門違いとなる。
なお現在ではKIND方式で統一するのがよろしいとされている。

とにかく50年分くらい時代をごっちゃにしている。古文・漢文のノリで66、77を学ぶが吉。



AUTODBLの件だが、歴史的にFORTRANではINTEGERと単精度REALのワード長が一致することが
(暗黙に?)要求されてきたので、上品ならざる振る舞いをしていることになっていることを指摘しておきたい。

私個人は好みの問題で使うも使わぬも勝手だと思うが、しばらく前に
gfortranだったかg95だかのデフォールトREALが倍精度8byteで、デフォールトINTEGERの
4バイトと一致していなかったために、外人のおっさんたちがBizzare野郎呼ばわりで糞味噌に罵しっていたw
非常識かつ破廉恥な猥褻物陳列レベルの振る舞いとさみなされたようだ。
たしかにCOMMON、EQUIVALENCE、ホレリス使いまくりの昔のプログラムには不都合極まりない。

856:デフォルトの名無しさん
11/01/10 17:25:06
>>855
レスどうもです。つか、詳しすぎる・・・

そういえば、real(8)やreal*8の数字の意味(精度なのかバイト数なのかそれ以外か)が
きちんと規格で統一されていないという話を聞いたことが。
たとえばcomplexだと、普通はcomplex*8で単精度だけど実装によっては倍精度の場合もあるとか。
その辺の解決策としてkindが導入されたんだと思うんだけど、苦肉の策というか
あんまスマートじゃないような・・・。つーか、complex(kind(0d0)) とか長ったらしいよw

857:デフォルトの名無しさん
11/01/17 19:56:03
Fortran90〜2003の和書がろくにないので洋書を買おうかと思うんですが、何かオススメないでしょうか?
基本的なことは知ってますが、あまり深くは使ってないレベルの人間です。
これ一冊ありゃOKっていうのが理想ですが・・・

Amazon.comで以下を見つけました。お持ちの方いますか?

Fortran 95/2003 Explained, Michael Metcalf (2004年)
URLリンク(www.amazon.com)

Fortran 95/2003 for Scientists & Engineers, Stephen Chapman (2007年)
URLリンク(www.amazon.com)

The Fortran 2003 Handbook, Jeanne C. Adams (2008年)
URLリンク(www.amazon.com)

858:デフォルトの名無しさん
11/01/19 00:48:47
>>857
まあ概ねアマゾンの書評と同じような感想ですが

「Fortran 95/2003 Explained」
言語リファレンス代わりに使うならこれが最適。
さすがMichael Metcalfさん。その代わりサンプルコードが少なめ。

「Fortran 95/2003 for Scientists & Engineers」
サンプルコードや演習問題が多いので具体的な使い方が理解しやすい。
ただしFortran 2003で追加された機能については解説が少なめ。
ISO_C_BINDING や IEEE_* の説明が見当たらないんですが・・・
分厚いのでリファレンス代わりにするのは少々不向き。

「The Fortran 2003 Handbook」は読んだことないのでわかりません。


「〜 Explained」はF2008に対応した新しい版がもうすぐ出る・・・と思ってたら
いつの間にか発売日が7月になってるのね・・・

859:857
11/01/19 12:37:23
>>858
ありがとうございます。結局全部買ってしまいそうだ・・・w

>「〜 Explained」はF2008に対応した新しい版
これですね。
Modern Fortran Explained
URLリンク(www.amazon.com)

というか今知ったのですが、Michael MetcalfはISOの規格メンバーなんですね。
こりゃ信頼性という意味でこの上ないですね。

860:デフォルトの名無しさん
11/01/20 08:59:54
>>857
Google Booksなんかでわりと中身がのぞけたりする。

Guide to Fortran 2003 Programming, Walter S. Brainerd が割と入門者むけの古典的な教科書に近いと思う。
OOPとか2003固有の部分はそれほど多くなく、Fortran全般に書かれている。

Introduction to Programming with Fortran: with coverage of Fortran 90, 95, 2003 and 77,
Ian Chivers & Jane Sleightholme
これは、Fortran77あたりから拡張していった本なのですっきりしていない。あんま良くない。

Fortran 95/2003 for Scientists & Engineers, Stephen Chapman (2007年)
もってない。が上のIan Chiversの本と同じく、温泉旅館式の肥大化本だと思う。


Fortran 95/2003 Explained, Michael Metcalf (2004年)
1冊買うならこれかな?大概この本しか見ない。
ただ、入門者向きではない。>>858の書いているようにリファレンスに近い。
しかし、肝となる部分をがっちり書いているので便利。

The Fortran 2003 Handbook, Jeanne C. Adams (2008年)
FortranXX Explained よりもさらに言語規格書よりに書かれている。
これも入門者向きでない。辞書っぽい感じ。

861:857
11/01/21 22:22:14
>>860
色々とありがとうございます。まずはExplainedを買ってみます。

862:デフォルトの名無しさん
11/01/28 22:24:29
はい

863:デフォルトの名無しさん
11/01/30 10:16:20
いいえ

864:デフォルトの名無しさん
11/01/30 12:05:30
どっちだよw

865:デフォルトの名無しさん
11/02/15 13:15:27
FORTRANというとcommonブロックという言葉がセットで出てくるけど
なんだろう

866:デフォルトの名無しさん
11/02/16 23:21:39
Cでガーベジコレクションが出てくるのと同じだべ?
COMMONは大域変数ではなく、自由に思いのままにガーベジコレクションのできる共有地だぜ!

867:デフォルトの名無しさん
11/02/18 15:02:30
以下を、
ifort -c -warn all test.f90
でコンパイルすると、Ver.10.1だとエラーが出ないが、Ver.11.1だと
test.f90(9): error #7137: Any procedure referenced in a PURE procedure, including one referenced via a defined operation or assignmnent, must be explicitly declared PURE. [PURE_FF]
xxx = pure_ff()
というエラーが出る。規格上は、(C,F77で書かれた)外部関数はpureにできない?

!test.f90
module A
interface
elemental real(8) function pure_ff()
end function
end interface
contains
pure real(8) function xxx ()
xxx = pure_ff()
xxx = pure_ff()
end function
end module



868:デフォルトの名無しさん
11/05/02 15:18:06.31
macにgfortranいれて、
ターミナルから
$ gfortran hoge.for
しました。それから$ ./a.outしてみましたが、
At line 22 of file hoge.f
Fortran runtime error: No such file or directory
22行目がおかしいってことみたいです。
本来であれば、ファイル名の入力を求められるらしいです。

しらべてみたら、.forって相当古いみたいですね。固定形式だとか。
もとはwindows用に書いたらしいのですが、OSやコンパイラの仕様に依存していたりするのでしょうか?

アドバイスよろしくお願いします。割り込みすいません。

869:デフォルトの名無しさん
11/05/02 23:44:21.50
コンパイラ依存は確かにある。コンパイラを変えたらコンパイルエラーとか。
OS依存も、依存するようなコードの書き方をすれば依存する。

エラーメッセージの内容は理解できているかな?hoge.fの22行目は見てみた?
分からなければ、取り合えず22行目の前後数行をここにコピペしてみたらどうだろう。

870:デフォルトの名無しさん
11/05/03 12:07:16.39
ありがとうございます。書き方によっては依存するんですね。
お言葉に甘え、hoge.fの19~26行目を張らせていただきます。

19 c
20 open(7,file='con')
21 write(7,'('' input filename'')')
22 open(8,file=' ')
23 write(7,'('' output file or devicename'')')
24 open(6,file=' ')
25 call input(ipro)
26 c

エラーに関しては、そんなファイルやディレクトリは無い!って怒ってるってことでいいんでしょうか。
取り合えず、cってのが昔のコメント行であること、openとwriteがファイル操作をしようとしてるってこと、7とか8とかが装置番号と呼ばれているってことは分かります。

871:デフォルトの名無しさん
11/05/03 15:37:42.14
なんじゃこりゃ?!

ファイル名の入力を求めるメッセージを、なぜ標準出力ではなくconに書き出しているのか?
標準出力として予約されている装置番号6番が、なぜファイルとしてopenされるのか?
なぜファイル名が' 'なのか?(自分で適宜書き換えろってことなのか?
それとも、file=' 'とすると、自動的にファイル名を尋ねてくれるコンパイラがあるのか?)

22、24行目のfile=' 'を自分で書き直す必要があると思う。
おそらく8番が入力データが入ったファイルで、6番が出力を書き出すファイルだろうから、適宜じぶんで書き直して。

自分なら念のため、装置番号の使われ方を調べるために"read.*8"とか"write.*6"がコード内で使われているところを検索する。
grep -ine"read.*8" ./*.for
それを頼りに、プログラムの挙動を追跡する。macでgrepって使えるのかな?

872:デフォルトの名無しさん
11/05/03 15:52:24.94
>>871
>それとも、file=' 'とすると、自動的にファイル名を尋ねてくれるコンパイラがあるのか?
良く分かんないですけど多分そうだと思います。

人のPCで実行した.exeは、

マイクロソフトかな漢字変換 バージョン2.51
(C)Copyright Microsoft Corp. 1992-1993
input filename
File name missing or blank - please enter file name
UNIT 8?

ってでます。input filenameはhoge.fにありますよね。

>適宣自分で書き直して
とありますが、ファイル名だけを指定した場合、a.outのあるディレクトリにあるファイルとして読み込まれるのでしょうか?
ま、とにかくやってみます。

どうもありがとうございます!

873:デフォルトの名無しさん
11/05/03 16:13:07.68
>>871
grepなるものは分かりませんが、とりあえずエディタで検索かけてみました。

現在、hoge.fはディスクトップ上にあり、コンパイル後のファイルa.outと読み込ませたいデータB1.txtもディスクトップ上にあります。

19c
20 open(7,file='con')
21 write(7,'('' input filename'')')
22 open(8,file='B1.txt')
23 write(7,'('' output file or devicename'')')
24 open(6,file='b1.out')
25 call input(ipro)
26c

に変更してみました。
結局のところ、
At line 22 of file fem3.f
Fortran runtime error: No such file or directory
とのことです。22行目から進みません。
ていうか、なぜ、input filenameってメッセージすら出ないのか。

お手上げです。

874:デフォルトの名無しさん
11/05/03 17:33:23.22
そんなときは、エラーメッセージとは関係ないところが問題になっているのかも知れない。
試しにソースコードの拡張子.fを.f90にしてコンパイルしてみて。

875:デフォルトの名無しさん
11/05/03 17:36:12.73
>ていうか、なぜ、input filenameってメッセージすら出ないのか。
これは、conっていうファイルに書き込まれていないかな?
デスクトップにconっていうファイルができていると思う。

876:デフォルトの名無しさん
11/05/03 17:56:02.74
>>874
.f90にしてコンパイルしてみました。結局エラーメッセージの嵐。
.fではcとすると、c言語でいう//になるみたいですが、.f90ではならないみたいです。fixcomという.fを.f90に変換するプログラムを見つけたので変換し、コンパイルしてみましたが、結果は変わらず。
At line 22 of file hoge.f90
Fortran runtime error: No such file or directory
ちなみに、変換後のコードは、ぱっと見、cを!に置き換えているだけみたいでした。

>>875
おっしゃるとおり、conってファイルができてました。
装置番号を6にかえてみましたが、ターミナルには出力されず、conってファイルができます。


877:デフォルトの名無しさん
11/05/04 10:14:28.68
>>876
プログラムが極端に長くないならここに貼り付けちゃった方が早いかもよ
1行目から30行目ぐらいまででもいいけど
長文貼っても誰も怒らないしね

多分、22行目以外もバグってそう

他のモジュール(変数とかを書いておく所)を使ってグローバル変数があると面倒かな

878:デフォルトの名無しさん
11/05/04 12:20:54.73
>>877
お言葉に甘えて、、、って全部で870行ぐらいあるので、、、
取り合えず、Cでいう、mainっぽいとこだけ張ります。必要があるようなら適宜。7~53行目です。

7 c main program
8 common/a/ ym1,ym2,pois1,pois2,thick,ntj,nte,npar,nst,nbc,nlc,
9 1 eqstx(5),eqsty(5),eqsts(5),mdir(5),mkind(5),jemk(600),
10 2 mtj(600,3),road(500),lc(500),mbc(500),p(800),lank(800),
11 3 disp(800),ddisp(800),foce(800),focem(800),ifail(600)
12 common/b/ ex(600),ey(600),ez(600),gxy(600),th(600),eqst(600),
13 1 sigmax(600),sigmay(600),sigmal(600),sigmat(600),
14 2 sigmaz(600),tauxy(600),tault(600),fract(600),
15 3 dela(3,3),com(3,6),elk(6,6)
16 common/c/ syk1(15000),index1(800)
17 common/d/ index2(800)
18c************************************************************************
19c
20 open(7,file='con')
21 write(7,'('' input filename'')')
22 open(18,file=' ')
23 write(7,'('' output file or devicename'')')
24 open(6,file=' ')
25 call input(ipro)


879:デフォルトの名無しさん
11/05/04 12:22:57.32
続きです。
26c
27 do 1000 inc=1,nst
28c
29 write(7,50) inc
30 50 format(' **** No.',i4,' *****'/)
31c
32 call alloc
33 call clasfy
34 write(7,'('' calsyk running'')')
35 call calsyk
36c
37 do 40 i=1,2*ntj
38 foce(i)=focem(i)/nst
39 40 continue
40c
41 write(7,'('' solver running '')')
42 call solver
43 write(7,'('' result running '')')
44 call result
45 write(7,'(/)')
46c
47 if (ipro.eq.0) goto 1000
48 call output
49 1000 continue
50 if (ipro.eq.0) call output
51c
52 stop
53 end

880:デフォルトの名無しさん
11/05/05 13:47:34.37
>>878
すでに、871さんが書かれているとおりです。
Fortranでは、C言語の標準入力は5番、標準出力は6番に割り当てられています。
openする必要はありません。これらは、'*'で書くことができます。
したがって、878,979の
write(7,
を、すべて、
write(*,
にすれば、画面に表示されます。

22行目、24行目のopen文でfile名を指定していないのはよくないので、
きちんとファイル名を指定して下さい。24行目についてはさらに番号を
6以外に変更して下さい。

その他、気になる点は:
47行目:この様な目的でgoto文を使用しないほうがいいでしょう。
goto文は、よっぽどのことがない限り使用しないでください。
文番号の使用も止めましょう。doループの終わりはend do文としましょう。
common文はなるべく使わないようにしましょう。

基本的に、日本でFortranと言えば、Fortran2003なので(JISでそのように
決まっている)、FORTRAN77ではなく、新しめの文法で書くのがいいと思います。

環境がmacのようですが、unix系のOSの場合には、特にファイルをopen文で
開く必要はありません。デフォルトで、例えば7番の場合はfort.7、
8番の場合はfort.8から読み書きしようとしています(コンパイラによりますが)。
プログラム実行前に、シェルスクリプトで、シンボリックリンクを使って
'fort.番号'のファイルを作っておけば問題ありません。


881:デフォルトの名無しさん
11/05/05 18:20:02.26
>>880
どうもありがとうございます。
やってみます。
やはりこれはFortran77なのですね。平成元年に作成されたようです。
Fortranについて調べても、しょっぱなから違っているので途方に暮れていました。

882:デフォルトの名無しさん
11/05/05 18:40:30.37
尻拭いさせられてるのか

883:デフォルトの名無しさん
11/05/05 18:59:28.16
>>882
軽く説明すると、
「このソフトつかって課題やってきてね。つhoge.exe」
「(macなんですけど、、、)コードあります?」
「つhoge.f」
「gfortran hoge.fっと。コンパイルできたー。実行できないorz えーっと?Fortranなんて分からん、、、」
と、まあ、こんな感じで。
Fortranを調べてみても、明らかに違うしで困ったいた訳です。

個人的な結論は
コード自体がめっちゃ古い。
しかも環境依存くさい。
です。

みなさん、どうもありがとうございます。

884:デフォルトの名無しさん
11/05/05 19:40:21.87
>>880
無事に動きました。
どうもありがとうございます。

やったあ!やったよぉ!

885:デフォルトの名無しさん
11/05/10 04:05:10.32
>>884

あーあぁあ〜はじめての〜ちゅ〜
君とちゅ〜I need you for my love〜

886:デフォルトの名無しさん
11/05/10 15:33:36.57
大文字じゃないのだね


887:デフォルトの名無しさん
11/05/21 09:53:33.09
5 名前:名無しさん@十一周年[sage] 投稿日:2011/05/21(土) 07:37:55.67 ID:55711cMv0
(人類の歴史として語り継がれるべき事実)

【 利用基準(年間20ミリシーベルト)の責任者一覧 】
 原子力災害対策本部本部長:菅直人(最高責任者)
 原子力安全委員会委員長:斑目春樹(実質的な判断の最高責任者)
 文部科学大臣:高木義明(当該通知に関する最高責任者)
 文部科学省生涯学習政策局長:板東久美子(当該通知に関する責任者)
 文部科学省初等中等教育局長:山中伸一(当該通知に関する責任者)
 文部科学省科学技術・学術政策局長:合田隆史(当該通知に関する責任者)
 文部科学省スポーツ・青少年局長:布村幸彦(当該通知に関する責任者)

※ 後で大問題になるから、このリストはみんなで共有しよう。全世界に拡散しよう。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5215日前に更新/304 KB
担当:undef