LCOV - code coverage report
Current view: top level - physics/cam - co2_data_flux.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 40 0.0 %
Date: 2024-12-17 22:39:59 Functions: 0 4 0.0 %

          Line data    Source code
       1             : module co2_data_flux
       2             : 
       3             : !-------------------------------------------------------------------------------
       4             : ! utilities for reading and interpolating co2 surface fluxes
       5             : !-------------------------------------------------------------------------------
       6             : 
       7             :    use shr_kind_mod,     only: r8 => shr_kind_r8, cl => shr_kind_cl
       8             :    use input_data_utils, only: time_coordinate
       9             :    use cam_abortutils,   only: endrun
      10             : 
      11             :    implicit none
      12             :    private
      13             :    save
      14             : 
      15             :    ! Public interfaces
      16             :    public co2_data_flux_type
      17             : 
      18             :    public co2_data_flux_init
      19             :    public co2_data_flux_advance
      20             : 
      21             : !-------------------------------------------------------------------------------
      22             : 
      23             :    type :: co2_data_flux_type
      24             :       character(len=cl)     :: filename
      25             :       character(len=cl)     :: varname
      26             :       logical               :: initialized
      27             :       type(time_coordinate) :: time_coord
      28             :       real(r8), pointer     :: co2bdy(:,:,:)   ! bracketing data     (pcols,begchunk:endchunk,2)
      29             :       real(r8), pointer     :: co2flx(:,:)     ! Interpolated output (pcols,begchunk:endchunk)
      30             :    end type co2_data_flux_type
      31             : 
      32             :    ! dimension names for physics grid (physgrid)
      33             :    logical           :: dimnames_set = .false.
      34             :    character(len=8)  :: dim1name, dim2name
      35             : 
      36             : !===============================================================================
      37             : contains
      38             : !===============================================================================
      39             : 
      40           0 : subroutine co2_data_flux_init (input_file, varname, xin)
      41             : 
      42             : !-------------------------------------------------------------------------------
      43             : ! Initialize co2_data_flux_type instance
      44             : !   including initial read of input and interpolation to the current timestep
      45             : !-------------------------------------------------------------------------------
      46             : 
      47             :    use ioFileMod,        only: getfil
      48             :    use ppgrid,           only: begchunk, endchunk, pcols
      49             :    use cam_grid_support, only: cam_grid_id, cam_grid_check
      50             :    use cam_grid_support, only: cam_grid_get_dim_names
      51             : 
      52             :    ! Arguments
      53             :    character(len=*),          intent(in)    :: input_file
      54             :    character(len=*),          intent(in)    :: varname
      55             :    type(co2_data_flux_type),  intent(inout) :: xin
      56             : 
      57             :    ! Local variables
      58             :    integer  :: grid_id
      59             :    real(r8) :: dtime
      60             :    character(len=*), parameter :: subname = 'co2_data_flux_init'
      61             :    !----------------------------------------------------------------------------
      62             : 
      63           0 :    if (.not. dimnames_set) then
      64           0 :       grid_id = cam_grid_id('physgrid')
      65           0 :       if (.not. cam_grid_check(grid_id)) then
      66           0 :          call endrun(subname // ': ERROR: no "physgrid" grid')
      67             :       endif
      68           0 :       call cam_grid_get_dim_names(grid_id, dim1name, dim2name)
      69           0 :       dimnames_set = .true.
      70             :    end if
      71             : 
      72           0 :    call getfil(input_file, xin%filename)
      73           0 :    xin%varname = varname
      74           0 :    xin%initialized = .false.
      75             : 
      76           0 :    dtime = 1.0_r8 - 200.0_r8 / 86400.0_r8
      77           0 :    call xin%time_coord%initialize(input_file, delta_days=dtime)
      78             : 
      79             :    allocate( xin%co2bdy(pcols,begchunk:endchunk,2), &
      80           0 :              xin%co2flx(pcols,begchunk:endchunk)    )
      81             : 
      82           0 :    call co2_data_flux_advance(xin)
      83             : 
      84           0 :    xin%initialized = .true.
      85             : 
      86           0 : end subroutine co2_data_flux_init
      87             : 
      88             : !===============================================================================
      89             : 
      90           0 : subroutine co2_data_flux_advance (xin)
      91             : 
      92             : !-------------------------------------------------------------------------------
      93             : ! Advance the contents of a co2_data_flux_type instance
      94             : !   including reading new data, if necessary
      95             : !-------------------------------------------------------------------------------
      96             : 
      97           0 :    use cam_pio_utils,    only: cam_pio_openfile
      98             :    use ncdio_atm,        only: infld
      99             :    use pio,              only: file_desc_t, pio_nowrite, pio_closefile
     100             :    use ppgrid,           only: begchunk, endchunk, pcols
     101             : 
     102             :    ! Arguments
     103             :    type(co2_data_flux_type),  intent(inout) :: xin
     104             : 
     105             :    ! Local variables
     106             :    character(len=*), parameter :: subname = 'co2_data_flux_advance'
     107             :    logical           :: read_data
     108             :    integer           :: indx2_pre_adv
     109             :    type(file_desc_t) :: fh_co2_data_flux
     110             :    logical           :: found
     111             : 
     112             :    !----------------------------------------------------------------------------
     113             : 
     114           0 :    read_data = xin%time_coord%read_more() .or. .not. xin%initialized
     115             : 
     116           0 :    indx2_pre_adv = xin%time_coord%indxs(2)
     117             : 
     118           0 :    call xin%time_coord%advance()
     119             : 
     120           0 :    if ( read_data ) then
     121             : 
     122           0 :       call cam_pio_openfile(fh_co2_data_flux, trim(xin%filename), PIO_NOWRITE)
     123             : 
     124             :       ! read time-level 1
     125             :       ! skip the read if the needed vals are present in time-level 2
     126           0 :       if (xin%initialized .and. xin%time_coord%indxs(1) == indx2_pre_adv) then
     127           0 :          xin%co2bdy(:,:,1) = xin%co2bdy(:,:,2)
     128             :       else
     129             :          call infld(trim(xin%varname), fh_co2_data_flux, dim1name, dim2name, &
     130           0 :               1, pcols, begchunk, endchunk, xin%co2bdy(:,:,1), found, &
     131           0 :               gridname='physgrid', timelevel=xin%time_coord%indxs(1))
     132           0 :          if (.not. found) then
     133           0 :             call endrun(subname // ': ERROR: ' // trim(xin%varname) // ' not found')
     134             :          endif
     135             :       endif
     136             : 
     137             :       ! read time-level 2
     138             :       call infld(trim(xin%varname), fh_co2_data_flux, dim1name, dim2name, &
     139           0 :            1, pcols, begchunk, endchunk, xin%co2bdy(:,:,2), found, &
     140           0 :            gridname='physgrid', timelevel=xin%time_coord%indxs(2))
     141           0 :       if (.not. found) then
     142           0 :          call endrun(subname // ': ERROR: ' // trim(xin%varname) // ' not found')
     143             :       endif
     144             : 
     145           0 :       call pio_closefile(fh_co2_data_flux)
     146             :    endif
     147             : 
     148             :    ! interpolate between time-levels
     149             :    ! If time:bounds is in the dataset, and the dataset calendar is compatible with CAM's,
     150             :    ! then the time_coordinate class will produce time_coord%wghts(2) == 0.0,
     151             :    ! generating fluxes that are piecewise constant in time.
     152             : 
     153           0 :    if (xin%time_coord%wghts(2) == 0.0_r8) then
     154           0 :       xin%co2flx(:,:) = xin%co2bdy(:,:,1)
     155             :    else
     156           0 :       xin%co2flx(:,:) = xin%co2bdy(:,:,1) + &
     157           0 :            xin%time_coord%wghts(2) * (xin%co2bdy(:,:,2) - xin%co2bdy(:,:,1))
     158             :    endif
     159             : 
     160           0 : end subroutine co2_data_flux_advance
     161             : 
     162             : !===============================================================================
     163             : 
     164           0 : end module co2_data_flux

Generated by: LCOV version 1.14