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

Annotation 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 - (hide 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 dgoldberg 1.8 C $Header: /u/gcmpack/MITgcm_contrib/dgoldberg/streamice/streamice_advect_thickness.F,v 1.7 2013/03/07 15:12:19 dgoldberg Exp $
2 heimbach 1.1 C $Name: $
3    
4     #include "STREAMICE_OPTIONS.h"
5    
6     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
7    
8    
9     CBOP
10 dgoldberg 1.8 SUBROUTINE STREAMICE_ADVECT_THICKNESS ( myThid,myIter,time_step )
11 heimbach 1.1
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 heimbach 1.2 #ifdef ALLOW_AUTODIFF_TAMC
28     # include "tamc.h"
29     #endif
30 heimbach 1.1
31 dgoldberg 1.8 INTEGER myThid, myIter
32 heimbach 1.1 _RL time_step
33    
34     #ifdef ALLOW_STREAMICE
35    
36     INTEGER i, j, bi, bj
37 dgoldberg 1.8 _RL thick_bd, uflux, vflux
38 dgoldberg 1.6 _RL sec_per_year, time_step_loc, MR, SMB, TMB
39 dgoldberg 1.8 _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 dgoldberg 1.3 CHARACTER*(MAX_LEN_MBUF) msgBuf
51 heimbach 1.1
52     sec_per_year = 365.*86400.
53    
54     time_step_loc = time_step / sec_per_year
55    
56 dgoldberg 1.7 PRINT *, "time_step_loc ", time_step_loc
57    
58 heimbach 1.2 #ifdef ALLOW_AUTODIFF_TAMC
59     CADJ STORE streamice_hmask = comlev1, key=ikey_dynamics
60     #endif
61    
62 heimbach 1.1 DO bj=myByLo(myThid),myByHi(myThid)
63     DO bi=myBxLo(myThid),myBxHi(myThid)
64 dgoldberg 1.8 DO j=1-3,sNy+3
65     DO i=1-3,sNx+3
66    
67 dgoldberg 1.5 H_streamice_prev(i,j,bi,bj) =
68     & H_streamice(i,j,bi,bj)
69 dgoldberg 1.8
70 heimbach 1.1 hflux_x_SI (i,j,bi,bj) = 0. _d 0
71     hflux_y_SI (i,j,bi,bj) = 0. _d 0
72 dgoldberg 1.8
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 heimbach 1.1 ENDIF
96    
97 dgoldberg 1.8 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 heimbach 1.1 ENDIF
119 dgoldberg 1.8
120    
121 heimbach 1.1 ENDDO
122     ENDDO
123     ENDDO
124     ENDDO
125    
126 dgoldberg 1.8 _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 dgoldberg 1.3
133 heimbach 1.2 #ifdef ALLOW_AUTODIFF_TAMC
134     CADJ STORE streamice_hmask = comlev1, key=ikey_dynamics
135 dgoldberg 1.8 CADJ STORE H_streamice = comlev1, key=ikey_dynamics
136 heimbach 1.2 #endif
137    
138 dgoldberg 1.8
139     CALL STREAMICE_ADV_FLUX_FL_X ( myThid ,
140     I utrans ,
141     I H_streamice ,
142     I BCMASKX,
143     I BCVALX,
144 heimbach 1.1 O hflux_x_SI,
145     I time_step_loc )
146    
147 dgoldberg 1.3
148 heimbach 1.1
149     DO bj=myByLo(myThid),myByHi(myThid)
150     DO bi=myBxLo(myThid),myBxHi(myThid)
151 dgoldberg 1.8 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 heimbach 1.1 ENDDO
164     ENDDO
165     ENDDO
166     ENDDO
167    
168 dgoldberg 1.8
169    
170 heimbach 1.2 #ifdef ALLOW_AUTODIFF_TAMC
171     CADJ STORE streamice_hmask = comlev1, key=ikey_dynamics
172     #endif
173    
174 dgoldberg 1.8 ! 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 heimbach 1.1 O hflux_y_SI,
185     I time_step_loc )
186    
187 dgoldberg 1.3
188 dgoldberg 1.8 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 heimbach 1.1
208     DO bj=myByLo(myThid),myByHi(myThid)
209     DO bi=myBxLo(myThid),myBxHi(myThid)
210 dgoldberg 1.8 DO j=1,sNy
211     DO i=1,sNx
212 heimbach 1.1 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 dgoldberg 1.8 ! CALL STREAMICE_ADV_FRONT (
222     ! & myThid, time_step_loc,
223     ! & hflux_x_SI, hflux_y_SI )
224    
225 dgoldberg 1.3
226 dgoldberg 1.8 #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 heimbach 1.1
237 dgoldberg 1.3
238 dgoldberg 1.4 ! NOW WE APPLY MELT RATES !!
239     ! THIS MAY BE MOVED TO A SEPARATE SUBROUTINE
240 heimbach 1.1
241 dgoldberg 1.4 DO bj=myByLo(myThid),myByHi(myThid)
242     DO bi=myBxLo(myThid),myBxHi(myThid)
243 dgoldberg 1.8 DO j=1,sNy
244     DO i=1,sNx
245 dgoldberg 1.4 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 dgoldberg 1.6 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 dgoldberg 1.4 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 dgoldberg 1.7 & H_streamice (i,j,bi,bj) + TMB * time_step_loc
259 dgoldberg 1.4 ENDIF
260     ENDIF
261     ENDDO
262     ENDDO
263     ENDDO
264     ENDDO
265 dgoldberg 1.8
266     _EXCH_XY_RL (H_streamice,myThid)
267 heimbach 1.1
268 dgoldberg 1.3 WRITE(msgBuf,'(A)') 'END STREAMICE_ADVECT_THICKNESS'
269     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
270     & SQUEEZE_RIGHT , 1)
271    
272 heimbach 1.1 #endif
273 heimbach 1.2 END
274 heimbach 1.1

  ViewVC Help
Powered by ViewVC 1.1.22