!------------------------------------------------------------------------------- ! This module uses the Lean solar irradiance data to provide a solar cycle ! scaling factor used in heating rate calculations !------------------------------------------------------------------------------- module rad_solar_var 2,4 use shr_kind_mod , only : r8 => shr_kind_r8 use solar_data, only : sol_irrad, we, nbins, do_spctrl_scaling, ssi_ref use solar_data, only : has_spectrum, has_ref_spectrum use abortutils, only : endrun implicit none save private public :: rad_solar_var_init public :: get_variability real(r8), allocatable :: ref_band_irrad(:) ! scaling will be relative to ref_band_irrad in each band real(r8), allocatable :: irrad(:) ! solar irradiance at model timestep in each band real(r8), allocatable :: radbinmax(:) real(r8), allocatable :: radbinmin(:) integer :: nradbins contains !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- subroutine rad_solar_var_init( ) 1,13 use radconstants, only : get_number_sw_bands use radconstants, only : get_sw_spectral_boundaries use radconstants, only : get_ref_solar_band_irrad use radconstants, only : get_ref_total_solar_irrad integer :: i integer :: ierr integer :: yr, mon, tod call get_number_sw_bands(nradbins) if ( do_spctrl_scaling ) then if ( .not.has_spectrum ) then call endrun('rad_solar_var_init: solar input file must have irradiance spectrum') endif if ( .not.has_ref_spectrum ) then call endrun('rad_solar_var_init: solar input file must have reference irradiance spectrum') endif allocate (radbinmax(nradbins),stat=ierr) if (ierr /= 0) then call endrun('rad_solar_var_init: Error allocating space for radbinmax') end if allocate (radbinmin(nradbins),stat=ierr) if (ierr /= 0) then call endrun('rad_solar_var_init: Error allocating space for radbinmin') end if allocate (ref_band_irrad(nradbins), stat=ierr) if (ierr /= 0) then call endrun('rad_solar_var_init: Error allocating space for ref_band_irrad') end if allocate (irrad(nradbins), stat=ierr) if (ierr /= 0) then call endrun('rad_solar_var_init: Error allocating space for irrad') end if call get_sw_spectral_boundaries(radbinmin, radbinmax, 'nm') call integrate_spectrum( nbins, nradbins, we, radbinmin, radbinmax, ssi_ref, ref_band_irrad) endif endsubroutine rad_solar_var_init !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- subroutine get_variability( sfac ) 1,1 real(r8), intent(out) :: sfac(nradbins) ! scaling factors for CAM heating integer :: yr, mon, day, tod if ( do_spctrl_scaling ) then call integrate_spectrum( nbins, nradbins, we, radbinmin, radbinmax, sol_irrad, irrad) sfac(:nradbins) = irrad(:nradbins)/ref_band_irrad(:nradbins) else sfac(:nradbins) = 1._r8 endif endsubroutine get_variability !------------------------------------------------------------------------------- ! private method......... !------------------------------------------------------------------------------- subroutine integrate_spectrum( nsrc, ntrg, src_x, min_trg, max_trg, src, trg ) 2,2 use mo_util, only : rebin implicit none !--------------------------------------------------------------- ! ... dummy arguments !--------------------------------------------------------------- integer, intent(in) :: nsrc ! dimension source array integer, intent(in) :: ntrg ! dimension target array real(r8), intent(in) :: src_x(nsrc+1) ! source coordinates real(r8), intent(in) :: max_trg(ntrg) ! target coordinates real(r8), intent(in) :: min_trg(ntrg) ! target coordinates real(r8), intent(in) :: src(nsrc) ! source array real(r8), intent(out) :: trg(ntrg) ! target array !--------------------------------------------------------------- ! ... local variables !--------------------------------------------------------------- real(r8) :: trg_x(2), targ(1) ! target coordinates integer :: i do i = 1, ntrg trg_x(1) = min_trg(i) trg_x(2) = max_trg(i) call rebin( nsrc, 1, src_x, trg_x, src(1:nsrc), targ(:) ) ! W/m2/nm --> W/m2 trg( i ) = targ(1)*(trg_x(2)-trg_x(1)) enddo end subroutine integrate_spectrum endmodule rad_solar_var