【发布时间】:2016-06-29 18:24:16
【问题描述】:
使用静态变量在子例程中存储状态是一种好习惯吗?我想到了以下内容:
subroutine somesub()
logical, save :: first_call = .true.
if (first_call) then
! do some stuff
first_call = .false.
end if
! ... perform standard work
end subroutine somesub
“一些东西”的例子包括:
- 分配工作数组。这可能最好通过自动数组来完成。
- 初始化需要某种运行时评估的物理/数学常数。一个很好的例子是
pi = datan(1.0)*4d0。 - 从名称列表或文本文件中读取一些参数和物理内容。
根据this question,在多线程实例中不赞成使用静态变量来存储这种状态。这会是典型 fortran 物理模拟代码中 openmp 或 mpi 的问题吗?
对于处理特定于特定子程序的物理常数和用户可修改参数,您推荐什么替代方法?
【问题讨论】:
-
这似乎是基于我的意见。我建议使用模块或派生类型并将数据存储在那里。并使用单独的初始化或配置过程。
-
第二。正如您所暗示的,当与 OpenMP 并行时,这种风格可能会成为一种真正的痛苦,它只是要求竞争条件;有一个单独的初始化例程并将其粘贴在一个模块中。哦,datan 是 Fortran 66 风格的,atan 很好,现在你可以把这个表达式贴在参数语句中。
-
你说的是固定参数吗?使用术语“状态”让我认为 sub 可能会改变它的值(在初始调用之后)