1 # Copyright (C) 2012-2013 EDF
3 # This file is part of SALOME PARAMETRIC module.
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.
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.
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/>.
21 from datetime import datetime
24 from salome.kernel.studyedit import getStudyEditor
25 from study import ParametricStudy
27 job_script_template = """#!/usr/bin/env python
30 from salome.kernel.studyedit import getStudyEditor
36 study = salome.myStudyManager.Open("%(input_study)s")
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()
45 # run parametric study
46 comp.RunStudy(study._get_StudyId(), "%(param_entry)s")
49 salome.myStudyManager.SaveAs("%(output_study)s", study, False)
52 def generate_job(param_study, result_study_file_name, result_dir, resource):
54 Create a Launcher job using the parameters specified by the user.
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)
63 (fd, input_study) = tempfile.mkstemp(prefix = name_wo_space + "_", suffix = ".hdf")
65 salome.myStudyManager.SaveAs(input_study, ed.study, False)
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")
73 f = open(job_script_file, "w")
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
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
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
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
114 # Create Launcher job
115 launcher = salome.naming_service.Resolve('/SalomeLauncher')
116 launcher.createJob(job_params)
118 def parse_entry(selected_value):
120 Find entry if selected_value is something like "name (entry)"
122 entry = selected_value
123 match = re.search("\((.*)\)$", entry)
124 if match is not None:
125 entry = match.group(1)