質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

Q&A

解決済

1回答

3746閲覧

エラーメッセージの解釈・メモリの節約方法

tomonari

総合スコア3

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

0グッド

1クリップ

投稿2021/11/22 02:41

編集2021/11/22 02:43

##不明点
プログラミングについて質問です.
fortranを用いて数値計算を行ったところ,以下のメッセージが出てきました.

Program received signal SIGBUS: Access to an undefined portion of a memory object.

Backtrace for this error:
0 0x1046e4b17
1 0x1046e3bab
2 0x1b30544e3
3 0x1042ae27f
zsh: bus error ./a.out

このメッセージは「メモリが足りない」ということだと思いますが,この問題を解決するには
(1)RAMの容量の大きなパソコン(計算機)で計算する
(2)ソースコードの見直しによってメモリを節約する
の2つの方法がある,という認識であっていますか?
また,ソースコードの見直しの場合,どこを変えれば節約することができるでしょうか?
どなたか詳しい方いましたらご教示いただけますか.
よろしくお願いいたします.

##環境
M1 MacBookAir
8GB

##ソースコード

Fortran

1 implicit real*8 (a-h,o-z) 2 parameter(nx=21, ny=21, nz=21) 3 common /aray1/ temp(0:nx,0:ny,0:nz) 4 common /aray2/ qmin(0:nx,0:ny),qmax(0:nx,0:ny) 5 common /coor1/ tinf, rho, ep, sig, cp, cond, alpha,time,plp,pp 6 common /coor2/ imax, jmax, kmax, nstep, nout 7 common /coor3/ dd, dt, dx, dy, dz, phi, ss, cfl, eta, tmax, tm 8 common /coor4/ ff 9 common /coor5/ x1, y1, z1, rs 10 11 12 call parm 13 call init 14 15 open(18, file='mydata.csv', form='formatted', status='unknown') 16 17c main sequence 18 locl = 0 19 time = 0.0 20 1000 continue 21 locl = locl + 1 22 loop =loop + 1 23 time = time + dt 24 25 call intg 26 call rbdy 27 28c post sequence 29 m =mod(locl, nout) 30 if(m.eq.0) then 31 call clth 32 call wrtd 33 write(18,*) time,',',ff,',', 34 & temp(int(imax/2),int(jmax/2),int(kmax/2)) 35 endif 36 if(locl.lt.nstep) go to 1000 37 close(18) 38 39 40c exit 41 stop 42 end 43 44 45c---------------------------------------------------------------- 46 subroutine parm 47 48 implicit real*8 (a-h,o-z) 49 parameter(nx=21, ny=21, nz=21) 50 common /aray1/ temp(0:nx,0:ny,0:nz) 51 common /coor1/ tinf, rho, ep, sig, cp, cond, alpha,time,plp,pp 52 common /coor2/ imax, jmax, kmax, nstep, nout 53 common /coor3/ dd, dt, dx, dy, dz, phi, ss, cfl, eta, tmax, tm 54 common /coor5/ x1, y1, z1, rs 55 56 tmax=2.0 57 dd=0.00163 58 xmax=0.002 59 ymax=0.002 60 zmax=0.002 61 dx=xmax/nx 62 dy=ymax/ny 63 dz=zmax/nz 64 x1=xmax/2 65 y1=ymax/2 66 z1=zmax/2 67 tinf=273.0+1850.0 68 phi=0.0007 69 ss=0.25*3.1414*phi**2 70 cfl=0.5 71 eta=0.121 72 nout = 100 73 tm=1850.0+273.0 74 rs=dd/2 75 76 return 77 end 78 79c---------------------------------------------------------------- 80 subroutine init 81 82 implicit real*8 (a-h,o-z) 83 parameter(nx=21, ny=21, nz=21) 84 common /aray1/ temp(0:nx,0:ny,0:nz) 85 common /aray2/ qmin(0:nx,0:ny),qmax(0:nx,0:ny) 86 common /coor1/ tinf, rho, ep, sig, cp, cond, alpha,time,plp,pp 87 common /coor2/ imax, jmax, kmax, nstep, nout 88 common /coor3/ dd, dt, dx, dy, dz, phi, ss, cfl, eta, tmax, tm 89 common /coor5/ x1, y1, z1, rs 90 91 rho=5800.0 92 ep=0.32 93 sig=5.67e-8 94 cp=436.0 95 cond=94.61 96 alpha=cond/(rho*cp) 97 dt=cfl*dx**2/2/alpha 98 write(6,*) dt 99 nstep=tmax/dt 100 101 x=0.0 102 do i=0,imax 103 y=0.0 104 do j=0,jmax 105 z=0.0 106 cout=0 107 do k=0,kmax 108 if (z>=z1-dsqrt(rs**2-(y-y1)**2-(x-x1)**2) 109 & .and. z<=z1+dsqrt(rs**2-(y-y1)**2-(x-x1)**2)) then 110 qmax(i,j)=k 111 cout = cout +1 112 end if 113 114 if (z>=z1-dsqrt(rs**2-(y-y1)**2-(x-x1)**2) 115 & .and. z<=z1+dsqrt(rs**2-(y-y1)**2-(x-x1)**2)) then 116 temp(i,j,k)=tinf 117 end if 118 z=z+dz 119 end do 120 qmin(i,j)=qmax(i,j)-cout+1 121 y=y+dy 122 end do 123 x=x+dx 124 end do 125 126 return 127 end 128 129c---------------------------------------------------------------- 130 subroutine intg 131 132 implicit real*8 (a-h,o-z) 133 parameter(nx=21, ny=21, nz=21) 134 common /aray1/ temp(0:nx,0:ny,0:nz) 135 common /coor1/ tinf, rho, ep, sig, cp, cond, alpha,time,plp,pp 136 common /coor2/ imax, jmax, kmax, nstep, nout 137 common /coor3/ dd, dt, dx, dy, dz, phi, ss, cfl, eta, tmax, tm 138 common /coor5/ x1, y1, z1, rs 139 140 if (time<0.3) then 141 plp = 0.0 142 else if (time<1.7) then 143 plp = 100.0 144 else 145 plp = 0.0 146 end if 147 pp = plp / ss 148 149c Euler explicit method 150 x=dx 151 do i=1,imax-1 152 y=dy 153 do j=1, jmax-1 154 z=dz 155 do k=1, kmax-1 156 cp = 436.0-0.0813*(temp(i,j,k)-tm) 157 cond = 94.61 + 4.41e-2*(temp(i,j,k)-tm) 158 if (z>=z1-dsqrt(rs**2-(y-y1)**2-(x-x1)**2) 159 & .and. z<=z1+dsqrt(rs**2-(y-y1)**2-(x-x1)**2)) then 160 call rbdy 161 temp(i,j,k) = temp(i,j,k) 162 & + dt*cond/rho/cp*(temp(i+1,j,k) 163 & -2.0*temp(i,j,k)+temp(i-1,j,k))/(dx**2) 164 & + dt*cond/rho/cp*(temp(i,j+1,k) 165 & -2.0*temp(i,j,k)+temp(i,j-1,k))/(dx**2) 166 & + dt*cond/rho/cp*(temp(i,j,k+1) 167 & -2.0*temp(i,j,k)+temp(i,i,k-1))/(dx**2) 168 end if 169 z=z+dz 170 end do 171 y=y+dy 172 end do 173 x=x+dx 174 end do 175 176 do i=1,imax-1 177 do j=1,jmax-1 178 do k=1,kmax-1 179 write(6,*) temp(i,j,k) 180 end do 181 end do 182 end do 183 184 return 185 end 186 187c---------------------------------------------------------------- 188 subroutine rbdy 189 190 implicit real*8 (a-h,o-z) 191 parameter(nx=21, ny=21, nz=21) 192 common /aray1/ temp(0:nx,0:ny,0:nz) 193 common /aray2/ qmin(0:nx,0:ny),qmax(0:nx,0:ny) 194 common /coor1/ tinf, rho, ep, sig, cp, cond, alpha,time,plp,pp 195 common /coor2/ imax, jmax, kmax, nstep, nout 196 common /coor3/ dd, dt, dx, dy, dz, phi, ss, cfl, eta, tmax, tm 197 if (i.eq.qmin(j,k) .or. i.eq.qmax(j,k) .or. j.eq.qmin(i,k).or. 198 & j.eq.qmax(i,k) .or. k.eq.qmin(i,j) .or. k.eq.qmax(i,j)) then 199 if (i.eq.qmin(i,j)) then 200 temp(i-1,j,k)=temp(i,j,k) 201 & -dx*ep*sig*temp(i,j,k)**4/cond 202 end if 203 if (i.eq.qmax(i,j)) then 204 temp(i+1,j,k)=temp(i,j,k) 205 & -dx*ep*sig*temp(i,j,k)**4/cond 206 end if 207 if (j.eq.qmin(i,j)) then 208 temp(i,j-1,k)=temp(i,j,k) 209 & -dx*ep*sig*temp(i,j,k)**4/cond 210 end if 211 if (j.eq.qmax(i,j)) then 212 temp(i,j+1,k)=temp(i,j,k) 213 & -dx*ep*sig*temp(i,j,k)**4/cond 214 end if 215 if (k.eq.qmin(i,j)) then 216 temp(i,j,k-1)=temp(i,j,k) 217 & -dx*ep*sig*temp(i,j,k)**4/cond 218 end if 219 if (k.eq.qmax(i,j)) then 220 temp(i,j,k+1)=temp(i,j,k) 221 & -dx*ep*sig*temp(i,j,k)**4/cond+eta*pp*dz/cond 222 end if 223 end if 224 return 225 end 226 227c---------------------------------------------------------------- 228 subroutine clth 229 230 implicit real*8 (a-h,o-z) 231 parameter(nx=21, ny=21, nz=21) 232 common /aray1/ temp(0:nx,0:ny,0:nz) 233 common /aray2/ qmin(0:nx,0:ny),qmax(0:nx,0:ny) 234 common /aray3/ ph(0:nx,0:ny),pl(0:nx,0:ny) 235 common /coor1/ tinf, rho, ep, sig, cp, cond, alpha,time,plp,pp 236 common /coor2/ imax, jmax, kmax, nstep, nout 237 common /coor3/ dd, dt, dx, dy, dz, phi, ss, cfl, eta, tmax, tm 238 common /coor4/ ff 239 common /coor5/ x1, y1, z1, rs 240 241 x=0.0 242 do i=0,imax 243 y=0.0 244 do j=0,jmax 245 z=0.0 246 pl(i,j)=0.0 247 ph(i,j)=0.0 248 do k=0,kmax 249 if (z>=z1-dsqrt(rs**2-(y-y1)**2-(x-x1)**2) 250 & .and. z<=z1+dsqrt(rs**2-(y-y1)**2-(x-x1)**2)) then 251 if(k.eq.qmin(i,j) .or. k.eq.qmax(i,j)) then 252 if(z>z1) then 253 ph(i,j)=vapor(temp(i,j,k)) 254 else if(z<z1) then 255 pl(i,j)=vapor(temp(i,j,k)) 256 end if 257 end if 258 end if 259 z=z+dz 260 end do 261 y=y+dy 262 end do 263 x=x+dx 264 end do 265 266 ff=0.0 267 do i=0,imax 268 y=0.0 269 do j=0,jmax 270 pres = ph(i,j)-pl(i,j) 271 ff=ff+pres*dx*dy 272 end do 273 end do 274 275 return 276 end 277 278c---------------------------------------------------------------- 279 subroutine wrtd 280 281 implicit real*8 (a-h,o-z) 282 parameter(nx=21, ny=21, nz=21) 283 common /coor1/ tinf, rho, ep, sig, cp, cond, alpha,time,plp,pp 284 common /coor2/ imax, jmax, kmax, nstep, nout 285 common /coor3/ dd, dt, dx, dy, dz, phi, ss, cfl, eta, tmax, tm 286 common /coor4/ ff 287 288 return 289 end 290c---------------------------------------------------------------- 291 real(8) function vapor(y) 292 implicit none 293 real(8) :: y 294 vapor=10.0**(5.006+6.806-30295.0/y) 295 return 296 end function vapor

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

このメッセージは「メモリが足りない」ということだと思いますが,

いいえ。
配列の添え字の範囲オーバーでしょうね。

subroutine rbdyの中で、未定義のi j k等が使われているので、それが原因でしょう。

このレベルの間違いがあるとすると、他にもいろいろ間違いがありそうです。
暗黙の変数宣言はやめた方がいいと思います。40年くらい前のプログラムですかね?

投稿2021/11/22 03:11

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomonari

2021/11/23 03:06

ご丁寧にありがとうございます. そうですね,うっかりしていました. >40年くらい前のプログラムですかね? おっしゃる通り,年配の先生に教えてもらったFortranを思い出しながら書いたので古いプログラムになっています. 暗黙の変数宣言はやめようと思います.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問