/[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.7 - (show annotations) (download)
Fri Sep 30 00:59:33 2005 UTC (18 years, 8 months ago) by jmc
Branch: MAIN
Changes since 1.6: +24 -25 lines
- test for empty column with ksurf>Nr (safer and might even be faster).
- reset after exch2 only if W2_FILL_NULL_REGIONS is defined (in W2_OPTIONS.h)

1 C $Header: /u/gcmpack/MITgcm/model/src/calc_r_star.F,v 1.6 2005/06/22 00:18:00 jmc 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 ii,jj
52 INTEGER numbWrite, numbWrMax
53 _RL tmpfldW, tmpfldS
54 c CHARACTER*(MAX_LEN_MBUF) suff
55 CEOP
56 DATA numbWrite / 0 /
57 numbWrMax = Nx*Ny
58
59 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
60
61 #ifdef ALLOW_DEBUG
62 IF (debugMode) CALL DEBUG_ENTER('CALC_R_STAR',myThid)
63 #endif
64
65 DO bj=myByLo(myThid), myByHi(myThid)
66 DO bi=myBxLo(myThid), myBxHi(myThid)
67 C- 1rst bi,bj loop :
68
69 IF (myIter.EQ.-1) THEN
70 C-- Initialise arrays :
71 DO j=1-Oly,sNy+Oly
72 DO i=1-Olx,sNx+Olx
73 rStarFacC(i,j,bi,bj) = 1.
74 rStarFacW(i,j,bi,bj) = 1.
75 rStarFacS(i,j,bi,bj) = 1.
76 rStarExpC(i,j,bi,bj) = 1.
77 rStarExpW(i,j,bi,bj) = 1.
78 rStarExpS(i,j,bi,bj) = 1.
79 rStarDhCDt(i,j,bi,bj) = 0.
80 rStarDhWDt(i,j,bi,bj) = 0.
81 rStarDhSDt(i,j,bi,bj) = 0.
82 PmEpR(i,j,bi,bj) = 0.
83 ENDDO
84 ENDDO
85 DO k=1,Nr
86 DO j=1-Oly,sNy+Oly
87 DO i=1-Olx,sNx+Olx
88 h0FacC(i,j,k,bi,bj) = hFacC(i,j,k,bi,bj)
89 h0FacW(i,j,k,bi,bj) = hFacW(i,j,k,bi,bj)
90 h0FacS(i,j,k,bi,bj) = hFacS(i,j,k,bi,bj)
91 ENDDO
92 ENDDO
93 ENDDO
94 ELSE
95 C-- copy rStarFacX -> rStarExpX
96 DO j=1-Oly,sNy+Oly
97 DO i=1-Olx,sNx+Olx
98 rStarExpC(i,j,bi,bj) = rStarFacC(i,j,bi,bj)
99 rStarExpW(i,j,bi,bj) = rStarFacW(i,j,bi,bj)
100 rStarExpS(i,j,bi,bj) = rStarFacS(i,j,bi,bj)
101 ENDDO
102 ENDDO
103 ENDIF
104
105 C-- Compute the new column thikness :
106 DO j=0,sNy+1
107 DO i=0,sNx+1
108 IF (maskH(i,j,bi,bj).EQ.1. ) THEN
109 rStarFacC(i,j,bi,bj) =
110 & (etaFld(i,j,bi,bj)+Ro_surf(i,j,bi,bj)-R_low(i,j,bi,bj))
111 & *recip_Rcol(i,j,bi,bj)
112 ELSE
113 rStarFacC(i,j,bi,bj) = 1.
114 ENDIF
115 ENDDO
116 ENDDO
117 DO j=1,sNy
118 DO i=1,sNx+1
119 IF ( ksurfW(i,j,bi,bj).LE.Nr ) THEN
120 tmpfldW = MIN( Ro_surf(i-1,j,bi,bj), Ro_surf(i,j,bi,bj) )
121 & - MAX( R_low(i-1,j,bi,bj), R_low(i,j,bi,bj) )
122 rStarFacW(i,j,bi,bj) =
123 & ( 0.5 _d 0 *( etaFld(i-1,j,bi,bj)*rA(i-1,j,bi,bj)
124 & +etaFld(i,j,bi,bj)*rA(i,j,bi,bj)
125 & )*recip_rAw(i,j,bi,bj)
126 & +tmpfldW )/tmpfldW
127 ELSE
128 rStarFacW(i,j,bi,bj) = 1.
129 ENDIF
130 ENDDO
131 ENDDO
132 DO j=1,sNy+1
133 DO i=1,sNx
134 IF ( ksurfS(i,j,bi,bj).LE.Nr ) THEN
135 tmpfldS = MIN( Ro_surf(i,j-1,bi,bj), Ro_surf(i,j,bi,bj) )
136 & - MAX( R_low(i,j-1,bi,bj), R_low(i,j,bi,bj) )
137 rStarFacS(i,j,bi,bj) =
138 & ( 0.5 _d 0 *( etaFld(i,j-1,bi,bj)*rA(i,j-1,bi,bj)
139 & +etaFld(i,j,bi,bj)*rA(i,j,bi,bj)
140 & )*recip_rAs(i,j,bi,bj)
141 & +tmpfldS )/tmpfldS
142 ELSE
143 rStarFacS(i,j,bi,bj) = 1.
144 ENDIF
145 ENDDO
146 ENDDO
147
148 C- Needs to do something when r* ratio is too small ;
149 C for now, just stop
150 DO j=1,sNy+1
151 DO i=1,sNx+1
152 IF ( rStarFacC(i,j,bi,bj).LT.hFacInf ) THEN
153 numbWrite = numbWrite + 1
154 WRITE(errorMessageUnit,'(2A,5I4,I10)')
155 & 'WARNING: r*FacC < hFacInf at:',
156 & ' i,j,bi,bj,Thid,Iter=',i,j,bi,bj,myThid,myIter
157 WRITE(errorMessageUnit,'(A,1F10.6,1P2E14.6)')
158 & 'rStarFac,H,eta =', rStarFacC(i,j,bi,bj),
159 & Ro_surf(i,j,bi,bj)-R_low(i,j,bi,bj), etaFld(i,j,bi,bj)
160 WRITE(errorMessageUnit,'(A)')
161 & 'STOP in CALC_R_STAR : too SMALL rStarFacC !'
162 STOP 'ABNORMAL END: S/R CALC_SURF_DR'
163 ENDIF
164 IF ( rStarFacW(i,j,bi,bj).LT.hFacInf ) THEN
165 numbWrite = numbWrite + 1
166 tmpfldW = MIN( Ro_surf(i-1,j,bi,bj), Ro_surf(i,j,bi,bj) )
167 & - MAX( R_low(i-1,j,bi,bj), R_low(i,j,bi,bj) )
168 WRITE(errorMessageUnit,'(2A,5I4,I10)')
169 & 'WARNING: r*FacW < hFacInf at:',
170 & ' i,j,bi,bj,Thid,Iter=',i,j,bi,bj,myThid,myIter
171 WRITE(errorMessageUnit,'(A,1F10.6,1P3E14.6)')
172 & 'rStarFac,H,eta =', rStarFacW(i,j,bi,bj), tmpfldW,
173 & etaFld(i-1,j,bi,bj), etaFld(i,j,bi,bj)
174 WRITE(errorMessageUnit,'(A)')
175 & 'STOP in CALC_R_STAR : too SMALL rStarFacW !'
176 STOP 'ABNORMAL END: S/R CALC_SURF_DR'
177 ENDIF
178 IF ( rStarFacS(i,j,bi,bj).LT.hFacInf ) THEN
179 numbWrite = numbWrite + 1
180 tmpfldS = MIN( Ro_surf(i,j-1,bi,bj), Ro_surf(i,j,bi,bj) )
181 & - MAX( R_low(i,j-1,bi,bj), R_low(i,j,bi,bj) )
182 WRITE(errorMessageUnit,'(2A,5I4,I10)')
183 & 'WARNING: r*FacS < hFacInf at:',
184 & ' i,j,bi,bj,Thid,Iter=',i,j,bi,bj,myThid,myIter
185 WRITE(errorMessageUnit,'(A,1F10.6,1P3E14.6)')
186 & 'rStarFac,H,eta =', rStarFacS(i,j,bi,bj), tmpfldS,
187 & etaFld(i,j-1,bi,bj), etaFld(i,j,bi,bj)
188 WRITE(errorMessageUnit,'(A)')
189 & 'STOP in CALC_R_STAR : too SMALL rStarFacS !'
190 STOP 'ABNORMAL END: S/R CALC_R_STAR'
191 ENDIF
192 C-- Usefull warning when r*Fac becomes very large:
193 IF ( numbWrite.LE.numbWrMax .AND.
194 & rStarFacC(i,j,bi,bj).GT.hFacSup ) THEN
195 numbWrite = numbWrite + 1
196 WRITE(errorMessageUnit,'(2A,5I4,I10)')
197 & 'WARNING: hFacC > hFacSup at:',
198 & ' i,j,bi,bj,Thid,Iter=',i,j,bi,bj,myThid,myIter
199 WRITE(errorMessageUnit,'(A,1F10.6,1P2E14.6)')
200 & 'rStarFac,H,eta =', rStarFacC(i,j,bi,bj),
201 & Ro_surf(i,j,bi,bj)-R_low(i,j,bi,bj), etaFld(i,j,bi,bj)
202 ENDIF
203 ENDDO
204 ENDDO
205
206 C- end 1rst bi,bj loop.
207 ENDDO
208 ENDDO
209
210 _EXCH_XY_RL( rStarFacC, myThid )
211 CALL EXCH_UV_XY_RL(rStarFacW,rStarFacS,.FALSE.,myThid)
212
213 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
214
215 DO bj=myByLo(myThid), myByHi(myThid)
216 DO bi=myBxLo(myThid), myBxHi(myThid)
217 C- 2nd bi,bj loop :
218
219 #ifdef ALLOW_EXCH2
220 #ifdef W2_FILL_NULL_REGIONS
221 C- Note: rStarFacC was non-zero EVERYWHERE before exch, but exch2 put zeros
222 C in the corner regions of the tile (e.g.:[1-Olx:0,1-Oly:0])
223 C => need to add those lines (or to fix exch2):
224 DO j=1,Oly
225 DO i=1,Olx
226 ii = sNx+i
227 jj = sNy+j
228
229 IF (ksurfC(1-i,1-j,bi,bj).GT.Nr) rStarFacC(1-i,1-j,bi,bj)= 1.
230 IF (ksurfC(ii, 1-j,bi,bj).GT.Nr) rStarFacC(ii, 1-j,bi,bj)= 1.
231 IF (ksurfC(1-i,jj, bi,bj).GT.Nr) rStarFacC(1-i,jj, bi,bj)= 1.
232 IF (ksurfC(ii, jj, bi,bj).GT.Nr) rStarFacC(ii, jj, bi,bj)= 1.
233
234 IF (ksurfW(1-i,1-j,bi,bj).GT.Nr) rStarFacW(1-i,1-j,bi,bj)= 1.
235 IF (ksurfW(ii, 1-j,bi,bj).GT.Nr) rStarFacW(ii, 1-j,bi,bj)= 1.
236 IF (ksurfW(1-i,jj, bi,bj).GT.Nr) rStarFacW(1-i,jj, bi,bj)= 1.
237 IF (ksurfW(ii, jj, bi,bj).GT.Nr) rStarFacW(ii, jj, bi,bj)= 1.
238
239 IF (ksurfS(1-i,1-j,bi,bj).GT.Nr) rStarFacS(1-i,1-j,bi,bj)= 1.
240 IF (ksurfS(ii, 1-j,bi,bj).GT.Nr) rStarFacS(ii, 1-j,bi,bj)= 1.
241 IF (ksurfS(1-i,jj, bi,bj).GT.Nr) rStarFacS(1-i,jj, bi,bj)= 1.
242 IF (ksurfS(ii, jj, bi,bj).GT.Nr) rStarFacS(ii, jj, bi,bj)= 1.
243
244 ENDDO
245 ENDDO
246 #endif /* W2_FILL_NULL_REGIONS */
247 #endif /* ALLOW_EXCH2 */
248
249 DO j=1-Oly,sNy+Oly
250 DO i=1-Olx,sNx+Olx
251 rStarDhCDt(i,j,bi,bj)=(rStarFacC(i,j,bi,bj)
252 & -rStarExpC(i,j,bi,bj))/deltaTfreesurf
253 rStarDhWDt(i,j,bi,bj)=(rStarFacW(i,j,bi,bj)
254 & -rStarExpW(i,j,bi,bj))/deltaTfreesurf
255 rStarDhSDt(i,j,bi,bj)=(rStarFacS(i,j,bi,bj)
256 & -rStarExpS(i,j,bi,bj))/deltaTfreesurf
257 rStarExpC(i,j,bi,bj) = rStarFacC(i,j,bi,bj)
258 & / rStarExpC(i,j,bi,bj)
259 rStarExpW(i,j,bi,bj) = rStarFacW(i,j,bi,bj)
260 & / rStarExpW(i,j,bi,bj)
261 rStarExpS(i,j,bi,bj) = rStarFacS(i,j,bi,bj)
262 & / rStarExpS(i,j,bi,bj)
263 ENDDO
264 ENDDO
265
266 C- end 2nd bi,bj loop.
267 ENDDO
268 ENDDO
269
270 #ifdef ALLOW_DEBUG
271 IF (debugMode) CALL DEBUG_LEAVE('CALC_R_STAR',myThid)
272 #endif
273
274 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
275 #endif /* NONLIN_FRSURF */
276
277 RETURN
278 END

  ViewVC Help
Powered by ViewVC 1.1.22