Fortran Coder

查看: 56|回复: 8

[数学库] 使用MKL库函数ZGETRS计算线性复方程组结果不对,小白求指导

[复制链接]

6

帖子

1

主题

0

精华

入门

F 币
30 元
贡献
14 点
QQ
发表于 2018-9-13 13:31:08 | 显示全部楼层 |阅读模式
问题:采用Fortran77接口计算输出的复数解不正确,在采用Fortran95接口时,一直显示说没有这个函数
环境:计算环境完全按照这个网站的设置 https://blog.csdn.net/liuyijie1990/article/details/49923853,采用vs2013+IVF2013

下面把源代码、错误结果还有正确结果发一下,希望各位有空给看下,这是老师给安排的任务,把CVF编译器上的程序转到IVF截面,主要是把 IMSL 库函数 LSACG 用 MKL 中的库函数代替下
我选的是GETRS,如果有更好的意见可告诉我,本人工科博一小白一个


[Fortran] 纯文本查看 复制代码
      PROGRAM MAIN
    
      USE MKL95_PRECISION
      USE MKL95_LAPACK
      
      IMPLICIT NONE

      INTEGER :: I, J, N, INFO
      
!      INTEGER,ALLOCATABLE:: IPIV(:)
      COMPLEX(8), ALLOCATABLE :: A(:,:), B(:,:), IPIV(:)


      N = 3
      ALLOCATE( IPIV(N) )
      ALLOCATE( A(N,N),  B(N,1) )

      A = 0.0
      Open (5, File='A.TXT', Status='OLD') ! INPUT FILE

      DO J=1,N
         DO I=1,N
            READ(5,*) A(I,J)
         ENDDO
      ENDDO

      B = 0.0
      Open (6, File='B.TXT', Status='OLD') ! INPUT FILE

      DO I=1,N
            READ(6,*) B(I,1)
      ENDDO
      
      WRITE(*,*)
      WRITE(*,*)'Matrix A : '
      DO I=1,N;
         WRITE(*,*) (A(I,:));
      ENDDO      

      WRITE(*,*)
      WRITE(*,*)'Matrix B : '
      DO I=1,N;
         WRITE(*,*) (B(I,1));
      ENDDO


      CALL ZGETRS( 'N', N, 1, A, N, IPIV, B, N, INFO )

!      CALL GETRS(A, IPIV, B, 'N', INFO)
   

      WRITE(*,*)
      WRITE(*,*)'Matrix B : '
      DO I=1,N;
         WRITE(*,*) (B(I,1));
      ENDDO
      
      WRITE(*,*) INFO



      END PROGRAM MAIN    




错误结果:

错误结果

错误结果



正确结果

  

正确结果

正确结果
      

Why so serious?
回复

使用道具 举报

457

帖子

3

主题

0

精华

大宗师

F 币
3088 元
贡献
1832 点

水王勋章元老勋章热心勋章

发表于 2018-9-13 13:54:52 | 显示全部楼层
lz不熟悉fortran和MKL很正常,可是怎么连正确答案也算不出来呢?

6

帖子

1

主题

0

精华

入门

F 币
30 元
贡献
14 点
QQ
 楼主| 发表于 2018-9-13 14:05:01 | 显示全部楼层
pasuka 发表于 2018-9-13 13:54
lz不熟悉fortran和MKL很正常,可是怎么连正确答案也算不出来呢?

哈哈,我的天,您这是已经看穿了吗,指导一下嘛
Why so serious?

97

帖子

0

主题

0

精华

专家

F 币
536 元
贡献
283 点

规矩勋章元老勋章

QQ
发表于 2018-9-13 14:09:25 | 显示全部楼层
试试把 A 转置一下

562

帖子

0

主题

0

精华

大师

F 币
355 元
贡献
243 点

规矩勋章元老勋章新人勋章水王勋章

QQ
发表于 2018-9-13 15:12:07 | 显示全部楼层
看如下代码之注释
[Fortran] 纯文本查看 复制代码
program main
  use f95_precision
  use lapack95
  implicit none
  integer :: i, j, n, info
  integer,allocatable:: ipiv(:)!// ipiv 为整数
  complex(8), allocatable :: a(:,:), b(:,:)
  n = 3
  allocate( ipiv(n) )
  allocate( a(n,n),  b(n,1) )
  a = 0.0
  open (5, file='a.txt', status='old') ! input file
  do j=1,n
    do i=1,n
      read(5,*) a(j,i)!//a转置
    enddo
  enddo
  !a = transpose(a)!//或者这样转置
  b = 0.0
  open (6, file='b.txt', status='old') ! input file
  do i=1,n
    read(6,*) b(i,1)
  enddo
  write(*,*)
  write(*,*)'matrix a : '
  do i=1,n;
    write(*,*) (a(i,:));
  enddo
  write(*,*)
  write(*,*)'matrix b : '
  do i=1,n;
    write(*,*) (b(i,1));
  enddo
  !call zgetrs( 'n', n, 1, a, n, ipiv, b, n, info )
  call getrf(a,ipiv,info)!//先 getrf
  call getrs(a,ipiv,b,'n',info) !//后 getrs
  write(*,*)
  write(*,*)'matrix b : '
  do i=1,n;
    write(*,*) (b(i,1));
  enddo
  write(*,*) info
end program main

6

帖子

1

主题

0

精华

入门

F 币
30 元
贡献
14 点
QQ
 楼主| 发表于 2018-9-13 15:43:24 | 显示全部楼层

不行啊,我确实是按列读入,按行输出的
Why so serious?

6

帖子

1

主题

0

精华

入门

F 币
30 元
贡献
14 点
QQ
 楼主| 发表于 2018-9-13 16:47:47 | 显示全部楼层
vvt 发表于 2018-9-13 15:12
看如下代码之注释
[mw_shl_code=fortran,true]program main
  use f95_precision

我试试,真的好优秀啊,谢谢
Why so serious?

6

帖子

1

主题

0

精华

入门

F 币
30 元
贡献
14 点
QQ
 楼主| 发表于 2018-9-13 18:13:24 | 显示全部楼层
vvt 发表于 2018-9-13 15:12
看如下代码之注释
[mw_shl_code=fortran,true]program main
  use f95_precision

非常感谢啊,终于解决了,问下MKL具体的设置您能告诉我一下吗,包括这个USE什么什么的,我之前写的 USE MKL95_PRECISION,USE MKL95_LAPACK为何不能用95的接口呢
Why so serious?

6

帖子

1

主题

0

精华

入门

F 币
30 元
贡献
14 点
QQ
 楼主| 发表于 2018-9-15 10:30:36 | 显示全部楼层
Why so serious?
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2018-9-25 15:13

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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