LCOV - code coverage report
Current view: top level - icepack/columnphysics - icepack_zbgc.F90 (source / functions) Coverage Total Hit
Test: 250115-172326:736c1771a8:7:first,quick,base,travis,io,gridsys,unittest Lines: 93.42 % 395 369
Test Date: 2025-01-15 16:42:12 Functions: 100.00 % 8 8

            Line data    Source code
       1              : !=======================================================================
       2              : !
       3              : ! Biogeochemistry driver
       4              : !
       5              : ! authors: Nicole Jeffery, LANL
       6              : !          Scott Elliot,   LANL
       7              : !          Elizabeth C. Hunke, LANL
       8              : !
       9              :       module icepack_zbgc
      10              : 
      11              :       use icepack_kinds
      12              :       use icepack_parameters
      13              : 
      14              :       !use icepack_parameters, only: c0, c1, c2, p001, p1, p5, puny
      15              :       !use icepack_parameters, only: depressT, rhosi, min_salin, salt_loss
      16              :       !use icepack_parameters, only: fr_resp, algal_vel, R_dFe2dust, dustFe_sol, T_max
      17              :       !use icepack_parameters, only: op_dep_min, fr_graze_s, fr_graze_e, fr_mort2min, fr_dFe
      18              :       !use icepack_parameters, only: k_nitrif, t_iron_conv, max_loss, max_dfe_doc1
      19              :       !use icepack_parameters, only: fr_resp_s, y_sk_DMS, t_sk_conv, t_sk_ox
      20              :       !use icepack_parameters, only: scale_bgc, ktherm, skl_bgc
      21              :       !use icepack_parameters, only: z_tracers, fsal, conserv_check
      22              : 
      23              :       use icepack_tracers, only: max_algae, max_dic, max_doc, max_don, max_fe
      24              :       use icepack_tracers, only: max_aero, max_nbtrcr
      25              :       use icepack_tracers, only: ncat, nilyr, nslyr, nblyr, nbtrcr, ntrcr, ntrcr_o
      26              :       use icepack_tracers, only: tr_brine, nt_fbri, nt_qice, nt_Tsfc
      27              :       use icepack_tracers, only: tr_zaero, tr_bgc_Nit, tr_bgc_N
      28              :       use icepack_tracers, only: tr_bgc_DON, tr_bgc_C, tr_bgc_chl
      29              :       use icepack_tracers, only: tr_bgc_Am, tr_bgc_Sil, tr_bgc_DMS
      30              :       use icepack_tracers, only: tr_bgc_Fe, tr_bgc_hum, tr_bgc_PON
      31              :       use icepack_tracers, only: nt_bgc_Nit, nlt_bgc_Nit
      32              :       use icepack_tracers, only: nt_bgc_N, nlt_bgc_N, nt_bgc_Am, nlt_bgc_Am
      33              :       use icepack_tracers, only: nt_bgc_DMSPp, nlt_bgc_DMSPp, nt_bgc_Sil, nlt_bgc_Sil
      34              :       use icepack_tracers, only: nt_bgc_DMSPd, nlt_bgc_DMSPd, nt_bgc_DMS, nlt_bgc_DMS
      35              :       use icepack_tracers, only: nt_bgc_hum, nlt_bgc_hum, nt_bgc_PON, nlt_bgc_PON
      36              :       use icepack_tracers, only: nt_bgc_C, nlt_bgc_C, nt_bgc_chl, nlt_bgc_chl
      37              :       use icepack_tracers, only: nt_bgc_DOC, nlt_bgc_DOC, nt_bgc_DON, nlt_bgc_DON
      38              :       use icepack_tracers, only: nt_bgc_DIC, nlt_bgc_DIC, nt_bgc_Fed, nlt_bgc_Fed
      39              :       use icepack_tracers, only: nt_sice, bio_index, bio_index_o
      40              :       use icepack_tracers, only: nt_zaero, nlt_zaero, nt_bgc_Fep, nlt_bgc_Fep
      41              :       use icepack_tracers, only: nlt_zaero_sw, nlt_chl_sw, nt_zbgc_frac
      42              :       use icepack_tracers, only: n_algae, n_doc, n_dic, n_don, n_fed, n_fep, n_zaero
      43              : 
      44              :       use icepack_zbgc_shared, only: zbgc_init_frac
      45              :       use icepack_zbgc_shared, only: zbgc_frac_init
      46              :       use icepack_zbgc_shared, only: bgrid, cgrid, igrid, icgrid
      47              :       use icepack_zbgc_shared, only: bgc_tracer_type, remap_zbgc
      48              :       use icepack_zbgc_shared, only: R_S2N, R_Si2N, R_Fe2C, R_Fe2N, R_Fe2DON, R_Fe2DOC
      49              :       use icepack_zbgc_shared, only: chlabs, alpha2max_low, beta2max
      50              :       use icepack_zbgc_shared, only: mu_max, grow_Tdep, fr_graze
      51              :       use icepack_zbgc_shared, only: mort_pre, mort_Tdep, k_exude
      52              :       use icepack_zbgc_shared, only: K_Nit, K_Am, K_Sil, K_Fe
      53              :       use icepack_zbgc_shared, only: f_don, kn_bac, f_don_Am, f_doc
      54              :       use icepack_zbgc_shared, only: f_exude, k_bac
      55              :       use icepack_zbgc_shared, only: tau_ret, tau_rel
      56              :       use icepack_zbgc_shared, only: R_C2N, R_chl2N, f_abs_chl, R_C2N_DON
      57              :       use icepack_zbgc_shared, only: doc_pool_fractions
      58              :       use icepack_zbgc_shared, only: algaltype, doctype, dictype
      59              :       use icepack_zbgc_shared, only: dontype, fedtype, feptype, zaerotype
      60              : 
      61              :       use icepack_warnings, only: warnstr, icepack_warnings_add
      62              :       use icepack_warnings, only: icepack_warnings_setabort, icepack_warnings_aborted
      63              : 
      64              :       use icepack_brine, only: preflushing_changes, compute_microS_mushy
      65              :       use icepack_brine, only: update_hbrine
      66              :       use icepack_algae, only: zbio, sklbio
      67              :       use icepack_therm_shared, only: calculate_Tin_from_qin
      68              :       use icepack_itd, only: column_sum, column_conservation_check
      69              : 
      70              :       implicit none
      71              : 
      72              :       private
      73              :       public :: add_new_ice_bgc, &
      74              :                 lateral_melt_bgc, &   ! LCOV_EXCL_LINE
      75              :                 icepack_init_bgc, &   ! LCOV_EXCL_LINE
      76              :                 icepack_init_zbgc, &   ! LCOV_EXCL_LINE
      77              :                 icepack_biogeochemistry, &   ! LCOV_EXCL_LINE
      78              :                 icepack_load_ocean_bio_array, &   ! LCOV_EXCL_LINE
      79              :                 icepack_init_ocean_bio
      80              : 
      81              : !=======================================================================
      82              : 
      83              :       contains
      84              : 
      85              : !=======================================================================
      86              : 
      87              : ! Adjust biogeochemical tracers when new frazil ice forms
      88              : 
      89     83887152 :       subroutine add_new_ice_bgc (dt,         ncats,                &
      90    167774304 :                                   aicen_init, vicen_init, vi0_init, &   ! LCOV_EXCL_LINE
      91     83887152 :                                   aicen,      vicen,      vin0new,  &   ! LCOV_EXCL_LINE
      92     83887152 :                                   trcrn,                            &   ! LCOV_EXCL_LINE
      93     83887152 :                                   ocean_bio,  flux_bio,   hsurp,    &   ! LCOV_EXCL_LINE
      94     83887152 :                                   d_an_tot)
      95              : 
      96              :       integer (kind=int_kind), intent(in) :: &
      97              :          ncats       ! 1 without floe size distribution or ncat
      98              : 
      99              :       real (kind=dbl_kind), intent(in) :: &
     100              :          dt              ! time step (s)
     101              : 
     102              :       real (kind=dbl_kind), dimension (:), intent(in) :: &
     103              :          aicen_init  , & ! initial concentration of ice   ! LCOV_EXCL_LINE
     104              :          vicen_init  , & ! initial volume per unit area of ice  (m)   ! LCOV_EXCL_LINE
     105              :          aicen       , & ! concentration of ice   ! LCOV_EXCL_LINE
     106              :          vicen       , & ! volume per unit area of ice          (m)   ! LCOV_EXCL_LINE
     107              :          d_an_tot
     108              : 
     109              :       real (kind=dbl_kind), dimension (:,:), intent(inout) :: &
     110              :          trcrn           ! ice tracers
     111              : 
     112              :       real (kind=dbl_kind), dimension (:), intent(in) :: &
     113              :          vin0new          ! ice tracers
     114              : 
     115              :       real (kind=dbl_kind), intent(in) :: &
     116              :          vi0_init        ! volume of new ice added to cat 1 (intial)
     117              : 
     118              :       real (kind=dbl_kind), intent(in) :: &
     119              :          hsurp           ! thickness of new ice added to each cat
     120              : 
     121              :       real (kind=dbl_kind), dimension (:), intent(inout) :: &
     122              :          flux_bio   ! tracer flux to ocean from biology (mmol/m^2/s)
     123              : 
     124              :       real (kind=dbl_kind), dimension (:), intent(in) :: &
     125              :          ocean_bio       ! ocean concentration of biological tracer
     126              : 
     127              : ! local
     128              : 
     129              :       integer (kind=int_kind) :: &
     130              :          location    , & ! 1 (add frazil to bottom), 0 (add frazil throughout)   ! LCOV_EXCL_LINE
     131              :          m           , & ! bio index   ! LCOV_EXCL_LINE
     132              :          n           , & ! ice category index   ! LCOV_EXCL_LINE
     133              :          k           , & ! ice layer index   ! LCOV_EXCL_LINE
     134              :          nbiolayer
     135              : 
     136              :       real (kind=dbl_kind) :: &
     137              :          vbri1       , & ! starting volume of existing brine   ! LCOV_EXCL_LINE
     138              :          vbri_init   , & ! brine volume summed over categories   ! LCOV_EXCL_LINE
     139              :          vbri_final      ! brine volume summed over categories
     140              : 
     141              :       real (kind=dbl_kind) :: &
     142              :          vsurp       , & ! volume of new ice added to each cat   ! LCOV_EXCL_LINE
     143              :          vtmp            ! total volume of new and old ice
     144              : 
     145              :       real (kind=dbl_kind), dimension (ncat) :: &
     146     83887152 :          vbrin           ! trcrn(nt_fbri,n)*vicen(n)
     147              : 
     148              :       real (kind=dbl_kind) :: &
     149              :          vice_new    , & ! vicen_init + vsurp   ! LCOV_EXCL_LINE
     150              :          bio0new         ! ocean_bio * zbgc_init_fac
     151              : 
     152              :       real (kind=dbl_kind) :: &
     153              :          Tmlts       ! melting temperature (oC)
     154              : 
     155              :       character (len=char_len) :: &
     156              :          fieldid         ! field identifier
     157              : 
     158              :       character(len=*),parameter :: subname='(add_new_ice_bgc)'
     159              : 
     160              :       real (kind=dbl_kind), dimension (nblyr+1) :: &
     161     83887152 :          zspace    ! vertical grid spacing
     162              :       !-----------------------------------------------------------------
     163              :       ! brine
     164              :       !-----------------------------------------------------------------
     165              : 
     166    568459728 :       zspace(:)  = c1/real(nblyr,kind=dbl_kind)
     167     83887152 :       zspace(1) = p5*zspace(2)
     168     83887152 :       zspace(nblyr+1) = zspace(1)
     169    503322912 :       vbrin(:) = c0
     170    503322912 :       do n = 1, ncat
     171    419435760 :          vbrin(n) = vicen_init(n)
     172    503322912 :          if (tr_brine) vbrin(n) =  trcrn(nt_fbri,n)*vicen_init(n)
     173              :       enddo
     174              : 
     175     83887152 :       call column_sum (ncat,  vbrin,  vbri_init)
     176     83887152 :       if (icepack_warnings_aborted(subname)) return
     177              : 
     178     83887152 :       vbri_init = vbri_init + vi0_init
     179   1038621504 :       do k = 1, nbtrcr
     180              :          flux_bio(k) = flux_bio(k) &
     181   1007534064 :                             - vi0_init/dt*ocean_bio(k)*zbgc_init_frac(k)
     182              :       enddo
     183              :       !-----------------------------------------------------------------
     184              :       ! Distribute bgc in new ice volume among all ice categories by
     185              :       ! increasing ice thickness, leaving ice area unchanged.
     186              :       !-----------------------------------------------------------------
     187              : 
     188              :          ! Diffuse_bio handles concentration changes from ice growth/melt
     189              :          ! ice area does not change
     190              :          ! add salt to the bottom , location = 1
     191              : 
     192     83887152 :        vsurp = c0
     193     83887152 :        vtmp = c0
     194              : 
     195    503322912 :       do n = 1,ncat
     196              : 
     197    503322912 :       if (hsurp > c0) then
     198              : 
     199     22359055 :          vtmp = vbrin(n)
     200     22359055 :          vsurp = hsurp * aicen_init(n)
     201     22359055 :          vbrin(n) = vbrin(n) + vsurp
     202     22359055 :          vice_new = vicen_init(n) + vsurp
     203              : 
     204     22359055 :          if (tr_brine .and. vice_new > puny) then !c0) then
     205     22344572 :             trcrn(nt_fbri,n) = vbrin(n)/vice_new
     206        14483 :          elseif (tr_brine .and. vicen(n) <= c0) then
     207        14453 :             trcrn(nt_fbri,n) = c1
     208              :          endif
     209              : 
     210     22359055 :          if (nbtrcr > 0) then
     211    357809655 :             do m = 1, nbtrcr
     212    338030020 :                bio0new = ocean_bio(m)*zbgc_init_frac(m)
     213    338030020 :                nbiolayer = nblyr+1
     214              :                call update_vertical_bio_tracers(nbiolayer, trcrn(bio_index(m):bio_index(m) + nblyr,n), &
     215    357809655 :                     vtmp, vbrin(n), bio0new,zspace(:))
     216              :             enddo !nbtrcr
     217     19779635 :             if (icepack_warnings_aborted(subname)) return
     218              :          endif       ! nbtrcr
     219              :       endif          ! hsurp > 0
     220              :       enddo          ! n
     221              : 
     222              :       !-----------------------------------------------------------------
     223              :       ! Combine bgc in new ice grown in open water with category 1 ice.
     224              :       !-----------------------------------------------------------------
     225    167774304 :       do n = 1, ncats
     226    167774304 :       if (vin0new(n) > c0 .and. d_an_tot(n) > c0) then
     227              : 
     228      6762014 :          vbri1    = vbrin(n)
     229      6762014 :          vbrin(n) = vbrin(n) + vin0new(n)
     230      6762014 :          if (tr_brine .and. vicen(n) > puny) then
     231      6762012 :             trcrn(nt_fbri,n) = vbrin(n)/vicen(n)
     232            2 :          elseif (tr_brine .and. vicen(n) <= puny) then
     233            2 :             trcrn(nt_fbri,n) = c1
     234              :          endif
     235              : 
     236              :       ! Diffuse_bio handles concentration changes from ice growth/melt
     237              :       ! ice area changes
     238              :       ! add salt throughout, location = 0
     239              : 
     240      6762014 :          if (nbtrcr > 0 .and. vbrin(n) > puny) then
     241     97881966 :             do m = 1, nbtrcr
     242     92465712 :                bio0new = ocean_bio(m)*zbgc_init_frac(m)
     243    837607662 :                do k = 1, nblyr+1
     244              :                   trcrn(bio_index(m) + k-1,n) = &
     245    832191408 :                        (trcrn(bio_index(m) + k-1,n)*vbri1 + bio0new * vin0new(n))/vbrin(n)
     246              :                enddo
     247              :             enddo
     248              : 
     249      5416254 :             if (icepack_warnings_aborted(subname)) return
     250              : 
     251              :          endif           ! nbtrcr > 0
     252              :       endif              ! vin0new(n) > 0
     253              :       enddo              ! n = 1,ncats
     254              : 
     255     83887152 :       if (tr_brine .and. conserv_check) then
     256            0 :          call column_sum (ncat,   vbrin,  vbri_final)
     257            0 :          if (icepack_warnings_aborted(subname)) return
     258              : 
     259            0 :          fieldid = subname//':vbrin'
     260              :          call column_conservation_check (fieldid,                  &
     261              :                                          vbri_init, vbri_final,    &   ! LCOV_EXCL_LINE
     262            0 :                                          puny)
     263            0 :          if (icepack_warnings_aborted(subname)) return
     264              : 
     265              :       endif   ! conserv_check
     266              : 
     267              :       end subroutine add_new_ice_bgc
     268              : 
     269              : !=======================================================================
     270              : 
     271              : ! When sea ice melts laterally, flux bgc to ocean
     272              : 
     273      2001122 :       subroutine lateral_melt_bgc (dt,                  &
     274      2001122 :                                    rsiden,   vicen_init,&   ! LCOV_EXCL_LINE
     275      2001122 :                                    trcrn,    flux_bio)
     276              : 
     277              :       real (kind=dbl_kind), intent(in) :: &
     278              :          dt        ! time step (s)
     279              : 
     280              :       real (kind=dbl_kind), dimension(:), intent(in) :: &
     281              :          vicen_init! volume per unit area of ice          (m)
     282              : 
     283              :       real (kind=dbl_kind), dimension (:,:), intent(in) :: &
     284              :          trcrn     ! tracer array
     285              : 
     286              :       real (kind=dbl_kind), dimension(:), intent(in) :: &
     287              :          rsiden     ! fraction of ice that melts laterally
     288              : 
     289              :       real (kind=dbl_kind), dimension(:), intent(inout) :: &
     290              :          flux_bio  ! biology tracer flux from layer bgc (mmol/m^2/s)
     291              : 
     292              :       ! local variables
     293              : 
     294              :       real (kind=dbl_kind) :: &
     295              :          total_bio_initial, & ! initial column tracer concentration (mmol/m2)   ! LCOV_EXCL_LINE
     296              :          total_bio_final      ! final column tracer concentration (mmol/m20
     297              : 
     298              :       integer (kind=int_kind) :: &
     299              :          k     , & ! layer index   ! LCOV_EXCL_LINE
     300              :          m     , & !   ! LCOV_EXCL_LINE
     301              :          n         ! category index
     302              : 
     303              :       real (kind=dbl_kind), dimension (nblyr+1) :: &
     304      4002244 :          zspace    ! vertical grid spacing
     305              : 
     306              :       character(len=*),parameter :: subname='(lateral_melt_bgc)'
     307              : 
     308     18010098 :       zspace(:)       = c1/real(nblyr,kind=dbl_kind)
     309      2001122 :       zspace(1)       = p5*zspace(2)
     310      2001122 :       zspace(nblyr+1) = zspace(1)
     311              : 
     312     34630772 :       do m = 1, nbtrcr
     313    197779022 :          do n = 1, ncat
     314   1500963900 :          do k = 1, nblyr+1
     315              :             flux_bio(m) = flux_bio(m) + trcrn(nt_fbri,n) &
     316              :                         * vicen_init(n)*zspace(k)*trcrn(bio_index(m)+k-1,n) &   ! LCOV_EXCL_LINE
     317   1468334250 :                         * rsiden(n)/dt
     318              :          enddo
     319              :          enddo
     320              :       enddo
     321              : 
     322      2001122 :       end subroutine lateral_melt_bgc
     323              : 
     324              : !=======================================================================
     325              : !autodocument_start icepack_init_bgc
     326              : !
     327       248885 :       subroutine icepack_init_bgc( &
     328       248885 :          sicen, trcrn, sss, ocean_bio_all, DOCPoolFractions)
     329              : 
     330              :       real (kind=dbl_kind), dimension(nilyr, ncat), intent(in) :: &
     331              :          sicen     ! salinity on the cice grid
     332              : 
     333              :       real (kind=dbl_kind), dimension (:,:), intent(inout) :: &
     334              :          trcrn     ! subset of tracer array (only bgc)
     335              : 
     336              :       real (kind=dbl_kind), intent(in) :: &
     337              :          sss       ! sea surface salinity (ppt)
     338              : 
     339              :       real (kind=dbl_kind), dimension (:), intent(in) :: &
     340              :          ocean_bio_all   ! fixed order, all values even for tracers false
     341              : 
     342              :       real (kind=dbl_kind), dimension (:), optional, intent(out) :: &
     343              :          DOCPoolFractions   ! Fraction of DOC in polysacharids, lipids, and proteins
     344              : 
     345              : !autodocument_end
     346              : 
     347              :       ! local variables
     348              : 
     349              :       integer (kind=int_kind) :: &
     350              :          k     , & ! vertical index   ! LCOV_EXCL_LINE
     351              :          n     , & ! category index   ! LCOV_EXCL_LINE
     352              :          mm        ! bio tracer index
     353              : 
     354              :       real (kind=dbl_kind), dimension (ntrcr+2) :: &
     355       248885 :          trtmp     ! temporary, remapped tracers
     356              : 
     357              :       character(len=*),parameter :: subname='(icepack_init_bgc)'
     358              : 
     359              :       !-----------------------------------------------------------------------------
     360              :       !     Skeletal Layer Model
     361              :       !  All bgc tracers are Bulk quantities in units of mmol or mg per m^3
     362              :       !  The skeletal layer model assumes a constant
     363              :       !  layer depth (sk_l) and porosity (phi_sk)
     364              :       !-----------------------------------------------------------------------------
     365       248885 :       if (.not. restartbgc) then
     366              : 
     367       248885 :          if (skl_bgc) then
     368              : 
     369            0 :             do  n = 1,ncat
     370            0 :             do mm = 1,nbtrcr
     371              :                ! bulk concentration (mmol or mg per m^3, or 10^-3 mmol/m^3)
     372            0 :                trcrn(bio_index(mm)-ntrcr_o, n) = ocean_bio_all(bio_index_o(mm))
     373              :             enddo       ! nbtrcr
     374              :             enddo       ! n
     375              : 
     376              :       !-----------------------------------------------------------------------------
     377              :       !    zbgc Model
     378              :       !  All bgc tracers are Bulk quantities in units of mmol or mg per m^3
     379              :       !  The vertical layer model uses prognosed porosity and layer depth
     380              :       !-----------------------------------------------------------------------------
     381              : 
     382              :          else   ! not skl_bgc
     383              : 
     384       248885 :             if (scale_bgc .and. ktherm == 2) then
     385     58349440 :                trtmp(:) = c0
     386      1287120 :                do n = 1,ncat
     387              :                   call remap_zbgc(nilyr,    &
     388              :                                   1,                          &   ! LCOV_EXCL_LINE
     389              :                                   sicen(:,n),       trtmp,    &   ! LCOV_EXCL_LINE
     390              :                                   0,                nblyr+1,  &   ! LCOV_EXCL_LINE
     391              :                                   c1,               c1,       &   ! LCOV_EXCL_LINE
     392              :                                   cgrid(2:nilyr+1),           &   ! LCOV_EXCL_LINE
     393              :                                   igrid(1:nblyr+1),           &   ! LCOV_EXCL_LINE
     394      1072600 :                                   sicen(1,n)                  )
     395      1072600 :                   if (icepack_warnings_aborted(subname)) return
     396              : 
     397     22739120 :                   do mm = 1,nbtrcr
     398    194140600 :                   do k = 1, nblyr + 1
     399              :                      trcrn(bio_index(mm)+k-1-ntrcr_o,n) =   &
     400    171616000 :                           (trtmp(k)/sss*ocean_bio_all(bio_index_o(mm)))
     401    536300000 :                      trcrn(bio_index(mm)+nblyr+1-ntrcr_o:bio_index(mm)+nblyr+2-ntrcr_o,n) = c0 ! snow
     402              :                   enddo  ! k
     403              :                   enddo  ! mm
     404              :                enddo     ! n
     405              : 
     406        34365 :             elseif (nbtrcr > 0 .and. nt_fbri > 0) then ! not scale_bgc
     407              : 
     408       206190 :                do n = 1,ncat
     409       721665 :                do mm = 1,nbtrcr
     410      4639275 :                do k = 1, nblyr+1
     411              :                   trcrn(bio_index(mm)+k-1-ntrcr_o,n) = ocean_bio_all(bio_index_o(mm)) &
     412      4123800 :                                              * zbgc_init_frac(mm)
     413     12886875 :                   trcrn(bio_index(mm)+nblyr+1-ntrcr_o:bio_index(mm)+nblyr+2-ntrcr_o,n) = c0 ! snow
     414              :                enddo    ! k
     415       687300 :                trcrn(nt_zbgc_frac-1+mm-ntrcr_o,n) = zbgc_frac_init(mm)
     416              :                enddo    ! mm
     417              :                enddo    ! n
     418              : 
     419              :             endif  ! scale_bgc
     420              :          endif     ! skl_bgc
     421              :       endif       ! restart
     422              : 
     423       248885 :       if (present(DOCPoolFractions)) then
     424            0 :          DOCPoolFractions(:) = c1
     425            0 :          if (.not. use_macromolecules) then
     426            0 :            do mm = 1,max_doc
     427            0 :               DOCPoolFractions(mm) = doc_pool_fractions(mm)
     428              :            end do
     429              :          end if
     430              :       endif
     431              : 
     432              :       end subroutine icepack_init_bgc
     433              : 
     434              : !=======================================================================
     435              : !autodocument_start icepack_init_zbgc
     436              : !
     437              : 
     438         4222 :       subroutine icepack_init_zbgc (&
     439         4222 :            zbgc_frac_init_in, zbgc_init_frac_in, tau_ret_in, tau_rel_in, bgc_tracer_type_in)
     440              : 
     441              :       real (kind=dbl_kind), dimension (:), intent(in), optional :: zbgc_frac_init_in(:)  ! initializes mobile fraction
     442              :       real (kind=dbl_kind), dimension (:), intent(in), optional :: bgc_tracer_type_in(:) ! described tracer in mobile or stationary phases
     443              :       real (kind=dbl_kind), dimension (:), intent(in), optional :: zbgc_init_frac_in(:)  ! fraction of ocean tracer  concentration in new ice
     444              :       real (kind=dbl_kind), dimension (:), intent(in), optional :: tau_ret_in(:)         ! retention timescale  (s), mobile to stationary phase
     445              :       real (kind=dbl_kind), dimension (:), intent(in), optional :: tau_rel_in(:)         ! release timescale    (s), stationary to mobile phase
     446              : 
     447              : !autodocument_end
     448              : 
     449              :       character(len=*),parameter :: subname='(icepack_init_zbgc)'
     450              : 
     451              :       !--------
     452              : 
     453       126167 :       if (present(zbgc_frac_init_in))  zbgc_frac_init(:)  = zbgc_frac_init_in(:)
     454       126167 :       if (present(bgc_tracer_type_in)) bgc_tracer_type(:) = bgc_tracer_type_in(:)
     455       126167 :       if (present(zbgc_init_frac_in))  zbgc_init_frac(:)  =  zbgc_init_frac_in(:)
     456       126167 :       if (present(tau_ret_in)) tau_ret(:) = tau_ret_in(:)
     457       126167 :       if (present(tau_rel_in)) tau_rel(:) = tau_rel_in(:)
     458              : 
     459         4222 :       R_Si2N(1) = ratio_Si2N_diatoms
     460         4222 :       R_Si2N(2) = ratio_Si2N_sp
     461         4222 :       R_Si2N(3) = ratio_Si2N_phaeo
     462              : 
     463         4222 :       R_S2N(1) = ratio_S2N_diatoms
     464         4222 :       R_S2N(2) = ratio_S2N_sp
     465         4222 :       R_S2N(3) = ratio_S2N_phaeo
     466              : 
     467         4222 :       R_Fe2C(1) = ratio_Fe2C_diatoms
     468         4222 :       R_Fe2C(2) = ratio_Fe2C_sp
     469         4222 :       R_Fe2C(3) = ratio_Fe2C_phaeo
     470              : 
     471         4222 :       R_Fe2N(1) = ratio_Fe2N_diatoms
     472         4222 :       R_Fe2N(2) = ratio_Fe2N_sp
     473         4222 :       R_Fe2N(3) = ratio_Fe2N_phaeo
     474              : 
     475         4222 :       R_C2N(1) = ratio_C2N_diatoms
     476         4222 :       R_C2N(2) = ratio_C2N_sp
     477         4222 :       R_C2N(3) = ratio_C2N_phaeo
     478              : 
     479         4222 :       R_chl2N(1) = ratio_chl2N_diatoms
     480         4222 :       R_chl2N(2) = ratio_chl2N_sp
     481         4222 :       R_chl2N(3) = ratio_chl2N_phaeo
     482              : 
     483         4222 :       F_abs_chl(1) = F_abs_chl_diatoms
     484         4222 :       F_abs_chl(2) = F_abs_chl_sp
     485         4222 :       F_abs_chl(3) = F_abs_chl_phaeo
     486              : 
     487         4222 :       R_Fe2DON(1) = ratio_Fe2DON
     488         4222 :       R_C2N_DON(1) = ratio_C2N_proteins
     489              : 
     490         4222 :       R_Fe2DOC(1) = ratio_Fe2DOC_s
     491         4222 :       R_Fe2DOC(2) = ratio_Fe2DOC_l
     492         4222 :       R_Fe2DOC(3) = c0
     493              : 
     494         4222 :       chlabs(1) = chlabs_diatoms
     495         4222 :       chlabs(2) = chlabs_sp
     496         4222 :       chlabs(3) = chlabs_phaeo
     497              : 
     498         4222 :       alpha2max_low(1) = alpha2max_low_diatoms
     499         4222 :       alpha2max_low(2) = alpha2max_low_sp
     500         4222 :       alpha2max_low(3) = alpha2max_low_phaeo
     501              : 
     502         4222 :       beta2max(1) = beta2max_diatoms
     503         4222 :       beta2max(2) = beta2max_sp
     504         4222 :       beta2max(3) = beta2max_phaeo
     505              : 
     506         4222 :       mu_max(1) = mu_max_diatoms
     507         4222 :       mu_max(2) = mu_max_sp
     508         4222 :       mu_max(3) = mu_max_phaeo
     509              : 
     510         4222 :       grow_Tdep(1) = grow_Tdep_diatoms
     511         4222 :       grow_Tdep(2) = grow_Tdep_sp
     512         4222 :       grow_Tdep(3) = grow_Tdep_phaeo
     513              : 
     514         4222 :       fr_graze(1) = fr_graze_diatoms
     515         4222 :       fr_graze(2) = fr_graze_sp
     516         4222 :       fr_graze(3) = fr_graze_phaeo
     517              : 
     518         4222 :       mort_pre(1) = mort_pre_diatoms
     519         4222 :       mort_pre(2) = mort_pre_sp
     520         4222 :       mort_pre(3) = mort_pre_phaeo
     521              : 
     522         4222 :       mort_Tdep(1) = mort_Tdep_diatoms
     523         4222 :       mort_Tdep(2) = mort_Tdep_sp
     524         4222 :       mort_Tdep(3) = mort_Tdep_phaeo
     525              : 
     526         4222 :       k_exude(1) = k_exude_diatoms
     527         4222 :       k_exude(2) = k_exude_sp
     528         4222 :       k_exude(3) = k_exude_phaeo
     529              : 
     530         4222 :       K_Nit(1) = K_Nit_diatoms
     531         4222 :       K_Nit(2) = K_Nit_sp
     532         4222 :       K_Nit(3) = K_Nit_phaeo
     533              : 
     534         4222 :       K_Am(1) = K_Am_diatoms
     535         4222 :       K_Am(2) = K_Am_sp
     536         4222 :       K_Am(3) = K_Am_phaeo
     537              : 
     538         4222 :       K_Sil(1) = K_Sil_diatoms
     539         4222 :       K_Sil(2) = K_Sil_sp
     540         4222 :       K_Sil(3) = K_Sil_phaeo
     541              : 
     542         4222 :       K_Fe(1) = K_Fe_diatoms
     543         4222 :       K_Fe(2) = K_Fe_sp
     544         4222 :       K_Fe(3) = K_Fe_phaeo
     545              : 
     546         4222 :       f_doc(:) = c0
     547         4222 :       f_doc(1) = f_doc_s
     548         4222 :       f_doc(2) = f_doc_l
     549              : 
     550         4222 :       f_don(1) = f_don_protein
     551         4222 :       kn_bac(1) = kn_bac_protein
     552         4222 :       f_don_Am(1) = f_don_Am_protein
     553              : 
     554         4222 :       f_exude(:) = c0
     555         4222 :       f_exude(1) = f_exude_s
     556         4222 :       f_exude(2) = f_exude_l
     557              : 
     558         4222 :       k_bac(:) = c0
     559         4222 :       k_bac(1) = k_bac_s
     560         4222 :       k_bac(2) = k_bac_l
     561              : 
     562         4222 :       algaltype(1) = algaltype_diatoms
     563         4222 :       algaltype(2) = algaltype_sp
     564         4222 :       algaltype(3) = algaltype_phaeo
     565              : 
     566         4222 :       doctype(:) = c0
     567         4222 :       doctype(1) = doctype_s
     568         4222 :       doctype(2) = doctype_l
     569              : 
     570         8444 :       dictype(:) = dictype_1
     571              : 
     572         8444 :       dontype(:) = dontype_protein
     573              : 
     574        12666 :       fedtype(:) = fedtype_1
     575        12666 :       feptype(:) = feptype_1
     576              : 
     577         4222 :       zaerotype(1) = zaerotype_bc1
     578         4222 :       zaerotype(2) = zaerotype_bc2
     579         4222 :       zaerotype(3) = zaerotype_dust1
     580         4222 :       zaerotype(4) = zaerotype_dust2
     581         4222 :       zaerotype(5) = zaerotype_dust3
     582         4222 :       zaerotype(6) = zaerotype_dust4
     583              : 
     584         4222 :       end subroutine icepack_init_zbgc
     585              : 
     586              : !=======================================================================
     587              : !autodocument_start icepack_biogeochemistry
     588              : !
     589    117120360 :       subroutine icepack_biogeochemistry(dt, &
     590            0 :                            upNO, upNH, iDi, iki, zfswin, &   ! LCOV_EXCL_LINE
     591            0 :                            darcy_V, grow_net,  &   ! LCOV_EXCL_LINE
     592    234240720 :                            PP_net, hbri,dhbr_bot, dhbr_top, Zoo,&   ! LCOV_EXCL_LINE
     593    234240720 :                            fbio_snoice, fbio_atmice, ocean_bio_dh, ocean_bio, &   ! LCOV_EXCL_LINE
     594    468481440 :                            first_ice, fswpenln, bphi, bTiz, ice_bio_net,  &   ! LCOV_EXCL_LINE
     595    234240720 :                            snow_bio_net, totalChla, fswthrun, &   ! LCOV_EXCL_LINE
     596    117120360 :                            meltbn, melttn, congeln, snoicen, &   ! LCOV_EXCL_LINE
     597    117120360 :                            sst, sss, Tf, fsnow, meltsn, & !hmix, &   ! LCOV_EXCL_LINE
     598    351361080 :                            hin_old, flux_bio, flux_bio_atm, &   ! LCOV_EXCL_LINE
     599    351361080 :                            aicen_init, vicen_init, aicen, vicen, vsnon, &   ! LCOV_EXCL_LINE
     600    234240720 :                            aice0, trcrn, vsnon_init, &   ! LCOV_EXCL_LINE
     601    234240720 :                            flux_bion, bioPorosityIceCell, &   ! LCOV_EXCL_LINE
     602    117120360 :                            bioSalinityIceCell, bioTemperatureIceCell)
     603              : 
     604              :       real (kind=dbl_kind), intent(in) :: &
     605              :          dt      ! time step
     606              : 
     607              :       real (kind=dbl_kind), dimension (:), intent(inout) :: &
     608              :          fbio_snoice   , &  ! fluxes from snow to ice   ! LCOV_EXCL_LINE
     609              :          fbio_atmice   , &  ! fluxes from atm to ice   ! LCOV_EXCL_LINE
     610              :          dhbr_top      , &  ! brine top change   ! LCOV_EXCL_LINE
     611              :          dhbr_bot      , &  ! brine bottom change   ! LCOV_EXCL_LINE
     612              :          darcy_V       , &  ! darcy velocity positive up (m/s)   ! LCOV_EXCL_LINE
     613              :          hin_old       , &  ! old ice thickness   ! LCOV_EXCL_LINE
     614              :          ice_bio_net   , &  ! depth integrated tracer (mmol/m^2)   ! LCOV_EXCL_LINE
     615              :          snow_bio_net  , &  ! depth integrated snow tracer (mmol/m^2)   ! LCOV_EXCL_LINE
     616              :          flux_bio           ! all bio fluxes to ocean
     617              : 
     618              :       real (kind=dbl_kind), dimension (:), intent(in) :: &
     619              :          ocean_bio          ! contains the ocean bgc tracer concentrations in use (mmol/m^3)
     620              : 
     621              :       real (kind=dbl_kind), optional, dimension (:), intent(out) :: &
     622              :          ocean_bio_dh       ! The ocean bgc tracer concentrations in use * brine thickness * phi (mmol/m^2)
     623              : 
     624              :       logical (kind=log_kind), dimension (:), intent(inout) :: &
     625              :          first_ice      ! distinguishes ice that disappears (e.g. melts)
     626              :                         ! and reappears (e.g. transport) in a grid cell
     627              :                         ! during a single time step from ice that was
     628              :                         ! there the entire time step (true until ice forms)
     629              : 
     630              :       real (kind=dbl_kind), optional, dimension (:,:), intent(out) :: &
     631              :          flux_bion      ! per categeory ice to ocean biogeochemistry flux (mmol/m2/s)
     632              : 
     633              :       real (kind=dbl_kind), optional, dimension (:), intent(inout) :: &
     634              :          bioPorosityIceCell, & ! category average porosity on the interface bio grid   ! LCOV_EXCL_LINE
     635              :          bioSalinityIceCell, & ! (ppt) category average porosity on the interface bio grid   ! LCOV_EXCL_LINE
     636              :          bioTemperatureIceCell ! (oC) category average porosity on the interface bio grid
     637              : 
     638              :       real (kind=dbl_kind), dimension (:,:), intent(inout) :: &
     639              :          Zoo            , & ! N losses accumulated in timestep (ie. zooplankton/bacteria)   ! LCOV_EXCL_LINE
     640              :                             ! mmol/m^3
     641              :          bphi           , & ! porosity of layers
     642              :          bTiz           , & ! layer temperatures interpolated on bio grid (C)   ! LCOV_EXCL_LINE
     643              :          zfswin         , & ! Shortwave flux into layers interpolated on bio grid  (W/m^2)   ! LCOV_EXCL_LINE
     644              :          iDi            , & ! igrid Diffusivity (m^2/s)   ! LCOV_EXCL_LINE
     645              :          iki            , & ! Ice permeability (m^2)   ! LCOV_EXCL_LINE
     646              :          trcrn     ! tracers
     647              : 
     648              :       real (kind=dbl_kind), intent(inout) :: &
     649              :          grow_net       , & ! Specific growth rate (/s) per grid cell   ! LCOV_EXCL_LINE
     650              :          PP_net         , & ! Total production (mg C/m^2/s) per grid cell   ! LCOV_EXCL_LINE
     651              :          hbri           , & ! brine height, area-averaged for comparison with hi (m)   ! LCOV_EXCL_LINE
     652              :          upNO           , & ! nitrate uptake rate (mmol/m^2/d) times aice   ! LCOV_EXCL_LINE
     653              :          upNH               ! ammonium uptake rate (mmol/m^2/d) times aice
     654              : 
     655              :       real (kind=dbl_kind), optional, intent(inout) :: &
     656              :          totalChla          ! ice integrated chla and summed over all algal groups (mg/m^2)
     657              : 
     658              :       real (kind=dbl_kind), dimension (:,:), intent(in) :: &
     659              :          fswpenln        ! visible SW entering ice layers (W m-2)
     660              : 
     661              :       real (kind=dbl_kind), dimension (:), intent(in) :: &
     662              :          fswthrun    , & ! SW through ice to ocean            (W/m^2)   ! LCOV_EXCL_LINE
     663              :          meltsn      , & ! snow melt in category n (m)   ! LCOV_EXCL_LINE
     664              :          melttn      , & ! top melt in category n (m)   ! LCOV_EXCL_LINE
     665              :          meltbn      , & ! bottom melt in category n (m)   ! LCOV_EXCL_LINE
     666              :          congeln     , & ! congelation ice formation in category n (m)   ! LCOV_EXCL_LINE
     667              :          snoicen     , & ! snow-ice formation in category n (m)   ! LCOV_EXCL_LINE
     668              :          flux_bio_atm, & ! all bio fluxes to ice from atmosphere   ! LCOV_EXCL_LINE
     669              :          aicen_init  , & ! initial ice concentration, for linear ITD   ! LCOV_EXCL_LINE
     670              :          vicen_init  , & ! initial ice volume (m), for linear ITD   ! LCOV_EXCL_LINE
     671              :          vsnon_init  , & ! initial snow volume (m), for aerosol   ! LCOV_EXCL_LINE
     672              :          aicen , & ! concentration of ice   ! LCOV_EXCL_LINE
     673              :          vicen , & ! volume per unit area of ice          (m)   ! LCOV_EXCL_LINE
     674              :          vsnon     ! volume per unit area of snow         (m)
     675              : 
     676              :       real (kind=dbl_kind), intent(in) :: &
     677              :          aice0   , & ! open water area fraction   ! LCOV_EXCL_LINE
     678              :          sss     , & ! sea surface salinity (ppt)   ! LCOV_EXCL_LINE
     679              :          sst     , & ! sea surface temperature (C)   ! LCOV_EXCL_LINE
     680              :          !hmix    , & ! mixed layer depth (m)   ! LCOV_EXCL_LINE
     681              :          Tf      , & ! basal freezing temperature (C)   ! LCOV_EXCL_LINE
     682              :          fsnow       ! snowfall rate (kg/m^2 s)
     683              : 
     684              : !autodocument_end
     685              : 
     686              :       ! local variables
     687              : 
     688              :       integer (kind=int_kind) :: &
     689              :          k           , & ! vertical index   ! LCOV_EXCL_LINE
     690              :          n, mm           ! thickness category index
     691              : 
     692              :       real (kind=dbl_kind) :: &
     693              :          hin         , & ! new ice thickness   ! LCOV_EXCL_LINE
     694              :          hsn         , & ! snow thickness  (m)   ! LCOV_EXCL_LINE
     695              :          hbr_old     , & ! old brine thickness before growh/melt   ! LCOV_EXCL_LINE
     696              :          dhice       , & ! change due to sublimation/condensation (m)   ! LCOV_EXCL_LINE
     697              :          kavg        , & ! average ice permeability (m^2)   ! LCOV_EXCL_LINE
     698              :          bphi_o      , & ! surface ice porosity   ! LCOV_EXCL_LINE
     699              :          hbrin       , & ! brine height   ! LCOV_EXCL_LINE
     700              :          dh_direct       ! surface flooding or runoff
     701              : 
     702              :       real (kind=dbl_kind), dimension (nblyr+2) :: &
     703              :       ! Defined on Bio Grid points
     704    234240720 :          bSin        , & ! salinity on the bio grid  (ppt)
     705    234240720 :          brine_sal   , & ! brine salinity (ppt)   ! LCOV_EXCL_LINE
     706    117120360 :          brine_rho       ! brine_density (kg/m^3)
     707              : 
     708              :       real (kind=dbl_kind), dimension (nblyr+1) :: &
     709              :       ! Defined on Bio Grid interfaces
     710    234240720 :          iphin       , & ! porosity
     711    234240720 :          ibrine_sal  , & ! brine salinity  (ppt)   ! LCOV_EXCL_LINE
     712    234240720 :          ibrine_rho  , & ! brine_density (kg/m^3)   ! LCOV_EXCL_LINE
     713    234240720 :          iSin        , & ! Salinity on the interface grid (ppt)   ! LCOV_EXCL_LINE
     714    234240720 :          iTin            ! Temperature on the interface grid (oC)
     715              : 
     716              :       real (kind=dbl_kind) :: &
     717              :          sloss           ! brine flux contribution from surface runoff (g/m^2)
     718              : 
     719              :       real (kind=dbl_kind), dimension (nbtrcr) :: &
     720    234240720 :          flux_bion_n     ! temporary
     721              : 
     722              :       ! for bgc sk
     723              :       real (kind=dbl_kind) :: &
     724              :          dh_bot_chl  , & ! Chlorophyll may or may not flush   ! LCOV_EXCL_LINE
     725              :          dh_top_chl  , & ! Chlorophyll may or may not flush   ! LCOV_EXCL_LINE
     726              :          darcy_V_chl
     727              : 
     728              :       real (kind=dbl_kind), dimension (nblyr+1) :: &
     729    117120360 :          zspace    ! vertical grid spacing
     730              : 
     731              :       character(len=*),parameter :: subname='(icepack_biogeochemistry)'
     732              : 
     733    803177640 :       zspace(:)       = c1/real(nblyr,kind=dbl_kind)
     734    117120360 :       zspace(1)       = p5*zspace(2)
     735    117120360 :       zspace(nblyr+1) = zspace(1)
     736              : 
     737    117120360 :       if (present(bioPorosityIceCell)) bioPorosityIceCell(:) = c0
     738    117120360 :       if (present(bioSalinityIceCell)) bioSalinityIceCell(:) = c0
     739    117120360 :       if (present(bioTemperatureIceCell)) bioTemperatureIceCell(:) = c0
     740              : 
     741    702722160 :       do n = 1, ncat
     742              : 
     743              :       !-----------------------------------------------------------------
     744              :       ! initialize
     745              :       !-----------------------------------------------------------------
     746   7391463600 :          flux_bion_n(:) = c0
     747    585601800 :          hin_old(n) = c0
     748    585601800 :          if (aicen_init(n) > puny) then
     749              :             hin_old(n) = vicen_init(n) &
     750     60876156 :                                 / aicen_init(n)
     751              :          else
     752    524725644 :             first_ice(n) = .true.
     753    524725644 :             if (tr_brine) trcrn(nt_fbri,n) = c1
     754    524725644 :             if (z_tracers) then
     755   6586234900 :                do mm = 1,nbtrcr
     756   6586234900 :                   trcrn(nt_zbgc_frac-1+mm,n) = zbgc_frac_init(mm)
     757              :                enddo
     758              :             endif
     759              :          endif
     760              : 
     761    702722160 :          if (aicen(n) > puny) then
     762              : 
     763     60861013 :             dh_top_chl = c0
     764     60861013 :             dh_bot_chl = c0
     765     60861013 :             darcy_V_chl= c0
     766    446456092 :             bSin(:)    = c0
     767     60861013 :             hsn        = c0
     768     60861013 :             hin        = c0
     769     60861013 :             hbrin      = c0
     770     60861013 :             kavg       = c0
     771     60861013 :             bphi_o     = c0
     772     60861013 :             sloss      = c0
     773              : 
     774              :       !-----------------------------------------------------------------
     775              :       ! brine dynamics
     776              :       !-----------------------------------------------------------------
     777              : 
     778     60861013 :             dhbr_top(n) = c0
     779     60861013 :             dhbr_bot(n) = c0
     780              : 
     781     60861013 :             if (tr_brine) then
     782     60861013 :                if (trcrn(nt_fbri,n) .le. c0) trcrn(nt_fbri,n) = c1
     783              : 
     784     60861013 :                dhice = c0
     785              :                call preflushing_changes  (aicen  (n),   &
     786              :                                  vicen   (n), vsnon  (n),   &   ! LCOV_EXCL_LINE
     787              :                                  meltbn  (n), melttn (n),   &   ! LCOV_EXCL_LINE
     788              :                                  congeln (n), snoicen(n),   &   ! LCOV_EXCL_LINE
     789              :                                  hin_old (n), dhice,        &   ! LCOV_EXCL_LINE
     790              :                                  trcrn(nt_fbri,n),          &   ! LCOV_EXCL_LINE
     791              :                                  dhbr_top(n), dhbr_bot(n),  &   ! LCOV_EXCL_LINE
     792              :                                  hbr_old,     hin,          &   ! LCOV_EXCL_LINE
     793     60861013 :                                  hsn)
     794     60861013 :                if (icepack_warnings_aborted(subname)) return
     795              : 
     796              :                ! Requires the average ice permeability = kavg(:)
     797              :                ! and the surface ice porosity = zphi_o(:)
     798              :                ! computed in "compute_microS" or from "thermosaline_vertical"
     799              : 
     800    385595079 :                iDi(:,n) = c0
     801              : 
     802              :                call compute_microS_mushy ( &
     803              :                            trcrn(:,n),    hin_old(n),    hbr_old,     &   ! LCOV_EXCL_LINE
     804              :                            sss,           sst,           bTiz(:,n),   &   ! LCOV_EXCL_LINE
     805              :                            iTin(:),       bphi(:,n),     kavg,        &   ! LCOV_EXCL_LINE
     806              :                            bphi_o,        bSin(:),     &   ! LCOV_EXCL_LINE
     807              :                            brine_sal(:),  brine_rho(:),  iphin(:),    &   ! LCOV_EXCL_LINE
     808              :                            ibrine_rho(:), ibrine_sal(:),              &   ! LCOV_EXCL_LINE
     809     60861013 :                            iDi(:,n)     , iSin(:))
     810     60861013 :                if (icepack_warnings_aborted(subname)) return
     811              : 
     812              :                call update_hbrine (melttn(n),   &
     813              :                                    meltsn  (n), dt,          &   ! LCOV_EXCL_LINE
     814              :                                    hin,         hsn,         &   ! LCOV_EXCL_LINE
     815              :                                    hin_old (n), hbrin,       &   ! LCOV_EXCL_LINE
     816              :                                    hbr_old,     &   ! LCOV_EXCL_LINE
     817              :                                    trcrn(nt_fbri,n),         &   ! LCOV_EXCL_LINE
     818              :                                    dhbr_top(n), dhbr_bot(n), &   ! LCOV_EXCL_LINE
     819              :                                    dh_top_chl,  dh_bot_chl,  &   ! LCOV_EXCL_LINE
     820              :                                    kavg,        bphi_o,      &   ! LCOV_EXCL_LINE
     821              :                                    darcy_V (n), darcy_V_chl, &   ! LCOV_EXCL_LINE
     822              :                                    bphi(2,n),   aice0,       &   ! LCOV_EXCL_LINE
     823     60861013 :                                    dh_direct)
     824     60861013 :                if (icepack_warnings_aborted(subname)) return
     825              : 
     826     60861013 :                hbri = hbri + hbrin * aicen(n)
     827              : 
     828              :             endif ! tr_brine
     829              : 
     830              :       !-----------------------------------------------------------------
     831              :       ! biogeochemistry
     832              :       !-----------------------------------------------------------------
     833              : 
     834     60861013 :             if (z_tracers) then
     835              : 
     836              :                call zbio (dt,                                            &
     837              :                           melttn(n),                                     &   ! LCOV_EXCL_LINE
     838              :                           meltsn(n),             meltbn  (n),            &   ! LCOV_EXCL_LINE
     839              :                           congeln(n),            snoicen(n),             &   ! LCOV_EXCL_LINE
     840              :                           fsnow,                 trcrn(1:ntrcr,n),       &   ! LCOV_EXCL_LINE
     841              :                           bio_index(1:nbtrcr),   bio_index_o(:),         &   ! LCOV_EXCL_LINE
     842              :                           aicen_init(n),                                 &   ! LCOV_EXCL_LINE
     843              :                           vicen_init(n),         vsnon_init(n),          &   ! LCOV_EXCL_LINE
     844              :                           vicen(n),              vsnon(n),               &   ! LCOV_EXCL_LINE
     845              :                           aicen(n),              flux_bio_atm(1:nbtrcr), &   ! LCOV_EXCL_LINE
     846              :                           n,                     first_ice(n),           &   ! LCOV_EXCL_LINE
     847              :                           hin_old(n),            ocean_bio(1:nbtrcr),    &   ! LCOV_EXCL_LINE
     848              :                           ocean_bio_dh,                                  &   ! LCOV_EXCL_LINE
     849              :                           bphi(:,n),             iphin,                  &   ! LCOV_EXCL_LINE
     850              :                           iDi(:,n),                                      &   ! LCOV_EXCL_LINE
     851              :                           fswpenln(:,n),                                 &   ! LCOV_EXCL_LINE
     852              :                           dhbr_top(n),           dhbr_bot(n),            &   ! LCOV_EXCL_LINE
     853              :                           zfswin(:,n),                                   &   ! LCOV_EXCL_LINE
     854              :                           hbrin,                 hbr_old,                &   ! LCOV_EXCL_LINE
     855              :                           darcy_V(n),                                    &   ! LCOV_EXCL_LINE
     856              :                           bphi_o,                                        &   ! LCOV_EXCL_LINE
     857              :                           iTin,                                          &   ! LCOV_EXCL_LINE
     858              :                           Zoo(:,n),                                      &   ! LCOV_EXCL_LINE
     859              :                           flux_bio(1:nbtrcr),    dh_direct,              &   ! LCOV_EXCL_LINE
     860              :                           upNO,                  upNH,                   &   ! LCOV_EXCL_LINE
     861              :                           fbio_snoice,           fbio_atmice,            &   ! LCOV_EXCL_LINE
     862              :                           PP_net,                ice_bio_net (1:nbtrcr), &   ! LCOV_EXCL_LINE
     863              :                           snow_bio_net(1:nbtrcr),grow_net,               &   ! LCOV_EXCL_LINE
     864              :                           totalChla,                                     &   ! LCOV_EXCL_LINE
     865              :                           flux_bion_n(1:nbtrcr), iSin,                   &   ! LCOV_EXCL_LINE
     866              :                           bioPorosityIceCell, bioSalinityIceCell,        &   ! LCOV_EXCL_LINE
     867     33835340 :                           bioTemperatureIceCell                          )
     868     33835340 :                if (icepack_warnings_aborted(subname)) return
     869              : 
     870     33835340 :                if (present(flux_bion)) then
     871            0 :                   do mm = 1, nbtrcr
     872            0 :                      flux_bion(mm,n) = flux_bion_n(mm)
     873              :                   enddo
     874              :                endif
     875              : 
     876     27025673 :             elseif (skl_bgc) then
     877              : 
     878              :                call sklbio (dt,                      Tf,                  &
     879              :                             flux_bio (1:nbtrcr),     ocean_bio(1:nbtrcr), &   ! LCOV_EXCL_LINE
     880              :                             aicen    (n),        &   ! LCOV_EXCL_LINE
     881              :                             meltbn   (n),            congeln  (n),        &   ! LCOV_EXCL_LINE
     882              :                             fswthrun (n),            first_ice(n),        &   ! LCOV_EXCL_LINE
     883              :                             trcrn    (1:ntrcr,n), &   ! LCOV_EXCL_LINE
     884              :                             PP_net,                  upNO,                &   ! LCOV_EXCL_LINE
     885            0 :                             upNH,                    grow_net             )
     886            0 :                if (icepack_warnings_aborted(subname)) return
     887              : 
     888              :             endif  ! skl_bgc
     889              : 
     890     60861013 :             first_ice(n) = .false.
     891              : 
     892              :          else
     893    524740787 :             if (z_tracers) then
     894   6586498052 :             do mm = 1, nbtrcr
     895  56537054788 :                do k  = 1, nblyr+1
     896  49950556736 :                   if (present(flux_bion)) then
     897              :                      flux_bion(mm,n) = flux_bion(mm,n) + trcrn(bio_index(mm) + k-1,n) *  &
     898            0 :                         hin_old(n) * zspace(k)/dt * trcrn(nt_fbri,n)
     899              :                   endif
     900              :                   flux_bio(mm) = flux_bio(mm) + trcrn(bio_index(mm) + k-1,n) * &
     901  49950556736 :                      vicen_init(n) * zspace(k)/dt * trcrn(nt_fbri,n)
     902  56194376328 :                   trcrn(bio_index(mm) + k-1,n) = c0
     903              :                 enddo
     904              :             enddo
     905              :             endif
     906              :          endif             ! aicen > puny
     907              :       enddo                ! ncat
     908              : 
     909              :       end subroutine icepack_biogeochemistry
     910              : 
     911              : !=======================================================================
     912              : !autodocument_start icepack_load_ocean_bio_array
     913              : ! basic initialization for ocean_bio_all
     914              : 
     915    117572310 :       subroutine icepack_load_ocean_bio_array(&
     916            0 :           nit, amm, sil, dmsp, dms, algalN, &   ! LCOV_EXCL_LINE
     917    235144620 :           doc, don, dic, fed, fep, zaeros, ocean_bio_all, hum)
     918              : 
     919              :       real (kind=dbl_kind), intent(in) :: &
     920              :          nit         , & ! ocean nitrate (mmol/m^3)   ! LCOV_EXCL_LINE
     921              :          amm         , & ! ammonia/um (mmol/m^3)   ! LCOV_EXCL_LINE
     922              :          sil         , & ! silicate (mmol/m^3)   ! LCOV_EXCL_LINE
     923              :          dmsp        , & ! dmsp (mmol/m^3)   ! LCOV_EXCL_LINE
     924              :          dms         , & ! dms (mmol/m^3)   ! LCOV_EXCL_LINE
     925              :          hum             ! humic material (mmol/m^3)
     926              : 
     927              :       real (kind=dbl_kind), dimension (:), intent(in) :: &
     928              :          algalN          ! ocean algal nitrogen (mmol/m^3) (diatoms, phaeo, pico)
     929              : 
     930              :       real (kind=dbl_kind), dimension (:), intent(in) :: &
     931              :          doc             ! ocean doc (mmol/m^3)  (proteins, EPS, lipid)
     932              : 
     933              :       real (kind=dbl_kind), dimension (:), intent(in) :: &
     934              :          don             ! ocean don (mmol/m^3)
     935              : 
     936              :       real (kind=dbl_kind), dimension (:), intent(in) :: &
     937              :          dic             ! ocean dic (mmol/m^3)
     938              : 
     939              :       real (kind=dbl_kind), dimension (:), intent(in) :: &
     940              :          fed, fep        ! ocean disolved and particulate fe (nM)
     941              : 
     942              :       real (kind=dbl_kind), dimension (:), intent(in) :: &
     943              :          zaeros          ! ocean aerosols (mmol/m^3)
     944              : 
     945              :       real (kind=dbl_kind), dimension (:), intent(out) :: &
     946              :          ocean_bio_all   ! fixed order, all values even for tracers false
     947              : 
     948              : !autodocument_end
     949              : 
     950              :       ! local variables
     951              : 
     952              :       integer (kind=int_kind) :: &
     953              :          k, ks           ! tracer indices
     954              : 
     955              :       character(len=*),parameter :: subname='(icepack_load_ocean_bio_array)'
     956              : 
     957   3527169300 :       ocean_bio_all(:) = c0
     958              : 
     959    470289240 :       do k = 1, max_algae
     960    352716930 :          ocean_bio_all(k)      = algalN(k)           ! N
     961    352716930 :          ks = max_algae + max_doc + max_dic + 1
     962    470289240 :          ocean_bio_all(ks + k) = R_chl2N(k)*algalN(k)!chl
     963              :       enddo
     964              : 
     965    117572310 :       ks = max_algae + 1
     966    470289240 :       do k = 1, max_doc
     967    470289240 :          ocean_bio_all(ks + k) = doc(k)              ! doc
     968              :       enddo
     969    117572310 :       ks = ks + max_doc
     970    235144620 :       do k = 1, max_dic
     971    235144620 :          ocean_bio_all(ks + k) = dic(k)              ! dic
     972              :       enddo
     973              : 
     974    117572310 :       ks = 2*max_algae + max_doc + max_dic + 7
     975    235144620 :       do k = 1, max_don
     976    235144620 :          ocean_bio_all(ks + k) = don(k)              ! don
     977              :       enddo
     978              : 
     979    117572310 :       ks = max_algae + 1
     980    117572310 :       ocean_bio_all(ks) = nit                        ! nit
     981              : 
     982    117572310 :       ks = 2*max_algae + max_doc + 2 + max_dic
     983    117572310 :       ocean_bio_all(ks) = amm                        ! Am
     984    117572310 :       ks = ks + 1
     985    117572310 :       ocean_bio_all(ks) = sil                        ! Sil
     986    117572310 :       ks = ks + 1
     987              :       ocean_bio_all(ks) =  R_S2N(1)*algalN(1) &      ! DMSPp
     988              :                         +  R_S2N(2)*algalN(2) &   ! LCOV_EXCL_LINE
     989    117572310 :                         +  R_S2N(3)*algalN(3)
     990    117572310 :       ks = ks + 1
     991    117572310 :       ocean_bio_all(ks) = dmsp                       ! DMSPd
     992    117572310 :       ks = ks + 1
     993    117572310 :       ocean_bio_all(ks) = dms                        ! DMS
     994    117572310 :       ks = ks + 1
     995    117572310 :       ocean_bio_all(ks) = nit                        ! PON
     996    117572310 :       ks = 2*max_algae + max_doc + 7 + max_dic + max_don
     997    352716930 :       do k = 1, max_fe
     998    352716930 :          ocean_bio_all(ks + k) = fed(k)              ! fed
     999              :       enddo
    1000    117572310 :       ks = ks + max_fe
    1001    352716930 :       do k = 1, max_fe
    1002    352716930 :          ocean_bio_all(ks + k) = fep(k)              ! fep
    1003              :       enddo
    1004    117572310 :       ks = ks + max_fe
    1005    823006170 :       do k = 1, max_aero
    1006    823006170 :          ocean_bio_all(ks+k) = zaeros(k)             ! zaero
    1007              :       enddo
    1008    117572310 :       ks = ks + max_aero + 1
    1009    117572310 :       ocean_bio_all(ks)  = hum                       ! humics
    1010              : 
    1011    117572310 :       end subroutine icepack_load_ocean_bio_array
    1012              : 
    1013              : !=======================================================================
    1014              : !autodocument_start icepack_init_ocean_bio
    1015              : !  Initialize ocean concentration
    1016              : 
    1017       248885 :       subroutine icepack_init_ocean_bio (amm, dmsp, dms, algalN, doc, dic, don, &
    1018       497770 :              fed, fep, hum, nit, sil, zaeros,CToN, CToN_DON)
    1019              : 
    1020              :       real (kind=dbl_kind), intent(out), optional:: &
    1021              :        amm      , & ! ammonium   ! LCOV_EXCL_LINE
    1022              :        dmsp     , & ! DMSPp   ! LCOV_EXCL_LINE
    1023              :        dms      , & ! DMS   ! LCOV_EXCL_LINE
    1024              :        hum      , & ! humic material   ! LCOV_EXCL_LINE
    1025              :        nit      , & ! nitrate   ! LCOV_EXCL_LINE
    1026              :        sil          ! silicate
    1027              : 
    1028              :       real (kind=dbl_kind), dimension(:), intent(out), optional:: &
    1029              :        algalN   , & ! algae   ! LCOV_EXCL_LINE
    1030              :        doc      , & ! DOC   ! LCOV_EXCL_LINE
    1031              :        dic      , & ! DIC   ! LCOV_EXCL_LINE
    1032              :        don      , & ! DON   ! LCOV_EXCL_LINE
    1033              :        fed      , & ! Dissolved Iron   ! LCOV_EXCL_LINE
    1034              :        fep      , & ! Particulate Iron   ! LCOV_EXCL_LINE
    1035              :        zaeros       ! BC and dust
    1036              : 
    1037              :       real (kind=dbl_kind), dimension(:), intent(out), optional :: &
    1038              :        CToN     , & ! carbon to nitrogen ratio for algae   ! LCOV_EXCL_LINE
    1039              :        CToN_DON     ! nitrogen to carbon ratio for proteins
    1040              : 
    1041              : !autodocument_end
    1042              : 
    1043              :       ! local variables
    1044              : 
    1045              :       integer (kind=int_kind) :: &
    1046              :         k
    1047              : 
    1048              :       character(len=*),parameter :: subname='(icepack_init_ocean_bio)'
    1049              : 
    1050       248885 :        if (present(CToN)) then
    1051            0 :           CToN(:) = c0
    1052            0 :           CToN(1) = R_C2N(1)
    1053            0 :           CToN(2) = R_C2N(2)
    1054            0 :           CToN(3) = R_C2N(3)
    1055              :        endif
    1056              : 
    1057       248885 :        if (present(CToN_DON)) then
    1058            0 :           CToN_DON(:) = c0
    1059            0 :           CToN_DON(1) = R_C2N_DON(1)
    1060              :        endif
    1061              : 
    1062       248885 :        if (present(amm)) &
    1063       248885 :           amm  = c1 ! ISPOL < 1 mmol/m^3
    1064       248885 :        if (present(dmsp)) &
    1065       248885 :           dmsp = p1
    1066       248885 :        if (present(dms)) &
    1067       248885 :           dms  = p1
    1068       248885 :        if (present(algalN)) then
    1069       995540 :           algalN(:) = c0
    1070       248885 :           algalN(1) = c1  !0.0026_dbl_kind ! ISPOL, Lannuzel 2013(pennate)
    1071       248885 :           algalN(2) = 0.0057_dbl_kind ! ISPOL, Lannuzel 2013(small plankton)
    1072       248885 :           algalN(3) = 0.0027_dbl_kind ! ISPOL, Lannuzel 2013(Phaeocystis)
    1073              :        endif
    1074       248885 :        if (present(doc))then
    1075       995540 :           doc(:) = c0
    1076       248885 :           doc(1) = 16.2_dbl_kind ! 18% saccharides
    1077       248885 :           doc(2) = 9.0_dbl_kind  ! lipids
    1078       248885 :           doc(3) = c1 !
    1079              :        endif
    1080       248885 :        if (present(dic)) then
    1081       497770 :           dic(:) = c0
    1082       248885 :           dic(1) = 1950.0_dbl_kind ! 1950-2260 mmol C/m3 (Tynan et al. 2015)
    1083              :        endif
    1084       248885 :        if (present(don)) then
    1085       497770 :           don(:) = c0
    1086       248885 :           don(1) = 12.9_dbl_kind ! 64.3_dbl_kind ! 72% Total DOC~90 mmolC/m^3  ISPOL with N:C of 0.2
    1087              :        endif
    1088       248885 :        if (present(fed)) then
    1089       746655 :           fed(:) = c0
    1090       248885 :           fed(1) = 0.4_dbl_kind ! c1 (nM) Lannuzel2007 DFe,! range 0.14-2.6 (nM) van der Merwe 2011
    1091              :            ! Tagliabue 2012 (0.4 nM)
    1092              :        endif
    1093       248885 :        if (present(fep)) then
    1094       746655 :           fep(:) = c0
    1095       248885 :           fep(1) = c2 ! (nM) van der Merwe 2011
    1096              :           ! (0.6 to 2.9 nM ocean)
    1097              :        endif
    1098       248885 :        if (present(hum)) &
    1099       248885 :             hum  = c1        ! mmol C/m^3
    1100       248885 :        if (present(nit)) &
    1101       248885 :             nit  = 12.0_dbl_kind
    1102       248885 :        if (present(sil)) &
    1103       248885 :             sil  = 25.0_dbl_kind
    1104       248885 :        if (present(zaeros)) &
    1105      1742195 :           zaeros(:) = c0
    1106              : 
    1107       248885 :       end subroutine icepack_init_ocean_bio
    1108              : !
    1109              : !=======================================================================
    1110              : !
    1111              : ! Given some added new ice to the base of the existing ice, recalculate
    1112              : ! vertical bio tracer so that new grid cells are all the same size.
    1113              : !
    1114              : ! author: N. Jeffery, LANL
    1115              : ! date  : Mar 3, 2024
    1116              : !
    1117              : ! Based on update_vertical_tracers modified for vertical biogeochemistry
    1118              : !
    1119    338030020 :       subroutine update_vertical_bio_tracers(nbiolyr, trc, h1, h2, trc0, zspace)
    1120              : 
    1121              :       integer (kind=int_kind), intent(in) :: &
    1122              :          nbiolyr ! number of bio layers nblyr+1
    1123              : 
    1124              :       real (kind=dbl_kind), dimension(:), intent(inout) :: &
    1125              :            trc ! vertical tracer
    1126              : 
    1127              :       real (kind=dbl_kind), intent(in) :: &
    1128              :          h1, & ! old thickness   ! LCOV_EXCL_LINE
    1129              :          h2, & ! new thickness   ! LCOV_EXCL_LINE
    1130              :          trc0  ! tracer value of added ice on ice bottom
    1131              : 
    1132              :       real (kind=dbl_kind), dimension(nbiolyr), intent(in) :: &
    1133              :          zspace
    1134              : 
    1135              :       ! local variables
    1136              : 
    1137    676060040 :       real(kind=dbl_kind), dimension(nbiolyr) :: trc2 ! updated tracer temporary
    1138              : 
    1139              :       ! vertical indices for old and new grid
    1140              :       integer :: k1, k2
    1141              : 
    1142              :       real (kind=dbl_kind) :: &
    1143              :          z1a, z1b, & ! upper, lower boundary of old cell/added new ice at bottom   ! LCOV_EXCL_LINE
    1144              :          z2a, z2b, & ! upper, lower boundary of new cell   ! LCOV_EXCL_LINE
    1145              :          overlap , & ! overlap between old and new cell   ! LCOV_EXCL_LINE
    1146              :          rnilyr
    1147              : 
    1148              :         !rnilyr = real(nilyr,dbl_kind)
    1149    338030020 :         z2a = c0
    1150    338030020 :         z2b = c0
    1151    338030020 :         if (h2 > puny) then
    1152              :         ! loop over new grid cells
    1153   3040865280 :         do k2 = 1, nbiolyr
    1154              : 
    1155              :            ! initialize new tracer
    1156   2702991360 :            trc2(k2) = c0
    1157              : 
    1158              :            ! calculate upper and lower boundary of new cell
    1159   2702991360 :            z2a = z2b  !((k2 - 1) * h2) * zspace(k2)+z2b ! / rnilyr
    1160   2702991360 :            z2b = z2b + h2 * zspace(k2) !(k2       * h2) * zspace(k2)+z2a !/ rnilyr
    1161              : 
    1162   2702991360 :            z1a = c0
    1163   2702991360 :            z1b = c0
    1164              :            ! loop over old grid cells
    1165  24326922240 :            do k1 = 1, nbiolyr
    1166              : 
    1167              :               ! calculate upper and lower boundary of old cell
    1168  21623930880 :               z1a = z1b !((k1 - 1) * h1) * zspace(k1)+z1b !/ rnilyr
    1169  21623930880 :               z1b = z1b + h1 * zspace(k1) !(k1       * h1) * zspace(k1)+z1a !/ rnilyr
    1170              : 
    1171              :               ! calculate overlap between old and new cell
    1172  21623930880 :               overlap = max(min(z1b, z2b) - max(z1a, z2a), c0)
    1173              : 
    1174              :               ! aggregate old grid cell contribution to new cell
    1175  24326922240 :               trc2(k2) = trc2(k2) + overlap * trc(k1)
    1176              : 
    1177              :            enddo ! k1
    1178              : 
    1179              :            ! calculate upper and lower boundary of added new ice at bottom
    1180   2702991360 :            z1a = h1
    1181   2702991360 :            z1b = h2
    1182              : 
    1183              :            ! calculate overlap between added ice and new cell
    1184   2702991360 :            overlap = max(min(z1b, z2b) - max(z1a, z2a), c0)
    1185              :            ! aggregate added ice contribution to new cell
    1186   2702991360 :            trc2(k2) = trc2(k2) + overlap * trc0
    1187              :            ! renormalize new grid cell
    1188   3040865280 :            trc2(k2) = trc2(k2)/zspace(k2)/h2 !(rnilyr * trc2(k2)) / h2
    1189              : 
    1190              :         enddo ! k2
    1191              :      else
    1192      1404900 :         trc2 = trc
    1193              :      endif
    1194              :         ! update vertical tracer array with the adjusted tracer
    1195   3042270180 :         trc = trc2
    1196              : 
    1197    338030020 :       end subroutine update_vertical_bio_tracers
    1198              : 
    1199              : !=======================================================================
    1200              : 
    1201              :       end module icepack_zbgc
    1202              : 
    1203              : !=======================================================================
        

Generated by: LCOV version 2.0-1