2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2012/08/16(木) 20:58:00.31 .net
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
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 .net
           , 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 .net
> 初心者に適切な指導もなくプログラム書かせているのはアカハラの域に達してるな。

これって割と多いような気がするな。
まあ分野によっちゃいずれ必要になることが前前から分かっていそうな気もするのだが
それも指導のうちと言えばそうだ

4 :デフォルトの名無しさん:2012/08/17(金) 04:02:00.57 .net
do i=2,1000
write(*,*) '1otsu'
enddo

5 :デフォルトの名無しさん:2012/08/17(金) 19:12:19.36 .net
>>3
昔は先輩が教えることが前提となっていたから成立したが、
最近、先輩がいなかったり、知らなかったりで、伝承が途切れている。
時代の変化に、サヨクかぶれの爺さんたちの現状認識が追いついていない。
連中は鳩山みたいに夢を見て、管みたいに怒鳴り散らしてるからw

6 :デフォルトの名無しさん:2012/08/17(金) 20:00:57.70 .net
前スレくだすれ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 .net
>>6
それだと出力してない。
OPEN と CLOSE の間で出力する。

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

その後、色々ループさせたり、ファイル名を変えたり出来るようにすべき。
ものには順番があり、近くから遠くへ及ぼすべしとは、四書のはじめ大学にも書いてあるw

8 :デフォルトの名無しさん:2012/08/17(金) 21:14:43.76 .net
これまでの教えていただいたプログラムが下記になります。

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 .net
! 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 .net
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 .net
write(14,*) 'result=', s ! <--だから結果を書きだせってw

思わず間違えたwwww

12 :デフォルトの名無しさん:2012/08/17(金) 21:52:24.90 .net
>>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 .net
そうそう。欲しい結果を書きだす。
本来は、入力ファイル名や計算したカラム(列)番号のような
付加的な情報も書いておくべきだろうが・・・

open(14,file = trim(filenm) ) ! <- こっちもTRIMで尻の空白を削っておくべし。


14 :12:2012/08/17(金) 22:16:41.91 .net
>>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 .net
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 :12:2012/08/17(金) 23:31:33.54 .net
>>15
度々すみません。親切にありがとうございます。
プログラムに組み込ませていただきます!

今日もかれこれ5時間くらいネカフェにいますが、
そろそろおいとまします。自転車こいで橋を越えた甲斐がありました。
また色々教えてください。

17 :12:2012/08/17(金) 23:46:42.05 .net
最後にプログラム全体を書き込ませてください。
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 :12:2012/08/17(金) 23:47:39.05 .net
!
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 :12:2012/08/17(金) 23:48:58.52 .net
本日もどうもありがとうございました。
お先に失礼します。

20 :sage:2012/08/21(火) 14:51:00.60 .net
わからないので教えてください。
メモ帳(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 .net
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 :12:2012/08/23(木) 20:46:06.15 .net
以前こちらの掲示板でお世話になった>>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 :12:2012/08/23(木) 20:50:05.82 .net
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 :12:2012/08/23(木) 21:03:18.85 .net

自分の作りたいプログラムの内容を載せさせてください。連投になってしまい、すみません。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 :12:2012/08/23(木) 21:04:12.98 .net
エクセルデータ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 .net
>>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 .net
! 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 .net
> 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 .net
>>27>>28
返信遅くなってすみません。家の方で一週間以上経っても書き込み規制が解除されないみたいで、
またネカフェからです。月曜日に現状の報告会があったので、準備やらなんやらで閲覧が
遅れてしまい、申し訳ありません。
毎回教えていただきありがとうございます。

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


30 :12:2012/08/28(火) 04:34:43.09 .net
以下に順序を変更してみたプログラムデータをコピペします。

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 :12:2012/08/28(火) 04:41:41.98 .net
! 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 :12:2012/08/29(水) 16:39:14.45 .net
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 :12:2012/08/29(水) 16:39:45.01 .net
! 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 :12:2012/08/29(水) 16:42:53.89 .net
上記で試してみたのですが、以下のようなエラーが起きてしまいました。(泣)
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 .net
>>34
do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do    !
    ↑
ここに全角文字の空白が入っている。それでエラーが出ている。
削れ。
残りのエラーは、それを直せば消える。

あんま全角文字は使わない方がいい。

36 :デフォルトの名無しさん:2012/08/29(水) 17:48:31.37 .net
lexical error: Invalid character

エラーメッセージの意味を調べておくといいよ

37 :12:2012/08/29(水) 19:26:06.86 .net
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 :12:2012/08/29(水) 19:28:30.86 .net
! 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 :12:2012/08/29(水) 19:32:33.20 .net
>>35
上記でコンパイルすることができ、ご指摘本当にありがとうございました。
「icol」なんですが、warningがでてしまって、式に直接関係しない変数なので
消してみたら消えました。たぶん、自分の使っているバージョンが古いため
警告がでちゃったと思います。

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

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

>>36
そうしてみます。

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

いらない行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 :12:2012/08/29(水) 20:19:49.56 .net
>>36

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


オペレーターの入力ミスということでしょうか?

42 :デフォルトの名無しさん:2012/08/29(水) 20:42:53.64 .net
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 .net
>(ncolumn, ndata)に関してですが、(18,400)に変更しても問題ないでしょうか?
>師からわかっている値なのでこっちにした方がよいと言われました。

今時の常識では、数値述べたうちは避けて、常数にする。
Fortranの場合はparameterにするのがふつう。


44 :デフォルトの名無しさん:2012/08/29(水) 21:38:00.28 .net
>>43
ありがとうございます。
parameterというのはC言語でいうconstのような、
変数として宣言はするが変更はできないものと捉えて問題ないでしょうか?
となりますと「不要な6行」もそれに倣って

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

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

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


プログラミング自体が初めてなので右も左もわからない状態だったのですが、
みなさんのおかげで金輪際ここに来ることはないと思います。
長々とお付き合いいただきありがとうございました。

45 :デフォルトの名無しさん:2012/08/29(水) 21:48:48.84 .net
> FOR4265: symbol ICOL referenced but not set
参照しているけど値が入ってない、だとさ。

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

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

この 400 とか 18 とか何の数だったっけ?
とならんように意味のある変数(名前)で置く。
18 列じゃなくて 19 列だったときも ndata の値を変えるだけだ。

46 :12:2012/08/29(水) 23:48:03.00 .net
電車で帰宅してる間に携帯で見てたのですが、規制がかかっているので我慢できずに
ネカフェから書き込みます。
>>44
勝手に解決させないでください。あと僕になりすまさないでください。
初心者にしてはずいぶんとわかっている余裕感がうかがえますよ。
なんですか、この子供のような文章は?

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

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

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

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

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

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

僕が書き込めるのは、17〜21時,それから帰宅の間は書き込めないので23時以降になります。

47 :12:2012/08/29(水) 23:53:21.35 .net
>>42
今後ともよろしくお願いします。
自分は無礼な発言やおかしいことは言いませんので、
その44の人は別人だし無視してください。


48 :デフォルトの名無しさん:2012/08/30(木) 01:04:47.20 .net
我々がこの「師」とやらと話し合った方が早いな

49 :デフォルトの名無しさん:2012/08/30(木) 01:26:24.03 .net
> よそのvisual basicの方にでもいってやってきてください。

失礼しちゃうわw

50 :デフォルトの名無しさん:2012/08/30(木) 01:30:42.54 .net
>>41 手元にマニュアルもないの? というか目を通してる?

どうやら荒らしらしい>>44にも有益な情報は含まれてるんだよな。
頭に血が昇ってるようだけど、もう少し言われたことについて自分で考えた方がいいぞ。
前スレから。

51 :デフォルトの名無しさん:2012/08/30(木) 18:36:51.49 .net
>>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 :12:2012/08/30(木) 19:24:39.72 .net
お世話になります。
今日、師に計算結果をプロットしたグラフ用紙とそのプログラムを見せに行ったのですが、
確かに計算結果は正しい方向に向かっているが、ちょっと違うと言われました。

   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 :12:2012/08/30(木) 19:25:33.04 .net
エクセルデータ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 .net
修正すれば良いでしょうかじゃなくてまずはやってみろよ
前向きな姿勢は結構だけど結局は質問するばかり、
理解する力が著しく欠如しているのではないか

55 :12:2012/08/30(木) 20:56:06.80 .net
報告します。
先ほど、ビルドに成功して同じファイルを読み込んだのですが、微妙に値がズレてきました!
もう一回明日師に確認してもらいます。
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 .net
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 :12:2012/08/31(金) 19:58:38.13 .net
>>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 .net
コンパイラを 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 .net
>>58
少しはマニュアルくらい読めよw
DEC時代の名前で存在している。ifortでなくてdfortとかiをdに変えればおk。

60 :デフォルトの名無しさん:2012/09/07(金) 20:00:53.25 .net
それで>>58は解決したのかよ。
PGIのCUDA対応に興味あるから、色々反応するの待ってんだけど。

61 :58:2012/09/10(月) 16:56:11.03 .net
>>60
解決しました。ありがとうございます!

62 :デフォルトの名無しさん:2012/09/15(土) 18:54:35.08 .net
急に質問してしまい申し訳ありません。
先月から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 .net
たぶんおかしくない。それより WRITE(6,60) でソースコードを検索してみるべき。

64 :デフォルトの名無しさん:2012/09/15(土) 19:31:56.26 .net
↑すまん適当言った。C と D は複素数か配列じゃないだろうか。

65 :62:2012/09/16(日) 17:07:32.38 .net
>>64
ありがとうございます!無事解が一つのみ表示されました。
ご指摘の通りCとDが複素数で宣言されていました・・・・
それにすら気づかず、write文のせいにしていたのが恥ずかしいです。
大変助かりました!

66 :デフォルトの名無しさん:2012/09/18(火) 19:39:09.67 .net

すみません、質問です。

求めたい値=
(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 :66:2012/09/18(火) 19:44:05.52 .net
すみません、追記です。

メモ帳データの数値はすべて使用して計算結果として算出したいので、
一枚のメモ帳に結果がすべて表示できる方法があったらお願いします。

68 :デフォルトの名無しさん:2012/09/18(火) 19:50:35.33 .net
この辺を見ておくといいよ
http://www.nag-j.co.jp/fortran/index.html

69 :デフォルトの名無しさん:2012/09/19(水) 03:23:00.74 .net
とりあえずファイルのデータを全部2次元配列に放り込んで
結果も2次元配列の内容を全部吐き出す感じでいいだろ。
x, y に任意の組み合わせを取るなら単純じゃなくなるが。

70 :デフォルトの名無しさん:2012/09/21(金) 20:29:19.20 .net
プログラムの歴史を学ぼうと思って、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 .net
もともとが業務用だからね。

72 :66:2012/09/24(月) 16:11:25.31 .net
>>68>>69
ありがとうございます。

73 :デフォルトの名無しさん:2012/09/24(月) 18:53:46.75 .net
>>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 .net
エミュとかはComputerHistoryMuseumではなく、民間のおっさん達がやってる。
ググれば出てくる。


75 :デフォルトの名無しさん:2012/09/24(月) 19:22:07.62 .net
>もともとが業務用だからね。

もしかして“適用業務”のことかw

76 :66:2012/09/26(水) 19:24:13.20 .net
結局、自分でプログラム組めるほど頭良くないので電卓で手打ち
でやってたんですが、エクセルでやることにしました。
フォートランは、エクセルと比べどういう計算処理をする場合に
特化しているんでしょうか?計算するんだったらfortranが一番
おすすめだそうなのでやってみたんですがチンプンカンプンです。
(>_<)

77 :デフォルトの名無しさん:2012/09/26(水) 21:49:19.25 .net
Excel でできる程度の計算なら Excel でやれば良し。
Excel とか無い時代の産物なので、伝統か信仰によって勧められる事が多い。

78 :デフォルトの名無しさん:2012/10/16(火) 20:22:35.55 .net
質問があります
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 .net
>>78
確かにそういときどうすんだろ
考えたこともなかったわ

80 :デフォルトの名無しさん:2012/10/16(火) 22:41:51.19 .net
言ってる意味わからん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 .net
すまんこ。
>'(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 .net
'(a, i0, a)'
でいいんじゃないの?

83 :デフォルトの名無しさん:2012/10/16(火) 23:35:22.01 .net
>>82
うむ。
i0ってF2003からの機能だと思っていたが、F95から入ってたんだな。
勘違いしてたわ。
一応F95標準縛りをかけていたつもりだったので避けたが、i0 で楽勝だな。


84 :デフォルトの名無しさん:2012/10/17(水) 00:21:39.81 .net
>>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 .net
バッチファイルをそのまま生成させるって頭いいな

86 :デフォルトの名無しさん:2012/11/23(金) 13:59:34.03 .net
質問です。
配列を引数にする関数を定義したいのですが、
やり方がよくわかりません。

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 .net
>>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 .net
>>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 .net
>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 .net
それか関数の方を 配列じゃなくて 数値を引数とするように変更するかだな

91 :デフォルトの名無しさん:2012/11/26(月) 19:24:40.40 .net
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 .net
ELEMENTAL属性ってのは初めて聞いた 勉強になります
兄ぃありがとう

93 :デフォルトの名無しさん:2012/12/02(日) 15:08:21.56 .net
(ELEMENTALはPUREでもあるから強調しなくてもいいんだけどな…

94 :デフォルトの名無しさん:2012/12/02(日) 16:57:51.30 .net
x(:)=fd(w(:))
x=fd(w)

って同じ?
: つけとかないと配列であることを
忘れちゃうので
つける習慣にしているけど。

95 :デフォルトの名無しさん:2012/12/02(日) 17:13:25.97 .net
同じだけど、括弧をつけて配列であることを明示したほうがいいね

96 :デフォルトの名無しさん:2012/12/03(月) 19:08:16.44 .net
>>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 .net
(キリッ

98 :デフォルトの名無しさん:2012/12/04(火) 13:45:46.84 .net
>>96
2003使ったことないけど、うーんと、
要は allocatable な変数は
allocate() 使わなくても、
: 無しで左辺において、
固定サイズ(か既に大きさの確定した配列)が右辺に来る代入式で
随時 deallocate して再び allocate した事にする、
ということなのかな?

・・・・すくなくともワシには危険な香りがするw

99 :デフォルトの名無しさん:2012/12/04(火) 13:48:18.15 .net
ふとおもったけど、文字列で
mojiretsu='abcdefg'
write(*,*) mojiretu(2:4)
で bcd が表示できる例のように
文字列の番地管理の表記法って77からある(とおもうw)けど
これってかなり時代先取りだよね。偶然なのか
規格策定の時にすでにベクトル表現の思考が始まっていたのか
しらないけど。

100 :デフォルトの名無しさん:2012/12/04(火) 17:50:34.81 .net
>>98
2003ではおっしゃる通り、サイズの違う配列が右辺に来ると、勝手にDEALLOCTAEして
右辺のサイズにALLOCATEし直して代入する。
Intel Fortranではデフォルトのオプションでこの機能が切られている。

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

>>99
90からはwrite(*,*) 'abcdefg'(2:4)と定文字列?でもできるぞ。

101 :デフォルトの名無しさん:2012/12/05(水) 13:45:40.15 .net
へえ、しらんかった。
でも、どういう場面でつかうんだろう?

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

とか、・・・英語複数形 s をだしたり隠したり、かな?
でも正直なところ、なくても困らんな。

102 :88:2012/12/05(水) 18:22:09.77 .net
88です。みなさんありがとうございます。
お礼が遅くなってすみませんでした。
まだ難しくてよくわからないので、素直に括弧つけます。

103 :デフォルトの名無しさん:2012/12/06(木) 14:46:49.96 .net
>>100 最近の言語は動的なんちゃらで、みんなそんな感じだから流行り
だろうね・・・でも量が多いと遅くなりそう。
そういう動的なことは Interactive な言語処理系でやればいいことで、
やることの量がだいたい前もって決まっていることを
なるべく早くたくさんがーっと処理したい、というのが Fortran 人wなので
・・・でもこのままでは老害って言われるし・・・うーん、むつかしいね。

104 :デフォルトの名無しさん:2012/12/06(木) 15:58:43.84 .net
ヤングの諸君を引き寄せるには、ある程度流行りの機能を入れないとまずいんだろう。

それに動的自動割り付けは、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 .net
可変長文字列も動的割り付けで可能になった。
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 .net
長さ同じだぞw

107 :デフォルトの名無しさん:2012/12/08(土) 17:47:52.98 .net
モジュール内で定義したグローバル変数を
プログラム内で変更しないようにするにはどうしたらよいでしょうか?
(変更があったらエラーを吐くようにしたい)

parameter属性を付けるのが近いと思いますが、
そのグローバル変数はファイルからreadで読み込みます。
つまり、最初に一回だけファイルで読み込んで、
その後は変更せずに、各サブルーチンで参照できるようにしたいです。

108 :デフォルトの名無しさん:2012/12/08(土) 23:34:47.37 .net
>>107
ttp://www.nag-j.co.jp/fortran/fortran2003/Fortran2003_4_3.html

109 :デフォルトの名無しさん:2012/12/10(月) 21:50:33.71 .net
F2003でいいならprotected属性だな。
F90だったら、privateで隠匿して、値を使うところでは関数・サブルーチンで
値を取ってくるかな。

110 :デフォルトの名無しさん:2012/12/11(火) 12:57:04.37 .net
protected つかわない、つかいたくない、つかえない
という時には他には intent(in) をあちこちに配置して
いちどどこかプログラム内で初期値設定した後は変えないようにする、って
手もあるけどこれは107さんの要望とはマッチしないなぁ。

protected がいちばん素直だとおもう。

111 :デフォルトの名無しさん:2012/12/15(土) 21:23:37.92 .net
もりあがってますね

112 :デフォルトの名無しさん:2012/12/16(日) 16:37:19.87 .net
月に一個くらい質問というかお題投下があって
2週間くらいで20スレいく程度で
まったりと

113 :デフォルトの名無しさん:2012/12/18(火) 04:20:26.48 .net
f90から外部モジュールでf77を呼べますか? つまり固定形式で書かれたコードを外部モジュールで呼べるかってことなんですけど

114 :デフォルトの名無しさん:2012/12/18(火) 14:41:34.63 .net
ん、コンパイル別々にしてリンクすればいいとおもうよん。

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

115 :デフォルトの名無しさん:2012/12/18(火) 14:41:50.10 .net
呼べる。
module f77module

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

固定フォーマットの独立したファイルにして分割コンパイルすればよし。

116 :デフォルトの名無しさん:2012/12/19(水) 01:27:05.28 .net
旧形式のコードて今でも普通に書かれてるの?
仕方なく再利用してるだけで、新しいコードは全部新しい文法で書くべき?

117 :デフォルトの名無しさん:2012/12/19(水) 13:23:10.08 .net
> 旧形式のコードて今でも普通に書かれてるの?
わしゃバリバリ固定書式で書いている。
左7つ開けとかないとムズムズするのでw
> 新しいコードは全部新しい文法で書くべき?
書くべきだとおもう!
思うが・・・・

118 :デフォルトの名無しさん:2012/12/19(水) 17:31:47.38 .net
>>115
おおー、ありがとーございます。

119 :デフォルトの名無しさん:2012/12/20(木) 00:16:24.69 .net
>>114
ということは、その処理をすれば固定形式と自由形式の混在したソースコードも
コンパイルできるということですか?

120 :デフォルトの名無しさん:2012/12/20(木) 00:56:53.25 .net
新しい文法使ってもそれはそれで保守できるかという

自由形式として解釈できない固定形式の文法が継続行の扱いくらいかと

121 :デフォルトの名無しさん:2012/12/20(木) 18:26:13.33 .net
素直に固定形式のファイルと自由形式のファイルと分けた方が良いと思うズラ

f77時代は1個のファイルにまとめた方が、引数チェックや最適化のメリットが
あったが、f90以降は、MODULEとか使えば、分割コンパイルにそれほど害はないズラ

122 :デフォルトの名無しさん:2012/12/21(金) 15:22:10.79 .net
インテルだと
ifort -ipo
でファイルがバラバラでも最適処理してくれるよね。

123 :デフォルトの名無しさん:2012/12/22(土) 20:57:03.97 .net
コンパイラが偉い

124 :デフォルトの名無しさん:2012/12/23(日) 16:26:05.54 .net
>>122 ifort -ipo
インテルの中に
はじめの一歩の
母ちゃんのファンがいるに違いない

125 :デフォルトの名無しさん:2012/12/25(火) 20:09:46.90 .net
年内にインテルFortranの更新来ないのかな?二か月に一回の周期来てんだが。
block..end block を早く入れて欲しいわ。
たまに loop index を局所的に確保したい。頭部の宣言部が重くなりがち。

126 :デフォルトの名無しさん:2013/01/04(金) 12:57:56.98 .net
下記のようなループの外で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 .net
fortran2003のFLUSH命令を使え。

128 :デフォルトの名無しさん:2013/01/04(金) 17:18:02.62 .net
>>127
うぉー!ありがとうございます

129 :デフォルトの名無しさん:2013/01/09(水) 11:54:21.56 .net
linuxでfortran 77のコンパイラってありますか?
gfortranというのを使うらしいのでそれをインストールして試したのですが知人に貰ったfortran 77のコードがコンパイルできませんでした

130 :デフォルトの名無しさん:2013/01/09(水) 12:25:08.67 .net
>>129
gfortranは77に対応していません。

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

個人的にはfortran77をいつまでも使っていないで、
90に書き換えて、折角インストールしたgfortranを使った方が良いと思う。
書き換え方は拡張子を変えるのと、改行の&ぐらいでとりあえずは動くでしょ

131 :デフォルトの名無しさん:2013/01/09(水) 12:36:06.11 .net
>>130
g77でコンパイルできました
ありがとうございます

132 :デフォルトの名無しさん:2013/01/09(水) 17:25:39.34 .net
gfortran って f77 コンパイルできないの?
f90 は f77 完全包括しているし、廃止事項をホントに廃止している
処理系はめったにないからオプション変えれば行けるんでね?
誰かおしへて。

133 :デフォルトの名無しさん:2013/01/10(木) 00:32:04.71 .net
はじめからコードを倍精度で書くのと、コードは単精度でかいて倍精度はコンパイラのオプションに任せるのってどっちがやってる人多いのかな。
後者のメリットはコードがすっきりすることくらいか。

134 :デフォルトの名無しさん:2013/01/10(木) 18:29:17.78 .net
AUTODBLは、べた書きの定数の桁がどう扱われるのかよく分からんとか
微妙な精度の問題が気になってIMPLICIT DOUBLE(A-H,O-Z)に乗り換えたわ。

あと、昔のプログラムだと整数とからんだCOMMONやEQUIVALENCEの整合が狂って
謎な挙動をしたりするから困る。

135 :デフォルトの名無しさん:2013/01/11(金) 01:47:02.97 .net
>>132
g77の拡張機能つかってるコードをそうと知らずにgfortranでコンパイルしようとして互換性ないと勘違いした

136 :デフォルトの名無しさん:2013/01/12(土) 13:32:51.48 .net
>>133
以前、同じことが気になったので、
中くらいの長さ200行ぐらいの単精度コードを手でw 倍精度化したのと、
コンパイルオプションで倍精度化したのを比べたことがある。
gfortran と ifort ではそれぞれで
実行バイナリが冒頭の一部分(コンパイル時刻?)以外は同一だった。
なので自作コードだけなら、違いはないか気にならない程度だとおもう。

third party library で
単精度と倍精度でサブルーチン名が違う場合があるので
その場合にどうなるか、はしらない。

137 :デフォルトの名無しさん:2013/01/12(土) 13:34:36.19 .net
あと、OpenMP で並列化したやつもまったく同じだった。

MPI で並列したやつはまるで駄目だったので
これは泣く泣く手で倍精度に揃えたw

138 :デフォルトの名無しさん:2013/01/12(土) 14:57:23.92 .net
third party というかソースのない、かつ組み込みでない関数/サブルーチンは
変換できないし、規定されていない方の値を渡すと意味不明な挙動になるぞ。

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

MPI はこういうトリックとは関係なく、1要素の大きさを渡すあたりに工夫が要るかと。

139 :デフォルトの名無しさん:2013/01/14(月) 23:43:04.50 .net
知り合いのMPIのコードは倍精度はコンパイルオプションに任せてたな

140 :デフォルトの名無しさん:2013/01/15(火) 12:54:37.70 .net
mpi_float を mpi_double に置き換えてくれるのかな?
MPI で単精度か倍精度が気になるのはその点くらいだよね

141 :デフォルトの名無しさん:2013/02/09(土) 03:59:15.05 .net
emacsのfortranモードについてなのですが、
変数宣言のあとに「::」をつけると、変数名に色がつくのが気に入っています。
ですが、改行すると色わけされません。
解決方法はありますでしょうか?

例、
integer :: i&amp; ←色がつく
  ,j ←色がつかない

142 :デフォルトの名無しさん:2013/02/09(土) 04:25:01.37 .net
>>141
継続行を使わずに2行に分けて書くのはダメなの?
integer :: i
integer :: j

143 :デフォルトの名無しさん:2013/02/09(土) 04:40:54.90 .net
>>142
今はそれで対応しているのですが
なんとなく、同じグループの変数はまとめておきたいなと思いまして・・・

144 :デフォルトの名無しさん:2013/02/09(土) 08:39:18.75 .net
>>141
emacsの事は良く知らないけれど、f90.el内の
;; Variable declarations (avoid the real function call)
の次の行を編集すれば良いのでは?
あとemacsスレの方がレスが付き易いかも知れないね

145 :デフォルトの名無しさん:2013/02/15(金) 04:06:55.05 .net
>>144
返信遅くなってすみません。ありがとうございました。

146 :デフォルトの名無しさん:2013/02/15(金) 11:05:49.33 .net
ずっと、fortran90メインで書いてたけど、Javaを触ってみようと奮闘したら、
訳わからん。書籍も分厚いのに、全部書いてある本ってあるの?少し違う事を
しようとしたら、必ずネットで調べらなあかん。fortranなら簡単に書けるのに。
Javaって新しい言語だから素人にもある程度優しいもんだと思ってたのは間違い
なの?自分がアホなんだろうなあ。プロの人ってすごいなあと、自らのアホさ
加減にへこむ日々。fortranで簡単にGUI使えたらJavaなんて要らないのに。
アホな書き込みすいません。
ああああああああ、だめだw。いらつかない。いらつかない。

147 :デフォルトの名無しさん:2013/02/15(金) 20:00:07.57 .net
Fortranとかいうアホ言語使ってるからそうなるんだ
C++を使いなさい
C++が使えるようになればJavaなんか簡単

148 :デフォルトの名無しさん:2013/02/16(土) 12:55:18.74 .net
GUI 書くのはどの言語でも(記述量はともかく仕様の理解に)手間だろ…。

>>147 ベターCじゃなくて真面目にC++ならな

149 :デフォルトの名無しさん:2013/02/17(日) 23:13:36.88 .net
>>146
なんでやねん
俺にすればJavaの方がFORTRANよりずっと簡単に思えるぞ
C#もだいたい似てる

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

C#はDelphiの流れを受け継いでいるのとJavaやC++の良いとこ取りしている
ある意味卑怯な(?)言語なのでGUIはこれが一番早く完成する

150 :デフォルトの名無しさん:2013/02/21(木) 10:17:06.63 .net
ファイルを読み込んでcharacter型の変数に代入しようとしています。

一行の文字数が不定なときはどうすればいいですか?
あらかじめ要素数をおおきめに用意する以外でおねがいします。

151 :150:2013/02/21(木) 10:35:58.49 .net
コンパイラーはintelの9.0です

あと、intelの非商用のコンパイラってもう配布されてないんですか?

152 :デフォルトの名無しさん:2013/02/21(木) 23:40:21.69 .net
>>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 .net
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 :150:2013/02/22(金) 15:25:21.78 .net
>>152
non commerical で検索したら見つかりました
ありがとうございます

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

intel の最新版はF2003に対応しているみたいなので
そっちを使ってみます

155 :デフォルトの名無しさん:2013/02/22(金) 17:32:58.14 .net
>>154
>は代入するたびにallocateしなおしてるやつですか
そう。大量で負荷が重いなら大きなbufferを取るしかない。

IntelFortranの場合F2003文法はデフォではOFFになっているので
standard-semantics をONにする必要があるかも。
配列の場合
buff = [buff, ch]
で配列要素数を拡張していけるが、この場合はオプション必要。

156 :デフォルトの名無しさん:2013/02/25(月) 11:52:14.65 .net
実行時間を計測することはできると思いますが

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

コンパイラはintelです

157 :デフォルトの名無しさん:2013/02/25(月) 15:41:26.94 .net
Linux なら ps をじっと眺めているw
Windows なら task manager のグラフを眺める。

158 :デフォルトの名無しさん:2013/02/28(木) 02:15:09.70 .net
include文やuse文で読み込むインクルードファイル、モジュールファイルを
別ディレクトリにおいてコンパイルしたいのですが、
インクルードパスの設定方法がわかりません。
コンパイラはifortです。

ifort -I***
***に絶対パスを入れたり、相対パスを入れたりしたのですがダメです。
そもそも、-I/でタブ補完しようとすると
-I/ is not found.と出てきます。
何か別の設定が必要なのでしょうか?
インクルードファイルがあるディレクトリは、カレントディレクトリの中にあります。

159 :デフォルトの名無しさん:2013/02/28(木) 11:49:02.22 .net
fortranの出力指定子でマニアックなものまで全部のってるサイトを教えてもらえないでしょうか

例えば0.005を↓のように出力する指定子を探しています
5.000000000000000-3

160 :デフォルトの名無しさん:2013/03/01(金) 01:51:15.14 .net
>>159
EN(工学用)なら3乗おきに出力できたはず
0.005なら単純に科学系のES記述子でもできる
いつから在るか知らないけど、最近の本(自分が買ったのは5年前)には普通に載ってたよ
Webサイトなら"Fortran 編集記述子"で検索すれば色々出てくるけど、
自分の環境で使える記述子を全部知りたいならコンパイラのリファレンスが一番確実

161 :デフォルトの名無しさん:2013/03/01(金) 17:51:51.58 .net
少しはマニュアル読めよwww

162 :デフォルトの名無しさん:2013/03/02(土) 17:11:35.24 .net
さっき始めたんですがわからないので教えてください
あるモジュールにサブルーチンが二つある時にこの二つのサブルーチンを違うファイルに記述することは出来ますか?
C++でいう名前空間のように分離できるか?ということです

163 :デフォルトの名無しさん:2013/03/04(月) 19:17:12.36 .net
名前空間を分けたいなら、まぁmoduleを二個使え。
USEでエイリアスをつけろ。

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

またFortran2008で導入されるsubmoduleを使う手も考えられる。が、実装している
処理系はまだないと思う。

164 :デフォルトの名無しさん:2013/03/06(水) 03:56:33.28 .net
Fortranのcharacterって文字コード決まってたりする?環境依存?

165 :デフォルトの名無しさん:2013/03/06(水) 15:22:28.31 .net
内部コードは環境依存。
というか昔はIBMのEBCDICこそが本物コードでASCIIは安物ミニコンとかのパチモン文字コードだった。
ANSI FORTRAN77の時に内部コードの他にASCIIコードに対応させる関数が導入されてる。

166 :デフォルトの名無しさん:2013/03/07(木) 16:59:58.06 .net
スレチかもしれないけど

リスト構造を無限ループで回してるところを
openmpで並列化したいんだけどできます?

167 :デフォルトの名無しさん:2013/03/07(木) 18:31:50.73 .net
リスト構造といっても色々あるから答えようもないぜw

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

順序入れ替えが無い線形リスト構造なら、配列に直せば元々高速になるし、
並列化の余地も大いにあると思う。

168 :デフォルトの名無しさん:2013/04/03(水) 15:36:38.02 .net
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 .net
>>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 .net
>>168
'(g20.12e3)'で指数部の桁数を指定するとか

171 :168:2013/04/03(水) 20:10:49.50 .net
>>170
そんな仕様があったのか。知らんかった。

172 :169:2013/04/03(水) 20:12:16.82 .net
ごめんミス。171は169です。

173 :デフォルトの名無しさん:2013/04/22(月) 08:17:30.46 .net
知らない仕様っていっぱいありそう

174 :デフォルトの名無しさん:2013/05/05(日) 23:04:55.44 .net
f90って継続記号は行頭ではなく行末でないといけないんですよね?
例えば、
equation = A&amp;
     + B&amp;
     + C
みたいな式があってCの寄与をみるためにコメントアウトするとき
たまにBの後ろの&amp;をコメントアウトしわすれて面倒だったりしませんか?
絶対文頭につける仕様のほうが便利だと思うんですが・・・。

175 :デフォルトの名無しさん:2013/05/06(月) 08:39:40.01 .net
セミコロンで文末にできた気がする

equation = A&
     + B&
   ; ! + C  B から継続→文末、C の除外

176 :デフォルトの名無しさん:2013/05/08(水) 18:56:23.29 .net
10.000
100.00
1000.0
100000
浮動小数点を上記のように書き出したいのですが
どのように書式を指定すればよろしいでしょうか

177 :デフォルトの名無しさん:2013/05/15(水) 05:10:28.17 .net
>>176
f?.* を使ってください。
?は全体の桁数、*は小数点以下の桁数。

178 :デフォルトの名無しさん:2013/05/15(水) 05:16:35.51 .net
私も質問です。

サブルーチンの引数に配列を使ったときに、実引数と仮引数でサイズのチェックが行われるような書き方、
あるいはコンパイルオプションはありますでしょうか?
例えば、実引数がa(0:imax)で仮引数がb(1:imax)のとき、エラーが出ずにコンパイルが通ってしまうことがあります。
その場合、実行結果がめちゃくちゃになるのにエラーが出ないのでデバッグに苦労しています。
内部サブルーチンのときはコンパイルエラーが出ますよね?
外部サブルーチン、あるいはモジュールでもエラーが出るようにできますでしょうか?

179 :デフォルトの名無しさん:2013/05/15(水) 23:02:48.29 .net
あるプログラム単位は、外部サブルーチンがどんな引数を取るかは知らん。
だから引数の整合性を確認するのは、プログラマの責任だった…のが FORTRAN77

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

ちなみにインテル Fortran なら /warn:interface でうるさく言ってくるようだ。

180 :デフォルトの名無しさん:2013/05/16(木) 03:39:55.72 .net
>>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 .net
つづき、

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

コンパイラはifortです。
できれば、これらのケースでのinterfaceの使い方を教えていただきたいです。

182 :デフォルトの名無しさん:2013/05/17(金) 10:56:33.57 .net
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 :182:2013/05/17(金) 10:57:14.45 .net
(うえのつづきです)

インターフェイスモジュール(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 .net
質問です。 計算の結果を.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 .net
direct access なら内部コードで書かれるんだから当然じゃ

186 :デフォルトの名無しさん:2013/05/17(金) 18:02:03.27 .net
>>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 .net
>>185,>>186
ご指導ありがとうございます。
fortranは初めて触った言語で、これで正しいのか不安だったので助かりました。

188 :デフォルトの名無しさん:2013/05/17(金) 18:29:07.70 .net
direct access は、大量のレコード長(データの長さ)が等しいデータを
書き出しておいて、読み出し/書き換え時に、ランダム位置に直接そのデータを
読みに行くときに使うもの。

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

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

ファイルサイズを小さくかつ高速にアクセスしたいときは、
write文でフォーマットを指定せず、内部表現で読み書きするが、
write(1) x,y

189 :182:2013/05/17(金) 18:52:41.78 .net
>>186
ご指摘ありがとうございます。U島氏の本にて学習中の身です。

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

ひょっとするとまだ、当方が何か見落としているのでしょうか??

190 :デフォルトの名無しさん:2013/05/17(金) 19:57:06.24 .net
>>189
手元にFTN95の環境が無いので何とも言えないが、
gfortranで行くならftn95の問題かもしれない。

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

まぁサブルーチンをmoduleに入れた方がinterfaceも要らないし楽だと思うが。

191 :HIROSHI:2013/05/19(日) 23:30:26.19 .net
COMPAQ VISUAL FORTRAN6.6が WIN7 32 HOMEで起動しなくなりました。WIN32 PROでも起動しないことが他にあるのですが、しつこく起動することで使える状態です。
そこであきらめてDOSプロンプトでコンパイル しようと考えています。MAIN.F SUB1.F SUB2.Fのテキスト文がある場合のリンクの方法をお教えください。コピペでまとめてやればいいのですが
細かく ライブラリ化(というのですか) していきたいもので よろしくお願いします。
具体的に 例文で書いてもらったら助かります。

192 :デフォルトの名無しさん:2013/05/20(月) 16:32:18.84 .net
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 .net
>>186
180です。結局、人間がチェックしないとダメみたいですね。
ありがとうございました。

194 :デフォルトの名無しさん:2013/05/21(火) 15:15:10.76 .net
>>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 .net
4バイト整数の変数が,4バイトを超えたときエラーにならず変な値(マイナスになるはずのない値がマイナス)でそのまま計算が進んでしまいます。
プログラムのどのあたりで超えるか知りたいので,エラーで終了するようにするオプション又はデバッグオプションなどありませんか?

コンパイラ : intel fortran version 12 (CentOS 5)

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

gfortranとかfreeのfortranも含めて
コンパイラオプションの説明を、便器を舐めるように注意深く読んで見るといいのではないか。

197 :デフォルトの名無しさん:2013/05/23(木) 17:36:14.83 .net
>>196
一応ifortのhelpでは,"整数"で検索かけてみたんですが,使える物はとくにありませんでした.
目視で全文確認してみます.
ありがとうございました.

198 :デフォルトの名無しさん:2013/05/24(金) 03:07:21.20 .net
貰い物の古いコードが、グローバル変数をCOMMON文でインクルードしている形式なのですが、
そこのCOMMON文に新しく変数を付け足したところ、
>COMMON のために、オブジェクトのアライメントが型と一致していません
>パフォーマンスに影響を与える可能性があります。
という警告が出ました。
変数の付け足す位置を変えたら出なくなったのですが、どういう意味かわかる方いらっしゃいますか?

199 :デフォルトの名無しさん:2013/05/24(金) 16:05:35.20 .net
>>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 .net
はじめまして、こんにちは
現在、フォートランで数値計算をするプログラムを作っています。
今日、プログラム内で使っている配列のサイズを極端に大きくしたところ、スタックオーバーフローというエラーになりました。

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

また、これ以外の方法で、皆さんならどのようにオーバーフローを回避しますか?

201 :デフォルトの名無しさん:2013/05/28(火) 14:05:42.30 .net
>>200
サブルーチンとか関数で大きく確保しようとしたんだろ?

allocatableで確保すれば、ヒープ領域に取られるのでだいじょぶ。

202 :デフォルトの名無しさん:2013/05/30(木) 12:08:48.19 .net
次のようなデータをファイルから読み込みたいのですが,read文と書式をどう書けばよいか教えてください.

データの並びは
(親核種)(娘核種)(娘核種の比率)(孫核種)(孫核種の比率)(ひ孫核種)(ひ孫核種の比率)…
となっており,何世代まで子孫の核種があるかはファイルを読むまで分からないとします.

203 :202:2013/05/30(木) 12:11:04.67 .net
---------データの例(はじまり)-------------
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 .net
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 .net
>>204
結構めんどい。
1.任意の桁数の小数を読む最も楽な方法は、自由形式を使うことで、
空白とかコンマが区切りに入っていれば自動で切り分けてくれる。

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

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


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

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

Fortran2003/08なら、もう少し柔軟なIOできるかもしれない。

206 :デフォルトの名無しさん:2013/05/30(木) 19:03:15.49 .net
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 .net
実行結果

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 :202:2013/05/31(金) 21:54:18.32 .net
すばらしいです!ありがとうございました.

実は,自分もほぼ丸一日試行錯誤した末にできたのですが,
なぜ自分のプログラムがうまく動くのか説明できません.
教えてもらった方法をこれから読んで勉強しようと思います.

209 :デフォルトの名無しさん:2013/06/11(火) 09:28:34.46 .net
gfortranで通常の宣言型を超えて桁数の上限なしの計算をしたいのですが、

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

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

質問2)他にもっと多倍数演算に向いたツールはありますか? 

210 :デフォルトの名無しさん:2013/06/11(火) 19:54:51.69 .net
質問です学校で COMMAND入力に「XX<YY.dat」という操作をしたのですがどういう意味でしょうか?

211 :デフォルトの名無しさん:2013/06/11(火) 20:48:28.96 .net
>210

XXというプログラムにYY.datというデータを入力したと
いうことです。
XX>YY.datとすると、XXというプログラムの出力を
YY.datというファイルに出力することを意味します。

212 :デフォルトの名無しさん:2013/06/12(水) 15:25:51.17 .net
>>209
FMLIBかMPFUNでいいんでね?
Fortranで書かれてるし。

213 :デフォルトの名無しさん:2013/06/15(土) 12:45:05.08 .net
>>212
FMLIBにて成功しました。ありがとう。
今までintegerしか多倍数演算できなかったんだけど、FMLIBのほうがいい。

214 :デフォルトの名無しさん:2013/06/17(月) 11:48:46.18 .net
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 .net
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 .net
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 .net
>>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 .net
最近の大学では数値計算+Fortranの教科書は何を使ってるんだい?
コンピュータの数値計算一切やらないまま入ってくる学生がいて自習してほしいんだが
ヤングに嫌がられないお勧めあるかね?

219 :デフォルトの名無しさん:2013/07/05(金) NY:AN:NY.AN .net
ナウいヤング向けの言語はJavaとかか

220 :デフォルトの名無しさん:2013/07/11(木) NY:AN:NY.AN .net
自由端反射のプログラムで質問です。
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 .net
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 .net
というプログラムを出力した結果たしか
1. 0. 0.00223
1. 1. 1.4848
ってなって最初fを全部0にしたのにf(3.2)が1.4848となります、何が悪いでしょうか?

223 :デフォルトの名無しさん:2013/07/12(金) NY:AN:NY.AN .net
>>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!.net
openmp を使って並列化しようと思ってるんですが、スレッドセーフな副プログラムを作るのに気をつけるのってどういう点ですか?
save と common を使わなければいいだけでしょうか。
save を避けなければならないばあい、擬似乱数のように前の状態を保存しておかなければならないような副プログラムはどうやって作ったらいいでしょうか。

225 :デフォルトの名無しさん:2013/08/04(日) NY:AN:NY.AN .net
引数で前の状態を渡し、引数に次の状態を戻す
呼び出し元スレッドと内容を共有するので、実引数は
private なのか share なのか明らかにすること

226 :デフォルトの名無しさん:2013/08/04(日) NY:AN:NY.AN ID:zEmYUazP!.net
なるほど。ありがとうございます。

227 :デフォルトの名無しさん:2013/08/05(月) NY:AN:NY.AN .net
OpenMPとの整合はよく分からんが、F95以降では
pure接頭子で依存性の無さを保証できる。
というかコンパイラがチェックしてくれる。

228 :デフォルトの名無しさん:2013/08/06(火) NY:AN:NY.AN .net
Visual Basicで下記のバイナリ出力したグリッドをfortranで読み込ませようとしてますが,
できません.input statement requires too much data, unit 10
とでます.

229 :デフォルトの名無しさん:2013/08/06(火) NY:AN:NY.AN .net
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 .net
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 .net
VBの事は、よく分からんが、少なくともFortran側でnheaderとnfooterを読むか
読み飛ばすかしないと、つじつまが合わないだろう。

いきなりエラーが出るなら、nheaderのintegerを三個の倍精度で読もうとして
要素が足りないと叱られたと思われる。
バイナリだとずれたまま読みそうな気もするが・・・

232 :デフォルトの名無しさん:2013/08/06(火) NY:AN:NY.AN .net
unformatted で sequential なファイルは次のレコード(記録)の組を飛ばすのに
何バイト読み進めればいいかを各レコードの前後に整数値として記録しているらしい
レコードは1文の read/write で扱われる単位とみていいはず
(このせいで妙にファイルサイズが膨らんだりする)

>>229 nheader と nfooter の値を確認

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

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

よく分かんないんだったら、素直に書式付とかCVS形式とかで出して
読むのが吉。

234 :デフォルトの名無しさん:2013/08/09(金) NY:AN:NY.AN .net
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 .net
internal compilation error って要するにコンパイラーのバグなんじゃ…

236 :デフォルトの名無しさん:2013/08/28(水) NY:AN:NY.AN .net
初心者というか入り口にすら立ってないため質問させていただきます。

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

みなさん、g95はどこから入手されているのでしょうか?
それともg95-MingW.exeが消されたのには何か理由があるのでしょうか?

237 :デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN .net
g95は最近メンテされてないから、gFortranでいけ。
たぶん大丈夫。

238 :デフォルトの名無しさん:2013/09/10(火) 14:58:43.49 .net
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 .net
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 .net
なんだどうした?

241 :デフォルトの名無しさん:2013/09/26(木) 12:57:51.56 .net
pointer(pvar,var(*))
これってどういう意図ですか?

242 :デフォルトの名無しさん:2013/09/26(木) 13:30:22.80 .net
メモリポインタ

243 :デフォルトの名無しさん:2013/09/26(木) 22:50:44.43 .net
それはクレイ・ポインタと呼ばれるもので、クレイのFortranにあった非標準命令。
だがクレイが普及していたアメリカでは準標準みたいになったので、いまでも結構多くのFortranで使える。

まぁFortran2003の命令で、(工夫すれば)置き換え可能なので、もうあまり使われない。
POINTER (pointer, pointee)
ポインタ(整数変数)にはポイントされるもの(pointee)の番地が入るようになる。

244 :デフォルトの名無しさん:2013/10/01(火) 12:17:05.23 .net
>>243
ありがとうございます。

Fortran77では
pointer()もmalloc()も非標準ということですか?

245 :デフォルトの名無しさん:2013/10/02(水) 00:38:14.04 .net
>>244
両方非標準。

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

そのプログラムが書かれた対象マシンが分かるなら、ググればそれ用のFORTRAN77のリファレンス・マニュアルが落ちていると思う。

246 :デフォルトの名無しさん:2013/10/08(火) 10:10:31.65 .net
>>245
遅くなりましたが、
ありがとうございます

247 :デフォルトの名無しさん:2013/10/13(日) 00:13:41.19 .net
77で書いてあるプログラムが今のコンパイラで動くようにデバックしているのですが
common文で宣言している変数をmoduleでグローバル変数に変えたら、equivalence文でエラーが出てしまいます。
そこでこのequivalence文のところを変えようと思うのですが、90/95ので代わりとなる構文ってありますか?

248 :デフォルトの名無しさん:2013/10/13(日) 01:48:53.15 .net
>>247
直接の代替はない。
Fortran90/95で推奨されているEQUIVALENCEの代替は、TRANSFER関数でメモリー内容を別メモリーに
移せというもの。EQUIVALENCEのメモリー共有とは違い、二つの変数間の型変換を伴わない内容の代入にあたる。

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

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


なおFORTRAN77はFortran90に完全に含まれているので、今のコンパイラでも多少のオプション変更で書き直さなくても動くはず。

249 :デフォルトの名無しさん:2013/10/13(日) 13:51:31.72 .net
>>248
ありがとうございます!
コード書き換えすのは止めてもう少しオプションいじくってみます。

250 :デフォルトの名無しさん:2013/10/15(火) 22:40:32.54 .net
初期値も何も与えてない変数の値って0ですよね?
それが0ではなくとてつもなくおおきな値になることってありますか?

251 :デフォルトの名無しさん:2013/10/15(火) 22:51:06.34 .net
いいえ
はい

252 :デフォルトの名無しさん:2013/10/15(火) 23:17:41.03 .net
>>251
まじっすか

253 :デフォルトの名無しさん:2013/10/16(水) 01:37:15.62 .net
変数がゼロになってるなんて思ってたのかよw
コップや皿を洗わないで飲み食いするタイプか?

254 :デフォルトの名無しさん:2013/10/16(水) 01:42:01.37 .net
規格上は不定らしいよ。
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 .net
初心者スレだったか、めんごめんご、すまんこ、おまんこ。

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

今もリンカのオプションでゼロクリアできるものが多い。

256 :デフォルトの名無しさん:2013/10/16(水) 23:48:35.58 .net
なるほろ〜不定なんですね。

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

オプションで0クリアにしたらうごくかもしれません。ありがとうございました。

257 :デフォルトの名無しさん:2013/11/07(木) 23:56:00.54 .net


258 :デフォルトの名無しさん:2013/11/08(金) 11:47:40.89 .net
デバッグしているのですが
THDFEというサブルーチンで仮引数(x)を動的割付け配列で宣言し直したところ

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

とエラーが出たんですが。意味がわかりません。詳しく教えて下さいm(__)m

259 :デフォルトの名無しさん:2013/11/09(土) 00:08:06.89 .net
この質問じゃ情報少なすぎ。
せめてエラーメッセージそのものを貼るべき。

まぁ呼び出し側の配列が、割り付け属性を持っていないという程度の誤りだろう。

260 :デフォルトの名無しさん:2013/11/09(土) 10:26:20.66 .net
>>259
”THDFEにおいて存在しないもしくは誤った引数仕様ブロックです。ー仮引数x(第三番目)は割付け配列です。”
一応これがエラーメッセージそのものなんです。

>>まぁ呼び出し側の配列が、割り付け属性を持っていないという程度の誤りだろう。
THDFEは外部副プログラムなんですが。このブロックでの仮引数は割付属性を持たないってことでいいんでしょうか?

261 :デフォルトの名無しさん:2013/11/09(土) 13:01:13.70 .net
それはエラーメッセージそのものじゃないだろ。
エラー番号とか全部込々で貼れよ。
質問の仕方が悪いといつまでも答えが出ないぞ。

大体、サブルーチン側で文句を言われているのか、呼び出し側で文句を言われているのか
それすら判然としないだろ。

262 :デフォルトの名無しさん:2013/11/09(土) 16:41:00.84 .net
>>261
すみません・・・

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

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

サブルーチン(THDFE)側のほうでエラーメッセージがでます。

263 :デフォルトの名無しさん:2013/11/09(土) 19:18:40.37 .net
>>262
interface文を書いてないとか?
それと仮引数に割り付け配列を指定できるのはFortran2003以降のはず。
Fortran95の拡張仕様TR15581をコンパイラがサポートしていれば問題ないけど。

264 :デフォルトの名無しさん:2013/11/09(土) 19:54:41.21 .net
>>263
コンパイラはfortranbuilder5.3.1でfortran2003にも対応しています。
integerface文を加えれば問題ないでしょうか?

265 :デフォルトの名無しさん:2013/11/09(土) 20:33:20.29 .net
integerfaceじゃなくてinterfaceなw

266 :デフォルトの名無しさん:2013/11/09(土) 21:14:09.73 .net
>>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 .net
>>265
ほんとだww interfaceってうったつもりだったのにww
>>266
そうします。ありがとうございました!

268 :デフォルトの名無しさん:2013/11/10(日) 00:04:41.77 .net
interface 書くより、サブルーチンをmoduleに入れたほうが楽でいいぞ。

269 :デフォルトの名無しさん:2013/11/10(日) 00:13:46.52 .net
スレ違いかもしれないけど、とあるf77プログラムのクローンを作りたいのだけど、
どこまでやれば別のプログラムと認められるんだろう?
入出力仕様や数式まで立ち帰って、スクラッチから書けば完璧なんだろうけど、
作業量的に厳しいというのが本音。
固定形式から自由形式に書き換えた程度じゃダメかな。
参考になるようなサイトとか有れば教えてください。

270 :デフォルトの名無しさん:2013/11/10(日) 00:23:01.23 .net
引用とか数行とかの範疇を超えて、見ながら書いたのなら原型を留めてなくても派生物じゃね?
極端な話他言語に移植しても、ロジックが同じなら派生物

271 :デフォルトの名無しさん:2013/11/10(日) 00:28:13.72 .net
横からすまんが、Intel Fortranではソース・ファイルの拡張子は、
固定形式が.fないし.forで、自由形式は.f90になっていて、
.f95とか.f03とかは、存在が間違っているとされているんだが、
ホントのとこはどうなの?

272 :デフォルトの名無しさん:2013/11/10(日) 00:35:04.17 .net
>>271
Intel Fortran compiler 14.0のリファレンスではそうなっている。

273 :デフォルトの名無しさん:2013/11/10(日) 02:11:25.87 .net
>>272
intel がそうなっているのは知っているが、実際はどうなのか?
他のベンダーはどうなのかね?

274 :デフォルトの名無しさん:2013/11/10(日) 07:18:49.19 .net
>>273
言語仕様では拡張子は規定していないのでコンパイラ依存。

275 :デフォルトの名無しさん:2013/11/10(日) 19:10:31.00 .net
すみません、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 .net
なお、コードは以下になります。
どうぞよろしくお願い致します。

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

>>275
実数型と整数型だと、メモリの使い方が違うから、
実数型は入っている領域(の一部)を整数型で解釈しても、
実数型で入れた値にはなりません。という説明で良いのかな。

278 :デフォルトの名無しさん:2013/11/10(日) 23:29:50.05 .net
>>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 .net
[ ]はFortran2003、F90/95なら(/ /)で。配列構成子(array constructor)

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

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

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

単精度実数なら他に単にFORMATを実数用にして強行突破する方法も考えられる。
倍精度の時は難しいかな??

280 :デフォルトの名無しさん:2013/11/14(木) 00:03:06.56 .net
Fortran2015に関するまとめサイトとかないかね?
今度は何を付け加えるのさ?

281 :デフォルトの名無しさん:2013/11/19(火) 00:19:07.21 .net
すんません。
数値計算する際、expとかの値が大きすぎたり、小さすぎたりしてオーバーフローしたり、exp(x)のx が限りなくゼロに近い時とか、欲しい値が得られません。
みんなはどうやって回避してますか?

よくよく考えたらexp1000 とかオーバーフローしますよね。

282 :デフォルトの名無しさん:2013/11/19(火) 10:23:13.29 .net
ここの人はフォートランはわからないから他いけ

283 :デフォルトの名無しさん:2013/11/19(火) 18:58:29.45 .net
>>281
精度の問題がないなら対数を取って計算すればいいじゃない
というか、それは浮動小数点演算の本質的な問題だから
まず数値計算の基礎を勉強することをお勧めする

284 :デフォルトの名無しさん:2013/11/19(火) 19:01:27.99 .net
書き込んでから気付いたが、もしexp(1000)の値を実際に表示したいのなら
多倍長計算とかしかないな

285 :デフォルトの名無しさん:2013/11/19(火) 23:54:23.18 .net
>>283
何がオススメですか?参考書的なもので。
ちなみにプランク関数とか値がどでかい物やらプランク定数のようなちっこいものまぜまぜして計算することが多いので困ってます。やはり対数でやるべき?

286 :デフォルトの名無しさん:2013/11/21(木) 22:58:26.48 .net
プランク常数とか絡むなら、それを1に規格化して計算するのが常識だろ。
まず少し基礎的な本から読め。

287 :デフォルトの名無しさん:2013/11/23(土) 22:34:38.75 .net
みんなどんな環境でやってるんだろ
Cygwin+Emacs?

288 :デフォルトの名無しさん:2013/11/24(日) 13:01:18.20 .net
コマンドプロンプト+メモ帳 まじで

289 :デフォルトの名無しさん:2013/11/24(日) 17:24:01.41 .net
>>286
え?そうなんですか?
だからその基本的な本というのを紹介してくれませんか?

フォートランの本

290 :デフォルトの名無しさん:2013/11/24(日) 17:42:02.66 .net
>>289
言語の本より数値計算(数学)の本のがいいんでないか?

291 :デフォルトの名無しさん:2013/11/26(火) 01:02:17.85 .net
>>289
伊理正夫の「数値計算の常識」の中に無次元化の章があったはず。
大した事書いてないが常識として程度は知っておくべき。
大体、無次元化していないと、素人・非常識・DQN・支那チョン・ごみ・カス・クズ扱いされる。

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


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

まぁ今ではエネルギーの単位をハートリーでなくてリードベルグに取ることが多い気もするが。
クーロン項の分子が1になるか2になるかの違いだ。

292 :デフォルトの名無しさん:2013/11/27(水) 07:09:22.09 .net
>>291
うぉぉ。。。ありがとうございます。
かなり貴重なお話しです。
まずは「数値計算の常識」買ってみます。

293 :デフォルトの名無しさん:2013/12/31(火) 13:22:54.27 .net
データから近似式を出すソフトみたいのないですかね?できればフリーで。
Fitykではなんだかできなかった…

294 :デフォルトの名無しさん:2014/01/01(水) 00:01:57.16 .net
それはFORTRANスレで聞く内容じゃない

295 :デフォルトの名無しさん:2014/01/01(水) 02:29:24.68 .net
>>294
どこで聞けばいいの?
わからないならレスしないであげれば?、

296 :デフォルトの名無しさん:2014/01/01(水) 12:29:00.04 .net
>>295
何でそう思ったの?

297 :デフォルトの名無しさん:2014/01/01(水) 15:03:32.78 .net
294ではないがプログラム板でフリーソフトのFitykを比較対象にするのは板違いでは?
「関数近似のFORTRANライブラリはありませんか?」ならわかるが
質問内容からすると自分でプログラムを作りたいのではなさそうだが

298 :デフォルトの名無しさん:2014/01/03(金) 08:15:54.32 .net
>>297
すんません、質問者です。
スレ違いなのはわかるんですが、学術的用途に精通してそうな人間が集まる板というかスレ住人が、フォートランスレに1番多いと考えたので質問しました。
今回は目をつむって、近似式出すソフトウェアってなんでしょうか?の質問に答えていただけたら幸いです

299 :デフォルトの名無しさん:2014/01/03(金) 11:47:30.77 .net
君が欲しいソフトは無いよ
どの関数で近似するかは人間が決めること
ソフトが決めることではない

300 :デフォルトの名無しさん:2014/01/03(金) 15:49:36.03 .net
Excelでやれば?あれで十分じゃない。

301 :デフォルトの名無しさん:2014/01/04(土) 13:39:47.75 .net
gnuplot 使ってやったことありますがどうでしょう?私がやったのは多項式だけですが任意の関数に対してフィッティングできるようです。

302 :デフォルトの名無しさん:2014/01/04(土) 16:39:19.25 .net
>301
gnuplotでは,splineとbezier補間してグラフを画く
機能がありますが,それ以外に任意の函数のフィッテイング
機能ってありますか?

303 :デフォルトの名無しさん:2014/01/04(土) 16:43:44.90 .net
>>302
>>301にできるって書いてあるじゃん

304 :デフォルトの名無しさん:2014/01/10(金) 10:31:33.86 .net
正月早々下層階級出身の発達障害みたいなのが湧いたなw

アスペ野郎は、よそのスレに行けよ、HaskellスレとかMLスレに行けば仲間がいっぱいいるぞ。
ここは毎年この時期は卒業研究で焦りまくった学生さんの駆け込み寺なんだからさ。

305 :デフォルトの名無しさん:2014/01/12(日) 15:17:29.69 .net
だなwスレタイくらいは読めよと

306 :デフォルトの名無しさん:2014/01/14(火) 01:43:43.02 .net
ちょっとお聞きしたいのですが、
読み込むファイルの数値データが"〜〜"のダブルクオーテーションで囲まれているのですが、
これを文字列でなく数値で読み込むことはできないでしょうか?
ファイルの"をすべて消すことも考えたのですが、文字列として読み込みたいところもあるので避けたいです
すいませんがよろしくお願いします。

307 :デフォルトの名無しさん:2014/01/14(火) 06:48:50.39 .net
一度文字列として読み込んで、その文字列から数値として読み込む
例えばこんな感じ(valueが数値の変数、cvalueが文字列の変数)
read(*,*) cvalue
read(cvalue,*) value

308 :デフォルトの名無しさん:2014/01/14(火) 19:51:34.68 .net
>>307
早速のレスありがとうございました
ためさせていただこうと思います

309 :デフォルトの名無しさん:2014/01/18(土) 11:40:25.48 .net
すいませんがご教示ください
integer,dimension(99999,20000000)::aaの配列でifortでコンパイルしようとすると
再配置がオーバーフローしないように切り詰められました
と出ます。配列の数を小さくするとコンパイルできます。
配列が大きいから出ているエラーと思うのですが、なにか対策はないでしょうか。よろしくお願いします。

310 :309:2014/01/18(土) 12:21:08.98 .net
スレを読み直してallocatableを使うことでコンパイルはできました。
すいませんありがとうございました

311 :デフォルトの名無しさん:2014/01/18(土) 13:05:10.95 .net
乙 俺も勉強になった

312 :デフォルトの名無しさん:2014/01/20(月) 21:57:41.73 .net
すみませんが、ちょっと教えてください。
Intel MKLのpardisoで、LU分解後のLとUを取り出すためにはどうしたらいいのでしょうか?

313 :デフォルトの名無しさん:2014/01/21(火) 18:52:17.93 .net
すみません。セグメンテーション違反って何ですか?

314 :デフォルトの名無しさん:2014/01/21(火) 21:15:53.71 .net
OSがゴミってこと

315 :デフォルトの名無しさん:2014/01/30(木) 21:30:13.25 .net
G95をダウンロードしたいのですが、
Windows版のFTPでは、
530 Login authentication failed
(認証に失敗)
とでるのですが、どこで認証を得られるのでしょうか。

316 :デフォルトの名無しさん:2014/01/30(木) 22:40:27.48 .net
httpじゃ何か問題あったの

317 :デフォルトの名無しさん:2014/01/31(金) 00:41:23.05 .net
>316
httpではウンともスンとも言わないのです。
画面がフリーズしたままなので

318 :デフォルトの名無しさん:2014/01/31(金) 01:31:57.39 .net
>>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 .net
>318
御教示ありがとうございます。
gfortranをダウンロードして使うことにします。

320 :デフォルトの名無しさん:2014/02/03(月) 00:35:08.25 .net
上の方に無次元化の話が出ていましたが、これって数値計算の本ならちゃんと説明されているものですか?
ネットで検索してもあまりヒットしないし、あったとしてもやり方だけでそうする理由はあまり説明されていない気がします。

自分は先輩から教えてもらって初めて知りましたが、周りには知らない人が結構多いです。
伝統芸能の世界じゃないけど、「数値計算のテクニックは見て覚えろ」みたいな風潮を感じています。
とりあえず自分も「数値計算の常識」買ってみます。

321 :デフォルトの名無しさん:2014/02/03(月) 01:43:43.76 .net
数値計算にかぎらず、適切なスケールで物理量を無次元化すると表式がすっきりするから、けっこう使われてるよ。

原子の議論をするときはオングストロームを使う、天文の議論をするときは光年を使う、つまり「対象に合わせた物差しを使いましょう」という程度の話だから、詳しく説明するほどのことではないかも。
「数値計算の常識」でも1ページくらいしか触れてなかった気がする。

322 :デフォルトの名無しさん:2014/02/03(月) 02:32:24.50 .net
でも、無次元化で数式を簡単にすることと、規格化をして数値誤差を防ぐことは別の話ではないのですか?
自分はこのへんの理解がまだ曖昧です。

数値計算系の研究室なので、無次元することが常識なのはよく知っていますが、
ちゃんと教えてもらったことは一度もないです。
自分で書いたコードをたまたま先輩が見る機会があって、そのときに指摘されて知りました。
他の人はどこでそういう常識を知っていったのかが気になります。

323 :デフォルトの名無しさん:2014/02/03(月) 02:41:03.77 .net
他にも数値計算のデバッグテクニックとか先輩から教えてもらう機会はあるんですけど
ちゃんとした理論がよくわかってないのでとりあえずやってる状態なんですよね・・・
本でちゃんと勉強したいんですが、そういうのが書いてあるものが見つからないし。

愚痴ばっかですみません。スレ汚し失礼しました。

324 :デフォルトの名無しさん:2014/02/03(月) 20:33:23.17 .net
あ、ごめん。見なおしたら、「数値計算の常識」では6,7ページくらい使って説明されてたわ。

どこで学んだかと言われると、たしかによくわからない。
口伝かな。

325 :デフォルトの名無しさん:2014/02/03(月) 22:40:36.33 .net
そうですか!とりあえず買ってみます。

326 :デフォルトの名無しさん:2014/02/05(水) 01:20:23.89 .net
物理の本では無次元化が必ず出てくるぞ。
量子力学とか割と基礎的なテキストで。

桁落ちのことを考えると、すべての量のオーダーがそろった方がいいしな。

327 :デフォルトの名無しさん:2014/02/23(日) 23:46:00.03 .net
すみませんが教えていただけないでしょうか

うろ覚えの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 .net
OSはLinuxか?
ライブラリかなんかの整合が取れていない気がする。

329 :デフォルトの名無しさん:2014/02/24(月) 01:05:53.35 .net
プログラム自体の問題ではなく、実行ファイルが不正な命令を実行しようとしたのが原因。
それがコンパイラのバグなのか、コンパイラオプションや実行環境の問題なのかはわからん。

330 :327:2014/02/24(月) 12:18:08.81 .net
>>328-329
レスありがとうございます
OSはXPでコンパイラオプションは
-oだけ使ってます

文法の間違いでないと分かって
とりあえずひと安心しました
インストールしなおしとか旧バージョン
使うとかしてみます
たいへんどうもありがとうございました

331 :デフォルトの名無しさん:2014/02/24(月) 12:46:33.66 .net
>327

gfortranで実行したら、

2.0000000000000000

と結果がでてきましたよ

332 :327:2014/02/24(月) 22:42:53.37 .net
>>331
dです
もしよろしかったら、OSとコンパイラのバージョン、
コンパイル・オプション等教えていただけたら嬉しいです

333 :デフォルトの名無しさん:2014/02/25(火) 00:34:40.34 .net
>332

GNU Fortran 4.7.3
Windows 7 64bit
optionなし
です。

334 :332:2014/02/25(火) 01:16:16.64 .net
>>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 .net
もう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 .net
LAPACK用の95用 INTERFACE MODULEは公式であったろ。NETLIB無間地獄を探せw

337 :デフォルトの名無しさん:2014/02/25(火) 09:23:01.24 .net
>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 :334:2014/02/26(水) 21:39:32.88 .net
>>337
お手数おかけしてすみません
やっぱ私の環境がダメすぎってことみたいですねorz

あれから再インストールをしてみたのですが同じエラーがでてまして、
それで、インストール時の環境を変えてみるか、それかバージョンを落としてみるか
してみようと思ってます
うまく行ったらお礼がてら報告したいと思います
たいへんどうもありがとうございました

339 :デフォルトの名無しさん:2014/02/27(木) 00:16:02.97 .net
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 .net
あー書き込みたい

341 :デフォルトの名無しさん:2014/02/27(木) 22:19:15.92 .net
>>335
インテルなら use lapack95 を implicit none の前の行に足し
mkl_lapack95_lp64.lib をコンパイルに足したまえ

ぶっちゃけ interface 書かなくとも呼べる。引数チェックは無論効かないが

342 :デフォルトの名無しさん:2014/02/27(木) 22:23:14.15 .net
>>341 に追加
って総称名じゃなく個別名か

ならば include 'mkl_lapack.fi' で解決する
interface 定義がここに全部書いてある

343 :338:2014/02/27(木) 23:05:41.71 .net
>>339
レスdです
実は私もそこのを使ってエラってたのですが、でもおかげ様で
「他のサイトから落としたファイルならうまく行くかも」、
ってことに思いいたりました

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

 完動です!!!!

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

たいへんどうもありがとうございました

344 :デフォルトの名無しさん:2014/02/28(金) 01:11:13.40 .net
>343
無事出来てよかったですね!
それにしても、Fortran IVとか、Fortran 77では、せいぜい
2倍長演算しかできなかったのですが、いまでは、4倍長演算
がらくらくできるのですから、隔世の感があります。

345 :デフォルトの名無しさん:2014/02/28(金) 01:24:15.95 .net
Debian 32bit版に gfortran 入れて数値計算してるんですが、配列って2gb までしか割り当てられないのでしょうか?

346 :デフォルトの名無しさん:2014/02/28(金) 20:13:18.20 .net
>>345
32bit版ならできないと思いますよー

347 :デフォルトの名無しさん:2014/02/28(金) 21:27:17.52 .net
>>344
ありがとうございます!
猫に小判って言われないようがんばりますw

348 :デフォルトの名無しさん:2014/03/01(土) 01:45:11.84 .net
4倍長はソフトウェアで計算しているから10倍以上遅いから
むやみに初心者には教えんなw

349 :デフォルトの名無しさん:2014/03/01(土) 05:45:52.65 .net
>336 >341->342
遅くなりましたがレスありがとうございます!
Intelさんの優しさが五臓六腑に染みますわあ

350 :デフォルトの名無しさん:2014/03/01(土) 17:12:18.11 .net
>>346
ありがとうございます。
やはり64bitにするしかなさそうですね。
いちいちdeallocateするの大変なのでw

351 :デフォルトの名無しさん:2014/03/02(日) 15:54:25.99 .net
OS&コンパイラ64bit版にしても、静的な配列は2Gまでだったりすることが多いから、
よく調べた方がいいぞ。むろん動的には2Gを超えて確保できるが。

これは手抜きではなく、まだ整数のデフォは32bitだし、単精度実数とデフォ整数
長さを合わせるという約束とかもあるから色々全体整合で仕方ない事情がある。

352 :デフォルトの名無しさん:2014/03/03(月) 02:46:29.22 .net
>>351
うーん、難しい話ですね。
単純に64bitにしたからって載せてるメモリフルフルで使えるわけではないってことですね?

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

和書だとあまりフォートランに関して詳しい解説本(オプションやらテクニック的なもの)が少ない気がするのですが、何かオススメありますか?

353 :デフォルトの名無しさん:2014/03/04(火) 23:40:05.16 .net
昔は西村恕彦が粘着していたが、その後は粘着いないね。
・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 .net
>>350 プログラム終了までほっといていいなら deallocate 不要
サブルーチンで宣言した非 save の allocatable は
サブルーチン抜けると勝手に deallocate したかと

355 :デフォルトの名無しさん:2014/03/07(金) 02:00:33.33 .net
>>354
ん???どういうことでつか?
a.out 実行すると、エラーおきまつよ?

356 :デフォルトの名無しさん:2014/03/08(土) 00:26:57.93 .net
Fortran90 からずっと 6.3.3.1 Deallocation of allocatable arrays で述べてる
return または end で手続きの実行が終了したとき、その手続きの局所変数は deallocate されると

allocate 時の問題じゃないことは当然確認したね?コードうp

357 :デフォルトの名無しさん:2014/03/08(土) 00:46:31.22 .net
>>356
むっちゃコード長いプラスモジュール化してるんでつけどOKでつか?

358 :デフォルトの名無しさん:2014/03/08(土) 02:56:59.79 .net
>>356
あれ自動DeallocationはFortran95からじゃなかったっけ?
おれF90時代に、ベンダー依存の解放エラーに悩まされた記憶がある。

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

まぁ今時F90コンパイラ使っていないと思うが、>>357さんは念のため
調べた方がいいな。

359 :デフォルトの名無しさん:2014/03/09(日) 00:53:32.50 .net
仕様にあるから…ってもベンダ依存はしゃーないか
http://www.nag.co.uk/sc22wg5/links.html

だがモジュール変数は解放されない
あとむしろそういうコード解析できる機会ないからくれるなら是非
公開したこと他の奴に怒られる事態になっても知らないけど

360 :デフォルトの名無しさん:2014/03/09(日) 03:31:03.92 .net
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.net
保守

コンパイラ任せでなく、Fortran 言語の範疇で、まともに
高速化を考える人間ってどれくらいいるのだろうか

362 :デフォルトの名無しさん:2014/03/25(火) 07:28:56.11 ID:mXzRLR6s.net
>>361
そうしたいんですけどねぇ。。。
その前にまずはコンパイラを通すことが出来るってとこまでで必死ですよ。

なーんかいい本ないですかね?

363 :デフォルトの名無しさん:2014/03/25(火) 21:47:05.41 ID:jjQiXJR+.net
とりあえず文法は 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.net
国内でFortran使ってる人口がそもそも少なそう

365 :デフォルトの名無しさん:2014/03/28(金) 02:08:30.32 ID:OEPLP/0i.net
最近コンピュータというとWEBがらみでテキスト処理機みたいなノリが強いが、
本来の電子計算機としてはFortran不動だべ。

そして日本は結構Fortran市場/ユーザーでかいんでないかな。
Intel Fortranは英語以外には唯一日本語マニュアル等を出しているし。
アメリカ以外でハード・OS・コンパイラまともに作れるの日本ぐらいでね。

366 :デフォルトの名無しさん:2014/03/28(金) 07:40:18.76 ID:27mpC+N6.net
ちょいとスレチかもしれませんが、みなさん変数の命名法ってどうしてますか?


367 :デフォルトの名無しさん:2014/03/29(土) 14:26:34.57 ID:iivY7v+4.net
商業利用は少ないし、研究機関での個人・少人数開発がほとんどだし、明文化されたコーディング規約ってなかなか見つからんよな。
C++も併用してるので、そっちの命名規約と統一してる。
変数大文字6文字縛りは勘弁な。

368 :デフォルトの名無しさん:2014/03/30(日) 02:02:03.27 ID:wC7BTSuT.net
WEB世界の偉い人wでもFortranの知識が66や77時代のイメージ止まりで
とんちんかんな事を言っていて笑える。

アドバイスで数値計算はFortranじゃなくてもいいとか言って、
初心者たぶらかして冬山にTシャツ、サンダルで登山させるような
悪い奴多すぎで草不可避www

369 :デフォルトの名無しさん:2014/04/12(土) 01:07:03.97 ID:Ab832t2z.net
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.net
b(:,:,t)=a
でおk?

371 :デフォルトの名無しさん:2014/04/12(土) 02:56:42.37 ID:7b7Ca2J/.net
え そんなシンプルでおk?
ありがとうございます

372 :デフォルトの名無しさん:2014/04/15(火) 19:04:08.61 ID:2Visq3rw.net
b(:,:,t)=a(i,j) だと駄目。
>>370 のとおりじゃないと。

部分配列を指定するのにコロンを使う。
たとえば配列 v の第2成分から第10成分までなら v(2:10)。
コロンの両脇に数字がないのは、成分あるだけ全部という意味。

373 :デフォルトの名無しさん:2014/04/15(火) 19:11:45.41 ID:0DdTk08m.net
ちょうどいい解説があった
http://www.str.ce.akita-u.ac.jp/~gotou/zyouhou/f90/sec6.html#6.4.

374 :デフォルトの名無しさん:2014/04/15(火) 21:45:58.64 ID:y6pD2KFL.net
>>372
文字化けしてしまって見れませんでした
>>372
コロンの意味はよくわかりました。ありがとうございます
a(i,j)はダメでaじゃないといけないのがわからないです、配列の定義は
real a
dimension a(i,j)
と別でやって、
b(:,:,t)=a
とやらなければいけないということです?

375 :デフォルトの名無しさん:2014/04/15(火) 22:23:43.96 ID:2Visq3rw.net
>>374
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)...
のように、ただひとつの同じ数字が代入される。

376 :デフォルトの名無しさん:2014/04/15(火) 22:26:34.41 ID:y6pD2KFL.net
>>375
なるほど、よくわかりました。ありがとうございます。数日前にfortranをはじめましたがプログラミング自体がほぼ初なのでとても勉強になりました。
人の書いたプログラムのある一つのサブルーチンを修正したいのですが、変数の名前の設定の仕方も人それぞれだし、読むというのはとても大変ですね。

377 :デフォルトの名無しさん:2014/04/15(火) 22:33:12.92 ID:pcXih3Yx.net
>>376
追記の質問なのですが、bは三次元配列でaは二次元配列ですが、こちらが指示しなくても、aをbの:,:部分に入れるのですね。

これは次元の違うものを代入をするとき、どのように対応するのかは次元で決まるということでしょうか。
aは1次元、2次元成分をもつ配列だから、それを代入する先もbの1次元、2次元成分に代入するということですよね?

378 :デフォルトの名無しさん:2014/04/15(火) 22:51:15.04 ID:2Visq3rw.net
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次元配列に代入していることになります。

379 :デフォルトの名無しさん:2014/04/16(水) 01:41:26.57 ID:9gYQIu+P.net
>>378
>b(:, :, :) は3次元配列だけど、b(:, :, 1), >b(:, :, 2), ..., b(:, :, 100) はそれぞれ2次元配>列です。

配列については調べましたが、意味がわかりませんでした。なぜ二次元配列なのでしょうか
integer a
dimension a(2,3,1)
私はこれは3次元の配列だと思っています。
配列の次元は,で区切った数で決まるのではないのですか

380 :勝手に横レス:2014/04/16(水) 03:26:06.14 ID:k2nSQYfZ.net
>>379
:は指定した配列の範囲を一度に指定する表記

配列の宣言を
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のサイトで部分配列で調べると良いよ

381 :デフォルトの名無しさん:2014/04/17(木) 22:25:20.75 ID:TQr8bRVR.net
>>380
遅くなりました。非常にわかりやすい解説ありがとうございます。NAGで少しずつ勉強しています

382 :デフォルトの名無しさん:2014/04/20(日) 11:29:29.42 ID:LM2YJqRp.net
すみません
fortranを始めようと思ってるものですが
おすすめの開発環境を教えていただけないでしょうか?
今はgfortranとvimでプログラミングを始めようかと思っているのですが
いちいちvimで書いて保存してvimをぬけてコンパイルして実行するのが手間だなと感じています。
vimを抜けずに書いたプログラムをコンパイル、実行できればいいのですが。

そこでおすすめの開発環境を教えていただきたいのです。

383 :デフォルトの名無しさん:2014/04/20(日) 11:40:02.65 ID:rCakeQE3.net
小規模ならエディタ+コマンドラインでいいと思うけど
gfortranで統合開発環境ならeclipseが無難
https://www.eclipse.org/downloads/
ここからEclipse for Parallel Application Developersをダウンロード

384 :デフォルトの名無しさん:2014/04/21(月) 08:18:52.31 ID:9DEaCYEm.net
>>383
小規模でもエクリプス使う利点ある?

385 :デフォルトの名無しさん:2014/04/21(月) 11:58:42.13 ID:INTGmmt1.net
否定するだけじゃなく、代替案を示せよ!
サヨクちゃんかよw

386 :デフォルトの名無しさん:2014/04/21(月) 13:10:45.24 ID:9DEaCYEm.net
>>385
いや、否定してない。
質問してるの!利点ある?

387 :デフォルトの名無しさん:2014/04/22(火) 18:21:36.11 ID:i3jJvf/a.net
Gfortran 使いです。
Cycle 文についての質問だけど、

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

とかだったら a = 12 になるのかな?

388 :デフォルトの名無しさん:2014/04/23(水) 00:33:33.39 ID:cH3Ejolk.net
do 変数をいじっちゃいけないはず。
自分のおちんちん/おまんこはいじってもいいよ。

389 :デフォルトの名無しさん:2014/04/23(水) 00:35:19.04 ID:4m41LpoI.net
ループ中でループ変数(この場合は a)は変更できない

390 :デフォルトの名無しさん:2014/04/23(水) 02:10:49.07 ID:2MktZpH7.net
間違えた

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?

391 :デフォルトの名無しさん:2014/04/23(水) 02:47:07.80 ID:cH3Ejolk.net
おじちゃん、少しは文法書読みなよ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

392 :デフォルトの名無しさん:2014/04/23(水) 04:13:45.15 ID:2MktZpH7.net
>>391
なるほどね、ありがとう。
サイクルは便利だね

393 :デフォルトの名無しさん:2014/04/24(木) 04:26:06.40 ID:PfDx1Fno.net
試した奴いるかい?
登録がめんどくさいんですけど。


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

HTTPS software.intel.com/en-us/articles/intel-software-development-tools-2015-beta

394 :デフォルトの名無しさん:2014/04/25(金) 18:01:43.49 ID:nDom0mhY.net
ちょっとお聞きしたいのですが、
構造体の1成分だけfunctionで計算するような
書き方はできないでしょうか

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

構造体初めて使うのでまだよくわかっておらずすいません
よろしくおねがいします

395 :デフォルトの名無しさん:2014/04/25(金) 19:31:14.66 ID:9DVeZXXS.net
「構造体の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)
のようにすればいいのではないでしょうか。

396 :デフォルトの名無しさん:2014/04/25(金) 19:54:42.69 ID:nDom0mhY.net
>>395
早速のレスありがとうございます
まだよくわかっておらずすいません
やりたかったことはおっしゃっていただいたまさに(2)です
教えていただいたやり方でできそうです
とても助かりました。ありがとうございました
また機会がありましたらよろしくおねがいします

397 :デフォルトの名無しさん:2014/05/02(金) 21:33:28.65 ID:ZxAJrCZC.net
>>393
そんなにめんどくさくなかったぞ。非商用利用で登録するときと大して変わらなかった気がした。

ついにfortran2003完全準拠か。国産コンパイラベンダも早く頼むで。

398 :デフォルトの名無しさん:2014/05/08(木) 01:43:46.59 ID:akP1EH34.net
連休を利用してFortran2003用のCheet Sheetを作ってみた。
自分が使っていたメモと、このスレに出たこと等をギリギリ突っ込んでみた。
ttp://www.pdf-archive.com/2014/05/07/f2003quickref/f2003quickref.pdf

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

豆本になっているので両面印刷して、以下のサイトを参考にして本にしてくれ。
ttp://k.e-kuchikomi.info/K_140266/

399 :デフォルトの名無しさん:2014/05/08(木) 22:20:11.32 ID:GsOSKq7r.net
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はファンクションで別ファイルで書いています

勉強不足で申し訳ありませんがよろしくお願いします

400 :デフォルトの名無しさん:2014/05/08(木) 23:40:27.39 ID:akP1EH34.net
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

みたいにしたほういい。

401 :デフォルトの名無しさん:2014/05/09(金) 22:46:22.53 ID:yQPNJst2.net
>>400
ご教授ありがとうございます
forallやpureなど使ったことがなく、書き方例など大変勉強になりました

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

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

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

ありがとうございました。

402 :デフォルトの名無しさん:2014/05/10(土) 00:07:21.90 ID:ZxmW9Mt1.net
Linux 使いでEclipse + photran のフォートラン統合開発環境を構築しようかと考えているのですが、なかなかうまくいきません。

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

エクリプスでもhero.f90 (メインプログラム単体)単体のコンパイルは出来ています。
もしかして複数ファイルを同時に今コンパイルできないとか?

403 :デフォルトの名無しさん:2014/05/10(土) 01:44:31.61 ID:X6uqaHXX.net
プロジェクトにソースファイルを全部入れてビルドするだけだが駄目かい?

404 :デフォルトの名無しさん:2014/05/10(土) 05:24:00.09 ID:ZxmW9Mt1.net
>>403
え?それだけなんですか?
プロジェクトに全部ファイル入れてあります。なのにエラーが。。。

405 :デフォルトの名無しさん:2014/05/11(日) 09:02:09.98 ID:4C2ZppHJ.net
>>404
ここで聞いてもムダだよ。
ここにはエクリプス使ったことない奴しかいないから。
みんなテキストエディタ直打ちだから。

406 :デフォルトの名無しさん:2014/05/11(日) 10:52:57.57 ID:wJQWAvOW.net
>>398
乙。いただいた

407 :デフォルトの名無しさん:2014/05/11(日) 12:54:27.66 ID:a5cPk+x+.net
>>398
GJ!
英語ばかりでびっくりした。参考文献欄があるのが凄いね。

408 :デフォルトの名無しさん:2014/05/11(日) 17:20:58.15 ID:cyBk1jZ9.net
Implementing the Standards...including Fortran 2003
http://www.fortran.bcs.org/2007/jubilee/f50.pdf

Fortran 2003 and Beyond
パワポ
https://cug.org/5-publications/proceedings_attendee_lists/2005CD/S05_Proceedings/pages/Authors/Long-0517-1100/Long-0517-1100_slides.pdf
PDF
https://cug.org/5-publications/proceedings_attendee_lists/2005CD/S05_Proceedings/pages/Authors/Long-0517-1100/Long-0517-1100_paper.pdf

Intel Parallel Universe issue 11 p.22
https://software.intel.com/sites/default/files/parallel_mag_issue11.pdf

409 :デフォルトの名無しさん:2014/05/13(火) 00:50:14.94 ID:X5XVCl1f.net
fortranまとめwikiないよなそういえば

410 :デフォルトの名無しさん:2014/05/13(火) 11:18:46.53 ID:Ml4tWcMx.net
sin波のようななめらかな波形データから尖頭値を抽出するにはどうすればよいでしょうか。
波形データの入っている配列aから抽出したいのですが、sin波のような綺麗な周期を持っておらず、地震の観測波形のように不規則に連続して変化していっています。

411 :デフォルトの名無しさん:2014/05/14(水) 12:56:39.35 ID:wOYwf617.net
こんなの来てた。

MODERN FORTRAN FOR SCIENTISTS AND ENGINEERS
By Damian Rouson

http://jolts.stanford.edu/72/modern_fortran_for_scientists_and_engineers

412 :デフォルトの名無しさん:2014/05/15(木) 01:14:31.34 ID:cUF0eH5o.net
>>405
いえ、そんなことおっしゃらず…

今までエディタ使って作成してたフォートランファイルをエクリプスのプロジェクトフォルダに入れてビルドしようとしてもうんともすんとも言わないです。
で、デバッグできないという…

413 :デフォルトの名無しさん:2014/05/15(木) 02:31:06.49 ID:klLDqCtV.net
Fortran90/95による実践プログラミング [単行本(ソフトカバー)]
安田 清和 (著), 水野 正隆 (著), 小野 英樹 (著)
http://www.amazon.co.jp/gp/product/4872594738


いつの間にかこんなのが出版されているんだが、見たやつ中身はどうよ?
目次からすると、おっおぅ!…ってかんじなんだがw

414 :デフォルトの名無しさん:2014/05/16(金) 01:40:42.79 ID:USQ/ZI5B.net
なんかエクリプスとフォトランの詳しいマニュアルないかな?
本家でもversion古いし

415 :デフォルトの名無しさん:2014/05/16(金) 01:49:02.89 ID:pE1PewlD.net
>>414
Youtubeで外人のおっさんが実演してたぞ。
俺は使ってないからようわからんがw

416 :デフォルトの名無しさん:2014/05/16(金) 02:01:11.54 ID:USQ/ZI5B.net
>>415
おお!YouTubeでですか(´・_・`)

みなさんはエディタからコンパイルしてますか?
デバッグとかどうしてます?gdbとかdddですか?

417 :デフォルトの名無しさん:2014/05/16(金) 02:08:04.34 ID:cU3+Idig.net
fortranで書いたプログラムの出力ファイルを読み込んで、それを元にしたグラフを書かせたいのですが、1)それに適したグラフ描画ソフト2)そういったことを解説してある本はないでしょうか?

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

Excelを挟まず、csvファイルをもとにグラフを描画してくれるプログラムがあるととてもありがたいのですが、何かできないでしょうか

418 :デフォルトの名無しさん:2014/05/16(金) 07:25:49.77 ID:USQ/ZI5B.net
>>417
Gnuplot, R とか(´・_・`)

419 :デフォルトの名無しさん:2014/05/16(金) 15:01:20.39 ID:GjdBspSJ.net
現在,windowsで大学の課題でmingwを使用してコードのコンパイルや実行しようとしています。
コンパイル自体は成功したようにみえたのですが実行する際に
「コンピュータにlibquadmath-0.dllがないため,プログラムを開始できません.
この問題を解決するには,プログラムを再インストールしてみてくだい.」
と表示され実行できません。

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

またC言語(C++)のコードのコンパイルや実行には成功しています。

420 :デフォルトの名無しさん:2014/05/16(金) 19:43:53.43 ID:xH+zzs4U.net
path

421 :デフォルトの名無しさん:2014/05/16(金) 19:48:37.92 ID:xH+zzs4U.net
http://www.oki-osk.jp/esc/cyg/cygwin-27.html

422 :デフォルトの名無しさん:2014/05/16(金) 21:38:59.32 ID:HsLYY/75.net
>>419
以前、似たような(同じ?)エラーメッセージに遭遇した事があったが
その時は件のライブラリを強制再インストールしたら直ったように思う。
mingw-get update
mingw-get --reinstall upgrade mingw32-libquadmath
これを実行してMinGW(MSYS)のターミナルを再起動すればどうかな。

423 :デフォルトの名無しさん:2014/05/17(土) 06:32:26.00 ID:97dT5LKY.net
>>418
gnuplotですかありがとうございます

424 :デフォルトの名無しさん:2014/05/17(土) 07:18:10.88 ID:ScBioaGh.net
清書にはmatplotlibでね?

425 :デフォルトの名無しさん:2014/05/17(土) 14:11:28.79 ID:6t+Gfvcv.net
>>413
今日日出すなら2003と2008解説してほしい

426 :420:2014/05/17(土) 19:57:54.60 ID:j7anWBLq.net
>>422
ありがとうございます.
なんとか実行することができました.

427 :デフォルトの名無しさん:2014/05/18(日) 18:58:17.41 ID:8yAoHmFE.net
>>425
ですよねー

428 :デフォルトの名無しさん:2014/05/30(金) 03:00:46.51 ID:r0FrxYTY.net
メモ帳のインプットファイルから一行ずつ読み込んでプログラムを回す時、読み込める一行の長さの限界というのは決まっているのでしょうか

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

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

429 :デフォルトの名無しさん:2014/05/30(金) 03:29:52.60 ID:thFm9kuD.net
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

430 :デフォルトの名無しさん:2014/05/30(金) 08:44:23.58 ID:U3Y1cq1n.net
>>429
20年以上前に書かれたプログラムを少し編集しようとしています。読み込み部分は他の人が書いていて、初心者の私はそれを少し編集したいのですが、自信がないです

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

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

input.txtを読み込むよう指示するのですが、全体としてそのinputは数千行とあります。それでもそのような記述で大丈夫なのでしょうか。

431 :デフォルトの名無しさん:2014/05/30(金) 15:49:55.31 ID:dCRThtZs.net
どのような記述だよ

432 :デフォルトの名無しさん:2014/05/30(金) 19:59:51.61 ID:1KLLWRFX.net
>>430
あなたのすることは数字の大きさをかえるような小手先の対応ではなくて、
昔のプログラムの動作なり、コードを理解することではないでしょうか?
10から14に数を増やすためにすることが読み込み箇所の変更だけですむのかなと心配になります。
10前提で処理がコードとして記述されていないか、計算式があるなら数を増やして大丈夫なのか、
チェックすることはいろいろあると思います。
あなたに指示をされた先輩なり上司のかたが変更方針がわかっておられて、指示をされてればいいのですが。

433 :デフォルトの名無しさん:2014/05/31(土) 00:38:02.07 ID:8hxwwbXy.net
>>432
配列の上限や各プログラムでのループ処理で何個読めるのかを確認しました。その点は修正しても大丈夫でした。
しかしinputファイルから読み込む一行があまりに長いとエラーを起こすのは改善できませんでした。

434 :デフォルトの名無しさん:2014/05/31(土) 01:01:49.98 ID:yeEEhfSt.net
どこからどこへどれだけデータを読み込むか書いてあるのが read 文なので
それが出ないとどうにも。それに input.txt が長くいろいろブロックがあるなら
対応する read 文もいくつもあるうちのどれかってとこだな。

435 :デフォルトの名無しさん:2014/05/31(土) 01:45:38.26 ID:3e7Yho2f.net
最初の質問
>読み込める一行の長さの限界というのは決まっているのでしょうか
に答えるとすれば,
「データをどう読むようにコーディングされているかによります」
かな.

何度もread文を書くように言われているのに書かないってことは,
知的財産の流出とかなんかを気にしているのかな?
ソースコードをほんの一部でも書けないなら,先輩なりに聞いた方がよい.

436 :デフォルトの名無しさん:2014/06/02(月) 00:07:12.28 ID:vUSkffdq.net


437 :デフォルトの名無しさん:2014/06/02(月) 00:13:33.24 ID:BIE796Bm.net
>>434
>>435
プログラムの中でちょくちょくある
read card 100
character 100
という部分で読み込んでいるのではないかと思います

プログラム作成者と話して100→200とかに増やせばなんとかなるんじゃないかとなって変更しましたがなんの効果もありませんでした
500にしても変わらなかったので、そもそも読み込める長さが決まっているのではないかと考えるようになったのです

438 :デフォルトの名無しさん:2014/06/02(月) 01:34:45.52 ID:mPD7/eRQ.net
何度も書けと言われているものを書かないのはなんでだろう
書けば直したりしてくれるかも知れないのに
書かれている文はFortranの文法に合わないし

cardに一度読み込ませて、その後各変数に値を分配しているように思えるけど、これだけでは分からない
読み込みができているかreadの後に変数の値の確認とかしてなさそうだし
単純に1行でどこかまで読めるかテストプログラム組んで確認してなさそうだし

439 :デフォルトの名無しさん:2014/06/02(月) 01:57:55.06 ID:GuhykFKN.net
プログラム作成者が存在するなら、現状どういう処理をしているのかを
コードと向き合いながら作成者に聞いて理解する。
200に増やせばなんとかなると結論つける根拠をプログラム作成者に確認する。
ソースを変更するのはそれからだと思うけど。
読み込める文字数に制限があると疑うなら、現在読み込めてるデータの文字列長の
範囲内で10から14に入力データ数を変更したコードでテストしてみる。
入力文字列長の制限なのかコードの変更ミスなのか切り分けができてない。

440 :デフォルトの名無しさん:2014/06/02(月) 08:47:31.90 ID:xxg6z98O.net
card と云うと、FORTRAN IV時代の1枚80コラムのIBMカー
を思い出す。
最初の5コラムがラベル番号6コラム目がコメント用7コラム
から72コラムまでにステートメントを書く(打つ)
というものだった。
もしかして、
read card 100
というのは、データカードを100枚読み込むということ
でしょうか。
character 100
というのはデータカードが2枚ひと組になっていて、
2枚合わせて100文字をひと固まりとして処理する
ということかなとも思いますが、いずれにしても
FORTRAN IVの正規の文法には、このようなステートメント
はなかったと思います。
ある機種特有の方言かもしれません

441 :デフォルトの名無しさん:2014/06/02(月) 09:19:02.24 ID:/Y6F3YHx.net
>>438
1万行超えるのでいったいどこを抜き出せばよいのかわかりません。全てを貼ることはできませんし、各サブルーチンに出てきているread文はこれです。

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



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


>>440
7マス目からプログラムを打ち始めていた頃に作られたものです。read cardというのはインプットファイルを読むという意味だそうです。いくら調べてもcardという命令分はないのでよくわかりませんが、read文といえばこれぐらいなのです
データカードというのはインプットファイルのことですよね?
今はabsoft11.0,fortran95でやっているのでそのようなことは気にしなくてよくなっています

442 :デフォルトの名無しさん:2014/06/02(月) 10:21:47.52 ID:yv/nHUfZ.net
昔は
_______read 6 100
とか書いてたな

443 :デフォルトの名無しさん:2014/06/02(月) 23:06:26.34 ID:Ij4SzyXz.net
1つ言えるのは card とはそのプログラム内で定義された何らかの名前
そして今のところの常識的にその文法は Fortran とは異なるように見える

100 はその数字のラベルが付けられた行であるようにも考えられるが
その場合は 200 など別に変えられた場合にコンパイルエラーか
実行時の動作がぶっ壊れるだろうから、おそらく数値とみるべきか

444 :デフォルトの名無しさん:2014/06/03(火) 07:56:10.35 ID:Bql6ya1H.net


445 :デフォルトの名無しさん:2014/06/04(水) 08:41:52.08 ID:cjdS4ahW.net


446 :デフォルトの名無しさん:2014/06/04(水) 21:26:40.68 ID:bCq7kX8R.net
common/mat/a(20)
common/mat/a1,a2,…a25
と記述してもプログラムが動くのですがなぜでしょうか
matには20個の変数しか入れないから、a1〜a20までしか読み込まないと思ったのですが、なぜか読みます

447 :デフォルトの名無しさん:2014/06/04(水) 23:26:31.63 ID:OlqsO7Ca.net
文法上では、大きさの違う COMMON ブロックは、無名 COMMON ブロックでしか
許されていないのだが、まぁ昔はよくやられていた。

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

COMMON 文はメモリー上の番地の共有になっている。それは先頭で位置合わせが
なされるので、より大きい方でメモリーが確保されていれば、一方が小さくても
問題ない。ただ、小さい大きさで確保されていると、エラーが出なくても
はみ出して読み書きしているだけなので、ファンタスティックな予期せぬ出来事
が起きる。

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


「ただ、小さい大きさで確保されていると、エラーが出なくても はみ出して読み書きしているだけなので、ファンタスティックな予期せぬ出来事
が起きる。 」というのは小さい大きさというのはどこより小さいのでしょうか。はみ出して読み書きしているだけというのは今現在読み書きできていることとどうなのでしょうか。

449 :デフォルトの名無しさん:2014/06/04(水) 23:54:33.80 ID:OlqsO7Ca.net
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

450 :デフォルトの名無しさん:2014/06/05(木) 00:08:43.48 ID:m2ykd6YT.net
同じプログラム単位に書いたなら
common/mat/a(20)
common/mat/a1,a2,…a25

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

違うプログラム単位に書いたなら多分未定義だが
重なるメモリはそれっぽく読めて、多い分はそのまま使えるっぽい

451 :デフォルトの名無しさん:2014/06/05(木) 00:38:07.03 ID:a9B4CiIQ.net
>>450のいう通り、同じプログラム単位に書かれたら、後ろに追加になる。

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)とか)

452 :デフォルトの名無しさん:2014/06/05(木) 01:27:46.66 ID:a9B4CiIQ.net
コンパイラのオプションで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 心ぴょんぴょん待ち〜

453 :453:2014/06/05(木) 01:28:36.28 ID:a9B4CiIQ.net
テストプログラム
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

454 :デフォルトの名無しさん:2014/06/05(木) 01:40:20.97 ID:ivUEXHmG.net
Emacsでfortran のコマンド自動補完できるのかな?

455 :デフォルトの名無しさん:2014/06/05(木) 11:54:05.31 ID:qVumrB9V.net
>>450,>>450,>>450
詳しくありがとうございます。
>>450で[最大サイズのCOMMONブロックの大きさを確保してくれていれば]というのは、
>>450で[単精度4バイト*8個=32バイトづつ、 領域を確保していっている]ということから、大丈夫ということでしょうか
もともと20個が上限なので、8の倍数なら24個まで勝手に確保してくれているので、25個では動かないように感じます。
しかしそれは>>450のように「多い分はそのまま使えるっぽい」ということで、今回は大丈夫だということでしょうか。

456 :デフォルトの名無しさん:2014/06/05(木) 22:09:23.11 ID:m2ykd6YT.net
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単位なのは、そうしたほうが「自分とこの最適化に有利」だから
気を利かせて余分に取ってるわけではない

457 :453:2014/06/05(木) 23:04:15.60 ID:a9B4CiIQ.net
>>455
虚心に読めよw

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

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

>>456
うむ。DECのαとか、64bit時代になってから、COMMON文の中までPaddingして
メモリー・アラインメントをそろえてくるので、昔のプログラムを動かそうとすると
やっかい。
Intelが32バイトづつ増やしているのは、AVXとかベクトル化の単位に合わせている
可能性が高いと思う。

458 :デフォルトの名無しさん:2014/06/05(木) 23:32:23.89 ID:ivUEXHmG.net
誰かいまっくすでフォートランのコマンド自動補完する方法しらんかいの?

459 :デフォルトの名無しさん:2014/06/06(金) 03:54:07.35 ID:jaKSg6aA.net
みんな Stallman のデブが嫌いだからな
それにスクリーンエディターに頼るのは甘え





俺は甘えん坊だがw

460 :デフォルトの名無しさん:2014/06/06(金) 16:41:53.21 ID:J0jnFElL.net
甘いと言うより古いな

461 :デフォルトの名無しさん:2014/06/06(金) 22:53:03.99 ID:Bx53wjCJ.net
メモ帳からデータを読み込む際、TABキーによる空白や全角による空白、半角による空白で違いはあるのですか?
数値を1 2 3 4と1行に入力したとき勝手に1、2、3、4と区別して読んでくれるのでどうやって判断しているのだろうと疑問に思いました。
試しにすべてのTABキースベースを半角1スペースに置換して読み込ませたところ、エラーで読みませんでした。

462 :デフォルトの名無しさん:2014/06/08(日) 11:12:25.46 ID:dwjjMbeb.net
>>459
みんななに使ってるのかな?

463 :デフォルトの名無しさん:2014/06/09(月) 17:47:13.32 ID:INtWlseDN
初めまして.
超初心者なので質問させてください.
現在fortran90のプログラムをgpu化しようとしています.
そこでまず,cpuのプログラムを中身を全く変えずにコンパイルオプションを
ifortからpgfortran -Mcudaに変えてコンパイルしたところ,コンパイルはできて
計算も回るのですが,出力させたいファイルに結果が出力されなくなってしまいました.
また別の出力ファイルでは途中までは出力されるのですが,毎回ある一定のところで出力が止まってしまいます.
この現象についてどなたか原因がわかる方がいらっしゃいましたら,ご回答お願いしたいです.

464 :デフォルトの名無しさん:2014/06/09(月) 18:41:45.43 ID:INtWlseDN
>>463
状況の追加です.
出力されないファイルについて,計算がすべて終了した場合には
出力されていることがわかりました.
cpuプログラムでは途中で計算を終了しても出力されます.
これについて,cudaプログラムでは計算が終了しないと書き出しファイルの内容が
保存されないというようなことはあるのでしょうか.

465 :デフォルトの名無しさん:2014/06/09(月) 23:14:56.35 ID:p2A2eKRk.net
>>428ですが、解決しました。
CHARACTER*120という部分だけを変えていて、FORMAT文まで変えていなかったりときちんとすべて変えていなかったのが原因でした。
そこここにローカルな記述方法が多く困りましたが、とても助かりました。ありがとうございました。

466 :デフォルトの名無しさん:2014/06/10(火) 00:00:20.47 ID:uCkYRtw5.net
みんなずっこけるよ…

467 :デフォルトの名無しさん:2014/06/11(水) 22:05:12.93 ID:HeH2upb6.net
プログラムが長くなってきて、
いくつかのファイルに分けてサブルーチンを書いているのですが、
わかりやすい整理方法、命名方法などないでしょうか
同じ機能群のサブルーチンは
同じファイルにまとめるぐらいはしているのですが
だんだん分からなくなってきて
多分このまま続けたら発散するんだろうな・・と思います
スレ違いかもしれませんがもしコツなどありましたらお願いします

468 :デフォルトの名無しさん:2014/06/12(木) 00:49:36.30 ID:iuJue+V7.net
あるプログラムの一部を修正している途中なのですが、触っていないところでエラーが起きるようになり、困っています。
build自体は問題がなくて、build後のプログラムを実行すると以下のエラーメッセージが出て止まります

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

修正前のプログラムでは滞りなく回るのですが修正中のプログラムでは回らなくなっています。
触っていないところなのでどこから手をつけて良いかわかりません。

469 :デフォルトの名無しさん:2014/06/12(木) 01:11:55.34 ID:37CEZRmy.net
>>468に追記です。
修正前のプログラムは
absoft fortran 9.0(windows7)
修正後のプログラムは
absoft fortran11.0(windows8)で作られています

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

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

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

プログラムが止まるところはインプットファイル中にある、ある数を0にしておけば回るようになり、0じゃなくて数を与えるとエラーを吐きます。

470 :デフォルトの名無しさん:2014/06/12(木) 02:49:22.16 ID:KPlz8uhx.net
おおかた、全角文字でも入っているのだろう。

471 :デフォルトの名無しさん:2014/06/12(木) 07:38:50.36 ID:IkGTnMqV.net
>>470
どうすればそこを見つけられるのでしょうか

472 :デフォルトの名無しさん:2014/06/12(木) 22:00:13.35 ID:1yO42ooY.net
>>469ですが、修正は関係ないことがわかりました。
もともとの渡されたソースファイルをabsoft fortran 11.0でbuildするとbuild自体はうまくいきますが、同じ箇所でruntime errorとなりました
コピーして新規ファイルを作ってbuildしても同様の結果となりました。.f95.f77.fの3パターンで新規ファイルを作ってbuildしましたが、同じ結果でした
verはおそらく9.0で拡張子は.fで渡されています。
.fファイルだけでなくguiやgviという拡張しのついたファイルも一緒に渡されているのですが、それを11.0では必要としていないので使っていません。
これが何か悪さをしているのでしょうか?

473 :デフォルトの名無しさん:2014/06/13(金) 08:46:16.45 ID:YPxIZA8y.net
もともとのファイルは9.0でビルドすると正しく動くということ?
環境を変えるときコンパイラが生成したものを運んだりしてないか

ある数が0の時回るとあるけど、その変数周りを調べていくしかないと思う
なんの数字か知らないが、例えばその数が読み込むデータの数を表してて、その数字と実際のデータ数があってない
そして型の合わない次のデータを読もうとしてとまるとか

474 :デフォルトの名無しさん:2014/06/13(金) 08:59:26.44 ID:XnqRfLRO.net
>>473
はい。同じ読み込みデータでも正しく動きます。
runtime error
illegal character in numeric input
ある数というのは出力してほしいデータを指定する数です。
データの種類が5種類ほどあって、ある1種のデータを出力するよう指示をすると止まってしまいます。
一行中に
300 400 200 0 0
というように出力してほしいデータの数を指定しますが、みぎから2番目のデータを変えるとダメです
正しいアウトプットでは
<< 出力するデータの情報 >>
出力データ
...
というように進むのですが、ある数字では
>>
だけが延々と繰り返されたり、別の数字では上記の通りruntime error illegal character in numeric inputと出て止まったり
というような感じです

475 :デフォルトの名無しさん:2014/06/13(金) 09:10:39.79 ID:YPxIZA8y.net
>>474
入力はこの5つの数字だけ?
それぞれのでーたに対して個別に入力があったりしないの

476 :デフォルトの名無しさん:2014/06/15(日) 17:47:40.77 ID:QZWVyVFy.net
>>474
この記事関係ではない?
Http://jp.i-planet.me

477 :デフォルトの名無しさん:2014/06/16(月) 04:00:13.60 ID:fWvfMn7M.net
>>476
すみませんよく意味がわかりません
>>476
拝見しましたが違うような気がします。

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

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

なぜか今まで使えていた9がinvalid licenseと突然出るようになってビルドが今はできないので、まずはそこをなんとかしなければなりませんが…。

478 :デフォルトの名無しさん:2014/06/16(月) 10:00:44.78 ID:juShtlay.net
cuda fortranについて初歩的な質問なのですが、
PGI workstationで、-cublasとオプションを付けてコンパイルしようとすると、
『fatal error LNK1104: cannnot open file 'libcublas.lib'』とエラーが出てしまいます。
この場合、どうしたら良いですかね?
どなたか教えてくださると助かります。

479 :デフォルトの名無しさん:2014/06/16(月) 10:13:18.23 ID:3pyBJ4C4.net
>>478
パスが通ってないんだろ

そのエラーにあるファイルがあるか探す
ファイルがあるパスをLオプションで追加でとりあえず通るはず
例えば-L/usr/local/cuda/lib -cublas

480 :デフォルトの名無しさん:2014/06/16(月) 15:38:44.47 ID:juShtlay.net
>>479
探して見たところ、'libcublas.ipl'、'libcublasemu.lib'という名前のファイルしか見つかりませでした。
そこで、これらのファイルが保存されているフォルダのパスを追加してコンパイルしたところ、
『error lnk2019: unresolved external symbol referenced in function』
というようなエラーが出てきてしまったのですが、
どうすれば良いか教えていただけませんか?

481 :デフォルトの名無しさん:2014/06/16(月) 15:50:37.89 ID:Q+b6M39D.net
>>480
試しにcublasをcublasemuに変えてみて
libcublas.libがなかったのならもしかしてパスはすでに通っていたかもしれません

482 :デフォルトの名無しさん:2014/06/16(月) 16:27:09.31 ID:juShtlay.net
コード中の'cublas'を'cublasemu'に変更し、
'-lcublas'を'-lcublasemu'に変更してコンパイルしたところ、
『unable to open MODULE file cublasemu.mod
compilation aborted』
と出てしまいました。。。

483 :デフォルトの名無しさん:2014/06/16(月) 16:43:59.97 ID:vxzjg7XS.net
>>482
コードは元のままでいいです
申し訳ない

484 :デフォルトの名無しさん:2014/06/16(月) 16:54:43.67 ID:juShtlay.net
>>483
元のコードでやってもやはり出てしまいますね。

485 :デフォルトの名無しさん:2014/06/16(月) 17:46:47.99 ID:vxzjg7XS.net
>>484
use cublasemuになっていませんか?

486 :デフォルトの名無しさん:2014/06/17(火) 09:43:20.11 ID:W5zFtzyB.net
>>485
いえ、ちゃんとuse cublasってなっています。

487 :デフォルトの名無しさん:2014/06/17(火) 13:19:25.73 ID:gUXRuUGZ.net
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

488 :デフォルトの名無しさん:2014/06/17(火) 16:58:12.46 ID:W5zFtzyB.net
>>487
-Lパスでディレクトリを指定して、-cublasemuをつけてコンパイルしたところ、
"libcublasemu.lib : error lnk2019: unresolved external symbol referenced in function"
が、ものすごい数のが出てきたのですが、どうしたらいいですかね?
一個ずつ-lで追加していくしか無いのでしょうか。

489 :デフォルトの名無しさん:2014/06/17(火) 17:24:37.11 ID:AhgC7kyl.net
cublas使わなければ普通に動くの?

490 :デフォルトの名無しさん:2014/06/18(水) 11:22:33.36 ID:nvOujYC+.net
>>489
はい。cublasが関わるところを全てコメントアウトしたところ、動きました。

491 :デフォルトの名無しさん:2014/06/18(水) 18:11:03.14 ID:s+RQ8hIL.net
>>490
可能な限り少しずつコメントアウトを外していき
その都度コンパイルが通るようにオプションを調整してみてください
最初はuse cublasだけなど
大量のエラーが少しずつ出ることを期待します

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

pgi cuda Fortranはデバッグ用にGPUを使わないエミュレートモードが用意されています
コンパイルオプションとリンクするライブラリの両方で切替えるようです
どちらを使用していますか?
cublasemuはエミュレートモード用で
オプションに-Mcuda=emuを併せて指定します

492 :デフォルトの名無しさん:2014/06/20(金) 16:00:17.10 ID:utkwlJ0p.net
Cのatoiとかatofのように,文字列としての数字の列を
integerなりrealの値に変換してくれる函数はあるでしょうか。
当方は,MinGWのgfortran95を使っています。

493 :デフォルトの名無しさん:2014/06/20(金) 19:25:02.85 ID:bxod4dQ6.net
>>492
内部ファイルを使うのがセオリー
NAG Fortran入門 19.5 数値と文字の変換を行う方法
ttp://www.nag-j.co.jp/fortran/FI_18.html#ConvertingBetweenNumbersAndStrings

494 :デフォルトの名無しさん:2014/06/20(金) 21:53:29.14 ID:utkwlJ0p.net
>492
ありがとうございます。
こういう裏ワザがあったのですね。
さっそく使わせていただきます。

495 :デフォルトの名無しさん:2014/06/21(土) 17:36:05.91 ID:L2qICpES.net
裏ワザというかFORTRAN77の頃からあったし、
66時代にはENCODE/DECODE関数が用意されていたんだがな。

マニュアルをよく読めば、内部ファイルの項目が昔から書いてある。

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

497 :デフォルトの名無しさん:2014/06/21(土) 22:49:19.55 ID:jwjy0CXq.net
はろけくも来つるものかなフォートラン

あっ季語がない

498 :デフォルトの名無しさん:2014/06/24(火) 20:49:58.43 ID:vNnfb12N.net
Gfortran 使ってるんだが、データを読み込ませる際、2行ごとにデータを読み込ませることって可能?

499 :デフォルトの名無しさん:2014/06/25(水) 01:47:13.51 ID:2uAyyXu5.net
素直に全部読みなさい
変数に入った値は、必ず使えとも使うなとも言われてないだろう

500 :デフォルトの名無しさん:2014/06/26(木) 00:45:30.86 ID:oXHKxD2l.net
まぁ空のread文で1行飛ばせるけどな。
Fortmatの/でも行けたっけかな?曖昧みー

501 :デフォルトの名無しさん:2014/06/26(木) 01:01:48.05 ID:pqUjp/UA.net
awkなりsedなりで一行飛ばしの中間ファイル作って、それをデータファイルにするとかじゃだめなの?
入力関係でつまづくなら、fortranにあわせたファイルを作成する方が早いのではと思ってしまう。

バイナリデータだとテキストみたいにいかないのか。バイナリデータだったらごめん。

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

503 :デフォルトの名無しさん:2014/06/26(木) 21:08:20.99 ID:2skFYUOi.net
詰めないと使いにくくない?

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

504 :デフォルトの名無しさん:2014/06/27(金) 00:10:25.56 ID:kJEq6I8z.net
>>500の言うとおり、formatを'(i,5/)'とかにすれば良いのでは?

505 :デフォルトの名無しさん:2014/06/27(金) 00:38:41.62 ID:iFH1F/Cx.net
>>504
あっ、もしかして>>502のやり方って途中空白行入ってることになるのかな???

>>504
それについて少し調べる必要があるかも。
具体的にどゆこと?

506 :デフォルトの名無しさん:2014/06/27(金) 00:42:32.62 ID:P3Dz9sSW.net
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

507 :デフォルトの名無しさん:2014/06/27(金) 01:05:20.13 ID:iFH1F/Cx.net
>>506
おお!スラがスキップすると言う指示内容なんですね。

508 :デフォルトの名無しさん:2014/06/27(金) 02:12:24.88 ID:P3Dz9sSW.net
>>507
んだ。
writeの時は出力1行改行、readのときも入力改行で結局1行読み飛ばすことになる。

509 :デフォルトの名無しさん:2014/06/27(金) 09:18:57.76 ID:F3h4qtWf.net
久しぶりにfortranのプログラム見たが、FORTRAN77の時代と違って気持ち悪い。
これならC++の方がまだいい。テンプレート関係を除けば。

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

まあ、年寄はfortranからMatlabに移行しているみたいだが。

510 :デフォルトの名無しさん:2014/06/28(土) 00:46:11.64 ID:PIVLw57u.net
おじいちゃん。
あんま結論を急がない方がいい。
配列演算気持ちいい。PUREでELEMENTALなら最高。

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

511 :デフォルトの名無しさん:2014/06/28(土) 02:59:17.00 ID:EHQFW5QP.net
gccにもquadmathがあるんだからあまりFORTRANを高く評価しない方がいいよ

512 :デフォルトの名無しさん:2014/06/28(土) 13:41:05.28 ID:1f0E4KM2.net
並列計算させてdoループの中でwrite文でファイル書き込みしたら中身の順番めちゃくちゃで泣きました。
どーにもなんないんですかね?

513 :デフォルトの名無しさん:2014/06/28(土) 15:42:05.65 ID:cJj78OR7.net
>>511
そもそもlibquadmathはFortranのために追加されたんだが

514 :デフォルトの名無しさん:2014/06/28(土) 16:56:46.35 ID:DtEJ1AXR.net
>>512
write文だけ逐次処理させるか、ループの外に出すしかないと思う。

515 :デフォルトの名無しさん:2014/06/28(土) 22:06:02.07 ID:mzWdk+zj.net
>>510

はぁ。。。

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

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

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

何言ってんだ?この馬鹿。
物理計算によっては4倍精度の計算が必要なの。計算時間やアルゴリズム
の問題じゃない。人の言ってることをそのまま受け売りするな。阿呆

516 :デフォルトの名無しさん:2014/06/28(土) 22:07:05.28 ID:mzWdk+zj.net
>>515

C** → C++

517 :デフォルトの名無しさん:2014/06/29(日) 00:26:55.37 ID:S1guW8MB.net
懐かしい単語を見かけたからって
いい大人が質問スレに何しに来てんだろね

それとも>>509は質問なのか?

518 :デフォルトの名無しさん:2014/06/29(日) 10:07:26.16 ID:zjmbmtCs.net
libquadmathの中を覗いてみたら、x86版はFPU使ってるけどx64版はSSE2使ってるな

519 :デフォルトの名無しさん:2014/06/29(日) 12:17:10.06 ID:eLJ+YA5h.net
ポインタが表に出ない(もちろん POINTER は除く)、
配列長と次元が暗黙的に持てることは評価できると思うんよ
matlab/octave に勝るかというと微妙だけど(移植性くらい?

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

>>518
確か x86_64 は SSE の存在を仮定していいはず
まぁ x86 も SSE/AVX も quad precision floating-point の直接演算は無い

520 :デフォルトの名無しさん:2014/06/29(日) 12:46:18.15 ID:eLJ+YA5h.net
> 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

521 :デフォルトの名無しさん:2014/06/29(日) 13:09:54.23 ID:RUBiLoi5.net
クラスライブラリで演算子オーバーロードって・・・遅そう。
素人が書いたマクロじゃ最適化効かないでしょ。
ソースの見かけで書けたって意味ないの。

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


まぁC++のBlitzなんて10年以上前から夢を語ってノロノロ開発して
ようやく最近なんですけどね。

522 :デフォルトの名無しさん:2014/06/29(日) 14:46:16.10 ID:qF+KN0J6.net
>>514>>519
なるほど、順番がどうなっても良いような時にしか使っちゃいけないポイですね。

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

それにしてもここにいる住人は凄い人が多くて、泣ける

523 :デフォルトの名無しさん:2014/06/29(日) 15:59:56.49 ID:l4jNLVEs.net
並列化は普通に物理の数値計算につかうけど、、、

524 :デフォルトの名無しさん:2014/06/29(日) 17:26:15.54 ID:rvrpBbGm.net
>>521

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

>>521

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

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

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

これをどのようにグローバルスレッド対応にしたらいいか、戦略が
立たない状態です。

525 :デフォルトの名無しさん:2014/06/29(日) 17:29:17.08 ID:rvrpBbGm.net
>>520

しかし、ほんとコードが糞だよな。こんなの覚えるくらいなら
C++の方がましだわ

526 :デフォルトの名無しさん:2014/06/29(日) 17:34:36.24 ID:qF+KN0J6.net
>>523
いや、そうでしょうけど、出力の順番とか気にする場合が私の研究分野だとほとんどなので…
なにか勉強になるものがあればいいのですが

527 :デフォルトの名無しさん:2014/06/29(日) 17:57:50.26 ID:RUBiLoi5.net
David BaileyがFortran用とC++用の4倍、8倍、多倍精度ルーチン公開してた気がする。
http://crd-legacy.lbl.gov/~dhbailey/

528 :デフォルトの名無しさん:2014/06/29(日) 17:59:34.52 ID:rvrpBbGm.net
間違えた

グローバルスレッド対応→スレッド対応

529 :デフォルトの名無しさん:2014/06/29(日) 21:18:38.95 ID:UItnk67i.net
>>526
プロセス(OpenMPならスレッド)ごとに別ファイルに出力して、
後で適当なスクリプトでマージするとか。

でも普通はそんなことしないで、>>514 が書いてるように、
doループを計算部と出力部の2つのループに分けて、
計算部のみ並列化して出力部分は逐次処理だと思う。

530 :デフォルトの名無しさん:2014/06/29(日) 21:46:47.56 ID:eLJ+YA5h.net
はいはいソーデスネーでっかい一時領域作ってなにしてんでしょーねorz

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

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

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

だって人口少ないし交流少ないし機会もないし意味すらないかもしれない、
たまに発言すれば馬鹿にされるから凄い人しか残らないわけで。

531 :デフォルトの名無しさん:2014/06/30(月) 00:33:26.64 ID:8S3fud89.net
>>519
それは分かる
でもエミュレーションしたら1/10程度じゃ済まないだろうから一応ハードウェアが
有効に働いてるんだな
double-double演算でもないみたいだし

>>527
面白そうだね

4倍精度が必要になるのは例えば反復法などの収束を加速する時などで、
単なる倍精度だと桁落ちのために誤差が生じてなかなか収束しない時に
有効だったりするね

532 :デフォルトの名無しさん:2014/06/30(月) 02:26:19.67 ID:fawqTnic.net
Fortranの強みは常に時代の最先端ハードウェアに対応していることじゃないかな。

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

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

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

この現実認識の歪が過剰なFortranディスカウントキャンペーンとして噴出して
いるのではないだろうか・・・と新聞並に論理を飛躍させて終わるw

533 :デフォルトの名無しさん:2014/06/30(月) 13:21:06.69 ID:V1UUNHQo.net
>>530

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

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

で、お前何が言いたいんや?日本語大丈夫か?

534 :デフォルトの名無しさん:2014/07/01(火) 01:36:55.46 ID:DMO1kVAm.net
1 :デフォルトの名無しさん:2012/08/16(木) 20:58:00.31
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。

535 :デフォルトの名無しさん:2014/07/03(木) 20:06:28.12 ID:Ct9dkTzH.net
つかぬことをお聞きしますが
皆さんのfortranの本の勉強履歴はどんな流れですか?
私は冨田さんfortran90の本→辞書的にfortran90入門をかいつまむぐらいしか
やっておらずとりあえず拙いなりに読み書きはするのですが
なにか良い本あればおしえていただけないでしょうか

536 :デフォルトの名無しさん:2014/07/04(金) 01:38:26.65 ID:41RxNfGp.net
故岡村先生の授業テキスト
やーっふぉ、やっふぉ、ふぉーとらんらんらん

537 :デフォルトの名無しさん:2014/07/04(金) 01:45:11.81 ID:cNJNO1xN.net
Fortran95/2003 Explained --> Modern Fortran Explained

538 :デフォルトの名無しさん:2014/07/05(土) 07:04:30.09 ID:sNpoyHpR.net
emacsでコメントアウトに使う関数fortran-comment-regionのデフォルトの動作が
行頭にCを挿入するのではなく,C$$(自由形式では!!$)を挿入するのは何か理由があるのでしょうか?
$つけたほうがメリットとかあるの?

539 :デフォルトの名無しさん:2014/07/07(月) 01:06:30.37 ID:1zKRZTH9.net
absoft 9.0でf77fileをコンパイル成功、プログラム自体も上手く行く
absoft11.0でコンパイル成功、プログラム自体もインプットファイルのある部分の記述次第で上手く行く
ある記述部というのはアウトプットするデータ個数を指定するところです。20個程度なら上手くいくのですが数百個と増やすとうまくいきません。
エラーメッセージは
illegal character in numeric input
で、インプットファイルにおかしい部分があると言っています。しかし9.0でコンパイルしたものはきちんとうまくいくのです
何かアドバイスいただけないでしょうか。プログラム自体は3万行程度あるというのと内容だけに書き写すのは難しいです。

540 :デフォルトの名無しさん:2014/07/07(月) 01:25:39.47 ID:VWd7ewX/.net
>>539
よく分からないけど、正常に動くなら9.0のままじゃ駄目なの?
出力するときフォーマットは指定してる?
してるなら*で指定なしにしてみたら

541 :デフォルトの名無しさん:2014/07/07(月) 09:24:44.41 ID:1zKRZTH9.net
>>540
formatを指定しています。そこを当たってみる事にします
9.0のままで良いのですが、引き継ぐものなので後の人のために11.0で動くよう乗り越えておきたいんです。

542 :デフォルトの名無しさん:2014/07/08(火) 00:03:54.23 ID:DZPoMbBV.net
Gfortran で定義してない変数があってもたまにエラーはかない時あって焦った。
デバッグで小一時間汗流したわ。
gfortranってたまにアホな子になるの?

543 :デフォルトの名無しさん:2014/07/08(火) 23:44:01.37 ID:0sSau+NY.net
>>537
>>537
ありがとうございます
まだ私が理解できるレベルにないかもですがいつか読んでみたいと思います

544 :デフォルトの名無しさん:2014/07/09(水) 03:16:15.11 ID:i/yEgb7/.net
>>539
出ているエラーメッセージは、入力ファイルの問題で、数字の代わりに
(たぶん)文字が来ているということ。

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

以前
  300 400 200 0 0
これで右から2番目でおかしくなると言っていたが、たぶん4カラムづつ
入力にとってある。300 400 200 000 000 ならたぶん動くだろう。
今は 0 0 を読んで、数値Formatがおかしいと文句を言われているのだと思う。

545 :デフォルトの名無しさん:2014/07/09(水) 03:17:43.97 ID:i/yEgb7/.net
ではなぜ 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 と書くように。
スレが上がると、冷やかしが紛れ込んできてスレが荒れる原因になる。

546 :デフォルトの名無しさん:2014/07/09(水) 04:42:58.29 ID:2jkWCmKB.net
>>539
>>544,544 に加えてOPEN文のBLANK=も確認するといいかも。
手元の言語仕様のドラフト板ではFORTRAN77/90/95/2003共に
NULLがデフォルトになっているけれど。

それとabsoft9.0と11.0とでコンパイルオプションが違うというオチはない?
コンパイラは上記の様なデフォルトの解釈を変更するオプションを持っていたりするよ。
そのオプションが使われていた場合、ソースをいくら読んでも原因はそこにはないから注意ね。

547 :デフォルトの名無しさん:2014/07/10(木) 18:28:18.82 ID:pJ0O1Ur0.net
FORTRAN77のCOMMON文とEQUIVALENCE文について質問です.
!---
DIMENSION A(4)

EQUIVALENCE (A, V1)

COMMON /VS/ V1, V2, V3, V4

のようなコードをfortran90風に書き直したいのですがAをCOMMONブロックの変数で置換する以外にいい方法は無いでしょうか?
できればSubroutine等を増やすのではなく,Moduleの変数宣言部分だけで解決したいのですが...

548 :デフォルトの名無しさん:2014/07/10(木) 20:24:35.98 ID:2hSWNwRP.net
>> 546
↓使えるかな
http://www.nag-j.co.jp/fortran/FI_16.html
16.1.2 モジュール内の名前を別の名前で参照する方法

549 :デフォルトの名無しさん:2014/07/10(木) 22:05:54.56 ID:pJ0O1Ur0.net
>>548
ありがとうございます
早速以下のように使ってみたんですが
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を配列として扱うことはできないでしょうか?

550 :デフォルトの名無しさん:2014/07/10(木) 22:50:41.50 ID:Te+Dpsre.net
>>547
無理なんじゃないかな。
それはそれで最小にまとまっている。
最適化に問題があるとはいえ、無理して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はメモリーの番地共有だから、便利なことができる。
最適化を抑止してしまうから、主要部分には使わない方がいいが、
技巧的小技としては、うまく使うと短く書けるので、使えばいいんでね?

551 :549:2014/07/10(木) 22:53:27.62 ID:Te+Dpsre.net
修正ミスwww

>ばらばらの番地いる変数を個々にFortranにはポインタの配列はない。
ばらばらの番地いる変数を個々に、ポインタの配列の要素に結び付けようにも、
Fortranにはポインタの配列はない。

552 :デフォルトの名無しさん:2014/07/11(金) 03:55:49.85 ID:wFVmEw9F.net
ちょいと手間だがこれじゃダメかい

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

553 :デフォルトの名無しさん:2014/07/11(金) 04:36:13.83 ID:gSvcXiep.net
>>550
大変詳細な解説ありがとうございます
てっきりEQUIVALENCEは廃止予定事項だと思い込んでましたが便利ですね

>>552の書き方でいこうと思います
equivacenle(A, V1)
でも -chack all -warn allでエラーは出ませんでしたが実行時にメモリ破壊起こるのかな

554 :デフォルトの名無しさん:2014/07/11(金) 09:33:00.25 ID:cGGfPMzQ.net
>>546,>>546,>>546ありがとうございます。
入力データの書式を指定する部分がを見た事がないのでそこを探してみます。ありがとうございます。

555 :デフォルトの名無しさん:2014/07/11(金) 15:22:52.88 ID:RyCozEJp.net
>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段目。

556 :デフォルトの名無しさん:2014/07/12(土) 03:13:21.15 ID:hZ9DjkyP.net
555

557 :デフォルトの名無しさん:2014/07/12(土) 11:23:27.92 ID:Rc8WL8IV.net
>>556
ダミアンもどき

558 :デフォルトの名無しさん:2014/07/12(土) 16:38:17.94 ID:S7/EFRg3T
質問です
長さが7 22 14 9 20cm ノ棒がある 子の5本から3本を選んで三角形を作りたい 三角形を作成可能な組み合わせと素の免責を表として出力するプログラムをつくりたい。
教えてください

559 :デフォルトの名無しさん:2014/07/12(土) 16:40:40.16 ID:S7/EFRg3T
INTEGER A,B,C,DATA(1:1000)
REAL S,MENSEKI
OPEN(10,FILE='HEN.TXT',STATUS='OLD')
READ(10,100) KOSU
100 FORMAT(I4)
READ(10,110) (DATA(I),I=1,KOSU)
110 FORMAT(5I3)
CLOSE(10)
OPEN(20,FILE='HYO.TXT',STATUS='OLD')
WRITE(20,200)
200 FORMAT(' ',8X,'A=',8X,'B=',8X,'C=')

560 :デフォルトの名無しさん:2014/07/12(土) 16:41:13.22 ID:S7/EFRg3T
DO 10 I=1,3
DO 20 J=I+1,4-I
DO 30 K=J+1,5-J
A=DATA(I)
B=DATA(J)
C=DATA(K)
S=(A+B+C)*1/2
MENSEKI=SQRT(S*(S-A)*(S-B)*(S-C))
IF(MENSEKI.GE.0) THEN
WRITE(20,210) DATA(I),DATA(J),DATA(K),MENSEKI
210 FORMAT(' ',I2,I2,I2,D4.2)
ELSE IF(MENSEKI.LT.0) THEN
MESEKI=0
WRITE(20,220) DATA(I),DATA(J),DATA(K),MENSEKI
220 FORMAT(' ',I2,I2,I2,I1)
END IF

30 CONTINUE
20 CONTINUE
10 CONTINUE
          CLOSE(20)
END

561 :デフォルトの名無しさん:2014/07/12(土) 16:41:43.64 ID:S7/EFRg3T
一応作ったのですが、できません。お願いします

562 :デフォルトの名無しさん:2014/07/13(日) 00:10:07.50 ID:+Eo/x1ZD.net
サブルーチンの内部ではうまく計算されているのに、
メインでwriteするとよくわからない大きな数値になってしまっているのですが、
なにか解決のヒントないでしょうか?
断片的で申し訳ありません

563 :デフォルトの名無しさん:2014/07/13(日) 00:31:08.73 ID:+Eo/x1ZD.net
すいません自己解決しました
配列宣言の量が少なかったボンミスです
allocatable使わないとこういうことになるんでしょうか
お騒がせしました

564 :デフォルトの名無しさん:2014/07/19(土) 14:16:39.37 ID:BjGmX3Lx.net
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

まだ残っていきそうな感じだね

565 :デフォルトの名無しさん:2014/07/20(日) 02:33:05.33 ID:RXdcC8ex.net
FORTRANで書かれたBLAS/LAPACKをライブラリとして呼び出しているLLが
FORTRANと同等のスピードが出ることを大々的に喧伝すると、
それに釣られて、もうFORTRANは要らないのだ!とか言い出す人が、
情強を誇るネットの有名人にも多いので草不可避w

566 :デフォルトの名無しさん:2014/07/27(日) 19:42:35.57 ID:fTZkfzZt.net
>>554の問題は解決したのかいな?

567 :デフォルトの名無しさん:2014/08/04(月) 11:41:31.29 ID:IXwYtmhs.net
バイナリ出力をするときにOPEN文に指定する
form='binary'はFortranの標準ではなく、独自拡張みたいですが、
標準のコーディングだけで'binary'と完全に等価なバイナリ出力をする方法はありますか?

form='unformatted'を指定すると、write文を書くたびに
データの最初と最後に4バイトのレコード長がつき、
form='binary'を指定すると前後4バイトがつかないみたいです。

568 :デフォルトの名無しさん:2014/08/04(月) 17:53:28.34 ID:fzuw5J0Z.net
Fortran2003以降ならストリームが使える
http://www.nag-j.co.jp/fortran/fortran2003/Fortran2003_7_1.html#AUTOTOC_7_1

569 :562:2014/08/04(月) 22:17:03.55 ID:IXwYtmhs.net
>>568
ありがとうございます。
試してみます。

570 :デフォルトの名無しさん:2014/08/05(火) 02:23:56.59 ID:BDydvxMf.net
directファイルを使うテクニックもある。
確実ではないが、大抵の処理系では、バイトまたはワード単位でべた書き
しているので、binaryの代わりに使える。

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

まぁ今の時代は素直に stream だろうが。

571 :562:2014/08/07(木) 21:48:00.99 ID:ZvlX+BXk.net
>>570
またまたありがとうございます。今日、会社でstreamを試してみたら、
コンパイラが古いためか(Windows版Intel Fortran 9.1)、
コンパイル時に「streamなんて知らないよ」って言われました。
directで試してみることにします。

572 :デフォルトの名無しさん:2014/08/13(水) 09:39:36.70 ID:zOP+9CLuA
>>566
あれから見てみましたがどうも解決しません。
メモ帳に保存しておき、f77,f90.95形式などで保存しなおしてbuildをしてみましたが変わらず。

573 :デフォルトの名無しさん:2014/08/13(水) 10:42:21.52 ID:KHi6ZJrR.net
構造型にSave属性つけられないんですけど
構造型をModuleに入れてグローバル変数として使いまわすのは危険(未定義になる可能性があるん)でしょうか

あとFortranの質問じゃないかもしれませんが
Intel MKLのBLAS/Lapack95はpure procedureであるとInterface定義に明記されてるけど
BLAS/Lapack77はPureなんでしょうか

574 :デフォルトの名無しさん:2014/08/13(水) 11:45:31.24 ID:KHi6ZJrR.net
↑すみません 多分自己解決しました
構造体の定義のあと変数宣言したものにはsave属性つけられますね(定義しかしてなかった)

BLAS77は間違った引数渡すと標準出力(か標準エラー出力)になんか表示されるのでpureじゃないってことでしょうかね

575 :デフォルトの名無しさん:2014/08/13(水) 12:55:08.27 ID:RBRmoRtS.net
>>574
そもそもFORTRAN77には言語仕様上pureは存在しない。
Lapack95はFortran95以降のプログラムからLAPACKのprocedureを
利用し易くするためのラッパーライブラリに過ぎない。

576 :デフォルトの名無しさん:2014/08/13(水) 22:38:10.66 ID:/aB3oPfT.net
(コンパイル済みの)外部サブルーチンが真にpureかどうかは開発者/提供者の責任かと
例外処理は pure 要件から外していいと判断し、
pure と明記しておくことで最適化を妨げないようにしたのだろう

577 :デフォルトの名無しさん:2014/08/14(木) 02:43:06.91 ID:EFpyKW9s.net
Fortranの組み込みサブルーチンで、乱数がサブルーチンで関数になっていないから
他言語に比べて使いにくいなと思っていたが、FORTRAN は PURE じゃないものは
関数にしない方針で一貫していて、乱数はPURE(参照透明)じゃないから
関数にしなかったんだと分かって、なんか納得した。時刻サブルーチンとかも。


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

まぁFORTRANの場合、依存性があると最適化の邪魔になるから、
依存性を嫌っているだけだけどw 結果的にはより徹底している。

578 :デフォルトの名無しさん:2014/08/21(木) 12:25:07.46 ID:J2kSTdr3.net
マットラボてどうなん?フォートランと比べて何か秀でた点ある?

579 :デフォルトの名無しさん:2014/08/21(木) 22:20:31.76 ID:f+zPplkQ.net
そんなん解決したい問題,実装したい理論によりけりやろ
まあ計算規模が小さくて使いたいライブラリがMATLABにあるならそっち使ったほうが幸せになれるぞきっと

580 :デフォルトの名無しさん:2014/08/23(土) 12:29:18.39 ID:r0lW6Kse.net
>>579
ま、それもそうだよな。
グラフのフィッティングソフトでいいのなかったので悩んでた。
無償でいいのないもんかねぇ。
Fittkだかもあんま美味だし…

581 :デフォルトの名無しさん:2014/08/24(日) 20:56:38.40 ID:JVJfgdMr.net
MINUIT使えば

582 :デフォルトの名無しさん:2014/08/28(木) 13:13:31.88 ID:G1Zq4e11.net
MATLABって個人使用なら五千円に値下げになってなかったけ?

583 :デフォルトの名無しさん:2014/08/30(土) 13:35:28.03 ID:SJevJ5zH.net
>>581
ググってもなかなか情報ないんだね。
でもfortrN で書かれたパケなんですね!
これは貴重な情報です、ありがとうです!

584 :デフォルトの名無しさん:2014/08/31(日) 23:33:34.12 ID:ChHwlQ4k.net
興味でお聞きしたいのですがfortranで株の発注のようなことはできたりしませんか?
例えば証券ホームページににログインし発注操作するなど・・
そういう言語じゃないのかもしれませんが・・

585 :デフォルトの名無しさん:2014/08/31(日) 23:49:50.53 ID:lawRyb1w.net
fortranからC言語の関数呼び出せるので...
それじゃ邪道ですかw

まあHFTも金勘定も数値計算だしいいんじゃないでしょうかね

586 :デフォルトの名無しさん:2014/09/01(月) 03:24:17.76 ID:xOVRhMZQ.net
そう言えば、Fortranって少数第n位以下を切り捨てみたいな関数ないんだね…
Excelで言うrounddownみたいなやつ。
今、ファイル書き出すのに一々四捨五入されちまって困りマクリングでつ、はい(´・_・`)

587 :デフォルトの名無しさん:2014/09/01(月) 13:00:12.21 ID:3fk/vRi5.net
>>586
簡単だし自作したら良いじゃない?

588 :デフォルトの名無しさん:2014/09/01(月) 22:10:23.80 ID:wdLC/vQV.net
>>585
ありがとうございます
なるほど他の言語を読み出せばいけそうなんですね
今後やってみたいです

589 :デフォルトの名無しさん:2014/09/02(火) 07:37:26.28 ID:ADLMggi1.net
>>587
やはり自作しかないのね…
てかラウンドダウン程の関数が無い事に驚きだお
どっかでパッケージモジュールとして保管出来るようにするかね

590 :デフォルトの名無しさん:2014/09/02(火) 08:58:57.02 ID:wSUV6Pdf.net
そんなに端数が気になるならもうひと桁増やして丸めればよかろうに

591 :デフォルトの名無しさん:2014/09/02(火) 20:48:24.61 ID:vngmZpQR.net
むしろ、簡単に実装できるのにわざわざ関数がある言語のが珍しいかと

592 :デフォルトの名無しさん:2014/09/02(火) 21:36:00.72 ID:2O5G2v8m.net
>>590
0.4999999999を小数点以下3桁で切り捨て表示するために4桁で文字列化しても内部処理が丸めだと0.500になってしまうかもしれんぞ
素直に1000倍して切り捨てて1000で割るがよろしい

593 :デフォルトの名無しさん:2014/09/03(水) 02:46:13.39 ID:TB1UfkpT.net
>>586
なぬ?途中の計算の話じゃなくて、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の仕様をよく読んでくれ。

594 :デフォルトの名無しさん:2014/09/03(水) 13:00:08.93 ID:TB1UfkpT.net
昼休みに調べたら rd ru の類はF2003だった。
あと rp processor dependent という処理系依存型もあるようだ。
あとOPEN文で指定する方法もある。

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

とはいえ自然科学ではない商習慣等での丸め等もあるようだから
別にそれがいけないわけでなく、それに合った言語例えば
BCD演算できるCOBOLなどで計算すべきのみ。

595 :デフォルトの名無しさん:2014/09/03(水) 22:10:06.94 ID:aKlULROR.net
2015出たんだね

596 :デフォルトの名無しさん:2014/09/04(木) 02:18:06.97 ID:dS3FSElc.net
Fortran コンパイラメーカ
Intel PGI Pathscale   (Intel NVidia AMD/ATI) アクセレレータ御三家

Absoft NAG          独自色 

Lahey/Fujitsu Silverfrost  斜陽族

GFortran g95        GNU Free系

こんなとこか? 

597 :デフォルトの名無しさん:2014/09/04(木) 02:51:19.67 ID:Yy5o2rJg.net
Free系にOpen64と(一応)dragoneggがあるぞ
dragoneggはgcc4.8.3以降はサポートしてないしflangは開発止まってるし
この辺が活発化すれば若い人がたくさん来ると思うんだけどな

598 :デフォルトの名無しさん:2014/09/05(金) 04:17:28.12 ID:tI2mbO8v.net
GNUでFortranやAdaが熱心にサポートされているのは、米国防総省あたりからの
金が流れているからなのかな?

意識高いw進歩的wCS学科若年層には人気は全くないのに。
それともおっさん層しかやってないからなのか?
そのわりにGNU COBOLとかPL/IとかALGOL、PASCAL、Modula-2とかやらないし。

599 :デフォルトの名無しさん:2014/09/05(金) 08:06:03.87 ID:DENIJuH5.net
>>593
でもfortran95でしょ、ほとんどサポしてるのは

600 :デフォルトの名無しさん:2014/09/07(日) 03:06:28.08 ID:5kwVdIF1.net
Cray, IBM, PGI, Intel が F2003 完全対応したな。
NAGはあと一歩。
GFortranは進捗どうですか?

スパコンだと SXは90 Hitachiも90? Fujitsuは95? 
それぞれつまみ食い的に拡張してあるが。

601 :デフォルトの名無しさん:2014/09/07(日) 04:28:58.48 ID:+IELT+xO.net
日立のはコンパイルオプション-hf95で問題なく使えてたがあれ完全準拠じゃなかったのかな
まあ完全準拠だったらわざわざfortran90コンパイラとは名乗らないか

602 :デフォルトの名無しさん:2014/09/10(水) 14:57:01.18 ID:rySPmzVQ.net
そういや、fortranのデータの取り扱い方について詳しくかいせつしてる本てあまりないね。

603 :デフォルトの名無しさん:2014/09/13(土) 13:38:42.01 ID:xbN/YUGu.net
fortranのデータってなんじゃい?ファイルのことか?

604 :デフォルトの名無しさん:2014/09/13(土) 20:59:58.06 ID:1ASLKxa3.net
>>602
format read writeのことなら、コンパイラーの取扱説明書が(独自仕様拡張部分も含めて)もっとも詳しいよね。

605 :デフォルトの名無しさん:2014/09/14(日) 15:27:09.67 ID:aEQdUpNg.net
intel fortranはIMSLも非商用は無償にしてくれないかな・・

606 :デフォルトの名無しさん:2014/09/15(月) 02:35:29.49 ID:0r1HU9OA.net
IMSLは会社が違うから無理だべ。
IntelはCPU売るためにソフトのコンパイラを撒き餌としてばら撒いてもペイするが、
IMSLの方としては特に得しないし。

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

それはそうと日本の大学の大型計算機センターにたまっていたライブラリも、
NETLIBみたいにネットに公開して吐き出せばいいのに。

607 :デフォルトの名無しさん:2014/09/15(月) 09:55:29.48 ID:SmofGg9r.net
>>604
Gfortran なんやけど…(´・_・`)
もうやめようかな。

Gfortran で書いたプログラムをIntel fortran でもコンパイルすること出来ますか?

608 :デフォルトの名無しさん:2014/09/15(月) 11:07:29.74 ID:WIy8nvhC.net
GForce思い出したわ

609 :538:2014/09/16(火) 03:14:29.14 ID:EYsbMZCB.net
>>539ですが、いまだに解決しません。
>>544の「数値が指定カラムからはみだしてないか」という意味がよくわかりません。
指定カラムというのはどこで見ることができるのでしょうか。
9.0と11.0ではビルドのUIが大きく変わっており、ビルドの条件が同じなのかどうか自信がありませんが、ほぼデフォルト状態でビルドしています。

610 :デフォルトの名無しさん:2014/09/17(水) 01:15:32.64 ID:OkbA3cQE.net
>>609
当該 READ 文の FORMAT 文を見ると分かる。
たぶん昔のプログラムだから READ(99, 1000) N,B,C... みたいになっているだろう。
その場合行番号付で 1000 FORMAT(1H , 云々) となっている FORMAT文を見ればいい。
その行と引用しているREAD文を2chにコピペすればいい。

どの行かわからんというならDEBUGオプションでtracebackをオンにしてやれば
エラーで死んだところで行番号が出るはず。

611 :デフォルトの名無しさん:2014/09/18(木) 00:30:49.37 ID:+0AmgyUa.net
Fortranってどの程度配列メモリに記憶出来てるのかな?

例えば
do i = 1, 100
Read(20,*) (a(i,j),j=1,20
End do
で write(*,*) a(99,15)とかどこまで記憶出来てるもんなんやろ?

612 :デフォルトの名無しさん:2014/09/18(木) 21:41:43.06 ID:16BBiZdw.net
eclipseである程度長いサブルーチンも何十個か呼び出しているプログラムで
call systemが通らくなるのですがなにか原因ありますか?
ブラウザソフト立ち上げながらでもダメだったのでメモリがらみと思うのですが


ざっくりしすぎですいませんがなにかヒントあればおねがいします・・

613 :デフォルトの名無しさん:2014/09/19(金) 00:43:16.70 ID:0+vn6Zlr.net
>>611
質問の意味が分からんよ???
Fortranじゃ宣言分はがっつり確保されとるよ。

>>612
タスクマネージャーとか ps コマンドとかでメモリーの使用状況を見てみたら?
call system が通らないのはメモリー満杯くさい。

614 :デフォルトの名無しさん:2014/09/19(金) 01:31:53.81 ID:3dCDoxc8.net
>>613
ありがとうございました
ps alxで見るとrssがまさに満杯でいっぱいのようでした
cat /proc/meminfoで見るとフリーが10Gぐらい残っていて
大丈夫と思っていたのですが違いが分かっておらず
違いを勉強しようと思います
もしご存知でしたらまた教えていただけると幸いです

615 :デフォルトの名無しさん:2014/09/19(金) 03:08:40.00 ID:f7fTMqdH.net
>>613
そうなの?

616 :デフォルトの名無しさん:2014/09/19(金) 22:55:20.41 ID:0+vn6Zlr.net
>>614
http://tweeeety.hateblo.jp/entry/20140130/1391054452
色々まとめてあるみたい。

617 :デフォルトの名無しさん:2014/09/20(土) 20:11:45.61 ID:onD5DKrz.net
>>616
ありがとうございます。べんきょうになりました。

メモリ節約のために可能な限りallocatableに変更したら余裕ができて解決しました。
個人利用のプログラムには必要ないと思っていましたが大事でした
ありがとうございました

618 :デフォルトの名無しさん:2014/09/22(月) 04:03:57.88 ID:Huxb6fEK.net
配列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 (スカラー値)じゃなきゃいかんってことなんだろう
配列をスカラー値に戻す関数ってないのかね?

619 :デフォルトの名無しさん:2014/09/22(月) 08:08:38.00 ID:/rW2WBkU.net
配列は要素を指定すればスカラーになるだろ

620 :デフォルトの名無しさん:2014/09/23(火) 00:55:12.38 ID:07zJk+Gd.net
>>618
次元を指定すればおk。1次元でもあえて1を指定すればスカラーで返してくれる。
do i = 1, maxloc(a, 1)
1要素配列を返す奴らに使える、基本的なテクニックですぞい。

改行要らなければ
write(20,*) a(:maxloc(a, 1))
で1行で済む。

621 :デフォルトの名無しさん:2014/09/23(火) 02:10:29.02 ID:UZWdIj2A.net
>>620
いやぁ助かります。
ここは参考書に載ってないテクを知ってる方がたくさんいるからやめられない…

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

あと、科学数値計算やってる方に聞きたいのですが、最適な刻み幅ってどう決定してますか?
対数刻みやらなんやらありますが、結局自己流やらなんやらでしっくりしたものに出会えず時間を無駄にしてる感たっぷりなんです

622 :デフォルトの名無しさん:2014/09/23(火) 12:59:19.57 ID:07zJk+Gd.net
>>621
maxloc とかに dim 引数が入ったのは F95 以降で、
F90 時代は要素1個の配列を返されて誰もが窮していた。

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

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

たぶん10年以上無駄な1要素配列のプログラム書いていたwww

623 :デフォルトの名無しさん:2014/09/26(金) 01:28:02.38 ID:sHXJvEEg.net
誰か>>618>>620の解説をしてもらえないでしょうか
まったく意味がわからない

624 :デフォルトの名無しさん:2014/09/26(金) 02:38:03.65 ID:jeu5JnPX.net
>>623
配列 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(:) と同じ意味になり文法エラーが出る。
>>618 の質問は、do i = 1, m(1) に当たる事を実行したいので、
配列をスカラー値に戻す方法はないか?と質問している。

それに対する>>620の答えは、maxloc( a, dim = 1 ) を使えと言っている。
これは配列の要素を返す。普通は多次元配列に対して用いて、行や列の成分を
取りだすのに使う。

625 :デフォルトの名無しさん:2014/09/28(日) 02:23:58.55 ID:qwG5nd4I.net
>>624
1次元配列の特定の1つの値を返すのに、それは1次元の1要素の「配列」として返されるからdo文では使えないということですね。それが配列の次元(dimension)を1と言うと解決するあたりがしっくりきませんね・・・。

626 :デフォルトの名無しさん:2014/09/28(日) 03:11:58.13 ID:W6jZi88T.net
>>625
多次元配列を maxloc に渡すと、最大値の座標を (/ 1, 2, 3 /) みたいな感じで
一次元配列で返す。 この成分を取り出すのが dim 引数。
1要素配列でも成分取り出せる。
まぁしっくりくるまで文法書を舐めるように読んでくれprpr

627 :デフォルトの名無しさん:2014/10/08(水) 00:58:36.59 ID:9VdrGSON.net
x(100)があるとして、計算しているのになぜか例えばx(40)から値が0になってしまいます
考えられる原因ないでしょうか
無茶ぶりですいません

628 :デフォルトの名無しさん:2014/10/08(水) 01:09:28.89 ID:fqHZeb8H.net
さすがに無理
もう少しヒントをくれ玉へ

629 :デフォルトの名無しさん:2014/10/08(水) 07:15:04.02 ID:90i0u9P7.net
>>627
日本語になってない。
逝ってよし

630 :デフォルトの名無しさん:2014/10/08(水) 08:00:58.16 ID:99q9svOz.net
今時逝ってよしとかねえよ

631 :デフォルトの名無しさん:2014/10/08(水) 20:12:54.14 ID:9VdrGSON.net
>>628-629
ありがとうございます
確かにひどかったです・・すいません

ただ、症状がなんとも表現できていないので
もう少しうまく表現できるよう考えてみようと思います

632 :デフォルトの名無しさん:2014/10/09(木) 00:38:44.90 ID:n00d9Wif.net
>>630
そんなこと言ったら今時fortran なんかねーよと言われるぞ。
そんなことないだろ?つまり逝ってよしもそんなことないのだ。

633 :デフォルトの名無しさん:2014/10/09(木) 02:25:56.01 ID:FBZt25be.net
>>631
xが途中で変わってしまうなら

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

くらいしか思い付かない
実は0になる計算をしていたなんてことはないよね

634 :デフォルトの名無しさん:2014/10/10(金) 03:19:01.38 ID:OpKqoeIe.net
まぁ大方書き込んだつもりになっているが、ループが39までしか回ってないという
パターンだろう。
初期値に1e38とかNaNとか書いておけばいい。

635 :デフォルトの名無しさん:2014/10/11(土) 16:00:47.58 ID:C1s+VS97.net
>逝ってよし
逝ってよし ってフレーズ最後に見たの何年前だろう?10年くらい前?
ちょっとクスッと来てしまった。

悪くないよ〜

636 :デフォルトの名無しさん:2014/10/12(日) 11:19:06.43 ID:Zy5yf7AD.net
>>633
>>634
ありがとうございました
基本的なミスだろう、というご教示を参考に見なおしたところ解決しました
x(40)以降を計算するのに地味にyを使っていたのですが、
yを計算するサブルーチンをcallする前にxを計算するサブルーチンをcallしてしまっていただけでした・・
ズコーって感じかもしれませんが私としてはレスいただき大変助かりました

637 :デフォルトの名無しさん:2014/10/12(日) 22:43:53.80 ID:q3BSJrqr.net
gfortranで
call system(cd ..)
とやっても上のディレクトリに移動できません。

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

これは仕様なのでしょうか?

638 :デフォルトの名無しさん:2014/10/13(月) 20:38:43.03 ID:qvDo+/hC.net
>>637
systemからのcd実行なら仕様。
別のshellが起動してcdを実行して処理を終了するので、呼び出しもとのshellとは無関係。
GNUならディレクトリを変更したい場合はCHDIRが使える。

639 :デフォルトの名無しさん:2014/10/13(月) 21:42:58.17 ID:BJqw9Buj.net
>>638
ありがとうございます。
if文でCHDIRに置き換えれば良さそうですね。
仕組みもわかりました。

640 :デフォルトの名無しさん:2014/10/14(火) 10:25:49.65 ID:gGwwURe/.net
とか言って失敗しましたw CHDIRをつかうとshからpremission deniedと怒られます。

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

のようなコードです。SELinuxのせいかと思いましたが違いました。
ご教示いただければ幸いです。

641 :デフォルトの名無しさん:2014/10/14(火) 10:53:43.84 ID:gGwwURe/.net
追加すると、cdコマンドは成功しています。でも、

sh: 1: ..: Permission denied

と怒られますw

642 :デフォルトの名無しさん:2014/10/17(金) 08:36:55.32 ID:/3IlFIL9.net
素朴な疑問なんですが
write( *,101) n
write(10,101) n

こういう式って一行にまとめられないんですか

643 :デフォルトの名無しさん:2014/10/17(金) 14:01:54.72 ID:5NvG3gNF.net
>>642
write ... ; write ,,,

644 :デフォルトの名無しさん:2014/10/18(土) 03:21:07.25 ID:1z7UQB1P.net
言い換えます
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

645 :デフォルトの名無しさん:2014/10/18(土) 04:32:28.37 ID:pf8oYVZE.net
10,11だと外部ファイルか
それだと複数の装置番号に同時に出力する方法はない(0以上のスカラーでなければならない)

変数をまとめたいなら配列nにa-zを代入すればできる

646 :デフォルトの名無しさん:2014/10/18(土) 06:08:15.41 ID:5RvmRbo5.net
>>644
出力するユニットが同じならサブルーチンでまとめれば良いんじゃない?

647 :デフォルトの名無しさん:2014/10/18(土) 07:53:57.67 ID:py32Gd52.net
fortranからRを呼び出すようなことはできないでしょうか?
system call?からRを呼び出すぐらいしかないでしょうかね?

648 :デフォルトの名無しさん:2014/10/18(土) 08:55:47.73 ID:XNaq3m/i.net
gnuplotでもそうだが
Rのソースをfortranで生成するようにして
system callから実行させればいいだろ

649 :デフォルトの名無しさん:2014/10/18(土) 09:10:45.91 ID:XNaq3m/i.net
>>644
こんなのかな

iu(1:3) = (/6,10,11/)
do i=1,size(iu);
write(iu(i),101) ...
enddo

650 :デフォルトの名無しさん:2014/10/18(土) 09:18:33.82 ID:XNaq3m/i.net
考えてみれば四行に増えたなwwwwwww

651 :デフォルトの名無しさん:2014/10/19(日) 01:11:43.08 ID:66Dn4RCH.net
たしか coarray を使うとプロセスが複数走って、それぞれのプロセスで
別々にI/Oできるから形式上は1行でできるぞ。
まぁこれがやりたいことではないのは重々承知だがwww

652 :デフォルトの名無しさん:2014/10/19(日) 13:24:38.74 ID:jrAJRFBN.net
>>648
サンクスです
ライブラリみたいのはないのかもしれませんね

653 :デフォルトの名無しさん:2014/10/20(月) 00:32:03.39 ID:w06RwgSj.net
配列内の最大最小を、区間指定でできませんか?
maxだとできなかったんですが

654 :デフォルトの名無しさん:2014/10/20(月) 01:10:20.17 ID:Q283dmtl.net
区間指定ってなんだよw 
maxlocのことか?それともmaxval(a(20:20))のことか?

他人に理解できる表現で頼むぜw

655 :デフォルトの名無しさん:2014/10/21(火) 04:04:46.35 ID:dBWrLa1J.net
>>653
部分配列に代入して、maxを使うという意味?

656 :デフォルトの名無しさん:2014/10/21(火) 08:48:40.55 ID:RmR2qSHy.net
>615
亀レスですが、最適な刻み幅については、

森口繁一『数値計算術』に
「題4章 刻み幅の自動調節」
という記述があります。
ご参考までに

657 :デフォルトの名無しさん:2014/10/22(水) 21:06:47.85 ID:ZWb1Adxr.net
>>654
>>655
a(1:20)があったとして、10から20の間だけのaのmaxという意味で書きました
わかりづらくてすいません

658 :デフォルトの名無しさん:2014/10/23(木) 00:20:38.34 ID:uxreCuFc.net
>>656
ありがとうございますm(__)m
さっそく買わせて頂きました。
まだ手元に届いてないですが、その章は結構ページ割かれてますか?

659 :デフォルトの名無しさん:2014/10/23(木) 00:27:54.57 ID:ULvaqeb6.net
ならば MAXVAL(a(10:20)) だ。

660 :デフォルトの名無しさん:2014/10/23(木) 08:52:15.53 ID:afuBwKUi.net
>658
p.195〜206
なおプログラムはpascalで書かれています

661 :デフォルトの名無しさん:2014/10/23(木) 23:13:40.41 ID:lbc4SK47.net
>>659
できました!ありがとうございました

662 :ホモおじさん:2014/10/24(金) 00:54:53.39 ID:vm5n6mmb.net
>>661
お安い御用さ。
おじさんに何でも聞いて呉れ玉へ!

>>658
ぼうず。
積分の自動刻み幅調節なら森正武の本に載ってるのがあるぞ。
岩波の77本にプログラムもある。

663 :デフォルトの名無しさん:2014/10/24(金) 01:31:35.96 ID:IV+qiUp4.net
>>660
ありがとうございますm(__)m

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

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

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

定石としてはx を何かに規格化するのかな?とは思うのですが, x の範囲が1から20000と幅広くなかなか思いつきません.
何か妙案はございますでしょうか?

664 :ホモおじさん:2014/10/24(金) 03:18:53.64 ID:vm5n6mmb.net
>>663
xが大きい方で計算したいなら通分して 1/(1-exp(-x)) の形で計算するのが定石だが、
どっちにしろ x=20〜30くらいでもう 1/1=1 でその先は無理に計算しなくてもいい。


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

それにつけても蔵王のお釜が白濁液まみれというニュースが興味深いよね。

665 :デフォルトの名無しさん:2014/10/28(火) 00:52:02.95 ID:UO1zyFOr.net
Fortran で realloc に相当することをやりたんだけど、どうしたらいいでしょうぁ。

666 :デフォルトの名無しさん:2014/10/28(火) 03:20:58.44 ID:1iw7NGT6.net
>>665
宣言でallocatable
使う前にallocateで割り当て
大きさ変える前にdeallocateしてallocateで再割り当て
中身を確実に保存したかったらdeallocate前に別の変数にコピー
これで一応配列の大きさを変えれる

667 :デフォルトの名無しさん:2014/10/28(火) 03:55:09.13 ID:2ZNKkFIp.net
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 参照

668 :デフォルトの名無しさん:2014/10/29(水) 00:46:52.02 ID:RDb2D61y.net
ちょっとスレチかもしれませんが…
無限級数の和が1になるものうち、\Sigma^{\infty}_{0} (1/2)^n よりも収束速度がゆっくりなものって何かありますか?

刻み幅に使いたいんですが中々思いつかないですm(__)m

669 :デフォルトの名無しさん:2014/10/29(水) 12:33:02.25 ID:HQN23iJw.net
質問がおかしいので、たぶん刻み幅っていうより問題設定が間違っている。

670 :デフォルトの名無しさん:2014/10/30(木) 00:25:40.34 ID:BI8qle6I.net
>>669
つまりは足し上げて1に収束するような数列を知りたいんです。

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

これだと収束スピードが速すぎるので、もう少し緩めに収束する数列を知りたいんです

671 :デフォルトの名無しさん:2014/10/30(木) 22:03:37.99 ID:jLdY1ojF.net
intel fortran compilerが、非商用版があると聞いたんですけど
ホームページに行ってもありませんでした
もう非商用版は終了したんでしょうか

672 :デフォルトの名無しさん:2014/10/30(木) 23:06:25.70 ID:BI8qle6I.net
>>671
ありますよ

673 :デフォルトの名無しさん:2014/10/30(木) 23:08:34.49 ID:jLdY1ojF.net
>>672
自分の探し不足ですかね
よければURLおしえていただけませんか?

674 :デフォルトの名無しさん:2014/10/30(木) 23:46:30.56 ID:BI8qle6I.net
>>673
ttp://pen.agbi.tsukuba.ac.jp/~RStiger/hiki2/?Fortran+(Intel+Parallel+Studio+XE)+%A4%CE%A5%A4%A5%F3%A5%B9%A5%C8

この辺参考にしましたよ(^^)

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

ttp://registrationcenter-download.intel.com/akdlm/irc_nas/4584/parallel_studio_xe_2015.tgz

676 :デフォルトの名無しさん:2014/10/31(金) 18:03:58.39 ID:NN74lK+x.net
>>674
>>675
無事ダウンロードできました。ご親切にありがとうございました。

677 :デフォルトの名無しさん:2014/11/01(土) 22:28:08.66 ID:wAFS/Rlb.net
amazon ec2で計算してる人いる?

678 :デフォルトの名無しさん:2014/11/02(日) 10:01:51.45 ID:P1O0Zm4b.net
>675
御呈示のアドレスはLinux版ですが、Windows版
について情報をおもちではないでしょうか

679 :デフォルトの名無しさん:2014/11/02(日) 10:23:39.60 ID:Y+tjsjxk.net
>>678
無償版ってこと?Linuxのみ無償なんだよ
よく読めよ、カス

680 :デフォルトの名無しさん:2014/11/02(日) 20:58:20.47 ID:r8jFoIGa.net
乞食か

681 :デフォルトの名無しさん:2014/11/06(木) 01:07:08.08 ID:NBIHQ5C4.net
Linux版以外も学生非商用は無料だろ。

682 :デフォルトの名無しさん:2014/11/06(木) 07:51:33.96 ID:lC8feXNL.net
>>681
嘘つくなよ、ゴミ屑

683 :デフォルトの名無しさん:2014/11/16(日) 23:31:47.83 ID:jtA73LXf.net
2つの実測値の相関係数を出したいのですが、
fortranでできないでしょうか
実測値は単純な直線傾向ではないです
エクセルで手動でやることも考えたのですが、
実測値が100ケースほどあって、
今後も増えることを考えるとプログラムで作りたいと思いました
もしよければアドバイスいただけないでしょうか

684 :デフォルトの名無しさん:2014/11/17(月) 09:46:48.96 ID:vGRlOVoS.net
>>683
Rを使用するのが一番手っ取り早いと思います。
Rを調べてみてあなたのやりたいことができそうなら、あえてプログラムを作る必要もないのでは。

685 :デフォルトの名無しさん:2014/11/17(月) 13:53:58.07 ID:jwH5O+V+.net
>>684
Octave でもいいんじゃないの?

686 :デフォルトの名無しさん:2014/11/17(月) 18:52:41.93 ID:yxNOhCMR.net
>>684,679
いろいろソフトがあるのですね。
調べて試してみようと思います。ありがとうございました。

687 :デフォルトの名無しさん:2014/11/18(火) 14:32:17.44 ID:EkFrl+1/X
次の非線形方程式f(x)=x**2-2sinx=0
ε=0.0001 x=0の解を除く
と、
(x1-xa)**2+(x2-ya)**2=ra**2
(x1-xb)**2+(x2-yb)**2=rb**2
ra=rb=2
xa=ya=yb=2
xb=5
ε=0.0001

この二つのニュートンラプソン法を使ったFORTRANプログラムを教えてください

688 :デフォルトの名無しさん:2014/11/19(水) 23:56:13.70 ID:k+X9SzuTR
>>687 一つ目
      DATA X,S,AE,M/5.0,4.0,0.0001,50/
      WRITE(*,*) ' *** NONLINEAR EQUATION ***'
      WRITE(*,*) '      (SECANT METHID)'
      WRITE(*,*)
      WRITE(*,200) X,S
      WRITE(*,210) AE
      WRITE(*,220) M
      WRITE(*,*)
      CALL SECANT(X,S,AE,M,IND)
      IF (IND.NE.0) THEN
         WRITE(*,230) IND
         STOP
      ENDIF
      WRITE(*,*)' * SOLUTION *'
      WRITE(*,240) S,M
      STOP
  200 FORMAT('  INITIAL VALUE               =',F8.5,' ,'F9.5)
  210 FORMAT('  ALLOWABLE ERROR             =',F8.5)
  220 FORMAT('  MAXIMUM NUMBER OF ITERATIONS=',I3)
  230 FORMAT('     IND=',I3)
  240 FORMAT('  X=',F8.5,'   K=',I3)
      END

689 :デフォルトの名無しさん:2014/11/19(水) 23:56:35.52 ID:k+X9SzuTR
      FUNCTION F(X)
       F=X**2-2.0*SIN(X)
      RETURN
      END

      SUBROUTINE SECANT(X,S,AE,M,IND)
      IND=0
      IF (X.EQ.S)THEN
         IND=29
         RETURN
      ENDIF
      DO 10 K=1,M
       A=F(X)
       B=F(S)
       W=(X*B-S*A)/(B-A)
       E=ABS((W-S)/W)
       X=S
       S=W
       IF (E.LE.AE) THEN
          M=K
          RETURN
       ENDIF
   10 CONTINUE
      IND=30
      RETURN
      END

690 :デフォルトの名無しさん:2014/11/19(水) 23:58:21.21 ID:k+X9SzuTR
二つ目
      DIMENSION X(20),S(20)
      DATA N,X(1),X(2),AE,M/2,3.0,3.0,0.0001,50/
      WRITE(*,*)' *** SIMULTANEOUS NONLINEAR EQUATION ***'
      WRITE(*,*)'   (METHOD OF SUCCESSIVE SUBSTITUTION)'
      WRITE(*,*)
      WRITE(*,200) N
      WRITE(*,*) ' INITIAL VALUE'
      WRITE(*,210) (X(I),I=1,N)
      WRITE(*,220) AE
      WRITE(*,230) M
      WRITE(*,*)
      CALL SSUCSS(N,X,AE,M,S,IND)
      IF (IND.NE.0) THEN
         WRITE(*,240)IND
         STOP
      ENDIF
  200 FORMAT('  NUMBER OF EQUATIONS         =',I3)
  210 FORMAT(4X,'X(1)=',F8.5,5X,'X(2)=',F8.5)
  220 FORMAT('  ALLPWABLE ERRPR             =',F8.5)
  230 FORMAT('  MAXIMUM NUMBER OF ITERATIONS=',I3)
  240 FORMAT('     IND=',I3)
  250 FORMAT('    K=',I3)
      END

691 :デフォルトの名無しさん:2014/11/19(水) 23:59:06.48 ID:k+X9SzuTR
      SUBROUTINE FG(X,F,G)
      DIMENSION X(20),F(20),G(20,21)
      F(1)=(X(1)-2.0)**2+(X(2)-2.0)**2-4.0
      F(2)=(X(1)-5.0)**2+(X(2)-2.0)**2-4.0
      G(1,1)=2.0*(X(1)-2.0)
      G(1,2)=2.0*(X(2)-2.0)
      G(2,1)=2.0*(X(1)-5.0)
      G(2,2)=2.0*(X(2)-2.0)
      RETURN
      END

692 :デフォルトの名無しさん:2014/11/19(水) 23:59:31.44 ID:k+X9SzuTR
      SUBROUTINE SNEWTR(N,X,AE,M,S,IND)
      DIMENSION X(20),S(20),F(20),G(20,21)
      IND=0
      IF (N.GT.20) THEN
         IND=31
         RETURN
      ENDIF
      DO 60 K=I,M
       CALL FG(X,F,G)
       DO 10 J=I,N
        G(J,N+1)=-F(J)
   10   CONTINUE
         CALL GUSJOR(G,N,I,IND)
          IF (IND.NE.0)RETURN
          DO 20 J=I,N
           S(J)=X(J)+G(J,N+I)
   20     CONTINUE
          DO 30 J=I,N
           E=ABS(G(J,N+1)/S(J))
           IF (E.GT.AE) GOTO 40
   30     CONTINUE
          M=K
          RETURN
   40   DO 50 J=I,N
         X(J)=S(J)
   50   CONTINUE
   60 CONTINUE
      IND=32
      RETURN
      END

693 :デフォルトの名無しさん:2014/11/20(木) 00:01:42.61 ID:3BF/AzROQ
>>687
昔の参考書にあった問題でした。
ただfortran90/95に対応していませんので誰か
対応したものを挙げてくれると助かります

694 :デフォルトの名無しさん:2014/12/13(土) 01:43:27.96 ID:IhMrPb/B.net
Fortranで書かれている遺伝的アルゴリズムのライブラリが
手に入るところはないでしょうか

695 :名無しさん@そうだ選挙に行こう:2014/12/13(土) 18:32:39.00 ID:ycSbkqQR.net
ちっとはググれw

http://www.cuaerospace.com/Technology/GeneticAlgorithm.aspx

696 :デフォルトの名無しさん:2014/12/15(月) 00:30:38.37 ID:+0+wnp46.net
MPICH または OPENMPI で Fortran2008 bindings を使う方法を教えろ下さい。
ドキュメントにはサポートと書いてあるが、インストールしても MPI_F08.MOD が
生成されない@Ubuntu

どうか助けろ下さい。こっちのスレへ行けという指示でもおk

697 :デフォルトの名無しさん:2014/12/15(月) 19:55:14.30 ID:oICLvczS.net
ランダム生成のコードのについて質問です。
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 とした時)本質的に配列である。といったメッセージだと思い、いじってみたのですが解決方法が分かりません。よろしくお願いします。

あと / ~ / のスラッシュの意味もよろしければお願いします。

698 :デフォルトの名無しさん:2014/12/15(月) 20:47:21.21 ID:vJVAgy9L.net
試しにgfortran4.9でrandom_seed(size=i)(iはinteger)を実行したらi=12だった
つまりgfortranの場合はputの引数が大きさ12以上の1次元整数配列でなければならない
(/c*999/)は大きさ1の1次元配列で、その値がc*999という意味だからエラーになる

699 :デフォルトの名無しさん:2014/12/15(月) 20:51:20.48 ID:waUBgqmC.net
>>695
ありがとうございます
ググれと言いながら教えていただいた優しさに感謝します
使わせていただきます

700 :デフォルトの名無しさん:2014/12/15(月) 22:17:44.08 ID:oICLvczS.net
>>698
丁寧な説明ありがとうございます。

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

スラッシュが配列を表しているとは気づきませんでした。勉強になります。

701 :デフォルトの名無しさん:2014/12/17(水) 02:40:01.63 ID:5R4Eyqcc.net
LU分解のサブルーチンが作れません(ToT)
サンプルがあったらください…

702 :デフォルトの名無しさん:2014/12/17(水) 02:41:44.43 ID:5R4Eyqcc.net
>>701
検索して、それっぽいのが出てきたんですがメインプログラムに噛ませてもうまくいきませんでした…

703 :デフォルトの名無しさん:2014/12/18(木) 08:43:35.24 ID:BU61zCPz.net
>>702
なら氏ね

704 :デフォルトの名無しさん:2014/12/18(木) 14:54:41.87 ID:8HGauugM.net
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では正常に動作しました。

705 :デフォルトの名無しさん:2014/12/18(木) 23:40:19.37 ID:jd6kmeGe.net
計算流体力学を習い初めの学生なんですが、Radeonでfortranの計算をする場合にはどのソフトをインストールすればいいのでしょうか?
MinGW Command PromptとTDM-GCC-64というのを使っています。
出来ればインストール方法が書かれたページも一緒に知りたいです。

706 :デフォルトの名無しさん:2014/12/19(金) 20:10:17.60 ID:nJn0njjQ.net
open文で開いたcsvファイルをread(51,*)〜〜などで
読み込む操作が何回かある場合、
並列化はできたりしないでしょうか
読み書きはやっぱり並列化は無理でしょうか

707 :デフォルトの名無しさん:2014/12/20(土) 11:31:57.54 ID:9/Q8xBDD.net
『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

708 :694:2014/12/20(土) 11:33:00.40 ID:9/Q8xBDD.net
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

709 :694:2014/12/20(土) 11:33:45.85 ID:9/Q8xBDD.net
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

710 :デフォルトの名無しさん:2014/12/21(日) 02:39:49.62 ID:+T8Tju2f.net
>>706
I/O中に計算とかしたいという意味での並列化なら、F2003でasynchronous I/Oが出来る
ようになった。同じファイルの別々の位置のデータを並列に読み出したいという意味なら
そもそもハードウェア的に無理だろう。

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

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

711 :694:2014/12/22(月) 19:17:39.41 ID:mnW7xu7L.net
>>710

明快なお答えありがとうございます.
これまでうっすらと使い分けルールの必要性を感じながらも,
「きっとこれで良いよね?良いんだよね?」と恐る恐る使い分けていました.少し安心しました.

712 :デフォルトの名無しさん:2014/12/22(月) 21:51:51.17 ID:KCseyMpL.net
>>710
ありがとうございます
やりたかったことはcsvファイルがいくつかあり、
それを順番に読み込みreadするdoループを並列化できないかなということでした

教えていただいた後者の方にあたりそうな気がしまして、
勉強になりました。

713 :デフォルトの名無しさん:2014/12/23(火) 16:29:15.14 ID:gTJoh1O6.net
永らくFORTRAN77で飯を食ってたのですが,より新しいFORTRANへ移行してみたくなりました
なにか良書はありましょうか?

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

世の90の初心本(それ以降は書店でも見ないなー)等は基本的な制御構文等が厚く書かれており
ホントに身に着けたい新たな概念のintent等がおざなりになってしまっています
古臭い77書きに光を......
#C++もやってるのでクラスの概念なんかも問題はありません

714 :デフォルトの名無しさん:2014/12/23(火) 16:43:41.88 ID:AyCexUV4.net
日本語の書籍に関しては仰る通りで、特に2003以降は全くないはず
まずはnagのサイトにあるFortran入門とFortran 2003入門が無難かと
ただ、これらは規格を網羅してるわけではないので
完全な仕様を知りたい場合はコンパイラのマニュアルや
JIS規格(JIS X 3001-1:2009)も参照する必要あり

715 :デフォルトの名無しさん:2014/12/23(火) 20:48:23.28 ID:gTJoh1O6.net
>707

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

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

#Cのswitchの議論と同じなので探してみると良いよ

716 :700:2014/12/23(火) 20:51:07.24 ID:gTJoh1O6.net
ありがとうございます
まずはサイトのそれらを読んでみます

その後は......JISかー,読みやすさを優先してくれないからなー
コンパイラのマニュアルは殆ど英語になるのが悲しい

717 :デフォルトの名無しさん:2014/12/23(火) 23:30:23.88 ID:pDBo2/8d.net
>713,716
Fortran90の日本語の解説本で良いなら、
 bit別冊 詳解Fortran90 1993年12月号別冊 共立出版
という本があります。これは『Fortran90 Explained』の日本語訳です。
但し、雑誌の別冊ということもあり入手は極めて困難でしょう。
あるとすれば、理工系の大学図書館が一番可能性が高いと思います。
参考までにどうぞ。

718 :デフォルトの名無しさん:2014/12/29(月) 01:02:13.12 ID:hjLOuT9S.net
Fortranを使われている方は他にはどんな言語を扱っているのですか?
pythonとかでしょうか

719 :デフォルトの名無しさん:2014/12/29(月) 09:04:30.59 ID:6EMRS7hN.net
>>718
perl

720 :デフォルトの名無しさん:2015/01/04(日) 14:13:23.64 ID:OaA6oEKz.net
>>713
おいらもFORTRAN77使いなんで、小文字のプログラムに違和感ありまくり

721 :デフォルトの名無しさん:2015/01/04(日) 16:56:46.08 ID:Ydg+fj8+.net
>>720
こっちはfortran90からの新参なんで、77のソース見ると大文字、goto文ありでなかなか新鮮です。

ところでfortran2003の機能すべてカバーしてるコンパイラは商用しかないのかな。
gfortran使いなんでカナピー(´・_・`)

722 :デフォルトの名無しさん:2015/01/04(日) 20:02:59.44 ID:1HVLEOms.net
商用だけですな
しかし商用Fortranコンパイラは趣味で買うには高すぎるので
gfortranが対応してる範囲で書いてます

723 :デフォルトの名無しさん:2015/01/04(日) 23:43:36.28 ID:YPIAtxeL.net
>>721
Linuxならifortのnon-commercial板、MacならFreePGIがあるけど
Windowsは無いみたいだね。

724 :デフォルトの名無しさん:2015/01/04(日) 23:48:08.93 ID:YPIAtxeL.net
>>723
変換ミス
(誤)non-commercial板
(正)non-commercial版

gfortranの2003フルサポートは何時になるのやら。

725 :デフォルトの名無しさん:2015/01/05(月) 11:27:48.33 ID:dcVDuqIP.net
>>723
勉強用なら
VirtualBox(個人使用は無料だったハズ) + Ubuntu日本語Remix仮想ハードディスクイメージ
で、とりあえずLinux環境作っちゃうのも手なんかね

…もちろん、LinuxやBSDに詳しい人にはこの構成では不満が出てくるだろうが
(特にUbuntuの標準GUI、嫌いな人結構多いしな)
知らん人がサクッとUnix系の環境作るには楽だと思った

726 :デフォルトの名無しさん:2015/01/05(月) 12:04:08.73 ID:IJbwWfwV.net
>>725
>VirtualBox(個人使用は無料だったハズ) + Ubuntu日本語Remix仮想ハードディスクイメージ
>で、とりあえずLinux環境作っちゃうのも手なんかね

Fortranの勉強のためならこれが正解だと思う。わざわざLinux用の領域をハードディスク上に
確保して…というのは面倒だしね。自分も次は仮想マシンを使うと思う。
UbuntuのGUIが気に入らない場合は、VirtualBoxにインストールできるか知らないけれど、
RHELクローンやOpenSUSEもあることだし。

727 :デフォルトの名無しさん:2015/01/05(月) 12:13:27.17 ID:K2pJxzU2.net
VirtualBoxに入れるLinuxなんて、GUI抜きで容量減らしてインストールして
sshでもっと使い易い端末エミュレーターから操作するのが普通じゃないか

728 :デフォルトの名無しさん:2015/01/05(月) 12:35:46.63 ID:dcVDuqIP.net
>>727
もちろんそれが理想的だし、解ってりゃ大したことないんだけどね

729 :デフォルトの名無しさん:2015/01/07(水) 02:53:13.20 ID:2xplb8o3.net
でも最近の Linux intel fortran も windows と同じ GUI でインストールできる
ようになってるし〜 楽ちんしたいのよ〜

730 :デフォルトの名無しさん:2015/01/09(金) 00:18:45.90 ID:osa1YwUn.net
ifortやgfortranのオプションについて教えてください.

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

コンパイラとリンカに与えるべきオプションは,それぞれ,どうやって見分けたら良いんでしょうか?

731 :デフォルトの名無しさん:2015/01/16(金) 00:14:55.27 ID:ZBkPwkB6.net
intel fortranの非商用版終了したっぽいな

732 :デフォルトの名無しさん:2015/01/16(金) 07:28:02.50 ID:zC22PbLh.net
>>731
は?
ソースは?

733 :デフォルトの名無しさん:2015/01/16(金) 10:37:10.07 ID:gldaWoEV.net
>>732
intelのdeveloper zoneで明言してるよ
https://software.intel.com/en-us/forums/topic/533638

734 :デフォルトの名無しさん:2015/01/16(金) 11:08:31.95 ID:pdIo+qaj.net
>>733
ありがとうm(__)m

735 :デフォルトの名無しさん:2015/01/20(火) 00:53:26.59 ID:jj5OmV/0.net
薄汚い乞食が多すぎたんだな

736 :デフォルトの名無しさん:2015/01/20(火) 02:58:09.86 ID:jVCDWxyp.net
>>735
確かに研究用途で無償版使われているって書いてるな

737 :デフォルトの名無しさん:2015/01/20(火) 16:42:37.43 ID:kWeIi6xm.net
すみません。本読んだり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の部分だけを取り出したいのですが、
どうすればよいのでしょうか?

738 :デフォルトの名無しさん:2015/01/20(火) 17:17:10.54 ID:zoNsgUGG.net
>>737
過去レスヨメカス

739 :デフォルトの名無しさん:2015/01/20(火) 17:19:19.79 ID:mCR0Xk39.net
>>738
ソウイワナイデオシエロヨ

740 :デフォルトの名無しさん:2015/01/20(火) 17:39:47.89 ID:kWeIi6xm.net
>>738

すみません。過去すれにあるのですか?
ざっとしか見てなかったので気づいてませんでした。
もう一度探してみます。

741 :デフォルトの名無しさん:2015/01/23(金) 18:58:35.64 ID:6zzjBSZc/
急ぎではない質問です。
当方、PGI Visual Fortran(ver.14.9)でCUDAを利用し始めまして、
手元にある他の人のプログラムからちょっとずつ勉強しているのですが、
よく"use cudafor"という一文を見かけます。
cudaforというmoduleがどこかで定義されているってことなんでしょうが、
これ、いったいどこのフォルダのどのファイルで定義されているんでしょうか?
PGIなのかnVidiaなのか、できればPC上のパスでも知りたいです。
インストールされている場所は多分デフォルト設定のはず...です。

742 :デフォルトの名無しさん:2015/01/24(土) 14:38:14.65 ID:vOXkay9k.net
cosやexpとかの組み込み関数が学校のifortだと通るんだけど家のgfortranだと通らない助けて
no implicit typeって言われる

743 :デフォルトの名無しさん:2015/01/24(土) 16:14:31.36 ID:YsJc5wwN.net
>>742
その関数に渡す実引数の宣言で処理系依存の型パラメータを使っているとか?
ソースを晒せば適切な助言を受けられると思う。

744 :デフォルトの名無しさん:2015/01/24(土) 17:04:25.97 ID:vOXkay9k.net
4倍精度から倍精度にしたら実行できました
gcc4.6以降は4倍もサポートしてるそうなんですがおかしいですね…
ありがとうございました

745 :デフォルトの名無しさん:2015/01/25(日) 14:22:03.88 ID:mPYFAplZ.net
>742

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桁以上の精度がでているとおもいますが、

746 :デフォルトの名無しさん:2015/01/25(日) 14:24:04.46 ID:mPYFAplZ.net
>745

>fortran 4.8.1

gfortran 4.8.1

のtypoです。しつれいしました。

747 :デフォルトの名無しさん:2015/01/27(火) 15:08:58.38 ID:TDQ9+ev7.net
>>744
もう解決しているかも知れないけれど、処理系が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

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

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

fortranに関する知識は一切ございません。すみません

749 :デフォルトの名無しさん:2015/01/30(金) 19:35:01.91 ID:QUUDxgkN.net
>>748
どんな環境なのか、OSとコンパイラくらい書こうよ。
エラーメッセージによるとwww01.datの途中に
ファイルの終端を表すend-of-fileが挿入されているっぽいが。

750 :デフォルトの名無しさん:2015/01/30(金) 20:02:06.39 ID:JnK0Au4d.net
>>748
データの読み込み中にEOFが来た
つまり、読み込む変数に対してファイルのデータ数が足りない

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

何より教授に聞けよ

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

関係ないが気になったのでつい

752 :デフォルトの名無しさん:2015/02/04(水) 05:53:12.64 ID:Y9ZHS9LP.net
ちょいとみなさんのお知恵拝借させてもらえたら幸い。

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

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

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

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

753 :738:2015/02/04(水) 05:54:22.46 ID:Y9ZHS9LP.net
連投すんません
S(x(i),y(i),z(i))は新しい関数ですm(__)m

よろしくお願い申し上げます。

754 :デフォルトの名無しさん:2015/02/04(水) 21:13:09.14 ID:uLg2ampX.net
>>752
収束ループを出てから、書いたら?

755 :デフォルトの名無しさん:2015/02/04(水) 21:21:39.45 ID:1jln5owW.net
求めた解はどこかで使うんでしょ?なら,使う直前にwrite文を書けばいいのではないか?

というか,
>二分法かなんか
『なんか』ってなんだ?そんなきき方でどう答えろというんだろうか?
その例の書き方だと,そもそも二分法の使い方を理解しているのかと,そっちの方が心配になる.

756 :738:2015/02/10(火) 07:40:57.77 ID:dNNycAes.net
>>755
すまん!書き方悪かった。
「なんか」と書いたのは二分法等イテレーションする場合と言いたかった。

757 :デフォルトの名無しさん:2015/02/11(水) 01:54:42.49 ID:rsWy3Hp4.net
debugをしたら
user breakpoint called from code at 0x7c94120e
と出てきたのですが、どういった意味なんでしょうか

758 :デフォルトの名無しさん:2015/02/11(水) 02:18:15.77 ID:947xRA4B.net
環境書こうよ……
まず、>>1の注意事項を読んでくれ

759 :デフォルトの名無しさん:2015/02/11(水) 02:35:40.04 ID:+/9jIDfQ.net
>>757
回線切って逝ってよし

760 :デフォルトの名無しさん:2015/02/11(水) 10:40:19.88 ID:I3RcppAe.net
>>757
デバッガがプログラムを呼び出して実行してブレークポイントに到達して止まった
つまり意図通り
ブレークポイントを誰がどうやって設置したかは環境次第

761 :デフォルトの名無しさん:2015/02/11(水) 22:51:10.13 ID:pX2dRfIb.net
コンパイラはどれを使っていますか?

762 :デフォルトの名無しさん:2015/02/11(水) 23:16:27.84 ID:LIuSSWm5.net
g95

763 :デフォルトの名無しさん:2015/02/15(日) 01:10:05.40 ID:g8pHAe2n.net
Rの関数(cor(x,y)など)をFortranプログラム上で使えるようにできないでしょうか
Rに入っている関数のsoファイルを利用してなどできたりしないでしょうか

764 :デフォルトの名無しさん:2015/02/15(日) 13:38:58.18 ID:TAercYgC.net
>>763 あなたは Fortran ではなく R を使うべきなのではないのでしょうか

765 :デフォルトの名無しさん:2015/02/15(日) 14:45:03.59 ID:83OS2d7V.net
Rがコマンドから使えるなら普通にSYSTEMすればいいんじゃないの

766 :デフォルトの名無しさん:2015/02/15(日) 22:02:11.88 ID:g8pHAe2n.net
>>764-765
事情がありFortranで組む必要があったので仕方なく・・
ありがとうざいました

767 :デフォルトの名無しさん:2015/02/15(日) 22:03:52.96 ID:/BGdl65O.net
そもそもFORTRANにはRなんか手も足もでないような統計ライブラリが存在するはずだが

768 :デフォルトの名無しさん:2015/02/16(月) 00:11:19.19 ID:cFBQlJ5l.net
>>767
IMSLかMKLの統計サマリーですかね?
使いたいのは比較的新しめの統計量で、
そこには用意されていないけどRにはあったので・・

769 :デフォルトの名無しさん:2015/02/16(月) 04:49:19.07 ID:OLD7Gvb9.net
相関係数求めるだけだろ?
http://tama.green.gifu-u.ac.jp/~tama/soft/sample_prog/correlation/

770 :デフォルトの名無しさん:2015/02/19(木) 01:32:20.14 ID:Q9g/vdpG.net
今更ながらなんだがフォートランとオクターブの組み合わせ最高だよな。
今まではfortran とgnuplot だったけど

771 :デフォルトの名無しさん:2015/02/19(木) 21:39:16.47 ID:8T3EPm25.net
お絵かきできんの?

772 :デフォルトの名無しさん:2015/02/21(土) 13:41:52.59 ID:cqnG5WW8.net
オクターブってMATLABのパチモンだっけ?
最近もメンテされてるの?

773 :デフォルトの名無しさん:2015/02/21(土) 20:21:39.11 ID:vWiUl97q.net
>>771
余裕でお絵描きできるよ。
お絵描き機能は gnuplot のを踏襲してるぽ

>>772
まだまだ現役

774 :デフォルトの名無しさん:2015/02/22(日) 06:07:07.89 ID:Dll6CUOh.net
お絵かきとは2chのお絵かき機能のこと。
この板はできないのか?

775 :デフォルトの名無しさん:2015/02/24(火) 12:10:45.71 ID:dL6o6kyB.net
3/3から2chのapi始動するけど移住しなくても大丈夫かね
とりあえずdat廃止されるまではここはNavi2chで巡回するけど

776 :デフォルトの名無しさん:2015/02/25(水) 18:07:19.77 ID:q//8/n6w.net
>>775
移住先の候補があるなら教えて欲しい。

777 :デフォルトの名無しさん:2015/02/27(金) 19:13:57.57 ID:8CupuJ11.net
とりあえずおーぷん2chにたてるだけたてといた
http://toro.open☆2ch.net/test/read.cgi/tech/1425031440/
(☆はNGワード対策)
何事もないことが一番だけどそんときは避難所代わりに使ってください 現に今人多杉状態だけど
ここ質問スレだけど他にfortranスレないしfortran全般に関する喋り場ならおーぷんでいいよね?転載嫌いとかアフィリエイト嫌いとかのひとがいたらすまんが

純粋な質問に関してはstackoverflow日本語版も始まったしそっちも賑わってほしいなあと思ってる(現在3件しかない)
本家stackoverflowの方はfortranに関してもかなりお世話になってるし

778 :デフォルトの名無しさん:2015/02/28(土) 14:09:46.29 ID:fZ9CqkAf.net
お若い方。
この世間に疎い爺に何が起きているのか3行くらいで教えてくれんかね?
カチュ〜シャが使えなくなってから専ブラともお別れじゃよアッハッハ

2chがたらこのものでなくなったらしい話は風のうわさに聞いたども、
移住とは何のことじゃね?

779 :デフォルトの名無しさん:2015/02/28(土) 14:12:07.22 ID:ptkFuNoe.net
>>777
おーぷん2chは知らなかった。何かあればそちらを使わせてもらいます。
stackoverflowの方はgoogleでの検索がヒットした時ぐらいしか行かなかったけれど、
日本語版はありがたいね。こちらも覗きに行きます。

780 :デフォルトの名無しさん:2015/02/28(土) 14:20:37.08 ID:ptkFuNoe.net
>>778
私もよく知らないが、現在の専ブラが使っているdatが廃止される。2chを専ブラで利用するためには
2chが提供するAPIが必須となるが、このAPIは2chから使用許諾を受ける必要がある。
よって今のようなオープンソースの専ブラの開発、提供は難しいようだ。

781 :デフォルトの名無しさん:2015/03/09(月) 22:22:14.04 ID:XrkMx/p/.net
>>493
私も見たいと思ったのですが…
該当章はなくなってしまったようですね.
(もう8か月以上だから仕方ないか)

782 :デフォルトの名無しさん:2015/03/09(月) 22:37:50.67 ID:wBxXg+k6.net
おいおいTip集に分離されただけで記事は残ってるぞ
nagのトップページから見てみ

783 :デフォルトの名無しさん:2015/03/10(火) 23:05:49.08 ID:Gi5LttGt.net
Hey!Yo!Brother!

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

できればジーザスの言葉と同じアラム語かおじちゃんと同じ言葉の日本語で頼むよ!
敵性語はノンノン!

784 :デフォルトの名無しさん:2015/03/15(日) 13:51:14.51 ID:Fao0AffOq
FORTRANはゲームプログラミングに使えないと言われてムカつきます
なんとか美麗なグラフィックのゲームを作って見返したいのですが
キー入力やスプライト周りの便利なライブラリないですか(挫折)

785 :デフォルトの名無しさん:2015/03/17(火) 02:57:32.45 ID:qWCLUX9n.net
>>784
ああ、それは腹立つな
Fortran Graphic、Fortran OpenGLで検索するとそこそこ出てくる
けど、まともにメンテナンスされてるのが無さげでもある……

786 :デフォルトの名無しさん:2015/03/21(土) 20:51:39.73 ID:A7bsOdex.net
プログラム中のx行目?y行目のソースコードを出力させるwrite文の書き方はないでしょうか

787 :デフォルトの名無しさん:2015/03/22(日) 10:00:02.71 ID:upANbGQj.net
>>786
ねーよ

788 :デフォルトの名無しさん:2015/03/22(日) 14:18:33.06 ID:qEVJABmn.net
>>786
プログラム単体では無理
単純に任意のファイルのx行目を表示するプログラムなら簡単
指定行まで読み飛ばして、指定行を十分長い文字列で読み込めば良い
それでソースファイルを読んで表示するならできるけど
ソースファイルは常に必要

789 :デフォルトの名無しさん:2015/03/22(日) 15:16:23.54 ID:lBBw+fHF.net
Quineが書きたいという話ではなくて?

790 :デフォルトの名無しさん:2015/03/22(日) 16:35:49.10 ID:CWUz6yZb.net
>>788
なるほどopenして目的行寸前まで空readしてread×行数すればいいということですね
解決できそうです。ありがとうございました
>>789
初めて聞きました。勉強になりました

791 :デフォルトの名無しさん:2015/03/24(火) 21:45:10.36 ID:Vm8bqf+W.net
>>790
俺にもお礼言えよ、クソ野郎

792 :デフォルトの名無しさん:2015/03/26(木) 23:15:58.87 ID:Gl+r/2fs.net
3次元のスカラーデータを吐く、x,y,zのdoループをompにしようとしたんだけど、スタックオーバーフローだなんて怒られた

どーすんべ?

793 :デフォルトの名無しさん:2015/03/27(金) 02:28:15.56 ID:agfznfe3.net
安直にはコンパイラ、リンカのオプションでスタック増やせ。

794 :デフォルトの名無しさん:2015/04/28(火) 17:28:05.66 ID:iBflpoE2.net
MinGWのGCC4.9.2ののFORTRANで, -fcase-upperのようなオプションってありますかね?
昔のバージョンにはあったみたいなんですが, 現在のは削除されたようで.

795 :デフォルトの名無しさん:2015/05/10(日) 17:08:53.50 ID:xJAFgSar.net
Intel fortran無料版のライセンスが改定されて
オープンソースへの貢献を証明しなきゃならなくなってた
https://software.intel.com/en-us/qualify-for-free-software/opensourcecontributor

796 :デフォルトの名無しさん:2015/05/11(月) 01:08:44.47 ID:54EXtOYg.net
Gfortran とIntel fortran のそれぞれの利点って何かね( ´ ▽ ` )ノ

797 :デフォルトの名無しさん:2015/05/11(月) 01:47:31.11 ID:XHL5HbZn.net
え、gfortranに利点なんかあるの?
ああ、うん、gccツールチェインの一部なのは便利だよね

798 :デフォルトの名無しさん:2015/05/11(月) 06:54:00.10 ID:qOqdHGiK.net
ハードウェアで二倍の性能出す金払うくらいだったら、Intelのコンパイラ買えよ。
ソフトには金出せないってどんだけ唯物論のアカなんだよw

799 :デフォルトの名無しさん:2015/05/11(月) 10:33:22.97 ID:54EXtOYg.net
>>797
なに、そんなレベル違いますのん?

800 :デフォルトの名無しさん:2015/05/13(水) 06:59:19.62 ID:5ad/p9/H.net
>>799
10年くらい前は差は歴然としてました。
最近はどうなのでしょうね?

801 :デフォルトの名無しさん:2015/05/15(金) 02:52:46.16 ID:3VlILQzP.net
intelは自動並列化があるから中級者は使用を薦める

802 :デフォルトの名無しさん:2015/05/31(日) 00:46:49.58 ID:z6xjuO2m.net
このレス数からしてFortran使ってる人はほとんどいないのかな?

803 :デフォルトの名無しさん:2015/05/31(日) 01:15:28.56 ID:dBkTICLM.net
ここでの質問は学生がほとんどのように見える
一般人は使わないだろうから少ないのは確かだろうけど
調べたり相談できる人が多いんじゃない?

804 :デフォルトの名無しさん:2015/05/31(日) 05:24:16.45 ID:z6xjuO2m.net
>>803
なるほど
じゃあ私遠慮無く質問しまくっちゃっおうかな

805 :デフォルトの名無しさん:2015/06/05(金) 00:40:30.28 ID:rgF7y0m6.net
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になるはずなんですが。。。

806 :デフォルトの名無しさん:2015/06/05(金) 01:52:18.65 ID:rTO63fPn.net
>>805
なんとなく初期化してない変数が引っかかっている気がする
minvalの動作不良を疑うならコンパイラとか環境を書こう
違うならソースをできるだけ書こう
長くてソース貼れないならこんな感じに晒すと検証が楽
https://ideone.com/JstGnQ

807 :デフォルトの名無しさん:2015/06/05(金) 23:13:40.04 ID:zCKBsI7m.net
>>805
単精度を入れているのに倍精度で値が返ってきているのが気になる。
なんか倍精度と単精度をまぜこぜにしているか、コンパイラが間違っていてまぜこぜにしている。

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

808 :デフォルトの名無しさん:2015/06/06(土) 00:34:55.86 ID:TK6bZDgw.net
>>807
ideoneってfortranいけるのかw

809 :デフォルトの名無しさん:2015/06/06(土) 01:24:14.49 ID:pgwiShP2.net
変数に値が入ってるかどうかの判断ってどうしてる?ポインタとか使わずになんかNull かどうか?っての判断できんのかね?
ちなみにgfortran 4.2 でDebian 8.0 64bit版での話なんだが。

810 :デフォルトの名無しさん:2015/06/06(土) 02:41:06.93 ID:cFX9ZRwg.net
>>809 ??
ASSOCIATED とか ALLOCATED じゃダメなのか?
普通の変数の場合はどうしようもないよな。

811 :デフォルトの名無しさん:2015/06/06(土) 05:09:32.95 ID:pgwiShP2.net
>>810
>>809 ??
>ASSOCIATED とか ALLOCATED じゃダメなのか?
配列やらポインタ使えってこと?

>普通の変数の場合はどうしようもないよな。
やはりそうなのかね?値がない場合をやって見たら、0.00000って表示されたのには吹いた

812 :デフォルトの名無しさん:2015/06/06(土) 12:21:31.78 ID:cFX9ZRwg.net
>>811
変数について何か勘違いしてないか???

ただどうしてもというなら、F2003ならスカラーのALLOCTABLEというのがあるので
それを使えばいい。

813 :デフォルトの名無しさん:2015/06/06(土) 19:54:52.83 ID:pgwiShP2.net
>>812
多分何か勘違いしてるかも。
俺の意識では、変数という箱に計算された数値データが格納されるってイメージなんだよなぁ。

814 :デフォルトの名無しさん:2015/06/06(土) 20:47:16.10 ID:5sLoB1TNv
>>809
>変数に値が入ってるかどうかの判断ってどうしてる?ポインタとか使わずになんかNull かどうか?っての判断できんのかね?
未初期化の変数にはコンパイラが適当な値を入れるはず。
ゼロかも知れないし、そうではないかも知れない。
変数を未初期化のまま使っていないか確認したければ、
コンパイラの警告オプションを探せば該当のオプションがあるかも。
gccなら-Wuninitialized、ifortなら-check uninitとかあるけれど、gfortranで使えるかは知らない。

815 :デフォルトの名無しさん:2015/06/09(火) 15:20:38.21 ID:t89alswU.net
まったくの初心者なのですが質問失礼します
f77形式で書かれたプログラムをf90形式に変換した所plplotという描画用プログラムがエラーだらけで動きません
具体的には、「関数plwid に対する定義されてない参照です」のようなメッセージがいっぱいでてきます
どうしたらよいのか教えていただけませんか?お願いします

816 :デフォルトの名無しさん:2015/06/09(火) 16:35:27.82 ID:a3IapIzqd
>>815
plplotの関数を使うプログラム単位の宣言部でplplotのモジュールをuse文で指定する。
plplotライブラリのインストールディレクトリとライブラリの名前をコンパイラに教える。
すぐに思いつくのはこの二点かな。

817 :デフォルトの名無しさん:2015/06/09(火) 18:47:39.82 ID:t89alswU.net
>>806すみません補足します
OSはLinux beanでコンパイラはgfortranです

818 :デフォルトの名無しさん:2015/06/09(火) 20:02:28.27 ID:PG87IvKa.net
>>815
もとのプログラムはf77で正常にコンパイルできてるの?
gfortranでそのままいけるやろ

819 :デフォルトの名無しさん:2015/06/14(日) 00:09:43.12 ID:1ASDFy3f.net
Fortran未だに使ってる人いますか?
やっぱり昔に構築しちゃった遺産をそのまま使う方ばかりですか?

820 :デフォルトの名無しさん:2015/06/14(日) 00:15:12.75 ID:oyhhJPji.net
天文学の計算で有効数字が16桁以上で計算したいものが
あり、C/C++では桁数の関係で微妙なので、Fortran
の4倍長精度を使って計算しています。
64ビットあるいは80ビットでなくて128ビット
で計算できるのが有りがたいです。

821 :デフォルトの名無しさん:2015/06/14(日) 02:42:35.24 ID:1ASDFy3f.net
>>820
なるほどご丁寧にありがとうございます
そういった分野があるんだと勉強になりました

822 :デフォルトの名無しさん:2015/06/14(日) 16:29:35.57 ID:oyhhJPji.net
>>820
補足します。
NASAが太陽・月・冥王星を含む惑星の位置を計算
するための基礎データを発表しているのですが、
そのデータがたとえば
0.149597870691000015+09
という有効数字18桁で当れられて
います。
この一定間隔で与えられたデータを数値積分して
位置を計算する必要があります。
C++などのlong doubleでは、有効数字が16桁程度
なので、fortranの4倍長kind(16)を指定すると、
三角関数も4倍精度で計算でき、安心できるわけです。

823 :デフォルトの名無しさん:2015/06/17(水) 10:18:52.06 ID:ti+IkGPz.net
ソフトウェアに興味なくて、ほとんどプログラムやったことない学生が、
専門分野の研究に必要になってから勉強を始めて、曲りなりに必要なプログラム
書けるようになるのが早いのはやっぱFortranだな。

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

ソフトウェアの板でいうと叱られるかもしれないが、
時間かけるならプログラム言語の勉強するより専門分野の勉強する方がいい。

824 :デフォルトの名無しさん:2015/06/19(金) 21:01:11.17 ID:DScX6l8h.net
maxvalを使って上から2番めに大きいものなど抽出したりできませんよね?

825 :デフォルトの名無しさん:2015/06/19(金) 22:45:09.43 ID:JdldsSpH.net
挑発されてるようで不快だが

配列に同じ値がないか、重複を排除した2番目に大きい値
(例えば配列a=(/1, 2, 5, 3, 5/)なら3)を返してほしいなら
maxval(a, mask = a < maxval(a))でいい
配列を降順に並べた時の2番目の値(上の例なら5)を返してほしいなら
maxlocで最初の最大値の位置を特定して、それを除外した配列のmaxvalをとる

826 :デフォルトの名無しさん:2015/06/19(金) 23:35:54.73 ID:DScX6l8h.net
>>825
ありがとうございます。書き方悪かったですすいません・・
今のプログラムがスマートに書るようになりそうで大変助かりました

もしかすると、3番目とかなら
b=maxval(a, mask = a < maxval(a)) !b=2番目に大きい
c=maxval(a,mask=a<b) !c=3番目に大きい
で良いでしょうか、試してみます

827 :デフォルトの名無しさん:2015/06/22(月) 00:36:18.06 ID:GDms9OMt.net
イケメンすぎるwwwwwwwwww

828 :デフォルトの名無しさん:2015/07/04(土) 15:09:30.71 ID:s4aH+BtB.net
a(i,j)
b(j,k)という変数があって、
maxval(a(i,j+5:j+10)) - b(j,k)
という計算をしたいのですが、結果がおかしくなります。
もしかするとmaxvalを使って四則演算するときは配列が同じものを使用しないといけないのでしょうか

829 :デフォルトの名無しさん:2015/07/04(土) 15:23:40.44 ID:s4aH+BtB.net
すいませんプログラムミスのだけでした

830 :デフォルトの名無しさん:2015/07/10(金) 19:11:26.54 ID:/GzszqMd.net
次のようなプログラムを試しに走らせたところ、
ファイルの作成には成功するのですがファイルの読み込みでセグメントエラーが出ます。
原因が分かりません、教えてもらえないでしょうか。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

831 :デフォルトの名無しさん:2015/07/10(金) 21:33:48.54 ID:/Va7ypH/.net
>>830
エラー内容書いて
linux のgfortran 、intel fortranなら普通にいけるが

832 :デフォルトの名無しさん:2015/07/10(金) 21:48:52.27 ID:/GzszqMd.net
次のエラーが出ました。

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

833 :デフォルトの名無しさん:2015/07/11(土) 01:01:00.88 ID:WfA4pvIG.net
Window7,64bitのgfortranを使ってコンパイル実行して
みましたが,

100 200 300
400
500 600

と出力されて無事終了しました。
ちなみに,gfortran64のVersionは4.9.2です。

834 :デフォルトの名無しさん:2015/07/11(土) 13:28:32.70 ID:RZSlcw3F.net
ソフトのバージョンは
gfortra,64bit, ver 5.1.0 のおそらく最新版です。

とりあえず別のコンパイラを試してみます。

835 :デフォルトの名無しさん:2015/07/11(土) 15:08:28.52 ID:RZSlcw3F.net
FTN95 でうまくいきました

やっぱり gfortran ってクソだわ

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


ggshoki.f90:1:20:

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


というエラーが出てしまいました。
どう直せばいいのでしょうか。アドバイスお願いします。

837 :デフォルトの名無しさん:2015/07/12(日) 01:10:26.47 ID:yuQPCUFW.net
上げてしまいました、すみません。

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

です。

838 :デフォルトの名無しさん:2015/07/12(日) 01:14:54.68 ID:yuQPCUFW.net
連レスすみません。
バージョンは5.1.0です。

839 :デフォルトの名無しさん:2015/07/12(日) 01:54:09.24 ID:z4R5SLxl.net
>>836
subroutineの内部で宣言するなら書き方が違うはず
引数で宣言するより別の行で宣言した方が見やすくない?
とりあえず自分はこんな感じで書く
https://ideone.com/HCzWB6

840 :デフォルトの名無しさん:2015/07/15(水) 01:28:37.71 ID:yskKzL3L.net
>>839
リンク先のように書いたらうまくいきました。
自分のプログラムの他の部分も確認したところ、配列の書き方が全て間違っていました(配列A(1:N)をA(N)などと書いていました)。
ありがとうございました。

841 :デフォルトの名無しさん:2015/07/28(火) 11:53:11.24 ID:J4RVztBC.net
教えてください。
サブルーチンに渡された配列引数2つが同一かどうか
(値が同じかどうかではなくて、値を格納するアドレスが同じかどうか)
を確認するすべはありますでしょうか…?

ポインタとか使えるのでしょうかね?よく分かっていません。

842 :デフォルトの名無しさん:2015/07/28(火) 12:08:17.55 ID:J4RVztBC.net
自己解決してしまいました…

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

843 :デフォルトの名無しさん:2015/07/28(火) 12:26:18.89 ID:J4RVztBC.net
いや、すみません間違ってました。値を比較してるだけみたいです。
どうしたらいいんだ。
(日記みたいになってしまってですまんです)

844 :デフォルトの名無しさん:2015/07/28(火) 16:14:57.20 ID:ll5MB+YbM
>>841
試した事がないので自信がないが、組み込み関数associated()を使えばできるかも知れない。
2つの配列引数をpointerで受けてそれぞれを同一targetと比較するとか。
ただ、アドレスが同じか確認するだけなら問題はないと思うが、
一般に1つのルーチンの異なる2つ以上の仮引数で同一実引数を受けるのはあまり行儀が良くないと思う。
上記の方法も配列仮引数ポインターにintent(in)属性を付けた方が良いかも。

845 :デフォルトの名無しさん:2015/07/29(水) 09:56:48.14 ID:2BaiQKnz.net
最近出た『FORTRANハンドブック』
買ったほうがいいかな?

846 :デフォルトの名無しさん:2015/07/29(水) 15:03:19.81 ID:PIi6Yh3/.net
>>843
コンパイラは何?

847 :デフォルトの名無しさん:2015/07/29(水) 23:16:07.78 ID:USyoWCFT.net
ifortです。associated(pointer,target) で行けそうなんですが、
targetの変数にopitional属性がついていて… ><という状況です

848 :デフォルトの名無しさん:2015/07/30(木) 00:48:36.88 ID:5OMMXfec.net
gfortranならlocでアドレス取得できるの確認した
なんか独自拡張みたいだが、ifortにもあるよね

849 :844:2015/07/30(木) 09:50:55.75 ID:NE82NWKL1
>>847
仮引数のoptional属性は省略可能であることを表しているので今回は関係ないです。
仕様書をよく読まずにレスしてしまったけれど、第二仮引数targetはポインターでも良い様です。
中途半端な助言をして申し訳ない。
サンプルコードを貼っておくので、参考にして下さい。

環境: msys2/mingw-w64 gfortran ver5.2
gfortran -pedantic -std=f2008 same_target.f90 -o same_target.exe
注意点
(1)非ポインターの実引数をポインター仮引数に渡せるのはFortran2008以降。intent(in)は必須。
(2)仮引数は形状引き継ぎ配列、または大きさ引き継ぎ配列でなければならない。

program same_target
implicit none
integer, dimension(10), target :: a, b
a = 0
b = 1
print *, "a compares with a."
print *, is_same_array(a, a)
print *, "a compares with b."
print *, is_same_array(a, b)
contains
function is_same_array(a1, a2)
implicit none
logical :: is_same_array
integer, dimension(:), pointer, intent(in) :: a1
integer, dimension(:), pointer, intent(in) :: a2
is_same_array = associated(a1, a2)
end function is_same_array
end program same_target

850 :デフォルトの名無しさん:2015/08/02(日) 15:34:23.65 ID:Gc5k9GMO.net
module内のcontainsのところに書いているfunctionをincというフォルダのsample.f90にまるごと持って行き、
include 'incl/sample.f90'
としたのですが、moduleに書いていた時はは参照できていた変数が
定義されていない参照 となりコンパイルできません。
functionまるごともっていくとかやったらいけないものなのでしょうか?

851 :デフォルトの名無しさん:2015/08/02(日) 16:04:00.19 ID:WYMEG2sEn
>>850
なぜinclude行を使おうと思ったのかとか、フォルダの名前はincなのかinclなのかはさておき、
include行はどこに書いているの?移動した関数を定義していた場所?それとも別?
あと変数はどこで宣言されているの?

852 :デフォルトの名無しさん:2015/08/02(日) 17:13:03.49 ID:5pC+KESf.net
>>850
内部関数を別ファイルにするなら注意が必要
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

853 :デフォルトの名無しさん:2015/08/02(日) 20:38:11.00 ID:Gc5k9GMO.net
>>852
詳しく教えて頂いてありがとうございます。試してみようと思います。
includeってもう非推奨なんですね。代替はmoduleで分割とかできるのかな
include以外のやり方も考えてみます

854 :デフォルトの名無しさん:2015/08/05(水) 16:55:43.17 ID:OhKwnQSp.net
>>842
Fortranって規約では、引数に番地の重なる変数や配列を送っちゃ駄目じゃなかったけ?

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

>>848
loc 相当を規格内でやるには c_loc と transfer で代替するはず。

855 :デフォルトの名無しさん:2015/08/16(日) 01:33:05.77 ID:ZKNwH6b8.net
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.

856 :デフォルトの名無しさん:2015/08/16(日) 01:53:24.79 ID:mdNdQhdt.net
>>855
IF (L) a,b,c

X:負 go to a
X:0 go to b
X:正 go to c

857 :デフォルトの名無しさん:2015/08/16(日) 03:10:40.47 ID:ZKNwH6b8.net
>>856

ご回答ありがとうございました。
助かりましたm(_ _)m

858 :デフォルトの名無しさん:2015/08/16(日) 08:57:02.36 ID:nCIMfI1D.net
>>855
>>856
いわゆる計算型go toはもう忘れられいるのですね。

859 :デフォルトの名無しさん:2015/08/16(日) 09:08:04.74 ID:ZKNwH6b8.net
>>858
私が素人というのもあるのですが、いくつかのFortranのHPみてもIF文の説明には
入っていませんでした。

860 :デフォルトの名無しさん:2015/08/16(日) 12:29:13.36 ID:nCIMfI1D.net
>>869
ただしくは、算術IF文というものです。あるサイトの解説です
古い書き方に算術IFというものがあります。 この書き方はFortranでは廃止予定機能ですが古いプログラムには見かけられる書き方です。
算術IF文は、与えた式が0より小さい場合に最初の文番号へ、 0の場合は2番目の文番号へ、 0よりも大きい場合には3番目の文番号にジャンプします。
if ( 式 ) 文番号1, 文番号2, 文番号3
例)
i = -1
if (i) 100, 200, 300 ! 100へジャンプします

861 :デフォルトの名無しさん:2015/08/16(日) 21:04:42.30 ID:mdNdQhdt.net
古文読解みたいなもんよ。
新たに使うことは無いが、昔のプログラム読む為の教養みたいなもん?

アセンブラから進化したと思えば、まぁこんな命令ありがち感はある。

862 :デフォルトの名無しさん:2015/08/24(月) 05:54:40.65 ID:lgtNqCAf.net
ある参考書にあるプログラム例を映したのですが、実行するとエラーが出ます。内容が外部ファイルへの出力関係なので早急に解決したいのでよろしくお願いします。
プログラム
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
よろしくお願いします

863 :デフォルトの名無しさん:2015/08/24(月) 06:07:47.38 ID:lgtNqCAf.net
申し訳ありません。確認したところ
コンパイラはtdm64-gcc-4.6.1です。

864 :デフォルトの名無しさん:2015/08/24(月) 07:17:38.92 ID:lgtNqCAf.net
再び申し訳ありません。
gfortranのverを落としたら普通にできました。何度もすみませんでした。

865 :デフォルトの名無しさん:2015/10/14(水) 21:51:47.29 ID:S/4UaJI2.net
intelコンパイラのDAALをFortranから
なにかしらの形で呼び出してうまくいった方いませんか?

866 :デフォルトの名無しさん:2015/11/08(日) 17:44:21.58 ID:jBmnCoB4.net
fortranで簡単なguiウィンドウ作れたりしますか?
ウィンドウがあってこのボタンを押すと〜〜のサブルーチン実行のような・・・

867 :デフォルトの名無しさん:2015/11/08(日) 18:57:35.01 ID:8suWMXlm.net
>>866
visual fortranにRADがあったような気がする
けど、Fortranで計算部分をライブラリ化しておいて
別の言語で作ったGUIで呼び出す方が一般的だと思う

868 :デフォルトの名無しさん:2015/11/09(月) 22:25:56.92 ID:oiX/fj8U.net
>>867
ありがとうございます
やっぱり流行りの言語も使ってみたいと思います

869 :デフォルトの名無しさん:2015/12/15(火) 21:50:10.22 ID:CN0jNpr8.net
基本的な質問かもしれませんがfunctionとsubroutineで作るのってどう切り分けたらよいのですか?

870 :デフォルトの名無しさん:2015/12/15(火) 23:39:50.07 ID:m5pV9CjXc
>>869
よく言われるのは『戻り値が一つの場合』はfunction、それ以外はsubroutine。
またsubroutineには『順番が決まっている一連の処理』を一纏めにするという使い方もある。
こちらの使い方は特定の数学問題を解くモノが多い。

871 :デフォルトの名無しさん:2015/12/15(火) 23:58:59.22 ID:8+9MOK5i.net
>>869
functionを使うのは、返値が一つと自明な(かつ明示したい)ときだけかな。

872 :デフォルトの名無しさん:2015/12/16(水) 00:26:30.43 ID:dxIuSVrg.net
>>871
ありがとうございます
計算速度は関係ありませんか?

873 :デフォルトの名無しさん:2015/12/16(水) 00:28:34.56 ID:dxIuSVrg.net
例えばファンクションのほうがその度に呼び出すために計算速度は遅くなるとかありませんかね・・?

874 :デフォルトの名無しさん:2015/12/16(水) 02:24:06.06 ID:cuafR5Si.net
差は感じたことないな
気になるなら簡単なテストプログラム作ってみたら?

875 :デフォルトの名無しさん:2015/12/16(水) 06:34:20.84 ID:qB4UYIzV.net
中身が分からないunformattedで出力されたファイルを読むにはどうすればいいですか?

876 :デフォルトの名無しさん:2015/12/16(水) 22:57:19.85 ID:a/dQTwEW.net
ACCESS='STREAM' でオープンして嫁  詳しくはマニュアル検索検索

877 :デフォルトの名無しさん:2015/12/16(水) 23:02:21.81 ID:a/dQTwEW.net
>>869
function は副作用(PURE の時)がないとき、それ以外なら SUBROUTINE が基本かな。
コンパイラの最適化の観点から、数学的な意味での関数になっているときに使うのがいい。

878 :デフォルトの名無しさん:2015/12/25(金) 14:17:27.29 ID:H3s+gts8.net
今二分法のプログラム書いているんだけど、うまく収束しなくて困ってるのでここで質問させてください

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

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

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

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

ある程度計算を進めると、区間[x1, x2]において、その中点 (x1+x2)/2の値が一定となってしまいます。

879 :デフォルトの名無しさん:2015/12/25(金) 14:24:09.90 ID:H3s+gts8.net
>>878
後出しで申し訳有りません。

変数は全て倍精度で設定しております。

880 :デフォルトの名無しさん:2015/12/25(金) 16:39:31.63 ID:em+Cn0F1.net
>>878

real(16)
と宣言して、8倍精度にしたらどうなりますか。

881 :デフォルトの名無しさん:2015/12/25(金) 16:47:13.93 ID:VJyAJ/uW.net
>>874
>>877
返信おくれてすいません。
勉強になりました。一つ出力でpureな時はファンクションを使うようにします。

882 :デフォルトの名無しさん:2015/12/25(金) 19:21:54.92 ID:H3s+gts8.net
>>880
今4倍精度に宣言して計算終わったところです!
一定になるところは変わりましたが、計算を進めるとやはり中点が一定になります。。。

883 :デフォルトの名無しさん:2015/12/25(金) 19:22:26.63 ID:H3s+gts8.net
>>882
すみません、16倍精度の間違えです

884 :デフォルトの名無しさん:2015/12/26(土) 01:22:24.79 ID:ybGnykyB.net
>>880,861
ちょーーー!!
8倍精度とか16倍精度と違うから! 
普通はバイト数だから8で倍精度、16で4倍精度。
まぁ数値はベンダー依存で規定されていないから、あんたらのコンパイラが
8倍精度や16倍精度なのかもしれないがさw

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

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

885 :デフォルトの名無しさん:2015/12/27(日) 14:58:58.66 ID:j4SegU7G.net
>>878
関数f(x)がもともと収束しない形である可能性はないのか?

886 :デフォルトの名無しさん:2015/12/27(日) 19:35:54.52 ID:yJZ4hzCz.net
>>884
すんません、完璧勘違いしてました!
やはり4倍精度で正しかったですm(_ _)m
勉強になりましたm(_ _)m

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

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


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

グラフなんですが、f(x)が非線形なので数値計算のみでしかもとまらないです。

887 :デフォルトの名無しさん:2015/12/27(日) 23:19:57.50 ID:XJXVRFXp.net
>>886
沢山の点で計算してEXCEL等でプロットすればいいのでは。

888 :デフォルトの名無しさん:2015/12/28(月) 02:36:39.69 ID:lnQX/VRo.net
>>886
まずは4次のルングクッタでグラフ描いてみてはどうだ?

889 :デフォルトの名無しさん:2016/01/09(土) 11:18:03.65 ID:i1gHiPMA.net
implicit な〜ん(笑)

890 :デフォルトの名無しさん:2016/01/18(月) 02:16:26.16 ID:trNoq0XT.net
fortranだと変数がからかどうか判定できないんだっけ?
空だと 0.00が代入されんのかな

891 :デフォルトの名無しさん:2016/01/18(月) 11:50:39.45 ID:jWMk835pU
>>890
普通の変数は判定できない。ポインターなら組み込み関数associated()で可能。
>空だと 0.00が代入されんのかな
空=未初期化のことなら変数の値は不定。
局所変数の初期値ならコンパイラオプションで指定できるコンパイラもある。
gfortranなら-finit-local-zeroオプションとか。

892 :デフォルトの名無しさん:2016/01/18(月) 15:21:34.93 ID:1WswQHMD.net
空ってなんだ? 初期化されていないということか?
Fortranでは初期化されていない変数の値は不定だぞ。ごみが入っている。
0.0は初期か忘れに気づきにくいから、むちゃくちゃな値が入っていたほうが親切。

allocatableがallloctaeされているかいないかならallocated関数かな。

893 :デフォルトの名無しさん:2016/01/19(火) 00:06:44.55 ID:yHbL6fBI.net
>>892
e-307くらいが入る

894 :デフォルトの名無しさん:2016/01/19(火) 01:44:03.17 ID:3ZSQATy/.net
>>892
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に何の数値も代入されていないと自動的に確認するためにはどんなコーディングが必要だろう、この場合。

895 :デフォルトの名無しさん:2016/01/19(火) 06:58:03.23 ID:MMA3M4fE.net
Fortranのレベルでどうこうではなく、Undefined Behavior Sanitizerでも使えばいいんじゃないの

896 :デフォルトの名無しさん:2016/01/19(火) 09:26:07.32 ID:3ZSQATy/.net
>>895
それはオプションかな?
今回の問題とはちょいと違うのだ

897 :デフォルトの名無しさん:2016/01/20(水) 00:17:10.04 ID:0BkO9wkB.net
いまさらfortranで機械学習とかディープラーニングライブラリ作って公開する猛者いませんか?
いたら面白いのになあ

898 :デフォルトの名無しさん:2016/01/22(金) 21:17:23.35 ID:SxQo3Wt7.net
iMacだがLAPACKのコンパイルが上手くいかない。MacBookAirの時は上手く言ったのだが誰か教えてくれないか?

899 :デフォルトの名無しさん:2016/01/22(金) 22:42:37.27 ID:rL4grHGE.net
>>894
Fortran2003 ならスカラーの allocatable もある。

I/O では無理だが、例えば Function からの代入ならば、希望のことはできる。
スカラーへの allocatable 変数が返り値の Function からの自動再割り付けで、
右辺の関数の返り値が空なら、左辺の allocatable スカラーが allocate されないし、
値をもっていれば NULL だろうとallocate されるので allocataed 関数を使えば判別できると思う。

900 :デフォルトの名無しさん:2016/02/05(金) 09:02:45.47 ID:wvmc5Sx8.net
Fortranって何を使ってデバッグするんでしょうか

901 :デフォルトの名無しさん:2016/02/08(月) 00:08:26.47 ID:wknTPR3t.net
>>900
dddとかやん?

902 :デフォルトの名無しさん:2016/02/10(水) 08:13:25.94 ID:ZRcL4yE9.net
>>901
便利そうですね
ありがとうございます

903 :デフォルトの名無しさん:2016/02/12(金) 04:12:40.41 ID:vptI0fCP.net
数値計算するときの刻み幅の決め方が難しすぎるなぁ
等幅だとものすごい配列使うからメモリがオーバーフローするしなんかいい方法ないすかね?
てか、刻み幅に関する詳しい本とかないのかなぁ

904 :デフォルトの名無しさん:2016/02/12(金) 08:22:40.80 ID:1ZkcdkFj.net
>>903
森口繁一先生の
『計算数学夜話』
に、「刻み幅の自動選択」
という話が掲載されていたはずです。
変化がなだらかな区間は刻み幅を広く、
変化が急な区間は刻み幅を狭くするのを
自動化するという話です。

905 :デフォルトの名無しさん:2016/02/14(日) 06:02:56.78 ID:5/5WMEda.net
>>904
ありがとうー
うー、でも手に入らないぽいなー((((;゚Д゚)))))))

906 :デフォルトの名無しさん:2016/02/15(月) 02:04:22.84 ID:sHvN+vmN.net
桁の大きなものと桁の小さなものが混じった数値計算をするとき、規格化するのは常識だと思うんだが。
ある変数の取りうる範囲が極端に振れる場合(例えば、1d-20 < x < 1d8) だとどうすりゃいいんやろか。

907 :デフォルトの名無しさん:2016/02/17(水) 11:45:41.36 ID:8sdmbRj5.net
対数を取れw

908 :デフォルトの名無しさん:2016/02/17(水) 12:17:59.53 ID:IDaBzq+u.net
>>907
それ教授や先輩にも言われたんですかまったく意味わかりませんでした。
刻み幅で対数????といった感じです。

logx(i+1)-logx(i)=刻み幅 ということですか?

909 :デフォルトの名無しさん:2016/02/17(水) 12:40:39.87 ID:5aqj+faD.net
logかました状態だと値の範囲が狭くなるというだけじゃ?

910 :デフォルトの名無しさん:2016/02/17(水) 18:55:07.86 ID:NfIkV94M.net
そもそも問題がわからないから答えようがないな。
たとえば被積分関数が 1d-20 から 1d8 まで振れる場合は小さい値はどうでもいいし。

911 :デフォルトの名無しさん:2016/04/25(月) 20:15:29.39 ID:ABiBIEuQ.net
一次元ポアソン方程式

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

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

どなたかご教授ねがえないでしょうか。

912 :デフォルトの名無しさん:2016/04/25(月) 21:42:21.21 ID:0jtmrtsy.net
ネットでも本でもいいから微分方程式の数値解法について調べること。
いろんな計算方法があるし、特定の言語にこだわる必要もない。

そういえば数値計算のスレって今ないよね。

913 :デフォルトの名無しさん:2016/04/25(月) 21:53:17.04 ID:2LxfGMmK.net
>>911
そもそもその式は解析的に解ける。

914 :デフォルトの名無しさん:2016/04/25(月) 21:53:33.26 ID:2LxfGMmK.net
>>912
欲しいなそんなスレ

915 :デフォルトの名無しさん:2016/05/01(日) 14:42:40.23 ID:tKi6j9CT.net
匿名通信(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的に分散され、特定のサーバーに依存しません


916 :デフォルトの名無しさん:2016/05/01(日) 18:07:45.37 ID:XA7YY+e1.net
言語はなんでも大丈夫ってレベルじゃねーぞ

917 :デフォルトの名無しさん:2016/05/17(火) 20:55:20.04 ID:MgCDmrcL.net
Fortran2015の調子はどうだい?

918 :デフォルトの名無しさん:2016/05/21(土) 18:12:16.63 ID:h3OgqWhP.net
ChromebookでFortranって動かせる?

919 :デフォルトの名無しさん:2016/07/18(月) 20:31:12.72 ID:apSB7g7B.net
全く分かりません
答え教えて下さい
http://i.imgur.com/BB9ERMu.jpg
http://i.imgur.com/SgRmlY6.jpg

920 :デフォルトの名無しさん:2016/07/19(火) 14:21:12.91 ID:qfWdnT3p.net
>>919
逝ってよし

921 :デフォルトの名無しさん:2016/07/19(火) 20:22:44.55 ID:555Vvc50.net
>>919
>>920
この流れいいなw

922 :デフォルトの名無しさん:2016/07/19(火) 22:17:37.41 ID:WRFubhA/.net
>>920
オマエモナー

923 :デフォルトの名無しさん:2016/07/19(火) 22:18:11.36 ID:WRFubhA/.net
>>919
自己解決しますた

924 :デフォルトの名無しさん:2016/07/28(木) 19:47:05.10 ID:nObYn5cT.net
0度〜90度まで30度間隔で正弦と余弦を出力する。但し書式は整数5桁、関数値は10桁で小数点以下6桁とする。

下記でコンパイラしても上手くいかないのですがどこをどのようにすれば宜しいでしょうか?
http://i.imgur.com/xwAoCXH.jpg

925 :デフォルトの名無しさん:2016/07/28(木) 22:14:51.73 ID:E8ct0ihN.net
古風な書き方だな
大学の講義か何かで習ってるの?

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

どの段階でどのように失敗するのか書いてくれるとチェックしやすい
あと、プログラムをコピペしてくれるとこちらが入力する手間が省ける

926 :デフォルトの名無しさん:2016/07/29(金) 07:39:07.85 ID:1zITvd9X.net
>925
確かに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ループの前に出すのがいいのじゃないですか。

927 :デフォルトの名無しさん:2016/07/30(土) 00:26:12.77 ID:CH8BIOrU.net
>>925
>>926
ありがとうございました!
i5に変えたら成功しました!

928 :デフォルトの名無しさん:2016/07/30(土) 00:26:31.27 ID:CH8BIOrU.net
>>925
大学ですね

929 :デフォルトの名無しさん:2016/07/30(土) 01:16:36.18 ID:CH8BIOrU.net
重力のみが作用する振り子の運動を解析するプログラムを完成させよ。
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
知り合いとやってるのですが出来る気配がありません。
❔部分に何が入るか教えて下さい。
Δ、θは置き換えますよね?

930 :デフォルトの名無しさん:2016/07/30(土) 01:17:58.34 ID:CH8BIOrU.net
http://i.imgur.com/JFN9XSU.jpg

931 :デフォルトの名無しさん:2016/07/30(土) 18:19:30.33 ID:MnenPn8v.net
>>929
回線切って氏ね

932 :デフォルトの名無しさん:2016/07/31(日) 23:35:51.92 ID:TkjN2Ici.net
>>929
単振り子で色々調べてますが全く分かりません。
誰か出来る方いましたらお願いします。

933 :デフォルトの名無しさん:2016/08/01(月) 00:02:16.74 ID:018Zh5sQ.net
たぶん運動方程式をたててオイラー法で解くだけでしょ
どの段階で躓いているか分からないと答えようがない

934 :デフォルトの名無しさん:2016/08/01(月) 01:25:45.70 ID:qXp6EaAl.net
宿題全部やってちょうだい感が出てるから、やってくれる人は少なそう

935 :デフォルトの名無しさん:2016/08/01(月) 12:05:07.12 ID:tW3kuaWv.net
エセ左翼の目的は、わざと突っ込みどころが多い主張をすることで自分たちへ注意を向けさせ、
カルトへ向かう非難の矛先を逸らすこと。
国益に反することを言ったり、主張が食い違うもの同士の対立を煽ろうとするので放置し難いが、
主義思想についての洗脳を受けているわけではなく、フリをしているだけなので、
言い負かされてもダメージを負った様子もなく、論点をすり替えられるかスルーされる。
まともに相手をしてはならない。

サヨに対する危機意識が強すぎると、普段は常識的に振舞っている
(又は、サヨから不当に叩かれている)政治家などがズレたことをやろうとした時でも、
許容したり擁護してしまいがちになるので注意が必要。

936 :デフォルトの名無しさん:2016/08/01(月) 22:50:33.91 ID:qgzcRfyo.net
時間、速度、角度を出力するつもりでやったのですがコンパイルした時の値が違います
おそらく運動方程式が間違っているのだと思いますが(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

937 :デフォルトの名無しさん:2016/08/02(火) 00:16:36.76 ID:lf/Rfa1x.net
>936
プログラムの問題ではなくて,数式の問題なんだから,物理板で質問した
ほうがいいのじゃないの。

938 :デフォルトの名無しさん:2016/08/02(火) 01:31:13.87 ID:pyAOnFQt.net
>>936
それFortran以前に運動方程式が全然違う。
v=Lω
dθ/dt = ω
として

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

解析力学、振り子とかで検索したら
ttp://homepage1.nifty.com/gfk/furiko.htm
出てくるだろ、ちゃんと調べろ。
それ以前に理学部とかだったら勉強不足だぞ。

939 :デフォルトの名無しさん:2016/08/02(火) 16:12:24.48 ID:+RnVB/b2.net
どなたか「=>」の意味を教えてください
大なりイコールのような条件式ではなく、記号が逆になっている方です。
具体的には、
DO I =1,NCNEST_NUM
D=>NCNEST_DATA(I)
G=>NCNEST_GRIDS(I)
CALL ASSIGN2BLOCK(D,G)
END DO
のようになっています。データの書き込み系だと睨んでいます。
よろしくお願いします。

940 :デフォルトの名無しさん:2016/08/02(火) 16:20:52.36 ID:e4r/z1Wx.net
>>939
ポインタの指示先を指定している
http://www.nag-j.co.jp/fortran/FI_Pointer.html

941 :デフォルトの名無しさん:2016/08/02(火) 16:23:27.42 ID:W78wvcm1.net


942 :デフォルトの名無しさん:2016/08/02(火) 16:50:17.87 ID:+RnVB/b2.net
>940
すばやい反応ありがとうございます。
「FORTRAN =>」で検索しても出てこなかったので、非常にありがたいです。

943 :デフォルトの名無しさん:2016/08/05(金) 23:42:07.06 ID:y4inqjRe.net
coarrayをwindows7,gfortranで
gfortran coarray.f90 -fcoarray=lib -lcaf_mpi
と打つと、
cannot find -lcaf-mpi
とでてコンパイルできん

https://gcc.gnu.org/wiki/CoarrayLib
を参考にMPICH2の拡張子msiのやつ(ちょいバージョン古い)を管理者権限でインストールしてPATHも通している
mpiexecも出来てるから、インストールに失敗してはいない
助けてくださいお願いします

944 :デフォルトの名無しさん:2016/08/07(日) 15:55:29.04 ID:2PwL22wv.net
caf-mpi.a もしくは caf-mpi.so はたしかにあるの?
バージョン番号付いたやつにリンクしてる?
ってWindowsか、、、Windowsの場合 .lib だったりするのかな

945 :921:2016/08/07(日) 19:58:54.32 ID:6Zl4UqYG.net
今のところwindowsだと無理っぽいね
mpif90がないからlcaf_mpi.aも取れない
おとなしく仮想化使います

946 :デフォルトの名無しさん:2016/09/06(火) 22:18:19.77 ID:VT4c30Iu.net
大気の温度構造を求めるために、4次のrunnge-kutta 法で数値計算しているんですが、ある値に収束するまで繰り返し計算させているせいか精度がどうしても出ません。
動かす範囲が大きいため、刻み幅のとり方が非常に難しく難儀してます。

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

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

なにか妙案はないでしょうか?
もしくは推薦図書あれば嬉しいです。
ちなみに今あるのは「数値計算術 」森口繁一 です。

947 :デフォルトの名無しさん:2016/09/07(水) 10:09:47.11 ID:ihxbaE2x.net
>>946
藪下信『計算物理(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
となることである。」
とあります。参考になるでしょうか。
森口繁一先生の本で、「刻み幅」を自動的に変更するという手法について書かれた本が
あったと思います。『計算数学夜話(?)』とかいう本かもしれません。

948 :デフォルトの名無しさん:2016/12/03(土) 20:32:29.57 ID:HN6NcG00.net
>>946
最適解を求める方法は、刻み値の変更方法を含めて
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による影響は、この方法で求めた。

なお、温度の変化を追いかける計算ではないので、参考にならないかもしれない。

949 :デフォルトの名無しさん:2017/03/24(金) 22:05:30.22 ID:rSyKPFXl.net
どなたかご存知の方いらっしゃいますでしょうか?
コンパイラのバグではなく何らかの仕様なのかと思うのですが分かりませんでした。
●質問
実数型の変数を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でのみ試しています

950 :デフォルトの名無しさん:2017/03/24(金) 23:03:11.52 ID:L8cPMEns.net
丸めモードについて読むこと
IEEE754のNEARESTなら正しい動作
http://www.ibm.com/support/knowledgecenter/ja/SSGH4D_12.1.0/com.ibm.xlf121.aix.doc/language_ref/write.html

951 :デフォルトの名無しさん:2017/03/25(土) 04:11:14.28 ID:ESyR2hOs.net
どうもありがとうございます。
ROUNDで丸め誤差を色々定義出来るのですね。
来週試してみます。

952 :デフォルトの名無しさん:2017/12/10(日) 04:57:11.71 ID:cAgVc7bQ.net
fortranにはなんで引用仕様宣言なるものがあるんですか?
関数の引数等を関数の定義からコンパイラ勝手に読み取れば良いと思うんですが、moduleでできて手続きだとわざわざ自前で書かなきゃいけない理由って何かあるんですか?

953 :デフォルトの名無しさん:2018/02/26(月) 23:36:28.70 ID:TZ3KPlNh.net
普段形状引き継ぎ配列を使っているのですが、blasやlapackを使ってarray-temporariesをつけてコンパイルすると、コンパイル時にarray-temporariesのワーニングが出ます。
blasでは形状引き継ぎ配列を使っていないしモジュール内にあるわけでもないので当然と言えば当然なのですが、こういう時にどうするのが良いのか分からず困っています。ベストプラクティスのようなものはあるのでしょうか?

954 :デフォルトの名無しさん:2018/04/29(日) 22:24:59.24 ID:tKjITkqe.net
永い時を経て多分自己解決出来ました
Contiguous なんていうオプションがあるのですね

955 :デフォルトの名無しさん:2018/05/12(土) 20:03:53.83 ID:F3K2afGN.net
このスレ人おんの?

956 :デフォルトの名無しさん:2018/05/13(日) 14:08:02.04 ID:44h/7/Ui.net
一応

957 :デフォルトの名無しさん:2018/05/13(日) 14:33:38.53 ID:NXXuYZ+p.net
おおー。人おった!

958 :デフォルトの名無しさん:2018/05/23(水) 19:23:38.59 ID:Au5e7VGg.net
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

SAWKX

959 :デフォルトの名無しさん:2018/05/24(木) 10:43:20.36 ID:cPlRxlDn.net
SAWKX

960 :デフォルトの名無しさん:2018/07/04(水) 22:53:55.75 ID:gFgZc5FG.net
DG2

961 :デフォルトの名無しさん:2018/07/06(金) 12:32:29.62 ID:uTPDH9XV.net
DG2

962 :デフォルトの名無しさん:2018/10/01(月) 21:14:37.76 ID:/InadKmT.net
FORTRAN案件が一部に有るな
鉄道ダイヤシステムだが

963 :デフォルトの名無しさん:2018/12/10(月) 01:43:09.35 ID:Y2cLB9FR.net
何故文関数、
f(x) = 1. / x
のような記法が非推奨と言われるのでしょうか?(nag等のサイトより)
他の言語のlambda式などと比べて、Fortranでは非常に簡潔に簡易な関数を定義できるものだなあ、
と感心していたのですが…

964 :デフォルトの名無しさん:2018/12/10(月) 02:41:51.30 ID:O61+1QOk.net
>>963
書き易さより読み易さが優先
気象庁の標準コーディングルールより
文関数
 文関数は引用仕様が暗黙的であり、デバッグがしずらくなる。また、文関数 自体や文関数定義が後続する文関数を引用してはならないなどの制限がある。 内部関数として書いた方がよい。
http://www.mri-jma.go.jp/Project/mrinpd/coderule.html

関数、変数は明示的な宣言をしてから使うのが今風
個人で読み返さないプログラムなら何やっても正常動作すれば良いよ

965 :デフォルトの名無しさん:2018/12/10(月) 13:01:17.07 ID:Y2cLB9FR.net
>>964
ありがとう、正直大きなプログラム書かないので実感が湧かないけど、そういうものか

966 :デフォルトの名無しさん:2019/01/13(日) 22:58:00.85 ID:6mqjNodn.net
中学校の技術の教科書に載ってるってバズってるな

967 :デフォルトの名無しさん:2019/01/16(水) 19:01:22.83 ID:xonbbP95.net
2018も出たことだし若い血も入ってくる
乗ってるな

968 :デフォルトの名無しさん:2019/01/24(木) 20:16:05.77 ID:oJ91kE1a.net
本当に初歩的でかつ自分勝手で申し訳ないのですが、fortran90でn次正方行列の逆行列を求めるプログラムを教えていただけませんか?

969 :デフォルトの名無しさん:2019/01/24(木) 20:26:04.65 ID:/BXejuIU.net
それは数値計算の永遠の課題で万能の処方箋は無い
勉強の為ならWikipediaでも見ながら愚直にガウスの掃き出し法でも実装してみたら

970 :デフォルトの名無しさん:2019/01/24(木) 20:38:47.14 ID:/BXejuIU.net
求めたいだけなら大体の環境でmklが一番いいライブラリ
有名なので比較的読みやすいのはLINPACKだけど77仕様
モダンで簡単な実装ならあちこちのブログに載ってるからググれ

971 :デフォルトの名無しさん:2019/01/24(木) 20:44:04.96 ID:/BXejuIU.net
一応貼っとく
http://www.netlib.org/linpack/
お好みのシチュ用のソースが読める
インデクスと要素毎演算でDOは殆ど排除できるはず

972 :デフォルトの名無しさん:2019/01/25(金) 11:23:51.25 ID:nTExwXep.net
>>968
宿題は宿題スレへ

973 :デフォルトの名無しさん:2019/01/25(金) 11:43:59.45 ID:e9L7JHld.net
スレ索してみたけどFortranスレもしかしてここしか無くね

ぜひLINPACK読んで逆行列の疑問書いてくれ
布教のチャンス

974 :デフォルトの名無しさん:2019/01/25(金) 12:51:00.49 ID:A2tc5P4M.net
Lapackでええやん

975 :デフォルトの名無しさん:2019/01/25(金) 13:01:21.60 ID:e9L7JHld.net
LAPACKは使うけどコードは最適化されてて汚い

976 :デフォルトの名無しさん:2019/01/25(金) 21:25:43.75 ID:5qMgZ1Mp.net
Matrix Computationsに載ってるよ。

977 :デフォルトの名無しさん:2019/01/26(土) 02:23:28.24 ID:Z89DHn3T.net
質問です。
ファイル名 *.f90 とは別に、プログラム名 program * がありますが、この二つが同じ名前だと、何らかの不具合・不便に繋がったりするのでしょうか。
私は、修正前後を比較するためにバージョン違いを作るような場合を除き、基本的に両者を同じ名前にしているのですが……

978 :デフォルトの名無しさん:2019/01/26(土) 11:12:15.29 ID:yVAkGzul.net
むしろ同じにしといた方が無難

979 :デフォルトの名無しさん:2019/01/26(土) 13:43:45.62 ID:Z89DHn3T.net
>>978
安心しました、ありがとうございます。

980 :デフォルトの名無しさん:2019/01/26(土) 13:53:32.02 ID:6SK3WITg.net
ファイルシステムの無い時代、例えばパンチの名残だろうかね

981 :デフォルトの名無しさん:2019/02/08(金) 00:44:25.09 ID:YfKMGwNZ.net
環境はCygwin、f90、gfortranです。
open文のaction指定子に関する質問です。

ミス防止のため、念には念を入れて
「readもwriteもするファイルでも、場面に応じてaction='read'と'write'を切り替える」
と理想的なんじゃないだろうか、とふと思いまして、

open(100,file='foo.dat',status='old',action='read')

open(100,action='write',position='append')

close(100)

という記述を試してみたのですが、実行時にエラーになってしまいました。
(Fortran runtime error: Cannot change ACTION parameter in OPEN statement)
「open文で既に開いているファイルを開き直してもよい」って仕様はこういう用途のためのものではないんですね……

一度closeすれば事は足るのですが、それだと今度は「同じfile名を二回記述しなければならない」という無駄が解消できず……
何か、巧い方法はないのでしょうか。

982 :デフォルトの名無しさん:2019/02/08(金) 01:15:11.98 ID:YfKMGwNZ.net
すみません、一応自己解決しました。
指定子に文字型の変数を与えることができる、ということに先ほど気づきました。
なので「一度closeする」で問題ありませんでした。
name1 = 'foo.dat'としておいて、
open文に file=name1 とでも書けば済む話でした(つまるところ、ファイル名変更時の手間が一番の問題だと考えていたので)。

983 :Linux ペンギン:2019/02/08(金) 23:01:52.12 ID:DyJ7QOpE.net
lapack インスコ方法教えてんか?

984 :デフォルトの名無しさん:2019/02/28(木) 02:25:49.99 ID:43+kEwYn.net
>>983
mklが手軽かつ最速だがクソでか&環境依存
配布も考えるならソースをnetlibでwget -r url
ラッパのLAPACK95もあると便利

985 :デフォルトの名無しさん:2019/02/28(木) 13:08:32.71 ID:43+kEwYn.net
>>978
遅レスだけど、program名って何か意味あるんかね?
program書かないでも動くし(endは必要)、programは他から呼ばれないし

moduleやsubroutineの名前は呼ぶのに大事だけど
ファイル名はinclude "fname"で使うから意味ある

986 :デフォルトの名無しさん:2019/04/05(金) 16:47:28.90 ID:0wY7QsOH4
誰かhankel関数の使い方教えて

987 :デフォルトの名無しさん:2019/05/02(木) 22:03:24.81 ID:bI33l//4.net
他人が作ったコードで、
real*4 宣言を全部real*8に書き換えたら、
計算結果がNaNになっちゃったんだけど、
どんな原因が考えられますか?

988 :デフォルトの名無しさん:2019/05/03(金) 14:28:23.81 ID:3Vz/qKoh.net
色々

教えて欲しかったらソース出せ

989 :デフォルトの名無しさん:2019/06/19(水) 04:49:42.26 ID:tVNS+22r.net
【出資】松本卓朗 人工知能詐欺【注意】
https://rio2016.5ch.net/test/read.cgi/rikei/1560859403/

990 :デフォルトの名無しさん:2019/06/22(土) 10:06:49.78 ID:ecTKxvDL.net
Fortranは1956年?だかに作られたそうだけど
当初からクラス設計とかあったの?

991 :デフォルトの名無しさん:2019/06/22(土) 10:33:22.05 ID:fiI8bn9U.net
データベースに合わせたORMみたいな
メンバーとか何かあった気がするが
クラスは無いんじゃね

992 :デフォルトの名無しさん:2019/07/15(月) 18:22:34.81 ID:totsCoub.net
>>990
ねーよ
元々メインフレーム言語だし

993 :デフォルトの名無しさん:2019/09/20(金) 07:30:20.40 ID:TGCjU1pt.net
Moduleで継承みたいなことってできないんでしょうか?

module mod1
integer,parameter :: val1 = 20
end

module mod2
use mod1
end

program main
use mod2

print *, val1
end

みたいな
このままだとエラーですけど

994 :デフォルトの名無しさん:2019/09/20(金) 09:23:13.89 ID:Y6O3yJb6.net
>>993
gfortran8.1で試したけど普通に動くよ

995 :デフォルトの名無しさん:2019/09/20(金) 11:49:11.89 ID:TGCjU1pt.net
>>994
まじですか。
やってみます!

996 :デフォルトの名無しさん:2019/12/05(木) 20:26:57.24 ID:5HmbMnOR.net
今更fortran使う必要が出たんですけど宣言全部冒頭でやらなきゃいけないとか読みにくいにもほどがあるなこの言語……
ただdllでもない生のCファイル普通に使えるのちょっと強すぎじゃない。何これ

997 :デフォルトの名無しさん:2019/12/06(金) 10:25:38.93 ID:uUae0oO6.net
JULIAやれ

998 :デフォルトの名無しさん:2019/12/09(月) 23:37:38.73 ID:PezMDr0C.net
C++に移植する作業をしてるんだが、fortranは配列が1スタートなのと行優先なのまじで糞だと思う

999 :デフォルトの名無しさん:2019/12/10(火) 06:15:05.25 ID:ehgh8Gwn.net
配列の下限もレイアウトも両方オプションで変更できるっしょ

1000 :デフォルトの名無しさん:2019/12/10(火) 13:53:20.70 ID:48kVELqA.net
openglも行優先だっけ

1001 :デフォルトの名無しさん:2019/12/14(土) 01:16:23.48 ID:llZnx091.net
read/writeの装置番号というのに衝撃を受けたんだけど
いや整数を振るって……えぇ……他の言語でこんなん見たことねぇよ……

1002 :デフォルトの名無しさん:2019/12/14(土) 02:29:00.89 ID:U3Y+OMfv.net
ここで言語仕様に文句言ってもどうしようもないだろ……
整数型の変数も使えるから自分で値を付けれるハンドルと考えれば良い

1003 :デフォルトの名無しさん:2019/12/14(土) 10:56:06.61 ID:oHNLq8G6.net
Cでもstdin=0,stdout=1,stderr=2とかやってるやん?

1004 :デフォルトの名無しさん:2019/12/14(土) 19:35:25.64 ID:ygJNOGBg.net
ハンドルを整数値で管理するなんて普通だろ。

1005 :デフォルトの名無しさん:2019/12/15(日) 02:31:50.39 ID:XiowEuWl.net
subroutineとfunctionの使い分けってどうしてます?FORTRANのコード規約みたいなのがあまり見当たらなくてわかんなくて
たとえばnameとageを持ったpersonタイプを作るとしてsubroutine getperson(name, age, person) intent(in)name, age intent(out)person
なのかgetname(name, age)ファンクションを定義してperson = getPerson(name, age)みたいなのがいいのか
他の言語の言い方になるけど前者は参照渡し的というか。今いじってるのがほぼ全部subroutineで処理してるからこういうのがfortranの書き方なのかなぁって
個人的には後者の方がいいのではと思うんですよね

1006 :デフォルトの名無しさん:2019/12/15(日) 08:10:55.00 ID:ZURMU7Y0.net
副作用が無いならfunction、あるならsubroutine
例えばsinやcosはfunctionだけどrandom_numberは内部状態を書き換えるのでsubroutine

1007 :デフォルトの名無しさん:2019/12/15(日) 12:59:16.65 ID:o9m7qUoD.net
戻り値の有無やろ

1008 :デフォルトの名無しさん:2019/12/15(日) 13:03:16.56 ID:PY/OteEv.net
返り値が複数かどうかだろ

1009 :デフォルトの名無しさん:2019/12/15(日) 20:36:28.41 ID:AalVXpZd.net
副作用はpure修飾で区別するのでは

1010 :デフォルトの名無しさん:2019/12/15(日) 23:49:42.99 ID:BpbcQxvZ.net
前提として初心者がどちらにするか迷った時の話で
非pure関数を同じ文中で複数呼んだら評価順の影響を受けて悩みの種になるというのがあるから
副作用があれば全部subroutineぐらいの割り切りでいいと思う

1011 :デフォルトの名無しさん:2019/12/16(月) 08:12:12.88 ID:CEJg7/0A.net
>1008
複数の返り値を構造体にすれば、関数でいけるのではないでしょうかね

1012 :デフォルトの名無しさん:2020/01/09(木) 14:06:43.45 ID:Rw5gLjBx.net
cigwin64ターミナルでコンパイルしようとすると
Winmain関数への定義がされてないって言われるんだけどどうしたらいいですか?

1013 :デフォルトの名無しさん:2020/01/10(金) 22:03:41.01 ID:odrNzs9Z.net
Winmain関数を定義したらよいのでは。

1014 :mac:2020/02/01(土) 22:13:14 ID:Q+QKuWIk.net
macのOSをCatalinaにしてからfortranでコンパイルできなくなりました。
大学の宿題ができなくて困っています。助けてくだいさい!
gfortran main.f90 でコンパイル後のエラー文は以下です。

dyld: Library not loaded: /usr/local/opt/isl/lib/libisl.21.dylib
Referenced from: /usr/local/Cellar/gcc/9.1.0/libexec/gcc/x86_64-apple-darwin18/9.1.0/f951
Reason: image not found
gfortran: internal compiler error: Abort trap: 6 signal terminated program f951
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://github.com/Homebrew/homebrew-core/issues> for instructions.

1015 :デフォルトの名無しさん:2020/02/02(日) 14:51:51 ID:5oKX1F3M.net
>>1014
エラーログよく読めよカスガキ

1016 :mac:2020/02/03(月) 06:48:44 ID:lEGOKPCQ.net
読んでみました。
libisl.21.dylib を読み込もうとしているのですが、
libisl.22.dylib におそらく対応ファイルが変わってしまったようです。
読み込み先を libisl.21.dylib → libisl.22.dylib に変更するにはどうしたら良いのでしょうか? 

1017 :デフォルトの名無しさん:2020/02/03(月) 11:41:24.71 ID:62FLJlST.net
libisl.22.dylib を libisl.21.dylib に rename

1018 :mac:2020/02/04(火) 13:54:57 ID:5KrL780U.net
コンパイルできるようになりました!
ありがとうございます!

1019 :デフォルトの名無しさん:2020/02/05(水) 02:53:14 ID:hA2ZuT5R.net
並列計算のコマンドを do loop 内に入れると,配列ごとに計算できないのね。。。
なんか妙案あるのかな

1020 :デフォルトの名無しさん:2020/02/27(Thu) 21:39:58 ID:LK+QpBx6.net
ifortで-ipoを指定すると謎のセグフォが発生する

1021 :デフォルトの名無しさん:2020/04/06(月) 04:39:32.64 ID:D5KfSo1y.net
うめ

1022 :デフォルトの名無しさん:2020/04/06(月) 04:39:41.11 ID:D5KfSo1y.net
うめ

1023 :デフォルトの名無しさん:2020/04/06(月) 04:39:53.59 ID:D5KfSo1y.net
うめ

1024 :2ch.net投稿限界:Over 1000 Thread
2ch.netからのレス数が1000に到達しました。

総レス数 1024
362 KB
掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★