LCOV - code coverage report
Current view: | top level - chemistry/utils - aerodep_flx.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 120 | 186 | 64.5 %
Date: | 2024-12-17 17:57:11 |  | Functions: | 7 | 9 | 77.8 %

              Line data    Source code
           1             : !-------------------------------------------------------------------
           2             : ! Manages reading and interpolation of prescribed aerosol deposition
           3             : ! fluxes.  These are the deposition fluxes sent to the surface.
           4             : !
           5             : ! Created by: Francis Vitt
           6             : !-------------------------------------------------------------------
           7             : module aerodep_flx
           8             :
           9             :   use shr_kind_mod,     only : r8 => shr_kind_r8
          10             :   use cam_abortutils,   only : endrun
          11             :   use spmd_utils,       only : masterproc
          12             :   use tracer_data,      only : trfld, trfile
          13             :   use cam_logfile,      only : iulog
          14             :   use ppgrid,           only : pcols, pver, begchunk, endchunk
          15             :
          16             :   implicit none
          17             :   private
          18             :   save
          19             :
          20             :   type(trfld), pointer :: fields(:)
          21             :   type(trfile)         :: file
          22             :
          23             :   public :: aerodep_flx_init
          24             :   public :: aerodep_flx_adv
          25             :   public :: aerodep_flx_readnl
          26             :   public :: aerodep_flx_prescribed
          27             :
          28             :   logical :: has_aerodep_flx = .false.
          29             :   integer, parameter, public :: N_BULK = 14
          30             :   integer, parameter, public :: N_MODAL = 22
          31             :   integer :: number_flds
          32             :
          33             :   character(len=256) :: filename = 'NONE'
          34             :   character(len=256) :: filelist = ' '
          35             :   character(len=256) :: datapath = ' '
          36             :   character(len=32)  :: datatype = 'SERIAL'
          37             :   logical            :: rmv_file = .false.
          38             :   integer            :: cycle_yr = 0
          39             :   integer            :: fixed_ymd = 0
          40             :   integer            :: fixed_tod = 0
          41             :   character(len=32)  :: specifier(N_MODAL) = ' '
          42             :
          43             :   ! for bulk aerosol fluxes
          44             :
          45             :   character(len=12), parameter :: bulk_names(N_BULK) = (/ &
          46             :        'BCDEPWET    ', 'BCPHODRY    ', 'BCPHIDRY    ',  &
          47             :        'OCDEPWET    ', 'OCPHODRY    ', 'OCPHIDRY    ',  &
          48             :        'DSTX01DD    ', 'DSTX02DD    ', 'DSTX03DD    ', 'DSTX04DD    ', &
          49             :        'DSTX01WD    ', 'DSTX02WD    ', 'DSTX03WD    ', 'DSTX04WD    ' /)
          50             :
          51             :   integer :: index_bulk_map(N_BULK)
          52             :
          53             :   integer :: ibcphiwet,ibcphidry,ibcphodry
          54             :   integer :: iocphiwet,iocphidry,iocphodry
          55             :
          56             :   integer :: idstdry1,idstdry2,idstdry3,idstdry4
          57             :   integer :: idstwet1,idstwet2,idstwet3,idstwet4
          58             :
          59             :   ! for modal aerosol fluxes
          60             :
          61             :   character(len=12), parameter :: modal_names(N_MODAL) = (/ &
          62             :        'bc_a1DDF    ', 'bc_c1DDF    ', 'pom_a1DDF   ', 'pom_c1DDF   ',  &
          63             :        'soa_a1DDF   ', 'soa_c1DDF   ', 'soa_a2DDF   ', 'soa_c2DDF   ',  &
          64             :        'dst_a1DDF   ', 'dst_c1DDF   ', 'dst_a3DDF   ', 'dst_c3DDF   ',  &
          65             :        'bc_a1SFWET  ', 'bc_c1SFWET  ', 'pom_a1SFWET ', 'pom_c1SFWET ',  &
          66             :        'soa_a1SFWET ', 'soa_c1SFWET ', 'dst_a1SFWET ', 'dst_c1SFWET ',  &
          67             :        'dst_a3SFWET ', 'dst_c3SFWET ' /)
          68             :
          69             :   integer :: index_modal_map(N_MODAL)
          70             :
          71             :   integer, parameter :: idx_bc1 = 1
          72             :   integer, parameter :: idx_pom1 = 2
          73             :   integer, parameter :: idx_soa1 = 3
          74             :   integer, parameter :: idx_soa2 = 4
          75             :   integer, parameter :: idx_dst1 = 5
          76             :   integer, parameter :: idx_dst3 = 6
          77             :   integer, parameter :: idx_ncl3 = 7
          78             :   integer, parameter :: idx_so43 = 8
          79             :
          80             :   integer, parameter :: nmodal_idxs = 8
          81             :
          82             :   integer :: idx_bc1_dryis = -1
          83             :   integer :: idx_bc1_drycw = -1
          84             :   integer :: idx_pom1_dryis = -1
          85             :   integer :: idx_pom1_drycw = -1
          86             :   integer :: idx_soa1_dryis = -1
          87             :   integer :: idx_soa1_drycw = -1
          88             :   integer :: idx_soa2_dryis = -1
          89             :   integer :: idx_soa2_drycw = -1
          90             :   integer :: idx_dst1_dryis = -1
          91             :   integer :: idx_dst1_drycw = -1
          92             :   integer :: idx_dst3_dryis = -1
          93             :   integer :: idx_dst3_drycw = -1
          94             :
          95             :   integer :: idx_bc1_wetis = -1
          96             :   integer :: idx_bc1_wetcw = -1
          97             :   integer :: idx_pom1_wetis = -1
          98             :   integer :: idx_pom1_wetcw = -1
          99             :   integer :: idx_soa1_wetis = -1
         100             :   integer :: idx_soa1_wetcw = -1
         101             :   integer :: idx_dst1_wetis = -1
         102             :   integer :: idx_dst1_wetcw = -1
         103             :   integer :: idx_dst3_wetis = -1
         104             :   integer :: idx_dst3_wetcw = -1
         105             :
         106             :   logical :: modal_fluxes = .false.
         107             :
         108             : contains
         109             :
         110             : !-------------------------------------------------------------------
         111             : ! parses the list of dep fluxes specified in aerodep_flx_specifier namelist
         112             : ! variable and sets up index variables
         113             : !-------------------------------------------------------------------
         114        1536 :   subroutine aerodep_flx_init()
         115             :
         116             :     use tracer_data, only : trcdata_init
         117             :     use cam_history, only : addfld, horiz_only
         118             :     use physics_buffer, only : physics_buffer_desc
         119             :     use modal_aero_deposition, only : modal_aero_deposition_init
         120             :
         121             :     implicit none
         122             :
         123             :     integer :: ndx, istat, i
         124             :
         125        1536 :     if ( has_aerodep_flx ) then
         126        1536 :        if ( masterproc ) then
         127           2 :           write(iulog,*) 'aero dep fluxes are prescribed in :'//trim(filename)
         128             :        endif
         129             :     else
         130             :        return
         131             :     endif
         132             :
         133        1536 :     allocate(file%in_pbuf(size(specifier)))
         134       35328 :     file%in_pbuf(:) = .false.
         135             :     call trcdata_init( specifier, filename, filelist, datapath, fields, file, &
         136        1536 :                        rmv_file, cycle_yr, fixed_ymd, fixed_tod, datatype)
         137             :
         138        1536 :     number_flds = 0
         139        1536 :     if (associated(fields)) number_flds = size( fields )
         140             :
         141        1536 :     if( number_flds < 1 ) then
         142           0 :        has_aerodep_flx = .false.
         143           0 :        if (masterproc) then
         144           0 :           write(iulog,*) 'aerodep_flx_init: no aerosol deposition fluxes have been specified'
         145             :        endif
         146           0 :        return
         147             :     end if
         148             :
         149       23040 :     index_bulk_map(:) = -1
         150       35328 :     index_modal_map(:) = -1
         151             :
         152       23040 :     do i = 1,number_flds
         153             :
         154       21504 :        ndx = get_ndx( fields(i)%fldnam, bulk_names )
         155       21504 :        if (ndx >0) then
         156       21504 :           index_bulk_map(ndx) = i
         157             :        else
         158           0 :           ndx = get_ndx( fields(i)%fldnam, modal_names )
         159           0 :           if (ndx >0) then
         160           0 :              index_modal_map(ndx) = i
         161             :           endif
         162             :        endif
         163       23040 :        if (ndx>0) then
         164       21504 :           call addfld(trim(fields(i)%fldnam)//'_D', horiz_only, 'A',fields(i)%units, 'prescribed aero dep' )
         165             :        else
         166           0 :           call endrun('aerodep_flx_init: aerosol flux name not recognized: '//trim(fields(i)%fldnam))
         167             :        endif
         168             :     enddo
         169             :
         170       35328 :     modal_fluxes = any(index_modal_map(:)>0)
         171             :
         172        1536 :     if (modal_fluxes) then
         173             :
         174           0 :        idx_bc1_dryis  = index_modal_map(1)
         175           0 :        idx_bc1_drycw  = index_modal_map(2)
         176           0 :        idx_pom1_dryis = index_modal_map(3)
         177           0 :        idx_pom1_drycw = index_modal_map(4)
         178           0 :        idx_soa1_dryis = index_modal_map(5)
         179           0 :        idx_soa1_drycw = index_modal_map(6)
         180           0 :        idx_soa2_dryis = index_modal_map(7)
         181           0 :        idx_soa2_drycw = index_modal_map(8)
         182           0 :        idx_dst1_dryis = index_modal_map(9)
         183           0 :        idx_dst1_drycw = index_modal_map(10)
         184           0 :        idx_dst3_dryis = index_modal_map(11)
         185           0 :        idx_dst3_drycw = index_modal_map(12)
         186             :
         187           0 :        idx_bc1_wetis  = index_modal_map(13)
         188           0 :        idx_bc1_wetcw  = index_modal_map(14)
         189           0 :        idx_pom1_wetis = index_modal_map(15)
         190           0 :        idx_pom1_wetcw = index_modal_map(16)
         191           0 :        idx_soa1_wetis = index_modal_map(17)
         192           0 :        idx_soa1_wetcw = index_modal_map(18)
         193           0 :        idx_dst1_wetis = index_modal_map(19)
         194           0 :        idx_dst1_wetcw = index_modal_map(20)
         195           0 :        idx_dst3_wetis = index_modal_map(21)
         196           0 :        idx_dst3_wetcw = index_modal_map(22)
         197             :
         198             :        call modal_aero_deposition_init( bcphi_indices=(/idx_bc1/), &
         199             :                                         ocphi_indices=(/idx_pom1,idx_soa1/), &
         200             :                                         ocpho_indices=(/idx_soa2/), &
         201             :                                         fine_dust_indices=(/idx_dst1/),&
         202           0 :                                         crse_dust_indices=(/idx_dst3/) )
         203             :
         204             :     else
         205             :
         206        1536 :        ibcphiwet = index_bulk_map(1)
         207        1536 :        ibcphodry = index_bulk_map(2)
         208        1536 :        ibcphidry = index_bulk_map(3)
         209        1536 :        iocphiwet = index_bulk_map(4)
         210        1536 :        iocphodry = index_bulk_map(5)
         211        1536 :        iocphidry = index_bulk_map(6)
         212        1536 :        idstdry1  = index_bulk_map(7)
         213        1536 :        idstdry2  = index_bulk_map(8)
         214        1536 :        idstdry3  = index_bulk_map(9)
         215        1536 :        idstdry4  = index_bulk_map(10)
         216        1536 :        idstwet1  = index_bulk_map(11)
         217        1536 :        idstwet2  = index_bulk_map(12)
         218        1536 :        idstwet3  = index_bulk_map(13)
         219        1536 :        idstwet4  = index_bulk_map(14)
         220             :
         221             :     endif
         222             :
         223        1536 :   end subroutine aerodep_flx_init
         224             :
         225             : !-------------------------------------------------------------------
         226             : ! sets namelist options
         227             : !-------------------------------------------------------------------
         228        1536 : subroutine aerodep_flx_readnl(nlfile)
         229             :
         230        1536 :    use namelist_utils,  only: find_group_name
         231             :    use units,           only: getunit, freeunit
         232             :    use mpishorthand
         233             :
         234             :    character(len=*), intent(in) :: nlfile  ! filepath for file containing namelist input
         235             :
         236             :    ! Local variables
         237             :    integer :: unitn, ierr
         238             :    character(len=*), parameter :: subname = 'aerodep_flx_readnl'
         239             :
         240             :    character(len=32)  :: aerodep_flx_specifier(N_MODAL)
         241             :    character(len=256) :: aerodep_flx_file
         242             :    character(len=256) :: aerodep_flx_filelist
         243             :    character(len=256) :: aerodep_flx_datapath
         244             :    character(len=32)  :: aerodep_flx_type
         245             :    logical            :: aerodep_flx_rmfile
         246             :    integer            :: aerodep_flx_cycle_yr
         247             :    integer            :: aerodep_flx_fixed_ymd
         248             :    integer            :: aerodep_flx_fixed_tod
         249             :
         250             :    namelist /aerodep_flx_nl/ &
         251             :       aerodep_flx_specifier, &
         252             :       aerodep_flx_file,      &
         253             :       aerodep_flx_filelist,  &
         254             :       aerodep_flx_datapath,  &
         255             :       aerodep_flx_type,      &
         256             :       aerodep_flx_rmfile,    &
         257             :       aerodep_flx_cycle_yr,  &
         258             :       aerodep_flx_fixed_ymd, &
         259             :       aerodep_flx_fixed_tod
         260             :    !-----------------------------------------------------------------------------
         261             :
         262             :    ! Initialize namelist variables from local module variables.
         263       35328 :    aerodep_flx_specifier= specifier
         264        1536 :    aerodep_flx_file     = filename
         265        1536 :    aerodep_flx_filelist = filelist
         266        1536 :    aerodep_flx_datapath = datapath
         267        1536 :    aerodep_flx_type     = datatype
         268        1536 :    aerodep_flx_rmfile   = rmv_file
         269        1536 :    aerodep_flx_cycle_yr = cycle_yr
         270        1536 :    aerodep_flx_fixed_ymd= fixed_ymd
         271        1536 :    aerodep_flx_fixed_tod= fixed_tod
         272             :
         273             :    ! Read namelist
         274        1536 :    if (masterproc) then
         275           2 :       unitn = getunit()
         276           2 :       open( unitn, file=trim(nlfile), status='old' )
         277           2 :       call find_group_name(unitn, 'aerodep_flx_nl', status=ierr)
         278           2 :       if (ierr == 0) then
         279           2 :          read(unitn, aerodep_flx_nl, iostat=ierr)
         280           2 :          if (ierr /= 0) then
         281           0 :             call endrun(subname // ':: ERROR reading namelist')
         282             :          end if
         283             :       end if
         284           2 :       close(unitn)
         285           2 :       call freeunit(unitn)
         286             :    end if
         287             :
         288             : #ifdef SPMD
         289             :    ! Broadcast namelist variables
         290        1536 :    call mpibcast(aerodep_flx_specifier,len(aerodep_flx_specifier(1))*N_MODAL,     mpichar, 0, mpicom)
         291        1536 :    call mpibcast(aerodep_flx_file,     len(aerodep_flx_file),     mpichar, 0, mpicom)
         292        1536 :    call mpibcast(aerodep_flx_filelist, len(aerodep_flx_filelist), mpichar, 0, mpicom)
         293        1536 :    call mpibcast(aerodep_flx_datapath, len(aerodep_flx_datapath), mpichar, 0, mpicom)
         294        1536 :    call mpibcast(aerodep_flx_type,     len(aerodep_flx_type),     mpichar, 0, mpicom)
         295        1536 :    call mpibcast(aerodep_flx_rmfile,   1, mpilog,  0, mpicom)
         296        1536 :    call mpibcast(aerodep_flx_cycle_yr, 1, mpiint,  0, mpicom)
         297        1536 :    call mpibcast(aerodep_flx_fixed_ymd,1, mpiint,  0, mpicom)
         298        1536 :    call mpibcast(aerodep_flx_fixed_tod,1, mpiint,  0, mpicom)
         299             : #endif
         300             :
         301             :    ! Update module variables with user settings.
         302       35328 :    specifier  = aerodep_flx_specifier
         303        1536 :    filename   = aerodep_flx_file
         304        1536 :    filelist   = aerodep_flx_filelist
         305        1536 :    datapath   = aerodep_flx_datapath
         306        1536 :    datatype   = aerodep_flx_type
         307        1536 :    rmv_file   = aerodep_flx_rmfile
         308        1536 :    cycle_yr   = aerodep_flx_cycle_yr
         309        1536 :    fixed_ymd  = aerodep_flx_fixed_ymd
         310        1536 :    fixed_tod  = aerodep_flx_fixed_tod
         311             :
         312             :    ! Turn on prescribed volcanics if user has specified an input dataset.
         313        1536 :    if (len_trim(filename) > 0 .and. filename.ne.'NONE' ) has_aerodep_flx = .true.
         314             :
         315        1536 : end subroutine aerodep_flx_readnl
         316             :
         317             : !-------------------------------------------------------------------
         318             : ! sets the aerosol deposition fluxes in the cam_out structure
         319             : ! to be sent to the surface models
         320             : !-------------------------------------------------------------------
         321     1495368 :   subroutine aerodep_flx_set( cam_out, ncol, lchnk )
         322             :     use camsrfexch,       only : cam_out_t
         323             :
         324             :     type(cam_out_t),     intent(inout) :: cam_out
         325             :     integer,             intent(in)    :: ncol, lchnk
         326             :
         327     1495368 :     if( .not. has_aerodep_flx ) return
         328             :
         329     1495368 :     if (modal_fluxes) then
         330           0 :        call set_modal_fluxes( cam_out, ncol, lchnk )
         331             :     else
         332     1495368 :        call set_bulk_fluxes( cam_out, ncol, lchnk )
         333             :     endif
         334             :
         335     1495368 :   end subroutine aerodep_flx_set
         336             :
         337             : !-------------------------------------------------------------------
         338             : ! advances the prescribed fluxes to the current time step
         339             : !-------------------------------------------------------------------
         340      741888 :   subroutine aerodep_flx_adv( state, pbuf2d, cam_out )
         341             :
         342     1495368 :     use tracer_data,      only : advance_trcdata
         343             :     use physics_types,    only : physics_state
         344             :     use camsrfexch,       only : cam_out_t
         345             :     use physics_buffer, only : physics_buffer_desc
         346             :
         347             :     implicit none
         348             :
         349             :     type(physics_state), intent(in)    :: state(begchunk:endchunk)
         350             :     type(cam_out_t),     intent(inout) :: cam_out(begchunk:endchunk)
         351             :     type(physics_buffer_desc), pointer :: pbuf2d(:,:)
         352             :
         353             :     integer :: c, ncol
         354             :
         355      370944 :     if( .not. has_aerodep_flx ) return
         356             :
         357      370944 :     call advance_trcdata( fields, file, state, pbuf2d  )
         358             :
         359             : !$OMP PARALLEL DO PRIVATE (C, NCOL)
         360     1866312 :     do c = begchunk, endchunk
         361     1495368 :        ncol = state(c)%ncol
         362     1866312 :        call aerodep_flx_set( cam_out(c), ncol, c )
         363             :     enddo
         364             :
         365      370944 :   end subroutine aerodep_flx_adv
         366             :
         367             : !-------------------------------------------------------------------
         368             : ! returns true if aerosol dep fluxes are prescribed from dataset
         369             : !-------------------------------------------------------------------
         370           0 :   function aerodep_flx_prescribed()
         371             :     logical :: aerodep_flx_prescribed
         372           0 :     aerodep_flx_prescribed = has_aerodep_flx
         373      370944 :   endfunction aerodep_flx_prescribed
         374             :
         375             : ! private methods
         376             : !-------------------------------------------------------------------
         377             : !-------------------------------------------------------------------
         378     1495368 :   subroutine set_bulk_fluxes( cam_out, ncol, lchnk )
         379             :     use camsrfexch,            only : cam_out_t
         380             :
         381             :     ! Arguments
         382             :     type(cam_out_t), intent(inout) :: cam_out
         383             :     integer,         intent(in)    :: ncol, lchnk
         384             :
         385     1495368 :     call set_fluxes( cam_out%bcphiwet, ibcphiwet, ncol, lchnk )
         386     1495368 :     call set_fluxes( cam_out%bcphidry, ibcphidry, ncol, lchnk )
         387     1495368 :     call set_fluxes( cam_out%bcphodry, ibcphodry, ncol, lchnk )
         388             :
         389     1495368 :     call set_fluxes( cam_out%ocphiwet, iocphiwet, ncol, lchnk )
         390     1495368 :     call set_fluxes( cam_out%ocphidry, iocphidry, ncol, lchnk )
         391     1495368 :     call set_fluxes( cam_out%ocphodry, iocphodry, ncol, lchnk )
         392             :
         393     1495368 :     call set_fluxes( cam_out%dstdry1, idstdry1, ncol, lchnk )
         394     1495368 :     call set_fluxes( cam_out%dstdry2, idstdry2, ncol, lchnk )
         395     1495368 :     call set_fluxes( cam_out%dstdry3, idstdry3, ncol, lchnk )
         396     1495368 :     call set_fluxes( cam_out%dstdry4, idstdry4, ncol, lchnk )
         397             :
         398     1495368 :     call set_fluxes( cam_out%dstwet1, idstwet1, ncol, lchnk )
         399     1495368 :     call set_fluxes( cam_out%dstwet2, idstwet2, ncol, lchnk )
         400     1495368 :     call set_fluxes( cam_out%dstwet3, idstwet3, ncol, lchnk )
         401     1495368 :     call set_fluxes( cam_out%dstwet4, idstwet4, ncol, lchnk )
         402             :
         403     1495368 :   end subroutine set_bulk_fluxes
         404             :
         405             : !-------------------------------------------------------------------
         406             : !-------------------------------------------------------------------
         407           0 :   subroutine set_modal_fluxes( cam_out, ncol, lchnk )
         408     1495368 :     use camsrfexch,            only : cam_out_t
         409             :     use modal_aero_deposition, only : set_srf_drydep, set_srf_wetdep
         410             :
         411             :     ! Arguments
         412             :     type(cam_out_t), intent(inout) :: cam_out
         413             :     integer,         intent(in)    :: ncol, lchnk
         414             :
         415             :     ! local vars
         416             :     integer :: i
         417             :     real(r8) :: aerdepdryis(pcols,nmodal_idxs)
         418             :     real(r8) :: aerdepdrycw(pcols,nmodal_idxs)
         419             :     real(r8) :: aerdepwetis(pcols,nmodal_idxs)
         420             :     real(r8) :: aerdepwetcw(pcols,nmodal_idxs)
         421             :
         422             :     ! bin the fluxes as using modal_aero_deposition...
         423             :
         424           0 :     aerdepdryis(:,:) = 0._r8
         425           0 :     aerdepdrycw(:,:) = 0._r8
         426           0 :     aerdepwetis(:,:) = 0._r8
         427           0 :     aerdepwetcw(:,:) = 0._r8
         428             :
         429           0 :     call set_fluxes( aerdepwetis(:ncol,idx_bc1 ), idx_bc1_wetis , ncol, lchnk )
         430           0 :     call set_fluxes( aerdepwetcw(:ncol,idx_bc1 ), idx_bc1_wetcw , ncol, lchnk )
         431           0 :     call set_fluxes( aerdepwetis(:ncol,idx_pom1), idx_pom1_wetis, ncol, lchnk )
         432           0 :     call set_fluxes( aerdepwetcw(:ncol,idx_pom1), idx_pom1_wetcw, ncol, lchnk )
         433           0 :     call set_fluxes( aerdepwetis(:ncol,idx_soa1), idx_soa1_wetis, ncol, lchnk )
         434           0 :     call set_fluxes( aerdepwetcw(:ncol,idx_soa1), idx_soa1_wetcw, ncol, lchnk )
         435           0 :     call set_fluxes( aerdepwetis(:ncol,idx_dst1), idx_dst1_wetis, ncol, lchnk )
         436           0 :     call set_fluxes( aerdepwetcw(:ncol,idx_dst1), idx_dst1_wetcw, ncol, lchnk )
         437           0 :     call set_fluxes( aerdepwetis(:ncol,idx_dst3), idx_dst3_wetis, ncol, lchnk )
         438           0 :     call set_fluxes( aerdepwetcw(:ncol,idx_dst3), idx_dst3_wetcw, ncol, lchnk )
         439             :
         440           0 :     call set_fluxes( aerdepdryis(:ncol,idx_bc1 ), idx_bc1_dryis , ncol, lchnk )
         441           0 :     call set_fluxes( aerdepdrycw(:ncol,idx_bc1 ), idx_bc1_drycw , ncol, lchnk )
         442           0 :     call set_fluxes( aerdepdryis(:ncol,idx_pom1), idx_pom1_dryis, ncol, lchnk )
         443           0 :     call set_fluxes( aerdepdrycw(:ncol,idx_pom1), idx_pom1_drycw, ncol, lchnk )
         444           0 :     call set_fluxes( aerdepdryis(:ncol,idx_soa1), idx_soa1_dryis, ncol, lchnk )
         445           0 :     call set_fluxes( aerdepdrycw(:ncol,idx_soa1), idx_soa1_drycw, ncol, lchnk )
         446           0 :     call set_fluxes( aerdepdryis(:ncol,idx_soa2), idx_soa2_dryis, ncol, lchnk )
         447           0 :     call set_fluxes( aerdepdrycw(:ncol,idx_soa2), idx_soa2_drycw, ncol, lchnk )
         448           0 :     call set_fluxes( aerdepdryis(:ncol,idx_dst1), idx_dst1_dryis, ncol, lchnk )
         449           0 :     call set_fluxes( aerdepdrycw(:ncol,idx_dst1), idx_dst1_drycw, ncol, lchnk )
         450           0 :     call set_fluxes( aerdepdryis(:ncol,idx_dst3), idx_dst3_dryis, ncol, lchnk )
         451           0 :     call set_fluxes( aerdepdrycw(:ncol,idx_dst3), idx_dst3_drycw, ncol, lchnk )
         452             :
         453           0 :     call set_srf_drydep(aerdepdryis, aerdepdrycw, cam_out)
         454           0 :     call set_srf_wetdep(aerdepwetis, aerdepwetcw, cam_out)
         455             :
         456           0 :   end  subroutine set_modal_fluxes
         457             :
         458             : !-------------------------------------------------------------------
         459             : !-------------------------------------------------------------------
         460    20935152 :   subroutine set_fluxes( fluxes, fld_indx, ncol, lchnk )
         461           0 :     use cam_history,  only : outfld
         462             :
         463             :     real(r8), intent(inout) :: fluxes(:)
         464             :     integer,  intent(in)    :: fld_indx, ncol, lchnk
         465             :
         466             :     integer :: i
         467             :
         468    20935152 :     if (fld_indx<1) return
         469             :
         470   349568352 :     do i = 1,ncol
         471             :        ! modal aero wet dep history fields are negative
         472   349568352 :        fluxes(i) = fields(fld_indx)%data(i,1,lchnk)
         473             :     enddo
         474             :
         475    20935152 :     call outfld(trim(fields(fld_indx)%fldnam)//'_D', fluxes(:ncol), ncol, lchnk )
         476             :
         477    20935152 :   endsubroutine set_fluxes
         478             :
         479             : !-------------------------------------------------------------------
         480             : !-------------------------------------------------------------------
         481       21504 :   integer function get_ndx( name, list )
         482             :
         483             :     implicit none
         484             :     character(len=*), intent(in) :: name
         485             :     character(len=*), intent(in) :: list(:)
         486             :
         487             :     integer :: i
         488             :     integer :: maxnum
         489             :
         490       21504 :     maxnum = size(list)
         491             :
         492       21504 :     get_ndx = -1
         493      161280 :     do i = 1, maxnum
         494      161280 :       if ( trim(name) == trim(list(i)) ) then
         495       21504 :         get_ndx = i
         496       21504 :         return
         497             :       endif
         498             :     enddo
         499             :
         500    20935152 :   end function get_ndx
         501             :
         502             : end module aerodep_flx

Generated by: LCOV version 1.14