Changes between Version 1 and Version 2 of OMI_observation_modules_PDAF23
- Timestamp:
- Jun 10, 2025, 12:02:24 PM (7 days ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
OMI_observation_modules_PDAF23
v1 v2 4 4 #!html 5 5 <div class="wiki-toc"> 6 <h4>PDAF-OMI Guide </h4>7 <ol><li><a href="PDAF_OMI_Overview ">Overview</a></li>8 <li><a href="OMI_Callback_obs_pdafomi ">callback_obs_pdafomi.F90</a></li>6 <h4>PDAF-OMI Guide for PDAF2</h4> 7 <ol><li><a href="PDAF_OMI_Overview_DPAF23">Overview</a></li> 8 <li><a href="OMI_Callback_obs_pdafomi_PDAF23">callback_obs_pdafomi.F90</a></li> 9 9 <li>Observation Modules</li> 10 <li><a href="OMI_observation_operators">Observation operators</a></li> 11 <li><a href="OMI_error_checking">Checking error status</a></li> 12 <li><a href="OMI_debugging">Debugging functionality</a></li> 13 <li><a href="OMI_ImplementationofAnalysisStep">Implementing the analysis step with OMI</a></li> 14 <ol> 15 <li> <a href="ImplementFilterAnalysisOverview"> General overview for ensemble filters</a></li> 16 <ol> 17 <li><a href="ImplementAnalysisGlobal">Implementation for Global Filters</a></li> 18 <li><a href="ImplementAnalysisLocal">Implementation for Local Filters</a></li> 19 <li><a href="ImplementAnalysislenkfOmi">Implementation for LEnKF</a></li> 20 </ol> 21 <li> <a href="Implement3DVarAnalysisOverview"> General overview for 3D-Var methods</a></li> 22 <ol> 23 <li><a href="ImplementAnalysis_3DVar">Implementation for 3D-Var</a></li> 24 <li><a href="ImplementAnalysis_3DEnVar">Implementation for 3D Ensemble Var</a></li> 25 <li><a href="ImplementAnalysis_Hyb3DVar">Implementation for Hybrid 3D-Var</a></li> 26 </ol> 27 </ol> 28 <li><a href="OMI_nondiagonal_observation_error_covariance_matrices">Using nondiagonal R-matrices</a></li> 29 <li><a href="Porting_to_OMI">Porting an existing implemention to OMI</a></li> 30 <li><a href="PDAFomi_additional_functionality">Additional OMI Functionality</a></li> 10 <li><a href="OMI_observation_operators_PDAF23">Observation operators</a></li> 11 <li><a href="OMI_error_checking_PDAF23">Checking error status</a></li> 12 <li><a href="OMI_debugging_PDAF23">Debugging functionality</a></li> 13 <li><a href="OMI_ImplementationofAnalysisStep_PDAF23">Implementing the analysis step</a></li> 14 <li><a href="OMI_nondiagonal_observation_error_covariance_matrices_PDAF23">Using nondiagonal R-matrices</a></li> 15 <li><a href="Porting_to_OMI_PDAF23">Porting an existing implemention to OMI</a></li> 16 <li><a href="PDAFomi_additional_functionality_PDAF23">Additional OMI Functionality</a></li> 31 17 </ol> 32 18 </div> … … 89 75 }}} 90 76 91 Apart from these variables, there is a number of variables that are set internally when the routine `PDAFomi_gather_obs` is called. The full data type can be seen on the [wiki:OMI_debugging page on OMI debugging].77 Apart from these variables, there is a number of variables that are set internally when the routine `PDAFomi_gather_obs` is called. The full data type can be seen on the [wiki:OMI_debugging_PDAF23 page on OMI debugging]. 92 78 93 79 … … 104 90 105 91 The main variables that the filled in this routine are 106 1. [ wiki:OMI_observation_modules#thisobsdoassim thisobs%doassim]: Specify whether this observation type is assimilated107 1. [ wiki:OMI_observation_modules#thisobsdisttype thisobs%disttype]: Specify the type of distance computation108 1. [ wiki:OMI_observation_modules#thisobsncoord thisobs%ncoord]: Specify the number of dimensions used to compute distances109 1. [ wiki:OMI_observation_modules#dim_obs_p dim_obs_p]: Count the number of available observations110 1. [ wiki:OMI_observation_modules#obs_p obs_p]: Fill the vector of observations111 1. [w iki:OMI_observation_modules#ocoord_p ocoord_p]: store the coordinates of the observations (only actually used in case of localization)112 1. [ wiki:OMI_observation_modules#ivar_obs_p ivar_obs_p]: store the inverse error variance of each observation for the default mode of OMI, which assumes a diagonal observation error covariance matrix113 1. [ wiki:OMI_observation_modules#thisobsid_obs_p thisobs%id_obs_p]: store the indices of state vector elements that correspond to an observation (A single value for observation at grid points, or multiple values for derived quantities or interpolation; this is only used in the OMI-provided observation operators)114 115 When the observation operator performs interpolation, one further needs to initialize an array of interpolation coefficients ([ wiki:OMI_observation_modules#thisobsicoeff_p thisobs%icoeff_p]). For Cartesian distance computation with periodicity one also needs to set [wiki:OMI_observation_modules#thisobsdomainsize thisobs%domainsize].92 1. [#thisobsdoassim thisobs%doassim]: Specify whether this observation type is assimilated 93 1. [#thisobsdisttype thisobs%disttype]: Specify the type of distance computation 94 1. [#thisobsncoord thisobs%ncoord]: Specify the number of dimensions used to compute distances 95 1. [#dim_obs_p dim_obs_p]: Count the number of available observations 96 1. [#obs_p obs_p]: Fill the vector of observations 97 1. [w#ocoord_p ocoord_p]: store the coordinates of the observations (only actually used in case of localization) 98 1. [#ivar_obs_p ivar_obs_p]: store the inverse error variance of each observation for the default mode of OMI, which assumes a diagonal observation error covariance matrix 99 1. [#thisobsid_obs_p thisobs%id_obs_p]: store the indices of state vector elements that correspond to an observation (A single value for observation at grid points, or multiple values for derived quantities or interpolation; this is only used in the OMI-provided observation operators) 100 101 When the observation operator performs interpolation, one further needs to initialize an array of interpolation coefficients ([#thisobsicoeff_p thisobs%icoeff_p]). For Cartesian distance computation with periodicity one also needs to set [wiki:OMI_observation_modules#thisobsdomainsize thisobs%domainsize]. 116 102 117 103 Here one can also activate the [wiki:PDAFomi_additional_functionality#Omittingobservationsthatarepotentialoutliers omission of observations that are too different from the ensemble mean]. This is activated by setting `thisobs%inno_omit>0.0` … … 129 115 130 116 Notes: 131 * The value is `cradius` is only used if [ wiki:OMI_observation_modules#thisobsuse_global_obs thisobs%use_global_obs=0].117 * The value is `cradius` is only used if [#thisobsuse_global_obs thisobs%use_global_obs=0]. 132 118 * `cradius` is always a single value. It should be set of the largest radius of the directions in which the process domain is split by parallelization. It defines the radius within which observations from neighboring process domains are taken into account. 133 119 … … 144 130 Here, `state_p` is the state vector and `ostate` is the observed state vector. 145 131 146 For more information on the available observation operators and on how to implement your own observation operator see the [wiki:OMI_observation_operators documentation of observation operators for OMI].132 For more information on the available observation operators and on how to implement your own observation operator see the [wiki:OMI_observation_operators_PDAF23 documentation of observation operators for OMI]. 147 133 148 134 … … 180 166 - **isotropic localization**: If `cradius` and `sradius` are scalar values, the localization is isotropic. Thus, it uses the same `cradius` in all directions. If different localization scales should be applied e.g. in the vertical compared to the horizonal one needs to scale the vertical coordinates. 181 167 - **non-isotropic localization**: Nonisotropic localization was introduced with PDAF V2.2: `cradius` and `sradius` can be declared as vectors of length `thisobs%ncoords` and each element can get a different value. In this case, the values define a non-isotropic localization according to the values specified in `cradius` and `sradius`. PDAF-OMI will use these values to compute a directional localization radius. 182 - **2D+1D factorized non-isotropic localization**: With PDAF V2.2.1 a factorized 2D+1D localization can be specified (see [ wiki:OMI_observation_modules#thisobsdisttype explanation of disttype]. If the non-isotropic localization is used one can specify different weight functions for the vertical and horizontal directions. This is achieved by declaring `loweight` as a vector of size 2. Now the first element specifies the weight function (according to the table above) for the horizontal direction and the second element specified the wieght function for the vertical direction. When 'locweight' is used as a scalar variable, it specified the weight function in the horizontal direction while the weight function in the vertical dircetion is a constant value of one.168 - **2D+1D factorized non-isotropic localization**: With PDAF V2.2.1 a factorized 2D+1D localization can be specified (see [#thisobsdisttype explanation of disttype]. If the non-isotropic localization is used one can specify different weight functions for the vertical and horizontal directions. This is achieved by declaring `loweight` as a vector of size 2. Now the first element specifies the weight function (according to the table above) for the horizontal direction and the second element specified the wieght function for the vertical direction. When 'locweight' is used as a scalar variable, it specified the weight function in the horizontal direction while the weight function in the vertical dircetion is a constant value of one. 183 169 - A common choice is to use `locweight=2` or `locweight=4` in combination with `cradius=sradius`. Choosing `sradius>cradius` is possible, but `sradius<cradius` should be avoided (one would set the weights of distant observation to zero, but would still assimilate them). 184 170 … … 207 193 - **non-isotropic localization**: Nonisotropic localization was introduced with PDAF V2.2: `cradius` and `sradius` can declared as vectors of length `thisobs%ncoords` and each element can get a different value. In this case, the values defined a non-isotropic localization according to the values specified in `cradius` and `sradius`. 208 194 - **non-isotropic localization**: Nonisotropic localization was introduced with PDAF V2.2: `cradius` and `sradius` can be declared as vectors of length `thisobs%ncoords` and each element can get a different value. In this case, the values define a non-isotropic localization according to the values specified in `cradius` and `sradius`. PDAF-OMI will use these values to compute a directional localization radius. 209 - **2D+1D factorized non-isotropic localization**: With PDAF V2.2.1 a factorized 2D+1D localization can be specified (see [ wiki:OMI_observation_modules#thisobsdisttype explanation of disttype]. If the non-isotropic localization is used one can specify different weight functions for the vertical and horizontal directions. This is achieved by declaring `loweight` as a vector of size 2. Now the first element specifies the weight function (according to the table above) for the horizontal direction and the second element specified the wieght function for the vertical direction. When 'locweight' is used as a scalar variable, it specified the weight function in the horizontal direction while the weight function in the vertical dircetion is a constant value of one.195 - **2D+1D factorized non-isotropic localization**: With PDAF V2.2.1 a factorized 2D+1D localization can be specified (see [#thisobsdisttype explanation of disttype]. If the non-isotropic localization is used one can specify different weight functions for the vertical and horizontal directions. This is achieved by declaring `loweight` as a vector of size 2. Now the first element specifies the weight function (according to the table above) for the horizontal direction and the second element specified the wieght function for the vertical direction. When 'locweight' is used as a scalar variable, it specified the weight function in the horizontal direction while the weight function in the vertical dircetion is a constant value of one. 210 196 - A common choice for the localization is to use `locweight=2` or `locweight=4` in combination with `cradius=sradius`. Choosing `sradius>cradius` is possible, but `sradius<cradius` should be avoided (one would set the weights of distant observation to zero, but would still assimilate them). 211 197 - Particular for the LEnKF: When choosing `locweight=1` (exponential decrease) with a finite value of `cradius` if might be that the localized covariance matrices are no longer positive semidefinite. Mathematically consistent for `locweight=1` would be to set `cradius` so that the full model domain is covered. The width of the localization weight function is then defined by `sradius`. For `locweight>1` one should set `cradius=sradius`. … … 228 214 Here, `state_p` is the state vector and `ostate` is the observed state vector. 229 215 230 For more information on the available observation operators and on how to implement your own observation operator see the [wiki:OMI_observation_operators documentation of observation operators for OMI].216 For more information on the available observation operators and on how to implement your own observation operator see the [wiki:OMI_observation_operators_PDAF23 documentation of observation operators for OMI]. 231 217 232 218 === `obs_op_adj_OBSTYPE` === … … 241 227 Here, `ostate` is the observation vector and `state_p` is the state vector. 242 228 243 For more information on the available observation operators and on how to implement your own observation operator see the [wiki:OMI_observation_operators documentation of observation operators for OMI].229 For more information on the available observation operators and on how to implement your own observation operator see the [wiki:OMI_observation_operators_PDAF23 documentation of observation operators for OMI]. 244 230 245 231 … … 291 277 292 278 **Notes:** 293 - When disttype>=10 is specified with isotropic localization the weight function for the vertical direction is constant with a valu eof one. For non-isotropic localization, the weight functions can be separately specified for the vertical and horizontal directions. (see the [ wiki:OMI_observation_modules#init_dim_obs_l_OBSTYPE description of init_dim_obs_l_OBSTYPE] for information on how to specify the ono-isotropic localization.279 - When disttype>=10 is specified with isotropic localization the weight function for the vertical direction is constant with a valu eof one. For non-isotropic localization, the weight functions can be separately specified for the vertical and horizontal directions. (see the [#init_dim_obs_l_OBSTYPE description of init_dim_obs_l_OBSTYPE] for information on how to specify the ono-isotropic localization. 294 280 - For 0 and 1 (likewise 10, 11) any distance unit can be used. The computed distance will be in the same unit. For 2 and 3 the horizontal input coordinates are in radians and the distance is computed in meters. Essential is that the grid point coordinates and observation coordinates use the same unit. 295 281 - For 3-dimensional localization, the unit of the vertical direction can be chosen by the user. However, for geographic ditances, the unit should be chosen to be 'compatible' with the unit in the horizontal (meter). When isotropic localization is used, the unit for the vertical direction can be scaled do that the length scales in the vertical and horizontal directions are the same (this, e.g., allows to use pressure as the distance measure in the vertical in atmospheric models). For non-isotropic localization, the units can differ without scaling. In ccase of the factorized 2D+1D localization (disttype>=10), the units in the horizontal and vertical directions are independent. … … 325 311 This should be a vector of real values. It will be used as an argument to `PDAFomi_gather_obs`. The order of the entries has to be consistent in the arrays `thisobs%id_obs_p`, `obs_p`, `ivar_obs_p`, and `ocoord_p`. 326 312 327 If **non-diagonal observation error covariance matrices** are used, which is supported from PDAF 2.3, `ivar_obs_p` still has to be allocated and initialized. However, since the handling of **R** is ddone in a call-back routine if **R** is non-diagonal, it is up to the user whether this information is used. For more information see the **[wiki:OMI_nondiagonal_observation_error_covariance_matrices page on using non-diagonal R-matrices with OMI]**.313 If **non-diagonal observation error covariance matrices** are used, which is supported from PDAF 2.3, `ivar_obs_p` still has to be allocated and initialized. However, since the handling of **R** is ddone in a call-back routine if **R** is non-diagonal, it is up to the user whether this information is used. For more information see the **[wiki:OMI_nondiagonal_observation_error_covariance_matrices_PDAF23 page on using non-diagonal R-matrices with OMI]**. 328 314 329 315 … … 370 356 The value of NROWS has to be the same as for `thisobs%id_obs_p`. For a fixed value of the second index the NROWS of the array hold the interpolation coefficients corresponding to the indices specified in `thisobs%id_obs_p`. 371 357 372 Please see the [wiki:OMI_observation_operators documentation of OMI observation operators] for information on how to initialize the array `thisobs%icoeff_p` using functions provided by PDAF-OMI.358 Please see the [wiki:OMI_observation_operators_PDAF23 documentation of OMI observation operators] for information on how to initialize the array `thisobs%icoeff_p` using functions provided by PDAF-OMI. 373 359 374 360 ||Starting from PDAF V2.3.1 one can also call [wiki:PDAFomi_set_icoeff_p] to initialize thisobs%icoeff_p. One provides a user-specified array of interpolation coefficients. The routine then allocates thisobs%icoeff_p and fills it with the provided coefficients. This should be particularly usable when not using Fortran. || … … 390 376 This variable can either be set directly in the code, or, starting with PDAF V2.3.1 by calling [wiki:PDAFomi_set_use_global_obs]. 391 377 392 The use of this feature is described in the [wiki:OMI_use_global_obs documentation on using domain-limited observations].378 The use of this feature is described in the [wiki:OMI_use_global_obs_PDAF23 documentation on using domain-limited observations]. 393 379 394 380 … … 396 382 === `thisobs%inno_omit` === 397 383 398 Setting this variable to a value > 0.0 activates the functionality that observations are omitted (made irrelevant) from the analysis update if the difference of their value and the ensemble mean to too large. For more information see the [wiki:PDAFomi_additional_functionality #Omittingobservationsthatarepotentialoutliers page on additional OMI functionality].384 Setting this variable to a value > 0.0 activates the functionality that observations are omitted (made irrelevant) from the analysis update if the difference of their value and the ensemble mean to too large. For more information see the [wiki:PDAFomi_additional_functionality_PDAF23#Omittingobservationsthatarepotentialoutliers page on additional OMI functionality]. 399 385 400 386 This variable can either be set directly in the code, or, starting with PDAF V2.3.1 by calling [wiki:PDAFomi_set_inno_omit].