LCOV - code coverage report
Current view: | top level - chemistry/utils - solar_wind_data.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 11 | 35 | 31.4 %
Date: | 2024-12-17 17:57:11 |  | Functions: | 2 | 2 | 100.0 %

              Line data    Source code
           1             : !-------------------------------------------------------------------------------
           2             : ! solar wind data -- IMF components, wind velocity and density
           3             : !-------------------------------------------------------------------------------
           4             : module solar_wind_data
           5             :
           6             :   use shr_kind_mod,     only : r8 => shr_kind_r8, shr_kind_cl
           7             :   use input_data_utils, only : time_coordinate
           8             :   use infnan,           only : nan, assignment(=)
           9             :
          10             :   implicit none
          11             :
          12             :   private
          13             :   save
          14             :
          15             :  ! public interface
          16             :
          17             :   public :: solar_wind_init
          18             :   public :: solar_wind_advance
          19             :
          20             :   logical, public :: solar_wind_on = .false.
          21             :
          22             :  ! time-interpolated quantities
          23             :
          24             :   real(r8), public, protected :: solar_wind_byimf
          25             :   real(r8), public, protected :: solar_wind_bzimf
          26             :   real(r8), public, protected :: solar_wind_swvel
          27             :   real(r8), public, protected :: solar_wind_swden
          28             :
          29             :  ! private data
          30             :
          31             :   real(r8), allocatable :: byimf_in(:)
          32             :   real(r8), allocatable :: bzimf_in(:)
          33             :   real(r8), allocatable :: swvel_in(:)
          34             :   real(r8), allocatable :: swden_in(:)
          35             :
          36             :   type(time_coordinate) :: time_coord
          37             :
          38             : contains
          39             :
          40        1536 :   subroutine solar_wind_init(filepath, fixed, fixed_ymd, fixed_tod)
          41             :     !---------------------------------------------------------------
          42             :     !   ... initialize solar parmaters
          43             :     !---------------------------------------------------------------
          44             :
          45             :     use ioFileMod
          46             :     use error_messages, only: alloc_err
          47             :     use cam_pio_utils,  only: cam_pio_openfile
          48             :     use pio,            only: file_desc_t, var_desc_t, pio_get_var, &
          49             :                               pio_inq_varid, pio_closefile, pio_nowrite
          50             :
          51             :     !---------------------------------------------------------------
          52             :     ! arguments
          53             :     !---------------------------------------------------------------
          54             :     character(len=*), intent(in) :: filepath
          55             :     logical, intent(in) :: fixed
          56             :     integer, intent(in) :: fixed_ymd
          57             :     integer, intent(in) :: fixed_tod
          58             :
          59             :     !---------------------------------------------------------------
          60             :     !   ... local variables
          61             :     !---------------------------------------------------------------
          62             :     type(file_desc_t)  :: ncid
          63             :     type(var_desc_t)  :: varid
          64             :     integer  :: astat
          65             :     character(len=shr_kind_cl) :: locfn
          66             :     integer :: ierr
          67             :
          68        1536 :     solar_wind_byimf = nan
          69        1536 :     solar_wind_bzimf = nan
          70        1536 :     solar_wind_swvel = nan
          71        1536 :     solar_wind_swden = nan
          72             :
          73        1536 :     solar_wind_on = (trim(filepath).ne.'NONE' .and. len_trim(filepath)>0)
          74             :
          75        1536 :     if (.not.solar_wind_on) return
          76             :
          77             :     !-----------------------------------------------------------------------
          78             :     !   ... readin the solar parms dataset
          79             :     !-----------------------------------------------------------------------
          80             :
          81           0 :     call getfil(filepath,  locfn, 0)
          82           0 :     call cam_pio_openfile ( ncid, locfn, PIO_NOWRITE)
          83             :
          84             :     call time_coord%initialize( filepath, fixed=fixed, fixed_ymd=fixed_ymd, &
          85           0 :                                 fixed_tod=fixed_tod, force_time_interp=.true. )
          86             :
          87             :     !---------------------------------------------------------------
          88             :     !   ... allocate and read solar parms
          89             :     !---------------------------------------------------------------
          90             :     allocate( byimf_in(time_coord%ntimes), bzimf_in(time_coord%ntimes), &
          91             :               swvel_in(time_coord%ntimes), swden_in(time_coord%ntimes), &
          92           0 :               stat=astat )
          93           0 :     if( astat /= 0 ) then
          94             :        call alloc_err( astat, 'solar_wind_init', 'byimf_in ... swden_in ', &
          95           0 :                        time_coord%ntimes )
          96             :     end if
          97             :
          98           0 :     ierr = pio_inq_varid( ncid, 'by', varid )
          99           0 :     ierr = pio_get_var( ncid, varid, byimf_in )
         100           0 :     ierr = pio_inq_varid( ncid, 'bz', varid )
         101           0 :     ierr = pio_get_var( ncid, varid, bzimf_in )
         102           0 :     ierr = pio_inq_varid( ncid, 'swvel', varid )
         103           0 :     ierr = pio_get_var( ncid, varid, swvel_in )
         104           0 :     ierr = pio_inq_varid( ncid, 'swden', varid )
         105           0 :     ierr = pio_get_var( ncid, varid, swden_in )
         106             :
         107           0 :     call pio_closefile( ncid )
         108             :
         109        3072 : end subroutine solar_wind_init
         110             :
         111      370944 : subroutine solar_wind_advance
         112             :   !---------------------------------------------------------------
         113             :   ! time interpolate space wx indices
         114             :   !---------------------------------------------------------------
         115             :
         116      370944 :   if (solar_wind_on) then
         117           0 :      call time_coord%advance()
         118             :     !  time interpolate
         119           0 :      solar_wind_byimf = time_coord%wghts(1)*byimf_in(time_coord%indxs(1)) &
         120           0 :                       + time_coord%wghts(2)*byimf_in(time_coord%indxs(2))
         121           0 :      solar_wind_bzimf = time_coord%wghts(1)*bzimf_in(time_coord%indxs(1)) &
         122           0 :                       + time_coord%wghts(2)*bzimf_in(time_coord%indxs(2))
         123           0 :      solar_wind_swvel = time_coord%wghts(1)*swvel_in(time_coord%indxs(1)) &
         124           0 :                       + time_coord%wghts(2)*swvel_in(time_coord%indxs(2))
         125           0 :      solar_wind_swden = time_coord%wghts(1)*swden_in(time_coord%indxs(1)) &
         126           0 :                       + time_coord%wghts(2)*swden_in(time_coord%indxs(2))
         127             :   endif
         128             :
         129        1536 : end subroutine solar_wind_advance
         130             :
         131             : end module solar_wind_data

Generated by: LCOV version 1.14