/[MITgcm]/MITgcm/model/src/calc_r_star.F
ViewVC logotype

Contents of /MITgcm/model/src/calc_r_star.F

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


Revision 1.11 - (show annotations) (download)
Tue May 22 11:34:18 2007 UTC (17 years ago) by mlosch
Branch: MAIN
CVS Tags: checkpoint59e, checkpoint59d, checkpoint59c
Changes since 1.10: +68 -45 lines
change error catch in calc_r_star to improve vectorization

1 C $Header: /u/gcmpack/MITgcm/model/src/calc_r_star.F,v 1.10 2006/06/07 01:55:12 heimbach Exp $
2 C $Name: $
3
4 #include "PACKAGES_CONFIG.h"
5 #include "CPP_OPTIONS.h"
6 #ifdef ALLOW_EXCH2
7 # include "W2_OPTIONS.h"
8 #endif
9
10 CBOP
11 C !ROUTINE: CALC_R_STAR
12 C !INTERFACE:
13 SUBROUTINE CALC_R_STAR( etaFld,
14 I myTime, myIter, myThid )
15 C !DESCRIPTION: \bv
16 C *==========================================================*
17 C | SUBROUTINE CALC_R_STAR
18 C | o Calculate new column thickness & scaling factor for r*
19 C | according to the surface r-position (Non-Lin Free-Surf)
20 C *==========================================================*
21 C \ev
22
23 C !USES:
24 IMPLICIT NONE
25 C == Global variables
26 #include "SIZE.h"
27 #include "EEPARAMS.h"
28 #include "PARAMS.h"
29 #include "GRID.h"
30 #include "SURFACE.h"
31
32 C !INPUT/OUTPUT PARAMETERS:
33 C == Routine arguments ==
34 C myTime :: Current time in simulation
35 C myIter :: Current iteration number in simulation
36 C myThid :: Thread number for this instance of the routine.
37 C etaFld :: current eta field used to update the hFactor
38 _RL myTime
39 INTEGER myIter
40 INTEGER myThid
41 _RL etaFld(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy)
42
43 #ifdef NONLIN_FRSURF
44
45 C !LOCAL VARIABLES:
46 C Local variables
47 C i,j,k,bi,bj :: loop counter
48 C numbWrite :: count the Number of warning written on STD-ERR file
49 C numbWrMax :: maximum Number of warning written on STD-ERR file
50 INTEGER i,j,k,bi,bj
51 INTEGER numbWrite, numbWrMax
52 INTEGER icntc1, icntc2, icntw, icnts
53 INTEGER iic, jjc, iic2, jjc2, iiw, jjw, iis, jjs
54 _RL tmpfldW, tmpfldS
55 c CHARACTER*(MAX_LEN_MBUF) suff
56 CEOP
57 #ifdef W2_FILL_NULL_REGIONS
58 INTEGER ii,jj
59 #endif
60 DATA numbWrite / 0 /
61 numbWrMax = Nx*Ny
62
63 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
64
65 #ifdef ALLOW_DEBUG
66 IF (debugMode) CALL DEBUG_ENTER('CALC_R_STAR',myThid)
67 #endif
68
69 DO bj=myByLo(myThid), myByHi(myThid)
70 DO bi=myBxLo(myThid), myBxHi(myThid)
71 C- 1rst bi,bj loop :
72
73 IF (myIter.EQ.-1) THEN
74 C-- Initialise arrays :
75 DO j=1-Oly,sNy+Oly
76 DO i=1-Olx,sNx+Olx
77 rStarFacC(i,j,bi,bj) = 1.
78 rStarFacW(i,j,bi,bj) = 1.
79 rStarFacS(i,j,bi,bj) = 1.
80 rStarExpC(i,j,bi,bj) = 1.
81 rStarExpW(i,j,bi,bj) = 1.
82 rStarExpS(i,j,bi,bj) = 1.
83 rStarDhCDt(i,j,bi,bj) = 0.
84 rStarDhWDt(i,j,bi,bj) = 0.
85 rStarDhSDt(i,j,bi,bj) = 0.
86 PmEpR(i,j,bi,bj) = 0.
87 ENDDO
88 ENDDO
89 DO k=1,Nr
90 DO j=1-Oly,sNy+Oly
91 DO i=1-Olx,sNx+Olx
92 h0FacC(i,j,k,bi,bj) = _hFacC(i,j,k,bi,bj)
93 h0FacW(i,j,k,bi,bj) = _hFacW(i,j,k,bi,bj)
94 h0FacS(i,j,k,bi,bj) = _hFacS(i,j,k,bi,bj)
95 ENDDO
96 ENDDO
97 ENDDO
98 ELSE
99 C-- copy rStarFacX -> rStarExpX
100 DO j=1-Oly,sNy+Oly
101 DO i=1-Olx,sNx+Olx
102 rStarExpC(i,j,bi,bj) = rStarFacC(i,j,bi,bj)
103 rStarExpW(i,j,bi,bj) = rStarFacW(i,j,bi,bj)
104 rStarExpS(i,j,bi,bj) = rStarFacS(i,j,bi,bj)
105 ENDDO
106 ENDDO
107 ENDIF
108
109 C-- Compute the new column thikness :
110 DO j=0,sNy+1
111 DO i=0,sNx+1
112 IF (maskH(i,j,bi,bj).EQ.1. ) THEN
113 rStarFacC(i,j,bi,bj) =
114 & (etaFld(i,j,bi,bj)+Ro_surf(i,j,bi,bj)-R_low(i,j,bi,bj))
115 & *recip_Rcol(i,j,bi,bj)
116 ELSE
117 rStarFacC(i,j,bi,bj) = 1.
118 ENDIF
119 ENDDO
120 ENDDO
121 DO j=1,sNy
122 DO i=1,sNx+1
123 IF ( ksurfW(i,j,bi,bj).LE.Nr ) THEN
124 tmpfldW = MIN( Ro_surf(i-1,j,bi,bj), Ro_surf(i,j,bi,bj) )
125 & - MAX( R_low(i-1,j,bi,bj), R_low(i,j,bi,bj) )
126 rStarFacW(i,j,bi,bj) =
127 & ( 0.5 _d 0 *( etaFld(i-1,j,bi,bj)*rA(i-1,j,bi,bj)
128 & +etaFld(i,j,bi,bj)*rA(i,j,bi,bj)
129 & )*recip_rAw(i,j,bi,bj)
130 & +tmpfldW )/tmpfldW
131 ELSE
132 rStarFacW(i,j,bi,bj) = 1.
133 ENDIF
134 ENDDO
135 ENDDO
136 DO j=1,sNy+1
137 DO i=1,sNx
138 IF ( ksurfS(i,j,bi,bj).LE.Nr ) THEN
139 tmpfldS = MIN( Ro_surf(i,j-1,bi,bj), Ro_surf(i,j,bi,bj) )
140 & - MAX( R_low(i,j-1,bi,bj), R_low(i,j,bi,bj) )
141 rStarFacS(i,j,bi,bj) =
142 & ( 0.5 _d 0 *( etaFld(i,j-1,bi,bj)*rA(i,j-1,bi,bj)
143 & +etaFld(i,j,bi,bj)*rA(i,j,bi,bj)
144 & )*recip_rAs(i,j,bi,bj)
145 & +tmpfldS )/tmpfldS
146 ELSE
147 rStarFacS(i,j,bi,bj) = 1.
148 ENDIF
149 ENDDO
150 ENDDO
151
152 C- Needs to do something when r* ratio is too small ;
153 C for now, just stop
154 icntc1 = 0
155 icntc2 = 0
156 icntw = 0
157 icnts = 0
158 DO j=1,sNy+1
159 DO i=1,sNx+1
160 IF ( rStarFacC(i,j,bi,bj).LT.hFacInf ) THEN
161 icntc1 = icntc1 + 1
162 iic = i
163 jjc = j
164 ENDIF
165 IF ( rStarFacW(i,j,bi,bj).LT.hFacInf ) THEN
166 icntw = icntw + 1
167 iiw = i
168 jjw = j
169 ENDIF
170 IF ( rStarFacS(i,j,bi,bj).LT.hFacInf ) THEN
171 icnts = icnts + 1
172 iis = i
173 jjs = j
174 ENDIF
175 IF ( rStarFacC(i,j,bi,bj).GT.hFacSup ) THEN
176 icntc2 = icntc2 + 1
177 iic2 = i
178 jjc2 = j
179 ENDIF
180 ENDDO
181 ENDDO
182 IF ( icntc1 .gt. 0 ) then
183 WRITE(errorMessageUnit,'(2A,5I4,I10)')
184 & 'WARNING: r*FacC < hFacInf at:',
185 & ' i,j,bi,bj,Thid,Iter=',iic,jjc,bi,bj,myThid,myIter
186 WRITE(errorMessageUnit,'(A,1F10.6,1P2E14.6)')
187 & 'rStarFac,H,eta =', rStarFacC(iic,jjc,bi,bj),
188 & Ro_surf(iic,jjc,bi,bj)-R_low(iic,jjc,bi,bj),
189 & etaFld(iic,jjc,bi,bj)
190 WRITE(errorMessageUnit,'(A)')
191 & 'STOP in CALC_R_STAR : too SMALL rStarFacC !'
192 STOP 'ABNORMAL END: S/R CALC_R_STAR'
193 ENDIF
194 IF ( icnts .gt. 0 ) then
195 tmpfldS = MIN( Ro_surf(iis,jjs-1,bi,bj),Ro_surf(iis,jjs,bi,bj))
196 & - MAX( R_low(iis,jjs-1,bi,bj), R_low(iis,jjs,bi,bj) )
197 WRITE(errorMessageUnit,'(2A,5I4,I10)')
198 & 'WARNING: r*FacS < hFacInf at:',
199 & ' i,j,bi,bj,Thid,Iter=',iis,jjs,bi,bj,myThid,myIter
200 WRITE(errorMessageUnit,'(A,1F10.6,1P3E14.6)')
201 & 'rStarFac,H,eta =', rStarFacS(iis,jjs,bi,bj), tmpfldS,
202 & etaFld(iis,jjs-1,bi,bj), etaFld(iis,jjs,bi,bj)
203 WRITE(errorMessageUnit,'(A)')
204 & 'STOP in CALC_R_STAR : too SMALL rStarFacS !'
205 STOP 'ABNORMAL END: S/R CALC_R_STAR'
206 ENDIF
207 IF ( icntw .gt. 0 ) then
208 tmpfldW = MIN( Ro_surf(iiw-1,jjw,bi,bj),Ro_surf(iiw,jjw,bi,bj))
209 & - MAX( R_low(iiw-1,jjw,bi,bj), R_low(iiw,jjw,bi,bj) )
210 WRITE(errorMessageUnit,'(2A,5I4,I10)')
211 & 'WARNING: r*FacW < hFacInf at:',
212 & ' i,j,bi,bj,Thid,Iter=',iiw,jjw,bi,bj,myThid,myIter
213 WRITE(errorMessageUnit,'(A,1F10.6,1P3E14.6)')
214 & 'rStarFac,H,eta =', rStarFacW(iiw,jjw,bi,bj), tmpfldW,
215 & etaFld(iiw-1,jjw,bi,bj), etaFld(iiw,jjw,bi,bj)
216 WRITE(errorMessageUnit,'(A)')
217 & 'STOP in CALC_R_STAR : too SMALL rStarFacW !'
218 STOP 'ABNORMAL END: S/R CALC_R_STAR'
219 ENDIF
220 IF ( (icntc1+icnts+icntw).LE.numbWrMax
221 & .AND. icntc2 .gt. 0 ) then
222 WRITE(errorMessageUnit,'(2A,5I4,I10)')
223 & 'WARNING: hFacC > hFacSup at',icntc2,'points - e.g. :'
224 WRITE(errorMessageUnit,'(A,1F10.6,1P2E14.6)')
225 & 'i,j,bi,bj,Thid,Iter,rStarFac,H,eta =',
226 & iic2,jjc2,bi,bj,myThid,myIter,rStarFacC(iic2,jjc2,bi,bj),
227 & Ro_surf(iic2,jjc2,bi,bj)-R_low(iic2,jjc2,bi,bj),
228 & etaFld(iic2,jjc2,bi,bj)
229 ENDIF
230
231 C- end 1rst bi,bj loop.
232 ENDDO
233 ENDDO
234
235 _EXCH_XY_RL( rStarFacC, myThid )
236 CALL EXCH_UV_XY_RL(rStarFacW,rStarFacS,.FALSE.,myThid)
237
238 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
239
240 DO bj=myByLo(myThid), myByHi(myThid)
241 DO bi=myBxLo(myThid), myBxHi(myThid)
242 C- 2nd bi,bj loop :
243
244 #ifdef ALLOW_EXCH2
245 #ifdef W2_FILL_NULL_REGIONS
246 C- Note: rStarFacC was non-zero EVERYWHERE before exch, but exch2 put zeros
247 C in the corner regions of the tile (e.g.:[1-Olx:0,1-Oly:0])
248 C => need to add those lines (or to fix exch2):
249 DO j=1,Oly
250 DO i=1,Olx
251 ii = sNx+i
252 jj = sNy+j
253
254 IF (ksurfC(1-i,1-j,bi,bj).GT.Nr) rStarFacC(1-i,1-j,bi,bj)= 1.
255 IF (ksurfC(ii, 1-j,bi,bj).GT.Nr) rStarFacC(ii, 1-j,bi,bj)= 1.
256 IF (ksurfC(1-i,jj, bi,bj).GT.Nr) rStarFacC(1-i,jj, bi,bj)= 1.
257 IF (ksurfC(ii, jj, bi,bj).GT.Nr) rStarFacC(ii, jj, bi,bj)= 1.
258
259 IF (ksurfW(1-i,1-j,bi,bj).GT.Nr) rStarFacW(1-i,1-j,bi,bj)= 1.
260 IF (ksurfW(ii, 1-j,bi,bj).GT.Nr) rStarFacW(ii, 1-j,bi,bj)= 1.
261 IF (ksurfW(1-i,jj, bi,bj).GT.Nr) rStarFacW(1-i,jj, bi,bj)= 1.
262 IF (ksurfW(ii, jj, bi,bj).GT.Nr) rStarFacW(ii, jj, bi,bj)= 1.
263
264 IF (ksurfS(1-i,1-j,bi,bj).GT.Nr) rStarFacS(1-i,1-j,bi,bj)= 1.
265 IF (ksurfS(ii, 1-j,bi,bj).GT.Nr) rStarFacS(ii, 1-j,bi,bj)= 1.
266 IF (ksurfS(1-i,jj, bi,bj).GT.Nr) rStarFacS(1-i,jj, bi,bj)= 1.
267 IF (ksurfS(ii, jj, bi,bj).GT.Nr) rStarFacS(ii, jj, bi,bj)= 1.
268
269 ENDDO
270 ENDDO
271 #endif /* W2_FILL_NULL_REGIONS */
272 #endif /* ALLOW_EXCH2 */
273
274 DO j=1-Oly,sNy+Oly
275 DO i=1-Olx,sNx+Olx
276 rStarDhCDt(i,j,bi,bj)=(rStarFacC(i,j,bi,bj)
277 & -rStarExpC(i,j,bi,bj))/deltaTfreesurf
278 rStarDhWDt(i,j,bi,bj)=(rStarFacW(i,j,bi,bj)
279 & -rStarExpW(i,j,bi,bj))/deltaTfreesurf
280 rStarDhSDt(i,j,bi,bj)=(rStarFacS(i,j,bi,bj)
281 & -rStarExpS(i,j,bi,bj))/deltaTfreesurf
282 rStarExpC(i,j,bi,bj) = rStarFacC(i,j,bi,bj)
283 & / rStarExpC(i,j,bi,bj)
284 rStarExpW(i,j,bi,bj) = rStarFacW(i,j,bi,bj)
285 & / rStarExpW(i,j,bi,bj)
286 rStarExpS(i,j,bi,bj) = rStarFacS(i,j,bi,bj)
287 & / rStarExpS(i,j,bi,bj)
288 ENDDO
289 ENDDO
290
291 C- end 2nd bi,bj loop.
292 ENDDO
293 ENDDO
294
295 #ifdef ALLOW_DEBUG
296 IF (debugMode) CALL DEBUG_LEAVE('CALC_R_STAR',myThid)
297 #endif
298
299 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
300 #endif /* NONLIN_FRSURF */
301
302 RETURN
303 END

  ViewVC Help
Powered by ViewVC 1.1.22