Opened 3 years ago

Closed 3 years ago

#895 closed upgrade (Done)

IMPORTANT: 4D-Var observation operator - observation depths

Reported by: arango Owned by:
Priority: major Milestone: Release ROMS/TOMS 4.0
Component: Nonlinear Version: 3.9
Keywords: Cc:

Description

  • The obs_depth variable in the input observation NetCDF file can be specified as negative values in meters or nondimensional, positive, fractional vertical coordinates ranging from 1.0 to N, where N is the number of vertical levels. Recall that in ROMS level N is located next to sea-surface, as shown below: https://www.myroms.org/trac/vertical_grid.png
  • The observation operator was modified to allow both vertical location conventions (meters and fractional) in the variable obs_depth for specific data. Recall that in ROMS, the vertical grid locations are time-dependent due to the evolution of the free surface, which may include tidal forcing or not. Therefore, ROMS will interpolate from depths in meters to the fractional vertical coordinate when computing 4D-Var prior trajectory (background phase) at the observation locations in time and space. Then, the fractional vertical coordinates are written into the obs_Zgrid of the input observation NetCDF file. As a result, we always recommend making a copy of the input observation NetCDF before running a 4D-Var data assimilation cycle if you want to preserve the original file. However, notice that obs_Zgrid is only needed internally in ROMS by the tangent linear and adjoint kernels during the inner-loops minimization when processing the linearized observation operator, H(x).
  • Surface observations are tricky. Therefore, we usually use the fractional vertical coordinate for SSH, SST, SSS, and HFR observations as obs_depth=N. However, notice that level N depth is located at the middle of the top grid cell, as shown above. All the ROMS state variables used in the data assimilation are vertically located at the grid cell center (finite volume sense), vertical RHO-point. Using zero as surface depth is problematic due to its floating-point bit representation. IEEE-754 allows positive and negative zero. The representation of zero using sign bit, biased exponent, and a fraction is subject to roundoff due to precision. There is not an absolute zero value in computers. Using negative depths for surface observations, say obs_depth=-0.005 m, it will be assigned a obs_Zgrid=N in the fractional coordinate because such depth is above the top grid cell middle depth.
  • Minor changes are made to obs_depth.F and obs_write.F to allow both vertical location conventions in obs_depth NetCDF variable. Thanks to Brian Powell for bringing this issue to my attention and providing a test case to debug.
  • The variables time and tdays are initialized to zero in mod_scalars.F to avoid segmentation faults in some computer during 4D-Var prior error phase. Such variables haven't been assigned yet in the prior error phase. We may get some unwanted Fortran error when calling time_string in get_state.F with an uninitialized time variable:
         CALL time_string (time(ng), time_code(ng))
    
    This issue was discovered in the ROMS-JEDI interface. The ctest command was failing when running the JEDI unit tests.

Change History (1)

comment:1 by arango, 3 years ago

Resolution: Done
Status: newclosed
Note: See TracTickets for help on using tickets.