/[MITgcm]/MITgcm/pkg/streamice/streamice_adv_front.F
ViewVC logotype

Contents of /MITgcm/pkg/streamice/streamice_adv_front.F

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


Revision 1.5 - (show annotations) (download)
Mon Oct 24 14:13:12 2016 UTC (7 years, 6 months ago) by dgoldberg
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, HEAD
Changes since 1.4: +2 -3 lines
ensure front advances to preset mask

1 C $Header: /u/gcmpack/MITgcm/pkg/streamice/streamice_adv_front.F,v 1.4 2016/10/20 15:24:24 dgoldberg Exp $
2 C $Name: $
3
4 #include "STREAMICE_OPTIONS.h"
5 #ifdef ALLOW_AUTODIFF
6 # include "AUTODIFF_OPTIONS.h"
7 #endif
8
9 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
10
11 CBOP
12 SUBROUTINE STREAMICE_ADV_FRONT (
13 & myThid,
14 & time_step,
15 & hflux_x_si,
16 & hflux_y_si )
17
18 C /============================================================\
19 C | SUBROUTINE |
20 C | o |
21 C |============================================================|
22 C | |
23 C \============================================================/
24 IMPLICIT NONE
25
26 C === Global variables ===
27 #include "SIZE.h"
28 #include "GRID.h"
29 #include "EEPARAMS.h"
30 #include "PARAMS.h"
31 #include "STREAMICE.h"
32 #include "STREAMICE_ADV.h"
33 #ifdef ALLOW_AUTODIFF_TAMC
34 # include "tamc.h"
35 #endif
36
37 INTEGER myThid
38 _RL time_step
39 _RL hflux_x_SI (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
40 _RL hflux_y_SI (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
41
42 #ifdef ALLOW_STREAMICE
43
44 INTEGER i, j, bi, bj, k, iter_count, iter_rpt
45 INTEGER Gi, Gj
46 INTEGER new_partial(4)
47 INTEGER ikey_front, ikey_1
48 _RL iter_flag
49 _RL n_flux_1, n_flux_2
50 _RL href, rho, partial_vol, tot_flux, hpot
51 CHARACTER*(MAX_LEN_MBUF) msgBuf
52 _RL hflux_x_SI2 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
53 _RL hflux_y_SI2 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
54
55 rho = streamice_density
56 cph iter_count = 0
57 iter_flag = 1. _d 0
58 iter_rpt = 0
59
60 DO bj=myByLo(myThid),myByHi(myThid)
61 DO bi=myBxLo(myThid),myBxHi(myThid)
62 DO j=1-OLy,sNy+OLy
63 DO i=1-OLx,sNx+OLx
64 hflux_x_SI2(i,j,bi,bj) = 0. _d 0
65 hflux_y_SI2(i,j,bi,bj) = 0. _d 0
66 ENDDO
67 ENDDO
68 ENDDO
69 ENDDO
70
71 DO iter_count = 0, 3
72
73 #ifdef ALLOW_AUTODIFF_TAMC
74 ikey_front = (ikey_dynamics-1)*4 + iter_count + 1
75 CADJ STORE area_shelf_streamice
76 CADJ & = comlev1_stream_front, key = ikey_front
77 CADJ STORE h_streamice
78 CADJ & = comlev1_stream_front, key = ikey_front
79 CADJ STORE hflux_x_si
80 CADJ & = comlev1_stream_front, key = ikey_front
81 CADJ STORE hflux_x_si2
82 CADJ & = comlev1_stream_front, key = ikey_front
83 CADJ STORE hflux_y_si
84 CADJ & = comlev1_stream_front, key = ikey_front
85 CADJ STORE hflux_y_si2
86 CADJ & = comlev1_stream_front, key = ikey_front
87 CADJ STORE streamice_hmask
88 CADJ & = comlev1_stream_front, key = ikey_front
89 CADJ STORE iter_flag
90 CADJ & = comlev1_stream_front, key = ikey_front
91 #endif
92
93 IF ( iter_flag .GT. 0. ) THEN
94
95 iter_flag = 0. _d 0
96
97 IF (iter_count .gt. 0) then
98 DO bj=myByLo(myThid),myByHi(myThid)
99 DO bi=myBxLo(myThid),myBxHi(myThid)
100 DO j=1-OLy,sNy+OLy
101 DO i=1-OLx,sNx+OLx
102 hflux_x_SI(i,j,bi,bj)=hflux_x_SI2(i,j,bi,bj)
103 hflux_y_SI(i,j,bi,bj)=hflux_y_SI2(i,j,bi,bj)
104 hflux_x_SI2(i,j,bi,bj) = 0. _d 0
105 hflux_y_SI2(i,j,bi,bj) = 0. _d 0
106 ENDDO
107 ENDDO
108 ENDDO
109 ENDDO
110 ENDIF
111
112 ! iter_count = iter_count + 1
113 iter_rpt = iter_rpt + 1
114
115 DO bj=myByLo(myThid),myByHi(myThid)
116 DO bi=myBxLo(myThid),myBxHi(myThid)
117
118 DO j=1-1,sNy+1
119 Gj = (myYGlobalLo-1)+(bj-1)*sNy+j
120 IF ((Gj .ge. 1) .and. (Gj .le. Ny)) THEN
121 DO i=1-1,sNx+1
122 Gi = (myXGlobalLo-1)+(bi-1)*sNx+i
123
124 #ifdef ALLOW_AUTODIFF_TAMC
125 act1 = bi - myBxLo(myThid)
126 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
127 act2 = bj - myByLo(myThid)
128 max2 = myByHi(myThid) - myByLo(myThid) + 1
129 act3 = myThid - 1
130 max3 = nTx*nTy
131 act4 = ikey_front - 1
132 ikey_1 = i + 1
133 & + (sNx+2)*(j)
134 & + (sNx+2)*(sNy+2)*act1
135 & + (sNx+2)*(sNy+2)*max1*act2
136 & + (sNx+2)*(sNy+2)*max1*max2*act3
137 & + (sNx+2)*(sNy+2)*max1*max2*max3*act4
138 CADJ STORE area_shelf_streamice(i,j,bi,bj)
139 CADJ & = comlev1_stream_ij, key = ikey_1
140 CADJ STORE h_streamice(i,j,bi,bj)
141 CADJ & = comlev1_stream_ij, key = ikey_1
142 CADJ STORE hflux_x_si(i,j,bi,bj)
143 CADJ & = comlev1_stream_ij, key = ikey_1
144 CADJ STORE hflux_y_si(i,j,bi,bj)
145 CADJ & = comlev1_stream_ij, key = ikey_1
146 CADJ STORE streamice_hmask(i,j,bi,bj)
147 CADJ & = comlev1_stream_ij, key = ikey_1
148 #endif
149
150 IF (.not. STREAMICE_calve_to_mask .OR.
151 & STREAMICE_calve_mask (i,j,bi,bj) .eq. 1.0) THEN
152
153 IF ((Gi .ge. 1) .and. (Gi .le. Nx) .and.
154 & (STREAMICE_Hmask(i,j,bi,bj).eq.0.0 .or.
155 & STREAMICE_Hmask(i,j,bi,bj).eq.2.0)) THEN
156 n_flux_1 = 0. _d 0
157 href = 0. _d 0
158 tot_flux = 0. _d 0
159
160 #ifdef ALLOW_AUTODIFF_TAMC
161 CADJ STORE hflux_x_SI(i,j,bi,bj)
162 CADJ & = comlev1_stream_ij, key = ikey_1
163 #endif
164 IF (hflux_x_SI(i,j,bi,bj).gt. 0. _d 0) THEN
165 n_flux_1 = n_flux_1 + 1. _d 0
166 href = href + H_streamice(i-1,j,bi,bj)
167 tot_flux = tot_flux + hflux_x_SI(i,j,bi,bj) *
168 & dxG(i,j,bi,bj) * time_step
169 hflux_x_SI(i,j,bi,bj) = 0. _d 0
170 ENDIF
171
172 #ifdef ALLOW_AUTODIFF_TAMC
173 CADJ STORE hflux_x_SI(i,j,bi,bj)
174 CADJ & = comlev1_stream_ij, key = ikey_1
175 #endif
176 IF (hflux_x_SI(i+1,j,bi,bj).lt. 0. _d 0) THEN
177 n_flux_1 = n_flux_1 + 1. _d 0
178 href = href + H_streamice(i+1,j,bi,bj)
179 tot_flux = tot_flux - hflux_x_SI(i+1,j,bi,bj) *
180 & dxG(i+1,j,bi,bj) * time_step
181 hflux_x_SI(i+1,j,bi,bj) = 0. _d 0
182 ENDIF
183
184 #ifdef ALLOW_AUTODIFF_TAMC
185 CADJ STORE hflux_y_SI(i,j,bi,bj)
186 CADJ & = comlev1_stream_ij, key = ikey_1
187 #endif
188 IF (hflux_y_SI(i,j,bi,bj).gt. 0. _d 0) THEN
189 n_flux_1 = n_flux_1 + 1. _d 0
190 href = href + H_streamice(i,j-1,bi,bj)
191 tot_flux = tot_flux + hflux_y_SI(i,j,bi,bj) *
192 & dyG(i,j,bi,bj) * time_step
193 hflux_y_SI(i,j,bi,bj) = 0. _d 0
194 ENDIF
195
196 #ifdef ALLOW_AUTODIFF_TAMC
197 CADJ STORE hflux_y_SI(i,j,bi,bj)
198 CADJ & = comlev1_stream_ij, key = ikey_1
199 #endif
200 IF (hflux_y_SI(i,j+1,bi,bj).lt. 0. _d 0) THEN
201 n_flux_1 = n_flux_1 + 1. _d 0
202 href = href + H_streamice(i,j+1,bi,bj)
203 tot_flux = tot_flux - hflux_y_SI(i,j+1,bi,bj) *
204 & dyG(i,j+1,bi,bj) * time_step
205 hflux_y_SI(i,j+1,bi,bj) = 0. _d 0
206 ENDIF
207
208 IF (n_flux_1 .gt. 0.) THEN
209
210 href = href / n_flux_1
211 partial_vol = H_streamice (i,j,bi,bj) *
212 & area_shelf_streamice (i,j,bi,bj) + tot_flux
213 hpot = partial_vol * recip_rA(i,j,bi,bj)
214
215 IF (hpot .eq. href) THEN ! cell is exactly covered, no overflow
216 STREAMICE_hmask (i,j,bi,bj) = 1.0
217 H_streamice (i,j,bi,bj) = href
218 area_shelf_streamice(i,j,bi,bj) =
219 & rA(i,j,bi,bj)
220 ELSEIF (hpot .lt. href) THEN ! cell still unfilled
221
222 STREAMICE_hmask (i,j,bi,bj) = 2.0
223 area_shelf_streamice (i,j,bi,bj) = partial_vol / href
224 H_streamice (i,j,bi,bj) = href
225 ELSE ! cell is filled - do overflow
226
227 STREAMICE_hmask (i,j,bi,bj) = 1.0
228 area_shelf_streamice(i,j,bi,bj) =
229 & rA(i,j,bi,bj)
230
231 PRINT *, "GOT HERE OVERFLOW ", i,j,
232 & area_shelf_streamice(i,j,bi,bj)
233 partial_vol = partial_vol - href * rA(i,j,bi,bj)
234
235 iter_flag = 1. _d 0
236
237 n_flux_2 = 0. _d 0 ;
238 DO k=1,4
239 new_partial (:) = 0
240 ENDDO
241
242 DO k=1,2
243 IF ( (STREAMICE_ufacemask(i-1+k,j,bi,bj).eq.2.0) .or.
244 & (STREAMICE_calve_to_mask .and.
245 & STREAMICE_calve_mask(i+2*k-3,j,bi,bj).ne.1.0)
246 & ) THEN ! at a permanent calving boundary - no advance allowed
247 n_flux_2 = n_flux_2 + 1. _d 0
248 ELSEIF (STREAMICE_hmask(i+2*k-3,j,bi,bj).eq.0 _d 0) THEN ! adjacent cell is completely ice free
249 n_flux_2 = n_flux_2 + 1. _d 0
250 new_partial (k) = 1
251 ENDIF
252 ENDDO
253 DO k=1,2
254 IF ( (STREAMICE_vfacemask (i,j-1+k,bi,bj).eq.2.0) .or.
255 & (STREAMICE_calve_to_mask .and.
256 & STREAMICE_calve_mask(i,j+2*k-3,bi,bj).ne.1.0)
257 & ) THEN ! at a permanent calving boundary - no advance allowed
258 n_flux_2 = n_flux_2 + 1. _d 0
259 ELSEIF (STREAMICE_hmask(i,j+2*k-3,bi,bj).eq.0 _d 0) THEN
260 n_flux_2 = n_flux_2 + 1. _d 0
261 new_partial (k+2) = 1
262 ENDIF
263 ENDDO
264
265 IF (n_flux_2 .eq. 0.) THEN ! there is nowhere to put the extra ice!
266 H_streamice(i,j,bi,bj) = href + partial_vol *
267 & recip_rA(i,j,bi,bj)
268 ELSE
269 H_streamice(i,j,bi,bj) = href
270
271 DO k=1,2
272 IF (new_partial(k) .eq. 1) THEN
273 hflux_x_SI2(i-1+k,j,bi,bj) =
274 & partial_vol/time_step/n_flux_2/
275 & dxG(i-1+k,j,bi,bj)
276 ENDIF
277 ENDDO
278
279 DO k=1,2
280 IF (new_partial(k+2) .eq. 1) THEN
281 hflux_y_SI2(i,j-1+k,bi,bj) =
282 & partial_vol/time_step/n_flux_2/
283 & dxG(i,j-1+k,bi,bj)
284 ENDIF
285 ENDDO
286
287 ENDIF
288 ENDIF
289 ENDIF
290
291 ENDIF
292 ENDIF
293 ENDDO
294 ENDIF
295 ENDDO
296 c
297 ENDDO
298 ENDDO
299 c
300 ENDIF
301 ENDDO
302
303 IF (iter_rpt.gt.1) THEN
304 WRITE(msgBuf,'(A,I5,A)') 'FRONT ADVANCE: ',iter_rpt,
305 & ' ITERATIONS'
306 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
307 & SQUEEZE_RIGHT , 1)
308 ENDIF
309
310 #endif
311 RETURN
312 END

  ViewVC Help
Powered by ViewVC 1.1.22