| 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 | |