def make_eos_flow(structure_file=None): """ Build and return a Flow to compute the equation of state of an isotropic material for different k-point samplings. """ scale_volumes = np.arange(94, 108, 2) / 100. if structure_file is None: structure = abilab.Structure.from_file(abidata.cif_file("si.cif")) else: structure = abilab.Structure.from_file(structure_file) multi = abilab.MultiDataset(structure=structure, pseudos=get_pseudos(structure), ndtset=len(scale_volumes)) # Global variables multi.set_vars(ecut=16, tolvrs=1e-16) multi.set_kmesh(ngkpt=[4, 4, 4], 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]]) for idt, scal_vol in enumerate(scale_volumes): new_lattice = structure.lattice.scale(structure.volume * scal_vol) new_structure = Structure(new_lattice, structure.species, structure.frac_coords) multi[idt].set_structure(new_structure) eos_flow = abilab.Flow.from_inputs("flow_si_relax", inputs=multi.split_datasets()) eos_flow.volumes = structure.volume * scale_volumes return eos_flow
def make_eos_flow(structure_file=None): """ Build and return a Flow to compute the equation of state of an isotropic material for different k-point samplings. """ scale_volumes = np.arange(94, 108, 2) / 100. if structure_file is None: structure = abilab.Structure.from_file(abidata.cif_file("si.cif")) else: structure = abilab.Structure.from_file(structure_file) multi = abilab.MultiDataset(structure=structure, pseudos=get_pseudos(structure), ndtset=len(scale_volumes)) # Global variables multi.set_vars( ecut=16, tolvrs=1e-16 ) multi.set_kmesh(ngkpt=[4, 4, 4], 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]]) for idt, scal_vol in enumerate(scale_volumes): new_lattice = structure.lattice.scale(structure.volume*scal_vol) new_structure = Structure(new_lattice, structure.species, structure.frac_coords) multi[idt].set_structure(new_structure) eos_flow = abilab.Flow.from_inputs("flow_si_relax", inputs=multi.split_datasets()) eos_flow.volumes = structure.volume * scale_volumes return eos_flow
def make_relax_flow(structure_file=None): """ Build and return a flow that perform a structural relaxation for different k-point samplings. """ ngkpt_list = [[3, 3, 2], [6, 6, 4], [8, 8, 6]] if structure_file is None: structure = abilab.Structure.from_file(abidata.cif_file("gan2.cif")) else: structure = abilab.Structure.from_file(structure_file) multi = abilab.MultiDataset(structure=structure, pseudos=get_pseudos(structure), ndtset=len(ngkpt_list)) # Add mnemonics to input file. multi.set_mnemonics(True) # Global variables multi.set_vars( ecut=20, tolrff=5.0e-2, nstep=30, optcell=2, ionmov=3, ntime=50, dilatmx=1.05, ecutsm=0.5, tolmxf=5.0e-5, ) for i, ngkpt in enumerate(ngkpt_list): multi[i].set_kmesh(ngkpt=ngkpt, shiftk=[0, 0, 0]) return abilab.Flow.from_inputs("flow_gan_relax", inputs=multi.split_datasets(), task_class=abilab.RelaxTask)
def make_ngkpt_flow(ngkpt_list=[(2, 2, 2), (4, 4, 4), (6, 6, 6), (8, 8, 8)], structure_file=None, metal=False): """ A `factory function` (a function that returns an instance of the class defined above. If no specific system is specified, structure_file=None, an flow for silicon in constructed and returned. """ # Defining the structure and adding the appropriate pseudo potentials if structure_file is None: multi = abilab.MultiDataset(structure=abidata.cif_file("si.cif"), pseudos=abidata.pseudos("14si.pspnc"), ndtset=len(ngkpt_list)) workdir = "flow_lesson_Si_kpoint_convergence" else: structure = abilab.Structure.from_file(structure_file) pseudos = get_pseudos(structure) multi = abilab.MultiDataset(structure, pseudos=pseudos, ndtset=len(ngkpt_list)) workdir = "flow_lesson_" + structure.composition.reduced_formula + "_kpoint_convergence" # Add mnemonics to input file. multi.set_mnemonics(True) # Global variables multi.set_vars(ecut=10, tolvrs=1e-9) if metal: multi.set_vars(occopt=7, tsmear=0.04) # Specific variables for the different calculations for i, ngkpt in enumerate(ngkpt_list): multi[i].set_kmesh(ngkpt=ngkpt, shiftk=[0, 0, 0]) return abilab.Flow.from_inputs(workdir=workdir, inputs=multi.split_datasets())
def make_ngkpt_flow(ngkpt_list=((2, 2, 2), (4, 4, 4), (6, 6, 6), (8, 8, 8)), structure_file=None, metal=False): """ A `factory function` (a function that returns an instance of the class defined above. If no specific system is specified, structure_file=None, an flow for silicon in constructed and returned. """ # Defining the structure and adding the appropriate pseudo potentials if structure_file is None: multi = abilab.MultiDataset(structure=abidata.cif_file("si.cif"), pseudos=abidata.pseudos("14si.pspnc"), ndtset=len(ngkpt_list)) workdir = "flow_lesson_Si_kpoint_convergence" else: structure = abilab.Structure.from_file(structure_file) pseudos = get_pseudos(structure) multi = abilab.MultiDataset(structure, pseudos=pseudos, ndtset=len(ngkpt_list)) workdir = "flow_lesson_" + structure.composition.reduced_formula + "_kpoint_convergence" # Add mnemonics to input file. multi.set_mnemonics(True) # Global variables multi.set_vars(ecut=10, tolvrs=1e-9) if metal: multi.set_vars(occopt=7, tsmear=0.04) # Specific variables for the different calculations for i, ngkpt in enumerate(ngkpt_list): multi[i].set_kmesh(ngkpt=ngkpt, shiftk=[0, 0, 0]) return flowtk.Flow.from_inputs(workdir=workdir, inputs=multi.split_datasets())