| 1 |
ifenty |
1.1 |
I went through the seaice_*_if.F codes in the repository and made some updates to seaice_budget_ice_if.F and seaice_growth_if.F, brought the code into spec as per Jean-Michel's suggestions (remove unnecessary overlaps, send myIter and myThid to seaice_budget_ice, removed seaice_budget_ocean_if.F, etc.), and clarified most of the comments/in line documentation. |
| 2 |
|
|
|
| 3 |
|
|
In addition, I configured two verification-type setups. The first is a modification of the existing verification/lab sea setup and the other is basically a 1-D column. In both one can run forward and adjoint calculations to compare |
| 4 |
|
|
|
| 5 |
|
|
If you have the time, please look at the code updates or try them in one of your setups. I would like to know if you find any problems. |
| 6 |
|
|
|
| 7 |
|
|
The verification experiments and code updates can be found in the /MITgcm_contrib/ifenty/Fenty_Thermo_Code_Updates |
| 8 |
|
|
|
| 9 |
|
|
Code updates (which include changes to SEAICE_PARAM.h, seaice_readparams.F, and seaice_summary.F), are found in the directory code_updates. |
| 10 |
|
|
|
| 11 |
|
|
===== Verification Experiments ===== |
| 12 |
|
|
|
| 13 |
|
|
The lab sea verification setup is found in code_20x16_verification_experiment and input_20x16_verification_experiment while the the 1d colum is in code_1D_verification_experiment and input_1D_verification_experiment. In addition, there are code_XXX_variation_1 in which the default thermodynamic codes are used instead. |
| 14 |
|
|
|
| 15 |
|
|
The 1D setup uses a vertical T,S profile from the central Arctic that An made and atmospheric forcing which is similar to the Labrador Sea. Using the default thermo code, the adjoint NaN's in a run over 11,000 time steps. |
| 16 |
|
|
|
| 17 |
|
|
Since the handling of salt in the salt plume is somewhat different between the default and _if codes, useSalt_PLUME is set to false by default in data.pkg to faciliate comparison between the _if and default codes. |
| 18 |
|
|
Note: regardless of which thermodynamic ice codes are used, the adjoint run loops enlessly unless SEAICE_ALLOW_DYNAMICS is defined, for reasons which are not clear to me. |
| 19 |
|
|
|
| 20 |
|
|
|
| 21 |
|
|
===== Major code changes/thoughts ===== |
| 22 |
|
|
|
| 23 |
|
|
1) Ocean-ice heat fluxes |
| 24 |
|
|
2) salt plume |
| 25 |
|
|
3) ice salinity |
| 26 |
|
|
4) ice age |
| 27 |
|
|
|
| 28 |
|
|
=== Ocean-ice heat fluxes === |
| 29 |
|
|
|
| 30 |
|
|
Now the model can use two alternative schemes to |
| 31 |
|
|
calculate turbulent ocean-ice heat fluxes. |
| 32 |
|
|
Each is described in turn |
| 33 |
|
|
|
| 34 |
|
|
= METHOD 1 = |
| 35 |
|
|
|
| 36 |
|
|
The first uses an empircal relationship between the |
| 37 |
|
|
'far-field' ocean temperature and ocean to sea ice turbulent heat fluxes |
| 38 |
|
|
given by McPhee: |
| 39 |
|
|
|
| 40 |
|
|
Flux = rho_sw * cp_sw * <w'T'> |
| 41 |
|
|
<w'T'>= S_t * u_star * (T_o - T_f) |
| 42 |
|
|
|
| 43 |
|
|
Where, |
| 44 |
|
|
rho_sw : seawater density (kg m^-3) |
| 45 |
|
|
cp_sw : seawater heat capcity (J kg^-1 K^-1) |
| 46 |
|
|
S_t : Stanton Number ~ 0.0056 (dimensionless) |
| 47 |
|
|
u_star : friction velocity beneath ice ~ 0.015 m s^-1 |
| 48 |
|
|
T_o, T_f : The 'far-field' ocean temperature and ice |
| 49 |
|
|
freezing point (deg C) |
| 50 |
|
|
|
| 51 |
|
|
Using typical values, ice advected over waters warmer by 1 degree |
| 52 |
|
|
will be subjected to a basal heat flux of ~ 345 W m^-2. |
| 53 |
|
|
|
| 54 |
|
|
In the model, the criteria for ice growth is that the air-sea |
| 55 |
|
|
heat loss must exceed the potential ocean-ice heat flux (i.e., more |
| 56 |
|
|
potential ice production over one time step than melt). |
| 57 |
|
|
Using the above parameterization, ice will form in waters which |
| 58 |
|
|
are much warmer than its salinity-determined freezing point |
| 59 |
|
|
using typical wintertime conditions in, say, the North Atlantic. |
| 60 |
|
|
|
| 61 |
|
|
Therefore, when no ice is present, an additional factor is applied |
| 62 |
|
|
to the above <w'T'> (mixedLayerTurbulenceFactor) to represent the idea that |
| 63 |
|
|
turbulent mixing at and near the surface of an ice-free ocean |
| 64 |
|
|
is much greater than mixing beneath an ice-covered one. |
| 65 |
|
|
|
| 66 |
|
|
A factor of 12.5 is chosen for mixedLayerTurbulenceFactor. Consequently, |
| 67 |
|
|
for each 0.1 degree above freezing of the upper ocean grid cell, |
| 68 |
|
|
the air-sea heat losses must exceed ~ 515 W m^-2 before ice forms. |
| 69 |
|
|
|
| 70 |
|
|
Once ice gains a foothold in a grid cell, the McPhee parameterization |
| 71 |
|
|
is immediately invoked. |
| 72 |
|
|
|
| 73 |
|
|
= METHOD 2 = |
| 74 |
|
|
|
| 75 |
|
|
The second scheme (the original version) |
| 76 |
|
|
subsumes (S_t * u_star) into a single variable (SEAICE_gamma_t) |
| 77 |
|
|
in the following way: |
| 78 |
|
|
|
| 79 |
|
|
Flux = rho_sw * cp_sw * GAMMA |
| 80 |
|
|
GAMMA = dRf(1)/SEAICE_gamma_t * (T_o - T_f) |
| 81 |
|
|
|
| 82 |
|
|
Where, |
| 83 |
|
|
dRf(1) : depth of surface level grid cell (originally |
| 84 |
|
|
assumed to be 10 m) |
| 85 |
|
|
SEAICE_gamma_t : an empirical parameter (~ 3 days in seconds) |
| 86 |
|
|
|
| 87 |
|
|
Using typical values, ice advected into a grid cell |
| 88 |
|
|
that is warmer than the sea ice freezing point by 1 degree |
| 89 |
|
|
will be subjected to a basal heat flux of ~ 160 W m^-2. Therefore, |
| 90 |
|
|
as written, one should choose a SEAICE_gamma_t = 1.4 days in seconds |
| 91 |
|
|
to have flux magnitudes match those of the McPhee parameterization. |
| 92 |
|
|
Of course, even with this shorter SEAICE_gamma_t, ice will form |
| 93 |
|
|
in grid cells which are far above freezing (> 1 degree) when |
| 94 |
|
|
subjected to air-sea heat fluxes of ~ 345 W m^-2. (To get around |
| 95 |
|
|
this I choose SEAICE_gamma_t to be ~ 10^4 seconds for my thesis, |
| 96 |
|
|
but I really should have just added a mixedLayerTurbulenceFactor |
| 97 |
|
|
instead.) |
| 98 |
|
|
|
| 99 |
|
|
The original scheme is accessed by defining #SEAICE_USE_ORIGINAL_HEAT FLUX |
| 100 |
|
|
|
| 101 |
|
|
|
| 102 |
|
|
=== Seaice salinity === |
| 103 |
|
|
|
| 104 |
|
|
At present, melting and growing ice is assumed to have a |
| 105 |
|
|
constant salinity specified by SEAICE_salinity_fixed. I plan to |
| 106 |
|
|
put in Dimitris' variable salt fraction and HSALT to store |
| 107 |
|
|
the total mass of salt stored within each grid cell's ice, but |
| 108 |
|
|
it would take some more thinking on my part to be sure that I |
| 109 |
|
|
conserve salt correctly. |
| 110 |
|
|
|
| 111 |
|
|
=== Salt Plumes === |
| 112 |
|
|
|
| 113 |
|
|
I assume that ice production in leads can generate |
| 114 |
|
|
salt plumes. The fraction of the salt sent to the plume package |
| 115 |
|
|
from ice produced in leads (defined by the open water |
| 116 |
|
|
fraction) is a nonlinear function of ice concentration, AREA. |
| 117 |
|
|
|
| 118 |
|
|
Specifically, the function is a logistic curve (sigmoid) with a range and |
| 119 |
|
|
domain {0,1}. The function, f(AREA), has a single free parameter, |
| 120 |
|
|
SEAICE_plumeInflectionPoint, the inflection point of the curve. |
| 121 |
|
|
|
| 122 |
|
|
By construction, the function has the following properties: |
| 123 |
|
|
f(1) \approx 1.0 |
| 124 |
|
|
f(SEAICE_plumeInflectionPoint) = 0.5 |
| 125 |
|
|
f(0) \approx 0.0 (when SEAICE_plumeInflectionPoint \geq 0.5) |
| 126 |
|
|
f(0) > 0.0 (when SEAICE_plumeInflectionPoint < 0.5) |
| 127 |
|
|
|
| 128 |
|
|
As AREA --> 1, the open water fraction is confined to |
| 129 |
|
|
narrow leads implying that new ice production is spatially non-uniform, |
| 130 |
|
|
therby violating the assumption of spatially uniform forcing over |
| 131 |
|
|
the grid cell required by KPP. |
| 132 |
|
|
|
| 133 |
|
|
To treat the vertical overturning of the high-salinity brine |
| 134 |
|
|
in a more physically realistic way, the salt produced |
| 135 |
|
|
in the leads is sent to depth via the plume package. To assure |
| 136 |
|
|
only narrow leads generate plumes, choose a relatively high |
| 137 |
|
|
SEAICE_plumeInflectionPoint. For testing purposes, I chose 0.8 |
| 138 |
|
|
but I don't know what the "right" value should be. |
| 139 |
|
|
|
| 140 |
|
|
=== Ice Age === |
| 141 |
|
|
|
| 142 |
|
|
Adding ice age means just adding a short snippet at the end |
| 143 |
|
|
of seaice_growth.F. I propose that adding to ice age be done |
| 144 |
|
|
in a separate subroutine which takes as arguments, AREA, AREANm1, |
| 145 |
|
|
HEFF, HEFFNm1, and whatever other variables from seaice_growth |
| 146 |
|
|
it needs. Interfacing with a separate subroutine will make |
| 147 |
|
|
for a cleaner seaice growth code in the long run. |