从主程序到子程序的全局变量fortran-dimensions at compile

时间:2015-10-07 15:48:43

标签: fortran fortran90 intel-fortran

我正在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的尺寸?这是这种方法的重大缺点

0 个答案:

没有答案