このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
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/
くだすれFORTRAN(超初心者用)その6
■ このスレッドは過去ログ倉庫に格納されています
2012/08/16(木) 20:58:00.31
186デフォルトの名無しさん
2013/05/17(金) 18:02:03.27 >>182
そこに張られているものは問題ないと思う。
エラーメッセージはサブルーチンexsubが無いと言っているので、
call しているプログラムが exsub1,exsub2 になっておらずexsub になっていると思われる。
たぶんファイルのセーブ違い、コンパイル違い。
インターフェース+野良サブルーチンにするより、
サブルーチンは module に入れて module を use するのがふつう。
インターフェースは、外部ライブラリとか、関数引数みたいな場合以外は
出番なくてよし。
>>180-181
最新版の intel compiler ならエラーを出す。
ただし宣言元の配列の方が大きくて、サブルーチン側の配列がその中に納まるなら
問題は無いので何も警告しない。
そもそも66時代には、サブルーチン側の配列を10とかに宣言して
サイズの不整合を気にしなかったし、77で整合配列が導入されても
66時代からの習慣などで、整合性は気にしなかった。
配列サイズの整合に姑根性でうるさくされると、昔のプログラムが動かなくなるので
皆困る。おおらかに行こうぜ!
気になるなら、仮引数の終端の方を宣言しなければ、自動でコンパイラ様が
適宜取り計らってくれる。
real, intent(in) :: x(0:) みたいな。
>>184
書いたファイルの中身が見たければアクセスとか指定せずデフォでいけ。
(シーケンシャルアクセス)
write文は自由フォーマットwrite(1,*)で。
そこに張られているものは問題ないと思う。
エラーメッセージはサブルーチンexsubが無いと言っているので、
call しているプログラムが exsub1,exsub2 になっておらずexsub になっていると思われる。
たぶんファイルのセーブ違い、コンパイル違い。
インターフェース+野良サブルーチンにするより、
サブルーチンは module に入れて module を use するのがふつう。
インターフェースは、外部ライブラリとか、関数引数みたいな場合以外は
出番なくてよし。
>>180-181
最新版の intel compiler ならエラーを出す。
ただし宣言元の配列の方が大きくて、サブルーチン側の配列がその中に納まるなら
問題は無いので何も警告しない。
そもそも66時代には、サブルーチン側の配列を10とかに宣言して
サイズの不整合を気にしなかったし、77で整合配列が導入されても
66時代からの習慣などで、整合性は気にしなかった。
配列サイズの整合に姑根性でうるさくされると、昔のプログラムが動かなくなるので
皆困る。おおらかに行こうぜ!
気になるなら、仮引数の終端の方を宣言しなければ、自動でコンパイラ様が
適宜取り計らってくれる。
real, intent(in) :: x(0:) みたいな。
>>184
書いたファイルの中身が見たければアクセスとか指定せずデフォでいけ。
(シーケンシャルアクセス)
write文は自由フォーマットwrite(1,*)で。
187デフォルトの名無しさん
2013/05/17(金) 18:14:46.78188デフォルトの名無しさん
2013/05/17(金) 18:29:07.70 direct access は、大量のレコード長(データの長さ)が等しいデータを
書き出しておいて、読み出し/書き換え時に、ランダム位置に直接そのデータを
読みに行くときに使うもの。
普通に不定長のデータをファイルにだらだら書き出して、読み出す時も前から順番に
たらたら読み飛ばしつつ、欲しいデータを探して行くときは、
デフォルトのシーケンシャル・アクセスファイルでいい。
また、人間がファイルを覗いたりするなら、フォーマットを指定して/自由形式にして
読み書きすればいい。
write(1, '(2f15.7)') x,y
write(1, *) x,y
ファイルサイズを小さくかつ高速にアクセスしたいときは、
write文でフォーマットを指定せず、内部表現で読み書きするが、
write(1) x,y
書き出しておいて、読み出し/書き換え時に、ランダム位置に直接そのデータを
読みに行くときに使うもの。
普通に不定長のデータをファイルにだらだら書き出して、読み出す時も前から順番に
たらたら読み飛ばしつつ、欲しいデータを探して行くときは、
デフォルトのシーケンシャル・アクセスファイルでいい。
また、人間がファイルを覗いたりするなら、フォーマットを指定して/自由形式にして
読み書きすればいい。
write(1, '(2f15.7)') x,y
write(1, *) x,y
ファイルサイズを小さくかつ高速にアクセスしたいときは、
write文でフォーマットを指定せず、内部表現で読み書きするが、
write(1) x,y
189182
2013/05/17(金) 18:52:41.78 >>186
ご指摘ありがとうございます。U島氏の本にて学習中の身です。
ソースを見直し改めてコンパイル、ビルドしましたが、
外部サブルーチンが読めないと警告してきます(もちろん実行はエラー)。
gfortranですと何の問題もないのですが・・・
上に貼ったものは、gfortranで通ったものを試したもので、
実は、ftn95環境下では、real(8)は、real(kind(1d0))へと正されました。
ひょっとするとまだ、当方が何か見落としているのでしょうか??
ご指摘ありがとうございます。U島氏の本にて学習中の身です。
ソースを見直し改めてコンパイル、ビルドしましたが、
外部サブルーチンが読めないと警告してきます(もちろん実行はエラー)。
gfortranですと何の問題もないのですが・・・
上に貼ったものは、gfortranで通ったものを試したもので、
実は、ftn95環境下では、real(8)は、real(kind(1d0))へと正されました。
ひょっとするとまだ、当方が何か見落としているのでしょうか??
190デフォルトの名無しさん
2013/05/17(金) 19:57:06.24 >>189
手元にFTN95の環境が無いので何とも言えないが、
gfortranで行くならftn95の問題かもしれない。
1個のファイルにまとめてみたらどうかな?
ただし、順番に依存するので、メインルーチンは最後に置かないと駄目だと思うが。
まぁサブルーチンをmoduleに入れた方がinterfaceも要らないし楽だと思うが。
手元にFTN95の環境が無いので何とも言えないが、
gfortranで行くならftn95の問題かもしれない。
1個のファイルにまとめてみたらどうかな?
ただし、順番に依存するので、メインルーチンは最後に置かないと駄目だと思うが。
まぁサブルーチンをmoduleに入れた方がinterfaceも要らないし楽だと思うが。
191HIROSHI
2013/05/19(日) 23:30:26.19 COMPAQ VISUAL FORTRAN6.6が WIN7 32 HOMEで起動しなくなりました。WIN32 PROでも起動しないことが他にあるのですが、しつこく起動することで使える状態です。
そこであきらめてDOSプロンプトでコンパイル しようと考えています。MAIN.F SUB1.F SUB2.Fのテキスト文がある場合のリンクの方法をお教えください。コピペでまとめてやればいいのですが
細かく ライブラリ化(というのですか) していきたいもので よろしくお願いします。
具体的に 例文で書いてもらったら助かります。
そこであきらめてDOSプロンプトでコンパイル しようと考えています。MAIN.F SUB1.F SUB2.Fのテキスト文がある場合のリンクの方法をお教えください。コピペでまとめてやればいいのですが
細かく ライブラリ化(というのですか) していきたいもので よろしくお願いします。
具体的に 例文で書いてもらったら助かります。
192デフォルトの名無しさん
2013/05/20(月) 16:32:18.84 CVFは先祖がDEC Visual Fortran (DVF)なので、
dfでコンパイラドライバが起動する。
df sub1.f sub2.f main.f
で sub1.exe が出来上がると思う。
デフォでは実行ファイルの名前は先頭のファイル名になる。
moduleなどは先にコンパイルされている必要があるので、main program は
最後に来ることになる。
df /help もしくは-help でヘルプが出るだろう。
CVFは10年以上前のコンパイラなので、目的にもよるが
無理して使うよりは新しいのを手に入れた方がよいかもしれない。
同じプログラムでも、最近のコンパイラではめちゃくちゃ速く実行することが多い。
dfでコンパイラドライバが起動する。
df sub1.f sub2.f main.f
で sub1.exe が出来上がると思う。
デフォでは実行ファイルの名前は先頭のファイル名になる。
moduleなどは先にコンパイルされている必要があるので、main program は
最後に来ることになる。
df /help もしくは-help でヘルプが出るだろう。
CVFは10年以上前のコンパイラなので、目的にもよるが
無理して使うよりは新しいのを手に入れた方がよいかもしれない。
同じプログラムでも、最近のコンパイラではめちゃくちゃ速く実行することが多い。
193デフォルトの名無しさん
2013/05/21(火) 05:28:14.57194デフォルトの名無しさん
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から始めると苦難の道が待っているので、数学的要請でない限り
避けるのが吉。
正直Fortranではああいう書き方はあまりしないので、チェックにかからない。
66ならサイズは気にしないで、sub(x); x(10)
77なら整合配列で、sub(n, x); real x(n)
90なら形状引継ぎ配列で、sub(x); real, intent(in out) :: x(:)
配列を0から始めると苦難の道が待っているので、数学的要請でない限り
避けるのが吉。
195デフォルトの名無しさん
2013/05/22(水) 22:19:07.20 4バイト整数の変数が,4バイトを超えたときエラーにならず変な値(マイナスになるはずのない値がマイナス)でそのまま計算が進んでしまいます。
プログラムのどのあたりで超えるか知りたいので,エラーで終了するようにするオプション又はデバッグオプションなどありませんか?
コンパイラ : intel fortran version 12 (CentOS 5)
プログラムのどのあたりで超えるか知りたいので,エラーで終了するようにするオプション又はデバッグオプションなどありませんか?
コンパイラ : intel fortran version 12 (CentOS 5)
196デフォルトの名無しさん
2013/05/23(木) 01:46:16.08 >>195
昔のDEC Fortranにはinteger overflowの実行時チェックオプションがあったが、intel fortran になってから
そのオプションは無くなった。今もないんじゃないかと思う。
最近配列サイズが4byte整数を超えることが多くなってきたので、このチェックのあるコンパイラがあってもおかしくない気はする。
gfortranとかfreeのfortranも含めて
コンパイラオプションの説明を、便器を舐めるように注意深く読んで見るといいのではないか。
昔のDEC Fortranにはinteger overflowの実行時チェックオプションがあったが、intel fortran になってから
そのオプションは無くなった。今もないんじゃないかと思う。
最近配列サイズが4byte整数を超えることが多くなってきたので、このチェックのあるコンパイラがあってもおかしくない気はする。
gfortranとかfreeのfortranも含めて
コンパイラオプションの説明を、便器を舐めるように注意深く読んで見るといいのではないか。
197デフォルトの名無しさん
2013/05/23(木) 17:36:14.83198デフォルトの名無しさん
2013/05/24(金) 03:07:21.20 貰い物の古いコードが、グローバル変数をCOMMON文でインクルードしている形式なのですが、
そこのCOMMON文に新しく変数を付け足したところ、
>COMMON のために、オブジェクトのアライメントが型と一致していません
>パフォーマンスに影響を与える可能性があります。
という警告が出ました。
変数の付け足す位置を変えたら出なくなったのですが、どういう意味かわかる方いらっしゃいますか?
そこのCOMMON文に新しく変数を付け足したところ、
>COMMON のために、オブジェクトのアライメントが型と一致していません
>パフォーマンスに影響を与える可能性があります。
という警告が出ました。
変数の付け足す位置を変えたら出なくなったのですが、どういう意味かわかる方いらっしゃいますか?
199デフォルトの名無しさん
2013/05/24(金) 16:05:35.20 >>198
32bitコンピュータとか64bitコンピュータと呼ばれるように、コンピュータは
ビットの塊を一括して処理する。メモリーアクセスは、0番地から32や64bit
の区切りで一括でなされる。この境界をまたぐと、本来1回で読み書き
できるデータに2回読み書きにいかなければならない。
そういうわけで、最近のFortranコンパイラは、自動的に境界合せをするようになっている。
ところがCOMMON文は、同じメモリー領域の割り付けだから、
コンパイラが変数の位置を勝手にずらすと、対応がずれてしまう可能性が出る。
それでアクセスが遅くなるよと警告している。
COMMON文はグローバル変数というよりも、メモリー割り付けの手動制御と
理解した方が良い。COMMONにあるのがREALとINTEGERだけの場合は、
ズレが起きることは(例外的な場合以外)ないが、文字列などがあると
すぐずれて色々警告される。文字変数は後ろの方に置くのが吉。
FORTRANコンパイラではREALとINTEGERのデフォサイズが共通であるという
(暗黙の?)約束がある。COMMON文での共有があるためだと思うが。
AUTODBLEをつかったりするとずれる可能性が出る。
以前GFORTRANだったかg95だったかが、この約束を破ってド顰蹙を買っていた。
32bitコンピュータとか64bitコンピュータと呼ばれるように、コンピュータは
ビットの塊を一括して処理する。メモリーアクセスは、0番地から32や64bit
の区切りで一括でなされる。この境界をまたぐと、本来1回で読み書き
できるデータに2回読み書きにいかなければならない。
そういうわけで、最近のFortranコンパイラは、自動的に境界合せをするようになっている。
ところがCOMMON文は、同じメモリー領域の割り付けだから、
コンパイラが変数の位置を勝手にずらすと、対応がずれてしまう可能性が出る。
それでアクセスが遅くなるよと警告している。
COMMON文はグローバル変数というよりも、メモリー割り付けの手動制御と
理解した方が良い。COMMONにあるのがREALとINTEGERだけの場合は、
ズレが起きることは(例外的な場合以外)ないが、文字列などがあると
すぐずれて色々警告される。文字変数は後ろの方に置くのが吉。
FORTRANコンパイラではREALとINTEGERのデフォサイズが共通であるという
(暗黙の?)約束がある。COMMON文での共有があるためだと思うが。
AUTODBLEをつかったりするとずれる可能性が出る。
以前GFORTRANだったかg95だったかが、この約束を破ってド顰蹙を買っていた。
200デフォルトの名無しさん
2013/05/28(火) 02:56:21.83 はじめまして、こんにちは
現在、フォートランで数値計算をするプログラムを作っています。
今日、プログラム内で使っている配列のサイズを極端に大きくしたところ、スタックオーバーフローというエラーになりました。
解決策としては、コンパイルオプションでスタックを初めから大きくするというものがあるそうなのですが、この方法にデメリットはないのでしょうか?
また、これ以外の方法で、皆さんならどのようにオーバーフローを回避しますか?
現在、フォートランで数値計算をするプログラムを作っています。
今日、プログラム内で使っている配列のサイズを極端に大きくしたところ、スタックオーバーフローというエラーになりました。
解決策としては、コンパイルオプションでスタックを初めから大きくするというものがあるそうなのですが、この方法にデメリットはないのでしょうか?
また、これ以外の方法で、皆さんならどのようにオーバーフローを回避しますか?
201デフォルトの名無しさん
2013/05/28(火) 14:05:42.30202デフォルトの名無しさん
2013/05/30(木) 12:08:48.19 次のようなデータをファイルから読み込みたいのですが,read文と書式をどう書けばよいか教えてください.
データの並びは
(親核種)(娘核種)(娘核種の比率)(孫核種)(孫核種の比率)(ひ孫核種)(ひ孫核種の比率)…
となっており,何世代まで子孫の核種があるかはファイルを読むまで分からないとします.
データの並びは
(親核種)(娘核種)(娘核種の比率)(孫核種)(孫核種の比率)(ひ孫核種)(ひ孫核種の比率)…
となっており,何世代まで子孫の核種があるかはファイルを読むまで分からないとします.
203202
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
---------データの例(おわり)-------------
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
---------データの例(おわり)-------------
204202
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を使っています.
このように書きましたが,Eに長さの指定がない,とエラーが出ます.
自分が分からない点は以下の二つだと思っています.
1. 任意の桁数の小数を読み込む方法がわからない
2. 一行に任意の個数だけデータが並ぶ場合のreadの仕方がわからない
コンパイラはgfortranを使っています.
205デフォルトの名無しさん
2013/05/30(木) 19:01:21.13 >>204
結構めんどい。
1.任意の桁数の小数を読む最も楽な方法は、自由形式を使うことで、
空白とかコンマが区切りに入っていれば自動で切り分けてくれる。
自由形式を使わない場合は、動的にFORMAT生成する方法がある。
2.任意個のデータを読むのは、エラー上等で読み込んで、iostatで
エラーコードを調べて、END OF RECORD ならおkとか。
しかし、今の場合文字列処理の方が問題。固定長ならまだやりようがあるが、
Bi-210m みたいに長さの違うのが混じると苦しい。
結局、1行ごと文字列として読み込んで、空白をトークンとして自分でパース
していくのが素朴。
Fortran2003/08なら、もう少し柔軟なIOできるかもしれない。
結構めんどい。
1.任意の桁数の小数を読む最も楽な方法は、自由形式を使うことで、
空白とかコンマが区切りに入っていれば自動で切り分けてくれる。
自由形式を使わない場合は、動的にFORMAT生成する方法がある。
2.任意個のデータを読むのは、エラー上等で読み込んで、iostatで
エラーコードを調べて、END OF RECORD ならおkとか。
しかし、今の場合文字列処理の方が問題。固定長ならまだやりようがあるが、
Bi-210m みたいに長さの違うのが混じると苦しい。
結局、1行ごと文字列として読み込んで、空白をトークンとして自分でパース
していくのが素朴。
Fortran2003/08なら、もう少し柔軟なIOできるかもしれない。
206デフォルトの名無しさん
2013/05/30(木) 19:03:15.49 program twochan
implicit none
integer, parameter :: nmax = 100
character (len = 136) :: buff
character (len = 10) :: parent, progeny(nmax)
real :: progeny_ratio(nmax)
integer :: i, k
do
read(10, '(a)', end = 999) buff
buff = adjustl(buff)
k = index(buff, ' ')
parent = buff(1:k - 1)
buff = adjustl(buff(k:))
i = 0
do while(trim(buff) /= '')
i = i + 1
k = index(buff, ' ')
progeny(i) = adjustl(buff(1: k - 1))
buff = adjustl(buff(k:))
k = index(buff, ' ')
read(buff(:k - 1), *) progeny_ratio(i)
buff = adjustl(buff(k:))
end do
print *, parent, (progeny(k), progeny_ratio(k), k = 1, i)
end do
999 stop
end program twochan
>>206 専ブラインデント用引用符
implicit none
integer, parameter :: nmax = 100
character (len = 136) :: buff
character (len = 10) :: parent, progeny(nmax)
real :: progeny_ratio(nmax)
integer :: i, k
do
read(10, '(a)', end = 999) buff
buff = adjustl(buff)
k = index(buff, ' ')
parent = buff(1:k - 1)
buff = adjustl(buff(k:))
i = 0
do while(trim(buff) /= '')
i = i + 1
k = index(buff, ' ')
progeny(i) = adjustl(buff(1: k - 1))
buff = adjustl(buff(k:))
k = index(buff, ' ')
read(buff(:k - 1), *) progeny_ratio(i)
buff = adjustl(buff(k:))
end do
print *, parent, (progeny(k), progeny_ratio(k), k = 1, i)
end do
999 stop
end program twochan
>>206 専ブラインデント用引用符
207デフォルトの名無しさん
2013/05/30(木) 19:04:54.82 実行結果
Pb-202 Tl-202 1.000000
Pb-210 Bi-210 1.000000 Po-210 1.000000
Pb-212 Bi-212 1.000000 Tl-208 0.4000000 Po-212
0.7100000
Bi-210m Ti-206 1.000000
Bi-212 Tl-208 0.3600000 Po-212 0.6500000
At-211 Po-211 0.5800000
Rn-222 Po-218 1.000000 Pb-214 1.000000 Bi-214
1.000000 Po-214 1.000000
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
208202
2013/05/31(金) 21:54:18.32 すばらしいです!ありがとうございました.
実は,自分もほぼ丸一日試行錯誤した末にできたのですが,
なぜ自分のプログラムがうまく動くのか説明できません.
教えてもらった方法をこれから読んで勉強しようと思います.
実は,自分もほぼ丸一日試行錯誤した末にできたのですが,
なぜ自分のプログラムがうまく動くのか説明できません.
教えてもらった方法をこれから読んで勉強しようと思います.
209デフォルトの名無しさん
2013/06/11(火) 09:28:34.46 gfortranで通常の宣言型を超えて桁数の上限なしの計算をしたいのですが、
質問1)GMPというのを使えば良いのですか?
(既にPCに入っているとしたら、Ubuntuの場合は、どこのなんてファイル群?)
質問2)GMPを使うとして、どのようにソースを書けば良いですか?
(FMLIBの場合は、最初にuse FMZMとして、型宣言の時にtype(IM)とか)
質問2)他にもっと多倍数演算に向いたツールはありますか?
質問1)GMPというのを使えば良いのですか?
(既にPCに入っているとしたら、Ubuntuの場合は、どこのなんてファイル群?)
質問2)GMPを使うとして、どのようにソースを書けば良いですか?
(FMLIBの場合は、最初にuse FMZMとして、型宣言の時にtype(IM)とか)
質問2)他にもっと多倍数演算に向いたツールはありますか?
210デフォルトの名無しさん
2013/06/11(火) 19:54:51.69 質問です学校で COMMAND入力に「XX<YY.dat」という操作をしたのですがどういう意味でしょうか?
211デフォルトの名無しさん
2013/06/11(火) 20:48:28.96 >210
XXというプログラムにYY.datというデータを入力したと
いうことです。
XX>YY.datとすると、XXというプログラムの出力を
YY.datというファイルに出力することを意味します。
XXというプログラムにYY.datというデータを入力したと
いうことです。
XX>YY.datとすると、XXというプログラムの出力を
YY.datというファイルに出力することを意味します。
212デフォルトの名無しさん
2013/06/12(水) 15:25:51.17213デフォルトの名無しさん
2013/06/15(土) 12:45:05.08214デフォルトの名無しさん
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
implicit real*8 (a-h, o-z)
real*8 aa
parameter (c=1.0D0, aa=1.0D0, nmax=200, dx=aa/nmax)
integer n
real*8 x(0:1000)
real*8 y(0:1000)
real*8 k1,k2,k3,k4
open(11, file='0606-1.4data', status='unknown')
C * initial value of y
y(0)=1.0D0
x(0)=0.0D0
n=0
C * solution at x(n)=(n+1)*dx
1 q=1.0d0
p=1.0d0-q
a=q*0.50d0
b=q*0.50d0
215デフォルトの名無しさん
2013/06/17(月) 11:56:31.99 k1 = func(x(n),y(n))
k2 = func(x(n)+b*dx,y(n)+a*k1*dx)
g = p*k1 + q*k2
y(n+1) = y(n) + g*dx
x(n)=(n+1)*dx
ERR=abs(exp(x(n))-y(n+1))
if (mod(n+1,10).eq.0) then
write(6,200) x(n+1), y(n+1), ERR
write(11,200) x(n+1), y(n+1), ERR
end if
if(n==nmax) then
stop 'ended'
end if
n=n+1
go to 1
close(11)
200 format('x=', E13.6, ' result y=', E13.6, ' error ERR=', E13.6)
stop
end
k2 = func(x(n)+b*dx,y(n)+a*k1*dx)
g = p*k1 + q*k2
y(n+1) = y(n) + g*dx
x(n)=(n+1)*dx
ERR=abs(exp(x(n))-y(n+1))
if (mod(n+1,10).eq.0) then
write(6,200) x(n+1), y(n+1), ERR
write(11,200) x(n+1), y(n+1), ERR
end if
if(n==nmax) then
stop 'ended'
end if
n=n+1
go to 1
close(11)
200 format('x=', E13.6, ' result y=', E13.6, ' error ERR=', E13.6)
stop
end
216デフォルトの名無しさん
2013/06/17(月) 11:59:42.72 real*8 function func(x(n),y(n))
implicit real*8 x,y
integer n
real*8 x(0:1000)
real*8 y(0:1000)
func = y(n)
return
end function func
214-216はつながっています。
関数の副プログラムを利用したいのですが、認識してくれません。
どうすればよいでしょうか?
エラー箇所は、Two Main Programsというやつのみでした。
implicit real*8 x,y
integer n
real*8 x(0:1000)
real*8 y(0:1000)
func = y(n)
return
end function func
214-216はつながっています。
関数の副プログラムを利用したいのですが、認識してくれません。
どうすればよいでしょうか?
エラー箇所は、Two Main Programsというやつのみでした。
217デフォルトの名無しさん
2013/06/18(火) 14:40:19.36 >>216
関数の定義の所がおかしい。x(n),y(n)→x,y
IMPLICIT文の文法がおかしい。括弧で変数をくくる必要あり。
real*8 function func(x,y)
implicit real*8 (x,y)
今のコンパイラは多少のエラーがあっても、適宜仮定してコンパイルを
続行するが、いまfunction定義の頭部が無視されてコンパイル続行されたため
end文が2回出てきて二個メインプログラムがあるように解釈されたと思われ。
F77的な古典的な書き方をしていて、77本を真面目に勉強しているのだと思うが、
(それはそれで大変結構だが)
副プログラムをMODULEに入れるとかF90以降の現代風にすると、
もっとエラーが容易に見つかる確率が上がると思う。
関数の定義の所がおかしい。x(n),y(n)→x,y
IMPLICIT文の文法がおかしい。括弧で変数をくくる必要あり。
real*8 function func(x,y)
implicit real*8 (x,y)
今のコンパイラは多少のエラーがあっても、適宜仮定してコンパイルを
続行するが、いまfunction定義の頭部が無視されてコンパイル続行されたため
end文が2回出てきて二個メインプログラムがあるように解釈されたと思われ。
F77的な古典的な書き方をしていて、77本を真面目に勉強しているのだと思うが、
(それはそれで大変結構だが)
副プログラムをMODULEに入れるとかF90以降の現代風にすると、
もっとエラーが容易に見つかる確率が上がると思う。
218デフォルトの名無しさん
2013/07/01(月) NY:AN:NY.AN 最近の大学では数値計算+Fortranの教科書は何を使ってるんだい?
コンピュータの数値計算一切やらないまま入ってくる学生がいて自習してほしいんだが
ヤングに嫌がられないお勧めあるかね?
コンピュータの数値計算一切やらないまま入ってくる学生がいて自習してほしいんだが
ヤングに嫌がられないお勧めあるかね?
219デフォルトの名無しさん
2013/07/05(金) NY:AN:NY.AN ナウいヤング向けの言語はJavaとかか
220デフォルトの名無しさん
2013/07/11(木) NY:AN:NY.AN 自由端反射のプログラムで質問です。
program wave
implicit none
real,dimension(5,0:30)::f
integer::i,n,p,q,r,s,t,u,k
do s=0,30
do q=1,5
f(q,s)=0
end do
end do
do n=1,300
f(3,30)=0
f(3,0)=exp(-((n-30.)/10.)**2)
do k=0,28
f(3,k+1)=2*f(4,k)-f(5,k)+(f(4,k+1)-2*f(4,k)+f(4,k-1))/4.
end do
program wave
implicit none
real,dimension(5,0:30)::f
integer::i,n,p,q,r,s,t,u,k
do s=0,30
do q=1,5
f(q,s)=0
end do
end do
do n=1,300
f(3,30)=0
f(3,0)=exp(-((n-30.)/10.)**2)
do k=0,28
f(3,k+1)=2*f(4,k)-f(5,k)+(f(4,k+1)-2*f(4,k)+f(4,k-1))/4.
end do
221デフォルトの名無しさん
2013/07/11(木) NY:AN:NY.AN do p=0,30
f(1,p)=n
f(2,p)=p
write(*,*)f(1,p),f(2,p),f(3,p)
end do
write(*,*)
do t=0,30
f(5,t)=f(4,t)
f(4,t)=f(3,t)
end do
end do
end program wave
f(1,p)=n
f(2,p)=p
write(*,*)f(1,p),f(2,p),f(3,p)
end do
write(*,*)
do t=0,30
f(5,t)=f(4,t)
f(4,t)=f(3,t)
end do
end do
end program wave
222デフォルトの名無しさん
2013/07/11(木) NY:AN:NY.AN というプログラムを出力した結果たしか
1. 0. 0.00223
1. 1. 1.4848
ってなって最初fを全部0にしたのにf(3.2)が1.4848となります、何が悪いでしょうか?
1. 0. 0.00223
1. 1. 1.4848
ってなって最初fを全部0にしたのにf(3.2)が1.4848となります、何が悪いでしょうか?
223デフォルトの名無しさん
2013/07/12(金) NY:AN:NY.AN >>222
do k=0,28
f(3,k+1)=2*f(4,k)-f(5,k)+(f(4,k+1)-2*f(4,k)+f(4,k-1))/4.
end do
これでk=0の時、f(4,k-1)→f(4,-1)で配列はみだしだからじゃないか?
まずdebug mode サブスクリプト・チェックをかけて実行しろ!
do k=0,28
f(3,k+1)=2*f(4,k)-f(5,k)+(f(4,k+1)-2*f(4,k)+f(4,k-1))/4.
end do
これでk=0の時、f(4,k-1)→f(4,-1)で配列はみだしだからじゃないか?
まずdebug mode サブスクリプト・チェックをかけて実行しろ!
224デフォルトの名無しさん
2013/08/02(金) NY:AN:NY.ANID:Kz7Qk8/h! openmp を使って並列化しようと思ってるんですが、スレッドセーフな副プログラムを作るのに気をつけるのってどういう点ですか?
save と common を使わなければいいだけでしょうか。
save を避けなければならないばあい、擬似乱数のように前の状態を保存しておかなければならないような副プログラムはどうやって作ったらいいでしょうか。
save と common を使わなければいいだけでしょうか。
save を避けなければならないばあい、擬似乱数のように前の状態を保存しておかなければならないような副プログラムはどうやって作ったらいいでしょうか。
225デフォルトの名無しさん
2013/08/04(日) NY:AN:NY.AN 引数で前の状態を渡し、引数に次の状態を戻す
呼び出し元スレッドと内容を共有するので、実引数は
private なのか share なのか明らかにすること
呼び出し元スレッドと内容を共有するので、実引数は
private なのか share なのか明らかにすること
226デフォルトの名無しさん
2013/08/04(日) NY:AN:NY.ANID:zEmYUazP! なるほど。ありがとうございます。
227デフォルトの名無しさん
2013/08/05(月) NY:AN:NY.AN OpenMPとの整合はよく分からんが、F95以降では
pure接頭子で依存性の無さを保証できる。
というかコンパイラがチェックしてくれる。
pure接頭子で依存性の無さを保証できる。
というかコンパイラがチェックしてくれる。
228デフォルトの名無しさん
2013/08/06(火) NY:AN:NY.AN Visual Basicで下記のバイナリ出力したグリッドをfortranで読み込ませようとしてますが,
できません.input statement requires too much data, unit 10
とでます.
できません.input statement requires too much data, unit 10
とでます.
229デフォルトの名無しさん
2013/08/06(火) NY:AN:NY.AN Dim doutpgrid As New System.IO.BinaryWriter(New System.IO.FileStream(Outputfile, IO.FileMode.Create, IO.FileAccess.Write))
For i = 1 To nz
For k = 1 To ny
For j = 1 To nx
doutpgrid.Write(nheader)
doutpgrid.Write(dblX(j, k, i)) : doutpgrid.Write(dbly(j, k, i)) : doutpgrid.Write(dblz(j, k, i))
doutpgrid.Write(nfooter)
Next j
Next k
Next l
For i = 1 To nz
For k = 1 To ny
For j = 1 To nx
doutpgrid.Write(nheader)
doutpgrid.Write(dblX(j, k, i)) : doutpgrid.Write(dbly(j, k, i)) : doutpgrid.Write(dblz(j, k, i))
doutpgrid.Write(nfooter)
Next j
Next k
Next l
230デフォルトの名無しさん
2013/08/06(火) NY:AN:NY.AN open(10,file='grid.dat',form='unformatted')
do 115 k=1,kmax1
do 115 j=1,jmax1
do 115 i=1,imax1
read(10) xd(i,j,k),yd(i,j,k),zd(i,j,k)
115 continue
close(10)
です.誰か教えてくださいnheaderなどはinteger, dblXはdoubleです.
do 115 k=1,kmax1
do 115 j=1,jmax1
do 115 i=1,imax1
read(10) xd(i,j,k),yd(i,j,k),zd(i,j,k)
115 continue
close(10)
です.誰か教えてくださいnheaderなどはinteger, dblXはdoubleです.
231デフォルトの名無しさん
2013/08/06(火) NY:AN:NY.AN VBの事は、よく分からんが、少なくともFortran側でnheaderとnfooterを読むか
読み飛ばすかしないと、つじつまが合わないだろう。
いきなりエラーが出るなら、nheaderのintegerを三個の倍精度で読もうとして
要素が足りないと叱られたと思われる。
バイナリだとずれたまま読みそうな気もするが・・・
読み飛ばすかしないと、つじつまが合わないだろう。
いきなりエラーが出るなら、nheaderのintegerを三個の倍精度で読もうとして
要素が足りないと叱られたと思われる。
バイナリだとずれたまま読みそうな気もするが・・・
232デフォルトの名無しさん
2013/08/06(火) NY:AN:NY.AN unformatted で sequential なファイルは次のレコード(記録)の組を飛ばすのに
何バイト読み進めればいいかを各レコードの前後に整数値として記録しているらしい
レコードは1文の read/write で扱われる単位とみていいはず
(このせいで妙にファイルサイズが膨らんだりする)
>>229 nheader と nfooter の値を確認
何バイト読み進めればいいかを各レコードの前後に整数値として記録しているらしい
レコードは1文の read/write で扱われる単位とみていいはず
(このせいで妙にファイルサイズが膨らんだりする)
>>229 nheader と nfooter の値を確認
233デフォルトの名無しさん
2013/08/07(水) NY:AN:NY.AN シーケンシャルなUnformattedなら、Fortran独自の形式だからVBの出力は
読めない気もする。
>>232の言うとおり、Fortranでは読みとばしとBACKSPACEでの逆行のために、
各レコードの前後にレコード長が記録されている。
F2003からの機能だが、STREAMモードで読むか、あるいはF77にこだわるなら
DIRECT形式で無理やり読む方法がある。どちらも読み込み単位が処理系によって
BYTEだったりWORDだったり依存性がるので調べる必要がある。
またDIRECT形式は大抵は普通にべた書きだが、処理系によってはヘッダが付いたりするので
これも調べる必要がある。
よく分かんないんだったら、素直に書式付とかCVS形式とかで出して
読むのが吉。
読めない気もする。
>>232の言うとおり、Fortranでは読みとばしとBACKSPACEでの逆行のために、
各レコードの前後にレコード長が記録されている。
F2003からの機能だが、STREAMモードで読むか、あるいはF77にこだわるなら
DIRECT形式で無理やり読む方法がある。どちらも読み込み単位が処理系によって
BYTEだったりWORDだったり依存性がるので調べる必要がある。
またDIRECT形式は大抵は普通にべた書きだが、処理系によってはヘッダが付いたりするので
これも調べる必要がある。
よく分かんないんだったら、素直に書式付とかCVS形式とかで出して
読むのが吉。
234デフォルトの名無しさん
2013/08/09(金) NY:AN:NY.AN gfortranでポインタの初期値をnullにするコンパイルオプションをおしえていただけないでしょうか。
Linux上でintel fortran compilerでコンパイルしていたものを
windows上で動作させるために、g95とgfortranでコンパイルしようとしました。
ifortではデフォルトでポインタはallocateされていないのですが
g95やgfortranではそうではないようです。
g95では-fpointer=nullで初期値をnullにできるのですが
私のソースコードをコンパイルすると、コンパイラの内部エラーと言われます。
gfortranでは上記に対応するコンパイルオプションはないでしょうか
Linux上でintel fortran compilerでコンパイルしていたものを
windows上で動作させるために、g95とgfortranでコンパイルしようとしました。
ifortではデフォルトでポインタはallocateされていないのですが
g95やgfortranではそうではないようです。
g95では-fpointer=nullで初期値をnullにできるのですが
私のソースコードをコンパイルすると、コンパイラの内部エラーと言われます。
gfortranでは上記に対応するコンパイルオプションはないでしょうか
235デフォルトの名無しさん
2013/08/10(土) NY:AN:NY.AN internal compilation error って要するにコンパイラーのバグなんじゃ…
236デフォルトの名無しさん
2013/08/28(水) NY:AN:NY.AN 初心者というか入り口にすら立ってないため質問させていただきます。
MUMPSっていうライブラリをMinGW環境で使いたいため
g95ってコンパイラをダウンロードしようとしているのですが
公式ページでもファイルが見つかりません。となって困ってます
みなさん、g95はどこから入手されているのでしょうか?
それともg95-MingW.exeが消されたのには何か理由があるのでしょうか?
MUMPSっていうライブラリをMinGW環境で使いたいため
g95ってコンパイラをダウンロードしようとしているのですが
公式ページでもファイルが見つかりません。となって困ってます
みなさん、g95はどこから入手されているのでしょうか?
それともg95-MingW.exeが消されたのには何か理由があるのでしょうか?
237デフォルトの名無しさん
2013/08/29(木) NY:AN:NY.AN g95は最近メンテされてないから、gFortranでいけ。
たぶん大丈夫。
たぶん大丈夫。
238デフォルトの名無しさん
2013/09/10(火) 14:58:43.49 do 1100 III=1,400
*
if(QQP(III).eq.0.) go to 1100
NP=ifix(QPP*QQP(III))
*
do 1000 I=1,NP
*
E0=float(III)*50.-25. !
* Incident point 4mmφ
60 do IJK=1,2
IY(KR)=mod(IY(KR)+IY(JR),mmd)
X(IJK)=float(IY(KR)+1)/dmd
JR=JR-1
if(JR.eq.0) JR=55
KR=KR-1
if(KR.eq.0) KR=55
end do
*
if(QQP(III).eq.0.) go to 1100
NP=ifix(QPP*QQP(III))
*
do 1000 I=1,NP
*
E0=float(III)*50.-25. !
* Incident point 4mmφ
60 do IJK=1,2
IY(KR)=mod(IY(KR)+IY(JR),mmd)
X(IJK)=float(IY(KR)+1)/dmd
JR=JR-1
if(JR.eq.0) JR=55
KR=KR-1
if(KR.eq.0) KR=55
end do
239デフォルトの名無しさん
2013/09/10(火) 15:00:46.05 CX00=(1.-X(1))*0.4
CY00=(1.-X(2))*0.4
*
CX0=25.+CX00 !
CY0=25.+CY00 !
CZ0=0. !
*
CA2=1.
SA2=0.
CB2=1.
SB2=0.
*
JJJ=1
JJJJ=0
*
* --------------------------------------------------------------
*
70 JJJJJ=0
*
if(E0.lt.10.) go to 880
*
XE0=log(E0)
ka=2
72 if(E0.lt.ATTEN(5,ka)) then
XAT11=log(ATTEN(1,ka))
CY00=(1.-X(2))*0.4
*
CX0=25.+CX00 !
CY0=25.+CY00 !
CZ0=0. !
*
CA2=1.
SA2=0.
CB2=1.
SB2=0.
*
JJJ=1
JJJJ=0
*
* --------------------------------------------------------------
*
70 JJJJJ=0
*
if(E0.lt.10.) go to 880
*
XE0=log(E0)
ka=2
72 if(E0.lt.ATTEN(5,ka)) then
XAT11=log(ATTEN(1,ka))
240デフォルトの名無しさん
2013/09/20(金) 09:08:24.47 なんだどうした?
241デフォルトの名無しさん
2013/09/26(木) 12:57:51.56 pointer(pvar,var(*))
これってどういう意図ですか?
これってどういう意図ですか?
242デフォルトの名無しさん
2013/09/26(木) 13:30:22.80 メモリポインタ
243デフォルトの名無しさん
2013/09/26(木) 22:50:44.43 それはクレイ・ポインタと呼ばれるもので、クレイのFortranにあった非標準命令。
だがクレイが普及していたアメリカでは準標準みたいになったので、いまでも結構多くのFortranで使える。
まぁFortran2003の命令で、(工夫すれば)置き換え可能なので、もうあまり使われない。
POINTER (pointer, pointee)
ポインタ(整数変数)にはポイントされるもの(pointee)の番地が入るようになる。
だがクレイが普及していたアメリカでは準標準みたいになったので、いまでも結構多くのFortranで使える。
まぁFortran2003の命令で、(工夫すれば)置き換え可能なので、もうあまり使われない。
POINTER (pointer, pointee)
ポインタ(整数変数)にはポイントされるもの(pointee)の番地が入るようになる。
244デフォルトの名無しさん
2013/10/01(火) 12:17:05.23245デフォルトの名無しさん
2013/10/02(水) 00:38:14.04 >>244
両方非標準。
FORTRAN77以前では動的にメモリーを確保するための拡張命令があったり、
あるいはCのルーチンをリンクしていた。
Fotran90以降ではallocate命令が入った。
そのプログラムが書かれた対象マシンが分かるなら、ググればそれ用のFORTRAN77のリファレンス・マニュアルが落ちていると思う。
両方非標準。
FORTRAN77以前では動的にメモリーを確保するための拡張命令があったり、
あるいはCのルーチンをリンクしていた。
Fotran90以降ではallocate命令が入った。
そのプログラムが書かれた対象マシンが分かるなら、ググればそれ用のFORTRAN77のリファレンス・マニュアルが落ちていると思う。
246デフォルトの名無しさん
2013/10/08(火) 10:10:31.65247デフォルトの名無しさん
2013/10/13(日) 00:13:41.19 77で書いてあるプログラムが今のコンパイラで動くようにデバックしているのですが
common文で宣言している変数をmoduleでグローバル変数に変えたら、equivalence文でエラーが出てしまいます。
そこでこのequivalence文のところを変えようと思うのですが、90/95ので代わりとなる構文ってありますか?
common文で宣言している変数をmoduleでグローバル変数に変えたら、equivalence文でエラーが出てしまいます。
そこでこのequivalence文のところを変えようと思うのですが、90/95ので代わりとなる構文ってありますか?
248デフォルトの名無しさん
2013/10/13(日) 01:48:53.15 >>247
直接の代替はない。
Fortran90/95で推奨されているEQUIVALENCEの代替は、TRANSFER関数でメモリー内容を別メモリーに
移せというもの。EQUIVALENCEのメモリー共有とは違い、二つの変数間の型変換を伴わない内容の代入にあたる。
古い時代にCOMMONやEQUIVALENCEがあったのはメモリーが少なくて、同じ領域を使いまわしたかったから。
COMMONやEQUIVALENCEによるメモリー共用が、コンパイラの最適化を妨げるから廃止に向かった。
COMMONを単なるグローバル変数とみなすと、移植で非常にめんどくさいことになることがままある。
なおFORTRAN77はFortran90に完全に含まれているので、今のコンパイラでも多少のオプション変更で書き直さなくても動くはず。
直接の代替はない。
Fortran90/95で推奨されているEQUIVALENCEの代替は、TRANSFER関数でメモリー内容を別メモリーに
移せというもの。EQUIVALENCEのメモリー共有とは違い、二つの変数間の型変換を伴わない内容の代入にあたる。
古い時代にCOMMONやEQUIVALENCEがあったのはメモリーが少なくて、同じ領域を使いまわしたかったから。
COMMONやEQUIVALENCEによるメモリー共用が、コンパイラの最適化を妨げるから廃止に向かった。
COMMONを単なるグローバル変数とみなすと、移植で非常にめんどくさいことになることがままある。
なおFORTRAN77はFortran90に完全に含まれているので、今のコンパイラでも多少のオプション変更で書き直さなくても動くはず。
249デフォルトの名無しさん
2013/10/13(日) 13:51:31.72250デフォルトの名無しさん
2013/10/15(火) 22:40:32.54 初期値も何も与えてない変数の値って0ですよね?
それが0ではなくとてつもなくおおきな値になることってありますか?
それが0ではなくとてつもなくおおきな値になることってありますか?
251デフォルトの名無しさん
2013/10/15(火) 22:51:06.34 いいえ
はい
はい
252デフォルトの名無しさん
2013/10/15(火) 23:17:41.03 >>251
まじっすか
まじっすか
253デフォルトの名無しさん
2013/10/16(水) 01:37:15.62 変数がゼロになってるなんて思ってたのかよw
コップや皿を洗わないで飲み食いするタイプか?
コップや皿を洗わないで飲み食いするタイプか?
254デフォルトの名無しさん
2013/10/16(水) 01:42:01.37 規格上は不定らしいよ。
ttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14106144349
ttp://ruby.gfd-dennou.org/products/ruby-dcl/ruby-dcl-doc/math1/node9.html
超初心者用スレなのに、みんな厳しいね…
ttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14106144349
ttp://ruby.gfd-dennou.org/products/ruby-dcl/ruby-dcl-doc/math1/node9.html
超初心者用スレなのに、みんな厳しいね…
255デフォルトの名無しさん
2013/10/16(水) 02:01:47.72 初心者スレだったか、めんごめんご、すまんこ、おまんこ。
昔の日本の大型計算機のFORTRANは0クリアしていることが多かった。
IBMはごみだらけの状態でよこしてた。
今もリンカのオプションでゼロクリアできるものが多い。
昔の日本の大型計算機のFORTRANは0クリアしていることが多かった。
IBMはごみだらけの状態でよこしてた。
今もリンカのオプションでゼロクリアできるものが多い。
256デフォルトの名無しさん
2013/10/16(水) 23:48:35.58 なるほろ〜不定なんですね。
いや実は昔のプログラムを今のコンパイラで動かしているところなんですが
通常なら0であるぺき変数が変な値になってしまいうまく動かなかったんです。
オプションで0クリアにしたらうごくかもしれません。ありがとうございました。
いや実は昔のプログラムを今のコンパイラで動かしているところなんですが
通常なら0であるぺき変数が変な値になってしまいうまく動かなかったんです。
オプションで0クリアにしたらうごくかもしれません。ありがとうございました。
257デフォルトの名無しさん
2013/11/07(木) 23:56:00.54 ほ
258デフォルトの名無しさん
2013/11/08(金) 11:47:40.89 デバッグしているのですが
THDFEというサブルーチンで仮引数(x)を動的割付け配列で宣言し直したところ
”THDFEにおいて存在しないもしくは誤った引数仕様ブロックです。ー仮引数x(第三番目)は割付け配列です。”
とエラーが出たんですが。意味がわかりません。詳しく教えて下さいm(__)m
THDFEというサブルーチンで仮引数(x)を動的割付け配列で宣言し直したところ
”THDFEにおいて存在しないもしくは誤った引数仕様ブロックです。ー仮引数x(第三番目)は割付け配列です。”
とエラーが出たんですが。意味がわかりません。詳しく教えて下さいm(__)m
259デフォルトの名無しさん
2013/11/09(土) 00:08:06.89 この質問じゃ情報少なすぎ。
せめてエラーメッセージそのものを貼るべき。
まぁ呼び出し側の配列が、割り付け属性を持っていないという程度の誤りだろう。
せめてエラーメッセージそのものを貼るべき。
まぁ呼び出し側の配列が、割り付け属性を持っていないという程度の誤りだろう。
260デフォルトの名無しさん
2013/11/09(土) 10:26:20.66 >>259
”THDFEにおいて存在しないもしくは誤った引数仕様ブロックです。ー仮引数x(第三番目)は割付け配列です。”
一応これがエラーメッセージそのものなんです。
>>まぁ呼び出し側の配列が、割り付け属性を持っていないという程度の誤りだろう。
THDFEは外部副プログラムなんですが。このブロックでの仮引数は割付属性を持たないってことでいいんでしょうか?
”THDFEにおいて存在しないもしくは誤った引数仕様ブロックです。ー仮引数x(第三番目)は割付け配列です。”
一応これがエラーメッセージそのものなんです。
>>まぁ呼び出し側の配列が、割り付け属性を持っていないという程度の誤りだろう。
THDFEは外部副プログラムなんですが。このブロックでの仮引数は割付属性を持たないってことでいいんでしょうか?
261デフォルトの名無しさん
2013/11/09(土) 13:01:13.70 それはエラーメッセージそのものじゃないだろ。
エラー番号とか全部込々で貼れよ。
質問の仕方が悪いといつまでも答えが出ないぞ。
大体、サブルーチン側で文句を言われているのか、呼び出し側で文句を言われているのか
それすら判然としないだろ。
エラー番号とか全部込々で貼れよ。
質問の仕方が悪いといつまでも答えが出ないぞ。
大体、サブルーチン側で文句を言われているのか、呼び出し側で文句を言われているのか
それすら判然としないだろ。
262デフォルトの名無しさん
2013/11/09(土) 16:41:00.84 >>261
すみません・・・
これがエラーメッセージです。
実行時エラー: ../sorcefile(先生)/HTHDFE.f90(1): THDFEにおいて存在しないもしくは誤った引用仕様ブロックです - 仮引数X(第3番目)は割付け配列です
致命的なエラーでプログラムが終了しました
サブルーチン(THDFE)側のほうでエラーメッセージがでます。
すみません・・・
これがエラーメッセージです。
実行時エラー: ../sorcefile(先生)/HTHDFE.f90(1): THDFEにおいて存在しないもしくは誤った引用仕様ブロックです - 仮引数X(第3番目)は割付け配列です
致命的なエラーでプログラムが終了しました
サブルーチン(THDFE)側のほうでエラーメッセージがでます。
263デフォルトの名無しさん
2013/11/09(土) 19:18:40.37 >>262
interface文を書いてないとか?
それと仮引数に割り付け配列を指定できるのはFortran2003以降のはず。
Fortran95の拡張仕様TR15581をコンパイラがサポートしていれば問題ないけど。
interface文を書いてないとか?
それと仮引数に割り付け配列を指定できるのはFortran2003以降のはず。
Fortran95の拡張仕様TR15581をコンパイラがサポートしていれば問題ないけど。
264デフォルトの名無しさん
2013/11/09(土) 19:54:41.21265デフォルトの名無しさん
2013/11/09(土) 20:33:20.29 integerfaceじゃなくてinterfaceなw
266デフォルトの名無しさん
2013/11/09(土) 21:14:09.73 >>264
手元にあるFortran2003の言語仕様(draft)の257頁から抜粋すると
"A procedure shall have an explicit interface if it is referenced and
The procedure has a dummy argument that has the ALLOCATABLE attribute"
となっている。"explicit interface"が必須だからinterface文を書けばいいと思う。
それと、紛らわしいのでFortran2003ならファイルの拡張子も変えたら?
手元にあるFortran2003の言語仕様(draft)の257頁から抜粋すると
"A procedure shall have an explicit interface if it is referenced and
The procedure has a dummy argument that has the ALLOCATABLE attribute"
となっている。"explicit interface"が必須だからinterface文を書けばいいと思う。
それと、紛らわしいのでFortran2003ならファイルの拡張子も変えたら?
267デフォルトの名無しさん
2013/11/10(日) 00:04:40.45268デフォルトの名無しさん
2013/11/10(日) 00:04:41.77 interface 書くより、サブルーチンをmoduleに入れたほうが楽でいいぞ。
269デフォルトの名無しさん
2013/11/10(日) 00:13:46.52 スレ違いかもしれないけど、とあるf77プログラムのクローンを作りたいのだけど、
どこまでやれば別のプログラムと認められるんだろう?
入出力仕様や数式まで立ち帰って、スクラッチから書けば完璧なんだろうけど、
作業量的に厳しいというのが本音。
固定形式から自由形式に書き換えた程度じゃダメかな。
参考になるようなサイトとか有れば教えてください。
どこまでやれば別のプログラムと認められるんだろう?
入出力仕様や数式まで立ち帰って、スクラッチから書けば完璧なんだろうけど、
作業量的に厳しいというのが本音。
固定形式から自由形式に書き換えた程度じゃダメかな。
参考になるようなサイトとか有れば教えてください。
270デフォルトの名無しさん
2013/11/10(日) 00:23:01.23 引用とか数行とかの範疇を超えて、見ながら書いたのなら原型を留めてなくても派生物じゃね?
極端な話他言語に移植しても、ロジックが同じなら派生物
極端な話他言語に移植しても、ロジックが同じなら派生物
271デフォルトの名無しさん
2013/11/10(日) 00:28:13.72 横からすまんが、Intel Fortranではソース・ファイルの拡張子は、
固定形式が.fないし.forで、自由形式は.f90になっていて、
.f95とか.f03とかは、存在が間違っているとされているんだが、
ホントのとこはどうなの?
固定形式が.fないし.forで、自由形式は.f90になっていて、
.f95とか.f03とかは、存在が間違っているとされているんだが、
ホントのとこはどうなの?
272デフォルトの名無しさん
2013/11/10(日) 00:35:04.17 >>271
Intel Fortran compiler 14.0のリファレンスではそうなっている。
Intel Fortran compiler 14.0のリファレンスではそうなっている。
273デフォルトの名無しさん
2013/11/10(日) 02:11:25.87274デフォルトの名無しさん
2013/11/10(日) 07:18:49.19 >>273
言語仕様では拡張子は規定していないのでコンパイラ依存。
言語仕様では拡張子は規定していないのでコンパイラ依存。
275デフォルトの名無しさん
2013/11/10(日) 19:10:31.00 すみません、equivalence が理解できず、もしご存じの方が
いらっしゃいましたら、アドバイスを頂けないでしょうか。
勉強のために下記のテストコードを書いてみました。
まず、整数型配列 a1 と a2、実数型配列 a3 に適当な値を代入し、
その後 equivalence文によって a1(1) と a(1) のアドレスを一致させ
配列 a に配列 a1 〜 a3 の値をコピーしてみました。
最後に write 文で配列 a と、配列 a1 〜 a3 までの値を
それぞれ出力させて比較したのですが、両者では実数型配列
a3 の値だけ異なっています。
私のつたない理解では、おそらく equivalence で実数型配列
a3 の値を整数型配列 a にコピーしたのが原因なのではないかと
思っているのですが、配列 a3 を用いずに 配列 a から実数型を
出力させるにはどのようにしたらよろしいのでしょうか?
(dble(a(i)) i=201〜300 としても駄目でした。)
お教え頂けますと大変ありがたいです。
どうぞよろしくお願い致します。
いらっしゃいましたら、アドバイスを頂けないでしょうか。
勉強のために下記のテストコードを書いてみました。
まず、整数型配列 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 としても駄目でした。)
お教え頂けますと大変ありがたいです。
どうぞよろしくお願い致します。
276275
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
どうぞよろしくお願い致します。
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
277269
2013/11/10(日) 23:00:46.41278デフォルトの名無しさん
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)]
イマイチ何がしたのか分からんが、こうすれば一応望みの結果は得られる。
do i = 1, 300,2
write(10, *) transfer([a(i),a(i+1)], 0.0d0)
end do
これは、x86のようなリトル・エンディアンCPU向けの場合。
PowerPCとかビッグ・エンディアンの場合は、[a(i+1),a(i)]
279デフォルトの名無しさん
2013/11/10(日) 23:56:18.99 [ ]はFortran2003、F90/95なら(/ /)で。配列構成子(array constructor)
倍精度実数と整数をEquivalenceで同じ番地を共有させているから、
整数2個毎が倍精度実数1個に対応している。
(KINDの数字は必ずしもバイト数に対応すると限らないが、慣習から仮定して)
エンディアンによって、メモリー上の倍精度実数の上位と下位が入れ替わるので
適宜対応する必要がある。
それをF90以降のTRANSFER関数で、メモリー内容を第二引数の型で解釈している。
単精度実数なら他に単にFORMATを実数用にして強行突破する方法も考えられる。
倍精度の時は難しいかな??
倍精度実数と整数をEquivalenceで同じ番地を共有させているから、
整数2個毎が倍精度実数1個に対応している。
(KINDの数字は必ずしもバイト数に対応すると限らないが、慣習から仮定して)
エンディアンによって、メモリー上の倍精度実数の上位と下位が入れ替わるので
適宜対応する必要がある。
それをF90以降のTRANSFER関数で、メモリー内容を第二引数の型で解釈している。
単精度実数なら他に単にFORMATを実数用にして強行突破する方法も考えられる。
倍精度の時は難しいかな??
280デフォルトの名無しさん
2013/11/14(木) 00:03:06.56 Fortran2015に関するまとめサイトとかないかね?
今度は何を付け加えるのさ?
今度は何を付け加えるのさ?
281デフォルトの名無しさん
2013/11/19(火) 00:19:07.21 すんません。
数値計算する際、expとかの値が大きすぎたり、小さすぎたりしてオーバーフローしたり、exp(x)のx が限りなくゼロに近い時とか、欲しい値が得られません。
みんなはどうやって回避してますか?
よくよく考えたらexp1000 とかオーバーフローしますよね。
数値計算する際、expとかの値が大きすぎたり、小さすぎたりしてオーバーフローしたり、exp(x)のx が限りなくゼロに近い時とか、欲しい値が得られません。
みんなはどうやって回避してますか?
よくよく考えたらexp1000 とかオーバーフローしますよね。
282デフォルトの名無しさん
2013/11/19(火) 10:23:13.29 ここの人はフォートランはわからないから他いけ
283デフォルトの名無しさん
2013/11/19(火) 18:58:29.45284デフォルトの名無しさん
2013/11/19(火) 19:01:27.99 書き込んでから気付いたが、もしexp(1000)の値を実際に表示したいのなら
多倍長計算とかしかないな
多倍長計算とかしかないな
285デフォルトの名無しさん
2013/11/19(火) 23:54:23.18■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 「国民の憤りを引き起こした」中国側“高市首相発言の撤回改めて要求” [どどん★]
- 【インバウンド】中国からの“渡航自粛”…ツアー1000人分の直前キャンセル「キャンセル料は免除してくれ」 ことしいっぱいキャンセルに [1ゲットロボ★]
- 【芸能】日中関係悪化でエンタメ業界に大ダメージ… JO1の中国でのイベント中止、邦画は公開延期、STARTOアイドルへの影響も [冬月記者★]
- XやChatGPTで広範囲の通信障害 投稿や閲覧できず [蚤の市★]
- 【サッカー】日本代表、ボリビアに3発快勝 森保監督通算100試合目を飾る…鎌田、町野、中村がゴール [久太郎★]
