ネムネコ、プログラミングで予期せぬ事態に遭遇し、当惑する。
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コンパイラを持っている奴は、コンパイルして、オレと同じような現象に見舞われるか、試してみるにゃ。そして、変なことが起きなければ、起きないと教えて欲しいにゃ。