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

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

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


Revision 1.5 - (hide annotations) (download)
Mon Oct 24 14:13:12 2016 UTC (7 years, 7 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 dgoldberg 1.5 C $Header: /u/gcmpack/MITgcm/pkg/streamice/streamice_adv_front.F,v 1.4 2016/10/20 15:24:24 dgoldberg Exp $
2 dgoldberg 1.1 C $Name: $
3    
4     #include "STREAMICE_OPTIONS.h"
5 jmc 1.3 #ifdef ALLOW_AUTODIFF
6     # include "AUTODIFF_OPTIONS.h"
7     #endif
8 dgoldberg 1.1
9     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
10    
11     CBOP
12 jmc 1.3 SUBROUTINE STREAMICE_ADV_FRONT (
13     & myThid,
14 dgoldberg 1.1 & time_step,
15     & hflux_x_si,
16     & hflux_y_si )
17    
18     C /============================================================\
19 jmc 1.3 C | SUBROUTINE |
20 dgoldberg 1.1 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 jmc 1.3 CADJ STORE area_shelf_streamice
76 dgoldberg 1.1 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 jmc 1.3 ENDDO
110 dgoldberg 1.1 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 dgoldberg 1.5 IF (.not. STREAMICE_calve_to_mask .OR.
151 dgoldberg 1.2 & STREAMICE_calve_mask (i,j,bi,bj) .eq. 1.0) THEN
152    
153 dgoldberg 1.1 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 jmc 1.3 tot_flux = tot_flux + hflux_x_SI(i,j,bi,bj) *
168 dgoldberg 1.1 & 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 jmc 1.3 tot_flux = tot_flux - hflux_x_SI(i+1,j,bi,bj) *
180 dgoldberg 1.1 & 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 jmc 1.3 tot_flux = tot_flux + hflux_y_SI(i,j,bi,bj) *
192 dgoldberg 1.1 & 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 jmc 1.3 tot_flux = tot_flux - hflux_y_SI(i,j+1,bi,bj) *
204 dgoldberg 1.1 & dyG(i,j+1,bi,bj) * time_step
205     hflux_y_SI(i,j+1,bi,bj) = 0. _d 0
206     ENDIF
207 jmc 1.3
208 dgoldberg 1.1 IF (n_flux_1 .gt. 0.) THEN
209    
210     href = href / n_flux_1
211 jmc 1.3 partial_vol = H_streamice (i,j,bi,bj) *
212 dgoldberg 1.1 & area_shelf_streamice (i,j,bi,bj) + tot_flux
213     hpot = partial_vol * recip_rA(i,j,bi,bj)
214 jmc 1.3
215 dgoldberg 1.1 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 jmc 1.3 area_shelf_streamice(i,j,bi,bj) =
219 dgoldberg 1.1 & 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 jmc 1.3 area_shelf_streamice(i,j,bi,bj) =
229 dgoldberg 1.1 & rA(i,j,bi,bj)
230    
231 jmc 1.3 PRINT *, "GOT HERE OVERFLOW ", i,j,
232 dgoldberg 1.2 & area_shelf_streamice(i,j,bi,bj)
233 dgoldberg 1.1 partial_vol = partial_vol - href * rA(i,j,bi,bj)
234    
235     iter_flag = 1. _d 0
236    
237 jmc 1.3 n_flux_2 = 0. _d 0 ;
238 dgoldberg 1.1 DO k=1,4
239     new_partial (:) = 0
240     ENDDO
241    
242     DO k=1,2
243 jmc 1.3 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 dgoldberg 1.2 & ) THEN ! at a permanent calving boundary - no advance allowed
247 dgoldberg 1.1 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 jmc 1.3 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 dgoldberg 1.2 & ) THEN ! at a permanent calving boundary - no advance allowed
258 dgoldberg 1.1 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 jmc 1.3 hflux_x_SI2(i-1+k,j,bi,bj) =
274 dgoldberg 1.1 & 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 jmc 1.3 hflux_y_SI2(i,j-1+k,bi,bj) =
282 dgoldberg 1.1 & 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 dgoldberg 1.2 ENDIF
293 dgoldberg 1.1 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 jmc 1.3 & SQUEEZE_RIGHT , 1)
308 dgoldberg 1.1 ENDIF
309    
310     #endif
311     RETURN
312     END

  ViewVC Help
Powered by ViewVC 1.1.22