So-net無料ブログ作成

Help, me!! 誰か、オレにこの怪現象の解決法を教えるケロ!! [ひとこと言わねば]

ネムネコ、プログラミングで予期せぬ事態に遭遇し、当惑する。


parameter (ns=100,ns1=101)
real x(0:ns), y(0:ns)
data x,y/ns1*0.,ns1*0/

n=10

x0=0.; xn=1. ! 境界のx座標
x(0)=x0; x(n)=xn
y(0)=2.; y(n)=0. ! 境界条件

call Solver(x,y,ns,n)

!write(6,*) 'main'
do i=0, n
!    write(6,*) i, x(i), y(i)
end do

end

function f(x)
f=-14./x
end

function g(x)
g=x**3
end

function h(x)
h=2*x**3
end

! ここより下はいじると危険
! ブラックボックスとして使うにゃ


subroutine Solver(x,y,ns,n)
real a(ns),b(ns),c(ns),d(ns)
real x(0:ns), y(0:ns)

n1=n-1
dx=(x(n)-x(0))/n

do i=i,n1
    x(i)=x(0)+i*dx
end do

do i=1,n1
    a(i)=1-dx/2.*f(x(i))
    b(i)=-(2-dx*dx*g(x(i)))
    c(i)=1+dx/2.*f(x(i))
    d(i)=dx*dx*h(x(i))
end do
    d(1)=d(1)-a(1)*y(0)
    d(n1)=d(n1)-c(n1)*y(n)

call tdma(a,b,c,d,n1)

do i=1,n1
    y(i)=d(i)
end do

write(6,*) 'subroutine'
do i=0, n
    write(6,*) i, x(i), y(i)
end do

end

subroutine tdma(a,b,c,d,n)
real a(n), b(n), c(n),d(n)
do i=1,n-1
    ratio=a(i+1)/b(i)
    b(i+1)=b(i+1)-ratio*c(i)
    d(i+1)=d(i+1)-ratio*d(i)
end do
d(n)=d(n)/b(n)
do i=n-1,1,-1
    d(i)=(d(i)-c(i)*d(i+1))/b(i)
end do

end

これだと、正しい計算結果を表示してくれるにゃ。

fusigi01.png

なのにだよ、

parameter (ns=100,ns1=101)
real x(0:ns), y(0:ns)
data x,y/ns1*0.,ns1*0/

n=10

x0=0.; xn=1. ! 境界のx座標
x(0)=x0; x(n)=xn
y(0)=2.; y(n)=0. ! 境界条件

call Solver(x,y,ns,n)

write(6,*) 'main'
do i=0, n
!    write(6,*) i, x(i), y(i)
end do

end

function f(x)
f=-14./x
end

function g(x)
g=x**3
end

function h(x)
h=2*x**3
end

! ここより下はいじると危険
! ブラックボックスとして使うにゃ


subroutine Solver(x,y,ns,n)
real a(ns),b(ns),c(ns),d(ns)
real x(0:ns), y(0:ns)

n1=n-1
dx=(x(n)-x(0))/n

do i=i,n1
    x(i)=x(0)+i*dx
end do

do i=1,n1
    a(i)=1-dx/2.*f(x(i))
    b(i)=-(2-dx*dx*g(x(i)))
    c(i)=1+dx/2.*f(x(i))
    d(i)=dx*dx*h(x(i))
end do
    d(1)=d(1)-a(1)*y(0)
    d(n1)=d(n1)-c(n1)*y(n)

call tdma(a,b,c,d,n1)

do i=1,n1
    y(i)=d(i)
end do

write(6,*) 'subroutine'
do i=0, n
    write(6,*) i, x(i), y(i)
end do

end

subroutine tdma(a,b,c,d,n)
real a(n), b(n), c(n),d(n)
do i=1,n-1
    ratio=a(i+1)/b(i)
    b(i+1)=b(i+1)-ratio*c(i)
    d(i+1)=d(i+1)-ratio*d(i)
end do
d(n)=d(n)/b(n)
do i=n-1,1,-1
    d(i)=(d(i)-c(i)*d(i+1))/b(i)
end do

end

と、赤いところを変更すると、計算結果の出力がおかしくなる。

fushigi-002.png

なぜ、このようなことが起きるんだろう(・・?

オレが悪いのか、ネムネコの使っているFortranコンパイラーが悪いのか(・・?

ネムネコのFortranはC言語に汚染されているから、プログラム中でちょっと危ないことをしているのかもしれないけれど、それにしたって、なぜ、write(6,*) 'main'の一文を入れると、それ以前のものまでおかしくなるのか、理解できないにゃ。

この怪現象が何故起きるのか、分かる奴は教えるにゃ。


Fortranコンパイラを持っている奴は、コンパイルして、オレと同じような現象に見舞われるか、試してみるにゃ。そして、変なことが起きなければ、起きないと教えて欲しいにゃ。


nice!(0)  コメント(3) 

nice! 0

コメント 3

ddtddtddt

 まず現象を切り分けましょう。

 「!」はコメント記号ですよね?。そうするとます、

  !write(6,*) 'main'
  do i=0, n
  ! write(6,*) i, x(i), y(i)
  end do

では、そもそも何にも出力されないような気がします。

「write(6,*) i, x(i), y(i)」の前の「!」は誤植?。

 まずは、そこから・・・(^^)。

by ddtddtddt (2017-11-11 22:30) 

プリプリちぃちゃん

do i=i,n1  ← i=i ではなく 1 の間違いだろうと思いまちゅでちゅ
x(i)=x(0)+i*dx
end do


by プリプリちぃちゃん (2017-11-11 22:38) 

nemurineko

do i=i,n1  ← i=i ではなく 1 の間違いだろうと思いまちゅでちゅ
x(i)=x(0)+i*dx
end do

あっ、ほんとだ、間違っている(>_<)

「プリプリちいちゃん」さん、ありがとうございます。

致命的とも言える間違いを犯しているのに、なぜ、これで計算できたのだろう・・・。
iはこの時点でゴミの値が入っているのだから、プログラムの実行時にエラーが起きてもおかしくないのに・・・。

それはそれとしまして、
間違いがわかり、おかしな値が出なくなりました。
ありがとうございますm(__)m

by nemurineko (2017-11-12 13:09) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。