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

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

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


Revision 1.11 - (hide annotations) (download)
Fri Dec 17 04:00:14 2010 UTC (13 years, 4 months ago) by gforget
Branch: MAIN
CVS Tags: checkpoint62s, checkpoint62r, checkpoint62q, checkpoint62p, checkpoint62w, checkpoint62v, checkpoint62u, checkpoint62t, checkpoint62y, checkpoint62x
Changes since 1.10: +15 -15 lines
rename iicekey as ticekey to avoid conflict with pkg/seaice

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

  ViewVC Help
Powered by ViewVC 1.1.22