pyiron / pyiron_atomistics

pyiron_atomistics - an integrated development environment (IDE) for atomistic simulation in computational materials science.
https://pyiron-atomistics.readthedocs.io
BSD 3-Clause "New" or "Revised" License
43 stars 15 forks source link

Generic set_fft_mesh() function #473

Open jan-janssen opened 2 years ago

jan-janssen commented 2 years ago

Summary

Currently only VASP implements an set_fft_mesh(self, nx=None, ny=None, nz=None) function. Still it would be great to extend this functionality to other DFT codes and define a generic set_fft_mesh() function. In addition the arguments could be either relative or absolute and it might be more comfortable to use a list rather than three individual arguments.

Detailed Description

Different meshes in VASP:

Further Information, Files, and Links

niklassiemer commented 2 years ago

The FFT grid can be specified in the &SYSTEM section by providing values for nr1, nr2, nr3 (hard grid) or nr1s, nr2s, nr3s (smooth grid) in pw.x calculations - see https://www.quantum-espresso.org/Doc/INPUT_PW.html#idm294

_Originally posted by @niklassiemer in https://github.com/pyiron/pyiron_contrib/issues/287#issuecomment-992847301_

samwaseda commented 2 years ago

Comment from Christoph:

in SPHInX hat man volle Kontrolle über die FFT-Gitter. Dafür gibt es zwei Möglichkeiten: in basis {} kann man entweder

mesh = [NX,NY,NZ];

auf das gewünschte mesh setzen, oder per

meshAccuracy = <factor>;

relativ zum Standard-Gitter skalieren. (1.2 hieße z.B. ein FFT-Mesh was mindestens 1.2 mal größer ist, als das Standardmesh). Das SPHInX-Standardmesh ist so gewählt, das lineare aliasing-Effekte in der Elektronendichte nicht auftreten (im Gegensatz zu VASP, das im Normalmodus ein 80%-Gitter verwendet).

Neben dem plane-wave-cutoff der ebenen Wellen für die Wellenfunktionen kann man sogar den cutoff für die Dichte/Potentiale separat wählen (gCut), um den Default (gCut = 4 x eCut) zu überschreiben.

Das xc-Mesh ist grundsätzlich doppelt so fein (8x Punkte) wie das normale FFT-Mesh, das kann man aber auch im PAWHamiltonian individuell einstellen (xcMesh-Gruppe, Details im Manual). Hintergrund ist, dass xc nichtlinear ist und deswegen das lineare sampling Theorem nicht gilt. In der Praxis hat sich das doppelte xc-Mesh als ausreichend für die meisten Anwendungen erwiesen, und ist nicht so teuer, das Fine-Tuning viel brächte.

Zuguterletzt ist die Implementation der Augmentation-charges im reziproken Raum, sodass Aliasing-Effekte im Normalfall von vornherein nicht auftreten. Im Gegensatz dazu setzt VASP die Ladungen im Realraum auf, wodurch die Gittergröße viel problematischer ist.

Lange Rede kurzer Sinn: SPHInX ist an der Stelle eh viel besser als VASP aufgestellt. Wenn man fein-tunen will, dann am besten gezielt.

I presume that his strongest emphasis should be on the last phrase 😎

jan-janssen commented 2 years ago
def set_fft_mesh(self, nx=None, ny=None, nz=None, mesh_accuracy=1)
def set_xc_mesh(self, nxf=None, nyf=None, nzf=None, mesh_accuracy=1)

Here meshaccuracy=1 equals Accurate for VASP and analogously meshaccuracy=0.75 equals Normal. https://www.vasp.at/wiki/index.php/PREC and https://sxrepo.mpie.de/attachments/download/61/sphinx-manual-2.7.pdf