从循环中选择一个值并将子程序转出到主程序(Fortran)

时间:2014-11-23 03:39:59

标签: fortran subroutine

我是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没有出现在子程序中。 有人可以建议我如何选择你的最后一个值并将其传递给主程序吗? 非常感谢你。

1 个答案:

答案 0 :(得分:0)

将您的过程放入模块并使用该模块,以便编译器可以检查调用和过程中参数的一致性。在我看来,你有一些未声明的变量。例如,lambda1h在哪里宣布?

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