使用静态变量在子例程中存储状态是否是一种好的做法?我心里有类似以下内容:“一些东西”使用静态变量在子例程中存储状态是否是一种好的做法?
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可能会改变它的值(在初始调用后) – agentp