如何从我的fortran子例程中使用的模块打印数据

时间:2013-01-16 17:52:47

标签: fortran

先谢谢你的帮助.. 我想在主FORTRAN程序的输出文件中打印数据,并在模块中定义这些数据,我已经在主程序中使用该模块进行声明。但我无法在主程序和模块中获得写入语句。

MODULE model 
IMPLICIT NONE
 SUBROUTINE model_initialize 
 IMPLICIT NONE
 INTEGER a,dim REAL(float) :: E,nu 
 REAL(float) :: lambda,mu 
 E=5000 lambda = E*nu/(1.d0+nu)/(1.d0-2.d0*nu) 
 mu = E/2.d0/(1.d0+nu) 
 RETURN 
 END SUBROUTINE model_initialize 
 Write (6,)'Lambda',lambda 
 Write (6,)'mu',mu 
 END MODULE model 
 SUBROUTINE XXXX 
 USE model 
 IMPLICIT NONE 
 CALL model_initialize 
 Write (6,)'Lambda',lambda 
 Write (6,)'mu',mu 
 END SUBROUTINE XXX

当我将write语句放在模块或主子程序中时,我无法在输出中看到它们。

非常感谢你的帮助 Msekh

2 个答案:

答案 0 :(得分:1)

你的意思是:

module material
  real :: stress = 6.0
  save
end module material

subroutine xxx()
  use material, only: stress
  write(6,*) stress
end subroutine

program main
call xxx()
end program main

这会将stress的值写入与单元6连接的类文件对象(通常这是stdout,但它可能会创建一个名为fort.6的新文件,具体取决于编译器和环境设置。)

答案 1 :(得分:1)

Mgilson已经为您提供了一个应该可行的示例,但您发布的代码将无法编译。这就是原因:

  • 您的子程序model_initialize位于模块的“规范部分”中。它应该是外部的(如xxxx)或模块的内部(在这种情况下,您必须提供contains语句。)
  • model_initialize中的变量是子程序的本地变量,不能在其外部访问。
  • 您不能在模块的规范部分中拥有可执行代码(如write),只能在内部过程中使用。
  • float不是本机Fortran类型,您必须使用数字参数(通常为4,8,16),定义自己的,或使用iso_fortran_env模块中的定义。

也就是说,如果您只需要定义一些您想要访问的数据,您可以直接将它放在模块中,如下所示:

module model
  use iso_fortran_env 
  implicit none

  integer :: A, dim 
  real(real32) :: E, nu, lambda, mu

  E = 5000
  lambda = E*nu/(1.d0+nu)/(1.d0-2.d0*nu)   ! <-- nu is undefined
  mu = E/2.d0/(1.d0+nu)

contains

  subroutine xxxx 
    write (6,*) 'lambda', lambda 
    write (6,*) 'mu', mu 
  end subroutine xxxx
end module model