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

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

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


Revision 1.35 - (hide annotations) (download)
Tue Apr 23 16:34:24 2013 UTC (11 years, 2 months 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 jmc 1.35 C $Header: /u/gcmpack/MITgcm/pkg/thsice/thsice_main.F,v 1.34 2013/04/22 19:35:51 jmc Exp $
2 jmc 1.1 C $Name: $
3    
4     #include "THSICE_OPTIONS.h"
5 heimbach 1.32 #ifdef ALLOW_AUTODIFF_TAMC
6     # ifdef ALLOW_EXF
7     # include "EXF_OPTIONS.h"
8     # endif
9     #endif
10 jmc 1.8
11 jmc 1.2 CBOP
12 jmc 1.1 C !ROUTINE: THSICE_MAIN
13     C !INTERFACE:
14 jmc 1.8 SUBROUTINE THSICE_MAIN(
15 jmc 1.1 I myTime, myIter, myThid )
16 jmc 1.2 C !DESCRIPTION: \bv
17 jmc 1.1 C *==========================================================*
18 jmc 1.8 C | S/R THSICE_MAIN
19     C | o Therm_SeaIce main routine.
20 jmc 1.1 C | step forward Thermodynamic_SeaIce variables and modify
21     C | ocean surface forcing accordingly.
22     C *==========================================================*
23    
24     C !USES:
25     IMPLICIT NONE
26 jmc 1.2
27 jmc 1.1 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 gforget 1.23 #include "THSICE_SIZE.h"
34 jmc 1.2 #include "THSICE_VARS.h"
35 heimbach 1.7 #ifdef ALLOW_AUTODIFF_TAMC
36 jmc 1.33 # include "THSICE_TAVE.h"
37     # include "THSICE_COST.h"
38 jmc 1.29 # include "DYNVARS.h"
39 heimbach 1.7 # include "tamc.h"
40     # include "tamc_keys.h"
41 heimbach 1.32 # ifdef ALLOW_EXF
42     # include "EXF_FIELDS.h"
43     # include "EXF_PARAM.h"
44     # include "EXF_CONSTANTS.h"
45     # endif /* ALLOW_EXF */
46 heimbach 1.7 #endif
47 jmc 1.8
48 jmc 1.1 C !INPUT/OUTPUT PARAMETERS:
49     C === Routine arguments ===
50 jmc 1.12 C myTime :: Current time in simulation (s)
51     C myIter :: Current iteration number
52     C myThid :: My Thread Id. number
53     _RL myTime
54 jmc 1.1 INTEGER myIter
55     INTEGER myThid
56 jmc 1.2 CEOP
57 jmc 1.1
58     #ifdef ALLOW_THSICE
59     C !LOCAL VARIABLES:
60     C === Local variables ===
61 jmc 1.31 C qPrcRn :: Energy content of Precip+RunOff (+=down) [W/m2]
62 jmc 1.1 INTEGER i,j
63     INTEGER bi,bj
64     INTEGER iMin, iMax
65     INTEGER jMin, jMax
66 jmc 1.25 _RL prcAtm(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
67 jmc 1.31 _RL qPrcRn(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
68 jmc 1.8 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 jmc 1.1
72     _RL tauFac
73    
74     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
75    
76 jmc 1.34 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 jmc 1.1
83     DO bj=myByLo(myThid),myByHi(myThid)
84     DO bi=myBxLo(myThid),myBxHi(myThid)
85 jmc 1.2
86 heimbach 1.7 #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 gforget 1.23 ticekey = (act1 + 1) + act2*max1
95 heimbach 1.7 & + act3*max1*max2
96     & + act4*max1*max2*max3
97     #endif /* ALLOW_AUTODIFF_TAMC */
98    
99 heimbach 1.13 #ifdef ALLOW_AUTODIFF_TAMC
100 gforget 1.23 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 heimbach 1.14 # ifdef ALLOW_EXF
104 gforget 1.23 CADJ STORE qsw(:,:,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
105 heimbach 1.14 # endif
106 heimbach 1.13 #endif
107 heimbach 1.7 #ifdef ALLOW_AUTODIFF_TAMC
108 gforget 1.23 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 heimbach 1.7 #endif
111    
112 jmc 1.29 DO j=1-OLy,sNy+OLy
113     DO i=1-OLx,sNx+OLx
114 jmc 1.25 prcAtm (i,j,bi,bj) = 0. _d 0
115 jmc 1.31 qPrcRn (i,j) = 0. _d 0
116 jmc 1.6 ENDDO
117 mlosch 1.10 ENDDO
118 heimbach 1.7
119 jmc 1.33 #ifdef ALLOW_CHEAPAML
120     IF ( .NOT.useCheapAML ) THEN
121     #endif
122    
123 jmc 1.29 CALL THSICE_GET_OCEAN(
124     I bi, bj, myTime, myIter, myThid )
125    
126 heimbach 1.7 #ifdef ALLOW_AUTODIFF_TAMC
127 gforget 1.23 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 heimbach 1.7 #endif
141    
142 jmc 1.28 #ifdef OLD_THSICE_CALL_SEQUENCE
143 jmc 1.12 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 jmc 1.28 #endif /* OLD_THSICE_CALL_SEQUENCE */
149 jmc 1.12
150 jmc 1.2 #ifdef ALLOW_BULK_FORCE
151 mlosch 1.10 IF ( useBulkforce ) THEN
152     CALL THSICE_GET_PRECIP(
153 jmc 1.35 I iceMask, tOceMxL,
154 jmc 1.25 O prcAtm(1-OLx,1-OLy,bi,bj),
155 jmc 1.35 O snowPrc(1-OLx,1-OLy,bi,bj), qPrcRn,
156 jmc 1.8 O icFlxSW(1-OLx,1-OLy,bi,bj),
157 jmc 1.6 I iMin,iMax,jMin,jMax, bi,bj, myThid )
158 mlosch 1.10 ENDIF
159 jmc 1.2 #endif
160 mlosch 1.9 #ifdef ALLOW_EXF
161 mlosch 1.10 IF ( useEXF ) THEN
162     CALL THSICE_MAP_EXF(
163 jmc 1.31 I iceMask, tOceMxL,
164 jmc 1.25 O prcAtm(1-OLx,1-OLy,bi,bj),
165 jmc 1.31 O snowPrc(1-OLx,1-OLy,bi,bj), qPrcRn,
166 mlosch 1.9 O icFlxSW(1-OLx,1-OLy,bi,bj),
167     I iMin,iMax,jMin,jMax, bi,bj, myThid )
168 mlosch 1.10 ENDIF
169 mlosch 1.9 #endif
170 jmc 1.2
171 heimbach 1.21 #ifdef ALLOW_AUTODIFF_TAMC
172 jmc 1.26 CADJ STORE sHeating(:,:,bi,bj) = comlev1_bibj, key = ticekey
173 gforget 1.23 CADJ STORE tice1(:,:,bi,bj) = comlev1_bibj, key = ticekey
174     CADJ STORE tice2(:,:,bi,bj) = comlev1_bibj, key = ticekey
175 jmc 1.26 #else
176     IF ( .NOT.thSIce_skipThermo ) THEN
177 heimbach 1.21 #endif
178 jmc 1.26 CALL THSICE_STEP_TEMP(
179 jmc 1.8 I bi, bj, iMin, iMax, jMin, jMax,
180     I myTime, myIter, myThid )
181    
182 jmc 1.33 #ifdef ALLOW_CHEAPAML
183     ENDIF
184     #endif
185 heimbach 1.13 #ifdef ALLOW_AUTODIFF_TAMC
186 gforget 1.23 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 jmc 1.26 CADJ STORE sHeating(:,:,bi,bj) = comlev1_bibj, key = ticekey
196 jmc 1.29 #else
197     ENDIF
198     IF ( .NOT.thSIce_skipThermo ) THEN
199 heimbach 1.13 #endif
200 jmc 1.26 CALL THSICE_STEP_FWD(
201 jmc 1.8 I bi, bj, iMin, iMax, jMin, jMax,
202 jmc 1.31 I prcAtm(1-OLx,1-OLy,bi,bj), qPrcRn,
203 jmc 1.1 I myTime, myIter, myThid )
204 jmc 1.26 #ifndef ALLOW_AUTODIFF_TAMC
205     ENDIF
206     #endif
207 jmc 1.2
208 jmc 1.25 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 jmc 1.26 CALL THSICE_BALANCE_FRW(
216 jmc 1.25 I iMin, iMax, jMin, jMax,
217     I prcAtm, myTime, myIter, myThid )
218     ENDIF
219     #endif
220    
221 jmc 1.24 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 jmc 1.28 IF ( useSEAICE .OR. thSIceAdvScheme.GT.0
226 jmc 1.34 & .OR. stressReduction.GT.zeroRL ) THEN
227 jmc 1.28 CALL THSICE_DO_EXCH( myThid )
228 jmc 1.24 ENDIF
229 jmc 1.28 #ifdef OLD_THSICE_CALL_SEQUENCE
230 jmc 1.24 #ifdef ATMOSPHERIC_LOADING
231 jmc 1.34 IF ( useRealFreshWaterFlux )
232 jmc 1.24 & _EXCH_XY_RS( sIceLoad, myThid )
233     #endif
234 jmc 1.28 #else /* OLD_THSICE_CALL_SEQUENCE */
235     #ifdef ATMOSPHERIC_LOADING
236 jmc 1.34 IF ( useRealFreshWaterFlux .AND. thSIceAdvScheme.LE.0 )
237 jmc 1.28 & _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 jmc 1.24
248     DO bj=myByLo(myThid),myByHi(myThid)
249     DO bi=myBxLo(myThid),myBxHi(myThid)
250 jmc 1.30 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 jmc 1.11 C-- note: If useSEAICE=.true., the stress is computed in seaice_model,
261     C-- and stressReduction is always set to zero
262 heimbach 1.7 #ifdef ALLOW_AUTODIFF_TAMC
263 gforget 1.23 CADJ STORE fu(:,:,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
264     CADJ STORE fv(:,:,bi,bj) = comlev1_bibj, key=ticekey, byte=isbyte
265 heimbach 1.7 #endif
266 jmc 1.11 IF ( stressReduction.GT. 0. _d 0 ) THEN
267 jmc 1.34 DO j = 1-OLy,sNy+OLy-1
268     DO i = 2-OLx,sNx+OLx-1
269 jmc 1.1 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 mlosch 1.10 ENDDO
273 jmc 1.1 ENDDO
274 jmc 1.34 DO j = 2-OLy,sNy+OLy-1
275     DO i = 1-OLx,sNx+OLx-1
276 jmc 1.1 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 mlosch 1.10 ENDDO
280 jmc 1.1 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