Changes between Version 6 and Version 7 of OMI_observation_diagnostics_PDAF3
- Timestamp:
- Apr 17, 2026, 9:03:23 AM (18 hours ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
OMI_observation_diagnostics_PDAF3
v6 v7 40 40 * [#PDAFomi_set_obs_diag PDAFomi_set_obs_diag] 41 41 * 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) 44 45 * Access to observation dimensions 45 46 * [#PDAFomi_diag_nobstypes PDAFomi_diag_nobstypes] - number of observation types … … 81 82 == Statistics == 82 83 83 === PDAFomi_diag_ obs_rmsd ===84 === PDAFomi_diag_rmsd === 84 85 85 86 The 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. … … 87 88 The interface is: 88 89 {{{ 89 SUBROUTINE PDAFomi_diag_ obs_rmsd(nobs, rmsd_pointer, verbose)90 SUBROUTINE PDAFomi_diag_rmsd(nobs, rmsd_pointer, verbose) 90 91 91 92 INTEGER, INTENT(inout) :: nobs ! Number of observation types … … 99 100 * 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. 100 101 * 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 === 104 106 105 107 The 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. … … 107 109 The interface is: 108 110 {{{ 109 SUBROUTINE PDAFomi_diag_ stats(nobs, obsstats_ptr, verbose)111 SUBROUTINE PDAFomi_diag_diffstats(nobs, obsstats_ptr, verbose) 110 112 111 113 INTEGER, INTENT(inout) :: nobs ! Number of observation types … … 126 128 * 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 127 129 * 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 136 The routine returns a pointer to an array of the CRPS (Continuous Ranked Probability Score) and its decomposition into 137 reliability, potential CRPS, resolution and uncertainty. The values are provided separately for each observation type. 138 139 The 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 145 The computation follows H. Hersbach, Weather and Forecasting, 15 (2000) 599-570. 146 147 The 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 163 Hints: 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]. 128 169 129 170
