/[MITgcm]/MITgcm_contrib/torge/itd/code/advect.F
ViewVC logotype

Annotation of /MITgcm_contrib/torge/itd/code/advect.F

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


Revision 1.2 - (hide annotations) (download)
Wed Mar 27 18:59:52 2013 UTC (12 years, 4 months ago) by torge
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +1 -1 lines
updating my MITgcm_contrib directory to include latest changes on main branch;
settings are to run a 1D test szenario with ITD code and 7 categories

1 torge 1.2 C $Header: /u/gcmpack/MITgcm/pkg/seaice/advect.F,v 1.29 2012/11/09 22:15:18 heimbach Exp $
2 torge 1.1 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