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}") |