def register_task(self, input, deps=None, manager=None, task_class=None): """ Utility function that generates a `Workflow` made of a single task Args: input: Abinit Input file or `Strategy` object of `Task` object. deps: List of `Dependency` objects specifying the dependency of this node. An empy list of deps implies that this node has no dependencies. manager: The `TaskManager` responsible for the submission of the task. If manager is None, we use the `TaskManager` specified during the creation of the workflow. task_class: Task subclass to instantiate. Default: `AbinitTask` Returns: The generated `Task`. """ work = Workflow(manager=manager) task = work.register(input, deps=deps, task_class=task_class) self.register_work(work) return task
def phonon_flow(workdir, manager, scf_input, ph_inputs): """ Build an `AbinitFlow` for phonon calculations. Args: workdir: Working directory. manager: `TaskManager` used to submit the jobs scf_input: Input for the GS SCF run. ph_inputs: List of Inputs for the phonon runs. Returns: `AbinitFlow` """ natom = len(scf_input.structure) # Create the container that will manage the different workflows. flow = AbinitFlow(workdir, manager) # Register the first workflow (GS calculation) scf_task = flow.register_task(scf_input, task_class=ScfTask) # Build a temporary workflow with a shell manager just to run # ABINIT to get the list of irreducible pertubations for this q-point. shell_manager = manager.to_shell_manager(mpi_ncpus=1) if not isinstance(ph_inputs, (list, tuple)): ph_inputs = [ph_inputs] for i, ph_input in enumerate(ph_inputs): fake_input = ph_input.deepcopy() # Run abinit on the front-end to get the list of irreducible pertubations. tmp_dir = os.path.join(workdir, "__ph_run" + str(i) + "__") w = Workflow(workdir=tmp_dir, manager=shell_manager) fake_task = w.register(fake_input) # Use the magic value paral_rf = -1 # to get the list of irreducible perturbations for this q-point. vars = dict(paral_rf=-1, rfatpol=[1, natom], # Set of atoms to displace. rfdir=[1, 1, 1], # Along this set of reduced coordinate axis. ) fake_task.strategy.add_extra_abivars(vars) w.start(wait=True) # Parse the file to get the perturbations. irred_perts = yaml_read_irred_perts(fake_task.log_file.path) print(irred_perts) w.rmtree() # Now we can build the final list of workflows: # One workflow per q-point, each workflow computes all # the irreducible perturbations for a singe q-point. work_qpt = PhononWorkflow() for irred_pert in irred_perts: print(irred_pert) new_input = ph_input.deepcopy() #rfatpol 1 1 # Only the first atom is displaced #rfdir 1 0 0 # Along the first reduced coordinate axis qpt = irred_pert["qpt"] idir = irred_pert["idir"] ipert = irred_pert["ipert"] # TODO this will work for phonons, but not for the other types of perturbations. rfdir = 3 * [0] rfdir[idir -1] = 1 rfatpol = [ipert, ipert] new_input.set_variables( #rfpert=1, qpt=qpt, rfdir=rfdir, rfatpol=rfatpol, ) work_qpt.register(new_input, deps={scf_task: "WFK"}, task_class=PhononTask) flow.register_work(work_qpt) return flow.allocate()
kpt = numpy.array(kpts), tolvrs = 0, tolwfr = 1.e-15, )) return inp flow = AbinitFlow(manager = manager, workdir = workdir) tasks = 9*[{}] for i,(Z,phase) in enumerate(itertools.product(['N','P','Si'],['alpha','beta','gamma'])): structure_opt = HalfHeusler(['Li','Mn',Z], phase, acell_opt[Z][phase]) structure_hm = HalfHeusler(['Li','Mn',Z], phase, acell_hm[Z][phase] ) inp_opt = get_input(structure_opt) inp_hm = get_input(structure_hm) work_Z = Workflow() scf_opt_task = work_Z.register(inp_opt, manager = manager, task_class=ScfTask) scf_hm_task = work_Z.register(inp_hm , manager = manager, task_class=ScfTask) flow.register_work(work_Z) tasks[i] = { "opt": { "input" : inp_opt, "task": scf_opt_task, }, "hm" : { "input" : inp_hm, "task": scf_hm_task, } } for i,(Z,phase) in enumerate(itertools.product(['N','P','Si'],['alpha','beta','gamma'])):
istart = izero iend = izero while dos[1,istart] < 1e-5: istart = istart - 1 while dos[1,iend] < 1e-5: iend = iend + 1 if iend > istart: gapdn = x[iend]-x[istart] return (gapup,gapdn) flow = AbinitFlow(manager = manager, workdir = workdir) tasks = [] inpts = [] for Z,phase in itertools.product(['N','P','Si'],['alpha','beta','gamma']): work = Workflow() if acell_low[Z][phase] < 0.05: continue for acell in numpy.arange(acell_low[Z][phase],acell_hm[Z][phase]+0.05,0.05): structure = HalfHeusler(['Li','Mn',Z], phase, acell) inp = get_input(structure) task = work.register(inp, manager = manager, task_class=ScfTask) task._name = 'LiMn%s_%s_%f' % (Z,phase,acell) print(task._name) tasks.append(task) inpts.append(inp) flow.register_work(work) work = Workflow() for task,inp in zip(tasks,inpts): work.register(dos_input(inp), deps={task:"DEN"}, manager=manager, task_class=NscfTask)
def phonon_flow(workdir, manager, scf_input, ph_inputs): """ Build an `AbinitFlow` for phonon calculations. Args: workdir: Working directory. manager: `TaskManager` used to submit the jobs scf_input: Input for the GS SCF run. ph_inputs: List of Inputs for the phonon runs. Returns: `AbinitFlow` """ natom = len(scf_input.structure) # Create the container that will manage the different workflows. flow = AbinitFlow(workdir, manager) # Register the first workflow (GS calculation) scf_task = flow.register_task(scf_input, task_class=ScfTask) # Build a temporary workflow with a shell manager just to run # ABINIT to get the list of irreducible pertubations for this q-point. shell_manager = manager.to_shell_manager(mpi_ncpus=1) if not isinstance(ph_inputs, (list, tuple)): ph_inputs = [ph_inputs] for i, ph_input in enumerate(ph_inputs): fake_input = ph_input.deepcopy() # Run abinit on the front-end to get the list of irreducible pertubations. tmp_dir = os.path.join(workdir, "__ph_run" + str(i) + "__") w = Workflow(workdir=tmp_dir, manager=shell_manager) fake_task = w.register(fake_input) # Use the magic value paral_rf = -1 to get the list of irreducible perturbations for this q-point. vars = dict( paral_rf=-1, rfatpol=[1, natom], # Set of atoms to displace. rfdir=[1, 1, 1], # Along this set of reduced coordinate axis. ) fake_task.strategy.add_extra_abivars(vars) w.allocate() w.start(wait=True) # Parse the file to get the perturbations. irred_perts = yaml_read_irred_perts(fake_task.log_file.path) print(irred_perts) w.rmtree() # Now we can build the final list of workflows: # One workflow per q-point, each workflow computes all # the irreducible perturbations for a singe q-point. work_qpt = PhononWorkflow() for irred_pert in irred_perts: print(irred_pert) new_input = ph_input.deepcopy() #rfatpol 1 1 # Only the first atom is displaced #rfdir 1 0 0 # Along the first reduced coordinate axis qpt = irred_pert["qpt"] idir = irred_pert["idir"] ipert = irred_pert["ipert"] # TODO this will work for phonons, but not for the other types of perturbations. rfdir = 3 * [0] rfdir[idir - 1] = 1 rfatpol = [ipert, ipert] new_input.set_variables( #rfpert=1, qpt=qpt, rfdir=rfdir, rfatpol=rfatpol, ) work_qpt.register(new_input, deps={scf_task: "WFK"}, task_class=PhononTask) flow.register_work(work_qpt) return flow.allocate()