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

dockonsurf / modules / calculation.py @ cf980c86

Historique | Voir | Annoter | Télécharger (15,68 ko)

1 4e82c425 Carles Martí
"""Module for the submission or execution of the calculations to be done
2 4e82c425 Carles Martí

3 4e82c425 Carles Martí
functions:
4 4e82c425 Carles Martí
check_finished_calcs: Checks if the calculations finished normally or not.
5 4e82c425 Carles Martí
prep_cp2k: Prepares the directories to run calculations with CP2K.
6 4e82c425 Carles Martí
prep_vasp: Prepares the directories to run calculations with VASP.
7 4e82c425 Carles Martí
get_jobs_status: Returns a list of job status for a list of job ids.
8 4e82c425 Carles Martí
submit_jobs: Submits jobs to a custom queuing system with the provided script
9 4e82c425 Carles Martí
run_calc: Directs calculation run/submission.
10 4e82c425 Carles Martí
"""
11 4e82c425 Carles Martí
12 3d6a9d3c Carles
import os
13 3d6a9d3c Carles
import logging
14 3d6a9d3c Carles
15 3d6a9d3c Carles
logger = logging.getLogger('DockOnSurf')
16 3d6a9d3c Carles
17 3d6a9d3c Carles
18 f85667b9 Carles Marti
def check_finished_calcs(run_type, code):
19 4e82c425 Carles Martí
    """Checks if the calculations finished normally or not.
20 f85667b9 Carles Marti

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

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

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

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

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

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