| | 189 | |
| | 190 | |
| | 191 | == obs_op_lin_pdafomi == |
| | 192 | |
| | 193 | The routine is called during the analysis step of the 3D-Var methods and it is only required in this case (3D-Var methods have been added with PDAF V2.0). It has to perform the operation of the linearized observation operator acting on a state vector that is provided as `state_p`. The observed state has to be returned in `m_state_p`. In this routine one just calls `obs_op_lin_TYPE` for each observation type. |
| | 194 | |
| | 195 | The '''interface''' for this routine is: |
| | 196 | {{{ |
| | 197 | SUBROUTINE obs_op_lin_pdafomi(step, dim_p, dim_obs_p, state_p, m_state_p) |
| | 198 | |
| | 199 | INTEGER, INTENT(in) :: step ! Currrent time step |
| | 200 | INTEGER, INTENT(in) :: dim_p ! PE-local dimension of state |
| | 201 | INTEGER, INTENT(in) :: dim_obs_p ! Dimension of observed state |
| | 202 | REAL, INTENT(in) :: state_p(dim_p) ! PE-local model state |
| | 203 | REAL, INTENT(out) :: m_state_p(dim_obs_p) ! PE-local observed state |
| | 204 | }}} |
| | 205 | |
| | 206 | |
| | 207 | The '''implementation steps''' are the same as for `obs_op_pdafomi`. |
| | 208 | |
| | 209 | An '''example''' is provided in `tutorial/variational/online_2D_serialmodel/`. |
| | 210 | |
| | 211 | '''Notes:''' |
| | 212 | - The arguments in the calls to `obs_op_lin_TYPE` are input arguments to `obs_op_pdafomi`. They are just passed on. |
| | 213 | - The order of the calls to `obs_op_TYPE` is not relevant because the setup of the overall full observation vector is defined by the order of the calls in init_dim_obs_pdafomi. Anyway, it's good practice to keep the order of the calls consistent. |
| | 214 | - We don't need an IF-statement with `assim_TYPE` here. The check is done within each obs-module. |
| | 215 | - If the full observation operator for the observation type is linear by itself, one can just call `obs_op_TYPE`. Thus, no additional routine inside the observation module is required in this case. |
| | 216 | |
| | 217 | |
| | 218 | == obs_op_lin_pdafomi == |
| | 219 | |
| | 220 | The routine is called during the analysis step of the 3D-Var methods and it is only required in this case (3D-Var methods have been added with PDAF V2.0). It has to perform the operation of the adjoint observation operator acting on an observation vector that is provided as `m_state_p`. The resulting state vector has to be returned in `state_p`. In this routine one just calls `obs_op_adj_TYPE` for each observation type. |
| | 221 | |
| | 222 | The '''interface''' for this routine is: |
| | 223 | {{{ |
| | 224 | SUBROUTINE obs_op_adj_pdafomi(step, dim_p, dim_obs_p, state_p, m_state_p) |
| | 225 | |
| | 226 | INTEGER, INTENT(in) :: step ! Currrent time step |
| | 227 | INTEGER, INTENT(in) :: dim_p ! PE-local dimension of state |
| | 228 | INTEGER, INTENT(in) :: dim_obs_p ! Dimension of observed state |
| | 229 | REAL, INTENT(in) :: m_state_p(dim_obs_p) ! PE-local full observed state |
| | 230 | REAL, INTENT(inout) :: state_p(dim_p) ! PE-local model state |
| | 231 | }}} |
| | 232 | |
| | 233 | |
| | 234 | The '''implementation steps''' are the same as for `obs_op_pdafomi`. |
| | 235 | |
| | 236 | An '''example''' is provided in `tutorial/variational/online_2D_serialmodel/`. |
| | 237 | |
| | 238 | '''Notes:''' |
| | 239 | - The arguments in the calls to `obs_op_adj_TYPE` are input arguments to `obs_op_adj_pdafomi`. They are just passed on. |
| | 240 | - The order of the calls to `obs_op_adj_TYPE` is not relevant because the setup of the overall full observation vector is defined by the order of the calls in init_dim_obs_pdafomi. Anyway, it's good practice to keep the order of the calls consistent. |
| | 241 | - We don't need an IF-statement with `assim_TYPE` here. The check is done within each obs-module. |
| | 242 | |
| | 243 | |
| | 244 | |
| | 245 | |
| | 246 | |