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

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

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


Revision 1.83 - (show annotations) (download)
Thu Nov 18 17:32:37 2010 UTC (13 years, 6 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62r, checkpoint62q, checkpoint62p, checkpoint62o
Changes since 1.82: +6 -11 lines
switch some test on debugLevel value to debugMode test

1 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_model.F,v 1.82 2010/11/08 17:38:04 jmc Exp $
2 C $Name: $
3
4 #include "SEAICE_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: SEAICE_MODEL
8
9 C !INTERFACE: ==========================================================
10 SUBROUTINE SEAICE_MODEL( myTime, myIter, myThid )
11
12 C !DESCRIPTION: \bv
13 C *===========================================================*
14 C | SUBROUTINE SEAICE_MODEL |
15 C | o Time stepping of a dynamic/thermodynamic sea ice model. |
16 C | Dynamics solver: Zhang/Hibler, JGR, 102, 8691-8702, 1997 |
17 C | Thermodynamics: Hibler, MWR, 108, 1943-1973, 1980 |
18 C | Rheology: Hibler, JPO, 9, 815- 846, 1979 |
19 C | Snow: Zhang et al. , JPO, 28, 191- 217, 1998 |
20 C | Parallel forward ice model written by Jinlun Zhang PSC/UW|
21 C | & coupled into MITgcm by Dimitris Menemenlis (JPL) 2/2001|
22 C | zhang@apl.washington.edu / menemenlis@jpl.nasa.gov |
23 C *===========================================================*
24 C *===========================================================*
25 IMPLICIT NONE
26 C \ev
27
28 C !USES: ===============================================================
29 #include "SIZE.h"
30 #include "EEPARAMS.h"
31 #include "DYNVARS.h"
32 #include "PARAMS.h"
33 #include "GRID.h"
34 #include "FFIELDS.h"
35 #include "SEAICE.h"
36 #include "SEAICE_PARAMS.h"
37 #ifdef ALLOW_EXF
38 # include "EXF_OPTIONS.h"
39 # include "EXF_FIELDS.h"
40 #endif
41 #ifdef ALLOW_SALT_PLUME
42 # include "SALT_PLUME.h"
43 #endif
44 #ifdef ALLOW_AUTODIFF_TAMC
45 # include "tamc.h"
46 #endif
47
48 C !INPUT PARAMETERS: ===================================================
49 C myTime - Simulation time
50 C myIter - Simulation timestep number
51 C myThid - Thread no. that called this routine.
52 _RL myTime
53 INTEGER myIter
54 INTEGER myThid
55 CEndOfInterface
56
57 C !LOCAL VARIABLES: ====================================================
58 C i,j,bi,bj :: Loop counters
59 C iceFld :: Copy of seaice field
60 INTEGER i, j, bi, bj
61 c _RL iceFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
62 CEOP
63
64 #ifdef ALLOW_DEBUG
65 IF (debugMode) CALL DEBUG_ENTER( 'SEAICE_MODEL', myThid )
66 #endif
67
68 C-- Winds are from pkg/exf, which does not update edges.
69 CALL EXCH_UV_AGRID_3D_RL( uwind, vwind, .TRUE., 1, myThid )
70
71 #ifdef ALLOW_THSICE
72 IF ( useThSice ) THEN
73 C-- Map thSice-variables to HEFF and AREA
74 CALL SEAICE_MAP_THSICE( myTime, myIter, myThid )
75 ENDIF
76 #endif /* ALLOW_THSICE */
77
78 IF ( .NOT.useThSice ) THEN
79 #ifdef ALLOW_AUTODIFF_TAMC
80 CADJ STORE heff = comlev1, key=ikey_dynamics, kind=isbyte
81 CADJ STORE heffm = comlev1, key=ikey_dynamics, kind=isbyte
82 CADJ STORE area = comlev1, key=ikey_dynamics, kind=isbyte
83 CADJ STORE hsnow = comlev1, key=ikey_dynamics, kind=isbyte
84 CADJ STORE tice = comlev1, key=ikey_dynamics, kind=isbyte
85 #ifdef SEAICE_SALINITY
86 CADJ STORE hsalt = comlev1, key=ikey_dynamics, kind=isbyte
87 #endif
88 #endif
89 DO bj=myByLo(myThid),myByHi(myThid)
90 DO bi=myBxLo(myThid),myBxHi(myThid)
91 DO j=1-Oly,sNy+Oly
92 DO i=1-Olx,sNx+Olx
93 IF ( (heff(i,j,bi,bj).EQ.0.)
94 & .OR.(area(i,j,bi,bj).EQ.0.)
95 & ) THEN
96 HEFF(i,j,bi,bj) = 0. _d 0
97 AREA(i,j,bi,bj) = 0. _d 0
98 HSNOW(i,j,bi,bj) = 0. _d 0
99 TICE(i,j,bi,bj) = celsius2K
100 #ifdef SEAICE_SALINITY
101 HSALT(i,j,bi,bj) = 0. _d 0
102 #endif
103 ENDIF
104 ENDDO
105 ENDDO
106 ENDDO
107 ENDDO
108 ENDIF
109
110 #ifdef ALLOW_AUTODIFF_TAMC
111 c
112 DO bj=myByLo(myThid),myByHi(myThid)
113 DO bi=myBxLo(myThid),myBxHi(myThid)
114 DO j=1-Oly,sNy+Oly
115 DO i=1-Olx,sNx+Olx
116 HEFFNM1(i,j,bi,bj) = 0. _d 0
117 AREANM1(i,j,bi,bj) = 0. _d 0
118 uIceNm1(i,j,bi,bj) = 0. _d 0
119 vIceNm1(i,j,bi,bj) = 0. _d 0
120 ENDDO
121 ENDDO
122 ENDDO
123 ENDDO
124 c
125 CADJ STORE uwind = comlev1, key=ikey_dynamics, kind=isbyte
126 CADJ STORE vwind = comlev1, key=ikey_dynamics, kind=isbyte
127 CADJ STORE heff = comlev1, key=ikey_dynamics, kind=isbyte
128 CADJ STORE heffm = comlev1, key=ikey_dynamics, kind=isbyte
129 CADJ STORE area = comlev1, key=ikey_dynamics, kind=isbyte
130 # ifdef SEAICE_ALLOW_DYNAMICS
131 # ifdef SEAICE_CGRID
132 CADJ STORE seaicemasku = comlev1, key=ikey_dynamics, kind=isbyte
133 CADJ STORE seaicemaskv = comlev1, key=ikey_dynamics, kind=isbyte
134 CADJ STORE fu = comlev1, key=ikey_dynamics, kind=isbyte
135 CADJ STORE fv = comlev1, key=ikey_dynamics, kind=isbyte
136 CADJ STORE uice = comlev1, key=ikey_dynamics, kind=isbyte
137 CADJ STORE vice = comlev1, key=ikey_dynamics, kind=isbyte
138 cphCADJ STORE eta = comlev1, key=ikey_dynamics, kind=isbyte
139 cphCADJ STORE zeta = comlev1, key=ikey_dynamics, kind=isbyte
140 cph(
141 CADJ STORE dwatn = comlev1, key=ikey_dynamics, kind=isbyte
142 cccCADJ STORE press0 = comlev1, key=ikey_dynamics, kind=isbyte
143 cccCADJ STORE taux = comlev1, key=ikey_dynamics, kind=isbyte
144 cccCADJ STORE tauy = comlev1, key=ikey_dynamics, kind=isbyte
145 cccCADJ STORE zmax = comlev1, key=ikey_dynamics, kind=isbyte
146 cccCADJ STORE zmin = comlev1, key=ikey_dynamics, kind=isbyte
147 cph)
148 # ifdef SEAICE_ALLOW_EVP
149 CADJ STORE seaice_sigma1 = comlev1, key=ikey_dynamics, kind=isbyte
150 CADJ STORE seaice_sigma2 = comlev1, key=ikey_dynamics, kind=isbyte
151 CADJ STORE seaice_sigma12 = comlev1, key=ikey_dynamics, kind=isbyte
152 # endif
153 # endif
154 # endif
155 #endif /* ALLOW_AUTODIFF_TAMC */
156
157 C solve ice momentum equations and calculate ocean surface stress
158 #ifdef ALLOW_DEBUG
159 IF (debugMode) CALL DEBUG_CALL( 'SEAICE_DYNSOLVER', myThid )
160 #endif
161 #ifdef SEAICE_CGRID
162 CALL TIMER_START('SEAICE_DYNSOLVER [SEAICE_MODEL]',myThid)
163 CALL SEAICE_DYNSOLVER ( myTime, myIter, myThid )
164 CALL TIMER_STOP ('SEAICE_DYNSOLVER [SEAICE_MODEL]',myThid)
165 #else
166 CALL TIMER_START('DYNSOLVER [SEAICE_MODEL]',myThid)
167 CALL DYNSOLVER ( myTime, myIter, myThid )
168 CALL TIMER_STOP ('DYNSOLVER [SEAICE_MODEL]',myThid)
169 #endif /* SEAICE_CGRID */
170
171 C-- Apply ice velocity open boundary conditions
172 #ifdef ALLOW_OBCS
173 # ifndef DISABLE_SEAICE_OBCS
174 IF ( useOBCS ) CALL OBCS_APPLY_UVICE( uice, vice, myThid )
175 # endif /* DISABLE_SEAICE_OBCS */
176 #endif /* ALLOW_OBCS */
177
178 #ifdef ALLOW_THSICE
179 IF ( .NOT.useThSice ) THEN
180 #endif
181 C-- Only call advection of heff, area, snow, and salt and
182 C-- growth for the generic 0-layer thermodynamics of seaice
183 C-- if useThSice=.false., otherwise the 3-layer Winton thermodynamics
184 C-- (called from DO_OCEANIC_PHYSICS) take care of this
185
186 C NOW DO ADVECTION and DIFFUSION
187 IF ( SEAICEadvHeff .OR. SEAICEadvArea .OR. SEAICEadvSnow
188 & .OR. SEAICEadvSalt .OR. SEAICEadvAge ) THEN
189 #ifdef ALLOW_DEBUG
190 IF (debugMode) CALL DEBUG_CALL( 'SEAICE_ADVDIFF', myThid )
191 #endif
192 CALL SEAICE_ADVDIFF( myTime, myIter, myThid )
193 ENDIF
194 #ifdef ALLOW_AUTODIFF_TAMC
195 CADJ STORE heffm = comlev1, key=ikey_dynamics, kind=isbyte
196 cph-test(
197 cphCADJ STORE heff = comlev1, key=ikey_dynamics, kind=isbyte
198 cphCADJ STORE area = comlev1, key=ikey_dynamics, kind=isbyte
199 cphCADJ STORE hsnow = comlev1, key=ikey_dynamics, kind=isbyte
200 cphCADJ STORE qnet = comlev1, key=ikey_dynamics, kind=isbyte
201 cphCADJ STORE qsw = comlev1, key=ikey_dynamics, kind=isbyte
202 cphCADJ STORE tice = comlev1, key=ikey_dynamics, kind=isbyte
203 cph-test)
204 # ifdef SEAICE_ALLOW_DYNAMICS
205 cphCADJ STORE uice = comlev1, key=ikey_dynamics, kind=isbyte
206 cphCADJ STORE vice = comlev1, key=ikey_dynamics, kind=isbyte
207 # endif
208 #endif /* ALLOW_AUTODIFF_TAMC */
209
210 C thermodynamics growth
211 C must call growth after calling advection
212 C because of ugly time level business
213 IF ( usePW79thermodynamics ) THEN
214 #ifdef ALLOW_DEBUG
215 IF (debugMode) CALL DEBUG_CALL( 'SEAICE_GROWTH', myThid )
216 #endif
217 #ifndef SEAICE_ALLOW_TD_IF
218 CALL SEAICE_GROWTH( myTime, myIter, myThid )
219 #else
220 CALL SEAICE_GROWTH_IF( myTime, myIter, myThid )
221 #endif
222 ENDIF
223
224 C-- Apply ice tracer open boundary conditions
225 #ifdef ALLOW_OBCS
226 # ifndef DISABLE_SEAICE_OBCS
227 IF ( useOBCS ) CALL OBCS_APPLY_SEAICE( myThid )
228 # endif /* DISABLE_SEAICE_OBCS */
229 #endif /* ALLOW_OBCS */
230
231 C-- Update overlap regions for a bunch of stuff
232 _EXCH_XY_RL( HEFF, myThid )
233 _EXCH_XY_RL( AREA, myThid )
234 _EXCH_XY_RL( HSNOW, myThid )
235 #ifdef SEAICE_SALINITY
236 _EXCH_XY_RL( HSALT, myThid )
237 #endif
238 #ifdef SEAICE_AGE
239 _EXCH_XY_RL( IceAge,myThid )
240 #endif
241 _EXCH_XY_RS(EmPmR, myThid )
242 _EXCH_XY_RS(saltFlux, myThid )
243 _EXCH_XY_RS(Qnet , myThid )
244 #ifdef SHORTWAVE_HEATING
245 _EXCH_XY_RS(Qsw , myThid )
246 #endif /* SHORTWAVE_HEATING */
247 #ifdef ALLOW_SALT_PLUME
248 IF ( useSALT_PLUME )
249 & _EXCH_XY_RL(saltPlumeFlux, myThid )
250 #endif /* ALLOW_SALT_PLUME */
251 #ifdef ATMOSPHERIC_LOADING
252 IF ( useRealFreshWaterFlux )
253 & _EXCH_XY_RS( sIceLoad, myThid )
254 #endif
255
256 C-- In case we use scheme with a large stencil that extends into overlap:
257 #ifdef ALLOW_OBCS
258 IF ( useOBCS ) THEN
259 DO bj=myByLo(myThid),myByHi(myThid)
260 DO bi=myBxLo(myThid),myBxHi(myThid)
261 CALL OBCS_COPY_TRACER( HEFF(1-Olx,1-Oly,bi,bj),
262 I 1, bi, bj, myThid )
263 CALL OBCS_COPY_TRACER( AREA(1-Olx,1-Oly,bi,bj),
264 I 1, bi, bj, myThid )
265 CALL OBCS_COPY_TRACER( HSNOW(1-Olx,1-Oly,bi,bj),
266 I 1, bi, bj, myThid )
267 #ifdef SEAICE_SALINITY
268 CALL OBCS_COPY_TRACER( HSALT(1-Olx,1-Oly,bi,bj),
269 I 1, bi, bj, myThid )
270 #endif
271 #ifdef SEAICE_AGE
272 CALL OBCS_COPY_TRACER( IceAge(1-Olx,1-Oly,bi,bj),
273 I 1, bi, bj, myThid )
274 #endif
275 ENDDO
276 ENDDO
277 ENDIF
278 #endif /* ALLOW_OBCS */
279
280 #ifdef ALLOW_DIAGNOSTICS
281 IF ( useDiagnostics ) THEN
282 C diagnostics for "non-state variables" that are modified by
283 C the seaice model
284 # ifdef ALLOW_EXF
285 CALL DIAGNOSTICS_FILL(UWIND ,'SIuwind ',0,1 ,0,1,1,myThid)
286 CALL DIAGNOSTICS_FILL(VWIND ,'SIvwind ',0,1 ,0,1,1,myThid)
287 # endif
288 CALL DIAGNOSTICS_FILL_RS(FU ,'SIfu ',0,1 ,0,1,1,myThid)
289 CALL DIAGNOSTICS_FILL_RS(FV ,'SIfv ',0,1 ,0,1,1,myThid)
290 CALL DIAGNOSTICS_FILL_RS(EmPmR,'SIempmr ',0,1 ,0,1,1,myThid)
291 CALL DIAGNOSTICS_FILL_RS(Qnet ,'SIqnet ',0,1 ,0,1,1,myThid)
292 CALL DIAGNOSTICS_FILL_RS(Qsw ,'SIqsw ',0,1 ,0,1,1,myThid)
293 ENDIF
294 #endif /* ALLOW_DIAGNOSTICS */
295
296 #ifdef ALLOW_THSICE
297 C endif .not.useThSice
298 ENDIF
299 #endif /* ALLOW_THSICE */
300 CML This has already been done in seaice_ocean_stress/ostres, so why repeat?
301 CML CALL EXCH_UV_XY_RS(fu,fv,.TRUE.,myThid)
302
303 #ifdef ALLOW_EXF
304 # ifdef ALLOW_AUTODIFF_TAMC
305 # if (defined (ALLOW_AUTODIFF_MONITOR))
306 CALL EXF_ADJOINT_SNAPSHOTS( 3, myTime, myIter, myThid )
307 # endif
308 # endif
309 #endif
310
311 #ifdef ALLOW_DEBUG
312 IF (debugMode) CALL DEBUG_LEAVE( 'SEAICE_MODEL', myThid )
313 #endif
314
315 RETURN
316 END

  ViewVC Help
Powered by ViewVC 1.1.22