diff --git a/cicecore/cicedynB/dynamics/ice_dyn_eap.F90 b/cicecore/cicedynB/dynamics/ice_dyn_eap.F90 index b2202369d..fc2c88e8e 100644 --- a/cicecore/cicedynB/dynamics/ice_dyn_eap.F90 +++ b/cicecore/cicedynB/dynamics/ice_dyn_eap.F90 @@ -27,9 +27,6 @@ module ice_dyn_eap use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted use icepack_intfc, only: icepack_query_parameters use icepack_intfc, only: icepack_ice_strength -#ifdef CICE_IN_NEMO - use icepack_intfc, only: calc_strair -#endif implicit none private @@ -133,9 +130,6 @@ subroutine eap (dt) stressp_1, stressp_2, stressp_3, stressp_4, & stressm_1, stressm_2, stressm_3, stressm_4, & stress12_1, stress12_2, stress12_3, stress12_4 -#ifdef CICE_IN_NEMO - use ice_flux, only: strax, stray -#endif use ice_grid, only: tmask, umask, dxt, dyt, dxhy, dyhx, cxp, cyp, cxm, cym, & tarear, uarear, to_ugrid, t2ugrid_vector, u2tgrid_vector use ice_state, only: aice, vice, vsno, uvel, vvel, divu, shear, & @@ -182,6 +176,8 @@ subroutine eap (dt) real (kind=dbl_kind), dimension(nx_block,ny_block,8):: & strtmp ! stress combinations for momentum equation + logical (kind=log_kind) :: calc_strair + integer (kind=int_kind), dimension (nx_block,ny_block,max_blocks) :: & icetmask, & ! ice extent mask (T-cell) halomask ! ice mask for halo update @@ -258,21 +254,22 @@ subroutine eap (dt) call to_ugrid(tmass,umass) call to_ugrid(aice_init, aiu) -#ifdef CICE_IN_NEMO !---------------------------------------------------------------- - ! Set wind stress to values supplied via NEMO + ! Set wind stress to values supplied via NEMO or other forcing ! This wind stress is rotated on u grid and multiplied by aice !---------------------------------------------------------------- + call icepack_query_parameters(calc_strair_out=calc_strair) + call icepack_warnings_flush(nu_diag) + if (icepack_warnings_aborted()) call abort_ice(error_message=subname, & + file=__FILE__, line=__LINE__) + if (.not. calc_strair) then strairx(:,:,:) = strax(:,:,:) strairy(:,:,:) = stray(:,:,:) else -#endif call t2ugrid_vector(strairx) call t2ugrid_vector(strairy) -#ifdef CICE_IN_NEMO endif -#endif ! tcraig, tcx, turned off this threaded region, in evp, this block and ! the icepack_ice_strength call seems to not be thread safe. more diff --git a/cicecore/cicedynB/dynamics/ice_dyn_evp.F90 b/cicecore/cicedynB/dynamics/ice_dyn_evp.F90 index b8994b768..78342b1e0 100644 --- a/cicecore/cicedynB/dynamics/ice_dyn_evp.F90 +++ b/cicecore/cicedynB/dynamics/ice_dyn_evp.F90 @@ -45,9 +45,6 @@ module ice_dyn_evp use ice_exit, only: abort_ice use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted use icepack_intfc, only: icepack_ice_strength, icepack_query_parameters -#ifdef CICE_IN_NEMO - use icepack_intfc, only: calc_strair -#endif implicit none private @@ -87,9 +84,6 @@ subroutine evp (dt) stressp_1, stressp_2, stressp_3, stressp_4, & stressm_1, stressm_2, stressm_3, stressm_4, & stress12_1, stress12_2, stress12_3, stress12_4 -#ifdef CICE_IN_NEMO - use ice_flux, only: strax, stray -#endif use ice_grid, only: tmask, umask, dxt, dyt, dxhy, dyhx, cxp, cyp, cxm, cym, & tarear, uarear, tinyarea, to_ugrid, t2ugrid_vector, u2tgrid_vector, & grid_type @@ -134,6 +128,8 @@ subroutine evp (dt) real (kind=dbl_kind), dimension(nx_block,ny_block,8):: & strtmp ! stress combinations for momentum equation + logical (kind=log_kind) :: calc_strair + integer (kind=int_kind), dimension (nx_block,ny_block,max_blocks) :: & icetmask, & ! ice extent mask (T-cell) halomask ! generic halo mask @@ -217,21 +213,22 @@ subroutine evp (dt) call to_ugrid(tmass,umass) call to_ugrid(aice_init, aiu) -#ifdef CICE_IN_NEMO !---------------------------------------------------------------- - ! Set wind stress to values supplied via NEMO + ! Set wind stress to values supplied via NEMO or other forcing ! This wind stress is rotated on u grid and multiplied by aice !---------------------------------------------------------------- + call icepack_query_parameters(calc_strair_out=calc_strair) + call icepack_warnings_flush(nu_diag) + if (icepack_warnings_aborted()) call abort_ice(error_message=subname, & + file=__FILE__, line=__LINE__) + if (.not. calc_strair) then strairx(:,:,:) = strax(:,:,:) strairy(:,:,:) = stray(:,:,:) else -#endif - call t2ugrid_vector(strairx) - call t2ugrid_vector(strairy) -#ifdef CICE_IN_NEMO + call t2ugrid_vector(strairx) + call t2ugrid_vector(strairy) endif -#endif ! tcraig, tcx, threading here leads to some non-reproducbile results and failures in icepack_ice_strength ! need to do more debugging diff --git a/cicecore/cicedynB/dynamics/ice_dyn_shared.F90 b/cicecore/cicedynB/dynamics/ice_dyn_shared.F90 index 01adcee79..aa0285869 100644 --- a/cicecore/cicedynB/dynamics/ice_dyn_shared.F90 +++ b/cicecore/cicedynB/dynamics/ice_dyn_shared.F90 @@ -28,9 +28,14 @@ module ice_dyn_shared ! namelist parameters integer (kind=int_kind), public :: & - kdyn , & ! type of dynamics ( 1 = evp, 2 = eap ) + kdyn , & ! type of dynamics ( -1, 0 = off, 1 = evp, 2 = eap ) + kridge , & ! set to "-1" to turn off ridging + ktransport , & ! set to "-1" to turn off transport ndte ! number of subcycles: ndte=dt/dte + character (len=char_len), public :: & + coriolis ! 'constant', 'zero', or 'latitude' + logical (kind=log_kind), public :: & revised_evp ! if true, use revised evp procedure @@ -148,8 +153,13 @@ subroutine init_evp (dt) rdg_shear(i,j,iblk) = c0 ! Coriolis parameter -!! fcor_blk(i,j,iblk) = 1.46e-4_dbl_kind ! Hibler 1979, N. Hem; 1/s - fcor_blk(i,j,iblk) = c2*omega*sin(ULAT(i,j,iblk)) ! 1/s + if (trim(coriolis) == 'constant') then + fcor_blk(i,j,iblk) = 1.46e-4_dbl_kind ! Hibler 1979, N. Hem; 1/s + else if (trim(coriolis) == 'zero') then + fcor_blk(i,j,iblk) = 0.0 + else + fcor_blk(i,j,iblk) = c2*omega*sin(ULAT(i,j,iblk)) ! 1/s + endif ! stress tensor, kg/s^2 stressp_1 (i,j,iblk) = c0 diff --git a/cicecore/cicedynB/general/ice_forcing.F90 b/cicecore/cicedynB/general/ice_forcing.F90 index 4627c1d18..6eaf4151b 100644 --- a/cicecore/cicedynB/general/ice_forcing.F90 +++ b/cicecore/cicedynB/general/ice_forcing.F90 @@ -29,7 +29,7 @@ module ice_forcing use ice_timers, only: ice_timer_start, ice_timer_stop, timer_readwrite, & timer_bound use ice_arrays_column, only: oceanmixed_ice, restore_bgc - use ice_constants, only: c0, c1, c2, c4, c10, c12, c20, & + use ice_constants, only: c0, c1, c2, c3, c4, c5, c10, c12, c20, & c180, c365, c1000, c3600 use ice_constants, only: p001, p01, p1, p25, p5, p6 use ice_constants, only: cm_to_m @@ -240,6 +240,8 @@ subroutine init_forcing_atmo call oned_files elseif (trim(atm_data_type) == 'ISPOL') then call ISPOL_files + elseif (trim(atm_data_type) == 'box') then + call box_data endif end subroutine init_forcing_atmo @@ -530,6 +532,8 @@ subroutine get_forcing_atmo call monthly_data elseif (trim(atm_data_type) == 'oned') then call oned_data + elseif (trim(atm_data_type) == 'box') then + call box_data else ! default values set in init_flux return endif @@ -4405,8 +4409,96 @@ subroutine ocn_data_ispol_init end subroutine ocn_data_ispol_init +!======================================================================= +! + subroutine box_data + +! wind and current fields as in Hunke, JCP 2001 +! authors: Elizabeth Hunke, LANL + + use ice_domain, only: nblocks + use ice_constants, only: c0, c1, c2, c3, c4, c5, p2 + use ice_blocks, only: nx_block, ny_block, nghost + use ice_flux, only: uocn, vocn, uatm, vatm, wind, rhoa, strax, stray + use ice_fileunits, only: nu_diag, nu_forcing + use ice_grid, only: uvm + + ! local parameters + + integer (kind=int_kind) :: & + iblk, i,j ! loop indices + + real (kind=dbl_kind) :: & + secday, pi , c10, c12, c20, puny, period, pi2, tau + call icepack_query_parameters(pi_out=pi, pi2_out=pi2, puny_out=puny) + call icepack_query_parameters(secday_out=secday) + + period = c4*secday + + do iblk = 1, nblocks + do j = 1, ny_block + do i = 1, nx_block + + ! ocean current + ! constant in time, could be initialized in ice_flux.F90 + uocn(i,j,iblk) = p2*real(j-nghost, kind=dbl_kind) & + / real(nx_global,kind=dbl_kind) - p1 + vocn(i,j,iblk) = -p2*real(i-nghost, kind=dbl_kind) & + / real(ny_global,kind=dbl_kind) + p1 + + uocn(i,j,iblk) = uocn(i,j,iblk) * uvm(i,j,iblk) + vocn(i,j,iblk) = vocn(i,j,iblk) * uvm(i,j,iblk) + + ! wind components + uatm(i,j,iblk) = c5 + (sin(pi2*time/period)-c3) & + * sin(pi2*real(i-nghost, kind=dbl_kind) & + /real(nx_global,kind=dbl_kind)) & + * sin(pi *real(j-nghost, kind=dbl_kind) & + /real(ny_global,kind=dbl_kind)) + vatm(i,j,iblk) = c5 + (sin(pi2*time/period)-c3) & + * sin(pi *real(i-nghost, kind=dbl_kind) & + /real(nx_global,kind=dbl_kind)) & + * sin(pi2*real(j-nghost, kind=dbl_kind) & + /real(ny_global,kind=dbl_kind)) + ! wind stress + wind(i,j,iblk) = sqrt(uatm(i,j,iblk)**2 + vatm(i,j,iblk)**2) + tau = rhoa(i,j,iblk) * 0.0012_dbl_kind * wind(i,j,iblk) + strax(i,j,iblk) = tau * uatm(i,j,iblk) + stray(i,j,iblk) = tau * vatm(i,j,iblk) + +! initialization test + ! Diagonal wind vectors 1 + !uatm(i,j,iblk) = c1 *real(j-nghost, kind=dbl_kind) & + ! / real(ny_global,kind=dbl_kind) + !vatm(i,j,iblk) = c1 *real(j-nghost, kind=dbl_kind) & + ! / real(ny_global,kind=dbl_kind) + + ! Diagonal wind vectors 2 + !uatm(i,j,iblk) = c1 *real(i-nghost, kind=dbl_kind) & + ! / real(nx_global,kind=dbl_kind) + !vatm(i,j,iblk) = -c1 *real(i-nghost, kind=dbl_kind) & + ! / real(nx_global,kind=dbl_kind) + + ! Wind in x direction + ! uatm(i,j,iblk) = c1 *real(i-nghost, kind=dbl_kind) & + ! / real(nx_global,kind=dbl_kind) + ! vatm(i,j,iblk) = c0 + + ! Wind in y direction + ! uatm(i,j,iblk) = c0 + ! vatm(i,j,iblk) = c1 *real(j-nghost, kind=dbl_kind) & + ! / real(ny_global,kind=dbl_kind) +! initialization test + + enddo + enddo + enddo ! nblocks + + end subroutine box_data + !======================================================================= end module ice_forcing !======================================================================= + diff --git a/cicecore/cicedynB/general/ice_init.F90 b/cicecore/cicedynB/general/ice_init.F90 index d19b95641..f0b1a72cc 100644 --- a/cicecore/cicedynB/general/ice_init.F90 +++ b/cicecore/cicedynB/general/ice_init.F90 @@ -55,6 +55,7 @@ subroutine input_data use ice_broadcast, only: broadcast_scalar, broadcast_array use ice_diagnostics, only: diag_file, print_global, print_points, latpnt, lonpnt + use ice_domain, only: close_boundaries use ice_domain_size, only: ncat, nilyr, nslyr, nblyr, & n_aero, n_zaero, n_algae, & n_doc, n_dic, n_don, n_fed, n_fep, & @@ -85,9 +86,11 @@ subroutine input_data oceanmixed_file, restore_ocn, trestore use ice_arrays_column, only: bgc_data_dir, & sil_data_type, nit_data_type, fe_data_type - use ice_grid, only: grid_file, gridcpl_file, kmt_file, grid_type, grid_format + use ice_grid, only: grid_file, gridcpl_file, kmt_file, grid_type, grid_format, & + dxrect, dyrect use ice_dyn_shared, only: ndte, kdyn, revised_evp, yield_curve, & - basalstress, Ktens, e_ratio + basalstress, Ktens, e_ratio, coriolis, & + kridge, ktransport use ice_transport_driver, only: advection use ice_restoring, only: restore_ice #ifdef CESMCOUPLED @@ -151,7 +154,8 @@ subroutine input_data namelist /grid_nml/ & grid_format, grid_type, grid_file, kmt_file, & ncat, nilyr, nslyr, nblyr, & - kcatbound, gridcpl_file + kcatbound, gridcpl_file, dxrect, dyrect, & + close_boundaries namelist /thermo_nml/ & kitd, ktherm, conduct, & @@ -160,7 +164,7 @@ subroutine input_data namelist /dynamics_nml/ & kdyn, ndte, revised_evp, yield_curve, & - advection, & + advection, coriolis, kridge, ktransport, & kstrength, krdg_partic, krdg_redist, mu_rdg, & e_ratio, Ktens, Cf, basalstress @@ -268,7 +272,7 @@ subroutine input_data kitd = 1 ! type of itd conversions (0 = delta, 1 = linear) kcatbound = 1 ! category boundary formula (0 = old, 1 = new, etc) - kdyn = 1 ! type of dynamics (1 = evp, 2 = eap) + kdyn = 1 ! type of dynamics (-1, 0 = off, 1 = evp, 2 = eap) ndtd = 1 ! dynamic time steps per thermodynamic time step ndte = 120 ! subcycles per dynamics timestep: ndte=dt_dyn/dte revised_evp = .false. ! if true, use revised procedure for evp dynamics @@ -278,14 +282,18 @@ subroutine input_data krdg_redist = 1 ! 1 = new redistribution, 0 = Hibler 80 mu_rdg = 3 ! e-folding scale of ridged ice, krdg_partic=1 (m^0.5) Cf = 17.0_dbl_kind ! ratio of ridging work to PE change in ridging + close_boundaries = .false. ! true = set land on edges of grid basalstress= .false. ! if true, basal stress for landfast is on Ktens = 0.0_dbl_kind ! T=Ktens*P (tensile strength: see Konig and Holland, 2010) e_ratio = 2.0_dbl_kind ! EVP ellipse aspect ratio advection = 'remap' ! incremental remapping transport scheme shortwave = 'ccsm3' ! 'ccsm3' or 'dEdd' (delta-Eddington) albedo_type = 'ccsm3' ! 'ccsm3' or 'constant' - ktherm = 1 ! 0 = 0-layer, 1 = BL99, 2 = mushy thermo + ktherm = 1 ! -1 = OFF, 0 = 0-layer, 1 = BL99, 2 = mushy thermo conduct = 'bubbly' ! 'MU71' or 'bubbly' (Pringle et al 2007) + coriolis = 'latitude' ! latitude dependent, or 'constant' + kridge = 1 ! -1 = off, 1 = on + ktransport = 1 ! -1 = off, 1 = on 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) @@ -522,6 +530,9 @@ subroutine input_data call broadcast_scalar(pointer_file, master_task) call broadcast_scalar(ice_ic, master_task) call broadcast_scalar(grid_format, master_task) + call broadcast_scalar(dxrect, master_task) + call broadcast_scalar(dyrect, master_task) + call broadcast_scalar(close_boundaries, master_task) call broadcast_scalar(grid_type, master_task) call broadcast_scalar(grid_file, master_task) call broadcast_scalar(gridcpl_file, master_task) @@ -545,6 +556,9 @@ subroutine input_data call broadcast_scalar(shortwave, master_task) call broadcast_scalar(albedo_type, master_task) call broadcast_scalar(ktherm, master_task) + call broadcast_scalar(coriolis, master_task) + call broadcast_scalar(kridge, master_task) + call broadcast_scalar(ktransport, master_task) call broadcast_scalar(conduct, master_task) call broadcast_scalar(R_ice, master_task) call broadcast_scalar(R_pnd, master_task) @@ -956,6 +970,8 @@ subroutine input_data write(nu_diag,1020) ' kitd = ', kitd write(nu_diag,1020) ' kcatbound = ', & kcatbound + write(nu_diag,1010) ' close_boundaries = ', & + close_boundaries if (kdyn == 1) then write(nu_diag,1021) ' kdyn = ','evp ', kdyn elseif (kdyn == 2) then @@ -971,6 +987,9 @@ subroutine input_data write(nu_diag,*) ' yield_curve = ', & trim(yield_curve) write(nu_diag,1020) ' kstrength = ', kstrength + write(nu_diag,1030) ' coriolis = ', coriolis + write(nu_diag,1020) ' kridge = ', kridge + write(nu_diag,1020) ' ktransport = ', ktransport write(nu_diag,1020) ' krdg_partic = ', & krdg_partic write(nu_diag,1020) ' krdg_redist = ', & @@ -1852,8 +1871,8 @@ subroutine set_state_var (nx_block, ny_block, & if (trim(atm_data_type) == 'box') then if (hinit(n) > c0) then ! ! constant slope from 0 to 1 in x direction -! aicen(i,j,n) = (real(iglob(i), kind=dbl_kind)-p5) & -! / (real(nx_global,kind=dbl_kind)) + aicen(i,j,n) = (real(iglob(i), kind=dbl_kind)-p5) & + / (real(nx_global,kind=dbl_kind)) ! ! constant slope from 0 to 0.5 in x direction ! aicen(i,j,n) = (real(iglob(i), kind=dbl_kind)-p5) & ! / (real(nx_global,kind=dbl_kind)) * p5 @@ -1862,12 +1881,12 @@ subroutine set_state_var (nx_block, ny_block, & ! / (real(nx_global,kind=dbl_kind)) & ! * (real(jglob(j), kind=dbl_kind)-p5) & ! / (real(ny_global,kind=dbl_kind)) * p5) - aicen(i,j,n) = max(c0,(real(nx_global, kind=dbl_kind) & - - real(iglob(i), kind=dbl_kind)-p5) & - / (real(nx_global,kind=dbl_kind)) & - * (real(ny_global, kind=dbl_kind) & - - real(jglob(j), kind=dbl_kind)-p5) & - / (real(ny_global,kind=dbl_kind)) * p5) +! aicen(i,j,n) = max(c0,(real(nx_global, kind=dbl_kind) & +! - real(iglob(i), kind=dbl_kind)-p5) & +! / (real(nx_global,kind=dbl_kind)) & +! * (real(ny_global, kind=dbl_kind) & +! - real(jglob(j), kind=dbl_kind)-p5) & +! / (real(ny_global,kind=dbl_kind)) * p5) endif vicen(i,j,n) = hinit(n) * aicen(i,j,n) ! m else diff --git a/cicecore/cicedynB/general/ice_step_mod.F90 b/cicecore/cicedynB/general/ice_step_mod.F90 index cd45c7aca..3c04e0f4f 100644 --- a/cicecore/cicedynB/general/ice_step_mod.F90 +++ b/cicecore/cicedynB/general/ice_step_mod.F90 @@ -36,12 +36,33 @@ module ice_step_mod public :: step_therm1, step_therm2, step_dyn_horiz, step_dyn_ridge, & prep_radiation, step_radiation, ocean_mixed_layer, & - update_state, biogeochemistry + update_state, biogeochemistry, save_init !======================================================================= contains +!======================================================================= + + subroutine save_init +! saves initial values for aice, aicen, vicen, vsnon + + use ice_state, only: aice, aicen, aice_init, aicen_init, & + vicen, vicen_init, vsnon, vsnon_init + + !----------------------------------------------------------------- + ! Save the ice area passed to the coupler (so that history fields + ! can be made consistent with coupler fields). + ! Save the initial ice area and volume in each category. + !----------------------------------------------------------------- + + aice_init = aice + aicen_init = aicen + vicen_init = vicen + vsnon_init = vsnon + + end subroutine save_init + !======================================================================= ! ! Scales radiation fields computed on the previous time step. @@ -217,24 +238,10 @@ subroutine step_therm1 (dt, iblk) aerosno(:,:,:) = c0 aeroice(:,:,:) = c0 +#ifdef CICE_IN_NEMO do j = 1, ny_block do i = 1, nx_block - !----------------------------------------------------------------- - ! Save the ice area passed to the coupler (so that history fields - ! can be made consistent with coupler fields). - ! Save the initial ice area and volume in each category. - !----------------------------------------------------------------- - - aice_init (i,j, iblk) = aice (i,j, iblk) - - do n = 1, ncat - aicen_init(i,j,n,iblk) = aicen(i,j,n,iblk) - vicen_init(i,j,n,iblk) = vicen(i,j,n,iblk) - vsnon_init(i,j,n,iblk) = vsnon(i,j,n,iblk) - enddo - -#ifdef CICE_IN_NEMO !--------------------------------------------------------------- ! Scale frain and fsnow by ice concentration as these fields ! are supplied by NEMO multiplied by ice concentration @@ -248,10 +255,10 @@ subroutine step_therm1 (dt, iblk) frain(i,j,iblk) = c0 fsnow(i,j,iblk) = c0 endif -#endif enddo ! i enddo ! j +#endif this_block = get_block(blocks_ice(iblk),iblk) ilo = this_block%ilo @@ -588,7 +595,7 @@ subroutine step_dyn_horiz (dt) use ice_dyn_evp, only: evp use ice_dyn_eap, only: eap - use ice_dyn_shared, only: kdyn + use ice_dyn_shared, only: kdyn, ktransport use ice_flux, only: init_history_dyn use ice_transport_driver, only: advection, transport_upwind, transport_remap @@ -610,11 +617,13 @@ subroutine step_dyn_horiz (dt) ! Horizontal ice transport !----------------------------------------------------------------- + if (ktransport > 0) then if (advection == 'upwind') then call transport_upwind (dt) ! upwind else call transport_remap (dt) ! incremental remapping endif + endif end subroutine step_dyn_horiz diff --git a/cicecore/cicedynB/infrastructure/ice_domain.F90 b/cicecore/cicedynB/infrastructure/ice_domain.F90 index 58acd9735..622e425b3 100644 --- a/cicecore/cicedynB/infrastructure/ice_domain.F90 +++ b/cicecore/cicedynB/infrastructure/ice_domain.F90 @@ -37,7 +37,10 @@ module ice_domain init_domain_distribution integer (int_kind), public :: & - nblocks ! actual number of blocks on this processor + nblocks ! actual number of blocks on this processor + + logical (kind=log_kind), public :: & + close_boundaries integer (int_kind), dimension(:), pointer, public :: & blocks_ice => null() ! block ids for local blocks diff --git a/cicecore/cicedynB/infrastructure/ice_grid.F90 b/cicecore/cicedynB/infrastructure/ice_grid.F90 index 2ff313473..6baddd63f 100644 --- a/cicecore/cicedynB/infrastructure/ice_grid.F90 +++ b/cicecore/cicedynB/infrastructure/ice_grid.F90 @@ -41,6 +41,7 @@ module ice_grid gridcpl_file , & ! input file for POP coupling grid info grid_file , & ! input file for POP grid info kmt_file , & ! input file for POP grid info + grid_spacing , & ! default of 30.e3m or set by user in namelist grid_type ! current options are rectangular (default), ! displaced_pole, tripole, regional @@ -75,6 +76,9 @@ module ice_grid cxm , & ! 0.5*HTN - 1.5*HTN dxhy , & ! 0.5*(HTE - HTE) dyhx ! 0.5*(HTN - HTN) + real (kind=dbl_kind), public :: & + dxrect, & ! user_specified spacing (m) in x-direction + dyrect ! user_specified spacing (m) in y-direction ! Corners of grid boxes for history output real (kind=dbl_kind), dimension (:,:,:,:), allocatable, public :: & @@ -118,9 +122,11 @@ module ice_grid lmask_s ! southern hemisphere mask ! grid dimensions for rectangular grid - real (kind=dbl_kind), parameter :: & - dxrect = 30.e5_dbl_kind ,&! uniform HTN (cm) - dyrect = 30.e5_dbl_kind ! uniform HTE (cm) +! real (kind=dbl_kind), public :: & +! dxrect = 30.e5_dbl_kind ,&! uniform HTN (cm) +! dyrect = 30.e5_dbl_kind ! uniform HTE (cm) +! dxrect = 16.e5_dbl_kind ,&! uniform HTN (cm) +! dyrect = 16.e5_dbl_kind ! uniform HTE (cm) real (kind=dbl_kind), dimension (:,:,:), allocatable, public :: & rndex_global ! global index for local subdomain (dbl) @@ -1114,6 +1120,7 @@ subroutine rectgrid use ice_blocks, only: nx_block, ny_block use ice_constants, only: c0, c1, c2, radius, cm_to_m, & field_loc_center, field_loc_NEcorner, field_type_scalar + use ice_domain, only: close_boundaries integer (kind=int_kind) :: & i, j, iblk, & @@ -1256,6 +1263,13 @@ subroutine rectgrid endif + if (close_boundaries) then + work_g1(:, 1:2) = c0 + work_g1(:, ny_global-1:ny_global) = c0 + work_g1(1:2, :) = c0 + work_g1(nx_global-1:nx_global, :) = c0 + endif + elseif (trim(ew_boundary_type) == 'closed') then call abort_ice(subname//'ERROR: closed boundaries not available') diff --git a/cicecore/drivers/cice/CICE_RunMod.F90 b/cicecore/drivers/cice/CICE_RunMod.F90 index fe1aa14c4..ca7a5bd82 100644 --- a/cicecore/drivers/cice/CICE_RunMod.F90 +++ b/cicecore/drivers/cice/CICE_RunMod.F90 @@ -44,8 +44,8 @@ module CICE_RunMod subroutine CICE_Run use ice_calendar, only: istep, istep1, time, dt, stop_now, calendar - use ice_forcing, only: get_forcing_atmo, get_forcing_ocn - use ice_forcing_bgc, only: get_forcing_bgc, get_atm_bgc, & + use ice_forcing, only: get_forcing_atmo, get_forcing_ocn, atm_data_type + use ice_forcing_bgc, only: get_forcing_bgc, get_atm_bgc, & faero_default use ice_flux, only: init_flux_atm, init_flux_ocn use ice_timers, only: ice_timer_start, ice_timer_stop, & @@ -103,8 +103,8 @@ subroutine CICE_Run #endif if (z_tracers) call get_atm_bgc ! biogeochemistry - call init_flux_atm ! initialize atmosphere fluxes sent to coupler - call init_flux_ocn ! initialize ocean fluxes sent to coupler + call init_flux_atm ! Initialize atmosphere fluxes sent to coupler + call init_flux_ocn ! initialize ocean fluxes sent to coupler call ice_timer_stop(timer_couple) ! atm/ocn coupling @@ -135,7 +135,7 @@ subroutine ice_step use ice_diagnostics_bgc, only: hbrine_diags, zsal_diags, bgc_diags use ice_domain, only: halo_info, nblocks use ice_dyn_eap, only: write_restart_eap - use ice_dyn_shared, only: kdyn + use ice_dyn_shared, only: kdyn, kridge use ice_flux, only: scale_factor, init_history_therm, & daidtt, daidtd, dvidtt, dvidtd, dagedtt, dagedtd use ice_history, only: accum_hist @@ -149,14 +149,15 @@ subroutine ice_step use ice_restoring, only: restore_ice, ice_HaloRestore use ice_step_mod, only: prep_radiation, step_therm1, step_therm2, & update_state, step_dyn_horiz, step_dyn_ridge, step_radiation, & - biogeochemistry + biogeochemistry, save_init use ice_timers, only: ice_timer_start, ice_timer_stop, & timer_diags, timer_column, timer_thermo, timer_bound, & timer_hist, timer_readwrite integer (kind=int_kind) :: & iblk , & ! block index - k ! dynamics supercycling index + k , & ! dynamics supercycling index + ktherm ! thermodynamics is off when ktherm = -1 real (kind=dbl_kind) :: & offset ! d(age)/dt time offset @@ -169,7 +170,7 @@ subroutine ice_step character(len=*), parameter :: subname = '(ice_step)' call icepack_query_parameters(calc_Tsfc_out=calc_Tsfc, skl_bgc_out=skl_bgc, & - solve_zsal_out=solve_zsal, z_tracers_out=z_tracers) + solve_zsal_out=solve_zsal, z_tracers_out=z_tracers, ktherm_out=ktherm) call icepack_query_tracer_flags(tr_iage_out=tr_iage, tr_FY_out=tr_FY, & tr_lvl_out=tr_lvl, tr_pond_cesm_out=tr_pond_cesm, tr_pond_lvl_out=tr_pond_lvl, & tr_pond_topo_out=tr_pond_topo, tr_brine_out=tr_brine, tr_aero_out=tr_aero) @@ -184,7 +185,7 @@ subroutine ice_step if (restore_ice) call ice_HaloRestore !----------------------------------------------------------------- - ! initialize diagnostics + ! initialize diagnostics and save initial state values !----------------------------------------------------------------- call ice_timer_start(timer_diags) ! diagnostics/history @@ -196,22 +197,28 @@ subroutine ice_step call ice_timer_start(timer_column) ! column physics call ice_timer_start(timer_thermo) ! thermodynamics + call save_init + !$OMP PARALLEL DO PRIVATE(iblk) do iblk = 1, nblocks + if (ktherm >= 0) then + !----------------------------------------------------------------- - ! Scale radiation fields + ! scale radiation fields !----------------------------------------------------------------- - if (calc_Tsfc) call prep_radiation (iblk) + if (calc_Tsfc) call prep_radiation (iblk) !----------------------------------------------------------------- ! thermodynamics and biogeochemistry !----------------------------------------------------------------- - call step_therm1 (dt, iblk) ! vertical thermodynamics - call biogeochemistry (dt, iblk) ! biogeochemistry - call step_therm2 (dt, iblk) ! ice thickness distribution thermo + call step_therm1 (dt, iblk) ! vertical thermodynamics + call biogeochemistry (dt, iblk) ! biogeochemistry + call step_therm2 (dt, iblk) ! ice thickness distribution thermo + + endif enddo ! iblk !$OMP END PARALLEL DO @@ -235,7 +242,7 @@ subroutine ice_step ! ridging !$OMP PARALLEL DO PRIVATE(iblk) do iblk = 1, nblocks - call step_dyn_ridge (dt_dyn, ndtd, iblk) + if (kridge > 0) call step_dyn_ridge (dt_dyn, ndtd, iblk) enddo !$OMP END PARALLEL DO @@ -255,7 +262,7 @@ subroutine ice_step !$OMP PARALLEL DO PRIVATE(iblk) do iblk = 1, nblocks - call step_radiation (dt, iblk) + if (ktherm >= 0) call step_radiation (dt, iblk) !----------------------------------------------------------------- ! get ready for coupling and the next time step @@ -281,7 +288,7 @@ subroutine ice_step call ice_timer_start(timer_diags) ! diagnostics if (mod(istep,diagfreq) == 0) then call runtime_diags(dt) ! log file - if (solve_zsal) call zsal_diags + if (solve_zsal) call zsal_diags if (skl_bgc .or. z_tracers) call bgc_diags if (tr_brine) call hbrine_diags endif @@ -331,7 +338,7 @@ subroutine coupling_prep (iblk) alvdf_ai, alidf_ai, alvdr_ai, alidr_ai, fhocn_ai, & fresh_ai, fsalt_ai, fsalt, & fswthru_ai, fhocn, fswthru, scale_factor, snowfrac, & - swvdr, swidr, swvdf, swidf, Tf, Tair, Qa, strairxT, strairyt, & + swvdr, swidr, swvdf, swidf, Tf, Tair, Qa, strairxT, strairyT, & fsens, flat, fswabs, flwout, evap, Tref, Qref, & scale_fluxes, frzmlt_init, frzmlt use ice_flux_bgc, only: faero_ocn, fzsal_ai, fzsal_g_ai, flux_bio, flux_bio_ai @@ -425,12 +432,12 @@ subroutine coupling_prep (iblk) ihi = this_block%ihi jlo = this_block%jlo jhi = this_block%jhi - + do n = 1, ncat do j = jlo, jhi do i = ilo, ihi if (aicen(i,j,n,iblk) > puny) then - + alvdf(i,j,iblk) = alvdf(i,j,iblk) & + alvdfn(i,j,n,iblk)*aicen(i,j,n,iblk) alidf(i,j,iblk) = alidf(i,j,iblk) & @@ -455,7 +462,7 @@ subroutine coupling_prep (iblk) + apeffn(i,j,n,iblk)*aicen(i,j,n,iblk) snowfrac(i,j,iblk) = snowfrac(i,j,iblk) & ! for history + snowfracn(i,j,n,iblk)*aicen(i,j,n,iblk) - + endif ! aicen > puny enddo enddo @@ -624,7 +631,7 @@ subroutine sfcflux_to_ocn(nx_block, ny_block, & end subroutine sfcflux_to_ocn -#endif +#endif !======================================================================= diff --git a/cicecore/drivers/cice/CICE_RunMod.F90_debug b/cicecore/drivers/cice/CICE_RunMod.F90_debug index 72e8f86df..9ffe0094a 100644 --- a/cicecore/drivers/cice/CICE_RunMod.F90_debug +++ b/cicecore/drivers/cice/CICE_RunMod.F90_debug @@ -44,8 +44,8 @@ subroutine CICE_Run use ice_calendar, only: istep, istep1, time, dt, stop_now, calendar - use ice_forcing, only: get_forcing_atmo, get_forcing_ocn - use ice_forcing_bgc, only: get_forcing_bgc, get_atm_bgc, fzaero_data, & + use ice_forcing, only: get_forcing_atmo, get_forcing_ocn, atm_data_type + use ice_forcing_bgc, only: get_forcing_bgc, get_atm_bgc, & faero_default use ice_flux, only: init_flux_atm, init_flux_ocn use ice_timers, only: ice_timer_start, ice_timer_stop, & @@ -103,8 +103,8 @@ #endif if (z_tracers) call get_atm_bgc ! biogeochemistry - call init_flux_atm ! initialize atmosphere fluxes sent to coupler - call init_flux_ocn ! initialize ocean fluxes sent to coupler + call init_flux_atm ! Initialize atmosphere fluxes sent to coupler + call init_flux_ocn ! initialize ocean fluxes sent to coupler call ice_timer_stop(timer_couple) ! atm/ocn coupling @@ -134,9 +134,8 @@ use ice_diagnostics, only: init_mass_diags, runtime_diags use ice_diagnostics_bgc, only: hbrine_diags, zsal_diags, bgc_diags use ice_domain, only: halo_info, nblocks - use ice_domain_size, only: nslyr use ice_dyn_eap, only: write_restart_eap - use ice_dyn_shared, only: kdyn + use ice_dyn_shared, only: kdyn, kridge use ice_flux, only: scale_factor, init_history_therm, & daidtt, daidtd, dvidtt, dvidtd, dagedtt, dagedtd use ice_history, only: accum_hist @@ -148,17 +147,17 @@ write_restart_bgc, write_restart_hbrine use ice_restart_driver, only: dumpfile use ice_restoring, only: restore_ice, ice_HaloRestore - use ice_state, only: trcrn use ice_step_mod, only: prep_radiation, step_therm1, step_therm2, & update_state, step_dyn_horiz, step_dyn_ridge, step_radiation, & - biogeochemistry + biogeochemistry, save_init use ice_timers, only: ice_timer_start, ice_timer_stop, & timer_diags, timer_column, timer_thermo, timer_bound, & timer_hist, timer_readwrite integer (kind=int_kind) :: & iblk , & ! block index - k ! dynamics supercycling index + k , & ! dynamics supercycling index + ktherm ! thermodynamics is off when ktherm = -1 real (kind=dbl_kind) :: & offset ! d(age)/dt time offset @@ -168,17 +167,17 @@ tr_pond_cesm, tr_pond_lvl, tr_pond_topo, tr_brine, tr_aero, & calc_Tsfc, skl_bgc, solve_zsal, z_tracers - character (len=char_len) :: plabeld - character(len=*), parameter :: subname = '(ice_step)' + character (len=char_len) :: plabeld + plabeld = 'beginning time step' do iblk = 1, nblocks call debug_ice (iblk, plabeld) enddo call icepack_query_parameters(calc_Tsfc_out=calc_Tsfc, skl_bgc_out=skl_bgc, & - solve_zsal_out=solve_zsal, z_tracers_out=z_tracers) + solve_zsal_out=solve_zsal, z_tracers_out=z_tracers, ktherm_out=ktherm) call icepack_query_tracer_flags(tr_iage_out=tr_iage, tr_FY_out=tr_FY, & tr_lvl_out=tr_lvl, tr_pond_cesm_out=tr_pond_cesm, tr_pond_lvl_out=tr_pond_lvl, & tr_pond_topo_out=tr_pond_topo, tr_brine_out=tr_brine, tr_aero_out=tr_aero) @@ -193,7 +192,7 @@ if (restore_ice) call ice_HaloRestore !----------------------------------------------------------------- - ! initialize diagnostics + ! initialize diagnostics and save initial state values !----------------------------------------------------------------- call ice_timer_start(timer_diags) ! diagnostics/history @@ -205,36 +204,42 @@ call ice_timer_start(timer_column) ! column physics call ice_timer_start(timer_thermo) ! thermodynamics + call save_init + !$OMP PARALLEL DO PRIVATE(iblk) do iblk = 1, nblocks + if (ktherm >= 0) then + !----------------------------------------------------------------- - ! Scale radiation fields + ! scale radiation fields !----------------------------------------------------------------- - if (calc_Tsfc) call prep_radiation (dt, iblk) + if (calc_Tsfc) call prep_radiation (iblk) - plabeld = 'post prep_radiation' - call debug_ice (iblk, plabeld) + plabeld = 'post prep_radiation' + call debug_ice (iblk, plabeld) !----------------------------------------------------------------- ! thermodynamics and biogeochemistry !----------------------------------------------------------------- - call step_therm1 (dt, iblk) ! vertical thermodynamics + call step_therm1 (dt, iblk) ! vertical thermodynamics - plabeld = 'post step_therm1' - call debug_ice (iblk, plabeld) + plabeld = 'post step_therm1' + call debug_ice (iblk, plabeld) - call biogeochemistry (dt, iblk) ! biogeochemistry + call biogeochemistry (dt, iblk) ! biogeochemistry - plabeld = 'post biogeochemistry' - call debug_ice (iblk, plabeld) + plabeld = 'post biogeochemistry' + call debug_ice (iblk, plabeld) - call step_therm2 (dt, iblk) ! ice thickness distribution thermo + call step_therm2 (dt, iblk) ! ice thickness distribution thermo - plabeld = 'post step_therm2' - call debug_ice (iblk, plabeld) + plabeld = 'post step_therm2' + call debug_ice (iblk, plabeld) + + endif enddo ! iblk !$OMP END PARALLEL DO @@ -258,7 +263,7 @@ ! ridging !$OMP PARALLEL DO PRIVATE(iblk) do iblk = 1, nblocks - call step_dyn_ridge (dt_dyn, ndtd, iblk) + if (kridge > 0) call step_dyn_ridge (dt_dyn, ndtd, iblk) enddo !$OMP END PARALLEL DO @@ -283,7 +288,7 @@ !$OMP PARALLEL DO PRIVATE(iblk) do iblk = 1, nblocks - call step_radiation (dt, iblk) + if (ktherm >= 0) call step_radiation (dt, iblk) plabeld = 'post step_radiation' call debug_ice (iblk, plabeld) @@ -315,9 +320,9 @@ call ice_timer_start(timer_diags) ! diagnostics if (mod(istep,diagfreq) == 0) then call runtime_diags(dt) ! log file - if (solve_zsal) call zsal_diags(dt) - if (skl_bgc .or. z_tracers) call bgc_diags (dt) - if (tr_brine) call hbrine_diags(dt) + if (solve_zsal) call zsal_diags + if (skl_bgc .or. z_tracers) call bgc_diags + if (tr_brine) call hbrine_diags endif call ice_timer_stop(timer_diags) ! diagnostics @@ -356,20 +361,25 @@ use ice_arrays_column, only: alvdfn, alidfn, alvdrn, alidrn, & albicen, albsnon, albpndn, apeffn, fzsal_g, fzsal, snowfracn - use ice_blocks, only: block, nx_block, ny_block + use ice_blocks, only: nx_block, ny_block, get_block, block + use ice_domain, only: blocks_ice use ice_calendar, only: dt, nstreams use ice_domain_size, only: ncat use ice_flux, only: alvdf, alidf, alvdr, alidr, albice, albsno, & - albpnd, albcnt, apeff_ai, coszen, fpond, fresh, l_mpond_fresh, & + albpnd, albcnt, apeff_ai, fpond, fresh, l_mpond_fresh, & alvdf_ai, alidf_ai, alvdr_ai, alidr_ai, fhocn_ai, & fresh_ai, fsalt_ai, fsalt, & fswthru_ai, fhocn, fswthru, scale_factor, snowfrac, & - swvdr, swidr, swvdf, swidf, Tf, Tair, Qa, strairxT, strairyt, & + swvdr, swidr, swvdf, swidf, Tf, Tair, Qa, strairxT, strairyT, & fsens, flat, fswabs, flwout, evap, Tref, Qref, & - fsurfn_f, flatn_f, scale_fluxes, frzmlt_init, frzmlt + scale_fluxes, frzmlt_init, frzmlt use ice_flux_bgc, only: faero_ocn, fzsal_ai, fzsal_g_ai, flux_bio, flux_bio_ai use ice_grid, only: tmask - use ice_state, only: aicen, aice, aice_init + use ice_state, only: aicen, aice +#ifdef CICE_IN_NEMO + use ice_state, only: aice_init + use ice_flux, only: flatn_f, fsurfn_f +#endif use ice_step_mod, only: ocean_mixed_layer use ice_timers, only: timer_couple, ice_timer_start, ice_timer_stop @@ -379,11 +389,15 @@ ! local variables integer (kind=int_kind) :: & + ilo,ihi,jlo,jhi, & ! beginning and end of physical domain n , & ! thickness category index i,j , & ! horizontal indices k , & ! tracer index nbtrcr ! + type (block) :: & + this_block ! block information for current block + logical (kind=log_kind) :: & calc_Tsfc ! @@ -444,9 +458,16 @@ enddo enddo enddo + + this_block = get_block(blocks_ice(iblk),iblk) + ilo = this_block%ilo + ihi = this_block%ihi + jlo = this_block%jlo + jhi = this_block%jhi + do n = 1, ncat - do j = 1, ny_block - do i = 1, nx_block + do j = jlo, jhi + do i = ilo, ihi if (aicen(i,j,n,iblk) > puny) then alvdf(i,j,iblk) = alvdf(i,j,iblk) & @@ -547,6 +568,7 @@ fzsal (:,:,iblk), fzsal_g (:,:,iblk), & flux_bio(:,:,1:nbtrcr,iblk)) +#ifdef CICE_IN_NEMO !echmod - comment this out for efficiency, if .not. calc_Tsfc if (.not. calc_Tsfc) then @@ -562,11 +584,13 @@ fresh (:,:,iblk), fhocn (:,:,iblk)) endif !echmod - +#endif call ice_timer_stop(timer_couple) ! atm/ocn coupling end subroutine coupling_prep +#ifdef CICE_IN_NEMO + !======================================================================= ! ! If surface heat fluxes are provided to CICE instead of CICE calculating @@ -606,7 +630,6 @@ fresh , & ! fresh water flux to ocean (kg/m2/s) fhocn ! actual ocn/ice heat flx (W/m**2) -#ifdef CICE_IN_NEMO ! local variables integer (kind=int_kind) :: & @@ -637,10 +660,11 @@ enddo ! j enddo ! n -#endif end subroutine sfcflux_to_ocn +#endif + !======================================================================= end module CICE_RunMod diff --git a/configuration/scripts/cice_decomp.csh b/configuration/scripts/cice_decomp.csh index 81a8fd326..9bf377c0a 100755 --- a/configuration/scripts/cice_decomp.csh +++ b/configuration/scripts/cice_decomp.csh @@ -44,6 +44,17 @@ else if (${grid} == 'gbox128') then set blckx = 8; set blcky = 8 endif +else if (${grid} == 'gbox80') then + set nxglob = 80 + set nyglob = 80 + if (${cicepes} <= 1) then + set blckx = 80; set blcky = 80 + else if (${cicepes} <= 8) then + set blckx = 20; set blcky = 20 + else + set blckx = 8; set blcky = 8 + endif + else if (${grid} == 'gx3') then set nxglob = 100 set nyglob = 116 diff --git a/configuration/scripts/ice_in b/configuration/scripts/ice_in index 2bea32602..aad6bd4e8 100644 --- a/configuration/scripts/ice_in +++ b/configuration/scripts/ice_in @@ -50,6 +50,9 @@ kmt_file = 'kmt' gridcpl_file = 'unknown_gridcpl_file' kcatbound = 0 + dxrect = 30.e5 + dyrect = 30.e5 + close_boundaries = .false. ncat = 5 nilyr = 7 nslyr = 1 @@ -115,6 +118,9 @@ Ktens = 0. e_ratio = 2. basalstress = .false. + coriolis = 'latitude' + kridge = 1 + ktransport = 1 / &shortwave_nml diff --git a/configuration/scripts/options/set_env.box2001 b/configuration/scripts/options/set_env.box2001 new file mode 100755 index 000000000..a3f7c10f5 --- /dev/null +++ b/configuration/scripts/options/set_env.box2001 @@ -0,0 +1 @@ +setenv NICELYR 1 diff --git a/configuration/scripts/options/set_nml.box2001 b/configuration/scripts/options/set_nml.box2001 new file mode 100755 index 000000000..5bb9a93c1 --- /dev/null +++ b/configuration/scripts/options/set_nml.box2001 @@ -0,0 +1,44 @@ +days_per_year = 360 +npt = 240 +ice_ic = 'default' +restart = .false. +restart_ext = .true. +restart_format = 'bin' +histfreq = 'd','x','x','x','x' +grid_type = 'rectangular' +dxrect = 16.e5 +dyrect = 16.e5 +close_boundaries = .true. +ew_boundary_type = 'open' +ns_boundary_type = 'open' +tr_iage = .false. +tr_FY = .false. +tr_lvl = .false. +tr_pond_lvl = .false. +ktherm = -1 +kstrength = 0 +kdyn = 1 +kridge = -1 +ktransport = -1 +coriolis = 'constant' +atmbndy = 'constant' +atm_data_type = 'box' +calc_strair = .false. +restore_ice = .true. +f_aice = 'd' +f_hi = 'd' +f_hs = 'd' +f_Tsfc = 'd' +f_uvel = 'd' +f_vvel = 'd' +f_uatm = 'd' +f_vatm = 'd' +f_uocn = 'd' +f_vocn = 'd' +f_strairx = 'd' +f_strairy = 'd' +f_strocnx = 'd' +f_strocny = 'd' +f_divu = 'd' +f_sig1 = 'd' +f_sig2 = 'd' diff --git a/configuration/scripts/options/set_nml.gbox80 b/configuration/scripts/options/set_nml.gbox80 new file mode 100755 index 000000000..bdbbd9337 --- /dev/null +++ b/configuration/scripts/options/set_nml.gbox80 @@ -0,0 +1,3 @@ +ice_ic = 'default' +grid_type = 'rectangular' +atm_data_type = 'box' diff --git a/configuration/scripts/tests/base_suite.ts b/configuration/scripts/tests/base_suite.ts index 663c4f21f..b49fac485 100644 --- a/configuration/scripts/tests/base_suite.ts +++ b/configuration/scripts/tests/base_suite.ts @@ -21,3 +21,4 @@ restart gbox128 4x2 none restart gbox128 4x2 boxdyn restart gbox128 2x2 boxadv restart gbox128 4x4 boxrestore +restart gbox80 1x1 box2001 diff --git a/doc/source/user_guide/ug_case_settings.rst b/doc/source/user_guide/ug_case_settings.rst index 46994432f..4a636b05b 100755 --- a/doc/source/user_guide/ug_case_settings.rst +++ b/doc/source/user_guide/ug_case_settings.rst @@ -147,6 +147,8 @@ Table of namelist options "", "``1``", "new formula with round numbers", "" "", "``2``", "WMO standard categories", "" "", "``-1``", "one category", "" + "``dxrect``", "real", "x-direction grid spacing (meters) for rectangular grid", "" + "``dyrect``", "real", "y-direction grid spacing (meters) for rectangular grid", "" "``ncat``", "integer", "number of ice thickness categories", "5" "``nilyr``", "integer", "number of vertical layers in ice", "7" "``nslyr``", "integer", "number of vertical layers in snow", "1" @@ -225,6 +227,7 @@ Table of namelist options "``ktherm``", "``0``", "zero-layer thermodynamic model", "" "", "``1``", "Bitz and Lipscomb thermodynamic model", "" "", "``2``", "mushy-layer thermodynamic model", "" + "", "``-1``", "thermodynamics disabled", "" "``conduct``", "``Maykut71``", "conductivity :cite:`Maykut71`", "" "", "``bubbly``", "conductivity :cite:`Pringle07`", "" "``a_rapid_mode``", "real", "brine channel diameter", "0.5x10 :math:`^{-3}` m" @@ -236,9 +239,11 @@ Table of namelist options "", "", "", "" "*dynamics_nml*", "", "", "" "", "", "*Dynamics*", "" - "``kdyn``", "``0``", "dynamics OFF", "1" + "``kdyn``", "``-1``", "dynamics OFF", "1" + "", "``0``", "dynamics OFF", "" "", "``1``", "EVP dynamics", "" "", "``2``", "EAP dynamics", "" + "", "``1``", "dynamics ON", "" "``revised_evp``", "true/false", "use revised EVP formulation", "" "``ndte``", "integer", "number of EVP subcycles", "120" "``advection``", "``remap``", "linear remapping advection", "‘remap’" @@ -251,6 +256,13 @@ Table of namelist options "", "``1``", "new ridging redistribution function", "" "``mu_rdg``", "real", "e-folding scale of ridged ice", "" "``Cf``", "real", "ratio of ridging work to PE change in ridging", "17." + "``coriolis``", "``latitude``", "Coriolis variable by latitude", "'latitude'" + "", "``constant``", "Constant coriolis value = 1.46e-4", "" + "", "``zero``", "Zero coriolis", "" + "``kridge``", "``1``", "Ridging Enabled", "1" + "", "``-1``", "Ridging Disabled", "" + "``ktransport``", "``1``", "Transport Enabled", "1" + "", "``-1``", "Transport Disabled", "" "", "", "", "" "*shortwave_nml*", "", "", "" "", "", "*Shortwave*", "" diff --git a/doc/source/user_guide/ug_testing.rst b/doc/source/user_guide/ug_testing.rst index 8e3b09574..20414a08c 100644 --- a/doc/source/user_guide/ug_testing.rst +++ b/doc/source/user_guide/ug_testing.rst @@ -202,6 +202,34 @@ Individual Test Examples argument and the same testid to the end of the diff argument. Then the runs will be compared for bit-for-bit and a result will be produced in test_output. +Specific Test Cases +~~~~~~~~~~~~~~~~~~~ + +In addition to the test implemented in the general testing framework, specific +tests have been developed to validate specific portions of the model. These +specific tests are detailed in this section. + +``box2001`` +^^^^^^^^^^^^ + +The ``box2001`` test case is configured to perform the rectangular-grid box test +detailed in :cite:`Hunke01`. It is configured to run a 72-hour simulation with +thermodynamics disabled in a rectangular domain (80 x 80 grid cells) with a land +boundary around the entire domain. It includes the following namelist modifications: + +- ``dxrect``: ``16.e5`` meters +- ``dyrect``: ``16.e5`` meters +- ``thermo``: ``0`` (disables thermodynamics) +- ``coriolis``: ``zero`` (zero coriolis force) + +Ocean stresses are computed as in :cite:`Hunke01` where they are circular and centered +in the square domain. The ice distribution is fixed, with a constant 2 meter ice +thickness and a concentration field that varies linearly in the x-direction from ``0`` +to ``1`` and is constant in the y-direction. No islands are included in this +configuration. The test is configured to run on a single processor. + +To run the test: ``./cice.setup -m --test smoke -s box2001 --testid +--grid gbox80 --acct -p 1x1`` .. _testsuites: