>>916 おかげで何とか完成できました。
丁寧な解説有難う御座います。
>>918 ありがとうございます。
しかし、残念ながらFORTRNしか分からないものでして・・・
せっかく教えていただいたものも、理解できない状況です。
申し訳ありません。宜しくお願いします。
>>920 Fortran が使えて awk が使えない人はいないから,
とりあえず使い方を調べてみませう.
Fortran を捨てたくなるかもね.
awk で扱うのが自然な問題は awk でやるのが一番楽です.
宿題は他にないのか?
>>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
学生さんはもう冬休みか。 いいねぇ。
あんたも昔は学生だっただろ
926 :
デフォルトの名無しさん:04/12/20 22:12:13
てすと
927 :
デフォルトの名無しさん:04/12/21 04:26:14
マターリいこうや、ロートル諸君!
928 :
KG:04/12/21 10:28:59
Matlabのmファイルをfortranのソースファイルに変換するツールをご存じの方が
いらっしゃれば教えて下さい。
google ですぐに見つかるやつは違うの?
930 :
KG:04/12/21 18:15:55
googleで見つかるやつは,まだツールが公開されていないそうで...
931 :
fortran:04/12/23 22:47:57
エラーについて質問させてください><
forrtl:error (75): floating point exception
0: __FINI_00_remove_gp_range[0x3ff81a6de38]
・
・
・
実行するとこのようなエラーが出てしまうのですが・・・
0で除算していることは決してないのでオーバーフローなのかあぁ・・・
>>931 OSやコンパイラの種類もわからない
何をしようとしていたのか、ソースもない
そんな状態で何を答えろと?
>>932 禿同
まぁ、あとは、sqrt(a)やa**3でa<0とか、
934 :
デフォルトの名無しさん:04/12/24 07:48:59
935 :
877: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
936 :
877: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
937 :
877: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)
938 :
877: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
これ新手の荒らしだな。
どっかのアップローダにアップしろよ。
精度統一しようよ
>>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
942 :
935:04/12/26 15:41:47
>>939 長くなってすいません。
>>941 前任者からもらったコードを改造して、さらにここに貼るときにいろいろ
はしょったので変なところが多いかもしれません。
>GC1(:,:,:)=GG(N,N,N)+0.0i=0.0+0.0i
がなぜだが分からないのですが教えていただけないでしょうか?
>>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勉強するためによい参考書があったら、教えてください
入門と専門書の中間くらいのものがあれば、助かるのですが。。。。
主に科学計算に使います。
過去の遺産をのぞいた場合fortranを科学技術計算に使用するアドバンテージって何かあるんでしょうか。
946 :
デフォルトの名無しさん:04/12/27 00:42:18
他の言語に比べて計算が早い。
私の御師匠さんも以前はC言語で書いていておられたが
Fで書いてみると20%近く早くなったっていってた。
>>945 Fortran90以降なら配列演算
FORTRAN77以前は・・・ないな
950 :
奈菜氏:04/12/27 16:25:51
FORTRAN77でニュートン法でこれを解けって、宿題が出ました。
助けてください・・・・2(X*X)−5X−3=0です。
とても、おっ馬鹿なんで・・・
>>950 FORTRAN 以前の問題。ここで聞くことではないと思うのだけど。
953 :
897: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だけを使って計算した結果を出力して…というのをひたすら繰り返したいのですが。
超素人質問ですいません。
よろしくお願いします。
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)を読み込んでくれるのでしょうか??
ってか、自分で試してみればいいわけですね。
やってみます。
LAPACKの質問はここでOK?
>953
そのFortran中上級者と思っている人間にかぎって、
スパゲティなソースを量産しているFortranの現状。
全部が全部といいませんが。
961 :
デフォルトの名無しさん:04/12/29 10:00:17
>>960 そりゃしょうがないよ。
スパゲッティーが良くないとは、ALGOL、PASCALの時代から計算機学科の人々が言い続けてきたが
実際問題としてFORTRAN90以前は言語の特質として、原理的にスパゲッティーでないプログラムを
書くことは不可能だったんだから。
そもそも、FORTRAN界にはスパゲッティーなプログラムが良くないという価値観は存在しない。
自分で書いて、自分で使う、他人が使うことは想定しない、という古い時代の価値が保たれていて、
プログラムそれ自体が完成価値を持つという、計算機学科系の価値観とは深淵の隔たりがあるもの。
>>961 fortran コードを吐く fortran みたいなアプローチがあればいいんですよね.
インラインをうまく制御できたり強力なマクロがあったりという感じで,
計算コストを上げずに可読性を良くできる仕組みがあれば.
1, 2 文字の変数名が良く使われるのは,
紙に書いてある数式を写したからじゃないでしょうか.
下付き文字やギリシア文字がうまく書ければ
1, 2 文字に固執されないと思います.
TeX の数式がそのまま貼れて,しかも計算コストを考えて式変形してくれたら
いいですよね.maxima にあったような気もしますが,
これを言語仕様に含めたり.
ratfor使えばFORTAN77でもある程度スパゲッチィなソースに
なるのは避けられるけれど、
FOATRAN中上級者はratforを使うのは邪道だと思っているような希ガス。
ちなみに漏れも暗黙の型宣言に忠実じゃない香具師(´・ω・`)
いやな時間に目が覚めた。
Fortran77で、
暗黙の型宣言を守り、IMPLICIT NONE。
COMMONはクリティカルなデータのみで、直交性を考えてやる。
GO TO 文はbreak用途のみに使う。
DO~END DOを使い、DO ~ CONTINUE は使わない。
WHILE文は使う。
無駄なFORMAT宣言は避ける。(WHITE(6,'(A)'
プリプロセッサも使う。
分岐が多くなってきたら、コメント付けで意図を明確に。
これやるだけで、かなり可読性が増すと思うんです。
私の指針ですが。
逆にこういう気遣いができないFortran使いは許せぬ。
その、ぐちゃぐちゃした物を動かんからデバッグしてといわれても。
良く読んで、理解しろといわれても。
・゚・(ノД`)・゚・。
>無駄なFORMAT宣言は避ける。(WHITE(6,'(A,3F8.3)'))
90を使い,module文で2次元の定数配列を宣言したい.
integer,dimension(2,2) :: IAA = (/ 1,2,3,4 /)じゃだめなの?
>>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
のように列順であることに注意。
>>967 できました.
reshapeってのがあるんですね.
早速の回答 thxでした.
気持ちよく新年を迎えられそうです.