From e1ffa48e3ec189986258b3e2a3c5a602dd046ab0 Mon Sep 17 00:00:00 2001
From: Wouter Peters <wouter.peters@wur.nl>
Date: Fri, 30 Jul 2010 15:09:13 +0000
Subject: [PATCH] Added the least squares minimization algebra for serial
 solutions, still to be tested

---
 da/ct/optimizer.py  | 31 +++++++++++++++++++++++++++++--
 da/tools/general.py |  3 ++-
 2 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/da/ct/optimizer.py b/da/ct/optimizer.py
index da3d7204..375cf8d7 100755
--- a/da/ct/optimizer.py
+++ b/da/ct/optimizer.py
@@ -77,8 +77,35 @@ class CtOptimizer():
 
         return None
 
-    def MinimumLeastSquares(self):
-        """ Make minimum least squares solution"""
+    def SerialMinimumLeastSquares(self):
+        """ Make minimum least squares solution by looping over obs"""
+        import numpy as np
+        import numpy .linalg as la
+
+        for n in range(self.nobs):
+
+            df_row                      = self.HX_prime[n,:]
+            QHt                         = 1./(self.nmembers-1)*np.dot(self.X_prime,df_row)
+            HQHR                        = 1./(self.nmembers-1)*(df_row*df_row).sum()+self.R[n,n]
+            K                           = QHt/HQHR
+
+            alpha                       = 1.0/(1.0+np.sqrt( (self.R[n,n])/HQHR ) )
+
+            res                         = self.obs[n]-self.Hx[n]
+
+            self.x[:]                   = self.x + K*res
+
+            for r in range(self.nmembers):
+                self.X_prime[:,r]       = self.X_prime[:,r]-alpha*K*(self.HX_prime[n,r])
+
+            for m in range(self.nobs):
+                res                     = self.obs[n]-self.Hx[n]
+                fac                     = 1.0/(self.nmembers-1)*(self.HX_prime[n,:]*self.HX_prime[m,:]).sum()/HQHR
+                self.Hx[m]              = self.Hx[m] + fac * res
+                self.HX_prime[m,:]      = self.HX_prime[m,:] - alpha*fac*self.HX_prime[n,:]
+
+    def BulkMinimumLeastSquares(self):
+        """ Make minimum least squares solution by solving matrix equations"""
         import numpy as np
         import numpy.linalg as la
 
diff --git a/da/tools/general.py b/da/tools/general.py
index bd2cbf84..d07aaa67 100755
--- a/da/tools/general.py
+++ b/da/tools/general.py
@@ -344,7 +344,8 @@ def Optimize(CycleInfo, StateVector):
 
     dummy     = optimizer.FillMatrices(StateVector )
 
-    dummy     = optimizer.MinimumLeastSquares()
+    dummy     = optimizer.BulkMinimumLeastSquares()
+    dummy     = optimizer.SerialMinimumLeastSquares()
 
     StateVector.isOptimized = True
 
-- 
GitLab