From 5b328042a9e4c4bc3dcbb4f15ce048215ab878ff Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Thu, 27 Feb 2020 17:16:30 -0700 Subject: [PATCH 01/13] initial isotope tracer mods --- columnphysics/icepack_atmo.F90 | 70 ++- columnphysics/icepack_flux.F90 | 26 +- columnphysics/icepack_intfc.F90 | 1 + columnphysics/icepack_isotope.F90 | 485 ++++++++++++++++++ columnphysics/icepack_itd.F90 | 116 ++++- columnphysics/icepack_mechred.F90 | 65 ++- columnphysics/icepack_therm_itd.F90 | 111 +++- columnphysics/icepack_therm_vertical.F90 | 67 ++- columnphysics/icepack_tracers.F90 | 51 +- configuration/driver/icedrv_InitMod.F90 | 5 +- configuration/driver/icedrv_RunMod.F90 | 10 +- configuration/driver/icedrv_diagnostics.F90 | 53 +- configuration/driver/icedrv_domain_size.F90 | 2 + configuration/driver/icedrv_flux.F90 | 34 +- configuration/driver/icedrv_forcing_bgc.F90 | 19 +- configuration/driver/icedrv_init.F90 | 53 +- configuration/driver/icedrv_restart.F90 | 91 +++- configuration/driver/icedrv_step.F90 | 91 +++- configuration/scripts/icepack.build | 4 +- configuration/scripts/icepack.settings | 1 + configuration/scripts/icepack_in | 1 + configuration/scripts/options/set_env.isotope | 1 + configuration/scripts/options/set_nml.isotope | 1 + 23 files changed, 1224 insertions(+), 134 deletions(-) create mode 100644 columnphysics/icepack_isotope.F90 create mode 100644 configuration/scripts/options/set_env.isotope create mode 100644 configuration/scripts/options/set_nml.isotope diff --git a/columnphysics/icepack_atmo.F90 b/columnphysics/icepack_atmo.F90 index 9ce598c99..728e56042 100644 --- a/columnphysics/icepack_atmo.F90 +++ b/columnphysics/icepack_atmo.F90 @@ -61,9 +61,13 @@ subroutine atmo_boundary_layer (sfctype, & lhcoef, shcoef, & Cdn_atm, & Cdn_atm_ratio_n, & + n_iso, & + Qa_iso, Qref_iso, & uvel, vvel, & Uref ) + use icepack_tracers, only: tr_iso + character (len=3), intent(in) :: & sfctype ! ice or ocean @@ -75,6 +79,9 @@ subroutine atmo_boundary_layer (sfctype, & integer (kind=int_kind), intent(in) :: & natmiter ! number of iterations for boundary layer calculations + integer (kind=int_kind), optional, intent(in) :: & + n_iso ! number of isotopes + real (kind=dbl_kind), intent(in) :: & Tsf , & ! surface temperature of ice or ocean potT , & ! air potential temperature (K) @@ -104,6 +111,12 @@ subroutine atmo_boundary_layer (sfctype, & shcoef , & ! transfer coefficient for sensible heat lhcoef ! transfer coefficient for latent heat + real (kind=dbl_kind), intent(in), optional, dimension(:) :: & + Qa_iso ! specific isotopic humidity (kg/kg) + + real (kind=dbl_kind), intent(inout), optional, dimension(:) :: & + Qref_iso ! reference specific isotopic humidity (kg/kg) + real (kind=dbl_kind), intent(in) :: & uvel , & ! x-direction ice speed (m/s) vvel ! y-direction ice speed (m/s) @@ -114,7 +127,7 @@ subroutine atmo_boundary_layer (sfctype, & ! local variables integer (kind=int_kind) :: & - k ! iteration index + k,n ! iteration index real (kind=dbl_kind) :: & TsfK , & ! surface temperature in Kelvin (K) @@ -136,6 +149,7 @@ subroutine atmo_boundary_layer (sfctype, & ustar , & ! ustar (m/s) tstar , & ! tstar qstar , & ! qstar + ratio , & ! ratio rdn , & ! sqrt of neutral exchange coefficient (momentum) rhn , & ! sqrt of neutral exchange coefficient (heat) ren , & ! sqrt of neutral exchange coefficient (water) @@ -356,6 +370,18 @@ subroutine atmo_boundary_layer (sfctype, & Uref = vmag * rd / rdn endif + if (present(Qref_iso) .and. present(Qa_iso) & + .and. present(n_iso)) then + Qref_iso(:) = c0 + if (tr_iso) then + do n = 1, n_iso + ratio = c0 + if (Qa_iso(2) > puny) ratio = Qa_iso(n)/Qa_iso(2) + Qref_iso(n) = Qa_iso(n) - ratio*delq*fac + enddo + endif + endif + end subroutine atmo_boundary_layer !======================================================================= @@ -800,7 +826,7 @@ end subroutine neutral_drag_coeffs !autodocument_start icepack_atm_boundary ! - subroutine icepack_atm_boundary(sfctype, & + subroutine icepack_atm_boundary(sfctype, & Tsf, potT, & uatm, vatm, & wind, zlvl, & @@ -811,9 +837,13 @@ subroutine icepack_atm_boundary(sfctype, & lhcoef, shcoef, & Cdn_atm, & Cdn_atm_ratio_n, & + n_iso, & + Qa_iso, Qref_iso, & uvel, vvel, & Uref) + use icepack_tracers, only: tr_iso + character (len=3), intent(in) :: & sfctype ! ice or ocean @@ -827,6 +857,9 @@ subroutine icepack_atm_boundary(sfctype, & Qa , & ! specific humidity (kg/kg) rhoa ! air density (kg/m^3) + integer (kind=int_kind), optional, intent(in) :: & + n_iso ! number of isotopes + real (kind=dbl_kind), intent(inout) :: & Cdn_atm , & ! neutral drag coefficient Cdn_atm_ratio_n ! ratio drag coeff / neutral drag coeff @@ -844,6 +877,12 @@ subroutine icepack_atm_boundary(sfctype, & shcoef , & ! transfer coefficient for sensible heat lhcoef ! transfer coefficient for latent heat + real (kind=dbl_kind), intent(in), optional, dimension(:) :: & + Qa_iso ! specific isotopic humidity (kg/kg) + + real (kind=dbl_kind), intent(inout), optional, dimension(:) :: & + Qref_iso ! reference specific isotopic humidity (kg/kg) + real (kind=dbl_kind), optional, intent(in) :: & uvel , & ! x-direction ice speed (m/s) vvel ! y-direction ice speed (m/s) @@ -858,6 +897,12 @@ subroutine icepack_atm_boundary(sfctype, & real (kind=dbl_kind) :: & worku, workv, workr + integer (kind=int_kind) :: & + niso + + real (kind=dbl_kind), dimension(:), allocatable :: & + Qaiso, Qriso + character(len=*),parameter :: subname='(icepack_atm_boundary)' worku = c0 @@ -869,6 +914,15 @@ subroutine icepack_atm_boundary(sfctype, & if (present(vvel)) then workv = vvel endif + if (present(n_iso) .and. present(Qa_iso) .and. & + present(Qref_iso)) then + allocate(Qaiso(n_iso),Qriso(n_iso)) + Qaiso = Qa_iso + Qriso = Qref_iso + niso = n_iso + else + allocate(Qaiso(1),Qriso(1)) + endif Cdn_atm_ratio_n = c1 @@ -896,8 +950,10 @@ subroutine icepack_atm_boundary(sfctype, & lhcoef, shcoef, & Cdn_atm, & Cdn_atm_ratio_n, & - worku, workv, & - workr) + n_iso=niso, & + Qa_iso=Qaiso, Qref_iso=Qriso,& + uvel=worku, vvel=workv, & + Uref=workr) if (icepack_warnings_aborted(subname)) return endif ! atmbndy @@ -905,6 +961,12 @@ subroutine icepack_atm_boundary(sfctype, & Uref = workr endif + if (present(Qref_iso)) then + Qref_iso = Qriso + endif + + deallocate(Qaiso,Qriso) + end subroutine icepack_atm_boundary !------------------------------------------------------------ diff --git a/columnphysics/icepack_flux.F90 b/columnphysics/icepack_flux.F90 index dc1cfb395..60aae4bda 100644 --- a/columnphysics/icepack_flux.F90 +++ b/columnphysics/icepack_flux.F90 @@ -55,7 +55,10 @@ subroutine merge_fluxes (aicen, & meltt, melts, & meltb, & congel, snoice, & - Uref, Urefn ) + Uref, Urefn, & + Qref_iso, Qrefn_iso, & + fiso_ocn, fiso_ocnn, & + fiso_evap, fiso_evapn) ! single category fluxes real (kind=dbl_kind), intent(in) :: & @@ -119,6 +122,16 @@ subroutine merge_fluxes (aicen, & real (kind=dbl_kind), optional, intent(inout):: & Uref ! air speed reference level (m/s) + real (kind=dbl_kind), optional, dimension(:), intent(inout):: & + Qref_iso, & ! isotope air sp hum reference level (kg/kg) + fiso_ocn, & ! isotope fluxes to ocean (kg/m2/s) + fiso_evap ! isotope evaporation (kg/m2/s) + + real (kind=dbl_kind), optional, dimension(:), intent(in):: & + Qrefn_iso, & ! isotope air sp hum reference level (kg/kg) + fiso_ocnn, & ! isotope fluxes to ocean (kg/m2/s) + fiso_evapn ! isotope evaporation (kg/m2/s) + character(len=*),parameter :: subname='(merge_fluxes)' !----------------------------------------------------------------- @@ -148,6 +161,17 @@ subroutine merge_fluxes (aicen, & Tref = Tref + Trefn * aicen Qref = Qref + Qrefn * aicen + ! Isotopes + if (present(Qrefn_iso) .and. present(Qref_iso)) then + Qref_iso (:) = Qref_iso (:) + Qrefn_iso (:) * aicen + endif + if (present(fiso_ocnn) .and. present(fiso_ocn)) then + fiso_ocn (:) = fiso_ocn (:) + fiso_ocnn (:) * aicen + endif + if (present(fiso_evapn) .and. present(fiso_evap)) then + fiso_evap(:) = fiso_evap(:) + fiso_evapn(:) * aicen + endif + ! ocean fluxes if (present(Urefn) .and. present(Uref)) then Uref = Uref + Urefn * aicen diff --git a/columnphysics/icepack_intfc.F90 b/columnphysics/icepack_intfc.F90 index c457a8b09..f6ce6f494 100644 --- a/columnphysics/icepack_intfc.F90 +++ b/columnphysics/icepack_intfc.F90 @@ -42,6 +42,7 @@ module icepack_intfc use icepack_tracers, only: icepack_max_don => max_don use icepack_tracers, only: icepack_max_fe => max_fe use icepack_tracers, only: icepack_max_aero => max_aero + use icepack_tracers, only: icepack_max_iso => max_iso use icepack_tracers, only: icepack_nmodal1 => nmodal1 use icepack_tracers, only: icepack_nmodal2 => nmodal2 use icepack_parameters, only: icepack_nspint => nspint diff --git a/columnphysics/icepack_isotope.F90 b/columnphysics/icepack_isotope.F90 new file mode 100644 index 000000000..e13a96cbb --- /dev/null +++ b/columnphysics/icepack_isotope.F90 @@ -0,0 +1,485 @@ +!======================================================================= + +! Water isotope tracers within sea ice and snow +! +! authors: David Bailey, NCAR +! Jiang Zhu, UW-Madison +! +! 2014: Added i2x evaporation flux +! Added fractionation options +! Fixed bugs +! + module icepack_isotope + + use icepack_kinds + use icepack_parameters, only: c0, c1, c2, p001, p1, p5, puny + + implicit none + + character(len=5), parameter :: & + frac = 'cfrac' ! fractionation coefficient calculation method + ! cfrac, constant fractionation + ! nfrac, nonfractionation + ! gfrac, growth-rate dependent for H2_18O + + ! Species indicies - public so thay can be seen by water_tracers + integer, parameter, public :: ispundef = 0 ! Undefined + integer, parameter, public :: isph2o = 1 ! H2O "regular" water + integer, parameter, public :: isph216o = 2 ! H216O similar to "regular" + integer, parameter, public :: isphdo = 3 ! HDO + integer, parameter, public :: isph218o = 4 ! H218O + integer, parameter, public :: pwtspec = 4 ! number of water species + ! h2o,hdo,h218o,h216o + +!======================================================================= + + contains + +!======================================================================= +! +! Increase isotope in ice or snow surface due to deposition and loss +! + subroutine update_isotope (dt, & + nilyr, nslyr, & + n_iso, & + meltt, melts, & + meltb, congel, & + snoice, evap, & + fsnow, Tsfc, & + Qref_iso, & + isosno, isoice, & + aice_old, & + vice_old, vsno_old, & + vicen, vsnon, aicen, & + fiso_atm, fiso_evapn, & + fiso_ocnn, HDO_ocn, & + H2_16O_ocn, H2_18O_ocn) + +! use water_isotopes, only: wiso_alpi + use icepack_parameters, only: ktherm, rhoi, rhos, Tffresh + + integer (kind=int_kind), intent(in) :: & + nilyr, nslyr, n_iso + + real (kind=dbl_kind), intent(in) :: & + dt ! time step + + real (kind=dbl_kind), intent(in) :: & + Tsfc, & ! surface temperature + meltt, & ! top melt + melts, & ! snow melt + meltb, & ! bottom melt + congel, & ! congelation ice growth (m/step) + snoice, & ! ice thickness increase (m/step) + evap, & ! surface evaporation + fsnow, & ! snowfall (kg/m^2/s of water) + vicen, & ! volume per unit area of ice (m) + vsnon, & ! volume per unit area of snow (m) + aicen, & ! ice area + aice_old, & ! beginning values + vice_old, & + vsno_old, & + HDO_ocn, & ! + H2_16O_ocn, & ! + H2_18O_ocn ! + + real (kind=dbl_kind), dimension(:), intent(in) :: & + fiso_atm, & ! isotopic snowfall (kg/m^2/s of water) + Qref_iso ! isotope reference humidity + + real (kind=dbl_kind), dimension(:), intent(inout) :: & + fiso_ocnn, & ! isotopic freshwater (kg/m^2/s) + fiso_evapn ! evaporative water flux (kg/m^2/s) + + real (kind=dbl_kind), dimension(:), intent(inout) :: & + isosno, isoice ! mass of isotopes (kg) + +! local variables + + real (kind=dbl_kind) :: & + dzsno, & + dzice, & + evaps, & ! evaporation over snow (m/step) + evapi, & ! evaporation over ice (m/step) + dhs_snoice,& ! snow thickness reduction (m/step) + hi, & + hs + + real (kind=dbl_kind), dimension(n_iso) :: & + isotot, isotot0 ! for diagnostics + + real (kind=dbl_kind) :: & + hs_old, hi_old, dhs, dhi, sloss1, & + TsfK, & ! snow/ice temperature (K) + alphai, & ! ice/vapour fractionation coefficient + ratio, & ! isotopic ratio + work, & ! temporary variable + alpha + + integer (kind=int_kind) :: k + + ! initialize + + hs_old=vsno_old/aice_old + hi_old=vice_old/aice_old + + dzsno = hs_old + dzice = hi_old + + if (aicen > puny) then + hs = vsnon/aicen + hi = vicen/aicen + elseif (aice_old > puny) then + hs = vsnon/aice_old + hi = vicen/aice_old + endif + + if (ktherm == 2) then + dhs_snoice = snoice + else + dhs_snoice = snoice*rhoi/rhos + endif + +! if (hs > puny) then +! evaps = evap*dt/rhos +! else +! evapi = evap*dt/rhoi +! endif + evaps = hs - (hs_old - melts - dhs_snoice + fsnow/rhos*dt) + evapi = hi - (hi_old - meltt - meltb + congel + snoice) + +! condensation of vapor onto snow and ice + + TsfK = Tsfc + Tffresh + + if (evaps > c0) then ! condensation to snow + do k = 1, n_iso + ratio = c1 ! ratio between 18O(HDO) and 16O in humidity + alphai = c1 ! fractionation coefficient + if (frac.ne.'nfrac' .and. Qref_iso(2)>puny) & + ratio = Qref_iso(k)/Qref_iso(2) + if (Qref_iso(2) <= puny) ratio = c0 + if (frac.ne.'nfrac' .and. k==1) alphai = wiso_alpi(3,TsfK) + if (frac.ne.'nfrac' .and. k==2) alphai = wiso_alpi(2,TsfK) + if (frac.ne.'nfrac' .and. k==3) alphai = wiso_alpi(4,TsfK) + work = alphai*ratio*rhos*evaps*aicen + fiso_evapn(k) = fiso_evapn(k) + work/dt + isosno(k) = isosno(k) + work + enddo + dzsno = dzsno + evaps + endif + + if (evapi > c0) then ! condensation to ice + do k = 1, n_iso + ratio = c1 ! ratio between 18O(HDO) and 16O in ref humidity + alphai = c1 ! fractionation coefficient + if (frac.ne.'nfrac' .and. Qref_iso(2)>puny) & + ratio = Qref_iso(k)/Qref_iso(2) + if (Qref_iso(2) <= puny) ratio = c0 + if (frac.ne.'nfrac' .and. k==1) alphai = wiso_alpi(3,TsfK) + if (frac.ne.'nfrac' .and. k==2) alphai = wiso_alpi(2,TsfK) + if (frac.ne.'nfrac' .and. k==3) alphai = wiso_alpi(4,TsfK) + work = alphai*ratio*rhoi*evapi*aicen + fiso_evapn(k) = fiso_evapn(k) + work/dt + isoice(k) = isoice(k) + work + enddo + dzice = dzice + evapi + endif + +! basal ice growth and isotope uptake + +!ECH: this needs to be recoded in case n_iso < 3 + if (congel > c0) then + k = 1 + alpha = isoice_alpha(congel/dt,'HDO',frac) + work = alpha*HDO_ocn*rhoi*congel*aicen + isoice(k) = isoice(k) + work + fiso_ocnn(k) = fiso_ocnn(k) - work/dt + + k = 2 + alpha = isoice_alpha(congel/dt,'H2_16O',frac) + work = alpha*H2_16O_ocn*rhoi*congel*aicen + isoice(k) = isoice(k) + work + fiso_ocnn(k) = fiso_ocnn(k) - work/dt + + k = 3 + alpha = isoice_alpha(congel/dt,'H2_18O',frac) + work = alpha*H2_18O_ocn*rhoi*congel*aicen + isoice(k) = isoice(k)+work + fiso_ocnn(k) = fiso_ocnn(k)-work/dt + + dzice = dzice + congel + endif + +! sublimation of snow and ice + + if (evaps < c0) then ! snow sublimation (no fractionation) + do k = 1, n_iso + !ratio = c1 ! ratio between 18O(HDO) and 16O in snow + !if (isosno(2) > puny) ratio = isosno(k)/isosno(2) + !if (ratio > c5) ratio = c1 !! remove latter? + !work = ratio*rhos*evaps*aicen + !fiso_evapn(k) = fiso_evapn(k)+work/dt + + sloss1 = c0 + if (dzsno > puny) sloss1 = isosno(k)*min(-evaps,dzsno)/dzsno + if (isosno(k) >= sloss1) then + isosno(k) = isosno(k)-sloss1 + else + sloss1 = isosno(k) + isosno(k) = c0 + endif +! if (isosno(k) < c0) then +! write(nu_diag,*) 'Neg isosno(k)',isosno(k),sloss1 +! endif + fiso_evapn(k) = fiso_evapn(k) - sloss1/dt + enddo + + dzsno = dzsno + evaps + if (dzsno <= c0) then ! snow goes away + fiso_evapn(:) = fiso_evapn(:) - isosno(:)/dt + isosno(:) = c0 + dzsno = c0 + endif + endif + + if (evapi < c0) then ! ice sublimation (no fractionation) + do k = 1, n_iso + !!ratio = c1 ! ratio between 18O(HDO) and 16O in ice + !!if (isoice(2) > puny) ratio = isoice(k)/isoice(2) + !!if (ratio > c5) ratio = c1 ! remove later? + !!work = ratio*rhoi*evapi*aicen + !!fiso_evapn(k) = fiso_evapn(k)+work/dt + + sloss1 = c0 + if (dzice > puny) & + sloss1 = isoice(k) * min(-evapi,dzice)/dzice + if (isoice(k) >= sloss1) then + isoice(k) = isoice(k)-sloss1 + else + sloss1 = isoice(k) + isoice(k) = c0 + endif + fiso_evapn(k) = fiso_evapn(k) - sloss1/dt + enddo + + dzice = dzice + evapi + if (dzice <= c0) then ! ice goes away + fiso_evapn(:) = fiso_evapn(:) - isoice(:)/dt + isoice(:) = c0 + dzice = c0 + endif + endif + +! surface snow melt + + if (melts > c0) then + do k=1,n_iso + sloss1=c0 + if (dzsno > puny) & + sloss1 = isosno(k) * min(melts,dzsno)/dzsno + if (isosno(k) >= sloss1) then + isosno(k) = isosno(k)-sloss1 + else + sloss1 = isosno(k) + isosno(k) = c0 + endif +! if (isosno(k) < c0) then +! write(nu_diag,*) 'Neg isosno(k)',isosno(k),sloss1 +! endif + fiso_ocnn(k) = fiso_ocnn(k) + sloss1/dt + enddo ! n_iso + + dzsno = dzsno - melts + if (dzsno <= c0) then ! snow melts away + fiso_ocnn(:) = fiso_ocnn(:) + isosno(:)/dt + isosno(:) = c0 + dzsno = c0 + endif + endif + +! surface ice melt + if (meltt > c0) then + do k=1,n_iso + sloss1=c0 + if (dzice > puny) sloss1=isoice(k) * min(meltt,dzice)/dzice + if (isoice(k) >= sloss1) then + isoice(k) = isoice(k)-sloss1 + else + sloss1 = isoice(k) + isoice(k) = c0 + endif + fiso_ocnn(k)=fiso_ocnn(k) + sloss1/dt + enddo + + dzice = dzice - meltt + if (dzice <= c0) then ! ice ice melts away + fiso_ocnn(:) = fiso_ocnn(:)+isoice(:) + isoice(:) = c0 + dzice = c0 + endif + endif + +! basal ice melt. Assume all isotopes lost in basal melt + + if (meltb > c0) then + do k=1,n_iso + sloss1=c0 + if (dzice > puny) sloss1=max(meltb-dzice,c0) * isoice(k)/dzice + if (isoice(k) >= sloss1) then + isoice(k) = isoice(k)-sloss1 + else + sloss1 = isoice(k) + isoice(k) = c0 + endif + fiso_ocnn(k) = fiso_ocnn(k) + sloss1/dt + enddo + + dzice = dzice - meltb + if (dzice <= c0) then ! ice ice melts away + fiso_ocnn(:) = fiso_ocnn(:) + isoice(:) + isoice(:) = c0 + dzice = c0 + endif + endif + +! snowfall and isotope deposition + + if (fsnow > c0) then + isosno(:) = isosno(:) + fiso_atm(:)*aicen*dt + dzsno = dzsno + fsnow/rhos*dt + endif + +! snoice formation + + if (dhs_snoice > c0) then + do k=1,n_iso + sloss1=c0 + if (dzsno > puny) sloss1 = min(dhs_snoice,dzsno) * isosno(k)/dzsno + if (isosno(k) >= sloss1) then + isosno(k) = isosno(k)-sloss1 + else + sloss1 = isosno(k) + isosno(k) = c0 + endif +! if (isosno(k) < c0) then +! write(nu_diag,*) 'Snow-ice isosno(k)',isosno(k),sloss1 +! endif + isoice(k) = isoice(k) + sloss1 + enddo + + dzsno = dzsno - dhs_snoice + dzice = dzice + snoice + if (dzsno <= c0) then ! snow goes away + fiso_ocnn(:)= fiso_ocnn(:) + isosno(:)/dt + isosno(:) = c0 + dzsno = c0 + endif + endif + +! do k=1,n_iso +! isotot(k) = isosno(k) + isoice(k) + +! if ( (isotot(k)-isotot0(k)) & +! - fiso_atm (k)*dt*aicen & +! - fiso_evapn(k)*dt & +! + fiso_ocnn (k)*dt > 1e-6) then +! write(nu_diag,*) 'isotope tracer: ',k +! write(nu_diag,*) 'isotot-isotot0 ',isotot(k)-isotot0(k) +! write(nu_diag,*) 'fiso_atm-fiso_ocnn ',fiso_atm (k)*dt*aicen & +! + fiso_evapn(k)*dt & +! - fiso_ocnn (k)*dt +! endif +! enddo ! n_iso + + ! scale fiso_ocnn. It will be re-scaled by aicen later in merge_fluxes + if (aicen > puny) then + fiso_ocnn(:) = fiso_ocnn(:)/aicen + fiso_evapn(:) = fiso_evapn(:)/aicen + endif + + end subroutine update_isotope + +!======================================================================= + +! calculate the fractionation coefficient for sea-ice formation + + function isoice_alpha(growth_rate, sp, frac) +! +! authors: Jiang Zhu, UW-Madison +! + real (kind=dbl_kind), intent(in) :: & + growth_rate ! sea-ice formation rate (m/s) + character(*), intent(in) :: & + sp,frac ! species: H2_16O, H2_18O, HDO + ! calculation methods: + ! cfrac, constant fractionation + ! nfrac, nonfractionation + ! gfrac, growth-rate dependent + real (kind=dbl_kind) :: & + isoice_alpha ! return fractionation + + if (frac == 'nfrac') isoice_alpha = c1 + if (sp == 'H2_16O') isoice_alpha = c1 + + ! Lehmann and Siegenthaler, 1991 + !-------------------------------------------------- + if (frac == 'cfrac' .and. sp == 'HDO') & + isoice_alpha = 1.02120_dbl_kind + if (frac == 'cfrac' .and. sp == 'H2_18O') & + isoice_alpha = 1.00291_dbl_kind + + ! Eq.9, Toyota et al., 2013 + ! For HDO, 7.2852 = 0.2120/0.00291 + !-------------------------------------------------- + if (frac == 'gfrac' .and. sp == 'HDO') & + isoice_alpha = c1+7.2852_dbl_kind*1.2280E-3_dbl_kind+ & + 0.7311E-3_dbl_kind*exp(-growth_rate/8.0100E8_dbl_kind)+ & + 0.8441E-3_dbl_kind*exp(-growth_rate/0.7800E6_dbl_kind) + if (frac == 'gfrac' .and. sp == 'H2_18O') & + isoice_alpha = c1+1.2280E-3_dbl_kind+ & + 0.7311E-3_dbl_kind*exp(-growth_rate/8.0100E8_dbl_kind)+ & + 0.8441E-3_dbl_kind*exp(-growth_rate/0.7800E6_dbl_kind) + return + + end function isoice_alpha + +!======================================================================= + + function wiso_alpi(isp,tk) + +!----------------------------------------------------------------------- +! Purpose: return ice/vapour fractionation from loop-up tables +! Author: David Noone - Tue Jul 1 12:02:24 MDT 2003 +!----------------------------------------------------------------------- + + integer , intent(in) :: isp ! species indes + real(kind=dbl_kind), intent(in) :: tk ! temperature (k) + real(kind=dbl_kind) :: wiso_alpi ! return fractionation + +!From Merlivat & Nief,1967 for HDO, and Majoube, 1971b for H218O: + real(kind=dbl_kind), parameter, dimension(pwtspec) :: & ! ice/vapour + alpai = (/ 0._dbl_kind, 0._dbl_kind, 16289._dbl_kind, 0._dbl_kind /), & + alpbi = (/ 0._dbl_kind, 0._dbl_kind, 0._dbl_kind, 11.839_dbl_kind /), & + alpci = (/ 0._dbl_kind, 0._dbl_kind, -9.45e-2_dbl_kind, -28.224e-3_dbl_kind /) + +!----------------------------------------------------------------------- + if (isp == isph2o) then + wiso_alpi = c1 + return + end if + + wiso_alpi = exp(alpai(isp)/tk**2 + alpbi(isp)/tk + alpci(isp)) + +#ifdef NOFRAC + wiso_alpi = c1 +#endif +! + return + end function wiso_alpi + +!======================================================================= + + end module icepack_isotope + +!======================================================================= diff --git a/columnphysics/icepack_itd.F90 b/columnphysics/icepack_itd.F90 index 59eb856d1..b23f393b1 100644 --- a/columnphysics/icepack_itd.F90 +++ b/columnphysics/icepack_itd.F90 @@ -29,7 +29,7 @@ module icepack_itd use icepack_parameters, only: c0, c1, c2, c3, c15, c25, c100, p1, p01, p001, p5, puny use icepack_parameters, only: Lfresh, rhos, ice_ref_salinity, hs_min, cp_ice, Tocnfrz, rhoi use icepack_parameters, only: rhosi, sk_l, hs_ssl, min_salin - use icepack_tracers, only: nt_Tsfc, nt_qice, nt_qsno, nt_aero + use icepack_tracers, only: nt_Tsfc, nt_qice, nt_qsno, nt_aero, nt_isosno, nt_isoice use icepack_tracers, only: nt_apnd, nt_hpnd, nt_fbri, tr_brine, nt_bgc_S, bio_index use icepack_parameters, only: solve_zsal, skl_bgc, z_tracers use icepack_parameters, only: kcatbound, kitd @@ -760,9 +760,9 @@ subroutine cleanup_itd (dt, ntrcr, & aicen, trcrn, & vicen, vsnon, & aice0, aice, & - n_aero, & + n_aero, n_iso, & nbtrcr, nblyr, & - tr_aero, & + tr_aero, tr_iso, & tr_pond_topo, & heat_capacity, & first_ice, & @@ -770,7 +770,8 @@ subroutine cleanup_itd (dt, ntrcr, & n_trcr_strata,nt_strata, & fpond, fresh, & fsalt, fhocn, & - faero_ocn, fzsal, & + faero_ocn, fiso_ocn, & + fzsal, & flux_bio, limit_aice_in) integer (kind=int_kind), intent(in) :: & @@ -780,7 +781,8 @@ subroutine cleanup_itd (dt, ntrcr, & nslyr , & ! number of snow layers ntrcr , & ! number of tracers in use nbtrcr, & ! number of bio tracers in use - n_aero ! number of aerosol tracers + n_aero, & ! number of aerosol tracers + n_iso ! number of isotope tracers real (kind=dbl_kind), intent(in) :: & dt ! time step @@ -813,6 +815,7 @@ subroutine cleanup_itd (dt, ntrcr, & logical (kind=log_kind), intent(in) :: & tr_aero, & ! aerosol flag + tr_iso, & ! isotope flag tr_pond_topo, & ! topo pond flag heat_capacity ! if false, ice and snow have zero heat capacity @@ -834,6 +837,10 @@ subroutine cleanup_itd (dt, ntrcr, & real (kind=dbl_kind), dimension (:), intent(inout), optional :: & faero_ocn ! aerosol flux to ocean (kg/m^2/s) + real (kind=dbl_kind), dimension (:), & + intent(inout), optional :: & + fiso_ocn ! isotope flux to ocean (kg/m^2/s) + logical (kind=log_kind), intent(in), optional :: & limit_aice_in ! if false, allow aice to be out of bounds ! may want to allow this for unit tests @@ -854,6 +861,9 @@ subroutine cleanup_itd (dt, ntrcr, & real (kind=dbl_kind), dimension (n_aero) :: & dfaero_ocn ! zapped aerosol flux (kg/m^2/s) + real (kind=dbl_kind), dimension (n_iso) :: & + dfiso_ocn ! zapped isotope flux (kg/m^2/s) + real (kind=dbl_kind), dimension (ntrcr) :: & dflux_bio ! zapped biology flux (mmol/m^2/s) @@ -877,7 +887,8 @@ subroutine cleanup_itd (dt, ntrcr, & dfsalt = c0 dfhocn = c0 dfaero_ocn(:) = c0 - dflux_bio(:) = c0 + dfiso_ocn (:) = c0 + dflux_bio (:) = c0 dfzsal = c0 !----------------------------------------------------------------- @@ -931,7 +942,8 @@ subroutine cleanup_itd (dt, ntrcr, & if (limit_aice) then call zap_small_areas (dt, ntrcr, & - ncat, n_aero, & + ncat, & + n_aero, n_iso, & nblyr, & nilyr, nslyr, & aice, aice0, & @@ -939,8 +951,10 @@ subroutine cleanup_itd (dt, ntrcr, & vicen, vsnon, & dfpond, & dfresh, dfsalt, & - dfhocn, dfaero_ocn, & - tr_aero, tr_pond_topo, & + dfhocn, & + dfaero_ocn, dfiso_ocn, & + tr_aero, tr_iso, & + tr_pond_topo, & first_ice, nbtrcr, & dfzsal, dflux_bio ) @@ -966,8 +980,9 @@ subroutine cleanup_itd (dt, ntrcr, & trcrn, vsnon, & dfresh, dfhocn, & dfaero_ocn, tr_aero, & + dfiso_ocn, tr_iso, & dflux_bio, nbtrcr, & - n_aero) + n_aero, n_iso) if (icepack_warnings_aborted(subname)) return !------------------------------------------------------------------- @@ -987,6 +1002,13 @@ subroutine cleanup_itd (dt, ntrcr, & faero_ocn(it) = faero_ocn(it) + dfaero_ocn(it) enddo endif + if (present(fiso_ocn)) then + if (tr_iso) then + do it = 1, n_iso + fiso_ocn(it) = fiso_ocn(it) + dfiso_ocn(it) + enddo + endif + endif if (present(flux_bio)) then do it = 1, nbtrcr flux_bio (it) = flux_bio(it) + dflux_bio(it) @@ -1018,7 +1040,8 @@ end subroutine cleanup_itd ! author: William H. Lipscomb, LANL subroutine zap_small_areas (dt, ntrcr, & - ncat, n_aero, & + ncat, & + n_aero, n_iso, & nblyr, & nilyr, nslyr, & aice, aice0, & @@ -1026,8 +1049,10 @@ subroutine zap_small_areas (dt, ntrcr, & vicen, vsnon, & dfpond, & dfresh, dfsalt, & - dfhocn, dfaero_ocn, & - tr_aero, tr_pond_topo, & + dfhocn, & + dfaero_ocn, dfiso_ocn, & + tr_aero, tr_iso, & + tr_pond_topo, & first_ice, nbtrcr, & dfzsal, dflux_bio ) @@ -1038,6 +1063,7 @@ subroutine zap_small_areas (dt, ntrcr, & nslyr , & ! number of snow layers ntrcr , & ! number of tracers in use n_aero , & ! number of aerosol tracers + n_iso , & ! number of isotope tracers nbtrcr ! number of biology tracers real (kind=dbl_kind), intent(in) :: & @@ -1065,11 +1091,15 @@ subroutine zap_small_areas (dt, ntrcr, & real (kind=dbl_kind), dimension (:), intent(inout) :: & dfaero_ocn ! zapped aerosol flux (kg/m^2/s) + real (kind=dbl_kind), dimension (:), intent(inout) :: & + dfiso_ocn ! zapped isotope flux (kg/m^2/s) + real (kind=dbl_kind), dimension (:), intent(inout) :: & dflux_bio ! zapped bio tracer flux from biology (mmol/m^2/s) logical (kind=log_kind), intent(in) :: & tr_aero, & ! aerosol flag + tr_iso, & ! isotope flag tr_pond_topo ! pond flag logical (kind=log_kind), dimension (:), intent(inout) :: & @@ -1123,16 +1153,23 @@ subroutine zap_small_areas (dt, ntrcr, & enddo endif - if (solve_zsal) then + if (tr_iso) then + do it = 1, n_iso + xtmp = vicen(n)*trcrn(nt_isoice+it-1,n)/dt + dfiso_ocn(it) = dfiso_ocn(it) + xtmp + enddo + endif + + if (solve_zsal) then do it = 1, nblyr xtmp = rhosi*trcrn(nt_fbri,n)*vicen(n)*p001& *trcrn(nt_bgc_S+it-1,n)/ & real(nblyr,kind=dbl_kind)/dt dfzsal = dfzsal + xtmp enddo ! n - endif + endif - if (skl_bgc .and. nbtrcr > 0) then + if (skl_bgc .and. nbtrcr > 0) then blevels = 1 bvol(1) = aicen(n)*sk_l it = 1 @@ -1142,7 +1179,7 @@ subroutine zap_small_areas (dt, ntrcr, & dt, bvol(1:blevels), trcr_skl(blevels)) if (icepack_warnings_aborted(subname)) return enddo - elseif (z_tracers .and. nbtrcr > 0) then + elseif (z_tracers .and. nbtrcr > 0) then blevels = nblyr + 1 bvol(:) = vicen(n)/real(nblyr,kind=dbl_kind)*trcrn(nt_fbri,n) bvol(1) = p5*bvol(1) @@ -1152,7 +1189,7 @@ subroutine zap_small_areas (dt, ntrcr, & dt, bvol(1:blevels),trcrn(bio_index(it):bio_index(it)+blevels-1,n)) if (icepack_warnings_aborted(subname)) return enddo - endif + endif !----------------------------------------------------------------- ! Zap ice energy and use ocean heat to melt ice @@ -1187,8 +1224,9 @@ subroutine zap_small_areas (dt, ntrcr, & trcrn(:,n), vsnon(n), & dfresh, dfhocn, & dfaero_ocn, tr_aero, & + dfiso_ocn, tr_iso, & dflux_bio, nbtrcr, & - n_aero, & + n_aero, n_iso, & aicen(n), nblyr) if (icepack_warnings_aborted(subname)) return @@ -1245,6 +1283,15 @@ subroutine zap_small_areas (dt, ntrcr, & enddo ! it endif + if (tr_iso) then + do it = 1, n_iso + xtmp = (vsnon(n)*trcrn(nt_isosno+it-1,n) & + + vicen(n)*trcrn(nt_isoice+it-1,n)) & + * (aice-c1)/aice / dt + dfiso_ocn(it) = dfiso_ocn(it) + xtmp + enddo ! it + endif + !----------------------------------------------------------------- ! Zap ice energy and use ocean heat to melt ice !----------------------------------------------------------------- @@ -1319,13 +1366,15 @@ subroutine zap_snow(dt, nslyr, & trcrn, vsnon, & dfresh, dfhocn, & dfaero_ocn, tr_aero, & + dfiso_ocn, tr_iso, & dflux_bio, nbtrcr, & - n_aero, & + n_aero, n_iso, & aicen, nblyr) integer (kind=int_kind), intent(in) :: & nslyr , & ! number of snow layers n_aero , & ! number of aerosol tracers + n_iso , & ! number of isotope tracers nblyr , & ! number of bio layers nbtrcr @@ -1346,11 +1395,15 @@ subroutine zap_snow(dt, nslyr, & real (kind=dbl_kind), dimension (:), intent(inout) :: & dfaero_ocn ! zapped aerosol flux (kg/m^2/s) + real (kind=dbl_kind), dimension (:), intent(inout) :: & + dfiso_ocn ! zapped isotope flux (kg/m^2/s) + real (kind=dbl_kind), dimension (:), intent(inout) :: & dflux_bio ! zapped bio tracer flux from biology (mmol/m^2/s) logical (kind=log_kind), intent(in) :: & - tr_aero ! aerosol flag + tr_aero, & ! aerosol flag + tr_iso ! isotope flag ! local variables @@ -1370,6 +1423,14 @@ subroutine zap_snow(dt, nslyr, & enddo ! it endif ! tr_aero + ! isotopes + if (tr_iso) then + do it = 1, n_iso + xtmp = vsnon*trcrn(nt_isosno+it-1)/dt + dfiso_ocn(it) = dfiso_ocn(it) + xtmp + enddo ! it + endif ! tr_iso + if (z_tracers) then dvssl = min(p5*vsnon, hs_ssl*aicen) !snow surface layer dvint = vsnon- dvssl !snow interior @@ -1406,13 +1467,15 @@ subroutine zap_snow_temperature(dt, ncat, & trcrn, vsnon, & dfresh, dfhocn, & dfaero_ocn, tr_aero, & + dfiso_ocn, tr_iso, & dflux_bio, nbtrcr, & - n_aero) + n_aero, n_iso) integer (kind=int_kind), intent(in) :: & ncat , & ! number of thickness categories nslyr , & ! number of snow layers n_aero, & ! number of aerosol tracers + n_iso, & ! number of isotope tracers nbtrcr, & ! number of z-tracers in use nblyr ! number of bio layers in ice @@ -1439,10 +1502,14 @@ subroutine zap_snow_temperature(dt, ncat, & dfaero_ocn ! zapped aerosol flux (kg/m^2/s) real (kind=dbl_kind), dimension (:), intent(inout) :: & + dfiso_ocn ! zapped isotope flux (kg/m^2/s) + + real (kind=dbl_kind), dimension (:),intent(inout) :: & dflux_bio ! zapped biology flux (mmol/m^2/s) logical (kind=log_kind), intent(in) :: & - tr_aero ! aerosol flag + tr_aero, & ! aerosol flag + tr_iso ! isotope flag ! local variables @@ -1521,8 +1588,9 @@ subroutine zap_snow_temperature(dt, ncat, & trcrn(:,n), vsnon(n), & dfresh, dfhocn, & dfaero_ocn, tr_aero, & + dfiso_ocn, tr_iso, & dflux_bio, nbtrcr, & - n_aero, & + n_aero, n_iso, & aicen(n), nblyr) if (icepack_warnings_aborted(subname)) return diff --git a/columnphysics/icepack_mechred.F90 b/columnphysics/icepack_mechred.F90 index 215b3790f..5fc567477 100644 --- a/columnphysics/icepack_mechred.F90 +++ b/columnphysics/icepack_mechred.F90 @@ -41,9 +41,9 @@ module icepack_mechred use icepack_parameters, only: kstrength, krdg_partic, krdg_redist, mu_rdg use icepack_parameters, only: heat_capacity - use icepack_tracers, only: tr_pond_topo, tr_aero, tr_brine, ntrcr, nbtrcr + use icepack_tracers, only: tr_pond_topo, tr_aero, tr_iso, tr_brine, ntrcr, nbtrcr use icepack_tracers, only: nt_qice, nt_qsno, nt_fbri, nt_sice - use icepack_tracers, only: nt_alvl, nt_vlvl, nt_aero + use icepack_tracers, only: nt_alvl, nt_vlvl, nt_aero, nt_isosno, nt_isoice use icepack_tracers, only: nt_apnd, nt_hpnd use icepack_tracers, only: icepack_compute_tracers @@ -95,6 +95,7 @@ module icepack_mechred subroutine ridge_ice (dt, ndtd, & ncat, n_aero, & + n_iso, & nilyr, nslyr, & ntrcr, hin_max, & rdg_conv, rdg_shear, & @@ -110,7 +111,7 @@ subroutine ridge_ice (dt, ndtd, & dvirdgdt, opening, & fpond, & fresh, fhocn, & - faero_ocn, & + faero_ocn, fiso_ocn, & aparticn, krdgn, & aredistn, vredistn, & dardg1ndt, dardg2ndt, & @@ -124,6 +125,7 @@ subroutine ridge_ice (dt, ndtd, & nilyr , & ! number of ice layers nslyr , & ! number of snow layers n_aero, & ! number of aerosol tracers + n_iso, & ! number of isotope tracers ntrcr ! number of tracers in use real (kind=dbl_kind), intent(in) :: & @@ -191,6 +193,9 @@ subroutine ridge_ice (dt, ndtd, & real (kind=dbl_kind), dimension(:), intent(inout), optional :: & faero_ocn ! aerosol flux to ocean (kg/m^2/s) + real (kind=dbl_kind), dimension(:), intent(inout), optional :: & + fiso_ocn ! isotope flux to ocean (kg/m^2/s) + ! local variables real (kind=dbl_kind), dimension (ncat) :: & @@ -221,6 +226,9 @@ subroutine ridge_ice (dt, ndtd, & real (kind=dbl_kind), dimension (n_aero) :: & maero ! aerosol mass added to ocean (kg m-2) + real (kind=dbl_kind), dimension (n_iso) :: & + miso ! isotope mass added to ocean (kg m-2) + real (kind=dbl_kind), dimension (0:ncat) :: & apartic ! participation function; fraction of ridging ! and closing associated w/ category n @@ -270,6 +278,7 @@ subroutine ridge_ice (dt, ndtd, & msnow_mlt = c0 esnow_mlt = c0 maero (:) = c0 + miso (:) = c0 mpond = c0 ardg1 = c0 ardg2 = c0 @@ -394,8 +403,10 @@ subroutine ridge_ice (dt, ndtd, & ardg1n, ardg2n, & virdgn, & nslyr, n_aero, & + n_iso, & msnow_mlt, esnow_mlt, & - maero, mpond, & + maero, miso, & + mpond, & aredistn, vredistn) if (icepack_warnings_aborted(subname)) return @@ -589,6 +600,13 @@ subroutine ridge_ice (dt, ndtd, & faero_ocn(it) = faero_ocn(it) + maero(it)*dti enddo endif + if (present(fiso_ocn)) then + if (tr_iso) then + do it = 1, n_iso + fiso_ocn(it) = fiso_ocn(it) + miso(it)*dti + enddo + endif + endif if (present(fpond)) then fpond = fpond - mpond ! units change later endif @@ -1074,8 +1092,10 @@ subroutine ridge_shift (ntrcr, dt, & ardg1nn, ardg2nn, & virdgnn, & nslyr, n_aero, & + n_iso, & msnow_mlt, esnow_mlt, & - maero, mpond, & + maero, miso, & + mpond, & aredistn, vredistn) integer (kind=int_kind), intent(in) :: & @@ -1083,6 +1103,7 @@ subroutine ridge_shift (ntrcr, dt, & nslyr , & ! number of snow layers ntrcr , & ! number of tracers in use n_aero, & ! number of aerosol tracers + n_iso , & ! number of isotope tracers krdg_redist ! selects redistribution function real (kind=dbl_kind), intent(in) :: & @@ -1147,6 +1168,9 @@ subroutine ridge_shift (ntrcr, dt, & real (kind=dbl_kind), dimension(:), intent(inout) :: & maero ! aerosol mass added to ocean (kg m-2) + real (kind=dbl_kind), dimension(:), intent(inout) :: & + miso ! isotope mass added to ocean (kg m-2) + real (kind=dbl_kind), dimension (:), intent(inout), optional :: & aredistn , & ! redistribution function: fraction of new ridge area vredistn ! redistribution function: fraction of new ridge volume @@ -1362,6 +1386,14 @@ subroutine ridge_shift (ntrcr, dt, & enddo endif + if (tr_iso) then + do it = 1, n_iso + miso(it) = miso(it) + vsrdgn*(c1-fsnowrdg) & + * (trcrn(nt_isosno+it-1,n) & + + trcrn(nt_isoice+it-1,n)) + enddo + endif + if (tr_pond_topo) then mpond = mpond + ardg1n * trcrn(nt_apnd,n) & * trcrn(nt_hpnd,n) @@ -1711,8 +1743,8 @@ subroutine icepack_step_ridge (dt, ndtd, & dvirdgdt, opening, & fpond, & fresh, fhocn, & - n_aero, & - faero_ocn, & + n_aero, n_iso, & + faero_ocn, fiso_ocn, & aparticn, krdgn, & aredistn, vredistn, & dardg1ndt, dardg2ndt, & @@ -1731,7 +1763,8 @@ subroutine icepack_step_ridge (dt, ndtd, & nblyr , & ! number of bio layers nilyr , & ! number of ice layers nslyr , & ! number of snow layers - n_aero ! number of aerosol tracers + n_aero, & ! number of aerosol tracers + n_iso ! number of isotope tracers real (kind=dbl_kind), dimension(0:ncat), intent(inout) :: & hin_max ! category limits (m) @@ -1781,6 +1814,9 @@ subroutine icepack_step_ridge (dt, ndtd, & faero_ocn, & ! aerosol flux to ocean (kg/m^2/s) flux_bio ! all bio fluxes to ocean + real (kind=dbl_kind), dimension(:), intent(inout) :: & + fiso_ocn ! isotope flux to ocean (kg/m^2/s) + real (kind=dbl_kind), dimension(:,:), intent(inout) :: & trcrn ! tracers @@ -1813,6 +1849,7 @@ subroutine icepack_step_ridge (dt, ndtd, & call ridge_ice (dt, ndtd, & ncat, n_aero, & + n_iso, & nilyr, nslyr, & ntrcr, hin_max, & rdg_conv, rdg_shear, & @@ -1830,7 +1867,7 @@ subroutine icepack_step_ridge (dt, ndtd, & dvirdgdt, opening, & fpond, & fresh, fhocn, & - faero_ocn, & + faero_ocn, fiso_ocn, & aparticn, krdgn, & aredistn, vredistn, & dardg1ndt, dardg2ndt, & @@ -1842,6 +1879,7 @@ subroutine icepack_step_ridge (dt, ndtd, & call ridge_ice (dt, ndtd, & ncat, n_aero, & + n_iso, & nilyr, nslyr, & ntrcr, hin_max, & rdg_conv, rdg_shear, & @@ -1859,7 +1897,7 @@ subroutine icepack_step_ridge (dt, ndtd, & dvirdgdt, opening, & fpond, & fresh, fhocn, & - faero_ocn, & + faero_ocn, fiso_ocn, & aparticn, krdgn, & aredistn, vredistn, & dardg1ndt, dardg2ndt, & @@ -1882,16 +1920,17 @@ subroutine icepack_step_ridge (dt, ndtd, & aicen, trcrn, & vicen, vsnon, & aice0, aice, & - n_aero, & + n_aero, n_iso, & nbtrcr, nblyr, & - tr_aero, & + tr_aero, tr_iso, & tr_pond_topo, heat_capacity, & first_ice, & trcr_depend, trcr_base, & n_trcr_strata, nt_strata, & fpond, fresh, & fsalt, fhocn, & - faero_ocn, fzsal, & + faero_ocn, fiso_ocn, & + fzsal, & flux_bio) if (icepack_warnings_aborted(subname)) return diff --git a/columnphysics/icepack_therm_itd.F90 b/columnphysics/icepack_therm_itd.F90 index 0952e08ca..b44073f4a 100644 --- a/columnphysics/icepack_therm_itd.F90 +++ b/columnphysics/icepack_therm_itd.F90 @@ -30,12 +30,12 @@ module icepack_therm_itd use icepack_tracers, only: ntrcr, nbtrcr use icepack_tracers, only: nt_qice, nt_qsno, nt_fbri, nt_sice - use icepack_tracers, only: nt_apnd, nt_hpnd, nt_aero + use icepack_tracers, only: nt_apnd, nt_hpnd, nt_aero, nt_isosno, nt_isoice use icepack_tracers, only: nt_Tsfc, nt_iage, nt_FY, nt_fsd use icepack_tracers, only: nt_alvl, nt_vlvl use icepack_tracers, only: tr_pond_cesm, tr_pond_lvl, tr_pond_topo - use icepack_tracers, only: tr_iage, tr_FY, tr_lvl, tr_aero, tr_brine, tr_fsd - use icepack_tracers, only: n_aero + use icepack_tracers, only: tr_iage, tr_FY, tr_lvl, tr_aero, tr_iso, tr_brine, tr_fsd + use icepack_tracers, only: n_aero, n_iso use icepack_tracers, only: bio_index use icepack_warnings, only: warnstr, icepack_warnings_add @@ -45,6 +45,7 @@ module icepack_therm_itd use icepack_itd, only: reduce_area, cleanup_itd use icepack_itd, only: aggregate_area, shift_ice use icepack_itd, only: column_sum, column_conservation_check +!FIX use icepack_isotope, only: isoice_alpha, frac use icepack_mushy_physics, only: liquidus_temperature_mush, enthalpy_mush use icepack_therm_shared, only: hfrazilmin use icepack_therm_shared, only: hi_min @@ -853,9 +854,11 @@ end subroutine update_vertical_tracers ! subroutine lateral_melt (dt, ncat, & nilyr, nslyr, & - n_aero, fpond, & + n_aero, n_iso, & + fpond, & fresh, fsalt, & fhocn, faero_ocn, & + fiso_ocn, & rside, meltl, & fside, sss, & aicen, vicen, & @@ -875,6 +878,7 @@ subroutine lateral_melt (dt, ncat, & nblyr , & ! number of bio layers nslyr , & ! number of snow layers n_aero , & ! number of aerosol tracers + n_iso , & ! number of isotope tracers nbtrcr ! number of bio tracers real (kind=dbl_kind), dimension (:), intent(inout) :: & @@ -911,6 +915,9 @@ subroutine lateral_melt (dt, ncat, & real (kind=dbl_kind), dimension(:), intent(inout) :: & faero_ocn ! aerosol flux to ocean (kg/m^2/s) + real (kind=dbl_kind), dimension(:), intent(inout) :: & + fiso_ocn ! isotope flux to ocean (kg/m^2/s) + ! local variables integer (kind=int_kind) :: & @@ -1167,6 +1174,15 @@ subroutine lateral_melt (dt, ncat, & enddo ! k endif ! tr_aero + if (tr_iso) then + do k = 1, n_iso + fiso_ocn(k) = fiso_ocn(k) & + + (vsnon(n)*trcrn(nt_isosno+k-1,n) & + + vicen(n)*trcrn(nt_isoice+k-1,n)) & + * rside / dt + enddo ! k + endif ! tr_iso + !----------------------------------------------------------------- ! Biogeochemistry !----------------------------------------------------------------- @@ -1234,7 +1250,7 @@ end subroutine lateral_melt ! subroutine add_new_ice (ncat, nilyr, & nfsd, nblyr, & - n_aero, dt, & + n_aero, n_iso, dt, & ntrcr, nltrcr, & hin_max, ktherm, & aicen, trcrn, & @@ -1251,6 +1267,9 @@ subroutine add_new_ice (ncat, nilyr, & nbtrcr, flux_bio, & ocean_bio, fzsal, & frazil_diag, & + fiso_ocn, & + HDO_ocn, H2_16O_ocn, & + H2_18O_ocn, & wave_sig_ht, & wave_spectrum, & wavefreq, & @@ -1269,6 +1288,7 @@ subroutine add_new_ice (ncat, nilyr, & ntrcr , & ! number of tracers nltrcr, & ! number of zbgc tracers n_aero, & ! number of aerosol tracers + n_iso, & ! number of isotope tracers ktherm ! type of thermodynamics (0 0-layer, 1 BL99, 2 mushy) real (kind=dbl_kind), dimension(0:ncat), intent(in) :: & @@ -1336,6 +1356,16 @@ subroutine add_new_ice (ncat, nilyr, & real (kind=dbl_kind), intent(inout) :: & fzsal ! salt flux to ocean from zsalinity (kg/m^2/s) + ! water isotopes + + real (kind=dbl_kind), dimension(:), intent(inout) :: & + fiso_ocn ! isotope flux to ocean (kg/m^2/s) + + real (kind=dbl_kind), intent(in) :: & + HDO_ocn , & ! ocean concentration of HDO (kg/kg) + H2_16O_ocn , & ! ocean concentration of H2_16O (kg/kg) + H2_18O_ocn ! ocean concentration of H2_18O (kg/kg) + ! floe size distribution real (kind=dbl_kind), intent(in) :: & wave_sig_ht ! significant height of waves globally (m) @@ -1392,6 +1422,8 @@ subroutine add_new_ice (ncat, nilyr, & vice_init, vice_final, & ! ice volume summed over categories eice_init, eice_final ! ice energy summed over categories + real (kind=dbl_kind) :: frazil_conc + real (kind=dbl_kind), dimension (nilyr) :: & Sprofile ! salinity profile used for new ice additions @@ -1666,6 +1698,27 @@ subroutine add_new_ice (ncat, nilyr, & enddo endif + frazil_conc = c0 + if (tr_iso .and. vtmp > puny) then + do it=1,n_iso +!FIX if (it==1) & +! frazil_conc = isoice_alpha(c0,'HDO' ,frac)*HDO_ocn +! if (it==2) & +! frazil_conc = isoice_alpha(c0,'H2_16O',frac)*H2_16O_ocn +! if (it==3) & +! frazil_conc = isoice_alpha(c0,'H2_18O',frac)*H2_18O_ocn + + ! dilution and uptake in the ice + trcrn(nt_isoice+it-1,n) & + = (trcrn(nt_isoice+it-1,n)*vicen(n) & + + frazil_conc*rhoi*vsurp) & + / vtmp + + fiso_ocn(it) = fiso_ocn(it) & + - frazil_conc*rhoi*vsurp/dt + enddo + endif + ! update category volumes vicen(n) = vtmp @@ -1767,6 +1820,25 @@ subroutine add_new_ice (ncat, nilyr, & enddo endif + frazil_conc = c0 + if (tr_iso) then + do it=1,n_iso +!FIX if (it==1) & +! frazil_conc = isoice_alpha(c0,'HDO' ,frac)*HDO_ocn +! if (it==2) & +! frazil_conc = isoice_alpha(c0,'H2_16O',frac)*H2_16O_ocn +! if (it==3) & +! frazil_conc = isoice_alpha(c0,'H2_18O',frac)*H2_18O_ocn + + trcrn(nt_isoice+it-1,1) & + = (trcrn(nt_isoice+it-1,1)*vice1) & + + frazil_conc*rhoi*vi0new/vicen(1) + + fiso_ocn(it) = fiso_ocn(it) & + - frazil_conc*rhoi*vi0new/dt + enddo + endif + if (tr_lvl) then alvl = trcrn(nt_alvl,n) trcrn(nt_alvl,n) = & @@ -1880,6 +1952,8 @@ subroutine icepack_step_therm2 (dt, ncat, nltrcr, & flux_bio, ocean_bio, & frazil_diag, & frz_onset, yday, & + fiso_ocn, HDO_ocn, & + H2_16O_ocn, H2_18O_ocn, & nfsd, wave_sig_ht, & wave_spectrum, & wavefreq, & @@ -1987,6 +2061,14 @@ subroutine icepack_step_therm2 (dt, ncat, nltrcr, & real (kind=dbl_kind), intent(in), optional :: & yday ! day of year + ! water isotopes + real (kind=dbl_kind), dimension(:), intent(inout) :: & + fiso_ocn ! isotope flux to ocean (kg/m^2/s) + + real (kind=dbl_kind), intent(in) :: & + HDO_ocn , & ! ocean concentration of HDO (kg/kg) + H2_16O_ocn , & ! ocean concentration of H2_16O (kg/kg) + H2_18O_ocn ! ocean concentration of H2_18O (kg/kg) !autodocument_end character(len=*),parameter :: subname='(icepack_step_therm2)' @@ -2051,7 +2133,7 @@ subroutine icepack_step_therm2 (dt, ncat, nltrcr, & call add_new_ice (ncat, nilyr, & nfsd, nblyr, & - n_aero, dt, & + n_aero, n_iso, dt, & ntrcr, nltrcr, & hin_max, ktherm, & aicen, trcrn, & @@ -2067,12 +2149,15 @@ subroutine icepack_step_therm2 (dt, ncat, nltrcr, & cgrid, igrid, & nbtrcr, flux_bio, & ocean_bio, fzsal, & - frazil_diag, & + frazil_diag, fiso_ocn, & + HDO_ocn, H2_16O_ocn, & + H2_18O_ocn, & wave_sig_ht, & wave_spectrum, & wavefreq, dwavefreq, & d_afsd_latg, d_afsd_newi, & floe_rad_c, floe_binwidth) + if (icepack_warnings_aborted(subname)) return !----------------------------------------------------------------- @@ -2081,9 +2166,11 @@ subroutine icepack_step_therm2 (dt, ncat, nltrcr, & call lateral_melt (dt, ncat, & nilyr, nslyr, & - n_aero, fpond, & + n_aero, n_iso, & + fpond, & fresh, fsalt, & fhocn, faero_ocn, & + fiso_ocn, & rside, meltl, & fside, sss, & aicen, vicen, & @@ -2126,17 +2213,17 @@ subroutine icepack_step_therm2 (dt, ncat, nltrcr, & aicen, trcrn(1:ntrcr,:), & vicen, vsnon, & aice0, aice, & - n_aero, & + n_aero, n_iso, & nbtrcr, nblyr, & - tr_aero, & + tr_aero, tr_iso, & tr_pond_topo, heat_capacity, & first_ice, & trcr_depend, trcr_base, & n_trcr_strata, nt_strata, & fpond, fresh, & fsalt, fhocn, & - faero_ocn, fzsal, & - flux_bio) + faero_ocn, fiso_ocn, & + fzsal, flux_bio) if (icepack_warnings_aborted(subname)) return end subroutine icepack_step_therm2 diff --git a/columnphysics/icepack_therm_vertical.F90 b/columnphysics/icepack_therm_vertical.F90 index 907ef565a..6ec56ac31 100644 --- a/columnphysics/icepack_therm_vertical.F90 +++ b/columnphysics/icepack_therm_vertical.F90 @@ -28,9 +28,9 @@ module icepack_therm_vertical use icepack_parameters, only: rfracmin, rfracmax, pndaspect, dpscale, frzpnd use icepack_parameters, only: phi_i_mushy - use icepack_tracers, only: tr_iage, tr_FY, tr_aero, tr_pond, tr_fsd + use icepack_tracers, only: tr_iage, tr_FY, tr_aero, tr_pond, tr_fsd, tr_iso use icepack_tracers, only: tr_pond_cesm, tr_pond_lvl, tr_pond_topo - use icepack_tracers, only: n_aero + use icepack_tracers, only: n_aero, n_iso use icepack_therm_shared, only: ferrmax, l_brine use icepack_therm_shared, only: calculate_tin_from_qin, Tmin @@ -47,6 +47,7 @@ module icepack_therm_vertical use icepack_mushy_physics, only: enthalpy_mush, enthalpy_of_melting use icepack_aerosol, only: update_aerosol +!FIX use icepack_isotope, only: update_isotope use icepack_atmo, only: neutral_drag_coeffs, icepack_atm_boundary use icepack_age, only: increment_age use icepack_firstyear, only: update_FYarea @@ -2040,11 +2041,14 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & ipnd , & iage , FY , & aerosno , aeroice , & + isosno , isoice , & uatm , vatm , & wind , zlvl , & Qa , rhoa , & + Qa_iso , & Tair , Tref , & Qref , Uref , & + Qref_iso , & Cdn_atm_ratio, & Cdn_ocn , Cdn_ocn_skin, & Cdn_ocn_floe, Cdn_ocn_keel, & @@ -2083,6 +2087,10 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & flatn_f , fsensn_f , & fsurfn_f , fcondtopn_f , & faero_atm , faero_ocn , & + fiso_atm , fiso_ocn , & + fiso_evap , & + HDO_ocn , H2_16O_ocn , & + H2_18O_ocn , & dhsn , ffracn , & meltt , melttn , & meltb , meltbn , & @@ -2186,6 +2194,18 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & mlt_onset , & ! day of year that sfc melting begins frz_onset ! day of year that freezing begins (congel or frazil) + real (kind=dbl_kind), dimension(n_iso), intent(inout) :: & + Qa_iso , & ! isotope specific humidity (kg/kg) + Qref_iso , & ! isotope 2m atm reference spec humidity (kg/kg) + fiso_atm , & ! isotope deposition rate (kg/m^2 s) + fiso_ocn , & ! isotope flux to ocean (kg/m^2/s) + fiso_evap ! isotope evaporation (kg/m^2/s) + + real (kind=dbl_kind), intent(in) :: & + HDO_ocn , & ! ocean concentration of HDO (kg/kg) + H2_16O_ocn , & ! ocean concentration of H2_16O (kg/kg) + H2_18O_ocn ! ocean concentration of H2_18O (kg/kg) + real (kind=dbl_kind), dimension(:), intent(inout) :: & aicen_init , & ! fractional area of ice vicen_init , & ! volume per unit area of ice (m) @@ -2235,6 +2255,9 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & aerosno , & ! snow aerosol tracer (kg/m^2) aeroice ! ice aerosol tracer (kg/m^2) + real (kind=dbl_kind), dimension(:,:), intent(inout) :: & + isosno , & ! snow isotope tracer (kg/m^2) + isoice ! ice isotope tracer (kg/m^2) !autodocument_end ! local variables @@ -2265,6 +2288,11 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & lhcoef , & ! transfer coefficient for latent heat rfrac ! water fraction retained for melt ponds + real (kind=dbl_kind), dimension(n_iso) :: & + Qrefn_iso , & ! isotope air sp hum reference level (kg/kg) + fiso_ocnn , & ! isotope flux to ocean (kg/m^2/s) + fiso_evapn ! isotope evaporation (kg/m^2/s) + real (kind=dbl_kind) :: & pond ! water retained in ponds (m) @@ -2326,6 +2354,9 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & Trefn = c0 Qrefn = c0 + Qrefn_iso(:) = c0 + fiso_ocnn(:) = c0 + fiso_evapn(:) = c0 Urefn = c0 lhcoef = c0 shcoef = c0 @@ -2345,7 +2376,7 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & ! components are set to the data values. !----------------------------------------------------------------- - call icepack_atm_boundary( 'ice', & + call icepack_atm_boundary('ice', & Tsfc(n), potT, & uatm, vatm, & wind, zlvl, & @@ -2356,7 +2387,10 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & lhcoef, shcoef, & Cdn_atm, & Cdn_atm_ratio_n, & - uvel, vvel, & + n_iso=n_iso, & + Qa_iso=Qa_iso, & + Qref_iso=Qrefn_iso, & + uvel=uvel, vvel=vvel, & Uref=Urefn) if (icepack_warnings_aborted(subname)) return @@ -2469,6 +2503,25 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & if (icepack_warnings_aborted(subname)) return endif + if (tr_iso) then +!FIX call update_isotope (dt = dt, & +! nilyr = nilyr, nslyr = nslyr, n_iso = n_iso, & +! meltt = melttn(n),melts = meltsn(n), & +! meltb = meltbn(n),congel=congeln(n), & +! snoice=snoicen(n),evap=evapn, & +! fsnow=fsnow, Tsfc=Tsfc(n), & +! Qref_iso=Qrefn_iso(:), & +! isosno=isosno(:,n),isoice=isoice(:,n), & +! aice_old=aicen_init(n),vice_old=vicen_init(n), & +! vsno_old=vsnon_init(n), & +! vicen=vicen(n),vsnon=vsnon(n), & +! aicen=aicen(n), & +! fiso_atm=fiso_atm(:), & +! fiso_evapn=fiso_evapn(:), & +! fiso_ocnn=fiso_ocnn(:), & +! HDO_ocn=HDO_ocn,H2_16O_ocn=H2_16O_ocn, & +! H2_18O_ocn=H2_18O_ocn) + endif endif ! aicen_init !----------------------------------------------------------------- @@ -2570,7 +2623,11 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & meltt, melts, & meltb, congel, & snoice, & - Uref, Urefn) + Uref=Uref, Urefn=Urefn, & + Qref_iso=Qref_iso,Qrefn_iso=Qrefn_iso, & + fiso_ocn=fiso_ocn,fiso_ocnn=fiso_ocnn, & + fiso_evap=fiso_evap,fiso_evapn=fiso_evapn) + if (icepack_warnings_aborted(subname)) return enddo ! ncat diff --git a/columnphysics/icepack_tracers.F90 b/columnphysics/icepack_tracers.F90 index 04adc96d1..6a72498a7 100644 --- a/columnphysics/icepack_tracers.F90 +++ b/columnphysics/icepack_tracers.F90 @@ -29,6 +29,7 @@ module icepack_tracers ! dimensions !----------------------------------------------------------------- integer (kind=int_kind), parameter, public :: & + max_iso = 3 , & ! maximum number of isotopes max_algae = 3 , & ! maximum number of algal types max_dic = 1 , & ! maximum number of dissolved inorganic carbon types max_doc = 3 , & ! maximum number of dissolved organic carbon types @@ -37,6 +38,7 @@ module icepack_tracers nmodal1 = 10 , & ! dimension for modal aerosol radiation parameters nmodal2 = 8 , & ! dimension for modal aerosol radiation parameters max_aero = 6 , & ! maximum number of aerosols + max_nbtrcr = max_algae*2 & ! algal nitrogen and chlorophyll + max_dic & ! dissolved inorganic carbon + max_doc & ! dissolved organic carbon @@ -54,6 +56,7 @@ module icepack_tracers nslyr = 0, & ! number of snow layers per category nblyr = 0, & ! number of bio/brine layers per category nfsd = 0, & ! number of fsd layers + n_iso = 0, & ! number of isotopes in use n_aero = 0, & ! number of aerosols in use n_zaero = 0, & ! number of z aerosols in use n_algae = 0, & ! number of algae in use @@ -77,6 +80,8 @@ module icepack_tracers nt_hpnd = 0, & ! melt pond depth nt_ipnd = 0, & ! melt pond refrozen lid thickness nt_fsd = 0, & ! floe size distribution + nt_isosno = 0, & ! starting index for isotopes in snow + nt_isoice = 0, & ! starting index for isotopes in ice nt_aero = 0, & ! starting index for aerosols in ice nt_bgc_Nit = 0, & ! nutrients nt_bgc_Am = 0, & ! @@ -97,6 +102,7 @@ module icepack_tracers tr_pond_cesm = .false., & ! if .true., use cesm pond tracer tr_pond_lvl = .false., & ! if .true., use level-ice pond tracer tr_pond_topo = .false., & ! if .true., use explicit topography-based ponds + tr_iso = .false., & ! if .true., use isotope tracers tr_aero = .false., & ! if .true., use aerosol tracers tr_brine = .false., & ! if .true., brine height differs from ice thickness tr_fsd = .false. ! if .true., use floe size distribution @@ -197,7 +203,7 @@ module icepack_tracers subroutine icepack_init_tracer_flags(& tr_iage_in, tr_FY_in, tr_lvl_in, & tr_pond_in, tr_pond_cesm_in, tr_pond_lvl_in, tr_pond_topo_in, & - tr_fsd_in, tr_aero_in, tr_brine_in, tr_zaero_in, & + tr_fsd_in, tr_aero_in, tr_iso_in, tr_brine_in, tr_zaero_in, & tr_bgc_Nit_in, tr_bgc_N_in, tr_bgc_DON_in, tr_bgc_C_in, tr_bgc_chl_in, & tr_bgc_Am_in, tr_bgc_Sil_in, tr_bgc_DMS_in, tr_bgc_Fe_in, tr_bgc_hum_in, & tr_bgc_PON_in) @@ -211,6 +217,7 @@ subroutine icepack_init_tracer_flags(& tr_pond_lvl_in , & ! if .true., use level-ice pond tracer tr_pond_topo_in , & ! if .true., use explicit topography-based ponds tr_fsd_in , & ! if .true., use floe size distribution tracers + tr_iso_in , & ! if .true., use isotope tracers tr_aero_in , & ! if .true., use aerosol tracers tr_brine_in , & ! if .true., brine height differs from ice thickness tr_zaero_in , & ! if .true., black carbon is tracers (n_zaero) @@ -238,6 +245,7 @@ subroutine icepack_init_tracer_flags(& if (present(tr_pond_lvl_in) ) tr_pond_lvl = tr_pond_lvl_in if (present(tr_pond_topo_in)) tr_pond_topo = tr_pond_topo_in if (present(tr_fsd_in) ) tr_fsd = tr_fsd_in + if (present(tr_iso_in) ) tr_iso = tr_iso_in if (present(tr_aero_in) ) tr_aero = tr_aero_in if (present(tr_brine_in) ) tr_brine = tr_brine_in if (present(tr_zaero_in) ) tr_zaero = tr_zaero_in @@ -262,7 +270,7 @@ end subroutine icepack_init_tracer_flags subroutine icepack_query_tracer_flags(& tr_iage_out, tr_FY_out, tr_lvl_out, & tr_pond_out, tr_pond_cesm_out, tr_pond_lvl_out, tr_pond_topo_out, & - tr_fsd_out, tr_aero_out, tr_brine_out, tr_zaero_out, & + tr_fsd_out, tr_aero_out, tr_iso_out, tr_brine_out, tr_zaero_out, & tr_bgc_Nit_out, tr_bgc_N_out, tr_bgc_DON_out, tr_bgc_C_out, tr_bgc_chl_out, & tr_bgc_Am_out, tr_bgc_Sil_out, tr_bgc_DMS_out, tr_bgc_Fe_out, tr_bgc_hum_out, & tr_bgc_PON_out) @@ -276,6 +284,7 @@ subroutine icepack_query_tracer_flags(& tr_pond_lvl_out , & ! if .true., use level-ice pond tracer tr_pond_topo_out , & ! if .true., use explicit topography-based ponds tr_fsd_out , & ! if .true., use floe size distribution + tr_iso_out , & ! if .true., use isotope tracers tr_aero_out , & ! if .true., use aerosol tracers tr_brine_out , & ! if .true., brine height differs from ice thickness tr_zaero_out , & ! if .true., black carbon is tracers (n_zaero) @@ -303,6 +312,7 @@ subroutine icepack_query_tracer_flags(& if (present(tr_pond_lvl_out) ) tr_pond_lvl_out = tr_pond_lvl if (present(tr_pond_topo_out)) tr_pond_topo_out = tr_pond_topo if (present(tr_fsd_out) ) tr_fsd_out = tr_fsd + if (present(tr_iso_out) ) tr_iso_out = tr_iso if (present(tr_aero_out) ) tr_aero_out = tr_aero if (present(tr_brine_out) ) tr_brine_out = tr_brine if (present(tr_zaero_out) ) tr_zaero_out = tr_zaero @@ -341,6 +351,7 @@ subroutine icepack_write_tracer_flags(iounit) write(iounit,*) " tr_pond_lvl = ",tr_pond_lvl write(iounit,*) " tr_pond_topo = ",tr_pond_topo write(iounit,*) " tr_fsd = ",tr_fsd + write(iounit,*) " tr_iso = ",tr_iso write(iounit,*) " tr_aero = ",tr_aero write(iounit,*) " tr_brine = ",tr_brine write(iounit,*) " tr_zaero = ",tr_zaero @@ -366,7 +377,8 @@ subroutine icepack_init_tracer_indices(& nt_Tsfc_in, nt_qice_in, nt_qsno_in, nt_sice_in, & nt_fbri_in, nt_iage_in, nt_FY_in, & nt_alvl_in, nt_vlvl_in, nt_apnd_in, nt_hpnd_in, nt_ipnd_in, & - nt_fsd_in, nt_aero_in, nt_zaero_in, nt_bgc_C_in, & + nt_fsd_in, nt_isosno_in, nt_isoice_in, & + nt_aero_in, nt_zaero_in, nt_bgc_C_in, & nt_bgc_N_in, nt_bgc_chl_in, nt_bgc_DOC_in, nt_bgc_DON_in, & nt_bgc_DIC_in, nt_bgc_Fed_in, nt_bgc_Fep_in, nt_bgc_Nit_in, nt_bgc_Am_in, & nt_bgc_Sil_in, nt_bgc_DMSPp_in, nt_bgc_DMSPd_in, nt_bgc_DMS_in, nt_bgc_hum_in, & @@ -392,7 +404,9 @@ subroutine icepack_init_tracer_indices(& nt_hpnd_in, & ! melt pond depth nt_ipnd_in, & ! melt pond refrozen lid thickness nt_fsd_in, & ! floe size distribution - nt_aero_in, & ! starting index for aerosols in ice + nt_isosno_in, & ! starting index for isotopes in snow + nt_isoice_in, & ! starting index for isotopes in ice + nt_aero_in, & ! starting index for aerosols in ice nt_bgc_Nit_in, & ! nutrients nt_bgc_Am_in, & ! nt_bgc_Sil_in, & ! @@ -467,7 +481,9 @@ subroutine icepack_init_tracer_indices(& if (present(nt_hpnd_in)) nt_hpnd = nt_hpnd_in if (present(nt_ipnd_in)) nt_ipnd = nt_ipnd_in if (present(nt_fsd_in) ) nt_fsd = nt_fsd_in - if (present(nt_aero_in)) nt_aero = nt_aero_in + if (present(nt_isosno_in) ) nt_isosno = nt_isosno_in + if (present(nt_isoice_in) ) nt_isoice = nt_isoice_in + if (present(nt_aero_in) ) nt_aero = nt_aero_in if (present(nt_bgc_Nit_in) ) nt_bgc_Nit = nt_bgc_Nit_in if (present(nt_bgc_Am_in) ) nt_bgc_Am = nt_bgc_Am_in if (present(nt_bgc_Sil_in) ) nt_bgc_Sil = nt_bgc_Sil_in @@ -714,7 +730,8 @@ subroutine icepack_query_tracer_indices(& nt_Tsfc_out, nt_qice_out, nt_qsno_out, nt_sice_out, & nt_fbri_out, nt_iage_out, nt_FY_out, & nt_alvl_out, nt_vlvl_out, nt_apnd_out, nt_hpnd_out, nt_ipnd_out, & - nt_fsd_out, nt_aero_out, nt_zaero_out, nt_bgc_C_out, & + nt_fsd_out, nt_isosno_out, nt_isoice_out, & + nt_aero_out, nt_zaero_out, nt_bgc_C_out, & nt_bgc_N_out, nt_bgc_chl_out, nt_bgc_DOC_out, nt_bgc_DON_out, & nt_bgc_DIC_out, nt_bgc_Fed_out, nt_bgc_Fep_out, nt_bgc_Nit_out, nt_bgc_Am_out, & nt_bgc_Sil_out, nt_bgc_DMSPp_out, nt_bgc_DMSPd_out, nt_bgc_DMS_out, nt_bgc_hum_out, & @@ -740,7 +757,9 @@ subroutine icepack_query_tracer_indices(& nt_hpnd_out, & ! melt pond depth nt_ipnd_out, & ! melt pond refrozen lid thickness nt_fsd_out, & ! floe size distribution - nt_aero_out, & ! starting index for aerosols in ice + nt_isosno_out, & ! starting index for isotopes in snow + nt_isoice_out, & ! starting index for isotopes in ice + nt_aero_out, & ! starting index for aerosols in ice nt_bgc_Nit_out, & ! nutrients nt_bgc_Am_out, & ! nt_bgc_Sil_out, & ! @@ -813,7 +832,9 @@ subroutine icepack_query_tracer_indices(& if (present(nt_hpnd_out)) nt_hpnd_out = nt_hpnd if (present(nt_ipnd_out)) nt_ipnd_out = nt_ipnd if (present(nt_fsd_out) ) nt_fsd_out = nt_fsd - if (present(nt_aero_out)) nt_aero_out = nt_aero + if (present(nt_isosno_out) ) nt_isosno_out = nt_isosno + if (present(nt_isoice_out) ) nt_isoice_out = nt_isoice + if (present(nt_aero_out) ) nt_aero_out = nt_aero if (present(nt_bgc_Nit_out) ) nt_bgc_Nit_out = nt_bgc_Nit if (present(nt_bgc_Am_out) ) nt_bgc_Am_out = nt_bgc_Am if (present(nt_bgc_Sil_out) ) nt_bgc_Sil_out = nt_bgc_Sil @@ -886,7 +907,9 @@ subroutine icepack_write_tracer_indices(iounit) write(iounit,*) " nt_hpnd = ",nt_hpnd write(iounit,*) " nt_ipnd = ",nt_ipnd write(iounit,*) " nt_fsd = ",nt_fsd - write(iounit,*) " nt_aero = ",nt_aero + write(iounit,*) " nt_isosno = ",nt_isosno + write(iounit,*) " nt_isoice = ",nt_isoice + write(iounit,*) " nt_aero = ",nt_aero write(iounit,*) " nt_bgc_Nit = ",nt_bgc_Nit write(iounit,*) " nt_bgc_Am = ",nt_bgc_Am write(iounit,*) " nt_bgc_Sil = ",nt_bgc_Sil @@ -964,7 +987,7 @@ end subroutine icepack_write_tracer_indices subroutine icepack_init_tracer_sizes(& ncat_in, nilyr_in, nslyr_in, nblyr_in, nfsd_in , & - n_algae_in, n_DOC_in, n_aero_in, & + n_algae_in, n_DOC_in, n_aero_in, n_iso_in, & n_DON_in, n_DIC_in, n_fed_in, n_fep_in, n_zaero_in, & ntrcr_in, ntrcr_o_in, nbtrcr_in, nbtrcr_sw_in) @@ -981,6 +1004,7 @@ subroutine icepack_init_tracer_sizes(& n_fed_in , & ! n_fep_in , & ! n_zaero_in, & ! + n_iso_in , & ! n_aero_in , & ! ntrcr_in , & ! number of tracers in use ntrcr_o_in, & ! number of non-bio tracers in use @@ -1004,6 +1028,7 @@ subroutine icepack_init_tracer_sizes(& if (present(n_fed_in) ) n_fed = n_fed_in if (present(n_fep_in) ) n_fep = n_fep_in if (present(n_zaero_in) ) n_zaero = n_zaero_in + if (present(n_iso_in) ) n_iso = n_iso_in if (present(n_aero_in) ) n_aero = n_aero_in if (present(ntrcr_in) ) ntrcr = ntrcr_in @@ -1022,7 +1047,7 @@ subroutine icepack_query_tracer_sizes(& max_don_out , max_fe_out , nmodal1_out , & nmodal2_out , max_aero_out , max_nbtrcr_out , & ncat_out, nilyr_out, nslyr_out, nblyr_out, nfsd_out, & - n_algae_out, n_DOC_out, n_aero_out, & + n_algae_out, n_DOC_out, n_aero_out, n_iso_out, & n_DON_out, n_DIC_out, n_fed_out, n_fep_out, n_zaero_out, & ntrcr_out, ntrcr_o_out, nbtrcr_out, nbtrcr_sw_out) @@ -1050,6 +1075,7 @@ subroutine icepack_query_tracer_sizes(& n_fed_out , & ! n_fep_out , & ! n_zaero_out, & ! + n_iso_out , & ! n_aero_out , & ! ntrcr_out , & ! number of tracers in use ntrcr_o_out, & ! number of non-bio tracers in use @@ -1084,6 +1110,7 @@ subroutine icepack_query_tracer_sizes(& if (present(n_fep_out) ) n_fep_out = n_fep if (present(n_zaero_out) ) n_zaero_out = n_zaero if (present(n_aero_out) ) n_aero_out = n_aero + if (present(n_iso_out) ) n_iso_out = n_iso if (present(ntrcr_out) ) ntrcr_out = ntrcr if (present(ntrcr_o_out) ) ntrcr_o_out = ntrcr_o @@ -1113,6 +1140,7 @@ subroutine icepack_write_tracer_sizes(iounit) write(iounit,*) " max_fe_out =", max_fe write(iounit,*) " nmodal1_out =", nmodal1 write(iounit,*) " nmodal2_out =", nmodal2 + write(iounit,*) " max_iso_out =", max_iso write(iounit,*) " max_aero_out =", max_aero write(iounit,*) " max_nbtrcr_out=", max_nbtrcr @@ -1130,6 +1158,7 @@ subroutine icepack_write_tracer_sizes(iounit) write(iounit,*) " n_fep = ",n_fep write(iounit,*) " n_zaero = ",n_zaero write(iounit,*) " n_aero = ",n_aero + write(iounit,*) " n_iso = ",n_iso write(iounit,*) " ntrcr = ",ntrcr write(iounit,*) " ntrcr_o = ",ntrcr_o write(iounit,*) " nbtrcr = ",nbtrcr diff --git a/configuration/driver/icedrv_InitMod.F90 b/configuration/driver/icedrv_InitMod.F90 index 70d9c50b6..4d187505b 100644 --- a/configuration/driver/icedrv_InitMod.F90 +++ b/configuration/driver/icedrv_InitMod.F90 @@ -43,7 +43,7 @@ subroutine icedrv_initialize use icedrv_flux, only: init_coupler_flux, init_history_therm, & init_flux_atm_ocn use icedrv_forcing, only: init_forcing, get_forcing, get_wave_spec - use icedrv_forcing_bgc, only: get_forcing_bgc, faero_default, init_forcing_bgc + use icedrv_forcing_bgc, only: get_forcing_bgc, faero_default, fiso_default, init_forcing_bgc use icedrv_restart_shared, only: restart use icedrv_init, only: input_data, init_state, init_grid2, init_fsd use icedrv_init_column, only: init_thermo_vertical, init_shortwave, init_zbgc @@ -53,6 +53,7 @@ subroutine icedrv_initialize skl_bgc, & ! from icepack z_tracers, & ! from icepack tr_aero, & ! from icepack + tr_iso, & ! from icepack tr_zaero, & ! from icepack tr_fsd, wave_spec @@ -127,6 +128,7 @@ subroutine icedrv_initialize call icepack_query_parameters(z_tracers_out=z_tracers) call icepack_query_parameters(wave_spec_out=wave_spec) call icepack_query_tracer_flags(tr_aero_out=tr_aero) + call icepack_query_tracer_flags(tr_iso_out=tr_iso) call icepack_query_tracer_flags(tr_zaero_out=tr_zaero) call icepack_warnings_flush(nu_diag) if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & @@ -138,6 +140,7 @@ subroutine icedrv_initialize call get_forcing(istep1) ! get forcing from data arrays ! aerosols + if (tr_iso) call fiso_default ! default values ! if (tr_aero) call faero_data ! data file ! if (tr_zaero) call fzaero_data ! data file (gx1) if (tr_aero .or. tr_zaero) call faero_default ! default values diff --git a/configuration/driver/icedrv_RunMod.F90 b/configuration/driver/icedrv_RunMod.F90 index 3c03f7faa..2687f3a61 100644 --- a/configuration/driver/icedrv_RunMod.F90 +++ b/configuration/driver/icedrv_RunMod.F90 @@ -33,11 +33,11 @@ subroutine icedrv_run use icedrv_calendar, only: istep, istep1, time, dt, stop_now, calendar use icedrv_forcing, only: get_forcing, get_wave_spec - use icedrv_forcing_bgc, only: faero_default, get_forcing_bgc + use icedrv_forcing_bgc, only: faero_default, fiso_default, get_forcing_bgc use icedrv_flux, only: init_flux_atm_ocn logical (kind=log_kind) :: skl_bgc, z_tracers, tr_aero, tr_zaero, & - wave_spec, tr_fsd + wave_spec, tr_fsd, tr_iso character(len=*), parameter :: subname='(icedrv_run)' @@ -46,7 +46,7 @@ subroutine icedrv_run !-------------------------------------------------------------------- call icepack_query_tracer_flags(tr_aero_out=tr_aero, tr_zaero_out=tr_zaero, & - tr_fsd_out=tr_fsd) + tr_fsd_out=tr_fsd, tr_iso_out=tr_iso) call icepack_warnings_flush(nu_diag) if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & file=__FILE__,line= __LINE__) @@ -72,9 +72,9 @@ subroutine icedrv_run if (tr_fsd .and. wave_spec) call get_wave_spec ! wave spectrum in ice call get_forcing(istep1) ! get forcing from data arrays - ! aerosols + ! biogeochemistry forcing + if (tr_iso) call fiso_default ! default values if (tr_aero .or. tr_zaero) call faero_default ! default values - if (skl_bgc .or. z_tracers) call get_forcing_bgc ! biogeochemistry call init_flux_atm_ocn ! initialize atmosphere, ocean fluxes diff --git a/configuration/driver/icedrv_diagnostics.F90 b/configuration/driver/icedrv_diagnostics.F90 index 123ac8c56..690be91ac 100644 --- a/configuration/driver/icedrv_diagnostics.F90 +++ b/configuration/driver/icedrv_diagnostics.F90 @@ -9,6 +9,7 @@ module icedrv_diagnostics use icedrv_kinds use icedrv_constants, only: nu_diag, nu_diag_out use icedrv_domain_size, only: nx + use icedrv_domain_size, only: ncat, nfsd, n_iso use icepack_intfc, only: c0 use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted use icepack_intfc, only: icepack_query_parameters @@ -41,6 +42,9 @@ module icedrv_diagnostics pdhs , & ! change in mean snow thickness (m) pde ! change in ice and snow energy (W m-2) + real (kind=dbl_kind), dimension(nx,n_iso) :: & + pdiso ! change in mean isotope concentration + !======================================================================= contains @@ -56,10 +60,9 @@ module icedrv_diagnostics subroutine runtime_diags (dt) use icedrv_arrays_column, only: floe_rad_c - use icedrv_domain_size, only: ncat, nfsd use icedrv_flux, only: evap, fsnow, frazil use icedrv_flux, only: fswabs, flw, flwout, fsens, fsurf, flat - use icedrv_flux, only: frain + use icedrv_flux, only: frain, fiso_evap, fiso_ocn, fiso_atm use icedrv_flux, only: Tair, Qa, fsw, fcondtop use icedrv_flux, only: meltt, meltb, meltl, snoice use icedrv_flux, only: dsnow, congel, sst, sss, Tf, fhocn @@ -74,7 +77,7 @@ subroutine runtime_diags (dt) n, nc, k logical (kind=log_kind) :: & - calc_Tsfc, tr_fsd + calc_Tsfc, tr_fsd, tr_iso ! fields at diagnostic points real (kind=dbl_kind) :: & @@ -83,13 +86,13 @@ subroutine runtime_diags (dt) pevap, pfhocn, fsdavg real (kind=dbl_kind), dimension (nx) :: & - work1, work2 + work1, work2, work3 real (kind=dbl_kind) :: & Tffresh, rhos, rhow, rhoi logical (kind=log_kind) :: tr_brine - integer (kind=int_kind) :: nt_fbri, nt_Tsfc, nt_fsd + integer (kind=int_kind) :: nt_fbri, nt_Tsfc, nt_fsd, nt_isosno, nt_isoice character(len=*), parameter :: subname='(runtime_diags)' @@ -98,9 +101,10 @@ subroutine runtime_diags (dt) !----------------------------------------------------------------- call icepack_query_parameters(calc_Tsfc_out=calc_Tsfc) - call icepack_query_tracer_flags(tr_brine_out=tr_brine,tr_fsd_out=tr_fsd) + call icepack_query_tracer_flags(tr_brine_out=tr_brine, & + tr_fsd_out=tr_fsd,tr_iso_out=tr_iso) call icepack_query_tracer_indices(nt_fbri_out=nt_fbri, nt_Tsfc_out=nt_Tsfc,& - nt_fsd_out=nt_fsd) + nt_fsd_out=nt_fsd, nt_isosno_out=nt_isosno, nt_isoice_out=nt_isoice) call icepack_query_parameters(Tffresh_out=Tffresh, rhos_out=rhos, & rhow_out=rhow, rhoi_out=rhoi) call icepack_warnings_flush(nu_diag) @@ -148,6 +152,14 @@ subroutine runtime_diags (dt) pde(n) =-(work1(n)- pde(n))/dt ! ice/snow energy change pfhocn = -fhocn(n) ! ocean heat used by ice + work3(:) = c0 + + do k = 1, n_iso + work3 (n) = (trcr(n,nt_isosno+k-1)*vsno(n) & + +trcr(n,nt_isoice+k-1)*vice(n)) + pdiso(n,k) = work3(n) - pdiso(n,k) + enddo + !----------------------------------------------------------------- ! start spewing !----------------------------------------------------------------- @@ -202,6 +214,15 @@ subroutine runtime_diags (dt) write(nu_diag_out+n-1,900) 'freezing temp (C) = ',Tf(n) ! freezing temperature write(nu_diag_out+n-1,900) 'heat used (W/m^2) = ',pfhocn ! ocean heat used by ice + if (tr_iso) then + do k = 1, n_iso + write(nu_diag_out+n-1,900) 'isotopic precip = ',fiso_atm(n,k)*dt + write(nu_diag_out+n-1,900) 'isotopic evap/cond = ',fiso_evap(n,k)*dt + write(nu_diag_out+n-1,900) 'isotopic loss to ocn = ',fiso_ocn(n,k)*dt + write(nu_diag_out+n-1,900) 'isotopic gain/loss = ',(fiso_atm(n,k)-fiso_ocn(n,k)+fiso_evap(n,k))*dt + write(nu_diag_out+n-1,900) 'isotopic conc chg = ',pdiso(n,k) + enddo + endif end do 899 format (43x,a24) 900 format (a25,2x,f24.17) @@ -216,20 +237,26 @@ end subroutine runtime_diags subroutine init_mass_diags - use icedrv_domain_size, only: nx - use icedrv_state, only: vice, vsno + use icedrv_state, only: vice, vsno, trcr - integer (kind=int_kind) :: i + integer (kind=int_kind) :: i, k, nt_isosno, nt_isoice real (kind=dbl_kind), dimension (nx) :: work1 character(len=*), parameter :: subname='(init_mass_diags)' + call icepack_query_tracer_indices(nt_isosno_out=nt_isosno) + call icepack_query_tracer_indices(nt_isoice_out=nt_isoice) + call total_energy (work1) do i = 1, nx pdhi(i) = vice (i) pdhs(i) = vsno (i) pde (i) = work1(i) + do k = 1, n_iso + pdiso(i,k) = (trcr(i,nt_isosno+k-1)*vsno(i) & + +trcr(i,nt_isoice+k-1)*vice(i)) + enddo enddo end subroutine init_mass_diags @@ -242,7 +269,7 @@ end subroutine init_mass_diags subroutine total_energy (work) - use icedrv_domain_size, only: ncat, nilyr, nslyr, nx + use icedrv_domain_size, only: ncat, nilyr, nslyr use icedrv_state, only: vicen, vsnon, trcrn real (kind=dbl_kind), dimension (nx), intent(out) :: & @@ -303,7 +330,7 @@ end subroutine total_energy subroutine total_salt (work) - use icedrv_domain_size, only: ncat, nilyr, nx + use icedrv_domain_size, only: ncat, nilyr use icedrv_state, only: vicen, trcrn real (kind=dbl_kind), dimension (nx), & @@ -390,7 +417,7 @@ end subroutine icedrv_diagnostics_debug subroutine print_state(plabel,i) use icedrv_calendar, only: istep1, time - use icedrv_domain_size, only: ncat, nilyr, nslyr, nfsd + use icedrv_domain_size, only: nilyr, nslyr use icedrv_state, only: aice0, aicen, vicen, vsnon, uvel, vvel, trcrn use icedrv_flux, only: uatm, vatm, potT, Tair, Qa, flw, frain, fsnow use icedrv_flux, only: fsens, flat, evap, flwout diff --git a/configuration/driver/icedrv_domain_size.F90 b/configuration/driver/icedrv_domain_size.F90 index 37b825e27..7709acbd9 100644 --- a/configuration/driver/icedrv_domain_size.F90 +++ b/configuration/driver/icedrv_domain_size.F90 @@ -19,6 +19,7 @@ module icedrv_domain_size ncat = NICECAT , & ! number of categories nilyr = NICELYR , & ! number of ice layers per category nslyr = NSNWLYR , & ! number of snow layers per category + n_iso = NTRISO , & ! number of aerosols in use n_aero = NTRAERO , & ! number of aerosols in use n_zaero = TRZAERO , & ! number of z aerosols in use n_algae = TRALG , & ! number of algae in use @@ -47,6 +48,7 @@ module icedrv_domain_size + TRFY & ! first-year area + TRLVL*2 & ! level/deformed ice + TRPND*3 & ! ponds + + n_iso*2 & ! number of isotopes (in ice and snow) + n_aero*4 & ! number of aerosols * 4 aero layers + TRBRI & ! brine height + TRBGCS*n_bgc & ! skeletal layer BGC diff --git a/configuration/driver/icedrv_flux.F90 b/configuration/driver/icedrv_flux.F90 index 0abecd448..731c5e18e 100644 --- a/configuration/driver/icedrv_flux.F90 +++ b/configuration/driver/icedrv_flux.F90 @@ -12,7 +12,8 @@ module icedrv_flux use icedrv_domain_size, only: ncat, nilyr, nx use icedrv_constants, only: c0, c1, c5, c10, c20, c180 use icedrv_constants, only: nu_diag - use icepack_intfc, only: icepack_max_aero, icepack_max_nbtrcr, icepack_max_fe + use icepack_intfc, only: icepack_max_iso, icepack_max_aero + use icepack_intfc, only: icepack_max_nbtrcr, icepack_max_fe use icepack_intfc, only: icepack_max_algae, icepack_max_doc, icepack_max_don use icepack_intfc, only: icepack_max_dic use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted @@ -129,8 +130,11 @@ module icedrv_flux qdp , & ! deep ocean heat flux (W/m^2), negative upward hmix ! mixed layer depth (m) - ! out to atmosphere (if calc_Tsfc) - ! note Tsfc is in ice_state.F + ! water isotopes + real (kind=dbl_kind), dimension (nx), public :: & + HDO_ocn , & ! seawater concentration of HDO (kg/kg) + H2_16O_ocn , & ! seawater concentration of H2_16O (kg/kg) + H2_18O_ocn ! seawater concentration of H2_18O (kg/kg) real (kind=dbl_kind), dimension (nx), public :: & fsens , & ! sensible heat flux (W/m^2) @@ -176,6 +180,10 @@ module icedrv_flux fhocn , & ! net heat flux to ocean (W/m^2) fswthru ! shortwave penetrating to ocean (W/m^2) + real (kind=dbl_kind), dimension (nx,icepack_max_iso), public :: & + Qa_iso , & ! isotope specific humidity (kg/kg) + Qref_iso ! 2m atm reference isotope spec humidity (kg/kg) + ! internal real (kind=dbl_kind), & @@ -282,10 +290,15 @@ module icedrv_flux ! in from atmosphere - real (kind=dbl_kind), & !coupling variable for both tr_aero and tr_zaero + real (kind=dbl_kind), & ! coupling variable for both tr_aero and tr_zaero dimension (nx,icepack_max_aero), public :: & faero_atm ! aerosol deposition rate (kg/m^2 s) + real (kind=dbl_kind), & ! coupling variable for tr_iso + dimension (nx,icepack_max_iso), public :: & + fiso_atm , & ! isotope deposition rate (kg/m^2 s) + fiso_evap ! isotope evaporation rate (kg/m^2 s) + real (kind=dbl_kind), & dimension (nx,icepack_max_nbtrcr), public :: & flux_bio_atm ! all bio fluxes to ice from atmosphere @@ -296,6 +309,10 @@ module icedrv_flux dimension (nx,icepack_max_aero), public :: & faero_ocn ! aerosol flux to ocean (kg/m^2/s) + real (kind=dbl_kind), & + dimension (nx,icepack_max_iso), public :: & + fiso_ocn ! isotope flux to ocean (kg/m^2/s) + ! out to ocean real (kind=dbl_kind), & @@ -459,6 +476,8 @@ subroutine init_coupler_flux fsensn_f (:,:) = c0 ! sensible heat flux (W/m^2) endif ! l_winter + fiso_atm (:,:) = c0 ! isotope deposition rate (kg/m2/s) + fiso_evap (:,:) = c0 ! isotope evaporation rate (kg/m2/s) faero_atm (:,:) = c0 ! aerosol deposition rate (kg/m2/s) flux_bio_atm (:,:) = c0 ! zaero and bio deposition rate (kg/m2/s) @@ -473,6 +492,11 @@ subroutine init_coupler_flux sst (:) = -1.8_dbl_kind ! sea surface temperature (C) sstdat (:) = sst(:) ! sea surface temperature (C) + ! water isotopes from ocean + HDO_ocn (:) = c0 + H2_16O_ocn(:) = c0 + H2_18O_ocn(:) = c0 + do i = 1, nx Tf (i) = icepack_liquidus_temperature(sss(i)) ! freezing temp (C) enddo @@ -570,6 +594,7 @@ subroutine init_flux_atm_ocn Tref (:) = c0 Qref (:) = c0 Uref (:) = c0 + fiso_evap(:,:) = c0 ! isotope evaporation rate (kg/m2/s) !----------------------------------------------------------------- ! fluxes sent to ocean @@ -579,6 +604,7 @@ subroutine init_flux_atm_ocn fsalt (:) = c0 fhocn (:) = c0 fswthru (:) = c0 + fiso_ocn (:,:) = c0 faero_ocn(:,:) = c0 end subroutine init_flux_atm_ocn diff --git a/configuration/driver/icedrv_forcing_bgc.F90 b/configuration/driver/icedrv_forcing_bgc.F90 index 650919417..22f7bc4e1 100644 --- a/configuration/driver/icedrv_forcing_bgc.F90 +++ b/configuration/driver/icedrv_forcing_bgc.F90 @@ -19,7 +19,7 @@ module icedrv_forcing_bgc implicit none private - public :: get_forcing_bgc, faero_default, init_forcing_bgc + public :: get_forcing_bgc, faero_default, fiso_default, init_forcing_bgc real (kind=dbl_kind), dimension(365) :: & ! hardwired for now sil_data, nit_data @@ -165,6 +165,23 @@ subroutine faero_default end subroutine faero_default +!======================================================================= + +! constant values for atmospheric water isotopes +! +! authors: Elizabeth Hunke, LANL + + subroutine fiso_default + + use icedrv_flux, only: fiso_atm + character(len=*), parameter :: subname='(fiso_default)' + + fiso_atm(:,1) = 1.e-12_dbl_kind ! kg/m^2 s + fiso_atm(:,2) = 1.e-13_dbl_kind + fiso_atm(:,3) = 1.e-14_dbl_kind + + end subroutine fiso_default + !======================================================================= end module icedrv_forcing_bgc diff --git a/configuration/driver/icedrv_init.F90 b/configuration/driver/icedrv_init.F90 index 24f56ecfb..3964deace 100644 --- a/configuration/driver/icedrv_init.F90 +++ b/configuration/driver/icedrv_init.F90 @@ -57,7 +57,8 @@ module icedrv_init subroutine input_data use icedrv_diagnostics, only: diag_file, nx_names - use icedrv_domain_size, only: nilyr, nslyr, nblyr, max_ntrcr, ncat, n_aero, nfsd + use icedrv_domain_size, only: nilyr, nslyr, nblyr, max_ntrcr, ncat + use icedrv_domain_size, only: n_iso, n_aero, nfsd use icedrv_calendar, only: year_init, istep0 use icedrv_calendar, only: dumpfreq, diagfreq, dump_last use icedrv_calendar, only: npt, dt, ndtd, days_per_year, use_leap_years @@ -98,11 +99,12 @@ subroutine input_data logical (kind=log_kind) :: calc_Tsfc, formdrag, highfreq, calc_strair integer (kind=int_kind) :: ntrcr - logical (kind=log_kind) :: tr_iage, tr_FY, tr_lvl, tr_pond, tr_aero, tr_fsd + logical (kind=log_kind) :: tr_iage, tr_FY, tr_lvl, tr_pond + logical (kind=log_kind) :: tr_iso, tr_aero, tr_fsd logical (kind=log_kind) :: tr_pond_cesm, tr_pond_lvl, tr_pond_topo, wave_spec integer (kind=int_kind) :: nt_Tsfc, nt_sice, nt_qice, nt_qsno, nt_iage, nt_FY integer (kind=int_kind) :: nt_alvl, nt_vlvl, nt_apnd, nt_hpnd, nt_ipnd, & - nt_aero, nt_fsd + nt_aero, nt_fsd, nt_isosno, nt_isoice real (kind=real_kind) :: rpcesm, rplvl, rptopo real (kind=dbl_kind) :: Cf, puny @@ -162,7 +164,8 @@ subroutine input_data tr_pond_lvl, & tr_pond_topo, & tr_aero, & - tr_fsd + tr_fsd, & + tr_iso !----------------------------------------------------------------- ! query Icepack values @@ -252,6 +255,7 @@ subroutine input_data tr_pond_topo = .false. ! explicit melt ponds (topographic) tr_aero = .false. ! aerosols tr_fsd = .false. ! floe size distribution + tr_iso = .false. ! isotopes !----------------------------------------------------------------- ! read from input file @@ -383,6 +387,13 @@ subroutine input_data shortwave = 'dEdd' endif + if (tr_iso .and. n_iso==0) then + write (nu_diag,*) 'WARNING: isotopes activated but' + write (nu_diag,*) 'WARNING: not allocated in tracer array.' + write (nu_diag,*) 'WARNING: Activate in compilation script.' + call icedrv_system_abort(file=__FILE__,line=__LINE__) + endif + if (tr_aero .and. n_aero==0) then write (nu_diag,*) 'WARNING: aerosols activated but' write (nu_diag,*) 'WARNING: not allocated in tracer array.' @@ -649,6 +660,15 @@ subroutine input_data ntrcr = ntrcr + nfsd end if + nt_isosno = max_ntrcr + nt_isoice = max_ntrcr + if (tr_iso) then ! isotopes + ntrcr = ntrcr + n_iso ! n_iso species in snow + nt_isosno = ntrcr + ntrcr = ntrcr + n_iso ! n_iso species in ice + nt_isoice = ntrcr + end if + nt_aero = max_ntrcr - 4*n_aero if (tr_aero) then nt_aero = ntrcr + 1 @@ -674,6 +694,7 @@ subroutine input_data write(nu_diag,1020) 'nslyr = ', nslyr write(nu_diag,1020) 'nblyr = ', nblyr write(nu_diag,1020) 'nfsd = ', nfsd + write(nu_diag,1020) 'n_iso = ', n_iso write(nu_diag,1020) 'n_aero = ', n_aero write(nu_diag,*)' ' write(nu_diag,1020) 'nx = ', nx @@ -737,9 +758,10 @@ subroutine input_data wave_spec_type_in=wave_spec_type, wave_spec_in=wave_spec) call icepack_init_tracer_sizes(ntrcr_in=ntrcr, & ncat_in=ncat, nilyr_in=nilyr, nslyr_in=nslyr, nblyr_in=nblyr, & - nfsd_in=nfsd, n_aero_in=n_aero) + nfsd_in=nfsd, n_iso_in=n_iso, n_aero_in=n_aero) call icepack_init_tracer_flags(tr_iage_in=tr_iage, & tr_FY_in=tr_FY, tr_lvl_in=tr_lvl, tr_aero_in=tr_aero, & + tr_iso_in=tr_iso, & tr_pond_in=tr_pond, tr_pond_cesm_in=tr_pond_cesm, & tr_pond_lvl_in=tr_pond_lvl, & tr_pond_topo_in=tr_pond_topo, tr_fsd_in=tr_fsd) @@ -748,7 +770,8 @@ subroutine input_data nt_qsno_in=nt_qsno, nt_iage_in=nt_iage, & nt_fy_in=nt_fy, nt_alvl_in=nt_alvl, nt_vlvl_in=nt_vlvl, & nt_apnd_in=nt_apnd, nt_hpnd_in=nt_hpnd, nt_ipnd_in=nt_ipnd, & - nt_aero_in=nt_aero, nt_fsd_in=nt_fsd) + nt_aero_in=nt_aero, nt_fsd_in=nt_fsd, & + nt_isosno_in=nt_isosno, nt_isoice_in=nt_isoice) call icepack_warnings_flush(nu_diag) if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & @@ -815,7 +838,8 @@ end subroutine init_grid2 subroutine init_state use icepack_intfc, only: icepack_aggregate - use icedrv_domain_size, only: ncat, nilyr, nslyr, nblyr, max_ntrcr, n_aero, nfsd + use icedrv_domain_size, only: ncat, nilyr, nslyr, nblyr, max_ntrcr + use icedrv_domain_size, only: n_iso, n_aero, nfsd use icedrv_flux, only: sst, Tf, Tair, salinz, Tmltz use icedrv_state, only: trcr_depend, aicen, trcrn, vicen, vsnon use icedrv_state, only: aice0, aice, vice, vsno, trcr, aice_init @@ -830,11 +854,11 @@ subroutine init_state heat_capacity ! from icepack integer (kind=int_kind) :: ntrcr - logical (kind=log_kind) :: tr_iage, tr_FY, tr_lvl, tr_aero, tr_fsd + logical (kind=log_kind) :: tr_iage, tr_FY, tr_lvl, tr_aero, tr_fsd, tr_iso logical (kind=log_kind) :: tr_pond_cesm, tr_pond_lvl, tr_pond_topo integer (kind=int_kind) :: nt_Tsfc, nt_sice, nt_qice, nt_qsno, nt_iage, nt_fy integer (kind=int_kind) :: nt_alvl, nt_vlvl, nt_apnd, nt_hpnd, & - nt_ipnd, nt_aero, nt_fsd + nt_ipnd, nt_aero, nt_fsd, nt_isosno, nt_isoice character(len=*), parameter :: subname='(init_state)' @@ -846,6 +870,7 @@ subroutine init_state call icepack_query_tracer_sizes(ntrcr_out=ntrcr) call icepack_query_tracer_flags(tr_iage_out=tr_iage, & tr_FY_out=tr_FY, tr_lvl_out=tr_lvl, tr_aero_out=tr_aero, & + tr_iso_out=tr_iso, & tr_pond_cesm_out=tr_pond_cesm, tr_pond_lvl_out=tr_pond_lvl, & tr_pond_topo_out=tr_pond_topo, tr_fsd_out=tr_fsd) call icepack_query_tracer_indices(nt_Tsfc_out=nt_Tsfc, & @@ -853,7 +878,9 @@ subroutine init_state nt_qsno_out=nt_qsno, nt_iage_out=nt_iage, nt_fy_out=nt_fy, & nt_alvl_out=nt_alvl, nt_vlvl_out=nt_vlvl, & nt_apnd_out=nt_apnd, nt_hpnd_out=nt_hpnd, & - nt_ipnd_out=nt_ipnd, nt_aero_out=nt_aero, nt_fsd_out=nt_fsd) + nt_ipnd_out=nt_ipnd, & + nt_isosno_out=nt_isosno, nt_isoice_out=nt_isoice, & + nt_aero_out=nt_aero, nt_fsd_out=nt_fsd) call icepack_warnings_flush(nu_diag) if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & file=__FILE__,line= __LINE__) @@ -928,6 +955,12 @@ subroutine init_state trcr_depend(nt_fsd + it - 1) = 0 ! area-weighted floe size distribution enddo endif + if (tr_iso) then ! isotopes + do it = 1, n_iso + trcr_depend(nt_isosno) = 2 ! snow + trcr_depend(nt_isoice) = 1 ! ice + enddo + endif if (tr_aero) then ! volume-weighted aerosols do it = 1, n_aero trcr_depend(nt_aero+(it-1)*4 ) = 2 ! snow diff --git a/configuration/driver/icedrv_restart.F90 b/configuration/driver/icedrv_restart.F90 index 0110df0f9..375174b11 100644 --- a/configuration/driver/icedrv_restart.F90 +++ b/configuration/driver/icedrv_restart.F90 @@ -23,6 +23,7 @@ module icedrv_restart write_restart_pond_cesm, read_restart_pond_cesm, & write_restart_pond_lvl, read_restart_pond_lvl, & write_restart_fsd, read_restart_fsd, & + write_restart_iso, read_restart_iso, & write_restart_aero, read_restart_aero public :: dumpfile, restartfile, final_restart, & @@ -61,7 +62,7 @@ subroutine dumpfile nt_Tsfc, nt_sice, nt_qice, nt_qsno logical (kind=log_kind) :: & - tr_iage, tr_FY, tr_lvl, tr_aero, tr_brine, & + tr_iage, tr_FY, tr_lvl, tr_iso, tr_aero, tr_brine, & tr_pond_topo, tr_pond_cesm, tr_pond_lvl, tr_fsd ! solve_zsal, skl_bgc, z_tracers @@ -79,7 +80,8 @@ subroutine dumpfile call icepack_query_tracer_indices(nt_Tsfc_out=nt_Tsfc, nt_sice_out=nt_sice, & nt_qice_out=nt_qice, nt_qsno_out=nt_qsno) call icepack_query_tracer_flags(tr_iage_out=tr_iage, tr_FY_out=tr_FY, & - tr_lvl_out=tr_lvl, tr_aero_out=tr_aero, tr_brine_out=tr_brine, & + tr_lvl_out=tr_lvl, tr_aero_out=tr_aero, tr_iso_out=tr_iso, & + tr_brine_out=tr_brine, & tr_pond_topo_out=tr_pond_topo, tr_pond_cesm_out=tr_pond_cesm, & tr_pond_lvl_out=tr_pond_lvl,tr_fsd_out=tr_fsd) ! call icepack_query_parameters(solve_zsal_out=solve_zsal, & @@ -136,7 +138,8 @@ subroutine dumpfile if (tr_pond_cesm) call write_restart_pond_cesm() ! CESM melt ponds if (tr_pond_lvl) call write_restart_pond_lvl() ! level-ice melt ponds if (tr_pond_topo) call write_restart_pond_topo() ! topographic melt ponds - if (tr_aero) call write_restart_aero() ! ice aerosol + if (tr_iso) call write_restart_iso() ! ice isotopes + if (tr_aero) call write_restart_aero() ! ice aerosols if (tr_brine) call write_restart_hbrine() ! brine height if (tr_fsd) call write_restart_fsd() ! floe size distribution ! called in icedrv_RunMod.F90 to prevent circular dependencies @@ -175,7 +178,7 @@ subroutine restartfile (ice_ic) nt_Tsfc, nt_sice, nt_qice, nt_qsno logical (kind=log_kind) :: & - tr_iage, tr_FY, tr_lvl, tr_aero, tr_brine, & + tr_iage, tr_FY, tr_lvl, tr_iso, tr_aero, tr_brine, & tr_pond_topo, tr_pond_cesm, tr_pond_lvl, tr_fsd character(len=char_len_long) :: filename @@ -196,7 +199,8 @@ subroutine restartfile (ice_ic) call icepack_query_tracer_indices(nt_Tsfc_out=nt_Tsfc, nt_sice_out=nt_sice, & nt_qice_out=nt_qice, nt_qsno_out=nt_qsno) call icepack_query_tracer_flags(tr_iage_out=tr_iage, tr_FY_out=tr_FY, & - tr_lvl_out=tr_lvl, tr_aero_out=tr_aero, tr_brine_out=tr_brine, & + tr_lvl_out=tr_lvl, tr_aero_out=tr_aero, tr_iso_out=tr_iso, & + tr_brine_out=tr_brine, & tr_pond_topo_out=tr_pond_topo, tr_pond_cesm_out=tr_pond_cesm, & tr_pond_lvl_out=tr_pond_lvl,tr_fsd_out=tr_fsd) call icepack_warnings_flush(nu_diag) @@ -261,7 +265,8 @@ subroutine restartfile (ice_ic) if (tr_pond_cesm) call read_restart_pond_cesm() ! CESM melt ponds if (tr_pond_lvl) call read_restart_pond_lvl() ! level-ice melt ponds if (tr_pond_topo) call read_restart_pond_topo() ! topographic melt ponds - if (tr_aero) call read_restart_aero() ! ice aerosol + if (tr_iso) call read_restart_iso() ! ice isotopes + if (tr_aero) call read_restart_aero() ! ice aerosols if (tr_brine) call read_restart_hbrine ! brine height if (tr_fsd) call read_restart_fsd() ! floe size distribution !----------------------------------------------------------------- @@ -826,6 +831,80 @@ subroutine read_restart_aero() end subroutine read_restart_aero +!======================================================================= + +! Dumps all values needed for restarting +! +! authors Elizabeth Hunke, LANL +! David Bailey, NCAR +! Marika Holland, NCAR + + subroutine write_restart_iso() + + use icedrv_domain_size, only: n_iso + use icedrv_state, only: trcrn + use icedrv_domain_size, only: ncat + + ! local variables + + integer (kind=int_kind) :: & + k ! loop indices + integer (kind=int_kind) :: nt_isosno, nt_isoice + character(len=*), parameter :: subname='(write_restart_iso)' + + call icepack_query_tracer_indices(nt_isosno_out=nt_isosno) + call icepack_query_tracer_indices(nt_isoice_out=nt_isoice) + call icepack_warnings_flush(nu_diag) + if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & + file=__FILE__,line= __LINE__) + + write(nu_diag,*) 'write_restart_iso (isotopes)' + + do k = 1, n_iso + call write_restart_field(nu_dump, trcrn(:,nt_isosno+(k-1),:), ncat) + call write_restart_field(nu_dump, trcrn(:,nt_isoice+(k-1),:), ncat) + enddo + + end subroutine write_restart_iso + +!======================================================================= + +! Reads all values needed for an ice isotope restart +! +! authors Elizabeth Hunke, LANL +! David Bailey, NCAR +! Marika Holland, NCAR + + subroutine read_restart_iso() + + use icedrv_domain_size, only: n_iso + use icedrv_state, only: trcrn + use icedrv_domain_size, only: ncat + + ! local variables + + integer (kind=int_kind) :: & + k ! loop indices + integer (kind=int_kind) :: nt_isosno, nt_isoice + character(len=*), parameter :: subname='(read_restart_iso)' + + !----------------------------------------------------------------- + + call icepack_query_tracer_indices(nt_isosno_out=nt_isosno) + call icepack_query_tracer_indices(nt_isoice_out=nt_isoice) + call icepack_warnings_flush(nu_diag) + if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & + file=__FILE__,line= __LINE__) + + write(nu_diag,*) 'read_restart_iso (isotopes)' + + do k = 1, n_iso + call read_restart_field(nu_dump, trcrn(:,nt_isosno+(k-1),:), ncat) + call read_restart_field(nu_dump, trcrn(:,nt_isoice+(k-1),:), ncat) + enddo + + end subroutine read_restart_iso + !======================================================================= subroutine write_restart_hbrine() diff --git a/configuration/driver/icedrv_step.F90 b/configuration/driver/icedrv_step.F90 index 787e25c26..a51a79301 100644 --- a/configuration/driver/icedrv_step.F90 +++ b/configuration/driver/icedrv_step.F90 @@ -102,19 +102,22 @@ subroutine step_therm1 (dt) use icedrv_arrays_column, only: hkeel, dkeel, lfloe, dfloe use icedrv_arrays_column, only: fswsfcn, fswintn, fswthrun, Sswabsn, Iswabsn use icedrv_calendar, only: yday - use icedrv_domain_size, only: ncat, nilyr, nslyr, n_aero, nx + use icedrv_domain_size, only: ncat, nilyr, nslyr, n_aero, n_iso, nx use icedrv_flux, only: frzmlt, sst, Tf, strocnxT, strocnyT, rside, fside, & fbot, Tbot, Tsnice use icedrv_flux, only: meltsn, melttn, meltbn, congeln, snoicen, uatm, vatm - use icedrv_flux, only: wind, rhoa, potT, Qa, zlvl, strax, stray, flatn + use icedrv_flux, only: wind, rhoa, potT, Qa, Qa_iso, zlvl, strax, stray, flatn use icedrv_flux, only: fsensn, fsurfn, fcondtopn, fcondbotn use icedrv_flux, only: flw, fsnow, fpond, sss, mlt_onset, frz_onset use icedrv_flux, only: frain, Tair, strairxT, strairyT, fsurf use icedrv_flux, only: fcondtop, fcondbot, fsens, fresh, fsalt, fhocn - use icedrv_flux, only: flat, fswabs, flwout, evap, evaps, evapi, Tref, Qref, Uref + use icedrv_flux, only: flat, fswabs, flwout, evap, evaps, evapi + use icedrv_flux, only: Tref, Qref, Qref_iso, Uref use icedrv_flux, only: fswthru, meltt, melts, meltb, congel, snoice use icedrv_flux, only: flatn_f, fsensn_f, fsurfn_f, fcondtopn_f use icedrv_flux, only: dsnown, faero_atm, faero_ocn + use icedrv_flux, only: fiso_atm, fiso_ocn, fiso_evap + use icedrv_flux, only: HDO_ocn, H2_16O_ocn, H2_18O_ocn use icedrv_init, only: lmask_n, lmask_s use icedrv_state, only: aice, aicen, aice_init, aicen_init, vicen_init use icedrv_state, only: vice, vicen, vsno, vsnon, trcrn, uvel, vvel, vsnon_init @@ -137,15 +140,19 @@ subroutine step_therm1 (dt) integer (kind=int_kind) :: & ntrcr, nt_apnd, nt_hpnd, nt_ipnd, nt_alvl, nt_vlvl, nt_Tsfc, & - nt_iage, nt_FY, nt_qice, nt_sice, nt_aero, nt_qsno + nt_iage, nt_FY, nt_qice, nt_sice, nt_qsno, & + nt_aero, nt_isosno, nt_isoice logical (kind=log_kind) :: & - tr_iage, tr_FY, tr_aero, tr_pond, tr_pond_cesm, & + tr_iage, tr_FY, tr_aero, tr_iso, tr_pond, tr_pond_cesm, & tr_pond_lvl, tr_pond_topo, calc_Tsfc real (kind=dbl_kind), dimension(n_aero,2,ncat) :: & aerosno, aeroice ! kg/m^2 + real (kind=dbl_kind), dimension(n_iso,ncat) :: & + isosno, isoice ! kg/m^2 + real (kind=dbl_kind) :: & puny @@ -168,19 +175,21 @@ subroutine step_therm1 (dt) file=__FILE__,line= __LINE__) call icepack_query_tracer_flags( & - tr_iage_out=tr_iage, tr_FY_out=tr_FY, & - tr_aero_out=tr_aero, tr_pond_out=tr_pond, tr_pond_cesm_out=tr_pond_cesm, & - tr_pond_lvl_out=tr_pond_lvl, tr_pond_topo_out=tr_pond_topo) + tr_iage_out=tr_iage, tr_FY_out=tr_FY, & + tr_aero_out=tr_aero, tr_iso_out=tr_iso, & + tr_pond_out=tr_pond, tr_pond_cesm_out=tr_pond_cesm, & + tr_pond_lvl_out=tr_pond_lvl, tr_pond_topo_out=tr_pond_topo) call icepack_warnings_flush(nu_diag) if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & file=__FILE__,line= __LINE__) call icepack_query_tracer_indices( & - nt_apnd_out=nt_apnd, nt_hpnd_out=nt_hpnd, nt_ipnd_out=nt_ipnd, & - nt_alvl_out=nt_alvl, nt_vlvl_out=nt_vlvl, nt_Tsfc_out=nt_Tsfc, & - nt_iage_out=nt_iage, nt_FY_out=nt_FY, & - nt_qice_out=nt_qice, nt_sice_out=nt_sice, & - nt_aero_out=nt_aero, nt_qsno_out=nt_qsno) + nt_apnd_out=nt_apnd, nt_hpnd_out=nt_hpnd, nt_ipnd_out=nt_ipnd, & + nt_alvl_out=nt_alvl, nt_vlvl_out=nt_vlvl, nt_Tsfc_out=nt_Tsfc, & + nt_iage_out=nt_iage, nt_FY_out=nt_FY, & + nt_qice_out=nt_qice, nt_sice_out=nt_sice, & + nt_aero_out=nt_aero, nt_qsno_out=nt_qsno, & + nt_isosno_out=nt_isosno, nt_isoice_out=nt_isoice) call icepack_warnings_flush(nu_diag) if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & file=__FILE__,line= __LINE__) @@ -190,6 +199,8 @@ subroutine step_therm1 (dt) prescribed_ice = .false. aerosno(:,:,:) = c0 aeroice(:,:,:) = c0 + isosno (:,:) = c0 + isoice (:,:) = c0 do i = 1, nx @@ -223,7 +234,17 @@ subroutine step_therm1 (dt) enddo enddo endif ! tr_aero - + + if (tr_iso) then + ! trcrn(nt_isosno/ice) has units kg/m^3 + do n=1,ncat + do k=1,n_iso + isosno(k,n) = trcrn(i,nt_isosno+k-1,n) * vsnon_init(i,n) + isoice(k,n) = trcrn(i,nt_isoice+k-1,n) * vicen_init(i,n) + enddo + enddo + endif ! tr_iso + call icepack_step_therm1(dt=dt, ncat=ncat, nilyr=nilyr, nslyr=nslyr, & aicen_init = aicen_init(i,:), & vicen_init = vicen_init(i,:), & @@ -245,11 +266,15 @@ subroutine step_therm1 (dt) FY = trcrn(i,nt_FY,:), & aerosno = aerosno(:,:,:), & aeroice = aeroice(:,:,:), & + isosno = isosno(:,:), & + isoice = isoice(:,:), & uatm = uatm(i), vatm = vatm(i), & wind = wind(i), zlvl = zlvl(i), & Qa = Qa(i), rhoa = rhoa(i), & + Qa_iso = Qa_iso(i,:), & Tair = Tair(i), Tref = Tref(i), & Qref = Qref(i), Uref = Uref(i), & + Qref_iso = Qref_iso(i,:), & Cdn_atm_ratio = Cdn_atm_ratio(i),& Cdn_ocn = Cdn_ocn(i), & Cdn_ocn_skin = Cdn_ocn_skin(i), & @@ -289,6 +314,12 @@ subroutine step_therm1 (dt) fcondtopn_f = fcondtopn_f(i,:), & faero_atm = faero_atm(i,1:n_aero), & faero_ocn = faero_ocn(i,1:n_aero), & + fiso_atm = fiso_atm (i,:), & + fiso_ocn = fiso_ocn (i,:), & + fiso_evap = fiso_evap (i,:), & + HDO_ocn = HDO_ocn (i), & + H2_16O_ocn = H2_16O_ocn (i), & + H2_18O_ocn = H2_18O_ocn (i), & Sswabsn = Sswabsn(i,:,:),Iswabsn = Iswabsn(i,:,:), & evap = evap(i), evaps = evaps(i), evapi = evapi(i), & dhsn = dhsn(i,:), ffracn = ffracn(i,:), & @@ -317,6 +348,17 @@ subroutine step_therm1 (dt) enddo endif ! tr_aero + if (tr_iso) then + do n = 1, ncat + if (vicen(i,n) > puny) isoice(:,n) = isoice(:,n)/vicen(i,n) + if (vsnon(i,n) > puny) isosno(:,n) = isosno(:,n)/vsnon(i,n) + do k = 1, n_iso + trcrn(i,nt_isosno+k-1,n) = isosno(k,n) + trcrn(i,nt_isoice+k-1,n) = isoice(k,n) + enddo + enddo + endif ! tr_iso + enddo ! i call icepack_warnings_flush(nu_diag) if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & @@ -344,7 +386,8 @@ subroutine step_therm2 (dt) nltrcr, nx, nfsd use icedrv_flux, only: fresh, frain, fpond, frzmlt, frazil, frz_onset use icedrv_flux, only: update_ocn_f, fsalt, Tf, sss, salinz, fhocn, rside, fside - use icedrv_flux, only: meltl, frazil_diag, flux_bio, faero_ocn + use icedrv_flux, only: meltl, frazil_diag, flux_bio, faero_ocn, fiso_ocn + use icedrv_flux, only: HDO_ocn, H2_16O_ocn, H2_18O_ocn use icedrv_init, only: tmask use icedrv_state, only: aice, aicen, aice0, trcr_depend use icedrv_state, only: aicen_init, vicen_init, trcrn, vicen, vsnon @@ -419,6 +462,10 @@ subroutine step_therm2 (dt) frazil_diag=frazil_diag(i), & frz_onset=frz_onset(i), & yday=yday, & + fiso_ocn=fiso_ocn(i,:), & + HDO_ocn=HDO_ocn(i), & + H2_16O_ocn=H2_16O_ocn(i), & + H2_18O_ocn=H2_18O_ocn(i), & nfsd=nfsd, wave_sig_ht=wave_sig_ht(i), & wave_spectrum=wave_spectrum(i,:), & wavefreq=wavefreq(:), & @@ -606,11 +653,11 @@ end subroutine step_dyn_wave subroutine step_dyn_ridge (dt, ndtd) use icedrv_arrays_column, only: hin_max, fzsal, first_ice - use icedrv_domain_size, only: ncat, nilyr, nslyr, n_aero, nblyr, nx + use icedrv_domain_size, only: ncat, nilyr, nslyr, n_aero, n_iso, nblyr, nx use icedrv_flux, only: rdg_conv, rdg_shear, dardg1dt, dardg2dt use icedrv_flux, only: dvirdgdt, opening, closing, fpond, fresh, fhocn use icedrv_flux, only: aparticn, krdgn, aredistn, vredistn, dardg1ndt, dardg2ndt - use icedrv_flux, only: dvirdgndt, araftn, vraftn, fsalt, flux_bio, faero_ocn + use icedrv_flux, only: dvirdgndt, araftn, vraftn, fsalt, flux_bio, faero_ocn, fiso_ocn use icedrv_init, only: tmask use icedrv_state, only: trcrn, vsnon, aicen, vicen use icedrv_state, only: aice, aice0, trcr_depend, n_trcr_strata @@ -674,8 +721,8 @@ subroutine step_dyn_ridge (dt, ndtd) dvirdgdt=dvirdgdt(i), opening=opening(i), & fpond=fpond(i), & fresh=fresh(i), fhocn=fhocn(i), & - n_aero=n_aero, & - faero_ocn=faero_ocn(i,:), & + n_aero=n_aero, n_iso=n_iso, & + faero_ocn=faero_ocn(i,:), fiso_ocn=fiso_ocn(i,:), & aparticn=aparticn(i,:), krdgn=krdgn(i,:), & aredistn=aredistn(i,:), vredistn=vredistn(i,:), & dardg1ndt=dardg1ndt(i,:), dardg2ndt=dardg2ndt(i,:), & @@ -717,8 +764,8 @@ subroutine step_dyn_ridge (dt, ndtd) dvirdgdt=dvirdgdt(i), opening=opening(i), & fpond=fpond(i), & fresh=fresh(i), fhocn=fhocn(i), & - n_aero=n_aero, & - faero_ocn=faero_ocn(i,:), & + n_aero=n_aero, n_iso=n_iso, & + faero_ocn=faero_ocn(i,:), fiso_ocn=fiso_ocn(i,:), & aparticn=aparticn(i,:), krdgn=krdgn(i,:), & aredistn=aredistn(i,:), vredistn=vredistn(i,:), & dardg1ndt=dardg1ndt(i,:), dardg2ndt=dardg2ndt(i,:), & @@ -1058,7 +1105,7 @@ subroutine biogeochemistry (dt) use icedrv_domain_size, only: n_doc, n_dic, n_don, n_fed, n_fep, nx use icedrv_flux, only: meltbn, melttn, congeln, snoicen use icedrv_flux, only: sst, sss, fsnow, meltsn - use icedrv_flux, only: hin_old, flux_bio, flux_bio_atm, faero_atm + use icedrv_flux, only: hin_old, flux_bio, flux_bio_atm, faero_atm use icedrv_flux, only: nit, amm, sil, dmsp, dms, algalN, doc, don, dic, fed, fep, zaeros, hum use icedrv_state, only: aicen_init, vicen_init, aicen, vicen, vsnon use icedrv_state, only: trcrn, vsnon_init, aice0 diff --git a/configuration/scripts/icepack.build b/configuration/scripts/icepack.build index 715b4a30a..4750be5fd 100755 --- a/configuration/scripts/icepack.build +++ b/configuration/scripts/icepack.build @@ -24,8 +24,8 @@ endif if !(-d ${ICE_OBJDIR}) mkdir -p ${ICE_OBJDIR} cd ${ICE_OBJDIR} -#setenv ICE_CPPDEFS "-DNXGLOB=${ICE_NXGLOB} -DNYGLOB=${ICE_NYGLOB} -DBLCKX=${ICE_BLCKX} -DBLCKY=${ICE_BLCKY} -DMXBLCKS=${ICE_MXBLCKS} -DNICELYR=${NICELYR} -DNSNWLYR=${NSNWLYR} -DNICECAT=${NICECAT} -DNFSDCAT=${NFSDCAT} -DTRAGE=${TRAGE} -DTRFY=${TRFY} -DTRLVL=${TRLVL} -DTRPND=${TRPND} -DTRBRI=${TRBRI} -DNTRAERO=${NTRAERO} -DTRZS=${TRZS} -DNBGCLYR=${NBGCLYR} -DTRALG=${TRALG} -DTRBGCZ=${TRBGCZ} -DTRDOC=${TRDOC} -DTRDOC=${TRDOC} -DTRDIC=${TRDIC} -DTRDON=${TRDON} -DTRFED=${TRFED} -DTRFEP=${TRFEP} -DTRZAERO=${TRZAERO} -DTRBGCS=${TRBGCS} -DNUMIN=${NUMIN} -DNUMAX=${NUMAX}" -setenv ICE_CPPDEFS "-DNXGLOB=${ICE_NXGLOB} -DNICELYR=${NICELYR} -DNSNWLYR=${NSNWLYR} -DNICECAT=${NICECAT} -DNFSDCAT=${NFSDCAT} -DTRAGE=${TRAGE} -DTRFY=${TRFY} -DTRLVL=${TRLVL} -DTRPND=${TRPND} -DTRBRI=${TRBRI} -DNTRAERO=${NTRAERO} -DTRZS=${TRZS} -DNBGCLYR=${NBGCLYR} -DTRALG=${TRALG} -DTRBGCZ=${TRBGCZ} -DTRDOC=${TRDOC} -DTRDOC=${TRDOC} -DTRDIC=${TRDIC} -DTRDON=${TRDON} -DTRFED=${TRFED} -DTRFEP=${TRFEP} -DTRZAERO=${TRZAERO} -DTRBGCS=${TRBGCS} " +#setenv ICE_CPPDEFS "-DNXGLOB=${ICE_NXGLOB} -DNYGLOB=${ICE_NYGLOB} -DBLCKX=${ICE_BLCKX} -DBLCKY=${ICE_BLCKY} -DMXBLCKS=${ICE_MXBLCKS} -DNICELYR=${NICELYR} -DNSNWLYR=${NSNWLYR} -DNICECAT=${NICECAT} -DNFSDCAT=${NFSDCAT} -DTRAGE=${TRAGE} -DTRFY=${TRFY} -DTRLVL=${TRLVL} -DTRPND=${TRPND} -DTRBRI=${TRBRI} -DNTRISO=${NTRISO} -DNTRAERO=${NTRAERO} -DTRZS=${TRZS} -DNBGCLYR=${NBGCLYR} -DTRALG=${TRALG} -DTRBGCZ=${TRBGCZ} -DTRDOC=${TRDOC} -DTRDOC=${TRDOC} -DTRDIC=${TRDIC} -DTRDON=${TRDON} -DTRFED=${TRFED} -DTRFEP=${TRFEP} -DTRZAERO=${TRZAERO} -DTRBGCS=${TRBGCS} -DNUMIN=${NUMIN} -DNUMAX=${NUMAX}" +setenv ICE_CPPDEFS "-DNXGLOB=${ICE_NXGLOB} -DNICELYR=${NICELYR} -DNSNWLYR=${NSNWLYR} -DNICECAT=${NICECAT} -DNFSDCAT=${NFSDCAT} -DTRAGE=${TRAGE} -DTRFY=${TRFY} -DTRLVL=${TRLVL} -DTRPND=${TRPND} -DTRBRI=${TRBRI} -DNTRISO=${NTRISO} -DNTRAERO=${NTRAERO} -DTRZS=${TRZS} -DNBGCLYR=${NBGCLYR} -DTRALG=${TRALG} -DTRBGCZ=${TRBGCZ} -DTRDOC=${TRDOC} -DTRDOC=${TRDOC} -DTRDIC=${TRDIC} -DTRDON=${TRDON} -DTRFED=${TRFED} -DTRFEP=${TRFEP} -DTRZAERO=${TRZAERO} -DTRBGCS=${TRBGCS} " if (${ICE_NTASKS} == 1) then setenv ICE_COMMDIR serial diff --git a/configuration/scripts/icepack.settings b/configuration/scripts/icepack.settings index e08ffdd55..8860c103d 100755 --- a/configuration/scripts/icepack.settings +++ b/configuration/scripts/icepack.settings @@ -51,6 +51,7 @@ setenv TRPND 1 # set to 1 for melt pond tracers setenv NTRAERO 1 # number of aerosol tracers # (up to max_aero in ice_domain_size.F90) # CESM uses 3 aerosol tracers +setenv NTRISO 0 # number of isotopes (up to max_iso) setenv TRBRI 0 # set to 1 for brine height tracer setenv TRZS 0 # set to 1 for zsalinity tracer # (needs TRBRI = 1) diff --git a/configuration/scripts/icepack_in b/configuration/scripts/icepack_in index 324267a6b..d221ca4d5 100644 --- a/configuration/scripts/icepack_in +++ b/configuration/scripts/icepack_in @@ -29,6 +29,7 @@ tr_pond_lvl = .true. tr_aero = .false. tr_fsd = .false. + tr_iso = .false. / &thermo_nml diff --git a/configuration/scripts/options/set_env.isotope b/configuration/scripts/options/set_env.isotope new file mode 100644 index 000000000..2ea2111a8 --- /dev/null +++ b/configuration/scripts/options/set_env.isotope @@ -0,0 +1 @@ +setenv NTRISO 3 # number of isotope tracers diff --git a/configuration/scripts/options/set_nml.isotope b/configuration/scripts/options/set_nml.isotope new file mode 100644 index 000000000..f53e29b83 --- /dev/null +++ b/configuration/scripts/options/set_nml.isotope @@ -0,0 +1 @@ +tr_iso = .true. From 90dc5afb6f55eeaf211178ee4c545ce4babd153e Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Thu, 27 Feb 2020 17:30:00 -0700 Subject: [PATCH 02/13] calls to isotope routines --- columnphysics/icepack_therm_itd.F90 | 26 ++++++++--------- columnphysics/icepack_therm_vertical.F90 | 36 ++++++++++++------------ 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/columnphysics/icepack_therm_itd.F90 b/columnphysics/icepack_therm_itd.F90 index b44073f4a..ffd60ca79 100644 --- a/columnphysics/icepack_therm_itd.F90 +++ b/columnphysics/icepack_therm_itd.F90 @@ -45,7 +45,7 @@ module icepack_therm_itd use icepack_itd, only: reduce_area, cleanup_itd use icepack_itd, only: aggregate_area, shift_ice use icepack_itd, only: column_sum, column_conservation_check -!FIX use icepack_isotope, only: isoice_alpha, frac + use icepack_isotope, only: isoice_alpha, frac use icepack_mushy_physics, only: liquidus_temperature_mush, enthalpy_mush use icepack_therm_shared, only: hfrazilmin use icepack_therm_shared, only: hi_min @@ -1701,12 +1701,12 @@ subroutine add_new_ice (ncat, nilyr, & frazil_conc = c0 if (tr_iso .and. vtmp > puny) then do it=1,n_iso -!FIX if (it==1) & -! frazil_conc = isoice_alpha(c0,'HDO' ,frac)*HDO_ocn -! if (it==2) & -! frazil_conc = isoice_alpha(c0,'H2_16O',frac)*H2_16O_ocn -! if (it==3) & -! frazil_conc = isoice_alpha(c0,'H2_18O',frac)*H2_18O_ocn + if (it==1) & + frazil_conc = isoice_alpha(c0,'HDO' ,frac)*HDO_ocn + if (it==2) & + frazil_conc = isoice_alpha(c0,'H2_16O',frac)*H2_16O_ocn + if (it==3) & + frazil_conc = isoice_alpha(c0,'H2_18O',frac)*H2_18O_ocn ! dilution and uptake in the ice trcrn(nt_isoice+it-1,n) & @@ -1823,12 +1823,12 @@ subroutine add_new_ice (ncat, nilyr, & frazil_conc = c0 if (tr_iso) then do it=1,n_iso -!FIX if (it==1) & -! frazil_conc = isoice_alpha(c0,'HDO' ,frac)*HDO_ocn -! if (it==2) & -! frazil_conc = isoice_alpha(c0,'H2_16O',frac)*H2_16O_ocn -! if (it==3) & -! frazil_conc = isoice_alpha(c0,'H2_18O',frac)*H2_18O_ocn + if (it==1) & + frazil_conc = isoice_alpha(c0,'HDO' ,frac)*HDO_ocn + if (it==2) & + frazil_conc = isoice_alpha(c0,'H2_16O',frac)*H2_16O_ocn + if (it==3) & + frazil_conc = isoice_alpha(c0,'H2_18O',frac)*H2_18O_ocn trcrn(nt_isoice+it-1,1) & = (trcrn(nt_isoice+it-1,1)*vice1) & diff --git a/columnphysics/icepack_therm_vertical.F90 b/columnphysics/icepack_therm_vertical.F90 index 6ec56ac31..6a2575c9d 100644 --- a/columnphysics/icepack_therm_vertical.F90 +++ b/columnphysics/icepack_therm_vertical.F90 @@ -47,7 +47,7 @@ module icepack_therm_vertical use icepack_mushy_physics, only: enthalpy_mush, enthalpy_of_melting use icepack_aerosol, only: update_aerosol -!FIX use icepack_isotope, only: update_isotope + use icepack_isotope, only: update_isotope use icepack_atmo, only: neutral_drag_coeffs, icepack_atm_boundary use icepack_age, only: increment_age use icepack_firstyear, only: update_FYarea @@ -2504,23 +2504,23 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & endif if (tr_iso) then -!FIX call update_isotope (dt = dt, & -! nilyr = nilyr, nslyr = nslyr, n_iso = n_iso, & -! meltt = melttn(n),melts = meltsn(n), & -! meltb = meltbn(n),congel=congeln(n), & -! snoice=snoicen(n),evap=evapn, & -! fsnow=fsnow, Tsfc=Tsfc(n), & -! Qref_iso=Qrefn_iso(:), & -! isosno=isosno(:,n),isoice=isoice(:,n), & -! aice_old=aicen_init(n),vice_old=vicen_init(n), & -! vsno_old=vsnon_init(n), & -! vicen=vicen(n),vsnon=vsnon(n), & -! aicen=aicen(n), & -! fiso_atm=fiso_atm(:), & -! fiso_evapn=fiso_evapn(:), & -! fiso_ocnn=fiso_ocnn(:), & -! HDO_ocn=HDO_ocn,H2_16O_ocn=H2_16O_ocn, & -! H2_18O_ocn=H2_18O_ocn) + call update_isotope (dt = dt, & + nilyr = nilyr, nslyr = nslyr, n_iso = n_iso, & + meltt = melttn(n),melts = meltsn(n), & + meltb = meltbn(n),congel=congeln(n), & + snoice=snoicen(n),evap=evapn, & + fsnow=fsnow, Tsfc=Tsfc(n), & + Qref_iso=Qrefn_iso(:), & + isosno=isosno(:,n),isoice=isoice(:,n), & + aice_old=aicen_init(n),vice_old=vicen_init(n), & + vsno_old=vsnon_init(n), & + vicen=vicen(n),vsnon=vsnon(n), & + aicen=aicen(n), & + fiso_atm=fiso_atm(:), & + fiso_evapn=fiso_evapn(:), & + fiso_ocnn=fiso_ocnn(:), & + HDO_ocn=HDO_ocn,H2_16O_ocn=H2_16O_ocn, & + H2_18O_ocn=H2_18O_ocn) endif endif ! aicen_init From d3f51086772d228d276484d45b8a4263033266b4 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Fri, 28 Feb 2020 13:52:23 -0700 Subject: [PATCH 03/13] correct isotope tracer indices --- configuration/driver/icedrv_init.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configuration/driver/icedrv_init.F90 b/configuration/driver/icedrv_init.F90 index 3964deace..ab596b12b 100644 --- a/configuration/driver/icedrv_init.F90 +++ b/configuration/driver/icedrv_init.F90 @@ -663,10 +663,10 @@ subroutine input_data nt_isosno = max_ntrcr nt_isoice = max_ntrcr if (tr_iso) then ! isotopes + nt_isosno = ntrcr + 1 ntrcr = ntrcr + n_iso ! n_iso species in snow - nt_isosno = ntrcr + nt_isoice = ntrcr + 1 ntrcr = ntrcr + n_iso ! n_iso species in ice - nt_isoice = ntrcr end if nt_aero = max_ntrcr - 4*n_aero From 4d5bb576e54156dfb7e58a7b554c80b593511b84 Mon Sep 17 00:00:00 2001 From: apcraig Date: Sun, 8 Mar 2020 19:57:10 +0000 Subject: [PATCH 04/13] update isotope interfaces to be backwards compatible demonstrate prototype optional argument handling internal to the columnphysics migrate to fortran use for n_iso and tr_iso, remove them from interfaces (to be done to other similar variables) fix isotope hardcoded basal ice growth and isotope update logic refactor optional closing argument to follow new approach (get ride of "extra" ridge_ice call) fix isotope restart bug (read unit number) add isotope restart test to base suite add subnames to icepack_isotope.F90 rename public icepack_isotope variable frac to isotope_frac_method to improve clarity add some coding standard documentation to developers guide under column physics section --- columnphysics/icepack_atmo.F90 | 102 +++++++------ columnphysics/icepack_flux.F90 | 19 ++- columnphysics/icepack_isotope.F90 | 77 +++++----- columnphysics/icepack_itd.F90 | 84 +++++------ columnphysics/icepack_mechred.F90 | 154 +++++++++----------- columnphysics/icepack_therm_itd.F90 | 76 +++++++--- columnphysics/icepack_therm_vertical.F90 | 149 ++++++++++++++++--- configuration/driver/icedrv_diagnostics.F90 | 11 +- configuration/driver/icedrv_restart.F90 | 4 +- configuration/driver/icedrv_step.F90 | 4 +- configuration/scripts/tests/base_suite.ts | 1 + doc/source/developer_guide/dg_col_phys.rst | 81 +++++++++- doc/source/user_guide/interfaces.include | 73 ++++++++-- 13 files changed, 553 insertions(+), 282 deletions(-) diff --git a/columnphysics/icepack_atmo.F90 b/columnphysics/icepack_atmo.F90 index 728e56042..b12d0aab5 100644 --- a/columnphysics/icepack_atmo.F90 +++ b/columnphysics/icepack_atmo.F90 @@ -20,6 +20,8 @@ module icepack_atmo use icepack_parameters, only: pih, dragio, rhoi, rhos, rhow use icepack_parameters, only: atmbndy, calc_strair, formdrag use icepack_parameters, only: highfreq, natmiter + use icepack_tracers, only: n_iso + use icepack_tracers, only: tr_iso use icepack_warnings, only: warnstr, icepack_warnings_add use icepack_warnings, only: icepack_warnings_setabort, icepack_warnings_aborted @@ -61,13 +63,11 @@ subroutine atmo_boundary_layer (sfctype, & lhcoef, shcoef, & Cdn_atm, & Cdn_atm_ratio_n, & - n_iso, & Qa_iso, Qref_iso, & + iso_flag, & uvel, vvel, & Uref ) - use icepack_tracers, only: tr_iso - character (len=3), intent(in) :: & sfctype ! ice or ocean @@ -79,9 +79,6 @@ subroutine atmo_boundary_layer (sfctype, & integer (kind=int_kind), intent(in) :: & natmiter ! number of iterations for boundary layer calculations - integer (kind=int_kind), optional, intent(in) :: & - n_iso ! number of isotopes - real (kind=dbl_kind), intent(in) :: & Tsf , & ! surface temperature of ice or ocean potT , & ! air potential temperature (K) @@ -111,11 +108,14 @@ subroutine atmo_boundary_layer (sfctype, & shcoef , & ! transfer coefficient for sensible heat lhcoef ! transfer coefficient for latent heat + logical (kind=log_kind), intent(in), optional :: & + iso_flag ! flag to trigger iso calculations + real (kind=dbl_kind), intent(in), optional, dimension(:) :: & - Qa_iso ! specific isotopic humidity (kg/kg) + Qa_iso ! specific isotopic humidity (kg/kg) real (kind=dbl_kind), intent(inout), optional, dimension(:) :: & - Qref_iso ! reference specific isotopic humidity (kg/kg) + Qref_iso ! reference specific isotopic humidity (kg/kg) real (kind=dbl_kind), intent(in) :: & uvel , & ! x-direction ice speed (m/s) @@ -166,10 +166,18 @@ subroutine atmo_boundary_layer (sfctype, & psixh ! stability function at zlvl (heat and water) real (kind=dbl_kind), parameter :: & - zTrf = c2 ! reference height for air temp (m) + zTrf = c2 ! reference height for air temp (m) + + logical (kind=log_kind) :: & + l_iso_flag ! local flag to trigger iso calculations character(len=*),parameter :: subname='(atmo_boundary_layer)' + l_iso_flag = .false. + if (present(iso_flag)) then + l_iso_flag = iso_flag + endif + al2 = log(zref/zTrf) !------------------------------------------------------------ @@ -370,8 +378,8 @@ subroutine atmo_boundary_layer (sfctype, & Uref = vmag * rd / rdn endif - if (present(Qref_iso) .and. present(Qa_iso) & - .and. present(n_iso)) then + if (l_iso_flag) then + if (present(Qref_iso) .and. present(Qa_iso)) then Qref_iso(:) = c0 if (tr_iso) then do n = 1, n_iso @@ -380,6 +388,11 @@ subroutine atmo_boundary_layer (sfctype, & Qref_iso(n) = Qa_iso(n) - ratio*delq*fac enddo endif + else + call icepack_warnings_add(subname//' l_iso_flag true but optional arrays missing') + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + return + endif endif end subroutine atmo_boundary_layer @@ -494,7 +507,7 @@ end subroutine atmo_boundary_const !======================================================================= ! Neutral drag coefficients for ocean and atmosphere also compute the -! intermediate necessary variables ridge height, distance, floe size +! intermediate necessary variables ridge height, distance, floe size ! based upon Tsamados et al. (2014), JPO, DOI: 10.1175/JPO-D-13-0215.1. ! Places where the code varies from the paper are commented. ! @@ -600,7 +613,7 @@ subroutine neutral_drag_coeffs (apnd, hpnd, & ctecaf, & ! constante ctecwf, & ! constante sca, & ! wind attenuation function - scw, & ! ocean attenuation function + scw, & ! ocean attenuation function lp, & ! pond length (m) ctecar, & ctecwk, & @@ -724,7 +737,7 @@ subroutine neutral_drag_coeffs (apnd, hpnd, & !------------------------------------------------------------ ! Skin drag (atmo) - !------------------------------------------------------------ + !------------------------------------------------------------ Cdn_atm_skin = csa*(c1 - mrdg*tmp1/distrdg) Cdn_atm_skin = max(min(Cdn_atm_skin,camax),c0) @@ -751,7 +764,7 @@ subroutine neutral_drag_coeffs (apnd, hpnd, & !------------------------------------------------------------ ! Skin drag bottom ice (ocean) - !------------------------------------------------------------ + !------------------------------------------------------------ Cdn_ocn_skin = csw * (c1 - mrdgo*tmp1/dkeel) Cdn_ocn_skin = max(min(Cdn_ocn_skin,cwmax), c0) @@ -837,13 +850,10 @@ subroutine icepack_atm_boundary(sfctype, & lhcoef, shcoef, & Cdn_atm, & Cdn_atm_ratio_n, & - n_iso, & Qa_iso, Qref_iso, & uvel, vvel, & Uref) - use icepack_tracers, only: tr_iso - character (len=3), intent(in) :: & sfctype ! ice or ocean @@ -857,9 +867,6 @@ subroutine icepack_atm_boundary(sfctype, & Qa , & ! specific humidity (kg/kg) rhoa ! air density (kg/m^3) - integer (kind=int_kind), optional, intent(in) :: & - n_iso ! number of isotopes - real (kind=dbl_kind), intent(inout) :: & Cdn_atm , & ! neutral drag coefficient Cdn_atm_ratio_n ! ratio drag coeff / neutral drag coeff @@ -895,33 +902,37 @@ subroutine icepack_atm_boundary(sfctype, & ! local variables real (kind=dbl_kind) :: & - worku, workv, workr - - integer (kind=int_kind) :: & - niso + l_uvel, l_vvel, l_Uref real (kind=dbl_kind), dimension(:), allocatable :: & - Qaiso, Qriso + l_Qa_iso, l_Qref_iso ! local copies of Qa_iso, Qref_iso + + logical (kind=log_kind) :: & + iso_flag ! flag to turn on iso calcs in other subroutines character(len=*),parameter :: subname='(icepack_atm_boundary)' - worku = c0 - workv = c0 - workr = c0 + l_uvel = c0 + l_vvel = c0 + l_Uref = c0 if (present(uvel)) then - worku = uvel + l_uvel = uvel endif if (present(vvel)) then - workv = vvel + l_vvel = vvel endif - if (present(n_iso) .and. present(Qa_iso) .and. & - present(Qref_iso)) then - allocate(Qaiso(n_iso),Qriso(n_iso)) - Qaiso = Qa_iso - Qriso = Qref_iso - niso = n_iso + if (present(Qa_iso) .and. present(Qref_iso)) then + iso_flag = .true. + allocate(l_Qa_iso(size(Qa_iso,dim=1))) + allocate(l_Qref_iso(size(Qref_iso,dim=1))) + l_Qa_iso = Qa_iso + l_Qref_iso = Qref_iso else - allocate(Qaiso(1),Qriso(1)) + iso_flag = .false. + allocate(l_Qa_iso(1)) + allocate(l_Qref_iso(1)) + l_Qa_iso = c0 + l_Qref_iso = c0 endif Cdn_atm_ratio_n = c1 @@ -950,22 +961,23 @@ subroutine icepack_atm_boundary(sfctype, & lhcoef, shcoef, & Cdn_atm, & Cdn_atm_ratio_n, & - n_iso=niso, & - Qa_iso=Qaiso, Qref_iso=Qriso,& - uvel=worku, vvel=workv, & - Uref=workr) + iso_flag = iso_flag, & + Qa_iso=l_Qa_iso, & + Qref_iso=l_Qref_iso, & + uvel=l_uvel, vvel=l_vvel, & + Uref=l_Uref) if (icepack_warnings_aborted(subname)) return endif ! atmbndy if (present(Uref)) then - Uref = workr + Uref = l_Uref endif if (present(Qref_iso)) then - Qref_iso = Qriso + Qref_iso = l_Qref_iso endif - deallocate(Qaiso,Qriso) + deallocate(l_Qa_iso,l_Qref_iso) end subroutine icepack_atm_boundary diff --git a/columnphysics/icepack_flux.F90 b/columnphysics/icepack_flux.F90 index 60aae4bda..e4c7d015e 100644 --- a/columnphysics/icepack_flux.F90 +++ b/columnphysics/icepack_flux.F90 @@ -12,6 +12,7 @@ module icepack_flux use icepack_parameters, only: c1, emissivity use icepack_warnings, only: warnstr, icepack_warnings_add use icepack_warnings, only: icepack_warnings_setabort, icepack_warnings_aborted + use icepack_tracers, only: tr_iso implicit none private @@ -162,14 +163,16 @@ subroutine merge_fluxes (aicen, & Qref = Qref + Qrefn * aicen ! Isotopes - if (present(Qrefn_iso) .and. present(Qref_iso)) then - Qref_iso (:) = Qref_iso (:) + Qrefn_iso (:) * aicen - endif - if (present(fiso_ocnn) .and. present(fiso_ocn)) then - fiso_ocn (:) = fiso_ocn (:) + fiso_ocnn (:) * aicen - endif - if (present(fiso_evapn) .and. present(fiso_evap)) then - fiso_evap(:) = fiso_evap(:) + fiso_evapn(:) * aicen + if (tr_iso) then + if (present(Qrefn_iso) .and. present(Qref_iso)) then + Qref_iso (:) = Qref_iso (:) + Qrefn_iso (:) * aicen + endif + if (present(fiso_ocnn) .and. present(fiso_ocn)) then + fiso_ocn (:) = fiso_ocn (:) + fiso_ocnn (:) * aicen + endif + if (present(fiso_evapn) .and. present(fiso_evap)) then + fiso_evap(:) = fiso_evap(:) + fiso_evapn(:) * aicen + endif endif ! ocean fluxes diff --git a/columnphysics/icepack_isotope.F90 b/columnphysics/icepack_isotope.F90 index e13a96cbb..d230eae89 100644 --- a/columnphysics/icepack_isotope.F90 +++ b/columnphysics/icepack_isotope.F90 @@ -13,14 +13,20 @@ module icepack_isotope use icepack_kinds use icepack_parameters, only: c0, c1, c2, p001, p1, p5, puny + use icepack_tracers, only: n_iso + use icepack_warnings, only: icepack_warnings_add, icepack_warnings_setabort implicit none + private - character(len=5), parameter :: & - frac = 'cfrac' ! fractionation coefficient calculation method - ! cfrac, constant fractionation - ! nfrac, nonfractionation - ! gfrac, growth-rate dependent for H2_18O + public :: update_isotope, & + isoice_alpha + + character(len=5), parameter, public :: & + isotope_frac_method = 'cfrac' ! fractionation coefficient calculation method + ! cfrac, constant fractionation + ! nfrac, nonfractionation + ! gfrac, growth-rate dependent for H2_18O ! Species indicies - public so thay can be seen by water_tracers integer, parameter, public :: ispundef = 0 ! Undefined @@ -41,7 +47,6 @@ module icepack_isotope ! subroutine update_isotope (dt, & nilyr, nslyr, & - n_iso, & meltt, melts, & meltb, congel, & snoice, evap, & @@ -59,7 +64,7 @@ subroutine update_isotope (dt, & use icepack_parameters, only: ktherm, rhoi, rhos, Tffresh integer (kind=int_kind), intent(in) :: & - nilyr, nslyr, n_iso + nilyr, nslyr real (kind=dbl_kind), intent(in) :: & dt ! time step @@ -118,6 +123,8 @@ subroutine update_isotope (dt, & integer (kind=int_kind) :: k + character(len=*),parameter :: subname='(update_isotope)' + ! initialize hs_old=vsno_old/aice_old @@ -156,12 +163,12 @@ subroutine update_isotope (dt, & do k = 1, n_iso ratio = c1 ! ratio between 18O(HDO) and 16O in humidity alphai = c1 ! fractionation coefficient - if (frac.ne.'nfrac' .and. Qref_iso(2)>puny) & + if (isotope_frac_method.ne.'nfrac' .and. Qref_iso(2)>puny) & ratio = Qref_iso(k)/Qref_iso(2) if (Qref_iso(2) <= puny) ratio = c0 - if (frac.ne.'nfrac' .and. k==1) alphai = wiso_alpi(3,TsfK) - if (frac.ne.'nfrac' .and. k==2) alphai = wiso_alpi(2,TsfK) - if (frac.ne.'nfrac' .and. k==3) alphai = wiso_alpi(4,TsfK) + if (isotope_frac_method.ne.'nfrac' .and. k==1) alphai = wiso_alpi(3,TsfK) + if (isotope_frac_method.ne.'nfrac' .and. k==2) alphai = wiso_alpi(2,TsfK) + if (isotope_frac_method.ne.'nfrac' .and. k==3) alphai = wiso_alpi(4,TsfK) work = alphai*ratio*rhos*evaps*aicen fiso_evapn(k) = fiso_evapn(k) + work/dt isosno(k) = isosno(k) + work @@ -173,12 +180,12 @@ subroutine update_isotope (dt, & do k = 1, n_iso ratio = c1 ! ratio between 18O(HDO) and 16O in ref humidity alphai = c1 ! fractionation coefficient - if (frac.ne.'nfrac' .and. Qref_iso(2)>puny) & + if (isotope_frac_method.ne.'nfrac' .and. Qref_iso(2)>puny) & ratio = Qref_iso(k)/Qref_iso(2) if (Qref_iso(2) <= puny) ratio = c0 - if (frac.ne.'nfrac' .and. k==1) alphai = wiso_alpi(3,TsfK) - if (frac.ne.'nfrac' .and. k==2) alphai = wiso_alpi(2,TsfK) - if (frac.ne.'nfrac' .and. k==3) alphai = wiso_alpi(4,TsfK) + if (isotope_frac_method.ne.'nfrac' .and. k==1) alphai = wiso_alpi(3,TsfK) + if (isotope_frac_method.ne.'nfrac' .and. k==2) alphai = wiso_alpi(2,TsfK) + if (isotope_frac_method.ne.'nfrac' .and. k==3) alphai = wiso_alpi(4,TsfK) work = alphai*ratio*rhoi*evapi*aicen fiso_evapn(k) = fiso_evapn(k) + work/dt isoice(k) = isoice(k) + work @@ -188,25 +195,25 @@ subroutine update_isotope (dt, & ! basal ice growth and isotope uptake -!ECH: this needs to be recoded in case n_iso < 3 if (congel > c0) then - k = 1 - alpha = isoice_alpha(congel/dt,'HDO',frac) - work = alpha*HDO_ocn*rhoi*congel*aicen - isoice(k) = isoice(k) + work - fiso_ocnn(k) = fiso_ocnn(k) - work/dt - - k = 2 - alpha = isoice_alpha(congel/dt,'H2_16O',frac) - work = alpha*H2_16O_ocn*rhoi*congel*aicen - isoice(k) = isoice(k) + work - fiso_ocnn(k) = fiso_ocnn(k) - work/dt - - k = 3 - alpha = isoice_alpha(congel/dt,'H2_18O',frac) - work = alpha*H2_18O_ocn*rhoi*congel*aicen - isoice(k) = isoice(k)+work - fiso_ocnn(k) = fiso_ocnn(k)-work/dt + do k = 1,n_iso + if (k == 1) then + alpha = isoice_alpha(congel/dt,'HDO',isotope_frac_method) + work = alpha*HDO_ocn*rhoi*congel*aicen + elseif (k == 2) then + alpha = isoice_alpha(congel/dt,'H2_16O',isotope_frac_method) + work = alpha*H2_16O_ocn*rhoi*congel*aicen + elseif (k == 3) then + alpha = isoice_alpha(congel/dt,'H2_18O',isotope_frac_method) + work = alpha*H2_18O_ocn*rhoi*congel*aicen + else + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + call icepack_warnings_add(subname//' ERROR: n_iso > 3') + return + endif + isoice(k) = isoice(k) + work + fiso_ocnn(k) = fiso_ocnn(k) - work/dt + enddo dzice = dzice + congel endif @@ -419,6 +426,8 @@ function isoice_alpha(growth_rate, sp, frac) real (kind=dbl_kind) :: & isoice_alpha ! return fractionation + character(len=*),parameter :: subname='(isoice_alpha)' + if (frac == 'nfrac') isoice_alpha = c1 if (sp == 'H2_16O') isoice_alpha = c1 @@ -457,6 +466,8 @@ function wiso_alpi(isp,tk) real(kind=dbl_kind), intent(in) :: tk ! temperature (k) real(kind=dbl_kind) :: wiso_alpi ! return fractionation + character(len=*),parameter :: subname='(wiso_alpi)' + !From Merlivat & Nief,1967 for HDO, and Majoube, 1971b for H218O: real(kind=dbl_kind), parameter, dimension(pwtspec) :: & ! ice/vapour alpai = (/ 0._dbl_kind, 0._dbl_kind, 16289._dbl_kind, 0._dbl_kind /), & diff --git a/columnphysics/icepack_itd.F90 b/columnphysics/icepack_itd.F90 index b23f393b1..fd19265c2 100644 --- a/columnphysics/icepack_itd.F90 +++ b/columnphysics/icepack_itd.F90 @@ -26,19 +26,20 @@ module icepack_itd use icepack_kinds - use icepack_parameters, only: c0, c1, c2, c3, c15, c25, c100, p1, p01, p001, p5, puny - use icepack_parameters, only: Lfresh, rhos, ice_ref_salinity, hs_min, cp_ice, Tocnfrz, rhoi - use icepack_parameters, only: rhosi, sk_l, hs_ssl, min_salin + use icepack_parameters, only: c0, c1, c2, c3, c15, c25, c100, p1, p01, p001, p5, puny + use icepack_parameters, only: Lfresh, rhos, ice_ref_salinity, hs_min, cp_ice, Tocnfrz, rhoi + use icepack_parameters, only: rhosi, sk_l, hs_ssl, min_salin use icepack_tracers, only: nt_Tsfc, nt_qice, nt_qsno, nt_aero, nt_isosno, nt_isoice use icepack_tracers, only: nt_apnd, nt_hpnd, nt_fbri, tr_brine, nt_bgc_S, bio_index + use icepack_tracers, only: n_iso + use icepack_tracers, only: tr_iso + use icepack_tracers, only: icepack_compute_tracers use icepack_parameters, only: solve_zsal, skl_bgc, z_tracers use icepack_parameters, only: kcatbound, kitd use icepack_therm_shared, only: Tmin, hi_min - use icepack_warnings, only: warnstr, icepack_warnings_add - use icepack_warnings, only: icepack_warnings_setabort, icepack_warnings_aborted - - use icepack_zbgc_shared, only: zap_small_bgc - use icepack_tracers, only: icepack_compute_tracers + use icepack_warnings, only: warnstr, icepack_warnings_add + use icepack_warnings, only: icepack_warnings_setabort, icepack_warnings_aborted + use icepack_zbgc_shared,only: zap_small_bgc implicit none @@ -760,9 +761,9 @@ subroutine cleanup_itd (dt, ntrcr, & aicen, trcrn, & vicen, vsnon, & aice0, aice, & - n_aero, n_iso, & + n_aero, & nbtrcr, nblyr, & - tr_aero, tr_iso, & + tr_aero, & tr_pond_topo, & heat_capacity, & first_ice, & @@ -781,8 +782,7 @@ subroutine cleanup_itd (dt, ntrcr, & nslyr , & ! number of snow layers ntrcr , & ! number of tracers in use nbtrcr, & ! number of bio tracers in use - n_aero, & ! number of aerosol tracers - n_iso ! number of isotope tracers + n_aero ! number of aerosol tracers real (kind=dbl_kind), intent(in) :: & dt ! time step @@ -815,7 +815,6 @@ subroutine cleanup_itd (dt, ntrcr, & logical (kind=log_kind), intent(in) :: & tr_aero, & ! aerosol flag - tr_iso, & ! isotope flag tr_pond_topo, & ! topo pond flag heat_capacity ! if false, ice and snow have zero heat capacity @@ -837,8 +836,7 @@ subroutine cleanup_itd (dt, ntrcr, & real (kind=dbl_kind), dimension (:), intent(inout), optional :: & faero_ocn ! aerosol flux to ocean (kg/m^2/s) - real (kind=dbl_kind), dimension (:), & - intent(inout), optional :: & + real (kind=dbl_kind), dimension (:), intent(inout) :: & fiso_ocn ! isotope flux to ocean (kg/m^2/s) logical (kind=log_kind), intent(in), optional :: & @@ -942,8 +940,8 @@ subroutine cleanup_itd (dt, ntrcr, & if (limit_aice) then call zap_small_areas (dt, ntrcr, & - ncat, & - n_aero, n_iso, & + ncat, & + n_aero, & nblyr, & nilyr, nslyr, & aice, aice0, & @@ -953,7 +951,7 @@ subroutine cleanup_itd (dt, ntrcr, & dfresh, dfsalt, & dfhocn, & dfaero_ocn, dfiso_ocn, & - tr_aero, tr_iso, & + tr_aero, & tr_pond_topo, & first_ice, nbtrcr, & dfzsal, dflux_bio ) @@ -980,9 +978,9 @@ subroutine cleanup_itd (dt, ntrcr, & trcrn, vsnon, & dfresh, dfhocn, & dfaero_ocn, tr_aero, & - dfiso_ocn, tr_iso, & + dfiso_ocn, & dflux_bio, nbtrcr, & - n_aero, n_iso) + n_aero) if (icepack_warnings_aborted(subname)) return !------------------------------------------------------------------- @@ -1002,12 +1000,10 @@ subroutine cleanup_itd (dt, ntrcr, & faero_ocn(it) = faero_ocn(it) + dfaero_ocn(it) enddo endif - if (present(fiso_ocn)) then - if (tr_iso) then - do it = 1, n_iso - fiso_ocn(it) = fiso_ocn(it) + dfiso_ocn(it) - enddo - endif + if (tr_iso) then + do it = 1, n_iso + fiso_ocn(it) = fiso_ocn(it) + dfiso_ocn(it) + enddo endif if (present(flux_bio)) then do it = 1, nbtrcr @@ -1041,7 +1037,7 @@ end subroutine cleanup_itd subroutine zap_small_areas (dt, ntrcr, & ncat, & - n_aero, n_iso, & + n_aero, & nblyr, & nilyr, nslyr, & aice, aice0, & @@ -1051,7 +1047,7 @@ subroutine zap_small_areas (dt, ntrcr, & dfresh, dfsalt, & dfhocn, & dfaero_ocn, dfiso_ocn, & - tr_aero, tr_iso, & + tr_aero, & tr_pond_topo, & first_ice, nbtrcr, & dfzsal, dflux_bio ) @@ -1063,7 +1059,6 @@ subroutine zap_small_areas (dt, ntrcr, & nslyr , & ! number of snow layers ntrcr , & ! number of tracers in use n_aero , & ! number of aerosol tracers - n_iso , & ! number of isotope tracers nbtrcr ! number of biology tracers real (kind=dbl_kind), intent(in) :: & @@ -1099,7 +1094,6 @@ subroutine zap_small_areas (dt, ntrcr, & logical (kind=log_kind), intent(in) :: & tr_aero, & ! aerosol flag - tr_iso, & ! isotope flag tr_pond_topo ! pond flag logical (kind=log_kind), dimension (:), intent(inout) :: & @@ -1224,9 +1218,9 @@ subroutine zap_small_areas (dt, ntrcr, & trcrn(:,n), vsnon(n), & dfresh, dfhocn, & dfaero_ocn, tr_aero, & - dfiso_ocn, tr_iso, & + dfiso_ocn, & dflux_bio, nbtrcr, & - n_aero, n_iso, & + n_aero, & aicen(n), nblyr) if (icepack_warnings_aborted(subname)) return @@ -1366,15 +1360,14 @@ subroutine zap_snow(dt, nslyr, & trcrn, vsnon, & dfresh, dfhocn, & dfaero_ocn, tr_aero, & - dfiso_ocn, tr_iso, & + dfiso_ocn, & dflux_bio, nbtrcr, & - n_aero, n_iso, & + n_aero, & aicen, nblyr) integer (kind=int_kind), intent(in) :: & nslyr , & ! number of snow layers n_aero , & ! number of aerosol tracers - n_iso , & ! number of isotope tracers nblyr , & ! number of bio layers nbtrcr @@ -1396,14 +1389,13 @@ subroutine zap_snow(dt, nslyr, & dfaero_ocn ! zapped aerosol flux (kg/m^2/s) real (kind=dbl_kind), dimension (:), intent(inout) :: & - dfiso_ocn ! zapped isotope flux (kg/m^2/s) + dfiso_ocn ! zapped isotope flux (kg/m^2/s) real (kind=dbl_kind), dimension (:), intent(inout) :: & - dflux_bio ! zapped bio tracer flux from biology (mmol/m^2/s) + dflux_bio ! zapped bio tracer flux from biology (mmol/m^2/s) logical (kind=log_kind), intent(in) :: & - tr_aero, & ! aerosol flag - tr_iso ! isotope flag + tr_aero ! aerosol flag ! local variables @@ -1467,15 +1459,14 @@ subroutine zap_snow_temperature(dt, ncat, & trcrn, vsnon, & dfresh, dfhocn, & dfaero_ocn, tr_aero, & - dfiso_ocn, tr_iso, & + dfiso_ocn, & dflux_bio, nbtrcr, & - n_aero, n_iso) + n_aero ) integer (kind=int_kind), intent(in) :: & ncat , & ! number of thickness categories nslyr , & ! number of snow layers n_aero, & ! number of aerosol tracers - n_iso, & ! number of isotope tracers nbtrcr, & ! number of z-tracers in use nblyr ! number of bio layers in ice @@ -1502,14 +1493,13 @@ subroutine zap_snow_temperature(dt, ncat, & dfaero_ocn ! zapped aerosol flux (kg/m^2/s) real (kind=dbl_kind), dimension (:), intent(inout) :: & - dfiso_ocn ! zapped isotope flux (kg/m^2/s) + dfiso_ocn ! zapped isotope flux (kg/m^2/s) real (kind=dbl_kind), dimension (:),intent(inout) :: & dflux_bio ! zapped biology flux (mmol/m^2/s) logical (kind=log_kind), intent(in) :: & - tr_aero, & ! aerosol flag - tr_iso ! isotope flag + tr_aero ! aerosol flag ! local variables @@ -1588,9 +1578,9 @@ subroutine zap_snow_temperature(dt, ncat, & trcrn(:,n), vsnon(n), & dfresh, dfhocn, & dfaero_ocn, tr_aero, & - dfiso_ocn, tr_iso, & + dfiso_ocn, & dflux_bio, nbtrcr, & - n_aero, n_iso, & + n_aero, & aicen(n), nblyr) if (icepack_warnings_aborted(subname)) return diff --git a/columnphysics/icepack_mechred.F90 b/columnphysics/icepack_mechred.F90 index 5fc567477..5da2fb1e4 100644 --- a/columnphysics/icepack_mechred.F90 +++ b/columnphysics/icepack_mechred.F90 @@ -45,6 +45,7 @@ module icepack_mechred use icepack_tracers, only: nt_qice, nt_qsno, nt_fbri, nt_sice use icepack_tracers, only: nt_alvl, nt_vlvl, nt_aero, nt_isosno, nt_isoice use icepack_tracers, only: nt_apnd, nt_hpnd + use icepack_tracers, only: n_iso use icepack_tracers, only: icepack_compute_tracers use icepack_warnings, only: warnstr, icepack_warnings_add @@ -95,7 +96,6 @@ module icepack_mechred subroutine ridge_ice (dt, ndtd, & ncat, n_aero, & - n_iso, & nilyr, nslyr, & ntrcr, hin_max, & rdg_conv, rdg_shear, & @@ -117,7 +117,7 @@ subroutine ridge_ice (dt, ndtd, & dardg1ndt, dardg2ndt, & dvirdgndt, & araftn, vraftn, & - closing ) + closing_flag,closing ) integer (kind=int_kind), intent(in) :: & ndtd , & ! number of dynamics subcycles @@ -125,7 +125,6 @@ subroutine ridge_ice (dt, ndtd, & nilyr , & ! number of ice layers nslyr , & ! number of snow layers n_aero, & ! number of aerosol tracers - n_iso, & ! number of isotope tracers ntrcr ! number of tracers in use real (kind=dbl_kind), intent(in) :: & @@ -162,10 +161,11 @@ subroutine ridge_ice (dt, ndtd, & nt_strata ! indices of underlying tracer layers integer (kind=int_kind), intent(in) :: & - krdg_partic , & ! selects participation function - krdg_redist ! selects redistribution function + krdg_partic, & ! selects participation function + krdg_redist ! selects redistribution function logical (kind=log_kind), intent(in) :: & + closing_flag, &! flag if closing is valid tr_brine ! if .true., brine height differs from ice thickness ! optional history fields @@ -193,8 +193,8 @@ subroutine ridge_ice (dt, ndtd, & real (kind=dbl_kind), dimension(:), intent(inout), optional :: & faero_ocn ! aerosol flux to ocean (kg/m^2/s) - real (kind=dbl_kind), dimension(:), intent(inout), optional :: & - fiso_ocn ! isotope flux to ocean (kg/m^2/s) + real (kind=dbl_kind), dimension(:), intent(inout) :: & + fiso_ocn ! isotope flux to ocean (kg/m^2/s) ! local variables @@ -300,7 +300,7 @@ subroutine ridge_ice (dt, ndtd, & ! Compute the area opening and closing. !----------------------------------------------------------------- - if (present(closing)) then + if (closing_flag) then opning = opening closing_net = closing @@ -403,7 +403,6 @@ subroutine ridge_ice (dt, ndtd, & ardg1n, ardg2n, & virdgn, & nslyr, n_aero, & - n_iso, & msnow_mlt, esnow_mlt, & maero, miso, & mpond, & @@ -600,12 +599,11 @@ subroutine ridge_ice (dt, ndtd, & faero_ocn(it) = faero_ocn(it) + maero(it)*dti enddo endif - if (present(fiso_ocn)) then - if (tr_iso) then - do it = 1, n_iso - fiso_ocn(it) = fiso_ocn(it) + miso(it)*dti - enddo - endif + if (tr_iso) then + ! check size fiso_ocn vs n_iso ??? + do it = 1, n_iso + fiso_ocn(it) = fiso_ocn(it) + miso(it)*dti + enddo endif if (present(fpond)) then fpond = fpond - mpond ! units change later @@ -617,7 +615,7 @@ subroutine ridge_ice (dt, ndtd, & if (abs(asum - c1) > puny) then call icepack_warnings_setabort(.true.,__FILE__,__LINE__) - call icepack_warnings_add(subname//" ridge_ice: total area > 1" ) + call icepack_warnings_add(subname//" total area > 1" ) write(warnstr,*) ' ' call icepack_warnings_add(warnstr) @@ -1092,7 +1090,6 @@ subroutine ridge_shift (ntrcr, dt, & ardg1nn, ardg2nn, & virdgnn, & nslyr, n_aero, & - n_iso, & msnow_mlt, esnow_mlt, & maero, miso, & mpond, & @@ -1103,7 +1100,6 @@ subroutine ridge_shift (ntrcr, dt, & nslyr , & ! number of snow layers ntrcr , & ! number of tracers in use n_aero, & ! number of aerosol tracers - n_iso , & ! number of isotope tracers krdg_redist ! selects redistribution function real (kind=dbl_kind), intent(in) :: & @@ -1743,7 +1739,7 @@ subroutine icepack_step_ridge (dt, ndtd, & dvirdgdt, opening, & fpond, & fresh, fhocn, & - n_aero, n_iso, & + n_aero, & faero_ocn, fiso_ocn, & aparticn, krdgn, & aredistn, vredistn, & @@ -1763,8 +1759,7 @@ subroutine icepack_step_ridge (dt, ndtd, & nblyr , & ! number of bio layers nilyr , & ! number of ice layers nslyr , & ! number of snow layers - n_aero, & ! number of aerosol tracers - n_iso ! number of isotope tracers + n_aero ! number of aerosol tracers real (kind=dbl_kind), dimension(0:ncat), intent(inout) :: & hin_max ! category limits (m) @@ -1814,7 +1809,7 @@ subroutine icepack_step_ridge (dt, ndtd, & faero_ocn, & ! aerosol flux to ocean (kg/m^2/s) flux_bio ! all bio fluxes to ocean - real (kind=dbl_kind), dimension(:), intent(inout) :: & + real (kind=dbl_kind), dimension(:), optional, intent(inout) :: & fiso_ocn ! isotope flux to ocean (kg/m^2/s) real (kind=dbl_kind), dimension(:,:), intent(inout) :: & @@ -1836,6 +1831,15 @@ subroutine icepack_step_ridge (dt, ndtd, & real (kind=dbl_kind) :: & dtt ! thermo time step + real (kind=dbl_kind), dimension(:), allocatable :: & + l_fiso_ocn ! local isotope flux to ocean (kg/m^2/s) + + real (kind=dbl_kind) :: & + l_closing ! local rate of closing due to divergence/shear (1/s) + + logical (kind=log_kind) :: & + l_closing_flag ! flag if closing is passed + character(len=*),parameter :: subname='(icepack_step_ridge)' !----------------------------------------------------------------- @@ -1844,68 +1848,51 @@ subroutine icepack_step_ridge (dt, ndtd, & ! aice has not yet been updated since the transport (and ! it may be out of whack, which the ridging helps fix).-ECH !----------------------------------------------------------------- - - if (present(closing)) then - call ridge_ice (dt, ndtd, & - ncat, n_aero, & - n_iso, & - nilyr, nslyr, & - ntrcr, hin_max, & - rdg_conv, rdg_shear, & - aicen, & - trcrn, & - vicen, vsnon, & - aice0, & - trcr_depend, & - trcr_base, & - n_trcr_strata, & - nt_strata, & - krdg_partic, krdg_redist, & - mu_rdg, tr_brine, & - dardg1dt, dardg2dt, & - dvirdgdt, opening, & - fpond, & - fresh, fhocn, & - faero_ocn, fiso_ocn, & - aparticn, krdgn, & - aredistn, vredistn, & - dardg1ndt, dardg2ndt, & - dvirdgndt, & - araftn, vraftn, & - closing ) - + if (present(fiso_ocn)) then + allocate(l_fiso_ocn(size(fiso_ocn))) + l_fiso_ocn = fiso_ocn else + ! check tr_iso = true ??? + allocate(l_fiso_ocn(1)) + l_fiso_ocn = c0 + endif - call ridge_ice (dt, ndtd, & - ncat, n_aero, & - n_iso, & - nilyr, nslyr, & - ntrcr, hin_max, & - rdg_conv, rdg_shear, & - aicen, & - trcrn, & - vicen, vsnon, & - aice0, & - trcr_depend, & - trcr_base, & - n_trcr_strata, & - nt_strata, & - krdg_partic, krdg_redist, & - mu_rdg, tr_brine, & - dardg1dt, dardg2dt, & - dvirdgdt, opening, & - fpond, & - fresh, fhocn, & - faero_ocn, fiso_ocn, & - aparticn, krdgn, & - aredistn, vredistn, & - dardg1ndt, dardg2ndt, & - dvirdgndt, & - araftn, vraftn ) - + if (present(closing)) then + l_closing_flag = .true. + l_closing = closing + else + l_closing_flag = .false. + l_closing = c0 endif + call ridge_ice (dt, ndtd, & + ncat, n_aero, & + nilyr, nslyr, & + ntrcr, hin_max, & + rdg_conv, rdg_shear, & + aicen, & + trcrn, & + vicen, vsnon, & + aice0, & + trcr_depend, & + trcr_base, & + n_trcr_strata, & + nt_strata, & + krdg_partic, krdg_redist, & + mu_rdg, tr_brine, & + dardg1dt, dardg2dt, & + dvirdgdt, opening, & + fpond, & + fresh, fhocn, & + faero_ocn, l_fiso_ocn, & + aparticn, krdgn, & + aredistn, vredistn, & + dardg1ndt, dardg2ndt, & + dvirdgndt, & + araftn, vraftn, & + l_closing_flag, & + l_closing ) if (icepack_warnings_aborted(subname)) return !----------------------------------------------------------------- @@ -1920,20 +1907,23 @@ subroutine icepack_step_ridge (dt, ndtd, & aicen, trcrn, & vicen, vsnon, & aice0, aice, & - n_aero, n_iso, & + n_aero, & nbtrcr, nblyr, & - tr_aero, tr_iso, & + tr_aero, & tr_pond_topo, heat_capacity, & first_ice, & trcr_depend, trcr_base, & n_trcr_strata, nt_strata, & fpond, fresh, & fsalt, fhocn, & - faero_ocn, fiso_ocn, & + faero_ocn, l_fiso_ocn, & fzsal, & flux_bio) if (icepack_warnings_aborted(subname)) return + if (present(fiso_ocn)) fiso_ocn = l_fiso_ocn + deallocate(l_fiso_ocn) + end subroutine icepack_step_ridge !======================================================================= diff --git a/columnphysics/icepack_therm_itd.F90 b/columnphysics/icepack_therm_itd.F90 index ffd60ca79..be094ebb1 100644 --- a/columnphysics/icepack_therm_itd.F90 +++ b/columnphysics/icepack_therm_itd.F90 @@ -45,7 +45,7 @@ module icepack_therm_itd use icepack_itd, only: reduce_area, cleanup_itd use icepack_itd, only: aggregate_area, shift_ice use icepack_itd, only: column_sum, column_conservation_check - use icepack_isotope, only: isoice_alpha, frac + use icepack_isotope, only: isoice_alpha, isotope_frac_method use icepack_mushy_physics, only: liquidus_temperature_mush, enthalpy_mush use icepack_therm_shared, only: hfrazilmin use icepack_therm_shared, only: hi_min @@ -854,7 +854,7 @@ end subroutine update_vertical_tracers ! subroutine lateral_melt (dt, ncat, & nilyr, nslyr, & - n_aero, n_iso, & + n_aero, & fpond, & fresh, fsalt, & fhocn, faero_ocn, & @@ -878,7 +878,6 @@ subroutine lateral_melt (dt, ncat, & nblyr , & ! number of bio layers nslyr , & ! number of snow layers n_aero , & ! number of aerosol tracers - n_iso , & ! number of isotope tracers nbtrcr ! number of bio tracers real (kind=dbl_kind), dimension (:), intent(inout) :: & @@ -1250,7 +1249,7 @@ end subroutine lateral_melt ! subroutine add_new_ice (ncat, nilyr, & nfsd, nblyr, & - n_aero, n_iso, dt, & + n_aero, dt, & ntrcr, nltrcr, & hin_max, ktherm, & aicen, trcrn, & @@ -1288,7 +1287,6 @@ subroutine add_new_ice (ncat, nilyr, & ntrcr , & ! number of tracers nltrcr, & ! number of zbgc tracers n_aero, & ! number of aerosol tracers - n_iso, & ! number of isotope tracers ktherm ! type of thermodynamics (0 0-layer, 1 BL99, 2 mushy) real (kind=dbl_kind), dimension(0:ncat), intent(in) :: & @@ -1702,11 +1700,11 @@ subroutine add_new_ice (ncat, nilyr, & if (tr_iso .and. vtmp > puny) then do it=1,n_iso if (it==1) & - frazil_conc = isoice_alpha(c0,'HDO' ,frac)*HDO_ocn + frazil_conc = isoice_alpha(c0,'HDO' ,isotope_frac_method)*HDO_ocn if (it==2) & - frazil_conc = isoice_alpha(c0,'H2_16O',frac)*H2_16O_ocn + frazil_conc = isoice_alpha(c0,'H2_16O',isotope_frac_method)*H2_16O_ocn if (it==3) & - frazil_conc = isoice_alpha(c0,'H2_18O',frac)*H2_18O_ocn + frazil_conc = isoice_alpha(c0,'H2_18O',isotope_frac_method)*H2_18O_ocn ! dilution and uptake in the ice trcrn(nt_isoice+it-1,n) & @@ -1824,11 +1822,11 @@ subroutine add_new_ice (ncat, nilyr, & if (tr_iso) then do it=1,n_iso if (it==1) & - frazil_conc = isoice_alpha(c0,'HDO' ,frac)*HDO_ocn + frazil_conc = isoice_alpha(c0,'HDO' ,isotope_frac_method)*HDO_ocn if (it==2) & - frazil_conc = isoice_alpha(c0,'H2_16O',frac)*H2_16O_ocn + frazil_conc = isoice_alpha(c0,'H2_16O',isotope_frac_method)*H2_16O_ocn if (it==3) & - frazil_conc = isoice_alpha(c0,'H2_18O',frac)*H2_18O_ocn + frazil_conc = isoice_alpha(c0,'H2_18O',isotope_frac_method)*H2_18O_ocn trcrn(nt_isoice+it-1,1) & = (trcrn(nt_isoice+it-1,1)*vice1) & @@ -2062,17 +2060,45 @@ subroutine icepack_step_therm2 (dt, ncat, nltrcr, & yday ! day of year ! water isotopes - real (kind=dbl_kind), dimension(:), intent(inout) :: & + real (kind=dbl_kind), dimension(:), optional, intent(inout) :: & fiso_ocn ! isotope flux to ocean (kg/m^2/s) - real (kind=dbl_kind), intent(in) :: & + real (kind=dbl_kind), optional, intent(in) :: & HDO_ocn , & ! ocean concentration of HDO (kg/kg) H2_16O_ocn , & ! ocean concentration of H2_16O (kg/kg) H2_18O_ocn ! ocean concentration of H2_18O (kg/kg) !autodocument_end + ! local variables + + ! water isotopes + real (kind=dbl_kind), dimension(:), allocatable :: & + l_fiso_ocn ! local isotope flux to ocean (kg/m^2/s) + + real (kind=dbl_kind) :: & + l_HDO_ocn , & ! local ocean concentration of HDO (kg/kg) + l_H2_16O_ocn , & ! local ocean concentration of H2_16O (kg/kg) + l_H2_18O_ocn ! local ocean concentration of H2_18O (kg/kg) + character(len=*),parameter :: subname='(icepack_step_therm2)' + !----------------------------------------------------------------- + ! Check optional arguments and set local values + !----------------------------------------------------------------- + + if (present(fiso_ocn)) then + allocate(l_fiso_ocn(size(fiso_ocn))) + l_fiso_ocn(:) = fiso_ocn(:) + else + allocate(l_fiso_ocn(1)) + l_fiso_ocn(:) = c0 + endif + l_HDO_ocn = c0 + l_H2_16O_ocn = c0 + l_H2_18O_ocn = c0 + if (present(HDO_ocn) ) l_HDO_ocn = HDO_ocn + if (present(H2_16O_ocn)) l_H2_16O_ocn = H2_16O_ocn + if (present(H2_18O_ocn)) l_H2_18O_ocn = H2_18O_ocn !----------------------------------------------------------------- ! Let rain drain through to the ocean. @@ -2133,7 +2159,7 @@ subroutine icepack_step_therm2 (dt, ncat, nltrcr, & call add_new_ice (ncat, nilyr, & nfsd, nblyr, & - n_aero, n_iso, dt, & + n_aero, dt, & ntrcr, nltrcr, & hin_max, ktherm, & aicen, trcrn, & @@ -2149,9 +2175,9 @@ subroutine icepack_step_therm2 (dt, ncat, nltrcr, & cgrid, igrid, & nbtrcr, flux_bio, & ocean_bio, fzsal, & - frazil_diag, fiso_ocn, & - HDO_ocn, H2_16O_ocn, & - H2_18O_ocn, & + frazil_diag, l_fiso_ocn, & + l_HDO_ocn, l_H2_16O_ocn, & + l_H2_18O_ocn, & wave_sig_ht, & wave_spectrum, & wavefreq, dwavefreq, & @@ -2166,11 +2192,10 @@ subroutine icepack_step_therm2 (dt, ncat, nltrcr, & call lateral_melt (dt, ncat, & nilyr, nslyr, & - n_aero, n_iso, & - fpond, & + n_aero, fpond, & fresh, fsalt, & fhocn, faero_ocn, & - fiso_ocn, & + l_fiso_ocn, & rside, meltl, & fside, sss, & aicen, vicen, & @@ -2213,19 +2238,24 @@ subroutine icepack_step_therm2 (dt, ncat, nltrcr, & aicen, trcrn(1:ntrcr,:), & vicen, vsnon, & aice0, aice, & - n_aero, n_iso, & + n_aero, & nbtrcr, nblyr, & - tr_aero, tr_iso, & + tr_aero, & tr_pond_topo, heat_capacity, & first_ice, & trcr_depend, trcr_base, & n_trcr_strata, nt_strata, & fpond, fresh, & fsalt, fhocn, & - faero_ocn, fiso_ocn, & + faero_ocn, l_fiso_ocn, & fzsal, flux_bio) if (icepack_warnings_aborted(subname)) return + if (present(fiso_ocn)) then + fiso_ocn(:) = l_fiso_ocn(:) + endif + deallocate(l_fiso_ocn) + end subroutine icepack_step_therm2 !======================================================================= diff --git a/columnphysics/icepack_therm_vertical.F90 b/columnphysics/icepack_therm_vertical.F90 index 6a2575c9d..9cb4ace1a 100644 --- a/columnphysics/icepack_therm_vertical.F90 +++ b/columnphysics/icepack_therm_vertical.F90 @@ -2194,17 +2194,17 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & mlt_onset , & ! day of year that sfc melting begins frz_onset ! day of year that freezing begins (congel or frazil) - real (kind=dbl_kind), dimension(n_iso), intent(inout) :: & + real (kind=dbl_kind), dimension(:), optional, intent(inout) :: & Qa_iso , & ! isotope specific humidity (kg/kg) Qref_iso , & ! isotope 2m atm reference spec humidity (kg/kg) - fiso_atm , & ! isotope deposition rate (kg/m^2 s) - fiso_ocn , & ! isotope flux to ocean (kg/m^2/s) - fiso_evap ! isotope evaporation (kg/m^2/s) + fiso_atm , & ! isotope deposition rate (kg/m^2 s) + fiso_ocn , & ! isotope flux to ocean (kg/m^2/s) + fiso_evap ! isotope evaporation (kg/m^2/s) - real (kind=dbl_kind), intent(in) :: & - HDO_ocn , & ! ocean concentration of HDO (kg/kg) - H2_16O_ocn , & ! ocean concentration of H2_16O (kg/kg) - H2_18O_ocn ! ocean concentration of H2_18O (kg/kg) + real (kind=dbl_kind), optional, intent(in) :: & + HDO_ocn , & ! ocean concentration of HDO (kg/kg) + H2_16O_ocn , & ! ocean concentration of H2_16O (kg/kg) + H2_18O_ocn ! ocean concentration of H2_18O (kg/kg) real (kind=dbl_kind), dimension(:), intent(inout) :: & aicen_init , & ! fractional area of ice @@ -2255,9 +2255,9 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & aerosno , & ! snow aerosol tracer (kg/m^2) aeroice ! ice aerosol tracer (kg/m^2) - real (kind=dbl_kind), dimension(:,:), intent(inout) :: & - isosno , & ! snow isotope tracer (kg/m^2) - isoice ! ice isotope tracer (kg/m^2) + real (kind=dbl_kind), dimension(:,:), optional, intent(inout) :: & + isosno , & ! snow isotope tracer (kg/m^2) + isoice ! ice isotope tracer (kg/m^2) !autodocument_end ! local variables @@ -2293,11 +2293,96 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & fiso_ocnn , & ! isotope flux to ocean (kg/m^2/s) fiso_evapn ! isotope evaporation (kg/m^2/s) + real (kind=dbl_kind), allocatable, dimension(:,:) :: & + l_isosno , & ! local snow isotope tracer (kg/m^2) + l_isoice ! local ice isotope tracer (kg/m^2) + + real (kind=dbl_kind), allocatable, dimension(:) :: & + l_Qa_iso , & ! local isotope specific humidity (kg/kg) + l_Qref_iso , & ! local isotope 2m atm reference spec humidity (kg/kg) + l_fiso_atm , & ! local isotope deposition rate (kg/m^2 s) + l_fiso_ocn , & ! local isotope flux to ocean (kg/m^2/s) + l_fiso_evap ! local isotope evaporation (kg/m^2/s) + + real (kind=dbl_kind) :: & + l_HDO_ocn , & ! local ocean concentration of HDO (kg/kg) + l_H2_16O_ocn, & ! local ocean concentration of H2_16O (kg/kg) + l_H2_18O_ocn ! local ocean concentration of H2_18O (kg/kg) + real (kind=dbl_kind) :: & pond ! water retained in ponds (m) character(len=*),parameter :: subname='(icepack_step_therm1)' + !----------------------------------------------------------------- + ! allocate local optional arguments + !----------------------------------------------------------------- + + if (present(isosno) ) then + allocate(l_isosno(size(isosno,dim=1),size(isosno,dim=2))) + l_isosno = isosno + else + allocate(l_isosno(1,1)) + l_isosno = c0 + endif + + if (present(isoice) ) then + allocate(l_isoice(size(isoice,dim=1),size(isoice,dim=2))) + l_isoice = isoice + else + allocate(l_isoice(1,1)) + l_isoice = c0 + endif + + if (present(Qa_iso) ) then + allocate(l_Qa_iso(size(Qa_iso))) + l_Qa_iso = Qa_iso + else + allocate(l_Qa_iso(1)) + l_Qa_iso = c0 + endif + + if (present(Qref_iso) ) then + allocate(l_Qref_iso(size(Qref_iso))) + l_Qref_iso = Qref_iso + else + allocate(l_Qref_iso(1)) + l_Qref_iso = c0 + endif + + if (present(fiso_atm) ) then + allocate(l_fiso_atm(size(fiso_atm))) + l_fiso_atm = fiso_atm + else + allocate(l_fiso_atm(1)) + l_fiso_atm = c0 + endif + + if (present(fiso_ocn) ) then + allocate(l_fiso_ocn(size(fiso_ocn))) + l_fiso_ocn = fiso_ocn + else + allocate(l_fiso_ocn(1)) + l_fiso_ocn = c0 + endif + + if (present(fiso_evap) ) then + allocate(l_fiso_evap(size(fiso_evap))) + l_fiso_evap = fiso_evap + else + allocate(l_fiso_evap(1)) + l_fiso_evap = c0 + endif + + l_HDO_ocn = c0 + if (present(HDO_ocn) ) l_HDO_ocn = HDO_ocn + + l_H2_16O_ocn = c0 + if (present(H2_16O_ocn)) l_H2_16O_ocn = H2_16O_ocn + + l_H2_18O_ocn = c0 + if (present(H2_18O_ocn)) l_H2_18O_ocn = H2_18O_ocn + !----------------------------------------------------------------- ! Adjust frzmlt to account for ice-ocean heat fluxes since last ! call to coupler. @@ -2318,7 +2403,7 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & fside) if (icepack_warnings_aborted(subname)) return - + !----------------------------------------------------------------- ! Update the neutral drag coefficients to account for form drag ! Oceanic and atmospheric drag coefficients @@ -2387,8 +2472,7 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & lhcoef, shcoef, & Cdn_atm, & Cdn_atm_ratio_n, & - n_iso=n_iso, & - Qa_iso=Qa_iso, & + Qa_iso=l_Qa_iso, & Qref_iso=Qrefn_iso, & uvel=uvel, vvel=vvel, & Uref=Urefn) @@ -2505,22 +2589,23 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & if (tr_iso) then call update_isotope (dt = dt, & - nilyr = nilyr, nslyr = nslyr, n_iso = n_iso, & + nilyr = nilyr, nslyr = nslyr, & meltt = melttn(n),melts = meltsn(n), & meltb = meltbn(n),congel=congeln(n), & snoice=snoicen(n),evap=evapn, & fsnow=fsnow, Tsfc=Tsfc(n), & Qref_iso=Qrefn_iso(:), & - isosno=isosno(:,n),isoice=isoice(:,n), & + isosno=l_isosno(:,n),isoice=l_isoice(:,n), & aice_old=aicen_init(n),vice_old=vicen_init(n), & vsno_old=vsnon_init(n), & vicen=vicen(n),vsnon=vsnon(n), & aicen=aicen(n), & - fiso_atm=fiso_atm(:), & + fiso_atm=l_fiso_atm(:), & fiso_evapn=fiso_evapn(:), & fiso_ocnn=fiso_ocnn(:), & - HDO_ocn=HDO_ocn,H2_16O_ocn=H2_16O_ocn, & - H2_18O_ocn=H2_18O_ocn) + HDO_ocn=l_HDO_ocn,H2_16O_ocn=l_H2_16O_ocn, & + H2_18O_ocn=l_H2_18O_ocn) + if (icepack_warnings_aborted(subname)) return endif endif ! aicen_init @@ -2623,15 +2708,33 @@ subroutine icepack_step_therm1(dt, ncat, nilyr, nslyr, & meltt, melts, & meltb, congel, & snoice, & - Uref=Uref, Urefn=Urefn, & - Qref_iso=Qref_iso,Qrefn_iso=Qrefn_iso, & - fiso_ocn=fiso_ocn,fiso_ocnn=fiso_ocnn, & - fiso_evap=fiso_evap,fiso_evapn=fiso_evapn) + Uref=Uref, Urefn=Urefn, & + Qref_iso=l_Qref_iso, & + Qrefn_iso=Qrefn_iso, & + fiso_ocn=l_fiso_ocn, & + fiso_ocnn=fiso_ocnn, & + fiso_evap=l_fiso_evap, & + fiso_evapn=fiso_evapn) if (icepack_warnings_aborted(subname)) return enddo ! ncat + if (present(isosno) ) isosno = l_isosno + if (present(isoice) ) isoice = l_isoice + if (present(Qa_iso) ) Qa_iso = l_Qa_iso + if (present(Qref_iso) ) Qref_iso = l_Qref_iso + if (present(fiso_atm) ) fiso_atm = l_fiso_atm + if (present(fiso_ocn) ) fiso_ocn = l_fiso_ocn + if (present(fiso_evap)) fiso_evap= l_fiso_evap + deallocate(l_isosno) + deallocate(l_isoice) + deallocate(l_Qa_iso) + deallocate(l_Qref_iso) + deallocate(l_fiso_atm) + deallocate(l_fiso_ocn) + deallocate(l_fiso_evap) + !----------------------------------------------------------------- ! Calculate ponds from the topographic scheme !----------------------------------------------------------------- diff --git a/configuration/driver/icedrv_diagnostics.F90 b/configuration/driver/icedrv_diagnostics.F90 index 690be91ac..7472a94b0 100644 --- a/configuration/driver/icedrv_diagnostics.F90 +++ b/configuration/driver/icedrv_diagnostics.F90 @@ -216,16 +216,17 @@ subroutine runtime_diags (dt) if (tr_iso) then do k = 1, n_iso - write(nu_diag_out+n-1,900) 'isotopic precip = ',fiso_atm(n,k)*dt - write(nu_diag_out+n-1,900) 'isotopic evap/cond = ',fiso_evap(n,k)*dt - write(nu_diag_out+n-1,900) 'isotopic loss to ocn = ',fiso_ocn(n,k)*dt - write(nu_diag_out+n-1,900) 'isotopic gain/loss = ',(fiso_atm(n,k)-fiso_ocn(n,k)+fiso_evap(n,k))*dt - write(nu_diag_out+n-1,900) 'isotopic conc chg = ',pdiso(n,k) + write(nu_diag_out+n-1,901) 'isotopic precip = ',fiso_atm(n,k)*dt,k + write(nu_diag_out+n-1,901) 'isotopic evap/cond = ',fiso_evap(n,k)*dt,k + write(nu_diag_out+n-1,901) 'isotopic loss to ocn = ',fiso_ocn(n,k)*dt,k + write(nu_diag_out+n-1,901) 'isotopic gain/loss = ',(fiso_atm(n,k)-fiso_ocn(n,k)+fiso_evap(n,k))*dt,k + write(nu_diag_out+n-1,901) 'isotopic conc chg = ',pdiso(n,k),k enddo endif end do 899 format (43x,a24) 900 format (a25,2x,f24.17) +901 format (a25,2x,f24.17,i6) end subroutine runtime_diags diff --git a/configuration/driver/icedrv_restart.F90 b/configuration/driver/icedrv_restart.F90 index 7294ab0ed..677d28cf3 100644 --- a/configuration/driver/icedrv_restart.F90 +++ b/configuration/driver/icedrv_restart.F90 @@ -908,8 +908,8 @@ subroutine read_restart_iso() write(nu_diag,*) 'read_restart_iso (isotopes)' do k = 1, n_iso - call read_restart_field(nu_dump, trcrn(:,nt_isosno+(k-1),:), ncat) - call read_restart_field(nu_dump, trcrn(:,nt_isoice+(k-1),:), ncat) + call read_restart_field(nu_restart, trcrn(:,nt_isosno+(k-1),:), ncat) + call read_restart_field(nu_restart, trcrn(:,nt_isoice+(k-1),:), ncat) enddo end subroutine read_restart_iso diff --git a/configuration/driver/icedrv_step.F90 b/configuration/driver/icedrv_step.F90 index a51a79301..9fe0409d6 100644 --- a/configuration/driver/icedrv_step.F90 +++ b/configuration/driver/icedrv_step.F90 @@ -721,7 +721,7 @@ subroutine step_dyn_ridge (dt, ndtd) dvirdgdt=dvirdgdt(i), opening=opening(i), & fpond=fpond(i), & fresh=fresh(i), fhocn=fhocn(i), & - n_aero=n_aero, n_iso=n_iso, & + n_aero=n_aero, & faero_ocn=faero_ocn(i,:), fiso_ocn=fiso_ocn(i,:), & aparticn=aparticn(i,:), krdgn=krdgn(i,:), & aredistn=aredistn(i,:), vredistn=vredistn(i,:), & @@ -764,7 +764,7 @@ subroutine step_dyn_ridge (dt, ndtd) dvirdgdt=dvirdgdt(i), opening=opening(i), & fpond=fpond(i), & fresh=fresh(i), fhocn=fhocn(i), & - n_aero=n_aero, n_iso=n_iso, & + n_aero=n_aero, & faero_ocn=faero_ocn(i,:), fiso_ocn=fiso_ocn(i,:), & aparticn=aparticn(i,:), krdgn=krdgn(i,:), & aredistn=aredistn(i,:), vredistn=vredistn(i,:), & diff --git a/configuration/scripts/tests/base_suite.ts b/configuration/scripts/tests/base_suite.ts index 14cfd3019..cbb9b587e 100644 --- a/configuration/scripts/tests/base_suite.ts +++ b/configuration/scripts/tests/base_suite.ts @@ -22,6 +22,7 @@ restart col 1x1 pondtopo restart col 1x1 bgcISPOL restart col 1x1 thermo1 restart col 1x1 swccsm3 +restart col 1x1 isotope restart col 1x1 alt01 restart col 1x1 alt02 restart col 1x1 alt03 diff --git a/doc/source/developer_guide/dg_col_phys.rst b/doc/source/developer_guide/dg_col_phys.rst index fcdc9d2b1..7aa2fed69 100755 --- a/doc/source/developer_guide/dg_col_phys.rst +++ b/doc/source/developer_guide/dg_col_phys.rst @@ -74,6 +74,83 @@ write interfaces that provides access to internal column physics settings. The should not have to use "use" statements to access any of the column physics data outside of what is provided through the icepack_intfc module. The public column physics interfaces use optional arguments where it makes sense and -there is an ongoing effort to make more of the interfaces support keyword=value arguments -for clarity and backwards compatibility. +there is an ongoing effort to extend the optional arguments supported. It's strongly recommended +that calls to the icepack interfaces be done with keyword=value arguments. All icepack arguments +support this method. + +Overall, columnphysics changes in the Icepack model should include the following + + - All modules should have the following set at the top:: + + implicit none + private + + - Any public module interfaces or data should be explicitly specified + + - All subroutines and functions should define the subname character parameter statement to match the interface name like:: + + character(len=*),parameter :: subname='(lateral_melt_bgc)' + + - The icepack_warnings package should be used to cache log messages and set the abort flag. To add a log message, use icepack_warnings_add like:: + + call icepack_warnings_add(subname//' algorithm did not converge') + + To formally set the abort flag, use:: + + call icepack_warnings_setabort(.true.,__FILE__,__LINE__) + + See also :ref:`aborts` for more information about how the external calling program will write those message and check whether Icepack aborted. + + - Every interface call within the columnphysics should be followed by:: + + if (icepack_warnings_aborted(subname)) return + + to support errors backing up the call tree to the external program + + - Variables defined in icepack_kinds, icepack_tracers, icepack_parameters, and icepack_orbital should be accessed within Icepack by Fortran use statements. It's also possible to access some of those variables thru methods that query for the value, but this tends to be a little more cumbersome, so Fortran use statements are recommended within columnphysics. From the icepack driver or other external programs, the columnphysics variables should ALWAYS be access thru the interface methods and icepack_intfc (see also :ref:`calling`). + + - Optional arguments are encouraged in the public Icepack interfaces but should generally be avoided in interfaces within the columnphysics. There are several reasons for taking this approach. There is a desire to support backwards compatible Icepack public interfaces as much as possible, so optional arguments will be used for some future extensions. There is also a desire to allow users to pass only the data thru the Icepack interfaces that is needed. To support optional tracers and features, optional arguments are needed. Within the internal columnphysics calling tree, optional arguments are discouraged because they tend to add complexity to deep calling trees and often lead to implementations with many calls to the same interface that only vary by which arguments are passed. In the long term, that approach is not sustainable. As a result, a scheme has been developed to support optional arguments in the public interfaces while minimizing optional arguments within the columphysics. Within the columnphysics, we suggest optional arguments available thru the public interfaces should generally be treated as follows + - Check whether optional arguments are passed and create temporary data to store the values + - The temporary data should be locally name l_${argument_name} + - The temporary data should be allocated at runtime if it's not a scalar based on the size of the incoming argument + - The optional argument values should be copied into the temporary data + - The temporary data should be passed thru other columnphysics subroutines + - The temporary data should be deallocated at the end of the method if it was allocated + - The temporary data should be copied back to the argument if the argument intent is out or inout + - If optional arguments are not passed, temporary data should be created of size 1 with values of c0, and they should be passed thru other columnphysics subroutines + - A logical can be instantiated and passed down the columnphysics interface to manage any logic related to whether valid or fake data is being passed down the calling tree. See **closing_flag** and **iso_flag** within the columnphysics as examples. There may also be externally set logicals that can be used to control how the optional features are handles. See **tr_iso** within the columnphysics as an example. + - An example of how this might look is:: + + subroutine icepack_example_interface(arg1, arg2, ...) + real (kind=dbl_kind), intent(inout) :: arg1 + real (kind=dbl_kind), optional, dimension(:), intent(inout) :: arg2 + ! + real (kind=dbl_kind), allocatable, dimension(:) :: l_arg2 + logical :: arg2_flag + + character(len=*), parameter :: subname = '(icepack_example_interface)' + + if (present(arg2)) then + arg2_flag = .true. + allocate(l_arg2(size(arg2))) + l_arg2 = arg2 + else + arg2_flag = .false. + allocate(l_arg2(1)) + l_arg2 = c0 + endif + + ... + + call some_columnphysics_subroutine(arg1, l_arg2, arg2_flag, ...) + + ... + + if (present(arg2)) then + arg2 = l_arg2 + endif + deallocate(l_arg2) + + return + end subroutine diff --git a/doc/source/user_guide/interfaces.include b/doc/source/user_guide/interfaces.include index 1fb2412f9..7bd36e8bc 100644 --- a/doc/source/user_guide/interfaces.include +++ b/doc/source/user_guide/interfaces.include @@ -7,7 +7,7 @@ icepack_atm_boundary ! - subroutine icepack_atm_boundary(sfctype, & + subroutine icepack_atm_boundary(sfctype, & Tsf, potT, & uatm, vatm, & wind, zlvl, & @@ -18,6 +18,7 @@ icepack_atm_boundary lhcoef, shcoef, & Cdn_atm, & Cdn_atm_ratio_n, & + Qa_iso, Qref_iso, & uvel, vvel, & Uref) @@ -51,6 +52,12 @@ icepack_atm_boundary shcoef , & ! transfer coefficient for sensible heat lhcoef ! transfer coefficient for latent heat + real (kind=dbl_kind), intent(in), optional, dimension(:) :: & + Qa_iso ! specific isotopic humidity (kg/kg) + + real (kind=dbl_kind), intent(inout), optional, dimension(:) :: & + Qref_iso ! reference specific isotopic humidity (kg/kg) + real (kind=dbl_kind), optional, intent(in) :: & uvel , & ! x-direction ice speed (m/s) vvel ! y-direction ice speed (m/s) @@ -148,6 +155,7 @@ icepack_intfc.F90 use icepack_tracers, only: icepack_max_don => max_don use icepack_tracers, only: icepack_max_fe => max_fe use icepack_tracers, only: icepack_max_aero => max_aero + use icepack_tracers, only: icepack_max_iso => max_iso use icepack_tracers, only: icepack_nmodal1 => nmodal1 use icepack_tracers, only: icepack_nmodal2 => nmodal2 use icepack_parameters, only: icepack_nspint => nspint @@ -398,7 +406,7 @@ icepack_step_ridge fpond, & fresh, fhocn, & n_aero, & - faero_ocn, & + faero_ocn, fiso_ocn, & aparticn, krdgn, & aredistn, vredistn, & dardg1ndt, dardg2ndt, & @@ -467,6 +475,9 @@ icepack_step_ridge faero_ocn, & ! aerosol flux to ocean (kg/m^2/s) flux_bio ! all bio fluxes to ocean + real (kind=dbl_kind), dimension(:), optional, intent(inout) :: & + fiso_ocn ! isotope flux to ocean (kg/m^2/s) + real (kind=dbl_kind), dimension(:,:), intent(inout) :: & trcrn ! tracers @@ -1533,6 +1544,8 @@ icepack_step_therm2 flux_bio, ocean_bio, & frazil_diag, & frz_onset, yday, & + fiso_ocn, HDO_ocn, & + H2_16O_ocn, H2_18O_ocn, & nfsd, wave_sig_ht, & wave_spectrum, & wavefreq, & @@ -1640,6 +1653,14 @@ icepack_step_therm2 real (kind=dbl_kind), intent(in), optional :: & yday ! day of year + ! water isotopes + real (kind=dbl_kind), dimension(:), optional, intent(inout) :: & + fiso_ocn ! isotope flux to ocean (kg/m^2/s) + + real (kind=dbl_kind), optional, intent(in) :: & + HDO_ocn , & ! ocean concentration of HDO (kg/kg) + H2_16O_ocn , & ! ocean concentration of H2_16O (kg/kg) + H2_18O_ocn ! ocean concentration of H2_18O (kg/kg) .. _icepack_init_thermo: @@ -1798,11 +1819,14 @@ icepack_step_therm1 ipnd , & iage , FY , & aerosno , aeroice , & + isosno , isoice , & uatm , vatm , & wind , zlvl , & Qa , rhoa , & + Qa_iso , & Tair , Tref , & Qref , Uref , & + Qref_iso , & Cdn_atm_ratio, & Cdn_ocn , Cdn_ocn_skin, & Cdn_ocn_floe, Cdn_ocn_keel, & @@ -1841,6 +1865,10 @@ icepack_step_therm1 flatn_f , fsensn_f , & fsurfn_f , fcondtopn_f , & faero_atm , faero_ocn , & + fiso_atm , fiso_ocn , & + fiso_evap , & + HDO_ocn , H2_16O_ocn , & + H2_18O_ocn , & dhsn , ffracn , & meltt , melttn , & meltb , meltbn , & @@ -1944,6 +1972,18 @@ icepack_step_therm1 mlt_onset , & ! day of year that sfc melting begins frz_onset ! day of year that freezing begins (congel or frazil) + real (kind=dbl_kind), dimension(:), optional, intent(inout) :: & + Qa_iso , & ! isotope specific humidity (kg/kg) + Qref_iso , & ! isotope 2m atm reference spec humidity (kg/kg) + fiso_atm , & ! isotope deposition rate (kg/m^2 s) + fiso_ocn , & ! isotope flux to ocean (kg/m^2/s) + fiso_evap ! isotope evaporation (kg/m^2/s) + + real (kind=dbl_kind), optional, intent(in) :: & + HDO_ocn , & ! ocean concentration of HDO (kg/kg) + H2_16O_ocn , & ! ocean concentration of H2_16O (kg/kg) + H2_18O_ocn ! ocean concentration of H2_18O (kg/kg) + real (kind=dbl_kind), dimension(:), intent(inout) :: & aicen_init , & ! fractional area of ice vicen_init , & ! volume per unit area of ice (m) @@ -1993,6 +2033,9 @@ icepack_step_therm1 aerosno , & ! snow aerosol tracer (kg/m^2) aeroice ! ice aerosol tracer (kg/m^2) + real (kind=dbl_kind), dimension(:,:), optional, intent(inout) :: & + isosno , & ! snow isotope tracer (kg/m^2) + isoice ! ice isotope tracer (kg/m^2) .. _icepack_init_tracer_flags: @@ -2006,7 +2049,7 @@ icepack_init_tracer_flags subroutine icepack_init_tracer_flags(& tr_iage_in, tr_FY_in, tr_lvl_in, & tr_pond_in, tr_pond_cesm_in, tr_pond_lvl_in, tr_pond_topo_in, & - tr_fsd_in, tr_aero_in, tr_brine_in, tr_zaero_in, & + tr_fsd_in, tr_aero_in, tr_iso_in, tr_brine_in, tr_zaero_in, & tr_bgc_Nit_in, tr_bgc_N_in, tr_bgc_DON_in, tr_bgc_C_in, tr_bgc_chl_in, & tr_bgc_Am_in, tr_bgc_Sil_in, tr_bgc_DMS_in, tr_bgc_Fe_in, tr_bgc_hum_in, & tr_bgc_PON_in) @@ -2020,6 +2063,7 @@ icepack_init_tracer_flags tr_pond_lvl_in , & ! if .true., use level-ice pond tracer tr_pond_topo_in , & ! if .true., use explicit topography-based ponds tr_fsd_in , & ! if .true., use floe size distribution tracers + tr_iso_in , & ! if .true., use isotope tracers tr_aero_in , & ! if .true., use aerosol tracers tr_brine_in , & ! if .true., brine height differs from ice thickness tr_zaero_in , & ! if .true., black carbon is tracers (n_zaero) @@ -2048,7 +2092,7 @@ icepack_query_tracer_flags subroutine icepack_query_tracer_flags(& tr_iage_out, tr_FY_out, tr_lvl_out, & tr_pond_out, tr_pond_cesm_out, tr_pond_lvl_out, tr_pond_topo_out, & - tr_fsd_out, tr_aero_out, tr_brine_out, tr_zaero_out, & + tr_fsd_out, tr_aero_out, tr_iso_out, tr_brine_out, tr_zaero_out, & tr_bgc_Nit_out, tr_bgc_N_out, tr_bgc_DON_out, tr_bgc_C_out, tr_bgc_chl_out, & tr_bgc_Am_out, tr_bgc_Sil_out, tr_bgc_DMS_out, tr_bgc_Fe_out, tr_bgc_hum_out, & tr_bgc_PON_out) @@ -2062,6 +2106,7 @@ icepack_query_tracer_flags tr_pond_lvl_out , & ! if .true., use level-ice pond tracer tr_pond_topo_out , & ! if .true., use explicit topography-based ponds tr_fsd_out , & ! if .true., use floe size distribution + tr_iso_out , & ! if .true., use isotope tracers tr_aero_out , & ! if .true., use aerosol tracers tr_brine_out , & ! if .true., brine height differs from ice thickness tr_zaero_out , & ! if .true., black carbon is tracers (n_zaero) @@ -2105,7 +2150,8 @@ icepack_init_tracer_indices nt_Tsfc_in, nt_qice_in, nt_qsno_in, nt_sice_in, & nt_fbri_in, nt_iage_in, nt_FY_in, & nt_alvl_in, nt_vlvl_in, nt_apnd_in, nt_hpnd_in, nt_ipnd_in, & - nt_fsd_in, nt_aero_in, nt_zaero_in, nt_bgc_C_in, & + nt_fsd_in, nt_isosno_in, nt_isoice_in, & + nt_aero_in, nt_zaero_in, nt_bgc_C_in, & nt_bgc_N_in, nt_bgc_chl_in, nt_bgc_DOC_in, nt_bgc_DON_in, & nt_bgc_DIC_in, nt_bgc_Fed_in, nt_bgc_Fep_in, nt_bgc_Nit_in, nt_bgc_Am_in, & nt_bgc_Sil_in, nt_bgc_DMSPp_in, nt_bgc_DMSPd_in, nt_bgc_DMS_in, nt_bgc_hum_in, & @@ -2131,7 +2177,9 @@ icepack_init_tracer_indices nt_hpnd_in, & ! melt pond depth nt_ipnd_in, & ! melt pond refrozen lid thickness nt_fsd_in, & ! floe size distribution - nt_aero_in, & ! starting index for aerosols in ice + nt_isosno_in, & ! starting index for isotopes in snow + nt_isoice_in, & ! starting index for isotopes in ice + nt_aero_in, & ! starting index for aerosols in ice nt_bgc_Nit_in, & ! nutrients nt_bgc_Am_in, & ! nt_bgc_Sil_in, & ! @@ -2201,7 +2249,8 @@ icepack_query_tracer_indices nt_Tsfc_out, nt_qice_out, nt_qsno_out, nt_sice_out, & nt_fbri_out, nt_iage_out, nt_FY_out, & nt_alvl_out, nt_vlvl_out, nt_apnd_out, nt_hpnd_out, nt_ipnd_out, & - nt_fsd_out, nt_aero_out, nt_zaero_out, nt_bgc_C_out, & + nt_fsd_out, nt_isosno_out, nt_isoice_out, & + nt_aero_out, nt_zaero_out, nt_bgc_C_out, & nt_bgc_N_out, nt_bgc_chl_out, nt_bgc_DOC_out, nt_bgc_DON_out, & nt_bgc_DIC_out, nt_bgc_Fed_out, nt_bgc_Fep_out, nt_bgc_Nit_out, nt_bgc_Am_out, & nt_bgc_Sil_out, nt_bgc_DMSPp_out, nt_bgc_DMSPd_out, nt_bgc_DMS_out, nt_bgc_hum_out, & @@ -2227,7 +2276,9 @@ icepack_query_tracer_indices nt_hpnd_out, & ! melt pond depth nt_ipnd_out, & ! melt pond refrozen lid thickness nt_fsd_out, & ! floe size distribution - nt_aero_out, & ! starting index for aerosols in ice + nt_isosno_out, & ! starting index for isotopes in snow + nt_isoice_out, & ! starting index for isotopes in ice + nt_aero_out, & ! starting index for aerosols in ice nt_bgc_Nit_out, & ! nutrients nt_bgc_Am_out, & ! nt_bgc_Sil_out, & ! @@ -2309,7 +2360,7 @@ icepack_init_tracer_sizes subroutine icepack_init_tracer_sizes(& ncat_in, nilyr_in, nslyr_in, nblyr_in, nfsd_in , & - n_algae_in, n_DOC_in, n_aero_in, & + n_algae_in, n_DOC_in, n_aero_in, n_iso_in, & n_DON_in, n_DIC_in, n_fed_in, n_fep_in, n_zaero_in, & ntrcr_in, ntrcr_o_in, nbtrcr_in, nbtrcr_sw_in) @@ -2326,6 +2377,7 @@ icepack_init_tracer_sizes n_fed_in , & ! n_fep_in , & ! n_zaero_in, & ! + n_iso_in , & ! n_aero_in , & ! ntrcr_in , & ! number of tracers in use ntrcr_o_in, & ! number of non-bio tracers in use @@ -2347,7 +2399,7 @@ icepack_query_tracer_sizes max_don_out , max_fe_out , nmodal1_out , & nmodal2_out , max_aero_out , max_nbtrcr_out , & ncat_out, nilyr_out, nslyr_out, nblyr_out, nfsd_out, & - n_algae_out, n_DOC_out, n_aero_out, & + n_algae_out, n_DOC_out, n_aero_out, n_iso_out, & n_DON_out, n_DIC_out, n_fed_out, n_fep_out, n_zaero_out, & ntrcr_out, ntrcr_o_out, nbtrcr_out, nbtrcr_sw_out) @@ -2375,6 +2427,7 @@ icepack_query_tracer_sizes n_fed_out , & ! n_fep_out , & ! n_zaero_out, & ! + n_iso_out , & ! n_aero_out , & ! ntrcr_out , & ! number of tracers in use ntrcr_o_out, & ! number of non-bio tracers in use From d704ff8e1b5a6054878c8e5958166b4fb0252711 Mon Sep 17 00:00:00 2001 From: apcraig Date: Sun, 8 Mar 2020 20:22:05 +0000 Subject: [PATCH 05/13] fix document rst --- doc/source/developer_guide/dg_col_phys.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/source/developer_guide/dg_col_phys.rst b/doc/source/developer_guide/dg_col_phys.rst index 7aa2fed69..69b74bf90 100755 --- a/doc/source/developer_guide/dg_col_phys.rst +++ b/doc/source/developer_guide/dg_col_phys.rst @@ -95,17 +95,17 @@ Overall, columnphysics changes in the Icepack model should include the following call icepack_warnings_add(subname//' algorithm did not converge') - To formally set the abort flag, use:: + To formally set the abort flag, use:: call icepack_warnings_setabort(.true.,__FILE__,__LINE__) - See also :ref:`aborts` for more information about how the external calling program will write those message and check whether Icepack aborted. + See also :ref:`aborts` for more information about how the external calling program will write those message and check whether Icepack aborted. - Every interface call within the columnphysics should be followed by:: if (icepack_warnings_aborted(subname)) return - to support errors backing up the call tree to the external program + to support errors backing up the call tree to the external program - Variables defined in icepack_kinds, icepack_tracers, icepack_parameters, and icepack_orbital should be accessed within Icepack by Fortran use statements. It's also possible to access some of those variables thru methods that query for the value, but this tends to be a little more cumbersome, so Fortran use statements are recommended within columnphysics. From the icepack driver or other external programs, the columnphysics variables should ALWAYS be access thru the interface methods and icepack_intfc (see also :ref:`calling`). From cb7aa7b2558d6e35ab65754c2fed8b186d916e5e Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Sun, 29 Mar 2020 05:46:16 -0600 Subject: [PATCH 06/13] fix comment, move declaration --- configuration/driver/icedrv_domain_size.F90 | 2 +- configuration/driver/icedrv_flux.F90 | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/configuration/driver/icedrv_domain_size.F90 b/configuration/driver/icedrv_domain_size.F90 index 7709acbd9..6444c9af5 100644 --- a/configuration/driver/icedrv_domain_size.F90 +++ b/configuration/driver/icedrv_domain_size.F90 @@ -19,7 +19,7 @@ module icedrv_domain_size ncat = NICECAT , & ! number of categories nilyr = NICELYR , & ! number of ice layers per category nslyr = NSNWLYR , & ! number of snow layers per category - n_iso = NTRISO , & ! number of aerosols in use + n_iso = NTRISO , & ! number of isotopes in use n_aero = NTRAERO , & ! number of aerosols in use n_zaero = TRZAERO , & ! number of z aerosols in use n_algae = TRALG , & ! number of algae in use diff --git a/configuration/driver/icedrv_flux.F90 b/configuration/driver/icedrv_flux.F90 index 731c5e18e..4e825742b 100644 --- a/configuration/driver/icedrv_flux.F90 +++ b/configuration/driver/icedrv_flux.F90 @@ -172,7 +172,7 @@ module icedrv_flux alvdf_init, & ! visible, diffuse (fraction) alidf_init ! near-ir, diffuse (fraction) - ! out to ocean + ! out to ocean real (kind=dbl_kind), dimension (nx), public :: & fpond , & ! fresh water flux to ponds (kg/m^2/s) fresh , & ! fresh water flux to ocean (kg/m^2/s) @@ -180,10 +180,6 @@ module icedrv_flux fhocn , & ! net heat flux to ocean (W/m^2) fswthru ! shortwave penetrating to ocean (W/m^2) - real (kind=dbl_kind), dimension (nx,icepack_max_iso), public :: & - Qa_iso , & ! isotope specific humidity (kg/kg) - Qref_iso ! 2m atm reference isotope spec humidity (kg/kg) - ! internal real (kind=dbl_kind), & @@ -303,7 +299,11 @@ module icedrv_flux dimension (nx,icepack_max_nbtrcr), public :: & flux_bio_atm ! all bio fluxes to ice from atmosphere - ! in from ocean + real (kind=dbl_kind), dimension (nx,icepack_max_iso), public :: & + Qa_iso , & ! isotope specific humidity (kg/kg) + Qref_iso ! 2m atm reference isotope spec humidity (kg/kg) + + ! out to ocean real (kind=dbl_kind), & dimension (nx,icepack_max_aero), public :: & @@ -313,8 +313,6 @@ module icedrv_flux dimension (nx,icepack_max_iso), public :: & fiso_ocn ! isotope flux to ocean (kg/m^2/s) - ! out to ocean - real (kind=dbl_kind), & dimension (nx,icepack_max_nbtrcr), public :: & flux_bio , & ! all bio fluxes to ocean From c5b46d8408a05d79aaf90914b22cfad852588279 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Wed, 1 Apr 2020 06:32:29 -0600 Subject: [PATCH 07/13] update acct on badger --- configuration/driver/icedrv_InitMod.F90 | 2 +- configuration/scripts/machines/env.badger_intel | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/configuration/driver/icedrv_InitMod.F90 b/configuration/driver/icedrv_InitMod.F90 index f22c5c9fb..e3e33b0dd 100644 --- a/configuration/driver/icedrv_InitMod.F90 +++ b/configuration/driver/icedrv_InitMod.F90 @@ -140,8 +140,8 @@ subroutine icedrv_initialize if (tr_fsd .and. wave_spec) call get_wave_spec ! wave spectrum in ice call get_forcing(istep1) ! get forcing from data arrays - ! aerosols if (tr_iso) call fiso_default ! default values + ! aerosols ! if (tr_aero) call faero_data ! data file ! if (tr_zaero) call fzaero_data ! data file (gx1) if (tr_aero .or. tr_zaero) call faero_default ! default values diff --git a/configuration/scripts/machines/env.badger_intel b/configuration/scripts/machines/env.badger_intel index 33d88eae9..99a741235 100755 --- a/configuration/scripts/machines/env.badger_intel +++ b/configuration/scripts/machines/env.badger_intel @@ -24,7 +24,8 @@ setenv ICE_MACHINE_WKDIR /net/scratch3/$user/ICEPACK_RUNS setenv ICE_MACHINE_INPUTDATA /usr/projects/climate/eclare/DATA/Consortium setenv ICE_MACHINE_BASELINE /net/scratch3/$user/ICEPACK_BASELINE setenv ICE_MACHINE_SUBMIT "sbatch " -setenv ICE_MACHINE_ACCT e3sm +#setenv ICE_MACHINE_ACCT e3sm +setenv ICE_MACHINE_ACCT climatehilat setenv ICE_MACHINE_QUEUE "default" setenv ICE_MACHINE_TPNODE 36 setenv ICE_MACHINE_BLDTHRDS 1 From 6796f6ca05bbe504878e488e636121dd1507f15d Mon Sep 17 00:00:00 2001 From: David Bailey Date: Fri, 3 Apr 2020 14:15:10 -0600 Subject: [PATCH 08/13] Add isotope documentation. --- doc/source/icepack_index.rst | 10 ++++++++ doc/source/master_list.bib | 11 +++++++++ doc/source/science_guide/sg_bgc.rst | 26 +++++++++++++++++++++ doc/source/science_guide/sg_tracers.rst | 2 +- doc/source/user_guide/lg_protocols.rst | 2 ++ doc/source/user_guide/lg_sequence.rst | 1 + doc/source/user_guide/ug_case_settings.rst | 2 ++ doc/source/user_guide/ug_implementation.rst | 3 +++ 8 files changed, 56 insertions(+), 1 deletion(-) diff --git a/doc/source/icepack_index.rst b/doc/source/icepack_index.rst index 4cd3f7299..d72aecd13 100755 --- a/doc/source/icepack_index.rst +++ b/doc/source/icepack_index.rst @@ -139,6 +139,9 @@ either Celsius or Kelvin units). "**F**", "", "" "faero_atm", "aerosol deposition rate", "kg/m\ :math:`^2`/s" "faero_ocn", "aerosol flux to the ocean", "kg/m\ :math:`^2`/s" + "fiso_atm", "water isotope deposition rate", "kg/m\ :math:`^2`/s" + "fiso_ocn", "water isotope flux to the ocean", "kg/m\ :math:`^2`/s" + "fiso_evap", "water isotope evaporation rate", "kg/m\ :math:`^2`/s" "fbot_xfer_type", ":math:`\bullet` type of heat transfer coefficient under ice", "" "fcondtop(n)(_f)", "conductive heat flux", "W/m\ :math:`^2`" "ferrmax", "max allowed energy flux error (thermodynamics)", "1x :math:`10^{-3}` W/m\ :math:`^2`" @@ -189,6 +192,9 @@ either Celsius or Kelvin units). "grow_net", "specific biogeochemistry growth rate per grid cell", "s :math:`^{-1}`" "Gstar", "piecewise-linear ridging participation function parameter", "0.15" "**H**", "", "" + "H2_16O_ocn", "concentration of H2_16O isotope in ocean", "kg/kg" + "H2_18O_ocn", "concentration of H2_18O isotope in ocean", "kg/kg" + "HDO_ocn", "concentration of HDO isotope in ocean", "kg/kg" "heat_capacity", ":math:`\bullet` if true, use salinity-dependent thermodynamics", "T" "hfrazilmin", "minimum thickness of new frazil ice", "0.05 m" "hi_min", "minimum ice thickness for thinnest ice category", "0.01 m" @@ -270,6 +276,7 @@ either Celsius or Kelvin units). "mu_rdg", ":math:`\bullet` e-folding scale of ridged ice", "" "**N**", "", "" "n_aero", "number of aerosol species", "" + "n_iso", "number of water isotope species", "" "natmiter", ":math:`\bullet` number of atmo boundary layer iterations", "5" "nbtrcr", "number of biology tracers", "" "ncat", "number of ice categories", "5" @@ -344,10 +351,12 @@ either Celsius or Kelvin units). "puny", "a small positive number", "1\ :math:`\times`\ 10\ :math:`^{-11}`" "**Q**", "", "" "Qa", "specific humidity at 10 m", "kg/kg" + "Qa_iso", "water isotope specific humidity at 10 m", "kg/kg" "qdp", "deep ocean heat flux", "W/m\ :math:`^2`" "qqqice", "for saturated specific humidity over ice", "1.16378\ :math:`\times`\ 10\ :math:`^7`\ kg/m\ :math:`^3`" "qqqocn", "for saturated specific humidity over ocean", "6.275724\ :math:`\times`\ 10\ :math:`^6`\ kg/m\ :math:`^3`" "Qref", "2m atmospheric reference specific humidity", "kg/kg" + "Qref_iso", "2m atmospheric water isotope reference specific humidity", "kg/kg" "**R**", "", "" "R_C2N", "algal carbon to nitrate factor", "7. mole/mole" "R_gC2molC", "mg/mmol carbon", "12.01 mg/mole" @@ -441,6 +450,7 @@ either Celsius or Kelvin units). "Tmltz", "melting temperature profile of ice", "" "Tocnfrz", "temperature of constant freezing point parameterization", "-1.8 C" "tr_aero", ":math:`\bullet` if true, use aerosol tracers", "" + "tr_iso", ":math:`\bullet` if true, use water isotope tracers", "" "tr_bgc_[tracer]", ":math:`\bullet` if true, use biogeochemistry tracers", "" "tr_brine", ":math:`\bullet` if true, use brine height tracer", "" "tr_FY", ":math:`\bullet` if true, use first-year area tracer", "" diff --git a/doc/source/master_list.bib b/doc/source/master_list.bib index 5cf827ff4..58bccfbe6 100644 --- a/doc/source/master_list.bib +++ b/doc/source/master_list.bib @@ -688,6 +688,17 @@ @article{Horvat17 } +@article{Brady19, +author = "E. Brady, S. Stevenson, D. Bailey, Z. Liu, D. Noone, J. Nusbaumer, B. L. Otto-Bliesner, C. Tabor, R. Tomas, T. Wong, J. Zhang, J. Zhu", +title = {The Connected Isotopic Water Cycle in the Community Earth System Model Version 1}, +journal = {Journal of Advances in Modeling Earth Systems}, +volume = {11}, +number = {8}, +pages = {2547-2566}, +url = {https://agupubs.onlinelibrary.wiley.com/doi/full/10.1029/2019MS001663}, +year = {2019} +} + diff --git a/doc/source/science_guide/sg_bgc.rst b/doc/source/science_guide/sg_bgc.rst index 3c074700a..5193e9f4a 100755 --- a/doc/source/science_guide/sg_bgc.rst +++ b/doc/source/science_guide/sg_bgc.rst @@ -93,6 +93,32 @@ must equal ’dEdd’ and ``dEdd_algae`` must be true in **icepack\_in**. .. _brine-ht: +Water Isotope +------------- + +Basic Water Isotopes +~~~~~~~~~~~~~~~~~~~~ + +Water isotopes may be deposited on the ice and gradually work their way +through it until the ice melts and they are passed into the ocean. They +are defined as ice and snow volume tracers (Eq. 15 and 16 in CICE.v5 +documentation), with the snow and ice each having one tracers for each +water isotope species. + +Rather than updating water isotopes for each change to ice/snow thickness due +to evaporation, melting, snow-ice formation, etc., during the +thermodynamics calculation, these changes are deduced from the +diagnostic variables (melts, meltb, snoice, etc) in +**icepack\_isotope.F90**. The water isotopes follow the "real" water in the +sense that all of the mass budget changes that impact fresh water equally +affect the water isotopes. The sources of water isotopes are precipitation +(snow accumulation), condensation, and sea ice growth, both frazil and +congelation that take from the ocean. The sinks are evaporation, snow and +sea ice melt. There water isotopes each have a fractionation associated with +them in which H2_16O (regular water) is treated differently than H2_18O and HDO. + +More information can be found in :cite:`Brady19`. + Brine height ------------ diff --git a/doc/source/science_guide/sg_tracers.rst b/doc/source/science_guide/sg_tracers.rst index c884f5b78..4503da399 100755 --- a/doc/source/science_guide/sg_tracers.rst +++ b/doc/source/science_guide/sg_tracers.rst @@ -10,7 +10,7 @@ required (surface temperature and thickness, salinity and enthalpy of ice and sn and many others are options. For instance, there are tracers to track the age of the ice; the area of first-year ice, fractions of ice area and volume that are level, from which the amount of deformed ice can be calculated; pond area, pond volume and volume of ice covering ponds; -a prognostic floe size distribution; aerosols and numerous other biogeochemical tracers. +a prognostic floe size distribution; aerosols, water isotopes, and numerous other biogeochemical tracers. Most of these tracers are presented in later sections. Here we describe the ice age tracers and how tracers may depend on other tracers, using the pond tracers as an example. diff --git a/doc/source/user_guide/lg_protocols.rst b/doc/source/user_guide/lg_protocols.rst index 9d78ce28b..6e1cd50e8 100755 --- a/doc/source/user_guide/lg_protocols.rst +++ b/doc/source/user_guide/lg_protocols.rst @@ -143,6 +143,8 @@ tracers understood by Icepack and lists some of their properties. See also :ref +------------+----------+---------------+---------+---------+-----------------------------------------------------------------------------------+ | aero | optional | tr_aero | n_aero* | 4 | aerosols (snow SSL, snow below SSL, sea ice SSL, sea ice below SSL in that order) | +------------+----------+---------------+---------+---------+-----------------------------------------------------------------------------------+ + | iso | optional | tr_iso | n_iso* | 2 | water isotopes (snow, sea ice in that order) | + +------------+----------+---------------+---------+---------+-----------------------------------------------------------------------------------+ | fbri | optional | tr_brine | 1 | 1 | | +------------+----------+---------------+---------+---------+-----------------------------------------------------------------------------------+ | bgc_S | optional | | 1 | nblyr | bulk salinity in fraction ice | diff --git a/doc/source/user_guide/lg_sequence.rst b/doc/source/user_guide/lg_sequence.rst index f0fe7252e..e495ecd0e 100755 --- a/doc/source/user_guide/lg_sequence.rst +++ b/doc/source/user_guide/lg_sequence.rst @@ -49,6 +49,7 @@ about maximum array sizes for static dimensioning:: use icepack_tracers, only: icepack_max_don => max_don use icepack_tracers, only: icepack_max_fe => max_fe use icepack_tracers, only: icepack_max_aero => max_aero + use icepack_tracers, only: icepack_max_iso => max_iso use icepack_tracers, only: icepack_nmodal1 => nmodal1 use icepack_tracers, only: icepack_nmodal2 => nmodal2 use icepack_parameters,only: icepack_nspint => nspint diff --git a/doc/source/user_guide/ug_case_settings.rst b/doc/source/user_guide/ug_case_settings.rst index e45c23928..bb559ea16 100755 --- a/doc/source/user_guide/ug_case_settings.rst +++ b/doc/source/user_guide/ug_case_settings.rst @@ -62,6 +62,7 @@ to support the CICE model. "TRLVL", "0,1", "deformed ice tracer", "1" "TRPND", "0,1", "melt pond tracer", "1" "NTRAERO", " ", "number of aerosol tracers", "1" + "NTRISO", " ", "number of water isotope tracers", "1" "TRBRI", "0,1", "brine height tracer", "0" "TRZS", "0,1", "zsalinity tracer, needs TRBRI=1", "0" "TRBGCS", "0,1", "skeletal layer tracer, needs TRBGCZ=0", "0" @@ -130,6 +131,7 @@ column physics. "``tr_pond_topo``", "true/false", "topo melt ponds", "" "``tr_pond_lvl``", "true/false", "level-ice melt ponds", "" "``tr_aero``", "true/false", "aerosols", "" + "``tr_iso``", "true/false", "water isotopes", "" "``tr_fsd``", "true/false", "floe size distribution", "" "", "", "", "" "*thermo_nml*", "", "", "" diff --git a/doc/source/user_guide/ug_implementation.rst b/doc/source/user_guide/ug_implementation.rst index da175423d..ac84ac5d3 100755 --- a/doc/source/user_guide/ug_implementation.rst +++ b/doc/source/user_guide/ug_implementation.rst @@ -199,6 +199,9 @@ i.e. f\_fbio, except they are averaged by ice area. "f\_faero\_atm", "atmospheric aerosol deposition flux", "faero\_atm", "kg m\ :math:`^{-2}` s\ :math:`^{-1}`" "f\_faero\_ocn", "aerosol flux from ice to ocean", "faero\_ocn", "kg m\ :math:`^{-2}` s\ :math:`^{-1}`" "f\_aero", "aerosol mass (snow and ice ssl and int)", "aerosnossl, aerosnoint,aeroicessl, aeroiceint", "kg/kg" + "f\_fiso\_atm", "atmospheric isosol deposition flux", "fiso\_atm", "kg m\ :math:`^{-2}` s\ :math:`^{-1}`" + "f\_fiso\_ocn", "isosol flux from ice to ocean", "fiso\_ocn", "kg m\ :math:`^{-2}` s\ :math:`^{-1}`" + "f\_iso", "isotope mass (snow and ice)", "aerosno, aeroice", "kg/kg" "f\_fbio", "biological ice to ocean flux", "fN, fDOC, fNit, fAm,fDON,fFep\ :math:`^a`, fFed\ :math:`^a`, fSil,fhum, fPON, fDMSPd,fDMS, fDMSPp, fzaero", "mmol m\ :math:`^{-2}` s\ :math:`^{-1}`" "f\_zaero", "bulk z-aerosol mass fraction", "zaero", "kg/kg" "f\_bgc\_S", "bulk z-salinity", "bgc\_S", "ppt" From 7e394673d86925fc4440ec5062ce5a1b59b6ff94 Mon Sep 17 00:00:00 2001 From: David Bailey Date: Fri, 3 Apr 2020 15:01:24 -0600 Subject: [PATCH 09/13] Fix some typos --- doc/source/user_guide/ug_implementation.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/source/user_guide/ug_implementation.rst b/doc/source/user_guide/ug_implementation.rst index ac84ac5d3..613f0b69e 100755 --- a/doc/source/user_guide/ug_implementation.rst +++ b/doc/source/user_guide/ug_implementation.rst @@ -199,9 +199,9 @@ i.e. f\_fbio, except they are averaged by ice area. "f\_faero\_atm", "atmospheric aerosol deposition flux", "faero\_atm", "kg m\ :math:`^{-2}` s\ :math:`^{-1}`" "f\_faero\_ocn", "aerosol flux from ice to ocean", "faero\_ocn", "kg m\ :math:`^{-2}` s\ :math:`^{-1}`" "f\_aero", "aerosol mass (snow and ice ssl and int)", "aerosnossl, aerosnoint,aeroicessl, aeroiceint", "kg/kg" - "f\_fiso\_atm", "atmospheric isosol deposition flux", "fiso\_atm", "kg m\ :math:`^{-2}` s\ :math:`^{-1}`" - "f\_fiso\_ocn", "isosol flux from ice to ocean", "fiso\_ocn", "kg m\ :math:`^{-2}` s\ :math:`^{-1}`" - "f\_iso", "isotope mass (snow and ice)", "aerosno, aeroice", "kg/kg" + "f\_fiso\_atm", "atmospheric water isotope deposition flux", "fiso\_atm", "kg m\ :math:`^{-2}` s\ :math:`^{-1}`" + "f\_fiso\_ocn", "water isotope flux from ice to ocean", "fiso\_ocn", "kg m\ :math:`^{-2}` s\ :math:`^{-1}`" + "f\_iso", "isotope mass (snow and ice)", "isosno, isoice", "kg/kg" "f\_fbio", "biological ice to ocean flux", "fN, fDOC, fNit, fAm,fDON,fFep\ :math:`^a`, fFed\ :math:`^a`, fSil,fhum, fPON, fDMSPd,fDMS, fDMSPp, fzaero", "mmol m\ :math:`^{-2}` s\ :math:`^{-1}`" "f\_zaero", "bulk z-aerosol mass fraction", "zaero", "kg/kg" "f\_bgc\_S", "bulk z-salinity", "bgc\_S", "ppt" From 03d0b8a42ff86a713025f99c1aa4a631d2432aa2 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Sat, 4 Apr 2020 05:59:26 -0600 Subject: [PATCH 10/13] updating documentation --- doc/source/science_guide/sg_bgc.rst | 16 +++++++--------- doc/source/user_guide/lg_protocols.rst | 4 ++-- doc/source/user_guide/lg_sequence.rst | 2 +- doc/source/user_guide/ug_implementation.rst | 6 +++--- 4 files changed, 13 insertions(+), 15 deletions(-) diff --git a/doc/source/science_guide/sg_bgc.rst b/doc/source/science_guide/sg_bgc.rst index 5193e9f4a..205d8be87 100755 --- a/doc/source/science_guide/sg_bgc.rst +++ b/doc/source/science_guide/sg_bgc.rst @@ -96,13 +96,10 @@ must equal ’dEdd’ and ``dEdd_algae`` must be true in **icepack\_in**. Water Isotope ------------- -Basic Water Isotopes -~~~~~~~~~~~~~~~~~~~~ - -Water isotopes may be deposited on the ice and gradually work their way +Water isotopes may be deposited on the ice from above or below, and gradually work their way through it until the ice melts and they are passed into the ocean. They are defined as ice and snow volume tracers (Eq. 15 and 16 in CICE.v5 -documentation), with the snow and ice each having one tracers for each +documentation), with the snow and ice each having one tracer for each water isotope species. Rather than updating water isotopes for each change to ice/snow thickness due @@ -112,10 +109,11 @@ diagnostic variables (melts, meltb, snoice, etc) in **icepack\_isotope.F90**. The water isotopes follow the "real" water in the sense that all of the mass budget changes that impact fresh water equally affect the water isotopes. The sources of water isotopes are precipitation -(snow accumulation), condensation, and sea ice growth, both frazil and -congelation that take from the ocean. The sinks are evaporation, snow and -sea ice melt. There water isotopes each have a fractionation associated with -them in which H2_16O (regular water) is treated differently than H2_18O and HDO. +(snow accumulation), condensation, and sea ice growth, including both frazil and +congelation formation that take up water isotopes from the ocean. The sinks are +evaporation and melting snow and +sea ice. Isotopic fractionation occurs for vapor condensation and new sea ice growth, +in which H2_16O (regular water, ${H_2}O$) is treated differently than H2_18O and HDO. More information can be found in :cite:`Brady19`. diff --git a/doc/source/user_guide/lg_protocols.rst b/doc/source/user_guide/lg_protocols.rst index 6e1cd50e8..5c9b06e8d 100755 --- a/doc/source/user_guide/lg_protocols.rst +++ b/doc/source/user_guide/lg_protocols.rst @@ -141,9 +141,9 @@ tracers understood by Icepack and lists some of their properties. See also :ref +------------+----------+---------------+---------+---------+-----------------------------------------------------------------------------------+ | fsd | optional | tr_fsd | 1 | nfsd | floe size distribution | +------------+----------+---------------+---------+---------+-----------------------------------------------------------------------------------+ - | aero | optional | tr_aero | n_aero* | 4 | aerosols (snow SSL, snow below SSL, sea ice SSL, sea ice below SSL in that order) | + | iso | optional | tr_iso | n_iso | 2 | water isotopes (snow, sea ice) | +------------+----------+---------------+---------+---------+-----------------------------------------------------------------------------------+ - | iso | optional | tr_iso | n_iso* | 2 | water isotopes (snow, sea ice in that order) | + | aero | optional | tr_aero | n_aero* | 4 | aerosols (snow SSL, snow below SSL, sea ice SSL, sea ice below SSL in that order) | +------------+----------+---------------+---------+---------+-----------------------------------------------------------------------------------+ | fbri | optional | tr_brine | 1 | 1 | | +------------+----------+---------------+---------+---------+-----------------------------------------------------------------------------------+ diff --git a/doc/source/user_guide/lg_sequence.rst b/doc/source/user_guide/lg_sequence.rst index e495ecd0e..628f96bff 100755 --- a/doc/source/user_guide/lg_sequence.rst +++ b/doc/source/user_guide/lg_sequence.rst @@ -42,6 +42,7 @@ icepack_kinds module:: icepack_tracers defines a handful of parameters that provide information about maximum array sizes for static dimensioning:: + use icepack_tracers, only: icepack_max_iso => max_iso use icepack_tracers, only: icepack_max_nbtrcr => max_nbtrcr use icepack_tracers, only: icepack_max_algae => max_algae use icepack_tracers, only: icepack_max_dic => max_dic @@ -49,7 +50,6 @@ about maximum array sizes for static dimensioning:: use icepack_tracers, only: icepack_max_don => max_don use icepack_tracers, only: icepack_max_fe => max_fe use icepack_tracers, only: icepack_max_aero => max_aero - use icepack_tracers, only: icepack_max_iso => max_iso use icepack_tracers, only: icepack_nmodal1 => nmodal1 use icepack_tracers, only: icepack_nmodal2 => nmodal2 use icepack_parameters,only: icepack_nspint => nspint diff --git a/doc/source/user_guide/ug_implementation.rst b/doc/source/user_guide/ug_implementation.rst index 613f0b69e..70a806bf0 100755 --- a/doc/source/user_guide/ug_implementation.rst +++ b/doc/source/user_guide/ug_implementation.rst @@ -196,12 +196,12 @@ i.e. f\_fbio, except they are averaged by ice area. :header: "History Flag", "Definition", "Variable(s)", "Units" :widths: 10, 25, 20, 10 - "f\_faero\_atm", "atmospheric aerosol deposition flux", "faero\_atm", "kg m\ :math:`^{-2}` s\ :math:`^{-1}`" - "f\_faero\_ocn", "aerosol flux from ice to ocean", "faero\_ocn", "kg m\ :math:`^{-2}` s\ :math:`^{-1}`" - "f\_aero", "aerosol mass (snow and ice ssl and int)", "aerosnossl, aerosnoint,aeroicessl, aeroiceint", "kg/kg" "f\_fiso\_atm", "atmospheric water isotope deposition flux", "fiso\_atm", "kg m\ :math:`^{-2}` s\ :math:`^{-1}`" "f\_fiso\_ocn", "water isotope flux from ice to ocean", "fiso\_ocn", "kg m\ :math:`^{-2}` s\ :math:`^{-1}`" "f\_iso", "isotope mass (snow and ice)", "isosno, isoice", "kg/kg" + "f\_faero\_atm", "atmospheric aerosol deposition flux", "faero\_atm", "kg m\ :math:`^{-2}` s\ :math:`^{-1}`" + "f\_faero\_ocn", "aerosol flux from ice to ocean", "faero\_ocn", "kg m\ :math:`^{-2}` s\ :math:`^{-1}`" + "f\_aero", "aerosol mass (snow and ice ssl and int)", "aerosnossl, aerosnoint,aeroicessl, aeroiceint", "kg/kg" "f\_fbio", "biological ice to ocean flux", "fN, fDOC, fNit, fAm,fDON,fFep\ :math:`^a`, fFed\ :math:`^a`, fSil,fhum, fPON, fDMSPd,fDMS, fDMSPp, fzaero", "mmol m\ :math:`^{-2}` s\ :math:`^{-1}`" "f\_zaero", "bulk z-aerosol mass fraction", "zaero", "kg/kg" "f\_bgc\_S", "bulk z-salinity", "bgc\_S", "ppt" From f4819aaaa5d7aa849108ca3f86e3f02d551d5021 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Sat, 4 Apr 2020 06:05:19 -0600 Subject: [PATCH 11/13] fixing format of Brady bib entry --- doc/source/master_list.bib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/master_list.bib b/doc/source/master_list.bib index 58bccfbe6..6115cfb3c 100644 --- a/doc/source/master_list.bib +++ b/doc/source/master_list.bib @@ -689,7 +689,7 @@ @article{Horvat17 @article{Brady19, -author = "E. Brady, S. Stevenson, D. Bailey, Z. Liu, D. Noone, J. Nusbaumer, B. L. Otto-Bliesner, C. Tabor, R. Tomas, T. Wong, J. Zhang, J. Zhu", +author = "E. Brady and S. Stevenson and D. Bailey and Z. Liu and D. Noone and J. Nusbaumer and B. L. Otto-Bliesner and C. Tabor and R. Tomas and T. Wong and J. Zhang and J. Zhu", title = {The Connected Isotopic Water Cycle in the Community Earth System Model Version 1}, journal = {Journal of Advances in Modeling Earth Systems}, volume = {11}, From b5fc5eb4bb001f19613143169e4320663569ea8d Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Sat, 4 Apr 2020 09:47:49 -0600 Subject: [PATCH 12/13] updating copyright date to 2020 --- LICENSE.pdf | Bin 59402 -> 92397 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/LICENSE.pdf b/LICENSE.pdf index 5be71376b88f9119eb9f3e5df50222734d8d0185..da37344cf0234bb32481f59a2268ef9ae91516cd 100644 GIT binary patch delta 33153 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 z za>HQ!JfSL6&{*c0v;2+jUhFVeWTXi6*h%(%mV$t6$Dy)`q%P%AZWQxjNuymf1|El zp)u`w+;7jXdd2fHBX3dLlbN*H9#B-16&)9p64T*p)#(b!h>F2n_c zz}0adLZ9t=san=a_Vq5nqT+jXdbGksm*{s=hfea+3RSe@CuK0-2?%AH$GL8)10C}U{zM+0jwHz29 z%Dg=mV}x_4dRy9?^vir)1S9loqtVk9r@ZlRUvpas8ZCkNDsMnYe_jhn4-?z8tk26#r60 zrBEfSUN=B8V20B6!K24F+26pgM#icsoc(?*E%=YdFgwo>iJ|4BHEaf2o_#}X!}$@@ zpHmEo$3`SR@dy@II?Q_kM5ZQV3Kc=_ZmhBmN&6;wp@xsV7ibgAH{d;=*@r7vtdfBH zNRh-ygL?vtl5_#CUU%MtH%epno*qBot9Ue;WFJV{i6>hrd%g*SA0294xJpe}WK~GW z?6m(RWkJ>b$dT0XV^g8;qK?kKHCCdEDB*>wOaXIl7@=DGF>|p&cx?hzR-5ELIedUF z2~;s!*0e}ty;a$?xbEMBs^XWP?GhWN4?k`a6|_z2QG_-^1q|HcVqh6}R zjaE$~TrK@4j95d4)bV1q!Z*SG)$h!gH4H{ZIMQDto(x78u|^z`M|M?DJnpmczQ~#g zTDoxjH10M>sNKgIv%9NblwFD=>(?`P9453_^Y`+|`SgeamCus8YYcmDq8Db=4_E%0 zojrMxYJ;8ttAf)$s^o_ZU3{tXjZRDelcHDDfJ&H4l)S@E~7M((}H6kMr#?)^M8@JeFO?tqMAm@%h^XA7@=+QG!=CHIPZyaFM&(3Hb(kT zGc?u@!D8*sS9;Y~oDNj}(i0k(^~V!=-5rMDD(j1%%uWieSA_IWw5FGlO9h;AZ`52) zBK@=Dd$})%67QFntQt4)rh zs;TGJkP~+-OzS?d9T-{;lIK~Lf=s7g#^r~+UdslCTU8C`Uaw1@jHX0W4%eC~<-3B- z12)bx_bSn*3h*QmjlzPCIq$J+tkH`+N!jzAW{L=JwvS_QD|gm@)~fYXx$RTL=169V zT1Tq`yc26&U5VrPpoN8xdDcc^k%yhs-MfZE-rvK-(~G~;xYja!d5F}$SVX)P^x3`K zXd08+q%G{Bbm$~L8e8L4Gz@bkFr+P}3jRBm2GUUzBr8Iz@;54MB&KscoAmfrIVt9wgx_w2SfY5l5x4ZUJ1Awr!fez{L%@ zQ1Rzs_xPz?8Dw6f=jzVWd2`YYh7VCw|sKfIsHi!()pVT8Qv+VEf1BeTkSHbHX*s@ z5ruPjEyEGIq1qC)FAfH3JrQPxyP6jRRZj;z@W&X)aK|jJpfi?98k#4l{)lSfuoBa@ zD6P+U5OPou5ZK{N6sK0}ltgn~gMKUFM=z9c>@CqmzrbE!{-PrNT&OcP;?)sR>9Q=% zPWu!2s|IYWMe3GZzZ`21eO0)`8rQB#F2b*=g6)2LhJ9aEERx+S@Y>Qy|SOk_*O81j6+U zEJouFNB`xA9Cf0`FcPnsGjowMV&b!J3ZDc%fM+gosyr4m6k+R)lsB$A$KE|E(Ulp* z9CX3(v3VXN5o;T9N*nUW6ph#-cq3?5F^|Mgh?N#-kt7Fo`Nk;wwul+K1o2k4(sIGg zhuTiCg1hOa@yHfKsR>J_2bhJ<9IV^y3>D`52`J=(#hoWe#7g5(sh+cz3<4Sw-Yr+` z?vfitR6FoZc2?u Date: Sun, 5 Apr 2020 06:23:10 -0600 Subject: [PATCH 13/13] minor change to relaunch readthedocs check --- doc/source/developer_guide/dg_col_phys.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/source/developer_guide/dg_col_phys.rst b/doc/source/developer_guide/dg_col_phys.rst index c59f9f126..375f55b75 100755 --- a/doc/source/developer_guide/dg_col_phys.rst +++ b/doc/source/developer_guide/dg_col_phys.rst @@ -184,4 +184,3 @@ Overall, columnphysics changes in the Icepack model should include the following return end subroutine -