【问题标题】:Defining a parameter from an input variable (fortran)从输入变量定义参数 (fortran)
【发布时间】:2023-02-03 15:45:19
【问题描述】:

我的一部分代码在正在考虑的模块中定义了常量。这就是我所说的:

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 连接起来,这样当我在 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:如果我需要澄清我的一些疑问,如果不够清楚,请告诉我。

【问题讨论】:

    标签: parameters fortran cffi


    【解决方案1】:

    解决方法是更改​​ Fortran 代码并将这些量设为变量而不是常量。然后你可以让它们成为子程序的参数。您也可以使它们成为全局变量并在模块中更改它们,但这听起来不太干净。

    parameter 常量没有希望有不同的解决方法,编译器对待它们的方式非常不同,甚至不必在内存中为它们腾出空间。编译器可以将它们的值直接放在使用它们的表达式中。

    【讨论】:

      猜你喜欢
      • 2020-12-31
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      相关资源
      最近更新 更多