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

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

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


Revision 1.22 - (show annotations) (download)
Thu Oct 21 02:10:34 2010 UTC (13 years, 8 months ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint62o, checkpoint62n, checkpoint62m
Changes since 1.21: +28 -27 lines
Fix several store dirs.

1 C $Header: /u/gcmpack/MITgcm/pkg/thsice/thsice_main.F,v 1.21 2010/10/16 12:29:39 heimbach Exp $
2 C $Name: $
3
4 #include "THSICE_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: THSICE_MAIN
8 C !INTERFACE:
9 SUBROUTINE THSICE_MAIN(
10 I myTime, myIter, myThid )
11 C !DESCRIPTION: \bv
12 C *==========================================================*
13 C | S/R THSICE_MAIN
14 C | o Therm_SeaIce main routine.
15 C | step forward Thermodynamic_SeaIce variables and modify
16 C | ocean surface forcing accordingly.
17 C *==========================================================*
18
19 C !USES:
20 IMPLICIT NONE
21
22 C === Global variables ===
23 #include "SIZE.h"
24 #include "EEPARAMS.h"
25 #include "PARAMS.h"
26 #include "GRID.h"
27 #include "SURFACE.h"
28 #include "DYNVARS.h"
29 #include "FFIELDS.h"
30 #include "THSICE_PARAMS.h"
31 #include "THSICE_VARS.h"
32 #ifdef ALLOW_AUTODIFF_TAMC
33 # include "tamc.h"
34 # include "tamc_keys.h"
35 #endif
36
37 C !INPUT/OUTPUT PARAMETERS:
38 C === Routine arguments ===
39 C myTime :: Current time in simulation (s)
40 C myIter :: Current iteration number
41 C myThid :: My Thread Id. number
42 _RL myTime
43 INTEGER myIter
44 INTEGER myThid
45 CEOP
46
47 #ifdef ALLOW_THSICE
48 C !LOCAL VARIABLES:
49 C === Local variables ===
50 INTEGER i,j
51 INTEGER bi,bj
52 INTEGER iMin, iMax
53 INTEGER jMin, jMax
54 _RL prcAtm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
55 c _RL evpAtm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
56 c _RL flxAtm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
57 c _RL flxSW (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
58
59 _RL tauFac
60
61 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
62
63 IF ( stressReduction.GT. 0. _d 0 ) THEN
64 C- needs new Ice Fraction in halo region to apply wind-stress reduction
65 iMin = 1-OLx
66 iMax = sNx+OLx-1
67 jMin = 1-OLy
68 jMax = sNy+OLy-1
69 #ifdef ATMOSPHERIC_LOADING
70 ELSEIF ( useRealFreshWaterFlux .AND. .NOT.useSEAICE ) THEN
71 C- needs sea-ice loading in part of the halo regions for grad.Phi0surf
72 C to be valid at the boundaries ( d/dx 1:sNx+1 ; d/dy 1:sNy+1 )
73 iMin = 0
74 iMax = sNx+1
75 jMin = 0
76 jMax = sNy+1
77 #endif /* ATMOSPHERIC_LOADING */
78 ELSE
79 iMin = 1
80 iMax = sNx
81 jMin = 1
82 jMax = sNy
83 ENDIF
84
85 DO bj=myByLo(myThid),myByHi(myThid)
86 DO bi=myBxLo(myThid),myBxHi(myThid)
87
88 #ifdef ALLOW_AUTODIFF_TAMC
89 act1 = bi - myBxLo(myThid)
90 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
91 act2 = bj - myByLo(myThid)
92 max2 = myByHi(myThid) - myByLo(myThid) + 1
93 act3 = myThid - 1
94 max3 = nTx*nTy
95 act4 = ikey_dynamics - 1
96 iicekey = (act1 + 1) + act2*max1
97 & + act3*max1*max2
98 & + act4*max1*max2*max3
99 #endif /* ALLOW_AUTODIFF_TAMC */
100
101 #ifdef ALLOW_AUTODIFF_TAMC
102 CADJ STORE ocefwfx(:,:,bi,bj) = comlev1_bibj, key=iicekey, byte=isbyte
103 CADJ STORE oceqnet(:,:,bi,bj) = comlev1_bibj, key=iicekey, byte=isbyte
104 CADJ STORE ocesflx(:,:,bi,bj) = comlev1_bibj, key=iicekey, byte=isbyte
105 # ifdef ALLOW_EXF
106 CADJ STORE qsw(:,:,bi,bj) = comlev1_bibj, key=iicekey, byte=isbyte
107 # endif
108 #endif
109
110 C-- Mixed layer thickness: take the 1rst layer
111 #ifdef NONLIN_FRSURF
112 IF ( staggerTimeStep .AND. nonlinFreeSurf.GT.0 ) THEN
113 IF ( select_rStar.GT.0 ) THEN
114 DO j=1-OLy,sNy+OLy
115 DO i=1-OLx,sNx+OLx
116 hOceMxL(i,j,bi,bj) = drF(1)*h0FacC(i,j,1,bi,bj)
117 & *rStarFacC(i,j,bi,bj)
118 ENDDO
119 ENDDO
120 ELSE
121 DO j=1-OLy,sNy+OLy
122 DO i=1-OLx,sNx+OLx
123 IF ( ksurfC(i,j,bi,bj).EQ.1 ) THEN
124 hOceMxL(i,j,bi,bj) = drF(1)*hFac_surfC(i,j,bi,bj)
125 ELSE
126 hOceMxL(i,j,bi,bj) = drF(1)*hFacC(i,j,1,bi,bj)
127 ENDIF
128 ENDDO
129 ENDDO
130 ENDIF
131 ELSE
132 #else /* ndef NONLIN_FRSURF */
133 IF (.TRUE.) THEN
134 #endif /* NONLIN_FRSURF */
135 DO j=1-OLy,sNy+OLy
136 DO i=1-OLx,sNx+OLx
137 hOceMxL(i,j,bi,bj) = drF(1)*hFacC(i,j,1,bi,bj)
138 ENDDO
139 ENDDO
140 ENDIF
141
142 #ifdef ALLOW_AUTODIFF_TAMC
143 CADJ STORE uvel (:,:,1,bi,bj) = comlev1_bibj, key=iicekey, byte=isbyte
144 CADJ STORE vvel (:,:,1,bi,bj) = comlev1_bibj, key=iicekey, byte=isbyte
145 #endif
146
147 DO j = jMin, jMax
148 DO i = iMin, iMax
149 tOceMxL(i,j,bi,bj) = theta(i,j,1,bi,bj)
150 sOceMxL(i,j,bi,bj) = salt (i,j,1,bi,bj)
151 v2ocMxL(i,j,bi,bj) =
152 & ( uvel(i,j,1,bi,bj)*uvel(i,j,1,bi,bj)
153 & + uvel(i+1,j,1,bi,bj)*uvel(i+1,j,1,bi,bj)
154 & + vvel(i,j+1,1,bi,bj)*vvel(i,j+1,1,bi,bj)
155 & + vvel(i,j,1,bi,bj)*vvel(i,j,1,bi,bj)
156 & )*0.5 _d 0
157 prcAtm(i,j) = 0.
158 icFrwAtm(i,j,bi,bj) = 0. _d 0
159 icFlxAtm(i,j,bi,bj) = 0. _d 0
160 icFlxSW (i,j,bi,bj) = 0. _d 0
161 snowPrc(i,j,bi,bj) = 0. _d 0
162 siceAlb(i,j,bi,bj) = 0. _d 0
163 ENDDO
164 ENDDO
165
166 #ifdef ALLOW_AUTODIFF_TAMC
167 CADJ STORE iceMask(:,:,bi,bj) = comlev1_bibj, key = iicekey
168 CADJ STORE iceHeight(:,:,bi,bj) = comlev1_bibj, key = iicekey
169 CADJ STORE snowHeight(:,:,bi,bj) = comlev1_bibj, key = iicekey
170 CADJ STORE Tsrf(:,:,bi,bj) = comlev1_bibj, key = iicekey
171 CADJ STORE Qice1(:,:,bi,bj) = comlev1_bibj, key = iicekey
172 CADJ STORE Qice2(:,:,bi,bj) = comlev1_bibj, key = iicekey
173 CADJ STORE snowAge(:,:,bi,bj) = comlev1_bibj, key = iicekey
174 CADJ STORE snowPrc(:,:,bi,bj) = comlev1_bibj, key = iicekey
175
176 CADJ STORE hOceMxL(:,:,bi,bj) = comlev1_bibj, key = iicekey
177 CADJ STORE tOceMxL(:,:,bi,bj) = comlev1_bibj, key = iicekey
178 CADJ STORE sOceMxL(:,:,bi,bj) = comlev1_bibj, key = iicekey
179 CADJ STORE v2ocMxL(:,:,bi,bj) = comlev1_bibj, key = iicekey
180 #endif
181
182 C- do sea-ice advection before getting surface fluxes
183 C Note: will inline this S/R once thSIce in Atmos. set-up is settled
184 IF ( thSIceAdvScheme.GT.0 )
185 & CALL THSICE_DO_ADVECT(
186 I bi,bj, myTime, myIter, myThid )
187
188 #ifdef ALLOW_BULK_FORCE
189 IF ( useBulkforce ) THEN
190 CALL THSICE_GET_PRECIP(
191 I iceMask,
192 O prcAtm, snowPrc(1-OLx,1-OLy,bi,bj),
193 O icFlxSW(1-OLx,1-OLy,bi,bj),
194 I iMin,iMax,jMin,jMax, bi,bj, myThid )
195 ENDIF
196 #endif
197 #ifdef ALLOW_EXF
198 IF ( useEXF ) THEN
199 CALL THSICE_MAP_EXF(
200 I iceMask,
201 O prcAtm, snowPrc(1-OLx,1-OLy,bi,bj),
202 O icFlxSW(1-OLx,1-OLy,bi,bj),
203 I iMin,iMax,jMin,jMax, bi,bj, myThid )
204 ENDIF
205 #endif
206
207 #ifdef ALLOW_AUTODIFF_TAMC
208 CADJ STORE sheating(:,:,bi,bj) = comlev1_bibj, key = iicekey
209 CADJ STORE tice1(:,:,bi,bj) = comlev1_bibj, key = iicekey
210 CADJ STORE tice2(:,:,bi,bj) = comlev1_bibj, key = iicekey
211 #endif
212 CALL THSICE_STEP_TEMP(
213 I bi, bj, iMin, iMax, jMin, jMax,
214 I myTime, myIter, myThid )
215
216 #ifdef ALLOW_AUTODIFF_TAMC
217 CADJ STORE empmr(:,:,bi,bj) = comlev1_bibj, key = iicekey
218 CADJ STORE qnet(:,:,bi,bj) = comlev1_bibj, key = iicekey
219 CADJ STORE iceMask(:,:,bi,bj) = comlev1_bibj, key = iicekey
220 CADJ STORE iceHeight(:,:,bi,bj) = comlev1_bibj, key = iicekey
221 CADJ STORE snowHeight(:,:,bi,bj) = comlev1_bibj, key = iicekey
222 cphCADJ STORE Tsrf(:,:,bi,bj) = comlev1_bibj, key = iicekey
223 CADJ STORE Qice1(:,:,bi,bj) = comlev1_bibj, key = iicekey
224 CADJ STORE Qice2(:,:,bi,bj) = comlev1_bibj, key = iicekey
225 CADJ STORE snowAge(:,:,bi,bj) = comlev1_bibj, key = iicekey
226 CADJ STORE sheating(:,:,bi,bj) = comlev1_bibj, key = iicekey
227 #endif
228
229 CALL THSICE_STEP_FWD(
230 I bi, bj, iMin, iMax, jMin, jMax,
231 I prcAtm,
232 I myTime, myIter, myThid )
233
234 CALL THSICE_AVE(
235 I bi,bj, myTime, myIter, myThid )
236
237 c ENDDO
238 c ENDDO
239
240 C-- note: If useSEAICE=.true., the stress is computed in seaice_model,
241 C-- and stressReduction is always set to zero
242 #ifdef ALLOW_AUTODIFF_TAMC
243 CADJ STORE fu(:,:,bi,bj) = comlev1_bibj, key=iicekey, byte=isbyte
244 CADJ STORE fv(:,:,bi,bj) = comlev1_bibj, key=iicekey, byte=isbyte
245 #endif
246 IF ( stressReduction.GT. 0. _d 0 ) THEN
247 DO j = jMin, jMax
248 DO i = iMin+1,iMax
249 tauFac = stressReduction
250 & *(iceMask(i-1,j,bi,bj)+iceMask(i,j,bi,bj))*0.5 _d 0
251 fu(i,j,bi,bj) = (1. _d 0 - tauFac)*fu(i,j,bi,bj)
252 ENDDO
253 ENDDO
254 DO j = jMin+1, jMax
255 DO i = iMin, iMax
256 tauFac = stressReduction
257 & *(iceMask(i,j-1,bi,bj)+iceMask(i,j,bi,bj))*0.5 _d 0
258 fv(i,j,bi,bj) = (1. _d 0 - tauFac)*fv(i,j,bi,bj)
259 ENDDO
260 ENDDO
261 ENDIF
262
263 C-- end bi,bj loop
264 ENDDO
265 ENDDO
266
267 C add a small piece of code to check AddFluid implementation:
268 c#include "thsice_test_addfluid.h"
269
270 IF ( useSEAICE .OR. thSIceAdvScheme.GT.0 ) THEN
271 C-- Exchange fields that are advected by seaice dynamics
272 _EXCH_XY_RL( iceMask, myThid )
273 _EXCH_XY_RL( iceHeight, myThid )
274 _EXCH_XY_RL( snowHeight, myThid )
275 _EXCH_XY_RL( Qice1, myThid )
276 _EXCH_XY_RL( Qice2, myThid )
277
278 #ifdef ATMOSPHERIC_LOADING
279 IF (useRealFreshWaterFlux)
280 & _EXCH_XY_RS( sIceLoad, myThid )
281 #endif
282 ENDIF
283
284 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
285 #endif /*ALLOW_THSICE*/
286
287 RETURN
288 END

  ViewVC Help
Powered by ViewVC 1.1.22