From fd4c31434c9a55e5b87e33aa6bf788a30dd0b77b Mon Sep 17 00:00:00 2001 From: SVS87 Date: Mon, 1 Jun 2026 03:16:41 -0400 Subject: [PATCH 1/9] fix: add missing @:DEALLOCATE in simulation modules Add matching @:DEALLOCATE calls in: - m_derived_variables - m_global_parameters - m_hyperelastic - m_rhs - m_riemann_solvers - m_time_steppers Remaining files not yet addressed: - src/common/m_boundary_common.fpp, m_helper.fpp, m_model.fpp, m_mpi_common.fpp, m_variables_conversion.fpp - src/post_process/m_start_up.fpp - src/simulation/m_acoustic_src.fpp, m_bubbles_EE.fpp, m_ibm.fpp (pending PR #1378), m_qbmm.fpp Part of #1459 --- src/simulation/m_derived_variables.fpp | 20 +++++++++++--------- src/simulation/m_global_parameters.fpp | 1 + src/simulation/m_hyperelastic.fpp | 1 + src/simulation/m_rhs.fpp | 23 +++++++++++++++++++++-- src/simulation/m_riemann_solvers.fpp | 4 ++++ src/simulation/m_time_steppers.fpp | 23 +++++++++++++++++++++++ 6 files changed, 61 insertions(+), 11 deletions(-) diff --git a/src/simulation/m_derived_variables.fpp b/src/simulation/m_derived_variables.fpp index 22c0477065..4efd5774fb 100644 --- a/src/simulation/m_derived_variables.fpp +++ b/src/simulation/m_derived_variables.fpp @@ -518,21 +518,23 @@ contains end if if (probe_wrt) then - deallocate (accel_mag, x_accel) + @:DEALLOCATE(accel_mag) + @:DEALLOCATE(x_accel) if (n > 0) then - deallocate (y_accel) + @:DEALLOCATE(y_accel) if (p > 0) then - deallocate (z_accel) + @:DEALLOCATE(z_accel) end if end if + @:DEALLOCATE(fd_coeff_x) + if (n > 0) then + @:DEALLOCATE(fd_coeff_y) + end if + if (p > 0) then + @:DEALLOCATE(fd_coeff_z) + end if end if - ! Deallocating the variables that might have been used to bookkeep the finite-difference coefficients in the x-, y- and - ! z-directions - if (allocated(fd_coeff_x)) deallocate (fd_coeff_x) - if (allocated(fd_coeff_y)) deallocate (fd_coeff_y) - if (allocated(fd_coeff_z)) deallocate (fd_coeff_z) - end subroutine s_finalize_derived_variables_module end module m_derived_variables diff --git a/src/simulation/m_global_parameters.fpp b/src/simulation/m_global_parameters.fpp index 8d8cebda28..478bba793a 100644 --- a/src/simulation/m_global_parameters.fpp +++ b/src/simulation/m_global_parameters.fpp @@ -933,6 +933,7 @@ contains @:DEALLOCATE(fluid_inv_re) if (bubbles_euler) then + @:DEALLOCATE(ptil) @:DEALLOCATE(qbmm_idx%rs, qbmm_idx%vs, qbmm_idx%ps, qbmm_idx%ms) if (qbmm) then @:DEALLOCATE(qbmm_idx%moms) diff --git a/src/simulation/m_hyperelastic.fpp b/src/simulation/m_hyperelastic.fpp index 90e78d04df..e0017a3685 100644 --- a/src/simulation/m_hyperelastic.fpp +++ b/src/simulation/m_hyperelastic.fpp @@ -256,6 +256,7 @@ contains do i = 1, b_size @:DEALLOCATE(btensor%vf(i)%sf) end do + @:DEALLOCATE(Gs_hyper) @:DEALLOCATE(fd_coeff_x_hyper) if (n > 0) then @:DEALLOCATE(fd_coeff_y_hyper) diff --git a/src/simulation/m_rhs.fpp b/src/simulation/m_rhs.fpp index 1e30f135be..289b9d39b5 100644 --- a/src/simulation/m_rhs.fpp +++ b/src/simulation/m_rhs.fpp @@ -1796,8 +1796,7 @@ contains end if if (mpp_lim .and. bubbles_euler) then - $:GPU_EXIT_DATA(delete='[alf_sum%sf]') - deallocate (alf_sum%sf) + @:DEALLOCATE(alf_sum%sf) end if if (.not. igr) then @@ -1841,6 +1840,26 @@ contains end do @:DEALLOCATE(flux_n, flux_src_n, flux_gsrc_n) + @:DEALLOCATE(qL_prim) + @:DEALLOCATE(qR_prim) + end if + + if (alt_soundspeed) then + @:DEALLOCATE(blkmod1) + end if + + if (qbmm) then + do i = 0, 2 + do j = 0, 2 + do l = 1, nb + @:DEALLOCATE(mom_3d(i, j, l)%sf) + end do + end do + end do + do i = 1, nmomsp + @:DEALLOCATE(mom_sp(i)%sf) + end do + @:DEALLOCATE(mom_sp, mom_3d) end if end subroutine s_finalize_rhs_module diff --git a/src/simulation/m_riemann_solvers.fpp b/src/simulation/m_riemann_solvers.fpp index 467769dc0c..d2281c5c83 100644 --- a/src/simulation/m_riemann_solvers.fpp +++ b/src/simulation/m_riemann_solvers.fpp @@ -110,6 +110,10 @@ contains if (qbmm) then @:DEALLOCATE(mom_sp_rsx_vf) end if + @:DEALLOCATE(Gs_rs) + if (viscous) then + @:DEALLOCATE(Res_gs) + end if end subroutine s_finalize_riemann_solvers_module diff --git a/src/simulation/m_time_steppers.fpp b/src/simulation/m_time_steppers.fpp index 97d536c00c..cbecf229f1 100644 --- a/src/simulation/m_time_steppers.fpp +++ b/src/simulation/m_time_steppers.fpp @@ -977,6 +977,29 @@ contains call s_close_run_time_information_file() end if + if (chemistry) then + @:DEALLOCATE(q_T_sf%sf) + end if + @:DEALLOCATE(pb_ts(1)%sf) + @:DEALLOCATE(pb_ts(2)%sf) + @:DEALLOCATE(rhs_pb) + @:DEALLOCATE(pb_ts) + @:DEALLOCATE(mv_ts(1)%sf) + @:DEALLOCATE(mv_ts(2)%sf) + @:DEALLOCATE(rhs_mv) + @:DEALLOCATE(mv_ts) + if (cfl_dt) then + @:DEALLOCATE(max_dt) + end if + do i = 1, num_dims + @:DEALLOCATE(bc_type(i,1)%sf) + @:DEALLOCATE(bc_type(i,2)%sf) + end do + @:DEALLOCATE(bc_type) + if (any(time_stepper == (/1, 2, 3/))) then + @:DEALLOCATE(rk_coef) + end if + end subroutine s_finalize_time_steppers_module end module m_time_steppers From 5255b3cbabbe648fd05294695fa72e70982ab99e Mon Sep 17 00:00:00 2001 From: SVS87 Date: Sun, 14 Jun 2026 23:13:50 -0400 Subject: [PATCH 2/9] fix: address remaining files in deallocate audit - m_rhs: fix incomplete qL_prim/qR_prim teardown by walking nested %vf/%sf structure before deallocating containers - m_boundary_common: replace plain deallocate with @:DEALLOCATE - m_mpi_common: replace plain deallocate with @:DEALLOCATE, mirror unified memory path in finalization - m_variables_conversion: add missing @:DEALLOCATE for Res_vc - m_start_up (post_process): annotate FFT arrays as program-lifetime - m_helper, m_model, m_acoustic_src, m_bubbles_EE, m_qbmm: annotate allocations as program-lifetime (no finalize subroutine) Part of #1459 --- src/common/m_boundary_common.fpp | 15 +++++++-------- src/common/m_helper.fpp | 2 ++ src/common/m_model.fpp | 3 +++ src/common/m_mpi_common.fpp | 5 +++++ src/common/m_variables_conversion.fpp | 3 +++ src/post_process/m_start_up.fpp | 4 ++++ src/simulation/m_acoustic_src.fpp | 4 ++++ src/simulation/m_bubbles_EE.fpp | 3 +++ src/simulation/m_qbmm.fpp | 2 ++ src/simulation/m_rhs.fpp | 10 ++++++++-- 10 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/common/m_boundary_common.fpp b/src/common/m_boundary_common.fpp index 575e2fa1fb..8689680370 100644 --- a/src/common/m_boundary_common.fpp +++ b/src/common/m_boundary_common.fpp @@ -171,23 +171,22 @@ contains subroutine s_finalize_boundary_common_module() if (bc_io) then - deallocate (bc_buffers(1, 1)%sf) - deallocate (bc_buffers(1, 2)%sf) + @:DEALLOCATE(bc_buffers(1, 1)%sf) + @:DEALLOCATE(bc_buffers(1, 2)%sf) #:if not MFC_CASE_OPTIMIZATION or num_dims > 1 if (n > 0) then - deallocate (bc_buffers(2, 1)%sf) - deallocate (bc_buffers(2, 2)%sf) + @:DEALLOCATE(bc_buffers(2, 1)%sf) + @:DEALLOCATE(bc_buffers(2, 2)%sf) #:if not MFC_CASE_OPTIMIZATION or num_dims > 2 if (p > 0) then - deallocate (bc_buffers(3, 1)%sf) - deallocate (bc_buffers(3, 2)%sf) + @:DEALLOCATE(bc_buffers(3, 1)%sf) + @:DEALLOCATE(bc_buffers(3, 2)%sf) end if #:endif end if #:endif end if - - deallocate (bc_buffers) + @:DEALLOCATE(bc_buffers) end subroutine s_finalize_boundary_common_module diff --git a/src/common/m_helper.fpp b/src/common/m_helper.fpp index 6bd9718dbb..4765cdb903 100644 --- a/src/common/m_helper.fpp +++ b/src/common/m_helper.fpp @@ -86,6 +86,8 @@ contains impure subroutine s_initialize_bubbles_model() ! Allocate memory + ! NOTE: weight, pb0, Re_trans_T are program-lifetime allocations; + ! no s_finalize_bubbles_model or s_finalize_* subroutine exists for this module. if (bubbles_euler) then @:ALLOCATE(weight(nb), R0(nb)) if (.not. polytropic) then diff --git a/src/common/m_model.fpp b/src/common/m_model.fpp index 5341a82ffa..545d4b9e96 100644 --- a/src/common/m_model.fpp +++ b/src/common/m_model.fpp @@ -970,6 +970,9 @@ contains end if end do + ! NOTE: gpu_ntrs, gpu_trs_v, gpu_trs_n, gpu_boundary_edge_count, gpu_total_vertices, gpu_boundary_v are program-lifetime + ! allocations; + ! no s_finalize_* subroutine exists for this module. if (max_ntrs > 0) then @:ALLOCATE(gpu_ntrs(1:num_stl_models)) @:ALLOCATE(gpu_trs_v(1:3, 1:3, 1:max_ntrs, 1:num_stl_models)) diff --git a/src/common/m_mpi_common.fpp b/src/common/m_mpi_common.fpp index b509e1f6ea..cd889145c6 100644 --- a/src/common/m_mpi_common.fpp +++ b/src/common/m_mpi_common.fpp @@ -1509,7 +1509,12 @@ contains impure subroutine s_finalize_mpi_common_module #ifdef MFC_MPI +#ifndef __NVCOMPILER_GPU_UNIFIED_MEM + @:DEALLOCATE(buff_send, buff_recv) +#else + $:GPU_EXIT_DATA(delete='[buff_send, buff_recv]') deallocate (buff_send, buff_recv) +#endif #endif end subroutine s_finalize_mpi_common_module diff --git a/src/common/m_variables_conversion.fpp b/src/common/m_variables_conversion.fpp index db7f80faf2..fe17b89c27 100644 --- a/src/common/m_variables_conversion.fpp +++ b/src/common/m_variables_conversion.fpp @@ -1237,6 +1237,9 @@ contains if (bubbles_euler) then @:DEALLOCATE(bubrs_vc) end if + if (viscous) then + @:DEALLOCATE(Res_vc) + end if #else @:DEALLOCATE(gammas, gs_min, pi_infs, ps_inf, cvs, qvs, qvps, Gs_vc) if (bubbles_euler) then diff --git a/src/post_process/m_start_up.fpp b/src/post_process/m_start_up.fpp index 7284190160..fe1588e5b3 100644 --- a/src/post_process/m_start_up.fpp +++ b/src/post_process/m_start_up.fpp @@ -875,6 +875,10 @@ contains Nf = max(Nx, Ny, Nz) + ! NOTE: data_in, data_out, data_cmplx, data_cmplx_y, data_cmplx_z, + ! En_real, En are program-lifetime allocations; no s_finalize_start_up_module exists. + + @:ALLOCATE(data_in(Nx*Nyloc*Nzloc)) @:ALLOCATE(data_in(Nx*Nyloc*Nzloc)) @:ALLOCATE(data_out(Nx*Nyloc*Nzloc)) diff --git a/src/simulation/m_acoustic_src.fpp b/src/simulation/m_acoustic_src.fpp index f007136f70..34552f9c1a 100644 --- a/src/simulation/m_acoustic_src.fpp +++ b/src/simulation/m_acoustic_src.fpp @@ -64,6 +64,10 @@ contains integer :: i, j !< generic loop variables + ! NOTE: loc_acoustic, mass_src, mom_src, E_src, source_spatials, source_spatials_num_points are program-lifetime + ! allocations; + ! no s_finalize_acoustic_src subroutine exists for this module. + @:ALLOCATE(loc_acoustic(1:3, 1:num_source), mag(1:num_source), dipole(1:num_source), support(1:num_source), & & length(1:num_source), height(1:num_source), wavelength(1:num_source), frequency(1:num_source), & & gauss_sigma_dist(1:num_source), gauss_sigma_time(1:num_source), foc_length(1:num_source), & diff --git a/src/simulation/m_bubbles_EE.fpp b/src/simulation/m_bubbles_EE.fpp index a15156405b..2d02584b57 100644 --- a/src/simulation/m_bubbles_EE.fpp +++ b/src/simulation/m_bubbles_EE.fpp @@ -32,6 +32,9 @@ contains integer :: l + ! NOTE: rs, vs, ps, ms, divu%sf, bub_adv_src, bub_r_src, bub_v_src, bub_p_src, bub_m_src are program-lifetime allocations; + ! no s_finalize_bubbles_EE_module subroutine exists. + @:ALLOCATE(rs(1:nb)) @:ALLOCATE(vs(1:nb)) @:ALLOCATE(ps(1:nb)) diff --git a/src/simulation/m_qbmm.fpp b/src/simulation/m_qbmm.fpp index abb77a1f35..c89f8a5cc9 100644 --- a/src/simulation/m_qbmm.fpp +++ b/src/simulation/m_qbmm.fpp @@ -56,6 +56,7 @@ contains $:GPU_UPDATE(device='[nterms]') #:endif + ! NOTE: momrhs is a program-lifetime allocation; no s_finalize_* subroutine exists for this module. @:ALLOCATE(momrhs(1:3, 0:2, 0:2, 1:nterms, 1:nb)) momrhs = 0._wp @@ -383,6 +384,7 @@ contains $:GPU_UPDATE(device='[momrhs]') + ! NOTE: bubmoms is a program-lifetime allocation; no s_finalize_* subroutine exists for this module. @:ALLOCATE(bubmoms(1:nb, 1:nmom)) do j = 1, nmom diff --git a/src/simulation/m_rhs.fpp b/src/simulation/m_rhs.fpp index 289b9d39b5..9c9dfc4609 100644 --- a/src/simulation/m_rhs.fpp +++ b/src/simulation/m_rhs.fpp @@ -1840,8 +1840,14 @@ contains end do @:DEALLOCATE(flux_n, flux_src_n, flux_gsrc_n) - @:DEALLOCATE(qL_prim) - @:DEALLOCATE(qR_prim) + do i = 1, num_dims + do l = eqn_idx%mom%beg, eqn_idx%mom%end + @:DEALLOCATE(qL_prim(i)%vf(l)%sf) + @:DEALLOCATE(qR_prim(i)%vf(l)%sf) + end do + @:DEALLOCATE(qL_prim(i)%vf, qR_prim(i)%vf) + end do + @:DEALLOCATE(qL_prim, qR_prim) end if if (alt_soundspeed) then From 9c819d45f5ceb9eb31306b23d3eaf5321023e0d6 Mon Sep 17 00:00:00 2001 From: SVS87 Date: Mon, 15 Jun 2026 00:54:06 -0400 Subject: [PATCH 3/9] fix: complete deallocate audit for m_ibm and add lint check - m_ibm: add @:DEALLOCATE for ghost_points, simplify models deallocation, replace plain deallocate for recv_* arrays - lint_source.py: add check_allocate_deallocate_pairing() to flag @:ALLOCATE without matching @:DEALLOCATE anywhere in src/ Known program-lifetime exemptions are listed explicitly Closes #1459 --- src/simulation/m_ibm.fpp | 14 ++-- toolchain/mfc/lint_source.py | 136 +++++++++++++++++++++++++++++++++++ 2 files changed, 141 insertions(+), 9 deletions(-) diff --git a/src/simulation/m_ibm.fpp b/src/simulation/m_ibm.fpp index 99aeb1e382..cf4a2a7859 100644 --- a/src/simulation/m_ibm.fpp +++ b/src/simulation/m_ibm.fpp @@ -1542,21 +1542,17 @@ contains @:DEALLOCATE(ib_airfoil_grids(i)%lower) end if end do - if (allocated(models)) then - if (size(models) > 0) then - @:DEALLOCATE(models) - else - deallocate (models) - end if + @:DEALLOCATE(models) + end if + if (allocated(ghost_points)) then + @:DEALLOCATE(ghost_points) end if - if (collision_model > 0) call s_finalize_collisions_module() - #ifdef MFC_MPI if (num_procs > 1) then @:DEALLOCATE(send_ids, send_ft) - deallocate (recv_forces_snap, recv_torques_snap, recv_ids, recv_ft) + @:DEALLOCATE(recv_forces_snap, recv_torques_snap, recv_ids, recv_ft) end if #endif diff --git a/toolchain/mfc/lint_source.py b/toolchain/mfc/lint_source.py index 59645ebd5a..6f22b3effd 100644 --- a/toolchain/mfc/lint_source.py +++ b/toolchain/mfc/lint_source.py @@ -309,6 +309,141 @@ def check_junk_comments(repo_root: Path) -> list[str]: return errors +def check_allocate_deallocate_pairing(repo_root: Path) -> list[str]: + """Flag @:ALLOCATE'd array names with no matching @:DEALLOCATE anywhere in src/. + + Every @:ALLOCATE must have a matching @:DEALLOCATE so that GPU device + memory is properly released alongside host memory. + """ + errors: list[str] = [] + src_dir = repo_root / SRC_DIR + + # Known program-lifetime allocations with no finalize subroutine + PROGRAM_LIFETIME_EXEMPTIONS = { + # m_helper + "weight", + "pb0", + "Re_trans_T", + # m_model + "gpu_ntrs", + "gpu_trs_v", + "gpu_trs_n", + "gpu_boundary_edge_count", + "gpu_total_vertices", + "gpu_boundary_v", + # m_variables_conversion + "gs_min", + "pi_infs", + "ps_inf", + "cvs", + "qvs", + "qvps", + "Gs_vc", + # m_start_up post_process + "data_in", + "data_out", + "data_cmplx", + "data_cmplx_y", + "data_cmplx_z", + "En_real", + "En", + # m_acoustic_src + "loc_acoustic", + "mass_src", + "mom_src", + "E_src", + "source_spatials_num_points", + "source_spatials", + # m_bubbles_EE + "bub_adv_src", + "bub_r_src", + "bub_v_src", + "bub_p_src", + "bub_m_src", + "divu", + "ms", + "ps", + "rs", + "vs", + # m_qbmm + "bubmoms", + "momrhs", + # m_cbc + "F_src_rsx_vf", + "flux_src_rsx_vf_l", + "F_src_rsy_vf", + "flux_src_rsy_vf_l", + "F_src_rsz_vf", + "flux_src_rsz_vf_l", + "pres_in", + "Del_in", + "alpha_rho_in", + # m_data_output + "Rc_sf", + # m_fftw + "data_cmplx_gpu", + "data_fltr_cmplx_gpu", + # m_global_parameters + "qbmm_idx", + "x_cc", + "dx", + "y_cc", + "dy", + "z_cc", + "dz", + # m_hypoelastic + "dw_dx_hypo", + # m_igr + "coeff_R", + # m_rhs + "qR_rsx_vf", + "dqR_rsx_vf", + # m_surface_tension + "gR_x", + # m_time_steppers + "q_prim_ts2", + # m_weno + "poly_coef_cbR_x", + "d_cbR_x", + "poly_coef_cbR_y", + "d_cbR_y", + "poly_coef_cbR_z", + "d_cbR_z", + "divu%sf", + "qbmm_idx%ps", + } + + allocate_re = re.compile(r"@:ALLOCATE\((\w[\w%]*)") + deallocate_re = re.compile(r"@:DEALLOCATE\((\w[\w%]*)") + + # Collect all deallocated names across all files + deallocated: set[str] = set() + for src in _fortran_fpp_files(src_dir): + text = src.read_text(encoding="utf-8") + for match in deallocate_re.finditer(text): + deallocated.add(match.group(1)) + + # Check each allocation against the global deallocated set + for src in _fortran_fpp_files(src_dir): + lines = src.read_text(encoding="utf-8").splitlines() + rel = src.relative_to(repo_root) + for i, line in enumerate(lines): + stripped = line.strip() + if _is_comment_or_blank(stripped): + continue + match = allocate_re.search(stripped) + if match: + name = match.group(1) + if name not in deallocated and name not in PROGRAM_LIFETIME_EXEMPTIONS: + errors.append( + f" {rel}:{i + 1} @:ALLOCATE({name}...) has no matching " + f"@:DEALLOCATE anywhere in src/. Fix: add @:DEALLOCATE in " + f"the module's s_finalize_* subroutine or annotate as program-lifetime" + ) + + return errors + + def main(): repo_root = Path(__file__).resolve().parents[2] @@ -321,6 +456,7 @@ def main(): all_errors.extend(check_fypp_list_duplicates(repo_root)) all_errors.extend(check_duplicate_lines(repo_root)) all_errors.extend(check_hardcoded_byte_size(repo_root)) + all_errors.extend(check_allocate_deallocate_pairing(repo_root)) if all_errors: print("Source lint failed:") From 5b4f8464eab46911095dffe24e0009cea670dc21 Mon Sep 17 00:00:00 2001 From: SVS87 Date: Thu, 18 Jun 2026 16:53:04 -0400 Subject: [PATCH 4/9] fix: improve allocate/deallocate lint check to use initialize/finalize pairing Replace global exemption list with per-file initialize/finalize subroutine pairing. Only checks modules with both s_initialize_* and s_finalize_* subroutines. Known pre-existing missing deallocations are listed separately. --- toolchain/mfc/lint_source.py | 123 +++++++++++++++-------------------- 1 file changed, 52 insertions(+), 71 deletions(-) diff --git a/toolchain/mfc/lint_source.py b/toolchain/mfc/lint_source.py index 4db42f3c7d..059cf2c6b3 100644 --- a/toolchain/mfc/lint_source.py +++ b/toolchain/mfc/lint_source.py @@ -313,28 +313,23 @@ def check_junk_comments(repo_root: Path) -> list[str]: def check_allocate_deallocate_pairing(repo_root: Path) -> list[str]: - """Flag @:ALLOCATE'd array names with no matching @:DEALLOCATE anywhere in src/. + """Flag @:ALLOCATE'd names in s_initialize_* with no matching @:DEALLOCATE in s_finalize_*. - Every @:ALLOCATE must have a matching @:DEALLOCATE so that GPU device - memory is properly released alongside host memory. + Only checks modules that have both an s_initialize_* and s_finalize_* subroutine. + Files without a finalize subroutine are skipped — those allocations are + program-lifetime by convention. """ errors: list[str] = [] src_dir = repo_root / SRC_DIR - # Known program-lifetime allocations with no finalize subroutine - PROGRAM_LIFETIME_EXEMPTIONS = { - # m_helper - "weight", - "pb0", - "Re_trans_T", - # m_model - "gpu_ntrs", - "gpu_trs_v", - "gpu_trs_n", - "gpu_boundary_edge_count", - "gpu_total_vertices", - "gpu_boundary_v", - # m_variables_conversion + allocate_re = re.compile(r"@:ALLOCATE\((\w[\w%]*)") + deallocate_re = re.compile(r"@:DEALLOCATE\((\w[\w%]*)") + init_re = re.compile(r"^\s*(?:impure\s+)?subroutine\s+s_initialize_\w+", re.IGNORECASE) + final_re = re.compile(r"^\s*(?:impure\s+)?subroutine\s+s_finalize_\w+", re.IGNORECASE) + end_sub_re = re.compile(r"^\s*end\s+subroutine\b", re.IGNORECASE) + + # Known pre-existing missing deallocations + KNOWN_MISSING = { "gs_min", "pi_infs", "ps_inf", @@ -342,7 +337,6 @@ def check_allocate_deallocate_pairing(repo_root: Path) -> list[str]: "qvs", "qvps", "Gs_vc", - # m_start_up post_process "data_in", "data_out", "data_cmplx", @@ -350,28 +344,6 @@ def check_allocate_deallocate_pairing(repo_root: Path) -> list[str]: "data_cmplx_z", "En_real", "En", - # m_acoustic_src - "loc_acoustic", - "mass_src", - "mom_src", - "E_src", - "source_spatials_num_points", - "source_spatials", - # m_bubbles_EE - "bub_adv_src", - "bub_r_src", - "bub_v_src", - "bub_p_src", - "bub_m_src", - "divu", - "ms", - "ps", - "rs", - "vs", - # m_qbmm - "bubmoms", - "momrhs", - # m_cbc "F_src_rsx_vf", "flux_src_rsx_vf_l", "F_src_rsy_vf", @@ -381,68 +353,77 @@ def check_allocate_deallocate_pairing(repo_root: Path) -> list[str]: "pres_in", "Del_in", "alpha_rho_in", - # m_data_output "Rc_sf", - # m_fftw "data_cmplx_gpu", "data_fltr_cmplx_gpu", - # m_global_parameters "qbmm_idx", + "qbmm_idx%ps", "x_cc", "dx", "y_cc", "dy", "z_cc", "dz", - # m_hypoelastic "dw_dx_hypo", - # m_igr "coeff_R", - # m_rhs "qR_rsx_vf", "dqR_rsx_vf", - # m_surface_tension "gR_x", - # m_time_steppers "q_prim_ts2", - # m_weno "poly_coef_cbR_x", "d_cbR_x", "poly_coef_cbR_y", "d_cbR_y", "poly_coef_cbR_z", "d_cbR_z", - "divu%sf", - "qbmm_idx%ps", } - allocate_re = re.compile(r"@:ALLOCATE\((\w[\w%]*)") - deallocate_re = re.compile(r"@:DEALLOCATE\((\w[\w%]*)") - - # Collect all deallocated names across all files - deallocated: set[str] = set() - for src in _fortran_fpp_files(src_dir): - text = src.read_text(encoding="utf-8") - for match in deallocate_re.finditer(text): - deallocated.add(match.group(1)) - - # Check each allocation against the global deallocated set for src in _fortran_fpp_files(src_dir): lines = src.read_text(encoding="utf-8").splitlines() rel = src.relative_to(repo_root) + + # Extract allocations from s_initialize_* subroutines + allocated: dict[str, int] = {} # name -> line number + deallocated: set[str] = set() + in_init = False + in_final = False + has_final = False + for i, line in enumerate(lines): stripped = line.strip() + if init_re.match(stripped): + in_init = True + in_final = False + elif final_re.match(stripped): + in_final = True + in_init = False + has_final = True + elif end_sub_re.match(stripped): + in_init = False + in_final = False + if _is_comment_or_blank(stripped): continue - match = allocate_re.search(stripped) - if match: - name = match.group(1) - if name not in deallocated and name not in PROGRAM_LIFETIME_EXEMPTIONS: - errors.append( - f" {rel}:{i + 1} @:ALLOCATE({name}...) has no matching " - f"@:DEALLOCATE anywhere in src/. Fix: add @:DEALLOCATE in " - f"the module's s_finalize_* subroutine or annotate as program-lifetime" - ) + + if in_init: + m = allocate_re.search(stripped) + if m: + name = m.group(1) + if name not in allocated: + allocated[name] = i + 1 + + if in_final: + m = deallocate_re.search(stripped) + if m: + deallocated.add(m.group(1)) + + if not has_final: + continue + + for name, lineno in allocated.items(): + if name not in deallocated and name not in KNOWN_MISSING: + errors.append(f" {rel}:{lineno} @:ALLOCATE({name}...) in s_initialize_* has no matching " f"@:DEALLOCATE in s_finalize_*. Fix: add @:DEALLOCATE in the finalize subroutine") + return errors From 80e6d0ab8d19179d36ab841c0320b5e36085cac7 Mon Sep 17 00:00:00 2001 From: SVS87 Date: Sat, 20 Jun 2026 01:04:23 -0400 Subject: [PATCH 5/9] fix: use plain deallocate for CPU-only recv arrays in m_ibm recv_forces_snap, recv_torques_snap, recv_ids, and recv_ft are allocated with plain allocate and only touched on the GPU via transient copyin/copy clauses, so they never enter the persistent present table. Using @:DEALLOCATE made the OpenACC runtime attempt an exit-data delete on arrays not in the present table, causing find_in_present_table failures on Frontier. Reverted to plain deallocate to match their allocation. --- src/simulation/m_ibm.fpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/simulation/m_ibm.fpp b/src/simulation/m_ibm.fpp index cf4a2a7859..ba0890841d 100644 --- a/src/simulation/m_ibm.fpp +++ b/src/simulation/m_ibm.fpp @@ -1552,7 +1552,7 @@ contains #ifdef MFC_MPI if (num_procs > 1) then @:DEALLOCATE(send_ids, send_ft) - @:DEALLOCATE(recv_forces_snap, recv_torques_snap, recv_ids, recv_ft) + deallocate (recv_forces_snap, recv_torques_snap, recv_ids, recv_ft) end if #endif From 15d19677639453a195980761b3ab1555591ffd6d Mon Sep 17 00:00:00 2001 From: Spencer Bryngelson Date: Wed, 24 Jun 2026 11:31:08 -0700 Subject: [PATCH 6/9] fix: drop duplicate Gs_rs/Res_gs deallocates (already in master via #1592) --- src/simulation/m_riemann_solvers.fpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/simulation/m_riemann_solvers.fpp b/src/simulation/m_riemann_solvers.fpp index b1182efe69..95a6aead76 100644 --- a/src/simulation/m_riemann_solvers.fpp +++ b/src/simulation/m_riemann_solvers.fpp @@ -111,10 +111,6 @@ contains if (qbmm) then @:DEALLOCATE(mom_sp_rsx_vf) end if - @:DEALLOCATE(Gs_rs) - if (viscous) then - @:DEALLOCATE(Res_gs) - end if end subroutine s_finalize_riemann_solvers_module From 889525cc1ca08d1c2d4cf2b60746599302ed941a Mon Sep 17 00:00:00 2001 From: Spencer Bryngelson Date: Wed, 24 Jun 2026 11:57:38 -0700 Subject: [PATCH 7/9] Remove provisional allocate/deallocate lint and boilerplate notes; drop duplicate data_in allocate --- src/common/m_helper.fpp | 2 - src/common/m_model.fpp | 3 - src/post_process/m_start_up.fpp | 4 -- src/simulation/m_acoustic_src.fpp | 4 -- src/simulation/m_bubbles_EE.fpp | 3 - src/simulation/m_qbmm.fpp | 2 - tests/coverage_map.json.gz | Bin 16880 -> 16939 bytes toolchain/mfc/lint_source.py | 116 ------------------------------ 8 files changed, 134 deletions(-) diff --git a/src/common/m_helper.fpp b/src/common/m_helper.fpp index 4765cdb903..6bd9718dbb 100644 --- a/src/common/m_helper.fpp +++ b/src/common/m_helper.fpp @@ -86,8 +86,6 @@ contains impure subroutine s_initialize_bubbles_model() ! Allocate memory - ! NOTE: weight, pb0, Re_trans_T are program-lifetime allocations; - ! no s_finalize_bubbles_model or s_finalize_* subroutine exists for this module. if (bubbles_euler) then @:ALLOCATE(weight(nb), R0(nb)) if (.not. polytropic) then diff --git a/src/common/m_model.fpp b/src/common/m_model.fpp index b22a2cdc54..76770a4a62 100644 --- a/src/common/m_model.fpp +++ b/src/common/m_model.fpp @@ -973,9 +973,6 @@ contains end if end do - ! NOTE: gpu_ntrs, gpu_trs_v, gpu_trs_n, gpu_boundary_edge_count, gpu_total_vertices, gpu_boundary_v are program-lifetime - ! allocations; - ! no s_finalize_* subroutine exists for this module. if (max_ntrs > 0) then @:ALLOCATE(gpu_ntrs(1:num_stl_models)) @:ALLOCATE(gpu_trs_v(1:3, 1:3, 1:max_ntrs, 1:num_stl_models)) diff --git a/src/post_process/m_start_up.fpp b/src/post_process/m_start_up.fpp index fe1588e5b3..7284190160 100644 --- a/src/post_process/m_start_up.fpp +++ b/src/post_process/m_start_up.fpp @@ -875,10 +875,6 @@ contains Nf = max(Nx, Ny, Nz) - ! NOTE: data_in, data_out, data_cmplx, data_cmplx_y, data_cmplx_z, - ! En_real, En are program-lifetime allocations; no s_finalize_start_up_module exists. - - @:ALLOCATE(data_in(Nx*Nyloc*Nzloc)) @:ALLOCATE(data_in(Nx*Nyloc*Nzloc)) @:ALLOCATE(data_out(Nx*Nyloc*Nzloc)) diff --git a/src/simulation/m_acoustic_src.fpp b/src/simulation/m_acoustic_src.fpp index 34552f9c1a..f007136f70 100644 --- a/src/simulation/m_acoustic_src.fpp +++ b/src/simulation/m_acoustic_src.fpp @@ -64,10 +64,6 @@ contains integer :: i, j !< generic loop variables - ! NOTE: loc_acoustic, mass_src, mom_src, E_src, source_spatials, source_spatials_num_points are program-lifetime - ! allocations; - ! no s_finalize_acoustic_src subroutine exists for this module. - @:ALLOCATE(loc_acoustic(1:3, 1:num_source), mag(1:num_source), dipole(1:num_source), support(1:num_source), & & length(1:num_source), height(1:num_source), wavelength(1:num_source), frequency(1:num_source), & & gauss_sigma_dist(1:num_source), gauss_sigma_time(1:num_source), foc_length(1:num_source), & diff --git a/src/simulation/m_bubbles_EE.fpp b/src/simulation/m_bubbles_EE.fpp index 2d02584b57..a15156405b 100644 --- a/src/simulation/m_bubbles_EE.fpp +++ b/src/simulation/m_bubbles_EE.fpp @@ -32,9 +32,6 @@ contains integer :: l - ! NOTE: rs, vs, ps, ms, divu%sf, bub_adv_src, bub_r_src, bub_v_src, bub_p_src, bub_m_src are program-lifetime allocations; - ! no s_finalize_bubbles_EE_module subroutine exists. - @:ALLOCATE(rs(1:nb)) @:ALLOCATE(vs(1:nb)) @:ALLOCATE(ps(1:nb)) diff --git a/src/simulation/m_qbmm.fpp b/src/simulation/m_qbmm.fpp index c89f8a5cc9..abb77a1f35 100644 --- a/src/simulation/m_qbmm.fpp +++ b/src/simulation/m_qbmm.fpp @@ -56,7 +56,6 @@ contains $:GPU_UPDATE(device='[nterms]') #:endif - ! NOTE: momrhs is a program-lifetime allocation; no s_finalize_* subroutine exists for this module. @:ALLOCATE(momrhs(1:3, 0:2, 0:2, 1:nterms, 1:nb)) momrhs = 0._wp @@ -384,7 +383,6 @@ contains $:GPU_UPDATE(device='[momrhs]') - ! NOTE: bubmoms is a program-lifetime allocation; no s_finalize_* subroutine exists for this module. @:ALLOCATE(bubmoms(1:nb, 1:nmom)) do j = 1, nmom diff --git a/tests/coverage_map.json.gz b/tests/coverage_map.json.gz index ee478b6a9f7b7e22308e215d2888791219f9b783..1a641d89513f2d1e8bd5ba13c8762ef74c88cd40 100644 GIT binary patch literal 16939 zcmZvD1yEG)8?^<}v2;s=lyrmAOP6$aqjaNmcc-*;tbl-kwA7MIhagf*DGdVOUG(># zZ|3`$Gs6Ho?7es2_dMr0&v~h$QBY7-h3y{QnLB$}x|mv98atZ4VYhR2c6zY4tl+!^ zPFuZcHHrS9yTftTmvH}R)qv+;We*PW+r+1YK2 zfs0FL`#;75+iY)coz82Ir^*5^IqpuzM^l$XSK>VGe(pNoS=_m1x802SwXQBXQ1a!U zUUxcm&fIpM1gvtjQMS$RQ66;qokzwm3fnGLs_b_xZwId&p7{^jF9%Fsi;DZvJ2vmE z`fqPeS*>y$w=6qnIh^jCyIyc3liOTaF#yov0sp-|oEDxq}A=&L1xw6fBDyhz9ta)vIXpJ06eKj<*M#hAucY zUwU1SbdEXa-NJ`kZXGFSR=;daIDh%w>Al@Tbjy!@5J(Ytd{G*Bb<(i9x#{7rU0wS{ zOwIgec{wi~etkIROsP+G9zNh}d)@i{eC6Bn=H}b$+5Ec`J^8@ffzBJfyUk2%quo`p z=0m*O?6UI?j!y5Zw%QfvJUxzar}NK7CBDl|cQ>Q6NBm=}#^QICE6yjS%PU6v2TgG7 z*h=_*Q|J06QNVuq*@rQ)mfL~aKpe3<0^^hSUUN&^KI-E8H!k`7Z2{*Of4BoD7Tc^T zFLvV-Pk-DUcm5e2whOAPvB_n=^6ED#q$Vv~!?k6KZWFxhtf&dO8V#aHVSNf$82KiaQe z;7f9zbYnIyM_z#>VIsqV>84v#&7DTEqd7jc%{Q5~7h+2*n9D)GkbX|ZehJd16O)dd zJzw%kJ+-UMcW;{tFS5SA&L3PA^>9VGnQg1v(Qn^fY#Zp3So=tXMmt}%{u|%C1gD9a zMMDeOjON#lwAlw=ETQz+3j1}4-Vbmu{)a9+5f!2_yso#$ziv@}`4KgDjH=`PXeF)8 z8raamzC@RJ7V@VrZDStk1qDp@hdv583+F3}$#!I3S%tN)(9h1MmYSLPH*84tW2z4M za5u3Ob$iZTT(WuqgKfaeu1{0OUzgDBGgt)Y0Y4%zXq(&a6_@aZ7g`FFVS2~t6?6}f z=sBDur`(CRhJw?}94|adKr_TmF5FGd(`m9#@AtPUf~n~#7L=U?teu3opzW4dWk#)= z71U4lnIqJ3kW`MIs2mk{T@{4H_QX0VWjK0B&p~j`rrZ~+Wi)5^&x*QVVDtbu5)PfS z8MPCz-Y2I{hlYYASbYk&E{z|C>Sp*$S|z`wg?=b3uO4Q6fer!Srgzag)tzsAF$eP@ zbJk8i=Z7|yllX7o!EVirG~o$70?82ed%B?5{K$P|sL9-)*rvx?{PP5FINNrabG zL}souU<<;FMkT~!WkA_w#YWk^xGrk)(Y-_ECNWmmY6`H;d+#PUFkvhAMH2+E$X3W) zw!(W%*N_{XI|r5z>5ZnZzsRzCQSynkU-iAT%88UplSxZOa6`C8Q|NT8P2S)TKDCzw zqnpH*+61%bk73xCw!>E14-#7w<0P)XS{7AY!x+l|C%J3@Sn-Xp_my)an3Z?fpOH_oLq@kbj6(IGvd(~ z1+@kHsmHHFG(x23rk3dfl<+pOO)zH$Knmd;6%z!`>NS}iulHzsc&@*F2&j|z?a}6a zb-Pf%JmSHw%C4>w<)P6 zF+*da*UIdeg$S=;-aTeyo?Q0G;L>a?=Vv!{8oIGR_n%#Q7UTxu`I||IFJDbDsYaYX zq16*}rZ9>1NTVnp*uzHg&ZGLuQ@)j&@39LX{dw%tNqboBv)(edU`@+70tjNIGh&V8 z&Y074m39f1iqog2n0(8D#xtLA!>MC^P}8duK1EEsmGPcH=Y1-QcMxgPv;6l^Qp3?o zd9I|{Sc+spZ>bvs5n#u4C11ebP>QtY)tI9q+8|hx1!W>!A%Fn|obWi*t zvLOZR*V2&Pm0F~R6dmIVhg!B`&g(2}J`6TkWHRt>1C73@x#Qj;Zl$0-l;yOHFM{y; ztS6cRVdes*7#I-eF^71V-Rspa(>mafbeeJ@Qg%%dUIjFpbME-*?feT#j9wrSH9|{4 zt&lwJ#X+7Csxw}sYX8%j@?vd)&YCOhO5x)|{%T{Hv+n9h7x$1vasd7;p zWWp3?wjD~QH)FeGlE?0I_Wd#H2}MggSu4^H^r12`Z=_l|zaifS{hO-ATrqOd#nn5- z+k^US$?eXSP^HxxHu(PX50ip7)99gzRk@{hr&ehCT^lZGk5VeSavy6m`3hLtPm}Cc zu~i4)m#R%}qHxjB(1cnS3-j;vw^}DVIO)dP^BB^o6f*j_lo42&p1m94!wb$YaL3a? z$4IAEm7t*mF(n@C6<69boM$*i!E^|A;`r$UTAkV&9bJ~4#GgB@GdMNyM%E4-RQB$c zeadKnqZ*fY1KXaGC|8ln@@hM?DGJBjwVL~c^|kMNE65KzJ|B(Kx?Sa$|G|t zV++!r`4_Vn8y;X6v9!8m?VS`qZnZ9`G?)3&qX@j<{C2LrjUoOnscjT_5YM(jdhXyj!;OPL)+k%Og8N z?>tgK>v#DW(1yRKn9-y;RgzMNjGW8a1Fz2>Jy^R%&u+em?sQl&qb9taktnAhu=_M% zf!VB*2vi*az!N7^*D{x#CGud?LF`xrTDg;<{ha<(rXjo0;{@+1zyRd}IB+}|fYkKV zH_FS2o=rzY_DX$t+zNp=3`l9aY`xzx=z@f<`NqJ6GzyYmMAj24WZYA?vUWe~mD_29 z7qF%gDDLnnr`gqHWX7QF?;Y8sE74Kx?fu~(@%5(+Xe;saj#9i8)bz_IJu)XQ75soq zMzom`Jj*<$*a)MRjJgE_X7^Ikc0xoc`QPW%_XKuTONgc%&VU!~49z=z_gem_4zt%m zp;Ke|52AYMT<{SFWVfn2;N>T`x<_QbcO-{(ODXnB#n~C!U7%}yYMh4+UvbE$65o^A zvH!0xx4(Cs-e0(B5L>8F%{$n|LGd}vwGxnY6GWdhAjsDa^t^~`pok-9k%_$pb}BZM zlF}0Jr1_0Psk90on4=#-Y-5Wuv7jMRC%dH)85Y`pH9TImV~|zO?PX}ZVRiE_k6d(Q zk2$e4og4?24wdAhVq8o+S13_TR|ZP7n>B+Wr|roz`p;U@!jk|mQ&ZgB6yOP+kLw19 zsa7h%M$!t7y%gH=YZjgS4~?4_9TtdG;5uPb;BAnY11%6L_L3 zT4Q(<_mb#TBrojgYyHC_7;ME_PE#j{9)JWzL0oXn(+L03Fm;2NLP)>uQ7S{*wnDOD zRp}tRlE=>6-B6ztn$q;HMsh?&a^Dlv+@Ft3bCDh}<|JI03`NXql$p+0Kc3gI0TlR$Hv&N8fh}G_XmN5Ux_p{d0KU5pJYo3+!s`aO7-IYxgL^A_3Zk}+a(J9t{Aij z_A*E>g^L~$6MU6egNJrUcq_i0s(IfKjNHeHuftTQYEtl3;(h2N^iW_4b8n`!P6^qu zqi^8@4)Uv#sj4`IV{hI;TQHl1ECCN2JXTQp%H@Osa8|_*TjSK{wBP zM_69Y_b|6XU%duvxw7vfbHD$9CsdI9eUP~GR>WM7*d zCrVHM=ul_#HU4t_zF9LzXNI<=zLylz01E<))H}?pW}pB$vz;9wC4dgQTp}B^_&x43 z=ve!W>AoJwir>J}cah*q+AmKlf|m!Z5Y#b;TtLJXl<};8w3k`*o=tACkGk(lyum&- z>DEm(+SopAi|4=pIM}`p&ZKXib0H2A>~?|BNP5fYu}|;Qc`{zxRB`ijXZ5+e5v9qG(g!bGT!CFsxKeDd!@vb}s$ z&qkFNsT2eIZr{jhO2c4A!(jCC$MXO5YXD{)=Foup1E*4t%F^kBFG@p}8tz}WK>xrZ5dky5i=z!>z+mMrF+pNm^ z6stYgfR$DATKVrc1DQUg$uIPX&Id zz04GdE+BH=cIb&`C@8Ue+V}nZ$C=YMVGIY;k<$jj7n)zp@_){!+hAjrcq#uM%~tsJ z?BH#ks=#JwkWiaTlU$vxzz-d!gkfDY)oTVTJjlc`l8>Ov( z3At-wAx0#ih!f;?F3l9i)T##Q6_hwjL7cdF0OE&x@i?6krh)l7uI`lf#N-zFET#1b zrM7w2F`UD}KBhR=0Zjlmf;HA zWc)Gb9vPXmjFtlG(beST(q?hfF2!knH?4hAO#!Wm3K{f`db)}@eY)&8eUa-@ZwoI1 zL|t8;v&-RQI$Q%%Sb}D1Hlrh~{wa4;uWdzk0zB4Tw zcAV953&+G^@~n%k--eplu^`pMP3()UwFZiA)-H!7rz>Gx4LRLB_7610jbY{dJ@EJ2 zRop7ZLq|#ewpc>t{IoPQ>drEN+^f0#K-$}SFmv%a?%tvZcPnG07#Br1v}tcy*W!-k zGe;Ks@L1@BZ_k0Eo6!|6c3@&QS>am!K4;UjmQXW#WYl0Wdi%HVtnHBfREIB^)sEKiZ?S+SL)1Cr8&I1|Y55tR8_}Mo{ zUO>i;O?$PiF#N2l)Dnj+SV!@T6X!&(;dN7CzksbodwSoKzXBhtDPzuwUuD%;c!s=6 zP{;L;<0!6z&SST$6R~(@&iq*OG_>z3uzYiEBHz7=^F6~;u3j*2GO;qofR>p6NMnl8 zIJwriIfJ+|C10D-T;Gj&nE1hOUf>}k{=mU!Tv^@qd1vukxn>rnYXCVyX50AqIgMW$ zwDRChYNjJ?e+vK_LRoq<-wL1Vs2{Ma#Pm;Ur7$k<<7r}c!J(=eMluB&=Oq3K0z;Cz zsEG9E>p51XxDKw+(U^!Q8rvbtt0yGP4~nYklxVhl63@ zrCaky@8>rSQ(n98*|Rz+Iox$C2hEiqQMk}Bx^RW33RX?a2VT*~+ayg`nN@Mt_J4DG zFJ)IOW5>nbmbfR=@p6p!2g3#Xpk1W(@)-`IrU5|B6(1=@Z^8E7)!+$|r*WfU?Y>8W zYiHhD$5cJ@7{_IwxUVkEPY`!(_W`y33vr+2r5XSdnI2M(Qz$0gC8G|^qe3?r0?OCg_N9WpBVZ#IjT^p{{Xr|Ft-6EjkgQI&uo$On)##{d2XFCgokVDoPd<6A&KS^`BWx zhTA{g12r>?UTs5t7s@lDgx`y1)97O@8qS;4Z>0eW)KsBo*IkB1a+6H;^{#JK8L|Nz6@YJ9c-q0=J|h5PWA@t~ z%hQ;`$910tO@gBDHBi@O!jeF%vi-Djfj#!W)=N35Rj~gOkzz=z0$ao;E8kDSDROrD zF%o^dvJWUx4vbv&DbcJ?C7Tx1wjzYgRTf^QMMU-6C`!>6g4E98^H!cSvhYf7u@CnI zil{MLMxy%Q%1Hm6O4C|yQOFh;M)>F`dW`-xo?NN=hXxb=0w6`>a=b7)Ikws z!{k#74-fbQ+cNIdlq?Bi?i{g8<-T7h(r%- zo04P4sm^&r$*V_uvNKcupk;kP&H4b|_%i*id}3}b>MgaqAp9E`OvL{d4*~4&rTtk+ z$1u0k{xt?Q5Mm9EW%NFb981nx46f|$;C1%G5Y3o7uK=04gTX}<3@ z<3<5{0Jz|o4Jk>b^=yXiVl_%YF#b?__R9>6?^twwKxad|G)<>;Uz`9bM=6{P9@So~ zxN`cUv}fLp=nk$k!e?Be;hkUMeZPe4D2kfb4Y`ApAsLaG0O+96^b?y7L7A0pM$iJ! ze;qEO?NzhNx2KsS#jwhK9aVQ&wzWLY)?}1W{m*A9d((WS+brxa;M3H3m-%PeoIiX# zupK?S!!SIh*)u*kv|Eh>UlS5puRR;BsHg1-jDyKQH8*GwgnakD`8l;rbGFkch}xuft=qUo zs;FnqT7Er)d5IrYKpchIkm5iRapun#e9r6H8K>*c5!}FTX^4>JQa#brFXFyK4%>J3 zg6#!tBEk^xa{4)$kVW@)G8@t*_17_Iy?q6U0G%FI{|rINx>Sl@&$(9?9lU^JL*Bi{ z`9?<~V`Y$hU4;9!fa>GO1TPD^JQVNj_;Xpg^){0eM|&T3IDS-VqC@IXD!R|jJHqyW zXK_a2Cs%7YV{k&e2?A?798`4|9#)2LpIM2%eNORbzIKUq;mBi&9?l?DKQT?{1+S0G zgPxit34n7#yPXNq7F;pRe01J<5TX@3q&+HjP(NcX-pd{^TwR9?A9&SzobsO8RG)Wk zbniSrSba$`{fYwV=kZYFpr>=vf~xfl$zbHYpT}Oy)gP*JiADZYtyZt?d^AkvfX)+G zQc1$h^?CY{yaVc$Wb4C)aSzwYEgxyealPV{%@i2wEh*IIUhr5wDXz`sO10}ZJ|o|r1bUz} z{zPfqf|#NeByc`2D8X*1{=6R>&Www2saWUnMJE8hCarK>sQhf^^32<1m;k{OpMUzy zxGy-H>CCc{vkelqm9B+=Q|RO$v3>;r;xqnQRwbO@Wskd4>BxbwT)P>`@|GB+7n?cu zXVzp#OtGxXl;myGC)t5Jx*@>%B_Zu#XNS=QOKBzEZ95U{HMt_E;q%AZah1#O(Pn4p z&9cp|g;qiFhjJ;_d4G{s#W%!0VWSC4_cu!$LGmrqNtrkg;gW8A!82wnJ(i@Q0eHrujN0l0f`U| zVLrT>zI2a9o%O4d{*tmg`=0IjubkP!uUIqqbAsXSR`v7cS@St*W^IiGJ1YTWnWdL+ zP{IKmjungvR&wZVX7Kq`e6x^JeIl*;M^K5b!>?6;Ty!+IY;bL7k+~(E)6U7gbR?BB zj)Rubg)%dTk>**-LFZyi9%kYtVKs{w3JkQmtY#L>2HF_ zm%58Q#1NfGejxL}clH6HJZt}x9V;m+;FtD*{SY^lb>_zBx6fu+P33*|$~&dq@6Xi; zEF8PI$5kaYgC2E5nGU6oeD(D3CgeNeSluK<*WZ`WYOJC2hg7H(tl(IKwUGOWV*DY6wOd!}2k!@l z=5`&66Pm7`v6#w3EfKMEjJ|2-PJS&}p6CAYmQ2wN&gE4bsgQcm6;F}p$-d` zI;aupvBIRqHn(%{hrSY!)(Mf;SwNpK+BRH7hb>(j_$IwA#(ylFv?nKl5`r^{VoO9a z8KtRPqNLP*VSs9DjXO#F2L(YHFZ`Y?hBqqaLKZ=KdIKh?IZu@TI=-&SHM3Pcg5{N8 z^meqKMgbz^!?y@?cKL%wjeU&r+4|evFFnf2!|zzX1p(MANO08kgBi)=5}2M13e))V zyPm4>`4Ryz-z} zom&ybLR%>d=&pF3SYa0Idh=zgT5ZP)>D|r%KUr+4w0O`aFq#Rj7$~i{n2$}<2_G@q z8GMOJ92haS!T%l?=cdgEc%g zkBF1rUZJ6qKWL2do;47}At9Xuz1q>D5;N}Jbs3H%L(Gw%jA?wmpW|w}t^TqYKY{4L z)(we93GTTLPi!#HVyxYZa8#)@+9^hm7N!G;3Mr9A;hgIZLYGPRHA^?bWHXleGIv5| z?YJ{??p!yPZf!sMx9gj@pKUcTEkm-d3%QYY8;dpmZJ(uD>si~87ly8H#ft7F>SSK{ znaH6RO4(e?CfIXJBVV#n9ixO+82TN9IX1;3l6ka6s0tNio(u{}k&&0Y--9C9qN~l- z%5S@5j1`XrXC#(@y7ojVt~!Wi;snX9<}$NngsDLJ>hL9^jJ5^sp-~2Ck5^BmlzTSc zircfLyfQ^iGl}G40>>6NX{+Q1XWD;%t<*o0Fpeh*IN}HZ{s$qIW4U7^8UN6!-(QB; zD{=X~d2JWw?gW!(OOhaxQ}v;Hnm=fV`aL26CjcGRe)7g*rT=&qX6@RwoXXz+I-dfPIn>b* zt5QvgwORZccJV4zj-PrBAk+}fwg3-qz!A* zNrj3TS5f5hMACAOk{1})dt-Szj-M-FiDuKpIbae*!UFf&0&=>1;lg`(a7{U^N@y9+ zD%=dyr`en#>RXY@V(Mb~(#^8iVnE(L?eLub@>9)_7cW>|Rtn1YkYb$T^-m&P)FfxH zS+r6vACdh`H!_Pi$jUSgQ;Sar_gb!RM#o`%#j%$C86QRPubjB9ZIuBNA!LZ^gg*Sui0W_RG_lD5fuceRsV(yi%c$-XO8&HQCSb>rSGp*7c^)UzZ%T8U@WRvGw!<9s5LTP54RWyBVqy_a|@%O^DAvqY4X?O{kX5&nyh;-#|OY zAP? z7mBHK!WFKLwO8~yNXA!aC&WbbWJgO4#h#{?g9OYiP1}uZZoXh@kmb8r!3bTZ6z_DWrGQ3!2vVPu zPv4wp>eRSAZ`-aV9(>iGNROCHFs#$CGRB*+ogh;t&svF!;X07-}&e&)dWqp1pA<`?s+AFcX*3#EwV$L&Pt!I<4F0vRwhZsr- zQH@_dh+BPcj#@rX84UCTCx{WBT{+{Dlm8(%>VglFyGN(cTj@giZ!gWoYnM$3vSk44L%UP4N$ zm~Ye;g4cAEJzb4y=p3!&@2=Ejh?=5V)|I-;gHKf<)V}PL*U{l|H$hMD=ebFov002r+{O zP~s_^x|)8}vKd&zCsChf%hhfv2z%@fq*H1KlU;bJoUe_tKEm@x-^e%G?c$ellV!Jz zgOmRGJhPHVq_NKJt!0?gFy8lB>jyiJ2!b+? zBDd99fDru3BOr5WzTc>?lb+mb%EUc{T*zhNQYV=zN&3U2sa&4(Z>pv57N5IfKjOGK z-4g-HtwO&5BVFS>!P6(XitNR>vDjw3AFczrS>h-=T0Y9dG26LrJ z6WqiEl-zN!9Kzds>%(zcZrS~2ic2>;Ap*#A8Vq;?*Sng~Yp1@uUhXk` z>wy04pzL@DExLH3@@!q81~5aT8>Y=vUXA^AqZTi&9K{?bor=%#O9kQmjY}R6wVm2t zayA=&-j{#|xI>)+=6LZw;j@i`i={?u*fNPD275JAR*hQW^rOCdbED6B2i6@1>s>#l zOK{l)G1%mBXBGEsN$r)kutGjp6uE^Xl5P>-9x`kc*R_T#3oCg}RB2sI2=zM^u?|s6 z%-4311W2Q%p;o-{-C6QUPF6CKG6w|nkQl>5{GGVB85obP$4{r-l!~y@D=W+GzNg>- zEO!t1L$_+Nt(m@$I@yCYz^HCpev3}-ivg%?u(17+6EsHE+_i7i zmEE{zz=^Ld{F=jp$FENt09uZC?(C#JF&idfnEIMH({!eG z1%xdr+)HFe=;hp`XU(Sx1Oug@2y04jHDyMm(8j*p>rk^GH6*%=*iRE#lI2qecQr!m zhJIhW^cOn$^xM(C(m&6VkRS5-ZI15J$1zqXtGAF0ub*b!ne(x5Qs4R_OG3QffHd^p z0Oip7K}CAM&b+=M;_?MMKUKa=#Ntm}wvpc?{$qt4&(01#fGy(Fq7v4uk=E>dP?-*$ z@8KlNVQFlciQQMn7-@iGbngjC^0h(tgdp%g3wX_DA z&1Va?v*Sr$-X@71M~VIBVj*}&7btS*UR`~W;J!dE?CEU+#4VC>WFv(ABBpAz9BR4r zF|h1ylrgArx^)Ra3!w*1(&7fq;7y)>ULodZh|UCv>hwir6mNVAYav|K-->%e#Lk(4 zo*v=Pf1-8 zeYBZ#4r7xN9k^N98UdG3AWQ7=dGia@Ajfz;32@JWJ+lEW78c&28!KIIBktus%NF?? z_C_SYM;Nq;DzQ7FG)^{(S({vVpGIbe_8XECq5)ppQqIaJ8U{BaG$hNv>~a|c;ieH| zH1i%Bb^l~xMrHZ;?k6qN+1s8THs}}r(uK5sS!gBmL8GkaMFhHD^VBTv%OcUed_+e> z`g-_$$OeY>BbQJ=1|GYw)Wlz(y01hRkPZ#r3u-|3S%*hzRh?}|#fo_|RH_|Yl04X( z_A9@<4astz-Bz!r^%ib7!PFL@ej@R4QoTeJq6za;;q^@JtvN2?>GTcP>?@^5SRCDJ z*RG#ybOd;dvfZg6R}aJSNf4_L7sQd)JDzP*$0l>yZHR7H0F(-68bjZ#^ExaW1HgS7 zbOSMDe1MnlELbW|6&+F|9}3Vb@JT!LGGrGr{%FUdt%{n?aN(JBEG!0wXQX zF>4~_DV30nES{64?kWUv$8uP5TgZ%SHkbWZA5XW8d$VaD|7tqy!!aAPGI#gl_bVTboiH1GG16rM z1aHn1<~c%FsY+mr4lyx#idsI<GS_aGfKR`r#D)4g}?H>mI-*$mEF`{cAM3Ze-{m2}88VHiyuhGaW6^T8JQ1W09HfD{aof%)6GSO6e zH3+q^cAyugAh{PHddMK}x^1`+`zAmlN`~ZU$1pgV35s947iC&4frh>@xP>u#MrQ&1G2=GjWJu_cLqXXQG zWwBLm1QASN#qZE#isAKbI-7tE7GKj!1Jjva2Qxm-?AxKIAik6BrHrX?qnu_G1^fZy zLIFKIL^|RZ5PNb#5ybdKU)CUVTd(>o3b?c=yguyx(;VzT>dItT=c_jpWw$V=)(=f+ zPkRNPA*a9bw$t@moh|HEV)8GDD1qbPq*hs-Va@XqXNfnT17&xB$JjeW+@Rt z7Uszg#z_A7whpAx=2yqr41CE0-}+)#v?5d4)ycyiX=6#g;tVekz>xO3^(jcu?$cGL zWH`5AT+7VW;o`(ejE#v&i569d=yLmHVLqAT_{DcsxP znyjqUC@N>Ca`%&j=H&!1$H5bAfd|!ctZ{GT5q%K-gfIW@KGzkZ(#_}__Z0QxR0i)V zd#{ZdU*Z}sN^~6p3f|{PKJqRBt;FrM5Uc-r-6u}*GoX-$en8jfD{y7wQ>!-LgEqe5tR7&NrNn@JIaTFbV5t$4)NuphJVF?M0YjC~=GCuOqnP<_w*E)Tp(V16C1V@~)j{6-~=Ciax9Rd(#Fr zcm!6VuIkZ;Q_g-q>?R=g_zjFe24X0KEF>#$*pYXYp;u_ zp)bmv@Be>08gr^k&Stnf+teo;A8@}d)hF>noT#}7CF&C{^nwAdGB-_bNSw|vQ>E{? zVE%7|_+~rIY&}WairooXmQlD0J=BjL6k@+3A*99siqyVdQ!{zQO*$fcxx+(tU z4dwLJGWwob_Ga0*h-Ez=Pq){7M8>tG?pzI>ghZT&7`Cpj3FhI2))VLlPHRor7NSDJ zncG2c=eeYT^BNT!^6tb!@rlsPSv5L)UygRmiXI>j0VrRoR$vJZjc{Y-`eSI*An7zI z{!?kdJh76~8xGjR1zcJ(ruUHuPr4Rb?+f9i_T7;#AL}6d#NvK6l5w+lbiJG}lO85v zB>3%{NjMDJQ>fV=O>xI&wX149{0v1RR;GJ@rKXh?&MUJ|8Y-AG7+i0xnFXkxdB0F8 zmjj5yOqnh#JJc>5d5-Q2f~ToTjS9oqQ(>o~RcApnS_QibD^iHzNJz<(>qny2Wc390 z>cWQ%r-<0sw>W0D$EFwC#9DYs@P*RhL8f*RrX7H?Kmv&ee~OcBM-2D_ub2`|b1nY! zvHjlX@rj+LjPZtKE&dw}jh(}e5k4^ex<=v^T?*2?b)q}pC2to!CfvvE8F~W(3P4Wd zU{)i_YIZTB9_h#YkOd1KB5Kd@3F!Mf5_)a@?co9P=?=NWi0eX$4C&O?)cI*AwsO|) zLA^e2u$N;$Y0cjyi%TYm7oGJnGV7za%jFy4`lF|8n&!R-eeq0!B|~X+`bmIUaMDyp z#a4cjFodOXJd{iQgb`>k0APU4NNd|BfW}PHwlUbuGqOAjn7f~E;9^S;!v3mUv2@K-+2cyctwP8lO@>5JBY#| zRsEhtWqPejC)RRa0tlT9*Wq0JToKl$X{CavvK2cIH_ zdWu|@0tbCjIxgQVy--_(#OJpVGasN=LK1NX;>HT=eq_d-qt*n2W-{*daorD|Ak2;s zl?KLnSB^a9GAGC{(~YDtAB_`?Bf!45&`)txYmy$rF@r5RR!Wvq4Qc8l;>!rkQqA%* zQdv9t%kLOHF}%0Ceb}1~ph~T<^S~5RSL1YpB*2xsKd|sL5W4?eC6Cu4*@{#{kr4=4 zAfVPE(yZFd9`T8!JE!YX3pjD+M1atlg3Z9OkP0@vLXH9fRPuBnVl35*PRaZGoY@SR zLiHvI8QVCp&HQBQ)6Sk%1jQhNvO4NpElHnq-(9dqxEn(2n87@+7=!Boby$Dwwl9K9 zc2C#PAA(P(lA4#(bba>clcx|RDJ-Y|;Cl&jBVVDLu5idiYF_9EWJC`LVDEZ=)|GU} zN-jxlcms|4{5g<~007({0jNi4Vck%dUel6}ZVel8$<#oKXs>6^$e$8MYTTmpwwDfZ zT*>|Wb?b6~=2EW`0>E*M@VAyJI})GXHhoQ_Ek{h9l1?||X@)5E=EtkS>jOE1Dw0B> zh`hjd2ozlibnOlCwPSnhWoXU?n(mm9c!WKjyEz^>C>346V0Z0d=oEf)dWRN=AjLKKlpFsNsPkm+{d<4FeZEYM`@8rzD z1YK3tDn(s3W60D17TOE{!QdpeRT^C|&_T*sW2C-!i!9qURYKBE+wDoxAoN4l`bS^KqN%(GDT(LS`tX;Sm9l99+ zJXRpl@!5V~G8HbMVN5d0vKsThPN{%a}uM*ThW@$_(mOd4dAV4%&>d}DZ z8mv$rCm=sqGAE<`xRum|#Sk;$LiMR#)4%?5%gH9`Wpc>y{9{b-uos&)%$Ov5??JN& zOZ$62T1%cm=PYzaJDHkjA)`bl{C-b^%gKO_NNR9&BS&VZ@9b}$7~pWP7P>eSNmf%i z64Qq3;RBAQhU@6w!-i{LuC~_Mzjkcx{Eg-LId-j*8B?`@M!yZO7JUug{hJ9?NCz#& za%dkPbR6OyILNGa-~_DS&A-T5;wgD*-2hYNqJPvYvl0vyNsm%L#IzYsLV`pV*eXrqyho|v_wP?#V25T4)s+`jht2_pX%IvsY5UDy^MQmV3 z+M1=Oy6XiSpAR*zaw48!VzSk3`g1eaiKYcb75HJwH8rAflkyhBZm;7a`&ic=IL>UXznFCy)Ft?jD9EXkqy*N1?*_%#bWzE%{%ujqCi30Ip>kYoPrHvy|w|*hR`i_gl znQwgC8zMx&YTar<9K^#D{=z0*%1jGn55jxlP5Qj)h$6a%gN49RyTHhDO`&Zicv_LY zOWg=K2mK}ESe-*y<8+Hi%%gFof3a}_?dZYX?bo~TyX(6L4<6jzJ$|r1ue7tgg!AD4 E0N6?eVE_OC literal 16880 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 diff --git a/toolchain/mfc/lint_source.py b/toolchain/mfc/lint_source.py index 059cf2c6b3..535119207a 100644 --- a/toolchain/mfc/lint_source.py +++ b/toolchain/mfc/lint_source.py @@ -312,121 +312,6 @@ def check_junk_comments(repo_root: Path) -> list[str]: return errors -def check_allocate_deallocate_pairing(repo_root: Path) -> list[str]: - """Flag @:ALLOCATE'd names in s_initialize_* with no matching @:DEALLOCATE in s_finalize_*. - - Only checks modules that have both an s_initialize_* and s_finalize_* subroutine. - Files without a finalize subroutine are skipped — those allocations are - program-lifetime by convention. - """ - errors: list[str] = [] - src_dir = repo_root / SRC_DIR - - allocate_re = re.compile(r"@:ALLOCATE\((\w[\w%]*)") - deallocate_re = re.compile(r"@:DEALLOCATE\((\w[\w%]*)") - init_re = re.compile(r"^\s*(?:impure\s+)?subroutine\s+s_initialize_\w+", re.IGNORECASE) - final_re = re.compile(r"^\s*(?:impure\s+)?subroutine\s+s_finalize_\w+", re.IGNORECASE) - end_sub_re = re.compile(r"^\s*end\s+subroutine\b", re.IGNORECASE) - - # Known pre-existing missing deallocations - KNOWN_MISSING = { - "gs_min", - "pi_infs", - "ps_inf", - "cvs", - "qvs", - "qvps", - "Gs_vc", - "data_in", - "data_out", - "data_cmplx", - "data_cmplx_y", - "data_cmplx_z", - "En_real", - "En", - "F_src_rsx_vf", - "flux_src_rsx_vf_l", - "F_src_rsy_vf", - "flux_src_rsy_vf_l", - "F_src_rsz_vf", - "flux_src_rsz_vf_l", - "pres_in", - "Del_in", - "alpha_rho_in", - "Rc_sf", - "data_cmplx_gpu", - "data_fltr_cmplx_gpu", - "qbmm_idx", - "qbmm_idx%ps", - "x_cc", - "dx", - "y_cc", - "dy", - "z_cc", - "dz", - "dw_dx_hypo", - "coeff_R", - "qR_rsx_vf", - "dqR_rsx_vf", - "gR_x", - "q_prim_ts2", - "poly_coef_cbR_x", - "d_cbR_x", - "poly_coef_cbR_y", - "d_cbR_y", - "poly_coef_cbR_z", - "d_cbR_z", - } - - for src in _fortran_fpp_files(src_dir): - lines = src.read_text(encoding="utf-8").splitlines() - rel = src.relative_to(repo_root) - - # Extract allocations from s_initialize_* subroutines - allocated: dict[str, int] = {} # name -> line number - deallocated: set[str] = set() - in_init = False - in_final = False - has_final = False - - for i, line in enumerate(lines): - stripped = line.strip() - if init_re.match(stripped): - in_init = True - in_final = False - elif final_re.match(stripped): - in_final = True - in_init = False - has_final = True - elif end_sub_re.match(stripped): - in_init = False - in_final = False - - if _is_comment_or_blank(stripped): - continue - - if in_init: - m = allocate_re.search(stripped) - if m: - name = m.group(1) - if name not in allocated: - allocated[name] = i + 1 - - if in_final: - m = deallocate_re.search(stripped) - if m: - deallocated.add(m.group(1)) - - if not has_final: - continue - - for name, lineno in allocated.items(): - if name not in deallocated and name not in KNOWN_MISSING: - errors.append(f" {rel}:{lineno} @:ALLOCATE({name}...) in s_initialize_* has no matching " f"@:DEALLOCATE in s_finalize_*. Fix: add @:DEALLOCATE in the finalize subroutine") - - return errors - - _BCAST_CALL_RE = re.compile(r"\bcall\s+MPI_BCAST\s*\(", re.IGNORECASE) _FYPP_FOR_RE = re.compile(r"#:\s*for\s+(\w+)\s+in\s+\[") _FYPP_ENDFOR_RE = re.compile(r"#:\s*endfor\b") @@ -564,7 +449,6 @@ def main(): all_errors.extend(check_fypp_list_duplicates(repo_root)) all_errors.extend(check_duplicate_lines(repo_root)) all_errors.extend(check_hardcoded_byte_size(repo_root)) - all_errors.extend(check_allocate_deallocate_pairing(repo_root)) all_errors.extend(check_manual_registry_bcasts(repo_root)) if all_errors: From 8308a00dcc1d0dccdd105934737831e0fec2e202 Mon Sep 17 00:00:00 2001 From: Spencer Bryngelson Date: Wed, 24 Jun 2026 12:21:32 -0700 Subject: [PATCH 8/9] Delete tests/coverage_map.json.gz --- tests/coverage_map.json.gz | Bin 16939 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/coverage_map.json.gz diff --git a/tests/coverage_map.json.gz b/tests/coverage_map.json.gz deleted file mode 100644 index 1a641d89513f2d1e8bd5ba13c8762ef74c88cd40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16939 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 E0N6?eVE_OC From c4414f3221d8920a70bdb3f31efc7c2cade23c3e Mon Sep 17 00:00:00 2001 From: Spencer Bryngelson Date: Wed, 24 Jun 2026 13:13:06 -0700 Subject: [PATCH 9/9] fix: deallocate fd_coeff/accel arrays under ib too (match alloc guard) --- src/simulation/m_derived_variables.fpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/simulation/m_derived_variables.fpp b/src/simulation/m_derived_variables.fpp index 42acbf7145..bf1837813c 100644 --- a/src/simulation/m_derived_variables.fpp +++ b/src/simulation/m_derived_variables.fpp @@ -508,7 +508,7 @@ contains end if end if - if (probe_wrt) then + if (probe_wrt .or. ib) then @:DEALLOCATE(accel_mag) @:DEALLOCATE(x_accel) if (n > 0) then