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

dockonsurf / modules / calculation.py @ 695dcff8

Historique | Voir | Annoter | Télécharger (5,02 ko)

1 3d6a9d3c Carles
import os
2 3d6a9d3c Carles
import logging
3 3d6a9d3c Carles
4 3d6a9d3c Carles
logger = logging.getLogger('DockOnSurf')
5 3d6a9d3c Carles
6 3d6a9d3c Carles
7 f8c4eafe Carles
def prep_cp2k(inp_file, run_type, atms_list):  # TODO name to PROJECT_NAME
8 f3004731 Carles
    """Prepares the directories to run isolated calculation with CP2K.
9 3d6a9d3c Carles

10 f3004731 Carles
    @param inp_file: CP2K Input file to run the calculations with.
11 f3004731 Carles
    @param run_type: Type of calculation. 'isolated', 'screening' or
12 f3004731 Carles
        'refinement'
13 f3004731 Carles
    @param atms_list: list of ase.Atoms objects to run the calculation of.
14 f3004731 Carles
    @return: None
15 f3004731 Carles
    """
16 f3004731 Carles
    from shutil import copy
17 f3004731 Carles
    import ase.io
18 f3004731 Carles
    from pycp2k import CP2K
19 af3e2441 Carles Marti
    from modules.utilities import check_bak
20 f3004731 Carles
    cp2k = CP2K()
21 f3004731 Carles
    cp2k.parse(inp_file)
22 f3004731 Carles
    force_eval = cp2k.CP2K_INPUT.FORCE_EVAL_list[0]
23 b05058e1 Carles
    if force_eval.SUBSYS.TOPOLOGY.Coord_file_name is None:
24 2dfa562f Carles Martí
        logger.warning("'COORD_FILE_NAME' not specified on CP2K input. Using\n"
25 2dfa562f Carles Martí
                       "default name 'coord.xyz'. A new CP2K input file with "
26 2dfa562f Carles Martí
                       "the 'COORD_FILE_NAME' variable is created. If there\n"
27 695dcff8 Carles Marti
                       "is a name conflict the old file will be backed up.")
28 b05058e1 Carles
        force_eval.SUBSYS.TOPOLOGY.Coord_file_name = 'coord.xyz'
29 2dfa562f Carles Martí
        print(inp_file.split('/')[-1])
30 2dfa562f Carles Martí
        check_bak(inp_file.split('/')[-1])
31 2dfa562f Carles Martí
        cp2k.write_input_file(inp_file.split('/')[-1])
32 b05058e1 Carles
33 f3004731 Carles
    coord_file = force_eval.SUBSYS.TOPOLOGY.Coord_file_name
34 f3004731 Carles
35 99afde40 Carles
    # Creating and setting up directories for every configuration.
36 f3004731 Carles
    for i, conf in enumerate(atms_list):
37 f3004731 Carles
        os.mkdir(f'{run_type}/conf_{i}')
38 f3004731 Carles
        copy(inp_file, f'{run_type}/conf_{i}/')
39 f3004731 Carles
        ase.io.write(f'{run_type}/conf_{i}/{coord_file}', conf)
40 f3004731 Carles
41 f3004731 Carles
42 670284be Carles
def get_jobs_status_sge(job_ids):  # TODO more elegant
43 670284be Carles
    """Returns a list of job status for a list of job ids.
44 99afde40 Carles

45 670284be Carles
    @param job_ids: list of all jobs to be checked their status.
46 670284be Carles
    @return: list of status for every job.
47 99afde40 Carles
    """
48 99afde40 Carles
    from gridtk.tools import qstat
49 670284be Carles
    run_chk = 'usage         1'
50 670284be Carles
    status_list = []
51 670284be Carles
    for job in job_ids:
52 670284be Carles
        if run_chk in qstat(job):
53 670284be Carles
            status_list.append('r')
54 670284be Carles
        elif len(qstat(job)) > 0:
55 670284be Carles
            status_list.append('q')
56 670284be Carles
        else:
57 670284be Carles
            status_list.append('f')
58 670284be Carles
    return status_list
59 99afde40 Carles
60 99afde40 Carles
61 12001182 Carles
def sub_sge(run_type, sub_script, max_qw, name):
62 12001182 Carles
    """Submits jobs to the sge queuing system with the provided script
63 99afde40 Carles

64 12001182 Carles
    @param run_type: Type of calculation. 'isolated', 'screening', 'refinement'
65 99afde40 Carles
    @param sub_script: script for the job submission.
66 99afde40 Carles
    @param max_qw: Maximum number of simultaneous jobs waiting to be executed.
67 99afde40 Carles
    @param name: name of the project
68 99afde40 Carles
    """
69 99afde40 Carles
    from shutil import copy
70 99afde40 Carles
    from time import sleep
71 12001182 Carles
    from gridtk.tools import qsub  # TODO CHANGE TO DRMAA
72 99afde40 Carles
    subm_jobs = []
73 12001182 Carles
    init_dir = os.getcwd()
74 12001182 Carles
    for conf in os.listdir(run_type):
75 12001182 Carles
        i = conf.split('_')[1]
76 12001182 Carles
        while get_jobs_status_sge(subm_jobs).count('q') >= max_qw:
77 12001182 Carles
            sleep(30)
78 12001182 Carles
        copy(sub_script, f"{run_type}/{conf}")
79 12001182 Carles
        os.chdir(f"{run_type}/{conf}")
80 12001182 Carles
        job_name = f'{name[:6].capitalize()}{run_type[:3].capitalize()}{i}'
81 12001182 Carles
        subm_jobs.append(qsub(sub_script, name=job_name))
82 12001182 Carles
        os.chdir(init_dir)
83 99afde40 Carles
84 695dcff8 Carles Marti
    logger.info('All jobs have been submitted, waiting them to finish.')
85 3f330154 Carles Marti
    while not all([stat == 'f' for stat in get_jobs_status_sge(subm_jobs)]):
86 3f330154 Carles Marti
        sleep(30)
87 695dcff8 Carles Marti
    logger.info('All jobs have finished.')
88 426c4e60 Carles
89 99afde40 Carles
90 12001182 Carles
def sub_lsf(run_type, sub_script, max_qw, name):
91 12001182 Carles
    pass
92 12001182 Carles
93 12001182 Carles
94 f3004731 Carles
def run_calc(run_type, inp_vars, atms_list):
95 3d6a9d3c Carles
    """Directs the calculation run according to the provided arguments.
96 3d6a9d3c Carles

97 f3004731 Carles
    @param run_type: Type of calculation. 'isolated', 'screening' or
98 f3004731 Carles
    'refinement'
99 3d6a9d3c Carles
    @param inp_vars: Calculation parameters from input file.
100 f3004731 Carles
    @param atms_list: List of ase.Atoms objects containing the sets of atoms
101 f3004731 Carles
    aimed to run the calculations of.
102 3d6a9d3c Carles
    """
103 821dca42 Carles Marti
    from modules.utilities import check_bak
104 3d6a9d3c Carles
    run_types = ['isolated', 'screening', 'refinement']
105 bd573212 Carles
    run_type_err = f"'run_type' must be one of the following: {run_types}"
106 3d6a9d3c Carles
    if not isinstance(run_type, str) or run_type.lower() not in run_types:
107 3d6a9d3c Carles
        logger.error(run_type_err)
108 3d6a9d3c Carles
        raise ValueError(run_type_err)
109 3d6a9d3c Carles
110 821dca42 Carles Marti
    if inp_vars['batch_q_sys']:
111 821dca42 Carles Marti
        logger.info(f"Running {run_type} calculation with {inp_vars['code']} on"
112 695dcff8 Carles Marti
                    f" {inp_vars['batch_q_sys']}.")
113 821dca42 Carles Marti
    else:
114 695dcff8 Carles Marti
        logger.info(f"Doing a dry run of {run_type}.")
115 c3cb279a Carles
    check_bak(run_type)
116 c3cb279a Carles
    os.mkdir(run_type)
117 1b54d787 Carles Marti
    if inp_vars['code'] == 'cp2k':
118 821dca42 Carles Marti
        if run_type == 'isolated':
119 821dca42 Carles Marti
            prep_cp2k(inp_vars['isol_inp_file'], run_type, atms_list)
120 821dca42 Carles Marti
        elif run_type == 'screening':
121 821dca42 Carles Marti
            prep_cp2k(inp_vars['screen_inp_file'], run_type, atms_list)
122 a5f73b4c Carles
    # elif: inp_vars['code'] == 'Other codes here'
123 99afde40 Carles
124 12001182 Carles
    if inp_vars['batch_q_sys'] == 'sge':
125 12001182 Carles
        sub_sge(run_type, inp_vars['subm_script'], inp_vars['max_qw'],
126 12001182 Carles
                inp_vars['project_name'])
127 f8c4eafe Carles
    elif inp_vars['batch_q_sys'] == 'lsf':  # TODO implement lsf
128 12001182 Carles
        sub_lsf(run_type, inp_vars['subm_script'], inp_vars['max_qw'],
129 12001182 Carles
                inp_vars['project_name'])
130 0db30d07 Carles
    elif inp_vars['batch_q_sys'] == 'local':  # TODO implement local
131 f8c4eafe Carles
        pass  # run_local
132 0db30d07 Carles
    elif inp_vars['batch_q_sys'] == 'none':
133 0db30d07 Carles
        pass