LCOV - code coverage report
Current view: | top level - chemistry/utils - solar_data.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 50 | 53 | 94.3 %
Date: | 2024-12-17 17:57:11 |  | Functions: | 3 | 3 | 100.0 %

              Line data    Source code
           1             : module solar_data
           2             :   use shr_kind_mod,   only: r8 => shr_kind_r8
           3             :   use shr_kind_mod,   only: shr_kind_cl
           4             :   use spmd_utils,     only: masterproc
           5             :   use cam_abortutils, only: endrun
           6             :   use cam_logfile,    only: iulog
           7             :   use phys_control,   only: use_simple_phys
           8             :
           9             :   implicit none
          10             :
          11             :   save
          12             :   private
          13             :   public :: solar_data_readnl
          14             :   public :: solar_data_init
          15             :   public :: solar_data_advance
          16             :
          17             :   character(len=shr_kind_cl) :: solar_irrad_data_file = 'NONE'
          18             :   character(len=shr_kind_cl) :: solar_parms_data_file = 'NONE'
          19             :   character(len=shr_kind_cl) :: solar_euv_data_file   = 'NONE'
          20             :   character(len=shr_kind_cl) :: solar_wind_data_file  = 'NONE'
          21             :
          22             :   character(len=8)   :: solar_data_type = 'SERIAL'      ! "FIXED" or "SERIAL"
          23             :   integer            :: solar_data_ymd = -99999999      ! YYYYMMDD for "FIXED" type
          24             :   integer            :: solar_data_tod = 0              ! seconds of day for "FIXED" type
          25             :   real(r8)           :: solar_const = -9999._r8         ! constant TSI (W/m2)
          26             :   logical            :: solar_htng_spctrl_scl = .false. ! do rad heating spectral scaling
          27             :
          28             :  contains
          29             :
          30             : !-----------------------------------------------------------------------
          31             : !-----------------------------------------------------------------------
          32      372480 :   subroutine solar_data_readnl( nlfile )
          33             :     use namelist_utils,  only: find_group_name
          34             :     use units,           only: getunit, freeunit
          35             :     use spmd_utils,      only: mpicom, masterprocid, mpi_character, mpi_integer, mpi_logical, mpi_real8
          36             :     use solar_parms_data,only: solar_parms_on
          37             :     use solar_wind_data, only: solar_wind_on
          38             :
          39             :     ! arguments
          40             :     character(len=*), intent(in) :: nlfile  ! filepath for file containing namelist input
          41             :
          42             :     ! local vars
          43             :     integer :: unitn, ierr
          44             :
          45             :     namelist /solar_data_opts/ &
          46             :          solar_irrad_data_file, solar_parms_data_file, solar_euv_data_file, solar_wind_data_file, &
          47             :          solar_data_type, solar_data_ymd, solar_data_tod, solar_const, solar_htng_spctrl_scl
          48             :
          49        1536 :     if (use_simple_phys) return
          50             :
          51        1536 :     if (masterproc) then
          52           2 :        unitn = getunit()
          53           2 :        open( unitn, file=trim(nlfile), status='old' )
          54           2 :        call find_group_name(unitn, 'solar_data_opts', status=ierr)
          55           2 :        if (ierr == 0) then
          56           2 :           read(unitn, solar_data_opts, iostat=ierr)
          57           2 :           if (ierr /= 0) then
          58           0 :              call endrun('solar_data_readnl: ERROR reading namelist')
          59             :           end if
          60             :        end if
          61           2 :        close(unitn)
          62           2 :        call freeunit(unitn)
          63             :     end if
          64             :
          65             :     ! broadcast the options to all MPI tasks
          66        1536 :     call mpi_bcast(solar_irrad_data_file, len(solar_irrad_data_file), mpi_character, masterprocid, mpicom, ierr)
          67        1536 :     call mpi_bcast(solar_parms_data_file, len(solar_parms_data_file), mpi_character, masterprocid, mpicom, ierr)
          68        1536 :     call mpi_bcast(solar_euv_data_file,   len(solar_euv_data_file),   mpi_character, masterprocid, mpicom, ierr)
          69        1536 :     call mpi_bcast(solar_wind_data_file,  len(solar_wind_data_file),  mpi_character, masterprocid, mpicom, ierr)
          70             :
          71        1536 :     call mpi_bcast(solar_data_type, len(solar_data_type), mpi_character, masterprocid, mpicom, ierr)
          72        1536 :     call mpi_bcast(solar_data_ymd,  1,                    mpi_integer,   masterprocid, mpicom, ierr)
          73        1536 :     call mpi_bcast(solar_data_tod,  1,                    mpi_integer,   masterprocid, mpicom, ierr)
          74        1536 :     call mpi_bcast(solar_const,     1,                    mpi_real8 ,    masterprocid, mpicom, ierr)
          75        1536 :     call mpi_bcast(solar_htng_spctrl_scl,1,               mpi_logical,   masterprocid, mpicom, ierr)
          76             :
          77        1536 :     if ( (solar_irrad_data_file.ne.'NONE') .and. (solar_const>0._r8) ) then
          78           0 :        call endrun('solar_data_readnl: ERROR cannot specify both solar_irrad_data_file and solar_const')
          79             :     endif
          80             :
          81        1536 :     if ( (solar_data_ymd>0 .or. solar_data_tod>0) .and. trim(solar_data_type)=='SERIAL' ) then
          82           0 :        call endrun('solar_data_readnl: ERROR cannot set solar_data_ymd or solar_data_tod with solar_data_type=SERIAL')
          83             :     endif
          84             :
          85        1536 :     if (masterproc) then
          86           2 :        write(iulog,*) 'solar_data_readnl: solar_const (W/m2) = ', solar_const
          87           2 :        write(iulog,*) 'solar_data_readnl: solar_irrad_data_file = ',trim(solar_irrad_data_file)
          88           2 :        write(iulog,*) 'solar_data_readnl: solar_parms_data_file = ',trim(solar_parms_data_file)
          89           2 :        write(iulog,*) 'solar_data_readnl: solar_euv_data_file = ',trim(solar_euv_data_file)
          90           2 :        write(iulog,*) 'solar_data_readnl: solar_wind_data_file = ',trim(solar_wind_data_file)
          91           2 :        write(iulog,*) 'solar_data_readnl: solar_data_type = ',trim(solar_data_type)
          92           2 :        write(iulog,*) 'solar_data_readnl: solar_data_ymd  = ',solar_data_ymd
          93           2 :        write(iulog,*) 'solar_data_readnl: solar_data_tod  = ',solar_data_tod
          94           2 :        write(iulog,*) 'solar_data_readnl: solar_htng_spctrl_scl  = ',solar_htng_spctrl_scl
          95             :     endif
          96             :
          97        1536 :     solar_parms_on = solar_parms_data_file.ne.'NONE'
          98        1536 :     solar_wind_on = solar_wind_data_file.ne.'NONE'
          99             :
         100        1536 :   end subroutine solar_data_readnl
         101             :
         102             : !-----------------------------------------------------------------------
         103             : !-----------------------------------------------------------------------
         104        1536 :   subroutine solar_data_init()
         105        1536 :     use solar_irrad_data, only: solar_irrad_init
         106             :     use solar_parms_data, only: solar_parms_init
         107             :     use solar_wind_data,  only: solar_wind_init
         108             :     use solar_euv_data,   only: solar_euv_init
         109             :
         110             :     logical :: fixed_solar
         111        1536 :     fixed_solar = trim(solar_data_type) == 'FIXED'
         112             :
         113             :     call solar_irrad_init( solar_irrad_data_file, fixed_solar, solar_data_ymd, solar_data_tod, &
         114        1536 :                            solar_const, solar_htng_spctrl_scl )
         115        1536 :     call solar_parms_init( solar_parms_data_file, fixed_solar, solar_data_ymd, solar_data_tod )
         116        1536 :     call solar_wind_init( solar_wind_data_file, fixed_solar, solar_data_ymd, solar_data_tod )
         117        1536 :     call solar_euv_init( solar_euv_data_file, fixed_solar, solar_data_ymd, solar_data_tod )
         118             :
         119        1536 :    end subroutine solar_data_init
         120             :
         121             : !-----------------------------------------------------------------------
         122             : !-----------------------------------------------------------------------
         123      370944 :    subroutine solar_data_advance()
         124             :
         125        1536 :      use solar_irrad_data, only: solar_irrad_advance
         126             :      use solar_parms_data, only: solar_parms_advance
         127             :      use solar_wind_data,  only: solar_wind_advance
         128             :      use solar_euv_data,   only: solar_euv_advance
         129             :
         130      370944 :      call solar_irrad_advance()
         131      370944 :      call solar_parms_advance()
         132      370944 :      call solar_wind_advance()
         133      370944 :      call solar_euv_advance()
         134             :
         135      370944 :    end subroutine solar_data_advance
         136             :
         137             : end module solar_data

Generated by: LCOV version 1.14