首页/文章/ 详情

Fortran77还有前途吗?-Intel MKL的Fortran77接口和C接口使用

1年前浏览1743

    

    在上一篇文章如何快过matlab?-MKL数值计算库的Fortran95接口使用及MKL文档下载中,我们简要介绍了Intel MKL库的Fortran95接口的使用。实际上,Intel MKLC接口和Fortran77接口也经常使用,其主要原因在于,对于某些函数,目前的MKL库并不包含Fortran95接口,另外,当采用的语言是C或者C++时,调用C接口更为方便。

    以lapack中的线性方程组求解为例,其调用Fortran77接口步骤如下:

    (1)在vs中创建fortran项目,添加.f90源代码文件

    (2)依据MKL的使用文档,确定所用函数的具体用法,在lapack中,求解线性方程组可通过两种方式进行:

    (一)先调用Matrix  Factorization下的函数,再调用Solving System of Linear Equations下的函数,对于常规线性方程组的求解,其调用的双精度的f77接口的函数为dgetrf和dgetrs,前者用于分解,后者用于求解;

    (二)直接调用LAPACK Linear Equation Driver Routines下的dgesv,一步完成分解和求解的操作,本文采用该方式进行。

    dgesv的函数具体说明如下:

    依据文档中的参数的说明,在代码中定义相应参数即可。上述dgesv函数的参数中,nnrhsab分别是矩阵阶数,右端项列数,系数矩阵和右端向量,要求解的方程是a*x=b。要注意的是ldaldb,其值应当>=max(1,n),实际中常取值nipivLU分解时的重排向量,是输出参数,info是表征求解是否成功的输出参数。

    了解该函数的具体用法之后,编写的Fortran代码如下:

    program Console1_MKL77implicit none   integer,parameter::n=5,nrhs=1real(kind=8)::a(n,n),rhs(n)integer,parameter::lda=n,ldb=nreal(kind=8)::ipiv(n)integer::info,i,jdo i=1,ndo j=1,na(i,j)=(i**2.0+j**2.0)**0.5enddowrite(*,"(*(g0,3x))")a(i,:)rhs(i)=1enddocall dgesv( n, nrhs, a, lda, ipiv, rhs, ldb, info )write(*,*)"info",infowrite(*,*)"solution:"write(*,"(*(g0,3x))")rhs(:)end program Console1_MKL77

        (三)在vs中进行IntelMKL库使用的设置:对于Fortran77接口来说,其需要的设置十分简单,仅需在项目-属性-Fortran-Libraries设置使用MKL库即可(注意区分x64和x86工程):

         (四)生成并运行代码:

        由此可见,对于Fortran77接口,MKL库的使用仅需要在项目-属性-Fortran-Libraries设置使用MKL库,相对于Fortran95接口免去了手动填写lib名称及在代码里use相应的library,从设置方式上更易使用,但是函数的参数更多。

      对于C接口,其与Fortran77接口的使用较为类似,也是仅需要在项目-属性-Intel Libraries for oneAPI设置使用MKL库即可

    具体代码如下:

      #include <iostream>#include<cmath>#include <mkl.h>int main(int argc, char** argv){  lapack_int Rvalue;int matrix_layout = LAPACK_COL_MAJOR;const lapack_int n = 5,nrhs=1;double* a = new double[n * n];  lapack_int lda = n;  lapack_int* ipiv = new lapack_int[n];double* b = new double[n];  lapack_int ldb = n;for (int i = 0; i < n; i++)  {for (int j = 0; j < n; j++)    {      a[i + n * j] = pow(((i+1.0)*(i+1.0)        + (j+1.0) * (j+1.0)), 0.5);std::cout << a[i + n * j]<<" ";    }std::cout<<std::endl;    b[i] = 1.0;  }  LAPACKE_dgesv(matrix_layout, n, nrhs, a, lda, ipiv, b, ldb);std::cout << "solution:" << std::endl;for (int i = 0; i < n; i++)  {std::cout << b[i] << std::endl;  }return 0;}

      计算结果:

          以上,就是Intel MKL库的F77和C接口的配置过程,感谢您的阅读!

      【完】

      来源:有限元术
      System
      著作权归作者所有,欢迎分享,未经许可,不得转载
      首次发布时间:2022-11-07
      最近编辑:1年前
      寒江雪_123
      硕士 | cae工程师 签名征集中
      获赞 48粉丝 98文章 45课程 9
      点赞
      收藏
      作者推荐
      未登录
      还没有评论
      课程
      培训
      服务
      行家
      VIP会员 学习 福利任务 兑换礼品
      下载APP
      联系我们
      帮助与反馈