/[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.1 - (hide annotations) (download)
Sat Jun 8 22:15:33 2013 UTC (12 years, 1 month ago) by dgoldberg
Branch: MAIN
new advected scalar; new advection scheme for thickness update; corresponding TAF directives

1 dgoldberg 1.1 C $Header: /u/gcmpack/MITgcm_contrib/dgoldberg/streamice/streamice_advect_thickness_x.F,v 1.4 2012/09/18 17:06:48 dgoldberg Exp $
2     C $Name: $
3    
4     #include "STREAMICE_OPTIONS.h"
5    
6     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
7    
8     SUBROUTINE STREAMICE_ADV_FLUX_FL_X ( myThid ,
9     I UADV ,
10     I TRAC ,
11     I BC_FACEMASK,
12     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     _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     _RL 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     _RL time_step
41    
42     #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     LOGICAL H0_valid(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
50     ! there are valid cells to calculate a
51     ! 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     IF (((Gj .ge. 1) .and. (Gj .le. Ny))
73     & .or.STREAMICE_NS_PERIODIC) THEN
74     DO i=1-1,sNx+2
75     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    
84    
85     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     & uface.gt.0 .and.
91     & 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     & uface.le.0 .and.
96     & 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     & (STREAMICE_hmask(i-2,j,bi,bj).eq.1.0))
106     & H0_valid(i,j,bi,bj)=.true.
107    
108     IF (((Gi.eq.1).and.(STREAMICE_hmask(i-1,j,bi,bj).eq.3.0))
109     & .and.(.not.STREAMICE_EW_PERIODIC))
110     & 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    
124    
125     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     ENDIF
136    
137     IF (STREAMICE_ADV_SCHEME.ne.'DST3') THEN
138     XFLUX (i,j,bi,bj) = uface *
139     & (stencil(0) + phi * .5 * (1.0-cfl) *
140     & (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    
153     ELSE ! uface <= 0
154    
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     & (STREAMICE_hmask(i+1,j,bi,bj).eq.1.0))
160     & H0_valid(i,j,bi,bj)=.true.
161    
162     IF (((Gi.eq.Nx).and.(STREAMICE_hmask(i+1,j,bi,bj).eq.3.0))
163     & .and.(.not.STREAMICE_EW_PERIODIC))
164     & 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     ENDIF
207    
208     ENDIF
209    
210     ENDIF
211     ENDDO
212     ENDIF
213     ENDDO
214     ENDDO
215     ENDDO
216    
217     !C X-FLUXES AT CELL BOUNDARIES CALCULATED; NOW TAKE FLUX DIVERGENCE TO INCREMENT THICKNESS
218     !
219     ! DO bj=myByLo(myThid),myByHi(myThid)
220     ! DO bi=myBxLo(myThid),myBxHi(myThid)
221     ! DO j=1-3,sNy+3
222     ! Gj = (myYGlobalLo-1)+(bj-1)*sNy+j
223     ! IF ((Gj .ge. 1) .and. (Gj .le. Ny)) THEN
224     ! DO i=1-2,sNx+2
225     ! IF (STREAMICE_hmask(i,j,bi,bj).eq.1.0) THEN
226     ! h(i,j,bi,bj) = h(i,j,bi,bj) - time_step *
227     ! & (hflux_x(i+1,j,bi,bj)*dyG(i+1,j,bi,bj) -
228     ! & hflux_x(i,j,bi,bj)*dyG(i,j,bi,bj)) *
229     ! & recip_rA (i,j,bi,bj)
230     ! ENDIF
231     ! ENDDO
232     ! ENDIF
233     ! ENDDO
234     ! ENDDO
235     ! ENDDO
236    
237    
238    
239     #endif
240     RETURN
241     END SUBROUTINE STREAMICE_ADV_FLUX_FL_X
242    

  ViewVC Help
Powered by ViewVC 1.1.22