diff --git a/columnphysics/icepack_itd.F90 b/columnphysics/icepack_itd.F90 index dcca779cf..bd3261a7a 100644 --- a/columnphysics/icepack_itd.F90 +++ b/columnphysics/icepack_itd.F90 @@ -27,7 +27,7 @@ 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: Lfresh, rhos, ice_ref_salinity, hs_min, cp_ice, rhoi use icepack_parameters, only: rhosi, sk_l, hs_ssl, min_salin, rsnw_fall 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 @@ -108,7 +108,7 @@ subroutine rebin (ntrcr, trcr_depend, & nt_strata, & aicen, trcrn, & vicen, vsnon, & - ncat, hin_max ) + ncat, hin_max, Tf ) integer (kind=int_kind), intent(in) :: & ntrcr , & ! number of tracers in use @@ -135,6 +135,9 @@ subroutine rebin (ntrcr, trcr_depend, & real (kind=dbl_kind), dimension(0:ncat), intent(in) :: & hin_max ! category limits (m) + + real (kind=dbl_kind), intent(in) :: & + Tf ! freezing temperature ! local variables @@ -221,7 +224,7 @@ subroutine rebin (ntrcr, trcr_depend, & aicen, trcrn, & vicen, vsnon, & hicen, donor, & - daice, dvice ) + daice, dvice, Tf ) if (icepack_warnings_aborted(subname)) return !----------------------------------------------------------------- @@ -269,7 +272,7 @@ subroutine rebin (ntrcr, trcr_depend, & aicen, trcrn, & vicen, vsnon, & hicen, donor, & - daice, dvice ) + daice, dvice, Tf ) if (icepack_warnings_aborted(subname)) return !----------------------------------------------------------------- @@ -361,7 +364,7 @@ subroutine shift_ice (ntrcr, ncat, & aicen, trcrn, & vicen, vsnon, & hicen, donor, & - daice, dvice ) + daice, dvice, Tf ) integer (kind=int_kind), intent(in) :: & ncat , & ! number of thickness categories @@ -396,6 +399,9 @@ subroutine shift_ice (ntrcr, ncat, & dvice , & ! ice volume transferred across boundary hicen ! ice thickness for each cat (m) + real (kind=dbl_kind), intent(in) :: & + Tf ! freezing temperature + ! local variables integer (kind=int_kind) :: & @@ -663,7 +669,7 @@ subroutine shift_ice (ntrcr, ncat, & atrcrn(:,n), aicen(n), & vicen(n), vsnon(n), & trcr_base, n_trcr_strata, & - nt_strata, trcrn(:,n)) + nt_strata, trcrn(:,n), Tf) if (icepack_warnings_aborted(subname)) return enddo ! ncat @@ -771,8 +777,8 @@ subroutine cleanup_itd (dt, ntrcr, & fpond, fresh, & fsalt, fhocn, & faero_ocn, fiso_ocn, & - fzsal, & - flux_bio, limit_aice_in) + fzsal, & + flux_bio, Tf, limit_aice_in) integer (kind=int_kind), intent(in) :: & ncat , & ! number of thickness categories @@ -786,6 +792,9 @@ subroutine cleanup_itd (dt, ntrcr, & real (kind=dbl_kind), intent(in) :: & dt ! time step + real (kind=dbl_kind), intent(in) :: & + Tf ! Freezing temperature + real (kind=dbl_kind), dimension(0:ncat), intent(in) :: & hin_max ! category boundaries (m) @@ -928,7 +937,7 @@ subroutine cleanup_itd (dt, ntrcr, & nt_strata, & aicen, trcrn, & vicen, vsnon, & - ncat, hin_max ) + ncat, hin_max, Tf ) if (icepack_warnings_aborted(subname)) return endif ! aice > puny @@ -953,7 +962,7 @@ subroutine cleanup_itd (dt, ntrcr, & tr_aero, & tr_pond_topo, & first_ice, nbtrcr, & - dfzsal, dflux_bio ) + dfzsal, dflux_bio, Tf ) if (icepack_warnings_aborted(subname)) then write(warnstr,*) subname, 'aice:', aice @@ -1049,7 +1058,7 @@ subroutine zap_small_areas (dt, ntrcr, & tr_aero, & tr_pond_topo, & first_ice, nbtrcr, & - dfzsal, dflux_bio ) + dfzsal, dflux_bio, Tf) integer (kind=int_kind), intent(in) :: & ncat , & ! number of thickness categories @@ -1091,6 +1100,9 @@ subroutine zap_small_areas (dt, ntrcr, & real (kind=dbl_kind), dimension (:), intent(inout) :: & dflux_bio ! zapped bio tracer flux from biology (mmol/m^2/s) + real (kind=dbl_kind), intent(in) :: & + Tf ! Freezing temperature + logical (kind=log_kind), intent(in) :: & tr_aero, & ! aerosol flag tr_pond_topo ! pond flag @@ -1208,7 +1220,7 @@ subroutine zap_small_areas (dt, ntrcr, & aice0 = aice0 + aicen(n) aicen(n) = c0 vicen(n) = c0 - trcrn(nt_Tsfc,n) = Tocnfrz + trcrn(nt_Tsfc,n) = Tf !----------------------------------------------------------------- ! Zap snow @@ -1982,7 +1994,7 @@ subroutine icepack_aggregate (ncat, & trcr_depend, & trcr_base, & n_trcr_strata, & - nt_strata) + nt_strata, Tf) integer (kind=int_kind), intent(in) :: & ncat , & ! number of thickness categories @@ -2016,6 +2028,9 @@ subroutine icepack_aggregate (ncat, & real (kind=dbl_kind), dimension (:), intent(out) :: & trcr ! ice tracers + real (kind=dbl_kind), intent(in) :: & + Tf ! freezing temperature + !autodocument_end ! local variables @@ -2077,7 +2092,7 @@ subroutine icepack_aggregate (ncat, & atrcr, aice, & vice , vsno, & trcr_base, n_trcr_strata, & - nt_strata, trcr) + nt_strata, trcr, Tf) if (icepack_warnings_aborted(subname)) return deallocate (atrcr) diff --git a/columnphysics/icepack_mechred.F90 b/columnphysics/icepack_mechred.F90 index 54a7e9a19..e9aefee10 100644 --- a/columnphysics/icepack_mechred.F90 +++ b/columnphysics/icepack_mechred.F90 @@ -111,7 +111,7 @@ subroutine ridge_ice (dt, ndtd, & aparticn, krdgn, & aredistn, vredistn, & dardg1ndt, dardg2ndt, & - dvirdgndt, & + dvirdgndt, Tf, & araftn, vraftn, & closing_flag,closing ) @@ -127,6 +127,9 @@ subroutine ridge_ice (dt, ndtd, & mu_rdg , & ! gives e-folding scale of ridged ice (m^.5) dt ! time step + real (kind=dbl_kind), intent(in) :: & + Tf ! freezing temperature + real (kind=dbl_kind), dimension(0:ncat), intent(inout) :: & hin_max ! category limits (m) @@ -401,7 +404,7 @@ subroutine ridge_ice (dt, ndtd, & nslyr, n_aero, & msnow_mlt, esnow_mlt, & maero, miso, & - mpond, & + mpond, Tf, & aredistn, vredistn) if (icepack_warnings_aborted(subname)) return @@ -1088,7 +1091,7 @@ subroutine ridge_shift (ntrcr, dt, & nslyr, n_aero, & msnow_mlt, esnow_mlt, & maero, miso, & - mpond, & + mpond, Tf, & aredistn, vredistn) integer (kind=int_kind), intent(in) :: & @@ -1101,6 +1104,9 @@ subroutine ridge_shift (ntrcr, dt, & real (kind=dbl_kind), intent(in) :: & dt ! time step (s) + real (kind=dbl_kind), intent(in) :: & + Tf ! freezing temperature + integer (kind=int_kind), dimension (:), intent(in) :: & trcr_depend, & ! = 0 for aicen tracers, 1 for vicen, 2 for vsnon n_trcr_strata ! number of underlying tracer layers @@ -1575,7 +1581,7 @@ subroutine ridge_shift (ntrcr, dt, & atrcrn(:,n), aicen(n), & vicen(n), vsnon(n), & trcr_base, n_trcr_strata, & - nt_strata, trcrn(:,n)) + nt_strata, trcrn(:,n), Tf) if (icepack_warnings_aborted(subname)) return enddo @@ -1744,11 +1750,14 @@ subroutine icepack_step_ridge (dt, ndtd, & araftn, vraftn, & aice, fsalt, & first_ice, fzsal, & - flux_bio, closing ) + flux_bio, closing, Tf ) real (kind=dbl_kind), intent(in) :: & dt ! time step + real (kind=dbl_kind), intent(in) :: & + Tf ! freezing temperature + integer (kind=int_kind), intent(in) :: & ncat , & ! number of thickness categories ndtd , & ! number of dynamics supercycles @@ -1885,7 +1894,7 @@ subroutine icepack_step_ridge (dt, ndtd, & aparticn, krdgn, & aredistn, vredistn, & dardg1ndt, dardg2ndt, & - dvirdgndt, & + dvirdgndt, Tf, & araftn, vraftn, & l_closing_flag, & l_closing ) @@ -1913,8 +1922,8 @@ subroutine icepack_step_ridge (dt, ndtd, & fpond, fresh, & fsalt, fhocn, & faero_ocn, l_fiso_ocn, & - fzsal, & - flux_bio) + fzsal, & + flux_bio, Tf) if (icepack_warnings_aborted(subname)) return if (present(fiso_ocn)) fiso_ocn = l_fiso_ocn diff --git a/columnphysics/icepack_parameters.F90 b/columnphysics/icepack_parameters.F90 index 50aa3a47f..20e122ffe 100644 --- a/columnphysics/icepack_parameters.F90 +++ b/columnphysics/icepack_parameters.F90 @@ -159,6 +159,7 @@ module icepack_parameters character(len=char_len), public :: & tfrz_option = 'mushy' ! form of ocean freezing temperature ! 'minus1p8' = -1.8 C + ! 'constant' = Tocnfrz ! 'linear_salt' = -depressT * sss ! 'mushy' conforms with ktherm=2 @@ -554,6 +555,7 @@ subroutine icepack_init_parameters( & character(len=*), intent(in), optional :: & tfrz_option_in ! form of ocean freezing temperature ! 'minus1p8' = -1.8 C + ! 'constant' = Tocnfrz ! 'linear_salt' = -depressT * sss ! 'mushy' conforms with ktherm=2 @@ -1234,6 +1236,7 @@ subroutine icepack_query_parameters( & character(len=*), intent(out), optional :: & tfrz_option_out ! form of ocean freezing temperature ! 'minus1p8' = -1.8 C + ! 'constant' = Tocnfrz ! 'linear_salt' = -depressT * sss ! 'mushy' conforms with ktherm=2 diff --git a/columnphysics/icepack_therm_itd.F90 b/columnphysics/icepack_therm_itd.F90 index 4af3848dd..a4a4a0e63 100644 --- a/columnphysics/icepack_therm_itd.F90 +++ b/columnphysics/icepack_therm_itd.F90 @@ -97,7 +97,7 @@ subroutine linear_itd (ncat, hin_max, & aicen, trcrn, & vicen, vsnon, & aice, aice0, & - fpond ) + fpond, Tf ) integer (kind=int_kind), intent(in) :: & ncat , & ! number of thickness categories @@ -119,6 +119,9 @@ subroutine linear_itd (ncat, hin_max, & integer (kind=int_kind), dimension (:,:), intent(in) :: & nt_strata ! indices of underlying tracer layers + real (kind=dbl_kind), intent(in) :: & + Tf ! freezing temperature + real (kind=dbl_kind), dimension(:), intent(in) :: & aicen_init, & ! initial ice concentration (before vertical thermo) vicen_init ! initial ice volume (m) @@ -587,7 +590,7 @@ subroutine linear_itd (ncat, hin_max, & aicen, trcrn, & vicen, vsnon, & hicen, donor, & - daice, dvice ) + daice, dvice, Tf ) if (icepack_warnings_aborted(subname)) return ! maintain qsno negative definiteness @@ -2166,7 +2169,7 @@ subroutine icepack_step_therm2 (dt, ncat, nltrcr, & vsnon, & aice , & aice0 , & - fpond ) + fpond, Tf ) if (icepack_warnings_aborted(subname)) return endif ! aice > puny @@ -2272,7 +2275,7 @@ subroutine icepack_step_therm2 (dt, ncat, nltrcr, & fpond, fresh, & fsalt, fhocn, & faero_ocn, l_fiso_ocn, & - fzsal, flux_bio) + fzsal, flux_bio, Tf) if (icepack_warnings_aborted(subname)) return if (present(fiso_ocn)) then diff --git a/columnphysics/icepack_therm_shared.F90 b/columnphysics/icepack_therm_shared.F90 index 621fd1e56..e87070838 100644 --- a/columnphysics/icepack_therm_shared.F90 +++ b/columnphysics/icepack_therm_shared.F90 @@ -8,7 +8,7 @@ module icepack_therm_shared use icepack_kinds - use icepack_parameters, only: c0, c1, c2, c4, p5, pi, puny + use icepack_parameters, only: c0, c1, c2, c4, p5, pi, puny, Tocnfrz use icepack_parameters, only: cp_ocn, cp_ice, rhoi, rhos, Tffresh, TTTice, qqqice use icepack_parameters, only: stefan_boltzmann, emissivity, Lfresh, Tsmelt use icepack_parameters, only: saltmax, min_salin, depressT @@ -396,6 +396,10 @@ function icepack_sea_freezing_temperature(sss) result(Tf) Tf = -depressT * sss ! deg C + elseif (trim(tfrz_option) == 'constant') then + + Tf = Tocnfrz + else Tf = -1.8_dbl_kind diff --git a/columnphysics/icepack_tracers.F90 b/columnphysics/icepack_tracers.F90 index 26c535e62..91b024ff4 100644 --- a/columnphysics/icepack_tracers.F90 +++ b/columnphysics/icepack_tracers.F90 @@ -7,7 +7,7 @@ module icepack_tracers use icepack_kinds - use icepack_parameters, only: c0, c1, puny, Tocnfrz, rhos, rsnw_fall + use icepack_parameters, only: c0, c1, puny, rhos, rsnw_fall use icepack_warnings, only: warnstr, icepack_warnings_add use icepack_warnings, only: icepack_warnings_setabort, icepack_warnings_aborted @@ -1207,7 +1207,7 @@ subroutine icepack_compute_tracers (ntrcr, trcr_depend, & atrcrn, aicen, & vicen, vsnon, & trcr_base, n_trcr_strata, & - nt_strata, trcrn) + nt_strata, trcrn, Tf) integer (kind=int_kind), intent(in) :: & ntrcr ! number of tracers in use @@ -1234,6 +1234,9 @@ subroutine icepack_compute_tracers (ntrcr, trcr_depend, & real (kind=dbl_kind), dimension (ntrcr), intent(out) :: & trcrn ! ice tracers + real (kind=dbl_kind), intent(in) :: & + Tf ! Freezing point + !autodocument_end ! local variables @@ -1266,7 +1269,7 @@ subroutine icepack_compute_tracers (ntrcr, trcr_depend, & trcrn(it) = atrcrn(it) / aicen else trcrn(it) = c0 - if (it == nt_Tsfc) trcrn(it) = Tocnfrz ! surface temperature + if (it == nt_Tsfc) trcrn(it) = Tf ! surface temperature endif else diff --git a/configuration/driver/icedrv_InitMod.F90 b/configuration/driver/icedrv_InitMod.F90 index 52d2a7f66..01514461b 100644 --- a/configuration/driver/icedrv_InitMod.F90 +++ b/configuration/driver/icedrv_InitMod.F90 @@ -168,6 +168,7 @@ subroutine init_restart use icedrv_init, only: ice_ic use icedrv_init, only: tmask use icedrv_init_column, only: init_hbrine, init_bgc + use icedrv_flux, only: Tf use icedrv_restart, only: restartfile use icedrv_restart_shared, only: restart use icedrv_restart_bgc, only: read_restart_bgc @@ -236,7 +237,8 @@ subroutine init_restart trcr_depend=trcr_depend, & trcr_base=trcr_base, & n_trcr_strata=n_trcr_strata, & - nt_strata=nt_strata) + nt_strata=nt_strata, & + Tf=Tf(i)) enddo call icepack_warnings_flush(nu_diag) if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, & diff --git a/configuration/driver/icedrv_forcing.F90 b/configuration/driver/icedrv_forcing.F90 index bb488336b..939133334 100644 --- a/configuration/driver/icedrv_forcing.F90 +++ b/configuration/driver/icedrv_forcing.F90 @@ -122,9 +122,9 @@ subroutine init_forcing write (nu_diag,*) ' Initial forcing data year = ',fyear_init write (nu_diag,*) ' Final forcing data year = ',fyear_final - !------------------------------------------------------------------- - ! Initialize forcing data to default values - !------------------------------------------------------------------- + !------------------------------------------------------------------- + ! Initialize forcing data to default values + !------------------------------------------------------------------- ! many default forcing values are set in init_flux_atm i = 1 ! use first grid box value @@ -1066,16 +1066,17 @@ subroutine ocn_ISPOL qdp_data (i) = qdp (i) end do - end subroutine ocn_ISPOL + end subroutine ocn_ISPOL !======================================================================= subroutine finish_ocn_forcing(sst_temp) - ! Compute ocean freezing temperature Tf based on tfrz_option - ! 'minus1p8' Tf = -1.8 C (default) - ! 'linear_salt' Tf = -depressT * sss - ! 'mushy' Tf conforms with mushy layer thermo (ktherm=2) +! Compute ocean freezing temperature Tf based on tfrz_option +! 'minus1p8' Tf = -1.8 C +! 'constant' Tf = Tocnfrz +! 'linear_salt' Tf = -depressT * sss +! 'mushy' Tf conforms with mushy layer thermo (ktherm=2) real (kind=dbl_kind), dimension(nx), intent(in) :: & sst_temp @@ -1101,7 +1102,7 @@ end subroutine finish_ocn_forcing !======================================================================= - subroutine ice_open_clos + subroutine ice_open_clos integer (kind=int_kind) :: i @@ -1122,7 +1123,7 @@ subroutine ice_open_clos read(nu_open_clos,*) xtime, open_data(i), clos_data(i) enddo - end subroutine ice_open_clos + end subroutine ice_open_clos !======================================================================= diff --git a/configuration/driver/icedrv_init.F90 b/configuration/driver/icedrv_init.F90 index fc44d51f9..31456999f 100644 --- a/configuration/driver/icedrv_init.F90 +++ b/configuration/driver/icedrv_init.F90 @@ -1266,7 +1266,8 @@ subroutine init_state trcr_depend=trcr_depend(1:ntrcr), & trcr_base=trcr_base (1:ntrcr,:), & n_trcr_strata=n_trcr_strata(1:ntrcr), & - nt_strata=nt_strata (1:ntrcr,:)) + nt_strata=nt_strata (1:ntrcr,:), & + Tf = Tf(i)) aice_init(i) = aice(i) diff --git a/configuration/driver/icedrv_restart.F90 b/configuration/driver/icedrv_restart.F90 index 78337681b..addd55219 100644 --- a/configuration/driver/icedrv_restart.F90 +++ b/configuration/driver/icedrv_restart.F90 @@ -162,7 +162,7 @@ subroutine restartfile (ice_ic) use icepack_intfc, only: icepack_aggregate use icedrv_domain_size, only: nilyr, nslyr, ncat use icedrv_domain_size, only: max_ntrcr, nx - use icedrv_flux, only: swvdr, swvdf, swidr, swidf + use icedrv_flux, only: swvdr, swvdf, swidr, swidf, Tf use icedrv_flux, only: sst, frzmlt, scale_factor use icedrv_forcing, only: oceanmixed_ice use icedrv_init, only: tmask @@ -302,7 +302,8 @@ subroutine restartfile (ice_ic) trcr_depend=trcr_depend, & trcr_base=trcr_base, & n_trcr_strata=n_trcr_strata, & - nt_strata=nt_strata) + nt_strata=nt_strata, & + Tf = Tf(i)) aice_init(i) = aice(i) enddo diff --git a/configuration/driver/icedrv_step.F90 b/configuration/driver/icedrv_step.F90 index b807639bc..e93e9b764 100644 --- a/configuration/driver/icedrv_step.F90 +++ b/configuration/driver/icedrv_step.F90 @@ -544,6 +544,7 @@ subroutine update_state (dt, daidt, dvidt, dagedt, offset) use icedrv_domain_size, only: ncat, nx use icedrv_init, only: tmask + use icedrv_flux, only: Tf use icedrv_state, only: aicen, trcrn, vicen, vsnon use icedrv_state, only: aice, trcr, vice, vsno, aice0, trcr_depend use icedrv_state, only: trcr_base, nt_strata, n_trcr_strata @@ -609,7 +610,8 @@ subroutine update_state (dt, daidt, dvidt, dagedt, offset) trcr_depend=trcr_depend (1:ntrcr), & trcr_base=trcr_base (1:ntrcr,:), & n_trcr_strata=n_trcr_strata(1:ntrcr), & - nt_strata=nt_strata (1:ntrcr,:)) + nt_strata=nt_strata (1:ntrcr,:), & + Tf=Tf(i)) endif if (present(offset)) then @@ -707,7 +709,7 @@ 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_flux, only: rdg_conv, rdg_shear, dardg1dt, dardg2dt + use icedrv_flux, only: rdg_conv, rdg_shear, dardg1dt, dardg2dt, Tf 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, fiso_ocn @@ -784,7 +786,7 @@ subroutine step_dyn_ridge (dt, ndtd) aice=aice(i), fsalt=fsalt(i), & first_ice=first_ice(i,:), fzsal=fzsal(i), & flux_bio=flux_bio(i,1:nbtrcr), & - closing=closing(i) ) + closing=closing(i), Tf=Tf(i) ) endif ! tmask @@ -826,7 +828,7 @@ subroutine step_dyn_ridge (dt, ndtd) araftn=araftn(i,:), vraftn=vraftn(i,:), & aice=aice(i), fsalt=fsalt(i), & first_ice=first_ice(i,:), fzsal=fzsal(i), & - flux_bio=flux_bio(i,1:nbtrcr)) + flux_bio=flux_bio(i,1:nbtrcr), Tf = Tf(i)) endif ! tmask diff --git a/doc/source/user_guide/ug_case_settings.rst b/doc/source/user_guide/ug_case_settings.rst index 768f64f1f..104d7fdd4 100755 --- a/doc/source/user_guide/ug_case_settings.rst +++ b/doc/source/user_guide/ug_case_settings.rst @@ -359,7 +359,8 @@ forcing_nml "", "``mm_per_sec``", "(same as MKS units)", "" "", "``m_per_sec``", "", "" "``restore_ocn``", "logical", "restore sst to data", "``.false.``" - "``tfrz_option``", "``linear_salt``", "linear functino of salinity (ktherm=1)", "``mushy``" + "``tfrz_option``","``constant``", "constant ocean freezing temperature (Tocnfrz)","``mushy``" + "", "``linear_salt``", "linear function of salinity (ktherm=1)", "" "", "``minus1p8``", "constant ocean freezing temperature (:math:`-1.8^{\circ} C`)", "" "", "``mushy``", "matches mushy-layer thermo (ktherm=2)", "" "``trestore``", "integer", "sst restoring time scale (days)", "90"