From 6d238c70c2412c704f7fc24128cf709f858ab315 Mon Sep 17 00:00:00 2001 From: Denise Worthen Date: Mon, 31 Aug 2020 12:53:02 -0400 Subject: [PATCH] Update CICE6 for integration to S2S * add wcoss_dell_p3 compiler macro * update to icepack w/ debug fix * replace SITE with MACHINE_ID * update compile scripts Support TACC stampede (#19) --- .gitmodules | 2 +- .../cicedyn/dynamics/ice_transport_driver.F90 | 142 ++++---- cicecore/cicedyn/general/ice_step_mod.F90 | 14 +- cicecore/cicedynB/general/ice_init.F90 | 12 +- cicecore/shared/ice_init_column.F90 | 22 +- cicecore/version.txt | 2 +- .../forapps/ufs/comp_ice.backend.clean | 12 +- .../forapps/ufs/comp_ice.backend.libcice | 12 +- configuration/scripts/options/set_nml.alt04 | 2 +- configuration/scripts/tests/QC/cice.t-test.py | 322 +++++------------- doc/source/cice_index.rst | 2 +- doc/source/conf.py | 9 +- doc/source/developer_guide/dg_dynamics.rst | 120 ++++++- doc/source/science_guide/sg_horiztrans.rst | 2 +- doc/source/user_guide/ug_case_settings.rst | 4 +- doc/source/user_guide/ug_testing.rst | 2 +- 16 files changed, 324 insertions(+), 357 deletions(-) diff --git a/.gitmodules b/.gitmodules index f14869a27..8a773d230 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "icepack"] path = icepack - url = https://github.com/cice-consortium/icepack + url = https://github.com/NOAA-EMC/Icepack diff --git a/cicecore/cicedyn/dynamics/ice_transport_driver.F90 b/cicecore/cicedyn/dynamics/ice_transport_driver.F90 index 5e844a344..ed3327672 100644 --- a/cicecore/cicedyn/dynamics/ice_transport_driver.F90 +++ b/cicecore/cicedyn/dynamics/ice_transport_driver.F90 @@ -1,6 +1,7 @@ !======================================================================= ! -! Drivers for remapping and upwind ice transport +!deprecate upwind Drivers for remapping and upwind ice transport +! Drivers for incremental remapping ice transport ! ! authors: Elizabeth C. Hunke and William H. Lipscomb, LANL ! @@ -9,6 +10,7 @@ ! 2006: Incorporated remap transport driver and renamed from ! ice_transport_upwind. ! 2011: ECH moved edgearea arrays into ice_transport_remap.F90 +! 2020: deprecated upwind transport module ice_transport_driver @@ -28,12 +30,13 @@ module ice_transport_driver implicit none private - public :: init_transport, transport_remap, transport_upwind + public :: init_transport, transport_remap!deprecate upwind:, transport_upwind character (len=char_len), public :: & advection ! type of advection scheme used - ! 'upwind' => 1st order donor cell scheme +!deprecate upwind ! 'upwind' => 1st order donor cell scheme ! 'remap' => remapping scheme + ! 'none' => advection off (ktransport = -1 also turns it off) logical, parameter :: & ! if true, prescribe area flux across each edge l_fixed_area = .false. @@ -66,8 +69,9 @@ module ice_transport_driver !======================================================================= ! ! This subroutine is a wrapper for init_remap, which initializes the -! remapping transport scheme. If the model is run with upwind -! transport, no initializations are necessary. +! remapping transport scheme. +!deprecate upwind If the model is run with upwind +!deprecate upwind! transport, no initializations are necessary. ! ! authors William H. Lipscomb, LANL @@ -666,11 +670,12 @@ subroutine transport_remap (dt) end subroutine transport_remap !======================================================================= -! +!deprecate upwind! ! Computes the transport equations for one timestep using upwind. Sets ! several fields into a work array and passes it to upwind routine. - subroutine transport_upwind (dt) +!deprecate upwind + subroutine transport_upwind_deprecated (dt) use ice_boundary, only: ice_HaloUpdate use ice_blocks, only: nx_block, ny_block, block, get_block, nx_block, ny_block @@ -755,52 +760,52 @@ subroutine transport_upwind (dt) field_loc_Nface, field_type_vector) call ice_timer_stop(timer_bound) - !$OMP PARALLEL DO PRIVATE(iblk,ilo,ihi,jlo,jhi,this_block) - do iblk = 1, nblocks - this_block = get_block(blocks_ice(iblk),iblk) - ilo = this_block%ilo - ihi = this_block%ihi - jlo = this_block%jlo - jhi = this_block%jhi - +!deprecate upwind !$OMP PARALLEL DO PRIVATE(iblk,ilo,ihi,jlo,jhi,this_block) +!deprecate upwind do iblk = 1, nblocks +!deprecate upwind this_block = get_block(blocks_ice(iblk),iblk) +!deprecate upwind ilo = this_block%ilo +!deprecate upwind ihi = this_block%ihi +!deprecate upwind jlo = this_block%jlo +!deprecate upwind jhi = this_block%jhi !----------------------------------------------------------------- ! fill work arrays with fields to be advected !----------------------------------------------------------------- - call state_to_work (nx_block, ny_block, & - ntrcr, & - narr, trcr_depend, & - aicen (:,:, :,iblk), trcrn (:,:,:,:,iblk), & - vicen (:,:, :,iblk), vsnon (:,:, :,iblk), & - aice0 (:,:, iblk), works (:,:, :,iblk)) +!deprecate upwind +!deprecate upwind call state_to_work (nx_block, ny_block, & +!deprecate upwind ntrcr, & +!deprecate upwind narr, trcr_depend, & +!deprecate upwind aicen (:,:, :,iblk), trcrn (:,:,:,:,iblk), & +!deprecate upwind vicen (:,:, :,iblk), vsnon (:,:, :,iblk), & +!deprecate upwind aice0 (:,:, iblk), works (:,:, :,iblk)) !----------------------------------------------------------------- ! advect !----------------------------------------------------------------- - call upwind_field (nx_block, ny_block, & - ilo, ihi, jlo, jhi, & - dt, & - narr, works(:,:,:,iblk), & - uee(:,:,iblk), vnn (:,:,iblk), & - HTE(:,:,iblk), HTN (:,:,iblk), & - tarea(:,:,iblk)) +!deprecate upwind call upwind_field (nx_block, ny_block, & +!deprecate upwind ilo, ihi, jlo, jhi, & +!deprecate upwind dt, & +!deprecate upwind narr, works(:,:,:,iblk), & +!deprecate upwind uee(:,:,iblk), vnn (:,:,iblk), & +!deprecate upwind HTE(:,:,iblk), HTN (:,:,iblk), & +!deprecate upwind tarea(:,:,iblk)) !----------------------------------------------------------------- ! convert work arrays back to state variables !----------------------------------------------------------------- - call work_to_state (nx_block, ny_block, & - ntrcr, narr, & - trcr_depend(:), trcr_base(:,:), & - n_trcr_strata(:), nt_strata(:,:), & - aicen(:,:, :,iblk), trcrn (:,:,:,:,iblk), & - vicen(:,:, :,iblk), vsnon (:,:, :,iblk), & - aice0(:,:, iblk), works (:,:, :,iblk)) +!deprecate upwind call work_to_state (nx_block, ny_block, & +!deprecate upwind ntrcr, narr, & +!deprecate upwind trcr_depend(:), trcr_base(:,:), & +!deprecate upwind n_trcr_strata(:), nt_strata(:,:), & +!deprecate upwind aicen(:,:, :,iblk), trcrn (:,:,:,:,iblk), & +!deprecate upwind vicen(:,:, :,iblk), vsnon (:,:, :,iblk), & +!deprecate upwind aice0(:,:, iblk), works (:,:, :,iblk)) - enddo ! iblk - !$OMP END PARALLEL DO +!deprecate upwind enddo ! iblk +!deprecate upwind !$OMP END PARALLEL DO deallocate (works) @@ -818,7 +823,8 @@ subroutine transport_upwind (dt) call ice_timer_stop(timer_advect) ! advection - end subroutine transport_upwind + end subroutine transport_upwind_deprecated +!deprecate upwind !======================================================================= ! The next few subroutines (through check_monotonicity) are called @@ -1441,12 +1447,12 @@ subroutine check_monotonicity (nx_block, ny_block, & end subroutine check_monotonicity !======================================================================= -! The remaining subroutines are called by transport_upwind. +!deprecate upwind! The remaining subroutines are called by transport_upwind. !======================================================================= ! ! Fill work array with state variables in preparation for upwind transport - - subroutine state_to_work (nx_block, ny_block, & +!deprecate upwind + subroutine state_to_work_deprecated (nx_block, ny_block, & ntrcr, & narr, trcr_depend, & aicen, trcrn, & @@ -1587,13 +1593,13 @@ subroutine state_to_work (nx_block, ny_block, & if (narr /= narrays) write(nu_diag,*) & "Wrong number of arrays in transport bound call" - end subroutine state_to_work + end subroutine state_to_work_deprecated !======================================================================= ! ! Convert work array back to state variables - - subroutine work_to_state (nx_block, ny_block, & +!deprecate upwind + subroutine work_to_state_deprecated (nx_block, ny_block, & ntrcr, narr, & trcr_depend, & trcr_base, & @@ -1701,13 +1707,13 @@ subroutine work_to_state (nx_block, ny_block, & if (icepack_warnings_aborted()) call abort_ice(error_message=subname, & file=__FILE__, line=__LINE__) - end subroutine work_to_state + end subroutine work_to_state_deprecated !======================================================================= ! ! upwind transport algorithm - - subroutine upwind_field (nx_block, ny_block, & +!deprecate upwind + subroutine upwind_field_deprecated (nx_block, ny_block, & ilo, ihi, jlo, jhi, & dt, & narrays, phi, & @@ -1750,26 +1756,26 @@ subroutine upwind_field (nx_block, ny_block, & do n = 1, narrays - do j = 1, jhi - do i = 1, ihi - worka(i,j)= & - upwind(phi(i,j,n),phi(i+1,j,n),uee(i,j),HTE(i,j),dt) - workb(i,j)= & - upwind(phi(i,j,n),phi(i,j+1,n),vnn(i,j),HTN(i,j),dt) - enddo - enddo - - do j = jlo, jhi - do i = ilo, ihi - phi(i,j,n) = phi(i,j,n) - ( worka(i,j)-worka(i-1,j) & - + workb(i,j)-workb(i,j-1) ) & - / tarea(i,j) - enddo - enddo +!deprecate upwind do j = 1, jhi +!deprecate upwind do i = 1, ihi +!deprecate upwind worka(i,j)= & +!deprecate upwind upwind(phi(i,j,n),phi(i+1,j,n),uee(i,j),HTE(i,j),dt) +!deprecate upwind workb(i,j)= & +!deprecate upwind upwind(phi(i,j,n),phi(i,j+1,n),vnn(i,j),HTN(i,j),dt) +!deprecate upwind enddo +!deprecate upwind enddo + +!deprecate upwind do j = jlo, jhi +!deprecate upwind do i = ilo, ihi +!deprecate upwind phi(i,j,n) = phi(i,j,n) - ( worka(i,j)-worka(i-1,j) & +!deprecate upwind + workb(i,j)-workb(i,j-1) ) & +!deprecate upwind / tarea(i,j) +!deprecate upwind enddo +!deprecate upwind enddo enddo ! narrays - end subroutine upwind_field + end subroutine upwind_field_deprecated !======================================================================= @@ -1777,13 +1783,13 @@ end subroutine upwind_field ! Define upwind function !------------------------------------------------------------------- - real(kind=dbl_kind) function upwind(y1,y2,a,h,dt) +!deprecate upwind real(kind=dbl_kind) function upwind(y1,y2,a,h,dt) - real(kind=dbl_kind), intent(in) :: y1,y2,a,h,dt +!deprecate upwind real(kind=dbl_kind), intent(in) :: y1,y2,a,h,dt - upwind = p5*dt*h*((a+abs(a))*y1+(a-abs(a))*y2) +!deprecate upwind upwind = p5*dt*h*((a+abs(a))*y1+(a-abs(a))*y2) - end function upwind +!deprecate upwind end function upwind !======================================================================= diff --git a/cicecore/cicedyn/general/ice_step_mod.F90 b/cicecore/cicedyn/general/ice_step_mod.F90 index d6bf20ebc..fde7a16cf 100644 --- a/cicecore/cicedyn/general/ice_step_mod.F90 +++ b/cicecore/cicedyn/general/ice_step_mod.F90 @@ -850,7 +850,8 @@ subroutine step_dyn_horiz (dt) use ice_dyn_eap, only: eap use ice_dyn_shared, only: kdyn, ktransport use ice_flux, only: init_history_dyn - use ice_transport_driver, only: advection, transport_upwind, transport_remap +!deprecate upwind use ice_transport_driver, only: advection, transport_upwind, transport_remap + use ice_transport_driver, only: advection, transport_remap real (kind=dbl_kind), intent(in) :: & dt ! dynamics time step @@ -870,12 +871,13 @@ subroutine step_dyn_horiz (dt) ! Horizontal ice transport !----------------------------------------------------------------- - if (ktransport > 0) then - if (advection == 'upwind') then - call transport_upwind (dt) ! upwind - else +!deprecate upwind if (ktransport > 0) then + if (ktransport > 0 .and. advection == 'remap') then +!deprecate upwind if (advection == 'upwind') then +!deprecate upwind call transport_upwind (dt) ! upwind +!deprecate upwind else call transport_remap (dt) ! incremental remapping - endif +!deprecate upwind endif endif end subroutine step_dyn_horiz diff --git a/cicecore/cicedynB/general/ice_init.F90 b/cicecore/cicedynB/general/ice_init.F90 index d3b096eb3..f2eaae17d 100644 --- a/cicecore/cicedynB/general/ice_init.F90 +++ b/cicecore/cicedynB/general/ice_init.F90 @@ -795,7 +795,11 @@ subroutine input_data abort_list = trim(abort_list)//":1" endif - if (advection /= 'remap' .and. advection /= 'upwind' .and. advection /= 'none') then +!deprecate upwind if (advection /= 'remap' .and. advection /= 'upwind' .and. advection /= 'none') then + if (advection /= 'remap' .and. advection /= 'none') then + if (trim(advection) == 'upwind') then + if (my_task == master_task) write(nu_diag,*) subname//' ERROR: upwind advection has been deprecated' + endif if (my_task == master_task) write(nu_diag,*) subname//' ERROR: invalid advection=',trim(advection) abort_list = trim(abort_list)//":3" endif @@ -1178,8 +1182,10 @@ subroutine input_data tmpstr2 = ' transport enabled' if (trim(advection) == 'remap') then tmpstr2 = ': linear remapping advection' - elseif (trim(advection) == 'upwind') then - tmpstr2 = ': donor cell (upwind) advection' +!deprecate upwind elseif (trim(advection) == 'upwind') then +!deprecate upwind tmpstr2 = ': donor cell (upwind) advection' + elseif (trim(advection) == 'none') then + tmpstr2 = ': advection off' endif write(nu_diag,*) 'advection = ', trim(advection),trim(tmpstr2) else diff --git a/cicecore/shared/ice_init_column.F90 b/cicecore/shared/ice_init_column.F90 index 817e0d979..58c541eef 100644 --- a/cicecore/shared/ice_init_column.F90 +++ b/cicecore/shared/ice_init_column.F90 @@ -877,7 +877,7 @@ subroutine init_bgc() endif ! .not. restart - !$OMP PARALLEL DO PRIVATE(iblk,i,j,k,n,ilo,ihi,jlo,jhi,this_block,sicen,trcrn_bgc) + !$OMP PARALLEL DO PRIVATE(iblk,i,j,n,ilo,ihi,jlo,jhi,this_block) do iblk = 1, nblocks this_block = get_block(blocks_ice(iblk),iblk) @@ -889,15 +889,6 @@ subroutine init_bgc() do j = jlo, jhi do i = ilo, ihi - do n = 1, ncat - do k = 1, nilyr - sicen(k,n) = trcrn(i,j,nt_sice+k-1,n,iblk) - enddo - do k = ntrcr_o+1, ntrcr - trcrn_bgc(k-ntrcr_o,n) = trcrn(i,j,k,n,iblk) - enddo - enddo - call icepack_load_ocean_bio_array(max_nbtrcr=icepack_max_nbtrcr, & max_algae=icepack_max_algae, max_don=icepack_max_don, & max_doc=icepack_max_doc, max_fe=icepack_max_fe, & @@ -919,7 +910,7 @@ subroutine init_bgc() file=__FILE__, line=__LINE__) if (.not. restart_bgc) then - !$OMP PARALLEL DO PRIVATE(iblk,i,j,n,ilo,ihi,jlo,jhi,this_block) + !$OMP PARALLEL DO PRIVATE(iblk,i,j,k,n,ilo,ihi,jlo,jhi,this_block,sicen,trcrn_bgc) do iblk = 1, nblocks this_block = get_block(blocks_ice(iblk),iblk) @@ -930,7 +921,14 @@ subroutine init_bgc() do j = jlo, jhi do i = ilo, ihi - + do n = 1, ncat + do k = 1, nilyr + sicen(k,n) = trcrn(i,j,nt_sice+k-1,n,iblk) + enddo + do k = ntrcr_o+1, ntrcr + trcrn_bgc(k-ntrcr_o,n) = trcrn(i,j,k,n,iblk) + enddo + enddo call icepack_init_bgc(ncat=ncat, nblyr=nblyr, nilyr=nilyr, ntrcr_o=ntrcr_o, & cgrid=cgrid, igrid=igrid, ntrcr=ntrcr, nbtrcr=nbtrcr, & sicen=sicen(:,:), trcrn=trcrn_bgc(:,:), sss=sss(i,j, iblk), & diff --git a/cicecore/version.txt b/cicecore/version.txt index c908e44d9..83a606cb9 100644 --- a/cicecore/version.txt +++ b/cicecore/version.txt @@ -1 +1 @@ -CICE 6.5.0 +CICE 6.1.3 diff --git a/configuration/scripts/forapps/ufs/comp_ice.backend.clean b/configuration/scripts/forapps/ufs/comp_ice.backend.clean index 823f1f586..d75d381b4 100755 --- a/configuration/scripts/forapps/ufs/comp_ice.backend.clean +++ b/configuration/scripts/forapps/ufs/comp_ice.backend.clean @@ -1,19 +1,23 @@ #! /bin/csh -f ### Expect to find the following environment variables set on entry: -# SITE +# MACHINE_ID # SYSTEM_USERDIR # SRCDIR # EXEDIR setenv OBJDIR $EXEDIR/compile ; if !(-d $OBJDIR) mkdir -p $OBJDIR -if (${SITE} =~ cheyenne*) then +if (${MACHINE_ID} =~ cheyenne*) then setenv ARCH cheyenne_intel -else if (${SITE} =~ orion*) then +else if (${MACHINE_ID} =~ orion*) then setenv ARCH orion_intel -else if (${SITE} =~ hera*) then +else if (${MACHINE_ID} =~ hera*) then setenv ARCH hera_intel +else if (${MACHINE_ID} =~ wcoss*) then + setenv ARCH wcoss_dell_p3_intel +else if (${MACHINE_ID} =~ stampede*) then + setenv ARCH stampede_intel else echo "CICE6 ${0}: ERROR in ARCH setup, ${hname}" exit -2 diff --git a/configuration/scripts/forapps/ufs/comp_ice.backend.libcice b/configuration/scripts/forapps/ufs/comp_ice.backend.libcice index ea38e048b..47985bef2 100755 --- a/configuration/scripts/forapps/ufs/comp_ice.backend.libcice +++ b/configuration/scripts/forapps/ufs/comp_ice.backend.libcice @@ -1,7 +1,7 @@ #! /bin/csh -f ### Expect to find the following environment variables set on entry: -# SITE +# MACHINE_ID # SYSTEM_USERDIR # SRCDIR # EXEDIR @@ -16,12 +16,16 @@ setenv OBJDIR $EXEDIR/compile ; if !(-d $OBJDIR) mkdir -p $OBJDIR setenv THRD no # set to yes for OpenMP threading -if (${SITE} =~ cheyenne*) then +if (${MACHINE_ID} =~ cheyenne*) then setenv ARCH cheyenne_intel -else if (${SITE} =~ orion*) then +else if (${MACHINE_ID} =~ orion*) then setenv ARCH orion_intel -else if (${SITE} =~ hera*) then +else if (${MACHINE_ID} =~ hera*) then setenv ARCH hera_intel +else if (${MACHINE_ID} =~ wcoss*) then + setenv ARCH wcoss_dell_p3_intel +else if (${MACHINE_ID} =~ stampede*) then + setenv ARCH stampede_intel else echo "CICE6 ${0}: ERROR in ARCH setup, ${hname}" exit -2 diff --git a/configuration/scripts/options/set_nml.alt04 b/configuration/scripts/options/set_nml.alt04 index 273f7d87d..96a3a9c1b 100644 --- a/configuration/scripts/options/set_nml.alt04 +++ b/configuration/scripts/options/set_nml.alt04 @@ -21,7 +21,7 @@ evp_algorithm = 'shared_mem_1d' fbot_xfer_type = 'Cdn_ocn' shortwave = 'dEdd' formdrag = .true. -advection = 'upwind' +advection = 'remap' kstrength = 0 krdg_partic = 0 krdg_redist = 0 diff --git a/configuration/scripts/tests/QC/cice.t-test.py b/configuration/scripts/tests/QC/cice.t-test.py index b941c4912..987175245 100755 --- a/configuration/scripts/tests/QC/cice.t-test.py +++ b/configuration/scripts/tests/QC/cice.t-test.py @@ -57,15 +57,6 @@ def gen_filenames(base_dir, test_dir): " # of files: {}".format(len(files_b))) sys.exit(-1) - if len(files_a) < 1825: - logger.error("Number of output files too small, expecting at least 1825." + \ - " Exiting...\n" + \ - "Baseline directory: {}\n".format(path_a) + \ - " # of files: {}\n".format(len(files_a)) + \ - "Test directory: {}\n".format(path_b) + \ - " # of files: {}".format(len(files_b))) - sys.exit(-1) - logger.info("Number of files: %d", len(files_a)) return path_a, path_b, files_a, files_b @@ -177,10 +168,7 @@ def stage_one(data_d, num_files, mean_d, variance_d): df = n_eff - 1 # Read in t_crit table - if os.path.exists('./CICE_t_critical_p0.8.nc'): - nfid = nc.Dataset("./CICE_t_critical_p0.8.nc", 'r') - else: - nfid = nc.Dataset("configuration/scripts/tests/QC/CICE_t_critical_p0.8.nc", 'r') + nfid = nc.Dataset("configuration/scripts/tests/QC/CICE_t_critical_p0.8.nc", 'r') df_table = nfid.variables['df'][:] t_crit_table = nfid.variables['tcrit'][:] nfid.close() @@ -241,10 +229,7 @@ def stage_one(data_d, num_files, mean_d, variance_d): t_val = mean_d / np.sqrt(variance_d / num_files) # Find t_crit from the nearest value on the Lookup Table Test - if os.path.exists('./CICE_Lookup_Table_p0.8_n1825.nc'): - nfid = nc.Dataset("./CICE_Lookup_Table_p0.8_n1825.nc", 'r') - else: - nfid = nc.Dataset("configuration/scripts/tests/QC/CICE_Lookup_Table_p0.8_n1825.nc", 'r') + nfid = nc.Dataset("configuration/scripts/tests/QC/CICE_Lookup_Table_p0.8_n1825.nc", 'r') r1_table = nfid.variables['r1'][:] t_crit_table = nfid.variables['tcrit'][:] nfid.close() @@ -379,8 +364,8 @@ def plot_data(data, lat, lon, units, case, plot_type): try: # Load the necessary plotting libraries import matplotlib.pyplot as plt - import cartopy.crs as ccrs - import cartopy.feature as cfeature + from mpl_toolkits.basemap import Basemap + from mpl_toolkits.axes_grid1 import make_axes_locatable except ImportError: logger.warning('Error loading necessary Python modules in plot_data function') return @@ -389,200 +374,87 @@ def plot_data(data, lat, lon, units, case, plot_type): import warnings warnings.filterwarnings("ignore", category=UserWarning) - # define north and south polar stereographic coord ref system - npstereo = ccrs.NorthPolarStereo(central_longitude=-90.0) # define projection - spstereo = ccrs.SouthPolarStereo(central_longitude= 90.0) # define projection - - # define figure - fig = plt.figure(figsize=[14,7]) - - # add axis for each hemishpere - ax1 = fig.add_subplot(121,projection=npstereo) - ax2 = fig.add_subplot(122,projection=spstereo) - - # set plot extents - ax1.set_extent([-180.,180.,35.,90.],ccrs.PlateCarree()) - ax2.set_extent([-180.,180.,-90.,-35.],ccrs.PlateCarree()) - - # add land features NH plot - ax1.add_feature(cfeature.LAND, color='lightgray') - ax1.add_feature(cfeature.BORDERS) - ax1.add_feature(cfeature.COASTLINE) - - # add land features SH plot - ax2.add_feature(cfeature.LAND, color='lightgray') - ax2.add_feature(cfeature.BORDERS) - ax2.add_feature(cfeature.COASTLINE) - - # add grid lines - dlon = 30.0 - dlat = 15.0 - mpLons = np.arange(-180. ,180.0+dlon,dlon) - mpLats = np.arange(-90.,90.0+dlat ,dlat) - - g1 = ax1.gridlines(xlocs=mpLons,ylocs=mpLats, - draw_labels=True, - x_inline=False,y_inline=False) - - g2 = ax2.gridlines(xlocs=mpLons,ylocs=mpLats, - draw_labels=True, - x_inline=False,y_inline=False) - - - # Specify Min/max colors for each hemisphere - # check for minus to see if it is a difference plot - if '\n- ' in case: # this is a difference plot - # specify colormap - mycmap = 'seismic' # blue,white,red with white centered colormap - - # determine max absolute value to use for color range - # intent is use same min/max with center zero - dmin = np.abs(data.min()) - dmax = np.abs(data.max()) - clim = np.max([dmin,dmax]) - - # this specifies both hemishperes the same range. - cminNH = -clim - cmaxNH = clim - cminSH = -clim - cmaxSH = clim - - else: # not a difference plot - # specify colormap - mycmap = 'jet' - - # arbitrary limits for each Hemishpere - cminNH = 0.0 - cmaxNH = 5.0 - cminSH = 0.0 - cmaxSH = 2.0 + # Create the figure and axis + fig, axes = plt.subplots(nrows=1, ncols=2,figsize=(14, 8)) + + # Plot the northern hemisphere data as a scatter plot + # Create the basemap, and draw boundaries + plt.sca(axes[0]) + m = Basemap(projection='npstere', boundinglat=35,lon_0=270, resolution='l') + m.drawcoastlines() + m.fillcontinents() + m.drawcountries() if plot_type == 'scatter': - # plot NH - scNH = ax1.scatter(lon,lat,c=data,cmap=mycmap,s=4,edgecolors='none', - vmin=cminNH, vmax=cmaxNH, - transform=ccrs.PlateCarree()) - - # plot SH - scSH = ax2.scatter(lon,lat,c=data,cmap=mycmap,s=4,edgecolors='none', - vmin=cminSH, vmax=cmaxSH, - transform=ccrs.PlateCarree()) + x, y = m(lon,lat) + sc = m.scatter(x, y, c=data, cmap='jet', lw=0, s=4) + else: + # Create new arrays to add 1 additional longitude value to prevent a + # small amount of whitespace around longitude of 0/360 degrees. + lon_cyc = np.zeros((lon.shape[0],lon.shape[1]+1)) + mask = np.zeros((data.shape[0],data.shape[1]+1)) + lat_cyc = np.zeros((lat.shape[0],lat.shape[1]+1)) + + mask[:,0:-1] = data.mask[:,:] + mask[:,-1] = data.mask[:,0] + lon_cyc[:,0:-1] = lon[:,:]; lon_cyc[:,-1] = lon[:,0] + lat_cyc[:,0:-1] = lat[:,:]; lat_cyc[:,-1] = lat[:,0] + + lon1 = np.ma.masked_array(lon_cyc, mask=mask) + lat1 = np.ma.masked_array(lat_cyc, mask=mask) + + d = np.zeros((data.shape[0],data.shape[1]+1)) + d[:,0:-1] = data[:,:] + d[:,-1] = data[:,0] + d1 = np.ma.masked_array(d,mask=mask) + + x, y = m(lon1.data, lat1.data) - else: if plot_type == 'contour': - print("contour plot depreciated. using pcolor.") - - scNH = ax1.pcolormesh(lon,lat,data,cmap=mycmap, - vmin=cminNH, vmax=cmaxNH, - transform=ccrs.PlateCarree()) - - scSH = ax2.pcolormesh(lon,lat,data,cmap=mycmap, - vmin=cminSH, vmax=cmaxSH, - transform=ccrs.PlateCarree()) - - #else: - # # Create new arrays to add 1 additional longitude value to prevent a - # # small amount of whitespace around seam - # lon_cyc = np.zeros((lon.shape[0],lon.shape[1]+1)) - # lat_cyc = np.zeros((lat.shape[0],lat.shape[1]+1)) - # data1 = np.zeros((data.shape[0],data.shape[1]+1)) - # mask = np.zeros((data.shape[0],data.shape[1]+1)) - - # mask[:,0:-1] = data.mask[:,:] - # mask[:,-1] = data.mask[:,0] - # lon_cyc[:,0:-1] = lon[:,:] - # lon_cyc[:,-1] = lon[:,0] - # lat_cyc[:,0:-1] = lat[:,:] - # lat_cyc[:,-1] = lat[:,0] - # data1[:,0:-1] = data[:,:] - # data1[:,-1] = data[:,0] - - # lon1 = np.ma.masked_array(lon_cyc, mask=mask) - # lat1 = np.ma.masked_array(lat_cyc, mask=mask) - # data1 = np.ma.masked_array(data1, mask=mask) - - # if plot_type == 'contour': - # # plotting around -180/180 and 0/360 is a challenge. - # # need to use lons in both 0-360 and +- 180 - # # make lons +/- 180 - # lon1_pm180 = np.where(lon1 < 180.0, lon1, lon1-360.0) - # lon1_pm180 = np.ma.masked_where(lon1.mask,lon1_pm180) - - # # get 90-270 lons from the lon 0-360 array (lon1) - # # note: use 91, 269 to prevent small amount of white space in contour plots - # lonmask = np.logical_or(lon1 <= 91.0,lon1 >= 269.0) - # lons_90_270 = np.ma.masked_where(lonmask,lon1) - # lats_90_270 = np.ma.MaskedArray(lat1,mask=lons_90_270.mask) - # data_90_270 = np.ma.MaskedArray(data1,mask=lons_90_270.mask) - # data_90_270.mask = np.logical_or(data1.mask,data_90_270.mask) - - # # get -92-92 lons from +/- 180 (lon1_pm180) - # # note: use 92 to prevent small amount of white space in contour plots - # lonmask = np.logical_or(lon1_pm180 <= -92.0, lon1_pm180 >= 92.0) - # lons_m90_90 = np.ma.masked_where(lonmask,lon1_pm180) - # lats_m90_90 = np.ma.MaskedArray(lat1,mask=lons_m90_90.mask) - # data_m90_90 = np.ma.MaskedArray(data1,mask=lons_m90_90.mask) - # data_m90_90.mask = np.logical_or(data1.mask,data_m90_90.mask) - - # # plot NH 90-270 - # sc = ax1.contourf(lons_90_270, lats_90_270, data_90_270, cmap=mycmap, - # transform=ccrs.PlateCarree(), - # extend='both') - # # plot NH -90-90 - # sc = ax1.contourf(lons_m90_90, lats_m90_90, data_m90_90, cmap=mycmap, - # transform=ccrs.PlateCarree(), - # extend='both') - - # # plot SH 90-270 - # sc = ax2.contourf(lons_90_270, lats_90_270, data_90_270, cmap=mycmap, - # transform=ccrs.PlateCarree(), - # extend='both') - # # plot SH -90-90 - # sc = ax2.contourf(lons_m90_90, lats_m90_90, data_m90_90, cmap=mycmap, - # transform=ccrs.PlateCarree(), - # extend='both') - - - #plt.suptitle('CICE Mean Ice Thickness\n{}'.format(case), y=0.95) - plt.suptitle(f'CICE Mean Ice Thickness\n{case:s}') - - # add more whitespace between plots for colorbar. - plt.subplots_adjust(wspace=0.4) - - # add separate axes for colorbars - # first get position/size of current axes - pos1 = ax1.get_position() - pos2 = ax2.get_position() - - # now add new colormap axes using the position ax1, ax2 as reference - cax1 = fig.add_axes([pos1.x0+pos1.width+0.03, - pos1.y0, - 0.02, - pos1.height]) - - cax2 = fig.add_axes([pos2.x0+pos2.width+0.03, - pos2.y0, - 0.02, - pos2.height]) + sc = m.contourf(x, y, d1, cmap='jet') + else: # pcolor + sc = m.pcolor(x, y, d1, cmap='jet') + m.drawparallels(np.arange(-90.,120.,15.),labels=[1,0,0,0]) # draw parallels + m.drawmeridians(np.arange(0.,420.,30.),labels=[1,1,1,1]) # draw meridians - if '\n- ' in case: - # If making a difference plot, use scientific notation for colorbar - cbNH = plt.colorbar(scNH, cax=cax1, orientation="vertical", - pad=0.1, format="%.1e") - cbSH = plt.colorbar(scSH, cax=cax2, orientation="vertical", - pad=0.1, format="%.1e") + # Plot the southern hemisphere data as a scatter plot + plt.sca(axes[1]) + m = Basemap(projection='spstere', boundinglat=-45,lon_0=270, resolution='l') + m.drawcoastlines() + m.fillcontinents() + m.drawcountries() + if plot_type == 'scatter': + x, y = m(lon,lat) + sc = m.scatter(x, y, c=data, cmap='jet', lw=0, s=4) else: - #pass - # If plotting non-difference data, do not use scientific notation for colorbar - cbNH = plt.colorbar(scNH, cax=cax1, orientation="vertical", - pad=0.1, format="%.2f") - cbSH = plt.colorbar(scSH, cax=cax2, orientation="vertical", - pad=0.1, format="%.2f") + x, y = m(lon1.data, lat1.data) + + # Bandaid for a bug in the version of Basemap used during development + outside = (x <= m.xmin) | (x >= m.xmax) | (y <= m.ymin) | (y >= m.ymax) + tmp = np.ma.masked_where(outside,d1) + + if plot_type == 'contour': + sc = m.contourf(x, y, tmp, cmap='jet') + else: # pcolor + sc = m.pcolor(x, y, tmp, cmap='jet') + + m.drawparallels(np.arange(-90.,120.,15.),labels=[1,0,0,0]) # draw parallels + m.drawmeridians(np.arange(0.,420.,30.),labels=[1,1,1,1]) # draw meridians - cbNH.set_label(units, loc='center') - cbSH.set_label(units, loc='center') + plt.suptitle('CICE Mean Ice Thickness\n{}'.format(case), y=0.95) + + # Make some room at the bottom of the figure, and create a colorbar + fig.subplots_adjust(bottom=0.2) + cbar_ax = fig.add_axes([0.11,0.1,0.8,0.05]) + if '\n- ' in case: + # If making a difference plot, use scientific notation for colorbar + cb = plt.colorbar(sc, cax=cbar_ax, orientation="horizontal", format="%.2e") + else: + # If plotting non-difference data, do not use scientific notation for colorbar + cb = plt.colorbar(sc, cax=cbar_ax, orientation="horizontal", format="%.2f") + cb.set_label(units, x=1.0) outfile = 'ice_thickness_{}.png'.format(case.replace('\n- ','_minus_')) logger.info('Creating map of the data ({})'.format(outfile)) @@ -602,8 +474,7 @@ def plot_two_stage_failures(data, lat, lon): logger.info('Creating map of the failures (two_stage_test_failure_map.png)') # Load the necessary plotting libraries import matplotlib.pyplot as plt - import cartopy.crs as ccrs - import cartopy.feature as cfeature + from mpl_toolkits.basemap import Basemap from mpl_toolkits.axes_grid1 import make_axes_locatable from matplotlib.colors import LinearSegmentedColormap @@ -611,19 +482,15 @@ def plot_two_stage_failures(data, lat, lon): import warnings warnings.filterwarnings("ignore", category=UserWarning) - # Create the figure + # Create the figure and axis fig = plt.figure(figsize=(12, 8)) - - # define plot projection and create axis - pltprj = ccrs.Mollweide(central_longitude=0.0) - ax = fig.add_subplot(111,projection=pltprj) - - # add land - ax.add_feature(cfeature.LAND, color='lightgray') - ax.add_feature(cfeature.BORDERS) - ax.add_feature(cfeature.COASTLINE) - #gshhs = cfeature.GSHHSFeature(scale='auto',facecolor='lightgray',edgecolor='none') - #ax.add_feature(gshhs) + ax = fig.add_axes([0.05, 0.08, 0.9, 0.9]) + + # Create the basemap, and draw boundaries + m = Basemap(projection='moll', lon_0=0., resolution='l') + m.drawmapboundary(fill_color='white') + m.drawcoastlines() + m.drawcountries() # Create the custom colormap colors = [(0, 0, 1), (1, 0, 0)] # Blue, Red @@ -631,20 +498,11 @@ def plot_two_stage_failures(data, lat, lon): cm = LinearSegmentedColormap.from_list(cmap_name, colors, N=2) # Plot the data as a scatter plot - sc = ax.scatter(lon,lat,c=int_data,cmap=cm,s=4,lw=0, - vmin=0.,vmax=1., - transform=ccrs.PlateCarree()) - - # add grid lines - dlon = 60.0 - dlat = 30.0 - mpLons = np.arange(-180. ,180.0+dlon,dlon) - mpLats = np.arange(-90.,90.0+dlat ,dlat) - mpLabels = {"left": "y", - "bottom": "x"} - - ax.gridlines(xlocs=mpLons,ylocs=mpLats, - draw_labels=mpLabels) + x, y = m(lon, lat) + sc = m.scatter(x, y, c=int_data, cmap=cm, lw=0, vmin=0, vmax=1, s=4) + + m.drawmeridians(np.arange(0, 360, 60), labels=[0, 0, 0, 1], fontsize=10) + m.drawparallels(np.arange(-90, 90, 30), labels=[1, 0, 0, 0], fontsize=10) plt.title('CICE Two-Stage Test Failures') diff --git a/doc/source/cice_index.rst b/doc/source/cice_index.rst index 4e949b28c..c32f1cdbf 100644 --- a/doc/source/cice_index.rst +++ b/doc/source/cice_index.rst @@ -577,7 +577,7 @@ either Celsius or Kelvin units). "strairx(y)", "stress on ice by air in the x(y)-direction (centered in U cell)", "N/m\ :math:`^2`" "strairx(y)T", "stress on ice by air, x(y)-direction (centered in T cell)", "N/m\ :math:`^2`" "strax(y)", "wind stress components from data", "N/m\ :math:`^2`" - "strength", "ice strength (pressure)", "N/m" + "strength", "ice strength", "N/m" "stress12", "internal ice stress, :math:`\sigma_{12}`", "N/m" "stressm", "internal ice stress, :math:`\sigma_{11}-\sigma_{22}`", "N/m" "stressp", "internal ice stress, :math:`\sigma_{11}+\sigma_{22}`", "N/m" diff --git a/doc/source/conf.py b/doc/source/conf.py index 0e7ce0886..8d0df9777 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -38,9 +38,6 @@ 'sphinxcontrib.bibtex', ] -# Name of the bibliography file for sphinxcontrib.bibtex. -bibtex_bibfiles = ['master_list.bib'] - # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -57,7 +54,7 @@ # General information about the project. project = u'CICE' -copyright = u'2023, Triad National Security, LLC (code) and National Center for Atmospheric Research (documentation)' +copyright = u'2020, Triad National Security, LLC (code) and National Center for Atmospheric Research (documentation)' author = u'CICE-Consortium' # The version info for the project you're documenting, acts as replacement for @@ -65,9 +62,9 @@ # built documents. # # The short X.Y version. -version = u'6.5.0' +version = u'6.1.3' # The full version, including alpha/beta/rc tags. -version = u'6.5.0' +version = u'6.1.3' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/doc/source/developer_guide/dg_dynamics.rst b/doc/source/developer_guide/dg_dynamics.rst index 2c886a95f..3551763b5 100644 --- a/doc/source/developer_guide/dg_dynamics.rst +++ b/doc/source/developer_guide/dg_dynamics.rst @@ -6,17 +6,17 @@ Dynamics ============================ -The CICE **cicecore/** directory consists of the non icepack source code. Within that +The CICE **cicecore/** directory consists of the non icepack source code. Within that directory there are the following subdirectories -**cicecore/cicedyn/analysis** contains higher level history and diagnostic routines. +**cicecore/cicedynB/analysis** contains higher level history and diagnostic routines. -**cicecore/cicedyn/dynamics** contains all the dynamical evp, eap, and transport routines. +**cicecore/cicedynB/dynamics** contains all the dynamical evp, eap, and transport routines. -**cicecore/cicedyn/general** contains routines associated with forcing, flux calculation, +**cicecore/cicedynB/general** contains routines associated with forcing, flux calculation, initialization, and model timestepping. -**cicecore/cicedyn/infrastructure** contains most of the low-level infrastructure associated +**cicecore/cicedynB/infrastructure** contains most of the low-level infrastructure associated with communication (halo updates, gather, scatter, global sums, etc) and I/O reading and writing binary and netcdf files. @@ -29,20 +29,112 @@ coupling layers. Dynamical Solvers -------------------- -The dynamics solvers are found in **cicecore/cicedyn/dynamics/**. A couple of different solvers are -available including EVP, EAP and VP. The dynamics solver is specified in namelist with the -``kdyn`` variable. ``kdyn=1`` is evp, ``kdyn=2`` is eap, ``kdyn=3`` is VP. +The dynamics solvers are found in **cicecore/cicedynB/dynamics/**. A couple of different solvers are +available including EVP, revised EVP, and EAP. The dynamics solver is specified in namelist with the +``kdyn`` variable. ``kdyn=1`` is evp, ``kdyn=2`` is eap, and revised evp requires the ``revised_evp`` +namelist flag be set to true. -Two alternative implementations of EVP are included. The first alternative is the Revised EVP, triggered when the ``revised_evp`` is set to true. The second alternative is the 1d EVP solver triggered when the ``evp_algorithm`` is set to ``shared_mem_1d`` as oppose to the default setting of ``evp_standard_2d``. The solutions with ``evp_algorithm`` set to ``standard_2d`` or ``shared_mem_1d`` will -not be bit-for-bit identical when compared to each other. The reason for this is floating point round off errors that occur unless strict compiler flags are used. ``evp_algorithm=shared_mem_1d`` is primarily built for OpenMP. If MPI domain splitting is used then the solver will only run on the master processor. ``evp_algorithm=shared_mem_1d`` is not supported -with the tripole grid. +Multiple evp solvers are supported thru the namelist flag ``kevp_kernel``. The standard implementation +and current default is ``kevp_kernel=0``. In this case, the stress is solved on the regular decomposition +via subcycling and calls to subroutine stress and subroutine stepu with MPI global sums required in each +subcycling call. With ``kevp_kernel=2``, the data required to compute the stress is gathered to the root +MPI process and the stress calculation is performed on the root task without any MPI global sums. OpenMP +parallelism is supported in ``kevp_kernel=2``. The solutions with ``kevp_kernel`` set to 0 or 2 will +not be bit-for-bit +identical but should be the same to roundoff and produce the same climate. ``kevp_kernel=2`` may perform +better for some configurations, some machines, and some pe counts. ``kevp_kernel=2`` is not supported +with the tripole grid and is still being validated. Until ``kevp_kernel=2`` is fully validated, it will +abort if set. To override the abort, use value 102 for testing. Transport ----------------- -The transport (advection) methods are found in **cicecore/cicedyn/dynamics/**. Two methods are supported, -upwind and remap. These are set in namelist via the ``advection`` variable. -Transport can be disabled with the ``ktransport`` namelist variable. +The transport (advection) methods are found in **cicecore/cicedynB/dynamics/**. Only the incremental +remapping method is supported at this time, and is set in namelist via the ``advection`` variable. +Transport can be turned off by setting ``advection = none`` or ``ktransport = -1``. +Infrastructure +======================= + +Kinds +------------------ + +**cicecore/shared/ice_kinds_mod.F90** defines the kinds datatypes used in CICE. These kinds are +used throughout CICE code to define variable types. The CICE kinds are adopted from the kinds +defined in Icepack for consistency in interfaces. + +Constants +------------------ + +**cicecore/shared/ice_constants.F90** defines several model constants. Some are hardwired parameters +while others have internal defaults and can be set thru namelist. + +Dynamic Array Allocation +------------------------------- + +CICE v5 and earlier was implemented using mainly static arrays and required several CPPs to be set to define grid size, +blocks sizes, tracer numbers, and so forth. With CICE v6 and later, arrays are dynamically allocated and those +parameters are namelist settings. The following CPPs are no longer used in CICE v6 and later versions, + + -DNXGLOB=100 -DNYGLOB=116 -DBLCKX=25 -DBLCKY=29 -DMXBLCKS=4 -DNICELYR=7 -DNSNWLYR=1 -DNICECAT=5 -DTRAGE=1 -DTRFY=1 -DTRLVL=1 -DTRPND=1 -DTRBRI=0 -DNTRAERO=1 -DTRZS=0 -DNBGCLYR=7 -DTRALG=0 -DTRBGCZ=0 -DTRDOC=0 -DTRDOC=0 -DTRDIC=0 -DTRDON=0 -DTRFED=0 -DTRFEP=0 -DTRZAERO=0 -DTRBGCS=0 -DNUMIN=11 -DNUMAX=99 + +as they have been migrated to :ref:`tabnamelist` + + nx_global, ny_global, block_size_x, block_size_y, max_blocks, nilyr, nslyr, ncat, nblyr, n_aero, n_zaero, n_algae, n_doc, n_dic, n_don, n_fed, n_fep, numin, numax + + +Time Manager +------------------ + +Time manager data is module data in **cicecore/shared/ice_calendar.F90**. Much of the time manager +data is public and operated on during the model timestepping. The model timestepping actually takes +place in the **CICE_RunMod.F90** file which is part of the driver code and tends to look like this:: + + call ice_step + istep = istep + 1 ! update time step counters + istep1 = istep1 + 1 + time = time + dt ! determine the time and date + + + +Communication +------------------ + +Two low-level communications packages, mpi and serial, are provided as part of CICE. This software +provides a middle layer between the model and the underlying libraries. Only the CICE mpi or +serial directories are compiled with CICE, not both. + +**cicedynB/infrastructure/comm/mpi/** +is based on MPI and provides various methods to do halo updates, global sums, gather/scatter, broadcasts +and similar using some fairly generic interfaces to isolate the MPI calls in the code. + +**cicedynB/infrastructure/comm/serial/** support the same interfaces, but operates +in shared memory mode with no MPI. The serial library will be used, by default in the CICE scripts, +if the number of MPI tasks is set to 1. The serial library allows the model to be run on a single +core or with OpenMP parallelism only without requiring an MPI library. + +I/O +------------------ + +There are three low-level IO packages in CICE, io_netcdf, io_binary, and io_pio. This software +provides a middle layer between the model and the underlying IO writing. +Only one of the three IO directories can be built with CICE. The CICE scripts will build with the io_netcdf +by default, but other options can be selecting by setting ``ICE_IOTYPE`` in **cice.settings** in the +case. This has to be set before CICE is built. + +**cicedynB/infrastructure/io/io_netcdf/** is the +default for the standalone CICE model, and it supports writing history and restart files in netcdf +format using standard netcdf calls. It does this by writing from and reading to the root task and +gathering and scattering fields from the root task to support model parallelism. + +**cicedynB/infrastructure/io/io_binary/** supports files in binary format using a gather/scatter +approach and reading to and writing from the root task. + +**cicedynB/infrastructure/io/io_pio/** support reading and writing through the pio interface. pio +is a parallel io library (https://github.com/NCAR/ParallelIO) that supports reading and writing of +binary and netcdf file through various interfaces including netcdf and pnetcdf. pio is generally +more parallel in memory even when using serial netcdf than the standard gather/scatter methods, +and it provides parallel read/write capabilities by optionally linking and using pnetcdf. + diff --git a/doc/source/science_guide/sg_horiztrans.rst b/doc/source/science_guide/sg_horiztrans.rst index 4ccf00e9b..2cca81469 100644 --- a/doc/source/science_guide/sg_horiztrans.rst +++ b/doc/source/science_guide/sg_horiztrans.rst @@ -33,7 +33,7 @@ introductory comments in **ice\_transport\_remap.F90**. Prognostic equations for ice and/or snow density may be included in future model versions but have not yet been implemented. -Two transport schemes are available: upwind and the incremental +One transport scheme is available, the incremental remapping scheme of :cite:`Dukowicz00` as modified for sea ice by :cite:`Lipscomb04`. diff --git a/doc/source/user_guide/ug_case_settings.rst b/doc/source/user_guide/ug_case_settings.rst index 550162515..032c8b529 100644 --- a/doc/source/user_guide/ug_case_settings.rst +++ b/doc/source/user_guide/ug_case_settings.rst @@ -358,13 +358,13 @@ dynamics_nml "", "", "", "" "``advection``", "``remap``", "linear remapping advection scheme", "``remap``" - "", "``upwind``", "donor cell advection", "" + "", "``none``", "advection off", "" "``alphab``", "real", ":math:`\alpha_{b}` factor in :cite:`Lemieux16`", "20.0" "``arlx``", "real", "revised_evp value", "300.0" "``brlx``", "real", "revised_evp value", "300.0" "``basalstress``", "logical", "use basal stress parameterization for landfast ice", "``.false.``" "``Cf``", "real", "ratio of ridging work to PE change in ridging", "17.0" - "``coriolis``", "``constant``", "constant coriolis value = 1.46e-4", "``latitude``" + "``coriolis``", "``constant``", "constant coriolis value = 1.46e-4 s\ :math:`^{-1}`", "``latitude``" "", "``latitude``", "coriolis variable by latitude", "" "", "``zero``", "zero coriolis", "" "``Cstar``", "real", "constant in Hibler strength formula", "20" diff --git a/doc/source/user_guide/ug_testing.rst b/doc/source/user_guide/ug_testing.rst index 4545cfb60..bea67e6ae 100644 --- a/doc/source/user_guide/ug_testing.rst +++ b/doc/source/user_guide/ug_testing.rst @@ -228,7 +228,7 @@ boundary around the entire domain. It includes the following namelist modificat - ``dxrect``: ``16.e5`` cm - ``dyrect``: ``16.e5`` cm - ``ktherm``: ``-1`` (disables thermodynamics) -- ``coriolis``: ``zero`` (zero coriolis force) +- ``coriolis``: ``constant`` (``f=1.46e-4`` s\ :math:`^{-1}`) - ``ice_data_type`` : ``box2001`` (special ice concentration initialization) - ``atm_data_type`` : ``box2001`` (special atmospheric and ocean forcing)