/[MITgcm]/MITgcm/pkg/obcs/obcs_apply_uv.F
ViewVC logotype

Contents of /MITgcm/pkg/obcs/obcs_apply_uv.F

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


Revision 1.5 - (show annotations) (download)
Tue Mar 1 18:55:46 2011 UTC (13 years, 3 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62v, checkpoint62u, checkpoint62t, checkpoint62w
Changes since 1.4: +73 -14 lines
apply OBC in 2 steps: first tangential component ; then normal component.
 This ensures that the normal component is set correctly even when it
 conficts with tangential setting from an other OB.

1 C $Header: /u/gcmpack/MITgcm/pkg/obcs/obcs_apply_uv.F,v 1.4 2010/10/25 22:55:16 jmc Exp $
2 C $Name: $
3
4 #include "OBCS_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: OBCS_APPLY_UV
8 C !INTERFACE:
9 SUBROUTINE OBCS_APPLY_UV( bi, bj, kArg,
10 U uFld, vFld,
11 I myThid )
12
13 C !DESCRIPTION:
14 C *==========================================================*
15 C | S/R OBCS_APPLY_UV
16 C *==========================================================*
17
18 C !USES:
19 IMPLICIT NONE
20 C == Global variables ==
21 #include "SIZE.h"
22 #include "EEPARAMS.h"
23 #include "PARAMS.h"
24 #include "GRID.h"
25 #include "OBCS.h"
26
27 C !INPUT/OUTPUT PARAMETERS:
28 C == Routine Arguments ==
29 C bi, bj :: indices of current tile
30 C kArg :: index of current level which OBC applies to
31 C or, if zero, apply to all levels
32 C uFld :: horizontal velocity field, 1rst component (zonal)
33 C vFld :: horizontal velocity field, 2nd component (meridional)
34 C myThid :: my Thread Id number
35 c INTEGER biArg, bjArg
36 INTEGER bi, bj
37 INTEGER kArg
38 _RL uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
39 _RL vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
40 INTEGER myThid
41 CEOP
42
43 #ifdef ALLOW_OBCS
44
45 C !LOCAL VARIABLES:
46 C == Local variables ==
47 c INTEGER bi, bj, itLo, itHi, jtLo, jtHi
48 INTEGER k, kLo, kHi
49 INTEGER i, j
50 INTEGER Iobc, Jobc
51
52 C-- Set model variables to OB values on North/South Boundaries:
53 C 2 steps: 1) set tangential component ; 2) set normal component.
54 C This ensures that the normal component is set correctly even
55 C when it conficts with tangential setting from an other OB.
56
57 c IF ( biArg.EQ.0 .OR. bjArg.EQ.0 ) THEN
58 c itLo = myBxLo(myThid)
59 c itHi = myBxHi(myThid)
60 c jtLo = myByLo(myThid)
61 c jtHi = myByHi(myThid)
62 c ELSE
63 c itLo = biArg
64 c itHi = biArg
65 c jtLo = bjArg
66 c jtHi = bjArg
67 c ENDIF
68 IF ( kArg.EQ.0 ) THEN
69 kLo = 1
70 kHi = Nr
71 ELSE
72 kLo = kArg
73 kHi = kArg
74 ENDIF
75
76 c DO bj = jtLo,jtHi
77 c DO bi = itLo,itHi
78
79 C-- Set Tangential component first:
80
81 #ifdef ALLOW_OBCS_NORTH
82 IF ( tileHasOBN(bi,bj) ) THEN
83 C Northern boundary
84 DO i=1-Olx,sNx+Olx
85 Jobc = OB_Jn(i,bi,bj)
86 IF ( Jobc.NE.0 ) THEN
87 DO k = kLo,kHi
88 uFld(i,Jobc,k,bi,bj) = OBNu(i,k,bi,bj)
89 & *_maskW(i,Jobc,k,bi,bj)
90 ENDDO
91 ENDIF
92 ENDDO
93 ENDIF
94 #endif
95 #ifdef ALLOW_OBCS_SOUTH
96 IF ( tileHasOBS(bi,bj) ) THEN
97 C Southern boundary
98 DO i=1-Olx,sNx+Olx
99 Jobc = OB_Js(i,bi,bj)
100 IF ( Jobc.NE.0 ) THEN
101 DO k = kLo,kHi
102 uFld(i,Jobc,k,bi,bj) = OBSu(i,k,bi,bj)
103 & *_maskW(i,Jobc,k,bi,bj)
104 ENDDO
105 ENDIF
106 ENDDO
107 ENDIF
108 #endif
109
110 C Set model variables to OB values on East/West Boundaries
111 #ifdef ALLOW_OBCS_EAST
112 IF ( tileHasOBE(bi,bj) ) THEN
113 C Eastern boundary
114 DO j=1-Oly,sNy+Oly
115 Iobc = OB_Ie(j,bi,bj)
116 IF ( Iobc.NE.0 ) THEN
117 DO k = kLo,kHi
118 vFld(Iobc,j,k,bi,bj) = OBEv(j,k,bi,bj)
119 & *_maskS(Iobc,j,k,bi,bj)
120 ENDDO
121 ENDIF
122 ENDDO
123 ENDIF
124 #endif
125 #ifdef ALLOW_OBCS_WEST
126 IF ( tileHasOBW(bi,bj) ) THEN
127 C Western boundary
128 DO j=1-Oly,sNy+Oly
129 Iobc = OB_Iw(j,bi,bj)
130 IF ( Iobc.NE.0 ) THEN
131 DO k = kLo,kHi
132 vFld(Iobc,j,k,bi,bj) = OBWv(j,k,bi,bj)
133 & *_maskS(Iobc,j,k,bi,bj)
134 ENDDO
135 ENDIF
136 ENDDO
137 ENDIF
138 #endif
139
140 C-- Then set Normal component:
141
142 #ifdef ALLOW_OBCS_NORTH
143 IF ( tileHasOBN(bi,bj) ) THEN
144 C Northern boundary
145 DO i=1-Olx,sNx+Olx
146 Jobc = OB_Jn(i,bi,bj)
147 IF ( Jobc.NE.0 ) THEN
148 DO k = kLo,kHi
149 vFld(i,Jobc,k,bi,bj) = OBNv(i,k,bi,bj)
150 & *_maskS(i,Jobc,k,bi,bj)
151 vFld(i,Jobc+1,k,bi,bj) = OBNv(i,k,bi,bj)
152 & *_maskS(i,Jobc,k,bi,bj)
153 ENDDO
154 ENDIF
155 ENDDO
156 ENDIF
157 #endif
158 #ifdef ALLOW_OBCS_SOUTH
159 IF ( tileHasOBS(bi,bj) ) THEN
160 C Southern boundary
161 DO i=1-Olx,sNx+Olx
162 Jobc = OB_Js(i,bi,bj)
163 IF ( Jobc.NE.0 ) THEN
164 DO k = kLo,kHi
165 vFld(i,Jobc+1,k,bi,bj) = OBSv(i,k,bi,bj)
166 & *_maskS(i,Jobc+1,k,bi,bj)
167 vFld(i,Jobc,k,bi,bj) = OBSv(i,k,bi,bj)
168 & *_maskS(i,Jobc+1,k,bi,bj)
169 ENDDO
170 ENDIF
171 ENDDO
172 ENDIF
173 #endif
174
175 C Set model variables to OB values on East/West Boundaries
176 #ifdef ALLOW_OBCS_EAST
177 IF ( tileHasOBE(bi,bj) ) THEN
178 C Eastern boundary
179 DO j=1-Oly,sNy+Oly
180 Iobc = OB_Ie(j,bi,bj)
181 IF ( Iobc.NE.0 ) THEN
182 DO k = kLo,kHi
183 uFld(Iobc,j,k,bi,bj) = OBEu(j,k,bi,bj)
184 & *_maskW(Iobc,j,k,bi,bj)
185 uFld(Iobc+1,j,k,bi,bj) = OBEu(j,K,bi,bj)
186 & *_maskW(Iobc,j,k,bi,bj)
187 ENDDO
188 ENDIF
189 ENDDO
190 ENDIF
191 #endif
192 #ifdef ALLOW_OBCS_WEST
193 IF ( tileHasOBW(bi,bj) ) THEN
194 C Western boundary
195 DO j=1-Oly,sNy+Oly
196 Iobc = OB_Iw(j,bi,bj)
197 IF ( Iobc.NE.0 ) THEN
198 DO k = kLo,kHi
199 uFld(Iobc+1,j,k,bi,bj) = OBWu(j,k,bi,bj)
200 & *_maskW(Iobc+1,j,k,bi,bj)
201 uFld(Iobc,j,k,bi,bj) = OBWu(j,k,bi,bj)
202 & *_maskW(Iobc+1,j,k,bi,bj)
203 ENDDO
204 ENDIF
205 ENDDO
206 ENDIF
207 #endif
208
209 c ENDDO
210 c ENDDO
211
212 #endif /* ALLOW_OBCS */
213
214 RETURN
215 END

  ViewVC Help
Powered by ViewVC 1.1.22