Fortran 中的可选参数,当函数调用的签名最初未知时

Optional arguments in Fortran, when the signature of the function call is not initially known

提问人:Oier Arcelus 提问时间:11/12/2023 更新时间:11/12/2023 访问量:75

问:

我有一个 fortran 子例程,它采用许多可选参数,我正在尝试为它构建一个 python 接口

subroutine myfunc(mandatory, A, B, C, result)
   integer, intent(in) :: mandatory
   integer, optional, intent(in) :: A, B, C
   integer, intent(out) :: result
end subroutine myfunc

在 python 函数调用中,给出了必需参数,而可选参数在字典中作为键/值对给出。与 python 接口的 fortran 函数接受 python 调用的参数,并检查特定键是否存在并将其存储在布尔变量中。

python 调用如下所示

result = pymyfunc(1, {'A': 1, 'C': 2})

接口函数将保存布尔值

is_A = .true.
is_B = .false.
is_C = .true.

然后,它是关于在 if/else 块中构建所有可能的可选值组合的逻辑,以适当地调用 fortran 例程。在这种情况下:

...
else if (is_A .and. .not. is_B .and. is_C) then

   call myfunc(mandatory,A=A,C=C,result)
...

现在,这个 if/else 块可以管理 3 个可选参数。但是你可以看到,在存在更多可选参数的情况下,这种情况会如何爆发。

我想知道是否有更智能的方法来解决这个问题。我可能遗漏了一些关于 fortran 如何处理调用签名的函数的东西。

python fortran 可选参数

评论

2赞 Karl Knechtel 11/12/2023
例如,当没有收到 的值时,语是什么?如果它等同于 使用 的默认值 ,那么为什么不在从 Python 传入的字典中缺少该默认值时显式传递该默认值呢?myfuncBB
0赞 Ian Bush 11/12/2023
我发现上面的描述有点令人困惑。一个只有 2 或 3 个可选参数的最小、可重现的示例确实会有所帮助。
0赞 Oier Arcelus 11/12/2023
@KarlKnechtel例程具有内部块。可选参数修改 的内部计算。因此,如果存在,则 的值(由 确定)会发生变化。如果存在,它将更改之前由 etc 完成的修改。myfuncif (present(var)) thenresultAresultmandatoryBA
0赞 PierU 11/13/2023
我不知道它对 python 情况有帮助,但是从 C 将空指针传递给 Fortran 例程的可选参数就像参数不存在一样。
0赞 Craig 11/18/2023
这样做感觉有点笨拙,但也许采取论据而不是在例程中进行检查会更好?我认为这将使您在调用方中拥有更清晰的代码。POINTEROPTIONALASSOCIATED

答: 暂无答案