• ベストアンサー

Fortran の配列使用に必要なメモリについて

Fortranで数値計算をしています。 配列に必要なメモリの計算方法について質問させてください。 例えば、real(4),real(8),real(10),integer,などでそれぞれ a(10,10) と宣言した配列を用いた計算に必要なメモリはいくらになるでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • karupyon
  • ベストアンサー率80% (4/5)
回答No.1

多くの環境で下記のようになるかと思います。 integer a(10,10) 10x10x4 = 400バイト  ※多くの環境で基本整数型(integer)は4バイトです。 real(4) a(10,10) 10x10x4 = 400バイト ※多くの環境でreal(4)は4バイトで表現される単精度実数です。 real(8) a(10,10) 10x10x8 = 800バイト ※多くの環境でreal(8)は8バイトで表現される倍精度実数です。 real(10) a(10,10) このような型は通常サポートされていないと思います。 参考までに、real(4)やreal(8)などの記述方法において4や8などの番号は コンパイラにより意味が異なるケースがあります。 (コンパイラによってはreal(1)が単精度を表し、real(2)が倍精度を表す他、 real(4)やreal(8)等という型が存在しない状況があります) 以上参考になれば幸いです。

参考URL:
http://www.nag-j.co.jp/fortran/FI_4.html#AUTOTOC_4_1

関連するQ&A

  • fortranの整数と実数

    fortranに関する質問です. 型宣言を下のように行った上で,計算を行うと dが110ではなく,109と出力されるのですが,なぜでしょうか. dも実数で宣言しておくと110.0000と表示されます. こうなる理由と解決策をぜひお教えください. real a,b,c integer d a=33.0 b=3.0 c=0.1 d = (a/b)/c write(*,*) d

  • fortran allocateを使って配列宣言を

    今変数 aについて考えています.aは i,jの2次元の座標におけるデータです. a(1,1)は10個配列を持ちたい a(1,2)は5配列を持ちたい a(i,j)はn個配列を持ちたい このような場合どのように配列を定義すれば良いのでしょうか? 例えば 2次元の大きさが3x3の場合で,それぞれの位置に配列したいデータ個数をnとします. nには既に個数が定義されているとします.このとき aの配列は nを使ってどのように定義すれば良いのでしょうか? integer n(3,3) integer i,j real, allocatable :: a(:,:,:) do j=1,3 do i=1,3 n(i,j)=i*j end do end do do j=1,3 do i=1,3 allocate (a(n(i,j),3,3)) end do end do では aの宣言が重複するためエラーになってします. 何方か良い方法を教えて下さい.

  • fortranの配列のreadについて

    fortran初心者です。 研究のデータ整理を行う際に 240*21のテキストデータを読み込む必要があるのですが、 自分なりに勉強してみたのですが、fortranの計算がずっとカーソルが点滅しており いつまで経っても終わらない状態のため、 ファイルopenまではいくのですが、その中身を読み込めてないようです。 プログラムですが自分としては次のように考えました。 REAL temp DIMENSION temp(21,240) DATA temp/5040*0.00/    open(11,status='unknown',file=filename)    read *,((temp(q,p),p=1,240),q=1,21)    close(11) と配列を組んで考えてみたのですが…ダメでした。 おかしなところがありましたら教えてください。 よろしくお願いします。 対象のテキストデータです。 0 32.57 32.48 32.48 32.57 32.66 32.75 32.75 32.75 33.01 33.10 32.93 32.48 32.21 32.21 32.30 32.21 32.21 32.12 32.12 32.21 1 32.57 32.57 32.48 32.48 32.57 32.66 32.66 32.75 32.93 33.01 32.84 32.39 32.21 32.21 32.21 32.21 32.12 32.12 32.21 32.21 2 32.66 32.66 32.66 32.66 32.75 32.84 32.84 32.84 32.93 33.10 32.93 32.48 32.21 32.21 32.12 32.12 32.12 32.12 32.12 32.21 … 239 37.53 37.28 36.76 36.16 35.64 35.21 34.86 34.51 34.16 33.90 33.54 33.37 33.28 33.10 32.93 32.75 32.57 32.39 32.30 32.21 よろしくお願いします。

  • FORTRAN subroutineと配列と繰り返し

     以下のように二次元配列の場合でsubroutineを使うときに、主プログラムで2重Doループ(iとj)で繰り返しをしているのですが、すでにsubroutineでDoループ(i)を用いて計算しています。これではsubroutineの利点をうまく使えていないと思うのですが、subroutineを使って配列、Doループをきれいにする方法をどなたか教えていただけませんか。  実際は4重ループ、4次元配列なので、プログラムをわかりやすくするためにサブルーチンを使いたいと思っています。 -------------------------------------------------------------- program S real,dimension(5,5) :: B real,dimension(5) :: A integer :: i,j do j=1,5 CALL sub1(A) do i=1,3 B(i,j)=A(i)*j write(*,*) B(i,j) end do end do end program S subroutine sub1(A) real,dimension(5) :: A integer :: i do i=1,3 A(i)=3.*i end do end subroutine sub1

  • fortran 配列

    はじめまして。fortranを勉強しているのですが割付け配列がよく理解できないので教えていただきたいのですが。以下に自分で作った簡単なプログラムを実行していたのですが正しい値になりません。どこが間違っているのでしょうか?教えて下さい。よろしくお願いします。 program list2_3 implicit none real(8), allocatable :: u(:), v(:) integer :: i, n = 2 real(8) dotp allocate (u(n), v(n)) u(1:2) = (/1.2d0,3.4d0/) v(1:2) = (/4.1d0,2.6d0/) dotp = 0.0d0 do i = 1, n dotp = dotp + u(n) * v(n) enddo deallocate (u, v) write(*,*) ' dot product =' , dotp end program list2_3

  • 配列に関してです。

    Dim a(,) As Integer a= New Integer(,) {0,300,400,400,500,600,700,800}  {400,500,700,800,1000,1200,1300,1500}   {700,1000,1300,1600,2000,2000,2000,2000}   {1300,2000,2000,2000,2000,2000,2000,2000} ローカルレベルでこのように配列を宣言したのですが ・配列初期化子の次元が少なすぎます。 ・構文エラーです。 とエラーが出てしまいます。 この宣言、初期化の仕方のどこがおかしいのでしょうか?

  • Fortranの変数の配列の設定値を計算中に設定するには?

    FortranでプログラムをつくるときAという変数にBの値の範囲で配列を設定する。A(B) このとき、プログラム作成時にはAには具体的な数値を設定しておかなくても良いですが、Bには具体的に配列の数を設定しておく必要があるように思います。  質問は、  プログラムが動く初めにはBに具体的な値を入れず、プログラム作動状況に応じてプログラム作動中にBの配列の範囲を設定できないものでしょうか?

  • fortran 配列宣言のオーバーフロー

    fortranの配列宣言について質問です。 下記の様に配列の変数をサブルーチンの内外で宣言することで違いが出てきました。 こういうものなのでしょうか。失礼します。 parameter(ine=4999) c call test1(ine) !error call test2() !OK stop end subroutine test1(ine) dimension ary1(ine,50) return end subroutine test2() parameter(ine=4999) dimension ary1(ine,50) return end

  • Segmentation Fault (メモリ制限?)

    Segmentation Fault (Fortranのプログラム)に関して質問です。 あるデータを処理するプログラムですが、小さなデータの場合問題ないですが、 大きなデータを扱うようになった場合Segmentation Faultとなります。 宣言している配列サイズを超えた部分のアクセスなどでSegmentation Faultが出ることがあるようですが、どうやらそのような現象ではなく、 メモリ制限にひっかかっている感じがいたします。 エラーが出る部分はどうやらSubroutine内の大きなデータ宣言を している部分のようです。(下の例ではtest bが表示れる以前に止まります。) !-------------------------------------------------- subroutine calc_tri( ) implicit none real*8 data1(3,200000) !<--- ここでエラー --> write(6,*) 'test b' !-------------------------------------------------- このような場合、配列データを減らす以外にどのような対策が あるのでしょうか? あるいはメモリ制限になりそうなデータ数が分る方法などあります でしょうか? 環境は linux (CentOS) intel Fortran Compiler version 8.0 Mem: 1GB topコマンドにて Memの使用割り合いは10%にもならないのですが コンパイラによるメモリ制限などもあるのでしょうか? subroutine内の配列の宣言はデータ数より多くとっていることは確認しています。

  • Fortran77で多次元配列を並び替え(ソート)する方法

    Fortran77のプログラミングを勉強しています。 多次元配列の並び替えをする時に、各行の組み合わせを変えずにある列に含まれる要素についてソートを行いたいのですが、やり方が分かりません。どなたか方法を教えてくださいますでしょうか。 例えば、 (1,1)A,(1,2)あ,(1,3)3 (2,1)B,(2,2)い,(2,3)1 (3,1)C,(3,2)う,(3,3)2 という3×3の配列を読み込み、3列目を昇順に並べ替えて、 (1,1)B,(1,2)い,(1,3)1 (2,1)C,(2,2)う,(2,3)2 (3,1)A,(3,2)あ,(3,3)3 とした上で、別のファイルに出力したいのです。 初歩的な質問で恐縮ですが、どなたかご教授よろしくお願い致します。

専門家に質問してみよう