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)
Given a initial directory `dirname` containing a node of the `Flow`,
this function locates the directory of the flow (e.g. the directory with the pickle file)
and returns the name of the work and/or of the node.
Return: flowdir, wname, tname
where flowdir is the directory containing the pickle file,
wname and tname are the basenames of the work/task.
If dirname contains the pickle file we have (wname, tname) == (None, None)
If dirname is a work --> wname is it's basename and tname is None
If dirname is a task --> os.path.join(flowdir, wname, tname) == task.workdir.
"""
if dirname is None: dirname = os.getcwd()
dirname = os.path.abspath(dirname)
if os.path.exists(os.path.join(dirname, flowtk.Flow.PICKLE_FNAME)):
return dirname, None, None
# Handle works or tasks.
head = dirname
wname, tname = None, None
for i in range(2):
head, tail = os.path.split(head)
if i == 0: tail_1 = tail
if os.path.exists(os.path.join(head, flowtk.Flow.PICKLE_FNAME)):
if i == 0:
# We have a work: /root/flow_dir/w[num]
wname = tail
if i == 1:
# We have a task: /root/flow_dir/w[num]/t[num]
wname = tail
tname = tail_1
options.workdir = os.path.basename(sys.argv[0]).replace(".py", "").replace("run_", "flow_")
# Initialize structure and pseudos
structure = abilab.Structure.from_file(abidata.cif_file("si.cif"))
pseudos = abidata.pseudos("14si.pspnc")
# Build input for GS calculation.
gsinp = abilab.AbinitInput(structure, pseudos)
gsinp.set_vars(ecut=4, nband=4, toldff=1.e-6)
# This gives ngkpt = 4x4x4 with 4 shifts for the initial unit cell.
# The k-point sampling will be rescaled when we build the supercell in PhonopyWork.
gsinp.set_autokmesh(nksmall=4)
#gsinp.set_vars(ngkpt=[4, 4, 4])
flow = flowtk.Flow(workdir=options.workdir)
# Use a 2x2x2 supercell to compute phonons with phonopy
work = PhonopyWork.from_gs_input(gsinp, scdims=[2, 2, 2])
flow.register_work(work)
return flow
def build_flow(options):
# Set 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 input (without SOC)
scf_input = make_scf_input(nspinor=1, usepaw=1)
# Build the flow.
from abipy.flowtk.effmass_works import EffMassDFPTWork, EffMassAutoDFPTWork
flow = flowtk.Flow(workdir=options.workdir, manager=options.manager)
# Compute effective masses for each k in k0_list.
# effmass_bands_f90 defines the band range for each k in k0_list
# Here we are interested in the effective masses at the Gamma point for the valence bands
effmass_bands_f90 = [1, 4] if scf_input["nspinor"] == 1 else [1, 8]
work = EffMassDFPTWork.from_scf_input(scf_input, k0_list=(0, 0, 0), effmass_bands_f90=effmass_bands_f90)
flow.register_work(work)
# or use this Work to detect band edges automatically but increase ndivsm and decrease tolwfr!
work = EffMassAutoDFPTWork.from_scf_input(scf_input, ndivsm=5, tolwfr=1e-12)
flow.register_work(work)
return flow
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_")
flow = flowtk.Flow(options.workdir, manager=options.manager)
pseudos = abidata.pseudos("14si.pspnc")
# Get the unperturbed structure.
base_structure = abidata.structure_from_ucell("Si")
etas = [-.001, 0, +.001]
ph_displ = np.reshape(np.zeros(3*len(base_structure)), (-1,3))
ph_displ[0,:] = [+1, 0, 0]
ph_displ[1,:] = [-1, 0, 0]
# Build new structures by displacing atoms according to the phonon displacement
# ph_displ (in cartesian coordinates). The Displacement is normalized so that
# the maximum atomic diplacement is 1 Angstrom and then multiplied by eta.
modifier = abilab.StructureModifier(base_structure)
toldff=1e-6,
tolmxf=1e-5,
ntime=100,
)
# K-points sampling
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]
]
relax_inp.set_kmesh(ngkpt=[4, 4, 4], shiftk=shiftk)
# Initialize the flow
flow = flowtk.Flow(options.workdir, manager=options.manager)
# Register the task.
flow.register_relax_task(relax_inp)
return flow
options.workdir = os.path.basename(__file__).replace(".py", "").replace("run_", "flow_")
# Initialize structure and pseudos
structure = abilab.Structure.from_file(abidata.cif_file("si.cif"))
pseudos = abidata.pseudos("14si.pspnc")
# Build input for GS calculation.
gsinp = abilab.AbinitInput(structure, pseudos)
gsinp.set_vars(ecut=4, nband=4, toldff=1.e-6)
# This gives ngkpt = 4x4x4 with 4 shifts for the initial unit cell.
# The k-point sampling will be rescaled when we build the supercell in PhonopyWork.
gsinp.set_autokmesh(nksmall=4)
#gsinp.set_vars(ngkpt=[4, 4, 4])
flow = flowtk.Flow(workdir=options.workdir)
# Use a 2x2x2 supercell to compute phonons with phonopy
work = PhonopyWork.from_gs_input(gsinp, scdims=[2, 2, 2])
flow.register_work(work)
return flow
# Initialize pseudos and Structure.
pseudos = abidata.pseudos("14si.pspnc")
structure = abilab.Structure.from_file(abidata.cif_file("si.cif"))
kppa = scf_kppa = 1
nscf_nband = 6
nscf_ngkpt = [4, 4, 4]
nscf_shiftk = [0.1, 0.2, 0.3]
bs_loband = 2
bs_nband = nscf_nband
mbpt_sciss = 0.7 * abilab.units.eV_to_Ha
mdf_epsinf = 12
ecuteps = 2
ecut = 12
flow = flowtk.Flow(workdir=options.workdir, manager=options.manager)
# BSE calculation with model dielectric function.
multi = abilab.bse_with_mdf_inputs(
structure, pseudos,
scf_kppa, nscf_nband, nscf_ngkpt, nscf_shiftk,
ecuteps, bs_loband, bs_nband, mbpt_sciss, mdf_epsinf,
ecut=ecut,# pawecutdg=None,
exc_type="TDA", bs_algo="haydock", accuracy="normal", spin_mode="unpolarized",
smearing=None)
#smearing="fermi_dirac:0.1 eV", charge=0.0, scf_algorithm=None)
work = flowtk.BseMdfWork(scf_input=multi[0], nscf_input=multi[1], bse_inputs=multi[2:])
flow.register_work(work)
return flow
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_")
flow = flowtk.Flow(options.workdir, manager=options.manager)
# Create the work for the band structure calculation.
structure = abidata.structure_from_ucell("NiO")
pseudos = abidata.pseudos("28ni.paw", "8o.2.paw")
# The code below set up the parameters for the LDA+U calculation in NiO.
#usepawu 1
#lpawu 2 -1
#upawu 8.0 0.0 eV
#jpawu 0.8 0.0 eV
usepawu = 1
u_values = [5.0, 8.0]
for u in u_values:
# Apply U-J on Ni only.
luj_params = LdauParams(usepawu, structure)
[0.0, 0.5, 0.0],
[0.0, 0.0, 0.5]]
# Global variables.
multi.set_vars(ecut=2, paral_kgb=paral_kgb)
# Dataset 1 (GS run)
multi[0].set_vars(tolvrs=1e-8, nband=4)
multi[0].set_kmesh(ngkpt=[4, 4, 4], shiftk=shiftk)
# NSCF run on k-path with large number of bands
multi[1].set_vars(iscf=-2, nband=20, tolwfr=1.e-9)
multi[1].set_kpath(ndivsm=10)
# Initialize the flow.
flow = flowtk.Flow(workdir, manager=options.manager, remove=options.remove)
# GS to get the density + NSCF along the path.
scf_inp, nscf_inp = multi.split_datasets()
bands_work = flowtk.BandStructureWork(scf_inp, nscf_inp)
flow.register_work(bands_work)
# Build OpticInput used to compute optical properties.
optic_input = abilab.OpticInput(
broadening=0.002, # Value of the smearing factor, in Hartree
domega=0.0003, # Frequency mesh.
maxomega=0.3,
scissor=0.000, # Scissor shift if needed, in Hartree
tolerance=0.002, # Tolerance on closeness of singularities (in Hartree)
num_lin_comp=2, # Number of components of linear optic tensor to be computed
lin_comp=(11, 33), # Linear coefficients to be computed (x=1, y=2, z=3)
num_nonlin_comp=2, # Number of components of nonlinear optic tensor to be computed