Custom Query (2547 matches)
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 |
ContextOut 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 AnalysisThe 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. RecommendationThe 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. ContextThe 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. AnalysisThe fix is simple:
Recommendation |
|||||||||||||||||||||||||||||||||||||||||||||
#2128 | fixed | Uniqueness of iceberg labels can not be guaranteed if restarting from a collated restart file | acc | acc | ||||||||||||||||||||||||||||||||||||||||||
Description |
ContextThere 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. AnalysisA bit of background information is needed to explain:
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:
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. RecommendationThis 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. |