LCOV - code coverage report
Current view: top level - icepack/columnphysics - icepack_zbgc_shared.F90 (source / functions) Hit Total Coverage
Test: 200617-180449:aec9683041:7:first,base,travis,decomp,reprosum,io,quick Lines: 209 231 90.48 %
Date: 2020-06-17 18:05:09 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  1030798563 :       subroutine remap_zbgc(nlyrn,    &
     203             :                             it,                 &
     204  2061597126 :                             trcrn,    trtmp,    &
     205             :                             nr0,      nbyrn,    &
     206             :                             hice,     hinS,     &
     207  1030798563 :                             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  2111726403 :            trdr        , & ! combined tracer 
     243  2111726403 :            trgrid          ! combined grid 
     244             : 
     245             :       real (kind=dbl_kind), dimension (nbyrn+nlyrn+3) :: &
     246  2111726403 :            tracer      , & ! temporary, ice tracers values
     247  2117481111 :            dgrid       , & ! temporary, donor grid dimensional
     248  1089559902 :            rgrid           ! temporary, receiver grid dimensional
     249             : 
     250             :       character(len=*),parameter :: subname='(remap_zbgc)'
     251             : 
     252  1030798563 :       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  1030798563 :       if (nr0 == 0) then ! cice to bio
     259             : 
     260   492552318 :          n_nd            = nlyrn
     261   492552318 :          n_nr            = nbyrn
     262   492552318 :          n_plus          = 2
     263   492552318 :          dgrid (1)       = min(-hice+hinS, -hinS+hice, c0)            
     264   492552318 :          dgrid (nlyrn+2) = min(hinS, hice) 
     265   492552318 :          tracer(1)       = trcrn(it)
     266   492552318 :          tracer(nlyrn+2) = trcrn(it+nlyrn-1)
     267   492552318 :          rgrid (nbyrn+2) = min(hinS, hice)
     268   492552318 :          if (hice > hinS) then
     269   373330799 :             rgrid(1) = c0 
     270  3359977191 :             do kr = 1,n_nr
     271  3359977191 :                rgrid(kr+1) = bio_grid(kr)*hinS
     272             :             enddo
     273  3359977191 :             do kd = 1,n_nd
     274  2986646392 :                dgrid(kd+1) = (ice_grid(kd)-c1)*hice+hinS
     275  3359977191 :                tracer(kd+1) = trcrn(it+kd-1)
     276             :             enddo
     277             :          else
     278   119221519 :             rgrid(1) = -hinS + hice 
     279   604590955 :             do kr = 1,n_nr
     280   604590955 :                rgrid(kr+1) = (bio_grid(kr)-c1)*hinS + hice
     281             :             enddo
     282   954522244 :             do kd = 1,n_nd
     283   835300725 :                dgrid(kd+1) = ice_grid(kd)*hice
     284   954522244 :                tracer(kd+1) = trcrn(it+kd-1)
     285             :             enddo
     286             :          endif
     287             :               
     288             :       else               ! bio to cice
     289             : 
     290   538246245 :          n_nd = nbyrn
     291   538246245 :          n_nr = nlyrn
     292   538246245 :          if (hice > hinS) then   ! add S_min to top layer
     293   538246245 :             n_plus          = 3        
     294   538246245 :             tracer(1)       = S_min
     295   538246245 :             tracer(2)       = S_min
     296   538246245 :             rgrid (1)       = -hice + hinS
     297   538246245 :             rgrid (nlyrn+n_plus-1) = hinS 
     298  4844216205 :             do kr = 1,n_nr
     299  4844216205 :                rgrid(kr+1) = (ice_grid(kr)-c1)*hice+ hinS
     300             :             enddo
     301   538246245 :             dgrid (1)       = -hice+hinS
     302   538246245 :             dgrid (2)       = (hinS-hice)*p5
     303   538246245 :             dgrid (nbyrn+n_plus) = hinS
     304   538246245 :             tracer(nbyrn+n_plus) = trcrn(it+nbyrn-1)
     305  4844216205 :             do kd = 1,n_nd
     306  4305969960 :                dgrid(kd+2) = bio_grid(kd)*hinS
     307  4844216205 :                tracer(kd+2) = trcrn(it+kd-1)
     308             :             enddo
     309     2353158 :             tracer(n_plus) = (S_min*(hice-hinS) + &
     310     4706316 :                          tracer(n_plus)*p5*(dgrid(n_plus+1)-dgrid(n_plus)))/ &
     311   540599403 :                         (hice-hinS+ p5*(dgrid(n_plus+1)-dgrid(n_plus)))
     312   538246245 :             tracer(1) = tracer(n_plus)
     313   538246245 :             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  1030798563 :       kdr = 0  ! combined indices
     334  1030798563 :       kdi = 1  
     335             : 
     336  8808784351 :       do kr = 1, n_nr
     337 16549111722 :          do kd = kdi, n_nd+n_plus
     338 15518313159 :             if (dgrid(kd) < rgrid(kr+1)) then
     339  7740327371 :                kdr = kdr+1
     340  7740327371 :                trgrid(kdr) = dgrid(kd)
     341  7740327371 :                trdr  (kdr) = tracer(kd)
     342  7777985788 :             elseif (dgrid(kd) > rgrid(kr+1)) then
     343  5997198033 :                kdr = kdr + 1
     344  5997198033 :                kdi = kd
     345  5997198033 :                trgrid(kdr) = rgrid(kr+1)
     346    31755248 :                trtmp (it+kr-1)  = trdr(kdr-1) &
     347    31755248 :                            + (rgrid(kr+1) - trgrid(kdr-1)) &
     348    31755248 :                            * (tracer(kd) - trdr(kdr-1)) &
     349  6076586153 :                            / (dgrid(kd) - trgrid(kdr-1))
     350  5997198033 :                trdr(kdr) = trtmp(it+kr-1) 
     351  5997198033 :                EXIT
     352             :             else
     353  1780787755 :                kdr = kdr+1
     354  1780787755 :                kdi = kd+1
     355  1780787755 :                trgrid(kdr) = rgrid(kr+1)
     356  1780787755 :                trtmp (it+kr-1)  = tracer(kd)              
     357  1780787755 :                trdr  (kdr) = tracer(kd)
     358  1780787755 :                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    53423161 :       subroutine zap_small_bgc (zlevels,  dflux_bio, &
     370    53423161 :                                 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   312128497 :       do k = 1, zlevels
     393   312128497 :          dflux_bio = dflux_bio + btrcr(k)*zvol(k)/dt
     394             :       enddo
     395             :           
     396    53423161 :       end subroutine zap_small_bgc
     397             : 
     398             : !=======================================================================
     399             : !
     400             : ! authors     Nicole Jeffery, LANL
     401             : 
     402   882911457 :       subroutine regrid_stationary (C_stationary, hbri_old, &
     403             :                                     hbri,         dt,       &
     404             :                                     ntrcr,        nblyr,    &
     405   882911457 :                                     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  2334199554 :          trtmp0,   &    ! temporary, remapped tracers
     438  2339036802 :          trtmp
     439             : 
     440             :       real (kind=dbl_kind):: &
     441     2418624 :          meltb,    &    ! ice bottom melt (m)
     442     2418624 :          congel,   &    ! ice bottom growth (m)
     443     2418624 :          htemp,    &    ! ice thickness after melt (m)
     444     2418624 :          dflux,    &    ! regrid flux correction (mmol/m^2)
     445     2418624 :          sum_i,    &    ! total tracer before melt loss
     446     2418624 :          sum_f,    &    ! total tracer after melt
     447     2418624 :          hice,     & 
     448     2418624 :          hbio
     449             : 
     450             :       real (kind=dbl_kind), dimension(nblyr+1):: &
     451   904679073 :          zspace
     452             : 
     453             :       character(len=*),parameter :: subname='(regrid_stationary)'
     454             : 
     455             :       ! initialize
     456             : 
     457  7946203113 :       zspace(:) = c1/(real(nblyr,kind=dbl_kind))
     458   882911457 :       zspace(1) = p5*zspace(1)
     459   882911457 :       zspace(nblyr+1) = zspace(1)
     460 >20925*10^7 :       trtmp0(:) = c0
     461 >20925*10^7 :       trtmp(:) = c0
     462   882911457 :       meltb = c0
     463   882911457 :       nt = 1
     464   882911457 :       nr = 0
     465   882911457 :       sum_i = c0
     466   882911457 :       sum_f = c0
     467   882911457 :       meltb = c0
     468   882911457 :       congel = c0
     469   882911457 :       dflux = c0
     470             : 
     471             :       !---------------------
     472             :       ! compute initial sum
     473             :       !----------------------
     474             :      
     475  7946203113 :       do k = 1, nblyr+1
     476  7946203113 :          sum_i = sum_i + C_stationary(k)*zspace(k)
     477             :         
     478             :       enddo
     479             :      
     480   882911457 :       if (present(melt_b)) then
     481   532629376 :          meltb = melt_b
     482             :       endif
     483   882911457 :       if (present(con_gel)) then
     484   532629376 :          congel = con_gel
     485             :       endif
     486             : 
     487   882911457 :       if (hbri_old > c0) then
     488  7946203113 :          do k = 1, nblyr+1
     489  7946203113 :             trtmp0(nblyr+2-k) = C_stationary(k)/hbri_old  ! reverse order
     490             :          enddo   ! k
     491             :       endif
     492             : 
     493   882911457 :       htemp = c0
     494             : 
     495   882911457 :       if (meltb > c0) then
     496   344665212 :           htemp = hbri_old-meltb  
     497   344665212 :           nr = 0
     498   344665212 :           hice = hbri_old
     499   344665212 :           hbio = htemp
     500   538246245 :       elseif (congel > c0) then
     501   187964164 :           htemp = hbri_old+congel
     502   187964164 :           nr = 1
     503   187964164 :           hice = htemp
     504   187964164 :           hbio = hbri_old
     505   350282081 :       elseif (hbri .gt. hbri_old) then
     506   350282081 :           htemp = hbri
     507   350282081 :           nr = 1
     508   350282081 :           hice = htemp
     509   350282081 :           hbio = hbri_old
     510             :       endif
     511             :      
     512             :       !-----------------------------------------------------------------
     513             :       ! Regrid C_stationary to add or remove bottom layer(s)
     514             :       !-----------------------------------------------------------------
     515   882911457 :       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   882911457 :                              igrid(1:nblyr+1), top_conc  )
     524   882911457 :           if (icepack_warnings_aborted(subname)) return
     525             :     
     526 >20925*10^7 :           trtmp0(:) = c0
     527  7946203113 :           do k = 1,nblyr+1
     528  7946203113 :              trtmp0(nblyr+2-k) = trtmp(nt + k-1)
     529             :           enddo       !k
     530             :          
     531  7946203113 :           do k = 1, nblyr+1
     532  7063291656 :              C_stationary(k) = trtmp0(k)*htemp
     533  7946203113 :              sum_f = sum_f + C_stationary(k)*zspace(k)
     534             :           enddo   ! k
     535             : 
     536   882911457 :          if (congel > c0 .and. top_conc .le. c0 .and. abs(sum_i-sum_f) > puny) then
     537   115738211 :             dflux = sum_i - sum_f
     538   115738211 :             sum_f = c0
     539  1041643899 :             do k = 1,nblyr+1
     540   925905688 :                 C_stationary(k) = max(c0,C_stationary(k) + dflux)
     541  1041643899 :                 sum_f = sum_f + C_stationary(k)*zspace(k)
     542             :             enddo
     543             :          endif
     544             :        
     545   882911457 :          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    29415679 :       subroutine merge_bgc_fluxes (dt,       nblyr,      &
     556    29415679 :                                bio_index,    n_algae,    &
     557             :                                nbtrcr,       aicen,      &    
     558             :                                vicen,        vsnon,      &
     559    29415679 :                                iphin,      &
     560    29415679 :                                trcrn,      &
     561    29415679 :                                flux_bion,    flux_bio,   &
     562    29415679 :                                upNOn,        upNHn,      &
     563             :                                upNO,         upNH,       &
     564    58831358 :                                zbgc_snown,   zbgc_atmn,  &
     565    58831358 :                                zbgc_snow,    zbgc_atm,   &
     566    29415679 :                                PP_net,       ice_bio_net,&
     567    58831358 :                                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       80291 :          tmp        , & ! temporary
     621       80291 :          dvssl      , & ! volume of snow surface layer (m)
     622       80291 :          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    59393395 :          zspace
     629             : 
     630             :       character(len=*),parameter :: subname='(merge_bgc_fluxes)'
     631             : 
     632             :       !-----------------------------------------------------------------
     633             :       ! Column summation
     634             :       !-----------------------------------------------------------------
     635   264741111 :       zspace(:) = c1/real(nblyr,kind=dbl_kind)
     636    29415679 :       zspace(1) = p5/real(nblyr,kind=dbl_kind)
     637    29415679 :       zspace(nblyr+1) =  p5/real(nblyr,kind=dbl_kind)
     638             : 
     639   588313580 :       do mm = 1, nbtrcr
     640  5030081109 :          do k = 1, nblyr+1
     641    12204232 :             ice_bio_net(mm) = ice_bio_net(mm) &
     642    24408464 :                             + trcrn(bio_index(mm)+k-1) &
     643    12204232 :                             * trcrn(nt_fbri) &
     644  5042285341 :                             * vicen*zspace(k)
     645             :          enddo    ! k
     646             :       
     647             :       !-----------------------------------------------------------------
     648             :       ! Merge fluxes
     649             :       !-----------------------------------------------------------------
     650   558897901 :          dvssl  = min(p5*vsnon, hs_ssl*aicen) ! snow surface layer
     651   558897901 :          dvint  = vsnon - dvssl               ! snow interior
     652     1525529 :          snow_bio_net(mm) = snow_bio_net(mm) &
     653     3051058 :                           + trcrn(bio_index(mm)+nblyr+1)*dvssl &
     654   560423430 :                           + trcrn(bio_index(mm)+nblyr+2)*dvint
     655   558897901 :          flux_bio    (mm) = flux_bio (mm) + flux_bion (mm)*aicen
     656   558897901 :          zbgc_snow   (mm) = zbgc_snow(mm) + zbgc_snown(mm)*aicen/dt
     657   588313580 :          zbgc_atm    (mm) = zbgc_atm (mm) + zbgc_atmn (mm)*aicen/dt
     658             :       enddo     ! mm
     659             : 
     660    29415679 :       if (solve_zbgc) then
     661   117662716 :          do mm = 1, n_algae
     662   823639012 :             do k = 1, nblyr+1
     663   705976296 :                tmp      = iphin(k)*trcrn(nt_fbri)*vicen*zspace(k)*secday 
     664     1926984 :                PP_net   = PP_net   + grow_alg(k,mm)*tmp &
     665   705976296 :                         * (c1-fr_resp)* R_C2N(mm)*R_gC2molC 
     666     1926984 :                grow_net = grow_net + grow_alg(k,mm)*tmp &
     667   705976296 :                         / (trcrn(nt_bgc_N(mm)+k-1)+puny)
     668   705976296 :                upNO     = upNO     + upNOn   (k,mm)*tmp 
     669   794223333 :                upNH     = upNH     + upNHn   (k,mm)*tmp
     670             :             enddo   ! k
     671             :          enddo      ! mm
     672             :       endif
     673             : 
     674    29415679 :       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    29255097 :       subroutine merge_bgc_fluxes_skl (nbtrcr, n_algae,    &
     684    29255097 :                                aicen,     trcrn,           &
     685    29255097 :                                flux_bion, flux_bio,        &
     686    29255097 :                                PP_net,    upNOn,           &
     687    29255097 :                                upNHn,     upNO,            &
     688             :                                upNH,      grow_net,        &
     689    29255097 :                                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       80291 :          tmp         ! temporary
     727             :     
     728             :       character(len=*),parameter :: subname='(merge_bgc_fluxes_skl)'
     729             : 
     730             :       !-----------------------------------------------------------------
     731             :       ! Merge fluxes
     732             :       !-----------------------------------------------------------------
     733             : 
     734   497336649 :       do k = 1,nbtrcr
     735   497336649 :          flux_bio (k) = flux_bio(k) + flux_bion(k)*aicen
     736             :       enddo
     737             : 
     738   117020388 :       do mm = 1, n_algae
     739    87765291 :          tmp = phi_sk * sk_l * aicen * secday 
     740             :          PP_net   = PP_net   &
     741      240873 :                   + grow_alg(mm) * tmp &
     742    87765291 :                   * R_C2N(mm) * R_gC2molC * (c1-fr_resp) 
     743             :          grow_net = grow_net &
     744      240873 :                   + grow_alg(mm) * tmp &
     745    87765291 :                   / (trcrn(nt_bgc_N(mm))+puny)
     746    87765291 :          upNO     = upNO  + upNOn(mm) * tmp
     747   117020388 :          upNH     = upNH  + upNHn(mm) * tmp
     748             :       enddo
     749             : 
     750    29255097 :       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