Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
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)
def build_flow(options):
flow, eph_inp = make_flow_ephinp(options)
mpi_list = options.mpi_list
if mpi_list is None:
nkpt = len(eph_inp.abiget_ibz().points)
nks = nkpt * eph_inp["nsppol"]
mpi_list = [p for p in range(1, nks+1) if nks % p == 0]
if options.verbose: print("Using mpi_list:", mpi_list)
else:
print("Using mpi_list from cmd line:", mpi_list)
eph_work = flowtk.Work()
for mpi_procs, omp_threads in product(mpi_list, options.omp_list):
if not options.accept_mpi_omp(mpi_procs, omp_threads): continue
manager = options.manager.new_with_fixed_mpi_omp(mpi_procs, omp_threads)
eph_work.register_eph_task(eph_inp, manager=manager, deps={flow[0][0]: "WFK", flow[1]: ["DDB", "DVDB"]})
flow.register_work(eph_work)
return flow.allocate()
def build_flow(options):
# Working directory (default is the name of the script with '.py' removed and "run_" replaced by "flow_")
if not options.workdir:
options.workdir = os.path.basename(sys.argv[0]).replace(".py", "").replace("run_", "flow_")
# Get the SCF and the NSCF input.
scf_input, nscf_input = make_scf_nscf_inputs()
# Build the flow.
flow = flowtk.Flow(options.workdir, manager=options.manager)
# Create a Work, all tasks in work will start from the DEN file.
# Note that the file must exist when the work is created
# Use the standard approach based on tasks and works if
# there's a node who needs a file produced in the future.
work = flowtk.Work()
den_filepath = abidata.ref_file("si_DEN.nc")
work.register_nscf_task(nscf_input, deps={den_filepath: "DEN"})
flow.register_work(work)
return flow
def make_g0w0_scissors_flow(workdir="flow_lesson_g0w0", ngkpt=(2,2,2)):
# Change the value of ngkpt below to perform a GW calculation with a different k-mesh.
scf, bands_nscf, dos_nscf, gw_nscf, scr, sig = make_inputs(ngkpt=ngkpt)
flow = flowtk.Flow(workdir=workdir)
work0 = flowtk.BandStructureWork(scf, bands_nscf, dos_inputs=dos_nscf)
flow.register_work(work0)
work1 = flowtk.Work()
gw_nscf_task = work1.register_nscf_task(gw_nscf, deps={work0[0]: "DEN"})
scr_task = work1.register_scr_task(scr, deps={gw_nscf_task: "WFK"})
sigma_task = work1.register_sigma_task(sig, deps={gw_nscf_task: "WFK", scr_task: "SCR"})
flow.register_work(work1)
return flow.allocate()
def build_flow(options):
# Working directory (default is the name of the script with '.py' removed and "run_" replaced by "flow_")
if not options.workdir:
options.workdir = os.path.basename(sys.argv[0]).replace(".py", "").replace("run_", "flow_")
structure = abidata.structure_from_ucell("MgB2")
# Get pseudos from a table.
table = abilab.PseudoTable(abidata.pseudos("12mg.pspnc", "5b.pspnc"))
pseudos = table.get_pseudos_for_structure(structure)
flow = flowtk.Flow(workdir=options.workdir)
# Build work of GS task. Each gs_task uses different (ngkpt, tsmear) values
# and represent the starting point of the phonon works.
scf_work = flowtk.Work()
ngkpt_list = [[4, 4, 4], [8, 8, 8]] #, [12, 12, 12]]
tsmear_list = [0.01, 0.02] # , 0.04]
for ngkpt in ngkpt_list:
for tsmear in tsmear_list:
scf_input = make_scf_input(structure, ngkpt, tsmear, pseudos)
scf_work.register_scf_task(scf_input)
flow.register_work(scf_work)
# This call uses the information reported in the GS task to
# compute all the independent atomic perturbations corresponding to a [2, 2, 2] q-mesh.
# For each GS task, construct a phonon work that will inherit (ngkpt, tsmear) from scf_task.
for scf_task in scf_work:
ph_work = flowtk.PhononWork.from_scf_task(scf_task, qpoints=[2, 2, 2], is_ngqpt=True)
flow.register_work(ph_work)
return flow.allocate(use_smartio=True)
gs_inp, nscf_inp, ddk_inp = make_inputs()
flow = BenchmarkFlow(workdir=options.get_workdir(__file__), remove=options.remove)
ebands_work = flowtk.BandStructureWork(gs_inp, nscf_inp)
flow.register_work(ebands_work)
flow.exclude_from_benchmark(ebands_work)
# Get the list of possible parallel configurations from abinit autoparal.
max_ncpus, min_eff = options.max_ncpus, options.min_eff
print("Getting all autoparal confs up to max_ncpus: ",max_ncpus," with efficiency >= ",min_eff)
pconfs = ddk_inp.abiget_autoparal_pconfs(max_ncpus, autoparal=1)
if options.verbose: print(pconfs)
work = flowtk.Work()
for conf, omp_threads in product(pconfs, options.omp_list):
mpi_procs = conf.mpi_ncpus
if not options.accept_conf(conf, omp_threads): continue
manager = options.manager.new_with_fixed_mpi_omp(mpi_procs, omp_threads)
inp = ddk_inp.new_with_vars(conf.vars)
work.register_ddk_task(inp, manager=manager, deps={ebands_work[1]: "WFK"})
print("Found %d configurations" % len(work))
flow.register_work(work)
return flow.allocate()
flow = BenchmarkFlow(workdir=options.get_workdir(__file__), remove=options.remove)
gs_work = flowtk.Work()
gs_work.register_scf_task(gs_inp)
flow.register_work(gs_work)
flow.exclude_from_benchmark(gs_work)
# Get the list of possible parallel configurations from abinit autoparal.
max_ncpus, min_eff = options.max_ncpus, options.min_eff
print("Getting all autoparal confs up to max_ncpus:", max_ncpus, "with efficiency >=", min_eff)
pconfs = ph_inp.abiget_autoparal_pconfs(max_ncpus, autoparal=1)
if options.verbose: print(pconfs)
omp_threads = 1
work = flowtk.Work()
for conf in pconfs:
mpi_procs = conf.mpi_ncpus
if not options.accept_mpi_omp(mpi_procs, omp_threads): continue
if min_eff is not None and conf.efficiency < min_eff: continue
if options.verbose: print(conf)
manager = options.manager.new_with_fixed_mpi_omp(mpi_procs, omp_threads)
inp = ph_inp.new_with_vars(conf.vars)
work.register_phonon_task(inp, manager=manager, deps={gs_work[0]: "WFK"})
print("Found %d configurations" % len(work))
flow.register_work(work)
return flow.allocate()
gs_inp.set_kmesh(
ngkpt=[8, 8, 8],
shiftk=[0.0, 0.0, 0.0],
)
# Phonon calculation with 4x4x4
ddb_ngqpt = [4, 4, 4]
qpoints = gs_inp.abiget_ibz(ngkpt=ddb_ngqpt, shiftk=[0, 0, 0], kptopt=1).points
flow = flowtk.Flow(options.workdir, manager=options.manager)
work0 = flow.register_scf_task(gs_inp)
ph_work = flowtk.PhononWork.from_scf_task(work0[0], qpoints)
flow.register_work(ph_work)
eph_work = flow.register_work(flowtk.Work())
eph_deps = {work0[0]: "WFK", ph_work: ["DDB", "DVDB"]}
for eph_ngqpt_fine in [(4, 4, 4,), (8, 8, 8)]:
# Build input file for E-PH run.
eph_inp = gs_inp.new_with_vars(
optdriver=7,
ddb_ngqpt=ddb_ngqpt, # q-mesh used to produce the DDB file (must be consistent with DDB data)
eph_intmeth=2, # Tetra method
eph_fsewin="0.8 eV", # Energy window around Ef
eph_mustar=0.12, # mustar parameter
eph_ngqpt_fine=eph_ngqpt_fine, # Interpolate DFPT potentials if != ddb_ngqpt
)
# Set q-path for phonons and phonon linewidths.
eph_inp.set_qpath(20)