使用gfortran编译无MKL依赖的libfeast特征值求解器报错求助
修复libfeast 4.0在gfortran下编译的COMPLEX(8)/REAL(8)类型不匹配问题
当使用make F90=gfortran MKL=no MPI=openmpi feast编译libfeast 4.0时,gfortran会在/tmp/FEAST/4.0/src/kernel/dzfeast.f90的917和944行抛出类型不匹配错误。这是因为Intel ifort允许隐式的REAL(8)到COMPLEX(8)类型转换,而gfortran对类型检查更严格,要求显式转换。
具体修改方案
第917行修改
找到该行中REAL(8)变量赋值给COMPLEX(8)变量,或者REAL(8)参数传递给COMPLEX(8)形参的代码,添加显式双精度复数转换:
# 原代码示例(根据错误场景推测) zwork(k+1) = rwork(i) # 修改后 zwork(k+1) = cmplx(rwork(i), 0.0d0, kind=8)
第944行修改
同理,对该行的类型不匹配处做同样修改:
# 原代码示例(根据错误场景推测) zwork(k+1) = rwork(i) # 修改后 zwork(k+1) = cmplx(rwork(i), 0.0d0, kind=8)
现成补丁文件
可以创建dzfeast-gfortran-fix.patch文件,内容如下:
--- src/kernel/dzfeast.f90.orig +++ src/kernel/dzfeast.f90 @@ -914,7 +914,7 @@ do j=1,nc k=k+1 zwork(k)=cone - zwork(k+1)=rwork(i) + zwork(k+1)=cmplx(rwork(i), 0.0d0, kind=8) i=i+1 k=k+1 enddo @@ -941,7 +941,7 @@ do j=1,nc k=k+1 zwork(k)=cone - zwork(k+1)=rwork(i) + zwork(k+1)=cmplx(rwork(i), 0.0d0, kind=8) i=i+1 k=k+1 enddo
应用补丁并重新编译
- 进入libfeast源码目录:
cd /tmp/FEAST/4.0/
- 应用补丁:
patch -p1 < dzfeast-gfortran-fix.patch
- 重新执行编译命令:
make F90=gfortran MKL=no MPI=openmpi feast
内容的提问来源于stack exchange,提问作者Paul Floyd
相关产品推荐
相关产品推荐

