我是Fortran编程的新手。我会非常感谢有关这个问题的任何帮助。我需要将一个do循环中的值从循环发生的子程序中传递到主程序中。这样的东西:
program wet
implicit none
real(8) sulstar, u1, u2, theta1, theta2, q1, q2, tol
real(8) sblstar, surstar, sbrstar
open(3,file="theta1.txt",status="unknown")
tol=1
call ra1(sulstar,sblstar)
u1=sulstar
q1=(u1)**3
write(3,*) q1, u1
end
subroutine ra1(ulstar,blstar)
! Purpose: To calculate variables across rarefaction1 before the shock
implicit none
real(8) h(51), u(51), b(51), x(51), l(51), inibl, inihl, iniul
real(8) delta, ulstar,blstar
integer i, itermax, t_start
t_start=1
itermax=51
delta=0.01
inihl=1
iniul=0
inibl=0
open(unit=1,file="rare1.txt",status="unknown")
do 10 i=2, itermax
h(i)=inihl-(i-1)*delta
u(1)=iniul
h(1)=inihl
l(1)=u(1)-sqrt(h(1))
u(i)=u(i-1)+((lambda1(i-1)-u(i-1))/h(i-1))*(h(i)-h(i-1))
lambda1(i)=u(i)-sqrt(h(i))
b(1)=inibl
b(i)=b(i-1)+(((lambda1(i-1)-u(i-1))**2)/(h(i))-1)*(h(i)-h(i-1))
x(1)=l(1)*t_start
x(i)=l(i)*t_start
write(1,*) x(i), h(i), u(i), b(i)
u(51)=ulstar
b(51)=blstar
10 continue
return
end
我发现无论何时我尝试选择U的第51个值,第51个值都会失真,这意味着当u(51)=时,该值变为零或非常小的数字而不是正确的u值ulstar没有出现在子程序中。 有人可以建议我如何选择你的最后一个值并将其传递给主程序吗? 非常感谢你。
答案 0 :(得分:0)
将您的过程放入模块并使用该模块,以便编译器可以检查调用和过程中参数的一致性。在我看来,你有一些未声明的变量。例如,lambda1
和h
在哪里宣布?
module MyStuff
contains
subroutine ra1(ulstar,blstar)
! Purpose: To calculate variables across rarefaction1 before the shock
implicit none
real(8) h(51), u(51), b(51), x(51), l(51), inibl, inihl, iniul
real(8) delta, ulstar,blstar
integer i, itermax, t_start
t_start=1
itermax=51
delta=0.01
inihl=1
iniul=0
inibl=0
open(unit=1,file="rare1.txt",status="unknown")
do 10 i=2, itermax
h(i)=inihl-(i-1)*delta
u(1)=iniul
h(1)=inihl
l(1)=u(1)-sqrt(h(1))
u(i)=u(i-1)+((lambda1(i-1)-u(i-1))/h(i-1))*(h(i)-h(i-1))
lambda1(i)=u(i)-sqrt(h(i))
b(1)=inibl
b(i)=b(i-1)+(((lambda1(i-1)-u(i-1))**2)/(h(i))-1)*(h(i)-h(i-1))
x(1)=l(1)*t_start
x(i)=l(i)*t_start
write(1,*) x(i), h(i), u(i), b(i)
u(51)=ulstar
b(51)=blstar
10 continue
return
end subroutine ra1
end module MyStuff
program wet
use MyStuff
implicit none
real(8) sulstar, u1, u2, theta1, theta2, q1, q2, tol
real(8) sblstar, surstar, sbrstar
open(3,file="theta1.txt",status="unknown")
tol=1
call ra1(sulstar,sblstar)
u1=sulstar
q1=(u1)**3
write(3,*) q1, u1
end program wet