Fortran Coder

查看: 6281|回复: 2
打印 上一主题 下一主题

[数学库] MKL使用出现了问题,求帮助

[复制链接]

2

帖子

1

主题

0

精华

新人

F 币
15 元
贡献
7 点
跳转到指定楼层
楼主
发表于 2015-12-6 13:06:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我现在打算使用MKL自带的lapack程序解大型稀疏矩阵
于是尝试写了一段程序来验证一下使用方法,但是总也不成功。
现在做的工作有:
1、MKL库的连接。从INTEL的说明文档和网上的相关信息已经确认连接的方法,比如本站给出的
     http://fcode.cn/guide-58-1.html
2、关于LAPACK函数的调用。我打算使用SPOSV这个函数,这个函数有几个种类,如下
https://software.intel.com/zh-cn/node/468894#A2F80478-BAC2-46F6-A0FB-9CC1F4456803
     如SPOSV或者POSV。前者需要的参数多,而后者少。但是后者需要INTERFACE。其实就是调用
几个MODULE,如我程序中使用的LAPACK.MOD等。
存在的问题:
       1、通过以上两步,调用POSV函数,仍然会出现“SPOSV_F95不能找到”这样的错误。
       2、而如果调用的是SPOSV,则又会出现ACCESS VIOLATION的问题,不知道是不是参数设置错误了。
************************************************************************************************
以下是我的程序
[Fortran] 纯文本查看 复制代码
     program main     
      USE LAPACK95
      USE F95_PRECISION
      REAL,ALLOCATABLE :: A1(:,:),B1(:,:)
      INTEGER N,NRHS,LDA LDB
!      INTERFACE     
!         SUBROUTINE sposv( uplo, n, nrhs, a, lda, b, ldb, info )         
!          REAL A(:,:)
!          REAL B(:,:)
!          CHARACTER(LEN=1), OPTIONAL :: UPLO
!          INTEGER, OPTIONAL :: INFO
!          INTEGER N,NRHS,LDA LDB          
!         END SUBROUTINE SPOSV         
!      END INTERFACE
      ALLOCATE(A1(5,5),B1(5,3))
      N=5
      NRHS=3
      LDA=5
      LDB=5
      OPEN(11,FILE='A.TXT')
      OPEN(12,FILE='B.TXT')
      DO I=1,5
      READ(11,*)(A1(I,J),J=1,5)
      END DO
      DO I=1,5
      READ(12,*)(B1(I,J),J=1,3)
      END DO
      CALL SPOSV(n, nrhs, A1, lda, B1, ldb)
      DO I=1,5
      WRITE(*,*)(B1(I,J),J=1,3)
      END DO
      DEALLOCATE(A1,B1)
      end program main
分享到:  微信微信
收藏收藏1 点赞点赞 点踩点踩

1967

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1370 元
贡献
581 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2015-12-6 18:17:08 | 只看该作者
以下代码测试成功。注意代码中的 A=A*AT 只是为了得到正定阵,没有别的目的,实际使用时请不要写
需要在工程属性里添加:

[Fortran] 纯文本查看 复制代码
Program main
  Use lapack95
  Use f95_precision
  Real, Allocatable :: a1(:, :), b1(:, :)
  Integer :: n = 5 , nrhs = 3 ,  info = 999
  Allocate( a1(N,N) , b1(N,NRHS) )
  Open( 11 , File='A.TXT' )
  Open( 12 , File='B.TXT' )
  Do i = 1, N
    Read (11, *) a1(i, :)
  End Do
  a1 = matmul(a1, transpose(a1)) !// A=A*AT 为了得到正定阵
  Do i = 1, N
    Read (12, *) b1(i, :)
  End Do
  !CALL SPOSV(n, nrhs, A1, lda, B1, ldb)
  Call posv( a1 , b1 , 'U' , info )
  Write (*, *) info !//输出0则表示成功
  Do i = 1, N
    Write (*, *) b1(i, :)
  End Do
  Deallocate(a1, b1)
  Close( 11 )
  Close( 11 )
End Program main

2

帖子

1

主题

0

精华

新人

F 币
15 元
贡献
7 点
板凳
 楼主| 发表于 2015-12-7 08:55:00 | 只看该作者
fcode 发表于 2015-12-6 18:17
以下代码测试成功。注意代码中的 A=A*AT 只是为了得到正定阵,没有别的目的,实际使用时请不要写
需要在工 ...

太赞了!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-13 11:11

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表