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

dockonsurf / modules / calculation.py @ 19567be2

Historique | Voir | Annoter | Télécharger (15,15 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 19567be2 Carles Martí
    new_inp_file = inp_file.split('/')[-1]
122 19567be2 Carles Martí
    cp2k.write_input_file(new_inp_file)
123 b05058e1 Carles
124 f3004731 Carles
    coord_file = force_eval.SUBSYS.TOPOLOGY.Coord_file_name
125 f3004731 Carles
126 99afde40 Carles
    # Creating and setting up directories for every configuration.
127 f3004731 Carles
    for i, conf in enumerate(atms_list):
128 9d3b680c Carles Martí
        subdir = f'{run_type}/conf_{i}/'
129 9d3b680c Carles Martí
        os.mkdir(subdir)
130 19567be2 Carles Martí
        copy(new_inp_file, subdir)
131 9d3b680c Carles Martí
        conf.write(subdir + coord_file)
132 9d3b680c Carles Martí
133 9d3b680c Carles Martí
134 f349bb54 Carles
def prep_vasp(inp_files, run_type, atms_list, proj_name, cell, potcar_dir):
135 9d3b680c Carles Martí
    """Prepares the directories to run calculations with VASP.
136 9d3b680c Carles Martí

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

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

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

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