我可以使用预处理程序指令对USE语句进行条件选择,这些指令依赖于Fortran中文件接口/头文件的数据吗?

时间:2016-08-31 14:08:34

标签: fortran fortran90 intel-fortran

我想在我的fortran代码中use使用不同的库(我也使用intel fortran编译器),具体取决于编译时可用的MKL版本。安装MKL时附带了一个文件接口,它定义了版本号和构建日期的预处理器宏 - /opt/intel/mkl/include/mkl.fi

我认为流程如下:

  1. 从上述文件界面获取MKL的版本号
  2. 使用版本号通过预处理程序指令
  3. 确定use的库
  4. 执行use语句以使用正确的库
  5. 进行编译

    但是,如果我在use语句后放置任何include语句,则在抛出error #6278: This USE statement is not positioned correctly within the scoping unit.

    之后编译将中止

    有没有办法使用依赖文件接口或头文件信息的预处理程序指令来实现use语句的条件选择?

    我无法看到它是如何可能的,因为任何use语句都必须在include语句之前,该语句提供决定执行哪个use语句所需的数据。我在下面列出了一个示例,该示例演示了我正在尝试做什么,但是无法工作·

    module MKLVersion
    
    !Test for definition and value up here
    #ifdef INTEL_MKL_VERSION  
    
    #if INTEL_MKL_VERSION >=  110200
        use LAPACK95, only : ggevx, geevx, sygvd
    
    #elif INTEL_MKL_VERSION < 110200
        use MKL95_LAPACK, only : ggevx, geevx, sygvd
    
    #endif
    #endif
    
    ! but dont actually get the definition till we get here
    
    include '/opt/intel/mkl/include/mkl.fi'  
    
    end module MKLVersion
    

1 个答案:

答案 0 :(得分:0)

这个问题的简短答案是,最终,不是 - 正如史蒂夫莱昂内尔所指出的那样,所包含的文件有INTERFACE语句,这些语句不能在USE声明之前出现。

但是,我为我的特定用例找到了一个解决方案,它可以使用新旧MKL版本编译代码。根据这个intel article from 2009,有一种方法可以调用可以使用旧版MKL的库:

  

注意:        * f95_precision.mod,mkl95_lapack.mod和mkl95_precision.mod文件将在以后的某个版本中删除。当前版本支持两个USE语句 - 因此您可以选择或使用&#34;使用MKL95_LAPACK&#34;或&#34;使用LAPACK95&#34;。为了将来的兼容性,我们建议使用&#34; USE LAPACK95&#34;言。

所以USE MKL95_LAPACK可以替换为USE LAPACK95而不会破坏所有内容,这很好。