/[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.35 - (show annotations) (download)
Tue Apr 23 16:34:24 2013 UTC (11 years, 1 month ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64g
Changes since 1.34: +3 -3 lines
also account for energy content of Precip + RunOff if  Energy-Reference-Level
is used when using pkg/bulk_force

1 C $Header: /u/gcmpack/MITgcm/pkg/thsice/thsice_main.F,v 1.34 2013/04/22 19:35:51 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 qPrcRn :: Energy content of Precip+RunOff (+=down) [W/m2]
62 INTEGER i,j
63 INTEGER bi,bj
64 INTEGER iMin, iMax
65 INTEGER jMin, jMax
66 _RL prcAtm(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
67 _RL qPrcRn(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
68 c _RL evpAtm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
69 c _RL flxAtm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
70 c _RL flxSW (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
71
72 _RL tauFac
73
74 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
75
76 C- Only compute/update seaice fields over the interior
77 C (excluding overlap) and apply exchanges when needed
78 iMin = 1
79 iMax = sNx
80 jMin = 1
81 jMax = sNy
82
83 DO bj=myByLo(myThid),myByHi(myThid)
84 DO bi=myBxLo(myThid),myBxHi(myThid)
85
86 #ifdef ALLOW_AUTODIFF_TAMC
87 act1 = bi - myBxLo(myThid)
88 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
89 act2 = bj - myByLo(myThid)
90 max2 = myByHi(myThid) - myByLo(myThid) + 1
91 act3 = myThid - 1
92 max3 = nTx*nTy
93 act4 = ikey_dynamics - 1
94 ticekey = (act1 + 1) + act2*max1
95 & + act3*max1*max2
96 & + act4*max1*max2*max3
97 #endif /* ALLOW_AUTODIFF_TAMC */
98
99 #ifdef ALLOW_AUTODIFF_TAMC
100 CADJ STORE ocefwfx(:,:,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
101 CADJ STORE oceqnet(:,:,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
102 CADJ STORE ocesflx(:,:,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
103 # ifdef ALLOW_EXF
104 CADJ STORE qsw(:,:,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
105 # endif
106 #endif
107 #ifdef ALLOW_AUTODIFF_TAMC
108 CADJ STORE uvel (:,:,1,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
109 CADJ STORE vvel (:,:,1,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
110 #endif
111
112 DO j=1-OLy,sNy+OLy
113 DO i=1-OLx,sNx+OLx
114 prcAtm (i,j,bi,bj) = 0. _d 0
115 qPrcRn (i,j) = 0. _d 0
116 ENDDO
117 ENDDO
118
119 #ifdef ALLOW_CHEAPAML
120 IF ( .NOT.useCheapAML ) THEN
121 #endif
122
123 CALL THSICE_GET_OCEAN(
124 I bi, bj, myTime, myIter, myThid )
125
126 #ifdef ALLOW_AUTODIFF_TAMC
127 CADJ STORE iceMask(:,:,bi,bj) = comlev1_bibj, key = ticekey
128 CADJ STORE iceHeight(:,:,bi,bj) = comlev1_bibj, key = ticekey
129 CADJ STORE snowHeight(:,:,bi,bj) = comlev1_bibj, key = ticekey
130 CADJ STORE Tsrf(:,:,bi,bj) = comlev1_bibj, key = ticekey
131 CADJ STORE Qice1(:,:,bi,bj) = comlev1_bibj, key = ticekey
132 CADJ STORE Qice2(:,:,bi,bj) = comlev1_bibj, key = ticekey
133 CADJ STORE snowAge(:,:,bi,bj) = comlev1_bibj, key = ticekey
134 CADJ STORE snowPrc(:,:,bi,bj) = comlev1_bibj, key = ticekey
135
136 CADJ STORE hOceMxL(:,:,bi,bj) = comlev1_bibj, key = ticekey
137 CADJ STORE tOceMxL(:,:,bi,bj) = comlev1_bibj, key = ticekey
138 CADJ STORE sOceMxL(:,:,bi,bj) = comlev1_bibj, key = ticekey
139 CADJ STORE v2ocMxL(:,:,bi,bj) = comlev1_bibj, key = ticekey
140 #endif
141
142 #ifdef OLD_THSICE_CALL_SEQUENCE
143 C- do sea-ice advection before getting surface fluxes
144 C Note: will inline this S/R once thSIce in Atmos. set-up is settled
145 IF ( thSIceAdvScheme.GT.0 )
146 & CALL THSICE_DO_ADVECT(
147 I bi,bj, myTime, myIter, myThid )
148 #endif /* OLD_THSICE_CALL_SEQUENCE */
149
150 #ifdef ALLOW_BULK_FORCE
151 IF ( useBulkforce ) THEN
152 CALL THSICE_GET_PRECIP(
153 I iceMask, tOceMxL,
154 O prcAtm(1-OLx,1-OLy,bi,bj),
155 O snowPrc(1-OLx,1-OLy,bi,bj), qPrcRn,
156 O icFlxSW(1-OLx,1-OLy,bi,bj),
157 I iMin,iMax,jMin,jMax, bi,bj, myThid )
158 ENDIF
159 #endif
160 #ifdef ALLOW_EXF
161 IF ( useEXF ) THEN
162 CALL THSICE_MAP_EXF(
163 I iceMask, tOceMxL,
164 O prcAtm(1-OLx,1-OLy,bi,bj),
165 O snowPrc(1-OLx,1-OLy,bi,bj), qPrcRn,
166 O icFlxSW(1-OLx,1-OLy,bi,bj),
167 I iMin,iMax,jMin,jMax, bi,bj, myThid )
168 ENDIF
169 #endif
170
171 #ifdef ALLOW_AUTODIFF_TAMC
172 CADJ STORE sHeating(:,:,bi,bj) = comlev1_bibj, key = ticekey
173 CADJ STORE tice1(:,:,bi,bj) = comlev1_bibj, key = ticekey
174 CADJ STORE tice2(:,:,bi,bj) = comlev1_bibj, key = ticekey
175 #else
176 IF ( .NOT.thSIce_skipThermo ) THEN
177 #endif
178 CALL THSICE_STEP_TEMP(
179 I bi, bj, iMin, iMax, jMin, jMax,
180 I myTime, myIter, myThid )
181
182 #ifdef ALLOW_CHEAPAML
183 ENDIF
184 #endif
185 #ifdef ALLOW_AUTODIFF_TAMC
186 CADJ STORE empmr(:,:,bi,bj) = comlev1_bibj, key = ticekey
187 CADJ STORE qnet(:,:,bi,bj) = comlev1_bibj, key = ticekey
188 CADJ STORE iceMask(:,:,bi,bj) = comlev1_bibj, key = ticekey
189 CADJ STORE iceHeight(:,:,bi,bj) = comlev1_bibj, key = ticekey
190 CADJ STORE snowHeight(:,:,bi,bj) = comlev1_bibj, key = ticekey
191 cphCADJ STORE Tsrf(:,:,bi,bj) = comlev1_bibj, key = ticekey
192 CADJ STORE Qice1(:,:,bi,bj) = comlev1_bibj, key = ticekey
193 CADJ STORE Qice2(:,:,bi,bj) = comlev1_bibj, key = ticekey
194 CADJ STORE snowAge(:,:,bi,bj) = comlev1_bibj, key = ticekey
195 CADJ STORE sHeating(:,:,bi,bj) = comlev1_bibj, key = ticekey
196 #else
197 ENDIF
198 IF ( .NOT.thSIce_skipThermo ) THEN
199 #endif
200 CALL THSICE_STEP_FWD(
201 I bi, bj, iMin, iMax, jMin, jMax,
202 I prcAtm(1-OLx,1-OLy,bi,bj), qPrcRn,
203 I myTime, myIter, myThid )
204 #ifndef ALLOW_AUTODIFF_TAMC
205 ENDIF
206 #endif
207
208 C-- end bi,bj loop
209 ENDDO
210 ENDDO
211
212 #ifdef ALLOW_BALANCE_FLUXES
213 C-- Balance net Fresh-Water flux from Atm+Land
214 IF ( thSIceBalanceAtmFW.NE.0 ) THEN
215 CALL THSICE_BALANCE_FRW(
216 I iMin, iMax, jMin, jMax,
217 I prcAtm, myTime, myIter, myThid )
218 ENDIF
219 #endif
220
221 C add a small piece of code to check AddFluid implementation:
222 c#include "thsice_test_addfluid.h"
223
224 C-- Exchange fields that are advected by seaice dynamics
225 IF ( useSEAICE .OR. thSIceAdvScheme.GT.0
226 & .OR. stressReduction.GT.zeroRL ) THEN
227 CALL THSICE_DO_EXCH( myThid )
228 ENDIF
229 #ifdef OLD_THSICE_CALL_SEQUENCE
230 #ifdef ATMOSPHERIC_LOADING
231 IF ( useRealFreshWaterFlux )
232 & _EXCH_XY_RS( sIceLoad, myThid )
233 #endif
234 #else /* OLD_THSICE_CALL_SEQUENCE */
235 #ifdef ATMOSPHERIC_LOADING
236 IF ( useRealFreshWaterFlux .AND. thSIceAdvScheme.LE.0 )
237 & _EXCH_XY_RS( sIceLoad, myThid )
238 #endif
239
240 C- when useSEAICE=.true., this S/R is called from SEAICE_MODEL;
241 C otherwise, call it from here, after thsice-thermodynamics is done
242 IF ( thSIceAdvScheme.GT.0 .AND. .NOT.useSEAICE ) THEN
243 CALL THSICE_DO_ADVECT(
244 I 0, 0, myTime, myIter, myThid )
245 ENDIF
246 #endif /* OLD_THSICE_CALL_SEQUENCE */
247
248 DO bj=myByLo(myThid),myByHi(myThid)
249 DO bi=myBxLo(myThid),myBxHi(myThid)
250 C-- Cumulate time-averaged fields and also fill-up flux diagnostics
251 C (if not done in THSICE_DO_ADVECT call)
252 #ifdef OLD_THSICE_CALL_SEQUENCE
253 IF ( .TRUE. ) THEN
254 #else /* OLD_THSICE_CALL_SEQUENCE */
255 IF ( thSIceAdvScheme.LE.0 ) THEN
256 #endif /* OLD_THSICE_CALL_SEQUENCE */
257 CALL THSICE_AVE(
258 I bi,bj, myTime, myIter, myThid )
259 ENDIF
260 C-- note: If useSEAICE=.true., the stress is computed in seaice_model,
261 C-- and stressReduction is always set to zero
262 #ifdef ALLOW_AUTODIFF_TAMC
263 CADJ STORE fu(:,:,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
264 CADJ STORE fv(:,:,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
265 #endif
266 IF ( stressReduction.GT. 0. _d 0 ) THEN
267 DO j = 1-OLy,sNy+OLy-1
268 DO i = 2-OLx,sNx+OLx-1
269 tauFac = stressReduction
270 & *(iceMask(i-1,j,bi,bj)+iceMask(i,j,bi,bj))*0.5 _d 0
271 fu(i,j,bi,bj) = (1. _d 0 - tauFac)*fu(i,j,bi,bj)
272 ENDDO
273 ENDDO
274 DO j = 2-OLy,sNy+OLy-1
275 DO i = 1-OLx,sNx+OLx-1
276 tauFac = stressReduction
277 & *(iceMask(i,j-1,bi,bj)+iceMask(i,j,bi,bj))*0.5 _d 0
278 fv(i,j,bi,bj) = (1. _d 0 - tauFac)*fv(i,j,bi,bj)
279 ENDDO
280 ENDDO
281 ENDIF
282
283 C-- end bi,bj loop
284 ENDDO
285 ENDDO
286
287 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
288 #endif /*ALLOW_THSICE*/
289
290 RETURN
291 END

  ViewVC Help
Powered by ViewVC 1.1.22