/[MITgcm]/MITgcm_contrib/submesoscale/code/obcs_check.F
ViewVC logotype

Contents of /MITgcm_contrib/submesoscale/code/obcs_check.F

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


Revision 1.3 - (show annotations) (download)
Fri Mar 19 19:28:27 2010 UTC (15 years, 3 months ago) by jmc
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +1 -1 lines
FILE REMOVED
take S/R OBCS_CHECK_GRID  out of obcs_check.F and put it in a separated file
(can now use use standard obcs_check.F file)

1 C $Header: /u/gcmpack/MITgcm_contrib/submesoscale/code/obcs_check.F,v 1.2 2008/05/31 00:47:06 dimitri Exp $
2 C $Name: $
3
4 #include "OBCS_OPTIONS.h"
5
6 SUBROUTINE OBCS_CHECK( myThid )
7 C /==========================================================\
8 C | SUBROUTINE OBCS_CHECK |
9 C | o Check dependences with other packages |
10 C |==========================================================|
11 C \==========================================================/
12 IMPLICIT NONE
13
14 C === Global variables ===
15 #include "SIZE.h"
16 #include "EEPARAMS.h"
17 #include "PARAMS.h"
18 #include "OBCS.h"
19
20 C === Routine arguments ===
21 C myThid - Number of this instances
22 INTEGER myThid
23
24 #ifdef ALLOW_OBCS
25
26 C === Local variables ===
27 C msgBuf - Informational/error meesage buffer
28 CHARACTER*(MAX_LEN_MBUF) msgBuf
29 INTEGER i,j,bi,bj
30
31 WRITE(msgBuf,'(A)') 'OBCS_CHECK: #define ALLOW_OBCS'
32 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,
33 & SQUEEZE_RIGHT,myThid)
34
35 #ifdef ALLOW_CD_CODE
36 IF ( useCDscheme ) THEN
37 WRITE(msgBuf,'(A)')
38 & 'OBCS_CHECK: ERROR: useCDscheme = .TRUE.'
39 CALL PRINT_ERROR( msgBuf , 1)
40 WRITE(msgBuf,'(A)')
41 & 'OBCS_CHECK: ERROR: The CD-scheme does not work with OBCS.'
42 CALL PRINT_ERROR( msgBuf , 1)
43 WRITE(msgBuf,'(A)')
44 & 'OBCS_CHECK: ERROR: Sorry, not yet implemented.'
45 CALL PRINT_ERROR( msgBuf , 1)
46 STOP 'ABNORMAL END: S/R OBCS_CHECK'
47 ENDIF
48 #endif /* ALLOW_CD_CODE */
49
50 #ifdef ALLOW_ORLANSKI
51 WRITE(msgBuf,'(A)') 'OBCS_CHECK: #define ALLOW_ORLANSKI'
52 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,
53 & SQUEEZE_RIGHT,myThid)
54 #else
55 IF (useOrlanskiNorth.OR.useOrlanskiSouth.OR.
56 & useOrlanskiEast.OR.useOrlanskiWest) THEN
57 WRITE(msgBuf,'(A)')
58 & 'OBCS_CHECK: ERROR: #undef OBCS_RADIATE_ORLANSKI and'
59 CALL PRINT_ERROR( msgBuf , 1)
60 WRITE(msgBuf,'(A)')
61 & 'OBCS_CHECK: ERROR: one of useOrlanski* logicals is true'
62 CALL PRINT_ERROR( msgBuf , 1)
63 STOP 'ABNORMAL END: S/R OBCS_CHECK'
64 ENDIF
65 #endif /* ALLOW_ORLANSKI */
66
67 IF (useOrlanskiNorth.OR.useOrlanskiSouth.OR.
68 & useOrlanskiEast.OR.useOrlanskiWest) THEN
69 IF (nonlinFreeSurf.GT.0) THEN
70 WRITE(msgBuf,'(A)')
71 & 'OBCS_CHECK: ERROR: useOrlanski* Rad OBC with'
72 CALL PRINT_ERROR( msgBuf , 1)
73 WRITE(msgBuf,'(A)')
74 & 'OBCS_CHECK: ERROR: nonlinFreeSurf not yet implemented'
75 CALL PRINT_ERROR( msgBuf , 1)
76 STOP 'ABNORMAL END: S/R OBCS_CHECK'
77 ENDIF
78 IF (usePTracers) THEN
79 WRITE(msgBuf,'(A)')
80 & 'OBCS_CHECK: ERROR: useOrlanski* Rad OBC with'
81 CALL PRINT_ERROR( msgBuf , 1)
82 WRITE(msgBuf,'(A)')
83 & 'OBCS_CHECK: ERROR: pTracers not yet implemented'
84 CALL PRINT_ERROR( msgBuf , 1)
85 STOP 'ABNORMAL END: S/R OBCS_CHECK'
86 ENDIF
87 IF (useSEAICE) THEN
88 WRITE(msgBuf,'(A)')
89 & 'OBCS_CHECK: ERROR: useOrlanski* Rad OBC with'
90 CALL PRINT_ERROR( msgBuf , 1)
91 WRITE(msgBuf,'(A)')
92 & 'OBCS_CHECK: ERROR: SEAICE not yet implemented'
93 CALL PRINT_ERROR( msgBuf , 1)
94 STOP 'ABNORMAL END: S/R OBCS_CHECK'
95 ENDIF
96 ENDIF
97
98 #ifndef ALLOW_OBCS_PRESCRIBE
99 IF (useOBCSprescribe) THEN
100 WRITE(msgBuf,'(A)')
101 & 'OBCS_CHECK: ERROR: useOBCSprescribe = .TRUE. for'
102 CALL PRINT_ERROR( msgBuf , 1)
103 WRITE(msgBuf,'(A)')
104 & 'OBCS_CHECK: undef ALLOW_OBCS_PRESCRIBE'
105 CALL PRINT_ERROR( msgBuf , 1)
106 STOP 'ABNORMAL END: S/R OBCS_CHECK'
107 ENDIF
108 #endif
109
110 IF (useSEAICE .AND. .NOT. useEXF) THEN
111 WRITE(msgBuf,'(A)')
112 & 'OBCS_CHECK: ERROR: for SEAICE OBCS, use'
113 CALL PRINT_ERROR( msgBuf , 1)
114 WRITE(msgBuf,'(A)')
115 & 'OBCS_CHECK: pkg/exf to read input files'
116 CALL PRINT_ERROR( msgBuf , 1)
117 STOP 'ABNORMAL END: S/R OBCS_CHECK'
118 ENDIF
119
120 IF ( debugLevel.GE.debLevB ) THEN
121 _BEGIN_MASTER( myThid )
122 DO bj = 1,nSy
123 DO bi = 1,nSx
124 write(*,*) 'bi,bj:',bi,bj,' OB_Jn=',(OB_Jn(i,bi,bj),i=1,sNx)
125 write(*,*) 'bi,bj:',bi,bj,' OB_Js=',(OB_Js(i,bi,bj),i=1,sNx)
126 write(*,*) 'bi,bj:',bi,bj,' OB_Ie=',(OB_Ie(j,bi,bj),j=1,sNy)
127 write(*,*) 'bi,bj:',bi,bj,' OB_Iw=',(OB_Iw(j,bi,bj),j=1,sNy)
128 ENDDO
129 ENDDO
130 _END_MASTER(myThid)
131 ENDIF
132
133 WRITE(msgBuf,'(A)') 'OBCS_CHECK: OK'
134 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,
135 & SQUEEZE_RIGHT,myThid)
136
137 #endif /* ALLOW_OBCS */
138 RETURN
139 END
140
141 SUBROUTINE OBCS_CHECK_TOPOGRAPHY( myThid )
142 C /==========================================================\
143 C | SUBROUTINE OBCS_CHECK_TOPOGRAPHY |
144 C | o Check for non-zero normal gradient across open |
145 C | boundaries |
146 C | o fix them if required and print a message |
147 C |==========================================================|
148 C \==========================================================/
149 IMPLICIT NONE
150
151 C === Global variables ===
152 #include "SIZE.h"
153 #include "EEPARAMS.h"
154 #include "PARAMS.h"
155 #include "GRID.h"
156 #include "OBCS.h"
157
158 C === Routine arguments ===
159 C myThid - Number of this instances
160 INTEGER myThid
161
162 #ifdef ALLOW_OBCS
163 C === Local variables ===
164 C msgBuf - Informational/error meesage buffer
165 CHARACTER*(MAX_LEN_MBUF) msgBuf
166 INTEGER bi, bj, I, J, K, ichanged
167
168 IF ( OBCSfixTopo ) THEN
169 C-- Modify topography to ensure that outward d(topography)/dn >= 0,
170 C topography at open boundary points must be equal or shallower than
171 C topography one grid-point inward from open boundary
172 ichanged = 0
173 DO bj = myByLo(myThid), myByHi(myThid)
174 DO bi = myBxLo(myThid), myBxHi(myThid)
175
176 DO K=1,Nr
177 #ifdef ALLOW_OBCS_NORTH
178 DO I=1,sNx
179 J=OB_Jn(I,bi,bj)
180 IF ( J .NE. 0 .AND.
181 & ( R_low(I,J,bi,bj) .LT. R_low(I,J-1,bi,bj) ) ) THEN
182 ichanged = ichanged + 1
183 R_low(I,J,bi,bj) = R_low(I,J-1,bi,bj)
184 WRITE(msgBuf,'(2A,(1X,4I6))')
185 & 'S/R OBCS_CHECK_TOPOGRAPHY: fixed topography at ',
186 & '(i,j,bi,bj) = ', I, J, bi, bj
187 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
188 & SQUEEZE_RIGHT, myThid)
189 ENDIF
190 ENDDO
191 #endif
192 #ifdef ALLOW_OBCS_SOUTH
193 DO I=1,sNx
194 J=OB_Js(I,bi,bj)
195 IF ( J .NE. 0 .AND.
196 & ( R_low(I,J,bi,bj) .LT. R_low(I,J+1,bi,bj) ) ) THEN
197 ichanged = ichanged + 1
198 R_low(I,J,bi,bj) = R_low(I,J+1,bi,bj)
199 WRITE(msgBuf,'(2A,(1X,4I6))')
200 & 'S/R OBCS_CHECK_TOPOGRAPHY: fixed topography at ',
201 & '(i,j,bi,bj) = ', I, J, bi, bj
202 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
203 & SQUEEZE_RIGHT, myThid)
204 ENDIF
205 ENDDO
206 #endif
207 #ifdef ALLOW_OBCS_EAST
208 DO J=1,sNy
209 I = OB_Ie(J,bi,bj)
210 IF ( I .NE. 0 .AND.
211 & ( R_low(I,J,bi,bj) .LT. R_low(I-1,J,bi,bj) ) ) THEN
212 ichanged = ichanged + 1
213 R_low(I,J,bi,bj) = R_low(I-1,J,bi,bj)
214 WRITE(msgBuf,'(2A,(1X,4I6))')
215 & 'S/R OBCS_CHECK_TOPOGRAPHY: fixed topography at ',
216 & '(i,j,bi,bj) = ', I, J, bi, bj
217 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
218 & SQUEEZE_RIGHT, myThid)
219 ENDIF
220 ENDDO
221 #endif
222 C Western boundary
223 #ifdef ALLOW_OBCS_WEST
224 DO J=1,sNy
225 I = OB_Iw(J,bi,bj)
226 IF ( I .NE. 0 .AND.
227 & ( R_low(I,J,bi,bj) .LT. R_low(I+1,J,bi,bj) ) ) THEN
228 ichanged = ichanged + 1
229 R_low(I,J,bi,bj) = R_low(I+1,J,bi,bj)
230 WRITE(msgBuf,'(2A,(1X,4I6))')
231 & 'S/R OBCS_CHECK_TOPOGRAPHY: fixed topography at ',
232 & '(i,j,bi,bj) = ', I, J, bi, bj
233 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
234 & SQUEEZE_RIGHT, myThid)
235 ENDIF
236 ENDDO
237 #endif
238 ENDDO
239
240 ENDDO
241 ENDDO
242 C-- some diagnostics to stdout
243 IF ( ichanged .GT. 0 ) THEN
244 WRITE(msgBuf,'(A,I7,A,A)')
245 & 'OBCS message: corrected ', ichanged,
246 & ' instances of problematic topography gradients',
247 & ' normal to open boundaries'
248 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
249 & SQUEEZE_RIGHT, myThid)
250 ENDIF
251 C endif (OBCSfixTopo)
252 ENDIF
253 #endif /* ALLOW_OBCS */
254
255 RETURN
256 END
257
258 SUBROUTINE OBCS_CHECK_GRID( myThid )
259 C /==========================================================\
260 C | SUBROUTINE OBCS_CHECK_GRID |
261 C | o Fix overlap regions to avoid discontinuities |
262 C | in dxc, dyc, etc. |
263 C |==========================================================|
264 C \==========================================================/
265 IMPLICIT NONE
266
267 C === Global variables ===
268 #include "SIZE.h"
269 #include "EEPARAMS.h"
270 #include "PARAMS.h"
271 #include "GRID.h"
272 #include "OBCS.h"
273
274 C === Routine arguments ===
275 C myThid - Number of this instances
276 INTEGER myThid
277
278 #ifdef ALLOW_OBCS
279 C === Local variables ===
280 C msgBuf - Informational/error meesage buffer
281 INTEGER bi, bj, I, J, I_obc, J_obc
282
283 C-- Modify dxC and dyC in the OBCS overlap regions to avoid
284 C discontinuities in horizontal gradients
285 DO bj = myByLo(myThid), myByHi(myThid)
286 DO bi = myBxLo(myThid), myBxHi(myThid)
287
288 #ifdef ALLOW_OBCS_NORTH
289 DO I=1-Olx,sNx+Olx
290 J_obc = OB_Jn(I,bi,bj)
291 IF (J_obc.NE.0) THEN
292 DO J = J_obc+1, J_obc+Oly
293 dxC(I,J,bi,bj) = dxC(I,J_obc,bi,bj)
294 dyC(I,J,bi,bj) = dyC(I,J_obc,bi,bj)
295 ENDDO
296 ENDIF
297 ENDDO
298 #endif
299
300 #ifdef ALLOW_OBCS_SOUTH
301 DO I=1-Olx,sNx+Olx
302 J_obc = OB_Js(I,bi,bj)
303 IF (J_obc.NE.0) THEN
304 DO J = J_obc-Oly, J_obc-1
305 dxC(I,J,bi,bj) = dxC(I,J_obc,bi,bj)
306 dyC(I,J,bi,bj) = dyC(I,J_obc,bi,bj)
307 ENDDO
308 ENDIF
309 ENDDO
310 #endif
311
312 #ifdef ALLOW_OBCS_EAST
313 DO J=1-Oly,sNy+Oly
314 I_obc = OB_Ie(J,bi,bj)
315 IF (I_obc.NE.0) THEN
316 DO I = I_obc+1, I_obc+Olx
317 dxC(I,J,bi,bj) = dxC(I_obc,J,bi,bj)
318 dyC(I,J,bi,bj) = dyC(I_obc,J,bi,bj)
319 ENDDO
320 ENDIF
321 ENDDO
322 #endif
323
324 #ifdef ALLOW_OBCS_WEST
325 DO J=1-Oly,sNy+Oly
326 I_obc=OB_Iw(J,bi,bj)
327 IF (I_obc.NE.0) THEN
328 DO I = I_obc-Olx, I_obc-1
329 dxC(I,J,bi,bj) = dxC(I_obc,J,bi,bj)
330 dyC(I,J,bi,bj) = dyC(I_obc,J,bi,bj)
331 ENDDO
332 ENDIF
333 ENDDO
334 #endif
335
336 ENDDO
337 ENDDO
338
339 #endif /* ALLOW_OBCS */
340
341 RETURN
342 END

  ViewVC Help
Powered by ViewVC 1.1.22