MOM6 ============== A new ocean component model based on the Modular Ocean Model version 6 (MOM6) has been incorporated into `CESM `_ and is anticipated to replace POP2 as the default ocean component in CESM3. An early functional release of the MOM6 ocean component has been made available to users beginning with CESM2.2. Instructions for using MOM6 in CESM are available on the `MOM_interface GitHub Wiki `_. This DART-MOM6 interface was developed for `MOM6 `_ within the CESM framework. MOM6 time --------- The default in CESM is to run with no leap years. To assimilate real observations, we need to switch to the Gregorian calendar to account for leap years. .. code-block:: text ./xmlchange CALENDAR=GREGORIAN To illustrate what happens if you do not set CALENDAR=GREGORIAN, here is an example where the RUN_STARTDATE is set to 2015-02-01 and MOM6 is run for 10 days. .. code-block:: text ./xmlchange RUN_STARTDATE=2015-02-01 The MOM6 restart file has the following meta data, where Time is days from year 1. .. code-block:: text double Time(Time) ; Time:long_name = "Time" ; Time:units = "days" ; Time:axis = "T" ; ... // global attributes: :filename = "./c.T62_g16.ens3.mom6.r.2015-02-11-00000._0001.nc" ; data: Time = 735151 ; } The absence of leap years gives you inconsistent time information when comparing to observation times in YYYY-MM-DD: - Restart filename has the time 2015-02-11-00000. - The Time variable is Time = 735151 days, which is 2013/10/11 MOM6 checksum of restart files ------------------------------ When reading in restart files, MOM6 verifies a checksum for each variable in the restart file. Data assimilation updates the data in the MOM6 restart file, which will cause the checksum verification to fail. To use DART-MOM6 with CESM turn off the checksum verification using the ``user_nml_mom`` namelist option: .. code-block:: text RESTART_CHECKSUMS_REQUIRED = False model_nml --------- The namelist options for DART-MOM6 are as follows: .. code-block:: text &model_nml template_file = 'mom6.r.nc', ocean_geometry = 'ocean_geometry.nc', static_file = 'c.e22.GMOM.T62_g16.nuopc.001.mom6.static.nc', model_state_variables = 'Salt ', 'QTY_SALINITY ', 'UPDATE', 'Temp ', 'QTY_POTENTIAL_TEMPERATURE', 'UPDATE', 'u ', 'QTY_U_CURRENT_COMPONENT ', 'UPDATE', 'v ', 'QTY_V_CURRENT_COMPONENT ', 'UPDATE', 'h ', 'QTY_LAYER_THICKNESS ', 'UPDATE', assimilation_period_days = 1 assimilation_period_seconds = 1 / * ``template_file`` is a MOM6 restart file. The size and shape of the state variables will be read from this netCDF file. * ``ocean_geometry`` is a MOM6 netCDF file containing the variables ``D``, the basin depth in meters; and ``wet``, whether a point is land or ocean at the Earth's surface. * ``static_file`` is a MOM6 netCDF file containing the grid information. The following three grids are read into DART: .. code-block:: text geolon(:,:) Longitude of tracer (T) points geolat(:,:) Latitude of tracer (T) points geolon_u(:,:) Longitude of zonal velocity (Cu) points geolat_u(:,:) Latitude of zonal velocity (Cu) points geolon_v(:,:) Longitude of meridional velocity (Cv) points geolat_v(:,:) Latitude of meridional velocity (Cv) point Vertical Coordinate ------------------- The vertical coordinate in MOM6 is layer thickness which varies across the ensemble. To get the depth in meters at a particular layer, you must sum the layer thicknesses. .. code-block:: text double h(Time, Layer, lath, lonh) ; h:long_name = "Layer Thickness" ; h:units = "m" ; .. Note Layer interface thickness maybe available from MOM6. But the restarts we have available have "Layer thickness" only. Land in the state ------------------ The MOM6 grid is global, so land is included in the state. To avoid updating land, ``get_close_state`` forces the distance to be very large for dry land and locations below the sea floor. Identifying land/ocean points at the surface can be simply done using the the longitude, latitude of the given point. ``get_state_meta_data`` is used to assign land points at the surface QTY_DRY_LAND. The process to identify points below the sea floor requires the vertical location of the point in meters. The conversion from model layer to depth in meters is done in ``convert_vertical_state``. The depth is then used to identify points below the basin depth in ``get_close_state``. .. code-block:: fortran :emphasize-lines: 5, 9 :caption: snippet from get_close_state ! Put any land or sea floor points very far away ! so they are not updated by assimilation do ii = 1, num_close if(loc_qtys(close_ind(ii)) == QTY_DRY_LAND) dist = 1.0e9_r8 lon_lat_vert = get_location(locs(close_ind(ii))) ! assuming VERTISHEIGHT call get_model_variable_indices(loc_indx(ii), i, j, k) if ( below_sea_floor(i,j,lon_lat_vert(3)) ) dist = 1.0e9_r8 enddo