1 #-*-coding:iso-8859-1-*-
2 # Copyright (C) 2010 EDF R&D
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 # Author : André RIBES (EDF R&D)
30 from daYacsSchemaCreator.infos_daComposant import *
32 def create_yacs_proc(study_config):
34 logging.debug("[create_yacs_proc]")
37 SALOMERuntime.RuntimeSALOME_setRuntime()
38 l = loader.YACSLoader()
39 l.registerProcCataLoader()
40 runtime = pilot.getRuntime()
42 catalogAd = runtime.loadCatalog("proc", os.environ["DATASSIM_ROOT_DIR"] + "/share/salome/resources/datassim/DATASSIMSchemaCatalog.xml")
44 logging.fatal("Exception in loading DataAssim YACS catalog")
48 # Starting creating proc
49 proc = runtime.createProc("proc")
50 proc.setTypeCode("pyobj", runtime.getTypeCode("pyobj"))
51 t_pyobj = proc.getTypeCode("pyobj")
52 t_string = proc.getTypeCode("string")
54 # Step 0: create AssimilationStudyObject
55 factory_CAS_node = catalogAd._nodeMap["CreateAssimilationStudy"]
56 CAS_node = factory_CAS_node.cloneNode("CreateAssimilationStudy")
57 CAS_node.getInputPort("Name").edInitPy(study_config["Name"])
58 CAS_node.getInputPort("Algorithm").edInitPy(study_config["Algorithm"])
59 proc.edAddChild(CAS_node)
61 # Step 1: get input data from user configuration
63 for key in study_config.keys():
65 data_config = study_config[key]
67 key_type = key + "Type"
69 if data_config["Type"] == "Vector" and data_config["From"] == "String":
71 factory_back_node = catalogAd._nodeMap["CreateNumpyVectorFromString"]
72 back_node = factory_back_node.cloneNode("Get" + key)
73 back_node.getInputPort("vector_in_string").edInitPy(data_config["Data"])
74 proc.edAddChild(back_node)
75 # Connect node with CreateAssimilationStudy
76 CAS_node.edAddInputPort(key, t_pyobj)
77 CAS_node.edAddInputPort(key_type, t_string)
78 proc.edAddDFLink(back_node.getOutputPort("vector"), CAS_node.getInputPort(key))
79 proc.edAddDFLink(back_node.getOutputPort("type"), CAS_node.getInputPort(key_type))
81 if data_config["Type"] == "Matrix" and data_config["From"] == "String":
83 factory_back_node = catalogAd._nodeMap["CreateNumpyMatrixFromString"]
84 back_node = factory_back_node.cloneNode("Get" + key)
85 back_node.getInputPort("matrix_in_string").edInitPy(data_config["Data"])
86 proc.edAddChild(back_node)
87 # Connect node with CreateAssimilationStudy
88 CAS_node.edAddInputPort(key, t_pyobj)
89 CAS_node.edAddInputPort(key_type, t_string)
90 proc.edAddDFLink(back_node.getOutputPort("matrix"), CAS_node.getInputPort(key))
91 proc.edAddDFLink(back_node.getOutputPort("type"), CAS_node.getInputPort(key_type))
94 # Step 3: create compute bloc
95 compute_bloc = runtime.createBloc("compute_bloc")
96 proc.edAddChild(compute_bloc)
97 proc.edAddCFLink(CAS_node, compute_bloc)
99 if AlgoType[study_config["Algorithm"]] == "Direct":
100 # We don't need to use an optimizer loop
101 factory_execute_node = catalogAd._nodeMap["SimpleExecuteDirectAlgorithm"]
102 execute_node = factory_execute_node.cloneNode("Execute" + study_config["Algorithm"])
103 compute_bloc.edAddChild(execute_node)
104 proc.edAddDFLink(CAS_node.getOutputPort("Study"), execute_node.getInputPort("Study"))
106 # Step 4: create post-processing from user configuration
107 if "Analysis" in study_config.keys():
108 analysis_config = study_config["Analysis"]
109 if analysis_config["From"] == "String":
110 factory_analysis_node = catalogAd._nodeMap["SimpleUserAnalysis"]
111 analysis_node = factory_analysis_node.cloneNode("User Analysis")
112 default_script = analysis_node.getScript()
113 final_script = default_script + analysis_config["Data"]
114 analysis_node.setScript(final_script)
115 proc.edAddChild(analysis_node)
116 proc.edAddCFLink(compute_bloc, analysis_node)
117 proc.edAddDFLink(execute_node.getOutputPort("Study"), analysis_node.getInputPort("Study"))
119 elif analysis_config["From"] == "File":
120 factory_analysis_node = catalogAd._nodeMap["SimpleUserAnalysis"]
121 analysis_node = factory_analysis_node.cloneNode("User Analysis")
122 default_script = analysis_node.getScript()
123 if not os.path.exists(analysis_config["Data"]):
124 logging.fatal("Analysis source file does not exists ! :" + str(analysis_config["Data"]))
127 analysis_file = open(analysis_config["Data"], 'r')
129 logging.fatal("Exception in openng analysis file : " + str(analysis_config["Data"]))
130 traceback.print_exc()
132 file_text = analysis_file.read()
133 final_script = default_script + file_text
134 analysis_node.setScript(final_script)
135 proc.edAddChild(analysis_node)
136 proc.edAddCFLink(compute_bloc, analysis_node)
137 proc.edAddDFLink(execute_node.getOutputPort("Study"), analysis_node.getInputPort("Study"))
143 def write_yacs_proc(proc, yacs_schema_filename):
145 proc.saveSchema(yacs_schema_filename)