]> SALOME platform Git repositories - modules/parametric.git/blob - src/salome/parametric/genjob.py
Salome HOME
Fix bug on PARAMETRIC component loading in batch
[modules/parametric.git] / src / salome / parametric / genjob.py
1 # Copyright (C) 2012-2013 EDF
2 #
3 # This file is part of SALOME PARAMETRIC module.
4 #
5 # SALOME PARAMETRIC module is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Lesser General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # SALOME PARAMETRIC module is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU Lesser General Public License for more details.
14 #
15 # You should have received a copy of the GNU Lesser General Public License
16 # along with SALOME PARAMETRIC module.  If not, see <http://www.gnu.org/licenses/>.
17
18 import os
19 import re
20 import tempfile
21 from datetime import datetime
22
23 import salome
24 from salome.kernel.studyedit import getStudyEditor
25 from study import ParametricStudy
26
27 job_script_template = """#!/usr/bin/env python
28
29 import salome
30 from salome.kernel.studyedit import getStudyEditor
31 import PARAMETRIC
32
33 salome.salome_init()
34
35 # load study
36 study = salome.myStudyManager.Open("%(input_study)s")
37
38 # start container, load PARAMETRIC component and load the content of the parametric study in the component
39 ed = getStudyEditor(study._get_StudyId())
40 sobj = study.FindObjectID("%(param_entry)s")
41 scomp = sobj.GetFatherComponent()
42 ed.loadComponentEngine(scomp, "ParametricContainer")
43 comp = scomp.GetObject()
44
45 # run parametric study
46 comp.RunStudy(study._get_StudyId(), "%(param_entry)s")
47
48 # save study
49 salome.myStudyManager.SaveAs("%(output_study)s", study, False)
50 """
51
52 def generate_job(param_study, result_study_file_name, result_dir, resource):
53   """
54   Create a Launcher job using the parameters specified by the user.
55   """
56   # Save Salome study
57   ed = getStudyEditor()
58   name_wo_space = param_study.name.replace(" ", "_")
59   if ed.study._get_IsSaved():
60     input_study = ed.study._get_Name()
61     salome.myStudyManager.Save(ed.study, False)
62   else:
63     (fd, input_study) = tempfile.mkstemp(prefix = name_wo_space + "_", suffix = ".hdf")
64     os.close(fd)
65     salome.myStudyManager.SaveAs(input_study, ed.study, False)
66
67   # Generate job script
68   job_script = job_script_template % {"input_study": os.path.basename(input_study),
69                                       "param_entry": param_study.entry,
70                                       "output_study": result_study_file_name}
71   (fd, job_script_file) = tempfile.mkstemp(prefix = "job_" + name_wo_space + "_", suffix = ".py")
72   os.close(fd)
73   f = open(job_script_file, "w")
74   f.write(job_script)
75   f.close()
76   
77   # Define job parameters
78   job_params = salome.JobParameters()
79   job_params.job_name = name_wo_space
80   job_params.job_type = "python_salome"
81   job_params.job_file = job_script_file
82   job_params.in_files = [input_study]
83   job_params.out_files = [result_study_file_name]
84   job_params.result_directory = result_dir
85
86   # Add files to transfer from the computation code
87   if param_study.solver_code_type == ParametricStudy.SALOME_COMPONENT:
88     code = param_study.salome_component_name
89     comp = salome.lcc.FindOrLoadComponent("FactoryServer", code)
90     if comp is not None and hasattr(comp, "GetFilesToTransfer"):
91         (code_in_files, code_out_files) = comp.GetFilesToTransfer(ed.studyId,
92                 parse_entry(param_study.solver_case_entry))
93         job_params.in_files += code_in_files
94         job_params.out_files += code_out_files        
95
96   # Define resource parameters
97   job_params.resource_required = salome.ResourceParameters()
98   job_params.resource_required.name = resource
99   job_params.resource_required.nb_proc = param_study.nb_parallel_computations + 1
100
101   # Generate name for the working directory
102   res_manager = salome.naming_service.Resolve("/ResourcesManager")
103   res_definition = res_manager.GetResourceDefinition(resource)
104   res_work_dir = res_definition.working_directory
105   if res_work_dir != "":
106       timestr = datetime.now().ctime()
107       timestr = timestr.replace('/', '_')
108       timestr = timestr.replace('-', '_')
109       timestr = timestr.replace(':', '_')
110       timestr = timestr.replace(' ', '_')
111       work_dir = res_work_dir + "/" + job_params.job_name + "_" + timestr
112       job_params.work_directory = work_dir
113   
114   # Create Launcher job
115   launcher = salome.naming_service.Resolve('/SalomeLauncher')
116   launcher.createJob(job_params)
117
118 def parse_entry(selected_value):
119   """
120   Find entry if selected_value is something like "name (entry)"
121   """
122   entry = selected_value
123   match = re.search("\((.*)\)$", entry)
124   if match is not None:
125     entry = match.group(1)
126   return entry