我的代码的一部分在考虑的模块内定义了常量。这就是我要说的内容:
real(RealExt), parameter :: grav_acc = 9.80665
real(RealExt), parameter :: r_gas_dry = 287.026
real(RealExt), parameter :: cp_air_dry = 1.005e+03
real(RealExt), parameter :: pi = 4.0*atan(1.0)
real(RealExt), parameter :: seconds_per_day = 8.6400e+04
我基本上试图包装这个 fortran 代码,并使用 cffi 将其与 python 接口(interface),这样当我在 python 中给出输入时,fortran 代码会接收它并根据需要执行操作。对我来说,问题不在于 cffi,而在于参数的概念。
类型 RealExt 定义如下:
INTEGER, PARAMETER :: RealExt=SELECTED_REAL_KIND(15, 307)
这些常量位于子程序中;我的目标是将这些常量的值(如重力、行星的旋转速度等)发送到这个子程序,并将它们视为稍后计算的常量。但是,据我在本网站上读到的内容,参数属性要求在运行时知道值。所以,我不能这样做
subroutine runes(g, rd, cp_rd, sec_per_day)
implicit none
real(RealExt), intent(in) :: g, rd, cp_rd, pi_, sec_per_day
real(RealExt), parameter :: grav_acc = g
real(RealExt), parameter :: r_gas_dry = rd
real(RealExt), parameter :: cp_air_dry = cp_rd
real(RealExt), parameter :: pi = pi_
real(RealExt), parameter :: seconds_per_day = sec_per_day
.
.
.
有解决办法吗?我可以以某种方式将传递到子例程的值声明为常量吗?
P.S:如果我还不够清楚,请让我知道是否需要澄清我的一些疑问。
最佳答案
解决方法是更改 Fortran 代码并使这些数量成为变量而不是常量。然后你可以将它们作为子例程的参数。您还可以将它们设为全局变量并在模块中更改它们,但这听起来不太干净。
对于parameter
常量来说,不可能有不同的解决方法,编译器以非常不同的方式对待它们,甚至不需要在内存中为它们腾出空间。编译器可以将它们的值直接放入使用它们的表达式中。
如果您希望保留某些默认值,您还必须更改分配默认值的方式。例如,使用可选参数和本地副本,并在可执行部分而不是声明行中分配值。
关于parameters - 在 Fortran 子例程中从输入变量定义参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75332682/