From dd028d5c4ac1b543dc1d095cf65a3739e9561411 Mon Sep 17 00:00:00 2001 From: Patrick Scholz Date: Fri, 26 Jun 2026 13:49:45 +0200 Subject: [PATCH] Fix KPP StokesMOST: replace kpp_obldepth (metres) with kpp_nzobldepth (level index) kpp_obldepth stores the OBL depth in physical metres (e.g. 250 m). kpp_nzobldepth stores the companion level index (e.g. 5.7). Two lines in the StokesMOST second-pass surface layer search were using kpp_obldepth as a level index: nzsfc was set to ~250 and the do-loop ran to int(250), far beyond the 47-level array bound. Without bounds checking this silently reads garbage memory; with bounds checking it segfaults. The line computing sldepth (a physical depth in metres) correctly keeps kpp_obldepth and is unchanged. --- src/cvmix_driver/gen_modules_cvmix_kpp.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cvmix_driver/gen_modules_cvmix_kpp.F90 b/src/cvmix_driver/gen_modules_cvmix_kpp.F90 index 62d0ff1a8..5769230f2 100644 --- a/src/cvmix_driver/gen_modules_cvmix_kpp.F90 +++ b/src/cvmix_driver/gen_modules_cvmix_kpp.F90 @@ -931,8 +931,8 @@ subroutine calc_cvmix_kpp(ice, dynamics, tracers, partit, mesh) ! applied and where surface averages are taken — not something that ! varies with depth. sldepth = kpp_surf_layer_ext*max(kpp_obldepth(node), kpp_minOBLdepth) - nzsfc = kpp_obldepth(node) - do nztmp = nun, int(kpp_obldepth(node)) + nzsfc = int(kpp_nzobldepth(node)) + do nztmp = nun, int(kpp_nzobldepth(node)) if (-zbar_3d_n(nztmp+1,node)>=sldepth) then nzsfc = nztmp exit