parameters - 在 Fortran 子例程中从输入变量定义参数

标签 parameters fortran cffi

我的代码的一部分在考虑的模块内定义了常量。这就是我要说的内容:

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/

相关文章:

python - 参数化生成器?

使用 lapack 计算倒数条件数(即 rcond(x))

python - 如何用 Python 读/写 Fortran 名单?

common-lisp - 常见的 Lisp CFFI : Assign a struct value to an array index

python - 如何使用 CFFI 将多维 Numpy 数组传递给 C 函数?

java - 如何从curl获取REST Web服务中的参数?

php - &$PHP 中的变量

c - 如何使用 iso_c_binding 将 MPI 通信器句柄从 Fortran 传递到 C

common-lisp - cffi 函数调用挂起

C++ 传递一个结构并传递一个可互换的指针?