Scheduled Downtime
On Tuesday 24 October 2023 @ 5pm MT the forums will be in read only mode in preparation for the downtime. On Wednesday 25 October 2023 @ 5am MT, this website will be down for maintenance and expected to return online later in the morning.
Normal Operations
The forums are back online with normal operations. If you notice any issues or errors related to the forums, please reach out to help@ucar.edu

Why does salinity decrease to negative values in ocean only run ?

Dear sir/miss,

I am working on a project in which we do paleo simulations (for the Late Cretaceous) with CCSM3. We are trying to get the ocean in an equilibrium state by first doing a coupled run of 50 years. We then use mean values of the last 10 years of this run to drive an ocean only run (pop, datm, dlnd, dice, cpl) for about 1000 years. Then we couple for 50 years again, decouple etc.

The results of the coupled part are fine. However once we uncouple and
run ocean only, the SALT in the upper layers decreases fast. At some places
it drops 5 PSU in 5 years !!!! Within 200 years the salt even becomes negative!

You would think that the model should stop when negative values arise
(because what do negative values mean ?) but it doesn't. I found out that this is caused by the fact that we use state_range_opt = 'enforce' in the pop_in namelist. With this setting the model does check if SALT is negative (in state_mod.F90) but if this is true it ignores this and just uses a SALT value of zero throughout the rest of the code (e.g. for the calculation of the density in the equation of state etc.)

Furthermore I checked if the forcing files (= last 10 year average coupled run)
in the datamodels (dlnd, dice, datm) are correct and they look fine as far as the freshwater budget terms are concerned (runoff, precipitation, evaporation)

I hope that there are people who can give us some advise for our problem
because we really don't know what to do at the moment. Some people say that the salt will come back once we couple again after the 1000 years ocean only run but we don't understand how this will ever get us in an equilibrium state ? Is there someone who can help us out ?

Thank's for your time

Kind regards,
Michael Kliphuis


Here's some more information:


1.
I am very interested in the parameters that we should use. For instance
for our run we used sfwf_formulation = 'restoring' but on this forum I found
the following quote:

"Running ocean-standalone experiments in the CCSM context (compset "C"
integrations) requires use of the 'partially-coupled' option for sfwf
and shf_formulation. This configuration of CCSM3 is unsupported and
requires significant expertise to run correctly."

2.
Should we (in order to keep salt stable) use the two modifications on the
freshwaterflux that are discussed in the article
"The NCAR Climate System Model Global Ocean Component" of Peter Gent et all

http://ams.allenpress.com/perlserv/.../1520-0442(1998)011<1287:TNCSMG>2.0.CO;2&ct=1

And does this mean I should set:

lsend_precip_fact = .true.
ladjust_precip = .true. ?

Below are some extracts from this article:

"In POP only (CCSM3) runs, the freshwater surface flux needs to have a
term that restores to observations in order to keep the salinity field
stable, but the coefficient is quite small"

"The net ocean freshwater flux requires an estimate of precipitation.
Monthly estimates were computed from the Microwave Sounding Unit (MSU)
data; see Spencer (1993). There is considerable uncertainty in these
estimates and the equilibrium values of sea surface salinity are very
sensitive to the forcing because it has no local feedback on the
freshwater flux. To overcome this, we allowed two modifications to the
freshwater flux. The first was to multiply the precipitation P by a
factor, f, that made the globally averaged P balance the globally
averaged evaporation E. The second was to have a local restoring term to
observed salinity that has zero global mean and as long a restoring
timescale as possible. Thus the open-ocean freshwater flux is given by:
....etc."


3. I can only put 10000 characters in this thread so I will put the pop_in parameters that we use in a subthread.
 
Here the pop_in namelist parameters that we used:

&io_nml
num_iotasks = 4
lredirect_stdout = .true.
log_filename = 'ocn.log.071126-170030'
luse_pointer_files = .true.
pointer_filename = 'rpointer.ocn'
/

&time_manager_nml
runid = 'maastocn1'
time_mix_opt = 'avgfit'
time_mix_freq = 17
dt_option = 'steps_per_day'
dt_count = 48
impcor = .true.
laccel = .false.
accel_file = 'depth_accel'
dtuxcel = 1.0
allow_leapyear = .false.
iyear0 = 57
imonth0 = 1
iday0 = 2
ihour0 = 0
iminute0 = 0
isecond0 = 0
date_separator = '-'
stop_option = 'nyear'
stop_count = 1000
fit_freq = 1
/

&grid_nml
horiz_grid_opt = 'file'
horiz_grid_file = 'horiz_grid'
vert_grid_opt = 'file'
vert_grid_file = 'vert_grid'
topography_opt = 'file'
topography_file = 'topography'
topo_smooth = .false.
flat_bottom = .false.
lremove_points = .false.
region_mask_filename =region_mask'
region_info_filename = 'region_ids'
sfc_layer_opt = 'varthick'
/

&init_ts_nml
init_ts_option = 'continue'
init_ts_file = '/archive/chaldijk/ccsm3/exe/maastocn1/ocn/input/ts'
/

&diagnostics_nml
diag_global_freq_opt = 'nmonth'
diag_global_freq = 1
diag_cfl_freq_opt = 'nmonth'
diag_cfl_freq = 1
diag_transp_freq_opt = 'nmonth'
diag_transp_freq = 1
diag_transport_file = '/archive/chaldijk/ccsm3/exe/maastocn1/ocn/input/transport_contents'
diag_outfile = '/archive/chaldijk/ccsm3/exe/maastocn1/ocn/hist/maastocn1.pop.dd'
diag_transport_outfile = '/archive/chaldijk/ccsm3/exe/maastocn1/ocn/hist/maastocn1.pop.dt'
cfl_all_levels = .false.
diag_all_levels = .false.
/

&budget_diagnostics_nml
ldiag_global_tracer_budgets = .true.
/

&restart_nml
runtime_arch = 'IBM'
restart_freq_opt = 'nmonth'
restart_freq = 1
restart_outfile = '/archive/chaldijk/ccsm3/exe/maastocn1/ocn/rest/maastocn1.pop.r'
leven_odd_on = .false.
even_odd_freq = 100000
pressure_correction = .false.
/

&tavg_nml
tavg_freq_opt = 'nmonth'
tavg_freq = 1
tavg_start_opt = 'nstep'
tavg_start = 1
tavg_infile = '/archive/chaldijk/ccsm3/exe/maastocn1/ocn/hist/maastocn1.pop.hrestart.end'
tavg_outfile = '/archive/chaldijk/ccsm3/exe/maastocn1/ocn/hist/maastocn1.pop.h'
tavg_contents = '/archive/chaldijk/ccsm3/exe/maastocn1/ocn/input/tavg_contents'
ltavg_use_ncdf = .true.
debug_ncdf = .false.
/

&scalar_nml
scalar_contents = '/archive/chaldijk/ccsm3/exe/maastocn1/ocn/input/scalar_contents'
/

&history_nml
history_freq_opt = 'never'
history_freq = 1
history_outfile = '/archive/chaldijk/ccsm3/exe/maastocn1/ocn/hist/maastocn1.pop.hs'
history_contents = '/archive/chaldijk/ccsm3/exe/maastocn1/ocn/input/history_contents'
lhistory_use_ncdf = .true.
/

&movie_nml
movie_freq_opt = 'never'
movie_freq = 1
movie_outfile = '/archive/chaldijk/ccsm3/exe/maastocn1/ocn/hist/maastocn1.pop.hm'
movie_contents = '/archive/chaldijk/ccsm3/exe/maastocn1/ocn/input/movie_contents'
/

&solver_nml
solv_convrg = 1.0e-13
solv_max_iters = 1000
solv_ncheck = 10
lprecond = .false.
solv_type = 'cg1'
precond_file = 'empty'
/

&vertical_mix_nml
vmix_choice = 'kpp'
aidif = 1.0
bottom_drag = 1.0e-3
bottom_heat_flx = 0.0
bottom_heat_flx_depth = 1000.0e2
/

&vmix_const_nml
const_vvc = 0.25
const_vdc = 0.25
/

&vmix_rich_nml
bckgrnd_vvc = 1.0
bckgrnd_vdc = 0.1
rich_mix = 50.0
/

&vmix_kpp_nml
bckgrnd_vdc1 = 0.55
bckgrnd_vdc2 = 0.303615
bckgrnd_vdc_dpth= 2500.0e02
bckgrnd_vdc_linv= 4.5e-05
Prandtl = 10.0
rich_mix = 50.0
lrich = .true.
ldbl_diff = .false.
lshort_wave = .true.
lcheckekmo = .false.
num_v_smooth_Ri = 1
/

&advect_nml
tadvect_ctype = 'standard'
/

&hmix_nml
hmix_momentum_choice = 'anis'
hmix_tracer_choice = 'gent'
lauto_hmix = .false.
lvariable_hmix = .false.
ah = 0.8e7
am = 3.e9
/

&hmix_gm_nml
kappa_choice = 'constant'
slope_control_choice = 'notanh'
kappa_depth_1 = 1.0
kappa_depth_2 = 0.0
kappa_depth_scale = 150000.0
ah_bolus = 0.8e7
ah_bkg = 0.0
slm_r = 0.3
slm_b = 0.3
gm_bolus = .false.
/

&hmix_aniso_nml
hmix_alignment_choice = 'east'
lvariable_hmix_aniso = .true.
lsmag_aniso = .false.
visc_para = 1.0
visc_perp = 1.0
c_para = 0.0
c_perp = 0.0
u_para = 0.0
u_perp = 0.0
vconst_1 = 1.0e7
vconst_2 = 24.5
vconst_3 = 0.2
vconst_4 = 1.0e-8
vconst_5 = 3
vconst_6 = 1.0e7
horz_viscosity_outfile = '/archive/chaldijk/ccsm3/exe/maastocn1/ocn/hist/maastocn1.pop.hv'
/

&state_nml
state_choice = 'mwjf'
state_file = '/archive/chaldijk/ccsm3/exe/maastocn1/ocn/input/eos_coefficients'
state_range_opt = 'enforce'
state_range_freq = 100000
/

&baroclinic_nml
reset_to_freezing = .false.
/

&ice_nml
ice_freq_opt = 'coupled'
ice_freq = 100000
kmxice = 1
lactive_ice = .true.
/

&pressure_grad_nml
lpressure_avg = .true.
lbouss_correct = .false.
/

&convection_nml
convection_type = 'diffusion'
nconvad = 2
convect_diff = 1000.0
convect_visc = 1000.0
/

&topostress_nml
ltopostress = .false.
/

&xdisplay_nml
lxdisplay = .false.
nstep_xdisplay = 1
/

&forcing_ws_nml
ws_data_type = 'none'
ws_data_inc = 24.
ws_interp_freq = 'every-timestep'
ws_interp_type = 'linear'
ws_interp_inc = 72.
ws_filename = 'unknown-ws'
ws_data_renorm(1) = 10.
/

&forcing_shf_nml
shf_formulation = 'restoring'
shf_data_type = 'none'
shf_data_inc = 24.
shf_interp_freq = 'every-timestep'
shf_interp_type = 'linear'
shf_interp_inc = 72.
shf_restore_tau = 30.
shf_filename = 'unknown-shf'
shf_data_renorm(3) = 0.94
shf_weak_restore = 0.
shf_strong_restore = 92.64
luse_cpl_ifrac = .false.
shf_strong_restore_ms= 92.64
/

&forcing_sfwf_nml
sfwf_formulation = 'restoring'
sfwf_data_type = 'none'
sfwf_data_inc = 24.
sfwf_interp_freq = 'every-timestep'
sfwf_interp_type = 'linear'
sfwf_interp_inc = 72.
sfwf_restore_tau = 30.
sfwf_filename = 'unknown-sfwf'
sfwf_data_renorm(1) = 0.001
sfwf_weak_restore = 0.092
sfwf_strong_restore = 0.6648
sfwf_strong_restore_ms = 0.6648
ladjust_precip = .false.
lms_balance = .true.
lfw_as_salt_flx = .true.
lsend_precip_fact = .false.
/

&forcing_pt_interior_nml
pt_interior_data_type = 'none'
pt_interior_data_inc = 24.
pt_interior_interp_freq = 'every-timestep'
pt_interior_interp_type = 'linear'
pt_interior_interp_inc = 72.
pt_interior_restore_tau = 365.
pt_interior_filename = 'unknown-pt_interior'
pt_interior_restore_max_level = 0
pt_interior_formulation = 'restoring'
pt_interior_data_renorm(1) = 1.
pt_interior_variable_restore = .false.
pt_interior_restore_filename = 'unknown-pt_interior_restore'
/

&forcing_s_interior_nml
s_interior_data_type = 'none'
s_interior_data_inc = 24.
s_interior_interp_freq = 'every-timestep'
s_interior_interp_type = 'linear'
s_interior_interp_inc = 72.
s_interior_restore_tau = 365.
s_interior_filename = 'unknown-s_interior'
s_interior_restore_max_level = 0
s_interior_formulation = 'restoring'
s_interior_data_renorm(1) = 1.
s_interior_variable_restore = .false.
s_interior_restore_filename = 'unknown-s_interior_restore'
/

&forcing_ap_nml
ap_data_type = 'none'
ap_data_inc = 1.e20
ap_interp_freq = 'never'
ap_interp_type = 'nearest'
ap_interp_inc = 1.e20
ap_filename = 'unknown-ap'
ap_data_renorm(1) = 1.
/

&coupled_nml
coupled_freq_opt = 'nday'
coupled_freq = 1
qsw_diurnal_cycle = .true.
/


&sw_absorption_nml
sw_absorption_type = 'jerlov'
chl_filename = 'unknown-chl'
jerlov_water_type = 3
/
The present code makes assumptions about the region boundaries, so
DO NOT change transport_reg2_names unless you know exactly what you are doing.
&transports_nml
lat_aux_grid_type = 'southern'
lat_aux_begin = -90.0
lat_aux_end = 90.0
n_lat_aux_grid = 180
moc = .false.
n_heat_trans = .false.
n_salt_trans = .false.
transport_reg2_names = 'Atlantic Ocean',
'Labrador Sea',
'GIN Sea',
'Arctic Ocean',
'Hudson Bay'
/

&passive_tracers_on_nml
iage_on = .true.
/

&iage_nml
init_iage_option = 'continue'
/
 
Top