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

dockonsurf / modules / calculation.py @ 082685ad

Historique | Voir | Annoter | Télécharger (14,97 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 f85667b9 Carles Marti
def check_finished_calcs(run_type, code):
8 dbef6e98 Carles Martí
    from modules.utilities import _human_key
9 f85667b9 Carles Marti
    """Returns two lists of calculations finished normally and abnormally.
10 f85667b9 Carles Marti

11 f85667b9 Carles Marti
    @param run_type: The type of calculation to check.
12 f85667b9 Carles Marti
    @param code: The code used for the specified job.
13 f85667b9 Carles Marti
    @return finished_calcs: List of calculations that have finished normally.
14 f85667b9 Carles Marti
    @return unfinished_calcs: List of calculations that have finished abnormally
15 f85667b9 Carles Marti
    """
16 f85667b9 Carles Marti
    from glob import glob
17 0d2f159a Carles Martí
    import ase.io
18 ffa1b366 Carles Martí
    from pycp2k import CP2K
19 f85667b9 Carles Marti
    from modules.utilities import tail
20 f85667b9 Carles Marti
21 f85667b9 Carles Marti
    finished_calcs = []
22 f85667b9 Carles Marti
    unfinished_calcs = []
23 dbef6e98 Carles Martí
    for conf in sorted(os.listdir(run_type), key=_human_key):
24 ffa1b366 Carles Martí
        conf_path = f'{run_type}/{conf}'
25 ffa1b366 Carles Martí
        if not os.path.isdir(conf_path) or 'conf_' not in conf:
26 f85667b9 Carles Marti
            continue
27 f85667b9 Carles Marti
        if code == 'cp2k':
28 ffa1b366 Carles Martí
            cp2k = CP2K()
29 ffa1b366 Carles Martí
            restart_file_list = glob(f"{conf_path}/*-1.restart")
30 ffa1b366 Carles Martí
            if len(restart_file_list) == 0:
31 ffa1b366 Carles Martí
                logger.warning(f"No *-1.restart file found on {conf_path}.")
32 ffa1b366 Carles Martí
                unfinished_calcs.append(conf)
33 ffa1b366 Carles Martí
                continue
34 ffa1b366 Carles Martí
            elif len(restart_file_list) > 1:
35 ffa1b366 Carles Martí
                warn_msg = f'There is more than one CP2K restart file ' \
36 ffa1b366 Carles Martí
                           f'(*-1.restart / in {conf_path}: ' \
37 ffa1b366 Carles Martí
                           f'{restart_file_list}. Skipping directory.'
38 1f1d0644 Carles Martí
                unfinished_calcs.append(conf)
39 ffa1b366 Carles Martí
                logger.warning(warn_msg)
40 ffa1b366 Carles Martí
                continue
41 ffa1b366 Carles Martí
            out_files = []
42 ffa1b366 Carles Martí
            for file in os.listdir(conf_path):
43 ffa1b366 Carles Martí
                with open(conf_path+"/"+file, "rb") as out_fh:
44 ffa1b366 Carles Martí
                    tail_out_str = tail(out_fh)
45 ffa1b366 Carles Martí
                if tail_out_str.count("PROGRAM STOPPED IN") == 1:
46 ffa1b366 Carles Martí
                    out_files.append(file)
47 ffa1b366 Carles Martí
            if len(out_files) > 1:
48 ffa1b366 Carles Martí
                warn_msg = f'There is more than one CP2K output file in ' \
49 ffa1b366 Carles Martí
                           f'{conf_path}: {out_files}. Skipping directory.'
50 ffa1b366 Carles Martí
                logger.warning(warn_msg)
51 ffa1b366 Carles Martí
                unfinished_calcs.append(conf)
52 ffa1b366 Carles Martí
            elif len(out_files) == 0:
53 ffa1b366 Carles Martí
                warn_msg = f'There is no CP2K output file in {conf_path}. ' \
54 ffa1b366 Carles Martí
                           'Skipping directory.'
55 f85667b9 Carles Marti
                logger.warning(warn_msg)
56 f85667b9 Carles Marti
                unfinished_calcs.append(conf)
57 f85667b9 Carles Marti
            else:
58 ffa1b366 Carles Martí
                finished_calcs.append(conf)
59 234eefed Carles Martí
        elif code == 'vasp':
60 ffa1b366 Carles Martí
            out_file_list = glob(f"{conf_path}/OUTCAR")
61 234eefed Carles Martí
            if len(out_file_list) == 0:
62 234eefed Carles Martí
                unfinished_calcs.append(conf)
63 234eefed Carles Martí
            elif len(out_file_list) > 1:
64 234eefed Carles Martí
                warn_msg = f'There is more than one file matching the {code} ' \
65 234eefed Carles Martí
                           f'pattern for finished calculation (*.out / ' \
66 ffa1b366 Carles Martí
                           f'*-1.restart) in {conf_path}: ' \
67 234eefed Carles Martí
                           f'{out_file_list}. Skipping directory.'
68 234eefed Carles Martí
                logger.warning(warn_msg)
69 234eefed Carles Martí
                unfinished_calcs.append(conf)
70 234eefed Carles Martí
            else:
71 0d2f159a Carles Martí
                try:
72 ffa1b366 Carles Martí
                    ase.io.read(f"{conf_path}/OUTCAR")
73 0d2f159a Carles Martí
                except ValueError:
74 0d2f159a Carles Martí
                    unfinished_calcs.append(conf)
75 0d2f159a Carles Martí
                    continue
76 0d2f159a Carles Martí
                except IndexError:
77 0d2f159a Carles Martí
                    unfinished_calcs.append(conf)
78 0d2f159a Carles Martí
                    continue
79 ffa1b366 Carles Martí
                with open(f"{conf_path}/OUTCAR", 'rb') as out_fh:
80 234eefed Carles Martí
                    if "General timing and accounting" not in tail(out_fh):
81 234eefed Carles Martí
                        unfinished_calcs.append(conf)
82 234eefed Carles Martí
                    else:
83 234eefed Carles Martí
                        finished_calcs.append(conf)
84 234eefed Carles Martí
        else:
85 234eefed Carles Martí
            err_msg = f"Check not implemented for '{code}'."
86 234eefed Carles Martí
            logger.error(err_msg)
87 234eefed Carles Martí
            raise NotImplementedError(err_msg)
88 f85667b9 Carles Marti
    return finished_calcs, unfinished_calcs
89 f85667b9 Carles Marti
90 f85667b9 Carles Marti
91 14e0b660 Carles Martí
def prep_cp2k(inp_file: str, run_type: str, atms_list: list, proj_name: str):
92 14e0b660 Carles Martí
    """Prepares the directories to run calculations with CP2K.
93 3d6a9d3c Carles

94 f3004731 Carles
    @param inp_file: CP2K Input file to run the calculations with.
95 f3004731 Carles
    @param run_type: Type of calculation. 'isolated', 'screening' or
96 f3004731 Carles
        'refinement'
97 f3004731 Carles
    @param atms_list: list of ase.Atoms objects to run the calculation of.
98 1a158b9f Carles Marti
    @param proj_name: name of the project
99 f3004731 Carles
    @return: None
100 f3004731 Carles
    """
101 f3004731 Carles
    from shutil import copy
102 f3004731 Carles
    from pycp2k import CP2K
103 af3e2441 Carles Marti
    from modules.utilities import check_bak
104 9d3b680c Carles Martí
    if not isinstance(inp_file, str):
105 9d3b680c Carles Martí
        err_msg = "'inp_file' must be a string with the path of the CP2K " \
106 9d3b680c Carles Martí
                  "input file."
107 9d3b680c Carles Martí
        logger.error(err_msg)
108 9d3b680c Carles Martí
        raise ValueError(err_msg)
109 f3004731 Carles
    cp2k = CP2K()
110 f3004731 Carles
    cp2k.parse(inp_file)
111 1a158b9f Carles Marti
    cp2k.CP2K_INPUT.GLOBAL.Project_name = proj_name+"_"+run_type
112 f3004731 Carles
    force_eval = cp2k.CP2K_INPUT.FORCE_EVAL_list[0]
113 b05058e1 Carles
    if force_eval.SUBSYS.TOPOLOGY.Coord_file_name is None:
114 2dfa562f Carles Martí
        logger.warning("'COORD_FILE_NAME' not specified on CP2K input. Using\n"
115 f601942f Carles Marti
                       "'coord.xyz'. A new CP2K input file with "
116 f601942f Carles Marti
                       "the 'COORD_FILE_NAME' variable is created.")
117 b05058e1 Carles
        force_eval.SUBSYS.TOPOLOGY.Coord_file_name = 'coord.xyz'
118 2dfa562f Carles Martí
        check_bak(inp_file.split('/')[-1])
119 1a158b9f Carles Marti
    cp2k.write_input_file(inp_file.split('/')[-1])
120 b05058e1 Carles
121 f3004731 Carles
    coord_file = force_eval.SUBSYS.TOPOLOGY.Coord_file_name
122 f3004731 Carles
123 99afde40 Carles
    # Creating and setting up directories for every configuration.
124 f3004731 Carles
    for i, conf in enumerate(atms_list):
125 9d3b680c Carles Martí
        subdir = f'{run_type}/conf_{i}/'
126 9d3b680c Carles Martí
        os.mkdir(subdir)
127 9d3b680c Carles Martí
        copy(inp_file, subdir)
128 9d3b680c Carles Martí
        conf.write(subdir + coord_file)
129 9d3b680c Carles Martí
130 9d3b680c Carles Martí
131 f349bb54 Carles
def prep_vasp(inp_files, run_type, atms_list, proj_name, cell, potcar_dir):
132 9d3b680c Carles Martí
    """Prepares the directories to run calculations with VASP.
133 9d3b680c Carles Martí

134 9d3b680c Carles Martí
    @param inp_files: VASP Input files to run the calculations with.
135 9d3b680c Carles Martí
    @param run_type: Type of calculation. 'isolated', 'screening' or
136 9d3b680c Carles Martí
        'refinement'
137 9d3b680c Carles Martí
    @param atms_list: list of ase.Atoms objects to run the calculation of.
138 9d3b680c Carles Martí
    @param proj_name: name of the project.
139 9d3b680c Carles Martí
    @param cell: Cell for the Periodic Boundary Conditions.
140 f349bb54 Carles
    @param potcar_dir: Directory to find POTCARs for each element.
141 9d3b680c Carles Martí
    @return: None
142 9d3b680c Carles Martí
    """
143 9d3b680c Carles Martí
    from shutil import copy
144 9d3b680c Carles Martí
    import os
145 9d3b680c Carles Martí
146 9d3b680c Carles Martí
    import numpy as np
147 9d3b680c Carles Martí
    from pymatgen.io.vasp.inputs import Incar
148 9d3b680c Carles Martí
149 f349bb54 Carles
    if not potcar_dir:
150 f349bb54 Carles
        mand_files = ["INCAR", "KPOINTS", "POTCAR"]
151 f349bb54 Carles
    elif any("POTCAR" in inp_file for inp_file in inp_files):
152 f349bb54 Carles
        mand_files = ["INCAR", "KPOINTS", "POTCAR"]
153 f349bb54 Carles
    else:
154 f349bb54 Carles
        mand_files = ["INCAR", "KPOINTS"]
155 f349bb54 Carles
156 9d3b680c Carles Martí
    # Check that there are many specified files
157 9d3b680c Carles Martí
    if not isinstance(inp_files, list) and all(isinstance(inp_file, str)
158 9d3b680c Carles Martí
                                               for inp_file in inp_files):
159 9d3b680c Carles Martí
        err_msg = "'inp_files' should be a list of file names/paths"
160 9d3b680c Carles Martí
        logger.error(err_msg)
161 9d3b680c Carles Martí
        ValueError(err_msg)
162 9d3b680c Carles Martí
    # Check that all mandatory files are defined
163 9d3b680c Carles Martí
    elif any(not any(mand_file in inp_file.split("/")[-1]
164 9d3b680c Carles Martí
                     for inp_file in inp_files) for mand_file in mand_files):
165 9d3b680c Carles Martí
        err_msg = f"At least one of the mandatory files {mand_files} was " \
166 9d3b680c Carles Martí
                  "not specified."
167 9d3b680c Carles Martí
        logger.error(err_msg)
168 9d3b680c Carles Martí
        raise FileNotFoundError(err_msg)
169 9d3b680c Carles Martí
    # Check that the defined files exist
170 9d3b680c Carles Martí
    elif any(not os.path.isfile(inp_file) for inp_file in inp_files):
171 9d3b680c Carles Martí
        err_msg = f"At least one of the mandatory files {mand_files} was " \
172 9d3b680c Carles Martí
                  "not found."
173 9d3b680c Carles Martí
        logger.error(err_msg)
174 9d3b680c Carles Martí
        raise FileNotFoundError(err_msg)
175 017c5dbc Carles Martí
    incar = ""
176 9d3b680c Carles Martí
    for i, inp_file in enumerate(inp_files):
177 9d3b680c Carles Martí
        file_name = inp_file.split("/")[-1]
178 9d3b680c Carles Martí
        if "INCAR" in file_name:
179 9d3b680c Carles Martí
            incar = Incar.from_file(inp_file)
180 9d3b680c Carles Martí
            incar["SYSTEM"] = proj_name+"_"+run_type
181 017c5dbc Carles Martí
182 9d3b680c Carles Martí
    for c, conf in enumerate(atms_list):
183 9d3b680c Carles Martí
        subdir = f'{run_type}/conf_{c}/'
184 9d3b680c Carles Martí
        os.mkdir(subdir)
185 9d3b680c Carles Martí
        for inp_file in inp_files:
186 9d3b680c Carles Martí
            file_name = inp_file.split("/")[-1]
187 d566f8e6 Carles Martí
            if "INCAR" in file_name:
188 017c5dbc Carles Martí
                incar.write_file(subdir+"INCAR")
189 017c5dbc Carles Martí
            elif "KPOINTS" in file_name and "KPOINTS" != file_name:
190 017c5dbc Carles Martí
                copy(inp_file, subdir+"KPOINTS")
191 017c5dbc Carles Martí
            elif "POTCAR" in file_name and "POTCAR" != file_name:
192 017c5dbc Carles Martí
                copy(inp_file, subdir+"POTCAR")
193 9d3b680c Carles Martí
            else:
194 9d3b680c Carles Martí
                copy(inp_file, subdir)
195 9d3b680c Carles Martí
        if cell is not False and np.linalg.det(cell) != 0.0:
196 9d3b680c Carles Martí
            conf.pbc = True
197 9d3b680c Carles Martí
            conf.cell = cell
198 25e7e44b Carles Martí
            conf.center()
199 9d3b680c Carles Martí
        elif np.linalg.det(conf.cell) == 0:
200 9d3b680c Carles Martí
            err_msg = "Cell is not defined"
201 9d3b680c Carles Martí
            logger.error(err_msg)
202 9d3b680c Carles Martí
            raise ValueError(err_msg)
203 9d3b680c Carles Martí
        conf.write(subdir+"POSCAR", format="vasp")
204 f349bb54 Carles
        if "POTCAR" not in mand_files and potcar_dir:
205 f349bb54 Carles
            poscar_fh = open(subdir+"POSCAR", "r")
206 f349bb54 Carles
            grouped_symbols = poscar_fh.readline().split()
207 f349bb54 Carles
            poscar_fh.close()
208 f349bb54 Carles
            for symbol in grouped_symbols:
209 f349bb54 Carles
                potcar_sym_fh = open(f"{potcar_dir}/{symbol}/POTCAR", "r")
210 f349bb54 Carles
                potcar_sym_str = potcar_sym_fh.read()
211 f349bb54 Carles
                potcar_sym_fh.close()
212 f349bb54 Carles
                potcar_fh = open(subdir+"POTCAR", "a")
213 f349bb54 Carles
                potcar_fh.write(potcar_sym_str)
214 f349bb54 Carles
                potcar_fh.close()
215 f3004731 Carles
216 f3004731 Carles
217 2be92b2c Carles Marti
def get_jobs_status(job_ids, stat_cmd, stat_dict):
218 670284be Carles
    """Returns a list of job status for a list of job ids.
219 99afde40 Carles

220 670284be Carles
    @param job_ids: list of all jobs to be checked their status.
221 2be92b2c Carles Marti
    @param stat_cmd: Command to check job status.
222 2be92b2c Carles Marti
    @param stat_dict: Dictionary with pairs of job status (r, p, f) and the
223 2be92b2c Carles Marti
        pattern it matches in the output of the stat_cmd.
224 670284be Carles
    @return: list of status for every job.
225 99afde40 Carles
    """
226 2be92b2c Carles Marti
    from subprocess import PIPE, Popen
227 670284be Carles
    status_list = []
228 670284be Carles
    for job in job_ids:
229 99c87fcc Carles Marti
        stat_msg = Popen(stat_cmd % job, shell=True,
230 2be92b2c Carles Marti
                         stdout=PIPE).communicate()[0].decode('utf-8').strip()
231 2be92b2c Carles Marti
        if stat_dict['r'] == stat_msg:
232 670284be Carles
            status_list.append('r')
233 2be92b2c Carles Marti
        elif stat_dict['p'] == stat_msg:
234 2be92b2c Carles Marti
            status_list.append('p')
235 2be92b2c Carles Marti
        elif stat_dict['f'] == stat_msg:
236 b461f289 Carles Marti
            status_list.append('f')
237 b461f289 Carles Marti
        else:
238 99c87fcc Carles Marti
            logger.warning(f'Unrecognized job {job} status: {stat_msg}')
239 b461f289 Carles Marti
    return status_list
240 b461f289 Carles Marti
241 b461f289 Carles Marti
242 09c3325a Carles Marti
def submit_jobs(run_type, sub_cmd, sub_script, stat_cmd, stat_dict, max_jobs,
243 b6b1b03e Carles Marti
                name):
244 2be92b2c Carles Marti
    """Submits jobs to a custom queuing system with the provided script
245 b461f289 Carles Marti

246 b461f289 Carles Marti
    @param run_type: Type of calculation. 'isolated', 'screening', 'refinement'
247 b6b1b03e Carles Marti
    @param sub_cmd: Bash command used to submit jobs.
248 b461f289 Carles Marti
    @param sub_script: script for the job submission.
249 b6b1b03e Carles Marti
    @param stat_cmd: Bash command to check job status.
250 b6b1b03e Carles Marti
    @param stat_dict: Dictionary with pairs of job status: r, p, f (ie. running
251 b6b1b03e Carles Marti
        pending and finished) and the pattern it matches in the output of the
252 b6b1b03e Carles Marti
        stat_cmd.
253 b6b1b03e Carles Marti
    @param max_jobs: dict: Contains the maximum number of jobs to be both
254 b6b1b03e Carles Marti
        running, pending/queued and pending+running. When the relevant maximum
255 b6b1b03e Carles Marti
        is reached no jobs more are submitted.
256 2be92b2c Carles Marti
    @param name: name of the project.
257 b461f289 Carles Marti
    """
258 b461f289 Carles Marti
    from shutil import copy
259 b461f289 Carles Marti
    from time import sleep
260 2be92b2c Carles Marti
    from subprocess import PIPE, Popen
261 556b41aa Carles Martí
    from modules.utilities import _human_key
262 b461f289 Carles Marti
    subm_jobs = []
263 b461f289 Carles Marti
    init_dir = os.getcwd()
264 556b41aa Carles Martí
    for conf in sorted(os.listdir(run_type), key=_human_key):
265 b461f289 Carles Marti
        i = conf.split('_')[1]
266 b6b1b03e Carles Marti
        while get_jobs_status(subm_jobs, stat_cmd, stat_dict).count("r") + \
267 b6b1b03e Carles Marti
                get_jobs_status(subm_jobs, stat_cmd, stat_dict).count("p") \
268 b6b1b03e Carles Marti
                >= max_jobs['rp']\
269 b6b1b03e Carles Marti
                or get_jobs_status(subm_jobs, stat_cmd, stat_dict).count("r") \
270 b6b1b03e Carles Marti
                >= max_jobs['r'] \
271 b6b1b03e Carles Marti
                or get_jobs_status(subm_jobs, stat_cmd, stat_dict).count("p") \
272 b6b1b03e Carles Marti
                >= max_jobs['p']:
273 b461f289 Carles Marti
            sleep(30)
274 b461f289 Carles Marti
        copy(sub_script, f"{run_type}/{conf}")
275 b461f289 Carles Marti
        os.chdir(f"{run_type}/{conf}")
276 ca309a2c Carles Marti
        job_name = f'{name[:5]}{run_type[:3].capitalize()}{i}'
277 2be92b2c Carles Marti
        sub_order = sub_cmd % (job_name, sub_script)
278 2be92b2c Carles Marti
        subm_msg = Popen(sub_order, shell=True, stdout=PIPE).communicate()[0]
279 2be92b2c Carles Marti
        job_id = None
280 2be92b2c Carles Marti
        for word in subm_msg.decode("utf-8").split():
281 2be92b2c Carles Marti
            try:
282 118974d5 Carles Marti
                job_id = int(word.replace('>', '').replace('<', ''))
283 2be92b2c Carles Marti
                break
284 2be92b2c Carles Marti
            except ValueError:
285 2be92b2c Carles Marti
                continue
286 2be92b2c Carles Marti
        subm_jobs.append(job_id)
287 b461f289 Carles Marti
        os.chdir(init_dir)
288 b461f289 Carles Marti
289 b461f289 Carles Marti
    logger.info('All jobs have been submitted, waiting for them to finish.')
290 2be92b2c Carles Marti
    while not all([stat == 'f' for stat in
291 2be92b2c Carles Marti
                   get_jobs_status(subm_jobs, stat_cmd, stat_dict)]):
292 b461f289 Carles Marti
        sleep(30)
293 b461f289 Carles Marti
    logger.info('All jobs have finished.')
294 12001182 Carles
295 12001182 Carles
296 f3004731 Carles
def run_calc(run_type, inp_vars, atms_list):
297 3d6a9d3c Carles
    """Directs the calculation run according to the provided arguments.
298 3d6a9d3c Carles

299 f3004731 Carles
    @param run_type: Type of calculation. 'isolated', 'screening' or
300 f3004731 Carles
    'refinement'
301 3d6a9d3c Carles
    @param inp_vars: Calculation parameters from input file.
302 f3004731 Carles
    @param atms_list: List of ase.Atoms objects containing the sets of atoms
303 f3004731 Carles
    aimed to run the calculations of.
304 3d6a9d3c Carles
    """
305 821dca42 Carles Marti
    from modules.utilities import check_bak
306 14e0b660 Carles Martí
307 3d6a9d3c Carles
    run_types = ['isolated', 'screening', 'refinement']
308 3d6a9d3c Carles
    if not isinstance(run_type, str) or run_type.lower() not in run_types:
309 1e36f905 Carles Marti
        run_type_err = f"'run_type' must be one of the following: {run_types}"
310 3d6a9d3c Carles
        logger.error(run_type_err)
311 3d6a9d3c Carles
        raise ValueError(run_type_err)
312 3d6a9d3c Carles
313 821dca42 Carles Marti
    if inp_vars['batch_q_sys']:
314 821dca42 Carles Marti
        logger.info(f"Running {run_type} calculation with {inp_vars['code']} on"
315 695dcff8 Carles Marti
                    f" {inp_vars['batch_q_sys']}.")
316 821dca42 Carles Marti
    else:
317 695dcff8 Carles Marti
        logger.info(f"Doing a dry run of {run_type}.")
318 c3cb279a Carles
    check_bak(run_type)
319 c3cb279a Carles
    os.mkdir(run_type)
320 1e36f905 Carles Marti
321 1e36f905 Carles Marti
    # Prepare directories and files for relevant code.
322 07edc24f Carles Marti
    input_files = {'isolated': 'isol_inp_file', 'screening': 'screen_inp_file',
323 07edc24f Carles Marti
                   'refinement': 'refine_inp_file', }
324 1b54d787 Carles Marti
    if inp_vars['code'] == 'cp2k':
325 07edc24f Carles Marti
        prep_cp2k(inp_vars[input_files[run_type]], run_type, atms_list,
326 07edc24f Carles Marti
                  inp_vars['project_name'])
327 9d3b680c Carles Martí
    elif inp_vars['code'] == "vasp":
328 9d3b680c Carles Martí
        prep_vasp(inp_vars[input_files[run_type]], run_type, atms_list,
329 f349bb54 Carles
                  inp_vars['project_name'], inp_vars['pbc_cell'],
330 f349bb54 Carles
                  inp_vars['potcar_dir'])
331 a5f73b4c Carles
    # elif: inp_vars['code'] == 'Other codes here'
332 99afde40 Carles
333 1e36f905 Carles Marti
    # Submit/run Jobs
334 12001182 Carles
    if inp_vars['batch_q_sys'] == 'sge':
335 2be92b2c Carles Marti
        stat_cmd = "qstat | grep %s | awk '{print $5}'"
336 2be92b2c Carles Marti
        stat_dict = {'r': 'r', 'p': 'qw', 'f': ''}
337 2be92b2c Carles Marti
        submit_jobs(run_type, 'qsub -N %s %s', inp_vars['subm_script'],
338 09c3325a Carles Marti
                    stat_cmd, stat_dict, inp_vars['max_jobs'],
339 b6b1b03e Carles Marti
                    inp_vars['project_name'])
340 2be92b2c Carles Marti
    elif inp_vars['batch_q_sys'] == 'lsf':
341 118974d5 Carles Marti
        stat_cmd = "bjobs -w | grep %s | awk '{print $3}'"
342 118974d5 Carles Marti
        stat_dict = {'r': 'RUN', 'p': 'PEND', 'f': ''}
343 118974d5 Carles Marti
        submit_jobs(run_type, 'bsub -J %s < %s', inp_vars['subm_script'],
344 09c3325a Carles Marti
                    stat_cmd, stat_dict, inp_vars['max_jobs'],
345 b6b1b03e Carles Marti
                    inp_vars['project_name'])
346 ec5bba46 Carles Marti
    elif inp_vars['batch_q_sys'] == 'irene':
347 ec5bba46 Carles Marti
        stat_cmd = "ccc_mstat | grep %s | awk '{print $10}' | cut -c1"
348 ec5bba46 Carles Marti
        stat_dict = {'r': 'R', 'p': 'P', 'f': ''}
349 ec5bba46 Carles Marti
        submit_jobs(run_type, 'ccc_msub -r %s %s', inp_vars['subm_script'],
350 ec5bba46 Carles Marti
                    stat_cmd, stat_dict, inp_vars['max_jobs'],
351 b6b1b03e Carles Marti
                    inp_vars['project_name'])
352 ec5bba46 Carles Marti
353 1a1164e0 Carles Marti
    elif inp_vars['batch_q_sys'] == 'local':
354 1a1164e0 Carles Marti
        pass  # TODO implement local
355 1a1164e0 Carles Marti
    elif not inp_vars['batch_q_sys']:
356 0db30d07 Carles
        pass
357 14e0b660 Carles Martí
    else:
358 14e0b660 Carles Martí
        err_msg = "Unknown value for 'batch_q_sys'."
359 14e0b660 Carles Martí
        logger.error(err_msg)
360 14e0b660 Carles Martí
        raise ValueError(err_msg)