def main(): import optparse parser = optparse.OptionParser(usage='Usage: %prog <gpw-file> [options]', description=description) add = parser.add_option add('-e', '--cut-off', type=float, default=100, meta='ECUT', help='Plane-wave cut off energy (eV) for polarization function.') add('-b', '--blocks', type=int, default=1, meta='N', help='Split polarization matrix in N blocks.') opts, args = parser.parse_args() if len(args) == 0: parser.error('No gpw-file!') if len(args) > 1: parser.error('Too many arguments!') name = args[0] assert name.endswith('.gpw') rpa = RPACorrelation(name, txt=name[:-3] + 'rpa.txt', wstc=True, nblocks=opts.blocks) rpa.calculate([opts.cut_off])
def __init__(self, calc, xc='RPA', filename=None, skip_gamma=False, qsym=True, nlambda=8, nfrequencies=16, frequency_max=800.0, frequency_scale=2.0, frequencies=None, weights=None, density_cut=1.e-6, wcomm=None, chicomm=None, world=mpi.world, unit_cells=None, tag=None, txt=sys.stdout): RPACorrelation.__init__(self, calc, xc=xc, filename=filename, skip_gamma=skip_gamma, qsym=qsym, nfrequencies=nfrequencies, nlambda=nlambda, frequency_max=frequency_max, frequency_scale=frequency_scale, frequencies=frequencies, weights=weights, wcomm=wcomm, chicomm=chicomm, world=world, txt=txt) self.l_l, self.weight_l = p_roots(nlambda) self.l_l = (self.l_l + 1.0) * 0.5 self.weight_l *= 0.5 self.xc = xc self.density_cut = density_cut if unit_cells is None: unit_cells = self.calc.wfs.kd.N_c self.unit_cells = unit_cells if tag is None: tag = self.calc.atoms.get_chemical_formula(mode='hill') self.tag = tag
def calculate(self, ecut): if self.xc != 'RPA': if isinstance(ecut, (float, int)): self.ecut_max = ecut else: self.ecut_max = max(ecut) if not os.path.isfile('fhxc_%s_%s_%s_0.gpw' % (self.tag, self.xc, self.ecut_max)): kernel = Kernel(self.calc, self.xc, self.ibzq_qc, self.fd, self.unit_cells, self.density_cut, self.ecut_max, self.tag, self.timer) kernel.calculate_fhxc() del kernel else: prnt('%s kernel already calculated' % self.xc, file=self.fd) prnt(file=self.fd) if self.calc.wfs.nspins == 1: spin = False else: spin = True e = RPACorrelation.calculate(self, ecut, spin=spin) return e
def calculate(self, ecut): if self.xc != 'RPA': if isinstance(ecut, (float, int)): self.ecut_max = ecut else: self.ecut_max = max(ecut) if not os.path.isfile('fhxc_%s_%s_%s_0.gpw' % (self.tag, self.xc, self.ecut_max)): kernel = Kernel(self.calc, self.xc, self.ibzq_qc, self.fd, self.unit_cells, self.density_cut, self.ecut_max, self.tag) kernel.calculate_fhxc() del kernel else: prnt('%s kernel already calculated' % self.xc, file=self.fd) prnt(file=self.fd) if self.calc.wfs.nspins == 1: spin = False else: spin = True e = RPACorrelation.calculate(self, ecut, spin=spin) return e
def __init__(self, calc, xc='RPA', filename=None, skip_gamma=False, qsym=True, nlambda=8, nfrequencies=16, frequency_max=800.0, frequency_scale=2.0, frequencies=None, weights=None, density_cut=1.e-6, world=mpi.world, nblocks=1, unit_cells=None, tag=None, txt=sys.stdout): RPACorrelation.__init__(self, calc, xc=xc, filename=filename, skip_gamma=skip_gamma, qsym=qsym, nfrequencies=nfrequencies, nlambda=nlambda, frequency_max=frequency_max, frequency_scale=frequency_scale, frequencies=frequencies, weights=weights, world=world, nblocks=nblocks, txt=txt) self.l_l, self.weight_l = p_roots(nlambda) self.l_l = (self.l_l + 1.0) * 0.5 self.weight_l *= 0.5 self.xc = xc self.density_cut = density_cut if unit_cells is None: unit_cells = self.calc.wfs.kd.N_c self.unit_cells = unit_cells if tag is None: tag = self.calc.atoms.get_chemical_formula(mode='hill') self.tag = tag
def rpa(filename, ecut=200.0, blocks=1, extrapolate=4): """Calculate RPA energy. filename: str Name of restart-file. ecut: float Plane-wave cutoff. blocks: int Split polarizability matrix in this many blocks. extrapolate: int Number of cutoff energies to use for extrapolation. """ name, ext = filename.rsplit('.', 1) assert ext == 'gpw' from gpaw.xc.rpa import RPACorrelation rpa = RPACorrelation(name, name + '-rpa.dat', nblocks=blocks, txt=name + '-rpa.txt') rpa.calculate(ecut=ecut * (1 + 0.5 * np.arange(extrapolate))**(-2 / 3))
def rpa(filename, ecut=200.0, blocks=1, extrapolate=4): """Calculate RPA energy. filename: str Name of restart-file. ecut: float Plane-wave cutoff. blocks: int Split polarizability matrix in this many blocks. extrapolate: int Number of cutoff energies to use for extrapolation. """ name, ext = filename.rsplit('.', 1) assert ext == 'gpw' from gpaw.xc.rpa import RPACorrelation rpa = RPACorrelation(name, name + '-rpa.dat', nblocks=blocks, wstc=True, txt=name + '-rpa.txt') rpa.calculate(ecut=ecut * (1 + 0.5 * np.arange(extrapolate))**(-2 / 3))
from gpaw.mpi import serial_comm from gpaw.test import equal from gpaw.xc.rpa import RPACorrelation import numpy as np a0 = 5.43 cell = bulk('Si', 'fcc', a=a0).get_cell() Si = Atoms('Si2', cell=cell, pbc=True, scaled_positions=((0,0,0), (0.25,0.25,0.25))) kpts = monkhorst_pack((2,2,2)) kpts += np.array([1/4., 1/4., 1/4.]) calc = GPAW(mode='pw', kpts=kpts, occupations=FermiDirac(0.001), communicator=serial_comm) Si.set_calculator(calc) E = Si.get_potential_energy() calc.diagonalize_full_hamiltonian(nbands=50) ecut = 50 rpa = RPACorrelation(calc, qsym=False, nfrequencies=8) E_rpa_noqsym = rpa.calculate(ecut=[ecut]) rpa = RPACorrelation(calc, qsym=True, nfrequencies=8) E_rpa_qsym = rpa.calculate(ecut=[ecut]) equal(E_rpa_qsym, E_rpa_noqsym, 0.001) equal(E_rpa_qsym, -12.61, 0.01)
from ase.build import bulk from gpaw import GPAW, FermiDirac from gpaw.mpi import serial_comm from gpaw.test import equal from gpaw.xc.rpa import RPACorrelation a0 = 5.43 Si = bulk('Si', a=a0) calc = GPAW(mode='pw', kpts={ 'size': (2, 2, 2), 'gamma': True }, occupations=FermiDirac(0.001), communicator=serial_comm) Si.set_calculator(calc) E = Si.get_potential_energy() calc.diagonalize_full_hamiltonian(nbands=50) ecut = 50 rpa = RPACorrelation(calc, qsym=False, nfrequencies=8) E_rpa_noqsym = rpa.calculate(ecut=[ecut]) rpa = RPACorrelation(calc, qsym=True, nfrequencies=8) E_rpa_qsym = rpa.calculate(ecut=[ecut]) print(E_rpa_qsym, E_rpa_noqsym, 0.001) equal(E_rpa_qsym, -12.61, 0.01)
from __future__ import print_function from ase.parallel import paropen from ase.units import Hartree from gpaw.xc.rpa import RPACorrelation from gpaw.xc.fxc import FXCCorrelation from gpaw.mpi import world fxc0 = FXCCorrelation('CO.ralda.pbe_wfcs_CO.gpw', xc='rAPBE', txt='CO.ralda_02_CO_rapbe.txt', wcomm=world.size) E0_i = fxc0.calculate(ecut=400) f = paropen('CO.ralda_rapbe_CO.dat', 'w') for ecut, E0 in zip(fxc0.ecut_i, E0_i): print(ecut * Hartree, E0, file=f) f.close() rpa0 = RPACorrelation('CO.ralda.pbe_wfcs_CO.gpw', txt='CO.ralda_02_CO_rpa.txt', wcomm=world.size) E0_i = rpa0.calculate(ecut=400) f = paropen('CO.ralda_rpa_CO.dat', 'w') for ecut, E0 in zip(rpa0.ecut_i, E0_i): print(ecut * Hartree, E0, file=f) f.close()
from gpaw.xc.rpa import RPACorrelation rpa = RPACorrelation('H.ralda.pbe_wfcs.gpw', txt='H.ralda_05_rpa_at_pbe.output.txt') rpa.calculate(ecut=300)
from __future__ import print_function from ase.parallel import paropen from ase.units import Hartree from gpaw.xc.rpa import RPACorrelation f = paropen('con_freq.dat', 'w') for N in [4, 6, 8, 12, 16, 24, 32]: rpa = RPACorrelation('N2.gpw', txt='rpa_N2_frequencies.txt', nfrequencies=N) E = rpa.calculate(ecut=[50]) print(N, E[0], file=f) if N == 16: f16 = paropen('frequency_gauss16.dat', 'w') for w, e in zip(rpa.omega_w, rpa.E_w): print(w * Hartree, e, file=f16) f16.close() f.close()
from ase.build import bulk from gpaw import GPAW, FermiDirac from gpaw.mpi import serial_comm from gpaw.test import equal from gpaw.xc.rpa import RPACorrelation from gpaw.xc.fxc import FXCCorrelation a0 = 5.43 Ni = bulk('Ni', 'fcc') Ni.set_initial_magnetic_moments([0.7]) calc = GPAW(mode='pw', kpts=(3, 3, 3), occupations=FermiDirac(0.001), setups={'Ni': '10'}, communicator=serial_comm) Ni.set_calculator(calc) E = Ni.get_potential_energy() calc.diagonalize_full_hamiltonian(nbands=50) rpa = RPACorrelation(calc, nfrequencies=8, skip_gamma=True) E_rpa = rpa.calculate(ecut=[50]) fxc = FXCCorrelation(calc, nlambda=16, nfrequencies=8, skip_gamma=True) E_fxc = fxc.calculate(ecut=[50]) equal(E_rpa, -7.826, 0.01) equal(E_fxc, -7.826, 0.01)
calc = GPAW(mode=PW(force_complex_dtype=True), xc='PBE', parallel={'domain': 1}, eigensolver='rmm-diis') N2.set_calculator(calc) E_n2_pbe = N2.get_potential_energy() calc.diagonalize_full_hamiltonian(nbands=104, scalapack=True) calc.write('N2.gpw', mode='all') exx = EXX('N2.gpw') exx.calculate() E_n2_hf = exx.get_total_energy() rpa = RPACorrelation('N2.gpw', nfrequencies=8) E_n2_rpa = rpa.calculate(ecut=[ecut]) N = molecule('N') N.set_cell(N2.cell) calc = GPAW(mode=PW(force_complex_dtype=True), xc='PBE', parallel={'domain': 1}, eigensolver='rmm-diis') N.set_calculator(calc) E_n_pbe = N.get_potential_energy() calc.diagonalize_full_hamiltonian(nbands=104, scalapack=True) calc.write('N.gpw', mode='all')
from __future__ import print_function from ase.parallel import paropen from gpaw.xc.rpa import RPACorrelation ds = [1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 5.0, 6.0, 10.0] for d in ds: rpa = RPACorrelation('gs_%s.gpw' % d, txt='rpa_%s_%s.txt' % (ecut, d)) E_rpa = rpa.calculate(ecut=[200], frequency_scale=2.5, skip_gamma=True, filename='restart_%s_%s.txt' % (ecut, d)) f = paropen('rpa_%s.dat' % ecut, 'a') print(d, E_rpa, file=f) f.close()
def run(args): assert args.gpw.endswith('.gpw') rpa = RPACorrelation(args.gpw, txt=args.gpw[:-3] + 'rpa.txt', nblocks=args.blocks) rpa.calculate([args.cut_off])
from gpaw.xc.rpa import RPACorrelation rpa1 = RPACorrelation('bulk.all.gpw', txt='si.rpa.rpa_output.txt') E1_i = rpa1.calculate(ecut=[164.0, 140.0, 120.0, 100.0, 80.0])
from gpaw.xc.rpa import RPACorrelation rpa = RPACorrelation('H.ralda.lda_wfcs.gpw', txt='H.ralda_02_rpa_at_lda.output.txt') rpa.calculate(ecut=300)
cell = bulk('Si', 'fcc', a=a0).get_cell() Si = Atoms('Si2', cell=cell, pbc=True, scaled_positions=((0,0,0), (0.25,0.25,0.25))) kpts = monkhorst_pack((2,2,2)) kpts += np.array([1/4., 1/4., 1/4.]) calc = GPAW(mode='pw', kpts=kpts, occupations=FermiDirac(0.001), communicator=serial_comm) Si.set_calculator(calc) E = Si.get_potential_energy() calc.diagonalize_full_hamiltonian(nbands=50) rpa = RPACorrelation(calc) E_rpa1 = rpa.calculate(ecut=[25, 50]) fxc = FXCCorrelation(calc, xc='RPA', nlambda=16) E_rpa2 = fxc.calculate(ecut=[25, 50]) fxc = FXCCorrelation(calc, xc='rALDA', unit_cells=[1,1,2]) E_ralda = fxc.calculate(ecut=[25, 50]) fxc = FXCCorrelation(calc, xc='rAPBE', unit_cells=[1,1,2]) E_rapbe = fxc.calculate(ecut=[25, 50]) equal(E_rpa1[-1], E_rpa2[-1], 0.01) equal(E_rpa2[-1], -12.6495, 0.001) equal(E_ralda[-1], -11.3817, 0.001) equal(E_rapbe[-1], -11.1640, 0.001)
from ase.parallel import paropen from gpaw.xc.rpa import RPACorrelation import numpy as np dw = 0.5 frequencies = np.array([dw * i for i in range(2000)]) weights = len(frequencies) * [dw] weights[0] /= 2 weights[-1] /= 2 weights = np.array(weights) rpa = RPACorrelation('N2.gpw', txt='frequency_equidistant.txt', frequencies=frequencies, weights=weights) Es = rpa.calculate(ecut=[50]) Es_w = rpa.E_w f = paropen('frequency_equidistant.dat', 'w') for w, E in zip(frequencies, Es_w): print >> f, w, E.real f.close()
from gpaw.xc.rpa import RPACorrelation #This calculation is too heavy to run as an exercise!! rpa1 = RPACorrelation('si_isolated.gpw', txt='rpa_output.txt') E1_i = rpa1.calculate(ecut=400.0)
from ase.lattice import bulk from gpaw import GPAW, FermiDirac from gpaw.mpi import serial_comm from gpaw.test import equal from gpaw.xc.rpa import RPACorrelation from gpaw.xc.fxc import FXCCorrelation a0 = 5.43 Ni = bulk("Ni", "fcc") Ni.set_initial_magnetic_moments([0.7]) calc = GPAW(mode="pw", kpts=(3, 3, 3), occupations=FermiDirac(0.001), setups={"Ni": "10"}, communicator=serial_comm) Ni.set_calculator(calc) E = Ni.get_potential_energy() calc.diagonalize_full_hamiltonian(nbands=50) rpa = RPACorrelation(calc, nfrequencies=8, skip_gamma=True) E_rpa = rpa.calculate(ecut=[50]) fxc = FXCCorrelation(calc, nlambda=16, nfrequencies=8, skip_gamma=True) E_fxc = fxc.calculate(ecut=[50]) equal(E_rpa, -7.826, 0.01) equal(E_fxc, -7.826, 0.01)
from __future__ import print_function from ase.parallel import paropen from gpaw.xc.rpa import RPACorrelation import numpy as np dw = 0.5 frequencies = np.array([dw * i for i in range(2000)]) weights = len(frequencies) * [dw] weights[0] /= 2 weights[-1] /= 2 weights = np.array(weights) rpa = RPACorrelation('N2.gpw', txt='frequency_equidistant.txt', frequencies=frequencies, weights=weights) Es = rpa.calculate(ecut=[50]) Es_w = rpa.E_w f = paropen('frequency_equidistant.dat', 'w') for w, E in zip(frequencies, Es_w): print(w, E.real, file=f) f.close()
from __future__ import print_function from ase.parallel import paropen from ase.units import Hartree from gpaw.xc.rpa import RPACorrelation rpa = RPACorrelation('N.gpw', nblocks=8, truncation='wigner-seitz', txt='rpa_N.txt') E1_i = rpa.calculate(ecut=400) rpa = RPACorrelation('N2.gpw', nblocks=8, truncation='wigner-seitz', txt='rpa_N2.txt') E2_i = rpa.calculate(ecut=400) ecut_i = rpa.ecut_i f = paropen('rpa_N2.dat', 'w') for ecut, E1, E2 in zip(ecut_i, E1_i, E2_i): print(ecut * Hartree, E2 - 2 * E1, file=f) f.close()
from gpaw.xc.rpa import RPACorrelation from gpaw.test import equal bulk = bulk("Na", "bcc", a=4.23) ecut = 350 calc = GPAW( mode=PW(ecut), dtype=complex, basis="dzp", kpts={"size": (4, 4, 4), "gamma": True}, parallel={"domain": 1}, txt="gs_occ_pw.txt", nbands=4, occupations=FermiDirac(0.01), setups={"Na": "1"}, ) bulk.set_calculator(calc) bulk.get_potential_energy() calc.write("gs_occ_pw.gpw") calc = GPAW("gs_occ_pw.gpw", txt="gs_pw.txt", parallel={"band": 1}) calc.diagonalize_full_hamiltonian(nbands=520) calc.write("gs_pw.gpw", "all") ecut = 120 calc = GPAW("gs_pw.gpw", communicator=serial_comm, txt=None) rpa = RPACorrelation(calc, txt="rpa_%s.txt" % ecut) E = rpa.calculate(ecut=[ecut]) equal(E, -1.106, 0.005)
from gpaw.xc.rpa import RPACorrelation rpa1 = RPACorrelation('bulk.gpw', txt='si.rpa.rpa_output.txt') E1_i = rpa1.calculate(ecut=[164.0, 140.0, 120.0, 100.0, 80.0])
calc = GPAW(mode=PW(300), hund=True, dtype=complex, xc='LDA') H.set_calculator(calc) E_lda = H.get_potential_energy() E_c_lda = -calc.get_xc_difference('LDA_X') print 'LDA correlation: ', E_c_lda, 'eV' print calc.diagonalize_full_hamiltonian() calc.write('H_lda.gpw', mode='all') rpa = RPACorrelation('H_lda.gpw') rpa.calculate(ecut=300) fxc = FXCCorrelation('H_lda.gpw', xc='rALDA') fxc.calculate(ecut=300) # PBE -------------------------------------- H = Atoms('H', [(0, 0, 0)]) H.set_pbc(True) H.center(vacuum=2.0) calc = GPAW(mode=PW(300), hund=True, dtype=complex, xc='PBE')
from __future__ import print_function from ase.parallel import paropen from ase.units import Hartree from gpaw.xc.rpa import RPACorrelation rpa1 = RPACorrelation('N.gpw', nblocks=8, wstc=True, txt='rpa_N.txt') rpa2 = RPACorrelation('N2.gpw', nblocks=8, wstc=True, txt='rpa_N2.txt') E1_i = rpa1.calculate(ecut=400) E2_i = rpa2.calculate(ecut=400) f = paropen('rpa_N2.dat', 'w') for ecut, E1, E2 in zip(rpa1.ecut_i, E1_i, E2_i): print(ecut * Hartree, E2 - 2 * E1, file=f) f.close()
N2 = molecule("N2") N2.center(vacuum=2.0) calc = GPAW(mode="pw", dtype=complex, xc="PBE", eigensolver="rmm-diis") N2.set_calculator(calc) E_n2_pbe = N2.get_potential_energy() calc.diagonalize_full_hamiltonian(nbands=104, scalapack=True) calc.write("N2.gpw", mode="all") exx = EXX("N2.gpw") exx.calculate() E_n2_hf = exx.get_total_energy() rpa = RPACorrelation("N2.gpw", nfrequencies=8) E_n2_rpa = rpa.calculate(ecut=[ecut]) # ------------------------------------------------------------------------- N = molecule("N") N.set_cell(N2.cell) calc = GPAW(mode="pw", dtype=complex, xc="PBE", eigensolver="rmm-diis") N.set_calculator(calc) E_n_pbe = N.get_potential_energy() calc.diagonalize_full_hamiltonian(nbands=104, scalapack=True) calc.write("N.gpw", mode="all") exx = EXX("N.gpw")
bulk = bulk('Na', 'bcc', a=4.23) ecut = 350 calc = GPAW( mode=PW(ecut), dtype=complex, basis='dzp', kpts={ 'size': (4, 4, 4), 'gamma': True }, parallel={'domain': 1}, txt='gs_occ_pw.txt', nbands=4, occupations=FermiDirac(0.01), setups={'Na': '1'}, ) bulk.set_calculator(calc) bulk.get_potential_energy() calc.write('gs_occ_pw.gpw') calc = GPAW('gs_occ_pw.gpw', txt='gs_pw.txt', parallel={'band': 1}) calc.diagonalize_full_hamiltonian(nbands=520) calc.write('gs_pw.gpw', 'all') ecut = 120 calc = GPAW('gs_pw.gpw', communicator=serial_comm, txt=None) rpa = RPACorrelation(calc, txt='rpa_%s.txt' % ecut) E = rpa.calculate(ecut=[ecut]) equal(E, -1.106, 0.005)
from __future__ import print_function from ase.parallel import paropen from ase.units import Hartree from gpaw.xc.rpa import RPACorrelation from gpaw.xc.fxc import FXCCorrelation fxc = FXCCorrelation('diamond.ralda.pbe_wfcs.gpw', xc='rAPBE', txt='diamond.ralda_02_rapbe.txt') E_i = fxc.calculate(ecut=400) f = paropen('diamond.ralda.rapbe.dat', 'w') for ecut, E in zip(fxc.ecut_i, E_i): print(ecut * Hartree, E, file=f) f.close() rpa = RPACorrelation('diamond.ralda.pbe_wfcs.gpw', txt='diamond.ralda_02_rpa.txt') E_i = rpa.calculate(ecut=400) f = paropen('diamond.ralda.rpa.dat', 'w') for ecut, E in zip(rpa.ecut_i, E_i): print(ecut * Hartree, E, file=f) f.close()
cell = bulk('Si', 'fcc', a=a0).get_cell() Si = Atoms('Si2', cell=cell, pbc=True, scaled_positions=((0,0,0), (0.25,0.25,0.25))) kpts = monkhorst_pack((2,2,2)) kpts += np.array([1/4., 1/4., 1/4.]) calc = GPAW(mode='pw', kpts=kpts, occupations=FermiDirac(0.001), communicator=serial_comm) Si.set_calculator(calc) E = Si.get_potential_energy() calc.diagonalize_full_hamiltonian(nbands=50) rpa = RPACorrelation(calc) E_rpa1 = rpa.calculate(ecut=[25, 50]) fxc = FXCCorrelation(calc, xc='RPA', nlambda=16) E_rpa2 = fxc.calculate(ecut=[25, 50]) fxc = FXCCorrelation(calc, xc='rALDA', unit_cells=[1,1,2]) E_ralda = fxc.calculate(ecut=[25, 50]) fxc = FXCCorrelation(calc, xc='rAPBE', unit_cells=[1,1,2]) E_rapbe = fxc.calculate(ecut=[25, 50]) fxc = FXCCorrelation(calc, xc='rALDA', av_scheme='wavevector') E_raldawave = fxc.calculate(ecut=[25, 50]) fxc = FXCCorrelation(calc, xc='rAPBE', av_scheme='wavevector')
from gpaw.xc.rpa import RPACorrelation #This calculation is too heavy to run as an exercise!! rpa1 = RPACorrelation('si.rpa.isolated.gpw', txt='si.atom.rpa_output.txt') E1_i = rpa1.calculate(ecut=400.0)