Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
shiftk = [
[0.5, 0.5, 0.5],
[0.5, 0.0, 0.0],
[0.0, 0.5, 0.0],
[0.0, 0.0, 0.5],
]
# NSCF run on k-path with large number of bands
kptbounds = [
[0.5, 0.0, 0.0], # L point
[0.0, 0.0, 0.0], # Gamma point
[0.0, 0.5, 0.5], # X point
]
# Initialize the flow.
flow = flowtk.Flow(options.workdir, manager=options.manager)
for nspinor in [1, 2]:
# Multi will contain two datasets (GS + NSCF) for the given nspinor.
multi = abilab.MultiDataset(structure=structure, pseudos=pseudos, ndtset=2)
# Global variables.
multi.set_vars(
ecut=20,
nspinor=nspinor,
nspden=1 if nspinor == 1 else 4,
so_psp="*0" if nspinor == 1 else "*1", # Important!
#paral_kgb=1,
)
nband_occ = num_electrons // 2 if nspinor == 1 else num_electrons
#print(nband_occ)
temp_inds = range(self.ntemp) if temp_inds is None else temp_inds
ntemp = len(temp_inds)
spins = range(self.ebands.nsppol) if spins is None else spins
kpt_inds = range(self.ebands.nkpt) if kpt_inds is None else kpt_inds
nkpt = len(kpt_inds)
xs, emin, emax = self.get_emesh_eminmax(estep)
nene = len(xs)
num_plots, ncols, nrows = nkpt, 1, 1
if num_plots > 1:
ncols = 2
nrows = (num_plots // ncols) + (num_plots % ncols)
# Build plot grid.
ax_list, fig, plt = get_axarray_fig_plt(None, nrows=nrows, ncols=ncols,
sharex=True, sharey=True, squeeze=False)
ax_list = np.array(ax_list).ravel()
cmap = plt.get_cmap(colormap)
for isp, spin in enumerate(spins):
spin_sign = +1 if spin == 0 else -1
for ik, (ikpt, ax) in enumerate(zip(kpt_inds, ax_list)):
ax.grid(True)
atw = self.get_atw(xs, spin, ikpt, band_inds, temp_inds)
for it, itemp in enumerate(temp_inds):
ys = spin_sign * atw[it] + (it * apad)
ax.plot(xs, ys, lw=2, alpha=0.8, color=cmap(float(it) / ntemp),
label="T = %.1f K" % self.tmesh[itemp] if (ik, isp) == (0, 0) else None)
if spin == 0:
kpt = self.ebands.kpoints[ikpt]
"""
Plot (k, e) color maps for different temperatures.
Args:
fontsize (int): fontsize for titles and legend
Return: |matplotlib-Figure|
"""
temp_inds = range(self.ntemp) if temp_inds is None else temp_inds
# Build plot grid.
num_plots, ncols, nrows = len(temp_inds), 1, 1
if num_plots > 1:
ncols = 2
nrows = (num_plots // ncols) + (num_plots % ncols)
ax_list, fig, plt = get_axarray_fig_plt(None, nrows=nrows, ncols=ncols,
sharex=True, sharey=True, squeeze=False)
ax_list = ax_list.ravel()
# Don't show the last ax if numeb is odd.
if num_plots % ncols != 0: ax_list[-1].axis("off")
for itemp, ax in zip(temp_inds, ax_list):
self.plot_ekmap_itemp(itemp=itemp, spins=spins, estep=estep, ax=ax, ylims=ylims,
with_colorbar=with_colorbar, show=False, **kwargs)
ax.set_title("T = %.1f K" % self.tmesh[itemp], fontsize=fontsize)
return fig
Args:
e0: Option used to define the zero of energy in the band structure plot. Possible values:
- ``fermie``: shift all eigenvalues to have zero energy at the Fermi energy (`self.fermie`).
- Number e.g e0=0.5: shift all eigenvalues to have zero energy at 0.5 eV
- None: Don't shift energies, equivalent to e0=0
fontsize: Fontsize for title.
Return: |matplotlib-Figure|
"""
num_plots, ncols, nrows = self.ntemp, 1, 1
if num_plots > 1:
ncols = 2
nrows = (num_plots // ncols) + (num_plots % ncols)
ax_list, fig, plt = get_axarray_fig_plt(None, nrows=nrows, ncols=ncols,
sharex=True, sharey=True, squeeze=False)
ax_list = np.array(ax_list).ravel()
# don't show the last ax if num_plots is odd.
if num_plots % ncols != 0: ax_list[-1].axis("off")
#e0 = 0
for itemp, ax in enumerate(ax_list):
fig = self.plot_itemp(itemp, ax=ax, e0=e0, ylims=ylims, fontsize=fontsize, show=False)
if itemp != 0:
set_visible(ax, False, "ylabel", "legend")
return fig
numeb = len(edos_list)
if numeb > 1:
ncols = 2
nrows = numeb // ncols + numeb % ncols
# Build Grid
fig, axes = plt.subplots(nrows=nrows, ncols=ncols, sharey=True, squeeze=False)
axes = axes.ravel()
# don't show the last ax if numeb is odd.
if numeb % ncols != 0: axes[-1].axis("off")
for i, (label, edos) in enumerate(self.edoses_dict.items()):
ax = axes[i]
edos.plot(ax=ax, e0=e0, show=False)
ax.set_title(label)
set_axlims(ax, xlims, "x")
if i % ncols != 0:
ax.set_ylabel("")
return fig
#structure.perturb(distance=0.01)
# Compress the lattice so that ABINIT complains about dilatmx
structure.scale_lattice(structure.volume * scalevol)
global_vars = dict(
ecut=6,
ecutsm=0.5,
ngkpt=[4,4,4],
shiftk=[0,0,0],
nshiftk=1,
chksymbreak=0,
paral_kgb=tvars.paral_kgb,
)
multi = abilab.MultiDataset(structure, pseudos=abidata.pseudos("14si.pspnc"), ndtset=2)
# Global variables
multi.set_vars(global_vars)
# Dataset 1 (Atom Relaxation)
multi[0].set_vars(
optcell=0,
ionmov=2,
tolrff=0.02,
tolmxf=5.0e-5,
ntime=ntime,
)
# Dataset 2 (Atom + Cell Relaxation)
multi[1].set_vars(
optcell=1,
scf_task = flow[0][0]
nscf_task = flow[0][1]
scr_task = flow[0][2]
sig_task = flow[0][3]
# Test garbage_collector
# The WFK|SCR file should have been removed because we call set_garbage_collector
assert not scf_task.outdir.has_abiext("WFK")
assert not nscf_task.outdir.has_abiext("WFK")
assert not scr_task.outdir.has_abiext("SCR")
assert not scr_task.outdir.has_abiext("SUS")
# The sigma task should produce a SIGRES file.
sigfile = sig_task.outdir.list_filepaths(wildcard="*SIGRES.nc")[0]
assert sigfile
with abilab.abiopen(sigfile) as sigres:
sigres.to_string(verbose=2)
assert sigres.nsppol == 1
# Test SigmaTask inspect method
#if has_matplotlib():
#sig_task.inspect(show=False)
# Test get_results for Sigma and Scr
scr_task.get_results()
sig_task.get_results()
# Test SCR.nc file (this is optional)
if scr_task.scr_path:
with scr_task.open_scr() as scr:
scr.to_string(verbose=2)
assert len(scr.wpts) == 2
ddb_path = ddb.filepath
ddb.to_string(verbose=2)
assert len(ddb.structure) == 2
#assert ddb.qpoints.frac_coords
# Test PhononTask inspect method
ph_task = flow[1][0]
if has_matplotlib():
assert ph_task.inspect(show=False)
# Test get_results
#ph_task.get_results()
# Build new work with Anaddb tasks.
# Construct a manager with mpi_procs==1 since anaddb do not support mpi_procs > 1 (except in elphon)
shell_manager = fwp.manager.to_shell_manager(mpi_procs=1)
awork = flowtk.Work(manager=shell_manager)
# Phonons bands and DOS with gaussian method
anaddb_input = abilab.AnaddbInput.phbands_and_dos(
scf_input.structure, ngqpt=ph_ngqpt, ndivsm=5, nqsmall=10, dos_method="gaussian: 0.001 eV")
atask = flowtk.AnaddbTask(anaddb_input, ddb_node=ddb_path, manager=shell_manager)
awork.register(atask)
# Phonons bands and DOS with tetrahedron method
anaddb_input = abilab.AnaddbInput.phbands_and_dos(
scf_input.structure, ngqpt=ph_ngqpt, ndivsm=5, nqsmall=10, dos_method="tetra")
atask = flowtk.AnaddbTask(anaddb_input, ddb_node=ddb_path, manager=shell_manager)
awork.register(atask)
flow.register_work(awork)
def itest_dilatmx_error_handler(fwp, tvars):
"""
Test cell relaxation with automatic restart in the presence of dilatmx error.
"""
pytest.xfail("dilatmxerror_handler is not portable and it's been disabled!")
# Build the flow
flow = flowtk.Flow(fwp.workdir, manager=fwp.manager)
# Decrease the volume to trigger DilatmxError
ion_input, ioncell_input = make_ion_ioncell_inputs(tvars, dilatmx=1.01, scalevol=0.8)
work = flowtk.Work()
work.register_relax_task(ioncell_input)
flow.register_work(work)
flow.allocate()
assert flow.make_scheduler().start() == 0
flow.show_status()
assert all(work.finalized for work in flow)
if not flow.all_ok:
flow.debug()
raise RuntimeError()
# t0 should have reached S_OK, and we should have DilatmxError in the corrections.
t0 = work[0]
assert t0.status == t0.S_OK
print(t0.corrections)
# Create flow to compute all the independent atomic perturbations
# corresponding to a [4, 4, 4] q-mesh.
# Electric field and Born effective charges are also computed.
flow = flowtk.PhononFlow.from_scf_input(options.workdir, scf_input,
ph_ngqpt=(4, 4, 4), with_becs=True)
return flow
# This block generates the thumbnails in the AbiPy gallery.
# You can safely REMOVE this part if you are using this script for production runs.
if os.getenv("READTHEDOCS", False):
__name__ = None
import tempfile
options = flowtk.build_flow_main_parser().parse_args(["-w", tempfile.mkdtemp()])
build_flow(options).graphviz_imshow()
@flowtk.flow_main
def main(options):
"""
This is our main function that will be invoked by the script.
flow_main is a decorator implementing the command line interface.
Command line args are stored in `options`.
"""
return build_flow(options)
if __name__ == "__main__":
sys.exit(main())