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.
Custom Query – NEMO

Custom Query (2547 matches)

Filters
 
Or
 
  
 
Columns

Show under each result:


Results (55 - 57 of 2547)

Ticket Resolution Summary Owner Reporter
#2074 fixed Out of bounds error in the extended row form of lbcnfd acc acc
Description

Context

Out of bounds error in the extended row form of lbcnfd which breaks the code when running with check bounds and is a probable cause of restartability issues with ORCA2LIMPISCES when icebergs are active

Analysis

The recent reorganisation and tidying of the lbc routines has introduced an out of bounds error in the extended halo form of the generic lbcnfd routine. Currently this is only used with iceberg field exchanges across the north fold but the error is sufficient to stop the model (if running with check bounds) or to introduce a restartability error in the ORCA2LIMPISCES SETTE tests when run with active icebergs.

Recommendation

The solution is a better generalisation of the mpp_lbc_north_icb and lbc_nfd_ext_generic.h90 routines which sets and passes correctly sized arrays for any number of extra halo rows. This includes zero extra haloes so the lbc_nfd_ext_generic.h90 routine could, eventually, replace the lbc_nfd_generic.h90 set if the algorithm is extended to the 3d and 4d cases. The arrays that are set and passed are centred on the same 4 rows that the default lbcnfd uses so, for example, with 1 extra halo the array second dimension ranges from 0 to 5 with rows 1 to 4 treated in same way as the original scheme. This makes for easier checks on the operations.

That said, working with these generic, preprocessor-generated routines is not straight-forward and the best way to debug and develop this solution was to work off-line with the pre-processed routine, extracted from the lbcnfd.f90 file in BLD/ppsrc/nemo and inserted into a simple wrapper program. Two such test programs are attached to this ticket: nfdtest.f90 and nfdtest_ext.f90. The first just wraps lbc_nfd_2d (extracted from BLD/ppsrc/nemo/lbcnfd.f90) and calls it repeatedly with an 8x4 array for each grid-point type and pivot location combination. The array before and after folding is printed with extra, blanked rows above and below to make a side-by-side comparsion possible. The second test program wraps lbc_nfd_2d_ext (also from lbcnfd.f90) and makes the same calls with an 8x6 array; the middle 4 rows of which hold the same values as the default test. The side-by-side comparison of the output from these two programs is shown below:

sdiff nfdtest.out nfdtest_ext.out

     Default lbcnfd (no extended rows)                              lbcnfd with extended row (kextj = 1)
--------------------------------------------------+------------------------------------------------------
 T-pt, T-pivot, npolj=            4                              T-pt, T-pivot, npolj=            4
                                                BEFORE
    0    0    0    0    0    0    0    0                      |    41   42   43   44   45   46   47   48
   33   34   35   36   37   38   39   40                           33   34   35   36   37   38   39   40
   25   26   27   28   29   30   31   32                           25   26   27   28   29   30   31   32
   17   18   19   20   21   22   23   24                           17   18   19   20   21   22   23   24
    9   10   11   12   13   14   15   16                            9   10   11   12   13   14   15   16
    0    0    0    0    0    0    0    0                      |     1    2    3    4    5    6    7    8

CALL lbc_nfd_2d( pnorth, "T", 1.0D0)                          | CALL lbc_nfd_2d_ext( pnorth, "T", 1.0D0,  1)
                                                AFTER 
    0    0    0    0    0    0    0    0                      |    11   16   15   14   13   12   11   10
   19   24   23   22   21   20   19   18                           19   24   23   22   21   20   19   18
   25   26   27   28   29   28   27   26                           25   26   27   28   29   28   27   26
   17   18   19   20   21   22   23   24                           17   18   19   20   21   22   23   24
    9   10   11   12   13   14   15   16                            9   10   11   12   13   14   15   16
    0    0    0    0    0    0    0    0                      |     1    2    3    4    5    6    7    8
 -----------------                                               -----------------
                                                BEFORE
 U-pt, T-pivot, npolj=            4                              U-pt, T-pivot, npolj=            4
    0    0    0    0    0    0    0    0                      |    41   42   43   44   45   46   47   48
   33   34   35   36   37   38   39   40                           33   34   35   36   37   38   39   40
   25   26   27   28   29   30   31   32                           25   26   27   28   29   30   31   32
   17   18   19   20   21   22   23   24                           17   18   19   20   21   22   23   24
    9   10   11   12   13   14   15   16                            9   10   11   12   13   14   15   16
    0    0    0    0    0    0    0    0                      |     1    2    3    4    5    6    7    8

CALL lbc_nfd_2d( pnorth, "U", -1.0D0)                         | CALL lbc_nfd_2d_ext( pnorth, "U", -1.0D0,  1)
                                                AFTER 
    0    0    0    0    0    0    0    0                      |   -10  -15  -14  -13  -12  -11  -10  -15
  -18  -23  -22  -21  -20  -19  -18  -23                          -18  -23  -22  -21  -20  -19  -18  -23
   25   26   27  -29   29  -27  -26   32                           25   26   27  -29   29  -27  -26   32
   17   18   19   20   21   22   23   24                           17   18   19   20   21   22   23   24
    9   10   11   12   13   14   15   16                            9   10   11   12   13   14   15   16
    0    0    0    0    0    0    0    0                      |     1    2    3    4    5    6    7    8
 -----------------                                               -----------------
                                                BEFORE
 V-pt, T-pivot, npolj=            4                              V-pt, T-pivot, npolj=            4
    0    0    0    0    0    0    0    0                      |    41   42   43   44   45   46   47   48
   33   34   35   36   37   38   39   40                           33   34   35   36   37   38   39   40
   25   26   27   28   29   30   31   32                           25   26   27   28   29   30   31   32
   17   18   19   20   21   22   23   24                           17   18   19   20   21   22   23   24
    9   10   11   12   13   14   15   16                            9   10   11   12   13   14   15   16
    0    0    0    0    0    0    0    0                      |     1    2    3    4    5    6    7    8

CALL lbc_nfd_2d( pnorth, "V", -1.0D0)                         | CALL lbc_nfd_2d_ext( pnorth, "V", -1.0D0,  1)
                                                AFTER 
    0    0    0    0    0    0    0    0                      |    -3   -8   -7   -6   -5   -4   -3   -2
  -11  -16  -15  -14  -13  -12  -11  -10                          -11  -16  -15  -14  -13  -12  -11  -10
   25  -24  -23  -22  -21  -20  -19  -18                           25  -24  -23  -22  -21  -20  -19  -18
   17   18   19   20   21   22   23   24                           17   18   19   20   21   22   23   24
    9   10   11   12   13   14   15   16                            9   10   11   12   13   14   15   16
    0    0    0    0    0    0    0    0                      |     1    2    3    4    5    6    7    8
 -----------------                                               -----------------
                                                BEFORE
 F-pt, T-pivot, npolj=            4                              F-pt, T-pivot, npolj=            4
    0    0    0    0    0    0    0    0                      |    41   42   43   44   45   46   47   48
   33   34   35   36   37   38   39   40                           33   34   35   36   37   38   39   40
   25   26   27   28   29   30   31   32                           25   26   27   28   29   30   31   32
   17   18   19   20   21   22   23   24                           17   18   19   20   21   22   23   24
    9   10   11   12   13   14   15   16                            9   10   11   12   13   14   15   16
    0    0    0    0    0    0    0    0                      |     1    2    3    4    5    6    7    8

CALL lbc_nfd_2d( pnorth, "F", 1.0D0)                          | CALL lbc_nfd_2d_ext( pnorth, "F", 1.0D0,  1)
                                                AFTER 
    0    0    0    0    0    0    0    0                      |     2    7    6    5    4    3    2    7
   10   15   14   13   12   11   10   15                           10   15   14   13   12   11   10   15
   24   23   22   21   20   19   18   32                           24   23   22   21   20   19   18   32
   17   18   19   20   21   22   23   24                           17   18   19   20   21   22   23   24
    9   10   11   12   13   14   15   16                            9   10   11   12   13   14   15   16
    0    0    0    0    0    0    0    0                      |     1    2    3    4    5    6    7    8
 -----------------                                               -----------------
                                                BEFORE
 T-pt, F-pivot, npolj=            6                              T-pt, F-pivot, npolj=            6
    0    0    0    0    0    0    0    0                      |    41   42   43   44   45   46   47   48
   33   34   35   36   37   38   39   40                           33   34   35   36   37   38   39   40
   25   26   27   28   29   30   31   32                           25   26   27   28   29   30   31   32
   17   18   19   20   21   22   23   24                           17   18   19   20   21   22   23   24
    9   10   11   12   13   14   15   16                            9   10   11   12   13   14   15   16
    0    0    0    0    0    0    0    0                      |     1    2    3    4    5    6    7    8

CALL lbc_nfd_2d( pnorth, "T", 1.0D0)                          | CALL lbc_nfd_2d_ext( pnorth, "T", 1.0D0,  1)
                                                AFTER 
    0    0    0    0    0    0    0    0                      |    24   23   22   21   20   19   18   17
   32   31   30   29   28   27   26   25                           32   31   30   29   28   27   26   25
   25   26   27   28   29   30   31   32                           25   26   27   28   29   30   31   32
   17   18   19   20   21   22   23   24                           17   18   19   20   21   22   23   24
    9   10   11   12   13   14   15   16                            9   10   11   12   13   14   15   16
    0    0    0    0    0    0    0    0                      |     1    2    3    4    5    6    7    8
 -----------------                                               -----------------
                                                BEFORE
 U-pt, F-pivot, npolj=            6                              U-pt, F-pivot, npolj=            6
    0    0    0    0    0    0    0    0                      |    41   42   43   44   45   46   47   48
 U-pt, F-pivot, npolj= 6                                          U-pt, F-pivot, npolj= 6              
    0    0    0    0    0    0    0    0                      |    41   42   43   44   45   46   47   48
   33   34   35   36   37   38   39   40                           33   34   35   36   37   38   39   40
   25   26   27   28   29   30   31   32                           25   26   27   28   29   30   31   32
   17   18   19   20   21   22   23   24                           17   18   19   20   21   22   23   24
    9   10   11   12   13   14   15   16                            9   10   11   12   13   14   15   16
    0    0    0    0    0    0    0    0                      |     1    2    3    4    5    6    7    8
   
CALL lbc_nfd_2d( pnorth, "U", -1.0D0)                         | CALL lbc_nfd_2d_ext( pnorth, "U", -1.0D0,  1)
                                                AFTER
    0    0    0    0    0    0    0    0                      |   -23  -22  -21  -20  -19  -18  -17  -17
  -31  -30  -29  -28  -27  -26  -25  -25                          -31  -30  -29  -28  -27  -26  -25  -25
   25   26   27   28   29   30   31   32                           25   26   27   28   29   30   31   32
   17   18   19   20   21   22   23   24                           17   18   19   20   21   22   23   24
    9   10   11   12   13   14   15   16                            9   10   11   12   13   14   15   16
    0    0    0    0    0    0    0    0                      |     1    2    3    4    5    6    7    8
 -----------------                                               -----------------
                                                BEFORE
 V-pt, F-pivot, npolj= 6                                          V-pt, F-pivot, npolj= 6              
    0    0    0    0    0    0    0    0                      |    41   42   43   44   45   46   47   48
   33   34   35   36   37   38   39   40                           33   34   35   36   37   38   39   40
   25   26   27   28   29   30   31   32                           25   26   27   28   29   30   31   32
   17   18   19   20   21   22   23   24                           17   18   19   20   21   22   23   24
    9   10   11   12   13   14   15   16                            9   10   11   12   13   14   15   16
    0    0    0    0    0    0    0    0                      |     1    2    3    4    5    6    7    8
   
CALL lbc_nfd_2d( pnorth, "V", -1.0D0)                         | CALL lbc_nfd_2d_ext( pnorth, "V", -1.0D0,  1)
                                                AFTER
    0    0    0    0    0    0    0    0                      |   -16  -15  -14  -13  -12  -11  -10   -9
  -24  -23  -22  -21  -20  -19  -18  -17                          -24  -23  -22  -21  -20  -19  -18  -17
   25   26   27   28  -28  -27  -26  -25                           25   26   27   28  -28  -27  -26  -25
   17   18   19   20   21   22   23   24                           17   18   19   20   21   22   23   24
    9   10   11   12   13   14   15   16                            9   10   11   12   13   14   15   16
    0    0    0    0    0    0    0    0                      |     1    2    3    4    5    6    7    8
 -----------------                                               -----------------
                                                BEFORE
 F-pt, F-pivot, npolj= 6                                          F-pt, F-pivot, npolj= 6              
    0    0    0    0    0    0    0    0                      |    41   42   43   44   45   46   47   48
   33   34   35   36   37   38   39   40                           33   34   35   36   37   38   39   40  
   25   26   27   28   29   30   31   32                           25   26   27   28   29   30   31   32
   17   18   19   20   21   22   23   24                           17   18   19   20   21   22   23   24
    9   10   11   12   13   14   15   16                            9   10   11   12   13   14   15   16
    0    0    0    0    0    0    0    0                      |     1    2    3    4    5    6    7    8

CALL lbc_nfd_2d( pnorth, "F", 1.0D0)                          | CALL lbc_nfd_2d_ext( pnorth, "F", 1.0D0,  1)
                                                AFTER
    0    0    0    0    0    0    0    0                      |    15   14   13   12   11   10    9    9
   23   22   21   20   19   18   17   17                           23   22   21   20   19   18   17   17
   25   26   27   28   27   26   25   32                           25   26   27   28   27   26   25   32
   17   18   19   20   21   22   23   24                           17   18   19   20   21   22   23   24
    9   10   11   12   13   14   15   16                            9   10   11   12   13   14   15   16
    0    0    0    0    0    0    0    0                      |     1    2    3    4    5    6    7    8
 -----------------                                               -----------------

Crucially the results are identical for the middle four rows in each case and operations on the extended row follow the same pattern.

The corrected and generalised code changes (OPA_SRC/LBC/lbc_nfd_ext_generic.h90 and OPA_SRC/LBC/lib_mpp.F90, only) have been committed to branch 2017/dev_merge_2017 as changeset [9467]. This changeset also reinstates the Intel compiler directive in geo2ocean.F90 which is still necessary on my test system. With these changes the out of bounds error is eliminated and all SETTE tests are passed. This includes ORCA2LIMPISCES restartability tests with active icebergs. ORCA2LIMPISCES reproducibility with icebergs is achieved over the first 80 time steps only but is ok over 1000+ time steps without icebergs.

#2110 fixed Bug in traadv_fct.F90 acc acc
Description

A minor bug exists in the interpolation scheme for the FCT 4th order vertical scheme. The bug was introduced when the code was adapted to cope with the under ice shelf cavities but affects all runs using this option. It manifests as spurious temperatures outside the initial range early in runs of the OVERFLOW test case. Even with the fix shown below, spurious values still occur with this test but much later in the run (> 3000 time steps) and these are in response to excessive vertical velocities which stop the run after 3329 time steps.

Note the pre-ISF enabled version is still in the code (as interp_4th_cpt_org) but is not used. It can be removed subject to successful testing of the new version in an ISF case.

Context

The wrong index is used when setting the bottom boundary condition. The use of jk does not stray out of bounds because jk has a residual valid value from an earlier loop but the boundary condition will be wrong for anything other than flat-bottomed cases.

Analysis

The fix is simple:

  • src/OCE/TRA/traadv_fct.F90

     
    555555            zwd (ji,jj,ikt) = 1._wp          ! top 
    556556            zwi (ji,jj,ikt) = 0._wp 
    557557            zws (ji,jj,ikt) = 0._wp 
    558             zwrm(ji,jj,ikt) = 0.5_wp * ( pt_in(ji,jj,jk-1) + pt_in(ji,jj,jk) ) 
     558            zwrm(ji,jj,ikt) = 0.5_wp * ( pt_in(ji,jj,ikt-1) + pt_in(ji,jj,ikt) ) 
    559559            ! 
    560560            zwd (ji,jj,ikb) = 1._wp          ! bottom 
    561561            zwi (ji,jj,ikb) = 0._wp 
    562562            zws (ji,jj,ikb) = 0._wp 
    563             zwrm(ji,jj,ikb) = 0.5_wp * ( pt_in(ji,jj,jk-1) + pt_in(ji,jj,jk) )             
     563            zwrm(ji,jj,ikb) = 0.5_wp * ( pt_in(ji,jj,ikb-1) + pt_in(ji,jj,ikb) )             
    564564         END DO 
    565565      END DO 

Recommendation

#2128 fixed Uniqueness of iceberg labels can not be guaranteed if restarting from a collated restart file acc acc
Description

Context

There is potential for icebergs to be labelled non-uniquely if a run is restarted from a collated iceberg restart file. This does not affect the heat and mass transport by the icebergs but it can make it impossible to reconstruct all individual trajectories from the time mean datasets.

Analysis

A bit of background information is needed to explain:

  1. When new icebergs are created following a calving event the host processor adds a new entry to its linked list and assigns an iceberg_number to the new structure. Within that structure it also sets properties such as the year and day (as a real proportion of the current year) of the calving event.
  1. The first iceberg on each processor is labelled with the 'narea' value and this iceberg_number is incremented by the total number of processes (jpnij) each time a new iceberg is created. Thus each iceberg_number should be unique.
  1. The uniqueness is relied on whenever a time-series of distributed output is collected together. An iceberg trajectory that crosses between procesors can easily be reconstructed by splicing together the different entries from different files in time order.

However....

If iceberg trajectory restart data is collected into a global dataset (by, for example, using tools/REBUILD_NEMO/icb_combrst.py ) and the collated dataset used to restart the model, several things happen in the current code:

  1. Information about the last number used on each processor is lost (the 'kount' array aka 'num_bergs' will just hold values from the first dataset collated)
  1. This means the starting offset for each processor will be the same on any subsequent restart. So the second new iceberg generated, for example, by area 1 will have the same iceberg number as the first generated by area 2 etc.

In terms of mass and heat transports this isn't an error. Each iceberg is a distinct entry in a linked list and duplicate iceberg_numbers are not an issue. However, if the time-series datasets are collated into global sets then it is probable that trajectories will be created by splicing sections from different icebergs with the same number. An attempt to plot iceberg trajectories from these files will show some apparently teleporting across the globe at various stages. It may be possible to reconstruct the correct trajectories by using additional information to help distinguish identically labelled icebergs but this is of no use once the distributed data has been discarded.

Recommendation

This issue could be avoided by storing the num_bergs values for each area in the collated dataset. This will only help though if restarting using the same processor decomposition. Often, the purpose of creating a global restart dataset is to change the decomposition.

A more robust solution will be to detect invalid num_bergs values when a restart is read and to set appropriate values. This is possible because each num_bergs values should be in the set: {N*jpnij + narea} where N is an integer >= -1 . If invalid values are detected then the smallest value that can guarantee that all new icebergs are uniquely labelled is MAX(iceberg_number) - jpnij + narea. This will require a global mpp_sum call for the error flag followed (if necessary) by a mpp_max call to determine the current maximum iceberg_number.

Note: See TracQuery for help on using queries.