|
2 | 2 | import json
|
3 | 3 | import logging
|
4 | 4 | import os
|
| 5 | +import shutil |
5 | 6 | import sys
|
6 | 7 | import time
|
7 | 8 | import uuid
|
|
12 | 13 | import requests
|
13 | 14 |
|
14 | 15 | from web_conexs_api.database import get_session
|
| 16 | +from web_conexs_api.jobfilebuilders import build_qe_xspectra_input |
15 | 17 | from web_conexs_api.models.models import OrcaCalculation, Simulation, SimulationStatus
|
16 | 18 |
|
17 | 19 | from .crud import (
|
18 | 20 | get_active_simulations,
|
19 | 21 | get_fdmnes_jobfile,
|
20 | 22 | get_orca_jobfile_with_technique,
|
| 23 | + get_qe_jobfile, |
21 | 24 | get_submitted_simulations,
|
22 | 25 | update_simulation,
|
23 | 26 | )
|
|
32 | 35 | SLURM_USER = os.environ.get("SLURM_USER")
|
33 | 36 | SLURM_API = os.environ.get("SLURM_API")
|
34 | 37 | SLURM_PARTITION = os.environ.get("SLURM_PARTITION")
|
| 38 | +SLURM_RESPONSE_KEY = os.environ.get("SLURM_RESPONSE_KEY", "account") |
35 | 39 |
|
36 | 40 | ORCA_IMAGE = os.environ.get("ORCA_IMAGE")
|
37 | 41 | FDMNES_IMAGE = os.environ.get("FDMNES_IMAGE")
|
| 42 | +QE_IMAGE = os.environ.get("QE_IMAGE") |
38 | 43 | CONTAINER_IMAGE_DIR = os.environ.get("CONTAINER_IMAGE_DIR")
|
| 44 | +PP_DIR = os.environ.get("PP_DIR") |
| 45 | +WFC_DIR = os.environ.get("WFC_DIR") |
39 | 46 |
|
40 | 47 | JOB_RUNNING = "RUNNING"
|
41 | 48 | JOB_COMPLETED = "COMPLETED"
|
@@ -225,6 +232,8 @@ def run_update():
|
225 | 232 | submit_orca(session, sim)
|
226 | 233 | if sim.simulation_type_id == 2:
|
227 | 234 | submit_fdmnes(session, sim)
|
| 235 | + if sim.simulation_type_id == 3: |
| 236 | + submit_qe(session, sim) |
228 | 237 |
|
229 | 238 | # orca = get_orca_jobfile(session, sim.id)
|
230 | 239 | # determine workspace
|
@@ -256,7 +265,8 @@ def run_update():
|
256 | 265 | job_map = {}
|
257 | 266 |
|
258 | 267 | for j in jobs:
|
259 |
| - if j["account"] == SLURM_USER: |
| 268 | + # NEED TO CHANGE TO USER |
| 269 | + if j[SLURM_RESPONSE_KEY] == SLURM_USER: |
260 | 270 | job_map[j["job_id"]] = {"state": j["job_state"][0]}
|
261 | 271 |
|
262 | 272 | if len(active) != 0:
|
@@ -290,6 +300,60 @@ def run_update():
|
290 | 300 | update_simulation(session, a)
|
291 | 301 |
|
292 | 302 |
|
| 303 | +def submit_qe(session, sim: Simulation): |
| 304 | + jobfile, absorbing_atom, abs_edge, pp, pp_abs = get_qe_jobfile(session, sim.id) |
| 305 | + application_name = "qe" |
| 306 | + user = sim.person.identifier |
| 307 | + uid = uuid.uuid4() |
| 308 | + |
| 309 | + job_name = application_name + "-" + str(uid) |
| 310 | + working_dir = ROOT_DIR + user + "/" + job_name |
| 311 | + cluster_dir = CLUSTER_ROOT_DIR + user + "/" + job_name |
| 312 | + |
| 313 | + Path(working_dir).mkdir(parents=True) |
| 314 | + |
| 315 | + with open(working_dir / Path("job.inp"), "w+") as f: |
| 316 | + f.write(jobfile) |
| 317 | + |
| 318 | + for pp_filename in pp: |
| 319 | + shutil.copy(os.path.join(PP_DIR, pp_filename), working_dir) |
| 320 | + |
| 321 | + xspectra_input_file = working_dir / Path("xspectra_input.inp") |
| 322 | + |
| 323 | + core_file = Path(pp_abs).with_suffix(".wfc") |
| 324 | + |
| 325 | + wffile = WFC_DIR / core_file |
| 326 | + shutil.copy(wffile, working_dir) |
| 327 | + |
| 328 | + xspectra_jobfile = build_qe_xspectra_input(absorbing_atom, abs_edge, str(core_file)) |
| 329 | + |
| 330 | + with open(xspectra_input_file, "w+") as ff: |
| 331 | + ff.write(xspectra_jobfile) |
| 332 | + |
| 333 | + qe_sif = os.path.join(CONTAINER_IMAGE_DIR, QE_IMAGE) |
| 334 | + |
| 335 | + script = ( |
| 336 | + "#!/bin/bash\n" |
| 337 | + + f"singularity exec {qe_sif} mpirun" |
| 338 | + + f" -np {sim.n_cores} pw.x -in job.inp > result.pwo \n" |
| 339 | + + f"singularity exec {qe_sif} mpirun" |
| 340 | + + f" -np {sim.n_cores} xspectra.x -in xspectra_input.inp" |
| 341 | + ) |
| 342 | + |
| 343 | + try: |
| 344 | + job_id = build_job_and_run( |
| 345 | + script, user, working_dir, job_name, sim.n_cores, sim.memory, cluster_dir |
| 346 | + ) |
| 347 | + sim.job_id = job_id |
| 348 | + sim.working_directory = working_dir |
| 349 | + sim.submission_date = datetime.datetime.now() |
| 350 | + sim.status = SimulationStatus.submitted |
| 351 | + update_simulation(session, sim) |
| 352 | + except Exception: |
| 353 | + sim.status = SimulationStatus.failed |
| 354 | + update_simulation(session, sim) |
| 355 | + |
| 356 | + |
293 | 357 | def test_read():
|
294 | 358 | with contextmanager(get_session)() as session:
|
295 | 359 | sims = get_submitted_simulations(session)
|
|
0 commit comments