【问题标题】:How to print data from a module used in my fortran subroutine如何从我的 fortran 子例程中使用的模块打印数据
【发布时间】:2013-01-16 17:52:47
【问题描述】:

提前感谢您的帮助.. 我想在 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

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

非常感谢您的帮助 姆谢赫

【问题讨论】:

  • 您正在打开输出文件吗?你是在你的模块子程序还是主程序中打开它?
  • 感谢您的提问,我想在我的主子例程 XXX 中打印模块中的参数值,但没有出现,还尝试通过将 write 语句放入模块它自己,但也是不可能的
  • 我仍然不确定我是否理解问题所在。为什么不能从主例程中写入值? mgilson 下面答案中的示例代码对您不起作用吗?
  • 也许混乱在别处......你所说的“主子程序”到底是什么意思?子程序不会自动执行,只有(主)program 是。因此,Mgilson 的例子应该奏效。此外,您不能在模块中使用write 语句,除非它包含在子例程或函数中;模块本身也不执行任何操作。
  • 谢谢马特和西格玛,如果问题不是很清楚,我很抱歉。问题是,我想从主程序中使用的模块写入数据,当我将写入语句放入模块或主程序中时,我看不到写入语句的结果,我执行以下操作:

标签: fortran


【解决方案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

【讨论】:

    【解决方案2】:

    你的意思是这样的:

    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
    

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

    【讨论】:

    • 这很难读。您需要编辑原始问题,将其放入问题正文中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    相关资源
    最近更新 更多