/[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.4 - (show annotations) (download)
Sun Jun 19 21:43:49 2005 UTC (18 years, 11 months ago) by jmc
Branch: MAIN
Changes since 1.3: +39 -1 lines
fix for EXCH2 (that resets to zero the halo-corner regions)

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

  ViewVC Help
Powered by ViewVC 1.1.22