/[MITgcm]/MITgcm/pkg/thsice/thsice_advdiff.F
ViewVC logotype

Contents of /MITgcm/pkg/thsice/thsice_advdiff.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.7 - (show annotations) (download)
Mon Aug 27 13:20:57 2007 UTC (16 years, 8 months ago) by jmc
Branch: MAIN
Changes since 1.6: +41 -3 lines
add diagnostics of advected thSIce state vars (filled just after the advection)

1 C $Header: /u/gcmpack/MITgcm/pkg/thsice/thsice_advdiff.F,v 1.6 2007/04/29 23:48:44 jmc Exp $
2 C $Name: $
3
4 #include "THSICE_OPTIONS.h"
5 #ifdef ALLOW_GENERIC_ADVDIFF
6 # include "GAD_OPTIONS.h"
7 #endif
8
9 CBOP
10 C !ROUTINE: THSICE_ADVDIFF
11
12 C !INTERFACE: ==========================================================
13 SUBROUTINE THSICE_ADVDIFF(
14 U uIce, vIce,
15 I bi, bj, myTime, myIter, myThid )
16
17 C !DESCRIPTION: \bv
18 C *===========================================================*
19 C | SUBROUTINE THSICE_ADVDIFF
20 C | o driver for different advection routines
21 C | calls an adaption of gad_advection to call different
22 C | advection routines of pkg/generic_advdiff
23 C *===========================================================*
24 C \ev
25
26 C !USES: ===============================================================
27 IMPLICIT NONE
28
29 C === Global variables ===
30 C oceFWfx :: fresh water flux to the ocean [kg/m^2/s]
31 C oceSflx :: salt flux to the ocean [psu.kg/m^2/s] (~g/m^2/s)
32 C oceQnet :: heat flux to the ocean [W/m^2]
33
34 #include "SIZE.h"
35 #include "EEPARAMS.h"
36 #include "PARAMS.h"
37 #include "GRID.h"
38 #include "THSICE_SIZE.h"
39 #include "THSICE_PARAMS.h"
40 #include "THSICE_VARS.h"
41 #include "THSICE_2DYN.h"
42 #ifdef ALLOW_GENERIC_ADVDIFF
43 # include "GAD.h"
44 #endif
45 #ifdef ALLOW_AUTODIFF_TAMC
46 # include "tamc.h"
47 # include "tamc_keys.h"
48 #endif
49
50 C !INPUT PARAMETERS: ===================================================
51 C === Routine arguments ===
52 C uIce/vIce :: ice velocity on C-grid [m/s]
53 C bi,bj :: Tile indices
54 C myTime :: Current time in simulation (s)
55 C myIter :: Current iteration number
56 C myThid :: My Thread Id. number
57 _RL uIce (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
58 _RL vIce (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
59 INTEGER bi,bj
60 _RL myTime
61 INTEGER myIter
62 INTEGER myThid
63 CEndOfInterface
64
65 #ifdef ALLOW_THSICE
66 C !LOCAL VARIABLES: ====================================================
67 C === Local variables ===
68 C i,j, :: Loop counters
69 C uTrans :: sea-ice area transport, x direction
70 C vTrans :: sea-ice area transport, y direction
71 C uTrIce :: sea-ice volume transport, x direction
72 C vTrIce :: sea-ice volume transport, y direction
73 C afx :: horizontal advective flux, x direction
74 C afy :: horizontal advective flux, y direction
75 C iceFrc :: (new) sea-ice fraction
76 C iceVol :: temporary array used in advection S/R
77 C oldVol :: (old) sea-ice volume
78 C msgBuf :: Informational/error meesage buffer
79 INTEGER i, j
80 LOGICAL thSIce_multiDimAdv
81 CHARACTER*(MAX_LEN_MBUF) msgBuf
82
83 _RL uTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
84 _RL vTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
85 _RL uTrIce (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
86 _RL vTrIce (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
87 _RL afx (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
88 _RL afy (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
89 _RS maskOce (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
90 _RL iceFrc (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
91 _RL iceVol (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
92 _RL oldVol (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
93 _RL r_minArea
94 _RL meanCellArea, areaEpsil, vol_Epsil
95 #ifdef ALLOW_DIAGNOSTICS
96 CHARACTER*8 diagName
97 CHARACTER*4 THSICE_DIAG_SUFX, diagSufx
98 EXTERNAL THSICE_DIAG_SUFX
99 LOGICAL DIAGNOSTICS_IS_ON
100 EXTERNAL DIAGNOSTICS_IS_ON
101 _RL tmpFac
102 #endif
103 #ifdef ALLOW_DBUG_THSICE
104 _RL tmpVar, sumVar1, sumVar2
105 #endif
106 LOGICAL dBugFlag
107 #include "THSICE_DEBUG.h"
108 CEOP
109
110 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
111
112 #ifdef ALLOW_AUTODIFF_TAMC
113 act1 = bi - myBxLo(myThid)
114 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
115 act2 = bj - myByLo(myThid)
116 max2 = myByHi(myThid) - myByLo(myThid) + 1
117 act3 = myThid - 1
118 max3 = nTx*nTy
119 act4 = ikey_dynamics - 1
120 iicekey = (act1 + 1) + act2*max1
121 & + act3*max1*max2
122 & + act4*max1*max2*max3
123 #endif /* ALLOW_AUTODIFF_TAMC */
124
125 C areaEpsil, vol_Epsil are 2 small numbers for ice area & ice volume:
126 C if ice area (=ice fraction * grid-cell area) or ice volume (= effective
127 C thickness * grid-cell area) are too small (i.e.: < areaEpsil,vol_Epsil)
128 C will assume that ice is gone, and will loose mass or energy.
129 C However, if areaEpsil,vol_Epsil are much smaller than minimun ice area
130 C (iceMaskMin*rAc) and minimum ice volume (iceMaskMin*hIceMin*rAc),
131 C good chance that this will never happen within 1 time step.
132
133 dBugFlag = debugLevel.GE.debLevB
134
135 C- definitively not an accurate computation of mean grid-cell area;
136 C but what matter here is just to have the right order of magnitude.
137 meanCellArea = Nx*Ny
138 meanCellArea = globalArea / meanCellArea
139 areaEpsil = 1. _d -10 * meanCellArea
140 vol_Epsil = 1. _d -15 * meanCellArea
141
142 r_minArea = 0. _d 0
143 IF ( iceMaskMin.GT.0. _d 0 ) r_minArea = 1. _d 0 / iceMaskMin
144
145 thSIce_multiDimAdv = .TRUE.
146 #ifdef ALLOW_GENERIC_ADVDIFF
147 IF ( thSIceAdvScheme.EQ.ENUM_CENTERED_2ND
148 & .OR.thSIceAdvScheme.EQ.ENUM_UPWIND_3RD
149 & .OR.thSIceAdvScheme.EQ.ENUM_CENTERED_4TH ) THEN
150 thSIce_multiDimAdv = .FALSE.
151 ENDIF
152 #endif /* ALLOW_GENERIC_ADVDIFF */
153
154 C-- Initialisation (+ build oceanic mask)
155 DO j=1-OLy,sNy+OLy
156 DO i=1-OLx,sNx+OLx
157 maskOce(i,j) = 0. _d 0
158 IF ( hOceMxL(i,j,bi,bj).GT.0. ) maskOce(i,j) = 1.
159 iceVol(i,j) = 0. _d 0
160 uTrans(i,j) = 0. _d 0
161 vTrans(i,j) = 0. _d 0
162 uTrIce(i,j) = 0. _d 0
163 vTrIce(i,j) = 0. _d 0
164 oceFWfx(i,j,bi,bj) = 0. _d 0
165 oceSflx(i,j,bi,bj) = 0. _d 0
166 oceQnet(i,j,bi,bj) = 0. _d 0
167 ENDDO
168 ENDDO
169
170 #ifdef ALLOW_AUTODIFF_TAMC
171 CADJ STORE iceHeight(i,j,bi,bj)
172 CADJ & = comlev1_bibj, key=iicekey, byte=isbyte
173 CADJ STORE snowHeight(i,j,bi,bj)
174 CADJ & = comlev1_bibj, key=iicekey, byte=isbyte
175 #endif
176 IF ( thSIce_diffK .GT. 0. ) THEN
177 CALL THSICE_DIFFUSION(
178 I maskOce,
179 U uIce, vIce,
180 I bi, bj, myTime, myIter, myThid )
181 ENDIF
182
183 IF ( thSIce_multiDimAdv ) THEN
184
185 C- Calculate ice transports through tracer cell faces.
186 DO j=1-Oly,sNy+Oly
187 DO i=1-Olx+1,sNx+Olx
188 uTrIce(i,j) = uIce(i,j)*_dyG(i,j,bi,bj)
189 & *maskOce(i-1,j)*maskOce(i,j)
190 ENDDO
191 ENDDO
192 DO j=1-Oly+1,sNy+Oly
193 DO i=1-Olx,sNx+Olx
194 vTrIce(i,j) = vIce(i,j)*_dxG(i,j,bi,bj)
195 & *maskOce(i,j-1)*maskOce(i,j)
196 ENDDO
197 ENDDO
198
199 C-- Fractional area
200 DO j=1-Oly,sNy+Oly
201 DO i=1-Olx,sNx+Olx
202 iceFrc(i,j) = iceMask(i,j,bi,bj)
203 ENDDO
204 ENDDO
205 #ifdef ALLOW_AUTODIFF_TAMC
206 CADJ STORE icevol(i,j) = comlev1_bibj, key=iicekey, byte=isbyte
207 CADJ STORE utrice(i,j) = comlev1_bibj, key=iicekey, byte=isbyte
208 CADJ STORE vtrice(i,j) = comlev1_bibj, key=iicekey, byte=isbyte
209 #endif
210 CALL THSICE_ADVECTION(
211 I GAD_SI_FRAC, thSIceAdvScheme, .TRUE.,
212 I uTrIce, vTrIce, maskOce, thSIce_deltaT, areaEpsil,
213 U iceVol, iceFrc,
214 O uTrans, vTrans,
215 I bi, bj, myTime, myIter, myThid )
216
217 C-- Snow thickness
218 DO j=1-Oly,sNy+Oly
219 DO i=1-Olx,sNx+Olx
220 iceVol(i,j) = iceMask(i,j,bi,bj)*rA(i,j,bi,bj)
221 ENDDO
222 ENDDO
223 CALL THSICE_ADVECTION(
224 I GAD_SI_HSNOW, thSIceAdvScheme, .FALSE.,
225 I uTrans, vTrans, maskOce, thSIce_deltaT, areaEpsil,
226 U iceVol, snowHeight(1-Olx,1-Oly,bi,bj),
227 O afx, afy,
228 I bi, bj, myTime, myIter, myThid )
229
230 #ifdef ALLOW_AUTODIFF_TAMC
231 CADJ STORE iceHeight(i,j,bi,bj) = comlev1_bibj, key=iicekey, byte=isbyte
232 CADJ STORE iceMask(i,j,bi,bj) = comlev1_bibj, key=iicekey, byte=isbyte
233 #endif
234 C-- sea-ice Thickness
235 DO j=1-Oly,sNy+Oly
236 DO i=1-Olx,sNx+Olx
237 iceVol(i,j) = iceMask(i,j,bi,bj)*rA(i,j,bi,bj)
238 oldVol(i,j) = iceVol(i,j)*iceHeight(i,j,bi,bj)
239 ENDDO
240 ENDDO
241 CALL THSICE_ADVECTION(
242 I GAD_SI_HICE, thSIceAdvScheme, .FALSE.,
243 I uTrans, vTrans, maskOce, thSIce_deltaT, areaEpsil,
244 U iceVol, iceHeight(1-Olx,1-Oly,bi,bj),
245 O uTrIce, vTrIce,
246 I bi, bj, myTime, myIter, myThid )
247
248 #ifdef ALLOW_AUTODIFF_TAMC
249 CADJ STORE qice2(i,j,bi,bj) = comlev1_bibj, key=iicekey, byte=isbyte
250 CADJ STORE utrice(i,j) = comlev1_bibj, key=iicekey, byte=isbyte
251 CADJ STORE vtrice(i,j) = comlev1_bibj, key=iicekey, byte=isbyte
252 #endif
253
254 #ifdef ALLOW_DBUG_THSICE
255 IF ( dBugFlag ) THEN
256 sumVar1 = 0.
257 sumVar2 = 0.
258 DO j=1,sNy
259 DO i=1,sNx
260 C- Check that updated iceVol = iceFrc*rA
261 tmpVar = ABS(iceVol(i,j)-iceFrc(i,j)*rA(i,j,bi,bj))
262 IF ( tmpVar.GT.0. ) THEN
263 sumVar1 = sumVar1 + 1.
264 sumVar2 = sumVar2 + tmpVar
265 ENDIF
266 IF ( tmpVar.GT.vol_Epsil ) THEN
267 WRITE(6,'(A,2I4,2I2,I12)') 'ARE_ADV: ij,bij,it=',
268 & i,j,bi,bj,myIter
269 WRITE(6,'(2(A,1P2E14.6))') 'ARE_ADV: iceVol,iceFrc*rA=',
270 & iceVol(i,j),iceFrc(i,j)*rA(i,j,bi,bj),
271 & ' , diff=', tmpVar
272 ENDIF
273 IF ( dBug(i,j,bi,bj) ) THEN
274 WRITE(6,'(A,2I4,2I2,I12)') 'ICE_ADV: ij,bij,it=',
275 & i,j,bi,bj,myIter
276 WRITE(6,'(2(A,1P2E14.6))')
277 & 'ICE_ADV: uIce=', uIce(i,j), uIce(i+1,j),
278 & ' , vIce=', vIce(i,j), vIce(i,j+1)
279 WRITE(6,'(2(A,1P2E14.6))')
280 & 'ICE_ADV: area_b,a=', iceMask(i,j,bi,bj), iceFrc(i,j),
281 & ' , Heff_b,a=', oldVol(i,j)*recip_rA(i,j,bi,bj),
282 & iceHeight(i,j,bi,bj)*iceFrc(i,j)
283 ENDIF
284 ENDDO
285 ENDDO
286 IF ( sumVar2.GT.vol_Epsil )
287 & WRITE(6,'(A,2I2,I10,A,I4,1P2E14.6)') 'ARE_ADV: bij,it:',
288 & bi,bj,myIter, ' ; Npts,aveDiff,Epsil=',
289 & INT(sumVar1),sumVar2/sumVar1,vol_Epsil
290 ENDIF
291 #endif
292 #ifdef ALLOW_DIAGNOSTICS
293 C-- Diagnosse advective fluxes (ice-fraction, snow & ice thickness):
294 IF ( useDiagnostics ) THEN
295 diagSufx = THSICE_DIAG_SUFX( GAD_SI_FRAC, myThid )
296 diagName = 'ADVx'//diagSufx
297 CALL DIAGNOSTICS_FILL( uTrans, diagName, 1,1,2,bi,bj, myThid )
298 diagName = 'ADVy'//diagSufx
299 CALL DIAGNOSTICS_FILL( vTrans, diagName, 1,1,2,bi,bj, myThid )
300
301 diagSufx = THSICE_DIAG_SUFX( GAD_SI_HSNOW, myThid )
302 diagName = 'ADVx'//diagSufx
303 CALL DIAGNOSTICS_FILL( afx, diagName, 1,1,2,bi,bj, myThid )
304 diagName = 'ADVy'//diagSufx
305 CALL DIAGNOSTICS_FILL( afy, diagName, 1,1,2,bi,bj, myThid )
306
307 diagSufx = THSICE_DIAG_SUFX( GAD_SI_HICE, myThid )
308 diagName = 'ADVx'//diagSufx
309 CALL DIAGNOSTICS_FILL( uTrIce, diagName, 1,1,2,bi,bj, myThid )
310 diagName = 'ADVy'//diagSufx
311 CALL DIAGNOSTICS_FILL( vTrIce, diagName, 1,1,2,bi,bj, myThid )
312 ENDIF
313 #endif
314
315 C-- Enthalpy in layer 1
316 DO j=1-Oly,sNy+Oly
317 DO i=1-Olx,sNx+Olx
318 iceVol(i,j) = oldVol(i,j)
319 ENDDO
320 ENDDO
321 CALL THSICE_ADVECTION(
322 I GAD_SI_QICE1, thSIceAdvScheme, .FALSE.,
323 I uTrIce, vTrIce, maskOce, thSIce_deltaT, vol_Epsil,
324 U iceVol, Qice1(1-Olx,1-Oly,bi,bj),
325 O afx, afy,
326 I bi, bj, myTime, myIter, myThid )
327 #ifdef ALLOW_DBUG_THSICE
328 IF ( dBugFlag ) THEN
329 DO j=1,sNy
330 DO i=1,sNx
331 IF ( dBug(i,j,bi,bj) ) THEN
332 c WRITE(6,'(A,1P4E14.6)') 'ICE_ADV: Qice1_b,a=',
333 c & Qice1(i,j,bi,bj),
334 c & ( iceFld(i,j) + thSIce_deltaT * gFld(i,j)
335 c & ) * recip_heff(i,j)
336 c WRITE(6,'(A,1P4E14.6)') 'ICE_ADV: q1Fx=', gFld(i,j)
337 ENDIF
338 ENDDO
339 ENDDO
340 ENDIF
341 #endif
342 #ifdef ALLOW_DIAGNOSTICS
343 IF ( useDiagnostics ) THEN
344 diagSufx = THSICE_DIAG_SUFX( GAD_SI_QICE1, myThid )
345 diagName = 'ADVx'//diagSufx
346 CALL DIAGNOSTICS_FILL( afx, diagName, 1,1,2,bi,bj, myThid )
347 diagName = 'ADVy'//diagSufx
348 CALL DIAGNOSTICS_FILL( afy, diagName, 1,1,2,bi,bj, myThid )
349 ENDIF
350 #endif
351
352 C-- Enthalpy in layer 2
353 DO j=1-Oly,sNy+Oly
354 DO i=1-Olx,sNx+Olx
355 iceVol(i,j) = oldVol(i,j)
356 ENDDO
357 ENDDO
358 CALL THSICE_ADVECTION(
359 I GAD_SI_QICE2, thSIceAdvScheme, .FALSE.,
360 I uTrIce, vTrIce, maskOce, thSIce_deltaT, vol_Epsil,
361 U iceVol, Qice2(1-Olx,1-Oly,bi,bj),
362 O afx, afy,
363 I bi, bj, myTime, myIter, myThid )
364 #ifdef ALLOW_DBUG_THSICE
365 IF ( dBugFlag ) THEN
366 sumVar1 = 0.
367 sumVar2 = 0.
368 DO j=1,sNy
369 DO i=1,sNx
370 C- Check that updated iceVol = Hic*Frc*rA
371 tmpVar = ABS(iceVol(i,j)
372 & -iceHeight(i,j,bi,bj)*iceFrc(i,j)*rA(i,j,bi,bj))
373 IF ( tmpVar.GT.0. ) THEN
374 sumVar1 = sumVar1 + 1.
375 sumVar2 = sumVar2 + tmpVar
376 ENDIF
377 IF ( tmpVar.GT.vol_Epsil ) THEN
378 WRITE(6,'(A,2I4,2I2,I12)') 'VOL_ADV: ij,bij,it=',
379 & i,j,bi,bj,myIter
380 WRITE(6,'(2(A,1P2E14.6))') 'VOL_ADV: iceVol,Hic*Frc*rA=',
381 & iceVol(i,j),iceHeight(i,j,bi,bj)*iceFrc(i,j)*rA(i,j,bi,bj),
382 & ' , diff=', tmpVar
383 ENDIF
384 IF ( dBug(i,j,bi,bj) ) THEN
385 c WRITE(6,'(A,1P4E14.6)') 'ICE_ADV: Qice2_b,a=',
386 c & Qice2(i,j,bi,bj),
387 c & ( iceFld(i,j) + thSIce_deltaT * gFld(i,j)
388 c & ) * recip_heff(i,j)
389 c WRITE(6,'(A,1P4E14.6)') 'ICE_ADV: q2Fx=', gFld(i,j)
390 ENDIF
391 ENDDO
392 ENDDO
393 IF ( sumVar2.GT.vol_Epsil )
394 & WRITE(6,'(A,2I2,I10,A,I4,1P2E14.6)') 'VOL_ADV: bij,it:',
395 & bi,bj,myIter, ' ; Npts,aveDiff,Epsil=',
396 & INT(sumVar1),sumVar2/sumVar1,vol_Epsil
397 ENDIF
398 #endif
399 #ifdef ALLOW_DIAGNOSTICS
400 IF ( useDiagnostics ) THEN
401 diagSufx = THSICE_DIAG_SUFX( GAD_SI_QICE2, myThid )
402 diagName = 'ADVx'//diagSufx
403 CALL DIAGNOSTICS_FILL( afx, diagName, 1,1,2,bi,bj, myThid )
404 diagName = 'ADVy'//diagSufx
405 CALL DIAGNOSTICS_FILL( afy, diagName, 1,1,2,bi,bj, myThid )
406 ENDIF
407 #endif
408
409 #ifdef ALLOW_AUTODIFF_TAMC
410 CADJ STORE iceHeight(:,:,bi,bj) =
411 CADJ & comlev1_bibj, key=iicekey, byte=isbyte
412 CADJ STORE snowHeight(:,:,bi,bj) =
413 CADJ & comlev1_bibj, key=iicekey, byte=isbyte
414 CADJ STORE iceFrc(:,:) =
415 CADJ & comlev1_bibj, key=iicekey, byte=isbyte
416 #endif
417
418 C-- Update Ice Fraction: ensure that fraction is > iceMaskMin & < 1
419 C and adjust Ice thickness and snow thickness accordingly
420 DO j=1,sNy
421 DO i=1,sNx
422 IF ( iceFrc(i,j) .GT. 1. _d 0 ) THEN
423 c IF ( dBug(i,j,bi,bj) )
424 iceMask(i,j,bi,bj) = 1. _d 0
425 iceHeight(i,j,bi,bj) = iceHeight(i,j,bi,bj) *iceFrc(i,j)
426 snowHeight(i,j,bi,bj) = snowHeight(i,j,bi,bj)*iceFrc(i,j)
427 ELSEIF ( iceFrc(i,j) .LT. iceMaskMin ) THEN
428 c IF ( dBug(i,j,bi,bj) )
429 iceMask(i,j,bi,bj) = iceMaskMin
430 iceHeight(i,j,bi,bj) = iceHeight(i,j,bi,bj)
431 & *iceFrc(i,j)*r_minArea
432 snowHeight(i,j,bi,bj) = snowHeight(i,j,bi,bj)
433 & *iceFrc(i,j)*r_minArea
434 ELSE
435 iceMask(i,j,bi,bj) = iceFrc(i,j)
436 ENDIF
437 ENDDO
438 ENDDO
439 C- adjust sea-ice state if not enough ice.
440 DO j=1,sNy
441 DO i=1,sNx
442 IF ( iceHeight(i,j,bi,bj).LT.hIceMin ) THEN
443 C- Not enough ice, melt the tiny amount of snow & ice:
444 C and return fresh-water, salt & energy to the ocean (flx > 0 = into ocean)
445 C- - Note: using 1rst.Order Upwind, I can get the same results as when
446 C using seaice_advdiff (with SEAICEadvScheme=1) providing I comment
447 C out the following lines (and then loose conservation).
448 C- -
449 oceFWfx(i,j,bi,bj) = ( rhos*snowHeight(i,j,bi,bj)
450 & +rhoi*iceHeight(i,j,bi,bj)
451 & )*iceMask(i,j,bi,bj)/thSIce_deltaT
452 oceSflx(i,j,bi,bj) = rhoi*iceHeight(i,j,bi,bj)*saltIce
453 & *iceMask(i,j,bi,bj)/thSIce_deltaT
454 oceQnet(i,j,bi,bj) = -( rhos*snowHeight(i,j,bi,bj)*qsnow
455 & +rhoi*iceHeight(i,j,bi,bj)
456 & *( Qice1(i,j,bi,bj)
457 & +Qice2(i,j,bi,bj) )*0.5 _d 0
458 & )*iceMask(i,j,bi,bj)/thSIce_deltaT
459 c IF ( dBug(i,j,bi,bj) )
460 C- -
461 c flx2oc (i,j) = flx2oc (i,j) +
462 c frw2oc (i,j) = frw2oc (i,j) +
463 c fsalt (i,j) = fsalt (i,j) +
464 iceMask (i,j,bi,bj) = 0. _d 0
465 iceHeight (i,j,bi,bj) = 0. _d 0
466 snowHeight(i,j,bi,bj) = 0. _d 0
467 Qice1 (i,j,bi,bj) = 0. _d 0
468 Qice2 (i,j,bi,bj) = 0. _d 0
469 snowAge (i,j,bi,bj) = 0. _d 0
470 ENDIF
471 ENDDO
472 ENDDO
473
474 #ifdef ALLOW_DBUG_THSICE
475 IF ( dBugFlag ) THEN
476 DO j=1,sNy
477 DO i=1,sNx
478 IF ( dBug(i,j,bi,bj) ) THEN
479 WRITE(6,'(2(A,1P2E14.6))')
480 c & 'ICE_ADV: area_b,a=', AREA(i,j,2,bi,bj),AREA(i,j,1,bi,bj)
481 c WRITE(6,'(A,1P4E14.6)') 'ICE_ADV: mFx=', gFld(i,j)
482 ENDIF
483 ENDDO
484 ENDDO
485 ENDIF
486 #endif
487
488 ELSE
489 C--- if not multiDimAdvection
490
491 WRITE(msgBuf,'(2A)') 'S/R THSICE_ADVDIFF: ',
492 & 'traditional advection/diffusion not yet implemented'
493 CALL PRINT_ERROR( msgBuf , myThid)
494 WRITE(msgBuf,'(2A)') ' ',
495 & 'for ThSice variable Qice1, Qice2, SnowHeight. Sorry!'
496 CALL PRINT_ERROR( msgBuf , myThid)
497 STOP 'ABNORMAL: END: S/R THSICE_ADVDIFF'
498
499 C--- end if multiDimAdvection
500 ENDIF
501
502 #ifdef ALLOW_DIAGNOSTICS
503 IF ( useDiagnostics ) THEN
504 CALL DIAGNOSTICS_FILL(iceMask,'SI_AdvFr',0,1,1,bi,bj,myThid)
505 C- Ice-fraction weighted quantities:
506 tmpFac = 1. _d 0
507 CALL DIAGNOSTICS_FRACT_FILL(
508 I iceHeight, iceMask,tmpFac,1,'SI_AdvHi',
509 I 0,1,1,bi,bj,myThid)
510 CALL DIAGNOSTICS_FRACT_FILL(
511 I snowHeight,iceMask,tmpFac,1,'SI_AdvHs',
512 I 0,1,1,bi,bj,myThid)
513 C- Ice-Volume weighted quantities:
514 IF ( DIAGNOSTICS_IS_ON('SI_AdvQ1',myThid) .OR.
515 & DIAGNOSTICS_IS_ON('SI_AdvQ2',myThid) ) THEN
516 DO j=1,sNy
517 DO i=1,sNx
518 iceVol(i,j) = iceMask(i,j,bi,bj)*iceHeight(i,j,bi,bj)
519 ENDDO
520 ENDDO
521 CALL DIAGNOSTICS_FRACT_FILL(
522 I Qice1(1-OLx,1-OLy,bi,bj),
523 I iceVol,tmpFac,1,'SI_AdvQ1',
524 I 0,1,2,bi,bj,myThid)
525 CALL DIAGNOSTICS_FRACT_FILL(
526 I Qice2(1-OLx,1-OLy,bi,bj),
527 I iceVol,tmpFac,1,'SI_AdvQ2',
528 I 0,1,2,bi,bj,myThid)
529 ENDIF
530 ENDIF
531 #endif /* ALLOW_DIAGNOSTICS */
532
533 #endif /* ALLOW_THSICE */
534
535 RETURN
536 END

  ViewVC Help
Powered by ViewVC 1.1.22