Example #1
0
    def get_final_structure(cls, wf):
        assert wf.metadata['workflow_class'] == cls.workflow_class
        assert wf.metadata['workflow_module'] == cls.workflow_module
        step_index = -1
        final_fw_id = None
        for fw_id, fw in wf.id_fw.items():
            if 'SRC_task_index' in fw.spec:
                if fw.tasks[-1].src_type != 'run':
                    continue
                task_index = fw.spec['SRC_task_index']
                if task_index.task_type == 'MPRelaxVasp':
                    if task_index.index > step_index:
                        step_index = task_index.index
                        final_fw_id = fw_id
        if final_fw_id is None:
            raise RuntimeError('Final structure not found ...')
        myfw = wf.id_fw[final_fw_id]
        mytask = myfw.tasks[-1]
        last_launch = (myfw.archived_launches + myfw.launches)[-1]
        # myfw.tasks[-1].set_workdir(workdir=last_launch.launch_dir)
        # mytask.setup_rundir(last_launch.launch_dir, create_dirs=False)
        helper = MPRelaxTaskHelper()
        helper.set_task(mytask)
        helper.task.setup_rundir(last_launch.launch_dir)

        structure = helper.get_final_structure()

        return {'structure': structure.as_dict()}
    def get_final_structure(cls, wf):
        assert wf.metadata['workflow_class'] == cls.workflow_class
        assert wf.metadata['workflow_module'] == cls.workflow_module
        step_index = -1
        final_fw_id = None
        nrelaxations = 1
        for fw_id, fw in wf.id_fw.items():
            if 'SRC_task_index' in fw.spec:
                if fw.tasks[-1].src_type != 'run':
                    continue
                task_index = fw.spec['SRC_task_index']
                if 'MPRelaxVasp' in task_index.task_type:
                    if task_index.task_type == 'MPRelaxVasp':
                        if task_index.index > step_index:
                            step_index = task_index.index
                            final_fw_id = fw_id
                    else:
                        match = re.match("MPRelaxVasp-\d+", task_index.task_type)
                        if match and match.string == task_index.task_type:
                            nn = int(task_index.task_type[12:])
                            if nn == nrelaxations:
                                if task_index.index > step_index:
                                    step_index = task_index.index
                                    final_fw_id = fw_id
                            elif nn > nrelaxations:
                                step_index = task_index.index
                                final_fw_id = fw_id
                                nrelaxations = nn
        if final_fw_id is None:
            raise RuntimeError('Final structure not found ...')
        myfw = wf.id_fw[final_fw_id]
        mytask = myfw.tasks[-1]
        last_launch = (myfw.archived_launches + myfw.launches)[-1]
        # myfw.tasks[-1].set_workdir(workdir=last_launch.launch_dir)
        # mytask.setup_rundir(last_launch.launch_dir, create_dirs=False)
        helper = MPRelaxTaskHelper()
        helper.set_task(mytask)
        helper.task.setup_rundir(last_launch.launch_dir)

        structure = helper.get_final_structure()

        return {'structure': structure.as_dict()}
Example #3
0
    def __init__(self, vasp_input_set, spec):
        # Initializes fws list and links_dict
        fws = []
        links_dict = {}

        if 'additional_controllers' in spec:
            additional_controllers = spec['additional_controllers']
            spec.pop('additional_controllers')
        else:
            additional_controllers = [
                WalltimeController(),
                MemoryController(),
                VaspXMLValidatorController()
            ]

        control_procedure = ControlProcedure(
            controllers=additional_controllers)
        task_helper = MPRelaxTaskHelper()
        task_type = task_helper.task_type
        src_fws = createVaspSRCFireworks(vasp_input_set=vasp_input_set,
                                         task_helper=task_helper,
                                         task_type=task_type,
                                         control_procedure=control_procedure,
                                         custodian_handlers=[],
                                         max_restarts=10,
                                         src_cleaning=None,
                                         task_index=None,
                                         spec=None,
                                         setup_spec_update=None,
                                         run_spec_update=None)

        fws.extend(src_fws['fws'])
        links_dict_update(links_dict=links_dict,
                          links_update=src_fws['links_dict'])

        self.wf = Workflow(fireworks=fws,
                           links_dict=links_dict,
                           metadata={
                               'workflow_class': self.workflow_class,
                               'workflow_module': self.workflow_module
                           },
                           name='MPRelaxFWWorkflowSRC')
Example #4
0
    def __init__(self,
                 neb_vasp_input_set,
                 spec,
                 neb_terminals,
                 relax_terminals=True,
                 n_insert=1,
                 n_nebs=3,
                 relax_vasp_input_set=None,
                 initial_neb_structures=None,
                 climbing_image=True):
        user_incar_settings = {'NPAR': 4, 'ISIF': 0, 'SIGMA': 0.2, 'ISMEAR': 0}
        if n_nebs < 1:
            raise ValueError('Minimum one NEB ...')
        if relax_terminals and initial_neb_structures is not None:
            raise ValueError(
                'Cannot relax terminals and start from initial NEB structures')
        # Initializes fws list and links_dict
        fws = []
        links_dict = {}

        if 'additional_controllers' in spec:
            additional_controllers = spec['additional_controllers']
            spec.pop('additional_controllers')
        else:
            additional_controllers = [
                WalltimeController(),
                MemoryController(),
                VaspXMLValidatorController()
            ]

        # Control procedure
        control_procedure = ControlProcedure(
            controllers=additional_controllers)

        # First NEB
        gen_neb_spec = spec.copy()
        if relax_terminals:
            gen_neb_spec['terminal_start'] = None
            gen_neb_spec['terminal_end'] = None
        else:
            gen_neb_spec['terminal_start'] = neb_terminals[0]
            gen_neb_spec['terminal_end'] = neb_terminals[1]

        # gen_neb_spec['structures'] = neb_terminals
        gen_neb_spec = set_short_single_core_to_spec(gen_neb_spec)

        terminal_start_relax_task_type = 'MPRelaxVasp-start'
        terminal_end_relax_task_type = 'MPRelaxVasp-end'
        terminal_start_task_type = None
        terminal_end_task_type = None
        if relax_terminals:
            terminal_start_task_type = terminal_start_relax_task_type
            terminal_end_task_type = terminal_end_relax_task_type
        gen_neb_task = GenerateNEBRelaxationTask(
            n_insert=n_insert,
            user_incar_settings=user_incar_settings,
            climbing_image=climbing_image,
            task_index='neb1',
            terminal_start_task_type=terminal_start_task_type,
            terminal_end_task_type=terminal_end_task_type)
        gen_neb_fw = Firework([gen_neb_task],
                              spec=gen_neb_spec,
                              name='gen-neb1')
        fws.append(gen_neb_fw)

        if relax_terminals:
            # Start terminal
            relax_task_helper = MPRelaxTaskHelper()
            vis_start = relax_vasp_input_set(
                neb_terminals[0], user_incar_settings=user_incar_settings)
            start_src_fws = createVaspSRCFireworks(
                vasp_input_set=vis_start,
                task_helper=relax_task_helper,
                task_type=terminal_start_relax_task_type,
                control_procedure=control_procedure,
                custodian_handlers=[],
                max_restarts=10,
                src_cleaning=None,
                task_index=None,
                spec=None,
                setup_spec_update=None,
                run_spec_update=None)
            fws.extend(start_src_fws['fws'])
            links_dict_update(links_dict=links_dict,
                              links_update=start_src_fws['links_dict'])
            linkupdate = {start_src_fws['control_fw'].fw_id: gen_neb_fw.fw_id}
            links_dict_update(links_dict=links_dict, links_update=linkupdate)

            # End terminal

            vis_end = relax_vasp_input_set(
                neb_terminals[1], user_incar_settings=user_incar_settings)
            end_src_fws = createVaspSRCFireworks(
                vasp_input_set=vis_end,
                task_helper=relax_task_helper,
                task_type=terminal_end_relax_task_type,
                control_procedure=control_procedure,
                custodian_handlers=[],
                max_restarts=10,
                src_cleaning=None,
                task_index=None,
                spec=None,
                setup_spec_update=None,
                run_spec_update=None)
            fws.extend(end_src_fws['fws'])
            links_dict_update(links_dict=links_dict,
                              links_update=end_src_fws['links_dict'])
            linkupdate = {end_src_fws['control_fw'].fw_id: gen_neb_fw.fw_id}
            links_dict_update(links_dict=links_dict, links_update=linkupdate)

        if n_nebs > 1:
            for ineb in range(2, n_nebs + 1):
                prev_gen_neb_fw = gen_neb_fw
                gen_neb_spec = spec.copy()
                gen_neb_spec['structures'] = None
                gen_neb_spec = set_short_single_core_to_spec(gen_neb_spec)
                gen_neb_task = GenerateNEBRelaxationTask(
                    n_insert=n_insert,
                    user_incar_settings=user_incar_settings,
                    climbing_image=climbing_image,
                    task_index='neb{:d}'.format(ineb),
                    prev_neb_task_type='neb{:d}'.format(ineb - 1),
                    terminal_start_task_type=terminal_start_task_type,
                    terminal_end_task_type=terminal_end_task_type)
                gen_neb_fw = Firework([gen_neb_task],
                                      spec=gen_neb_spec,
                                      name='gen-neb{:d}'.format(ineb))
                fws.append(gen_neb_fw)
                linkupdate = {prev_gen_neb_fw.fw_id: gen_neb_fw.fw_id}
                links_dict_update(links_dict=links_dict,
                                  links_update=linkupdate)
                if relax_terminals:
                    linkupdate = {
                        start_src_fws['control_fw'].fw_id: gen_neb_fw.fw_id
                    }
                    links_dict_update(links_dict=links_dict,
                                      links_update=linkupdate)
                    linkupdate = {
                        end_src_fws['control_fw'].fw_id: gen_neb_fw.fw_id
                    }
                    links_dict_update(links_dict=links_dict,
                                      links_update=linkupdate)

        if climbing_image:
            wfname = "MPcNEBRelaxFWWorkflowSRC"
        else:
            wfname = "MPcNEBRelaxFWWorkflowSRC"
        self.wf = Workflow(fireworks=fws,
                           links_dict=links_dict,
                           metadata={
                               'workflow_class': self.workflow_class,
                               'workflow_module': self.workflow_module
                           },
                           name=wfname)
    def get_terminal_computed_entries(cls, wf):
        assert wf.metadata['workflow_class'] == cls.workflow_class
        assert wf.metadata['workflow_module'] == cls.workflow_module

        terminal_start_step_index = -1
        terminal_start_final_fw_id = None
        terminal_start_setup_step_index = -1
        terminal_start_setup_fw_id = None
        terminal_end_step_index = -1
        terminal_end_final_fw_id = None
        terminal_end_setup_step_index = -1
        terminal_end_setup_fw_id = None

        for fw_id, fw in wf.id_fw.items():
            if 'SRC_task_index' in fw.spec:
                src_type = fw.tasks[-1].src_type
                if src_type in ['run', 'setup']:
                    task_index = fw.spec['SRC_task_index']
                    if task_index.task_type == 'MPRelaxVasp-start':
                        if src_type == 'run':
                            if task_index.index > terminal_start_step_index:
                                terminal_start_step_index = task_index.index
                                terminal_start_final_fw_id = fw_id
                        elif src_type == 'setup':
                            if task_index.index > terminal_start_setup_step_index:
                                terminal_start_setup_step_index = task_index.index
                                terminal_start_setup_fw_id = fw_id
                    elif task_index.task_type == 'MPRelaxVasp-end':
                        if src_type == 'run':
                            if task_index.index > terminal_end_step_index:
                                terminal_end_step_index = task_index.index
                                terminal_end_final_fw_id = fw_id
                        elif src_type == 'setup':
                            if task_index.index > terminal_end_setup_step_index:
                                terminal_end_setup_step_index = task_index.index
                                terminal_end_setup_fw_id = fw_id
        if terminal_start_final_fw_id is None:
            raise RuntimeError('No terminal-start relaxation found ...')
        if terminal_end_final_fw_id is None:
            raise RuntimeError('No terminal-end relaxation found ...')
        # Terminal start dir
        terminal_start_fw = wf.id_fw[terminal_start_final_fw_id]
        terminal_start_last_launch = (terminal_start_fw.archived_launches + terminal_start_fw.launches)[-1]
        terminal_start_run_dir = terminal_start_last_launch.launch_dir
        # Terminal end dir
        terminal_end_fw = wf.id_fw[terminal_end_final_fw_id]
        terminal_end_last_launch = (terminal_end_fw.archived_launches + terminal_end_fw.launches)[-1]
        terminal_end_run_dir = terminal_end_last_launch.launch_dir

        helper = MPRelaxTaskHelper()

        # Get the information for the terminal start
        terminal_start_task = terminal_start_fw.tasks[-1]
        helper.set_task(terminal_start_task)
        helper.task.setup_rundir(terminal_start_run_dir)
        terminal_start_all_info = helper.get_all_info(raise_error=True)

        terminal_start_setup_fw = wf.id_fw[terminal_start_setup_fw_id]
        terminal_start_setup_task = terminal_start_setup_fw.tasks[-1]
        terminal_start_vasp_input_set = terminal_start_setup_task.vasp_input_set
        terminal_start_kpts_generation_description = get_kpoints_generation_description(terminal_start_vasp_input_set)

        terminal_start_computed_entry = terminal_start_all_info['computed_entry']
        terminal_start_vasprun = terminal_start_all_info['vasprun']
        terminal_start_calculation_parameters = {'INCAR': terminal_start_vasprun.incar,
                                                 'INCAR_ALL': terminal_start_vasprun.parameters,
                                                 'potcar_symbols': terminal_start_vasprun.potcar_symbols,
                                                 'ENCUT': terminal_start_vasprun.incar['ENCUT'] or terminal_start_vasprun.parameters['ENCUT'],
                                                 'EDIFFG': terminal_start_vasprun.incar.get('EDIFFG') or terminal_start_vasprun.parameters.get('EDIFFG'),
                                                 'ISMEAR': terminal_start_vasprun.incar.get('ISMEAR') or terminal_start_vasprun.parameters.get('ISMEAR'),
                                                 'SIGMA': terminal_start_vasprun.incar.get('SIGMA') or terminal_start_vasprun.parameters.get('SIGMA'),
                                                 'kpoints_generation_description': terminal_start_kpts_generation_description}
        if terminal_start_computed_entry.data is None:
            terminal_start_computed_entry.data = {}

        terminal_start_computed_entry.data['calculation_parameters'] = terminal_start_calculation_parameters

        # Get the information for the terminal end
        terminal_end_task = terminal_end_fw.tasks[-1]
        helper.set_task(terminal_end_task)
        helper.task.setup_rundir(terminal_end_run_dir)
        terminal_end_all_info = helper.get_all_info(raise_error=True)

        terminal_end_setup_fw = wf.id_fw[terminal_end_setup_fw_id]
        terminal_end_setup_task = terminal_end_setup_fw.tasks[-1]
        terminal_end_vasp_input_set = terminal_end_setup_task.vasp_input_set
        terminal_end_kpts_generation_description = get_kpoints_generation_description(
            terminal_end_vasp_input_set)

        terminal_end_computed_entry = terminal_end_all_info['computed_entry']
        terminal_end_vasprun = terminal_end_all_info['vasprun']
        terminal_end_calculation_parameters = {'INCAR': terminal_end_vasprun.incar,
                                               'INCAR_ALL': terminal_end_vasprun.parameters,
                                               'potcar_symbols': terminal_end_vasprun.potcar_symbols,
                                               'ENCUT': terminal_end_vasprun.incar['ENCUT'] or
                                                        terminal_end_vasprun.parameters['ENCUT'],
                                               'EDIFFG': terminal_end_vasprun.incar.get(
                                                   'EDIFFG') or terminal_end_vasprun.parameters.get('EDIFFG'),
                                               'ISMEAR': terminal_end_vasprun.incar.get(
                                                   'ISMEAR') or terminal_end_vasprun.parameters.get('ISMEAR'),
                                               'SIGMA': terminal_end_vasprun.incar.get(
                                                   'SIGMA') or terminal_end_vasprun.parameters.get('SIGMA'),
                                               'kpoints_generation_description': terminal_end_kpts_generation_description}
        if terminal_end_computed_entry.data is None:
            terminal_end_computed_entry.data = {}

        terminal_end_computed_entry.data['calculation_parameters'] = terminal_end_calculation_parameters

        return {'computed_entry_terminal_start': terminal_start_computed_entry.as_dict(),
                'computed_entry_terminal_end': terminal_end_computed_entry.as_dict()}
    def get_final_results(cls, wf):
        assert wf.metadata['workflow_class'] == cls.workflow_class
        assert wf.metadata['workflow_module'] == cls.workflow_module
        step_index = -1
        final_fw_id = None
        nrelaxations = 1
        fw_ids = {}
        final_setup_fw_id = None
        final_setup_step_index = -1
        final_setup_nrelaxations = 1
        for fw_id, fw in wf.id_fw.items():
            if 'SRC_task_index' in fw.spec:
                src_type = fw.tasks[-1].src_type
                if src_type in ['run', 'setup']:
                    task_index = fw.spec['SRC_task_index']
                    if 'MPRelaxVasp' in task_index.task_type:
                        if task_index.task_type == 'MPRelaxVasp':
                            if src_type == 'run':
                                fw_ids[(1, task_index.index)] = fw_id
                                if task_index.index > step_index:
                                    step_index = task_index.index
                                    final_fw_id = fw_id
                            elif src_type == 'setup':
                                if task_index.index > final_setup_step_index:
                                    final_setup_step_index = task_index.index
                                    final_setup_fw_id = fw_id
                        else:
                            match = re.match("MPRelaxVasp-\d+", task_index.task_type)
                            if match and match.string == task_index.task_type:
                                nn = int(task_index.task_type[12:])
                                if src_type == 'run':
                                    fw_ids[(nn, task_index.index)] = fw_id
                                    if nn == nrelaxations:
                                        if task_index.index > step_index:
                                            step_index = task_index.index
                                            final_fw_id = fw_id
                                    elif nn > nrelaxations:
                                        step_index = task_index.index
                                        final_fw_id = fw_id
                                        nrelaxations = nn
                                elif src_type == 'setup':
                                    if nn == final_setup_nrelaxations:
                                        if task_index.index > final_setup_step_index:
                                            final_setup_step_index = task_index.index
                                            final_setup_fw_id = fw_id
                                    elif nn > final_setup_nrelaxations:
                                        final_setup_step_index = task_index.index
                                        final_setup_fw_id = fw_id
                                        final_setup_nrelaxations = nn
        if final_fw_id is None:
            raise RuntimeError('Final structure not found ...')
        rlx_and_task_indices = sorted(fw_ids.keys())
        ionic_steps = []
        helper = MPRelaxTaskHelper()
        for rlx_and_task_index in rlx_and_task_indices:
            fw_id = fw_ids[rlx_and_task_index]
            myfw = wf.id_fw[fw_id]
            mytask = myfw.tasks[-1]
            last_launch = (myfw.archived_launches + myfw.launches)[-1]
            helper.set_task(mytask)
            helper.task.setup_rundir(last_launch.launch_dir)

            all_info = helper.get_all_info(raise_error=False)
            if all_info:
                task_ionic_steps = all_info['ionic_steps']
                for ionstep in task_ionic_steps:
                    ionstep.pop('structure')
                ionic_steps.append(task_ionic_steps)

        final_setup_fw = wf.id_fw[final_setup_fw_id]
        final_setup_task = final_setup_fw.tasks[-1]
        final_vasp_input_set = final_setup_task.vasp_input_set
        kpoints_generation_description = get_kpoints_generation_description(final_vasp_input_set)

        all_info_final = helper.get_all_info(raise_error=True)
        computed_entry = all_info_final['computed_entry']
        vasprun = all_info_final['vasprun']

        calculation_parameters = {'INCAR': vasprun.incar,
                                  'INCAR_ALL': vasprun.parameters,
                                  'potcar_symbols': vasprun.potcar_symbols,
                                  'ENCUT': vasprun.incar['ENCUT'] or vasprun.parameters['ENCUT'],
                                  'EDIFFG': vasprun.incar.get('EDIFFG') or vasprun.parameters.get('EDIFFG'),
                                  'ISMEAR': vasprun.incar.get('ISMEAR') or vasprun.parameters.get('ISMEAR'),
                                  'SIGMA': vasprun.incar.get('SIGMA') or vasprun.parameters.get('SIGMA'),
                                  'kpoints_generation_description': kpoints_generation_description}

        if computed_entry.data is None:
            computed_entry.data = {}

        computed_entry.data['calculation_parameters'] = calculation_parameters

        return {'computed_entry': computed_entry.as_dict(),
                'final_structure': all_info_final['final_structure'].as_dict(),
                'ionic_steps': ionic_steps}