diff --git a/.gitmodules b/.gitmodules index 22e452f35..f14869a27 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "icepack"] path = icepack - url = https://github.com/cice-consortium/Icepack + url = https://github.com/cice-consortium/icepack diff --git a/cice.setup b/cice.setup index 30da0ed2e..4c7a222ff 100755 --- a/cice.setup +++ b/cice.setup @@ -1189,7 +1189,7 @@ source ./cice.settings set bldstat = 0 if (\${dobuild} == true) then if (\${doreuse} == true) then - set ciceexe = "../ciceexe.\${ICE_TARGET}.\${ICE_ENVNAME}.\${ICE_COMMDIR}.\${ICE_BLDDEBUG}.\${ICE_THREADED}.\${ICE_IOTYPE}" + set ciceexe = "../ciceexe.\${ICE_TARGET}.\${ICE_ENVNAME}.\${ICE_COMMDIR}.\${ICE_BLDDEBUG}.\${ICE_THREADED}.\${ICE_IOTYPE}.\${ICE_SNICARHC}" ./cice.build --exe \${ciceexe} set bldstat = \${status} if !(-e \${ciceexe}) cp -p \${ICE_RUNDIR}/cice \${ciceexe} diff --git a/cicecore/cicedyn/dynamics/ice_transport_driver.F90 b/cicecore/cicedyn/dynamics/ice_transport_driver.F90 index 8ff833086..fca964593 100644 --- a/cicecore/cicedyn/dynamics/ice_transport_driver.F90 +++ b/cicecore/cicedyn/dynamics/ice_transport_driver.F90 @@ -713,6 +713,7 @@ subroutine transport_upwind (dt) use ice_state, only: aice0, aicen, vicen, vsnon, trcrn, & uvel, vvel, trcr_depend, bound_state, trcr_base, & n_trcr_strata, nt_strata, uvelE, vvelN + use ice_flux, only: Tf use ice_grid, only: HTE, HTN, tarea, tmask, grid_ice use ice_timers, only: ice_timer_start, ice_timer_stop, & timer_bound, timer_advect @@ -838,7 +839,7 @@ subroutine transport_upwind (dt) ntrcr, narr, & trcr_depend(:), trcr_base(:,:), & n_trcr_strata(:), nt_strata(:,:), & - tmask(:,:, iblk), & + tmask(:,:, iblk), Tf (:,:,iblk), & aicen(:,:, :,iblk), trcrn (:,:,:,:,iblk), & vicen(:,:, :,iblk), vsnon (:,:, :,iblk), & aice0(:,:, iblk), works (:,:, :,iblk)) @@ -1643,7 +1644,7 @@ subroutine work_to_state (nx_block, ny_block, & trcr_base, & n_trcr_strata, & nt_strata, & - tmask, & + tmask, Tf, & aicen, trcrn, & vicen, vsnon, & aice0, works) @@ -1670,6 +1671,7 @@ subroutine work_to_state (nx_block, ny_block, & tmask (nx_block,ny_block) real (kind=dbl_kind), intent (in) :: & + Tf (nx_block,ny_block), & works (nx_block,ny_block,narr) real (kind=dbl_kind), dimension (nx_block,ny_block,ncat), intent(out) :: & @@ -1746,7 +1748,8 @@ subroutine work_to_state (nx_block, ny_block, & trcr_base = trcr_base(:,:), & n_trcr_strata = n_trcr_strata(:), & nt_strata = nt_strata(:,:), & - trcrn = trcrn(i,j,:,n)) + trcrn = trcrn(i,j,:,n), & + Tf = Tf(i,j)) ! tcraig, don't let land points get non-zero Tsfc if (.not.tmask(i,j)) then diff --git a/cicecore/cicedyn/general/ice_forcing_bgc.F90 b/cicecore/cicedyn/general/ice_forcing_bgc.F90 index 2f07d05f1..69c3ea311 100644 --- a/cicecore/cicedyn/general/ice_forcing_bgc.F90 +++ b/cicecore/cicedyn/general/ice_forcing_bgc.F90 @@ -17,13 +17,13 @@ module ice_forcing_bgc use ice_calendar, only: dt, istep, msec, mday, mmonth use ice_fileunits, only: nu_diag use ice_arrays_column, only: restore_bgc, & - bgc_data_dir, fe_data_type, optics_file, optics_file_fieldname + bgc_data_dir, fe_data_type use ice_constants, only: c0, p1 use ice_constants, only: field_loc_center, field_type_scalar use ice_exit, only: abort_ice use ice_forcing, only: bgc_data_type use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted - use icepack_intfc, only: icepack_nspint, icepack_max_aero, & + use icepack_intfc, only: icepack_nspint_3bd, icepack_max_aero, & icepack_max_algae, icepack_max_doc, icepack_max_dic use icepack_intfc, only: icepack_query_tracer_flags, & icepack_query_parameters, icepack_query_parameters, & @@ -32,8 +32,7 @@ module ice_forcing_bgc implicit none private public :: get_forcing_bgc, get_atm_bgc, fzaero_data, alloc_forcing_bgc, & - init_bgc_data, faero_data, faero_default, faero_optics, & - fiso_default + init_bgc_data, faero_data, faero_default, fiso_default integer (kind=int_kind) :: & bgcrecnum = 0 ! old record number (save between steps) @@ -840,214 +839,6 @@ subroutine init_bgc_data (fed1,fep1) end subroutine init_bgc_data -!======================================================================= -! -! Aerosol optical properties for bulk and modal aerosol formulation -! X_bc_tab properties are from snicar_optics_5bnd_mam_c140303 (Mark Flanner 2009) -! ==> "Mie optical parameters for CLM snowpack treatment" Includes -! ice (effective radii from 30-1500um), black carbon, organic carbon and dust -! -! authors: Elizabeth Hunke, LANL - - subroutine faero_optics - - use ice_broadcast, only: broadcast_array - use ice_read_write, only: ice_open_nc, ice_close_nc - use ice_communicate, only: my_task, master_task - use ice_arrays_column, only: & - kaer_tab, & ! aerosol mass extinction cross section (m2/kg) - waer_tab, & ! aerosol single scatter albedo (fraction) - gaer_tab, & ! aerosol asymmetry parameter (cos(theta)) - kaer_bc_tab, & ! BC mass extinction cross section (m2/kg) - waer_bc_tab, & ! BC single scatter albedo (fraction) - gaer_bc_tab, & ! BC aerosol asymmetry parameter (cos(theta)) - bcenh ! BC absorption enhancement factor - -#ifdef USE_NETCDF - use netcdf -#endif - - ! local parameters - - logical (kind=log_kind) :: modal_aero - - integer (kind=int_kind) :: & - varid , & ! variable id - status , & ! status output from netcdf routines - n, k ! index - - real (kind=dbl_kind) :: & - amin, amax, asum ! min, max values and sum of input array - - integer (kind=int_kind) :: & - fid ! file id for netCDF file - - character (char_len_long) :: & - fieldname ! field name in netcdf file - - character(len=*), parameter :: subname = '(faero_optics)' - - ! this data is used in bulk aerosol treatment in dEdd radiation - kaer_tab = reshape((/ & ! aerosol mass extinction cross section (m2/kg) -! 11580.61872, 5535.41835, 2793.79690, & -! 25798.96479, 11536.03871, 4688.24207, & -! 196.49772, 204.14078, 214.42287, & -! 2665.85867, 2256.71027, 820.36024, & -! 840.78295, 1028.24656, 1163.03298, & -! 387.51211, 414.68808, 450.29814/), & - 11580.61872_dbl_kind, 5535.41835_dbl_kind, 2793.79690_dbl_kind, & - 25798.96479_dbl_kind, 11536.03871_dbl_kind, 4688.24207_dbl_kind, & - 196.49772_dbl_kind, 204.14078_dbl_kind, 214.42287_dbl_kind, & - 2665.85867_dbl_kind, 2256.71027_dbl_kind, 820.36024_dbl_kind, & - 840.78295_dbl_kind, 1028.24656_dbl_kind, 1163.03298_dbl_kind, & - 387.51211_dbl_kind, 414.68808_dbl_kind, 450.29814_dbl_kind/), & - (/icepack_nspint,icepack_max_aero/)) - waer_tab = reshape((/ & ! aerosol single scatter albedo (fraction) -! 0.29003, 0.17349, 0.06613, & -! 0.51731, 0.41609, 0.21324, & -! 0.84467, 0.94216, 0.95666, & -! 0.97764, 0.99402, 0.98552, & -! 0.94146, 0.98527, 0.99093, & -! 0.90034, 0.96543, 0.97678/), & - 0.29003_dbl_kind, 0.17349_dbl_kind, 0.06613_dbl_kind, & - 0.51731_dbl_kind, 0.41609_dbl_kind, 0.21324_dbl_kind, & - 0.84467_dbl_kind, 0.94216_dbl_kind, 0.95666_dbl_kind, & - 0.97764_dbl_kind, 0.99402_dbl_kind, 0.98552_dbl_kind, & - 0.94146_dbl_kind, 0.98527_dbl_kind, 0.99093_dbl_kind, & - 0.90034_dbl_kind, 0.96543_dbl_kind, 0.97678_dbl_kind/), & - (/icepack_nspint,icepack_max_aero/)) - gaer_tab = reshape((/ & ! aerosol asymmetry parameter (cos(theta)) -! 0.35445, 0.19838, 0.08857, & -! 0.52581, 0.32384, 0.14970, & -! 0.83162, 0.78306, 0.74375, & -! 0.68861, 0.70836, 0.54171, & -! 0.70239, 0.66115, 0.71983, & -! 0.78734, 0.73580, 0.64411/), & - 0.35445_dbl_kind, 0.19838_dbl_kind, 0.08857_dbl_kind, & - 0.52581_dbl_kind, 0.32384_dbl_kind, 0.14970_dbl_kind, & - 0.83162_dbl_kind, 0.78306_dbl_kind, 0.74375_dbl_kind, & - 0.68861_dbl_kind, 0.70836_dbl_kind, 0.54171_dbl_kind, & - 0.70239_dbl_kind, 0.66115_dbl_kind, 0.71983_dbl_kind, & - 0.78734_dbl_kind, 0.73580_dbl_kind, 0.64411_dbl_kind/), & - (/icepack_nspint,icepack_max_aero/)) - - ! this data is used in MODAL AEROSOL treatment in dEdd radiation - kaer_bc_tab = reshape((/ & ! aerosol mass extinction cross section (m2/kg) -! 12955.44732, 5946.89461, 2772.33366, & -! 12085.30664, 7438.83131, 3657.13084, & -! 9753.99698, 7342.87139, 4187.79304, & -! 7815.74879, 6659.65096, 4337.98863, & -! 6381.28194, 5876.78408, 4254.65054, & -! 5326.93163, 5156.74532, 4053.66581, & -! 4538.09763, 4538.60875, 3804.10884, & -! 3934.17604, 4020.20799, 3543.27199, & -! 3461.20656, 3587.80962, 3289.98060, & -! 3083.03396, 3226.27231, 3052.91441/), & - 12955.4473151973_dbl_kind, 5946.89461205564_dbl_kind, 2772.33366387720_dbl_kind, & - 12085.3066388712_dbl_kind, 7438.83131367992_dbl_kind, 3657.13084442081_dbl_kind, & - 9753.99697536893_dbl_kind, 7342.87139082553_dbl_kind, 4187.79303607928_dbl_kind, & - 7815.74879345131_dbl_kind, 6659.65096365965_dbl_kind, 4337.98863414228_dbl_kind, & - 6381.28194381772_dbl_kind, 5876.78408231865_dbl_kind, 4254.65053724305_dbl_kind, & - 5326.93163497508_dbl_kind, 5156.74531505734_dbl_kind, 4053.66581550147_dbl_kind, & - 4538.09762614960_dbl_kind, 4538.60874501597_dbl_kind, 3804.10884202567_dbl_kind, & - 3934.17604000777_dbl_kind, 4020.20798667897_dbl_kind, 3543.27199302277_dbl_kind, & - 3461.20655708248_dbl_kind, 3587.80961820605_dbl_kind, 3289.98060303894_dbl_kind, & - 3083.03396032095_dbl_kind, 3226.27231329114_dbl_kind, 3052.91440681137_dbl_kind/), & - (/icepack_nspint,10/)) - - waer_bc_tab = reshape((/ & ! aerosol single scatter albedo (fraction) -! 0.26107, 0.15861, 0.06535, & -! 0.37559, 0.30318, 0.19483, & -! 0.42224, 0.36913, 0.27875, & -! 0.44777, 0.40503, 0.33026, & -! 0.46444, 0.42744, 0.36426, & -! 0.47667, 0.44285, 0.38827, & -! 0.48635, 0.45428, 0.40617, & -! 0.49440, 0.46328, 0.42008, & -! 0.50131, 0.47070, 0.43128, & -! 0.50736, 0.47704, 0.44056/), & - 0.261071919959011_dbl_kind, 0.158608047940651_dbl_kind, 0.0653546447770291_dbl_kind, & - 0.375593873543050_dbl_kind, 0.303181671502553_dbl_kind, 0.194832290545495_dbl_kind, & - 0.422240383488477_dbl_kind, 0.369134186611324_dbl_kind, 0.278752556671685_dbl_kind, & - 0.447772153910671_dbl_kind, 0.405033725319593_dbl_kind, 0.330260831965086_dbl_kind, & - 0.464443094570456_dbl_kind, 0.427439117980081_dbl_kind, 0.364256689383418_dbl_kind, & - 0.476668995985241_dbl_kind, 0.442854173154887_dbl_kind, 0.388270470928338_dbl_kind, & - 0.486347881475941_dbl_kind, 0.454284736567521_dbl_kind, 0.406167596922937_dbl_kind, & - 0.494397834153785_dbl_kind, 0.463279526357470_dbl_kind, 0.420084410794128_dbl_kind, & - 0.501307856563459_dbl_kind, 0.470696914968199_dbl_kind, 0.431284889617716_dbl_kind, & - 0.507362336297419_dbl_kind, 0.477038272961243_dbl_kind, 0.440559363958571_dbl_kind/), & - (/icepack_nspint,10/)) - - gaer_bc_tab = reshape((/ & ! aerosol asymmetry parameter (cos(theta)) -! 0.28328, 0.19644, 0.10498, & -! 0.44488, 0.32615, 0.19612, & -! 0.54724, 0.41611, 0.26390, & -! 0.61711, 0.48475, 0.31922, & -! 0.66673, 0.53923, 0.36632, & -! 0.70296, 0.58337, 0.40732, & -! 0.73002, 0.61960, 0.44344, & -! 0.75064, 0.64959, 0.47551, & -! 0.76663, 0.67461, 0.50415, & -! 0.77926, 0.69561, 0.52981/),& - 0.283282988564031_dbl_kind, 0.196444209821980_dbl_kind, 0.104976473902976_dbl_kind, & - 0.444877326083453_dbl_kind, 0.326147707342261_dbl_kind, 0.196121968923488_dbl_kind, & - 0.547243414035631_dbl_kind, 0.416106187964493_dbl_kind, 0.263903486903711_dbl_kind, & - 0.617111563012282_dbl_kind, 0.484745531707601_dbl_kind, 0.319218974395050_dbl_kind, & - 0.666728525631754_dbl_kind, 0.539228555802301_dbl_kind, 0.366323180358996_dbl_kind, & - 0.702956870835387_dbl_kind, 0.583372441336763_dbl_kind, 0.407316408184865_dbl_kind, & - 0.730016668453191_dbl_kind, 0.619595539349710_dbl_kind, 0.443436944107423_dbl_kind, & - 0.750635997128011_dbl_kind, 0.649589805870541_dbl_kind, 0.475512089138887_dbl_kind, & - 0.766634959089444_dbl_kind, 0.674609076223658_dbl_kind, 0.504145461809103_dbl_kind, & - 0.779256641759228_dbl_kind, 0.695614224933709_dbl_kind, 0.529805346632687_dbl_kind/), & - (/icepack_nspint,10/)) - - bcenh(:,:,:) = c0 - - call icepack_query_parameters(modal_aero_out=modal_aero) - call icepack_warnings_flush(nu_diag) - if (icepack_warnings_aborted()) call abort_ice(error_message=subname, & - file=__FILE__, line=__LINE__) - - if (modal_aero) then -#ifdef USE_NETCDF - if (my_task == master_task) then - write (nu_diag,*) ' ' - write (nu_diag,*) 'Read optics for modal aerosol treament in' - write (nu_diag,*) trim(optics_file) - write (nu_diag,*) 'Read optics file field name = ',trim(optics_file_fieldname) - call ice_open_nc(optics_file,fid) - - fieldname=optics_file_fieldname - - status = nf90_inq_varid(fid, trim(fieldname), varid) - - if (status /= nf90_noerr) then - call abort_ice (subname//'ERROR: Cannot find variable '//trim(fieldname)) - endif - status = nf90_get_var( fid, varid, bcenh, & - start=(/1,1,1,1/), & - count=(/3,10,8,1/) ) - do n=1,10 - amin = minval(bcenh(:,n,:)) - amax = maxval(bcenh(:,n,:)) - asum = sum (bcenh(:,n,:)) - write(nu_diag,*) ' min, max, sum =', amin, amax, asum - enddo - call ice_close_nc(fid) - endif !master_task - do n=1,3 - do k=1,8 - call broadcast_array(bcenh(n,:,k), master_task) - enddo - enddo -#else - call abort_ice(subname//'ERROR: USE_NETCDF cpp not defined', & - file=__FILE__, line=__LINE__) -#endif - endif ! modal_aero - - end subroutine faero_optics - !======================================================================= end module ice_forcing_bgc diff --git a/cicecore/cicedyn/general/ice_init.F90 b/cicecore/cicedyn/general/ice_init.F90 index 7435322bd..ff952629e 100644 --- a/cicecore/cicedyn/general/ice_init.F90 +++ b/cicecore/cicedyn/general/ice_init.F90 @@ -14,7 +14,7 @@ module ice_init use ice_kinds_mod use ice_communicate, only: my_task, master_task, ice_barrier - use ice_constants, only: c0, c1, c2, c3, c5, c12, p2, p3, p5, p75, p166, & + use ice_constants, only: c0, c1, c2, c3, c5, c12, p01, p2, p3, p5, p75, p166, & cm_to_m use ice_exit, only: abort_ice use ice_fileunits, only: nu_nml, nu_diag, nml_filename, diag_type, & @@ -141,12 +141,12 @@ subroutine input_data #endif real (kind=dbl_kind) :: ustar_min, albicev, albicei, albsnowv, albsnowi, & - ahmax, R_ice, R_pnd, R_snw, dT_mlt, rsnw_mlt, emissivity, & + ahmax, R_ice, R_pnd, R_snw, dT_mlt, rsnw_mlt, emissivity, hi_min, & mu_rdg, hs0, dpscale, rfracmin, rfracmax, pndaspect, hs1, hp1, & a_rapid_mode, Rac_rapid_mode, aspect_rapid_mode, dSdt_slow_mode, & phi_c_slow_mode, phi_i_mushy, kalg, atmiter_conv, Pstar, Cstar, & sw_frac, sw_dtemp, floediam, hfrazilmin, iceruf, iceruf_ocn, & - rsnw_fall, rsnw_tmax, rhosnew, rhosmin, rhosmax, & + rsnw_fall, rsnw_tmax, rhosnew, rhosmin, rhosmax, Tliquidus_max, & windmin, drhosdwind, snwlvlfac integer (kind=int_kind) :: ktherm, kstrength, krdg_partic, krdg_redist, natmiter, & @@ -154,7 +154,7 @@ subroutine input_data character (len=char_len) :: shortwave, albedo_type, conduct, fbot_xfer_type, & tfrz_option, saltflux_option, frzpnd, atmbndy, wave_spec_type, snwredist, snw_aging_table, & - capping_method + capping_method, snw_ssp_table logical (kind=log_kind) :: calc_Tsfc, formdrag, highfreq, calc_strair, wave_spec, & sw_redist, calc_dragio, use_smliq_pnd, snwgrain @@ -165,7 +165,7 @@ subroutine input_data integer (kind=int_kind) :: numin, numax ! unit number limits integer (kind=int_kind) :: rplvl, rptopo - real (kind=dbl_kind) :: Cf, ksno, puny, ice_ref_salinity + real (kind=dbl_kind) :: Cf, ksno, puny, ice_ref_salinity, Tocnfrz character (len=char_len) :: abort_list character (len=char_len) :: nml_name ! namelist name @@ -222,7 +222,7 @@ subroutine input_data kitd, ktherm, conduct, ksno, & a_rapid_mode, Rac_rapid_mode, aspect_rapid_mode, & dSdt_slow_mode, phi_c_slow_mode, phi_i_mushy, & - floediam, hfrazilmin + floediam, hfrazilmin, Tliquidus_max, hi_min namelist /dynamics_nml/ & kdyn, ndte, revised_evp, yield_curve, & @@ -242,7 +242,7 @@ subroutine input_data Cf, Pstar, Cstar, Ktens namelist /shortwave_nml/ & - shortwave, albedo_type, & + shortwave, albedo_type, snw_ssp_table, & albicev, albicei, albsnowv, albsnowi, & ahmax, R_ice, R_pnd, R_snw, & sw_redist, sw_frac, sw_dtemp, & @@ -281,7 +281,7 @@ subroutine input_data abort_list = "" - call icepack_query_parameters(puny_out=puny) + call icepack_query_parameters(puny_out=puny,Tocnfrz_out=Tocnfrz) ! nu_diag not yet defined ! call icepack_warnings_flush(nu_diag) ! if (icepack_warnings_aborted()) call abort_ice(error_message=subname//'Icepack Abort0', & @@ -434,6 +434,7 @@ subroutine input_data advection = 'remap' ! incremental remapping transport scheme conserv_check = .false. ! tracer conservation check shortwave = 'ccsm3' ! 'ccsm3' or 'dEdd' (delta-Eddington) + snw_ssp_table = 'test' ! 'test' or 'snicar' dEdd_snicar_ad table data albedo_type = 'ccsm3' ! 'ccsm3' or 'constant' ktherm = 1 ! -1 = OFF, 1 = BL99, 2 = mushy thermo conduct = 'bubbly' ! 'MU71' or 'bubbly' (Pringle et al 2007) @@ -444,6 +445,7 @@ subroutine input_data calc_Tsfc = .true. ! calculate surface temperature update_ocn_f = .false. ! include fresh water and salt fluxes for frazil ustar_min = 0.005 ! minimum friction velocity for ocean heat flux (m/s) + hi_min = p01 ! minimum ice thickness allowed (m) iceruf = 0.0005_dbl_kind ! ice surface roughness at atmosphere interface (m) iceruf_ocn = 0.03_dbl_kind ! under-ice roughness (m) calc_dragio = .false. ! compute dragio from iceruf_ocn and thickness of first ocean level @@ -577,6 +579,7 @@ subroutine input_data dSdt_slow_mode = -1.5e-7_dbl_kind ! slow mode drainage strength (m s-1 K-1) phi_c_slow_mode = 0.05_dbl_kind ! critical liquid fraction porosity cutoff phi_i_mushy = 0.85_dbl_kind ! liquid fraction of congelation ice + Tliquidus_max = 0.00_dbl_kind ! maximum liquidus temperature of mush (C) floediam = 300.0_dbl_kind ! min thickness of new frazil ice (m) hfrazilmin = 0.05_dbl_kind ! effective floe diameter (m) @@ -987,6 +990,7 @@ subroutine input_data call broadcast_scalar(advection, master_task) call broadcast_scalar(conserv_check, master_task) call broadcast_scalar(shortwave, master_task) + call broadcast_scalar(snw_ssp_table, master_task) call broadcast_scalar(albedo_type, master_task) call broadcast_scalar(ktherm, master_task) call broadcast_scalar(coriolis, master_task) @@ -1069,6 +1073,7 @@ subroutine input_data call broadcast_scalar(update_ocn_f, master_task) call broadcast_scalar(l_mpond_fresh, master_task) call broadcast_scalar(ustar_min, master_task) + call broadcast_scalar(hi_min, master_task) call broadcast_scalar(iceruf, master_task) call broadcast_scalar(iceruf_ocn, master_task) call broadcast_scalar(calc_dragio, master_task) @@ -1143,6 +1148,7 @@ subroutine input_data call broadcast_scalar(dSdt_slow_mode, master_task) call broadcast_scalar(phi_c_slow_mode, master_task) call broadcast_scalar(phi_i_mushy, master_task) + call broadcast_scalar(Tliquidus_max, master_task) call broadcast_scalar(sw_redist, master_task) call broadcast_scalar(sw_frac, master_task) call broadcast_scalar(sw_dtemp, master_task) @@ -1269,7 +1275,7 @@ subroutine input_data write(nu_diag,*) subname//' ERROR: invalid seabed stress method' write(nu_diag,*) subname//' ERROR: seabed_stress_method should be LKD or probabilistic' endif - abort_list = trim(abort_list)//":34" + abort_list = trim(abort_list)//":48" endif endif @@ -1350,10 +1356,10 @@ subroutine input_data abort_list = trim(abort_list)//":7" endif - if (trim(shortwave) /= 'dEdd' .and. tr_pond .and. calc_tsfc) then + if (shortwave(1:4) /= 'dEdd' .and. tr_pond .and. calc_tsfc) then if (my_task == master_task) then write(nu_diag,*) subname//' ERROR: tr_pond=T, calc_tsfc=T, invalid shortwave' - write(nu_diag,*) subname//' ERROR: Must use shortwave=dEdd' + write(nu_diag,*) subname//' ERROR: Must use shortwave=dEdd or dEdd_snicar_ad' endif abort_list = trim(abort_list)//":8" endif @@ -1466,19 +1472,20 @@ subroutine input_data abort_list = trim(abort_list)//":36" endif - if (trim(shortwave) /= 'dEdd' .and. tr_aero) then + if (shortwave(1:4) /= 'dEdd' .and. tr_aero) then if (my_task == master_task) then write(nu_diag,*) subname//' ERROR: tr_aero=T, invalid shortwave' - write(nu_diag,*) subname//' ERROR: Must use shortwave=dEdd' + write(nu_diag,*) subname//' ERROR: Must use shortwave=dEdd or dEdd_snicar_ad' endif abort_list = trim(abort_list)//":10" endif - if (trim(shortwave) /= 'dEdd' .and. snwgrain) then + if (shortwave(1:4) /= 'dEdd' .and. snwgrain) then if (my_task == master_task) then - write (nu_diag,*) 'WARNING: snow grain radius activated but' - write (nu_diag,*) 'WARNING: dEdd shortwave is not.' + write (nu_diag,*) subname//' ERROR: snow grain radius is activated' + write (nu_diag,*) subname//' ERROR: Must use shortwave=dEdd or dEdd_snicar_ad' endif + abort_list = trim(abort_list)//":29" endif if ((rfracmin < -puny .or. rfracmin > c1+puny) .or. & @@ -1505,13 +1512,13 @@ subroutine input_data ! tcraig, is it really OK for users to run inconsistently? ! ech: yes, for testing sensitivities. It's not recommended for science runs - if (ktherm == 1 .and. trim(tfrz_option) /= 'linear_salt') then + if (ktherm == 1 .and. trim(tfrz_option(1:11)) /= 'linear_salt') then if (my_task == master_task) then write(nu_diag,*) subname//' WARNING: ktherm = 1 and tfrz_option = ',trim(tfrz_option) write(nu_diag,*) subname//' WARNING: For consistency, set tfrz_option = linear_salt' endif endif - if (ktherm == 2 .and. trim(tfrz_option) /= 'mushy') then + if (ktherm == 2 .and. trim(tfrz_option(1:5)) /= 'mushy') then if (my_task == master_task) then write(nu_diag,*) subname//' WARNING: ktherm = 2 and tfrz_option = ',trim(tfrz_option) write(nu_diag,*) subname//' WARNING: For consistency, set tfrz_option = mushy' @@ -1764,7 +1771,7 @@ subroutine input_data write(nu_diag,1020) ' nilyr = ', nilyr, ' : number of ice layers (equal thickness)' write(nu_diag,1020) ' nslyr = ', nslyr, ' : number of snow layers (equal thickness)' write(nu_diag,1020) ' nblyr = ', nblyr, ' : number of bio layers (equal thickness)' - if (trim(shortwave) == 'dEdd') & + if (shortwave(1:4) == 'dEdd') & write(nu_diag,*) 'dEdd interior and sfc scattering layers are used in both ice, snow (unequal)' write(nu_diag,1020) ' ncat = ', ncat, ' : number of ice categories' if (kcatbound == 0) then @@ -2000,6 +2007,7 @@ subroutine input_data write(nu_diag,1009) ' dSdt_slow_mode = ', dSdt_slow_mode,' : drainage strength parameter' write(nu_diag,1002) ' phi_c_slow_mode = ', phi_c_slow_mode,' : critical liquid fraction' write(nu_diag,1002) ' phi_i_mushy = ', phi_i_mushy,' : solid fraction at lower boundary' + write(nu_diag,1002) ' Tliquidus_max = ', Tliquidus_max,' : max mush liquidus temperature' endif write(nu_diag,1002) ' hfrazilmin = ', hfrazilmin,' : minimum new frazil ice thickness' @@ -2008,19 +2016,24 @@ subroutine input_data write(nu_diag,*) '--------------------------------' if (trim(shortwave) == 'dEdd') then tmpstr2 = ' : delta-Eddington multiple-scattering method' + elseif (trim(shortwave) == 'dEdd_snicar_ad') then + tmpstr2 = ' : delta-Eddington multiple-scattering method with SNICAR AD' elseif (trim(shortwave) == 'ccsm3') then tmpstr2 = ' : NCAR CCSM3 distribution method' else tmpstr2 = ' : unknown value' endif write(nu_diag,1030) ' shortwave = ', trim(shortwave),trim(tmpstr2) - if (trim(shortwave) == 'dEdd') then + if (shortwave(1:4) == 'dEdd') then write(nu_diag,1002) ' R_ice = ', R_ice,' : tuning parameter for sea ice albedo' write(nu_diag,1002) ' R_pnd = ', R_pnd,' : tuning parameter for ponded sea ice albedo' write(nu_diag,1002) ' R_snw = ', R_snw,' : tuning parameter for snow broadband albedo' write(nu_diag,1002) ' dT_mlt = ', dT_mlt,' : change in temperature per change in snow grain radius' write(nu_diag,1002) ' rsnw_mlt = ', rsnw_mlt,' : maximum melting snow grain radius' write(nu_diag,1002) ' kalg = ', kalg,' : absorption coefficient for algae' + if (trim(shortwave) == 'dEdd_snicar_ad') then + write(nu_diag,1030) ' snw_ssp_table = ', trim(snw_ssp_table) + endif else if (trim(albedo_type) == 'ccsm3') then tmpstr2 = ' : NCAR CCSM3 albedos' @@ -2091,16 +2104,21 @@ subroutine input_data if (trim(saltflux_option) == 'constant') then write(nu_diag,1002) ' ice_ref_salinity = ',ice_ref_salinity endif - if (trim(tfrz_option) == 'minus1p8') then - tmpstr2 = ' : constant ocean freezing temperature (-1.8C)' - elseif (trim(tfrz_option) == 'linear_salt') then + if (trim(tfrz_option(1:8)) == 'constant') then + tmpstr2 = ' : constant ocean freezing temperature (Tocnfrz)' + elseif (trim(tfrz_option(1:8)) == 'minus1p8') then + tmpstr2 = ' : constant ocean freezing temperature (-1.8C) (to be deprecated)' + elseif (trim(tfrz_option(1:11)) == 'linear_salt') then tmpstr2 = ' : linear function of salinity (use with ktherm=1)' - elseif (trim(tfrz_option) == 'mushy') then + elseif (trim(tfrz_option(1:5)) == 'mushy') then tmpstr2 = ' : Assur (1958) as in mushy-layer thermo (ktherm=2)' else tmpstr2 = ' : unknown value' endif write(nu_diag,1030) ' tfrz_option = ', trim(tfrz_option),trim(tmpstr2) + if (trim(tfrz_option(1:8)) == 'constant') then + write(nu_diag,1002) ' Tocnfrz = ', Tocnfrz + endif if (update_ocn_f) then tmpstr2 = ' : frazil water/salt fluxes included in ocean fluxes' else @@ -2122,6 +2140,7 @@ subroutine input_data endif write(nu_diag,1030) ' fbot_xfer_type = ', trim(fbot_xfer_type),trim(tmpstr2) write(nu_diag,1000) ' ustar_min = ', ustar_min,' : minimum value of ocean friction velocity' + write(nu_diag,1000) ' hi_min = ', hi_min,' : minimum ice thickness allowed (m)' if (calc_dragio) then tmpstr2 = ' : dragio computed from iceruf_ocn' else @@ -2191,7 +2210,7 @@ subroutine input_data write(nu_diag,*) 'Using default dEdd melt pond scheme for testing only' endif - if (trim(shortwave) == 'dEdd') then + if (shortwave(1:4) == 'dEdd') then write(nu_diag,1002) ' hs0 = ', hs0,' : snow depth of transition to bare sea ice' endif @@ -2481,7 +2500,7 @@ subroutine input_data call icepack_init_parameters(ustar_min_in=ustar_min, albicev_in=albicev, albicei_in=albicei, & albsnowv_in=albsnowv, albsnowi_in=albsnowi, natmiter_in=natmiter, atmiter_conv_in=atmiter_conv, & - emissivity_in=emissivity, & + emissivity_in=emissivity, snw_ssp_table_in=snw_ssp_table, hi_min_in=hi_min, & ahmax_in=ahmax, shortwave_in=shortwave, albedo_type_in=albedo_type, R_ice_in=R_ice, R_pnd_in=R_pnd, & R_snw_in=R_snw, dT_mlt_in=dT_mlt, rsnw_mlt_in=rsnw_mlt, & kstrength_in=kstrength, krdg_partic_in=krdg_partic, krdg_redist_in=krdg_redist, mu_rdg_in=mu_rdg, & @@ -2490,7 +2509,7 @@ subroutine input_data rfracmin_in=rfracmin, rfracmax_in=rfracmax, pndaspect_in=pndaspect, hs1_in=hs1, hp1_in=hp1, & ktherm_in=ktherm, calc_Tsfc_in=calc_Tsfc, conduct_in=conduct, & a_rapid_mode_in=a_rapid_mode, Rac_rapid_mode_in=Rac_rapid_mode, & - floediam_in=floediam, hfrazilmin_in=hfrazilmin, & + floediam_in=floediam, hfrazilmin_in=hfrazilmin, Tliquidus_max_in=Tliquidus_max, & aspect_rapid_mode_in=aspect_rapid_mode, dSdt_slow_mode_in=dSdt_slow_mode, & phi_c_slow_mode_in=phi_c_slow_mode, phi_i_mushy_in=phi_i_mushy, conserv_check_in=conserv_check, & wave_spec_type_in = wave_spec_type, & @@ -2805,7 +2824,8 @@ subroutine init_state 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,j,iblk)) aice_init(i,j,iblk) = aice(i,j,iblk) diff --git a/cicecore/cicedyn/general/ice_step_mod.F90 b/cicecore/cicedyn/general/ice_step_mod.F90 index 89dba3d12..552cde044 100644 --- a/cicecore/cicedyn/general/ice_step_mod.F90 +++ b/cicecore/cicedyn/general/ice_step_mod.F90 @@ -182,8 +182,7 @@ subroutine prep_radiation (iblk) alidr_init(i,j,iblk) = alidr_ai(i,j,iblk) alidf_init(i,j,iblk) = alidf_ai(i,j,iblk) - call icepack_prep_radiation (ncat=ncat, nilyr=nilyr, nslyr=nslyr, & - scale_factor=scale_factor(i,j,iblk), & + call icepack_prep_radiation (scale_factor=scale_factor(i,j,iblk), & aice = aice (i,j, iblk), aicen = aicen (i,j, :,iblk), & swvdr = swvdr (i,j, iblk), swvdf = swvdf (i,j, iblk), & swidr = swidr (i,j, iblk), swidf = swidf (i,j, iblk), & @@ -759,6 +758,7 @@ subroutine update_state (dt, daidt, dvidt, dagedt, offset) use ice_state, only: aicen, trcrn, vicen, vsnon, & aice, trcr, vice, vsno, aice0, trcr_depend, & bound_state, trcr_base, nt_strata, n_trcr_strata + use ice_flux, only: Tf use ice_timers, only: ice_timer_start, ice_timer_stop, timer_bound, timer_updstate real (kind=dbl_kind), intent(in) :: & @@ -825,7 +825,8 @@ subroutine update_state (dt, daidt, dvidt, dagedt, offset) 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,j,iblk)) if (present(offset)) then @@ -1042,7 +1043,7 @@ subroutine step_dyn_ridge (dt, ndtd, iblk) rdg_conv, rdg_shear, dardg1dt, dardg2dt, & dvirdgdt, opening, fpond, fresh, fhocn, & aparticn, krdgn, aredistn, vredistn, dardg1ndt, dardg2ndt, & - dvirdgndt, araftn, vraftn, fsalt + dvirdgndt, araftn, vraftn, fsalt, Tf use ice_flux_bgc, only: flux_bio, faero_ocn, fiso_ocn use ice_grid, only: tmask use ice_state, only: trcrn, vsnon, aicen, vicen, & @@ -1133,7 +1134,8 @@ subroutine step_dyn_ridge (dt, ndtd, iblk) aice = aice (i,j, iblk), & fsalt = fsalt (i,j, iblk), & first_ice = first_ice(i,j,:,iblk), & - flux_bio = flux_bio (i,j,1:nbtrcr,iblk)) + flux_bio = flux_bio (i,j,1:nbtrcr,iblk), & + Tf = Tf(i,j,iblk)) endif ! tmask @@ -1272,8 +1274,7 @@ subroutine step_radiation (dt, iblk) fswthrun, fswthrun_vdr, fswthrun_vdf, fswthrun_idr, fswthrun_idf, & albicen, albsnon, albpndn, & alvdrn, alidrn, alvdfn, alidfn, apeffn, trcrn_sw, snowfracn, & - kaer_tab, waer_tab, gaer_tab, kaer_bc_tab, waer_bc_tab, & - gaer_bc_tab, bcenh, swgrid, igrid + swgrid, igrid use ice_calendar, only: calendar_type, days_per_year, nextsw_cday, yday, msec use ice_domain_size, only: ncat, n_aero, nilyr, nslyr, n_zaero, n_algae, nblyr use ice_flux, only: swvdr, swvdf, swidr, swidf, coszen, fsnow @@ -1380,9 +1381,7 @@ subroutine step_radiation (dt, iblk) if (tmask(i,j,iblk)) then - call icepack_step_radiation (dt=dt, ncat=ncat, & - nblyr=nblyr, nilyr=nilyr, nslyr=nslyr, & - dEdd_algae=dEdd_algae, & + call icepack_step_radiation (dt=dt, & swgrid=swgrid(:), igrid=igrid(:), & fbri=fbri(:), & aicen=aicen(i,j, :,iblk), & @@ -1402,11 +1401,6 @@ subroutine step_radiation (dt, iblk) days_per_year=days_per_year, & nextsw_cday=nextsw_cday, yday=yday, & sec=msec, & - kaer_tab=kaer_tab, kaer_bc_tab=kaer_bc_tab(:,:), & - waer_tab=waer_tab, waer_bc_tab=waer_bc_tab(:,:), & - gaer_tab=gaer_tab, gaer_bc_tab=gaer_bc_tab(:,:), & - bcenh=bcenh(:,:,:), & - modal_aero=modal_aero, & swvdr =swvdr (i,j ,iblk), swvdf =swvdf (i,j ,iblk), & swidr =swidr (i,j ,iblk), swidf =swidf (i,j ,iblk), & coszen =coszen (i,j ,iblk), fsnow =fsnow (i,j ,iblk), & diff --git a/cicecore/cicedyn/infrastructure/ice_restart_driver.F90 b/cicecore/cicedyn/infrastructure/ice_restart_driver.F90 index ffe9ec587..bde40dd14 100644 --- a/cicecore/cicedyn/infrastructure/ice_restart_driver.F90 +++ b/cicecore/cicedyn/infrastructure/ice_restart_driver.F90 @@ -292,7 +292,7 @@ subroutine restartfile (ice_ic) stress12_1, stress12_2, stress12_3, stress12_4, & stresspT, stressmT, stress12T, & stresspU, stressmU, stress12U - use ice_flux, only: coszen + use ice_flux, only: coszen, Tf use ice_grid, only: tmask, grid_type, grid_ice, grid_average_X2Y use ice_state, only: trcr_depend, aice, vice, vsno, trcr, & aice0, aicen, vicen, vsnon, trcrn, aice_init, uvel, vvel, & @@ -700,7 +700,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,j,iblk)) aice_init(i,j,iblk) = aice(i,j,iblk) enddo @@ -736,7 +737,7 @@ subroutine restartfile_v4 (ice_ic) max_blocks use ice_dyn_shared, only: iceUmask use ice_flux, only: scale_factor, swvdr, swvdf, swidr, swidf, & - strocnxT_iavg, strocnyT_iavg, sst, frzmlt, & + strocnxT_iavg, strocnyT_iavg, sst, frzmlt, Tf, & stressp_1, stressp_2, stressp_3, stressp_4, & stressm_1, stressm_2, stressm_3, stressm_4, & stress12_1, stress12_2, stress12_3, stress12_4 @@ -1068,7 +1069,8 @@ subroutine restartfile_v4 (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,j,iblk)) aice_init(i,j,iblk) = aice(i,j,iblk) enddo diff --git a/cicecore/drivers/direct/hadgem3/CICE_InitMod.F90 b/cicecore/drivers/direct/hadgem3/CICE_InitMod.F90 index 85050d8c9..4efb13c52 100644 --- a/cicecore/drivers/direct/hadgem3/CICE_InitMod.F90 +++ b/cicecore/drivers/direct/hadgem3/CICE_InitMod.F90 @@ -18,7 +18,7 @@ module CICE_InitMod use icepack_intfc, only: icepack_aggregate use icepack_intfc, only: icepack_init_itd, icepack_init_itd_hist use icepack_intfc, only: icepack_init_fsd_bounds, icepack_init_wave - use icepack_intfc, only: icepack_configure + use icepack_intfc, only: icepack_configure, icepack_init_radiation use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted use icepack_intfc, only: icepack_query_parameters, icepack_query_tracer_flags, & icepack_query_tracer_indices, icepack_query_tracer_sizes @@ -79,7 +79,7 @@ subroutine cice_init use ice_forcing, only: init_forcing_ocn, init_forcing_atmo, & get_forcing_atmo, get_forcing_ocn, alloc_forcing, get_wave_spec use ice_forcing_bgc, only: get_forcing_bgc, get_atm_bgc, & - faero_data, faero_default, faero_optics, alloc_forcing_bgc + faero_data, faero_default, alloc_forcing_bgc use ice_grid, only: init_grid1, init_grid2, alloc_grid use ice_history, only: init_hist, accum_hist use ice_restart_shared, only: restart, runid, runtype @@ -170,15 +170,13 @@ subroutine cice_init call init_history_therm ! initialize thermo history variables call init_history_dyn ! initialize dynamic history variables call calc_timesteps ! update timestep counter if not using npt_unit="1" + call icepack_init_radiation ! initialize icepack shortwave tables call icepack_query_tracer_flags(tr_aero_out=tr_aero, tr_zaero_out=tr_zaero) call icepack_warnings_flush(nu_diag) if (icepack_warnings_aborted()) call abort_ice(subname, & file=__FILE__,line= __LINE__) - if (tr_aero .or. tr_zaero) call faero_optics !initialize aerosol optical - !property tables - ! Initialize shortwave components using swdn from previous timestep ! if restarting. These components will be scaled to current forcing ! in prep_radiation. @@ -231,7 +229,7 @@ subroutine init_restart use ice_domain_size, only: ncat, n_aero, nfsd use ice_dyn_eap, only: read_restart_eap use ice_dyn_shared, only: kdyn - use ice_flux, only: sss + use ice_flux, only: sss, Tf use ice_grid, only: tmask use ice_init, only: ice_ic use ice_init_column, only: init_age, init_FY, init_lvl, & @@ -427,7 +425,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,j,iblk)) else ! tcraig, reset all tracer values on land to zero trcrn(i,j,:,:,iblk) = c0 diff --git a/cicecore/drivers/direct/nemo_concepts/CICE_InitMod.F90 b/cicecore/drivers/direct/nemo_concepts/CICE_InitMod.F90 index 3a8f5e33d..69ecd4c91 100644 --- a/cicecore/drivers/direct/nemo_concepts/CICE_InitMod.F90 +++ b/cicecore/drivers/direct/nemo_concepts/CICE_InitMod.F90 @@ -18,7 +18,7 @@ module CICE_InitMod use icepack_intfc, only: icepack_aggregate use icepack_intfc, only: icepack_init_itd, icepack_init_itd_hist use icepack_intfc, only: icepack_init_fsd_bounds, icepack_init_wave - use icepack_intfc, only: icepack_configure + use icepack_intfc, only: icepack_configure, icepack_init_radiation use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted use icepack_intfc, only: icepack_query_parameters, icepack_query_tracer_flags, & icepack_query_tracer_indices, icepack_query_tracer_sizes @@ -79,7 +79,7 @@ subroutine cice_init use ice_forcing, only: init_forcing_ocn, init_forcing_atmo, & get_forcing_atmo, get_forcing_ocn, alloc_forcing, get_wave_spec use ice_forcing_bgc, only: get_forcing_bgc, get_atm_bgc, & - faero_data, faero_default, faero_optics, alloc_forcing_bgc + faero_data, faero_default, alloc_forcing_bgc use ice_grid, only: init_grid1, init_grid2, alloc_grid use ice_history, only: init_hist, accum_hist use ice_restart_shared, only: restart, runid, runtype @@ -170,15 +170,13 @@ subroutine cice_init call init_history_therm ! initialize thermo history variables call init_history_dyn ! initialize dynamic history variables call calc_timesteps ! update timestep counter if not using npt_unit="1" + call icepack_init_radiation ! initialize icepack shortwave tables call icepack_query_tracer_flags(tr_aero_out=tr_aero, tr_zaero_out=tr_zaero) call icepack_warnings_flush(nu_diag) if (icepack_warnings_aborted()) call abort_ice(subname, & file=__FILE__,line= __LINE__) - if (tr_aero .or. tr_zaero) call faero_optics !initialize aerosol optical - !property tables - ! Initialize shortwave components using swdn from previous timestep ! if restarting. These components will be scaled to current forcing ! in prep_radiation. @@ -231,7 +229,7 @@ subroutine init_restart use ice_domain_size, only: ncat, n_aero, nfsd use ice_dyn_eap, only: read_restart_eap use ice_dyn_shared, only: kdyn - use ice_flux, only: sss + use ice_flux, only: sss, Tf use ice_grid, only: tmask use ice_init, only: ice_ic use ice_init_column, only: init_age, init_FY, init_lvl, & @@ -427,7 +425,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,j,iblk)) else ! tcraig, reset all tracer values on land to zero trcrn(i,j,:,:,iblk) = c0 diff --git a/cicecore/drivers/mct/cesm1/CICE_InitMod.F90 b/cicecore/drivers/mct/cesm1/CICE_InitMod.F90 index 5efa18a28..3c5907c54 100644 --- a/cicecore/drivers/mct/cesm1/CICE_InitMod.F90 +++ b/cicecore/drivers/mct/cesm1/CICE_InitMod.F90 @@ -19,7 +19,7 @@ module CICE_InitMod use icepack_intfc, only: icepack_aggregate use icepack_intfc, only: icepack_init_itd, icepack_init_itd_hist use icepack_intfc, only: icepack_init_fsd_bounds, icepack_init_wave - use icepack_intfc, only: icepack_init_snow + use icepack_intfc, only: icepack_init_snow, icepack_init_radiation use icepack_intfc, only: icepack_configure use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted use icepack_intfc, only: icepack_query_parameters, icepack_query_tracer_flags, & @@ -81,7 +81,7 @@ subroutine cice_init(mpicom_ice) use ice_forcing, only: init_forcing_ocn, init_forcing_atmo, & get_forcing_atmo, get_forcing_ocn, get_wave_spec, init_snowtable use ice_forcing_bgc, only: get_forcing_bgc, get_atm_bgc, & - faero_default, faero_optics, alloc_forcing_bgc, fiso_default + faero_default, alloc_forcing_bgc, fiso_default use ice_grid, only: init_grid1, init_grid2, alloc_grid use ice_history, only: init_hist, accum_hist use ice_restart_shared, only: restart, runtype @@ -186,6 +186,7 @@ subroutine cice_init(mpicom_ice) call init_history_therm ! initialize thermo history variables call init_history_dyn ! initialize dynamic history variables call calc_timesteps ! update timestep counter if not using npt_unit="1" + call icepack_init_radiation ! initialize icepack shortwave tables call icepack_query_tracer_flags(tr_aero_out=tr_aero, tr_zaero_out=tr_zaero) call icepack_query_tracer_flags(tr_iso_out=tr_iso, tr_snow_out=tr_snow) @@ -193,9 +194,6 @@ subroutine cice_init(mpicom_ice) if (icepack_warnings_aborted()) call abort_ice(trim(subname), & file=__FILE__,line= __LINE__) - if (tr_aero .or. tr_zaero) call faero_optics !initialize aerosol optical - !property tables - ! Initialize shortwave components using swdn from previous timestep ! if restarting. These components will be scaled to current forcing ! in prep_radiation. @@ -261,6 +259,7 @@ subroutine init_restart use ice_domain_size, only: ncat, n_iso, n_aero, nfsd, nslyr use ice_dyn_eap, only: read_restart_eap use ice_dyn_shared, only: kdyn + use ice_flux, only: Tf use ice_grid, only: tmask use ice_init, only: ice_ic use ice_init_column, only: init_age, init_FY, init_lvl, init_snowtracers, & @@ -492,7 +491,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,j,iblk)) else ! tcraig, reset all tracer values on land to zero trcrn(i,j,:,:,iblk) = c0 diff --git a/cicecore/drivers/mct/cesm1/ice_import_export.F90 b/cicecore/drivers/mct/cesm1/ice_import_export.F90 index 868ed42b4..110bcd39c 100644 --- a/cicecore/drivers/mct/cesm1/ice_import_export.F90 +++ b/cicecore/drivers/mct/cesm1/ice_import_export.F90 @@ -429,11 +429,11 @@ subroutine ice_import( x2i ) sss(i,j,iblk)=max(sss(i,j,iblk),c0) #endif - if (tfrz_option == 'minus1p8') then + if (tfrz_option(1:8) == 'minus1p8') then Tf (i,j,iblk) = -1.8_dbl_kind - elseif (tfrz_option == 'linear_salt') then + elseif (tfrz_option(1:11) == 'linear_salt') then Tf (i,j,iblk) = -0.0544_r8*sss(i,j,iblk) ! THIS IS THE ORIGINAL POP FORMULA - elseif (tfrz_option == 'mushy') then + elseif (tfrz_option(1:5) == 'mushy') then if (sss(i,j,iblk) > c0) then Tf (i,j,iblk) = sss(i,j,iblk) / (-18.48_dbl_kind & + ((18.48_dbl_kind*p001)*sss(i,j,iblk))) diff --git a/cicecore/drivers/mct/cesm1/ice_prescribed_mod.F90 b/cicecore/drivers/mct/cesm1/ice_prescribed_mod.F90 index 599249083..27bae6eb6 100644 --- a/cicecore/drivers/mct/cesm1/ice_prescribed_mod.F90 +++ b/cicecore/drivers/mct/cesm1/ice_prescribed_mod.F90 @@ -563,7 +563,8 @@ subroutine ice_prescribed_phys 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,j,iblk)) enddo ! i enddo ! j diff --git a/cicecore/drivers/nuopc/cmeps/CICE_InitMod.F90 b/cicecore/drivers/nuopc/cmeps/CICE_InitMod.F90 index 270e7b371..2ebcc696a 100644 --- a/cicecore/drivers/nuopc/cmeps/CICE_InitMod.F90 +++ b/cicecore/drivers/nuopc/cmeps/CICE_InitMod.F90 @@ -8,7 +8,7 @@ module CICE_InitMod use icepack_intfc, only: icepack_aggregate use icepack_intfc, only: icepack_init_itd, icepack_init_itd_hist use icepack_intfc, only: icepack_init_fsd_bounds, icepack_init_wave - use icepack_intfc, only: icepack_init_snow + use icepack_intfc, only: icepack_init_snow, icepack_init_radiation use icepack_intfc, only: icepack_configure use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted use icepack_intfc, only: icepack_query_parameters, icepack_query_tracer_flags @@ -85,7 +85,7 @@ subroutine cice_init2() use ice_flux , only: init_history_dyn, init_flux_atm, init_flux_ocn use ice_forcing , only: init_snowtable use ice_forcing_bgc , only: get_forcing_bgc, get_atm_bgc - use ice_forcing_bgc , only: faero_default, faero_optics, alloc_forcing_bgc, fiso_default + use ice_forcing_bgc , only: faero_default, alloc_forcing_bgc, fiso_default use ice_history , only: init_hist, accum_hist use ice_restart_shared , only: restart, runtype use ice_init , only: input_data, init_state @@ -156,6 +156,7 @@ subroutine cice_init2() call init_diags ! initialize diagnostic output points call init_history_therm ! initialize thermo history variables call init_history_dyn ! initialize dynamic history variables + call icepack_init_radiation ! initialize icepack shortwave tables call icepack_query_tracer_flags(tr_aero_out=tr_aero, tr_zaero_out=tr_zaero) call icepack_query_tracer_flags(tr_iso_out=tr_iso, tr_snow_out=tr_snow) @@ -163,10 +164,6 @@ subroutine cice_init2() if (icepack_warnings_aborted()) call abort_ice(trim(subname), & file=__FILE__,line= __LINE__) - if (tr_aero .or. tr_zaero) then - call faero_optics !initialize aerosol optical property tables - end if - ! snow aging lookup table initialization if (tr_snow) then ! advanced snow physics call icepack_init_snow() @@ -218,6 +215,7 @@ subroutine init_restart() use ice_domain_size, only: ncat, n_iso, n_aero, nfsd, nslyr use ice_dyn_eap, only: read_restart_eap use ice_dyn_shared, only: kdyn + use ice_flux, only: Tf use ice_grid, only: tmask use ice_init, only: ice_ic use ice_init_column, only: init_age, init_FY, init_lvl, init_snowtracers, & @@ -445,7 +443,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,j,iblk)) else ! tcraig, reset all tracer values on land to zero trcrn(i,j,:,:,iblk) = c0 diff --git a/cicecore/drivers/nuopc/cmeps/ice_prescribed_mod.F90 b/cicecore/drivers/nuopc/cmeps/ice_prescribed_mod.F90 index 06b090ece..0a11ee6ea 100644 --- a/cicecore/drivers/nuopc/cmeps/ice_prescribed_mod.F90 +++ b/cicecore/drivers/nuopc/cmeps/ice_prescribed_mod.F90 @@ -453,7 +453,8 @@ subroutine ice_prescribed_phys() 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,j,iblk)) end if ! tmask enddo ! i diff --git a/cicecore/drivers/nuopc/dmi/CICE_InitMod.F90 b/cicecore/drivers/nuopc/dmi/CICE_InitMod.F90 index dc83c7703..147bdf7df 100644 --- a/cicecore/drivers/nuopc/dmi/CICE_InitMod.F90 +++ b/cicecore/drivers/nuopc/dmi/CICE_InitMod.F90 @@ -19,7 +19,7 @@ module CICE_InitMod use icepack_intfc, only: icepack_aggregate use icepack_intfc, only: icepack_init_itd, icepack_init_itd_hist use icepack_intfc, only: icepack_init_fsd_bounds, icepack_init_wave - use icepack_intfc, only: icepack_init_snow + use icepack_intfc, only: icepack_init_snow, icepack_init_radiation use icepack_intfc, only: icepack_configure use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted use icepack_intfc, only: icepack_query_parameters, icepack_query_tracer_flags, & @@ -86,7 +86,7 @@ subroutine cice_init(mpi_comm) use ice_forcing, only: init_forcing_ocn, init_forcing_atmo, & get_forcing_atmo, get_forcing_ocn, get_wave_spec, init_snowtable use ice_forcing_bgc, only: get_forcing_bgc, get_atm_bgc, & - faero_default, faero_optics, alloc_forcing_bgc, fiso_default + faero_default, alloc_forcing_bgc, fiso_default use ice_grid, only: init_grid1, init_grid2, alloc_grid use ice_history, only: init_hist, accum_hist use ice_restart_shared, only: restart, runtype @@ -196,6 +196,7 @@ subroutine cice_init(mpi_comm) call init_history_therm ! initialize thermo history variables call init_history_dyn ! initialize dynamic history variables call calc_timesteps ! update timestep counter if not using npt_unit="1" + call icepack_init_radiation ! initialize icepack shortwave tables call icepack_query_tracer_flags(tr_aero_out=tr_aero, tr_zaero_out=tr_zaero) call icepack_query_tracer_flags(tr_iso_out=tr_iso, tr_snow_out=tr_snow) @@ -203,9 +204,6 @@ subroutine cice_init(mpi_comm) if (icepack_warnings_aborted()) call abort_ice(trim(subname), & file=__FILE__,line= __LINE__) - if (tr_aero .or. tr_zaero) call faero_optics !initialize aerosol optical - !property tables - ! Initialize shortwave components using swdn from previous timestep ! if restarting. These components will be scaled to current forcing ! in prep_radiation. @@ -279,6 +277,7 @@ subroutine init_restart use ice_domain_size, only: ncat, n_iso, n_aero, nfsd, nslyr use ice_dyn_eap, only: read_restart_eap use ice_dyn_shared, only: kdyn + use ice_flux, only: Tf use ice_grid, only: tmask use ice_init, only: ice_ic use ice_init_column, only: init_age, init_FY, init_lvl, init_snowtracers, & @@ -510,7 +509,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,j,iblk)) else ! tcraig, reset all tracer values on land to zero trcrn(i,j,:,:,iblk) = c0 diff --git a/cicecore/drivers/standalone/cice/CICE_InitMod.F90 b/cicecore/drivers/standalone/cice/CICE_InitMod.F90 index dc9fece6e..38000446a 100644 --- a/cicecore/drivers/standalone/cice/CICE_InitMod.F90 +++ b/cicecore/drivers/standalone/cice/CICE_InitMod.F90 @@ -19,7 +19,7 @@ module CICE_InitMod use icepack_intfc, only: icepack_aggregate use icepack_intfc, only: icepack_init_itd, icepack_init_itd_hist use icepack_intfc, only: icepack_init_fsd_bounds, icepack_init_wave - use icepack_intfc, only: icepack_init_snow + use icepack_intfc, only: icepack_init_snow, icepack_init_radiation use icepack_intfc, only: icepack_configure use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted use icepack_intfc, only: icepack_query_parameters, icepack_query_tracer_flags, & @@ -81,7 +81,7 @@ subroutine cice_init use ice_forcing, only: init_forcing_ocn, init_forcing_atmo, & get_forcing_atmo, get_forcing_ocn, get_wave_spec, init_snowtable use ice_forcing_bgc, only: get_forcing_bgc, get_atm_bgc, & - faero_default, faero_optics, alloc_forcing_bgc, fiso_default + faero_default, alloc_forcing_bgc, fiso_default use ice_grid, only: init_grid1, init_grid2, alloc_grid use ice_history, only: init_hist, accum_hist use ice_restart_shared, only: restart, runtype @@ -183,6 +183,7 @@ subroutine cice_init call init_history_therm ! initialize thermo history variables call init_history_dyn ! initialize dynamic history variables call calc_timesteps ! update timestep counter if not using npt_unit="1" + call icepack_init_radiation ! initialize icepack shortwave tables call icepack_query_tracer_flags(tr_aero_out=tr_aero, tr_zaero_out=tr_zaero) call icepack_query_tracer_flags(tr_iso_out=tr_iso, tr_snow_out=tr_snow) @@ -190,9 +191,6 @@ subroutine cice_init if (icepack_warnings_aborted()) call abort_ice(trim(subname), & file=__FILE__,line= __LINE__) - if (tr_aero .or. tr_zaero) call faero_optics !initialize aerosol optical - !property tables - ! Initialize shortwave components using swdn from previous timestep ! if restarting. These components will be scaled to current forcing ! in prep_radiation. @@ -278,6 +276,7 @@ subroutine init_restart restart_aero, read_restart_aero, & restart_hbrine, read_restart_hbrine, & restart_bgc + use ice_flux, only: Tf use ice_restart_driver, only: restartfile use ice_restart_shared, only: runtype, restart use ice_state ! almost everything @@ -492,7 +491,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,j,iblk)) else ! tcraig, reset all tracer values on land to zero trcrn(i,j,:,:,iblk) = c0 diff --git a/cicecore/drivers/unittest/gridavgchk/CICE_InitMod.F90 b/cicecore/drivers/unittest/gridavgchk/CICE_InitMod.F90 index dc9fece6e..38000446a 100644 --- a/cicecore/drivers/unittest/gridavgchk/CICE_InitMod.F90 +++ b/cicecore/drivers/unittest/gridavgchk/CICE_InitMod.F90 @@ -19,7 +19,7 @@ module CICE_InitMod use icepack_intfc, only: icepack_aggregate use icepack_intfc, only: icepack_init_itd, icepack_init_itd_hist use icepack_intfc, only: icepack_init_fsd_bounds, icepack_init_wave - use icepack_intfc, only: icepack_init_snow + use icepack_intfc, only: icepack_init_snow, icepack_init_radiation use icepack_intfc, only: icepack_configure use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted use icepack_intfc, only: icepack_query_parameters, icepack_query_tracer_flags, & @@ -81,7 +81,7 @@ subroutine cice_init use ice_forcing, only: init_forcing_ocn, init_forcing_atmo, & get_forcing_atmo, get_forcing_ocn, get_wave_spec, init_snowtable use ice_forcing_bgc, only: get_forcing_bgc, get_atm_bgc, & - faero_default, faero_optics, alloc_forcing_bgc, fiso_default + faero_default, alloc_forcing_bgc, fiso_default use ice_grid, only: init_grid1, init_grid2, alloc_grid use ice_history, only: init_hist, accum_hist use ice_restart_shared, only: restart, runtype @@ -183,6 +183,7 @@ subroutine cice_init call init_history_therm ! initialize thermo history variables call init_history_dyn ! initialize dynamic history variables call calc_timesteps ! update timestep counter if not using npt_unit="1" + call icepack_init_radiation ! initialize icepack shortwave tables call icepack_query_tracer_flags(tr_aero_out=tr_aero, tr_zaero_out=tr_zaero) call icepack_query_tracer_flags(tr_iso_out=tr_iso, tr_snow_out=tr_snow) @@ -190,9 +191,6 @@ subroutine cice_init if (icepack_warnings_aborted()) call abort_ice(trim(subname), & file=__FILE__,line= __LINE__) - if (tr_aero .or. tr_zaero) call faero_optics !initialize aerosol optical - !property tables - ! Initialize shortwave components using swdn from previous timestep ! if restarting. These components will be scaled to current forcing ! in prep_radiation. @@ -278,6 +276,7 @@ subroutine init_restart restart_aero, read_restart_aero, & restart_hbrine, read_restart_hbrine, & restart_bgc + use ice_flux, only: Tf use ice_restart_driver, only: restartfile use ice_restart_shared, only: runtype, restart use ice_state ! almost everything @@ -492,7 +491,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,j,iblk)) else ! tcraig, reset all tracer values on land to zero trcrn(i,j,:,:,iblk) = c0 diff --git a/cicecore/drivers/unittest/halochk/CICE_InitMod.F90 b/cicecore/drivers/unittest/halochk/CICE_InitMod.F90 index dc9fece6e..38000446a 100644 --- a/cicecore/drivers/unittest/halochk/CICE_InitMod.F90 +++ b/cicecore/drivers/unittest/halochk/CICE_InitMod.F90 @@ -19,7 +19,7 @@ module CICE_InitMod use icepack_intfc, only: icepack_aggregate use icepack_intfc, only: icepack_init_itd, icepack_init_itd_hist use icepack_intfc, only: icepack_init_fsd_bounds, icepack_init_wave - use icepack_intfc, only: icepack_init_snow + use icepack_intfc, only: icepack_init_snow, icepack_init_radiation use icepack_intfc, only: icepack_configure use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted use icepack_intfc, only: icepack_query_parameters, icepack_query_tracer_flags, & @@ -81,7 +81,7 @@ subroutine cice_init use ice_forcing, only: init_forcing_ocn, init_forcing_atmo, & get_forcing_atmo, get_forcing_ocn, get_wave_spec, init_snowtable use ice_forcing_bgc, only: get_forcing_bgc, get_atm_bgc, & - faero_default, faero_optics, alloc_forcing_bgc, fiso_default + faero_default, alloc_forcing_bgc, fiso_default use ice_grid, only: init_grid1, init_grid2, alloc_grid use ice_history, only: init_hist, accum_hist use ice_restart_shared, only: restart, runtype @@ -183,6 +183,7 @@ subroutine cice_init call init_history_therm ! initialize thermo history variables call init_history_dyn ! initialize dynamic history variables call calc_timesteps ! update timestep counter if not using npt_unit="1" + call icepack_init_radiation ! initialize icepack shortwave tables call icepack_query_tracer_flags(tr_aero_out=tr_aero, tr_zaero_out=tr_zaero) call icepack_query_tracer_flags(tr_iso_out=tr_iso, tr_snow_out=tr_snow) @@ -190,9 +191,6 @@ subroutine cice_init if (icepack_warnings_aborted()) call abort_ice(trim(subname), & file=__FILE__,line= __LINE__) - if (tr_aero .or. tr_zaero) call faero_optics !initialize aerosol optical - !property tables - ! Initialize shortwave components using swdn from previous timestep ! if restarting. These components will be scaled to current forcing ! in prep_radiation. @@ -278,6 +276,7 @@ subroutine init_restart restart_aero, read_restart_aero, & restart_hbrine, read_restart_hbrine, & restart_bgc + use ice_flux, only: Tf use ice_restart_driver, only: restartfile use ice_restart_shared, only: runtype, restart use ice_state ! almost everything @@ -492,7 +491,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,j,iblk)) else ! tcraig, reset all tracer values on land to zero trcrn(i,j,:,:,iblk) = c0 diff --git a/cicecore/drivers/unittest/opticep/CICE_InitMod.F90 b/cicecore/drivers/unittest/opticep/CICE_InitMod.F90 index dc9fece6e..38000446a 100644 --- a/cicecore/drivers/unittest/opticep/CICE_InitMod.F90 +++ b/cicecore/drivers/unittest/opticep/CICE_InitMod.F90 @@ -19,7 +19,7 @@ module CICE_InitMod use icepack_intfc, only: icepack_aggregate use icepack_intfc, only: icepack_init_itd, icepack_init_itd_hist use icepack_intfc, only: icepack_init_fsd_bounds, icepack_init_wave - use icepack_intfc, only: icepack_init_snow + use icepack_intfc, only: icepack_init_snow, icepack_init_radiation use icepack_intfc, only: icepack_configure use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted use icepack_intfc, only: icepack_query_parameters, icepack_query_tracer_flags, & @@ -81,7 +81,7 @@ subroutine cice_init use ice_forcing, only: init_forcing_ocn, init_forcing_atmo, & get_forcing_atmo, get_forcing_ocn, get_wave_spec, init_snowtable use ice_forcing_bgc, only: get_forcing_bgc, get_atm_bgc, & - faero_default, faero_optics, alloc_forcing_bgc, fiso_default + faero_default, alloc_forcing_bgc, fiso_default use ice_grid, only: init_grid1, init_grid2, alloc_grid use ice_history, only: init_hist, accum_hist use ice_restart_shared, only: restart, runtype @@ -183,6 +183,7 @@ subroutine cice_init call init_history_therm ! initialize thermo history variables call init_history_dyn ! initialize dynamic history variables call calc_timesteps ! update timestep counter if not using npt_unit="1" + call icepack_init_radiation ! initialize icepack shortwave tables call icepack_query_tracer_flags(tr_aero_out=tr_aero, tr_zaero_out=tr_zaero) call icepack_query_tracer_flags(tr_iso_out=tr_iso, tr_snow_out=tr_snow) @@ -190,9 +191,6 @@ subroutine cice_init if (icepack_warnings_aborted()) call abort_ice(trim(subname), & file=__FILE__,line= __LINE__) - if (tr_aero .or. tr_zaero) call faero_optics !initialize aerosol optical - !property tables - ! Initialize shortwave components using swdn from previous timestep ! if restarting. These components will be scaled to current forcing ! in prep_radiation. @@ -278,6 +276,7 @@ subroutine init_restart restart_aero, read_restart_aero, & restart_hbrine, read_restart_hbrine, & restart_bgc + use ice_flux, only: Tf use ice_restart_driver, only: restartfile use ice_restart_shared, only: runtype, restart use ice_state ! almost everything @@ -492,7 +491,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,j,iblk)) else ! tcraig, reset all tracer values on land to zero trcrn(i,j,:,:,iblk) = c0 diff --git a/cicecore/drivers/unittest/opticep/ice_init_column.F90 b/cicecore/drivers/unittest/opticep/ice_init_column.F90 index 04749b98c..cb9b93df1 100644 --- a/cicecore/drivers/unittest/opticep/ice_init_column.F90 +++ b/cicecore/drivers/unittest/opticep/ice_init_column.F90 @@ -184,7 +184,6 @@ subroutine init_shortwave albsnon, alvdrn, alidrn, alvdfn, alidfn, fswsfcn, & fswthrun, fswthrun_vdr, fswthrun_vdf, fswthrun_idr, fswthrun_idf, & fswintn, albpndn, apeffn, trcrn_sw, dhsn, ffracn, snowfracn, & - kaer_tab, waer_tab, gaer_tab, kaer_bc_tab, waer_bc_tab, gaer_bc_tab, bcenh, & swgrid, igrid use ice_blocks, only: block, get_block use ice_calendar, only: dt, calendar_type, & @@ -320,7 +319,7 @@ subroutine init_shortwave do j = jlo, jhi do i = ilo, ihi - if (trim(shortwave) == 'dEdd') then ! delta Eddington + if (shortwave(1:4) == 'dEdd') then ! delta Eddington #ifndef CESMCOUPLED ! initialize orbital parameters @@ -345,9 +344,7 @@ subroutine init_shortwave enddo if (tmask(i,j,iblk)) then - call icepack_step_radiation (dt=dt, ncat=ncat, & - nblyr=nblyr, nilyr=nilyr, nslyr=nslyr, & - dEdd_algae=dEdd_algae, & + call icepack_step_radiation (dt=dt, & swgrid=swgrid(:), igrid=igrid(:), & fbri=fbri(:), & aicen=aicen(i,j,:,iblk), & @@ -367,11 +364,6 @@ subroutine init_shortwave days_per_year=days_per_year, & nextsw_cday=nextsw_cday, yday=yday, & sec=msec, & - kaer_tab=kaer_tab, kaer_bc_tab=kaer_bc_tab(:,:), & - waer_tab=waer_tab, waer_bc_tab=waer_bc_tab(:,:), & - gaer_tab=gaer_tab, gaer_bc_tab=gaer_bc_tab(:,:), & - bcenh=bcenh(:,:,:), & - modal_aero=modal_aero, & swvdr=swvdr(i,j,iblk), swvdf=swvdf(i,j,iblk),& swidr=swidr(i,j,iblk), swidf=swidf(i,j,iblk),& coszen=coszen(i,j,iblk), fsnow=fsnow(i,j,iblk),& @@ -965,7 +957,7 @@ end subroutine init_hbrine subroutine input_zbgc - use ice_arrays_column, only: restore_bgc, optics_file, optics_file_fieldname + use ice_arrays_column, only: restore_bgc use ice_broadcast, only: broadcast_scalar use ice_restart_column, only: restart_bgc, restart_hbrine use ice_restart_shared, only: restart @@ -1007,7 +999,7 @@ subroutine input_zbgc restore_bgc, restart_bgc, scale_bgc, solve_zsal, restart_zsal, & tr_bgc_Nit, tr_bgc_C, tr_bgc_chl, tr_bgc_Am, tr_bgc_Sil, & tr_bgc_DMS, tr_bgc_PON, tr_bgc_hum, tr_bgc_DON, tr_bgc_Fe, & - grid_o, grid_o_t, l_sk, grid_oS, optics_file, optics_file_fieldname, & + grid_o, grid_o_t, l_sk, grid_oS, & l_skS, phi_snow, initbio_frac, frazil_scav, & ratio_Si2N_diatoms , ratio_Si2N_sp , ratio_Si2N_phaeo , & ratio_S2N_diatoms , ratio_S2N_sp , ratio_S2N_phaeo , & @@ -1064,8 +1056,6 @@ subroutine input_zbgc tr_brine = .false. ! brine height differs from ice height tr_zaero = .false. ! z aerosol tracers modal_aero = .false. ! use modal aerosol treatment of aerosols - optics_file = 'unknown_optics_file' ! modal aerosol optics file - optics_file_fieldname = 'unknown_optics_fieldname' ! modal aerosol optics file fieldname restore_bgc = .false. ! restore bgc if true solve_zsal = .false. ! update salinity tracer profile from solve_S_dt restart_bgc = .false. ! biogeochemistry restart @@ -1283,8 +1273,6 @@ subroutine input_zbgc call broadcast_scalar(tr_zaero, master_task) call broadcast_scalar(dEdd_algae, master_task) call broadcast_scalar(modal_aero, master_task) - call broadcast_scalar(optics_file, master_task) - call broadcast_scalar(optics_file_fieldname, master_task) call broadcast_scalar(grid_o, master_task) call broadcast_scalar(grid_o_t, master_task) call broadcast_scalar(l_sk, master_task) @@ -1464,9 +1452,9 @@ subroutine input_zbgc abort_flag = 107 endif - if (dEdd_algae .AND. trim(shortwave) /= 'dEdd') then + if (dEdd_algae .AND. shortwave(1:4) /= 'dEdd') then if (my_task == master_task) then - write(nu_diag,*) subname,' ERROR: dEdd_algae = T but shortwave /= dEdd' + write(nu_diag,*) subname,' ERROR: dEdd_algae = T but shortwave /= dEdd or dEdd_snicar_ad' endif abort_flag = 108 endif @@ -1485,9 +1473,9 @@ subroutine input_zbgc abort_flag = 110 endif - if (modal_aero .AND. trim(shortwave) /= 'dEdd') then + if (modal_aero .AND. shortwave(1:4) /= 'dEdd') then if (my_task == master_task) then - write(nu_diag,*) subname,' ERROR: modal_aero = T but shortwave /= dEdd' + write(nu_diag,*) subname,' ERROR: modal_aero = T but shortwave /= dEdd or dEdd_snicar_ad' endif abort_flag = 111 endif @@ -1641,8 +1629,6 @@ subroutine input_zbgc write(nu_diag,1010) ' solve_zbgc = ', solve_zbgc write(nu_diag,1010) ' tr_zaero = ', tr_zaero write(nu_diag,1020) ' number of aerosols = ', n_zaero - write(nu_diag,1031) ' optics_file = ', trim(optics_file) - write(nu_diag,1031) ' optics_file_fieldname = ', trim(optics_file_fieldname) ! bio parameters write(nu_diag,1000) ' grid_o = ', grid_o write(nu_diag,1000) ' grid_o_t = ', grid_o_t diff --git a/cicecore/drivers/unittest/opticep/ice_step_mod.F90 b/cicecore/drivers/unittest/opticep/ice_step_mod.F90 index c291d8802..ba19436bd 100644 --- a/cicecore/drivers/unittest/opticep/ice_step_mod.F90 +++ b/cicecore/drivers/unittest/opticep/ice_step_mod.F90 @@ -182,8 +182,7 @@ subroutine prep_radiation (iblk) alidr_init(i,j,iblk) = alidr_ai(i,j,iblk) alidf_init(i,j,iblk) = alidf_ai(i,j,iblk) - call icepack_prep_radiation (ncat=ncat, nilyr=nilyr, nslyr=nslyr, & - scale_factor=scale_factor(i,j,iblk), & + call icepack_prep_radiation (scale_factor=scale_factor(i,j,iblk), & aice = aice (i,j, iblk), aicen = aicen (i,j, :,iblk), & swvdr = swvdr (i,j, iblk), swvdf = swvdf (i,j, iblk), & swidr = swidr (i,j, iblk), swidf = swidf (i,j, iblk), & @@ -275,7 +274,7 @@ subroutine step_therm1 (dt, iblk) logical (kind=log_kind) :: & tr_iage, tr_FY, tr_iso, tr_aero, tr_pond, & - tr_pond_lvl, tr_pond_topo, calc_Tsfc, highfreq, tr_snow + tr_pond_lvl, tr_pond_topo, calc_Tsfc, snwgrain real (kind=dbl_kind) :: & puny ! a very small number @@ -296,13 +295,12 @@ subroutine step_therm1 (dt, iblk) call icepack_query_parameters(puny_out=puny) call icepack_query_parameters(calc_Tsfc_out=calc_Tsfc) - call icepack_query_parameters(highfreq_out=highfreq) + call icepack_query_parameters(snwgrain_out=snwgrain) call icepack_query_tracer_sizes(ntrcr_out=ntrcr) call icepack_query_tracer_flags( & tr_iage_out=tr_iage, tr_FY_out=tr_FY, tr_iso_out=tr_iso, & tr_aero_out=tr_aero, tr_pond_out=tr_pond, & - tr_pond_lvl_out=tr_pond_lvl, tr_pond_topo_out=tr_pond_topo, & - tr_snow_out=tr_snow) + tr_pond_lvl_out=tr_pond_lvl, tr_pond_topo_out=tr_pond_topo) 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, & @@ -357,7 +355,7 @@ subroutine step_therm1 (dt, iblk) do j = jlo, jhi do i = ilo, ihi - if (tr_snow) then + if (snwgrain) then do n = 1, ncat do k = 1, nslyr rsnwn (k,n) = trcrn(i,j,nt_rsnw +k-1,n,iblk) @@ -365,7 +363,7 @@ subroutine step_therm1 (dt, iblk) smliqn(k,n) = trcrn(i,j,nt_smliq+k-1,n,iblk) enddo enddo - endif ! tr_snow + endif ! snwgrain if (tr_iso) then ! trcrn(nt_iso*) has units kg/m^3 do n=1,ncat @@ -557,7 +555,7 @@ subroutine step_therm1 (dt, iblk) endif - if (tr_snow) then + if (snwgrain) then do n = 1, ncat do k = 1, nslyr trcrn(i,j,nt_rsnw +k-1,n,iblk) = rsnwn (k,n) @@ -565,7 +563,7 @@ subroutine step_therm1 (dt, iblk) trcrn(i,j,nt_smliq+k-1,n,iblk) = smliqn(k,n) enddo enddo - endif ! tr_snow + endif ! snwgrain if (tr_iso) then do n = 1, ncat @@ -762,6 +760,7 @@ subroutine update_state (dt, daidt, dvidt, dagedt, offset) use ice_state, only: aicen, trcrn, vicen, vsnon, & aice, trcr, vice, vsno, aice0, trcr_depend, & bound_state, trcr_base, nt_strata, n_trcr_strata + use ice_flux, only: Tf use ice_timers, only: ice_timer_start, ice_timer_stop, timer_bound, timer_updstate real (kind=dbl_kind), intent(in) :: & @@ -828,7 +827,8 @@ subroutine update_state (dt, daidt, dvidt, dagedt, offset) 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,j,iblk)) if (present(offset)) then @@ -1045,7 +1045,7 @@ subroutine step_dyn_ridge (dt, ndtd, iblk) rdg_conv, rdg_shear, dardg1dt, dardg2dt, & dvirdgdt, opening, fpond, fresh, fhocn, & aparticn, krdgn, aredistn, vredistn, dardg1ndt, dardg2ndt, & - dvirdgndt, araftn, vraftn, fsalt + dvirdgndt, araftn, vraftn, fsalt, Tf use ice_flux_bgc, only: flux_bio, faero_ocn, fiso_ocn use ice_grid, only: tmask use ice_state, only: trcrn, vsnon, aicen, vicen, & @@ -1136,7 +1136,8 @@ subroutine step_dyn_ridge (dt, ndtd, iblk) aice = aice (i,j, iblk), & fsalt = fsalt (i,j, iblk), & first_ice = first_ice(i,j,:,iblk), & - flux_bio = flux_bio (i,j,1:nbtrcr,iblk)) + flux_bio = flux_bio (i,j,1:nbtrcr,iblk), & + Tf = Tf(i,j,iblk)) endif ! tmask @@ -1275,8 +1276,7 @@ subroutine step_radiation (dt, iblk) fswthrun, fswthrun_vdr, fswthrun_vdf, fswthrun_idr, fswthrun_idf, & albicen, albsnon, albpndn, & alvdrn, alidrn, alvdfn, alidfn, apeffn, trcrn_sw, snowfracn, & - kaer_tab, waer_tab, gaer_tab, kaer_bc_tab, waer_bc_tab, & - gaer_bc_tab, bcenh, swgrid, igrid + swgrid, igrid use ice_calendar, only: calendar_type, days_per_year, nextsw_cday, yday, msec use ice_domain_size, only: ncat, n_aero, nilyr, nslyr, n_zaero, n_algae, nblyr use ice_flux, only: swvdr, swvdf, swidr, swidf, coszen, fsnow @@ -1383,9 +1383,7 @@ subroutine step_radiation (dt, iblk) if (tmask(i,j,iblk)) then - call icepack_step_radiation (dt=dt, ncat=ncat, & - nblyr=nblyr, nilyr=nilyr, nslyr=nslyr, & - dEdd_algae=dEdd_algae, & + call icepack_step_radiation (dt=dt, & swgrid=swgrid(:), igrid=igrid(:), & fbri=fbri(:), & aicen=aicen(i,j, :,iblk), & @@ -1405,11 +1403,6 @@ subroutine step_radiation (dt, iblk) days_per_year=days_per_year, & nextsw_cday=nextsw_cday, yday=yday, & sec=msec, & - kaer_tab=kaer_tab, kaer_bc_tab=kaer_bc_tab(:,:), & - waer_tab=waer_tab, waer_bc_tab=waer_bc_tab(:,:), & - gaer_tab=gaer_tab, gaer_bc_tab=gaer_bc_tab(:,:), & - bcenh=bcenh(:,:,:), & - modal_aero=modal_aero, & swvdr =swvdr (i,j ,iblk), swvdf =swvdf (i,j ,iblk), & swidr =swidr (i,j ,iblk), swidf =swidf (i,j ,iblk), & coszen =coszen (i,j ,iblk), fsnow =fsnow (i,j ,iblk), & diff --git a/cicecore/drivers/unittest/sumchk/CICE_InitMod.F90 b/cicecore/drivers/unittest/sumchk/CICE_InitMod.F90 index dc9fece6e..38000446a 100644 --- a/cicecore/drivers/unittest/sumchk/CICE_InitMod.F90 +++ b/cicecore/drivers/unittest/sumchk/CICE_InitMod.F90 @@ -19,7 +19,7 @@ module CICE_InitMod use icepack_intfc, only: icepack_aggregate use icepack_intfc, only: icepack_init_itd, icepack_init_itd_hist use icepack_intfc, only: icepack_init_fsd_bounds, icepack_init_wave - use icepack_intfc, only: icepack_init_snow + use icepack_intfc, only: icepack_init_snow, icepack_init_radiation use icepack_intfc, only: icepack_configure use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted use icepack_intfc, only: icepack_query_parameters, icepack_query_tracer_flags, & @@ -81,7 +81,7 @@ subroutine cice_init use ice_forcing, only: init_forcing_ocn, init_forcing_atmo, & get_forcing_atmo, get_forcing_ocn, get_wave_spec, init_snowtable use ice_forcing_bgc, only: get_forcing_bgc, get_atm_bgc, & - faero_default, faero_optics, alloc_forcing_bgc, fiso_default + faero_default, alloc_forcing_bgc, fiso_default use ice_grid, only: init_grid1, init_grid2, alloc_grid use ice_history, only: init_hist, accum_hist use ice_restart_shared, only: restart, runtype @@ -183,6 +183,7 @@ subroutine cice_init call init_history_therm ! initialize thermo history variables call init_history_dyn ! initialize dynamic history variables call calc_timesteps ! update timestep counter if not using npt_unit="1" + call icepack_init_radiation ! initialize icepack shortwave tables call icepack_query_tracer_flags(tr_aero_out=tr_aero, tr_zaero_out=tr_zaero) call icepack_query_tracer_flags(tr_iso_out=tr_iso, tr_snow_out=tr_snow) @@ -190,9 +191,6 @@ subroutine cice_init if (icepack_warnings_aborted()) call abort_ice(trim(subname), & file=__FILE__,line= __LINE__) - if (tr_aero .or. tr_zaero) call faero_optics !initialize aerosol optical - !property tables - ! Initialize shortwave components using swdn from previous timestep ! if restarting. These components will be scaled to current forcing ! in prep_radiation. @@ -278,6 +276,7 @@ subroutine init_restart restart_aero, read_restart_aero, & restart_hbrine, read_restart_hbrine, & restart_bgc + use ice_flux, only: Tf use ice_restart_driver, only: restartfile use ice_restart_shared, only: runtype, restart use ice_state ! almost everything @@ -492,7 +491,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,j,iblk)) else ! tcraig, reset all tracer values on land to zero trcrn(i,j,:,:,iblk) = c0 diff --git a/cicecore/shared/ice_arrays_column.F90 b/cicecore/shared/ice_arrays_column.F90 index 66f1819fa..9480d79bc 100644 --- a/cicecore/shared/ice_arrays_column.F90 +++ b/cicecore/shared/ice_arrays_column.F90 @@ -13,7 +13,7 @@ module ice_arrays_column use ice_blocks, only: nx_block, ny_block use ice_domain_size, only: max_blocks, ncat, nilyr, nslyr, & nblyr, nfsd, nfreq - use icepack_intfc, only: icepack_nspint + use icepack_intfc, only: icepack_nspint_3bd use icepack_intfc, only: icepack_query_tracer_sizes, icepack_query_parameters, & icepack_query_tracer_flags, & icepack_warnings_flush, icepack_warnings_aborted, icepack_query_tracer_sizes @@ -117,22 +117,6 @@ module ice_arrays_column real (kind=dbl_kind), dimension (:,:,:,:,:), allocatable, public :: & fswpenln ! visible SW entering ice layers (W m-2) - ! aerosol optical properties -> band | - ! v aerosol - ! for combined dust category, use category 4 properties - real (kind=dbl_kind), dimension(:,:), allocatable, public :: & - kaer_tab, & ! aerosol mass extinction cross section (m2/kg) - waer_tab, & ! aerosol single scatter albedo (fraction) - gaer_tab ! aerosol asymmetry parameter (cos(theta)) - - real (kind=dbl_kind), dimension(:,:), allocatable, public :: & - kaer_bc_tab, & ! BC mass extinction cross section (m2/kg) - waer_bc_tab, & ! BC single scatter albedo (fraction) - gaer_bc_tab ! BC aerosol asymmetry parameter (cos(theta)) - - real (kind=dbl_kind), dimension(:,:,:), allocatable, public :: & - bcenh ! BC absorption enhancement factor - ! biogeochemistry components real (kind=dbl_kind), dimension (:), allocatable, public :: & @@ -244,10 +228,6 @@ module ice_arrays_column character(char_len_long), public :: & bgc_data_dir ! directory for biogeochemistry data - character(char_len_long), public :: & - optics_file, & ! modal aero optics file - optics_file_fieldname ! modal aero optics file fieldname - real (kind=dbl_kind), dimension(:), allocatable, public :: & R_C2N_DON ! carbon to nitrogen mole ratio of DON pool @@ -386,17 +366,6 @@ subroutine alloc_arrays_column stat=ierr) if (ierr/=0) call abort_ice(subname//' Out of Memory3') - allocate( & - kaer_tab(icepack_nspint,max_aero), & ! aerosol mass extinction cross section (m2/kg) - waer_tab(icepack_nspint,max_aero), & ! aerosol single scatter albedo (fraction) - gaer_tab(icepack_nspint,max_aero), & ! aerosol asymmetry parameter (cos(theta)) - kaer_bc_tab(icepack_nspint,nmodal1), & ! BC mass extinction cross section (m2/kg) - waer_bc_tab(icepack_nspint,nmodal1), & ! BC single scatter albedo (fraction) - gaer_bc_tab(icepack_nspint,nmodal1), & ! BC aerosol asymmetry parameter (cos(theta)) - bcenh(icepack_nspint,nmodal1,nmodal2), & ! BC absorption enhancement factor - stat=ierr) - if (ierr/=0) call abort_ice(subname//' Out of Memory4') - ! floe size distribution allocate( & floe_rad_l (nfsd) , & ! fsd size lower bound in m (radius) diff --git a/cicecore/shared/ice_init_column.F90 b/cicecore/shared/ice_init_column.F90 index 5b25dc165..22cd3184a 100644 --- a/cicecore/shared/ice_init_column.F90 +++ b/cicecore/shared/ice_init_column.F90 @@ -184,7 +184,6 @@ subroutine init_shortwave albsnon, alvdrn, alidrn, alvdfn, alidfn, fswsfcn, & fswthrun, fswthrun_vdr, fswthrun_vdf, fswthrun_idr, fswthrun_idf, & fswintn, albpndn, apeffn, trcrn_sw, dhsn, ffracn, snowfracn, & - kaer_tab, waer_tab, gaer_tab, kaer_bc_tab, waer_bc_tab, gaer_bc_tab, bcenh, & swgrid, igrid use ice_blocks, only: block, get_block use ice_calendar, only: dt, calendar_type, & @@ -320,7 +319,7 @@ subroutine init_shortwave do j = jlo, jhi do i = ilo, ihi - if (trim(shortwave) == 'dEdd') then ! delta Eddington + if (shortwave(1:4) == 'dEdd') then ! delta Eddington #ifndef CESMCOUPLED ! initialize orbital parameters @@ -345,9 +344,7 @@ subroutine init_shortwave enddo if (tmask(i,j,iblk)) then - call icepack_step_radiation (dt=dt, ncat=ncat, & - nblyr=nblyr, nilyr=nilyr, nslyr=nslyr, & - dEdd_algae=dEdd_algae, & + call icepack_step_radiation (dt=dt, & swgrid=swgrid(:), igrid=igrid(:), & fbri=fbri(:), & aicen=aicen(i,j,:,iblk), & @@ -367,11 +364,6 @@ subroutine init_shortwave days_per_year=days_per_year, & nextsw_cday=nextsw_cday, yday=yday, & sec=msec, & - kaer_tab=kaer_tab, kaer_bc_tab=kaer_bc_tab(:,:), & - waer_tab=waer_tab, waer_bc_tab=waer_bc_tab(:,:), & - gaer_tab=gaer_tab, gaer_bc_tab=gaer_bc_tab(:,:), & - bcenh=bcenh(:,:,:), & - modal_aero=modal_aero, & swvdr=swvdr(i,j,iblk), swvdf=swvdf(i,j,iblk),& swidr=swidr(i,j,iblk), swidf=swidf(i,j,iblk),& coszen=coszen(i,j,iblk), fsnow=fsnow(i,j,iblk),& @@ -965,7 +957,7 @@ end subroutine init_hbrine subroutine input_zbgc - use ice_arrays_column, only: restore_bgc, optics_file, optics_file_fieldname + use ice_arrays_column, only: restore_bgc use ice_broadcast, only: broadcast_scalar use ice_restart_column, only: restart_bgc, restart_hbrine use ice_restart_shared, only: restart @@ -1007,7 +999,7 @@ subroutine input_zbgc restore_bgc, restart_bgc, scale_bgc, solve_zsal, restart_zsal, & tr_bgc_Nit, tr_bgc_C, tr_bgc_chl, tr_bgc_Am, tr_bgc_Sil, & tr_bgc_DMS, tr_bgc_PON, tr_bgc_hum, tr_bgc_DON, tr_bgc_Fe, & - grid_o, grid_o_t, l_sk, grid_oS, optics_file, optics_file_fieldname, & + grid_o, grid_o_t, l_sk, grid_oS, & l_skS, phi_snow, initbio_frac, frazil_scav, & ratio_Si2N_diatoms , ratio_Si2N_sp , ratio_Si2N_phaeo , & ratio_S2N_diatoms , ratio_S2N_sp , ratio_S2N_phaeo , & @@ -1064,8 +1056,6 @@ subroutine input_zbgc tr_brine = .false. ! brine height differs from ice height tr_zaero = .false. ! z aerosol tracers modal_aero = .false. ! use modal aerosol treatment of aerosols - optics_file = 'unknown_optics_file' ! modal aerosol optics file - optics_file_fieldname = 'unknown_optics_fieldname' ! modal aerosol optics file fieldname restore_bgc = .false. ! restore bgc if true solve_zsal = .false. ! update salinity tracer profile from solve_S_dt restart_bgc = .false. ! biogeochemistry restart @@ -1283,8 +1273,6 @@ subroutine input_zbgc call broadcast_scalar(tr_zaero, master_task) call broadcast_scalar(dEdd_algae, master_task) call broadcast_scalar(modal_aero, master_task) - call broadcast_scalar(optics_file, master_task) - call broadcast_scalar(optics_file_fieldname, master_task) call broadcast_scalar(grid_o, master_task) call broadcast_scalar(grid_o_t, master_task) call broadcast_scalar(l_sk, master_task) @@ -1464,9 +1452,9 @@ subroutine input_zbgc abort_flag = 107 endif - if (dEdd_algae .AND. trim(shortwave) /= 'dEdd') then + if (dEdd_algae .AND. shortwave(1:4) /= 'dEdd') then if (my_task == master_task) then - write(nu_diag,*) subname,' ERROR: dEdd_algae = T but shortwave /= dEdd' + write(nu_diag,*) subname,' ERROR: dEdd_algae = T but shortwave /= dEdd or dEdd_snicar_ad' endif abort_flag = 108 endif @@ -1485,9 +1473,9 @@ subroutine input_zbgc abort_flag = 110 endif - if (modal_aero .AND. trim(shortwave) /= 'dEdd') then + if (modal_aero .AND. shortwave(1:4) /= 'dEdd') then if (my_task == master_task) then - write(nu_diag,*) subname,' ERROR: modal_aero = T but shortwave /= dEdd' + write(nu_diag,*) subname,' ERROR: modal_aero = T but shortwave /= dEdd or dEdd_snicar_ad' endif abort_flag = 111 endif @@ -1643,8 +1631,6 @@ subroutine input_zbgc write(nu_diag,1010) ' solve_zbgc = ', solve_zbgc write(nu_diag,1010) ' tr_zaero = ', tr_zaero write(nu_diag,1020) ' number of aerosols = ', n_zaero - write(nu_diag,1031) ' optics_file = ', trim(optics_file) - write(nu_diag,1031) ' optics_file_fieldname = ', trim(optics_file_fieldname) ! bio parameters write(nu_diag,1000) ' grid_o = ', grid_o write(nu_diag,1000) ' grid_o_t = ', grid_o_t diff --git a/configuration/scripts/cice.build b/configuration/scripts/cice.build index 66b7b1321..775b5a364 100755 --- a/configuration/scripts/cice.build +++ b/configuration/scripts/cice.build @@ -124,6 +124,9 @@ else if (${ICE_IOTYPE} =~ pio*) then else set IODIR = io_binary endif +if (${ICE_SNICARHC} == 'true') then + setenv ICE_CPPDEFS "${ICE_CPPDEFS} -DUSE_SNICARHC" +endif ### List of source code directories (in order of importance). cat >! Filepath << EOF diff --git a/configuration/scripts/cice.settings b/configuration/scripts/cice.settings index 76ae6ad9e..ee4709940 100644 --- a/configuration/scripts/cice.settings +++ b/configuration/scripts/cice.settings @@ -44,6 +44,7 @@ setenv ICE_COMMDIR mpi if (${ICE_NTASKS} == 1) setenv ICE_COMMDIR serial ### Specialty code +setenv ICE_SNICARHC false # compile with big hardcoded snicar table setenv ICE_BLDDEBUG false # build debug flags setenv ICE_COVERAGE false # build coverage flags diff --git a/configuration/scripts/ice_in b/configuration/scripts/ice_in index 8fff799dc..93db4efbe 100644 --- a/configuration/scripts/ice_in +++ b/configuration/scripts/ice_in @@ -125,12 +125,14 @@ ktherm = 2 conduct = 'bubbly' ksno = 0.3d0 + hi_min = 0.01d0 a_rapid_mode = 0.5e-3 Rac_rapid_mode = 10.0 aspect_rapid_mode = 1.0 dSdt_slow_mode = -5.0e-8 phi_c_slow_mode = 0.05 phi_i_mushy = 0.85 + Tliquidus_max = -0.1d0 hfrazilmin = 0.05d0 floediam = 300.0d0 / @@ -187,6 +189,7 @@ &shortwave_nml shortwave = 'dEdd' + snw_ssp_table = 'test' albedo_type = 'ccsm3' albicev = 0.78 albicei = 0.36 @@ -309,8 +312,6 @@ restart_hbrine = .false. tr_zaero = .false. modal_aero = .false. - optics_file = 'ICE_MACHINE_INPUTDATA/CICE_data/forcing/snicar_optics_5bnd_snow_and_aerosols.nc' - optics_file_fieldname = 'modalBCabsorptionParameter5band' skl_bgc = .false. z_tracers = .false. dEdd_algae = .false. diff --git a/configuration/scripts/options/set_env.snicar b/configuration/scripts/options/set_env.snicar new file mode 100644 index 000000000..91c70cb4b --- /dev/null +++ b/configuration/scripts/options/set_env.snicar @@ -0,0 +1 @@ +setenv ICE_SNICARHC true diff --git a/configuration/scripts/options/set_nml.alt01 b/configuration/scripts/options/set_nml.alt01 index 6c2bf2159..a4d934421 100644 --- a/configuration/scripts/options/set_nml.alt01 +++ b/configuration/scripts/options/set_nml.alt01 @@ -22,4 +22,4 @@ albedo_type = 'constant' calc_Tsfc = .true. atm_data_type = 'default' highfreq = .true. -tfrz_option = 'minus1p8' +tfrz_option = 'constant' diff --git a/configuration/scripts/options/set_nml.alt04 b/configuration/scripts/options/set_nml.alt04 index a07f70e66..f58c05312 100644 --- a/configuration/scripts/options/set_nml.alt04 +++ b/configuration/scripts/options/set_nml.alt04 @@ -10,6 +10,7 @@ tr_pond_topo = .false. tr_pond_lvl = .true. tr_aero = .true. kitd = 0 +hi_min = 0.1d0 ktherm = 1 sw_redist = .true. sw_frac = 0.9d0 @@ -26,4 +27,4 @@ krdg_partic = 0 krdg_redist = 0 frzpnd = 'ccsm' natmiter = 20 -tfrz_option = 'linear_salt' +tfrz_option = 'linear_salt_old' diff --git a/configuration/scripts/options/set_nml.alt06 b/configuration/scripts/options/set_nml.alt06 index 911acf8eb..02a594fe5 100644 --- a/configuration/scripts/options/set_nml.alt06 +++ b/configuration/scripts/options/set_nml.alt06 @@ -2,4 +2,4 @@ ncat = 7 kcatbound = 3 nslyr = 3 ice_ic = 'internal' - +tfrz_option = 'mushy_old' diff --git a/configuration/scripts/options/set_nml.bgcskl b/configuration/scripts/options/set_nml.bgcskl index 0a136cb53..770f53724 100644 --- a/configuration/scripts/options/set_nml.bgcskl +++ b/configuration/scripts/options/set_nml.bgcskl @@ -24,3 +24,5 @@ tr_bgc_PON = .true. tr_bgc_hum = .true. tr_bgc_DON = .true. tr_bgc_Fe = .true. +tfrz_option = 'mushy_old' + diff --git a/configuration/scripts/options/set_nml.bgcsklclim b/configuration/scripts/options/set_nml.bgcsklclim index 8d0816f41..e100d57ce 100644 --- a/configuration/scripts/options/set_nml.bgcsklclim +++ b/configuration/scripts/options/set_nml.bgcsklclim @@ -27,3 +27,4 @@ tr_bgc_PON = .true. tr_bgc_hum = .true. tr_bgc_DON = .true. tr_bgc_Fe = .true. +tfrz_option = "mushy_old" diff --git a/configuration/scripts/options/set_nml.bgcz b/configuration/scripts/options/set_nml.bgcz index 379a2fd63..6d5257d1b 100644 --- a/configuration/scripts/options/set_nml.bgcz +++ b/configuration/scripts/options/set_nml.bgcz @@ -28,3 +28,4 @@ tr_bgc_DON = .true. tr_bgc_Fe = .true. # modal_aero = .true. # dEdd_algae = .true. +tfrz_option = 'mushy_old' diff --git a/configuration/scripts/options/set_nml.bgczclim b/configuration/scripts/options/set_nml.bgczclim index 9f1a08fc4..c5bb2f198 100644 --- a/configuration/scripts/options/set_nml.bgczclim +++ b/configuration/scripts/options/set_nml.bgczclim @@ -29,5 +29,6 @@ tr_bgc_PON = .true. tr_bgc_hum = .true. tr_bgc_DON = .true. tr_bgc_Fe = .true. +tfrz_option = "mushy_old" diff --git a/configuration/scripts/options/set_nml.bgczm b/configuration/scripts/options/set_nml.bgczm index 2644576cd..a80c17033 100644 --- a/configuration/scripts/options/set_nml.bgczm +++ b/configuration/scripts/options/set_nml.bgczm @@ -28,3 +28,4 @@ tr_bgc_DON = .true. tr_bgc_Fe = .true. modal_aero = .true. # dEdd_algae = .true. +tfrz_option = 'mushy_old' diff --git a/configuration/scripts/options/set_nml.boxadv b/configuration/scripts/options/set_nml.boxadv index ca05970e3..434ced169 100644 --- a/configuration/scripts/options/set_nml.boxadv +++ b/configuration/scripts/options/set_nml.boxadv @@ -24,4 +24,4 @@ krdg_partic = 0 krdg_redist = 0 shortwave = 'ccsm3' albedo_type = 'constant' - +tfrz_option = 'mushy_old' diff --git a/configuration/scripts/options/set_nml.boxchan1e b/configuration/scripts/options/set_nml.boxchan1e index 9e21cdab7..ebfa5c535 100644 --- a/configuration/scripts/options/set_nml.boxchan1e +++ b/configuration/scripts/options/set_nml.boxchan1e @@ -26,6 +26,7 @@ ice_data_dist = 'uniform' calc_strair = .false. rotate_wind = .false. restore_ice = .false. +tfrz_option = 'mushy_old' f_aice = 'd1' f_hi = 'd1' f_hs = 'd' diff --git a/configuration/scripts/options/set_nml.boxchan1n b/configuration/scripts/options/set_nml.boxchan1n index f24fee5fa..6e3613547 100644 --- a/configuration/scripts/options/set_nml.boxchan1n +++ b/configuration/scripts/options/set_nml.boxchan1n @@ -26,6 +26,7 @@ ice_data_dist = 'uniform' calc_strair = .false. rotate_wind = .false. restore_ice = .false. +tfrz_option = 'mushy_old' f_aice = 'd1' f_hi = 'd1' f_hs = 'd' diff --git a/configuration/scripts/options/set_nml.boxnodyn b/configuration/scripts/options/set_nml.boxnodyn index 71abfdaea..61210b5e9 100644 --- a/configuration/scripts/options/set_nml.boxnodyn +++ b/configuration/scripts/options/set_nml.boxnodyn @@ -43,6 +43,7 @@ tr_pond_lvl = .false. tr_aero = .false. kitd = 0 ktherm = 1 +hi_min = 0.1d0 kdyn = 1 revised_evp = .false. kstrength = 1 diff --git a/configuration/scripts/options/set_nml.e3sm b/configuration/scripts/options/set_nml.e3sm new file mode 100644 index 000000000..11f05cbe0 --- /dev/null +++ b/configuration/scripts/options/set_nml.e3sm @@ -0,0 +1,13 @@ +ice_ic = 'default' +nslyr = 5 +highfreq = .true. +natmiter = 10 +oceanmixed_ice = .false. +kcatbound = 0 +tr_FY = .true. +tr_snow = .true. +use_smliq_pnd = .true. +snwgrain = .true. +snwredist = 'ITDrdg' +rsnw_fall = 54.526 +rsnw_tmax = 2800.0 diff --git a/configuration/scripts/options/set_nml.e3smbgc b/configuration/scripts/options/set_nml.e3smbgc new file mode 100644 index 000000000..1be753486 --- /dev/null +++ b/configuration/scripts/options/set_nml.e3smbgc @@ -0,0 +1,74 @@ +nslyr = 5 +nblyr = 7 +n_aero = 1 +n_zaero = 3 +n_algae = 2 +n_doc = 3 +n_dic = 1 +n_don = 1 +n_fed = 1 +n_fep = 1 +ice_ic = 'default' +highfreq = .true. +natmiter = 10 +oceanmixed_ice = .false. +kcatbound = 0 +tr_FY = .true. +tr_snow = .true. +use_smliq_pnd = .true. +snwgrain = .true. +snwredist = 'ITDrdg' +rsnw_fall = 54.526 +rsnw_tmax = 2800.0 +tr_brine = .true. +tr_bgc_Nit = .true. +tr_bgc_Am = .true. +tr_bgc_Sil = .true. +tr_bgc_DON = .true. +tr_bgc_Fe = .true. +l_sk = 20.0 +initbio_frac = 1.0 +tau_min = 3600.0 +tau_max = 7776000.0 +algal_vel = 0.0000001 +alpha2max_low_diatoms = 0.3 +alpha2max_low_sp = 0.2 +alpha2max_low_phaeo = 0.17 +beta2max_diatoms = 0.001 +beta2max_sp = 0.001 +beta2max_phaeo = 0.04 +mu_max_sp = 0.41 +mu_max_phaeo = 0.63 +grow_Tdep_diatoms = 0.063 +grow_Tdep_sp = 0.063 +grow_Tdep_phaeo = 0.063 +fr_graze_diatoms = 0.19 +fr_graze_sp = 0.19 +fr_graze_phaeo = 0.19 +kn_bac_protein = 0.2 +f_don_Am_protein = 1.0 +f_doc_s = 0.5 +f_doc_l = 0.5 +fr_mort2min = 0.9 +fr_dFe = 0.9 +k_nitrif = 0.046 +fr_resp_s = 0.9 +y_sk_DMS = 0.7 +t_sk_conv = 5.0 +t_sk_ox = 12.0 +algaltype_sp = 0.0 +ammoniumtype = 0.0 +dmspdtype = 0.0 +humtype = 0.0 +doctype_s = 0.0 +doctype_l = 0.0 +dontype_protein = 0.0 +fedtype_1 = 0.0 +zaerotype_bc1 = 0.0 +zaerotype_bc2 = 0.0 +zaerotype_dust1 = 0.0 +zaerotype_dust2 = 0.0 +zaerotype_dust3 = 0.0 +zaerotype_dust4 = 0.0 +ratio_C2N_proteins = 5.0 + diff --git a/configuration/scripts/options/set_nml.snicar b/configuration/scripts/options/set_nml.snicar new file mode 100644 index 000000000..5fab713c4 --- /dev/null +++ b/configuration/scripts/options/set_nml.snicar @@ -0,0 +1,3 @@ + shortwave = 'dEdd_snicar_ad' + snw_ssp_table = 'snicar' + diff --git a/configuration/scripts/tests/e3sm_suite.ts b/configuration/scripts/tests/e3sm_suite.ts new file mode 100644 index 000000000..8e4cd05d7 --- /dev/null +++ b/configuration/scripts/tests/e3sm_suite.ts @@ -0,0 +1,6 @@ +# Test Grid PEs Sets BFB-compare +smoke gx3 8x2 diag1,run5day,e3sm +smoke gx3 1x1 diag1,run1day,e3smbgc +restart gbox128 8x1 diag1,e3sm +restart gx3 4x2 debug,diag1,e3smbgc +smoke gx3 4x1 diag1,run5day,thread,e3sm smoke_gx3_8x2_diag1_run5day diff --git a/doc/source/cice_index.rst b/doc/source/cice_index.rst index d4e187510..4a48d2a62 100644 --- a/doc/source/cice_index.rst +++ b/doc/source/cice_index.rst @@ -504,8 +504,6 @@ either Celsius or Kelvin units). Deprecated parameters are listed at the end. "ocn_data_type", "source of surface temperature, salinity data", "" "omega", "angular velocity of Earth", "7.292\ :math:`\times`\ 10\ :math:`^{-5}` rad/s" "opening", "rate of ice opening due to divergence and shear", "1/s" - "optics_file", "optics filename associated with modal aerosols", "" - "optics_file_fieldname", "optics file fieldname that is read", "" "**P**", "", "" "p001", "1/1000", "" "p01", "1/100", "" @@ -620,7 +618,7 @@ either Celsius or Kelvin units). Deprecated parameters are listed at the end. "shcoef", "transfer coefficient for sensible heat", "" "shear", "strain rate II component", "1/s" "shlat", "southern latitude of artificial mask edge", "30\ :math:`^\circ`\ N" - "shortwave", "flag for shortwave parameterization (‘ccsm3’ or ‘dEdd’)", "" + "shortwave", "flag for shortwave parameterization (‘ccsm3’ or ‘dEdd’ or 'dEdd_snicar_ad')", "" "sig1(2)", "principal stress components :math:`\sigma_{n,1}`, :math:`\sigma_{n,2}` (diagnostic)", "" "sigP", "internal ice pressure", "N/m" "sil", "silicate concentration", "mmol/m\ :math:`^3`" @@ -690,6 +688,7 @@ either Celsius or Kelvin units). Deprecated parameters are listed at the end. "Timelt", "melting temperature of ice top surface", "0. C" "Tinz", "Internal ice temperature", "C" "TLAT", "latitude of cell center", "radians" + "Tliquidus_max", "maximum liquidus temperature of mush", "0. C" "TLON", "longitude of cell center", "radians" "tmask", "land/boundary mask, thickness (T-cell)", "" "tmass", "total mass of ice and snow", "kg/m\ :math:`^2`" diff --git a/doc/source/user_guide/ug_case_settings.rst b/doc/source/user_guide/ug_case_settings.rst index 2df45acb0..16f6ebe6f 100644 --- a/doc/source/user_guide/ug_case_settings.rst +++ b/doc/source/user_guide/ug_case_settings.rst @@ -37,6 +37,7 @@ can be found in :ref:`cicecpps`. The following CPPs are available. "NO_I8", "Converts integer*8 to integer*4. This could have adverse affects for certain algorithms including the ddpdd implementation associated with the ``bfbflag``" "NO_R16", "Converts real*16 to real*8. This could have adverse affects for certain algorithms including the lsum16 implementation associated with the ``bfbflag``" "USE_NETCDF", "Turns on netcdf code. This is normally on and is needed for released configurations. An older value, ncdf, is still supported" + "USE_SNICARHC", "Includes compilation of large dEdd hardcoded (HC) SNICAR table in Icepack" "","" "**Application Macros**", "" "CESMCOUPLED", "Turns on code changes for the CESM coupled application " @@ -121,6 +122,7 @@ can be modified as needed. "ICE_QUEUE", "string", "batch queue name", "set by cice.setup or by default" "ICE_THREADED", "true, false", "force threading in compile, will always compile threaded if ICE_NTHRDS :math:`> 1`", "false" "ICE_COMMDIR", "mpi, serial", "specify infrastructure comm version", "set by ICE_NTASKS" + "ICE_SNICARHC", "true, false", "turn on hardcoded (HC) SNICAR tables in Icepack", "false" "ICE_BLDDEBUG", "true, false", "turn on compile debug flags", "false" "ICE_COVERAGE", "true, false", "turn on code coverage flags", "false" @@ -400,6 +402,7 @@ thermo_nml "``dSdt_slow_mode``", "real", "slow drainage strength parameter m/s/K", "-1.5e-7" "``floediam``", "real", "effective floe diameter for lateral melt in m", "300.0" "``hfrazilmin``", "real", "min thickness of new frazil ice in m", "0.05" + "``hi_min``", "real", "minimum ice thickness in m", "0.01" "``kitd``", "``0``", "delta function ITD approximation", "1" "", "``1``", "linear remapping ITD approximation", "" "``ksno``", "real", "snow thermal conductivity", "0.3" @@ -409,6 +412,7 @@ thermo_nml "``phi_c_slow_mode``", ":math:`0<\phi_c < 1`", "critical liquid fraction", "0.05" "``phi_i_mushy``", ":math:`0<\phi_i < 1`", "solid fraction at lower boundary", "0.85" "``Rac_rapid_mode``", "real", "critical Rayleigh number", "10.0" + "``Tliquidus_max``", "real", "maximum liquidus temperature of mush (C)", "0.0" "", "", "", "" @@ -525,7 +529,10 @@ shortwave_nml "``R_pnd``", "real", "tuning parameter for ponded sea ice albedo from Delta-Eddington shortwave", "0.0" "``R_snw``", "real", "tuning parameter for snow (broadband albedo) from Delta-Eddington shortwave", "1.5" "``shortwave``", "``ccsm3``", "NCAR CCSM3 shortwave distribution method", "``ccsm3``" - "", "``dEdd``", "Delta-Eddington method", "" + "", "``dEdd``", "Delta-Eddington method (3-band)", "" + "", "``dEdd_snicar_ad``", "Delta-Eddington method with 5 band snow", "" + "``snw_ssp_table``", "``snicar``", "lookup table for `dEdd_snicar_ad`", "``test``" + "", "``test``", "reduced lookup table for `dEdd_snicar_ad` testing", "" "``sw_dtemp``", "real", "temperature difference from melt to start redistributing", "0.02" "``sw_frac``", "real", "fraction redistributed", "0.9" "``sw_redist``", "logical", "redistribute internal shortwave to surface", "``.false.``" @@ -676,7 +683,8 @@ forcing_nml "``rotate_wind``", "logical", "rotate wind from east/north to computation grid", "``.true.``" "``saltflux_option``", "``constant``", "computed using ice_ref_salinity", "``constant``" "", "``prognostic``", "computed using prognostic salinity", "" - "``tfrz_option``", "``linear_salt``", "linear function 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" @@ -786,8 +794,6 @@ zbgc_nml "``mu_max_phaeo``", "real", "maximum growth rate phaeocystis per day", "0.851" "``mu_max_sp``", "real", "maximum growth rate small plankton per day", "0.851" "``nitratetype``", "real", "mobility type between stationary and mobile nitrate", "-1.0" - "``optics_file``", "string", "optics file associated with modal aerosols", "unknown_optics_file" - "``optics_file_fieldname``", "string", "optics file fieldname to read", "unknown_optics_fieldname" "``op_dep_min``", "real", "light attenuates for optical depths exceeding min", "0.1" "``phi_snow``", "real", "snow porosity for brine height tracer", "0.5" "``ratio_chl2N_diatoms``", "real", "algal chl to N in mg/mmol diatoms", "2.1" diff --git a/icepack b/icepack index b2bd1a4e6..8fad768ce 160000 --- a/icepack +++ b/icepack @@ -1 +1 @@ -Subproject commit b2bd1a4e665e7f98f71c46c03903d60db14a59cb +Subproject commit 8fad768ce400536904f376376e91c698a82882ba