Error EDDDAV: Call to ZHEGV failed

本文记录了在AMD Opteron集群上使用Pathscale Fortran编译器编译VASP过程中遇到的问题及解决方案,包括调用LAPACK库失败、不可恢复的库错误等,并提供了调整编译选项和修改INCAR参数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 


在AMD平台上遇到了个问题,Intel的似乎没出现过

PS:注意$(FC) $(FFLAGS)中间空格

Compilation of VASP on Opteron/Rocks cluster Ametisti with Pathscale 2.2.1 Fortran compiler

These observations apply to the serial version of VASP. The parallel section dealing with VASP on Ametisti using the MPI interface will be included later.
I used the makefile from Janne Blomqvist at Helsinki University of Technology (Thanks Janne).

Few things were noticed after a successful compilation.

Serial version problems:

Problem 1 : Error EDDDAV: Call to ZHEGV failed.
Problem 2 : lib-4201 : UNRECOVERABLE library error
Problem 3 : WARNING in EDDRMM: call to ZHEGV failed, returncode = 6 3 9

Parallel version problems:
Will be added at some later date

Problem 1)

The test calculation for copper system (benchmark.tar.gz, download from the VASP ftp-server) stops with an error message:
"Error EDDDAV: Call to ZHEGV failed. Returncode = 9 1 8".

The actual numbers change at the end of the error, but the message means that a LAPACK library call failed.


Solution:

The subroutine davidson.F must be handled with lower optimization setting
Add the following lines to the end of the VASP Makefile:

davidson.o : davidson.F
              $(CPP)
              $(FC) $(FFLAGS) -O1 -c $*$(SUFFIX)


(You remembered to use the TAB key instead of spaces with the second and the third line, right?)


Problem 2)

After lowering the davidson subroutine optimization level the calculation ends with another error:

"lib-4201 : UNRECOVERABLE library error: Unable to find error message (check NLSPATH, file lib.cat)
Encountered during a direct access unformatted READ from unit 21. Fortran unit 21 is connected to a direct unformatted unblocked file: "TMPCAR"
/opt/gridengine/default/spool//compute-0-4/job_scripts/10170: line 31: 16997 Aborted (core dumped) ./vasp_path_serial >vasp_path_serial.out"


Solution:

Change/add the IWAVPR=10 line to your INCAR file. This is from the VASP manual, FAQ section, page 149

"Question: I am running VASP on a SGI Origin, and the simple benchmark (benchmark.tar.gz) fails with lib-4201 :
UNRECOVERABLE library error READ operation tried to read past the end-of-record.
Encountered during a direct access unformatted READ from unit 21
Fortran unit 21 is connected to a direct unformatted unblocked file:
"TMPCAR" IOT Trap
Abort (core dumped)

Answer: VASP extrapolates the wave functions between molecular dynamics time steps. To store the wave functions of the previous time
steps either a temporary scratch file (TMPCAR) is used (IWAVPR=1-9) or large work arrays are allocated (IWAVPR=11-19).
On the SGI, the version that uses a temporary scratch file does not compile correctly, and hence the user has to set IWAVPR to 10."


Problem 3)

When running the Hg benchmark (bench.Hg.tar.gz), the OUTCAR file has numerous lines saying:
"WARNING in EDDRMM: call to ZHEGV failed, returncode = 6 3 9"

Solution:

This issue is addressed in the VASP support forum (http://cms.mpi.univie.ac.at/vasp-forum/forum_viewtopic.php?3.214)
Short summary is given here. Possible reasons (this may, once again, be connected to failures calling LAPACK routines):

1) The diagonalization algorithm is not stable for your system
-> Change ALGO = Normal or ALGO = Fast in your INCAR file

2) Your geometry is not reasonable. Maybe your initial structure or the algorithm handling ion relaxation is giving a bad structure
-> Switch to a different ion relaxation scheme (IBRION line in your INCAR)
-> Reduce the step size of the first step by reducing the POTIM value in your INCAR

3) Problem with your LAPACK installation
-> Use the LAPACK routines that came with the VASP library tar-file (vasp.4.lib)

4) If the error does not go away even if you already did the thing described in part 1 (ALGO change), then there may be a problem with LAPACK.
-> Disable the calls to ZHEGV subroutine. This can be done by commenting the line

# define USE_ZHEEVX
in subroutines davidson.F, subrot.F and wavpre_noio.F.
-> Recompile VASP after you changed the subroutines

NOTE TO SELF:

These issues have much in common with the problems usually described with Silicon Graphics computers. How curious...

Jukka-Pekka Jalkanen
21.09.2005

<think>我们正在处理一个关于ZHEGV函数调用失败的问题,用户需要了解错误返回码的含义以及可能的解决方案。 根据用户提供的信息,错误码是EDDDAV,但请注意,在LAPACK中,错误码通常以数字形式返回,或者通过INFO参数返回。EDDDAV看起来像是一个字符串错误码,这可能是某些封装或接口提供的错误信息。然而,在标准的LAPACK中,ZHEGV函数返回的错误信息是通过整数INFO值来传递的。 但是,我们注意到EDDDAV这个字符串,它可能是由某些特定的LAPACK接口(例如,可能是Intel MKL或其他实现)提供的错误信息。在Intel MKL中,错误信息有时会以这种形式出现。根据Intel MKL文档,EDDDAV错误通常与“内部特征值求解器失败”有关。 然而,为了准确性和通用性,我们首先考虑标准LAPACK的文档。在LAPACK中,ZHEGV是一个用于解决广义特征值问题的函数(针对复厄米特矩阵)。它返回的INFO值如果大于0,则表示在计算过程中出现了错误。 由于用户给出了字符串“EDDDAV”,我们假设这可能来自MKL的错误处理。在Intel MKL中,错误代码EDDDAV对应的含义是:“在迭代过程中,由于主元数为零或其他原因,内部缩减过程无法计算移位,导致无法收敛”。这通常发生在矩阵是病态的或者不正定时。 具体到ZHEGV函数,它用于求解广义特征值问题:A*x = lambda*B*x,其中A和B是厄米特矩阵,且B是正定的。如果B不是正定的,那么就会导致错误。 因此,我们推断EDDDAV错误很可能是因为矩阵B不正定(或者接近不正定)导致的。 解决方案: 1. 检查矩阵B是否正定。可以通过计算B的所有特征值是否均为正来验证。 2. 如果B是病态的(条件数很大),可以考虑对问题进行正则化处理。 3. 使用其他更稳定的求解器,例如使用ZHEGVX(它提供更精细的收敛控制)或者先对矩阵B进行Cholesky分解,确保分解成功再进行后续计算。 另外,根据LAPACK文档,ZHEGV的INFO参数返回值的含义如下: - 如果INFO = i,且i<=N,则表示B的第i个顺序主子式不是正定的,因此B不是正定矩阵。 - 如果INFO = i,且i>N,则表示在计算特征值时,内部迭代过程不收敛。 由于EDDDAV错误信息通常与内部迭代不收敛有关,所以对应的INFO值可能大于N(矩阵的阶数)。在这种情况下,可能的解决方案是: - 尝试使用不同的算法(如使用ZHEGVX并调整收敛容差) - 检查矩阵A和B的条件数,特别是B的条件数是否过大。 此外,还需要检查输入矩阵是否正确,是否有数值不稳定的情况。 下面我们提供一些验证矩阵B正定性的方法(例如使用Cholesky分解)以及使用ZHEGVX的示例。 注意:由于用户调用的是ZHEGV,我们假设用户使用的是Fortran接口或者通过某种封装(如C接口)调用。在代码中,处理错误的方式通常是检查返回的INFO值。 为了帮助用户,我们可以给出一个处理此类错误的步骤: 步骤1:检查矩阵B的正定性 在调用ZHEGV之前,可以先用ZPOTRF(Cholesky分解)来检查矩阵B是否正定。如果ZPOTRF返回非零,则说明B不正定。 步骤2:如果B不正定,考虑使用其他方法,如先对问题进行转换(正则化)或者使用其他类型的求解器(例如,当B不正定时,使用ZHEGV是不合适的,可以考虑使用ZHEGVX,但注意ZHEGVX要求B正定,所以仍然不行。对于B不正定的情况,可能需要使用其他算法,如QZ方法求解广义特征值问题,但LAPACK中对应的复数版本是ZGGEV)。 因此,如果B不正定,那么可能需要改变问题形式或者使用ZGGEV。 步骤3:如果B是正定的,但仍然出现不收敛错误,那么可能是矩阵A和B的数值性质导致迭代不收敛。可以尝试: - 调整收敛容差(如果使用ZHEGVX,可以设置ABSTOL) - 缩放矩阵A和B,使它们的元素大小更平衡 另外,确保输入矩阵是厄米特矩阵(对称复矩阵的共轭转置等于自身)也很重要。 总结:EDDDAV错误通常与矩阵B不正定或病态有关。建议首先检查B的正定性,然后根据情况采取相应措施。 下面我们提供一些代码片段来帮助检查: 假设我们使用Fortran语言(因为LAPACK主要是Fortran写的),但用户可能使用其他语言,这里以Fortran为例说明如何检查B的正定性: 在调用ZHEGV之前,先调用ZPOTRF: ```fortran ! 假设B是复矩阵,存储在下三角部分(UPLO=&#39;L&#39;) CALL ZPOTRF( &#39;L&#39;, N, B, LDB, INFO ) IF( INFO.NE.0 ) THEN WRITE(*,*) &#39;Matrix B is not positive definite!&#39; ! 处理错误 END IF ``` 如果成功,再调用ZHEGV。 如果用户确实遇到不收敛(INFO>N)的情况,可以尝试使用ZHEGVX,并设置合适的参数(如ABSTOL): ```fortran ! 设置ABSTOL ABSTOL = 2.0 * DLAMCH(&#39;S&#39;) ! 调用ZHEGVX CALL ZHEGVX( ... ) ! 具体参数请参考LAPACK文档 ``` 但是,请注意ZHEGVX和ZHEGV的调用参数有所不同,需要仔细设置。 由于用户的问题可能涉及具体编程环境,我们建议用户检查矩阵B的条件数,并确保输入矩阵的正确性。 相关问题: 1. 如何检查一个矩阵是否正定? 2. 在LAPACK中,ZHEGVZHEGVX有什么区别? 3. 当广义特征值问题中的矩阵B不正定时,应该如何处理? 4. 如何计算矩阵的条件数? 5. 在调用ZHEGV时,除了矩阵不正定,还有哪些常见错误?</think>### ZHEGV函数错误EDDDAV分析及解决方案 在调用LAPACK的`ZHEGV`函数时遇到错误码**EDDDAV**,这表示在求解广义特征值问题过程中出现了数值计算问题。以下是详细分析和解决方案: #### 错误原因分析 1. **核心问题**:EDDDAV错误表明内部特征值求解器(通常指`DSTEIN`或类似算法)在迭代过程中无法收敛[^1]。 - 数学本质:求解特征方程 $ (A - \lambda B)v = 0 $ 时出现病态条件($\lambda$为特征值,$v$为特征向量) - 常见触发场景:当矩阵$B$接近奇异(行列式$|B| \approx 0$)或矩阵$A$、$B$条件数过高时发生 2. **根本原因**: - 矩阵$B$不正定(违反$B$需严格正定的前提) - 矩阵$A$或$B$存在数值不稳定(如元素数量级差异过大) - 特征值聚类导致迭代无法收敛 #### 解决方案 1. **验证矩阵性质**: ```fortran ! 检查B的正定性(使用Cholesky分解) CALL ZPOTRF(&#39;U&#39;, N, B, LDB, INFO) IF (INFO /= 0) PRINT *, "ERROR: Matrix B not positive definite!" ``` 若$INFO \neq 0$,说明$B$不正定,需检查数据来源或添加正则化项。 2. **矩阵预处理**: - 对$A$和$B$进行缩放平衡: ```fortran CALL ZGEBAL(&#39;B&#39;, N, A, LDA, ILO, IHI, SCALE, INFO) CALL ZGEBAL(&#39;B&#39;, N, B, LDB, ILO, IHI, SCALE, INFO) ``` - 添加正则化项:$B \leftarrow B + \epsilon I$($\epsilon = 10^{-12}$量级) 3. **改用鲁棒性更强的求解器**: ```fortran ! 使用ZHEGVX替代ZHEGV(支持容差设置) ABSTOL = 2.0 * DLAMCH(&#39;S&#39;) ! 最小安全容差 CALL ZHEGVX(ITYPE, &#39;V&#39;, &#39;I&#39;, &#39;U&#39;, N, A, LDA, B, LDB, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, RWORK, IWORK, IFAIL, INFO) ``` 4. **诊断工具**: - 计算矩阵条件数:$\kappa(B) = \|B\| \cdot \|B^{-1}\|$ - 检查特征值分布: ```fortran CALL ZHEEV(&#39;N&#39;, &#39;U&#39;, N, B, LDB, EIGS, WORK, LWORK, RWORK, INFO) PRINT *, "B的最小特征值:", MINVAL(EIGS) ``` #### 调试建议流程 ```mermaid graph TD A[发生EDDDAV错误] --> B{检查B的正定性} B -- 不正定 --> C[添加正则化项εI] B -- 正定 --> D{计算条件数κ(B)} D -- κ>1e10 --> E[矩阵缩放平衡] D -- κ正常 --> F[改用ZHEGVX] F --> G[调整ABSTOL参数] G --> H[检查特征值间隔] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值