/[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.37 - (show annotations) (download)
Thu May 2 20:11:06 2013 UTC (11 years, 1 month ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64h
Changes since 1.36: +3 -2 lines
add some comments/description

1 C $Header: /u/gcmpack/MITgcm/pkg/thsice/thsice_main.F,v 1.36 2013/05/02 20:03:12 jmc Exp $
2 C $Name: $
3
4 #include "THSICE_OPTIONS.h"
5 #ifdef ALLOW_AUTODIFF_TAMC
6 # ifdef ALLOW_EXF
7 # include "EXF_OPTIONS.h"
8 # endif
9 #endif
10
11 CBOP
12 C !ROUTINE: THSICE_MAIN
13 C !INTERFACE:
14 SUBROUTINE THSICE_MAIN(
15 I myTime, myIter, myThid )
16 C !DESCRIPTION: \bv
17 C *==========================================================*
18 C | S/R THSICE_MAIN
19 C | o Therm_SeaIce main routine.
20 C | step forward Thermodynamic_SeaIce variables and modify
21 C | ocean surface forcing accordingly.
22 C *==========================================================*
23
24 C !USES:
25 IMPLICIT NONE
26
27 C === Global variables ===
28 #include "SIZE.h"
29 #include "EEPARAMS.h"
30 #include "PARAMS.h"
31 #include "FFIELDS.h"
32 #include "THSICE_PARAMS.h"
33 #include "THSICE_SIZE.h"
34 #include "THSICE_VARS.h"
35 #ifdef ALLOW_AUTODIFF_TAMC
36 # include "THSICE_TAVE.h"
37 # include "THSICE_COST.h"
38 # include "DYNVARS.h"
39 # include "tamc.h"
40 # include "tamc_keys.h"
41 # ifdef ALLOW_EXF
42 # include "EXF_FIELDS.h"
43 # include "EXF_PARAM.h"
44 # include "EXF_CONSTANTS.h"
45 # endif /* ALLOW_EXF */
46 #endif
47
48 C !INPUT/OUTPUT PARAMETERS:
49 C === Routine arguments ===
50 C myTime :: Current time in simulation (s)
51 C myIter :: Current iteration number
52 C myThid :: My Thread Id. number
53 _RL myTime
54 INTEGER myIter
55 INTEGER myThid
56 CEOP
57
58 #ifdef ALLOW_THSICE
59 C !LOCAL VARIABLES:
60 C === Local variables ===
61 C prcAtm :: total precip from the atmosphere [kg/m2/s]
62 C snowPr :: snow precipitation [kg/m2/s]
63 C qPrcRn :: Energy content of Precip+RunOff (+=down) [W/m2]
64 INTEGER i,j
65 INTEGER bi,bj
66 INTEGER iMin, iMax
67 INTEGER jMin, jMax
68 _RL prcAtm(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
69 _RL snowPr(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
70 _RL qPrcRn(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
71 c _RL evpAtm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
72 c _RL flxAtm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
73 c _RL flxSW (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
74 _RL tauFac
75
76 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
77
78 C- Only compute/update seaice fields over the interior
79 C (excluding overlap) and apply exchanges when needed
80 iMin = 1
81 iMax = sNx
82 jMin = 1
83 jMax = sNy
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 ticekey = (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=ticekey, byte=isbyte
103 CADJ STORE oceqnet(:,:,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
104 CADJ STORE ocesflx(:,:,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
105 # ifdef ALLOW_EXF
106 CADJ STORE qsw(:,:,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
107 # endif
108 #endif
109 #ifdef ALLOW_AUTODIFF_TAMC
110 CADJ STORE uvel (:,:,1,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
111 CADJ STORE vvel (:,:,1,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
112 #endif
113
114 DO j=1-OLy,sNy+OLy
115 DO i=1-OLx,sNx+OLx
116 prcAtm (i,j,bi,bj) = 0. _d 0
117 snowPr (i,j) = 0. _d 0
118 qPrcRn (i,j) = 0. _d 0
119 ENDDO
120 ENDDO
121
122 #ifdef ALLOW_CHEAPAML
123 IF ( .NOT.useCheapAML ) THEN
124 #endif
125
126 CALL THSICE_GET_OCEAN(
127 I bi, bj, myTime, myIter, myThid )
128
129 #ifdef ALLOW_AUTODIFF_TAMC
130 CADJ STORE iceMask(:,:,bi,bj) = comlev1_bibj, key = ticekey
131 CADJ STORE iceHeight(:,:,bi,bj) = comlev1_bibj, key = ticekey
132 CADJ STORE snowHeight(:,:,bi,bj) = comlev1_bibj, key = ticekey
133 CADJ STORE Tsrf(:,:,bi,bj) = comlev1_bibj, key = ticekey
134 CADJ STORE Qice1(:,:,bi,bj) = comlev1_bibj, key = ticekey
135 CADJ STORE Qice2(:,:,bi,bj) = comlev1_bibj, key = ticekey
136 CADJ STORE snowAge(:,:,bi,bj) = comlev1_bibj, key = ticekey
137
138 CADJ STORE hOceMxL(:,:,bi,bj) = comlev1_bibj, key = ticekey
139 CADJ STORE tOceMxL(:,:,bi,bj) = comlev1_bibj, key = ticekey
140 CADJ STORE sOceMxL(:,:,bi,bj) = comlev1_bibj, key = ticekey
141 CADJ STORE v2ocMxL(:,:,bi,bj) = comlev1_bibj, key = ticekey
142 #endif
143
144 #ifdef OLD_THSICE_CALL_SEQUENCE
145 C- do sea-ice advection before getting surface fluxes
146 C Note: will inline this S/R once thSIce in Atmos. set-up is settled
147 IF ( thSIceAdvScheme.GT.0 )
148 & CALL THSICE_DO_ADVECT(
149 I bi,bj, myTime, myIter, myThid )
150 #endif /* OLD_THSICE_CALL_SEQUENCE */
151
152 #ifdef ALLOW_BULK_FORCE
153 IF ( useBulkforce ) THEN
154 CALL THSICE_GET_PRECIP(
155 I iceMask, tOceMxL,
156 O prcAtm(1-OLx,1-OLy,bi,bj),
157 O snowPr, qPrcRn,
158 O icFlxSW(1-OLx,1-OLy,bi,bj),
159 I iMin,iMax,jMin,jMax, bi,bj, myThid )
160 ENDIF
161 #endif
162 #ifdef ALLOW_EXF
163 IF ( useEXF ) THEN
164 CALL THSICE_MAP_EXF(
165 I iceMask, tOceMxL,
166 O prcAtm(1-OLx,1-OLy,bi,bj),
167 O snowPr, qPrcRn,
168 O icFlxSW(1-OLx,1-OLy,bi,bj),
169 I iMin,iMax,jMin,jMax, bi,bj, myThid )
170 ENDIF
171 #endif
172
173 #ifdef ALLOW_AUTODIFF_TAMC
174 CADJ STORE sHeating(:,:,bi,bj) = comlev1_bibj, key = ticekey
175 CADJ STORE tice1(:,:,bi,bj) = comlev1_bibj, key = ticekey
176 CADJ STORE tice2(:,:,bi,bj) = comlev1_bibj, key = ticekey
177 #else
178 IF ( .NOT.thSIce_skipThermo ) THEN
179 #endif
180 CALL THSICE_STEP_TEMP(
181 I bi, bj, iMin, iMax, jMin, jMax,
182 I myTime, myIter, myThid )
183
184 #ifdef ALLOW_CHEAPAML
185 ENDIF
186 #endif
187 #ifdef ALLOW_AUTODIFF_TAMC
188 CADJ STORE empmr(:,:,bi,bj) = comlev1_bibj, key = ticekey
189 CADJ STORE qnet(:,:,bi,bj) = comlev1_bibj, key = ticekey
190 CADJ STORE iceMask(:,:,bi,bj) = comlev1_bibj, key = ticekey
191 CADJ STORE iceHeight(:,:,bi,bj) = comlev1_bibj, key = ticekey
192 CADJ STORE snowHeight(:,:,bi,bj) = comlev1_bibj, key = ticekey
193 cphCADJ STORE Tsrf(:,:,bi,bj) = comlev1_bibj, key = ticekey
194 CADJ STORE Qice1(:,:,bi,bj) = comlev1_bibj, key = ticekey
195 CADJ STORE Qice2(:,:,bi,bj) = comlev1_bibj, key = ticekey
196 CADJ STORE snowAge(:,:,bi,bj) = comlev1_bibj, key = ticekey
197 CADJ STORE sHeating(:,:,bi,bj) = comlev1_bibj, key = ticekey
198 #else
199 ENDIF
200 IF ( .NOT.thSIce_skipThermo ) THEN
201 #endif
202 CALL THSICE_STEP_FWD(
203 I bi, bj, iMin, iMax, jMin, jMax,
204 I prcAtm(1-OLx,1-OLy,bi,bj),
205 I snowPr, qPrcRn,
206 I myTime, myIter, myThid )
207 #ifndef ALLOW_AUTODIFF_TAMC
208 ENDIF
209 #endif
210
211 C-- end bi,bj loop
212 ENDDO
213 ENDDO
214
215 #ifdef ALLOW_BALANCE_FLUXES
216 C-- Balance net Fresh-Water flux from Atm+Land
217 IF ( thSIceBalanceAtmFW.NE.0 ) THEN
218 CALL THSICE_BALANCE_FRW(
219 I iMin, iMax, jMin, jMax,
220 I prcAtm, myTime, myIter, myThid )
221 ENDIF
222 #endif
223
224 C add a small piece of code to check AddFluid implementation:
225 c#include "thsice_test_addfluid.h"
226
227 C-- Exchange fields that are advected by seaice dynamics
228 IF ( useSEAICE .OR. thSIceAdvScheme.GT.0
229 & .OR. stressReduction.GT.zeroRL ) THEN
230 CALL THSICE_DO_EXCH( myThid )
231 ENDIF
232 #ifdef OLD_THSICE_CALL_SEQUENCE
233 #ifdef ATMOSPHERIC_LOADING
234 IF ( useRealFreshWaterFlux )
235 & _EXCH_XY_RS( sIceLoad, myThid )
236 #endif
237 #else /* OLD_THSICE_CALL_SEQUENCE */
238 #ifdef ATMOSPHERIC_LOADING
239 IF ( useRealFreshWaterFlux .AND. thSIceAdvScheme.LE.0 )
240 & _EXCH_XY_RS( sIceLoad, myThid )
241 #endif
242
243 C- when useSEAICE=.true., this S/R is called from SEAICE_MODEL;
244 C otherwise, call it from here, after thsice-thermodynamics is done
245 IF ( thSIceAdvScheme.GT.0 .AND. .NOT.useSEAICE ) THEN
246 CALL THSICE_DO_ADVECT(
247 I 0, 0, myTime, myIter, myThid )
248 ENDIF
249 #endif /* OLD_THSICE_CALL_SEQUENCE */
250
251 DO bj=myByLo(myThid),myByHi(myThid)
252 DO bi=myBxLo(myThid),myBxHi(myThid)
253 C-- Cumulate time-averaged fields and also fill-up flux diagnostics
254 C (if not done in THSICE_DO_ADVECT call)
255 #ifdef OLD_THSICE_CALL_SEQUENCE
256 IF ( .TRUE. ) THEN
257 #else /* OLD_THSICE_CALL_SEQUENCE */
258 IF ( thSIceAdvScheme.LE.0 ) THEN
259 #endif /* OLD_THSICE_CALL_SEQUENCE */
260 CALL THSICE_AVE(
261 I bi,bj, myTime, myIter, myThid )
262 ENDIF
263 C-- note: If useSEAICE=.true., the stress is computed in seaice_model,
264 C-- and stressReduction is always set to zero
265 #ifdef ALLOW_AUTODIFF_TAMC
266 CADJ STORE fu(:,:,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
267 CADJ STORE fv(:,:,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
268 #endif
269 IF ( stressReduction.GT. 0. _d 0 ) THEN
270 DO j = 1-OLy,sNy+OLy-1
271 DO i = 2-OLx,sNx+OLx-1
272 tauFac = stressReduction
273 & *(iceMask(i-1,j,bi,bj)+iceMask(i,j,bi,bj))*0.5 _d 0
274 fu(i,j,bi,bj) = (1. _d 0 - tauFac)*fu(i,j,bi,bj)
275 ENDDO
276 ENDDO
277 DO j = 2-OLy,sNy+OLy-1
278 DO i = 1-OLx,sNx+OLx-1
279 tauFac = stressReduction
280 & *(iceMask(i,j-1,bi,bj)+iceMask(i,j,bi,bj))*0.5 _d 0
281 fv(i,j,bi,bj) = (1. _d 0 - tauFac)*fv(i,j,bi,bj)
282 ENDDO
283 ENDDO
284 ENDIF
285
286 C-- end bi,bj loop
287 ENDDO
288 ENDDO
289
290 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
291 #endif /*ALLOW_THSICE*/
292
293 RETURN
294 END

  ViewVC Help
Powered by ViewVC 1.1.22