Changes between Version 6 and Version 7 of OMI_observation_diagnostics_PDAF3


Ignore:
Timestamp:
Apr 17, 2026, 9:03:23 AM (18 hours ago)
Author:
lnerger
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • OMI_observation_diagnostics_PDAF3

    v6 v7  
    4040   * [#PDAFomi_set_obs_diag PDAFomi_set_obs_diag]
    4141 * Statistics
    42    * [#PDAFomi_diag_obs_rmsd PDAFomi_diag_obs_rmsd] - root mean square difference
    43    * [#PDAFomi_diag_stats PDAFomi_diag_stats] - set of 6 statistics
     42   * [#PDAFomi_diag_obs_rmsd PDAFomi_diag_rmsd] - root mean square difference
     43   * [#PDAFomi_diag_stats PDAFomi_diag_diffstats] - set of 6 statistics
     44   * [#PDAFomi_diag_stats PDAFomi_diag_crps] - CRPS (Continuous ranked probability score)
    4445 * Access to observation dimensions
    4546   * [#PDAFomi_diag_nobstypes PDAFomi_diag_nobstypes] - number of observation types
     
    8182== Statistics ==
    8283
    83 === PDAFomi_diag_obs_rmsd ===
     84=== PDAFomi_diag_rmsd ===
    8485
    8586The routine returns a pointer to a vector of the root-mean square difference (RMSD) between the observations and the observed ensemble mean for each observation type.
     
    8788The interface is:
    8889{{{
    89   SUBROUTINE PDAFomi_diag_obs_rmsd(nobs, rmsd_pointer, verbose)
     90  SUBROUTINE PDAFomi_diag_rmsd(nobs, rmsd_pointer, verbose)
    9091
    9192    INTEGER, INTENT(inout) :: nobs                   ! Number of observation types
     
    99100 * If the observation diagnostics have been deactivated by using `PDAFomi_set_obs_diag`, the pointer array will not be set and `nobs=0` is returned. One can check the value of `nobs` before assessing the pointer array.
    100101 * A more extensive set of statistics can be obtained using the routine `PDAFomi_diag_stats`.
    101 
    102 
    103 === PDAFomi_diag_stats ===
     102 * There is also the routine `PDAFomi_diag_obs_rmsd`. It has the same functionality. The routine `PDAFomi_diag_rmsd` is a clarification of the name.
     103
     104
     105=== PDAFomi_diag_diffstats ===
    104106
    105107The routine returns a pointer to an array of a selection of 6 statistics comparing the observations and the observed ensemble mean for each observation type. The statistics can, for example, be used to plot a Taylor diagram.
     
    107109The interface is:
    108110{{{
    109   SUBROUTINE PDAFomi_diag_stats(nobs, obsstats_ptr, verbose)
     111  SUBROUTINE PDAFomi_diag_diffstats(nobs, obsstats_ptr, verbose)
    110112
    111113    INTEGER, INTENT(inout) :: nobs                     ! Number of observation types
     
    126128 * If the observation diagnostics have been deactivated by using `PDAFomi_set_obs_diag`, the pointer array will not be set and `nobs=0` is. One can check this value before assessing the pointer array
    127129 * The routine returns the centered RMSD as displayed in Taylor diagrams. The non-centered RMSD can be computed using `PDAFomi_diag_obs_rmsd`.
     130 * There is also the routine `PDAFomi_diag_stats`, which is an alias to `PDAFomi_diag_diffstats`. (The latter name was introduced with PDAF V3.1 as a clarification).
     131
     132
     133
     134=== PDAFomi_diag_crps ===
     135
     136The routine returns a pointer to an array of the CRPS (Continuous Ranked Probability Score) and its decomposition into
     137reliability, potential CRPS, resolution and uncertainty. The values are provided separately for each observation type.
     138
     139The decomposition into reliability and potential CRPS is
     140 * CRPS = RELI + pot_CRPS. In addition the uncertainty is computed.
     141 * Resolution can be computed by RESOL = UNCERT - pot_CRPS.
     142 * A perfectly reliable system gives RELI=0.
     143 * An informative system gives RESOL ~ UNCERT or pot_CRPS << UNCERT.
     144
     145The computation follows H. Hersbach, Weather and Forecasting, 15 (2000) 599-570.
     146
     147The interface is:
     148{{{
     149  SUBROUTINE PDAFomi_diag_crps(nobs, crps_ptr, perturb, verbose)
     150
     151    INTEGER, INTENT(inout) :: nobs                   ! Number of observation types
     152    REAL, POINTER, INTENT(inout) :: crps_ptr(:,:)    ! Pointer to vector of CRPS values
     153                                                     !   the second index is for the observation type; the first is
     154                                                     !   crps_ptr(1, :) = CRPS
     155                                                     !   crps_ptr(2, :) = reli
     156                                                     !   crps_ptr(3, :) = pot_CRPS
     157                                                     !   crps_ptr(4, :) = uncert
     158    INTEGER, INTENT(in) :: perturb                   ! 1: add perturbations to observations;
     159                                                     ! 0: use unperturbed observations
     160    INTEGER, INTENT(in) :: verbose                   ! Verbosity flag, >0 for output
     161}}}
     162
     163Hints:
     164 * The computed CRPS is for the global model domain. Thus, in case of a parallelized model, all process sub-domains are taken into account and calling the routine will return the same value for all processes.
     165 * In Fortran user code the pointer should be declared in the form[[BR]] `REAL, POINTER :: crps_ptr(:,:)`[[BR]] It does not need to be allocated. The target array has the length `(4, nobs)`.
     166 * If the observation diagnostics have not been activated the pointer array will not be set and `nobs=0` is returned. One can check this value before assessing the pointer array.
     167 * The routine uses a rather simple sorting algorithm. Accordingly, the performance is likely suboptimal for high-dimensional cases.
     168 * There is an analogous routine for use outside of PDAF-OMI: [wiki:PDAF_diag_crps].
    128169
    129170