co2/17.metric_plot.ncl
author Forrest Hoffman <forrest@climatemodeling.org>
Mon, 26 Jan 2009 22:08:20 -0500
changeset 0 0c6405ab2ff4
permissions -rw-r--r--
Initial commit of C-LAMP Diagnostics from Jeff Lee
     1 ; ***********************************************
     2 ; xy_4.ncl
     3 ; ***********************************************
     4 load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
     5 load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
     6 load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"
     7 load "/fis/cgd/cseg/people/jeff/clamp/co2/metrics_table.ncl"
     8 ;************************************************
     9 begin
    10 ;************************************************
    11 ; read in data: observed
    12 ;************************************************
    13  diri  = "/fis/cgd/cseg/people/jeff/clamp_data/co2/"
    14  fili  = "co2_globalView_98.nc"
    15  g     = addfile (diri+fili,"r")
    16  val   = g->CO2_SEAS  
    17  lon   = g->LON 
    18  lat   = g->LAT
    19  sta   = chartostring(g->STATION) 
    20  delete (g)
    21  
    22 ;print (sta(0))
    23 
    24  ncase = dimsizes(lat)
    25 ;print (ncase)
    26 
    27 ;**************************************************************
    28 ; get only the lowest level at each station 
    29 ;**************************************************************
    30  lat_tmp = lat
    31  lat_tmp@_FillValue = 1.e+36
    32  
    33  do n = 0,ncase-1
    34     if (.not. ismissing(lat_tmp(n))) then 
    35        indexes = ind(lat(n) .eq. lat .and. lon(n) .eq. lon)
    36        if (dimsizes(indexes) .gt. 1) then
    37           lat_tmp(indexes(1:)) = lat_tmp@_FillValue
    38        end if
    39        delete (indexes)
    40     end if
    41  end do
    42 
    43  indexes = ind(.not. ismissing(lat_tmp))
    44 ;print (dimsizes(indexes))
    45 ;print (indexes)
    46  
    47  lat_ob = lat(indexes)
    48  lon_ob = lon(indexes)
    49  val_ob = val(indexes,:)
    50 ;printVarSummary (val_ob)
    51 ;print (lat_ob +"/"+lon_ob)
    52 
    53 ;************************************************
    54 ; read in model data
    55 ;************************************************
    56   diri2 = "/fis/cgd/cseg/people/jeff/clamp_data/model/"
    57 ; fili2 = "b30.061m_401_425_MONS_climo_atm.nc"
    58   fili2 = "b30.061n_1995-2004_MONS_climo_atm.nc"
    59 
    60   g     = addfile(diri2+fili2,"r")
    61   x     = g->CO2
    62   xi    = g->lon
    63   yi    = g->lat
    64   xdim  = dimsizes(x)
    65   nlev  = xdim(1)
    66   y     = x(:,0,:,:)
    67 ; printVarSummary (y)
    68   
    69 ; get the co2 at the lowest level
    70   y     = x(:,nlev-1,:,:)
    71 
    72 ; change to unit of observed (u mol/mol)
    73 ; Model_units [=] kgCO2 / kgDryAir
    74 ; 28.966 = molecular weight of dry air
    75 ; 44.       = molecular weight of CO2
    76 ; u mol = 1e-6 mol
    77 
    78   factor = (28.966/44.) * 1e6
    79   y      = y * factor
    80 
    81   y@_FillValue = 1.e36
    82   y@units      = "u mol/mol"
    83 ; y = where(y0 .lt. 287.,y@_FillValue,y)
    84 ; printVarSummary (y)
    85 ; print (min(y)+"/"+max(y))
    86 
    87 ; interpolate into observed station
    88 ; note: model is 0-360E, 90S-90N
    89 
    90 ; to be able to handle observation at (-89.98,-24.80)
    91   print (yi(0))
    92   yi(0) = -90.
    93 
    94   i = ind(lon_ob .lt. 0.)
    95   lon_ob(i) = lon_ob(i) + 360.  
    96 
    97   yo = linint2_points_Wrap(xi,yi,y,True,lon_ob,lat_ob,0)
    98 
    99   val_model = yo(pts|:,time|:)
   100 ; printVarSummary (val_model)
   101 ; print (min(val_model)+"/"+max(val_model))
   102 
   103 ; remove annual mean
   104   val_model = val_model - conform(val_model,dim_avg(val_model),0)
   105 ; print (min(val_model)+"/"+max(val_model))
   106 
   107   nzone = 1
   108   do z = 0,nzone-1
   109 
   110   if (z .eq. 0) then 
   111 ;    maximum score for the zone, 60N-90N 
   112      score_max = 5.0
   113 ;    index of stations in this zone
   114      ind_z = ind(lat_ob .ge. 60.)
   115 ;    print (ind_z)
   116 ;    print (lat_ob(ind_z)+"/"+lon_ob(ind_z))
   117 ;    print (val_ob(ind_z,:))
   118 ;    print (val_model(ind_z,:))
   119   end if
   120 
   121   if (z .eq. 1) then 
   122 ;    maximum score for the zone, 30N-60N 
   123      score_max = 5.0
   124 ;    index of stations in this zone
   125      ind_z = ind(lat_ob .ge. 30. .and. lat_ob .lt. 60.)
   126 ;    print (ind_z)
   127 ;    print (lat_ob(ind_z)+"/"+lon_ob(ind_z))
   128 ;    print (val_ob(ind_z,:))
   129 ;    print (val_model(ind_z,:))
   130   end if
   131 
   132   if (z .eq. 2) then 
   133 ;    maximum score for the zone, EQ-30N 
   134      score_max = 5.0
   135 ;    index of stations in this zone
   136      ind_z = ind(lat_ob .ge. 0. .and. lat_ob .lt. 30.)
   137 ;    print (ind_z)
   138 ;    print (lat_ob(ind_z)+"/"+lon_ob(ind_z))
   139 ;    print (val_ob(ind_z,:))
   140 ;    print (val_model(ind_z,:))
   141   end if
   142 
   143   if (z .eq. 3) then 
   144 ;    maximum score for the zone, 90S-EQ 
   145      score_max = 5.0
   146 ;    index of stations in this zone
   147      ind_z = ind(lat_ob .lt. 0. )
   148 ;    print (ind_z)
   149 ;    print (lat_ob(ind_z)+"/"+lon_ob(ind_z))
   150 ;    print (val_ob(ind_z,:))
   151 ;    print (val_model(ind_z,:))
   152   end if
   153 
   154  npts = dimsizes(ind_z)
   155  print (npts)
   156 
   157  amp_ob        = new((/npts/),float)
   158  amp_model     = new((/npts/),float)
   159 
   160  amp_ratio_sta = new((/npts/),float)
   161  ccr_sta       = new((/npts/),float)
   162  M_sta         = new((/npts/),float)
   163  score_sta     = new((/npts/),float)
   164 
   165  do n=0,npts-1
   166     amp_ob(n)    = max(val_ob(ind_z(n),:)) - min(val_ob(ind_z(n),:)) 
   167     amp_model(n) = max(val_model(ind_z(n),:)) - min(val_model(ind_z(n),:))
   168 
   169     amp_ratio_sta(n) = amp_model(n)/amp_ob(n)
   170     ccr_sta(n) = esccr(val_ob(ind_z(n),:),val_model(ind_z(n),:),0)
   171     M_sta(n) = 1.-abs(amp_ratio_sta(n)-1.)
   172     score_sta(n) = (ccr_sta(n)*ccr_sta(n) + M_sta(n))*0.5 * score_max
   173 
   174     print (sta(ind_z(n))+"/"+lat(ind_z(n))+"/"+lon(ind_z(n))+"/"+amp_ratio_sta(n)+"/"+ccr_sta(n)+"/"+M_sta(n)+"/"+score_sta(n))  
   175  end do
   176 
   177  amp_ratio_zone = avg(amp_ratio_sta)
   178  ccr_zone       = avg(ccr_sta)
   179  M_zone   = 1.- (sum(abs(amp_model-amp_ob)/(amp_model+amp_ob))/npts) 
   180  score_zone   = (ccr_zone*ccr_zone + M_zone)*0.5 * score_max
   181 
   182  print (npts+"/"+amp_ratio_zone+"/"+ccr_zone+"/"+M_zone+"/"+score_zone)  
   183 ;****************************************************************************
   184 ; Cases [Model]
   185   case      = (/ "Lat", "Lon", "AR" /) 
   186   nCase     = dimsizes(case )                 ; # of Cases [Cases]
   187 
   188 ; variables compared
   189   var       = sta(ind_z) 
   190   nVar      = dimsizes(var)                   ; # of Variables
   191 
   192 ; "Case A"                        
   193   CA_ratio   = (/lat(ind_z)/)
   194 
   195 ; "Case B"                        
   196   CB_ratio   = (/lon(ind_z)/)
   197 
   198 ; "Case C"                        
   199   CC_ratio   = (/amp_ratio_sta/)
   200 
   201 
   202 ; arrays to be passed to taylor_diagram. It will calculate the x xnd y coordinates.
   203   ratio      = new ((/nCase, nVar/),typeof(CA_ratio) )  
   204 
   205   ratio(0,:) = CA_ratio 
   206   ratio(1,:) = CB_ratio
   207   ratio(2,:) = CC_ratio
   208 
   209 ;**************************************************
   210 ; fill an array for a "taylor metrics table"
   211 ;**************************************************
   212 
   213 ; season    = (/ "ANN" /)
   214 ; nSeason   = dimsizes(season)
   215   season    = (/ "" /)
   216   nSeason   = dimsizes(season)
   217 
   218   table     = new ( (/nCase,nVar/), typeof(ratio) )
   219   table(0,:) = CA_ratio
   220   table(1,:) = CB_ratio
   221   table(2,:) = CC_ratio
   222 
   223   tt_opt        = True
   224   tt_opt@pltType= "ps"                  ; "eps" [default], "pdf", "ps"
   225                                          ; "png", "gif" [if you have ImageMajik 'convert']
   226 
   227   tt_opt@tableTitle = "Station in 60N_90N"
   228 
   229   varSource =var
   230 
   231   metrics_table("metrics", varSource, case , table, tt_opt)
   232 
   233  delete (ind_z)
   234  delete (amp_model)
   235  delete (amp_ob)
   236  delete (amp_ratio_sta)
   237  delete (ccr_sta)
   238  delete (M_sta)
   239  delete (score_sta)
   240  end do
   241 end