/[MITgcm]/MITgcm_contrib/dgoldberg/streamice/streamice_advect_thickness.F
ViewVC logotype

Contents of /MITgcm_contrib/dgoldberg/streamice/streamice_advect_thickness.F

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


Revision 1.8 - (show annotations) (download)
Sat Jun 8 22:15:33 2013 UTC (12 years, 1 month ago) by dgoldberg
Branch: MAIN
Changes since 1.7: +141 -33 lines
new advected scalar; new advection scheme for thickness update; corresponding TAF directives

1 C $Header: /u/gcmpack/MITgcm_contrib/dgoldberg/streamice/streamice_advect_thickness.F,v 1.7 2013/03/07 15:12:19 dgoldberg Exp $
2 C $Name: $
3
4 #include "STREAMICE_OPTIONS.h"
5
6 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
7
8
9 CBOP
10 SUBROUTINE STREAMICE_ADVECT_THICKNESS ( myThid,myIter,time_step )
11
12 C /============================================================\
13 C | SUBROUTINE |
14 C | o |
15 C |============================================================|
16 C | |
17 C \============================================================/
18 IMPLICIT NONE
19
20 C === Global variables ===
21 #include "SIZE.h"
22 #include "GRID.h"
23 #include "EEPARAMS.h"
24 #include "PARAMS.h"
25 #include "STREAMICE.h"
26 #include "STREAMICE_ADV.h"
27 #ifdef ALLOW_AUTODIFF_TAMC
28 # include "tamc.h"
29 #endif
30
31 INTEGER myThid, myIter
32 _RL time_step
33
34 #ifdef ALLOW_STREAMICE
35
36 INTEGER i, j, bi, bj
37 _RL thick_bd, uflux, vflux
38 _RL sec_per_year, time_step_loc, MR, SMB, TMB
39 _RL BCVALX(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
40 _RL BCVALY(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
41 _RS BCMASKX(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
42 _RS BCMASKY(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
43 _RL utrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
44 _RL vtrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
45 _RL h_after_uflux_SI(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
46 _RL h_after_vflux_SI(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
47 _RL hflux_x_SI(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
48 _RL hflux_y_SI(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
49
50 CHARACTER*(MAX_LEN_MBUF) msgBuf
51
52 sec_per_year = 365.*86400.
53
54 time_step_loc = time_step / sec_per_year
55
56 PRINT *, "time_step_loc ", time_step_loc
57
58 #ifdef ALLOW_AUTODIFF_TAMC
59 CADJ STORE streamice_hmask = comlev1, key=ikey_dynamics
60 #endif
61
62 DO bj=myByLo(myThid),myByHi(myThid)
63 DO bi=myBxLo(myThid),myBxHi(myThid)
64 DO j=1-3,sNy+3
65 DO i=1-3,sNx+3
66
67 H_streamice_prev(i,j,bi,bj) =
68 & H_streamice(i,j,bi,bj)
69
70 hflux_x_SI (i,j,bi,bj) = 0. _d 0
71 hflux_y_SI (i,j,bi,bj) = 0. _d 0
72
73
74 IF (STREAMICE_ufacemask(i,j,bi,bj).eq.3.0) THEN
75 BCMASKX(i,j,bi,bj) = 3.0
76 BCVALX(i,j,bi,bj) = h_ubdry_values_SI(i,j,bi,bj)
77 utrans(i,j,bi,bj) = .5 * (
78 & u_streamice(i,j,bi,bj)+u_streamice(i,j+1,bi,bj))
79 ELSEIF (STREAMICE_ufacemask(i,j,bi,bj).eq.4.0) THEN
80 uflux = u_flux_bdry_SI(i,j,bi,bj)
81 BCMASKX(i,j,bi,bj) = 0.0
82 BCVALX(i,j,bi,bj) = uflux
83 utrans(i,j,bi,bj) = 1.0
84 ELSEIF (.not.(
85 & STREAMICE_hmask(i,j,bi,bj).eq.1.0.OR.
86 & STREAMICE_hmask(i-1,j,bi,bj).eq.1.0)) THEN
87 BCMASKX(i,j,bi,bj) = 0.0
88 BCVALX(i,j,bi,bj) = 0. _d 0
89 utrans(i,j,bi,bj) = 0. _d 0
90 ELSE
91 BCMASKX(i,j,bi,bj) = 0.0
92 BCVALX(i,j,bi,bj) = 0. _d 0
93 utrans(i,j,bi,bj) = .5 * (
94 & u_streamice(i,j,bi,bj)+u_streamice(i,j+1,bi,bj))
95 ENDIF
96
97 IF (STREAMICE_vfacemask(i,j,bi,bj).eq.3.0) THEN
98 BCMASKy(i,j,bi,bj) = 3.0
99 BCVALy(i,j,bi,bj) = h_vbdry_values_SI(i,j,bi,bj)
100 vtrans(i,j,bi,bj) = .5 * (
101 & v_streamice(i,j,bi,bj)+v_streamice(i+1,j,bi,bj))
102 ELSEIF (STREAMICE_vfacemask(i,j,bi,bj).eq.4.0) THEN
103 vflux = v_flux_bdry_SI(i,j,bi,bj)
104 BCMASKy(i,j,bi,bj) = 0.0
105 BCVALy(i,j,bi,bj) = vflux
106 vtrans(i,j,bi,bj) = 1.0
107 ELSEIF (.not.(
108 & STREAMICE_hmask(i,j,bi,bj).eq.1.0.OR.
109 & STREAMICE_hmask(i,j-1,bi,bj).eq.1.0)) THEN
110 BCMASKY(i,j,bi,bj) = 0.0
111 BCVALY(i,j,bi,bj) = 0. _d 0
112 vtrans(i,j,bi,bj) = 0. _d 0
113 ELSE
114 BCMASKy(i,j,bi,bj) = 0.0
115 BCVALy(i,j,bi,bj) = 0. _d 0
116 vtrans(i,j,bi,bj) = .5 * (
117 & v_streamice(i,j,bi,bj)+v_streamice(i+1,j,bi,bj))
118 ENDIF
119
120
121 ENDDO
122 ENDDO
123 ENDDO
124 ENDDO
125
126 _EXCH_XY_RL(utrans,myThid)
127 _EXCH_XY_RL(vtrans,myThid)
128 _EXCH_XY_RS(BCMASKx,myThid)
129 _EXCH_XY_RS(BCMASKy,myThid)
130 _EXCH_XY_RL(BCVALX,myThid)
131 _EXCH_XY_RL(BCVALY,myThid)
132
133 #ifdef ALLOW_AUTODIFF_TAMC
134 CADJ STORE streamice_hmask = comlev1, key=ikey_dynamics
135 CADJ STORE H_streamice = comlev1, key=ikey_dynamics
136 #endif
137
138
139 CALL STREAMICE_ADV_FLUX_FL_X ( myThid ,
140 I utrans ,
141 I H_streamice ,
142 I BCMASKX,
143 I BCVALX,
144 O hflux_x_SI,
145 I time_step_loc )
146
147
148
149 DO bj=myByLo(myThid),myByHi(myThid)
150 DO bi=myBxLo(myThid),myBxHi(myThid)
151 DO j=1-3,sNy+3
152 DO i=1-1,sNx+1
153 IF (STREAMICE_hmask(i,j,bi,bj).eq.1.0) THEN
154 h_after_uflux_SI (i,j,bi,bj) = H_streamice(i,j,bi,bj) -
155 & (hflux_x_SI(i+1,j,bi,bj)*dyG(i+1,j,bi,bj) -
156 & hflux_x_SI(i,j,bi,bj)*dyG(i,j,bi,bj))
157 & * recip_rA (i,j,bi,bj) * time_step_loc
158 IF ( h_after_uflux_SI (i,j,bi,bj).le.0.0) THEN
159 PRINT *, "h neg after x", i,j,hflux_x_SI(i+1,j,bi,bj),
160 & hflux_x_SI(i,j,bi,bj)
161 ENDIF
162 ENDIF
163 ENDDO
164 ENDDO
165 ENDDO
166 ENDDO
167
168
169
170 #ifdef ALLOW_AUTODIFF_TAMC
171 CADJ STORE streamice_hmask = comlev1, key=ikey_dynamics
172 #endif
173
174 ! CALL STREAMICE_ADVECT_THICKNESS_Y ( myThid,
175 ! O hflux_y_SI,
176 ! O h_after_vflux_SI,
177 ! I time_step_loc )
178
179 CALL STREAMICE_ADV_FLUX_FL_Y ( myThid ,
180 I vtrans ,
181 I h_after_uflux_si ,
182 I BCMASKY,
183 I BCVALY,
184 O hflux_y_SI,
185 I time_step_loc )
186
187
188 DO bj=myByLo(myThid),myByHi(myThid)
189 DO bi=myBxLo(myThid),myBxHi(myThid)
190 DO j=1-1,sNy+1
191 DO i=1-1,sNx+1
192 IF (STREAMICE_hmask(i,j,bi,bj).eq.1.0) THEN
193 h_after_vflux_SI (i,j,bi,bj) = h_after_uflux_SI(i,j,bi,bj) -
194 & (hflux_y_SI(i,j+1,bi,bj)*dxG(i,j+1,bi,bj) -
195 & hflux_y_SI(i,j,bi,bj)*dxG(i,j,bi,bj)) *
196 & recip_rA (i,j,bi,bj) * time_step_loc
197 IF ( h_after_vflux_SI (i,j,bi,bj).le.0.0) THEN
198 PRINT *, "h neg after y", i,j,hflux_y_SI(i,j+1,bi,bj),
199 & hflux_y_SI(i,j,bi,bj)
200 ENDIF
201
202 ENDIF
203 ENDDO
204 ENDDO
205 ENDDO
206 ENDDO
207
208 DO bj=myByLo(myThid),myByHi(myThid)
209 DO bi=myBxLo(myThid),myBxHi(myThid)
210 DO j=1,sNy
211 DO i=1,sNx
212 IF (STREAMICE_hmask(i,j,bi,bj).eq.1.0) THEN
213 H_streamice (i,j,bi,bj) =
214 & h_after_vflux_SI (i,j,bi,bj)
215 ENDIF
216 ENDDO
217 ENDDO
218 ENDDO
219 ENDDO
220
221 ! CALL STREAMICE_ADV_FRONT (
222 ! & myThid, time_step_loc,
223 ! & hflux_x_SI, hflux_y_SI )
224
225
226 #ifdef ALLOW_STREAMICE_2DTRACER
227 CALL STREAMICE_ADVECT_2DTRACER(
228 & myThid,
229 & myIter,
230 & time_step,
231 & uTrans,
232 & vTrans,
233 & bcMaskx,
234 & bcMasky )
235 #endif
236
237
238 ! NOW WE APPLY MELT RATES !!
239 ! THIS MAY BE MOVED TO A SEPARATE SUBROUTINE
240
241 DO bj=myByLo(myThid),myByHi(myThid)
242 DO bi=myBxLo(myThid),myBxHi(myThid)
243 DO j=1,sNy
244 DO i=1,sNx
245 IF (STREAMICE_hmask(i,j,bi,bj).eq.1.0 .or.
246 & STREAMICE_hmask(i,j,bi,bj).eq.2.0) THEN
247 MR = (1.-float_frac_streamice(i,j,bi,bj)) *
248 & BDOT_STREAMICE(i,j,bi,bj)
249 SMB = ADOT_STREAMICE(i,j,bi,bj)
250 TMB = SMB - MR
251 IF ((TMB.lt.0.0) .and.
252 & (MR * time_step_loc .gt.
253 & H_streamice (i,j,bi,bj))) THEN
254 H_streamice (i,j,bi,bj) = 0. _d 0
255 STREAMICE_hmask(i,j,bi,bj) = 0.
256 ELSE
257 H_streamice (i,j,bi,bj) =
258 & H_streamice (i,j,bi,bj) + TMB * time_step_loc
259 ENDIF
260 ENDIF
261 ENDDO
262 ENDDO
263 ENDDO
264 ENDDO
265
266 _EXCH_XY_RL (H_streamice,myThid)
267
268 WRITE(msgBuf,'(A)') 'END STREAMICE_ADVECT_THICKNESS'
269 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
270 & SQUEEZE_RIGHT , 1)
271
272 #endif
273 END
274

  ViewVC Help
Powered by ViewVC 1.1.22