diff --git a/src/Scripts/Run.py b/src/Scripts/Run.py
new file mode 100644
index 00000000..2c26f4d2
--- /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 .
+
+# -*- 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]} ")
+
+ 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 0603a5ab..b461d602 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 2381da01..f2652686 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,
}