1 |
C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_growth.F,v 1.72 2010/10/01 01:45:15 gforget Exp $ |
2 |
C $Name: $ |
3 |
|
4 |
#include "SEAICE_OPTIONS.h" |
5 |
|
6 |
CBOP |
7 |
C !ROUTINE: SEAICE_GROWTH |
8 |
C !INTERFACE: |
9 |
SUBROUTINE SEAICE_GROWTH( myTime, myIter, myThid ) |
10 |
C !DESCRIPTION: \bv |
11 |
C *==========================================================* |
12 |
C | SUBROUTINE seaice_growth |
13 |
C | o Updata ice thickness and snow depth |
14 |
C *==========================================================* |
15 |
C \ev |
16 |
|
17 |
C !USES: |
18 |
IMPLICIT NONE |
19 |
C === Global variables === |
20 |
#include "SIZE.h" |
21 |
#include "EEPARAMS.h" |
22 |
#include "PARAMS.h" |
23 |
#include "DYNVARS.h" |
24 |
#include "GRID.h" |
25 |
#include "FFIELDS.h" |
26 |
#include "SEAICE_PARAMS.h" |
27 |
#include "SEAICE.h" |
28 |
#ifdef ALLOW_EXF |
29 |
# include "EXF_OPTIONS.h" |
30 |
# include "EXF_FIELDS.h" |
31 |
# include "EXF_PARAM.h" |
32 |
#endif |
33 |
#ifdef ALLOW_SALT_PLUME |
34 |
# include "SALT_PLUME.h" |
35 |
#endif |
36 |
#ifdef ALLOW_AUTODIFF_TAMC |
37 |
# include "tamc.h" |
38 |
#endif |
39 |
|
40 |
C !INPUT/OUTPUT PARAMETERS: |
41 |
C === Routine arguments === |
42 |
C myTime :: Simulation time |
43 |
C myIter :: Simulation timestep number |
44 |
C myThid :: Thread no. that called this routine. |
45 |
_RL myTime |
46 |
INTEGER myIter, myThid |
47 |
CEOP |
48 |
|
49 |
C !LOCAL VARIABLES: |
50 |
C === Local variables === |
51 |
C i,j,bi,bj :: Loop counters |
52 |
INTEGER i, j, bi, bj |
53 |
C number of surface interface layer |
54 |
INTEGER kSurface |
55 |
C constants |
56 |
_RL TBC, SDF, ICE2SNOW |
57 |
_RL QI, recip_QI, QS |
58 |
|
59 |
C note: for all heat stocks, the sign convention is positive towards the atmosphere |
60 |
C |
61 |
C a_QbyATM_cover :: available heat (in W/m^2) due to the interaction of |
62 |
C the atmosphere and the ocean surface - for ice covered water |
63 |
C a_QbyATM_open :: same but for open water |
64 |
C a_QbyATM :: weighted average (depending on the ice cover fraction) |
65 |
C of this available heat over the grid cell. |
66 |
C r_QbyATM_cover :: residual of a_QbyATM_cover after freezing/melting |
67 |
C processes have been accounted for |
68 |
_RL a_QbyATM_cover (1:sNx,1:sNy) |
69 |
_RL a_QbyATM_open (1:sNx,1:sNy) |
70 |
_RL a_QbyATM (1:sNx,1:sNy) |
71 |
_RL r_QbyATM_cover (1:sNx,1:sNy) |
72 |
C a_QSWbyATM_open - short wave heat flux over ocean in W/m^2 |
73 |
C a_QSWbyATM_cover - short wave heat flux under ice in W/m^2 |
74 |
_RL a_QSWbyATM_open (1:sNx,1:sNy) |
75 |
_RL a_QSWbyATM_cover (1:sNx,1:sNy) |
76 |
C a_QbyICE :: available heat (in equivalent m of ice) due to |
77 |
C the interaction of the ice pack and the ocean surface |
78 |
C r_QbyICE :: residual of a_QbyICE after freezing/melting |
79 |
C processes have been accounted for |
80 |
_RL a_QbyICE (1:sNx,1:sNy) |
81 |
_RL r_QbyICE (1:sNx,1:sNy) |
82 |
|
83 |
c FRWfromSNW :: flag that states whether the atmostpheric conditions are |
84 |
c prone to generate SNOW (FRWfromSNW=1) or fresh water (FRWfromSNW=2) |
85 |
integer FRWfromSNW (1:sNx,1:sNy) |
86 |
|
87 |
C Available Heat tendencies associated with melt/freeze processes |
88 |
_RL d_QbyICE (1:sNx,1:sNy) |
89 |
_RL d_QbySNW (1:sNx,1:sNy) |
90 |
_RL d_QbyATMonOCN (1:sNx,1:sNy) |
91 |
_RL d_QbyATMonSNW (1:sNx,1:sNy) |
92 |
|
93 |
c ICE/SNOW stocks tendencies associated with the various melt/freeze processes |
94 |
_RL d_AREAbyATM (1:sNx,1:sNy) |
95 |
c |
96 |
_RL d_HEFFbyICEonOCN (1:sNx,1:sNy) |
97 |
_RL d_HEFFbyATMonOCN (1:sNx,1:sNy) |
98 |
_RL d_HEFFfromSNWflood (1:sNx,1:sNy) |
99 |
c |
100 |
_RL d_HSNWfromFRW (1:sNx,1:sNy) |
101 |
_RL d_HSNWbyOCNonSNW (1:sNx,1:sNy) |
102 |
_RL d_SNWintoICEflood (1:sNx,1:sNy) |
103 |
_RL d_HFRWfromSNW (1:sNx,1:sNy) |
104 |
|
105 |
C actual ice thickness with upper and lower limit |
106 |
_RL HICE (1:sNx,1:sNy) |
107 |
C actual snow thickness |
108 |
_RL hSnwLoc (1:sNx,1:sNy) |
109 |
C wind speed |
110 |
_RL UG (1:sNx,1:sNy) |
111 |
_RL SPEED_SQ |
112 |
C local copy of AREA |
113 |
_RL areaLoc |
114 |
|
115 |
c temporary variables available for the various computations |
116 |
_RL tmpscal1, tmpscal2, tmpscal3, tmpscal4 |
117 |
_RL tmparr1 (1:sNx,1:sNy) |
118 |
|
119 |
C auxillary variables used for specific processes |
120 |
_RL snowEnergy |
121 |
|
122 |
#ifdef ALLOW_SEAICE_FLOODING |
123 |
_RL hDraft |
124 |
#endif /* ALLOW_SEAICE_FLOODING */ |
125 |
|
126 |
#ifdef SEAICE_SALINITY |
127 |
_RL saltFluxAdjust(1:sNx,1:sNy) |
128 |
#endif |
129 |
|
130 |
#ifdef SEAICE_MULTICATEGORY |
131 |
INTEGER it |
132 |
INTEGER ilockey |
133 |
_RL RK |
134 |
_RL HICEP (1:sNx,1:sNy) |
135 |
_RL a_QbyATMmult_cover (1:sNx,1:sNy) |
136 |
_RL a_QSWbyATMmult_cover (1:sNx,1:sNy) |
137 |
#endif |
138 |
|
139 |
#ifdef SEAICE_AGE |
140 |
C old_AREA :: hold sea-ice fraction field before any seaice-thermo update |
141 |
_RL old_AREA (1:sNx,1:sNy) |
142 |
# ifdef SEAICE_AGE_VOL |
143 |
C old_HEFF :: hold sea-ice effective thickness field before any seaice-thermo update |
144 |
_RL old_HEFF (1:sNx,1:sNy) |
145 |
_RL age_actual |
146 |
# endif /* SEAICE_AGE_VOL */ |
147 |
#endif /* SEAICE_AGE */ |
148 |
|
149 |
#ifdef ALLOW_DIAGNOSTICS |
150 |
_RL DIAGarray (1:sNx,1:sNy) |
151 |
LOGICAL DIAGNOSTICS_IS_ON |
152 |
EXTERNAL DIAGNOSTICS_IS_ON |
153 |
#endif |
154 |
|
155 |
IF ( buoyancyRelation .EQ. 'OCEANICP' ) THEN |
156 |
kSurface = Nr |
157 |
ELSE |
158 |
kSurface = 1 |
159 |
ENDIF |
160 |
|
161 |
C FREEZING TEMP. OF SEA WATER (deg C) |
162 |
TBC = SEAICE_freeze |
163 |
C RATIO OF WATER DESITY TO SNOW DENSITY |
164 |
SDF = 1000.0 _d 0/SEAICE_rhoSnow |
165 |
C RATIO OF SEA ICE DENSITY to SNOW DENSITY |
166 |
ICE2SNOW = SDF * ICE2WATR |
167 |
C HEAT OF FUSION OF ICE (J/m^3) |
168 |
QI = 302.0 _d +06 |
169 |
recip_QI = 1.0 _d 0 / QI |
170 |
C HEAT OF FUSION OF SNOW (J/m^3) |
171 |
QS = 1.1 _d +08 |
172 |
|
173 |
|
174 |
DO bj=myByLo(myThid),myByHi(myThid) |
175 |
DO bi=myBxLo(myThid),myBxHi(myThid) |
176 |
c |
177 |
#ifdef ALLOW_AUTODIFF_TAMC |
178 |
act1 = bi - myBxLo(myThid) |
179 |
max1 = myBxHi(myThid) - myBxLo(myThid) + 1 |
180 |
act2 = bj - myByLo(myThid) |
181 |
max2 = myByHi(myThid) - myByLo(myThid) + 1 |
182 |
act3 = myThid - 1 |
183 |
max3 = nTx*nTy |
184 |
act4 = ikey_dynamics - 1 |
185 |
iicekey = (act1 + 1) + act2*max1 |
186 |
& + act3*max1*max2 |
187 |
& + act4*max1*max2*max3 |
188 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
189 |
|
190 |
#ifdef ALLOW_AUTODIFF_TAMC |
191 |
CADJ STORE area(:,:,bi,bj) = comlev1_bibj, |
192 |
CADJ & key = iicekey, byte = isbyte |
193 |
CADJ STORE qnet(:,:,bi,bj) = comlev1_bibj, |
194 |
CADJ & key = iicekey, byte = isbyte |
195 |
CADJ STORE qsw(:,:,bi,bj) = comlev1_bibj, |
196 |
CADJ & key = iicekey, byte = isbyte |
197 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
198 |
|
199 |
|
200 |
C array initializations |
201 |
C ===================== |
202 |
|
203 |
DO J=1,sNy |
204 |
DO I=1,sNx |
205 |
a_QbyATM_cover (I,J) = 0.0 _d 0 |
206 |
a_QbyATM_open(I,J) = 0.0 _d 0 |
207 |
a_QbyATM(I,J) = 0.0 _d 0 |
208 |
r_QbyATM_cover (I,J) = 0.0 _d 0 |
209 |
c |
210 |
a_QSWbyATM_open (I,J) = 0.0 _d 0 |
211 |
a_QSWbyATM_cover (I,J) = 0.0 _d 0 |
212 |
c |
213 |
a_QbyICE (I,J) = 0.0 _d 0 |
214 |
r_QbyICE (I,J) = 0.0 _d 0 |
215 |
c |
216 |
FRWfromSNW (I,J) = 0 |
217 |
c |
218 |
d_QbyICE (I,J) = 0.0 _d 0 |
219 |
d_QbySNW (I,J) = 0.0 _d 0 |
220 |
d_QbyATMonOCN (I,J) = 0.0 _d 0 |
221 |
d_QbyATMonSNW (I,J) = 0.0 _d 0 |
222 |
c |
223 |
d_AREAbyATM(I,J) = 0.0 _d 0 |
224 |
c |
225 |
d_HEFFbyICEonOCN(I,J) = 0.0 _d 0 |
226 |
d_HEFFbyATMonOCN(I,J) = 0.0 _d 0 |
227 |
d_HEFFfromSNWflood(I,J) = 0.0 _d 0 |
228 |
c |
229 |
d_HSNWfromFRW(I,J) = 0.0 _d 0 |
230 |
d_HSNWbyOCNonSNW(I,J) = 0.0 _d 0 |
231 |
d_SNWintoICEflood(I,J) = 0.0 _d 0 |
232 |
d_HFRWfromSNW(I,J) = 0.0 _d 0 |
233 |
c |
234 |
tmparr1(I,J) = 0.0 _d 0 |
235 |
c |
236 |
#ifdef SEAICE_SALINITY |
237 |
saltFluxAdjust(I,J) = 0.0 _d 0 |
238 |
#endif |
239 |
#ifdef SEAICE_MULTICATEGORY |
240 |
a_QbyATMmult_cover(I,J) = 0.0 _d 0 |
241 |
a_QSWbyATMmult_cover(I,J) = 0.0 _d 0 |
242 |
#endif |
243 |
ENDDO |
244 |
ENDDO |
245 |
DO J=1-oLy,sNy+oLy |
246 |
DO I=1-oLx,sNx+oLx |
247 |
saltWtrIce(I,J,bi,bj) = 0.0 _d 0 |
248 |
frWtrIce(I,J,bi,bj) = 0.0 _d 0 |
249 |
#ifdef ALLOW_MEAN_SFLUX_COST_CONTRIBUTION |
250 |
frWtrAtm(I,J,bi,bj) = 0.0 _d 0 |
251 |
#endif |
252 |
ENDDO |
253 |
ENDDO |
254 |
|
255 |
#ifdef SEAICE_AGE |
256 |
C store the initial ice fraction over the domain |
257 |
DO J=1,sNy |
258 |
DO I=1,sNx |
259 |
old_AREA(i,j) = AREA(I,J,bi,bj) |
260 |
# ifdef SEAICE_AGE_VOL |
261 |
old_HEFF(i,j) = HEFF(I,J,bi,bj) |
262 |
# endif |
263 |
ENDDO |
264 |
ENDDO |
265 |
#endif /* SEAICE_AGE */ |
266 |
|
267 |
|
268 |
#ifdef ALLOW_AUTODIFF_TAMC |
269 |
CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, |
270 |
CADJ & key = iicekey, byte = isbyte |
271 |
CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj, |
272 |
CADJ & key = iicekey, byte = isbyte |
273 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
274 |
DO J=1,sNy |
275 |
DO I=1,sNx |
276 |
C COMPUTE ACTUAL ICE THICKNESS AND PUT MINIMUM/MAXIMUM |
277 |
C ON ICE THICKNESS FOR BUDGET COMPUTATION |
278 |
C The default of A22 = 0.15 is a common threshold for defining |
279 |
C the ice edge. This ice concentration usually does not occur |
280 |
C due to thermodynamics but due to advection. |
281 |
areaLoc = MAX(A22,AREANm1(I,J,bi,bj)) |
282 |
HICE(I,J) = HEFFNm1(I,J,bi,bj)/areaLoc |
283 |
C Do we know what this is for? |
284 |
HICE(I,J) = MAX(HICE(I,J),0.05 _d +00) |
285 |
C Capping the actual ice thickness effectively enforces a |
286 |
C minimum of heat flux through the ice and helps getting rid of |
287 |
C very thick ice. |
288 |
cdm actually, this does exactly the opposite, i.e., ice is thicker |
289 |
cdm when HICE is capped, so I am commenting out |
290 |
cdm HICE(I,J) = MIN(HICE(I,J),9.0 _d +00) |
291 |
hSnwLoc(I,J) = HSNOW(I,J,bi,bj)/areaLoc |
292 |
ENDDO |
293 |
ENDDO |
294 |
|
295 |
|
296 |
C determine available heat due to the atmosphere -- for open water |
297 |
C ================================================================ |
298 |
|
299 |
C ocean surface/mixed layer temperature |
300 |
DO J=1,sNy |
301 |
DO I=1,sNx |
302 |
TMIX(I,J,bi,bj)=theta(I,J,kSurface,bi,bj)+273.16 _d +00 |
303 |
#ifdef SEAICE_DEBUG |
304 |
TMIX(I,J,bi,bj)=MAX(TMIX(I,J,bi,bj),271.2 _d +00) |
305 |
#endif |
306 |
ENDDO |
307 |
ENDDO |
308 |
|
309 |
C wind speed from exf |
310 |
DO J=1,sNy |
311 |
DO I=1,sNx |
312 |
UG(I,J) = MAX(SEAICE_EPS,wspeed(I,J,bi,bj)) |
313 |
ENDDO |
314 |
ENDDO |
315 |
|
316 |
CALL SEAICE_BUDGET_OCEAN( |
317 |
I UG, |
318 |
U TMIX, |
319 |
O a_QbyATM_open, a_QSWbyATM_open, |
320 |
I bi, bj, myTime, myIter, myThid ) |
321 |
|
322 |
|
323 |
C determine available heat due to the atmosphere -- for ice covered water |
324 |
C ======================================================================= |
325 |
|
326 |
#ifdef ALLOW_AUTODIFF_TAMC |
327 |
CADJ STORE tice = comlev1, key = ikey_dynamics, byte = isbyte |
328 |
# ifdef SEAICE_MULTICATEGORY |
329 |
CADJ STORE tices = comlev1, key = ikey_dynamics, byte = isbyte |
330 |
# endif |
331 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
332 |
|
333 |
IF (useRelativeWind) THEN |
334 |
C Compute relative wind speed over sea ice. |
335 |
DO J=1,sNy |
336 |
DO I=1,sNx |
337 |
SPEED_SQ = |
338 |
& (uWind(I,J,bi,bj) |
339 |
& +0.5 _d 0*(uVel(i,j,kSurface,bi,bj) |
340 |
& +uVel(i+1,j,kSurface,bi,bj)) |
341 |
& -0.5 _d 0*(uice(i,j,bi,bj)+uice(i+1,j,bi,bj)))**2 |
342 |
& +(vWind(I,J,bi,bj) |
343 |
& +0.5 _d 0*(vVel(i,j,kSurface,bi,bj) |
344 |
& +vVel(i,j+1,kSurface,bi,bj)) |
345 |
& -0.5 _d 0*(vice(i,j,bi,bj)+vice(i,j+1,bi,bj)))**2 |
346 |
IF ( SPEED_SQ .LE. SEAICE_EPS_SQ ) THEN |
347 |
UG(I,J)=SEAICE_EPS |
348 |
ELSE |
349 |
UG(I,J)=SQRT(SPEED_SQ) |
350 |
ENDIF |
351 |
ENDDO |
352 |
ENDDO |
353 |
ENDIF |
354 |
|
355 |
#ifdef SEAICE_MULTICATEGORY |
356 |
C-- Start loop over muli-categories |
357 |
DO IT=1,MULTDIM |
358 |
#ifdef ALLOW_AUTODIFF_TAMC |
359 |
ilockey = (iicekey-1)*MULTDIM + IT |
360 |
CADJ STORE tices(:,:,it,bi,bj) = comlev1_multdim, |
361 |
CADJ & key = ilockey, byte = isbyte |
362 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
363 |
RK=REAL(IT) |
364 |
DO J=1,sNy |
365 |
DO I=1,sNx |
366 |
HICEP(I,J)=(HICE(I,J)/MULTDIM)*((2.0 _d 0*RK)-1.0 _d 0) |
367 |
TICE(I,J,bi,bj)=TICES(I,J,IT,bi,bj) |
368 |
ENDDO |
369 |
ENDDO |
370 |
CALL SEAICE_SOLVE4TEMP( |
371 |
I UG, HICEP, hSnwLoc, |
372 |
U TICE, |
373 |
O a_QbyATMmult_cover, a_QSWbyATMmult_cover, |
374 |
I bi, bj, myTime, myIter, myThid ) |
375 |
DO J=1,sNy |
376 |
DO I=1,sNx |
377 |
C average over categories |
378 |
a_QbyATM_cover (I,J) = |
379 |
& a_QbyATM_cover(I,J) + a_QbyATMmult_cover(I,J)/MULTDIM |
380 |
a_QSWbyATM_cover (I,J) = |
381 |
& a_QSWbyATM_cover(I,J) + a_QSWbyATMmult_cover(I,J)/MULTDIM |
382 |
TICES(I,J,IT,bi,bj) = TICE(I,J,bi,bj) |
383 |
ENDDO |
384 |
ENDDO |
385 |
ENDDO |
386 |
C-- End loop over multi-categories |
387 |
#else /* SEAICE_MULTICATEGORY */ |
388 |
CALL SEAICE_SOLVE4TEMP( |
389 |
I UG, HICE, hSnwLoc, |
390 |
U TICE, |
391 |
O a_QbyATM_cover, a_QSWbyATM_cover, |
392 |
I bi, bj, myTime, myIter, myThid ) |
393 |
#endif /* SEAICE_MULTICATEGORY */ |
394 |
|
395 |
#ifdef ALLOW_DIAGNOSTICS |
396 |
IF ( useDiagnostics ) THEN |
397 |
IF ( DIAGNOSTICS_IS_ON('SIatmQnt',myThid) ) THEN |
398 |
DO J=1,sNy |
399 |
DO I=1,sNx |
400 |
DIAGarray(I,J) = maskC(I,J,kSurface,bi,bj) * ( |
401 |
& a_QbyATM_cover(I,J) * areaNm1(I,J,bi,bj) + |
402 |
& a_QbyATM_open(I,J) * ( ONE - areaNm1(I,J,bi,bj) ) ) |
403 |
ENDDO |
404 |
ENDDO |
405 |
CALL DIAGNOSTICS_FILL(DIAGarray,'SIatmQnt',0,1,3,bi,bj,myThid) |
406 |
ENDIF |
407 |
ENDIF |
408 |
#endif |
409 |
|
410 |
|
411 |
C determine whether the atmostpheric conditions are prone |
412 |
C to generate SNOW (FRWfromSNW=1) or fresh water (FRWfromSNW=2) |
413 |
C ============================================================== |
414 |
|
415 |
DO J=1,sNy |
416 |
DO I=1,sNx |
417 |
IF (a_QbyATM_cover(I,J).LT.ZERO.AND. |
418 |
& AREANm1(I,J,bi,bj).GT.ZERO) THEN |
419 |
FRWfromSNW(I,J)=2 |
420 |
ELSE |
421 |
FRWfromSNW(I,J)=1 |
422 |
ENDIF |
423 |
ENDDO |
424 |
ENDDO |
425 |
|
426 |
|
427 |
C determine available heat due to the ice pack tying the |
428 |
C underlying surface water temperature to freezing point |
429 |
C ====================================================== |
430 |
|
431 |
#ifdef ALLOW_AUTODIFF_TAMC |
432 |
CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, |
433 |
CADJ & key = iicekey, byte = isbyte |
434 |
CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, |
435 |
CADJ & key = iicekey, byte = isbyte |
436 |
CADJ STORE FRWfromSNW = comlev1_bibj, |
437 |
CADJ & key = iicekey, byte = isbyte |
438 |
#endif |
439 |
|
440 |
cgf a_QbyICE: available heat that may be extracted by the ICE acting |
441 |
cgf on the OCN surface/mixed layer to bring it back to freezig point |
442 |
cgf (in m, negative out of the ocean -- different convention than a_QbyATM) |
443 |
cgf |
444 |
cgf Using the same convention (W/m2, positive out of the ocean) as |
445 |
cgf for the other heat stocks breaks the lab_sea test at this point. |
446 |
cgf We should revise these conventions in a later revision though. |
447 |
c |
448 |
DO J=1,sNy |
449 |
DO I=1,sNx |
450 |
IF ( .NOT. inAdMode ) THEN |
451 |
#ifdef SEAICE_VARIABLE_FREEZING_POINT |
452 |
TBC = -0.0575 _d 0*salt(I,J,kSurface,bi,bj) + 0.0901 _d 0 |
453 |
#endif /* SEAICE_VARIABLE_FREEZING_POINT */ |
454 |
IF ( theta(I,J,kSurface,bi,bj) .GE. TBC ) THEN |
455 |
a_QbyICE(i,j) = SEAICE_availHeatFrac |
456 |
& * (theta(I,J,kSurface,bi,bj)-TBC) * dRf(kSurface) |
457 |
& * hFacC(i,j,kSurface,bi,bj) / 72.0764 _d 0 |
458 |
#ifdef SEAICE_QBYICE_IS_WPERM2 |
459 |
c using W/m2 as the Q unit |
460 |
& * ( - QI / SEAICE_deltaTtherm ) |
461 |
#endif |
462 |
ELSE |
463 |
a_QbyICE(i,j) = SEAICE_availHeatFracFrz |
464 |
& * (theta(I,J,kSurface,bi,bj)-TBC) * dRf(kSurface) |
465 |
& * hFacC(i,j,kSurface,bi,bj) / 72.0764 _d 0 |
466 |
#ifdef SEAICE_QBYICE_IS_WPERM2 |
467 |
& * ( - QI / SEAICE_deltaTtherm ) |
468 |
#endif |
469 |
ENDIF |
470 |
ELSE |
471 |
a_QbyICE(i,j) = 0. |
472 |
ENDIF |
473 |
ENDDO |
474 |
ENDDO |
475 |
|
476 |
|
477 |
C compute ice thickness tendency due to ice-ocean interaction |
478 |
C =========================================================== |
479 |
|
480 |
DO J=1,sNy |
481 |
DO I=1,sNx |
482 |
tmpscal1=a_QbyICE(i,j) |
483 |
#ifdef SEAICE_QBYICE_IS_WPERM2 |
484 |
& / ( - QI / SEAICE_deltaTtherm ) |
485 |
#endif |
486 |
d_HEFFbyICEonOCN(I,J) = |
487 |
& MAX(ZERO, HEFF(I,J,bi,bj)-tmpscal1)- HEFF(I,J,bi,bj) |
488 |
d_QbyICE(I,J)=d_HEFFbyICEonOCN(I,J) |
489 |
#ifdef SEAICE_QBYICE_IS_WPERM2 |
490 |
& * ( - QI / SEAICE_deltaTtherm ) |
491 |
#endif |
492 |
c apply tendency |
493 |
r_QbyICE(I,J)=a_QbyICE(I,J)+d_QbyICE(I,J) |
494 |
HEFF(I,J,bi,bj)=HEFF(I,J,bi,bj) + d_HEFFbyICEonOCN(I,J) |
495 |
saltWtrIce(I,J,bi,bj) = saltWtrIce(I,J,bi,bj) |
496 |
& + d_HEFFbyICEonOCN(I,J) |
497 |
ENDDO |
498 |
ENDDO |
499 |
|
500 |
#ifdef ALLOW_DIAGNOSTICS |
501 |
IF ( useDiagnostics ) THEN |
502 |
IF ( DIAGNOSTICS_IS_ON('SIyneg ',myThid) ) THEN |
503 |
CALL DIAGNOSTICS_FILL(d_HEFFbyICEonOCN, |
504 |
& 'SIyneg ',0,1,1,bi,bj,myThid) |
505 |
ENDIF |
506 |
ENDIF |
507 |
#endif |
508 |
|
509 |
|
510 |
C compute snow thickness tendency due to snow-atmosphere interaction |
511 |
C ================================================================== |
512 |
|
513 |
#ifdef ALLOW_AUTODIFF_TAMC |
514 |
CADJ STORE area(:,:,bi,bj) = comlev1_bibj, |
515 |
CADJ & key = iicekey, byte = isbyte |
516 |
CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj, |
517 |
CADJ & key = iicekey, byte = isbyte |
518 |
CADJ STORE a_QbyATM_cover(:,:) = comlev1_bibj, |
519 |
CADJ & key = iicekey, byte = isbyte |
520 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
521 |
|
522 |
DO J=1,sNy |
523 |
DO I=1,sNx |
524 |
tmpscal1=-SEAICE_deltaTtherm* |
525 |
& a_QbyATM_cover(I,J)*AREANm1(I,J,bi,bj) |
526 |
IF ( FRWfromSNW(I,J).EQ.2 ) THEN |
527 |
snowEnergy=HSNOW(I,J,bi,bj)*QS |
528 |
IF(tmpscal1.LE.snowEnergy) THEN |
529 |
C not enough heat to melt all snow; use up all of a_QbyATM_cover |
530 |
d_HSNWfromFRW(I,J)=-tmpscal1/QS |
531 |
C SNOW CONVERTED INTO WATER AND THEN INTO equivalent m of ICE melt |
532 |
C The factor 1/ICE2SNOW converts m of snow to m of sea-ice |
533 |
d_HFRWfromSNW(I,J)= - tmpscal1/(QS*ICE2SNOW) |
534 |
d_QbyATMonSNW(I,J) = -a_QbyATM_cover(I,J) |
535 |
ELSE |
536 |
C enough heat to melt snow completely; |
537 |
C compute remaining heat that will melt ice |
538 |
d_QbyATMonSNW(I,J)=-(tmpscal1-snowEnergy)/ |
539 |
& SEAICE_deltaTtherm/AREANm1(I,J,bi,bj)-a_QbyATM_cover(I,J) |
540 |
C convert all snow to melt water (fresh water flux) |
541 |
d_HFRWfromSNW(I,J)=-HSNOW(I,J,bi,bj)/ICE2SNOW |
542 |
d_HSNWfromFRW(I,J)=-HSNOW(I,J,bi,bj) |
543 |
END IF |
544 |
ELSE |
545 |
c this process is inactive under cold conditions |
546 |
d_QbyATMonSNW(I,J)=0. _d 0 |
547 |
d_HFRWfromSNW(I,J)=0. _d 0 |
548 |
d_HSNWfromFRW(I,J)=0. _d 0 |
549 |
ENDIF |
550 |
c apply tendency |
551 |
frWtrIce(I,J,bi,bj) = frWtrIce(I,J,bi,bj) + |
552 |
& d_HFRWfromSNW(I,J) |
553 |
HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) + d_HSNWfromFRW(I,J) |
554 |
a_QbyATM_cover(I,J)= a_QbyATM_cover(I,J) + d_QbyATMonSNW(I,J) |
555 |
ENDDO |
556 |
ENDDO |
557 |
|
558 |
|
559 |
C compute heat due to the atmosphere that |
560 |
C remain available after melt/freeze processes |
561 |
C ============================================ |
562 |
|
563 |
#ifdef ALLOW_AUTODIFF_TAMC |
564 |
CADJ STORE a_QbyATM_cover(:,:) = comlev1_bibj, |
565 |
CADJ & key = iicekey, byte = isbyte |
566 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
567 |
|
568 |
DO J=1,sNy |
569 |
DO I=1,sNx |
570 |
a_QbyATM(I,J)= a_QbyATM_cover(I,J) * AREANm1(I,J,bi,bj) |
571 |
& + a_QbyATM_open(I,J) * (ONE-AREANm1(I,J,bi,bj)) |
572 |
ENDDO |
573 |
ENDDO |
574 |
|
575 |
|
576 |
C compute ice cover fraction tendency from a_QbyATM |
577 |
C ================================================= |
578 |
|
579 |
#ifdef ALLOW_AUTODIFF_TAMC |
580 |
CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, |
581 |
CADJ & key = iicekey, byte = isbyte |
582 |
CADJ STORE a_QbyATM_cover(:,:) = comlev1_bibj, |
583 |
CADJ & key = iicekey, byte = isbyte |
584 |
CADJ STORE a_QbyATM(:,:) = comlev1_bibj, |
585 |
CADJ & key = iicekey, byte = isbyte |
586 |
CADJ STORE a_QbyATM_open(:,:) = comlev1_bibj, |
587 |
CADJ & key = iicekey, byte = isbyte |
588 |
CADJ STORE a_QSWbyATM_cover(:,:) = comlev1_bibj, |
589 |
CADJ & key = iicekey, byte = isbyte |
590 |
CADJ STORE a_QSWbyATM_open(:,:) = comlev1_bibj, |
591 |
CADJ & key = iicekey, byte = isbyte |
592 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
593 |
|
594 |
DO J=1,sNy |
595 |
DO I=1,sNx |
596 |
tmpscal1 = -SEAICE_deltaTtherm*a_QbyATM(I,J)*recip_QI |
597 |
c (cannot melt more than all the ice) |
598 |
tmpscal2 = -ONE*MIN(HEFF(I,J,bi,bj),tmpscal1) |
599 |
tmpscal3 = MIN(ZERO,tmpscal2) |
600 |
#ifdef ALLOW_DIAGNOSTICS |
601 |
DIAGarray(I,J) = tmpscal2 |
602 |
#endif |
603 |
C gain of new ice over open water (>0 by definition) |
604 |
tmpscal4 = MAX(ZERO,SEAICE_deltaTtherm* |
605 |
& a_QbyATM_open(I,J)*recip_QI) |
606 |
c compute cover fraction tendency |
607 |
IF ( YC(I,J,bi,bj) .LT. ZERO ) THEN |
608 |
d_AREAbyATM(I,J)= |
609 |
& (ONE-AREANm1(I,J,bi,bj))*tmpscal4/HO_south |
610 |
& +HALF*tmpscal3*AREANm1(I,J,bi,bj) |
611 |
& /(HEFF(I,J,bi,bj)+.00001 _d 0) |
612 |
ELSE |
613 |
d_AREAbyATM(I,J)= |
614 |
& (ONE-AREANm1(I,J,bi,bj))*tmpscal4/HO |
615 |
& +HALF*tmpscal3*AREANm1(I,J,bi,bj) |
616 |
& /(HEFF(I,J,bi,bj)+.00001 _d 0) |
617 |
ENDIF |
618 |
c apply tendency |
619 |
AREA(I,J,bi,bj)=AREA(I,J,bi,bj)+d_AREAbyATM(I,J) |
620 |
ENDDO |
621 |
ENDDO |
622 |
|
623 |
#ifdef ALLOW_DIAGNOSTICS |
624 |
IF ( useDiagnostics ) THEN |
625 |
IF ( DIAGNOSTICS_IS_ON('SIfice ',myThid) ) THEN |
626 |
CALL DIAGNOSTICS_FILL(DIAGarray,'SIfice ',0,1,3,bi,bj,myThid) |
627 |
ENDIF |
628 |
ENDIF |
629 |
#endif |
630 |
|
631 |
|
632 |
C compute ice thickness tendency due to the atmosphere. |
633 |
C Freezing ocean water/melting ice also affects |
634 |
C the salt water and heat stocks. |
635 |
C ================================================= |
636 |
|
637 |
#ifdef ALLOW_AUTODIFF_TAMC |
638 |
CADJ STORE area(:,:,bi,bj) = comlev1_bibj, |
639 |
CADJ & key = iicekey, byte = isbyte |
640 |
#endif |
641 |
|
642 |
DO J=1,sNy |
643 |
DO I=1,sNx |
644 |
tmpscal1 = SEAICE_deltaTtherm* |
645 |
& a_QbyATM_cover(I,J)*recip_QI*AREANm1(I,J,bi,bj) |
646 |
C (cannot melt more than all the ice) |
647 |
tmpscal2 = MAX(-HEFF(I,J,bi,bj),tmpscal1) |
648 |
d_HEFFbyATMonOCN(I,J)=tmpscal2 |
649 |
C compute the r_QbyATM_cover residual as the difference between |
650 |
C the available heat tmpscal1 and the used tmpscal2; |
651 |
d_QbyATMonOCN(I,J)=(tmpscal2 - tmpscal1) |
652 |
& *QI/SEAICE_deltaTtherm-a_QbyATM_cover(I,J) |
653 |
c apply tendency |
654 |
r_QbyATM_cover(I,J) = a_QbyATM_cover(I,J)+d_QbyATMonOCN(I,J) |
655 |
HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + d_HEFFbyATMonOCN(I,J) |
656 |
saltWtrIce(I,J,bi,bj) = saltWtrIce(I,J,bi,bj) + tmpscal2 |
657 |
ENDDO |
658 |
ENDDO |
659 |
|
660 |
|
661 |
C attribute precip to fresh water or snow stock, |
662 |
C depending on atmospheric conditions. |
663 |
C ================================================= |
664 |
#ifdef ALLOW_ATM_TEMP |
665 |
DO J=1,sNy |
666 |
DO I=1,sNx |
667 |
IF ( FRWfromSNW(I,J).EQ.1 ) THEN |
668 |
C add precip as snow |
669 |
d_HFRWfromSNW(I,J)=0. _d 0 |
670 |
d_HSNWfromFRW(I,J)=SEAICE_deltaTtherm* |
671 |
& PRECIP(I,J,bi,bj)*AREANm1(I,J,bi,bj)*SDF |
672 |
ELSE |
673 |
c add precip to the fresh water bucket |
674 |
d_HFRWfromSNW(I,J)=-PRECIP(I,J,bi,bj)*AREANm1(I,J,bi,bj)* |
675 |
& SEAICE_deltaTtherm/ICE2WATR |
676 |
d_HSNWfromFRW(I,J)=0. _d 0 |
677 |
ENDIF |
678 |
c apply tendency |
679 |
frWtrIce(I,J,bi,bj) = frWtrIce(I,J,bi,bj) + |
680 |
& d_HFRWfromSNW(I,J) |
681 |
HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) + d_HSNWfromFRW(I,J) |
682 |
ENDDO |
683 |
ENDDO |
684 |
#endif /* ALLOW_ATM_TEMP */ |
685 |
|
686 |
|
687 |
C compute snow tendency due to heat available from atmosphere |
688 |
C can only reduce HSNOW. melted snow is added to fresh water stock. |
689 |
C ================================================================= |
690 |
|
691 |
cph( very sensitive bit here by JZ |
692 |
#ifndef SEAICE_EXCLUDE_FOR_EXACT_AD_TESTING |
693 |
DO J=1,sNy |
694 |
DO I=1,sNx |
695 |
tmpscal1=r_QbyICE(i,j) |
696 |
#ifdef SEAICE_QBYICE_IS_WPERM2 |
697 |
& / ( - QI / SEAICE_deltaTtherm ) |
698 |
#endif |
699 |
IF( tmpscal1 .GT. ZERO .AND. |
700 |
& HSNOW(I,J,bi,bj) .GT. ZERO ) THEN |
701 |
d_HSNWbyOCNonSNW(I,J) = |
702 |
& - MIN( HSNOW(I,J,bi,bj)/SDF/ICE2WATR , tmpscal1 ) |
703 |
ELSE |
704 |
d_HSNWbyOCNonSNW(I,J) = 0. _d 0 |
705 |
ENDIF |
706 |
d_QbySNW(I,J)=d_HSNWbyOCNonSNW(I,J) |
707 |
#ifdef SEAICE_QBYICE_IS_WPERM2 |
708 |
& * ( - QI / SEAICE_deltaTtherm ) |
709 |
#endif |
710 |
c apply tendency |
711 |
r_QbyICE(I,J)=a_QbyICE(I,J)+d_QbySNW(I,J) |
712 |
HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) |
713 |
& +d_HSNWbyOCNonSNW(I,J)*SDF*ICE2WATR |
714 |
frWtrIce(I,J,bi,bj) = frWtrIce(I,J,bi,bj) |
715 |
& +d_HSNWbyOCNonSNW(I,J) |
716 |
ENDDO |
717 |
ENDDO |
718 |
#endif /* SEAICE_EXCLUDE_FOR_EXACT_AD_TESTING */ |
719 |
cph) |
720 |
|
721 |
|
722 |
C compute net fresh water flux leaving/entering |
723 |
C the ocean, accounting for fresh/salt water stocks. |
724 |
C ================================================== |
725 |
|
726 |
#ifdef ALLOW_AUTODIFF_TAMC |
727 |
CADJ STORE area(:,:,bi,bj) = comlev1_bibj, |
728 |
CADJ & key = iicekey, byte = isbyte |
729 |
# ifdef SEAICE_SALINITY |
730 |
CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj, |
731 |
CADJ & key = iicekey, byte = isbyte |
732 |
# endif /* SEAICE_SALINITY */ |
733 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
734 |
|
735 |
#ifdef ALLOW_ATM_TEMP |
736 |
DO J=1,sNy |
737 |
DO I=1,sNx |
738 |
C NOW GET FRESH WATER FLUX |
739 |
EmPmR(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*( |
740 |
& ( EVAP(I,J,bi,bj)-PRECIP(I,J,bi,bj) ) |
741 |
& * ( ONE - AREANm1(I,J,bi,bj) ) |
742 |
#ifdef ALLOW_RUNOFF |
743 |
& - RUNOFF(I,J,bi,bj) |
744 |
#endif |
745 |
& + frWtrIce(I,J,bi,bj)*ICE2WATR/SEAICE_deltaTtherm |
746 |
& + saltWtrIce(I,J,bi,bj)*ICE2WATR/SEAICE_deltaTtherm |
747 |
& )*rhoConstFresh |
748 |
ENDDO |
749 |
ENDDO |
750 |
|
751 |
#ifdef ALLOW_DIAGNOSTICS |
752 |
IF ( useDiagnostics ) THEN |
753 |
IF ( DIAGNOSTICS_IS_ON('SIatmFW ',myThid) ) THEN |
754 |
DO J=1,sNy |
755 |
DO I=1,sNx |
756 |
DIAGarray(I,J) = maskC(I,J,kSurface,bi,bj)*( |
757 |
& PRECIP(I,J,bi,bj) |
758 |
& - EVAP(I,J,bi,bj) |
759 |
& *( ONE - AREANm1(I,J,bi,bj) ) |
760 |
& + RUNOFF(I,J,bi,bj) |
761 |
& )*rhoConstFresh |
762 |
ENDDO |
763 |
ENDDO |
764 |
CALL DIAGNOSTICS_FILL(DIAGarray,'SIatmFW ',0,1,3,bi,bj,myThid) |
765 |
ENDIF |
766 |
ENDIF |
767 |
#endif |
768 |
#ifdef ALLOW_MEAN_SFLUX_COST_CONTRIBUTION |
769 |
DO J=1,sNy |
770 |
DO I=1,sNx |
771 |
frWtrAtm(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*( |
772 |
& PRECIP(I,J,bi,bj) |
773 |
& - EVAP(I,J,bi,bj) |
774 |
& *( ONE - AREANm1(I,J,bi,bj) ) |
775 |
& + RUNOFF(I,J,bi,bj) |
776 |
& )*rhoConstFresh |
777 |
ENDDO |
778 |
ENDDO |
779 |
#endif |
780 |
|
781 |
|
782 |
C COMPUTE SURFACE SALT FLUX AND ADJUST ICE SALINITY |
783 |
C ================================================== |
784 |
|
785 |
#ifdef SEAICE_SALINITY |
786 |
|
787 |
DO J=1,sNy |
788 |
DO I=1,sNx |
789 |
C set HSALT = 0 if HSALT < 0 and compute salt to remove from ocean |
790 |
IF ( HSALT(I,J,bi,bj) .LT. 0.0 ) THEN |
791 |
saltFluxAdjust(I,J) = - HEFFM(I,J,bi,bj) * |
792 |
& HSALT(I,J,bi,bj) / SEAICE_deltaTtherm |
793 |
HSALT(I,J,bi,bj) = 0.0 _d 0 |
794 |
ENDIF |
795 |
ENDDO |
796 |
ENDDO |
797 |
|
798 |
#ifdef ALLOW_AUTODIFF_TAMC |
799 |
CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj, |
800 |
CADJ & key = iicekey, byte = isbyte |
801 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
802 |
|
803 |
DO J=1,sNy |
804 |
DO I=1,sNx |
805 |
C saltWtrIce > 0 : m of sea ice that is created |
806 |
IF ( saltWtrIce(I,J,bi,bj) .GE. 0.0 ) THEN |
807 |
saltFlux(I,J,bi,bj) = |
808 |
& HEFFM(I,J,bi,bj)*saltWtrIce(I,J,bi,bj)* |
809 |
& ICE2WATR*rhoConstFresh*SEAICE_salinity* |
810 |
& salt(I,j,kSurface,bi,bj)/SEAICE_deltaTtherm |
811 |
#ifdef ALLOW_SALT_PLUME |
812 |
C saltPlumeFlux is defined only during freezing: |
813 |
saltPlumeFlux(I,J,bi,bj)= |
814 |
& HEFFM(I,J,bi,bj)*saltWtrIce(I,J,bi,bj)* |
815 |
& ICE2WATR*rhoConstFresh*(1-SEAICE_salinity)* |
816 |
& salt(I,j,kSurface,bi,bj)/SEAICE_deltaTtherm |
817 |
C if SaltPlumeSouthernOcean=.FALSE. turn off salt plume in Southern Ocean |
818 |
IF ( .NOT. SaltPlumeSouthernOcean ) THEN |
819 |
IF ( YC(I,J,bi,bj) .LT. 0.0 _d 0 ) |
820 |
& saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0 |
821 |
ENDIF |
822 |
|
823 |
#endif /* ALLOW_SALT_PLUME */ |
824 |
C saltWtrIce < 0 : m of sea ice that is melted |
825 |
ELSE |
826 |
saltFlux(I,J,bi,bj) = |
827 |
& HEFFM(I,J,bi,bj)*saltWtrIce(I,J,bi,bj)* |
828 |
& HSALT(I,J,bi,bj)/ |
829 |
& (HEFF(I,J,bi,bj)-saltWtrIce(I,J,bi,bj))/ |
830 |
& SEAICE_deltaTtherm |
831 |
#ifdef ALLOW_SALT_PLUME |
832 |
saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0 |
833 |
#endif /* ALLOW_SALT_PLUME */ |
834 |
ENDIF |
835 |
C update HSALT based on surface saltFlux |
836 |
HSALT(I,J,bi,bj) = HSALT(I,J,bi,bj) + |
837 |
& saltFlux(I,J,bi,bj) * SEAICE_deltaTtherm |
838 |
saltFlux(I,J,bi,bj) = |
839 |
& saltFlux(I,J,bi,bj) + saltFluxAdjust(I,J) |
840 |
C set HSALT = 0 if HEFF = 0 and compute salt to dump into ocean |
841 |
IF ( HEFF(I,J,bi,bj) .EQ. 0.0 ) THEN |
842 |
saltFlux(I,J,bi,bj) = saltFlux(I,J,bi,bj) - |
843 |
& HEFFM(I,J,bi,bj) * HSALT(I,J,bi,bj) / |
844 |
& SEAICE_deltaTtherm |
845 |
HSALT(I,J,bi,bj) = 0.0 _d 0 |
846 |
#ifdef ALLOW_SALT_PLUME |
847 |
saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0 |
848 |
#endif /* ALLOW_SALT_PLUME */ |
849 |
ENDIF |
850 |
ENDDO |
851 |
ENDDO |
852 |
#endif /* SEAICE_SALINITY */ |
853 |
#endif /* ALLOW_ATM_TEMP */ |
854 |
|
855 |
|
856 |
C compute net heat flux leaving/entering the ocean, |
857 |
C accounting for the part used in melt/freeze processes |
858 |
C ===================================================== |
859 |
|
860 |
DO J=1,sNy |
861 |
DO I=1,sNx |
862 |
QNET(I,J,bi,bj) = r_QbyATM_cover(I,J) * AREANm1(I,J,bi,bj) |
863 |
& +a_QbyATM_open(I,J) * (ONE-AREANm1(I,J,bi,bj)) |
864 |
QSW(I,J,bi,bj) = a_QSWbyATM_cover(I,J) * AREANm1(I,J,bi,bj) |
865 |
& +a_QSWbyATM_open(I,J) * (ONE-AREANm1(I,J,bi,bj)) |
866 |
ENDDO |
867 |
ENDDO |
868 |
|
869 |
#ifdef ALLOW_DIAGNOSTICS |
870 |
IF ( useDiagnostics ) THEN |
871 |
IF ( DIAGNOSTICS_IS_ON('SIqneto ',myThid) ) THEN |
872 |
DO J=1,sNy |
873 |
DO I=1,sNx |
874 |
DIAGarray(I,J) = a_QbyATM_open(I,J) * |
875 |
& (ONE-areaNm1(I,J,bi,bj)) |
876 |
ENDDO |
877 |
ENDDO |
878 |
CALL DIAGNOSTICS_FILL(DIAGarray,'SIqneto ',0,1,3,bi,bj,myThid) |
879 |
ENDIF |
880 |
IF ( DIAGNOSTICS_IS_ON('SIqneti ',myThid) ) THEN |
881 |
DO J=1,sNy |
882 |
DO I=1,sNx |
883 |
DIAGarray(I,J) = r_QbyATM_cover(I,J) * areaNm1(I,J,bi,bj) |
884 |
ENDDO |
885 |
ENDDO |
886 |
CALL DIAGNOSTICS_FILL(DIAGarray,'SIqneti ',0,1,3,bi,bj,myThid) |
887 |
ENDIF |
888 |
ENDIF |
889 |
#endif |
890 |
|
891 |
|
892 |
C account for contribution due to ocean-ice interaction. |
893 |
C ====================================================== |
894 |
|
895 |
DO J=1,sNy |
896 |
DO I=1,sNx |
897 |
#ifdef SEAICE_QBYICE_IS_WPERM2 |
898 |
tmpscal1= |
899 |
& -maskC(I,J,kSurface,bi,bj) |
900 |
& *(HeatCapacity_Cp*rUnit2mass/QI) |
901 |
& *72.0764 _d 0 |
902 |
QNET(I,J,bi,bj) = QNET(I,J,bi,bj) |
903 |
& - ( d_QbyICE(I,J) + d_QbySNW(I,J) ) |
904 |
& * tmpscal1 |
905 |
#else |
906 |
tmpscal1 = |
907 |
& - ( d_HEFFbyICEonOCN(I,J)+d_HSNWbyOCNonSNW(I,J) ) |
908 |
& *recip_dRf(kSurface)*recip_hFacC(i,j,kSurface,bi,bj) |
909 |
& *72.0764 _d 0 |
910 |
QNET(I,J,bi,bj) = QNET(I,J,bi,bj) |
911 |
& +tmpscal1 |
912 |
& /SEAICE_deltaTtherm*maskC(I,J,kSurface,bi,bj) |
913 |
& *HeatCapacity_Cp*rUnit2mass |
914 |
& *drF(kSurface)*hFacC(i,j,kSurface,bi,bj) |
915 |
#endif |
916 |
|
917 |
ENDDO |
918 |
ENDDO |
919 |
|
920 |
#ifdef SEAICE_DEBUG |
921 |
CALL PLOT_FIELD_XYRL( QSW,'Current QSW ', myIter, myThid ) |
922 |
CALL PLOT_FIELD_XYRL( QNET,'Current QNET ', myIter, myThid ) |
923 |
CALL PLOT_FIELD_XYRL( EmPmR,'Current EmPmR ', myIter, myThid ) |
924 |
#endif /* SEAICE_DEBUG */ |
925 |
|
926 |
|
927 |
C treat values of ice cover fraction oustide |
928 |
C the [0 1] range, and other such issues. |
929 |
C =========================================== |
930 |
|
931 |
#ifdef ALLOW_AUTODIFF_TAMC |
932 |
CADJ STORE area(:,:,bi,bj) = comlev1_bibj, |
933 |
CADJ & key = iicekey, byte = isbyte |
934 |
CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, |
935 |
CADJ & key = iicekey, byte = isbyte |
936 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
937 |
DO J=1,sNy |
938 |
DO I=1,sNx |
939 |
C NOW SET AREA(I,J,bi,bj)=0 WHERE NO ICE IS |
940 |
AREA(I,J,bi,bj)=MIN(AREA(I,J,bi,bj) |
941 |
& ,HEFF(I,J,bi,bj)/.0001 _d 0) |
942 |
ENDDO |
943 |
ENDDO |
944 |
|
945 |
#ifdef ALLOW_AUTODIFF_TAMC |
946 |
CADJ STORE area(:,:,bi,bj) = comlev1_bibj, |
947 |
CADJ & key = iicekey, byte = isbyte |
948 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
949 |
DO J=1,sNy |
950 |
DO I=1,sNx |
951 |
C NOW TRUNCATE AREA |
952 |
AREA(I,J,bi,bj)=MIN(ONE,AREA(I,J,bi,bj)) |
953 |
ENDDO |
954 |
ENDDO |
955 |
|
956 |
#ifdef ALLOW_AUTODIFF_TAMC |
957 |
CADJ STORE area(:,:,bi,bj) = comlev1_bibj, |
958 |
CADJ & key = iicekey, byte = isbyte |
959 |
CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj, |
960 |
CADJ & key = iicekey, byte = isbyte |
961 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
962 |
DO J=1,sNy |
963 |
DO I=1,sNx |
964 |
AREA(I,J,bi,bj) = MAX(ZERO,AREA(I,J,bi,bj)) |
965 |
HSNOW(I,J,bi,bj) = MAX(ZERO,HSNOW(I,J,bi,bj)) |
966 |
AREA(I,J,bi,bj) = AREA(I,J,bi,bj)*HEFFM(I,J,bi,bj) |
967 |
HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)*HEFFM(I,J,bi,bj) |
968 |
#ifdef SEAICE_CAP_HEFF |
969 |
HEFF(I,J,bi,bj)=MIN(MAX_HEFF,HEFF(I,J,bi,bj)) |
970 |
#endif /* SEAICE_CAP_HEFF */ |
971 |
HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj) |
972 |
ENDDO |
973 |
ENDDO |
974 |
|
975 |
#ifdef ALLOW_DIAGNOSTICS |
976 |
IF ( useDiagnostics ) THEN |
977 |
IF ( DIAGNOSTICS_IS_ON('SIthdgrh',myThid) ) THEN |
978 |
C use (abuse) tmparr1 to diagnose the total thermodynamic growth rate |
979 |
DO J=1,sNy |
980 |
DO I=1,sNx |
981 |
tmparr1(I,J) = (HEFF(I,J,bi,bj)-HEFFNm1(I,J,bi,bj)) |
982 |
& /SEAICE_deltaTtherm |
983 |
ENDDO |
984 |
ENDDO |
985 |
CALL DIAGNOSTICS_FILL(tmparr1,'SIthdgrh',0,1,3,bi,bj,myThid) |
986 |
ENDIF |
987 |
ENDIF |
988 |
#endif /* ALLOW_DIAGNOSTICS */ |
989 |
|
990 |
|
991 |
C convert snow to ice if submerged. |
992 |
C ================================= |
993 |
|
994 |
#ifdef ALLOW_SEAICE_FLOODING |
995 |
IF ( SEAICEuseFlooding ) THEN |
996 |
DO J=1,sNy |
997 |
DO I=1,sNx |
998 |
hDraft = (HSNOW(I,J,bi,bj)*SEAICE_rhoSnow |
999 |
& +HEFF(I,J,bi,bj)*SEAICE_rhoIce)/1000. _d 0 |
1000 |
tmparr1(I,J) = hDraft - MIN(hDraft,HEFF(I,J,bi,bj)) |
1001 |
C |
1002 |
d_HEFFfromSNWflood(I,J)=tmparr1(I,J) |
1003 |
d_SNWintoICEflood(I,J)=MAX(0. _d 0, HSNOW(I,J,bi,bj) |
1004 |
& -tmparr1(I,J)*ICE2SNOW ) - HSNOW(I,J,bi,bj) |
1005 |
c apply tendency |
1006 |
HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)+d_HEFFfromSNWflood(I,J) |
1007 |
HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)+d_SNWintoICEflood(I,J) |
1008 |
ENDDO |
1009 |
ENDDO |
1010 |
#ifdef ALLOW_DIAGNOSTICS |
1011 |
IF ( useDiagnostics ) THEN |
1012 |
IF ( DIAGNOSTICS_IS_ON('SIsnwice',myThid) ) THEN |
1013 |
C turn tmparr1 into a rate |
1014 |
DO J=1,sNy |
1015 |
DO I=1,sNx |
1016 |
tmparr1(I,J) = tmparr1(I,J)/SEAICE_deltaTtherm |
1017 |
ENDDO |
1018 |
ENDDO |
1019 |
CALL DIAGNOSTICS_FILL(tmparr1,'SIsnwice',0,1,3,bi,bj,myThid) |
1020 |
ENDIF |
1021 |
ENDIF |
1022 |
#endif /* ALLOW_DIAGNOSTICS */ |
1023 |
ENDIF |
1024 |
#endif /* ALLOW_SEAICE_FLOODING */ |
1025 |
|
1026 |
|
1027 |
C Sea Ice Load on the sea surface. |
1028 |
C ================================= |
1029 |
|
1030 |
IF ( useRealFreshWaterFlux ) THEN |
1031 |
DO J=1,sNy |
1032 |
DO I=1,sNx |
1033 |
sIceLoad(i,j,bi,bj) = HEFF(I,J,bi,bj)*SEAICE_rhoIce |
1034 |
& + HSNOW(I,J,bi,bj)*SEAICE_rhoSnow |
1035 |
ENDDO |
1036 |
ENDDO |
1037 |
ENDIF |
1038 |
|
1039 |
|
1040 |
C Sea Ice Age Tracer. |
1041 |
C =================== |
1042 |
|
1043 |
#ifdef SEAICE_AGE |
1044 |
# ifndef SEAICE_AGE_VOL |
1045 |
C Sources and sinks for sea ice age: |
1046 |
C assume that a) freezing: new ice fraction forms with zero age |
1047 |
C b) melting: ice fraction vanishes with current age |
1048 |
DO J=1,sNy |
1049 |
DO I=1,sNx |
1050 |
IF ( AREA(I,J,bi,bj) .GT. 0.15 ) THEN |
1051 |
IF ( AREA(i,j,bi,bj) .LT. old_AREA(i,j) ) THEN |
1052 |
C-- scale effective ice-age to account for ice-age sink associated with melting |
1053 |
IceAge(i,j,bi,bj) = IceAge(i,j,bi,bj) |
1054 |
& *AREA(i,j,bi,bj)/old_AREA(i,j) |
1055 |
ENDIF |
1056 |
C-- account for aging: |
1057 |
IceAge(i,j,bi,bj) = IceAge(i,j,bi,bj) |
1058 |
& + AREA(i,j,bi,bj) * SEAICE_deltaTtherm |
1059 |
ELSE |
1060 |
IceAge(i,j,bi,bj) = ZERO |
1061 |
ENDIF |
1062 |
ENDDO |
1063 |
ENDDO |
1064 |
# else /* ifdef SEAICE_AGE_VOL */ |
1065 |
C Sources and sinks for sea ice age: |
1066 |
C assume that a) freezing: new ice volume forms with zero age |
1067 |
C b) melting: ice volume vanishes with current age |
1068 |
DO J=1,sNy |
1069 |
DO I=1,sNx |
1070 |
C-- compute actual age from effective age: |
1071 |
IF (OLD_AREA(i,j).GT.0. _d 0) THEN |
1072 |
age_actual=IceAge(i,j,bi,bj)/OLD_AREA(i,j) |
1073 |
ELSE |
1074 |
age_actual=0. _d 0 |
1075 |
ENDIF |
1076 |
IF ( (OLD_HEFF(i,j).LT.HEFF(i,j,bi,bj)).AND. |
1077 |
& (AREA(i,j,bi,bj).GT.0.15) ) THEN |
1078 |
age_actual=age_actual*OLD_HEFF(i,j)/ |
1079 |
& HEFF(i,j,bi,bj)+SEAICE_deltaTtherm |
1080 |
ELSEIF (AREA(i,j,bi,bj).LE.0.15) THEN |
1081 |
age_actual=0. _d 0 |
1082 |
ELSE |
1083 |
age_actual=age_actual+SEAICE_deltaTtherm |
1084 |
ENDIF |
1085 |
C-- re-scale to effective age: |
1086 |
IceAge(i,j,bi,bj) = age_actual*AREA(i,j,bi,bj) |
1087 |
ENDDO |
1088 |
ENDDO |
1089 |
# endif /* SEAICE_AGE_VOL */ |
1090 |
#endif /* SEAICE_AGE */ |
1091 |
|
1092 |
ENDDO |
1093 |
ENDDO |
1094 |
|
1095 |
RETURN |
1096 |
END |