LCOV - code coverage report
Current view: top level - columnphysics - icepack_zbgc_shared.F90 (source / functions) Hit Total Coverage
Test: 200704-015006:b1e41d9f12:3:base,travis,quick Lines: 209 231 90.48 %
Date: 2020-07-03 20:11:40 Functions: 5 6 83.33 %

          Line data    Source code
       1             : !=======================================================================
       2             : !
       3             : ! Biogeochemistry variables
       4             : !
       5             : ! authors: Nicole Jeffery, LANL
       6             : !          Scott Elliot,   LANL
       7             : !          Elizabeth C. Hunke, LANL
       8             : !
       9             :       module icepack_zbgc_shared
      10             : 
      11             :       use icepack_kinds
      12             :       use icepack_parameters, only: p5, c0, c1, secday, puny
      13             :       use icepack_parameters, only: hs_ssl, sk_l
      14             :       use icepack_parameters, only: rhoi, cp_ocn, cp_ice, Lfresh  
      15             :       use icepack_parameters, only: solve_zbgc
      16             :       use icepack_parameters, only: fr_resp
      17             :       use icepack_tracers, only: max_nbtrcr, max_algae, max_doc
      18             :       use icepack_tracers, only: max_don
      19             :       use icepack_tracers, only: nt_bgc_N, nt_fbri
      20             :       use icepack_warnings, only: warnstr, icepack_warnings_add
      21             :       use icepack_warnings, only: icepack_warnings_setabort, icepack_warnings_aborted
      22             : 
      23             :       implicit none 
      24             : 
      25             :       private
      26             :       public :: calculate_qin_from_Sin, &
      27             :                 remap_zbgc, &
      28             :                 zap_small_bgc, &
      29             :                 regrid_stationary, &
      30             :                 merge_bgc_fluxes, &
      31             :                 merge_bgc_fluxes_skl
      32             : 
      33             :       !-----------------------------------------------------------------
      34             :       ! Transport type
      35             :       !-----------------------------------------------------------------
      36             :       ! In delta Eddington, algal particles are assumed to cause no
      37             :       ! significant scattering (Brieglib and Light), only absorption
      38             :       ! in the visible spectral band (200-700 nm)
      39             :       ! Algal types: Diatoms, flagellates, Phaeocycstis
      40             :       ! DOC        : Proteins, EPS, Lipids
      41             :       !-----------------------------------------------------------------
      42             :       !------------------------------------------------------------
      43             :       ! Aerosol order and type should be consistent with order/type
      44             :       ! specified in delta Eddington:  1) hydrophobic black carbon;
      45             :       ! 2) hydrophilic black carbon; 3) dust (0.05-0.5 micron);
      46             :       ! 4) dust (0.5-1.25 micron); 5) dust (1.25-2.5 micron);
      47             :       ! 6) dust (2.5-5 micron)
      48             :       !-------------------------------------------------------------
      49             : 
      50             :       ! bio parameters for algal_dyn
      51             :  
      52             :       real (kind=dbl_kind), dimension(max_algae), public :: &
      53             :          R_C2N     ,      & ! algal C to N (mole/mole)
      54             :          R_chl2N   ,      & ! 3 algal chlorophyll to N (mg/mmol)
      55             :          F_abs_chl          ! to scale absorption in Dedd
      56             : 
      57             :       real (kind=dbl_kind), dimension(max_don), public :: &  ! increase compare to algal R_Fe2C
      58             :          R_C2N_DON
      59             : 
      60             :        real (kind=dbl_kind),  dimension(max_algae), public :: &
      61             :          R_Si2N     , & ! algal Sil to N (mole/mole) 
      62             :          R_S2N      , & ! algal S to N (mole/mole)
      63             :          ! Marchetti et al 2006, 3 umol Fe/mol C for iron limited Pseudo-nitzschia
      64             :          R_Fe2C     , & ! algal Fe to carbon (umol/mmol)
      65             :          R_Fe2N         ! algal Fe to N (umol/mmol)
      66             : 
      67             :       real (kind=dbl_kind), dimension(max_don), public :: & 
      68             :          R_Fe2DON       ! Fe to N of DON (nmol/umol)
      69             : 
      70             :       real (kind=dbl_kind), dimension(max_doc), public :: &  
      71             :          R_Fe2DOC       ! Fe to C of DOC (nmol/umol)
      72             : 
      73             :       real (kind=dbl_kind), parameter, public :: &
      74             :          R_gC2molC  = 12.01_dbl_kind ! mg/mmol C
      75             : 
      76             :       ! scavenging coefficient for tracers in snow
      77             :       ! bottom to last 6 are from Flanner et al., 2007
      78             :       ! very last one is for humic material
      79             :       real (kind=dbl_kind), parameter, dimension(max_nbtrcr),  public :: &
      80             :          kscavz    = (/ 0.03_dbl_kind, 0.03_dbl_kind, 0.03_dbl_kind, &
      81             :                         0.03_dbl_kind, 0.03_dbl_kind, 0.03_dbl_kind, &
      82             :                         0.03_dbl_kind, 0.03_dbl_kind, 0.03_dbl_kind, &
      83             :                         0.03_dbl_kind, 0.03_dbl_kind, 0.03_dbl_kind, &
      84             :                         0.03_dbl_kind, 0.03_dbl_kind, 0.03_dbl_kind, &
      85             :                         0.03_dbl_kind, 0.03_dbl_kind, 0.03_dbl_kind, &
      86             :                         0.03_dbl_kind, 0.03_dbl_kind, 0.03_dbl_kind, &
      87             :                         0.03_dbl_kind, &
      88             :                         0.03_dbl_kind, 0.20_dbl_kind, 0.02_dbl_kind, &
      89             :                         0.02_dbl_kind, 0.01_dbl_kind, 0.01_dbl_kind, &
      90             :                         0.03_dbl_kind /)
      91             : 
      92             :       !-----------------------------------------------------------------
      93             :       ! skeletal layer biogeochemistry
      94             :       !-----------------------------------------------------------------
      95             : 
      96             :       real (kind=dbl_kind), parameter, public :: &
      97             :          phi_sk     = 0.30_dbl_kind     ! skeletal layer porosity
      98             : 
      99             :       !-----------------------------------------------------------------
     100             :       ! general biogeochemistry
     101             :       !-----------------------------------------------------------------
     102             : 
     103             :       real (kind=dbl_kind), dimension(max_nbtrcr), public :: &
     104             :          zbgc_frac_init,&! initializes mobile fraction
     105             :          bgc_tracer_type ! described tracer in mobile or stationary phases      
     106             :                          ! < 0 is purely mobile (eg. nitrate)
     107             :                          ! > 0 has timescales for transitions between 
     108             :                          ! phases based on whether the ice is melting or growing
     109             : 
     110             :       real (kind=dbl_kind), dimension(max_nbtrcr), public :: & 
     111             :          zbgc_init_frac, &   ! fraction of ocean tracer  concentration in new ice
     112             :          tau_ret,        &   ! retention timescale  (s), mobile to stationary phase
     113             :          tau_rel             ! release timescale    (s), stationary to mobile phase         
     114             : 
     115             :       !-----------------------------------------------------------------
     116             :       ! From algal_dyn in icepack_algae.F90 but not in namelist
     117             :       !-----------------------------------------------------------------
     118             : 
     119             :       real (kind=dbl_kind), dimension(max_algae), public :: &
     120             :          chlabs           , & ! chla absorption 1/m/(mg/m^3)
     121             :          alpha2max_low    , & ! light limitation (1/(W/m^2))
     122             :          beta2max         , & ! light inhibition (1/(W/m^2))
     123             :          mu_max           , & ! maximum growth rate (1/d)
     124             :          grow_Tdep        , & ! T dependence of growth (1/C)
     125             :          fr_graze         , & ! fraction of algae grazed
     126             :          mort_pre         , & ! mortality (1/day)
     127             :          mort_Tdep        , & ! T dependence of mortality (1/C)
     128             :          k_exude          , & ! algal carbon  exudation rate (1/d)
     129             :          K_Nit            , & ! nitrate half saturation (mmol/m^3) 
     130             :          K_Am             , & ! ammonium half saturation (mmol/m^3) 
     131             :          K_Sil            , & ! silicon half saturation (mmol/m^3)
     132             :          K_Fe                 ! iron half saturation  or micromol/m^3
     133             :             
     134             :       real (kind=dbl_kind), dimension(max_DON), public :: &
     135             :          f_don            , & ! fraction of spilled grazing to DON
     136             :          kn_bac           , & ! Bacterial degredation of DON (1/d)
     137             :          f_don_Am             ! fraction of remineralized DON to Am
     138             : 
     139             :       real (kind=dbl_kind), dimension(max_DOC), public :: &
     140             :          f_doc            , & ! fraction of mort_N that goes to each doc pool
     141             :          f_exude          , & ! fraction of exuded carbon to each DOC pool
     142             :          k_bac                ! Bacterial degredation of DOC (1/d)    
     143             : 
     144             :       !-----------------------------------------------------------------
     145             :       ! brine
     146             :       !-----------------------------------------------------------------
     147             : 
     148             :       integer (kind=int_kind), parameter, public :: &
     149             :          exp_h     = 3              ! power law for hierarchical model  
     150             : 
     151             :       real (kind=dbl_kind), parameter, public :: & 
     152             :          k_o       = 3.e-8_dbl_kind, & ! permeability scaling factor (m^2)
     153             :          thinS     = 0.05_dbl_kind     ! minimum ice thickness for brine
     154             : 
     155             :       real (kind=dbl_kind), public :: & 
     156             :          flood_frac     ! fraction of ocean/meltwater that floods  !*****
     157             : 
     158             :       real (kind=dbl_kind), parameter, public :: & 
     159             :          bphimin = 0.03_dbl_kind      ! minimum porosity for zbgc only
     160             : 
     161             : !-----------------------------------------------------------------------
     162             : ! Parameters for zsalinity
     163             : !-----------------------------------------------------------------------
     164             : 
     165             :       real (kind=dbl_kind), parameter, public :: & 
     166             :          viscos_dynamic = 2.2_dbl_kind   , & ! 1.8e-3_dbl_kind (pure water at 0^oC) (kg/m/s)
     167             :          Dm             = 1.0e-9_dbl_kind, & ! molecular diffusion (m^2/s)
     168             :          Ra_c           = 0.05_dbl_kind      ! critical Rayleigh number for bottom convection
     169             : 
     170             : !=======================================================================
     171             : 
     172             :       contains
     173             : 
     174             : !=======================================================================
     175             : ! 
     176             : ! Compute the internal ice enthalpy using new salinity and Tin
     177             : !
     178             : 
     179           0 :       function calculate_qin_from_Sin (Tin, Tmltk) &
     180           0 :                result(qin)
     181             :             
     182             :       real (kind=dbl_kind), intent(in) :: &
     183             :          Tin                ,&  ! internal temperature
     184             :          Tmltk                  ! melting temperature at one level
     185             : 
     186             :       ! local variables
     187             : 
     188             :       real (kind=dbl_kind) :: &
     189             :          qin                    ! melting temperature at one level   
     190             : 
     191             :       character(len=*),parameter :: subname='(calculate_qin_from_Sin)'
     192             : 
     193           0 :       qin =-rhoi*(cp_ice*(Tmltk-Tin) + Lfresh*(c1-Tmltk/Tin) - cp_ocn*Tmltk)
     194             : 
     195           0 :       end function calculate_qin_from_Sin
     196             : 
     197             : !=======================================================================
     198             : !
     199             : ! Remaps tracer fields in a given category from one set of layers to another.
     200             : ! Grids can be very different and  so can  vertical spaces.  
     201             : 
     202     4422462 :       subroutine remap_zbgc(nlyrn,    &
     203             :                             it,                 &
     204     8844924 :                             trcrn,    trtmp,    &
     205             :                             nr0,      nbyrn,    &
     206             :                             hice,     hinS,     &
     207     4422462 :                             ice_grid, bio_grid, &
     208             :                             S_min     )
     209             : 
     210             :       integer (kind=int_kind), intent(in) :: &
     211             :          it            , & ! tracer index in top layer
     212             :          nr0           , & ! receiver category
     213             :          nlyrn         , & ! number of ice layers
     214             :          nbyrn             ! number of biology layers
     215             : 
     216             :       real (kind=dbl_kind), dimension (:), intent(in) :: &
     217             :          trcrn             ! ice tracers
     218             : 
     219             :       real (kind=dbl_kind), dimension (:), intent(inout) :: &
     220             :          trtmp             ! temporary, remapped ice tracers
     221             : 
     222             :       real (kind=dbl_kind), dimension (:), intent(in) :: &
     223             :          ice_grid          ! CICE grid  cgrid(2:nilyr+1)
     224             : 
     225             :       real (kind=dbl_kind), dimension (:), intent(in) :: &
     226             :          bio_grid          ! CICE grid  grid(2:nbyrn+1)
     227             : 
     228             :       real(kind=dbl_kind), intent(in) :: &
     229             :          hice          , & ! CICE ice thickness
     230             :          hinS          , & ! brine height 
     231             :          S_min             ! for salinity on CICE grid        
     232             : 
     233             :       ! local variables
     234             : 
     235             :       integer (kind=int_kind) :: &
     236             :            kd, kr, kdr , & ! more indices
     237             :            kdi         , & ! more indices
     238             :            n_nd        , & ! number of layers in donor
     239             :            n_nr, n_plus    ! number of layers in receiver
     240             : 
     241             :       real (kind=dbl_kind), dimension (nbyrn+3+nlyrn) :: &
     242    27464032 :            trdr        , & ! combined tracer 
     243    27464032 :            trgrid          ! combined grid 
     244             : 
     245             :       real (kind=dbl_kind), dimension (nbyrn+nlyrn+3) :: &
     246    27464032 :            tracer      , & ! temporary, ice tracers values
     247    29568876 :            dgrid       , & ! temporary, donor grid dimensional
     248    26198836 :            rgrid           ! temporary, receiver grid dimensional
     249             : 
     250             :       character(len=*),parameter :: subname='(remap_zbgc)'
     251             : 
     252     4422462 :       if ((hinS < c0) .OR. (hice < c0)) then
     253           0 :          call icepack_warnings_setabort(.true.,__FILE__,__LINE__)
     254           0 :          call icepack_warnings_add(subname//' ice: remap_layers_bgc error')
     255           0 :          return
     256             :       endif
     257             :          
     258     4422462 :       if (nr0 == 0) then ! cice to bio
     259             : 
     260     2725715 :          n_nd            = nlyrn
     261     2725715 :          n_nr            = nbyrn
     262     2725715 :          n_plus          = 2
     263     2725715 :          dgrid (1)       = min(-hice+hinS, -hinS+hice, c0)            
     264     2725715 :          dgrid (nlyrn+2) = min(hinS, hice) 
     265     2725715 :          tracer(1)       = trcrn(it)
     266     2725715 :          tracer(nlyrn+2) = trcrn(it+nlyrn-1)
     267     2725715 :          rgrid (nbyrn+2) = min(hinS, hice)
     268     2725715 :          if (hice > hinS) then
     269     2265472 :             rgrid(1) = c0 
     270    20389248 :             do kr = 1,n_nr
     271    20389248 :                rgrid(kr+1) = bio_grid(kr)*hinS
     272             :             enddo
     273    20389248 :             do kd = 1,n_nd
     274    18123776 :                dgrid(kd+1) = (ice_grid(kd)-c1)*hice+hinS
     275    20389248 :                tracer(kd+1) = trcrn(it+kd-1)
     276             :             enddo
     277             :          else
     278      460243 :             rgrid(1) = -hinS + hice 
     279     3627293 :             do kr = 1,n_nr
     280     3627293 :                rgrid(kr+1) = (bio_grid(kr)-c1)*hinS + hice
     281             :             enddo
     282     3726425 :             do kd = 1,n_nd
     283     3266182 :                dgrid(kd+1) = ice_grid(kd)*hice
     284     3726425 :                tracer(kd+1) = trcrn(it+kd-1)
     285             :             enddo
     286             :          endif
     287             :               
     288             :       else               ! bio to cice
     289             : 
     290     1696747 :          n_nd = nbyrn
     291     1696747 :          n_nr = nlyrn
     292     1696747 :          if (hice > hinS) then   ! add S_min to top layer
     293     1696747 :             n_plus          = 3        
     294     1696747 :             tracer(1)       = S_min
     295     1696747 :             tracer(2)       = S_min
     296     1696747 :             rgrid (1)       = -hice + hinS
     297     1696747 :             rgrid (nlyrn+n_plus-1) = hinS 
     298    15270723 :             do kr = 1,n_nr
     299    15270723 :                rgrid(kr+1) = (ice_grid(kr)-c1)*hice+ hinS
     300             :             enddo
     301     1696747 :             dgrid (1)       = -hice+hinS
     302     1696747 :             dgrid (2)       = (hinS-hice)*p5
     303     1696747 :             dgrid (nbyrn+n_plus) = hinS
     304     1696747 :             tracer(nbyrn+n_plus) = trcrn(it+nbyrn-1)
     305    15270723 :             do kd = 1,n_nd
     306    13573976 :                dgrid(kd+2) = bio_grid(kd)*hinS
     307    15270723 :                tracer(kd+2) = trcrn(it+kd-1)
     308             :             enddo
     309      394217 :             tracer(n_plus) = (S_min*(hice-hinS) + &
     310      788434 :                          tracer(n_plus)*p5*(dgrid(n_plus+1)-dgrid(n_plus)))/ &
     311     2090964 :                         (hice-hinS+ p5*(dgrid(n_plus+1)-dgrid(n_plus)))
     312     1696747 :             tracer(1) = tracer(n_plus)
     313     1696747 :             tracer(2) = tracer(n_plus)
     314             :          else
     315           0 :             n_plus          = 2
     316           0 :             tracer(1)       = trcrn(it)
     317           0 :             tracer(nbyrn+2) = trcrn(it+nbyrn-1)
     318           0 :             dgrid (1)       = hice-hinS
     319           0 :             dgrid (nbyrn+2) = hice
     320           0 :             rgrid (nlyrn+2) = hice
     321           0 :             rgrid (1)       = c0
     322           0 :             do kd = 1,n_nd
     323           0 :               dgrid(kd+1) = (bio_grid(kd)-c1)*hinS + hice
     324           0 :               tracer(kd+1) = trcrn(it+kd-1)
     325             :             enddo
     326           0 :             do kr = 1,n_nr
     327           0 :               rgrid(kr+1) = ice_grid(kr)*hice
     328             :             enddo
     329             :          endif
     330             : 
     331             :       endif
     332             : 
     333     4422462 :       kdr = 0  ! combined indices
     334     4422462 :       kdi = 1  
     335             : 
     336    39287264 :       do kr = 1, n_nr
     337    72715851 :          do kd = kdi, n_nd+n_plus
     338    68293389 :             if (dgrid(kd) < rgrid(kr+1)) then
     339    33428587 :                kdr = kdr+1
     340    33428587 :                trgrid(kdr) = dgrid(kd)
     341    33428587 :                trdr  (kdr) = tracer(kd)
     342    34864802 :             elseif (dgrid(kd) > rgrid(kr+1)) then
     343    27270740 :                kdr = kdr + 1
     344    27270740 :                kdi = kd
     345    27270740 :                trgrid(kdr) = rgrid(kr+1)
     346    12812892 :                trtmp (it+kr-1)  = trdr(kdr-1) &
     347    12812892 :                            + (rgrid(kr+1) - trgrid(kdr-1)) &
     348    12812892 :                            * (tracer(kd) - trdr(kdr-1)) &
     349    59302970 :                            / (dgrid(kd) - trgrid(kdr-1))
     350    27270740 :                trdr(kdr) = trtmp(it+kr-1) 
     351    27270740 :                EXIT
     352             :             else
     353     7594062 :                kdr = kdr+1
     354     7594062 :                kdi = kd+1
     355     7594062 :                trgrid(kdr) = rgrid(kr+1)
     356     7594062 :                trtmp (it+kr-1)  = tracer(kd)              
     357     7594062 :                trdr  (kdr) = tracer(kd)
     358     7594062 :                EXIT
     359             :             endif
     360             :          enddo
     361             :       enddo
     362             : 
     363             :       end subroutine remap_zbgc
     364             : 
     365             : !=======================================================================
     366             : 
     367             : ! remove tracer for very small fractional areas
     368             : 
     369        6752 :       subroutine zap_small_bgc (zlevels,  dflux_bio, &
     370        6752 :                                 dt, zvol, btrcr)
     371             : 
     372             :       integer (kind=int_kind), intent(in) :: &
     373             :          zlevels    ! number of vertical levels in ice
     374             : 
     375             :       real (kind=dbl_kind), intent(in) :: &
     376             :          dt         ! time step (s)
     377             : 
     378             :       real (kind=dbl_kind), intent(inout) :: &
     379             :          dflux_bio  ! zapped bio tracer flux from biology (mmol/m^2/s)
     380             : 
     381             :       real (kind=dbl_kind), dimension (zlevels), intent(in) :: &
     382             :          btrcr  , & ! zapped bio tracer flux from biology (mmol/m^2/s)
     383             :          zvol       ! ice volume (m)
     384             : 
     385             :       ! local variables
     386             : 
     387             :       integer (kind=int_kind) :: &
     388             :          k          ! layer index
     389             : 
     390             :       character(len=*),parameter :: subname='(zap_small_bgc)'
     391             : 
     392       60656 :       do k = 1, zlevels
     393       60656 :          dflux_bio = dflux_bio + btrcr(k)*zvol(k)/dt
     394             :       enddo
     395             :           
     396        6752 :       end subroutine zap_small_bgc
     397             : 
     398             : !=======================================================================
     399             : !
     400             : ! authors     Nicole Jeffery, LANL
     401             : 
     402     3807080 :       subroutine regrid_stationary (C_stationary, hbri_old, &
     403             :                                     hbri,         dt,       &
     404             :                                     ntrcr,        nblyr,    &
     405     3807080 :                                     top_conc,     igrid,    &
     406             :                                     flux_bio,               &
     407             :                                     melt_b,       con_gel)
     408             :       
     409             :       integer (kind=int_kind), intent(in) :: &
     410             :          ntrcr,         & ! number of tracers
     411             :          nblyr            ! number of bio layers
     412             : 
     413             :       real (kind=dbl_kind), intent(inout) ::  &
     414             :          flux_bio         ! ocean tracer flux (mmol/m^2/s) positive into ocean
     415             :  
     416             :       real (kind=dbl_kind), dimension (nblyr+1), intent(inout) ::  &     
     417             :          C_stationary     ! stationary bulk concentration*h (mmol/m^2)
     418             : 
     419             :       real (kind=dbl_kind), dimension (nblyr+1), intent(in) :: &
     420             :          igrid            ! CICE bio grid 
     421             :          
     422             :       real(kind=dbl_kind),  intent(in) :: &
     423             :          dt           , & ! time step
     424             :          top_conc     , & ! c0 or frazil concentration
     425             :          hbri_old     , & ! previous timestep brine height
     426             :          hbri             ! brine height 
     427             : 
     428             :       real(kind=dbl_kind), intent(in), optional :: &
     429             :          melt_b,         &  ! bottom melt (m)
     430             :          con_gel            ! bottom growth (m)
     431             : 
     432             :       !  local variables
     433             : 
     434             :       integer (kind=int_kind) :: k, nt, nr
     435             : 
     436             :       real (kind=dbl_kind), dimension (ntrcr+2) :: &
     437   218781430 :          trtmp0,   &    ! temporary, remapped tracers
     438   220564762 :          trtmp
     439             : 
     440             :       real (kind=dbl_kind):: &
     441      891666 :          meltb,    &    ! ice bottom melt (m)
     442      891666 :          congel,   &    ! ice bottom growth (m)
     443      891666 :          htemp,    &    ! ice thickness after melt (m)
     444      891666 :          dflux,    &    ! regrid flux correction (mmol/m^2)
     445      891666 :          sum_i,    &    ! total tracer before melt loss
     446      891666 :          sum_f,    &    ! total tracer after melt
     447      891666 :          hice,     & 
     448      891666 :          hbio
     449             : 
     450             :       real (kind=dbl_kind), dimension(nblyr+1):: &
     451    11832074 :          zspace
     452             : 
     453             :       character(len=*),parameter :: subname='(regrid_stationary)'
     454             : 
     455             :       ! initialize
     456             : 
     457    34263720 :       zspace(:) = c1/(real(nblyr,kind=dbl_kind))
     458     3807080 :       zspace(1) = p5*zspace(1)
     459     3807080 :       zspace(nblyr+1) = zspace(1)
     460   927227032 :       trtmp0(:) = c0
     461   927227032 :       trtmp(:) = c0
     462     3807080 :       meltb = c0
     463     3807080 :       nt = 1
     464     3807080 :       nr = 0
     465     3807080 :       sum_i = c0
     466     3807080 :       sum_f = c0
     467     3807080 :       meltb = c0
     468     3807080 :       congel = c0
     469     3807080 :       dflux = c0
     470             : 
     471             :       !---------------------
     472             :       ! compute initial sum
     473             :       !----------------------
     474             :      
     475    34263720 :       do k = 1, nblyr+1
     476    34263720 :          sum_i = sum_i + C_stationary(k)*zspace(k)
     477             :         
     478             :       enddo
     479             :      
     480     3807080 :       if (present(melt_b)) then
     481     3806640 :          meltb = melt_b
     482             :       endif
     483     3807080 :       if (present(con_gel)) then
     484     3806640 :          congel = con_gel
     485             :       endif
     486             : 
     487     3807080 :       if (hbri_old > c0) then
     488    34263720 :          do k = 1, nblyr+1
     489    34263720 :             trtmp0(nblyr+2-k) = C_stationary(k)/hbri_old  ! reverse order
     490             :          enddo   ! k
     491             :       endif
     492             : 
     493     3807080 :       htemp = c0
     494             : 
     495     3807080 :       if (meltb > c0) then
     496     2110333 :           htemp = hbri_old-meltb  
     497     2110333 :           nr = 0
     498     2110333 :           hice = hbri_old
     499     2110333 :           hbio = htemp
     500     1696747 :       elseif (congel > c0) then
     501     1696307 :           htemp = hbri_old+congel
     502     1696307 :           nr = 1
     503     1696307 :           hice = htemp
     504     1696307 :           hbio = hbri_old
     505         440 :       elseif (hbri .gt. hbri_old) then
     506         440 :           htemp = hbri
     507         440 :           nr = 1
     508         440 :           hice = htemp
     509         440 :           hbio = hbri_old
     510             :       endif
     511             :      
     512             :       !-----------------------------------------------------------------
     513             :       ! Regrid C_stationary to add or remove bottom layer(s)
     514             :       !-----------------------------------------------------------------
     515     3807080 :       if (htemp > c0) then
     516             :           call remap_zbgc   (nblyr+1,  &
     517             :                              nt,                         &
     518           0 :                              trtmp0(1:ntrcr),            &
     519           0 :                              trtmp,                      &
     520             :                              nr,                nblyr+1, & 
     521             :                              hice,              hbio,    & 
     522           0 :                              igrid(1:nblyr+1),           &
     523     3807080 :                              igrid(1:nblyr+1), top_conc  )
     524     3807080 :           if (icepack_warnings_aborted(subname)) return
     525             :     
     526   927227032 :           trtmp0(:) = c0
     527    34263720 :           do k = 1,nblyr+1
     528    34263720 :              trtmp0(nblyr+2-k) = trtmp(nt + k-1)
     529             :           enddo       !k
     530             :          
     531    34263720 :           do k = 1, nblyr+1
     532    30456640 :              C_stationary(k) = trtmp0(k)*htemp
     533    34263720 :              sum_f = sum_f + C_stationary(k)*zspace(k)
     534             :           enddo   ! k
     535             : 
     536     3807080 :          if (congel > c0 .and. top_conc .le. c0 .and. abs(sum_i-sum_f) > puny) then
     537      866580 :             dflux = sum_i - sum_f
     538      866580 :             sum_f = c0
     539     7799220 :             do k = 1,nblyr+1
     540     6932640 :                 C_stationary(k) = max(c0,C_stationary(k) + dflux)
     541     7799220 :                 sum_f = sum_f + C_stationary(k)*zspace(k)
     542             :             enddo
     543             :          endif
     544             :        
     545     3807080 :          flux_bio = flux_bio + (sum_i -sum_f)/dt 
     546             :       endif
     547             : 
     548             :       end subroutine regrid_stationary
     549             : 
     550             : !=======================================================================
     551             : !
     552             : ! Aggregate flux information from all ice thickness categories
     553             : ! for z layer biogeochemistry
     554             : !
     555      199620 :       subroutine merge_bgc_fluxes (dt,       nblyr,      &
     556      199620 :                                bio_index,    n_algae,    &
     557             :                                nbtrcr,       aicen,      &    
     558             :                                vicen,        vsnon,      &
     559      199620 :                                iphin,      &
     560      199620 :                                trcrn,      &
     561      199620 :                                flux_bion,    flux_bio,   &
     562      199620 :                                upNOn,        upNHn,      &
     563             :                                upNO,         upNH,       &
     564      399240 :                                zbgc_snown,   zbgc_atmn,  &
     565      399240 :                                zbgc_snow,    zbgc_atm,   &
     566      199620 :                                PP_net,       ice_bio_net,&
     567      399240 :                                snow_bio_net, grow_alg,   &
     568             :                                grow_net)
     569             :  
     570             :       real (kind=dbl_kind), intent(in) :: &          
     571             :          dt             ! timestep (s)
     572             : 
     573             :       integer (kind=int_kind), intent(in) :: &
     574             :          nblyr, &
     575             :          n_algae, &     !
     576             :          nbtrcr         ! number of biology tracer tracers
     577             : 
     578             :       integer (kind=int_kind), dimension(:), intent(in) :: &
     579             :          bio_index      ! relates bio indices, ie.  nlt_bgc_N to nt_bgc_N 
     580             : 
     581             :       real (kind=dbl_kind), dimension (:), intent(in) :: &
     582             :          trcrn     , &  ! input tracer fields
     583             :          iphin          ! porosity
     584             : 
     585             :       real (kind=dbl_kind), intent(in):: &          
     586             :          aicen      , & ! concentration of ice
     587             :          vicen      , & ! volume of ice (m)
     588             :          vsnon          ! volume of snow(m)
     589             : 
     590             :       ! single category rates
     591             :       real (kind=dbl_kind), dimension(:), intent(in):: &
     592             :          zbgc_snown , & ! bio flux from snow to ice per cat (mmol/m^3*m) 
     593             :          zbgc_atmn  , & ! bio flux from atm to ice per cat (mmol/m^3*m)
     594             :          flux_bion
     595             : 
     596             :       ! single category rates
     597             :       real (kind=dbl_kind), dimension(:,:), intent(in):: &
     598             :          upNOn      , & ! nitrate uptake rate per cat (mmol/m^3/s)
     599             :          upNHn      , & ! ammonium uptake rate per cat (mmol/m^3/s)   
     600             :          grow_alg       ! algal growth rate per cat (mmolN/m^3/s)
     601             : 
     602             :       ! cumulative fluxes
     603             :       real (kind=dbl_kind), dimension(:), intent(inout):: &     
     604             :          flux_bio   , & ! 
     605             :          zbgc_snow  , & ! bio flux from snow to ice per cat (mmol/m^2/s) 
     606             :          zbgc_atm   , & ! bio flux from atm to ice per cat (mmol/m^2/s)
     607             :          ice_bio_net, & ! integrated ice tracers mmol or mg/m^2)
     608             :          snow_bio_net   ! integrated snow tracers mmol or mg/m^2)
     609             : 
     610             :       ! cumulative variables and rates
     611             :       real (kind=dbl_kind), intent(inout):: & 
     612             :          PP_net     , & ! net PP (mg C/m^2/d)  times aice
     613             :          grow_net   , & ! net specific growth (m/d) times vice
     614             :          upNO       , & ! tot nitrate uptake rate (mmol/m^2/d) times aice 
     615             :          upNH           ! tot ammonium uptake rate (mmol/m^2/d) times aice
     616             : 
     617             :       ! local variables
     618             : 
     619             :       real (kind=dbl_kind) :: &
     620       48078 :          tmp        , & ! temporary
     621       48078 :          dvssl      , & ! volume of snow surface layer (m)
     622       48078 :          dvint          ! volume of snow interior      (m)
     623             : 
     624             :       integer (kind=int_kind) :: &
     625             :          k, mm         ! tracer indice
     626             : 
     627             :       real (kind=dbl_kind), dimension (nblyr+1) :: & 
     628      735786 :          zspace
     629             : 
     630             :       character(len=*),parameter :: subname='(merge_bgc_fluxes)'
     631             : 
     632             :       !-----------------------------------------------------------------
     633             :       ! Column summation
     634             :       !-----------------------------------------------------------------
     635     1796580 :       zspace(:) = c1/real(nblyr,kind=dbl_kind)
     636      199620 :       zspace(1) = p5/real(nblyr,kind=dbl_kind)
     637      199620 :       zspace(nblyr+1) =  p5/real(nblyr,kind=dbl_kind)
     638             : 
     639     4158976 :       do mm = 1, nbtrcr
     640    35634204 :          do k = 1, nblyr+1
     641     7428128 :             ice_bio_net(mm) = ice_bio_net(mm) &
     642    14856256 :                             + trcrn(bio_index(mm)+k-1) &
     643     7428128 :                             * trcrn(nt_fbri) &
     644    43062332 :                             * vicen*zspace(k)
     645             :          enddo    ! k
     646             :       
     647             :       !-----------------------------------------------------------------
     648             :       ! Merge fluxes
     649             :       !-----------------------------------------------------------------
     650     3959356 :          dvssl  = min(p5*vsnon, hs_ssl*aicen) ! snow surface layer
     651     3959356 :          dvint  = vsnon - dvssl               ! snow interior
     652      928516 :          snow_bio_net(mm) = snow_bio_net(mm) &
     653     1857032 :                           + trcrn(bio_index(mm)+nblyr+1)*dvssl &
     654     4887872 :                           + trcrn(bio_index(mm)+nblyr+2)*dvint
     655     3959356 :          flux_bio    (mm) = flux_bio (mm) + flux_bion (mm)*aicen
     656     3959356 :          zbgc_snow   (mm) = zbgc_snow(mm) + zbgc_snown(mm)*aicen/dt
     657     4158976 :          zbgc_atm    (mm) = zbgc_atm (mm) + zbgc_atmn (mm)*aicen/dt
     658             :       enddo     ! mm
     659             : 
     660      199620 :       if (solve_zbgc) then
     661      798480 :          do mm = 1, n_algae
     662     5589360 :             do k = 1, nblyr+1
     663     4790880 :                tmp      = iphin(k)*trcrn(nt_fbri)*vicen*zspace(k)*secday 
     664     1153872 :                PP_net   = PP_net   + grow_alg(k,mm)*tmp &
     665     4790880 :                         * (c1-fr_resp)* R_C2N(mm)*R_gC2molC 
     666     1153872 :                grow_net = grow_net + grow_alg(k,mm)*tmp &
     667     4790880 :                         / (trcrn(nt_bgc_N(mm)+k-1)+puny)
     668     4790880 :                upNO     = upNO     + upNOn   (k,mm)*tmp 
     669     5389740 :                upNH     = upNH     + upNHn   (k,mm)*tmp
     670             :             enddo   ! k
     671             :          enddo      ! mm
     672             :       endif
     673             : 
     674      199620 :       end subroutine merge_bgc_fluxes
     675             : 
     676             : !=======================================================================
     677             : 
     678             : ! Aggregate flux information from all ice thickness categories
     679             : ! for skeletal layer biogeochemistry
     680             : !
     681             : ! author: Elizabeth C. Hunke and William H. Lipscomb, LANL
     682             : 
     683        8261 :       subroutine merge_bgc_fluxes_skl (nbtrcr, n_algae,    &
     684        8261 :                                aicen,     trcrn,           &
     685        8261 :                                flux_bion, flux_bio,        &
     686        8261 :                                PP_net,    upNOn,           &
     687        8261 :                                upNHn,     upNO,            &
     688             :                                upNH,      grow_net,        &
     689        8261 :                                grow_alg)
     690             : 
     691             :       integer (kind=int_kind), intent(in) :: &
     692             :          nbtrcr  , & ! number of bgc tracers
     693             :          n_algae     ! number of autotrophs
     694             : 
     695             :       ! single category fluxes
     696             :       real (kind=dbl_kind), intent(in):: &          
     697             :          aicen       ! category ice area fraction
     698             : 
     699             :       real (kind=dbl_kind), dimension (:), intent(in) :: &
     700             :          trcrn       ! Bulk tracer concentration (mmol N or mg/m^3)
     701             :      
     702             :       real (kind=dbl_kind), dimension(:), intent(in):: &
     703             :          flux_bion   ! all bio fluxes to ocean, on categories
     704             : 
     705             :       real (kind=dbl_kind), dimension(:), intent(inout):: &
     706             :          flux_bio    ! all bio fluxes to ocean, aggregated
     707             : 
     708             :       real (kind=dbl_kind), dimension(:), intent(in):: & 
     709             :          grow_alg, & ! algal growth rate (mmol/m^3/s) 
     710             :          upNOn   , & ! nitrate uptake rate per cat (mmol/m^3/s)
     711             :          upNHn       ! ammonium uptake rate per cat (mmol/m^3/s)   
     712             : 
     713             :       ! history output
     714             :       real (kind=dbl_kind), intent(inout):: & 
     715             :          PP_net  , & ! Bulk net PP (mg C/m^2/d)
     716             :          grow_net, & ! net specific growth (/d)
     717             :          upNO    , & ! tot nitrate uptake rate (mmol/m^2/d) 
     718             :          upNH        ! tot ammonium uptake rate (mmol/m^2/d)
     719             :       
     720             :       ! local variables
     721             : 
     722             :       integer (kind=int_kind) :: &
     723             :          k, mm       ! tracer indices
     724             : 
     725             :       real (kind=dbl_kind) :: &
     726        8261 :          tmp         ! temporary
     727             :     
     728             :       character(len=*),parameter :: subname='(merge_bgc_fluxes_skl)'
     729             : 
     730             :       !-----------------------------------------------------------------
     731             :       ! Merge fluxes
     732             :       !-----------------------------------------------------------------
     733             : 
     734      140437 :       do k = 1,nbtrcr
     735      140437 :          flux_bio (k) = flux_bio(k) + flux_bion(k)*aicen
     736             :       enddo
     737             : 
     738       33044 :       do mm = 1, n_algae
     739       24783 :          tmp = phi_sk * sk_l * aicen * secday 
     740             :          PP_net   = PP_net   &
     741       24783 :                   + grow_alg(mm) * tmp &
     742       24783 :                   * R_C2N(mm) * R_gC2molC * (c1-fr_resp) 
     743             :          grow_net = grow_net &
     744       24783 :                   + grow_alg(mm) * tmp &
     745       24783 :                   / (trcrn(nt_bgc_N(mm))+puny)
     746       24783 :          upNO     = upNO  + upNOn(mm) * tmp
     747       33044 :          upNH     = upNH  + upNHn(mm) * tmp
     748             :       enddo
     749             : 
     750        8261 :       end subroutine merge_bgc_fluxes_skl
     751             : 
     752             : !=======================================================================
     753             : 
     754             :       end module icepack_zbgc_shared
     755             : 
     756             : !=======================================================================

Generated by: LCOV version 1.14-6-g40580cd