Skip to content

Copernicus SSH L3 NRT Observation Converter#1116

Open
mgharamti wants to merge 16 commits into
NCAR:mainfrom
mgharamti:Copernicus_SSH_L3_NRT
Open

Copernicus SSH L3 NRT Observation Converter#1116
mgharamti wants to merge 16 commits into
NCAR:mainfrom
mgharamti:Copernicus_SSH_L3_NRT

Conversation

@mgharamti
Copy link
Copy Markdown
Contributor

Description:

This PR adds a new observation converter for the CMEMS along-track SSH product: SEALEVEL_GLO_PHY_L3_NRT_008_044. The converter reads CMEMS CSV exports and generates DART obs_seq files containing filtered sea level anomaly (SLA_FILTERED) observations as SATELLITE_SSH.

This PR also adds: models/ROMS_Rutgers/preprocess_ocean_obs.py which provides optional model-specific post-processing of the observations including:

  • shallow-water filtering using ROMS bathymetry,
  • depth-dependent observation error adjustment,
  • selective processing of individual observation types.

Additionally, this PR includes small updates (backwards compatible) to the DART CSV utilities module to improve handling of CMEMS CSV formatting, in particular the header with multiple lines.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update

Documentation changes needed?

  • My change requires a change to the documentation.
    • I have updated the documentation accordingly.

Tests

I've tested the converter with a few CMEMS observation files. These can be found here: /glade/work/gharamti/inacawo/data_snippets/SSH

mgharamti and others added 12 commits April 17, 2026 11:38
The read_csv_mod is slightly modified to support csv files with multiple
header lines. The csv_open routine now has an optional argument
to skip any lines on top of the actual header line that includes
the fields. I've tested the changes with previous converters that
use csv files and they are backward-compatible.
Converter that reads in near-real-time SSH from
Copernicus and converts it to DART's obs sequence files.

The converter writes out SSH in meters. The obs error
standard deviation is configured such that it is large
near the coast in shallow waters and gets smaller in
the deep ocean.
The observation error standard deviation is added as a
namelist option and can be assigned uniformly by the user.

Cleaned up the namelist file and removed binary data files.
Add a python script to adjust ocean observations.
The script can take in any `obs_seq` file. It needs to read
the bathymetry from the model restart (currently uses ROMS).
It applies:
- a depth filter on the observations to remove shallow obs, and
- also an error model to inflate the errors in coastal areas.

The documentation of the converter is also updated. It now
states that the errors from the converter are uniform and can
be adjusted using the new python script.
Copy link
Copy Markdown
Member

@hkershaw-brown hkershaw-brown left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good Moha,
A few suggestions (typo, err message rather than err, 'with' for opening netcdf file)

Question on the QC before approving, it looks like all the QCs are set to 0. Is this what should be happening, or should it be the sat(iobs)%oqc?

Cheers,
Helen

Comment thread observations/obs_converters/cmems_ssh_l3/readme.rst Outdated
Comment thread observations/obs_converters/cmems_ssh_l3/work/input.nml Outdated
Comment thread observations/obs_converters/cmems_ssh_l3/cmems_ssh_to_obs.f90 Outdated
Comment thread observations/obs_converters/cmems_ssh_l3/cmems_ssh_to_obs.f90 Outdated
Comment thread observations/obs_converters/cmems_ssh_l3/cmems_ssh_to_obs.f90 Outdated
Comment thread models/ROMS_rutgers/preprocess_ocean_obs.py Outdated
obs_seq.df = obs_final

obs_seq.update_attributes_from_df()
obs_seq._update_linked_list(obs_final) # private, no public API for this?
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think obs_seq.update_attributes_from_df() calls _update_linked_list so you
don't need to call _update_linked_list directly. I will take a closer look running your example to see if there is anything funky going on.

Suggested change
obs_seq._update_linked_list(obs_final) # private, no public API for this?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. I wasn't sure about it too.

Comment thread observations/obs_converters/cmems_ssh_l3/work/input.nml Outdated
@hkershaw-brown hkershaw-brown added the release! bundle with next release label May 22, 2026
mgharamti added 4 commits May 25, 2026 15:27
Incorporated the PR review comments.
- Typos in input.nml
- QC handling
- Readme namelist options
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release! bundle with next release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants