LCOV - code coverage report
Current view: top level - physics/camrt - rad_solar_var.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 4 35 11.4 %
Date: 2025-01-13 21:54:50 Functions: 1 3 33.3 %

          Line data    Source code
       1             : !-------------------------------------------------------------------------------
       2             : ! This module uses the Lean solar irradiance data to provide a solar cycle
       3             : ! scaling factor used in heating rate calculations 
       4             : !-------------------------------------------------------------------------------
       5             : module rad_solar_var
       6             : 
       7             :   use shr_kind_mod ,  only : r8 => shr_kind_r8
       8             :   use solar_irrad_data, only : sol_irrad, we, nbins, do_spctrl_scaling, ssi_ref
       9             :   use solar_irrad_data, only : has_spectrum, has_ref_spectrum
      10             :   use cam_abortutils, only : endrun
      11             : 
      12             :   implicit none
      13             :   save
      14             : 
      15             :   private
      16             :   public :: rad_solar_var_init
      17             :   public :: get_variability
      18             : 
      19             :   real(r8), allocatable :: ref_band_irrad(:)  ! scaling will be relative to ref_band_irrad in each band
      20             :   real(r8), allocatable :: irrad(:)           ! solar irradiance at model timestep in each band
      21             : 
      22             :   real(r8), allocatable :: radbinmax(:)
      23             :   real(r8), allocatable :: radbinmin(:)
      24             :   integer :: nradbins
      25             : 
      26             : !-------------------------------------------------------------------------------
      27             : contains
      28             : !-------------------------------------------------------------------------------
      29             : 
      30        1536 :   subroutine rad_solar_var_init( )
      31             :     use radconstants,  only : get_number_sw_bands
      32             :     use radconstants,  only : get_sw_spectral_boundaries
      33             :     use radconstants,  only : get_ref_solar_band_irrad
      34             :     use radconstants,  only : get_ref_total_solar_irrad
      35             : 
      36             :     integer :: i
      37             :     integer :: ierr
      38             :     integer :: yr, mon, tod
      39             : 
      40             : 
      41        1536 :     call get_number_sw_bands(nradbins)
      42             : 
      43        1536 :     if ( do_spctrl_scaling ) then
      44             : 
      45           0 :        if ( .not.has_spectrum ) then
      46           0 :           call endrun('rad_solar_var_init: solar input file must have irradiance spectrum')
      47             :        endif
      48             : 
      49           0 :        if ( .not.has_ref_spectrum ) then
      50           0 :           call endrun('rad_solar_var_init: solar input file must have reference irradiance spectrum')
      51             :        endif
      52             : 
      53           0 :        allocate (radbinmax(nradbins),stat=ierr)
      54           0 :        if (ierr /= 0) then
      55           0 :           call endrun('rad_solar_var_init: Error allocating space for radbinmax')
      56             :        end if
      57             : 
      58           0 :        allocate (radbinmin(nradbins),stat=ierr)
      59           0 :        if (ierr /= 0) then
      60           0 :           call endrun('rad_solar_var_init: Error allocating space for radbinmin')
      61             :        end if
      62             : 
      63           0 :        allocate (ref_band_irrad(nradbins), stat=ierr)
      64           0 :        if (ierr /= 0) then
      65           0 :           call endrun('rad_solar_var_init: Error allocating space for ref_band_irrad')
      66             :        end if
      67             : 
      68           0 :        allocate (irrad(nradbins), stat=ierr)
      69           0 :        if (ierr /= 0) then
      70           0 :           call endrun('rad_solar_var_init: Error allocating space for irrad')
      71             :        end if
      72             : 
      73           0 :        call get_sw_spectral_boundaries(radbinmin, radbinmax, 'nm')
      74             : 
      75           0 :        call integrate_spectrum( nbins, nradbins, we, radbinmin, radbinmax, ssi_ref, ref_band_irrad)
      76             : 
      77             :     endif
      78             : 
      79        1536 :   end subroutine rad_solar_var_init
      80             : 
      81             : !-------------------------------------------------------------------------------
      82             : !-------------------------------------------------------------------------------
      83           0 :   subroutine get_variability( sfac )
      84             : 
      85             :     real(r8), intent(out) :: sfac(nradbins)       ! scaling factors for CAM heating
      86             : 
      87             :     integer :: yr, mon, day, tod
      88             : 
      89           0 :     if ( do_spctrl_scaling ) then
      90             : 
      91           0 :       call integrate_spectrum( nbins, nradbins, we, radbinmin, radbinmax, sol_irrad, irrad)
      92             : 
      93           0 :       sfac(:nradbins) = irrad(:nradbins)/ref_band_irrad(:nradbins)
      94             : 
      95             :     else
      96             : 
      97           0 :        sfac(:nradbins) = 1._r8
      98             : 
      99             :     endif
     100             : 
     101           0 :   end subroutine get_variability
     102             : 
     103             : !-------------------------------------------------------------------------------
     104             : ! private method.........
     105             : !-------------------------------------------------------------------------------
     106             : 
     107           0 :   subroutine integrate_spectrum( nsrc, ntrg, src_x, min_trg, max_trg, src, trg )
     108             : 
     109             :     use mo_util, only : rebin
     110             : 
     111             :     implicit none
     112             : 
     113             :     !---------------------------------------------------------------
     114             :     !   ... dummy arguments
     115             :     !---------------------------------------------------------------
     116             :     integer,  intent(in)  :: nsrc                  ! dimension source array
     117             :     integer,  intent(in)  :: ntrg                  ! dimension target array
     118             :     real(r8), intent(in)  :: src_x(nsrc+1)         ! source coordinates
     119             :     real(r8), intent(in)  :: max_trg(ntrg)         ! target coordinates
     120             :     real(r8), intent(in)  :: min_trg(ntrg)         ! target coordinates
     121             :     real(r8), intent(in)  :: src(nsrc)             ! source array
     122             :     real(r8), intent(out) :: trg(ntrg)             ! target array
     123             :  
     124             :     !---------------------------------------------------------------
     125             :     !   ... local variables
     126             :     !---------------------------------------------------------------
     127             :     real(r8) :: trg_x(2), targ(1)         ! target coordinates
     128             :     integer  :: i
     129             : 
     130           0 :     do i = 1, ntrg
     131             : 
     132           0 :        trg_x(1) = min_trg(i)
     133           0 :        trg_x(2) = max_trg(i)
     134             : 
     135           0 :        call rebin( nsrc, 1, src_x, trg_x, src(1:nsrc), targ(:) )
     136             :        ! W/m2/nm --> W/m2
     137           0 :        trg( i ) = targ(1)*(trg_x(2)-trg_x(1))
     138             : 
     139             :     enddo
     140             : 
     141             : 
     142           0 :   end subroutine integrate_spectrum
     143             : 
     144             : end module rad_solar_var

Generated by: LCOV version 1.14