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

dockonsurf / modules / refinement.py @ b75bf97d

Historique | Voir | Annoter | Télécharger (3,44 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 1a1164e0 Carles Marti
44 1a1164e0 Carles Marti
    logger.info('Carrying out procedures for the refinement of '
45 1a1164e0 Carles Marti
                'adsorbate-surface structures.')
46 1a1164e0 Carles Marti
47 86cf3a38 Carles Marti
    if not os.path.isdir("screening"):
48 86cf3a38 Carles Marti
        err = "'screening' directory not found. It is needed in order to carry "
49 86cf3a38 Carles Marti
        "out the refinement of structures to be adsorbed"
50 86cf3a38 Carles Marti
        logger.error(err)
51 cf8fe0e3 Carles Marti
        raise FileNotFoundError(err)
52 86cf3a38 Carles Marti
53 cf8fe0e3 Carles Marti
    finished_calcs, unfinished_calcs = check_finished_calcs('screening',
54 cf8fe0e3 Carles Marti
                                                            inp_vars['code'])
55 0558b8f3 Carles Marti
    if not finished_calcs:
56 0558b8f3 Carles Marti
        err_msg = "No calculations on 'screening' finished normally."
57 0558b8f3 Carles Marti
        logger.error(err_msg)
58 0558b8f3 Carles Marti
        raise FileNotFoundError(err_msg)
59 1a1164e0 Carles Marti
    logger.info(f"Found {len(finished_calcs)} structures of "
60 1a1164e0 Carles Marti
                f"adsorbate-surface atomic configurations whose calculation"
61 1a1164e0 Carles Marti
                f" finished normally.")
62 1a1164e0 Carles Marti
    if len(unfinished_calcs) != 0:
63 cf8fe0e3 Carles Marti
        logger.warning(f"Found {len(unfinished_calcs)} calculations more that "
64 1a1164e0 Carles Marti
                       f"did not finish normally: {unfinished_calcs}. \n"
65 1a1164e0 Carles Marti
                       f"Using only the ones that finished normally: "
66 1a1164e0 Carles Marti
                       f"{finished_calcs}.")
67 cf8fe0e3 Carles Marti
68 c0b7ccd3 Carles Marti
    conf_list = collect_coords(finished_calcs, inp_vars['code'], 'screening',
69 fd2384fc Carles Marti
                               inp_vars['special_atoms'])
70 1e9e784d Carles Marti
    selected_confs = select_confs(conf_list, finished_calcs,
71 1e9e784d Carles Marti
                                  inp_vars['energy_cutoff'], inp_vars['code'])
72 d8110aeb Carles Marti
    logger.info(f"Selected {len(selected_confs)} structures to carry out the"
73 18970efd Carles Marti
                f" refinement")
74 86cf3a38 Carles Marti
    run_calc('refinement', inp_vars, selected_confs)
75 18970efd Carles Marti
    most_stable_conf = select_confs(conf_list, finished_calcs, 0,
76 18970efd Carles Marti
                                    inp_vars['code'])[0]
77 14f39d2a Carles Marti
    logger.info('Finished the procedures for the refinement of '
78 18970efd Carles Marti
                'adsorbate-surface structures section. Most stable structure '
79 18970efd Carles Marti
                f'is {most_stable_conf}')