Skip to content

Commit

Permalink
fixed bugs in summary modules identified by Colin Penn
Browse files Browse the repository at this point in the history
  • Loading branch information
rsregan committed Nov 12, 2024
1 parent 3069e2d commit a4cffec
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 97 deletions.
10 changes: 5 additions & 5 deletions GSFLOW/src/prms/basin_sum.f90
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ MODULE PRMS_BASINSUM
! Local Variables
character(len=*), parameter :: MODDESC = 'Output Summary'
character(len=9), parameter :: MODNAME = 'basin_sum'
character(len=*), parameter :: Version_basin_sum = '2024-04-30'
character(len=*), parameter :: Version_basin_sum = '2024-09-01'

INTEGER, SAVE :: BALUNT, Totdays
INTEGER, SAVE :: Header_prt, Endjday
Expand Down Expand Up @@ -504,13 +504,12 @@ INTEGER FUNCTION sumbrun()
INTRINSIC :: ABS, DBLE
EXTERNAL :: header_print
! Local variables
INTEGER :: i, j, wyday, endrun, monthdays
DOUBLE PRECISION :: wat_bal, obsrunoff, yrdays_dble
INTEGER :: i, j, wyday, endrun
DOUBLE PRECISION :: wat_bal, obsrunoff, yrdays_dble, monthdays
!***********************************************************************
sumbrun = 0

wyday = Julwater
yrdays_dble = DBLE( Yrdays )

IF ( Nowyear==End_year .AND. Jday==Endjday ) THEN
endrun = 1
Expand Down Expand Up @@ -634,7 +633,7 @@ INTEGER FUNCTION sumbrun()
Basin_lakeevap_mo = Basin_lakeevap_mo + Basin_lakeevap

IF ( Nowday==Modays(Nowmonth) ) THEN
monthdays = Modays(Nowmonth)
monthdays = DBLE( Modays(Nowmonth) )
Basin_swrad_mo = Basin_swrad_mo/monthdays
Basin_max_temp_mo = Basin_max_temp_mo/monthdays
Basin_min_temp_mo = Basin_min_temp_mo/monthdays
Expand Down Expand Up @@ -700,6 +699,7 @@ INTEGER FUNCTION sumbrun()
ENDDO

IF ( wyday==Yrdays ) THEN
yrdays_dble = DBLE( Yrdays )
IF ( Print_type==0 ) THEN

Obs_runoff_yr = Obs_runoff_yr/yrdays_dble
Expand Down
45 changes: 29 additions & 16 deletions GSFLOW/src/prms/basin_summary.f90
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@ MODULE PRMS_BASIN_SUMMARY
! Module Variables
character(len=*), parameter :: MODDESC = 'Output Summary'
character(len=*), parameter :: MODNAME = 'basin_summary'
character(len=*), parameter :: Version_basin_summary = '2021-08-13'
character(len=*), parameter :: Version_basin_summary = '2024-09-01'
INTEGER, SAVE :: Begin_results, Begyr, Lastyear, Dailyunit, Monthlyunit, Yearlyunit, Basin_var_type
INTEGER, SAVE, ALLOCATABLE :: Nc_vars(:)
CHARACTER(LEN=48), SAVE :: Output_fmt, Output_fmt2, Output_fmt3
INTEGER, SAVE :: Daily_flag, Yeardays, Monthly_flag
DOUBLE PRECISION, SAVE :: Monthdays
CHARACTER(LEN=48), SAVE :: Output_fmt, Output_fmt2 !, Output_fmt3
INTEGER, SAVE :: Daily_flag, Yeardays, Monthly_flag, Monthdays, save_year, save_month, save_day
DOUBLE PRECISION, SAVE, ALLOCATABLE :: Basin_var_daily(:), Basin_var_monthly(:), Basin_var_yearly(:)
! Parameters
INTEGER, SAVE, ALLOCATABLE :: Nhm_id(:)
Expand Down Expand Up @@ -95,7 +94,7 @@ END SUBROUTINE basin_summarydecl
!***********************************************************************
SUBROUTINE basin_summaryinit()
USE PRMS_CONSTANTS, ONLY: MAXFILE_LENGTH, ACTIVE, OFF, DAILY_MONTHLY, MEAN_MONTHLY, MEAN_YEARLY, DAILY, MONTHLY, &
& DBLE_TYPE, ERROR_open_out
& DBLE_TYPE, ERROR_open_out, YEARLY
use PRMS_MMFAPI, only: getvarsize, getvartype
use PRMS_READ_PARAM_FILE, only: getparam_int
USE PRMS_MODULE, ONLY: Start_year, Prms_warmup, BasinOutON_OFF, Nhru, Inputerror_flag
Expand Down Expand Up @@ -143,10 +142,10 @@ SUBROUTINE basin_summaryinit()
Yeardays = 0
ALLOCATE ( Basin_var_yearly(BasinOutVars) )
Basin_var_yearly = 0.0D0
WRITE ( Output_fmt3, 9003 ) BasinOutVars
!WRITE ( Output_fmt3, 9003 ) BasinOutVars
ENDIF
IF ( Monthly_flag==ACTIVE ) THEN
Monthdays = 0.0D0
Monthdays = 0
ALLOCATE ( Basin_var_monthly(BasinOutVars) )
Basin_var_monthly = 0.0D0
ENDIF
Expand Down Expand Up @@ -175,7 +174,7 @@ SUBROUTINE basin_summaryinit()
IF ( ios/=0 ) CALL error_stop('in basin_summary, mean yearly', ERROR_open_out)
IF ( BasinOutON_OFF==2 ) WRITE ( Yearlyunit, '(A, 1X, I0)') 'nhm_id:', Nhm_id(1)
WRITE ( Yearlyunit, Output_fmt2 ) (BasinOutVar_names(jj)(:Nc_vars(jj)), jj=1, BasinOutVars)
ELSEIF ( BasinOut_freq==MEAN_YEARLY ) THEN
ELSEIF ( BasinOut_freq==YEARLY ) THEN
fileName = BasinOutBaseFileName(:numchars(BasinOutBaseFileName))//'_yearly.csv'
CALL PRMS_open_output_file(Yearlyunit, fileName, 'basin_summary, yearly', 0, ios)
IF ( ios/=0 ) CALL error_stop('in basin_summary, yearly', ERROR_open_out)
Expand Down Expand Up @@ -203,14 +202,15 @@ END SUBROUTINE basin_summaryinit
! Output set of declared variables in CSV format
!***********************************************************************
SUBROUTINE basin_summaryrun()
USE PRMS_CONSTANTS, ONLY: ACTIVE, OFF, MEAN_MONTHLY, YEARLY
USE PRMS_CONSTANTS, ONLY: ACTIVE, OFF, MEAN_MONTHLY, MEAN_YEARLY
use PRMS_MMFAPI, only: getvar_dble
USE PRMS_MODULE, ONLY: Start_month, Start_day, End_year, End_month, End_day, Nowyear, Nowmonth, Nowday
USE PRMS_BASIN_SUMMARY
USE PRMS_SET_TIME, ONLY: Modays
IMPLICIT NONE
! Local Variables
INTEGER :: jj, write_month, last_day
DOUBLE PRECISION :: yeardays_dble, monthdays_dble
!***********************************************************************
IF ( Begin_results==OFF ) THEN
IF ( Nowyear==Begyr .AND. Nowmonth==Start_month .AND. Nowday==Start_day ) THEN
Expand All @@ -232,16 +232,28 @@ SUBROUTINE basin_summaryrun()
IF ( Nowyear==End_year .AND. Nowmonth==End_month .AND. Nowday==End_day ) last_day = ACTIVE
IF ( Lastyear/=Nowyear .OR. last_day==ACTIVE ) THEN
IF ( (Nowmonth==Start_month .AND. Nowday==Start_day) .OR. last_day==ACTIVE ) THEN
DO jj = 1, BasinOutVars
IF ( BasinOut_freq==YEARLY ) Basin_var_yearly(jj) = Basin_var_yearly(jj)/Yeardays
ENDDO
WRITE ( Yearlyunit, Output_fmt3) Lastyear, (Basin_var_yearly(jj), jj=1, BasinOutVars)
yeardays_dble = DBLE( Yeardays )
IF ( BasinOut_freq==MEAN_YEARLY ) THEN
DO jj = 1, BasinOutVars
Basin_var_yearly(jj) = Basin_var_yearly(jj)/yeardays_dble
ENDDO
ENDIF
IF ( last_day==ACTIVE ) THEN
save_year = Nowyear
save_month = Nowmonth
save_day = Nowday
ENDIF
!WRITE ( Yearlyunit, Output_fmt3) Lastyear, (Basin_var_yearly(jj), jj=1, BasinOutVars)
WRITE ( Yearlyunit, Output_fmt) save_year, save_month, save_day, (Basin_var_yearly(jj), jj=1, BasinOutVars)
Basin_var_yearly = 0.0D0
Yeardays = 0
Lastyear = Nowyear
ENDIF
ENDIF
Yeardays = Yeardays + 1
save_year = Nowyear
save_month = Nowmonth
save_day = Nowday
ELSEIF ( Monthly_flag==ACTIVE ) THEN
! check for last day of month and simulation
IF ( Nowday==Modays(Nowmonth) ) THEN
Expand All @@ -251,7 +263,7 @@ SUBROUTINE basin_summaryrun()
IF ( Nowday==End_day ) write_month = ACTIVE
ENDIF
ENDIF
Monthdays = Monthdays + 1.0D0
Monthdays = Monthdays + 1
ENDIF

IF ( BasinOut_freq>MEAN_MONTHLY ) THEN
Expand All @@ -262,18 +274,19 @@ SUBROUTINE basin_summaryrun()
ENDIF

IF ( Monthly_flag==ACTIVE ) THEN
monthdays_dble = DBLE( Monthdays )
DO jj = 1, BasinOutVars
Basin_var_monthly(jj) = Basin_var_monthly(jj) + Basin_var_daily(jj)
IF ( write_month==ACTIVE ) THEN
IF ( BasinOut_freq==MEAN_MONTHLY ) Basin_var_monthly(jj) = Basin_var_monthly(jj)/Monthdays
IF ( BasinOut_freq==MEAN_MONTHLY ) Basin_var_monthly(jj) = Basin_var_monthly(jj)/monthdays_dble
ENDIF
ENDDO
ENDIF

IF ( Daily_flag==ACTIVE ) WRITE ( Dailyunit, Output_fmt) Nowyear, Nowmonth, Nowday, (Basin_var_daily(jj), jj=1,BasinOutVars)
IF ( write_month==ACTIVE ) THEN
WRITE ( Monthlyunit, Output_fmt) Nowyear, Nowmonth, Nowday, (Basin_var_monthly(jj), jj=1,BasinOutVars)
Monthdays = 0.0D0
Monthdays = 0
Basin_var_monthly = 0.0D0
ENDIF

Expand Down
5 changes: 5 additions & 0 deletions GSFLOW/src/prms/nhru_summary.f90
Original file line number Diff line number Diff line change
Expand Up @@ -466,6 +466,11 @@ SUBROUTINE nhru_summaryrun()
ENDDO
ENDIF
ENDIF
IF ( last_day==ACTIVE ) THEN
save_year = Nowyear
save_month = Nowmonth
save_day = Nowday
ENDIF
CALL write_CBH_values(jj, Yearlyunit(jj), Nhru_var_type(jj), 3)
ENDDO
Nhru_var_yearly = 0.0D0
Expand Down
34 changes: 20 additions & 14 deletions GSFLOW/src/prms/nsegment_summary.f90
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,13 @@ MODULE PRMS_NSEGMENT_SUMMARY
! Module Variables
character(len=*), parameter :: MODDESC = 'Output Summary'
character(len=*), parameter :: MODNAME = 'nsegment_summary'
character(len=*), parameter :: Version_nsegment_summary = '2023-11-01'
character(len=*), parameter :: Version_nsegment_summary = '2024-09-01'
INTEGER, SAVE :: Begin_results, Begyr, Lastyear
INTEGER, SAVE, ALLOCATABLE :: Dailyunit(:), Nc_vars(:), Nsegment_var_type(:)
REAL, SAVE, ALLOCATABLE :: Nsegment_var_daily(:, :)
DOUBLE PRECISION, SAVE, ALLOCATABLE :: Nsegment_var_dble(:, :)
CHARACTER(LEN=48), SAVE :: Output_fmt, Output_fmt2 !, Output_fmt3
INTEGER, SAVE :: Daily_flag, Double_vars, Yeardays, Monthly_flag
DOUBLE PRECISION, SAVE :: Monthdays
INTEGER, SAVE :: Daily_flag, Double_vars, Yeardays, Monthly_flag, Monthdays
INTEGER, SAVE, ALLOCATABLE :: Monthlyunit(:), Yearlyunit(:)
DOUBLE PRECISION, SAVE, ALLOCATABLE :: Nsegment_var_monthly(:, :), Nsegment_var_yearly(:, :)
! Parameters
Expand Down Expand Up @@ -193,7 +192,7 @@ SUBROUTINE nsegment_summaryinit()
!ENDIF
ENDIF
IF ( Monthly_flag==ACTIVE ) THEN
Monthdays = 0.0D0
Monthdays = 0
ALLOCATE ( Nsegment_var_monthly(Nsegment, NsegmentOutVars), Monthlyunit(NsegmentOutVars) )
Nsegment_var_monthly = 0.0D0
Monthlyunit = 0
Expand Down Expand Up @@ -290,6 +289,7 @@ SUBROUTINE nsegment_summaryrun()
INTRINSIC :: SNGL, DBLE
! Local Variables
INTEGER :: j, i, jj, write_month, last_day, save_year, save_month, save_day
DOUBLE PRECISION :: yeardays_dble, monthdays_dble
!***********************************************************************
IF ( Begin_results==OFF ) THEN
IF ( Nowyear==Begyr .AND. Nowmonth==Start_month .AND. Nowday==Start_day ) THEN
Expand All @@ -304,14 +304,12 @@ SUBROUTINE nsegment_summaryrun()
DO jj = 1, NsegmentOutVars
IF ( Nsegment_var_type(jj)==REAL_TYPE ) THEN
CALL getvar_real(MODNAME, NsegmentOutVar_names(jj)(:Nc_vars(jj)), Nsegment, Nsegment_var_daily(:, jj))
Nsegment_var_dble(:, jj) = Nsegment_var_daily(:, jj)
ELSEIF ( Nsegment_var_type(jj)==DBLE_TYPE ) THEN
CALL getvar_dble(MODNAME, NsegmentOutVar_names(jj)(:Nc_vars(jj)), Nsegment, Nsegment_var_dble(:, jj))
DO i = 1, Nsegment
Nsegment_var_daily(i, jj) = SNGL( Nsegment_var_dble(i, jj) )
ENDDO
ENDIF
IF ( Daily_flag==ACTIVE ) WRITE ( Dailyunit(jj), Output_fmt) Nowyear, Nowmonth, Nowday, &
& (Nsegment_var_daily(j,jj), j=1,Nsegment)
& (Nsegment_var_dble(j,jj), j=1,Nsegment)
ENDDO

write_month = OFF
Expand All @@ -320,12 +318,19 @@ SUBROUTINE nsegment_summaryrun()
IF ( Nowyear==End_year .AND. Nowmonth==End_month .AND. Nowday==End_day ) last_day = ACTIVE
IF ( Lastyear/=Nowyear .OR. last_day==ACTIVE ) THEN
IF ( (Nowmonth==Start_month .AND. Nowday==Start_day) .OR. last_day==ACTIVE ) THEN
yeardays_dble = DBLE( Yeardays )
DO jj = 1, NsegmentOutVars
IF ( NsegmentOut_freq==MEAN_YEARLY ) THEN
DO i = 1, Nsegment
Nsegment_var_yearly(i, jj) = Nsegment_var_yearly(i, jj)/Yeardays
Nsegment_var_yearly(i, jj) = Nsegment_var_yearly(i, jj)/yeardays_dble
ENDDO
ENDIF
IF ( last_day==ACTIVE ) THEN
save_year = Nowyear
save_month = Nowmonth
save_day = Nowday
ENDIF
!WRITE ( Yearlyunit(jj), Output_fmt3) last_year, (Nsegment_var_yearly(j,jj), j=1,Nsegment)
WRITE ( Yearlyunit(jj), Output_fmt) save_year, save_month, save_day, (Nsegment_var_yearly(j,jj), j=1,Nsegment)
ENDDO
Nsegment_var_yearly = 0.0D0
Expand All @@ -346,24 +351,25 @@ SUBROUTINE nsegment_summaryrun()
IF ( Nowday==End_day ) write_month = ACTIVE
ENDIF
ENDIF
Monthdays = Monthdays + 1.0D0
Monthdays = Monthdays + 1
ENDIF

IF ( NsegmentOut_freq>MEAN_MONTHLY ) THEN
DO jj = 1, NsegmentOutVars
DO i = 1, Nsegment
Nsegment_var_yearly(i, jj) = Nsegment_var_yearly(i, jj) + DBLE( Nsegment_var_daily(i, jj) )
Nsegment_var_yearly(i, jj) = Nsegment_var_yearly(i, jj) + Nsegment_var_dble(i, jj)
ENDDO
ENDDO
RETURN
ENDIF

IF ( Monthly_flag==ACTIVE ) THEN
monthdays_dble = DBLE( Monthdays )
DO jj = 1, NsegmentOutVars
DO i = 1, Nsegment
Nsegment_var_monthly(i, jj) = Nsegment_var_monthly(i, jj) + DBLE( Nsegment_var_daily(i, jj) )
Nsegment_var_monthly(i, jj) = Nsegment_var_monthly(i, jj) + Nsegment_var_dble(i, jj)
IF ( write_month==ACTIVE ) THEN
IF ( NsegmentOut_freq==MEAN_MONTHLY ) Nsegment_var_monthly(i, jj) = Nsegment_var_monthly(i, jj)/Monthdays
IF ( NsegmentOut_freq==MEAN_MONTHLY ) Nsegment_var_monthly(i, jj) = Nsegment_var_monthly(i, jj)/monthdays_dble
ENDIF
ENDDO
ENDDO
Expand All @@ -374,7 +380,7 @@ SUBROUTINE nsegment_summaryrun()
WRITE ( Monthlyunit(jj), Output_fmt) Nowyear, Nowmonth, Nowday, &
& (Nsegment_var_monthly(j,jj), j=1,Nsegment)
ENDDO
Monthdays = 0.0D0
Monthdays = 0
Nsegment_var_monthly = 0.0D0
ENDIF

Expand Down
Loading

0 comments on commit a4cffec

Please sign in to comment.