Salome HOME
Add parameter 'id' in log of Exec method
[samples/genericsolver.git] / src / GENERICSOLVER / DEVIATION.py
index 8d1a37c91ec69cdcebf31bcf60955304aa30fca8..88d864d4e8b9abc55c37e3009b00140f6778ed9b 100644 (file)
@@ -1,4 +1,4 @@
-#  Copyright (C) 2009-2010 EDF R&D
+#  Copyright (C) 2009-2011 EDF R&D
 #
 #  This library is free software; you can redistribute it and/or
 #  modify it under the terms of the GNU Lesser General Public
 #  $Id$
 #
 
+import os
 import logging
 import threading
 import inspect
 import traceback
+import platform
+import thread
 
 import salome
 import GENERICSOLVER_ORB__POA
@@ -30,11 +33,14 @@ import SALOME_ComponentPy
 import SALOME_DriverPy
 import SALOME
 
-from pal.logger import Logger
-from pal import termcolor
+from salome.kernel.logger import Logger
+from salome.kernel import termcolor
 logger = Logger("DEVIATION", color = termcolor.RED_FG)
 logger.setLevel(logging.INFO)
 
+from salome.kernel.parametric.compo_utils import \
+    create_input_dict, create_normal_parametric_output, create_error_parametric_output
+
 VARIABLE_ID = 1030
 
 ###
@@ -125,49 +131,59 @@ class DEVIATION(GENERICSOLVER_ORB__POA.DEVIATION_Gen,
         exc = SALOME.ExceptionStruct(SALOME.INTERNAL_ERROR, message,
                                      inspect.stack()[1][1], inspect.stack()[1][2])
         raise SALOME.SALOME_Exception(exc)
+    
+    def _getIdMessage(self):
+        return "%s in container %s running on %s, process %d, thread %d" % \
+               (self._instanceName, self._containerName,
+                platform.node(), os.getpid(), thread.get_ident())
 
-    def Init(self, studyId, caseEntry):
+    def Init(self, studyId, detCaseEntry):
         """
         This method is an example for the initialization of a computation component for
         use with OpenTURNS in SALOME 5.1.5 and later (for YACS integration)
         """
         try:
-            logger.info("Init: " + self._containerName + ' ; ' + self._instanceName)
+            logger.info("Init: " + self._getIdMessage())
             DEVIATION.lock.acquire()
             salome.salome_init()
             DEVIATION.lock.release()
 
-            self.deterministicValues = GetDataFromCase(studyId, caseEntry)
+            self.deterministicValues = GetDataFromCase(studyId, detCaseEntry)
             logger.debug("deterministic values: %s" % self.deterministicValues)
         except:
             self._raiseSalomeError()
 
-    def Exec(self, inputDesc):
+    def Exec(self, paramInput):
         """
         This method is an example for the execution of a computation component for
         use with OpenTURNS in SALOME 5.1.5 and later (for YACS integration)
         """
         try:
-            logger.info("Exec: " + self._containerName + ' ; ' + self._instanceName)
-            logger.debug("inputVarList: %s" % inputDesc.inputVarList)
-            logger.debug("outputVarList: %s" % inputDesc.outputVarList)
-            logger.debug("inputValues: %s" % inputDesc.inputValues)
-            if len(inputDesc.inputValues) != len(inputDesc.inputVarList):
-                raise Exception("Size mismatch between inputVarList and point to evaluate")
-
-            evalPoint = self.deterministicValues
-            for i in range(len(inputDesc.inputVarList)):
-                evalPoint[inputDesc.inputVarList[i]] = inputDesc.inputValues[i][0]
-            logger.debug("evalPoint = %s" % evalPoint)
-
-            resDict = {}
-            resDict["dev"] = self.BeamModel(**evalPoint)
-
-            outputValues = []
-            for outputVar in inputDesc.outputVarList:
-                outputValues.append([resDict[outputVar]])
-            logger.debug("outputValues: %s" % outputValues)
-            return outputValues
+            logger.info("Exec: " + self._getIdMessage())
+            logger.debug("inputVarList: %s" % paramInput.inputVarList)
+            logger.debug("outputVarList: %s" % paramInput.outputVarList)
+            logger.debug("inputValues: %s" % paramInput.inputValues)
+
+            # Get id
+            id = ""
+            for parameter in paramInput.specificParameters:
+                if parameter.name == "id":
+                    id = parameter.value
+            logger.debug("ID: %s" % id)
+
+            inputDict = create_input_dict(self.deterministicValues, paramInput)
+            logger.debug("inputDict = %s" % inputDict)
+            
+            # Test for an invalid parameter and return an error in this case
+            if inputDict["L"] <= 0:
+                return create_error_parametric_output("Invalid value: L must be positive")
+
+            outputDict = {}
+            outputDict["dev"] = self.BeamModel(**inputDict)
+
+            paramOutput = create_normal_parametric_output(outputDict, paramInput)
+            logger.debug("outputValues: %s" % paramOutput.outputValues)
+            return paramOutput
         except:
             self._raiseSalomeError()
 
@@ -177,10 +193,24 @@ class DEVIATION(GENERICSOLVER_ORB__POA.DEVIATION_Gen,
         It cleans everything set so far.
         """
         try:
-            logger.info("Finalize: " + self._containerName + ' ; ' + self._instanceName)
+            logger.info("Finalize: " + self._getIdMessage())
         except:
             self._raiseSalomeError()
-        
+
+    def GetFilesToTransfer(self, studyId, detCaseEntry):
+        """
+        This method can be used to specify files to transfer to the
+        computation resource. It is not useful for DEVIATION since it only
+        uses values from Salome study.
+        """
+        try:
+            logger.info("GetFilesToTransfer: " + self._getIdMessage())
+            inputFiles = []
+            outputFiles = []
+            return (inputFiles, outputFiles)
+        except:
+            self._raiseSalomeError()
+
 ######################################################################
 # This is the computation part of the GENERICSOLVER module, ie
 # the following method realizes what the solver is intended to do.