2ちゃんねる★スマホ版★■掲示板に戻る■全部1-最新50
レス数が900を超えています。1000を超えると表\示できなくなるよ。

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

1 :
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/
2 :
2012/08/16(木) 21:32:02.53
           , r‐‐ 、_
        ,  ´ ̄  ´ ̄    ̄ミ 、   ____/: : : : ヽ、
    __./         `¨       \/: : : : : : : : :: : :  : : : : : : : : }
     / /// // /  ,.、  /     /  : : : : : : : : :   : : : : : : /
    _,ァ≫イ/ / / /  <、\>′   ヽ{  : :\      フ: : : : :/
      イ/| //ー-、   />/`Y    ∧\.:: : : :ヽ   /: : : :/   ) (
     彡' ノ,イ{/{__///「/¨ヽ.! ! | .}}  /: : :.i  /: : : : :/   (   )
       彡' ノ }イ:::} ´´ r=ミ、 }ノ 1 小      /: : : : :/  (   ノ            こ、これは>>1乙じゃなくて
            片ソ   /:::しヘ从 j/从.ゝ 彡/: : : : :/            |\        レンコンしそ餃子の湯気なんだからね
        {:::::、   廴::/}{/ ,'{/  /  ,': : : : /      (     (. |: : \       今後は、気をつけなさい!!
           ヽ ー  :::::    ∨{彡'.:.:.:.:. :/i: : : : :{     (  )   |: : : :.ヽ      
             \__  イ≦_¨\ \_ {: : : : :丶_______.ノ: : : : : }
        、____xー|.   |, -、`   ヽ _.: '.: : : : : : : : : : : : : : : : : : : : : : /_
        / // / ー / /》ー--、  l-‐ \: : : : : : : : : : : : : : : : : : イ   ゙ ヽ
        ノ // /ヘ/  ///     \ /   /,,r"i/ ,r"i/,,r"i/,,r"i  、 ヽ
     /   // ,'⌒/.   ///      }/ ./  /#; / /#.; / //#; / ,/#; / .," i  |
     V //  i /   ///       `ヽi. /#; / ,/#; ./ /#;; / ,/#; / .,'   / /
       片厶≦j/ヘ  //〈        /.  |〃/ ,|〃/ ,|〃/ , |〃/ .,"..;;/ /
      `ー'⌒Y⌒ヽ //  ヽ-====<  ヽ   ヽゝ' `ヽゝ~ ヽゝ ~ヽゝ'  " /
                           ゙ ー-- 、、... _ __,,,,, .... --―"


3 :
2012/08/17(金) 02:14:17.73
> 初心者に適切な指導もなくプログラム書かせているのはアカハラの域に達してるな。

これって割と多いような気がするな。
まあ分野によっちゃいずれ必要になることが前前から分かっていそうな気もするのだが
それも指導のうちと言えばそうだ
4 :
デフォルトの名無しさん
2012/08/17(金) 04:02:00.57
do i=2,1000
write(*,*) '1otsu'
enddo
5 :
2012/08/17(金) 19:12:19.36
>>3
昔は先輩が教えることが前提となっていたから成立したが、
最近、先輩がいなかったり、知らなかったりで、伝承が途切れている。
時代の変化に、サヨクかぶれの爺さんたちの現状認識が追いついていない。
連中は鳩山みたいに夢を見て、管みたいに怒鳴り散らしてるからw
6 :
2012/08/17(金) 20:00:57.70
前スレくだすれFORTRAN(超初心者用)その5の>>999さん
アドバイスありがとうございます。引き続きよろしくお願いします。
変更点の件ですが、

入力文
character (len = 20) :: filenm
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm
open(11,file= TRIM(filenm) )

出力文
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm
open(14,file=filenm)
close(14)

という修正をくわえればよろしいでしょうか?


7 :
2012/08/17(金) 20:51:34.50
>>6
それだと出力してない。
OPEN と CLOSE の間で出力する。

ただ一度に欲張らず、まず固定された入力ファイルと出力ファイルで
ちゃんと計算できるプログラムをつくって確認しておくべき。

その後、色々ループさせたり、ファイル名を変えたり出来るようにすべき。
ものには順番があり、近くから遠くへ及ぼすべしとは、四書のはじめ大学にも書いてあるw
8 :
2012/08/17(金) 21:14:43.76
これまでの教えていただいたプログラムが下記になります。

program test
implicit none
integer, parameter :: ndata = 400
real :: a(18, ndata), x(3, ndata), y(3, ndata)
real :: s, sx, sy, tx(ndata), ty(ndata)
integer :: i, j, icol

character (len = 20) :: filenm
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm
open(11,file= TRIM(filenm) )

open(12, file = 'input2.txt')
open(13, file = 'input3.txt')
!
do i = 1, 6 ! skip 6 lines
read(11, *)
end do
do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do

! exel data x
do i = 1, ndata
read(12, *) (x(j, i), j = 1, 3)
end do
9 :
2012/08/17(金) 21:16:18.67
! exel data y
do i = 1, ndata
read(12, *) (y(j, i), j = 1, 3)
end do
!
do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do

print *, 'input column '
read *, icol
sx = sum( tx * a(icol, :) )
sy = sum( ty * a(icol, :) )
s = sx / sy

write(*,'(a,$)') 'File Name : '

stop
end program test
10 :
2012/08/17(金) 21:38:35.93
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm
open(14,file=filenm)

write(*,*) 'result=', s ! <--だから結果を書きだせってw

close(14)
11 :
2012/08/17(金) 21:39:27.86
write(14,*) 'result=', s ! <--だから結果を書きだせってw

思わず間違えたwwww
12 :
2012/08/17(金) 21:52:24.90
>>10>>11
アドバイスありがとうございます。とろいのですいません。

出力文
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm
open(14,file=filenm)
write(14,*) 'result=', s ! <--結果を書き出すプログラム。
close(14)

こういうことでしょうか?
13 :
2012/08/17(金) 22:03:15.16
そうそう。欲しい結果を書きだす。
本来は、入力ファイル名や計算したカラム(列)番号のような
付加的な情報も書いておくべきだろうが・・・

open(14,file = trim(filenm) ) ! <- こっちもTRIMで尻の空白を削っておくべし。
14 :
2012/08/17(金) 22:16:41.91
>>13
最後の方は、こういう感じでプログラムすればうまく動きますかね。

print *, 'input column '
read *, icol
sx = sum( tx * a(icol, :) )
sy = sum( ty * a(icol, :) )
s = sx / sy

write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm
open(14,file = trim(filenm) ) ! <- TRIMで尻の空白を削る。
write(14,*) 'result=', s ! <--結果を書きだす。
close(14)

stop
end program test

こちらの掲示板に来て良かったです。
色々こんなデキの悪い自分に付き合ってくださってありがとうございました。

15 :
2012/08/17(金) 23:15:49.56
character (len = 20) :: filenm_in, filenm_out
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_in
open(11,file= TRIM(filenm_in) )

・・・・

write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_out
open(14,file=trim(filenm_out))
write(14, *) 'input file name', filenm_in
write(14, *) 'column no.', icol

write(14,*) 'result=', s ! <--結果を書き出すプログラム。
close(14)

として、読み込んだファイルと、使ったコラムも出力ファイルに書きだしておくと、
あとで何の計算したのかヒントになっていいぞ。

とろくさいと、どのファイルに何を書きだしたかすぐ忘れるだろうから、こうしておけwww
16 :
2012/08/17(金) 23:31:33.54
>>15
度々すみません。親切にありがとうございます。
プログラムに組み込ませていただきます!

今日もかれこれ5時間くらいネカフェにいますが、
そろそろおいとまします。自転車こいで橋を越えた甲斐がありました。
また色々教えてください。
17 :
2012/08/17(金) 23:46:42.05
最後にプログラム全体を書き込ませてください。
program test
implicit none
integer, parameter :: ndata = 400
real :: a(18, ndata), x(3, ndata), y(3, ndata)
real :: s, sx, sy, tx(ndata), ty(ndata)
integer :: i, j, icol

character (len = 20) :: filenm_in, filenm_out
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_in
open(11,file= TRIM(filenm_in) )

open(12, file = 'input2.txt')
open(13, file = 'input3.txt')
!
do i = 1, 6 ! skip 6 lines
read(11, *)
end do
do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do

! exel data x
do i = 1, ndata
read(12, *) (x(j, i), j = 1, 3)
end do
! exel data y
do i = 1, ndata
read(12, *) (y(j, i), j = 1, 3)
end do
18 :
2012/08/17(金) 23:47:39.05
!
do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do

print *, 'input column '
read *, icol
sx = sum( tx * a(icol, :) )
sy = sum( ty * a(icol, :) )
s = sx / sy

write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_out
open(14,file=trim(filenm_out))
write(14, *) 'input file name', filenm_in
write(14, *) 'column no.', icol

write(14,*) 'result=', s ! <--結果を書き出すプログラム。
close(14)

stop
end program test

19 :
2012/08/17(金) 23:48:58.52
本日もどうもありがとうございました。
お先に失礼します。
20 :
sage
2012/08/21(火) 14:51:00.60
わからないので教えてください。
メモ帳(a.txt)のなかにデータがあります。

A B C D
1 1 1 1
2 2 2 2
‥‥‥‥
100 100 100 100

みたいな感じでデ−タがあるのですが、

B列の1行から100行まで
D列の1行から100行までのデータを取り出して
計算(B*D)する際に連動させたいのですが
どのようにプログラミングしたらいいでしょうか。

連動というのは、B列10行の時にD列10行の値を使うということです。

上手く説明できませんがお願いします。
21 :
2012/08/22(水) 00:48:53.83
program test
implicit none
integer, parameter :: ndat = 100
real :: x(4, ndat), y(ndat)
open(10, file = 'a.txt', status = old)
do i = 1, ndat
read(10, *) x(:, i)
end do
y = x(2, :) * x(4, :) ! B * D
print *, y
stop
end program test
22 :
2012/08/23(木) 20:46:06.15
以前こちらの掲示板でお世話になった>>12です。お久しぶりです。
すみませんが、壁にぶち当たってしまいまして、お力をお貸しください。

コンパイルした後、作成したアプリの方で3,6,9,12,18列を同時に読み込んで一つのメモ帳に
書き込めるようにプログラムしたいのですが、可能でしょうか?
以下に現在のプログラムデータを載せさせていただきます。以前アドバイスしていただいた「trim」
なんですが、buildしたらエラーになってしまったので、そこを入力と出力の両方消したら
コンパイルしてくれたので、バージョンが20年前のものだからではないかと思います。
あと、師に確認してもらったところ計算結果が誤っていると指摘されたのですが、もし
おかしなところがあったらアドバイスお願いします。一週間やってみたのですが、どうにも自分
では原因を見つけられないでいます。
一個一個メモ帳やエクセルのデータを読み込んだらclose
すべきという指摘がありました。あと、fortranでは原則iを実数にしないといけないと指摘されたので、
変更しました。これもソフトが古いからなのでしょうか?

program test
implicit none
integer, parameter :: ndata = 400
real :: a(18, ndata), x(3, ndata), y(3, ndata)
real :: s, sx, sy, tx(ndata), ty(ndata) ,i!iを実数にしたつもりです。これくらいで計算結果は変動しますか?
integer :: j, icol

character (len = 20) :: filenm_in, filenm_out
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_in
open(11,file= filenm_in)

open(12, file = 'mydata1.csv')
open(13, file = 'mydata2.csv')
23 :
2012/08/23(木) 20:50:05.82
do i = 1, 6 ! skip 6 lines
read(11, *)
end do
do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do    !ここはclose(11)とか不要でしょうか?
! exel data x
do i = 1, ndata
read(12, *) (x(j, i), j = 1, 3)
end do
! exel data y
do i = 1, ndata
read(13, *) (y(j, i), j = 1, 3)
end do
do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do
print *, 'input column ' !ここの読み込み時に3,6,9,12,15,18列を同時に読み込み計算させたいと考えています。
read *, icol
sx = sum( tx * a(icol, :) )
sy = sum( ty * a(icol, :) )
s = sx / sy
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_out
open(14,file=filenm_out)
write(14, *) 'input file name', filenm_in
write(14, *) 'column no.', icol
write(14,*) 'result=', s ! <--結果を書き出すプログラム。
close(14)
stop
24 :
2012/08/23(木) 21:03:18.85

自分の作りたいプログラムの内容を載せさせてください。連投になってしまい、すみません。3つのファイル(メモ帳1つ、エクセルファイル2つ) を読み込み
対応した列の積分および除算を行い結果を新規ファイルに書き出せるようにしたいと考えています。
メモ帳のデータで読み込みたいデータが1〜18列あり、メモ帳内のデータすべてを読み込み、上から「いらない行1〜6」を読み飛ばすようにプログラミングし、
1〜18列の中の任意の列のみを計算に組み込ませたいと考えています。(一度の計算処理で3列目のみとか6列目のみ指定して計算させたいです。)

いらない行1
いらない行2
いらない行3
いらない行4
いらない行5
いらない行6
1 .000E+00 .121E+06→→→.115E+07 .000E+00 .703E+06 .703E+06(18列)
2.
3.



(全部で400行のデータが存在します。)

さらに以下のエクセルデータx,yを読み込んで合計値を算出、除算を行いたいと考えています。
 エクセルデータxを組み込んだ計算式:sx=s+(real(i)*50.0-25.0)*?*x3
 エクセルデータyを組み込んだ計算式:sy=s+(real(i)*50.0-25.0)*?*y3
(x3,y3は上記エクセルデータの左から3行目のデータを読み込ませているつもりです。)
(?にはメモ帳の1〜18列を任意で選択できるようにプログラムしたいです。)
を作ってこれら二つを除算し、その結果を記録していくようにプログラムしたいと考えています。
プログラミングでいうと、下記エクセルデータの各行にx1,x2,x3,y1,y2,y3と名前を付け、x3,y3のみ読み込んで
計算過程に組み込ませたいです。
25 :
2012/08/23(木) 21:04:12.98
エクセルデータx
2.50E+01 5.31E-01 2.75E-01
5.00E+01 2.27E-01 4.22E-02
 ↓       ↓       ↓
(x1 x2 x3)
(1〜400個まで存在します。)
-------------------------------------------
エクセルデータy
2.50E+01 5.04E-01 2.70E-01
5.00E+01 2.08E-01 4.10E-02
 ↓       ↓       ↓
(y1 y2 y3)
(こちらも1〜400個まで存在します。)

一回の計算でアプリケーション内で変更するパラメーターは以下の3つにしたいと考えます。
「入力するメモ帳のファイル名、各メモ帳の1〜18列のどの列を入力するか、結果を出力する新規ファイル名」
(一回の計算で指定した1列だけの算出結果だけでなく、メモ帳内の3,6,9,12,15,18列をそれぞれの計算結果を一度に同じメモ帳の中で算出結果を
表示させたいと考えています。
稚拙な文章で申し訳ありませんが、よろしくお願いします。
26 :
2012/08/24(金) 16:55:29.16
>>20
Fortran で i は整数だぞ。聞き間違いか、そのおっさんがアホかどっちかだ。
後者の場合、かなりキているwww 
すぐ学生相談所に駆け込んで指導教官を変える実績作りを始めるべきw

close は、プログラムが終われば自動で閉じられるので、今の場合
たいした問題じゃない。

TRIMに関しては、コンパイラが手元にないのでよく分からんが、
エラーが出るとは思えない。まぁそれで動くというならよし、
文字列の尻に空白がついて困るというなら、なんとか考えるべしw

データを一度に計算したいというなら、大した計算量ではないので
計算は全データについて実行して、出力の所で選択するようにすればよい。
そのために、配列を拡張しておく必要がある。s, sx, sy

program test
implicit none
integer, parameter :: ncolumn = 18, ndata = 400
real :: a(ncolumn, ndata), x(3, ndata), y(3, ndata)
real :: s(ncolumn), sx(ncolumn), sy(ncolumn), tx(ndata), ty(ndata)
integer :: i, j, icol
27 :
2012/08/24(金) 16:56:50.09
! exel data y <----EXCELな
do i = 1, ndata
read(13, *) (y(j, i), j = 1, 3)
end do
close(11)
close(12)
close(13)

do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do
do i = 1, ncolumn
sx(i) = sum( tx * a(i, :) )
sy(i) = sum( ty * a(i, :) )
end do
s = sx / sy

write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_out
open(14,file=filenm_out)
write(14, *) 'input file name', filenm_in
write(14, *) 'column no.', icol
write(14,*) 'result=', s(3:18:3) ! <--結果を書き出すプログラム。
close(14)
stop
end program test
28 :
2012/08/25(土) 00:14:21.45
> i
do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do

↑強いて言えばこの実数計算に i が入ることが気に入らないんじゃないか
整数*実数は実数計算になるはずなので的外れだが。

> エクセルデータxを組み込んだ計算式:sx=s+(real(i)*50.0-25.0)*?*x3
> エクセルデータyを組み込んだ計算式:sy=s+(real(i)*50.0-25.0)*?*y3
-----------------------------------↑
この s って sx か sy の誤記?それとも別の変数?
29 :
2012/08/28(火) 04:12:53.24
>>27>>28
返信遅くなってすみません。家の方で一週間以上経っても書き込み規制が解除されないみたいで、
またネカフェからです。月曜日に現状の報告会があったので、準備やらなんやらで閲覧が
遅れてしまい、申し訳ありません。
毎回教えていただきありがとうございます。

>この s って sx か sy の誤記?それとも別の変数?
この質問なんですが、私の持っているfortranの本にシグマ(Σ)を使った合計値の算出のプログラム例に記されていたので
そのまま作ったものです。ですので、この形で載っていただけので、そのまま使っています。sは一応s=s+1みたいな感じで
s=1とすると右辺に数値が代入され、左辺にs=2と計算させるような感じで入力した値を表現したつもりです。
30 :
2012/08/28(火) 04:34:43.09
以下に順序を変更してみたプログラムデータをコピペします。

program test
implicit none
integer, parameter :: ncolumn = 18, ndata = 400
real :: a(ncolumn, ndata), x(3, ndata), y(3, ndata)
real :: s(ncolumn), sx(ncolumn), sy(ncolumn), tx(ndata), ty(ndata)
integer :: i, j, icol

character (len = 20) :: filenm_in, filenm_out
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_in
open(11,file= filenm_in)

do i = 1, 6 ! skip 6 lines
read(11, *)
end do

do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do    
close(11)

open(12, file = 'mydata1.csv')
! excel data x
do i = 1, ndata
read(12, *) (x(j, i), j = 1, 3)
end do
close(12)
31 :
2012/08/28(火) 04:41:41.98
! excel data y
open(13, file = 'mydata2.csv')
do i = 1, ndata
read(13, *) (y(j, i), j = 1, 3)
end do
close(13)

do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do
do i = 1, ncolumn
sx(i) = sum( tx * a(i, :) )
sy(i) = sum( ty * a(i, :) )
end do
s = sx / sy

write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_out
open(14,file=filenm_out)
write(14, *) 'input file name', filenm_in
write(14, *) 'column no.', icol
write(14,*) 'result=', s(3:18:3) ! <--結果を書き出すプログラム。
close(14)
stop
end program test

こういう順序の違いで計算結果って違ってきますか?
あと、最近ビルドした後コンパイルエラーばかり出てしまいますが、workplaceは一回ごとにこちらもcloseしないと
前のデータが残ってしまい、正しい計算ができない原因と考えられますか?
すみません、どんなことでも結構なので教えていただけると幸いです。よろしくお願いします。
32 :
2012/08/29(水) 16:39:14.45
program test
implicit none
integer, parameter :: ncolumn = 18, ndata = 400
real :: a(ncolumn, ndata), x(3, ndata), y(3, ndata)
real :: s(ncolumn), sx(ncolumn), sy(ncolumn), tx(ndata), ty(ndata)
integer :: i, j, icol

character (len = 20) :: filenm_in, filenm_out
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_in
open(11,file= filenm_in)

open(12, file = 'mydata1.csv')
open(13, file = 'mydata2.csv')
!メモ帳
do i = 1, 6 ! skip 6 lines
read(11, *)
end do

do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do    !
! exel data x
do i = 1, ndata
read(12, *) (x(j, i), j = 1, 3)
end do
33 :
2012/08/29(水) 16:39:45.01
! excel data y
do i = 1, ndata
read(13, *) (y(j, i), j = 1, 3)
end do
close(11)
close(12)
close(13)

do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do

do i = 1, ncolumn
sx(i) = sum( tx * a(i, :) )
sy(i) = sum( ty * a(i, :) )
end do
s = sx / sy

write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_out
open(14,file=filenm_out)
write(14, *) 'input file name', filenm_in
write(14, *) 'column no.', icol
write(14,*) 'result=', s(3:18:3) ! <--結果を書き出すプログラム。
close(14)
stop
end program test


34 :
2012/08/29(水) 16:42:53.89
上記で試してみたのですが、以下のようなエラーが起きてしまいました。(泣)
mydata1,2は自分で読み込みたいファイルを書いたのですが、、、

-------------------Configuration: 2012 - Win32 Debug--------------------
Compiling Fortran...
E:\2012.f90
E:\2012.f90(22): error FOR2934: lexical error: Invalid character
E:\2012.f90(22): error FOR3852: syntax error
E:\2012.f90(22): error FOR2934: lexical error: Invalid character
E:\2012.f90(22): error FOR2934: lexical error: Invalid character
E:\2012.f90(22): error FOR2934: lexical error: Invalid character
E:\2012.f90(22): error FOR2934: lexical error: Invalid character
E:\2012.f90(22): error FOR2934: lexical error: Invalid character
E:\2012.f90(24): error FOR3541: duplicated DO index variable - I
E:\2012.f90(29): error FOR3541: duplicated DO index variable - I
E:\2012.f90(36): error FOR3541: duplicated DO index variable - I
E:\2012.f90(41): error FOR3541: duplicated DO index variable - I
E:\2012.f90(55): error FOR3596: missing END DO statement
E:\2012.f90(55): warning FOR4265: symbol ICOL referenced but not set
Error executing fl32.exe.
012.exe - 12 error(s), 1 warning(s)
35 :
2012/08/29(水) 17:11:03.66
>>34
do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do    !
    ↑
ここに全角文字の空白が入っている。それでエラーが出ている。
削れ。
残りのエラーは、それを直せば消える。

あんま全角文字は使わない方がいい。
36 :
2012/08/29(水) 17:48:31.37
lexical error: Invalid character

エラーメッセージの意味を調べておくといいよ
37 :
2012/08/29(水) 19:26:06.86
program test
implicit none
integer, parameter :: ncolumn = 18, ndata = 400
real :: a(ncolumn, ndata), x(3, ndata), y(3, ndata)
real :: s(ncolumn), sx(ncolumn), sy(ncolumn), tx(ndata), ty(ndata)
integer :: i, j

character (len = 20) :: filenm_in, filenm_out
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_in
open(11,file= filenm_in)

open(12, file = 'waterdata.csv')
open(13, file = 'polystyrene.csv')
!メモ帳
do i = 1, 6 ! skip 6 lines
read(11, *)
end do

do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do
! exel data x
do i = 1, ndata
read(12, *) (x(j, i), j = 1, 3)
end do
38 :
2012/08/29(水) 19:28:30.86
! excel data y
do i = 1, ndata
read(13, *) (y(j, i), j = 1, 3)
end do
close(11)
close(12)
close(13)

do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do

do i = 1, ncolumn
sx(i) = sum( tx * a(i, :) )
sy(i) = sum( ty * a(i, :) )
end do
s = sx / sy

write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_out
open(14,file=filenm_out)
write(14, *) 'input file name', filenm_in
write(14, *) 'column no.'
write(14,*) 'result=', s(3:18:3) ! <--結果を書き出すプログラム。
close(14)
stop
end
39 :
2012/08/29(水) 19:32:33.20
>>35
上記でコンパイルすることができ、ご指摘本当にありがとうございました。
「icol」なんですが、warningがでてしまって、式に直接関係しない変数なので
消してみたら消えました。たぶん、自分の使っているバージョンが古いため
警告がでちゃったと思います。

(ncolumn, ndata)に関してですが、(18,400)に変更しても問題ないでしょうか?
師からわかっている値なのでこっちにした方がよいと言われました。

あと、本日コンパイルまで無事こぎつけることができたのですが、どうも計算結果がおかしい
ということだったので、師が今日初めて細かくプログラム内容を見てくれたのですが、
私の説明不足ですみません。以下にメモ帳のデータのところで追記させてください。

>>36
そうしてみます。
40 :
2012/08/29(水) 19:52:05.28
連投になって本当にすみません。
メモ帳のデータの全体像を以下に記載します。

いらない行1
いらない行2
いらない行3
いらない行4
いらない行5
いらない行6
1 .000E+00 .121E+06→→→.115E+07 .000E+00 .703E+06 .703E+06(18列)←ここが合計19列でした。すみません。
2.
3.



400
(全部で400行のデータが存在します。)

(18列)と説明してたのですが、ここが(19列)なので計算値が一個ずつずれて計算されていたため計算結果
が正しく算出されなかったのではないかという指摘を受けました。左端に1-400の整数部分の縦列 を除く2-19列
の指数表示のデータを読み込めるようにしたいです。
先ほど説明不足と書きましたが、僕の説明の間違いです。すいませんでした。

なのでこの部分を変更すればいいでしょうか?
  do i = 1, ndata
   read(11,*)!ここに一個整数のみ読み込まないように適当な変数をつけるべきでしょうか?
read(11, *) (a(j, i), j = 1, 18)
end do
! exel data x
do i = 1, ndata
read(12, *) (x(j, i), j = 1, 3)
end do
41 :
2012/08/29(水) 20:19:49.56
>>36

返信おくれてすみません。
lexical error :invalid character
語彙の 間違い:不正文字


オペレーターの入力ミスということでしょうか?
42 :
2012/08/29(水) 20:42:53.64
real :: dummy

read(11, *) dummy, (a(j, i), j = 1, 18)

または

integer :: idummy

read(11, *) idummy, (a(j, i), j = 1, 18)
43 :
2012/08/29(水) 20:46:18.21
>(ncolumn, ndata)に関してですが、(18,400)に変更しても問題ないでしょうか?
>師からわかっている値なのでこっちにした方がよいと言われました。

今時の常識では、数値述べたうちは避けて、常数にする。
Fortranの場合はparameterにするのがふつう。
44 :
2012/08/29(水) 21:38:00.28
>>43
ありがとうございます。
parameterというのはC言語でいうconstのような、
変数として宣言はするが変更はできないものと捉えて問題ないでしょうか?
となりますと「不要な6行」もそれに倣って

integer, parameter :: ncolumn = 18, ndata = 400, gomi = 6
                             ^^^^^^^^^
などとしておくべきでしょうか?

>>36
エラーの意味がやっと分かりました。
関数や変数に使えない文字を、クォートの外に書いてしまうと発生するエラーなんですね。
シンタックスエラーと似ていると思いました。
特に全角空白は識別しづらいので気を付けるよう留意します。

>>42
なるほど、ダミーを用意するのですか。こういう発想は素晴らしいと思います。
読み捨てるだけのために宣言される変数・・・儚いですね。


プログラミング自体が初めてなので右も左もわからない状態だったのですが、
みなさんのおかげで金輪際ここに来ることはないと思います。
長々とお付き合いいただきありがとうございました。
45 :
2012/08/29(水) 21:48:48.84
> FOR4265: symbol ICOL referenced but not set
参照しているけど値が入ってない、だとさ。

> 全角空白
IME から空白文字の入力を常に半角にすると良いぞ。

> 常数
定数じゃないのと思ったがどっちでもいいのか
函数と関数のような。

この 400 とか 18 とか何の数だったっけ?
とならんように意味のある変数(名前)で置く。
18 列じゃなくて 19 列だったときも ndata の値を変えるだけだ。
46 :
2012/08/29(水) 23:48:03.00
電車で帰宅してる間に携帯で見てたのですが、規制がかかっているので我慢できずに
ネカフェから書き込みます。
>>44
勝手に解決させないでください。あと僕になりすまさないでください。
初心者にしてはずいぶんとわかっている余裕感がうかがえますよ。
なんですか、この子供のような文章は?

>プログラミング自体が初めてなので右も左もわからない状態だったのですが
integer, parameter :: ncolumn = 18, ndata = 400, gomi = 6
                             ^^^^^^^^^
などとしておくべきでしょうか?

>>36
エラーの意味がやっと分かりました。
関数や変数に使えない文字を、クォートの外に書いてしまうと発生するエラーなんですね。
シンタックスエラーと似ていると思いました。
特に全角空白は識別しづらいので気を付けるよう留意します。

うそですよね、少なくとも初心者にはこんなこと言えませんよ。書き込みの時間帯も僕の書き込めない時間ですし。

「あと金輪際この掲示板にこない」と随分と礼儀知らずな事をおっしゃっていますが、>>44さんが
金輪際このスレに来ないってことですよね?
僕は初心者だし、これからもfortranでつまずいたらこちらで伺うつもりなので勘弁してください。

とりあえず、すべてのファイルで計算実行して違う値が出たので、グラフを手書き
で作成して師に明日持っていこうと思います。確認してもらったらまた報告します。
本日はどうもありがとうございました。

スレ嵐はやめてください、迷惑です。44さん、時間がないのであなたとも言い争っている暇はないですが、迷惑行為だけは
よそのvisual basicの方にでもいってやってきてください。

僕が書き込めるのは、17〜21時,それから帰宅の間は書き込めないので23時以降になります。
47 :
2012/08/29(水) 23:53:21.35
>>42
今後ともよろしくお願いします。
自分は無礼な発言やおかしいことは言いませんので、
その44の人は別人だし無視してください。
48 :
2012/08/30(木) 01:04:47.20
我々がこの「師」とやらと話し合った方が早いな
49 :
2012/08/30(木) 01:26:24.03
> よそのvisual basicの方にでもいってやってきてください。

失礼しちゃうわw
50 :
2012/08/30(木) 01:30:42.54
>>41 手元にマニュアルもないの? というか目を通してる?

どうやら荒らしらしい>>44にも有益な情報は含まれてるんだよな。
頭に血が昇ってるようだけど、もう少し言われたことについて自分で考えた方がいいぞ。
前スレから。
51 :
2012/08/30(木) 18:36:51.49
>>44
>parameterというのはC言語でいうconstのような、
>変数として宣言はするが変更はできないものと捉えて問題ないでしょうか?
間違っとる。parameterはread onlyのprotecrted変数とは違う。
parameterはコンパイル時に確定している値で宣言のサイズにも使える。
実行時にならないと確定しない変数とは違う。

>integer, parameter :: ncolumn = 18, ndata = 400, gomi = 6
>                        ^^^^^^^^^
>などとしておくべきでしょうか?
考え方は正しいが、ngomiのように先頭文字をi-nの間で始めるのが、
Gentlemanのたしなみ。さらに常数なので、i,j,kを避けるのが育ちの良さ。

>エラーの意味がやっと分かりました。
>関数や変数に使えない文字を、クォートの外に書いてしまうと発生するエラーなんですね。
違う。関数や変数に使えなくても普通にシンタックスエラーが出る記号文字もある。
全角文字は、二つの1バイト文字に解釈されて、そもそもFortran規格で
許されない文字に対応してしまうことがある。
またクォート以外にもコメントでは許されている。

52 :
2012/08/30(木) 19:24:39.72
お世話になります。
今日、師に計算結果をプロットしたグラフ用紙とそのプログラムを見せに行ったのですが、
確かに計算結果は正しい方向に向かっているが、ちょっと違うと言われました。

   do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do

do i = 1, ncolumn
sx(i) = sum( tx * a(i, :) ) ←ここが師は不明だと言っていました。
sy(i) = sum( ty * a(i, :) )
end do
s = sx / sy

プログラムを確認してもらったところ、
上記より上に関しては正しいが、上記の方法はわしは知らん、もし間違っているなら
ここだろうとのことでした。
また、iを整数にしないと計算結果は正しく出ない場合があるから直してと言われました。

(i * 50.0 - 25.0)←この部分なんですが、指数表示のデータがExcelデータx,yの1列目に
すでに表示されているので、Excelデータの1列目を3列全部読み込んでいるので
1,3列読み込んで、対応した値同士で計算させた方が良いというアドバイスを受けました。
下記にエクセルデータの全体像を記載します。
53 :
2012/08/30(木) 19:25:33.04
エクセルデータx
1列目   2列目    3列目
2.50E+01  5.31E-01  2.75E-01
5.00E+01  2.27E-01  4.22E-02
 ↓    ↓     ↓
(x1     x2      x3)
(1〜400個まで存在します。)
-------------------------------------------
エクセルデータy
1列目   2列目    3列目
2.50E+01  5.04E-01  2.70E-01
5.00E+01  2.08E-01  4.10E-02
 ↓     ↓     ↓
(y1      y2      y3)
(こちらも1〜400個まで存在します。)


   tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
ここを下記のように修正すれば良いでしょうか?
  tx(i) = x(1, i)* x(3, i)
ty(i) = x(1, i)* y(3, i)
54 :
2012/08/30(木) 20:25:51.02
修正すれば良いでしょうかじゃなくてまずはやってみろよ
前向きな姿勢は結構だけど結局は質問するばかり、
理解する力が著しく欠如しているのではないか
55 :
2012/08/30(木) 20:56:06.80
報告します。
先ほど、ビルドに成功して同じファイルを読み込んだのですが、微妙に値がズレてきました!
もう一回明日師に確認してもらいます。
result= 1.035215 1.035760 1.036275 1.036669
1.036880 1.036755

result= 1.035272 1.036202 1.037060 1.037667
1.037912 1.037520
56 :
2012/08/31(金) 11:37:20.94
tx(i) = x(1, i)* x(3, i)
ty(i) = x(1, i)* y(3, i)
     ↑
同じ数字が入っているはずだが、y(1、i)にした方がいいかな。

あと、
>エクセルデータy
>1列目   2列目    3列目
>2.50E+01  5.04E-01  2.70E-01
>5.00E+01  2.08E-01  4.10E-02
この数字が本当だとすると、 1カラム目は(i * 50.0 - 25.0) になっていないw

57 :
2012/08/31(金) 19:58:38.13
>>56
アドバイス有難うございます。
tx(i) = x(1, i)* x(3, i)
ty(i) = y(1, i)* y(3, i)

これに直してコンパイルしたところ、うまく結果が算出され、
師に確認してもらったところ、まぁいいんじゃないという
評価のグラフが書けました。

みなさんのおかげでここまで
来ることができ、大変感謝しています。
まだ別のデータが後200ほど残っているので、頑張ってタイピングしようと
思います。またやっていて困った時は相談にのってやってください。
ありがとうございました。

58 :
2012/09/05(水) 15:32:34.90
コンパイラを Intel visual fortran から PGI visual fortran に変更したところ、
ビルド時に
Unable to open MODULE file ifport.mod
でエラーになります。

ifport では access と DELFILESQQ を使用しているのですが、
PGIのコンパイラで使用できる同種のライブラリはありますでしょうか。
59 :
2012/09/05(水) 22:38:16.39
>>58
少しはマニュアルくらい読めよw
DEC時代の名前で存在している。ifortでなくてdfortとかiをdに変えればおk。
60 :
2012/09/07(金) 20:00:53.25
それで>>58は解決したのかよ。
PGIのCUDA対応に興味あるから、色々反応するの待ってんだけど。
61 :
2012/09/10(月) 16:56:11.03
>>60
解決しました。ありがとうございます!
62 :
2012/09/15(土) 18:54:35.08
急に質問してしまい申し訳ありません。
先月からfortranについて勉強し始めました。

ですが行き詰ってしまいました。
このような記述でディスプレイに計算結果を表示したのですが・・・
何故か表示される結果がCとDが2つづつ表示されるようになっています。

記述

   WRITE(6,50)A,B
   WRITE(6,60)C,D
 50 FORMAT('|A|=',F16.12,' |B|=',F16.12)
 60 FORMAT('C =',F16.12,' D =',F16.12)



結果
|A|= 0.999681111435 |B|= 0.025044224242
C = 0.025079839523 D = 0.000000000000
C = -0.000632444304 D = 0.000000000000


おそらくwrite文のフォーマットの記述がおかしいと思うのですが
どこがおかしいのか分からず質問させていただきました。
おかしな点を指摘していただけると幸いです。
63 :
2012/09/15(土) 19:24:02.52
たぶんおかしくない。それより WRITE(6,60) でソースコードを検索してみるべき。
64 :
2012/09/15(土) 19:31:56.26
↑すまん適当言った。C と D は複素数か配列じゃないだろうか。
65 :
2012/09/16(日) 17:07:32.38
>>64
ありがとうございます!無事解が一つのみ表示されました。
ご指摘の通りCとDが複素数で宣言されていました・・・・
それにすら気づかず、write文のせいにしていたのが恥ずかしいです。
大変助かりました!
66 :
2012/09/18(火) 19:39:09.67

すみません、質問です。

求めたい値=
(a*固定した数値1*メモ帳データx+b*固定した数値2*メモ帳データy+(1-a-b)*固定した数値1)/固定した数値1

a=1-exp(-11.88×s)
b=exp(-11.88×s)×1-exp(-11.88×t)

固定した数値1,固定した数値2,s,tはその都度自分の方で入力しようと思います。



メモ帳のデータx,yはどれも以下のような形式になっています。

1.010629 1.010828 1.011074 1.011356 1.012
1.010916 1.012412 1.014304 1.016474 1.012
1.011208 1.013878 1.017139 1.02069 1.012
1.011433 1.014934 1.019081 1.022747 1.012
1.011525 1.015284 1.019623 1.024372 1.012
1.011341 1.014313 1.017726 1.021465 1.012

ここから何行目の何列目を指定して一つの数値を計算式に代入して「求めたい値」を算出したいのですが
可能でしょうか?
67 :
2012/09/18(火) 19:44:05.52
すみません、追記です。

メモ帳データの数値はすべて使用して計算結果として算出したいので、
一枚のメモ帳に結果がすべて表示できる方法があったらお願いします。
68 :
2012/09/18(火) 19:50:35.33
この辺を見ておくといいよ
http://www.nag-j.co.jp/fortran/index.html
69 :
2012/09/19(水) 03:23:00.74
とりあえずファイルのデータを全部2次元配列に放り込んで
結果も2次元配列の内容を全部吐き出す感じでいいだろ。
x, y に任意の組み合わせを取るなら単純じゃなくなるが。
70 :
デフォルトの名無しさん
2012/09/21(金) 20:29:19.20
プログラムの歴史を学ぼうと思って、FORTRANからやってみようと思いました。

FOTRANのバージョンとか歴史はある程度理解したんですが、
WikipediaのFORTRANの歴史に載っています所謂IBM 704用のFORTRANの最初期の形なんてのは今のPCじゃ動かないんでしょうか?
標準入出力の関係もまだなかったみたいですし、多分そもそも現代のコンピュータ上では実装できないんでしょうけど。

FORTRANの歴史
http://ja.wikipedia.org/wiki/FORTRAN#FORTRAN.E3.81.AE.E6.AD.B4.E5.8F.B2

まぁ、今は諦めまして、Linuxにgfortranを入れたとこです。


Wikipediaの項目を見てたら下記リンクにあるのが昔の正規のドキュメントかなと思っているのですが、
さすがにコンパイラはIBMのものでしょうし、見ることができないですよね。出来たら初期の高級言語のコンパイラのソースも見てみたいんですけど。まぁ、見たってきっとわかりませんがね。アセンブラなんでしょうか?機械語?

Index of /pdf/ibm/704
http://www.bitsavers.org/pdf/ibm/704/

それで、これが一番最初のFORTRANの正式なドキュメントかな?と思っているのですが、当たりですかね?
http://www.bitsavers.org/pdf/ibm/704/FORTRAN_paper_1957.pdf
71 :
2012/09/22(土) 12:09:47.77
もともとが業務用だからね。
72 :
2012/09/24(月) 16:11:25.31
>>68>>69
ありがとうございます。
73 :
2012/09/24(月) 18:53:46.75
>>70
FORTRANの歴史を知りたいなら、Comuter History Museumをチェックしなければ
いかんがねー。
http://www.computerhistory.org/collections/fortranarchive/

たしか、バッカスのFORTRANコンパイラを作りたいと上申書みたいなメモから
あった気がする。マニュアルの類も文法書の他運用書などたくさんある。

704のエミュはなかったが、後のIBM360やIBM1130のエミュは存在している。
その上でFORTRANIVは動いている。FORTRANIIも動いていたかもしれない。
この時代のソフトウェアは著作権の概念がなかったのかパブリックドメインに
なっているよう。時代の進んだIBM370とかFORTRAN77のFORT VSとかのエミュはない。

昔のFORTRANのマシンコードなんかはパンチカードだか、ダンプリストだかが
うpされていた気がするので機械語レベルでは転がってる気がした。
74 :
2012/09/24(月) 18:57:59.58
エミュとかはComputerHistoryMuseumではなく、民間のおっさん達がやってる。
ググれば出てくる。
75 :
2012/09/24(月) 19:22:07.62
>もともとが業務用だからね。

もしかして“適用業務”のことかw
76 :
2012/09/26(水) 19:24:13.20
結局、自分でプログラム組めるほど頭良くないので電卓で手打ち
でやってたんですが、エクセルでやることにしました。
フォートランは、エクセルと比べどういう計算処理をする場合に
特化しているんでしょうか?計算するんだったらfortranが一番
おすすめだそうなのでやってみたんですがチンプンカンプンです。
(>_<)
77 :
2012/09/26(水) 21:49:19.25
Excel でできる程度の計算なら Excel でやれば良し。
Excel とか無い時代の産物なので、伝統か信仰によって勧められる事が多い。
78 :
2012/10/16(火) 20:22:35.55
質問があります
FORTRANを使って連番ファイルを読み込ませるためのgnuplotのバッチファイルを書きだそうとしているのですが、writeでどうやって書き出すのかわかりません
どういうことかというと、たとえば
plot "output[i].txt" u1:2
をi=1,10でwriteで出力するとき
write(filenumber,*) "plot "output[" i "].txt u 1:2"
となるためwriteで文字を出力するために使う”と、出力する文字の一つとして扱いたい”が干渉してしまうんです。


”を文字として出力するためにはどうしたらよいでしょうか?
どなたかわかる方がいたら教えていただけませんか?
79 :
デフォルトの名無しさん
2012/10/16(火) 21:27:08.31
>>78
確かにそういときどうすんだろ
考えたこともなかったわ
80 :
2012/10/16(火) 22:41:51.19
言ってる意味わからんw

do i = 1, 10
write(filenumber, '(a, i2,2, a)') 'plot "output[', i, '].txt" u 1 :2'
end do

これでどうだ?番号は 01,02,... ,10 となるが。
81 :
2012/10/16(火) 22:54:18.30
すまんこ。
>'(a, i2,2, a)')
i2.2  ↑  ピリオドな



ついでに。。。0が余計ならformatを動的に生成すればおk

integer :: i, klen, filenumber = 9
character (len = 80) :: fmt

do i = 1, 10
klen = int(log10(real(i))) + 1
write(fmt, '(a, i1, a)') '(a, i', klen, ', a)'
write(filenumber, fmt) 'plot "output[', i, '].txt" u 1 :2'
end do
82 :
2012/10/16(火) 23:03:43.98
'(a, i0, a)'
でいいんじゃないの?
83 :
2012/10/16(火) 23:35:22.01
>>82
うむ。
i0ってF2003からの機能だと思っていたが、F95から入ってたんだな。
勘違いしてたわ。
一応F95標準縛りをかけていたつもりだったので避けたが、i0 で楽勝だな。
84 :
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
85 :
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
みたいに配列を明示しようとすると
配列の形状が準拠していません。
とエラーが出ます。

()を省略しないで書く方法はないですか?
87 :
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(:))
にすれば()付きの書き方にはなります。
88 :
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

のようなことは関数の場合、出来ないのですか?
(:)だと出来ることが制限されてしまうような気がするんです。
89 :
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))

となるかな
90 :
2012/11/24(土) 14:54:58.79
それか関数の方を 配列じゃなくて 数値を引数とするように変更するかだな
91 :
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でもいい。
92 :
2012/12/01(土) 20:48:26.42
ELEMENTAL属性ってのは初めて聞いた 勉強になります
兄ぃありがとう
93 :
2012/12/02(日) 15:08:21.56
(ELEMENTALはPUREでもあるから強調しなくてもいいんだけどな…
94 :
デフォルトの名無しさん
2012/12/02(日) 16:57:51.30
x(:)=fd(w(:))
x=fd(w)

って同じ?
: つけとかないと配列であることを
忘れちゃうので
つける習慣にしているけど。
95 :
2012/12/02(日) 17:13:25.97
同じだけど、括弧をつけて配列であることを明示したほうがいいね
96 :
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
97 :
2012/12/03(月) 23:06:44.99
(キリッ
98 :
2012/12/04(火) 13:45:46.84
>>96
2003使ったことないけど、うーんと、
要は allocatable な変数は
allocate() 使わなくても、
: 無しで左辺において、
固定サイズ(か既に大きさの確定した配列)が右辺に来る代入式で
随時 deallocate して再び allocate した事にする、
ということなのかな?

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

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

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

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

とか、・・・英語複数形 s をだしたり隠したり、かな?
でも正直なところ、なくても困らんな。
102 :
2012/12/05(水) 18:22:09.77
88です。みなさんありがとうございます。
お礼が遅くなってすみませんでした。
まだ難しくてよくわからないので、素直に括弧つけます。
103 :
2012/12/06(木) 14:46:49.96
>>100 最近の言語は動的なんちゃらで、みんなそんな感じだから流行り
だろうね・・・でも量が多いと遅くなりそう。
そういう動的なことは Interactive な言語処理系でやればいいことで、
やることの量がだいたい前もって決まっていることを
なるべく早くたくさんがーっと処理したい、というのが Fortran 人wなので
・・・でもこのままでは老害って言われるし・・・うーん、むつかしいね。
104 :
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
この例はあらかじめ必要な配列の大きさが分かるが、計算してみないと
必要な配列の大きさが分からない場合は、大きめに取っておくか
二回計算する必要がある。
105 :
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
106 :
2012/12/06(木) 17:49:33.18
長さ同じだぞw
107 :
2012/12/08(土) 17:47:52.98
モジュール内で定義したグローバル変数を
プログラム内で変更しないようにするにはどうしたらよいでしょうか?
(変更があったらエラーを吐くようにしたい)

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

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

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

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

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

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

f77時代は1個のファイルにまとめた方が、引数チェックや最適化のメリットが
あったが、f90以降は、MODULEとか使えば、分割コンパイルにそれほど害はないズラ
122 :
2012/12/21(金) 15:22:10.79
インテルだと
ifort -ipo
でファイルがバラバラでも最適処理してくれるよね。
123 :
2012/12/22(土) 20:57:03.97
コンパイラが偉い
124 :
2012/12/23(日) 16:26:05.54
>>122 ifort -ipo
インテルの中に
はじめの一歩の
母ちゃんのファンがいるに違いない
125 :
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)
127 :
2013/01/04(金) 16:35:30.00
fortran2003のFLUSH命令を使え。
128 :
デフォルトの名無しさん
2013/01/04(金) 17:18:02.62
>>127
うぉー!ありがとうございます
129 :
2013/01/09(水) 11:54:21.56
linuxでfortran 77のコンパイラってありますか?
gfortranというのを使うらしいのでそれをインストールして試したのですが知人に貰ったfortran 77のコードがコンパイルできませんでした
130 :
2013/01/09(水) 12:25:08.67
>>129
gfortranは77に対応していません。

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

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

あと、昔のプログラムだと整数とからんだCOMMONやEQUIVALENCEの整合が狂って
謎な挙動をしたりするから困る。
135 :
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
138 :
2013/01/12(土) 14:57:23.92
third party というかソースのない、かつ組み込みでない関数/サブルーチンは
変換できないし、規定されていない方の値を渡すと意味不明な挙動になるぞ。

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

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

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

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

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

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

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

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

>>151
linux用ならnon-commercial板があると思うが
153 :
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
154 :
2013/02/22(金) 15:25:21.78
>>152
non commerical で検索したら見つかりました
ありがとうございます

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

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

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

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

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

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

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

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

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

リスト構造を無限ループで回してるところを
openmpで並列化したいんだけどできます?
167 :
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です.
169 :
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
170 :
2013/04/03(水) 19:16:56.67
>>168
'(g20.12e3)'で指数部の桁数を指定するとか
171 :
2013/04/03(水) 20:10:49.50
>>170
そんな仕様があったのか。知らんかった。
172 :
2013/04/03(水) 20:12:16.82
ごめんミス。171は169です。
173 :
2013/04/22(月) 08:17:30.46
知らない仕様っていっぱいありそう
174 :
2013/05/05(日) 23:04:55.44
f90って継続記号は行頭ではなく行末でないといけないんですよね?
例えば、
equation = A&amp;
     + B&amp;
     + C
みたいな式があってCの寄与をみるためにコメントアウトするとき
たまにBの後ろの&amp;をコメントアウトしわすれて面倒だったりしませんか?
絶対文頭につける仕様のほうが便利だと思うんですが・・・。
175 :
2013/05/06(月) 08:39:40.01
セミコロンで文末にできた気がする

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

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

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

ちなみにインテル Fortran なら /warn:interface でうるさく言ってくるようだ。
180 :
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)です。
この場合、コンパイルしてもエラーが出ませんでした。
181 :
2013/05/16(木) 03:42:38.83
つづき、

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

コンパイラはifortです。
できれば、これらのケースでのinterfaceの使い方を教えていただきたいです。
182 :
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
183 :
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
184 :
2013/05/17(金) 12:40:14.55
質問です。 計算の結果を.datファイルに書き込むプログラムを作成したのですが
datファイルの中身を確認すると文字化けしています。何がいけないのでしょうか?
OSはWindow7 64bit、コンパイラはFortran90です。「あらきけいすけの雑記帳」を参考にしました。
プログラムすべて乗せるとちょっと長いので関係有りそうな部分だけ。

最初はこのように宣言
open(1, file='1.dat', status='replace',access='direct',recl=4)

その後doで回しながら計算結果を書き込む
write(1,rec=(it-1)*39*39+(iz-2)*39+(ix-1)) p2(ix,iz)
185 :
2013/05/17(金) 16:50:59.44
direct access なら内部コードで書かれるんだから当然じゃ
186 :
2013/05/17(金) 18:02:03.27
>>182
そこに張られているものは問題ないと思う。
エラーメッセージはサブルーチンexsubが無いと言っているので、
call しているプログラムが exsub1,exsub2 になっておらずexsub になっていると思われる。
たぶんファイルのセーブ違い、コンパイル違い。

インターフェース+野良サブルーチンにするより、
サブルーチンは module に入れて module を use するのがふつう。
インターフェースは、外部ライブラリとか、関数引数みたいな場合以外は
出番なくてよし。

>>180-181
最新版の intel compiler ならエラーを出す。
ただし宣言元の配列の方が大きくて、サブルーチン側の配列がその中に納まるなら
問題は無いので何も警告しない。

そもそも66時代には、サブルーチン側の配列を10とかに宣言して
サイズの不整合を気にしなかったし、77で整合配列が導入されても
66時代からの習慣などで、整合性は気にしなかった。

配列サイズの整合に姑根性でうるさくされると、昔のプログラムが動かなくなるので
皆困る。おおらかに行こうぜ!

気になるなら、仮引数の終端の方を宣言しなければ、自動でコンパイラ様が
適宜取り計らってくれる。
real, intent(in) :: x(0:) みたいな。

>>184
書いたファイルの中身が見たければアクセスとか指定せずデフォでいけ。
(シーケンシャルアクセス)
write文は自由フォーマットwrite(1,*)で。
187 :
2013/05/17(金) 18:14:46.78
>>185,>>186
ご指導ありがとうございます。
fortranは初めて触った言語で、これで正しいのか不安だったので助かりました。
188 :
2013/05/17(金) 18:29:07.70
direct access は、大量のレコード長(データの長さ)が等しいデータを
書き出しておいて、読み出し/書き換え時に、ランダム位置に直接そのデータを
読みに行くときに使うもの。

普通に不定長のデータをファイルにだらだら書き出して、読み出す時も前から順番に
たらたら読み飛ばしつつ、欲しいデータを探して行くときは、
デフォルトのシーケンシャル・アクセスファイルでいい。

また、人間がファイルを覗いたりするなら、フォーマットを指定して/自由形式にして
読み書きすればいい。
write(1, '(2f15.7)') x,y
write(1, *) x,y

ファイルサイズを小さくかつ高速にアクセスしたいときは、
write文でフォーマットを指定せず、内部表現で読み書きするが、
write(1) x,y
189 :
2013/05/17(金) 18:52:41.78
>>186
ご指摘ありがとうございます。U島氏の本にて学習中の身です。

ソースを見直し改めてコンパイル、ビルドしましたが、
外部サブルーチンが読めないと警告してきます(もちろん実行はエラー)。
gfortranですと何の問題もないのですが・・・
上に貼ったものは、gfortranで通ったものを試したもので、
実は、ftn95環境下では、real(8)は、real(kind(1d0))へと正されました。

ひょっとするとまだ、当方が何か見落としているのでしょうか??
190 :
2013/05/17(金) 19:57:06.24
>>189
手元にFTN95の環境が無いので何とも言えないが、
gfortranで行くならftn95の問題かもしれない。

1個のファイルにまとめてみたらどうかな?
ただし、順番に依存するので、メインルーチンは最後に置かないと駄目だと思うが。

まぁサブルーチンをmoduleに入れた方がinterfaceも要らないし楽だと思うが。
191 :
HIROSHI
2013/05/19(日) 23:30:26.19
COMPAQ VISUAL FORTRAN6.6が WIN7 32 HOMEで起動しなくなりました。WIN32 PROでも起動しないことが他にあるのですが、しつこく起動することで使える状態です。
そこであきらめてDOSプロンプトでコンパイル しようと考えています。MAIN.F SUB1.F SUB2.Fのテキスト文がある場合のリンクの方法をお教えください。コピペでまとめてやればいいのですが
細かく ライブラリ化(というのですか) していきたいもので よろしくお願いします。
具体的に 例文で書いてもらったら助かります。
192 :
2013/05/20(月) 16:32:18.84
CVFは先祖がDEC Visual Fortran (DVF)なので、
dfでコンパイラドライバが起動する。

df sub1.f sub2.f main.f
で sub1.exe が出来上がると思う。
デフォでは実行ファイルの名前は先頭のファイル名になる。
moduleなどは先にコンパイルされている必要があるので、main program は
最後に来ることになる。

df /help もしくは-help でヘルプが出るだろう。


CVFは10年以上前のコンパイラなので、目的にもよるが
無理して使うよりは新しいのを手に入れた方がよいかもしれない。
同じプログラムでも、最近のコンパイラではめちゃくちゃ速く実行することが多い。
193 :
2013/05/21(火) 05:28:14.57
>>186
180です。結局、人間がチェックしないとダメみたいですね。
ありがとうございました。
194 :
2013/05/21(火) 15:15:10.76
>>193
正直Fortranではああいう書き方はあまりしないので、チェックにかからない。
66ならサイズは気にしないで、sub(x); x(10)
77なら整合配列で、sub(n, x); real x(n)
90なら形状引継ぎ配列で、sub(x); real, intent(in out) :: x(:)

配列を0から始めると苦難の道が待っているので、数学的要請でない限り
避けるのが吉。
195 :
2013/05/22(水) 22:19:07.20
4バイト整数の変数が,4バイトを超えたときエラーにならず変な値(マイナスになるはずのない値がマイナス)でそのまま計算が進んでしまいます。
プログラムのどのあたりで超えるか知りたいので,エラーで終了するようにするオプション又はデバッグオプションなどありませんか?

コンパイラ : intel fortran version 12 (CentOS 5)
196 :
2013/05/23(木) 01:46:16.08
>>195
昔のDEC Fortranにはinteger overflowの実行時チェックオプションがあったが、intel fortran になってから
そのオプションは無くなった。今もないんじゃないかと思う。
最近配列サイズが4byte整数を超えることが多くなってきたので、このチェックのあるコンパイラがあってもおかしくない気はする。

gfortranとかfreeのfortranも含めて
コンパイラオプションの説明を、便器を舐めるように注意深く読んで見るといいのではないか。
197 :
2013/05/23(木) 17:36:14.83
>>196
一応ifortのhelpでは,"整数"で検索かけてみたんですが,使える物はとくにありませんでした.
目視で全文確認してみます.
ありがとうございました.
198 :
2013/05/24(金) 03:07:21.20
貰い物の古いコードが、グローバル変数をCOMMON文でインクルードしている形式なのですが、
そこのCOMMON文に新しく変数を付け足したところ、
>COMMON のために、オブジェクトのアライメントが型と一致していません
>パフォーマンスに影響を与える可能性があります。
という警告が出ました。
変数の付け足す位置を変えたら出なくなったのですが、どういう意味かわかる方いらっしゃいますか?
199 :
2013/05/24(金) 16:05:35.20
>>198
32bitコンピュータとか64bitコンピュータと呼ばれるように、コンピュータは
ビットの塊を一括して処理する。メモリーアクセスは、0番地から32や64bit
の区切りで一括でなされる。この境界をまたぐと、本来1回で読み書き
できるデータに2回読み書きにいかなければならない。

そういうわけで、最近のFortranコンパイラは、自動的に境界合せをするようになっている。

ところがCOMMON文は、同じメモリー領域の割り付けだから、
コンパイラが変数の位置を勝手にずらすと、対応がずれてしまう可能性が出る。
それでアクセスが遅くなるよと警告している。


COMMON文はグローバル変数というよりも、メモリー割り付けの手動制御と
理解した方が良い。COMMONにあるのがREALとINTEGERだけの場合は、
ズレが起きることは(例外的な場合以外)ないが、文字列などがあると
すぐずれて色々警告される。文字変数は後ろの方に置くのが吉。


FORTRANコンパイラではREALとINTEGERのデフォサイズが共通であるという
(暗黙の?)約束がある。COMMON文での共有があるためだと思うが。
AUTODBLEをつかったりするとずれる可能性が出る。
以前GFORTRANだったかg95だったかが、この約束を破ってド顰蹙を買っていた。
200 :
2013/05/28(火) 02:56:21.83
はじめまして、こんにちは
現在、フォートランで数値計算をするプログラムを作っています。
今日、プログラム内で使っている配列のサイズを極端に大きくしたところ、スタックオーバーフローというエラーになりました。

解決策としては、コンパイルオプションでスタックを初めから大きくするというものがあるそうなのですが、この方法にデメリットはないのでしょうか?

また、これ以外の方法で、皆さんならどのようにオーバーフローを回避しますか?
201 :
2013/05/28(火) 14:05:42.30
>>200
サブルーチンとか関数で大きく確保しようとしたんだろ?

allocatableで確保すれば、ヒープ領域に取られるのでだいじょぶ。
202 :
デフォルトの名無しさん
2013/05/30(木) 12:08:48.19
次のようなデータをファイルから読み込みたいのですが,read文と書式をどう書けばよいか教えてください.

データの並びは
(親核種)(娘核種)(娘核種の比率)(孫核種)(孫核種の比率)(ひ孫核種)(ひ孫核種の比率)…
となっており,何世代まで子孫の核種があるかはファイルを読むまで分からないとします.
203 :
202
2013/05/30(木) 12:11:04.67
---------データの例(はじまり)-------------
Pb-202 Tl-202 1
Pb-210 Bi-210 1 Po-210 1
Pb-212 Bi-212 1 Tl-208 0.40 Po-212 0.71
Bi-210m Ti-206 1
Bi-212 Tl-208 0.36 Po-212 0.65
At-211 Po-211 0.58
Rn-222 Po-218 1 Pb-214 1 Bi-214 1 Po-214 1
---------データの例(おわり)-------------
204 :
202
2013/05/30(木) 12:13:11.61
read(unit=10,fmt='(A,100(:,A,E))') parent, ( progeny(i), progeny_ratio(i), i = 1, 100 )
このように書きましたが,Eに長さの指定がない,とエラーが出ます.

自分が分からない点は以下の二つだと思っています.
1. 任意の桁数の小数を読み込む方法がわからない
2. 一行に任意の個数だけデータが並ぶ場合のreadの仕方がわからない

コンパイラはgfortranを使っています.
205 :
2013/05/30(木) 19:01:21.13
>>204
結構めんどい。
1.任意の桁数の小数を読む最も楽な方法は、自由形式を使うことで、
空白とかコンマが区切りに入っていれば自動で切り分けてくれる。

自由形式を使わない場合は、動的にFORMAT生成する方法がある。

2.任意個のデータを読むのは、エラー上等で読み込んで、iostatで
エラーコードを調べて、END OF RECORD ならおkとか。


しかし、今の場合文字列処理の方が問題。固定長ならまだやりようがあるが、
Bi-210m みたいに長さの違うのが混じると苦しい。

結局、1行ごと文字列として読み込んで、空白をトークンとして自分でパース
していくのが素朴。

Fortran2003/08なら、もう少し柔軟なIOできるかもしれない。
206 :
2013/05/30(木) 19:03:15.49
program twochan
implicit none
integer, parameter :: nmax = 100
character (len = 136) :: buff
character (len = 10) :: parent, progeny(nmax)
real :: progeny_ratio(nmax)
integer :: i, k
do
read(10, '(a)', end = 999) buff
buff = adjustl(buff)
k = index(buff, ' ')
parent = buff(1:k - 1)
buff = adjustl(buff(k:))
i = 0
do while(trim(buff) /= '')
i = i + 1
k = index(buff, ' ')
progeny(i) = adjustl(buff(1: k - 1))
buff = adjustl(buff(k:))
k = index(buff, ' ')
read(buff(:k - 1), *) progeny_ratio(i)
buff = adjustl(buff(k:))
end do
print *, parent, (progeny(k), progeny_ratio(k), k = 1, i)
end do
999 stop
end program twochan

>>206 専ブラインデント用引用符
207 :
2013/05/30(木) 19:04:54.82
実行結果

Pb-202 Tl-202 1.000000
Pb-210 Bi-210 1.000000 Po-210 1.000000
Pb-212 Bi-212 1.000000 Tl-208 0.4000000 Po-212
0.7100000
Bi-210m Ti-206 1.000000
Bi-212 Tl-208 0.3600000 Po-212 0.6500000
At-211 Po-211 0.5800000
Rn-222 Po-218 1.000000 Pb-214 1.000000 Bi-214
1.000000 Po-214 1.000000
208 :
2013/05/31(金) 21:54:18.32
すばらしいです!ありがとうございました.

実は,自分もほぼ丸一日試行錯誤した末にできたのですが,
なぜ自分のプログラムがうまく動くのか説明できません.
教えてもらった方法をこれから読んで勉強しようと思います.
209 :
デフォルトの名無しさん
2013/06/11(火) 09:28:34.46
gfortranで通常の宣言型を超えて桁数の上限なしの計算をしたいのですが、

質問1)GMPというのを使えば良いのですか?
(既にPCに入っているとしたら、Ubuntuの場合は、どこのなんてファイル群?)

質問2)GMPを使うとして、どのようにソースを書けば良いですか?
(FMLIBの場合は、最初にuse FMZMとして、型宣言の時にtype(IM)とか)

質問2)他にもっと多倍数演算に向いたツールはありますか? 
210 :
2013/06/11(火) 19:54:51.69
質問です学校で COMMAND入力に「XX<YY.dat」という操作をしたのですがどういう意味でしょうか?
211 :
2013/06/11(火) 20:48:28.96
>210

XXというプログラムにYY.datというデータを入力したと
いうことです。
XX>YY.datとすると、XXというプログラムの出力を
YY.datというファイルに出力することを意味します。
212 :
2013/06/12(水) 15:25:51.17
>>209
FMLIBかMPFUNでいいんでね?
Fortranで書かれてるし。
213 :
デフォルトの名無しさん
2013/06/15(土) 12:45:05.08
>>212
FMLIBにて成功しました。ありがとう。
今までintegerしか多倍数演算できなかったんだけど、FMLIBのほうがいい。
214 :
デフォルトの名無しさん
2013/06/17(月) 11:48:46.18
C program main
implicit real*8 (a-h, o-z)
real*8 aa
parameter (c=1.0D0, aa=1.0D0, nmax=200, dx=aa/nmax)
integer n
real*8 x(0:1000)
real*8 y(0:1000)
real*8 k1,k2,k3,k4
open(11, file='0606-1.4data', status='unknown')
C * initial value of y
y(0)=1.0D0
x(0)=0.0D0
n=0

C * solution at x(n)=(n+1)*dx
1 q=1.0d0
p=1.0d0-q
a=q*0.50d0
b=q*0.50d0
215 :
デフォルトの名無しさん
2013/06/17(月) 11:56:31.99
k1 = func(x(n),y(n))
k2 = func(x(n)+b*dx,y(n)+a*k1*dx)
g = p*k1 + q*k2
y(n+1) = y(n) + g*dx

x(n)=(n+1)*dx
ERR=abs(exp(x(n))-y(n+1))
if (mod(n+1,10).eq.0) then
write(6,200) x(n+1), y(n+1), ERR
write(11,200) x(n+1), y(n+1), ERR
end if

if(n==nmax) then
stop 'ended'
end if
n=n+1
go to 1

close(11)
200 format('x=', E13.6, ' result y=', E13.6, ' error ERR=', E13.6)
stop
end
216 :
デフォルトの名無しさん
2013/06/17(月) 11:59:42.72
real*8 function func(x(n),y(n))
implicit real*8 x,y
integer n
real*8 x(0:1000)
real*8 y(0:1000)
func = y(n)
return
end function func


214-216はつながっています。
関数の副プログラムを利用したいのですが、認識してくれません。
どうすればよいでしょうか?
エラー箇所は、Two Main Programsというやつのみでした。
217 :
2013/06/18(火) 14:40:19.36
>>216
関数の定義の所がおかしい。x(n),y(n)→x,y
IMPLICIT文の文法がおかしい。括弧で変数をくくる必要あり。
real*8 function func(x,y)
implicit real*8 (x,y)

今のコンパイラは多少のエラーがあっても、適宜仮定してコンパイルを
続行するが、いまfunction定義の頭部が無視されてコンパイル続行されたため
end文が2回出てきて二個メインプログラムがあるように解釈されたと思われ。

F77的な古典的な書き方をしていて、77本を真面目に勉強しているのだと思うが、
(それはそれで大変結構だが)
副プログラムをMODULEに入れるとかF90以降の現代風にすると、
もっとエラーが容易に見つかる確率が上がると思う。
218 :
2013/07/01(月) NY:AN:NY.AN
最近の大学では数値計算+Fortranの教科書は何を使ってるんだい?
コンピュータの数値計算一切やらないまま入ってくる学生がいて自習してほしいんだが
ヤングに嫌がられないお勧めあるかね?
219 :
2013/07/05(金) NY:AN:NY.AN
ナウいヤング向けの言語はJavaとかか
220 :
デフォルトの名無しさん
2013/07/11(木) NY:AN:NY.AN
自由端反射のプログラムで質問です。
program wave
implicit none
real,dimension(5,0:30)::f
integer::i,n,p,q,r,s,t,u,k
do s=0,30
do q=1,5
f(q,s)=0
end do
end do
do n=1,300
f(3,30)=0
f(3,0)=exp(-((n-30.)/10.)**2)
do k=0,28
f(3,k+1)=2*f(4,k)-f(5,k)+(f(4,k+1)-2*f(4,k)+f(4,k-1))/4.
end do
221 :
デフォルトの名無しさん
2013/07/11(木) NY:AN:NY.AN
do p=0,30
f(1,p)=n
f(2,p)=p
write(*,*)f(1,p),f(2,p),f(3,p)
end do
write(*,*)
do t=0,30
f(5,t)=f(4,t)
f(4,t)=f(3,t)
end do
end do
end program wave
222 :
デフォルトの名無しさん
2013/07/11(木) NY:AN:NY.AN
というプログラムを出力した結果たしか
1. 0. 0.00223
1. 1. 1.4848
ってなって最初fを全部0にしたのにf(3.2)が1.4848となります、何が悪いでしょうか?
223 :
2013/07/12(金) NY:AN:NY.AN
>>222
do k=0,28
f(3,k+1)=2*f(4,k)-f(5,k)+(f(4,k+1)-2*f(4,k)+f(4,k-1))/4.
end do

これでk=0の時、f(4,k-1)→f(4,-1)で配列はみだしだからじゃないか?
まずdebug mode サブスクリプト・チェックをかけて実行しろ!
224 :
2013/08/02(金) NY:AN:NY.AN ID:Kz7Qk8/h!
openmp を使って並列化しようと思ってるんですが、スレッドセーフな副プログラムを作るのに気をつけるのってどういう点ですか?
save と common を使わなければいいだけでしょうか。
save を避けなければならないばあい、擬似乱数のように前の状態を保存しておかなければならないような副プログラムはどうやって作ったらいいでしょうか。
225 :
2013/08/04(日) NY:AN:NY.AN
引数で前の状態を渡し、引数に次の状態を戻す
呼び出し元スレッドと内容を共有するので、実引数は
private なのか share なのか明らかにすること
226 :
2013/08/04(日) NY:AN:NY.AN ID:zEmYUazP!
なるほど。ありがとうございます。
227 :
2013/08/05(月) NY:AN:NY.AN
OpenMPとの整合はよく分からんが、F95以降では
pure接頭子で依存性の無さを保証できる。
というかコンパイラがチェックしてくれる。
228 :
デフォルトの名無しさん
2013/08/06(火) NY:AN:NY.AN
Visual Basicで下記のバイナリ出力したグリッドをfortranで読み込ませようとしてますが,
できません.input statement requires too much data, unit 10
とでます.
229 :
デフォルトの名無しさん
2013/08/06(火) NY:AN:NY.AN
Dim doutpgrid As New System.IO.BinaryWriter(New System.IO.FileStream(Outputfile, IO.FileMode.Create, IO.FileAccess.Write))
For i = 1 To nz
For k = 1 To ny
For j = 1 To nx
doutpgrid.Write(nheader)
doutpgrid.Write(dblX(j, k, i)) : doutpgrid.Write(dbly(j, k, i)) : doutpgrid.Write(dblz(j, k, i))
doutpgrid.Write(nfooter)
Next j
Next k
Next l
230 :
デフォルトの名無しさん
2013/08/06(火) NY:AN:NY.AN
open(10,file='grid.dat',form='unformatted')
do 115 k=1,kmax1
do 115 j=1,jmax1
do 115 i=1,imax1
read(10) xd(i,j,k),yd(i,j,k),zd(i,j,k)
115 continue
close(10)
です.誰か教えてくださいnheaderなどはinteger, dblXはdoubleです.
231 :
2013/08/06(火) NY:AN:NY.AN
VBの事は、よく分からんが、少なくともFortran側でnheaderとnfooterを読むか
読み飛ばすかしないと、つじつまが合わないだろう。

いきなりエラーが出るなら、nheaderのintegerを三個の倍精度で読もうとして
要素が足りないと叱られたと思われる。
バイナリだとずれたまま読みそうな気もするが・・・
232 :
2013/08/06(火) NY:AN:NY.AN
unformatted で sequential なファイルは次のレコード(記録)の組を飛ばすのに
何バイト読み進めればいいかを各レコードの前後に整数値として記録しているらしい
レコードは1文の read/write で扱われる単位とみていいはず
(このせいで妙にファイルサイズが膨らんだりする)

>>229 nheader と nfooter の値を確認
233 :
2013/08/07(水) NY:AN:NY.AN
シーケンシャルなUnformattedなら、Fortran独自の形式だからVBの出力は
読めない気もする。
>>232の言うとおり、Fortranでは読みとばしとBACKSPACEでの逆行のために、
各レコードの前後にレコード長が記録されている。

F2003からの機能だが、STREAMモードで読むか、あるいはF77にこだわるなら
DIRECT形式で無理やり読む方法がある。どちらも読み込み単位が処理系によって
BYTEだったりWORDだったり依存性がるので調べる必要がある。
またDIRECT形式は大抵は普通にべた書きだが、処理系によってはヘッダが付いたりするので
これも調べる必要がある。

よく分かんないんだったら、素直に書式付とかCVS形式とかで出して
読むのが吉。
234 :
デフォルトの名無しさん
2013/08/09(金) NY:AN:NY.AN
gfortranでポインタの初期値をnullにするコンパイルオプションをおしえていただけないでしょうか。


Linux上でintel fortran compilerでコンパイルしていたものを
windows上で動作させるために、g95とgfortranでコンパイルしようとしました。

ifortではデフォルトでポインタはallocateされていないのですが
g95やgfortranではそうではないようです。


g95では-fpointer=nullで初期値をnullにできるのですが
私のソースコードをコンパイルすると、コンパイラの内部エラーと言われます。

gfortranでは上記に対応するコンパイルオプションはないでしょうか
235 :
2013/08/10(土) NY:AN:NY.AN
internal compilation error って要するにコンパイラーのバグなんじゃ…
236 :
2013/08/28(水) NY:AN:NY.AN
初心者というか入り口にすら立ってないため質問させていただきます。

MUMPSっていうライブラリをMinGW環境で使いたいため
g95ってコンパイラをダウンロードしようとしているのですが
公式ページでもファイルが見つかりません。となって困ってます

みなさん、g95はどこから入手されているのでしょうか?
それともg95-MingW.exeが消されたのには何か理由があるのでしょうか?
237 :
2013/08/29(木) NY:AN:NY.AN
g95は最近メンテされてないから、gFortranでいけ。
たぶん大丈夫。
238 :
2013/09/10(火) 14:58:43.49
do 1100 III=1,400
*
if(QQP(III).eq.0.) go to 1100
NP=ifix(QPP*QQP(III))
*
do 1000 I=1,NP
*
E0=float(III)*50.-25. !
* Incident point 4mmφ
60 do IJK=1,2
IY(KR)=mod(IY(KR)+IY(JR),mmd)
X(IJK)=float(IY(KR)+1)/dmd
JR=JR-1
if(JR.eq.0) JR=55
KR=KR-1
if(KR.eq.0) KR=55
end do
239 :
2013/09/10(火) 15:00:46.05
CX00=(1.-X(1))*0.4
CY00=(1.-X(2))*0.4
*
CX0=25.+CX00 !
CY0=25.+CY00 !
CZ0=0. !
*
CA2=1.
SA2=0.
CB2=1.
SB2=0.
*
JJJ=1
JJJJ=0
*
* --------------------------------------------------------------
*
70 JJJJJ=0
*
if(E0.lt.10.) go to 880
*
XE0=log(E0)
ka=2
72 if(E0.lt.ATTEN(5,ka)) then
XAT11=log(ATTEN(1,ka))
240 :
2013/09/20(金) 09:08:24.47
なんだどうした?
241 :
デフォルトの名無しさん
2013/09/26(木) 12:57:51.56
pointer(pvar,var(*))
これってどういう意図ですか?
242 :
2013/09/26(木) 13:30:22.80
メモリポインタ
243 :
2013/09/26(木) 22:50:44.43
それはクレイ・ポインタと呼ばれるもので、クレイのFortranにあった非標準命令。
だがクレイが普及していたアメリカでは準標準みたいになったので、いまでも結構多くのFortranで使える。

まぁFortran2003の命令で、(工夫すれば)置き換え可能なので、もうあまり使われない。
POINTER (pointer, pointee)
ポインタ(整数変数)にはポイントされるもの(pointee)の番地が入るようになる。
244 :
2013/10/01(火) 12:17:05.23
>>243
ありがとうございます。

Fortran77では
pointer()もmalloc()も非標準ということですか?
245 :
2013/10/02(水) 00:38:14.04
>>244
両方非標準。

FORTRAN77以前では動的にメモリーを確保するための拡張命令があったり、
あるいはCのルーチンをリンクしていた。
Fotran90以降ではallocate命令が入った。

そのプログラムが書かれた対象マシンが分かるなら、ググればそれ用のFORTRAN77のリファレンス・マニュアルが落ちていると思う。
246 :
2013/10/08(火) 10:10:31.65
>>245
遅くなりましたが、
ありがとうございます
247 :
2013/10/13(日) 00:13:41.19
77で書いてあるプログラムが今のコンパイラで動くようにデバックしているのですが
common文で宣言している変数をmoduleでグローバル変数に変えたら、equivalence文でエラーが出てしまいます。
そこでこのequivalence文のところを変えようと思うのですが、90/95ので代わりとなる構文ってありますか?
248 :
2013/10/13(日) 01:48:53.15
>>247
直接の代替はない。
Fortran90/95で推奨されているEQUIVALENCEの代替は、TRANSFER関数でメモリー内容を別メモリーに
移せというもの。EQUIVALENCEのメモリー共有とは違い、二つの変数間の型変換を伴わない内容の代入にあたる。

古い時代にCOMMONやEQUIVALENCEがあったのはメモリーが少なくて、同じ領域を使いまわしたかったから。
COMMONやEQUIVALENCEによるメモリー共用が、コンパイラの最適化を妨げるから廃止に向かった。

COMMONを単なるグローバル変数とみなすと、移植で非常にめんどくさいことになることがままある。


なおFORTRAN77はFortran90に完全に含まれているので、今のコンパイラでも多少のオプション変更で書き直さなくても動くはず。
249 :
2013/10/13(日) 13:51:31.72
>>248
ありがとうございます!
コード書き換えすのは止めてもう少しオプションいじくってみます。
250 :
2013/10/15(火) 22:40:32.54
初期値も何も与えてない変数の値って0ですよね?
それが0ではなくとてつもなくおおきな値になることってありますか?
251 :
2013/10/15(火) 22:51:06.34
いいえ
はい
252 :
2013/10/15(火) 23:17:41.03
>>251
まじっすか
253 :
2013/10/16(水) 01:37:15.62
変数がゼロになってるなんて思ってたのかよw
コップや皿を洗わないで飲み食いするタイプか?
254 :
2013/10/16(水) 01:42:01.37
規格上は不定らしいよ。
ttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14106144349
ttp://ruby.gfd-dennou.org/products/ruby-dcl/ruby-dcl-doc/math1/node9.html

超初心者用スレなのに、みんな厳しいね…
255 :
2013/10/16(水) 02:01:47.72
初心者スレだったか、めんごめんご、すまんこ、おまんこ。

昔の日本の大型計算機のFORTRANは0クリアしていることが多かった。
IBMはごみだらけの状態でよこしてた。

今もリンカのオプションでゼロクリアできるものが多い。
256 :
2013/10/16(水) 23:48:35.58
なるほろ〜不定なんですね。

いや実は昔のプログラムを今のコンパイラで動かしているところなんですが
通常なら0であるぺき変数が変な値になってしまいうまく動かなかったんです。

オプションで0クリアにしたらうごくかもしれません。ありがとうございました。
257 :
2013/11/07(木) 23:56:00.54
258 :
2013/11/08(金) 11:47:40.89
デバッグしているのですが
THDFEというサブルーチンで仮引数(x)を動的割付け配列で宣言し直したところ

”THDFEにおいて存在しないもしくは誤った引数仕様ブロックです。ー仮引数x(第三番目)は割付け配列です。”

とエラーが出たんですが。意味がわかりません。詳しく教えて下さいm(__)m
259 :
2013/11/09(土) 00:08:06.89
この質問じゃ情報少なすぎ。
せめてエラーメッセージそのものを貼るべき。

まぁ呼び出し側の配列が、割り付け属性を持っていないという程度の誤りだろう。
260 :
2013/11/09(土) 10:26:20.66
>>259
”THDFEにおいて存在しないもしくは誤った引数仕様ブロックです。ー仮引数x(第三番目)は割付け配列です。”
一応これがエラーメッセージそのものなんです。

>>まぁ呼び出し側の配列が、割り付け属性を持っていないという程度の誤りだろう。
THDFEは外部副プログラムなんですが。このブロックでの仮引数は割付属性を持たないってことでいいんでしょうか?
261 :
2013/11/09(土) 13:01:13.70
それはエラーメッセージそのものじゃないだろ。
エラー番号とか全部込々で貼れよ。
質問の仕方が悪いといつまでも答えが出ないぞ。

大体、サブルーチン側で文句を言われているのか、呼び出し側で文句を言われているのか
それすら判然としないだろ。
262 :
2013/11/09(土) 16:41:00.84
>>261
すみません・・・

これがエラーメッセージです。

実行時エラー: ../sorcefile(先生)/HTHDFE.f90(1): THDFEにおいて存在しないもしくは誤った引用仕様ブロックです - 仮引数X(第3番目)は割付け配列です
致命的なエラーでプログラムが終了しました

サブルーチン(THDFE)側のほうでエラーメッセージがでます。
263 :
2013/11/09(土) 19:18:40.37
>>262
interface文を書いてないとか?
それと仮引数に割り付け配列を指定できるのはFortran2003以降のはず。
Fortran95の拡張仕様TR15581をコンパイラがサポートしていれば問題ないけど。
264 :
2013/11/09(土) 19:54:41.21
>>263
コンパイラはfortranbuilder5.3.1でfortran2003にも対応しています。
integerface文を加えれば問題ないでしょうか?
265 :
2013/11/09(土) 20:33:20.29
integerfaceじゃなくてinterfaceなw
266 :
2013/11/09(土) 21:14:09.73
>>264
手元にあるFortran2003の言語仕様(draft)の257頁から抜粋すると

"A procedure shall have an explicit interface if it is referenced and
The procedure has a dummy argument that has the ALLOCATABLE attribute"

となっている。"explicit interface"が必須だからinterface文を書けばいいと思う。
それと、紛らわしいのでFortran2003ならファイルの拡張子も変えたら?
267 :
2013/11/10(日) 00:04:40.45
>>265
ほんとだww interfaceってうったつもりだったのにww
>>266
そうします。ありがとうございました!
268 :
2013/11/10(日) 00:04:41.77
interface 書くより、サブルーチンをmoduleに入れたほうが楽でいいぞ。
269 :
2013/11/10(日) 00:13:46.52
スレ違いかもしれないけど、とあるf77プログラムのクローンを作りたいのだけど、
どこまでやれば別のプログラムと認められるんだろう?
入出力仕様や数式まで立ち帰って、スクラッチから書けば完璧なんだろうけど、
作業量的に厳しいというのが本音。
固定形式から自由形式に書き換えた程度じゃダメかな。
参考になるようなサイトとか有れば教えてください。
270 :
2013/11/10(日) 00:23:01.23
引用とか数行とかの範疇を超えて、見ながら書いたのなら原型を留めてなくても派生物じゃね?
極端な話他言語に移植しても、ロジックが同じなら派生物
271 :
2013/11/10(日) 00:28:13.72
横からすまんが、Intel Fortranではソース・ファイルの拡張子は、
固定形式が.fないし.forで、自由形式は.f90になっていて、
.f95とか.f03とかは、存在が間違っているとされているんだが、
ホントのとこはどうなの?
272 :
2013/11/10(日) 00:35:04.17
>>271
Intel Fortran compiler 14.0のリファレンスではそうなっている。
273 :
2013/11/10(日) 02:11:25.87
>>272
intel がそうなっているのは知っているが、実際はどうなのか?
他のベンダーはどうなのかね?
274 :
デフォルトの名無しさん
2013/11/10(日) 07:18:49.19
>>273
言語仕様では拡張子は規定していないのでコンパイラ依存。
275 :
デフォルトの名無しさん
2013/11/10(日) 19:10:31.00
すみません、equivalence が理解できず、もしご存じの方が
いらっしゃいましたら、アドバイスを頂けないでしょうか。

勉強のために下記のテストコードを書いてみました。
まず、整数型配列 a1 と a2、実数型配列 a3 に適当な値を代入し、
その後 equivalence文によって a1(1) と a(1) のアドレスを一致させ
配列 a に配列 a1 〜 a3 の値をコピーしてみました。

最後に write 文で配列 a と、配列 a1 〜 a3 までの値を
それぞれ出力させて比較したのですが、両者では実数型配列
a3 の値だけ異なっています。

私のつたない理解では、おそらく equivalence で実数型配列
a3 の値を整数型配列 a にコピーしたのが原因なのではないかと
思っているのですが、配列 a3 を用いずに 配列 a から実数型を
出力させるにはどのようにしたらよろしいのでしょうか?  
(dble(a(i)) i=201〜300 としても駄目でした。)

お教え頂けますと大変ありがたいです。
どうぞよろしくお願い致します。
276 :
275
2013/11/10(日) 19:11:25.56
なお、コードは以下になります。
どうぞよろしくお願い致します。

program test
implicit none

integer(kind = 4), dimension(300) :: a
integer(kind = 4), dimension(100) :: a1, a2
real(kind = 8), dimension(100) :: a3

equivalence ( a1(1), a(1) )
common /array/ a1, a2, a3
integer(kind = 4) :: i

do i = 1, 100
a1(i) = i*1
a2(i) = i*2
a3(i) = i*3.0d0
end do

do i = 1, 300
write(10, *) a(i)
end do

do i = 1, 100
write(11, *) a1(i), a2(i), a3(i)
end do

end
277 :
2013/11/10(日) 23:00:46.41
>>270
やっぱり肝はロジックかぁ。かと言って、違う答えが帰ってきても困るしなぁ。
まぁ、元のソース見れる奴が、クローン作りました、でもこっちのソースは非公開。
なんて言っても、周りから見たら限りなく黒に近いグレーだわな。
割に合わなさそうだし、諦めるかな。

>>275
実数型と整数型だと、メモリの使い方が違うから、
実数型は入っている領域(の一部)を整数型で解釈しても、
実数型で入れた値にはなりません。という説明で良いのかな。
278 :
2013/11/10(日) 23:29:50.05
>>275
イマイチ何がしたのか分からんが、こうすれば一応望みの結果は得られる。

do i = 1, 300,2
write(10, *) transfer([a(i),a(i+1)], 0.0d0)
end do

これは、x86のようなリトル・エンディアンCPU向けの場合。
PowerPCとかビッグ・エンディアンの場合は、[a(i+1),a(i)]
279 :
2013/11/10(日) 23:56:18.99
[ ]はFortran2003、F90/95なら(/ /)で。配列構成子(array constructor)

倍精度実数と整数をEquivalenceで同じ番地を共有させているから、
整数2個毎が倍精度実数1個に対応している。
(KINDの数字は必ずしもバイト数に対応すると限らないが、慣習から仮定して)

エンディアンによって、メモリー上の倍精度実数の上位と下位が入れ替わるので
適宜対応する必要がある。

それをF90以降のTRANSFER関数で、メモリー内容を第二引数の型で解釈している。

単精度実数なら他に単にFORMATを実数用にして強行突破する方法も考えられる。
倍精度の時は難しいかな??
280 :
2013/11/14(木) 00:03:06.56
Fortran2015に関するまとめサイトとかないかね?
今度は何を付け加えるのさ?
281 :
2013/11/19(火) 00:19:07.21
すんません。
数値計算する際、expとかの値が大きすぎたり、小さすぎたりしてオーバーフローしたり、exp(x)のx が限りなくゼロに近い時とか、欲しい値が得られません。
みんなはどうやって回避してますか?

よくよく考えたらexp1000 とかオーバーフローしますよね。
282 :
2013/11/19(火) 10:23:13.29
ここの人はフォートランはわからないから他いけ
283 :
2013/11/19(火) 18:58:29.45
>>281
精度の問題がないなら対数を取って計算すればいいじゃない
というか、それは浮動小数点演算の本質的な問題だから
まず数値計算の基礎を勉強することをお勧めする
284 :
2013/11/19(火) 19:01:27.99
書き込んでから気付いたが、もしexp(1000)の値を実際に表示したいのなら
多倍長計算とかしかないな
285 :
2013/11/19(火) 23:54:23.18
>>283
何がオススメですか?参考書的なもので。
ちなみにプランク関数とか値がどでかい物やらプランク定数のようなちっこいものまぜまぜして計算することが多いので困ってます。やはり対数でやるべき?
286 :
2013/11/21(木) 22:58:26.48
プランク常数とか絡むなら、それを1に規格化して計算するのが常識だろ。
まず少し基礎的な本から読め。
287 :
2013/11/23(土) 22:34:38.75
みんなどんな環境でやってるんだろ
Cygwin+Emacs?
288 :
2013/11/24(日) 13:01:18.20
コマンドプロンプト+メモ帳 まじで
289 :
2013/11/24(日) 17:24:01.41
>>286
え?そうなんですか?
だからその基本的な本というのを紹介してくれませんか?

フォートランの本
290 :
2013/11/24(日) 17:42:02.66
>>289
言語の本より数値計算(数学)の本のがいいんでないか?
291 :
2013/11/26(火) 01:02:17.85
>>289
伊理正夫の「数値計算の常識」の中に無次元化の章があったはず。
大した事書いてないが常識として程度は知っておくべき。
大体、無次元化していないと、素人・非常識・DQN・支那チョン・ごみ・カス・クズ扱いされる。

この本の前半は面白いし為になるので買って損はない。


シュレディンガー方程式を解きたいんだったら、原子スペクトルの本なら大抵、原子単位系(atomic unit)への変換の章が
頭の方にある(エネルギーをハートリー、長さをボーア半径にする)。この辺は少し詳しい量子力学の本にもある。

まぁ今ではエネルギーの単位をハートリーでなくてリードベルグに取ることが多い気もするが。
クーロン項の分子が1になるか2になるかの違いだ。
292 :
2013/11/27(水) 07:09:22.09
>>291
うぉぉ。。。ありがとうございます。
かなり貴重なお話しです。
まずは「数値計算の常識」買ってみます。
293 :
デフォルトの名無しさん
2013/12/31(火) 13:22:54.27
データから近似式を出すソフトみたいのないですかね?できればフリーで。
Fitykではなんだかできなかった…
294 :
2014/01/01(水) 00:01:57.16
それはFORTRANスレで聞く内容じゃない
295 :
2014/01/01(水) 02:29:24.68
>>294
どこで聞けばいいの?
わからないならレスしないであげれば?、
296 :
2014/01/01(水) 12:29:00.04
>>295
何でそう思ったの?
297 :
2014/01/01(水) 15:03:32.78
294ではないがプログラム板でフリーソフトのFitykを比較対象にするのは板違いでは?
「関数近似のFORTRANライブラリはありませんか?」ならわかるが
質問内容からすると自分でプログラムを作りたいのではなさそうだが
298 :
2014/01/03(金) 08:15:54.32
>>297
すんません、質問者です。
スレ違いなのはわかるんですが、学術的用途に精通してそうな人間が集まる板というかスレ住人が、フォートランスレに1番多いと考えたので質問しました。
今回は目をつむって、近似式出すソフトウェアってなんでしょうか?の質問に答えていただけたら幸いです
299 :
2014/01/03(金) 11:47:30.77
君が欲しいソフトは無いよ
どの関数で近似するかは人間が決めること
ソフトが決めることではない
300 :
2014/01/03(金) 15:49:36.03
Excelでやれば?あれで十分じゃない。
301 :
2014/01/04(土) 13:39:47.75
gnuplot 使ってやったことありますがどうでしょう?私がやったのは多項式だけですが任意の関数に対してフィッティングできるようです。
302 :
2014/01/04(土) 16:39:19.25
>301
gnuplotでは,splineとbezier補間してグラフを画く
機能がありますが,それ以外に任意の函数のフィッテイング
機能ってありますか?
303 :
2014/01/04(土) 16:43:44.90
>>302
>>301にできるって書いてあるじゃん
304 :
2014/01/10(金) 10:31:33.86
正月早々下層階級出身の発達障害みたいなのが湧いたなw

アスペ野郎は、よそのスレに行けよ、HaskellスレとかMLスレに行けば仲間がいっぱいいるぞ。
ここは毎年この時期は卒業研究で焦りまくった学生さんの駆け込み寺なんだからさ。
305 :
2014/01/12(日) 15:17:29.69
だなwスレタイくらいは読めよと
306 :
デフォルトの名無しさん
2014/01/14(火) 01:43:43.02
ちょっとお聞きしたいのですが、
読み込むファイルの数値データが"〜〜"のダブルクオーテーションで囲まれているのですが、
これを文字列でなく数値で読み込むことはできないでしょうか?
ファイルの"をすべて消すことも考えたのですが、文字列として読み込みたいところもあるので避けたいです
すいませんがよろしくお願いします。
307 :
2014/01/14(火) 06:48:50.39
一度文字列として読み込んで、その文字列から数値として読み込む
例えばこんな感じ(valueが数値の変数、cvalueが文字列の変数)
read(*,*) cvalue
read(cvalue,*) value
308 :
デフォルトの名無しさん
2014/01/14(火) 19:51:34.68
>>307
早速のレスありがとうございました
ためさせていただこうと思います
309 :
デフォルトの名無しさん
2014/01/18(土) 11:40:25.48
すいませんがご教示ください
integer,dimension(99999,20000000)::aaの配列でifortでコンパイルしようとすると
再配置がオーバーフローしないように切り詰められました
と出ます。配列の数を小さくするとコンパイルできます。
配列が大きいから出ているエラーと思うのですが、なにか対策はないでしょうか。よろしくお願いします。
310 :
2014/01/18(土) 12:21:08.98
スレを読み直してallocatableを使うことでコンパイルはできました。
すいませんありがとうございました
311 :
2014/01/18(土) 13:05:10.95
乙 俺も勉強になった
312 :
デフォルトの名無しさん
2014/01/20(月) 21:57:41.73
すみませんが、ちょっと教えてください。
Intel MKLのpardisoで、LU分解後のLとUを取り出すためにはどうしたらいいのでしょうか?
313 :
デフォルトの名無しさん
2014/01/21(火) 18:52:17.93
すみません。セグメンテーション違反って何ですか?
314 :
デフォルトの名無しさん
2014/01/21(火) 21:15:53.71
OSがゴミってこと
315 :
2014/01/30(木) 21:30:13.25
G95をダウンロードしたいのですが、
Windows版のFTPでは、
530 Login authentication failed
(認証に失敗)
とでるのですが、どこで認証を得られるのでしょうか。
316 :
2014/01/30(木) 22:40:27.48
httpじゃ何か問題あったの
317 :
2014/01/31(金) 00:41:23.05
>316
httpではウンともスンとも言わないのです。
画面がフリーズしたままなので
318 :
2014/01/31(金) 01:31:57.39
>>317
リンクが生きているのはcygwinとLinux系だけみたいだね
MinGW版がひつようなら
http://www.fortran.com/the-fortran-company-homepage/whats-new/g95-windows-download/
けど、このページでも言っているようにG95はメンテナンスが停止しているみたいだし
素直にgfortranを使った方が良い
319 :
2014/01/31(金) 08:17:46.37
>318
御教示ありがとうございます。
gfortranをダウンロードして使うことにします。
320 :
2014/02/03(月) 00:35:08.25
上の方に無次元化の話が出ていましたが、これって数値計算の本ならちゃんと説明されているものですか?
ネットで検索してもあまりヒットしないし、あったとしてもやり方だけでそうする理由はあまり説明されていない気がします。

自分は先輩から教えてもらって初めて知りましたが、周りには知らない人が結構多いです。
伝統芸能の世界じゃないけど、「数値計算のテクニックは見て覚えろ」みたいな風潮を感じています。
とりあえず自分も「数値計算の常識」買ってみます。
321 :
2014/02/03(月) 01:43:43.76
数値計算にかぎらず、適切なスケールで物理量を無次元化すると表式がすっきりするから、けっこう使われてるよ。

原子の議論をするときはオングストロームを使う、天文の議論をするときは光年を使う、つまり「対象に合わせた物差しを使いましょう」という程度の話だから、詳しく説明するほどのことではないかも。
「数値計算の常識」でも1ページくらいしか触れてなかった気がする。
322 :
2014/02/03(月) 02:32:24.50
でも、無次元化で数式を簡単にすることと、規格化をして数値誤差を防ぐことは別の話ではないのですか?
自分はこのへんの理解がまだ曖昧です。

数値計算系の研究室なので、無次元することが常識なのはよく知っていますが、
ちゃんと教えてもらったことは一度もないです。
自分で書いたコードをたまたま先輩が見る機会があって、そのときに指摘されて知りました。
他の人はどこでそういう常識を知っていったのかが気になります。
323 :
2014/02/03(月) 02:41:03.77
他にも数値計算のデバッグテクニックとか先輩から教えてもらう機会はあるんですけど
ちゃんとした理論がよくわかってないのでとりあえずやってる状態なんですよね・・・
本でちゃんと勉強したいんですが、そういうのが書いてあるものが見つからないし。

愚痴ばっかですみません。スレ汚し失礼しました。
324 :
2014/02/03(月) 20:33:23.17
あ、ごめん。見なおしたら、「数値計算の常識」では6,7ページくらい使って説明されてたわ。

どこで学んだかと言われると、たしかによくわからない。
口伝かな。
325 :
2014/02/03(月) 22:40:36.33
そうですか!とりあえず買ってみます。
326 :
2014/02/05(水) 01:20:23.89
物理の本では無次元化が必ず出てくるぞ。
量子力学とか割と基礎的なテキストで。

桁落ちのことを考えると、すべての量のオーダーがそろった方がいいしな。
327 :
2014/02/23(日) 23:46:00.03
すみませんが教えていただけないでしょうか

うろ覚えのFORTRAN77思い出しながらプログラムを書きました。
で、gFortran 4.8.2で実行したら、エラーが出てプログラムが途中で止まってしまいました。
どの行が原因なのか調べたら、プリント文に問題がありそうなのです。
その部分を取り出しますと、

program checkdbl
double precision dx
dx = 2.0d0
print *,dx
end

これを実行すると

Program received signal SIGILL: Illegal instruction.
Backtrace for this error:
#0 ffffffff

とメッセージが出て、dxの値が表示されないのです。
(試しに変数dxをrealにして2.0を代入してもダメで、
でも整数にして、2を代入したらちゃんと表示されました)

倍精度の数値を表示させるにはどうしたらいいのでしょうか?

どうぞよろしくお願いいたします
328 :
2014/02/24(月) 00:29:23.77
OSはLinuxか?
ライブラリかなんかの整合が取れていない気がする。
329 :
2014/02/24(月) 01:05:53.35
プログラム自体の問題ではなく、実行ファイルが不正な命令を実行しようとしたのが原因。
それがコンパイラのバグなのか、コンパイラオプションや実行環境の問題なのかはわからん。
330 :
2014/02/24(月) 12:18:08.81
>>328-329
レスありがとうございます
OSはXPでコンパイラオプションは
-oだけ使ってます

文法の間違いでないと分かって
とりあえずひと安心しました
インストールしなおしとか旧バージョン
使うとかしてみます
たいへんどうもありがとうございました
331 :
2014/02/24(月) 12:46:33.66
>327

gfortranで実行したら、

2.0000000000000000

と結果がでてきましたよ
332 :
2014/02/24(月) 22:42:53.37
>>331
dです
もしよろしかったら、OSとコンパイラのバージョン、
コンパイル・オプション等教えていただけたら嬉しいです
333 :
2014/02/25(火) 00:34:40.34
>332

GNU Fortran 4.7.3
Windows 7 64bit
optionなし
です。
334 :
2014/02/25(火) 01:16:16.64
>>333
ありがとうございます!
旧バージョンを使うと吉なのかもですね

こちらはその後、(再インストールの前に)プリント文を使わなくてもいいように
プログラムを改造してみたのですが……
ここで新たに、実はプリント文・ライト文に関係なく同じエラーが出ることがわかり、
ちょっとorzorzorz……な心境です

とりあえず、プログラムの作成と並行して、コンパイラの方もなんとかしてみたいです
ちなみに今回のエラーは、文法確認のために作った次のプログラムで出てきました

program checkpwr2

double precision dx, dxp2, dxp2d

dx = 2.0d0

dxp2 = dx**2
dxp2d = dx**2d0 ! ←ここでエラー発生

print *, dxp2, dxp2d

end


もう少しいろいろ調べてみます
長文失礼しました
335 :
2014/02/25(火) 01:55:16.47
もうF77のプログラムに手を加える作業はいやだお・・・

今module内のSubroutineからLAPACKのZGEEV呼ぼうとしているんですが、
LAPACKのサブルーチンって外部副プログラムですよね?
毎回interface文を書くのが正しい書き方なんでしょうか?
使ってるのはintel fortran &amp; MKLです。
module
...
contains
subroutien foo
implicit none
interface
subroutine ZGEEV(jobvl, jobvr, ...
...
みたいな感じに。
336 :
2014/02/25(火) 04:06:21.32
LAPACK用の95用 INTERFACE MODULEは公式であったろ。NETLIB無間地獄を探せw
337 :
2014/02/25(火) 09:23:01.24
>334
こちらでは、正常にコンパイルし、
4.0000000000000000 4.0000000000000000
結果がでます。
ついでに、プログラムを
program checkpwr2

real(16) dx, dxp2, dxp2d

dx = 2.0d0

dxp2 = dx**2
dxp2d = dx**2d0 ! ←ここでエラー発生

print *, dxp2, dxp2d

end
とかえて、実行してみましたが、こちらも
4.00000000000000000000000000000000000 4.00000000000000000000000000000000000
と正常にコンパイルでき、結果もでてきました。

4倍長計算
338 :
2014/02/26(水) 21:39:32.88
>>337
お手数おかけしてすみません
やっぱ私の環境がダメすぎってことみたいですねorz

あれから再インストールをしてみたのですが同じエラーがでてまして、
それで、インストール時の環境を変えてみるか、それかバージョンを落としてみるか
してみようと思ってます
うまく行ったらお礼がてら報告したいと思います
たいへんどうもありがとうございました
339 :
2014/02/27(木) 00:16:02.97
MinGW-builds
Dual-target(32 & 64-bit) MinGW compilers for 32 and 64-bit windows
http://sourceforge.net/projects/mingwbuilds/


Download mingw-get-setup.exe (86.5 kB)
http://sourceforge.net/projects/mingw/files/

この辺使えば自動でダウンロードしてくれるぞ。
おれは上の奴で入れたかな。win8 64bit
340 :
2014/02/27(木) 01:07:55.10
あー書き込みたい
341 :
2014/02/27(木) 22:19:15.92
>>335
インテルなら use lapack95 を implicit none の前の行に足し
mkl_lapack95_lp64.lib をコンパイルに足したまえ

ぶっちゃけ interface 書かなくとも呼べる。引数チェックは無論効かないが
342 :
2014/02/27(木) 22:23:14.15
>>341 に追加
って総称名じゃなく個別名か

ならば include 'mkl_lapack.fi' で解決する
interface 定義がここに全部書いてある
343 :
2014/02/27(木) 23:05:41.71
>>339
レスdです
実は私もそこのを使ってエラってたのですが、でもおかげ様で
「他のサイトから落としたファイルならうまく行くかも」、
ってことに思いいたりました

で、探したところgcc wikiっていうところで非公式ながら
お手軽そうなインストーラを発見、さっそく落として
コンパイルしてみましたら

 完動です!!!!

小数点のあとに0がいっぱい並んでるので、記念にスクショ撮りましたw

たいへんどうもありがとうございました
344 :
2014/02/28(金) 01:11:13.40
>343
無事出来てよかったですね!
それにしても、Fortran IVとか、Fortran 77では、せいぜい
2倍長演算しかできなかったのですが、いまでは、4倍長演算
がらくらくできるのですから、隔世の感があります。
345 :
2014/02/28(金) 01:24:15.95
Debian 32bit版に gfortran 入れて数値計算してるんですが、配列って2gb までしか割り当てられないのでしょうか?
346 :
2014/02/28(金) 20:13:18.20
>>345
32bit版ならできないと思いますよー
347 :
2014/02/28(金) 21:27:17.52
>>344
ありがとうございます!
猫に小判って言われないようがんばりますw
348 :
2014/03/01(土) 01:45:11.84
4倍長はソフトウェアで計算しているから10倍以上遅いから
むやみに初心者には教えんなw
349 :
2014/03/01(土) 05:45:52.65
>336 >341->342
遅くなりましたがレスありがとうございます!
Intelさんの優しさが五臓六腑に染みますわあ
350 :
2014/03/01(土) 17:12:18.11
>>346
ありがとうございます。
やはり64bitにするしかなさそうですね。
いちいちdeallocateするの大変なのでw
351 :
2014/03/02(日) 15:54:25.99
OS&コンパイラ64bit版にしても、静的な配列は2Gまでだったりすることが多いから、
よく調べた方がいいぞ。むろん動的には2Gを超えて確保できるが。

これは手抜きではなく、まだ整数のデフォは32bitだし、単精度実数とデフォ整数
長さを合わせるという約束とかもあるから色々全体整合で仕方ない事情がある。
352 :
2014/03/03(月) 02:46:29.22
>>351
うーん、難しい話ですね。
単純に64bitにしたからって載せてるメモリフルフルで使えるわけではないってことですね?

どうしても配列を一度に百万行ほど読み込ませて数値計算を行いたいのでほとほと困り果ててます。

和書だとあまりフォートランに関して詳しい解説本(オプションやらテクニック的なもの)が少ない気がするのですが、何かオススメありますか?
353 :
2014/03/04(火) 23:40:05.16
昔は西村恕彦が粘着していたが、その後は粘着いないね。
・66でJIS FORTRAN全釈―電子計算機プログラム用言語
・77で岩波FORTRAN辞典
・90ではMetcalf&Reid本訳者としてbit 別冊『詳解 Fortran 90』

Metcalf & Reid 本もF2003から Cohen が加わったが、これは東京に住んでるんだから
次世代匂い付き粘着野郎が生まれてもいいはずだ!w

とはいえアメリカ人も粘着ばばあのJ.C.Adamsが死んでからFortran Handbookが
でなくなったので寒い時代になってしまった。
354 :
2014/03/07(金) 00:23:39.85
>>350 プログラム終了までほっといていいなら deallocate 不要
サブルーチンで宣言した非 save の allocatable は
サブルーチン抜けると勝手に deallocate したかと
355 :
2014/03/07(金) 02:00:33.33
>>354
ん???どういうことでつか?
a.out 実行すると、エラーおきまつよ?
356 :
2014/03/08(土) 00:26:57.93
Fortran90 からずっと 6.3.3.1 Deallocation of allocatable arrays で述べてる
return または end で手続きの実行が終了したとき、その手続きの局所変数は deallocate されると

allocate 時の問題じゃないことは当然確認したね?コードうp
357 :
2014/03/08(土) 00:46:31.22
>>356
むっちゃコード長いプラスモジュール化してるんでつけどOKでつか?
358 :
2014/03/08(土) 02:56:59.79
>>356
あれ自動DeallocationはFortran95からじゃなかったっけ?
おれF90時代に、ベンダー依存の解放エラーに悩まされた記憶がある。

とおもって、アニメを見ながら調べたら
Fortran90 handbook6.5.3.1 では状態不定
Fortran95 handbook6.5.3.1 では自動解放
とあった。

まぁ今時F90コンパイラ使っていないと思うが、>>357さんは念のため
調べた方がいいな。
359 :
2014/03/09(日) 00:53:32.50
仕様にあるから…ってもベンダ依存はしゃーないか
http://www.nag.co.uk/sc22wg5/links.html

だがモジュール変数は解放されない
あとむしろそういうコード解析できる機会ないからくれるなら是非
公開したこと他の奴に怒られる事態になっても知らないけど
360 :
2014/03/09(日) 03:31:03.92
F90
>Any other allocatable array that is currently allocated becomes
>undefined and the allocation status becomes
>undefined at the execution of a RETURN or END statement.
>
>If an allocatable array has an undefined allocation status,
>the allocatable array must not be subsequently
>referenced, defined, allocated, or deallocated.


F95
>When the execution of a procedure is terminated by execution of
> a RETURN or END statement, an allocatable array that is a local
> variable of the procedure and is not included in the above
>categories has allocation status as follows:
> (1) If it is accessed by use association, its allocation status is processor dependent.
> (2) Otherwise, it is deallocated (as if by a DEALLOCATE statement).

規格を見ると、F90で明示的にDEALLOCATEしないでRETURNすると、ホントは二度といじって
いけないエンガチョになるんだな。F95は気を利かしてDEALLOCATEしてくれる。
361 :
2014/03/24(月) 22:03:24.67 ID:NcnrpLpF
保守

コンパイラ任せでなく、Fortran 言語の範疇で、まともに
高速化を考える人間ってどれくらいいるのだろうか
362 :
2014/03/25(火) 07:28:56.11 ID:mXzRLR6s
>>361
そうしたいんですけどねぇ。。。
その前にまずはコンパイラを通すことが出来るってとこまでで必死ですよ。

なーんかいい本ないですかね?
363 :
2014/03/25(火) 21:47:05.41 ID:jjQiXJR+
とりあえず文法は ggれならぬ nagれ、だな。本は洋書しかないし
http://www.nag-j.co.jp/fortran/

一昔前のベクトル型計算機向けっぽい(最近のアクセラレータで見直されてる)
ループ変数固定とか仮引数の非エリアスとかの暗黙制約、
配列表現の柔軟さに ELEMENTAL & PURE 関数、
Fortran 直じゃないが OpenMP & MPI と割となんでも明示化できるが、
逆に言うと複雑かつこれやっとけばおk的な部分がないのと、
そこまで性能にシビアな世界はニッチかつ閉鎖的すぎる、特に国内事情で。
364 :
デフォルトの名無しさん
2014/03/26(水) 21:12:26.41 ID:OKU3OlE2
国内でFortran使ってる人口がそもそも少なそう
365 :
2014/03/28(金) 02:08:30.32 ID:OEPLP/0i
最近コンピュータというとWEBがらみでテキスト処理機みたいなノリが強いが、
本来の電子計算機としてはFortran不動だべ。

そして日本は結構Fortran市場/ユーザーでかいんでないかな。
Intel Fortranは英語以外には唯一日本語マニュアル等を出しているし。
アメリカ以外でハード・OS・コンパイラまともに作れるの日本ぐらいでね。
366 :
2014/03/28(金) 07:40:18.76 ID:27mpC+N6
ちょいとスレチかもしれませんが、みなさん変数の命名法ってどうしてますか?
367 :
2014/03/29(土) 14:26:34.57 ID:iivY7v+4
商業利用は少ないし、研究機関での個人・少人数開発がほとんどだし、明文化されたコーディング規約ってなかなか見つからんよな。
C++も併用してるので、そっちの命名規約と統一してる。
変数大文字6文字縛りは勘弁な。
368 :
2014/03/30(日) 02:02:03.27 ID:wC7BTSuT
WEB世界の偉い人wでもFortranの知識が66や77時代のイメージ止まりで
とんちんかんな事を言っていて笑える。

アドバイスで数値計算はFortranじゃなくてもいいとか言って、
初心者たぶらかして冬山にTシャツ、サンダルで登山させるような
悪い奴多すぎで草不可避www
369 :
2014/04/12(土) 01:07:03.97 ID:Ab832t2z
fortran90なんだけど、
三次元配列に二次元配列の要素を代入したいんだけど、どうすればいいかな?

a(i,j)に時間軸tを追加して、
do t=1,100
b(i,j,t)=a(i,j)
end do

こういうイメージで、逐次のa(i,j)を代入したいっす。
370 :
2014/04/12(土) 02:03:40.35 ID:7FV8vMmK
b(:,:,t)=a
でおk?
371 :
2014/04/12(土) 02:56:42.37 ID:7b7Ca2J/
え そんなシンプルでおk?
ありがとうございます
372 :
2014/04/15(火) 10:35:48.57 ID:nSLuXsCJ
b(:,:,t)=a(i,j)ってやれば二次元配列に時間軸を追加したものができるのか
よくある:ってなんの意味なんです?
373 :
2014/04/15(火) 19:04:08.61 ID:2Visq3rw
b(:,:,t)=a(i,j) だと駄目。
>>370 のとおりじゃないと。

部分配列を指定するのにコロンを使う。
たとえば配列 v の第2成分から第10成分までなら v(2:10)。
コロンの両脇に数字がないのは、成分あるだけ全部という意味。
374 :
2014/04/15(火) 19:11:45.41 ID:0DdTk08m
ちょうどいい解説があった
http://www.str.ce.akita-u.ac.jp/~gotou/zyouhou/f90/sec6.html#6.4.
375 :
2014/04/15(火) 21:45:58.64 ID:y6pD2KFL
>>374
文字化けしてしまって見れませんでした
>>373
コロンの意味はよくわかりました。ありがとうございます
a(i,j)はダメでaじゃないといけないのがわからないです、配列の定義は
real a
dimension a(i,j)
と別でやって、
b(:,:,t)=a
とやらなければいけないということです?
376 :
2014/04/15(火) 22:23:43.96 ID:2Visq3rw
>>375
373 で俺が言いたかったことは、配列 a について
「a」や「a(:, :)」と書くと配列全体を意味する。
「a(i, j)」と書くのは(前もって i, j に整数が代入されていれば)成分 a(i, j) つまりただひとつの数字を意味する。
ということ。
したがって b(:, :, t) = a と書けば配列全体の代入なので
b(1, 1, t) = a(1, 1)
b(1, 2, t) = a(1, 2) のように配列の対応する成分が代入されるが、b(:, :, t) = a(i, j) と書けば
b(1, 1, t) = a(i, j)
b(1, 2, t) = a(i, j)...
のように、ただひとつの同じ数字が代入される。
377 :
2014/04/15(火) 22:26:34.41 ID:y6pD2KFL
>>376
なるほど、よくわかりました。ありがとうございます。数日前にfortranをはじめましたがプログラミング自体がほぼ初なのでとても勉強になりました。
人の書いたプログラムのある一つのサブルーチンを修正したいのですが、変数の名前の設定の仕方も人それぞれだし、読むというのはとても大変ですね。
378 :
2014/04/15(火) 22:33:12.92 ID:pcXih3Yx
>>377
追記の質問なのですが、bは三次元配列でaは二次元配列ですが、こちらが指示しなくても、aをbの:,:部分に入れるのですね。

これは次元の違うものを代入をするとき、どのように対応するのかは次元で決まるということでしょうか。
aは1次元、2次元成分をもつ配列だから、それを代入する先もbの1次元、2次元成分に代入するということですよね?
379 :
2014/04/15(火) 22:51:15.04 ID:2Visq3rw
b(:, :, t) と a(:, :) は同じ次元です。

>>369,370 のレスを踏まえて書いているので、
do t=1,100
b(:, :,t)=a
end do
のように使うことを想定しています。
b(:, :, :) は3次元配列だけど、b(:, :, 1), b(:, :, 2), ..., b(:, :, 100) はそれぞれ2次元配列です。
なので b(:, :, t) = a は2次元配列を2次元配列に代入していることになります。
380 :
2014/04/16(水) 01:41:26.57 ID:9gYQIu+P
>>379
>b(:, :, :) は3次元配列だけど、b(:, :, 1), >b(:, :, 2), ..., b(:, :, 100) はそれぞれ2次元配>列です。

配列については調べましたが、意味がわかりませんでした。なぜ二次元配列なのでしょうか
integer a
dimension a(2,3,1)
私はこれは3次元の配列だと思っています。
配列の次元は,で区切った数で決まるのではないのですか
381 :
2014/04/16(水) 03:26:06.14 ID:k2nSQYfZ
>>380
:は指定した配列の範囲を一度に指定する表記

配列の宣言を
real, dimension(1:5,1:5) :: a
real, dimension(1:5,1:5,1:10) :: b
としたとき

aと書いた場合は配列全体を指すので5×5の2次元配列を指す

a(1,1)は添え字を具体的な数で指定しているので一つの変数を指している

a(:,:)は添え字が全て:なので二つの添え字が全範囲を指定している
そのためaと書いた場合と同じ5×5の2次元配列を指す

a(:,1)と書いた場合は一つ目の添え字は全範囲を、
二つ目の添え字は具体的な数なので一つの成分を指定している
そのため5つの要素の1次元配列を指す

b(:,:,1)の場合bの最後の添え字は具体的な数なので
次元が一つ下がり、5×5の2次元配列となる

宣言の次元と計算途中で使われる次元は一致しなくて良い
NAGのサイトで部分配列で調べると良いよ
382 :
2014/04/17(木) 22:25:20.75 ID:TQr8bRVR
>>381
遅くなりました。非常にわかりやすい解説ありがとうございます。NAGで少しずつ勉強しています
383 :
デフォルトの名無しさん
2014/04/20(日) 11:29:29.42 ID:LM2YJqRp
すみません
fortranを始めようと思ってるものですが
おすすめの開発環境を教えていただけないでしょうか?
今はgfortranとvimでプログラミングを始めようかと思っているのですが
いちいちvimで書いて保存してvimをぬけてコンパイルして実行するのが手間だなと感じています。
vimを抜けずに書いたプログラムをコンパイル、実行できればいいのですが。

そこでおすすめの開発環境を教えていただきたいのです。
384 :
2014/04/20(日) 11:40:02.65 ID:rCakeQE3
小規模ならエディタ+コマンドラインでいいと思うけど
gfortranで統合開発環境ならeclipseが無難
https://www.eclipse.org/downloads/
ここからEclipse for Parallel Application Developersをダウンロード
385 :
2014/04/21(月) 08:18:52.31 ID:9DEaCYEm
>>384
小規模でもエクリプス使う利点ある?
386 :
2014/04/21(月) 11:58:42.13 ID:INTGmmt1
否定するだけじゃなく、代替案を示せよ!
サヨクちゃんかよw
387 :
2014/04/21(月) 13:10:45.24 ID:9DEaCYEm
>>386
いや、否定してない。
質問してるの!利点ある?
388 :
2014/04/22(火) 18:21:36.11 ID:i3jJvf/a
Gfortran 使いです。
Cycle 文についての質問だけど、

do a = 1, 5
If ( a .ge. 3) then
a = a + 1
cycle
endif
enddo

とかだったら a = 12 になるのかな?
389 :
2014/04/23(水) 00:33:33.39 ID:cH3Ejolk
do 変数をいじっちゃいけないはず。
自分のおちんちん/おまんこはいじってもいいよ。
390 :
2014/04/23(水) 00:35:19.04 ID:4m41LpoI
ループ中でループ変数(この場合は a)は変更できない
391 :
2014/04/23(水) 02:10:49.07 ID:2MktZpH7
間違えた

a = {1, 3, 4, 6, 7}の配列として,

do i = 1, 5
If ( mod(a) .eq. 0) then
write(*,*) a
cycle
endif
enddo

とかだったらターミナルに
4
6
って表示されるのかな?
つまりはcycleってのはdo の文頭に戻るでOK?
392 :
2014/04/23(水) 02:47:07.80 ID:cH3Ejolk
おじちゃん、少しは文法書読みなよw




って表示されるよ!

でも間違いありすぎ。
a = [1,3,4,6,7] !
または (/ 1,3,4,6,7 /) な。EBCDIC には [,] 記号がないから、
大かっこは最近まで使わなかったのよ。

do i = 1, 5
if (mod(a(i), 2) == 0) then
write(*, *) a(i)
cycle
end if
end do

まぁ、この場合CYCLEの意味ないけどw
393 :
2014/04/23(水) 04:13:45.15 ID:2MktZpH7
>>392
なるほどね、ありがとう。
サイクルは便利だね
394 :
2014/04/24(木) 04:26:06.40 ID:PfDx1Fno
試した奴いるかい?
登録がめんどくさいんですけど。


インテル ソフトウェア開発製品 バージョン 2015 ベータ版 提供開始
インテル Parallel Studio XE、Cluster Studio XE に含まれるインテル コンパイラーやライブラリー、チューニング・ツールの次期バージョンのベータ・プログラムがはじまりました。
新機能や強化された機能はこちら【ベータ期間: 7月 11日(金)まで】

HTTPS software.intel.com/en-us/articles/intel-software-development-tools-2015-beta
395 :
2014/04/25(金) 18:01:43.49 ID:nDom0mhY
ちょっとお聞きしたいのですが、
構造体の1成分だけfunctionで計算するような
書き方はできないでしょうか

たとえば
function aaa(i,j)%a
ーーー
end functionなど・・

構造体初めて使うのでまだよくわかっておらずすいません
よろしくおねがいします
396 :
2014/04/25(金) 19:31:14.66 ID:9DVeZXXS
「構造体の1成分だけfunctionで計算する」っていうのがよくわからない。
(1)function の引数として構造体の1成分を使うのか、(2)function の戻り値として構造体の1成分を得たいのか。
いずれにせよ、関数定義では構造体をあらわに使う必要がなさそう。
たとえば構造体の1成分 aaa(i,j)%a が real のばあいなら、関数定義は
function f(x)
real f, x
f = x**2
end function
のようにして、(1)なら呼び出し時に
b = f(aaa(i, j)%a)
のようにすればいいし、(2)なら呼び出し時に
aaa(i, j)%a = f(c)
のようにすればいいのではないでしょうか。
397 :
2014/04/25(金) 19:54:42.69 ID:nDom0mhY
>>396
早速のレスありがとうございます
まだよくわかっておらずすいません
やりたかったことはおっしゃっていただいたまさに(2)です
教えていただいたやり方でできそうです
とても助かりました。ありがとうございました
また機会がありましたらよろしくおねがいします
398 :
2014/05/02(金) 21:33:28.65 ID:ZxAJrCZC
>>394
そんなにめんどくさくなかったぞ。非商用利用で登録するときと大して変わらなかった気がした。

ついにfortran2003完全準拠か。国産コンパイラベンダも早く頼むで。
399 :
2014/05/08(木) 01:43:46.59 ID:akP1EH34
連休を利用してFortran2003用のCheet Sheetを作ってみた。
自分が使っていたメモと、このスレに出たこと等をギリギリ突っ込んでみた。
ttp://www.pdf-archive.com/2014/05/07/f2003quickref/f2003quickref.pdf

一応、プログラム片は、Intel Fortran 2015ベータで動くことを確かめたつもり。
誤り等があったら、やさしく指摘してくれ。

豆本になっているので両面印刷して、以下のサイトを参考にして本にしてくれ。
ttp://k.e-kuchikomi.info/K_140266/
400 :
2014/05/08(木) 22:20:11.32 ID:GsOSKq7r
intel fortranを使っていて、-parallelが速く使っているのですが、
以下のようなサブルーチンで、依存関係で自動並列化がされていないのですが、
並列化するためになにかヒントをご教授いただけないでしょうか。

(宣言後)

a=0

do k=1,kmax
do j=1,jmax
do i=1,imax
if(logical(j,i,k))then
a(j,k)=a(j,k)+1
endif
enddo
enddo
enddo

logicalはファンクションで別ファイルで書いています

勉強不足で申し訳ありませんがよろしくお願いします
401 :
2014/05/08(木) 23:40:27.39 ID:akP1EH34
LOGICALをPURE宣言すればいい。
PUREでないならコンパイラは判断できないので自動並列化は無理だろう。
手動でコンパイラ支持行で明示してやれ。

しかし、iは関数内にいれて
forall(j=1:jmax,k=1:kmax) a(j,k)=ifun(j,k)

pure function ifun(j,k)
...
do i = 1, imax
if (...) ifun = ifun + 1
end

みたいにしたほういい。
402 :
2014/05/09(金) 22:46:22.53 ID:yQPNJst2
>>401
ご教授ありがとうございます
forallやpureなど使ったことがなく、書き方例など大変勉強になりました

ご教示いただいた内容で書いたのですが他との兼ね合いの依存関係なのかまた出てしまいました

(col. 58) remark: 並列依存関係: FLOW の依存関係が var$649 行 343 と var$649 行 91 の間に仮定されました。
などなど

どうも他のサブルーチンの書き方も並列化に悪いようで、教えていただいた並列化方法を頼りにまず勉強しなおして、
他のプログラム部分もいい機会なので見直そうと思います。

ありがとうございました。
403 :
2014/05/10(土) 00:07:21.90 ID:ZxmW9Mt1
Linux 使いでEclipse + photran のフォートラン統合開発環境を構築しようかと考えているのですが、なかなかうまくいきません。

例えば、今までターミナル上で
Gfortran hoge.f90 main.f90 でコンパイルできたてのに、eclipse だと ant build not found とかででうまくいきません。
ちなみにhoge.f90 はモジュールファイルで、main.f90がメインプログラムです。

エクリプスでもhero.f90 (メインプログラム単体)単体のコンパイルは出来ています。
もしかして複数ファイルを同時に今コンパイルできないとか?
404 :
2014/05/10(土) 01:44:31.61 ID:X6uqaHXX
プロジェクトにソースファイルを全部入れてビルドするだけだが駄目かい?
405 :
2014/05/10(土) 05:24:00.09 ID:ZxmW9Mt1
>>404
え?それだけなんですか?
プロジェクトに全部ファイル入れてあります。なのにエラーが。。。
406 :
2014/05/11(日) 09:02:09.98 ID:4C2ZppHJ
>>405
ここで聞いてもムダだよ。
ここにはエクリプス使ったことない奴しかいないから。
みんなテキストエディタ直打ちだから。
407 :
2014/05/11(日) 10:52:57.57 ID:wJQWAvOW
>>399
乙。いただいた
408 :
2014/05/11(日) 12:54:27.66 ID:a5cPk+x+
>>399
GJ!
英語ばかりでびっくりした。参考文献欄があるのが凄いね。
409 :
2014/05/11(日) 17:20:58.15 ID:cyBk1jZ9
410 :
2014/05/13(火) 00:50:14.94 ID:X5XVCl1f
fortranまとめwikiないよなそういえば
411 :
2014/05/13(火) 11:18:46.53 ID:Ml4tWcMx
sin波のようななめらかな波形データから尖頭値を抽出するにはどうすればよいでしょうか。
波形データの入っている配列aから抽出したいのですが、sin波のような綺麗な周期を持っておらず、地震の観測波形のように不規則に連続して変化していっています。
412 :
2014/05/14(水) 12:56:39.35 ID:wOYwf617
こんなの来てた。

MODERN FORTRAN FOR SCIENTISTS AND ENGINEERS
By Damian Rouson

http://jolts.stanford.edu/72/modern_fortran_for_scientists_and_engineers
413 :
2014/05/15(木) 01:14:31.34 ID:cUF0eH5o
>>406
いえ、そんなことおっしゃらず…

今までエディタ使って作成してたフォートランファイルをエクリプスのプロジェクトフォルダに入れてビルドしようとしてもうんともすんとも言わないです。
で、デバッグできないという…
414 :
2014/05/15(木) 02:31:06.49 ID:klLDqCtV
Fortran90/95による実践プログラミング [単行本(ソフトカバー)]
安田 清和 (著), 水野 正隆 (著), 小野 英樹 (著)
http://www.amazon.co.jp/gp/product/4872594738


いつの間にかこんなのが出版されているんだが、見たやつ中身はどうよ?
目次からすると、おっおぅ!…ってかんじなんだがw
415 :
2014/05/16(金) 01:40:42.79 ID:USQ/ZI5B
なんかエクリプスとフォトランの詳しいマニュアルないかな?
本家でもversion古いし
416 :
2014/05/16(金) 01:49:02.89 ID:pE1PewlD
>>415
Youtubeで外人のおっさんが実演してたぞ。
俺は使ってないからようわからんがw
417 :
2014/05/16(金) 02:01:11.54 ID:USQ/ZI5B
>>416
おお!YouTubeでですか(´・_・`)

みなさんはエディタからコンパイルしてますか?
デバッグとかどうしてます?gdbとかdddですか?
418 :
2014/05/16(金) 02:08:04.34 ID:cU3+Idig
fortranで書いたプログラムの出力ファイルを読み込んで、それを元にしたグラフを書かせたいのですが、1)それに適したグラフ描画ソフト2)そういったことを解説してある本はないでしょうか?

現状はExcelVBAで出力csvファイルを呼び出し、所定のExcelシートで編集してグラフにするためのデータを作成し、そのあと手動でグラフを作成しています。

Excelを挟まず、csvファイルをもとにグラフを描画してくれるプログラムがあるととてもありがたいのですが、何かできないでしょうか
419 :
2014/05/16(金) 07:25:49.77 ID:USQ/ZI5B
>>418
Gnuplot, R とか(´・_・`)
420 :
2014/05/16(金) 15:01:20.39 ID:GjdBspSJ
現在,windowsで大学の課題でmingwを使用してコードのコンパイルや実行しようとしています。
コンパイル自体は成功したようにみえたのですが実行する際に
「コンピュータにlibquadmath-0.dllがないため,プログラムを開始できません.
この問題を解決するには,プログラムを再インストールしてみてくだい.」
と表示され実行できません。

因みにコンパイルしたコード(hello.f90)は以下のようになります。
program hello
print *, 'Hello World!'
end program hello

またC言語(C++)のコードのコンパイルや実行には成功しています。
421 :
2014/05/16(金) 19:43:53.43 ID:xH+zzs4U
path
422 :
2014/05/16(金) 19:48:37.92 ID:xH+zzs4U
423 :
2014/05/16(金) 21:38:59.32 ID:HsLYY/75
>>420
以前、似たような(同じ?)エラーメッセージに遭遇した事があったが
その時は件のライブラリを強制再インストールしたら直ったように思う。
mingw-get update
mingw-get --reinstall upgrade mingw32-libquadmath
これを実行してMinGW(MSYS)のターミナルを再起動すればどうかな。
424 :
2014/05/17(土) 06:32:26.00 ID:97dT5LKY
>>419
gnuplotですかありがとうございます
425 :
2014/05/17(土) 07:18:10.88 ID:ScBioaGh
清書にはmatplotlibでね?
426 :
2014/05/17(土) 14:11:28.79 ID:6t+Gfvcv
>>414
今日日出すなら2003と2008解説してほしい
427 :
2014/05/17(土) 19:57:54.60 ID:j7anWBLq
>>423
ありがとうございます.
なんとか実行することができました.
428 :
2014/05/18(日) 18:58:17.41 ID:8yAoHmFE
>>426
ですよねー
429 :
2014/05/30(金) 03:00:46.51 ID:r0FrxYTY
メモ帳のインプットファイルから一行ずつ読み込んでプログラムを回す時、読み込める一行の長さの限界というのは決まっているのでしょうか

例えば
有効数字8桁の数字を10個、一行に並べて書いた時はエラーで読みませんが、それらの桁を4桁まで減らして並べて書いたらプログラムが回るのです。

Excelで作ったものをメモ帳にはっつけて使っているので、セル間をタブキーによる空白で置き換えられます。
その空白を半角スペースに置き直して一行の長さを短くしても読むようになるので、読み込める一行に限りがあるように感じます。
CHARACTER CARD 100
という部分を200に変えても意味がなかったのでどこを変えれば読み込める一行を長くできるのかがわかりません。
430 :
2014/05/30(金) 03:29:52.60 ID:thFm9kuD
read文が書かれた行をコピペして.

普通はcharacterなんか使わずにこう書く.
real(8) :: val1, val2, val3, val4, val5, val6, val7, val8, val9, val10
open(10,file='ファイル名')
read(10,*) val1, val2, val3, val4, val5, val6, val7, val8, val9, val10
write(*,*) val1, val2, val3, val4, val5, val6, val7, val8, val9, val10
431 :
2014/05/30(金) 08:44:23.58 ID:U3Y1cq1n
>>430
20年以上前に書かれたプログラムを少し編集しようとしています。読み込み部分は他の人が書いていて、初心者の私はそれを少し編集したいのですが、自信がないです

とにかくやりたいことはinputファイルのうちあるブロックの読み込み部で1行につき10個読んでいるところを14個読むようにしたいのです

CHARACTER CARD 100という意味もよくわかっていません。調べてもCARDの意味が出ませんでした。

input.txtを読み込むよう指示するのですが、全体としてそのinputは数千行とあります。それでもそのような記述で大丈夫なのでしょうか。
432 :
2014/05/30(金) 15:49:55.31 ID:dCRThtZs
どのような記述だよ
433 :
2014/05/30(金) 19:59:51.61 ID:1KLLWRFX
>>431
あなたのすることは数字の大きさをかえるような小手先の対応ではなくて、
昔のプログラムの動作なり、コードを理解することではないでしょうか?
10から14に数を増やすためにすることが読み込み箇所の変更だけですむのかなと心配になります。
10前提で処理がコードとして記述されていないか、計算式があるなら数を増やして大丈夫なのか、
チェックすることはいろいろあると思います。
あなたに指示をされた先輩なり上司のかたが変更方針がわかっておられて、指示をされてればいいのですが。
434 :
2014/05/31(土) 00:38:02.07 ID:8hxwwbXy
>>433
配列の上限や各プログラムでのループ処理で何個読めるのかを確認しました。その点は修正しても大丈夫でした。
しかしinputファイルから読み込む一行があまりに長いとエラーを起こすのは改善できませんでした。
435 :
2014/05/31(土) 01:01:49.98 ID:yeEEhfSt
どこからどこへどれだけデータを読み込むか書いてあるのが read 文なので
それが出ないとどうにも。それに input.txt が長くいろいろブロックがあるなら
対応する read 文もいくつもあるうちのどれかってとこだな。
436 :
2014/05/31(土) 01:45:38.26 ID:3e7Yho2f
最初の質問
>読み込める一行の長さの限界というのは決まっているのでしょうか
に答えるとすれば,
「データをどう読むようにコーディングされているかによります」
かな.

何度もread文を書くように言われているのに書かないってことは,
知的財産の流出とかなんかを気にしているのかな?
ソースコードをほんの一部でも書けないなら,先輩なりに聞いた方がよい.
437 :
2014/06/02(月) 00:07:12.28 ID:vUSkffdq
438 :
2014/06/02(月) 00:13:33.24 ID:BIE796Bm
>>435
>>436
プログラムの中でちょくちょくある
read card 100
character 100
という部分で読み込んでいるのではないかと思います

プログラム作成者と話して100→200とかに増やせばなんとかなるんじゃないかとなって変更しましたがなんの効果もありませんでした
500にしても変わらなかったので、そもそも読み込める長さが決まっているのではないかと考えるようになったのです
439 :
2014/06/02(月) 01:34:45.52 ID:mPD7/eRQ
何度も書けと言われているものを書かないのはなんでだろう
書けば直したりしてくれるかも知れないのに
書かれている文はFortranの文法に合わないし

cardに一度読み込ませて、その後各変数に値を分配しているように思えるけど、これだけでは分からない
読み込みができているかreadの後に変数の値の確認とかしてなさそうだし
単純に1行でどこかまで読めるかテストプログラム組んで確認してなさそうだし
440 :
2014/06/02(月) 01:57:55.06 ID:GuhykFKN
プログラム作成者が存在するなら、現状どういう処理をしているのかを
コードと向き合いながら作成者に聞いて理解する。
200に増やせばなんとかなると結論つける根拠をプログラム作成者に確認する。
ソースを変更するのはそれからだと思うけど。
読み込める文字数に制限があると疑うなら、現在読み込めてるデータの文字列長の
範囲内で10から14に入力データ数を変更したコードでテストしてみる。
入力文字列長の制限なのかコードの変更ミスなのか切り分けができてない。
441 :
2014/06/02(月) 08:47:31.90 ID:xxg6z98O
card と云うと、FORTRAN IV時代の1枚80コラムのIBMカー
を思い出す。
最初の5コラムがラベル番号6コラム目がコメント用7コラム
から72コラムまでにステートメントを書く(打つ)
というものだった。
もしかして、
read card 100
というのは、データカードを100枚読み込むということ
でしょうか。
character 100
というのはデータカードが2枚ひと組になっていて、
2枚合わせて100文字をひと固まりとして処理する
ということかなとも思いますが、いずれにしても
FORTRAN IVの正規の文法には、このようなステートメント
はなかったと思います。
ある機種特有の方言かもしれません
442 :
2014/06/02(月) 09:19:02.24 ID:/Y6F3YHx
>>439
1万行超えるのでいったいどこを抜き出せばよいのかわかりません。全てを貼ることはできませんし、各サブルーチンに出てきているread文はこれです。

ご指摘の通りインプットファイルから取り込んだものを各変数へ分配していっています。
アウトプットファイルから、入力した値と読み込んだ値が一致しているかどうかは確認済です。
ただ、問題となっている入力部分における一行が長いと、そこを読み込めずにプログラムがそこで止まってしまうのです。入力する変数の個数の問題ではなく一行の長さに問題があるのではないかと考えているのです。



>>440
10→14に変えても読むことはためしてわかりました。有効桁数を減らして、一行の長さを短くすれば読むのです。


>>441
7マス目からプログラムを打ち始めていた頃に作られたものです。read cardというのはインプットファイルを読むという意味だそうです。いくら調べてもcardという命令分はないのでよくわかりませんが、read文といえばこれぐらいなのです
データカードというのはインプットファイルのことですよね?
今はabsoft11.0,fortran95でやっているのでそのようなことは気にしなくてよくなっています
443 :
2014/06/02(月) 10:21:47.52 ID:yv/nHUfZ
昔は
_______read 6 100
とか書いてたな
444 :
2014/06/02(月) 23:06:26.34 ID:Ij4SzyXz
1つ言えるのは card とはそのプログラム内で定義された何らかの名前
そして今のところの常識的にその文法は Fortran とは異なるように見える

100 はその数字のラベルが付けられた行であるようにも考えられるが
その場合は 200 など別に変えられた場合にコンパイルエラーか
実行時の動作がぶっ壊れるだろうから、おそらく数値とみるべきか
445 :
2014/06/03(火) 07:56:10.35 ID:Bql6ya1H
446 :
2014/06/04(水) 08:41:52.08 ID:cjdS4ahW
447 :
デフォルトの名無しさん
2014/06/04(水) 21:26:40.68 ID:bCq7kX8R
common/mat/a(20)
common/mat/a1,a2,…a25
と記述してもプログラムが動くのですがなぜでしょうか
matには20個の変数しか入れないから、a1〜a20までしか読み込まないと思ったのですが、なぜか読みます
448 :
2014/06/04(水) 23:26:31.63 ID:OlqsO7Ca
文法上では、大きさの違う COMMON ブロックは、無名 COMMON ブロックでしか
許されていないのだが、まぁ昔はよくやられていた。

66時代は静的にメモリー領域が確保されるので、問題は少ない。
77時代には、文法上は COMMON ブロックも SAVE 指定しないと、
解放されるのでまずいのだが、過去との互換性から普通は静的に
確保されていたのでまぁ大丈夫だった。

COMMON 文はメモリー上の番地の共有になっている。それは先頭で位置合わせが
なされるので、より大きい方でメモリーが確保されていれば、一方が小さくても
問題ない。ただ、小さい大きさで確保されていると、エラーが出なくても
はみ出して読み書きしているだけなので、ファンタスティックな予期せぬ出来事
が起きる。
449 :
デフォルトの名無しさん
2014/06/04(水) 23:52:50.09 ID:lml6F2RD
>>448
すみません、あまり理解できず、いくつか教えてほしいことがあります。
common文はプログラム中に出てくる共通の変数を定義するために使うものだと考えています。
最初に定義する時に
common/mat/a(20)
としていれば20個の要素を入れる事ができます。その後別のサブルーチンで
common/mat/a1,a2,…a25
とすればa(20)に具体的に値を格納していっているものだと考えています。
プログラムでは共通してすべて、最大で20個の値を初期化したり記憶したり格納したりするよう記述されています。
しかしあるサブルーチンでmatを呼び出して25個の値を定義して放り込んで操作していても普通に使えているのです。
「先頭で一合わせがなされるので(どこの先頭でしょうか)、より大きい方(どこより大きいのでしょうか)でメモリーが確保されていれば」
のメモリーとははじめにglobal defineで定義する最大記憶容量のことでしょうか?
じつはこれもこの20を使って上限を決めており、ある程度は余裕をもたせているのですが、
条件を変えたりすれば、すりきりいっぱいになるかもしれないです。


「ただ、小さい大きさで確保されていると、エラーが出なくても はみ出して読み書きしているだけなので、ファンタスティックな予期せぬ出来事
が起きる。 」というのは小さい大きさというのはどこより小さいのでしょうか。はみ出して読み書きしているだけというのは今現在読み書きできていることとどうなのでしょうか。
450 :
2014/06/04(水) 23:54:33.80 ID:OlqsO7Ca
character 命令があるということは FORTRAN77 だな。

文法的に成り立つ解釈としては、FORTRAN77では空白は無視されるから、
CHARACTER card 100 とは今でいうcharacter(len=1) :: card100
read card 100 は、read card100 だが、この時 card100 には Format文が
入らないとだめなので、1文字では無理w

CHARACTER CARD*100 の間違いかとも思ったが、READ CARD 100が成り立たず
終了w
451 :
2014/06/05(木) 00:08:43.48 ID:m2ykd6YT
同じプログラム単位に書いたなら
common/mat/a(20)
common/mat/a1,a2,…a25

common/mat/a(20),a1,a2,…a25
と同じだったかと

違うプログラム単位に書いたなら多分未定義だが
重なるメモリはそれっぽく読めて、多い分はそのまま使えるっぽい
452 :
2014/06/05(木) 00:38:07.03 ID:a9B4CiIQ
>>451のいう通り、同じプログラム単位に書かれたら、後ろに追加になる。

COMMONはグローバル変数とは違う。メモリー領域の共有。
COMMON/mat/a(20)とCOMMON/mat/a1,a2,....,a25が別々のプログラム単位に
あらわれたら、それはa(1)とa1の番地が等しくて、メモリー領域を共有している。
(ポインター風にいえば同じ番地を差している。)同様にa(2)はa2、a(3)はa3...
a(20)はa20とメモリー領域を共有している。
さてa21に対応する配列要素はないのだが、メモリー上では配列をはみ出した
a(21)にあたる番地を差すことになる。(配列はメモリー上で連続に確保される。
COMMON変数は、普通は、宣言順に詰めてメモリー上に配置される)

だから、コンパイラが気を利かせて、名前付きCOMMONであっても、
最大サイズのCOMMONブロックの大きさを確保してくれていれば、
なんら問題は生じない。しかし、昔のHITACとか気の利かない堅物は、
最初に出会ったCOMMONブロックの大きさで領域確保するので、ちとまずい。
(ACOS>FACOM>HITACの順でけつの穴が小さい。)


COMMONブロックの大きさが違っていいのは、名前付きCOMMONのみ。
今の質問者の場合はmatという名前がついているので、本来はサイズが違う
のは許されていない。が、昔はよく使われていた。
だから別に驚くことでも何でもない。

ちなみに無名COMMONとは(COMMON //a(20) とか COMMON a(20)とか)
453 :
2014/06/05(木) 01:27:46.66 ID:a9B4CiIQ
コンパイラのオプションでMAPファイルを書かせれば確かめられる。
Intel Fortranの場合、/MAPでいく。gfortran はちょっと見た感じ見つからんw
昔のコンパイラなら必ずあった。

MAPファイル内を探すと
0004:00000aa0 _MAT 00406aa0 <common>
0004:00000b20 ___native_startup_state 00406b20 <common>
0004:00000b24 ___native_startup_lock 00406b24 <common>
0004:00000b28 ___onexitend 00406b28 <common>
0004:00000b2c ___onexitbegin 00406b2c <common>
0004:00000b30 __NoHeapEnableTerminationOnCorruption 00406b30 <common>
0004:00000b34 ___dyn_tls_init_callback 00406b34 <common>

こんな感じの出力がある。
ここで実験した感じでは、単精度4バイト*8個=32バイトづつ、
領域を確保していっている。COMMONでa1..a25 の場合、本来は4*25バイト
あれば十分だが、8の倍数ごと確保しているようなので、
番地 00406aa0 から 00406b20 まで4*32バイト確保している。

COMMMONの現れる順番に関わらず、最大のサイズをとってくれている模様。
Intel子は気が利くなw 心ぴょんぴょん待ち〜
454 :
2014/06/05(木) 01:28:36.28 ID:a9B4CiIQ
テストプログラム
subroutine sub()
common/mat/a(20)
a = 1.0
print *, a
end


program Console1
real a
common/mat/a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,&
a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,&
a21,a22,a23,a24,a25
a = 0.0
print *, (Z'b20'-Z'aa0') / 4
end program Console1
455 :
2014/06/05(木) 01:40:20.97 ID:ivUEXHmG
Emacsでfortran のコマンド自動補完できるのかな?
456 :
デフォルトの名無しさん
2014/06/05(木) 11:54:05.31 ID:qVumrB9V
>>451,>>452,>>453
詳しくありがとうございます。
>>452で[最大サイズのCOMMONブロックの大きさを確保してくれていれば]というのは、
>>453で[単精度4バイト*8個=32バイトづつ、 領域を確保していっている]ということから、大丈夫ということでしょうか
もともと20個が上限なので、8の倍数なら24個まで勝手に確保してくれているので、25個では動かないように感じます。
しかしそれは>>451のように「多い分はそのまま使えるっぽい」ということで、今回は大丈夫だということでしょうか。
457 :
2014/06/05(木) 22:09:23.11 ID:m2ykd6YT
common/mat/a(20)
→ real * 20個 = 80 byte → 32 byte 単位で3つ分 (96 byte)

common/mat/a1,a2,…a25
→ real * 25個 = 100 byte → 32 byte 単位で4つ分 (128 byte)

Intelの場合は、プログラムのつじつま合わせに /mat/ には4つ分のメモリが必要だと判断した、ということ

32byte単位なのは、そうしたほうが「自分とこの最適化に有利」だから
気を利かせて余分に取ってるわけではない
458 :
2014/06/05(木) 23:04:15.60 ID:a9B4CiIQ
>>456
虚心に読めよw

1.名前付きCOMMONで長さがそろわないのは文法違反。
2.ゆえにそれがどう扱われるかは、処理系依存。
3.したがって、自分の利用しているコンパイラがどう扱っているか調べる必要あり。
4.調べる方法の一例はMAPファイルを書かせること。実例をIntelCompilerで示した。

結論:そなたの使っているコンパイラがわからなければここでは答えようがない。
 大抵の処理系では適当に慮ってやってくれるが、昔のHITACのような凡例も
あるので何とも言えない。NAGとか文法にうるさいのを売りにしている処理系では
期待薄。

>>457
うむ。DECのαとか、64bit時代になってから、COMMON文の中までPaddingして
メモリー・アラインメントをそろえてくるので、昔のプログラムを動かそうとすると
やっかい。
Intelが32バイトづつ増やしているのは、AVXとかベクトル化の単位に合わせている
可能性が高いと思う。
459 :
デフォルトの名無しさん
2014/06/05(木) 23:32:23.89 ID:ivUEXHmG
誰かいまっくすでフォートランのコマンド自動補完する方法しらんかいの?
460 :
2014/06/06(金) 03:54:07.35 ID:jaKSg6aA
みんな Stallman のデブが嫌いだからな
それにスクリーンエディターに頼るのは甘え





俺は甘えん坊だがw
461 :
2014/06/06(金) 16:41:53.21 ID:J0jnFElL
甘いと言うより古いな
462 :
デフォルトの名無しさん
2014/06/06(金) 22:53:03.99 ID:Bx53wjCJ
メモ帳からデータを読み込む際、TABキーによる空白や全角による空白、半角による空白で違いはあるのですか?
数値を1 2 3 4と1行に入力したとき勝手に1、2、3、4と区別して読んでくれるのでどうやって判断しているのだろうと疑問に思いました。
試しにすべてのTABキースベースを半角1スペースに置換して読み込ませたところ、エラーで読みませんでした。
463 :
2014/06/08(日) 11:12:25.46 ID:dwjjMbeb
>>460
みんななに使ってるのかな?
464 :
デフォルトの名無しさん
2014/06/09(月) 23:14:56.35 ID:p2A2eKRk
>>429ですが、解決しました。
CHARACTER*120という部分だけを変えていて、FORMAT文まで変えていなかったりときちんとすべて変えていなかったのが原因でした。
そこここにローカルな記述方法が多く困りましたが、とても助かりました。ありがとうございました。
465 :
2014/06/10(火) 00:00:20.47 ID:uCkYRtw5
みんなずっこけるよ…
466 :
2014/06/11(水) 22:05:12.93 ID:HeH2upb6
プログラムが長くなってきて、
いくつかのファイルに分けてサブルーチンを書いているのですが、
わかりやすい整理方法、命名方法などないでしょうか
同じ機能群のサブルーチンは
同じファイルにまとめるぐらいはしているのですが
だんだん分からなくなってきて
多分このまま続けたら発散するんだろうな・・と思います
スレ違いかもしれませんがもしコツなどありましたらお願いします
467 :
デフォルトの名無しさん
2014/06/12(木) 00:49:36.30 ID:iuJue+V7
あるプログラムの一部を修正している途中なのですが、触っていないところでエラーが起きるようになり、困っています。
build自体は問題がなくて、build後のプログラムを実行すると以下のエラーメッセージが出て止まります

illegal character in numeric input
read(unit=1,...)

修正前のプログラムでは滞りなく回るのですが修正中のプログラムでは回らなくなっています。
触っていないところなのでどこから手をつけて良いかわかりません。
468 :
2014/06/12(木) 01:11:55.34 ID:37CEZRmy
>>467に追記です。
修正前のプログラムは
absoft fortran 9.0(windows7)
修正後のプログラムは
absoft fortran11.0(windows8)で作られています

修正前のバージョンに自信がないですが、バージョンが異なるのは確かです

もともと、修正後のプログラムはビルドできるのに、そのプログラムをwindws7、9.0のパソコンでビルドしようとするとなぜかビルドできないという状況です

そこがエラーを起こす原因なのかもしれません

プログラムが止まるところはインプットファイル中にある、ある数を0にしておけば回るようになり、0じゃなくて数を与えるとエラーを吐きます。
469 :
2014/06/12(木) 02:49:22.16 ID:KPlz8uhx
おおかた、全角文字でも入っているのだろう。
470 :
2014/06/12(木) 07:38:50.36 ID:IkGTnMqV
>>469
どうすればそこを見つけられるのでしょうか
471 :
デフォルトの名無しさん
2014/06/12(木) 22:00:13.35 ID:1yO42ooY
>>468ですが、修正は関係ないことがわかりました。
もともとの渡されたソースファイルをabsoft fortran 11.0でbuildするとbuild自体はうまくいきますが、同じ箇所でruntime errorとなりました
コピーして新規ファイルを作ってbuildしても同様の結果となりました。.f95.f77.fの3パターンで新規ファイルを作ってbuildしましたが、同じ結果でした
verはおそらく9.0で拡張子は.fで渡されています。
.fファイルだけでなくguiやgviという拡張しのついたファイルも一緒に渡されているのですが、それを11.0では必要としていないので使っていません。
これが何か悪さをしているのでしょうか?
472 :
デフォルトの名無しさん
2014/06/13(金) 08:46:16.45 ID:YPxIZA8y
もともとのファイルは9.0でビルドすると正しく動くということ?
環境を変えるときコンパイラが生成したものを運んだりしてないか

ある数が0の時回るとあるけど、その変数周りを調べていくしかないと思う
なんの数字か知らないが、例えばその数が読み込むデータの数を表してて、その数字と実際のデータ数があってない
そして型の合わない次のデータを読もうとしてとまるとか
473 :
デフォルトの名無しさん
2014/06/13(金) 08:59:26.44 ID:XnqRfLRO
>>472
はい。同じ読み込みデータでも正しく動きます。
runtime error
illegal character in numeric input
ある数というのは出力してほしいデータを指定する数です。
データの種類が5種類ほどあって、ある1種のデータを出力するよう指示をすると止まってしまいます。
一行中に
300 400 200 0 0
というように出力してほしいデータの数を指定しますが、みぎから2番目のデータを変えるとダメです
正しいアウトプットでは
<< 出力するデータの情報 >>
出力データ
...
というように進むのですが、ある数字では
>>
だけが延々と繰り返されたり、別の数字では上記の通りruntime error illegal character in numeric inputと出て止まったり
というような感じです
474 :
デフォルトの名無しさん
2014/06/13(金) 09:10:39.79 ID:YPxIZA8y
>>473
入力はこの5つの数字だけ?
それぞれのでーたに対して個別に入力があったりしないの
475 :
2014/06/15(日) 17:47:40.77 ID:QZWVyVFy
>>473
この記事関係ではない?
Http://jp.i-planet.me
476 :
2014/06/16(月) 04:00:13.60 ID:fWvfMn7M
>>474
すみませんよく意味がわかりません
>>475
拝見しましたが違うような気がします。

11でビルドしたらうまくいかないものを9.0でビルドすればうまくいくようになりました。11と9の間でうまくいかないものがあるようです。

11でビルドは諦めてビルドだけ9が良いのかもしれません

なぜか今まで使えていた9がinvalid licenseと突然出るようになってビルドが今はできないので、まずはそこをなんとかしなければなりませんが…。
477 :
2014/06/16(月) 10:00:44.78 ID:juShtlay
cuda fortranについて初歩的な質問なのですが、
PGI workstationで、-cublasとオプションを付けてコンパイルしようとすると、
『fatal error LNK1104: cannnot open file 'libcublas.lib'』とエラーが出てしまいます。
この場合、どうしたら良いですかね?
どなたか教えてくださると助かります。
478 :
デフォルトの名無しさん
2014/06/16(月) 10:13:18.23 ID:3pyBJ4C4
>>477
パスが通ってないんだろ

そのエラーにあるファイルがあるか探す
ファイルがあるパスをLオプションで追加でとりあえず通るはず
例えば-L/usr/local/cuda/lib -cublas
479 :
2014/06/16(月) 15:38:44.47 ID:juShtlay
>>478
探して見たところ、'libcublas.ipl'、'libcublasemu.lib'という名前のファイルしか見つかりませでした。
そこで、これらのファイルが保存されているフォルダのパスを追加してコンパイルしたところ、
『error lnk2019: unresolved external symbol referenced in function』
というようなエラーが出てきてしまったのですが、
どうすれば良いか教えていただけませんか?
480 :
デフォルトの名無しさん
2014/06/16(月) 15:50:37.89 ID:Q+b6M39D
>>479
試しにcublasをcublasemuに変えてみて
libcublas.libがなかったのならもしかしてパスはすでに通っていたかもしれません
481 :
2014/06/16(月) 16:27:09.31 ID:juShtlay
コード中の'cublas'を'cublasemu'に変更し、
'-lcublas'を'-lcublasemu'に変更してコンパイルしたところ、
『unable to open MODULE file cublasemu.mod
compilation aborted』
と出てしまいました。。。
482 :
デフォルトの名無しさん
2014/06/16(月) 16:43:59.97 ID:vxzjg7XS
>>481
コードは元のままでいいです
申し訳ない
483 :
2014/06/16(月) 16:54:43.67 ID:juShtlay
>>482
元のコードでやってもやはり出てしまいますね。
484 :
デフォルトの名無しさん
2014/06/16(月) 17:46:47.99 ID:vxzjg7XS
>>483
use cublasemuになっていませんか?
485 :
2014/06/17(火) 09:43:20.11 ID:W5zFtzyB
>>484
いえ、ちゃんとuse cublasってなっています。
486 :
デフォルトの名無しさん
2014/06/17(火) 13:19:25.73 ID:gUXRuUGZ
use cudafor
use cublas
が指定されている

-Mcudaまたは-Mcuda:4.0あるいは-Mcuda=emu

unresolved external symbolと言われたら
libが足りないので-lで追加
*.libがないと言われたら
-Lなどでパス追加
*.modがないと言われたら
-Iでパス追加

参考
http://www.softek.co.jp/SPG/Pgi/TIPS/opt_cudaF.html
http://www.softek.co.jp/SPG/Pgi/TIPS/public/accel/cublas40.html
487 :
2014/06/17(火) 16:58:12.46 ID:W5zFtzyB
>>486
-Lパスでディレクトリを指定して、-cublasemuをつけてコンパイルしたところ、
"libcublasemu.lib : error lnk2019: unresolved external symbol referenced in function"
が、ものすごい数のが出てきたのですが、どうしたらいいですかね?
一個ずつ-lで追加していくしか無いのでしょうか。
488 :
デフォルトの名無しさん
2014/06/17(火) 17:24:37.11 ID:AhgC7kyl
cublas使わなければ普通に動くの?
489 :
2014/06/18(水) 11:22:33.36 ID:nvOujYC+
>>488
はい。cublasが関わるところを全てコメントアウトしたところ、動きました。
490 :
デフォルトの名無しさん
2014/06/18(水) 18:11:03.14 ID:s+RQ8hIL
>>489
可能な限り少しずつコメントアウトを外していき
その都度コンパイルが通るようにオプションを調整してみてください
最初はuse cublasだけなど
大量のエラーが少しずつ出ることを期待します

cublasは呼び出し方法が旧いものや新しいもので3種あるようですが
呼び出し方と CUDA toolkit のバージョン指定はあっていますか?

pgi cuda Fortranはデバッグ用にGPUを使わないエミュレートモードが用意されています
コンパイルオプションとリンクするライブラリの両方で切替えるようです
どちらを使用していますか?
cublasemuはエミュレートモード用で
オプションに-Mcuda=emuを併せて指定します
491 :
2014/06/20(金) 16:00:17.10 ID:utkwlJ0p
Cのatoiとかatofのように,文字列としての数字の列を
integerなりrealの値に変換してくれる函数はあるでしょうか。
当方は,MinGWのgfortran95を使っています。
492 :
2014/06/20(金) 19:25:02.85 ID:bxod4dQ6
>>491
内部ファイルを使うのがセオリー
NAG Fortran入門 19.5 数値と文字の変換を行う方法
ttp://www.nag-j.co.jp/fortran/FI_18.html#ConvertingBetweenNumbersAndStrings
493 :
2014/06/20(金) 21:53:29.14 ID:utkwlJ0p
>492
ありがとうございます。
こういう裏ワザがあったのですね。
さっそく使わせていただきます。
494 :
2014/06/21(土) 17:36:05.91 ID:L2qICpES
裏ワザというかFORTRAN77の頃からあったし、
66時代にはENCODE/DECODE関数が用意されていたんだがな。

マニュアルをよく読めば、内部ファイルの項目が昔から書いてある。
495 :
2014/06/21(土) 20:05:31.04 ID:6Ae9RUEd
>464
そうでしたか。なにしろわたしが FORTRANを学生時代に始めた
ころはFORTRAN IVのころで80桁のパンチカードにパンチした
カードデックを窓口の届けると2日程で,棚にカードとラインプリ
ンタで打ち出した結果がおいてあるという時代(東大の計算センター
にあったHITAC 5020)のころで,FORTRAN77の出る前
ダイクストラの構造化プログラミングが騒がれ始めて,
カーニハンとリッチーの『ソフトウエア作法』をよんで,
構造化出来るRATFORを大学にあった小さなコンピュータで
実験しているころからの進歩を知りませんでした。
その後,CおよびC++に興味が移りFROTRANをご無沙汰してい
たのですが,最近のFORTRANで128bit処理ができることを
知り,まいもどってきた次第です。
市販のfortran90,95の入門書を見てみたのですが,見当ら
なかったので,質問したしだいです。
496 :
2014/06/21(土) 22:49:19.55 ID:jwjy0CXq
はろけくも来つるものかなフォートラン

あっ季語がない
497 :
2014/06/24(火) 20:49:58.43 ID:vNnfb12N
Gfortran 使ってるんだが、データを読み込ませる際、2行ごとにデータを読み込ませることって可能?
498 :
2014/06/25(水) 01:47:13.51 ID:2uAyyXu5
素直に全部読みなさい
変数に入った値は、必ず使えとも使うなとも言われてないだろう
499 :
2014/06/26(木) 00:45:30.86 ID:oXHKxD2l
まぁ空のread文で1行飛ばせるけどな。
Fortmatの/でも行けたっけかな?曖昧みー
500 :
2014/06/26(木) 01:01:48.05 ID:pqUjp/UA
awkなりsedなりで一行飛ばしの中間ファイル作って、それをデータファイルにするとかじゃだめなの?
入力関係でつまづくなら、fortranにあわせたファイルを作成する方が早いのではと思ってしまう。

バイナリデータだとテキストみたいにいかないのか。バイナリデータだったらごめん。
501 :
2014/06/26(木) 08:16:37.95 ID:MILdybit
>>498->>500
レスどもです。直接n行ごとに読み込むという作業はできないみたいですね。
私も中間ファイルを作って…と思いましたが、読み込みデータをいじってはいけないらしく断念しました。
解決案は以下の通り、(n行ごとに読みたい場合)
If(mod(i,n) .eq. 0) then
Read(20,*) hoge(i)
Else
Read(20, *)
Endif
502 :
2014/06/26(木) 21:08:20.99 ID:2skFYUOi
詰めないと使いにくくない?

i=1
do m=1, linenum
if(mod(m,n) .eq. 1) then
read(20,*) hoge(i)
i = i +1
else
read(20,*)
endif
enddo
503 :
2014/06/27(金) 00:10:25.56 ID:kJEq6I8z
>>499の言うとおり、formatを'(i,5/)'とかにすれば良いのでは?
504 :
2014/06/27(金) 00:38:41.62 ID:iFH1F/Cx
>>502
あっ、もしかして>>501のやり方って途中空白行入ってることになるのかな???

>>503
それについて少し調べる必要があるかも。
具体的にどゆこと?
505 :
2014/06/27(金) 00:42:32.62 ID:P3Dz9sSW
formatのスラッシュでskipできるぞ。

program test
implicit none
character(len = 132) :: text
open(10, file = 'test.f90')
1 read(10, '(a, /)', end = 999) text
print *, trim(text)
goto 1
999 stop
end program test
506 :
2014/06/27(金) 01:05:20.13 ID:iFH1F/Cx
>>505
おお!スラがスキップすると言う指示内容なんですね。
507 :
2014/06/27(金) 02:12:24.88 ID:P3Dz9sSW
>>506
んだ。
writeの時は出力1行改行、readのときも入力改行で結局1行読み飛ばすことになる。
508 :
デフォルトの名無しさん
2014/06/27(金) 09:18:57.76 ID:F3h4qtWf
久しぶりにfortranのプログラム見たが、FORTRAN77の時代と違って気持ち悪い。
これならC++の方がまだいい。テンプレート関係を除けば。

でも、fortranは4倍精度計算ができるからなあ。
並列処理やGPGPUに対応したライブラリも出ているし。

まあ、年寄はfortranからMatlabに移行しているみたいだが。
509 :
2014/06/28(土) 00:46:11.64 ID:PIVLw57u
おじいちゃん。
あんま結論を急がない方がいい。
配列演算気持ちいい。PUREでELEMENTALなら最高。

4倍精度は精度は4倍だが計算時間は10倍超だから、
10倍の時間の合間にアルゴリズム見直した方が吉。
510 :
2014/06/28(土) 02:59:17.00 ID:EHQFW5QP
gccにもquadmathがあるんだからあまりFORTRANを高く評価しない方がいいよ
511 :
2014/06/28(土) 13:41:05.28 ID:1f0E4KM2
並列計算させてdoループの中でwrite文でファイル書き込みしたら中身の順番めちゃくちゃで泣きました。
どーにもなんないんですかね?
512 :
2014/06/28(土) 15:42:05.65 ID:cJj78OR7
>>510
そもそもlibquadmathはFortranのために追加されたんだが
513 :
2014/06/28(土) 16:56:46.35 ID:DtEJ1AXR
>>511
write文だけ逐次処理させるか、ループの外に出すしかないと思う。
514 :
デフォルトの名無しさん
2014/06/28(土) 22:06:02.07 ID:mzWdk+zj
>>509

はぁ。。。

配列演算気持ちいい、って何? それ。
C**なら行列演算クラスライブラリ作って、演算子オーバーロード使えば終わりじゃん。

まさか、行列積が「・」でできると言うんじゃないだろな?

>4倍精度は精度は4倍だが計算時間は10倍超だから、
>10倍の時間の合間にアルゴリズム見直した方が吉。

何言ってんだ?この馬鹿。
物理計算によっては4倍精度の計算が必要なの。計算時間やアルゴリズム
の問題じゃない。人の言ってることをそのまま受け売りするな。阿呆
515 :
デフォルトの名無しさん
2014/06/28(土) 22:07:05.28 ID:mzWdk+zj
>>514

C** → C++
516 :
2014/06/29(日) 00:26:55.37 ID:S1guW8MB
懐かしい単語を見かけたからって
いい大人が質問スレに何しに来てんだろね

それとも>>508は質問なのか?
517 :
2014/06/29(日) 10:07:26.16 ID:zjmbmtCs
libquadmathの中を覗いてみたら、x86版はFPU使ってるけどx64版はSSE2使ってるな
518 :
2014/06/29(日) 12:17:10.06 ID:eLJ+YA5h
ポインタが表に出ない(もちろん POINTER は除く)、
配列長と次元が暗黙的に持てることは評価できると思うんよ
matlab/octave に勝るかというと微妙だけど(移植性くらい?

>>511
ソースコード> このループは順番ぐちゃっても大丈夫です
処理系> なら並列実行しても同じだよね!
という発想なので、そういう副作用も考慮しなきゃダメ

>>517
確か x86_64 は SSE の存在を仮定していいはず
まぁ x86 も SSE/AVX も quad precision floating-point の直接演算は無い
519 :
2014/06/29(日) 12:46:18.15 ID:eLJ+YA5h
> C++なら行列演算クラスライブラリ作って、演算子オーバーロード使えば終わりじゃん。
> まさか、行列積が「・」でできると言うんじゃないだろな?

冗長だけど、〜すれば終わり、程度には書けますぜセンセー。

function dotp_r8(A, x) result(y)
double precision, intent(in) :: A(:,:), x(:,:)
double precision :: y( size(A,1), size(A,2) )

y = matmul(A, x)
end function
!----====----====----====----====----====----====----====
program test

interface operator(.dot.)
function dotp_r8(A, x) result(y)
double precision, intent(in) :: A(:,:), x(:,:)
double precision :: y( size(A,1), size(A,2) )
end function
end interface
double precision :: A(2,2), x(2,2), y(2,2)

A = reshape( (/1.D0, 1.D0, 1.D0, 1.D0/), (/2,2/) )
x = reshape( (/1.D0, 3.D0, 2.D0, 4.D0/), (/2,2/) )

y = A .dot. x

write (*, '(2F8.3)'), transpose(A); print *
write (*, '(2F8.3)'), transpose(x); print *
write (*, '(2F8.3)'), transpose(y)
end
520 :
2014/06/29(日) 13:09:54.23 ID:RUBiLoi5
クラスライブラリで演算子オーバーロードって・・・遅そう。
素人が書いたマクロじゃ最適化効かないでしょ。
ソースの見かけで書けたって意味ないの。

大体、高速行列演算ライブラリを自分で作れるくらいなら、四倍精度のライブラリ
も自作すればいい。昔の爺さん世代はよく倍精度・四倍精度自作ライブラリを自慢していたw


まぁC++のBlitzなんて10年以上前から夢を語ってノロノロ開発して
ようやく最近なんですけどね。
521 :
2014/06/29(日) 14:46:16.10 ID:qF+KN0J6
>>513>>518
なるほど、順番がどうなっても良いような時にしか使っちゃいけないポイですね。

どういった場面で並列化使えるのかな…
自分はある物理の数値計算に使ってるんだけども、順番が変わったらダメ。

それにしてもここにいる住人は凄い人が多くて、泣ける
522 :
2014/06/29(日) 15:59:56.49 ID:l4jNLVEs
並列化は普通に物理の数値計算につかうけど、、、
523 :
デフォルトの名無しさん
2014/06/29(日) 17:26:15.54 ID:rvrpBbGm
>>519

あ、そう。matlabみたいに糞な「:」が好きなのね。もういいから、死んでね
お爺ちゃんからこんな言葉を言われたお前はすでに終わっている。

>>520

その通り。面倒くさかったから書かなかったけど。
とにかく、一時オブジェクトの生成と.消滅、データのコピーが頻繁におきる。

それを避けるために右辺値参照が使えるかどうか。でも行列乗算や線形連立代数方程式
を解く場合には使えないかも。まだ、やってみてないからわからんが。

作業用行列のポインタ値を管理するグローバルオブジェクトを使うと
上の問題は回避できるが、残念ながらマルチスレッドには対応できてない。

これをどのようにグローバルスレッド対応にしたらいいか、戦略が
立たない状態です。
524 :
デフォルトの名無しさん
2014/06/29(日) 17:29:17.08 ID:rvrpBbGm
>>519

しかし、ほんとコードが糞だよな。こんなの覚えるくらいなら
C++の方がましだわ
525 :
2014/06/29(日) 17:34:36.24 ID:qF+KN0J6
>>522
いや、そうでしょうけど、出力の順番とか気にする場合が私の研究分野だとほとんどなので…
なにか勉強になるものがあればいいのですが
526 :
2014/06/29(日) 17:57:50.26 ID:RUBiLoi5
David BaileyがFortran用とC++用の4倍、8倍、多倍精度ルーチン公開してた気がする。
http://crd-legacy.lbl.gov/~dhbailey/
527 :
デフォルトの名無しさん
2014/06/29(日) 17:59:34.52 ID:rvrpBbGm
間違えた

グローバルスレッド対応→スレッド対応
528 :
2014/06/29(日) 21:18:38.95 ID:UItnk67i
>>525
プロセス(OpenMPならスレッド)ごとに別ファイルに出力して、
後で適当なスクリプトでマージするとか。

でも普通はそんなことしないで、>>513 が書いてるように、
doループを計算部と出力部の2つのループに分けて、
計算部のみ並列化して出力部分は逐次処理だと思う。
529 :
2014/06/29(日) 21:46:47.56 ID:eLJ+YA5h
はいはいソーデスネーでっかい一時領域作ってなにしてんでしょーねorz

pure で elemental とゆーと配列を引数に放り込むとその全要素に
関数定義された処理が適用される、各処理は独立なのでまとめるなり
並列化なりをコンパイラーに期待、かな。演算子全然関係ないしorz

過去のシサンガーとかもう辛いだけ。
どこまでも未来に生きてください、Fortran スレになんか戻らないでください。

>>521
出力の順序だけ重要ならバッファして後から並べ替えるとか
浮動小数点演算的に結果を変えられないなら仕方ないかもだが

だって人口少ないし交流少ないし機会もないし意味すらないかもしれない、
たまに発言すれば馬鹿にされるから凄い人しか残らないわけで。
530 :
2014/06/30(月) 00:33:26.64 ID:8S3fud89
>>518
それは分かる
でもエミュレーションしたら1/10程度じゃ済まないだろうから一応ハードウェアが
有効に働いてるんだな
double-double演算でもないみたいだし

>>526
面白そうだね

4倍精度が必要になるのは例えば反復法などの収束を加速する時などで、
単なる倍精度だと桁落ちのために誤差が生じてなかなか収束しない時に
有効だったりするね
531 :
2014/06/30(月) 02:26:19.67 ID:fawqTnic
Fortranの強みは常に時代の最先端ハードウェアに対応していることじゃないかな。

最近でもIntelはDECのFortran買ったし、NvidiaはPGIを買収したし。
両社ともGPUアクセレレータを含む自分らの最新ハードとセットで、
同じタイミングで対応したコンパイラを出してきている。

本来ハードウェアとソフトウェアは表裏一体、精神と肉体のような
不可分の関係にあるはず。そしてFortranは未だその密接さを保っている。

ソフトウェアの人たちは、ソフトウェア単体での独立価値を信じたいようだけど
現実は違っている。

この現実認識の歪が過剰なFortranディスカウントキャンペーンとして噴出して
いるのではないだろうか・・・と新聞並に論理を飛躍させて終わるw
532 :
デフォルトの名無しさん
2014/06/30(月) 13:21:06.69 ID:V1UUNHQo
>>529

そういうのに向かない計算アルゴリズム(隣のセルの計算結果を使う。つまり独立ではない。
そうなると同期の問題も発生する)もあるんだ。

>過去のシサンガーとかもう辛いだけ。
>どこまでも未来に生きてください、Fortran スレになんか戻らないでください。

で、お前何が言いたいんや?日本語大丈夫か?
533 :
2014/07/01(火) 01:36:55.46 ID:DMO1kVAm
1 :デフォルトの名無しさん:2012/08/16(木) 20:58:00.31
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。
534 :
2014/07/03(木) 20:06:28.12 ID:Ct9dkTzH
つかぬことをお聞きしますが
皆さんのfortranの本の勉強履歴はどんな流れですか?
私は冨田さんfortran90の本→辞書的にfortran90入門をかいつまむぐらいしか
やっておらずとりあえず拙いなりに読み書きはするのですが
なにか良い本あればおしえていただけないでしょうか
535 :
2014/07/04(金) 01:38:26.65 ID:41RxNfGp
故岡村先生の授業テキスト
やーっふぉ、やっふぉ、ふぉーとらんらんらん
536 :
2014/07/04(金) 01:45:11.81 ID:cNJNO1xN
Fortran95/2003 Explained --> Modern Fortran Explained
537 :
2014/07/05(土) 07:04:30.09 ID:sNpoyHpR
emacsでコメントアウトに使う関数fortran-comment-regionのデフォルトの動作が
行頭にCを挿入するのではなく,C$$(自由形式では!!$)を挿入するのは何か理由があるのでしょうか?
$つけたほうがメリットとかあるの?
538 :
デフォルトの名無しさん
2014/07/07(月) 01:06:30.37 ID:1zKRZTH9
absoft 9.0でf77fileをコンパイル成功、プログラム自体も上手く行く
absoft11.0でコンパイル成功、プログラム自体もインプットファイルのある部分の記述次第で上手く行く
ある記述部というのはアウトプットするデータ個数を指定するところです。20個程度なら上手くいくのですが数百個と増やすとうまくいきません。
エラーメッセージは
illegal character in numeric input
で、インプットファイルにおかしい部分があると言っています。しかし9.0でコンパイルしたものはきちんとうまくいくのです
何かアドバイスいただけないでしょうか。プログラム自体は3万行程度あるというのと内容だけに書き写すのは難しいです。
539 :
2014/07/07(月) 01:25:39.47 ID:VWd7ewX/
>>538
よく分からないけど、正常に動くなら9.0のままじゃ駄目なの?
出力するときフォーマットは指定してる?
してるなら*で指定なしにしてみたら
540 :
デフォルトの名無しさん
2014/07/07(月) 09:24:44.41 ID:1zKRZTH9
>>539
formatを指定しています。そこを当たってみる事にします
9.0のままで良いのですが、引き継ぐものなので後の人のために11.0で動くよう乗り越えておきたいんです。
541 :
デフォルトの名無しさん
2014/07/08(火) 00:03:54.23 ID:DZPoMbBV
Gfortran で定義してない変数があってもたまにエラーはかない時あって焦った。
デバッグで小一時間汗流したわ。
gfortranってたまにアホな子になるの?
542 :
2014/07/08(火) 23:44:01.37 ID:0sSau+NY
>>535
>>536
ありがとうございます
まだ私が理解できるレベルにないかもですがいつか読んでみたいと思います
543 :
2014/07/09(水) 03:16:15.11 ID:i/yEgb7/
>>538
出ているエラーメッセージは、入力ファイルの問題で、数字の代わりに
(たぶん)文字が来ているということ。

F77時代(かそれ以前)のプログラムの用だから、入力ファイルの数値の
フォーマットも指定されていると推測される。数値が指定カラムから
はみ出していないか見て味噌。

以前
  300 400 200 0 0
これで右から2番目でおかしくなると言っていたが、たぶん4カラムづつ
入力にとってある。300 400 200 000 000 ならたぶん動くだろう。
今は 0 0 を読んで、数値Formatがおかしいと文句を言われているのだと思う。
544 :
2014/07/09(水) 03:17:43.97 ID:i/yEgb7/
ではなぜ Absoft9 ではよくて、11では駄目なのかと問うかもしれない。
考えられることとしては、入力データの空白の扱いのデフォルトが変わった
ことが考えられる。FORTRAN最初期からの伝統で、入力データの空白は
数値としてはゼロを意味している。文法書のFORMAT分のところをよく読むと、
BZとBNというオプションがある。BZはBLANK ZEROでBNはBLANK NULL(NONE)
を意味していて、解釈を変えられる。昔のデフォルトはBZだった。
しかしF95かF2003くらいでたしかデフォルトをBNにしていた気がする。
今、手元に資料がないので確認できないがw
というわけで、absoft9は空白を0として読んで、0 0 を000と解釈したが、
Absoft11は0 0を数値として解釈不能とみなして、illegal character in numeric input
の実行時エラーをはいているのだろう。
またそうだとするとAbsoft9では0入力の実行回数が1回少ないはずである。


ちなみに、なぜ空白がゼロなのか?これは昔は、紙テープ、パンチカードの
穴あき不良や読み取り不良が多くて、パンチカードのスペース(穴なし)
が出やすかったからと聞いたことがある。ホントかは知らない。

あとメール欄にsage と書くように。
スレが上がると、冷やかしが紛れ込んできてスレが荒れる原因になる。
545 :
2014/07/09(水) 04:42:58.29 ID:2jkWCmKB
>>538
>>543,544 に加えてOPEN文のBLANK=も確認するといいかも。
手元の言語仕様のドラフト板ではFORTRAN77/90/95/2003共に
NULLがデフォルトになっているけれど。

それとabsoft9.0と11.0とでコンパイルオプションが違うというオチはない?
コンパイラは上記の様なデフォルトの解釈を変更するオプションを持っていたりするよ。
そのオプションが使われていた場合、ソースをいくら読んでも原因はそこにはないから注意ね。
546 :
2014/07/10(木) 18:28:18.82 ID:pJ0O1Ur0
FORTRAN77のCOMMON文とEQUIVALENCE文について質問です.
!---
DIMENSION A(4)

EQUIVALENCE (A, V1)

COMMON /VS/ V1, V2, V3, V4

のようなコードをfortran90風に書き直したいのですがAをCOMMONブロックの変数で置換する以外にいい方法は無いでしょうか?
できればSubroutine等を増やすのではなく,Moduleの変数宣言部分だけで解決したいのですが...
547 :
2014/07/10(木) 20:24:35.98 ID:2hSWNwRP
>> 546
↓使えるかな
http://www.nag-j.co.jp/fortran/FI_16.html
16.1.2 モジュール内の名前を別の名前で参照する方法
548 :
2014/07/10(木) 22:05:54.56 ID:pJ0O1Ur0
>>547
ありがとうございます
早速以下のように使ってみたんですが
module VS
real :: V1, V2, V3, V4
end module VS
program
use VS, A => V1
...
A(1) = 1.0d0
...
end program

↑コードのA(1)に代入する部分で
error #6410: この名前は配列または関数として宣言されていません。
とgfortranのコンパイルエラーになります
dimension A(4)などと変数宣言すると
error #6401: この名前の属性が USE 文によってアクセス可能な属性と矛盾しています。
でコンパイルエラーになります
あと
use VS, A(1) => V1
のような書き方もだめでした
nag-j.co.jpのコード例だとAは変数とは扱われていないように思うのですがAを配列として扱うことはできないでしょうか?
549 :
2014/07/10(木) 22:50:41.50 ID:Te+Dpsre
>>546
無理なんじゃないかな。
それはそれで最小にまとまっている。
最適化に問題があるとはいえ、無理してCOMMONやEQUIVALENCEを直す必要もない。

そのコードが意味しているのは、V1,V2,V3,V4を4つの実数変数として共有しているが、
これをエイリアスとして配列に結び付けて使いたいということになっている。

ところが、COMMONでないとV1,V2,V3,V4のメモリー上の番地が連続することを保証できない。
だから配列へのポインタを充てることができない。
(TYPEの中に入れれば、sequence属性で番地の連続性を保証できるが…
f2003のC言語との互換性機能も使えるかもしれないが、COMMONよりひどい気もする。)

ばらばらの番地いる変数を個々にFortranにはポインタの配列はない。
(配列へのポインタはある。これを使うにはV1~V4が連続した番地にいる必要がある。)
実変数へのポインタを要素として持つ構造体を定義して、その配列を作れば
いいが、それでは大幅な書き換えで意味がない。

あとは、Fortranの規格を外れるが、どの処理系もほぼ必ず持っている
Cray Pointer を使う手もあるが、これもModuleの中では納まらない。
実行文が必要。

COMMONとかEQUIVALENCEはメモリーの番地共有だから、便利なことができる。
最適化を抑止してしまうから、主要部分には使わない方がいいが、
技巧的小技としては、うまく使うと短く書けるので、使えばいいんでね?
550 :
2014/07/10(木) 22:53:27.62 ID:Te+Dpsre
修正ミスwww

>ばらばらの番地いる変数を個々にFortranにはポインタの配列はない。
ばらばらの番地いる変数を個々に、ポインタの配列の要素に結び付けようにも、
Fortranにはポインタの配列はない。
551 :
2014/07/11(金) 03:55:49.85 ID:wFVmEw9F
ちょいと手間だがこれじゃダメかい

module VS
real :: A(4)
real :: V1, V2, V3, V4
equivalence (V1, A(1)), (V2, A(2)), (V3, A(3)), (V4, A(4))
end module VS
552 :
2014/07/11(金) 04:36:13.83 ID:gSvcXiep
>>549
大変詳細な解説ありがとうございます
てっきりEQUIVALENCEは廃止予定事項だと思い込んでましたが便利ですね

>>551の書き方でいこうと思います
equivacenle(A, V1)
でも -chack all -warn allでエラーは出ませんでしたが実行時にメモリ破壊起こるのかな
553 :
2014/07/11(金) 09:33:00.25 ID:cGGfPMzQ
>>543,>>544,>>545ありがとうございます。
入力データの書式を指定する部分がを見た事がないのでそこを探してみます。ありがとうございます。
554 :
2014/07/11(金) 15:22:52.88 ID:RyCozEJp
>552
equivacenle(A, V1)
A(1)==V1 にはなるが、V2,V3,V4がV1の直後に連続的に配列されていなければ
A(2),A(3),A(4)とV2,V3,V4は全くの無関係となってしまいます。
MAPファイルを書かせてみれば、位置関係は分かります。

最近のコンパイラはかなりソース上の順番とは無関係に自由に
並べ替えるので、うまくいかない可能性大かと。

EQUIVALENCEはDeprecated Listに上がっていました。
この先廃止の見込みが高いので避けた方がいいリストかな?
deprecated -> obsolescent -> deleted の三弾活用の1段目。
555 :
2014/07/12(土) 03:13:21.15 ID:hZ9DjkyP
555
556 :
2014/07/12(土) 11:23:27.92 ID:Rc8WL8IV
>>555
ダミアンもどき
557 :
2014/07/13(日) 00:10:07.50 ID:+Eo/x1ZD
サブルーチンの内部ではうまく計算されているのに、
メインでwriteするとよくわからない大きな数値になってしまっているのですが、
なにか解決のヒントないでしょうか?
断片的で申し訳ありません
558 :
2014/07/13(日) 00:31:08.73 ID:+Eo/x1ZD
すいません自己解決しました
配列宣言の量が少なかったボンミスです
allocatable使わないとこういうことになるんでしょうか
お騒がせしました
559 :
2014/07/19(土) 14:16:39.37 ID:BjGmX3Lx
2014年になってもFORTRANが選ばれる理由
ttp://developers.slashdot.jp/story/14/05/12/0410259/2014%E5%B9%B4%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%82%82FORTRAN%E3%81%8C%E9%81%B8%E3%81%B0%E3%82%8C%E3%82%8B%E7%90%86%E7%94%B1

まだ残っていきそうな感じだね
560 :
2014/07/20(日) 02:33:05.33 ID:RXdcC8ex
FORTRANで書かれたBLAS/LAPACKをライブラリとして呼び出しているLLが
FORTRANと同等のスピードが出ることを大々的に喧伝すると、
それに釣られて、もうFORTRANは要らないのだ!とか言い出す人が、
情強を誇るネットの有名人にも多いので草不可避w
561 :
2014/07/27(日) 19:42:35.57 ID:fTZkfzZt
>>553の問題は解決したのかいな?
562 :
2014/08/04(月) 11:41:31.29 ID:IXwYtmhs
バイナリ出力をするときにOPEN文に指定する
form='binary'はFortranの標準ではなく、独自拡張みたいですが、
標準のコーディングだけで'binary'と完全に等価なバイナリ出力をする方法はありますか?

form='unformatted'を指定すると、write文を書くたびに
データの最初と最後に4バイトのレコード長がつき、
form='binary'を指定すると前後4バイトがつかないみたいです。
563 :
2014/08/04(月) 17:53:28.34 ID:fzuw5J0Z
Fortran2003以降ならストリームが使える
http://www.nag-j.co.jp/fortran/fortran2003/Fortran2003_7_1.html#AUTOTOC_7_1
564 :
2014/08/04(月) 22:17:03.55 ID:IXwYtmhs
>>563
ありがとうございます。
試してみます。
565 :
2014/08/05(火) 02:23:56.59 ID:BDydvxMf
directファイルを使うテクニックもある。
確実ではないが、大抵の処理系では、バイトまたはワード単位でべた書き
しているので、binaryの代わりに使える。

バイトかワードかは処理系によるが、コンパイラのオプションでどっちにも
できることが多い。

まぁ今の時代は素直に stream だろうが。
566 :
2014/08/07(木) 21:48:00.99 ID:ZvlX+BXk
>>565
またまたありがとうございます。今日、会社でstreamを試してみたら、
コンパイラが古いためか(Windows版Intel Fortran 9.1)、
コンパイル時に「streamなんて知らないよ」って言われました。
directで試してみることにします。
567 :
2014/08/13(水) 10:42:21.52 ID:KHi6ZJrR
構造型にSave属性つけられないんですけど
構造型をModuleに入れてグローバル変数として使いまわすのは危険(未定義になる可能性があるん)でしょうか

あとFortranの質問じゃないかもしれませんが
Intel MKLのBLAS/Lapack95はpure procedureであるとInterface定義に明記されてるけど
BLAS/Lapack77はPureなんでしょうか
568 :
デフォルトの名無しさん
2014/08/13(水) 11:45:31.24 ID:KHi6ZJrR
↑すみません 多分自己解決しました
構造体の定義のあと変数宣言したものにはsave属性つけられますね(定義しかしてなかった)

BLAS77は間違った引数渡すと標準出力(か標準エラー出力)になんか表示されるのでpureじゃないってことでしょうかね
569 :
2014/08/13(水) 12:55:08.27 ID:RBRmoRtS
>>568
そもそもFORTRAN77には言語仕様上pureは存在しない。
Lapack95はFortran95以降のプログラムからLAPACKのprocedureを
利用し易くするためのラッパーライブラリに過ぎない。
570 :
2014/08/13(水) 22:38:10.66 ID:/aB3oPfT
(コンパイル済みの)外部サブルーチンが真にpureかどうかは開発者/提供者の責任かと
例外処理は pure 要件から外していいと判断し、
pure と明記しておくことで最適化を妨げないようにしたのだろう
571 :
2014/08/14(木) 02:43:06.91 ID:EFpyKW9s
Fortranの組み込みサブルーチンで、乱数がサブルーチンで関数になっていないから
他言語に比べて使いにくいなと思っていたが、FORTRAN は PURE じゃないものは
関数にしない方針で一貫していて、乱数はPURE(参照透明)じゃないから
関数にしなかったんだと分かって、なんか納得した。時刻サブルーチンとかも。


最近関数型、関数型うるさいけど、他言語は意外にその辺一貫してないよな。

まぁFORTRANの場合、依存性があると最適化の邪魔になるから、
依存性を嫌っているだけだけどw 結果的にはより徹底している。
572 :
2014/08/21(木) 12:25:07.46 ID:J2kSTdr3
マットラボてどうなん?フォートランと比べて何か秀でた点ある?
573 :
2014/08/21(木) 22:20:31.76 ID:f+zPplkQ
そんなん解決したい問題,実装したい理論によりけりやろ
まあ計算規模が小さくて使いたいライブラリがMATLABにあるならそっち使ったほうが幸せになれるぞきっと
574 :
2014/08/23(土) 12:29:18.39 ID:r0lW6Kse
>>573
ま、それもそうだよな。
グラフのフィッティングソフトでいいのなかったので悩んでた。
無償でいいのないもんかねぇ。
Fittkだかもあんま美味だし…
575 :
2014/08/24(日) 20:56:38.40 ID:JVJfgdMr
MINUIT使えば
576 :
2014/08/28(木) 13:13:31.88 ID:G1Zq4e11
MATLABって個人使用なら五千円に値下げになってなかったけ?
577 :
2014/08/30(土) 13:35:28.03 ID:SJevJ5zH
>>575
ググってもなかなか情報ないんだね。
でもfortrN で書かれたパケなんですね!
これは貴重な情報です、ありがとうです!
578 :
2014/08/31(日) 23:33:34.12 ID:ChHwlQ4k
興味でお聞きしたいのですがfortranで株の発注のようなことはできたりしませんか?
例えば証券ホームページににログインし発注操作するなど・・
そういう言語じゃないのかもしれませんが・・
579 :
2014/08/31(日) 23:49:50.53 ID:lawRyb1w
fortranからC言語の関数呼び出せるので...
それじゃ邪道ですかw

まあHFTも金勘定も数値計算だしいいんじゃないでしょうかね
580 :
2014/09/01(月) 03:24:17.76 ID:xOVRhMZQ
そう言えば、Fortranって少数第n位以下を切り捨てみたいな関数ないんだね…
Excelで言うrounddownみたいなやつ。
今、ファイル書き出すのに一々四捨五入されちまって困りマクリングでつ、はい(´・_・`)
581 :
2014/09/01(月) 13:00:12.21 ID:3fk/vRi5
>>580
簡単だし自作したら良いじゃない?
582 :
2014/09/01(月) 22:10:23.80 ID:wdLC/vQV
>>579
ありがとうございます
なるほど他の言語を読み出せばいけそうなんですね
今後やってみたいです
583 :
2014/09/02(火) 07:37:26.28 ID:ADLMggi1
>>581
やはり自作しかないのね…
てかラウンドダウン程の関数が無い事に驚きだお
どっかでパッケージモジュールとして保管出来るようにするかね
584 :
2014/09/02(火) 08:58:57.02 ID:wSUV6Pdf
そんなに端数が気になるならもうひと桁増やして丸めればよかろうに
585 :
2014/09/02(火) 20:48:24.61 ID:vngmZpQR
むしろ、簡単に実装できるのにわざわざ関数がある言語のが珍しいかと
586 :
2014/09/02(火) 21:36:00.72 ID:2O5G2v8m
>>584
0.4999999999を小数点以下3桁で切り捨て表示するために4桁で文字列化しても内部処理が丸めだと0.500になってしまうかもしれんぞ
素直に1000倍して切り捨てて1000で割るがよろしい
587 :
2014/09/03(水) 02:46:13.39 ID:TB1UfkpT
>>580
なぬ?途中の計算の話じゃなくて、I/O 時の話か?
それならあるぞ。F2003もしくはF2008の機能だと思うが。

write(*, '(rd, f15.1)') 1.45 ! 1.4
write(*, '(ru, f15.1)') 1.45 ! 1.5

このほか rz, rn, rc もある。
それぞれ round up, round down, round to zero, round to nearest, round to compatible
最後の二つは最近接への丸めだが、等距離の時に、偶数への丸めかゼロから遠い方への丸めかだと思う
まぁ詳しくはマニュアルとIEEE754-2008の仕様をよく読んでくれ。
588 :
2014/09/03(水) 13:00:08.93 ID:TB1UfkpT
昼休みに調べたら rd ru の類はF2003だった。
あと rp processor dependent という処理系依存型もあるようだ。
あとOPEN文で指定する方法もある。

しかし、正直いって>>580の基本的発想が間違っている。
他の人達のアドバイスにあるように、そもそも内部二進表現を十進表現に
直すときに丸めなどが入ってしまう。そのうえでさらに十進表現を
丸めようとするのが Fortran 的センスではおかしい。
だからみんな当惑した反応しか返さない。

とはいえ自然科学ではない商習慣等での丸め等もあるようだから
別にそれがいけないわけでなく、それに合った言語例えば
BCD演算できるCOBOLなどで計算すべきのみ。
589 :
2014/09/03(水) 22:10:06.94 ID:aKlULROR
2015出たんだね
590 :
2014/09/04(木) 02:18:06.97 ID:dS3FSElc
Fortran コンパイラメーカ
Intel PGI Pathscale   (Intel NVidia AMD/ATI) アクセレレータ御三家

Absoft NAG          独自色 

Lahey/Fujitsu Silverfrost  斜陽族

GFortran g95        GNU Free系

こんなとこか? 
591 :
2014/09/04(木) 02:51:19.67 ID:Yy5o2rJg
Free系にOpen64と(一応)dragoneggがあるぞ
dragoneggはgcc4.8.3以降はサポートしてないしflangは開発止まってるし
この辺が活発化すれば若い人がたくさん来ると思うんだけどな
592 :
2014/09/05(金) 04:17:28.12 ID:tI2mbO8v
GNUでFortranやAdaが熱心にサポートされているのは、米国防総省あたりからの
金が流れているからなのかな?

意識高いw進歩的wCS学科若年層には人気は全くないのに。
それともおっさん層しかやってないからなのか?
そのわりにGNU COBOLとかPL/IとかALGOL、PASCAL、Modula-2とかやらないし。
593 :
2014/09/05(金) 08:06:03.87 ID:DENIJuH5
>>587
でもfortran95でしょ、ほとんどサポしてるのは
594 :
2014/09/07(日) 03:06:28.08 ID:5kwVdIF1
Cray, IBM, PGI, Intel が F2003 完全対応したな。
NAGはあと一歩。
GFortranは進捗どうですか?

スパコンだと SXは90 Hitachiも90? Fujitsuは95? 
それぞれつまみ食い的に拡張してあるが。
595 :
2014/09/07(日) 04:28:58.48 ID:+IELT+xO
日立のはコンパイルオプション-hf95で問題なく使えてたがあれ完全準拠じゃなかったのかな
まあ完全準拠だったらわざわざfortran90コンパイラとは名乗らないか
596 :
2014/09/10(水) 14:57:01.18 ID:rySPmzVQ
そういや、fortranのデータの取り扱い方について詳しくかいせつしてる本てあまりないね。
597 :
2014/09/13(土) 13:38:42.01 ID:xbN/YUGu
fortranのデータってなんじゃい?ファイルのことか?
598 :
2014/09/13(土) 20:59:58.06 ID:1ASLKxa3
>>596
format read writeのことなら、コンパイラーの取扱説明書が(独自仕様拡張部分も含めて)もっとも詳しいよね。
599 :
2014/09/14(日) 15:27:09.67 ID:aEQdUpNg
intel fortranはIMSLも非商用は無償にしてくれないかな・・
600 :
2014/09/15(月) 02:35:29.49 ID:0r1HU9OA
IMSLは会社が違うから無理だべ。
IntelはCPU売るためにソフトのコンパイラを撒き餌としてばら撒いてもペイするが、
IMSLの方としては特に得しないし。

富士通がLaheyにOEM供給した時にコンパイラにSSL2とかただでバンドルしていたが。
NECがASLをちょー高値で売っていたことを考えれば、ちょー太っ腹だった。

それはそうと日本の大学の大型計算機センターにたまっていたライブラリも、
NETLIBみたいにネットに公開して吐き出せばいいのに。
601 :
2014/09/15(月) 09:55:29.48 ID:SmofGg9r
>>598
Gfortran なんやけど…(´・_・`)
もうやめようかな。

Gfortran で書いたプログラムをIntel fortran でもコンパイルすること出来ますか?
602 :
2014/09/15(月) 11:07:29.74 ID:WIy8nvhC
GForce思い出したわ
603 :
538
2014/09/16(火) 03:14:29.14 ID:EYsbMZCB
>>538ですが、いまだに解決しません。
>>543の「数値が指定カラムからはみだしてないか」という意味がよくわかりません。
指定カラムというのはどこで見ることができるのでしょうか。
9.0と11.0ではビルドのUIが大きく変わっており、ビルドの条件が同じなのかどうか自信がありませんが、ほぼデフォルト状態でビルドしています。
604 :
2014/09/17(水) 01:15:32.64 ID:OkbA3cQE
>>603
当該 READ 文の FORMAT 文を見ると分かる。
たぶん昔のプログラムだから READ(99, 1000) N,B,C... みたいになっているだろう。
その場合行番号付で 1000 FORMAT(1H , 云々) となっている FORMAT文を見ればいい。
その行と引用しているREAD文を2chにコピペすればいい。

どの行かわからんというならDEBUGオプションでtracebackをオンにしてやれば
エラーで死んだところで行番号が出るはず。
605 :
2014/09/18(木) 00:30:49.37 ID:+0AmgyUa
Fortranってどの程度配列メモリに記憶出来てるのかな?

例えば
do i = 1, 100
Read(20,*) (a(i,j),j=1,20
End do
で write(*,*) a(99,15)とかどこまで記憶出来てるもんなんやろ?
606 :
2014/09/18(木) 21:41:43.06 ID:16BBiZdw
eclipseである程度長いサブルーチンも何十個か呼び出しているプログラムで
call systemが通らくなるのですがなにか原因ありますか?
ブラウザソフト立ち上げながらでもダメだったのでメモリがらみと思うのですが


ざっくりしすぎですいませんがなにかヒントあればおねがいします・・
607 :
2014/09/19(金) 00:43:16.70 ID:0+vn6Zlr
>>605
質問の意味が分からんよ???
Fortranじゃ宣言分はがっつり確保されとるよ。

>>606
タスクマネージャーとか ps コマンドとかでメモリーの使用状況を見てみたら?
call system が通らないのはメモリー満杯くさい。
608 :
2014/09/19(金) 01:31:53.81 ID:3dCDoxc8
>>607
ありがとうございました
ps alxで見るとrssがまさに満杯でいっぱいのようでした
cat /proc/meminfoで見るとフリーが10Gぐらい残っていて
大丈夫と思っていたのですが違いが分かっておらず
違いを勉強しようと思います
もしご存知でしたらまた教えていただけると幸いです
609 :
2014/09/19(金) 03:08:40.00 ID:f7fTMqdH
>>607
そうなの?
610 :
2014/09/19(金) 22:55:20.41 ID:0+vn6Zlr
>>608
http://tweeeety.hateblo.jp/entry/20140130/1391054452
色々まとめてあるみたい。
611 :
2014/09/20(土) 20:11:45.61 ID:onD5DKrz
>>610
ありがとうございます。べんきょうになりました。

メモリ節約のために可能な限りallocatableに変更したら余裕ができて解決しました。
個人利用のプログラムには必要ないと思っていましたが大事でした
ありがとうございました
612 :
2014/09/22(月) 04:03:57.88 ID:Huxb6fEK
配列a=/2,3,4,5,8,5,4......./みないなのがあったとして, 最大値の8すなわち,a(5)までをファイルに書き込みたいんだけど…

do i = 1, maxloc(a)
write(20,*) a(i)
Enddo
ではエラーになるよね。おそらくmaxloc(a)がrank 1 でdo loop にはrank 0 (スカラー値)じゃなきゃいかんってことなんだろう
配列をスカラー値に戻す関数ってないのかね?
613 :
2014/09/22(月) 08:08:38.00 ID:/rW2WBkU
配列は要素を指定すればスカラーになるだろ
614 :
2014/09/23(火) 00:55:12.38 ID:07zJk+Gd
>>612
次元を指定すればおk。1次元でもあえて1を指定すればスカラーで返してくれる。
do i = 1, maxloc(a, 1)
1要素配列を返す奴らに使える、基本的なテクニックですぞい。

改行要らなければ
write(20,*) a(:maxloc(a, 1))
で1行で済む。
615 :
2014/09/23(火) 02:10:29.02 ID:UZWdIj2A
>>614
いやぁ助かります。
ここは参考書に載ってないテクを知ってる方がたくさんいるからやめられない…

このようなテクって自分で見出すもの?それとも何か参考書みたいのってあるのですか?

あと、科学数値計算やってる方に聞きたいのですが、最適な刻み幅ってどう決定してますか?
対数刻みやらなんやらありますが、結局自己流やらなんやらでしっくりしたものに出会えず時間を無駄にしてる感たっぷりなんです
616 :
2014/09/23(火) 12:59:19.57 ID:07zJk+Gd
>>615
maxloc とかに dim 引数が入ったのは F95 以降で、
F90 時代は要素1個の配列を返されて誰もが窮していた。

Numerical Recipes の F90 版では、SUM(MAXLOC(a)) みたいな形でこの問題を
避けていたが、俺的にはこれは無いなって感じだった。(元々あんまいい本じゃなかったし)
仕方ないから律儀に要素1個の配列を宣言して使っていて、もう解決策はないと諦めていた。
なので f95 が出てからも、この方法に全く気付かずにいた。

ある日、他人のソース眺めていて、1次元配列なのに maxloc の類で dim
引数指定していたのがあって、こいつ馬鹿じゃねーのwwwと思ってよく見たら
このスカラー返しのテクニックだった。馬鹿なのは私でした。

たぶん10年以上無駄な1要素配列のプログラム書いていたwww
617 :
2014/09/26(金) 01:28:02.38 ID:sHXJvEEg
誰か>>612>>614の解説をしてもらえないでしょうか
まったく意味がわからない
618 :
2014/09/26(金) 02:38:03.65 ID:jeu5JnPX
>>617
配列 a(7) = (/ 2,3,4,5,8,5,4 )/ があるとする。
最大値の位置を返す組み込み関数 maxloc に a を渡すと maxloc(a) は
1次元で1要素の配列 (/5/) を返す。

これを左辺で取るには integer :: m(1) が必要。スカラー変数では受け取れない。
m = maxloc( a ) !ok  ; integer :: n ; n = maxloc(a) !error

要するに do i = 1, maxloc(a) は、do i = 1, m(:) と同じ意味になり文法エラーが出る。
>>612 の質問は、do i = 1, m(1) に当たる事を実行したいので、
配列をスカラー値に戻す方法はないか?と質問している。

それに対する>>614の答えは、maxloc( a, dim = 1 ) を使えと言っている。
これは配列の要素を返す。普通は多次元配列に対して用いて、行や列の成分を
取りだすのに使う。
619 :
2014/09/28(日) 02:23:58.55 ID:qwG5nd4I
>>618
1次元配列の特定の1つの値を返すのに、それは1次元の1要素の「配列」として返されるからdo文では使えないということですね。それが配列の次元(dimension)を1と言うと解決するあたりがしっくりきませんね・・・。
620 :
2014/09/28(日) 03:11:58.13 ID:W6jZi88T
>>619
多次元配列を maxloc に渡すと、最大値の座標を (/ 1, 2, 3 /) みたいな感じで
一次元配列で返す。 この成分を取り出すのが dim 引数。
1要素配列でも成分取り出せる。
まぁしっくりくるまで文法書を舐めるように読んでくれprpr
621 :
2014/10/08(水) 00:58:36.59 ID:9VdrGSON
x(100)があるとして、計算しているのになぜか例えばx(40)から値が0になってしまいます
考えられる原因ないでしょうか
無茶ぶりですいません
622 :
2014/10/08(水) 01:09:28.89 ID:fqHZeb8H
さすがに無理
もう少しヒントをくれ玉へ
623 :
2014/10/08(水) 07:15:04.02 ID:90i0u9P7
>>621
日本語になってない。
逝ってよし
624 :
2014/10/08(水) 08:00:58.16 ID:99q9svOz
今時逝ってよしとかねえよ
625 :
2014/10/08(水) 20:12:54.14 ID:9VdrGSON
>>622-623
ありがとうございます
確かにひどかったです・・すいません

ただ、症状がなんとも表現できていないので
もう少しうまく表現できるよう考えてみようと思います
626 :
2014/10/09(木) 00:38:44.90 ID:n00d9Wif
>>624
そんなこと言ったら今時fortran なんかねーよと言われるぞ。
そんなことないだろ?つまり逝ってよしもそんなことないのだ。
627 :
2014/10/09(木) 02:25:56.01 ID:FBZt25be
>>625
xが途中で変わってしまうなら

xの代入文や計算式が間違ってないか探す(特に範囲指定)
途中で変数を書き出し、変数の変化を追う
デバッガを使って変数に代入されるタイミングを調べる

くらいしか思い付かない
実は0になる計算をしていたなんてことはないよね
628 :
2014/10/10(金) 03:19:01.38 ID:OpKqoeIe
まぁ大方書き込んだつもりになっているが、ループが39までしか回ってないという
パターンだろう。
初期値に1e38とかNaNとか書いておけばいい。
629 :
2014/10/11(土) 16:00:47.58 ID:C1s+VS97
>逝ってよし
逝ってよし ってフレーズ最後に見たの何年前だろう?10年くらい前?
ちょっとクスッと来てしまった。

悪くないよ〜
630 :
2014/10/12(日) 11:19:06.43 ID:Zy5yf7AD
>>627
>>628
ありがとうございました
基本的なミスだろう、というご教示を参考に見なおしたところ解決しました
x(40)以降を計算するのに地味にyを使っていたのですが、
yを計算するサブルーチンをcallする前にxを計算するサブルーチンをcallしてしまっていただけでした・・
ズコーって感じかもしれませんが私としてはレスいただき大変助かりました
631 :
2014/10/12(日) 22:43:53.80 ID:q3BSJrqr
gfortranで
call system(cd ..)
とやっても上のディレクトリに移動できません。

他のコマンドは動くのですが…

これは仕様なのでしょうか?
632 :
2014/10/13(月) 20:38:43.03 ID:qvDo+/hC
>>631
systemからのcd実行なら仕様。
別のshellが起動してcdを実行して処理を終了するので、呼び出しもとのshellとは無関係。
GNUならディレクトリを変更したい場合はCHDIRが使える。
633 :
2014/10/13(月) 21:42:58.17 ID:BJqw9Buj
>>632
ありがとうございます。
if文でCHDIRに置き換えれば良さそうですね。
仕組みもわかりました。
634 :
2014/10/14(火) 10:25:49.65 ID:gGwwURe/
とか言って失敗しましたw CHDIRをつかうとshからpremission deniedと怒られます。

if (IPTCMD(1:3).eq.'cd ') then
DSTDIR=IPTCMD(4:)
call CHDIR(DSTDIR)
end if

のようなコードです。SELinuxのせいかと思いましたが違いました。
ご教示いただければ幸いです。
635 :
2014/10/14(火) 10:53:43.84 ID:gGwwURe/
追加すると、cdコマンドは成功しています。でも、

sh: 1: ..: Permission denied

と怒られますw
636 :
2014/10/17(金) 08:36:55.32 ID:/3IlFIL9
素朴な疑問なんですが
write( *,101) n
write(10,101) n

こういう式って一行にまとめられないんですか
637 :
2014/10/17(金) 14:01:54.72 ID:5NvG3gNF
>>636
write ... ; write ,,,
638 :
2014/10/18(土) 03:21:07.25 ID:1z7UQB1P
言い換えます
write( *,101) a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
write( 10,101) a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
write( 11,101) a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
みたいな文を一行でまとめたいのです

write(10,101) n
639 :
2014/10/18(土) 04:32:28.37 ID:pf8oYVZE
10,11だと外部ファイルか
それだと複数の装置番号に同時に出力する方法はない(0以上のスカラーでなければならない)

変数をまとめたいなら配列nにa-zを代入すればできる
640 :
2014/10/18(土) 06:08:15.41 ID:5RvmRbo5
>>638
出力するユニットが同じならサブルーチンでまとめれば良いんじゃない?
641 :
2014/10/18(土) 07:53:57.67 ID:py32Gd52
fortranからRを呼び出すようなことはできないでしょうか?
system call?からRを呼び出すぐらいしかないでしょうかね?
642 :
2014/10/18(土) 08:55:47.73 ID:XNaq3m/i
gnuplotでもそうだが
Rのソースをfortranで生成するようにして
system callから実行させればいいだろ
643 :
2014/10/18(土) 09:10:45.91 ID:XNaq3m/i
>>638
こんなのかな

iu(1:3) = (/6,10,11/)
do i=1,size(iu);
write(iu(i),101) ...
enddo
644 :
2014/10/18(土) 09:18:33.82 ID:XNaq3m/i
考えてみれば四行に増えたなwwwwwww
645 :
2014/10/19(日) 01:11:43.08 ID:66Dn4RCH
たしか coarray を使うとプロセスが複数走って、それぞれのプロセスで
別々にI/Oできるから形式上は1行でできるぞ。
まぁこれがやりたいことではないのは重々承知だがwww
646 :
2014/10/19(日) 13:24:38.74 ID:jrAJRFBN
>>642
サンクスです
ライブラリみたいのはないのかもしれませんね
647 :
2014/10/20(月) 00:32:03.39 ID:w06RwgSj
配列内の最大最小を、区間指定でできませんか?
maxだとできなかったんですが
648 :
2014/10/20(月) 01:10:20.17 ID:Q283dmtl
区間指定ってなんだよw 
maxlocのことか?それともmaxval(a(20:20))のことか?

他人に理解できる表現で頼むぜw
649 :
2014/10/21(火) 04:04:46.35 ID:dBWrLa1J
>>647
部分配列に代入して、maxを使うという意味?
650 :
デフォルトの名無しさん
2014/10/21(火) 08:48:40.55 ID:RmR2qSHy
>615
亀レスですが、最適な刻み幅については、

森口繁一『数値計算術』に
「題4章 刻み幅の自動調節」
という記述があります。
ご参考までに
651 :
2014/10/22(水) 21:06:47.85 ID:ZWb1Adxr
>>648
>>649
a(1:20)があったとして、10から20の間だけのaのmaxという意味で書きました
わかりづらくてすいません
652 :
2014/10/23(木) 00:20:38.34 ID:uxreCuFc
>>650
ありがとうございますm(__)m
さっそく買わせて頂きました。
まだ手元に届いてないですが、その章は結構ページ割かれてますか?
653 :
2014/10/23(木) 00:27:54.57 ID:ULvaqeb6
ならば MAXVAL(a(10:20)) だ。
654 :
2014/10/23(木) 08:52:15.53 ID:afuBwKUi
>652
p.195〜206
なおプログラムはpascalで書かれています
655 :
2014/10/23(木) 23:13:40.41 ID:lbc4SK47
>>653
できました!ありがとうございました
656 :
2014/10/24(金) 00:54:53.39 ID:vm5n6mmb
>>655
お安い御用さ。
おじさんに何でも聞いて呉れ玉へ!

>>652
ぼうず。
積分の自動刻み幅調節なら森正武の本に載ってるのがあるぞ。
岩波の77本にプログラムもある。
657 :
2014/10/24(金) 01:31:35.96 ID:IV+qiUp4
>>654
ありがとうございますm(__)m

>>656
有益な情報ありがとうございますm(__)m

お叱りを受けるかも知れませんが、指数関数が入った数値計算で手を焼いております

具体的には
exp(x)/(exp(x)-1)
といった関数を考え, 1から20000くらいまでの数値を出力したいのですが, 桁落ちしてNan やら Inf やら出て困っております.

定石としてはx を何かに規格化するのかな?とは思うのですが, x の範囲が1から20000と幅広くなかなか思いつきません.
何か妙案はございますでしょうか?
658 :
2014/10/24(金) 03:18:53.64 ID:vm5n6mmb
>>657
xが大きい方で計算したいなら通分して 1/(1-exp(-x)) の形で計算するのが定石だが、
どっちにしろ x=20〜30くらいでもう 1/1=1 でその先は無理に計算しなくてもいい。


この辺は数値計算術にいっぱい書いてある。
森口繁一の本は古いけど結構面白い。
数値計算術〜計算数学夜話<<数値計算工学の感じで真面目になる。

それにつけても蔵王のお釜が白濁液まみれというニュースが興味深いよね。
659 :
2014/10/28(火) 00:52:02.95 ID:UO1zyFOr
Fortran で realloc に相当することをやりたんだけど、どうしたらいいでしょうぁ。
660 :
2014/10/28(火) 03:20:58.44 ID:1iw7NGT6
>>659
宣言でallocatable
使う前にallocateで割り当て
大きさ変える前にdeallocateしてallocateで再割り当て
中身を確実に保存したかったらdeallocate前に別の変数にコピー
これで一応配列の大きさを変えれる
661 :
2014/10/28(火) 03:55:09.13 ID:2ZNKkFIp
Fortran2003なら move_alloc を使う。
alloctae(tmp(new_size))
new_size(1:size(array)) = array
call move_alloc(tmp, array)
move_alloc は番地(ポインタ)を写すだけなのでメモリー内容のコピーは1回で済む。

modern fortran explained 15.5.3 Transferring an allocation 参照
662 :
2014/10/29(水) 00:46:52.02 ID:RDb2D61y
ちょっとスレチかもしれませんが…
無限級数の和が1になるものうち、\Sigma^{\infty}_{0} (1/2)^n よりも収束速度がゆっくりなものって何かありますか?

刻み幅に使いたいんですが中々思いつかないですm(__)m
663 :
2014/10/29(水) 12:33:02.25 ID:HQN23iJw
質問がおかしいので、たぶん刻み幅っていうより問題設定が間違っている。
664 :
2014/10/30(木) 00:25:40.34 ID:BI8qle6I
>>663
つまりは足し上げて1に収束するような数列を知りたいんです。

(1/2)+(1/2)^2+(1/2)^3+(1/2)^4+.....+(1/2)^n->1 ですよね?

これだと収束スピードが速すぎるので、もう少し緩めに収束する数列を知りたいんです
665 :
2014/10/30(木) 22:03:37.99 ID:jLdY1ojF
intel fortran compilerが、非商用版があると聞いたんですけど
ホームページに行ってもありませんでした
もう非商用版は終了したんでしょうか
666 :
2014/10/30(木) 23:06:25.70 ID:BI8qle6I
>>665
ありますよ
667 :
2014/10/30(木) 23:08:34.49 ID:jLdY1ojF
>>666
自分の探し不足ですかね
よければURLおしえていただけませんか?
668 :
2014/10/30(木) 23:46:30.56 ID:BI8qle6I
>>667
ttp://pen.agbi.tsukuba.ac.jp/~RStiger/hiki2/?Fortran+(Intel+Parallel+Studio+XE)+%A4%CE%A5%A4%A5%F3%A5%B9%A5%C8

この辺参考にしましたよ(^^)
669 :
2014/10/31(金) 06:45:08.15 ID:vB//dhHV
非商用ページにたどり着く方法, 頻繁に変わって不便だよなあ
ライセンス登録して.licファイルなりシリアルコードなり持ってるなら直接DLするって手もあるが

ttp://registrationcenter-download.intel.com/akdlm/irc_nas/4584/parallel_studio_xe_2015.tgz
670 :
2014/10/31(金) 18:03:58.39 ID:NN74lK+x
>>668
>>669
無事ダウンロードできました。ご親切にありがとうございました。
671 :
2014/11/01(土) 22:28:08.66 ID:wAFS/Rlb
amazon ec2で計算してる人いる?
672 :
2014/11/02(日) 10:01:51.45 ID:P1O0Zm4b
>669
御呈示のアドレスはLinux版ですが、Windows版
について情報をおもちではないでしょうか
673 :
2014/11/02(日) 10:23:39.60 ID:Y+tjsjxk
>>672
無償版ってこと?Linuxのみ無償なんだよ
よく読めよ、カス
674 :
2014/11/02(日) 20:58:20.47 ID:r8jFoIGa
乞食か
675 :
2014/11/06(木) 01:07:08.08 ID:NBIHQ5C4
Linux版以外も学生非商用は無料だろ。
676 :
2014/11/06(木) 07:51:33.96 ID:lC8feXNL
>>675
嘘つくなよ、ゴミ屑
677 :
2014/11/16(日) 23:31:47.83 ID:jtA73LXf
2つの実測値の相関係数を出したいのですが、
fortranでできないでしょうか
実測値は単純な直線傾向ではないです
エクセルで手動でやることも考えたのですが、
実測値が100ケースほどあって、
今後も増えることを考えるとプログラムで作りたいと思いました
もしよければアドバイスいただけないでしょうか
678 :
2014/11/17(月) 09:46:48.96 ID:vGRlOVoS
>>677
Rを使用するのが一番手っ取り早いと思います。
Rを調べてみてあなたのやりたいことができそうなら、あえてプログラムを作る必要もないのでは。
679 :
2014/11/17(月) 13:53:58.07 ID:jwH5O+V+
>>678
Octave でもいいんじゃないの?
680 :
2014/11/17(月) 18:52:41.93 ID:yxNOhCMR
>>678,679
いろいろソフトがあるのですね。
調べて試してみようと思います。ありがとうございました。
681 :
2014/12/13(土) 01:43:27.96 ID:IhMrPb/B
Fortranで書かれている遺伝的アルゴリズムのライブラリが
手に入るところはないでしょうか
682 :
2014/12/13(土) 18:32:39.00 ID:ycSbkqQR
683 :
2014/12/15(月) 00:30:38.37 ID:+0+wnp46
MPICH または OPENMPI で Fortran2008 bindings を使う方法を教えろ下さい。
ドキュメントにはサポートと書いてあるが、インストールしても MPI_F08.MOD が
生成されない@Ubuntu

どうか助けろ下さい。こっちのスレへ行けという指示でもおk
684 :
2014/12/15(月) 19:55:14.30 ID:oICLvczS
ランダム生成のコードのについて質問です。
ifortではコンパイルできたのですが、gfortranではエラーが出ました。
以下がエラーメッセージです。

""$ gfortran routine.f90
routine.f90:32.25:

call random_seed( put = (/c * 999/) )
Error: Size of 'put' argument of 'random_seed' intrinsic at (1) too small (1/12)""

putの大きさが本質的に小さすぎる、や(=c とした時)本質的に配列である。といったメッセージだと思い、いじってみたのですが解決方法が分かりません。よろしくお願いします。

あと / ~ / のスラッシュの意味もよろしければお願いします。
685 :
2014/12/15(月) 20:47:21.21 ID:vJVAgy9L
試しにgfortran4.9でrandom_seed(size=i)(iはinteger)を実行したらi=12だった
つまりgfortranの場合はputの引数が大きさ12以上の1次元整数配列でなければならない
(/c*999/)は大きさ1の1次元配列で、その値がc*999という意味だからエラーになる
686 :
2014/12/15(月) 20:51:20.48 ID:waUBgqmC
>>682
ありがとうございます
ググれと言いながら教えていただいた優しさに感謝します
使わせていただきます
687 :
2014/12/15(月) 22:17:44.08 ID:oICLvczS
>>685
丁寧な説明ありがとうございます。

cを配列にすると上あるシステムクロックのcountの取得のところでエラーが出てと堂々めぐりをしてましたが、シードが12の配列でも要素一つ変えれば乱数にはなるということなんですね。

スラッシュが配列を表しているとは気づきませんでした。勉強になります。
688 :
2014/12/17(水) 02:40:01.63 ID:5R4Eyqcc
LU分解のサブルーチンが作れません(ToT)
サンプルがあったらください…
689 :
2014/12/17(水) 02:41:44.43 ID:5R4Eyqcc
>>688
検索して、それっぽいのが出てきたんですがメインプログラムに噛ませてもうまくいきませんでした…
690 :
2014/12/18(木) 08:43:35.24 ID:BU61zCPz
>>689
なら氏ね
691 :
デフォルトの名無しさん
2014/12/18(木) 14:54:41.87 ID:8HGauugM
MacOSX10.10.1, gfortran4.9にてコンパイル後、実行時に発生する下記のエラーの解決策はあるのでしょうか?

At line 68 of file test.f90 (unit = 1, file = 'parameter.txt')
Fortran runtime error: Cannot match namelist object name 44

namelistの不一致は見当たらず、Windows7, g95では正常に動作しました。
692 :
2014/12/18(木) 23:40:19.37 ID:jd6kmeGe
計算流体力学を習い初めの学生なんですが、Radeonでfortranの計算をする場合にはどのソフトをインストールすればいいのでしょうか?
MinGW Command PromptとTDM-GCC-64というのを使っています。
出来ればインストール方法が書かれたページも一緒に知りたいです。
693 :
2014/12/19(金) 20:10:17.60 ID:nJn0njjQ
open文で開いたcsvファイルをread(51,*)〜〜などで
読み込む操作が何回かある場合、
並列化はできたりしないでしょうか
読み書きはやっぱり並列化は無理でしょうか
694 :
2014/12/20(土) 11:31:57.54 ID:9/Q8xBDD
『if … else if … end if』と『select case …』はどっちが速いのか,ふと思って計測してみた.
cygwin gcc 4.8.3@core-i5で繰り返し計測してみたけど,時間差はばらつきの範囲内で有意な差はなさそうな感じ.
二つの構文ともCPU時間同じ,機能も同じで,いまいち,使い分け方が分からないんだよねぇ...

使ったコードはこれ↓
module mod_util
implicit none
integer(kind=4) :: t1, t2, t_rate, t_max, t_diff
contains
real(8) function elapsedTime()
implicit none
call SYSTEM_CLOCK(t2, t_rate, t_max)
if ( t2 < t1 ) then
t_diff = t_max - t1 + t2
else
t_diff = t2 - t1
endif
elapsedTime = t_diff/real(t_rate)
end function elapsedTime
end module mod_util
695 :
2014/12/20(土) 11:33:00.40 ID:9/Q8xBDD
program testSelectIf
use mod_util, only : t1, elapsedTime
implicit none
real (kind=8) :: randX
integer(kind=4) :: i, j, randI
#ifdef ifelse
write(*,'("# if ... else if ... ")')
#else
write(*,'("# select case")')
#endif
call init_randomSeed(972384)
call SYSTEM_CLOCK(t1)
do i = 1, 100000000
call random_number(randX)
randI = int( randX * 10, kind=4 )
#ifdef ifelse
if ( randI == 1 ) then; j = j + 1
else if ( randI == 2 ) then; j = j - 2
else if ( randI == 3 ) then; j = j + 3
else if ( randI == 4 ) then; j = j - 4
else if ( randI == 5 ) then; j = j + 5
else if ( randI == 6 ) then; j = j - 6
else if ( randI == 7 ) then; j = j + 7
else if ( randI == 8 ) then; j = j - 8
else if ( randI == 9 ) then; j = j + 9
else if ( randI ==10 ) then; j = j - 10
696 :
2014/12/20(土) 11:33:45.85 ID:9/Q8xBDD
end if
#else
select case (randI)
case ( 1 ); j = j + 1
case ( 2 ); j = j - 2
case ( 3 ); j = j + 3
case ( 4 ); j = j - 4
case ( 5 ); j = j + 5
case ( 6 ); j = j - 6
case ( 7 ); j = j + 7
case ( 8 ); j = j - 8
case ( 9 ); j = j + 9
case ( 10 ); j = j - 10
end select
#endif
end do
write(*,'("j=",I0)') j
write(*,'("#time:", F10.3)') elapsedTime()
end program testSelectIf
697 :
2014/12/21(日) 02:39:49.62 ID:+T8Tju2f
>>693
I/O中に計算とかしたいという意味での並列化なら、F2003でasynchronous I/Oが出来る
ようになった。同じファイルの別々の位置のデータを並列に読み出したいという意味なら
そもそもハードウェア的に無理だろう。

>>694
最適化の問題というより、計算型GOTOの後継機能といったものではないか?
構造化プログラミングがホットだった時代は、GOTO 文を追放するための基本構造
のひとつとされていた気がする。

CASE文の中に入るのが、整数型、文字型、論理型のように離散値をとる場合に
限られるので、IF..ELSE IFの連鎖との使い分けは、比較で=が意味を持つ型か
或いは実数型などのように=があったとしても基本的に<、>的な大小比較しか
意味を持たない場合を、意識して明示的に区別していますよというアピールではないか。
698 :
2014/12/22(月) 19:17:39.41 ID:mnW7xu7L
>>697

明快なお答えありがとうございます.
これまでうっすらと使い分けルールの必要性を感じながらも,
「きっとこれで良いよね?良いんだよね?」と恐る恐る使い分けていました.少し安心しました.
699 :
2014/12/22(月) 21:51:51.17 ID:KCseyMpL
>>697
ありがとうございます
やりたかったことはcsvファイルがいくつかあり、
それを順番に読み込みreadするdoループを並列化できないかなということでした

教えていただいた後者の方にあたりそうな気がしまして、
勉強になりました。
700 :
2014/12/23(火) 16:29:15.14 ID:gTJoh1O6
永らくFORTRAN77で飯を食ってたのですが,より新しいFORTRANへ移行してみたくなりました
なにか良書はありましょうか?

職業プログラマで社内で請負で流体や構造体のメッシャーを組んでます
まあ,ベースのプログラムも77,新規も77縛りの事が多いので特に困ってはないのです
しかし,昔,汎用機世代の6しか書けないような先輩方を古臭いと笑っていたのですが自分もそんな年になってしまい
後輩らに笑われたくないので,ちょっと勉強しておきたいと考えています

世の90の初心本(それ以降は書店でも見ないなー)等は基本的な制御構文等が厚く書かれており
ホントに身に着けたい新たな概念のintent等がおざなりになってしまっています
古臭い77書きに光を......
#C++もやってるのでクラスの概念なんかも問題はありません
701 :
2014/12/23(火) 16:43:41.88 ID:AyCexUV4
日本語の書籍に関しては仰る通りで、特に2003以降は全くないはず
まずはnagのサイトにあるFortran入門とFortran 2003入門が無難かと
ただ、これらは規格を網羅してるわけではないので
完全な仕様を知りたい場合はコンパイラのマニュアルや
JIS規格(JIS X 3001-1:2009)も参照する必要あり
702 :
2014/12/23(火) 20:48:23.28 ID:gTJoh1O6
>694

selectは単一の変数でしか使えないよ
selectはどうかするとジャンプテーブルで一発の比較で処理してくれる可能性が高い
最近のコンパイラはelseifでもそうするとか聞くけど,どうだろうね?
elseifは良く引っかかるのを前に持って来て早めに引っ掛ける事ができるとかも聞くねー

個人的には,読みやすさを優先するなー

#Cのswitchの議論と同じなので探してみると良いよ
703 :
2014/12/23(火) 20:51:07.24 ID:gTJoh1O6
ありがとうございます
まずはサイトのそれらを読んでみます

その後は......JISかー,読みやすさを優先してくれないからなー
コンパイラのマニュアルは殆ど英語になるのが悲しい
704 :
2014/12/23(火) 23:30:23.88 ID:pDBo2/8d
>700,703
Fortran90の日本語の解説本で良いなら、
 bit別冊 詳解Fortran90 1993年12月号別冊 共立出版
という本があります。これは『Fortran90 Explained』の日本語訳です。
但し、雑誌の別冊ということもあり入手は極めて困難でしょう。
あるとすれば、理工系の大学図書館が一番可能性が高いと思います。
参考までにどうぞ。
705 :
2014/12/29(月) 01:02:13.12 ID:hjLOuT9S
Fortranを使われている方は他にはどんな言語を扱っているのですか?
pythonとかでしょうか
706 :
2014/12/29(月) 09:04:30.59 ID:6EMRS7hN
>>705
perl
707 :
2015/01/04(日) 14:13:23.64 ID:OaA6oEKz
>>700
おいらもFORTRAN77使いなんで、小文字のプログラムに違和感ありまくり
708 :
2015/01/04(日) 16:56:46.08 ID:Ydg+fj8+
>>707
こっちはfortran90からの新参なんで、77のソース見ると大文字、goto文ありでなかなか新鮮です。

ところでfortran2003の機能すべてカバーしてるコンパイラは商用しかないのかな。
gfortran使いなんでカナピー(´・_・`)
709 :
2015/01/04(日) 20:02:59.44 ID:1HVLEOms
商用だけですな
しかし商用Fortranコンパイラは趣味で買うには高すぎるので
gfortranが対応してる範囲で書いてます
710 :
2015/01/04(日) 23:43:36.28 ID:YPIAtxeL
>>708
Linuxならifortのnon-commercial板、MacならFreePGIがあるけど
Windowsは無いみたいだね。
711 :
2015/01/04(日) 23:48:08.93 ID:YPIAtxeL
>>710
変換ミス
(誤)non-commercial板
(正)non-commercial版

gfortranの2003フルサポートは何時になるのやら。
712 :
2015/01/05(月) 11:27:48.33 ID:dcVDuqIP
>>710
勉強用なら
VirtualBox(個人使用は無料だったハズ) + Ubuntu日本語Remix仮想ハードディスクイメージ
で、とりあえずLinux環境作っちゃうのも手なんかね

…もちろん、LinuxやBSDに詳しい人にはこの構成では不満が出てくるだろうが
(特にUbuntuの標準GUI、嫌いな人結構多いしな)
知らん人がサクッとUnix系の環境作るには楽だと思った
713 :
2015/01/05(月) 12:04:08.73 ID:IJbwWfwV
>>712
>VirtualBox(個人使用は無料だったハズ) + Ubuntu日本語Remix仮想ハードディスクイメージ
>で、とりあえずLinux環境作っちゃうのも手なんかね

Fortranの勉強のためならこれが正解だと思う。わざわざLinux用の領域をハードディスク上に
確保して…というのは面倒だしね。自分も次は仮想マシンを使うと思う。
UbuntuのGUIが気に入らない場合は、VirtualBoxにインストールできるか知らないけれど、
RHELクローンやOpenSUSEもあることだし。
714 :
2015/01/05(月) 12:13:27.17 ID:K2pJxzU2
VirtualBoxに入れるLinuxなんて、GUI抜きで容量減らしてインストールして
sshでもっと使い易い端末エミュレーターから操作するのが普通じゃないか
715 :
2015/01/05(月) 12:35:46.63 ID:dcVDuqIP
>>714
もちろんそれが理想的だし、解ってりゃ大したことないんだけどね
716 :
2015/01/07(水) 02:53:13.20 ID:2xplb8o3
でも最近の Linux intel fortran も windows と同じ GUI でインストールできる
ようになってるし〜 楽ちんしたいのよ〜
717 :
2015/01/09(金) 00:18:45.90 ID:osa1YwUn
ifortやgfortranのオプションについて教えてください.

Makefileを書くとき,コンパイルオプションやリンクオプションをCFLAGSとLDFLAGSに分けて書くのが一般的みたいですが,
Intel Fortranコンパイラのユーザー・リファレンス・ガイドやgfortran/gccのマニュアルを読んでも,
どのオプションがコンパイルオプションで,どれがリンクオプションか明記されていませんよね?

コンパイラとリンカに与えるべきオプションは,それぞれ,どうやって見分けたら良いんでしょうか?
718 :
2015/01/16(金) 00:14:55.27 ID:ZBkPwkB6
intel fortranの非商用版終了したっぽいな
719 :
2015/01/16(金) 07:28:02.50 ID:zC22PbLh
>>718
は?
ソースは?
720 :
2015/01/16(金) 10:37:10.07 ID:gldaWoEV
>>719
intelのdeveloper zoneで明言してるよ
https://software.intel.com/en-us/forums/topic/533638
721 :
2015/01/16(金) 11:08:31.95 ID:pdIo+qaj
>>720
ありがとうm(__)m
722 :
2015/01/20(火) 00:53:26.59 ID:jj5OmV/0
薄汚い乞食が多すぎたんだな
723 :
2015/01/20(火) 02:58:09.86 ID:jVCDWxyp
>>722
確かに研究用途で無償版使われているって書いてるな
724 :
デフォルトの名無しさん
2015/01/20(火) 16:42:37.43 ID:kWeIi6xm
すみません。本読んだりGoogle等で調べましたが、いまいちわからなかったので質問させてください。
result.datというデータの中にある本来17行21列で表示するデータが
#(A,B)

(1,0)
  ・
  ・
  ・
(17,0)
(0,1)
  ・
  ・
  ・
(17,1)
(0,2)
  ・
  ・
 ・
(17,2)
 ・
 ・
  ・
(17,20)
というように1列で表示されているデータがあります。
openを使ってこれを読み込んで本来の17行21列の形にして別のデータとして出力したいのですが、
どなたか知恵をお貸しいただけませんか?またできればデータの(A,B)のAの部分だけ、Bの部分だけを取り出したいのですが、
どうすればよいのでしょうか?
725 :
2015/01/20(火) 17:17:10.54 ID:zoNsgUGG
>>724
過去レスヨメカス
726 :
2015/01/20(火) 17:19:19.79 ID:mCR0Xk39
>>725
ソウイワナイデオシエロヨ
727 :
デフォルトの名無しさん
2015/01/20(火) 17:39:47.89 ID:kWeIi6xm
>>725

すみません。過去すれにあるのですか?
ざっとしか見てなかったので気づいてませんでした。
もう一度探してみます。
728 :
2015/01/24(土) 14:38:14.65 ID:vOXkay9k
cosやexpとかの組み込み関数が学校のifortだと通るんだけど家のgfortranだと通らない助けて
no implicit typeって言われる
729 :
2015/01/24(土) 16:14:31.36 ID:YsJc5wwN
>>728
その関数に渡す実引数の宣言で処理系依存の型パラメータを使っているとか?
ソースを晒せば適切な助言を受けられると思う。
730 :
2015/01/24(土) 17:04:25.97 ID:vOXkay9k
4倍精度から倍精度にしたら実行できました
gcc4.6以降は4倍もサポートしてるそうなんですがおかしいですね…
ありがとうございました
731 :
2015/01/25(日) 14:22:03.88 ID:mPYFAplZ
>728

fortran 4.8.1

program test

real(16) :: D2R

D2R = 0.0174532925199432957692369076848861271344_16

write(*, *) '1/e= ',1/exp(1.0_16)
write(*,*) 'cos(30)= ',cos(30.0*D2R)

end program test
を実行すると
1/e= 0.367879441171442321595523770161460873
cos(30)= 0.866025403784438646763723170752936161
という答えが得られます
少なくとも30桁以上の精度がでているとおもいますが、
732 :
2015/01/25(日) 14:24:04.46 ID:mPYFAplZ
>731

>fortran 4.8.1

gfortran 4.8.1

のtypoです。しつれいしました。
733 :
2015/01/27(火) 15:08:58.38 ID:TDQ9+ev7
>>730
もう解決しているかも知れないけれど、処理系がFortran2008と4倍精度をサポートしていれば
iso_fortran_envモジュールのreal128という定数を使う言語仕様に準拠した方法がある。

program qfloat

use iso_fortran_env
implicit none

real(kind = real128) :: q

q = 1 / exp(1.0_real128)
print *, q

end program qfloat
734 :
デフォルトの名無しさん
2015/01/30(金) 19:29:21.36 ID:CPtXDESF
超初心者です。質問させていただきます。
forrtl:severe(24): end-of-file during read,unit 110,file C:tkshmd\www01.dat
というエラーが出たのですがどうすれば解決できますか?

教授から卒業研究用に渡されたもので、自分で書いたものではありません
11年前に卒業した先輩が書いたものらしいのです

fortranに関する知識は一切ございません。すみません
735 :
2015/01/30(金) 19:35:01.91 ID:QUUDxgkN
>>734
どんな環境なのか、OSとコンパイラくらい書こうよ。
エラーメッセージによるとwww01.datの途中に
ファイルの終端を表すend-of-fileが挿入されているっぽいが。
736 :
2015/01/30(金) 20:02:06.39 ID:JnK0Au4d
>>734
データの読み込み中にEOFが来た
つまり、読み込む変数に対してファイルのデータ数が足りない

先ずは実行できるデータファイルを貰って
自分の環境でプログラムが動くことを確認したら?
自分の計算はその実行できるファイルをいじってする

何より教授に聞けよ
737 :
2015/01/30(金) 20:49:39.27 ID:ExkW5Q4r
>>734
736で解決すると思ったけど
フォルダアドレス名、もしかして名前の母音抜き?
違ったらごめんね
もしそうだったとしたら、今後フォルダ名の投稿の時とか気をつけてね
私、昔似たようなことやっちゃったので。

関係ないが気になったのでつい
738 :
2015/02/04(水) 05:53:12.64 ID:Y9ZHS9LP
ちょいとみなさんのお知恵拝借させてもらえたら幸い。

二分法かなんか使ってイテレーションさせようかと思ってるんだけど、ある解に収束するまでの途中のデータが出力ファイルに書き込まれて困ってる。

収束した時のみの結果を出力させたいんだけどどうしたもんだろ?

すごく簡略化した例だけど

do i = 1, imax
....
! F(x(i),y(i),z(i)) は非線形で数値計算でその都度計算するしかない
F(x(i),y(i),z(i))= .........

write(15,*) x(i),y(i),z(i)

! イテレーションする部分
If(s(x(i),y(i),z(i)) < 1.0d-5) then
Exit
Else
....
Endif
Enddo
739 :
2015/02/04(水) 05:54:22.46 ID:Y9ZHS9LP
連投すんません
S(x(i),y(i),z(i))は新しい関数ですm(__)m

よろしくお願い申し上げます。
740 :
2015/02/04(水) 21:13:09.14 ID:uLg2ampX
>>738
収束ループを出てから、書いたら?
741 :
2015/02/04(水) 21:21:39.45 ID:1jln5owW
求めた解はどこかで使うんでしょ?なら,使う直前にwrite文を書けばいいのではないか?

というか,
>二分法かなんか
『なんか』ってなんだ?そんなきき方でどう答えろというんだろうか?
その例の書き方だと,そもそも二分法の使い方を理解しているのかと,そっちの方が心配になる.
742 :
2015/02/10(火) 07:40:57.77 ID:dNNycAes
>>741
すまん!書き方悪かった。
「なんか」と書いたのは二分法等イテレーションする場合と言いたかった。
743 :
デフォルトの名無しさん
2015/02/11(水) 01:54:42.49 ID:rsWy3Hp4
debugをしたら
user breakpoint called from code at 0x7c94120e
と出てきたのですが、どういった意味なんでしょうか
744 :
2015/02/11(水) 02:18:15.77 ID:947xRA4B
環境書こうよ……
まず、>>1の注意事項を読んでくれ
745 :
2015/02/11(水) 02:35:40.04 ID:+/9jIDfQ
>>743
回線切って逝ってよし
746 :
2015/02/11(水) 10:40:19.88 ID:I3RcppAe
>>743
デバッガがプログラムを呼び出して実行してブレークポイントに到達して止まった
つまり意図通り
ブレークポイントを誰がどうやって設置したかは環境次第
747 :
2015/02/11(水) 22:51:10.13 ID:pX2dRfIb
コンパイラはどれを使っていますか?
748 :
2015/02/11(水) 23:16:27.84 ID:LIuSSWm5
g95
749 :
2015/02/15(日) 01:10:05.40 ID:g8pHAe2n
Rの関数(cor(x,y)など)をFortranプログラム上で使えるようにできないでしょうか
Rに入っている関数のsoファイルを利用してなどできたりしないでしょうか
750 :
デフォルトの名無しさん
2015/02/15(日) 13:38:58.18 ID:TAercYgC
>>749 あなたは Fortran ではなく R を使うべきなのではないのでしょうか
751 :
2015/02/15(日) 14:45:03.59 ID:83OS2d7V
Rがコマンドから使えるなら普通にSYSTEMすればいいんじゃないの
752 :
2015/02/15(日) 22:02:11.88 ID:g8pHAe2n
>>750-751
事情がありFortranで組む必要があったので仕方なく・・
ありがとうざいました
753 :
2015/02/15(日) 22:03:52.96 ID:/BGdl65O
そもそもFORTRANにはRなんか手も足もでないような統計ライブラリが存在するはずだが
754 :
2015/02/16(月) 00:11:19.19 ID:cFBQlJ5l
>>753
IMSLかMKLの統計サマリーですかね?
使いたいのは比較的新しめの統計量で、
そこには用意されていないけどRにはあったので・・
755 :
2015/02/16(月) 04:49:19.07 ID:OLD7Gvb9
相関係数求めるだけだろ?
http://tama.green.gifu-u.ac.jp/~tama/soft/sample_prog/correlation/
756 :
2015/02/19(木) 01:32:20.14 ID:Q9g/vdpG
今更ながらなんだがフォートランとオクターブの組み合わせ最高だよな。
今まではfortran とgnuplot だったけど
757 :
2015/02/19(木) 21:39:16.47 ID:8T3EPm25
お絵かきできんの?
758 :
2015/02/21(土) 13:41:52.59 ID:cqnG5WW8
オクターブってMATLABのパチモンだっけ?
最近もメンテされてるの?
759 :
2015/02/21(土) 20:21:39.11 ID:vWiUl97q
>>757
余裕でお絵描きできるよ。
お絵描き機能は gnuplot のを踏襲してるぽ

>>758
まだまだ現役
760 :
2015/02/22(日) 06:07:07.89 ID:Dll6CUOh
お絵かきとは2chのお絵かき機能のこと。
この板はできないのか?
761 :
2015/02/24(火) 12:10:45.71 ID:dL6o6kyB
3/3から2chのapi始動するけど移住しなくても大丈夫かね
とりあえずdat廃止されるまではここはNavi2chで巡回するけど
762 :
2015/02/25(水) 18:07:19.77 ID:q//8/n6w
>>761
移住先の候補があるなら教えて欲しい。
763 :
2015/02/27(金) 19:13:57.57 ID:8CupuJ11
とりあえずおーぷん2chにたてるだけたてといた
http://toro.open☆2ch.net/test/read.cgi/tech/1425031440/
(☆はNGワード対策)
何事もないことが一番だけどそんときは避難所代わりに使ってください 現に今人多杉状態だけど
ここ質問スレだけど他にfortranスレないしfortran全般に関する喋り場ならおーぷんでいいよね?転載嫌いとかアフィリエイト嫌いとかのひとがいたらすまんが

純粋な質問に関してはstackoverflow日本語版も始まったしそっちも賑わってほしいなあと思ってる(現在3件しかない)
本家stackoverflowの方はfortranに関してもかなりお世話になってるし
764 :
2015/02/28(土) 14:09:46.29 ID:fZ9CqkAf
お若い方。
この世間に疎い爺に何が起きているのか3行くらいで教えてくれんかね?
カチュ〜シャが使えなくなってから専ブラともお別れじゃよアッハッハ

2chがたらこのものでなくなったらしい話は風のうわさに聞いたども、
移住とは何のことじゃね?
765 :
2015/02/28(土) 14:12:07.22 ID:ptkFuNoe
>>763
おーぷん2chは知らなかった。何かあればそちらを使わせてもらいます。
stackoverflowの方はgoogleでの検索がヒットした時ぐらいしか行かなかったけれど、
日本語版はありがたいね。こちらも覗きに行きます。
766 :
2015/02/28(土) 14:20:37.08 ID:ptkFuNoe
>>764
私もよく知らないが、現在の専ブラが使っているdatが廃止される。2chを専ブラで利用するためには
2chが提供するAPIが必須となるが、このAPIは2chから使用許諾を受ける必要がある。
よって今のようなオープンソースの専ブラの開発、提供は難しいようだ。
767 :
2015/03/09(月) 22:22:14.04 ID:XrkMx/p/
>>492
私も見たいと思ったのですが…
該当章はなくなってしまったようですね.
(もう8か月以上だから仕方ないか)
768 :
2015/03/09(月) 22:37:50.67 ID:wBxXg+k6
おいおいTip集に分離されただけで記事は残ってるぞ
nagのトップページから見てみ
769 :
2015/03/10(火) 23:05:49.08 ID:Gi5LttGt
Hey!Yo!Brother!

Fortran2003でOOPを勉強してみたいんだが、NAGしか入門する門は無いのかい?
ジーザスは狭き門より入れと言ったが、おじちゃんは滅びの道でもいいから
広き門から入って太い道を通りたいんだYo!

できればジーザスの言葉と同じアラム語かおじちゃんと同じ言葉の日本語で頼むよ!
敵性語はノンノン!
770 :
2015/03/17(火) 02:57:32.45 ID:qWCLUX9n
>>784
ああ、それは腹立つな
Fortran Graphic、Fortran OpenGLで検索するとそこそこ出てくる
けど、まともにメンテナンスされてるのが無さげでもある……
771 :
2015/03/21(土) 20:51:39.73 ID:A7bsOdex
プログラム中のx行目?y行目のソースコードを出力させるwrite文の書き方はないでしょうか
772 :
2015/03/22(日) 10:00:02.71 ID:upANbGQj
>>771
ねーよ
773 :
2015/03/22(日) 14:18:33.06 ID:qEVJABmn
>>771
プログラム単体では無理
単純に任意のファイルのx行目を表示するプログラムなら簡単
指定行まで読み飛ばして、指定行を十分長い文字列で読み込めば良い
それでソースファイルを読んで表示するならできるけど
ソースファイルは常に必要
774 :
2015/03/22(日) 15:16:23.54 ID:lBBw+fHF
Quineが書きたいという話ではなくて?
775 :
2015/03/22(日) 16:35:49.10 ID:CWUz6yZb
>>773
なるほどopenして目的行寸前まで空readしてread×行数すればいいということですね
解決できそうです。ありがとうございました
>>774
初めて聞きました。勉強になりました
776 :
2015/03/24(火) 21:45:10.36 ID:Vm8bqf+W
>>775
俺にもお礼言えよ、クソ野郎
777 :
2015/03/26(木) 23:15:58.87 ID:Gl+r/2fs
3次元のスカラーデータを吐く、x,y,zのdoループをompにしようとしたんだけど、スタックオーバーフローだなんて怒られた

どーすんべ?
778 :
2015/03/27(金) 02:28:15.56 ID:agfznfe3
安直にはコンパイラ、リンカのオプションでスタック増やせ。
779 :
デフォルトの名無しさん
2015/04/28(火) 17:28:05.66 ID:iBflpoE2
MinGWのGCC4.9.2ののFORTRANで, -fcase-upperのようなオプションってありますかね?
昔のバージョンにはあったみたいなんですが, 現在のは削除されたようで.
780 :
2015/05/10(日) 17:08:53.50 ID:xJAFgSar
Intel fortran無料版のライセンスが改定されて
オープンソースへの貢献を証明しなきゃならなくなってた
https://software.intel.com/en-us/qualify-for-free-software/opensourcecontributor
781 :
2015/05/11(月) 01:08:44.47 ID:54EXtOYg
Gfortran とIntel fortran のそれぞれの利点って何かね( ´ ▽ ` )ノ
782 :
2015/05/11(月) 01:47:31.11 ID:XHL5HbZn
え、gfortranに利点なんかあるの?
ああ、うん、gccツールチェインの一部なのは便利だよね
783 :
2015/05/11(月) 06:54:00.10 ID:qOqdHGiK
ハードウェアで二倍の性能出す金払うくらいだったら、Intelのコンパイラ買えよ。
ソフトには金出せないってどんだけ唯物論のアカなんだよw
784 :
2015/05/11(月) 10:33:22.97 ID:54EXtOYg
>>782
なに、そんなレベル違いますのん?
785 :
2015/05/13(水) 06:59:19.62 ID:5ad/p9/H
>>784
10年くらい前は差は歴然としてました。
最近はどうなのでしょうね?
786 :
2015/05/15(金) 02:52:46.16 ID:3VlILQzP
intelは自動並列化があるから中級者は使用を薦める
787 :
2015/05/31(日) 00:46:49.58 ID:z6xjuO2m
このレス数からしてFortran使ってる人はほとんどいないのかな?
788 :
2015/05/31(日) 01:15:28.56 ID:dBkTICLM
ここでの質問は学生がほとんどのように見える
一般人は使わないだろうから少ないのは確かだろうけど
調べたり相談できる人が多いんじゃない?
789 :
2015/05/31(日) 05:24:16.45 ID:z6xjuO2m
>>788
なるほど
じゃあ私遠慮無く質問しまくっちゃっおうかな
790 :
2015/06/05(金) 00:40:30.28 ID:rgF7y0m6
fortran の組み込み関数でminval ってのがありますよね.
ある配列a(要素は一つだけ)に関して
minval(a,dim=1,mask=a>0.0d0)すると値が1e-324みたく値がおかしくなるんですが原因として考えられるものは何でしょう?
ちなみに配列aの中身は
a(1)= 4.2e-2です。
なので期待する値は
minval(a,dim=1,mask=a>0.0d0)=4.2e-2になるはずなんですが。。。
791 :
2015/06/05(金) 01:52:18.65 ID:rTO63fPn
>>790
なんとなく初期化してない変数が引っかかっている気がする
minvalの動作不良を疑うならコンパイラとか環境を書こう
違うならソースをできるだけ書こう
長くてソース貼れないならこんな感じに晒すと検証が楽
https://ideone.com/JstGnQ
792 :
2015/06/05(金) 23:13:40.04 ID:zCKBsI7m
>>790
単精度を入れているのに倍精度で値が返ってきているのが気になる。
なんか倍精度と単精度をまぜこぜにしているか、コンパイラが間違っていてまぜこぜにしている。

g95はデフォの変数長を変えたせいで混乱に陥った。その辺かな?
FortranはRealとIntegerの長さが等しくないといけないのにそれを崩した。
まぁ64Bit時代には8バイト整数にしたいのはわかるけど、
そうなると倍精度がRealになって、倍精度が4倍精度になってハードウェア対応せずで憤死する。


https://ideone.com/m11vQN

こんな感じかな?
program test2ch
implicit none
real(8) :: a(1)
real :: b(2)
equivalence(a, b)
b(1) = 4.2e-2
b(2) = 0.0e0
print *, minval(a, dim = 1, mask = a > 0.0)
end program test2ch
実行結果
5.070575254129006E-315
793 :
2015/06/06(土) 00:34:55.86 ID:TK6bZDgw
>>792
ideoneってfortranいけるのかw
794 :
2015/06/06(土) 01:24:14.49 ID:pgwiShP2
変数に値が入ってるかどうかの判断ってどうしてる?ポインタとか使わずになんかNull かどうか?っての判断できんのかね?
ちなみにgfortran 4.2 でDebian 8.0 64bit版での話なんだが。
795 :
2015/06/06(土) 02:41:06.93 ID:cFX9ZRwg
>>794 ??
ASSOCIATED とか ALLOCATED じゃダメなのか?
普通の変数の場合はどうしようもないよな。
796 :
2015/06/06(土) 05:09:32.95 ID:pgwiShP2
>>795
>>794 ??
>ASSOCIATED とか ALLOCATED じゃダメなのか?
配列やらポインタ使えってこと?

>普通の変数の場合はどうしようもないよな。
やはりそうなのかね?値がない場合をやって見たら、0.00000って表示されたのには吹いた
797 :
2015/06/06(土) 12:21:31.78 ID:cFX9ZRwg
>>796
変数について何か勘違いしてないか???

ただどうしてもというなら、F2003ならスカラーのALLOCTABLEというのがあるので
それを使えばいい。
798 :
2015/06/06(土) 19:54:52.83 ID:pgwiShP2
>>797
多分何か勘違いしてるかも。
俺の意識では、変数という箱に計算された数値データが格納されるってイメージなんだよなぁ。
799 :
デフォルトの名無しさん
2015/06/09(火) 15:20:38.21 ID:t89alswU
まったくの初心者なのですが質問失礼します
f77形式で書かれたプログラムをf90形式に変換した所plplotという描画用プログラムがエラーだらけで動きません
具体的には、「関数plwid に対する定義されてない参照です」のようなメッセージがいっぱいでてきます
どうしたらよいのか教えていただけませんか?お願いします
800 :
デフォルトの名無しさん
2015/06/09(火) 18:47:39.82 ID:t89alswU
>>791すみません補足します
OSはLinux beanでコンパイラはgfortranです
801 :
2015/06/09(火) 20:02:28.27 ID:PG87IvKa
>>799
もとのプログラムはf77で正常にコンパイルできてるの?
gfortranでそのままいけるやろ
802 :
2015/06/14(日) 00:09:43.12 ID:1ASDFy3f
Fortran未だに使ってる人いますか?
やっぱり昔に構築しちゃった遺産をそのまま使う方ばかりですか?
803 :
2015/06/14(日) 00:15:12.75 ID:oyhhJPji
天文学の計算で有効数字が16桁以上で計算したいものが
あり、C/C++では桁数の関係で微妙なので、Fortran
の4倍長精度を使って計算しています。
64ビットあるいは80ビットでなくて128ビット
で計算できるのが有りがたいです。
804 :
2015/06/14(日) 02:42:35.24 ID:1ASDFy3f
>>803
なるほどご丁寧にありがとうございます
そういった分野があるんだと勉強になりました
805 :
2015/06/14(日) 16:29:35.57 ID:oyhhJPji
>>803
補足します。
NASAが太陽・月・冥王星を含む惑星の位置を計算
するための基礎データを発表しているのですが、
そのデータがたとえば
0.149597870691000015+09
という有効数字18桁で当れられて
います。
この一定間隔で与えられたデータを数値積分して
位置を計算する必要があります。
C++などのlong doubleでは、有効数字が16桁程度
なので、fortranの4倍長kind(16)を指定すると、
三角関数も4倍精度で計算でき、安心できるわけです。
806 :
2015/06/17(水) 10:18:52.06 ID:ti+IkGPz
ソフトウェアに興味なくて、ほとんどプログラムやったことない学生が、
専門分野の研究に必要になってから勉強を始めて、曲りなりに必要なプログラム
書けるようになるのが早いのはやっぱFortranだな。

余計なことを覚えなくていいし、行列の添え字とかが(1から始まる、カラムメジャー等)、
教科書・文献などの数学の常識に近い点が良いらしい。
式とプログラムで表記が同じである必要は全くないが、
ある程度は形式を保っていないと焦点がボケてダメなようだ。

ソフトウェアの板でいうと叱られるかもしれないが、
時間かけるならプログラム言語の勉強するより専門分野の勉強する方がいい。
807 :
2015/06/19(金) 21:01:11.17 ID:DScX6l8h
maxvalを使って上から2番めに大きいものなど抽出したりできませんよね?
808 :
2015/06/19(金) 22:45:09.43 ID:JdldsSpH
挑発されてるようで不快だが

配列に同じ値がないか、重複を排除した2番目に大きい値
(例えば配列a=(/1, 2, 5, 3, 5/)なら3)を返してほしいなら
maxval(a, mask = a < maxval(a))でいい
配列を降順に並べた時の2番目の値(上の例なら5)を返してほしいなら
maxlocで最初の最大値の位置を特定して、それを除外した配列のmaxvalをとる
809 :
2015/06/19(金) 23:35:54.73 ID:DScX6l8h
>>808
ありがとうございます。書き方悪かったですすいません・・
今のプログラムがスマートに書るようになりそうで大変助かりました

もしかすると、3番目とかなら
b=maxval(a, mask = a < maxval(a)) !b=2番目に大きい
c=maxval(a,mask=a<b) !c=3番目に大きい
で良いでしょうか、試してみます
810 :
2015/06/22(月) 00:36:18.06 ID:GDms9OMt
イケメンすぎるwwwwwwwwww
811 :
2015/07/04(土) 15:09:30.71 ID:s4aH+BtB
a(i,j)
b(j,k)という変数があって、
maxval(a(i,j+5:j+10)) - b(j,k)
という計算をしたいのですが、結果がおかしくなります。
もしかするとmaxvalを使って四則演算するときは配列が同じものを使用しないといけないのでしょうか
812 :
2015/07/04(土) 15:23:40.44 ID:s4aH+BtB
すいませんプログラムミスのだけでした
813 :
2015/07/10(金) 19:11:26.54 ID:/GzszqMd
次のようなプログラムを試しに走らせたところ、
ファイルの作成には成功するのですがファイルの読み込みでセグメントエラーが出ます。
原因が分かりません、教えてもらえないでしょうか。windows7, 64bit, gfortran を使用しています。
program fileIO
implicit none
integer i, j, k

open(17,file='mydata.dat')
write (17,*) 100, 200, 300
write (17,*) 400
write (17,*) 500, 600
close(17)

! 同じファイルを今度は読み込み用にオープンする
open(18,file='mydata.dat', status='old')
read (18,*) i, j, k
print *, i, j, k
read (18,*) i
print *, i
read (18,*) i, j
print *, i, j
close(18)
end program fileIO
814 :
2015/07/10(金) 21:33:48.54 ID:/Va7ypH/
>>813
エラー内容書いて
linux のgfortran 、intel fortranなら普通にいけるが
815 :
2015/07/10(金) 21:48:52.27 ID:/GzszqMd
次のエラーが出ました。

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0 ffffffffffffffff
#1 ffffffffffffffff
#2 ffffffffffffffff
#3 ffffffffffffffff
#4 ffffffffffffffff
#5 ffffffffffffffff
#6 ffffffffffffffff
#7 ffffffffffffffff
#8 ffffffffffffffff
#9 ffffffffffffffff
#10 ffffffffffffffff
#11 ffffffffffffffff
#12 ffffffffffffffff
#13 ffffffffffffffff
#14 ffffffffffffffff
#15 ffffffffffffffff
#16 ffffffffffffffff
#17 ffffffffffffffff
#18 ffffffffffffffff
816 :
2015/07/11(土) 01:01:00.88 ID:WfA4pvIG
Window7,64bitのgfortranを使ってコンパイル実行して
みましたが,

100 200 300
400
500 600

と出力されて無事終了しました。
ちなみに,gfortran64のVersionは4.9.2です。
817 :
2015/07/11(土) 13:28:32.70 ID:RZSlcw3F
ソフトのバージョンは
gfortra,64bit, ver 5.1.0 のおそらく最新版です。

とりあえず別のコンパイラを試してみます。
818 :
2015/07/11(土) 15:08:28.52 ID:RZSlcw3F
FTN95 でうまくいきました

やっぱり gfortran ってクソだわ
819 :
デフォルトの名無しさん
2015/07/12(日) 01:05:05.43 ID:yuQPCUFW
ファイルggshoki.f90に、800成分の配列を返すサブルーチンggshokiを書き、他のファイルと一緒にコンパイルしたところ、


ggshoki.f90:1:20:

subroutine ggshoki(Z(800))
1
Error: Unexpected junk in formal argument list at (1)


というエラーが出てしまいました。
どう直せばいいのでしょうか。アドバイスお願いします。
820 :
2015/07/12(日) 01:10:26.47 ID:yuQPCUFW
上げてしまいました、すみません。

OS:Windows8(64bit)
コンパイラ:gfortran
バージョン:fortran90

です。
821 :
2015/07/12(日) 01:14:54.68 ID:yuQPCUFW
連レスすみません。
バージョンは5.1.0です。
822 :
2015/07/12(日) 01:54:09.24 ID:z4R5SLxl
>>819
subroutineの内部で宣言するなら書き方が違うはず
引数で宣言するより別の行で宣言した方が見やすくない?
とりあえず自分はこんな感じで書く
https://ideone.com/HCzWB6
823 :
2015/07/15(水) 01:28:37.71 ID:yskKzL3L
>>822
リンク先のように書いたらうまくいきました。
自分のプログラムの他の部分も確認したところ、配列の書き方が全て間違っていました(配列A(1:N)をA(N)などと書いていました)。
ありがとうございました。
824 :
2015/07/28(火) 11:53:11.24 ID:J4RVztBC
教えてください。
サブルーチンに渡された配列引数2つが同一かどうか
(値が同じかどうかではなくて、値を格納するアドレスが同じかどうか)
を確認するすべはありますでしょうか…?

ポインタとか使えるのでしょうかね?よく分かっていません。
825 :
2015/07/28(火) 12:08:17.55 ID:J4RVztBC
自己解決してしまいました…

program test
implicit none
real(8)::a,b
a=1
b=2
call sub(a,b)
call sub(a,a)
end program

subroutine sub(a,b)
real(8),target::a,b
real(8),pointer::p1,p2
write(*,*) '=====',a,b
p1=>a
p2=>b
if(p1.eq.p2)then
write(*,*) 'identical'
else
write(*,*) 'independent'
end if
end subroutine
826 :
2015/07/28(火) 12:26:18.89 ID:J4RVztBC
いや、すみません間違ってました。値を比較してるだけみたいです。
どうしたらいいんだ。
(日記みたいになってしまってですまんです)
827 :
2015/07/29(水) 09:56:48.14 ID:2BaiQKnz
最近出た『FORTRANハンドブック』
買ったほうがいいかな?
828 :
2015/07/29(水) 15:03:19.81 ID:PIi6Yh3/
>>826
コンパイラは何?
829 :
2015/07/29(水) 23:16:07.78 ID:USyoWCFT
ifortです。associated(pointer,target) で行けそうなんですが、
targetの変数にopitional属性がついていて… ><という状況です
830 :
2015/07/30(木) 00:48:36.88 ID:5OMMXfec
gfortranならlocでアドレス取得できるの確認した
なんか独自拡張みたいだが、ifortにもあるよね
831 :
2015/08/02(日) 15:34:23.65 ID:Gc5k9GMO
module内のcontainsのところに書いているfunctionをincというフォルダのsample.f90にまるごと持って行き、
include 'incl/sample.f90'
としたのですが、moduleに書いていた時はは参照できていた変数が
定義されていない参照 となりコンパイルできません。
functionまるごともっていくとかやったらいけないものなのでしょうか?
832 :
2015/08/02(日) 17:13:03.49 ID:5pC+KESf
>>831
内部関数を別ファイルにするなら注意が必要
includeを書く位置によるけどエラーになるなら外部関数扱いになっている
内部関数はメインプログラムの変数も参照できる
外部関数の扱いになるとメインの変数、他の内部関数、サブルーチンが参照できなくなる
だから、使っている変数や関数、サブルーチンを確かめないとエラーになる

解決方法はいろいろあるけど変数だけなら引数で渡せば使える
containsの後にinclude文を書けば内部関数扱いになるからそのまま使える

ちなみに、includeは廃止予定とかじゃないけど非推奨らしい
http://www.nag-j.co.jp/fortran/tips/tips_AboutInclude.html
http://www.mri-jma.go.jp/Project/mrinpd/coderule.html
833 :
2015/08/02(日) 20:38:11.00 ID:Gc5k9GMO
>>832
詳しく教えて頂いてありがとうございます。試してみようと思います。
includeってもう非推奨なんですね。代替はmoduleで分割とかできるのかな
include以外のやり方も考えてみます
834 :
2015/08/05(水) 16:55:43.17 ID:OhKwnQSp
>>825
Fortranって規約では、引数に番地の重なる変数や配列を送っちゃ駄目じゃなかったけ?

まぁ大抵のコンパイラは無警告で通すけど。
昔だとWATFORなんかが文句を言ってきた。今だとNAGあたりがなんか言いそう。

>>830
loc 相当を規格内でやるには c_loc と transfer で代替するはず。
835 :
2015/08/16(日) 01:33:05.77 ID:ZKNwH6b8
Fotranで作成された古いプログラムをVBAに移しているのですが
符号がついていないためIF文の解釈がよくわかりません。
どなたか教えて頂けないでしょうか。

IF(J-K) 2,3,2
3 B(J)=1./Y
C(J)=1.
GOTO 4
2 B(J)=-A(K,J)/Y
C(J)=A(J,K)
4 A(K,J)=0.
836 :
2015/08/16(日) 01:53:24.79 ID:mdNdQhdt
>>835
IF (L) a,b,c

X:負 go to a
X:0 go to b
X:正 go to c
837 :
2015/08/16(日) 03:10:40.47 ID:ZKNwH6b8
>>836

ご回答ありがとうございました。
助かりましたm(_ _)m
838 :
2015/08/16(日) 08:57:02.36 ID:nCIMfI1D
>>835
>>836
いわゆる計算型go toはもう忘れられいるのですね。
839 :
2015/08/16(日) 09:08:04.74 ID:ZKNwH6b8
>>838
私が素人というのもあるのですが、いくつかのFortranのHPみてもIF文の説明には
入っていませんでした。
840 :
2015/08/16(日) 12:29:13.36 ID:nCIMfI1D
>>869
ただしくは、算術IF文というものです。あるサイトの解説です
古い書き方に算術IFというものがあります。 この書き方はFortranでは廃止予定機能ですが古いプログラムには見かけられる書き方です。
算術IF文は、与えた式が0より小さい場合に最初の文番号へ、 0の場合は2番目の文番号へ、 0よりも大きい場合には3番目の文番号にジャンプします。
if ( 式 ) 文番号1, 文番号2, 文番号3
例)
i = -1
if (i) 100, 200, 300 ! 100へジャンプします
841 :
2015/08/16(日) 21:04:42.30 ID:mdNdQhdt
古文読解みたいなもんよ。
新たに使うことは無いが、昔のプログラム読む為の教養みたいなもん?

アセンブラから進化したと思えば、まぁこんな命令ありがち感はある。
842 :
2015/08/24(月) 05:54:40.65 ID:lgtNqCAf
ある参考書にあるプログラム例を映したのですが、実行するとエラーが出ます。内容が外部ファイルへの出力関係なので早急に解決したいのでよろしくお願いします。
プログラム
integer :: n, i, j, fi = 10, fo = 11
open(fi, file = 'input.d')
open(fo, file = 'output.d')
read(fi, *) n
close(fi)

if(n < 3) stop 'stop, n < 3'
d = 10.0d0 / dble(n - 1)
do j = 1, n
y = -5.0d0 + dble(j - 1) *d
do i = 1, n
x = -5.0d0 + dble(i - 1) *d
z = sin(x) * cos(y)
write(fo, '(3e12.4)') x, y, z
enddo
write(fo, *) ' '
enddo
close(fo)
エラーメッセージ
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0 ffffffffffffffff
#1 ffffffffffffffff
#18まで同文
OS:Windows7(64bit)
コンパイラ:gfortran
よろしくお願いします
843 :
2015/08/24(月) 06:07:47.38 ID:lgtNqCAf
申し訳ありません。確認したところ
コンパイラはtdm64-gcc-4.6.1です。
844 :
2015/08/24(月) 07:17:38.92 ID:lgtNqCAf
再び申し訳ありません。
gfortranのverを落としたら普通にできました。何度もすみませんでした。
845 :
2015/10/14(水) 21:51:47.29 ID:S/4UaJI2
intelコンパイラのDAALをFortranから
なにかしらの形で呼び出してうまくいった方いませんか?
846 :
デフォルトの名無しさん
2015/11/08(日) 17:44:21.58 ID:jBmnCoB4
fortranで簡単なguiウィンドウ作れたりしますか?
ウィンドウがあってこのボタンを押すと〜〜のサブルーチン実行のような・・・
847 :
2015/11/08(日) 18:57:35.01 ID:8suWMXlm
>>846
visual fortranにRADがあったような気がする
けど、Fortranで計算部分をライブラリ化しておいて
別の言語で作ったGUIで呼び出す方が一般的だと思う
848 :
デフォルトの名無しさん
2015/11/09(月) 22:25:56.92 ID:oiX/fj8U
>>847
ありがとうございます
やっぱり流行りの言語も使ってみたいと思います
849 :
デフォルトの名無しさん
2015/12/15(火) 21:50:10.22 ID:CN0jNpr8
基本的な質問かもしれませんがfunctionとsubroutineで作るのってどう切り分けたらよいのですか?
850 :
2015/12/15(火) 23:58:59.22 ID:8+9MOK5i
>>849
functionを使うのは、返値が一つと自明な(かつ明示したい)ときだけかな。
851 :
2015/12/16(水) 00:26:30.43 ID:dxIuSVrg
>>850
ありがとうございます
計算速度は関係ありませんか?
852 :
2015/12/16(水) 00:28:34.56 ID:dxIuSVrg
例えばファンクションのほうがその度に呼び出すために計算速度は遅くなるとかありませんかね・・?
853 :
2015/12/16(水) 02:24:06.06 ID:cuafR5Si
差は感じたことないな
気になるなら簡単なテストプログラム作ってみたら?
854 :
2015/12/16(水) 06:34:20.84 ID:qB4UYIzV
中身が分からないunformattedで出力されたファイルを読むにはどうすればいいですか?
855 :
2015/12/16(水) 22:57:19.85 ID:a/dQTwEW
ACCESS='STREAM' でオープンして嫁  詳しくはマニュアル検索検索
856 :
2015/12/16(水) 23:02:21.81 ID:a/dQTwEW
>>849
function は副作用(PURE の時)がないとき、それ以外なら SUBROUTINE が基本かな。
コンパイラの最適化の観点から、数学的な意味での関数になっているときに使うのがいい。
857 :
2015/12/25(金) 14:17:27.29 ID:H3s+gts8
今二分法のプログラム書いているんだけど、うまく収束しなくて困ってるのでここで質問させてください

ある区間[a, b] の間に解があるとして、f(xsol) =0となる点を見つけようとしてます。

関数f(x) は数値計算によってしか求められない(xの多項式では記述できない)とします。

x -> xsol に近づいていると思うのですがどうしても0 に漸近しません。 収束条件は 10^{-1}程度の荒いものでも収束しません。

考えられる原因の1つとして情報桁落ちかな?と思いましたが回避する方法はあるでしょうか?

ある程度計算を進めると、区間[x1, x2]において、その中点 (x1+x2)/2の値が一定となってしまいます。
858 :
2015/12/25(金) 14:24:09.90 ID:H3s+gts8
>>857
後出しで申し訳有りません。

変数は全て倍精度で設定しております。
859 :
2015/12/25(金) 16:39:31.63 ID:em+Cn0F1
>>857

real(16)
と宣言して、8倍精度にしたらどうなりますか。
860 :
2015/12/25(金) 16:47:13.93 ID:VJyAJ/uW
>>853
>>856
返信おくれてすいません。
勉強になりました。一つ出力でpureな時はファンクションを使うようにします。
861 :
2015/12/25(金) 19:21:54.92 ID:H3s+gts8
>>859
今4倍精度に宣言して計算終わったところです!
一定になるところは変わりましたが、計算を進めるとやはり中点が一定になります。。。
862 :
2015/12/25(金) 19:22:26.63 ID:H3s+gts8
>>861
すみません、16倍精度の間違えです
863 :
2015/12/26(土) 01:22:24.79 ID:ybGnykyB
>>859,861
ちょーーー!!
8倍精度とか16倍精度と違うから! 
普通はバイト数だから8で倍精度、16で4倍精度。
まぁ数値はベンダー依存で規定されていないから、あんたらのコンパイラが
8倍精度や16倍精度なのかもしれないがさw

そもそも二分法の場合必ず半分になるんだから、まともなら x1=x2 にならないはずがない.
ならないとすればプログラムが間違っているか、関数値の正負が x1 と x2 の間で
複数回反転しているかのどっちかだろ。つまり与えた区間の初期値が間違っている。

まずグラフを書かせろよ。
適当に数値いれて手で方眼紙にプロットしろ。話はそれからだ。
864 :
デフォルトの名無しさん
2015/12/27(日) 14:58:58.66 ID:j4SegU7G
>>857
関数f(x)がもともと収束しない形である可能性はないのか?
865 :
2015/12/27(日) 19:35:54.52 ID:yJZ4hzCz
>>863
すんません、完璧勘違いしてました!
やはり4倍精度で正しかったですm(_ _)m
勉強になりましたm(_ _)m

>そもそも二分法の場合必ず半分になるんだから、まともなら x1=x2 にならないはずがない.
>ならないとすればプログラムが間違っているか、関数値の正負が x1 と x2 の間で
>複数回反転しているかのどっちかだろ。つまり与えた区間の初期値が間違っている。

初期値問題ですか。。。。


>まずグラフを書かせろよ。
>適当に数値いれて手で方眼紙にプロットしろ。話はそれからだ。

グラフなんですが、f(x)が非線形なので数値計算のみでしかもとまらないです。
866 :
2015/12/27(日) 23:19:57.50 ID:XJXVRFXp
>>865
沢山の点で計算してEXCEL等でプロットすればいいのでは。
867 :
デフォルトの名無しさん
2015/12/28(月) 02:36:39.69 ID:lnQX/VRo
>>865
まずは4次のルングクッタでグラフ描いてみてはどうだ?
868 :
デフォルトの名無しさん
2016/01/09(土) 11:18:03.65 ID:i1gHiPMA
implicit な〜ん(笑)
869 :
2016/01/18(月) 02:16:26.16 ID:trNoq0XT
fortranだと変数がからかどうか判定できないんだっけ?
空だと 0.00が代入されんのかな
870 :
2016/01/18(月) 15:21:34.93 ID:1WswQHMD
空ってなんだ? 初期化されていないということか?
Fortranでは初期化されていない変数の値は不定だぞ。ごみが入っている。
0.0は初期か忘れに気づきにくいから、むちゃくちゃな値が入っていたほうが親切。

allocatableがallloctaeされているかいないかならallocated関数かな。
871 :
デフォルトの名無しさん
2016/01/19(火) 00:06:44.55 ID:yHbL6fBI
>>870
e-307くらいが入る
872 :
2016/01/19(火) 01:44:03.17 ID:3ZSQATy/
>>870
allocatable で配列宣言してないとそれ使えないよね?

例えば、

program main
implicit none
double precision:: a, stat

do
read(20,*,iostat=stat) a
if(stat<0)exit
enddo
rnd program main

fort.20 ファイルの中身が空(null)だとしたら変数aにはゴミが入るわけよね?
変数aに何の数値も代入されていないと自動的に確認するためにはどんなコーディングが必要だろう、この場合。
873 :
2016/01/19(火) 06:58:03.23 ID:MMA3M4fE
Fortranのレベルでどうこうではなく、Undefined Behavior Sanitizerでも使えばいいんじゃないの
874 :
2016/01/19(火) 09:26:07.32 ID:3ZSQATy/
>>873
それはオプションかな?
今回の問題とはちょいと違うのだ
875 :
2016/01/20(水) 00:17:10.04 ID:0BkO9wkB
いまさらfortranで機械学習とかディープラーニングライブラリ作って公開する猛者いませんか?
いたら面白いのになあ
876 :
デフォルトの名無しさん
2016/01/22(金) 21:17:23.35 ID:SxQo3Wt7
iMacだがLAPACKのコンパイルが上手くいかない。MacBookAirの時は上手く言ったのだが誰か教えてくれないか?
877 :
2016/01/22(金) 22:42:37.27 ID:rL4grHGE
>>872
Fortran2003 ならスカラーの allocatable もある。

I/O では無理だが、例えば Function からの代入ならば、希望のことはできる。
スカラーへの allocatable 変数が返り値の Function からの自動再割り付けで、
右辺の関数の返り値が空なら、左辺の allocatable スカラーが allocate されないし、
値をもっていれば NULL だろうとallocate されるので allocataed 関数を使えば判別できると思う。
878 :
デフォルトの名無しさん
2016/02/05(金) 09:02:45.47 ID:wvmc5Sx8
Fortranって何を使ってデバッグするんでしょうか
879 :
2016/02/08(月) 00:08:26.47 ID:wknTPR3t
>>878
dddとかやん?
880 :
デフォルトの名無しさん
2016/02/10(水) 08:13:25.94 ID:ZRcL4yE9
>>879
便利そうですね
ありがとうございます
881 :
2016/02/12(金) 04:12:40.41 ID:vptI0fCP
数値計算するときの刻み幅の決め方が難しすぎるなぁ
等幅だとものすごい配列使うからメモリがオーバーフローするしなんかいい方法ないすかね?
てか、刻み幅に関する詳しい本とかないのかなぁ
882 :
2016/02/12(金) 08:22:40.80 ID:1ZkcdkFj
>>881
森口繁一先生の
『計算数学夜話』
に、「刻み幅の自動選択」
という話が掲載されていたはずです。
変化がなだらかな区間は刻み幅を広く、
変化が急な区間は刻み幅を狭くするのを
自動化するという話です。
883 :
2016/02/14(日) 06:02:56.78 ID:5/5WMEda
>>882
ありがとうー
うー、でも手に入らないぽいなー((((;゚Д゚)))))))
884 :
2016/02/15(月) 02:04:22.84 ID:sHvN+vmN
桁の大きなものと桁の小さなものが混じった数値計算をするとき、規格化するのは常識だと思うんだが。
ある変数の取りうる範囲が極端に振れる場合(例えば、1d-20 < x < 1d8) だとどうすりゃいいんやろか。
885 :
2016/02/17(水) 11:45:41.36 ID:8sdmbRj5
対数を取れw
886 :
2016/02/17(水) 12:17:59.53 ID:IDaBzq+u
>>885
それ教授や先輩にも言われたんですかまったく意味わかりませんでした。
刻み幅で対数????といった感じです。

logx(i+1)-logx(i)=刻み幅 ということですか?
887 :
2016/02/17(水) 12:40:39.87 ID:5aqj+faD
logかました状態だと値の範囲が狭くなるというだけじゃ?
888 :
2016/02/17(水) 18:55:07.86 ID:NfIkV94M
そもそも問題がわからないから答えようがないな。
たとえば被積分関数が 1d-20 から 1d8 まで振れる場合は小さい値はどうでもいいし。
889 :
2016/04/25(月) 20:15:29.39 ID:ABiBIEuQ
一次元ポアソン方程式

d^2φ/dx^2=cos(x) (0≦x<2π)

を解くプログラミングがわかりません。差分法を使えばいいというのはなんとなくわかったのですが、差分法がいまいちよくわかっていないです。

どなたかご教授ねがえないでしょうか。
890 :
2016/04/25(月) 21:42:21.21 ID:0jtmrtsy
ネットでも本でもいいから微分方程式の数値解法について調べること。
いろんな計算方法があるし、特定の言語にこだわる必要もない。

そういえば数値計算のスレって今ないよね。
891 :
デフォルトの名無しさん
2016/04/25(月) 21:53:17.04 ID:2LxfGMmK
>>889
そもそもその式は解析的に解ける。
892 :
デフォルトの名無しさん
2016/04/25(月) 21:53:33.26 ID:2LxfGMmK
>>890
欲しいなそんなスレ
893 :
デフォルトの名無しさん
2016/05/01(日) 14:42:40.23 ID:tKi6j9CT
匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています

言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?

Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al

ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw


The Covenant Project
概要

Covenantは、純粋P2Pのファイル共有ソフトです

目的

インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します

特徴

Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)

接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません
894 :
デフォルトの名無しさん
2016/05/01(日) 18:07:45.37 ID:XA7YY+e1
言語はなんでも大丈夫ってレベルじゃねーぞ
895 :
2016/05/17(火) 20:55:20.04 ID:MgCDmrcL
Fortran2015の調子はどうだい?
896 :
デフォルトの名無しさん
2016/05/21(土) 18:12:16.63 ID:h3OgqWhP
ChromebookでFortranって動かせる?
897 :
デフォルトの名無しさん
2016/07/18(月) 20:31:12.72 ID:apSB7g7B
全く分かりません
答え教えて下さい
http://i.imgur.com/BB9ERMu.jpg
http://i.imgur.com/SgRmlY6.jpg
898 :
2016/07/19(火) 14:21:12.91 ID:qfWdnT3p
>>897
逝ってよし
899 :
デフォルトの名無しさん
2016/07/19(火) 20:22:44.55 ID:555Vvc50
>>897
>>898
この流れいいなw
900 :
デフォルトの名無しさん
2016/07/19(火) 22:17:37.41 ID:WRFubhA/
>>898
オマエモナー
901 :
デフォルトの名無しさん
2016/07/19(火) 22:18:11.36 ID:WRFubhA/
>>897
自己解決しますた
902 :
デフォルトの名無しさん
2016/07/28(木) 19:47:05.10 ID:nObYn5cT
0度〜90度まで30度間隔で正弦と余弦を出力する。但し書式は整数5桁、関数値は10桁で小数点以下6桁とする。

下記でコンパイラしても上手くいかないのですがどこをどのようにすれば宜しいでしょうか?
http://i.imgur.com/xwAoCXH.jpg
903 :
2016/07/28(木) 22:14:51.73 ID:E8ct0ihN
古風な書き方だな
大学の講義か何かで習ってるの?

k が正しく表示されない点については、フォーマット文の f2.0 を i5 に書き換えたらどう?

どの段階でどのように失敗するのか書いてくれるとチェックしやすい
あと、プログラムをコピペしてくれるとこちらが入力する手間が省ける
904 :
デフォルトの名無しさん
2016/07/29(金) 07:39:07.85 ID:1zITvd9X
>903
確かにFortran IVみたいな書き方ですね。
フォーマット文を

100 format ( i5,2f10.6)

に替えたら

  k    sin     cos
0 0.000000 1.000000
30 0.500000 0.996812
60 0.866025 0.987268
90 1.000000 0.971430

と結果がでます。
それにしても,
pi = acos(-1.0)

DOループの前に出すのがいいのじゃないですか。
905 :
デフォルトの名無しさん
2016/07/30(土) 00:26:12.77 ID:CH8BIOrU
>>903
>>904
ありがとうございました!
i5に変えたら成功しました!
906 :
デフォルトの名無しさん
2016/07/30(土) 00:26:31.27 ID:CH8BIOrU
>>903
大学ですね
907 :
デフォルトの名無しさん
2016/07/30(土) 01:16:36.18 ID:CH8BIOrU
重力のみが作用する振り子の運動を解析するプログラムを完成させよ。
real L
data g, L / 9.8, 1.0 /
write (*,*) ’ Δt (sec) =’
read (*,*) dt
*initial
2 write (*,*) ’ θ0 (radian) =’
read (*,*) s0
s =❔
v =❔
t =❔
vL=v
* repeat
1 a= ❔
v =❔
w=❔
s =❔
t =❔
write (*,’(3f8.4)’)
if (vL.gt.0.0.and.v.lt.0.0) go to 2
vL=v
go to 1
end
知り合いとやってるのですが出来る気配がありません。
❔部分に何が入るか教えて下さい。
Δ、θは置き換えますよね?
908 :
デフォルトの名無しさん
2016/07/30(土) 01:17:58.34 ID:CH8BIOrU
909 :
2016/07/30(土) 18:19:30.33 ID:MnenPn8v
>>907
回線切って氏ね
910 :
デフォルトの名無しさん
2016/07/31(日) 23:35:51.92 ID:TkjN2Ici
>>907
単振り子で色々調べてますが全く分かりません。
誰か出来る方いましたらお願いします。
911 :
2016/08/01(月) 00:02:16.74 ID:018Zh5sQ
たぶん運動方程式をたててオイラー法で解くだけでしょ
どの段階で躓いているか分からないと答えようがない
912 :
2016/08/01(月) 01:25:45.70 ID:qXp6EaAl
宿題全部やってちょうだい感が出てるから、やってくれる人は少なそう
913 :
デフォルトの名無しさん
2016/08/01(月) 12:05:07.12 ID:tW3kuaWv
エセ左翼の目的は、わざと突っ込みどころが多い主張をすることで自分たちへ注意を向けさせ、
カルトへ向かう非難の矛先を逸らすこと。
国益に反することを言ったり、主張が食い違うもの同士の対立を煽ろうとするので放置し難いが、
主義思想についての洗脳を受けているわけではなく、フリをしているだけなので、
言い負かされてもダメージを負った様子もなく、論点をすり替えられるかスルーされる。
まともに相手をしてはならない。

サヨに対する危機意識が強すぎると、普段は常識的に振舞っている
(又は、サヨから不当に叩かれている)政治家などがズレたことをやろうとした時でも、
許容したり擁護してしまいがちになるので注意が必要。
914 :
デフォルトの名無しさん
2016/08/01(月) 22:50:33.91 ID:qgzcRfyo
時間、速度、角度を出力するつもりでやったのですがコンパイルした時の値が違います
おそらく運動方程式が間違っているのだと思いますが(t,s辺りが違い気がする)どこがどう違うか教えて下さい
real L
data g, L / 9.8, 1.0 /
write (*,*) ’ Δt (sec) =’
read (*,*) dt
*initial
2 write (*,*) ’ θ0 (radian) =’
read (*,*) s0
s =s0
v =0
t =0
vL=v
* repeat
1 a= −g*sin(s)
v =a*t
w=v/L
s =s0+v*t/L
t =t+dt
write(*,*)’t,v,s’
write (*,’(3f8.4)’)t,v,s
if (vL.gt.0.0.and.v.lt.0.0) go to 2
vL=v
go to 1
end
915 :
デフォルトの名無しさん
2016/08/02(火) 00:16:36.76 ID:lf/Rfa1x
>914
プログラムの問題ではなくて,数式の問題なんだから,物理板で質問した
ほうがいいのじゃないの。
916 :
2016/08/02(火) 01:31:13.87 ID:pyAOnFQt
>>914
それFortran以前に運動方程式が全然違う。
v=Lω
dθ/dt = ω
として

dθ^2/dt^2 = -(g/L)sinθ
という微分方程式をルンゲクッタ法で解く。

解析力学、振り子とかで検索したら
ttp://homepage1.nifty.com/gfk/furiko.htm
出てくるだろ、ちゃんと調べろ。
それ以前に理学部とかだったら勉強不足だぞ。
917 :
2016/08/02(火) 16:12:24.48 ID:+RnVB/b2
どなたか「=>」の意味を教えてください
大なりイコールのような条件式ではなく、記号が逆になっている方です。
具体的には、
DO I =1,NCNEST_NUM
D=>NCNEST_DATA(I)
G=>NCNEST_GRIDS(I)
CALL ASSIGN2BLOCK(D,G)
END DO
のようになっています。データの書き込み系だと睨んでいます。
よろしくお願いします。
918 :
2016/08/02(火) 16:20:52.36 ID:e4r/z1Wx
>>917
ポインタの指示先を指定している
http://www.nag-j.co.jp/fortran/FI_Pointer.html
919 :
2016/08/02(火) 16:23:27.42 ID:W78wvcm1
920 :
2016/08/02(火) 16:50:17.87 ID:+RnVB/b2
>918
すばやい反応ありがとうございます。
「FORTRAN =>」で検索しても出てこなかったので、非常にありがたいです。
921 :
2016/08/05(金) 23:42:07.06 ID:y4inqjRe
coarrayをwindows7,gfortranで
gfortran coarray.f90 -fcoarray=lib -lcaf_mpi
と打つと、
cannot find -lcaf-mpi
とでてコンパイルできん

https://gcc.gnu.org/wiki/CoarrayLib
を参考にMPICH2の拡張子msiのやつ(ちょいバージョン古い)を管理者権限でインストールしてPATHも通している
mpiexecも出来てるから、インストールに失敗してはいない
助けてくださいお願いします
922 :
2016/08/07(日) 15:55:29.04 ID:2PwL22wv
caf-mpi.a もしくは caf-mpi.so はたしかにあるの?
バージョン番号付いたやつにリンクしてる?
ってWindowsか、、、Windowsの場合 .lib だったりするのかな
923 :
2016/08/07(日) 19:58:54.32 ID:6Zl4UqYG
今のところwindowsだと無理っぽいね
mpif90がないからlcaf_mpi.aも取れない
おとなしく仮想化使います
924 :
2016/09/06(火) 22:18:19.77 ID:VT4c30Iu
大気の温度構造を求めるために、4次のrunnge-kutta 法で数値計算しているんですが、ある値に収束するまで繰り返し計算させているせいか精度がどうしても出ません。
動かす範囲が大きいため、刻み幅のとり方が非常に難しく難儀してます。

例えば、積分範囲が 3.0d9 から3.0d6 まで計算しなきゃいけないのですが、ところどころに物理状態が変わるいわゆる境界があるので一律に刻み幅を設定するわけにもいきません。

色々書籍見てみたんですけど、刻み幅のとり方って
h = -1とか撮ってみても恐ろしく時間がかかるため現実的じゃありません。

なにか妙案はないでしょうか?
もしくは推薦図書あれば嬉しいです。
ちなみに今あるのは「数値計算術 」森口繁一 です。
925 :
デフォルトの名無しさん
2016/09/07(水) 10:09:47.11 ID:ihxbaE2x
>>924
藪下信『計算物理(I)』(地人書館、1982)には、
「ルンゲ・クッタ法は弱不安定であることが知られている。ずなわち、ステップ幅hをあまり大きくとり過ぎると
、微分方程式の解と、それに対応する数値解とが、定性的に異なった振舞いをする。ただそれは
弱不安定性なので、hを小さくとることによって、安定にすることができる。理論的に詳しいことは、
ここでは説明しないが、結果だけをまとめて書いておこう。
(1) 一般の従属変数yに対する式
dy.dx=ay+b, (a<0)
に於て、ルンゲ・クッタ法が安定であるための条件は
|ha|<2.7
となることである。
(2) n個の従属変数(y1, y2, ,,,,,,,yn)に対する微分方程式
dy・cx=A;y+b
を考える。ただし、Aはn×nの行列である。Aの固有値の中の負のものがあるとき、
Aの固有値のうち絶対値が最大ものをλとする。
安定性の条件は、
|hλ|<2.7
となることである。」
とあります。参考になるでしょうか。
森口繁一先生の本で、「刻み幅」を自動的に変更するという手法について書かれた本が
あったと思います。『計算数学夜話(?)』とかいう本かもしれません。
926 :
デフォルトの名無しさん
2016/12/03(土) 20:32:29.57 ID:HN6NcG00
>>924
最適解を求める方法は、刻み値の変更方法を含めて
UP応用数学選書7 最小二乗法による実験データ解析 プログラムSALS
https://www.utp.or.jp/bd/978-4-13-064067-1.html
にくわしい。大学系の図書館ならおいてあるはず。

境界値があって、連続計算できない場合に
最小二乗法だと、不安定になりやすいので、収束が悪いけど、絶対値法
残差二乗和の極小値ではなく、残差絶対値和の極小値を求めると、収束まで2-3倍の回数を計算しなければならないけど、安定しやすい。
残差が増加したときに、一旦計算を打ち切って、解を出力する。
出力した解を初期値として、刻み幅を1/10位(2進数の関係で1/8か1/16)に減らして、再度計算する。

収束で、計算機Eの1024倍ぐらいまでが積分を求めた時の1桁の精度になる(こっちの経験値、問題と演算系によっては大幅に変わる)ので
Y=F(X)の、Xを少しずらした時の値を計算して、このくらいずれる値を見つけておいてくれ。
左(0)から近づけた場合と右(∞)から近づけた場合に、不連続点の付近で、制度が大きく変わる。
こっちが取り扱った問題では、右からは1程度、左からは1E-12程度、計算機Eの影響を受ける。
こんな場合には、最小二乗法・絶対値法ともに使えない。OR https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%BA%E3%83%BB%E3%83%AA%E3%82%B5%E3%83%BC%E3%83%81 を使う。
一次方程式の場合には、計算方法が規定されているが、
他の場合には、
適当な初期値を使って計算して、少しずらした値を計算して、極小値を初期値にして再度計算、
の繰り返しになる。不連続点は計算しない。
「少しずらした値」は1/1024を使って、その後1/2づつ減らした。
収束はかなり悪い。3000-5000回の繰り返し演算が必要だった。
計算機Eによる影響は、この方法で求めた。

なお、温度の変化を追いかける計算ではないので、参考にならないかもしれない。
927 :
デフォルトの名無しさん
2017/03/24(金) 22:05:30.22 ID:rSyKPFXl
どなたかご存知の方いらっしゃいますでしょうか?
コンパイラのバグではなく何らかの仕様なのかと思うのですが分かりませんでした。
●質問
実数型の変数をwrite文で桁数を指定して出力させる時、
桁数以下の値は四捨五入されて出力すると思うのですが、
下記プログラム例のように”切り捨て”られる(と思われる)場合があります。
なぜこのような処理がされるかご存じであれば教えて頂きたいです。
●プログラム
PROGRAM TEST
IMPLICIT NONE
REAL*8 VAL1
  VAL1=0.125D0
  WRITE(6,'(D13.2)')VAL1
END PROGRAM
●結果
0.12D+00
●問題点
・0.125の小数点第3位を四捨五入すると0.13となるが結果は0.12となってしまう
●確認したこと
・変数VAL1の桁を増やして確認すると0.12500000000・・・と続く
・0.125は2進数で正確に表す事ができる
・下記のように2進数で正確に表せない数値だと四捨五入が理解できる
 入力値 VAL1=0.555D0
 結果 0.56D0
 結果(桁を増やす)0.555000000000000048849813083507D+00
・2進数で正確に表せる数値でも正しく四捨五入されるものもある
 入力値 VAL1=0.375D0
 結果 0.38D0
 その他 0.0625D0も正しく四捨五入される ⇒ 0.63D-1 と出力される
・Fortranコンパイラは、Compacfortranやredhatのgfortran、IntelFortranを試したがいずれも同じ結果だった
・単純な数値なので32bitや64bit環境の問題では無いと思います
・.f90でのみ試しています
928 :
2017/03/24(金) 23:03:11.52 ID:L8cPMEns
丸めモードについて読むこと
IEEE754のNEARESTなら正しい動作
http://www.ibm.com/support/knowledgecenter/ja/SSGH4D_12.1.0/com.ibm.xlf121.aix.doc/language_ref/write.html
929 :
デフォルトの名無しさん
2017/03/25(土) 04:11:14.28 ID:ESyR2hOs
どうもありがとうございます。
ROUNDで丸め誤差を色々定義出来るのですね。
来週試してみます。
418KB

新着レスの表示

レス数が900を超えています。1000を超えると表\示できなくなるよ。
★スマホ版★■掲示板に戻る■全部前100次100最新50

名前:E-mail: