Runoff conservative regrid JRA55 grid to ACCESS-OM2-01

Hi everybody,

I’m combining the JRA55-do runoff with a calving flux at the Antarctic margins (already on ACCESS-OM2-01 grid) into a single forcing file. My goal is to regrid the JRA55-do (720x1440) onto the OM2-01 grid (2700x3600), then merge with the calving flux. Just want to see if anyone has done this conservative remapping before and have any tips to share.

In my first attempt I’m using xESMF regridding (following this recipe: cosima-recipes/03-Mains/Horizontal_Regridding.ipynb at ebe6a4277a4f9bfe7efaa7f7e618b4777de2dcff · COSIMA/cosima-recipes · GitHub )
to generate the regridder:

xESMF Regridder Regridding algorithm: bilinear Weight filename: bilinear_tracer_weights_in025degJRA55_out01degACCESSOM2.nc Reuse pre-computed weights? False Input grid shape: (720, 1440) Output grid shape: (2700, 3600) Periodic in longitude? True

this seems to work, but I wonder how I can ensure it does not put values in land cells on the OM2-01 grid?

Thank you,

Fabio

Hi Fabio

Will you use the new forcing file in ACCESS-OM2? If so, my understanding is OM2 handles it online / in the model to ensure the runoff doesn’t end up in land cells.

For a calving flux, are you choosing not to spread the runoff in some pattern for meltwater? (e.g. Merino et al. 2016 - Freswater in the Southern Ocean - Nacho Merino Personal Site)

Hi Anton,

yes the idea it to force back ACCESS-OM2 with those fluxes. This run is part of the basal melting project where we prescribed the meltwater at depth in ACCESS-OM2-01 (that I presented in the last NRI workshop).

In this setup, the calving fluxes are hard-wired in MOM5, and internally it’s ensured it goes at surface (upper-40m to be exact), whereas the JRA55-do runoff is inserted at the depths of the ice shelves.

In the experiment I’m setting up, I want to source the JRA55-do runoff + Merino calving flux at the surface–so that’s why I need to combine both into a single file. I want only a Meltwater anomaly to be spread at depth is (which replaced the JRA55-do runoff in the original control setup).

So I’m guessing MOM5 will want to read all in the same field (so the need of combined them after re-gridding etc). Maybe @adele-morrison or @aekiss could advice here too if I missed anything.

Cheers,

Fabio

Hi Fabio,

It’s not super clear to me what you’re trying to do - are you trying to split the solid runoff into basal and calving?

Here are some comments/thoughts

  • bilinear is not conservative
  • why not regrid to (rather than from) the JRA55-do grid and use the model to automatically redistribute it from land to ocean?
  • if you’re on the JRA55-do grid you might be able to use this to do what you want Tutorials · COSIMA/access-om2 Wiki · GitHub
  • are you using JRA55-do v.3 or a later version? Only 1.4 and later has separate solid and liquid runoff (but the model combines these before MOM sees them - see System description · COSIMA/access-om2 Wiki · GitHub)

Hi Andrew,

I’m trying to set up a control_LH_Antwater experiment. I want the control runoff imposed at the surface but the anomalies to be prescribed at a chosen min/max depths and to be adjusted by the Gade line approach. Here we set min_depth=0 and max depth=40 to match with the control (i.e. we’re effectively prescribing the meltwater at the surface but using the existing code to do the temperature correction).

Investigating Pedro’s code for the basal_LH_brine experiment, I realised that calving flux in all our runs are imposed at surface, and the JRA55-do is the runoff passed at depth (here around line 3696). So I want to use this logic to set up control_LH_Antwater as following:

  • surface w/o temp. adjustment: JRA55-do runoff (RYF) + Merino calving flux
  • surface w/ temp. adjustment: Antwater anomaly and setting

Following that, I want to replace the following files:

- INPUT/ocean_month_output_GPC010_calving_365_final.nc → for a file containing it plus the original JRA55-do runoff. And that where my regridding issues are.

- v1-3/RYF.runoff_all.1990_1991.nc → for a file containing only the Antwater anomalies.

Some responses to your comments:

  • yes I realised I haven’t used conservative in my first attempt! :sweat_smile:
  • do you think regridding the calving to the JRA55 grid would be easier?
  • thanks for the link, it seems like we could have used that to create the MW perturbation.
  • using JRAv1.3.

Thank you!

Ah ok so with this approach you wouldn’t be using YATM to handle the JRA55 runoff forcing.
Therefore you’d need to be responsible for conservatively regridding JRA55 runoff onto the same grid as ocean_month_output_GPC010_calving_365_final.nc, and ensuring that all the water is mapped to ocean cells.

You’d also need to put all the Antwater anomalies on the same grid as RYF.runoff_all.1990_1991.nc if you don’t want to generate new mapping files.

Thanks Andrew, yes that’s exactly the plan. I did regrid the JRA55 runoff to the OM2-01 grid:

Though integrating all the values (multiplied by respective grid area) doesn’t give exactly the same amount:

965702497.956681 (regridded)
965545363.8656995 (original)

Checking if there are non-zero values in land points (using land_mask) does indicate values over land tho:

Do you have any suggestion on how to avoid this?

FYI: Conservative regridding with xESMF -- puzzled because the integrals don't quite agree - #10 by dkhutch

1 Like

Though integrating all the values (multiplied by respective grid area) doesn’t give exactly the same amount

They’re pretty close - the difference might be accounted for by the summation if you’re using single precision floats.

Is this with conservative or bilinear regridding?

So I think the liquid/river runoff - is still going through yatm (as its part of RYF.runoff_all.1990_1991.nc) but the meltwater runoff is handled seperately by ocean_month_output_GPC010_calving_365_final.nc ?

I think its important/easiest to use yatm for river runoff so that it spreads the runoff from high volume rivers. Without the spreading there would be issues with low salinity issues at those river mouths.

In the meltwater runoff, where there is overlap between the runoff and land :

a) then some sort of nearest neighbour algorithm could be used to move the water from land to the nearest adjacent cell. In OM3 we currently use a static remapping from land to ocean cells calculated using the BallTree functions from sklearn python package - this is the link but google research is probably more useful.

b) the problem with the BallTree approach is that it will just move water to the nearest ocean cell. It might be easier/better just to make some hand edits to move the water to the most appropriate ocean cell (accounting for the different in cell area between cells when moving the water around) - depending how many cells are impacted ofcourse

1 Like

YATM does this by conservatively moving runoff to the nearest ocean cells, using a k-d tree to represent cell proximity.

But first check how big a problem it is, i.e. what fraction of runoff is hitting land.

1 Like

Good point Anton! Fabio, are you planning to put all the JRA55-do runoff directly into MOM (rather than via YATM), or just the runoff around Antarctica? I don’t think it would work to do it for all runoff globally, for the reasons Anton mentioned. And the river runoff is daily-varying, so that could be a lot of data to handle. Liquid and solid runoff are combined in JRA55-do v1.3, so that makes it awkward to handle them separately.

You could use YATM to handle the JRA55-do runoff globally, except with the Antarctic runoff scaled to zero using Tutorials · COSIMA/access-om2 Wiki · GitHub. Then you could apply just the Antarctic JRA55-do runoff directly into MOM in the way you want.

However, ACCESS-OM2 normally closes the water budget by imposing a constraint of zero net water flux into the combined ocean-sea ice system from the coupler (zero_net_water_coupler = true) by removing the area-mean of P − E + R (precipitation - evaporation + runoff) from P − E (also adjusting liquid_precip for consistency) so that the area-integrated P − E + R = 0.

If you’re injecting runoff without passing through the coupler, will your directly-injected runoff be missed in the water budget, leading to incorrect global closure with knock-on effects elsewhere?

See ACCESS-OM2 water balance - Google Docs and sec 3.5.2 in https://cosima.org.au/wp-content/uploads/2025/10/ACCESS-OM2-1-025-010deg-2025-10-02-b2c815b.pdf

Thanks all for your input @anton @aekiss. It sounds like this is more complex than I initially thought.

Though it look that the regridding works well (figure here), when I account for the land mask it becomes clear that most points with runoff values is located on land. (editting here to add a plot illustrating this; 3/4 of the runoff values are on land cells and only 1/4 is on ocean cells. Plot below has ocean (yellow) and land (purple) mask overlayed with some transparency by the regridded runoff in green-scale colormap:)

When the JRA55 runoff goes through YATM this is not a problem, but in my case it will be, as the JRA55 runoff will be read straight by MOM5.

I’m inspecting the ocean_sbc.F90 and these are my insights (from the “basal” MOM5 code):

  1. around line 3696, when using “use_basal_module=true’“, it defines, for regions south of 60S:
basal = runoff - calving

icb = 0 

runoff = calving

calving = 0

where runoff is coming from YATM (JRA55-do runoff) and calving is the calving flux plotted above (already on OM2-01 grid).

  1. around line 3740, it defines river = runoff + calving

  2. around line 4114, it perform the “zero_net_water_coupler” adjustment calculating:

pme_river = pme + river + basal + icb + briner - melt - wrk1_2d

Thus, my thoughts is that this runoff/calving/basal split doesn’t affect the zero net water flux @aekiss ?

If that’s the case, and consider Andrew and Anton inputs here, I think we could do the following to make this work (tagging @adele-morrison here as well):

- JRA55-do runoff file modified to:

  • north of 60S: original JRA55-do runoff
  • south of 60S: replace original JRA55-do runoff for the Antwater meltwater ANOMALY

-Calving file modified to:

  • north of 60S: original calving flux
  • south of 60S: original calving flux + JRA55-do runoff

In the bold case, the JRA55-do runoff will need to be redirected to ocean cells manually. I will look into @anton suggestion here (BallTree nearest neighbour algorithm).

The YATM runoff remapping is described here GitHub - COSIMA/libaccessom2: ACCESS-OM2 library

and the land->ocean mapping is done in libaccessom2/atm/src/kdrunoff_mod.F90 at master · COSIMA/libaccessom2 · GitHub
using libaccessom2/atm/src/kdtree2_module.F90 at master · COSIMA/libaccessom2 · GitHub

1 Like

Doesn’t runoff = calving and river = runoff + calving imply river = 2*calving? That seems wrong - have I missed something?

see basal_routines/MOM_routines/easterlies_ICB_brine/ocean_sbc.F90 at a54338453cd53e99b94419c3c70071958e1d59e2 · pedrocol/basal_routines · GitHub

and basal_routines/MOM_routines/easterlies_ICB_brine/ocean_sbc.F90 at a54338453cd53e99b94419c3c70071958e1d59e2 · pedrocol/basal_routines · GitHub

I think that’s true in the unperturbed case, since (if I understand correctly) it’s just splitting the runoff (input via the coupler from YATM, and therefore counted in the ocean budget) between basal and calving.

But what you’re proposing seems different, with JRA55 runoff bypassing the coupler, so it will be missing from the global water budget calculation, which may produce erroneous adjustment (extra global precip) to compensate?

My impression was that the JRA55 runoff being accounted in the calving array (point 1 in my earlier comment), then passed to river (point 2) would make it being accounted in the pme_river array (point 3) use for zero net water adjustment? Or did I miss something?

I think this is correct as it first defines calving = 0 too:

if(use_basal_module==.true.) then
do i=isc,iec
do j=jsc,jec
if ( Grd%yt(i,j) < -60.0 ) then
if(use_icb_module==.false.) then
basal(i,j) = runoff(i,j) - calving(i,j)
icb(i,j) = 0.0
runoff(i,j) = calving(i,j)
calving(i,j) = 0.0