/[MITgcm]/MITgcm/pkg/seaice/seaice_tracer_phys.F
ViewVC logotype

Annotation of /MITgcm/pkg/seaice/seaice_tracer_phys.F

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


Revision 1.11 - (hide annotations) (download)
Sat Aug 23 20:22:16 2014 UTC (10 years, 10 months ago) by torge
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65h, checkpoint65i, checkpoint65n, checkpoint65o, checkpoint65l, checkpoint65m, checkpoint65c, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e, HEAD
Changes since 1.10: +5 -3 lines
Introducing a new parameterization for grease ice,
 i.e. newly formed sea ice in open water:

What it does:
 The grease ice parameterization delays formation of solid
 sea ice from frazil ice by a time constant and provides a
 dynamic calculation of the initial solid sea ice thickness
 HO as a function of winds, currents and available grease ice
 volume. Grease ice does not significantly reduce heat loss
 from the ocean in winter and area covered by grease is thus
 handled like open water.
 (for details see Smedsrud and Martin, 2014, Ann.Glac.)

How to use:
- enable SEAICE_GREASE in SEAICE_OPTIONS.h
- set SItrName(1) = 'grease' in namelist SEAICE_PARM03 in data.seaice
  then output SItr01 is SItrNameLong(1) = 'grease ice volume fraction',
  with SItrUnit(1) = '[0-1]', which needs to be multiplied by SIheff
  to yield grease ice volume.
- additionally, the actual grease ice layer thickness
  (diagnostic SIgrsLT) can be saved.

1 torge 1.11 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_tracer_phys.F,v 1.10 2013/08/11 02:31:12 jmc Exp $
2 gforget 1.1 C $Name: $
3    
4     #include "SEAICE_OPTIONS.h"
5    
6     CStartOfInterface
7     SUBROUTINE SEAICE_TRACER_PHYS( myTime, myIter, myThid )
8 jmc 1.7 C *=======================================================*
9     C | SUBROUTINE seaice_tracer_phys
10     C | o Time step SItr/SItrEFF as a result of
11     C | seaice thermodynamics and specific tracer physics
12     C *=======================================================*
13 gforget 1.1 IMPLICIT NONE
14    
15     C === Global variables ===
16     #include "SIZE.h"
17     #include "EEPARAMS.h"
18 jmc 1.10 #include "PARAMS.h"
19 gforget 1.1 #include "FFIELDS.h"
20     #include "DYNVARS.h"
21     #include "SEAICE_SIZE.h"
22     #include "SEAICE.h"
23     #include "SEAICE_PARAMS.h"
24     #include "SEAICE_TRACER.h"
25 gforget 1.6 #ifdef ALLOW_SALT_PLUME
26     # include "SALT_PLUME.h"
27     #endif
28 gforget 1.1
29     C === Routine arguments ===
30     C INPUT:
31     C myTime :: Simulation time
32     C myIter :: Simulation timestep number
33     C myThid :: Thread no. that called this routine.
34     C OUTPUT:
35     _RL myTime
36     INTEGER myIter, myThid
37     CEndOfInterface
38    
39     C === Local variables ===
40     #ifdef ALLOW_SITRACER
41    
42     INTEGER iTr, jTh, I, J, bi, bj, ks
43     _RL SItrFromOcean (1:sNx,1:sNy)
44 gforget 1.2 _RL SItrFromFlood (1:sNx,1:sNy)
45 gforget 1.1 _RL HEFFprev, HEFFpost, growFact, meltPart, tmpscal1
46 gforget 1.2 _RL SItrExpand (1:sNx,1:sNy)
47     _RL AREAprev, AREApost, expandFact
48 gforget 1.3 CHARACTER*8 diagName
49 gforget 1.1
50 gforget 1.3 #ifdef ALLOW_SITRACER_DEBUG_DIAG
51 gforget 1.1 _RL DIAGarray (1:sNx,1:sNy,Nr)
52     #endif
53    
54     cgf for now I do not fully account for ocean-ice fluxes of tracer
55     cgf -> I just prescribe it consistent with age tracer
56     cgf eventually I will need to handle them as function params
57    
58     ks=1
59    
60     DO bj=myByLo(myThid),myByHi(myThid)
61     DO bi=myBxLo(myThid),myBxHi(myThid)
62 gforget 1.6 DO iTr=1,SItrNumInUse
63 gforget 1.1
64 jmc 1.4 c 0) set ice-ocean and ice-snow exchange values
65 gforget 1.1 c =============================================
66     DO J=1,sNy
67     DO I=1,sNx
68 gforget 1.6 SItrFromOcean(i,j)=SItrFromOcean0(iTr)
69     SItrFromFlood(i,j)=SItrFromFlood0(iTr)
70     SItrExpand(i,j)=SItrExpand0(iTr)
71 gforget 1.1 ENDDO
72     ENDDO
73 jmc 1.4 c salinity tracer:
74 jmc 1.7 if ( (SItrName(iTr).EQ.'salinity').AND.
75 gforget 1.6 & (SItrFromOceanFrac(iTr).GT.ZERO) ) then
76 gforget 1.1 DO J=1,sNy
77     DO I=1,sNx
78 gforget 1.6 SItrFromOcean(i,j)=SItrFromOceanFrac(iTr)*salt(I,j,ks,bi,bj)
79     SItrFromFlood(i,j)=SItrFromFloodFrac(iTr)*salt(I,j,ks,bi,bj)
80 gforget 1.1 ENDDO
81     ENDDO
82     endif
83     c 1) seaice thermodynamics processes
84     c ==================================
85 gforget 1.2 if (SItrMate(iTr).EQ.'HEFF') then
86 gforget 1.1 DO J=1,sNy
87     DO I=1,sNx
88     HEFFprev=SItrHEFF(i,j,bi,bj,1)
89 gforget 1.3 #ifdef ALLOW_SITRACER_DEBUG_DIAG
90 jmc 1.4 DIAGarray(I,J,5+(iTr-1)*5) =
91 gforget 1.1 & HEFFprev*SItracer(i,j,bi,bj,iTr) + SItrBucket(i,j,bi,bj,iTr)
92     #endif
93 torge 1.11 c apply the sequence of thermodynamics increments to actual tracer
94 gforget 1.1 c (see seaice_growth.F)
95     c (jTh=1 tendency due to ice-ocean interaction)
96     c (jTh=2 tendency due to the atmosphere, over ice covered part)
97     c (jTh=3 tendency due to the atmosphere, over open water part)
98     c (jTh=4 tendency due to flooding)
99     DO jTh=1,3
100     HEFFprev=SItrHEFF(i,j,bi,bj,jTh)
101     HEFFpost=SItrHEFF(i,j,bi,bj,jTh+1)
102     c compute ratio in [0. 1.] range for either growth or melt
103     growFact=1. _d 0
104     meltPart=0. _d 0
105     if (HEFFpost.GT.HEFFprev) growFact=HEFFprev/HEFFpost
106     if (HEFFpost.LT.HEFFprev) meltPart=HEFFprev-HEFFpost
107     c update SItr accordingly
108     SItracer(i,j,bi,bj,iTr)=SItracer(i,j,bi,bj,iTr)*growFact
109     & +SItrFromOcean(i,j)*(1. _d 0 - growFact)
110     SItrBucket(i,j,bi,bj,iTr)=SItrBucket(i,j,bi,bj,iTr)
111     & -HEFFpost*SItrFromOcean(i,j)*(1. _d 0 - growFact)
112     SItrBucket(i,j,bi,bj,iTr)=SItrBucket(i,j,bi,bj,iTr)
113     & +meltPart*SItracer(i,j,bi,bj,iTr)
114     ENDDO
115     c apply flooding term
116     growFact=1. _d 0
117     HEFFprev=SItrHEFF(i,j,bi,bj,4)
118     HEFFpost=SItrHEFF(i,j,bi,bj,5)
119     if (HEFFpost.GT.HEFFprev) growFact=HEFFprev/HEFFpost
120     SItracer(i,j,bi,bj,iTr)=SItracer(i,j,bi,bj,iTr)*growFact
121 gforget 1.2 & +SItrFromFlood(i,j) *(1. _d 0 - growFact)
122     c rk: flooding can only imply an ocean-ice tracer exchange, as long
123     c as we dont have snow tracers, so it goes through SItrBucket.
124 gforget 1.1 SItrBucket(i,j,bi,bj,iTr)=SItrBucket(i,j,bi,bj,iTr)
125 gforget 1.2 & -HEFFpost*SItrFromFlood(i,j)*(1. _d 0 - growFact)
126 gforget 1.3 #ifdef ALLOW_SITRACER_DEBUG_DIAG
127 jmc 1.4 DIAGarray(I,J,5+(iTr-1)*5) = HEFFpost*SItracer(i,j,bi,bj,iTr)
128 gforget 1.3 & +SItrBucket(i,j,bi,bj,iTr)-DIAGarray(I,J,5+(iTr-1)*5)
129 gforget 1.1 #endif
130     ENDDO
131     ENDDO
132 gforget 1.2 c TAF? if (SItrMate(iTr).EQ.'AREA') then
133     else
134     c 1) or seaice cover expansion
135     c ============================
136 jmc 1.4 c this is much simpler than for ice volume/mass tracers, because
137     c properties of the ice surface are not be conserved across the
138 gforget 1.2 c ocean-ice system, the contraction/expansion terms are all
139 jmc 1.4 c simultaneous (which is sane), and the only generic effect
140 gforget 1.2 c is due to expansion (new cover).
141     DO J=1,sNy
142     DO I=1,sNx
143     c apply expansion
144     AREAprev=SItrAREA(i,j,bi,bj,2)
145     AREApost=SItrAREA(i,j,bi,bj,3)
146     c compute ratio in [0. 1.] range for expansion/contraction
147     expandFact=1. _d 0
148     if (AREApost.GT.AREAprev) expandFact=AREAprev/AREApost
149     c update SItr accordingly
150     SItracer(i,j,bi,bj,iTr)=SItracer(i,j,bi,bj,iTr)*expandFact
151     & +SItrExpand(i,j)*(1. _d 0 - expandFact)
152     ENDDO
153     ENDDO
154     endif
155 gforget 1.1 c 2) very ice tracer processes
156     c ============================
157     if (SItrName(iTr).EQ.'age') then
158     c age tracer: grow old as time passes by
159     DO J=1,sNy
160     DO I=1,sNx
161 gforget 1.2 if (( (SItrHEFF(i,j,bi,bj,5).GT.0. _d 0).AND.(SItrMate(iTr)
162     & .EQ.'HEFF') ).OR.( (SItrAREA(i,j,bi,bj,3).GT.0. _d 0).AND.
163     & (SItrMate(iTr).EQ.'AREA') )) then
164 gforget 1.1 SItracer(i,j,bi,bj,iTr)=
165     & SItracer(i,j,bi,bj,iTr)+SEAICE_deltaTtherm
166     else
167     SItracer(i,j,bi,bj,iTr)=0. _d 0
168     endif
169     ENDDO
170     ENDDO
171     elseif (SItrName(iTr).EQ.'salinity') then
172     c salinity tracer: no specific process
173     elseif (SItrName(iTr).EQ.'one') then
174     c "ice concentration" tracer: no specific process
175 gforget 1.2 elseif (SItrName(iTr).EQ.'ridge') then
176     c simple, made up, ice surface roughness index prototype
177     DO J=1,sNy
178     DO I=1,sNx
179     c ridging increases roughness
180     SItracer(i,j,bi,bj,iTr)=SItracer(i,j,bi,bj,iTr)+
181     & MAX(0. _d 0, SItrAREA(i,j,bi,bj,1)-SItrAREA(i,j,bi,bj,2))
182     c ice melt reduces ridges/roughness
183     HEFFprev=SItrHEFF(i,j,bi,bj,1)
184     HEFFpost=SItrHEFF(i,j,bi,bj,4)
185     tmpscal1=1. _d 0
186     if (HEFFprev.GT.HEFFpost) tmpscal1=HEFFpost/HEFFprev
187     SItracer(i,j,bi,bj,iTr)=SItracer(i,j,bi,bj,iTr)*tmpscal1
188     ENDDO
189     ENDDO
190 gforget 1.1 endif
191 gforget 1.2 c 3) ice-ocean tracer exchange/mapping to external variables
192     c ==========================================================
193 gforget 1.3 #ifdef ALLOW_DIAGNOSTICS
194 jmc 1.10 IF ( useDiagnostics .AND. SItrMate(iTr).EQ.'HEFF') THEN
195 gforget 1.8 WRITE(diagName,'(A4,I2.2,A2)') 'SItr',iTr,'Fx'
196 gforget 1.3 tmpscal1=-ONE/SEAICE_deltaTtherm*SEAICE_rhoIce
197 jmc 1.7 CALL DIAGNOSTICS_SCALE_FILL(SItrBucket(1-OLx,1-OLy,bi,bj,iTr),
198 gforget 1.3 & tmpscal1, 1, diagName,0,1,2,bi,bj,myThid)
199 jmc 1.10 ENDIF
200 gforget 1.3 #endif
201 gforget 1.6
202     if ( (SItrName(iTr).EQ.'salinity').AND.
203     & (SEAICE_salinityTracer) ) then
204 gforget 1.1 c salinity tracer: salt flux
205 gforget 1.6 DO J=1,sNy
206     DO I=1,sNx
207     saltFlux(I,J,bi,bj) = - SItrBucket(i,j,bi,bj,iTr)
208     & *HEFFM(I,J,bi,bj)/SEAICE_deltaTtherm*SEAICE_rhoIce
209 gforget 1.1 c note: at this point of the time step, that is the correct sign
210 gforget 1.6 #ifdef ALLOW_SALT_PLUME
211     c should work for both constant and variable ice salinity -- to be tested
212 jmc 1.7 saltPlumeFlux(I,J,bi,bj) = MAX(ZERO,saltFlux(I,J,bi,bj))
213 gforget 1.6 & *SPsalFRAC*(salt(I,j,ks,bi,bj)-SItrFromOcean(i,j))
214     #endif
215     ENDDO
216     ENDDO
217 gforget 1.1 endif
218 jmc 1.7
219 gforget 1.1 DO J=1,sNy
220     DO I=1,sNx
221 gforget 1.3 #ifdef ALLOW_SITRACER_DEBUG_DIAG
222     DIAGarray(I,J,4+(iTr-1)*5) = - SItrBucket(i,j,bi,bj,iTr)
223 gforget 1.1 & *HEFFM(I,J,bi,bj)/SEAICE_deltaTtherm*SEAICE_rhoIce
224     #endif
225     c empty bucket
226 torge 1.11 c but not for 'grease' (see seaice_growth.F)
227     if (SItrName(iTr).NE.'grease')
228     & SItrBucket(i,j,bi,bj,iTr)=0. _d 0
229 gforget 1.1 ENDDO
230     ENDDO
231 jmc 1.7
232 gforget 1.2 c TAF? elseif (SItrMate(iTr).EQ.'AREA') then
233 gforget 1.6
234 gforget 1.1 c 4) diagnostics
235     c ==============
236 gforget 1.3 #ifdef ALLOW_SITRACER_DEBUG_DIAG
237 gforget 1.2 if (SItrMate(iTr).EQ.'HEFF') then
238 gforget 1.1 DO J=1,sNy
239     DO I=1,sNx
240     HEFFpost=SItrHEFF(i,j,bi,bj,5)
241     DIAGarray(I,J,1+(iTr-1)*5) = SItracer(i,j,bi,bj,iTr)
242     DIAGarray(I,J,2+(iTr-1)*5) = SItracer(i,j,bi,bj,iTr)*HEFFpost
243 gforget 1.3 c DIAGarray(:,:,3) is the term of comparison for DIAGarray(:,:,2)
244 gforget 1.5 if (SItrName(iTr).EQ.'salinity') then
245 gforget 1.1 DIAGarray(I,J,3+(iTr-1)*5) = HSALT(i,j,bi,bj)/SEAICE_rhoIce
246     elseif (SItrName(iTr).EQ.'one') then
247     DIAGarray(I,J,3+(iTr-1)*5) = HEFFpost
248     endif
249 gforget 1.3 c DIAGarray(:,:,4) allows check of conservation : del(SItrBucket)+del(SItr*HEFF)=0. over do_phys
250     c DIAGarray(:,:,5) is the tracer flux from the ocean (<0 incr. ocean tracer)
251 gforget 1.1 ENDDO
252     ENDDO
253 gforget 1.2 else
254     DO J=1,sNy
255     DO I=1,sNx
256     AREApost=SItrAREA(i,j,bi,bj,3)
257     DIAGarray(I,J,1+(iTr-1)*5) = SItracer(i,j,bi,bj,iTr)
258     DIAGarray(I,J,2+(iTr-1)*5) = SItracer(i,j,bi,bj,iTr)*AREApost
259     ENDDO
260     ENDDO
261     endif
262 gforget 1.1 #endif
263     ENDDO
264 gforget 1.3 #ifdef ALLOW_SITRACER_DEBUG_DIAG
265 jmc 1.4 c CALL DIAGNOSTICS_FILL(DIAGarray,'UDIAG1 ',0,Nr,3,bi,bj,myThid)
266 gforget 1.1 #endif
267     ENDDO
268     ENDDO
269    
270     #endif /* ALLOW_SITRACER */
271    
272     RETURN
273     END

  ViewVC Help
Powered by ViewVC 1.1.22