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

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

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


Revision 1.11 - (show annotations) (download)
Sat Aug 23 20:22:16 2014 UTC (9 years, 9 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 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_tracer_phys.F,v 1.10 2013/08/11 02:31:12 jmc Exp $
2 C $Name: $
3
4 #include "SEAICE_OPTIONS.h"
5
6 CStartOfInterface
7 SUBROUTINE SEAICE_TRACER_PHYS( myTime, myIter, myThid )
8 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 IMPLICIT NONE
14
15 C === Global variables ===
16 #include "SIZE.h"
17 #include "EEPARAMS.h"
18 #include "PARAMS.h"
19 #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 #ifdef ALLOW_SALT_PLUME
26 # include "SALT_PLUME.h"
27 #endif
28
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 _RL SItrFromFlood (1:sNx,1:sNy)
45 _RL HEFFprev, HEFFpost, growFact, meltPart, tmpscal1
46 _RL SItrExpand (1:sNx,1:sNy)
47 _RL AREAprev, AREApost, expandFact
48 CHARACTER*8 diagName
49
50 #ifdef ALLOW_SITRACER_DEBUG_DIAG
51 _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 DO iTr=1,SItrNumInUse
63
64 c 0) set ice-ocean and ice-snow exchange values
65 c =============================================
66 DO J=1,sNy
67 DO I=1,sNx
68 SItrFromOcean(i,j)=SItrFromOcean0(iTr)
69 SItrFromFlood(i,j)=SItrFromFlood0(iTr)
70 SItrExpand(i,j)=SItrExpand0(iTr)
71 ENDDO
72 ENDDO
73 c salinity tracer:
74 if ( (SItrName(iTr).EQ.'salinity').AND.
75 & (SItrFromOceanFrac(iTr).GT.ZERO) ) then
76 DO J=1,sNy
77 DO I=1,sNx
78 SItrFromOcean(i,j)=SItrFromOceanFrac(iTr)*salt(I,j,ks,bi,bj)
79 SItrFromFlood(i,j)=SItrFromFloodFrac(iTr)*salt(I,j,ks,bi,bj)
80 ENDDO
81 ENDDO
82 endif
83 c 1) seaice thermodynamics processes
84 c ==================================
85 if (SItrMate(iTr).EQ.'HEFF') then
86 DO J=1,sNy
87 DO I=1,sNx
88 HEFFprev=SItrHEFF(i,j,bi,bj,1)
89 #ifdef ALLOW_SITRACER_DEBUG_DIAG
90 DIAGarray(I,J,5+(iTr-1)*5) =
91 & HEFFprev*SItracer(i,j,bi,bj,iTr) + SItrBucket(i,j,bi,bj,iTr)
92 #endif
93 c apply the sequence of thermodynamics increments to actual tracer
94 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 & +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 SItrBucket(i,j,bi,bj,iTr)=SItrBucket(i,j,bi,bj,iTr)
125 & -HEFFpost*SItrFromFlood(i,j)*(1. _d 0 - growFact)
126 #ifdef ALLOW_SITRACER_DEBUG_DIAG
127 DIAGarray(I,J,5+(iTr-1)*5) = HEFFpost*SItracer(i,j,bi,bj,iTr)
128 & +SItrBucket(i,j,bi,bj,iTr)-DIAGarray(I,J,5+(iTr-1)*5)
129 #endif
130 ENDDO
131 ENDDO
132 c TAF? if (SItrMate(iTr).EQ.'AREA') then
133 else
134 c 1) or seaice cover expansion
135 c ============================
136 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 c ocean-ice system, the contraction/expansion terms are all
139 c simultaneous (which is sane), and the only generic effect
140 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 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 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 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 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 endif
191 c 3) ice-ocean tracer exchange/mapping to external variables
192 c ==========================================================
193 #ifdef ALLOW_DIAGNOSTICS
194 IF ( useDiagnostics .AND. SItrMate(iTr).EQ.'HEFF') THEN
195 WRITE(diagName,'(A4,I2.2,A2)') 'SItr',iTr,'Fx'
196 tmpscal1=-ONE/SEAICE_deltaTtherm*SEAICE_rhoIce
197 CALL DIAGNOSTICS_SCALE_FILL(SItrBucket(1-OLx,1-OLy,bi,bj,iTr),
198 & tmpscal1, 1, diagName,0,1,2,bi,bj,myThid)
199 ENDIF
200 #endif
201
202 if ( (SItrName(iTr).EQ.'salinity').AND.
203 & (SEAICE_salinityTracer) ) then
204 c salinity tracer: salt flux
205 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 c note: at this point of the time step, that is the correct sign
210 #ifdef ALLOW_SALT_PLUME
211 c should work for both constant and variable ice salinity -- to be tested
212 saltPlumeFlux(I,J,bi,bj) = MAX(ZERO,saltFlux(I,J,bi,bj))
213 & *SPsalFRAC*(salt(I,j,ks,bi,bj)-SItrFromOcean(i,j))
214 #endif
215 ENDDO
216 ENDDO
217 endif
218
219 DO J=1,sNy
220 DO I=1,sNx
221 #ifdef ALLOW_SITRACER_DEBUG_DIAG
222 DIAGarray(I,J,4+(iTr-1)*5) = - SItrBucket(i,j,bi,bj,iTr)
223 & *HEFFM(I,J,bi,bj)/SEAICE_deltaTtherm*SEAICE_rhoIce
224 #endif
225 c empty bucket
226 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 ENDDO
230 ENDDO
231
232 c TAF? elseif (SItrMate(iTr).EQ.'AREA') then
233
234 c 4) diagnostics
235 c ==============
236 #ifdef ALLOW_SITRACER_DEBUG_DIAG
237 if (SItrMate(iTr).EQ.'HEFF') then
238 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 c DIAGarray(:,:,3) is the term of comparison for DIAGarray(:,:,2)
244 if (SItrName(iTr).EQ.'salinity') then
245 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 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 ENDDO
252 ENDDO
253 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 #endif
263 ENDDO
264 #ifdef ALLOW_SITRACER_DEBUG_DIAG
265 c CALL DIAGNOSTICS_FILL(DIAGarray,'UDIAG1 ',0,Nr,3,bi,bj,myThid)
266 #endif
267 ENDDO
268 ENDDO
269
270 #endif /* ALLOW_SITRACER */
271
272 RETURN
273 END

  ViewVC Help
Powered by ViewVC 1.1.22