Salome HOME
Copyright update 2022
[samples/genericsolver.git] / src / GENERICSOLVER / DEVIATION.py
index 7df999a39c1362f97b8681aed4a19defefdd4090..c725e929dbb331340f8d9c63e2bb0bb962bf3dbb 100644 (file)
@@ -1,40 +1,47 @@
-#  Copyright (C) 2009-2010 EDF R&D
+# Copyright (C) 2009-2022  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
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
 #
-#  This library 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
-#  Lesser General Public License for more details.
+# This library 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
+# Lesser General Public License for more details.
 #
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 #
-#  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-#
-#  $Id$
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
 
+import inspect
 import logging
+import os
+import platform
 import threading
-import inspect
 import traceback
 
-import salome
+from salome.gui.helper import sgPyQt
+from salome.kernel import termcolor
+from salome.kernel.logger import Logger
+from salome.kernel.parametric.compo_utils import \
+    create_input_dict, create_normal_parametric_output, create_error_parametric_output
 import GENERICSOLVER_ORB__POA
+import SALOME
 import SALOME_ComponentPy
 import SALOME_DriverPy
-import SALOME
+import SALOME_Embedded_NamingService_ClientPy
+import _thread
+import salome
 
-from pal.logger import Logger
-from pal import termcolor
-logger = Logger("DEVIATION", color = termcolor.RED_FG)
+
+logger = Logger("DEVIATION", color=termcolor.RED_FG)
 logger.setLevel(logging.INFO)
 
+
 VARIABLE_ID = 1030
 
 ###
@@ -73,14 +80,14 @@ def getValueOfVariable( builder, varobj ):
 def getSubSObjectByName( studyId, sobjFather, childName ):
     logger.debug("GENERICSOLVER.getSubSObjectByName Looking for sobjet named " + childName)
     study = salome.myStudyManager.GetStudyByID( studyId )
-    iter = study.NewChildIterator( sobjFather )
+    iterator = study.NewChildIterator(sobjFather)
     #builder = study.NewBuilder()
-    while iter.More():
-        sobj = iter.Value()
+    while iterator.More():
+        sobj = iterator.Value()
         logger.debug("GENERICSOLVER.getSubSObjectByName Got sobjet named " + sobj.GetName())
         if sobj.GetName() == childName:
             return sobj
-        iter.Next()
+        iterator.Next()
         pass
     return None
 
@@ -101,16 +108,22 @@ class DEVIATION(GENERICSOLVER_ORB__POA.DEVIATION_Gen,
     """
     def __init__ ( self, orb, poa, contID, containerName, instanceName, 
                    interfaceName ):
-        logger.info("DEVIATION.__init__: " + containerName + ' ; ' + instanceName)
+        logger.info("__init__: " + containerName + ' ; ' + instanceName)
         SALOME_ComponentPy.SALOME_ComponentPy_i.__init__(self, orb, poa,
-                    contID, containerName, instanceName, interfaceName, 0)
+                    contID, containerName, instanceName, interfaceName, False)
         SALOME_DriverPy.SALOME_DriverPy_i.__init__(self, interfaceName)
         # On stocke dans l'attribut _naming_service, une reference sur
         # le Naming Service CORBA
-        self._naming_service = SALOME_ComponentPy.SALOME_NamingServicePy_i( self._orb )
-        self.inputVarList = None
-        self.outputVarList = None
-        self.evalPoint = None
+        #self._naming_service = SALOME_ComponentPy.SALOME_NamingServicePy_i( self._orb )
+        #
+        emb_ns = self._contId.get_embedded_NS_if_ssl()
+        import CORBA
+        if CORBA.is_nil(emb_ns):
+            self._naming_service = SALOME_ComponentPy.SALOME_NamingServicePy_i( self._orb )
+        else:
+            self._naming_service = SALOME_Embedded_NamingService_ClientPy.SALOME_Embedded_NamingService_ClientPy(emb_ns)
+        #
+        self.deterministicValues = {}
 
 ######################################################################
 # This is the Wrapper part of the GENERICSOLVER module, ie
@@ -127,54 +140,63 @@ 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, inputVarList, outputVarList, 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("DEVIATION.Init: " + self._containerName +
-                        ' ; ' + self._instanceName)
+            logger.info("Init: " + self._getIdMessage())
             DEVIATION.lock.acquire()
             salome.salome_init()
             DEVIATION.lock.release()
 
-            self.inputVarList = inputVarList
-            self.outputVarList = outputVarList
-            self.evalPoint = GetDataFromCase(studyId, caseEntry)
-            logger.debug("inputVarList: %s" % self.inputVarList)
-            logger.debug("outputVarList: %s" % self.outputVarList)
-            logger.debug("evalPoint: %s" % self.evalPoint)
+            self.deterministicValues = GetDataFromCase(studyId, detCaseEntry)
+            logger.debug("deterministic values: %s" % self.deterministicValues)
         except:
             self._raiseSalomeError()
 
-    def Exec(self, inPoint):
+    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("DEVIATION.Exec: " + self._containerName +
-                        ' ; ' + self._instanceName)
-            if self.inputVarList is None:
-                raise Exception("Init not run")
-            if len(inPoint) != len(self.inputVarList):
-                raise Exception("Size mismatch between inputVarList and point to evaluate")
-
-            logger.debug("DEVIATION.Exec (1): inPoint  = %s" % inPoint)
-            for i in range(len(self.inputVarList)):
-                self.evalPoint[self.inputVarList[i]] = inPoint[i]
-            logger.debug("evalPoint = %s" % self.evalPoint)
-
-            resDict = {}
-            resDict["dev"] = self.BeamModel(**self.evalPoint)
-
-            outPoint = []
-            for outputVar in self.outputVarList:
-                outPoint.append(resDict[outputVar])
-            logger.debug("DEVIATION.Exec (2): outPoint = %s" % outPoint)
-            return outPoint
+            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 and execution mode
+            id = ""
+            exec_mode = ""
+            for parameter in paramInput.specificParameters:
+                if parameter.name == "id":
+                    id = parameter.value
+                if parameter.name == "executionMode":
+                    exec_mode = parameter.value
+            logger.debug("ID: %s" % id)
+            logger.debug("Execution mode: %s" % exec_mode)
+
+            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()
 
@@ -184,10 +206,24 @@ class DEVIATION(GENERICSOLVER_ORB__POA.DEVIATION_Gen,
         It cleans everything set so far.
         """
         try:
-            logger.info("DEVIATION.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.
@@ -201,5 +237,5 @@ class DEVIATION(GENERICSOLVER_ORB__POA.DEVIATION_Gen,
        deviation = ( Force * Length^3 ) / ( 3 * YoungModulus * InertiaSection )
        """
        d = (F * L * L * L) / (3. * E * I)
-       logger.debug("DEVIATION.BeamModel (E=%g, F=%g, L=%g, I=%g) = %g" % (E, F, L, I, d))
+       logger.debug("BeamModel (E=%g, F=%g, L=%g, I=%g) = %g" % (E, F, L, I, d))
        return d