X



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

●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。

●前スレ
くだすれFORTRAN(超初心者用)その5
http://toro.2ch.net/test/read.cgi/tech/1269704830/

●過去スレ
くだすれFORTRAN(超初心者用)その4
http://pc12.2ch.net/test/read.cgi/tech/1232789521/
くだすれFORTRAN(超初心者用)その3
http://pc11.2ch.net/test/read.cgi/tech/1196384126/
くだすれFORTRAN(超初心者用)その2
http://pc11.2ch.net/test/read.cgi/tech/1164121236/
くだすれFORTRAN(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1138063703/
0002デフォルトの名無しさん垢版2012/08/16(木) 21:32:02.53
           , r‐‐ 、_
        ,  ´ ̄  ´ ̄    ̄ミ 、   ____/: : : : ヽ、
    __./         `¨       \/: : : : : : : : :: : :  : : : : : : : : }
     / /// // /  ,.、  /     /  : : : : : : : : :   : : : : : : /
    _,ァ≫イ/ / / /  <、\>′   ヽ{  : :\      フ: : : : :/
      イ/| //ー-、   />/`Y    ∧\.:: : : :ヽ   /: : : :/   ) (
     彡' ノ,イ{/{__///「/¨ヽ.! ! | .}}  /: : :.i  /: : : : :/   (   )
       彡' ノ }イ:::} ´´ r=ミ、 }ノ 1 小      /: : : : :/  (   ノ            こ、これは>>1乙じゃなくて
            片ソ   /:::しヘ从 j/从.ゝ 彡/: : : : :/            |\        レンコンしそ餃子の湯気なんだからね
        {:::::、   廴::/}{/ ,'{/  /  ,': : : : /      (     (. |: : \       今後は、気をつけなさい!!
           ヽ ー  :::::    ∨{彡'.:.:.:.:. :/i: : : : :{     (  )   |: : : :.ヽ      
             \__  イ≦_¨\ \_ {: : : : :丶_______.ノ: : : : : }
        、____xー|.   |, -、`   ヽ _.: '.: : : : : : : : : : : : : : : : : : : : : : /_
        / // / ー / /》ー--、  l-‐ \: : : : : : : : : : : : : : : : : : イ   ゙ ヽ
        ノ // /ヘ/  ///     \ /   /,,r"i/ ,r"i/,,r"i/,,r"i  、 ヽ
     /   // ,'⌒/.   ///      }/ ./  /#; / /#.; / //#; / ,/#; / .," i  |
     V //  i /   ///       `ヽi. /#; / ,/#; ./ /#;; / ,/#; / .,'   / /
       片厶≦j/ヘ  //〈        /.  |〃/ ,|〃/ ,|〃/ , |〃/ .,"..;;/ /
      `ー'⌒Y⌒ヽ //  ヽ-====<  ヽ   ヽゝ' `ヽゝ~ ヽゝ ~ヽゝ'  " /
                           ゙ ー-- 、、... _ __,,,,, .... --―"


0003デフォルトの名無しさん垢版2012/08/17(金) 02:14:17.73
> 初心者に適切な指導もなくプログラム書かせているのはアカハラの域に達してるな。

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

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

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

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


0007デフォルトの名無しさん垢版2012/08/17(金) 20:51:34.50
>>6
それだと出力してない。
OPEN と CLOSE の間で出力する。

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

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

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

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

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

! exel data x
do i = 1, ndata
read(12, *) (x(j, i), j = 1, 3)
end do
0009デフォルトの名無しさん垢版2012/08/17(金) 21:16:18.67
! exel data y
do i = 1, ndata
read(12, *) (y(j, i), j = 1, 3)
end do
!
do i = 1, ndata
tx(i) = (i * 50.0 - 25.0) * x(3, i)
ty(i) = (i * 50.0 - 25.0) * y(3, i)
end do

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

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

stop
end program test
0010デフォルトの名無しさん垢版2012/08/17(金) 21:38:35.93
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm
open(14,file=filenm)

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

close(14)
0012デフォルトの名無しさん垢版2012/08/17(金) 21:52:24.90
>>10>>11
アドバイスありがとうございます。とろいのですいません。

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

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

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

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

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

stop
end program test

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

0015デフォルトの名無しさん垢版2012/08/17(金) 23:15:49.56
character (len = 20) :: filenm_in, filenm_out
write(*,'(a,$)') 'File Name : '
read(*,'(a)') filenm_in
open(11,file= TRIM(filenm_in) )

・・・・

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

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

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

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

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

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

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

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

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

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

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

stop
end program test

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

program test
implicit none
integer, parameter :: ncolumn = 18, ndata = 400
real :: a(ncolumn, ndata), x(3, ndata), y(3, ndata)
real :: s(ncolumn), sx(ncolumn), sy(ncolumn), tx(ndata), ty(ndata)
integer :: i, j, icol
0027デフォルトの名無しさん垢版2012/08/24(金) 16:56:50.09
! exel data y <----EXCELな
do i = 1, ndata
read(13, *) (y(j, i), j = 1, 3)
end do
close(11)
close(12)
close(13)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

あんま全角文字は使わない方がいい。
003712垢版2012/08/29(水) 19:26:06.86
program test
implicit none
integer, parameter :: ncolumn = 18, ndata = 400
real :: a(ncolumn, ndata), x(3, ndata), y(3, ndata)
real :: s(ncolumn), sx(ncolumn), sy(ncolumn), tx(ndata), ty(ndata)
integer :: i, j

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

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

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

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

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

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

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

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

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

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



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

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

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

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


オペレーターの入力ミスということでしょうか?
0043デフォルトの名無しさん垢版2012/08/29(水) 20:46:18.21
>(ncolumn, ndata)に関してですが、(18,400)に変更しても問題ないでしょうか?
>師からわかっている値なのでこっちにした方がよいと言われました。

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

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

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

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


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

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

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

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

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

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

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

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

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

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

僕が書き込めるのは、17〜21時,それから帰宅の間は書き込めないので23時以降になります。
004712垢版2012/08/29(水) 23:53:21.35
>>42
今後ともよろしくお願いします。
自分は無礼な発言やおかしいことは言いませんので、
その44の人は別人だし無視してください。
0050デフォルトの名無しさん垢版2012/08/30(木) 01:30:42.54
>>41 手元にマニュアルもないの? というか目を通してる?

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

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

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

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

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

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

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

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


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

result= 1.035272 1.036202 1.037060 1.037667
1.037912 1.037520
0056デフォルトの名無しさん垢版2012/08/31(金) 11:37:20.94
tx(i) = x(1, i)* x(3, i)
ty(i) = x(1, i)* y(3, i)
     ↑
同じ数字が入っているはずだが、y(1、i)にした方がいいかな。

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

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

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

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

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

ifport では access と DELFILESQQ を使用しているのですが、
PGIのコンパイラで使用できる同種のライブラリはありますでしょうか。
0059デフォルトの名無しさん垢版2012/09/05(水) 22:38:16.39
>>58
少しはマニュアルくらい読めよw
DEC時代の名前で存在している。ifortでなくてdfortとかiをdに変えればおk。
006158垢版2012/09/10(月) 16:56:11.03
>>60
解決しました。ありがとうございます!
0062デフォルトの名無しさん垢版2012/09/15(土) 18:54:35.08
急に質問してしまい申し訳ありません。
先月からfortranについて勉強し始めました。

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

記述

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



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


おそらくwrite文のフォーマットの記述がおかしいと思うのですが
どこがおかしいのか分からず質問させていただきました。
おかしな点を指摘していただけると幸いです。
006562垢版2012/09/16(日) 17:07:32.38
>>64
ありがとうございます!無事解が一つのみ表示されました。
ご指摘の通りCとDが複素数で宣言されていました・・・・
それにすら気づかず、write文のせいにしていたのが恥ずかしいです。
大変助かりました!
0066デフォルトの名無しさん垢版2012/09/18(火) 19:39:09.67

すみません、質問です。

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

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

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



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

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

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

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

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

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

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


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

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

それで、これが一番最初のFORTRANの正式なドキュメントかな?と思っているのですが、当たりですかね?
http://www.bitsavers.org/pdf/ibm/704/FORTRAN_paper_1957.pdf
007266垢版2012/09/24(月) 16:11:25.31
>>68>>69
ありがとうございます。
0073デフォルトの名無しさん垢版2012/09/24(月) 18:53:46.75
>>70
FORTRANの歴史を知りたいなら、Comuter History Museumをチェックしなければ
いかんがねー。
http://www.computerhistory.org/collections/fortranarchive/

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

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

昔のFORTRANのマシンコードなんかはパンチカードだか、ダンプリストだかが
うpされていた気がするので機械語レベルでは転がってる気がした。
0074デフォルトの名無しさん垢版2012/09/24(月) 18:57:59.58
エミュとかはComputerHistoryMuseumではなく、民間のおっさん達がやってる。
ググれば出てくる。
007666垢版2012/09/26(水) 19:24:13.20
結局、自分でプログラム組めるほど頭良くないので電卓で手打ち
でやってたんですが、エクセルでやることにしました。
フォートランは、エクセルと比べどういう計算処理をする場合に
特化しているんでしょうか?計算するんだったらfortranが一番
おすすめだそうなのでやってみたんですがチンプンカンプンです。
(>_<)
0077デフォルトの名無しさん垢版2012/09/26(水) 21:49:19.25
Excel でできる程度の計算なら Excel でやれば良し。
Excel とか無い時代の産物なので、伝統か信仰によって勧められる事が多い。
0078デフォルトの名無しさん垢版2012/10/16(火) 20:22:35.55
質問があります
FORTRANを使って連番ファイルを読み込ませるためのgnuplotのバッチファイルを書きだそうとしているのですが、writeでどうやって書き出すのかわかりません
どういうことかというと、たとえば
plot "output[i].txt" u1:2
をi=1,10でwriteで出力するとき
write(filenumber,*) "plot "output[" i "].txt u 1:2"
となるためwriteで文字を出力するために使う”と、出力する文字の一つとして扱いたい”が干渉してしまうんです。


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

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

これでどうだ?番号は 01,02,... ,10 となるが。
0081デフォルトの名無しさん垢版2012/10/16(火) 22:54:18.30
すまんこ。
>'(a, i2,2, a)')
i2.2  ↑  ピリオドな



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

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

do i = 1, 10
klen = int(log10(real(i))) + 1
write(fmt, '(a, i1, a)') '(a, i', klen, ', a)'
write(filenumber, fmt) 'plot "output[', i, '].txt" u 1 :2'
end do
0083デフォルトの名無しさん垢版2012/10/16(火) 23:35:22.01
>>82
うむ。
i0ってF2003からの機能だと思っていたが、F95から入ってたんだな。
勘違いしてたわ。
一応F95標準縛りをかけていたつもりだったので避けたが、i0 で楽勝だな。
0084デフォルトの名無しさん垢版2012/10/17(水) 00:21:39.81
>>78
思いつくものを挙げてみると...

write(filenumber, '(a, i0, a)') 'plot "output[', i, '].txt" u 1:2'
write(filenumber, '(a, i0, a)') "plot ""output[", i, "].txt"" u 1:2"
write(filenumber, '(a, i0, a)') "plot " // char(34) // "output[", i, "].txt" // char(34) // " u 1:2"
write(filenumber, '(a, a1, a, i0, a, a1, a)') "plot ", 34, "output[", i, "].txt", 34, " u 1:2"
write(filenumber, '(13hplot "output[, i0, 12h].txt" u 1:2)') i
0086デフォルトの名無しさん垢版2012/11/23(金) 13:59:34.03
質問です。
配列を引数にする関数を定義したいのですが、
やり方がよくわかりません。

function FD(w)
implicit none
integer :: i
integer,parameter :: n = 10
real(8) :: w(0:n),FD(0:n)
do i = 0, n
FD(i) = exp( - w(i))
enddo

end function FD

が関数で、これをメインプログラムで使いたいのですが、
x = FD(w)
のような省略形だとちゃんと計算できるんですけど、
do i = 0, m
x(i) = FD(w(i))
enddo
みたいに配列を明示しようとすると
配列の形状が準拠していません。
とエラーが出ます。

()を省略しないで書く方法はないですか?
0087デフォルトの名無しさん垢版2012/11/23(金) 16:37:12.25
>>86
w(i)は配列ではなく配列の要素(1個の変数)ですので
当然エラーとなります。
do i = 0, m
x(i) = FD(w(i))
enddo
の3行を、
x(:) = FD(w(:))
にすれば()付きの書き方にはなります。
0088デフォルトの名無しさん垢版2012/11/23(金) 18:30:14.20
>>87
回答ありがとうございます。
まだ、違いがよくわからないのですが
例えば、

do i = 0, m
x(i) = FD(w(i)) + y(i+1)
enddo

とか

do i = 0, m/2
x(i) = FD(w(i))
enddo
do i = m/2, m
y(i) = FD(w(i))
enddo

のようなことは関数の場合、出来ないのですか?
(:)だと出来ることが制限されてしまうような気がするんです。
0091デフォルトの名無しさん垢版2012/11/26(月) 19:24:40.40
fortran95 以降になるが、ELEMENTAL属性を使えばできる。
これはスカラーに対して定義しておくと、配列も受け付けるというもの。
ただし副作用のない PURE な副プログラムな必要がある。

elemental pure real(8) function FD(w)
implicit none
integer :: i
real(8), intent(in) :: w
FD = exp( - w )
end function FD

これでメインルーチン側で
x = FD( w )
と呼んでも
do i = 1, 10
x(i) = FD( w(i) )
end do
と呼んでもよろしい。
PURE が何かはマニュアルを見るか、鋼鉄天使くるみPUREを見る事。
シスタープリンセスREPUREでもいい。
0094デフォルトの名無しさん垢版2012/12/02(日) 16:57:51.30
x(:)=fd(w(:))
x=fd(w)

って同じ?
: つけとかないと配列であることを
忘れちゃうので
つける習慣にしているけど。
0096デフォルトの名無しさん垢版2012/12/03(月) 19:08:16.44
>>93
どっこい、それがF2008でELEMENTALだがI/Oを許すという風になったので、
ELEMENTALだからと言ってPUREとは言えなくなったのだよ。
妹たちの未来を考えて、ここはPURE。

>>95
これもF2003からは同じではなくなったのだよ。
RAEL,ALLOCATABLE :: a(:)
REAL :: x(100)
a = x
F2003では代入時に割り付け配列は、(再)割り付けされる。
a = x(1:10)
とすると、a はサイズ100から10に再割り付けされる。
a(:) = x(1:10)
の時は、元のサイズ100のまま代入される。

抽象度の高い記法の方が良いのだから、括弧をつけない方が正しいと思う。
F77からの移行期には、括弧を書いて置く方がわかり易かったのは理解できるが
数学だって行列を記号1個で書いて間違わないのだからだいじょぶDEATH
0098デフォルトの名無しさん垢版2012/12/04(火) 13:45:46.84
>>96
2003使ったことないけど、うーんと、
要は allocatable な変数は
allocate() 使わなくても、
: 無しで左辺において、
固定サイズ(か既に大きさの確定した配列)が右辺に来る代入式で
随時 deallocate して再び allocate した事にする、
ということなのかな?

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

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

>>99
90からはwrite(*,*) 'abcdefg'(2:4)と定文字列?でもできるぞ。
0101デフォルトの名無しさん垢版2012/12/05(水) 13:45:40.15
へえ、しらんかった。
でも、どういう場面でつかうんだろう?

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

とか、・・・英語複数形 s をだしたり隠したり、かな?
でも正直なところ、なくても困らんな。
010288垢版2012/12/05(水) 18:22:09.77
88です。みなさんありがとうございます。
お礼が遅くなってすみませんでした。
まだ難しくてよくわからないので、素直に括弧つけます。
0103デフォルトの名無しさん垢版2012/12/06(木) 14:46:49.96
>>100 最近の言語は動的なんちゃらで、みんなそんな感じだから流行り
だろうね・・・でも量が多いと遅くなりそう。
そういう動的なことは Interactive な言語処理系でやればいいことで、
やることの量がだいたい前もって決まっていることを
なるべく早くたくさんがーっと処理したい、というのが Fortran 人wなので
・・・でもこのままでは老害って言われるし・・・うーん、むつかしいね。
0104デフォルトの名無しさん垢版2012/12/06(木) 15:58:43.84
ヤングの諸君を引き寄せるには、ある程度流行りの機能を入れないとまずいんだろう。

それに動的自動割り付けは、FUNCTIONで不定個数を返せるようになったので、
それを受け取るには無いと困るというのがあると思う。

REAL :: x(10)
REAL, ALLOCATABLE :: y(:)
CALL RANDOM_NUMBER(x)
! f90
ALLOCATE( y( COUNT(x > 0.5) ) )
y = f(x, 0.5)
PRINT *, y
! f2003
y = f(x, 0.5)
PRINT *, y

CONTAINS

FUNCTION f(x, a)
REAL, ALLOCATABLE :: f(:)
REAL, INTENT(IN) :: x(:), a
f = PACK(x, x > a)
END FUNCTION

END
この例はあらかじめ必要な配列の大きさが分かるが、計算してみないと
必要な配列の大きさが分からない場合は、大きめに取っておくか
二回計算する必要がある。
0105デフォルトの名無しさん垢版2012/12/06(木) 17:15:11.18
可変長文字列も動的割り付けで可能になった。
program varchar
implicit none
character(len = :), allocatable :: text
text = 'automatic allocation'
print *, text
text = 'variable length text'
print *, text
stop
end program varchar
0107デフォルトの名無しさん垢版2012/12/08(土) 17:47:52.98
モジュール内で定義したグローバル変数を
プログラム内で変更しないようにするにはどうしたらよいでしょうか?
(変更があったらエラーを吐くようにしたい)

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

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

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

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

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

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

f77時代は1個のファイルにまとめた方が、引数チェックや最適化のメリットが
あったが、f90以降は、MODULEとか使えば、分割コンパイルにそれほど害はないズラ
0125デフォルトの名無しさん垢版2012/12/25(火) 20:09:46.90
年内にインテルFortranの更新来ないのかな?二か月に一回の周期来てんだが。
block..end block を早く入れて欲しいわ。
たまに loop index を局所的に確保したい。頭部の宣言部が重くなりがち。
0126デフォルトの名無しさん垢版2013/01/04(金) 12:57:56.98
下記のようなループの外でopenしてループの中で書き足していくプログラムを書いているのですが,
ifortでコンパイルした場合,実行の途中でもファイルが更新されていくのですがpgiでコンパイルした場合はプログラム終了まではファイルが更新されず,
プログラム終了時に全部書き込まれます.pgiでコンパイルした場合でもプログラムの途中で適宜ファイルが更新されるようにできるのでしょうか
open(1000, file='data.dat')
do j = 1, N
write(1000, *), j
enddo
close(1000)
0128デフォルトの名無しさん垢版2013/01/04(金) 17:18:02.62
>>127
うぉー!ありがとうございます
0129デフォルトの名無しさん垢版2013/01/09(水) 11:54:21.56
linuxでfortran 77のコンパイラってありますか?
gfortranというのを使うらしいのでそれをインストールして試したのですが知人に貰ったfortran 77のコードがコンパイルできませんでした
0130デフォルトの名無しさん垢版2013/01/09(水) 12:25:08.67
>>129
gfortranは77に対応していません。

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

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

あと、昔のプログラムだと整数とからんだCOMMONやEQUIVALENCEの整合が狂って
謎な挙動をしたりするから困る。
0135デフォルトの名無しさん垢版2013/01/11(金) 01:47:02.97
>>132
g77の拡張機能つかってるコードをそうと知らずにgfortranでコンパイルしようとして互換性ないと勘違いした
0136デフォルトの名無しさん垢版2013/01/12(土) 13:32:51.48
>>133
以前、同じことが気になったので、
中くらいの長さ200行ぐらいの単精度コードを手でw 倍精度化したのと、
コンパイルオプションで倍精度化したのを比べたことがある。
gfortran と ifort ではそれぞれで
実行バイナリが冒頭の一部分(コンパイル時刻?)以外は同一だった。
なので自作コードだけなら、違いはないか気にならない程度だとおもう。

third party library で
単精度と倍精度でサブルーチン名が違う場合があるので
その場合にどうなるか、はしらない。
0137デフォルトの名無しさん垢版2013/01/12(土) 13:34:36.19
あと、OpenMP で並列化したやつもまったく同じだった。

MPI で並列したやつはまるで駄目だったので
これは泣く泣く手で倍精度に揃えたw
0138デフォルトの名無しさん垢版2013/01/12(土) 14:57:23.92
third party というかソースのない、かつ組み込みでない関数/サブルーチンは
変換できないし、規定されていない方の値を渡すと意味不明な挙動になるぞ。

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

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

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

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

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

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

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

あと、intelの非商用のコンパイラってもう配布されてないんですか?
0153デフォルトの名無しさん垢版2013/02/22(金) 01:40:20.99
1文字づつ読んで改行まで貯めこむしか無いんでないかな。

IVF9.0では無理だと思うがF2003なら、可変長文字列ではなく文字配列ならIVF9でも可かな。
program test
implicit none
character :: ch
character(:), allocatable :: buf
buf = ''
do
read(9, '(a)', end = 999, advance = 'no', eor = 8) ch
buf = buf // ch
cycle
8 print *, buf
buf = ''
end do
999 stop
end program test
0154150垢版2013/02/22(金) 15:25:21.78
>>152
non commerical で検索したら見つかりました
ありがとうございます

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

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

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

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

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

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

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

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

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

リスト構造を無限ループで回してるところを
openmpで並列化したいんだけどできます?
0167デフォルトの名無しさん垢版2013/03/07(木) 18:31:50.73
リスト構造といっても色々あるから答えようもないぜw

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

順序入れ替えが無い線形リスト構造なら、配列に直せば元々高速になるし、
並列化の余地も大いにあると思う。
0168デフォルトの名無しさん垢版2013/04/03(水) 15:36:38.02
print '(g20.12)', 1.d-100
とすると
0.100000000000E-99
と返してくれるのですが,

print '(g20.12)', 1.d-101
とすると
0.100000000000-100
のようにEが消えてしまいます.
これだとプロットのソフトによっては0.100000000000-100を-99.9と解釈してしまい困ってます.
どうすれば3桁以上の指数部分も正しく書けますか.
コンパイラはifortです.
0169デフォルトの名無しさん垢版2013/04/03(水) 18:33:16.72
>>168
こんなかんじかな。

program p
implicit none
integer :: i1,i2
real(8) :: d1,d2
character(10) :: s1
d1=-1d-105
i1=log10(abs(d1))
d2=d1*10d0**(-i1)
write(*,"(g25.16,f25.15,a)")d1,d2,"E"//i2s(i1)
contains
function i2s(ival)
integer, intent(in) :: ival
character(int(log10(dble(abs(ival))))+2) :: i2s
character(12) :: s1
write(s1,"(i12)")abs(ival)
if(ival.ge.0)then
i2s="+"//s1(12-int(log10(dble(abs(ival)))):12)
else
i2s="-"//s1(12-int(log10(dble(abs(ival)))):12)
end if
end function
end program
0171168垢版2013/04/03(水) 20:10:49.50
>>170
そんな仕様があったのか。知らんかった。
0172169垢版2013/04/03(水) 20:12:16.82
ごめんミス。171は169です。
0174デフォルトの名無しさん垢版2013/05/05(日) 23:04:55.44
f90って継続記号は行頭ではなく行末でないといけないんですよね?
例えば、
equation = A&amp;
     + B&amp;
     + C
みたいな式があってCの寄与をみるためにコメントアウトするとき
たまにBの後ろの&amp;をコメントアウトしわすれて面倒だったりしませんか?
絶対文頭につける仕様のほうが便利だと思うんですが・・・。
0175デフォルトの名無しさん垢版2013/05/06(月) 08:39:40.01
セミコロンで文末にできた気がする

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

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

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

ちなみにインテル Fortran なら /warn:interface でうるさく言ってくるようだ。
0180デフォルトの名無しさん垢版2013/05/16(木) 03:39:55.72
>>179
ありがとうございます。具体例をあげます。
module_Aのなかに、サブルーチン1とサブルーチン2がcontainsされています。
module_Bのなかに、サブルーチン3がcontainsされています。

ケース1、
サブルーチン1でuse module_Bとして、サブルーチン3を呼び出します。
実引数はmodule_Aで宣言しており、x(0:imax)です。
仮引数はサブルーチン3で宣言しており、intent(out)属性をつけてx(1:imax)です。
この場合、コンパイルしてもエラーが出ませんでした。
0181デフォルトの名無しさん垢版2013/05/16(木) 03:42:38.83
つづき、

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

コンパイラはifortです。
できれば、これらのケースでのinterfaceの使い方を教えていただきたいです。
0182デフォルトの名無しさん垢版2013/05/17(金) 10:56:33.57
ftn95 で、以下のエラーメッセージの原因がわかりません。
(メッセージの意味ではありません)

Error 29, Call to missing rotine : _EXSUB at 0x00******.

主プログラム(main.f90)
program main
use interface_mod
implicit none
integer :: a,b
a=3; b=5
call exsub1(a)
call exsub2(b)
end program

外部サブルーチン(exsub.f90)
subroutine exsub1(r)
implicit none
integer, intent(in) :: r
real(8),dimension(r):: w
print *,w
end subroutine

subroutine exsub2(s)
implicit none
integer, intent(in) :: s
real(8),dimension(s):: x
print *,x
end subroutine
0183182垢版2013/05/17(金) 10:57:14.45
(うえのつづきです)

インターフェイスモジュール(ifmod.f90)
module interface_mod
interface
subroutine exsub1(r)
integer,intent(in)::r
end subroutine

subroutine exsub2(s)
integer, intent(in) :: s
end subroutine
end interface
endmodule interface_mod
0184デフォルトの名無しさん垢版2013/05/17(金) 12:40:14.55
質問です。 計算の結果を.datファイルに書き込むプログラムを作成したのですが
datファイルの中身を確認すると文字化けしています。何がいけないのでしょうか?
OSはWindow7 64bit、コンパイラはFortran90です。「あらきけいすけの雑記帳」を参考にしました。
プログラムすべて乗せるとちょっと長いので関係有りそうな部分だけ。

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

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

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

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

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

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

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

>>184
書いたファイルの中身が見たければアクセスとか指定せずデフォでいけ。
(シーケンシャルアクセス)
write文は自由フォーマットwrite(1,*)で。
0188デフォルトの名無しさん垢版2013/05/17(金) 18:29:07.70
direct access は、大量のレコード長(データの長さ)が等しいデータを
書き出しておいて、読み出し/書き換え時に、ランダム位置に直接そのデータを
読みに行くときに使うもの。

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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


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


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

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

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

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

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

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

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

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

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


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

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

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

>>206 専ブラインデント用引用符
0207デフォルトの名無しさん垢版2013/05/30(木) 19:04:54.82
実行結果

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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


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

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


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

gfortranでは上記に対応するコンパイルオプションはないでしょうか
0236デフォルトの名無しさん垢版2013/08/28(水) NY:AN:NY.AN
初心者というか入り口にすら立ってないため質問させていただきます。

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

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

まぁFortran2003の命令で、(工夫すれば)置き換え可能なので、もうあまり使われない。
POINTER (pointer, pointee)
ポインタ(整数変数)にはポイントされるもの(pointee)の番地が入るようになる。
0245デフォルトの名無しさん垢版2013/10/02(水) 00:38:14.04
>>244
両方非標準。

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

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

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

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


なおFORTRAN77はFortran90に完全に含まれているので、今のコンパイラでも多少のオプション変更で書き直さなくても動くはず。
0250デフォルトの名無しさん垢版2013/10/15(火) 22:40:32.54
初期値も何も与えてない変数の値って0ですよね?
それが0ではなくとてつもなくおおきな値になることってありますか?
0253デフォルトの名無しさん垢版2013/10/16(水) 01:37:15.62
変数がゼロになってるなんて思ってたのかよw
コップや皿を洗わないで飲み食いするタイプか?
0254デフォルトの名無しさん垢版2013/10/16(水) 01:42:01.37
規格上は不定らしいよ。
ttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14106144349
ttp://ruby.gfd-dennou.org/products/ruby-dcl/ruby-dcl-doc/math1/node9.html

超初心者用スレなのに、みんな厳しいね…
0255デフォルトの名無しさん垢版2013/10/16(水) 02:01:47.72
初心者スレだったか、めんごめんご、すまんこ、おまんこ。

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

今もリンカのオプションでゼロクリアできるものが多い。
0256デフォルトの名無しさん垢版2013/10/16(水) 23:48:35.58
なるほろ〜不定なんですね。

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

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

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

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

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

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

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

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

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

サブルーチン(THDFE)側のほうでエラーメッセージがでます。
0263デフォルトの名無しさん垢版2013/11/09(土) 19:18:40.37
>>262
interface文を書いてないとか?
それと仮引数に割り付け配列を指定できるのはFortran2003以降のはず。
Fortran95の拡張仕様TR15581をコンパイラがサポートしていれば問題ないけど。
0266デフォルトの名無しさん垢版2013/11/09(土) 21:14:09.73
>>264
手元にあるFortran2003の言語仕様(draft)の257頁から抜粋すると

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

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

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

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

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

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

program test
implicit none

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

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

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

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

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

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

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

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

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

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

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

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

単精度実数なら他に単にFORMATを実数用にして強行突破する方法も考えられる。
倍精度の時は難しいかな??
0281デフォルトの名無しさん垢版2013/11/19(火) 00:19:07.21
すんません。
数値計算する際、expとかの値が大きすぎたり、小さすぎたりしてオーバーフローしたり、exp(x)のx が限りなくゼロに近い時とか、欲しい値が得られません。
みんなはどうやって回避してますか?

よくよく考えたらexp1000 とかオーバーフローしますよね。
0283デフォルトの名無しさん垢版2013/11/19(火) 18:58:29.45
>>281
精度の問題がないなら対数を取って計算すればいいじゃない
というか、それは浮動小数点演算の本質的な問題だから
まず数値計算の基礎を勉強することをお勧めする
0284デフォルトの名無しさん垢版2013/11/19(火) 19:01:27.99
書き込んでから気付いたが、もしexp(1000)の値を実際に表示したいのなら
多倍長計算とかしかないな
0285デフォルトの名無しさん垢版2013/11/19(火) 23:54:23.18
>>283
何がオススメですか?参考書的なもので。
ちなみにプランク関数とか値がどでかい物やらプランク定数のようなちっこいものまぜまぜして計算することが多いので困ってます。やはり対数でやるべき?
0286デフォルトの名無しさん垢版2013/11/21(木) 22:58:26.48
プランク常数とか絡むなら、それを1に規格化して計算するのが常識だろ。
まず少し基礎的な本から読め。
0291デフォルトの名無しさん垢版2013/11/26(火) 01:02:17.85
>>289
伊理正夫の「数値計算の常識」の中に無次元化の章があったはず。
大した事書いてないが常識として程度は知っておくべき。
大体、無次元化していないと、素人・非常識・DQN・支那チョン・ごみ・カス・クズ扱いされる。

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


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

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

アスペ野郎は、よそのスレに行けよ、HaskellスレとかMLスレに行けば仲間がいっぱいいるぞ。
ここは毎年この時期は卒業研究で焦りまくった学生さんの駆け込み寺なんだからさ。
0306デフォルトの名無しさん垢版2014/01/14(火) 01:43:43.02
ちょっとお聞きしたいのですが、
読み込むファイルの数値データが"〜〜"のダブルクオーテーションで囲まれているのですが、
これを文字列でなく数値で読み込むことはできないでしょうか?
ファイルの"をすべて消すことも考えたのですが、文字列として読み込みたいところもあるので避けたいです
すいませんがよろしくお願いします。
0307デフォルトの名無しさん垢版2014/01/14(火) 06:48:50.39
一度文字列として読み込んで、その文字列から数値として読み込む
例えばこんな感じ(valueが数値の変数、cvalueが文字列の変数)
read(*,*) cvalue
read(cvalue,*) value
0308デフォルトの名無しさん垢版2014/01/14(火) 19:51:34.68
>>307
早速のレスありがとうございました
ためさせていただこうと思います
0309デフォルトの名無しさん垢版2014/01/18(土) 11:40:25.48
すいませんがご教示ください
integer,dimension(99999,20000000)::aaの配列でifortでコンパイルしようとすると
再配置がオーバーフローしないように切り詰められました
と出ます。配列の数を小さくするとコンパイルできます。
配列が大きいから出ているエラーと思うのですが、なにか対策はないでしょうか。よろしくお願いします。
0310309垢版2014/01/18(土) 12:21:08.98
スレを読み直してallocatableを使うことでコンパイルはできました。
すいませんありがとうございました
0312デフォルトの名無しさん垢版2014/01/20(月) 21:57:41.73
すみませんが、ちょっと教えてください。
Intel MKLのpardisoで、LU分解後のLとUを取り出すためにはどうしたらいいのでしょうか?
0313デフォルトの名無しさん垢版2014/01/21(火) 18:52:17.93
すみません。セグメンテーション違反って何ですか?
0314デフォルトの名無しさん垢版2014/01/21(火) 21:15:53.71
OSがゴミってこと
0315デフォルトの名無しさん垢版2014/01/30(木) 21:30:13.25
G95をダウンロードしたいのですが、
Windows版のFTPでは、
530 Login authentication failed
(認証に失敗)
とでるのですが、どこで認証を得られるのでしょうか。
0320デフォルトの名無しさん垢版2014/02/03(月) 00:35:08.25
上の方に無次元化の話が出ていましたが、これって数値計算の本ならちゃんと説明されているものですか?
ネットで検索してもあまりヒットしないし、あったとしてもやり方だけでそうする理由はあまり説明されていない気がします。

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

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

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

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

どこで学んだかと言われると、たしかによくわからない。
口伝かな。
0326デフォルトの名無しさん垢版2014/02/05(水) 01:20:23.89
物理の本では無次元化が必ず出てくるぞ。
量子力学とか割と基礎的なテキストで。

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

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

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

これを実行すると

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

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

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

どうぞよろしくお願いいたします
0329デフォルトの名無しさん垢版2014/02/24(月) 01:05:53.35
プログラム自体の問題ではなく、実行ファイルが不正な命令を実行しようとしたのが原因。
それがコンパイラのバグなのか、コンパイラオプションや実行環境の問題なのかはわからん。
0330327垢版2014/02/24(月) 12:18:08.81
>>328-329
レスありがとうございます
OSはXPでコンパイラオプションは
-oだけ使ってます

文法の間違いでないと分かって
とりあえずひと安心しました
インストールしなおしとか旧バージョン
使うとかしてみます
たいへんどうもありがとうございました
0332327垢版2014/02/24(月) 22:42:53.37
>>331
dです
もしよろしかったら、OSとコンパイラのバージョン、
コンパイル・オプション等教えていただけたら嬉しいです
0334332垢版2014/02/25(火) 01:16:16.64
>>333
ありがとうございます!
旧バージョンを使うと吉なのかもですね

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

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

program checkpwr2

double precision dx, dxp2, dxp2d

dx = 2.0d0

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

print *, dxp2, dxp2d

end


もう少しいろいろ調べてみます
長文失礼しました
0335デフォルトの名無しさん垢版2014/02/25(火) 01:55:16.47
もうF77のプログラムに手を加える作業はいやだお・・・

今module内のSubroutineからLAPACKのZGEEV呼ぼうとしているんですが、
LAPACKのサブルーチンって外部副プログラムですよね?
毎回interface文を書くのが正しい書き方なんでしょうか?
使ってるのはintel fortran &amp; MKLです。
module
...
contains
subroutien foo
implicit none
interface
subroutine ZGEEV(jobvl, jobvr, ...
...
みたいな感じに。
0337デフォルトの名無しさん垢版2014/02/25(火) 09:23:01.24
>334
こちらでは、正常にコンパイルし、
4.0000000000000000 4.0000000000000000
結果がでます。
ついでに、プログラムを
program checkpwr2

real(16) dx, dxp2, dxp2d

dx = 2.0d0

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

print *, dxp2, dxp2d

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

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

あれから再インストールをしてみたのですが同じエラーがでてまして、
それで、インストール時の環境を変えてみるか、それかバージョンを落としてみるか
してみようと思ってます
うまく行ったらお礼がてら報告したいと思います
たいへんどうもありがとうございました
0341デフォルトの名無しさん垢版2014/02/27(木) 22:19:15.92
>>335
インテルなら use lapack95 を implicit none の前の行に足し
mkl_lapack95_lp64.lib をコンパイルに足したまえ

ぶっちゃけ interface 書かなくとも呼べる。引数チェックは無論効かないが
0342デフォルトの名無しさん垢版2014/02/27(木) 22:23:14.15
>>341 に追加
って総称名じゃなく個別名か

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

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

 完動です!!!!

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

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

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

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

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

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

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

allocate 時の問題じゃないことは当然確認したね?コードうp
0358デフォルトの名無しさん垢版2014/03/08(土) 02:56:59.79
>>356
あれ自動DeallocationはFortran95からじゃなかったっけ?
おれF90時代に、ベンダー依存の解放エラーに悩まされた記憶がある。

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

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

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


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

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

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

なーんかいい本ないですかね?
0363デフォルトの名無しさん垢版2014/03/25(火) 21:47:05.41ID:jjQiXJR+
とりあえず文法は ggれならぬ nagれ、だな。本は洋書しかないし
http://www.nag-j.co.jp/fortran/

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

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

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

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

こういうイメージで、逐次のa(i,j)を代入したいっす。
0372デフォルトの名無しさん垢版2014/04/15(火) 10:35:48.57ID:nSLuXsCJ
b(:,:,t)=a(i,j)ってやれば二次元配列に時間軸を追加したものができるのか
よくある:ってなんの意味なんです?
0373デフォルトの名無しさん垢版2014/04/15(火) 19:04:08.61ID:2Visq3rw
b(:,:,t)=a(i,j) だと駄目。
>>370 のとおりじゃないと。

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

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

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

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

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

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

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

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

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

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

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

そこでおすすめの開発環境を教えていただきたいのです。
0388デフォルトの名無しさん垢版2014/04/22(火) 18:21:36.11ID:i3jJvf/a
Gfortran 使いです。
Cycle 文についての質問だけど、

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

とかだったら a = 12 になるのかな?
0389デフォルトの名無しさん垢版2014/04/23(水) 00:33:33.39ID:cH3Ejolk
do 変数をいじっちゃいけないはず。
自分のおちんちん/おまんこはいじってもいいよ。
0391デフォルトの名無しさん垢版2014/04/23(水) 02:10:49.07ID:2MktZpH7
間違えた

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

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

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




って表示されるよ!

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

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

まぁ、この場合CYCLEの意味ないけどw
0394デフォルトの名無しさん垢版2014/04/24(木) 04:26:06.40ID:PfDx1Fno
試した奴いるかい?
登録がめんどくさいんですけど。


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

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

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

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

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

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

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

(宣言後)

a=0

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

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

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

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

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

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

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

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

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

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

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

エクリプスでもhero.f90 (メインプログラム単体)単体のコンパイルは出来ています。
もしかして複数ファイルを同時に今コンパイルできないとか?
0406デフォルトの名無しさん垢版2014/05/11(日) 09:02:09.98ID:4C2ZppHJ
>>405
ここで聞いてもムダだよ。
ここにはエクリプス使ったことない奴しかいないから。
みんなテキストエディタ直打ちだから。
0409デフォルトの名無しさん垢版2014/05/11(日) 17:20:58.15ID:cyBk1jZ9
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
0411デフォルトの名無しさん垢版2014/05/13(火) 11:18:46.53ID:Ml4tWcMx
sin波のようななめらかな波形データから尖頭値を抽出するにはどうすればよいでしょうか。
波形データの入っている配列aから抽出したいのですが、sin波のような綺麗な周期を持っておらず、地震の観測波形のように不規則に連続して変化していっています。
0413デフォルトの名無しさん垢版2014/05/15(木) 01:14:31.34ID:cUF0eH5o
>>406
いえ、そんなことおっしゃらず…

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


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

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

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

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

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

またC言語(C++)のコードのコンパイルや実行には成功しています。
0423デフォルトの名無しさん垢版2014/05/16(金) 21:38:59.32ID:HsLYY/75
>>420
以前、似たような(同じ?)エラーメッセージに遭遇した事があったが
その時は件のライブラリを強制再インストールしたら直ったように思う。
mingw-get update
mingw-get --reinstall upgrade mingw32-libquadmath
これを実行してMinGW(MSYS)のターミナルを再起動すればどうかな。
0427420垢版2014/05/17(土) 19:57:54.60ID:j7anWBLq
>>423
ありがとうございます.
なんとか実行することができました.
0429デフォルトの名無しさん垢版2014/05/30(金) 03:00:46.51ID:r0FrxYTY
メモ帳のインプットファイルから一行ずつ読み込んでプログラムを回す時、読み込める一行の長さの限界というのは決まっているのでしょうか

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

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

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

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

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

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

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

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

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

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



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


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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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





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

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

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

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

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

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

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

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

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

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

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

そのエラーにあるファイルがあるか探す
ファイルがあるパスをLオプションで追加でとりあえず通るはず
例えば-L/usr/local/cuda/lib -cublas
0479デフォルトの名無しさん垢版2014/06/16(月) 15:38:44.47ID:juShtlay
>>478
探して見たところ、'libcublas.ipl'、'libcublasemu.lib'という名前のファイルしか見つかりませでした。
そこで、これらのファイルが保存されているフォルダのパスを追加してコンパイルしたところ、
『error lnk2019: unresolved external symbol referenced in function』
というようなエラーが出てきてしまったのですが、
どうすれば良いか教えていただけませんか?
0480デフォルトの名無しさん垢版2014/06/16(月) 15:50:37.89ID:Q+b6M39D
>>479
試しにcublasをcublasemuに変えてみて
libcublas.libがなかったのならもしかしてパスはすでに通っていたかもしれません
0481デフォルトの名無しさん垢版2014/06/16(月) 16:27:09.31ID:juShtlay
コード中の'cublas'を'cublasemu'に変更し、
'-lcublas'を'-lcublasemu'に変更してコンパイルしたところ、
『unable to open MODULE file cublasemu.mod
compilation aborted』
と出てしまいました。。。
0482デフォルトの名無しさん垢版2014/06/16(月) 16:43:59.97ID:vxzjg7XS
>>481
コードは元のままでいいです
申し訳ない
0484デフォルトの名無しさん垢版2014/06/16(月) 17:46:47.99ID:vxzjg7XS
>>483
use cublasemuになっていませんか?
0487デフォルトの名無しさん垢版2014/06/17(火) 16:58:12.46ID:W5zFtzyB
>>486
-Lパスでディレクトリを指定して、-cublasemuをつけてコンパイルしたところ、
"libcublasemu.lib : error lnk2019: unresolved external symbol referenced in function"
が、ものすごい数のが出てきたのですが、どうしたらいいですかね?
一個ずつ-lで追加していくしか無いのでしょうか。
0488デフォルトの名無しさん垢版2014/06/17(火) 17:24:37.11ID:AhgC7kyl
cublas使わなければ普通に動くの?
0490デフォルトの名無しさん垢版2014/06/18(水) 18:11:03.14ID:s+RQ8hIL
>>489
可能な限り少しずつコメントアウトを外していき
その都度コンパイルが通るようにオプションを調整してみてください
最初はuse cublasだけなど
大量のエラーが少しずつ出ることを期待します

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

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

マニュアルをよく読めば、内部ファイルの項目が昔から書いてある。
0495デフォルトの名無しさん垢版2014/06/21(土) 20:05:31.04ID:6Ae9RUEd
>464
そうでしたか。なにしろわたしが FORTRANを学生時代に始めた
ころはFORTRAN IVのころで80桁のパンチカードにパンチした
カードデックを窓口の届けると2日程で,棚にカードとラインプリ
ンタで打ち出した結果がおいてあるという時代(東大の計算センター
にあったHITAC 5020)のころで,FORTRAN77の出る前
ダイクストラの構造化プログラミングが騒がれ始めて,
カーニハンとリッチーの『ソフトウエア作法』をよんで,
構造化出来るRATFORを大学にあった小さなコンピュータで
実験しているころからの進歩を知りませんでした。
その後,CおよびC++に興味が移りFROTRANをご無沙汰してい
たのですが,最近のFORTRANで128bit処理ができることを
知り,まいもどってきた次第です。
市販のfortran90,95の入門書を見てみたのですが,見当ら
なかったので,質問したしだいです。
0497デフォルトの名無しさん垢版2014/06/24(火) 20:49:58.43ID:vNnfb12N
Gfortran 使ってるんだが、データを読み込ませる際、2行ごとにデータを読み込ませることって可能?
0498デフォルトの名無しさん垢版2014/06/25(水) 01:47:13.51ID:2uAyyXu5
素直に全部読みなさい
変数に入った値は、必ず使えとも使うなとも言われてないだろう
0500デフォルトの名無しさん垢版2014/06/26(木) 01:01:48.05ID:pqUjp/UA
awkなりsedなりで一行飛ばしの中間ファイル作って、それをデータファイルにするとかじゃだめなの?
入力関係でつまづくなら、fortranにあわせたファイルを作成する方が早いのではと思ってしまう。

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

i=1
do m=1, linenum
if(mod(m,n) .eq. 1) then
read(20,*) hoge(i)
i = i +1
else
read(20,*)
endif
enddo
0504デフォルトの名無しさん垢版2014/06/27(金) 00:38:41.62ID:iFH1F/Cx
>>502
あっ、もしかして>>501のやり方って途中空白行入ってることになるのかな???

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

program test
implicit none
character(len = 132) :: text
open(10, file = 'test.f90')
1 read(10, '(a, /)', end = 999) text
print *, trim(text)
goto 1
999 stop
end program test
0508デフォルトの名無しさん垢版2014/06/27(金) 09:18:57.76ID:F3h4qtWf
久しぶりにfortranのプログラム見たが、FORTRAN77の時代と違って気持ち悪い。
これならC++の方がまだいい。テンプレート関係を除けば。

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

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

4倍精度は精度は4倍だが計算時間は10倍超だから、
10倍の時間の合間にアルゴリズム見直した方が吉。
0511デフォルトの名無しさん垢版2014/06/28(土) 13:41:05.28ID:1f0E4KM2
並列計算させてdoループの中でwrite文でファイル書き込みしたら中身の順番めちゃくちゃで泣きました。
どーにもなんないんですかね?
0514デフォルトの名無しさん垢版2014/06/28(土) 22:06:02.07ID:mzWdk+zj
>>509

はぁ。。。

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

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

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

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

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

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

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

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

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

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

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

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

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

y = A .dot. x

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

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


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

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

それにしてもここにいる住人は凄い人が多くて、泣ける
0523デフォルトの名無しさん垢版2014/06/29(日) 17:26:15.54ID:rvrpBbGm
>>519

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

>>520

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

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

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

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

しかし、ほんとコードが糞だよな。こんなの覚えるくらいなら
C++の方がましだわ
0525デフォルトの名無しさん垢版2014/06/29(日) 17:34:36.24ID:qF+KN0J6
>>522
いや、そうでしょうけど、出力の順番とか気にする場合が私の研究分野だとほとんどなので…
なにか勉強になるものがあればいいのですが
0527デフォルトの名無しさん垢版2014/06/29(日) 17:59:34.52ID:rvrpBbGm
間違えた

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

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

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

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

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

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

>>526
面白そうだね

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

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

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

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

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

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

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

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

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

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


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

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

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

EQUIVALENCE (A, V1)

COMMON /VS/ V1, V2, V3, V4

のようなコードをfortran90風に書き直したいのですがAをCOMMONブロックの変数で置換する以外にいい方法は無いでしょうか?
できればSubroutine等を増やすのではなく,Moduleの変数宣言部分だけで解決したいのですが...
0548デフォルトの名無しさん垢版2014/07/10(木) 22:05:54.56ID:pJ0O1Ur0
>>547
ありがとうございます
早速以下のように使ってみたんですが
module VS
real :: V1, V2, V3, V4
end module VS
program
use VS, A => V1
...
A(1) = 1.0d0
...
end program

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

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

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

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

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

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

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

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

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

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

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

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

form='unformatted'を指定すると、write文を書くたびに
データの最初と最後に4バイトのレコード長がつき、
form='binary'を指定すると前後4バイトがつかないみたいです。
0564562垢版2014/08/04(月) 22:17:03.55ID:IXwYtmhs
>>563
ありがとうございます。
試してみます。
0565デフォルトの名無しさん垢版2014/08/05(火) 02:23:56.59ID:BDydvxMf
directファイルを使うテクニックもある。
確実ではないが、大抵の処理系では、バイトまたはワード単位でべた書き
しているので、binaryの代わりに使える。

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

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

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

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


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

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

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

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

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

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

とはいえ自然科学ではない商習慣等での丸め等もあるようだから
別にそれがいけないわけでなく、それに合った言語例えば
BCD演算できるCOBOLなどで計算すべきのみ。
0590デフォルトの名無しさん垢版2014/09/04(木) 02:18:06.97ID:dS3FSElc
Fortran コンパイラメーカ
Intel PGI Pathscale   (Intel NVidia AMD/ATI) アクセレレータ御三家

Absoft NAG          独自色 

Lahey/Fujitsu Silverfrost  斜陽族

GFortran g95        GNU Free系

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

意識高いw進歩的wCS学科若年層には人気は全くないのに。
それともおっさん層しかやってないからなのか?
そのわりにGNU COBOLとかPL/IとかALGOL、PASCAL、Modula-2とかやらないし。
0594デフォルトの名無しさん垢版2014/09/07(日) 03:06:28.08ID:5kwVdIF1
Cray, IBM, PGI, Intel が F2003 完全対応したな。
NAGはあと一歩。
GFortranは進捗どうですか?

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

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

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

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

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

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


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

>>606
タスクマネージャーとか ps コマンドとかでメモリーの使用状況を見てみたら?
call system が通らないのはメモリー満杯くさい。
0608デフォルトの名無しさん垢版2014/09/19(金) 01:31:53.81ID:3dCDoxc8
>>607
ありがとうございました
ps alxで見るとrssがまさに満杯でいっぱいのようでした
cat /proc/meminfoで見るとフリーが10Gぐらい残っていて
大丈夫と思っていたのですが違いが分かっておらず
違いを勉強しようと思います
もしご存知でしたらまた教えていただけると幸いです
0611デフォルトの名無しさん垢版2014/09/20(土) 20:11:45.61ID:onD5DKrz
>>610
ありがとうございます。べんきょうになりました。

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

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

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

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

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

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

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

たぶん10年以上無駄な1要素配列のプログラム書いていたwww
0618デフォルトの名無しさん垢版2014/09/26(金) 02:38:03.65ID:jeu5JnPX
>>617
配列 a(7) = (/ 2,3,4,5,8,5,4 )/ があるとする。
最大値の位置を返す組み込み関数 maxloc に a を渡すと maxloc(a) は
1次元で1要素の配列 (/5/) を返す。

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

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

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

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

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

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

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

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

これは仕様なのでしょうか?
0632デフォルトの名無しさん垢版2014/10/13(月) 20:38:43.03ID:qvDo+/hC
>>631
systemからのcd実行なら仕様。
別のshellが起動してcdを実行して処理を終了するので、呼び出しもとのshellとは無関係。
GNUならディレクトリを変更したい場合はCHDIRが使える。
0634デフォルトの名無しさん垢版2014/10/14(火) 10:25:49.65ID:gGwwURe/
とか言って失敗しましたw CHDIRをつかうとshからpremission deniedと怒られます。

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

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

sh: 1: ..: Permission denied

と怒られますw
0636デフォルトの名無しさん垢版2014/10/17(金) 08:36:55.32ID:/3IlFIL9
素朴な疑問なんですが
write( *,101) n
write(10,101) n

こういう式って一行にまとめられないんですか
0638デフォルトの名無しさん垢版2014/10/18(土) 03:21:07.25ID:1z7UQB1P
言い換えます
write( *,101) a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
write( 10,101) a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
write( 11,101) a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
みたいな文を一行でまとめたいのです

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

変数をまとめたいなら配列nにa-zを代入すればできる
0641デフォルトの名無しさん垢版2014/10/18(土) 07:53:57.67ID:py32Gd52
fortranからRを呼び出すようなことはできないでしょうか?
system call?からRを呼び出すぐらいしかないでしょうかね?
0642デフォルトの名無しさん垢版2014/10/18(土) 08:55:47.73ID:XNaq3m/i
gnuplotでもそうだが
Rのソースをfortranで生成するようにして
system callから実行させればいいだろ
0645デフォルトの名無しさん垢版2014/10/19(日) 01:11:43.08ID:66Dn4RCH
たしか coarray を使うとプロセスが複数走って、それぞれのプロセスで
別々にI/Oできるから形式上は1行でできるぞ。
まぁこれがやりたいことではないのは重々承知だがwww
0648デフォルトの名無しさん垢版2014/10/20(月) 01:10:20.17ID:Q283dmtl
区間指定ってなんだよw 
maxlocのことか?それともmaxval(a(20:20))のことか?

他人に理解できる表現で頼むぜw
0650デフォルトの名無しさん垢版2014/10/21(火) 08:48:40.55ID:RmR2qSHy
>615
亀レスですが、最適な刻み幅については、

森口繁一『数値計算術』に
「題4章 刻み幅の自動調節」
という記述があります。
ご参考までに
0652デフォルトの名無しさん垢版2014/10/23(木) 00:20:38.34ID:uxreCuFc
>>650
ありがとうございますm(__)m
さっそく買わせて頂きました。
まだ手元に届いてないですが、その章は結構ページ割かれてますか?
0656ホモおじさん垢版2014/10/24(金) 00:54:53.39ID:vm5n6mmb
>>655
お安い御用さ。
おじさんに何でも聞いて呉れ玉へ!

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

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

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

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

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


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

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

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

刻み幅に使いたいんですが中々思いつかないですm(__)m
0664デフォルトの名無しさん垢版2014/10/30(木) 00:25:40.34ID:BI8qle6I
>>663
つまりは足し上げて1に収束するような数列を知りたいんです。

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

これだと収束スピードが速すぎるので、もう少し緩めに収束する数列を知りたいんです
0665デフォルトの名無しさん垢版2014/10/30(木) 22:03:37.99ID:jLdY1ojF
intel fortran compilerが、非商用版があると聞いたんですけど
ホームページに行ってもありませんでした
もう非商用版は終了したんでしょうか
0668デフォルトの名無しさん垢版2014/10/30(木) 23:46:30.56ID:BI8qle6I
>>667
ttp://pen.agbi.tsukuba.ac.jp/~RStiger/hiki2/?Fortran+(Intel+Parallel+Studio+XE)+%A4%CE%A5%A4%A5%F3%A5%B9%A5%C8

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

ttp://registrationcenter-download.intel.com/akdlm/irc_nas/4584/parallel_studio_xe_2015.tgz
0672デフォルトの名無しさん垢版2014/11/02(日) 10:01:51.45ID:P1O0Zm4b
>669
御呈示のアドレスはLinux版ですが、Windows版
について情報をおもちではないでしょうか
0677デフォルトの名無しさん垢版2014/11/16(日) 23:31:47.83ID:jtA73LXf
2つの実測値の相関係数を出したいのですが、
fortranでできないでしょうか
実測値は単純な直線傾向ではないです
エクセルで手動でやることも考えたのですが、
実測値が100ケースほどあって、
今後も増えることを考えるとプログラムで作りたいと思いました
もしよければアドバイスいただけないでしょうか
0678デフォルトの名無しさん垢版2014/11/17(月) 09:46:48.96ID:vGRlOVoS
>>677
Rを使用するのが一番手っ取り早いと思います。
Rを調べてみてあなたのやりたいことができそうなら、あえてプログラムを作る必要もないのでは。
0680デフォルトの名無しさん垢版2014/11/17(月) 18:52:41.93ID:yxNOhCMR
>>678,679
いろいろソフトがあるのですね。
調べて試してみようと思います。ありがとうございました。
0681デフォルトの名無しさん垢版2014/12/13(土) 01:43:27.96ID:IhMrPb/B
Fortranで書かれている遺伝的アルゴリズムのライブラリが
手に入るところはないでしょうか
0683デフォルトの名無しさん垢版2014/12/15(月) 00:30:38.37ID:+0+wnp46
MPICH または OPENMPI で Fortran2008 bindings を使う方法を教えろ下さい。
ドキュメントにはサポートと書いてあるが、インストールしても MPI_F08.MOD が
生成されない@Ubuntu

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ところでfortran2003の機能すべてカバーしてるコンパイラは商用しかないのかな。
gfortran使いなんでカナピー(´・_・`)
0709デフォルトの名無しさん垢版2015/01/04(日) 20:02:59.44ID:1HVLEOms
商用だけですな
しかし商用Fortranコンパイラは趣味で買うには高すぎるので
gfortranが対応してる範囲で書いてます
0712デフォルトの名無しさん垢版2015/01/05(月) 11:27:48.33ID:dcVDuqIP
>>710
勉強用なら
VirtualBox(個人使用は無料だったハズ) + Ubuntu日本語Remix仮想ハードディスクイメージ
で、とりあえずLinux環境作っちゃうのも手なんかね

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

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

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

コンパイラとリンカに与えるべきオプションは,それぞれ,どうやって見分けたら良いんでしょうか?
0724デフォルトの名無しさん垢版2015/01/20(火) 16:42:37.43ID:kWeIi6xm
すみません。本読んだりGoogle等で調べましたが、いまいちわからなかったので質問させてください。
result.datというデータの中にある本来17行21列で表示するデータが
#(A,B)

(1,0)
  ・
  ・
  ・
(17,0)
(0,1)
  ・
  ・
  ・
(17,1)
(0,2)
  ・
  ・
 ・
(17,2)
 ・
 ・
  ・
(17,20)
というように1列で表示されているデータがあります。
openを使ってこれを読み込んで本来の17行21列の形にして別のデータとして出力したいのですが、
どなたか知恵をお貸しいただけませんか?またできればデータの(A,B)のAの部分だけ、Bの部分だけを取り出したいのですが、
どうすればよいのでしょうか?
0727デフォルトの名無しさん垢版2015/01/20(火) 17:39:47.89ID:kWeIi6xm
>>725

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

fortran 4.8.1

program test

real(16) :: D2R

D2R = 0.0174532925199432957692369076848861271344_16

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

end program test
を実行すると
1/e= 0.367879441171442321595523770161460873
cos(30)= 0.866025403784438646763723170752936161
という答えが得られます
少なくとも30桁以上の精度がでているとおもいますが、
0733デフォルトの名無しさん垢版2015/01/27(火) 15:08:58.38ID:TDQ9+ev7
>>730
もう解決しているかも知れないけれど、処理系がFortran2008と4倍精度をサポートしていれば
iso_fortran_envモジュールのreal128という定数を使う言語仕様に準拠した方法がある。

program qfloat

use iso_fortran_env
implicit none

real(kind = real128) :: q

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

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

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

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

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

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

関係ないが気になったのでつい
0738デフォルトの名無しさん垢版2015/02/04(水) 05:53:12.64ID:Y9ZHS9LP
ちょいとみなさんのお知恵拝借させてもらえたら幸い。

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

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

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

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

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

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

よろしくお願い申し上げます。
0741デフォルトの名無しさん垢版2015/02/04(水) 21:21:39.45ID:1jln5owW
求めた解はどこかで使うんでしょ?なら,使う直前にwrite文を書けばいいのではないか?

というか,
>二分法かなんか
『なんか』ってなんだ?そんなきき方でどう答えろというんだろうか?
その例の書き方だと,そもそも二分法の使い方を理解しているのかと,そっちの方が心配になる.
0742738垢版2015/02/10(火) 07:40:57.77ID:dNNycAes
>>741
すまん!書き方悪かった。
「なんか」と書いたのは二分法等イテレーションする場合と言いたかった。
0743デフォルトの名無しさん垢版2015/02/11(水) 01:54:42.49ID:rsWy3Hp4
debugをしたら
user breakpoint called from code at 0x7c94120e
と出てきたのですが、どういった意味なんでしょうか
0746デフォルトの名無しさん垢版2015/02/11(水) 10:40:19.88ID:I3RcppAe
>>743
デバッガがプログラムを呼び出して実行してブレークポイントに到達して止まった
つまり意図通り
ブレークポイントを誰がどうやって設置したかは環境次第
0749デフォルトの名無しさん垢版2015/02/15(日) 01:10:05.40ID:g8pHAe2n
Rの関数(cor(x,y)など)をFortranプログラム上で使えるようにできないでしょうか
Rに入っている関数のsoファイルを利用してなどできたりしないでしょうか
0750デフォルトの名無しさん垢版2015/02/15(日) 13:38:58.18ID:TAercYgC
>>749 あなたは Fortran ではなく R を使うべきなのではないのでしょうか
0753デフォルトの名無しさん垢版2015/02/15(日) 22:03:52.96ID:/BGdl65O
そもそもFORTRANにはRなんか手も足もでないような統計ライブラリが存在するはずだが
0754デフォルトの名無しさん垢版2015/02/16(月) 00:11:19.19ID:cFBQlJ5l
>>753
IMSLかMKLの統計サマリーですかね?
使いたいのは比較的新しめの統計量で、
そこには用意されていないけどRにはあったので・・
0756デフォルトの名無しさん垢版2015/02/19(木) 01:32:20.14ID:Q9g/vdpG
今更ながらなんだがフォートランとオクターブの組み合わせ最高だよな。
今まではfortran とgnuplot だったけど
0761デフォルトの名無しさん垢版2015/02/24(火) 12:10:45.71ID:dL6o6kyB
3/3から2chのapi始動するけど移住しなくても大丈夫かね
とりあえずdat廃止されるまではここはNavi2chで巡回するけど
0763デフォルトの名無しさん垢版2015/02/27(金) 19:13:57.57ID:8CupuJ11
とりあえずおーぷん2chにたてるだけたてといた
http://toro.open☆2ch.net/test/read.cgi/tech/1425031440/
(☆はNGワード対策)
何事もないことが一番だけどそんときは避難所代わりに使ってください 現に今人多杉状態だけど
ここ質問スレだけど他にfortranスレないしfortran全般に関する喋り場ならおーぷんでいいよね?転載嫌いとかアフィリエイト嫌いとかのひとがいたらすまんが

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

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

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

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

どーすんべ?
0779デフォルトの名無しさん垢版2015/04/28(火) 17:28:05.66ID:iBflpoE2
MinGWのGCC4.9.2ののFORTRANで, -fcase-upperのようなオプションってありますかね?
昔のバージョンにはあったみたいなんですが, 現在のは削除されたようで.
0782デフォルトの名無しさん垢版2015/05/11(月) 01:47:31.11ID:XHL5HbZn
え、gfortranに利点なんかあるの?
ああ、うん、gccツールチェインの一部なのは便利だよね
0783デフォルトの名無しさん垢版2015/05/11(月) 06:54:00.10ID:qOqdHGiK
ハードウェアで二倍の性能出す金払うくらいだったら、Intelのコンパイラ買えよ。
ソフトには金出せないってどんだけ唯物論のアカなんだよw
0788デフォルトの名無しさん垢版2015/05/31(日) 01:15:28.56ID:dBkTICLM
ここでの質問は学生がほとんどのように見える
一般人は使わないだろうから少ないのは確かだろうけど
調べたり相談できる人が多いんじゃない?
0790デフォルトの名無しさん垢版2015/06/05(金) 00:40:30.28ID:rgF7y0m6
fortran の組み込み関数でminval ってのがありますよね.
ある配列a(要素は一つだけ)に関して
minval(a,dim=1,mask=a>0.0d0)すると値が1e-324みたく値がおかしくなるんですが原因として考えられるものは何でしょう?
ちなみに配列aの中身は
a(1)= 4.2e-2です。
なので期待する値は
minval(a,dim=1,mask=a>0.0d0)=4.2e-2になるはずなんですが。。。
0791デフォルトの名無しさん垢版2015/06/05(金) 01:52:18.65ID:rTO63fPn
>>790
なんとなく初期化してない変数が引っかかっている気がする
minvalの動作不良を疑うならコンパイラとか環境を書こう
違うならソースをできるだけ書こう
長くてソース貼れないならこんな感じに晒すと検証が楽
https://ideone.com/JstGnQ
0792デフォルトの名無しさん垢版2015/06/05(金) 23:13:40.04ID:zCKBsI7m
>>790
単精度を入れているのに倍精度で値が返ってきているのが気になる。
なんか倍精度と単精度をまぜこぜにしているか、コンパイラが間違っていてまぜこぜにしている。

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


https://ideone.com/m11vQN

こんな感じかな?
program test2ch
implicit none
real(8) :: a(1)
real :: b(2)
equivalence(a, b)
b(1) = 4.2e-2
b(2) = 0.0e0
print *, minval(a, dim = 1, mask = a > 0.0)
end program test2ch
実行結果
5.070575254129006E-315
0794デフォルトの名無しさん垢版2015/06/06(土) 01:24:14.49ID:pgwiShP2
変数に値が入ってるかどうかの判断ってどうしてる?ポインタとか使わずになんかNull かどうか?っての判断できんのかね?
ちなみにgfortran 4.2 でDebian 8.0 64bit版での話なんだが。
0796デフォルトの名無しさん垢版2015/06/06(土) 05:09:32.95ID:pgwiShP2
>>795
>>794 ??
>ASSOCIATED とか ALLOCATED じゃダメなのか?
配列やらポインタ使えってこと?

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

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

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

ソフトウェアの板でいうと叱られるかもしれないが、
時間かけるならプログラム言語の勉強するより専門分野の勉強する方がいい。
0808デフォルトの名無しさん垢版2015/06/19(金) 22:45:09.43ID:JdldsSpH
挑発されてるようで不快だが

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

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

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

! 同じファイルを今度は読み込み用にオープンする
open(18,file='mydata.dat', status='old')
read (18,*) i, j, k
print *, i, j, k
read (18,*) i
print *, i
read (18,*) i, j
print *, i, j
close(18)
end program fileIO
0815デフォルトの名無しさん垢版2015/07/10(金) 21:48:52.27ID:/GzszqMd
次のエラーが出ました。

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

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

100 200 300
400
500 600

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

とりあえず別のコンパイラを試してみます。
0819デフォルトの名無しさん垢版2015/07/12(日) 01:05:05.43ID:yuQPCUFW
ファイルggshoki.f90に、800成分の配列を返すサブルーチンggshokiを書き、他のファイルと一緒にコンパイルしたところ、


ggshoki.f90:1:20:

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


というエラーが出てしまいました。
どう直せばいいのでしょうか。アドバイスお願いします。
0820デフォルトの名無しさん垢版2015/07/12(日) 01:10:26.47ID:yuQPCUFW
上げてしまいました、すみません。

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

です。
0823デフォルトの名無しさん垢版2015/07/15(水) 01:28:37.71ID:yskKzL3L
>>822
リンク先のように書いたらうまくいきました。
自分のプログラムの他の部分も確認したところ、配列の書き方が全て間違っていました(配列A(1:N)をA(N)などと書いていました)。
ありがとうございました。
0824デフォルトの名無しさん垢版2015/07/28(火) 11:53:11.24ID:J4RVztBC
教えてください。
サブルーチンに渡された配列引数2つが同一かどうか
(値が同じかどうかではなくて、値を格納するアドレスが同じかどうか)
を確認するすべはありますでしょうか…?

ポインタとか使えるのでしょうかね?よく分かっていません。
0825デフォルトの名無しさん垢版2015/07/28(火) 12:08:17.55ID:J4RVztBC
自己解決してしまいました…

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

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

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

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

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

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

IF(J-K) 2,3,2
3 B(J)=1./Y
C(J)=1.
GOTO 4
2 B(J)=-A(K,J)/Y
C(J)=A(J,K)
4 A(K,J)=0.
0839デフォルトの名無しさん垢版2015/08/16(日) 09:08:04.74ID:ZKNwH6b8
>>838
私が素人というのもあるのですが、いくつかのFortranのHPみてもIF文の説明には
入っていませんでした。
0840デフォルトの名無しさん垢版2015/08/16(日) 12:29:13.36ID:nCIMfI1D
>>869
ただしくは、算術IF文というものです。あるサイトの解説です
古い書き方に算術IFというものがあります。 この書き方はFortranでは廃止予定機能ですが古いプログラムには見かけられる書き方です。
算術IF文は、与えた式が0より小さい場合に最初の文番号へ、 0の場合は2番目の文番号へ、 0よりも大きい場合には3番目の文番号にジャンプします。
if ( 式 ) 文番号1, 文番号2, 文番号3
例)
i = -1
if (i) 100, 200, 300 ! 100へジャンプします
0841デフォルトの名無しさん垢版2015/08/16(日) 21:04:42.30ID:mdNdQhdt
古文読解みたいなもんよ。
新たに使うことは無いが、昔のプログラム読む為の教養みたいなもん?

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

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

Backtrace for this error:
#0 ffffffffffffffff
#1 ffffffffffffffff
#18まで同文
OS:Windows7(64bit)
コンパイラ:gfortran
よろしくお願いします
0844デフォルトの名無しさん垢版2015/08/24(月) 07:17:38.92ID:lgtNqCAf
再び申し訳ありません。
gfortranのverを落としたら普通にできました。何度もすみませんでした。
0845デフォルトの名無しさん垢版2015/10/14(水) 21:51:47.29ID:S/4UaJI2
intelコンパイラのDAALをFortranから
なにかしらの形で呼び出してうまくいった方いませんか?
0846デフォルトの名無しさん垢版2015/11/08(日) 17:44:21.58ID:jBmnCoB4
fortranで簡単なguiウィンドウ作れたりしますか?
ウィンドウがあってこのボタンを押すと〜〜のサブルーチン実行のような・・・
0847デフォルトの名無しさん垢版2015/11/08(日) 18:57:35.01ID:8suWMXlm
>>846
visual fortranにRADがあったような気がする
けど、Fortranで計算部分をライブラリ化しておいて
別の言語で作ったGUIで呼び出す方が一般的だと思う
0848デフォルトの名無しさん垢版2015/11/09(月) 22:25:56.92ID:oiX/fj8U
>>847
ありがとうございます
やっぱり流行りの言語も使ってみたいと思います
0849デフォルトの名無しさん垢版2015/12/15(火) 21:50:10.22ID:CN0jNpr8
基本的な質問かもしれませんがfunctionとsubroutineで作るのってどう切り分けたらよいのですか?
0852デフォルトの名無しさん垢版2015/12/16(水) 00:28:34.56ID:dxIuSVrg
例えばファンクションのほうがその度に呼び出すために計算速度は遅くなるとかありませんかね・・?
0854デフォルトの名無しさん垢版2015/12/16(水) 06:34:20.84ID:qB4UYIzV
中身が分からないunformattedで出力されたファイルを読むにはどうすればいいですか?
0856デフォルトの名無しさん垢版2015/12/16(水) 23:02:21.81ID:a/dQTwEW
>>849
function は副作用(PURE の時)がないとき、それ以外なら SUBROUTINE が基本かな。
コンパイラの最適化の観点から、数学的な意味での関数になっているときに使うのがいい。
0857デフォルトの名無しさん垢版2015/12/25(金) 14:17:27.29ID:H3s+gts8
今二分法のプログラム書いているんだけど、うまく収束しなくて困ってるのでここで質問させてください

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

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

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

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

ある程度計算を進めると、区間[x1, x2]において、その中点 (x1+x2)/2の値が一定となってしまいます。
0861デフォルトの名無しさん垢版2015/12/25(金) 19:21:54.92ID:H3s+gts8
>>859
今4倍精度に宣言して計算終わったところです!
一定になるところは変わりましたが、計算を進めるとやはり中点が一定になります。。。
0863デフォルトの名無しさん垢版2015/12/26(土) 01:22:24.79ID:ybGnykyB
>>859,861
ちょーーー!!
8倍精度とか16倍精度と違うから! 
普通はバイト数だから8で倍精度、16で4倍精度。
まぁ数値はベンダー依存で規定されていないから、あんたらのコンパイラが
8倍精度や16倍精度なのかもしれないがさw

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

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

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

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


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

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

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

例えば、

program main
implicit none
double precision:: a, stat

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

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

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

logx(i+1)-logx(i)=刻み幅 ということですか?
0888デフォルトの名無しさん垢版2016/02/17(水) 18:55:07.86ID:NfIkV94M
そもそも問題がわからないから答えようがないな。
たとえば被積分関数が 1d-20 から 1d8 まで振れる場合は小さい値はどうでもいいし。
0889デフォルトの名無しさん垢版2016/04/25(月) 20:15:29.39ID:ABiBIEuQ
一次元ポアソン方程式

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

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

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

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

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

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

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


The Covenant Project
概要

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

目的

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

特徴

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

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

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

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

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

100 format ( i5,2f10.6)

に替えたら

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

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

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

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

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

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

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

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

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

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

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

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

なお、温度の変化を追いかける計算ではないので、参考にならないかもしれない。
0927デフォルトの名無しさん垢版2017/03/24(金) 22:05:30.22ID:rSyKPFXl
どなたかご存知の方いらっしゃいますでしょうか?
コンパイラのバグではなく何らかの仕様なのかと思うのですが分かりませんでした。
●質問
実数型の変数をwrite文で桁数を指定して出力させる時、
桁数以下の値は四捨五入されて出力すると思うのですが、
下記プログラム例のように”切り捨て”られる(と思われる)場合があります。
なぜこのような処理がされるかご存じであれば教えて頂きたいです。
●プログラム
PROGRAM TEST
IMPLICIT NONE
REAL*8 VAL1
  VAL1=0.125D0
  WRITE(6,'(D13.2)')VAL1
END PROGRAM
●結果
0.12D+00
●問題点
・0.125の小数点第3位を四捨五入すると0.13となるが結果は0.12となってしまう
●確認したこと
・変数VAL1の桁を増やして確認すると0.12500000000・・・と続く
・0.125は2進数で正確に表す事ができる
・下記のように2進数で正確に表せない数値だと四捨五入が理解できる
 入力値 VAL1=0.555D0
 結果 0.56D0
 結果(桁を増やす)0.555000000000000048849813083507D+00
・2進数で正確に表せる数値でも正しく四捨五入されるものもある
 入力値 VAL1=0.375D0
 結果 0.38D0
 その他 0.0625D0も正しく四捨五入される ⇒ 0.63D-1 と出力される
・Fortranコンパイラは、Compacfortranやredhatのgfortran、IntelFortranを試したがいずれも同じ結果だった
・単純な数値なので32bitや64bit環境の問題では無いと思います
・.f90でのみ試しています
0929デフォルトの名無しさん垢版2017/03/25(土) 04:11:14.28ID:ESyR2hOs
どうもありがとうございます。
ROUNDで丸め誤差を色々定義出来るのですね。
来週試してみます。
0930デフォルトの名無しさん垢版2017/12/10(日) 04:57:11.71ID:cAgVc7bQ
fortranにはなんで引用仕様宣言なるものがあるんですか?
関数の引数等を関数の定義からコンパイラ勝手に読み取れば良いと思うんですが、moduleでできて手続きだとわざわざ自前で書かなきゃいけない理由って何かあるんですか?
0931デフォルトの名無しさん垢版2018/02/26(月) 23:36:28.70ID:TZ3KPlNh
普段形状引き継ぎ配列を使っているのですが、blasやlapackを使ってarray-temporariesをつけてコンパイルすると、コンパイル時にarray-temporariesのワーニングが出ます。
blasでは形状引き継ぎ配列を使っていないしモジュール内にあるわけでもないので当然と言えば当然なのですが、こういう時にどうするのが良いのか分からず困っています。ベストプラクティスのようなものはあるのでしょうか?
0932デフォルトの名無しさん垢版2018/04/29(日) 22:24:59.24ID:tKjITkqe
永い時を経て多分自己解決出来ました
Contiguous なんていうオプションがあるのですね
0934デフォルトの名無しさん垢版2018/05/13(日) 14:08:02.04ID:44h/7/Ui
一応
0936デフォルトの名無しさん垢版2018/05/23(水) 19:23:38.59ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

SAWKX
0938デフォルトの名無しさん垢版2018/07/04(水) 22:53:55.75ID:gFgZc5FG
DG2
0941デフォルトの名無しさん垢版2018/12/10(月) 01:43:09.35ID:Y2cLB9FR
何故文関数、
f(x) = 1. / x
のような記法が非推奨と言われるのでしょうか?(nag等のサイトより)
他の言語のlambda式などと比べて、Fortranでは非常に簡潔に簡易な関数を定義できるものだなあ、
と感心していたのですが…
0942デフォルトの名無しさん垢版2018/12/10(月) 02:41:51.30ID:O61+1QOk
>>941
書き易さより読み易さが優先
気象庁の標準コーディングルールより
文関数
 文関数は引用仕様が暗黙的であり、デバッグがしずらくなる。また、文関数 自体や文関数定義が後続する文関数を引用してはならないなどの制限がある。 内部関数として書いた方がよい。
http://www.mri-jma.go.jp/Project/mrinpd/coderule.html

関数、変数は明示的な宣言をしてから使うのが今風
個人で読み返さないプログラムなら何やっても正常動作すれば良いよ
0943デフォルトの名無しさん垢版2018/12/10(月) 13:01:17.07ID:Y2cLB9FR
>>942
ありがとう、正直大きなプログラム書かないので実感が湧かないけど、そういうものか
0945デフォルトの名無しさん垢版2019/01/16(水) 19:01:22.83ID:xonbbP95
2018も出たことだし若い血も入ってくる
乗ってるな
0946デフォルトの名無しさん垢版2019/01/24(木) 20:16:05.77ID:oJ91kE1a
本当に初歩的でかつ自分勝手で申し訳ないのですが、fortran90でn次正方行列の逆行列を求めるプログラムを教えていただけませんか?
0947デフォルトの名無しさん垢版2019/01/24(木) 20:26:04.65ID:/BXejuIU
それは数値計算の永遠の課題で万能の処方箋は無い
勉強の為ならWikipediaでも見ながら愚直にガウスの掃き出し法でも実装してみたら
0948デフォルトの名無しさん垢版2019/01/24(木) 20:38:47.14ID:/BXejuIU
求めたいだけなら大体の環境でmklが一番いいライブラリ
有名なので比較的読みやすいのはLINPACKだけど77仕様
モダンで簡単な実装ならあちこちのブログに載ってるからググれ
0949デフォルトの名無しさん垢版2019/01/24(木) 20:44:04.96ID:/BXejuIU
一応貼っとく
http://www.netlib.org/linpack/
お好みのシチュ用のソースが読める
インデクスと要素毎演算でDOは殆ど排除できるはず
0950デフォルトの名無しさん垢版2019/01/25(金) 11:23:51.25ID:nTExwXep
>>946
宿題は宿題スレへ
0951デフォルトの名無しさん垢版2019/01/25(金) 11:43:59.45ID:e9L7JHld
スレ索してみたけどFortranスレもしかしてここしか無くね

ぜひLINPACK読んで逆行列の疑問書いてくれ
布教のチャンス
0953デフォルトの名無しさん垢版2019/01/25(金) 13:01:21.60ID:e9L7JHld
LAPACKは使うけどコードは最適化されてて汚い
0955デフォルトの名無しさん垢版2019/01/26(土) 02:23:28.24ID:Z89DHn3T
質問です。
ファイル名 *.f90 とは別に、プログラム名 program * がありますが、この二つが同じ名前だと、何らかの不具合・不便に繋がったりするのでしょうか。
私は、修正前後を比較するためにバージョン違いを作るような場合を除き、基本的に両者を同じ名前にしているのですが……
0956デフォルトの名無しさん垢版2019/01/26(土) 11:12:15.29ID:yVAkGzul
むしろ同じにしといた方が無難
0958デフォルトの名無しさん垢版2019/01/26(土) 13:53:32.02ID:6SK3WITg
ファイルシステムの無い時代、例えばパンチの名残だろうかね
0959デフォルトの名無しさん垢版2019/02/08(金) 00:44:25.09ID:YfKMGwNZ
環境は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名を二回記述しなければならない」という無駄が解消できず……
何か、巧い方法はないのでしょうか。
0960デフォルトの名無しさん垢版2019/02/08(金) 01:15:11.98ID:YfKMGwNZ
すみません、一応自己解決しました。
指定子に文字型の変数を与えることができる、ということに先ほど気づきました。
なので「一度closeする」で問題ありませんでした。
name1 = 'foo.dat'としておいて、
open文に file=name1 とでも書けば済む話でした(つまるところ、ファイル名変更時の手間が一番の問題だと考えていたので)。
0961Linux ペンギン垢版2019/02/08(金) 23:01:52.12ID:DyJ7QOpE
lapack インスコ方法教えてんか?
0962デフォルトの名無しさん垢版2019/02/28(木) 02:25:49.99ID:43+kEwYn
>>961
mklが手軽かつ最速だがクソでか&環境依存
配布も考えるならソースをnetlibでwget -r url
ラッパのLAPACK95もあると便利
0963デフォルトの名無しさん垢版2019/02/28(木) 13:08:32.71ID:43+kEwYn
>>956
遅レスだけど、program名って何か意味あるんかね?
program書かないでも動くし(endは必要)、programは他から呼ばれないし

moduleやsubroutineの名前は呼ぶのに大事だけど
ファイル名はinclude "fname"で使うから意味ある
0964デフォルトの名無しさん垢版2019/05/02(木) 22:03:24.81ID:bI33l//4
他人が作ったコードで、
real*4 宣言を全部real*8に書き換えたら、
計算結果がNaNになっちゃったんだけど、
どんな原因が考えられますか?
0965デフォルトの名無しさん垢版2019/05/03(金) 14:28:23.81ID:3Vz/qKoh
色々

教えて欲しかったらソース出せ
0967デフォルトの名無しさん垢版2019/06/22(土) 10:06:49.78ID:ecTKxvDL
Fortranは1956年?だかに作られたそうだけど
当初からクラス設計とかあったの?
0968デフォルトの名無しさん垢版2019/06/22(土) 10:33:22.05ID:fiI8bn9U
データベースに合わせたORMみたいな
メンバーとか何かあった気がするが
クラスは無いんじゃね
0970デフォルトの名無しさん垢版2019/09/20(金) 07:30:20.40ID:TGCjU1pt
Moduleで継承みたいなことってできないんでしょうか?

module mod1
integer,parameter :: val1 = 20
end

module mod2
use mod1
end

program main
use mod2

print *, val1
end

みたいな
このままだとエラーですけど
0972デフォルトの名無しさん垢版2019/09/20(金) 11:49:11.89ID:TGCjU1pt
>>971
まじですか。
やってみます!
0973デフォルトの名無しさん垢版2019/12/05(木) 20:26:57.24ID:5HmbMnOR
今更fortran使う必要が出たんですけど宣言全部冒頭でやらなきゃいけないとか読みにくいにもほどがあるなこの言語……
ただdllでもない生のCファイル普通に使えるのちょっと強すぎじゃない。何これ
0974デフォルトの名無しさん垢版2019/12/06(金) 10:25:38.93ID:uUae0oO6
JULIAやれ
0975デフォルトの名無しさん垢版2019/12/09(月) 23:37:38.73ID:PezMDr0C
C++に移植する作業をしてるんだが、fortranは配列が1スタートなのと行優先なのまじで糞だと思う
0977デフォルトの名無しさん垢版2019/12/10(火) 13:53:20.70ID:48kVELqA
openglも行優先だっけ
0978デフォルトの名無しさん垢版2019/12/14(土) 01:16:23.48ID:llZnx091
read/writeの装置番号というのに衝撃を受けたんだけど
いや整数を振るって……えぇ……他の言語でこんなん見たことねぇよ……
0979デフォルトの名無しさん垢版2019/12/14(土) 02:29:00.89ID:U3Y+OMfv
ここで言語仕様に文句言ってもどうしようもないだろ……
整数型の変数も使えるから自分で値を付けれるハンドルと考えれば良い
0980デフォルトの名無しさん垢版2019/12/14(土) 10:56:06.61ID:oHNLq8G6
Cでもstdin=0,stdout=1,stderr=2とかやってるやん?
0982デフォルトの名無しさん垢版2019/12/15(日) 02:31:50.39ID:XiowEuWl
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の書き方なのかなぁって
個人的には後者の方がいいのではと思うんですよね
0983デフォルトの名無しさん垢版2019/12/15(日) 08:10:55.00ID:ZURMU7Y0
副作用が無いならfunction、あるならsubroutine
例えばsinやcosはfunctionだけどrandom_numberは内部状態を書き換えるのでsubroutine
0984デフォルトの名無しさん垢版2019/12/15(日) 12:59:16.65ID:o9m7qUoD
戻り値の有無やろ
0987デフォルトの名無しさん垢版2019/12/15(日) 23:49:42.99ID:BpbcQxvZ
前提として初心者がどちらにするか迷った時の話で
非pure関数を同じ文中で複数呼んだら評価順の影響を受けて悩みの種になるというのがあるから
副作用があれば全部subroutineぐらいの割り切りでいいと思う
0989デフォルトの名無しさん垢版2020/01/09(木) 14:06:43.45ID:Rw5gLjBx
cigwin64ターミナルでコンパイルしようとすると
Winmain関数への定義がされてないって言われるんだけどどうしたらいいですか?
0991mac垢版2020/02/01(土) 22:13:14.55ID:Q+QKuWIk
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.
0993mac垢版2020/02/03(月) 06:48:44.07ID:lEGOKPCQ
読んでみました。
libisl.21.dylib を読み込もうとしているのですが、
libisl.22.dylib におそらく対応ファイルが変わってしまったようです。
読み込み先を libisl.21.dylib → libisl.22.dylib に変更するにはどうしたら良いのでしょうか? 
0994デフォルトの名無しさん垢版2020/02/03(月) 11:41:24.71ID:62FLJlST
libisl.22.dylib を libisl.21.dylib に rename
0995mac垢版2020/02/04(火) 13:54:57.85ID:5KrL780U
コンパイルできるようになりました!
ありがとうございます!
0996デフォルトの名無しさん垢版2020/02/05(水) 02:53:14.67ID:hA2ZuT5R
並列計算のコマンドを do loop 内に入れると,配列ごとに計算できないのね。。。
なんか妙案あるのかな
10011001垢版Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 2789日 7時間 41分 53秒
10021002垢版Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況