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

dockonsurf / modules / refinement.py @ 19567be2

Historique | Voir | Annoter | Télécharger (3,84 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 de04dab9 Carles Martí
    import numpy as np
31 1d8c374e Carles Martí
    from modules.formats import collect_confs
32 cf8fe0e3 Carles Marti
    from modules.calculation import run_calc, check_finished_calcs
33 1a1164e0 Carles Marti
34 1a1164e0 Carles Marti
    logger.info('Carrying out procedures for the refinement of '
35 1a1164e0 Carles Marti
                'adsorbate-surface structures.')
36 1a1164e0 Carles Marti
37 86cf3a38 Carles Marti
    if not os.path.isdir("screening"):
38 86cf3a38 Carles Marti
        err = "'screening' directory not found. It is needed in order to carry "
39 86cf3a38 Carles Marti
        "out the refinement of structures to be adsorbed"
40 86cf3a38 Carles Marti
        logger.error(err)
41 cf8fe0e3 Carles Marti
        raise FileNotFoundError(err)
42 86cf3a38 Carles Marti
43 1d8c374e Carles Martí
    finished_calcs, failed_calcs = check_finished_calcs('screening',
44 1d8c374e Carles Martí
                                                        inp_vars['code'])
45 0558b8f3 Carles Marti
    if not finished_calcs:
46 0558b8f3 Carles Marti
        err_msg = "No calculations on 'screening' finished normally."
47 0558b8f3 Carles Marti
        logger.error(err_msg)
48 0558b8f3 Carles Marti
        raise FileNotFoundError(err_msg)
49 1a1164e0 Carles Marti
    logger.info(f"Found {len(finished_calcs)} structures of "
50 1a1164e0 Carles Marti
                f"adsorbate-surface atomic configurations whose calculation"
51 1a1164e0 Carles Marti
                f" finished normally.")
52 1d8c374e Carles Martí
    if len(failed_calcs) != 0:
53 1d8c374e Carles Martí
        logger.warning(f"Found {len(failed_calcs)} calculations more that "
54 1d8c374e Carles Martí
                       f"did not finish normally: {failed_calcs}. \n"
55 1a1164e0 Carles Marti
                       f"Using only the ones that finished normally: "
56 1a1164e0 Carles Marti
                       f"{finished_calcs}.")
57 cf8fe0e3 Carles Marti
58 1d8c374e Carles Martí
    conf_list = collect_confs(finished_calcs, inp_vars['code'], 'screening',
59 1d8c374e Carles Martí
                              inp_vars['special_atoms'])
60 1d8c374e Carles Martí
    selected_confs = select_stable_confs(conf_list, inp_vars['energy_cutoff'])
61 d8110aeb Carles Marti
    logger.info(f"Selected {len(selected_confs)} structures to carry out the"
62 18970efd Carles Marti
                f" refinement")
63 96d422c7 Carles Martí
    run_calc('refinement', inp_vars, selected_confs)
64 1d8c374e Carles Martí
    logger.info("Finished the procedures for the refinement of "
65 de04dab9 Carles Martí
                "adsorbate-surface structures section. ")
66 96d422c7 Carles Martí
    if inp_vars["batch_q_sys"]:
67 96d422c7 Carles Martí
        finished_calcs, failed_calcs = check_finished_calcs('refinement',
68 96d422c7 Carles Martí
                                                            inp_vars['code'])
69 96d422c7 Carles Martí
        conf_list = collect_confs(finished_calcs, inp_vars['code'],
70 96d422c7 Carles Martí
                                  'refinement', inp_vars['special_atoms'])
71 96d422c7 Carles Martí
        sorted_confs = select_stable_confs(conf_list, np.inf)
72 96d422c7 Carles Martí
        logger.info(f"Most stable structure is {sorted_confs[0].info['ref']} "
73 96d422c7 Carles Martí
                    f"with a total energy of {sorted_confs[0].info['energy']} "
74 96d422c7 Carles Martí
                    f"eV.")
75 96d422c7 Carles Martí
        confs_str = "\n".join([" ".join((str(conf.info['ref']), 'E =',
76 96d422c7 Carles Martí
                                         str(conf.info['energy'] -
77 de04dab9 Carles Martí
                                         sorted_confs[0].info['energy']),
78 96d422c7 Carles Martí
                                         'eV'))
79 96d422c7 Carles Martí
                               for conf in sorted_confs])
80 96d422c7 Carles Martí
        logger.info("The relative energies, of all structures obtained at the "
81 96d422c7 Carles Martí
                    "refinement stage, respect the most stable one "
82 96d422c7 Carles Martí
                    f"({sorted_confs[0].info['ref']}) are:\n{confs_str}")