Statistiques
| Branche: | Tag: | Révision :

dockonsurf / modules / refinement.py @ 1e9e784d

Historique | Voir | Annoter | Télécharger (3,2 ko)

1 86cf3a38 Carles Marti
import logging
2 86cf3a38 Carles Marti
3 86cf3a38 Carles Marti
logger = logging.getLogger('DockOnSurf')
4 86cf3a38 Carles Marti
5 86cf3a38 Carles Marti
6 1e9e784d Carles Marti
def select_confs(orig_conf_list, calc_dirs, energy_cutoff, code):
7 86cf3a38 Carles Marti
    """From a list of atomic configurations selects the most stable ones.
8 86cf3a38 Carles Marti

9 86cf3a38 Carles Marti
    Given a list of ase.Atoms configurations and an energy cutoff, selects all
10 1e9e784d Carles Marti
    the structures that have an energy lower than, the energy of the most stable
11 1e9e784d Carles Marti
    conformer plus the cutoff.
12 1e9e784d Carles Marti

13 1e9e784d Carles Marti
    @param orig_conf_list: List of ase.Atoms objects of the conformers
14 1e9e784d Carles Marti
    @param calc_dirs: List of the directories of the finished calculations
15 86cf3a38 Carles Marti
    @param energy_cutoff: The maximum energy above the most stable configuration
16 86cf3a38 Carles Marti
    @param code: the code used to carry out the screening of structures.
17 86cf3a38 Carles Marti
    @return: list of the the most stable configurations within the energy cutoff
18 86cf3a38 Carles Marti
    """
19 86cf3a38 Carles Marti
    from copy import deepcopy
20 fd2384fc Carles Marti
    from modules.formats import collect_energies
21 86cf3a38 Carles Marti
22 86cf3a38 Carles Marti
    conf_list = deepcopy(orig_conf_list)
23 86cf3a38 Carles Marti
    selected_ids = []
24 1e9e784d Carles Marti
    conf_enrgs = collect_energies(calc_dirs, code, 'screening')
25 86cf3a38 Carles Marti
26 86cf3a38 Carles Marti
    for i, conf in enumerate(conf_list):
27 86cf3a38 Carles Marti
        conf.info['energy'] = conf_enrgs[i]
28 86cf3a38 Carles Marti
29 86cf3a38 Carles Marti
    sorted_list = sorted(conf_list, key=lambda conf: conf.info['energy'])
30 86cf3a38 Carles Marti
    lowest_e = sorted_list[0].info['energy']
31 86cf3a38 Carles Marti
    return [conf for conf in sorted_list
32 86cf3a38 Carles Marti
            if conf.info['energy'] < lowest_e + energy_cutoff]
33 86cf3a38 Carles Marti
34 86cf3a38 Carles Marti
35 4614bb6a Carles
def run_refinement(inp_vars):
36 86cf3a38 Carles Marti
    """Carries out the refinement of adsorbate-slab structures after screening.
37 86cf3a38 Carles Marti

38 86cf3a38 Carles Marti
    @param inp_vars: Calculation parameters from input file.
39 86cf3a38 Carles Marti
    """
40 86cf3a38 Carles Marti
    import os
41 fd2384fc Carles Marti
    from modules.formats import collect_coords
42 cf8fe0e3 Carles Marti
    from modules.calculation import run_calc, check_finished_calcs
43 86cf3a38 Carles Marti
    if not os.path.isdir("screening"):
44 86cf3a38 Carles Marti
        err = "'screening' directory not found. It is needed in order to carry "
45 86cf3a38 Carles Marti
        "out the refinement of structures to be adsorbed"
46 86cf3a38 Carles Marti
        logger.error(err)
47 cf8fe0e3 Carles Marti
        raise FileNotFoundError(err)
48 86cf3a38 Carles Marti
49 14f39d2a Carles Marti
    logger.info('Carrying out procedures for the refinement of '
50 14f39d2a Carles Marti
                'adsorbate-surface structures.')
51 cf8fe0e3 Carles Marti
52 cf8fe0e3 Carles Marti
    finished_calcs, unfinished_calcs = check_finished_calcs('screening',
53 cf8fe0e3 Carles Marti
                                                            inp_vars['code'])
54 cf8fe0e3 Carles Marti
    if len(unfinished_calcs) == 0:
55 cf8fe0e3 Carles Marti
        logger.info(f"Found {len(finished_calcs)} structures of "
56 cf8fe0e3 Carles Marti
                    f"adsorbate-surface atomic configurations.")
57 cf8fe0e3 Carles Marti
    else:
58 cf8fe0e3 Carles Marti
        logger.info(f"Found {len(finished_calcs)} structures of "
59 cf8fe0e3 Carles Marti
                    f"adsorbate-surface atomic configurations whose calculation"
60 cf8fe0e3 Carles Marti
                    f" finished normally.")
61 cf8fe0e3 Carles Marti
        logger.warning(f"Found {len(unfinished_calcs)} calculations more that "
62 cf8fe0e3 Carles Marti
                       f"did not finish normally: {unfinished_calcs}. Using "
63 cf8fe0e3 Carles Marti
                       f"only the {len(finished_calcs)} ones who finished "
64 cf8fe0e3 Carles Marti
                       f"normally")
65 cf8fe0e3 Carles Marti
66 fd2384fc Carles Marti
    conf_list = collect_coords(inp_vars['code'], 'screening', 'ase',
67 fd2384fc Carles Marti
                               inp_vars['special_atoms'])
68 86cf3a38 Carles Marti
    logger.info(f"Found {len(conf_list)} structures on screening directory.")
69 1e9e784d Carles Marti
    selected_confs = select_confs(conf_list, finished_calcs,
70 1e9e784d Carles Marti
                                  inp_vars['energy_cutoff'], inp_vars['code'])
71 86cf3a38 Carles Marti
    run_calc('refinement', inp_vars, selected_confs)
72 14f39d2a Carles Marti
    logger.info('Finished the procedures for the refinement of '
73 14f39d2a Carles Marti
                'adsorbate-surface structures section.')