Top Page > Browsing
kSpin gives incorrect eigenvalues
Date: 2022/02/18 17:13
Name: Shunsuke Yoshizawa

Dear developers,

My report and question are about kSpin code.

I am trying to calculate the spin texture of energy bands for a slab model with 63 atoms of 3 species, which is a kind of topological insulator with three-fold symmetry. SCF and band dispersion calculation by OpenMX gives smooth energy bands and surface states around the Fermi energy, as expected. The input file is

scf.XcType GGA-PBE # LDA|LSDA-CA|LSDA-PW|GGA-PBE
scf.SpinPolarization NC # On|Off|NC
scf.SpinOrbit.Coupling On # On|Off, default=off
scf.ElectronicTemperature 300.0 # default=300 (K)
scf.energycutoff 300.0 # default=150 (Ry)
scf.maxIter 400 # default=40
scf.EigenvalueSolver Band # DC|GDC|Cluster|Band
scf.Kgrid 9 9 1 # means n1 x n2 x n3
scf.Mixing.Type rmm-diisk # Simple|Rmm-Diis|Gr-Pulay|Kerker|Rmm-Diisk
scf.Init.Mixing.Weight 0.300 # default=0.30
scf.Min.Mixing.Weight 0.001 # default=0.001
scf.Max.Mixing.Weight 0.700 # default=0.40
scf.Mixing.History 40 # default=5
scf.Mixing.StartPulay 20 # default=6
scf.Mixing.EveryPulay 1 # default=6
scf.criterion 1.0e-8 # default=1.0e-6 (Hartree)
scf.lapack.dste dstevx # dstevx|dstedc|dstegr,default=dstevx
scf.restart off

Band.dispersion on
Band.Nkpath 3
<Band.kpath
121 0.333333 0.333333 0.000000 0.000000 0.000000 0.000000 K G
105 0.000000 0.000000 0.000000 0.500000 0.000000 0.000000 G M
61 0.500000 0.000000 0.000000 0.333333 0.333333 0.000000 M K
Band.kpath>


However, the band dispersion produced by kSpin are incorrect. The input file for kSpin is

Filename.scfout Hogehoge.scfout
Filename.outdata Hogehoge_BD
Calc.Type BandDispersion # FermiLoop, GridCalc,
# BandDispersion, or MulPOnly
# default: MulPOnly
Energy.Range -2.0 2.0 # eV; default: -0.5 0.5
Band.Nkpath 3
<Band.kpath
121 0.333333 0.333333 0.000000 0.000000 0.000000 0.000000 K G
105 0.000000 0.000000 0.000000 0.500000 0.000000 0.000000 G M
61 0.500000 0.000000 0.000000 0.333333 0.333333 0.000000 M K
Band.kpath>

The calculation selects strange band indices (for example, the output file reads l_min:1777 l_max:3545 l_cal:1769 for Total Band (2*n):3546 ), or sometimes results in "No Bands are found".

If I reduce the number of basis functions (the Quick sets in the manual), the band indices fall within the expected range. However, the eigenvalues recorded in the *.MulPop file produced by MulPCalc exhibit a highly scattered dispersion and many NaN's. It seems that eigenvalues are not calculated correctly. When I performed the similar spin texture calculation for a different crystal structure, the results were OK.

Then, I found that the eigenvalues are computed by a function named Eigen_HH(), but the function is defined both in Eigen_HH.c (used by kSpin) and in EigenBand_lapack.c (used by OpenMX). The two definitions are slightly different, so I modified the Eigen_HH() in Eigen_HH.c according to that in EigenBand_lapack.c, as follows.

void Eigen_HH(dcomplex **ac, double *ko, int n, int EVmax, int ev_flag)
-->
#pragma optimization_level 1
void Eigen_HH(dcomplex **ac, double *ko, int n, int EVmax, int ev_flag)

double ABSTOL=1.0e-14;
-->
double ABSTOL=6.0e-15;

if ( ABSTOL<fabs(s2) || i==(n-1) ){
-->
if ( ABSTOL<fabs(s2) || 1.0e-10<fabs(u[i+1].i) || i==(n-1) ){

After that, kSpin calculations have began to provide correct eigenvalues. I have not checked which of the three modifications is crucial. I am using OpenMX 3.9.9, but the situation is the same in 3.9.2. The codes have been compiled by Intel Compiler + Intel MKL + SGI MPT, and run as a MPI job using 96-192 cores.

I hope someone could comment on whether the above modifications are appropriate or not, and the possible reason why the previous errors in the kSpin calculation occurred.

Thank you very much.
メンテ
Page: [1]

Re: kSpin gives incorrect eigenvalues ( No.1 )
Date: 2022/02/18 18:53
Name: Naoya Yamaguchi

Dear Dr. Yoshizawa,

Thank you for your careful report.
I'm a developer of `kSpin`, and it seems that `kSpin` itself uses an old version of `Eigen_HH.c`. I heard a similar issue on another postprocessing code such as `polB` due to a subtle numerical instability of `Eigen_HH.c`, and the workaround was to suppress the optimization level as you've done.
I've not added the pragma statement for `kSpin`, and I will fix the eigenvalue problem part in the next release.

Best regards,
Naoya Yamaguchi
メンテ
Re: kSpin gives incorrect eigenvalues ( No.2 )
Date: 2022/02/18 19:14
Name: Shunsuke Yoshizawa

Dear Dr. Yamaguchi,

Thank you very much for your reply and your development of kSpin.
I am glad to know that the decreasing the optimization level was a reasonable workaround.

Best regards,
Shunsuke Yoshizawa
メンテ

Page: [1]

Thread Title (must) Move the thread to the top
Your Name (must)
E-Mail (must)
URL
Password (used in modification of the submitted text)
Comment (must)

   Save Cookie