dockonsurf / modules / refinement.py @ e1c5f171
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.') |