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

dockonsurf / modules / refinement.py @ 1d8c374e

Historique | Voir | Annoter | Télécharger (3,21 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 1d8c374e Carles Martí
def select_stable_confs(conf_list, energy_cutoff):
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 61f71e3c Carles Marti
    @param conf_list: List of ase.Atoms objects of the conformers
14 1d8c374e Carles Martí
    @param energy_cutoff: The maximum energy above the most stable
15 1d8c374e Carles Martí
        configuration.
16 1d8c374e Carles Martí
    @return: list of the the most stable configurations within the energy cutoff.
17 86cf3a38 Carles Marti
    """
18 86cf3a38 Carles Marti
    sorted_list = sorted(conf_list, key=lambda conf: conf.info['energy'])
19 86cf3a38 Carles Marti
    lowest_e = sorted_list[0].info['energy']
20 86cf3a38 Carles Marti
    return [conf for conf in sorted_list
21 61f71e3c Carles Marti
            if conf.info['energy'] <= lowest_e + energy_cutoff]
22 86cf3a38 Carles Marti
23 86cf3a38 Carles Marti
24 4614bb6a Carles
def run_refinement(inp_vars):
25 86cf3a38 Carles Marti
    """Carries out the refinement of adsorbate-slab structures after screening.
26 86cf3a38 Carles Marti

27 86cf3a38 Carles Marti
    @param inp_vars: Calculation parameters from input file.
28 86cf3a38 Carles Marti
    """
29 86cf3a38 Carles Marti
    import os
30 1d8c374e Carles Martí
    from modules.formats import collect_confs
31 cf8fe0e3 Carles Marti
    from modules.calculation import run_calc, check_finished_calcs
32 1a1164e0 Carles Marti
33 1a1164e0 Carles Marti
    logger.info('Carrying out procedures for the refinement of '
34 1a1164e0 Carles Marti
                'adsorbate-surface structures.')
35 1a1164e0 Carles Marti
36 86cf3a38 Carles Marti
    if not os.path.isdir("screening"):
37 86cf3a38 Carles Marti
        err = "'screening' directory not found. It is needed in order to carry "
38 86cf3a38 Carles Marti
        "out the refinement of structures to be adsorbed"
39 86cf3a38 Carles Marti
        logger.error(err)
40 cf8fe0e3 Carles Marti
        raise FileNotFoundError(err)
41 86cf3a38 Carles Marti
42 1d8c374e Carles Martí
    finished_calcs, failed_calcs = check_finished_calcs('screening',
43 1d8c374e Carles Martí
                                                        inp_vars['code'])
44 0558b8f3 Carles Marti
    if not finished_calcs:
45 0558b8f3 Carles Marti
        err_msg = "No calculations on 'screening' finished normally."
46 0558b8f3 Carles Marti
        logger.error(err_msg)
47 0558b8f3 Carles Marti
        raise FileNotFoundError(err_msg)
48 1a1164e0 Carles Marti
    logger.info(f"Found {len(finished_calcs)} structures of "
49 1a1164e0 Carles Marti
                f"adsorbate-surface atomic configurations whose calculation"
50 1a1164e0 Carles Marti
                f" finished normally.")
51 1d8c374e Carles Martí
    if len(failed_calcs) != 0:
52 1d8c374e Carles Martí
        logger.warning(f"Found {len(failed_calcs)} calculations more that "
53 1d8c374e Carles Martí
                       f"did not finish normally: {failed_calcs}. \n"
54 1a1164e0 Carles Marti
                       f"Using only the ones that finished normally: "
55 1a1164e0 Carles Marti
                       f"{finished_calcs}.")
56 cf8fe0e3 Carles Marti
57 1d8c374e Carles Martí
    conf_list = collect_confs(finished_calcs, inp_vars['code'], 'screening',
58 1d8c374e Carles Martí
                              inp_vars['special_atoms'])
59 1d8c374e Carles Martí
    selected_confs = select_stable_confs(conf_list, inp_vars['energy_cutoff'])
60 d8110aeb Carles Marti
    logger.info(f"Selected {len(selected_confs)} structures to carry out the"
61 18970efd Carles Marti
                f" refinement")
62 61c578d1 Carles Marti
    run_calc('refinement', inp_vars, selected_confs)
63 1d8c374e Carles Martí
    finished_calcs, failed_calcs = check_finished_calcs('refinement',
64 1d8c374e Carles Martí
                                                        inp_vars['code'])
65 1d8c374e Carles Martí
    conf_list = collect_confs(finished_calcs, inp_vars['code'], 'refinement',
66 1d8c374e Carles Martí
                              inp_vars['special_atoms'])
67 1d8c374e Carles Martí
    most_stable_conf = select_stable_confs(conf_list, 0)[0]
68 1d8c374e Carles Martí
    logger.info("Finished the procedures for the refinement of "
69 1d8c374e Carles Martí
                "adsorbate-surface structures section. Most stable structure "
70 1d8c374e Carles Martí
                f"is {most_stable_conf.info['id']} with a Total energy of "
71 1d8c374e Carles Martí
                f"{most_stable_conf.info['energy']} eV.")