Salome HOME
Ajout de l'algorithme NonLinearLeastSquares et correction des autres
[modules/adao.git] / src / daComposant / daAlgorithms / 3DVAR.py
index bc17491790e7891d82b7bd29b755c63fc56ac7f8..48127504105879317a9069d90e2ceb6ce22c0ad7 100644 (file)
@@ -66,13 +66,24 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         #
         # Calcul de l'innovation
         # ----------------------
+        if Y.size != HXb.size:
+            raise ValueError("The size %i of observations Y and %i of observed calculation H(X) are different, they have to be identical."%(Y.size,HXb.size))
+        if max(Y.shape) != max(HXb.shape):
+            raise ValueError("The shapes %s of observations Y and %s of observed calculation H(X) are different, they have to be identical."%(Y.shape,HXb.shape))
         d  = Y - HXb
         logging.debug("%s Innovation d = %s"%(self._name, d))
         #
         # Précalcul des inversion appellée dans les fonction-coût et gradient
         # -------------------------------------------------------------------
-        BI = B.I
-        RI = R.I
+        if B is not None:
+            BI = B.I
+        elif Parameters["B_scalar"] is not None:
+            BI = 1.0 / Parameters["B_scalar"]
+        #
+        if R is not None:
+            RI = R.I
+        elif Parameters["R_scalar"] is not None:
+            RI = 1.0 / Parameters["R_scalar"]
         #
         # Définition de la fonction-coût
         # ------------------------------
@@ -135,10 +146,10 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         logging.debug("%s Nombre maximal de pas d'optimisation = %s"%(self._name, str(maxiter)))
         if Parameters.has_key("CostDecrementTolerance") and (Parameters["CostDecrementTolerance"] > 0):
             ftol  = float(Parameters["CostDecrementTolerance"])
-            factr = 1./ftol
+            factr = ftol * 1.e14
         else:
             ftol  = 1.e-7
-            factr = 1./ftol
+            factr = ftol * 1.e14
         logging.debug("%s Diminution relative minimale du cout lors de l'arret = %s"%(self._name, str(1./factr)))
         if Parameters.has_key("ProjectedGradientTolerance") and (Parameters["ProjectedGradientTolerance"] > -1):
             pgtol = float(Parameters["ProjectedGradientTolerance"])
@@ -152,11 +163,10 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
         logging.debug("%s Maximum des composantes du gradient lors de l'arret = %s"%(self._name, str(gtol)))
         InnerMinimizerList = ["CG", "NCG", "BFGS"]
         if Parameters.has_key("InnerMinimizer") and (Parameters["InnerMinimizer"] in InnerMinimizerList):
-            InnerMinimizer = str( Parameters["Minimizer"] )
+            InnerMinimizer = str( Parameters["InnerMinimizer"] )
         else:
             InnerMinimizer = "BFGS"
         logging.debug("%s Minimiseur interne utilisé = %s"%(self._name, InnerMinimizer))
-        logging.debug("%s Norme du gradient lors de l'arret = %s"%(self._name, str(gtol)))
         #
         # Minimisation de la fonctionnelle
         # --------------------------------
@@ -167,7 +177,7 @@ class ElementaryAlgorithm(BasicObjects.Algorithm):
                 fprime      = GradientOfCostFunction,
                 args        = (),
                 bounds      = Bounds,
-                maxfun      = maxiter,
+                maxfun      = maxiter-1,
                 factr       = factr,
                 pgtol       = pgtol,
                 iprint      = iprint,