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



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


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


なのにだよ、


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


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


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

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

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

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


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