Skip to content

mom nuopc cap changes required for running with ice shelves #29

@claireyung

Description

@claireyung

This issue will document the changes required in the mom6 nuopc cap to allow ice shelves to run in MOM6. A draft codebase (definitely needs some fixes/clean up) is here in branch https://github.com/ACCESS-NRI/MOM6/tree/ice-shelf-dev and it compiles with ACCESS-OM3 e.g. here.

Key issues were

  • Preventing ocean below ice shelf talking to atmosphere
  • Properly initialising ice shelves

Important context: to avoid ocean talking to atmosphere, everything the coupler sees should just be open ocean i.e. sea ice mask (no sea ice below ice shelves, sea ice mask + ice sheet mask must exactly match full ocean mask). MOM should keep the fact that the ocean is larger and has ice shelf cavities to itself, and does meltwater fluxes by itself.

Changes made

  1. Mesh mask mismatch error: Ocean nuopc mesh mask not matching MOM6 ocean mask needs to be allowed. We replace the error ERROR: ESMF mesh and MOM6 domain masks are inconsistent! with a warning instead of fatal error: call MOM_error(WARNING, err_msg)
  2. So_omask export: Needed to change the So_omask export (omask variable) in mom_export subroutine of mom_cap_methods.F90. This is because MOM was using the internal mask, which differed from the mask given to the mediator to initialise e.g. the atmosphere-ocean fluxes, which is a static field defined in nuopc.runconfig. We had given nuopc the sea ice mask not the ocean mask to avoid the coupler sending fluxes into the cavities, but MOM was sending data back in these files resulting in NaNs in the mediator. The change is here
      omask(i,j) =  nint(ocean_grid%mask2dT(ig,jg)) - ceiling(ocean_state%ice_shelf_CSp%ISS%hmask(ig,jg))

and also required making ocean_state_type and ice_shelf_CS contents public (i.e. removing ; private for each of them) Please see note 1

  1. Correctly initialising ice shelf in MOM nuopc cap: By comparing the FMS and nuopc cap I realised the ice shelf was being initialised differently, so added the following:

add correct modules:

use MOM_ice_shelf, only : initialize_ice_shelf_fluxes, initialize_ice_shelf_forces

initialise ice shelf fluxes and forces:

  if (OS%use_ice_shelf)  then
    call initialize_ice_shelf_fluxes(OS%ice_shelf_CSp, OS%grid, OS%US, OS%fluxes)
    call initialize_ice_shelf_forces(OS%ice_shelf_CSp, OS%grid, OS%US, OS%forces)
  endif

Please see note 2

Note 1:

  • The subroutine State_SetExport also uses the ocean grid internal mask, applying a mask again as it exports. It doesn't do anything really, and I didn't need to change it.
  • Potentially other places need this mask too. E.g. So_t currently has ocean in the cavities in the mediator output.... but it doesn't seem to be a problem because So_omask is correct. Maybe also in the input.

Note 2:

  • MOM6 FMS cap just uses the fluxes and forces initialisations and not initialize_ice_shelf which I left above. If I did only the fluxes and forces I got a segfault.

Suggested improvements to code

  • Currently I rely on making control structures ocean_state_type and ice_shelf_CS contents public to allow the nuopc cap to access them. Ideally this shouldn't happen, may need some feeder submodules that allow the required variables to be accessed
  • I'm using ISS%hmask for the ice shelf - this could have values not 0 or 1 though (e.g. 2). Using fluxes%frac_shelf_h could also work (this was a previous attempt but the variable hadn't been properly initialized), but likewise can vary and have values between 0 and 1.
  • I don't have an "if using ice shelf then apply this different omask" statement, this needs to be added to mom_export.

special thanks to @dougiesquire @anton-seaice for helpful discussions/hacking during the ACCESS workshop.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions