New URL for NEMO forge!

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.
#1054 (Artificial ice source in limupdate.F90) – NEMO

Opened 9 years ago

Closed 9 years ago

Last modified 3 months ago

#1054 closed Bug (fixed)

Artificial ice source in limupdate.F90

Reported by: barthele Owned by: nemo
Priority: normal Milestone:
Component: LIM3 Version: v3.4
Severity: Keywords: LIM* v3.4
Cc: vancop


In the lim_update routine, the sea ice concentration is limited by zamax (corresponding to the namelist parameter amax, by default equal to 0.999). This is done in the loop starting at line 813.

The concentration in each category is decreased, but the volume should not be affected. However, as is, an increase of the sea ice volume in each category is coded. This bug creates an artificial source of ice.

The correction is easy, the two following lines in the loop must be commented :

z_dv_i = v_i(ji,jj,jl) * z_da_i / MAX( at_i(ji,jj), epsi06 )
v_i(ji,jj,jl) = v_i(ji,jj,jl) + z_dv_i

and the following declaration must be shortened, since we don't need the z_dv_i anymore :

REAL(wp) :: zweight, zesum, zhimax, z_da_i, z_dv_i

The effect of this bug is to create, in some of our simulations, huge ice accumulations (tens of meters thick after ~ 50 years). In some other runs, I don't know why, it doesn't seem to have a large impact ... In any case, the bug is very clear and can (and should) be corrected right away !

Commit History (3)


dev_MERGE_2012: #1054, LIM3: more simple and efficient correction of the reported bug


Bugfix on articifial ice source, see ticket:#1054


Bugfix on articifial ice source, see ticket:#1054

Change History (6)

comment:1 Changed 9 years ago by clevy

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

Following Martin's advice, bug has been fixed as suggested in branches 2012/dev_v3_4_STABLE_2012 and 2012/dev_MERGE_2012

comment:2 Changed 9 years ago by gm

The rescaling performed in this part of limupdate.F90 can be rewritten in a much more simple and efficient way.

What is currently done is (with the bug corrected) :

    zamax = amax
    DO jj = 1, jpj
         DO ji = 1, jpi

            ! 0) Excessive area ?
            z_da_ex =  MAX( at_i(ji,jj) - zamax , 0.0 )        

            ! 1) Count the number of existing categories
            DO jl  = 1, jpl
               zindb   =  MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - epsi03 ) ) 
               zindb   =  MAX( rzero, SIGN( rone, v_i(ji,jj,jl) ) ) 
               z_da_i = a_i(ji,jj,jl) * z_da_ex / MAX( at_i(ji,jj), epsi06 ) * zindb
               a_i(ji,jj,jl) = a_i(ji,jj,jl) - z_da_i
            END DO

         END DO !ji
      END DO !jj

      at_i(:,:) = a_i(:,:,1)
      DO jl = 2, jpl
         at_i(:,:) = a_i(:,:,jl) + at_i(:,:)
      END DO

The requirement is that at_i, the total ice concentration (i.e. sum over the categories) is always less than amax. So, if at_i > amax then rescale the area of each ice category, elsewhere nothing to do.

This can be obtained by the following lines:

      DO jl = 1, jpl                          ! if at_i > amax, set at_i=amax by a rescale of the area of each category
         a_i(:,:,jl) = a_i(:,:,jl) * amax / MAX( at_i(:,:), amax )
      END DO
      at_i(:,:) = MIN( at_i(:,:), amax )      ! total concentration becomes less than amax by construction

that is using a rescale factor of amax/at_i if at_i>amax, and of 1. (=amax/amax) otherwise. No need to recompute at_i, since the only change in at_i value will be at_i=amax when at_i>amax.

This changes have been introduced in  v3.5 alpha only

see Changeset 3838 

comment:3 Changed 4 years ago by nemo

  • Keywords LIM* added

comment:4 Changed 4 years ago by nemo

  • Keywords release-3.4* added

comment:5 Changed 4 years ago by nemo

  • Keywords release-3.4* removed

comment:6 Changed 3 months ago by nemo

  • Keywords v3.4 added
Note: See TracTickets for help on using tickets.