diff --git a/src/Scripts/Run.py b/src/Scripts/Run.py new file mode 100644 index 0000000000000000000000000000000000000000..2c26f4d29f4f471223f187480c8624ee704113ce --- /dev/null +++ b/src/Scripts/Run.py @@ -0,0 +1,106 @@ +# Run.py -- Pamhyr +# Copyright (C) 2023 INRAE +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +# -*- coding: utf-8 -*- + +import os +import logging + +from queue import Queue + +from PyQt5.QtCore import QProcess + +from Scripts.AScript import AScript +from Model.Study import Study + +logger = logging.getLogger() + + +class ScriptRun(AScript): + name = "Run" + description = "Run solver on Pamhyr2 a study" + + def usage(self): + logger.info(f"Usage : {self._args[0]} {self._args[1]} <SOLVER> <STUDY>") + + def run(self): + if len(self._args) < 4: + return 1 + + command = self._args[1] + solver_name = self._args[2] + study_file = os.path.abspath( + self._args[3] + ) + + try: + solver = next( + filter( + lambda solver: solver.name == solver_name, + self._conf.solvers + ) + ) + except Exception as e: + logger.error(f"No solver found: {e}") + return 2 + + study = Study.open(study_file) + + self._solver = solver + self._study = study + + logger.info(f"Run {solver.name} ({solver.type}) on study '{study.name}' ({study_file})") + + # Workdir + workdir = os.path.join( + os.path.dirname(study.filename), + "_PAMHYR_", + study.name.replace(" ", "_"), + solver.name.replace(" ", "_") + ) + os.makedirs(workdir, exist_ok=True) + logger.info(f"Set working dir to {workdir}") + + # Preparate process + p = QProcess(None) + p.setWorkingDirectory(workdir) + + self._q = Queue() + + # Export and Run + logger.info(f"~Export~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") + solver.export(study, workdir, qlog=self._q) + + while self._q.qsize() != 0: + s = self._q.get() + logger.info(s) + + if command == "run": + logger.info(f"~Run~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") + solver.run( + study, + process=p, + output_queue=self._q + ) + p.waitForFinished() + + logger.info(f"~End~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") + + return 0 + +class ScriptExport(ScriptRun): + name = "Export" + description = "Export Pamhyr2 study for solver" diff --git a/src/Solver/ASolver.py b/src/Solver/ASolver.py index 0603a5abc7a4c4ce5840ec7813d9280c9ec82b6a..b461d6025d93bd5d5e8a1c186e1d4b4aca20aea3 100644 --- a/src/Solver/ASolver.py +++ b/src/Solver/ASolver.py @@ -295,6 +295,7 @@ class AbstractSolver(object): self._process.start( exe, args, ) + self._process.waitForStarted() self._status = STATUS.RUNNING return True @@ -340,6 +341,8 @@ class AbstractSolver(object): self._run_next(study) def run(self, study, process=None, output_queue=None): + self._study = study + if process is not None: self._process = process if output_queue is not None: diff --git a/src/pamhyr.py b/src/pamhyr.py index 2381da01dc01068e7d8119809a010722416fb7e0..f26526860baf43c20a03a2806aa6fb5ae070c057 100755 --- a/src/pamhyr.py +++ b/src/pamhyr.py @@ -37,6 +37,7 @@ from Model.Study import Study from Scripts.P3DST import Script3DST from Scripts.Hello import ScriptHello +from Scripts.Run import ScriptExport, ScriptRun from init import legal_info, debug_info, setup_lang @@ -44,6 +45,8 @@ logger = logging.getLogger() scripts = { "hello": ScriptHello, + "export": ScriptExport, + "run": ScriptRun, "3DST": Script3DST, }