[Dart-dev] [6471] DART/trunk: All changes relate only to obs_diag.

nancy at ucar.edu nancy at ucar.edu
Wed Sep 11 16:23:45 MDT 2013


Revision: 6471
Author:   thoar
Date:     2013-09-11 16:23:44 -0600 (Wed, 11 Sep 2013)
Log Message:
-----------
All changes relate only to obs_diag.

obs_diag   can calculate statistics for 'trusted' observations regardless of the DART QC.
obs_diag   can now use the 'truth' copy as the basis for the calculations.
obs_diag   can now optionally NOT create a rank_histogram (if it is possible in the first place)

Removed the (deprecated) input_qc_threshold variable from all namelists in the repository.
Added the following namelist variables if they weren't already there:

create_rank_histogram ... can now turn off if desired
outliers_in_histogram ... include "rejected" obs in histogram
use_zero_error_obs    ... can use 'truth' copy with 0.0 error variance
trusted_obs           ... can list observation types that are immune to the DART QC
                          As long as the forward operator worked, they are used.

Modified Paths:
--------------
    DART/trunk/diagnostics/oned/obs_diag.f90
    DART/trunk/diagnostics/oned/obs_diag.nml
    DART/trunk/diagnostics/threed_sphere/obs_diag.f90
    DART/trunk/diagnostics/threed_sphere/obs_diag.html
    DART/trunk/diagnostics/threed_sphere/obs_diag.nml
    DART/trunk/models/9var/work/input.nml
    DART/trunk/models/CESM/work/input.nml
    DART/trunk/models/MITgcm_annulus/work/input.nml
    DART/trunk/models/MITgcm_ocean/work/input.nml
    DART/trunk/models/NCOMMAS/work/input.nml
    DART/trunk/models/POP/work/input.nml
    DART/trunk/models/am2/work/input.nml
    DART/trunk/models/bgrid_solo/work/input.nml
    DART/trunk/models/cam/shell_scripts/input.nml.diag.template
    DART/trunk/models/cam/shell_scripts/input.normal.nml
    DART/trunk/models/cam/shell_scripts/input.pert0.nml
    DART/trunk/models/cam/work/input.nml
    DART/trunk/models/cam/work/input_1.nml
    DART/trunk/models/cam/work/input_capt.nml
    DART/trunk/models/cam/work/input_n.nml
    DART/trunk/models/clm/work/input.nml
    DART/trunk/models/coamps/templates/EXAMPLE.input.nml
    DART/trunk/models/coamps_nest/templates/EXAMPLE.input.nml
    DART/trunk/models/coamps_nest/templates/EXPERIMENT_EXAMPLE/input.nml
    DART/trunk/models/dynamo/work/input.nml
    DART/trunk/models/forced_barot/work/input.nml
    DART/trunk/models/forced_lorenz_96/work/input.nml
    DART/trunk/models/gitm/work/input.nml
    DART/trunk/models/ikeda/work/input.nml
    DART/trunk/models/lorenz_04/work/input.nml
    DART/trunk/models/lorenz_63/work/input.nml
    DART/trunk/models/lorenz_63/work/input.workshop.nml
    DART/trunk/models/lorenz_84/work/input.nml
    DART/trunk/models/lorenz_96/work/input.nml
    DART/trunk/models/lorenz_96/work/input.workshop.nml
    DART/trunk/models/lorenz_96_2scale/work/input.nml
    DART/trunk/models/mpas_atm/work/input.nml
    DART/trunk/models/mpas_ocn/shell_scripts/input.nml.template
    DART/trunk/models/mpas_ocn/work/input.nml
    DART/trunk/models/noah/work/input.nml
    DART/trunk/models/null_model/work/input.nml
    DART/trunk/models/pe2lyr/work/input.nml
    DART/trunk/models/rose/work/input.nml
    DART/trunk/models/simple_advection/work/input.nml
    DART/trunk/models/sqg/work/input.nml
    DART/trunk/models/template/work/input.nml
    DART/trunk/models/tiegcm/work/input.nml
    DART/trunk/models/wrf/experiments/Radar/input.nml
    DART/trunk/models/wrf/regression/CONUS-V2/input.nml
    DART/trunk/models/wrf/regression/CONUS-V3/icbc_real.ksh
    DART/trunk/models/wrf/regression/Global-V3/input.nml.2002Dec31
    DART/trunk/models/wrf/regression/Radar/input.nml
    DART/trunk/models/wrf/work/input.nml
    DART/trunk/observations/utilities/threed_sphere/input.nml

-------------- next part --------------
Modified: DART/trunk/diagnostics/oned/obs_diag.f90
===================================================================
--- DART/trunk/diagnostics/oned/obs_diag.f90	2013-09-11 16:14:24 UTC (rev 6470)
+++ DART/trunk/diagnostics/oned/obs_diag.f90	2013-09-11 22:23:44 UTC (rev 6471)
@@ -154,6 +154,7 @@
 logical :: verbose               = .false.
 logical :: outliers_in_histogram = .true.
 logical :: create_rank_histogram = .true.
+logical :: use_zero_error_obs    = .false.
 
 ! index 1 == region 1 == [0.0, 1.0) i.e. Entire domain
 ! index 2 == region 2 == [0.0, 0.5)
@@ -171,7 +172,7 @@
                         init_skip_days, init_skip_seconds, max_num_bins, &
                         Nregions, lonlim1, lonlim2, reg_names, &
                         verbose, outliers_in_histogram,        &
-                        create_rank_histogram, trusted_obs
+                        create_rank_histogram, trusted_obs, use_zero_error_obs
 
 !-----------------------------------------------------------------------
 ! Variables used to accumulate the statistics.
@@ -545,7 +546,6 @@
          flavor      = get_obs_kind(obs_def) ! this is (almost) always [1,max_obs_kinds]
          obs_time    = get_obs_def_time(obs_def)
          obs_loc     = get_obs_def_location(obs_def)
-         obs_err_var = get_obs_def_error_variance(obs_def)
          rlocation   = get_location(obs_loc)
 
          ! Check to make sure we are past the burn-in 
@@ -557,6 +557,12 @@
             trusted = is_observation_trusted( get_obs_kind_name(flavor) )
          endif
 
+         if ( use_zero_error_obs ) then
+            obs_err_var = 0.0_r8
+         else
+            obs_err_var = get_obs_def_error_variance(obs_def)
+         endif
+
          ! Check to see if it is an identity observation.
          ! If it is, we count them and skip them since they are better
          ! explored with the model-space diagnostics.
@@ -1362,12 +1368,19 @@
 
    metadata = get_copy_meta_data(seq,i)
 
-   if(index(metadata, 'observation'              ) > 0) obs_copy_index = i
+   if ( use_zero_error_obs ) then
+      if(index(metadata, 'truth'       ) > 0) obs_copy_index = i
+   else
+      if(index(metadata, 'observation' ) > 0) obs_copy_index = i
+   endif
+
    if(index(metadata, 'prior ensemble mean'      ) > 0) prior_mean_index = i
    if(index(metadata, 'posterior ensemble mean'  ) > 0) posterior_mean_index = i
    if(index(metadata, 'prior ensemble spread'    ) > 0) prior_spread_index = i
    if(index(metadata, 'posterior ensemble spread') > 0) posterior_spread_index = i
-   if(index(metadata, 'prior ensemble member'    ) > 0) then
+
+   if(index(metadata, 'prior ensemble member'    ) > 0 .and. &
+      create_rank_histogram ) then
          ens_count  = ens_count + 1
          ens_copy_index(ens_count) = i
    endif
@@ -1384,10 +1397,6 @@
 ! Make sure we find an index for each of them.
 !--------------------------------------------------------------------
 
-if (         obs_copy_index < 0 ) then
-   write(msgstring1,*)'metadata:observation not found'
-   call error_handler(E_MSG,'SetIndices',msgstring1)
-endif
 if (       prior_mean_index < 0 ) then
    write(msgstring1,*)'metadata:prior ensemble mean not found'
    call error_handler(E_MSG,'SetIndices',msgstring1)
@@ -1408,25 +1417,34 @@
    write(msgstring1,*)'metadata:Quality Control not found'
    call error_handler(E_MSG,'SetIndices',msgstring1)
 endif
-if ( any( (/obs_copy_index, prior_mean_index, posterior_mean_index, &
-            prior_spread_index, posterior_spread_index, &
-            org_qc_index /) < 0) ) then
-   write(msgstring1,*)'metadata incomplete'
-   call error_handler(E_ERR,'SetIndices',msgstring1,source,revision,revdate)
-endif
-
 if (         dart_qc_index < 0 ) then
    write(msgstring1,*)'metadata:DART quality control not found'
    call error_handler(E_MSG,'SetIndices',msgstring1)
 endif
 
+! Only require obs_index to be present; this allows the program
+! to be run on obs_seq.in files which have no means or spread.
+
+if ( obs_copy_index < 0 ) then
+   if ( use_zero_error_obs ) then
+      write(msgstring1,*)'metadata:truth       not found'
+   else
+      write(msgstring1,*)'metadata:observation not found'
+   endif
+   call error_handler(E_MSG,'SetIndices',msgstring1)
+endif
+
 !--------------------------------------------------------------------
 ! Echo what we found. If we want to.
 !--------------------------------------------------------------------
-
 if (verbose) then
-   write(msgstring1,'(''observation          index '',i2,'' metadata '',a)') &
+   if ( use_zero_error_obs ) then
+      write(msgstring1,'(''truth                index '',i2,'' metadata '',a)') &
         obs_copy_index, trim(adjustl(get_copy_meta_data(seq,obs_copy_index)))
+   else
+      write(msgstring1,'(''observation          index '',i2,'' metadata '',a)') &
+        obs_copy_index, trim(adjustl(get_copy_meta_data(seq,obs_copy_index)))
+   endif
    call error_handler(E_MSG,'SetIndices',msgstring1,source,revision,revdate)
    
    write(msgstring1,'(''prior mean           index '',i2,'' metadata '',a)') &

Modified: DART/trunk/diagnostics/oned/obs_diag.nml
===================================================================
--- DART/trunk/diagnostics/oned/obs_diag.nml	2013-09-11 16:14:24 UTC (rev 6470)
+++ DART/trunk/diagnostics/oned/obs_diag.nml	2013-09-11 22:23:44 UTC (rev 6471)
@@ -14,6 +14,7 @@
    reg_names             = 'whole', 'yin', 'yang', 'bogus',
    create_rank_histogram = .true.,
    outliers_in_histogram = .true.,
+   use_zero_error_obs    = .false.,
    verbose               = .false.
    /
 

Modified: DART/trunk/diagnostics/threed_sphere/obs_diag.f90
===================================================================
--- DART/trunk/diagnostics/threed_sphere/obs_diag.f90	2013-09-11 16:14:24 UTC (rev 6470)
+++ DART/trunk/diagnostics/threed_sphere/obs_diag.f90	2013-09-11 22:23:44 UTC (rev 6471)
@@ -202,6 +202,7 @@
 logical :: verbose               = .false.
 logical :: outliers_in_histogram = .false.
 logical :: create_rank_histogram = .true.
+logical :: use_zero_error_obs    = .false.
 
 namelist /obs_diag_nml/ obs_sequence_name, obs_sequence_list,                 &
                        first_bin_center, last_bin_center,                     &
@@ -211,7 +212,7 @@
                        reg_names, print_mismatched_locs, print_obs_locations, &
                        create_rank_histogram, outliers_in_histogram,          &
                        plevel_edges, hlevel_edges, mlevel_edges,              &
-                       verbose, trusted_obs
+                       verbose, trusted_obs, use_zero_error_obs
 
 !-----------------------------------------------------------------------
 ! Variables used to accumulate the statistics.
@@ -689,7 +690,11 @@
          if(vert_is_pressure(obs_loc)) obslevel = 0.01_r8 * obsloc3(3)
 
          ! same sort of thing for the scale factors
-         obs_error_variance = get_obs_def_error_variance(obs_def)
+         if ( use_zero_error_obs ) then
+            obs_error_variance = 0.0_r8
+         else
+            obs_error_variance = get_obs_def_error_variance(obs_def)
+         endif
          obs_err_var = obs_error_variance * &
                        scale_factor(flavor) * scale_factor(flavor)
 
@@ -2306,12 +2311,16 @@
 
    metadata = get_copy_meta_data(seq,i)
 
-   if(index(metadata,'observation'              ) > 0)              obs_index = i
+   if ( use_zero_error_obs ) then
+      if(index(metadata,'truth'        ) > 0) obs_index = i
+   else
+      if(index(metadata,'observation'  ) > 0) obs_index = i
+   endif
+
    if(index(metadata,'prior ensemble mean'      ) > 0)       prior_mean_index = i
    if(index(metadata,'posterior ensemble mean'  ) > 0)   posterior_mean_index = i
    if(index(metadata,'prior ensemble spread'    ) > 0)     prior_spread_index = i
    if(index(metadata,'posterior ensemble spread') > 0) posterior_spread_index = i
-   if(index(metadata,'posterior ensemble spread') > 0) posterior_spread_index = i
 
    if(index(metadata, 'prior ensemble member') > 0 .and. &
       create_rank_histogram ) then
@@ -2363,20 +2372,28 @@
 endif
 
 ! Only require obs_index to be present; this allows the program
-! to be run on obs_seq.in files which have no means or spread.  You get
-! less info from them, but you can still plot locations, etc.
+! to be run on obs_seq.in files which have no means or spread.
 
 if ( obs_index < 0 ) then
-   write(string1,*)'metadata:observation not found'
+   if ( use_zero_error_obs ) then
+      write(string1,*)'metadata:truth       not found'
+   else
+      write(string1,*)'metadata:observation not found'
+   endif
    call error_handler(E_ERR,'obs_diag',string1,source,revision,revdate)
 endif
 
 !--------------------------------------------------------------------
 ! Echo what we found.
 !--------------------------------------------------------------------
+if ( use_zero_error_obs ) then
+   write(string1,'(''truth            index '',i2,'' metadata '',a)') &
+     obs_index, trim(get_copy_meta_data(seq,obs_index))
+else
+   write(string1,'(''observation      index '',i2,'' metadata '',a)') &
+     obs_index, trim(get_copy_meta_data(seq,obs_index))
+endif
 
-write(string1,'(''observation      index '',i2,'' metadata '',a)') &
-     obs_index, trim(get_copy_meta_data(seq,obs_index))
 call error_handler(E_MSG,'obs_diag',string1,source,revision,revdate)
 
 if (prior_mean_index > 0 ) then

Modified: DART/trunk/diagnostics/threed_sphere/obs_diag.html
===================================================================
--- DART/trunk/diagnostics/threed_sphere/obs_diag.html	2013-09-11 16:14:24 UTC (rev 6470)
+++ DART/trunk/diagnostics/threed_sphere/obs_diag.html	2013-09-11 22:23:44 UTC (rev 6471)
@@ -55,9 +55,10 @@
    copy called the 'truth' - the noise-free expected observation given 
    the true model state. Since this copy does not, in general, exist for
    the high-order models, all comparisons are made with the copy labelled
-   'observation'. It may, in some instances be useful to compare against
-   the 'truth', in which case you will have to hand-edit the code and 
-   recompile. Caveat emptor.
+   'observation'. <em class=changed>New! There is a namelist variable
+   (<em class=code>use_zero_error_obs</em>) to compare 
+   against the 'truth' instead; the observation error variance is then 
+   automatically set to zero.</em>
 </P>
 <P>
    Each ensemble member applies a forward operator to the state to compute
@@ -98,9 +99,10 @@
    division was made if the model has a threed_sphere or a oned 
    <em class=file>location_mod.f90</em>. It did not make sense to ask the 
    <em class=program>lorenz_96</em> model what part of North America you'd like
-   to investigate. The low-order models output simple text files instead of
+   to investigate. <em class=removed>The low-order models output simple text files instead of
    netCDF files - the intent is to move these toward netCDF files in the near
-   future.
+   future.</em> <em class=changed>The low-order models now also write out similar 
+   netCDF files and the Matlab scripts have been updated accordingly.</em>
 </P>
 <P>
    Identity observations (only possible from "perfect model experiments") 
@@ -129,11 +131,15 @@
    <a href="https://proxy.subversion.ucar.edu/DAReS/DART/trunk/diagnostics/matlab/plot_rank_histogram.m">plot_rank_histogram.m</a>.
 </P>
 <P>
-   <em class="program">obs_diag</em>
+   <em class=removed><em class="program">obs_diag</em>
    is not explicitly designed to explore OSSE's.  In general, it is 
    used for 'real' observations and looks through the metadata for
    the observation sequence to identify which 'copy' is labeled 'observation'.
-   It is THAT copy that is used as the noisy estimate of the truth.
+   It is THAT copy that is used as the noisy estimate of the truth.</em>
+   <em class="program">obs_diag</em> can be configured to compare the 
+   ensemble estimates against the 'observation' copy or the 'truth' copy based
+   on the setting of the <em class=code>use_zero_error_obs</em> namelist variable.
+   
 </P>
 <P>
    The observation sequence files contain only the time of the observation, 
@@ -158,12 +164,12 @@
        <td>The number of observations available to be assimilated.</td></tr>
    <tr><td valign="top"><b>Nused</b></td>
        <td>The number of observations that were assimilated.</td></tr>
-   <tr><td valign="top"><b>NbigQC</b></td>
-       <td>the number of observations that had an undesirable 
-           (original) QC value;</td></tr>
-   <tr><td valign="top"><b>NbadIZ</b></td>
-       <td>the number of observations that had an undesirable 
-           Innovation&nbsp;Z;</td></tr>
+   <tr><td valign="top"><b><em class=removed>NbigQC</em></b></td>
+       <td><em class=changed>Deprecated. the number of observations that had 'large' 
+           (original) QC values;</em></td></tr>
+   <tr><td valign="top"><b><em class=removed>NbadIZ</em></b></td>
+       <td><em class=changed>Deprecated. the number of observations that had 'large' 
+           Innovation&nbsp;Z scores (large distance between it and the ensemble);</em></td></tr>
    <tr><td valign="top"><b>NbadUV</b></td>
        <td>the number of velocity observations that had a matching component 
            that was not assimilated;</td></tr>
@@ -228,42 +234,6 @@
 </P>
 
 <P>
-   The 3D <em class=program>obs_diag</em> has:
-</P>
-<OL>
-   <LI>the ability to create rank histograms <em>IFF</em> the prior
-   ensemble members are preserved in the <em class=file>obs_seq.final</em> file,
-   </LI>
-
-   <LI><em>deprecated - use</em> <em class=program>obs_seq_to_netcdf</em> <em>instead</em>
-       <em class="removed">the ability to output a text file of the locations of the observations
-       to facilitate scatterplots of observation density by type and QC value,</em></LI>
-
-   <LI>an improved capacity for reading multiple 
-   <em class=file>obs_seq.final</em> files (see the namelist entry for
-   <em class=code>obs_sequence_list</em>)</LI>
-
-   <LI>a greatly expanded namelist control (including multiple, user-defined 
-   levels),</LI>
-
-   <LI>(one) netCDF output file <em class="file">obs_diag_output.nc</em>
-   (instead of MANY impenetrable plain text files) -- complete with all 
-   the metadata needed to make sensible, accurate graphics,</LI>
-
-   <LI>better reporting of the times/dates it encounters in the input files, 
-   making it easier to set the namelist parameters 
-   <em class=code>first_bin_center, last_bin_center</em>,</LI>
-
-   <LI>regions that can "wrap" in longitude,</LI>
-
-   <LI>discontinued the rejection of observations based on the 
-   <em class=code>rat_cri</em> or <em class=code>input_qc_threshold</em> 
-   namelist variables (the counts of these are available in the 
-   netCDF file as <b>NbadQC</b> and <b>NbadIZ</b>, respectively).</LI>
-
-</OL>
-
-<P>
    The DART QC flag is intended to provide information about whether the
    observation was assimilated, evaluated only, whether the assimilation resulted
    in a 'good' observation, etc. Here is the table that should explain things:
@@ -287,8 +257,53 @@
    <tr><td>7</td><td>rejected because failed outlier threshold test</td></tr>
    <tr><td>8+</td><td>reserved for future use</td></tr>
 </table>
+<P></P>
 
 <!--==================================================================-->
+
+<A NAME="New"></A>
+<div class="top">[<a href="#">top</a>]</div><hr />
+<H2>What is new in the Lanai Release.</H2>
+<P>
+   <em class=program>obs_diag</em> has several improvements:
+</P>
+<ol><li>Improved vertical specification. Namelist variables 
+        <em class=code>[h,p,m]level_edges</em> allow fine-grained control
+        over the vertical binning. It is not allowed to specify both the
+        edges and midpoints for the vertical bins.
+        </li><br />
+    <li>Improved error-checking for input specification, particularly
+        the vertical bins. Repeated values are squeezed out.
+        </li><br />
+    <li>Support for 'trusted' observations. Trusted observation types may
+        be specified in the namelist and all observations of that type will
+        be counted in the statistics despite the DART QC code (as long as the
+        forward observation operator succeeds).
+        See namelist variable <em class=code>trusted_obs</em>.
+        </li><br />
+    <li>Support for 'true' observations (i.e. from an OSSE). If the
+        'truth' copy of an observation is desired for comparison (instead of
+        the default copy) the observation error variance is set to 0.0
+        and the statistics are calculated relative to the 'truth' copy
+        (as opposed to the normal 'noisy' or 'observation' copy).
+        See namelist variable <em class=code>use_zero_error_obs</em>.
+        </li><br />
+    <li>discontinued the use of <em class=code>rat_cri</em> and 
+        <em class=code>input_qc_threshold</em> namelist variables.
+        Their functionality was replaced by the DART QC mechanism long ago.
+        The netCDF file variables <b>NbadIZ</b> and <b>NbigQC</b> still
+        exist (so as to keep the structure of the obs_diag_output file
+        constant for the stragglers) but contain meaningless values.
+        The 'M' release of DART will remove these variables from the 
+        obs_diag_output file.
+        </li><br />
+     <li>The creation of the rank histogram (if possible) is now 
+        namelist-controlled by
+        namelist variable <em class=code>create_rank_histogram</em>.
+        </li>
+</ol>
+
+<!--==================================================================-->
 <!--=================== DESCRIPTION OF A NAMELIST  ===================-->
 <!--==================================================================-->
 
@@ -316,19 +331,30 @@
    time_to_skip     =     0, 0, 0, 6, 0, 0 ,
    max_num_bins     = 1000,
    <em class=removed>rat_cri            = 3.0,</em>
-   input_qc_threshold = 3.0,
-   trusted_obs        = 'null',
+   <em class=removed>input_qc_threshold = 3.0,</em>
+
+   plevel     = 1000, 925, 850, 700, 500, 400, 300, 250, 200, 150, 100,
+   hlevel     = 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000,
+   mlevel     = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+
    Nregions   = 4,
    lonlim1    =   0.0,   0.0,   0.0, 235.0,
    lonlim2    = 360.0, 360.0, 360.0, 295.0,
    latlim1    =  20.0, -80.0, -20.0,  25.0,
    latlim2    =  80.0, -20.0,  20.0,  55.0,
    reg_names  = 'Northern Hemisphere', 'Southern Hemisphere', 'Tropics', 'North America',
+
+   <em class=changed>trusted_obs      = 'null',</em>
    print_mismatched_locs = .false.,
    create_rank_histogram = .false.,
    outliers_in_histogram = .false.,
+   <em class=changed>use_zero_error_obs             = .false.,</em>
    verbose               = .false.  
-/
+   /
+
+   <em class=changed>-or- plevel_edges = 1050, 962.5, 887.5, 775, 600, 450, 350, 275, 225, 175, 125, 75</em>
+   <em class=changed>-or- hlevel_edges = 0, 1500, 2500, 3500, 4500, 5500, 6500,</em>
+   <em class=changed>-or- mlevel_edges = 0.5, 1.5, 2.5, 3.5, 10.5,</em>
 </pre>
 </div>
 
@@ -336,9 +362,10 @@
 <br />
 
 <P> The date-time integer arrays in this namelist have the form
-   (YYYY, MM, DE, HR, MIN, SEC). <br /> The allowable ranges for the region
+   (YYYY, MM, DY, HR, MIN, SEC). <br /> The allowable ranges for the region
    boundaries are: latitude [-90.,90], longitude [0.,Inf.]
-</P><P>
+</P>
+<P>
    You can only specify <strong>either</strong> <em
    class="code">obs_sequence_name</em> <strong>or</strong> <em
    class="code">obs_sequence_list</em> -- not both.  One of them has to be an
@@ -431,101 +458,149 @@
 </TD></TR>
 
 <TR><TD> plevel </TD>
-    <TD> integer, <em class="new">dimension(50)</em> </TD>
+    <TD> real, dimension(50) </TD>
     <TD>The midpoints defining the pressure levels for the vertical binning.
 There is no specification of bin width - a continuum is used. If a single
 midpoint value is entered, the bin edges are +/- 10% of the midpoint value.
 If you'd like to change that see the routine <em class="routine">Rmidpoints2edges()</em>.
+        You may specify either <em class=code>plevel</em> or 
+        <em class=code>plevel_edges</em>, but not both.
 </TD></TR>
 
+<TR><TD> <em class=new>plevel_edges</em> </TD>
+    <TD> real, dimension(51) </TD>
+    <TD>The edges defining the pressure levels for the vertical binning.
+        You may specify either <em class=code>plevel</em> or 
+        <em class=code>plevel_edges</em>, but not both.
+</TD></TR>
+
 <TR><TD> hlevel </TD>
-    <TD> integer, <em class="new">dimension(50)</em> </TD>
-    <TD>Same, but for observations that have height(m) as the vertical coordinate.
+    <TD> real, dimension(50) </TD>
+    <TD>Same, but for observations that have height(m) or depth(m) as the vertical coordinate.
 </TD></TR>
+<TR><TD> <em class=new>hlevel_edges</em> </TD>
+    <TD> real, dimension(51) </TD>
+    <TD>The edges defining the height (or depth) levels for the vertical binning.
+        You may specify either <em class=code>hlevel</em> or 
+        <em class=code>hlevel_edges</em>, but not both.
+</TD></TR>
 
 <TR><TD> mlevel </TD>
-    <TD> integer, <em class="new">dimension(50)</em> </TD>
-    <TD>Same, but for observations on model level
+    <TD> real, dimension(50) </TD>
+    <TD>Same, but for observations that have model level as the vertical coordinate.
 </TD></TR>
+<TR><TD> <em class=new>mlevel_edges</em> </TD>
+    <TD> real, dimension(51) </TD>
+    <TD>The edges defining the model levels for the vertical binning.
+        You may specify either <em class=code>mlevel</em> or 
+        <em class=code>mlevel_edges</em>, but not both.
+</TD></TR>
 
+
 <TR><TD> <em class=removed>rat_cri</em> </TD>
-    <TD> <em class=removed>real</em> </TD>
-    <TD>Deprecated. This was useful before the advent of the DART QC mechanism,
-        which has been in place for years now. The only thing <em class=code>rat_cri</em>
-        did was to count how many observations were 'far' away from the ensemble, 
-        something the DART QC codes convey much better. The histogram of the magnitude 
-        of the innovations is still in <em class=file>LargeInnov.txt</em>&nbsp;.
+    <TD> real </TD>
+    <TD><em class=changed>Deprecated. This was useful before the advent of the 
+        DART QC mechanism, which has been in place for years now. 
+	The only thing <em class=code>rat_cri</em> did was to count how many 
+	observations were 'far' away from the ensemble, something the DART QC 
+	codes convey much better. The histogram of the magnitude of the 
+	innovations is still in <em class=file>LargeInnov.txt</em>&nbsp;.</em>
         
 </TD></TR>
 
-<TR><TD> input_qc_threshold </TD>
+<TR><TD> <em class=removed>input_qc_threshold</em> </TD>
     <TD> real </TD>
-    <TD>Observations with quality control values greater than this 
-<em class="removed">will be excluded from the diagnostics</em> will be counted in
-<b>NbadQC</b>.
+    <TD><em class=changed>Deprecated. Observations with original quality control 
+    values greater than this were counted in <b>NbigQC</b>. The DART QC value 
+    has controlled whether or not the observation was rejected or not. </em>
 </TD></TR>
 
 <TR><TD> Nregions </TD>
     <TD> integer </TD>
-    <TD>Number of regions of the globe for which obs space diagnostics
-are computed separately. Must be between [1,50].
+    <TD>Number of regions of the globe for which obs space diagnostics 
+        are computed separately. Must be between [1,50].
 </TD></TR>
 
 <TR><TD> lonlim1 </TD>
-    <TD> real, <em class="new">dimension(50)</em> </TD>
+    <TD> real, dimension(50) </TD>
     <TD>Westernmost longitudes of each of the regions.
 </TD></TR>
 
 <TR><TD> lonlim2 </TD>
-    <TD> real, <em class="new">dimension(50)</em> </TD>
-    <TD>Easternmost longitudes of each of the regions.  <em class="new">If any of
-these values is <b>less than</b> the westernmost values, it defines a region
-that spans the prime meridian. </em> e.g. a specification of
-lonlim1 = 330 , lonlim2 = 50 would identify a region like "Africa".
+    <TD> real, dimension(50) </TD>
+    <TD>Easternmost longitudes of each of the regions.
+        <em class="new">If any of these values is <b>less than</b> the 
+	westernmost values, it defines a region that spans the prime meridian.
+	</em> e.g. a specification of <em class=code>lonlim1 = 330 , 
+	lonlim2 = 50</em> could identify a region like "Africa".
 </TD></TR>
 
 <TR><TD> latlim1 </TD>
-    <TD> real, <em class="new">dimension(50)</em> </TD>
-    <TD>Southernmost latitudes of the regions.
+    <TD> real, dimension(50) </TD>
+    <TD> Southernmost latitudes of the regions.
 </TD></TR>
 
 <TR><TD> latlim2 </TD>
-    <TD> real, <em class="new">dimension(50)</em> </TD>
-    <TD>Northernmost latitudes of the regions.
+    <TD> real, dimension(50) </TD>
+    <TD> Northernmost latitudes of the regions.
 </TD></TR>
 
 <TR><TD> reg_names </TD>
-    <TD> character(len=129), <em class="new">dimension(50)</em>  </TD>
-    <TD>Array of names for the regions to be analyzed.  Will be used
-for plot titles.
+    <TD> character(len=129), dimension(50) </TD>
+    <TD> Array of names for the regions to be analyzed.  Will be used
+         for plot titles.
 </TD></TR>
 
+<TR><TD> trusted_obs </TD>
+    <TD> character(len=32), dimension(50) </TD>
+    <TD> list of observation types that <strong>must</strong>
+         participate in the calculation of the statistics, regardless
+         of the DART QC (provided that the forward observation operator
+         can still be applied without failure). e.g. 'RADIOSONDE_TEMPERATURE', ...
+</TD></TR>
+
+<TR><TD> use_zero_error_obs </TD>
+    <TD> logical </TD>
+    <TD> if <em class=code>.true.</em>, the observation copy used for the 
+         statistics calculations will be 'truth'.  Only 'perfect' observations
+	 (from <em class=program>perfect_model_obs</em>) have this copy. 
+	 The observation error variance will be set to zero.
+</TD></TR>
+
 <TR><TD> print_mismatched_locs </TD>
     <TD> logical </TD>
-    <TD>Print instances where U and V "pairs" don't have the same location.
+    <TD> Print instances where U and V "pairs" don't have the same location.
 </TD></TR>
 
 <TR><TD><em class=removed>print_obs_locations</em> </TD>
     <TD><em class=removed>logical            </em> </TD>
     <TD>No longer supported.
-<strong>To plot the locations of observations,</strong> please convert 
-your observation sequence file to netCDF with 
-<a href="../../obs_sequence/obs_seq_to_netcdf.html">obs_seq_to_netcdf</a> 
-and then plot with
-<a href="../../diagnostics/matlab/plot_obs_netcdf.m">plot_obs_netcdf</a>
+        <strong>To plot the locations of observations,</strong> please convert 
+	your observation sequence file to netCDF with 
+	<a href="../../obs_sequence/obs_seq_to_netcdf.html">obs_seq_to_netcdf</a>
+	and then plot with
+	<a href="../../diagnostics/matlab/plot_obs_netcdf.m">plot_obs_netcdf</a>
 </TD></TR>
 
-<TR><TD> verbose </TD>
+<TR><TD> create_rank_histogram </TD>
     <TD> logical </TD>
-    <TD>Print extra info about the obs_diag run.
+    <TD> if <em class=code>.true.</em> and there are actual ensemble estimates of the 
+         observations in the <em class=file>obs_seq.final</em> 
+         (i.e. <em class=code>filter_nml:num_output_obs_members</em> is
+         larger than zero), a rank histogram will be created.
 </TD></TR>
 
 <TR><TD> outliers_in_histogram </TD>
     <TD> logical </TD>
-    <TD>Determines whether or not to use observations that have been rejected by
-the outlier threshhold mechanism in the calculation of the rank histogram.
+    <TD> if <em class=code>.true.</em> the  observations that have been 
+         rejected by the outlier threshhold mechanism will be <em> included</em>
+	 in the calculation of the rank histogram.
 </TD></TR>
 
+<TR><TD> verbose </TD>
+    <TD> logical </TD>
+    <TD> Print extra info about the obs_diag run.
+</TD></TR>
 
 </TBODY> 
 </TABLE>
@@ -823,8 +898,8 @@
    bin_width          = <em class="input">    0, 0,30, 0, 0, 0 ,</em>
    time_to_skip       = <em class="input">    0, 0, 0, 0, 0, 0 ,</em>
    max_num_bins       = 1000,
-   rat_cri            = 5000.0,
-   input_qc_threshold = 3.0,
+   <em class=removed>rat_cri            = 5000.0,</em>
+   <em class=removed>input_qc_threshold = 3.0,</em>
    Nregions   = 1,
    lonlim1    = <em class="input">  0.0,</em>
    lonlim2    = <em class="input">360.0,</em>
@@ -937,13 +1012,13 @@
     <!-- comment --><TD VALIGN=top>bin_width, bin_separation, and time_to_skip must have 
                                    year = 0 and month = 0</TD>
 </TR>
-<TR><!-- routine --><TD VALIGN=top>ObsLocationsExist</TD>
-    <!-- message --><TD VALIGN=top>Cannot have pre-existing obs location
-    output files. Stopping.</TD>
-    <!-- comment --><TD VALIGN=top>It is far easier to implement the
+<TR><TD VALIGN=top><em class=removed>ObsLocationsExist</em></TD>
+    <TD VALIGN=top><em class=removed>Cannot have pre-existing obs location
+    output files. Stopping.</em></TD>
+    <TD VALIGN=top><em class=removed>It is far easier to implement the
     logic to output these files if they don't exist in the first place.
     Remove anything/everything like "observation_locations.xxx.dat" from
-    the current directory and try again.</TD>
+    the current directory and try again.</em></TD>
 </TR>
 </TABLE>
 </div>
@@ -964,6 +1039,14 @@
 The RMSE of the vector wind velocity is being used.
 The bias is actually the bias of the wind speed, with no regard to
 direction. Seems like this is not consistent ... 
+<br />
+<br />
+Use log(p) instead of pressure for binning/plotting.
+<br />
+<br />
+Hope to have a separate DART QC flag for observations outside the model state.
+Right now, all observations that have a DARt forward operator fail (extrapolate, mainly)
+get counted as observations that are rejected. Logically, these observations are not possible because most (all?) DART observation operators cannot extrapolate.
 </P>
 
 <!--==================================================================-->

Modified: DART/trunk/diagnostics/threed_sphere/obs_diag.nml
===================================================================
--- DART/trunk/diagnostics/threed_sphere/obs_diag.nml	2013-09-11 16:14:24 UTC (rev 6470)
+++ DART/trunk/diagnostics/threed_sphere/obs_diag.nml	2013-09-11 22:23:44 UTC (rev 6471)
@@ -7,7 +7,14 @@
 #
 # Acceptable latitudes range from  [-90,  90]
 # Acceptable longitudes range from [  0, Inf]
+#
+# you can specify either [phm]level_edges or [phm]level,
+# but not both. You can mix and match. plevel & hlevel_edges is fine.
 
+   plevel_edges = 1050, 962.5, 887.5, 775, 600, 450, 350, 275, 225, 175, 125, 75
+   hlevel_edges = 0, 1500, 2500, 3500, 4500, 5500, 6500,
+   mlevel_edges = 0.5, 1.5, 2.5, 3.5, 10.5,
+
 &obs_diag_nml
    obs_sequence_name = 'obs_seq.final',
    obs_sequence_list = '',
@@ -17,17 +24,23 @@
    bin_width        =     0, 0, 0, 6, 0, 0 ,
    time_to_skip     =     0, 0, 0, 6, 0, 0 ,
    max_num_bins     = 1000,
-   input_qc_threshold = 3.0,
-   trusted_obs        = 'null',
+
+   plevel     = 1000, 925, 850, 700, 500, 400, 300, 250, 200, 150, 100,
+   hlevel     = 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000,
+   mlevel     = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
+
    Nregions   = 4,
    lonlim1    =   0.0,   0.0,   0.0, 235.0,
    lonlim2    = 360.0, 360.0, 360.0, 295.0,
    latlim1    =  20.0, -80.0, -20.0,  25.0,
    latlim2    =  80.0, -20.0,  20.0,  55.0,
    reg_names  = 'Northern Hemisphere', 'Southern Hemisphere', 'Tropics', 'North America',
+
+   trusted_obs           = 'null',
+   use_zero_error_obs    = .false.,
    print_mismatched_locs = .false.,
-   create_rank_histogram = .false.,
-   outliers_in_histogram = .false.,
+   create_rank_histogram = .true.,
+   outliers_in_histogram = .true.,
    verbose               = .false.
    /
 

Modified: DART/trunk/models/9var/work/input.nml
===================================================================
--- DART/trunk/models/9var/work/input.nml	2013-09-11 16:14:24 UTC (rev 6470)
+++ DART/trunk/models/9var/work/input.nml	2013-09-11 22:23:44 UTC (rev 6471)
@@ -197,12 +197,14 @@
    bin_width_seconds     = -1,
    init_skip_days        = 0,
    init_skip_seconds     = 0,
+   trusted_obs           = 'null',
    Nregions              = 3,
    lonlim1               = 0.00, 0.00, 0.50, -1.0,
    lonlim2               = 1.01, 0.50, 1.01, -1.0,
    reg_names             = 'whole', 'yin', 'yang', 'bogus',
    create_rank_histogram = .true.,
    outliers_in_histogram = .true.,
+   use_zero_error_obs    = .false.,
    verbose               = .false.
    /
 

Modified: DART/trunk/models/CESM/work/input.nml
===================================================================
--- DART/trunk/models/CESM/work/input.nml	2013-09-11 16:14:24 UTC (rev 6470)
+++ DART/trunk/models/CESM/work/input.nml	2013-09-11 22:23:44 UTC (rev 6471)
@@ -321,7 +321,7 @@
    bin_width        =     0, 0, 1, 0, 0, 0 ,
    time_to_skip     =     0, 0, 0, 0, 0, 0 ,
    max_num_bins     = 1000,
-   input_qc_threshold = 1,
+   trusted_obs      = 'null',
    Nregions   = 4,
    lonlim1    = 30.0,  130.0, 290.0, 290,
    lonlim2    = 130.0, 270.0, 380.0, 380,
@@ -329,6 +329,9 @@
    latlim2    =  20.0,  50.0,  50.0,  50,
    reg_names  = 'Indian Ocean', 'Pacific', 'Atlantic', 'North Atlantic',
    print_mismatched_locs = .false.,
+   create_rank_histogram = .true.,
+   outliers_in_histogram = .true.,
+   use_zero_error_obs    = .false.,
    verbose               = .true.,
    hlevel =  10.0,  20.0,   30.0,   40.0,  100.0,  
             200.0, 500.0, 1000.0, 2000.0, 

Modified: DART/trunk/models/MITgcm_annulus/work/input.nml
===================================================================
--- DART/trunk/models/MITgcm_annulus/work/input.nml	2013-09-11 16:14:24 UTC (rev 6470)
+++ DART/trunk/models/MITgcm_annulus/work/input.nml	2013-09-11 22:23:44 UTC (rev 6471)
@@ -179,7 +179,7 @@
    bin_width        =     0, 0, 0, 6, 0, 0 ,
    time_to_skip     =     0, 0, 0, 0, 0, 0 ,
    max_num_bins     = 1000,
-   input_qc_threshold = 3.0,
+   trusted_obs      = 'null',
    Nregions   = 4,
    lonlim1    =   0.0,   0.0,   0.0, 235.0,
    lonlim2    = 360.0, 360.0, 360.0, 295.0,
@@ -187,5 +187,9 @@
    latlim2    =  80.0, -20.0,  20.0,  55.0,
    reg_names  = 'Northern Hemisphere', 'Southern Hemisphere', 'Tropics', 'North America',
    print_mismatched_locs = .false.,
-   verbose = .false.  /
+   create_rank_histogram = .true.,
+   outliers_in_histogram = .true.,
+   use_zero_error_obs    = .false.,
+   verbose               = .false.
+   /
 

Modified: DART/trunk/models/MITgcm_ocean/work/input.nml
===================================================================
--- DART/trunk/models/MITgcm_ocean/work/input.nml	2013-09-11 16:14:24 UTC (rev 6470)
+++ DART/trunk/models/MITgcm_ocean/work/input.nml	2013-09-11 22:23:44 UTC (rev 6471)
@@ -271,7 +271,7 @@
    bin_width        =     0, 0, 1, 0, 0, 0 ,
    time_to_skip     =     0, 0, 0, 0, 0, 0 ,
    max_num_bins     = 1000,
-   input_qc_threshold = 3.0,
+   trusted_obs      = 'null',
    Nregions   = 3,
    lonlim1    = 260.0, 270.0, 260.0,
    lonlim2    = 310.0, 310.0, 300.0,
@@ -279,6 +279,9 @@
    latlim2    =  40.0,  20.0,  40.0,
    reg_names  = 'Gulf & Caribbean', 'Caribbean', 'Gulf of Mexico',
    print_mismatched_locs = .false.,
+   create_rank_histogram = .true.,
+   outliers_in_histogram = .true.,
+   use_zero_error_obs    = .false.,
    verbose               = .true.,
    hlevel =  -2.50185,   -7.7967, -13.72595, -20.40305,  -27.9614, 
             -36.55765,  -46.3757,  -57.6311, -70.57615,  -85.5057,

Modified: DART/trunk/models/NCOMMAS/work/input.nml
===================================================================
--- DART/trunk/models/NCOMMAS/work/input.nml	2013-09-11 16:14:24 UTC (rev 6470)
+++ DART/trunk/models/NCOMMAS/work/input.nml	2013-09-11 22:23:44 UTC (rev 6471)
@@ -233,7 +233,7 @@
    bin_width        =     0, 0, 1, 0, 0, 0 ,
    time_to_skip     =     0, 0, 0, 0, 0, 0 ,
    max_num_bins     = 1000,
-   input_qc_threshold = 1,
+   trusted_obs      = 'null',
    Nregions   = 4,
    lonlim1    = 30.0,  130.0, 290.0, 290,
    lonlim2    = 130.0, 270.0, 380.0, 380,
@@ -241,6 +241,9 @@
    latlim2    =  20.0,  50.0,  50.0,  50,
    reg_names  = 'Indian Ocean', 'Pacific', 'Atlantic', 'North Atlantic',
    print_mismatched_locs = .false.,
+   create_rank_histogram = .true.,
+   outliers_in_histogram = .true.,
+   use_zero_error_obs    = .false.,
    verbose               = .true.,
    hlevel =  10.0,  20.0,   30.0,   40.0,  100.0,  
             200.0, 500.0, 1000.0, 2000.0, 

Modified: DART/trunk/models/POP/work/input.nml
===================================================================
--- DART/trunk/models/POP/work/input.nml	2013-09-11 16:14:24 UTC (rev 6470)
+++ DART/trunk/models/POP/work/input.nml	2013-09-11 22:23:44 UTC (rev 6471)
@@ -273,7 +273,7 @@
    bin_width        =     0, 0, 1, 0, 0, 0 ,
    time_to_skip     =     0, 0, 0, 0, 0, 0 ,
    max_num_bins     = 1000,
-   input_qc_threshold = 1,
+   trusted_obs      = 'null',
    Nregions   = 4,
    lonlim1    = 30.0,  130.0, 290.0, 290,
    lonlim2    = 130.0, 270.0, 380.0, 380,
@@ -281,6 +281,9 @@
    latlim2    =  20.0,  50.0,  50.0,  50,
    reg_names  = 'Indian Ocean', 'Pacific', 'Atlantic', 'North Atlantic',
    print_mismatched_locs = .false.,
+   create_rank_histogram = .true.,
+   outliers_in_histogram = .true.,
+   use_zero_error_obs    = .false.,
    verbose               = .true.,
    hlevel =  10.0,  20.0,   30.0,   40.0,  100.0,  
             200.0, 500.0, 1000.0, 2000.0, 

Modified: DART/trunk/models/am2/work/input.nml
===================================================================
--- DART/trunk/models/am2/work/input.nml	2013-09-11 16:14:24 UTC (rev 6470)
+++ DART/trunk/models/am2/work/input.nml	2013-09-11 22:23:44 UTC (rev 6471)
@@ -278,16 +278,19 @@
    bin_separation   =     0, 0, 0, 6, 0, 0 ,
    bin_width        =     0, 0, 0, 6, 0, 0 ,
    time_to_skip     =     0, 0, 1, 0, 0, 0 ,
-   max_num_bins  = 1000,
+   max_num_bins     = 1000,
+   trusted_obs      = 'null',
    Nregions   = 4,
-   input_qc_threshold = 3.0,
    lonlim1    =   0.0,   0.0,   0.0, 235.0,
    lonlim2    = 360.0, 360.0, 360.0, 295.0,
    latlim1    =  20.0, -80.0, -20.0,  25.0,
    latlim2    =  80.0, -20.0,  20.0,  55.0,
    reg_names  = 'Northern Hemisphere', 'Southern Hemisphere', 'Tropics', 'North America',
    print_mismatched_locs = .false.,
-   verbose = .false.
+   create_rank_histogram = .true.,
+   outliers_in_histogram = .true.,
+   use_zero_error_obs    = .false.,
+   verbose               = .false.
    /
 
 

Modified: DART/trunk/models/bgrid_solo/work/input.nml
===================================================================
--- DART/trunk/models/bgrid_solo/work/input.nml	2013-09-11 16:14:24 UTC (rev 6470)
+++ DART/trunk/models/bgrid_solo/work/input.nml	2013-09-11 22:23:44 UTC (rev 6471)
@@ -289,7 +289,7 @@
    bin_width        =     0, 0, 0, 0, 3, 0 ,
    time_to_skip     =     0, 0, 0, 0, 0, 0 ,
    max_num_bins     = 1000,
-   input_qc_threshold = 3.0,
+   trusted_obs      = 'null',
    Nregions   = 4,
    lonlim1    =   0.0,   0.0,   0.0, 235.0,
    lonlim2    = 360.0, 360.0, 360.0, 295.0,
@@ -297,5 +297,9 @@
    latlim2    =  80.0, -20.0,  20.0,  55.0,
    reg_names  = 'Northern Hemisphere', 'Southern Hemisphere', 'Tropics', 'North America',
    print_mismatched_locs = .false.,
-   verbose               = .false.  /
+   create_rank_histogram = .true.,
+   outliers_in_histogram = .true.,
+   use_zero_error_obs    = .false.,
+   verbose               = .false.
+   /
 

Modified: DART/trunk/models/cam/shell_scripts/input.nml.diag.template
===================================================================
--- DART/trunk/models/cam/shell_scripts/input.nml.diag.template	2013-09-11 16:14:24 UTC (rev 6470)
+++ DART/trunk/models/cam/shell_scripts/input.nml.diag.template	2013-09-11 22:23:44 UTC (rev 6471)
@@ -14,16 +14,20 @@
    bin_separation   =     0, 0, 0, 6, 0, 0 ,
    bin_width        =     0, 0, 0, 6, 0, 0 ,
    time_to_skip     =     0, 0, 0, 0, 0, 0 ,
-   max_num_bins  = 1000,
+   max_num_bins     = 1000,
+   trusted_obs      = 'null',
    Nregions   = 4,
-   input_qc_threshold = 4.0,
    lonlim1    =   0.0,   0.0,   0.0, 235.0,
    lonlim2    = 360.0, 360.0, 360.0, 295.0,
    latlim1    =  20.0, -80.0, -20.0,  25.0,
    latlim2    =  80.0, -20.0,  20.0,  55.0,
    reg_names  = 'Northern Hemisphere', 'Southern Hemisphere', 'Tropics', 'North America',
    print_mismatched_locs = .false.,
-   verbose = .false.  /
+   create_rank_histogram = .true.,
+   outliers_in_histogram = .true.,

@@ Diff output truncated at 40000 characters. @@


More information about the Dart-dev mailing list