我想在我的fortran代码中use
使用不同的库(我也使用intel fortran编译器),具体取决于编译时可用的MKL版本。安装MKL时附带了一个文件接口,它定义了版本号和构建日期的预处理器宏 - /opt/intel/mkl/include/mkl.fi
我认为流程如下:
use
的库
use
语句以使用正确的库但是,如果我在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
答案 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
而不会破坏所有内容,这很好。