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

dockonsurf / modules / refinement.py @ 78fcb188

Historique | Voir | Annoter | Télécharger (3,7 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 61f71e3c Carles Marti
def select_confs(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 61f71e3c Carles Marti
    @param 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 1e9e784d Carles Marti
    conf_enrgs = collect_energies(calc_dirs, code, 'screening')
23 86cf3a38 Carles Marti
24 86cf3a38 Carles Marti
    for i, conf in enumerate(conf_list):
25 86cf3a38 Carles Marti
        conf.info['energy'] = conf_enrgs[i]
26 61f71e3c Carles Marti
        conf.info['id'] = calc_dirs[i]
27 86cf3a38 Carles Marti
28 86cf3a38 Carles Marti
    sorted_list = sorted(conf_list, key=lambda conf: conf.info['energy'])
29 86cf3a38 Carles Marti
    lowest_e = sorted_list[0].info['energy']
30 86cf3a38 Carles Marti
    return [conf for conf in sorted_list
31 61f71e3c Carles Marti
            if conf.info['energy'] <= lowest_e + energy_cutoff]
32 86cf3a38 Carles Marti
33 86cf3a38 Carles Marti
34 4614bb6a Carles
def run_refinement(inp_vars):
35 86cf3a38 Carles Marti
    """Carries out the refinement of adsorbate-slab structures after screening.
36 86cf3a38 Carles Marti

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