Skip to content
Snippets Groups Projects
out_var_stat.f 17.59 KiB
!*****************************************************************!
!*                                                               *!
!*              4C (FORESEE) Simulation Model                    *!
!*                                                               *!
!*                                                               *!
!*                    Subroutines for:                           *!
!*   output of variables with statistics for climate scenarios   *!
!*                                                               *!
!*   contains                                                    *!
!*   OUT_VAR_STAT  compressing of output variables               *!
!*   CALC_STAT     calculation of statistics                     *!
!*                  Copyright (C) 1996-2018                      *!
!*     Potsdam Institute for Climate Impact Reserach (PIK)       *!
!*          Authors and contributors see AUTHOR file             *!
!*  This file is part of 4C and is licensed under BSD-2-Clause   *!
!*                   See LICENSE file or under:                  *!
!*     http://www.https://opensource.org/licenses/BSD-2-Clause   *!
!*                           Contact:                            *!
!*       https://gitlab.pik-potsdam.de/foresee/4C                *!
!*                                                               *!
!*****************************************************************!

SUBROUTINE out_var_stat(kind, act_real)

! compressing of output variables with statistics (multi run 9, 10)
   use data_out
   use data_par
   use data_simul
   use data_site

  IMPLICIT NONE

  integer kind      ! 1 - aggregation per realisation (average)
                    ! 2 - aggregation per climate scenario over all realisations with statistics 
                    ! 3 - statistics per month over all years  
  integer act_real  ! number of actual realisation
  integer i, j, k, unit_nr, ii
  real varerr, help
  character(50) :: filename    ! complete name of output file
  real, dimension(nrreal) :: helparr
  real, dimension(year):: helpmon
  character(30) :: helpvar
  character(20) idtext, datei
  character(150) htext

! mit Numerical Recipies
      REAL:: adev,ave,var,  &
             curt=-99.      ,  &
             sdev=-99.      ,  &
             skew=0.

! Statistische Masszahlen fuer Klimaszen.-Realisierungen
real:: avcl,          & ! Mittelwert
       mincl,         & ! Minimum 
       maxcl,         & ! Maximum  
       median,        & ! Median
       stdevcl=-99. , & ! Standardabweichung  
       varicl,        & ! Streuung 
       varcocl          ! Variationskoeffizient 
real  quant05, quant95  ! 0.05 and 0.95 quantile
real, external :: mean, variance   

if (flag_trace) write (unit_trace, '(I4,I10,A,2I5)') iday, time_cur, ' out_var_stat ',kind,act_real

select case (kind)
case (1,2)
    if (output_unit_all .le.0) then    
         filename = trim(site_name1)//'_var_all.out'    
         output_unit_all   = getunit()
         open(output_unit_all,file=trim(dirout)//filename,status='replace')
         write (output_unit_all, '(A)') '#  Output of mean annual values for each site and each realization of climate scenarios'
         write (output_unit_all, '(A, I6)') '#  Simulation period (years):   ', year
         write (output_unit_all, '(A, I6)') '#  Number of climate scenarios: ', nrclim
         write (output_unit_all, '(A, I6)') '#  Number of realizations:      ', nrreal
         write (output_unit_all, *) 
         write (output_unit_all, '(A)', advance='no') '# Type_clim.scen.  Site_ip    Real.' 
         
         do i = 1, nvar-1
            select case (trim(outvar(i)))
            case ('AET_year','cwb_year','GPP_year','NEP_year','NPP_year','perc_year','PET_year','temp_year','TER_year','prec_year','resps_year')  
                 continue
           
            case ('AET_mon','cwb_mon','GPP_mon','NEP_mon','NPP_mon','perc_mon','PET_mon','temp_mon','TER_mon','prec_mon','resps_mon')  
                 continue
           
            case ('AET_week','cwb_week','GPP_week','NEP_week','NPP_week','perc_week','PET_week','temp_week','TER_week','prec_week','resps_week')  
                 continue
           
            case default
                 write (output_unit_all, '(A12)', advance='no') trim(outvar(i)) 
         
            end select
         enddo      

         write (output_unit_all, '(A)') ''
    endif

case (3)
  do i = 1, nvar-1
    if (output_unit_mon(i) .le.0) then     ! for monthly values
         filename = trim(site_name1)//'_'//trim(outvar(i))//'_stat.res'    
         output_unit_mon(i)   = getunit()
         open(output_unit_mon(i),file=trim(dirout)//filename,status='replace')
         write (output_unit_mon(i), '(A)') '#  Output of mean monthly values for '//trim(outvar(i))
         write (output_unit_mon(i), '(A, I6)') '#  Simulation period (years):   ', year
         varerr = 0
    endif
  enddo  
end select

select case (kind)

case (1)     ! after each realisation
  write (output_unit_all, '(2X, A15, 1X, A10, I5,2X)', advance = 'no') trim(typeclim(iclim)), sitenum(ip), act_real
  do i = 1, nvar-1
     select case (trim(outvar(i)))

     case ('AET_year','cwb_year','GPP_year','NEP_year','NPP_year','perc_year','PET_year','temp_year','TER_year','prec_year','resps_year')  
        ii = output_var(i,1,0) 
            do j = 1, year
                climszenyear(ii,ip,iclim,act_real,j) = output_var(i,1,j)
            enddo

     case ('AET_mon','cwb_mon','GPP_mon','NEP_mon','NPP_mon','perc_mon','PET_mon','temp_mon','TER_mon','prec_mon','resps_mon')  
        ii = output_var(i,1,0)
        do k = 1,12
            help = 0.
            do j = 1, year
                help = help + output_varm(ii,1,j,k)
            enddo
            help = help / year
            climszenmon(ii,ip,iclim,act_real,k) = help
        enddo

     case ('AET_week','cwb_week','GPP_week','NEP_week','NPP_week','perc_week','PET_week','temp_week','TER_week','prec_week','resps_week')  
        ii = output_var(i,1,0)
        do k = 1,52
            help = 0.
            do j = 1, year
                help = help + output_varw(ii,1,j,k)
            enddo
            help = help / year
            climszenweek(ii,ip,iclim,act_real,k) = help
        enddo

     case default
        help = 0.
       do j = 1, year
           help = help + output_var(i,1,j)
       enddo  ! j
       help = help / year
       climszenres(i,ip,iclim,act_real) = help
       write (output_unit_all, '(E12.4)', advance = 'no')  help
     end select    ! outvar
  end do  ! i
  write (output_unit_all, '(A)') ''

case (2)    ! am Ende der Simulation
  do i = 1, nvar-1

    if (output_unit(i) .lt. 0) then
        helpvar = outvar(i)
        call out_var_select(helpvar, varerr, unit_nr)
        if (varerr .ne. 0.) then
            output_unit(i) = unit_nr
            write (unit_nr, '(A, I6)') '#  Simulation period (years):   ', year
            write (unit_nr, '(A, I6)') '#  Number of climate scenarios: ', nrclim
            write (unit_nr, '(A, I6)') '#  Number of realizations:      ', nrreal
            
            select case (trim(outvar(i)))
            case ('AET_year','cwb_year','GPP_year','NEP_year','NPP_year','perc_year','PET_year','temp_year','TER_year','prec_year','resps_year')  
                    write (unit_nr, '(A)') '#  Statistics over all realizations for each year ' 
                    write (unit_nr, '(A)') '# Type_clim.scen.    Site_ip   Year        Mean     Minimum     Maximum    Variance  Var.Coeff.    Std.Dev.    Skewness      Excess 0.05-Quant. 0.95-Quant.     Median'
            
            case ('AET_mon','cwb_mon','GPP_mon','NEP_mon','NPP_mon','perc_mon','PET_mon','temp_mon','TER_mon','prec_mon','resps_mon')  
                    write (unit_nr, '(A)') '#  Statistics over all realizations and all years for each month '  
                    write (unit_nr, '(A)') '# Type_clim.scen.    Site_ip  Month        Mean     Minimum     Maximum    Variance  Var.Coeff.    Std.Dev.    Skewness      Excess 0.05-Quant. 0.95-Quant.     Median'

            case ('AET_week','cwb_week','GPP_week','NEP_week','NPP_week','perc_week','PET_week','temp_week','TER_week','prec_week','resps_week')  
                    write (unit_nr, '(A)') '#  Statistics over all realizations and all years for each week '  
                    write (unit_nr, '(A)') '# Type_clim.scen.    Site_ip   Week        Mean     Minimum     Maximum    Variance  Var.Coeff.    Std.Dev.    Skewness      Excess 0.05-Quant. 0.95-Quant.     Median'

             case default
                    write (unit_nr, '(A)') '#  Statistics over all realizations (mean of all years) '  
                    write (unit_nr, '(A)') '# Type_clim.scen.    Site_ip        Mean     Minimum     Maximum    Variance  Var.Coeff.    Std.Dev.    Skewness      Excess 0.05-Quant. 0.95-Quant.     Median'
            end select
        else
            write (*,*)
            write (*,*) '***  4C-error - output of variables (out_var_file): ', trim(outvar(i)), ' not found'
            write (*,*)
            write (unit_err,*)
            write (unit_err,*) '***  4C-error - no such output variable (out_var_file): ', trim(outvar(i))
        endif
    endif

    if (output_unit(i) .ge. 0) then
       select case (trim(outvar(i)))
            case ('AET_year','cwb_year','GPP_year','NEP_year','NPP_year','perc_year','PET_year','temp_year','TER_year','prec_year','resps_year')  
             ii = output_var(i,1,0)
            do k = 1, year 
               write (output_unit(i), '(2X, A15, 1X, A10, I7)', advance = 'no') trim(typeclim(iclim)),  sitenum(ip), k
               do j = 1, nrreal
                   helparr(j) = climszenyear(ii,ip,iclim,j,k)
               enddo
               call calc_stat(nrreal, helparr, output_unit(i))
            enddo
           
            case ('AET_mon','cwb_mon','GPP_mon','NEP_mon','NPP_mon','perc_mon','PET_mon','temp_mon','TER_mon','prec_mon','resps_mon')  
                ii = output_var(i,1,0)
                do k = 1, 12 
                   write (output_unit(i), '(2X, A15, 1X, A10, I7)', advance = 'no') trim(typeclim(iclim)),  sitenum(ip), k
                   do j = 1, nrreal
                       helparr(j) = climszenmon(ii,ip,iclim,j,k)
                   enddo
                   call calc_stat(nrreal, helparr, output_unit(i))
                enddo

            case ('AET_week','cwb_week','GPP_week','NEP_week','NPP_week','perc_week','PET_week','temp_week','TER_week','prec_week','resps_week')  
            ii = output_var(i,1,0)
            do k = 1, 52 
               write (output_unit(i), '(2X, A15, 1X, A10, I7)', advance = 'no') trim(typeclim(iclim)),  sitenum(ip), k
               do j = 1, nrreal
                   helparr(j) = climszenweek(ii,ip,iclim,j,k)
               enddo
               call calc_stat(nrreal, helparr, output_unit(i))
            enddo

       case default
           write (output_unit(i), '(2X, A15, 1X, A10)', advance = 'no') trim(typeclim(iclim)),  sitenum(ip)
           do j = 1, nrreal
               helparr(j) = climszenres(i,ip,iclim,j)
           enddo
               
           call calc_stat(nrreal, helparr, output_unit(i))
       end select
    endif
  enddo

case (3)     ! Monthly values
  do i = 1, nvar-1
     helpvar = outvar(i)
         select case (trim(outvar(i)))

         case ('AET_year','cwb_year','GPP_year','NEP_year','NPP_year','perc_year','PET_year','temp_year','TER_year','prec_year','resps_year')  
            ii = output_var(i,1,0) 
                do j = 1, year
                    climszenyear(ii,ip,iclim,act_real,j) = output_var(i,1,j)
                enddo

         case ('GPP_mon','NPP_mon','TER_mon')  
            ii = output_var(i,1,0)
            if (ip .eq.1) then
                write (output_unit_mon(i), '(A)') '# Statistics over all years for each month '  
                write (output_unit_mon(i), '(A)') '# g C/m '  
                write (output_unit_mon(i), '(A)') '# ipnr site_id             Month        Mean     Minimum     Maximum    Variance  Var.Coeff.    Std.Dev.    Skewness      Excess 0.05-Quant. 0.95-Quant.     Median'
            endif
            do k = 1,12
                help = 0.
                do j = 1, year
                    helpmon(j) = output_varm(ii,1,j,k) * 100.  ! tC/ha --> gC/m
                enddo
                htext  = adjustr(site_name(ip))
                idtext = adjustl(htext (131:150))   ! only write last 20 signs
                write (output_unit_mon(i), '(I5,2X, A20,I5)', advance = 'no') ip, idtext, k
                call calc_stat(year, helpmon, output_unit_mon(i))
            enddo

         case ('NEE_mon')  
            ii = output_var(i,1,0)
            if (ip .eq.1) then
                write (output_unit_mon(i), '(A)') '# Statistics over all years for each month '  
                write (output_unit_mon(i), '(A)') '# g C/m '  
                write (output_unit_mon(i), '(A)') '# ipnr site_id             Month        Mean     Minimum     Maximum    Variance  Var.Coeff.    Std.Dev.    Skewness      Excess 0.05-Quant. 0.95-Quant.     Median'
            endif
            do k = 1,12
                help = 0.
                do j = 1, year
                    helpmon(j) = output_varm(ii,1,j,k)      ! gC/m
                enddo
                htext  = adjustr(site_name(ip))
                idtext = adjustl(htext (131:150))   ! only write last 20 signs
                write (output_unit_mon(i), '(I5,2X, A20,I5)', advance = 'no') ip, idtext, k
                call calc_stat(year, helpmon, output_unit_mon(i))
            enddo

         case ('resps_mon')  
            ii = output_var(i,1,0)
            if (ip .eq.1) then
                write (output_unit_mon(i), '(A)') '# Statistics over all years for each month '  
                write (output_unit_mon(i), '(A)') '# g C/m '  
                write (output_unit_mon(i), '(A)') '# ipnr site_id             Month        Mean     Minimum     Maximum    Variance  Var.Coeff.    Std.Dev.    Skewness      Excess 0.05-Quant. 0.95-Quant.     Median'
            endif
            do k = 1,12
                help = 0.
                do j = 1, year
                    helpmon(j) = output_varm(ii,1,j,k) * kgha_in_gm2  ! kgC/ha --> gC/m
                enddo
                htext  = adjustr(site_name(ip))
                idtext = adjustl(htext (131:150))   ! only write last 20 signs
                write (output_unit_mon(i), '(I5,2X, A20,I5)', advance = 'no') ip, idtext, k
                call calc_stat(year, helpmon, output_unit_mon(i))
            enddo

         case ('AET_mon','cwb_mon','perc_mon','PET_mon','temp_mon','prec_mon')  
            ii = output_var(i,1,0)
            if (ip .eq.1) then
                write (output_unit_mon(i), '(A)') '# Statistics over all years for each month '  
                write (output_unit_mon(i), '(A)') '#  '  
                write (output_unit_mon(i), '(A)') '# ipnr site_id             Month        Mean     Minimum     Maximum    Variance  Var.Coeff.    Std.Dev.    Skewness      Excess 0.05-Quant. 0.95-Quant.     Median'
            endif
            do k = 1,12
                help = 0.
                do j = 1, year
                    helpmon(j) = output_varm(ii,1,j,k)
                enddo
                htext  = adjustr(site_name(ip))
                idtext = adjustl(htext (131:150))   ! only write last 20 signs
                write (output_unit_mon(i), '(I5,2X, A20,I5)', advance = 'no') ip, idtext, k
                call calc_stat(year, helpmon, output_unit_mon(i))
            enddo

         case ('AET_week','cwb_week','GPP_week','NEP_week','NPP_week','perc_week','PET_week','temp_week','TER_week','prec_week','resps_week')  
            ii = output_var(i,1,0)
            do k = 1,52
                help = 0.
                do j = 1, year
                    help = help + output_varw(ii,1,j,k)
                enddo
                help = help / year
                climszenweek(ii,ip,iclim,act_real,k) = help
            enddo
   
         case default
            help = 0.
           do j = 1, year
               help = help + output_var(i,1,j)
           enddo  ! j
           help = help / year
           climszenres(i,ip,iclim,act_real) = help
           write (output_unit_all, '(E12.4)', advance = 'no')  help
         end select    ! outvar
  end do  ! i
  write (output_unit_all, '(A)') ''
end select
END SUBROUTINE out_var_stat

!**************************************************************

SUBROUTINE calc_stat(nreal, helparr, outunit)
! calculate statistics
   use data_out
   use data_simul

  IMPLICIT NONE

integer :: outunit   ! output unit
integer :: nreal     ! number of elements
real, dimension(nreal) :: helparr   ! input-array with dimension nreal 

! with numerical recipies
      REAL:: adev,ave,var,  &
             curt=-99.      ,  &
             sdev=-99.      ,  &
             skew=0.

! statistical measurment figures for climate scenario realisation
real:: avcl,          & ! mean
       mincl,         & ! minimum 
       maxcl,         & ! maximum  
       median,        & ! median
       stdevcl=-99. , & ! standard deviation  
       varicl,        & ! dispersion
       varcocl          ! coefficient of variance 
real  quant05, quant95  ! 0.05 and 0.95 quantile
real, external :: mean, variance

    avcl    = mean(nreal, helparr)
    mincl   = minval(helparr)
    maxcl   = maxval(helparr)
    varicl  = variance(nreal, avcl, helparr)
    if (varicl .ge. 0.) stdevcl = sqrt(varicl)
    if (avcl .ne. 0.) then
        varcocl = stdevcl / avcl
    else
        varcocl = -9999.0
    endif
    call quantile(nreal, helparr, quant05, quant95, median)

! with numerical recipies
    if (nreal .gt. 1) call moment(helparr, nreal, ave,adev,sdev,var,skew,curt)
    write (outunit, '(11E12.4)')  avcl, mincl, maxcl, varicl, varcocl, sdev, skew, curt, quant05, quant95, median

END SUBROUTINE calc_stat