/[MITgcm]/MITgcm/pkg/seaice/advect.F
ViewVC logotype

Contents of /MITgcm/pkg/seaice/advect.F

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


Revision 1.29 - (show annotations) (download)
Fri Nov 9 22:15:18 2012 UTC (11 years, 6 months ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65d, checkpoint65e, checkpoint65, checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f
Changes since 1.28: +2 -1 lines
Merge SEAICE_SIZE.h inclusion from MITgcm_contrib/torge/itd/code/
into main branch

1 C $Header: /u/gcmpack/MITgcm_contrib/torge/itd/code/advect.F,v 1.1 2012/10/24 21:48:53 torge Exp $
2 C $Name: $
3
4 #include "SEAICE_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: ADVECT
8 C !INTERFACE:
9 SUBROUTINE ADVECT(
10 I UI, VI,
11 U fld,
12 O fldNm1,
13 I iceMsk, myThid )
14
15 C !DESCRIPTION: \bv
16 C *==========================================================*
17 C | S/R ADVECT
18 C | o Calculate advection and diffusion
19 C | and update the input ice-field
20 C *==========================================================*
21 C \ev
22
23 C !USES:
24 IMPLICIT NONE
25
26 C == Global variables ===
27 #include "SIZE.h"
28 #include "EEPARAMS.h"
29 #include "PARAMS.h"
30 #include "GRID.h"
31 #include "SEAICE_SIZE.h"
32 #include "SEAICE_PARAMS.h"
33 #ifdef ALLOW_AUTODIFF_TAMC
34 # include "tamc.h"
35 #endif
36
37 C !INPUT/OUTPUT PARAMETERS:
38 C == Routine arguments ==
39 C UI, VI :: ice velocity components
40 C fld :: input and updated ice-field
41 C fldNm1 :: copy of the input ice-field
42 C iceMsk :: Ocean/Land mask
43 C myThid :: my Thread Id. number
44 _RL UI (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
45 _RL VI (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
46 _RL fld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
47 _RL fldNm1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
48 _RL iceMsk (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
49 INTEGER myThid
50 CEOP
51
52 C !LOCAL VARIABLES:
53 C == Local variables ==
54 C i,j,k,bi,bj :: Loop counters
55 INTEGER i, j, bi, bj
56 INTEGER k
57 _RL DELTT
58 _RL DIFFA (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
59 _RL tmpFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
60 _RL afx (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
61 _RL afy (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
62
63 DELTT=SEAICE_deltaTtherm
64 C save fld from previous time step
65 DO bj=myByLo(myThid),myByHi(myThid)
66 DO bi=myBxLo(myThid),myBxHi(myThid)
67 DO j=1-OLy,sNy+OLy
68 DO i=1-OLx,sNx+OLx
69 fldNm1(i,j,bi,bj) = fld(i,j,bi,bj)
70 ENDDO
71 ENDDO
72 ENDDO
73 ENDDO
74
75 DO k=1,2
76 cph IF ( k .EQ. 1 ) THEN
77 C Prediction step
78 cph DO bj=myByLo(myThid),myByHi(myThid)
79 cph DO bi=myBxLo(myThid),myBxHi(myThid)
80 cph DO j=1-OLy,sNy+OLy
81 cph DO i=1-OLx,sNx+OLx
82 cph tmpFld(i,j,bi,bj) = fld(i,j,bi,bj)
83 cph ENDDO
84 cph ENDDO
85 cph ENDDO
86 cph ENDDO
87 cph ELSE
88 C Backward Euler correction step
89 DO bj=myByLo(myThid),myByHi(myThid)
90 DO bi=myBxLo(myThid),myBxHi(myThid)
91 DO j=1-OLy,sNy+OLy
92 DO i=1-OLx,sNx+OLx
93 cph for k=1 this is same as tmpFld = fld
94 tmpFld(i,j,bi,bj)=HALF*(fld(i,j,bi,bj)
95 & +fldNm1(i,j,bi,bj))
96 ENDDO
97 ENDDO
98 ENDDO
99 ENDDO
100 cph ENDIF
101
102 #ifdef ALLOW_AUTODIFF_TAMC
103 cphCADJ STORE fld = comlev1, key = ikey_dynamics
104 cphCADJ STORE fldNm1 = comlev1, key = ikey_dynamics
105 cphCADJ STORE tmpFld = comlev1, key = ikey_dynamics
106 DO J=1-Oly,sNy+Oly
107 DO I=1-Olx,sNx+Olx
108 afx(i,j) = 0. _d 0
109 afy(i,j) = 0. _d 0
110 ENDDO
111 ENDDO
112 #endif /* ALLOW_AUTODIFF_TAMC */
113
114 C NOW GO THROUGH STANDARD CONSERVATIVE ADVECTION
115 IF ( .NOT. SEAICEuseFluxForm ) THEN
116 DO bj=myByLo(myThid),myByHi(myThid)
117 DO bi=myBxLo(myThid),myBxHi(myThid)
118 DO j=0,sNy+1
119 DO i=0,sNx+1
120 CML This formulation gives the same result as the original code on a
121 CML lat-lon-grid, but may not be accurate on irregular grids
122 fld(i,j,bi,bj)=fldNm1(i,j,bi,bj)
123 & -DELTT*(
124 & ( tmpFld(i ,j ,bi,bj)+tmpFld(i+1,j ,bi,bj))
125 & * UI(i+1,j, bi,bj) -
126 & ( tmpFld(i ,j ,bi,bj)+tmpFld(i-1,j ,bi,bj))
127 & * UI(i ,j, bi,bj) )*maskInC(i,j,bi,bj)
128 & *(HALF * _recip_dxF(i,j,bi,bj))
129 & -DELTT*(
130 & ( tmpFld(i ,j ,bi,bj)+tmpFld(i ,j+1,bi,bj))
131 & * VI(i ,j+1, bi,bj)
132 & * _dxG(i ,j+1,bi,bj) -
133 & ( tmpFld(i ,j ,bi,bj)+tmpFld(i ,j-1,bi,bj))
134 & * VI(i ,j , bi,bj)
135 & * _dxG(i,j,bi,bj))*maskInC(i,j,bi,bj)
136 & *(HALF * _recip_dyF(i,j,bi,bj) * _recip_dxF(i,j,bi,bj))
137 ENDDO
138 ENDDO
139 ENDDO
140 ENDDO
141 ELSE
142 C-- Use flux form for MITgcm compliance, unfortunately changes results
143 DO bj=myByLo(myThid),myByHi(myThid)
144 DO bi=myBxLo(myThid),myBxHi(myThid)
145 C-- first compute fluxes across cell faces
146 DO j=1,sNy+1
147 DO i=1,sNx+1
148 afx(i,j) = _dyG(i,j,bi,bj) * UI(i,j,bi,bj)
149 & * 0.5 _d 0 * (tmpFld(i,j,bi,bj)+tmpFld(i-1,j,bi,bj))
150 afy(i,j) = _dxG(i,j,bi,bj) * VI(i,j,bi,bj)
151 & * 0.5 _d 0 * (tmpFld(i,j,bi,bj)+tmpFld(i,j-1,bi,bj))
152 ENDDO
153 ENDDO
154 DO j=1,sNy
155 DO i=1,sNx
156 fld(i,j,bi,bj)=fldNm1(i,j,bi,bj)
157 & -DELTT * (
158 & afx(i+1,j) - afx(i,j)
159 & + afy(i,j+1) - afy(i,j)
160 & )*recip_rA(i,j,bi,bj)*maskInC(i,j,bi,bj)
161 ENDDO
162 ENDDO
163 ENDDO
164 ENDDO
165 ENDIF
166
167 CALL EXCH_XY_RL( fld, myThid )
168
169 ENDDO
170
171 IF ( DIFF1.GT.0. _d 0 ) THEN
172 C NOW DO DIFFUSION
173
174 C make a working copy of field from last time step
175 DO bj=myByLo(myThid),myByHi(myThid)
176 DO bi=myBxLo(myThid),myBxHi(myThid)
177 DO j=1-OLy,sNy+OLy
178 DO i=1-OLx,sNx+OLx
179 tmpFld(i,j,bi,bj) = fldNm1(i,j,bi,bj)
180 ENDDO
181 ENDDO
182 ENDDO
183 ENDDO
184
185 C NOW CALCULATE DIFFUSION COEF ROUGHLY
186 C 1rst pass: compute changes due to harmonic diffusion and add it to ice-field
187 DO bj=myByLo(myThid),myByHi(myThid)
188 DO bi=myBxLo(myThid),myBxHi(myThid)
189 DO j=1-OLy,sNy+OLy
190 DO i=1-OLx,sNx+OLx
191 DIFFA(i,j,bi,bj) = MIN( _dxF(i,j,bi,bj), _dyF(i,j,bi,bj) )
192 ENDDO
193 ENDDO
194 ENDDO
195 ENDDO
196 C- Compute laplacian of ice-field; return result in same array
197 CALL DIFFUS( tmpFld, DIFFA, iceMsk, myThid )
198
199 DO bj=myByLo(myThid),myByHi(myThid)
200 DO bi=myBxLo(myThid),myBxHi(myThid)
201 DO j=1-OLy,sNy+OLy
202 DO i=1-OLx,sNx+OLx
203 fld(i,j,bi,bj) = ( fld(i,j,bi,bj)
204 & +tmpFld(i,j,bi,bj)*DIFF1*DELTT
205 & )*iceMsk(i,j,bi,bj)
206 ENDDO
207 ENDDO
208 ENDDO
209 ENDDO
210
211 c IF ( useBiHarmonic ) THEN
212 C 2nd pass: compute changes due to biharmonic diffusion and add it to ice-field
213 _EXCH_XY_RL( tmpFld, myThid )
214 C use some strange quadratic form for the second time around
215 DO bj=myByLo(myThid),myByHi(myThid)
216 DO bi=myBxLo(myThid),myBxHi(myThid)
217 DO j=1-OLy,sNy+OLy
218 DO i=1-OLx,sNx+OLx
219 #ifdef ALLOW_AUTODIFF_TAMC
220 C to avoid recomputations when there was a k loop; not needed anymore
221 c DIFFA(i,j,bi,bj) = MIN( _dxF(i,j,bi,bj), _dyF(i,j,bi,bj) )
222 #endif
223 DIFFA(i,j,bi,bj) = - DIFFA(i,j,bi,bj)*DIFFA(i,j,bi,bj)
224 ENDDO
225 ENDDO
226 ENDDO
227 ENDDO
228 C- Compute bilaplacian (laplacian of laplacian); return result in same array
229 CALL DIFFUS( tmpFld, DIFFA, iceMsk, myThid )
230
231 DO bj=myByLo(myThid),myByHi(myThid)
232 DO bi=myBxLo(myThid),myBxHi(myThid)
233 DO j=1-OLy,sNy+OLy
234 DO i=1-OLx,sNx+OLx
235 fld(i,j,bi,bj) = ( fld(i,j,bi,bj)
236 & +tmpFld(i,j,bi,bj)*DIFF1*DELTT
237 & )*iceMsk(i,j,bi,bj)
238 ENDDO
239 ENDDO
240 ENDDO
241 ENDDO
242 C-- end biharmonic block
243 c ENDIF
244
245 C-- end DIFF1 > 0 block
246 ENDIF
247
248 RETURN
249 END

  ViewVC Help
Powered by ViewVC 1.1.22