LCOV - code coverage report
Current view: top level - icepack/columnphysics - icepack_flux.F90 (source / functions) Hit Total Coverage
Test: 231018-211459:8916b9ff2c:1:quick Lines: 41 56 73.21 %
Date: 2023-10-18 15:30:36 Functions: 1 2 50.00 %

          Line data    Source code
       1             : !=======================================================================
       2             : 
       3             : ! Flux manipulation routines for column package
       4             : !
       5             : ! author Elizabeth C. Hunke, LANL
       6             : !
       7             : ! 2014: Moved subroutines merge_fluxes, set_sfcflux from ice_flux.F90
       8             : 
       9             :       module icepack_flux
      10             : 
      11             :       use icepack_kinds
      12             :       use icepack_parameters, only: c1, emissivity, snwgrain
      13             :       use icepack_warnings, only: warnstr, icepack_warnings_add
      14             :       use icepack_warnings, only: icepack_warnings_setabort, icepack_warnings_aborted
      15             :       use icepack_tracers, only: tr_iso
      16             : 
      17             :       implicit none
      18             :       private
      19             :       public :: merge_fluxes, set_sfcflux
      20             : 
      21             : !=======================================================================
      22             : 
      23             :       contains
      24             : 
      25             : !=======================================================================
      26             : 
      27             : ! Aggregate flux information from all ice thickness categories
      28             : !
      29             : ! author: Elizabeth C. Hunke and William H. Lipscomb, LANL
      30             : 
      31    33852099 :       subroutine merge_fluxes (aicen,                &
      32             :                                flw, &   ! LCOV_EXCL_LINE
      33             :                                strairxn, strairyn,   &   ! LCOV_EXCL_LINE
      34             :                                Cdn_atm_ratio_n,      &   ! LCOV_EXCL_LINE
      35             :                                fsurfn,   fcondtopn,  &   ! LCOV_EXCL_LINE
      36             :                                fcondbotn,            &   ! LCOV_EXCL_LINE
      37             :                                fsensn,   flatn,      &   ! LCOV_EXCL_LINE
      38             :                                fswabsn,  flwoutn,    &   ! LCOV_EXCL_LINE
      39             :                                evapn,                &   ! LCOV_EXCL_LINE
      40             :                                evapsn,   evapin,     &   ! LCOV_EXCL_LINE
      41             :                                Trefn,    Qrefn,      &   ! LCOV_EXCL_LINE
      42             :                                freshn,   fsaltn,     &   ! LCOV_EXCL_LINE
      43             :                                fhocnn,   fswthrun,   &   ! LCOV_EXCL_LINE
      44             :                                fswthrun_vdr, fswthrun_vdf,&   ! LCOV_EXCL_LINE
      45             :                                fswthrun_idr, fswthrun_idf,&   ! LCOV_EXCL_LINE
      46             :                                strairxT, strairyT,   &   ! LCOV_EXCL_LINE
      47             :                                Cdn_atm_ratio,        &   ! LCOV_EXCL_LINE
      48             :                                fsurf,    fcondtop,   &   ! LCOV_EXCL_LINE
      49             :                                fcondbot,             &   ! LCOV_EXCL_LINE
      50             :                                fsens,    flat,       &   ! LCOV_EXCL_LINE
      51             :                                fswabs,   flwout,     &   ! LCOV_EXCL_LINE
      52             :                                evap,                 &   ! LCOV_EXCL_LINE
      53             :                                evaps,    evapi,      &   ! LCOV_EXCL_LINE
      54             :                                Tref,     Qref,       &   ! LCOV_EXCL_LINE
      55             :                                fresh,    fsalt,      &   ! LCOV_EXCL_LINE
      56             :                                fhocn,    fswthru,    &   ! LCOV_EXCL_LINE
      57             :                                fswthru_vdr, fswthru_vdf,&   ! LCOV_EXCL_LINE
      58             :                                fswthru_idr, fswthru_idf,&   ! LCOV_EXCL_LINE
      59             :                                melttn, meltsn, meltbn, congeln, snoicen, &   ! LCOV_EXCL_LINE
      60             :                                meltt,  melts,        &   ! LCOV_EXCL_LINE
      61             :                                meltb,  dsnow, dsnown,&   ! LCOV_EXCL_LINE
      62             :                                congel,  snoice,      &   ! LCOV_EXCL_LINE
      63             :                                meltsliq, meltsliqn,  &   ! LCOV_EXCL_LINE
      64             :                                Uref,     Urefn,      &   ! LCOV_EXCL_LINE
      65             :                                Qref_iso, Qrefn_iso,  &   ! LCOV_EXCL_LINE
      66             :                                fiso_ocn, fiso_ocnn,  &   ! LCOV_EXCL_LINE
      67    33852099 :                                fiso_evap, fiso_evapn)
      68             : 
      69             :       ! single category fluxes
      70             :       real (kind=dbl_kind), intent(in) :: &
      71             :           aicen   , & ! concentration of ice   ! LCOV_EXCL_LINE
      72             :           flw     , & ! downward longwave flux          (W/m**2)   ! LCOV_EXCL_LINE
      73             :           strairxn, & ! air/ice zonal  strss,           (N/m**2)   ! LCOV_EXCL_LINE
      74             :           strairyn, & ! air/ice merdnl strss,           (N/m**2)   ! LCOV_EXCL_LINE
      75             :           Cdn_atm_ratio_n, & ! ratio of total drag over neutral drag   ! LCOV_EXCL_LINE
      76             :           fsurfn  , & ! net heat flux to top surface    (W/m**2)   ! LCOV_EXCL_LINE
      77             :           fcondtopn,& ! downward cond flux at top sfc   (W/m**2)   ! LCOV_EXCL_LINE
      78             :           fcondbotn,& ! downward cond flux at bottom sfc   (W/m**2)   ! LCOV_EXCL_LINE
      79             :           fsensn  , & ! sensible heat flx               (W/m**2)   ! LCOV_EXCL_LINE
      80             :           flatn   , & ! latent   heat flx               (W/m**2)   ! LCOV_EXCL_LINE
      81             :           fswabsn , & ! shortwave absorbed heat flx     (W/m**2)   ! LCOV_EXCL_LINE
      82             :           flwoutn , & ! upwd lw emitted heat flx        (W/m**2)   ! LCOV_EXCL_LINE
      83             :           evapn   , & ! evaporation                     (kg/m2/s)   ! LCOV_EXCL_LINE
      84             :           evapsn  , & ! evaporation over snow           (kg/m2/s)   ! LCOV_EXCL_LINE
      85             :           evapin  , & ! evaporation over ice            (kg/m2/s)   ! LCOV_EXCL_LINE
      86             :           Trefn   , & ! air tmp reference level         (K)   ! LCOV_EXCL_LINE
      87             :           Qrefn   , & ! air sp hum reference level      (kg/kg)   ! LCOV_EXCL_LINE
      88             :           freshn  , & ! fresh water flux to ocean       (kg/m2/s)   ! LCOV_EXCL_LINE
      89             :           fsaltn  , & ! salt flux to ocean              (kg/m2/s)   ! LCOV_EXCL_LINE
      90             :           fhocnn  , & ! actual ocn/ice heat flx         (W/m**2)   ! LCOV_EXCL_LINE
      91             :           fswthrun, & ! sw radiation through ice bot    (W/m**2)   ! LCOV_EXCL_LINE
      92             :           melttn  , & ! top ice melt                    (m)   ! LCOV_EXCL_LINE
      93             :           meltbn  , & ! bottom ice melt                 (m)   ! LCOV_EXCL_LINE
      94             :           meltsn  , & ! snow melt                       (m)   ! LCOV_EXCL_LINE
      95             :           meltsliqn,& ! mass of snow melt               (kg/m^2)   ! LCOV_EXCL_LINE
      96             :           dsnown  , & ! change in snow depth            (m)   ! LCOV_EXCL_LINE
      97             :           congeln , & ! congelation ice growth          (m)   ! LCOV_EXCL_LINE
      98             :           snoicen     ! snow-ice growth                 (m)
      99             : 
     100             :       real (kind=dbl_kind), optional, intent(in):: &
     101             :           fswthrun_vdr, & ! vis dir sw radiation through ice bot    (W/m**2)   ! LCOV_EXCL_LINE
     102             :           fswthrun_vdf, & ! vis dif sw radiation through ice bot    (W/m**2)   ! LCOV_EXCL_LINE
     103             :           fswthrun_idr, & ! nir dir sw radiation through ice bot    (W/m**2)   ! LCOV_EXCL_LINE
     104             :           fswthrun_idf, & ! nir dif sw radiation through ice bot    (W/m**2)   ! LCOV_EXCL_LINE
     105             :           Urefn       ! air speed reference level       (m/s)
     106             : 
     107             :       ! cumulative fluxes
     108             :       real (kind=dbl_kind), intent(inout) :: &
     109             :           strairxT, & ! air/ice zonal  strss,           (N/m**2)   ! LCOV_EXCL_LINE
     110             :           strairyT, & ! air/ice merdnl strss,           (N/m**2)   ! LCOV_EXCL_LINE
     111             :           Cdn_atm_ratio, & ! ratio of total drag over neutral drag   ! LCOV_EXCL_LINE
     112             :           fsurf   , & ! net heat flux to top surface    (W/m**2)   ! LCOV_EXCL_LINE
     113             :           fcondtop, & ! downward cond flux at top sfc   (W/m**2)   ! LCOV_EXCL_LINE
     114             :           fcondbot, & ! downward cond flux at bottom sfc   (W/m**2)   ! LCOV_EXCL_LINE
     115             :           fsens   , & ! sensible heat flx               (W/m**2)   ! LCOV_EXCL_LINE
     116             :           flat    , & ! latent   heat flx               (W/m**2)   ! LCOV_EXCL_LINE
     117             :           fswabs  , & ! shortwave absorbed heat flx     (W/m**2)   ! LCOV_EXCL_LINE
     118             :           flwout  , & ! upwd lw emitted heat flx        (W/m**2)   ! LCOV_EXCL_LINE
     119             :           evap    , & ! evaporation                     (kg/m2/s)   ! LCOV_EXCL_LINE
     120             :           evaps   , & ! evaporation over snow           (kg/m2/s)   ! LCOV_EXCL_LINE
     121             :           evapi   , & ! evaporation over ice            (kg/m2/s)   ! LCOV_EXCL_LINE
     122             :           Tref    , & ! air tmp reference level         (K)   ! LCOV_EXCL_LINE
     123             :           Qref    , & ! air sp hum reference level      (kg/kg)   ! LCOV_EXCL_LINE
     124             :           fresh   , & ! fresh water flux to ocean       (kg/m2/s)   ! LCOV_EXCL_LINE
     125             :           fsalt   , & ! salt flux to ocean              (kg/m2/s)   ! LCOV_EXCL_LINE
     126             :           fhocn   , & ! actual ocn/ice heat flx         (W/m**2)   ! LCOV_EXCL_LINE
     127             :           fswthru , & ! sw radiation through ice bot    (W/m**2)   ! LCOV_EXCL_LINE
     128             :           meltt   , & ! top ice melt                    (m)   ! LCOV_EXCL_LINE
     129             :           meltb   , & ! bottom ice melt                 (m)   ! LCOV_EXCL_LINE
     130             :           melts   , & ! snow melt                       (m)   ! LCOV_EXCL_LINE
     131             :           meltsliq, & ! mass of snow melt               (kg/m^2)   ! LCOV_EXCL_LINE
     132             :           congel  , & ! congelation ice growth          (m)   ! LCOV_EXCL_LINE
     133             :           snoice      ! snow-ice growth                 (m)
     134             : 
     135             :       real (kind=dbl_kind), intent(inout), optional :: &
     136             :           fswthru_vdr , & ! vis dir sw radiation through ice bot    (W/m**2)   ! LCOV_EXCL_LINE
     137             :           fswthru_vdf , & ! vis dif sw radiation through ice bot    (W/m**2)   ! LCOV_EXCL_LINE
     138             :           fswthru_idr , & ! nir dir sw radiation through ice bot    (W/m**2)   ! LCOV_EXCL_LINE
     139             :           fswthru_idf     ! nir dif sw radiation through ice bot    (W/m**2)
     140             : 
     141             :       real (kind=dbl_kind), intent(inout), optional :: &
     142             :           dsnow,    & ! change in snow depth            (m)   ! LCOV_EXCL_LINE
     143             :           Uref        ! air speed reference level       (m/s)
     144             : 
     145             :       real (kind=dbl_kind), dimension(:), intent(inout), optional :: &
     146             :           Qref_iso, & ! isotope air sp hum ref level    (kg/kg)   ! LCOV_EXCL_LINE
     147             :           fiso_ocn, & ! isotope fluxes to ocean         (kg/m2/s)   ! LCOV_EXCL_LINE
     148             :           fiso_evap   ! isotope evaporation             (kg/m2/s)
     149             : 
     150             :       real (kind=dbl_kind), dimension(:), intent(in), optional :: &
     151             :           Qrefn_iso, & ! isotope air sp hum ref level   (kg/kg)   ! LCOV_EXCL_LINE
     152             :           fiso_ocnn, & ! isotope fluxes to ocean        (kg/m2/s)   ! LCOV_EXCL_LINE
     153             :           fiso_evapn   ! isotope evaporation            (kg/m2/s)
     154             : 
     155             :       character(len=*),parameter :: subname='(merge_fluxes)'
     156             : 
     157             :       !-----------------------------------------------------------------
     158             :       ! Merge fluxes
     159             :       ! NOTE: The albedo is aggregated only in cells where ice exists
     160             :       !       and (for the delta-Eddington scheme) where the sun is above
     161             :       !       the horizon.
     162             :       !-----------------------------------------------------------------
     163             : 
     164             :       ! atmo fluxes
     165             : 
     166    33852099 :       strairxT   = strairxT + strairxn  * aicen
     167    33852099 :       strairyT   = strairyT + strairyn  * aicen
     168             :       Cdn_atm_ratio = Cdn_atm_ratio + &
     169    33852099 :                       Cdn_atm_ratio_n   * aicen
     170    33852099 :       fsurf      = fsurf    + fsurfn    * aicen
     171    33852099 :       fcondtop   = fcondtop + fcondtopn * aicen
     172    33852099 :       fcondbot   = fcondbot + fcondbotn * aicen
     173    33852099 :       fsens      = fsens    + fsensn    * aicen
     174    33852099 :       flat       = flat     + flatn     * aicen
     175    33852099 :       fswabs     = fswabs   + fswabsn   * aicen
     176             :       flwout     = flwout   &
     177    33852099 :            + (flwoutn - (c1-emissivity)*flw) * aicen
     178    33852099 :       evap       = evap     + evapn     * aicen
     179    33852099 :       evaps      = evaps    + evapsn    * aicen
     180    33852099 :       evapi      = evapi    + evapin    * aicen
     181    33852099 :       Tref       = Tref     + Trefn     * aicen
     182    33852099 :       Qref       = Qref     + Qrefn     * aicen
     183             : 
     184             :       ! Isotopes
     185    33852099 :       if (tr_iso) then
     186           0 :          if (present(Qrefn_iso) .and. present(Qref_iso)) then
     187           0 :             Qref_iso (:) = Qref_iso (:) + Qrefn_iso (:) * aicen
     188             :          endif
     189           0 :          if (present(fiso_ocnn) .and. present(fiso_ocn)) then
     190           0 :             fiso_ocn (:) = fiso_ocn (:) + fiso_ocnn (:) * aicen
     191             :          endif
     192           0 :          if (present(fiso_evapn) .and. present(fiso_evap)) then
     193           0 :             fiso_evap(:) = fiso_evap(:) + fiso_evapn(:) * aicen
     194             :          endif
     195             :       endif
     196             : 
     197             :       ! ocean fluxes
     198    33852099 :       if (present(Urefn) .and. present(Uref)) then
     199    33852099 :          Uref = Uref     + Urefn     * aicen
     200             :       endif
     201             : 
     202    33852099 :       fresh     = fresh     + freshn    * aicen
     203    33852099 :       fsalt     = fsalt     + fsaltn    * aicen
     204    33852099 :       fhocn     = fhocn     + fhocnn    * aicen
     205    33852099 :       fswthru   = fswthru   + fswthrun  * aicen
     206    33852099 :       if (present(fswthru_vdr)) &
     207    33852099 :          fswthru_vdr   = fswthru_vdr   + fswthrun_vdr  * aicen
     208    33852099 :       if (present(fswthru_vdf)) &
     209    33852099 :          fswthru_vdf   = fswthru_vdf   + fswthrun_vdf  * aicen
     210    33852099 :       if (present(fswthru_idr)) &
     211    33852099 :          fswthru_idr   = fswthru_idr   + fswthrun_idr  * aicen
     212    33852099 :       if (present(fswthru_idf)) &
     213    33852099 :          fswthru_idf   = fswthru_idf   + fswthrun_idf  * aicen
     214             : 
     215             :       ! ice/snow thickness
     216             : 
     217    33852099 :       meltt     = meltt     + melttn    * aicen
     218    33852099 :       meltb     = meltb     + meltbn    * aicen
     219    33852099 :       melts     = melts     + meltsn    * aicen
     220    33852099 :       if (snwgrain) then
     221           0 :          meltsliq  = meltsliq  + meltsliqn * aicen
     222             :       endif
     223    33852099 :       if (present(dsnow)) then
     224    33852099 :          dsnow     = dsnow     + dsnown    * aicen
     225             :       endif
     226    33852099 :       congel    = congel    + congeln   * aicen
     227    33852099 :       snoice    = snoice    + snoicen   * aicen
     228             : 
     229    33852099 :       end subroutine merge_fluxes
     230             : 
     231             : !=======================================================================
     232             : 
     233             : ! If model is not calculating surface temperature, set the surface
     234             : ! flux values using values read in from forcing data or supplied via
     235             : ! coupling (stored in ice_flux).
     236             : !
     237             : ! If CICE is running in NEMO environment, convert fluxes from GBM values
     238             : ! to per unit ice area values. If model is not running in NEMO environment,
     239             : ! the forcing is supplied as per unit ice area values.
     240             : !
     241             : ! authors Alison McLaren, Met Office
     242             : 
     243           0 :       subroutine set_sfcflux (aicen,               &
     244             :                               flatn_f,             &   ! LCOV_EXCL_LINE
     245             :                               fsensn_f,            &   ! LCOV_EXCL_LINE
     246             :                               fsurfn_f,            &   ! LCOV_EXCL_LINE
     247             :                               fcondtopn_f,         &   ! LCOV_EXCL_LINE
     248             :                               flatn,               &   ! LCOV_EXCL_LINE
     249             :                               fsensn,              &   ! LCOV_EXCL_LINE
     250             :                               fsurfn,              &   ! LCOV_EXCL_LINE
     251             :                               fcondtopn)
     252             : 
     253             :       ! ice state variables
     254             :       real (kind=dbl_kind), intent(in) :: &
     255             :          aicen       , & ! concentration of ice   ! LCOV_EXCL_LINE
     256             :          flatn_f     , & ! latent heat flux   (W/m^2)   ! LCOV_EXCL_LINE
     257             :          fsensn_f    , & ! sensible heat flux (W/m^2)   ! LCOV_EXCL_LINE
     258             :          fsurfn_f    , & ! net flux to top surface, not including fcondtopn   ! LCOV_EXCL_LINE
     259             :          fcondtopn_f     ! downward cond flux at top surface (W m-2)
     260             : 
     261             :       real (kind=dbl_kind), intent(out):: &
     262             :          flatn       , & ! latent heat flux   (W/m^2)   ! LCOV_EXCL_LINE
     263             :          fsensn      , & ! sensible heat flux   (W/m^2)   ! LCOV_EXCL_LINE
     264             :          fsurfn      , & ! net flux to top surface, not including fcondtopn   ! LCOV_EXCL_LINE
     265             :          fcondtopn       ! downward cond flux at top surface (W m-2)
     266             : 
     267             :       ! local variables
     268             : 
     269             :       real (kind=dbl_kind)  :: &
     270           0 :          raicen          ! 1 or 1/aicen
     271             : 
     272             :       logical (kind=log_kind) :: &
     273             :          extreme_flag    ! flag for extreme forcing values
     274             : 
     275             :       logical (kind=log_kind), parameter :: &
     276             :          extreme_test=.false. ! test and write out extreme forcing data
     277             : 
     278             :       character(len=*),parameter :: subname='(set_sfcflux)'
     279             : 
     280           0 :       raicen        = c1
     281             : 
     282             : #ifdef CICE_IN_NEMO
     283             : !----------------------------------------------------------------------
     284             : ! Convert fluxes from GBM values to per ice area values when
     285             : ! running in NEMO environment.  (When in standalone mode, fluxes
     286             : ! are input as per ice area.)
     287             : !----------------------------------------------------------------------
     288             :       raicen        = c1 / aicen
     289             : #endif
     290           0 :       fsurfn   = fsurfn_f*raicen
     291           0 :       fcondtopn= fcondtopn_f*raicen
     292           0 :       flatn    = flatn_f*raicen
     293           0 :       fsensn   = fsensn_f*raicen
     294             : 
     295             : !----------------------------------------------------------------
     296             : ! Flag up any extreme fluxes
     297             : !---------------------------------------------------------------
     298             : 
     299             :       if (extreme_test) then
     300             :          extreme_flag = .false.
     301             : 
     302             :          if (fcondtopn < -100.0_dbl_kind &
     303             :               .or. fcondtopn > 20.0_dbl_kind) then
     304             :             extreme_flag = .true.
     305             :          endif
     306             : 
     307             :          if (fsurfn < -100.0_dbl_kind &
     308             :               .or. fsurfn > 80.0_dbl_kind) then
     309             :             extreme_flag = .true.
     310             :          endif
     311             : 
     312             :          if (flatn < -20.0_dbl_kind &
     313             :               .or. flatn > 20.0_dbl_kind) then
     314             :             extreme_flag = .true.
     315             :          endif
     316             : 
     317             :          if (extreme_flag) then
     318             : 
     319             :             if (fcondtopn < -100.0_dbl_kind &
     320             :                  .or. fcondtopn > 20.0_dbl_kind) then
     321             :                write(warnstr,*) subname, &
     322             :                     'Extreme forcing: -100 > fcondtopn > 20'
     323             :                call icepack_warnings_add(warnstr)
     324             :                write(warnstr,*) subname, &
     325             :                     'aicen,fcondtopn = ', &   ! LCOV_EXCL_LINE
     326             :                     aicen,fcondtopn
     327             :                call icepack_warnings_add(warnstr)
     328             :             endif
     329             : 
     330             :             if (fsurfn < -100.0_dbl_kind &
     331             :                  .or. fsurfn > 80.0_dbl_kind) then
     332             :                write(warnstr,*) subname, &
     333             :                     'Extreme forcing: -100 > fsurfn > 40'
     334             :                call icepack_warnings_add(warnstr)
     335             :                write(warnstr,*) subname, &
     336             :                     'aicen,fsurfn = ', &   ! LCOV_EXCL_LINE
     337             :                     aicen,fsurfn
     338             :                call icepack_warnings_add(warnstr)
     339             :             endif
     340             : 
     341             :             if (flatn < -20.0_dbl_kind &
     342             :                  .or. flatn > 20.0_dbl_kind) then
     343             :                write(warnstr,*) subname, &
     344             :                     'Extreme forcing: -20 > flatn > 20'
     345             :                call icepack_warnings_add(warnstr)
     346             :                write(warnstr,*) subname, &
     347             :                     'aicen,flatn = ', &   ! LCOV_EXCL_LINE
     348             :                     aicen,flatn
     349             :                call icepack_warnings_add(warnstr)
     350             :             endif
     351             : 
     352             :          endif  ! extreme_flag
     353             :       endif     ! extreme_test
     354             : 
     355           0 :       end subroutine set_sfcflux
     356             : 
     357             : !=======================================================================
     358             : 
     359             :       end module icepack_flux
     360             : 
     361             : !=======================================================================

Generated by: LCOV version 1.14-6-g40580cd