Skip to content

Commit

Permalink
Fix memory leaks identified by a PGI compiler (#2139)
Browse files Browse the repository at this point in the history
TYPE: bug fix

KEYWORDS: Memory Leaks

SOURCE: Charlie Li - Software developer from lakes environmental Canada

DESCRIPTION OF CHANGES:
Problem:
Memory leaks are detected in wrf_timeseries.F and start_em.F when use
PGI option:
-g -O0 -traceback -Mchkptr -Mbounds -Ktrap=fp -Msave -tp=px
It will failed for: "0: ALLOCATE: array already allocated"

1. In dyn_em/start_em.F, dz8w is allocated, but not deallocated.
2. In share/wrf_timeseries.F, two arrays, earth_u_profile and earth_v_profile, are allocated without being deallocated when time series is not computed.

Solution:
Calls to deallocate the array dz8w is added in start_em.F, and move the return statement before array allocation in wrf_timeseries.F.

LIST OF MODIFIED FILES: 
M     share/wrf_timeseries.F
M     dyn_em/start_em.F

TESTS CONDUCTED: 
The Jenkins tests are all passing.

RELEASE NOTE: This PR fixed memory leaks related to arrays being allocated without being deallocated in start_em and time series calculation subroutines.
  • Loading branch information
likeuclinux authored Feb 4, 2025
1 parent a0144bd commit 94aa27a
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 6 deletions.
1 change: 1 addition & 0 deletions dyn_em/start_em.F
Original file line number Diff line number Diff line change
Expand Up @@ -2001,6 +2001,7 @@ SUBROUTINE start_domain_em ( grid, allowed_to_read &
#endif
DEALLOCATE(z_at_q)
DEALLOCATE(dz8w)
IF (config_flags%p_lev_diags == PRESS_DIAGS ) THEN
CALL wrf_debug ( 200 , ' PLD: pressure level diags' )
Expand Down
16 changes: 10 additions & 6 deletions share/wrf_timeseries.F
Original file line number Diff line number Diff line change
Expand Up @@ -351,17 +351,21 @@ SUBROUTINE calc_ts( grid )
! FALSE to output T and Q at 2-m and wind at 10-m diagnostic levels:
LOGICAL, PARAMETER :: ts_model_level = .FALSE.

IF ( grid%ntsloc_domain .LE. 0 ) THEN
RETURN
END IF

#if ((EM_CORE == 1) && (DA_CORE != 1))
IF ( grid%dfi_opt /= DFI_NODFI .AND. grid%dfi_stage /= DFI_FST ) THEN
RETURN
END IF
#endif

!Allocate the arrays for wind components
#if ( EM_CORE == 1 )
ALLOCATE ( earth_u_profile(grid%max_ts_level), earth_v_profile(grid%max_ts_level) )
#endif

IF ( grid%ntsloc_domain .LE. 0 ) RETURN

#if ((EM_CORE == 1) && (DA_CORE != 1))
IF ( grid%dfi_opt /= DFI_NODFI .AND. grid%dfi_stage /= DFI_FST ) RETURN
#endif

n = grid%next_ts_time

ALLOCATE(p8w(grid%sm32:grid%em32))
Expand Down

0 comments on commit 94aa27a

Please sign in to comment.