Fortran,静态库创建和简化(这里是新手)

时间:2012-12-21 05:55:37

标签: fortran static-libraries

我对Fortran有些新意,但是我开始在模块中收集很多函数和子例程,我一遍又一遍地使用它们。我一直在尝试构建自己的库,以便我可以从我编写的新源代码中调用其中的一些函数和子例程。到目前为止,我已经能够使子程序工作,但不是功能。我只是不知道如何在代码中调用函数。

这是一个例子。以下函数接受整数并返回Identity矩阵。

module test
contains
function IDENTITY(rows) !RETURNS THE IDENTITY MATRIX                                 
    real, dimension(rows,rows)    :: IDENTITY                                        
    integer, intent(in)           :: rows                                      
    integer                       :: i, j                                                                  
    !f2py intent(in) rows                                                             
    !f2py intent(out) IDENTITY                                                        
    !f2py depend(rows) IDENTITY                                                       
    IDENTITY = ZEROS(rows,rows)                                                      
    do i = 1, rows                                                                   
        do j = 1, rows                                                               
            if (i == j) then                                                         
               IDENTITY(i,j) = 1                                                     
            endif                                                                    
        enddo                                                                        
    enddo                                                                            
end function IDENTITY
end module                       

现在我将其编译成目标文件,然后将其存档到库中。然后我写了一个小程序,我想使用这个函数 - 这就是我想避免的问题。我想我必须在我的源代码中放置一个\ use \语句,以便它将使用该模块。然后我必须在编译时包含.mod的路径。但最终,我将会有一整段使用语句。我想避免做所有这些事情,只是让一切都好看又整洁。有办法吗?任何帮助都会很棒,

谢谢

1 个答案:

答案 0 :(得分:4)

您可以将许多子例程和函数放入一个模块的contains部分。每个都不需要单独的模块。通过为相关过程(子例程和函数)创建模块/文件来组织代码是有意义的。

我以前使用的库是一个很好的策略。在这个时代 我通常不打扰图书馆。编译器非常快,我只是用程序所需的模块编译文件。这取决于你的代码有多大。

使用call语句调用子例程。您可以在表达式中使用它来调用函数,例如assigment语句:

x = sin (y)
matrix = identity (n)

P.S。而不是:

do i = 1, rows
   do j = 1, rows
      if (i == j) then
         IDENTITY(i,j) = 1
      endif
   enddo
enddo

为什么不:

do i = 1, rows
   IDENTITY(i,i) = 1
enddo

你有一个ZEROS函数将你的矩阵归零吗?该语言将使用一个声明语句来做到这一点:

IDENTITY = 0.0