Skip to content

Conversation

@mvertens
Copy link

@mvertens mvertens commented Oct 30, 2025

Summary: refactor nudging code to use cdeps on line remapping and interpolation

Contributors: @gold2718

Reviewers: @gold2718

Purpose of changes:
The current nudging code (nudging.F90) requires a single file for every time sample - and often this is every 6 hours. In addition it does not do any mapping from the forcing data to the model grid. Using the CDEPS inline functionality along with its capability to do online horizontal regridding (including for multiple vertical levels) and time interpolation the nudging code has been completely refactored. With this new code - monthly nudging data can be read at just one resolution and the model vertical levels and used with any model grid.
The one change that comes with this is if there is missing data. In the original scheme, if missing data was encountered then the model 'coasted' through the forcing interval and was not nudged. In the new scheme, the time interpolation (linear or upper) is used with the actual data that is available.

To see more details of the inline functionality from CDEPS used here see: https://escomp.github.io/CDEPS/versions/master/html/index.html and in particular https://escomp.github.io/CDEPS/versions/master/html/streams.html#data-model-stream-inline-api

Changes made to build system: None

Changes made to the namelist: The following new namelist variables were introduced:
Nudge_Filenames, Nudge_Meshfile, Nugde_beg_day, Nudge_beg_month, Nudge_beg_year, Nudge_end_day, Nudge_end_month, Nudge_end_year, Nudge_file_times_per_day, Model_update_times_per_day

Changes to the defaults for the boundary datasets: None

Substantial timing or memory changes: TODO - the expectation is that the new code should be faster than the old one since a new file does not have to be opened and closed at every nudging time step. This needs to be confirmed.

Validation:
The following validation was run. using a noresm3_0_beta09 sandbox with this PR and the CDEPS PR NorESMhub/CDEPS#26. Two simulations were done - a reference simulation and a nudging to the reference simulation.

Reference Simulation:

/create_newcase --case /cluster/home/mvertens/noresm/NF1850_ne16pg3_ne16pg3_mtn14_b09_ref --compset 1850_CAM70%LT%NORESM%CAMoslo_CLM60%SP_CICE%PRES_DOCN%DOM_MOSART_DGLC%NOEVOLVE_SWAV_SESP --res ne16pg3_ne16pg3_mtn14 --project nn9560
k --run-unsupported --mach betzy

with the following user_nl_cam

empty_htapes=.true.
nhtfrq = 0, -6, -1,
mfilt  = 1,  28, 168,
ndens  = 2,  2,  2,
fincl2 = 'PS:I','U:I','V:I','T:I','Q:I'
fincl3 = 'PS:I','U:I','V:I','T:I','Q:I','U850:I','V850:I','T850:I','Z500:I'
fincl3lonlat = '11e_60n'

zmconv_c0_lnd             = 0.0075D0
zmconv_c0_ocn             = 0.0075D0
zmconv_ke                 =  5.0E-6
zmconv_ke_lnd             =  1.0E-5
dust_emis_fact            = 6.1D0
clim_modal_aero_top_press = 1.D-4
micro_mg_dcs              = 700.D-6
clubb_c8                  =  5.0D0

Nudging Simulation:

./create_newcase --case /cluster/home/mvertens/noresm/NF1850_ne16pg3_ne16pg3_mtn14_b09_nudging --compset 1850_CAM70%LT%NORESM%CAMoslo_CLM60%SP_CICE%PRES_DOCN%DOM_MOSART_DGLC%NOEVOLVE_SWAV_SESP --res ne16pg3_ne16pg3_mtn14 --project nn
9560k --run-unsupported --mach betzy

The following was set in user_nl_cam:

&nudging_nl
Nudge_Model         = .true.
Nudge_Datapath      = '/cluster/work/users/mvertens/archive/NF1850_ne16pg3_ne16pg3_mtn14_b09_ref/atm/hist'
Nudge_Filenames     = 'NF1850_ne16pg3_ne16pg3_mtn14_b09_ref.cam.h1i.0001-01-01-21600.nc',
                      'NF1850_ne16pg3_ne16pg3_mtn14_b09_ref.cam.h1i.0001-01-08-21600.nc',
                      'NF1850_ne16pg3_ne16pg3_mtn14_b09_ref.cam.h1i.0001-01-15-21600.nc'
Nudge_Meshfile      = '/cluster/shared/noresm/inputdata/share/meshes/ne16pg3_ESMFmesh_cdf5_c20211018.nc'
Nudge_TimeScale_Opt = 0
Nudge_Force_Opt     = 1
Nudge_Uprof         = 1
Nudge_Ucoef         = 1.0
Nudge_Vprof         = 1
Nudge_Vcoef         = 1.0
Nudge_Tprof         = 0
Nudge_Tcoef         = 0.0
Nudge_PSprof        = 0
Nudge_PScoef        = 0.0
Nudge_Qprof         = 0
Nudge_Qcoef         = 0.0
Nudge_beg_year      = 1
Nudge_beg_month     = 1
Nudge_beg_day       = 2
Nudge_end_day       = 14
Nudge_end_month     = 1
Nudge_end_year      = 1
Nudge_taxmode       = 'limit'
Model_update_times_per_day = 48
!
empty_htapes       =.true.
nhtfrq             = 0, -6, -1,
mfilt            = 1,  28, 168,
!mfilt             = 1,   1,   1
ndens              = 2,  2,  2,
fincl2             = 'PS:I','U:I','V:I','T:I','Q:I','Target_U','Target_V','Nudge_U','Nudge_V'
fincl3             = 'PS:I','U:I','V:I','T:I','Q:I','U850:I','V850:I','T850:I','Z500:I',
                     'Target_U','Target_V','Nudge_U','Nudge_V'
fincl3lonlat       = '11e_60n'
!
zmconv_c0_lnd             = 0.0075D0
zmconv_c0_ocn             = 0.0075D0
zmconv_ke                 =  5.0E-6
zmconv_ke_lnd             =  1.0E-5
dust_emis_fact            = 6.1D0
clim_modal_aero_top_press = 1.D-4

Following is the nudging validation:

Screenshot 2025-12-25 at 12 27 27 PM

[ List each test suite run. For each suite, include machine, compiler, and any test failures.
For each failure, include the contents of TestStatus or the output from cs.status.testid for that test ]

Issues addressed by this PR: [ For each issue include a GitHub issue entry, one per line. ]

@mvertens mvertens force-pushed the feature/refactor_nudging branch from 40ad302 to 875a455 Compare December 20, 2025 22:21
@mvertens mvertens marked this pull request as ready for review December 30, 2025 16:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

2 participants