LCOV - code coverage report
Current view: | top level - physics/rrtmgp/ext/rte-kernels - mo_fluxes_broadband_kernels.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 12 | 23 | 52.2 %
Date: | 2024-12-17 17:57:11 |  | Functions: | 2 | 3 | 66.7 %

              Line data    Source code
           1             : ! This code is part of Radiative Transfer for Energetics (RTE)
           2             : !
           3             : ! Contacts: Robert Pincus and Eli Mlawer
           4             : ! email:  rrtmgp@aer.com
           5             : !
           6             : ! Copyright 2015-,  Atmospheric and Environmental Research,
           7             : ! Regents of the University of Colorado, Trustees of Columbia University.  All right reserved.
           8             : !
           9             : ! Use and duplication is permitted under the terms of the
          10             : !    BSD 3-clause license, see http://opensource.org/licenses/BSD-3-Clause
          11             : ! -------------------------------------------------------------------------------------------------
          12             : !>
          13             : !> ## Kernels for computing broadband fluxes
          14             : !>
          15             : ! -------------------------------------------------------------------------------------------------
          16             : module mo_fluxes_broadband_kernels
          17             :   use, intrinsic :: iso_c_binding
          18             :   use mo_rte_kind, only: wp
          19             :   implicit none
          20             :   private
          21             :   public :: sum_broadband, net_broadband
          22             :
          23             :   interface net_broadband
          24             :     !! Interface for computing net flux
          25             :     module procedure net_broadband_full, net_broadband_precalc
          26             :   end interface net_broadband
          27             : contains
          28             :   ! ----------------------------------------------------------------------------
          29             :   !>
          30             :   !> Spectral reduction over all points
          31             :   !>
          32     2660061 :   subroutine sum_broadband(ncol, nlev, ngpt, spectral_flux, broadband_flux) bind(C, name="rte_sum_broadband")
          33             :     integer,                               intent(in ) :: ncol, nlev, ngpt
          34             :       !! Array sizes
          35             :     real(wp), dimension(ncol, nlev, ngpt), intent(in ) :: spectral_flux
          36             :       !! Spectrally-resolved flux
          37             :     real(wp), dimension(ncol, nlev),       intent(out) :: broadband_flux
          38             :       !! Sum of spectrally-resolved flux over `ngpt`
          39             :
          40             :     integer  :: icol, ilev, igpt
          41             :     real(wp) :: bb_flux_s ! local scalar version
          42             :
          43             :     !$acc enter data copyin(spectral_flux) create(broadband_flux)
          44             :     !$omp target enter data map(to:spectral_flux) map(alloc:broadband_flux)
          45             :     !$acc parallel loop gang vector collapse(2)
          46             :     !$omp target teams distribute parallel do simd collapse(2)
          47   255365856 :     do ilev = 1, nlev
          48  4149805356 :       do icol = 1, ncol
          49             :
          50             :         bb_flux_s = 0.0_wp
          51             :
          52 >47567*10^7 :         do igpt = 1, ngpt
          53 >47567*10^7 :           bb_flux_s = bb_flux_s + spectral_flux(icol, ilev, igpt)
          54             :         end do
          55             :
          56  4147145295 :         broadband_flux(icol, ilev) = bb_flux_s
          57             :       end do
          58             :     end do
          59             :     !$acc exit data delete(spectral_flux) copyout(broadband_flux)
          60             :     !$omp target exit data map(release:spectral_flux) map(from:broadband_flux)
          61     2660061 :   end subroutine sum_broadband
          62             :   ! ----------------------------------------------------------------------------
          63             :   !>
          64             :   !> Spectral reduction over all points for net flux
          65             :   !>
          66           0 :   subroutine net_broadband_full(ncol, nlev, ngpt, spectral_flux_dn, spectral_flux_up, broadband_flux_net) &
          67             :     bind(C, name="rte_net_broadband_full")
          68             :     integer,                               intent(in ) :: ncol, nlev, ngpt
          69             :       !! Array sizes
          70             :     real(wp), dimension(ncol, nlev, ngpt), intent(in ) :: spectral_flux_dn, spectral_flux_up
          71             :       !! Spectrally-resolved flux up and down
          72             :     real(wp), dimension(ncol, nlev),       intent(out) :: broadband_flux_net
          73             :       !! Net (down minus up) summed over `ngpt`
          74             :
          75             :     integer  :: icol, ilev, igpt
          76             :     real(wp) :: diff
          77             :
          78             :     !$acc enter data copyin(spectral_flux_dn, spectral_flux_up) create(broadband_flux_net)
          79             :     !$omp target enter data map(to:spectral_flux_dn, spectral_flux_up) map(alloc:broadband_flux_net)
          80             :     !$acc parallel loop collapse(2)
          81             :     !$omp target teams distribute parallel do simd collapse(2)
          82           0 :     do ilev = 1, nlev
          83           0 :       do icol = 1, ncol
          84           0 :         diff = spectral_flux_dn(icol, ilev, 1   ) - spectral_flux_up(icol, ilev,     1)
          85           0 :         broadband_flux_net(icol, ilev) = diff
          86             :       end do
          87             :     end do
          88             :     !$acc parallel loop collapse(3)
          89             :     !$omp target teams distribute parallel do simd collapse(3)
          90           0 :     do igpt = 2, ngpt
          91           0 :       do ilev = 1, nlev
          92           0 :         do icol = 1, ncol
          93           0 :           diff = spectral_flux_dn(icol, ilev, igpt) - spectral_flux_up(icol, ilev, igpt)
          94             :           !$acc atomic update
          95             :           !$omp atomic update
          96           0 :           broadband_flux_net(icol, ilev) = broadband_flux_net(icol, ilev) + diff
          97             :         end do
          98             :       end do
          99             :     end do
         100             :     !$acc exit data delete(spectral_flux_dn, spectral_flux_up) copyout(broadband_flux_net)
         101             :     !$omp target exit data map(release:spectral_flux_dn, spectral_flux_up) map(from:broadband_flux_net)
         102           0 :   end subroutine net_broadband_full
         103             :   ! ----------------------------------------------------------------------------
         104             :   !>
         105             :   !> Net flux when bradband flux up and down are already available
         106             :   !>
         107     1135399 :   subroutine net_broadband_precalc(ncol, nlev, flux_dn, flux_up, broadband_flux_net) &
         108             :     bind(C, name="rte_net_broadband_precalc")
         109             :     integer,                         intent(in ) :: ncol, nlev
         110             :       !! Array sizes
         111             :     real(wp), dimension(ncol, nlev), intent(in ) :: flux_dn, flux_up
         112             :       !! Broadband downward and upward fluxes
         113             :     real(wp), dimension(ncol, nlev), intent(out) :: broadband_flux_net
         114             :       !! Net (down minus up)
         115             :
         116             :     integer  :: icol, ilev
         117             :     !$acc enter data copyin(flux_dn, flux_up) create(broadband_flux_net)
         118             :     !$omp target enter data map(to:flux_dn, flux_up) map(alloc:broadband_flux_net)
         119             :     !$acc parallel loop collapse(2)
         120             :     !$omp target teams distribute parallel do simd collapse(2)
         121   108998304 :     do ilev = 1, nlev
         122  1778043804 :       do icol = 1, ncol
         123  1776908405 :          broadband_flux_net(icol,ilev) = flux_dn(icol,ilev) - flux_up(icol,ilev)
         124             :        end do
         125             :     end do
         126             :     !$acc exit data delete(flux_dn, flux_up) copyout(broadband_flux_net)
         127             :     !$omp target exit data map(release:flux_dn, flux_up) map(from:broadband_flux_net)
         128     1135399 :   end subroutine net_broadband_precalc
         129             :   ! ----------------------------------------------------------------------------
         130             : end module mo_fluxes_broadband_kernels

Generated by: LCOV version 1.14