From 014bec50fb8f2222820e087da70c09553db8243b Mon Sep 17 00:00:00 2001
From: Arne Babenhauserheide <amvdw95@gmail.com>
Date: Wed, 15 Apr 2015 15:06:52 +0000
Subject: [PATCH] undid savedict rewriting to function call, because that is
 unmergeable.

---
 refactored/da/analysis/expand_fluxes.py | 279 +++++++++++++++---------
 1 file changed, 171 insertions(+), 108 deletions(-)

diff --git a/refactored/da/analysis/expand_fluxes.py b/refactored/da/analysis/expand_fluxes.py
index 8b635a1..02e50e2 100755
--- a/refactored/da/analysis/expand_fluxes.py
+++ b/refactored/da/analysis/expand_fluxes.py
@@ -50,29 +50,6 @@ def _getpriordata(DaCycle, StateVector, startdate, enddate, nlag, cyclelength):
     raise ValueError("No savestate.nc found in the possible paths:" + str(tried) + ". Likely the timeframe is no multiple of the cycle length: " + str(cyclelength) + ". startdate: " + str(startdate) + " enddate: " + str(enddate))
 
 
-def _saveInto(ncf, standardvar, data, dims, 
-              count=None, name=None, long_name=None, 
-              units=None, comment=None, nsets=None, 
-              standard_name=None):
-    """save the given data into the netcdf file using one of the StandardVars in tools/io4.py as template.
-
-    :param standardvar: The name of the standard definition to use.
-    :param count: offset for writing the data (==previous data which should not be replaced)."""
-    savedict=ncf.StandardVar(varname=standardvar)
-    savedict["values"] = data
-    savedict["dims"] = dims
-    for key, val in [("count", count),
-                     ("name", name),
-                     ("long_name", long_name),
-                     ("units", units),
-                     ("standard_name", standard_name),
-                     ("comment", comment)]:
-        if val: savedict[key] = val
-    if nsets:
-        ncf.AddData(savedict, nsets=nsets)
-    return ncf.AddData(savedict)
-    
-
 def SaveWeeklyAvg1x1Data(DaCycle, StateVector):
     """
         Function creates a NetCDF file with output on 1x1 degree grid. It uses the flux data written by the 
@@ -174,24 +151,49 @@ def SaveWeeklyAvg1x1Data(DaCycle, StateVector):
 #
 #  For each dataset, get the standard definitions from the module mysettings, add values, dimensions, and unlimited count, then write
 #
-
-            for name, data in [('bio_flux_'+qual_short, biomapped),
-                               ('ocn_flux_'+qual_short, oceanmapped),
-                               ('bio_flux_%s_cov'%qual_short, biovarmapped),
-                               ('ocn_flux_%s_cov'%qual_short, oceanvarmapped)]:
-                _saveInto(ncf, name, data.tolist(),
-                          dims=dimdate+dimgrid, count=next)
-            
+            savedict=ncf.StandardVar(varname='bio_flux_'+qual_short)
+            savedict['values']=biomapped.tolist()
+            savedict['dims']=dimdate+dimgrid
+            savedict['count']=next
+            ncf.AddData(savedict)
+#
+            savedict=ncf.StandardVar(varname='ocn_flux_'+qual_short)
+            savedict['values']=oceanmapped.tolist()
+            savedict['dims']=dimdate+dimgrid
+            savedict['count']=next
+            ncf.AddData(savedict)
+
+            savedict=ncf.StandardVar(varname='bio_flux_%s_cov'%qual_short)
+            savedict['values']=biovarmapped.tolist()
+            savedict['dims']=dimdate+dimgrid
+            savedict['count']=next
+            ncf.AddData(savedict)
+#
+            savedict=ncf.StandardVar(varname='ocn_flux_%s_cov'%qual_short)
+            savedict['values']=oceanvarmapped.tolist()
+            savedict['dims']=dimdate+dimgrid
+            savedict['count']=next
+            ncf.AddData(savedict)
 
         # End prior/posterior block
 
-        for name, data in [('fire_flux_imp', fire),
-                           ('fossil_flux_imp', fossil)]:
-            _saveInto(ncf, name, data.tolist(),
-                        dims=dimdate+dimgrid, count=next)
-
-        _saveInto(ncf, 'date', date2num(startdate)-dectime0+dt.days/2.0,
-                  dims=dimdate, count=next)
+        savedict=ncf.StandardVar(varname='fire_flux_imp')
+        savedict['values']=fire.tolist()
+        savedict['dims']=dimdate+dimgrid
+        savedict['count']=next
+        ncf.AddData(savedict)
+#
+        savedict=ncf.StandardVar(varname='fossil_flux_imp')
+        savedict['values']=fossil.tolist()
+        savedict['dims']=dimdate+dimgrid
+        savedict['count']=next
+        ncf.AddData(savedict)
+#
+        savedict=ncf.StandardVar(varname='date')
+        savedict['values']=date2num(startdate)-dectime0+dt.days/2.0
+        savedict['dims']=dimdate
+        savedict['count']=next
+        ncf.AddData(savedict)
 
         sys.stdout.write('.')
         sys.stdout.flush()
@@ -299,7 +301,16 @@ def SaveWeeklyAvgStateData(DaCycle, StateVector):
 
             if prior:
                 qual_short='prior'
-                dummy, dummy, choicelag = _getpriordata(DaCycle, StateVector, startdate, enddate, nlag, cyclelength=dt.days)
+                for n in range(nlag,0,-1):
+                    priordate       = enddate - timedelta(dt.days*n)
+                    savedir         = DaCycle['dir.output'].replace(startdate.strftime('%Y%m%d'),priordate.strftime('%Y%m%d') )
+                    filename        = os.path.join(savedir,'savestate.nc')
+                    if os.path.exists(filename):
+                        dummy                   = StateVector.ReadFromFile(filename)
+                        choicelag               = n
+
+                        msg = 'Read prior dataset from file %s, sds %d: '%(filename,n) ; logging.debug(msg)
+                        break
             else:
                 qual_short='opt'
                 savedir                 = DaCycle['dir.output']
@@ -313,50 +324,83 @@ def SaveWeeklyAvgStateData(DaCycle, StateVector):
 #
             data                = StateVector.EnsembleMembers[choicelag-1][0].ParameterValues*vectorbio # units of mole region-1 s-1
 
-            _saveInto(ncf, 'bio_flux_%s'%qual_short, data,
-                      dims=dimdate+dimregs, count=next)
+            savedict            = ncf.StandardVar(varname='bio_flux_%s'%qual_short)
+            savedict['values']  = data
+            savedict['dims']    = dimdate+dimregs
+            savedict['count']   = next
+            ncf.AddData(savedict)
 
             members             = StateVector.EnsembleMembers[choicelag-1] 
             deviations          = np.array([mem.ParameterValues*data for mem in members])
 
-            _saveInto(ncf, 'bio_flux_%s_cov'%qual_short, deviations.tolist(),
-                      dims=dimdate+dimmembers+dimregs, count=next,
-                      units="mol region-1 s-1",
-                      comment="This is the matrix square root, use (M x M^T)/(nmembers-1) to make covariance")
-
-            _saveInto(ncf, 'unknown', deviations.std(axis=0),
-                      dims=dimdate+dimregs, count=next,
-                      name = 'bio_flux_%s_std'%qual_short,
-                      long_name = 'Biosphere flux standard deviation, %s'%qual_short,
-                      comment = "This is the standard deviation on each parameter",
-                      units = "mol region-1 s-1")
+            savedict=ncf.StandardVar(varname='bio_flux_%s_cov'%qual_short)
+
+            savedict['values']=deviations.tolist()
+            savedict['dims']=dimdate+dimmembers+dimregs
+            savedict['comment']="This is the matrix square root, use (M x M^T)/(nmembers-1) to make covariance"
+            savedict['units']="mol region-1 s-1"
+            savedict['count']=next
+            ncf.AddData(savedict)
+
+            savedict=ncf.StandardVar('unknown')
+            savedict['name'] = 'bio_flux_%s_std'%qual_short
+            savedict['long_name'] = 'Biosphere flux standard deviation, %s'%qual_short
+            savedict['values']=deviations.std(axis=0)
+            savedict['dims']=dimdate+dimregs
+            savedict['comment']="This is the standard deviation on each parameter"
+            savedict['units']="mol region-1 s-1"
+            savedict['count']=next
+            ncf.AddData(savedict)
 
             data                = StateVector.EnsembleMembers[choicelag-1][0].ParameterValues*vectorocn # units of mole region-1 s-1
 
-            _saveInto(ncf, 'ocn_flux_%s'%qual_short, data,
-                      dims=dimdate+dimregs, count=next)
+            savedict=ncf.StandardVar(varname='ocn_flux_%s'%qual_short)
+            savedict['values']=data
+            savedict['dims']=dimdate+dimregs
+            savedict['count']=next
+            ncf.AddData(savedict)
 
             deviations          = np.array([mem.ParameterValues*data for mem in members])
 
-            _saveInto(ncf, 'ocn_flux_%s_cov'%qual_short, deviations.tolist(),
-                      dims=dimdate+dimmembers+dimregs, count=next,
-                      comment="This is the matrix square root, use (M x M^T)/(nmembers-1) to make covariance",
-                      units="mol region-1 s-1")
-
-            _saveInto(ncf, 'unknown', deviations.std(axis=0),
-                      dims=dimdate+dimregs, count=next,
-                      name = 'ocn_flux_%s_std'%qual_short,
-                      long_name = 'Ocean flux standard deviation, %s'%qual_short,
-                      comment = "This is the standard deviation on each parameter",
-                      units = "mol region-1 s-1")
-
-        for name, data in [('fire_flux_imp', vectorfire),
-                           ('fossil_flux_imp', vectorfossil)]:
-            _saveInto(ncf, name, data,
-                      dims=dimdate+dimregs, count=next)
-
-        _saveInto(ncf, 'date', ncfdate,
-                  dims=dimdate, count=next)
+            savedict=ncf.StandardVar(varname='ocn_flux_%s_cov'%qual_short)
+            savedict['values']=deviations.tolist()
+            savedict['dims']=dimdate+dimmembers+dimregs
+            savedict['comment']="This is the matrix square root, use (M x M^T)/(nmembers-1) to make covariance"
+            savedict['units']="mol region-1 s-1"
+            savedict['count']=next
+            ncf.AddData(savedict)
+
+            savedict=ncf.StandardVar('unknown')
+            savedict['name'] = 'ocn_flux_%s_std'%qual_short
+            savedict['long_name'] = 'Ocean flux standard deviation, %s'%qual_short
+            savedict['values']=deviations.std(axis=0)
+            savedict['dims']=dimdate+dimregs
+            savedict['comment']="This is the standard deviation on each parameter"
+            savedict['units']="mol region-1 s-1"
+            savedict['count']=next
+            ncf.AddData(savedict)
+
+        data                = vectorfire
+
+        savedict=ncf.StandardVar(varname='fire_flux_imp')
+        savedict['values']=data
+        savedict['dims']=dimdate+dimregs
+        savedict['count']=next
+        ncf.AddData(savedict)
+
+        data                = vectorfossil
+
+        savedict=ncf.StandardVar(varname='fossil_flux_imp')
+        savedict['values']=data
+        savedict['dims']=dimdate+dimregs
+        savedict['count']=next
+        ncf.AddData(savedict)
+
+        savedict=ncf.StandardVar(varname='date')
+        savedict['values']  = ncfdate
+        savedict['dims']    = dimdate
+        savedict['count']   = next
+        ncf.AddData(savedict)
 
         sys.stdout.write('.')
         sys.stdout.flush()
@@ -456,8 +500,11 @@ def SaveWeeklyAvgTCData(DaCycle, StateVector):
 
         # First add the date for this cycle to the file, this grows the unlimited dimension
 
-        _saveInto(ncf, 'date', ncfdate,
-                  dims=dimdate, count=index)
+        savedict            = ncf.StandardVar(varname='date')
+        savedict['values']  = ncfdate
+        savedict['dims']    = dimdate
+        savedict['count']   = index
+        dummy               = ncf.AddData(savedict)
 
         # Now convert other variables that were inside the flux_1x1 file
 
@@ -466,24 +513,31 @@ def SaveWeeklyAvgTCData(DaCycle, StateVector):
 
             data    = ncf_in.GetVariable(vname)[index]
 
+            savedict            = ncf.StandardVar(varname=vname)
+
             if vname=='latitude': continue
             elif vname=='longitude': continue
             elif vname=='date': continue
             elif vname=='idate': continue
             elif 'cov' in vname:
+                
                 #AB? Only works with recent version of numpy, not with 1.4.1 installed on the suns
                 #cov                 = data.transpose().dot(data) 
                 cov                 = np.dot(data.transpose(),data)
                 tcdata              = StateVector.VectorToTC(vectordata=cov,cov=True) # vector to TC
-                units   = '[mol/region/s]**2'
-                dims    = dimdate+dimregs+dimregs    
+
+                savedict['units']   = '[mol/region/s]**2'
+                savedict['dims']    = dimdate+dimregs+dimregs
+                
             else:
+
                 tcdata              = StateVector.VectorToTC(vectordata=data) # vector to TC
-                dims    = dimdate+dimregs
-                units   = 'mol/region/s'
 
-            _saveInto(ncf, vname, tcdata,
-                      dims=dims, units=units)
+                savedict['dims']    = dimdate+dimregs
+                savedict['units']   = 'mol/region/s'
+
+            savedict['values']  = tcdata
+            ncf.AddData(savedict)
 
         ncf_in.close()
     ncf.close()
@@ -545,10 +599,12 @@ def SaveTCDataExt(rundat):
                     dims=dimdate+dimregs
 
         print vname,data.shape
-        _saveInto(ncf, vname, data.tolist(),
-                  dims=dims, count=0,
-                  units='mol/region/s',
-                  nsets=data.shape[0])
+        savedict            = ncf.StandardVar(varname=vname)
+        savedict['values']  = data.tolist()
+        savedict['dims']    = dims
+        savedict['units']   = 'mol/region/s'
+        savedict['count']   = 0
+        ncf.AddData(savedict,nsets=data.shape[0])
          
     ncf.close()
 
@@ -601,10 +657,11 @@ def SaveEcoDataExt(rundat):
         else:
              print 'Dataset with unknown dimensions encountered in file: %s'%vname
 
-        _saveInto(ncf, vname, data.tolist(),
-                  dims=dims,
-                  units=atts['units'],
-                  nsets=data.shape[0])
+        savedict=ncf.StandardVar(varname=vname)
+        savedict['units']=atts['units']
+        savedict['values']=data.tolist()
+        savedict['dims']=dims
+        ncf.AddData(savedict,nsets=data.shape[0])
          
     ncf.close()
 
@@ -695,16 +752,18 @@ def SaveTimeAvgData(rundat,infile,avg='monthly'):
 
         if ncf.StandardVar(sds)['name'] == 'unknown':
 
-            invar = file.variables[sds]
-            _saveInto(ncf, sds, data.tolist(),
-                      dims=dims, count=0,
-                      name=sds,
-                      units=invar.units,
-                      long_name=invar.long_name,
-                      comment=invar.comment,
-                      standard_name=invar.standard_name)
-            sys.stdout.write('.')
-            sys.stdout.flush()
+                savedict                    = ncf.StandardVar(sds)
+                savedict['name']            = sds
+                savedict['values']          = data.tolist()
+                savedict['dims']            = dims
+                savedict['units']           = file.variables[sds].units
+                savedict['long_name']       = file.variables[sds].long_name
+                savedict['comment']         = file.variables[sds].comment
+                savedict['standard_name']   = file.variables[sds].standard_name
+                savedict['count']           =0
+                ncf.AddData(savedict)
+                sys.stdout.write('.')
+                sys.stdout.flush()
 
         else:
 
@@ -728,18 +787,22 @@ def SaveTimeAvgData(rundat,infile,avg='monthly'):
                 count=count+1
 
                 if not ncf.has_date(date2num(dd)-dectime0): 
-                    _saveInto(ncf, 'date', date2num(dd)-dectime0,
-                              dims=dimdate, count=count)
 
-                units=file.variables[sds].units
+                    savedict=ncf.StandardVar('date')
+                    savedict['values']=date2num(dd)-dectime0
+                    savedict['dims']=dimdate
+                    savedict['count']=count
+                    ncf.AddData(savedict)
+
+                savedict=ncf.StandardVar(sds)
+                savedict['values']=data.tolist()
+                savedict['units']=file.variables[sds].units
                 if 'cov' in sds: 
-                    dimstmp=dimdate+dims+dims
+                    savedict['dims']=dimdate+dims+dims
                 else:
-                    dimstmp=dimdate+dims
-
-                _saveInto(ncf, sds, data.tolist(),
-                          dims=dimstmp, count=count,
-                          units=units)
+                    savedict['dims']=dimdate+dims
+                savedict['count']=count
+                ncf.AddData(savedict)
 
                 sys.stdout.write('.')
                 sys.stdout.flush()
-- 
GitLab