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