TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
盗用したコードどれくらい書換えれば合法になるの?
【モダン推奨】Perlについての質問箱 50箱目
Win32API質問箱 Build124
ねねっちと一緒にプログラムを勉強するスレ第3話
クラスとかインスタンスってなんのためにあんの?
【Java】Wicket【HTML】
[RPA]PC自動化技術総合スレ[効率化] Part.6
HSP総合スレ【part 10】
【PHP】下らねぇ質問はここに書き込みやがれ 10
Tapestryについて語ろうよ!

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


1 :
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。
●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。
●前スレ
くだすれFORTRAN(超初心者用)その5
http://toro.2ch.sc/test/read.cgi/tech/1269704830/
●過去スレ
くだすれFORTRAN(超初心者用)その4
http://pc12.2ch.sc/test/read.cgi/tech/1232789521/
くだすれFORTRAN(超初心者用)その3
http://pc11.2ch.sc/test/read.cgi/tech/1196384126/
くだすれFORTRAN(超初心者用)その2
http://pc11.2ch.sc/test/read.cgi/tech/1164121236/
くだすれFORTRAN(超初心者用)
http://pc8.2ch.sc/test/read.cgi/tech/1138063703/

2 :
           , 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 :
> 初心者に適切な指導もなくプログラム書かせているのはアカハラの域に達してるな。
これって割と多いような気がするな。
まあ分野によっちゃいずれ必要になることが前前から分かっていそうな気もするのだが
それも指導のうちと言えばそうだ

4 :
do i=2,1000
write(*,*) '1otsu'
enddo

5 :
>>3
昔は先輩が教えることが前提となっていたから成立したが、
最近、先輩がいなかったり、知らなかったりで、伝承が途切れている。
時代の変化に、サヨクかぶれの爺さんたちの現状認識が追いついていない。
連中は鳩山みたいに夢を見て、管みたいに怒鳴り散らしてるからw

6 :
前スレくだすれ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 :
>>6
それだと出力してない。
OPEN と CLOSE の間で出力する。
ただ一度に欲張らず、まず固定された入力ファイルと出力ファイルで
ちゃんと計算できるプログラムをつくって確認しておくべき。
その後、色々ループさせたり、ファイル名を変えたり出来るようにすべき。
ものには順番があり、近くから遠くへ及ぼすべしとは、四書のはじめ大学にも書いてあるw

8 :
これまでの教えていただいたプログラムが下記になります。
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 :
! 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 :
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm
open(14,file=filenm)
write(*,*) 'result=', s ! <--だから結果を書きだせってw

close(14)

11 :
write(14,*) 'result=', s ! <--だから結果を書きだせってw
思わず間違えたwwww

12 :
>>10>>11
アドバイスありがとうございます。とろいのですいません。
出力文
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm
open(14,file=filenm)
write(14,*) 'result=', s ! <--結果を書き出すプログラム。
close(14)
こういうことでしょうか?

13 :
そうそう。欲しい結果を書きだす。
本来は、入力ファイル名や計算したカラム(列)番号のような
付加的な情報も書いておくべきだろうが・・・
open(14,file = trim(filenm) ) ! <- こっちもTRIMで尻の空白を削っておくべし。


14 :
>>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 :
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 :
>>15
度々すみません。親切にありがとうございます。
プログラムに組み込ませていただきます!
今日もかれこれ5時間くらいネカフェにいますが、
そろそろおいとまします。自転車こいで橋を越えた甲斐がありました。
また色々教えてください。

17 :
最後にプログラム全体を書き込ませてください。
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 :
!
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 :
本日もどうもありがとうございました。
お先に失礼します。

20 :
わからないので教えてください。
メモ帳(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 :
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です。お久しぶりです。
すみませんが、壁にぶち当たってしまいまして、お力をお貸しください。
コンパイルした後、作成したアプリの方で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 :
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 :

自分の作りたいプログラムの内容を載せさせてください。連投になってしまい、すみません。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 :
エクセルデータ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 :
>>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 :
! 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 :
> 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 :
>>27>>28
返信遅くなってすみません。家の方で一週間以上経っても書き込み規制が解除されないみたいで、
またネカフェからです。月曜日に現状の報告会があったので、準備やらなんやらで閲覧が
遅れてしまい、申し訳ありません。
毎回教えていただきありがとうございます。
>この s って sx か sy の誤記?それとも別の変数?
この質問なんですが、私の持っているfortranの本にシグマ(Σ)を使った合計値の算出のプログラム例に記されていたので
そのまま作ったものです。ですので、この形で載っていただけので、そのまま使っています。sは一応s=s+1みたいな感じで
s=1とすると右辺に数値が代入され、左辺にs=2と計算させるような感じで入力した値を表現したつもりです。

30 :
以下に順序を変更してみたプログラムデータをコピペします。
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 :
! 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 :
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 :
! 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 :
上記で試してみたのですが、以下のようなエラーが起きてしまいました。(泣)
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 :
>>34
do i = 1, ndata
read(11, *) (a(j, i), j = 1, 18)
end do    !
    ↑
ここに全角文字の空白が入っている。それでエラーが出ている。
削れ。
残りのエラーは、それを直せば消える。
あんま全角文字は使わない方がいい。

36 :
lexical error: Invalid character
エラーメッセージの意味を調べておくといいよ

37 :
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 :
! 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 :
>>35
上記でコンパイルすることができ、ご指摘本当にありがとうございました。
「icol」なんですが、warningがでてしまって、式に直接関係しない変数なので
消してみたら消えました。たぶん、自分の使っているバージョンが古いため
警告がでちゃったと思います。
(ncolumn, ndata)に関してですが、(18,400)に変更しても問題ないでしょうか?
師からわかっている値なのでこっちにした方がよいと言われました。
あと、本日コンパイルまで無事こぎつけることができたのですが、どうも計算結果がおかしい
ということだったので、師が今日初めて細かくプログラム内容を見てくれたのですが、
私の説明不足ですみません。以下にメモ帳のデータのところで追記させてください。
>>36
そうしてみます。

40 :
連投になって本当にすみません。
メモ帳のデータの全体像を以下に記載します。
いらない行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 :
>>36
返信おくれてすみません。
lexical error :invalid character
語彙の 間違い:不正文字

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

42 :
real :: dummy
read(11, *) dummy, (a(j, i), j = 1, 18)
または
integer :: idummy
read(11, *) idummy, (a(j, i), j = 1, 18)

43 :
>(ncolumn, ndata)に関してですが、(18,400)に変更しても問題ないでしょうか?
>師からわかっている値なのでこっちにした方がよいと言われました。
今時の常識では、数値述べたうちは避けて、常数にする。
Fortranの場合はparameterにするのがふつう。

44 :
>>43
ありがとうございます。
parameterというのはC言語でいうconstのような、
変数として宣言はするが変更はできないものと捉えて問題ないでしょうか?
となりますと「不要な6行」もそれに倣って
integer, parameter :: ncolumn = 18, ndata = 400, gomi = 6
                             ^^^^^^^^^
などとしておくべきでしょうか?
>>36
エラーの意味がやっと分かりました。
関数や変数に使えない文字を、クォートの外に書いてしまうと発生するエラーなんですね。
シンタックスエラーと似ていると思いました。
特に全角空白は識別しづらいので気を付けるよう留意します。
>>42
なるほど、ダミーを用意するのですか。こういう発想は素晴らしいと思います。
読み捨てるだけのために宣言される変数・・・儚いですね。

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

45 :
> FOR4265: symbol ICOL referenced but not set
参照しているけど値が入ってない、だとさ。
> 全角空白
IME から空白文字の入力を常に半角にすると良いぞ。
> 常数
定数じゃないのと思ったがどっちでもいいのか
函数と関数のような。
この 400 とか 18 とか何の数だったっけ?
とならんように意味のある変数(名前)で置く。
18 列じゃなくて 19 列だったときも ndata の値を変えるだけだ。

46 :
電車で帰宅してる間に携帯で見てたのですが、規制がかかっているので我慢できずに
ネカフェから書き込みます。
>>44
勝手に解決させないでください。あと僕になりすまさないでください。
初心者にしてはずいぶんとわかっている余裕感がうかがえますよ。
なんですか、この子供のような文章は?
>プログラミング自体が初めてなので右も左もわからない状態だったのですが
integer, parameter :: ncolumn = 18, ndata = 400, gomi = 6
                             ^^^^^^^^^
などとしておくべきでしょうか?
>>36
エラーの意味がやっと分かりました。
関数や変数に使えない文字を、クォートの外に書いてしまうと発生するエラーなんですね。
シンタックスエラーと似ていると思いました。
特に全角空白は識別しづらいので気を付けるよう留意します。
うそですよね、少なくとも初心者にはこんなこと言えませんよ。書き込みの時間帯も僕の書き込めない時間ですし。
「あと金輪際この掲示板にこない」と随分と礼儀知らずな事をおっしゃっていますが、>>44さんが
金輪際このスレに来ないってことですよね?
僕は初心者だし、これからもfortranでつまずいたらこちらで伺うつもりなので勘弁してください。
とりあえず、すべてのファイルで計算実行して違う値が出たので、グラフを手書き
で作成して師に明日持っていこうと思います。確認してもらったらまた報告します。
本日はどうもありがとうございました。
スレ嵐はやめてください、迷惑です。44さん、時間がないのであなたとも言い争っている暇はないですが、迷惑行為だけは
よそのvisual basicの方にでもいってやってきてください。
僕が書き込めるのは、17〜21時,それから帰宅の間は書き込めないので23時以降になります。

47 :
>>42
今後ともよろしくお願いします。
自分は無礼な発言やおかしいことは言いませんので、
その44の人は別人だし無視してください。

48 :
我々がこの「師」とやらと話し合った方が早いな

49 :
> よそのvisual basicの方にでもいってやってきてください。
失礼しちゃうわw

50 :
>>41 手元にマニュアルもないの? というか目を通してる?
どうやら荒らしらしい>>44にも有益な情報は含まれてるんだよな。
頭に血が昇ってるようだけど、もう少し言われたことについて自分で考えた方がいいぞ。
前スレから。

51 :
>>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 :
お世話になります。
今日、師に計算結果をプロットしたグラフ用紙とそのプログラムを見せに行ったのですが、
確かに計算結果は正しい方向に向かっているが、ちょっと違うと言われました。
   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 :
エクセルデータ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 :
修正すれば良いでしょうかじゃなくてまずはやってみろよ
前向きな姿勢は結構だけど結局は質問するばかり、
理解する力が著しく欠如しているのではないか

55 :
報告します。
先ほど、ビルドに成功して同じファイルを読み込んだのですが、微妙に値がズレてきました!
もう一回明日師に確認してもらいます。
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 :
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 :
>>56
アドバイス有難うございます。
tx(i) = x(1, i)* x(3, i)
ty(i) = y(1, i)* y(3, i)
これに直してコンパイルしたところ、うまく結果が算出され、
師に確認してもらったところ、まぁいいんじゃないという
評価のグラフが書けました。
みなさんのおかげでここまで
来ることができ、大変感謝しています。
まだ別のデータが後200ほど残っているので、頑張ってタイピングしようと
思います。またやっていて困った時は相談にのってやってください。
ありがとうございました。


58 :
コンパイラを Intel visual fortran から PGI visual fortran に変更したところ、
ビルド時に
Unable to open MODULE file ifport.mod
でエラーになります。
ifport では access と DELFILESQQ を使用しているのですが、
PGIのコンパイラで使用できる同種のライブラリはありますでしょうか。

59 :
>>58
少しはマニュアルくらい読めよw
DEC時代の名前で存在している。ifortでなくてdfortとかiをdに変えればおk。

60 :
それで>>58は解決したのかよ。
PGIのCUDA対応に興味あるから、色々反応するの待ってんだけど。

61 :
>>60
解決しました。ありがとうございます!

62 :
急に質問してしまい申し訳ありません。
先月から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 :
たぶんおかしくない。それより WRITE(6,60) でソースコードを検索してみるべき。

64 :
↑すまん適当言った。C と D は複素数か配列じゃないだろうか。

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

66 :

すみません、質問です。
求めたい値=
(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 :
すみません、追記です。
メモ帳データの数値はすべて使用して計算結果として算出したいので、
一枚のメモ帳に結果がすべて表示できる方法があったらお願いします。

68 :
この辺を見ておくといいよ
http://www.nag-j.co.jp/fortran/index.html

69 :
とりあえずファイルのデータを全部2次元配列に放り込んで
結果も2次元配列の内容を全部吐き出す感じでいいだろ。
x, y に任意の組み合わせを取るなら単純じゃなくなるが。

70 :
プログラムの歴史を学ぼうと思って、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 :
もともとが業務用だからね。

72 :
>>68>>69
ありがとうございます。

73 :
>>70
FORTRANの歴史を知りたいなら、Comuter History Museumをチェックしなければ
いかんがねー。
http://www.computerhistory.org/collections/fortranarchive/
たしか、バッカスのFORTRANコンパイラを作りたいと上申書みたいなメモから
あった気がする。マニュアルの類も文法書の他運用書などたくさんある。
704のエミュはなかったが、後のIBM360やIBM1130のエミュは存在している。
その上でFORTRANIVは動いている。FORTRANIIも動いていたかもしれない。
この時代のソフトウェアは著作権の概念がなかったのかパブリックドメインに
なっているよう。時代の進んだIBM370とかFORTRAN77のFORT VSとかのエミュはない。
昔のFORTRANのマシンコードなんかはパンチカードだか、ダンプリストだかが
うpされていた気がするので機械語レベルでは転がってる気がした。

74 :
エミュとかはComputerHistoryMuseumではなく、民間のおっさん達がやってる。
ググれば出てくる。

75 :
>もともとが業務用だからね。

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

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

77 :
Excel でできる程度の計算なら Excel でやれば良し。
Excel とか無い時代の産物なので、伝統か信仰によって勧められる事が多い。

78 :
質問があります
FORTRANを使って連番ファイルを読み込ませるためのgnuplotのバッチファイルを書きだそうとしているのですが、writeでどうやって書き出すのかわかりません
どういうことかというと、たとえば
plot "output[i].txt" u1:2
をi=1,10でwriteで出力するとき
write(filenumber,*) "plot "output[" i "].txt u 1:2"
となるためwriteで文字を出力するために使う”と、出力する文字の一つとして扱いたい”が干渉してしまうんです。

”を文字として出力するためにはどうしたらよいでしょうか?
どなたかわかる方がいたら教えていただけませんか?

79 :
>>78
確かにそういときどうすんだろ
考えたこともなかったわ

80 :
言ってる意味わからんw
do i = 1, 10
write(filenumber, '(a, i2,2, a)') 'plot "output[', i, '].txt" u 1 :2'
end do
これでどうだ?番号は 01,02,... ,10 となるが。

81 :
すR。
>'(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 :
'(a, i0, a)'
でいいんじゃないの?

83 :
>>82
うむ。
i0ってF2003からの機能だと思っていたが、F95から入ってたんだな。
勘違いしてたわ。
一応F95標準縛りをかけていたつもりだったので避けたが、i0 で楽勝だな。

84 :
>>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 :
バッチファイルをそのまま生成させるって頭いいな

86 :
質問です。
配列を引数にする関数を定義したいのですが、
やり方がよくわかりません。
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 :
>>86
w(i)は配列ではなく配列の要素(1個の変数)ですので
当然エラーとなります。
do i = 0, m
x(i) = FD(w(i))
enddo
の3行を、
x(:) = FD(w(:))
にすれば()付きの書き方にはなります。

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

91 :
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 :
ELEMENTAL属性ってのは初めて聞いた 勉強になります
兄ぃありがとう

93 :
(ELEMENTALはPUREでもあるから強調しなくてもいいんだけどな…

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

95 :
同じだけど、括弧をつけて配列であることを明示したほうがいいね

96 :
>>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 :
(キリッ

98 :
>>96
2003使ったことないけど、うーんと、
要は allocatable な変数は
allocate() 使わなくても、
: 無しで左辺において、
固定サイズ(か既に大きさの確定した配列)が右辺に来る代入式で
随時 deallocate して再び allocate した事にする、
ということなのかな?
・・・・すくなくともワシには危険な香りがするw

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

100 :
>>98
2003ではおっしゃる通り、サイズの違う配列が右辺に来ると、勝手にDEALLOCTAEして
右辺のサイズにALLOCATEし直して代入する。
Intel Fortranではデフォルトのオプションでこの機能が切られている。
最近の言語は動的なんちゃらで、みんなそんな感じだから流行り?
危ないけど便利。
>>99
90からはwrite(*,*) 'abcdefg'(2:4)と定文字列?でもできるぞ。

101 :
へえ、しらんかった。
でも、どういう場面でつかうんだろう?
i=2
write(*,*) 'shit'(i:4)
とか、・・・英語複数形 s をだしたり隠したり、かな?
でも正直なところ、なくても困らんな。

102 :
88です。みなさんありがとうございます。
お礼が遅くなってすみませんでした。
まだ難しくてよくわからないので、素直に括弧つけます。

103 :
>>100 最近の言語は動的なんちゃらで、みんなそんな感じだから流行り
だろうね・・・でも量が多いと遅くなりそう。
そういう動的なことは Interactive な言語処理系でやればいいことで、
やることの量がだいたい前もって決まっていることを
なるべく早くたくさんがーっと処理したい、というのが Fortran 人wなので
・・・でもこのままでは老害って言われるし・・・うーん、むつかしいね。

104 :
ヤングの諸君を引き寄せるには、ある程度流行りの機能を入れないとまずいんだろう。
それに動的自動割り付けは、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 :
可変長文字列も動的割り付けで可能になった。
program varchar
implicit none
character(len = :), allocatable :: text
text = 'automatic allocation'
print *, text
text = 'variable length text'
print *, text
stop
end program varchar

106 :
長さ同じだぞw

107 :
モジュール内で定義したグローバル変数を
プログラム内で変更しないようにするにはどうしたらよいでしょうか?
(変更があったらエラーを吐くようにしたい)
parameter属性を付けるのが近いと思いますが、
そのグローバル変数はファイルからreadで読み込みます。
つまり、最初に一回だけファイルで読み込んで、
その後は変更せずに、各サブルーチンで参照できるようにしたいです。

108 :
>>107
ttp://www.nag-j.co.jp/fortran/fortran2003/Fortran2003_4_3.html

109 :
F2003でいいならprotected属性だな。
F90だったら、privateで隠匿して、値を使うところでは関数・サブルーチンで
値を取ってくるかな。

110 :
protected つかわない、つかいたくない、つかえない
という時には他には intent(in) をあちこちに配置して
いちどどこかプログラム内で初期値設定した後は変えないようにする、って
手もあるけどこれは107さんの要望とはマッチしないなぁ。
protected がいちばん素直だとおもう。

111 :
もりあがってますね

112 :
月に一個くらい質問というかお題投下があって
2週間くらいで20スレいく程度で
まったりと

113 :
f90から外部モジュールでf77を呼べますか? つまり固定形式で書かれたコードを外部モジュールで呼べるかってことなんですけど

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

115 :
呼べる。
module f77module
contains
.....
 ここにサブルーチン、関数ならべる。
....
end module f77module
固定フォーマットの独立したファイルにして分割コンパイルすればよし。

116 :
旧形式のコードて今でも普通に書かれてるの?
仕方なく再利用してるだけで、新しいコードは全部新しい文法で書くべき?

117 :
> 旧形式のコードて今でも普通に書かれてるの?
わしゃバリバリ固定書式で書いている。
左7つ開けとかないとムズムズするのでw
> 新しいコードは全部新しい文法で書くべき?
書くべきだとおもう!
思うが・・・・

118 :
>>115
おおー、ありがとーございます。

119 :
>>114
ということは、その処理をすれば固定形式と自由形式の混在したソースコードも
コンパイルできるということですか?

120 :
新しい文法使ってもそれはそれで保守できるかという
自由形式として解釈できない固定形式の文法が継続行の扱いくらいかと

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

122 :
インテルだと
ifort -ipo
でファイルがバラバラでも最適処理してくれるよね。

123 :
コンパイラが偉い

124 :
>>122 ifort -ipo
インテルの中に
はじめの一歩の
母ちゃんのファンがいるに違いない

125 :
年内にインテルFortranの更新来ないのかな?二か月に一回の周期来てんだが。
block..end block を早く入れて欲しいわ。
たまに loop index を局所的に確保したい。頭部の宣言部が重くなりがち。

126 :
下記のようなループの外でopenしてループの中で書き足していくプログラムを書いているのですが,
ifortでコンパイルした場合,実行の途中でもファイルが更新されていくのですがpgiでコンパイルした場合はプログラム終了まではファイルが更新されず,
プログラム終了時に全部書き込まれます.pgiでコンパイルした場合でもプログラムの途中で適宜ファイルが更新されるようにできるのでしょうか
open(1000, file='data.dat')
do j = 1, N
write(1000, *), j
enddo
close(1000)

127 :
fortran2003のFLUSH命令を使え。

128 :
>>127
うぉー!ありがとうございます

129 :
linuxでfortran 77のコンパイラってありますか?
gfortranというのを使うらしいのでそれをインストールして試したのですが知人に貰ったfortran 77のコードがコンパイルできませんでした

130 :
>>129
gfortranは77に対応していません。
フリーってことでおk?
fortran77対応のフリーのコンパイラはg77が有名かな。
linuxならintel fortranもnon commercial版になるけどフリーであったはず。
研究や企業での利用はできないから注意。
個人的にはfortran77をいつまでも使っていないで、
90に書き換えて、折角インストールしたgfortranを使った方が良いと思う。
書き換え方は拡張子を変えるのと、改行の&ぐらいでとりあえずは動くでしょ

131 :
>>130
g77でコンパイルできました
ありがとうございます

132 :
gfortran って f77 コンパイルできないの?
f90 は f77 完全包括しているし、廃止事項をホントに廃止している
処理系はめったにないからオプション変えれば行けるんでね?
誰かおしへて。

133 :
はじめからコードを倍精度で書くのと、コードは単精度でかいて倍精度はコンパイラのオプションに任せるのってどっちがやってる人多いのかな。
後者のメリットはコードがすっきりすることくらいか。

134 :
AUTODBLは、べた書きの定数の桁がどう扱われるのかよく分からんとか
微妙な精度の問題が気になってIMPLICIT DOUBLE(A-H,O-Z)に乗り換えたわ。
あと、昔のプログラムだと整数とからんだCOMMONやEQUIVALENCEの整合が狂って
謎な挙動をしたりするから困る。

135 :
>>132
g77の拡張機能つかってるコードをそうと知らずにgfortranでコンパイルしようとして互換性ないと勘違いした

136 :
>>133
以前、同じことが気になったので、
中くらいの長さ200行ぐらいの単精度コードを手でw 倍精度化したのと、
コンパイルオプションで倍精度化したのを比べたことがある。
gfortran と ifort ではそれぞれで
実行バイナリが冒頭の一部分(コンパイル時刻?)以外は同一だった。
なので自作コードだけなら、違いはないか気にならない程度だとおもう。
third party library で
単精度と倍精度でサブルーチン名が違う場合があるので
その場合にどうなるか、はしらない。

137 :
あと、OpenMP で並列化したやつもまったく同じだった。
MPI で並列したやつはまるで駄目だったので
これは泣く泣く手で倍精度に揃えたw

138 :
third party というかソースのない、かつ組み込みでない関数/サブルーチンは
変換できないし、規定されていない方の値を渡すと意味不明な挙動になるぞ。
なお対応する interface 定義が提供される module を use して総称名で呼ぶと
コンパイル時に型にあった引数定義のサブルーチンが選ばれるようになる。
MPI はこういうトリックとは関係なく、1要素の大きさを渡すあたりに工夫が要るかと。

139 :
知り合いのMPIのコードは倍精度はコンパイルオプションに任せてたな

140 :
mpi_float を mpi_double に置き換えてくれるのかな?
MPI で単精度か倍精度が気になるのはその点くらいだよね

141 :
emacsのfortranモードについてなのですが、
変数宣言のあとに「::」をつけると、変数名に色がつくのが気に入っています。
ですが、改行すると色わけされません。
解決方法はありますでしょうか?
例、
integer :: i&amp; ←色がつく
  ,j ←色がつかない

142 :
>>141
継続行を使わずに2行に分けて書くのはダメなの?
integer :: i
integer :: j

143 :
>>142
今はそれで対応しているのですが
なんとなく、同じグループの変数はまとめておきたいなと思いまして・・・

144 :
>>141
emacsの事は良く知らないけれど、f90.el内の
;; Variable declarations (avoid the real function call)
の次の行を編集すれば良いのでは?
あとemacsスレの方がレスが付き易いかも知れないね

145 :
>>144
返信遅くなってすみません。ありがとうございました。

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

147 :
Fortranとかいうアホ言語使ってるからそうなるんだ
C++を使いなさい
C++が使えるようになればJavaなんか簡単

148 :
GUI 書くのはどの言語でも(記述量はともかく仕様の理解に)手間だろ…。
>>147 ベターCじゃなくて真面目にC++ならな

149 :
>>146
なんでやねん
俺にすればJavaの方がFORTRANよりずっと簡単に思えるぞ
C#もだいたい似てる
使うコンピュータがメインフレームならJava、WindowsならC#がGUIが一番楽
というかメインフレームにはMonoすらない事が多いし
C#はDelphiの流れを受け継いでいるのとJavaやC++の良いとこ取りしている
ある意味卑怯な(?)言語なのでGUIはこれが一番早く完成する

150 :
ファイルを読み込んでcharacter型の変数に代入しようとしています。
一行の文字数が不定なときはどうすればいいですか?
あらかじめ要素数をおおきめに用意する以外でおねがいします。

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

152 :
>>150
//www.nag-j.co.jp/fortran/FI_18.html#AUTOTOC_18_4
>>151
linux用ならnon-commercial板があると思うが

153 :
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 :
>>152
non commerical で検索したら見つかりました
ありがとうございます
>>153
buf=buf//ch
は代入するたびにallocateしなおしてるやつですか
intel の最新版はF2003に対応しているみたいなので
そっちを使ってみます

155 :
>>154
>は代入するたびにallocateしなおしてるやつですか
そう。大量で負荷が重いなら大きなbufferを取るしかない。
IntelFortranの場合F2003文法はデフォではOFFになっているので
standard-semantics をONにする必要があるかも。
配列の場合
buff = [buff, ch]
で配列要素数を拡張していけるが、この場合はオプション必要。

156 :
実行時間を計測することはできると思いますが
使用したメモリの最大値を計測することはできませんか?
コンパイラはintelです

157 :
Linux なら ps をじっと眺めているw
Windows なら task manager のグラフを眺める。

158 :
include文やuse文で読み込むインクルードファイル、モジュールファイルを
別ディレクトリにおいてコンパイルしたいのですが、
インクルードパスの設定方法がわかりません。
コンパイラはifortです。
ifort -I***
***に絶対パスを入れたり、相対パスを入れたりしたのですがダメです。
そもそも、-I/でタブ補完しようとすると
-I/ is not found.と出てきます。
何か別の設定が必要なのでしょうか?
インクルードファイルがあるディレクトリは、カレントディレクトリの中にあります。

159 :
fortranの出力指定子でマニアックなものまで全部のってるサイトを教えてもらえないでしょうか
例えば0.005を↓のように出力する指定子を探しています
5.000000000000000-3

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

161 :
少しはマニュアル読めよwww

162 :
さっき始めたんですがわからないので教えてください
あるモジュールにサブルーチンが二つある時にこの二つのサブルーチンを違うファイルに記述することは出来ますか?
C++でいう名前空間のように分離できるか?ということです

163 :
名前空間を分けたいなら、まぁmoduleを二個使え。
USEでエイリアスをつけろ。
どうしてもというなら、一個のモジュールを二個のファイルに書くことは、
includeを使えば出来ることはできる。
またFortran2008で導入されるsubmoduleを使う手も考えられる。が、実装している
処理系はまだないと思う。

164 :
Fortranのcharacterって文字コード決まってたりする?環境依存?

165 :
内部コードは環境依存。
というか昔はIBMのEBCDICこそが本物コードでASCIIは安物ミニコンとかのパチモン文字コードだった。
ANSI FORTRAN77の時に内部コードの他にASCIIコードに対応させる関数が導入されてる。

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

167 :
リスト構造といっても色々あるから答えようもないぜw
Fortranはデータパラレルには強いがタスク・パラレルは弱いけど、
OpenMPの新しい版ではタスク・パラレルできるから
リスト構造で枝分かれするところでタスク分割すればいいんでね?
順序入れ替えが無い線形リスト構造なら、配列に直せば元々高速になるし、
並列化の余地も大いにあると思う。

168 :
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 :
>>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 :
>>168
'(g20.12e3)'で指数部の桁数を指定するとか

171 :
>>170
そんな仕様があったのか。知らんかった。

172 :
ごめんミス。171は169です。

173 :
知らない仕様っていっぱいありそう

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

175 :
セミコロンで文末にできた気がする
equation = A&
     + B&
   ; ! + C  B から継続→文末、C の除外

176 :
10.000
100.00
1000.0
100000
浮動小数点を上記のように書き出したいのですが
どのように書式を指定すればよろしいでしょうか

177 :
>>176
f?.* を使ってください。
?は全体の桁数、*は小数点以下の桁数。

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

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

180 :
>>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 :
つづき、
ケース2,
サブルーチン1でサブルーチン2を呼び出します。
実引数はintent(inout) :: y(1:imax)で仮引数はintent(in) :: y(0:imax)です。
この場合もエラーが出ません。
コンパイラはifortです。
できれば、これらのケースでのinterfaceの使い方を教えていただきたいです。

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

186 :
>>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 :
>>185,>>186
ご指導ありがとうございます。
fortranは初めて触った言語で、これで正しいのか不安だったので助かりました。

188 :
direct access は、大量のレコード長(データの長さ)が等しいデータを
書き出しておいて、読み出し/書き換え時に、ランダム位置に直接そのデータを
読みに行くときに使うもの。
普通に不定長のデータをファイルにだらだら書き出して、読み出す時も前から順番に
たらたら読み飛ばしつつ、欲しいデータを探して行くときは、
デフォルトのシーケンシャル・アクセスファイルでいい。
また、人間がファイルを覗いたりするなら、フォーマットを指定して/自由形式にして
読み書きすればいい。
write(1, '(2f15.7)') x,y
write(1, *) x,y
ファイルサイズを小さくかつ高速にアクセスしたいときは、
write文でフォーマットを指定せず、内部表現で読み書きするが、
write(1) x,y

189 :
>>186
ご指摘ありがとうございます。U島氏の本にて学習中の身です。
ソースを見直し改めてコンパイル、ビルドしましたが、
外部サブルーチンが読めないと警告してきます(もちろん実行はエラー)。
gfortranですと何の問題もないのですが・・・
上に貼ったものは、gfortranで通ったものを試したもので、
実は、ftn95環境下では、real(8)は、real(kind(1d0))へと正されました。
ひょっとするとまだ、当方が何か見落としているのでしょうか??

190 :
>>189
手元にFTN95の環境が無いので何とも言えないが、
gfortranで行くならftn95の問題かもしれない。
1個のファイルにまとめてみたらどうかな?
ただし、順番に依存するので、メインルーチンは最後に置かないと駄目だと思うが。
まぁサブルーチンをmoduleに入れた方がinterfaceも要らないし楽だと思うが。

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

192 :
CVFは先祖がDEC Visual Fortran (DVF)なので、
dfでコンパイラドライバが起動する。
df sub1.f sub2.f main.f
で sub1.exe が出来上がると思う。
デフォでは実行ファイルの名前は先頭のファイル名になる。
moduleなどは先にコンパイルされている必要があるので、main program は
最後に来ることになる。
df /help もしくは-help でヘルプが出るだろう。

CVFは10年以上前のコンパイラなので、目的にもよるが
無理して使うよりは新しいのを手に入れた方がよいかもしれない。
同じプログラムでも、最近のコンパイラではめちゃくちゃ速く実行することが多い。

193 :
>>186
180です。結局、人間がチェックしないとダメみたいですね。
ありがとうございました。

194 :
>>193
正直Fortranではああいう書き方はあまりしないので、チェックにかからない。
66ならサイズは気にしないで、sub(x); x(10)
77なら整合配列で、sub(n, x); real x(n)
90なら形状引継ぎ配列で、sub(x); real, intent(in out) :: x(:)
配列を0から始めると苦難の道が待っているので、数学的要請でない限り
避けるのが吉。

195 :
4バイト整数の変数が,4バイトを超えたときエラーにならず変な値(マイナスになるはずのない値がマイナス)でそのまま計算が進んでしまいます。
プログラムのどのあたりで超えるか知りたいので,エラーで終了するようにするオプション又はデバッグオプションなどありませんか?
コンパイラ : intel fortran version 12 (CentOS 5)

196 :
>>195
昔のDEC Fortranにはinteger overflowの実行時チェックオプションがあったが、intel fortran になってから
そのオプションは無くなった。今もないんじゃないかと思う。
最近配列サイズが4byte整数を超えることが多くなってきたので、このチェックのあるコンパイラがあってもおかしくない気はする。
gfortranとかfreeのfortranも含めて
コンパイラオプションの説明を、便器を舐めるように注意深く読んで見るといいのではないか。

197 :
>>196
一応ifortのhelpでは,"整数"で検索かけてみたんですが,使える物はとくにありませんでした.
目視で全文確認してみます.
ありがとうございました.

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

199 :
>>198
32bitコンピュータとか64bitコンピュータと呼ばれるように、コンピュータは
ビットの塊を一括して処理する。メモリーアクセスは、0番地から32や64bit
の区切りで一括でなされる。この境界をまたぐと、本来1回で読み書き
できるデータに2回読み書きにいかなければならない。
そういうわけで、最近のFortranコンパイラは、自動的に境界合せをするようになっている。
ところがCOMMON文は、同じメモリー領域の割り付けだから、
コンパイラが変数の位置を勝手にずらすと、対応がずれてしまう可能性が出る。
それでアクセスが遅くなるよと警告している。

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

FORTRANコンパイラではREALとINTEGERのデフォサイズが共通であるという
(暗黙の?)約束がある。COMMON文での共有があるためだと思うが。
AUTODBLEをつかったりするとずれる可能性が出る。
以前GFORTRANだったかg95だったかが、この約束を破ってド顰蹙を買っていた。

200 :
はじめまして、こんにちは
現在、フォートランで数値計算をするプログラムを作っています。
今日、プログラム内で使っている配列のサイズを極端に大きくしたところ、スタックオーバーフローというエラーになりました。
解決策としては、コンパイルオプションでスタックを初めから大きくするというものがあるそうなのですが、この方法にデメリットはないのでしょうか?
また、これ以外の方法で、皆さんならどのようにオーバーフローを回避しますか?

201 :
>>200
サブルーチンとか関数で大きく確保しようとしたんだろ?
allocatableで確保すれば、ヒープ領域に取られるのでだいじょぶ。

202 :
次のようなデータをファイルから読み込みたいのですが,read文と書式をどう書けばよいか教えてください.
データの並びは
(親核種)(娘核種)(娘核種の比率)(孫核種)(孫核種の比率)(ひ孫核種)(ひ孫核種の比率)…
となっており,何世代まで子孫の核種があるかはファイルを読むまで分からないとします.

203 :
---------データの例(はじまり)-------------
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 :
read(unit=10,fmt='(A,100(:,A,E))') parent, ( progeny(i), progeny_ratio(i), i = 1, 100 )
このように書きましたが,Eに長さの指定がない,とエラーが出ます.
自分が分からない点は以下の二つだと思っています.
1. 任意の桁数の小数を読み込む方法がわからない
2. 一行に任意の個数だけデータが並ぶ場合のreadの仕方がわからない
コンパイラはgfortranを使っています.

205 :
>>204
結構めんどい。
1.任意の桁数の小数を読む最も楽な方法は、自由形式を使うことで、
空白とかコンマが区切りに入っていれば自動で切り分けてくれる。
自由形式を使わない場合は、動的にFORMAT生成する方法がある。
2.任意個のデータを読むのは、エラー上等で読み込んで、iostatで
エラーコードを調べて、END OF RECORD ならおkとか。

しかし、今の場合文字列処理の方が問題。固定長ならまだやりようがあるが、
Bi-210m みたいに長さの違うのが混じると苦しい。
結局、1行ごと文字列として読み込んで、空白をトークンとして自分でパース
していくのが素朴。
Fortran2003/08なら、もう少し柔軟なIOできるかもしれない。

206 :
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 :
実行結果
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 :
すばらしいです!ありがとうございました.
実は,自分もほぼ丸一日試行錯誤した末にできたのですが,
なぜ自分のプログラムがうまく動くのか説明できません.
教えてもらった方法をこれから読んで勉強しようと思います.

209 :
gfortranで通常の宣言型を超えて桁数の上限なしの計算をしたいのですが、
質問1)GMPというのを使えば良いのですか?
(既にPCに入っているとしたら、Ubuntuの場合は、どこのなんてファイル群?)
質問2)GMPを使うとして、どのようにソースを書けば良いですか?
(FMLIBの場合は、最初にuse FMZMとして、型宣言の時にtype(IM)とか)
質問2)他にもっと多倍数演算に向いたツールはありますか? 

210 :
質問です学校で COMMAND入力に「XX<YY.dat」という操作をしたのですがどういう意味でしょうか?

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

212 :
>>209
FMLIBかMPFUNでいいんでね?
Fortranで書かれてるし。

213 :
>>212
FMLIBにて成功しました。ありがとう。
今までintegerしか多倍数演算できなかったんだけど、FMLIBのほうがいい。

214 :
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 :
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 :
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 :
>>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 :
最近の大学では数値計算+Fortranの教科書は何を使ってるんだい?
コンピュータの数値計算一切やらないまま入ってくる学生がいて自習してほしいんだが
ヤングに嫌がられないお勧めあるかね?

219 :
ナウいヤング向けの言語はJavaとかか

220 :
自由端反射のプログラムで質問です。
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 :
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 :
というプログラムを出力した結果たしか
1. 0. 0.00223
1. 1. 1.4848
ってなって最初fを全部0にしたのにf(3.2)が1.4848となります、何が悪いでしょうか?

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

225 :
引数で前の状態を渡し、引数に次の状態を戻す
呼び出し元スレッドと内容を共有するので、実引数は
private なのか share なのか明らかにすること

226 :
なるほど。ありがとうございます。

227 :
OpenMPとの整合はよく分からんが、F95以降では
pure接頭子で依存性の無さを保証できる。
というかコンパイラがチェックしてくれる。

228 :
Visual Basicで下記のバイナリ出力したグリッドをfortranで読み込ませようとしてますが,
できません.input statement requires too much data, unit 10
とでます.

229 :
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 :
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 :
VBの事は、よく分からんが、少なくともFortran側でnheaderとnfooterを読むか
読み飛ばすかしないと、つじつまが合わないだろう。
いきなりエラーが出るなら、nheaderのintegerを三個の倍精度で読もうとして
要素が足りないと叱られたと思われる。
バイナリだとずれたまま読みそうな気もするが・・・

232 :
unformatted で sequential なファイルは次のレコード(記録)の組を飛ばすのに
何バイト読み進めればいいかを各レコードの前後に整数値として記録しているらしい
レコードは1文の read/write で扱われる単位とみていいはず
(このせいで妙にファイルサイズが膨らんだりする)
>>229 nheader と nfooter の値を確認

233 :
シーケンシャルなUnformattedなら、Fortran独自の形式だからVBの出力は
読めない気もする。
>>232の言うとおり、Fortranでは読みとばしとBACKSPACEでの逆行のために、
各レコードの前後にレコード長が記録されている。
F2003からの機能だが、STREAMモードで読むか、あるいはF77にこだわるなら
DIRECT形式で無理やり読む方法がある。どちらも読み込み単位が処理系によって
BYTEだったりWORDだったり依存性がるので調べる必要がある。
またDIRECT形式は大抵は普通にべた書きだが、処理系によってはヘッダが付いたりするので
これも調べる必要がある。
よく分かんないんだったら、素直に書式付とかCVS形式とかで出して
読むのが吉。

234 :
gfortranでポインタの初期値をnullにするコンパイルオプションをおしえていただけないでしょうか。

Linux上でintel fortran compilerでコンパイルしていたものを
windows上で動作させるために、g95とgfortranでコンパイルしようとしました。
ifortではデフォルトでポインタはallocateされていないのですが
g95やgfortranではそうではないようです。

g95では-fpointer=nullで初期値をnullにできるのですが
私のソースコードをコンパイルすると、コンパイラの内部エラーと言われます。
gfortranでは上記に対応するコンパイルオプションはないでしょうか

235 :
internal compilation error って要するにコンパイラーのバグなんじゃ…

236 :
初心者というか入り口にすら立ってないため質問させていただきます。
MUMPSっていうライブラリをMinGW環境で使いたいため
g95ってコンパイラをダウンロードしようとしているのですが
公式ページでもファイルが見つかりません。となって困ってます
みなさん、g95はどこから入手されているのでしょうか?
それともg95-MingW.exeが消されたのには何か理由があるのでしょうか?

237 :
g95は最近メンテされてないから、gFortranでいけ。
たぶん大丈夫。

238 :
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 :
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 :
なんだどうした?

241 :
pointer(pvar,var(*))
これってどういう意図ですか?

242 :
メモリポインタ

243 :
それはクレイ・ポインタと呼ばれるもので、クレイのFortranにあった非標準命令。
だがクレイが普及していたアメリカでは準標準みたいになったので、いまでも結構多くのFortranで使える。
まぁFortran2003の命令で、(工夫すれば)置き換え可能なので、もうあまり使われない。
POINTER (pointer, pointee)
ポインタ(整数変数)にはポイントされるもの(pointee)の番地が入るようになる。

244 :
>>243
ありがとうございます。
Fortran77では
pointer()もmalloc()も非標準ということですか?

245 :
>>244
両方非標準。
FORTRAN77以前では動的にメモリーを確保するための拡張命令があったり、
あるいはCのルーチンをリンクしていた。
Fotran90以降ではallocate命令が入った。
そのプログラムが書かれた対象マシンが分かるなら、ググればそれ用のFORTRAN77のリファレンス・マニュアルが落ちていると思う。

246 :
>>245
遅くなりましたが、
ありがとうございます

247 :
77で書いてあるプログラムが今のコンパイラで動くようにデバックしているのですが
common文で宣言している変数をmoduleでグローバル変数に変えたら、equivalence文でエラーが出てしまいます。
そこでこのequivalence文のところを変えようと思うのですが、90/95ので代わりとなる構文ってありますか?

248 :
>>247
直接の代替はない。
Fortran90/95で推奨されているEQUIVALENCEの代替は、TRANSFER関数でメモリー内容を別メモリーに
移せというもの。EQUIVALENCEのメモリー共有とは違い、二つの変数間の型変換を伴わない内容の代入にあたる。
古い時代にCOMMONやEQUIVALENCEがあったのはメモリーが少なくて、同じ領域を使いまわしたかったから。
COMMONやEQUIVALENCEによるメモリー共用が、コンパイラの最適化を妨げるから廃止に向かった。
COMMONを単なるグローバル変数とみなすと、移植で非常にめんどくさいことになることがままある。

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

249 :
>>248
ありがとうございます!
コード書き換えすのは止めてもう少しオプションいじくってみます。

250 :
初期値も何も与えてない変数の値って0ですよね?
それが0ではなくとてつもなくおおきな値になることってありますか?

251 :
いいえ
はい

252 :
>>251
まじっすか

253 :
変数がゼロになってるなんて思ってたのかよw
コップや皿を洗わないで飲み食いするタイプか?

254 :
規格上は不定らしいよ。
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 :
初心者スレだったか、めんごめんご、すR、おR。
昔の日本の大型計算機のFORTRANは0クリアしていることが多かった。
IBMはごみだらけの状態でよこしてた。
今もリンカのオプションでゼロクリアできるものが多い。

256 :
なるほろ〜不定なんですね。
いや実は昔のプログラムを今のコンパイラで動かしているところなんですが
通常なら0であるぺき変数が変な値になってしまいうまく動かなかったんです。
オプションで0クリアにしたらうごくかもしれません。ありがとうございました。

257 :


258 :
デバッグしているのですが
THDFEというサブルーチンで仮引数(x)を動的割付け配列で宣言し直したところ
”THDFEにおいて存在しないもしくは誤った引数仕様ブロックです。ー仮引数x(第三番目)は割付け配列です。”
とエラーが出たんですが。意味がわかりません。詳しく教えて下さいm(__)m

259 :
この質問じゃ情報少なすぎ。
せめてエラーメッセージそのものを貼るべき。
まぁ呼び出し側の配列が、割り付け属性を持っていないという程度の誤りだろう。

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

261 :
それはエラーメッセージそのものじゃないだろ。
エラー番号とか全部込々で貼れよ。
質問の仕方が悪いといつまでも答えが出ないぞ。
大体、サブルーチン側で文句を言われているのか、呼び出し側で文句を言われているのか
それすら判然としないだろ。

262 :
>>261
すみません・・・
これがエラーメッセージです。
実行時エラー: ../sorcefile(先生)/HTHDFE.f90(1): THDFEにおいて存在しないもしくは誤った引用仕様ブロックです - 仮引数X(第3番目)は割付け配列です
致命的なエラーでプログラムが終了しました
サブルーチン(THDFE)側のほうでエラーメッセージがでます。

263 :
>>262
interface文を書いてないとか?
それと仮引数に割り付け配列を指定できるのはFortran2003以降のはず。
Fortran95の拡張仕様TR15581をコンパイラがサポートしていれば問題ないけど。

264 :
>>263
コンパイラはfortranbuilder5.3.1でfortran2003にも対応しています。
integerface文を加えれば問題ないでしょうか?

265 :
integerfaceじゃなくてinterfaceなw

266 :
>>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 :
>>265
ほんとだww interfaceってうったつもりだったのにww
>>266
そうします。ありがとうございました!

268 :
interface 書くより、サブルーチンをmoduleに入れたほうが楽でいいぞ。

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

270 :
引用とか数行とかの範疇を超えて、見ながら書いたのなら原型を留めてなくても派生物じゃね?
極端な話他言語に移植しても、ロジックが同じなら派生物

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

272 :
>>271
Intel Fortran compiler 14.0のリファレンスではそうなっている。

273 :
>>272
intel がそうなっているのは知っているが、実際はどうなのか?
他のベンダーはどうなのかね?

274 :
>>273
言語仕様では拡張子は規定していないのでコンパイラ依存。

275 :
すみません、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 :
なお、コードは以下になります。
どうぞよろしくお願い致します。
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 :
>>270
やっぱり肝はロジックかぁ。かと言って、違う答えが帰ってきても困るしなぁ。
まぁ、元のソース見れる奴が、クローン作りました、でもこっちのソースは非公開。
なんて言っても、周りから見たら限りなく黒に近いグレーだわな。
割に合わなさそうだし、諦めるかな。
>>275
実数型と整数型だと、メモリの使い方が違うから、
実数型は入っている領域(の一部)を整数型で解釈しても、
実数型で入れた値にはなりません。という説明で良いのかな。

278 :
>>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 :
[ ]はFortran2003、F90/95なら(/ /)で。配列構成子(array constructor)
倍精度実数と整数をEquivalenceで同じ番地を共有させているから、
整数2個毎が倍精度実数1個に対応している。
(KINDの数字は必ずしもバイト数に対応すると限らないが、慣習から仮定して)
エンディアンによって、メモリー上の倍精度実数の上位と下位が入れ替わるので
適宜対応する必要がある。
それをF90以降のTRANSFER関数で、メモリー内容を第二引数の型で解釈している。
単精度実数なら他に単にFORMATを実数用にして強行突破する方法も考えられる。
倍精度の時は難しいかな??

280 :
Fortran2015に関するまとめサイトとかないかね?
今度は何を付け加えるのさ?

281 :
すんません。
数値計算する際、expとかの値が大きすぎたり、小さすぎたりしてオーバーフローしたり、exp(x)のx が限りなくゼロに近い時とか、欲しい値が得られません。
みんなはどうやって回避してますか?
よくよく考えたらexp1000 とかオーバーフローしますよね。

282 :
ここの人はフォートランはわからないから他いけ

283 :
>>281
精度の問題がないなら対数を取って計算すればいいじゃない
というか、それは浮動小数点演算の本質的な問題だから
まず数値計算の基礎を勉強することをお勧めする

284 :
書き込んでから気付いたが、もしexp(1000)の値を実際に表示したいのなら
多倍長計算とかしかないな

285 :
>>283
何がオススメですか?参考書的なもので。
ちなみにプランク関数とか値がどでかい物やらプランク定数のようなちっこいものまぜまぜして計算することが多いので困ってます。やはり対数でやるべき?

286 :
プランク常数とか絡むなら、それを1に規格化して計算するのが常識だろ。
まず少し基礎的な本から読め。

287 :
みんなどんな環境でやってるんだろ
Cygwin+Emacs?

288 :
コマンドプロンプト+メモ帳 まじで

289 :
>>286
え?そうなんですか?
だからその基本的な本というのを紹介してくれませんか?
フォートランの本

290 :
>>289
言語の本より数値計算(数学)の本のがいいんでないか?

291 :
>>289
伊理正夫の「数値計算の常識」の中に無次元化の章があったはず。
大した事書いてないが常識として程度は知っておくべき。
大体、無次元化していないと、素人・非常識・DQN・支那チョン・ごみ・カス・クズ扱いされる。
この本の前半は面白いし為になるので買って損はない。

シュレディンガー方程式を解きたいんだったら、原子スペクトルの本なら大抵、原子単位系(atomic unit)への変換の章が
頭の方にある(エネルギーをハートリー、長さをボーア半径にする)。この辺は少し詳しい量子力学の本にもある。
まぁ今ではエネルギーの単位をハートリーでなくてリードベルグに取ることが多い気もするが。
クーロン項の分子が1になるか2になるかの違いだ。

292 :
>>291
うぉぉ。。。ありがとうございます。
かなり貴重なお話しです。
まずは「数値計算の常識」買ってみます。

293 :
データから近似式を出すソフトみたいのないですかね?できればフリーで。
Fitykではなんだかできなかった…

294 :
それはFORTRANスレで聞く内容じゃない

295 :
>>294
どこで聞けばいいの?
わからないならレスしないであげれば?、

296 :
>>295
何でそう思ったの?

297 :
294ではないがプログラム板でフリーソフトのFitykを比較対象にするのは板違いでは?
「関数近似のFORTRANライブラリはありませんか?」ならわかるが
質問内容からすると自分でプログラムを作りたいのではなさそうだが

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

299 :
君が欲しいソフトは無いよ
どの関数で近似するかは人間が決めること
ソフトが決めることではない

300 :
Excelでやれば?あれで十分じゃない。

301 :
gnuplot 使ってやったことありますがどうでしょう?私がやったのは多項式だけですが任意の関数に対してフィッティングできるようです。

302 :
>301
gnuplotでは,splineとbezier補間してグラフを画く
機能がありますが,それ以外に任意の函数のフィッテイング
機能ってありますか?

303 :
>>302
>>301にできるって書いてあるじゃん

304 :
正月早々下層階級出身の発達障害みたいなのが湧いたなw
アスペ野郎は、よそのスレに行けよ、HaskellスレとかMLスレに行けば仲間がいっぱいいるぞ。
ここは毎年この時期は卒業研究で焦りまくった学生さんの駆け込み寺なんだからさ。

305 :
だなwスレタイくらいは読めよと

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

307 :
一度文字列として読み込んで、その文字列から数値として読み込む
例えばこんな感じ(valueが数値の変数、cvalueが文字列の変数)
read(*,*) cvalue
read(cvalue,*) value

308 :
>>307
早速のレスありがとうございました
ためさせていただこうと思います

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

310 :
スレを読み直してallocatableを使うことでコンパイルはできました。
すいませんありがとうございました

311 :
乙 俺も勉強になった

312 :
すみませんが、ちょっと教えてください。
Intel MKLのpardisoで、LU分解後のLとUを取り出すためにはどうしたらいいのでしょうか?

313 :
すみません。セグメンテーション違反って何ですか?

314 :
OSがゴミってこと

315 :
G95をダウンロードしたいのですが、
Windows版のFTPでは、
530 Login authentication failed
(認証に失敗)
とでるのですが、どこで認証を得られるのでしょうか。

316 :
httpじゃ何か問題あったの

317 :
>316
httpではウンともスンとも言わないのです。
画面がフリーズしたままなので

318 :
>>317
リンクが生きているのはcygwinとLinux系だけみたいだね
MinGW版がひつようなら
http://www.fortran.com/the-fortran-company-homepage/whats-new/g95-windows-download/
けど、このページでも言っているようにG95はメンテナンスが停止しているみたいだし
素直にgfortranを使った方が良い

319 :
>318
御教示ありがとうございます。
gfortranをダウンロードして使うことにします。

320 :
上の方に無次元化の話が出ていましたが、これって数値計算の本ならちゃんと説明されているものですか?
ネットで検索してもあまりヒットしないし、あったとしてもやり方だけでそうする理由はあまり説明されていない気がします。
自分は先輩から教えてもらって初めて知りましたが、周りには知らない人が結構多いです。
伝統芸能の世界じゃないけど、「数値計算のテクニックは見て覚えろ」みたいな風潮を感じています。
とりあえず自分も「数値計算の常識」買ってみます。

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

322 :
でも、無次元化で数式を簡単にすることと、規格化をして数値誤差を防ぐことは別の話ではないのですか?
自分はこのへんの理解がまだ曖昧です。
数値計算系の研究室なので、無次元することが常識なのはよく知っていますが、
ちゃんと教えてもらったことは一度もないです。
自分で書いたコードをたまたま先輩が見る機会があって、そのときに指摘されて知りました。
他の人はどこでそういう常識を知っていったのかが気になります。

323 :
他にも数値計算のデバッグテクニックとか先輩から教えてもらう機会はあるんですけど
ちゃんとした理論がよくわかってないのでとりあえずやってる状態なんですよね・・・
本でちゃんと勉強したいんですが、そういうのが書いてあるものが見つからないし。
愚痴ばっかですみません。スレ汚し失礼しました。

324 :
あ、ごめん。見なおしたら、「数値計算の常識」では6,7ページくらい使って説明されてたわ。
どこで学んだかと言われると、たしかによくわからない。
口伝かな。

325 :
そうですか!とりあえず買ってみます。

326 :
物理の本では無次元化が必ず出てくるぞ。
量子力学とか割と基礎的なテキストで。
桁落ちのことを考えると、すべての量のオーダーがそろった方がいいしな。

327 :
すみませんが教えていただけないでしょうか
うろ覚えの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 :
OSはLinuxか?
ライブラリかなんかの整合が取れていない気がする。

329 :
プログラム自体の問題ではなく、実行ファイルが不正な命令を実行しようとしたのが原因。
それがコンパイラのバグなのか、コンパイラオプションや実行環境の問題なのかはわからん。

330 :
>>328-329
レスありがとうございます
OSはXPでコンパイラオプションは
-oだけ使ってます
文法の間違いでないと分かって
とりあえずひと安心しました
インストールしなおしとか旧バージョン
使うとかしてみます
たいへんどうもありがとうございました

331 :
>327
gfortranで実行したら、
2.0000000000000000
と結果がでてきましたよ

332 :
>>331
dです
もしよろしかったら、OSとコンパイラのバージョン、
コンパイル・オプション等教えていただけたら嬉しいです

333 :
>332
GNU Fortran 4.7.3
Windows 7 64bit
optionなし
です。

334 :
>>333
ありがとうございます!
旧バージョンを使うと吉なのかもですね
こちらはその後、(再インストールの前に)プリント文を使わなくてもいいように
プログラムを改造してみたのですが……
ここで新たに、実はプリント文・ライト文に関係なく同じエラーが出ることがわかり、
ちょっとorzorzorz……な心境です
とりあえず、プログラムの作成と並行して、コンパイラの方もなんとかしてみたいです
ちなみに今回のエラーは、文法確認のために作った次のプログラムで出てきました
program checkpwr2
double precision dx, dxp2, dxp2d
dx = 2.0d0
dxp2 = dx**2
dxp2d = dx**2d0 ! ←ここでエラー発生
print *, dxp2, dxp2d
end

もう少しいろいろ調べてみます
長文失礼しました

335 :
もうF77のプログラムに手を加える作業はいやだお・・・
今module内のSubroutineからLAPACKのZGEEV呼ぼうとしているんですが、
LAPACKのサブルーチンって外部副プログラムですよね?
毎回interface文を書くのが正しい書き方なんでしょうか?
使ってるのはintel fortran &amp; MKLです。
module
...
contains
subroutien foo
implicit none
interface
subroutine ZGEEV(jobvl, jobvr, ...
...
みたいな感じに。

336 :
LAPACK用の95用 INTERFACE MODULEは公式であったろ。NETLIB無間地獄を探せw

337 :
>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 :
>>337
お手数おかけしてすみません
やっぱ私の環境がダメすぎってことみたいですねorz
あれから再インストールをしてみたのですが同じエラーがでてまして、
それで、インストール時の環境を変えてみるか、それかバージョンを落としてみるか
してみようと思ってます
うまく行ったらお礼がてら報告したいと思います
たいへんどうもありがとうございました

339 :
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 :
あー書き込みたい

341 :
>>335
インテルなら use lapack95 を implicit none の前の行に足し
mkl_lapack95_lp64.lib をコンパイルに足したまえ
ぶっちゃけ interface 書かなくとも呼べる。引数チェックは無論効かないが

342 :
>>341 に追加
って総称名じゃなく個別名か
ならば include 'mkl_lapack.fi' で解決する
interface 定義がここに全部書いてある

343 :
>>339
レスdです
実は私もそこのを使ってエラってたのですが、でもおかげ様で
「他のサイトから落としたファイルならうまく行くかも」、
ってことに思いいたりました
で、探したところgcc wikiっていうところで非公式ながら
お手軽そうなインストーラを発見、さっそく落として
コンパイルしてみましたら
 完動です!!!!
小数点のあとに0がいっぱい並んでるので、記念にスクショ撮りましたw
たいへんどうもありがとうございました

344 :
>343
無事出来てよかったですね!
それにしても、Fortran IVとか、Fortran 77では、せいぜい
2倍長演算しかできなかったのですが、いまでは、4倍長演算
がらくらくできるのですから、隔世の感があります。

345 :
Debian 32bit版に gfortran 入れて数値計算してるんですが、配列って2gb までしか割り当てられないのでしょうか?

346 :
>>345
32bit版ならできないと思いますよー

347 :
>>344
ありがとうございます!
猫に小判って言われないようがんばりますw

348 :
4倍長はソフトウェアで計算しているから10倍以上遅いから
むやみに初心者には教えんなw

349 :
>336 >341->342
遅くなりましたがレスありがとうございます!
Intelさんの優しさが五臓六腑に染みますわあ

350 :
>>346
ありがとうございます。
やはり64bitにするしかなさそうですね。
いちいちdeallocateするの大変なのでw

351 :
OS&コンパイラ64bit版にしても、静的な配列は2Gまでだったりすることが多いから、
よく調べた方がいいぞ。むろん動的には2Gを超えて確保できるが。
これは手抜きではなく、まだ整数のデフォは32bitだし、単精度実数とデフォ整数
長さを合わせるという約束とかもあるから色々全体整合で仕方ない事情がある。

352 :
>>351
うーん、難しい話ですね。
単純に64bitにしたからって載せてるメモリフルフルで使えるわけではないってことですね?
どうしても配列を一度に百万行ほど読み込ませて数値計算を行いたいのでほとほと困り果ててます。
和書だとあまりフォートランに関して詳しい解説本(オプションやらテクニック的なもの)が少ない気がするのですが、何かオススメありますか?

353 :
昔は西村恕彦が粘着していたが、その後は粘着いないね。
・66でJIS FORTRAN全釈―電子計算機プログラム用言語
・77で岩波FORTRAN辞典
・90ではMetcalf&Reid本訳者としてbit 別冊『詳解 Fortran 90』
Metcalf & Reid 本もF2003から Cohen が加わったが、これは東京に住んでるんだから
次世代匂い付き粘着野郎が生まれてもいいはずだ!w
とはいえアメリカ人も粘着ばばあのJ.C.Adamsが死んでからFortran Handbookが
でなくなったので寒い時代になってしまった。

354 :
>>350 プログラム終了までほっといていいなら deallocate 不要
サブルーチンで宣言した非 save の allocatable は
サブルーチン抜けると勝手に deallocate したかと

355 :
>>354
ん???どういうことでつか?
a.out 実行すると、エラーおきまつよ?

356 :
Fortran90 からずっと 6.3.3.1 Deallocation of allocatable arrays で述べてる
return または end で手続きの実行が終了したとき、その手続きの局所変数は deallocate されると
allocate 時の問題じゃないことは当然確認したね?コードうp

357 :
>>356
むっちゃコード長いプラスモジュール化してるんでつけどOKでつか?

358 :
>>356
あれ自動DeallocationはFortran95からじゃなかったっけ?
おれF90時代に、ベンダー依存の解放エラーに悩まされた記憶がある。
とおもって、アニメを見ながら調べたら
Fortran90 handbook6.5.3.1 では状態不定
Fortran95 handbook6.5.3.1 では自動解放
とあった。
まぁ今時F90コンパイラ使っていないと思うが、>>357さんは念のため
調べた方がいいな。

359 :
仕様にあるから…ってもベンダ依存はしゃーないか
http://www.nag.co.uk/sc22wg5/links.html
だがモジュール変数は解放されない
あとむしろそういうコード解析できる機会ないからくれるなら是非
公開したこと他の奴に怒られる事態になっても知らないけど

360 :
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 :
保守
コンパイラ任せでなく、Fortran 言語の範疇で、まともに
高速化を考える人間ってどれくらいいるのだろうか

362 :
>>361
そうしたいんですけどねぇ。。。
その前にまずはコンパイラを通すことが出来るってとこまでで必死ですよ。
なーんかいい本ないですかね?

363 :
とりあえず文法は ggれならぬ nagれ、だな。本は洋書しかないし
http://www.nag-j.co.jp/fortran/
一昔前のベクトル型計算機向けっぽい(最近のアクセラレータで見直されてる)
ループ変数固定とか仮引数の非エリアスとかの暗黙制約、
配列表現の柔軟さに ELEMENTAL & PURE 関数、
Fortran 直じゃないが OpenMP & MPI と割となんでも明示化できるが、
逆に言うと複雑かつこれやっとけばおk的な部分がないのと、
そこまで性能にシビアな世界はニッチかつ閉鎖的すぎる、特に国内事情で。

364 :
国内でFortran使ってる人口がそもそも少なそう

365 :
最近コンピュータというとWEBがらみでテキスト処理機みたいなノリが強いが、
本来の電子計算機としてはFortran不動だべ。
そして日本は結構Fortran市場/ユーザーでかいんでないかな。
Intel Fortranは英語以外には唯一日本語マニュアル等を出しているし。
アメリカ以外でハード・OS・コンパイラまともに作れるの日本ぐらいでね。

366 :
ちょいとスレチかもしれませんが、みなさん変数の命名法ってどうしてますか?


367 :
商業利用は少ないし、研究機関での個人・少人数開発がほとんどだし、明文化されたコーディング規約ってなかなか見つからんよな。
C++も併用してるので、そっちの命名規約と統一してる。
変数大文字6文字縛りは勘弁な。

368 :
WEB世界の偉い人wでもFortranの知識が66や77時代のイメージ止まりで
とんちんかんな事を言っていて笑える。
アドバイスで数値計算はFortranじゃなくてもいいとか言って、
初心者たぶらかして冬山にTシャツ、サンダルで登山させるような
悪い奴多すぎで草不可避www

369 :
fortran90なんだけど、
三次元配列に二次元配列の要素を代入したいんだけど、どうすればいいかな?
a(i,j)に時間軸tを追加して、
do t=1,100
b(i,j,t)=a(i,j)
end do
こういうイメージで、逐次のa(i,j)を代入したいっす。

370 :
b(:,:,t)=a
でおk?

371 :
え そんなシンプルでおk?
ありがとうございます

372 :
b(:,:,t)=a(i,j) だと駄目。
>>370 のとおりじゃないと。
部分配列を指定するのにコロンを使う。
たとえば配列 v の第2成分から第10成分までなら v(2:10)。
コロンの両脇に数字がないのは、成分あるだけ全部という意味。

373 :
ちょうどいい解説があった
http://www.str.ce.akita-u.ac.jp/~gotou/zyouhou/f90/sec6.html#6.4.

374 :
>>372
文字化けしてしまって見れませんでした
>>372
コロンの意味はよくわかりました。ありがとうございます
a(i,j)はダメでaじゃないといけないのがわからないです、配列の定義は
real a
dimension a(i,j)
と別でやって、
b(:,:,t)=a
とやらなければいけないということです?

375 :
>>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 :
>>375
なるほど、よくわかりました。ありがとうございます。数日前にfortranをはじめましたがプログラミング自体がほぼ初なのでとても勉強になりました。
人の書いたプログラムのある一つのサブルーチンを修正したいのですが、変数の名前の設定の仕方も人それぞれだし、読むというのはとても大変ですね。

377 :
>>376
追記の質問なのですが、bは三次元配列でaは二次元配列ですが、こちらが指示しなくても、aをbの:,:部分に入れるのですね。
これは次元の違うものを代入をするとき、どのように対応するのかは次元で決まるということでしょうか。
aは1次元、2次元成分をもつ配列だから、それを代入する先もbの1次元、2次元成分に代入するということですよね?

378 :
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 :
>>378
>b(:, :, :) は3次元配列だけど、b(:, :, 1), >b(:, :, 2), ..., b(:, :, 100) はそれぞれ2次元配>列です。
配列については調べましたが、意味がわかりませんでした。なぜ二次元配列なのでしょうか
integer a
dimension a(2,3,1)
私はこれは3次元の配列だと思っています。
配列の次元は,で区切った数で決まるのではないのですか

380 :
>>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 :
>>380
遅くなりました。非常にわかりやすい解説ありがとうございます。NAGで少しずつ勉強しています

382 :
すみません
fortranを始めようと思ってるものですが
おすすめの開発環境を教えていただけないでしょうか?
今はgfortranとvimでプログラミングを始めようかと思っているのですが
いちいちvimで書いて保存してvimをぬけてコンパイルして実行するのが手間だなと感じています。
vimを抜けずに書いたプログラムをコンパイル、実行できればいいのですが。
そこでおすすめの開発環境を教えていただきたいのです。

383 :
小規模ならエディタ+コマンドラインでいいと思うけど
gfortranで統合開発環境ならeclipseが無難
https://www.eclipse.org/downloads/
ここからEclipse for Parallel Application Developersをダウンロード

384 :
>>383
小規模でもエクリプス使う利点ある?

385 :
否定するだけじゃなく、代替案を示せよ!
サヨクちゃんかよw

386 :
>>385
いや、否定してない。
質問してるの!利点ある?

387 :
Gfortran 使いです。
Cycle 文についての質問だけど、
do a = 1, 5
If ( a .ge. 3) then
a = a + 1
cycle
endif
enddo
とかだったら a = 12 になるのかな?

388 :
do 変数をいじっちゃいけないはず。
自分のおちんちん/おRはいじってもいいよ。

389 :
ループ中でループ変数(この場合は a)は変更できない

390 :
間違えた
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 :
おじちゃん、少しは文法書読みなよ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 :
>>391
なるほどね、ありがとう。
サイクルは便利だね

393 :
試した奴いるかい?
登録がめんどくさいんですけど。

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

394 :
ちょっとお聞きしたいのですが、
構造体の1成分だけfunctionで計算するような
書き方はできないでしょうか
たとえば
function aaa(i,j)%a
ーーー
end functionなど・・
構造体初めて使うのでまだよくわかっておらずすいません
よろしくおねがいします

395 :
「構造体の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 :
>>395
早速のレスありがとうございます
まだよくわかっておらずすいません
やりたかったことはおっしゃっていただいたまさに(2)です
教えていただいたやり方でできそうです
とても助かりました。ありがとうございました
また機会がありましたらよろしくおねがいします

397 :
>>393
そんなにめんどくさくなかったぞ。非商用利用で登録するときと大して変わらなかった気がした。
ついにfortran2003完全準拠か。国産コンパイラベンダも早く頼むで。

398 :
連休を利用して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 :
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 :
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 :
>>400
ご教授ありがとうございます
forallやpureなど使ったことがなく、書き方例など大変勉強になりました
ご教示いただいた内容で書いたのですが他との兼ね合いの依存関係なのかまた出てしまいました
(col. 58) remark: 並列依存関係: FLOW の依存関係が var$649 行 343 と var$649 行 91 の間に仮定されました。
などなど
どうも他のサブルーチンの書き方も並列化に悪いようで、教えていただいた並列化方法を頼りにまず勉強しなおして、
他のプログラム部分もいい機会なので見直そうと思います。
ありがとうございました。

402 :
Linux 使いでEclipse + photran のフォートラン統合開発環境を構築しようかと考えているのですが、なかなかうまくいきません。
例えば、今までターミナル上で
Gfortran hoge.f90 main.f90 でコンパイルできたてのに、eclipse だと ant build not found とかででうまくいきません。
ちなみにhoge.f90 はモジュールファイルで、main.f90がメインプログラムです。
エクリプスでもhero.f90 (メインプログラム単体)単体のコンパイルは出来ています。
もしかして複数ファイルを同時に今コンパイルできないとか?

403 :
プロジェクトにソースファイルを全部入れてビルドするだけだが駄目かい?

404 :
>>403
え?それだけなんですか?
プロジェクトに全部ファイル入れてあります。なのにエラーが。。。

405 :
>>404
ここで聞いてもムダだよ。
ここにはエクリプス使ったことない奴しかいないから。
みんなテキストエディタ直打ちだから。

406 :
>>398
乙。いただいた

407 :
>>398
GJ!
英語ばかりでびっくりした。参考文献欄があるのが凄いね。

408 :
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 :
fortranまとめwikiないよなそういえば

410 :
sin波のようななめらかな波形データから尖頭値を抽出するにはどうすればよいでしょうか。
波形データの入っている配列aから抽出したいのですが、sin波のような綺麗な周期を持っておらず、地震の観測波形のように不規則に連続して変化していっています。

411 :
こんなの来てた。
MODERN FORTRAN FOR SCIENTISTS AND ENGINEERS
By Damian Rouson
http://jolts.stanford.edu/72/modern_fortran_for_scientists_and_engineers

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

413 :
Fortran90/95による実践プログラミング [単行本(ソフトカバー)]
安田 清和 (著), 水野 正隆 (著), 小野 英樹 (著)
http://www.amazon.co.jp/gp/product/4872594738

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

414 :
なんかエクリプスとフォトランの詳しいマニュアルないかな?
本家でもversion古いし

415 :
>>414
Youtubeで外人のおっさんが実演してたぞ。
俺は使ってないからようわからんがw

416 :
>>415
おお!YouTubeでですか(´・_・`)
みなさんはエディタからコンパイルしてますか?
デバッグとかどうしてます?gdbとかdddですか?

417 :
fortranで書いたプログラムの出力ファイルを読み込んで、それを元にしたグラフを書かせたいのですが、1)それに適したグラフ描画ソフト2)そういったことを解説してある本はないでしょうか?
現状はExcelVBAで出力csvファイルを呼び出し、所定のExcelシートで編集してグラフにするためのデータを作成し、そのあと手動でグラフを作成しています。
Excelを挟まず、csvファイルをもとにグラフを描画してくれるプログラムがあるととてもありがたいのですが、何かできないでしょうか

418 :
>>417
Gnuplot, R とか(´・_・`)

419 :
現在,windowsで大学の課題でmingwを使用してコードのコンパイルや実行しようとしています。
コンパイル自体は成功したようにみえたのですが実行する際に
「コンピュータにlibquadmath-0.dllがないため,プログラムを開始できません.
この問題を解決するには,プログラムを再インストールしてみてくだい.」
と表示され実行できません。
因みにコンパイルしたコード(hello.f90)は以下のようになります。
program hello
print *, 'Hello World!'
end program hello
またC言語(C++)のコードのコンパイルや実行には成功しています。

420 :
path

421 :
http://www.oki-osk.jp/esc/cyg/cygwin-27.html

422 :
>>419
以前、似たような(同じ?)エラーメッセージに遭遇した事があったが
その時は件のライブラリを強制再インストールしたら直ったように思う。
mingw-get update
mingw-get --reinstall upgrade mingw32-libquadmath
これを実行してMinGW(MSYS)のターミナルを再起動すればどうかな。

423 :
>>418
gnuplotですかありがとうございます

424 :
清書にはmatplotlibでね?

425 :
>>413
今日日出すなら2003と2008解説してほしい

426 :
>>422
ありがとうございます.
なんとか実行することができました.

427 :
>>425
ですよねー

428 :
メモ帳のインプットファイルから一行ずつ読み込んでプログラムを回す時、読み込める一行の長さの限界というのは決まっているのでしょうか
例えば
有効数字8桁の数字を10個、一行に並べて書いた時はエラーで読みませんが、それらの桁を4桁まで減らして並べて書いたらプログラムが回るのです。
Excelで作ったものをメモ帳にはっつけて使っているので、セル間をタブキーによる空白で置き換えられます。
その空白を半角スペースに置き直して一行の長さを短くしても読むようになるので、読み込める一行に限りがあるように感じます。
CHARACTER CARD 100
という部分を200に変えても意味がなかったのでどこを変えれば読み込める一行を長くできるのかがわかりません。

429 :
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 :
>>429
20年以上前に書かれたプログラムを少し編集しようとしています。読み込み部分は他の人が書いていて、初心者の私はそれを少し編集したいのですが、自信がないです
とにかくやりたいことはinputファイルのうちあるブロックの読み込み部で1行につき10個読んでいるところを14個読むようにしたいのです
CHARACTER CARD 100という意味もよくわかっていません。調べてもCARDの意味が出ませんでした。
input.txtを読み込むよう指示するのですが、全体としてそのinputは数千行とあります。それでもそのような記述で大丈夫なのでしょうか。

431 :
どのような記述だよ

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

433 :
>>432
配列の上限や各プログラムでのループ処理で何個読めるのかを確認しました。その点は修正しても大丈夫でした。
しかしinputファイルから読み込む一行があまりに長いとエラーを起こすのは改善できませんでした。

434 :
どこからどこへどれだけデータを読み込むか書いてあるのが read 文なので
それが出ないとどうにも。それに input.txt が長くいろいろブロックがあるなら
対応する read 文もいくつもあるうちのどれかってとこだな。

435 :
最初の質問
>読み込める一行の長さの限界というのは決まっているのでしょうか
に答えるとすれば,
「データをどう読むようにコーディングされているかによります」
かな.
何度もread文を書くように言われているのに書かないってことは,
知的財産の流出とかなんかを気にしているのかな?
ソースコードをほんの一部でも書けないなら,先輩なりに聞いた方がよい.

436 :


437 :
>>434
>>435
プログラムの中でちょくちょくある
read card 100
character 100
という部分で読み込んでいるのではないかと思います
プログラム作成者と話して100→200とかに増やせばなんとかなるんじゃないかとなって変更しましたがなんの効果もありませんでした
500にしても変わらなかったので、そもそも読み込める長さが決まっているのではないかと考えるようになったのです

438 :
何度も書けと言われているものを書かないのはなんでだろう
書けば直したりしてくれるかも知れないのに
書かれている文はFortranの文法に合わないし
cardに一度読み込ませて、その後各変数に値を分配しているように思えるけど、これだけでは分からない
読み込みができているかreadの後に変数の値の確認とかしてなさそうだし
単純に1行でどこかまで読めるかテストプログラム組んで確認してなさそうだし

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

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

441 :
>>438
1万行超えるのでいったいどこを抜き出せばよいのかわかりません。全てを貼ることはできませんし、各サブルーチンに出てきているread文はこれです。
ご指摘の通りインプットファイルから取り込んだものを各変数へ分配していっています。
アウトプットファイルから、入力した値と読み込んだ値が一致しているかどうかは確認済です。
ただ、問題となっている入力部分における一行が長いと、そこを読み込めずにプログラムがそこで止まってしまうのです。入力する変数の個数の問題ではなく一行の長さに問題があるのではないかと考えているのです。

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

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

442 :
昔は
_______read 6 100
とか書いてたな

443 :
1つ言えるのは card とはそのプログラム内で定義された何らかの名前
そして今のところの常識的にその文法は Fortran とは異なるように見える
100 はその数字のラベルが付けられた行であるようにも考えられるが
その場合は 200 など別に変えられた場合にコンパイルエラーか
実行時の動作がぶっ壊れるだろうから、おそらく数値とみるべきか

444 :


445 :


446 :
common/mat/a(20)
common/mat/a1,a2,…a25
と記述してもプログラムが動くのですがなぜでしょうか
matには20個の変数しか入れないから、a1〜a20までしか読み込まないと思ったのですが、なぜか読みます

447 :
文法上では、大きさの違う COMMON ブロックは、無名 COMMON ブロックでしか
許されていないのだが、まぁ昔はよくやられていた。
66時代は静的にメモリー領域が確保されるので、問題は少ない。
77時代には、文法上は COMMON ブロックも SAVE 指定しないと、
解放されるのでまずいのだが、過去との互換性から普通は静的に
確保されていたのでまぁ大丈夫だった。
COMMON 文はメモリー上の番地の共有になっている。それは先頭で位置合わせが
なされるので、より大きい方でメモリーが確保されていれば、一方が小さくても
問題ない。ただ、小さい大きさで確保されていると、エラーが出なくても
はみ出して読み書きしているだけなので、ファンタスティックな予期せぬ出来事
が起きる。

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

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

449 :
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 :
同じプログラム単位に書いたなら
common/mat/a(20)
common/mat/a1,a2,…a25

common/mat/a(20),a1,a2,…a25
と同じだったかと
違うプログラム単位に書いたなら多分未定義だが
重なるメモリはそれっぽく読めて、多い分はそのまま使えるっぽい

451 :
>>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 :
コンパイラのオプションで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 :
テストプログラム
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 :
Emacsでfortran のコマンド自動補完できるのかな?

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

456 :
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 :
>>455
虚心に読めよw
1.名前付きCOMMONで長さがそろわないのは文法違反。
2.ゆえにそれがどう扱われるかは、処理系依存。
3.したがって、自分の利用しているコンパイラがどう扱っているか調べる必要あり。
4.調べる方法の一例はMAPファイルを書かせること。実例をIntelCompilerで示した。
結論:そなたの使っているコンパイラがわからなければここでは答えようがない。
 大抵の処理系では適当に慮ってやってくれるが、昔のHITACのような凡例も
あるので何とも言えない。NAGとか文法にうるさいのを売りにしている処理系では
期待薄。
>>456
うむ。DECのαとか、64bit時代になってから、COMMON文の中までPaddingして
メモリー・アラインメントをそろえてくるので、昔のプログラムを動かそうとすると
やっかい。
Intelが32バイトづつ増やしているのは、AVXとかベクトル化の単位に合わせている
可能性が高いと思う。

458 :
誰かいまっくすでフォートランのコマンド自動補完する方法しらんかいの?

459 :
みんな Stallman のデブが嫌いだからな
それにスクリーンエディターに頼るのは甘え


俺は甘えん坊だがw

460 :
甘いと言うより古いな

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

462 :
>>459
みんななに使ってるのかな?

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

464 :
>>463
状況の追加です.
出力されないファイルについて,計算がすべて終了した場合には
出力されていることがわかりました.
cpuプログラムでは途中で計算を終了しても出力されます.
これについて,cudaプログラムでは計算が終了しないと書き出しファイルの内容が
保存されないというようなことはあるのでしょうか.

465 :
>>428ですが、解決しました。
CHARACTER*120という部分だけを変えていて、FORMAT文まで変えていなかったりときちんとすべて変えていなかったのが原因でした。
そこここにローカルな記述方法が多く困りましたが、とても助かりました。ありがとうございました。

466 :
みんなずっこけるよ…

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

468 :
あるプログラムの一部を修正している途中なのですが、触っていないところでエラーが起きるようになり、困っています。
build自体は問題がなくて、build後のプログラムを実行すると以下のエラーメッセージが出て止まります
illegal character in numeric input
read(unit=1,...)
修正前のプログラムでは滞りなく回るのですが修正中のプログラムでは回らなくなっています。
触っていないところなのでどこから手をつけて良いかわかりません。

469 :
>>468に追記です。
修正前のプログラムは
absoft fortran 9.0(windows7)
修正後のプログラムは
absoft fortran11.0(windows8)で作られています
修正前のバージョンに自信がないですが、バージョンが異なるのは確かです
もともと、修正後のプログラムはビルドできるのに、そのプログラムをwindws7、9.0のパソコンでビルドしようとするとなぜかビルドできないという状況です
そこがエラーを起こす原因なのかもしれません
プログラムが止まるところはインプットファイル中にある、ある数を0にしておけば回るようになり、0じゃなくて数を与えるとエラーを吐きます。

470 :
おおかた、全角文字でも入っているのだろう。

471 :
>>470
どうすればそこを見つけられるのでしょうか

472 :
>>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 :
もともとのファイルは9.0でビルドすると正しく動くということ?
環境を変えるときコンパイラが生成したものを運んだりしてないか
ある数が0の時回るとあるけど、その変数周りを調べていくしかないと思う
なんの数字か知らないが、例えばその数が読み込むデータの数を表してて、その数字と実際のデータ数があってない
そして型の合わない次のデータを読もうとしてとまるとか

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

475 :
>>474
入力はこの5つの数字だけ?
それぞれのでーたに対して個別に入力があったりしないの

476 :
>>474
この記事関係ではない?
Http://jp.i-planet.me

477 :
>>476
すみませんよく意味がわかりません
>>476
拝見しましたが違うような気がします。
11でビルドしたらうまくいかないものを9.0でビルドすればうまくいくようになりました。11と9の間でうまくいかないものがあるようです。
11でビルドは諦めてビルドだけ9が良いのかもしれません
なぜか今まで使えていた9がinvalid licenseと突然出るようになってビルドが今はできないので、まずはそこをなんとかしなければなりませんが…。

478 :
cuda fortranについて初歩的な質問なのですが、
PGI workstationで、-cublasとオプションを付けてコンパイルしようとすると、
『fatal error LNK1104: cannnot open file 'libcublas.lib'』とエラーが出てしまいます。
この場合、どうしたら良いですかね?
どなたか教えてくださると助かります。

479 :
>>478
パスが通ってないんだろ
そのエラーにあるファイルがあるか探す
ファイルがあるパスをLオプションで追加でとりあえず通るはず
例えば-L/usr/local/cuda/lib -cublas

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

481 :
>>480
試しにcublasをcublasemuに変えてみて
libcublas.libがなかったのならもしかしてパスはすでに通っていたかもしれません

482 :
コード中の'cublas'を'cublasemu'に変更し、
'-lcublas'を'-lcublasemu'に変更してコンパイルしたところ、
『unable to open MODULE file cublasemu.mod
compilation aborted』
と出てしまいました。。。

483 :
>>482
コードは元のままでいいです
申し訳ない

484 :
>>483
元のコードでやってもやはり出てしまいますね。

485 :
>>484
use cublasemuになっていませんか?

486 :
>>485
いえ、ちゃんとuse cublasってなっています。

487 :
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 :
>>487
-Lパスでディレクトリを指定して、-cublasemuをつけてコンパイルしたところ、
"libcublasemu.lib : error lnk2019: unresolved external symbol referenced in function"
が、ものすごい数のが出てきたのですが、どうしたらいいですかね?
一個ずつ-lで追加していくしか無いのでしょうか。

489 :
cublas使わなければ普通に動くの?

490 :
>>489
はい。cublasが関わるところを全てコメントアウトしたところ、動きました。

491 :
>>490
可能な限り少しずつコメントアウトを外していき
その都度コンパイルが通るようにオプションを調整してみてください
最初はuse cublasだけなど
大量のエラーが少しずつ出ることを期待します
cublasは呼び出し方法が旧いものや新しいもので3種あるようですが
呼び出し方と CUDA toolkit のバージョン指定はあっていますか?
pgi cuda Fortranはデバッグ用にGPUを使わないエミュレートモードが用意されています
コンパイルオプションとリンクするライブラリの両方で切替えるようです
どちらを使用していますか?
cublasemuはエミュレートモード用で
オプションに-Mcuda=emuを併せて指定します

492 :
Cのatoiとかatofのように,文字列としての数字の列を
integerなりrealの値に変換してくれる函数はあるでしょうか。
当方は,MinGWのgfortran95を使っています。

493 :
>>492
内部ファイルを使うのがセオリー
NAG Fortran入門 19.5 数値と文字の変換を行う方法
ttp://www.nag-j.co.jp/fortran/FI_18.html#ConvertingBetweenNumbersAndStrings

494 :
>492
ありがとうございます。
こういう裏ワザがあったのですね。
さっそく使わせていただきます。

495 :
裏ワザというかFORTRAN77の頃からあったし、
66時代にはENCODE/DECODE関数が用意されていたんだがな。
マニュアルをよく読めば、内部ファイルの項目が昔から書いてある。

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

497 :
はろけくも来つるものかなフォートラン
あっ季語がない

498 :
Gfortran 使ってるんだが、データを読み込ませる際、2行ごとにデータを読み込ませることって可能?

499 :
素直に全部読みなさい
変数に入った値は、必ず使えとも使うなとも言われてないだろう

500 :
まぁ空のread文で1行飛ばせるけどな。
Fortmatの/でも行けたっけかな?曖昧みー

501 :
awkなりsedなりで一行飛ばしの中間ファイル作って、それをデータファイルにするとかじゃだめなの?
入力関係でつまづくなら、fortranにあわせたファイルを作成する方が早いのではと思ってしまう。
バイナリデータだとテキストみたいにいかないのか。バイナリデータだったらごめん。

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

503 :
詰めないと使いにくくない?
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 :
>>500の言うとおり、formatを'(i,5/)'とかにすれば良いのでは?

505 :
>>504
あっ、もしかして>>502のやり方って途中空白行入ってることになるのかな???
>>504
それについて少し調べる必要があるかも。
具体的にどゆこと?

506 :
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 :
>>506
おお!スラがスキップすると言う指示内容なんですね。

508 :
>>507
んだ。
writeの時は出力1行改行、readのときも入力改行で結局1行読み飛ばすことになる。

509 :
久しぶりにfortranのプログラム見たが、FORTRAN77の時代と違って気持ち悪い。
これならC++の方がまだいい。テンプレート関係を除けば。
でも、fortranは4倍精度計算ができるからなあ。
並列処理やGPGPUに対応したライブラリも出ているし。
まあ、年寄はfortranからMatlabに移行しているみたいだが。

510 :
おじいちゃん。
あんま結論を急がない方がいい。
配列演算気持ちいい。PUREでELEMENTALなら最高。
4倍精度は精度は4倍だが計算時間は10倍超だから、
10倍の時間の合間にアルゴリズム見直した方が吉。

511 :
gccにもquadmathがあるんだからあまりFORTRANを高く評価しない方がいいよ

512 :
並列計算させてdoループの中でwrite文でファイル書き込みしたら中身の順番めちゃくちゃで泣きました。
どーにもなんないんですかね?

513 :
>>511
そもそもlibquadmathはFortranのために追加されたんだが

514 :
>>512
write文だけ逐次処理させるか、ループの外に出すしかないと思う。

515 :
>>510
はぁ。。。
配列演算気持ちいい、って何? それ。
C**なら行列演算クラスライブラリ作って、演算子オーバーロード使えば終わりじゃん。
まさか、行列積が「・」でできると言うんじゃないだろな?
>4倍精度は精度は4倍だが計算時間は10倍超だから、
>10倍の時間の合間にアルゴリズム見直した方が吉。
何言ってんだ?この馬鹿。
物理計算によっては4倍精度の計算が必要なの。計算時間やアルゴリズム
の問題じゃない。人の言ってることをそのまま受け売りするな。阿呆

516 :
>>515
C** → C++

517 :
懐かしい単語を見かけたからって
いい大人が質問スレに何しに来てんだろね
それとも>>509は質問なのか?

518 :
libquadmathの中を覗いてみたら、x86版はFPU使ってるけどx64版はSSE2使ってるな

519 :
ポインタが表に出ない(もちろん POINTER は除く)、
配列長と次元が暗黙的に持てることは評価できると思うんよ
matlab/octave に勝るかというと微妙だけど(移植性くらい?
>>512
ソースコード> このループは順番ぐちゃっても大丈夫です
処理系> なら並列実行しても同じだよね!
という発想なので、そういう副作用も考慮しなきゃダメ
>>518
確か x86_64 は SSE の存在を仮定していいはず
まぁ x86 も SSE/AVX も quad precision floating-point の直接演算は無い

520 :
> 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 :
クラスライブラリで演算子オーバーロードって・・・遅そう。
素人が書いたマクロじゃ最適化効かないでしょ。
ソースの見かけで書けたって意味ないの。
大体、高速行列演算ライブラリを自分で作れるくらいなら、四倍精度のライブラリ
も自作すればいい。昔の爺さん世代はよく倍精度・四倍精度自作ライブラリを自慢していたw

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

522 :
>>514>>519
なるほど、順番がどうなっても良いような時にしか使っちゃいけないポイですね。
どういった場面で並列化使えるのかな…
自分はある物理の数値計算に使ってるんだけども、順番が変わったらダメ。
それにしてもここにいる住人は凄い人が多くて、泣ける

523 :
並列化は普通に物理の数値計算につかうけど、、、

524 :
>>521
あ、そう。matlabみたいに糞な「:」が好きなのね。もういいから、死んでね
お爺ちゃんからこんな言葉を言われたお前はすでに終わっている。
>>521
その通り。面倒くさかったから書かなかったけど。
とにかく、一時オブジェクトの生成と.消滅、データのコピーが頻繁におきる。
それを避けるために右辺値参照が使えるかどうか。でも行列乗算や線形連立代数方程式
を解く場合には使えないかも。まだ、やってみてないからわからんが。
作業用行列のポインタ値を管理するグローバルオブジェクトを使うと
上の問題は回避できるが、残念ながらマルチスレッドには対応できてない。
これをどのようにグローバルスレッド対応にしたらいいか、戦略が
立たない状態です。

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

526 :
>>523
いや、そうでしょうけど、出力の順番とか気にする場合が私の研究分野だとほとんどなので…
なにか勉強になるものがあればいいのですが

527 :
David BaileyがFortran用とC++用の4倍、8倍、多倍精度ルーチン公開してた気がする。
http://crd-legacy.lbl.gov/~dhbailey/

528 :
間違えた
グローバルスレッド対応→スレッド対応

529 :
>>526
プロセス(OpenMPならスレッド)ごとに別ファイルに出力して、
後で適当なスクリプトでマージするとか。
でも普通はそんなことしないで、>>514 が書いてるように、
doループを計算部と出力部の2つのループに分けて、
計算部のみ並列化して出力部分は逐次処理だと思う。

530 :
はいはいソーデスネーでっかい一時領域作ってなにしてんでしょーねorz
pure で elemental とゆーと配列を引数に放り込むとその全要素に
関数定義された処理が適用される、各処理は独立なのでまとめるなり
並列化なりをコンパイラーに期待、かな。演算子全然関係ないしorz
過去のシサンガーとかもう辛いだけ。
どこまでも未来に生きてください、Fortran スレになんか戻らないでください。
>>522
出力の順序だけ重要ならバッファして後から並べ替えるとか
浮動小数点演算的に結果を変えられないなら仕方ないかもだが
だって人口少ないし交流少ないし機会もないし意味すらないかもしれない、
たまに発言すれば馬鹿にされるから凄い人しか残らないわけで。

531 :
>>519
それは分かる
でもエミュレーションしたら1/10程度じゃ済まないだろうから一応ハードウェアが
有効に働いてるんだな
double-double演算でもないみたいだし
>>527
面白そうだね
4倍精度が必要になるのは例えば反復法などの収束を加速する時などで、
単なる倍精度だと桁落ちのために誤差が生じてなかなか収束しない時に
有効だったりするね

532 :
Fortranの強みは常に時代の最先端ハードウェアに対応していることじゃないかな。
最近でもIntelはDECのFortran買ったし、NvidiaはPGIを買収したし。
両社ともGPUアクセレレータを含む自分らの最新ハードとセットで、
同じタイミングで対応したコンパイラを出してきている。
本来ハードウェアとソフトウェアは表裏一体、精神と肉体のような
不可分の関係にあるはず。そしてFortranは未だその密接さを保っている。
ソフトウェアの人たちは、ソフトウェア単体での独立価値を信じたいようだけど
現実は違っている。
この現実認識の歪が過剰なFortranディスカウントキャンペーンとして噴出して
いるのではないだろうか・・・と新聞並に論理を飛躍させて終わるw

533 :
>>530
そういうのに向かない計算アルゴリズム(隣のセルの計算結果を使う。つまり独立ではない。
そうなると同期の問題も発生する)もあるんだ。
>過去のシサンガーとかもう辛いだけ。
>どこまでも未来に生きてください、Fortran スレになんか戻らないでください。
で、お前何が言いたいんや?日本語大丈夫か?

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

535 :
つかぬことをお聞きしますが
皆さんのfortranの本の勉強履歴はどんな流れですか?
私は冨田さんfortran90の本→辞書的にfortran90入門をかいつまむぐらいしか
やっておらずとりあえず拙いなりに読み書きはするのですが
なにか良い本あればおしえていただけないでしょうか

536 :
故岡村先生の授業テキスト
やーっふぉ、やっふぉ、ふぉーとらんらんらん

537 :
Fortran95/2003 Explained --> Modern Fortran Explained

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

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

540 :
>>539
よく分からないけど、正常に動くなら9.0のままじゃ駄目なの?
出力するときフォーマットは指定してる?
してるなら*で指定なしにしてみたら

541 :
>>540
formatを指定しています。そこを当たってみる事にします
9.0のままで良いのですが、引き継ぐものなので後の人のために11.0で動くよう乗り越えておきたいんです。

542 :
Gfortran で定義してない変数があってもたまにエラーはかない時あって焦った。
デバッグで小一時間汗流したわ。
gfortranってたまにアホな子になるの?

543 :
>>537
>>537
ありがとうございます
まだ私が理解できるレベルにないかもですがいつか読んでみたいと思います

544 :
>>539
出ているエラーメッセージは、入力ファイルの問題で、数字の代わりに
(たぶん)文字が来ているということ。
F77時代(かそれ以前)のプログラムの用だから、入力ファイルの数値の
フォーマットも指定されていると推測される。数値が指定カラムから
はみ出していないか見て味噌。
以前
  300 400 200 0 0
これで右から2番目でおかしくなると言っていたが、たぶん4カラムづつ
入力にとってある。300 400 200 000 000 ならたぶん動くだろう。
今は 0 0 を読んで、数値Formatがおかしいと文句を言われているのだと思う。

545 :
ではなぜ 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 :
>>539
>>544,544 に加えてOPEN文のBLANK=も確認するといいかも。
手元の言語仕様のドラフト板ではFORTRAN77/90/95/2003共に
NULLがデフォルトになっているけれど。
それとabsoft9.0と11.0とでコンパイルオプションが違うというオチはない?
コンパイラは上記の様なデフォルトの解釈を変更するオプションを持っていたりするよ。
そのオプションが使われていた場合、ソースをいくら読んでも原因はそこにはないから注意ね。

547 :
FORTRAN77のCOMMON文とEQUIVALENCE文について質問です.
!---
DIMENSION A(4)
EQUIVALENCE (A, V1)
COMMON /VS/ V1, V2, V3, V4
のようなコードをfortran90風に書き直したいのですがAをCOMMONブロックの変数で置換する以外にいい方法は無いでしょうか?
できればSubroutine等を増やすのではなく,Moduleの変数宣言部分だけで解決したいのですが...

548 :
>> 546
↓使えるかな
http://www.nag-j.co.jp/fortran/FI_16.html
16.1.2 モジュール内の名前を別の名前で参照する方法

549 :
>>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 :
>>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 :
修正ミスwww
>ばらばらの番地いる変数を個々にFortranにはポインタの配列はない。
ばらばらの番地いる変数を個々に、ポインタの配列の要素に結び付けようにも、
Fortranにはポインタの配列はない。

552 :
ちょいと手間だがこれじゃダメかい
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 :
>>550
大変詳細な解説ありがとうございます
てっきりEQUIVALENCEは廃止予定事項だと思い込んでましたが便利ですね
>>552の書き方でいこうと思います
equivacenle(A, V1)
でも -chack all -warn allでエラーは出ませんでしたが実行時にメモリ破壊起こるのかな

554 :
>>546,>>546,>>546ありがとうございます。
入力データの書式を指定する部分がを見た事がないのでそこを探してみます。ありがとうございます。

555 :
>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 :
555

557 :
>>556
ダミアンもどき

558 :
質問です
長さが7 22 14 9 20cm ノ棒がある 子の5本から3本を選んで三角形を作りたい 三角形を作成可能な組み合わせと素の免責を表として出力するプログラムをつくりたい。
教えてください

559 :
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 :
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 :
一応作ったのですが、できません。お願いします

562 :
サブルーチンの内部ではうまく計算されているのに、
メインでwriteするとよくわからない大きな数値になってしまっているのですが、
なにか解決のヒントないでしょうか?
断片的で申し訳ありません

563 :
すいません自己解決しました
配列宣言の量が少なかったボンミスです
allocatable使わないとこういうことになるんでしょうか
お騒がせしました

564 :
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 :
FORTRANで書かれたBLAS/LAPACKをライブラリとして呼び出しているLLが
FORTRANと同等のスピードが出ることを大々的に喧伝すると、
それに釣られて、もうFORTRANは要らないのだ!とか言い出す人が、
情強を誇るネットの有名人にも多いので草不可避w

566 :
>>554の問題は解決したのかいな?

567 :
バイナリ出力をするときにOPEN文に指定する
form='binary'はFortranの標準ではなく、独自拡張みたいですが、
標準のコーディングだけで'binary'と完全に等価なバイナリ出力をする方法はありますか?
form='unformatted'を指定すると、write文を書くたびに
データの最初と最後に4バイトのレコード長がつき、
form='binary'を指定すると前後4バイトがつかないみたいです。

568 :
Fortran2003以降ならストリームが使える
http://www.nag-j.co.jp/fortran/fortran2003/Fortran2003_7_1.html#AUTOTOC_7_1

569 :
>>568
ありがとうございます。
試してみます。

570 :
directファイルを使うテクニックもある。
確実ではないが、大抵の処理系では、バイトまたはワード単位でべた書き
しているので、binaryの代わりに使える。
バイトかワードかは処理系によるが、コンパイラのオプションでどっちにも
できることが多い。
まぁ今の時代は素直に stream だろうが。

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

572 :
>>566
あれから見てみましたがどうも解決しません。
メモ帳に保存しておき、f77,f90.95形式などで保存しなおしてbuildをしてみましたが変わらず。

573 :
構造型にSave属性つけられないんですけど
構造型をModuleに入れてグローバル変数として使いまわすのは危険(未定義になる可能性があるん)でしょうか
あとFortranの質問じゃないかもしれませんが
Intel MKLのBLAS/Lapack95はpure procedureであるとInterface定義に明記されてるけど
BLAS/Lapack77はPureなんでしょうか

574 :
↑すみません 多分自己解決しました
構造体の定義のあと変数宣言したものにはsave属性つけられますね(定義しかしてなかった)
BLAS77は間違った引数渡すと標準出力(か標準エラー出力)になんか表示されるのでpureじゃないってことでしょうかね

575 :
>>574
そもそもFORTRAN77には言語仕様上pureは存在しない。
Lapack95はFortran95以降のプログラムからLAPACKのprocedureを
利用し易くするためのラッパーライブラリに過ぎない。

576 :
(コンパイル済みの)外部サブルーチンが真にpureかどうかは開発者/提供者の責任かと
例外処理は pure 要件から外していいと判断し、
pure と明記しておくことで最適化を妨げないようにしたのだろう

577 :
Fortranの組み込みサブルーチンで、乱数がサブルーチンで関数になっていないから
他言語に比べて使いにくいなと思っていたが、FORTRAN は PURE じゃないものは
関数にしない方針で一貫していて、乱数はPURE(参照透明)じゃないから
関数にしなかったんだと分かって、なんか納得した。時刻サブルーチンとかも。

最近関数型、関数型うるさいけど、他言語は意外にその辺一貫してないよな。
まぁFORTRANの場合、依存性があると最適化の邪魔になるから、
依存性を嫌っているだけだけどw 結果的にはより徹底している。

578 :
マットラボてどうなん?フォートランと比べて何か秀でた点ある?

579 :
そんなん解決したい問題,実装したい理論によりけりやろ
まあ計算規模が小さくて使いたいライブラリがMATLABにあるならそっち使ったほうが幸せになれるぞきっと

580 :
>>579
ま、それもそうだよな。
グラフのフィッティングソフトでいいのなかったので悩んでた。
無償でいいのないもんかねぇ。
Fittkだかもあんま美味だし…

581 :
MINUIT使えば

582 :
MATLABって個人使用なら五千円に値下げになってなかったけ?

583 :
>>581
ググってもなかなか情報ないんだね。
でもfortrN で書かれたパケなんですね!
これは貴重な情報です、ありがとうです!

584 :
興味でお聞きしたいのですがfortranで株の発注のようなことはできたりしませんか?
例えば証券ホームページににログインし発注操作するなど・・
そういう言語じゃないのかもしれませんが・・

585 :
fortranからC言語の関数呼び出せるので...
それじゃ邪道ですかw
まあHFTも金勘定も数値計算だしいいんじゃないでしょうかね

586 :
そう言えば、Fortranって少数第n位以下を切り捨てみたいな関数ないんだね…
Excelで言うrounddownみたいなやつ。
今、ファイル書き出すのに一々四捨五入されちまって困りマクリングでつ、はい(´・_・`)

587 :
>>586
簡単だし自作したら良いじゃない?

588 :
>>585
ありがとうございます
なるほど他の言語を読み出せばいけそうなんですね
今後やってみたいです

589 :
>>587
やはり自作しかないのね…
てかラウンドダウン程の関数が無い事に驚きだお
どっかでパッケージモジュールとして保管出来るようにするかね

590 :
そんなに端数が気になるならもうひと桁増やして丸めればよかろうに

591 :
むしろ、簡単に実装できるのにわざわざ関数がある言語のが珍しいかと

592 :
>>590
0.4999999999を小数点以下3桁で切り捨て表示するために4桁で文字列化しても内部処理が丸めだと0.500になってしまうかもしれんぞ
素直に1000倍して切り捨てて1000で割るがよろしい

593 :
>>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 :
昼休みに調べたら rd ru の類はF2003だった。
あと rp processor dependent という処理系依存型もあるようだ。
あとOPEN文で指定する方法もある。
しかし、正直いって>>586の基本的発想が間違っている。
他の人達のアドバイスにあるように、そもそも内部二進表現を十進表現に
直すときに丸めなどが入ってしまう。そのうえでさらに十進表現を
丸めようとするのが Fortran 的センスではおかしい。
だからみんな当惑した反応しか返さない。
とはいえ自然科学ではない商習慣等での丸め等もあるようだから
別にそれがいけないわけでなく、それに合った言語例えば
BCD演算できるCOBOLなどで計算すべきのみ。

595 :
2015出たんだね

596 :
Fortran コンパイラメーカ
Intel PGI Pathscale   (Intel NVidia AMD/ATI) アクセレレータ御三家
Absoft NAG          独自色 
Lahey/Fujitsu Silverfrost  斜陽族
GFortran g95        GNU Free系
こんなとこか? 

597 :
Free系にOpen64と(一応)dragoneggがあるぞ
dragoneggはgcc4.8.3以降はサポートしてないしflangは開発止まってるし
この辺が活発化すれば若い人がたくさん来ると思うんだけどな

598 :
GNUでFortranやAdaが熱心にサポートされているのは、米国防総省あたりからの
金が流れているからなのかな?
意識高いw進歩的wCS学科若年層には人気は全くないのに。
それともおっさん層しかやってないからなのか?
そのわりにGNU COBOLとかPL/IとかALGOL、PASCAL、Modula-2とかやらないし。

599 :
>>593
でもfortran95でしょ、ほとんどサポしてるのは

600 :
Cray, IBM, PGI, Intel が F2003 完全対応したな。
NAGはあと一歩。
GFortranは進捗どうですか?
スパコンだと SXは90 Hitachiも90? Fujitsuは95? 
それぞれつまみ食い的に拡張してあるが。

601 :
日立のはコンパイルオプション-hf95で問題なく使えてたがあれ完全準拠じゃなかったのかな
まあ完全準拠だったらわざわざfortran90コンパイラとは名乗らないか

602 :
そういや、fortranのデータの取り扱い方について詳しくかいせつしてる本てあまりないね。

603 :
fortranのデータってなんじゃい?ファイルのことか?

604 :
>>602
format read writeのことなら、コンパイラーの取扱説明書が(独自仕様拡張部分も含めて)もっとも詳しいよね。

605 :
intel fortranはIMSLも非商用は無償にしてくれないかな・・

606 :
IMSLは会社が違うから無理だべ。
IntelはCPU売るためにソフトのコンパイラを撒き餌としてばら撒いてもペイするが、
IMSLの方としては特に得しないし。
富士通がLaheyにOEM供給した時にコンパイラにSSL2とかただでバンドルしていたが。
NECがASLをちょー高値で売っていたことを考えれば、ちょー太っ腹だった。
それはそうと日本の大学の大型計算機センターにたまっていたライブラリも、
NETLIBみたいにネットに公開して吐き出せばいいのに。

607 :
>>604
Gfortran なんやけど…(´・_・`)
もうやめようかな。
Gfortran で書いたプログラムをIntel fortran でもコンパイルすること出来ますか?

608 :
GForce思い出したわ

609 :
>>539ですが、いまだに解決しません。
>>544の「数値が指定カラムからはみだしてないか」という意味がよくわかりません。
指定カラムというのはどこで見ることができるのでしょうか。
9.0と11.0ではビルドのUIが大きく変わっており、ビルドの条件が同じなのかどうか自信がありませんが、ほぼデフォルト状態でビルドしています。

610 :
>>609
当該 READ 文の FORMAT 文を見ると分かる。
たぶん昔のプログラムだから READ(99, 1000) N,B,C... みたいになっているだろう。
その場合行番号付で 1000 FORMAT(1H , 云々) となっている FORMAT文を見ればいい。
その行と引用しているREAD文を2chにコピペすればいい。
どの行かわからんというならDEBUGオプションでtracebackをオンにしてやれば
エラーで死んだところで行番号が出るはず。

611 :
Fortranってどの程度配列メモリに記憶出来てるのかな?
例えば
do i = 1, 100
Read(20,*) (a(i,j),j=1,20
End do
で write(*,*) a(99,15)とかどこまで記憶出来てるもんなんやろ?

612 :
eclipseである程度長いサブルーチンも何十個か呼び出しているプログラムで
call systemが通らくなるのですがなにか原因ありますか?
ブラウザソフト立ち上げながらでもダメだったのでメモリがらみと思うのですが

ざっくりしすぎですいませんがなにかヒントあればおねがいします・・

613 :
>>611
質問の意味が分からんよ???
Fortranじゃ宣言分はがっつり確保されとるよ。
>>612
タスクマネージャーとか ps コマンドとかでメモリーの使用状況を見てみたら?
call system が通らないのはメモリー満杯くさい。

614 :
>>613
ありがとうございました
ps alxで見るとrssがまさに満杯でいっぱいのようでした
cat /proc/meminfoで見るとフリーが10Gぐらい残っていて
大丈夫と思っていたのですが違いが分かっておらず
違いを勉強しようと思います
もしご存知でしたらまた教えていただけると幸いです

615 :
>>613
そうなの?

616 :
>>614
http://tweeeety.hateblo.jp/entry/20140130/1391054452
色々まとめてあるみたい。

617 :
>>616
ありがとうございます。べんきょうになりました。
メモリ節約のために可能な限りallocatableに変更したら余裕ができて解決しました。
個人利用のプログラムには必要ないと思っていましたが大事でした
ありがとうございました

618 :
配列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 :
配列は要素を指定すればスカラーになるだろ

620 :
>>618
次元を指定すればおk。1次元でもあえて1を指定すればスカラーで返してくれる。
do i = 1, maxloc(a, 1)
1要素配列を返す奴らに使える、基本的なテクニックですぞい。
改行要らなければ
write(20,*) a(:maxloc(a, 1))
で1行で済む。

621 :
>>620
いやぁ助かります。
ここは参考書に載ってないテクを知ってる方がたくさんいるからやめられない…
このようなテクって自分で見出すもの?それとも何か参考書みたいのってあるのですか?
あと、科学数値計算やってる方に聞きたいのですが、最適な刻み幅ってどう決定してますか?
対数刻みやらなんやらありますが、結局自己流やらなんやらでしっくりしたものに出会えず時間を無駄にしてる感たっぷりなんです

622 :
>>621
maxloc とかに dim 引数が入ったのは F95 以降で、
F90 時代は要素1個の配列を返されて誰もが窮していた。
Numerical Recipes の F90 版では、SUM(MAXLOC(a)) みたいな形でこの問題を
避けていたが、俺的にはこれは無いなって感じだった。(元々あんまいい本じゃなかったし)
仕方ないから律儀に要素1個の配列を宣言して使っていて、もう解決策はないと諦めていた。
なので f95 が出てからも、この方法に全く気付かずにいた。
ある日、他人のソース眺めていて、1次元配列なのに maxloc の類で dim
引数指定していたのがあって、こいつ馬鹿じゃねーのwwwと思ってよく見たら
このスカラー返しのテクニックだった。馬鹿なのは私でした。
たぶん10年以上無駄な1要素配列のプログラム書いていたwww

623 :
誰か>>618>>620の解説をしてもらえないでしょうか
まったく意味がわからない

624 :
>>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 :
>>624
1次元配列の特定の1つの値を返すのに、それは1次元の1要素の「配列」として返されるからdo文では使えないということですね。それが配列の次元(dimension)を1と言うと解決するあたりがしっくりきませんね・・・。

626 :
>>625
多次元配列を maxloc に渡すと、最大値の座標を (/ 1, 2, 3 /) みたいな感じで
一次元配列で返す。 この成分を取り出すのが dim 引数。
1要素配列でも成分取り出せる。
まぁしっくりくるまで文法書を舐めるように読んでくれprpr

627 :
x(100)があるとして、計算しているのになぜか例えばx(40)から値が0になってしまいます
考えられる原因ないでしょうか
無茶ぶりですいません

628 :
さすがに無理
もう少しヒントをくれ玉へ

629 :
>>627
日本語になってない。
逝ってよし

630 :
今時逝ってよしとかねえよ

631 :
>>628-629
ありがとうございます
確かにひどかったです・・すいません
ただ、症状がなんとも表現できていないので
もう少しうまく表現できるよう考えてみようと思います

632 :
>>630
そんなこと言ったら今時fortran なんかねーよと言われるぞ。
そんなことないだろ?つまり逝ってよしもそんなことないのだ。

633 :
>>631
xが途中で変わってしまうなら
xの代入文や計算式が間違ってないか探す(特に範囲指定)
途中で変数を書き出し、変数の変化を追う
デバッガを使って変数に代入されるタイミングを調べる
くらいしか思い付かない
実は0になる計算をしていたなんてことはないよね

634 :
まぁ大方書き込んだつもりになっているが、ループが39までしか回ってないという
パターンだろう。
初期値に1e38とかNaNとか書いておけばいい。

635 :
>逝ってよし
逝ってよし ってフレーズ最後に見たの何年前だろう?10年くらい前?
ちょっとクスッと来てしまった。
悪くないよ〜

636 :
>>633
>>634
ありがとうございました
基本的なミスだろう、というご教示を参考に見なおしたところ解決しました
x(40)以降を計算するのに地味にyを使っていたのですが、
yを計算するサブルーチンをcallする前にxを計算するサブルーチンをcallしてしまっていただけでした・・
ズコーって感じかもしれませんが私としてはレスいただき大変助かりました

637 :
gfortranで
call system(cd ..)
とやっても上のディレクトリに移動できません。
他のコマンドは動くのですが…
これは仕様なのでしょうか?

638 :
>>637
systemからのcd実行なら仕様。
別のshellが起動してcdを実行して処理を終了するので、呼び出しもとのshellとは無関係。
GNUならディレクトリを変更したい場合はCHDIRが使える。

639 :
>>638
ありがとうございます。
if文でCHDIRに置き換えれば良さそうですね。
仕組みもわかりました。

640 :
とか言って失敗しましたw CHDIRをつかうとshからpremission deniedと怒られます。
if (IPTCMD(1:3).eq.'cd ') then
DSTDIR=IPTCMD(4:)
call CHDIR(DSTDIR)
end if
のようなコードです。SELinuxのせいかと思いましたが違いました。
ご教示いただければ幸いです。

641 :
追加すると、cdコマンドは成功しています。でも、
sh: 1: ..: Permission denied
と怒られますw

642 :
素朴な疑問なんですが
write( *,101) n
write(10,101) n
こういう式って一行にまとめられないんですか

643 :
>>642
write ... ; write ,,,

644 :
言い換えます
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 :
10,11だと外部ファイルか
それだと複数の装置番号に同時に出力する方法はない(0以上のスカラーでなければならない)
変数をまとめたいなら配列nにa-zを代入すればできる

646 :
>>644
出力するユニットが同じならサブルーチンでまとめれば良いんじゃない?

647 :
fortranからRを呼び出すようなことはできないでしょうか?
system call?からRを呼び出すぐらいしかないでしょうかね?

648 :
gnuplotでもそうだが
Rのソースをfortranで生成するようにして
system callから実行させればいいだろ

649 :
>>644
こんなのかな
iu(1:3) = (/6,10,11/)
do i=1,size(iu);
write(iu(i),101) ...
enddo

650 :
考えてみれば四行に増えたなwwwwwww

651 :
たしか coarray を使うとプロセスが複数走って、それぞれのプロセスで
別々にI/Oできるから形式上は1行でできるぞ。
まぁこれがやりたいことではないのは重々承知だがwww

652 :
>>648
サンクスです
ライブラリみたいのはないのかもしれませんね

653 :
配列内の最大最小を、区間指定でできませんか?
maxだとできなかったんですが

654 :
区間指定ってなんだよw 
maxlocのことか?それともmaxval(a(20:20))のことか?
他人に理解できる表現で頼むぜw

655 :
>>653
部分配列に代入して、maxを使うという意味?

656 :
>615
亀レスですが、最適な刻み幅については、
森口繁一『数値計算術』に
「題4章 刻み幅の自動調節」
という記述があります。
ご参考までに

657 :
>>654
>>655
a(1:20)があったとして、10から20の間だけのaのmaxという意味で書きました
わかりづらくてすいません

658 :
>>656
ありがとうございますm(__)m
さっそく買わせて頂きました。
まだ手元に届いてないですが、その章は結構ページ割かれてますか?

659 :
ならば MAXVAL(a(10:20)) だ。

660 :
>658
p.195〜206
なおプログラムはpascalで書かれています

661 :
>>659
できました!ありがとうございました

662 :
>>661
お安い御用さ。
おじさんに何でも聞いて呉れ玉へ!
>>658
ぼうず。
積分の自動刻み幅調節なら森正武の本に載ってるのがあるぞ。
岩波の77本にプログラムもある。

663 :
>>660
ありがとうございますm(__)m
>>662
有益な情報ありがとうございますm(__)m
お叱りを受けるかも知れませんが、指数関数が入った数値計算で手を焼いております
具体的には
exp(x)/(exp(x)-1)
といった関数を考え, 1から20000くらいまでの数値を出力したいのですが, 桁落ちしてNan やら Inf やら出て困っております.
定石としてはx を何かに規格化するのかな?とは思うのですが, x の範囲が1から20000と幅広くなかなか思いつきません.
何か妙案はございますでしょうか?

664 :
>>663
xが大きい方で計算したいなら通分して 1/(1-exp(-x)) の形で計算するのが定石だが、
どっちにしろ x=20〜30くらいでもう 1/1=1 でその先は無理に計算しなくてもいい。

この辺は数値計算術にいっぱい書いてある。
森口繁一の本は古いけど結構面白い。
数値計算術〜計算数学夜話<<数値計算工学の感じで真面目になる。
それにつけても蔵王のお釜が白濁液まみれというニュースが興味深いよね。

665 :
Fortran で realloc に相当することをやりたんだけど、どうしたらいいでしょうぁ。

666 :
>>665
宣言でallocatable
使う前にallocateで割り当て
大きさ変える前にdeallocateしてallocateで再割り当て
中身を確実に保存したかったらdeallocate前に別の変数にコピー
これで一応配列の大きさを変えれる

667 :
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 :
ちょっとスレチかもしれませんが…
無限級数の和が1になるものうち、\Sigma^{\infty}_{0} (1/2)^n よりも収束速度がゆっくりなものって何かありますか?
刻み幅に使いたいんですが中々思いつかないですm(__)m

669 :
質問がおかしいので、たぶん刻み幅っていうより問題設定が間違っている。

670 :
>>669
つまりは足し上げて1に収束するような数列を知りたいんです。
(1/2)+(1/2)^2+(1/2)^3+(1/2)^4+.....+(1/2)^n->1 ですよね?
これだと収束スピードが速すぎるので、もう少し緩めに収束する数列を知りたいんです

671 :
intel fortran compilerが、非商用版があると聞いたんですけど
ホームページに行ってもありませんでした
もう非商用版は終了したんでしょうか

672 :
>>671
ありますよ

673 :
>>672
自分の探し不足ですかね
よければURLおしえていただけませんか?

674 :
>>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 :
非商用ページにたどり着く方法, 頻繁に変わって不便だよなあ
ライセンス登録して.licファイルなりシリアルコードなり持ってるなら直接DLするって手もあるが
ttp://registrationcenter-download.intel.com/akdlm/irc_nas/4584/parallel_studio_xe_2015.tgz

676 :
>>674
>>675
無事ダウンロードできました。ご親切にありがとうございました。

677 :
amazon ec2で計算してる人いる?

678 :
>675
御呈示のアドレスはLinux版ですが、Windows版
について情報をおもちではないでしょうか

679 :
>>678
無償版ってこと?Linuxのみ無償なんだよ
よく読めよ、カス

680 :
乞食か

681 :
Linux版以外も学生非商用は無料だろ。

682 :
>>681
嘘つくなよ、ゴミ屑

683 :
2つの実測値の相関係数を出したいのですが、
fortranでできないでしょうか
実測値は単純な直線傾向ではないです
エクセルで手動でやることも考えたのですが、
実測値が100ケースほどあって、
今後も増えることを考えるとプログラムで作りたいと思いました
もしよければアドバイスいただけないでしょうか

684 :
>>683
Rを使用するのが一番手っ取り早いと思います。
Rを調べてみてあなたのやりたいことができそうなら、あえてプログラムを作る必要もないのでは。

685 :
>>684
Octave でもいいんじゃないの?

686 :
>>684,679
いろいろソフトがあるのですね。
調べて試してみようと思います。ありがとうございました。

687 :
次の非線形方程式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 :
>>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 :
      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 :
二つ目
      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 :
      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 :
      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 :
>>687
昔の参考書にあった問題でした。
ただfortran90/95に対応していませんので誰か
対応したものを挙げてくれると助かります

694 :
Fortranで書かれている遺伝的アルゴリズムのライブラリが
手に入るところはないでしょうか

695 :
ちっとはググれw
http://www.cuaerospace.com/Technology/GeneticAlgorithm.aspx

696 :
MPICH または OPENMPI で Fortran2008 bindings を使う方法を教えろ下さい。
ドキュメントにはサポートと書いてあるが、インストールしても MPI_F08.MOD が
生成されない@Ubuntu
どうか助けろ下さい。こっちのスレへ行けという指示でもおk

697 :
ランダム生成のコードのについて質問です。
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 :
試しにgfortran4.9でrandom_seed(size=i)(iはinteger)を実行したらi=12だった
つまりgfortranの場合はputの引数が大きさ12以上の1次元整数配列でなければならない
(/c*999/)は大きさ1の1次元配列で、その値がc*999という意味だからエラーになる

699 :
>>695
ありがとうございます
ググれと言いながら教えていただいた優しさに感謝します
使わせていただきます

700 :
>>698
丁寧な説明ありがとうございます。
cを配列にすると上あるシステムクロックのcountの取得のところでエラーが出てと堂々めぐりをしてましたが、シードが12の配列でも要素一つ変えれば乱数にはなるということなんですね。
スラッシュが配列を表しているとは気づきませんでした。勉強になります。

701 :
LU分解のサブルーチンが作れません(ToT)
サンプルがあったらください…

702 :
>>701
検索して、それっぽいのが出てきたんですがメインプログラムに噛ませてもうまくいきませんでした…

703 :
>>702
ならR

704 :
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 :
計算流体力学を習い初めの学生なんですが、Radeonでfortranの計算をする場合にはどのソフトをインストールすればいいのでしょうか?
MinGW Command PromptとTDM-GCC-64というのを使っています。
出来ればインストール方法が書かれたページも一緒に知りたいです。

706 :
open文で開いたcsvファイルをread(51,*)〜〜などで
読み込む操作が何回かある場合、
並列化はできたりしないでしょうか
読み書きはやっぱり並列化は無理でしょうか

707 :
『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 :
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 :
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 :
>>706
I/O中に計算とかしたいという意味での並列化なら、F2003でasynchronous I/Oが出来る
ようになった。同じファイルの別々の位置のデータを並列に読み出したいという意味なら
そもそもハードウェア的に無理だろう。
>>707
最適化の問題というより、計算型GOTOの後継機能といったものではないか?
構造化プログラミングがホットだった時代は、GOTO 文を追放するための基本構造
のひとつとされていた気がする。
CASE文の中に入るのが、整数型、文字型、論理型のように離散値をとる場合に
限られるので、IF..ELSE IFの連鎖との使い分けは、比較で=が意味を持つ型か
或いは実数型などのように=があったとしても基本的に<、>的な大小比較しか
意味を持たない場合を、意識して明示的に区別していますよというアピールではないか。

711 :
>>710
明快なお答えありがとうございます.
これまでうっすらと使い分けルールの必要性を感じながらも,
「きっとこれで良いよね?良いんだよね?」と恐る恐る使い分けていました.少し安心しました.

712 :
>>710
ありがとうございます
やりたかったことはcsvファイルがいくつかあり、
それを順番に読み込みreadするdoループを並列化できないかなということでした
教えていただいた後者の方にあたりそうな気がしまして、
勉強になりました。

713 :
永らくFORTRAN77で飯を食ってたのですが,より新しいFORTRANへ移行してみたくなりました
なにか良書はありましょうか?
職業プログラマで社内で請負で流体や構造体のメッシャーを組んでます
まあ,ベースのプログラムも77,新規も77縛りの事が多いので特に困ってはないのです
しかし,昔,汎用機世代の6しか書けないような先輩方を古臭いと笑っていたのですが自分もそんな年になってしまい
後輩らに笑われたくないので,ちょっと勉強しておきたいと考えています
世の90の初心本(それ以降は書店でも見ないなー)等は基本的な制御構文等が厚く書かれており
ホントに身に着けたい新たな概念のintent等がおざなりになってしまっています
古臭い77書きに光を......
#C++もやってるのでクラスの概念なんかも問題はありません

714 :
日本語の書籍に関しては仰る通りで、特に2003以降は全くないはず
まずはnagのサイトにあるFortran入門とFortran 2003入門が無難かと
ただ、これらは規格を網羅してるわけではないので
完全な仕様を知りたい場合はコンパイラのマニュアルや
JIS規格(JIS X 3001-1:2009)も参照する必要あり

715 :
>707
selectは単一の変数でしか使えないよ
selectはどうかするとジャンプテーブルで一発の比較で処理してくれる可能性が高い
最近のコンパイラはelseifでもそうするとか聞くけど,どうだろうね?
elseifは良く引っかかるのを前に持って来て早めに引っ掛ける事ができるとかも聞くねー
個人的には,読みやすさを優先するなー
#Cのswitchの議論と同じなので探してみると良いよ

716 :
ありがとうございます
まずはサイトのそれらを読んでみます
その後は......JISかー,読みやすさを優先してくれないからなー
コンパイラのマニュアルは殆ど英語になるのが悲しい

717 :
>713,716
Fortran90の日本語の解説本で良いなら、
 bit別冊 詳解Fortran90 1993年12月号別冊 共立出版
という本があります。これは『Fortran90 Explained』の日本語訳です。
但し、雑誌の別冊ということもあり入手は極めて困難でしょう。
あるとすれば、理工系の大学図書館が一番可能性が高いと思います。
参考までにどうぞ。

718 :
Fortranを使われている方は他にはどんな言語を扱っているのですか?
pythonとかでしょうか

719 :
>>718
perl

720 :
>>713
おいらもFORTRAN77使いなんで、小文字のプログラムに違和感ありまくり

721 :
>>720
こっちはfortran90からの新参なんで、77のソース見ると大文字、goto文ありでなかなか新鮮です。
ところでfortran2003の機能すべてカバーしてるコンパイラは商用しかないのかな。
gfortran使いなんでカナピー(´・_・`)

722 :
商用だけですな
しかし商用Fortranコンパイラは趣味で買うには高すぎるので
gfortranが対応してる範囲で書いてます

723 :
>>721
Linuxならifortのnon-commercial板、MacならFreePGIがあるけど
Windowsは無いみたいだね。

724 :
>>723
変換ミス
(誤)non-commercial板
(正)non-commercial版
gfortranの2003フルサポートは何時になるのやら。

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

726 :
>>725
>VirtualBox(個人使用は無料だったハズ) + Ubuntu日本語Remix仮想ハードディスクイメージ
>で、とりあえずLinux環境作っちゃうのも手なんかね
Fortranの勉強のためならこれが正解だと思う。わざわざLinux用の領域をハードディスク上に
確保して…というのは面倒だしね。自分も次は仮想マシンを使うと思う。
UbuntuのGUIが気に入らない場合は、VirtualBoxにインストールできるか知らないけれど、
RHELクローンやOpenSUSEもあることだし。

727 :
VirtualBoxに入れるLinuxなんて、GUI抜きで容量減らしてインストールして
sshでもっと使い易い端末エミュレーターから操作するのが普通じゃないか

728 :
>>727
もちろんそれが理想的だし、解ってりゃ大したことないんだけどね

729 :
でも最近の Linux intel fortran も windows と同じ GUI でインストールできる
ようになってるし〜 楽ちんしたいのよ〜

730 :
ifortやgfortranのオプションについて教えてください.
Makefileを書くとき,コンパイルオプションやリンクオプションをCFLAGSとLDFLAGSに分けて書くのが一般的みたいですが,
Intel Fortranコンパイラのユーザー・リファレンス・ガイドやgfortran/gccのマニュアルを読んでも,
どのオプションがコンパイルオプションで,どれがリンクオプションか明記されていませんよね?
コンパイラとリンカに与えるべきオプションは,それぞれ,どうやって見分けたら良いんでしょうか?

731 :
intel fortranの非商用版終了したっぽいな

732 :
>>731
は?
ソースは?

733 :
>>732
intelのdeveloper zoneで明言してるよ
https://software.intel.com/en-us/forums/topic/533638

734 :
>>733
ありがとうm(__)m

735 :
薄汚い乞食が多すぎたんだな

736 :
>>735
確かに研究用途で無償版使われているって書いてるな

737 :
すみません。本読んだり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 :
>>737
過去レスヨメカス

739 :
>>738
ソウイワナイデオシエロヨ

740 :
>>738
すみません。過去すれにあるのですか?
ざっとしか見てなかったので気づいてませんでした。
もう一度探してみます。

741 :
急ぎではない質問です。
当方、PGI Visual Fortran(ver.14.9)でCUDAを利用し始めまして、
手元にある他の人のプログラムからちょっとずつ勉強しているのですが、
よく"use cudafor"という一文を見かけます。
cudaforというmoduleがどこかで定義されているってことなんでしょうが、
これ、いったいどこのフォルダのどのファイルで定義されているんでしょうか?
PGIなのかnVidiaなのか、できればPC上のパスでも知りたいです。
インストールされている場所は多分デフォルト設定のはず...です。

742 :
cosやexpとかの組み込み関数が学校のifortだと通るんだけど家のgfortranだと通らない助けて
no implicit typeって言われる

743 :
>>742
その関数に渡す実引数の宣言で処理系依存の型パラメータを使っているとか?
ソースを晒せば適切な助言を受けられると思う。

744 :
4倍精度から倍精度にしたら実行できました
gcc4.6以降は4倍もサポートしてるそうなんですがおかしいですね…
ありがとうございました

745 :
>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 :
>745
>fortran 4.8.1

gfortran 4.8.1
のtypoです。しつれいしました。

747 :
>>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 :
超初心者です。質問させていただきます。
forrtl:severe(24): end-of-file during read,unit 110,file C:tkshmd\www01.dat
というエラーが出たのですがどうすれば解決できますか?

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

fortranに関する知識は一切ございません。すみません

749 :
>>748
どんな環境なのか、OSとコンパイラくらい書こうよ。
エラーメッセージによるとwww01.datの途中に
ファイルの終端を表すend-of-fileが挿入されているっぽいが。

750 :
>>748
データの読み込み中にEOFが来た
つまり、読み込む変数に対してファイルのデータ数が足りない

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

何より教授に聞けよ

751 :
>>748
736で解決すると思ったけど
フォルダアドレス名、もしかして名前の母音抜き?
違ったらごめんね
もしそうだったとしたら、今後フォルダ名の投稿の時とか気をつけてね
私、昔似たようなことやっちゃったので。

関係ないが気になったのでつい

752 :
ちょいとみなさんのお知恵拝借させてもらえたら幸い。

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

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

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

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 :
連投すんません
S(x(i),y(i),z(i))は新しい関数ですm(__)m

よろしくお願い申し上げます。

754 :
>>752
収束ループを出てから、書いたら?

755 :
求めた解はどこかで使うんでしょ?なら,使う直前にwrite文を書けばいいのではないか?

というか,
>二分法かなんか
『なんか』ってなんだ?そんなきき方でどう答えろというんだろうか?
その例の書き方だと,そもそも二分法の使い方を理解しているのかと,そっちの方が心配になる.

756 :
>>755
すまん!書き方悪かった。
「なんか」と書いたのは二分法等イテレーションする場合と言いたかった。

757 :
debugをしたら
user breakpoint called from code at 0x7c94120e
と出てきたのですが、どういった意味なんでしょうか

758 :
環境書こうよ……
まず、>>1の注意事項を読んでくれ

759 :
>>757
回線切って逝ってよし

760 :
>>757
デバッガがプログラムを呼び出して実行してブレークポイントに到達して止まった
つまり意図通り
ブレークポイントを誰がどうやって設置したかは環境次第

761 :
コンパイラはどれを使っていますか?

762 :
g95

763 :
Rの関数(cor(x,y)など)をFortranプログラム上で使えるようにできないでしょうか
Rに入っている関数のsoファイルを利用してなどできたりしないでしょうか

764 :
>>763 あなたは Fortran ではなく R を使うべきなのではないのでしょうか

765 :
Rがコマンドから使えるなら普通にSYSTEMすればいいんじゃないの

766 :
>>764-765
事情がありFortranで組む必要があったので仕方なく・・
ありがとうざいました

767 :
そもそもFORTRANにはRなんか手も足もでないような統計ライブラリが存在するはずだが

768 :
>>767
IMSLかMKLの統計サマリーですかね?
使いたいのは比較的新しめの統計量で、
そこには用意されていないけどRにはあったので・・

769 :
相関係数求めるだけだろ?
http://tama.green.gifu-u.ac.jp/~tama/soft/sample_prog/correlation/

770 :
今更ながらなんだがフォートランとオクターブの組み合わせ最高だよな。
今まではfortran とgnuplot だったけど

771 :
お絵かきできんの?

772 :
オクターブってMATLABのパチモンだっけ?
最近もメンテされてるの?

773 :
>>771
余裕でお絵描きできるよ。
お絵描き機能は gnuplot のを踏襲してるぽ

>>772
まだまだ現役

774 :
お絵かきとは2chのお絵かき機能のこと。
この板はできないのか?

775 :
3/3から2chのapi始動するけど移住しなくても大丈夫かね
とりあえずdat廃止されるまではここはNavi2chで巡回するけど

776 :
>>775
移住先の候補があるなら教えて欲しい。

777 :
とりあえずおーぷん2chにたてるだけたてといた
http://toro.open☆2ch.sc/test/read.cgi/tech/1425031440/
(☆はNGワード対策)
何事もないことが一番だけどそんときは避難所代わりに使ってください 現に今人多杉状態だけど
ここ質問スレだけど他にfortranスレないしfortran全般に関する喋り場ならおーぷんでいいよね?転載嫌いとかアフィリエイト嫌いとかのひとがいたらすまんが

純粋な質問に関してはstackoverflow日本語版も始まったしそっちも賑わってほしいなあと思ってる(現在3件しかない)
本家stackoverflowの方はfortranに関してもかなりお世話になってるし

778 :
お若い方。
この世間に疎い爺に何が起きているのか3行くらいで教えてくれんかね?
カチュ〜シャが使えなくなってから専ブラともお別れじゃよアッハッハ

2chがたらこのものでなくなったらしい話は風のうわさに聞いたども、
移住とは何のことじゃね?

779 :
>>777
おーぷん2chは知らなかった。何かあればそちらを使わせてもらいます。
stackoverflowの方はgoogleでの検索がヒットした時ぐらいしか行かなかったけれど、
日本語版はありがたいね。こちらも覗きに行きます。

780 :
>>778
私もよく知らないが、現在の専ブラが使っているdatが廃止される。2chを専ブラで利用するためには
2chが提供するAPIが必須となるが、このAPIは2chから使用許諾を受ける必要がある。
よって今のようなオープンソースの専ブラの開発、提供は難しいようだ。

781 :
>>493
私も見たいと思ったのですが…
該当章はなくなってしまったようですね.
(もう8か月以上だから仕方ないか)

782 :
おいおいTip集に分離されただけで記事は残ってるぞ
nagのトップページから見てみ

783 :
Hey!Yo!Brother!

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

できればジーザスの言葉と同じアラム語かおじちゃんと同じ言葉の日本語で頼むよ!
敵性語はノンノン!

784 :
FORTRANはゲームプログラミングに使えないと言われてムカつきます
なんとか美麗なグラフィックのゲームを作って見返したいのですが
キー入力やスプライト周りの便利なライブラリないですか(挫折)

785 :
>>784
ああ、それは腹立つな
Fortran Graphic、Fortran OpenGLで検索するとそこそこ出てくる
けど、まともにメンテナンスされてるのが無さげでもある……

786 :
プログラム中のx行目?y行目のソースコードを出力させるwrite文の書き方はないでしょうか

787 :
>>786
ねーよ

788 :
>>786
プログラム単体では無理
単純に任意のファイルのx行目を表示するプログラムなら簡単
指定行まで読み飛ばして、指定行を十分長い文字列で読み込めば良い
それでソースファイルを読んで表示するならできるけど
ソースファイルは常に必要

789 :
Quineが書きたいという話ではなくて?

790 :
>>788
なるほどopenして目的行寸前まで空readしてread×行数すればいいということですね
解決できそうです。ありがとうございました
>>789
初めて聞きました。勉強になりました

791 :
>>790
俺にもお礼言えよ、クソ野郎

792 :
3次元のスカラーデータを吐く、x,y,zのdoループをompにしようとしたんだけど、スタックオーバーフローだなんて怒られた

どーすんべ?

793 :
安直にはコンパイラ、リンカのオプションでスタック増やせ。

794 :
MinGWのGCC4.9.2ののFORTRANで, -fcase-upperのようなオプションってありますかね?
昔のバージョンにはあったみたいなんですが, 現在のは削除されたようで.

795 :
Intel fortran無料版のライセンスが改定されて
オープンソースへの貢献を証明しなきゃならなくなってた
https://software.intel.com/en-us/qualify-for-free-software/opensourcecontributor

796 :
Gfortran とIntel fortran のそれぞれの利点って何かね( ´ ▽ ` )ノ

797 :
え、gfortranに利点なんかあるの?
ああ、うん、gccツールチェインの一部なのは便利だよね

798 :
ハードウェアで二倍の性能出す金払うくらいだったら、Intelのコンパイラ買えよ。
ソフトには金出せないってどんだけ唯物論のアカなんだよw

799 :
>>797
なに、そんなレベル違いますのん?

800 :
>>799
10年くらい前は差は歴然としてました。
最近はどうなのでしょうね?

801 :
intelは自動並列化があるから中級者は使用を薦める

802 :
このレス数からしてFortran使ってる人はほとんどいないのかな?

803 :
ここでの質問は学生がほとんどのように見える
一般人は使わないだろうから少ないのは確かだろうけど
調べたり相談できる人が多いんじゃない?

804 :
>>803
なるほど
じゃあ私遠慮無く質問しまくっちゃっおうかな

805 :
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 :
>>805
なんとなく初期化してない変数が引っかかっている気がする
minvalの動作不良を疑うならコンパイラとか環境を書こう
違うならソースをできるだけ書こう
長くてソース貼れないならこんな感じに晒すと検証が楽
https://ideone.com/JstGnQ

807 :
>>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 :
>>807
ideoneってfortranいけるのかw

809 :
変数に値が入ってるかどうかの判断ってどうしてる?ポインタとか使わずになんかNull かどうか?っての判断できんのかね?
ちなみにgfortran 4.2 でDebian 8.0 64bit版での話なんだが。

810 :
>>809 ??
ASSOCIATED とか ALLOCATED じゃダメなのか?
普通の変数の場合はどうしようもないよな。

811 :
>>810
>>809 ??
>ASSOCIATED とか ALLOCATED じゃダメなのか?
配列やらポインタ使えってこと?

>普通の変数の場合はどうしようもないよな。
やはりそうなのかね?値がない場合をやって見たら、0.00000って表示されたのには吹いた

812 :
>>811
変数について何か勘違いしてないか???

ただどうしてもというなら、F2003ならスカラーのALLOCTABLEというのがあるので
それを使えばいい。

813 :
>>812
多分何か勘違いしてるかも。
俺の意識では、変数という箱に計算された数値データが格納されるってイメージなんだよなぁ。

814 :
>>809
>変数に値が入ってるかどうかの判断ってどうしてる?ポインタとか使わずになんかNull かどうか?っての判断できんのかね?
未初期化の変数にはコンパイラが適当な値を入れるはず。
ゼロかも知れないし、そうではないかも知れない。
変数を未初期化のまま使っていないか確認したければ、
コンパイラの警告オプションを探せば該当のオプションがあるかも。
gccなら-Wuninitialized、ifortなら-check uninitとかあるけれど、gfortranで使えるかは知らない。

815 :
まったくの初心者なのですが質問失礼します
f77形式で書かれたプログラムをf90形式に変換した所plplotという描画用プログラムがエラーだらけで動きません
具体的には、「関数plwid に対する定義されてない参照です」のようなメッセージがいっぱいでてきます
どうしたらよいのか教えていただけませんか?お願いします

816 :
>>815
plplotの関数を使うプログラム単位の宣言部でplplotのモジュールをuse文で指定する。
plplotライブラリのインストールディレクトリとライブラリの名前をコンパイラに教える。
すぐに思いつくのはこの二点かな。

817 :
>>806すみません補足します
OSはLinux beanでコンパイラはgfortranです

818 :
>>815
もとのプログラムはf77で正常にコンパイルできてるの?
gfortranでそのままいけるやろ

819 :
Fortran未だに使ってる人いますか?
やっぱり昔に構築しちゃった遺産をそのまま使う方ばかりですか?

820 :
天文学の計算で有効数字が16桁以上で計算したいものが
あり、C/C++では桁数の関係で微妙なので、Fortran
の4倍長精度を使って計算しています。
64ビットあるいは80ビットでなくて128ビット
で計算できるのが有りがたいです。

821 :
>>820
なるほどご丁寧にありがとうございます
そういった分野があるんだと勉強になりました

822 :
>>820
補足します。
NASAが太陽・月・冥王星を含む惑星の位置を計算
するための基礎データを発表しているのですが、
そのデータがたとえば
0.149597870691000015+09
という有効数字18桁で当れられて
います。
この一定間隔で与えられたデータを数値積分して
位置を計算する必要があります。
C++などのlong doubleでは、有効数字が16桁程度
なので、fortranの4倍長kind(16)を指定すると、
三角関数も4倍精度で計算でき、安心できるわけです。

823 :
ソフトウェアに興味なくて、ほとんどプログラムやったことない学生が、
専門分野の研究に必要になってから勉強を始めて、曲りなりに必要なプログラム
書けるようになるのが早いのはやっぱFortranだな。

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

ソフトウェアの板でいうと叱られるかもしれないが、
時間かけるならプログラム言語の勉強するより専門分野の勉強する方がいい。

824 :
maxvalを使って上から2番めに大きいものなど抽出したりできませんよね?

825 :
挑発されてるようで不快だが

配列に同じ値がないか、重複を排除した2番目に大きい値
(例えば配列a=(/1, 2, 5, 3, 5/)なら3)を返してほしいなら
maxval(a, mask = a < maxval(a))でいい
配列を降順に並べた時の2番目の値(上の例なら5)を返してほしいなら
maxlocで最初の最大値の位置を特定して、それを除外した配列のmaxvalをとる

826 :
>>825
ありがとうございます。書き方悪かったですすいません・・
今のプログラムがスマートに書るようになりそうで大変助かりました

もしかすると、3番目とかなら
b=maxval(a, mask = a < maxval(a)) !b=2番目に大きい
c=maxval(a,mask=a<b) !c=3番目に大きい
で良いでしょうか、試してみます

827 :
イケメンすぎるwwwwwwwwww

828 :
a(i,j)
b(j,k)という変数があって、
maxval(a(i,j+5:j+10)) - b(j,k)
という計算をしたいのですが、結果がおかしくなります。
もしかするとmaxvalを使って四則演算するときは配列が同じものを使用しないといけないのでしょうか

829 :
すいませんプログラムミスのだけでした

830 :
次のようなプログラムを試しに走らせたところ、
ファイルの作成には成功するのですがファイルの読み込みでセグメントエラーが出ます。
原因が分かりません、教えてもらえないでしょうか。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 :
>>830
エラー内容書いて
linux のgfortran 、intel fortranなら普通にいけるが

832 :
次のエラーが出ました。

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 :
Window7,64bitのgfortranを使ってコンパイル実行して
みましたが,

100 200 300
400
500 600

と出力されて無事終了しました。
ちなみに,gfortran64のVersionは4.9.2です。

834 :
ソフトのバージョンは
gfortra,64bit, ver 5.1.0 のおそらく最新版です。

とりあえず別のコンパイラを試してみます。

835 :
FTN95 でうまくいきました

やっぱり gfortran ってクソだわ

836 :
ファイルggshoki.f90に、800成分の配列を返すサブルーチンggshokiを書き、他のファイルと一緒にコンパイルしたところ、


ggshoki.f90:1:20:

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


というエラーが出てしまいました。
どう直せばいいのでしょうか。アドバイスお願いします。

837 :
上げてしまいました、すみません。

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

です。

838 :
連レスすみません。
バージョンは5.1.0です。

839 :
>>836
subroutineの内部で宣言するなら書き方が違うはず
引数で宣言するより別の行で宣言した方が見やすくない?
とりあえず自分はこんな感じで書く
https://ideone.com/HCzWB6

840 :
>>839
リンク先のように書いたらうまくいきました。
自分のプログラムの他の部分も確認したところ、配列の書き方が全て間違っていました(配列A(1:N)をA(N)などと書いていました)。
ありがとうございました。

841 :
教えてください。
サブルーチンに渡された配列引数2つが同一かどうか
(値が同じかどうかではなくて、値を格納するアドレスが同じかどうか)
を確認するすべはありますでしょうか…?

ポインタとか使えるのでしょうかね?よく分かっていません。

842 :
自己解決してしまいました…

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 :
いや、すみません間違ってました。値を比較してるだけみたいです。
どうしたらいいんだ。
(日記みたいになってしまってですまんです)

844 :
>>841
試した事がないので自信がないが、組み込み関数associated()を使えばできるかも知れない。
2つの配列引数をpointerで受けてそれぞれを同一targetと比較するとか。
ただ、アドレスが同じか確認するだけなら問題はないと思うが、
一般に1つのルーチンの異なる2つ以上の仮引数で同一実引数を受けるのはあまり行儀が良くないと思う。
上記の方法も配列仮引数ポインターにintent(in)属性を付けた方が良いかも。

845 :
最近出た『FORTRANハンドブック』
買ったほうがいいかな?

846 :
>>843
コンパイラは何?

847 :
ifortです。associated(pointer,target) で行けそうなんですが、
targetの変数にopitional属性がついていて… ><という状況です

848 :
gfortranならlocでアドレス取得できるの確認した
なんか独自拡張みたいだが、ifortにもあるよね

849 :
>>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 :
module内のcontainsのところに書いているfunctionをincというフォルダのsample.f90にまるごと持って行き、
include 'incl/sample.f90'
としたのですが、moduleに書いていた時はは参照できていた変数が
定義されていない参照 となりコンパイルできません。
functionまるごともっていくとかやったらいけないものなのでしょうか?

851 :
>>850
なぜinclude行を使おうと思ったのかとか、フォルダの名前はincなのかinclなのかはさておき、
include行はどこに書いているの?移動した関数を定義していた場所?それとも別?
あと変数はどこで宣言されているの?

852 :
>>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 :
>>852
詳しく教えて頂いてありがとうございます。試してみようと思います。
includeってもう非推奨なんですね。代替はmoduleで分割とかできるのかな
include以外のやり方も考えてみます

854 :
>>842
Fortranって規約では、引数に番地の重なる変数や配列を送っちゃ駄目じゃなかったけ?

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

>>848
loc 相当を規格内でやるには c_loc と transfer で代替するはず。

855 :
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 :
>>855
IF (L) a,b,c

X:負 go to a
X:0 go to b
X:正 go to c

857 :
>>856

ご回答ありがとうございました。
助かりましたm(_ _)m

858 :
>>855
>>856
いわゆる計算型go toはもう忘れられいるのですね。

859 :
>>858
私が素人というのもあるのですが、いくつかのFortranのHPみてもIF文の説明には
入っていませんでした。

860 :
>>869
ただしくは、算術IF文というものです。あるサイトの解説です
古い書き方に算術IFというものがあります。 この書き方はFortranでは廃止予定機能ですが古いプログラムには見かけられる書き方です。
算術IF文は、与えた式が0より小さい場合に最初の文番号へ、 0の場合は2番目の文番号へ、 0よりも大きい場合には3番目の文番号にジャンプします。
if ( 式 ) 文番号1, 文番号2, 文番号3
例)
i = -1
if (i) 100, 200, 300 ! 100へジャンプします

861 :
古文読解みたいなもんよ。
新たに使うことは無いが、昔のプログラム読む為の教養みたいなもん?
アセンブラから進化したと思えば、まぁこんな命令ありがち感はある。

862 :
ある参考書にあるプログラム例を映したのですが、実行するとエラーが出ます。内容が外部ファイルへの出力関係なので早急に解決したいのでよろしくお願いします。
プログラム
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 :
申し訳ありません。確認したところ
コンパイラはtdm64-gcc-4.6.1です。

864 :
再び申し訳ありません。
gfortranのverを落としたら普通にできました。何度もすみませんでした。

865 :
intelコンパイラのDAALをFortranから
なにかしらの形で呼び出してうまくいった方いませんか?

866 :
fortranで簡単なguiウィンドウ作れたりしますか?
ウィンドウがあってこのボタンを押すと〜〜のサブルーチン実行のような・・・

867 :
>>866
visual fortranにRADがあったような気がする
けど、Fortranで計算部分をライブラリ化しておいて
別の言語で作ったGUIで呼び出す方が一般的だと思う

868 :
>>867
ありがとうございます
やっぱり流行りの言語も使ってみたいと思います

869 :
基本的な質問かもしれませんがfunctionとsubroutineで作るのってどう切り分けたらよいのですか?

870 :
>>869
よく言われるのは『戻り値が一つの場合』はfunction、それ以外はsubroutine。
またsubroutineには『順番が決まっている一連の処理』を一纏めにするという使い方もある。
こちらの使い方は特定の数学問題を解くモノが多い。

871 :
>>869
functionを使うのは、返値が一つと自明な(かつ明示したい)ときだけかな。

872 :
>>871
ありがとうございます
計算速度は関係ありませんか?

873 :
例えばファンクションのほうがその度に呼び出すために計算速度は遅くなるとかありませんかね・・?

874 :
差は感じたことないな
気になるなら簡単なテストプログラム作ってみたら?

875 :
中身が分からないunformattedで出力されたファイルを読むにはどうすればいいですか?

876 :
ACCESS='STREAM' でオープンして嫁  詳しくはマニュアル検索検索

877 :
>>869
function は副作用(PURE の時)がないとき、それ以外なら SUBROUTINE が基本かな。
コンパイラの最適化の観点から、数学的な意味での関数になっているときに使うのがいい。

878 :
今二分法のプログラム書いているんだけど、うまく収束しなくて困ってるのでここで質問させてください

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

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

x -> xsol に近づいていると思うのですがどうしても0 に漸近しません。 収束条件は 10^{-1}程度の荒いものでも収束しません。
考えられる原因の1つとして情報桁落ちかな?と思いましたが回避する方法はあるでしょうか?
ある程度計算を進めると、区間[x1, x2]において、その中点 (x1+x2)/2の値が一定となってしまいます。

879 :
>>878
後出しで申し訳有りません。

変数は全て倍精度で設定しております。

880 :
>>878
real(16)
と宣言して、8倍精度にしたらどうなりますか。

881 :
>>874
>>877
返信おくれてすいません。
勉強になりました。一つ出力でpureな時はファンクションを使うようにします。

882 :
>>880
今4倍精度に宣言して計算終わったところです!
一定になるところは変わりましたが、計算を進めるとやはり中点が一定になります。。。

883 :
>>882
すみません、16倍精度の間違えです

884 :
>>880,861
ちょーーー!!
8倍精度とか16倍精度と違うから! 
普通はバイト数だから8で倍精度、16で4倍精度。
まぁ数値はベンダー依存で規定されていないから、あんたらのコンパイラが
8倍精度や16倍精度なのかもしれないがさw
そもそも二分法の場合必ず半分になるんだから、まともなら x1=x2 にならないはずがない.
ならないとすればプログラムが間違っているか、関数値の正負が x1 と x2 の間で
複数回反転しているかのどっちかだろ。つまり与えた区間の初期値が間違っている。
まずグラフを書かせろよ。
適当に数値いれて手で方眼紙にプロットしろ。話はそれからだ。

885 :
>>878
関数f(x)がもともと収束しない形である可能性はないのか?

886 :
>>884
すんません、完璧勘違いしてました!
やはり4倍精度で正しかったですm(_ _)m
勉強になりましたm(_ _)m
>そもそも二分法の場合必ず半分になるんだから、まともなら x1=x2 にならないはずがない.
>ならないとすればプログラムが間違っているか、関数値の正負が x1 と x2 の間で
>複数回反転しているかのどっちかだろ。つまり与えた区間の初期値が間違っている。
初期値問題ですか。。。。

>まずグラフを書かせろよ。
>適当に数値いれて手で方眼紙にプロットしろ。話はそれからだ。
グラフなんですが、f(x)が非線形なので数値計算のみでしかもとまらないです。

887 :
>>886
沢山の点で計算してEXCEL等でプロットすればいいのでは。

888 :
>>886
まずは4次のルングクッタでグラフ描いてみてはどうだ?

889 :
implicit な〜ん(笑)

890 :
fortranだと変数がからかどうか判定できないんだっけ?
空だと 0.00が代入されんのかな

891 :
>>890
普通の変数は判定できない。ポインターなら組み込み関数associated()で可能。
>空だと 0.00が代入されんのかな
空=未初期化のことなら変数の値は不定。
局所変数の初期値ならコンパイラオプションで指定できるコンパイラもある。
gfortranなら-finit-local-zeroオプションとか。

892 :
空ってなんだ? 初期化されていないということか?
Fortranでは初期化されていない変数の値は不定だぞ。ごみが入っている。
0.0は初期か忘れに気づきにくいから、むちゃくちゃな値が入っていたほうが親切。
allocatableがallloctaeされているかいないかならallocated関数かな。

893 :
>>892
e-307くらいが入る

894 :
>>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 :
Fortranのレベルでどうこうではなく、Undefined Behavior Sanitizerでも使えばいいんじゃないの

896 :
>>895
それはオプションかな?
今回の問題とはちょいと違うのだ

897 :
いまさらfortranで機械学習とかディープラーニングライブラリ作って公開する猛者いませんか?
いたら面白いのになあ

898 :
iMacだがLAPACKのコンパイルが上手くいかない。MacBookAirの時は上手く言ったのだが誰か教えてくれないか?

899 :
>>894
Fortran2003 ならスカラーの allocatable もある。

I/O では無理だが、例えば Function からの代入ならば、希望のことはできる。
スカラーへの allocatable 変数が返り値の Function からの自動再割り付けで、
右辺の関数の返り値が空なら、左辺の allocatable スカラーが allocate されないし、
値をもっていれば NULL だろうとallocate されるので allocataed 関数を使えば判別できると思う。

900 :
Fortranって何を使ってデバッグするんでしょうか

901 :
>>900
dddとかやん?

902 :
>>901
便利そうですね
ありがとうございます

903 :
数値計算するときの刻み幅の決め方が難しすぎるなぁ
等幅だとものすごい配列使うからメモリがオーバーフローするしなんかいい方法ないすかね?
てか、刻み幅に関する詳しい本とかないのかなぁ

904 :
>>903
森口繁一先生の
『計算数学夜話』
に、「刻み幅の自動選択」
という話が掲載されていたはずです。
変化がなだらかな区間は刻み幅を広く、
変化が急な区間は刻み幅を狭くするのを
自動化するという話です。

905 :
>>904
ありがとうー
うー、でも手に入らないぽいなー((((;゚Д゚)))))))

906 :
桁の大きなものと桁の小さなものが混じった数値計算をするとき、規格化するのは常識だと思うんだが。
ある変数の取りうる範囲が極端に振れる場合(例えば、1d-20 < x < 1d8) だとどうすりゃいいんやろか。

907 :
対数を取れw

908 :
>>907
それ教授や先輩にも言われたんですかまったく意味わかりませんでした。
刻み幅で対数????といった感じです。
logx(i+1)-logx(i)=刻み幅 ということですか?

909 :
logかました状態だと値の範囲が狭くなるというだけじゃ?

910 :
そもそも問題がわからないから答えようがないな。
たとえば被積分関数が 1d-20 から 1d8 まで振れる場合は小さい値はどうでもいいし。

911 :
一次元ポアソン方程式
d^2φ/dx^2=cos(x) (0≦x<2π)
を解くプログラミングがわかりません。差分法を使えばいいというのはなんとなくわかったのですが、差分法がいまいちよくわかっていないです。
どなたかご教授ねがえないでしょうか。

912 :
ネットでも本でもいいから微分方程式の数値解法について調べること。
いろんな計算方法があるし、特定の言語にこだわる必要もない。
そういえば数値計算のスレって今ないよね。

913 :
>>911
そもそもその式は解析的に解ける。

914 :
>>912
欲しいなそんなスレ

915 :
匿名通信(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 :
言語はなんでも大丈夫ってレベルじゃねーぞ

917 :
Fortran2015の調子はどうだい?

918 :
ChromebookでFortranって動かせる?

919 :
全く分かりません
答え教えて下さい
http://i.imgur.com/BB9ERMu.jpg
http://i.imgur.com/SgRmlY6.jpg

920 :
>>919
逝ってよし

921 :
>>919
>>920
この流れいいなw

922 :
>>920
オマエモナー

923 :
>>919
自己解決しますた

924 :
0度〜90度まで30度間隔で正弦と余弦を出力する。但し書式は整数5桁、関数値は10桁で小数点以下6桁とする。
下記でコンパイラしても上手くいかないのですがどこをどのようにすれば宜しいでしょうか?
http://i.imgur.com/xwAoCXH.jpg

925 :
古風な書き方だな
大学の講義か何かで習ってるの?
k が正しく表示されない点については、フォーマット文の f2.0 を i5 に書き換えたらどう?
どの段階でどのように失敗するのか書いてくれるとチェックしやすい
あと、プログラムをコピペしてくれるとこちらが入力する手間が省ける

926 :
>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 :
>>925
>>926
ありがとうございました!
i5に変えたら成功しました!

928 :
>>925
大学ですね

929 :
重力のみが作用する振り子の運動を解析するプログラムを完成させよ。
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 :
http://i.imgur.com/JFN9XSU.jpg

931 :
>>929
回線切ってR

932 :
>>929
単振り子で色々調べてますが全く分かりません。
誰か出来る方いましたらお願いします。

933 :
たぶん運動方程式をたててオイラー法で解くだけでしょ
どの段階で躓いているか分からないと答えようがない

934 :
宿題全部やってちょうだい感が出てるから、やってくれる人は少なそう

935 :
エセ左翼の目的は、わざと突っ込みどころが多い主張をすることで自分たちへ注意を向けさせ、
カルトへ向かう非難の矛先を逸らすこと。
国益に反することを言ったり、主張が食い違うもの同士の対立を煽ろうとするので放置し難いが、
主義思想についての洗脳を受けているわけではなく、フリをしているだけなので、
言い負かされてもダメージを負った様子もなく、論点をすり替えられるかスルーされる。
まともに相手をしてはならない。
サヨに対する危機意識が強すぎると、普段は常識的に振舞っている
(又は、サヨから不当に叩かれている)政治家などがズレたことをやろうとした時でも、
許容したり擁護してしまいがちになるので注意が必要。

936 :
時間、速度、角度を出力するつもりでやったのですがコンパイルした時の値が違います
おそらく運動方程式が間違っているのだと思いますが(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 :
>936
プログラムの問題ではなくて,数式の問題なんだから,物理板で質問した
ほうがいいのじゃないの。

938 :
>>936
それFortran以前に運動方程式が全然違う。
v=Lω
dθ/dt = ω
として
dθ^2/dt^2 = -(g/L)sinθ
という微分方程式をルンゲクッタ法で解く。
解析力学、振り子とかで検索したら
ttp://homepage1.nifty.com/gfk/furiko.htm
出てくるだろ、ちゃんと調べろ。
それ以前に理学部とかだったら勉強不足だぞ。

939 :
どなたか「=>」の意味を教えてください
大なりイコールのような条件式ではなく、記号が逆になっている方です。
具体的には、
DO I =1,NCNEST_NUM
D=>NCNEST_DATA(I)
G=>NCNEST_GRIDS(I)
CALL ASSIGN2BLOCK(D,G)
END DO
のようになっています。データの書き込み系だと睨んでいます。
よろしくお願いします。

940 :
>>939
ポインタの指示先を指定している
http://www.nag-j.co.jp/fortran/FI_Pointer.html

941 :


942 :
>940
すばやい反応ありがとうございます。
「FORTRAN =>」で検索しても出てこなかったので、非常にありがたいです。

943 :
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 :
caf-mpi.a もしくは caf-mpi.so はたしかにあるの?
バージョン番号付いたやつにリンクしてる?
ってWindowsか、、、Windowsの場合 .lib だったりするのかな

945 :
今のところwindowsだと無理っぽいね
mpif90がないからlcaf_mpi.aも取れない
おとなしく仮想化使います

946 :
大気の温度構造を求めるために、4次のrunnge-kutta 法で数値計算しているんですが、ある値に収束するまで繰り返し計算させているせいか精度がどうしても出ません。
動かす範囲が大きいため、刻み幅のとり方が非常に難しく難儀してます。
例えば、積分範囲が 3.0d9 から3.0d6 まで計算しなきゃいけないのですが、ところどころに物理状態が変わるいわゆる境界があるので一律に刻み幅を設定するわけにもいきません。
色々書籍見てみたんですけど、刻み幅のとり方って
h = -1とか撮ってみても恐ろしく時間がかかるため現実的じゃありません。
なにか妙案はないでしょうか?
もしくは推薦図書あれば嬉しいです。
ちなみに今あるのは「数値計算術 」森口繁一 です。

947 :
>>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 :
>>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 :
どなたかご存知の方いらっしゃいますでしょうか?
コンパイラのバグではなく何らかの仕様なのかと思うのですが分かりませんでした。
●質問
実数型の変数を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 :
丸めモードについて読むこと
IEEE754のNEARESTなら正しい動作
http://www.ibm.com/support/knowledgecenter/ja/SSGH4D_12.1.0/com.ibm.xlf121.aix.doc/language_ref/write.html

951 :
どうもありがとうございます。
ROUNDで丸め誤差を色々定義出来るのですね。
来週試してみます。

952 :
fortranにはなんで引用仕様宣言なるものがあるんですか?
関数の引数等を関数の定義からコンパイラ勝手に読み取れば良いと思うんですが、moduleでできて手続きだとわざわざ自前で書かなきゃいけない理由って何かあるんですか?

953 :
普段形状引き継ぎ配列を使っているのですが、blasやlapackを使ってarray-temporariesをつけてコンパイルすると、コンパイル時にarray-temporariesのワーニングが出ます。
blasでは形状引き継ぎ配列を使っていないしモジュール内にあるわけでもないので当然と言えば当然なのですが、こういう時にどうするのが良いのか分からず困っています。ベストプラクティスのようなものはあるのでしょうか?

954 :
永い時を経て多分自己解決出来ました
Contiguous なんていうオプションがあるのですね

955 :
このスレ人おんの?

956 :
一応

957 :
おおー。人おった!

958 :
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

SAWKX

959 :
SAWKX

960 :
DG2

961 :
DG2

962 :
FORTRAN案件が一部に有るな
鉄道ダイヤシステムだが

963 :
何故文関数、
f(x) = 1. / x
のような記法が非推奨と言われるのでしょうか?(nag等のサイトより)
他の言語のlambda式などと比べて、Fortranでは非常に簡潔に簡易な関数を定義できるものだなあ、
と感心していたのですが…

964 :
>>963
書き易さより読み易さが優先
気象庁の標準コーディングルールより
文関数
 文関数は引用仕様が暗黙的であり、デバッグがしずらくなる。また、文関数 自体や文関数定義が後続する文関数を引用してはならないなどの制限がある。 内部関数として書いた方がよい。
http://www.mri-jma.go.jp/Project/mrinpd/coderule.html

関数、変数は明示的な宣言をしてから使うのが今風
個人で読み返さないプログラムなら何やっても正常動作すれば良いよ

965 :
>>964
ありがとう、正直大きなプログラム書かないので実感が湧かないけど、そういうものか

966 :
中学校の技術の教科書に載ってるってバズってるな

967 :
2018も出たことだし若い血も入ってくる
乗ってるな

968 :
本当に初歩的でかつ自分勝手で申し訳ないのですが、fortran90でn次正方行列の逆行列を求めるプログラムを教えていただけませんか?

969 :
それは数値計算の永遠の課題で万能の処方箋は無い
勉強の為ならWikipediaでも見ながら愚直にガウスの掃き出し法でも実装してみたら

970 :
求めたいだけなら大体の環境でmklが一番いいライブラリ
有名なので比較的読みやすいのはLINPACKだけど77仕様
モダンで簡単な実装ならあちこちのブログに載ってるからググれ

971 :
一応貼っとく
http://www.netlib.org/linpack/
お好みのシチュ用のソースが読める
インデクスと要素毎演算でDOは殆ど排除できるはず

972 :
>>968
宿題は宿題スレへ

973 :
スレ索してみたけどFortranスレもしかしてここしか無くね

ぜひLINPACK読んで逆行列の疑問書いてくれ
布教のチャンス

974 :
Lapackでええやん

975 :
LAPACKは使うけどコードは最適化されてて汚い

976 :
Matrix Computationsに載ってるよ。

977 :
質問です。
ファイル名 *.f90 とは別に、プログラム名 program * がありますが、この二つが同じ名前だと、何らかの不具合・不便に繋がったりするのでしょうか。
私は、修正前後を比較するためにバージョン違いを作るような場合を除き、基本的に両者を同じ名前にしているのですが……

978 :
むしろ同じにしといた方が無難

979 :
>>978
安心しました、ありがとうございます。

980 :
ファイルシステムの無い時代、例えばパンチの名残だろうかね

981 :
環境は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 :
すみません、一応自己解決しました。
指定子に文字型の変数を与えることができる、ということに先ほど気づきました。
なので「一度closeする」で問題ありませんでした。
name1 = 'foo.dat'としておいて、
open文に file=name1 とでも書けば済む話でした(つまるところ、ファイル名変更時の手間が一番の問題だと考えていたので)。

983 :
lapack インスコ方法教えてんか?

984 :
>>983
mklが手軽かつ最速だがクソでか&環境依存
配布も考えるならソースをnetlibでwget -r url
ラッパのLAPACK95もあると便利

985 :
>>978
遅レスだけど、program名って何か意味あるんかね?
program書かないでも動くし(endは必要)、programは他から呼ばれないし

moduleやsubroutineの名前は呼ぶのに大事だけど
ファイル名はinclude "fname"で使うから意味ある

986 :
誰かhankel関数の使い方教えて

987 :
他人が作ったコードで、
real*4 宣言を全部real*8に書き換えたら、
計算結果がNaNになっちゃったんだけど、
どんな原因が考えられますか?

988 :
色々

教えて欲しかったらソース出せ

989 :
【出資】松本卓朗 人工知能詐欺【注意】
https://rio2016.2ch.sc/test/read.cgi/rikei/1560859403/

990 :
Fortranは1956年?だかに作られたそうだけど
当初からクラス設計とかあったの?

991 :
データベースに合わせたORMみたいな
メンバーとか何かあった気がするが
クラスは無いんじゃね

992 :
>>990
ねーよ
元々メインフレーム言語だし

993 :
Moduleで継承みたいなことってできないんでしょうか?

module mod1
integer,parameter :: val1 = 20
end

module mod2
use mod1
end

program main
use mod2

print *, val1
end

みたいな
このままだとエラーですけど

994 :
>>993
gfortran8.1で試したけど普通に動くよ

995 :
>>994
まじですか。
やってみます!

996 :
今更fortran使う必要が出たんですけど宣言全部冒頭でやらなきゃいけないとか読みにくいにもほどがあるなこの言語……
ただdllでもない生のCファイル普通に使えるのちょっと強すぎじゃない。何これ

997 :
JULIAやれ

998 :
C++に移植する作業をしてるんだが、fortranは配列が1スタートなのと行優先なのまじで糞だと思う

999 :
配列の下限もレイアウトも両方オプションで変更できるっしょ

1000 :
openglも行優先だっけ

1001 :
read/writeの装置番号というのに衝撃を受けたんだけど
いや整数を振るって……えぇ……他の言語でこんなん見たことねぇよ……

1002 :
ここで言語仕様に文句言ってもどうしようもないだろ……
整数型の変数も使えるから自分で値を付けれるハンドルと考えれば良い

1003 :
Cでもstdin=0,stdout=1,stderr=2とかやってるやん?

1004 :
ハンドルを整数値で管理するなんて普通だろ。

1005 :
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 :
副作用が無いならfunction、あるならsubroutine
例えばsinやcosはfunctionだけどrandom_numberは内部状態を書き換えるのでsubroutine

1007 :
戻り値の有無やろ

1008 :
返り値が複数かどうかだろ

1009 :
副作用はpure修飾で区別するのでは

1010 :
前提として初心者がどちらにするか迷った時の話で
非pure関数を同じ文中で複数呼んだら評価順の影響を受けて悩みの種になるというのがあるから
副作用があれば全部subroutineぐらいの割り切りでいいと思う

1011 :
>1008
複数の返り値を構造体にすれば、関数でいけるのではないでしょうかね

1012 :
cigwin64ターミナルでコンパイルしようとすると
Winmain関数への定義がされてないって言われるんだけどどうしたらいいですか?

1013 :
Winmain関数を定義したらよいのでは。

1014 :
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 :
>>1014
エラーログよく読めよカスガキ

1016 :
読んでみました。
libisl.21.dylib を読み込もうとしているのですが、
libisl.22.dylib におそらく対応ファイルが変わってしまったようです。
読み込み先を libisl.21.dylib → libisl.22.dylib に変更するにはどうしたら良いのでしょうか? 

1017 :
libisl.22.dylib を libisl.21.dylib に rename

1018 :
コンパイルできるようになりました!
ありがとうございます!

1019 :
並列計算のコマンドを do loop 内に入れると,配列ごとに計算できないのね。。。
なんか妙案あるのかな

1020 :
ifortで-ipoを指定すると謎のセグフォが発生する

1021 :
うめ

1022 :
うめ

1023 :
うめ

1024 :
2ch.scからのレス数が1000に到達しました。

Visual Studio 2019
Visual Studio 2015 Part8
OpenMPプログラミング
フリーソフトなどに使われる言語は?
【えっ】Perlに未来はあるのか?【終わり?】
Excel VBA 質問スレ Part63
D言語 Part34
Vue vs React vs Angular Part.2
生産性が低いC++で頑張るために必要な知識
リファクタリングをただのコード修正と思ってる人へ
--------------------
A代表 採点スレ 43?
爆走兄弟レッツ&ゴー!!
受身な人の心理状態 71ウケミン
韓国紙報道「韓国では性的虐待が深刻。多くの韓国男性が『女は強姦されて喜んでいる』と思い込み」★3
【レスok】喪女のチラシの裏(IDなし) Part.3
【WAIS】ウェクスラー成人知能検査を語る29【IQ】
「ジゼル」について語ろう
【在宅同居】シングル介護専用part50
うんこはなぜ臭い
海芸板のID制の有無について議論するスレ
かんぱに☆ガールズ 5420社目
【YouTube】ぽてとチャンネル専用スレ Part1
 * 手が疲れたら書き込むスレ *
実況パワフルプロ野球2018 パワフェス専用スレPart7
トンカツを柔らかくするには?
ジェンヌの男性関係 Part.2
NGT48 画像保管庫スレ ★2
WILLCOM だれとでも定額パス WX01TJ part2
【PS4/PSVITA】プロ野球スピリッツ2019 ドリームリーグ Part4
ELS VS バジュラ VS ヒディアーズ
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼