FORTRAN II

このエントリーをはてなブックマークに追加
919909:04/12/18 15:15:24
>>916

おかげで何とか完成できました。
丁寧な解説有難う御座います。
920デフォルトの名無しさん:04/12/18 15:21:09
>>918
ありがとうございます。
しかし、残念ながらFORTRNしか分からないものでして・・・
せっかく教えていただいたものも、理解できない状況です。
申し訳ありません。宜しくお願いします。
921デフォルトの名無しさん:04/12/18 18:07:59
>>920
Fortran が使えて awk が使えない人はいないから,
とりあえず使い方を調べてみませう.
Fortran を捨てたくなるかもね.
awk で扱うのが自然な問題は awk でやるのが一番楽です.
922デフォルトの名無しさん:04/12/19 23:07:24
宿題は他にないのか?
923デフォルトの名無しさん:04/12/20 00:44:24
>>917
そのDATA.TXTの中身がどういう書式で書かれているかで
書き方がずいぶん変わってくるかと。行ごとに1個の数字しか
書いてなければ話は簡単だとは思いますが・・・。

PROGRAM test
  IMPLICIT NONE

  CHARACTER(len=260) :: infile = "DATA.TXT"
  CHARACTER(len=260) :: outfile
  CHARACTER(len=16) :: cnum
  INTEGER :: ios

  OPEN(1,FILE=infile,STATUS="old",iostat=ios)
  IF(ios /= 0) STOP

  DO
    READ(1,*,iostat=ios) cnum
    IF(ios /= 0) EXIT
    WRITE(outfile,*) cnum(1:LEN_TRIM(cnum)) // ".txt"
    OPEN(2,FILE=outfile,POSITION="append")
    WRITE(2,*) cnum(1:LEN_TRIM(cnum))
    CLOSE(2)
  END DO

  CLOSE(1)

END PROGRAM test
924デフォルトの名無しさん:04/12/20 22:09:44
学生さんはもう冬休みか。 いいねぇ。
925デフォルトの名無しさん:04/12/20 22:11:00
あんたも昔は学生だっただろ
926デフォルトの名無しさん:04/12/20 22:12:13
てすと
927デフォルトの名無しさん:04/12/21 04:26:14
マターリいこうや、ロートル諸君!
928KG:04/12/21 10:28:59
Matlabのmファイルをfortranのソースファイルに変換するツールをご存じの方が
いらっしゃれば教えて下さい。
929デフォルトの名無しさん:04/12/21 12:37:25
google ですぐに見つかるやつは違うの?
930KG:04/12/21 18:15:55
googleで見つかるやつは,まだツールが公開されていないそうで...
931fortran:04/12/23 22:47:57
エラーについて質問させてください><
forrtl:error (75): floating point exception
0: __FINI_00_remove_gp_range[0x3ff81a6de38]



実行するとこのようなエラーが出てしまうのですが・・・
0で除算していることは決してないのでオーバーフローなのかあぁ・・・
932デフォルトの名無しさん:04/12/23 23:35:42
>>931
OSやコンパイラの種類もわからない
何をしようとしていたのか、ソースもない
そんな状態で何を答えろと?
933デフォルトの名無しさん:04/12/24 00:47:30
>>932
禿同
まぁ、あとは、sqrt(a)やa**3でa<0とか、
934デフォルトの名無しさん:04/12/24 07:48:59
>>931よ、お前が聞いているのはこの質問と同じかな?
ググルといっぱい出てくる。
http://www.google.co.jp/search?sourceid=navclient&ie=UTF-8&rls=GGLD,GGLD:2004-15,GGLD:en&q=forrtl%3Aerror+%2875%29%3A+floating+point+exception

答えはないようだが、雰囲気的にはコンパイラーのバグだろう。



http://www.cpmd.org/pipermail/cpmd-list/2002-November/000481.html

forrtl: error (75): floating point exception
0: __FINI_00_remove_gp_range [0x3ff81a6de38]
1: __FINI_00_remove_gp_range [0x3ff81a76e60]
2: __FINI_00_remove_gp_range [0x3ff800d5120]
3: cnstfc_ [./cnstfc.f: 118, 0x1201cb028]
4: detdof_ [./detdof.f: 191, 0x1201c9b10]
5: mdmain_ [./mdmain.f: 119, 0x1201daa00]
6: mdpt_ [./mdpt.f: 124, 0x1201d9ff0]
7: cpmd_ [./cpmd.f: 120, 0x12003dac4]
8: cpmd_stuttgart_ [./cpmd.f: 3, 0x12003d590]
9: main [for_main.c: 203, 0x1203fc66c]
10: __start [0x12003d3b8]
time: command terminated abnormally.

935877:04/12/26 00:29:47
すいません。うえの方でFFTについて聞いたものです。
>>897さんのコードはうまく動くのですが自分のコードは全部0になります。
元のコードから編集したのをコピペするので見てもらえないでしょうか?

USE NUMERICAL_LIBRARIES

INTEGER N
INTEGER G(16,16,16)
INTEGER I, J, K
REAL GRI(16,16,16)
CHARACTER FILENAME*15

101 FORMAT(16E16.8)

N=16

DO K=1,N
DO J=1,N
DO I=1,N
IF(MOD(I,2)==1.AND.MOD(J,2)==1.AND.MOD(K,2)==1)THEN
G(I,J,K)=1
ELSE
G(I,J,K)=0
END IF
END DO
END DO
END DO
936877:04/12/26 00:30:11
CALL FOU100(N,G,GRI)

DO I=1,N
WRITE(FILENAME,*)INT(I)
FILENAME=TRIM(ADJUSTL(FILENAME))//'.dat'
OPEN(8,FILE=FILENAME)
DO J=1,N
WRITE(8,101)(GRI(I,J,K),K=1,N)
END DO
CLOSE(8)
END DO

END
937877:04/12/26 00:30:31
SUBROUTINE FOU100(N,G,GRI)
!
INTEGER G(N,N,N)
INTEGER I, J, K
REAL GRI(N,N,N), GG(N,N,N)
REAL*8 ABC1,ABC2
COMPLEX GC1(N,N,N), GC2(N,N,N)
!
DO I=1,N
DO J=1,N
DO K=1,N
GG(I,J,K)=G(I,J,K)
IF(G(I,J,K).EQ.-1) GG(I,J,K)=0.5
GC1=CMPLX(GG(I,J,K),0.0)
END DO
END DO
END DO

CALL FFT3F(N,N,N,GC1,N,N,GC2,N,N)
938877:04/12/26 00:31:16
DO K=1,N
DO J=1,N
DO I=1,N
ABC1=REAL(GC2(I,J,K))
ABC2=AIMAG(GC2(I,J,K))
GRI(I,J,K)=(ABC1**2+ABC2**2)
END DO
END DO
END DO
!
RETURN
END
939デフォルトの名無しさん:04/12/26 03:16:09
これ新手の荒らしだな。
どっかのアップローダにアップしろよ。
940デフォルトの名無しさん:04/12/26 09:05:44
精度統一しようよ
941デフォルトの名無しさん:04/12/26 09:27:09
>>937
DO I=1,N; DO J=1,N; DO K=1,N

! 整数G(I,J,K)を実数GG(I,J,K)に入れる
GG(I,J,K)=G(I,J,K)

! G(I,J,K)は0か1なのに、-1だったら、GG(I,J,K)に0.5を入れる。
IF(G(I,J,K).EQ.-1) GG(I,J,K)=0.5

! GC1のすべての値をGG(I,J,K)+0.0iにする。
GC1=CMPLX(GG(I,J,K),0.0)

END DO; END DO; END DO

! GC1(:,:,:)=GG(N,N,N)+0.0i=0.0+0.0iをFFTにかける。
CALL FFT3F(N,N,N,GC1,N,N,GC2,N,N)

DO K=1,N; DO J=1,N; DO I=1,N

! なぜかABC1,2だけ倍精度
ABC1=REAL(GC2(I,J,K))
ABC2=AIMAG(GC2(I,J,K))
GRI(I,J,K)=(ABC1**2+ABC2**2)

END DO; END DO; END DO
942935:04/12/26 15:41:47
>>939
長くなってすいません。

>>941
前任者からもらったコードを改造して、さらにここに貼るときにいろいろ
はしょったので変なところが多いかもしれません。

>GC1(:,:,:)=GG(N,N,N)+0.0i=0.0+0.0i
がなぜだが分からないのですが教えていただけないでしょうか?
943デフォルトの名無しさん:04/12/26 22:52:25
>>942
>>GC1(:,:,:)=GG(N,N,N)+0.0i=0.0+0.0i
>がなぜだが分からないのですが教えていただけないでしょうか?

>>937のループの最後で
GC1=CMPLX(GG(I,J,K),0.0)

GC1=CMPLX(GG(N,N,N),0.0)
になるからだろ。
944デフォルトの名無しさん:04/12/26 23:42:14
FORTRAN90勉強するためによい参考書があったら、教えてください
入門と専門書の中間くらいのものがあれば、助かるのですが。。。。
主に科学計算に使います。
945デフォルトの名無しさん:04/12/27 00:32:04
過去の遺産をのぞいた場合fortranを科学技術計算に使用するアドバンテージって何かあるんでしょうか。
946デフォルトの名無しさん:04/12/27 00:42:18
他の言語に比べて計算が早い。
私の御師匠さんも以前はC言語で書いていておられたが
Fで書いてみると20%近く早くなったっていってた。

947デフォルトの名無しさん:04/12/27 00:44:44
>>946
そんなばかな
948デフォルトの名無しさん:04/12/27 00:52:49
>>945
Fortran90以降なら配列演算
FORTRAN77以前は・・・ないな
949935:04/12/27 14:13:36
>>943
ありがとうございます。
OTL・・・
950奈菜氏:04/12/27 16:25:51
FORTRAN77でニュートン法でこれを解けって、宿題が出ました。
助けてください・・・・2(X*X)−5X−3=0です。
とても、おっ馬鹿なんで・・・

951デフォルトの名無しさん:04/12/28 00:01:12
>>950

FORTRAN 以前の問題。ここで聞くことではないと思うのだけど。
952デフォルトの名無しさん:04/12/28 01:33:16
>>950
正直、氏んだ方がいいですね。
953897:04/12/28 12:07:28
>>935
すでに >>941 が指摘しているように
GC1=CMPLX(GG(I,J,K),0.0)
が原因ですね。本来GC1(I,J,K)=CMPLX(GG(I,J,K),0.0)

Fortran90は配列操作に長けているので、

WHERE (iG == -1 )
GG = 0.5
ELSEWHERE
GG = REAL(iG)
ENDWHERE
GC1 = CMPLX( GG, 0.0 )

の様に書けば意味が明解になります。
(iG は型を明確にするために、Gを直してあります。)


今回の事とは直接に関係しませんが、変数名の命名に関しては、
暗黙の型宣言に忠実であることが望ましいです。
これは、たとえFORTRAN90でIMPLICIT NONEをかけても言えることです。
その理由は2つあります。
1.いちいち変数の定義部まで型を調べに戻る必要がない。
2.FORTRAN中・上級者は型を守らないような人を相手にしたがらない。

他言語出身者が『暗黙の型宣言なんかシラネ、宣言すればいいだけのことだろが!』
と言うことがありますが、それは2chで『”がいしゅつ”は既出と読むんだ。日本語知らないのか!』
と言う様なものに当たります。ネタにマジレスな人が2chでスルーされるように、
FORTRAN界ではその内部の伝統を守らないものはスルーされてしまいます。
954デフォルトの名無しさん:04/12/28 17:48:54
3つのプログラムをおしえてください。

1、ガンマ乱数の生成プログラム

2、面積等分割のプログラム

3、適合度検定のプログラム
955デフォルトの名無しさん:04/12/28 22:56:05
956デフォルトの名無しさん:04/12/28 23:32:01
fortran90を使って、外部のファイルから1行づつ値を読み込むのってどうしたらいいのでしょう。

a1 b1 c1
a2 b2 c2
a3 b3 c3
...以下続く
みたいなファイルがあって、そこから
まず一行目のa1とb1とc1だけを使って計算した結果を出力して、
次に二行目のa2とb2とc2だけを使って計算した結果を出力して…というのをひたすら繰り返したいのですが。

超素人質問ですいません。
よろしくお願いします。
957デフォルトの名無しさん:04/12/28 23:59:03
doループでread文をぶん回せ。
958デフォルトの名無しさん:04/12/29 00:18:04
ループでぶん回すとき、一行づつ読み込め見たいな命令っていらないのですか?
do i=1,N
read(*,*) a, b, c
end do
としとくと(文法自信ないですが。)i=1で最初の3つ(a1,b1,c1)を読み込んだら、
i=2の時は勝手にその次の3つ(a2,b2,c2)を読み込んでくれるのでしょうか??

ってか、自分で試してみればいいわけですね。
やってみます。
959デフォルトの名無しさん:04/12/29 00:20:48
LAPACKの質問はここでOK?
960デフォルトの名無しさん:04/12/29 01:11:49
>953
そのFortran中上級者と思っている人間にかぎって、
スパゲティなソースを量産しているFortranの現状。
全部が全部といいませんが。
961デフォルトの名無しさん:04/12/29 10:00:17
>>960
そりゃしょうがないよ。
スパゲッティーが良くないとは、ALGOL、PASCALの時代から計算機学科の人々が言い続けてきたが
実際問題としてFORTRAN90以前は言語の特質として、原理的にスパゲッティーでないプログラムを
書くことは不可能だったんだから。

そもそも、FORTRAN界にはスパゲッティーなプログラムが良くないという価値観は存在しない。
自分で書いて、自分で使う、他人が使うことは想定しない、という古い時代の価値が保たれていて、
プログラムそれ自体が完成価値を持つという、計算機学科系の価値観とは深淵の隔たりがあるもの。
962デフォルトの名無しさん:04/12/29 12:31:43
>>961
fortran コードを吐く fortran みたいなアプローチがあればいいんですよね.
インラインをうまく制御できたり強力なマクロがあったりという感じで,
計算コストを上げずに可読性を良くできる仕組みがあれば.

1, 2 文字の変数名が良く使われるのは,
紙に書いてある数式を写したからじゃないでしょうか.
下付き文字やギリシア文字がうまく書ければ
1, 2 文字に固執されないと思います.

TeX の数式がそのまま貼れて,しかも計算コストを考えて式変形してくれたら
いいですよね.maxima にあったような気もしますが,
これを言語仕様に含めたり.
963デフォルトの名無しさん:04/12/29 15:10:10
ratfor使えばFORTAN77でもある程度スパゲッチィなソースに
なるのは避けられるけれど、
FOATRAN中上級者はratforを使うのは邪道だと思っているような希ガス。

ちなみに漏れも暗黙の型宣言に忠実じゃない香具師(´・ω・`)
964デフォルトの名無しさん:04/12/30 04:09:30
いやな時間に目が覚めた。

Fortran77で、
暗黙の型宣言を守り、IMPLICIT NONE。
COMMONはクリティカルなデータのみで、直交性を考えてやる。
GO TO 文はbreak用途のみに使う。
DO~END DOを使い、DO ~ CONTINUE は使わない。
WHILE文は使う。
無駄なFORMAT宣言は避ける。(WHITE(6,'(A)'
プリプロセッサも使う。
分岐が多くなってきたら、コメント付けで意図を明確に。

これやるだけで、かなり可読性が増すと思うんです。
私の指針ですが。

逆にこういう気遣いができないFortran使いは許せぬ。
その、ぐちゃぐちゃした物を動かんからデバッグしてといわれても。
良く読んで、理解しろといわれても。
・゚・(ノД`)・゚・。
965デフォルトの名無しさん:04/12/30 04:14:44
>無駄なFORMAT宣言は避ける。(WHITE(6,'(A,3F8.3)'))
966デフォルトの名無しさん:04/12/31 02:52:41
90を使い,module文で2次元の定数配列を宣言したい.

integer,dimension(2,2) :: IAA = (/ 1,2,3,4 /)じゃだめなの?

967デフォルトの名無しさん:04/12/31 10:41:23
>>966
Fortran90 の場合、多次元配列は

integer, dimension(2,2) :: IAA = reshape((/ 1,2,3,4 /), shape(IAA))

のように reshape を使う。
この場合、
IAA(1,1) = 1
IAA(2,1) = 2
IAA(1,2) = 3
IAA(2,2) = 4
のように列順であることに注意。
968デフォルトの名無しさん
>>967
できました.
reshapeってのがあるんですね.
早速の回答 thxでした.
気持ちよく新年を迎えられそうです.