Opened 6 years ago

Closed 6 years ago

Last modified 2 months ago

#1360 closed Bug (fixed)

defects in asminc

Reported by: avidard Owned by: pabouttier
Priority: low Milestone:
Component: OCE Version: release-3.4
Severity: Keywords:
Cc:

Description

This ticket is valid for 3.4 onward

When the application of the assimilation increment is used in direct initialization mode (all the increment added to the state at once at the beginning of the time window) there is a few misconceptions/bugs (basically it does not work, at all).

  1. The first one is really minor, line 743-745 and line 753-755 reads something like

WHERE(t_bkginc(:,:,:) > 0.0_wp .OR. &

&   tsn(:,:,:,jp_tem) + t_bkginc(:,:,:) > fzptnz(:,:,:) )
tsn(:,:,:,jp_tem) = t_bkg(:,:,:) + t_bkginc(:,:,:)  

END WHERE

it should be t_bkg in the second condition rather than tsn. In general they are the same, so it does not matter much.

  1. More problematic neuler is forced to 0 by asminc_init but neuler = 1 can be used earlier in the code if ln_restart=true. So there is an inconsistancy in the initialization.

The fix I found was to add in istate.F90 (for 3.4 ; 3.6 is different)

IF ( lk_asminc .AND. ln_asmdin ) THEN

neuler = 0            ! restart with an euler from the corrected background

ELSE

neuler = 1            ! Set time-step indicator at nit000 (leap-frog)

END IF

The problem is by doing so you need to read the assimilation namelist before istate_init. So I split the asmin_init into the namelist reading (called before istate_init) and the rest of the initialisation (same place as before)

  1. for TKE (but I guess GLS would be the same) the mixing coefficients are not consistent with the other variables, this can lead to very localized strong differences. To sort this out I did a sort of tiny spin-up for tke at the begining of the first time step mimicking what is done if tke is missing in the restart, something like

IF( lk_zdftke .AND. lk_asminc .AND. ln_asmdin .AND. ( kstp == nit000 ) ) THEN

! reinitialize tke

CALL tke_avn                               ! recompute avt, avm, avmu, avmv and dissl (approximation)
DO jk = nit000, nit000 + 2   ;   CALL zdf_tke( jk )   ;   END DO

END IF

it does the trick, but I am not sure it is the right way to proceed.

All this was diagnosed by doing a simple experiment: From 2 restarts x1, x2, I created an increment dx=x1-x2 and compared the run starting from x1 with the one starting from x2 + application of increment dx. Maybe this kind of test could be added in SETTE for validation of this part of the code.

Commit History (2)

ChangesetAuthorTimeChangeLog
13428smueller2020-08-21T19:32:10+02:00

Adjustments of modifications made in [5168] (see ticket #1360) and bugfix in module asminc

5168pabouttier2015-03-25T10:01:32+01:00

Fixed several bugs described in Ticket #1360

Change History (3)

comment:1 Changed 6 years ago by clevy

  • Owner changed from NEMO team to pabouttier

comment:2 Changed 6 years ago by bouttier

  • Resolution set to fixed
  • Status changed from new to closed

Fixed in revision 5168

comment:3 Changed 2 months ago by smueller

In 13428:

Adjustments of modifications made in [5168] (see ticket #1360) and bugfix in module asminc

Note: See TracTickets for help on using tickets.