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

dockonsurf / modules / calculation.py @ 1d8c374e

Historique | Voir | Annoter | Télécharger (15,08 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 f2f23abc Carles Martí
    @return finished_calcs: List of calculation directories that have finished 
14 f2f23abc Carles Martí
    normally.
15 f2f23abc Carles Martí
    @return unfinished_calcs: List of calculation directories that have finished 
16 f2f23abc Carles Martí
    abnormally.
17 f85667b9 Carles Marti
    """
18 f85667b9 Carles Marti
    from glob import glob
19 0d2f159a Carles Martí
    import ase.io
20 1d8c374e Carles Martí
    from modules.utilities import tail, is_binary
21 f85667b9 Carles Marti
22 f85667b9 Carles Marti
    finished_calcs = []
23 f85667b9 Carles Marti
    unfinished_calcs = []
24 f2f23abc Carles Martí
    for conf_dir in sorted(os.listdir(run_type), key=_human_key):
25 1d8c374e Carles Martí
        conf_path = f'{run_type}/{conf_dir}/'
26 f2f23abc Carles Martí
        if not os.path.isdir(conf_path) or 'conf_' not in conf_dir:
27 f85667b9 Carles Marti
            continue
28 f85667b9 Carles Marti
        if code == '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 f2f23abc Carles Martí
                unfinished_calcs.append(conf_dir)
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 f2f23abc Carles Martí
                unfinished_calcs.append(conf_dir)
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 1d8c374e Carles Martí
                if is_binary(conf_path+file):
44 1d8c374e Carles Martí
                    continue
45 1d8c374e Carles Martí
                with open(conf_path+file, "rb") as out_fh:
46 ffa1b366 Carles Martí
                    tail_out_str = tail(out_fh)
47 ffa1b366 Carles Martí
                if tail_out_str.count("PROGRAM STOPPED IN") == 1:
48 ffa1b366 Carles Martí
                    out_files.append(file)
49 ffa1b366 Carles Martí
            if len(out_files) > 1:
50 ffa1b366 Carles Martí
                warn_msg = f'There is more than one CP2K output file in ' \
51 ffa1b366 Carles Martí
                           f'{conf_path}: {out_files}. Skipping directory.'
52 ffa1b366 Carles Martí
                logger.warning(warn_msg)
53 f2f23abc Carles Martí
                unfinished_calcs.append(conf_dir)
54 ffa1b366 Carles Martí
            elif len(out_files) == 0:
55 ffa1b366 Carles Martí
                warn_msg = f'There is no CP2K output file in {conf_path}. ' \
56 ffa1b366 Carles Martí
                           'Skipping directory.'
57 f85667b9 Carles Marti
                logger.warning(warn_msg)
58 f2f23abc Carles Martí
                unfinished_calcs.append(conf_dir)
59 f85667b9 Carles Marti
            else:
60 f2f23abc Carles Martí
                finished_calcs.append(conf_dir)
61 234eefed Carles Martí
        elif code == 'vasp':
62 ffa1b366 Carles Martí
            out_file_list = glob(f"{conf_path}/OUTCAR")
63 234eefed Carles Martí
            if len(out_file_list) == 0:
64 f2f23abc Carles Martí
                unfinished_calcs.append(conf_dir)
65 234eefed Carles Martí
            elif len(out_file_list) > 1:
66 234eefed Carles Martí
                warn_msg = f'There is more than one file matching the {code} ' \
67 234eefed Carles Martí
                           f'pattern for finished calculation (*.out / ' \
68 ffa1b366 Carles Martí
                           f'*-1.restart) in {conf_path}: ' \
69 234eefed Carles Martí
                           f'{out_file_list}. Skipping directory.'
70 234eefed Carles Martí
                logger.warning(warn_msg)
71 f2f23abc Carles Martí
                unfinished_calcs.append(conf_dir)
72 234eefed Carles Martí
            else:
73 0d2f159a Carles Martí
                try:
74 ffa1b366 Carles Martí
                    ase.io.read(f"{conf_path}/OUTCAR")
75 0d2f159a Carles Martí
                except ValueError:
76 f2f23abc Carles Martí
                    unfinished_calcs.append(conf_dir)
77 0d2f159a Carles Martí
                    continue
78 0d2f159a Carles Martí
                except IndexError:
79 f2f23abc Carles Martí
                    unfinished_calcs.append(conf_dir)
80 0d2f159a Carles Martí
                    continue
81 ffa1b366 Carles Martí
                with open(f"{conf_path}/OUTCAR", 'rb') as out_fh:
82 234eefed Carles Martí
                    if "General timing and accounting" not in tail(out_fh):
83 f2f23abc Carles Martí
                        unfinished_calcs.append(conf_dir)
84 234eefed Carles Martí
                    else:
85 f2f23abc Carles Martí
                        finished_calcs.append(conf_dir)
86 234eefed Carles Martí
        else:
87 234eefed Carles Martí
            err_msg = f"Check not implemented for '{code}'."
88 234eefed Carles Martí
            logger.error(err_msg)
89 234eefed Carles Martí
            raise NotImplementedError(err_msg)
90 f85667b9 Carles Marti
    return finished_calcs, unfinished_calcs
91 f85667b9 Carles Marti
92 f85667b9 Carles Marti
93 14e0b660 Carles Martí
def prep_cp2k(inp_file: str, run_type: str, atms_list: list, proj_name: str):
94 14e0b660 Carles Martí
    """Prepares the directories to run calculations with CP2K.
95 3d6a9d3c Carles

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

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

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

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

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