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

Annotation of /MITgcm_contrib/dgoldberg/streamice/streamice_adv_flux_fl_x.F

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


Revision 1.3 - (hide annotations) (download)
Wed Aug 27 19:29:12 2014 UTC (10 years, 11 months ago) by dgoldberg
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +32 -33 lines
updating contrib streamice repo with latest files, and separated out convergence checks; and parameterised maximum iteration counts and interface w shelfice for coupling

1 dgoldberg 1.3 C $Header: /u/gcmpack/MITgcm/pkg/streamice/streamice_adv_flux_fl_x.F,v 1.2 2013/07/02 19:09:42 jmc Exp $
2 dgoldberg 1.1 C $Name: $
3    
4     #include "STREAMICE_OPTIONS.h"
5    
6     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
7    
8 dgoldberg 1.3 SUBROUTINE STREAMICE_ADV_FLUX_FL_X ( myThid ,
9 dgoldberg 1.1 I UADV ,
10     I TRAC ,
11 dgoldberg 1.3 I BC_FACEMASK,
12 dgoldberg 1.1 I BC_XVALUES,
13     O XFLUX,
14     I time_step )
15    
16     IMPLICIT NONE
17    
18     C O hflux_x ! flux per unit width across face
19     C O h
20     C I time_step
21    
22     C === Global variables ===
23     #include "SIZE.h"
24     #include "GRID.h"
25     #include "EEPARAMS.h"
26     #include "PARAMS.h"
27     #include "STREAMICE.h"
28     #ifdef ALLOW_AUTODIFF_TAMC
29     # include "tamc.h"
30     #endif
31     !#include "GAD_FLUX_LIMITER.h"
32    
33    
34     INTEGER myThid
35 dgoldberg 1.3 _RL UADV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
36     _RL TRAC (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
37     _RS BC_FACEMASK (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
38     _RL BC_XVALUES (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
39     _RL XFLUX (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
40 dgoldberg 1.1 _RL time_step
41 dgoldberg 1.3
42 dgoldberg 1.1 #ifdef ALLOW_STREAMICE
43    
44     C LOCAL VARIABLES
45    
46     INTEGER i, j, bi, bj, Gi, Gj, k
47     _RL uface, phi, cfl, Cr, rdenom, d0, d1, psi
48     _RL stencil (-1:1)
49 dgoldberg 1.3 LOGICAL H0_valid(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
50     ! there are valid cells to calculate a
51 dgoldberg 1.1 ! slope-limited 2nd order flux
52     _RL SLOPE_LIMITER
53     ! _RL total_vol_out
54     external SLOPE_LIMITER
55    
56     ! total_vol_out = 0.0
57    
58     DO bj=myByLo(myThid),myByHi(myThid)
59     DO bi=myBxLo(myThid),myBxHi(myThid)
60     DO j=1-oly,sNy+oly
61     DO i=1-olx,sNx+olx
62     H0_valid(i,j,bi,bj)=.false.
63     ENDDO
64     ENDDO
65     ENDDO
66     ENDDO
67    
68     DO bj=myByLo(myThid),myByHi(myThid)
69     DO bi=myBxLo(myThid),myBxHi(myThid)
70     DO j=1-3,sNy+3
71     Gj = (myYGlobalLo-1)+(bj-1)*sNy+j
72 dgoldberg 1.3 IF (((Gj .ge. 1) .and. (Gj .le. Ny))
73 dgoldberg 1.1 & .or.STREAMICE_NS_PERIODIC) THEN
74 dgoldberg 1.2 DO i=1,sNx+1
75 dgoldberg 1.1 C THESE ARRAY BOUNDS INSURE THAT AFTER THIS STEP,
76     C VALUES WILL BE RELIABLE 1 GRID CELLS OUT IN THE
77     C X DIRECTION AND 3 CELLS OUT IN THE Y DIR
78     IF ((STREAMICE_hmask(i,j,bi,bj).eq.1.0) .or.
79     & ((STREAMICE_hmask(i-1,j,bi,bj).eq.1.0) .and.
80     & (STREAMICE_hmask(i,j,bi,bj).ne.1.0))) THEN
81    
82     Gi = (myXGlobalLo-1)+(bi-1)*sNx+i
83 dgoldberg 1.3
84    
85 dgoldberg 1.1 uface = UADV(i,j,bi,bj)
86     cfl = ABS(uface) * time_step * recip_dxC(i,j,bi,bj)
87    
88    
89     IF (BC_FACEMASK(i,j,bi,bj).eq.3.0 .and.
90 dgoldberg 1.3 & uface.gt.0 .and.
91 dgoldberg 1.1 & STREAMICE_hmask(i,j,bi,bj).eq.1.0) THEN
92     XFLUX (i,j,bi,bj) = BC_XVALUES(i,j,bi,bj) * uface
93     ELSEIF
94     & (BC_FACEMASK(i,j,bi,bj).eq.3.0 .and.
95 dgoldberg 1.3 & uface.le.0 .and.
96 dgoldberg 1.1 & STREAMICE_hmask(i-1,j,bi,bj).eq.1.0) THEN
97     XFLUX (i,j,bi,bj) = BC_XVALUES(i,j,bi,bj) * uface
98     ELSE
99    
100     IF (uface .gt. 0. _d 0) THEN
101     DO k=-1,1
102     stencil (k) = TRAC(i+k-1,j,bi,bj)
103     ENDDO
104     IF ((STREAMICE_hmask(i,j,bi,bj).eq.1.0) .and.
105 dgoldberg 1.3 & (STREAMICE_hmask(i-2,j,bi,bj).eq.1.0))
106     & H0_valid(i,j,bi,bj)=.true.
107    
108 dgoldberg 1.1 IF (((Gi.eq.1).and.(STREAMICE_hmask(i-1,j,bi,bj).eq.3.0))
109 dgoldberg 1.3 & .and.(.not.STREAMICE_EW_PERIODIC))
110 dgoldberg 1.1 & THEN ! we are at western bdry and there is a thick. bdry cond
111    
112     XFLUX (i,j,bi,bj) = TRAC(i-1,j,bi,bj) * uface
113    
114     ELSEIF (H0_valid(i,j,bi,bj)) THEN
115    
116     rdenom = (stencil(1)-stencil(0))
117     IF (rdenom .ne. 0.) THEN
118     Cr = (stencil(0)-stencil(-1))/rdenom
119     ELSE
120     Cr = 1.E20 * (stencil(0)-stencil(-1))
121     ENDIF
122    
123 dgoldberg 1.3
124    
125 dgoldberg 1.1 IF (STREAMICE_ADV_SCHEME.ne.'DST3') THEN
126     ! phi = SLOPE_LIMITER(stencil(0)-stencil(-1),
127     ! & stencil(1)-stencil(0))
128     phi = SLOPE_LIMITER (Cr)
129     ELSE
130     d0 = (2.-cfl)*(1.-cfl)/6.0
131     d1 = (1.-cfl**2)/6.0
132     psi = d0+d1*Cr
133     phi = MAX(0. _d 0,MIN(MIN(1. _d 0,psi),
134     & Cr*(1. _d 0 -CFL)/(CFL+1. _d -20) ))
135 dgoldberg 1.3 ENDIF
136 dgoldberg 1.1
137     IF (STREAMICE_ADV_SCHEME.ne.'DST3') THEN
138     XFLUX (i,j,bi,bj) = uface *
139 dgoldberg 1.3 & (stencil(0) + phi * .5 * (1.0-cfl) *
140 dgoldberg 1.1 & (stencil(1)-stencil(0)))
141     ELSE
142     XFLUX (i,j,bi,bj) = uface *
143     & (stencil(0) + phi *
144     & (stencil(1)-stencil(0)))
145     ENDIF
146    
147     ELSE ! one of the two cells needed for a HO scheme is missing, use FO scheme
148    
149     XFLUX (i,j,bi,bj) = uface * stencil(0)
150    
151     ENDIF
152 dgoldberg 1.3
153 dgoldberg 1.2 ELSEIF (uface .lt. 0. _d 0) THEN ! uface <= 0
154 dgoldberg 1.1
155     DO k=-1,1
156     stencil (k) = TRAC(i-k,j,bi,bj)
157     ENDDO
158     IF ((STREAMICE_hmask(i-1,j,bi,bj).eq.1.0) .and.
159 dgoldberg 1.3 & (STREAMICE_hmask(i+1,j,bi,bj).eq.1.0))
160     & H0_valid(i,j,bi,bj)=.true.
161 dgoldberg 1.1
162     IF (((Gi.eq.Nx).and.(STREAMICE_hmask(i+1,j,bi,bj).eq.3.0))
163 dgoldberg 1.3 & .and.(.not.STREAMICE_EW_PERIODIC))
164 dgoldberg 1.1 & THEN ! we are at western bdry and there is a thick. bdry cond
165    
166     XFLUX (i,j,bi,bj) = TRAC(i+1,j,bi,bj) * uface
167    
168     ELSEIF (H0_valid(i,j,bi,bj)) THEN
169    
170     rdenom = (stencil(1)-stencil(0))
171     IF (rdenom .ne. 0.) THEN
172     Cr = (stencil(0)-stencil(-1))/rdenom
173     ELSE
174     Cr = 1.E20 * (stencil(0)-stencil(-1))
175     ENDIF
176    
177     IF (STREAMICE_ADV_SCHEME.ne.'DST3') THEN
178     ! phi = SLOPE_LIMITER(stencil(0)-stencil(-1),
179     ! & stencil(1)-stencil(0))
180     phi = SLOPE_LIMITER (Cr)
181    
182     ELSE
183     d0 = (2.-cfl)*(1.-cfl)/6.0
184     d1 = (1.-cfl**2)/6.0
185     psi = d0+d1*Cr
186     phi = MAX(0. _d 0,MIN(MIN(1. _d 0,psi),
187     & Cr*(1. _d 0 -CFL)/(CFL+1. _d -20) ))
188     ENDIF
189    
190     IF (STREAMICE_ADV_SCHEME.ne.'DST3') THEN
191     XFLUX (i,j,bi,bj) = uface *
192     & (stencil(0) + phi * .5 * (1.0-cfl) *
193     & (stencil(1)-stencil(0)))
194     ELSE
195     XFLUX (i,j,bi,bj) = uface *
196     & (stencil(0) + phi *
197     & (stencil(1)-stencil(0)))
198     ENDIF
199    
200     ELSE ! one of the two cells needed for a HO scheme is missing, use FO scheme
201    
202     Xflux (i,j,bi,bj) = uface * stencil(0)
203    
204     ENDIF
205    
206 dgoldberg 1.2 ELSE
207    
208     Xflux (i,j,bi,bj) = 0. _d 0
209    
210     ENDIF
211 dgoldberg 1.1
212 dgoldberg 1.3 ENDIF
213 dgoldberg 1.1
214     ENDIF
215     ENDDO
216     ENDIF
217     ENDDO
218     ENDDO
219     ENDDO
220    
221     !C X-FLUXES AT CELL BOUNDARIES CALCULATED; NOW TAKE FLUX DIVERGENCE TO INCREMENT THICKNESS
222 dgoldberg 1.3 !
223 dgoldberg 1.1 ! DO bj=myByLo(myThid),myByHi(myThid)
224     ! DO bi=myBxLo(myThid),myBxHi(myThid)
225     ! DO j=1-3,sNy+3
226     ! Gj = (myYGlobalLo-1)+(bj-1)*sNy+j
227     ! IF ((Gj .ge. 1) .and. (Gj .le. Ny)) THEN
228     ! DO i=1-2,sNx+2
229     ! IF (STREAMICE_hmask(i,j,bi,bj).eq.1.0) THEN
230 dgoldberg 1.3 ! h(i,j,bi,bj) = h(i,j,bi,bj) - time_step *
231 dgoldberg 1.1 ! & (hflux_x(i+1,j,bi,bj)*dyG(i+1,j,bi,bj) -
232     ! & hflux_x(i,j,bi,bj)*dyG(i,j,bi,bj)) *
233     ! & recip_rA (i,j,bi,bj)
234     ! ENDIF
235     ! ENDDO
236     ! ENDIF
237     ! ENDDO
238     ! ENDDO
239     ! ENDDO
240    
241    
242 dgoldberg 1.3
243 dgoldberg 1.1 #endif
244     RETURN
245     END SUBROUTINE STREAMICE_ADV_FLUX_FL_X

  ViewVC Help
Powered by ViewVC 1.1.22