我正在Fortran 90中编写一个程序来计算问题的解决方案。我有以下问题: 为了解决这个问题,我必须为x设置一些初始值。
计算y = g(x)
然后求解满足0 = F(z,y)的z(即,我在这个seconf参数的特定值处对z作为y z = Z(y)的函数进行解释)
我的问题是要做到这一点,我需要使用一些第三方软件。这个第三方软件(我正在使用IMSL,但它所基于的minpack例程也是如此)只会解决z的功能。 这给我一个问题,因为我需要在主程序中计算y。 我正试图找出处理全局变量的最佳实践。我的想法如下:
Program Main
Use mod_passer
Use mod_Fcn
Use librarycontainingsolver
IMPLICIT NONE
Real, parameter :: x
real :: y, z, Fval
!compute the y
y=x**2 !for example
call set_y(y)
call solver(z,Fcn)
end program
!solver采用参数求解器(解,函数名,函数值),其中函数是!子程序(a,函数值),即取a并返回函数值
并有两个单独的模块
Module mod_passer
Implicit none
Real :: param
Contains
subroutine set_y(y)
implicit none
Real, intent(in) ::y
Param=y
End subroutine
End module mod_passer
下面的第二个
Module mod_Fcn
Use mod_passer param only
Implicit none
Contains
Subroutine Fcn(a, f_a)
!calculates f_a=Fcn(a,Param)
Real, Intent(in) :: a
Real, Intent(out)::f_a
F_a=a**(3*Param)
End subroutine
End module mod_Fcn
这似乎是我可以采取的一种方法,但它看起来非常笨重。原则上,我需要做的是采取我的解决方案,对其执行一些操作,并使用它来参数化其他一些变量中的另一个函数,并通过多种方式多次执行此操作。这就是为什么我有点坚持全局变量的想法,并且不想在参数模块中声明y = x ** 2等价物。特别是因为我可能需要重新计算y并重复上述想法。
至少这样我可以确定有效地将值传递给全局变量的点,而不仅仅是使用param并在equals语句中赋值。 (也有可能我完全误解了一些基本的东西。
我已经说过Fortran 90,但我想如果我使用2003,我可以声明param是受保护的,以避免任何意外(这似乎是明智的,因为它至少应该产生编译错误,如果我尝试做一些愚蠢的事情)?我做了一个合理的方法让我感到茫然,这并不涉及一遍又一遍地做这种程序。
对不起,我没有提供完整的工作示例,但这将涉及指定解算器等。(从技术上讲,我希望我的函数有一个额外的参数,用于输入数组的长度)以上是我提出解决方案的最佳尝试,并受到Protected global variables in Fortran回答中提到的一些启发。实际上,这些功能比上面提到的要复杂得多,但我认为这可能会让球滚滚而来。如果需要,我正在使用intel ifort进行编译。
另一种方法可能是构建主程序中包含的有问题的子程序。我对使用这样的示波器有一些保留意见,加上它(由于长度和更多的原因)似乎是一个非常不优雅的解决方案。 任何帮助都会很棒。随意告诉我没有更好的选择。我希望上面的一切都清楚。
编辑:我刚刚意识到我错过了什么!如何在编译模块mod_passer时了解y的尺寸?这是这种方法的重大缺点