| forrest@0 |      1 | ;********************************************************
 | 
| forrest@0 |      2 | ; using model biome
 | 
| forrest@0 |      3 | ;
 | 
| forrest@0 |      4 | ; required command line input parameters:
 | 
| forrest@0 |      5 | ;  ncl 'model_name="10cn" model_grid="T42" dirm="/.../ film="..."' 01.npp.ncl
 | 
| forrest@0 |      6 | ;
 | 
| forrest@0 |      7 | ;**************************************************************
 | 
| forrest@0 |      8 | load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
 | 
| forrest@0 |      9 | load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
 | 
| forrest@0 |     10 | load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"
 | 
| forrest@0 |     11 | ;**************************************************************
 | 
| forrest@0 |     12 | procedure set_line(lines:string,nline:integer,newlines:string) 
 | 
| forrest@0 |     13 | begin
 | 
| forrest@0 |     14 | ; add line to ascci/html file
 | 
| forrest@0 |     15 |     
 | 
| forrest@0 |     16 |   nnewlines = dimsizes(newlines)
 | 
| forrest@0 |     17 |   if(nline+nnewlines-1.ge.dimsizes(lines))
 | 
| forrest@0 |     18 |     print("set_line: bad index, not setting anything.") 
 | 
| forrest@0 |     19 |     return
 | 
| forrest@0 |     20 |   end if 
 | 
| forrest@0 |     21 |   lines(nline:nline+nnewlines-1) = newlines
 | 
| forrest@0 |     22 | ;  print ("lines = " + lines(nline:nline+nnewlines-1))
 | 
| forrest@0 |     23 |   nline = nline + nnewlines
 | 
| forrest@0 |     24 |   return 
 | 
| forrest@0 |     25 | end
 | 
| forrest@0 |     26 | ;**************************************************************
 | 
| forrest@0 |     27 | ; Main code.
 | 
| forrest@0 |     28 | begin
 | 
| forrest@0 |     29 |  
 | 
| forrest@0 |     30 |  plot_type     = "ps"
 | 
| forrest@0 |     31 |  plot_type_new = "png"
 | 
| forrest@0 |     32 | 
 | 
| forrest@0 |     33 | ;************************************************
 | 
| forrest@0 |     34 | ; read data: model       
 | 
| forrest@0 |     35 | ;************************************************
 | 
| forrest@0 |     36 |  co2_i = 283.1878
 | 
| forrest@0 |     37 |  co2_f = 364.1252
 | 
| forrest@0 |     38 | 
 | 
| forrest@0 |     39 |  model_grid = "T42"
 | 
| forrest@0 |     40 | 
 | 
| forrest@0 |     41 | ;model_name_i = "i01.07cn"
 | 
| forrest@0 |     42 | ;model_name_f = "i01.10cn"
 | 
| forrest@0 |     43 | 
 | 
| forrest@0 |     44 |  model_name_i = "i01.07casa"
 | 
| forrest@0 |     45 |  model_name_f = "i01.10casa"
 | 
| forrest@0 |     46 | 
 | 
| forrest@0 |     47 |  model_name = model_name_f
 | 
| forrest@0 |     48 | 
 | 
| forrest@0 |     49 |  dirm = "/fis/cgd/cseg/people/jeff/clamp_data/model/"
 | 
| forrest@0 |     50 |  film_i = model_name_i + "_1990-2004_ANN_climo.nc"
 | 
| forrest@0 |     51 |  film_f = model_name_f + "_1990-2004_ANN_climo.nc"
 | 
| forrest@0 |     52 | 
 | 
| forrest@0 |     53 |  fm_i   = addfile (dirm+film_i,"r")
 | 
| forrest@0 |     54 |  fm_f   = addfile (dirm+film_f,"r")
 | 
| forrest@0 |     55 |   
 | 
| forrest@0 |     56 |  xm     = fm_f->lon  
 | 
| forrest@0 |     57 |  ym     = fm_f->lat
 | 
| forrest@0 |     58 | 
 | 
| forrest@0 |     59 |  npp_i  = fm_i->NPP
 | 
| forrest@0 |     60 |  npp_f  = fm_f->NPP
 | 
| forrest@0 |     61 | 
 | 
| forrest@0 |     62 |  delete (fm_i)
 | 
| forrest@0 |     63 |  delete (fm_f)
 | 
| forrest@0 |     64 | 
 | 
| forrest@0 |     65 | ;Units for these variables are:
 | 
| forrest@0 |     66 | ;npp_i: g C/m^2/s
 | 
| forrest@0 |     67 | 
 | 
| forrest@0 |     68 |  nsec_per_year = 60*60*24*365
 | 
| forrest@0 |     69 |   
 | 
| forrest@0 |     70 |  npp_i = npp_i *  nsec_per_year
 | 
| forrest@0 |     71 |  npp_f = npp_f *  nsec_per_year 
 | 
| forrest@0 |     72 |    
 | 
| forrest@0 |     73 | ;===================================================
 | 
| forrest@0 |     74 | ; read data: observed at stations
 | 
| forrest@0 |     75 | ;===================================================
 | 
| forrest@0 |     76 | 
 | 
| forrest@0 |     77 |  station = (/"DukeFACE" \
 | 
| forrest@0 |     78 |             ,"AspenFACE" \
 | 
| forrest@0 |     79 |             ,"ORNL-FACE" \
 | 
| forrest@0 |     80 |             ,"POP-EUROFACE" \
 | 
| forrest@0 |     81 |             /)
 | 
| forrest@0 |     82 | 
 | 
| forrest@0 |     83 |  lat_ob = (/ 35.58,  45.40,  35.54, 42.22/)
 | 
| forrest@0 |     84 |  lon_ob = (/-79.05, -89.37, -84.20, 11.48/)
 | 
| forrest@0 |     85 |  lon_ob = where(lon_ob.lt.0.,lon_ob+360.,lon_ob)
 | 
| forrest@0 |     86 | ;print (lon_ob)
 | 
| forrest@0 |     87 | 
 | 
| forrest@0 |     88 |  n_sta  = dimsizes(station)
 | 
| forrest@0 |     89 |  beta_4_ob = new((/n_sta/),float)
 | 
| forrest@0 |     90 |  beta_4_ob = 0.60
 | 
| forrest@0 |     91 | 
 | 
| forrest@0 |     92 | ;===================================================
 | 
| forrest@0 |     93 | ; get model data at station 
 | 
| forrest@0 |     94 | ;===================================================
 | 
| forrest@0 |     95 | 
 | 
| forrest@0 |     96 |  npp_i_4  =linint2_points(xm,ym,npp_i,True,lon_ob,lat_ob,0)
 | 
| forrest@0 |     97 | 
 | 
| forrest@0 |     98 |  npp_f_4  =linint2_points(xm,ym,npp_f,True,lon_ob,lat_ob,0)
 | 
| forrest@0 |     99 | 
 | 
| forrest@0 |    100 | ;print (npp_i_4)
 | 
| forrest@0 |    101 | ;print (npp_f_4)
 | 
| forrest@0 |    102 | 
 | 
| forrest@0 |    103 | ;============================
 | 
| forrest@0 |    104 | ;compute beta_4
 | 
| forrest@0 |    105 | ;============================
 | 
| forrest@0 |    106 | 
 | 
| forrest@0 |    107 |  beta_4 = new((/n_sta/),float)
 | 
| forrest@0 |    108 | 
 | 
| forrest@0 |    109 |  beta_4 = ((npp_f_4/npp_i_4) - 1.)/log(co2_f/co2_i)
 | 
| forrest@0 |    110 | 
 | 
| forrest@0 |    111 |  beta_4_avg = avg(beta_4)
 | 
| forrest@0 |    112 | 
 | 
| forrest@0 |    113 | ;print (beta_4)
 | 
| forrest@0 |    114 | ;print (beta_4_avg)
 | 
| forrest@0 |    115 | 
 | 
| forrest@0 |    116 | ;M_beta = abs((beta_4_avg/beta_4_ob) - 1.)* 3.
 | 
| forrest@0 |    117 | 
 | 
| forrest@0 |    118 |  bias = sum(abs(beta_4-beta_4_ob)/(abs(beta_4)+abs(beta_4_ob))) 
 | 
| forrest@0 |    119 |  M_beta  = (1. - (bias/n_sta))*3.
 | 
| forrest@0 |    120 |  
 | 
| forrest@0 |    121 |  print (M_beta)
 | 
| forrest@0 |    122 | 
 | 
| forrest@0 |    123 | ;=========================
 | 
| forrest@0 |    124 | ; for html table - station
 | 
| forrest@0 |    125 | ;=========================
 | 
| forrest@0 |    126 | 
 | 
| forrest@0 |    127 |   output_html = "table_station.html"
 | 
| forrest@0 |    128 | 
 | 
| forrest@0 |    129 | ; column (not including header column)
 | 
| forrest@0 |    130 | 
 | 
| forrest@0 |    131 |   col_head = (/"Latitude","Longitude","CO2_i","CO2_f","NPP_i","NPP_f","Beta_model","Beta_ob"/)
 | 
| forrest@0 |    132 | 
 | 
| forrest@0 |    133 |   ncol = dimsizes(col_head)
 | 
| forrest@0 |    134 | 
 | 
| forrest@0 |    135 | ; row (not including header row)
 | 
| forrest@0 |    136 |   row_head = (/"DukeFACE" \
 | 
| forrest@0 |    137 |               ,"AspenFACE" \
 | 
| forrest@0 |    138 |               ,"ORNL-FACE" \
 | 
| forrest@0 |    139 |               ,"POP-EUROFACE" \
 | 
| forrest@0 |    140 |               ,"All Station" \                
 | 
| forrest@0 |    141 |               /)  
 | 
| forrest@0 |    142 |   nrow = dimsizes(row_head)                  
 | 
| forrest@0 |    143 | 
 | 
| forrest@0 |    144 | ; arrays to be passed to table. 
 | 
| forrest@0 |    145 |   text4 = new ((/nrow, ncol/),string )
 | 
| forrest@0 |    146 | 
 | 
| forrest@0 |    147 |  do i=0,nrow-2
 | 
| forrest@0 |    148 |   text4(i,0) = sprintf("%.1f",lat_ob(i))
 | 
| forrest@0 |    149 |   text4(i,1) = sprintf("%.1f",lon_ob(i))
 | 
| forrest@0 |    150 |   text4(i,2) = sprintf("%.1f",co2_i)
 | 
| forrest@0 |    151 |   text4(i,3) = sprintf("%.1f",co2_f)
 | 
| forrest@0 |    152 |   text4(i,4) = sprintf("%.1f",npp_i_4(0,i))
 | 
| forrest@0 |    153 |   text4(i,5) = sprintf("%.1f",npp_f_4(0,i))
 | 
| forrest@0 |    154 |   text4(i,6) = sprintf("%.2f",beta_4(i))
 | 
| forrest@0 |    155 |   text4(i,7) = "-"
 | 
| forrest@0 |    156 |  end do
 | 
| forrest@0 |    157 |   text4(nrow-1,0) = "-"
 | 
| forrest@0 |    158 |   text4(nrow-1,1) = "-"
 | 
| forrest@0 |    159 |   text4(nrow-1,2) = "-"
 | 
| forrest@0 |    160 |   text4(nrow-1,3) = "-"
 | 
| forrest@0 |    161 |   text4(nrow-1,4) = "-"
 | 
| forrest@0 |    162 |   text4(nrow-1,5) = "-"
 | 
| forrest@0 |    163 |   text4(nrow-1,6) = sprintf("%.2f",beta_4_avg)
 | 
| forrest@0 |    164 |   text4(nrow-1,7) = sprintf("%.2f",avg(beta_4_ob))
 | 
| forrest@0 |    165 | 
 | 
| forrest@0 |    166 | ;-----------
 | 
| forrest@0 |    167 | ; html table
 | 
| forrest@0 |    168 | ;-----------
 | 
| forrest@0 |    169 | 
 | 
| forrest@0 |    170 |   header_text = "<H1>Beta Factor: Model "+model_name+"</H1>" 
 | 
| forrest@0 |    171 | 
 | 
| forrest@0 |    172 |   header = (/"<HTML>" \
 | 
| forrest@0 |    173 |             ,"<HEAD>" \
 | 
| forrest@0 |    174 |             ,"<TITLE>CLAMP metrics</TITLE>" \
 | 
| forrest@0 |    175 |             ,"</HEAD>" \
 | 
| forrest@0 |    176 |             ,header_text \
 | 
| forrest@0 |    177 |             /) 
 | 
| forrest@0 |    178 |   footer = "</HTML>"
 | 
| forrest@0 |    179 | 
 | 
| forrest@0 |    180 |   table_header = (/ \
 | 
| forrest@0 |    181 |         "<table border=1 cellspacing=0 cellpadding=3 width=80%>" \
 | 
| forrest@0 |    182 |        ,"<tr>" \
 | 
| forrest@0 |    183 |        ,"   <th bgcolor=DDDDDD >Station</th>" \
 | 
| forrest@0 |    184 |        ,"   <th bgcolor=DDDDDD >"+col_head(0)+"</th>" \
 | 
| forrest@0 |    185 |        ,"   <th bgcolor=DDDDDD >"+col_head(1)+"</th>" \
 | 
| forrest@0 |    186 |        ,"   <th bgcolor=DDDDDD >"+col_head(2)+"</th>" \
 | 
| forrest@0 |    187 |        ,"   <th bgcolor=DDDDDD >"+col_head(3)+"</th>" \
 | 
| forrest@0 |    188 |        ,"   <th bgcolor=DDDDDD >"+col_head(4)+"</th>" \
 | 
| forrest@0 |    189 |        ,"   <th bgcolor=DDDDDD >"+col_head(5)+"</th>" \
 | 
| forrest@0 |    190 |        ,"   <th bgcolor=DDDDDD >"+col_head(6)+"</th>" \
 | 
| forrest@0 |    191 |        ,"   <th bgcolor=DDDDDD >"+col_head(7)+"</th>" \
 | 
| forrest@0 |    192 |        ,"</tr>" \
 | 
| forrest@0 |    193 |        /)
 | 
| forrest@0 |    194 |   table_footer = "</table>"
 | 
| forrest@0 |    195 |   row_header = "<tr>"
 | 
| forrest@0 |    196 |   row_footer = "</tr>"
 | 
| forrest@0 |    197 | 
 | 
| forrest@0 |    198 |   lines = new(50000,string)
 | 
| forrest@0 |    199 |   nline = 0
 | 
| forrest@0 |    200 | 
 | 
| forrest@0 |    201 |   set_line(lines,nline,header)
 | 
| forrest@0 |    202 |   set_line(lines,nline,table_header)
 | 
| forrest@0 |    203 | ;-----------------------------------------------
 | 
| forrest@0 |    204 | ;row of table
 | 
| forrest@0 |    205 | 
 | 
| forrest@0 |    206 |   do n = 0,nrow-1
 | 
| forrest@0 |    207 |      set_line(lines,nline,row_header)
 | 
| forrest@0 |    208 | 
 | 
| forrest@0 |    209 |      txt1  = row_head(n)
 | 
| forrest@0 |    210 |      txt2  = text4(n,0)
 | 
| forrest@0 |    211 |      txt3  = text4(n,1)
 | 
| forrest@0 |    212 |      txt4  = text4(n,2)
 | 
| forrest@0 |    213 |      txt5  = text4(n,3)
 | 
| forrest@0 |    214 |      txt6  = text4(n,4)
 | 
| forrest@0 |    215 |      txt7  = text4(n,5)
 | 
| forrest@0 |    216 |      txt8  = text4(n,6)
 | 
| forrest@0 |    217 |      txt9  = text4(n,7)
 | 
| forrest@0 |    218 | 
 | 
| forrest@0 |    219 |      set_line(lines,nline,"<th>"+txt1+"</th>")
 | 
| forrest@0 |    220 |      set_line(lines,nline,"<th>"+txt2+"</th>")
 | 
| forrest@0 |    221 |      set_line(lines,nline,"<th>"+txt3+"</th>")
 | 
| forrest@0 |    222 |      set_line(lines,nline,"<th>"+txt4+"</th>")
 | 
| forrest@0 |    223 |      set_line(lines,nline,"<th>"+txt5+"</th>")
 | 
| forrest@0 |    224 |      set_line(lines,nline,"<th>"+txt6+"</th>")
 | 
| forrest@0 |    225 |      set_line(lines,nline,"<th>"+txt7+"</th>")
 | 
| forrest@0 |    226 |      set_line(lines,nline,"<th>"+txt8+"</th>")
 | 
| forrest@0 |    227 |      set_line(lines,nline,"<th>"+txt9+"</th>")
 | 
| forrest@0 |    228 | 
 | 
| forrest@0 |    229 |      set_line(lines,nline,row_footer)
 | 
| forrest@0 |    230 |   end do
 | 
| forrest@0 |    231 | ;-----------------------------------------------
 | 
| forrest@0 |    232 |   set_line(lines,nline,table_footer)
 | 
| forrest@0 |    233 |   set_line(lines,nline,footer) 
 | 
| forrest@0 |    234 | 
 | 
| forrest@0 |    235 | ; Now write to an HTML file.
 | 
| forrest@0 |    236 |   idx = ind(.not.ismissing(lines))
 | 
| forrest@0 |    237 |   if(.not.any(ismissing(idx))) then
 | 
| forrest@0 |    238 |     asciiwrite(output_html,lines(idx))
 | 
| forrest@0 |    239 |   else
 | 
| forrest@0 |    240 |    print ("error?")
 | 
| forrest@0 |    241 |   end if
 | 
| forrest@0 |    242 | 
 | 
| forrest@0 |    243 |   delete (col_head)
 | 
| forrest@0 |    244 |   delete (row_head)
 | 
| forrest@0 |    245 |   delete (text4)
 | 
| forrest@0 |    246 |   delete (table_header)
 | 
| forrest@0 |    247 |   delete (idx)
 | 
| forrest@0 |    248 | 
 | 
| forrest@0 |    249 | ;------------------------------------------------
 | 
| forrest@0 |    250 | ; read biome data: model
 | 
| forrest@0 |    251 | 
 | 
| forrest@0 |    252 |   biome_name_mod = "Model PFT Class"
 | 
| forrest@0 |    253 | 
 | 
| forrest@0 |    254 |   dirm = "/fis/cgd/cseg/people/jeff/clamp_data/model/"
 | 
| forrest@0 |    255 |   film = "class_pft_"+model_grid+".nc"
 | 
| forrest@0 |    256 | 
 | 
| forrest@0 |    257 |   fm = addfile(dirm+film,"r")
 | 
| forrest@0 |    258 |  
 | 
| forrest@0 |    259 |   classmod = fm->CLASS_PFT               
 | 
| forrest@0 |    260 | 
 | 
| forrest@0 |    261 |   delete (fm)
 | 
| forrest@0 |    262 | 
 | 
| forrest@0 |    263 | ; model data has 17 land-type classes
 | 
| forrest@0 |    264 | 
 | 
| forrest@0 |    265 |   nclass_mod = 17
 | 
| forrest@0 |    266 | 
 | 
| forrest@0 |    267 | ;------------------------------------------------
 | 
| forrest@0 |    268 | ; read biome data: observed
 | 
| forrest@0 |    269 | 
 | 
| forrest@0 |    270 |   biome_name_ob = "MODIS LandCover"
 | 
| forrest@0 |    271 | 
 | 
| forrest@0 |    272 |   diro = "/fis/cgd/cseg/people/jeff/clamp_data/lai/ob/"
 | 
| forrest@0 |    273 |   filo = "land_class_"+model_grid+".nc"
 | 
| forrest@0 |    274 | 
 | 
| forrest@0 |    275 |   fo = addfile(diro+filo,"r")
 | 
| forrest@0 |    276 |  
 | 
| forrest@0 |    277 |   classob = tofloat(fo->LAND_CLASS)               
 | 
| forrest@0 |    278 | 
 | 
| forrest@0 |    279 |   delete (fo)
 | 
| forrest@0 |    280 | 
 | 
| forrest@0 |    281 | ; input observed data has 20 land-type classes
 | 
| forrest@0 |    282 | 
 | 
| forrest@0 |    283 |   nclass_ob = 20
 | 
| forrest@0 |    284 |                 
 | 
| forrest@0 |    285 | ;********************************************************************
 | 
| forrest@0 |    286 | ; use land-type class to bin the data in equally spaced ranges
 | 
| forrest@0 |    287 | ;********************************************************************
 | 
| forrest@0 |    288 | 
 | 
| forrest@0 |    289 | ; using observed biome class  
 | 
| forrest@0 |    290 | ; nclass      = nclass_ob
 | 
| forrest@0 |    291 | ; using model biome class
 | 
| forrest@0 |    292 |   nclass      = nclass_mod
 | 
| forrest@0 |    293 | 
 | 
| forrest@0 |    294 |   nclassn     = nclass + 1
 | 
| forrest@0 |    295 |   range       = fspan(0,nclassn-1,nclassn)
 | 
| forrest@0 |    296 | ; print (range)
 | 
| forrest@0 |    297 | 
 | 
| forrest@0 |    298 | ; Use this range information to grab all the values in a
 | 
| forrest@0 |    299 | ; particular range, and then take an average.
 | 
| forrest@0 |    300 | 
 | 
| forrest@0 |    301 |   nr           = dimsizes(range)
 | 
| forrest@0 |    302 |   nx           = nr-1
 | 
| forrest@0 |    303 |   xvalues      = new((/2,nx/),float)
 | 
| forrest@0 |    304 |   xvalues(0,:) = range(0:nr-2) + (range(1:)-range(0:nr-2))/2.
 | 
| forrest@0 |    305 |   dx           = xvalues(0,1) - xvalues(0,0)       ; range width
 | 
| forrest@0 |    306 |   dx4          = dx/4                              ; 1/4 of the range
 | 
| forrest@0 |    307 |   xvalues(1,:) = xvalues(0,:) - dx/5.
 | 
| forrest@0 |    308 | 
 | 
| forrest@0 |    309 | ;==============================
 | 
| forrest@0 |    310 | ; put data into bins
 | 
| forrest@0 |    311 | ;==============================
 | 
| forrest@0 |    312 | 
 | 
| forrest@0 |    313 | ; using observed biome class
 | 
| forrest@0 |    314 | ; base_1D  = ndtooned(classob)
 | 
| forrest@0 |    315 | ; using model biome class
 | 
| forrest@0 |    316 |   base_1D  = ndtooned(classmod)
 | 
| forrest@0 |    317 | 
 | 
| forrest@0 |    318 |   data1_1D = ndtooned(npp_i)
 | 
| forrest@0 |    319 |   data2_1D = ndtooned(npp_f)
 | 
| forrest@0 |    320 | 
 | 
| forrest@0 |    321 | ; output
 | 
| forrest@0 |    322 | 
 | 
| forrest@0 |    323 |   yvalues = new((/2,nx/),float)
 | 
| forrest@0 |    324 |   count   = new((/2,nx/),float)
 | 
| forrest@0 |    325 | 
 | 
| forrest@0 |    326 |   do nd=0,1
 | 
| forrest@0 |    327 | 
 | 
| forrest@0 |    328 | ;   See if we are doing data1 (nd=0) or data2 (nd=1).
 | 
| forrest@0 |    329 | 
 | 
| forrest@0 |    330 |     base = base_1D
 | 
| forrest@0 |    331 | 
 | 
| forrest@0 |    332 |     if(nd.eq.0) then
 | 
| forrest@0 |    333 |       data = data1_1D
 | 
| forrest@0 |    334 |     else
 | 
| forrest@0 |    335 |       data = data2_1D
 | 
| forrest@0 |    336 |     end if
 | 
| forrest@0 |    337 | 
 | 
| forrest@0 |    338 | ; Loop through each range, using base.
 | 
| forrest@0 |    339 | 
 | 
| forrest@0 |    340 |     do i=0,nr-2
 | 
| forrest@0 |    341 |       if (i.ne.(nr-2)) then
 | 
| forrest@0 |    342 | ;        print("")
 | 
| forrest@0 |    343 | ;        print("In range ["+range(i)+","+range(i+1)+")")
 | 
| forrest@0 |    344 |          idx = ind((base.ge.range(i)).and.(base.lt.range(i+1)))
 | 
| forrest@0 |    345 |       else
 | 
| forrest@0 |    346 | ;        print("")
 | 
| forrest@0 |    347 | ;        print("In range ["+range(i)+",)")
 | 
| forrest@0 |    348 |          idx = ind(base.ge.range(i))
 | 
| forrest@0 |    349 |       end if
 | 
| forrest@0 |    350 | 
 | 
| forrest@0 |    351 | ;     Calculate average 
 | 
| forrest@0 |    352 | 
 | 
| forrest@0 |    353 |       if(.not.any(ismissing(idx))) then
 | 
| forrest@0 |    354 |         yvalues(nd,i) = avg(data(idx))
 | 
| forrest@0 |    355 |         count(nd,i)   = dimsizes(idx)
 | 
| forrest@0 |    356 |       else
 | 
| forrest@0 |    357 |         yvalues(nd,i) = yvalues@_FillValue
 | 
| forrest@0 |    358 |         count(nd,i)   = 0
 | 
| forrest@0 |    359 |       end if
 | 
| forrest@0 |    360 | 
 | 
| forrest@0 |    361 | ;#############################################################
 | 
| forrest@0 |    362 | ;using observed biome class:
 | 
| forrest@0 |    363 | ; 
 | 
| forrest@0 |    364 | ;     set the following 4 classes to _FillValue:
 | 
| forrest@0 |    365 | ;     Water Bodies(0), Urban and Build-Up(13),
 | 
| forrest@0 |    366 | ;     Permenant Snow and Ice(15), Unclassified(17)
 | 
| forrest@0 |    367 | 
 | 
| forrest@0 |    368 | ;     if (i.eq.0 .or. i.eq.13 .or. i.eq.15 .or. i.eq.17) then
 | 
| forrest@0 |    369 | ;        yvalues(nd,i) = yvalues@_FillValue
 | 
| forrest@0 |    370 | ;        count(nd,i)   = 0
 | 
| forrest@0 |    371 | ;     end if
 | 
| forrest@0 |    372 | ;############################################################# 
 | 
| forrest@0 |    373 | 
 | 
| forrest@0 |    374 | ;#############################################################
 | 
| forrest@0 |    375 | ;using model biome class:
 | 
| forrest@0 |    376 | ;
 | 
| forrest@0 |    377 | ;     set the following 4 classes to _FillValue:
 | 
| forrest@0 |    378 | ;     (3)Needleleaf Deciduous Boreal Tree,
 | 
| forrest@0 |    379 | ;     (8)Broadleaf Deciduous Boreal Tree,
 | 
| forrest@0 |    380 | ;     (9)Broadleaf Evergreen Shrub,
 | 
| forrest@0 |    381 | ;     (16)Wheat
 | 
| forrest@0 |    382 | 
 | 
| forrest@0 |    383 |       if (i.eq.3 .or. i.eq.8 .or. i.eq.9 .or. i.eq.16) then
 | 
| forrest@0 |    384 |          yvalues(nd,i) = yvalues@_FillValue
 | 
| forrest@0 |    385 |          count(nd,i)   = 0
 | 
| forrest@0 |    386 |       end if
 | 
| forrest@0 |    387 | ;############################################################# 
 | 
| forrest@0 |    388 | 
 | 
| forrest@0 |    389 | ;     print(nd + ": " + count(nd,i) + " points, avg = " + yvalues(nd,i))
 | 
| forrest@0 |    390 | 
 | 
| forrest@0 |    391 | ; Clean up for next time in loop.
 | 
| forrest@0 |    392 | 
 | 
| forrest@0 |    393 |       delete(idx)
 | 
| forrest@0 |    394 |     end do
 | 
| forrest@0 |    395 | 
 | 
| forrest@0 |    396 |     delete(data)
 | 
| forrest@0 |    397 |   end do
 | 
| forrest@0 |    398 | 
 | 
| forrest@0 |    399 | ;============================
 | 
| forrest@0 |    400 | ;compute beta
 | 
| forrest@0 |    401 | ;============================
 | 
| forrest@0 |    402 | 
 | 
| forrest@0 |    403 |  u       = yvalues(0,:)
 | 
| forrest@0 |    404 |  v       = yvalues(1,:)
 | 
| forrest@0 |    405 |  u_count = count(0,:)
 | 
| forrest@0 |    406 |  v_count = count(1,:)
 | 
| forrest@0 |    407 | 
 | 
| forrest@0 |    408 |  good = ind(.not.ismissing(u) .and. .not.ismissing(v))
 | 
| forrest@0 |    409 | 
 | 
| forrest@0 |    410 |  uu       = u(good)
 | 
| forrest@0 |    411 |  vv       = v(good)
 | 
| forrest@0 |    412 |  uu_count = u_count(good)
 | 
| forrest@0 |    413 |  vv_count = v_count(good) 
 | 
| forrest@0 |    414 | 
 | 
| forrest@0 |    415 |  n_biome = dimsizes(uu)
 | 
| forrest@0 |    416 |  beta_biome = new((/n_biome/),float)
 | 
| forrest@0 |    417 | 
 | 
| forrest@0 |    418 |  beta_biome = ((vv/uu) - 1.)/log(co2_f/co2_i)
 | 
| forrest@0 |    419 | 
 | 
| forrest@0 |    420 | ;beta_biome_avg = avg(beta_biome)
 | 
| forrest@0 |    421 |  beta_biome_avg = (sum(vv*vv_count)/sum(uu*uu_count) - 1.)/log(co2_f/co2_i)
 | 
| forrest@0 |    422 |   
 | 
| forrest@0 |    423 | ;print (beta_biome_avg)
 | 
| forrest@0 |    424 | 
 | 
| forrest@0 |    425 | ;===========================
 | 
| forrest@0 |    426 | ; for html table - biome
 | 
| forrest@0 |    427 | ;===========================
 | 
| forrest@0 |    428 | 
 | 
| forrest@0 |    429 |   output_html = "table_biome.html"
 | 
| forrest@0 |    430 | 
 | 
| forrest@0 |    431 | ; column (not including header column)
 | 
| forrest@0 |    432 | 
 | 
| forrest@0 |    433 |   col_head = (/"CO2_i","CO2_f","NPP_i","NPP_f","Beta_model"/)
 | 
| forrest@0 |    434 | 
 | 
| forrest@0 |    435 |   ncol = dimsizes(col_head)
 | 
| forrest@0 |    436 | 
 | 
| forrest@0 |    437 | ; row (not including header row)
 | 
| forrest@0 |    438 | 
 | 
| forrest@0 |    439 | ;----------------------------------------------------
 | 
| forrest@0 |    440 | ; using observed biome class:
 | 
| forrest@0 |    441 | ;  
 | 
| forrest@0 |    442 | ; row_head  = (/"Evergreen Needleleaf Forests" \
 | 
| forrest@0 |    443 | ;              ,"Evergreen Broadleaf Forests" \
 | 
| forrest@0 |    444 | ;              ,"Deciduous Needleleaf Forest" \
 | 
| forrest@0 |    445 | ;              ,"Deciduous Broadleaf Forests" \
 | 
| forrest@0 |    446 | ;              ,"Mixed Forests" \                      
 | 
| forrest@0 |    447 | ;              ,"Closed Bushlands" \                   
 | 
| forrest@0 |    448 | ;              ,"Open Bushlands" \                     
 | 
| forrest@0 |    449 | ;              ,"Woody Savannas (S. Hem.)" \           
 | 
| forrest@0 |    450 | ;              ,"Savannas (S. Hem.)" \                 
 | 
| forrest@0 |    451 | ;              ,"Grasslands" \                         
 | 
| forrest@0 |    452 | ;              ,"Permanent Wetlands" \                 
 | 
| forrest@0 |    453 | ;              ,"Croplands" \                                           
 | 
| forrest@0 |    454 | ;              ,"Cropland/Natural Vegetation Mosaic" \             
 | 
| forrest@0 |    455 | ;              ,"Barren or Sparsely Vegetated" \                             
 | 
| forrest@0 |    456 | ;              ,"Woody Savannas (N. Hem.)" \           
 | 
| forrest@0 |    457 | ;              ,"Savannas (N. Hem.)" \
 | 
| forrest@0 |    458 | ;              ,"All Biome" \                
 | 
| forrest@0 |    459 | ;              /)
 | 
| forrest@0 |    460 | 
 | 
| forrest@0 |    461 | ;----------------------------------------------------
 | 
| forrest@0 |    462 | ; using model biome class:
 | 
| forrest@0 |    463 | ;  
 | 
| forrest@0 |    464 |   row_head  = (/"Not Vegetated" \
 | 
| forrest@0 |    465 |                ,"Needleleaf Evergreen Temperate Tree" \
 | 
| forrest@0 |    466 |                ,"Needleleaf Evergreen Boreal Tree" \
 | 
| forrest@0 |    467 | ;              ,"Needleleaf Deciduous Boreal Tree" \
 | 
| forrest@0 |    468 |                ,"Broadleaf Evergreen Tropical Tree" \
 | 
| forrest@0 |    469 |                ,"Broadleaf Evergreen Temperate Tree" \
 | 
| forrest@0 |    470 |                ,"Broadleaf Deciduous Tropical Tree" \
 | 
| forrest@0 |    471 |                ,"Broadleaf Deciduous Temperate Tree" \
 | 
| forrest@0 |    472 | ;              ,"Broadleaf Deciduous Boreal Tree" \
 | 
| forrest@0 |    473 | ;              ,"Broadleaf Evergreen Shrub" \
 | 
| forrest@0 |    474 |                ,"Broadleaf Deciduous Temperate Shrub" \
 | 
| forrest@0 |    475 |                ,"Broadleaf Deciduous Boreal Shrub" \
 | 
| forrest@0 |    476 |                ,"C3 Arctic Grass" \
 | 
| forrest@0 |    477 |                ,"C3 Non-Arctic Grass" \
 | 
| forrest@0 |    478 |                ,"C4 Grass" \
 | 
| forrest@0 |    479 |                ,"Corn" \
 | 
| forrest@0 |    480 | ;              ,"Wheat" \                      
 | 
| forrest@0 |    481 |                ,"All Biome" \                
 | 
| forrest@0 |    482 |                /)  
 | 
| forrest@0 |    483 | 
 | 
| forrest@0 |    484 |   nrow = dimsizes(row_head)                  
 | 
| forrest@0 |    485 | 
 | 
| forrest@0 |    486 | ; arrays to be passed to table. 
 | 
| forrest@0 |    487 |   text4 = new ((/nrow, ncol/),string )
 | 
| forrest@0 |    488 |  
 | 
| forrest@0 |    489 |  do i=0,nrow-2
 | 
| forrest@0 |    490 |   text4(i,0) = sprintf("%.1f",co2_i)
 | 
| forrest@0 |    491 |   text4(i,1) = sprintf("%.1f",co2_f)
 | 
| forrest@0 |    492 |   text4(i,2) = sprintf("%.1f",uu(i))
 | 
| forrest@0 |    493 |   text4(i,3) = sprintf("%.1f",vv(i))
 | 
| forrest@0 |    494 |   text4(i,4) = sprintf("%.2f",beta_biome(i))
 | 
| forrest@0 |    495 |  end do
 | 
| forrest@0 |    496 |   text4(nrow-1,0) = "-"
 | 
| forrest@0 |    497 |   text4(nrow-1,1) = "-"
 | 
| forrest@0 |    498 |   text4(nrow-1,2) = "-"
 | 
| forrest@0 |    499 |   text4(nrow-1,3) = "-"
 | 
| forrest@0 |    500 |   text4(nrow-1,4) = sprintf("%.2f",beta_biome_avg)
 | 
| forrest@0 |    501 | 
 | 
| forrest@0 |    502 | ;**************************************************
 | 
| forrest@0 |    503 | ; html table
 | 
| forrest@0 |    504 | ;**************************************************
 | 
| forrest@0 |    505 | 
 | 
| forrest@0 |    506 |   header_text = "<H1>Beta Factor: Model "+model_name+"</H1>" 
 | 
| forrest@0 |    507 | 
 | 
| forrest@0 |    508 |   header = (/"<HTML>" \
 | 
| forrest@0 |    509 |             ,"<HEAD>" \
 | 
| forrest@0 |    510 |             ,"<TITLE>CLAMP metrics</TITLE>" \
 | 
| forrest@0 |    511 |             ,"</HEAD>" \
 | 
| forrest@0 |    512 |             ,header_text \
 | 
| forrest@0 |    513 |             /) 
 | 
| forrest@0 |    514 |   footer = "</HTML>"
 | 
| forrest@0 |    515 | 
 | 
| forrest@0 |    516 |   table_header = (/ \
 | 
| forrest@0 |    517 |         "<table border=1 cellspacing=0 cellpadding=3 width=80%>" \
 | 
| forrest@0 |    518 |        ,"<tr>" \
 | 
| forrest@0 |    519 |        ,"   <th bgcolor=DDDDDD >Biome Class</th>" \
 | 
| forrest@0 |    520 |        ,"   <th bgcolor=DDDDDD >"+col_head(0)+"</th>" \
 | 
| forrest@0 |    521 |        ,"   <th bgcolor=DDDDDD >"+col_head(1)+"</th>" \
 | 
| forrest@0 |    522 |        ,"   <th bgcolor=DDDDDD >"+col_head(2)+"</th>" \
 | 
| forrest@0 |    523 |        ,"   <th bgcolor=DDDDDD >"+col_head(3)+"</th>" \
 | 
| forrest@0 |    524 |        ,"   <th bgcolor=DDDDDD >"+col_head(4)+"</th>" \
 | 
| forrest@0 |    525 |        ,"</tr>" \
 | 
| forrest@0 |    526 |        /)
 | 
| forrest@0 |    527 |   table_footer = "</table>"
 | 
| forrest@0 |    528 |   row_header = "<tr>"
 | 
| forrest@0 |    529 |   row_footer = "</tr>"
 | 
| forrest@0 |    530 | 
 | 
| forrest@0 |    531 |   lines = new(50000,string)
 | 
| forrest@0 |    532 |   nline = 0
 | 
| forrest@0 |    533 | 
 | 
| forrest@0 |    534 |   set_line(lines,nline,header)
 | 
| forrest@0 |    535 |   set_line(lines,nline,table_header)
 | 
| forrest@0 |    536 | ;-----------------------------------------------
 | 
| forrest@0 |    537 | ;row of table
 | 
| forrest@0 |    538 | 
 | 
| forrest@0 |    539 |   do n = 0,nrow-1
 | 
| forrest@0 |    540 |      set_line(lines,nline,row_header)
 | 
| forrest@0 |    541 | 
 | 
| forrest@0 |    542 |      txt1  = row_head(n)
 | 
| forrest@0 |    543 |      txt2  = text4(n,0)
 | 
| forrest@0 |    544 |      txt3  = text4(n,1)
 | 
| forrest@0 |    545 |      txt4  = text4(n,2)
 | 
| forrest@0 |    546 |      txt5  = text4(n,3)
 | 
| forrest@0 |    547 |      txt6  = text4(n,4)
 | 
| forrest@0 |    548 | 
 | 
| forrest@0 |    549 |      set_line(lines,nline,"<th>"+txt1+"</th>")
 | 
| forrest@0 |    550 |      set_line(lines,nline,"<th>"+txt2+"</th>")
 | 
| forrest@0 |    551 |      set_line(lines,nline,"<th>"+txt3+"</th>")
 | 
| forrest@0 |    552 |      set_line(lines,nline,"<th>"+txt4+"</th>")
 | 
| forrest@0 |    553 |      set_line(lines,nline,"<th>"+txt5+"</th>")
 | 
| forrest@0 |    554 |      set_line(lines,nline,"<th>"+txt6+"</th>")
 | 
| forrest@0 |    555 | 
 | 
| forrest@0 |    556 |      set_line(lines,nline,row_footer)
 | 
| forrest@0 |    557 |   end do
 | 
| forrest@0 |    558 | ;-----------------------------------------------
 | 
| forrest@0 |    559 |   set_line(lines,nline,table_footer)
 | 
| forrest@0 |    560 |   set_line(lines,nline,footer) 
 | 
| forrest@0 |    561 | 
 | 
| forrest@0 |    562 | ; Now write to an HTML file.
 | 
| forrest@0 |    563 |   idx = ind(.not.ismissing(lines))
 | 
| forrest@0 |    564 |   if(.not.any(ismissing(idx))) then
 | 
| forrest@0 |    565 |     asciiwrite(output_html,lines(idx))
 | 
| forrest@0 |    566 |   else
 | 
| forrest@0 |    567 |    print ("error?")
 | 
| forrest@0 |    568 |   end if
 | 
| forrest@0 |    569 | 
 | 
| forrest@0 |    570 | end
 | 
| forrest@0 |    571 | 
 |