New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
#2718 (Ice volume not correctly accounted for in the freshwater budget control option 2 (nn_fwb=2)) – NEMO

Opened 3 years ago

Closed 2 years ago

#2718 closed Bug (fixed)

Ice volume not correctly accounted for in the freshwater budget control option 2 (nn_fwb=2)

Reported by: cdllod Owned by: systeam
Priority: low Milestone:
Component: SI3 Version: v4.0.*
Severity: minor Keywords: freshwater budget control, ice initialisation
Cc: casimir.delavergne@…

Description

Context

In forced ocean mode, freshwater budget control is generally used to avoid a drift of the mean ocean salinity and mean sea level. This control is done in sbcfwb.F90. There are three available options (namelist parameter nn_fwb = 1, 2 or 3). The bug relates to option 2, where a correction to surface freshwater fluxes is calculated based on the net freshwater imbalance of the previous year.

Analysis

The imbalance is calculated at the end of the year as the global mean ssh plus the volume of sea ice. This imbalance should be zero in the initial state; that is, the initial ssh should be reduced to offset the initial volume of sea ice. This is currently the case if sea ice is fully embedded, thanks to lines 380-383 of the iceistate.F90 routine:

      IF( ln_ice_embd ) THEN            ! embedded sea-ice: deplete the initial ssh below sea-ice area
         !
         sshn(:,:) = sshn(:,:) - snwice_mass(:,:) * r1_rau0
         sshb(:,:) = sshb(:,:) - snwice_mass(:,:) * r1_rau0

However it is not the case if ice is not fully embedded. This leads to incorrect freshwater budget control and sea level drop in forced ORCA simulations that use nn_fwb = 2 and ln_ice_embd = false (which are default namelist parameters).

Fix

We propose to replace line 424 of the current (rev 15226) iceistate.F90 routine by the following:

      ELSE ! case ice is not fully embedded (this is needed to ensure correct freshwater budget control)
         zsshcor = glob_sum( 'iceistate', e1e2t(:,:) * snwice_mass(:,:) * r1_rau0 ) / glob_sum( 'iceistate', e1e2t(:,:) * tmask(:,:,1) )
         sshn(:,:) = sshn(:,:) - zsshcor
         sshb(:,:) = sshb(:,:) - zsshcor
      ENDIF

and to replace line 94 by:

      REAL(wp) ::   ztmelts, zsshcor

This will ensure that the volume of sea ice is correctly accounted for in the freshwater budget control (option 2). A three-year test simulation with this fix suggests it is working.

Commit History (2)

ChangesetAuthorTimeChangeLog
15439clem2021-10-22T19:53:09+02:00

trunk: freshwater budget is now corrected for option nn_fwb=2. The option could be improved. There is a drift the 1st year and the correction applied can lead to oscillations in the solution. It is related to tickets #2718 and part of #2487 though the fix is somewhat different than proposed in the tickets.

15438clem2021-10-22T16:56:07+02:00

4.0-HEAD: freshwater budget is now corrected for option nn_fwb=2. The option could be improved. There is a drift the 1st year and the correction applied can lead to oscillations in the solution. It is related to tickets #2718 and part of #2487 though the fix is somewhat different than proposed in the tickets.

Change History (4)

comment:1 Changed 3 years ago by clem

Ok but this bug fix is only needed for nn_fwb=2, so I would add an IF condition somewhere.

I see also 3 problems:

1) changing ssh means that comparing 2 simulations (with and without nn_fwb=2) is not easy unless we change ssh whatever nn_fwb?

2) option nn_fwb=2 assumes that ssh is 0 at the beginning of a simulation (a bit restrictive to my point of view but it's coded like that).
So we have to ensure that it is indeed 0. I would add a test and a stop like that:

clean way:

  • create a subroutine sbc_fwb_init in sbcfwb.F90
  • put all the IF( kt == nit000 ) in this subroutine
  • add the following stop there
    zssh = glob_sum( 'sbcfwb', sshn(:,:) )
    IF( ABS(zssh) > 1.e-10_wp )   CALL ctl_stop( 'sbcfwb: ssh needs to be 0 at the beginning of the simulation when using option nn_fwb=2' )
    
  • call the subroutine in sbc_init (after sbc_wave_init)

fast way:

  • add the stop in iceistate directly

3) if we set ssh/=0 at kt=nit000 (it may be possible in trunk or in one of the dev branches?), then even with embedded sea-ice correction is not ok

comment:2 Changed 2 years ago by clem

In 15438:

Error: Failed to load processor CommitTicketReference
No macro or processor named 'CommitTicketReference' found

comment:3 Changed 2 years ago by clem

In 15439:

Error: Failed to load processor CommitTicketReference
No macro or processor named 'CommitTicketReference' found

comment:4 Changed 2 years ago by clem

  • Resolution set to fixed
  • Status changed from new to closed
Note: See TracTickets for help on using tickets.