From dde5991189c7293584bb1f0d0dbfacd2e7f00eff Mon Sep 17 00:00:00 2001 From: Michael Duda Date: Mon, 4 May 2026 15:47:47 -0600 Subject: [PATCH 01/17] Generalize the name of the 'mp_thompson_aers_in' package in init_atmosphere core The processing of GOCART-based water- and ice-friendly aerosols in the init_atmosphere core currently supports only the aerosol-aware Thompson microphysics scheme, but planned additions to MPAS-Atmosphere (specifically, the TEMPO microphysics scheme) will make use of these same aerosol fields. Accordingly, this commit generalizes the name of the 'mp_thompson_aers_in' package to 'microphysics_aerosols' in the init_atmosphere core. --- src/core_init_atmosphere/Registry.xml | 19 ++++++++-------- .../mpas_init_atm_core_interface.F | 22 +++++++++---------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/core_init_atmosphere/Registry.xml b/src/core_init_atmosphere/Registry.xml index d45a115e33..8834c402a9 100644 --- a/src/core_init_atmosphere/Registry.xml +++ b/src/core_init_atmosphere/Registry.xml @@ -385,7 +385,7 @@ - + @@ -599,7 +599,7 @@ - + @@ -1025,15 +1025,15 @@ + packages="microphysics_aerosols"/> + packages="microphysics_aerosols"/> + packages="microphysics_aerosols"/> + packages="microphysics_aerosols"/> + packages="microphysics_aerosols"/> + @@ -1210,11 +1211,11 @@ + packages="microphysics_aerosols"/> + packages="microphysics_aerosols"/> diff --git a/src/core_init_atmosphere/mpas_init_atm_core_interface.F b/src/core_init_atmosphere/mpas_init_atm_core_interface.F index f277a4a72f..288ab3b246 100644 --- a/src/core_init_atmosphere/mpas_init_atm_core_interface.F +++ b/src/core_init_atmosphere/mpas_init_atm_core_interface.F @@ -120,7 +120,7 @@ function init_atm_setup_packages(configs, streamInfo, packages, iocontext) resul logical, pointer :: config_native_gwd_static, config_static_interp, config_vertical_grid, config_met_interp logical, pointer :: config_native_gwd_gsl_static logical, pointer :: first_guess_field - logical, pointer :: mp_thompson_aers_in + logical, pointer :: microphysics_aerosols integer, pointer :: config_init_case logical, pointer :: noahmp, config_noahmp_static @@ -167,8 +167,8 @@ function init_atm_setup_packages(configs, streamInfo, packages, iocontext) resul nullify(met_stage_out) call mpas_pool_get_package(packages, 'met_stage_outActive', met_stage_out) - nullify(mp_thompson_aers_in) - call mpas_pool_get_package(packages, 'mp_thompson_aers_inActive', mp_thompson_aers_in) + nullify(microphysics_aerosols) + call mpas_pool_get_package(packages, 'microphysics_aerosolsActive', microphysics_aerosols) if (.not. associated(initial_conds) .or. & .not. associated(sfc_update) .or. & @@ -179,7 +179,7 @@ function init_atm_setup_packages(configs, streamInfo, packages, iocontext) resul .not. associated(vertical_stage_out) .or. & .not. associated(met_stage_in) .or. & .not. associated(met_stage_out) .or. & - .not. associated(mp_thompson_aers_in)) then + .not. associated(microphysics_aerosols)) then call mpas_log_write('********************************************************************************', messageType=MPAS_LOG_ERR) call mpas_log_write('* Error while setting up packages for init_atmosphere core.', messageType=MPAS_LOG_ERR) call mpas_log_write('********************************************************************************', messageType=MPAS_LOG_ERR) @@ -197,12 +197,12 @@ function init_atm_setup_packages(configs, streamInfo, packages, iocontext) resul if (config_init_case == 9) then lbcs = .true. - mp_thompson_aers_in = .false. + microphysics_aerosols = .false. inquire(file="QNWFA_QNIFA_SIGMA_MONTHLY.dat",exist=lexist) - if(lexist) mp_thompson_aers_in = .true. + if(lexist) microphysics_aerosols = .true. else lbcs = .false. - mp_thompson_aers_in = .false. + microphysics_aerosols = .false. end if if (config_init_case == 7) then @@ -226,9 +226,9 @@ function init_atm_setup_packages(configs, streamInfo, packages, iocontext) resul (.not. config_vertical_grid) met_stage_out = config_met_interp - mp_thompson_aers_in = .false. + microphysics_aerosols = .false. inquire(file="QNWFA_QNIFA_SIGMA_MONTHLY.dat",exist=lexist) - if((lexist .and. met_stage_out) .or. (lexist .and. met_stage_in)) mp_thompson_aers_in = .true. + if((lexist .and. met_stage_out) .or. (lexist .and. met_stage_in)) microphysics_aerosols = .true. else if (config_init_case == 8) then gwd_stage_in = .false. @@ -252,9 +252,9 @@ function init_atm_setup_packages(configs, streamInfo, packages, iocontext) resul met_stage_in = .true. met_stage_out = .true. - mp_thompson_aers_in = .false. + microphysics_aerosols = .false. inquire(file="QNWFA_QNIFA_SIGMA_MONTHLY.dat",exist=lexist) - if((lexist .and. met_stage_out) .or. (lexist .and. met_stage_in)) mp_thompson_aers_in = .true. + if((lexist .and. met_stage_out) .or. (lexist .and. met_stage_in)) microphysics_aerosols = .true. initial_conds = .false. ! Also, turn off the initial_conds package to avoid writing the IC "output" stream From 0fd81c4c1d7e854eb9f819f646facf1697a892e7 Mon Sep 17 00:00:00 2001 From: Dusan Jovic Date: Tue, 5 May 2026 09:17:54 -0400 Subject: [PATCH 02/17] Fix memory leak in mpas_io.F In the `mpas_io` module, the `MPAS_io_inq_var` subroutine allocates the `dimnames` array and returns it to a calling routine. In this case, the calling routine is `MPAS_io_def_var`, which has a local pointer array, `inq_dimnames`, that corresponds to the allocated `dimnames` and must be deallocated before this routine returns. Direct leak of 152576 byte(s) in 162 object(s) allocated from: #0 0x7fe7202ef41f in malloc (/lib64/libasan.so.8+0xef41f) (BuildId: 2a7b18228484f7c17d959b022f3ff6aaaf687b3c) #1 0x0000024709b7 in __mpas_io_MOD_mpas_io_inq_var /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_io.F:1123 #2 0x000002468a5b in __mpas_io_MOD_mpas_io_def_var /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_io.F:1222 #3 0x000002613e0a in __mpas_io_streams_MOD_mpas_streamaddfield_generic /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_io_streams.F:1761 #4 0x000002639406 in __mpas_io_streams_MOD_mpas_streamaddfield_1dreal /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_io_streams.F:959 #5 0x0000024a69fa in build_stream /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_stream_manager.F:4363 #6 0x0000024b13d7 in write_stream /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_stream_manager.F:3251 #7 0x0000024b6afd in __mpas_stream_manager_MOD_mpas_stream_mgr_write /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_stream_manager.F:2858 #8 0x00000094afb5 in __atm_core_MOD_atm_core_run /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/core_atmosphere/mpas_atm_core.F:620 #9 0x000000406341 in __mpas_subdriver_MOD_mpas_run /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas_subdriver.F:416 #10 0x000000402942 in mpas /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:20 #11 0x0000004029b2 in main /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:10 #12 0x7fe71f208680 in __libc_start_call_main (/lib64/libc.so.6+0x3680) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #13 0x7fe71f208797 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3797) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #14 0x000000402844 in _start (/home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/bin/mpas_atmosphere+0x402844) (BuildId: c0332077ce07f118fef380e98497523209704432) --- src/framework/mpas_io.F | 1 + 1 file changed, 1 insertion(+) diff --git a/src/framework/mpas_io.F b/src/framework/mpas_io.F index 5b3b5642bb..d5483be69c 100644 --- a/src/framework/mpas_io.F +++ b/src/framework/mpas_io.F @@ -1256,6 +1256,7 @@ subroutine MPAS_io_def_var(handle, fieldname, fieldtype, dimnames, precision, ie ! TODO: Can we get the dimension sizes to see whether they match those from the file? end if + if (associated(inq_dimnames)) deallocate(inq_dimnames) return end if From 022e5ca541393d616c36cc6fe3193d3721e50418 Mon Sep 17 00:00:00 2001 From: Dusan Jovic Date: Tue, 5 May 2026 09:37:33 -0400 Subject: [PATCH 03/17] Fix memory leak in mpas_stream_manager.F This one was difficult to find. Backtrace, for some reason, did not point to the exact locations in the source code where subroutine calls are located. In `mpas_stream_list.F` in the `MPAS_stream_list_create` subroutine, memory is allocated for `list` pointer. This routine is called from MPAS_stream_mgr_add_alarmat line 1271 and stored in new_alarm % streamList. The new_alarm itself is allocated a few lines before (1269), and inserted into manager % alarms_in at line 1279: 1266 ! If alarm is not already defined, we need to create a new alarm node 1267 nullify(new_alarm) 1268 if (.not. MPAS_stream_list_query(manager % alarms_in, alarmID, new_alarm, ierr=err_local)) then 1269 allocate(new_alarm) 1270 new_alarm % name = alarmID 1271 call MPAS_stream_list_create(new_alarm % streamList, ierr=err_local) 1272 if (err_local /= MPAS_STREAM_LIST_NOERR) then 1273 if (present(ierr)) ierr = MPAS_STREAM_MGR_ERROR 1274 STREAM_ERROR_WRITE('Problems while creating stream list for alarm') 1275 return 1276 end if 1277 nullify(new_alarm % next) 1278 1279 call MPAS_stream_list_insert(manager % alarms_in, new_alarm, ierr=err_local) 1280 if (err_local /= MPAS_STREAM_LIST_NOERR) then 1281 if (present(ierr)) ierr = MPAS_STREAM_MGR_ERROR 1282 STREAM_ERROR_WRITE('Problems while adding input alarm to list') 1283 return 1284 end if 1285 end if Similar actions are taken for manager % alarms_out. To prevent memory leaks, before freeing up the list of input/output alarms we must first destroy the list of "sub" alarms added to these two lists (manager % alarms_in and manager % alarms_out) in MPAS_stream_mgr_finalize. Direct leak of 15456 byte(s) in 7 object(s) allocated from: #0 0x7f59c3eef41f in malloc (/lib64/libasan.so.8+0xef41f) (BuildId: 2a7b18228484f7c17d959b022f3ff6aaaf687b3c) #1 0x000002580ef6 in __mpas_stream_list_MOD_mpas_stream_list_create /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_stream_list.F:38 #2 0x0000024c7397 in __mpas_stream_manager_MOD_mpas_stream_mgr_add_alarm /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_stream_manager.F:1242 #3 0x0000024d6bd7 in stream_mgr_add_alarm_c /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_stream_manager.F:6198 #4 0x0000024fc7c1 in xml_stream_parser /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/xml_stream_parser.c:1348 #5 0x00000040c916 in __mpas_subdriver_MOD_mpas_init /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas_subdriver.F:42 #6 0x000000402934 in mpas /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:18 #7 0x0000004029b2 in main /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:10 #8 0x7f59c2e08680 in __libc_start_call_main (/lib64/libc.so.6+0x3680) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #9 0x7f59c2e08797 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3797) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #10 0x000000402844 in _start (/home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/bin/mpas_atmosphere+0x402844) (BuildId: 3a2362d27fd37ec758776277d1ca8e2b27dea473) --- src/framework/mpas_stream_manager.F | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/framework/mpas_stream_manager.F b/src/framework/mpas_stream_manager.F index 8a4a1b4ad3..609663ed58 100644 --- a/src/framework/mpas_stream_manager.F +++ b/src/framework/mpas_stream_manager.F @@ -245,6 +245,19 @@ subroutine MPAS_stream_mgr_finalize(manager, ierr)!{{{ STREAM_ERROR_WRITE('Problems while destroying stream list') end if + ! + ! Remove all items from manager % alarms_in(put) list + ! + stream_cursor => manager % alarms_in % head + do while (associated(stream_cursor)) + call MPAS_stream_list_destroy(stream_cursor % streamList, ierr=err_local) + if (err_local /= MPAS_STREAM_LIST_NOERR) then + if (present(ierr)) ierr = MPAS_STREAM_MGR_ERROR + STREAM_ERROR_WRITE('Problems while destroying input alarms item') + end if + stream_cursor => stream_cursor % next + end do + ! ! Free up list of input alarms ! @@ -254,6 +267,19 @@ subroutine MPAS_stream_mgr_finalize(manager, ierr)!{{{ STREAM_ERROR_WRITE('Problems while destroying input alarms list') end if + ! + ! Remove all items from manager % alarms_out(put) list + ! + stream_cursor => manager % alarms_out % head + do while (associated(stream_cursor)) + call MPAS_stream_list_destroy(stream_cursor % streamList, ierr=err_local) + if (err_local /= MPAS_STREAM_LIST_NOERR) then + if (present(ierr)) ierr = MPAS_STREAM_MGR_ERROR + STREAM_ERROR_WRITE('Problems while destroying output alarms list') + end if + stream_cursor => stream_cursor % next + end do + ! ! Free up list of output alarms ! From b464355a33f238682178cabe1edfe3a6ab51c9cb Mon Sep 17 00:00:00 2001 From: Dusan Jovic Date: Tue, 5 May 2026 09:45:11 -0400 Subject: [PATCH 04/17] Fix memory leak in stream_inquiry.c Memory is allocated in `read_and_broadcast` function in stream_inquiry.c and its address returned to `parse_streams_file` via `xml_buf` pointer. This pointer is then passed to `ezxml_parse_str` function, but it is never freed in `parse_streams_file` nor returned to the function that called `parse_streams_file`. This means the ownership of the memory that xml_buf points to is transferred to ezxml_parse_str. It is responsible for freeing that memory. In `ezxml_parse_str` the pointer to that memory buffer (char *s) is saved in `root->m` so that it can be freed later in `ezxml_free()`. To indicate that root->m should be freed, root->len must be set to -1. This is how it's done in other functions. Direct leak of 2915 byte(s) in 1 object(s) allocated from: #0 0x7f329f6ef41f in malloc (/lib64/libasan.so.8+0xef41f) (BuildId: 2a7b18228484f7c17d959b022f3ff6aaaf687b3c) #1 0x0000024ff074 in read_and_broadcast /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/stream_inquiry.c:83 #2 0x0000024ff2da in parse_streams_file /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/stream_inquiry.c:146 #3 0x000002489642 in __mpas_stream_inquiry_MOD_streaminfo_init /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_stream_inquiry.F:137 #4 0x000000409cad in __mpas_subdriver_MOD_mpas_init /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas_subdriver.F:267 #5 0x000000402934 in mpas /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:18 #6 0x0000004029b2 in main /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:10 #7 0x7f329e408680 in __libc_start_call_main (/lib64/libc.so.6+0x3680) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #8 0x7f329e408797 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3797) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #9 0x000000402844 in _start (/home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/bin/mpas_atmosphere+0x402844) (BuildId: ab61abfcc5d576737ec24283b11ac29c6cd28819) --- src/external/ezxml/ezxml.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/external/ezxml/ezxml.c b/src/external/ezxml/ezxml.c index 91ae2bc1d9..88f0002b0c 100644 --- a/src/external/ezxml/ezxml.c +++ b/src/external/ezxml/ezxml.c @@ -481,6 +481,7 @@ ezxml_t ezxml_parse_str(char *s, size_t len) int l, i, j; root->m = s; + root->len = -1; // so we know to free s in ezxml_free() if (! len) return ezxml_err(root, NULL, "root tag missing"); root->u = ezxml_str2utf8(&s, &len); // convert utf-16 to utf-8 root->e = (root->s = s) + len; // record start and end of work area From 51ee1c49502d2ddf73a24f3ced70ee903ed62969 Mon Sep 17 00:00:00 2001 From: Dusan Jovic Date: Tue, 5 May 2026 10:02:33 -0400 Subject: [PATCH 05/17] Fix memory leak in mpas_io.F In `MPAS_io_put_att_text` (and also in other *_io_put_att_*) subroutine `new_attlist_node` is allocated and added as a variable attribute to a field (if fieldname is present) or as a global attribute to a handle. It should be deleted in `MPAS_io_close`. Direct leak of 2592 byte(s) in 162 object(s) allocated from: #0 0x7fd0fbaef41f in malloc (/lib64/libasan.so.8+0xef41f) (BuildId: 2a7b18228484f7c17d959b022f3ff6aaaf687b3c) #1 0x0000023be0e0 in __mpas_io_MOD_mpas_io_put_att_text /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_io.F:6066 #2 0x000002581ccd in __mpas_io_streams_MOD_put_get_field_atts /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_io_streams.F:4341 #3 0x00000263a195 in __mpas_io_streams_MOD_mpas_streamaddfield_1dreal /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_io_streams.F:976 #4 0x0000024a6aac in build_stream /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_stream_manager.F:4389 #5 0x0000024b1489 in write_stream /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_stream_manager.F:3277 #6 0x0000024b6baf in __mpas_stream_manager_MOD_mpas_stream_mgr_write /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_stream_manager.F:2884 #7 0x00000094df25 in __atm_core_MOD_atm_core_run /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/core_atmosphere/mpas_atm_core.F:754 #8 0x000000406341 in __mpas_subdriver_MOD_mpas_run /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas_subdriver.F:416 #9 0x000000402942 in mpas /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:20 #10 0x0000004029b2 in main /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:10 #11 0x7fd0fa808680 in __libc_start_call_main (/lib64/libc.so.6+0x3680) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #12 0x7fd0fa808797 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3797) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #13 0x000000402844 in _start (/home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/bin/mpas_atmosphere+0x402844) (BuildId: d86a2755908f751ab1aef6095ced60ba65202ab8) --- src/framework/mpas_io.F | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/framework/mpas_io.F b/src/framework/mpas_io.F index d5483be69c..fa7e35598c 100644 --- a/src/framework/mpas_io.F +++ b/src/framework/mpas_io.F @@ -6336,6 +6336,7 @@ subroutine MPAS_io_close(handle, ierr) if (attlist_del % atthandle % attType == MPAS_ATT_INTA) deallocate(attlist_del % atthandle % attValueIntA) if (attlist_del % atthandle % attType == MPAS_ATT_REALA) deallocate(attlist_del % atthandle % attValueRealA) deallocate(attlist_del % atthandle) + deallocate(attlist_del) end do nullify(fieldlist_del % fieldhandle % attlist_head) nullify(fieldlist_del % fieldhandle % attlist_tail) @@ -6363,6 +6364,7 @@ subroutine MPAS_io_close(handle, ierr) if (attlist_del % atthandle % attType == MPAS_ATT_INTA) deallocate(attlist_del % atthandle % attValueIntA) if (attlist_del % atthandle % attType == MPAS_ATT_REALA) deallocate(attlist_del % atthandle % attValueRealA) deallocate(attlist_del % atthandle) + deallocate(attlist_del) end do nullify(handle % attlist_head) nullify(handle % attlist_tail) From ec9349954c0d0d15c933f26c4df58a97612306ef Mon Sep 17 00:00:00 2001 From: Dusan Jovic Date: Tue, 5 May 2026 10:31:18 -0400 Subject: [PATCH 06/17] Fix memory leak in mpas_pool_routines.F In all subroutines that add a new field to a pool, like `mpas_pool_add_field_2d_real` in this case, a new mpas_pool_member_type is allocated, with `allocate(newmem)`, and then a `mpas_pool_data_type` is allocated as a `data` component of newmem, with `allocate(newmem % data)`. When pool members are deallocated (in `pool_remove_member`) before deallocating the pointer that points to a pool member type, a pool data type component must also be deallocated. Direct leak of 1056 byte(s) in 1 object(s) allocated from: #0 0x7f94afcef41f in malloc (/lib64/libasan.so.8+0xef41f) (BuildId: 2a7b18228484f7c17d959b022f3ff6aaaf687b3c) #1 0x0000021f2834 in __mpas_pool_routines_MOD_mpas_pool_add_field_2d_real /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_pool_routines.F:2215 #2 0x0000023af006 in __mpas_halo_MOD_mpas_halo_exch_group_add_field /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_halo.F:511 #3 0x000000964b6b in __mpas_atm_halos_MOD_atm_build_halo_groups /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/core_atmosphere/mpas_atm_halos.F:191 #4 0x00000095a6f8 in __atm_core_MOD_atm_core_init /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/core_atmosphere/mpas_atm_core.F:103 #5 0x00000040ce79 in __mpas_subdriver_MOD_mpas_init /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas_subdriver.F:394 #6 0x000000402934 in mpas /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:18 #7 0x0000004029b2 in main /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:10 #8 0x7f94aec08680 in __libc_start_call_main (/lib64/libc.so.6+0x3680) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #9 0x7f94aec08797 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3797) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #10 0x000000402844 in _start (/home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/bin/mpas_atmosphere+0x402844) (BuildId: 1c56ff6f6b8a8860cf4bb09f1474a7cfce529289) --- src/framework/mpas_pool_routines.F | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/framework/mpas_pool_routines.F b/src/framework/mpas_pool_routines.F index 80339e3112..4f57211deb 100644 --- a/src/framework/mpas_pool_routines.F +++ b/src/framework/mpas_pool_routines.F @@ -5795,6 +5795,7 @@ logical function pool_remove_member(inPool, key, memType)!{{{ end if !TODO: are there cases where we need to delete more data here? + if (associated(ptr_prev % data)) deallocate(ptr_prev % data) deallocate(ptr_prev) end if pool_remove_member = .true. @@ -5828,6 +5829,7 @@ logical function pool_remove_member(inPool, key, memType)!{{{ end if !TODO: are there cases where we need to delete more data here? + if (associated(ptr % data)) deallocate(ptr % data) deallocate(ptr) end if pool_remove_member = .true. From e0969a6c862b28aec7adb77bdd914978978500ff Mon Sep 17 00:00:00 2001 From: Dusan Jovic Date: Tue, 5 May 2026 11:17:01 -0400 Subject: [PATCH 07/17] Fix memory leak in mpas_framework.F and mpas_domain_routines.F The `dminfo` component of the `dom` object is allocated twice, first in `mpas_allocate_domain` and then in `mpas_framework_init_phase1`. It is never deallocated. The second allocation is unnecessary and should be removed. The deallocation should be added to `mpas_deallocate_domain`. Also, `mpas_deallocate_domain` is called too early in `mpas_framework_finalize`, it should be called after calls to `mpas_dmpar_finalize` and `mpas_finish_block_proc_list`. In fact I think `mpas_deallocate_domain` should not be called at all from `mpas_framework_finalize`, but from the module that called `mpas_allocate_domain`, which is `mpas_subdriver`. Direct leak of 160 byte(s) in 1 object(s) allocated from: #0 0x7f8370cef41f in malloc (/lib64/libasan.so.8+0xef41f) (BuildId: 2a7b18228484f7c17d959b022f3ff6aaaf687b3c) #1 0x00000215d335 in __mpas_domain_routines_MOD_mpas_allocate_domain /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_domain_routines.F:46 #2 0x00000040908c in __mpas_subdriver_MOD_mpas_init /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas_subdriver.F:194 #3 0x000000402934 in mpas /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:18 #4 0x0000004029b2 in main /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:10 #5 0x7f836fa08680 in __libc_start_call_main (/lib64/libc.so.6+0x3680) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #6 0x7f836fa08797 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3797) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #7 0x000000402844 in _start (/home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/bin/mpas_atmosphere+0x402844) (BuildId: e8ced93cd7d700e184ed309fa9f3c945cd2d3e8a) Direct leak of 160 byte(s) in 1 object(s) allocated from: #0 0x7f8370cef41f in malloc (/lib64/libasan.so.8+0xef41f) (BuildId: 2a7b18228484f7c17d959b022f3ff6aaaf687b3c) #1 0x00000236c37d in __mpas_framework_MOD_mpas_framework_init_phase1 /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_framework.F:68 #2 0x000000409131 in __mpas_subdriver_MOD_mpas_init /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas_subdriver.F:202 #3 0x000000402934 in mpas /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:18 #4 0x0000004029b2 in main /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:10 #5 0x7f836fa08680 in __libc_start_call_main (/lib64/libc.so.6+0x3680) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #6 0x7f836fa08797 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3797) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #7 0x000000402844 in _start (/home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/bin/mpas_atmosphere+0x402844) (BuildId: e8ced93cd7d700e184ed309fa9f3c945cd2d3e8a) --- src/framework/mpas_domain_routines.F | 2 ++ src/framework/mpas_framework.F | 5 ++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/framework/mpas_domain_routines.F b/src/framework/mpas_domain_routines.F index 5d6c563cf7..0a4ee8eddf 100644 --- a/src/framework/mpas_domain_routines.F +++ b/src/framework/mpas_domain_routines.F @@ -138,6 +138,8 @@ subroutine mpas_deallocate_domain(dom)!{{{ deallocate(dom % clock) deallocate(dom % ioContext) + deallocate(dom % dminfo) + end subroutine mpas_deallocate_domain!}}} diff --git a/src/framework/mpas_framework.F b/src/framework/mpas_framework.F index 10367a3d9c..3aa4ad7b2f 100644 --- a/src/framework/mpas_framework.F +++ b/src/framework/mpas_framework.F @@ -65,7 +65,6 @@ subroutine mpas_framework_init_phase1(dminfo, external_comm)!{{{ integer, intent(in), optional :: external_comm #endif - allocate(dminfo) call mpas_dmpar_init(dminfo, external_comm) end subroutine mpas_framework_init_phase1!}}} @@ -182,14 +181,14 @@ subroutine mpas_framework_finalize(dminfo, domain, io_system)!{{{ call MPAS_io_finalize(domain % ioContext, .false.) - call mpas_deallocate_domain(domain) - call mpas_dmpar_finalize(dminfo) call mpas_finish_block_proc_list(dminfo) call mpas_timekeeping_finalize() + call mpas_deallocate_domain(domain) + end subroutine mpas_framework_finalize!}}} From af276d249b60f5f0007ebe2787812b578df9e800 Mon Sep 17 00:00:00 2001 From: Dusan Jovic Date: Tue, 5 May 2026 12:06:23 -0400 Subject: [PATCH 08/17] Fix memory leak in mpas_domain_routines.F In `mpas_domain_routines.F` several pool objects which are components of the domain and block structure are allocated explicitly in `mpas_allocate_domain` and `mpas_allocate_block` and then again in `mpas_pool_create_pool` subroutiens called from these two functions. To avoid memory leaks the explicit allocations should be removed. Direct leak of 96 byte(s) in 1 object(s) allocated from: #0 0x7f5ba74ef41f in malloc (/lib64/libasan.so.8+0xef41f) (BuildId: 2a7b18228484f7c17d959b022f3ff6aaaf687b3c) #1 0x00000215d0f0 in __mpas_domain_routines_MOD_mpas_allocate_block /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_domain_routines.F:91 #2 0x000002529bfd in __mpas_block_creator_MOD_mpas_block_creator_finalize_block_phase1 /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_block_creator.F:1017 #3 0x000002158a90 in __mpas_bootstrapping_MOD_mpas_bootstrap_framework_phase1 /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_bootstrapping.F:385 #4 0x00000040c49c in __mpas_subdriver_MOD_mpas_init /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas_subdriver.F:356 #5 0x000000402934 in mpas /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:18 #6 0x0000004029b2 in main /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:10 #7 0x7f5ba6208680 in __libc_start_call_main (/lib64/libc.so.6+0x3680) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #8 0x7f5ba6208797 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3797) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #9 0x000000402844 in _start (/home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/bin/mpas_atmosphere+0x402844) (BuildId: f25761ad95db227da9a5bcfb5c7400f929e4a29e) Direct leak of 96 byte(s) in 1 object(s) allocated from: #0 0x7f5ba74ef41f in malloc (/lib64/libasan.so.8+0xef41f) (BuildId: 2a7b18228484f7c17d959b022f3ff6aaaf687b3c) #1 0x00000215dafc in __mpas_domain_routines_MOD_mpas_allocate_domain /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_domain_routines.F:50 #2 0x00000040908c in __mpas_subdriver_MOD_mpas_init /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas_subdriver.F:194 #3 0x000000402934 in mpas /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:18 #4 0x0000004029b2 in main /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:10 #5 0x7f5ba6208680 in __libc_start_call_main (/lib64/libc.so.6+0x3680) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #6 0x7f5ba6208797 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3797) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #7 0x000000402844 in _start (/home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/bin/mpas_atmosphere+0x402844) (BuildId: f25761ad95db227da9a5bcfb5c7400f929e4a29e) --- src/framework/mpas_domain_routines.F | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/framework/mpas_domain_routines.F b/src/framework/mpas_domain_routines.F index 0a4ee8eddf..f0fb97ed9e 100644 --- a/src/framework/mpas_domain_routines.F +++ b/src/framework/mpas_domain_routines.F @@ -46,10 +46,7 @@ subroutine mpas_allocate_domain(dom)!{{{ allocate(dom % dminfo) nullify(dom % blocklist) - allocate(dom % configs) - allocate(dom % packages) allocate(dom % clock) - allocate(dom % streamManager) allocate(dom % ioContext) call mpas_pool_create_pool(dom % configs) @@ -87,9 +84,6 @@ subroutine mpas_allocate_block(nHaloLayers, b, dom, blockID) !{{{ b % domain => dom - allocate(b % structs) - allocate(b % dimensions) - allocate(b % allFields) call mpas_pool_create_pool(b % structs) call mpas_pool_create_pool(b % dimensions) call mpas_pool_create_pool(b % allFields) From e3ed44654f19dfff64db06fb15b8734a400cbd4b Mon Sep 17 00:00:00 2001 From: Dusan Jovic Date: Wed, 6 May 2026 13:50:15 -0400 Subject: [PATCH 09/17] Fix memory leak in xml_stream_parser In `xml_stream_parser` function there is this block of code: packages = strdup(packagelist); package = strsep(&packages, ";"); ... // more calls to strsep free(packages); Here, `strdup` allocates memory for a copy of `packagelist` and saves a pointer to that memory block in `packages`, which is later used in `free`. However, the `strsep` function modifies that pointer by advancing it through the allocated memory as it parses the string. It eventually returns NULL, which caused free to fail to deallocate memory. Solution is simply to keep a copy of the original pointer and use it to free the allocated memory. Direct leak of 58 byte(s) in 5 object(s) allocated from: #0 0x7fcf6c6e8ac4 in strdup (/lib64/libasan.so.8+0xe8ac4) (BuildId: 2a7b18228484f7c17d959b022f3ff6aaaf687b3c) #1 0x0000024fc518 in xml_stream_parser /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/xml_stream_parser.c:1381 #2 0x00000040c916 in __mpas_subdriver_MOD_mpas_init /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas_subdriver.F:42 #3 0x000000402934 in mpas /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:18 #4 0x0000004029b2 in main /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:10 #5 0x7fcf6b608680 in __libc_start_call_main (/lib64/libc.so.6+0x3680) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #6 0x7fcf6b608797 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3797) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #7 0x000000402844 in _start (/home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/bin/mpas_atmosphere+0x402844) (BuildId: 66ceb08b660eaf75bed2d3da86b4743a3541832e) --- src/framework/xml_stream_parser.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/framework/xml_stream_parser.c b/src/framework/xml_stream_parser.c index 00b22fd009..470cc0fe63 100644 --- a/src/framework/xml_stream_parser.c +++ b/src/framework/xml_stream_parser.c @@ -1057,7 +1057,7 @@ void xml_stream_parser(char *fname, void *manager, int *mpi_comm, int *status) const char *streamID2, *interval_in2, *interval_out2; char interval_name[256]; char match_stream_name[256]; - char *packages, *package; + char *packages, *packages_ptr, *package; char filename_interval_string[256]; char ref_time_local[256]; char rec_intv_local[256]; @@ -1379,6 +1379,7 @@ void xml_stream_parser(char *fname, void *manager, int *mpi_comm, int *status) if (packagelist != NULL) { packages = strdup(packagelist); + packages_ptr = packages; package = strsep(&packages, ";"); stream_mgr_add_pkg_c(manager, streamID, package, &err); @@ -1403,7 +1404,7 @@ void xml_stream_parser(char *fname, void *manager, int *mpi_comm, int *status) } } - free(packages); + free(packages_ptr); } } @@ -1688,6 +1689,7 @@ void xml_stream_parser(char *fname, void *manager, int *mpi_comm, int *status) if (packagelist != NULL) { packages = strdup(packagelist); + packages_ptr = packages; package = strsep(&packages, ";"); stream_mgr_add_pkg_c(manager, streamID, package, &err); @@ -1712,7 +1714,7 @@ void xml_stream_parser(char *fname, void *manager, int *mpi_comm, int *status) } } - free(packages); + free(packages_ptr); } for (varfile_xml = ezxml_child(stream_xml, "file"); varfile_xml; varfile_xml = ezxml_next(varfile_xml)) { From 15d769e321b15bd6cee514bee046217dabe04a61 Mon Sep 17 00:00:00 2001 From: Dusan Jovic Date: Wed, 6 May 2026 14:14:52 -0400 Subject: [PATCH 10/17] Fix memory leak in mpas_io.F These two leaks are similar. In `MPAS_io_inq_dim` new dimlist_type node is allocated (line 594), in `MPAS_io_inq_var` new fieldlist_type node is allocated (line 860). They must be deallocated in `MPAS_io_close` Direct leak of 48 byte(s) in 3 object(s) allocated from: #0 0x7fcf4c0ef41f in malloc (/lib64/libasan.so.8+0xef41f) (BuildId: 2a7b18228484f7c17d959b022f3ff6aaaf687b3c) #1 0x000002472c16 in __mpas_io_MOD_mpas_io_inq_dim /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_io.F:594 #2 0x00000214f5ad in __mpas_bootstrapping_MOD_mpas_bootstrap_framework_phase2 /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_bootstrapping.F:612 #3 0x00000040cdd6 in __mpas_subdriver_MOD_mpas_init /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas_subdriver.F:389 #4 0x000000402934 in mpas /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:18 #5 0x0000004029b2 in main /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:10 #6 0x7fcf4ae08680 in __libc_start_call_main (/lib64/libc.so.6+0x3680) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #7 0x7fcf4ae08797 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3797) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #8 0x000000402844 in _start (/home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/bin/mpas_atmosphere+0x402844) (BuildId: 002a28b14293b75e2eca1ab9aeac8be59516cd63) Direct leak of 32 byte(s) in 2 object(s) allocated from: #0 0x7fcf4c0ef41f in malloc (/lib64/libasan.so.8+0xef41f) (BuildId: 2a7b18228484f7c17d959b022f3ff6aaaf687b3c) #1 0x00000246bba9 in __mpas_io_MOD_mpas_io_inq_var /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_io.F:860 #2 0x000002650ba8 in __mpas_io_streams_MOD_mpas_seekstream /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_io_streams.F:339 #3 0x0000024b2409 in write_stream /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_stream_manager.F:3353 #4 0x0000024b640d in __mpas_stream_manager_MOD_mpas_stream_mgr_write /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_stream_manager.F:2884 #5 0x00000094df25 in __atm_core_MOD_atm_core_run /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/core_atmosphere/mpas_atm_core.F:754 #6 0x000000406341 in __mpas_subdriver_MOD_mpas_run /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas_subdriver.F:416 #7 0x000000402942 in mpas /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:20 #8 0x0000004029b2 in main /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:10 #9 0x7fcf4ae08680 in __libc_start_call_main (/lib64/libc.so.6+0x3680) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #10 0x7fcf4ae08797 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3797) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #11 0x000000402844 in _start (/home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/bin/mpas_atmosphere+0x402844) (BuildId: 002a28b14293b75e2eca1ab9aeac8be59516cd63) --- src/framework/mpas_io.F | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/framework/mpas_io.F b/src/framework/mpas_io.F index fa7e35598c..a96907b7cb 100644 --- a/src/framework/mpas_io.F +++ b/src/framework/mpas_io.F @@ -6344,6 +6344,7 @@ subroutine MPAS_io_close(handle, ierr) deallocate(fieldlist_del % fieldhandle % dims) deallocate(fieldlist_del % fieldhandle) + deallocate(fieldlist_del) end do nullify(handle % fieldlist_head) nullify(handle % fieldlist_tail) @@ -6353,6 +6354,7 @@ subroutine MPAS_io_close(handle, ierr) dimlist_del => dimlist_ptr dimlist_ptr => dimlist_ptr % next deallocate(dimlist_del % dimhandle) + deallocate(dimlist_del) end do nullify(handle % dimlist_head) nullify(handle % dimlist_tail) From 8ddd20f9438290f4a32508b779e6ce828b6ec07c Mon Sep 17 00:00:00 2001 From: Dusan Jovic Date: Wed, 6 May 2026 15:21:42 -0400 Subject: [PATCH 11/17] Fix memory leak in mpas_domain_routines.F In `mpas_dmpar_init_multihalo_exchange_list` subrotine called from mpas_block_creator.F exchList is allocated. The exchLists has halo components, which are also exchLists. These are passed back to mpas_block_creator and are eventually saved into the block's exchange lists: cellsToSend, cellsToRecv, cellsToCopy, edgesToSend, edgesToRecv, verticesToSend, verticesToRecv and verticesToCopy. When these lists are deallocated in `mpas_deallocate_block`, instead of just deallocating exchList pointers, a subroutine `mpas_dmpar_destroy_mulithalo_exchange_list` should be used to properly destroy and deallocate halo subcomponents. Direct leak of 24 byte(s) in 1 object(s) allocated from: #0 0x7fdff4aef41f in malloc (/lib64/libasan.so.8+0xef41f) (BuildId: 2a7b18228484f7c17d959b022f3ff6aaaf687b3c) #1 0x0000022ce9d8 in __mpas_dmpar_MOD_mpas_dmpar_init_multihalo_exchange_list /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_dmpar.F:6466 #2 0x0000025501f4 in __mpas_block_creator_MOD_mpas_block_creator_build_0_and_1halo_edge_fields /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_block_creator.F:334 #3 0x000002156ba9 in __mpas_bootstrapping_MOD_mpas_bootstrap_framework_phase1 /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_bootstrapping.F:266 #4 0x00000040c49c in __mpas_subdriver_MOD_mpas_init /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas_subdriver.F:356 #5 0x000000402934 in mpas /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:18 #6 0x0000004029b2 in main /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:10 #7 0x7fdff3808680 in __libc_start_call_main (/lib64/libc.so.6+0x3680) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #8 0x7fdff3808797 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3797) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #9 0x000000402844 in _start (/home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/bin/mpas_atmosphere+0x402844) (BuildId: 94eaf12a29734d8a2ed692e6fb9b037dcf35135f) --- src/framework/mpas_domain_routines.F | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/framework/mpas_domain_routines.F b/src/framework/mpas_domain_routines.F index f0fb97ed9e..7d2c289c12 100644 --- a/src/framework/mpas_domain_routines.F +++ b/src/framework/mpas_domain_routines.F @@ -163,17 +163,17 @@ subroutine mpas_deallocate_block(b)!{{{ call mpas_pool_destroy_pool(b % structs) call mpas_pool_destroy_pool(b % dimensions) - deallocate(b % parinfo % cellsToSend) - deallocate(b % parinfo % cellsToRecv) - deallocate(b % parinfo % cellsToCopy) + call mpas_dmpar_destroy_mulithalo_exchange_list(b % parinfo % cellsToSend) + call mpas_dmpar_destroy_mulithalo_exchange_list(b % parinfo % cellsToRecv) + call mpas_dmpar_destroy_mulithalo_exchange_list(b % parinfo % cellsToCopy) - deallocate(b % parinfo % edgesToSend) - deallocate(b % parinfo % edgesToRecv) - deallocate(b % parinfo % edgesToCopy) + call mpas_dmpar_destroy_mulithalo_exchange_list(b % parinfo % edgesToSend) + call mpas_dmpar_destroy_mulithalo_exchange_list(b % parinfo % edgesToRecv) + call mpas_dmpar_destroy_mulithalo_exchange_list(b % parinfo % edgesToCopy) - deallocate(b % parinfo % verticesToSend) - deallocate(b % parinfo % verticesToRecv) - deallocate(b % parinfo % verticesToCopy) + call mpas_dmpar_destroy_mulithalo_exchange_list(b % parinfo % verticesToSend) + call mpas_dmpar_destroy_mulithalo_exchange_list(b % parinfo % verticesToRecv) + call mpas_dmpar_destroy_mulithalo_exchange_list(b % parinfo % verticesToCopy) deallocate(b % parinfo) From 30ef8827b80c0c7dfe9739c60bd82b4649a5b077 Mon Sep 17 00:00:00 2001 From: Dusan Jovic Date: Wed, 6 May 2026 16:43:05 -0400 Subject: [PATCH 12/17] Fix memory leak in mpas_pool_routines.F In `mpas_pool_add_package` subroutine which adds a package to a pool, after the new pool member is allocated, the data subcomponent is allocated, which also allocates the logical value `simple_logical`. That value must be deallocated before the data pointer (dptr) is deallocated in `mpas_pool_destroy_pool`. Direct leak of 20 byte(s) in 5 object(s) allocated from: #0 0x7f85b0cef41f in malloc (/lib64/libasan.so.8+0xef41f) (BuildId: 2a7b18228484f7c17d959b022f3ff6aaaf687b3c) #1 0x0000021bfb89 in __mpas_pool_routines_MOD_mpas_pool_add_package /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_pool_routines.F:5207 #2 0x0000024baa91 in __mpas_stream_manager_MOD_mpas_stream_mgr_add_pkg /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_stream_manager.F:2297 #3 0x0000024d68ba in stream_mgr_add_pkg_c /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_stream_manager.F:6321 #4 0x0000024fbede in xml_stream_parser /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/xml_stream_parser.c:1385 #5 0x00000040c916 in __mpas_subdriver_MOD_mpas_init /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas_subdriver.F:42 #6 0x000000402934 in mpas /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:18 #7 0x0000004029b2 in main /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:10 #8 0x7f85afc08680 in __libc_start_call_main (/lib64/libc.so.6+0x3680) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #9 0x7f85afc08797 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3797) (BuildId: f83cdcaffde35587075ea80e05bcb894963a4bdd) #10 0x000000402844 in _start (/home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/bin/mpas_atmosphere+0x402844) (BuildId: bec3816af189fbcb144ed6ff0cbaef36c9dc9016) --- src/framework/mpas_pool_routines.F | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/framework/mpas_pool_routines.F b/src/framework/mpas_pool_routines.F index 4f57211deb..ad7df945b3 100644 --- a/src/framework/mpas_pool_routines.F +++ b/src/framework/mpas_pool_routines.F @@ -229,6 +229,14 @@ recursive subroutine mpas_pool_destroy_pool(inPool)!{{{ deallocate(ptr % data % simple_int) end if + else if (ptr % contentsType == MPAS_POOL_PACKAGE) then + + dptr => ptr % data + + if (dptr % contentsType == MPAS_POOL_LOGICAL) then + deallocate(dptr % simple_logical) + end if + else if (ptr % contentsType == MPAS_POOL_CONFIG) then dptr => ptr % data From 613bd0f178ea2bc8a0a52494fd47cae69f480c28 Mon Sep 17 00:00:00 2001 From: Dusan Jovic Date: Wed, 6 May 2026 16:55:13 -0400 Subject: [PATCH 13/17] Fix memory leak in mpas_block_creator.F In `mpas_block_creator_build_0halo_cell_fields` local array `sendingHaloLayers` must be deallocated before this subrotine returns Direct leak of 4 byte(s) in 1 object(s) allocated from: #0 0x7fb58d2ef41f in malloc (/lib64/libasan.so.8+0xef41f) (BuildId: 2a7b18228484f7c17d959b022f3ff6aaaf687b3c) #1 0x0000025538dc in __mpas_block_creator_MOD_mpas_block_creator_build_0halo_cell_fields /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_block_creator.F:160 #2 0x000002156b05 in __mpas_bootstrapping_MOD_mpas_bootstrap_framework_phase1 /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_bootstrapping.F:259 #3 0x00000040c49c in __mpas_subdriver_MOD_mpas_init /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas_subdriver.F:356 #4 0x000000402934 in mpas /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:18 #5 0x0000004029b2 in main /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:10 #6 0x7fb58c008680 in __libc_start_call_main (/lib64/libc.so.6+0x3680) (BuildId: 79bea8ccf296ed42137a854a0cb75020bb783545) #7 0x7fb58c008797 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3797) (BuildId: 79bea8ccf296ed42137a854a0cb75020bb783545) #8 0x000000402844 in _start (/home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/bin/mpas_atmosphere+0x402844) (BuildId: 62d0976668433575208c249f3d706b6b133aa425) --- src/framework/mpas_block_creator.F | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/framework/mpas_block_creator.F b/src/framework/mpas_block_creator.F index e9fea7253f..73b45fe8de 100644 --- a/src/framework/mpas_block_creator.F +++ b/src/framework/mpas_block_creator.F @@ -249,6 +249,8 @@ subroutine mpas_block_creator_build_0halo_cell_fields(nHalos, indexToCellIDBlock call mpas_dmpar_alltoall_field(cellsOnCellBlock, cellsOnCell_0Halo, sendingHaloLayers) call mpas_dmpar_alltoall_field(verticesOnCellBlock, verticesOnCell_0Halo, sendingHaloLayers) call mpas_dmpar_alltoall_field(edgesOnCellBlock, edgesOnCell_0Halo, sendingHaloLayers) + + deallocate(sendingHaloLayers) end subroutine mpas_block_creator_build_0halo_cell_fields!}}} !*********************************************************************** From ae45a181d9ca6657ea0728b5516a635dd96d334a Mon Sep 17 00:00:00 2001 From: Dusan Jovic Date: Wed, 6 May 2026 17:35:07 -0400 Subject: [PATCH 14/17] Fix memory leak in block_dimension_routines.inc In `atm_setup_derived_dimensions` subroutine dimension values are allocated locally if they are not already in a dimensionPool, and they must be deleted after being added to the dimensionPool. Since this is a generated routine, the changes must be made in src/tools/registry/gen_inc.c Direct leak of 4 byte(s) in 1 object(s) allocated from: #0 0x7fa3a06ef41f in malloc (/lib64/libasan.so.8+0xef41f) (BuildId: 2a7b18228484f7c17d959b022f3ff6aaaf687b3c) #1 0x0000008e638a in __atm_core_interface_MOD_atm_setup_derived_dimensions /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/src/core_atmosphere/block_dimension_routines.inc:171 #2 0x00000251c432 in __mpas_block_creator_MOD_mpas_block_creator_finalize_block_phase2 /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_block_creator.F:1275 #3 0x000002151669 in __mpas_bootstrapping_MOD_mpas_bootstrap_framework_phase2 /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_bootstrapping.F:675 #4 0x00000040cdd6 in __mpas_subdriver_MOD_mpas_init /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas_subdriver.F:389 #5 0x000000402934 in mpas /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:18 #6 0x0000004029b2 in main /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:10 #7 0x7fa39f608680 in __libc_start_call_main (/lib64/libc.so.6+0x3680) (BuildId: 79bea8ccf296ed42137a854a0cb75020bb783545) #8 0x7fa39f608797 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3797) (BuildId: 79bea8ccf296ed42137a854a0cb75020bb783545) #9 0x000000402844 in _start (/home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/bin/mpas_atmosphere+0x402844) (BuildId: 66c1f6616f19ebcc31fb59115fab767050354512) --- src/tools/registry/gen_inc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tools/registry/gen_inc.c b/src/tools/registry/gen_inc.c index 5ec8b06d18..078a4d399a 100644 --- a/src/tools/registry/gen_inc.c +++ b/src/tools/registry/gen_inc.c @@ -1086,6 +1086,7 @@ int parse_dimensions_from_registry(ezxml_t registry)/*{{{*/ } fortprintf(fd, " call mpas_pool_add_dimension(dimensionPool, '%s', %s)\n", dimname, dimname); + fortprintf(fd, " deallocate(%s)\n", dimname); fortprintf(fd, " else if ( %s == MPAS_MISSING_DIM ) then\n", dimname, dimname); // Namelist defined dimension if(strncmp(dimdef, "namelist:", 9) == 0){ @@ -1101,6 +1102,7 @@ int parse_dimensions_from_registry(ezxml_t registry)/*{{{*/ fortprintf(fd, " allocate(%s)\n", dimname); fortprintf(fd, " %s = MPAS_MISSING_DIM\n", dimname); fortprintf(fd, " call mpas_pool_add_dimension(dimensionPool, '%s', %s)\n", dimname, dimname); + fortprintf(fd, " deallocate(%s)\n", dimname); fortprintf(fd, " end if\n\n"); } } From 3bc0c4e3229a9349f4e12f5cec20ffde0eab1882 Mon Sep 17 00:00:00 2001 From: Dusan Jovic Date: Wed, 6 May 2026 18:13:30 -0400 Subject: [PATCH 15/17] Fix memory leak in mpas_io.F In `MPAS_io_init` it is not necessary to allocate `ioContext % smiol_context`, it will be allocated in `SMIOLf_init` Direct leak of 28 byte(s) in 1 object(s) allocated from: #0 0x7f6c6e4ef41f in malloc (/lib64/libasan.so.8+0xef41f) (BuildId: 2a7b18228484f7c17d959b022f3ff6aaaf687b3c) #1 0x00000242e24c in __mpas_io_MOD_mpas_io_init /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_io.F:213 #2 0x00000236bff6 in __mpas_framework_MOD_mpas_framework_init_phase2 /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/framework/mpas_framework.F:155 #3 0x000000408f59 in __mpas_subdriver_MOD_mpas_init /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas_subdriver.F:257 #4 0x000000401fb4 in mpas /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:18 #5 0x000000402032 in main /home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/src/driver/mpas.F:10 #6 0x7f6c6d408680 in __libc_start_call_main (/lib64/libc.so.6+0x3680) (BuildId: 79bea8ccf296ed42137a854a0cb75020bb783545) #7 0x7f6c6d408797 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x3797) (BuildId: 79bea8ccf296ed42137a854a0cb75020bb783545) #8 0x000000401ec4 in _start (/home/dusan/sufs/simple-mpas/src/MPAS-Model-develop/build/bin/mpas_atmosphere+0x401ec4) (BuildId: 4e38fd7d901cf1506c34e3522552d885e5afaebd) --- src/framework/mpas_io.F | 1 - 1 file changed, 1 deletion(-) diff --git a/src/framework/mpas_io.F b/src/framework/mpas_io.F index a96907b7cb..724e71b802 100644 --- a/src/framework/mpas_io.F +++ b/src/framework/mpas_io.F @@ -210,7 +210,6 @@ subroutine MPAS_io_init(ioContext, io_task_count, io_task_stride, io_system, ier #endif #ifdef MPAS_SMIOL_SUPPORT - allocate(ioContext % smiol_context) #ifdef MPAS_USE_MPI_F08 local_ierr = SMIOLf_init(ioContext % dminfo % comm % mpi_val, & #else From 7d0cbee3e56bbf8d5c5ed9ee1674d33ef1020998 Mon Sep 17 00:00:00 2001 From: Michael Duda Date: Thu, 7 May 2026 17:48:50 -0600 Subject: [PATCH 16/17] Provide default initialization for members of the met_data derived type This commit adds default initialization for the members of the met_data derived type in the init_atm_read_met module. Without well-defined values for some members, unpredictable floating-point exceptions were possible, e.g., Program received signal SIGFPE: Floating-point exception - erroneous arithmetic operation. Backtrace for this error: #0 0x15494ec288ff in ??? #1 0x59ddc0 in __init_atm_read_met_MOD_read_next_met_field at src/core_init_atmosphere/mpas_init_atm_read_met.F:388 #2 0x4ccb7a in __init_atm_cases_MOD_init_atm_case_lbc at src/core_init_atmosphere/mpas_init_atm_cases.F:6218 #3 0x58a373 in __init_atm_cases_MOD_init_atm_setup_case at src/core_init_atmosphere/mpas_init_atm_cases.F:327 #4 0x497807 in __init_atm_core_MOD_init_atm_core_run at src/core_init_atmosphere/mpas_init_atm_core.F:92 #5 0x406084 in __mpas_subdriver_MOD_mpas_run at src/driver/mpas_subdriver.F:416 #6 0x4046da in mpas at src/driver/mpas.F:20 #7 0x404745 in main at src/driver/mpas.F:10 By initializing the members of the met_data type, these unpredictable errors can be avoided. --- .../mpas_init_atm_read_met.F | 42 ++++++++++++++----- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/src/core_init_atmosphere/mpas_init_atm_read_met.F b/src/core_init_atmosphere/mpas_init_atm_read_met.F index 69c662766b..7b46c37d49 100644 --- a/src/core_init_atmosphere/mpas_init_atm_read_met.F +++ b/src/core_init_atmosphere/mpas_init_atm_read_met.F @@ -25,17 +25,37 @@ module init_atm_read_met ! Derived types type met_data - integer :: version, nx, ny, iproj - real (kind=real32) :: xfcst, xlvl, startlat, startlon, starti, startj, & - deltalat, deltalon, dx, dy, xlonc, & - truelat1, truelat2, earth_radius - real (kind=real32), pointer, dimension(:,:) :: slab - logical :: is_wind_grid_rel - character (len=9) :: field - character (len=24) :: hdate - character (len=25) :: units - character (len=32) :: map_source - character (len=46) :: desc + integer :: version = 5, & ! Format version (must =5 for WPS format) + nx = 0, & ! First (x) dimension of 2-d array 'slab' + ny = 0, & ! Second (y) dimension of 2-d array 'slab' + iproj = PROJ_LATLON ! Code for projection of data in array + + real (kind=real32) :: xfcst = 0.0_real32, & ! Forecast hour of data + xlvl = 0.0_real32, & ! Vertical level of data in 2-d array 'slab' + startlat = 0.0_real32, & ! Latitude of starting point (degrees) + startlon = 0.0_real32, & ! Longitude of starting point (degrees) + starti = 1.0_real32, & ! Starting x-/i-index + startj = 1.0_real32, & ! Starting y-/j-index + deltalat = 0.0_real32, & ! Grid spacing (degrees) in meridional direction + deltalon = 0.0_real32, & ! Grid spacing (degrees) in zonal direction + dx = 0.0_real32, & ! Grid spacing (km) in x-direction + dy = 0.0_real32, & ! Grid spacing (km) in y-direction + xlonc = 0.0_real32, & ! Standard longitude of projection + truelat1 = 0.0_real32, & ! First true latitude of projection + truelat2 = 0.0_real32, & ! Second true latitude of projection + earth_radius = EARTH_RADIUS_M / 1000.0_real32 ! Earth radius (km) + + real (kind=real32), pointer, dimension(:,:) :: slab => null() ! 2-d array of data + + logical :: is_wind_grid_rel = .false. ! Flag indicating whether winds are + ! relative to source grid (.true.) or + ! relative to earth (.false.) + + character (len=9) :: field = '' ! Name of the field + character (len=24) :: hdate = '' ! Valid date for data YYYY:MM:DD_HH:mm:ss + character (len=25) :: units = '' ! Units of data + character (len=32) :: map_source = '' ! Source model / originating center + character (len=46) :: desc = '' ! Short description of data end type met_data From e4e63de0aa0a76abda1e503ada7626c0960e5467 Mon Sep 17 00:00:00 2001 From: Marcos Longo Date: Tue, 26 May 2026 08:21:30 -0300 Subject: [PATCH 17/17] This commit mirrors a similar commit in MONAN. It fixes a cryptic bug that only occurs when the code is modified to run with more than four soil layers. The logic in mpas_atmphys_driver_lsm_noahmp.F can be simplified to a single loop that will always work. Likewise, Registry_noahmp.xml does not need to have the combined number of soil plus snow levels (nzSoilLevels) hardcoded, it can be written as the sum of the levels so it always works. --- src/core_atmosphere/physics/Registry_noahmp.xml | 2 +- .../physics/mpas_atmphys_driver_lsm_noahmp.F | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/core_atmosphere/physics/Registry_noahmp.xml b/src/core_atmosphere/physics/Registry_noahmp.xml index 89d980f724..ec4c7b030a 100644 --- a/src/core_atmosphere/physics/Registry_noahmp.xml +++ b/src/core_atmosphere/physics/Registry_noahmp.xml @@ -16,7 +16,7 @@ - diff --git a/src/core_atmosphere/physics/mpas_atmphys_driver_lsm_noahmp.F b/src/core_atmosphere/physics/mpas_atmphys_driver_lsm_noahmp.F index 7b93e7cf62..e2eb8a8c55 100644 --- a/src/core_atmosphere/physics/mpas_atmphys_driver_lsm_noahmp.F +++ b/src/core_atmosphere/physics/mpas_atmphys_driver_lsm_noahmp.F @@ -842,14 +842,10 @@ subroutine lsm_noahmp_toMPAS(diag_physics,diag_physics_noahmp,output_noahmp,sfc_ snicexy(ns,i) = mpas_noahmp%snicexy(i,n) snliqxy(ns,i) = mpas_noahmp%snliqxy(i,n) enddo - do ns = 1,nsnow + do ns = 1,nzsnow n = ns - nsnow zsnsoxy(ns,i) = mpas_noahmp%zsnsoxy(i,n) enddo - do ns = nsnow+1,nzsnow - n = ns - nsoil + 1 - zsnsoxy(ns,i) = mpas_noahmp%zsnsoxy(i,n) - enddo enddo