From f345c661ff2495ad34f5d379b40c9e3a9c7b328e Mon Sep 17 00:00:00 2001
From: weihe <amvdw95@gmail.com>
Date: Fri, 17 Mar 2017 08:59:16 +0000
Subject: [PATCH] revised additive scheme

---
 da/stilt/stilt.co2.simu.2015.Sep.fpbc.r | 114 +++++++++++-------------
 1 file changed, 54 insertions(+), 60 deletions(-)

diff --git a/da/stilt/stilt.co2.simu.2015.Sep.fpbc.r b/da/stilt/stilt.co2.simu.2015.Sep.fpbc.r
index e7324882..fe40eb0a 100755
--- a/da/stilt/stilt.co2.simu.2015.Sep.fpbc.r
+++ b/da/stilt/stilt.co2.simu.2015.Sep.fpbc.r
@@ -24,7 +24,7 @@ procs= as.integer(args[1])
 #inputs and outputs
 stiltfile = paste("stilt_",procs,".rc", sep="")
 
-curdir="/Storage/CO2/wei/test_4p_bc/ctdas-stilt-newBCfp-air+sur-flux+BC-revisedR-locsur/exec/da/stilt/"
+curdir="/Storage/CO2/wei/test_additive_fluxfac/ctdas-stilt-base-covL1000new-moreairsites-airlocR/exec/da/stilt/"
 fn=paste(curdir, stiltfile,sep="")
 conf=as.matrix(read.table(fn,header=FALSE))
 
@@ -52,10 +52,10 @@ ztop=0                         #upper vertical bound for influence projection, i
 #if ztop set to zero, *surface* influence will be calculated
 
 #set up an equivalent domain among footprints,fluxes, but not CO2 boundary 
-ncol2=66                       #number of pixels in x directions in grid 
-nrow2=40                       #number of pixels in y directions in grid 
-LLLon2=(-129)                  #lower left corner of grid 
-LLLat2=22                      #lower left corner of grid 
+ncol2=120  #66                       #number of pixels in x directions in grid 
+nrow2=70   #40                       #number of pixels in y directions in grid 
+LLLon2=-169.5  #(-129)                  #lower left corner of grid 
+LLLat2=10.5    #22                      #lower left corner of grid 
 ResLon2=1                      #resolution in degrees longitude 
 ResLat2=1                      #resolution in degrees latitude 
 
@@ -119,23 +119,16 @@ for(i in 0:(nsam-1))    #parameters.000.2010010100_2010011100.nc
   
   if (b1<b0)   #b1==b0, revise on Aug 5,2015
   {
-    scalefacarr1[,,i+1] = 1
+    scalefacarr1[,,i+1] = 0
     scalefacarr_bc1[,i+1] = 0
   }
   if (b1>=b0)  #b1>b0
   {
     ncf <- nc_open(paste(samdir,"parameters.",ii,".",tb1,"00","_",tb2,"00",".nc",sep="")) 
-    scalefac <- ncvar_get(ncf,"parametermap",start=c(52,113),count=c(ncol2,nrow2))   #real52:117,113:152,start=c(52,113),count=c(66,40)
-    scalefacarr1[,,i+1] = scalefac
+    scalefac <- ncvar_get(ncf,"parametermap",start=c(11,101),count=c(ncol2,nrow2))   #real52:117,113:152,start=c(52,113),count=c(66,40)
+    scalefacarr1[,,i+1] = scalefac * 1e6 # to umol/m2/s
     scalefac <- ncvar_get(ncf,"parametervalues_bc")
     
-    #dims=dim(scalefac)
-    #flog.info("dims of BC factor 1 array %s", dims[1], name='logger.b')
-    
-    print("TTT")
-    print(scalefac)
-    print(scalefacarr_bc1[,i+1])
-    
     scalefacarr_bc1[,i+1] = scalefac
     print(scalefacarr_bc1[,i+1])
 
@@ -143,16 +136,9 @@ for(i in 0:(nsam-1))    #parameters.000.2010010100_2010011100.nc
   }
   
   ncf <- nc_open(paste(samdir,"parameters.",ii,".",tb2,"00","_",tb3,"00",".nc",sep="")) 
-  scalefac <- ncvar_get(ncf,"parametermap",start=c(52,113),count=c(ncol2,nrow2))  
-  scalefacarr2[,,i+1] = scalefac
+  scalefac <- ncvar_get(ncf,"parametermap",start=c(11,101),count=c(ncol2,nrow2))  
+  scalefacarr2[,,i+1] = scalefac * 1e6 # to umol/m2/s
   scalefac <- ncvar_get(ncf,"parametervalues_bc")
-  
-  #dims=dim(scalefac)
-  #flog.info("dims of BC factor 2 array %s", dims[1], name='logger.b')
-
-  print("TTT")
-  print(scalefac)
-  print(scalefacarr_bc2[,i+1])
 
   scalefacarr_bc2[,i+1] = scalefac
   print(scalefacarr_bc2[,i+1])
@@ -279,7 +265,7 @@ for(mm in 1:length(pfbfns))
   footp=load.ncdf(fn)  
   
   footnc=nc_open(fn)
-  foot=ncvar_get(footnc,"foot1",start=c(41,12,1),count=c(ncol2,nrow2,-1))
+  foot=ncvar_get(footnc,"foot1",start=c(1,1,1),count=c(ncol2,nrow2,-1))
 
   #print(mean(foot))
   
@@ -355,8 +341,11 @@ for(mm in 1:length(pfbfns))
     #endptsdate=ncvar_get(footnc,"endptsdate")
     latarr=endpts[,3]
     lonarr=endpts[,4]
-    hgtarr=endpts[,5] + endpts[,6]  #agl+grdht
-    
+    #hgtarr=endpts[,5] + endpts[,6]  #agl+grdht
+    magl=endpts[,5]                 # meters above ground level
+    masl=endpts[,5] + endpts[,6]    # meters above sea level 
+    hgtarr=masl
+
     # analyze the dates to recognize how many data to read
     #dd=as.character(endptsdate)
     #yrlist=substring(dd,1,4)
@@ -522,8 +511,8 @@ for(mm in 1:length(pfbfns))
         {      
            inxd=ceiling(hh/24)
            inxh=hh-(inxd-1)*24
-           gppflux[,,ntimes-hh+1]=gpp[inxd,52:117,113:152,inxh]
-           recflux[,,ntimes-hh+1]=rec[inxd,52:117,113:152,inxh]  
+           gppflux[,,ntimes-hh+1]=gpp[inxd,11:130,101:170,inxh]
+           recflux[,,ntimes-hh+1]=rec[inxd,11:130,101:170,inxh]  
         }
             
         inxd=ceiling(hh/24)
@@ -532,19 +521,19 @@ for(mm in 1:length(pfbfns))
         #print(hh)
         #print(inxh)
         #print(dim(ocn))
-        ocnflux[,,ntimes-hh+1]=ocn[inxd,52:117,113:152,inxh]
-        fosflux[,,ntimes-hh+1]=fos[inxd,52:117,113:152,inxh]
-        firflux[,,ntimes-hh+1]=fir[inxd,52:117,113:152,inxh]
+        ocnflux[,,ntimes-hh+1]=ocn[inxd,11:130,101:170,inxh]
+        fosflux[,,ntimes-hh+1]=fos[inxd,11:130,101:170,inxh]
+        firflux[,,ntimes-hh+1]=fir[inxd,11:130,101:170,inxh]
         
         if(bioflux_flag == "SiBCASA")
         {
-           gppflux[,,ntimes-hh+1]=gpp[inxd,52:117,113:152,inxh]
-           recflux[,,ntimes-hh+1]=rec[inxd,52:117,113:152,inxh]
+           gppflux[,,ntimes-hh+1]=gpp[inxd,11:130,101:170,inxh]
+           recflux[,,ntimes-hh+1]=rec[inxd,11:130,101:170,inxh]
            #flog.info('gppflux: %s, gpp: %s, %s, %s, %s',gppflux[30,30,ntimes-hh+1],gpp[inxd,82,143,inxh],ntimes-hh+1,inxd,inxh,name='logger.b')
         }
 
         if(bioflux_flag == "CT_OPT")
-           bioflux[,,ntimes-hh+1]=bio[inxd,52:117,113:152,inxh]
+           bioflux[,,ntimes-hh+1]=bio[inxd,11:130,101:170,inxh]
     }
     
     # replace NA values with 0, as NA was used as zero values for datasets
@@ -564,7 +553,7 @@ for(mm in 1:length(pfbfns))
          neeflux[,,]=recflux[,,]-gppflux[,,]  # nee*1e6 for SiBCASA?
 
      if(bioflux_flag == "SiBCASA")
-         neeflux[,,]=(recflux[,,]-gppflux[,,])*1e6
+         neeflux[,,]=(recflux[,,]-gppflux[,,])*1e6  # to umol/m2/s
 
      if(bioflux_flag == "CT_OPT")
          neeflux[,,]= bioflux[,,]*1e6  # for scaling CT flux
@@ -614,14 +603,14 @@ for(mm in 1:length(pfbfns))
 
      n = 24-floor(as.numeric(hr) + as.numeric(mi)/60)
      if (nchar(dd,type='width') ==10)
-         {
+     {
          n=24
          #flog.info('No hr and mi, set n to 24',name='logger.b')
-         }
+     }
 
      #print("XXXn")
      #print(n)
-     datevalid=dateall[1]+0.5*3600-(0:(ntimes-1))*3600
+     ##datevalid=dateall[1]+0.5*3600-(0:(ntimes-1))*3600
      #ixflux=(1:ntimes)[(datevalid<=xx)][1:endtime]   #time backward
      #ixflux=(1:ntimes)[(datevalid<=xx)][1:(endtime+n)]
     # flog.info('n: %s, endtime: %s',n,endtime,name='logger.b')
@@ -688,7 +677,7 @@ for(mm in 1:length(pfbfns))
               #   flog.info("hh: %s, neeflux[,,hh]=%f, scalefacarr2 = %f ",hh, neeflux[30,30,hh], scalefacarr2[30,30,i], name='logger.b')
                 
                 
-               neeflux1[,,hh] = neeflux[,,hh]*(scalefacarr2[,,i])   #delete "t" transform
+               neeflux1[,,hh] = neeflux[,,hh]+(scalefacarr2[,,i])   #delete "t" transform
                
                dims=dim(scalefacarr_bc2)
                #flog.info("dims of scalefacarr_bc2: %s, %s", dims[1], dims[2], name='logger.b')
@@ -701,7 +690,7 @@ for(mm in 1:length(pfbfns))
             {
                 #if(i==1)
                 #   flog.info("hh: %s, neeflux[,,hh]=%f, scalefacarr1 = %f",hh, neeflux[30,30,hh], scalefacarr1[30,30,i],name='logger.b')
-                neeflux1[,,hh] = neeflux[,,hh]*(scalefacarr1[,,i])
+                neeflux1[,,hh] = neeflux[,,hh]+(scalefacarr1[,,i])
                 
                 dims=dim(scalefacarr_bc1)
                 #flog.info("dims of scalefacarr_bc1: %s, %s", dims[1], dims[2], name='logger.b')
@@ -718,7 +707,7 @@ for(mm in 1:length(pfbfns))
       else  #all scaling within second lag
       {
         for (hh in 1:ntimes) 
-          neeflux1[,,hh] = neeflux[,,hh]*(scalefacarr2[,,i])
+          neeflux1[,,hh] = neeflux[,,hh]+(scalefacarr2[,,i])
           bc1[,hh] = scalefacarr_bc2[,i]
         
         neefluxarr[,,,i] = neeflux1[,,]
@@ -894,31 +883,33 @@ for(mm in 1:length(pfbfns))
              k=25
         }
      
-        if (typeflag == "aircraft" && k0 > 3000)  # aircraft footprints
+        # notice that in obspack.py,aircraft observations which are lower than 3 km have been excluded from event ids. Here take into account of particles higher than 3 km
+         # aircraft footprints
+        if (typeflag == "aircraft" && magl[p] > 3000)
         {
-            counter_height = counter_height +1
-            if(latarr[i]<20 && lonarr[i]>= (-125) && lonarr[i] <= (-55))
+            counter_height = counter_height + 1
+            if(latarr[i]< 10.5 && lonarr[i]>= (-169.5) && lonarr[i] < (-50.5))
                  counter_bc1 = counter_bc1 + 1
-            if(latarr[i]>75 && lonarr[i]>= (-125) && lonarr[i] <= (-55))
+            if(latarr[i]> 80.5 && lonarr[i]>= (-169.5) && lonarr[i] < (-50.5))
                  counter_bc2 = counter_bc2 + 1
-            if(lonarr[i]< (-125) && latarr[i] >= 20 && latarr[i] <= 75)
+            if(lonarr[i]< (-169.5) && latarr[i] >= 10.5 && latarr[i] < 80.5)
                  counter_bc3 = counter_bc3 + 1
-            if(lonarr[i]> (-55) && latarr[i] >= 20 && latarr[i] <= 75)
+            if(lonarr[i]> (-50.5) && latarr[i] >= 10.5 && latarr[i] < 80.5)
                  counter_bc4 = counter_bc4 + 1
         }
-
-        if (typeflag == "surface")  # surface footprints 
+        # surface footprints                
+        if (typeflag == "surface") 
         {
               counter_height = counter_height +1
-              if(latarr[i]<20 && lonarr[i]>= (-125) && lonarr[i] <= (-55))
+              if(latarr[i]< 10.5 && lonarr[i]>= (-169.5) && lonarr[i] < (-50.5))
                    counter_bc1 = counter_bc1 + 1
-              if(latarr[i]>75 && lonarr[i]>= (-125) && lonarr[i] <= (-55))
+              if(latarr[i]> 80.5 && lonarr[i]>= (-169.5) && lonarr[i] < (-50.5))
                    counter_bc2 = counter_bc2 + 1
-              if(lonarr[i]< (-125) && latarr[i] >= 20 && latarr[i] <= 75)
+              if(lonarr[i]< (-169.5) && latarr[i] >= 10.5 && latarr[i] < 80.5)
                    counter_bc3 = counter_bc3 + 1
-              if(lonarr[i]> (-55) && latarr[i] >= 20 && latarr[i] <= 75)
+              if(lonarr[i]> (-50.5) && latarr[i] >= 10.5 && latarr[i] < 80.5)
                    counter_bc4 = counter_bc4 + 1
-         }
+        }
 
 
         #if (lonarr[p] < -125 || lonarr[p] > -55 || latarr[p] < 20 || latarr[p] > 75)
@@ -988,14 +979,14 @@ for(mm in 1:length(pfbfns))
     }
 
     dims=dim(bcoutarrtmp)
-    flog.info('dims of bcoutarrtmp : %s, %s',dims[1],dims[2],name='logger.b')
+    #flog.info('dims of bcoutarrtmp : %s, %s',dims[1],dims[2],name='logger.b')
     
     bcoutarr = FP_BC_c1*bcoutarrtmp[1,]+FP_BC_c2*bcoutarrtmp[2,]+FP_BC_c3*bcoutarrtmp[3,]+FP_BC_c4*bcoutarrtmp[4,]
     len=length(bcoutarr)
     #print(bcoutarr)
     flog.info('FP_BC_c1,2,3,4:%f,%f,%f,%f',FP_BC_c1,FP_BC_c2,FP_BC_c3,FP_BC_c4,name='logger.b')
 
-    flog.info('value of bcoutarr[2],[98] : %s %s',bcoutarr[2],bcoutarr[98],name='logger.b')
+    flog.info('value of bcoutarr[1] : %s',bcoutarr[1], name='logger.b')
     flog.info('length of bcoutarr : %s',len,name='logger.b')
 
     #flog.info('FP_BC_c based on lat, lon and altitude: %s',FP_BC_c,name='logger.b')
@@ -1035,10 +1026,13 @@ for(mm in 1:length(pfbfns))
     for(i in 1:nsam)
     { 
       deltaco2arr[i]=neeoutarr[i]+ocnout+fosout+firout
+      
+      if(typeflag == "aircraft")
+          fsimuarr[i]=(fbou+bcoutarr[i])*1e-6
+      if(typeflag == "surface")
+          fsimuarr[i]=(fbou+bcoutarr[i]+deltaco2arr[i])*1e-6        
 
-      fsimuarr[i]=(fbou+bcoutarr[i]+deltaco2arr[i])*1e-6        
-
-      if(i==99)
+      if(i==1)
          flog.info("fsimuarr[i] = %f, fbou = %f,  bcoutarr[i] = %f, neeoutarr[i] = %f, deltaco2arr[i] = %f",fsimuarr[i]*1e6,fbou,bcoutarr[i],neeoutarr[i],deltaco2arr[i],name='logger.b')
 
       outlist<-c(outlist, fsimuarr[i])
-- 
GitLab