Changes between Version 1 and Version 2 of OMI_observation_modules_PDAF23


Ignore:
Timestamp:
Jun 10, 2025, 12:02:24 PM (7 days ago)
Author:
lnerger
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • OMI_observation_modules_PDAF23

    v1 v2  
    44#!html
    55<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>
    99<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>
    3117</ol>
    3218</div>
     
    8975}}}
    9076
    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].
     77Apart 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].
    9278
    9379
     
    10490
    10591The main variables that the filled in this routine are
    106  1. [wiki:OMI_observation_modules#thisobsdoassim thisobs%doassim]: Specify whether this observation type is assimilated
    107  1. [wiki:OMI_observation_modules#thisobsdisttype thisobs%disttype]: Specify the type of distance computation
    108  1. [wiki:OMI_observation_modules#thisobsncoord thisobs%ncoord]: Specify the number of dimensions used to compute distances
    109  1. [wiki:OMI_observation_modules#dim_obs_p dim_obs_p]: Count the number of available observations
    110  1. [wiki:OMI_observation_modules#obs_p obs_p]: Fill the vector of observations
    111  1. [wiki: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 matrix
    113  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
     101When 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].
    116102
    117103Here 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`
     
    129115
    130116Notes:
    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].
    132118 * `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.
    133119
     
    144130Here, `state_p` is the state vector and `ostate` is the observed state vector.
    145131
    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].
     132For 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].
    147133
    148134
     
    180166- **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.
    181167- **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.
    183169- 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).
    184170
     
    207193- **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`.
    208194- **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.
    210196- 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).
    211197- 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`.
     
    228214Here, `state_p` is the state vector and `ostate` is the observed state vector.
    229215
    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].
     216For 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].
    231217
    232218=== `obs_op_adj_OBSTYPE` ===
     
    241227Here, `ostate` is the observation vector and `state_p` is the state vector.
    242228
    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].
     229For 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].
    244230
    245231
     
    291277
    292278**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.
    294280- 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.
    295281- 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.
     
    325311This 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`.
    326312
    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]**.
     313If **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]**.
    328314
    329315
     
    370356The 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`.
    371357
    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.
     358Please 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.
    373359
    374360||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. ||
     
    390376This variable can either be set directly in the code, or, starting with PDAF V2.3.1 by calling [wiki:PDAFomi_set_use_global_obs].
    391377
    392 The use of this feature is described in the [wiki:OMI_use_global_obs documentation on using domain-limited observations].
     378The use of this feature is described in the [wiki:OMI_use_global_obs_PDAF23 documentation on using domain-limited observations].
    393379
    394380
     
    396382=== `thisobs%inno_omit` ===
    397383
    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].
     384Setting 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].
    399385
    400386This variable can either be set directly in the code, or, starting with PDAF V2.3.1 by calling [wiki:PDAFomi_set_inno_omit].